pax_global_header00006660000000000000000000000064147735412710014525gustar00rootroot0000000000000052 comment=60ac62e57bd4bbdb7d206d30ea0280d041287792 kernel-shark-kernelshark-v2.4.0/000077500000000000000000000000001477354127100166135ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/.github/000077500000000000000000000000001477354127100201535ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/.github/workflows/000077500000000000000000000000001477354127100222105ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/.github/workflows/main.yml000066400000000000000000000042131477354127100236570ustar00rootroot00000000000000name: KernelShark CI (CMAKE) on: push: schedule: - cron: '0 15 * * THU' env: # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) BUILD_TYPE: Release jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Install Dependencies shell: bash run: | sudo apt-get update sudo apt-get install build-essential git cmake libjson-c-dev -y sudo apt-get install freeglut3-dev libxmu-dev libxi-dev -y sudo apt-get install fonts-freefont-ttf -y sudo apt-get install qt6-base-dev qt6-scxml-dev libboost-all-dev -y sudo apt-get install libtraceevent-dev libtracefs-dev libtracecmd-dev trace-cmd -y - name: Create Build Environment # Some projects don't allow in-source building, so create a separate build directory # We'll use this as our working directory for all subsequent commands run: cmake -E make_directory ${{runner.workspace}}/build - name: Configure CMake # Use a bash shell so we can use the same syntax for environment variable # access regardless of the host operating system shell: bash working-directory: ${{runner.workspace}}/build # Note the current convention is to use the -S and -B options here to specify source # and build directories, but this is only available with CMake 3.13 and higher. # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_C_FLAGS_RELEASE="-Werror" - name: Build working-directory: ${{runner.workspace}}/build shell: bash # Execute the build. You can specify a specific target with "--target " run: cmake --build . --config $BUILD_TYPE - name: Test working-directory: ${{runner.workspace}}/build shell: bash # Execute tests defined by the CMake configuration. run: ctest -C $BUILD_TYPE - name: Upload Artifacts if: ${{ always() }} uses: actions/upload-artifact@v4 with: name: artifacts-download path: ${{runner.workspace}}/build/Testing/ kernel-shark-kernelshark-v2.4.0/CMakeLists.txt000066400000000000000000000114521477354127100213560ustar00rootroot00000000000000# Check if cmake has the required version cmake_minimum_required(VERSION 3.1.2 FATAL_ERROR) # Set the name and version of the project project(kernel-shark) set(KS_APP_NAME "kernelshark") set(KS_VERSION_MAJOR 2) set(KS_VERSION_MINOR 4) set(KS_VERSION_PATCH 0) set(KS_VERSION_STRING ${KS_VERSION_MAJOR}.${KS_VERSION_MINOR}.${KS_VERSION_PATCH}) message("\n project: Kernel Shark: (version: ${KS_VERSION_STRING})\n") set(KS_DIR ${CMAKE_SOURCE_DIR}) execute_process(COMMAND bash "-c" "echo __LP64__ | ${CMAKE_C_COMPILER} -E -x c - | tail -n 1" OUTPUT_VARIABLE __LP64__) if (NOT _INSTALL_PREFIX AND NOT _LIBDIR) set(_INSTALL_PREFIX "/usr/local") if (__LP64__ MATCHES 1) set(_LIBDIR "/usr/local/lib64") else (__LP64__ MATCHES 1) set(_LIBDIR "/usr/local/lib") endif (__LP64__ MATCHES 1) elseif (NOT _INSTALL_PREFIX) set(_INSTALL_PREFIX "/usr/local") elseif (NOT _LIBDIR) set(_LIBDIR "${_INSTALL_PREFIX}/lib") endif () if (NOT _POLKIT_INSTALL_PREFIX) set(_POLKIT_INSTALL_PREFIX "/usr") endif () set(LIBTRACECMD_MIN_VERSION 1.0) set(CMAKE_MODULE_PATH "${KS_DIR}/build") find_package(TraceEvent REQUIRED) find_package(TraceFS REQUIRED) find_package(TraceCmd REQUIRED) find_package(JSONC REQUIRED) find_package(Doxygen) set(OpenGL_GL_PREFERENCE LEGACY) find_package(OpenGL) find_package(GLUT) set(KS_FONT FreeSans) if (NOT TT_FONT_FILE) execute_process(COMMAND bash "-c" "fc-list '${KS_FONT}' |grep -E ${KS_FONT}'(\.otf|\.ttf)' | cut -d':' -f 1 -z" OUTPUT_VARIABLE TT_FONT_FILE) endif (NOT TT_FONT_FILE) if (TT_FONT_FILE) message(STATUS "Found font: ${TT_FONT_FILE}") else (TT_FONT_FILE) message(WARNING "\nCould not find font ${KS_FONT}! Kernelshark GUI requires font ${KS_FONT}!\n") endif (TT_FONT_FILE) find_package(Qt6Widgets 6.3.0) find_package(Qt6 COMPONENTS Network OpenGLWidgets StateMachine REQUIRED) find_package (Boost COMPONENTS unit_test_framework) set(LIBRARY_OUTPUT_PATH "${KS_DIR}/lib") set(EXECUTABLE_OUTPUT_PATH "${KS_DIR}/bin") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -pthread -fPIC -fno-common") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -fPIC -fno-common") find_package(OpenMP 3.2.5) if (OPENMP_FOUND) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") endif(OPENMP_FOUND) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo) endif (NOT CMAKE_BUILD_TYPE) message("\n Build type: ${CMAKE_BUILD_TYPE}") if (NOT CMAKE_C_FLAGS_PACKAGE) set(CMAKE_C_FLAGS_PACKAGE "-O3") endif (NOT CMAKE_C_FLAGS_PACKAGE) if (NOT CMAKE_CXX_FLAGS_PACKAGE) set(CMAKE_CXX_FLAGS_PACKAGE "-O3") endif (NOT CMAKE_CXX_FLAGS_PACKAGE) set(KS_PLUGIN_INSTALL_PREFIX ${_LIBDIR}/${KS_APP_NAME}/plugins) set(KS_ICON KS_icon_shark.svg) set(KS_ICON_FIN KS_icon_fin.svg) set(KS_LOGO KS_logo_symbol.svg) set(KS_LOGO_LABEL KS_logo_horizontal.svg) set(CMAKE_INSTALL_RPATH "${_LIBDIR}" "$ORIGIN") set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) if (CMAKE_BUILD_TYPE MATCHES Package) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) else (CMAKE_BUILD_TYPE MATCHES Package) set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) endif (CMAKE_BUILD_TYPE MATCHES Package) include_directories(${KS_DIR}/src/ ${KS_DIR}/build/src/) message("") message(STATUS "C flags : " ${CMAKE_C_FLAGS}) message(STATUS "CXX flags : " ${CMAKE_CXX_FLAGS}) message(STATUS "Linker flags : " ${CMAKE_EXE_LINKER_FLAGS}) add_subdirectory(${KS_DIR}/src) add_subdirectory(${KS_DIR}/examples) if (Boost_FOUND) set(KS_TEST_DIR "${KS_DIR}/tests") enable_testing() add_subdirectory(${KS_TEST_DIR}) endif() if (_DOXYGEN_DOC AND DOXYGEN_FOUND) message("\n doxygen documentation ...") add_custom_target(doc ALL) add_custom_command(TARGET doc COMMAND doxygen dox_config > dox_build.log WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/Documentation/doxygen) set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES "${KS_DIR}/Documentation/doxygen/dox_build.log" "${KS_DIR}/Documentation/doxygen/html" "${KS_DIR}/Documentation/doxygen/latex") endif () configure_file(${KS_DIR}/build/deff.h.cmake ${KS_DIR}/src/KsCmakeDef.hpp) configure_file(${KS_DIR}/build/ks.desktop.cmake ${KS_DIR}/${KS_APP_NAME}.desktop) configure_file(${KS_DIR}/build/org.freedesktop.kshark-record.policy.cmake ${KS_DIR}/org.freedesktop.kshark-record.policy) configure_file(${KS_DIR}/build/libkshark.pc.cmake ${KS_DIR}/libkshark.pc @ONLY) message("") kernel-shark-kernelshark-v2.4.0/Documentation/000077500000000000000000000000001477354127100214245ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/Documentation/HTML/000077500000000000000000000000001477354127100221705ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/000077500000000000000000000000001477354127100234355ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kernelshark-logo.svg000066400000000000000000000120171477354127100274260ustar00rootroot00000000000000logo_proposalsKERNELSHARKkernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kernelshark.jpg000066400000000000000000001527271477354127100264660ustar00rootroot00000000000000,Photoshop 3.08BIMHHhttp://ns.adobe.com/xap/1.0/ image/jpeg Print 2017-12-05T11:33:42-05:00 2017-12-05T16:33:51Z 2017-12-05T11:33:42-05:00 Adobe Illustrator CC 2017 (Macintosh) 256 208 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXzP8A85Q2 djeeffL1tfXo0+2ksJOd0Y2lCkSOVHBPiPI7ZjagkchbZEkDZ5jp35bW1xLdpdawLQQam2kQMbZ5 PVmAquyt8HLwOYcs9ch0tBy+XS0DZ+SrS4h15TqoS/0P6yzWYgZvVittvUD8gqhm2oemSOUittik 5OW3NbJ5R0tdB03WRrIa2vLqO0vP9HcC2do/UkqeX7z0/wDJG+HxDxEUnjNkUin8haanmCy0mTWw seo2sNzZXX1WQ+o1xJwjjEYaoqPiqTkfFPCTXJHiGrpQtvJNlPFrqjVgL7RPrTtafV2JkitSAJOf LivNjSm9MJynbbmpyctua/UfIltZaD+kDqyyX4soNQbThA4IhuHRAfVrx2Z6e+Mctmq2ulGSzVIh fy6tLi80SLT9ZF3ba01wsd19XdAn1ZeTfAzVbeo7YPGIBsckeLzscnf8q4t5tR0a3stXW5tdYS5e O6+runD6qtXHBmq24p1GPjbGxyXxdjY5LIfIFhPqaw2+tLLpx0+TU/0gLaQD04ZDE49JiG2KnfE5 jXLe6XxDXJp/IWnx+ZbPR5NbVYdRtYrmxvfq0hEjTvxjj9PlyHIb1OPjHhJrknxDV0qab+XNrc+v 9a1gWgXU5NItv9HeQyzIQF+y3w8q9O3jjLMRyHS0HL5dLRFj+V1vcNbwz60sF3d3F3bWkH1Z39Q2 cjI55BqDZeVMic9dPwUHL5JJB5UtLjypda3DqQe6snjS60/0WHAyzekn70nieQ+LYe2WHIRKqZ8f qqky8wfl3a6TYalcR6wLq50poFvbYW7x8PrDAJ8ZYg7HlkYZrI25sY5bI25oC98raLbatp9udcVt M1CBp11P6tKFWjyRhfSrzNXjpXJCZIO24ZCZrk6DyjZPqGt6fLqgivNK9f6vF6DsbkWyyO5BBpHQ R/teOJyGga5rx7A1zTBPy6tm0lbr9MKL99MOrLYfV3/uQpP97y49Rx6ZHxt+W10x8Xfl1pz/AJdW y6S11+mFN+mmDVmsPq7/ANyVB/veXHqePTHxt+W10vi78utIfT/ItpqM2hx2WrCYau0sczfV3X6v LBCsrp8RHqEc6fDhllIuxySclXY5NX/kvSLRtJn/AE6r6VqjTp9f+rSKI2gAB/d8izVc8fb5YjKT e24UZCb23CJtfy6s5fNV/wCXJdYEN1ahDbMbZ2M9YvVkoof4OA/mO+ROY8IlSDl9N0+lP+cZv/JT WP8AzE3X/J05scXJZ83qmWMHYq7FXYq7FXYq7FXYq7FXy7/zlmwXzloDNsBZEk+wnbMfNzbYcmJ6 b5n8nSz3hvNSa1RfMB1a1It3k9WFR8IoF+Hl7/dmvlCXQfw01GEu7pTH9O8waRHq/m25lmKRapa3 0dgeDHm88nKMGgJWo8aZZKBqPlTYYmh5IF9V08+QI9JEv+5FdUNy0PE/3Jg4BuVKfa7VyXCeO+lJ o8V+SZXvmHRZPM/lW9Scm0021sIr5+DVR4HJlHEr8VPYGuREDwyHfbERNELNP1/SItY83XEk9IdU tb6Kwfgx5vPLyjFONV5L4098TA1HypJiaCP1rXfKt15dMkGoO2qNpFppv1AwOAHhmjldvVpx/ZYb ffkYxkJctrJYxjK/K3eW/NWgWUfk8XNwVOlyX51ACNm9NbjkI/2TyrXtXGeOR4vOllAm/NH2/mXy lpmpeV0h1B7my0yO/Fzdm3kj+K5B4UQqWI5GlRXImEiJbc6Y8JIKFsda8n2WoJZLqry6cNEuNOOo G2dT6087SD91Rm2Vuv45IxkRdb8VsjGRHLqg9X17y8fOXly5tLtp9M0qGygnujEyEi3kJdvTIr03 6H6cMYS4TfM2mMTwnvKaaZ5k8oS+r9e1JrX0PMEmrwEW8kgliqOA2X4eQJ+108MhKEug/hpiYS6D pSM0/wA3eS2utOv7rU3gl0y81KcW/wBXkf1UvZXKfEFoPgau9fDBLHOiAOYH2IMJbiu5hej6zptv 5V8wWU0hW8vpbN7WLiTyWKYvJ8QBAoPE5fKJMgfe2yieIMl83eY/KNzpvmKTTtRa5vNbezaO1Nu8 fpi2IB+MgA1UV7ZVjhIEWOVtcIysX0YdqeoWc9toSRPyeztfSuhxI4v9Zlkp03+B1OXxBstoHNHn WdL/AMY6zqPqn6ldrqItpOBqxuIpFi+Gm3JnHbbI8J4QPcx4Twge5kkfmXygNJjuW1F/0inl86Qb D6u+8pUnl6lOP2qD+OVcEr5bcVsOCV/G3SeZfKB0mS5XUX/SL+XxpAsPq77ShQeXqU4/aqP448Er 5bcVrwSv42k/k3zHoumy6A17MYxZXl7Ld0Qtxjnt444zsp5VZTtvk8sCbruDKcSbUvNmpeXjo2h6 XpV81/8Ao+S5eecwvCKTurgUcV2PIYcYlZJFWmANklMl80+Xx+a0uu/WT+iWDBbj03rvaekPg48v t7fZyHhy8Ouv7WPAeCur6J/5xm/8lNY/8xN1/wAnTmyxckz5vVMsYOxV2KuxV2KuxV2KuxV2Kvmb /nKPSNR1fz35fsNOhNxdy2EhjiBVSeMjs27FR0GY2okI7lsjIAWXi0XknzPLBfXCWJMWmSSxXzep EPTeBecgILVPFd9sx/FjtvzZeIF3+BfNf6I/S/6Pb9HCH6yZ+cf90Ry58eXKlPbHxY3V7r4kbpZJ 5M8zR2lhdvYt9X1R4orBw8Z9V5hyjAAYkVHiPnj4sbIvkvGPkq3XkLzda3tnZT6cyXOoFxZx84j6 npryahDECgNdziM0SCb5IGSPe1ceQ/Ntve2tlNp7Lc3vM2yc4yG9JQ7/ABBiooprucRliRdqMkW5 /IPm6DUbXTpdPZb29EhtYvUiPMQism4fiOI8TgGaNXa+JGrtqz8iea7w3f1ewLixle3uyZIlCSxi rqasK8R4YTliOvNZZYjmU81byR5i1RbUaPZG4tbWMQlw8afECNvjZa9R9+Q8WMeZcHRZgRInrJJ7 P8vPOV5C01tprSRq8kRPqRA84nMbihcHZxTJHNEdXOOSI6qem+Q/NupWCX9lp7S2knIpJzjWvAkN RWYN1Q9u2GWWINEpOSINKdr5K8z3ejtrFvYNJpqo8rXHKMfBGSHbiWDUHA9sTliDV7qcgBpf/gXz X+iP0v8Ao9v0cIfrJn5x/wB0Ry58eXKlPbHxY3V7r4kbpbL5J8zxQWNw9iRFqckUVi3qRH1HnXnG AA1RyXffHxY778l8QKg8g+bTqf6LGnk34gFz6PqRf3LPwDcufHdtqVrg8aNXeyPEjVqUfkzzNJZ3 14lkTbac80d7J6kVEa3FZRTlU8a/s19sPixsC+aeMNy+SfM8UFjcPYkRanJFFYt6kR9R515xgANU cl33x8WO+/JfEDcPkfzVNrE+jRWDNqdtGJZ7fnHVUbjQ8i3H9sdDicsau9l8SNWhYvLetzaNca1H bFtMtX9Ke55JRXqopxJ5ftr0GEzF11TxC6RJ8k+aA+nR/UW56upfThzj/eqEEhI+Lb4WB+KmDxY7 78keIN/JUuPIXm23v7Swm09lur/n9Uj9SI8zGvN6MH4iimu5xGaJF3yQMkat1v5C823N/eWENgXu 9P4G8i9SIen6q8kqS9DUeBwHNEAG+anJGrfVX/OM3/kprH/mJuv+TpzOxcmM+b1TLGDsVdirsVdi rsVdirsVdir5e/5ywJHnTy/T/liP/J9sx83NthyYRpx/53PzwtRx+paoRuONeY6bU+W2YMvpj7w1 n6Y/BPPqFz/hw6p8H1H/AAl9V9TmlfXpy48ftVp/t9sr4vVXXjY3vX9JIvKbL/hfQC7KAPM8IJYg UHpDrUGgyzJ9R/qs58z/AFU/ttOutP8AOGii9CRm71XV7mGro1YZoU9MtTlxr4N92VGVwNdwaybi fcF2j6fc6Xd+TbDUOEd5GdVLxl0Y0dC6bjl1DCm/XbY4ylYkR5LI3ZHkxTznp15peheUrC9AS9g+ t+siurkcp1IqyVG49zl2KQMpEeTbjNklkE1lLd2OteiVP1XzPJcS0ZQRGqUBGwqORA2+7K4miP6r jZ58MD/VTO10681Cx0oWoVvqetQ3NyC6KVhSMcmPLru3Tf5dcjOQBN/zXH0W0D5q2mWFzdalol/B wa0sdR1k3khdBxWWeRUqDuQSffxyMjQI7wHLJoEeQQHk/T7m4svKWoQ8GsrGPU/rknNBxMrOI6g7 n7Pv9G2SyyoyHfSZnmPclumaddXHkzRb+EI1pY6drAu3LoOLSrIsY4n4iSR2B+jJmQEyO8xZE+oj zCP+oXP+HDqnwfUf8JfVfU5pX16cuPH7Vaf7fbI8Xqrrxovev6TC5Cf+VVwmu41o033FLXbL/wDK f5v6W3+P4JxqJ/53TyRuKGx0upqKbyGtdqfPbID6Ze8sB9MvipaUf9z/AJ9FdhZamQD4+t2xl9Mf eEnlH4JZIT/yquE13GtGm+4pa7ZP/Kf5v6WX8fwRKU/5WNoIqKFdKruKf7zw9dqfhgP0H4o/gPxS jRP+OZ5lBPSzUgHx+uQdMnLmPf8AoLKXMMl8lGW1ttDvXSv1G6vZpIm+FmSeCOKOlVOxIP3ffXkF 2Pc4ep1UY2OZX3zadZaRZW97SaKwaT6pzA5l535sNqV38egwgbkjq4cM2XLKo7IyzR4PzmNq0vqi JGBlalXP1LlVmpVtz8NcrJvFf45uwhDhxd73b/nGb/yU1j/zE3X/ACdObTFybp83qmWMHYq7FXYq 7FXYq7FXYq7FXzD/AM5W2N7e+cdDhs7eW5m/R7t6cKNI1BM1TRQTTMbOQDu2wNB4b+gtb+t/U/0f c/W+HqfV/Rk9ThWnLhTlxr3ynjFXbLiDY0HXTdG0GnXRulT1Gt/Rk9QJWnIpxrSvfHjHO14gorpu ovaPeJazNZxHjLciNjGrbCjPTiD8Qw2LpNhc+kaqn1fnZTr9bp9U5ROPVrSnp1Hx15Dpg4gvEFWP y/r0k8sEem3TzwcfWiWCQunMVXkoWq8h0rjxjvRxDvW2+ha3cwfWLbT7maDf99HDI6fDsfiAI2xM wOqmQTfydpl79eS/e3lWz4OI7kowiZvs8Q9OJPXbIzkOThdoTAx13ld5y0+/k1GO4jtpXgdUhSVU YoZSWpGGApyP8vXGBCOzpDw/ik1zoWt23p/WdPuYPVcRxepDInN26KvICrHwGSEwernCQbn0HXbd oln066haZxHCJIZFLueirVdyfAYiYPVeILU0TWnu3s0sLlruJQ8lsIZDIqmlCyU5AbjHiFXa8QU1 03UXtHvEtZms4jxluRGxjVthRnpxB+IYbF0mwqDRNaLW6iwuS12C1qvoyVlAXkTHt8QC77dsHEO9 HEFyaDrslxJbJp109xCAZoVhkLoGFVLKFqK9q48Y714g1FoWtzTy28Wn3MlxBT14VhkZ05bjmoFV r748Y714g0NF1gm4UWFxytBW6HpPWIU5Vk2+HYV3x4h3rxBfH5f12SBLhNOuWt5ACk/ov6ZDdDzp xp71x4x3olkiOZZRoflOC1Cz3oE1x1EfVE/qchKbp9TrzLaGwT65uIbaB55m4RRirN7ZABwYQMjQ 5lg+u23mS+1KNZ9Nuonm5CytWhkDMqCrcFIqxA3amWxlEDm9Dp8UccaB96Aj0DXZJ5bePTbp57fj 68SwyF05iq81C1XkNxXDxjvbuId767/5xm/8lNY/8xN1/wAnTmXi5Nc+b1TLGDsVdirsVdirsVdi rsVdirwz86hdHz6gtOf1r/DN76Hp158/WHHjQg1r0zA1tbX3hZch73nlNb+uf8fH6Z/wnX9v6x9Z 9b58/U9X6eXbvmHtXlxsdvhxJVqF3q9r5/8AKSGeeG6uLDT4b0c3V3DSEuknxAmrDcE5MAGEveWQ A4T8WJaJeXp0HzLZevIbNbZZvq3JvTEhu4F58KheVNq0y6YHED+ORbZDcN3+qao3lPQrlrqZp7S9 uktZjIxaJYo7bgsZr8IXtTERHEfd+tQBxFlWgajqX/K0dPj+szEX1paNdqXb98w04Opk+L4jy3FT 18MpnEeGfK/vapAcB/HVN/I41b9GeVja+t9Qrqv170+XpU5N6fq0IX7XSvfxyGWrlfPZjkqz8Ev0 r1h5M8uDkwiMV0SlTxJ+sHiaVpt8VPpyz+OXwcLtA9PP9DcxmMdgCzGAazphVKniHJm5ECtKkAV2 7Yn/AHpXQH0ke9MrxdY9aIah6/8AylsQsvWLf3HxcPT5N9ivKlDTrvlQrp/Mc0V0/mpJ54n1228s y3F1JcRTxeYpX0+WQurLCsTGExEmoUD7NMsxAGW381ljq/ggIdR1NPzL0l0uZllvI9MS6cSMGlWS CBmVzyqwY7mpyRiPDPx/SyocB+KSaJeXp0HzLZevIbNbZZvq3JvTEhu4F58KheVNq0yyYHED+ORZ yG4VLrWdYTyrod4t7OLm1u7yK1n9R+caLDbqERuVVABpQYiI4iK7v0oERxF6DqMOrNcebbzSGke4 uF01bQ2pYy1hKpJx4mvtt92Ywr0g+bi48sZEDuUtXGr/AF/zz+ivX+v+tpgT6vy9WnAc6cSW+xyr 12rvjGqjfLdsjVRvzSjWru+T8yvMFlHPJHb3drJHPEGYRu5seEXqAHejv3rlkADjB/HNZTjHGJFH Lc3RsLKzkkJjs7eK3VAW4H0l48uJNKmpxEQCS6XPnOQ+SzJNCnrVpdp5W8xNc2jxRxwWjW1w6kK/ qzKz8DsDQcK/PIiQ4hR73baLCI1I8ykvmLV9W/w75M1I3k31/je0u/Ub1f75U+3Un7O2ShEcUhW2 zsIxFyDIoLu9i/Oy+to5pEhuF/0mFWIV/TsuS8xy+Lid9ycqoeEPx1a6/dvbP+cZv/JTWP8AzE3X /J05tsXJsnzeqZYwdirsVdirsVdirsVdirsVfMP/ADlbfXtl5x0OazuJbab9HuvqQu0bUMzVFVIN Mxs4BO7bAWHhv6d1v639c/SFz9b4en9Y9aT1OFa8edeXGvbKeAVVMuEKc2qanNdpeTXc8l3HT07h 5HaReJqOLk8hTthERVJoKKXE6LIqSMqzDjMqsQHWoajU6jkAd8aWnGedoVgaRjCjFkiJPFWagYhe gJ4iuNKqx6jqEd0l3HdTJdRqFjuFkYSKoXgAHBqAF+H5bY0OS0Fe01rXoY1tLO/uo42JC28UsiqS 53oqmm5OAxHMhBA5lmnlvT7+x08Q3c7OCeUdvyJSKu7BamgLHrTK5EEui1uojkkK6IvUdPW+SJHm lhWKQSj0m4ksoPE/MV2PbADTTg1Bx3XV0unLP6f1q6u7r0WEkXrXM7cXHR1+PZh4jANuTYdbk6UP gvu7CG9iWK9ea6jQ8lSeeaUA+I5u2+I25MRrMg6/YFL9Daf9YS59NvrEXH05vUk5r6YATi3Ko4gA Dww2n85l7/uWJoOlIsipBxWYcZlV3AdahqNRtxyAO+PEV/O5e/7nJoOlJ6QWE8IXMkUZkkKK5pVg hYrU8R27Y8RQdZlIq/uRdxDNKoEV3cWbD/dlrK0TEeBI6jAww5zj5V8UHa6O9tcy3KajfGeenryf WHVn47DmycWanucJIPQORLXzIqh8kcsSK7yUJlkoZJWJZ3IFAWdqs30nA4k8kpcyvxYJT5l1Y6fp 5MZpcTVSE+Hi30ZKIsuXo8HiT35BhNzrut3Vuba51C5ntzSsMk0jp8O4+FiRtlggB0d+IgIeS8u5 IYYJJ5Hht+X1eJmYrHyNW4KTRanrTDQTSr+ldU+vfX/rk/149bv1H9X7PH+8ry+zt16YOEVS0OT6 /wD+cZv/ACU1j/zE3X/J05l4uTVPm9Uyxg7FXYq7FXYq7FXYq7FXYq8G/PiKy/xml1dWkF79R8u3 NzDDcoJI/UjuARVSR8tt8wdZe3vSboe95rfRaLZ6ffa0mjafJKulaXdLbPApgElzLIslEDbVHga7 ZiCyQLPMsRZNX1Ky+stF0vVPNt3HpVlOLFNNNtbTRK0KmcAScUBFOVe2MSSIizvaQSQN+91/Z6Lp Oo+b7uLSbK4FjLpy2ttPCrwoLhQr8UDCleVfh+/xYkyERZ3tQSQN+9dpllolpNeV0qyuRP5mOmgT wq4jt3HSP4hx49t6YyJPU/TaCSev8K3SbPRbMSBtJsrr615ll00m4iD+nbnoI/iXjx47dv4MiT1P 02mRJ69Es8uQKuj26y2NrHLG7vFdLEPrDIzEjnIanvtTtlsufN1uu1Fy4Qduqa4HXOxV2KuxV2Ku xV2Ku6/qxTSpDBJNNaQpQvemUW1SAGNuKy79uNO+RMgPg3R005CwNkDp+p2WoRNJayeoqHi+xBB9 wcmRSMuCWM+oIrA0pJ5smjt7G1uTBHO8F3FIElXkjKquWRh3ViByGSiLdl2afUR5JzJbaKNXl1Ea TY8U8srqS2Xor9X9cvyJ4V/2Na1p+FNmqs/VTsbNVf8AEvvotFs9PvtaTRtPklXStLultngUwCS5 lkWSiBtqjwNdsRZIFnmUCyavqVO1tdGg/NG80X9E2UtjdxRsFkhVvSaO19T90K8V5t9r9WJJOO7N /tSSeC7e5/8AOM3/AJKax/5ibr/k6c2uLkznzeqZYwdirsVdirsVdirsVdirsVfOH/OS3mW+0Dzt pU9rFDOLnSpLeeG5T1I2ja45EFQVruuYmpgJVbMQEg8g/wCVn62bieV7KwkinggtXtHgLQCK2Zmj AQv2L5jeAO8p8IKcX5ka2mo6jfSW1ncNqiwLcwTRF4aWwAjopbtTuTh8AUBvsvhCqdF+ZOtpqGp3 sttZXJ1ZoXuoJ4TJDygUrGVQt2r3rj4AoDfZfCFDyb078y9csZLqRbazna7vW1JvXiLhLhtuUfxD jTt4YywA9/KlOIFGeUvOuuNfSWiwWkqT3cupPJNDzaGZ6cniq1FOw4mhpgniH6GjVEQgZfBkIAAo NgOgwPPuxV2KuxV2Ku6Yqkep+bdNs6pCfrUw/ZQ/CPm39MkIFzsOgnLc+kJbYfmPq9lK0iWdnMxb knrxu/CnSnxgfhhliB6l2UNDjioW3n3VoLe6gMFtKl1dS3jM6PySWanPgVdaD4Rsa4+ELbMumjMU UXp/5n65YW6QQWtm4hed7eWaJnlj+ssWkCPyFOtOnTBLACeqRgAAH42SfRvM+oaRZXVpbJE0V48T ytIpLAwkkcDUUqHIO2TlAE2nNhjkFFmuk6tbalbCaE0YbSxHqp/z6HKyKdBnwSxyoofzPb+volyA PijAkH+wNT/wtcMTu2aKfDlHmkNt+YOswXkV16FrKY9PTSmhljZ43t4yCOaltztv2PhhOEEfG3en GET/AMrP1s3E8r2VhJFPBBavaPAWgEVszNGAhfsXyPgDvKPCCAHnjWB5pPmUpAb/AI8PTKt6XH0f QpxDcvsf5WS8IcPD0T4Yqn1T/wA4zf8AkprH/mJuv+TpzOxcmM+b1TLGDsVdirsVdirsVdirsVdi r55/5yH0PTdX882C6lJNHaWWh3F45tygkPoz/ZHMFdw2YeqmRVMuIgbd7yn/AAL5W/SPqfWb39Ef of8ATH+6frFOdOPTh9jenj3pvmL4sq6XdL4hrzulB/KXlGLzRpunSz3/ANR1ezt57R19AyrNcPxU SEgIECjem+HxJcJO1hPHKie5W8t+RvLF/Y6P9euL1L7WXukgEJh9JfqrGvLmOQqo+/BPLIE1VBEs hF10b8v+RPLF7Y6OL25vF1HWFumh9H0RCv1UtXlyBbcAfPGeWQJqqCyyEX5KPlCy05NMju4BL9bl DJdGTjwBVjT0qb8eNK175OZNut7SyHiEU+yLrHYq7FXYqp3NxFbW8lxMeMUQ5O1K0Fadvc4hnjxm Zoc0t8xPoktt5eu5rm9Gkaqtx9cSERLKDEQi8VJYfbO/Jtx2GMTKyNrDudNphjvrJTtfJHlY+eL/ AMtXM96OAQ2EkbQ70g9aT1WK0/1eIwHLLgEtnJOQ8NpLaaFoF15Jv9Wjkuhq+nNEs8TGMW59ebgv Hbmfg6++WGchMDoWZkeKuidw+RvK99feXhp9xeiw1lLt5TOYRKv1VdgvEcRVgetdu2VnLIA3VimH iEA30QOpeX/Jdr+g79JtRbR9VFz6gPoG5UwsETiBRBVjvU9MlGczY2sJEpGxtYR1l5G8rhrz6/cX vBNZbR7P0DDUkj4Hk5Dx6lcicstqrlaDkPTutF6B5V0LTrqaae7vA51iTRrUQ+iVYbFGmDdutSD8 sEskjy7rasw8SNEdLautS09jq1q5Y/o31Y7sEUqqv6NV7HkxAHzyY6HvdaNHkjIEbsXu9M8rR6do uoQyXpt7mV4dVD+jzUxLE0htwO3708eeSEpWRt5O6BlZCOg8ueUz5xTSJpr4afeRWxsJE9D1vUuU jdfVJ+AKA5rTImcuG9rRxS4bTDy35G8sX9jo/wBeuL1L7WXukgEJh9JfqrGvLmOQqo+/IzyyBNVQ YyyEXXR9Ff8AONK8fypsl60uroV+UxzZYuSZ83qeWMHYq7FXYq7FXYq7FXYq7FXz1/zkLrum6P56 sH1KOaS0vdDuLJxb8fUHrTdRyKjoMw9VAyqmXCSNu95T/jvyt+kPT+rX36H/AEN+husf1inqV5fa 4fY2+e9MxfClXS7tfDNed2lupebtHm82aFqdpDcLp2jxWsBSXj6zLbMSSOLcakHxyUcZ4SDzNshA 8JHemPlrz35Y0+x0YX1vevfaLJdPAYDGIm+tMa8uTBtlPbvkcmKRJqqLGWMkmurfl7z75YsbHRze 2162o6Ol0kPomP0W+ts1eXJg3Rh09+uM8UiTVUVljJvzROhW31fSLSKlD6YZh7v8R/E5KR3dFqp8 WSR80dgcd2KuxV2KrJoo54JLeUcoZl4ypUgMKg0NPcA4s4TMTY5pV5g0ia70nSbGyAVNJM3BXY1d Z3ElKnYUIww2JPe7LBrxZ4+qlc+a7S0/MyXzHc2l1FZuGAhYL629t6P8/Fvi/wArpgGM+HwufCpQ oEFj2l67aWnlbW9JkSQ3GpNatA604L6EhdudSDuDtQHLJQJkD3NpjcgU80Tz1pdh/hj1IJ3/AELH fR3fHj8X1uvAx1beldwaZXPETxedMJYyb80B5o8waDeWWi6fo8V0lppPrVN3wLt60gk24Gm1D4ZP HAgknqyhEiyeqc2fnvyuWvv0hb3pWTWjrNn6Hp1BA+BZObb+9Pvys4pbVX00wOM9O6l9h5/8sF5n 1G1vfh1qTWbQQGM7mnBZObDtWtPvxOGXSvppTjPTupjEmv2r3HmSX05ANZD/AFcbfAWu0n+Pf+VC Nq75bwcvL9TZw8vJB3GpwSeXrLTVVxPbXNxO7mnArMkSqBv1HpGu2SEfVaQN7TFfMlkPNmmax6cv 1ayFkJY9vUP1WKON+PxU3MZ475DgPCR72PD6SE/8tee/LGn2OjC+t7177RZLp4DAYxE31pjXlyYN sp7d8ryYpEmqosJYySa6von/AJxpbl+VNk3St1dGnzmObLFyTPm9Tyxg7FXYq7FXYq7FXYq7FXYq +b/+coPLtxq3mOxmgubaE2OmPM0E8nCWRVeR29FKHmQsZrmJqJ0QzjKnja/l1rDaSNRF3ZUNn+kB aesfrHocS3Lhx9vHrmP4wut+dJ8UXTm/LrWF0k6ibuyoLP8ASBtPWP1j0OIblw4+/j1x8YXW/Ol8 UXSlB5E1O4l0mO3u7KZtYD+gY5iwjMcYldZqL8DBW6YTlAvnsnxBv5Ks35d6vHeWFul3ZXCaiJjB cQTGSIC3XnJyPEdttq77YBmFHnsjxRRPcy9VCqFGwAoB7DIvMk2bbxQ7FXYq7FXYq7FVO4toJ0MU 8ayJ3VwCPxxBZxnKJsGkju/JWmSlmgaS3NK0B5KPeh3/AByYmXOx9o5BsRaXSfl7qgsru8ju7Vo7 SFrpoWdkneFRUukZU1G3WtMfFF07LFqRMciFK98h6pZ6INXlurMp6EV0bRZq3IimKqrenx6VcAmu Iygmt20ZATStrP5daxpOnXF9Pd2Ui2hiFzBDMWlj9YgJyTiKfawRzAmt0Rygmm5fy51hb/TrOK8s rk6oJzbTwTF4qWwrJycJ91K4+MKJ32XxRRWj8vdVbVBp6X1hIDaNffXEn5WwhRzG1ZAvUMPDHxhV 0U+IKtx/L3VF12LRWvrBbie3W6t5zORBIrtwVUfj8TE9BTHxhV0V8QVa7Tvy41i++scbuxg+r3km nj6xMY/UnjpVY6rvWvw9z4YyzAd/eg5QGtG/LrWNWsba7hu7KH64ZRbQTzFJXMLFX4rxNaU+7GWY RNbrLKAX1D/zjQCPyosgeouboH/kacz8XJE+b1PLGDsVdirsVdirsVdirsVdir5z/wCcjriCDz9p bzyrCjaFfoGc8QWeOZVXqN2YgDMTUjl8PvZgbfFgsV5ow0mHUTq9mCnlhtMaz9b/AEj6wVLcfTr7 U+Z6dcwaN1R+q2FG6r+J0t5ox0mbURq9mS/lhdMWz9b/AEj6wFDcfTr70+Y6dMaN1R+q1o3VfxJL 5E1TTLSby011eRQCC+1B5y78fTWS2iVHbcUDMCAdumWZok3XcGWQE2nNo9lYJ5dsob+31CWxj1Q3 D2b+qifWk/dVIK0qXp9B6jIUTZqrpx9ROoSJ2tfk3ROxV2KuxV2KuxV2Kqd5E9xYanbg/v8AVDat NPIzHe1cFTTf9kU/z3AG4Pc52DWGJAluAlNreWlv5v8AOE1zOsEV5Zaj9VklJj9UyuDGE5EEl+wx IPDH3h2sZCUIkb8k3+u6N/h767+l7Pn/AIY/Rn1L1f8ASPrH2uPCv+Z7d8hR4qr+K1o3y/iQWvz6 VN5ba+i1W0kkbQ7HTxYrLW59aOeOR/3fgoB6nt0yUL4qr+IlMQbquqN863ujNo/mW5t9Xs7p9W/R 31a1hl5zf6NxD8lr2/zpkcQNxFcrRjBsbcrQ3lnWdIg/wT619BH9Vi1NbrlIB6Rl5emJPi+Dn2rQ YckSeLbuTOJ9Xwb0w6TZXyaVJrNi/wDzr91ZfXUmrbiaa4d1TmeP7LVO30Yysi6P1KbIuuqC1m90 yLzz5V9PULe4t9Ot9Pgub2KTlCrQyHmedRsBv2+jJRB4Jbc7TEHhKb6Td6LdGTnrFla/U/M02pH1 5uPOBdg0VD8XKu1PDrkJAjofppjIHu/ha8n3mjfUPK93Pq9nanSJdQa6t5puEtLhmVCq1969tsco NyFHelmDZ25vdP8AnGog/lVZkdDdXZH/ACOObXF9LOfN6lljB2KuxV2KuxV2KuxV2KuxV8w/85W2 F9e+cdEhs7eW5mGnuxjhRpG4iZgTRQTTfMbOQDu2QNB4cNB103RtBp10bpU9Rrf0ZPUCVpyKca0r 3ynjHO2fEGrbQtcuoPXttOuZ4Nx6scMjp8Ox+JQRtiZgdVMgustB1e8WKWG0l+rStxW6KMIdtj8d OO1PHEyDDJljAWSz7StLt9NtRBDueskhG7N4n+GVE28/nznJKyjMDQ7FXYq7FXYq7FXYq7FUNf6d Z38PpXMYdf2W6Mp8VPbCDTbizSxm4lhep+UdTt5gLSN7yNzRBEpaT5FFqfuywTDu9PrY5NjsUBFo WtzTy28Wn3MlxBT14VhkZ05bjmoFVr74eMd7lcQXR+XtfleRItMu3eFuEqrBISjUBowC7Ghrvjxx 714h3qaaNq7wzzJY3DQ2xZbmVYnKxtGKuHYCilR1r0x4h3rxBd+gtb+qfXP0fc/VOHqfWPRk9PhS vLnTjT3x4xdWvEGjousA26mwuOV2K2o9J6yinKse3xbGu2PEO9eILpNB1yO4itpNOukuJ+XoQtDI HfgKtwUirUHWmPGO9eIOj0DXZJ5bePTbp57fj68SwyF05iq81C1XkNxXHjHevEO99d/84zf+Smsf +Ym6/wCTpzLxcmufN6pljB2KuxV2KuxV2KuxV2KuxV4d+dgvf8ZP9R9T65/hq5+rejX1PV+sjhw4 kHlypSnfMDW16b71lVC+95LqF3q9r5/8pIZ54bq4sNPhvRzdXcNIS6SfECasNwTmMADCXvKgDhPx R3lK41C20nylcRtMmlpLqZ1Fo+XpUDt6fqcSB9unGvfI5ACZDrswyyiOInyQtkJ4NMtbB5C8dqrB B2q7s7bfNjlpAu3TajOckr6L+mLQpw3EM9lHd27iWGXUI9MUr/v6VeQNT+zv1GAmjXlbmR0UyN9t rRNzbT207wToUljJV1PiNsQb3DiyiQaKlhYuxV2KuxVGT6NqUHl3TfMMj2p0/VLqeyghjm5XCvAZ Ks6cQKH0TUKxK1FfbIlgqN25+TRiMOK90HmO4DsVcCQajrirp59RjsNaksJLltX1M2hV4SxkPoOE anH4t4ia+wOR4RYvkHZ6TUcREZJ7qY1f9IXn6P8AX5DzFZ/XPQ5f7z/UofV9TiT8FPtVqMpjVb/z f0uaKrfuYpaXd7+nPzBsvWk+qC21GZrfkeHqeoF5leVOVNq75cQKgfc2EbR+CdTjV/0RPX1/0SPK S0+16H1jgK9+PPhT3ple1+fGwFX58ST+Q7y+u7nyibmaScxXmowwGR2biiWcQVFq2wHYCmTzAAS9 w+9nkAF/BC+arvzDZeX/ACrc3c1zb6tHNfVmkZ1nAMiBdyeX92RT/JyWMRMpVy2TAAk9ydQXd7F+ dl9bRzSJDcL/AKTCrEK/p2XJeY5fFxO+5OV0PCH46sK/dvbP+cZv/JTWP/MTdf8AJ05tsXJsnzeq ZYwdirsVdirsVdirsVdirsVfMP8Azlbf31l5x0SazuJbaY6e6mSF2jbiZmJFVINNsxs4BO7ZAWHh M2qanNdpeTXc8l3HT07h5HaReJqOLk8hTtlQiKpsoPQNBsLiw01LeW4klqebRl2MSsd/gUniOu57 5TLcvP6vUeJLbkFW/wBUsbCPncyhDSqp1ZvkuIFtWLBPIfSGGaz5qvb4mKAtb2xqCqmjMCKHkR2I 7ZYIU7nT6KOPc7ySqO/vooFgjuJUgWQTrErsEEoFBIFBpyA/a65Kg5lMg0HzZdi6KardS3EctAs8 ztIyEe7EnjkDAdHA1mk4xcfqDMwQQCDUHocrdG7FXYq7FVJbS1W4a4WGMXDijTBQHI8C1K9slxGq tmcsiKvZVyLB2KuxVj/mDzNDaQvBZTn66dhJCxBj8TzU9flk4wvm7LRaSRkJHYMVj8w6/E8jxand o8zc5WWeQF2oBViG3NBTfJ8Ee53HCO5Dpf30bzyJcyo9yrJcursDIr7urkH4g3evXDQTQVv07rf1 T6n+kLn6pw9P6v60np8KU48K8ae2DgF3SOEKMGoX9v6XoXMsXoMzw8HZeDOAGZaH4SwABIwkApoL r3VNTvmRr28numjr6ZmkeQrXrx5E06YiIHJQAG/0rqn176/9cn+vHrd+o/q/Z4/3leX2duvTBwiq WhyfX/8AzjN/5Kax/wCYm6/5OnMvFyap83qmWMHYq7FXYq7FXYq7FXYq7FXhf52TSwefY7mHae38 tXssLUDcXSYFTQhv1Zg60XXvCy5fF5z+kLz65+mPh/SX+E/rfq+mv996nPlx4cftdunb2zC4RVdO NjXT+kt1e6uYtGvdTRF+vR6TpV2rGNSvrXErrK5jKcPjAFaj+0x5gdLLWMEDLcdS6zv7mz/N2706 24x2d7DGbiIIu/o2ZdCPhqtCa7ff3xIvFZ/G7Zwjw2/Jd9dwad5PsIqCzv4tSa8T01PMxFylWKkj c9j9Pg5QLke6kzG5PuYKurX9z+X0tpM4a30+/thaKEUFfUS4dqsF5NVv5mzI4QJ33j9TbQ4kbrPm jWxqHlvXfWUanJZNym9KLieVzPEf3fAJ9jbpkY4xRj0v9SIwFEIwandHzrrlhI1baOa+uACCWUQc 5SF2HUJSlPuwAegH3OJn0kZxBG0kxs721vIRNbSCSM9x1B8COxxIp1GTFKBqQV8Wt2KuxVEWFo15 eR2ytxaStDSv2VLHb5DIylQtnjhxGmPWmuy3vljWtWjiEM2mm2WJCS6n15Cjctl6AbZMipAd7tB2 fESAJtPPLcr3F15NuXH7y+j1KS5ArxdoQwjPGhHw02/XlWT+L4NwwQhdDuSjX/Mutpp3k/XTKq6r IL0POYo6EGUR/YKcPsnwycIC5R6bORGIsjopQ6pfW/nHzZp0ThbS8GpNcx8FJJhhnZKEpyWhPamP CDGJ936FocIPuUfK2p3t5oenWNwwe1sdb05LZOCDiJWmZwWC1ap/mOHJEAk98T+hMxRvyKc+e9Y1 M6HJduwFxpvmOWKyk9NVKJCjPGPsLyofHIYoi674sMcRfwTCTUbz9Ly6sCDqC+Uku1k4LQTF+fIJ x4/a7Up8+8OEVXTjY1tX9JU1HVtStNL1HWLchdU/Q2kTGb00J5yTShyVKcd6+GMYgkDpZUAE10sq VrqN3a/m/eWEBCWt/DG11HwU8jFZ80NStRQmtR9/fExBxX3frSR6Lez/APOM3/kprH/mJuv+Tpzb 4uTZPm9Uyxg7FXYq7FXYq7FXYq7FXYq+af8AnKDXdV0Xzvot3plwbe4bTZImcKrVRpyStHDDtmLq ICWxbIxBG7xf/H3m79KfpX9It9f9H6v63CP+65+px48eP29+mY/gxqq2T4caql6fmJ5yS9kvU1Jh cyxxxSP6cW6REsg48OI4lz2x8GFVS+FHuQQ81a+NbOuC7P6UI4/WSqHb0/SpxK8KcNumS8ONV0Tw Cq6InTfPfmzTNPTT7HUGhtIwwji4RtQMSTRmUt1Y98EsUSbIU44k2k6X10llJYrJS1mkSaSOg3eM MqNWldhI2Tre2VdW5tQvJ0tUlk5LZp6VsKAcE5tJTYb/ABuTviAtK36a1P8ASFxqPrn67diYXE3F asLhSsu1KDkHPQYOEVSOEVTVlrGpWULQ2s5ijeRJXUBd3jDBa1HSjnbocTEFE8cZcxaZW/nTWI/7 305x35LxP/CcR+GDgDiT7PxnlYR8fnwU/eWe/isn8CuDw3HPZndL7G5PPkdD6dmSe3JwP1A4+Ggd md8vsSw+cteXUIr62nFtLBy9EIqlRzUo1Q4YElWI3wnGCKLnYtLCAoJdb6tqFvp93p0MvGzvjGbq Lip5mJuSbkVFD4HCYgm28gXaLtfNWv2v6P8Aq92Y/wBFiVbCiofTE/8AejdfiDV/argOOJvzQYD5 ta15p17W5IJNUuzcvbcvQJVF48yC2yKvUjvjDGI8ljADkofprU/0hcaj65+u3YmFxNxWrC4UrLtS g5Bz0GHhFUnhFUts9W1GziEVtMY0E8V0AAp/fQcvTepB+zzOJiCpAKO1vzl5l1y2S21W9a5gjf1U jKRoA9COXwKv8xyMMUY8giMAOTdt508z2t5DeQXzR3MFsllFIEj2t4yGRKFaGhHU74nFEiqU4wiE /MTzkl7JepqTC5ljjikf04t0iJZBx4cRxLntg8GFVSPCj3IIeatfGtnXBdn9KEcfrJVDt6fpU4le FOG3TJeHGq6J4BVdH1p/zjN/5Kax/wCYm6/5OnMzFyYT5vVMsYOxV2KuxV2KuxV2KuxV2KvBvzzs dA1P8xdD0vVdPN21zp8jQTCaSMRCJpXb4Y/tcqDvtmDrDIbgpJIFh41p+g+WP8K6c9xpzTalqdlq Nwt768qCN7IOyn0wOLdAP15jmcuI77Aj7UmRs/BF/wCGPKn6BMf6Nb9I/wCH/wBMC+9eWnq0pT0v sfa38MHHK+e3FSOOV8+tNy+WfKa6TJbDTW/SEfl8ax9f9eX+8KgU9L7P2t/D+LxyvntxUvHK+fWm NXq+XF0fQtTi0po19eSDUovrEjfWfQSFmIYj93z9Rvs9MtHFZFtguyLT7SNH8oXHnhdHl0dmtdRg tprRPrM3+j8rX6xICRRpOVae3bK5SkIXfL9bCUpcN2lOn2Hl+88la1ONPKarpIiP171pCH9e4Kj9 19heKDj7/PJyMhMb7FkSRIdxT2w8t+UtWu/Kk9vpbWlrq8l6t1bevNIWFsvwjmdx8S1+HxyszlES 35UwMpC9+Tdr5X8p6lqXliSDTWtbTVY75rq19eWSptQQvxmjAchXb78TOQEt+VKZyAO/JD2OieUr 2/W9TSWi086Jcal+jzcSsTLBO8f97QNuqfLCZSAq9+KkmUgOfVbcaP5Rg85aLanSXbTtasrV1tPr EoMU11JQP6n224qKU74iUuE77grxS4TvyRWmeWvKUfq/XNMa7+seYJNItwJ5oxFFUcD8NeXEV9z+ sSnLof4bQZy7+lozT/KHk1brTbC50t55dTvNSt0uPrEyemtlK4QcV2b4Fp498jLJKib5Afagzlub 5UhPLXlfylPZaBb3umvcXmspes1368qcPqrPT4F+E1AH8faWScgTR5UmU5b78mJGHRJvJZuorAxa nZ3cMNxeGZ2EyzLM9BHTglBGoy7fi57Nm/EjdTHlWDU9Fvo9GZdLvrVpZtN+tSkl/WlhB9Yjl+wD sMjHioi90Dioi91WHTPLqeYfMmjzac0phF62mzetKv1cWscriqgVkrxX7WDilwg33Is0DacxeWfK baTHbHTW/SEnl86x9f8AXl/vApFPS+z9rfw/hDjlfPbipjxyvn1p0vlnymukyWw01v0hH5fGsfX/ AF5f7wqBT0vs/a38P4vHK+e3FS8cr59aQfl7Q/LGs3HllRprQJdS3VtqA9eV/Xe2tkk5jYcKu32V wzlKPFumUiL3UdXtPKNvaeXtai0Zlsr6S7ju7D6zKefokRqRKd1ox5bfI4YmRJFpiZbi0ytfLnlJ PzH1Dy5PpZltnCGzPrzL6PC29Z60PJ+Z8TtkTOXhiVsTKXADb37/AJxm/wDJTWP/ADE3X/J05s8X JlPm9Uyxg7FXYq7FXYq7FXYq7FXYq+cP+cj9e/QP5j+XNU+ri59HTpl9Etwr6jSJXlRqU5V6Ziam HEKZiPFGnj1l57tbfy9Bpc2kJPdWlvdW1rfmZlKC85B29MLxY0em57dsxziPFd/gJOPe7V/+Vi23 6E+o/odPr36M/RP6Q9Zq+jSlfT48a136/Tg8He72u0eFvd9bbf8AMW1bSWtf0Mgv30waSb8Tt/ch QKiLjxrX4uvfrj4Jvntdr4W/PrbGJtU9XRbXTPSA+rTzz+tXdvXWNeNKfs+l498t4d7bK3tNbDzh 9U802WvfUw/1OGOH6rzoH9K2FvUtxP2qcjtkJY7iQxMLFIPTvMH1PRtZ036uJP0uIR6xanpejIZN loeXKtOoyUoWQe5JjZB7kz0fz2dNTy+osVlOhPdPUyU9YXVag/CePGvvkJYrvfmxlju/NF/8rHto tR0a4stGS2tdHS5RLX1mfn9aFGPNlqCDv0ODwdjZ5o8LY781kPn/AE+DU1ng0NI9OGnyaYdPE7kF JZDIzeqylq1bE4TXPe7XwzXNB6n50iu/MulaxDpy20GlJbxw2IkLqUtnLAFytd606ZKOKokXzZDH QIvmmGm/mNaW3r/WtFS8DanJq1tWdkMUrkcQaIefHfrtv0yEsJPI9KYnF59KV7H80baAwSz6Glxd 2lxd3NrOZ2XgbyRndSoQhhRuO+A4L6oOLzUND/Me202x06GbRkurzTFnW0u/XZKfWSxeqBWB+1Tf w7ZKeEknfmmWKzzYvFqnp6Jc6Z6QP1i4huPWruvopIvGlP2vV8e2W8O9tlb2uvdW+sw6ZH6IT9HQ +hyBr6n755uR22/vKfRiI1fmojzRR8yV8w6jrH1Uf6eLsfV+WyfW0dNm478PUqNu2R4PSB3Ujg2p O0/MW1XSVtf0Mhv00w6SL8zt/clSKmLjxrX4uvbrkPBN89rth4W/Prbn/MW1bSWtf0Mgv30waSb8 Tt/chQKiLjxrX4uvfrj4Jvntdr4W/PraWeXvOB0Z9KcWaznTLi5uKF+PqC5iSIofhNOPCvfrkp4+ K/NlKF27zJ5rtNVs9OsrLTF06005pXSMStMWMzKzfEwB+0pP04wxkEkm7WMKvdEjz3Tzy/mr6gPj BH1L1NhWD0Nn4dvtD4cHhejhtHh+nhfT3/OM3/kprH/mJuv+TpzPxckT5vVMsYOxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K vIvzd/P7/lXfmS20X9A/pT6xZpe/WPrf1fjzlli4cPRmrT0a1r3xSy7zL+Y+n6B5Ai823cNXuLWO 4tNO9SjSTSQ+sIRJx7KDVuPQE07YoS78ofzR1H8w9OvdTk0L9EafbSCCCY3JuDNJSrhR6MNAgI3q dzirFvPf/OSH+FPP915R/wAO/Xfq0ltH9d+uely+swxy19P0JKcfVp9remKsag/5zC9WK4f/AAlT 0IxJT9I1rWREp/vLt9uuKaelfk5+bv8Aysez1O4/RP6K/R0kUfH6x9Y5+qrGtfSh404++KGNee/+ ckP8Kef7ryj/AId+u/VpLaP679c9Ll9Zhjlr6foSU4+rT7W9MVY1B/zmF6sVw/8AhKnoRiSn6RrW siJT/eXb7dcU09R/KL82bL8xtJvLyGwfTbmwlWK5tmkEy0cFkZJAsda0P7IpihhF5/zlFa2Xnm+8 tXfl/wBO10++ubO41P65WkdrI6vN6PofyxluPP2rirO/zb/M5fy+8sWuupp41Zbq8jtFhE/oACSK WUSB/Tmr/dUpTv1xVX/Kn8xP8f8AlY69+j/0bS4ktvq3rev/AHYU8ufCLry6ccVeRwf85herFcP/ AISp6EYkp+ka1rIiU/3l2+3XFNOb/nMLjZxXH+Eq+pJJHx/SPT01Q1r9V7+pitPXNJ/MT9IflY/n z9H+lw0+61H9G+tyr9VWRvT9bgPtel9rhtXpihjX5P8A57f8rF1m+039B/ov6nb/AFn1frX1jl8a px4+jDT7Va1xV6viqD1nVbXSNHvtWu+X1TTreW7uOIq3pwIZHoO54rir5/b/AJzBjNvPcR+Uy0cU qRpyvwrMsgchiBbNxP7vpU/PFNNn/nMGGM2jTeVGWG4T1JGS/DMiiRozRTbqGPwV6jFaeved/wAw YPLf5eT+dLe0OoW8cVrPDatJ6BdLuWONavxl4kCav2T4YoSj8nPzd/5WPZ6ncfon9Ffo6SKPj9Y+ sc/VVjWvpQ8acffFWNee/wDnJD/Cnn+68o/4d+u/VpLaP679c9Ll9Zhjlr6foSU4+rT7W9MVe04q 8d/Nf/nIePyD5pXQU0L9KN9WjuJLj639X4tIzDhw9Gboqg1r36Yq9R8uazHrehWGrRx+kL2FJTDy DcGYfEnIUrxaorirBvzl/OX/AJVt+h/9w/6V/Sv1n/j5+ren9W9L/iqbly9b2pTFWAL/AM5dV1C2 s/8ACf8AvR6Hx/pDp66q3T6tvx54pZP+VX/ORdl578yjQJtEfSrmWJ5baRbgXKOYxyZW/dQlfh3H XFCcfnL+cv8Ayrb9D/7h/wBK/pX6z/x8/VvT+rel/wAVTcuXre1KYqneg/mPp9/+XNt531CH9HWs 8Jla29T1SG9UxJGr8Y+TO9APhG5xVjf5QfnVqP5jX97Enlz9GafYRhp743ZnBkc/BEqehECSASfi 2+nFXkH/ADlnYX1x+Y2nPb20syDR4VLRozCv1q5NKgHxxSEH591nXvOfmHyz5R02Cb6hp2nRafES jiJ764tBHI7EClEYiOp6UbxwofU/lDyxp3lfy1p+g6eoW2sIhGGpQu/WSRqftO5LH54FfJf55adq Ev586nNFayvCZ9PIkWNitBaW4O4FMUvoyw8lfkdeTm00/TdBuZ5lIMEH1eR2VaMfhQkkDjXFDKtA 8p+WvLyTR6FplvpqXBVp1to1jDlahS3HrSuKvkn88tO1CX8+dTmitZXhM+nkSLGxWgtLcHcCmKXq H5x+W/yoh/LPXG8q2mkfprjbCAad6D3BX65Dz4rES5HGtfbFCH/5xCtLq20nzKLiGSEtPbFRIpUk cJOlQMVLxTzvpept+Z/m2RbSZo31DWCjiNyCGaelDTvilmvmzzFqnmX/AJx10SxuYJ31bRdZhs7h DHJzaFLW59CTcEkcCFr4jFXrP/OLNvPB+WDRzxvFJ+kLg8HUqaFY+xxQ8C/IvQ9Pk/MG3j80WaDQ 3gnF1+kE4W1QlY+Zlon94FpXvikvqTT/AMvfya1SJl07RtGvooGq4t0glVGcd+HKhYL+GKEZ530i x078qvMmmaVapbWkWjagltaQLxVeVtIeKKPEnFXgv/OI9je23nDWmuLeSFW08BTIjKCfXTpUDFJf U+KGOfmUjv8Alz5qRFLO2j36qqipJNrIAABir5g/5x00Hy3Lr2rR+dLO2GmfVVaAaoqpD64kAXiZ uK8+Bb3pXFJegeffyO/LnzXrlncaD5p0ry/bpbLbR6ZaxwTCRxLI5kXjcQ7t6nGgXtii2XfnfpE1 l+Qeo6RCWupLO3062VkQ8n9G6t15BAWpXjWlcVYH/wA4p39hoek+YRrVzFpZuJ7cwC8dbcuER+XD 1SvLjyFaYqXn/wCc8Muo/njqF/p6NeWMs+ntFd24MsTBbW3BKyJVTQgjril9oYofDf50S6nrv5g6 nqMdrPLE8ssMUgjdgY7eeSGMggdCkYI9sUh9M/8AOPupz3XkJ7S4DrNpmoXltxkUq3BpTOh3pVaT UB+jtih55/zmFZ3lz/hL6vBJNw/SPL00Z6V+q0rQHwxSE/8Ayn8u/lPJ5D0GbzDa6OPMPoj6wb0w LdBlkYRcxIQ4PALxr2pih5H/AM406dqEH5tadJPayxRiC6Bd42UVMLdyMUlnv/OYVneXP+Evq8Ek 3D9I8vTRnpX6rStAfDFQwTzB5q1ebyP5D8l2VvcfV7IJeavwjk3la4cwxNQfsIeZH+UvhhQ+mPym 8hweSfJFho4VRfMv1jU5V/bupAC+/cJsi+wwK+fv+cs7aGX8xtOZ7qKAjR4RwkEpJ/0q53+BHH44 pCTflnPZ+TvzmtbzW2gMcpkcF1lDQxXsXqx3Clowu0bgnf7JPfCh9l4FfGn55WsD/nzqbtdxRt6+ n/umEvLa0t/5Y2Xf54pej/k7/wA49edPJXnq01/VL3TZrOCKeN47WWd5SZYyi0EkEa9Tv8WKvoTF D40/PK1gf8+dTdruKNvX0/8AdMJeW1pb/wAsbLv88Uu8z/8AOO/nHyd5W1XXdX1HSzYwxRRyehJc u9ZLqFV+E269zir1n/nE/ULeTylqunRRWoNlcozXNssqvL6yHeYygFmHDam1NqYoeL3nl6z1n899 V0uW+iVNS16/tZEUS+oouLiWNqVQLUcv5qYpYrf6Nc6Ta6tol5fQwzW1/DHeQUnoJrdbiPf9125t TFX1J/zizGkf5YMqSpMP0hcfGgYD7Mf86ofwxQ+ZvIXke882azJ5f0rULP6/fQN6Jm+sJGPSdJm5 N6J/ZjPbril9SfkJ+VPmL8vbHWLfWri0uH1CWGSE2byuAI1YHl6kcX83auKGZfmUob8ufNSlggOj 34LtWgraybmgJ+4Yq+e/+cR7eKLzhrRS5jnJ08VWMSAj9+nXmiYpL6nxQl/mLR49a8v6no0rmKPU 7SezeRdyqzxtGWHy5Yq+YH/5xL/MFLW4totU0l1eaN4naW5QlI1kHxKIGoTzG1T88U28+/Mf8uNS 8lalp+i61qFl9c+pCcGA3EicJLiYDcwr/Ke2KvpP83C1z/zjlO09wOctjpTSXMnMgsbi2JY0Vm+I +2KA+fPIH5N+YPP+kzjQdQ08DTJz9YNy9xGD9YReHGkD1/uTXFKW+ZvJ1z5Z8/R6HqV/aG/sHsUm EXrshJghYcWMK9mGKvuXXdSj0vRNQ1OQhY7G2muXZvsgQxlyT7fDih8EtDo0sIk1TUFeaWxlNrJG kxrdG6dlZ6ovwH4ge/til79/zi1qSR6x5v0b6xHMHnW9iVBICpDvHJy5qteqdMUIb/nMKCKX/CXO 4jgp+kaeoJDWv1XpwR+nvikMN8p/848ecvMtppHmjTtQ0wabOlu8ayyXKy0twsb/AAi3I3aI03xV W/5xbvbWy/MT6kos7uS/tplW5CT/AFiL019SkbOioFbjRu58cVLLP+cwoIpf8Jc7iOCn6Rp6gkNa /VenBH6e+Kh5H5dhi8ued/Kuu6h6FzZyfU7u3hZZv3scdIC6Vj48lkiYrU9QK4Vfctnd215aQXlr IJba5jWaCVfsvG6hlYexBrgQ+Uv+cs3sV/MbThcQyyP+h4aNHKqCn1q57GN/14pDJvzh8gWt15F8 u+dba2kklsNGjtdREbqjfV3sz6UjfA3Lg7ca/wCUOwwoeh/kF5+h83eQrYO7HUtIpZXqyMHkIQfu ZGIVK84x1p1BwK+ffzyfTx+fOpiWGVpvX0+rrKqrX6pb0+Exsf8AhsUskt/+cuPOEsVy50XTwYIx IorPuTIiU+3/AJeK09X/ACM/NjV/zEstWuNSs7ezbT5IY41t+dGEqsSW5s38uKHgn55Pp4/PnUxL DK03r6fV1lVVr9Ut6fCY2P8Aw2KX0J/zkSYR+TnmAzKzx/6HyVGCMf8AToOjFX/Vihgf/OITWraT 5l+rxyRj17bkJHEhJ4SdKJHipeb6W+n/APQyrgQyif8AxRcfGZVKcvrj78fTrT25YpZJ/wA5Q+UN P0jW/wDEAtpDb668JmMUixgXNvHIrbGN/tIVPua4oD0f/nFloD+WDGBHSP8ASFx8LsHNeMfcKn6s VfNP5eec4/J+vP5j0yyMt7YwP6cdzMHiImZYW5BEjb7MhI+LFL09/wDnLjzgtlFcfoXT+UkkkZWs 9AI1jIP2/wDizFaevv5puPNP5Bar5hvoEhlv9D1GSaCAkKAsMyUUtzI2XvXFD5f/AC0/MuXyDLqG s6Np6z3E6xWckd5KXTg5aSo9NYjyrEO+KXoNx/zlx5wiitnGi6eTPGZGFZ9iJHSn2/8AIxWnu/me 9m1b8oNWvZIS02oeX7iZ7eGtS01kzFEqGPVqDY4ofI/5afmXL5Bl1DWdG09Z7idYrOSO8lLpwctJ UemsR5ViHfFKl+Z35hv561bT9c1ewEF19RFuI7SXhHwjuJiNpElatWPfFX0f+bSxxf8AOOEyXETh UsNKV4gwRwRcWwoWKtuD1+HFAY1/ziE1q2k+Zfq8ckY9e25CRxISeEnSiR4qXm/55Pp4/PnUxLDK 03r6fV1lVVr9Ut6fCY2P/DYpfQ//ADkDrUOlflRrTyBmN4sdmiIwQn15FV/iIan7vl2xQ8T/ACb/ ACT8q/mFoEmo6nPf2cdpS3tltpodyZJXfnzgb+ZaUpilCfkZqlnov56y6eY5Yprx7/TpnaVXQsrN LTiI0O7wCm+Kst/5zCazX/CX1iKSSv6R4+nIsdP95a1qklcVD1L8ijEfyl8uGJWWP0H4qxDED1pO pAWv3YofOH/ONL6efza04QQypJ6F1RnlVxT0W7CNP14pLPf+cwms1/wl9Yikkr+kePpyLHT/AHlr WqSVxULn8gWvmT8iPKGs2ltI+oaADcRIrr6jWxuW9dS3D4uIXmBQdDTrhQn/APzi95+ttZ8rTeWZ GdbzQzW2SVw7taSGq0IVK+m5K9NgVwK9W1fyf5R1q5W61jRLDUrpEEST3lrDPIIwSwQNIrEKCxNP fFUfJpunS6e2myWsL6c0XoNZtGphMPHj6ZjI48OO3GlKYqg9G8q+V9Eklk0XR7HTJJgFmeztobcu F3AYxqtQPfFVG/8AJHkvUNQbUr/QNNvNQcqz3k9pBLMxQBUJkdCx4qoA32piqGX8tfy5UMF8q6OA 44uBYWoqKg0P7vxAOKplo3lvy7oiSpoul2mmJOQ0y2cEVuHK7AsI1WtK98VQ1/5I8l6hqDalf6Bp t5qDlWe8ntIJZmKAKhMjoWPFVAG+1MVTHUtM03VLKSx1O0hvrKbj6trcxpNE/Fgy8kcMpoygio64 qh9G8t+XdESVNF0u00xJyGmWzgitw5XYFhGq1pXviqGTyR5LTU/0smgaauqGU3BvxaQC49Zm5GX1 eHPmWNeVa1xVGaxoOha1bpbazp1rqdvG/qRw3kMc6K4BXkFkVgDRiK4qu0nRdH0e1+qaRYW+nWnI v9XtIkgj5NSrcIwq1NOuKpQv5a/lyoYL5V0cBxxcCwtRUVBof3fiAcVcfy1/LkoEPlXR+Cksq/UL WgJoCaen3oMVTeHRdHh0o6RDYW8ekmNoTp6RItuYpKh4/SA4cW5GopQ4qlA/LX8uQhQeVdH4MQzL 9QtaEioBp6fapxVzflr+XLBQ3lXRyEHFAbC1NBUmg/d+JJxVkEMEEECW8MaxQRKI44kAVFRRQKqj YADamKpDJ+XP5eyGQyeV9Jcyt6kpaxtjyff4mqm5+I74q3H+Xf5fxSRSxeWdJSSChhdbG2DIQSw4 kJ8PxGu2KpvqWmabqllJY6naQ31lNx9W1uY0mifiwZeSOGU0ZQRUdcVQ+jeW/LuiJKmi6XaaYk5D TLZwRW4crsCwjVa0r3xVDX/kjyXqGoNqV/oGm3moOVZ7ye0glmYoAqEyOhY8VUAb7UxVHatomjax ai01ewttRtAwkFvdxJPHzWoDcJAy1FTvirtJ0XR9HtfqmkWFvp1pyL/V7SJII+TUq3CMKtTTriqC j8leTYtUOrR6DpyaqZWnOoLaQC49VyS0nqhOfNiSS1a4qr6z5Y8t656P6a0mz1T6vy+r/XbeK49P nTnw9VW48uIrTrTFUXYafYadZxWWn20VnZwjjDbW6LFEgJrRUQBRuewxVLNL8keS9JvFvdL0DTbC 8QFUubW0ghlAYUYB40VhUdd8VRGs+WPLeuej+mtJs9U+r8vq/wBdt4rj0+dOfD1Vbjy4itOtMVRV jpunWFlHY2FrDaWMQKxWsEaxxKpJJCogCgVPhiqXaV5L8naPd/XNJ0LTtOu+JT6xaWkEEnFuq840 VqGmKv8A/9k= xmp.iid:2557c16f-d99f-4c6a-8f56-f102b8344ad6 xmp.did:2557c16f-d99f-4c6a-8f56-f102b8344ad6 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf xmp.iid:4890e57f-3f2e-430a-9ce5-de037da36c36 xmp.did:4890e57f-3f2e-430a-9ce5-de037da36c36 uuid:5D20892493BFDB11914A8590D31508C8 proof:pdf saved xmp.iid:3c82e37f-f75e-4c02-b3d7-a9c34b537019 2017-11-21T19:14:47-05:00 Adobe Illustrator CC 2017 (Macintosh) / saved xmp.iid:2557c16f-d99f-4c6a-8f56-f102b8344ad6 2017-12-05T11:33:42-05:00 Adobe Illustrator CC 2017 (Macintosh) / Print Adobe PDF library 10.01 Adobed      !!-,,,-2222222222    ## ##++)++2222222222"" !1A"Qa2#qBR36brs$t5CS4cT% !1AQ"aq2BR#t5ђs43CS$UEbrd?JW\5)JT/w$=$R4N:V /*b-SU޿9GPU鷪w5)A6T{d3ЃZzzl̊ r߸x,d,"W5Mkヹ`]ʓ'ih $rHtǕjGgemh[ 6^GKcn^u)6/X" :? }љR1ZEԭֶuxMqhPH5 F߭Z8DvؓiH}zx-X /[+ύJV{ S?g6݆/Tw_GqY r##h8!7<#M6xW./y0aʺowߒ,0dKE]/#'G\]qvhXM{,I^RC'r6B>_^F^CO!ŴUr 4WPs^@C+V+$+8ywIyg@{[zg6Mp`\PÇ,OBYjWx۷'\Տ~984GkV7wG}fQ I#?n+NXܥ8j?.,Gҕ/ڭ['s rŊs:zˉF!Su<FTR ڲz~Oj壗Vr)q (;Ob3׻6]nxx0T.\2LDc|%%u_ÈKE1Xr&59,)Nx5IV׻ A_2e9)N ½@vqX\3]b?5q[#/s:'i#[zש܋] l~F׭m0n|ګ'@VXiV&n\p!bTȔ-W{ v^ݹK룏~9;~JMTpo굽ղ.Rqe: fvYӹ :@A܋ X9*갏?3 `BkT{w>0w(v>&?ɪ"xC q#] ܸnpLO+fotN=-nȑG#(d:WȲ9U fFl[դIڅy{@Thg{ڨ]oHns]ǁ&v~@^=17kZ.] {. &< !_eՏj۷l}(ę[:nbvyEAܑŹY 2JW'G6NMb8kaeiOOoֽ5o Āqg宾4 Qk~"FTb!eӫߝIGE˗^˭46\sH]+dU,9n nޗk0홓EZw_|\1Y5ƕ`a:6ݸ6w㌡$f8Sy-֬]ٶD#vq|Sg%ȕf-թ7r$F #:bN:8:ݗ3r\9̪wj~5AOd]Z߈ӫV+*i${OOĚ-~^]7oidD]r1z󒟖%w| %*ND O֟8pav&/6/C԰?;ȓgnN3i4GM&dbI%IXgbKW&j#?ȩzR.)JR)JR!JRޖ̿/{mNz,AՌcY{R;T+ޟoT1T@׊Io'UY,Xi0796snUd7^%Ҿ տOFtj\7:YBm!\t=(gUHǞ`ܗw۰B<ߩ,YJXO՟},Eׯ@N_6·?nX3m.< Cid]v/>sȊ[鱸bSCiծDz1^Ե{[{Y)xW<+e:t:v ؋ߏ3 ͥIfƲuUaJDRjۑ2 ohFl]Q&H&3$]nb/vo&vF49 0$X<=~LJ Ttf1Xb2|8s[FFAŖIC o/]Nb׽ʾ1 .43q)ҿV7kVl`HQqMZZBi!M-TťHd7m'뾖w"kנEFUr|hs gh:uc̐ҷ1<7;cp8Cuӫ]empgݳlXa Vbbəf +O,WDJ1>R4.U&JI,-eHkK廙ߌN>c=ca&&8ِ#]Mq|(Gz,e26F,H0Uru?T.6Nᙁō[ @L{{ wSDEP>Ao]tvi`K EHJae  voe_sNْ@Ļ~]H XOWj |$8p%X)"iN9(Ӫs!qn퉗,E5gXz4G@ V|\w=`al#Ոx?_WO޽~_3H||=낓sdd͕q$m:XyH>uovRU۟;IWJзOWkrv?/QEKҔI)JR)JR! RNw-O"az:.$vaCS [H(3fmK>PN9 b^[&yqSuwCڹDetoc.DD8: q +t^HZ؞d _72-'"c a˗* -qSe53Teq粴n۸e|;'ndy(w,7^s,|w5bAַ6X6} ݷ ԞHafN9'v(f!cMּǼ˹&΍ I.U.{>$݃n'#"0CvZGNK귿z3YܷƖ6ECE@ aɹK~+kBQAO<;l:&rDy & 2!=kmR{^[z`a>FU*[vWe%9+m_{Vě&V^[|9oMl>ʶV8NbkG {fiUA[ 2i^j wE7VeilCOzĩ+p PT\)tbu eSfS(qvߟp;nl qēy1D~}zƥ;ofٗso"#< ,ǖpy#@I"hͮE:>޳>rpʪҴcDnTiU[gL|qr/]Cc֮kݦZC$ pMFRڀ[j?jQ6Q!pҦB* Rl`a +C>.|ru IT~eK!Ov(mG;}sfh+C>5ovN 1A؝9feErLGZ[_"XWd91˺dDaHLe]2#Cq<׋CD6PFXWG<μVUvBJy^+F<m,Lc(we^oKlbY#\ uq7ʜBo0-oi,[8rާ$fԚ"p7rJflI&\8׈)BDV>utqdt]Iw*Xߧs}u8F5izm"J󽫒&ܮS㺞S˷+:l[4J[ML()49HQG&iI;xdiR\|TΦ4d1],.ukK6Myđu~źb,2geytC]JFM@ڤvݯk1.I,@<+6M)f8@}v3c\FH_+K] v.:e)<|efӛnЕ*Im'f&ID ɔWFaڶ "O8,^r0 I*Y|/ HlMUoNv!a8ؐKȬA7<+v( FM'؛Vc=YSGx:[[h):+ZMEaV$_1Ku(QiUJ\JvT'mKdh.V7\^3uVFiO/ջ.ʻp=N'k"≍`]Ň̑!3GaVEmV&>5Ųe3^y8ҾAl<jf7?v#c;oo3ט"O孯4*^;Skk 슗)J!JR)R)JB)PEhAߝMTz;k4tGQ5%X]}z*ܱG."IVˀ RiI 2θB%pԷ^y%UI3Ei\PiV}:W&S"8( j+$sĞf\͒Vbc(y䕙[q+w$yT)JVh R*W aȜc<@3?`by/CkYDJHr[ zܑp\D_$q'`Ah8r.9±]2?[*_S5K4@ZAFfNF-QCJcb A 9p1!Q˙ tgfuhe71=K6yqtjT>)}73.TR y2q|ø<%F7H}r1sNGF^xmӹ\]23n5dz҉LX9r;heRZQzFMA.WQokח>N< x#F[J6 JWƆ,R)HBMvl9Qɐr5&@`\qk깋 WRWbxUs[X^' /P._]KaTCJ>_  *[NmxM8cs|B^YG!@mӝq͸+w 0`ln?c4NƬggl"?$I$1 q ^)5ݣQH[WsŎcoh/jShɎD_[Ze^΅;l qnJBjA$`[w7rIO&m 6b9 qƼvf^F'a*<0kkiUĺ}ܡbtɓ?ː~_)ܮq:}uH%Fq$ȗ[~:VrW>fA_sZF@mccʝ ڽ7cU q5hB@W 9LYc+{v هzA8W7?b~BQ6MwDrpJcބX2k!m~epʈYI)_#aaG&NAYΣss<+J]%6ZlCXvXad.&N%^(5,XdV\(uvlD[:%7W㷕TìZ˼w>tnL:^oFӺ$Y"YDO |zMJ)GFb ' Fck)R}U[ 4\N<% [`Ir]fcv'5tk})MEU,& '!;bd L1Ҝ61ʗj]rJ#:ȖI#/1ύu4<Ȳ6k>b3俫H@u&V[j9{mzֽ- ̕'0k6+T$%fŏ3#)\I ^YCXz_M :8w= [O42DYz}4'XS,KtC~kzC;ӏLa9!nO^qVu11-yǥ"R0 >'yGkcL8 _V{,SSEMYy˻K9Kkf>Րbƛ>9 $9tGͫn =6Ǝ@fI1<\qs*D1BWDL#43αlHlz%ה:jU*jӮiaʷE+n+:$RT )"{pi4e9^5L i?1gK7%VX_+-w\D/uiiB 'Iz~ⲻ_|X_'F$1,GJ5"qjݷ %eV+e:[ݹCaԕFRU~m-={>\EKGj-mR)Rbd)JR! R)HB*/oe16 В}hjKvbd:IRԖ)Ak5cj^qJCNDX;d!#I 1+'2RgǍ/]"QUŪ-/+1 AVc%Wב^V篓pE&݊ @o¹݃z2FeYVmjC-7pr.ZC-`!H5qW})4 + دwh9[Bsgɞ^ UhW@I?-a9fbf;}?+qw^g鲻 PHAnG! +R3ɥ%3<<x 6;,Hd4&QR2NYUխT4K<,ZFOݳh5դ&,kc,j:0+\ P`IH7(֜x=o6"%{rVk^˧;[w%"0I3n8'Xhӧp߸ڣ‡dL4Y$a0b}}+a땏|3v**'ʑ-`m~bE,=%Ou< f4fi7Js6^p.ɩAM M+f[ E'HET]"xWfB"USϢ3MrY~l"kjoegf8IF$,I Y;&dKrO!Cy% #G(x+Vܦ98>!Gy3eЪZ2nonUI Y$Y֒K3ck[Y2}L̤My2֑yLzA[I{kKY +q2NxÅQjtd ʴjυ' k$t%8Y&|y'Ma0"oywmLm͏MS趎qu'pY=^!DNM"mG^ܫ bg %|^7[CaԕFRU~m-={>[EKGj-mR)Rbd)JR! R)HB*/ne 'MNTy=_zSie2 ;MD: N k5cj^qJAw۹ HeƑ$.L,m*v;0h=Mlp}ZIy dfkz)^6f ݸdLтquվ.df11_r P|a do[ʴ ^}_q>^zNw!LǍ2&Ьz\귈6"EpC<{kbij`[ΣV lma6I+ K8 \1,wb3ȁACk^ RvZL[̭^~zΝDqr¶ׯF$ O9zq,#fZFۜ‚~eMbS.aXC2-2]_/uOܘ[ı,^J-uZ)~SG ŁcaEϕ'L mF_6Yfu$w>.JN13,yQk877lmStrAIպx]ow Yu ӍtuӘ׫kZD2$}C2>,UPh"܍{}ՍLjnnm洶ŰQ.K8Hc8Mft;~DA}#TPqn٥I\b&su+h˹`. LI=?Įu|X^61 .$ۦ)'k-{Eʃ#0},P{c!$3{|kB>YV{e:y^U *<Ѯ[>}fY=TР)[E1_Iۻlo^L>COIp@\>mfaÏ/eGŃ>,}Vv6\A$vՎ=š(so@fc *ç~unNJm瓕㌡G$f8Sy-C{YXxCit\T\{2yjkP'S.u{xU^UBe*KIoQe&tK8"q ۦA Ǜ*42>]+@P/0Z_ v+[[F];jutҩleډ761+)[XUJ.8K)RBqHRF%&px6yL2j~tH>$6Ua""?8=?5{:Tonx|VUT/M57xq쫲kܸ^XմPP$Kt?go<Ϗ֓^̈́cǏ`1[Z7WssυEɹ)`wyE"'L{'|*RfDjTnb3$XsKNJF;!$k{ >zF~yExytߕ]tVŗ%sO* x{$3qwp-44gb'Mtmk+9YO`2q }~VΕ۠oXVJ2S- D"Sl"ݦ'W)7T:(PWcGp*Z)JJR)R)JB)ȾbKX zȈ-kSxnݷ(`_,iǔZ>KmcYiLe"?Ǔ X2 /xmtc6)tߙ("4)HGmߍ˓"cX̬-5fU|jٶߺ{}+*()e]ES5[s Kl{vp(e|&s p1ŬR"3'2k %9 $2DfF;?7=i'$KFJHUu] U_7-?sM^&Nc"nܛJRqf|HM||M:E6sʯWRuaun/{'j,~s%+@t2eS7=#wX,p̰jWV![yvbu}d\īR!yٽe>uŞx $Kuyype7 3_Sd~|'N\U~û}+UUr ;v>WU~F_;`OV) |ܳv''%XW>U*2)>wP-ݫr h;;)`V F2uNʸ~;W{ܷ=e1I \,^x6P7|*4|⾁ӚHEy%)JRݰvrmL$h|}` V㵤^S<\Pn-WL#e7̞X/VZA KnmO)HD~x{叵MU\x3^%EYSu _v.s1$rcS4EC()JB'ٻf7mS?_,)p\(VOj5)JR}1;QeoQ/^9Z]qx+FfOdf6nSuO#Ll@rlOwwܽú02v#Y\o-g>l(~m&0U?X1fJRs?y7+l_mxK(! Kpw=.iyr: ] 3$^o+ qI3b].Y᡹`}ܢس68V`$&JJRs]'lh|XL!TP{7ƍ'zrmc#~󭟸Lʼn#\)F 齸qQ]勎4X-h|:1R!pnft7p1fl؜i$3Ȗ#U*O-n~qcdN#)'}5wdh$8ћ :*WZ?lؤwpv,.yW\iJR^g&L R$,Q .[+ćAG ~ZR!yOxPHVܯLece .7᭝YwN۝}>Xd6nǓS)[yV^odvvݢx'2b:@]#k/pvnwH8c(~IJRG,;w+'Hq&q>7ygɞ|%C ҁlL =qgln6ϙotX&wTPd GWp|PFv"zm`DR!`]}nYVyUC2)JRVyv]/_S]޶u)7@ȼa2pk#&<O t~.ZֆDnソwN q([P@:doJRSFg.=myS&PY2E{^&~ޒ\YA tݼ3Hwb}\<+ovnר&'Z:2Y5th󽭬)JB)mqrd0KxH:dп;ia`@]|5DuI'Euڎfdcacm2p%~AUMR R#{6Oy'c ll?w{Woٶݳ'IL* X3oo]pv܉{'LbK K_Ҽt_d:zvҔ!{_umn`c3cYB6TnqU*-0w& o\(_.*M{sf7ٱ.,=rIyU ^VsCL3dtlʪ8)HESu<,W:%HPŔԏG{n ἂ55emn;/l<^84Iܵ#-yڶ7~ɏ+yS(߫4vK3JRsz׳"݇ R[$,2 JIL.So07|SJ#ݿaڶݜl0tvY#XybKҥ)JB??[^|I#$Ȋ`(оn ᩏ.뇳h{?`uǿ`7h)c̶x4'Hw"AB:Ǥ~:R#Y٘M v~nLٛ^3"| ~.!/WGo; &մQmn>TZDk0~GW'll{nՊ Ia/$cbL犨)JB"2wwdr!ޕwnvNFVшqfp2Rkernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-advance-filter-01.png000066400000000000000000000444051477354127100305350ustar00rootroot00000000000000PNG  IHDRsBITOtEXtSoftwaregnome-screenshot> IDATxwX "!B/"`(~ 6!-dy4ç8x+D>mlw(FQTOO3 0ٗxcrh@g#ZƸ+'`@DJ @D;`rNr9_lsG_W˖m-O 4H7ztX,*W\r݉Ґ0-.I!h^ رxiNee$zn<$p 6h z>6ahY99eeqN#lGRö>VꔟGʋ3434[4nII Fdd; o1ƮmbL~qÿ ۹16֮8a  @DJg#G&܍aǃ*8I!tTаԷr۲LS<|ɳs|y؎ap7N >.8+WMCի/}{64W\aCKEF\ [mF!:z|uuM[;xU5us!nj۴~meeGnڿ۶cq57ج?Ƙ9))/XI55:db)NC=y,|dfff8kV_xc\]]-++c6:L{%&[,UdA{yy :4!!b޾}-jqTTTxx8y{1WWWjU*:I:KKK333,X!''ghhdPzz:.(( a-,,Ξ=[WWr~Ꚛ/YYfZFUUU1s 6LMMӧO[lׯ_HHURRyۭ[79>'OZ[[S+))eee!,,,9Bf155ݳgy@@9'L@طoBv\ :tHUUU[[{ժU033KGGGUU޾|S~!CX,c^^rժU'NK?~驪:`7n4^uU\\|)ōgn^[[@VghhxYa 2B:I&ڵ ce˖3gbBNNN&&&w?L&sРAF͗QjƍnnnBݻw---UUUFU__V++u9::=zt&&&&&&wm}PZfX XnݢE D=YO>Ν[bB?~baaaYYsaBG7oLƓBW\~:N=z… SSSfϞ䤪6aÆ?!tyKK޽{N2...***>>Ԇ?̙3k֬irG]VVڵk>|hll\UUFNNNNnnn)))IIIt:,r%EEE__M6}zbbF\\ǫSKTTŊ"Qp8?z3gLMM͛6vMZYm"""nݺf/\@y6lr>}J[BW^s玆Boy/Z| 8""&&&&徾gΜ!ӧOO>>c7m4EEŗ/_>yN4ڨ/?gΜC.Zݻw߿oy vM!뫢1vuuZ@VVˣ閖!AT㣮οV*_VTT\nݺujjj._tR]]]}|ڵ Ayzzl޼۷[nmsrr Fx< rTSS# )ѣGJ_UQQ1djҶmƍugg̘cǎ"2 j5555Ţrrr>|hiC5}̙C-]xڵ...999dK$/zpBapBVVZNNjwwwwPDD;y-vSL)((X~۷oG}v###ׯ_ڵ8..NJJ7cQѣB#m5())iР +++2(hΗ޽{SRRdddO>=d###333?|x;w4zID #22Ņd2?#GٳgTTTllȑ>}c3BhΜ9aaaᵵ\.7--B%##d2өD!)###66ZZZZEEFtaÆǏWVV68P55'.Y$77c\VVvUk1bĞ={0\.ւqo߾gh~ϟs\yy^zKc{{_~ښN9IIIFj4| )lQ_軦ˠfuuugϞ%?fuFƕ~-Krrr?^pBBB~QFCϟ}aܹӣGCN4" [[[y!w;#>|A}c 7f=zȨo߾K.mlٲ|r==;v O{;v000޾}S###333y溺:I=t萱u'#Fxxx9u,\;o?Λ7OKK %%ޞc{ibbϿQ֭[.]m6A7n/mNqjM"/ LLL-,,bcc['{K.x$~G}ǿZ$66ٙI:.AJJ*::z̘1 kGQvո糠333/_ܢVb_(~5]dum-%c Є ҳg^|W֯_KEEEoo+Wv֭JKKkaaaeee>\fMҠaÆ7@%%%|߾};;?Ǐ .ܵkWQQ B_keй,gff>!f߿?ud'N/O߿۷g̘mmmPtt׭Im7ofX &&&!'N\pKrrrN*--b R#++|3gDL!!!ׯoQb0EU27u;p႟ߛ7oh4ڼy6lr>}JZ`IHH`2AAA=W޹sGCC!d``7߼zZ ]Aˆ BՋ[ooo6522~:Bk֬8p )G1ʾ!eee))){{c޻wq7oޔ_jeN:EM]lɾAer7~+!뫢1vuu}1ƲW^^ND}ʕ+g7nKII!󯢕A [zdÇ:::T!Ç䭪*5IUUݻw~a߾}䵺:*:ZTTDKKK;]]]UzMR=pwwGEDDG !*++BAAAVVVL&'000;;{ -(( | %`==ÇSW^'oI\[[{Æ &Mj\'}۷CzꚚclvv6&Ifhj{FFF'Oxxx!ָ6١ "j4F۽{ٳgwܙ_VVr˗ݛs'N… wxϟ?'&&iJyy9kt^%222L&3==urrܿmm۷o?k֬&NLLܻwi0yݻweI}>o}YAy]]ٳgɯcnݺt55'.Y|)++zjMMMJTUUKJJ3['tz-31cƄ?{_~پ};uS4BhΜ96m;qDhh(|qI[lY|ގ;\khh9uԀ&MNN9gϞ8qN4 4hСC...jjjVVV7nhooo --V ~b:;;3f U(mi)(KHUm+l# Ht86Om+l# 'xVtJn/-&6 dx<lxL&S *ڶl;@u0HMM566n UmvNCԱ}=d0}2O9t˙# IDAT HJփ H$`@  H@$0   H$`@  {DҁH2OWh%Qڹs4BҁHXrr2Bɩ]p0ƒDM:$0 +Q^RԹ^IZZZ : FнCF5(),,444,//JB+5nX޾}ܹstW^r(kިQ>k$.|fjqb8q"BiƌmIZVV6==],-]F,U Ѧw^sss٤޽{@!h??;wt:!4dqh4uRWW'!h:./iii!{Æ SNm\Ù3guuuϟ_]]M\tIzt6nfaaaaaq=R^YYj*CCCuu'fggc?~{)2… G]WWrrr211ٽ{w=7nw˖-s899[ZZȑ#d˗/2DEEeСW^ޙ+..ޔD? _{ڨQ뱀f'[ѣ ,(((011111{nCJ7a-Y***޽{#ek׮x񢕕յk-Z4sL2)**JIIiMq-6}??7oh p8&#62e /^ܸqѣGt:=**bEEEg* :)((ܹss۶m۷o'3'$$Ǚ8gΜPiӦݼyRPX,qDD;)Ͷ,Nd ϛ7oÆ \.ӧd&W޹sGCC!d``7߼zZ ڗO>m7oO*,,v޽{l-qɓ'HIIM4iذaԤ_Uzw|}}UTT0Ʈ޽{Ǐ\~6---qƼ+/_~Iuuuf;[222cii退'ZbLN:5iҤctGG & _ 6\fE8Jla_Gɷ !͎Zࢇ ԗ===7nH^X,I999!.laa!<߿޶JJJ䅜B>t̙+WHc55'.Y$77c\VVv՚̣G_ JKK37o4;Թnݺw͘1CP 3\r.sYf Y} A.q-_Q򺺺gϒ6ݭ[7:.TZRRBY8(E%0H+l#s =8 6Im+l#sH |IYtEv4йud2y<F w "%%LH+5u`0RSS/x4!h.JͶϐBo߾@d0}2OWh%QڹNCO@  H@$0   H$`@k׾B@g2qD34(JEEEt~|XZ"p H@$0   H@JOOp8%%%m С)))1 }}flARRRzzz ԲBgkpٱXfgk0<-"Jꄛ  H$`@$WVVh/[F}lmۗ.]222ś4bĈ~Mę[ـ&($6&&FQ4hׯ_K:KyѢE_'_~ 1z .ܱch+W"n޼%pcݺu3gKUFFF?XjŋΪ4ݻ---?NO2gϞ+VrM=`yy޽{9rtUUUg˗/;::~1:/7)SGJJ$h/xuֱ=zL0Awj&hooROmobcci4ϭpw…o~ ī$`'N(@ZeҤItmNKKK,_?|иPFFի +** gX2i̙噙ߺukj뽼ΝpMLL̰l2ׯ_ {߾}}3y|d42ŋTPP055tRj?| //vYHi÷lBtuuK^y!իn۶mĈV'|*E0nr4gΜYft]<@^?~\__`x{{-\qUoFQҼoVRRx_P-QXXX 8##CFF?WVV>~cptuu.]Z^^^WWp!;;ӧOޤ)S899}𡦦fӦMrc{{{//QF'իW^c|b?~H"INN=uϟy9""BZZ: ӧO$#VUU_oX~BYjjjx<ׯIC 9~8xӦM}2e ѣGz"uEGGkjjR5ܽ{.y(++KvDzzzɹ5%%E^^\.755UGG'44c\__?f̘ٳgܰagڵ3fI"񸹹1[l6l4x`==|?=ݽyܸq/,,|^AAaڴi555ۡAX9{u>y!y&W'|*Eϰgd*E =z{n}}祥EI+WTm,(yp4mA 8''GFFeee:Ξ=I(|}>}`ɸ" ƳgF@ B%`CCCrj8s挮n\\)`ӦMkݻwz˖-7ozzzlIIIL"$l"$ϛ7oܸq/^nݺӧc---/\T__}Ǔ%&Ԁ Rgř3g0 .fffvvv^1S9F/@޶m5'srrBC)/_tttիԩS\B$!'9sL4z{ éSX,U^zȑ{" _|1PWW?wŋ"g&_وMz~ vcxbApp6 ޮ]|N Ϗ7mڴ9sĹ~+++5o޼< X^EPttt!%''f8qb+V ݡCOϰ͛7ݺu{=8$$wނzBE|}}Ik2߻wNSo?})›Fh#$\ >|8rm``uV={O$rrr222222211c~~&O>T%ӧZb fKKK7_ӧOS~~>J_7?qEocƌSZZZrrrll1clƔݻw6ƍf8pjiӦxbƍ-ZN^3|qh4Z޽[LԼjhh 4TVVE!zz"c/[VVO?߿ʕ6m5jTRRRJJJQQ1Bh˖-k֬>}7Ǐ޼ys `2T;,KFFVWW/**!oFtP Ο?_SSs޽ɓ' ijaݺ5ټ<4;l٠Ax<23?A{&w?͛W__3`f6&gXӷoÇ>}!tI???&d`0 W^jMٳg7/"%$~&߾}tzzz"H--ϟ?S/ yKII!={{jkkSkMqq1_bXxIrrΝ;B#F短eddƎ{6Nd[(-_DffeeQ G;weee! N^S< ikk!n0ۈ#rrr9gee5dȐݻwSKŋmrr2̌妤P***r=z .\4f̘EZ|AaÆݺukڵnnn 4hPee%yJ***7 !ruxxxppԩSIP{wB$BctR--mm6ԛ$h/;9={F322***Er\\ϝ>|8gΜf6&gXu}.h]##Po.]ؔw oW^X,ڜCo߾!7Ȑ˽+VS]]݃kԨuɓ'JKKݺu0\.wԩ!!CDGGe޽rV^mee1~왬ٳgkjjSJ17ns8==7~^~Dd2ɊJJJ A_tUXQQagg~zR>f̘^zٳc٫W/ j)j)%%EVV#4ݻwKzce*Hս|jjj9r9991s?lii)dPciiÇYf : <ɓԜ:88xxx;VPD]]]ttٳ ̙3񪫫5QfUUU111ݻwrtttrr*..~m߾}j&L rkkk۶m[>}a.Zvm`ccCFDDN7o^uuu~~٪Up͛79gϞM^vĉ с?н{[nqܨ(YYY!W\\e``q&ojÆ ۸qcuu55-h/:::eee666{[ۋ/"FIHT~>㊊=z8;; 0 Yuǫ2Ϟ=t ͛7s1.--kʧO/+y׮]+d@˗/--- 433 'o߾?~2-.&Yf~Ϟ=uttf͚EԾ|̘1?|`0c… &&& JJJcƌIMM%n>|x^ϟ'`qVVz^=2 :׭[C*LJ?"^xA6SZZzRw?.X@YYYQQ͛M/܄d'$$ٱX,&iiiyqQz~7qqqd0MJ9|!7nXh.((>}*͞1cFaa&m:8<4l0YYY]]cǎQyzzуb-[{JKKgfffnnsÇ3&&c\__gϞ 8lѢE}¨޽[CCCIIi…7n* :(04Mȧ 6mٳutt$`ﯠ0`rQԽ""y Q5k(++˻˫ݸqҲfffǏ6l c@TaCM={6IB=zvvv3gΜ9sԼZZZ}頍=X΁~ .HdRYY? ,[[M69::FFFǙZ888+v~)_zIf̘ammmffvС=cǎRٲ榬zE&LfG#ȍ7 .\X[[K&effzyy訪ۗM:u޲e*++ 6@G$ѣGǎlnn~QI!!!> ?~|aa!)\dIbbbTTΝ;o޼ɿW^^ޣGۓ'Oݻ5A Ir7o޴ݻẇ1riiiSN"SsssӧOc9fJJJ^^ގ;tzUUc~Ҟ={~zH3DDD"̙s*jٳUUUBF266r )1bBHCCc̙!!!usڴi'N@xSN͝;q IrEEEMN?~UO2gϞ/ɍ=ӧ7npܠ :>|=zDFF"ݻ+**~wϟϯ5 'Od0nnnc// .PCMMSMM-??_H9Ο??,,TWWO0A`9TTT޿@sssCCCcccS\\L&X,τ*++B999t:AgL@$8qcǎ͙3Ƞf3fL嚚 j4hQXX͛7gΜ)##Peq-Y$33cLv[n)++#tuuy<wdeeKImmmMM?z\t2b&_?WdddRR ONJJ?|pvv)EHH{ӧg͚ոy߿ƍT:o !ɓ'[YYyxxDEE߸q c\VV1 !OfM ...4mÆ uuu?tqqٺukEEˣIx`]Guuu2dGqQ<,Xf6}ȑk׮lIfΜuVgghԩCׯ(4-"%%uҥӧo޼hРAxڵ666zzzBV18p͛壢233-,,455'NJ-e#jccce֬o={vkז;vLLL6l0sLHénJll3vBJJ*:::ƳCCC9Δ)SR[GSv'%4YI۝>,###0:\>p+؈ ^b9B0   H$`@  H@$0 CC<+]lIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-advance-filter-02.png000066400000000000000000001072731477354127100305410ustar00rootroot00000000000000PNG  IHDR~zsBITOtEXtSoftwaregnome-screenshot> IDATxwX8I@ (қ4 "Ġ"E@AĆ QPBSQޡXN9= "v+"E99騀(E$>@Eby 3}fI>}B\d^7Ax0 ` <@xLEEEMMMuuu_5 III111uuu^7oAH$cci7(77!4b^7!覦9"y ?9:0~*p4*3mfO_ro砽?|g3`gsƍիW?3X[[oܸ%up* 6eN":66>zwss3]^^^IIiŊ?)ݕ@mڵnnn^^^f0 ` MXYYYV:ujbb"Nɓ ={V\\~^e W^ξvڶm`^+Y&{esرٳg[[[ٳgPdd/uV"68z(s->U VVVRyy9s_@p{ aX1bĈt"e8q"`t:. P__/&&RѬY"""gΜɹaaav,QlVVVF"8gzk oWPP aϣP]]M[]]gQQQQTTaaaZJ`͛7̟`_>}tee%Bӧ7oNNN6mjlld0*/:s oo/[t4bz˖-NNN'O!o޼YTT'--rY/憹effΙ3'""h4ZCCCggW}?|֭iӦ1~Gq֯__WWMf ׯ_ ݿʔ)_y~[ݢ!&/0 }qz,8ץ>}$!!A&! 0H?EرcGog)//wuutRMM D k^VVTWWc3_~ x ͛wĉ2,""("&&sAuvv~wĈMMM?A cHƏ?B---$iȐ!"""Æ 7n\tt4kJ%>*passm۶~zÆ  B&W(4m6--oWu?BD_ٽ{ȑ#߽{zztz{{;NOKKSUU%􊋋 »@把ԩS>믿޹sGJJO@@@^^^JJ 0^E܄9l0===>>'Odggkhh czFݻâ˗9>>^YYSXXXTTTHH/ނу;;;`,_\PPѣ߿hn`NtzNND3fl]]ݒ%K|8~D"%%%߿>|8 o1n!3]AAAeeeIII2,$$$ w}Ĉ/_DݻwVUUuĈ޽ÙgϞjbb(!!QSSb0G533SVVR7_UU̫߉D JJJJHHP(g %%%ǏBo߾ɓ'իW ._ nܸqY#G{yyUTT jjj>Fߚ` ݻB BdȐ![l:t/|966vݺud2ʕ+!##O>)++k)͛7ڵkΜ9MMM...6m+,,zykk+B˗/޽P(Ҹ%%%۷ݻg]]Y<Jqq1oCCC]]~'۟>}zhВ%KԲs! \kkkmm-.2cJJJ˗7uٴ4|"v#F"\CСCB:::C8p.DYY|ƍ---?~ܱcQҥK>}Ji4ZvvvII B۷oqO{(MMM*~Y zҘ1c׬Y޻wiLLLr?|3eʔiӦ!<- Xb~LLLGGB_cې߿?{lh1?Es|tuu-[v1U[[f͚z!!!{{vlې d ___YYYgINN>|[0vX555Fccc--3f222Lҷ|yjjj&M?22LJ=y7E`Y_s=}41e}܁vZǺ: 00JwtƲh4ћ7o ,뫷o0}ڵܾ}{ԨQe޼yϟ?JMJJJž*[[ǏsСC̻W.5'OfddHHH'B=b߿ĿIII EEEoڸqcozļ7oLle(**jii!SBϟwuuUkuT}H􌓓B˗/!!!f*//G=z‚\YY)))S[KKKGG'((/]ssğikkkjjRUUŋ[n5663gB744앬]v+JR|#$VxK.߿ydMٓ'OlllwvvVUU=z]W޽{'Lgݺu3g33gjjj*++>z􈽨>lT*555mmmC'.4p?֭[\.55c7o.YDKK &566aYkɓFFF***/nii!&Mt!n{B.]TRR"[l777 h^2U!111CCô4n2S onbb2w\>>ӧOoriiihh3gʞ={,Xp9b?~ۛD"nٲؙ^z|r̙+VxMRR/^믿@jiit>Eeee]paͅ?~L~~ǵ}||_}hK.y{{5ŋ3g}QCC,11ϛWW.!{[?CCC3f<}?}ZKKf^^^NNNii)Om?xڵk>TSSۼy3Bh֭ṹ'ODرȑ#_|quu577.--O={ Xyyy=^n+>}znnʕ+g a 3gΜ5kViio 1.{VO>իWɉ'zAJJJff&q@j:w1,I":;;ΝWTT8gHЫ5*//sĉ8fffjjjsY`0߿ceekںuknn9\]~m3ܿ())qppHNN&&ݹs'00&&&ӦM;~8(Zlٲ7.^ÇxJQQѴbyj䰗e̸EoGpJJʄ >}tϟoٲex*~ER^^^CCИ1cB222h͛7=kBVUU7Z[[#OǧtREzyyݹs]|YRRodݽ!4a555mmgϞut\SS={|O577/[L[[;>>~ĉϟ??w{ϟI:q℻P}qƸqDEEkjj.]-### \YY/**7zqi|zuƍ*!!^r!CB].D255ݹsgAAΝ;'Olkk{]݂'9P(|||x{T__O-;[)6!ڵk|||#&K[&$$DP/ïXW^F**$$7lOOOիOsIry'==?8xe.]}}}~?7440 [ݻ֬Y#''wƍ EEEves)wwwKKK2|B:uj||ׯ͛\===qWέ:u'O?e'''NI˗/KwZ=V͎ݻb===---1@EEcǎ>}zԨQ'O&ϟ&'N|80tPQQQ|5d4%11REE!ܼn:SSS]]]zM˛m߾= `ƌgΜYf͉'n߾8Oׯ_ߔ#HO>w nCKJJYέb.YMM؄(Bh>|`ͳo5v.,,?̙3jfM/a-Ydܹϟ 533sss:u*tppppphkkKJJ;wnaa֭[_~}阘SGG'>>`<~]WWի !_qӧO9t?$$͍ea/3^pgffg♙ϟmmm>}΀۸} FGGGDDxzz8qDGGа>}6J9%%) vڵ[n ĈKIIxӧOL8i$|N6P455ӹl``Vڝ7!yyy&5*νĹU w~ii) jII&AAA5"<==cbb޽{Dmcǎׯ__vMJJ !ho72 tnjs77//穏=⦢. hkkz>|}|}}]]]T*-}"V4B͛7/^p§O\]][|XZZʼ 5553b)))6ԈK/YJ:thС]n]fWPP7/},((_|9cƌϏ92!!!T\\|& --M"ŋlmmBIII$IZZÇ8Bh…gϞ|r[[[GGGAAlkeeePP5qk #++GǏzzz""".]^z5諠@\EijjnذѣGxxȨuFмyRRR9B fvهIYYiӦWVV"q!dG\\˗Ȧ&QUU EEEĿ͛7͛ի8{{{.ovvvP***?MSN02a+MO>1sKZeoo瘘˜ooobݻwԴf_#BH]]}ر?~tqqJJJ88q>l\ Ϛ5k߾}8`鹻߽{9<(ꏩSfddp %%щ&n-ٳ4//y<ֶrΝmVyzz^xݻnb>Ahw޽c@jD쥻|Y- nfٳ.뷠EDD~_n߾d2 ,ptt "bϹs&NlnnN9sf۶mWf0uaÆ$%%YhBYbEEEB122QFyxxvttǛ?~fÇ.#|;7I{G7[uهčiw\[[+!!aiiIoihh NII;v/_<<<8o~~~ǏOII]hQ ;v***8i&cM0AXX833Jrɾr&$..aÆ;wO[%..~…н{zxx0 5uԚ %F+V,X@PP]L%p•+W^xQUU5i$EEŗ/_۷oݺu8OeehZZZfffqq;XNHH9rHiiippWEEBǧp˖-$ !ٳ'Oy1|ĉLjkkBVVVs ?pyIIId[[[ !n:YYYiiigggŋ III<˗/shBllud+WB ܸq8\$`q{ xƌĿ7CCCbCΜ9S[[GUUUb, $$$//O '1>Ç|||D沲۷ݻg]]]ЩSvmmm-..j*.d`x1 __ɓ';vl{^rE[[!4o<ѫ6555 ( )))̨`0?~kkk۫tgg'Igg'BhϞ= aaax ^LLL]]!֭>4+,,F{n,S.]S:NѲKJJ:::I$4???>iΎC3G=z7&&FCC#::ƍfffAAA ,{kFFƔ)Sz&yyy ##iӦdXhBYbEEEB122B;w.,,]\\oĉ!|vf_ӧOnvZm )JGon0 ` <@x0 ` <@x8<<|}}ڵiMbbbg777pB"22LJl7ѣndddL2׭VFF6[s$$$jjj 4͛7PO?~Rkk+w^^^y. `S(v[n?~s:NԔdީ={XVVݕ3j(yydzg_vmҤI ;'IӝuttYTKKKcc#{zXX'K}Μ9sҥϟ3yXbӦMEEEuuuFEE_~*̦&.//O rӧOmmm\fpqq9y$KzSS̙3 wܹvڌ >>Dgl߾}񎎎rooo---/_ |||֭[G~}}}e666!!!&M8qbNNooEYXX1~aɒ%˖-#{YYYZZZ+Wn1--stvv9;;s۷oGDDHKKkii^85js2~|%$$@]]}֬YGZXXUVVJJJ.>PUU511IOOܟ}]W# R X)---,,ܲe ޡ,_x`ʔ)gΜ)++{왻;BE^^ѣGo޼ٲe ???1!!aÆ %%%3g\d C%$$9r488˫!}wu ]6J#J+PFFƄ gߺu~xxxnn.>'l?#Gإ:t('''00#Gܹsɓk֬coj*++EEE233wALw^zzz^^q~-ZyA]]ŋtqqs玊JppQ6lyKȈX;D޿2dW\,Y!??ׯ_ߺu3441cFIIӧO,O633SSSm]E |2--=6!T]] uu56jԨ%%eϞ=$iĈVhff6{lAAA*3P\\ӝ.]cS---d)Q7ƍ'**!!1c _3 ϟobb"((xo/pllud+WBk֬QTTP(7o&Tv]6Ҳ(;;ݻ999T*Cr.Ϣ}A988222˖-4i6g~~~N"&_8HKK P(ZZZ]^f޽{ޚ5knܸﯨ}ÚBDNljj2YGG۬Y$$$f̘37`pRT}}s9eee=<yϟ?/[z2c87ҥK222NNNxq8ׅUTTdeeEFF III_r( ,-- / ^TTӧOX[Nڽ{Uq`|#,,gPYYY^^_[[[Bo߾e>STWW'>ϊǎ?W^=rȠ {{r555>>> !h݋'}YWW!;" u ]6CXXx̘1eeeT*UCC#11Q__Сā|@sORRX!daac\nRQQ!vjjjo߾eVTT' ==^]y׌pK:QnݺU\\|5rܹ{H$SYg ÇgL\#&jkk/ Nhll_O:5}DKKKRM[;$()+_EEEOO(==a.'y4551 ܓH}}q}}}!!!''!C|AKKU£\Byyy-X **ǵӦM㰤Յ}ByBTTd2}Nw]566_eN||_kkk0nn RRR#(fmm=lذk׮ݺu۝[[[pUWWwWΝ;޿?nܸ.~$ 8@!莎zdeeNXYY`0޼yx…gϞ|2?!gc󼼼wڲ;wh4iii@"Û:::=z̡K.z)Nhٸ$ ]62peeѣ544Y.c5v [o M ,,F{n39&&0&&ۻ˜RRR>>>ׯ_щryi4ݚF7.\_nhhظqqϿui4>puue)s„ t:LJw555---xy*Sfff2MxԩSt:ÇOZ[[###`UUqرc?~¹O>ٙPVV!uhhhCCC}}}XX {ڻwǏ/]]e0JikkhMggg2k׮;w\re!eeI&m޼Ǐ111u &lܸ縸<~аǩYӦMD}BL&{xx]|su)))YZZqn@]vRZZ:Cu5Bٳgـ]>wʴis59r7sG3g9rDGGGSS_{ wwwwrr?իWN?n߾][[[MMm۶mǎrJIIш#6mEXBUUU__?&& եRnnn~f ƌC",--1&Jmjjzz*Y>|[Z>,\p۶m aaa vI^^^CCjر!!! ..~…[niii͘1c֬Y=z+((gff޸qˁӀ997jϘ1qȑN755ݿHHKΞ=K$%%SRRrss̬wTQQy*KQ&L$R\\\xOXXX!,,RRR2vX777| 7u֭3fp°0UUՄ3g8nGPLMMMMMEEEU ݻw͛K. 999<=c 99K.!DDDo߾jժ]vߗXaaa}}ɓ'P;vLAAaĉǏwvv߳gϼyܹTܬG쬨8~ׯȞ999tǺ_|9awwwWιs>#>{ĉUUU9/3wzN褦rxVzzڵk|40ضmۍ7Buuu kccxbwis f]E,,,𓇼nkO>A?*~x`nn.[^$1)"",]^L<%ɩˋ`u1?T6őo: |׾߂G ` <@x0 ` <@x`pdd@ƽ  ^^^,$00WڵKFFϕчyoܸARmmmܹCLJJJ233Սs x ND&tҥK/^hvRWWwww^gd>dnJuu}3Wzzz >3A{{{/Z",, !%%%;;hSSӁZ^LCC@JJJZZZCCΜ9S@@@WWw„ [5ڀw^zz:BAܹݻRRR[lz'O^x!+++..~͑#G/jjj>+!!ׯ_r!0s 6fW\Yv-{arr2{zuuuKKKSS1cB&MRUU={_~gϞZ8 G_PbbMB7n>>ᑑ_ BoZ IDAT?0D">6VWWw7@+//|O5oܸ?_xQ+=NӋBϟ?;v,J2dȈ#f͚uƍ/`۶Vn ymxxx}}=:88uvv}ct:_{{9r}ޣG>~<88!dff{sg0p``'L/&&ӿ|r*n >p@cc#'''o]]ݒ%Ktttlllߤ$]]]дiBCCW^`kk;jԨ;wrr?<7w6 ,ssk׺ r/_z ߂x0<<@x0 ` <@x0 ` u֮]8Ms_1|||v풑Un:~x'''-[XZZɍ9200߸qJ*+++**޹s/g`:x"h4ڮ]Ν;7|GH$ŋxuu0OOO>DEE%&&޿͚5D}>}ӳ˗/V277`2gϞ[ZZڵkWgee٩jhh|gggUUѣGڵ!n``y溺:///yyq=~h"EEő#G^p!//F^^~鵵8ۇ,Ylٲ?"%$$O[[[SSS<==]__˖-AAA4 As̅ zŋfBO>իWɉ߽{WYY{ڵXwww__bGGǀثWGFFǿz~y-Z?uꔻ%B-!!r:;;q{+ǎ̼y&"--U__yIII2勿ÇP fd%KBC522~cDz$VUUH$۷ogiii~BBB0hnnXVVhBag\DRQQ!8IJJtAAA;Dp>|Z[[ o߾0a/>`G؝3p/..~r ^jL&EDDL2d`OogQVV~ KByy91EAA`TTT(++*pbo˩kjjAKIIQ(|! &68~8=fRttt|||JJfwytzqq1BݻgΜA577#F<{ //^ŋ[r9;;avvvvΝsqq|䉕}hhhLLbbb٘uhh FXXBssso ۹sOv2c~~~ yyywޝ3g{!gϞeķ ;;;;;;t:F#4="""99ŋJJJ4D"Q(ѣG544:T[[kmmz*QiTTTUU1l0;apaa ǎcO޶m[`` BCC+**~ 655e0T*u۶m}(D^^^CCȨmڴi!!!,%%%iv=>4ܫN>?ijj>|Fݻ!4n8<Ç%K}VXXXWW7))IWWR!!!|EHOO_vy)JMX?ɓ'$:99'?9x ` <@x0 {)LRt&E*JVKw$D.E/mٵB(Q6BYJ4}IUـnCоCMLLTSS˻qF{,H?*((H).ZeСv+k^ÇYYY ,UPP011Yx1B(##b0666+W߿?Ͷ(((XxmlllllByyyg611155]zOBUUUL&ԩSÆ ͛FECeeeSSSG BG1b5AAzvv6B(99dXKK˟~:88|'NHٽ{7B())iǎ5Wjii^fee[KKɩ)߹sgȐ!jjj...dիWL4/-,,8pիWI\Dxuuudq&&&aÆddtv1Ɠ'Oޱcxͳf"\]]wXozyy1L++۷o%ӲM#Ǥ+۰a'ٽP-p-[[[---mmѣGx|N?^UU5 `ƍGE-X$&&2PwtMM͌Yf5Xt祦1,"卽6{xx;w˯3fHNNMHH</))iݺu%::ZMM-::G4CN >x͊tR||.B/|9 @>o߾#F8pMvǤItIPPh%% "ÅSSSk+_~Iyy1W^rt:}JJJ 7l```Cqaaŋbdee7lؐ+**_u0ӳ:rӧOkkk555MMM1NNN7o'$$L>]UUٳgߧVVVJ5x >s:T^^~…o޼ym\R-4M~LZ@P@@&Ãjyy'??N"۬E2HP4jHHHHHHmm .]fڵk)**ڴiׯl"sss F|99 &劊䀔PRRD?C &mݺu[[3gn߾Çd0977ӧԢkkk c555렠ݻ6T'OܿҥK֮]kddDִ===W^!'勊z7|BEEEyyyǒ >uԢuֽ~zԨQ۶m355˗/o޼cǎ*GGGqGƒį"ӚMNr@DDDhh_jUc<~Z=`yyy??]v8qbȐ! B,Ydɒ%E߿AUUUqwww5W^qqqފdl6{׮]ݢuuuNݻwvv6YЛKbbb"//` yzzHRi4ZpppppǏ7nܸ`DaÆ]p!33sȐ!%%%铯o!͊4"2HEc00`%Y!HwO8Qʊu!R񔔔 թÇrȟ~ cra$'~IIIO|8z12W^fHi ooP^__N~bуN7Y+*--%['jjjLLLo=L522:thAA)SHIQQт w^3 fhh=tP6=y/_J۷o333 ͛#\uuu#raCLMMt&q˗/744ܾ};B(%%رcb>{۷o766600ضm\eaaf7mT__vkkkQW9rŋ#G5j X셅766NMMݷo)wrrp8NNN^zkii ye˖Koݺٖۤ w{&ΝXd3n|6`nngcc8ƿtR>OgpСw>|,Y|dddbbbƎ P*e^@[ :++… @n%Ղ[q}6p`!h)5-_|qڵ` I1v@dtᑗ'Xn'-ۂb5%1p3#Isw !h;#h.Hd|.0.>d24{#iD&۫v$`0OOO'7ĀfP7Hd{5{j!A_noL&`ۗ}jdfeemҸWvv׮]zulll>}ڤ15;'$$xyy 4(999--mѢE!!!}]Co}%۰B Fn;=W_M>}ӦM䩯/N_p]zzzEExvvv!c8[##ovԨQM6˧988˖-///Y|̙3B'N$Ι3gϟ?_nݳgTUUV\٣G*}}m۶;w,&&&33^fuiJLLLNN^~}Qw.1bzj!aĈO>}-BhĐlfjj/##SUU7\| >|l6T ;v#~7GGV ][pFFFVV־} }||,Yr@Е+WX,VRRҴiRRR4559믿8qb7nܘ9s;w B111/_1bfӦMjjj~~~֑:::&&M :|nnideeWXAj믿bccB.\8y 8%%%,,lݺuj0QQQ^^^YU27~::sL``Wh4ڼy֯_r*tR}}yMM"ׯ}yN>9K:|AAA۷o1ϯINNӔr?GLfFFyZYYgϞׯ_ٳg"NNN޵kWc`3))iΝm2*R~ [ooP^__N~bуNkkkO4i䈧ҥK•hii{V>N5cFFF>z_ݶmuQ4Bhܹ7n444p@{/R[=V/SIB3gl=vmRҥKۤ*1ڵvemm&qۧO6oЮZ2wߑt:!4dȐ x4K;(Z2M%++;ӧ[ZZM6-//O'OZ[[WWWSaaaϟol :@vvv6l}6)\zΤIrrr0ƅl6d1c׻"\]]w)u~mڴfٲecg[[[sso:99>g֭۶m#3'&&޼yS^^^0sFDD8;;M>ڵk58**Jˋo&[/j[~}@@}yf'ҥK񺺺!cc/Z*tj-8q_׮]?s׮],KNNnݺuޖ2eɓ FM[p( @SSc͛o^xqϞ=,KVVvÆ c+V._ѣ:::T=Mv䂃1ƲTO!b 99U?~|ƍ...'NFu+###Lfc3tVj4 `u_b I+5u!!^~]QQщnsL&`W<ݡ$i:S H@0 ) H$`@ RЕL4I MߊRUU&i,I-h8 H$`@ R H@!!ƽxレԆi c~lM߈co܋>9]0nF!y'*-c.~{/}9Q]BEtM*k0:M~UTAK˓䤭Da0 ]Fv]I0 풀+++i4ZNNN^^RRB [+W [ϛ"9pV6`-(!66VQ4YIk%K,\Đjnn^WWy=ࠠ۷K;VYrBڵkQm&U {Fuऔ[[[##ÇS%%%SNիƊ+\Ț322 psqqi?=6l`ee%''7zhr>b&N(x޷o_!Cܽ{WdL&SUUIRwءdeeX%Ds۟h-NdZZZ0`-R'H˗/O4Iځɓ  (>z}}W;B999K.5(psssrrz/dj5k֬򬬬-[\ܲe455^|լv=|IW!P}}}o1!ӷom۶4(߱cɓ'rrr0SN%wܙ;wnhhhqqĉJJJݻwݻw_xݻut<ظqs***=*y{s|};w/RQG21{Ӈ`Xe˖ɓ'kii1 {{2:y򤅅S^^rl6[MM=;;{KUU_~GE{LsN~0uuu .$ bǏ'3$$$1BUUUCC/GEE]OO`̝;̜bttt-ZTYYIݻ7x`ee#F|wǍuuuUWWWUU0`@jjdddrss1Ƥ7vA1UUUs~:::t:8!!Adb0!!a˖-QU޶mې!C\xeeϟc?}daan: ~sssxqzzz=OƸo߾訨޽{[~-b駟lll {ٳʖϟYСCo6ڵkKl]W^!ț„ ݻW­[9%%%ٳ$|coݺE>$Qq\===V;wٳE.H̦lÇ1 ?? 7\;abӧO#jA@XfQ#Mf$L99/^`+++ݻ1p8l6{ҥ眝srr>~Gš:uwjkk7nhaar1NNN߿'cV櫯ꫯ0ƇƸD"//񚚚*/ cff&&pݺuUUU..._~%ƸLMMr?gϞX[[_|I2d!nܸ_~SN߽{WEE$G&2~1 sN6-UTTB&T1޲eYeeܹsGE6DD?xQQQʤhggsN2۷8Ew17nܚ5kjjjȜ{d\"'',\sMMͥK|}}:D>b4Hd8))*QQQ [YYmݺ*0a+>BhӦM"WQQ5~O>Lpjj \nZZZ޽#""0֭ TUU)++7v*fSퟘt-wiYYYIDqww~555=z(v>ɝ8qZLxxwS{]to߾c2Ezy<xڈݼyS0ɓ'lvBBBmm-O>GEEٓ.[l޼yӧOR=|%;F"$6o,&ϛ7oO>㐐3f`mmmϜ9mFu6EXիW/*+W_e1?~Ţ4&͛7SOo>U`ӧcxzzzٳg...***ӦMx"'NsΝ}/ VQdtj VWWTwذam HqwΝ >|89166np&իya@WWWSSSSSSsssyy‚===2߾}J***lmmB3f^zWZZ Dx,KVVV8ߛkƌrrr?~,((\ca?]p!9;vlBBǏӽSRRƎ+U_dN}gϞW!$##dɒ'Ơ7OGG ίSPP@ScccXFF 6<--MWWR^^Y!***d:UTTH9Iao޼y͚53f̸z_~yẺk׮ <ɩLfEEEB F޼y3?~\ZZɹ~UUչsΝ+䨅 /OmhiiieesIޜi6rA{챳 yfBB¼yx<^llB111_ =qvvv.))uV߾}E_BpvvիWͱw^Y7|'N =(mzB EQSSB1[QQ!U5" &ܸqÇ)//744f#n޼_EEE555F^ti„ 222!UV=z@GG\ahhk g_zURR`0*Pjjjw̼~JJw}9rdEE/2b99q]|Nd](͊[ePIIɢE.\/ 1cvC !srr 3r܃ 2dΝY]4hРOx<4%%eРAR>}RRRB 6k׮ir ++YJJJE6UPP@WQQуN;vrԨQvZf`$yljsdggS;v,;;;))_7 ?wgϪ2n8iLkkkڅCЯ_%tDFFɑӽ+Vc}};wsPP)S<<|8w+stt siӦ C^{֭.[__W_a=z$//^[[+xXD x 144ܰaǏ|~^^˗I$L&,Di GGu֑cǪ+WRRSSKJJH4[o.UsW绺aĄt'555߿r7%%%r.mժUuaoٲ^ݲe a111sa0fWWW6x?X*66gϞ93WWגׯ_OT[n۷/SrkJ2{{{j0lP[[wUUU͞={Сdrcοk߾}}t֭IDAT 2)>>^UUNE͛W]]]PP0hРիWc79Ȟ={^~FGG_5͟??!!uuuիWvppĿ޽{y{{ۓdyyO>7֭[ׯ_'OϞ=5jX[[{۶m$/_2L FASRRnٳgTTTT())7NL;T߼ySSSѣxUVz<¯Ӽ111:!6瀟={fkk`0LA"##ɒ^~=a PU"YfQ^z={lr۷cǎ%_N]~~>>gΜ177WVVVWW;vlZZ)~UTT444ȕe#qvvVc|ΝCٹ}7bpHHH޽7Aka~Ι3z ,PUUv4۶m߿? 绹Q'l_h:%&mܸf=Ǎ5o2{lӧɤ6L^^fK}||Ԗ-[&.O? 8bРA .r劆Ʒ~Ν;GeA8`bb`0ƏOAPPQQtww%5PFFZB$NعszPP"IL>}z$ KJJhRN!xk֬PTTɓFFF666"7:ի 4hЄ bcc NHKK8qbFdddDI'&&:::1L[[[rJ̙3G'M/0`Yf͚WAƛwԩM H=[.ŬlbR{믿Μ9 2dȒ%K pppظqKeervvvkn&+W,YF}-ٳiӦ=}\4@0|!-d{Kʕ+-$"==]Qt_:O2EK/,,$W_ 知"Yb[R B \Kg69sBߖ?*j.k>3ɬ9%Jh[p} ) H$`@ R ѽƽxYAfPc/E_pJKK?sT-`06א~{QCN<Mg(,cޠ<##FH%KIIAK;m?>҅e]Xrnyjmm ?C]I AVQKW[wvDc$9` %F56ӭ G1$- I07EuN=H.!>ވݻtiR}}˗/vI/O;TVv,LtӪXVVV C__-::MmtA%KcGL̜=aI6&M?#99nnn9]d=`GmoLG>}J;9د_fgGQ#$E79}cG ]zvݰT=yyY([2驡qYw&NbFu]W1,((LݻSYY8''gڴi˖-_DLz=1[:v0UuoLܼu߿'b-yb;~=1=ejA~{wI='G:fJLc#&]vmĈ}i0\.7 ===//cڴiUUUdj^^_Ç8qcp\]]RSSoNӫ\\\ѣuAn-/z_Tt-&olsΟ )$3gjhjbG:75adk7bc-mm3NSΝ%,5'KK7|>oxévs$1a[*++WZemmmbbbffpJJJ$555kB \###:.XInnnqqտ***Z+άnā1?p-\ncGfAaJL<++SGWZoe?^<wct4~ŋgeeGp~}/_^~]CC!fHz{dd(@OO risn&y%Fb;u“)O؈ӧRRsGE׋Nx={3~PϚp`k3f͖tc#fwʔ)vvvW^cȝE4mݫtwwݲeKEEϧ$>0HŴ9aGǹZYhjȟèvǏ%cN-6=rT&*^rko3vpB876}HLȜ?~ƌ6m2551k׮ʲwqq)**244P+W,,,lMlll&M&ZQӿ<|˥['-:/q΁_̛:ݯAo6~&kp>d٪SMpt.ݠ<..͍ߺdddbbbƎ+@ I1c$\ UyBe%s$Ðp g5$`odwEVVN0 Ե(y-亯,t * ɗoc H0tdM'`kϧhsp|k$&i4Z'KFF3Li4t%NC3,< Z Od0iiifff'|~zz:v L_CB IDATxw\S7𓀀 % .p @A*jUuIUZUUW-VPPѺZQ.dH@BP"|9{ɹ&rss />h@p 0@p 0PVdDX]׵ituuFWoA'&&x}{Ɏ_ޱcGYYY&L0777774iɓ' jjj 镔T:$jt{ʕ^z:::nݺ:0`@n/>}j_x144ڵk2cǎ%''7o|ٲet}#G !ƍקoooq0ԛOLݻw޽ !ӧO7nܵk"SSSEbؼ3<<<.]dbbұcG// ޼yot֭߿?}\^^@>x}tܼӍgff~J#Ԉ(rĉSL)//y"Ԕa4HDIII!Йv222D[lttttBĄ>.++c7gnnnaayJ_[TRRcOOOt|)ݻw9r$==(>>~׮];wxLc333ww༼`OOO:u***:p@^hoڴ>V/ѣ'N(...--nܸ!!СCw-++۵kWjjAP)ʪ={411󳴴ܷoLLٳGUUYKK_~5k֭[f͚mۖX,*+VӶm۰;vXZZΘ1#''&Od33ݻwH_?ਨ(oooDR?={ ;v"+gӧkMGm^(k5& 'k|Z\W&=VPS~PG`P(Hx<^#KA|>_"B+J,?~4/D"\W꿆DIHHWdG( +B K_Z` 8Pz@c'꿆]{h]"@0@p 0kHnݪz4&]tBLݻwmT=}ΎZ:t:4|ծSPh0L]#xzѣG={t; 0bĈ{YZZ.>>޽{III/fIׯ_zeYn]۶mWZѣG~\e7hРѣGxbӦM۷oՈNKW111.]711Z@H*t LM$B޼y#?#]]]BHppm> 5`ÇO~ƍ fggggg_M>BHyy) 43fΝ;ϱcҕW^/H222Ξ=+e^2dBBB9;==… ߿|5`L>B00򋞞H$6lXzzs颭[v̙3iӦѣGwigggcc3s\aFݩS'HUjB={I9x ?z7ntܙQWWHNNر?bY"##E"IPm }ڵ}2eʰa=E֬QfS|d+/77Wnݪr?}UV\WNE3-}ЀzSNF7p#`e(B.))z|%%҆YNB_u=>ګWTN f(["jMX@p 0@pS|w}] ;iM w)/:@VLΏkٲP( 4@\.//5jcqqqo㥦~߾}>O:eaaO?v옽G?Rݻw\EEEq]*ըmX?-Yo߾Do߾~(###kQC߿6lٲŋÆQVV}tojEEE<'b۶.,]}***z/H 444,yСC666jjj;vy&ٶm[''۷W 6ihhoߞ}Ktʕ+ǎ _֭« !]vUSSڽ{7;۷ÇoѢܹs+WW5ILL4446m>Bmmm*}E}uJJJ[l'(Ƕ/!W^^jժ͛/X޶^w9y򤟟$C qrr{}{2WQQ:t'dOIIxbRR?SU}rDR+mJg 0a 6'M?Vܹlٲ{jkk+TLg۷oɊ!JKK&NSrrr?P͛qƌQQQtѸq򒓓^rJ:uGtCg'O|}}eO7o^|xb%%*?ߊ괿x<ތ3jT':Νc>VTT0^#GBdVt?@ 000={64dCCC@Э[\XL9x`6m=<| \tgٳ3f̠\\\-Zԯ_?'''''˗/d펎ZZZ Ô{zzu8Aϑ[[[[FDD/^[nNNNӧO8Ezz:m[K[[rʕ[cǎԔD-rww#6nH?{#a ĶO?D'߿߬YV,ի͛7ϯtJcǎY[[AAA5jT.]ZnuV:/+Vh׮].]*#GΘ1-_577Ӥ̙3O>:uر+W:=u3gμpႡ!]TZZbaaAG6ԱcǴ'Mt…jl߻w.o3fذaUBbcc;wZtݻҥKիwHU[n}ׯ֭["{xx>|C/>>^YY}efݕnc{||<0%%%s766 urr:rHŢ.\@Ν6^# ޼ySVVмyW^ɬTTT[n1 #E"ѬYJKK]&陚ݻ32|p///_/[M6(9rdAA7o>vY` ٽ{w6mrrryIll꯿ZTTTXXHf͚͜9ݻwIII"&baaŋ W_1 ?ݿDN'N,..H$O<ر#ݹ-[֪UÇ3 sM---/!qYSSSJ/r1CCC555>~zE8>>^M"77tqq{[֭[---߿_^^I^266޽{w||&i伢B}.\m__ߢ"&۶999zzzV***zڵk+-\":;;oذ~~LӳW^ehii:taۯ^?hР)S{X~~~a~޿_ӥd:kɒ%dPPϿv0gΜam5kժ:L"##uttf\bEU5qqqDt?x񢦦ׯibbbjj*kk%'$$^h֬Y7oޔ&9sݛܸq#*++)bcc !t~DnbÆ 1+}6!dY\\ݻG'~C!!!;w\\\,,,222dU+;*r劆X,tUk78::͚5KYYY7oaeBCC巆"J3 CG_}U/SKr\vCLMMe>]}{:qℍ 0/_$r@p=z?]tI:mmm[E"ŋmM2eԨQ2Uh޼9;={ɓ9r䈅ݻw555ٷo!"''Oܯ_J=z40]vtuuCCCPU\ij@9>|ŋ7oN>2 ֭[ϙ3GNvb']\\أ:??8;;;ha˚˖-RٳgpDqݿH$bXU̜VZ39u` !qqqsssZ+++z?~ȑ#Ν;K$UZZ4z={{a888H$Ke鬯jرdPPXhƾiVulg&55UII)99sqq a'tBAAA'Ԕ=UG-]jӦMUVq4iҐ!C={::::d6~9s mƇӣ04={nzܹ˶o>qDr^~-}Pvaa!ǣyUz;wttt3'N8a„cM:-,, Ԉ"\O׀Ǐ}/^&off֥K)55ںҫF-Z;=eooooo訪ի 555SSS [ǏvJ=z̙3ϟcZ[[ۊ[700h֬Y y_GVQQy]FFFW:88tӦM>}\xݻwFFFQQQ}ߪUտCMMظK.}---RU۪!1ϧoiiٮ]ۿ|2))IΚ2#---zOkREBBBB.\8zӧOWw.))9w !dͮ'Ntŋ'O\^^ٺukry<^U.*mê#G޾}0,,lҤIrDαFeffo͛7711@ X---ʴhBNejQ=0ߴi!d޼yַ2hР .L2eСyyy nK$B.]__0`YQQ{s 'N4hϧ1((޽{ /Zlnٳgo߾fff (M6%%%ݾ};66vڵݻnnn***}=y7*0}-_ |!33SjiiiݻwׯO?T}\ZgD"ѷ~˶mFF{~߽{ΑideeG]ֹe˖LNNv32293 IDAT0a™3gjt3 ޽{t2)))??]vvڱyOCRRRdJ{Ҿ}ڶm۳gύ7.\ڥ2d:bIyȶt{VuB&Lp…_ڛٖ4333"HRSS[lYq?s;vzŏ?(2ڵkr:]YYY\\;___MGU;B544!;w>E|||ڶm,TOOŋ<<\EE^mٲܹs߽{WZZzu0{Y,ӰaH䄅 Ô1{ cǎgϞϽ|rlllYYYii \]]wCK_Yt)= (-,,.];D'OҚBl[[[9;F/^LGKK9uꔖ ,4i\\۷oJ/+jժǏ=xwU%ɇ'wtxi˖-.\_rgpႅ{Ņ=%}j˖-666w)//˗rJ->|ejjc\SNyQJJJ'OCFFFvϟ_q^]~}qq'OUy :t蠣sΝ+|a=z{nݺu?֭5UU߯_^[[;++.:{eYYYFFFwvuu TuI!!!z[l!Tz ٳgAAAlW^Iޒ͛ ?6X 0Eϟn:===...++6DݵkW@  ۵kN'$$ 4HOOO #߻+XpB++-ZJ/ءC>}Uxezz@ `~QSSSWWO>?ϟ?ߥK---===zKU0LJJȑ#=kl_~SN|677 `/f|zX,n֬gIߩ;uT===mmm_766VQQ1115j{]O1SҗdH$֭[PUD"ٵkW6m ɓ7oޘW%^ڢE0 sNSSSmmm° ډ}n`` }Ǘ ܻw][[POGbw 驫x}TUU=Jٵo߾{ /&Y |l5j7oeÄa={B巧ˊ+z衩ٶm[Z.))YlH$ի+,U3 sΝ;D_~}JVVСC544tttfϞ^h(//[nݦMvM6ԩSf@ӧvԮ]AEFFvylt;v찵c J=vgﰩTUǚ^\\9*gHrssoݺտT%66V [[&=y駟V+VHYN1cF9O1Ç앶:"YYYY;vw߾}o߾:ձc3fTgjlٲuhjj|ʏ)3="##t"-hXJKKƍ￿|3uh޼y\H>} kӦ P_d:K__?--۸φBCCgCMD3JJJJKK8K>/ ǰa8WNXUν{>P#QpR ku{ ZX,x-ZtvvޱcGFFF˖- YP47N:.))͟?No>[ZZZZZ%KotJˮ4}i ƮY<55 M̞.--uֆ ,,,?NUwASg%ɹs礿IfeekSSSX$ 8?1c_bffV^^F ?r󭬬l&bkWlllrr vmddTVV(@psW\}kaaYTTT ܻwOMMs-[|ԩSoܸ MD^VRRJIIiժP($Κ5)Jh"5UUU 7oN dXզM-Z )6eԬ |n~&^㩩g58op 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0@p 0Y)22Фrss@S@p 0kHg=1B_C֮4~yyyծSXRFp ` 8` 8`TSbqvv6ituuD72]S_4A38<ٙ4 kkk4{CvMKNoh0+bݝa+$t!&&k*tK~;@ӄ+Mm0 Miv:tY4MFu ǓD72]Cy捭m^^;)Wv@!aYb_|qMkkk׮qXƭ=$$$))uQx'_MGOA'&&7UVFFFӧOi ю5}|s !*** dgyyyWdd%Gfmu}Ϟ=jƧFIMmܸCRJo=Hx}U:w0۷ogmmpbZNrrȑ# =<|80!!!ƍ?|_~k֬)--_g㺦#HtRr:]v544422իWyy9SQܿvڵKPj6iݺuppiڷoM׮]>nllξ\EE͛aaaVVV Ç766={vAAO\\ݻw:uX, ׯ:t͛7tW?tttKW,9~"uˏ̛ף5k6}e˖ݻ2eʔsΙ'%%u]~}ĉ&L)-//oӧOOII2d 'LEDD?~8qgx<ɓ,Y2a„;wg9jN8mbbB>TPj| 8""s֭nnn;v'LpAw8p`ذaꪪb.))100Xٳg !+Vh޼P(\l.]pʔ)SﯧgΜ3fXo߾---CB9rȸq!򋟟m`` i iӦB<<<؏ 2fΜWU[U+gRMMmܹ줟VZ^taӧO_^SSSIIK.^:~͛ 5kt}6o||||||Hˬ =I3g20{.0/^߲e9!ښ^j+OXhݼy'Gt"IMt 8p`ff/QUU}izzR׮] !rBH@@&>U`vppppppqq1k,HDe-vZ֭#"""## !C}zrʊչsg:)HTTTGQ###:_]]~ 444 !O>ر#h/pر'N\fݻw䴴...nٲ%}~m@MM˗5mgkK9?@O^$ [YY mSSSɿ)UUUr@#K눮.}мysXLIKKx~oFFH$b++L9k62D%=~zWWWP$~;5$UU1clܸ1..KEEe̘1ر}v!|>ƌ3f̠oO-}-[ݾ}[BEqԩ(/ +?={lѢř3gE"ƍ|[Q^4Kҟy<;;bĈz{{;vг )))5Ξ=~X\ckkkkkȋEEEҷoVEIJJϯaLMM?.Hh&'')cۣQTG2Y"n߾Զm["afK/߿?55ADDDڵ+ ιvZ\\\yy@ `999999tooPX0Lffsӧ}||甕IG=z/N?B&M^RRRVV-9RQQ k׮'džpe;eeemڴx999b!0 xK,/--uVAA_sarssO8޴hjJ 4{۶m=OyϬYh&&&&''3 chhPq+b~(..~ƍǏ/AQ0;СC߾(+++))9jd 9T?jjjjEEE[޿mzEZYYu)##cذatׯNjaaaggO?BGݹsg h N:D!C9WN8fggg33(֬YۧOɓ'0WWW?uTrrr6mD"M۷owpp0`ӧ+nqS-,,V^߷o~ۛwT);vpppׯ1c޼y0ٳϝ;gffFݨ@ ?G5k,7zĕG_" ,,}1cEEjM Y$ zk׮7o޽~6W#QQQ4 |>ٳ}A74lװsWv͟LNN?jt|Oq|7LSVUMk/ϝ;7s6mVՒj", 2)WSxPS <0@ÄTG# uE(6L%P($hFk*Dv \WǏD"HwMHU4א@ZBBB~~>Z B@XJ5R Bp >` 8` 8` 8@b8;;]]]@`ee%gSۺH;4M&&&x>>??a5kָBٷoߎ;^xaeejժ={B/_=z|gώ3663gرc !5k6~9s1eNFDD?~8qgx<ɓ,Y2a„;wgM:U,:͛JJJ'NDGGBG45;M!xѷo+WTƹsϟjkk;{_]:{l3gUrd.=Ξ=;>>VbJjRjHB0a>0|0O>MOOWRRڵ+!իWǏ߼yAf͖.]G 066'VR[F˗/ٙ ü|ROON 333 !iii֭۴i_PPDKobGRRRɱXLH~_ҒJחKs=F)(( =ztB0 (((55{ RUU}5},Q W8zh.]ؙ'N(--)))d:e˖K,2dH2iӦ'OBxH 禦J'_$񖏏GokˎPeJ۷a۷o;99mۖrY##I?͎+jv }wZvmFFFnnnXXؼy̙ciiI9rHlllyy={/00p͚5ߗH$EEE׮]iV^^=zE竨D:UPPy撒͛7Vڵk7nȜzw}W+'Q+ժU++oOo/--=tXJJJFFF~~~_5ē{ĉ⊅fgg߬z4z5R>}ݻe˖PhBȤI-[faagϞG'O={3,,,ڴiy沲t{ǎc̙3b͚5Ǐ:t#fΜYimccc'H߻woϞ=u:^~U胰ۛ8pƌ l߾aFFFOGG1c8;;EEE}b=ZSL3fL-YGw|ٳgΑ)ʆVۺS%eCrU[Uۺ^#A75100O u)FR|ҥ-Qp j 4 5;|D" UРj[wmF@ xCC$>>^ TBmݩZ%!!!??!P(666ri8;@Ф+5%,t` 8` 8` 8NLL\W3J:Miw<ٙp,66bmm]ҦJlFbݝa+±:T鴒vh>n 9T+5}6Li:)J iL0#y捭m^^;)Rv844/޽{+_`y _zڱcԨ1E#\WVRRRSS{nBCCCO:UPPбc2%| BȦMzA NIIx|>o9yX,ҥ˦MD"-^ ܰaCVV#!d۶mXUT߄_⨨(mmnW\e-]]]iӦ7.:s挮$kjjFGG :tաꎎ03}}},s7""ĉ={&OwAM$6-Kѕ.jEA رV,Τwӻח[E-E^XlR;BxZ7byc,/)d9&|?y~4'w, _ K.'$$>$5~ŞBݻwkjj MgϞ-..l @O44^zuX/_ ">>+""rE֬Ywĉ$CSYYYuu' JG@@@PPPXX˳#5O.^o_RzIB#'gɒ%;v 򪮮fj\]]0j ʍ7_ĻdcƿŚ=ԇaKfv3gq6l#62l̝f[1l-܎p_~%U|0U 5lT*eF ̆3&# Ju%g5,H l;0---d]2>]><)l- `u<@ 0<@ 0_ t%;}=2 (0<@ 0<05$BHkkFWW`\\\$ٞ/* }}}-SMkoo'f~h"##-Ssvv11`y^D'N` x` x` x` xe\|K$K`%najА% Y...lON x` x0KnXr}j4+VZ﫛>J~-lf ~NÒ1[[[Ahh(/UM۷ !|a~0t#)a{N^\Ѭ[R+ۜ7n]XSY]\T3ͱ}`c -@0Ym nL)B 80c<b`zFLgܧׯ̟ 春߿o>tf_3y_2ʹF`&FFFJeppD"򊎎hNf; Ҽ3R4;wrY8ԂFGG;::UV͙33\ 6n3`{m?nho{װ<2"<%n].b5]^;'cc+lGzQ؊3ޮ0.袢ڲ8WWW'' .PJ넄///Lvڛ7o/)// T*WV(ӧO&J6|wwaJiGGGjj[ojՋ0l)0G#o=mXN RxկR˫*+~k._o޿v*C)C̀R=u&;NA^^>\lsL\UUի,X0&(z>33+66655lkWWX, (f͞GD?ZhQKKKCCC[[%O뫪.J]/](b# ;wQJD,Zri P*l+)rysg I,'oK=G)=_xvWF&z9͛c˖-btMMMlK/SJΝaÆ:Jiyy^W*"hʕ/+W!~>|yj9`E>;&%o_6Be2wCOa(T.n>[鮌=k4O$:&K1&N2ͭw&VP(4 lܹsZ-!O$900L{{{Z=ZYB‚>> ·1ϟ?}ttT(oooOO;wY^7]Ӯ+8wܹx=[t :>:;j³/nݼmO7\0+3pիU~@z17%%%,,,))b``ѣGiiiaoooJi^^{e wlZnݺjcbbFFF9V6|tafccy/Gm us+Wec?sHQ"WW76UbiI}{_Y{6nH [{{zBBBr)lbMPxҥŋ:ujϞ=wyGRGEEX)T,_rER-['''GӉ⊊ J陘<~{׶52?GJ>{o(3cߊyyWm1u8gx~+V)9Q$ŷ~4fyuuutt43͙yBrƍ|tL)CA(4咏ZMܖDeS9ܲ҄Pj^a IDATx{ѣSZYYIIIښTccc%%%kk뒒^YYl2MMMMM+Vלƌ3ݻWJJ˗Adddv%w3 ==#Gt3m4oo9s̘1c|J{=.+N>}…W^IKKofff>y򤪪ݝ SSӒW^p;w̘1C\\cD*玎7n,--pÇ/\ ![> ͻpBvv7|쌃(Z}݈#-[FDqqqRRRHHFSTT IHH())0aBbbb}}g϶n݊pbbEq͚5hiiM=v옓=J8w;!777UUUuuu/]'πBW^yxxݻw/>|8GR(2^jkkD $uuucccm۶566>x 88zkkk<>f<]XXiddg[[[555;d2>f'}oM/P[[{VjooZ;|p l6B!-,,N8d2g͚fuZ;NWWW<NSSSKKtȢg͚=]ނCϯ!)**\{<={S "@D0 5~vCɔ)SsFYZZDc^nn[Qp%99y֬Y|>!DAxi!_XZ0X0An0.sCPm|Du‰|` 0ꀅA`ڵkXW|()))))IѾ+wwG=,Snm#ݺu#dbb50GGǍ7vdzG?߂^fMhhhkkkQQӧͣ_c;ӇXQpUV(7ާ^AƂ mT{{{;BX&}1ΝBBPeddƌo>ww͛77nݪTTTq &QPIIɚ5k***;bbbRT'𡅕ʾz !TTTh"MMMmmM6566"=jjj:n8Rk.}} uz)--mjjjyyyQbذa~ҥy:=/us 6m7osS!}ݑkEEEvv6AWMNN.((022?>?k*--pÇ/\qqϟv .\իt<=}tmmFkkk;v׼ ~~~A{yڿW[[kooxׯ_>|8<<@Bㅇ;::Ν; vڳg:88 U6VQT\,ٶӧOƒ?~jggwiCCC bbbo𸵝;w"$$$v5gΜlذBx<[[;v*'B rU:vZ -[v…8q"ҢIHUjY%%% ?~\YY@DQQQee%Yϗ#WDIII544] >^TVV6rH26gݟ(tzO, N>(7[QQg2/ Gf>,TИHFFF]]](TNN} BCC#--M(3~)X`SWWgLpzuzyB s?Czmmm<ٳ'NP(L&aÆ ШMNNrrʕs177/_:u*VRRBuc.ZۛaÆQ(%KDDD<}ҥK8={6n(''gϞP_`|.rܾ}ʪ$N%t^I mMMM*]MF0AxėڤIn޼ill39rdvvvt:}ƌAAA6m"xyy1f̘ŋO4EFFZZZvV Efŋp&O\vm߿gX/&oذ_~100;|ɄXEF|||i4ڂ .^ucK9iNO>}~ RSS}"ARsssG-z&N`xB0 N *_ Wv=|>Du‰|`` | @Hpkk`>϶ꀅl*f4  ' 0 ?^  `ѽ{4`@ "@Dc{iiiuuu=fhƃ27o\C`F*/pCCB),,UUU c.>>^KK߫_pAWW߫wرc;KHH>}[ѥ>}/lvUU` |xY&00Pԭ([l9s&B͛n"Ȩ888O2 r]2ÇLɓ_覆l\f BnG"wIHH |555YYY>ƙ3g8p~xxxWhhhkr kTTTz1 8GGGQ78;;닺biiWVV%$$ϟefJLLwtttrrzE?s˝={n hoor<1g޽˖-J IHH(,,$Xb߾}dsŊaaaǏbcc\ɓ'{TЇrO:v/ ̟ؐ G9r"شiN|LImm-NwYJJJpbcc͛ΝKe-//_}U||`3o0aP~WW׍71 ___ѣ~{+++ g}||ǎ;vdNıci4ĉB|>Ғ^111eee!KKKo߾N덏gپ&&&cǎlnnF}jaaAGgֵnnnL&ɓ'3,_NIII(رc^^^믿MDD͂ ~WyIIɳg:"..>vX11 =5~  cȑxqSN5008z(𽄮N"Vӓ7o0ٺ/!! >|HD}}=ްaCmmm[[۽{Bf*,,;w%Kp!...666o޼iii300xAXXX,Z۷͛7o*[nݺu+A޽#$##CRR_~innnllLJJ"ڵkÆ [WWf#""hllڱcGcccuuuQRR:t{䉺NWaҥ˗/oii999ƑA=Ņ (((1cƌp nܸ1|pNO.\`0T}555!\G~T:}'N)//'"&&FCCqmm'O_vM^^w Y,Vdddvv<>C־|z]hii={mۈԼy󚛛qNx|ʞ={:-'''YFYYy„ !!!EEE4ffff,) gΜ!( L_j9{Ɏs\_K }X#gT{(++cX;aWl]Z᯿<㵵477644ܼy:tzZYYɓ'#x<i4pݻwlo_GƆ3L ݻw?}())^zr COO!tRIII򡋸F QRR U())mڴILLhժUIIɲDYYY%$$ |~BB9o]@jܹO<{ڵk;vy;M6?(((| !doo_ZZkPXXخ]TŋB ܹs6mrppظqu𥳐زe 9qIrѶm$%%_vMVVORRr̘1۷o;1|裏oݺUSS r\n阂»wJxnnn6668ӧO~PQBVn̙x7|CR))m۶N"7tfllӧ544L G%&&1?9HNN_ llltuuuuu$%%KKKs8,.;uTŋz{{+))͛7/++ 7૯Xڰa:6۷,^XBBTR鎂nj䤦vZ|akeeXWWd2322߫]@_IIIX)Sx{{;88TVVJEEW)N !!rD4B<ɓ'8NiiwVRR,ϒgA%%% QFv?{nܸqƍS%&̸'*((tq܎woܸ}EGGYfUUUݽ{P( %auX,4EW>女6t0B޽[jkkk^z{:F%%%|PQQ1g f˗/STJJOO/--eX)Vl0bFihhVPJJJQFFFPPBĄ内M>]BBbqqq~ |?SǓu/?_wfcii)Cpp0511YnN:pRYYIƏ7nBhܸqd:A8!Ԕ>%$$N:ehhhjjzA%~g'8)999??!{̙?3""!$!!c^^^eeeg7o^}}}HHHkkknnnppʕ+;ͩᑒ1Nd :>LȻvڃfggnݺuƌx$իoܸr-ZWINN044Ғ|*}NNK}Xg.//̓'OӧOwK:""""bccv܉߿cҙ^^!4a={lԩ4N7ի8˗***4m̙555%۶m9rҥK[[[ xܹsǏoeeG'y󦤤Fuϟ?'//lee)S((( ׮]cd˿E邂EX,1cAN4iڴi}7|||455 {}}=NO>ś9lذo\AիUTTG߱@zɉbIHHQAAΝ;Gۅ;v۷ĉaDט8q@AAAUUuΜ9999o߾UWW?qΟ"''IDDD[/ IDAT:WWWWVV^f $t@xLOO733STTdٻvg-++.ȓI{{my^~M3rHII &...,###3gάYfȑCRABA}ruuo555G.t%>ZZZ\Oh4<֋]r?ӭ۷of>2c!:~鯿:蛄]v~Jׯ_?dBٳg .|)T{}X***UUUNs玶6+>󳲲L}i]ư{L&hXYY8t 6؄>,UUUmc,X kANNNI{XW&HL搹Pͱiggi2ą e茂E "@D0  `@ "@D`p )--l4xP[|V7& j3͠0F*x o޼1` ޻wL:J$ʊBw%;|hjjhѢNkx. 4Nx1^BdffQ(PhhPQ>>>xzz %fggL6m@8~|`J[[[oVe6N_~}HHPzAAӧOҤqY^xjoo344|+++׬YiM8ï֖@Do6DOOI޽{SdH͛7kii)++ϝ;!Ԧ&CCC__+Vs8Ktқ7oV^-T+WT*Aǎקh'NLLLD|KKe˖111eeeޙ /-**  qs  gcc#BB{,,,,%%eҥ޽ ZdIjj*^HRR233D)))#FJɩ222B)))^ĉgϞ]pT~7:q :<666<>bbb1zhׯ_ZZZ"veddDRp`;wnӦM7nǏKHH9qqq %%rm$%%YsssSSS<}Ʌ ڊϝ;922/ڶm[UHOO񉈈S{eӦMǏ) .q㆜~~~qժUL&S^^>66իGY7rrrTmz4tn lllIII<J_חbu˗Μ9qѕ+WlllXPPo>|`ljji}}VWW| :|0|p̂%%%&&&Qm:GuvvLz#-?wܗ/_5Æ CDkk+p8 Ree>o-" 1F%%%u UUUk׮ [hTߺu+;;` Z[[UTTmmm/_b ={vl@pp0511Ynٳgq`-Z~}C6l#0KA !3#+݀}E"##XQQgϞe "--q &}}bX,VTTԜ9sl˗/'M剋kjjYqqN_{C VZk\p KΜ93<<ť!b ̴9sp 6ܹ3--755%''#RRRcccϜ9FDD,+77O;88z Wq]ٳg oiirA\v7aٲe۷oܸq%J{{{ss3Y677777+W̟??22 g̙88qxXXXkkk]]O?4b55i?BBfdd455={ɒ%d f襡B'O׷722P(AAA8"5 r600pwwեnRTT@IIBhhhHIIǛ}+Vt6*++]]]:dhhry///y֭ׯ_ǯJKKUnZW&''hmmr4**jt:}۶mˌ3d0BѾ}띝?GEE?BhĈW^=wvii?~O@@@LL >BCC.\`iiy2gVV˗d A>ÇRԣG &`++k׊!DΝ;|>?++kʔ)ݗ6π?۰{SN|3kt5y !XvDY(Cjo@D0  `@ "@D0 kHiiiuuu=fhƃ275--mP|ni4`W3x--,pرϟҗo޼1` ޻wL:J$ʊB|{6MLL)`zLL̙3첳qÇLɓ_Nfnn.//i<?kR(L<  *g@OOOCCC욚iӦ HǏ:ׯ J/((|iZZu{{;N5kVbbb~~Ӌ/B666fffn:uÇ;Q\\777rg_ڲ Bݻ;|ITnllܼyܹs B @mjj244-..^bEyy9p8IIIK.yfB%_rJq1}}}6qDϷ\lZVV흙pҢరmݺuL&SQQQKK+::\tq EEŕ+W! )Jss3pc":6m˖-jjjꁁ5*((7ŋ11bPrr2B9qBN߿!dllcmm=vرc&''_4kkkWWWmmm;wlmmݻwBWW׍71 ___#PRRRkkO?URPT111r/RL&͛7eee "%@\|րaH˗guppxݻgnݺINN~I{{b:TTTlkB޽#kjB8T-[oݾ}ƍ.]ZbBHRRrƌ8ZYYcƌg@gۛqϲr###mmmq:~?̜99 򊊊G 0 SSSBqww hjjz왿%K0Atc`ɓ'-,,卌(JPPPAAI>>>Fƒ uuut[ X%%% !%%obbB~WXAlvHHǫtuu=t萡罼[^~V(--MVuMannnt:d>y?ӧCBB&MfggG 6!khh8qį۷e|ɿyf:m۶_~eƌxٳ\.fffMMM"::ZZZ!$-----o۷Y ~TTTIIIHH?EK.) &&@pB%%%KK#G9,_k_JMMM9>|ՐeddX>B_mVVVk׮uC؝;w|~VV֔)S/mpWljM:Uh t5y !X,5*d AX`@ "@D0  `@ " !FjK຺DִAmh]π۷3 EEŷoߊ-ɱcD Ηo޼1` ޻wL:J$ʊB w^xqȑZ55e˖3gϟ711P(1113gTTTTVV酅檪Һaaa*UUU...rrr***7ox(]@i:naacVii)B$ˣP(999P|||t?! ]444Jή6mڀTqq3`(((`2ʃ]gY___ԭ=ׯ J/((|iZZu{{;BHAAaϞ=wYYѣGK.Ujkk_zrݻwwZx...nnn,믿egg;88ћ kw~RqZZZs-,,D%&&*((x!dhh[\\bŊrpp .]zիJr劃J%رc4mĉ!>oiil29&&FUU;33ח899EEE]ĉf̘f uԩUVs8u1LEEE--hP||VXXRPPؾ}{UUÇquwޝ:u*NWQQqvv.++ƛ7o={ɓ'MՆ444P(SN3FZZήv۶mL&ĉ8ۛ7o̙FѦMv}f}}}MLLƎLlbb2a[[R y oc``IFrʶw/d]]]wfw]RRR\\RRR255eXJJJGE޺u+$$DMMm̘1;v8~xWJ}@RYJ3L7oސݣP(R}l "jzrM0[\\\lll޼yg``ؽ{1cVXajjoܸ1|pիl?++++hҤIׯ_'ȑ#OqD6]^^NDbb|EEER__.++044=z_vMBBA\x%((`466v"~ ZZZfϞm6X;;V 'Ok1cFxx8CxADDD|b7n@u4<<\YYL:u2BꫯJKK r劸8222Beee׻h"wwwYYX 6l@ӛ ())A=yKPvv6AF*---..yfuTc' IDATcccÙLݻ>}1bI||:-cB_͵DڵȈJٙ]x!`0Ν;i&7Z[[wZ%$$zܜ8vZ11cǮY솤$lmme0zzz8}ذa퓓3222eʴiͥVZs411:uatݻq[l@YXX]p6ڵK]]]MMYRRr7#444eee%$$vsĖ-[ȉ'Ozyy 6 !m۶Ǐgee +''qFٳ=zt>k?~|ĉs***"\XLGVb2򱱱W^Z999*._܏h*)((@ؐ)!*~z{{{___/_;sLEW\bAA}𢆆򁱩NVVwU|G>@!@.2^~:=`|MJJbΜ9*k׆BJ~֭lbŊF|sˎd-dxQpp0511YnY`-ǏWQQAYYYu9Ç/**"gn6ShQT//RE>?.))!EyyydNG***UVV)999??!{̙?3""gXxBիWw"Ξ=uN7ǎkoo99KHrr2~n-''اA"555zzz222<N>N+b٪Ȫ*^^^eeed޽{߿e˖I&37uu{܌{Bʕ+ϏR,>>///:-BHKKǧ:///888ʾ055GQ(wwgϞ/Y,@ @7NF>Ą>/OO۷XN쐐WYYz!CCC{yy[n~:~PZZ8#~;%%ǏիW\uBu V^^FәL'O"##{W;?++KljM:Uh 'sm8--ȑ#I3*ؽ:IWCPbݿnnn---۷owuu|EDοq { zH - "@D0  `@ "@D`p0--l4xP[|V7_{wu?=5\-RTRJ.]ZUmjkjԖkm$JVTtMȐcw7;8^Gϼ?ysǏD֌>mmFu͛7˿^ͨ'HWM0ȑ#7=zSzY7C7'&&jhhOVQQ>|8WQZZZwk>~8W"D" ;W]/^8tPvvvmm-J`E_ @8Ο??aęikk+//斓CL4IYYyذaFFFdowߙO4GN N,S({{tb.'77D"|!w^l" YjWbNNNMM@8z('N_WUUUTTzcƌ#Gv+pP(+=??ժUO>ȐtttlkkCر#++۶m&6߹s?EEE5k֬_.\d2srr<<<0tĤΝ;5`Taڊġț7oʾx!hffTTThѢr}}}}}[n%DGG{. K.yxxd#GF)''7jԨ7o"X,֔)SoHeeҍ7fff{yyk w35jG###ԩSK.-**ן5k\bvDDB(>>^[[4MVVvUUU&&&< }5BQRR1cFii)>zO:u̘1VVVfff&--=yb"tgE999IIIt9t[":k_cI~ 8g9st۷!h4ˆ#^zElpB777.+La$֒dQQQUUՕ+W{D *րA+Kfrrrz]ss֭[MMM[[[1۷o766_hιyUUNuTT4*+++W`:ɓ8qyy9F ɑaرc;.R]]-//3MMMCCC+&&FOOX755/^`DEE7l`0j(:^^^1y󦌌LEEE}a0ɓ'|חX5~05j{ ţGfoo?yeee;#$$$ :[d2)֊$3͛'Ng>>>~~~)QQQc&f Ԅ1&/>y͛7={Fg`KJJzmO%%%EEE]3.// SUU߾}{QQӧOB[nԜ0aB||EDD:,aժU+W1bWzYY٫WL:xonnN&&NxEʹs֭[vZGG8z˗i4EDDe˖uM$$$233[ZZTTTLLLt11Ç;fҤIK.}ySSBh„ bbb eﯢ711yat:]VVvɒ%>䳿kkkII2L>=<<|ɒ%DJg{- ĉcPxx4ӣGlp)ӏ;*///.]*##+!!V/_T#Vj*G999S$$$Bd2900pAAA4cbbrssϜ9~եKb~~~HHHhh(}0;;{ƍVQTT?ܿtK2n0w7z~D R6iiiuuu2Ƹ^RRիW[n}Iss3BӧO DLVRR£ KކNLUomB7{n@3fY&%%/Evܽ{3fL'ŋBBB+J??GW!L&;[KK ;!^/ G[ڇت+W._>>>ć/krrr\KKKCCRDDsLL̢EصرcΜ9{ &XٳD"g-wޭ@./PWW/,,dd/&WVmذaÆ 6mo?̼yNzi))ϟUlSN:o\|yҥG!Ƥ&..>vXKKW ƍ>>>'s ||.111jmm_8W>}:==-,,,??ۛbtRoʚ?~kk+|!:tzY655<B.]wvv&҉|W^-//8q睝MLfSSS[[jjj"aooogg"H~~~vzqccgBBB|}}3`qι2  ƦMtuu`;w2 1rvv3g? @III^^aEDD8::WXcǎ*++|jjjK~RSS1wI8",sssm۶f8/:Cvv68..Nsuu駟eJGimmmgg"sԨQ٭[xP~~>ƍ***2",5jɓ'e⣍wE ~MMM5V'O#}Bk߽{1;v,Wzjj*866BZZZFF/Eqg_<y9ӧOAAAzzz:::ĥD={pv޼y/ ",RMM .)Ǐ,!DPѿ3g:88,_\رcGFF˗ NG ˞]d :qg 0%'' 6GbҷmX埵55 ͍7,,,222:~4Jsssϟ??|tvIM44޽{onnVVV޼ysW~7mT6gΜ7wkC轾= ==x@0 ! `@ Bpt `@ B?𥾾>//cL_>n8cbebB9.ɍ=O[;sc1ݾ ?~'fddi3Au͛7:uT*UXhmm122`񁁁,>LՕBmHӫUTTΕnddZ?Ε1vpp H=U׋/:][[+ @gΟ??aęikk+//斓CL4IYYyذaFFF$+**/^3l0{vVckk+Ç >==تD"eff%H/_Dݻ-[t@1}twwwwwn2tpgVZeffƕSSSccc#*=UUU"zB\VziFFc[[BHVVvǎYYY޶m[tt4BJQQ***ڳg϶mێ;a5k/ .\`2999jjj|RbbbaΝ=0ppD_4pCC뵵]]]7oޔ}B,((hѢEn"J~]@@Wɗ.] #G9RNNnԨQ7oDX)S###KKK7nܘE-,,ܽ{7;5jGUשS.]ZTT?k,&b UUUyyymm툈P||i4͛<==MLL񲭭MNNѣGiͩTjYY}ٽ{7Ƙ+oECCÓ'OW/۷edd nœ1]'O_ܹ<#GFF7o6773 66iҤ@b8ժ,)))byԨQ!!!==tP} .$-aΜ9-'&&alٲm6CCBuXl\\ַ~kddD<,[lD;,|f<pFFŋ9+++?~zUmmmϷ&ޭuUTT$%%i4ڝ;w."hz s$??!N(//Gӧ@8 IDATh7=sLU.]rrr j %V׳Ofggoܸ*~ӝR:~^MΝ[^^qW^޽!DRهˤzIIW^mݺɓ'!LZZ!94~O0ROOÇ!;;줤WVV޸qޞ-տ۾}؇1yϲeߟ>)wzxx>|xƌJJJJJJ/ a_r痟@[{`Ϟ=o޼{葭-BHLL !D|$BIIIp DuV[UUr˗'___)))?MLL8c|,,,/\W_9q㆏Oxx8Ic_`SSٳ ?yyyFN8EөT7olZZZKQQos̙3+B555wKK xaaaAAAfb0!VUUU]]Mlի̽{JIIeff޻wŅȶf͚ ؘ[Pjj]Μ9sΝ?OшDByyyDoF={o;ӧO/++;rH[[Ϗ=ʻ\uqIII![>\^^[ԘHII/N>ei׍7_ngkk+**joo޽888.:99y˖-;9>_5..nɒ%#mmmMMM̲Ht钷wxx3N|狏zjyyyEEʼn'Ο?jhhpuumhhevvv!!!!k׮Ǐ766>{,$$ח=7q}`6>C"|;v, ]`9 ! `@ B.] OOO I^^^p.t=t 0 ! `@ B@0 ]?Xnn.vC9EEE999]]]% {k:4?Lnn.DvCǏ#`p_ M0+ cĉca7dHHIIA0{th/&}z(|1L~!avdW`_`Ȃ!p߂oD| p jkk)Ca !1' X`҄ذ{HH۷o###Ak0tttnnGjiirlbbݭx[~/RWWWSSjijjP(yyy|Y[[[RR?\vMGGgUׄ N8~'nMk߾}igVG=񱲲JIIQPP(**qF_4[0W^%^?~ՕVRRRHVPP`hh("";>>?~ 544<}4U222FFFKQQQI'O7DQQ1??!設mii]fff/L7n܊+?NMHH(**>!J}ͬYh4ڵk띜ܲ222DDD0 #%%Bz{{߿O|8..3ݝHl+8.p{nRRʕ+nzIҥK?|[2O?ݽ{w…\ֺ\2666??ƌ| 28qׯS/\$iɒ%AAAV<5111jjj!===η*Q @>7yC7ѣDdd$1sL))) ٳ*jhhؾ?l0 uֿvӦMK.tttTRRb%^5uTۙ3gBs͟?!tqOOOwwwe˖^|9BHRRޞuի:y\~='Glٲ[na\*###""2vXiiPT118++[-77777^rgع2pD[NTTcꚑ1.++ߴBzzzjr労͛ SN(@m]\;_YYcZZZZVV1xUqq5Bǻ!G8e#9 [oٲe˖-/^\f N'e7oNKK/]~捭1c/Y,x]]UTUUH"B^=z4{?0mڴuO7o… wڕQYYIL.,,|)fMMMbYAA}ۀw;Pݥn-B+qXӧOt:h.Զ{x !!>0#݉>H, 6` I$-))]]Rtm='S… 666 oÆ 55߆$!!o߾,'''qqq__߈ѣG}!2H]rerr2p>*fǻ?P(?vvvÇzjRRQ5N߷o]欅\_{_ѿ7r~'H555gώtvv&G%.hii緵qҐYf`````Ox tSS{mUUJYZZZosVA&ׂ1VWW/**bXSWWQ~Oǣ֮P/g\~1FFFġzyy9 |װުP"JMM q2_\\ܱc6iii999Ç>| 8;;777ܹ``KKKoҕ+W8SZ[[82|IVVV%%%3g$R*** ~wܹsnj,--oeeEg̘K>SVV[[[[%K8W;#|}}ݻ@\}1###FYg Yn]B?>u}RZZZjhh$%%qeصkÒ%K\\\t))|ݾt:}q(wwwP\\;,tzЅ BCCmll(߆  п2W1^־pرcى111L&ޞx^Gkjj͘1}}^vm/_644D!2?3uuu"1mAAg$F9rss300000ql-{UԩSzyy9 !ھ4ba |!hgϞ3g%%%555QQQ_uttt<Ν{q[[ۉ' ߲evԔjkkٿF$"]\\B/8͛,X۷pLMMݳg@vhĈ377s33gEREEEEDDTUU===WZE|㩩innn_Juu5޷n߆#cc~mΝ싢B-ںu'.\@^dڵkMMM8ھp//QF?ѣӦMc Yn]壣 gϞz[SNGN8wQwX277WWWwuu ׬Y3~x| WFgaa!vvڵk:::)O… GbYDD!4zhA6?DvILٹsg~~~xx8BӧO;w=z޽{J_>|0m4 qqq"3g^yɓΝtҫW[nΜ9ǏmmmCCCZUWW߽{}qU@fD ƍ**..ߖ?m gΜ9sd3ƌ^u…ÇwVoSeqqիWcV^ ,KNN/YB_YYcZZZZVV1xUqq5B<::T*ULL+.." hUM'3`ooXVPP\UXXJHH3OYYG`I/^L;`nCSFY1sss FuugnU)** !ې~KzԆv̲< JWM1J%HBiU=~!'g}<‘5О}°k ĉs-,,RRR uNϫp᣻hw1s]0?D":[5`/c A  0kN8 10u0n&'ҵzYHNL˗/yN |`b={e>uM#MJ`uCCC444^*hi|2AC, dy qT<== vmmm-**[`poQ۷n9QFӧt{A7yNw.>}͘Qr eQ ܔ]]]/w<<<444TM\b``:n8cce˖|||TTTkjj0g^vm}} 3`J 'ÏO2e4/O gc.#ƭv̜{"=1ꒀeגoEEݳk,Y3`JqkkNNNQQٳEEERRROFFFFFFDDƘ`899geeڵKDD0''ѣGo߾o!$ȋWT$&\cs枍 HRRR޳fGycvL?>ӃTVVhWM>]JJJLLlƍL&ŋĪÇ\c,))9eʔt+WZ[[CCCeddDDDƎ+--ڶm۰amv9;"/]SFVv3g1"V!TvNjYi)1TO:tK䤤ƦFg7~",:\U__a cccQUUERPP`&$))Y__*,,,_uuu=i+L`8`0,L?OBc.$?/oD{e~[vz^[6_00ͤ}把3riӦZ*//OGG3?Dڵk˗/_,¿u򵴴z[[[y7 #so,*,p#%wOge=%N^8wG֓'8gD=|pgg͙~_ ;tZ ?!Ywx9sիW+++kkk\1TTT>}x2s...$)((d>x𠾾ťyuuu,}A`AF`#NdnaL%km穓Dj=--dΊśNq> y.+-aOcXmB&s9rd…͛7?ѱB[[Gc))C‚dr׾y󦮮 ENNN___  0|`_O`A0 ! `@ B@ƜAIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-advance-filter-ext4.png000066400000000000000000000550551477354127100312040ustar00rootroot00000000000000PNG  IHDR;<+sBITOtEXtSoftwaregnome-screenshot> IDATxw\?wf ĭ*ֺ'NbSjպbUDETnEVT bJ@!xMB%H$rss(ԦyҥK||<۵kKku  иp4 =p8lWZFTD"eexn3116u7@kuVghh~&>.䡭2***qqqUjNGSе9rHhhCz]\\|%%F@ ۷{9`UUU]]]//}2ׯwU[[{@SSSSS)S_s:uTBCCUUU)JHH-//qHZʕ+300۶m[u\\\-Z4dȐ^z_vssxbhhk׊BǎKKKkӦʕ+&M***zsss(۷offfZZEQ/^'KQQz"6ѣGs:v͛;&!ԩS{z޾}OsرI&1Q:VXѮ]; wRŋK.mܸiiimܸ166633SCCŋ"^x1/^tww1LeffT_~6l˵9s#G !'Nӣ`dz ҿBfΜ9qk׮ыm۶D,䥹9=ҥKFFF]v\dIII͛7aÆӏ:t@?NOOAΝrSSO"/a3 477oddD?d6gjjjffe˖_STjjcti)={9r$334))iݻwp8T&&&nnntw֭СCxcy0/=zĉƍRB>|ݻw6LvHޟ- }߿_*&ݫ䤩믿󕔔zꥤ@H$-WsN+++ssYfWԩS/_nbbgϞz0>pllX,444ayVr hZ@ј׀?/򿨖u7"_;9|2UVUԚ_;4bÒ|>@RwxǏwСu_zXخ(u \TT$Ϛ-xVVVlWZ 0 ,@ӧϟ?ܹeeѣGIȬcǎm޼رc&&&;w400xѣG[jw`iiiݣ':jnn^RR2x`{.[']~=66+W(jÆ k׮}ѣG?2(,,6lظq^|y;vErWd.]JJJ222jZ@"Ou RM$B޾}?#BHppNk;;;Y>tvvW(++355e dm굒ʕ+Immm&N~;w >fbXYYݻw  !TM*l fsss"ZٝkZ}2o޼!>}Z H 9h׮P(ܼyT!RԶZԌf۷m۶gϞpˆ#Mܽ{WjeB`p3N#222wӫ8G@NL?Ó'OV^}С 6p8@0|9sdffRUPPpɲ2J_~Aϯx7(200˓l+gv:y 蕽֭[WTT$%_K+\g5@fw̼pEQ u Xj>S$1wLQԯ+ Gy9???zѶmlmm{}Yotѣv={vAAEQ:t7n\n݄Balllm %'+N7n܍7wNQSSJKKڵ}Y29sBoo֡ xǷ~;piӦ9Rؓg1w Or dq֭:!+\ӧO۷ovE?_Y':?߂ d_b"` #`yM]PQQ<֚5iŐ+믦G{5U4iШs#&&up ,@ 0 ,hݻ޽s5׵k& @Ҵ;yEhٚ6 !<7i׀9Nzz==774O>mffO?v옭G?F{_\ bcc]]]ٮEնlILL?-YB077qbcc۵>V\lٲO!yTVVr8'OT_ԱcWZc7׳]Y`A>}!Ν311i¿[555]]Ç>|e``p._̬֭Ç mv̙3uVoi r8 ĴmSXbEΝ'9_,뫫>\ÇTUUvzMz;jƍMLL;w^V^أGd̘1fbJ;x𠩩&y޼y ֭[׮]\oܸq;v={  E!!!fffHƆ:v옖֔)S.\PYYYgP5aǏ9~Մz]gXϯMŊU`ݺu{;vf̘o]gŋ/(jϞ=:uϧ(tMTTT>^M2׮]kiiTZZ_XXXu 9sܼySvT͛׿frӦMG'O***2)!. kƍUTTƬۄUVɮgYYùw=I!$${"ggg33,zC￧׹r劺H$qӵk7eddΙ3GQQQ^`AMBCCe|˛7oΜ9Rj ༼;Λ7OF:tؽ{73EEELHF7/_а^rd `eeeTPm{P/baaQkךۯ]ٳg2 /^B9t,,,̴I&3޽d@***\\\.\8nܸ}{tA,^*UTg}W&L`&.\(*.]JRRUUe4k;LڵkPV[9;;0=z . ?677ghUUUY=zhŊVVV7om)SFLݻiiiLPuYDEEotP5i$CFF޽{;v8|v1ydr޼y#yP9S풒C:%?vڵΎ9yښcM2޿ߦMʕ+ w^դ"Ok011ѣ)==Ҳƫ̭Fm۶w& ׯTUUB?~\TTԳgOBȸqfϞh"mmmǏu}}}%%xƍݻ,ɍJ>С}nƌ`h/^|]RR@ HHH0`V56 =zXhsrrdOy捻ۦMde0wiӆ´mHHӶˣW۷MVV֢Eꬕ$mmmeeeaNNs H477p8eVVV՞={hjjZ*455 !׌ 陚5ΧikkKv!Pᑛ{e+++#{TQRU %3ߙ0r&M߿\F+նeiiI?r四;::vիW2֔R[ijj߾&!$$$dɒ%ƍ;sW_}gϞs9;;Bl2yK.]xqԩUUU111;v*GKK_jjj<63fLzz۷KJJ"""L"Mdkl捱M6FFF5$)I۶meT& 6… ӦM/,,433KKK<](B.]_o޼2dIii)ss 'N6l%p܅ ޻w/++А/,99Y v1[Ynn.311ܨo@ikko޼955 ~-!wEEE?O:uƍLF/>|-{޽{4>.K.gلBw}ǴmVVsw}WTTԻwﯾ#aޏRRRTTTܮ];=V JOOի/Ϟ=[YݻGO9::BE=xOCjjj.]J{iӦ%KԹTTgU;;SRRlBH`` |?}WUUEQӧO۵kdɒq?˅ ̘.3T[nsNUU/_BQԕ+WڶmÜcc;w>}0u>dee9::.ZzPVVV fm^xq.]hkk߹s >|XhQ>}>|۰aǏ zEϿv횊Jdd´rrrEPw} DK,h۶_|A_}СCt2`G^z=0`Ǐϟѣ.}KmLQnjchh١C_ޭ[7//oFF `.f|wMH4i$YwN>]WWWKKo*++;Ɍ'1S;2PX,޽{wN455 ɓo1W%^ڶmPk.ccc---°{### _FSu=777---^>:=}9%H6cTUU-YDWWWMM˗S-,,TTT{iFkǏnccӹs޽{>|8((‚'{$΢(믿fRd…cǎ4i-[R UaBQ޽{ !AAAy}ppp`e+W B--~ݿziii]/[m?EQw޽P(_kkkϝ;.?:~TUU;vԩ3N>M Hp̙={;::6,&&{C angcdffjkk;|Ν<oРA}R\,233r65X<̙cgg7pUV5]֭cnڧoe{{C[n ӧOϚ5XߣG~!sHuVNNN׮]ݻhѢ7ih]v5kVOF5tOrV\YUUaÆb ϟ7Gk111=zN ,`@ Pd [NMM222>v[OOVC 6rHkkI~~~?#+ijkRY = s E} s`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X`` X(J111M]VSPPvZ`` X`A_C:y'@K+{xh \<@0 ,@ 0 ,@ 0 ,(ᣥD<+x< z|HuMZC 㤤p8'''+*$$$B,-- 55.m=%uD"777خHХKxfo~Q/嵆>fod^nUղOG@7Ҭ?//hp4 0nZtip8I4{!5oZ[[2sZCUop(JE$}7o޴vk>}7E-T>2q ''3gַ8;;>Kccc6VJKK|~ZZS^XX_ĘSxiV޽L:4 oyuצMt(Q#-TGcƌ֭[||/.\ժΞ=IOCeT/i666 WPRR4Uj l֭[,` Вo6}t###UUUkk믿z5>\QQ`PpѬ۷NNNNNNW^%x/]h !%%%|>~޽@ 3f̻wBBB,,,lll8ݻBȾ}\]]ttt?Nv̜vE?xxxteq8|p͛ !W^ݸqcm%w;~]HH߼ycgggggw3gX[[]{EرsκK,)++IKK3f{AAEQŋ-644MOOo=U+?,5kּy(D۶mӧ333u/^lcctƍK&&&ZnԨQEL8^Ç 200]~}EE?S5u&A+Vx{{o/W\_|gϞ_~UUUTGKppw-u6;v>>v*--6mڪUɄǏ:uJAAϯAAA?4i!ӒC/_~.]B9ҳgOssǏ5jΝC IMM#dff]x[@@@ddadd$y@ 2sϟ1BQQq2L}\Ԩ$oQQQϟ'O33u˗VVV޹s~ĉqqqFFFKKKC9 ׀<<>>ӦMSUUL(ȑ#'N$믾>>> AAA̦g̘AQUUuwwg>.H={vbbbmmUIUU3t̷o>((ҥKE9s2,,LCCCAAG_>~-[VXX͖wmiv$' !STT(jСwޥ(˗[n555%XZZҗkʙ3g՗.]lcc`(]#aR_RGQСC_|IQӧO333zIqB %7JJVQkZZZeee9sB!=,[tk:vCͪUf͚ӽ{wzR,+++E=_MM@JSWW/..&<}k׮̢u 4^ &L? `…ɷ_CRQQ?~M===ǏС]:::B\Yf͚E_9sf\\ڵkgbbrmKJJӧ <ϯ~۷m۶gϞSSS7- 7m$K܊<>2ɿ_ pɂѣG{yyqܝ;wgLMM?^UU%YCCtt4aErs-L2eJDDDdddyyyeeeRRҭ[dlKYY秤0s]&#b?+AQH$ԩϧ/R5d|򢢢[n __߯ŋE8qih߾ivTo~ɧK=K x{{ϙ3Ք4 oK$eeeϞ=۴iӤId25&Av'VTT>|o 2B@RXUU4((ںcǎؾ}{~ݺu9r$=͛7ӧO733ILL !vvvƍ޽Y\\zTTϻu& G9>}HΜ:ungBoܸadd|bo޽{m̙S?g 7o ! ~mvvvǏwrr211Zd>>> :u!CjjjONKKԩP(\j};:t0d@r̙nlv33u 8"3UΝ;;t0h CCǿ}s;wĄf</22Ç;v9sdu_Q~m;w666:tY/s>T[OI̙#v}={|KllX,f"ˍ0`a#S@ceZZڟY ?'CU;be@R}J5FF /ܹsgԩScY'ɛV }/ZCh<4OoHM|o0np ^#|vq\X uB7:q75Xuj!䢢"pS<*4{!55j %O;@+`A4` X`` X`` X`A)))"(//gaa!cSۦ#O; p8'''+!5.mnm:hE"Q.]fK.EEEKmvh1Z)輼<خ8 ktZivZ `BiWm@{ EzLӰHyuaa!3ԶToU0}۵U[cNA߹sgȑȑ#^-)|>?--qe&_Y6mjcbbe|EGGk׮=~x̙~mëRQQBUUUb Zz^xرcWZEO3FAAaƌǏ733swwwqqIJJ***(j...߿sΗ/_ZXX]o߾UV<~O>}ܹs ͛7aBJJJ&M7oޣG-[kii?~%%%&&&ѩ7nXdIEjڵ˗׿kw]]]uttUT\]]=<<>|KB͛C~9ñr%%%|ͩSD"Q=6o, B߿렠7Bol m۶I5k֥K&OL9}tllիWGwޭ[:t… &L~zv!ѧNruuKsrrZjv||tihhIHaaaoPPбc222F4|+&&FEE XlYD6mmm$gUTXoTTɓ'?{L:u偁wܡ5}tHo޼@9qD\\!򫯾z*@kPS/$o chhCO?^__ҧO[[SNBvܹdɒN:qՋOݻ7]]].>p+WTƹsnIDAT-Zbmm=w܃2KΝK/!dىKsMJJjk$X B!zzzE :4;;˗E<}433SAAgϞׯ_?~|˖-JJJ+VLLL 044D+)YU~#`WLMMEzJWW400`dggB2226lذyfz~qq=Pr;v8zhNNB~~Yjdgg B* l|||!QQQ>>>c1'UUU !ńG /TTT޼yC?(_[ZZ=zG'NTTTӓϟ?g۵k|#FT/S{1117o>uꔍ !$ qx(I I?x2#T$G(~~~h@P4tc p8Ç۬ ̛7ܜ^ȑ# UUU{Ƞ|AAAׯX,.--vdN3 FѣXz2OII'===lR^^e˖/ _vmӦM3W^$jڷo/{ٍ ÇK___QQQAAA ~''NU/ //ūא y=:lݺ544)2eʔ+WݻѣSΝ;w֬Yfff:uڲeKeee{sA1BBB͛gff~z--ǏZ[[=z56!!a2^{hix-DDDtxСf(jǎ:t2d@ pqq9sLٍ?$66hO6mXfj>r `Hesmө-~ Imi  }K'Sۦ^#itR"a\[8Mk b4;\X,Ьjtl0{qIII<UmNb4א>/EEE͡|>dzNmӑZVl/a@!X`` X`` X``|N8%%E$]x< 봆Vp8'''+²BeK[O+nD"777خ˺t_Jl8//5 `xGÑ[kkBfNkhyiphh_~){OO}Ux ȳsNW+`3Vx̘1| OO &4ACwΜ9zb孟]jڴiS.]5177ozhRs z~-XAAҵkƬ|HEEUh.>&TUU%焆>|Ϟ=߇>}k׮LMMJ L?pȑ#kܮԸcܸqӦM;{yƎ_{O>aaaR5l_^}Nj!]Ç_|Iټys>}!ϟ?p8qqq\.o9uH$ѣ͛B!]_~qƜ;;;BXUT߄_DX--~ܸqW\ʴׯ/]?pqq9y3&NH/:{$dffjhhŕ[.44_Z֦(***Jr=^E50NFEE?^__?,,͛t8q"..ȈbiiW_=zGW17a:t_Ν\ۓ'OnڴI___YYyٲeYYY̻-#Gի1bDݙEGݾ}{mۭ~ y<{lfϞ}F)y{{{{{6)Iv4B(:thvv˗/)RQQyiffBϞ= !_>~-[VXH`hh(VRX~-(##"9UQQy:/_<(? 77LEE%J>>>(1)bBѣG\\\|~@@… !Çg1=Ijjjk׎e``PӍ$#͛7lWj#9-** *++$oookkkkk돮|GU4ɑ)}!$::Z T/MϱkW#@ >|9s!7.""";;K.1Ï?^[5d!;;;,,l„ r۷.hxS\j~EEÇ |}}/^PUPPpĉ=*+FtĦiCu`Q@GPI&dI앍clܙN "#>&43a/4#GlaU讻!@W!-E7s[[[[Rigg~ `?Ν;red2YXXXiiSfgg'%%-]>KLLXuRi!sRP(F`JǏeeeEDDPJryllSHHHqq̙3gʕ2LTNe2V*111 ^UVVaÆj ŋ,yr*JG >ŔnCyc N>yCttt|M PL>y3FGGw|W00Pp Zo"̛D"aF L;# H$m0AqL&bqmm\.obgN,9J`3ǐ!7o6N"boooL8sf09` x` xsA>}z 0' 7`x{n>  0<@ ǐ!*k[_R=jLZt9q|yȐUA}ZR#U`nLto͢I97f׷$mIvST!yaV_ /n~ OCbݧqh&,< 8 ` xL& ^)JLv 00# w}>..rSB>>Ʃdqz^cc#!$::z`ɓ[[[ !B0+++>>^P8;;SN544:tht!bpvttddd[;vHMMc%𺼼N*Bz{{ G4S...IIIoZ&tuu8qRP(5 !ٹSz"Zm`MXs ꫯG}ظ{nB|0c Mξk֬={D")//N d2kk&"*􊗣yU Pf̅8Ya0%<@S?ה`0'C} /dI?<eAf'[yIYdc(n*ЄXOQvW&aݘ1$Bsuw]R<%IևY`\ ` xB>UԷ޿tdC !"y;b4?{{{Xw!`4!IYPG~26Kh)̌@KUի3f]oG16VNRHz^fѢE&7u@@ =/L.􆜺DcBkY$[er}-)EhfL0BLpl`@st̝?w}ﷲ7! }FB_ͨZ`A=2,&&Ĩi;lnf)h[PJ K${V~S#t MMMy&MTYYwޘ10糶TWw+W.߸~}`yxMX0oV|jyk/=xGz]/4ЎZ`kب0|SGE)% `J)u $HjrRNw5k9 ioowvvrK||H$ܸqcMM~Ք)S222(֑.]k\ _|e˖^xv˖-Gyg"7aQ6S.ajrҁ-Nw~a(QrǟxikOB9T>x &v)b ܄eiܹ3䪞 6̜9S.k4*;;DŽ{zz!^^^O6kZYYuww?K`ʌ6PaF }&PJUFUE?6n ,Wn9 M/||f:}y)+&YZr\dɒLJ5}'۶m?{!Ã`u:Po9nnn׮]{jZpa`fv E__s׮޸q]9W^jQ77,[wAN>?|zvx-c4oRRRHHHbbbIII{{{SSS)]]]nnn҂C:+ EwwwUUUOOOllGrrr}3N C0].,)*? p4GgAy!cu9&q ߁GS%nY|e_L{Ul\dp ʫw~! g&bXk'NX";;{vJOO*jQQQmmmvJ)DEEE*#;;_$T@WWׄQ_887_1tM'/E+ZuKvWN‚ΆI)9B(ߟ0J2&&]wƞP(,--]x1߅qp<SP2J95/zz4K!<5q mHC6B)~9aKK+e 3TLIZrӿ IU5epOc پ#`8A0`a% P0WI$a ݇% H$|Fpcj PaXvnJX\[[+M Չb a g^wZsd~nvs\{n.'$X,0N i&,0.0<@ 0<@ 04pIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-event-filter-dialog.png000066400000000000000000000757441477354127100313060ustar00rootroot00000000000000PNG  IHDRQsBITOtEXtSoftwaregnome-screenshot> IDATxi\?;A*XP@ZQ@=*j#9wZ_jVXjShEP*@KI20Q23seh/;3aD")u@ m@"@En -(t[Pm@"@En -(t[Pm@^+H:>j(m%ĉ;mBZZZ=5T9bĈ{[.77:=oxbuΝ,=::7AWm:De2=W L]&aРACPRRx)S%%%<!TTTbŊ#GZ[[TWW#>|bΝ;]ZZڵk׋/?a„˗#Ο??n83r;vGEE]~ϟwtt411 חegg㷱NNN555^^^#FxÇ wEѣ_~%33b޽ڵ++++&&/|pB/r-ŷn_ϝ;׫ x]鶗.]l\SS! bccibb"BhCeXW^%q#<<HR;;;%%%H{DWŋӵ!??Sjjj<oҤI'''oڴ_577򪫫;|Q,,,:ONNBr211ٿ?uyxx޾4D}]Coy[ܹC~d ߹)}n (@sȷEn -(t[Pm@"@En -(t[Pm@Jqoy't;wd2AA2 ?B˳A>)ɓ'޽pĉPȉM;/AJJ*۾{N6@jii)xJ~u_{MBEEEm߾}}]/uyvÇImhhPN;W_?㻶v۷o*N8q˖-G~:AgϞҲ{.V__cƌr B(22ɉZ`` ޽{NNN,KOOǧ!tڵoJ{`Xϟ?ǫ+&jp{E6ׯ_tK.=sLDD˗E"QXX|>Bمb877W+++8q,//!ZhѺu͛r\ÇcbbB;yE\\\``/N< hM[-ֵ3ߒ}۷ocÆ ïO<{q!<==g̘qƍ興"7o7ymm3VWWw͚5=!sV";!s8PEEf˿캺:PuuԚ +))į͋[VIݱc^7!Ap89())9x BO) B!~^[[KDzeˬ?^\\&&&<d-+Rw"[m36mڵkד'Od2YMMMjjj~~>BhŊ.--/Y*BhE=7fD"T*=v(???rH^^^}}뽼z3 }jBׯ2dȪU|ʤI? Dƍ|peDDyٳ7ooLҥK###r??7nd;v444/ƍoikk+gk,C$u8=Js77&Z]]ݴ &4?DϤb/jkk{2GX;w3;{)//3lp>l@CFFF폑d***^g 9lhhؼy3WVV4i?OKK2e=qD PiiiQQQ^^˝2eʝ;w=zʕ{]|(L\o{dSk&>})SBƟ~ŋ9rD]]}ܸq'O9s!C֮]˦=m$M!.f##@Yk!HP*4E4q%_( #㏋/dDEE\OuaE-\޽{K.=pܹsh_wIPdmyG x'6!!|f`P&L~iG@^&i&i&iNOIIgX:::SNd>l޼\WWwܹx]PbF`0Bjifff{YzT*}1 xGttt흝=h ???6]RRRSSf(&S\\rq555==})Thin*..?~#9xٳg[[[[[[ب’!ClJz`&mmm\BģG<<<Ǝ;n8PJJJg: |~mmP( jT*D PYYYYYx…k׮-**BDׯs83fTWW}v޽ (&;rHmmm77?!tE[[[ qXXlll|ظq-[O>퓪UTMG޻w钍7nܸQa M@ -("@8(LH$<ܼ WTT 6ӥ m@"tۦj!==k믿>|_חfkkkO6M,cǎUSSsuu-.. ?|yfsss]]ݹsBۛb92!!>>okmm}oߒKpBMOTՊl>!D:o޼\55Le.\bo~eP@@=z~ooATWW_ꥏرCWW00FbB(..N*?~\KKKYYyʔ)x|XX\fMff&BH(^v̙3l6d={秤;vLMMM__Ϟ=t֭y[* wڵkQQQ&&&BKKAobb_!Bg϶QQQ %%%C !sʭzSh2룣}}} d2YdVq8PJJQ|>V,kkk#Ba/&AOOOoL&`(++{{{3*TCD.\vڢ"H$~z}}=Ù1cFxx8B/!\V[[g6{k׮߽{7??ROOo۶mR\xECCcܸqqqq;/^0aٳ]]]4Dz'|ݹsͭ@s玅СC#d2٫W; "@8(emҠ"(:q @i鶐D4*$hɡH$ 묊 hrn<$$߿kȯR=Jvھ}%%%΂nKI }]sm[yaaMhhk׾۟ʪ!$J7lؠell|IJBB={ƍ7}vJmll444LMM;[jCCg}KVZ% q)))k׮;VSS>qY'ٹsiƌ~Z9 --N"OHH~~~$r܊fI@UUuxa@@@NNΣG B~~~%%%QQQԓ9mڴ,Zhݺur\.WUU!tuGG7oDGG|ѣvJ244JNNNHH8u^]R/]kXc{{{33 .l\KZZڊ++++:zQQfzzzVVV^^DB"9$%%}-99|>ɼtH$"^|yذaRH޼yʊ @xxyccӧOdII ^A?~а!ݶm۲eȷnnnۏ>(&& !C444ml'O Sp8wՑ  F Xbvɒ%Vu2LrD}}V@wJJJi;pSmmmCCCDNI555M"5kV)?M"k@'mJLL/ OzThҥKBaHHHnnKxxM1ӦM#ZZZgd tttL&~mddT^^^WWh1}veeڵk}}}b1D.dy?޼y3gDsAU\\܋/' TYY9o޼|>Ϟ=A :URppӧOKJJi455+((055ů˫k.Zt~Dn``p޽ϟ/_)WUD"JƍSRRNبO***~_zۍ?ӪU-֖߿ʕh H-b%'' B__ߺ:???}}}mm>Z-ѣf͚:u+* /_blvvv[r5_/\yfuSMLLFeiiG999۷O@4$rHHHذaCvxw@9(mD>sf'wFFF>rCR4t[jw^_ /ӳg @oQFn iJL H@m*Hϻ@&> ?$t[HT K 󳳳 FN:bYYYdVw !6??dAH$Ǐ{i&XА{mZXXݻs,Zh.44g㺸,^X"͜9uo?~tm߿/444$$$0̌ ÇQWWuֶ~_ JMMo?z T+33PϷE4q7֭[r%ѣ^^^-w @xW@8idICeeeY[[uuu8!]__[VVFMFw5]qD6;M|ڵϞ=w4f%4ׯ{zz*))>}:225IT&,n4qMMM$GxeaaqٖS-@!MQ$M>J/_hkı&>~ӧO]?D&z;b(m!M([n7/^ܳ;ߢL(R$[2sI4qQB8Ҩ4@4q9%''lM8 Q҄Ç{dS J9Tݶ111 >>dEn[PP  B$77""" 3pB||@ PUUݾ};^#@0aooo#秪ZRRa1W\s/..vpp033+))9 pdmSK,---}˗(...00ŋ'Olll\f +//^`Auuم l6r......<˗[liE[n޼yx]UUUee'N!ȕ+W~",""i,ӋА@FnhVVX,VSSspp@IǏkii)++O2E]] p8k֬BڵkgΜaL&3,,ٳg|>?%%رcjjj{鰘ݻwlذ<嗪{mә3g:;;&&&>>>jjjL&sǎ /_l븸8СCTUUutt<#16mY,VXXݻwrbeeS6''g;wg :EiQQQ&&&Q.]Kݝƌ 55Ajjj]ZZ:dYvu%ƍGmjjjnn^UUU^^r<K.e2\Ō]h9s,ĭ[Ǐ?bĈ#G###Lƍ8t@&.aÆ֖#iPncjj#ޛ#? IDATl2ww(UU՗/_]^r Gyxx;vΜ9%%%t0ܶ_|[l~mD"￯˛p{{{EVUUQ\\O[,\$بJcǎR4::Z$1 CCCeeer@YY9::~̙=GEoi򋍍-//766rf׮]\.wo޼>|8^,[]]=%%Z[[kkk'g[nq~ɓ'5 9r[PPL`9sftF 0HgUUU_-@xPdgg:Z ܹsҥ}](m&|5gDDD@1(m޽{=ٳgȦ2.&ߒ@̹-(2Fn~Xx$377qm@m)&vرc555?7n rrr4p`Ĉ.\h<8i$KKիW>2Z<ʕ+cƌ'N~WWסC;˗111ZZZdvڵk444FuEy~# --VX^YYy!??X[[O4MKK׿)U|>_MM.ϳ/\_VVVN8q޼yYYYYYY7o޼uwޝ>}z]%!))k]LKD"Æ JMGٴ4͛VVVA>F--Oɒ?F ZxFF~w1cƐ?5119 `Ŋ%KZ sj2 Zf A8/ů<_[6***˗o߾^|||[- INN]%%%EEEIII4RZR+MҒ\niig3/^\XXÇk׮Zڻ.;tPyִ`]]f#N8aooV9*]J755=+((055EijjDFF:::ӧSXG2!D)!!!<<Ν;666 bhqnK4qW޾}111~§o|z[ujzzzWVV;wSD"mm#F ={ԩ Zt[j;;;_pa,k֭SN?rqq~ʕ+;,S"""&M|rOONxb;;ӧ{CC y707ܶO6m„ %%%G$Z|ܬ98q͛&MW 󳳳 n: Jkaab\]]?޹c h -mJOOOOIIrttZmՃos%+yfLLLfffDDܹs򸸸/^( >Zt[FbB(..N*?~\KKKYYyʔ)8x!p455׬Y ׮];s f2aaaEEEϞ=)))ǎSSS߳gO<!uիW](zZ݂!Bx̙3[xΝ;UTTv=xุ?}*M UUU"':U|BěF{leTII gdnnNN.ߒ4q.;j(PEEX,&;{oVm^r붂MLLx<ތ3B2Ǚ*MB:((hҤIGBmd2uttrssn!**olld2/]$ȅ/_6l$ۛ7oZYY!B</ollz)>%dJJJ6%%O} 6,:: #F={f׭[rJѣGXfٳ-*$$ ;&Ao޼166裏f̘AQF]xyرRPNNNnKJ7n+ϛ9y} !>z y[n?~Ĉejk!%K<{/ ۳g9>;;۷ cĈJWuGOoV7sqqiVEˇH8qĉ<oŇr A=;v9sZn!~ܹիWoذӧ8۷oɒ%MGApܖ!!ZR.M<8pѣG2gTˌ Ѝ7|>BHOOOUUUYYY*FGGD"ahhL>Y^^dɒǏwÇoڴi׮]O}?~|BBӧ ֮][YYz䉳#w܉9r[PPjnS&-_|̙k׮e0.]JKKoBׯ߶m۪UX,É3**j̘1ӦM! Q& iS@1YtHW2ݖZݻr [Hlv ^BoQFn iJLE&ޏrܖ mAyjkk'OdݶihhGs[HPe-(J3 Zr.pLW2+** -KR7o>xdz Mi8==P~~>QNNBoY ,ϟ_]]. M+ MiM3 FN4-! Ѣ"o߾]YYvZ___XL˳:&7o̙3ar-[K}8M( O>psbӧOB/^3gNpppEEE||ѣG^ 522+++oܸZr."""ZMi?իWYYYw܉>}ݻӧO_גiii999q[dniiÇ/_, ě4q,>>~СA?YfMa>>>G8|p.7ov ww!M`͎Bĉ[yy9~1tP}ɓ'9/-//766k,|/FzzapjT*MMM5kB0..*999!!l$|ߝ;w\.y 3Zt[FbB(..N*?~\KKKYYyʔ)x|XX\fMff&BH(^v̙3l6d={秤;vLMMM__Ϟ=' n￿z /_z5q{ŝ;wZ[[޽{qqqSNڵkʔ)JJJ&MB}׋-4hѣ7mRQQ)--A5f999SNmv|rǏ+++pB+++1jԨ 6sS52d@?_q\oޡż-N?uT``mhhW18Mi8+;iYYYm]]N ߷o߂ |}}9}֭?b^Nggo߾z*99ĉo჋ NLL/ mئLg 09J!Zt[iL:tɓ]r+**j< SYY9o޼ׯ{zz*))>}|jI ݶi%Biw!M|֬YǏ>}Ç?~'m%T*7nReew}ru&&hm!M iUUUjjj3f6=zt֬YSN]bw[8rȺuX,֮]:<, x&8&ddd4m3 &e-0t[j4q@3 em!M@i鶐&4*$@xBBB[.ONN! 5qĖ7iÆ ][Jv@JJJ"o0@.ݶ?744|gxw.]***ZjP(JIIs100Қa.\^lYuuuݶ_t)##bfff.\`87ťq͚5<{-ׯ}666vΝ,]ׯ^!RUUuMCCCr3gkhhTWWX[[x/_oٲ!tM6]p g"9$%%} ?>k|>ɼtH$"^|yذaRH|޼yʊ @xxyccӧOnII ^:Ap8wՑ  yqð`GGGEqmCCC|Bx/***--E4۠mۆ~Arall9ɓ'AY\>cƌuֵ_0YzzL&JRÇ>|x}UUD"p IDATIJJR 'iK. !!!...8G)DcǎdD2hРr??xT\\`018O0 Ldd$ڸq#㕕2d{a@+趨+))[gff6޽{_~}}1}}} M]+,,lv)A|>'|4 .HMMussKJJ7ebb Bh1oOSSSյ4QEEmH$p8~xyamcbbd2YfffTTʕ+5((H,D`wwwSSSccWQVV9s&nuuuUUUA#V\ye|o_*tCnOąB!~"Bvvv+WfX]\㝝߼y3|pnamb…o]hQXXܹs 2d˗򨨨1cL6MSSǧ\`9sfEEE)))\.Z[[O>?B3g>>jjjL&sǎ /_獏WSS UQQ=zmL3_u &xxxܾ}!-- wiӦ999 }ZRRbddZĄiŅڝJLMM LHNNvwwwssKKKKLLtuuŭyٲeVVVϟ?/..4#7S_ Ds&yyy>"">777<Y|9~,.Bё`̘1OWUUٳ'Ovssk몯-[cX~Yh &0En i$H(m[2s94qQB8Ҩ4%nB"0f_pɯ`GL6ٳ}]ԃi,)<((h齽Sh23 S͍H1Ds[:GFF:99? ܰagԩSNNNglN$U"##G=tPOOOXuV]]]6w]qY[[[---{{{l)Zt[xɓKKK;L rʝ;w|~qqYII7l BgΜ|H$ ?>o ݖ>i3gtvvg-[T7ڽ{ʆ yB'Oܽ{q㔔<==g̘q ``EO8YIC!cccBMMȣgdgg [2oooooh__߲22M\xl2MȨr>ĵ|ix?334qqߩ4qy !uuZmEEnn&s8}O4Es[cǏ믿\.BY fRMvLVSS0Т-M6mZDDWt3)|۶m[jp8Rh&0En i$H(m[2s94qQB8Ҩ4i]TRJttHOIIgX:::SNŷ4:uTeeeuԩ'$$p8;wN6m̘1ׯoq,Zt[\?DeeeMB/^3gNpppEEE||ѣG^rPQQfzzzVVV^^^Ѣ$M\EE%''XYYyԩͺ_h"A=zӦM111,G1̠ ŋe&~ԩ@[[P//cpxMMMąBaHHHnnKxxxˆ+Hvؑ,H ԩ4[n߿,kY9񲲲ۺ:rįTTT--G+Wx葇رc̙#XXX*MMMׇV @b&iR4::Z$1 CCCeeer~\T*}eFFF;˱\ h--McccG7N>mddd``vv#LLLFeiiG999۷O#hA6l:Hx΢L4q@E2======{{/-%>Gs[HPe-(2!I$ gnnޅ+**zT*M\$ 482;kN$#(h"bVۊVZ/tꯞUvZkUTx[x !|… EEE#Gtrr*..޿eJKKͼEDQ;v^: dZZZR_XZQQqe+++5-}rmQ9βe˨\++ ^9B6Wu&cǎŋ4hժU]KWC755u*Mٳg= ڼy[PP0p'''֦q\nnnN}Ύzahh.-+$.$ T9BL'm ""111oFmm2M\ŕiYϕM2Jf$M<==֖KM'O^>yofĉo֤577+*#t5;/**755}1!"4JWt߼y 7,Yٽl8sLo/!NT[ο|+WΛ79==]ٳgݻ7,,z e˖1clٲ%<P(++ZZZ4 kt4q ϟׯۋD"$r+WB!m۶[xcǎ㏿-[BCCEMׯ_vZVVրƱc^k.\pժU.--U(ׯ汶>qX,D;vYtNT۾&. ;E"YG1c k^xQܹs ((\R__"""4;v̙3 ϟԴ`WWWTj3f2 wwe˖irk5B:K'mrq㪪>|(mVQQq *ѣGV}T*ƆCCCU6nkk[\\f .KmzXq&Xq8s?\$v!B:B'msQF=z4;;/88"FYffddQYsTF5,٤So-((/1V!5t4q _رc􂂂nܸ555^^^<O.oݺUTBk׮7x{f'O:ߩe%\.f2ʇ"ڤն/@ppX,ʫmllܨOw޽yQFM8U%KVX!vޝHv ٔ5''xP8zٳgGDDtvLÇ/[@ .h~-#P_Aji}yѦҋL;f9BSt,B:b8BhSm1M!DktIkⲺPJZj[oÇ?tPv!#hslé!f.i  m_UN# A4qHuĉ]]]d<ʕ+=B]ՖiJԭt.\k֬~w1 @'-ۣ-700XlYqqqIIIDPD{xxxxxxyyQiŝJ_|yllYxx884qPHD"ex{4?hzt,YDDDDDDKK˿7x\&Qi⪏K*M4K_bEmm'|2wUxeew}H wZ\mu:J4q%6mff#mu:Qmi&*..WlB B &lZ Bum-#h6Ֆ^0!ԊN%C^Gc[LGm-#h6!Dbll҅+++---KKKmllzWV>|p٦J #Geq[?>jfNJJR$ :, G+Ƕ}!M>Z`:((HuVV)SXYYQF)U޹s/puu|q왫K &&9CBB,,,ݻת8WWWe,Bt4qP(֭[zzzT" b…yyy-{{{oܸ1;;رc/666AAA0r;w.]:j*[[ے_~Rو\._hѱcǒݻBt4Ǐ_z7$$2ڵkTupp>}!e2111L&3888$$ŋp>}zb844VVV_;BնD"d. d垞...bm۶aÆQm;wjs͞VVV/V$''_reݺu8B+gB8<L۳gۂ >>tضj[XX8l0ڮ]555T+++_lV+[[ʪ*eTZݻwKAAXXXx<5,Y$>>>88899Y 4ն F0Ts`>>>ƍ+++߿-\ԩS:!CٳQQQ#G2dرco>ejqƙ|̞={޽aaai=Pa8B;M A΢M4V={jbdd7|ӃkAT[zBMt,B:b8BhSm1M!DktIkH$ 㡕 ;:+66vܹiA"֊jۛƌ{'&&v- r9B!#z6VTmQkiN$iB#""RUb1IEEEӤÝj=:>> Pߚ{zzUy{lѣ͛7S-,,TWWݻWN=Ν;$"999!!w|YL'+&mddtҥlSSI&=x@a;۲V655)HUZΝ;s挵Il2bĈ谰0"&2cƌ˗/ׯ d) đn@H Lx6-t!:65믿*PڼysTTTmg֞GCI@!m굑xt!= mFb=[l8N۶ ^PP@DYW3tmqS ٍV>tj{B}m [o%J{/!.WۣGfffΚ5)BimmU)#K W_}r;v=܎oע *y) t7氘ٕR$xop{V3[\:iͺWZIW"5SԥUŎw1֞}39 ^ߓۍrK!{ͤ^6l31rAFI}F捴>j&;Ί.I^|RjA3ᜊ6EN$*Z8,^.U,ڗ!Y4;-++ܺu+:},7X1ccw֙J*N;p{wۮPXpwZ`35qd~;-a[MnrbҞ?d)uN|1= ߜ :`1ؽ}KSTw?@,&cup nft?@/jP~uS[3u05(Х8履D޶+#=x=<ČjͪQJJʺu***4?$xZsdgtBAwKe jEbiCؽF`n<|ܪLAN.5[lM8#__o5M=7t#Hlav s0,k_ld؛@Y}˅'M2B }wi%b=߀zZX 1??lhQnka19zR9:(^)~N|{>g5dW6^XGuaqCsjdp &+_2.=FjzLpXLjV˗Q`kSuo/'| #&k| ;Fرc,Yr% l9z%xI><]]1+#E_&Čr7ˌ/n/gWgOzfkWn$^ҋ:/k?Fó6(kZKzX,Sl$qJA]̑su7WU.i9JN >~4ʯByNǁV%ueRc!-4&Zލi?t衇oxPAu4M\$M\}B}mz4A*Z~o!hSeȨe]@Hw#b8BhSm1M!DktI4q}ѩڶ B@ji!Z͸*Li<}o|1o1UТ~?w5[19|mxoǩn4{Z3UIB4b6}MyNqT~H-58 ٴMo"&4P^ɩVZ$~|>k%bg>9S0!Hk3M鏄f9~?4,sKZJp[/B:f0MWRP75 I͂ښ&YI4zE񤲱S@UE4^Moo?@Fi=[9u9)uz~Ƕi⽚&~)[6FYe pnp;/LGHs&lZ Bum-$4*BFE/4J]E*W[hQԋLFdz"Bgh`]MBma+TDݕ6HC]Hg0֭b!1znB8Wy&WjpXgb|[ݾ}1~+[Md1gb|m.khsl*M&??ےwج $wVX؂-bŊK- @v bٕ;l\ Bm_=նiϿS½,6d JN`kYgecf1 < H aᗯ3d7|}9Azw33zQ\:5kR]J6CwYۮЁ|N!~&یQ%O(i{8Ꮽxl&{S"&.Yâf?'2+Gq2J$;>ϙ4|SP{aD7{+KdEj[VVxѣGƂʁm4$s/_famY z̸01?5HwK `w5g%RiR>|ckDxIEfy38,~]"^6 R)S1bIYDu ^zyI4bю,Ϫm uVF Dz8,7=IbM2e@R9qXns4n~XAD~uj_sٱm%-Du*i:|:k#NXJTG2V\g1ևq4,LNT>OҢ_$'7zۛ<54ϩll9UMcikol"HsH12b3?8Hh[Zu CvJ|kz$77$RBC4Щ4qkn,g2&]2m-$Ie_-I~zqu_" ,>SҢS,ŵ>F6& Kҏ9Wy*lѾ6Nr82{(yk酵Y >$ުJPneoMW_$R$ ^=5if# й4? X-Q$#IRN7k sLxX 5Ur-qF$F~|=&I3^"dn?`daQ,5TL}㰞Kk2͌ X&fVK)0ӊ7 k<Os`EoQOw_mQ\M:&Nf2}mM]H,l8$Sg';b2֞Q*f ]m\)WOҬWZ3H2N8fܚqL\Ye @$ n>u?ĎwH"X\*nnqUsb/eHPn5IIk_h8nKԞWlsB$ 6OTvx%BitlB"ήL&cYYYj/:BH͛<-O*y{{|ӧOhimv8Bzڒ$y33{lڡP(MW_=y$##{_!HС;w(9?4iߵkר+W>}Y^{]v:ۿСC9Nnn&9r~;ydXXihh?LdiiԩSƍwMjSN 80... kii>͍rrr 6a̙...~D"Q.lBzv߾}!!!>>>S 7n܈(//'&&.]~;}ƍT***y&N'T~*s$IsfffΜ9]~=-----~ I~EEE6l`X &MrwwLOOϱ" zږ1c۷-O믿ZYYQ N>ʕ+666k׮ y̜9xĈt"L&ozjooݻwϛ7$O?477wѓ&M*++sqqQR$y<^bbbnn!CW^-x<ӧsss}}}MC]-to+fԨQK,3gN~iUU;l/p  %HBL&̙3/nB.葓pȑ7|GZ":jEioGٳfT7hWhaP+Z:MNNnsz\\\twBH^4q5}c[u\mhnffD@@щ2&I@ j322 4ɴ~7ܽ{)𡧧'-BDffflX\]]333>B |WWB4! Bڀ!-BiV[! XmBH"6`E!mjBڀ!r_H`,[IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-event-filter.png000066400000000000000000010727341477354127100300460ustar00rootroot00000000000000PNG  IHDR"gAMA a cHRMz&u0`:pQ<bKGDtIME; SIDATxw|^uɶ 0`l0@Bړy!Ih!@(!1\-˖-[^;s?F֫$!\ݻ;;}Ξ=F#@ľτ4p !H~8H){;;K*H$D"|GV !B߈(U<m =j68"ϖRW:=67"ZigˤD"H$D79pF]ݻwoeeeuuU*t:"5k:::li8 وb>}͚ + O$dR$sLszL&7]C_~ غukCC'%D"H$3\ܲݻw0`mۋ/ӦMKR1˲\=e᧟~{|iF"'|2//W^>|S%N۶97M31*";wv޽o>x=\y. B|O:$]3뺪~l^xg}ݛ?bĈxo>,q'O.d~@ F/^\rɒ%KǏ?}[ouС]ts\TU2dw}EQXX?vvvs9icƌn߾K_R 8Vf?]n3SX>@ƓPJSԘ1csq\q+SOv-"p>"#"b֓d^^ލ7X[[{kvD:"]UFL&5MKR'|\C4ql68%D"H$@{.~6w)Seʕׯ3fLaaQ[3Ar3g?oO('ODN|>_.u=Hx<yy0(\4Ƙdq4)>Ź{'; D"H$3Cb_0#-p8QOps<۵PJ@_-K4*"n-E_ Oy,J UJQ4M***3>R%D"H$@H{{ÿ h۶82]"H$DGf:>|]$D"H$πu$D"H$@uD"H$D/|R"H$D" wD"H$ j $D"H$guy%D"H$/$Q eC2HSQlz0oϣɨo $N8먹="͏J.Sa|W"H$Dr]lj&c,J9 f}&pHfY;vX)|ԟN<*~蟱ǥXD"H$H;Eikk[bu]GD˲4Mm{͚5>Ou4)t:X9,0 ι(ay\XҖ͛7wvvBRԮ]([UUc/onnrG9ck׮UV566׭['ia[ݻwwww ;rƍ~DNG)r;vزePWWyD"q؇ u%D"H$# wι-Zk=PhVUU_;u}Νm;L8p@} ͛to[n`޽K/?VZuWرCvڹsvttر[omjjjmm7޽olooqMM/˧z ͛7nV{w_~9,]_wy'nڴi2̼yy_d.+t("Nr⳸a'D"H$pd0R)gqFggM͛f͚\.wWVVVyR)UUrܞ={vܜH$.•+Wn߾?aEEE8>D%?i\sMUUլY~ӟ.\~ 7:t7 K.ٽ{w:m۶qTRJ)UU 8{VŮN0ꫯ>tvi󟛛5M[~=|ڴio?V;<3O9?Ϯ뚦LUK.|c#EdI麮,l}hX7D"H$QBeR3455}{[dmvW["DUՋ//߶mې!CL2+))!^.䒙3gs9'tR"'#b{QF͚5 !iTя~g{u]8q{0ngu֬Y2LE҇~SNmjjz̙Fzyyy@II%\2j(Ƙ{[^^.v>ath{D"H$r BH:ws2IJիWoٲs;s|Ϟ====Lf֬Y_W8tPKKiCME{?+"@sszFw;ɓ'뛛 ??Æ +VF bOOOUUUAAAEEEssER z5k466[NMMȑ#{キ~$J:t( -_1_K_82E"H$DrQ q**--z1c,Yꪞ@ PVV&Hf͚uL&կ~u۶m CmTĥ;r\^^[Ph͚5cǎMR c4Mعs'TVVΘ1c…#F /0=555?C믿qsYlY~~~gger+**z6nxf: ri?~ʕ]]]?۟]v? BK, 7n.?nH$D"||~;H{W"H$D"HCD"H$ 4%D"H$/*g T߄!CD PϽ'Gqo+/:Qpn%Do w Dt]"' HUU?~boW#gˀЦOJӴvHo7}ĩY_ u4C?j 5v,ϡ?cB$XgD"H$ǞABbXOOOj'O4͂u䧋#E =J}Z!h4*VO]t]5Htuu}4M4-|R| ?梈{R"x'@>syO;I!|>q{QGr;::2?eK|>n!A :/Jiccc&XYNu$Dr9pW'J~ڥRJPU`y777sν^o(TVL&ҒO.撒o.koo8pgK C eill,+Ƚwき\M@A ! ߥP!S5;ofRD< "Y}XqEa1gY}[nQJY}⊪''?}@cq|oEvD@t:Q=Sl ~,"O&IEю]ׇ ff(N*]R_/#I}|۷oرRA;B"H$pDXSimLDKbf]]iPNxSJ[[[<' i8tX}}}qq}{~L uuu1(NE8TSSS:6lا[NCGUjM]M$H;ԂyQ=Մ#V8 ˞ >?#JhMs>j;dgz=^/v-"R9Jh& }|V²?Qc}&p].E2<d\.'(J0dٗ)' /EI}%ݞ[bH "c D"Kpw#<}kj_pF !@ƘiGOsX2n/ >hT K/ض5ٚeYj͓b)9_Qb)ThTjޔJUK@M TR-'"r Qv޽nݺvidr…gr+V3gΐ!Cݻv9s 4HT… 'O\\\`#F̝;gC 9a---ov*:3_~T*eg!⠖/_>w\˲DcXsۿҥKM6u\rΜ9UQq0***ÛNj.s]WuFoW\!lqEQTUL)]~}{{{aaԩS5M[ק?|[hѢaÆ <8ɨ_z饞ɓ'Ϙ1#^[[+2|N:)N۶mf.ۿ믿~W?>Lz^u_|V"H$#H߳0:97 4߿_40p$O4_z\.gROLp1?ŋ7m$ )@}"XOn4ͮ_|Ѳ4QIgr#nrCsOy *~37z~Yaߘ7# =))>՗&'&*xFތT657ln܉F0+enjjjx7x466>ޞ6… -[͛7_wuO=رc[oe++WCV\f͚ӧa4hPYY#<">u]'"! .\teYw_"~7mڴx4͕+W'aLL?㌱ݻwMMM={lڴVDTTTPwyRYYnݺfUU3ŋGgϞwy.e_)}~)?䓖e1Lܷo<̇zhͶm[jժ]v?~޼y>`8޶mۣ>**/qC=c:}/nJ$Drg"^xl~#)>ٱcNj/`^ziڵ0Ǝ8LRod?t{ollpDn_tEEK/x_~yÆ +Wo-Zi~LYJQ4!r$2O.ԢSpoRBs=xrr|>D"_~Y ˍ9xkkݻ1l.))Y|y]]]wwwkkwٳg]V-[ѡI' ̙3pu.,͊|^:͎12 ҳ>O>1,Z$:4 mݺ16iҤd2)诿zggs==c7lnnnoo?mۯZmms=N i& uEu}c?\i}sz,Xp#c%H٩z 8'N<餓M6\zwygWW˳m;Jk֬iooLӔD"# 裏.Ydʔ)W_}uQQQ6=f(dR xT903̭511͙3.u])aNfDPeqq]?۾}O~͛7 <7|D?\MU xnH k3}Opd뒃Kv 顯b3 fdl4dۢE:i%3ɹes}s~zeOPJ}k@)>NBH<H${b 7ouyjJއ뺧rc=vI'_+z*'~ꪫ߮z,knn/F'!&O׿uifNucXKKː!CN<]vٳϯmllٱXlذa3g Aɤi===ogM(l7|uuu7 ]r@q,kÆ eٶH$dӄ ƍFٶmԩSowY"H$~T1OٳgŊ .=qT*]ϾS>lwf2)SL6+/g WS*]wQ?#@D0xN8a'v+??N:i޽W]u4Ls9Æ c]z饩TJ~// !$Nwqw}7!DD^uU Yx#sW%۞|5z Txκu\ʠA >MGLVu]:ѾcR$ Ϡ11־t'0)2iKg*U{WU}}/_k׮-[9_3r\*d2k׮5 㢋.:󛛛W^=rȎիW '?۷ocǎT*D mmmz8^zi<?tP,B&NiӦs=7 btwwqE]DC/{XŊ/#FlܸsÆ {04l*JRF9r3Ν;wkuY˾͛7K_/*H$rEx5xl6[TTt 'L6 aRO̱\.N=?"RݝdGapBH6be|8>sǏaN3 =Aadl:D"~_bdYXAAA0쓮0.ǗHT|Ch֞=o׿m{D{ku[lwѶ*Ѷ1oʹx.aM{-hP%ђssh+veg[޾&Zu]AdiO ȑ#[[[;ƍiooo7n\}}@`cƌ2eٳ^oUUU6ꪫ~kjjN:3fDQxv9hР.LӴl6;cƌ|JQƏ?s?^]ݲeKqq_'Njժ:뤓Nڷo"Wpظ7W;(JWW D"QF@0,///,,bw\YYYAAA P%L6-͖^TT c ۶C駟.nbP/x(6<~Ve}59̞={ƌ D"SLqO<Ńp8f̙s9啔TWWC;0|+?DU]TTt@_`D"H?:zss3GxtD WWWk&G]EQ嚦E!C|ZsP%D"|X^QT Eٻwoyy>|UaFR*RUlvARFyIIQgao\ڼd7TLL)jvӔPC18r*RNҬ!@4EBF5(0ǣ{RI;mMR0(hg퇿ixcQ_ιT4m 0 CD!hrchd<O&QŲ,u3iP`۶87L 8PZZZ^^.䧭D= Ə߃I-q΅#u@ & 8Ј˲LtG6J~&ضb'C&M_pUD7{>#H$ m۝hw0t:xQVx&~"VP($=T@DUU{zz8]]]vW4o/!yDRGY}>#jRUU]Elz[NE8 BH͕EH#GHa (9ȉy R}RBiL+T8SB} .)PJБC57/O\opx2}ߋrg}Jk >`|I߫Ǻ$D"pΩ Vni?QPPn{{xUxmkk]r> #i3z^^}i"/6)M[I0L@ x˫oB"}rG/<݀IG7looo zHD}u }G}@wl W'XD"pDgH\?R2/9ߎ-}?)eg.߸ jɒ x&\4gnOoq,V"H$fp{{~2TY>S||B!,cIL"H$'H9ȿ^;S7\DsAgoH$Dϣw˩1D"H$Dr7ӅH$D"H$'𖠚 d3;݄O+sTą@J߶B/BO>OOUw[ఢG ~v/P(N%_3?j{ݚE"3g~XOKK$ɿ x~#F(((xwx׏;u];St]kze?_4x`ҥlvСbŋ|C )**ڻw~h4:qT*KtzUUU>ڵkL_eʔ)D{7og-_H$tժU-// KgώbP-[fv0d2X Z}AQ뮮_~sٷoz3 {n[[xU)KPUUW_-|"wޠAxιSN Aw͛78p;|c}WPPpyٶ]\\|I'ٳ4M;s:;;>\D/СC}QByW__/6>?._|ӦMƍ8q]***Lo~vz*ӚGydƌg;#wy@`РA_W.\y]vtM=P&ikk{7jjj"՟}o;8tϲ߄ƍKӱXlڴi0|p!YGiӦ!Ca˲(N\lY^^ޥ^Ng͚5o޼~!O8Ξ2eJII=ܳh"Ji(s=w駟x≹\N\ڶm1bꪫZZZiZAAH"H bC]~1cL 2zh˲jjjN>d9rd8s+reM0s>cƌkɒ%b ضmٳE&c˙9tP˲`ܸq\s5ӧOwg˖-'xb֭fưalvXיD"1 ;pϞ=<92 OzGs޽{ꮹaĞuY[f͚?,[L;wlnn|WUUE)}ꩧ6l zzzΝw)S{.^[րRL&oᆹs&Ic)xFFEQĂ(馛E_} 6̟?Ūg?wؑH$4455js܄ ~ ,l6aÆ.(J7o~W\ Բ׮]ǟxm۶KqD"… kjj~߈>Q./SN9E ^u+Vx뭷-[6eʔk.Zt) 4{ݽ{wccxeJ\_G|{OٳT<|Tގ/J$MĜ;g͚ugṴ/g曅) lܸ^xq&+~_ٶN:;syq;x|;Xlя~4~{=kW_D" 'cq…|… +** xa%ry H$'5~4QCs?'D/?4)QsfLܾؐTԷc~)|GQ D"B '$f r:H$_,3eZ(H$D"|D"H$D@D"H$b#u%D"H$cL->cf aD"H$DI86ֳ_={ĎǺ$?D4 vvvJMD"9&B)**{lVms=O_{r=D"[UUU5\ND >]wu7{*3fu]'cD"1(ʲe6oVw3%H$q8iڎ;'9X*+Ce$ss(8b*v]Wz%u]M3]xw4MwD"aA?UU]"H|&hQӴP(D}I&T&R9%H$d2cD"E|ƁrСBUUv0`Qoy߿D"1MSZDr 򼼼`0~pG@߸_D"8: D'5P]SJ$1FK$1)9J7D"H$DID"H$ 4%D"H$/pH$D"HH]"H$D" wD"H$ 4%D"H$/걺zEE %@z""'Ma D# A@9 prH'D H)% RR@N(9(sBCB)!  %HP!@9NBPΑ"G@9!@Q"ۄ0N A@@@Ad N( P"N %ADdBPD@H). (p @zkR #r9p G$H)G¨Bp n\fNED@ A@ p "*\!ޟ A WRFN8!@8pB紷SD B !HJQ2aB#'"H\'D+ ?eTl@D#A@)PNN "nH0& E^ ϑAK]) SrPEQJ8!6(9(RF8{ 2J #p(PB@o#%"AB'RNPah % !)g( ! 稈)H HbX#\ȀPQ{EP[G DJUqB9AJD@ˆHPWP@T (s wӐ8!D/SsP  'R1aH Pʀ !;@N( PʀQPNr@1;R9O"rw pJr}WF EDDÑRR$ 88\j@B Grx@B \! " Bp1R@D8"AzxD ar$(fJ@ EFS  "pD@SDBQH) wPSpĤ* bo D!wCDA'@(@BIw`%zʀR@@,( 'Bo RS4ySPsԄS'" P#' H8"$@#@ pBs"ѕ J&7f(! r(NňV@2 0137uC]Vu GtZVƌjdmI9%3;=EŃ6 -0c ,UllGXiex5oշML$m׮4<*2ԡuͣAOn/m<k4H-"kʎW]RP(ّQj0R ӎᩏ׷)L!ь6/Ѿwv;F&򍺒@ɅI?UVZ79[n,weZJPHzwIg5#"4|Մ [iN(]K܈[6-P청)ě7zv#zںZu6ks'5p)j]Yv5Zm5dE;AL|vv,l+lej&f8b{//;GmlSt ;=ti"5UVWZOiLtʆU"['4*X [7?4i+w{R征{&_vMQm-Ulä;Mm,{)Lk8{[E`=k@P$߻[YxJdubcsi ;!]V[k wpXd3R'iվ놦{J+_x-bfR5*~`䉕UdJ3'>hy9Y"Q5#{ʠ10iNQĻNvwU^9Uw\[ts[MV˜zen0`Oӈ!P5qb<vdpR 3Vt +mZiCcidpWvL&آd cey.{f8mu'vk'6WVN ]1:8{2 &;z!X{hﴇZeݝynܳ|Q03у&b@c|EЄ*ޔ`WXm*\r,А0y&-P̈́ZAkΕᡶj)#wtE]'wL{yvڱPx&y<|C,x:Z%њj`nd(`:3pn6qkWi]nhJiOZ3]ƇȆ+޽efE-#C{x`=3;sG-ռUrhlDG`eG \R0*<77G妿cC##I]#2wr"Z6J6흰=Y*HīCڣ7˳@m=4ҼIC5G:[` Hk*1u׵QEH0-O挏ՏY(*<⯫FR V2󴢸3-?TKVvmiHiҰ*ٚ!djL'6yN'0Ѷ1;NpI!_UQ~+P+dzS>(%CEcviD|G$R7tdgmEBmI"VŽFUG/]|`+x|ƲZE&q0d~.ROkIU̢J-?iW FL&atØdMCL~oP*,3#\52T3^_$^l9v~oȶ]aLk{iNeL4}^{wW^`*<=1^u vmrލ- Q[rr2!~ogD> -]ǺwFlٴEy LMTҩږLC?}ޱ\蓸̕믿$ ˲lۆO꧂#lJcm|$|+_oxrmO*Z:{vȧ4z`];TZχ՛>gLYlZꃹGRnvy[27?33X5 B2+~s=ybG"ǟq~˛+}w}gמsoY,xWk<ˮbNz~ſsCsyh_yn[zkڕkNܒD?2Ѿ+ sÏ:ڿBg끿/Y/a'vAӯ^tKSY^NͫtÃ~ͽv=z[)EڗBuF]ڪΓ^{yxaӬZֽ0k6}s/YoM~[a6y[Z}EϽKeaoHm{\蜑O6^k񽼋pؚ[U-,g7[_Վa7^\\x/sߧ-YVisǵM ﱺ;J CnدĮycMȾK^bm,8ee߭n;fSvKk׽m_ߙ~ho_ w ξ#޿q̈́K4eEGY]Ycw yXY 󶧞WucoMٻk׆{ l.g^z+W.{C<Ј\uխ] _k}lSTw^'unHXkFxgYϳiEpygs}k޾{ ۺv3~r_{zaKz~|Ũ:y۱~㌗P{ikofQxх;o}n_m-oʷuշ};:.yo?ܘ|gˣUnumS޹sO~PfNb%/m۔ĥoܼ? !ם}w#q[G~}qȈzzYkۺ@_rgDزoO`]-?8{W[Ȏmόc}X[Ƥ}~(U. |m3xwΛ5留޷nŸ.$gT7]IUςjaS?9_W7V޳-qۛ s<'tsߧlMKZ/WgVqƣe'`>?<Oю?x}տvu㿷t[]KSm.km老7oȾz^<}ϗV\ܰa]-0f/kw7dF^QWG_gcg>>7 <7,QJGkuK+FoiiXv2{ ވG횗8_O: ߻vԆQ|ݏq^kn'~'yw?xzmyS?3GPNx "X,z)pb`+kT2x|DW bSӤL1^0LU ي*( bfAM^b PJ|!ig= /x@ȧx=f^ /Ѩ BU "^Јya?jG|y61U/XMQ Q}:>3Qm{&lBUp@oH$D4 >&GvPBu#kmЃ9XSC iTQ>-jUG7LCTW^ ?y ߴ5шyԠj9^AjZ!`I;⋀aҠ+> ۊeAiQjanhCWI붭jED61(4ٚRM[STUU46,= ^ei~5Hk~,-A'L|,D|> i@B@kRtPlfy _Я[ U VS/Ѭ>*Xx 3HU3 ^U,0=x,O[^=A UUSm;ji/P&굈nJ,(OnZ04gfMSoHU x4+@2Uœ#g_CЃ4{,VV(>kPJ 5O(h=7h@CT#!QЁPBاjEQmn|c%襊JAK1G ct_\ WUuF*$.ۊ?@R~&^S˘UPk0eC7^TxB^~Ca%vX ]Elg{u7&b^ԧLW@*p"aPiTjBUo^SoP7ТAP&D4;YY*~j82 L=SUUmaGg)DAQl?QMR<>C (4H 6]7`[Q lKW|GD"Vw҈?P @G^ T-4#a_UjX(y գ jC:j&x̀nv~B7HLXѵFtiPkA5L͓o CUug Mi bWCQUMѼFLzETUQZs% 5uDHosůuTJī{-RŠJ)A'j屵?B|Cæ4Ok$i =a3t-O )T7y@ֲ5. zZ(yŢauG BZGUEըچщ e}$vBy _дM;+ լCШkpЂW7mSjzJ(QQGʨyͰ-UB |īuզx'tҬ<L6L%'*&!zVM|VR)>3g)!`X*RKc45UuEP4`Pãy>g^_(~]g1 d[nZ0S,Ԍ3( akcy S[Wy&TE VZĉ( zDx4˶#,ʳ_3xD04=_4T jPCT L#ߠ^Q!@/lK7T&{"(7e?c/u)cE!s\]!sˀ3:Cr02G1@+sd9g]`9. y﹌1]tcUdd829cD8C(\1`EDd] H]Ȑ31D8psC`!3!GƐsEq \@8q@D刜3 8(pEƀ1"RD]]%3d80Et].8C0؛<Ɓ s\b+2qp\s3䜻DtQT.G3瀌3@Q3t)3 Pd9gs 8"G]cA4r9rG#SpQs3"S8ȑ!Y'E." Cΐq q 9=Td,!c +:#sѩ HN\hΐ#w00 "s#.\ wn>Q{ ;#=] swX11M2[h$` x8Nb<+deDtSpx-FƘXQXmX+G 9㌋?l. %-999|޵ .gbEv9]\L-\,e)r}eb臌cbȹ bf rt9 Ī+."1rp 36'c51q-pSJp?#lta^oH$D"H:[&IqvYQQn:t:ŠWP֭[sܧډ"$-ꕃ$@(H)!ȡOMWRXu9EBp6Хe@ C~3 #6 5:{zUď'\2m] rDB#P9hEBZ9RB*8TH7 M\HrX!*Z Ez)zՙzԄ ʑrD ^9,^$"(;z RAh=D $0)p"%@tAB{B+o %8 9 ICP @P$8 ; Haȅ( Lԥ(sTPC '2A8H rD B)'P€)9 -ث@8FD P;Q DBK0э PDF#S8!)QBLaD]rBRD a 8ᔊKNY0&R\A /h p!!)J@Q0#S{?A$yQB%d(7Es{[iG)猁 .* =,m&֐` B89?!q9+DD*!@^J1A?Ԣ-dHŗ&z9Dba?$ȅ%dC@DV堀Ф@PBF90+dHp TJ@ *gp$LT! ȀBtS;|i{s*Bq9"&tD(6BTXo -H&nA&bW1?<5!-0JuU^1d! b"I,CQ9%m2b^$(€)0 8R@Kz徑'K!FP!xʡwMS#M8r*@0$ኣ9eδ'ȁ@ ff(2ԥ\%I)HNFM,*4!iS\WAեH R!s(,`FLs88zBnF5M)㮙rd; rI7ѩv+PXHTMn(6dtg͡2FM =щʝ蔙nֱr6Gg8s\IʁtP,a9 'M @R2F:aI0ÁҴx8`; z9$2,1H;^W:u؆ *cK@ SqpUk`a6 QȨ4 8J]@4ra9BTLPT`)a: DGCA)\сzLXT1i 4檖zu@iGqyiN4S A#)o=ɜWr_6 rUnQl1 !9T)IݵP%nu^$* 0i.:L 4`Ed*gR99gj W-RܶTIڮGb$ug&uPdΑ 0Ph(;ēN PPͤ ,1HEtpsV.2\hNwCɬ\A$m˙J{ɓ YYauIڮ?YZBDʭzhN~#nd 蠹@BEɺ&QEkQ7EWD!$HhEUr,AW҉lHs]eճ4H( I TOR,5Ͱ`̰,QRfN-,H;e1WO.r '@lUW1Zu0 'ADRK j,\ws:jބpsNup}7=B)z1rNe| C!.NxNL]T He9!ʳ3U $ͪt4bqŵ$%sKT/0Pr7eԅOiģ)e3Uxs0W&fY( ޔj QuQ@jRUͺ a @%cr8禫cg9W 劦iMC6N\ JThFS(RFPC0"\w\U8U` ]2ݥZ.h Dr,M )g9SA),Cs `*gjZw5#tե$aA"QU4*kA"AtN'iIBn-aLq\9%q pGaf=H,먀 WD TN 7Ҵ]"BPq 9TÁ)JOptU!SQQ[o=CӧO=z]LӼ+^|B9sBoW_-***--'Te5\'VeX4ngzx 5> Ӯ+s_(R[h+ ;]uWգ\V'kԪچfCFtn9y)38K 4}Kmn@[cv-l2:5!qRb ;Fqc|6VӖ^ fioβv$f2`OhJkUۊȜ9sݛ5ٙk#X7߭edװ? 5nQ='(\6t c_Lv7LI%"v\_]g]jƒ|EԸo꩙.ꈍ(gFF{g4m]吼Hΐ=Cse:hc8P8Pu=ܜܝ;dK6:4mEM(;?ؤMm86\:P9Q#1K;R=W6D=Q+F=#Oݪuyj.ʶ%};~Զt(kB<5vXsyvwAa,фNdgalk>8>@f(~j$YioM<4^fMʍl9cK̛N/yn:I3q 5&PX╩!U:~qgi.z >rNrL֌Mшr~͎C;zs,Yb5@lrEw l`h33c[lΠcX0Ѭ֩!wN?.G ;F4{-ԋnrf7i;wVXWhHէ޲eNrD===uj)]śNx=8h@ep!g\p8[ꬂ'Ժ&®Z xݮC_2hnh5)U-4Z]R1E]y׍ZTJ#S|M{q%Y{C;.O%0dK) OyzqQ;]|Z5Hm o7W/66>0[?arGc&/:9=٣6a`6RV5϶vzqM+ԡ~`qnV } oȒXUU֊N'M}d;VRR;|3l-*V}a;~GtBuj,;[(i>`[[N5]S=džNd?N( ឦC3ρ%BgFrwMn?mw͜%b[*/.[:ОBZ--j}]{mw9tls{SN-nXmcfY匡}h!vs9#7j~+C1:CMv3?>xS_T;GYe'%+VOUꢼRxjf̞o xdI4bou5+A.}p߆;q+WwNΊnu^יݫު ;wnn>M]2$ z{yu)iyv3mɮ]džJWO>+P㾉bw7Z)jzڿ:=#*ԣNӸ72J:ikw~XoԖ泲:뺃Ǒ}a{}9VWkmW_Wt ։vm+ۍbuf;!mg+J,]pYk^& XC7lʵNYX[}: Č@^k䶔5qs y[lo ;2K>nc͕VӮj{@eOz}H703bNƆan5;Z;]yBEKֳ#_2;7ɶMmv+/V6N{F4wQ09V;ʍEV۷MENWĒ5o}ٳpJ`ߺ0MtQ4| ͞fzw^pawjFY}Xػ㔭cJV+{ R9%\PX5lltAiCu/oFOUPs346-wEc?Ё5ߛ9O׏Lc262fWdkŚ57\ԓOı;*snczOvvے):L:2#]`ڞy]u H^Ik)/\< ~䚖7oF&k1 S຤ϲc8GvuOx(0Z2ꡦj[5'c|èǛ[ MZkmi=bFrĪ-A{k&[{OmT*%[:cf@tKY_u}X9&5Zzh`"6ax ߍ7ىeVQWyFgKq!;RemӳoNktmjVPOӲ^ZaߖȞ%09/ڒv=El&:xqaSilׄeh{bkOڲo^6z&J w2!1!d~]yŦA=We_jL lNv_Pd<]@JRsv[JE(B{dpm^k#ިy㴞ۜ,vfL.}ךtrnm ^pZplW"0ĻmؘwU9unro-Ntf'GuUO]ݒ%rc):$$IHBCHB $c $[{nSwYk}%;ޑ7s [瞳Zsͺ*W+/Myccc+V5~}{g۳1Rw+J>j syd{M)޴Е".+kX۲5N-_>-}r_o\G#سюĆ}{Gۿ zܲwI_Lt-o\پrݮ=u־uuNOo[k@ss!M{|N~>#| 4 |-[#+NhZY?k΋~}6u#byS[v5,}U {/ ܎IDATk}Ziwj+7W:sz;ϖg[ -;nXuETn[|t[N/lz3ɖC_P?;X<7#ZC+/[J{I_ oxZx`G,rx j ֚qnN&UVAJOCw'- ^|~s箞삙΅] Fuzi U_rd8nyvx"Yju@/=_9lzkgp)X:]^i|וKyMA$c`Kq DPh`ӗ{_+yϑmo[ש.}:wO޲uމwnX˫~5UE~?_kط蒙''6Cӡז.(-)ȡ*'f,qw.;mZ~0#/oM>v`u1벣rk:*{uo\9Dzlʛf7cZӰi?"fOfAy_W>psla+.:om ozat񐽩Թl#m9;\xΧ/޽63Km[`=S$t_pA]֦ VԻ.VQ=zmZCΔP?M=McKlޡAhTyOGv??[_=|Ҩ=Gҩ7y]⼧URYۗ틭5܎CIL nEPtET{{iqk͍LsR+VՑE֏}Χz?8TJ3[9_)]TטV[sؿw^sw]m}Q5vٍ޳z_فCKY _ݷ|j|^6>ѱi Ԇ'WXT/ݰ=}w?;~ݠɶ}5[pK_7?d鳹%=AێtvUso_hTݰuDGV;ݭ~Zw'83ڵ]ө+;;y?j[{rG&`kLeՎwB92OGV/+6#G_Tst?'[[,]ֻckmHL-7nx{ςr!Zv_q-CnUS-0tK[mmi>|UfV&gwƦKD] V49[Gt%0o_凕GwUٚtŸٛ7zjmz5S0wn;䩠XI׍ -G[7^63yc[DɆsg 6/_q=OΦUm}'l?<Ӂ[hRwmV5}퇅_ = m uI -L>|+| *71%Kv?MU4ݒ\Kk[Sd6}rѽ-g_pJ^S]S-X[^xh_ +s3ӎKr凎]g&bś-!sw^s|{Uڿ}d˵_F1WOٞ%guzozCg[u.7+-/NZȹ7RͲfG ㉖eSqN|uc SOח§\:ӶzGmA 7M"oV_BSJ糷/XP4 ẽ_}١C̼կ>f͚ ޽^[nɒ%U^xcz{{V\ sf};RR0cE\1*M)T G Q5)P GJ 9%J |r=iXl2>xs$&du,P@NԜ:2U<+MlY&3`KJRa+Luѐ6M%ծ}C0H@>ݨ"Z )I$(:*.3,(8iX$ NmD2\3X]&c1KC.Qr0Ҟtj)BNZbI{<ȓfb;6ERFVE @ DKS62 F"$OgMj1,chDq #'m B@-j R'd9:X U@بTRĚiE>VKҪ6((+SJr`JrG68!U1w"!B2=p ۲Qr1#wLjZӚo|]71#a!rY uI3>([Azb9ʕ5SP+hKYU&g}n"q8"qH]G!IRDD\X'L'mVs v:lʳ:cÙ\`TI Yj%pRZBb$reȄ&(i%d)Q-0$Qu&Ҏ)qpL]Z<@deGB1vJ'y$ú9X"Aޔdz1f]flY-yI)Kc6Vʍc\k iD/2 c#4 Pea Ӏv0J@&P"8;l.qj6nsnT| 8\r"ud\E( (ZRq-uI lAs.- EE[`-;q,jT2)@yJʒkpD+$*l ܪ.kuhEJh43 HOJ0ȕq4AqթX>S. ]4jMJ ,iqb.-BdHZ)BX`!Ă 3LdMa<.+ɺAKJ`$IAV@f$Ȝ/jҐZ4vgnLU1N-6 ːhZ"2b5(aEH4Jd*BO GSbXq3F.QŪKF#49U H=٪Tr5 )ƵX00JҊDxeť ʩoncmth)VڀA4hWT*EB[lP)D`a:۶!t0FqF%0Th FYdc5 "aW%kX]GTu@@Kmsv̅0L/T*ZAqux.b%mHg S!4&2Y"_!al)U^Uss]S=BW0DXUݼ>W3ԨMJR6d #JJ4ZgD@ƫ40E12)IdJUiEZm1(MF e%RR @q f hc2ic2_Z)ԀznyD@2h"Lj 2RT@ΐDT*ݑ1iʗa8If~` BHDk9]5XlNkڐ0,,%j'f4h3XaC1iB4XѠ@ ΐ8onQa~C4*̓6 K("Ai4h (q@RM (F"MZ{eҠ qDad`hM^c2*&d e,TM-(3dRgUV&E4iJR)M 2ěG2F&c4^3*Kv P3 dъ!J5he(CR6`LJd4 )*eKRJ#:2hA+ dhMZ&Plׄ2N$ȘZg AWMF^3Jp}R5ï*F+uM6F Rژ`&cTd(4 Vف"ThBqIe4tfER(3a: 1Y2&ÅBf(2ll52Fj04(0Zc2YhFIQ@KF\)0JiCZkm6VF[1shVʠ P!T*-ɐ{Y kNRdJ)j(5dJQPZ]]hm (:F2o6i)͹ iEtFƫV`RR3{ƪT$D(5dH2LghQcYH:.i53H:J!sl`"m4xͦ תaՌ2h@i Y!&kf^3G$ъ2(m2f{ ͱq(ݨdRoeA6QԘ3CdFm8댼UV!f3)QT5 qJuԤ2eJ@3v1³R¬g,HՠB2KEQ7ؚ>}$F%q!M ɀiDl# J>zf7WZ}\r H)[n[N;-oy[ҸD$8Hf--`I2% ͜ c6Za"2t;g_CJ 8] \۾\G^vs(넡 V`iv2'|*#*l]'(mZ9m)Cv,f΅2zR{<ْ-rʔ< BXad VPwVn-y?`n;Jݝn.oy20ϋ/A\xěB(4)G抮c|)b3'^7A-Kˉw\Ǘy\zyj C7N/ $r9 \7v=oT58s;~q䃪 2r9q7gWM"sa,9^rX%' ^Ȝ\A2ۮ-߄I\{Z ˇN.̶C_杼\d9g~A69 е9۾W~`@ľ\Z K<-7zgK(X u-lr&7p*; a;t>pܜv+YAW ٲ"2,Y$EX+ne˰ \+x%B[ry7H# ,,x\i BǓyO/:9p\hg ^2a΢E;d"CO'=+xn褭 Q1eY3+7r`7yBEWS/0rU]v * ;0kxsa8vh |h_C)r~' | |'0c?hBxdFIrV8, i9gM97_=N%":~7doa?c/&am1gU\\i5xP*Dr7y;EM唓_i컧R՛hfl?a݂xk|ڨ`՚&/vL+Hg'Fw ?y0ݺ~h9G L;g> {w Y=hzTi}o4?mrh PCݷ(m8V17vDF8˞hcH`t q%(T]ޱppn˗ lzpdϑjI? 7CkK?yLwNz}~oE ϷK[ʎɃ#]6G9Zjcve&gJ~)鑿3?9o+&qm1PAr>:9|HV5j`)Oua`rptS@/:1`K~7wMξtffv?4x 7Gλmևjѣ?{d<; Cw=3m{Ǔ\gCɽ멠(uyiW;[ֽixt}扝eW)9hsrG'};W|p[wO#[L)#gѴ8tdž"9vNvwO߳c{/lw&L>}n&Nxz9{kgCDv`|]> wt#P۶I+aw|퇐߼+'xun.WM ѦC=Gzh'j~>:ݵw ttо U=]Nv;g֯==P޽\4.&>eMlC}[NSc +3}]וwDM^*zҞ#_HJG{Gɓ;P]z4%Óu>݃mtO`GGgE?tA{Mݑ^.סm;ɽG{䔗;])L~ c{׎:cnbѧ&ַq3^!8b'&F׎ұQ9'1'_xc>'G3xljƣo5Oؑ9C}]:Q}vd6Ʀ/+j]=wkgL{>\5@GԎ|g3ޮ3=ꁧBS?jt(;1쁝EgU ڦ'D=S;p~ٷwx?2yS7Tޣvԡ£wxwmfܾ؁Gǻ.0=oT}{|ZiT9wGp=k=K5пo#֮a8VG,o;`de'dutcC}G竝`;-mS8*gRKvΰA ۦhwBom桉c^WoOt}_8|W(z¯; Nh;YĮٚV@?#j259F=闓]'>r{k`4ydx=gH|f!.+(͇jQ}MT6ugwmy FGz *3*жQkCY Dq>]݃=#wFcӏ5o>{ngU3O-Їo;<8-Ԇ;|vy@ Nv?Աѻ b{աuۣc1uqi]\û$ v֣&Ӿ 'j|nlm9`K] 8:_y&4 :'V/Llq::]c&a~Ҳ{ G 'ckbB'/&wq X ;VOH>ZL=ImHLmߴSNF*vk*=)?Ğ0=ҹf+CbfEj 682tkr jX9b龱pp[yzt}kwώTkz {zjЪ-l^9CpLΔ}ptJV;ⲫ_3kL#{=.{D#jރUhj:ĭ#;h r wJcQe#=n<RdǺ՞>폘gZ39{O7p}Gt{ϪF#kzJp7]z"Lb/8==R>I%~o>'J]<(&u*9xF39sB$NiESCfXچJ5"Ì0vpJ Rb&"3L$г!b qFTcND^2IfKAIU vE8xeD~ͺ3SHQ'b8#S1I>TEM O2;`RqJXk`y҈S+؀0A`)ns"ЍJ|$US2Jj)4DB*Y*:0#iGPE8Jn 2;&5Ä nf 됊,W%p1ue,D 4J\c"1$K102%1bL1 (h2a4D "Ž*N"i[X`t:} -& ̹ L :ܶUBb ge7JY 4,siLs{aYx@4g`s,ٶK,'Ez8n+< O/ 9g;ùNr РA@Ry6L LFf:nlsjNIj$񬄹'qƈ8,6҇dznٮ9u@h<bOzDI%0x6ƝFJcv8Qُ<XOXe2D n 'w<>Fk9xxrld!6̓Uk0sZh,dDDW3-Dt, >-H XV梮"srp"EáaޣiӨBq")eNtB<)kD;G0'ut8f9+'b#ӀeMgn \s'TosS/H x\ 5=<ǃcWr8C:,GN3f#If.UQ#On'VԨr |"D/;G݉A׏o Nshx5b~6w0i'@ dKDCYD(QAd4~Al*Q4d'L|a\MG ӞkxR\q5O^ O 4%Nj q|'Bd,K{Ng;)NZ-mxӜ ⤓v' OW$UONr N.xkxpc<էIsi6ȧɮ?E$7K']?y', Sipڮ)`3©as’xE'?btꢧ_䐓bTNkO$bS┤b$v 'vJY{RDbaS_)}9ݿǓNXzqw >UsJpyӂx1zɺR5ۓvvNSK)8R'z$'ԓ>h;xv'%)?Gvhx`<\C8('NI9xOD*SS%pg;"צ PvZ`ett›/mIRk2E%7W"JژR.xtV*hIgk,%qǯc:Q ܢǞT'xAjTGLp1p?O.jK22nm4s"ôYPƵvDŞqd)64\RVxjYFPv'eGZSh>rheuxZ~jbTwIuȡJxFV-ڮz嚶1mϻuSɇrujeG:#-:@Pm*WR T>`(7mKpʗځ /QJ 3:_OsQc-21< ұpa eSg@M-nv=4D83UNLgM#JL@h.Ze.d ;X+Zun#4 SbtNBT{hj=S( ۨZ^ A<^+虜X1>Sz`ZG 8EiĘ&B{9gk-㬽\Q(^TzkRکqկw}qbbU|+:<(%|ժ2'_GIGz('(=u.jE܊2E7*'pWAE HL&a=alW ڹt8amqʥ~2jFE,B!skt5VmcrˉqM5h9Tܭ2aZ3A |l0uk)aQNdƩ+BX+;rҊ(TVd)/IRoqU{L4Yxn-RƓzX$'XC٢/JIGs:JT/Z6:vk*NjStʴa5u)b쎹=L@bכ*.\6MH !4//G$SZez<+[zcgRSN $Ki׶1E˼*paƎZ0f>TS%e, ͫMqFj=SS3V 4@?SmYehJLlj yԤSK%EJ#uֆ3^P 9 F y!V&6貌bR\ ϵcʥ:N%\hf)JocFI_GZ[e"Ny&`x}\Z<61N"YZJaLU]hHO?;$RU345)܊cbr#vlɊQrRYi#)ZfJDya%5VrҙKySIǂ_WkHU*sR̥jT>XVl:. ĬS%#lluI*eW(m+IiOx՞NƂO93 ',iZZUis+OG86! ʂڤ1ϪȨmej~Xhk03#LKI#q!_sls Y~Ƞa*UYVUIVUbEzɒ gu;T)tMwfg; əE~=y{r3š=RN*%ǢxX:Vve@J6ipjhKfT{ۤ)4j9 A9P1mRbqK9!,_6FIma\u&kV^U/t{ڟ-0>T&L֖6Jq$e<i7ԩSiYf%;hl 4WNR@njM rq(C*VkO\Mjx qcvU*GS1I +!Gfb NwrS]H܀/#?nwqͻYh!}_~;veYl,m;>/_}GֿM[/o6w jt >h)?Ry՟y t͚?pdߟ?MO|z^;_W~p^>ٷn^7?_W?+~ӒVL`zus|ۇϒoWﯯZ\?Exeo[M_7 7OzokYeo.yϣ^^}c7-}Π_chc]c_~փտrЦ𷾟}k[ݯ'?1;ǽ .xӧ|ި}?}ɝ7}x~L|z?Wx]al|+[M7O﫯|u*zOٻhDawV]UXu7~kZsկ}5^Ll͍ᾫq-?7k͟tOM\Xs?yw+Wسw#<][Tm)o?x;d[6Ŀ{?w?)OTo~5F_Cӟ]{O/>Kn=xؾ7$ҞwnGK'״}~k~r[F>~_}\]//r>sh]mX=Ѝ~Kw{}Ǧ{.4\#:'>c8eWȶ={Hc+>o]tkOw~U_ Hk~{fi1Gwzǂ7Lɏu=;濺yDžXoƾ*y'?7nKcݸ%o] ZOԽu]<=>}եO-Kusnj}l}o_/睻/{W+3jOƵ[| s`|⺉]]қikmw]ٮ _K;YK;ӯi쟫xG~\:_Osb]O}Wqwsr;[o?z?r?ΦGM7ϭmx[. ?򎫾+p/@rM7v+x]n뮟Gp2oXه-׼ _26ֶOſ/=`zǞ\:o֧/,vcC~ߵβܯ,x3sbß _XȾk'ڿ*s+SޱT.墡;+m3̦n-[_y}n>w_{vx{RϿ}TqG\cvܭtrkK&}/@W_o̝Gk.|[}ϛr㕅yӛk_<=և7l/U.B#{틶dGo/o7m~l}]GO\s?±eLox߬௃UyUgc[DO;޿?\۴|?y~w|4X?~ӱ|^tbvIG/~7'%Wwype?G?lXY7_ه~|5{^s Es}h]-  W=?|fmQOG+_R>?k/˩+׍GnwX=އ*_ٳq+yͽ7ϿUgWhbI?v'Ցstg{%}KG(_߿ @_{ϻ7'+>doʻE ٱtO[~a5Qҋ^~6?hڬ?yx{ \r/MŸTus?\9a]]?nUMwY+ZsK mݝx3~ۖnϼuXtg*c={/1_Fӟ,r윮7|R\^:[cԅ>XVp>w~櫟d}]lMc ~\lB֡'3-=GĪ|O⃓k੿0uS3/x; ɋ&/|o~u忼8s3g:Wxn~cѯޗ?9x_+o=vouV=c^(y?8]c/mkΧo}E?2Td߿w_{svU__ݓ'9M xC02Pr3!2 Qp`!2C`Ap@Dd0DD` D Ɓq!C@1@p 8Cb瀈09g3@`8"2D#" @ds,SiL0Y; bC19΀2<C? "fvCC@0r G&cx`c(2\ DβML/-C@@@p3g˖@D@Ɛ#rD&2d0=B9CٿA& G2΀7q82l%#f9`ȉ#c821[S#p@. c1r Q `|2Ȑ#g&g! gL ,3g%2 9c cx ȑ!,9A8YLUd `X`f0΀59r#C1\pƐL%X@ 2k082@` (XYxp̞ lȀ# dJ,C@L`5B9,943" g  8C "GD"Z"KeB Dְ(sd#0 @ cE7#έ"G@Er8e ,MX3C"И0+\  !``CYy`Y@Vri.@ G P Zv`OA眣`!sdqYGDY:sdq8@䘕DƑ3dg^ G@ÀeEU 9 L2`!2 L f&gCVdq21ȒaVDx岔8g͕Ad030C8r!qhYM2"2Dc3Gpv&B#8CcGXVF `dN*1Ȁ1,3e!YV쁋9 d&f"ChYl`8at(QYF6se2!һGβɑAM"D9 B؀f!:10 r! AMj,:3LȚ;YF2C&eQ@D9ȼ MfJ8# 8pvYp|X,;e"p͝PRVh̹(2_+!fU8(`5X֛Xf+B"k"rg ÓrqThC&1"rQh\ ΀+>See~>?љ',Kwv}4ygٍ^k a/3AgtfiڗV>m,~gS#8襮:} >lKMv !oiCg@g#=/3Kkxev2'zqLNgx 8Q$PNيQC:&;Cb=^=GOTgK*^e\~pD8=,NYU3+l |D/佗tS^ªgg &:eEt|əNsQh g?$Etfiٕ<^v/SO8%N/V^Wl/sp7Ƽ';gzk܀/wf ,I/s+^(0+/Wigeb[ KF-8"3\x/ @/=%]x44l#_8{"K\@ZDEW++)m} ;w^lKUj=j/s1egTu/ghqŧDn+,A߭>䵳Vf{<Йf;[¾opg{ zK_j+_hg }/tznBy;1LvdV333gkJWximd%l!o4cN-D d !jL(2`I3 X "ido$ HL/C(&0`21@3:#ր:e`G2`0#΁ 5dX0JVfL9`` # )3.a,4U5s1b c5Z`=[3l-ód 8s7dkqd!eK㰹yzX\e\Gʰs B`#F`XE i6WK3\:Ĥ, 2:*e`Dh#À#,tҬ-2"d@@B4d4DQ~$bHaH xНx!, eXeX[DdlN$0Dd $C&I,u1Kb6D6"b&\6Ȁ:j"dI%(!c@!@$M  fi (ƀ #2@XF]r,M/aYZ!fzaM +lHIL2 Fe~F&z$ 9+5Yᡁ~%28hC\7b"f1"CYB7 F@' $Fp!UPX. Y1b v1 h*'~GeyB@YLQD33"!2= C4Y4H@5! ff@ 8˚,HcaHGa'2$R-h@}  #ǮIMf<  4`5؈, A$CF!42L32&&͡xfjxV`fQd4fe[j !eQf |a d{N6KF9Τmؔ $ :~ؗ؜4!Dn`r:eL0!۵iFG27<,YjF6*"]sJ@،@{[ ITޗ{ׯ_篻 o\r͚5ۿsm޼3Lv+_ݻo\.1g8yv38j@,FY N$HdH5F^#H@$ TىFDR  `d3GS2pSX$u-0˘sa]rnp2a 㤥PqTWORP2-8S&3c.b@ r5t8P&xɍm,3AvBfaMKd@]Dub x UC`0d ub'4I $"H{hr*i mƼ&%^Ў.R 48i%Ҷ˒5r84\2(`K0v"=@?ՎC}\ <%pʖJIuRXR.-Rhv@Fd{e䐁$(ֈJ 5L,cJ=+E 2F"pFttVRLSZ3eI-1!렑I,u]vɏXYP%ESI0K)1[ 1ECASkse /J%1h 9RRx̍u eh'$!RLKV1Lm'D(cbH`ZU.͔BZ2 b@ӺǬHD 8xXup0I[A"j#m 夊ohjXσ]G`-A`Tb]X5jd SK)P6ZF-*P(G0j,x)XiQiT@K\1``%P'&fh'We(PCā"Gۉvb%Q"K*9*S @( *U)UIJoRÄ!)n:ױ9^dLB[RٙB_BNTAe44È00!nhk=%lN() $ TNTG#ԀI- %8`b>+lP\q'8(l5e,ՄC \XRe34%Z,8g5QpEsSI$Yd7Ĩ &c80JP4p˩r" wk0h!Qq]cdB)H)$\ت2mGTL5bvXIiC1A ":%saA$R1#X:䠍PT".kN S BHpN,̂4M|&dd8!30Ց@J`iZAZbB <%\bd} ҩ zD! Qjd.8Q D 9J.LqS Ȉ@pviL8ʱmF+̩mzHLzl ]Ў+eYBh*R)7S2 )gA,U)ֹV|[&<$Q@ˀ1 z68P b::F%uT&YSJCj%%pn3NpR,Sdi,P i2FY٤eQ˨ `i!ꨚlM+0hp S,HhQ%5BDJ3 RY"a0@ RĵfhHOBH Bn00L0HUn.EDI l"$,QhCv21̭X&N)4`P84P(Ì)ɪIlKS%4c„`&b`"d4 k?zw}myoOӟ'(VOZrXI akq6@_`%-FyUiŅ#]|ܱ%rK|cW[ FƇ03ZOe |3H}z7O;L4.8wëpD ?j>V.ls^$F<2mMG׵4IgӂJ 3;/Kh/XCnvࢥm3]X }`ґ0 L81lߪޫ*%YYcfG MO®:&/mu l͞K-ڒ}|+\QDqx4-H4m(ܼ$ڗjea M׹Peӏ82,_7ƃ6̈㓭=/E)k`ᮢ0Tjyx-V \2]-y3 vo웹`ʾ974jƬSV͇[yuo}Ï,{hskѢ>6XȹG;.SҦmCUŞJsF %rRUw'㻊 84a:|V67Y?ަ0wa|aST>Ϝ_`0s<>|j.wyW5FW{h[צfgXKR6449qj=Pw0[mwW ]۫":V]o˟ťsgp.8fx ; 9].2-;:5E2t{æ ^߂>7ʎ̏-ju}V{=<oO[*+k:/qL`K5N/.bu/"!&pډ:KmKrXM9t! SxYh{ڑ%5ǽ#R΁7Oy7K̟/W[>ۜ}f(k{+:pyANEˣŕs+aGiaoyj Y={diVSjAmOazd~ufڍ#:&p4W]~$65;`U ͪCK/NTΆulՂ53[߱лW]w䂮swK*SbMt\Y޼| aN.R-o][\j鶰][@tu#m{s.]v'kWm N'[S=nWͤm'#ӝRrÅ2(Z} sqnl460rm==M &ZӎGEcZq/V+MmϚM X5$7Ӵ`pFٗm1v$t[~tJO]rPdh++KoXj^X]Y4PfԢxەKqYyQ֚ʏ'\I=ue}N]^|7 rx>LG#lNxm}htkE;*:ǩm 6s>;d)Joz0RG%Wo] vkI-,=lmIfldeuH*tnv\^m -ŮN8][T0%j_[v,|ϻ{ZV,7>6y#bKX/,8r#LoC[|VJf6ﹴމS=lnkZߓN*c~KRɇq0`2juw&&=< ]cMvpشvbǎbiPHg3Vٮ5rj/VnIўծ`i6}l9Bi>gݸ{rz2w)v?NL68w´w/jycslȶU7FO-/؊śB-X1=kxG}䫗̌3,^O_;Hu4wj`ӵ\2T+wAOZ{zpϐ D{ g6|-G"gdgTSi1{ۢfȱ3U ,+]=jT[P^|A[-| J~y9 8Rk4k[EmWow.MX@9vΚucsuqj}K^3t-AS(-9wqo@lMzojQΔ'TBgqyynBT-R#U{ުe֭*e==W+ HIJ0 {}s;::c`v}˲^4_̸0ŜvP_O{5\7~Υ.}d5r\:ƞ=O]&/cߴym }]K7-૳+c04Rjj|]`qϑ|>/\ٱGyWTr(M~7n^s7 5ɿYOFⵯZ-;ELb7=2_yWEU ^]t;V̎wYMVƭw$Ց6FxV8 !dE#Vf% Yd2{tL.Ҝig{wu~險c"0 +tW/_ŏ}Gz -=j[X WL7o~t_& rK`2Ro_pΰ8tF#N[N_>=w8?{|y˾dxˮ={@ /x w=sK!%Ou??gA ̣ʹW݆kN]k0k%y{*~liV8Yzj\Պ >~X;pz9CW|/ۯ_;Yjpjda/,sHTxyB?bC KK?t٭n°=w5ǏL:>iSW.+d7W.h?R̅'<| w软Z׸S 6-_O_ozG_ó[9gR9o不R{|slK?6k7EӺ_-~=z.:'\uyga*}R-?z±wdwEEk?]d oY-x΁_K/}xzO}COM,[|,?|[wػCuK~yTTO|c^Zܟg,~Kmozi?wvnTθkWoMUE86/s;Ȇ.]67,/ظG/;̜?)iEryV.AvZ. /R?yQcy7tW90N-M}Ս5˖(Xs_t Opǟ>XUZG7׮‘pzyӢrݻGzsYG(a}w^k3GKSC/e2-|>V>w޻+o>} _f8埯t/V-sKQMYDnX}@8|?7֥CxZN}<ޓ.89>s5>:oզ_o߰?5@MO.X:}|Q#Of_߹}i߾o}񭗬;bO>eg>bC#'ZMC޻ _}s>z6#>x`^`߼a}/QowIJ}ᢗxvS੖2gIvɅ+^t-g_߿"5IX G~rd\Ƨ} ~i> ӑ#y)5"=kj ~S~?C_3pX33KR3RSA6-b.}1{Y2gᜩ => r<'駟qƉ XPVo^q===;vDl6n ` У(jCB57EQ(#F*" a:P8ɨX8bNa,L@,RNܠQ)ı!CR-#nPB" zeB \27c@s04Z(K3r),m; -h+HjB )9jlcmr  bG Ҋ )k_EYX "7P5 }oChlƌugh+ +]OpQS F6BˁXb$MxA#lFmi" t ̎U8j AJp`C'6u&1 -BT5+ Cm TK0FN1]Rc "Hd ic1IhC`N Mcj ch"mhMɀ(6I'Ũd v刴 mCcHc2D1%5%6 1@ ccАFI#1Fc"2N*FA" &6Zdtj4! FS H iz&Lȇ4jc1$4h 6d$Ud IkcHm #ݕdWi` Qjc4 C(&D Aw ɠ& ҠdtMHZ#iԤ!!h4!!DMD4#OIѲ!'Ƅ@DjRK0@P CHdȠ@ ;& MRLi@h&ACD%2H gԡ$І%%BJÐT`("ҺSi()HDC U" 5&0ƐtHAc 0-" dL(itDf#XJJ &<"0`P'c && :&KF&2?l c hLbH H36Dj2`+Ԡi$ CК^M61cE!2:@h@)T$OZk5i00M&\hm@kfƘTtn dK %6Iy&CdA 2:)筍h0bBCh*HttGFQ CqRk jhȘARZ657`҄I&jB`*dcn~`X]Cd 1:gѩX u86DڠɐF @&i$thc(6X2h06$tlMdLgH0ZH4F$vo4aRcbdbBE11N:+Th!2S;4M& 8"HA0qRN}byLЦ[G F$'v>:Q0id&ѡc4`2h F褨I:1au7mt1w $!J& hFI`נ!d hBi$Fk0kJfm0 !$U wZ0ChֺVd.1 1Zkm>20/=C#Hq`:6h0YɀƤ-&0PZ6FK1!M c0bҝ,5@hS A&T£NO؞\Nt I o&s饗^r%3;gɋ~Gֿ9ov;H C@>qg[ ;t=+vS9'}N*d),_پyC[Xh)|IYzky)OٖھNXir}'n]G,MY=rTe)Z;ggme̷-v]svR>[ؖ+S:c 8'larB%\FK؁}bߖiq}vhykҳl\rmDZ-nsla)_aRgu--=%QZN6x8v,lJYNʸ#=J:Rڲ]Y*ytUH6[NʕcqUʵ=Ǎ,K,O*] \ߵRuﰴ w}Ԟ\kɔ:)ǔ*5kcq*ۅuJ)qmmʊle: aUJzZi϶-ϱ}黮R|qm;H)[==vRLs'pc|_빖c{k b˶-]WzJ>K9Z)sǶ=XiWiV@ u8r]Zu\dl>yʱlu]x)klo;k{Ҿ'\;ʱ-7J+mgG:VJ2Ch9cƎz)KUcY6WŞi? ^s,iَJ+9VYҳ]ױgk|Vue몖]:lW(r,d8*d ۶})|[c\ٶmٶm[6(Rkell˵]G\|Q~2=ג*um϶Sp])'J߲+v=SmKGyZkYtzʳɔ#mru,ۖi,ZmPhchb"v5:Z]==}=O5=zbmp~V:8X\8d\s<O}=#;Y8/n WVvVܛ9wc7T~,BygemDTƽCy؍ ` jV,e}#kzxcOdKΎSgք8[o6t>Z.>3l2n\dީl t!k'9V'Р۳;ز{g zhÁƧM4t&?okmo{xu|pߖ֔dFΑ]Qtu0ԅ橭l6/ŧ{vPa*k2;7OǣnQ7n<챧=@:׷QPt{Ôs WS7^y\l{MgpX>5C$ߘ<_[qi z?yP惇~scSO#r`i–ѭ[8ծg{z7L ےf<=uK4[g` =^Wdz+kNnS#IF][ZhW'+?wg$!;0RO`э;mW=Α;[SI,Vк ûmX64bCO;kZ6o֑3|p;ܶ T&WGz״ljQn[!n>`v}Ӷ'?{b^ўӣBoaXΌ9fԭ#ۭ CMz˰}*MxN}~9C}1=L9(-=92v"61g6}j~1hnC}bkʙml(X`jj4Xٿ0Ӏ"Urx*thOCý`TڇC#`.odk =:T(Rђڳc^7l}`m繁=luj~3BPE0rp`Ӫ`I7pO{{m Sc {Z{B6Ž˦{NsG彇VWOİtuˮcbըr+7=WlkvԔ*F ng-234zv;4kppD[FtFĢ'{aQda<\lkOm4cku 60ܳ1xvpC[pyP̛-uOXn+lڗX6eVm]0X6pGخVƒi?U;NӺ`+ot.Ij<޾}D`m*Ż'y>FӓBzcU<T[sKG<ܴ 9<9qhQ{ȩut#g"Q7xwg ,+#=3>]N{֝;3y5o_P=f\ۋUڱIF9zGܿ]X I>nWf(Cؙmeˇ,>4T׾+m?Ю<>upPyӻyѻ +QJ@kw:$gJ-j\ߝ>CL:~w7}lVm{bխ}4t 7#FU{P&=R7T<湜d14Ńr`Q^]E3+8')6Æ-d). cXD;&ڭᆽ;kRZm( -&契[ۧ ;鵆|M`)#5w`Alq!3lj7ݵfBwjg짷ڵ1Z8Wf)w`[-՛vD-$Jh7Ml/zΘŲ+Ҵ{>&{;BA׍:;RraСj2S͙no2;ebhcmWIe6rͽәu[pٙߗ}<@v|`zCZky(lܷݶ>0o  j0R-{^r`M=>_y>TĶ}&`}4V?Իs QZwl^ frjd&wLwKMk's,5%aT"Rf2M,uo/N).2m˒NH3a (i ,iIo&u`ɋwq9i1 D;ā0i֎F̃ؒɝ@Ǥ=wүT<܎)a?m ]&5muۇvO::?`f@Yt;"v'b2ā%m``IyEinQ+NqL '7T14uC&- ֙Q#bw Lfu;'s&ݶXD8Ӥ`"dS,y4!l|GgɎX[+72lkgtjO:''Ivo@l*qݶ:%`'s X:BNv}rb3I uB'E#Y>ND]#HPÏqSkYlREftAh:;H@̐yBϒHȉQw$Xv|]uA6nl>2Wv a5u& f>M DΆ:)!%c'ūfK&O.L)ci4'@8%}J7qg4&4AӾ=hglg "<+᮳ ]&t(mbbΝ'ϩdgp(#\f8g3׌uw"d~gɳcPGʒ6<#邏r'$yLArFq$j;OQP4.iF 23kS><9as09`.q09as0as09aK09as0%s09as?w"#;9sfOuΈB/÷7?߈asGŜ?u]so⿠K>@O!j1rD1B"2D0 ` f 0`1  "! !A$fDp $_ #"d b2 3@Lɜ O"5$ÁbD!""B"@a@@BBD E4Kf ƈ4|3 ! F8# $D !2S `` F)'d 20#%r D` %ZNt!Dۉ K!B2 u!ӑ K CHDj"d$Kvl#!1̀@!h`HjK"@C! IhOP)0CLBmJLhF!cȐ9i@L!d(Ơ#\dK "i !0 Ħйʀ ỻCcPH܃!b1HAWŀ"cC43N~$za@!Ď鎵&n:DBOE$N: 04gD`Lr8`bCWN0<2cu2 q2&1d &c"]oɒ$DF3JUb,kɪSH "NP'E3b "bb: =d!3\"B :Ɉr ""i@h-q㞙%d @1qωX!#H`8h@ g#@FD0!Ŀ&2$. %N 3!dQ7"֡04҈tIHd 4DŽ?@ٕ1!aY2q$0&@$n(%1 v0b@DN1n蒒a's Ɠ@X$C݉/&I:Q@"2H ф YǯC'A Q7-Q'!C4vD$CFLxi $K"$=]OX"A2vb=tƌND14I\H(Ĉ)dM$aI"݀@E@Ę!b41$"b9ŒQǜI@c+I$R786+;0tG+ R'GH<-#F NT2]&$NHĘpLD(!QV'#Ȑ %4K;L~Jxg޴o_"/Yyc|Y{>P>p}9ŸZlh5އn=+=|G}~/S~h }'CKW>npO^qo3x7sS<.>s۶]Gןl;woKzm={U ^W\%{kOF?w̽UW5V _oޑzV{ZvhW> UG]N~nu?}]ޙ׊&N~g{ G~_Ԇ[v_=[|p\txƲ9jgt\xۃԯ׾p 5VM|􁅟{տ޺׵wOCkCRw-?{Cw=qzbuߊ+~s}7~|wFyljc㫮:[[k=ޗM-*H'-7[OtkwV쬛:cNx@Ճ6ؓpz7ޟcyϵ ~̩.#O>~_ѳ|ޛ6n^Zm.8Ɗ;''{ƽY5_{{߮_x7y޹gn˿t7^ӞX|JۣO/)_g{!w5cO:9u'~odYo>?{VN,sXzYgO7[V2/YU?ONx|U[p~v7.ξV_y Q㛯}[nÕ_[~kkίLZKk_^e'oܹצ<{—]|Цɕ/񳽷.{IzѱS7?~GI=~WwL;'}=E+6m|G\ZsdzqC׭ٺGUWb8]ؕ}c^e^շ[>OnEAu h/>+]>?x]q5vmӖDmPguױ|ˋ[Q?y}2=ӏ\kv|;Nryn^96;o,;Ŷ;;󹗜w?xz=z5_}}*{n\_ݳ'j~w6]3˖_N}';O ˢ{?s%+O3߳ԡK[#ѷyM5oE9淯W>n]>eNJe翼8\w9SN-/.xg]bsNzd:;;'}߳#-s}#wط`'ri=#n^$ޘik٧YnG͑Vb}J.>bqOOn┗~8YهNz̋g~(g%Qo}9mn[~svv7]?u`MW󜫣pӫmwO_ 'rͩSz_8sG{|k4>s]ǝg*+*;}W>X?zw|1{_8k bč9=O?|꺣ǣƟ?ɝ:h5?.;9Q|/&>yNC}/dS>'tKB-;3޴؟ćx7/ӓ?;'׷z} U4Tu)xej/\'/W܅ۣ}>gK޿m|ɟk3R-o.i#j(˗>'k^zZ+Ƿ7Z=H{S'8S~<hщyj}x=X5}S@~t]ϼk3' sTWNy ?~ڟ}_LW>|uϼO]+شo-c3?# |T%_ru:UYL89]C M:Y_x+,[ 4b r&*0i7\GCPi~/N7n 'Rz5k25݌[jLQ248%l42R1 4ʅh^4a9PjmbyԳ-3V`tZPVLSMdʦ<^i`*j詪i7uUM3Rl*d+|h狵\B20\(_h+(l rNոڂTU4 ufaCZ l2T2-h].6.jYPdU}ieUlO奭x~k1T* \1&Uv%horTr6* (Lt't/ʔQ7A e&t^veeC5IAt;01rkBT73PkO52̖@RN Q:7El:NP ~9jf}e}4SRVXi6ui%sB9(UT]IDl"ҒUb 0F L _8LgZ\1gMCxجB]YaPfֆ` ,Q1Oi(ΘV:CSaj ZVUaoB<-JGd*U&o0dYQU * cPXl6[&55ʹ2Yyj(ªϳnڹvT:?Մr JƳ$bEG=TiʂJ LTW%͖ZXkj6߮4nc^W)er9]k72ʲnf,TQ>oSTid &LԊkdPAҜRe ,Kœqüz@F 1AfXR+\PlOW,zL9M6էEZN3'z=[9SzD垆lY(f؞@m<]( S)5hrGbϙ4Yh.fԚT rh4rR̖RL@UiS0vi: Qh(ea9lO\Wc(L7Q%f*S.Fj&QP./f!^҂| 尝NZ!'r\6О,ēfL Kx^ߴƛ:WM1`Q310Da4I TU9S|f A4Q̥D+^kdœL3:[hFrsCl9C(29YB*eCqO- T5LhՠRlLb3TYvJy:lsd©BR8QiYSU*7zmvY&RSN@8됙 hFTXEA.a%|U1F %݌raCUzے4i&DaERZ[-jT|Pv}9ՖL(*DJ.sVh.SZ;3njPij 7 є.f֬A\fV F"ODYx4U̴ UYVo.ȷ!AHD}+EV>e[Qϛ`)vЮV0-V&ʷJܞ4ZmT2j84lzcJEne" m\gH'`%g7^Ej.1Jh l4nEY(ZByvHPnF<ovkQ/s@jM/ą,s -C)R9^6 LP jMW*qr;ߘ6R\`B3_oj93ĝƘ9pL )xk ɑ#f@*Jrqƀ`)2Ƒ1!PJLpdX,㜡 ȘBH&+dRJ q6gD8  ȥ`CK dȄa1.A)Z#C%"Ÿ䂡1("W@QJ dɕhq, \'S\%aȑ1Bq&(80 # 8rq`(CƐLs)`L8p[ $g Ņ3`qqKpe\ %H[p Ɠ)8@K 9Z!Rl$J@\-J0BR(- B0!$Lc9WB(ƅ`9a eT\s% )P*.$JB2fIŸdJ!X+.,&9L*&J8Hi AIK&8C!).JFZ `’3ddJ θ,IH%0ƅ#WB T 4B \ )+D+ K"3gBAeIbi @X\0e2\pΙP\ \@ƅ%$i!B1 q`I΄q΅,!J %*`\)B0.(T2@(ř! \p3K$P[)bq Ņr h\ `1.@H*\IR@$ FC\rA*.@GaS 1[B!L@\2) @&A$ RL J A!8X K"H(,%QY c ΐ!29'nKι@18 +΄B#& bJ( fLp`LrIq1 !DޙBZ[Q*\RW8g(g 9@@E BZ`\qJR $G$CK(!L Biȸ`-.ْ)&-\ & E282%]0)I*ep qAXL)9B U")9`IDa!AD S28T`\ 9pܒ, !0)` pR`Uc9g d$ AXI) !X8&P 8R) %B ɥ%d%`bҠ9@(Z , BG)QH!9 θ [ BpƄDi  .3!X[K!cRrh -*ZJ T,Ƒ1IlD8 gLRLO%gR Dr ds!q!K31S )(PL`s@ I(LJqqəL`cA s 1-ŅH6ʅK%21Ɛ ( `JB2%’ 0@J`)JHB8%H@ZpQ J(W 9cL02 cBr)iPIι$!>KBdJ# 1@Pڀ\ `[I!gB2&"wf 3cDH>9 y = 17;Qg%$(Bg s#$wwйc$`Fg5m 3dSDp`3#V7Bgffݽtcf>uYPg0:g;?!3$3k}ԑA]AGXDd(5a5Ь h*Cӕ!y}‡6cÇ=2#$gqk?g$b,2ي4YtfOg:au 0-7Ա0vxе3˖[N&̳W4ۄfOWI;jefW;LD ]6~:gms/(ٶ,7$7X:ulySgQnFLfqW3_%7{N%Æ7?;Pf)t>fYz1^ij-r&VٌIlg|l'7K϶b8Ka)Βj]m5,'|FgpF1c\a>fIc:v_I&]Fę7gѭ`7fVTuJKoS/&9!9ݗH`gJ:Gv|LM,SI hSB:v[K,P6a^rZqt-neSa&KODr6өrM&NyK2jbЩ>캓x*I ΜifQj\+d8;P;n[[3g0ifTHI%#3Ty%eAw>sҢ[Sʯ [DgI݌:%uYw,ٯHc;Q琤d :WHK383풰C2$BNmf2QKE'+l)A3c0!϶**K1 3YxwoE@a"uq ]ۧP4kɝH3:DrÞ8+,йdqLOʱX%R.DĎMKLcU3,ns!c@Ğ%45)uȻe.svf, *Set 2F]$:c:n,g&薦lgp f3` f2v]%hf8{tNpW/sa_ЩʟUzꮒEߠ+ctk:쮷#GF3HXG 0p(3>Y4n@9u.E38ΐ˞Gu6tYmf^a'^w3C4oҠY^S?YfwF@: xs$USجa ᄣHֲS~xñn9,G)X4kIpĜ8ͮˤ.;fyؗS tof%)pc:u\ Cݸp&3&θY [Yδ9)ķn+tM܍17q/鍊n=_e˖;v-ogLꫯ+z~$(pЈ$iE!, 2dL$q`1"hPC; 9b30@'44D@B0I2g!h9I%1ù&I HP dő@@PM0q ah8HGBt c!0И !87!fЁ fH)9h 8B \Gn1!ciKNbFN`!3L!Lk" D@ 31 d4Cfx1 c6FDF`2m @ xC 7 c" p Ш!&e6#As "D`g 32FI`AlxL2{Ј71樑s$`)$b@0hT`cd4 $- IhmČa͈$0<$y KܼD5#zRHIkflL#OuC2wDAfzT;To_6,6)E_isD,hT/8%,Kf] æv|P"8 fwNO*A/upæ[%$-W&,*qSõMToۨLʳe-V% [5Vn% o*LG&ҕB x,dVj;"lT1=N5XyI=?OȸA;iQySY_຅>q;RDa$[Fdh,DȭD<2Fg\(Qe YNE\C oqeQ"C|L TDv4\Inll{AK08+[a.La1+VH9T[~9v~݊'{zyR/Z^z8],u[yWLjE͛zYqǝ_Nj3n[ hMA [L̓醭@E6UkYCK(SsV9R<1C#+=a^"ժl TǽFPs D0텆,2v*Ky`ҏ`@4 i]f`23r͂ln,C^D* hf%e֯a@`ඩ8נTd)@q5R{Lr=/NS~or}mR[ccE~U!}Ю`w _8W5}Q".]ӨS e "x,,xn/Ȝ)l_G#T騚h@5*8%k~ܔWgSv{u` =FQۡ\zŅ @MznMNۆЦ>8VxH.ecnS~菑 TV䶠%と &ea`9hɖ2o}oYUlB<.êT+uDЁoXFseWb?ǎ--f7D lZ)bYo&LYPoMAYVcv&ܸ>֛BO E%eRl.G@1.7 n:{eUTkT ctXV?/T_ƍ:O_/y%&R uOO1jժ??ړ f&w-0p%l8ʷVX>wW?~tdڛv^p]o|ءM۶+T?U?t6ؿ5'lyƶeV([.vyumL7- p{>zqc2฽{)lǖ܉ܑL;˗?.y'z5֢?E/? O^[?%./6ϼ8GN.Q?KNx5\N|«f'2?ԎOn:{i'rͪr.8/7m?Q{ o0Υ/z3~4MSg߾SV]%/n|ֿMїs `!}H_uz/Y/~q?ҾRܷ{sf7?Ǫ]y|qO?~`Sۼ;΋7:'ЀO W^;;ѳlꢅ fs׿ =0'~O'o}|e?2gkޯ7w̏~޺nڍ[`p w5#떴V-$_W N7M 8z)gϽ]o^}c+} 'O׌eڻ?U^XI^gr<=|(g=7@|ZtN<6̽[{Jmm5ێ勶Dgg?O=]VL]~wV|.??&PJ|4ӟÏ rbtk}򠿽MSZ~E@{ʱ!/?jCM9_/f[O<|\:xn)^.c~ROdEtp7>:bS懽W[&tz-Uk]ǡ:cumv3j_L؅<_;nϟ9k޷%vc_;س,ruSy{W 5\Y8{\|3lyOo#pg#-қ.*u۷|e7v驏OS8fQ߉;rKo;yKU婧gb別von?uX[:P8soϲyRK`6Gnvg?X|μo.1Q'S"uÆŗW~+*qEىӖ/=O-{^yT}%CE(? ^Xƫo=ӏ[>*._` G.z=au\ȏNxaytO {6/Ύ_q*> ^qͻytn:́֜:LU]samvI/q#z_XqGG]T.x]jG/Z?U=vۧWYk)k'}%Ć4_y]8wxl:777|?|/a S= -gޖ>SOJ|;Թ1Yu_~O;S6~K',޶mk> إh1)bcT]C&@$,J!AD9^4qbҌNA,"a$ i  +Ġ5[K!FPaH؂$KZF`A!64.]hkAQ/D\e:*v;)a Bl NP TqڣDHm2(d!e pari;Z$JA!*G[@T>(kI(FW"J`HYM 1*d Brz<6".O@Jg?{/K@$Z٣A @A@ 2yFT@,tX`zY*]E@ 1wQ \PdYQ$.icw2+ABL, r(qG`K11 XJ\F"L{K&u'"J"651"$u"K_vcN{t9@ tBFN4Ib`*@`fbPI jKFA$+L.X% &D` ,(ԀZ []% -0(OaFaҨ{Se BBQBKi "b6CSdT,$-D. e(  ,!;Qi7b reuQs-kIF!FFr-psFPšҜwM1j2V Bd@AaB ˜r=I\&3LtIz]Fyt,@BJ&xݡBP(9}sqµD`Bp]к %Z5u Z\/9׺˅@%2]Eg}xA˖@A br$=C*apgRsN%ȡBw,QcjfTDaE%8c`FҌwbҨ5 "VyH%LĞƄ4Nn!+*&D ]5RwظȩzC?_/_<ɈȕW^i>cݻ?jm4iü$؞Riٳ d6-~fq\R.vOhJa٩z!9^w~2TV(}tEe%f+;`G $D1}y;;4Ms1+b Gnzh2s0@d.~0L?.3K6>-}|@NFawvӛY}/h#%Ξ.MHY1Ӭz>U(nYhɮ;rG&sh^O?UY\#Gk: M%2wj\O~_A{Y%K3R =;Uz2H?sp!~T3l?C|G鑩{w-=~Ίg.|gZ(AEso4`Ms\GiթsxիZϬb׬ g'8s}i˙##f eVHGΑ r]dV]A}AgTp#)s̽_8R(tXC\1ȝb=Vv ϘMt666l6/_ֺo41s pѢEleŬ]{& zPYt}P=xSh@[)c1F Fkc1hπ6Z{hgc咧gJK]Tyn H`tTVf7p3bhcx1qK^9'iϨ1ZKF=o)؛Ϡ1 r9@cv2”bvڐBu(6;7~|y]LzNp 2\Խ3\TM5@<5ԹG:}<2m11I|d0  C1mD{x‚1F@;%4 u#H;ꉠ'f<.j(]3hU~ PjDFkp< C/luj-X4Z4Gju*OO0T*W KhYDQ D^Tgl<Ê )\GpyfL5dmd* aTG˕hp86Fõ0FJ3UNhtpqtf(25cd9 +fpZpD04BDrQLr: jGa:6tp"*CT Fe,cUX^Fv 'h(JJyxxdJr2Q$H82>ZF7򸎢q/٩ёpRgtTUÕ‰ h.OC6NfH a*lèՎ &MV)$h,aW^hz<=8<NGS#^'V`*p4tTp*zxzX0a Gxg(cUr40U*JX) Q'KGѠNW‰aZ#h<ڌqRkر0?Nբj86hb43:r8>ŕRiO%9Չ K11= + UGcCcCtMLE((OP1V.E0b\Zz0r8:Deo<[X±J9;OTF6-O^4dGY.G"*(L3;QTr%ZC/GS\ ˇGTrX[Xr{(Ll9r˕<\-WDrh=~8mK##Q-jeZh-TJy2 +QQRZQ1Jɰ gia,)NPq, 둄rT9\f‘ˣ0\ HV<8R)VvRQAUhTè2I2^DQ4EX°5ES6+Q˭JDCT2it0R0ɱr'70CpztEh8&A4FaT ;#Q- 4QU +Q9l GEx +r*#QATQjp<:ΔUyAjfpyj\|4VQk<83H8E܊F+ *5L32\We'B5VT¤5pٰaM&h|mD*G ONz:Y2RKNWZRYM,~T +CQ-(*ǭh4W"$d8zJ8. 73W]2XyC=OeC Ta4l3a#ЫsO'Gh=֣Fe*,s9#p,TjƇfLP2T( +#XVQ\Vp<1lc*Ó#zK*a5DeND'+aP ñ(ka8`e`dr<JyE82MW`T8> Fa9B3#tX p9]*Q!3Q踥&TNUʍ dF*v8lGW$ l&*#_'h$ BᲄPJT0TN86QEr5*dIX3JUr9*K4iMjr'B(צð2:>6ٚ ֋ȟȄ*.BgўL`2:T^kߡۈc*… ϕ(G=f㧽.GAS-xd||>UJ`tY'#mWj' ȒkiR^I(igBG|33-;9ĉh5#-M`y˓#Ɉ$;P$T: &^bRPL2暉oj3z|*穘R(εl֤.H&Ed.XM@u€iX IC NL c2UbNbe-R97 mC xz<߯&I=h01VbQF#4:60(L3zs-vX:V;mVZ(Q*D0Ɩd 8C5Bӫ`q2)o/.N&j:SUY2q",nO' `!+ ֒Kڭ$[\ޛo;y[bik:60m .pI&qNbA#i:Հ~lDYB$Bۆ`1O\vX4䏶,^ܞLSIDAT$B'Ai{L-E(*N0nJ^l`}l5<,Hfy̆/{4yyyyy_#HqcOcW7;MCFUJȵƴ͟t=}eAGa= G{g Z{MʎR ?v•1:Mxwh|.v)7:u6U컎}KswiGxڽ.sè>'HuyFG,9g~tȹ2 *O6L2tWh6|rr%z3"IO>ɬMȬ>87my7.6tIڪKcQ9u{fϵHg8ߴio̴iDR=R*`OziYOcTTҧFiɮ$L{#Ӷ0]yvO7.Gg6N̳6sEG3D刋ges {FiuTt]##5 5rgHk>} g#vYJ ?\9œ[nn@Mү=n{o73TGjq?w{m\^@麅t{n~*A߸w32MOw/E]pm_|f^%^߯~+1 {0DKVyyyyyo 5yyyyyy<<<<<߸<<<<<7<<<<<߸<<<<<7<<<<<߸<<<<<7<<<<<߸<<<<<7_K" *DD! `PPHAgP20 "0졂~cD"b H3@ B(PDAQAQ("@!R `-"[QQ" *AabB`!d$an"@$`* *DqKt(X "(@`Q" @d@&ADwXP1#9)"3BdD&7"ArRD1:J:cHh@Y  #-10H( ,DNYܘ)4)BBQn8 [©bEHD@!a E R얶֜ #*aFA$uB{T#! %A '@qΚ 1B p L,n@p`'eIM@,  *a`p,EDS SkJ5  +qz(n*!H,""JRk!D ,YB Tf@ \' rJN SjnkADD>#P=B$@$tw"T€N\c:0ڹԞYȹJ7E8*xL: YrU4TNeI,YAbF@Q"Ă.39Cv "tn#* ̀MS #9>%XH(UA" Ȅ@ N" *uj2 "܂a,XD5ME⊠H/X$*RG(FKerI##;F.8B! N4 R1bVB! >Btp ZWI kbе:wWŦSb Aԯ: [r "nmFT L]J-3BE w5@Mp 2" JJ8rDFD!tN@ZV:XAWs8SAR6uHC+DOݍH7hmZ*HD6 5Һ*`Oc: gGu'NO@L& Djvl"M^R*ibo<8trSvu# DNoe)U,C7,}ԇ4!YJE{;0շH.:UD]Uhn|v8V`wBnȟ%;i>.Rff5}XKyW{zV'K%ˬ:ajV]nRWe4jY+>Z?YPxDP#O$=9s?X 1~-?Bmzs"͙4a gzX/>RBh]G,)>ͪc*T4'#H9+NQewد6̱*Y|QaE4lԷʗ\ݑ"@oBD~nLwgZ2u#CY1,ν4k6ـ ^Ͼ#|+jٳov?ݾ#xgv٭~k=wێ=yYv菿OWn?f?~Y xMO.3AӪ[t~nz{SZ/yRyWk28v&ܢ[Nk.(a5׼g=c9;00ao_<[77)o .o]_3|Ίw0rXﯾ}R;y,s鶊^x?K5ө|#lU{ V'肥2Iuot3~?*-U"yϾ_vws ']uRO~&k}?}Mw|VA>?=r܏Vl{KPv~_uϼ\׃-cA^t*|w_SH7ۯzҧo_o:{moZPW^~ޮUūv~yF'OCǟ˳z;_ޱ_{7/tyrґ_}9U7.~^kfK^{յ3RY_x9C'8Ly>kO~ɲ /VeߝٺO֮}%w~՝tɿÝzm%+7|?0OO|]djǦt]ώ9xB|#?Box~=ķs 'hӚUJu>>68|_yOWſ]' +vYdxS_֏=xVԯ}^_|Uwe%{~Q[ר/Y_7zbs'?񝵿|+Ϙs{SWLϜc@Fօ΂k6r~tS۟w?Ãƿ]+}MGnx_s~[O3>jo~yO;{x^8|uי.=d=g/XWfxYcW+nYM'_~8v扗{_OB]S77^!=83ՔwW?Wn״>ǮpYs[W|xl۝WdŃ m+n~' Oy_?sٙ#׮ޡ}ӏ|l<+}ov W7w_}^ȆO|ozP V?{Á?uWGWG~rc_{hzdu:;Ys~O7~tbb4nZƟy_gxﱍk}{{ ?|/{޵nӟdvSL' :?.>xǢ cG{^oZpB؇c?k꺼?,W~E;\ΌWAxןR{ͫ43RsJwww<|%Mk›C^s;+ş3;?[_]v]wgi~ڻ?s+}`ˡ/>7/7z_}IogM#yiӥku.~2=>4ؔưb?q}ŝ ùeg_Ї̩ܲ<_\E5??@KV?gh%f/.?8,F~??:okW{5w<>0J.w>PˉΚxC3 7\x;Wx{䌽oֳ/Rտ+}\l~~mxǃ}ol+_=.:Olox~1]?n˲/&n̽ʦ';/)^i^6ت5^h{|N]~sg?֔?mQ{gVpcF˖~Ϟ{NstƆN߰uǍ /9LsK~}c:}TW;N F̛i9ʚ ~3>/X"^z~M CsZ[^Ϻqe/|>Qܜ ?mh-Xc8Y+zgw'kо`{j:ﵶ/ y'/KY?c}7-{~gnNx&uKyᏓ'/l+N[;w]}e???ӷv}uS_-?#u%Zm^??}W_{֞7eW>nozo|WwL.YK^Q vk+_}􁙟WӚ>A'aoY/=ѻVo'kHy_Vǜ#_a$i.\vLx_?7ȓ:ՕuɛN-=xK֪>EƝǝm-^~gMջT3 ՅG{yX\nm=j]<[?{i7m/m}W~('Cp/ܸ)u_A=%7ͧl/;X~lӒWܳ` ˇaz ?:^7 ~ݑȵ}.s,ztsxy"|QYdrrۺKb'FOË>{Ԓ>O}*GJvUlj-.]}c7u^xn[='.Z!=<=CW=~O{C c>!k$#pjo]xݣ lZr6l%;tDV\מU.Xl?|`k}٨BCճ܌^+ah/_'] ;'[l*{wMn,/pY<rˇxϐ+>v.N;{tjc ,18<^,|8ǮxpZjFY4:+ o}8ht 6?'SwTSpb{2yʍexɝnݽ w[l}n9v6*'XCOm 7|=3 Em;Pks{6NMP~l[~hjt: 'ڨů 6ݷlcd$?#f|xWepb- ʍ{46o,,fÍdnlo|}U:o(?{w T-n4I'n 7_%֟MkLvZ}ѻN&|s o?'`_rW˛w_{\{;ߡfnݖ.m?``[ҢE{o_1p`tI<~] ݝcٿP(-ڽϼ0yL{{V)o<qͤ8e2^RYvsd>Z:c~ 6]8K-y[>OOݼ/k|ܵpkjtbއ.Eo+$^v]nkKy1m7Ƈ3ܔypC3:9wwޝoR9=l~|##JCxϓwq#6BqX{7Nkj<s]#1ܿ?lљ?p*4SÝ5SNUV qH w7gﳗ_n޻>^< Gx}8 knY7j??~ucO(Lǰ~\l/%W".˝LZ<'ߞ7g @S_Oa_ˁq9}W|x|>-'hn{ ?.m^pݻwi&A1g{}^^1&IÏG]x[3^hC΁g}#աE&NfqtnDuv¡#:=2EooD)J 7?b/9a_?%/=g]S846H`ot `^6xϱ?>Yh*1X=ցNOe}cjp-| 7][vO}M<ȋ;Uةvm6ݺ߿L [ŝ'nwOPܸcev4;n9μd]{Sg?|ǣ0N:iwtL.zpf`MjyKE|O zpo׶# ^CnqZAd3_h K垼3>sGxZ7B^l5ZKξoK v pͣ'ڦjݳKMnv hسzKskǔ'!q7޷VuTg;rƦbw!wGr+l ]wZ&[9|蒧6oyz63O|}9|On$^뎻֜x<8EK$5w ! @le E ÌetQP2/Fy|]2Lx>j2lF(P\6Q֘$Oٌ`}((/1JJE |?g=e2y(! `>A>lKeI1|?"d>fKhsB,LL!O~6 &~A)=|@H:3tS)AF`<lg}DT3 ePyY@APLLS`A2le< |rc@!r` Y||U(@Fi f ^)"A.~7V@j|R~6@^&1laG%Y%?)?O %/ϖ@dk/r2%R:cPyڈ2J*)imB|6xZaP23x4xHFkO=Ok=OiP>ۉ15yZ5y|2~Fg Ze2F1e1㛚~Ӛ1Sl0E mT6CAQlQ :l2ANe YOVZdKm|28AcQ)dK#_s U1 < Q _k=1| B y*\FgS@e2 q3Y|Fs^EU'2$.`^g d6^QJi@T)G^)CϚF֘|=KHyh0)c{e2R6ȶ2(UT~[6 C?Ȩ?2L3~/yr M& 6"1(llʫ r c0E?!S@@)e}+2i8P+)Ig Ȁ1P(byJ0 d%B.dT.R*_@rjW^9 ],`^bj *(&L % f S~ =S ty{\z+!0^)PgLh2U)kTU:i,xHżVVe' <" YE\2y U +hRJJ9|Qkrz`_uҞm2Yqicxt1țlJA&Ё(u3SRN  @)oEZ D]"]ֺ_{W~$EEe "bي ef" 0[vY-0u ,,",,a l [+V [],fw- S,`S8}!o,XG#B-A2Xfv4 e` Л,X aIرB,;z`C[K, XvS 3@"CUqgA%# lnŦ$V,:> vLN, Xԁ%:ұ=*afLYjXN)grYLvR֊0cR`w-Vzx|"l ƻ`E@-8UXblW9qde+%z(?8weHi03XI2 b)I:q)b%3uN+.C҅!Xa e`'ktYk"bz 5cqNѝ [3Jol`9 pjN e+l,c gE3JМĎ:g;w3 pL+;+ak 5O TGpj:[f쎒 TLYtٙ$I4,x;K [ac?g,S+ĉ?x,46 ?NQ48Xa{r11,3sÜ< \sݩz8' g69c 뢁Apd;HXzuG-8鼷0=d`:aH4SvZN ֖غ.a$R܄*lSu|b֦D\rj;)bNafThinS2ekŲu1 C" l-t9+ <"ET\qʗZ#@;wCm׏VU]#J#xp[cL%9/¥8`k:g^J^j :<ήDw NzԊeIׂ%#N7s#t]0R#r>-\:SmzmݦvwܨR{OWZ9?;@wܽ J>|#<ϰoIzCR3Eo¹0U8^y a. Iygh8r#849kUUGsV.#/gπۑN{ڌ <(}8@s&뱶ؑhw` tWjZ#3yPuR\ Gko~ZS JG8*sB=rs>i^-IEu=q@ 8 | +~ "]tH[l-,M J^ҒWKLn+t]57/b)wIi}]-HOǘUM$iHb7[z\pV8}d -"S"NH]{t48Sw3=S&=~4tU[뭺Z4z,;[|] 3W1S2^1NtF«]Э>UoիEݥxn< ʆR4˗a0\芬"HVlOtߎgW4)ѮLaJ.=[fN;{,ۨGV{gkibiW=XDyTWTr-xI]l[& wW].HWMe /R0OLr>uuHqp$,) Mvuk߽8ׇ+%g}{Q\PLkp*M&t.4+nFnpU,]qnR:W`կHpY]%>_ |,IX⬟r+2SJUo/bAӝOoӫ gؕNꀝdf1I1VtKK/&w%}ͬqH$[.+.P!%sM'.u))>qWU͞ ݨ,ہ:Q熡MÜ}3| -n]>򑏬[}.lܸ _X~͛`޽w}703"r)'x>)D~AEShA(`D H,(bئ^E$I0Qb!ĊfdmW -bYL&@+QZu@ik!Y-QI-BV,hh 5FJz E`V8jAYKbQ1RX1X1e$e-XI&hEQufSL ,h@*T,hW[$ԍV{;A`9%I7 @   #*HЉ A ʑ8.[H@Uz`!# *E Z >"dB2N$u҄,(T u4 L^/*+B! x I8T0Y`hkbNrꀄ5S4ċ%VlHY!eA=( , =NHD1d V~(`Ġ Ul]x( g-j>c #`Ħ  8n]f `\OZcYADPEDdwb h*QX]<EK(@eE (D$b&ԒU((EM֤۪"b`!"kD. @*"&XH!3!n lJfc(`#=d@*v='5$b<DPH(UH"M@1Z"dAHP0%PYm.3 ~BAIY`b-"02i7Bte-hN[w`Ǹ9"1"% ,lb ( aZ^D@:0"SI'ԍtĵ!%qqӖFX$e{WҟjL&23}333y{W\yСxji9Vu%m3W.,So>rW?}q}7{g.z緄'C{])?W]j|˾2.|Au͝m^A`[/z3e -6o< _?M^z?pы}O?ԟ/hM X}2>kv۫?HZͳnʲb8>od_;4?:Yv oYN]?pɊwV|w6Zx?S>Wt?l,ڶk/# 6{3>y-fimg&?veuMǼbNjToK,=u8crxU\y.|O ]q*?؎ɯ8{* ?:𽥙ooߴ'g~%:O~/9nS1g󳳚6\v_n{'j{/׽ef5^/C}G[Z8hc{]t2;~򩧲'^GKcUcua?rћN'6^x|%awܟ*+=u#8;\·\~`ou2מ~o7<ܣ:xoun:I=_|'oya3Si,k}{7xǻ9}hvb]nrCqe vG?zQeW/no~9^0~bwgK^x+=v,[yICrfP3^{~|֗ڝYm^=RK^yWc siNw1?}V5[Myc>U+cg^|/\|_yC?U m<~eE5&e{r˻~×.Y5x{͵+ܖ:/KK̦+[YM.޾e[.W|s缢IA}{ϐd Οg{ɷH oɳsWs;_UKIhrA%k/{:w]QFhYX'o=F Ɵf.Zv\<l>49~/Om;n=uxÅũ5ͳ;}'ӻ}V72xw'^VDO~'?^?M~u^gO3 =3s׽f8I|5ы Ɂh#N>oo~>?7Uw?s9|w:im?>fpyGmy^e?c&7˾/%YsrT\yZ2i;-?]riW・QKѵգ섹ּ^}7yצ?ғ.\?OVwɞ\Hx}t8t%n}薧wU:mx龟w7:?;'z[1^4r_q2]ym ;{>R?ilhon츴}_YsӜM=k ^ٻ63}ɱ?y^_|ԝoa[ֹr;ƿ,Z'c]ǝ]GeFǵgV/rCsMyh}.ĥ _;W|'dӾx1+g__ɾU/8zʎ{7W\c'>mxy$>;?p ?{=O|%g5} 9t͡g jǹ>pY/|ſ>/>uptneX]5o}'׭~9`I\O%._ݷ=ٛ[ҜZ6fd06:u t,:˶SO~7߰:S䱓g߹׶'vwnk;-}ߖO`py1w]<]3[ԩwZ/xO>9^yf{/qֳW_pç<諛Y[o_q^zەS~PHE ޸Ο~o{9|7gx>߷|=Ze;_v<x3,(tO^p[}Uw6؍N\qϗ>ćڛ]>D[O( L[xmfxזX2ѹj^22{׮|k>:snSԋd[?y[Uo |o})L?>_|sM7}xO;t\'olOy;7y뎓}eD}`~7?z8 v郧P'mWgOo?sMuufײ~_1dKaGvh~vS۾'m V^x{V޺f&gpo|:ux^iğ~j'7_1y_\t_ˎcF?JCzE0~GcqK7_Xy7%s̢_Oʿ\Yڵp|[_9~x۷Nyhh⶿~/z䱇N~=/lONlZ[CV^J%vv\_Iĩ|>#bR@4*3 /3L.j9֭׾FD{ADQ<<}kʀ5R")5dz4Jꁗ;lb4vZL=Uˑ?u&$vTm @FCLAgbЅ*F 6A 󾵖,MP$FَS~+o)5lS8 aUC394r*\V%4E9hf,rq% Zڍ6t8p); M[l0S0ۃӖ|k!R /FkabMN36b Pb(N8XI0֒bZmRRXH`2D$u;@`Tgdg !1隰S I'h؆ qfJo%#o"A͋7'K&ru.5;b}*6LG3\O:($-Tc%BܩZδAVX `)~Lb8u~ &S!3QTh4Qvތsl;qq7k1xk=P b2Sm͆6Ğ,6- VZ9P l q}XUK [ݩY 8d$՚j-d_zF,T$6h+$;K#4 "'MՅ|jm[Y@:ŤU[ '{6KF;R3BQ3jpJlmtvV6JF6pR P~":KٓdZ=ȶc0qiFfN[kAIYToeQZPQ(f!:6<~,S4MVLŏsqThfuY G;HZqˈT qx$ⵊI#G^9ZI{"%%&$95&sBz V ĝ i3I BT\Kf;$2Q"@ IƎ#fdbM]63~'uR `$ɶ'ƟnZ,Mml<}cN`[,?.0zAN;oi! d ź@..c4 08QUvt &xպZ K $>ZtC-Ly1k iJNQҠ:hX%uhVGǓ,҂ojqcIH  k$Amg2Mh0񰝷EZm= <ˠXEԞč)?cTjb6Ej>%&<3wZLzE; RUJ7!X#d&<%NƦ JN;&c17lжuH0 V<l5jEb^`; ;m040 rs'-,ڱX YC;g;- bTf6N,fsשIڠc 3SFq*-'К4P;Z5֢xNǶ9lD4433&4ƭRb)Z*]vz-$ב e V5mOl(ˉPjNp#AUŨN.O)ۈmLj~M5XQZ%gk YT&^Lw|hfq3P*$ɠ™=[϶5AXb̾zAc^RZ>.5&:SGҪtB>YL5V%fZc6QKY qkxcHc~єi0udAg3>{%V@%kl9m/NP7رj*ILۂM_C3HPWɵn}.9aNO%ZBTZFA -øQN`7+36-Ic:HC͵'  51H3aMXזLvPԌXO֢Qc&@W'nĠk7"KN;H-Th`Z$Ħu!nz8w–7:8Hl b!;6 39I 1I)QX_ 'qltSNpwS袋nO~+W\re^fgM7o|ZWjK,揚'_x0N bP ~r6HDkE ʊH(D"\O_/mMD F&#Z/*6`Q!ZU0Z@B  EDMh@K{` iKP$h=T *$X b %MˋcPlI 20V4%''I($65Jr&.oIkm(&5U) A V,(- hm,7a% F ,uǬ0 YG@ʊ{VнVk& (aq9=@F!$$&H1!Ă}#J)A2cBpo1 Xtٜ1+e. ZĥE@ H@ڕ-0*pKB 1(r-Zߩ2ǠȽ AHDc cL0ZA@X"(JU, 2$nf%F"ӽs"V +Ȃd3 AP)„ :%F U7$ZÂ%tiIUQ)!c(" Ѯ<( $Xi$I)Q_<դ,4ۘ,eW,"# %,+ LsR(=d } @V,!hn0NJT=\b`uLL I+@+.jrm$ l yDd-cҀ6*" i>J۹+L$Mb˘ fVrQ,;pt !n$ZIL1V(. X$rZ=E(dP cEb*5%H%$q @ hQQQ4&=&*!"͌žjZADYZYBŬ9a!I(@V(\N@H@"bN\&:K+JA(tTJ֬ud4YB YFbD&W(Abe""a LJ3)6A`DT4)16M'@Fۉ$P5!#!KDbVT7-2%BQH#XD&`$㊉(2sLi2)"-+o<ЀniVv%;B`W֊QP M Hʺjdє0.Jc!,Q"a M %V+a BĬ A)bwDwf 4 ȬH 0"JL$ E͌ uaȥ !J h dpKXBJPI@[T )>.f{Ё@Th$22&eYX ٝB 1ѧ =H AR0Q.E:T ;@i F!ѱ,\QE,[DRB= "\YRU泟죏>ZV:,T^w_/_϶mve{e˖=n6|;o;*%BDH$rl(朞FEBH+ܤ1KHB @B7#@)H'vݧLn5P *!D rGR7X;!]TAyGUl|5{#(JQ>?AE(ADޞz %$M;?e 塠<|#[fΜ{fs0E0Eƈ„+,?5SM(P+DQ 8P/0))@z4(w(C  T/=H (O!<PrH@QP-B h  |0&E0kA#cB_cC"tKc?pֆPRڀi0⿜2CJ<Alk>` \| !п0&N!BpA@x(Pxj~E!}1X-bh#JS$0|QST?XKf(J% $aT-"Id ZRȰ(1' Lò&B2Y |LE"{ebB٣H"| @SN@"'14%Iϋ"A,#x"ރ^/C0^ L9 X"-$XEL D Hxc%d"!}%YhAeċxi/#!$2"Dx0EIF z"HD IQ8N#Ȃx!O$$ #JJ(S`E hH8.YDDB Ҽe'Dx `QAևL12x)(`C 'I&ɲDY& ($jD^H: F˼+h87MD3 E  9 E2 +˘!zyCF2O$' dA%I`kad/c dIEZ)AD9 b\$I%"D$/J<$!(3,8-s^"rS܈^b1X"2AH,űH#˲,H(/9D% # iK,EǴA0'- z},%{$ n1Q0HyeD )4EYȂuӂ%Q8^>%8-#IY IXM/ $Esb97fDFB^#N'zD5 R(Iċ"DK24B!9ˬ4+`I"Dy| ͹h DVFHxI%scX$"" "q},jX` E#G$ 2'H^0Xt>yNBnXG HBH +cH$N"f5"!nQ0Ș<#qQMb }xd/y(wI.y a·YAd$$ I3D}DeDjy/$1IƬ$2H"Nehhڍ#Y87X1%I$B,Fna'di^@dIFFdDL149!GH$ q"xh<^Xd ׇ8>QO8AdE-9,%I XQb%-PDX$7ODxIyhax,ŲbE`N%$$QOD$#x' $ẕ(T=f0BZmqq 6O]S90otoQ5滳 v溪sChJmQ2mdJ>X=:y6E1Z-d AU>dy5'Er|VtSָ:*&h](K3W'r":2tBO1crQNyZEI|o(υGh 'h u&'5ɦj!+stґĘx_%Pgb". e^cVBOaNpYtڜr9x8d}w akrWE Zi8 CeDTjCW(.*(CݖG1ml`]&]%>a()6霰/J^e z'' +cg!ΈVFDє0"9ZZ`Z CPehq(d/iMLih+U:(st:ee]ݪX-]i%ΒPMZShqe0ZW&ƄʋI4*l/9Y+s&m*1!n h-# ɳ;RDp eJ b{\A)#-B #i4`ΗWCpK I, i)q9 `bdymo,_f%ѕ6+)ԚrM ! ##*9!ӰXO thEY|!Wq(rk9{χD2w2Ҋ&VciҘ i]6h #Z 4,}e CBF(eCY6Z̪5ZCpICW|O3L#Vp1!_(p(m|L% 3K+j{z$cm|Xf9atzb*SZ]- 5ciJeGVh$W!@tB7@<(OF9j{ |H+FH*M/(+Xu* jBbM2Th> zTzjLHن))YI++gpP ` ^I*#!#llaYbԸ\.w!/i(Ѻu! [qB_.y=FK֟|Jl("lZNQ ҍ(,^Zy"Y:qSmLpMI(Q1'+,Cl-Fv>"X u"֥?`fM)ZW錋3$Dp !]"*Zbqm=kUA۫sbMq8D':8D4RӮp#*EW. USЕ-*=sYޫkfsTHҜҹX#񬥮'taE~Y'V΄GJi|6z &I2z bN7I.F.;5\jIe}T$%SE%7(*9XJpLh!V9XsfBy;jK eS8Y2/,AV,Dv&/5ت5fWaNKmrnD5c*RZ؛(V\=˲eee @ Tsrr4 !?(*tK0!vykDQl<-!Ar%IW?7e$G~/U{{ Q1$`%!pu,#@/L!|V H N/dd L?d"#쏯!"B'9P@@2+do282{CKD}7#2iFxkQ_(#D#YB^G \ H~1\I c$xm,רADž&d1F<;B(mZF2ɈP}! JhF$]i@h|ImC_V#XʇOBHB8 "J 4]t?Ұ~FWJt%^ W4͕Xh+rJ )@Fp_?dZ( R ]QWκ*ԕ[ &J!,UIuB_)r/\i(H+!:Mi@@T18.v S+Iࢴ z_0 0ZBq FJ m_\S.@?D)IBZD pAj-ȁ}eKTrJ#Ji'dn &@o:A0p^ |34DL(B(BI< U(h  mrJP ̃a$QzkN`TwAiZA"tP6ALEqM!>-"dU+ʸ@J$p8+]ae8]@w]>')A6`> 2xA:C UCR@XF $~AHFK2ƔȐgg$2" >IࡔzL(,_} aE)qD OOՀ)$È(!CPH+A3{R; X ý.22WNB.a!=RZ1!EP KMAjoMYF4X_ ?)H N) { ~!DQ!# iWRguȓ#ʯ ` #!,!|#%ߌ $w['8OISD7%ɴAJaJLi SⷨO_@a}L08D"#d)W%0%P"* )(;2x(B VP2##- $`"=cL莲F&m!90FsP$0$c@SA4eNc.)C $bW.ȇ ~6X~NC ;0+Ls ,b"HJ/柗TЭ4&4 p`Ph)p< <(P`*_@`&!"!f>Bt`TH(,Mya~u !FEh!L#F{# !X`߿ߛh /a+zM"Sߡѕq`CD(Op` C@P cⷂCI(XA&N  ΀XeD@Hd31`8)S(.ջf+kIQg]ub`+ 4#+7l_B!SYWUB`M#.|WпDѤe+w \T jH ^i_+?o+UW M9=HP_u;UtͿ_$4Y_+RTP+7'$ )Mj6Ίnu F+R5_ev_i,nDcEkTאrw*6zuW4!mj!k)khp),IE,5T=#cTSRW֤\.5j)F\Z::5*ua2A0X|*n5EH,RvWҸ"+ |iFW _|j&6^xu u4R`!+PW5j~u*T+׭9Aw*a\QŮ,_JoJj>x(CPI(:g"B|et zl_ _[Z]]r#!b9X5ITMzr8*=Qe&9PS/kNtU^5!0]D DpA׭9]5Gߠc8u% JjշW{!h,2,_uwkǰ+ x ]\[lQQQQQQQQQQQ=j=1)LbHt wYeVuWQQQQQQQQQg w:5*䎊 ӘF=#(ܜ*CdHw********** w's*՝**********ՀVQQQQQQQQQoBOwg]EEEEEEEEEEZ(ÝR#~j}DQy^B,˲,ceJupWQQQQQQQQQPU\\\UU,<je!&)<e]k+a#vUTTTTTTTTT'+ tޝ8CtaW1UTTTTTTTTTTkn򛊊_Mq5߇P PcTTTT>(ΑV̿ cY)J]QQQQQ w ,˲(!%! ؔpb؁U% V'8 l8 +F*EQI0LDDNh4({3(P (NIIZf/J14M˲W1cF(j%%%qqqVOFȖ8fY`0t:U>(ZFYBFcnn.6 VeňW: \q[il6~-ETAvrjf3B8\#t|1EQ Aj$Ir8PSDQTopWJ~۾}{hhhDDhZZp8L&dնlFQEdZFde)2 (se˖mٲY,ժhrssΝ۱cGdBFˁv&!l6 AZ3g*++ 2[рDžFdCe *_|966<)ڽ{劋(iXjpۯ2i*(\YYx"##  eEEF5. c+˲ ,@mݺ5!!Ai\ :$&&\ ^VVaP 3Z`-[!аThc,{np8Xj.oj###–.]ڬY3BCC/^dɒ={ȲoXL&bff3LaI&u144eYYFcqqj׮mZZmEE̙3Ҿ-Zv 0 *lY*ڼMNt|A.]ZjǦMrrrK1ƽzE_~aYs·:|?LٴiSff>(IR^^^ݺu~bbbڷo#Iݻ9ү_?XNx}ݷwޤsΙL;wՋ͛7{˗/OLLp@lllff9s>ә9f̘ݻwGFF&$$$&&OX 8xޣGv9qz}{9A`YV!N8ѨQʲ|%^BPVaÆ 6|G-k߾^%))Iӵi&%%ab}ٳgv Bg}?޿.]l6裏ѣ=zѣGEE`[nbbӧ!rNNNf(jٳcǎ/^ׯ_znZ^^`@,۱cǁc㤔_,EQ8pFĉE%$$Pջws/666::m۶ZVW(7n\JJJ-7n|ԩJ^o:uT]]`;vY8öڂ}J4l0AjN!df͚rڶm۵kWaΜ9#2"kҤ}ݗx񄄄!CtС6m0`ׯ_jjǍF$I&ĉk߿?B`0h} 6kڴ)hoVZZAEEEEEE5 wpt^dɁ D.]`Q[n'O,((cF$׋С.\ 㜜 zajժլY{oɒ%_uO<9sLTv풒?9rDz<vAbY²,BnnٳZw׫m92dHϞ=^ex۶mdɒKVTTN>}ڵmڴq\P_9>|pff֭[flEaDQx<ǕĜ={ܹsʞd۽{yŚD"hж`;!TTTԾ}{oޡCZjvBfϞ=o޼ xҥ,¢{ d&..w ^!0ڴinXfϞr\*j7,?SO=dYx<}pԩS 0{7mZ۷ooX233ϝ;~qLLLXXXyyyrrN;uԩSZn-bhh(Bt4n4͞={JJJ2225jtĉN:K.խ[yyy!!!%%% $EDD\|p\3gΤV$IJHHp\E> tah.]zSSSu:NξCBB6os}9sp@zرCծ];33f%''f!IRUUM{MKKkڴ)U#|/˲Nϯ[nHHQ`J:Fcaa!!$>>8|r .]Ծ} .>N:N]vEE󰗣eٴ={4i$99ܹsyyyu>vX۶mrrr|>_RR[l}ᔔf͚GTQQQQQQuBF#Xn[$٬YxA q,L&t^_efY)`gê<ړ$ c<a 8as!).^aۡPr8 4x lכ1v$V*aq OQX,_+?;:+߸\jGYZ&? D[E/kiZU!قv)3J {ur^c{1E˒@&;r ͪߛ{pWV} E~kpGDqgz UTTTTTT~ɜzw^^κ+/eNS[V**********%(ᒯ[X}sm iYb+q4MxxM18zxM.(j>7Fd:vU CB(0MUUU:{CQ| AS#6.c v;<55αv=8+CNOI&EQՂ-kXBǩWQbIrCgM؂w̒$A p%С]^ ?ݤJa}OL&A]);ي_A-keYͦSt*OޫWB(,,A~t^1BHIt*b@í! :!X~p wiuJH%⸒,90@o 12QR砠p`*qk^ )"7+Eq_HA%rfffJJJxx$I}W>1$ ,IV9(Ip8^K;8+b2it1!X o d邫XyvPTyѨhxQ ZhRTTTTTTn `Ȳ?6n811RNTIL&㳲{\`?s_ti.\hذ;={V=رc[n0 7++kرӦMQ&*J[q1JdNVZ,h4 z.4W_m޼O(n{>oƍ#F5jTzzoֽ{w:h Vz믿CݼysHHHffԩSM&jMKK۰aû۪US9re˖#GE`0^>;wdO6mڵÇ7mTVVָq1c̛7oϞ=:u0 sٳg[nvh47N(~>7/3<<_9r#6l?B}Ν;O8ҥKjzgfl;v`xwndI(kۿ$IƍܹsFFFvvFyl2{ss׮]m۶>(mx6msSN=vV7n_bŊ3f-]4>>~ر6mZrehh(EQ&L())OFO? 2v/_|A4ݶmkVV-zs\ӧO/^|С6mڌ=>(--u;vW޼yVZx{9eU`@.\}v/]tѣGߧOQ'O믿oW^oprO0 S~M|>p>:+&%%Y￿QF \B7O:uܹm۶J^믿Z,뇅iZXRIi޼yXXظqvڨQwy'...66vSL?~/{o3wh4?k߾}׮].\ѦMMZ<111==`0ݻw?}mF[oM0a֭Wݸqʕ+K/UWW5Z0^9kܸqBB{ױcf͚y͛OYNڽ{XX~7n}:Mӽ{3gs=W^^>hРQF-_a5k,Z駟~衇O.Iѣ֭`%K4jŋaaał Pjsܹ^z;wnʕ ì[w3fkC۷oOKKkР๱yfqҥ:bXŋDDDH裏nb N>}ԩꐐ+|ee%qUUUpA𙎍}MַoߣGر *٫W/&>o߾ڵes+V/xYDQlڴa=͚֭5 )..F}7,FaYt,rB/((0%%%cԩ[l0aBZZV-..nժUDDx~`qgXwk5i7L$qС˗/׫WFʀ|iiiyyyUUĉ6lHtyyyZZ!UV%%%>v1==~ zWJKKtҫW/sРAѣZ-gG}Tv_^#_~ӦM <߷o_,bΝ;f~t:mJ> :%%`0w}W ٳgXXX~~>~rk,R6CՌ*~'N|ᇲ,{D<_;k׮IIIh|t:u:ݸq&OrwBA!%f9g۫V+Xz۹sgVV^ONNfYVegg6aÆ;w ߿>HӴlE^vh(:'|ss9 B&44`0 z=o)--ݾ}]6Xpŋy晹sokt>M>cn[f2hv8?A;vlϞ=].uTeQ_qqqE4h`s?yqN>x„ cƌٲe˛ocjի00+6z|>_|ѻww}744A&igϞE%''f (G'OW(|p BBBUn8p9r޽-Z}n_ZVOEw\YYKJJz෪h m&`0ڹbi0!6`pALqIQjE8Nh8P!?gΜjJחiEjڲ2V BM(r\fYєqN3<<"@CQDQ4L6k1V烨2`0fdE2$$l6B ƿ$IzZVrGYYو#222͛r\.N3 `Sʲ n9@Fb`]Ѱ, hN'M_ 4_yynG< EX@0˕$tao?𔊊2q\bb"XJ/FDD[ptPrz<%Z,*EeVnuu5`F# \sG %QB@~%j]zuAA?ϲ-Z`\.Y!nRG+<Ӄ^cÕ+'JeQoFݕƂ MNA6`20۴iӯ+RY,[@9_w& R 'G6*--(Jwiw******6.ន 2KKKKJJ;f_(p1 we,ːBw&0geJ *?OB Ý{fpxQvj5A(zz^ Wo#""jժ< ,Ju̩`e*JE1 voiX+ٰeh4qv*J],~j]y'uJO* P*|(ÒwBCC.@IVC5_^}SQQQQDq,Gu-d2}pW<U(*$3$'g+1AQl].n<8܄JG.{Y5~] >ڳK춡䩜NQxb&M_kʟʕ9Y XK%uNtUUUYYYڵBN*%%p[7@ŋGhh(-Xz7+++66V8 ]L{1>|pÆ ! ME\`IFUdvWp\KEjx|k^^Ь999f9""BghIZ^=xv…TeDžRI&Ik `_¦'NŅ ;Iksj0k(9,J .*fIQUTTTTn[|1{LիWڵp˰6MF4EEEǏt]!jժ~p(7.44>p:k۶aönW_~g}_[[oeի裏ڵkٲe N޽{ő Ș8q|'|rI&͟?v;699Eq޼y'OرO~v])G2BH$;/'E7$͜9sѐ%PZZ:cƌݻ?#k׮ݹsgXXkk׮-[8f͚⋐Ӵ;woꩧӌ+V|Ç[NBjLd`)8&-[G(/R-]t 6TNLf͚ BUUUOîEn@n&_tĉSN :T |}WI_Xzuzzz^ք^8ٳg;*;n9|rzƍϜ9?W_}{…ѣG7nxҤI dNvsΜ:P|򲲲*Ǔ{կ__/믗/_>|pХKBO=Tbb"EQƍAXzuUUUEEE|||>}۷oʚ9sc=ֶm .4mڴwpYtsdYnڴ۴iӹs缼<ЬYN /ʕ+].W׮]/^xܹnݺժUk…4M4ҥK۶mTsiQFu~:u_|?2|222VXa0!Cj㏣!sܹ=zz&e٭[&''>͘1(//g/t<Ͽ}VMJJzꩧN`.oܸ_~i޼y>}̙SXX8dȐӧ#4ٳg?䓝;wر!ԸqSNČ9ȑ#KE3gΌ8vXN8;thӧ/^l_yCm߾=>>aG9s\tiС/_>z(!iӦh֬٠AVZy!.\t}MO?Tǣ аa{ ,wߍ1SN?|bIL-Zc֭uIOOٳٳׯ_ߴi?giѢEXXXee%KrssywަM?0$$G[le>x௿ZV~+,,|#""@Q,Xҿ˗C~QF-Yo߾EEEgΜyGv/((ԩ_|ѷo_wߵhѢrĉJBBºu,XܹVOAEEE忊돪N3??k׮ꅙ?x{/i5:wE ɔ/"FKHHСC իצMLg6lXPPoѢE f͚?߯hN:j F#B(&&v:tҥK~Ϝ9 8дivڭ_o~̙ .ݻ?uTyyyfff߾}۴iS~&M|&=zO?١CO>DHuǁZ7jd25i_ͽB<@hhh^^ovvٳg7oM\m֬YO>dV^/|1{]v]x?>CVdȐEGytlnݺ}ҥݻ4hЭ[Ν;oذԩSzV-[~=|Tо},K\\\ddÇ=ZXXxĉ:u4$lժU޽/^E0`ѣGfϞB.FSVVVQQQQQQYY ]iiiǝ8q[ngϞWh /))A9mێ1"%%Yf|q={,_~e駟aڵk=zС BH}W_~eϞ=VڲeKׯ+\pd2Ĵo^KKK۽{7 r` [ndddڵ- Bj!F-rTTTjjs.]j}>r}?;'EQ˖-xwN篿pFY!~#:w裏:u*::d2!^|Eɴk.tkbbbLLӑYo=O/2yda>Ct׏%\.8rԨQe j]vꫯx/R^^.I00[ϊ8p8\. QQQ6Omxa  hȖՠAkZh\әWXX;&թS< Vqq1!$&&szӨQǏUWWGFFkf]vTTT ,KHHHyy9 Wr @-*|>_TTTDD---/((˃)Sj׮=hР={8EUWW|l͚5?0BG˖-Ϟ=|ePII e!Vn}` <z痔(`!Cj׮ BN+qvɓ`p:^N:n h ۷oƍ'k;lLL Jɐ{cF$;;c}9Peee:u`<=PQQQQ\e*|׻\m_C-[6t?~|NNڵk^o-Mve˖u>h׮̙3{ӧOoڴI5m_0ӦM%iӦM6hРgϞG6~ t:n_lx"+b۶mp޽{UUUٻwnڴ)8[V0k֬DGG]O?\.x2iҤzkذaaaa`QտÇ'%%_ׂ *++aS РAӧOt:^F1..'(9`&:p/ml#[~7xM6 9s={:w#JQVy8Tfiڶmfdd- ~p<O?MJJ5jO;w.\v~AQaSO=W_aGo߾ѣGwܹUVx###xt^ժr7W%`*..anwhh}UUU<ϻ\.V+MrF²,˲n;,,`0 Qm6  #wLt:1XEEd2ǁt:M& 5 _QQ!Ilx<^`XJ 4M8qh՟}x^Hb*Beeexx86fo !u( ,R)H2Bna0RwBHuuN3td` *EFVUU~ t@O% qeee )z@b]A`Sv@A$IҔ4MO?4䇺 ϏeYz_1=q zY244T`+++%I)++g8 .Sn+fƎ۾}.](mhz (P<&p.9^/g`_RpAa+of~5k$R^7RjUUBHEŢ$Vbk+** 0)9ydNNΖ-[Kx@QTxx8ƸB5j ''G.V ;UwB Ft[Fe3gl߾b 0񹹹?cXXX~z=7Q~~~TTԽjgϞEF;vW+ Iʕ++**y䑤k5ٳرc4M^w;wwWEEEo󅅅qqq52՚{IIIyyyJJJpa8aGp˛\V\.MfdNUVʯp=hxFjYVNJXiHpX@08*uHtRZh4 uEJ1 & tݰ&z ި !Yz=p\AEVVVZ &"nQp#ݸמ`]y-psW="Oq 7/GyGi(l6x+%G$n-d{GY!ջ]EEEwB;/_$Ti|tZkAA ;!vPnK\eY[rx Y aw ]opo \J&]}"f!!,˽7&E>bt?ZA4s@Www˵";YEEEE1A$SQQ ft:Voz=8'cNhnz޷\114+5 =QNj&uQQQQQQG B;?o%"V#Jm^\7I]98yS^Epuj\$Pr>|NQG .d{H (CA9KTVVBl{PyyQ` SwʪP S yR  O|5"_ImWRC@hnk.XVVKO/, |V~ 2;;{ʻZDY[l9xԮFun 5>KnJ/ (.5ꥢr/Bp5~m'籱-ZpS`DQZ?>ܩS'*{`2+V;wݻ5k0̘1cvݵk׊ӧXI&[lyףjժEaYKIIq8ÇKJJ6lm۶ɓ'=ze˖bΝ&L8vXXXXHHĉ7n8gΜ͛fff˽{>qɓ7n5eʔӧjf OIIKsyg011C4BT|Zp7} sqqĉ׭[q\ݺuWX1}Ay}mڴ?~U4Mjj~O?8qaÆZB)(/_ٳuv|$@1H*5g2w L5kr. >.7jvH8ym1v\v}W-Zio5Fz~M6EL:u,֭[w ,ػwoV~y}w/_[r%8==}ݺuӧO?w\֭e[1?u֍ݼyW_}y԰ӧ/\e8p?4-~g*|zw}^zQQQ<ׯ߻woZZg͚k.Bokժ10aի#""Ν;w&M,]zk&MF *****wBHYYE Ӥq\ll5kBBBN#ȫbZ-j=rC=ts 3l2 gϞGFFڵW^,שSg'O4iryqƍ1Ƌ/>~xǒ%KFѡCӧ;v,;;iӦ!H:jԨt\n]v=S͛7[naaa={4|M^jժ}.]VZumƍ{ eYVeټhѢUVmݺRԪUk7>}͛ϛ7o˖-z~WFw}W˗oذ'=\eE:u3cƌ &:tO>ݻw?tP۶m8 G}o3%%o><<3LGΜ9SN͛7=z4''iӦl7'hѢ2##cƌ˗/ߵk!57l BJJʗ_~믿;v졇R̟??>>~ҤI&)++,;;{…ϟoҤիhѢ7NjڴܹsԩuC\YvLꐐ>`0TVV~˖-۷o_ 8ȑ#xGmݺÇ].ק~:vF͙3gܹ?#quA?~A̙3kצizȐ!eee2L۶m5k'|ҩS'hN:aKKKhݰax|̙IIIV믧NQnAݻI&w>>_~y}_… SNԩSVVFy.]ϳ, _{͛CTNvZޤI_~9;;Rz_tK.QQQkEEő#GhSN~~>6|#ZfVNJJy~?sB111K.=zSN)))gϞeeeW$iҤI-[ϛ7oGǷk.++kɒ%xϞ={nݺժU F|>`Ot!!!s.]4l0PddbSNݰaÈ#hm&I:u$%%lcǎ5h!wҥ輼O:.##6e{^32zhBc )b.]fϞ=`SNA?BUTTF gϞ;wfFjAz=̏agȟF s̹xF|[~LM68p`~~>PBtٜjXBBB Yhh($ׯ_!h"oVVVܹs 6\f BBڵ{'/^ޤIBPNNNDDN1v裏Wn]V~ii)t%V-ƍf͚%K, 9SYUTav!nAwy'**W__￿xK"Ν;]TTWa0dȐ>Yf @ L&Stttxxn˃t$PTTTV?W^ILLTdTTTT\_paQQ37n|n2{K.UTTƘ䓛6mڰaCTTTUUU\\b9}# t:]>}vܙuznb]vyyy۷߷o_HHHeeeƍ99rիwq`axΝKNNO<ѭ[{K|M&d:~cl6EQ 48y$XQQQ Xp޽{[hq1]V֭[׭[N:{]nh߳gO׮];V~UV={655p_pNj۶ VUV 6,44ݻw6mn9s,ˈ#C}׮]mڴپ}ձce˖Z<#[ti6m:v{'N}СCe%I<ϻ\.Ţj(jݺu!!!:uV( xhaDE8]ӁC#Pq itB6k/Д< X^dSy` 4 _f]W*****`A8}tddd$x^poZ+a~=,,&%sss{葖vw+{BB;̣J5KKKa_VVΝ;ׯfcΞ=+rz!EQ]`X㮢#Snn_ c|ii);O8cY҅&g)+LN:~^'xzկ|#BHpkoשS'Nx ϊ]N5Ǎx /׍*,#n⿎SNjx ߊVgZ$YB/?ɲ },En}] =8Q[68$Qٛr+*u]&?PvUTTT7޿FS4F)|PpM oXq|=1`7Ȳ|*В$U%݂q p8*5*x֋ ~Vf]W1^ `7r^ ~ٻ tevQ~THpWSo4 $KV{>0t\ǞRrp>w`0ܑ.I2?ώ4AuQQQQQQ+O~pFKpvn-<<b+I<^F_yY J^%B9\]+%93.rԩ'NBp`k_|B6[֡NǕ_/_|Ey Fɓ'a ;v)gL ;z.w8.0嬿S+< Lwѣk|,^ʽYYY?1]BGUtO6x5%hhW~EQ$18/`.//GA]~R;p@޽Y|7_{LI̙3eʔ9s V^o;Bƃ\e f%𮄢(Vƌ3F \ >.\֭ 'O\dwuYR1EQ`4_>''G9;jvWx )χi J6{ڻIl$"^KpR4 (\`r VNR.WS*RCPY]c˂,\4o>ФI}> !`g˖-EEEoosqƍ1* * @pڵkw~I[oҥK'=.S$)2T[A)SJJJP褈]iAx<{oodgg˲'7ny~„ W_}uUXEEEV4=r "^xiӦݑ$''O2ekժ4 Ү]G}?^b??jԨYf!F?hC=\'1 SZZ:|&M7̟?Μ9˗/gB=%%c;6--tN}vرhѢÇo۶_l֭[GDGݡClbٞxSNo~O:t(!`0ܹsΝ/͛ӱc5`ٳ̙3s>|xvpÇ׮]vY-**Zrez.]Ԯ]˗ggg7jhРAXQ痔@ӧ_|駟6}ʕ+ ҴiӹsVTThѢGӦMyO< ,sӧ_|#@"XA~g}6<|xٲeaaaovÇs7cƌC;w8qAÇ_hQ~~ٳg[l/^X,=`|D{)--tǵh"--O?=tҥKԩs̙og9{QB?7n;99yر-z}]M5].u:~mn***O8pBK/4k.c6۷o߷o_Ȧjڴi޽̙iӦ\9s 6}ׯ1bΝ;srr:tЩS1cwmƍ x<ڵk߾}{^~}UU/Do`Ya>dȐ'O4Ms֬YO<^tif$Io7oφ=cz\UTTTnh-A`Vշy'!7o8p 퉉yyy%# CTTԪU֭ YK?CDDD߾}!СC_|pL Znݮ];0Hk֬i׮BhݺukР/yƍPxVt:;ud46mo;vC!epݺuۺuk>}^xArssߟ3n8`͝>}zΝ333-[5_~0Eݡ Mftt4IEwi=o޼W^y[nl0bĈ#GDFF2 o޼YYv{zhŊ,O6QFNk׮?͛׮] ys.]z}]~Iƍ ?sΨ.]ڵѣ<Ͽ[]tdYܹsGڸqʕ+_xΝ;:uOm ؟p…͛7O2eذa-Ͼ슊޽k׮-[_j׮3Ϭ_>xK@:uإKGk׮k׮kرmێ;x#G3gҥ׬YsС˗4=eʔ-Z'NxG>|xرъٳg[n=z%KX"--7߄r(:#$$$,,' UBh׮]f9"""%%eݻv*,,$)222?(ڵc=tҋ/3f}7o<GYV'$$TWW9rG9|zz:B(<<8vڍ5*55Yf}EE˗_'Oq=ztܹ;wv Jdd?cƌaÆ3FgggkaaaV*++cYÚ=1f֪U~05nܘiRQQ~xQQQQ%Ug˲~a{q+p֥K>_=)) ¶˗;wwUlݻw/YdÆ 8_/**t/\Q\.WRRO<1`{"9tPy߿|r7n߽{we-/\PPp[Λ7}+V@8DsIx%-"R,HQ !gРAw_QQΝ;KKK{ѪU+W=###ϟ?*))s_l6baÆ͜9RVH^{gpĉ !oS^MtTZW^j& !ʥ:wW_&M&  R?t: p (wBH$<ϧ"⢣CBB8i:--fedd f-,,<{Ϟ= "@v=))3fV `o4^wZ***ު4bEY,ۭ&ZӁ qp$YVLӴ,˗/_gϞu\>Yf={ܳgOUUw}WYY 3k֬ݻ7B'ҥ˗֭KӴ(5F 9aYVӁ!& 3'(cx#Fl0d!׫9h"t:a&!%2dH˖-ʂסeAt% O%<ϟ;wΝ;w`0yyyΝi:!!յj;6nܸ****[j~~hѢiӦ}ӧϟ% x8]v˖-4MWTT >?pִi-ZԳgϖ-[~gNZxqΝg͚ղe)SK'NضmVmܸĉEQ1cF:u\.g}v;tPN+O?ݰa^}!C=zQF,/Xs{;v0 t}„ $%%l?~$IÇGSPBB¨Qx߻wM&Sv:W_qgۍFczz>{Q֦M'O g}VI.g ۷?tШQ?[0t/[VɔܪU+eqqqq,~w?<^`Q׮][]]6lذ)SOVKQ˅unݺl䐐h5k$$$@hȦ0dȐ>,66_|g233m6[fzjԨo<811i!جYYfUVV*I+f?cǎ!CfV;`I&:F#@f QWZuVa4hǎ^\\\V iǎB/_޾};q/B/pٳx xtK4Onۇ h>**gQ æM<ۤIE !dܸq,~G{Yp!0&iĈJWȑ#Ν1=ztJJʁF㏋8eʔ͛O4瞻y9?3š(BB|>N'[V|>xHC`sm`ydNe-fFh00Ɛj²0 1,j4p܄zRIy9\( WJTC\P$eM&Sraf2썏D;9Pt: !`ÁmTZ@:-JJJFfc8xF#JIrF`e"??ڥvz>86!vû% ,DB⼼M6%''?N{m~~>R@y^5/k I"2(Yeh4¾lh$I*܋0 N`ڎ;SN]t nV %~p7L,{^m a4!+a8Io9dȐ͛M)*0FѢ0 <΃fc oAF(ǎٽ{ta*`HKK&'OO!][TcXF#x^BbQMv<(O>;2*a @:[<`0(kVOB7Dj;*G*df(BH(IOp9p0qM:k3e;kz?$$!=d* K[ԺGZmmmպV*!CH!y_i@D~y+$}}s]W1+R=x<Ԏgeersso(V|F2cx]v'S [Zt\˻Z6%`0xɋ#6`B5 ƌ/݊- ,;>pk}e`<?16*d s7`k 2wAZe  Vp8ϟ+++OOOO?&kV{- h(L0Lx[ǝ666zxx`Өɵ_n}%Hhtay PmvֱeFiB1S z^$)uNvC uՁ,b1D:j[[ci- iBDHHΰTT*>DN455egg 2Pj>08rAc7BM}_VTT`@QU!B$|cbXcr"0F0Fmb5|PJ)jѫ0CJH$~h4 fabPTTt \.ck`0*e:C PG8oPYlUJpe`*րS/k &`G^o"JczzNPOI$RΝ;hd2LKK۹sgBBw|ܹs<֭ۓ'O;vъ=zYի ȑ#?S݁G N8!z}w%!! vvv7o>s  )**qưa`jZRѽ O`$?6`C5Hŋ+VwttT*wIMM:vÇ?~lkk{Ew^H\ƍ]F=<<~ǏwdGGG#L0ᣃ^x-KR)łI+TPDDĘ1c P@8s h@>>>۶mwޑ#Gn۷)S֯_ |B|…,kԩF8p`vv6x[zٳgtT*U(|>rT'N=zt޽gϞB D"q̘1>>>᧟~^nX,NHH`2w۶m?vƍǍQ=zzgς펽=--޽{SNΎ޵kP(,((4iB޽{iiiL&s…w}Q^C?3܇?.//?p3za)wH---ڵkCR3gt'ݻW^^0iҤ5yao>P8lذm۶Ϛ5F?~&L ۷oX, >|rssAn ={=z۶mFH$ZÇ,k2lӦM~iuuǏ͛ٳg;vy„ WzҥKΎ/_0`mzzJ?^߾};Bh֬YҥK!..ûw.++5jD:wFsppP*d<{ncccpppCCÝ;w&M|rмy&LiӦ߻w/..nРAk֬><ذaøq㢣g͚BhذaiiiMMMC8q֭[r߿ʔ)C ACQqݿƍߴiP(sssdg}VSS6w˗/u5<<СC cd29%%JT*{{^zeee c~Νfffk֬t:/xGYzooǏ3䀀!C^d8p` b0۷oo&L01^k^`wUcǎ'VQT'OFprr*//LP(VVVNڵ3B|a$3׮][UUg|||!䓥K QFi . kjjP3_\rذa J=} ;;;Lnݺ$_vl8egg <ٳ$iAAA`Ȑ!fͺw˗ssscbbN>}IF3 N@RԄgggoo'O(+V;_)..pT*}$>r-[\SSӱCGͭ_~3gDqqq~~~111Տ=:}thh g777<ܽ{… ۷oӧOeeoݺl2"ѣW^:66V"مx֫W/ _EFF"\nyyyϞ=;ufoܸp(hH>cG-b'OƍWVV_`c)//T*=s ܺukDD޿kRM6EEEUTT={˗VVVcUUUzԩF8ao]]ݘ1cB L&oݺ511qѢELTvigggaaQTTԹsg#VDL.&` xnH8uիWa?cF ܼjժ۷=Id۶m+V3±c*++[0j5;+++%%ĉ7oTT#FXhQCCBe2YIIB"CM0aԨQPȬ1cƨT{={ݻ{VTC Y`>n߾}s!0ٳBƘ$yLwE&}`%&&׏7O>?!}?9ByJLgTD"QT Ɔ _R0L&{xx0 M&-[FрB" }ٻwѣ x,--9T*=zU*ǃ(<M 8vBhǎUUUd2aryddɓg O$͍HIDAT$H$&d2C]4ŋ?~| . Ν;׽{wPxxܹsy<+PT*;-D!FpV^=ydKKJ"\AAAWvÇmll$ onn6<*dX5l0.[}^^^W>sѣGZmNNNQQQAAd ((BMMM@ğ5k/9 akk[^^pbq@@@QQBU& 4(((ҥK]L2L0?9Gy򥛛ۤI 0K.]D"BCCqh7n677wtt\~A_r͚5VVVᙙO.//2eRi޽7nxʕ޽{׏Jܹ/_͛<O(n޼9??Μ9NNN:o߾8nԨQ"h֬Y.]"\.SNk׮~zTTZ3g&Mdccn?`0BCC{j9c? PUU斑!JuV^^0aBtta>|wNGX,ŋ˝<==W\\`0󠠠'Nb^7f!J) ?uԩSaE.;;;33fTWW1c<{,//4",--߿?i$>UXXH"JeHHF;wn||mXXXzzD" tReeF}vnnnXXXLLK;Jh/_|-BҥKMM XqqqNzaN233y<^Nu٥K3gh4ظܹsvvvlllIII.]<==O>]QQd2X,ֺulllrrrbcc5ɓ'e2ɓ---&Olaa!\f'M{;wC줔6ݫW/DGG_rѣG*J"|'yyyǎ0`@=/^{pJ&9gΜx5p'Ot5000##C$Ǘuիd29<<<888(({;w633y7˻vjkk {krss;w񼽽M͛oԩӄ ._pƎ{…;wL2%""СCQQQC 9yѣGkkkΝkii L0-t:9 p$Ihh(lc{؝ .@RtKd2z xD"BjRiffI$F!HCA`vbgB4#ӟX!J XlQ` o&(S t:kkkaN; `XEL(Ρjycj>Ux,rXk`ۓ> .KRL&١hR$Fzu:L&\cff*++!V?r2<*˱@V%Z?L rVg"-ͶP( ,4&jj~UTppNr2 ;$0ݰC2 CWYd0g1}<_VV;|p#'ĂZ Go߾b""" \@Di` eXq\i4 F.V&La)-F /ælUTer` &|t61 Q. @ J+0[f=H.h0݋{}_=h %Z°F@ F^j#IN3Fc1l5[3X/}U 0ӷ+L.!S$>>>`,v=+6UY`Sll,5[6VYp| =(}raB 961W 1#^^^@a`oD"p `40 bkXqze,]Nh +@r3L0#B{Vo J.dwˡR=2|Lry;T#Q3kkky:@E)QwB,~[X8]$DU3 u!?F-jh' Z>R^ &` K;!dmm uǪl,Й:`0ދ^733c2rZ(֒U6jT3|]!ݧR;̕A}}N|4ouUi`Y#hc9L0co+:x/܈*W"htW׷0тD/WF:FC;ּ@noՄ7ږ@ d#5qSՐo7VHL0";j C XVayBp@>+JX Azep;bb1B@JUX{,fкjMMMMMMX+566 š\`RRzu4##秧D"b,SP'hZDOF1y<ӧOoiiiaa!0 QQ__Y>Aн{fx? A- ٨߻Xj^PF 5pb^ݚ[UU>B555Ϟ=ZmJJ LmaSn X,nlldFŨ'Opܡphb$DFO E.ku|6FQQcp!VpL&` 06a?uԚ5kJ`3;fia!^|yСm۶]|ayV\YWW' .]l2PCC/?@ դ#F$$$WI>|~rʊ+V^ :۷oGyJڳgo6rRPJJryFFƪUTBm۶[>yӦM[l9{,?sL*zɋ/7{{d]t=z͛ Bvvӡ?7n֭[nj#H,--u:]rr… b &Ni&gg禦oL{{+VmE=vXvvvDDDw% j*;;;"hccu֤w| w=x𠶶B>}A59//`,YǗ.]rpp/ܹs:>c 86 Jo.'L[XX㽼***<==͛~|dXc0~~~W633kjjRIIIL&+ʨȧO:u[nl6+++Bѣdž ƌ_JZ` | 9vX@pСѣGٕ9sD"-YL&߾}L&kZ:>p@2  B={3f̾}>|X__7eʔ888$J5cƌǏWTTt}Ȑ!-ӧύ7z=޽[PPbƌN_@x!4bĈw)}II Á`Гd GA$EL{󎎎 DVVVs)++[zuuu@O*B(::z/^ܽ{7~ܹ(Ё ԩS' dW^1cxپ}"fΜ~4J!tON>}j㥤|0 YEE޽{cbb?~…C~r|ȑ۷o|<!dgg>0[رcȑ#!֔)S>}jgg'7lc\ bGGǁ9s`l۶-((H 1bΜ9>tRAAAtt ;{+++8 jaaq LVTT٫WgϞ+VTKߺuի˗/1bDuu8["۷o4iɓ'}}}wqʕ2^~Ç޽{"[n-JNN^f -++b0 dd__qƖ4o߾QQQ))).\/W\Y__W>|gΜ޺uk ǎ;f̘-[xbժU:u¸.UUU}]t!(X?#9V<sh4.\;v,d2f͂d$sss s\^O>ܿ* ÇgΝ9r$x'NXz5jT^^dz۸q#PSYY6 2 4'ia*z !dkkkeeER!+B1^l`A~,˷mb1Hĸd2Y.O2W^ZW*jkkkffy LeD"Q&IRv9pα|2'''///++K(T+WƦG 8qҥQF!Ə?rH>D&lB"̙/H$ZL&;88@y?PI$H$sss`4blu͛7^|>~!DB$ӏ9bkkԤP(d2YPL:gϞs+@+*NknnƄY)ɔJ%J jNd2377WVK$XNM0Lx | HJ/rd~:dرpF.3̬۷?~xĉmDV+R +//_xٲe zYDDDFFa} P}ڸqիW лwosN2dɒ7o655͛7͝;!;;@ #GFEE3g&&&޼y@ TUUwM:tĉs!H@h恁QQQ$绹O0ŋO>xD"֭[MM J0aBxx8F߆D"pqqa߿޽;CVh4[[WUUzzz ޽{WVVZXXT.]xk׮N mD J ǟt钫 bϧM˯\j.]Z[[[ZZ憅A(> s/_ڵݻ9٣G`PRRҫWsÇgff8qb̘1!!!P(.^-H:ѣGmmmddӧO={V\\}ܼxb"xZݻFFFBdooG͙3[nO>=s̄ ;ڰ0sssԌ &`[AxpmUڅXt$JFƦ-6T%04 P,/F wժU5rFQzJGQv®#vYRxXʕ+MֵkWl1l6a_(!3r_bŃU?YUUedXQQrq8An믿bp=lˆ-iXZ{T*U}}=D#<a:Uj:%z0 ?d2>(lnn6Z-Q~kjj ^ohhp8: X Z-Z"pܖ (|P(n߾^x<ޓ'O`˱0TL޾c0<r)))!2xII (ovbn}jj*yGXXd(ղy6b oaF٨ 1jÖ1셚gϞWcp566B7DRWW+!RM:B؈ rrrX|>DEF$\ٛ7oj k 4uT*@$3JA_Xlv c0 \lmu3L0lnnV*wܹu떭-?~'Opld|ŋ=r .ٶ$BJ8q… z~ʕoOvڕPXXسgϤ/!4t.]XZZ.\A(?O< h۷x>>8fÆ n">>>7o|rIIIϞ=.\hff` &D{ [DGGo޼9///88xד'OM@~8nϞ='N|OO~׿+Bd~SNe|94rJjnnEK.>}zϞ=Ν[`BH$~oǧk׮III7oޤR2}:dtҥѣGGDDٳGV{zzmܸ,++k̙蕂iӦ8HǏŋ ¿ ͛wx񢴴 f23gXkkk޽b.\0j(++@`N}v*:}7op#F j;\#zӧi4Lx͛7?~V__8k֬oVR͟?ūV:tPjj1cf͚_xo7n\ttŋi4g}V\\O>$++ Jz1|Ǐ'''j\wiӦ=: Bٍ=͛C !W\Ypu4رcmmmwd2g̘ŋL<C|@x>|8>Ĩ(qqqc~ΝK.<oɒ%ܹsD"ػwoPheeh"O?UUUYYY!<<<^zݸqoΜ9ڿJD"rʔ)S Ʌ x<^MMMYYΜ9 Nݻw/:::++??>r?~,H~'gggBAR+**蒒K. 2t#G_1Br8!~?}?8fpN8Q @*L~4w` !jjjlmm{_5((H$=z޼yG׮];z(Jjkk{uNW\\'ɖ/_>k,&s=z_z\Y x{{/Y$33Prswԩrk̘1>>>ݻwٳgccc׮]۩S-[ē'O_|ٳj_W\iaaq۷ooܸq͎DQ?sРAd2SN|Myyyhh(ryyyXXX@@>{,mnnhrJ%TS[ihhxԩS+++=<<lU,x]zxx˙3g\]]7m{ѣGZ~ tϷMMMnnnQW}8x`Fʛ7oW_}!2,ɢvZ[[biib|||BIL0uuuݻwsN7n܍70yrx<ȑ#Qd[B;v믭ѫ(H!<xKT."--ӷoߖ111SNTPPjy<_RR ƍS*555n:{lRRJGlmm_xKKP=zWIB?#@8Ǐ.r9K\>yxɓ .=zt{wuu-,,D;?ɗL&WөT*J5cƌ"\xRYWWo&00~sse˖D'!H$#Bh4@ih+VAh pll}Flmm׭[즦&陟᠏.HlD"!QF2)p8v G~CRR8j5NӦM#t:nwpp@j t |JeÆ d2y֬YMMMiiiG |2Bٳ5 Zp\.www;uTFFFCd Zk⧟~9s]iiNr.zumll|~}}}SSN *jƍ߿y|}}.\?^xСC**---'''##"=#d2Z>~8BN,s$ 2GGGPvwqq)***//H$!!!Z &` &O˜P(]vẺ/|ǎ<2eohF.3̼;vwGR :?WTTnd2>}~ʕjO?t8o߾6mvСC{iiik.ssEݺuK H$M6|rvvvfffQQQx<~Ĉzj3gμ}vRRVڵs犊Əw^>`:/4JvܹgϞt:]$7ɓ'Jo߾zJKKDaaabM0!$$޷.H,,,\aNh.\鞞b8::hΝ;Ng!1@8qD]]]HHȧ~qY^d2lԩS9NAA5j333ry~ d qd2wwݻlZBgNNNfX={| /]pDbrrrNNN^""">^ pܩT*F}葳3vss|{{ ҥKǏh4E$}||]]]ݹsΝ;>}h3ݻw[XXdeeۗB>|XN>d&'' C(??ްaHOOvjjjYYYll{n޼ŋ۷oG" :9rdhhhbb˗/᪪Ξ=K&xZ{{S>~ʕ+Æ pÇRSS|~HHH|||qqqddtzlll@@@TTTTTTttt@@DOJJݻw/,,pBqqq@@X,].]belp>6HģGtYf}q8Ͷ<ѱIUԖh5}2"A>}`aGV#KKK8%[ /vh,YlYx]V'WVuZF &`  PXXhd=v4oZgDoyWRvuenyAiV2*|{OjE:-+h6 F"!!B)2`{Lecli2}xHƚugmOVn...p֥eF7‡j%1JeH4l &`G,DJe}}FyW?8T*Hk !@?Q*~D۾PrT!z^,(_!P(G! D"Hbq6lXbh+N^uMMLUX"?BGIb &`6Nfz2G?ߕƷX,vrrR4I$RCC@n< e7nd.D"566z[[ۖ5$@ 6Nv1u7"u@eT*[^v{d:S=WVG^O$Z-L~-æ'茊ƯF%i㕦mV^Z\x1L_Fo:c:BzÔN ky]oUwxh%3m`L2;DX;!!;wxDO=kU?n` &|hϪغSV755;S755L p\nFSWW"3:+BH,׃P(Vl 544 *pd2^DXR o'J+++${]]ǃ4AMMMKYC a%LHH@¼Cbޱp>g4 y'B9΃TQyݰ0R555 V Oe7A"Tɓ'^ХK&&&1ݻݻ999111}ƍ7o9ѣwp8aaaO>=|pee;Ʉ6FCS!>kssZGqvvu떷uCC'[D"}0wH$P?sBBuXz Y޽ۧOPFFFJJJϞ= DP(Zp8tStfhpւ@ 9rq R01*mۺufaaT*롃D"|0=^b1N 0)ZH$T*3PHP RvJ%JTP(=`WWWo۶[nx<Dh7P7P(p̦ȑ#|޽{/^XTTr\.F(h4.~sssZ r";wNӕ766|Fcff+OffwٳݻC;jHDR!v<ح[7 C\GӦM+..^x1ٳgUU֭[>|/ܾ};==gϞfRdX!3BH$jk[貌/BV={oV(]t߮_ջwo˫Vb0RJB:bRPTT*uǎ|>[=D,p8DE51,*/((غukRRtwwܹSSSӽ{;vܹsɓ'=z H&g &푃l*1c ;?_!T]]}ĉquV/(((::ݻϟ6lpȑ#Onݺ۷oϛ7oݲe Bb}W eڴil6{U՗.]ҥBh4 7&&F&]~?EBG eʕ>>>\.ѣG]tvrvvxN2e Z߹sHH rRRR\]]'Mt[pɓ'#d˗KKKzE={v֭}gw ;56 !dnnvcf֭$)00066vӦMJrԩd2ٳW^1bDddݻB...'NܰaN̜9s&@ l߾}7n?~H$񩩩:nɒ%>}zrrի}}}97|UNgiiO?}:[6}^|ٳg]vT^zEEE\K&m޼޽{w޵w?FSBHO>?cO ,شi91c@صk999?>yVUTGh4Ǐ۷oh111AAAL&… 'Nph4˖-w<MvڵiӦ]jD"ݼyҥK cذaɝ;w^zUII^|iffP("""vj*>_,Zŋ^^^RϞ=CݺucѢESN(((8v؊+]o^WWgmm &VZ5k,\  =J f͚rEji4###Mۉ;w޺ukJJɓ'Š>W_%%% 0@Regg+JwwǏR/Yu̘17oT*999?3{!Bh񥥥^^^ u ++oݺ~ԩETJ"d2ٴiN>=~xww;w͛O>xe˖H3fud` &ךM2xMp"̃1e`0D"э7ϟ}b'"$J۷/::d0^"##,---[?TUUAH#ݻiӒmߜ:u 5ݻwHnnnNKK>|xee\.޷o_zzz]]]hh'ON8v޽۳gς Λ7O477'''T]TRԊCEFF]vmРAV"H#GܲeKڹc:uBuH{^paqqqR÷f}zȂ[ZZĜ9sy֭AAAbxرOKKrʋ/9baa:::EZڵkd2ŋnnnݺuknnꫯfΜUYYV ҥK}||ܹwadpB~0a¹s¶mv޽2f͚c4ÇxVJ/_tvvvrrrrrrwwWÆ o6o\PPpԩ/^ܺuKN6o߾>p¤I.]JPBJ:uj„ ֭tRCC˲eJJJN*J>K.}&M:~88xL&۵k6(C WSS_|QPPj/_ܥKbi4kkk'''sss8p8_G&[gǏlkkkWWcǎx#b544 >/v9rL&;{ʕ+M_1LGGG'''gggx%g2R\<:99|L3gW@@@jjjQQ^_rH$?#۹sR~zddٳWӿ>mllB3Ν;;z^$xgggGGGP(Y,DquuEY[[D"t)___MR?&` ⵋB* t:99ZZZY\rWX1bĈ8\?cŊ'_~ .jss3P9Nzz3g޽+Ju6vXLrשS' YFGG#|ǍT*oݺu…[n!\ҩS'`0CBB |.]vfѫ͛7HǏ߿Lp H$2LB1e78x`UUՊ+>SK }wwBJU__P(Љ@l@DUi~_~%JD%L#Hj2_}}2)T޽7|FkkkגH$<D"i 1I$R]]P(h4B{nffftx`ZXX0L#`9;;C(ʗ/_>}4333--Q&EGGvvvr|ڴi111*FZMӥRT*xl6[&דd>JSx<P dHT*ZV*:b)^z͜90PYXL>jT*i4 TB V__---'LPUUtҥK.=y!$H`rss Xh9Ds8zx ʼfff<tDpxiŊ b*˗X,V(۷oV("`$ r&O( B:VZ*k4W__OP.th+LfooSRRBCC?.ɸ\'233W\o}L04Zggg_x:K]]H$ׯxb&M~ d~֭RYUU{w>B:e˖ZZmcc2Z77 &̬,k˖-#Gۻwy޽+R͛+**-Zdccs?>}8:2tP{{{gϞqƹ۷O$-X DfffݣG[[[`WUU58.66gϞO< |>q@GpH$NNNB#G0^N/_rh4ڣGRi```MMMppk:u+'J~)69a„ӧOcÙ4iRccc^^9r/z}ll,d2KJJFh:ujܭ[77k֬ #]till ollӧϵk׊H$R?vO!) ?|pSSӄ }DDDTVVN2%---;;D"'88өSϟ>}<++kG7336mZiiɓ' ɓ'\y_ӡCNYddd=|֬YT*UP666l6{ܹzիWxx8JξtdA!5l0ȅJ;wN޽\.puu =***:th~RSSkkk;w}I777~~~/_RfffqqqMMg}{֭rgg稨phXssΝ;_~=//oܹAAAǏgpO6nF=;XZp-׷cI|j5BM*kT*L2zF@Q[ZHF سgOG}26-x\ki.չF^-Q6H5uU3\ZMmw֬Yp}y]{lV/Ɯ AT._jB7D"h,XFhY_LvYԆw.vr+d%[s4]NzssbuD"_Rfff@сwl9N*vDXk pT*?dz*h[= 46z=FIPNJSVM0 Z;<@u5,vLpH G$DUAm#^m҈?e!"u:mKp70.12z(] za$,L(k(8! CR-,,Z6/j0EA6.n{_Ӂn_DP(X CvG;oi00`R:< iÿ]66 % dK 3(j^wW{mtVQ:7`vXL0  mFSe ;, Aܶu"wbcOF=Ô4 "lo¶Pehg7o>z[u_\_جۆ.:^CbɿUӶ~n}KzX9b &^gRp85E3Z]YYYZZر:f744ATVVV<*𼂲! xBwl>ӿ ^]]]TT$Ju:ԑaIX,~Eee%h566Xca ō7Ыp8eF?`p9WWWw]t~\~~~zz:jm䘔TUU^Ee!t¯n!<,},UcNVs864 >>>4|~EEL-!# P,PMMMZZZiiijj*z5< {KWWWt!JUUURMt<Ƽ_8 T^___Pj|޽={2-36Nm 1z^fkkkv8NT]%. F.UUU"e &A.XÅr8uݸqcԨQbԩS[lv09HQtZݹs7A"Tɓ'oݺK&#Gr<|ٳgK,ܹ3h 4(00r…jZ&;v<={jkkk&yر͛7Ν;3f̘2eJEEŋܹ3tdggo޼yəGwuue2hh3N)\.wrrRT*ĉ...we@PxX޽{Ϝ9ŋD"($$d)FT*-,,Ξ=K!\.ohh@9 Uy `PD BH=<<L&p8 cXTHb1?siiiFF/hhhP(ptTa<ŋG)..޽Rj|>L&%KXZZ¤ JR 􂂂'OPԜHP(  KYYY||ѣG\P(@)))={.]ZxɓR??j(BiӦ'O<{O>ǎrʃ:wliiw}>~xɒ%t:= 77СCqիW@eL0A*ٙ@ HpѣÇS(h++ &g\(Jamm=l0tڵÇA@ yyy 6,33EGG >L&sȐ!g=x|PPJ:uҥÕ+Wzջwo^}CGDD ˇoffRYY9uԺׯh__ت]¢yȐ!+Vpuu 'FpǏs.]?Xlȑ#LÇ>}xĉ,\jUAAACCߡCӷo.]͛7?~bR޽{޻wh4mҥZVT촴۷:uի{ss͛7*..fX BՆ2aÆ988\p!,,HNNdݺu{ILLYMM vD_zaÆgϞQTqϟ|ҥKt:֭[WT,k֭`SԣGeff>@̙3l6{˖-=zpwwoBHHȥKLÇBayy9nz!{fggO?tUUUQQQ &`Gm3\- {ϟA"755ݸqcŨ݇ Fzz@ 2e C$)Ν;Em49X,7|+**Ν;7--_~oN:ڽ{,,,.={MBO۷/B"***++ѣ!V sΝ={,]?uG[TRGv޽*>>~֭377=zM HlllDo6r]f͚ & RѣJd2Yxxڵk!, F=Ν;iӦ]J$ fdd\v,44G[r! 4;;K.AAAbxٲeK,R֭;uvSV777/\R_N>hѢS( .#F̜9333=zXjŪtppRj붶[nrss[`X,D;w.Ng2g~A=oߞP__O"Z-J=|X,B3gDAa3&H{=z4Nߵk!+`cǎUVVj޽{ܹ399a *A+\.?qŋb1:88v=~xzzb+Wlll6no߾aÆ^?pttgϞUT %00D"roooԩS'wwwwww777!TVV^P(wNLLo@J=z􈍍e,ή6=== S]]=k,d⬛` &Z]*S>KRR eeeC A8hx-[lԨQ"ÇvZ|9NGd2TVxR9s) .Ν;f??A B&P(}||d2""##l6B;VPd[n]xڗ/_huuuCuۻ,عs'B9x۷xFAPCCX! JPL2eРAyyyv駟f̘޿1QPP\__||P(j*J*Ξ=СC x<WTudɒ%VVV_~%Nx@z&H666AR1L@ӿ+777xUH$ꘘ6,77[ZZ]H/L&%%%+++\>a„QFI$WZZ* xB0D?jDRIV^mcc!ˣgΜ tLfCBB8Nzz\.򥅅@ 333GT*h:Fd2B H$H$5^wqqY|9@Rl5kh43gD"Lv @_  _~ɓt:#!$ 4K. FHTTT # &KJJ6olaaXWWW[[kkk F.---JeDDČ3ƍ׳gϯ~p8WVTiiiϞ=X[{ݦz>VMzjkk뜜Pqq\.JEEEBfv={P\\u%Kt,ڝ &`  _~f;88888l۶Q,w֭*,,$0ݻwd2Yuuuhh98J_ "??`888o jɓ ɓ'=zxٝ;w8K\\\~L&p[n7[nNNN={%L&۲e ^xUQQeXXT*uرC Ezzz?J ,p!FP<<<"##]]]JCmmy<^rr2JQQQ;wNII!!!b#..cQ*H,,,e2Çǎۭ[< 2W^>>>:uRTݺuS(~~~x<ۛBvN&Dӧ 7n\qqsd3O&LÇWVV>}L&t zȑ!//`X,Htzn݈D̙3srrc>uUz>==p!!!:PeرcW^eXs ɩ9r'ORPP8s=yÍ3˗Ν;vl``P( rt:^^^$k׮)))IIIfͲjbyر666!k4߹sG9;;O"H$HԱ3zBBH 466vxzOWWWPe`>_heH9Q&` &wxp BtccƷH$RFx<H$ZZZժղt齎2Vm]4x|SSNiib uϿ/xmm vd(`R@B\cc\.J2̖͋* A/$B*Fحvgٶ =s^zYnUijKNr &` &bcT6x2ѷq:[-*>-7|cm`!y혡,$shyA.jvzߐFW}o/oV`cH~k'{lh2ұ3 -cmL0Lh'h (Z"''U*˗/@єC\%^xFqܗ/_"=@cAuuuj~*//hWKKKsrr@ŋuuu7-˭"^xQUUjjjχ^kZHP\zgsN]]]bb"-{\tL R蟧g MiiQ" h7Hە^l:!___ޤR޸qp#^j8 ;Xa45- ZZ&2 ^[VB 7n@jx!JUZZp`M``SSS^^˗/aϟ?onnpMMMeee/62X0&|~]]X*x(@ XSռ Ǥpvqch _D"\UWWcˣ &` A.ZHׇ=|~P(qǏs{iL255ٳIII2r!*zܸqۛJZ*>>~iii)))}MII/t diih"P9tדvjaaqƁ 8{l~~Mkee0k֬ӧڵ+##C"ݻ7==],&%%\r !@XJBlZPV>{kRRUEE733rz=E"BXvmZZZVVV޽;T%IqqǏJMM wJ9URUVVzS]]meeuy (pRNC0`Z}OOO{{{]H$b{:N&UUU;wt\h lccZR`h4t$xl6DSjnnMRJ677KRhRiSSJ$ opʪT*z<D&lhh`0bX 0LVP(x<N@Pd2-FR?BNՙauV+R98cXBݻ*H$bĄxE$ϔ=z,]*]|r4dsrrl6("4 h4fffF$IRZ@"jjjT*HFc'O>>qqq׮]  Fvv6Ă%'Ox͋-*,,?#̎GTm۶͝;777788cYCjW^}X,P!sssxҫTk׾NJn:]d2yĉD"ˉڵkNg0SLYnCzzٳ+'Lf͚O?T(:::R(gϞDe˖9::۷?OHHpqqouVYYrʜ;wua0tkO}ܱcˍ ٳgӧҥKCCCrrr6lp;w8::p8:. 7o|͊ 333\~z33Ç%&&&%% {,z_{nܾ} Zi߾}˗/1b^hΝ;׮]{ML6hРǏh4Zmccӯ_Ǐ8qbϞ=/_.--}mܸts5Y&` _׎VZ%H 跽=(}[PTw/jnn*M b"cǎ;;;#6CtpX,O?`0~ᇊ {}]dI~~͛ᛓ'O!{}h4@0|ׯ?~S*_~"Hރ633CGnݺ]^^|ٳgǏU(4ɓ!!!n۷ X,ָq6nh H\]]BpƴTvډ'b?)Ν;B柸`P3,,ܹsׯ J&LXp!ڵkJJʱc\\\+OOO s%Ҽ@[[.]=\,/_|…\.WVHE$%%%%%}~ic5HNAA޼yرc\ҫW[>}~JǏ6lXjjF}*v:jԨk׮=_w^mmmTTf)77W !x~ܹs\ի\. *Z=yiӦ]~],D~>xyy@cUZZصkB˖-__O&#F|rBz\-`Od29...""B"dddTWWoڴ`$$$@^^^[ !ytGJ#jkkae}k>}Fmeebܹ0f̘+VXYYܺu+<<<++n3gĬϟoݺ"U999}g,֭[jZRI}}}7!~=L&v]R߿…=L0L@mB‰+JooﰰzOOO6_xxXZK.=z_{ιbݻw/Y"H,+ <?*iӦ-j:??ŋ?H$=zVVVgܹX, ߿s<!pnj۷o_z5111""bʔ)zk׮...:u# DOb֭[t@@P͏ԁMJJJl6&|%j5ɬJP`RTssshd<oee!RJJJRSSSSS9`@c!d2+**^xl1إ1LPPC,R !BJ˗ZK޷u:]FFӧO>}jᇙ3g:99I/k *""J ;;;???.=gҚ* <dJήkRZxpmxxxdddjGGG5E;w޽{nnn|>h/^TVVZbt:݂ `FJH$xYYYVVVvvvz?޽{tt<L0?9ٷnݪ;vϝ;ˋJ:th}m q!ms|iFd2PRlll._ =z<{,99i̘1}0`q޽ &>|y=d ~khhXx12AӇdN0̙3 >spphw9r N}p8ܙ3glvϞ=^ :thVVÇ.\hggjL&KMMӧ࿧P(~~~EEEuuuϷHMMdzj@t ͮ)))宮ƍ333uB(,,K.}􉉉qAOO&$$TWW\ѣG8 22&` q r8DVL&DL.kll$,.<* @XohmC]t܁$cTJnC\.F}Kk(`WYYCS^^ŋ'OsȐ!jf;|t05#Yovپ.ÖP?ܹu4G86233 DE5t{aH$./&aa`IRӍ3&44Cv40eԃb>Z v(2 E-Zh68sBFŃ%[IVpD _^-F0-paaZ6* MjknnN$CBB /ƖG7o속jQ 'ZځL0 Y}ЀFJ*..xD"χ@*#lvAA+DRP5[CC\WUU=}~***jjjžJٳgBPTTTzsf|6ssssss+++u:@ ǢBkZx˗/W7o޸q30Bϟ~cMM ollp Bfee=~ˌf||<W1pW\#v^|7>0u~~2lpi^HOOA024e.,,IԔ }'ɲ8knnEQHСC'N@b1 //MMMpapʍ7MXwYi^flÔq8X,ͅY__ra p;\_UU BaQQp oL0Z_dN֭ۃvaii ,Gnڴ_~g L2--ʕ+> ]v}$BJ={655t:}ڵ7n3f 9vXVV |rKKK0b/^`04׾}޽{޽tN+Wvg}6sb__߳gmݺuԨQ.]JOOzjppc:Û8˒l˖mLBI#n ! 7妇TRI'&iz'666].rr,Y}c]j;s̙ٳg##g磆`f6{zzB!I Y۷ܹsaaa... n/{^,,,>}o(^D[߆ EMMSFFwܡT*w Ehh(aUωWQlnllD,z,%iooG[QZ`ػwoPPL&B]F4EQ\.|'iiih4r8&{@Qbt>@tٟGV4, aRToo/ rvvfd2p\VhD"bqrrBCa%-P*+ .:tٳ?Gv3g|')ݺuJ"B&J… ӦMC_~ŋݿ7xcΜ9"o-))9|0"Z}kjj*++MV;::%dbX$I z{{h4h4677|6=::T*l6kkkD]oݺu%Kx<Z^^e˖⠠Gy`0;v}'3g$LMM >f{zz>UUU|AUU"8A\t]w!^?qqq <MMM!o/99yʔ)(m+讛nK/^~_yT*}i^vmOOof8cǎ͜9$Ip)WKllh^^w}> w}J/88.##$ɣG._<<<|+VxGիy<}h G?w\yyyxxee77իWZ w}MMM 9sfpp_Fkyyy ü6l(//OHHmh p߾}þ¸~ҤI$IlFr}Q[V ;:u*搗_~fq>ZjաC>矫j??G}tO?4n a8U}2m޼Y>3c\Jr{{{;裏 x\^vZ-R>;/vA}T* /͛[[[ѣ]&}af̘O477;v >> 33 e˖9r믿6L;Ν;3335kc'C!!!ȥCZܻwwsssmmmllsPPRT(_?b聁\6mCٜ~]w577755A;*z``^?>I >lWWw]VVꫯVVV*G}b͛7n+((@a id2%%%m޼yxx ?%K>q#<>x 75x斖SOH>مrc5$?z(AGB(B -l1rVuϞ=֭׿ɓ'_~{0???11ՕrTʅ<тbg [|M&D"-Reg̘q zpw\urB^www ށ+3!WyӦMK.ȚѣƍhhhHV#y}Q$o& CA:tŋ($""=I-**REr__ߑ@wwwcc7h2|3g=zلoBfR_|qĉ7~p$33 ۶m;x V4(;4ͫV7o^qq믿'GR[[kx\֮.bZGFF۷wwwcX/H4տ6]GqwwZAD"H$BJim/b޼yUUU"h˖-bqZrgΜg===M&M7ݴtR^Y]]=88bFod2L&`p8ww@ @ (q)EQ&i.V[[RAZj._j>"hɒ%h:""B$ EDDrs=d2\0 $%4|{ݴi ,,-{ωޤ[o>;~zLFDQQQmmhJ(.ŋyyyb8--e`` ,,W^Zz}p+ǸWTT;wnppð>4o'㞟Ңj~1=,8!H$2?6ԩS0--ŋcҥӦM={H$OsssWZ}vUV>@lڴI$577( f͚5m4Tb Zk.w# |||R-Ɲ OOHǥRZ3g`ɑd'O6(Z(*&&fɒ%yR v;# pqv=h yOc28J!( B&a@5B"iaÑ|HCC4MIHd `A)!N11T#sL@ C3>> =֨kՀzmph u5`( Ri?P}>'m'iI~־E8l6`H!룱u7?cd(04 )@ןήN7776] r7m6T!hOl.eIc}qi_vN1c2 CvL1ðήN^fM۰ec%nR7p:~0* 0nȃKvn+1ئA[ƶ|06yF `ش ~Ruh~8Zuuu2wk%`fmz &c8zTsm|CJs1F\ah{@R]~$:ٍ=:r/OjؗZX8˾? `ÀU޹j9F_2(e6UU3 ^C5٪?oS.N.AyllAf3K2W.]tg+O? c O.no ϭھk?_6ppY%_oq?E\*&رѱ_~}E\>~կ.+ +12-ep/?,bx`n5?rͅ\>C/i@;t6Œ\C1!ze"mA@hSrƜ-0["RP`\QA_VzN특ji- o Nk+rp 4E B}).N34>Z(Nj{1?? HwĹ8}qSfjn\E{"h@tW>F?K?jw]+{. F[)>SlYs~2$0*>2gdb8P?iZarcca(6g‘$[ qJZwАa7]Շ5.FW+d"\q>d5MDcWƿ~pN.9I@̘t; + 0i+  e 13?*sp>Xe`>C0 ca@+qfhp ( P(#C1A `S h+mHZHCi ,aeA BIp ER l@4mqKU0#,ca8? `&i$cb0qh[&)_C (H `l 8c)hH@ i !Ep_Q%8q(ʂ eP h@.@F[`0 b@Y)H@[hv__pS)n^[/_ 4)!6N@a(+Fi!hP_Qq{odCh ,^,q6n RG!4`+hP,KQNhb8p дelmkD ۾\hC28M,bL9ʾm4Gہ 6%͟f@RmHXavqӿpw 8ݼ5:by9󜛆z4=@oaPѯHw P4C y47728shFwI/>m_aB5&MBsSFУMf %!Ӑj q t4 6k!ᲸBvv4X}d5a2Pc} a\x.F* ܛh@34"F1 h!0|Ὰ}h#}C d|V^-+ a+(@{mV# 71f` ڎ:UosKNzvP;02fcFq' c~@`o@YP h( zeh0#0J ȓ!MY(sX⊾~@B) %'.{"<#8a`5@ 2 00"Acb@2$gX!K;J1 YЀ!1O1ibʾJ*`E2w꡺C8) u{GG@MC;VCC,~]_ؐ%~n~jK.rW*,E j2gAf0trP21 h۟HWө'+4Ф5kN& @w@a\ +!d0FVL1 }Jg56"5Д^w髱VD)lhԚ?8? |?#+9﯊Y /)Oz9yIR'ˋĀ${%~IX,7^. ,]>>86x"e~2=5h&랤{F.eX/zț8`y[foq0s=np 0~ŝfh%%)\PMMZխ㣖 䢞ʜy-_i]g|nsI^Iʊs_: I6 68 RSWo_}gK–4fmh4ywȫ9+85lYC>-feZFO6JxܚM!6zOgi~bd155GubPu݉۫ MԻ z|R[-9m9CVg1`S¦g>YIWRiG"o*ěå|.m.[ߞ PLLKqW3xe+*U>9!Ð43Ypߴ .t^x ըjߴ+zCըj88h5HVDhjpdgUm>O߷c'<9Oc}z^Msdg>˾V!G2ZCx,^n[k^rҦVUk{k_9UeqwV$H <<(cnoh\;vH*UMQ7[""**F#΁ WƜ7}S) P՟}V]5Zo[Yo}Wݵ_ou`3X QQb->0la2kQQ΁['ߢjw)0G|Z-x;$E5 5(VzGwǫ_?y~|Rʗ{k̚KjJ'/ ]mѷ~0bz(z8tWE_m>9?ӅRSř/\٭ه m9{̀[n/޾,b ܢJwGhAP @ `X@0fTl]^թBy,Zg- ]ךޏuj;9MV_PT  8,3}CK^w3Y+"δ ?~/WꁥD8{+~A_39-70i W d3[ȕ#ZŀaIM~SMՙ6Fke_]CѾ(piJz;m74p ?ѭyU(gM \I'zH7d-~lߢEF͐ fhT4Y) Etfo};/VvVp\*rpC*.E&ԯ 4Cp֘3  +>:T_?5 b V&ܘ?e!0`Ӎ&J ?l.K@g- Y$JppNh/ >}nn@[C!.V|׉;h7u^L̚;deErW擛2/chέؽb4WCpTz+ʹ.8p֨ess~dzL晛}E݋6c `ܢCebYm- o[ H7#X䋒/nWKԨugsN_ݭ:wk'@ŕpIF1#xMi>鯑\9ɋa b.t\XtgΤdJIH J3YM$M0ĠÙ P4&M\OTr[7=늯,.$($ @{O6]zt=..^.20װIޓP<8|<'!ТEsb%r8*2ݵ;/b*'>5(C  1>1='SwZ<9;53|}-ĠaK)  s C@z<}d>LgGl!00x!R_jlUrqֳ;kwJ@@ ̯U%$zy{,'SoLܠaPk9¼Eτ4yZW$IE2-p!=7^snjؼxsKΚ,;\ O> )US}dwdO2=J|?jXzFuK;K!kbSuV<<$\WUwF`W PL8B[:G:D,P88Io+.8{08oޢOvS<laXܦ.cי3:΄;}wThnTj4ܴbOo*gpֽI ؂?ԛ# } 4sr{7Gݬh)m b;η?QwbztTu_' ֪me ӯ/(Pa㰀-nfSvt\%=%ժ gs@-0e}e'Ntiv? P)[MQ7QWYWEw@akim4A}JY:tW8h$Ӣn;U1@QX2papY2_çNInukL]Ƥ,++b8U3SQdh4Ed5g̺+ʄ]Oi_jH9&uP1`,ըl4``3e>|ca#s9#_Ag{C3 ҄f}Ƞʨ)&![fwkT~7!lhraid08`1*[o=ߣqqrYrnܓ'NNu:2 0@14h<1wnP1X8=Gsp_F4â-`5 Ht.MWPE,Yglݫ1j:GVEё#.n#%%=9-9CDD+mMLnΪ*.uR 0(t}飢tܐ]5**6AStO]E&d-̓,.K5:|zI>YgZ6%Bۅּ?g2WUN0io8?d=m8ghз0da@aɫY\WnfՈLB]BO><+U)TU B hzUh_o`)*UUgM-q1E.pVU)c@m/GsC j:;aAgA;Rp$@t蟥 #0Ƽdǿ*ز o B f0ccYE_A4״' AZHUq:w֪W#8F`FlAc( lHP @i%FK6F[i fз]Ȃ Cj"$h @`!Ǫ98EQlՙbPw$c,cDcH-1$3FAa6);c"4{]кO?1Pgῶ^Vut bg8AZId2Q@f0F[hDE+]eYіJ@ap%eADgX/ fĂ06F[h caBC&NM?j$] 08DVǐ ):+Zl4C 289NP7! (@Oi\ifh)`441Jp `s''ɟxܯi4Le=kc& ͣFp]%@VIMҀB, `?!jINĦ8LԸ<)A4$oaCsय़U=&9M%rK)@@lp)40id $@ Fmk0 @@ȱ,+i`~ 0$C[h`I{J;11?86`P7XS`0;Y(35Fz ^mm|_Uإ$MP&o߳J轂 2ߎB,!L`p`ȱ觝 m2RHp8azǎM? U@t2_*bi`i4Y~HfԴV@ `_> bHDocVBvƦL[``DJ3m.v5o+e@@8f0 CMe7B&[86ɐ~ڤ]`4bl; [-VDFMH39+xiC%gsO8{QO+Rv(GyWXJbHJ4M ^ 0w~9U!Bf`m!#iDET ɐz,sI?SrEϊ6X <.ȋ^oH$+G.B[p6Sd0F e86D"PF8q}87pwT*IcKGh4j4OO .$B"y@j]]] 0˟vTf?srrl I 2VBɧKq R4.CM2 ')̥<" CP}X-3 =EF?̩hP З40H%NGK~U- Hd((YZ,DIQ t V&kَ~Bm] >n벟7b(H!z mk rG_[d83Ajk5* v6l*@ظTptY? Kk 8P& dr8bQQc=ADCA:ni4mPY$Øvf !/)gF!*]<00 Cf6:1X&Q=0Y50 lSm S81 ѳڗ]qьI$\SSV|||4MUUUxx;z2MDL&Bpо+=lARoZ...>>> 466 P,d2@P[[AdQI\. zztt4>>bE*Hy<EQ~~~A444 X'E"l.++sww B8ѓpAxћn 0ñ'''N:pĨ@Q͕Sm b0nhhA:Uc9 $pxʕmmmzðJ^?k,p 7qޣCð}Ą4 ۨʌK8sΌ __qロ;wGβŃ?|D~^_bEbbbee%K, '0/kH#ڑj''(*!0_M7$ F wqqi1[T*IlITxzz̟?(5taa! / inhlPB`2:z;)D~~~z$j-+-JE8ȑg}l6:99fBfXf(88EEE>,vyő H8lη}!?9( |X80X4 A' D6777'$$p8\RQ988P("""V68?|klt8fOO'|s}'"H(>Bᅬ=~Q$FH$*,,<{ŋl Bh0< Þocǖ-[Rtȑ痗?Sb8** BܼdɒDDC8VVV>}:$$D*>?HR@k͙3eϞ=6lX~}AA /h4YfmٲeddԩSl6; Ia6::0V9vXPP#""\\\JKK1 srrjii1L"/FFFbV}绻Ϟ=;{P5d2^cSP477 ɓ'^~pvvA_[^gXh4$)H;0 q\R5448;;Xcǎj5UՈjTVV|>_3 c28NEEIbxxxX,шw:;;E"ǵI !yhhhjj_ VDgrMMMBPP KѾ>WWWawwwww͛;w(B<<< nooG}wrTPKKGcccYYS}}}ZZZggg[[L&#IRV*ʽ{feeyxxx{{;99 }w?qo};d2ۇ^bȖ-[jɓ'g͚Gfgg{zzzzzBIʞyWSSs񊊊I&=smmm?)S?}t!뫩 E4aZ: P(9N]]࠻;IUUUZV* UUUq8@aL駟J$I)'D:) D-[8a~iiiiAAAEEEDDDpp0Zpǿ+O?뛓"BBB r9ꠖ޽J}ѢE}}}ǎB16mctDw7#1--7 < M ܹ˝X,V{{?3&x`٧O&I;Dws(7߼[Q }NNN..."護JJJz[ZZb6QKg͚kKo~RR`YjՏ?gdd$99fh-ȑ#h 8sŋn$I/[[[< _z%\nݺ7|Vڟ Ʉz0 (((xVZbt:E"ѱcǤRd6mc=c2@``j>x`LL?aXVZu*'NT*qHYk׮6-jSO=OCJKK|>C (\zuWWRaٳg<7(ʇ~x"e˖Y3g|G===b1$I'yUVaj322nv@bŊ3gnٲfSrwܩryII)S-[Z5 `ӦMH~p8nzz5ƺGmmmgo֙3g#v(j,J±Dl6{xxxǎ7oh?H$BCcuD"0"( H$ǎ |Gwر||suu(K$ooob1Ϗ*A7 rOgϞƗ_~yttf{###SL1cJB$8@&i055Xve:8pU0<|/Ѹlٲ%K憆~ Q-^T\\\¸\ڛA uֹUVVǛ5kt:i(!--M:tŋ]]]MMME9;;k6)5DzK B@022!4y{{oڴ qX,hYn>w\ee%]Rq8UVzyyN6mڴi,k֬YQ0L[[[ss3kڵSLqvvB:111 'ǻ[U*ջ+JkkkQ|kkkkkZ )--7e&%%%##W_@=b)***---..Fmtvv]x'jjj)xXhjjj"##{{{RRRkjjT*ռyZmYYYAAA|||SS^WT%%%p^YYYZZj0R)oP@7L2e`%IA$UVVjZ=001...۷o'j Һ:,Jϟ8k,''|ڵAAA_lYEEIꫯH||~gggPPPpp0aSN2eߒ%K4;}$=b=q]wm߾fhA-ʺ$$$DbXN ((( IMMe&111...??dd$22ᤧϙ3,vD"P(??$''oYV`sαiӦ ,[,((zBϞ=[.66%00b,^5***==}ҤI999Rt֬YzԩSk֬ 0,440oos΅dXRYQQaWWW>/y<ޜ9sjuEEP( D:twwGM bqaa)SfΜs 7ƃX,Vpĉ;3004++kڴi-BZ .,..(`0477S8e__={̚5kԩ.\Xt)AzIII%%%Z666vVbxҥ !!! ,ijj jnnxeмN:5##cʔ)l6;//bd2<===#d2'M111?9s233EJJ 0'OD ݳgϤIΝ[\\|Pxsܿlk8HO X,V__NKHHSB_%=;#4a"25<߮~?;*… (Z`*z?!B;w4}S-qm`6{zzU-* m4S8w_q]#\5="4 E1 ;(ҐLh%m(&I(0$*iCKA6-(v 8Q8նZbP.T5DM!pT}8ǟ !HQ!K*诨+ǘ1 ic*V%ƞtϾ1Ab8::Ubzl.j>Bb@-ZD4kv#i 24Ll'^teF]m|"l}.6`5GbmЀJ{K XtA[lCl3 :d6aco[ƙxlJCFe=/Mn6;~ijk8 w5CN%b15ar ØBrat:]wwm ڎaNZ 0 F?Mjwֶ-__Eo8jExqg zg rx]*s yv<@a/{ec9A*ׁBeQWḶ 0P_bt?P+s(]O&"0ls(\_ǯpGrn\{M[m~5yHX;崝Oq|ۗj"qcbmU7ǾqqylˏC$-R^ۂUR_06奍8[Q6s?Fq~wb/W ror\Jc|0^Q pаm 'DOqn? ]m^6q0>x,a/MWLWT.ekW4l;mppLB544A%՞+>RhtrrE̞׾Bh00 r*$IWWWRVVf6QBP(\]]9N___uuH$rHpKKKfL&(*??iB kkkb1S*CCC( <==Y,Rlhh6L---(a^^drssL&a|ͭ۷oE ۞6_$:?sLxx׀?9jb1EQRfs\HV Vpb?h4/^Dx<cnkk;~xll,%B=Kk0PT{bk. lN%m*v|󍗗P(ڵ+((f;h*c\n{5ovk\ 8(F4行z|ǎIII4M vG*izhh v NVϟ??44d| 8q"""_|P<*RbZZZ.^ツE)u!---E!F!Hp.HԢ\n/MPee%O&)eE8X,{#7q] .e'9 67)zפڎ\!TT Rtrrwp Μ J>Ktrr3gvp3g /_>9"$??599)3xjmm=t萛|pرe˖TÇwuu8p`5557oF!˖-KJJŏx`[[ۙ3gM{nrΜ9AVyzz&ѣIIIHT!rܛkkkO-**B<=!z9zj yyyd{{djjj4L*ťD}}}]]]RVVKǏlJ룢ʆe2NﯪP4I$6MӴGGGG__'Mlnk{{[ZZN81gΜ'xbD"PTTt҅ W\uҤIyyyCCCi!###ݽVO(bX\SShR)ڦ[4ѽz>==477QO>Z>rȔ)S}EwttTUUI$4"Z!&LJ^xATűX, T*KNkooJ(RA@`/*aO޹sgccpPPГO>922rܹ]vݻ7%%E(:|wp򊻇A݃)))555Ct$33Lx$I5uT ϟ\=6z"(22r$I&''GEE.ZO4)!!aΝSN 7,+66vttѣ~~~>>>'Otuu!믿~PzԖ:??(@+ZErrrt:]@@@XXؿӧoذa۶m .LMM5L<o֬YϟOIIrww 14M ݻw?~B(8aݻ'OoEFF~駽NMMݼysGGǙ3gJKK[[[}.\8ŝ HWܷlt:'|ۋ>_^ X,cǎ N4i߾}qqqDw7ۘz{{Ϝ9PSSbZ'c ZZZN:ς ?֮]B<l֭k׮El#|>{M>_niiAI[b1JJY}]/ پ}{FFؼysAA}( d޽3f@ J$Tj|իWmڴ)--9@=X``ɓ'=<<6m4k,77{ ^xK|j2226lP[[GY afy۶m>(O?Ez뭾Ey.a~SS?쳫VY,:::~ /&&h4JÇ=CaaaVn{ZZZN>=00 {zzvs]wlqqqmmmJ2)) بV{G}bPv|oGk\ aX,zI~ꩧΝ`gy}(E"7߼xJlٲ8qF>$.;eʔ{ٳ?xvvvNN\.7 UUUwqǬY*++V^qFWWaaUVVֺu^|ŒF3iҤo}ttɓ'ϝ;b͛7/%%;3 N{n6]VV+VF84q뭷 0SN͘1{ 4LAAA 111 hQg}vƍ?C^^?~׷U&&&˗oܸT̚5+--ft3g?$$ Ba@@}˽###(ĒWW҈Jg;Ã:to ;w\uuի###f󣣣QvT% 0 (Ɲfs8'Ovuur->>>r\"8>sL6@1Kfffzxxtww ˗/7L; qOO3f׷xӧO|D=Be8H$ <~l^re___YYن d2 X,wwwTpqGkSL4iҔ)S<==u:]VV.]:{lHP*;wnuuVMNNKJJiii XdIUUUwwr]\\|}}Vkrr2ڗ ===rssY,֝w0ܹs E[[[``L&C[\pFQXHwwҥK###)3g5u 6744$%%>}zs΍ >}zLLLFFFtttJJOO? 0h4#D#kΜ9 B،$SUUӥRj0&M9|eQ_vvvLLoWWZH$nnn BTΞ={eeeAAAR&$$TUUUWWVTTFzк:V1iҤSxhvwr6} 69999BepAL$Tf.(tk3M|bq]6O5x@OظnlX,.|r6.x7mt>b8-$Y[[3l`FR!ai=.Q6(D6A9P hZ6>km -0[szCtaPb*[ ҉3RKv6imIIsKNQqYmdv`'}Ҁ]6{y lnv .=jȯM~EO۰%i윒B>mO#Ս 4FҕeڢmZ٪m7^@i6l Nmn`3 3|İUajA]o+ Kĸ6!gQ7nbŶצ4Ԣ &Mqjf6#G8*HnV6j`7=<<ШAGģ>Y\WS~q8 l/\fRls%j5L"h9aX PX@ ^$GzW1YqC!$Irxx~F֊;d6񀖉Z+zU07T1x\kj2&*]m Dh,j1ףQb;;;8$GFFBb)׸ew1}`d.e! y*_ۂ|lrw_1ʓyjqicOiKoyޱ/r]&-w܎efm7"ڴg;zc-?lB3WgE/&u}ی>j^'|pm4N{bؗy8ծ6=_8 WME-&Q۰}\.} W{p'MZ^Cz7`pippP D^^^GR:;;S"%V'''V[PP'/Ϙm `0`rlx"bF+++R).++ň0 L&OOO$)<${RIDAT<ٳ* egg755y{{lBP(*((pqqz>''id21 cK3aW_}hL8D]]]bMuuu(!nxx- ag677wttd2.KQTEEEuu5~ˋbA 0()J%%%]]]Bm۶iӦ D">o0.^bFGG|H$:v_|1sL8NnxDmʴ۲"]]]hVpohh(;;׷iۋRPBzzz d21 999B}6??h4zxx\8p]:uyN:_ KJ{{k6:: "ȑ#| @ )zz涶n۶-//aG+܆~W^yĉ٣P(n喊_07(,,|wN8?i#J۞{xx^kmm}I|7?#/iv^]]]\\<::ZWWW\\!nnnX,ϟWTB]Pt .X,@2:::<< X,*Y{^^^YYٖ-[VkNNNGG͛u:ݱcN:p F_j_nkk{7NtMMMuuuGG:3<< /V=sLCCٳfNC;::vwwB]i{ttTjڞSNjjjHCLϟojjP뇆 CSSSqq1*z_$B?3ATm0(ʡ[VVV|JeIIIuu5_?t}}}F$JeZ~gt:|FinnVR掌۷O>AfYѠt (۶mY,[T*ʕ+Q6{^z 044d2nݚZr^#G~m /P]]K/ ͙3Gz=++kppPV#bsuuuA[ZZGFFCKii)d2"deeuwwKm컺nzpiZ~GjkkQo۶m//\oPfs-[^{_O?Ep=.TJR"""Bayy/_KҠ ߑ$i6<=='OlZKKK͛\Bh0P2 @RRRDDDaaEAZZZtt]Of0lvllN}|||}}O>-Т}]Z]UUr) wwH''( … sss===#"">쳙3gu]۷oGzoV(Jh̙ }ݙ3g\y<ݻz뭊>hddСC>,Z/..Fف7Lyyy)))M6 WWWo`&Jkjj뛛?Su鰰W^yBxĉ+V8;;x󎛛ۿ/@pEJQT[[ʾT*-SRR syxx'999jz֭~~~>}. ZV$ {&%%M6M&m߾]T4gϞʾfR뛕m۶褤[Ɯ77Gy$((hϞ=QQQ e{/JXw^JUSS։;R^^#ssꦦGvvvr^xggga> .EFFt: bccIq/D?p||w^^^PPL&vvv.,,V'8ta555*ʸt뭷d:OG8pb"<5nF`q<---$$d۶m}}};!BTfee >8rAk֬86AV֭[D{i;l- ?%K---(϶P(D E͞=?/"ロ2e `ӦMJEEݻ\.poZSRRm#JW\uւakZAAO}5kSO=g4QKB$ɠ?88xԩׯG Nm۶=c}ѬYϟtwyl6d?fdd{ͨ[xCEESO=j*D I2)){qAfQѪvZZ@ 8zh||}BQmݶ~3g d2ZصkF[Q}rrr[[[KKKrrb ===MMMj^zꩧh>z\.X,\.0B̜9s;6+jJ$>b<ϟ?z( BpٲerKGGӧ̙xyyi44נڬ~xhhHPLٰ{TTFAk^TzԩЍ7&%%޽{ٲewuρbP(CQd5..nddB(QvhEBhJVj A>}ZVZf###SL1c > H'N0 6l8:8f$Jekk+[o-))1͋/ ILL&z}s̱$O?/Xd@PwvvZ,;bEFFfŢP((ऩixxXTB 8uTnnIZ[[ZZZPt/@Tvtt,\a[hrrٳg>d2٢ECBBP6d''9sK[nnnBKk I0L^^^V5,,L .LZVdRY^^!DIIDQLzk4n_&|ɪLե9r9Μ9sBBB322[^hZu:]YYb4}VR5i$??-[UVV" at6tw577#wFI4iҎ;OP(;#>& gtڵaaѢE .i"//ORQTTTQQߗz}yyٳ]]][[[,Kbb⭷ފi^T*kkk ŤIf; ŹsJKK4rї(V[XXh4\VV,4 20eXPH`^^EQr  2͍===$IX,~Z.8p`ʕ۬fżZ t?wܑO>ݽDT466qqq.\ 7Lqqq+W NOO[[[/^LQoZQ>Jb Ii/[ɓMMME-[;p8QQQgϞmooGGFFFuu .\gff>|޻lmtp*c6===kkk˖-ݰaӧ֯_=q19U$5554VF h B񪪪Ri]]ʯ~!gggݻBBHIIq\"̜93555<<|Bرc֭qqqYYYohh@8r.;00!iJuwKҊKN4 |k>\UU㸷s@@ӧ333NaXHH˕dhG`hh@ 4iȈDY,X,H$9###DRq\RP(*++#"">j*wwwHtĉ5k*իWKSzjQQP(LOOp8]]]QQQbLJᄄBl6=w\wwU&O !rٙfffr8r6=uTkjjbccy<zrRtʔ)~~~2;<<<))n@Yx-ZT\\h bYU*l^r7PPbJKKO:zֶ///___H9sT*UOOOZZZ\\\fffYYYcc)S0 p?`P=00E555mذ[$effLjWWנ WWWܗbrooo%bquuuZZZeeeVVVZZŋ'M&MԩS%~/\d2$5 EQ'NXpaJJJVVVqqҥKі'OxիW'$$[, .`JU\\2|R]RRr-DDD;vkעI&%''XNǥR;EQ(/''ghh(>>^*zxx4c4/^d0 ֯_/cbbN8JJJ\]]Jum85&*L}}}:.!!t _w!mNJ @2겳Q\ӊ+PI{?!~Ϟ=EzjfWWߙ׶rktАۮVqDVׯQ98}gxGviQ9,Dcm08^]ߵ7xpP9,F9Mq>:;=SOWzZnkko`B󋤐ɀN\o(רI /B ۣP6a;KyDtщpANn!(p2j\Ͼ%~B96x;BB6":Cr3^wh,JEUSGMWfQx-& xMwzgm'4̭j7lؠh F|&R]>^q<^31g_p~Bd;!7fC힨z {( Q*ccc2R!ywH!H -,8t:X ?U݁q'"H*J$GKƅG6`[O[_҉bFmx5"*롇z+(At'<8~T_ o I[N^cReC=1Zܿ9D?\)ўqɬwJkwR+|@󻞈9hWGpÂ: d P5";/Г/Gl}b1%cAĿDmW ̍GoP;ܟCęXp̢ގN>C@uddmhh >33ѣ, UVVZ[[3a7770ԔFaҢRy<)(@S䫪FFF`5 I"@d A;;; 2;;jp02㗾gpĄNc0 ĞgVUUa`qq hhh(//wޘz衇 Q`9ydaaNDvB}Gß Ssssr?G 8qD"7麺>@RMMMnnnxx855!:;;ZĄaCCC555ƟF@-D"Q^^^ss3aJRTTuu5ammmb~WVV;vFޜ FFF!(lnnS^]]\II B !$H%NJ >^[[V+++qgff'''Beee`LGGGMM L>rHUUS(vttBA#D\.?D;v ^~`p+..޺uk__Bhzzފ0L&T]vCjZ*vtt444"0V߸q!rKKK>㏇?Yhoׯ_)/*++'''zzzd2N+..{;v n"|1//O&555a611!Zm$%%͛ϟg}=6yGG6?z}aȎׯ_500ߵkWee%aV 611H$nnnѺ{36b&Jd2{@<$$˫jƍ^^^ RF\777[[[gg缼<2`0\7hP[[666j beeefff^^^B0!!!44Tutt|L&S,BlϸK$۷o9rdѢE~)ٸqc{{ٳg)JZZFqF}}X,622'p8|>GVVڄk4'NtwwCj*۷9׬YC\|KbFR~m333+++Do>CCCsssW'Ot/b=3&&&3p!SSӿ1޸q#00G"dddDEE}o]FFKFFFsssmmmvvƍq BݵkL&311?wL&ppp=ÇStk׮)sΙ\|yʕoNNN777WTeeeQQQ/f2w{Qߟ &''lvww>:::44R>oo7ngggGGG|Whj@Ts\ Y;șM/_r7lذl2ZM&;WW۷o;::^v4-//_̼uV]]]aa!D JMM}g %HYY=<|pMMMYYYssLGFFZXX\TGGMMMͧ~ZSSR5MJJGGtRRRxxoijjjaaqa##>,***##cll d&''e2Yxxt7nX,WWw}!ѡT*D"_|z&??? ի۷o_fMBB7o ڶmz衇<݃ L^~ePhhNӧaUd>tO?_ ~( $ pHcP(?p0| ÔJeGG;vطo___x`FYroees?W8˟tuu>}!hѢ!X #TX,_wk׮Abwy'jquuՋ/T*Y,`^^9L x>Gk_D`Yimm_ciA###΃fgWXR!!!FٱcΝ;GFF ryJJJPP?B|rtt`?h޹/w߅*Fsυ477߱c 5F;111ׯɁ%Kܹj֭ׯhhkk ˗/߼y3,U/[dnذ߿R E(lO&}Y4/f{D"jժYPcccooo\.T\.d---:.,,LR d///:~풒K`XCC_]]]<oڵ:](Z[[ VWW tvvd2333D ^vmQQϞ= t{nnnsssMMMZV.u֭Z*//>7nt?D1;; h(EAAAeeJd2YT"rV-,,lF rrrꫯڪgffd2LV(K o߾dɒA\hѵkbbb:::D":r CC_СC|>!i !DBR Kgm_ 299?88^ZZa R(RrZ=<< <wŊBb('x"::zjj !P(JwCCCuuukkڵk;;;]\\233o޼ibbBѠJ%J'322rBH$ %,,L&mݺU,CĜ= jkk+++ 訏O[[[ggg?F:@ D[n5YD٩hh4ZhhlCCC[[UYYYZx'(h w]Nquu,v.jusssSSBcbb漼fff {zz @J=ϟTP(j Jl6;,,L.GEEm޼Rx//zL6;;jeeRQQ144IV`m[[L& JMMMJJ^fMcccnnJkoo1A롇z?HD*razãp֭S|~qqNӟؽ (R)Db2====fffYYYrnnȨ;,,mvv`p8p??+Wk+WR %##_鳳utt=SEEE433srr*))y*++cccW^(bbbblll Y,Vhh(l``(J=< 6Ì>vss322r'e:l2B122xb[[۱1\=kxxxDFF/]+"""((ΚquuŹYI$JennnggbVZ```K/XEEFF.Z(88Futtlccc[d333aaaEEE0\C{mmm@@Eᖱr+WܴiSGGؘkxxxSS%և 766R(ssm۶yxx )Pvɒ% Ϗ)ʝ;wZXX־O>+H= 2<@f||\$ ~Iܕw,C6x<ewh<ܶm#1(vRnٲ%$$7Ixq@petqRRL&{j(D06[bExx"bOt:]zzzT*LPt\a\SSCјLi4'3z ZI8t:Ą(,q D Q\2AGS:aKD[\R&q{ _`H/ѼJ9Odlu x! a+H$BZP 1B;_+G_,ց6?Tjx9WCU0j5*Jh) p<5筬ݱ4M.9q%3 FYv t$J *DѫDJo9 78pDd܇;8#=|w$<&opTh% p߮]Vd2b›U#BP5&T*T*xrao&DdD? aT O 0VdbbWd2/ B-%@ Vw/qTC=O1jw9>>G? \>66,!}H$T*orWR)P59].}/dSI$ t/dGM!Cus TJgJw ++Zz&{]tkkT_ wMqu:OU;UL&?r衇z衇Z?Bwjhcwh"(pߞ?zNRN}.}y(O\vl^KDG./ ʼn]ׇM!G8 ]x̝i `%ZX#wշǿ=''Ye0 c2`L&D XUUennnhhA"JJJ Lf^^^IIT*T)<322ꀊ$%%ipp~hh(##]&;::Rmkkt 0!D"򄄄Ϟ=f---9v<1Gg>`600ciik}p@5!I&&&8q'``;رcFFFmP ?*g100 ccc### (J/<HPpz|Q>̌H"C{!MMMmmmr---,KєԘ잞gggaXuuN;00`kk[\\\VV`0 o;;;#obbfBa^^^wwFIMMe0ǎ[f ]?/'|1 7 Uę}А{V500J8a B0-- Xggg~nz_ Z }P;{,7kھ>/#D"2ںk.4GРRΞ=GPA{vv],JR |w999h^7hmm=z5$W޽{xxᆱ/dff:99tV NN|訝J $uϞ=!.W_,9tH=%pcx@>::R EZZZWWa ~-?!'&&w[-4MEEEMM hȯYテ}ӕ8ѣ]hjj ޲0 uH$Mݩðުvww7ϟHHH@tIZEjP866& qZ}ڒJDD$ BPaaaYYa###%%%k׮ 2\RRLKKJhppPT/IMM]]]%%%B5++ !$GFFD"B%##CPd֜Q\\| pP(B'O nBHVgLMMO:U]] EDDh3gΤ#/Dڵknn[~=a@'aXWWWRRĄ@ PսxdrY Ê1 D[nI|nnܹsh~grr/dookz{{ƾK.UTT \uţ_~,}G,+11̙3聇e=C=~y, !y^xvbbfۗ4ۃa*deeU]]gmٲ^RoXXXO?L&"˧z Nѥ;wj!khhP(sssCCCӟ.]ZPPh4VJE6lzjPT R[[ x嗽|ɒ%CCCccc0C$;vٳbXP\|yvv믿mnnRo>Drԩ6o߾۷o?7jwt:==\ƫ^*>!!A*B޾o߾G {Q(K$iRRPPpڵӧOK$ :thhh%!@pBKK˟第˗/D"N~giiYPPp_]rܹs>))/_}Ղxg.p 'OB䝑qɴׯ9swvv~bb⣏>ڴi۷ottt߾} ѣGaj/^<}4Bhş}<>1BB/ õwޑd֭[hkkkmllmT*LPQQ1__;wRZ`͏Ьs1Lxruu733S(VzWR)"W0lƍ333r<;;;$$_vqqj=K/4>>&uPhAҥK/]3888441==aTܾ}׿T|SSSH#h NX, n:@rѯIBVÇ|YYY hdd77ST|ʼn`@]lcddDz衇z<,0>|̙3ѰWZZ)uuu5%斔@|(uСs-Ykjje2ٶmh4\. *jҥ ibbbzzJXexx^BcccVt uuu333yyyeeeFZ]WWW\\,gI$К5kJJJ<<<:tiX򚝝r@laa$VZGI$ب ꠠL>fmm]VV&J5;;;;a{BH*4P(|޲~||v.]T"X//+V{xxDDD_yWWW {{{ikk2:ñvpp033mZ www[[[L&333];ώqqqaaa-  VVV8paa :;;9L`ʧz* "M6Q(BQRRf_z饀G".]jaaQSScaa'=<N Y|x|m( k4;3quFp"\ =pO/4 ^_p#RR\PC* rfqHո:D"nڴ .JRA?: H$iݺuZkT;x܋s47"Ķ 2E{/KЉ' Jx މh{M00ť Ot:B; wLUu!р | òz衇?0 QT*'''Z:0(V.ONN>=P_ՏD"I$<qt:T:==GPw47֒H$H$ #_L&g@oV#=րT P=C=x\;L]k~Bk~T_ wMqu:ݿʐGN^j4T=C=xV|'~$^Ca^}P8ٹ'|!^g)ܧx}.wj鶐 D}%/Jl1{O*C]%iSDТ'&A mͫ4tڃwrA 8O7~ʝ/p޾x.#&W$x7^/{bo!zߪxp¥`(@]+wdPx"BÂN758&?e+=CGF_?` L@ח:77gkk[RRRZZjnn@D" ;IOO>lQE: k"##1 ZT*AL>y$w0-^~ }\|СCNNNׯh4b ]GyVCCCщyܵڬ,L۠yd2;vlҥb8##$l @|p͛7A{{ࠫ+566vzOX~~~s///:|^^^mm0lzzurr2--D"YXX`VSSSTTd2KJJrrrFGG=<<:p2\SS3:: B ;<33sIC}|>ܹsUUU___p}0 ~ܜꫯH$'Ouo%oïZAq`` //T JZ[[1  0ҵZ~ juQQQUU CCCߛ] 0|>_,*J Ag$0\.LNNNMM^zđ___PgggQQQuu5a@_ZZ:88o[ )))2LP766a666VUU977Q#0S[TTt)DIII---q\`򂂂1B?$B噙:322fgg~R\b)P8;;B555.]hff&''gzz!TXX888HuH$>|~ EVVŋBW^E-vQccc*** JH$.//~LP^^^qq][ $PH$ɼ]vt{NLLRԆXh222B_&'ʒ%Ioo/L`6<<<;;hooܸOOO7*>t2l޽0>C=~y,qwZ##0778ooP۷o_W˨jBfgff_"&J0L*d_]]mll^UU⋡VrvvDt:=00prrյX,N||ݻbqss%KBccc---jU(j5k w b[QQB$""b\|>(==رcaaa{qppX~}ggS,,,RRRlvZZZEEؘϝ+9NAAT*}w}Aɏ0Lj ><33۫T*W^xnnn.]Zf >PbT*rvvvqqCCJ W\ 陘>zhxx痕ekk622ܜi&(k B###Zl++7o2\GGǷ~;88255-((.++KIIhǏ<|\\\zzzrrr]]]~~F+++stt 700OSSSmmmm۶DN---mnn򲳳tr<22b1dzhjj?بT*}||ZmvvS@@@__T*qFxx;bbbr!/bѢEIIIRI(J$d2Z[[;;;Q?ϯH$ֻw^vw}WPPPSSSPPpƍ{.666%%ennu떷wPPЭ[v؁O7z/ V3 ڵkfff۶mC455-[ N޷o_Qu!P}@12|UKK˭["H${=SSSDX=p466Xw9qD__?A,BHVŝ>}Ϟ=p7n"?>|xjjʕ+ϟ sssd2{N>ߛ30cT[[_}ʕظv!!!*  AUvrr:p2S$zh֞~{֭h4>`7g}vjjjvv6???44sttDmݺ矟D,++++((詧 |@LLŋ#""xmjj822Z<3ZJFٳgYYYp0رO([PT־?<>>>~~~^^^8-/|hD"SyGG˗8رcll'\d\NNNg0|rSSSF*--}饗6oldddccy5kTVVdD2OOO???__߀oId2YRhʕ?eJ='µ};w.$$&/_ îH$ںu+BZW2220 .!:::%ɳ>KRi4L&555r|l6snnnzz:33N]|hʕMMMyyy͐}:99b NWYYYZZ:11aaaeaa9"aÆa.;55=K"!V^]\\wSNa&|||fgg5244T",_<;;O>Q*%)8CCCoݺ% УnOKK+,, B@ +^xBmmm?Ԕ;>>6+ @Q#N'bcc\n[[[{{;!***))iɒ%===Rd$=Bw}믿Ub!7nɁ@D9==}֭N??Dfff&@Cr~xJr``EPXYYJبI8KRUTT[]p!//Vnݺukkk:W(t:}jj^*BruuP]dT*۴i4"BQT</((FMNNBr-[a'y}PEEEmm-H-YJXYYZ 0!HMx񢹹9w XaOBBBJJJ@@Bա`𬪪T*uuuJxxx__X,NNN+XYY 2LRy{{ׯ_*-- ʁ NLL,..H$ɩ>>>yyyCCC$idddxxxxxxppPTFDD$&&^|qÆ MMM $.%%B롇zwOquujqqq"BgJ%ˍrySSo :Oa2= e_]] {,--T* FccX:Pk,Y$::z||bJ[[ۗ_~JJ$p+++HlnnYzmPPPXXҥKMLLΝ;CCC-ZD&A1 6RTOOXWWWannkcc`ff9HJnڵN...o񆹹#@0,{{e˖Akkkkeeeii<55eggwnpK@`0fgg_y@ f''''惃˗/0I|}}ý"""<<>>jD"UUUرfÝﷰ+plxxx`` J%###pT*T* kllܱc</66ybbmܸq```ff922 FGG}}}MMMz)WWWXXj]PPPxx8t:W$h_|[ZZrgyfѢE}zhi`'JD!!!< 8~*t J&bw??1xN`w/ ---ِ /|MIIP(D"UVVh4&/7{yW*8v=C_ jҒN9 p0ia'>nkk> t:;4y/TR:v d"O"B@_:Dj"Vp8rMFFF`/V;$8;p',ˈ3ÝEBh&rcf߰ M@I^`*\t {퉏ěƭB 8G>>Ͻ8:n QKx0~ D H߯$ PH$333~s-xĊG;z_OV\ wʂsjZ C ÔJ\.ЏO X ONjD"I$x=`}]?aV!HJ%bh@jBH(>r1 366VTm4Ls2lll 9|P(]3>C=w@AVVV?S]R 8Blffw`1}\\\~#/0( ͳʰX, 200BR0\׽Gٳ'$$D"TWWSTKKKinn!:)//O,ރ7nԴ;::TR333atQQBHNNpqq0 e6mnnZ... ðԣGnذ?%%Ԕݾ}ё`޼yJZYYeee߿ݺu[prK/:C,o4PgHє6k׮xxxtvvjZ&&&0Ё-ݳׯ_W\.7%%errz衇(z{{---a|2caaNrKKˁ?=ptOOeBBBZZ8}4BH LNNRT&%%So[ggٳg`g}h^Z^^5ϯp8!GGG++_d29!!A.@Q__?(Ϟ= Rb#''!r RƍUUU_f x344ܵkL&uzJ z.u֦sΑHl~I>8exxիUUU/d,-|ڵi rssac1]VOMMwww_p!466aXkk\.y&\UR Ζ?ru~Sh|>T*teff{GGGZ?Ͼ>;;&PggիW EUUUzzzWW\.??==][[577W]]R(2 R%X,HMMuppNB1>>.H&&& ?c`g?s?OX\'۷aRʕ+$44NC{FGGS(LvlR۽{7BO?I566^t gffT*Ukk+a\.ҥKp__rerrðL͛7+^t n<<; /1 a`Ϟ= bF377788xakO?B:uL&;88d2BJ_~%F;w\]]UUUՁ.]B۷oguuu6W_}5%%E(¦.>711ٳ<ڵk bxvv>~-Dڷo_KKݻO8111$<_nݺ%RȨ:==]P9rJ[dIdddxxxxx\.OII111Ybggi&Db^x؞?99j׭['H}}}@ڋBܹƍ᳗׋/CR\.Luxrk3336}ƍ@pٞboddN8100~ ~gdNLLyX,U(re˖=O=?#ɨT!gX,ڎzPHe0$饗^,...mC= d2ҥK< Bhjjm![[oϯ=|ȥj-ZNOO{՞/:88<!%$ < BÁD"ǫc2'O?q̙>PVN:_— qqq~ȑ#bϟkhh ǏN<)y睃ՙ5E555}J^h4nÆ *dԀ<ԔopɤG hց7|gaXbիrm۶jL /NLLxP0gٺu\UUD"a0fffAAAׯ |+.\f U(|>hh|[u:D"155}'֭[755UYYjժ۷o,P OO{NR-Ydɒ%&&&`0^q`h2xVX恪oG?f 6چ-[ѣ0ܹȑ# 0T*#;;{׮]J#qss۸qc{{(Ʉ$.KKR͛7{{{lܸ'*))hgyf=C=822 իWZ644@=QQQ/S(L&ҥKvvvd2R}fڈbdeeMNNR(4 à =s E,=h\R._^ }D" +,,lnn^t}#""zzznݺE&fffBb0\*)44… fff|>cccT͛!vJT*E޾}[.?L&y>?88(BŵZ{4s!Z TEEEIIBhmmݱcOWW'BڵkK,jjX,vrrh4NNNUUU999K.mmmMOOrn499-HW\I"|||RSS\+Fy&N***@y!}vXIJJjiiAƮY!QRRѱt҆k׶]zUT>S .ԬX$--֭[0zo 7*JT566fccciiIRcccL&L Η_~AJJEPlZeff[oSz"aRL&#sttظ6HT@@Fp8~~~J^322鉉144dXMMM...;v׀( &''cccccc,Ybll.wiff688r}Y___BͩZJzxx0 ///5kZ[[{xxjZGGX,Gaolllddk=#abBCC\\\---}}}=<Ν]]]^^^&&&666\.f،^ÃFAORCCCq}}}ƢCBB-[fmmM&7nrJӢE6lݭVmߜ`0fffZ[[ׯ_+,--1 S(6lprrZ|9ϟ |饗lll===-,,dT*ݹsuPPA__3癘xxxԻ)277 J˫](+===+W񢢢5k adZZZ‹oHHHgg3<ᑙr!F466B^P(400uvv겶^d N`vvvrr]"pܗ^z^{5ccc!!!d2BX[[jZccEPh<==MMMmTЫjddݽnݺ9. /`NC=Fͩ SE"QHHnccP<vht[IDAT#,q x<ع;q|dwiiīă_|m@|mFyGЂ<klJEP\ZhUczCAVYZZr*BHժT*<lNua*vyg)JVT*\.on#@yO$E# 5Ԃ(С@8:f8!r- %F]ZACӏPBƂ uDR}1Fq'zނ8?QT[UZH$Y#p®Fy 7":x[Ol |!A=~$[o8h~+%yr'*p ^;pE\HHO#0) x4w;{ѝCm눺Dxb]"oC=x?Ve9 D 7SJ%P&;b 5GGhͲXoR{18msoC>=jzAgA~/kc]zUM( Ywww 222=<<(Jzzz^^O_?BjZ.ɄvgggS)*s`ܜX,~ԔBp8fffmmmIII0IO"87B;ϿtH$rqqFFF]VVVfnnf/^XQQ |>ʕ+eeel6+++RSSj#BY,T*/--=D$B@>sܹ9WWi'''Ѕ!JÇnP5YѼFٿݱcǀ}?EEE^ZZ l}|>Hr###`.**r D00++ޞfgddx|>njbi=믿 }ɸycccmmmt:v*)))??͛ "99 nK$)++bq8l>N%''XQT]]bggW!HMMMT*B49AðFCш&6˱;͛7ہ,##Ņbyyyaz衇z< JQVOx<77۷oSuEE믥RX,vttO{9 BV;99~ujo߾bhh833s%P(H$vT*5''=1˝rJxx801g˗C0vY*Zh())-F@gϞD訷ɓ'l%B?J/ڋ/ >_TTۋaXOOOZZZ{{;HHH~zpp̌H$pBUUa YYYYYYӧO޽{tt=%%sxxٳ\.BLOOT*><<֦d2˗/7/ Jp>Chcǎ}70| PFFFFF_P(.^hggBR(%%% DRTߛsΟ?_^^aXssӧ'''U*Uyy۷% TŋSSS566 k&JUYY9>>>22222777#drCCp~fdd`&333;::vpBQQB ue2Yyyk:;;+**nݺa`nnn||͛7B ˡgggnjjMKKmhh8}t{{;a2,)))!!A^t_˗/!5xɁnbbbmm*,,uCr\&&&333 ܶ{+W߿``+22299yzzŋJȑ#r>#|;G[[[vvvzzF-**066V(7o0Lрsr9>55 !4<<\ZZzUwI ?I$̙3333ٗ.]t+++Z-РT*{k/ŽhbRy턄۷oDtssB=&TؾrرWvvv^px׮]!2888kwa=CX, ~5kְl&iӦ"R}3(ΎNaÆիWZ8Bh۶m:bnnsEDD2ի!x===j5Ͷ噙>TVVUlmmu:]zz(Jk֬a0'??_ڒHPrrK/A-[hcOOh```iii||<Ԕ9r9BbqNNE }źvZUUѣGbqCCCaa|:>55o>KKo}߾}bxS|X[[?󾾾LaxxxllD"زe SZYYmذ~rrӳ o580999<<$ k<󏼻}fggp){{{F#H/_zgϞӧO3vX;>ӼWd[[o4>>>''\|t:=''̙3555@;(T*ݽ{7055JNN&_G}p{ꂂ[n ?GG=uԑ#G---;VYYR<877w1gnn>;;{npuii)LBTUU9sΎB?~CÇtzOO>̙JV++Jc0ǎ=O:88pTYYiiip@"=::!00pժU۷o)kB蘝O<{oV('%%MOO=zɓ~+WryXXXTT+VXf ӗ>R( ,|X,Ry!A9>>dx_1{xx(܏;mcc311gddTUU]vmvv֭[Ro=yK;w>===eeeK,پ}T*r˗/ԫ8顇z|;L>wҥK{9L~&):iVxǏ{{՞gzxxaK">G#BUUU _|~8$S+V8ydLL7|WLJJZr%B護:raZhѩSV^}₂TZUU%(7n܈ ;pO?fvv`d+W.ZfWVV^:""BR{ g}6,,sݺuaaavvv ibpӦMuuu,KѰX~6mb2* Y~HK.ݻwnn4W^b2w]v}Weeeh!^}͛73L(_DFF[ጏ;b_}ll4$$dÆ 666$駟޲e@ J4800pʕ8)B(66ܹs6l oooH$Bpxx;wM=...00}```֭O>$>8t۶mͫVڱcBxqqq֭sww߸qcll0N'7mfKKˑ'''wwwWWWOOO###???x|ꩧ,,,z{{RH$x/'''aP(<|ٳg+**֮]h``m۶իW{zz>StժUxbz)'J kkklT*<<<<==asyyyssg}rFD%%%!y睶SNdw…={Pfk֬ikktO<񄅅RW׬YS^^n``BT*511Noٲc!:nccl2XXt|>ѢE˖-ذaCHHHWWWGGB-9[[ۈؤEKѠiP[[ Y=4bh4Tȴi(I$rl$ F =C=~,s}˗퇆tN{'t dA%]zҥK2xO^jgg999uuuBgffd2dIIIII@ غuPݸqڵk,+,,ĉ6lJHH(,,uF>SSS{{{CBBz{{]]]|I'H$[oUSSf!/TSSS ֮]k``Ůjp_~effw}G&/_\[[ aBJFFF|>_PB///"Hb800K*ĸê:B0'SO=eii988H"v)&''ah~~~yy9I&7l`nn~$Fcoo%Cinnn7oʂ(;;FAL'&&΢G0J^zuɒ% III0P(|~TT,,]tڵ\.ȚhѢ!R`0nܸagg>8￿{HrX`0Ο?F@xuesyCCC+++#ɀ_VIJR@  T*533kmmW(ZV";={6''2""GDD,Zwٹse*++SRRBJF@R K j;[[[HhѢl. -B,N/))y뭷<==\.t##R*++۴iBFh{АBPX $&&^xϏB@n@ h'OXlJuuut{xx Z̙3l6y!']$BB(,,"99z{{pR   zz衇6J$RiccjAyǎBҒ{zz;scNPlN7<_VFFF tVstttqq 133suu533YjUPP,TTTظmٲ̖-[<###D /۶m>>>^^^!Bqƹ9ggg6-<==agEE͛9CTTx@@s`"H===immmY,P(422quu}Wa$0oxx8&&Y*nڴ ` ;v숈 HAAANNNL& IKKK.dɒP//+V BBBd2O>.BBB~&wq26x<?7#CAsssff&d&&&k-ޞ?77 />}/<qv"""BBB _G]~=L*=A._vmddoI555?c=>Ƿꡇz@VYCB:nbb/A@@LչY#"P$Y[[TR FRW*=D>iA|dxu/J$'v "9:Q!LMMq^<(U err`ld rADq{O xc|џXlL&h4ȏ» Č{uAx 23~.~Y}7+.7x ~ ~3wTui3Ed :-i^Q 0X`$kZJy2d2b- gxT -?~zcO wʂsj@ ޱBP(%ͫã-,J: ?I݁_g;1 x@:; B8ͣFd2VVPb &(?T]w999yI1C=C p'Nh?SC*CRTZ (?IT#q/oJ%Nz衇zbP8Ƚ#\w Y/и~B*w-^׽kG^DmpҼZ]"YY}\qg >ߵj0C@)Dr:"p,АsF,X_<%U mp<1UKt&=6/ ~{';bA| *$+A(O߷JS>γ AݑBLĂ#4݀bt:W 3 ;1^0@!u+D%nݹz衇z<^x2bXPݼyszzRRR ݙL&auuuB=BR l7nhiir{Ye0 c2D{D"ѥK===ryjjjvv[ZZt/D|);tRNN@ 𘞞>{,χ=d$ihhҥKl6̙3eeeuuu^^^---W\ 9w\II ñ|rvvܜgEEERRX,vssCr`DW^-..p8! 'ZB={vnn-;;;--mbbٙJ DMZmll$F=T\\LP8D"yfII-ۛ?::z9dggaCOrrrjjАgV𥫫… K,΍H<'aw *Jaȑ#@} o>333P_!pj߻w+,_ 7 4*cddV숽; *xQ G@ǨuVTTBH,'%%ZYY ;wnjj˫$>>Z"fee;99T:nkkVd ^q+WSWW׍7z{{(Juu7,,,̎?j*<7uA+{gZ;}[YYlhhwΚ~WW׆K.uuuafddT[[+1-555??Ãd655]r¢>8k&=C=(g=BBB222vލkУNmǝhONNNbb"͖7n܀=0E~B$D}K,)..NKK[fMWWWgggMMMvvv``޽{BB ;p@__Hu!driiikk+Bh||ǧ￟׿gЦNaN+,,11ߚ {/$$d۶mUbbbYYɓ'Zmggg~~޽{|>(һ=zS Nؿ#Gh˗y{{/Y'ͰzgaD"/^xŊ O" 566NOOVTTDdpA͏9)|kMM}||0 sss333.]jllv횵޽{[ZZΟ?oaa NOOݻwo~~>3 WWד'Op8˗/ڵ4%%%???--M(TVV^x-X!CCCGGG??3g΀0{jjjYYYfff~~a==='O}1777ccK.YXXl6냃Gt###fzzz˖-\\\hMMM@%嚘Xilll˖-aaaf_B( `@:kdddjjZYY~z& ]VVvqsqt%oooCCË/{ÊW_}T*sssϝ;f[ZZNNNNt:㍍YZZyvƍT*yuY[[٭\RO碇z񟍻ϸ~=V=p}iiizzlii)=ljO8ߏSD":uƍ! F"=gy5СC&'';::t:?00sJT111Ǐ_fɫVBw;|0݀1H4ST{{{޷f 6644DP\]]J%ORnݺeBܬVTwMMͲeVZ|r|!?::$r9xKJjnnRp *J Y\\XbyMmnneiii&''AXT*bqKKƍWZeggWQQa2\.Ás툈k B33umܸ#))) UT˛6m2 <7 Bhpp0##/t!TRRbLmKaiii4:;;CRCNG׿4:'񡡡/rEEE?mccu㝜nmffv \\\L&{FSTT_\]]߸ X "!!ߞB)J\򲰛^W$H 7w|7|pY &iݺu111կfff#N> w.B~\A~ZTm6*:00T*GFFJKKKJJ$o/HT3gRSS-,,Ý8PQQ N@uܽ{WP\d2^psʕ]]]YYYW^]bRLKKKMMrΝp78^/˅JY`0^B*" `177ٓ >}>&&fbb!hT*˽q4l(쩩) "˗/_/W\H(Q!$oncc:;t:tErr]fffNN^wssCUB>>>0866v & }NOO% ;㛚Ξ=;00Zbcc-,, CDDƍ+++߿Oo"""JJJ"##a,?? v}p?VMLL \r%Ͽq ;w B.rh+WqܹիW_x1??ll,99YP8;;\W^ٱcGrrrCCCvvvGGNSrB0//^^:55m6vpt2 &yyy6mBz]nӖ-[$ o0bƌ]vvuuYرc,KP4ڵk׮]bA%$$\v 89wSSSd``K$jZFj 믿_3gΜ?ӽF166622!{|Hvڒm۶}箮֭<~BottW'A ?3|csܜV˗KR0~Y,OhhhRRL5}'[thPoo,#O0LTRTl J"(**fۻ|J?66foopW\b~ߚA\V\p``/ϼUVq8 T*###j訯/Kx7\ZH$[nEi4؜d2GFFx>>7n ??ѤPPaff͗-[666_J B@)BBB=<<)  x0*˭ZF HLL w06_JJ$Fꫯ Bjl6;44T*^bQT///. `OWbbFWOOOooﱱ177 '''."mlld2Yrr;ЁEGGs8XHLL h6l0 gfflJ_~e BV&X,?11`ii533okk+J===cccj\.z9;;xxxXYYxG!*\d2D"D*e:KqMKKKAA0|M.͛aKj@$|Rǝ $H_>9!d0j5L#5"щrȋHLw)^lZhaLp``0h42 LhqO,!5e0K(8 bɗ P`m~jGǯ'jt:\W*(NBt\A8o TzCj!*hboG ]xw7CjpJ |hxE!W/HGPp87 t:}0oxAꅃ'zԈc$C9ccD`0L7"m1Zśs"1݀HG|dI A XBh4---gϞOOO6}墢"[Bz^V[ZZfee577¶o;0aXwdN*ҥK7nܰMMM|>)ʩS,--SSS ggg}}}Ǐ?RnpXjjjyy9dz:vXyyymmm@@@sssffݻwX,VMMٳg)KnnnQQvpp4͛7wA=xC4G)!P0̙3vvv<o;Հb JKK[jaQQQ8Ye Y;,11Q,geeݹsb|H~O5440P(R}}}p344R___QQFLðR8,,,@j,77b{ʕ'NL&WWW î_~UPheeu0 +ؑfZZZ&''QŠ<}4vttDgΜ{82TH]]677׾ {>zYBܻwh4Z[[_oM1]SSd2ϝ;#7\"BO: A|̣SA"믿ȠP(L&sΝ!++ׯo~h2,>>VVV4 UJ%Ŋڽ{T*iii $ RTT>Db ?ooj{֭z[7mp@~厎 )mnnn 0 peeŋM&X466fee RP( \^^aXiii~~L&ACDEE}RΦ!B_R&ܖ]-%%ðb JJJgggq;&0 $N֪۷o ܻw! F4//ڵkPƌ .466~tahhȑ#nB})))`p֭SN566eff".]ߟ7L&I n޼yqpp0L###'N(++Ft҅ ]pARd?ώ&˩Zvbbڵk}}}ӟ.^̙3yyy!]Va<''_|j͚5p^r%''f!n߾}qx- BwTfǡWUUEGGܹs v˗/;wNPLMM]xlll CVVVnn`0 333zE___QQBhffۛd~'Z>[rѣGaᣏ>:rlyyC߿*..lkk;uԵkfffT*UFFƕ+WB߽{7\=z}^^ǥRimmm^^˗z,gggnJKKDT*ѣ+VO4  ꫯn_!A=;::[[)= vpp0555?+)))22B hrl** &{뭷zKjkk'''jurrr\\ݻw*nnnT*,ch4Z``BXv-F]]]gϞt2Ν;t:ٹ<44͛!9W_ݿ[]|yhh'EӥR, ϝ;W^^,H?_444gBu[[%8Uf޽P(_E"ѣGϋ, ^[[{H&)jZjllussͭ8ܾ}/,))8ydWWUZZZccٳge2ܹsi*QDxa{Ae2'|uʕ@駟 ݻ\.訬033{IDR^^C,,,t:ݮ]竫3220 +(({Jm۶%%%:uN8p#55544tT*7<<^cbbo2Ν;geeW_i4ތ;wܾ};117$$B.] >vXGGGAAA}}͛7̊rrr7oaL ݺu`fّ]]]+V(++y&ٽ\.رc===鱱UUUǏh4NR*ٙyyyr911MNNNvvvWK0Z077gXŇW*^|#GGRϜ9`cc p̲et_|a2$Innnee{Jeff&iii333[ly'&& WXf33r333OOOo&AgGF7{WQQ*))$J]6XtuuoM{D.)Goذ!aɄ'&&=sNXƧa޽{ c߾}wz A:!ccc:|Ak֭[~W_YYYرի СCvvv<\jK{{;˗/ ``ee)"##-[Ld2nܸաj*F^^ &''_y 6@ckk NK0h?UVh-[_^Tj4 Ö-[|5kRSSn:00066ZSS###2ҥK*͆QOOϨXquB BEoo/۸qgggի7ol2FGGWZf͚qiӦ5kEGG;889888;;;::h4*!!az!:66ёi&>Oej'99_RT AAA CT ڰaD[nMJJzaZ.766L&;;;@mmmBzeffd0111qqq>>>j NWWW^^_|166Bp+СC rǎ}YwwwII /l6;66vڵ0q`mmmiii2_lڴ`899pNtzYYYooᆱh@/UV#6 ---r|vvvxx͚5bŊ.dkkbX, ڒ^Xr2JS(>NXjh`k ]u1 c0~aTTLU3$H H!@tRFFFVV{}};pPYYYuukj͘@\WWw1Dၺcǎ<ݍ|r}}}ee/~ P{{R.*****pRf'''O>}Q++pWW׽{VVVn۶РRM&SAA3g:::/_f͚ᔔ///FsС'Ntww| 2==-H7o&&&^p!%%0T633SRR\\\<== ;u}BO . /_u>,++0&&&##cϞ=~~~l6[&!Z\.yRST,+99:Ltt4x,@j51pRt:K$544ܺu27D/ucc#|wi4FaX*h4x22^~}||7OXzujjjnnT*JYYY+WpX,G%%%:t($$d֭ﷵ555M Aij|TLbŊRioo]UU%ɨTjtt4=~J쬓xCCyLL (`߮355ER\n}}ldd$T0 Dcc#]n@WWd tssCX[[h ^ceej]]] h:!׶իW3 Raoo?33SUU"##1s*rC 9===<<<Ɯ4MUUNb0D`ݳ{FX Ω" &şpD"E5hnn&&&@ wrrϋ9>>f---kkk'&&bccmmm[ZZ"##B C,{xxtuu=x@(ظЬ^^^dwP833244QȈ8FcX+--R><91̙VHzjؘ[oo,t X>00`oof544._\(rJR.D/swwjUUU&,,޾NP$$$d28cxx;((0>뫪V\9::jff:* B0>00rz=FYzА@ʄliih4L&3!!kƚL&@  }6FRSSSaFڵ/,, (`||z]yy9 ;2tbZZZZmlltuuuDDp)\.d|>_ LNNRԞۻtnn.**|ZWW7==pS0C}}RG ݻw^ x.TtI A)=N;ryhh3qwtt|"TܟL&HS)qX;/---vor'-~-Zo8;;?mw>ϩmZTTV7o޼gs]ة]w!.]. _{5bg,UTTTUU1 6d1~WoA $ ^dl`` [qd\kc4JP(|>n A|mzzFYYY;&1"0qb{`ގ=c=Jո1"i.4JJFBg{(2M$=M&χKH%s\^W^L7O:O&''`#^;Q|^?!j\㑭3O9T*URhV\G-p8 Xoނ*|aS^'/Np l Fx6]R\@h4x]X4b<)t,rxt:0:XXzp=/ep|bχurZu:5,cG$\. w `0Z-~͓d7 xqV A0tA_#D ܿa#)?bZz^R-^vȔkBj&#d2(8wieG=C*{a%0 ?Q;F O K,Y.uuJ-{*0lzzX -ͻ9 $HX2o0,H@YT)#VǥRgM1 Kʐ6@݂j?'U $H'''Bky.s_ƿy1 ydn{daD`FStN`0pms[gaE=i:Ķezq6"p`a6>< @A ShyV !HUdq)=ba2|pIIIEEŲeY,VYYYNNBH(bv֭a{* K@qS8r Al!=; r5aUUUiii666|>;@(bAё(H|˗ 'RL&whGT*/=`x<l91Ν;}||`هhZ}r0S*..KXXXP(A琔V=~xaaaUU՝;w,--ið0R>Ԥ1L@pfxbjj[ZZ;=dtt4-- ڎ;f0+++?-[@T*v^(~̼CTyp (`ĦP(wOccN%eh}}}GQ(>>>---`兿 ALNNsss+ }u|||qqqFF ٵkagڵ{''a0 ⣏>Bvj7o?{5)((@T*[[۵k~333XDPnݺuADr 6 vڵbŊ7oB- twwP(6mJLL}Eqq1۶m˭=sʕ+Aettȑ#ӧO!¬a877tኩi4666vȑ" Êϟ?/H~Z'O\v>33Y| 2<g`0>裗^z)66!R233ᕵ!777##ŋiiir\ްaWTT۷OT^t)33vnnnΝ"ʕ+999ׯ_?|¼;Bƍ)))333ϟ?wToa0Z[[u:X;"RSSe2dW\Azĉ[nq8^z:VK3<<\UUR(`׮]z>[fMNN;::j4۷o߿bXєbV]] ]re߾}"h4ffffeeLK.A8p !4:::111>>˦C J0C޾sUVT"w햖YXёO>$66իuuuNNNV9q A !zzzvuuMLLիW1N߼yX.J`oojkkkVBBBHHálذYYY1Lgght$[o9onnnqqĄN[vU*t:=--FyyyMNN]J:;;wwwr\^WW7n_r%22r͚53~pp/8x`?B:44 fffv㓗WRRj>㚚4S(<޽{K.Nٻw/hc͙L?EEEvvvz~zzK- vCBB*++/]hii)캺<__O>ŋᆈeee.\r˗/?}tggcǺ9|VPPPPPPZZ*;;;_uС%D`0b姟~j4N>}I gBgff~^ݼy3|dd޽awxxBطo_\\ܭ[<==?c\JҲٳܹs/߻wj˖-`2p CBB֯_o\k׮A{yyޓ'O7bB hGwwwOLLP(B:&&&((ݻ!=!|رWWׂ.\~ڵ朜^xܹsMMM|FڻwѣGU*UDDDooW_} yyyϟ|Rtuu }p˗/oذ!*****ӓJ޻ẃciiiee588899y޽Xw ssիW666x$5$H azhF월GF^bPaa_Ww \ F166ѣEҸ1 ;xU_XϥP(bĉvn| t:?߳gOaa!8  Doz>::z۷o-]oܸ~zЛo_xLKK;vTUU;w333---⒒g0,--{zzz=xvuutPrwܹ>&q T*EiZ8_%ɶmےlܜ / 2qqqt:}icX\TTri4ƍju{{;DFFB |5kN>}ѐiJ5::*oܸ_JRuvv . <[׋DF#N߹sk׮eddT*'''>okkzꈈBL&Bk޿366BDDDxzz)Je˖1XM6MOOOMMt`466T*333???V >|󫯾ڽ{F9xT*yk˖-{W?P(lK/o>GG3gaC.|NWTT tR ~̿B666󋈈pvvnll p8& zfۿ eee,Ύ75x8lvrr!$˕JeHHȊ+@/!477gmm S 0 ׿_ZVV^$Hxa0It… 'Not۷fLD30Y[[{@\Tx{Z!t;wJ$۷LFR900PXXx֭wy'..`0p܉cǎ۷ᄇ^UU/\QQQSSښ\zNFT׮];uT[[[xxڵk[oQ(&icccß\zuƍׯ_OII0L*KRhRJR [nbb%,, %%E(={B~ ҏJ{K{n[lӧ^V1 LLLmoog2OkZRy)2Ƹ\nEEźu뚚N8Ct:Vd ===ǍBuuu`effVVVfoo/666~T*7m4>>.-[=R)F}S,,,|}}z.,++P(`sssl6;""BTBcWWW_x=&&/KffffffbbbOOÇ=<<@_Th4 633$&&~AAA|>_Pömt:]dd$dOÉCCCYYY b֭ NoGBse ۈ^_bELLL^^ީS?[n]~]"444w}v@@ݻwpbbFQT0NLLϧϯ… }}}ׯɓ'o~ҥtH,JY,VHHH$흛c0wޥbX,VQQQAAڿoz{{رwR(_=44~򒒒۷ݻbÆ \.O?mmmݼy3Ns $HXj*jnnnnnNPrB g$z{{\\\ Ͻ{JdIaJrvvijj"<<sJr---Rtvv6,, kkkooVիM&+Bhbb‚F t:Nx˗SI^0xzzz"aadŎT*wN}C P8:::88hgg~:Ν;4-<<퐞aFQ,qll޽{s I$kfsssbrFh4<ohh,lKKIdjkk P(t:쾾@<888>>nccB\R 022200IRGGGXLP|~eeddXuuu,+000//?))0L$3 FD-,,mooWWWt]0qsrr\r%tqqD<OR577re/`Djr $U*U]]dbXQQQі>>>JVVV^~>P(+ 6Z(]AAAMM|@T*՝;w(JTTNojjP(vvv...---B}hh(22I$0L#[uu5-gaa{pp0???gggXqR(  %22^ mmm᧞^xD&I DGG[XXzxx ttt8::< $k`VGGGqJ ̻|is\.%qwtt|"w}uȹdD??k%CXRPPb)o&]Zn!+..֭?D"'uI AfttVVV...035_`0́'Mq웦P`[V+ ,tcR|X(0?Ax1.G<hV4PF)Jd23;'Z/Ldh4s6Jn}CIǻ~tt&v. ٘!*Bu$R2LO{|AO@o -C^OsCU"ЂsހQy,cZhlԠBϮP \.{l͒+PP aYޓO,E(yQw1'Ғ+IG'#~C $ Z{;;p___Cd21%,>O=T3<<*t:hUs-x#T$H AFk2v>ZU橃099cgqj%$ nA{1~ P?q,] ޞib"LD $H< `F `2t:ȖOQT8e2%^0EVqb@P`u?v5> @mp4 eeeT$L&\._|,t@d2d2`0bqOOOBBJ Z\. hdeee@(jyah433+))upptVVVp8^_<>ʵL&S*Npw'$$<߅ h4ڶmdB"dgg'%%jM $~jE4IA1URe"ʀ1 HKTJ$P(ۀ-뼍4`;joPl6vW8|9lZ~^ZiuD6r"`mm &DOב A OT*U*K=X@LP(ΏP*`0z}HH`033Kӝ'kL)`i9d333b)zbnnt|LnakcX PyϵT:c'0OXL J} $H`[2L&YRR`ݛN#.FRus*z(2ݽgϞ^{-$$D׃sϞ*2Fy2gvg\ytgX3] F.b $Hy&4M&744ܼy/)BMT=&>?pG4Qސ?vFH A $H<4122P(pcN-LK'CO$ܐxUg A $H Ai}$H A $H A $H Aij=: %tEXtdate:create2019-02-24T13:59:28-05:00a%tEXtdate:modify2019-02-24T13:59:28-05:00IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-filter-menu.png000066400000000000000000010710461477354127100276640ustar00rootroot00000000000000PNG  IHDR"gAMA a cHRMz&u0`:pQ<bKGDtIME:yIDATxwۯW*EQ{I4X1$Fc0FcXbo(DDAiJ\z/oݙ1w//I,s;;噲> joo1 P}*J%66PB $ltttuIg_APϤ!tp8DxTiR#gQJWXǿvcd~EٸqcMM͡Oqk׮+xAp  àZ(ʁZQW64_vD,ôEg |ڕ|dS(S$$1$`c)2Ǝ;x'صkܹs].,˖e|!EQLL$UBo_عsM$#t],K4xWpWFA?YUU~m۶D"A)uO>)))1 !DQUE3EG.\cznwyy 'p˜1ctʭPԥOJ[VsFfv%H{j~~`KRU%^J(}}YU>`Ȑ!͛7uY^׶\BիW+>hGGǃ>XQQ1hР뮻W^ٰaCvvUW]"C=H$ƍ7mڴMBi@]]Zj… \wu,ϖ#c_JJJ!=ؐ!C^}U0cկ~o4?)X,6tл#,K˲ljk/첃e \) DB\0iY#&iZ"FZ`!C뮻ŦiZues1w}u]?cɟ=e|+/H$IKK_RUUu=H+n.^{w80HFLrwuu!$I,+H8T]zϸ\BUUB>/sW۶vZƘ ZVs4 ikj#;`}MhkCx\ǣ]q=jXI1 "rgyfKK 7pǏ;VU'xbٲek֬2dHffA[7B4<Ȝ_EEE^xq~_3N9唴p8#8 p+,,x<(eee]s5UUU;v@麮iڂ {_ᇮ_P/?|Vps=9lf44-9oWwi=a@@0B1q¦[,,B)#'P(v;Y&yq>oi DQ>xB_5](am,prqx>1O)|^HJDe9X*v1?m |Î۞;1'fJ鲥KAH#СCsss)cSJ΍1+G8K_AH 7|s";wuE-^x/bzzv\I;>xl~dYβe˚gΜaÆ3f~gnGwnb~OävꙔcPDTݲaK - yw^^^YgYYY9lذO>yĉ-+8㌕+WzifeeM6skxJiEEEiimF֬qeee-[,=S<?FWxMyq2`@MUש.o>Zj)د=29hy(\DXAx OgwZН! M"?(瓗#<ԓ2 UtQT$Oظ3$IRUꕜoVH$BSNn*6qQ^廍3M8zܹ˗/?묳֯_[o׏3'(ŋ]Xs=wСuuuN˵e˖ &ٳ'L8q֭hMgDT6= "D)` .K$i:c Q$r1BϧBUEI%]R̎YԒlQ d06'eڷ#.?HIx.FS:0L2fSd(FX5Q;;2 K 'a']KMmƘ!v< !h̊MmIEI0`-T`s!8e4qxKrFbVw4C6 bEdA9nUI5i}Κ$,&1@+0WEODƘEM"VMŀhӢGX b2'qgߒ,;eTd \1 Ȃ,"1Nɗ^QǹN C2bvk~ zko777oܸ#;;iBHU+V455$IR۶+**DQ4-kC1t V87???777 fgg]vedd=zԩÇӧϩvz TWWj&b~~~AAAVVְa è? !YYYOKKC2hjjʲm" m"b(= 44Mt_>l.lCI#[I.UԴ(ҭ-[UQuKhKr1ƚc͚! SFZЦP2J_6"r1mӼ]>)IX `4&Ȳ@@A B1`" ܊5 u :Y,>U, 5Z^"*|א+?N ]ԭ,WlJ"@64nh]37T$[vMm %]@w뒾jIУx$!`At0a$fǶ4oLtfYQQ74n +:*fn}k[MѦZ67mW"sR^7NҒȀɂivnjڔKX;ݱ{KӖhBȧfnYamkkV%4QItIj[77onTvV5@TET,jaUU#"#K:D(aAE1֙\[:T=W$osÏފ;Θ1cټys,n[Ƣ_~yѢE{.P{w{sjAǛ {k }9B|>xDQfeddmۮjpFaÆߟ1 ^/h6rH@NNi IRvv6 <}3&==r%732b1(hbiZ%Mcy3X 4t( kEE\z}Kga1!4Q0$cOo~1VVK3 ٘[6W嗶tbщ+V8M’.37\]zޥ#$&B1B(JDUDذA,1+B yHىqc#*,/,Z$M JJVMa҂0Feۊ=]'$`w*o/?2ȘSEumڿ!s&$H]<Zv,i+YR9&N!p$T-~p\Y}}W׭^Uj >"eA-ۻ̮ WF{>\tahY2 m-ۢv4ߓOW֮\wY{}Rޤ'?i V)xd#Bfhqˇ_. 1[߯#ڇt왜;9AKv=+U/wyLbDݫ\]uʺu%%o#ѡʬyաG=e&5ZPX֝^Y~]MƦvY{YʠTOZuAAMm-0:TsO>Rf-/l~+gRsXڰ^C~1'pBkkڵkgϞrJ4/;vxٳgGQQkjjH<&GO=&vgE6XB!J)jۆs&,[00 A(a%X@cR3Ɲ@ `PzB2p5$aPT23i"M/03-Bq1 ԩ3Ȗ0Sj-Z$pzJ9d߯g#۶UUX׶vǑwv hKo쨔eSHu_u[/o{Ê %B@SP,z_Ƙe4`ʤIW^Qf̈}TS;;a!CHA1I_mt/ʪ @s;]4a4TQ!,X ]ye"7 m[eBI;g |PBg+I'apԎ\|rEG7/a4Q[SƯ3L-S GeBF0”QUTx OAEG.}}(:ѕ/aiMݚxgU?>Q<}q_o .S/k~RIuZpS={N,:zmWW)sz}#ko9JBfȫxT:?-v+;++:+-6@"K~u].(`Q"F($%QHDIdQPdIDcQ,)$b,I2?JN'*H(`EUEi=w0-5kĿݩ-\(ef+M_*Cg'5KJOg0ffI8x4A_|!h皛734GxC+V br FBE#\Q&T7vO,:#1XEP(?{5ƣxxxb9JSZfuiӢV4;?YCbW}7Y1y͗ lA-ʠ.ݻp[k.X g?cўE64p" 7aFg5EZPĢ*&1}Bv Ij fŐM "-^"X ؊=+bmFV0mlX4gJ7uI3vts*>V0col{s lj};*;*kC€X_%ڂ0"(5g M/l+םnug3_>z`!q+N(qvX"bW\1}xƘ w߭>tTX"rri©Z P%@))&ͥ5 H̑~jYkUa50pYutf_gnYzĜ|jW&T\DDb$EK.e65nEȮ]?+ŧbSҶҲ@-kAW>SX,\ThYW ⽒|Ϣ֪UFves}k}}GĺH_S)|zٮl'[?0]ҳ\O._VkQ%oMh'O͟\.MZgo7eJ,n={c Q%{>^wѥ-wSpL܎I7Vml6  _2;/fAyi@DgSR"+~੍OTx8xsqذqgΨemmܺf"*%m%]<]6]5*O->Uxg/wW\#W#~Ԃsdд={ |U2wq"8ꨣ|>_WWBwݬY4M 0<O 9jc8%ej(=L T;b s0H"bGRk+BMrsd+1cڧ=$+B/"oxR)+~t&cTQFYԊiƳptSv;in\ K7q_&(bWx̮D$HE)FqE-*JKBI :T(/99cDQfjkKOiA;2X!vtkIrnTWn&I0d<ްA\Pӟg_|!deѣmnCeYq+~dޑ-04muK.Xtbmvpp5+"V$bE53!bF-]f)?O5;Zv7k=~cs':oyf>輣Nwj@ˇ_~_eK]N)Ug?kCW#U^aC61gbIkIOϫ?o6_\_)|cz_T~r˄["MMbH|e+܋^G_Xtͨk|[yL3=x &N櫖+c[Z$QD?zvE&1bQnȣsݪۣ{YD1یP& XMi8NT ""Lq_+od">tI{]qۭ.Y m FL]:$`M¦,BT;rVKN**!n?%pg\06Ko\DU=EhGmQKEc/?"gda(7M#bqٹ^ y.#rsU&z6 SDL,fU/  Bؔ1U.VӇf 2.sT_PgO;88888888|Uŝ"{Cu{ekgږEוcA}MU/d\Ym–гk: IZoyCMWyKMܖݦ̧J}EEB`2jL6*-m;"tÏoc@(ٲd͕57AQ,cLpg\;8PWxՄIg/30]_ݯKWN.o%  4_#4 W_weeek bKZ$a}uN,dAm+m7ºm:OsOPeɦ,uIB0 0Mtiu]PbƊU|:gkֺi׿pgֺ. 1+noP6n0dXYs3aQln3WV0( (+[㲈[2=Oаn_ItJo%3OBCA~,Gc\q!`B, `2YVJkVB؊:;mɅ32 c#AEZǟ[S=XPX5U4 X^QE rO. Bu] J=PJ~nM&aI@oM̞KKD͐0A1#Y%* N !_s0Dex@m{/C"Iw]XJ)Tۺ~,A*{B(A#:::^ۿf2a@mӌ@Y31J!#KZ@@0*a!Q8@_w8S!5P?3W+ Uw:Am؅ˏm|?cLw~a0|;ͳ}rys~gKg,n`m;++v۶}MRǿ)[v555?v1VXX1>f1Ƶxb333^eY?v{].4QaSp+Ά.B4P@caXW3ºwb6ˆQs(A O>m[ˎ(3Vn $ֆB!{P-2j(ƗÚ?ߋ{߅oݜ 5/Iqk,bj|cদ&۝˻ƘR/U@ %b{{{MM,K$?^'~S.B0o/e cAO?IF(PhС,x<ES0!, 2 W Mmbi}䳢>Or[nNᵃ( OAEXӴX,Z 1Iꐊ`g'(]VKtIX^0`3 ie̎QFݒdMlTtaEC@EтUU!N}Jj!0ԃ;ȍm{޽@@Q7&&RכH$LE!LӌD"<Y].9sars!(B,UZHʙ1( G c,йppppp8,8;BuqO$IE۶ ! 1-QeE6!qgzv>:;.b@Q;!D$zЗ "H?CsUP=˦/# \QmR7ϭ[U .K’!Q;jRSĢ&h bGje&jiY|/RJ@pe)~zۿ';m۲,@{{y.b bj~1^fMsssffq$Imz^ L-Ԝ'ҿPJ5MWTTEQ BofWWט1c&LH$dYZd ?ꨣb몪Y^^{]uU#FD"aض 6|cC/99 TQUU;;;̙S^^.I%Ĥ`lB?,R$%`Ps>_+& ~\X%@A˫4MAJB ؤI303ѷ9j/rBڄx"^*=}l`[tGjΟ6!s;>QQm!,_yԟ*ews8•CHOΙ3g֬Ydɒ{}>!sεkVUUq+۶]__hѢЎ;V^]__/b<_`wܹhѢkpw%h5d1ydIv׾ BTU---N<ħzjݺuk|m۶1b3g 6mzg`/^|7嗕׿,Yj[[[eee?^:88888P{/c+Vx'gΜYSSmۄR`L0럀(`i?A S26xTXɹK+nij-S8 7ޡ3QX/8(Cu;lrJbw"2- NtVH?)D(9!iL˼v𵌰s?"?209,P!.i/YPc0oی0M5H7BFD<{kB!E뛛̙[UUkb1EQlfmv0UhpȶJ)5 ߿[c(VY^/B)5jQGuM7]vٲeaw_[[KKKu=͝;wʕ͟0spppppVJ@ݝ1.\pرW]uUVVV"uc{{KJJJJJvܹwݻwdϺd/c,y>UsV~ pШ_O9JOO0`@ IzV¥f/dL$5^>t/Y~J)~_Z"5 ܢ[rwH= 6m۞vLȘvi4}XaikR$9>x䦔NϛNl?=-(nj/H$Z[[mhhh۷ɓm۶sN;gwtt#.AxF"UUNqZ0ƉDbܹn{޽/x<0l6M&כnH4/hmm4Mp8,IRZZȑ#nY֦Mƍw%tuu C0!K{ݻ?nٲEUUBH333[XX8xYeY6Mz4NY՗N*/rsssrN4yPVVvϞ={׮]ڵkDrA[Ҿ6UWUsΑ$/x<<*7豂+Vںq2ɜi>쳖e}^z&%=Te"h$;^pN.89Gͨ):݂=>sGݘf[mƎ{%u iDU8?!T#:0ё}g 0 ~\L$hcРAFzWsrrȑ#322BP$$x<E9=լ@!g…|1cV^'꫺3ƸjjjDQwׯ_tĉ'pAg? n{֭[lyw;|ܹ-o[o au kD"++kҤIǏw\vpϊhYֹ;a„Y>:ujCC;;;n( !0^ysP( `ƌӧOOOO_t~7v5zhJ5kDQx<{ŋ>dȐ  :m۶5==hmmm7tS",vРA UUU]vggg[ظ{nEQEy饗bX k"H\}P1ڝUzs1ҸqSg3a%tҴ%CպkKӖPm]δ͐ZY9 >Y@JuWuuWuCMƘ.;Zw+ysE{ENE QqE|7K6-B  קO̎aÆeddx^ADNNN>}+rVVVzzMӧ#bXGGc*4H:y?H$N>iӦM0!??, ;ֲ]vM䴴2[\\7tPEQ9眺CN4:''άZ6~tppppirSQ h4h_@3?^/gdduQ^k~I'Fg}ꫯ-/k7~·zg-..>묳c---+Wu0 BH,D"MMMf  ,kg̘QTT4mڴ_~Nf1ooܸR:a„: z뭢oFUպ.׿5!j˖-UUUÆ _WoP(|򲲲kfȑ|𿩌 LfX q@ 0`ZIXbUuVaA Xp͍5Iٲ] hKX Hsn-`Auj}FA? Z8p wG1:th"4h4i(80?>QTTdv<0`ę2e 7pU>i|sRE%aÆͭ0ƣF:t(c+۶G˲:>"`ȑ&L,+7.vi|6 . $ X>}"HZOqj뭭]zD?{]r9sy˖-OTU=c.ni۶mG>s>SQ훗G^{;f̘ӧWWWaP#G$,Z[oݼy֭[srr.򌌌+Vb1(r>}{'s=\qx =zgR]]-ʕ+ 2lذs9||͛79|:\;nt`E L jnjf@E#l(Q& #` =b DC$@Pk1`pbI>|hgr>tƘimmm.qY%5;Τ~jr0B!>MruؒCwz0MNDEQ1vtt|"4Rglz{Ɲ{~m0qc TܶGyO>g}ԩSg!}RܹsO8 6ܹ+;wܵkWYYy睷}D"qYg]tE^zaiʲC=ltӦMgqFaam!C.\N;mŊ{+seHKK[xq"HOO>A??dW_b}l޽wg}e}+1ƱX[(a^a_U h":`?{b 0< @4O٣xǻW V$ddd477|1 96E4ߧOwޞ#BXALe(~? ~|P(|l' 49b{ʔ)e˖O?zYYYK,:uɓ|NN%`! zS@{ks29ypPׯ yj䒑`SwS翭w!.-ppppppppp7SWɁq'4o~{jU%YB7q83MQ~jH%IJnw+\D%>^[[iؽ8Z_o;s"ձLhҢzs$ 98{4M~LzuG+iÐ䎢4i& CbFltm]\˲xF?1\%7K&GC)4v\z%aE"@ϤضmY ]]]՛­C UUu{Aե˲ȫV~i}駏>5kTU}'?D"Q\\/X`ƌ}*))ӟ>jԨh4O曱Xlv9sUƎ[__7744;6?óg>餓0˗/'/_>x`0f̘piӦ1ƞ}W^y~[n14hWoH$2p|pΜ9[n+FQRRSO]6;;?/a}7ߜ6mZGGg}駺|>n>{f77@|mo2so0;!>Hni^:0Q Ȳ|xgr 77 >,r)MMM|R{{oYUUve0`(zjaaO>I)E1vG={@aaĉo֭۽{}7k֬Gy$##SOu=;;ڹs'Ht'%:!uw?SO=o=yx>[vG{n>-YdժU555~c^r%e0ʇӊgyf„ ӦM^SOz{޽{ϟnݺm۶o{ꩧxSSܹs+**꯾=2- BҪ HJSNz,AeRғcj 1x_ URcN$9H3| k֬2d^777O o9r$t„ … 3`ӦMӦM60xrkÇ,k9#,ڰa߸q$I`Ouᴃ `Ν;'N|||ĈaCXZRRwk{#~gϞmԩ{Ou{t׮]_|/|{:KJJƎJJJ,Xp饗8dgg>#H/}[Vd~vvvFFFaaiSabXrGCtԏϟ'Ugn̙s)--/p˲D2p:nYV4ǫV*))IR~&S/?~EEߞ:Zis駟~G`Fcc .]:o޼O?tر7tәg'@aa?}Zd':O.^XQ^xaΝUUUW_},Y)lr8ioԩ'x"|ڹs' o+A/? /Oqn喓O>yѢE<0⊎򂂂7#FXx1r)\s; NBHmm?_^Qu{챧zX9m5Mտq(nYEQ ܧOQ~ӧO4ejKK ߃ɲF'6lX0-E!>eʔEi 6RYY)˲(eٶ $ɲ7oo=eAnJ~>1 \Ӵu=SNE)닿uRmܝٳy۶m]w]qqqEEѣ-[+ٳ>C3,\0 y䑧rJzzzyy5\t~Æ _|1!7o^VV֩1bƍ=\eeGy䑍71bժU۶mC4MW_mmmꪫ!>u벲O/\0?Y^pӇ~KOOD"O<'|B1bĥ^*rSSS>}em tgL4%##cڴi?￟H$~,Z_ܲee]foql޼y…ꫯN$/BccW^f͚_|qժUӧO>}… ?!C\tESLz~44-qRj㎒ے$544`0oyYn~uuu[O|wx≥K޽k˖-{饗Eyϟkq3>:{7Μ9cgy&==϶mΛ8qb~<O]]]VV/^F_yn裏rssG#?,X~ԩS`+V;ॗ^۷M)S;cTꎎ={=;88.$p8)bAAAsseYm1BPgggFFﯩEѲl>WH$EF|xXNNƸ󵴴$ Ji0777 bFFFWWWKKKnn(zhkk(̚ID^^3988Bh4 `uu$IH$ 7iooG)mP((J8njj ^OF{Ps~7I&Bn?wy]}_K,OA7n5\s7o޼𪫮z'.\(B߾}EYfݻ:,E񨣎:餓:::B9r7|n{ז/_iUW]5w\nS2d,Çk|+7P(DQ4xw!=((`LOOOrq^^^<˵m] =.sss|>'SnjønǓBǺ~vݙgrC$GCP\{'Mca=qY3̢"HB(nݹUi$c۟A=W_}i\)!˵k644D3--.--1vg~yyy,#BLBb555|"˲.ɓ'b1I$IBmF)+eu]/+++++K>x,jiiצK/_~7|s[[[kk~$7 9qe󛚚^~/<77_~w`08zzk&LϻņNygQPPk׮ y睺_ɷիWX_~_~mۦO~ 'lݺd̘1]crl'WRF}m$zйrppp8<9ĘyK_Ax_=4mBH$zəx0ƽ/0> Ƙ B$If͢^tEPZZ /{w[ouֿ?]ֱqwpppppppbfccc~~eYɝB|ۍor7:IW֞~s뮻 =R?$y&5~8iσ<%e{j_70O;88888888P|ˊ;ө:nRN)ˡ2B?ɓ''h!f2=5Y+ڴ|K"'8O piUQqC?tv'R;߾饞h2MI..~888888888^C*^4-󽃃wcLQ0Z[[|?!˲z!]׿֩sZ$mgdd1B$w TӴ]v͙37M!@`̙3l>t[qOkد"ȱ븃tpp>uu˲$IڲeK$&o!CPfff[[ۮ]:ꨤmS/%OeIxታ8{;38888@ض-IeY0szݺu󎪪G4h'MDe1rAH kn+ǽ]uEQ ٶvgϞD.r۶;:: 4o8{!ݏgqppp#/ZH;JKKn˲g}$##K/}~p O>?0 ۶_|1c|Gr̙3GF׮]1~CYEWZ5dȐUV9tSO=}wpppN{Sy˗/ />cHIΧ|`͟7xc^^5\+PJ}>w!ٳwCBVZ%y4M[`k֬?`H$^ZZZYY{I&޽?$uY'tŋǏ_b„ w;vX7йppppܓBvfSyVB_~w In p8777;;{֬YW_}~K(bW_=iҤɓ'ׯ_qq(x .>}iI͖7L;888$q:888|sw߷LYYٜ9sBW]uՀٓ&Mx<7pC~&N(L2bĈ#FǏ.]4PJ=ؗ_~cU_f(cǎ-**Egeey^[[{(:888|?8F2?8\/E$o`֭H utNfRJN[tpppppppppqO=s_&2y5u:5Ltl)"#Q~{Ңۂ[%rpppppppppmS} ]7/ *?D"F~[[ݻǏ1Njs_ nݺ>}}keF@1e=# .'E` CaE! 1e`a(C(F @D`130c00@awge S C(@x@3`0(0`(Ƙ"F!2D3Q01@!D)0PEQ}`bün0Cb3`]Q1Fb!x(f Lb($YC\8F! #(0h Sؿ*Q Bx1`^(CLcFs:ƌ1f2A4"Brb^:n31ĀB(_κ" 3LBw``Ā01I!k(F"`eyc.d10cxƼ,aa  !`< 2 !o'<'a\0*00e<00FQ3> `B(B`@3@/RJAB 3 u+ hwBnΈ Bm1)Ā֙J`a 琡͛xH6H!(oI <#ĠMu'P0PF0=z|!/a`;;o\=)/2A`0y=c>{{cs(P@O1Xƈ }Hzc#h9qKݎ(ƘJ|xL)c1龧>2^Aair$g<3Q*`Dx92!O"0"OĄ& Ā>X@C%<\ (zAݣ,E=2ܭ3`H 0(V?qxL!^k(YO<-F10/QOFxyr!iwo\<v>=fv  A{:-|`]=)F!C<+p(ՒY'O,Y"^ ʥc!3wE\JN*r'{.8b1=-0PJVec@y܌Ga$|0mٲ7 & 4w劻(\e9ս X`3k֬[nEh41VUig~ZZmے$aYeY_O3!# N¾z*_D=Na8_l'YzOAz?mԓ} q7)RãIt+oO 5@B&uϕ0 ϩNzr/Dy`/j/b|S,싥(ľ' ~` )a@/ГJM@HEOKBuHJ9 #G-%IY)I~If:Yd;ipVBx_mXO3د6&'SR.`9H,/g0H6ܫ=,LWs5غ;؝('Ӹ'}VH k5V/ yʾ¾ZI.#$+"d2 ޛ*k6]JRHݷ = J-{Jm(#}jk+4}Wԃ$Ct$ٻ{)22}1(wDz{w YL:p_EC9گ#)b j/˲0#7V͛(_W(--;A_zM65k\p7?/W_x &|ᇍ{.̞=;33K.E:#wY]]=bĈ38{+*1\cDA ,(֗L6ИTPk5%2rÆVpH]!g!1fQb׻=`SIf(OSZw`v+nT~Άp@Zr 7e[GgRW`OZէ}22E %ֵY֬li9Z 3%j҈مᶁ]Vf Ul+$bJYSGb@ ^#蟨 'Ux9-...%4ː;VIPՙmMeFuIrkiDo}BMVnY';5m(Lê*G}|;JoV ˖[bܟPܺmfln%O,3aE 9\$#oT1eXf[;ɖ-pZwrMKYu$ 4bl:ӵv)swlAtO?2b{7}D"9-tɒS<5soۄ-FwglV۲Ih3\^Z?*S_Weqf=K75H#z^24{XC>VKi n (zPH_KO_{NVŞPUWLlbPKTN[Z;G6TڍcMтŢɕi{&,[Oa%7ŊZs6zˋ,Z񀩷@M5Mz%A,؝(WCZD9eQQU/Ԉj[X^^X } Z#-Y/dղ\{h]V ,;cZ \EZG Â+r]Hbݽ[mHG4᧝1Ammxܮ[Zh=AZt7{PG3]ֻ*6C"~sOǨx~"]uvF֎DhQP-gYRjhQ9;_US.̎pENʐkd'r˚-ZܬW vb6*$F ARXk^ש'U4撴11zSf~Zmڔ*, ła303VZE)?i .bw'_pX#X|[ou1ttts9^7p { ^QFM8=S9.A(ŗ-1:ͽj˟s>|.KËQΤM|??o̺b ״e{׸9wÃiUfGϜYcGsl>8/K{>o EW}/y [3{4W1gnF.k]Mxw3%\r\δki^sE-_zF|G=T 'pi('ttJ]eǙ9]m{ \}5{_cl?7M#jF޿/}߹H`UŖoEgyȲwœ':G<_>zo=yyX=jxZsbgϋ:O&/R?nW2>k}94ZU6m3KC#'9Glޜjg MԿLq_(/_Sfw\ᛞ^ro|dfϚ;Z|gYċo-+xyyhq9㍷'}7h=wtsyTɡ-`Rlk+?gckg>awm4|Ŵ/c4Kv\i^;j1YgЕwdk;qjhCil۲xAwu嚻߽ƓSiyYߕkAe}}|#vyCO}wӦ2󬺕դsg "VP2ٺ2Uzoo}‹V [;(TTI{6OXrݴx!M_KgΎ|ſկN5>l^0O"_v}dcqݿ?h֭eG6kЎpEd7jμbIAל_]e׭>)GR_z$NW5*]7~ZuѴM_˂#ϋBדodr=~z;Ϩ9(# Zmi+bǝXuO$b[|XR+O҅]˶-+xfs~79W-A?h=ZS _{37pC]  ƕ#͙רzڣow3(/pTG6|tt}:|p>D>;˛ǹ/-UVm^YZKsGý_3G upiLv+jYD<~u;6_+Ż}Z4qO }>:qn$.HOP ]?e6,oGӕ_l*;>}xeyK[jK^r̖ӳA{9ͯ]>ȣO鋎3kIm{ ?kӃۦ!/~oj_+ް1y/| iz8ijy !"G&[{ Q;{@x[+ؒX!Tf%O}uמgvL|L;_OQ̵;24h8Z{؀{sk}gnkC)mMߵ\s5@ 77t]|iii>3_]wu<X[[۵YYY۷o?㳲xK/reeeUUUM8/o馧zrtw4$* \`%Q k%=^/˯\۫.*|Dï"{e4e%knOTi^߃~VU"YR++ @I(!uMeMTuEIVDI4t5siB> ׫$*baK<2tIqeE]XUdA14KXAЫ Iup!WSU/VuAQ$|xTCbֽmUuc&!C=y5MŒKu~%Ji ޘ*ˆ[CKŠtՐSe#zU &.&_W\~AD2.T]0ܚKwky'5T+^ĠQV݆nUS<ݒ[exT(Qí{fx.ٴU5ܪ"4]oȊyuGǭ]N5b.z4ɐ5dȰu%|>UM B<`OUp@AtQ4/ Rx!˛."5GVs]+JO+(D:b"]n٥)-} 4$EUtYs+ ~$.lx%MKjeE@%dOV5Rō<~p4"nf0  #yu&^7VukC1Bi~O@T\.$\ ~Sѐ[PeYt4IT]ۋ%Y.$E4vI:F_RQuuQbEuAWT+Mce]5uQ]ґ"%H%a`EQ2tM WS4ix<.Pe0|t䓔˭!4L,(.)*e%.T %{]nIî4#u*v!Ka$h r Aqk(G͐->A$ Y fZ>YnQ j"DGV *2 Ijt H^zt]S.'qxDYCAY.Cb>U= jP^-_w3%@=l$[ 4#&]Td٣$*I#*VuCMK coP Ըv).d(ZR5,y$+K&HbХRեJϥpkEIV=RD p . nP^1d y ]&ހM{ܶ+( .5\d i.Cuz*~EV|k܊ˣ Ȯ(/kןǐE"s>#]X Epy\tɶ)JߍZeQ? k~eLQtQHZ0͍}:P}{UQܒˏ(U[t).bܺ0&ԣ.R 55ٍ<>Yѽ遠*Feˊ_q{TttA󹴨K5&`V i(LrdՏ5BnY6TeCEӽȲ_edEuIʪW󹈥=H+ETuElA4vKY]G>eĀ#!#˶-XAAp{4[ 8 نae\>}˫tUKsIWu=()[2X hDa%nE4,ɚ+KT* ]_{4d-ʺ"4SFLT{EIaO]M%Q|2\+]PtMPtAA"z=dQd +bH4EDAAEԯWc\Eq%$%n*uֹsb/⒒&LPUn?ꨣ֮];pc=^>|8OO>>aÚ)Cݸq 7`5nIDATy۫>h]!bFlPJ@fSRJ%m R(0J!RPF #)e;)!1RBJ%@Q!e2J(Pl!JBmFcRJ e6c2J)ؔQ0fQ)x9F6RBxE %Vƀ،F(#ٔ1Q^BB a@ `JmbSx8J)62¨M % (cٔل ƨM(#6`sJ;/T=J(lB)ffRJwPJ PJ(لeA0FeR%`#)$(%0+_nQFlfwRBb3J˜M)EF)NuWeuSwf#@lPL)%#@B(o[ݱ0e62- B)aR--Jbw7lFxc'Q ̶-FRvғc.s Ԧ2(NvF(%)Rb% 0aԦvaP1Jڼubw'Aag xNt+0`ym'؄Kc@l,ؔl#QnbS)cؔJKJaQ^ -:{ i6B#(e<&}lBlxH.0z$Kw 56#ڌblJ\@3ljS(j@mS(zQƅ͈?x~ӧݍ| #`(jSP]0&2fSʀm 6~WwT0 @!@(Iwr" eRxPG- dw;%Ćz%bC#vOb睠{`nԶ2£bGGͺoMvJz% >|PBmC2ƩmH${%ex~!%2~#RދlOvhLm =J(~Vxyo~je@-w%GuΩtK&'͌f%PBB6`腵w-L!cYl?B@PΣ9y9;Ty6|w>қ{VW8Vo3ZYYa:eiͩ,[jڰ&Ks͸x6d 5Rs~4lՐz`4dKOYp+kl cf,fֳ9ض&V̈4l.d4κhN5,iۚjtcsf ;'fCͭdٚ(ڲfg\6ɚnmL!lBj*뉙0&;,``Fgg [mLWM3{ڞ]f7g^g4W&ν.fv|5kּmoˎwywx㍳!_oR8zB!{fjc$I\dyyyyyy%y;"۷Z[N){$I8 u$bZ[.xfGh-&y.D4[Hdov ^m=;b[d{\`&Ng, 1exvM،q(c3e2cĜZ;8판hEulr i(% 5k&9,5I 8{ƛfyJZȌ V0"ڌ lrXPl"S6ɔ֐P pK d2aY4yyd0A -̥U%xa"vqKݙ^L6kDe$& `D,79$`+#E @ IlZ$ l,B62= ؊Hڴ 4gY  70@|e-6}G%dW̆ћ@6D3`b &,dr^(A34ĶE4DMlgDmuI AJD #A2ggMgPw Bd+Ef@2@Y&y6fVjB4U& M'Z#"YbfqaIP̓i>̂hMi,Q[ ̜,dւe@̏~+|ȏy?`7;>{#T[rns/?O21H%p$ZO̮$Ď 8ֵpԉ+JDBu4 4ZZ4-Z0MTdD"됣QV(F /EpHa"JL"rJd=NdPЊTWA'Dʀ6ҞlVZٸPY  hH05 H+426I&qKcD[NB5T%mQA`*E#Lh!"5m0dY/$+lyz1Bi?+-YezfՂ( ,/ߴsɉ%c~ש-*Eڷ.]36tJCJY+=Uzh삍A]Mv{Y|8Z]cξ;vPK(7xMU5`e+{ݸ/Mշz"ե[Z+PӸB ٱ%AسC5L=my弞237ځ*sךՕ\z9Μ ֞;uySPv=}msMm>{J%k__?3[xhs^y']\رqՁL= %B5vvIGdxiXW._\ИY3oUϫ3yc#۵. tR~V8M}3ڷh/~kz֛\.qUWjg9T\'hGa爚PtIJɅ[~Z,)f:҇7R_/=p+,c;_7Q(=Zo;k9ߘNw$++/f|dkZqRrdϝ:|`9)w<׵K axvy|qg]uW?le:Y)>[.4I~U~asU6D^|w~}Q>wz}e zvXX]lpLGڭyn*yd^Oj=]2Z=W-;u3#=ԚM:{UGufsKþu5zSY#ym{YSkƜB@ sy6NzS_(ѫr6=8}K #v۷xY8^} Iӯ;T*o,D節+o';vON{Pc_c<%؊]cF:Kzpz5=ip}YCzֈn~o$3Ǘb!ްl76*ok[iنM/>I4߷┳ϻq,]3N|z'oX\vEuO[C]uGz҅Mn <{Q osMSyCOV8k͢g:ӎdsC{vo;^9T8PxqM^4bo4IWI˺p/Zm3|ekfwWNVHϖ7 /pVxF?unT,y#]U Smn{/ O^biYSJW}`xa!sSMG *8VkewՋb;t)E w W n?oyW}Eùo,zoz8xE]d)6W8/]'l)B5O/UqVvx ή쪞';t?=~3땋;˶.L9W?[,ҁ`/<}qivRwKеn>y5菗wxAm8Z`P콝]C+֟ymG$=hql贙68X\8Sn8cxrdeʧ"]֡F(PUhiX'xSjc_E] uut}02 юU{nҾ]մ߻VT4bupEvxx]D*&eqt?i]ػqUm.w~<6>tI}aBYݗWڝ'eb81~9/̞Źſضέi+>QY8Rp[g|55ċNZKEG)uDsaG:ӇzePԫ)WkОEOwmeFdP6ؽu> jfOiDMLVYQлO꜎g%ϯ?4qXm(u]6>v@TVv䌤މv)k+J[L|S+&\-]z-)Lj(ԇ>sI(*1+tkzs#q:е`sRƣz!!M_0W&^[Or)M/- NW :ֈ[ 6Zt;{8.Vyb?h7mc'^H􉅃CS`8a7a6>rD=_8X;KKT;M-a6NtCS&$Odurh@ :zz^Sٹsx@q[z3f.1:%7N[,N޻sE;G c.GF姄˽Yإm]a{&͟U? ʻ/m?wq½۟k=l\vRwb/]]tlHwp٧/{\x[ܿ!/O& 8@`rًrfI23:h.}ɒϺ`Me]dz\>Mh7Fs"p28Y>tZP6{hoqz]^Wϛϼ{6/C{ɹaYxAz-+z ZV;P;`2Sx͍=g@n[8F?i.= `uoҕx#<8uN#+J;ێ{[vᳶg]?KPyk v슷]<oAk'FN.`]QY;Cϼԓ~5uLeAMQD2sxU92Tu)-_s.X\9t1ydW-j?rdoXK&-|CŕzJrvnɯq =ʻj]:vG5Q}tYOՅ; q97)GdCw+o9wWOV!X41 @5zٶPi0'KW aރr )쯯[r˯Rur!VrI'{O/Xѱudy@ڞzZ]1|.⁓,|v4ZvEC{T&TE%={Ѷ}ۖդ'٪;P_ȩZZ}JFc*FmKPpjSklPȳr[7 iX(] X`Jp}7u L@i$fOhH9Z2DCF@.pARŐ*V*P.9XxՁcCB}%IRu` 1C$@R* %\jz!!r㜎ʄеƆ†,R( # ȈL"04 \`Rj0(:3ҒV2@`} 4 u~d< c0h-2+Ф&"BU"9lɂf2nj aAR{P6kTlIӚ=F"a"b#+BrBN"IR0NLN6QhCd15рI,8 D' B N$]0>,83IyF@ @`✅HH ԠbIhiätekhjhP,=f d9QJ&MX: Į4&ee1Mu☈nSGAi!1 plZ/H . \0b`cX8^b#@ԭOub7b "b9Dq85zjSf϶DRBjPA QH2k#\RNl2"#*JK(c8BIPOl  O)bcE)+4 R0k+2RlS ,Eh(@ƱVM<6bt11zAUjc݂Bs0RJ 671ĤIRrl!!` GLXUuҔ5sHjSp,5Ycd]8Ҥ(1)JFZlmHXX0Gb[R%"GO@iuGz1cDK1;^I!r:Dm0 MT-HQZd R6ac\zAXzHN I*X SG[FyH #`-l,}aR ӱZ0T*@*!-B"c|Cl,I[X2(KTu"'tB%"kH Z&L=lSmвtcF@;1h$'Q2 R3QbBCP iXl0' c$21:6@[c Y J-["L0h;Zh>@:SA eS@+8a!"‹DUU lH Ҩ r[EhH Z5(2@6Ԗcm88YJʔ-*D&A0DYNIqJ\fOQI0(S `*Acp$#@u0UhT"MA*:5r/={`T*_c5\si@lذ+ues6z]Sis|L,R-Xm8#,e&}ih 4P x[,h`fdde46Z͠-0% ?lf&:dJ٣660٢54MMNZ d-XlY)[fpk  l55ϲ -g2M`Ɉ6V33hm3^ M4s@ fdXw΂J03榙,M\a\755 `P-[nr 2pVrfj`S6gM4{&/%YZ<˰nY0chZ4fO6-YMl dKk0g]j+!c5Ւ:q X F"4Ͷ جi[2 dT\&6!#5p\gFpV̏#ڢakSb aL i,Z ڢkj&Z 1[PF%[ui56`5`ƴ41`:n,9C+ٔdZM f[˶3l`4 ?gAf8 6A6XOh2GYx$X0fatR%f&CXhqH-` gWA3 Y*&Ch15i6yEE6rkc!~6՝<-f(YκՙAdMo ـ% -wj-d3YJj>7-_R1fBcu-gIl&l2ؔۀɐMmK5 [mA7 Ma3{PlٴLYt&$Yl-m8܌2 QY϶fJ[ƐŬpF$f f,f2dk8:' Uݜl6Y"πthiT\2iJdKfO\E"!CiMuF,dٕanj1겵 Q[Nfgfk2YPYЂLL )ڄlΘϜAx,d#1!5fEVV2ՁY7pPId@^V^lv믿~g1o~7! /w#1&Igff>|gd+12K𹏴c֮Zky1M̽<" !?p 9_&(4\RB/[C0 CS=7 <*ewyYPnU |/mS(>N K7Tw{*W=Uʵ9 A N>sœ,i= 9F朼)PRDv%Dss%/|7ps U0RQM!L B'/BkN*bpγW~\Av]Woc(mnWyEQ̫ q))sFܼ |Qʗ{V9ռu:^A,BQZ{9WmŜ~(J9';)[ y}/PpI(=s=OE dA,.7~"D1pk\,\അN y&Wȹ$ ; s 9 |A<7ϩ/y^1pUeU|_* *)d&sUSnl }/܂y?SywׇP T>E䷅9/( ~)yA@[IA犲X7ȧ9ܜ+PӪDm 't <}MoOymPRAy9 P.,|O Y|GX*yA{(R{NrnEљ(ׅ|h"\7zB󋞏ys^b^.uB]$:\P minۄX,0ȂB?Wm//Ρ_(A) }/ׅBIT>ͅ97'/N_q-rP(rmE'OAyq "+R~h yPR` N8r;y' %)U>R2 5ʅruDAAXhp~z9WՆ?!BQN!/EіpB!yXih me]{NlJE7M6?pCsIzn\Wsa {StB sN+3CuTLrP|RB(ښKX -aDC?nws\M%' +bPe.,;T-S*;\TsKA> .d䋮*\8n(\r I2יs@żW(n>t^/()Nay 'nusöC/\{aP/ I~JsyGPT*\yr X^!0ŜT]rQ|>yPn& /ɀTY(T@P|. Npe9+S)̻NP0Rɒ>KA︹-^g6~Rȫ\ g]KA2ʼnnd0q'PhwҮ-EΩBXCυ \8̵C]9/ *?Sws^t|{Oڽt<_RarB!G)U T _ r2T[Ȼ^.\ERn跕PTЖP} l-FA{ $U=9|uxn+zc&e*֭L, g7sM7q|%|?яx:63_{o]tڵk?-]tgySO=uu8p[og?P|'qZWWAt׃\faa{c|{zo]ѭO>^2L=M1px4?0ڒ8[L>{K{Y2F'w=_j{zZ_P= zQ~A 8kwg]4RUQ:尜L8?k7-q]޶'?*WrBɡ4ڼ] 5n?T{;4s*i=-?̦[n0{ZiƩ}?7= l{2 TG{^ؓ,4ĶGdr8_:h4߻3F:>!I~v==r~z+;<9|ƃP<лiؑbM֙F҃[[+<0rz{֞ðMD0qdB훊Ԡi;O;{v?s+{q^`(U+#GCضB- xwaWz>S6~/WgRLē{)Drg7ǽ98~v[N>[uI.ڹqujlAs?>rۨ'Iy_#J&.Uw;3ۓ-nJC{\;4ȾpѾE185xSg#;_xqO_›mz ;oE]߭z@#0bG}75vxCvmq3fxrGrv#ph`Ӹz|4ӵ5󸳵/ܗر.{{~7{EߞvQcfxHStO[ '=ܿ^u?/t=|3S=@xߞ·cĚd>4Mcmh`-?>Pfp䋃7ynzD`mLn ݥo}qᝰjכֿء;+Ov!n<٘A<\uS >j(ə',gu7ԍ{'{oMQsQG}~om3qgcrprI޺u8w-UU}E ֣?ky?,g젩N0fe}.V_tԽ~J³QT7pg5Fmc* b[:ćzқ17GSv<'-dpp<z#]~h٭ލptq7<>>Էu{7>5X3wvA;p@~>C#D9o  G_tbl[F4#US wxRܻ9 P۱-S#bq?M>wL8SO:/i{#;pHiynǪf͗Ŵ8\@1~~3i'ԫ!t~{l٬MF" UfO|`|Vc;ǟvir]n8t 򇝛JExxP2;GVgq0`g6[=)Z>hիSqX<1ɍ<&]>x8܄iw3=S臙Ġ ȖgA쾡dJgP0, y]z*; [ngYn;x;oo'>q 7J͛7_җw_~僃We˖o]wM7T,e˖cP,dФ*ىdbYJJjXXidA+k: Hkc~iDL&82f): % $&=ķNLD!lPZXР'j GZꢚ#J@ hAօȦ&puÑ4, 3Ss]N9vUˮ61 qj<6qd]m0Qp_FNj"ZҔ BFňe/}!C2[4 [Zd`Zi*%7D\ki%c**cXKк '.JSVRA,H[u$Ul0-[04\vSzi!2:Ǯv hjm\:~&P D*#"`X'*LڷĖ v\k˰Ԝp_C*r:\BPT &mS`*eʌJrkiOԐX8D&e *R$Rx)cH4d$C*b%H8h"::6uL.8O 91RaD4[+SSc; TM,X]N,TrŸZU#?qE.NqÖ85;4lc@ؠe RƁxnb Y`C^0f#HPڵ҂S-PDX$ ڭek%2C LơI$IRFqc?uT#eSOj{ll{ʞݱcq{{{X|?\s5V"wy޶xbg&k>cvyyyy«[g}ӟG>??^r%rmkab||;Ǿ|jذa|>?33STN;/}KiӦ~l4ozӛ-[o~u{;c̫mCɶ[k2/2/2/2/?"z=2M-ܳ/]w%x;ޱrm۶@OO⊧~z…\s 7pꩧz͚5}{,_xK,Ylizgwy4G?iӦk֬ waoqyyyyc׷}V(bf-"iΤi z])T*Jc3ezzСC[ee^e^e^e^(I{>+bi%׏Y[kqK km̜}T(f_8/2/2/2/2/V S9;2>~Y/Ǐ9쐙yyyyyyEߒ1/2/2/2/2/@2/2/2/2/2/=یΌh}X`^e^e^e^e^\ ss 賫pD$_#\e^e^e^e^߿۬YJ:[ @{-c> QV]*g fg7mTf+[lf˼˼˼˼;_+Uf7/_Z#eKso%ϰQ}d%KN9JǜSfYje^e^e^e^e^m׺pϖw޽{y7wu͛>7o|;c]ve7|3oεk׾o۞yK/ oxÍ7899yUW]pP+7 vW,={衇}%KxӟqÏr3 [quszz @Ge0mqOܬ-U͙pqv!i@A6l\lkvʖtxd|=u0:Yf# 90Nbn6#Y, q.t$Z05/j)ZQZ3̉.ќy^3<'Xl_?ϗ.]>Otww?_WRw7>>~W~K_[RJOW\qEGG͛j":W\y޵^k׮ugٲe[я~sݿ=Ѓ>xu=[lƯA|ؚѣ 51afe7:1-涆44plGN9M 92Ջ٠;Ymcx[g`Gj/^UhHUGYahgvzw Ht* @Y8 ihcf9F'jV/Xx3xQ4[hGs43[uc8Gv;8& *߲Z181VĜ.~‰Vzk~DGZ]c0 f1tTJ9:tL G1qͶǥ<8{?#:>ps7ix򑬉4M>%K<c1#q^k^v{wyz…rJmmmg k6a4t(j@;J*TuJ9]Q(Ѷ5.4+ iR^Bk$x9lPT㺑ssdjeA%˸?Wnae6 L'ֲ{(Z]JIAb `)IП,B7 Fl?-m"WT]qĞ3طź_ABꤩo*t3Im5^ZMF#@[L.1ӥ6W2㋦;vAһׂXGq^đQrܺŌ/_EŢ-W dXQi+Nt3㵇+l#az0^ڸ3כj/Bϡ8b_ZS,i uZiw>?\Y`įj:ܘD)SNdCȠjerä>HH՞닓B0HSFM .9Ϙv:Dz}Ltp[%rhwyY+3tZ̕.$nAnul榶VJ}CuҮS!8LD P\MOPfDEeӖu&.r[XפZ'+$i.ջ0W3z,r*tfR8^R~4TDX9*j1 ʍ 3TI)S-X&!FX:zڶa;#؎C&3 dz&q1NV I |52Ih"q(6D%֦Y䰡TRв㒘L-q"h&2hE"ACoM0ڰL]r(Hc" HTkř XrrOUڴ ƌ(.T|XXidtN"o0bvUaUy;i⺯ڦUmƟ%IhdJ Š" ځRa3(׸ZR91pKx&q*c+p2 ʹFi* oW`&G33ŕ*z(rprc8aȩuT8DmgTx2Wj^PeUifJ亯}L:JDA'IFD:t0IRǠa+y6rf7jj=wYz4H~5TYtG+.륾+6:)_! .)i8QPJ;SB)Lu7NuSewow7 2/J4h9SI2-TY0`Rq]5.VJi."ؓ!;g1'y!HQaP:QOJ6rT+%pcQ0XU֩zR4*ujG8B+jmʒw0)/RCMmQbi4.%*KXP~!M6]pI#R!ԍq$JUqy&V8OBKFbY8")QaseJr5NjH8abܻ(h$6554D#<ڡӉD(͡J+8* kIcJ0QrTj 9u-P8LIuچ`3ׅ234Ca"& 5m 1*,Nm,K]=ۼo߾g}vGGй}֭Ld…Aq]]]f+uԥ^wޏ_~=ܺuDhѢb|>ygu?xGigӟ Ovӛ߮xnׇq𭇝|W}_]}o`_{'^3o{*ջ~_ȟ;H{Mo-|!]/e꩓_|_ |ߠa;&O?:֫w~5#z-5Ԏh߼z9κ>mQ׮ZtWkW +{j ?oNG}9]+L﹩ǮiٲM;syZmsէɔR$ {~{3Wz}SO߼];\һֽoW>ֵTo\wZ{-O/ya`Կ|;7ycZV [UrӚk;~oӦ_%շ^xOwwf^-_\}柾>yͮst'yd#O]ӿ.}{כG=wg?U럗?|MsǝK򯓟|I1o{3xۿT?ꭇ?{>]{Ϳ˃~ֽe?'t+/톷^{```Ë߯.OT;? rU*eWnF|Ze}ۿ\v7pjmomOξgyamv^p}ZW=`Z9K[y~۷w5>?V=>'?]Ƚͷ.K/=١}Io_{'^sG7=p_w#wx_.|o,ws> ~h=3~qkCO^8K=_np'szhd+z6VᾮǿzŗW yxgoq:':s>$UU't-<}AgWA^.xݧ,(w]kOmGg~w;=uprUڻ߼G!#{'GoyuVM8":T=唷w=}]S#?|?^{~o»܋sʧZEW/Oߛ/]_ugxz-k{TW?sZo+:x9^YX?3~3Ovs/;;sӟ;ﮧrJݷk붙/ܰq-߹ou?l=_:{n{[g\6"~f ]O:ѯ达Co]{Sž8Z_w|?}:>ïESt۩ϋɼzMjh9}o>/>߱;iӹ3ބ[۝:U7_]-{s*c}knT~qjVZAoE+ϜlڑՉ*oUNݪ K ů~z/~е]]#ڡvKNVRj}}ᮧ?ot玶eWM _}fz/<>DMvwzõcw 7qƒLaoY?{rFۓ-g}~_B[/8߱,gx|˗O(P{Jw]t]ڙ? ob{ 79;WzOgC;8x joz[*3;COT~;~0b>޸jǮ7Ms{ }yn ?w6q|}RG%?=cDžWp ϭw#rK*/ ;bUsq4nxK0s|t4S5zȑ4G}Mq9aїi\u֗Kd~56|5C\s>/W+dG~x9D*>^z3։/W9sU+O]N>E4 >ŗ?z;̰O\qx9|J-lw= WF8x&^6i/9coԽuq~ɩpN=/:_hLOOgjsfZA0-c!Xj"#0e.MW!hٚgigѐ2X،ĀMbV̂~1KGx|Ԛ-f)C9Gr,= dLI#fFOm3"{C,,x ZED6Dɇd`YQ8#߽`0KC Z̄l3Yl `, pc y9K :ӄy f,z,XEHi& 2kP#l8dFf#,3b+",@InJ,5M{R ĖٌsBf Zs >bK),0eEm3[U=,fL}g=- M[@`Lͻku)Clrlxfd1>f~(,3 Y~hI,q$@Cleh n)ldh[atbtdJD9,`6X {df#Љ&3{2%ۊD#Vj !ČsfA734}!PSU H<tMh'q݌l9[ul =S+zZ~;&U6s֕jr=y= 8k MWI Y :  %!Xh4q܌ٴt7[:KLMeYsGHB{4vr6[ 4 `j99ٳ[@d@QȠMGEM`Yf47j&"X\* #[KZ3۟ȘxEB4zN4C63fSY@\ -5ټl!h@XLY~,b$j34YHM\/"lVղ'0g [>½& %Q(L`/;c*ql}c" @㘔,8U끃`XԜ R UH (uYDi h8qDJTL|n0 lj.14"#,KL QH F@*L,o!a-#Dbmр%l8ƀ dj96 7\pA %9@%b6 VHXIS|D*A{"F4,U%u, t(2~ I #]AꛊU3!Ԅ=kQGx JV7@_CA4 #ǩ k(Ŵ SbZfeL' !a !h[bN BOyM0;6NvtT;‚`dLͦ9 *@i1 E rZH%r cfNh%2ƖA{db 0HFlj4 Y[&AUe tP Fg\$ `LGDFkL2Zj б(1U5 m!e,0qIS|Q)ki @A i,H@N"V68Q%(V3Acb$T1YGk2 f&RH Ic,˪a|NrWuu3`THTL_*W|EAĈEDpatUݕnqE1|_|r9;=׳ci!،P{t36Jb Cc @B2B()LHD8i.H1$2 AVBD FKs A ŵQQ$ -c6N@ oGB!(b bFHL 1%NB@I̍A ؤc QGK ' H1'ns-s4`"!|z@C\D+@cIa'& I uL(92.'~l6-] x $Ŷ֪,rV[QB[C`uɎc$Km.bEm :nXK0Ha∑LH"28$b- c`8pHEPr!EBD30 YD8: ssbCaYÀIdP#  B.;*"_6 N&&;2PF1 !@hA4 *JN챆TdYņG8 cĄ`&"K0!22X+/M߸ϝ;ww%/yI>~Gi;?YZ#+Ƙy/j[<譥 v O풁vlUC:]u; }K!g5̶u?)3I~z)"7O 9f7] y|vq8"xRgƚgbpꌍڜSŏZ^bly|]޼=qt:VљPzd 3CC*2[}=%=E߉b>;',#k3X){p4boLg Cíf`0es^tLub:q>Z;7d:x}^|xl/ .N}uw,4][-8w xVzen/k>9W\Kg.mlo@~XthwhB8xdp4 Fw܈eߪ-]t4< ;Lϴ|Yrs{]Ln؃S?.š?},9 ;ml.ܕb2ܧQin,3ۢ5=i~ mhWGA57ͅi1|DVa\|D\_֜$+.2p\{Gӓfsձj.k Ώ^1X9ls[uxrml+nmWY5vo8Q錖U|߹ųWG[N(zG̙ٗ9' ya R v[g:9KϷgwDnT[V΅Q;ru}Vۣٸ##nWvLz=7ܙlKuF)Q**,PȆ}0.- Ȳ@yDxqybUvl!U|lG_5AXܹFaK79dr[2 ;#&:J}ֆɷOVۖ&#@ekTg: 7TI1ʍÛ6zHȸQqR ےX܎$|jfv͚q0].ۮSkk`=;r4< ղ#B6J2eKw\l{~]\IDATr1ِ+ *_wxʞIoiO `u{S 䒚]'ohnT W4Uew'>c!Q# qnGuŗؑ7Y51"*F<שɌ_1o|=We+{q3leD\.?\APsmDFjnc 6O U&l zKG-.~o{Ӌѭqm܅fpymLyTȅ3}_Xt°[4m:S'/cZf:wˀ]WpR^S;o]G|v6;pk YVΎl<*.OH,sp|m#q~&V:c,}D! VW@Ċ4 @ya{eѹhkGMr}]ې$Y6&Ņ+涉; ް,Oj.Njd6~]|n'wN\ 7`~eJX;\;a+4r6yٮL3co[Bdh8omK\q{L[lVMw|ߏH)d7-h_[Y91't'} Rwn4 JK7 MS[LeFyc3/LtzxOFѫ1?3o=j}sՇ{D7 *j{A9J;GnM_:#]/yuݙCg.8koɋry߮wU >$q1ko~U/싿_Ƌ,ٰixƵ8]o>snaK:ظn~G~W/gW]+orux=J_& N@-Cêg oذ܅F/[r;;GOL(x[vg[} lOΝ-SG{:}lS{2^6O]rv_=#c3F˝-Ɗ ԣ7~?/L6yҶT6>>zyi?ӸeM=޸=<\yUs,P7?Z6{W6[ߘ;{;TCo~J[vA⽹Au4nY"+F8q^R>|w5=sk󱥹>S]e4V~;mJ l3[|8W<%w}/g^m>{oh.47{;{vC.mjTUOoz#Q42r32/ܲѹps3 /_ٹʾVSp4?~`g%F翳3_օ={RعijC)̏Fؿ,+'NdwW%n.3LŅ:B:T'}e+v}V:}K|Mνyp7n5ۇ՞7]m̎xNhɗ mN;RU7Ƕe9_4NoXL]k:~1d{wb]38#ͥmgU=xmi9?~n9~0_ gϿ-+{n{|wӖAU[tu֑_u3C/ХGwouNm,qf{}v<j-SkOmlt҉巜^||dzwՑ`2_>μ돎#}i ΂./ټ+K30 'Z-ExDڏOtxjO3N8֑g׷wGםy왚p[7rC ߳1 mơk.Mpv\N^9WGv<͛Ԭί_B~kOoWٝtnݲ5Xߑ[LF_^̹;n~uL!Zʾq3V=vGpοEpK||屽^H%KۓS#$G^2 7;|hxYVckZ{鏗_@vR㒭\r%r:0JſnGIUn:W^? d0h7dZy/C; _3xqƭ]hC?s?_l}_vg?6ٙ[Kꕯܱ;g[OnWuT?uߥuаGlҙl!Su/v.D:{|YǷ|Pe[/\lMl/`7xI88ȝ+<;;n7s&eC%As\ "Gu]W//:w>q' p\{h|o<3ؖ/]o` ۳c??E{/Om:21xE+sgr#gGKYϕZrՙS̶s+Krl]mX4Ԟ,fKwv|ٮm~CV\I.Fé}g^PKFڶsk/L÷;e>~~ /̎]Þ̖_M/S{xZ 7n* ׷}Օ_xw;s5%0Q7U/2[o9Ѿt\xKcg~(M >x3ASꫯ>xcT*}799 'Oks/v:0Ƥo߉/O?$kZ^^.J z=cd=3>>$ $Irw9s~0 -Sԏ~gΜd2oy[>|~oz K罏OJ/|atttjjo;ࡇzG_7͋/;v;jsZ)'BChȐ!2 Dd CH4!"Fvo& 4D` e&H?w/L6@Ȥ7@xߔYn&Di&1@` :5 v^DL:TІ Y:n6 rHo4)mѤhVRW HgG젧1Nt[JN !&0] ^"C3@2 jcȐAMiM!Va!"=#ª> 1d$@d"Bc N3(@@ $ 2@h*ChH1؝= 0JёڒԮDhaR#h"0@S0tAƠ 4bd@ӭi ib4!2٠HI?& ݫ,nE"Ѐ!c Jz:#$cRT SI5O1c m?m;bTҁuЂ1ݱu40̊G.54@#hcIO6b5#4dPwB&2&#=m h` @ɘTНZ'?I˲6Ϝ9sw6Ǐ_{x+T"(3Kپ-ŕ-s\׶gپ*ڎc[ܲv3De,ؑ _[ZzJ,۵| ȍl,pY6؎qmGzu\eҳTllB۷+}_iǎ㪌k{[ڗ6XTﻖke(aYgYGd\BWێ0 /ʿ㾲_`ܕ&ǎ{[9B0Oxd2Ogg]wӧ7mW2Mlr~dGx7[3ϼ/d]}՛7oꪫG{Mozk^nۚIӳԹS(1W'gYhsriYl9>51D2|8'N.S|vKʇ\EiI{rKR\)oV=78u&<9cՏO!8rd>с.riۅrqhcuz#%]Ofəxp&=2tgL:Z>ϗ}'N(7˝'Y[օFjQw.\lKp~>[8m*5gGZ.NXrO'Μ/4O"쏞9wd=:q#ŹM: lĹÇOMp9ny18rzSmןP}t);7{ܑV435} ux ӓGlrr#tasff?fB,=3塹<;sd8us1GO 餾x\#XB~hsf.v'Oj3Aox0܈g&Cr㏂p^ɨ7>\p>9g73ǭSũCUa`MD+;ͣgN3 SΝ蜘S\|dN/ =[>3/NO\h7@P8{:ь3|l*نLslaVxfDiC 3'E!Rt!8S3)ofzh:{Pd*ӳ@yup7s|4?OYf {fn:yP&Xzb\?z|p/88SAi`3QGg/ ctttjuS g&30-1[?rd-Ơ8dIډ˲g&ıNeJYLCr\=.v/LR94?9S+ONgKz5ɾ Ό{<;ϞE朞fō3Oo]ԅL 33K8 _,WeN~љڅcAS/m;X}ޡ}Z '[On~$7uh Kr#OfΝq6;?MN>3$qDvYi̺37g=nm:G|w3;^2P\t(bS#Biziũ֑ :}B\4GyĚ=wjvdqj>[~ :Νj:O[<w*C;Ǟժ6^~7-vJL:W=GO\.lBqt␌S'J'S˵)鱧?sPb9wՋ;SOM5o*dž.L]|4/:TrTa-? ӧm8+ D<Nfgr}~| ^g/TB=S_ /`Plg'Lx̚j>8sv ۣv[33=7u`ѵp1'JrG.\O^:w.ȮZ8^9e&tؤBNod37;uTM{D@]K`m]:䕎zT=[]jzNꔊ B̄J:s .6 -(ز0={K[sLix.yׂVHWfF5CBʬݥ3_ ͐&az V}0+ B&D xwOW 2Чt<,ݍb Cyuߥ'Lu#g+z`ݓXYʟS@`i!B@v{19ut̉MA+]f zNub=gZńA+ @B)=X̓t 6 vpa#irp$jmVϰ8fI!ӅtE 6W^qeBa˖-qQJӣi_b+ewQ]]mݻ oxZkyeY鶜#D㸯tgRʴ}qR1q,b]s5+o߾ٟ};UW]ev:|+Vkhh(l*NkӮ˺˺˺˺:VҿohRjhh("c|8Zk41l 鮞)cT*1 B#bʓj6o?$KVϟ(2uYuYuYuYu*gEQ/q_4wOSJj`ƍRʔqӦMK͎_ڦ7\Ic@k=<zۗV+?4zf44}ΑOcG_kSN[[?sq6|ٛ?G~ZW[+{p'ܙG^pÛtի?;O?;3,_]0:on޴}ƶ;&ojYv糕='m|G| rːY3\_Ql8;/eSvKΛH5 ;wv;gwmǯE<0t nfȟo}䑽MhzkåK1W߷^c}]?/S۷!*OO7=ޔ;xBAc['{rO\UW=_Ͽ~5ߑ/^z՝gμAqoW}-v䮯l>|e*=Qwؿ(Lgćj w3| 7Jrj+2>t5?'y~k8Snxni{j疩C{7;lQ&To} '?v s{'~BÙ=W_4Ɨ_I*տ|w zw[vyuZˣ2;0S|w]!K 6זxժM?񆻾^(F?vv;?/>G']֘>;C\[]v}s?N䰺;_ZVQ'K;~6ضk3q?鮡v˺pfxrt/c~}{ `#E?k:,5MؾS7s>7'?ѓS[N{o=޿GouL|-™{=[ͽ+R~ W/wԊ8c?>Ώ|;|Z3WVW}UK?Q1.G3: [<:]5C|@]/[}}]G{~៾8_[ oo;|Ww/ͷpǮyMy,*]|>1^z2 M[hg'nOzWn?4tC|{t+̗_xe盝靜Eũc7mKNٻx7>Oe6drԎ/x }o-/x/;Du`/:~-?s?7O~֑s?dco[<5mK7ܳl;>_ߵVy}S3e_pjGt&nC[޹CO_QؾI_O׿^'_s/=ղ'qrS˾r5?t|oHCupdoSW.ܑ}ͻ<|䇇*'寎3 o-G[[4myKoo~;oKG'ws{mKտy5z_cޭO+tZϞ l"R֖dSlY eɮ>WpV6s͇y_w/l;F<7G~5_>}&f{f=o;NR-( ~jB,UB\+Mח\ %;VW[aکR,i|3 ZKBTk$jR7mJRTOZAԜ jF/עZ[NV:*48l *Zl[<̯TPnZ'Mrˍ-R}6jG9^5A[rPI M$AԎAj% [QT5;Tnu9w\U+l-T+G IVJ]@/TCrӪpn,_'0ry;fh\,D;D\T-,@R^l.* aQbT-f> uSv-Ahe Ч˺ :W_ `d1/JՂNT_lGf J1h5] z_P3̷:NU k[X-7@C\Y\kTͥF`~h r3B3\+Vk!,ڋPYnB0p6gbaT_Cn7a~90a zF/۝zTriw",CKtӮ'NNͼC]J5Pne(UBWb#ϻm쇡%(8UktjzT[TMV|jAc Ų`=_K ,rxcψ^" /rcGR]sbԂ2+F.aGrۮ8f!]-ՠ_(8_hbIZc+ZR ^VA_R_?GoæZQ)RmU /-$ʅLX$V%-L4 KQ-jFRZ!v5$ʜAKۖʺSmr?K M׼\ Uh@ZjL>B/AosZEj!hiVjj5'˝B>Q k~XVvՇD)փۋF(נ8OkfL:-dG?.5% $qѢVXՖxT'mU%h4^jISJvgA642zɷU[SLqVwr9yb,S})UXoKk,Wu\_lVjI)^GFP5a"Wkak6[bx8^4,uZeVL!Wkd#@RAZ]`Nl5Mm03P vkmVW_CRo$H:uVlB{PM:MUW}JjQu^CĸXKaksP7-P bmi tHctj] 4s80-@ʅ@I=Pkƴ%J;\VfkQcTBq>h\5k#d1f)@B Pr H@*΅3J`B1Bpnc\p1)㌣f\p ! Ι ȘBH&+$@)D͹b0pKp.Tq%8G)$ G)PXKJPps θd\rXL $r.@gdRHΙR2.% θB)IgBpLp #pJJAs Is.R `qGa1!@INb\A J2.('؛(3)@.@JT 9Ps)HqcKP B ΑsBp1s%b\FJ(n!*LJ%J0q) -ȅD&`BrJRq%@(8"W\ TRI-.r!R )Y+s.m $C9i ea(DJ0,%$ g\ )%d\r  AHƸA:7 WAL H8r3!CK R l.PLp% W(Ⱥ )\ ,ӻLX(Iq2ki7B2K4ȅ`F* ΤD.FJ^E(ř R%(- % HJ"3I8SL(.$SLj\2 GaAI )LI- Lq-R LY %K Ť`Rp)HDq A8W+5\ )Ʌ\rT 0q+u  Jp `IP D.AXB䖔hieq%D)\p&rR! )!-@B d.Q*g, L83)La1[ Ő JɹbR1nq!$\ i!L0.9 $\$nl @PZv[q.YL*.!HHɅPiT3Ł+%$#A( 9^H\q)d(,bBn1N\*\q&3I62%@Zh &%@Kp (ŔXPBr$p1BKHɹR05#-(-DbR0&,C)RB )R@ AH!L)!%"SJ0)h @)RDq c9r(Lto!W`))BP $gJ KrťdL(eT,rPH.rΐK-)D%A!8P( AH+6X 3%sA(D)-Hï \)Lc93RŘ\"3bB -ʂV-"DP*9B "M"P9JcƘ$HNWp#Iɸ Ƹ\ƘnV 9L)k[θD!@(B"WB*McdL R .6㒣($cRrDK0h P0\ $B4cH|2!0n+ $3%$(J2,R(]C.$e)P ͸b=P `I($P`I%TĄRX )W,]=-.BA0f7L(B&)B2r!,`)8 bLc YĘۿ˿c`͖d+7Wj%"C`LbzDg!D=D@"bekH ;"@`>NkoMzͭoeNigڛHtYMܬN`;5WL&bڞ W{ Save Y'4_j=y|n@@-y1ƺ;=Ep{s@vS;M^;k*X{m<1гZTyt/ K=ޠ`oW kfmiux+x-UVsUZ>1X*nWs[͊UrVKyXmЪckf@ 6km1t5Naδ5O (q".LMt&mIXZӬ { jVqPsYjik5v\[Zkgӝ7j /*Ӭ󫕥l!u-eVqfgz0k+mx^]Ys}Ek;YSXuk`jRk;U<Z hPsGU>ŪCa$)-3ĐzՃ!<ܳ8^}mw*VSq@ W ik_FqkZnԭ![9 WBVPVt&?rށ??=ϛk_{ȑ'No\.я~tyy Ht_/(OҺ[dᠻiA 2@("inQGJ8Z%k\b "7h4G4r䠅!R c@&; nL b2 y c '-Jb1aGmb\RЫwGш@`L<" c ,a,$ 0:ed 㚔Nb p$P`,zg5D4q$0D -233QBIf0h 4 V8xtx:ZBpN2 c!c2 mD xF"HLB K2d43`p0Q,6ƚ 0` Q`DI D# IPp bR2EB9DUCw,3ڃv061 41r"&YAM0IBJ Ȧ@@5$!ad&Y4M&e`چ(E, 2,fO&p:12"04 2 J,v042 !'2,L&dFa@HY3$FΈ)! 2a p vaVo- I A $0CqJG@$Dfm)f`&F3 f0bc!c&'b) IRmdĊb"@C $$H 21H#a`J>NHuJnCKPC@ cPFaADC)` ԂA4h(H8& I4IJLaRnZIE#Qc cCd b8Ȁ!ÅYd $ Dr @@5ɠPa` 7&yH12 (Mĉ , !jt"A O0A70Z9  $ 'A0N `O~щ&ag Gb@9ch&x L51`1hi4̀ J4n` g1 0$H OuzPH 1!)04`4$Bj m$KB cFII R@baALPI40B,FAd$0Q a  AfQh QQx} @`4!nP!1#(4Ā5 f6&̤C (@@f 4p0%8&( Q#`u{lH9|#`H0#0 I=7BDMW 0!2ƈqFaB4"!҉@@3#  Hy ` ƹN$qeHq pN12% rE$@' gP3D\#P3Ga$hf8r` aF''\3@B0"$:A$1+ЊGnB4##L#`'0iG]zR^#L!a8!O"F#L9g_`4 ;%q'"X._7nlZ>}~'~x7t ϟ={6}J)׿>ɼ][3 }[YLвCBtqX;-ryo 8<0H\mA'm-^ĠEETM%L1c$$aPiEdKQkvDD'14l$@ԾAJiڵby1ӗ%oP(vU56N4Bp!sGvr'LQӀD[CTv i؊he`+, ֚1@;2}F[;1P_Uft_=7IehՋc™AMA*ڑanlK/LخLTUdžuFB0nZh '糹屆 ol*l1$+H0BEahC;r#TYƂ~{9D`EA @Ĝ A6݁s7 27  - ujͤ:l!Z!Z}5]7%ЍÂhQl3@tjHkV,Y/:f:d/nqk@"VD1 rÕL12#Q6V"YXdz \ 2),T3c 4SɎ*CPhXʹu VMɶ/(! "oZoe3sj,J*IdmuhAIJzHRTj;dv$6%ΰZj '{Vk&(8-QbI?klZҴgE(a,rl*.ᑸy 48óP%bo o%a֡ӑjAp \NyjUV/ 579va` i!*heTt ֖@rxd!;~U<{0t`C InΖhZ5;[j'"Ϊur&jVB9xqJ"(D;Ql-p]8X,pnסoC8dXM 6BBL`O l^,Y#Z;Z2N}}ihA <H1F"0y;/,5@mi ֈ4[Td8 ȆasphdJ_h"7QuxSa$nj9ƦV' *A$ -T~7Dp믿~߾}lڴw|JֺoΝO<Ğ={I\^tw\Q6|֯y65Ϛ | ~gprxWZ?m7-N\T?7Pƒ7W[^8jo7seNc캪Ca|NmF{%r`clP$! IH! $$/Jh1{-Yb2{{Ne}fYfN{9k5T٧fww7M[/d==k늧-+6g-.l,;y#:-kzK˫)sq?n\>=_;7]wOTyvS+^ܕGoyX.<7sHϲ毽맯;qwMhAe=|{8Sʟ;k}sudzw_ҙYrEJ^5_|9{-|s#lx$EFĢrQrߦ|&n 5Ȯg._y7l1wS[s?G?3o, J[u 5oyh[zu]{f^.0.;JfE W>1pfڎ'vsM,Ϸg-g>q o85 3C]nLh<~a-Ftߒ+sri<3 w]{z3KN+J/9wڢzoY̺7SnS?3W9δo~y>5*?wu}q\??z`_zxhW#9;fu͚S޳9S=_=ߕ^8؟_]k8L(4{_ij\Q; ;C;s_+֍~Gz-f˼%S^hzZ֘=K_x<_~~_=C[-97\#qb8ub K~sև>w?gpVk~cŵKgWηPOo^}mC?˱/?U zbբQ7XX~z}VeVC]G:u!<}MezC[[:׼S|ݝ}}ޟ@[ϱwnϮC(sx`Ll!q, w=SoKYjwO ЧWF7>|j? ult̼x$͏̍X8z m{GS{-`i;f.<5yd蒞][<|;wxЮ6u6:;őßR}(g`:zjlf!9MVl~οntFŢO~=d}[sGS+/~cm¶v 6:<4ę5zÏ^.-zsya7.hcp%묿̺ͯ>#t?νs`^os0p`c7L_zXv8sddͿ5f5s'SOpߝ~sV>j,Ӿ;~o}KĪ9pȫ[f=s;4k:ќWgY˗Գ}lun;;:Dw[Ѹs?Tr~˸ӗ9kX3YxFos_<2 6ne}u7;{m ܎gFN \v<=GnO?~O(>0cօpە]`BDû^:1Mnl3ãΗnnxqU-*Adl.H}NL+ dA lK [ %}l$6n=HI_d3c4C!-5iv\S̙Fd$%p VHĶuھEDjRkܶ#2 䓿v%!l+ 6|1 #È8l*9ZvFn4S 3 MM* 02ejLam?D@Ж@#nh3l:7F#C0f+-8j4h9$ 1&Ōq26k 0$) 6i%J^ClIpMgDLnuQA6mb&ɘɛxgpҜ @ km f2ۂgbF!cLҙvK)6cmgvL"1dZlM[*I.1'  І#D@Ba{`J#pԆ8cX+FIob0Ðk$2h; iY qC1 [F @v&i 1 Iw'Έ?-b0!m;%Z)$=ymZ"j@C1 @@('@,I%j]+#ӭ*61DI#jHOH/ 0ik:14v*1'I,`LzLk[;h!.L4IijIk 150ҐyhdmH7A!f9m !rF3^bL1lmJeXbZdk!FqB"i׉#1<4Z FcDc@)$gWNI5F 547&IV64_&J|!U%M02́`&РA"c{%Lk c1'$m-㶣fۺ72L[,i)v"~EmF2oXlA QRn8G`ܚ80xhsN!1D2[:& 1D8+m02 #q0;meˉi"@v1 ںM@6~5;^o??O~8̙3=#nIJOz׮]<H);{{rߪjkE'ۧ O1WjKwkr j}>`hlIQ] E Ņ^OkɨN.in.m)҉ WK'x^]$L\ `-4қ&wx!':̅?N:L8$6MIy҅ܽՉ"N??/WŤO P`'2ݴqr'ؚbL 2k5YbT*LbEFEn]@Iz-,.nBE\6Q^FL0{JկVށ|-*EC`PGDgvBjGCCasГtؓz#,J{kAa_\ Uj*A%á@ ĠR0z0L Ǎboa4W0ʛTŢ#|^P'Atwm8C~XAga CPQFB7?=@P(á _X(͠GzÁ< M1Pz_{(|ZzU1 AFm Dqޠ^iȊr:R8fhRq0 y F0 CNY }Å|@P/aOHO|0bP qsM? r `^􆵞rCJpt+Peo0Zi7(AP(+"p¼mq1 p47A8Z zKzQxho 3FŐmJA>@P^Bؓ( n/aWlj~{P8 S {uBn:(b04{>/0`~ؾ`p`6T)(àT!TဂaT0 77 A9(9!χp40|A7a@a]*A8~mA|Ja<f :^%SJA a>[ maoP pЗS ިá7jk /FzAБ)2.0_ "T p((ւ;*}^"zA|-àY,LF{Qa +gKfK @ wAi aX,Pc ҽaP9 z= 00*ąBc(NfTp1, *}=}=pEP#CA;Aǃbr%BVoTa R8U0Rþ<}_t HO/jPR·D!0h60F_zO!pP#brg~hx=A(F%l ~7_ yB>A 'ֹR) iuB!(þ.|9za0 i]vBP`賒(.՞c_0TB 0+GR|/ A[|VKR>h4 ^¶\BoHBaOb! z1 t#KQ7\͸J5*>ejMBhr7ҎW7ڈfJQLBkԡfN 4 )*-2a*1L6hE,bԆ\j##6?R4BSLeb2 z3`dkSFkFj#G<݌RQ#JՔ^`Us4fN yT* U+dRV˔%.,EEި/kզg lNHڍ0O4NOQwr#N\uЭ/6jq j^Hوt : R/ՙWQhdQféFFGI:<3PslHuX.T1Usܒ_R՘Y]F`$5xX*V~ |dpq%4d7B%)k 1&Ϥ2`usFNk8qc0fȩSaZډY$ı91kgAt ̴rEAd 1 4}0԰Jct#3`mUC bIHHPS"LQFsб@}* SgLި6ۘ!qGC3~tƍ)4MШd@bSZKxK"̖n6iVHӸrD9JCaS2Z6=ڛG@f=btZy1` epe9d+s]@Yxg2jpQq3>UTܨ~Ri5,1hkP5 +7+Hn1F#<#ZD"YuD-8Nf-L3M*FP7RJ괚9^k3ĵ4]QոÈlF (" hX]"%/skQu#D%՞&ŎӢ!k#Eծ9ukV]P32ʐAP5x#N L,0# diM봵PRqXXCi]M 3bmfTԬf1SAQFȵ4rʬ)&]f)IC96* PS-ze{*6)x+E( gfn<*y5d8*r"$C*B'f"6sK^opE Q5ձ,g.LtF P:"35Xus F;YਥT 8کfG3FqvJ%R7b8X֔ڥՕFQ:Ռ"Q-G]B֍ׄ)bw^sy Nm(ދz"eRuc c?V 05d^W"]t?4*iQ,z[5Rij7GˮTNެ:e @1h8sq+J)-9o4c&IJcn6+9Miͩ:FMh wD>T8ve Z:&zY3.S`4~l,FڈY&vPԭbX4PuT"AIXy}u=zwܹQgΜBCz @|_ՕS0S0S0S0S0o*^k x?6o1ٻNVSǍ52.8;I`|n#&kc.)^&"FeJNlY]BsК:< Nڴ;2L&ma ih?jQLpl _0DIԄZxlze%ɧXBIJBN^X I[x&&H2V IlDlŘ ='ukt"Upˑ&@Ҫc,b%]+P`R &X"*Iߗgw$šW~~Db"u 6VqV-J1 /KUѣ liakVƱ]nMcL&Yv0ݗa ՋS "1Ɣ mݝRr|21&~ 25ijVĉ򊫛|E;ZL6-No0cl$[|&v{!q&~dK-YO$`J_vK㘒,aR$ `Kn'qBi DCMh9&)l9/{]|1/34Im4ISd\Uǧ zJ -7D%}圝 sl,k#v@S 0iF X4a4&{L/&0qL0%t:zm_(czOI)争A7f&Pb,\1|ǥA{ 6c/g!g]WUa_Z]7PhgJ$^_/g&_Hkk3 _U"LLLLL} ` ` ` ` LS0S0S0S0S0`*p)))))/SLLLLL ܧ` ` ` ` ` T>S0S0S0S0S_)))))0OLLLL} ` ` ` ` #6Ԛ#"!#h!r1"0  L0" D-,h7D'"@@" B B Hdd@D` #E$ 4%|E 4!1ĒA G#DFhmgg`hG  22(\`5pF4Z. 02X "@20HD- e Pddb hynG@4`!J8k!c0  Z4{ Cʧ 1hƐB0"+v? DB$ (˦HP";$%$˅d( a ؿ ZDnMђfLB24@ "1d"jZfC40vh0#a4bK0;[j*j `4k!mHH3-Ydi 2ĀAb"iYfAO, dƴWD!B0&3 OD2) (1 2֚@"1 HDlL第"FcKKY)LD@ X" $s%CXA [!U @YC9h[aO"{]!-z%JlL-zD&$$@ "72* bfă#0cc%$҈'ǂn $@FP'"&SF&`\ mXA1x:B>&n:MR֞9 hDF-!2 40ƒ0E}$ m$-, 흝}` ` ` ` ` !4b8w(HkmA3gtww !w5~_&Qdj7}vç7d#?1muLЪ՟OϧM;/מ>- ]l+OzەrHK_\}ۆ?; o8[8NxO 66_Wӣwl5u_l^wO,eÛᆆ,|騳d=l>#f>~z\.|k?0ooߖɎ俿stAg5ݥ.}EUɟ\Wzi3|x(fL^9ywdseo_w~kwO|o-W/|ۿqsG7>;~vC6&|Cdz?ukG\뛵{]]oı9ߢƆ ݕ>x8wѥ̖{5XG麟O~7!%љo~؁Y.]|2{ssnݵX4g|fQk?#uw+gVǃ7jD~O#_ԇ?x~M85wx״[.w[z f( k)55{>ޯ۳~5{f_(]3?BnξqެlߒsM?ǥoϿs]u㮁Ɔk^QQ^e8<>k7gťry`?^ >[=3jy_[M_⍚@s^8877a,ڧm&rR {մ9f}/U󋥕}7o I5ovOff޿_S|uo|ps7"uZ!?|c!vMyRs?g7죃F;sْsAs϶?ҫ~jc?N_u$Lyů4zϯݲxϿ_.x>g7|e 7 Y{OsrsJI{rKC6h5~~zn^/7]5? )n.sFtNP\<:g񗵠cwi,;}os]3l9Whax7AmǛxjӬ5ûpnt{Ȇw ~Թ=/n_=4to9=+uQߙ]Cs\Rq9@-t쿵ߞ7pZ?t|n_?tfLk[/]/ ew;5?~9:v۞0kͩ_zȜZELa!bs3m7NHeˊ,4cx`"utۼ8𸺹\]m88to8w<%OVJqxыfe>s&Gh hKtxߝ֌k%wlpd?Nki?3pɲR_Sý xm<}.cٕ\yzKegX8pSEҩok~kKn^JZc\?;VKN5F,ƹM=NMECkKOsľys.۶Xs}{ >xt_*|⵷d|h󮸶a52K7[~yYx~KmKc犮q⯭u:Jo} ;e7>.u}Y#Kzaڻo JO6,^5Kzk>u[q{~7Fl_>n/cLߖߌaxڿެ-ߋ6_o?韭Sk5XƘӳҝ/Nt?ݰiҿKұ箑8W+7;WHEO|Cg“XYO:~]>>4 gz,;`\OB3OnywЩ`:}==s3mm=3Wo:zvYNwL߶uF٥gwfه{LL ?VÙlϨިNی=n'a~iSj#,ck6Qh ގC/l[0dOntuIAOgA[:@g3C)F.D[KȴT~?Tg/-o:ĻrV?|͗_yPoiO#C]G^/|drhG}/X?gV6o:5uUŇ +xBX;kL̴E=ၧ0kgo:`c;=[sV+O9fW>ҙ?BlS+{u\~֣[~O?qr!<{x[zeYزkcNhF q,t|dɰt jű-+67[_߽ۜ%81*Ƕkԓ^\VP]˞)zsz;K.:ujU}v3c"QI;qlC[faZ-WҶyO /Vܧ$86=;W]t'O_yst VGYٺ{ q=;'JOO_8Y_9~ՉOVw1z"V-^#'\3VnS?Di ǎ6dC޾H0dmn_+!p>GGz~9sds"Dg>&$=0#_/n뽞84k.:t 90g0N^Xx*.=AYQo\ZTv5mf=9=މ//ƕE{-߱}ދkm9wu23Qe6*5sud+̋ԓ+B`GG.]Slx:~tZ|f^~ȼ0'`GzqzPlݩ/?iɻo,͝Kl_I`?'{j'{ GmھԒyF/ؙ|oYw_6q S[ݼy{;sϭ{]vqHes]\O?>lg=>sNGCW;t>Y3zȳא4i7gͬ͗tz{[S%,ͪG'| rmrm /pYǶ9/=: :2cơg4ʵlvEg"}p+-sVoaڧhv_i~'׶w>=treN'=ղgRoovz^=} ϗ_܍凞[3-leK*ϟ۵5^:螹W;矿}'u-{hiO-GGLjm/\3:{ϊ'W>Vql2l{=~gg{;sm yϭ܋kiox7G;3z um{vvgv{Pmlh'?u?Bq5G6{ɜ|?km/XT^ΗQ'\n Fr(<{ٱࡽ4ێ?u&RYś>$[S"( {e}T,srIp'> 39Wxi|EߑYŕrG9gr]cn:Q2]}绐nrғkB 2t6";uqd2/2F2;3Wa0LR^u|$~6eNKH!a:ml 7#\/z~F rY7?NLTA&'2c2p<i812侇mlyjP> YeܴDՔD:%RiP3>pziɕ ciyqg=pOe"P.P9'`*#-JI"SKl*; )rܜ\`'2>w{"YZJq|WJŜ<\)Y:RH){J8C DT<z>sҠБB %sS;sQq|_ٴ\ᥔ']p=uńp}esRs!J)sHz]O:w$w=fYg3)IqJSr]ǑB %w]Ťf\OrǕjmi)pRsp.W)wJʘ{qO6])w˦R\psAi:^ӓq9R*Ņq!&G$gv˥0fʇ8o AG *p#s#ICFJ.ƌ)BR)S)%\(渮Ǖq}(vsD& OLґiGxBeKgTunrå<@_JeJʌ6p#ҳRٴj(-3Zx\eRKuy&Vaҙq'6+}I{ ys)/-p]OLeJɌ=Jܔpd:<ݬL9YR0NʕxK9ynFA:'JR6S@4dϥexupdPLdR)_\l*-Nu8TR:N:8d"l*L9#P$)8"͕lV)L^Z Lv z20c1D-) JD)bc&Y(3k2;4eZqՆFX)`IҲgÊMDduCd Md%9.[I4RՊNƤdRv͖1Ql$rBƐ5Xj4m(ZL"8oWDzԕ(!HR ̈́`4kkEJHd-661尌NHl#cUZJa (D"k =dNݩM`´e  V%hb5>"QK^$Z#uɘngvԖ&cEsM&ɲ8%V:P :A 1Pi!Gfv'zeeU' iX[H&Kвg!0IDhfvh$掀i+[hcZXpڦP);C 8~YBddet#d[rɐrx 'DIk?q}f6cɈJ,a@ @Byka[։h_I[ Ǝc@1ђ$AiQE^mC@%&+a+YX0fp6cZ~%4.R-Ad{Zg4@4fq ,(ZV@`6@FS(M06` cB\x 3vdLAcCZĮNK!HbE@NBzurjZON֖|襯Ư?{ä.~b@;䤱/ B ḻYbPG& /r).T&xŌ-pɳ :ڗsL88i_Ey8Om |%l_%xq?gKӄC FiDMa&?}Jcx%Wq"^3(t ~ԿI:8fFsEњdd&eUV3^tq+s ENd^*|c>)2"/\+B}E Wd^y&H?22I:BƟ#۲W0-MN/4xOqh4n}kx1V*'N9s[oF[n.{Ui&0fPY $[FjUJ ˭R) *I=6Vm#L*˜|1l:Jʮnq&p3T/Ȑ-X\7^(!)2I[R*)bFU}дJY!DF[nZ|hTB`Rі;"@6),I&a0H)e9$EB7VnD 1 Ƞ%-8fWg<kMak?NVI<7^jpBDLZdK1F8-k'#URKі)#f` (jl"N6Y\c [K1vㄲ M0`&xl[n8˰1<X%M8ZMK}'AKV3.\qG& q܆ژ?#L|e%1a&ٻ&Xݷ8n!Ʉ-kU+N6. ɴ"a^R!4>ђx$jqЖbDb88}Ol,m% ,ҌUWӐ<ܘDC- -ZqFL0C8G-L6Y U_pkqkEeZ*:2L¤}`-{ I=͓-XOКtRlqA'[q 8IY@M!q8.cz1j6e ,'KkW' 68A G$0XӖ?-NxFؒ gdBD+)l FЪGmUY3*BKz'\9.Y gƟ0Xyq['[k"mֵȂ-g*I`'lp0IC:jKZDF+B O&w6jĘUja>髆'Ȥ\.Xpw?1}{g>g}vǎpM6-Xjժe˖}ӟ\3ZJjWܐ4 "4FԽDZ4f,GmC3n7`I4,Nbdc202,b%3b [ 2c\k6F--L[ZҼ q"j-$XRl52"11Nňf1 cub!ӠIX %6e`Vcnj'A9b̔$B!j:F>V–`:g ksLDd 7X}nc $@ xѲ8V|hdh30@̴ ##!4bRT (D13d6B9A34UhDf q#aD}>NE+N~g/g7=Ϻ;?Pp/vK5R熯;uǝZ#]>zksv/,~:=ӿ39{=E3[gz~%'o2̔uU|G޿Xڹ²}:Wjwjg`SUϚ[mwƊݜ.?.U ?4zwbþ"I}|ѼEW>~|;q]nr'ss`d|_ǾC7k3ydAJ_'ߺ;nǛwh6L~ɧO}Oܜ[|{'_{v9WGͯwc=ř]z_xzh3/ll/ոqV_?'Fz7Gg׏1Y=g..hlΞi䷡,nweߺ>8W>t9יqႡ{^[׬2Yy'fwn9Ͻ 3Wŋ,m7N37㹙 .|Gm; %Ļlkg`d~yYaݻ9'=#W7a~gYs7+_^Ǘy5WbޞGR7-`;w~;Z뿲~T%Y F?Ojhs-9 =3* W{ݒoV3xoAt ]|%r7:=;y}lD'6{)|_1׼0|@;go&od[o{ߖyjWfwW 7E8m@ײ_yxsYasҵ;}d*\M{o=\ʏ-gN_[rmޭ=x\W_3Bw3[t҃{=7@wOy{7;^3΢صz|-ЌׅY1{WхNW}1{ߖo.ĵ\~7񬜝ٍ]'~'.nķTQ|{\f =eY©;m]߱.soض>7߼' ֟:O˧ʛঽ[?tˣCOENxijG,8=]_Gkξ7;oyN6Uv; %;-qhG-k_+|p`{U~=Z\,ބNiۊxŒE.pϟzF3aA&۹[RXyyNڎgnim{7\1g.iov__fґ@N+at*80mN[wakˋ4ު]G=skg{_mW*g_ut+V={;o ~zltvٿE'xTg՞E<Ӎ'O w&|5Sm^~`37f?{Eo?9wB;Qy_w`mjs78ۢWobo<xvsȞ+|5Ѯ~u[f6w~O~$]9wu}+N)_;/ɕ+4Gfn.twEӞU{X8;s>ekO_vY#r8c늇 Sɖuӥ#P74:' 3+o-5ۭz,a`!XG\DF,5 @9"`8Fa3 @^!F)"6`l0$e& l!MBkҼ4Adp!؎od![I A nx$%'Fd!7a6f@˜V 5[l2# Za`DLBH`R+G0 ͠`$HIOk{@ئfl81 \[ fr0h18 F 7~h,{x,HI!abp`$cZ#hKXYClJ?$3Cj-&@3<6`,?0GbS$Ml02ƦB0hZ)hJĆ66]kͬ#0v/"0WgjS"Β|wD#H A0ca qsɁ3$H# 0kͯCdL#&) 5#,&Y/Vf ]P"A38VM;ς6plU=@`"X3h3WZ1"I1&@2#iTeF!$C~h!bƚDٽ !m5CAȌD$Dc&( VI0Hwxϙ{'@Ћ4 ?+^^*6QE)"Dz!5@z6~~P*t>O؝9{/-˜@ @"t*Qt`V6V`Al0R!4EE ClVQ .g)/NS} ! -8 ~Y hbyN L=HCDXX2a*ࡎ0Maf!(dczH` LA4BZ,_رlFA;t3VۥKP臗c^ $$DXi7SЬDI 1##NE@&<<1(AD#L"q#?D3>?pxKă9!0"cOhI< i'SG~e)P^D~ ~`'&D E"8EC_$Gq@$D ciѥr34,bx,X/c>B ,ϋy(GF"VE H<Ƅ'hr X1ae9 GY }<-pr^S =#яDgϋeY18įb9 YQσQr' cKn"r>G^Eq~z {YbDQd8F`QBGH$0bYXf̫ MGY$E/Nsbݘey H},ei# *F$X`xB$AH("c' DF@Xυ|8AD<"/^H`GYH>Q^u B^'aNA؍nA|oB"`N/ī\"cNDaXIby<?aED|Dy^ 漄YfDX(PJ,O p!ZNт(b/J>?=f$Q-T"X'%''ZVqKX${X"Ќ}b8Ə<^g %b$ q_| Fn2nVE1'`'@hޅ~Y(N9I$Ja<ϳY!p Gy9= sS%Rc$^%ͲKDI>HI![gų|F]*㏌sRd!6Rn=GzMR)EHn3M.X w5Yܹz.`!5^XZۊbR[`,Q%j5ԤqJ[lf;qF&$Z[ĺ<:Ǫ2M>ܜTq˙0U-ձ >d[(hMN'bRS>ͨAY$^f8jZ5*"1gg'w쵗aVxLȭ68s׶ Mst\Vu)>oۘT|z:\A. :|>773ޒZ.ίQ*ְW5BӼXZ9MVg]eY)Gxra q/Mqײ Dt'B$9yT5lbLi$gp fsLL8c$މ&\6ީrkqkTu«]Si='KL gݕtt/3*Kў&uv;z$6QpPiOz:맵a:o`.XcδfoRe;ՓpFu 3:Zu0hi@bT! LUAB/=\:sCbK*KRgrK F3W+[{;#TMs}٭d9n`c6{TI-BfC-$dz$MKR%;amWD9_699͏wiu4KNKCI8Ѯ-R-uNiXP܊$0*u#ɎsاkU[-+9tj7_*- H@*uOp\ViN(ϊZ@V]Ilk*QZAX*NKRmuHu-% Yqǻ 6QnX דkX:}r6Mjh=/Myu WemH${%S­IכZ뚸HӅcbӢN8hnޙ?OUW/D3\)V69Ul~hj`yb`e2OVb'LI>j+vKQa-B7ԺSZ 10nSVXHkpM~`{ǧ4Hz#Z7TѤBێz&RYO\gSY4D*RIRSBC@-FRc1,O S2Q#4DDj*OFUMx_j k)3g%*jU:JrYq优&b^c Ofs3)F.f^3ő}&q'&saITH7U &$FyETIQ֧kT(N-rMj69a~0LmmmRR,풒JE+@_nSe?22f͢ EP ܄AK%tQ8J!R/UBW,D) IQb@m` JDH1"( _(Q C( (0x|:S5AH" QH"0}1C`%$Q H  C<T6$! !.)DH"pT(jQB4DDu`mݨ`4yӃ!"HD0)yT!͢δRxH/L/&X"I -Fx(I*Z;|8 ^w.ht$􄐈p(VzPtVIIx1}+.*[Uo,Z+R0// BxCh@Ƈ좀#ҹ5r &p#oDN>" ɻ/&*k`Y%6(HC%* C.ʓH1EePYpB@!DQp  Ht1BH > "( Q:Њ0""x"` in1 :B8JTȔ\OIGIHM$*tY1Dݡ"|.SQU1L(P`r S(TZt)8apQF(bB&Жc/6f*ػD"CǃQE  VԸلW $t?a"S@0Xix.. |)ٗIDATd9@wt8cHtsP$ GT.]!5$K" 3>ƔA9p`ARPe4$Z`R)@_");L<-l aQ%/"Lo4,gՠ)$("#B H ^/ H`Г &1xA"H?B..xTO0V M΁fMIBt;!*8 P,Q5r1%, Ep**, )OWH"C 0_ѵB$BaL(y ט:0%aA!`EEhBƠ?J0D"pKVh "t)azŘ@Tp1iυS }*Ncƈ!Bh8sCf) &T@wTR R` =T0 $LPA) ĉX4ưQA:8>(}& &]"T$aa)@Q!9H!8$QpfT*P ( sMhF?_ b& #:V;H&t`Sr-@ø"pƔHQ7`Y*k z | eh$Ic8(H4 6Bx&U̠ʠ,XHSK0ځ-xj aBKR@[с \9 Q@ iBX9Tb. _TR!L#49$! . `UH Lh:X&N  b`LF4š((9&ŹF $a8-g8M#,(F 69x$X!&DDPOp cT)$ iQxuJAu,^B(䯃SYp%0p$X7:BapxWJe:DDv`OJL M!)=p X#8 8](N 7` & UယףGAUnI`(`HΫ,D#!4>:ͅF &ш L[3$jE3UPL@ 0H` JXi0-OF臈*0QS&0tPr&>I i8&``D$Mgeb@إT B`pCJˮ2 +UWW_Ut]AAAAAAAAA@1n]AAAAAAAAA@1n]AAAAAAAAA@1n]AAAAAAAAA@1n]AAAAAAAAA@1*B!JgMAAAAAAAAAA!EQ`B(6]AAAAAAAAAGx'H$IX$pWPPPPPPPPP(p~(Iq 2qB61 $όb+(((((((((HdZ!c( ,+IMӄpWPPPPPPPPP{={jϗ p"#I`(--֭[]+(((((((((#<زex'oK wY6N?AXx<4M^_lcC{B*y1&EÝhAtN?(~`^0ǁ B744FOFAAAAAAAAAcLQ(^BeʨTqU?BZCoUSPPPPPPPPPPø)+(((}77@qQPPP ;GX0ƒ$QSpc $I8(P'IT* FQe]AAATenh.ߍ㮠R1@$e]AAAFGqyTPPPNUPPP 7ᮠpp(di?;!rO6U* aHrl7Dj~A3rؐЯK=B4M_jB|>_|'XREDDtre⩽m6bx<7\c#""Vlcvzj:**隚e˭0F122Z.T(PTPPPPPʁ.(WեiSUUUz>**P}Zh@BHYY(VZBB?( >OtYYqffvviZAEJp8XMNNVҭBVby$)66`0@;ݥJ}Ah9UW8(RhiOKw 4 W2;` !|>K$(!9  ڔpl؁#U%V' lĆe#($ QQQFRa$@\@nwzzVUհz31iZ$9!yT*GQV],~Z]]]`6 ~2rQ@ٲ,k2tF6pȭZ6[J<ij$R, T%\$Fܹ Ie%FcUUU/(X*j\.AjhD,BscLQBQ E .n{[77X߶m[xxxTT^7Ͱ[f0 b  ٬?䓤Ta(t qܢE6mL&lVT3gӧN8`0 zd@ fbp8FNy^V|xĈpܹnݺ奤TTT9s`04mtǎCi~xEQܼyJMMر\dd[Bo-++kӦӧ7nح[&M8NQ].N۷o޽{oVFccbb6oܻwUVyaÆ/7WPPPPP+rWZBHf͎=ZXXغu+Wn۶j~G $%%UVVΟ?zҤIZ[|y-0 ,{w/,,~7:wC/^899>sf|ZvڵUUUSNeY6//ofyܹ%%%Ș5kTT(w>|x޽Nh4 ?~JJJT*  fɒ%7oy?4[lټyʕ+=JiӒSSSAhҤʕ+ݻgϞ'N,[aժU-m޼9B Ӳ?7CkIII"o`0^ȑ#V~-Zؿ ?{\̘1CB٦Q !Z… =BhԩO?hTT7n۷ȑ#kkkiv\}YLLd={v]]_|Ѵie˖cǎ+V޽y*X WNQ嗟?0??vkڔ"BHQQ(}m۶{q뭷feeQ5bĈÇWUU}9rwy'8WB=Aj#G={^?vXEEEQIIIE 6l̙#F޽ZKһE:uj۶mAAACCVX,}u:sӧju++1-//EQ5jzb6m޽M7O<)I"k׮]nݒ󓒒޽{WVVcXBBB~N1bDFFF~~^E`0;v,33;@t:ZgϞQF͟?}ВwUSSAAAAAAA wptٷoN6 p/E{۶m~CUc\RR2gV:t[o|7-[<~ԩS Cfffuuu\\ZvÇjq\ny0 !a< T*թSj5^W>ǻ,{=r-^W0xwpºɓ'\2;;rA~ڼyh4 ~eAx}֬Y_54 2  wOHH6lXRR|={FDD,ݴiS4}!C,+*nWl;v͚5q\\\DDnOMMh4]v!<<!T__oJJJڶm {*j͚5kӦͱcN>ݷo_^_\\u .lꤤQΟ?rOE1))r?O$҅J*..zF:tgϞ6~֭ɓ'@lE۷oh4X,pvGEEp8hkҤIu ~I4MYYY]]]VVfU dXXqzȲ,M~Z,..իWaa1SN{INNv:ǎׯSu9A222`i]QQѤIp9ΥjO:uѤ]VUU]pcǎ| 'U*եuxHNw锔XUUUedd444ڵKݻLL8JJJr:999 JLLl޼yAAAfff]]qpa&M޽]vgΜILLpB͋=ڽ{ϗ߹s碢w!TMRAAAAAAq'z0n(FQ2 xA݂eYI Nnz]‡p[|aWDQq @V= eY8w\TTjd@'nnQ^TTz4i;4(pt:r峆,˂3 @$(>.T䕏lֶhj?iaaFcJJJ7x%aIP)pl* Mbaa!󙙙B"(ok%oB/|>Jh4rCs:]v@AVz3!d2t:Cl)h rss_xЇ;Z( |L&|˲лZ`x<iZX5Ph )# eex#άy:{_šd'oY4ACjnf\D`{} -IF#V Z˅,grriCQlˠ ăڠVUT]F,ʈ*C6,, Jl_hp=%;(]|PMw9*tL_9ShOhH!rmtho' Y­k9rȅ#w]AAAAA/ >zuސ]eõZ-4D(*,,d2[_ ,rN'AWjtkkk֯ыk}y٢F5B-N/#APvZ7:^ q~mI0uiR0̪ߛpQvC} nDn7-tM?qȩvnEz{r)(((((wT>UՊAKhClŪ*嵻̥iQl˺r**22Af:z+].EQ j.gNʯ !b\=B6444@B{$iáh@/1ECFApQvJVlۓCc+**V+LͪFZV^cdϒS $8ko%EjSpש ^4.ڡF/ yE ̺Rr#=]L W)]([Al6Tbh5A{+4W`-3 cX䘛ñ^|p':5 \tpמ! iZE0 EQǁJ,Ԏ?|֭!~M#YC]m$^mF}s!+Kؒbqy_ZB)m8P'A(Dbrwu1o;r QX#UD2O#At:l InSt90*N;vn ZKAAAAAƘyj$IZvm۶m^ouUIz; jL?|PNZj5aܵkז-[ݻ:} yEQtf:pݻwLL M`Xȏ _X!@(om۶v۲e˞~iX)I8}~uEQ ,صk3Æ 2d~zO> FB*]EFW_9r$,,gݱcG۷{ԇ~]U$I՞?~͚5>,jV/Eڵpvm,t:`C$""fF8V+FVz7m۶l+{#5?BhС;3f}jbN߁}ٳg/]iӦ/bjjjl(8q"'''>>Cr_y{?|kjjΜ91a„zr!\.ɓ'7~o׮ݴi&LPTTTPPP\\_~~W_}jtn:e|AAϟOIIIaYZrɓ'5M;uW 5cǎƍ7nEQӧOիW߾}g͚U^^~뭷 ^s΢za?~,6ЩS^xٳg4T\\_ <ʛyvB4M~~Bذadj֬ق AxGϞ=uVZݱcA8puuu h4˖-{e/IjuYYYLLg}ڸq(roSNiou:$IbŊ 6YYY (zܹsVu۶m۷oio?vءC|-[]I&>_}[lپ}{ס5ӧO؆7%tT*ձcАiۏ=[o5o<))… x_ްQjM&Jr8G=s̗_~y=|kٰ֬aöm:w\ZZ'^wȐ!׿ ԱcǾ}1=zlݺu޼y :sɓɓ'Xb111 8qbao-zQĴZ-STڵZ999?2 jz:{ݼy3B;XlB6tiCFӱ,KW%W^paǎ1}=ztVV('ONKKEG8qJڳgϛoΝ{nV[__hN'DQ8N}|w=P޽-ĉ?䓩SZvnlb0zV7áxcwJUQQw^BHUUU֭-;b=>>$99tfdd߿?MpIMMl~hg鑑PNbvtpq,2 =;`^ddd4449N|aQF;6&&&555%%%&&&..pdeeN{/;& vu:MӐ 81)j}m{jyyyk׮۷ԩӦML^ wŊ;v۷bz? M&dL`8p@8I& PU.[lF1))h4ZT+x<E`0#&IV7k,''gݺu=ܦMRRR JL>W_m۶>G$7o^__R'&E=3=zxW~mܯ_|fXP2hݺyfs˖-WF[Nhj56 PV-[|饗B=ۃµ2EQ pX,Tw(*22 2lvP|aaa:pƂ 5`C?j~Zt:1ffvaQ+X^^bbbt: uuu,&&&jkۓ(lp|VqZhѧO+!/rZp\QQQ4M< !&l6)턐HY!{(RMbBe EtBBBUUN3Lq\RRREE劎j[pA?f c0`'РV C]]QTjސ@---tQQQ jJNWQQa0@b_E n[VtW78RΟ?䔂X<ϗbUUUUrr2XA wFj3?-&8 nt:p,ڈmb @-@Z Yjtcd_^Nlڴ)%%%++K_^R\.Il6(BR  "RT?nGEEY-gXY/긇!j̥ r5,ixuֳg>裲w(M䢆Y'ke[SScZe5XAdOV UJ*(((((\iIIIlll焐ꔔ555]peFߙ(pkI?LHYø,˂ry߸Mr5z9j4vPzZUAAAAADNHHVfFFƯp `ikJ4MþVj`n;574bԟ"_~1k$Ih􈚚N!u[Ateeexx8wno/7vϥ_ÿNvA*4q7 ap)4y_|Uߣ$4{^ٳ7V~=}>4?@ٺ\. ?  _}צȵ㲶ץ6$~WF7M\iQp85J~qry@dsεkNTd?;kx|KUߨ~-Cz$Bk!Y'˖s=Wl3hUZ|iiirgD!].\PTqqqp_uLP:wHvխ[lw mWו.l#ҷWjQO0רFh,w`04k֬jĉk֬$)33sׯ/..n߾֭[_{/bӦM7n3gιs:t Øfg-Y$***11Q]s^lٲ3gݻcǎ>_߻wo~E9֭[o޼wll,8GMKK {Wjkk[j5so̙3:u>}믿ޱcho֮][XXءCݻwO0۷t=#񉉉_}Ն ڶm_.]-[t~!d0 uP64`8N2s5PZSS'ZJf͚\r̙ر-[Ox .teܸqK,t ,;wcڷoV~?XC~{jajVZ24Яbaԩ]tiTk5Rr\&GyDeff~穩u8жm[^1 %K\֭[>|xܸq{޽⋟~)%%d)8`0k@͘1ѣ;w޺u ӱc˗WUUjJ?~<f̘w-Z@ȑ#&MZjՖ-[ ٙ2eJDDDee姟~k׮m۞={6''[o]~_~жm[41v}„ W8Yfv1cɓ'[lhᵬW^9uTϞ=a]={?ѣ:uwr!O>o$y=G}?oߞiӦtMvPPPPP@BjkkMl6$VTTx.]>綾^7nܝw g]۾}mĉvډ8bAV\=f̘!Cdgg 1w\O?GqIcGӴNS<Ν;ϝ;׫W;v :T;O>޽{۶m (j۶-8''g޽:u ?O<ѣGJeX|R:tА!C(;wn=&M4qIJ;w#''gǎڵkڴ)H Ξ={ԨQ}]vp0 p˗oٲp̛7񤥥8pM6ӦM۸q͛Νi&F}˗C_]e˖]VR&#6pEu};vaþݻo4hо}:utA7vطzgϞf͚\[[k0HԬY5k,_\> ???66Vެecr,$Ig>q.\7u~pmt222>`Ǐ;hР޽{{={իW\\\{Kp!C[ o7ĉ۷m۶;vL>?l^9tП>$iӦ(vKN߿?Bh4:uSNɑ6m*,,8}4D6F9{l߾}U*հan1cNnݺC>h+p[ٜaÆ.] v_*--ٳ'B|.\صkWII EQZ?a:t;>Xvmff&mvĉsΕz1}VZ}ggΜihhxW6oތӧѣwܹvڛoyڴi C niggggggϛ7#W_}ܹs z}jjƍm2(lѢEiilt{(j=z̟?oihh(**RTSL9sf;w\TTTNv{ff櫯dɒ}Kݭ[W_}ɓ=zl ]x1j۶m? ƌ2Gݲe-ҪUoYRS!ҥٳg}فVUU?/ٳQY[HFcLLL֭CUYYY֭U*UTTTqq|o֬YVn7B(::ROUPPPPtdKknٻv푑].׾}PE.¸qz٣GI Pc4 ygYZeVWW>lfB4MN :{*pÆ w^xu$Iz| .~ojeYVEa{UV!t:ݫ0ݻǎjkjjZl?FxС#G@7x#++ѣPE;Cj=鬨NcǎիFCQSrG3ܹS/11q޽ᄏo߾˖-SKo޼K,ٰaCiiO?4cƌݻ]vŊGQT!1NNN CEFF:իWÆ [lh!>>!T^^{`1#-[֪Uov'##X,q'qcWp#I! :wB>>>BfƸ\k!U槠p%.^PP0}'OiӦu[lk޼y˖-?իWtG}s΅ 6̞=;<}:77wĈ5556 aN:sϥ۷vÆ 555Ç瞨7VTT >k׮Νۺu!-/]Tbu뒒Ν[0Ơ51^t{_r|}B:wdaaaCCCRRF;wիWaaannСCGyy98zh>}~W} !yyyÆ S?}ݗ?|p80d***zꩄǏwfM2__pEVk]]]- xӧ?޶m7ܽ{w=|?p'N<7o>tP}ћn ◍9nOwygee%5Э[%Kdgg7k,11qN*((曍F5k.ׯӧ>iӦ!Ųk׮ݻw'%%}ݵh4>[oeXnm6Bqqqg>|O? azЅߞkqLUUUn}px1Nv.7t:V`ַl ׇs8 b EQv]Rl6aqbZ,].!$::lb}}=B(""BE^/0rPt:b!\.x!@Ӵkhhj1V1 (FDD׵lxe.aZ%[رc˗/8q"?7^722B£9w !,99y\.EQP555 (I_Zᝉ(vl6 мf6$"j4ezRuu^X,ĨT/`0<~f4]^^III,6444Axy.IRMMhZWYR]-++h4r@YB -|.(Z``Y8i6¬رcuuNZ mkZg-t:p\>ݮjnFh{<ϫT*H'jBPzͦVۦMFQs$Ihyyy;v)*ik(-<^CܙyxOOu֊?N8"ʆuB\˝2p! 9*)_zuII7of wBHxx^SSa>)//_vc=K ̙36m8ÇҐxpbbbw?A ýnƼ!Wa~?,,,4UL(s\4M_ _"ɾzF%RW* p:"4 2٬h^w4^Iq8ށ\K3~y^t:j5jl6;BN3 <8yʽ\qHPqlRR]zpǗ_KS\hpZPFDY[[(}#]g*j<' xLZ \;x4}+)$I˦\5AOO]~c>j NlE,k2B(I|h4Ā6M7JS0ɤh6z&XZ%4~.f;ògKW\ev*%Ei4Z}}GsZFvWFRW ZV%{Awʻ\:NiEwVV UFAAAAAZkڄ$I<_2YQi(_.*iWr.P~OA%N5*Тo%I7CDQ\.B ?"{l^iTnrQhzܡZcṡ-xb -_+V8Nt[w9{Rȅ  mt. ~ըTšO(A_]zEEEp6=˩z/Z`rYP' KG֨LB96Ǐ, >{lmm|H r,ǎ[]?fGni<}!v?Bz(B|ʕ-{i/nN^/DtmsBkMsmC+Wn藆F-ҧC_k./ygyF7o޼lĉk׮ey3fظq#!lݺ^عs_|qƴ4aÆytMzy/wǏ_dfKNNl,,Y2s:^{-77nN1c۵ZmRRٳG`} ;˲w_BBBrr)S~suٳSNݵkWzzj`0.CTTT$''KjV~a-_aҤI]t~iZƏj*e,Y2{={tafKKKǎl24i2gΜ >|}~i4 p1KU~Pr?<;;;" HH &:1EQزeK6mrٲa4jOo,_>IIIywv "6E͛7vs>䓟~)??si ԸhѢcǎ}w/sss۴i3eʔ:,X ""bϞ=~޽{WXaZ###Ν{+V̘1cݺuEEE|I^^^CCdꫯ7&MΩS{VTTL_|q'N֭O?wm۶L7ڵ}?|III.]fϞ=k֬)SlذaPǎ=z}!<4g7tx˖-'O=y$4Ky#DQ?~|.]L&Bhܹ(6iZ8ifϞZj% `Sڶm+)S~Gh͚5UUUڵ;v,ĻW\9EQy5瓓J#gҳ?xϞ=ڵ"r7nٲe0}73gάСΝ;?w֭aر?CbbbLLW_}5g( 6L8z*));vO?ԴiӰO?4''LEVHA! 0ѩS!ve6_~ѣG>|С1cm֯_\2q/:uG}t3f@3B ,g_|ݻ!\йs{?\hO?#̜9!jzzh ˃E-^*^oyy> k~駟]v_#GΛ7oҥݺu<8u!C̙3gK,1cop†8;t={̞={ԨQ_~eRRM7ٳm8pK.7tSQQQϞ='Or|> /pB;p3g/33wyu*++{էO`x0O>!C~駉'~W6l[omvVw޹{۶m_ׯߕ[C޲^7""W^SNmӦݻU*#<q: ,hhh1bN9sftttJJJǎ{0jԨvҥw~ll#RSS):ڵk_~%Ktd2m۶̘1#99933sѢE~8|^W<(+ Żtݻw7o'|뭷Axꩧ\.ב#G4 󑑑;w3fLRRREEűc&|'nz?X~ PDD_|O?uh4[0b >РAo… z}iiI5Miiy|>ߋ/(.P={g}jժro4#F뮻BӧO޽;Bĉ7t{W^rg}v7<ϫjo@d***y#FTq~wyu=裫W~'v{~~~]]=}8q_|a.\8m4˿2++?D}gV=O^^u:端2eJBBByyܧ̙sm 2d֬Y~;h޼ &)''ɓ9vСC###Ϟ=|>_۶m+++ f̘nzƍsς ~ᢢ!C )S{YYYaȑ? r>C_z%v9+((PT|SO=5lذk;v,==xEQ|ZhQ\\7pg2?p8>{UV;v۷oNNNzzƌRUTT}G}o޼=wQ[[{sjڨ(.\644| u];veJׯߴi{͛7/]4-- E***gywM&Ӟ={cǎ}ݸqrrrVZU]]ݡCo{=u̙3z6m,Z믿Oׯ_aÆaϟߵkW_>CzB(W ~$O;w>qs=׫W/Z.--֭+9B(11cǎo~z[o]]]v"##A]{"bccz>!!~LHH?FDDu] ~wرE1--ȑ#$uqy۷/B`0l'O.((P?˲P.\0`((E#Gu֯_ 6;677ԩSuuuNQQQ]]VZo~Μ9w>ڵk=ڻwO?NV;d2EGG^Gzu>lIII=B555)**ڼyizi߾= 7WzJ?gӦM={I7??[nlrkjjZn=iҤgW^yBo;wܰa7C 9dYɓ-Z;{=aPjj[o5| ̙3: aFh47nKJJ~KKK?^wpK٢($EQa1N,'NLLh4?ȑ#QHKKK~BF:s̱cF  cYvڴi=Xtt1V}>߫ZWWw-^$Iz~}Qmmd'FCAXb^x7|sʕo}rZRfΝ;~lȑ#׿"""9aȑ...EC{ڶmi&Vz7~mpYL;w'O g͚55jƍa>!!aҥ&L#N>0=sjӧl^bŋ^yÇfիW=Z}>CCD8ׯ_Ç'$$ >3h49rdԩ0zuֵk׮gϞ^cǎ!7ߌ7nժUM *k?=zoڴ駟~1PN3""f+r BhŊ<~ŋQ <466{###Au>rݲ|G߿ɒ%.뮻yDnM6Ff^x<!dX ]JJ Bܹs%%%EEE%%%PJ >}<3^gϞ>ѣGyONN~뭷SVV!_]]͛wرlٲ۷/_y߳gϹsf̘!Iի$Ilk׮lX\\@paXkZGE1n1#+++666..B|p W___VV՝hH^7++!TRRҢE bccVkYY,AO:jٲ%,i*++STϟGUWWBi*DZc֬Yz{}}M6m̘1}(jGw{ݼy3ƸO>ׯi~ԨQyyy]vavF8q/|l `OΟ?hѢ!CtiĉGgegg>gFӮ]>aɓ'ltN4r'66ve֬Y?ѣGiX,-zwu0a=;v޽;==}ȑA/Yf<Ͽ{0j3fFy'QXj(iWx{ꫯ*++Z-hL&0%m6[JJ666**JV#G{wibbb]iӦYo۶oӦ/}lrڵk=\[[kZ&T/++ 듒X*UV/Zy_VZo 0Lbb"T#FL6mڴi(իpvjˆҥKV`!ow3',,l֭2eJ-nziN7p6mz'*++Lv횒V}kJ>;;;::zovFIHH3{F3g}3u)))f?&Lرc? 5k_{^Ҳe/bȑZjB+Zs͟?ѣݺu{.o0|1chwyg?8q|͓O>۷oĈٹG֭[}}j2~m1iҤ޽;%Cǎrhd󅅅a^/(  1 dS\ws8ɲ,veErTAXx<xtt:F#!;**Tܐv1f|>˲r:!8ZQr`vϕ#^t8??rժU&L7_~?D~ h4B~{# %''( Р`44^ lhY,H0 󼼀kiA~F8TVuu^X,ĉ###~aeN'3^br=HۄmII ˲ux uzZ`mFVƍ%e[VV VX,,˾` mҍc,G N}8Nph4Ж!555(qGgYAMZ UTT@ ;\W_u'89>(N. ka[,:Jhω&)k`F|(w`${N'jkk!1)))`vN|HӴ vjh. !maa*=/V+$s, _a'\.FTall$L74M9Qc0 f -Rg6w\FmylOCAٖa8NՆbkx"Bv*2ArB.8 8'rDqQP#؉'ȩ~O@~pl'2/TpJ׮][ZZ:x`YOLsYYYRR;~L=kjjz= Iyyƍ~a={v˖-`~vmkC"\pؼysPøQ.۲%$I۷oӧu8hfСC浗 k׮M6ٍ~^]]m49?[uu?V%I4hPBBj pRx[(mwƍMAAAARA((( jݞ*+NQ˲:|i h46ՕN휡k~4[N šx[,Fx~l]z˦Bq:`^B3~t!d2.+ns t6O+f$r5J(V(,ɛPMW? fFd&}]a~rW$FlN]h5F F1Զ/G|x8 m >>JZ-l^uvdJ5{ٛ\^FMZsF%piA4^)2'^yː?=nmЯB wUC$qqԠ(aywq+M`j/_hE\~{!eYy6ڬNX,bfAЋ7͗ymyYwRك~v90jmZ bȁ0Ʋ7ȵDzRp0]k-Ku dR6*SWWwuc6xguL$I èjJu2FR]VWFN$Iמ?=Ͳo;:h4k.? ([h 7w߀k1}h B' ,4F7iW. {u(mp [ rF~0y(!~QhRI06Btݻ'!=hTPq<2+Q28җ1q.-Cl:{3gPHǁ?v{AA 2>b)oF/x<,߿t-Z(--6nv[h1cƌ͛7;vK.[n}Û4i}v3~~̙3;waf7nM&SZZUB: BH/Zh;vh߾=˲:gv/XlYEEE~^x!:::==L;ve˖_uNNΑ#G:w *'OS2{ȑ#ٛ7ovZ奠"BP@-¨q\\\\BBt]t駟X}'Mtw&&&Eׯm۶EkNVu] Ym۶Wܝ:ulǁl7|cX^~cǎ1*gfZ={+))iΝC%j;4iRvvvvJJJ(u ,8sL#"".\SV{K.5x ۷oߩS ϲŋ{_L:r˖-{۴iӴiӸ8۽p#F㦛nڴiӈ#Swg^t͛rrrv{zz]ڷo?a„͛7^UVӦM۲e`ؾ}+x7 cƌ'$$,Zhƍ0D\.ggg?>|3>C9aÆ 8}ovϞ=srr&MvZ r~pSݻW,3. Ǐ駟l6ݻgΜ)IRqq &MԱcG9ԩS333!"zaa󡵄re-ڿ||ܹsmֶm۵k.ZiӦ~^SSiӦÇtSPPPPW7ܯh7ˇ:tPPPCxJUSSӣG88o>lذXZC%''+Ϛ [9tm/\PQQ@!bbb-[m~!**ox<{y㒒ߏΆAt!^NLLLNN^tc9jnPuuug~)***-- 8qo߾qf?}tEEΝ;=;SQQp￿k׮-[l׮w}g03zk?~W^&Mx< 2L˖-۷/D~gu,++իWbbٳgDz26m裏~X/[fzn&؃^Vԉ'~Ųe˖ɓ'zeeev!t9= L555ڵ{۵k~P>|8**aIII}z˖-ξuvȑ ~'-ܹw߽|klq@<&&_G}oؽ{~:==E:uJJJᄏ{wqvNNb0a{~YfUTT4igYbEf͆:tɓ';VZ;]v555O=<ЪU{۶gVۯ_ԼGVVV8cUUUmmmG7߼{?$Iz?uTIIk`~C,YҡCym߾l6=l_2{ 8wׯ8ᆱYj:u ]KHgaqq1[eŋ9s7^#vޝ~zG/444>|x…cƌ1 x:t#X!1~ƌt:۶mm۶,Z,l׮]{m5J?lB[,T rVy|` GDDDbbbAAw}g4n烌`xabgΜq /PWWu ifٲe+Wv!Խ{{,==tĬ[.)X,r\Fdt8(7&! 僪ysRAD4hnƍ2dH'O\PP b b,D^Y_<ӧϗ_~1?>Tyy3Z-.&%%l6w#8Y% b-zxINN6 p:~"111< BmrB*W_ڵK/fLһwoB0 wHLLDf׋k*ϙ3ԩS͛7޽͛7oܵk-ZL4iŊ111>={rrrN>ݵk-[,YDvmGccc 83M4Y~5k̫=>޻pBee^9V#""x㍈GvСC?w\ff<Я_?ѳgȏ>hʕzٳs=G9{lf8P^^r>/..n„ +W ssslsРApw}wݺu)))#F9x DF1 qǏoڴ)!nw)??Yf{޽{<2eD"|2׌]h"ccc.{^{-00ƍ*jѢEp&%%[YY1;wLJ۷φAH${yysKKE"ܹSUUP(OXlJJʓ'O,--cbbN>d2U*=nooW( Q(4lLLŋI$\.700ؿ?O=z@R#""qF5pt\.ߵkݻw {gmllA/ĉO< 077OOOooo`0G)**ZbږϚ5+==wɒ%UUU\ĉӦMr l rjٳgwvv*9s~O6|Etttڂ(D1iPH @S.ɈD"h  Rł8&uBX, A5XA'H0dD"PHL]m="d>O$aHrj82[055%Hd2l D"Xh)svS(2 &tH$ T)T*xhT*BP(B!FC5ڵ(fD"BF~@蠃:>=r*~؋Dw L7'& ÁPOO^cwD?Ah%rtE BPho먧7RPd>W`>BD㼀O5ڟv}hN^=fBΰM DA0 tqqt6 v }}}4=:!%ՠ>}]*㵧0:A'/Eg4Ţΐ9OBG ybT蠃:KX^XArbJ9$H @ bRc~fAepKXa 9^PrPV#]E AGGHvv<]]]zh_ A\b "H(j **()_RAT?RSU @#q>#Q=gftA;}d0܁0d2'+bb2̱6Bgp5:R(3 Qb_;MJR/x<^RH$}}Q*(o2[a円(inGQDtAtw7%` B_* h 7 `K}W.'J A@IuG@ bhm :蠃:߆#24]ڊo2 .Oe`/mvRJ_bB@#thˣRp8}j \:|(Ja bPd{T*|\>RA'.D-b hOh'*à^@ 9 VRڵk!!!S]Rڵ+44շStA43 rJ$ Ќ Bz={̟?Ɔ%%%M<׷H * PVVgϞm۶y{{3L\. ;d2ˍ7}W,g8D"1W_}5::!77w & `޼yq0F9{l{{K/^ Amll^}դ$VLMM Lbmm- \{CO0Ӎ>>>ϏDEEٳG wP` …Sd77UV577!XWW1p8UbR;y_=c h~OD$b555oq)GG_ҥKjlw7deeM: fܸqSN2eJHHHtt{ƍcٰpnmme0>?~LL̞={/_|g}뛚Lv:蠃:#pG O&H˖-2AOs |>trrB 5CCǏ柩 H]]ݯfq ;sLKK˷~ /iP`D,??ܹs)))r|+Wx.]Zv-HaA>x⤤$AT*ջb ;"ǧHR*466644 rMXWhN[[[STAL&H" Ҳ@`S/d_@>/33ܹs>>>$%%3!44g...|>ܹsfff)))  9RCfE ծC$RL&p8nz)]]] NXc@,R~3f555d2_Va.@QD"‚H$o 8nhh~m۶h4CCCWH$v9a!\KKKg}`0L&t`M7ߜ={ŋSLٶmw}w+++CCCC1J%022uAtcxGN:U__2a„{ݹsg„ ە+Wlmm.]zK.ׇ^~X,oo˗/šB2Nݼy7ptt ǝBl޼JZXXlܸǠ/?^p_2eH$?~͛^_bjww.Pcǎ[kRRonkkoFEEM6M$M0v7npss3gNoooUUoՁгT*AT]]b^}ղL>bZ&fΜuΝW_}u``FyyyqM6O:UT?^,/]0%%eѢE\.7)){ҥ~~~W\bv@a0W\y䉭azzŋ<? p?~}Xܜ7nĈ8B駟Ϛ5ԴW^IMMf:z(PeBBBz{{Xzw蠃: c` &<(TDA~T*ݫT*a'A\bA@IB!a)y<jv/Z__g0@Xu;JGDR*EwDB4(  k ƙRTT Ka#eMFA?p8Z*ЧΝ;;v HhxRlGA+;::lmm!sԫ`RzZ=ES* $HpvPj_ DbQ(m{pp8<*(zzz Bxxxp4пF"$RJ%dnb+5ڶ&8% `BvWJrhB ъӄx RnFNAtAt`]TWW!FaXvvv`ᇽ b5_p8vyjAW؝a`8,!V5$Vn:4кpAv>'},oAv1 ڌhþ FB"/>lm===O<`0L&CG*AW0hZX?"h/#v+@{CSyP>;m P{;6tAtߏqgXl6/r\*3/I>88HPxտX,Uh4(%'|>_&h4*pWR/|>_OO<3(J>ж\.Jj{uAtA [ZZ542ퟴi#}־ "cjd6CM؎744cpt CGJ6z1/PL&s خRT*N_pZLMMc_}ea ,,}}a(T&&&hJ5@*?b+/ ]\nll㯋P)8[bz7Ph퐱=9UAt w3 ?2~7ܰ[p8`v_a\9W L߱X\O2|%m^===mж8@ h_N/^7cJADAtA @ˣ`xZJ2gHpp8bmClr\$|>Z6]B2ER*<O[PV hhuHB'Jfp8999VAEE?=(ˆD"8u6P m A)lvQQы-[ twwm0pZXX8000l@--- {:y<^AA7=hFeee]]2՞ɴ{G*O AD"|&r0~@ TA|>R*bĉ%bx```9@Z@+n mttvv#; #Jx< A/T [|aKKˑ#Gx<&JA N9s|h uAtc㥥?{キdɒGo}Y[^z֬Y?}P( 5k֮]WZhݹs@ ={̙3Qϗ"W_Q(8й{#GX,ggO?4##cǎ34 ]p͛}||VZ>C566pH I$ӧ?O|7oLKKP(~@ ;wڵk'Nx)>O"3gTVVb˗C,H$2PTJd2h TJe2[ lΝ Çp^UUg]V,GEEk011y <:)))aaa/Dж !&NhaafփmT*jdd /^H ϟ9d27111<<#1I j5H0:0^y #HD"Q(O?A;QuÇ{zz~G'Oh4~iKK˭[uzk߾}X,O>a`]x1??J_>''ҥK111X,677wΝ===ov@@g(iX,)OB#@k@Tw ym$T*F+--/Pm+* СC===ŋc.{eedd믿n޼fXٳ e {f7nܽ{@ | ,H$8p妥_:蠃m qVVVr\ fee)ʕ+W>޾=///444((h{;wɓ'YfL8_~ٴiSHHȍ76lPTT\]])++ ܴiӉ'=za.]{{{e2đ(--500],X]vΝR###tʕǏWVV>|X XXX@40'O!RUUebbiӦgeeyxx@7*z- v1kkk2|xvܹ??ٳ'66˗/JuuusΝ2eJGG/*//߳gώ;BBB>`&N zccc 6ٳ妦.Y$&&bp8X Vt῁踏,$ۻ?2_5ϜeTTTkk ===ֆ@ pss zzz͛ JӧOZ[[Cy=`aa t/_ߋb<?~xAF133 CEFF{yy8qD$ݿB̘1へ?i$"7?33A~I*r\{zxx@*0v?p0 ^^8LP(gΜyWH$ի.ͭ&!!twwwww;99={6++ yz6A3g|sAC"/N9r2eŋtpfϞ|l0###Ϝ9b{###pBK655ꐐooﺺ|Rym<R:;;CBB/_nmm}ڵ;w.[ N ѣGr`J%ڰaL&裏ܹΝ;tw}9,, '$$̟??""bzzz{QDϞ=M <==Gutt\vG&}GAAAPBE`0NNNO舎1c˗ߏ ą HPPT*N П@.O2WT߶mO?5kܾ}X:.\9s槟~)XG}gkk{Y77ٳgO>}mD"qԩ `9sϏ`xzznڴ V⢢ɓ'K䞞V[[bA:WW3gTTT@}%I~~~\\4 JAt#D$11100ә]]]zzzoFss3P$R)e .zeSS RA 5cc㊊BngBꫯKୃ9ٹfF.C}mT:ue˖q8H}ʕ~ /zzzΝ;իP%KtttY]*?|0>>>55O_,H t:}͚5y2c"|򾾾̳g$&&"rʕPA?>occckkknn>m4GGG&,BKקP(`!?L$ @Q:&/]tk׮mnnbm۶(P(Bv`td2& F p LISSS2 Z%px]**  sɲ2CgƍT*&ٳG*~'|>?--ѣ.\@$11AիW B{{{ y9GGk׮A ! }JruuR͛9sfuu5`(=##Śuuu啕eee<OT>z\V$$$fBsc2D"FYYY v(JQJJJRRX,V(@O666V0s رc---~ZNMMݷo߬YΝ; ȵkt.ɌLfHHȤI իWBARSS,,,U:22¢ܹs SLHII:uݻ]]]_{+W466l߾x…aaa]]]ǎ0aBLL (Nwssȸu;cggzg2 L&رf755QT 7#d2m`0CCC|#b322-,,MT*E"ђ%Krrr>~R9nܸӧO[[[8pͭ;,,*NWՍOdӧ_rѣGR4::?88X l`ll{-LW^^tM6L8B>}Z {… x<޵kZZZ/^(5oAIOO!!!999YYYnffoV[[%&&R(p B477xxx7.$$$"">F'- 355T*UCCCxxx{{;X,_h͛7|I:::ƍP( srr:;;~F2|{{M61`ccSNfffwܙ;wX,vZ]]݂ <==Ϝ9><6mZqqqZZͻK ޽;uT \vMTFDD<:蠃BC@CpWmkHǶ@D( 0 300hvP>7zbQ(/J%*:#dPzP#<b!/:@j4(J LX=brJtaMh;xFr@`A{נT*ax}}}sssLL W(@=\E"Qfff@@\Jkw !Wdu *x/C j8 25XGr>[PP0yd:#Pr{Gq蠃:w^զkF ^~mxib?Qʱ0fB{ $TA5.Pomi:0H'j% BߢV;d] h(@{X,*z ===|h)AuX,h4q>8`T*Om5h}b NSO-#:(~KKA1RFk4`aa-4,c,e0|BcD==^<ohh'GpS~Ȏ PLLLe~?:P;lP!# |h}_TQwA" F7`)( `sz=w+{RP_a2(hhcBp8Xc $TCɍ2GdX pg횢o^R ⹟/*st uA )6<>}EuuL`>88%vM`Be;/;j TcuPh,мJ׾}Q|C3|zg9c쎱ڿA1Fcƅ3ۍ(9Wtlo*J4=4=+8gX,R$uH$\.OOT}}}2 /h!+ Uf. \.Cs@ puDd``tP( O.ӃpPa``DGI׎F{h BDA ,  t<dUhhbGv hB A|>.ڽv @K2*oИh+ C,|#222^+CmJeoo/t= ";օ:-OςYYY555gΜ;rHkkAeZq~tpx<:I_>p ±6џÓ -dmI\\\<=՚:&;;eggt校]Ȭ,i@0hIuuuǏAmACQ;P( h0F8=g5˅ vAQJRB~44ޠ*8 A,ST B..]zAt KKKWX|}}wURRtԩ✜蜜+W=~ի6rww߹s>k,8}T*% N޴i۷U*3 !ΝKLL}F^y}VWWGDDddd|'L& ̘1? qFnnnHHh/&$$ B77seffFGG_zԩS|>ڴiǏ/..~TTԙ3g.\H&AP߯T*B!HE% zzL"T*B!(D") | "/ \.`tttڵݻAAAsν{*** Qsss``O?t=.}vTGRQOs}ĉ_ P(@9r$55޽{...8nΝzzzF`07n ST)9VVD"$  $JЛH$;p@hh(Jp8X,O\.@ȇmٲ$ e2*+ U d2TYYyС'""r9FT ??B[MMMN:sLaaq& x\.JA(h> Ɓ d`d2:_\gϞm[[۪U XZFe|ٰa/8P)rJ%Hξzjxx 70DH$H$Bχ`0YYYǎ}6?v d  #a Qm+t@[m޼ +++&&ݻ  ?ݻwx}.]TZZ:qĬ={dffTk޹sAWWm۶]z&22299!!!6l{.oذƍgϞ=uǏ_SSut SSӟ~)%%СC.\xI>cxfddk&uA*fc`B!f.-,, Jhh(裏?ggguΝR3L6VAѣ|̙͛*3G"uTU{{{FFĉw}ĉDDDD"ZMR̺7o677;99ݹs',,lÆ %%%'O ܺu F^^ޝ;wl֭[d2<{lQQ|I{@OOoɡۼyΟ??TWW3gN4lΜ9t:~駟Ə֭gee1L;;;8KP222>\\\L&'M-Wj# ͛73ӧOY@ b e;w_[[[;w^2lff_~L&%%%s80asssvf``Z6m*))|ד޽[VVVYYk׮&\D'O߿O T]\\Ο?=cc㎎G::: B0֯__^^ۻp2 PחJ7nݻwݻwmv5ww#G@Anݺ`0bbbN8QPPp}++^KK˭[8p wM`233{{{=zdaaqUWW{tPq'N@Ҩ۷o,**655]n]TTT``ڵklB @0>>>==d2͛7SN8Ç111666[lIKK366vttNNN6++۷:uÇ~~~ĒXRVWWwvv^tݽBgff0sݼy388L&\n]III}}ŋϞ=kaa -,,*++Lӊo޼ǏVTϟ/**b0 ŋiiiVVVgϞurry󦕕UgggrrR+>B&YQQΞ=KӁohh8gZ}ƍ3g""7nhmmo&''={v``j׮])))B|winn>ydpp0,ښ}||b]V^^~K.T䜜חu+W?~|˖- ?\lپ}<==ϟ?7opׯw %77O?ݻwN>maaq~Çaaa-:vkhh>leeuG7.!!m۶gss7n9rݻB066V* ӧO744ĀpA!J%ZJEFjVUU}W!!!QǃD"3@ w<?~wѢEH$(@hG F"^pb\.hʕ===|H$222JOO'H„rx(333tل_>p8\.y͝?0'NDEET^^^ZZzO? ~ryWW{vvv^^e`` x񢇇ǬYbbbvޭd2O>}iӦ}/P((N:ydYXXչ:uŅGGGwww/tJkax<~6<@?~|qqݻy??I&͚5+44tőSN9sfTT̙3]\\N8QQQ#H͙L~||Gܔd...ǎ755533*޽{7n055ݼy3DcX.\ Hv vvvu>}ŋd2x bccN?eʔwy'##-^xܸq߿O<@ON8!ЌwqqYv-JsAD8vٳgO6-666(((22rΜ9wf0GKHH ? :;;'a-dlll``pJ ӦM400r˖-E^y9s(;wڵ߾v횹QYY֯_9w{I$>,//G;T?Ë/:::fgg?S(+VCY[[s\geeellL&~ @011Z FVťȈBXYYl@`cccddD"dXh_"]~ᅦO\.w``uʔ)S] ̛7~R }Q||۷E"FYxqUUUkk_R`yVD"FTrZ BѲ'NB9Q]EA+X,;ܸq#F{뭷O:啘 Hbbbxx8 ~X,ŧN255}vVKO{zz EGG mmmQR__ooocǎ^~aԩ6EiD.xϊbڪ͵bJJqƽ@n1f͚W9rF;T=n{d  R.xѕNz7Ο?cbb4Ah4\.Yr%ze({䉛˭ijj:yR|OXX*,,ST`r}}}X,L& ۋwTTT@OAL&/ SV}R3Ù B$?sooo&d2j\]]cSN1 PlAYqXdիWy 6$&&644466p߾}W\qwwWssso߾dɒSI&7BBBLꫯqhTjKK PE"_ss3CqqqEEEuuuӧO~~~ )Sp87n,^X(VTTPT//4Vx<ۿQAAiH$҉'j;Csssϟo``._o{xx@Dz*tR2 i bnnBsrrlllBBBN8ĉUD"pӧOo۶ɓ'D"СC _ LIIIKK{wa+UCCC;:: ¦OXPPRo`UUVV;88?>55\V;::^rBƚsr|ɒ%</88X 0qӧO B` ϯ[.I$n@O6}ɒ%555'OuVMM Nx<##}ݼy3((HOOٳ/vrr:ydSSӲeRSS_y*چ{#55$,,رct9믓ƍ{]\]WWmkkkll8o<''䒒?<< Ah"w^KK7|ȑ#"O>d===d2N/Y놆/Rnnn555ϟR EEEϟ6m+bfffaaCgaaoCt"hii?00`oo/cbbT*wssG\FF^{{ŋ[ZZt̙3xԩSmllt: Q___ Օߺuȑ#===-zABBB\\WGGGHHHSS7U*U~~~YYliipqqqeeepԴVVV 陚l2gggA;w\kkG +V;<'N4i{=ww䢢˗ҰaX N5J'9sFT{B6gX555`h4 ?\.*J___##AΣM:^{ ttt=<, ӦMC?S{{A*}NAh;L/ 2l36R~ #Z͑B#i? ͰmSC0T}:~Tj7za 0l3jRb0/F C81! QiG7(H'* kBh3y0Oã^//ɓ'#;@=[ԉCdY1:oDѦMh9x!*ӰQ(Oȧpr?HH|(YA*2[-'H`akAP$hD"(<0(c0`c SQ1.=dcv:jpN|>_7tAS;% ӟR@|KKK0ki =ڌgP0dd=O<LLL5?~| 2!mxhGb3a5pxU+m B&&&)[_9#jX&Ο(ĶA%0ꠧF "#,kB1{v?]4tAX,V*fd TzHnhdC̫M9 S(d_Ғveey u/<dJcI3vU~pQzG#1<Ɠ3/ c$? ~hv 蠃:4ȾR(vuu400 >|Lp R`XpK.b`D"So5R jz``:`%Cj(8zaDU< p8h1 łӍB"o >S?==5橤 ZDˡRpND r[ZZX,X,FjwV'++ yiw)((hjjBۇFMZNS ?dtV===F #HЩ-@f?LA݃󧽽t3[ZZ{w[[[1L__p3Qݭ=G{:HaGtA^,,--]b_+**jkkCBBΝ;WVVv޽輼+W?~֭[<_w^}}q㐧Atz{{͛%3 !ׯ_OMMp~۷gϞb<^^^'0L777 fO`0>c`vss;tН;w r!(]v-//o``… >LKK?~|bb rrr j:˝2e#DOʚ0aǯ^ORPP(P pd2^ hJk!&@&J\K;r B?y榥^~̙3k׮۲eKqqqZZNGE<1JIOO8qP& 9Z@TBKK˽{J$'''Zf!ԼvVr\ dfZ V90 ϧh;wvv۷ի999{tvvbk׮wH$:xuH$Rrr2Ž 6dffb0 ̄a#!rmllP*ZNXLP` p8cǎܹ3..nNNN&)))111??B!@ooΝ;322\]]r˗!F?0۷o?>;;;55|ͽ{sڵz\tAP9Hm"r4 \.0o 44HT._ٳsεkiiȘ2e7cL{x<+qСٳgxc``p1{{ov˖-fT0yq8D3g΃X,Vddw~~>\>sÇP(Ο?7̒LA&gϞ}MRLMM 233|ɓmmmݻ7a„{:tΝ;111O VVVO<˛0až={N8Q___RR)j5Jݱcsrr*++띝o޼9nܸu=z7o.))122~zzzWWΝ; Ϟ= Ael w޸5k֪ӧO8l…?ڵk'LpΝ>//V,9ŴǏI&|g w2,w;;zkҤIǏ?3F"H555n+--&J^re޽eee%%%wލ_˱X5kT*/ b8zСWbrLu>|8''G$~fffFFF?͛_y肂hqݻwdTUU/[lǎC)6mzjUUIMM?~|^^===+**222 N8QVVVA}L&O0FI$;w̝;wɵaaannn'OcX^^^[n+..>}ɓ'+++/.X`N6?qıcܹf,X0a„_=++K"/>o>tPFFD"qss:X:?#X,ptt AƐD" B"=:k,rb' h30^{ ъG&: qvPzٳg ?sP_J&M<0#޾Pxss(cc㰰ܿ_TShXH$++(CCC??ÇmEp¶[655=yDT޻wJ~$ ⤮X޸qD"M4iٲeׯ_ojj W뀨FG}WDw}_]]}iff_ BDKK.11qݺu .Ph/(w%%%xϯ]E$SRR f?ʘP(X,Z&1،ӧO Fzj+++* 'L Ç9N?H$Atzzz?|ʕ+mmmֳgξqƼy8pʕ۷oyxx ܹ|ժUرc<\.鞞w-,,qCBauu5F377߶m[ggB`2G酅aaa%%%n촵}WcbbH$RLL ضm͛7,Xc"j6-wQYYrJqС$__ 榤xyy-^888xʔ) e۷oqFTTɓݻ`Ph4T*KRNWWWP8{3fH$ #BcbbD"э7^{5X\^^4Px<?y$(((6mN?vyTjaaa\\>ǻtR__߻ dӧO3KH$T T++WX,777*z}kkg<2leΝ Fy UtA0d2}.fqgXl6v8J(J. e ¾@ X,UT(%Qow>o``׽c_@ Ӄ3cPѐH$ <]qx*蠃:1bwFC$---ѠB?=sO|n0yih`֮: a=s O~<2#sO~A)hy9aGzⳢo m^48.3) Ńv ! #h7`TaGş(Ah>v&;2ofhuco0OԧVɰϢQ< F[ %XrF1($:cYo dB x--- bX C2\FbAggzdI-'{J+ _6]]] ӅBass3]B2\Ԅf744C E F(d[ԮXNSAQC# zI@uﯯooo4浳 vuuݽ{w>74 z!. Xڠhݻ_aGZlShg8J+JcXC/ $ӎ<|%53&:9Ncc#(̓'Ojﱌ-텰3gܻw===wnnnw^||<iooU 300G'dckl6 l*n:<DK1L?<:d 55mmmo$͛7{eddtww`hKYݞbg^vW  OAD"iiiAgva' :A{ J9|?|RнnpL&C!! 100QmmmPx p\xHҶ6tأl6 H$tpܾ>ȹgϞ=xAQ>`0>.]TUU:a„UVxzzVWWxzz?*###22ǝNlٲ%''55uΜ9,ȑ#&LYz;aXSN644 L&svvMwٸ|}媪7o?ŋIII999NNN|3f̈xbVV8 ZZ rdRb1600Dy@@X,/r F{{ssskkkǍcǎܹsťgϞmii[n]qqqGGG``?~ `0(Jkkk&N|,aP(߹H$" ޽Ν; fuyzzd2FDR;GL&p84fKR{re2H`0|>m},K$h4ȪS__ԩSAAA"H__GT`"zzzk׮pJD"xJT*SRR_T3Զ|> /HmRM`:t`>}3!!W^rRL&5D OKK;|pff92''֭[-Z~}\\q8ݻ|˗/ffflݺ577źOKKJMM=vXff#looW*ЏrNggggee9r:99/~EEŹs:::<<>}tLLF1225gX2 J(J]6m4Dk{!;;>pppptt .h䌌۷o /!Bww7HT- bL&  * 9sLzzzjj*<x<^$Tf dpN PrSh*X[[{qaFTGPDQѣ",,_~{naaɓ^zԩLooo>aÆ}:!!!33sܸq۷oɁ0}]^^^]]]xxx|| 222᜝ǏGFF9rիYYY&LfVV $kkk xw}d2wI O;Ǭ:j5TZ\A\.p 44T. s̱˛:u311wޕH$%%% ,p =zۺu+7Җ+8D"999͜9BϚ5@ DDDL>ѣƍ X,W.ڵk᠆>s̔ccc{{{RiffFRݻ'&NhggА;iҤ}:t\_NR*nnnnnnɽFFFǏ_=r߿)j5Jݺu7ʲ?~䔜#`ݻwҤIVVVԩSl6`|7 믿t: cĉSJ( $%** ::zyyy'NCBB Df]`Pbfffv%K-Zۻe˖&Aݻg``B|xJ:88899I&ɭ@yy>|7 fff6lhoofcXǏ`0?H$rpp|`$''ϋ-BV"/H#O?]l'ܼy'Oꜜ6n܈<=/hll<~ J$??UVUWWWUUl`</,,lڴi655%ɉ׮]{?X "xxx0̬LBuXww_˫E&?y$44ϯ!22rʕ롡555gΜikk[n]DD8V(J2dɒYf͞=ёH$~Wx<ظ9 ȑ#l6Ϝ93"""""B K,rP(~ zzz.HD055?~|EEšCyoo'Μ9344W_ 2e#""fΜwR#Ɍ jjjBBBRRRJKKjuXX333̌MMMyD]]]d2<?cƌ>ՕN_3@"Fi4+VC`~0>|㖖CzÃT*Xζ6DR ²2kk뮮.J$zB"T*0?___ 3acc㊊[[[,KPZd2}}}]RRRZZ}رJ&) VTpx?!!aʔ)P~6 ţG>|RSSrrJhkFiii/_J $SI$ROO֭[WXA$d2YLLҥKq8N?〮@z lx<ZP(@{w}||~G{ @+"e555r\OOJbXcccLtI&[_5ÁہG֭[gΜdD~??*333k-tz[[[WW@A }+ DO6tvvv"p&Mzj`*l|͛7 &fAEEEHHT*}ѣGKKK?~,kjjASSSTTH$...$)((ѣG#""B.766888B2ZYY񚛛'Lbzzz|}}>|XPP@&JJJxڐH$0E"*uAƎ97n277KNN~\]]91k֬܌.777>oUWW\@ :t(99y̙N{zz>x޽{}39>yT*vU(&&&t:ƍ+..{.Į_pɓcbb Ʈ]n߾ky{{߿D"{xx+~vǎKJJ ;wn~~~JJEbcc #""g̘ajj:yd[[Ǐ/[ ǃT>JuvvS(^^^,U*Θ1¦644L>]Ryyy1nRill;w.N/^XlɓL&sҥD"NP_1)JqqMjjjPPŋ}||spf*C"X7oI$CCCߏ|{edd|.'IDATӭNp(>|'N4iROOOnn.JwUUUssɓsrr***0```0{l& B7T*2ybWL0!55H$2Lkkk77E @@RœΝ;7n8WW׼V?#,MP`]Wؔ/\xBtRtŊ>>>o߮<<<Ν;tR-?LJfx<2lgggeeT*`cdd$x|WWW{{;v?~AAA{{۸q㒓{zz<<<CBB`4;;;33vFF[ou]777,meeU\\g3h4ZDDͅ o޼#""4]AA7Lbggw`xǏh4166^r%lI=|ڵkֱϟomm]zH$"AAA}}}[[[+VX36:;;srr\\\Mfnnl2##d`8),,y###q8ܡCbbbƏp))((Xb@ 8uԜ9s,--9bee믻~/^\dݱcnjz-77G`8wCBBLLL>sڵk퐬%11vqq/// 666&&&/uR렃C UzzzA@@ $RCVb|WdtU__g0QX!E,Q6v)pj5ľ eѣ͛7ը/#UggX 522z%zd8,,d)1͗ԧݶ@F H$*--?~<:իWٍ-?$?Rgo2mh_a?$w}?]!X Q%(st|P(iL!Ik؟J#0.~DMi0zл? ja+5CBo!@` ۰~ qH/pFk1Ju!| Jk@S凎?4TFd r@Y:;^t@1Z1ǝblP { #e2Oǘ3 iW`XంHh4h4Nw=u+ERH9]:nu8Qh,>pbPZt A@e`|>BciAD[U$I&$}頃:;A#Fbii*+#&D<rxCCCX\nYű qb M*< Q3AD0@ 0tCyi[b&&&D"9?HeH0?]4tA`m2+2G I,6^gGdR :GG*6G5SkhA#3l; 7hP&OaPp\ V;=_^])I:XçϠC`5OQWUUOBTd2Y]]]ss3JJe6L<bTU*U{{;!b@#L C v(-Á>|с ˭54H&jkk[ZZr`DmmmPG bZ[[pT(FuI}}}Ȩ3 lcFljj>h窪'O@ q,--- ttt@}ill 7n܀- M&JH$jZ._~}Pkv |QS+y2JPʧ WWW%IMM L%AT*Umm-ꠃ:蠃#ax9G\R۷(""ʕ+ׯ_0aBIIի gMMMvvv^^^KKK@@ nyyyll, JR"'O/EEEl6r .deeݼyٙL&]֭[qqq==='N(,,ϟ4iR~~g}fdd`NkhhrJPYvtt4ǣht:]( sssDfI$FJ%'722DWc0[__9\.8|paaaEEEdd/RSSёqܹVoob$$$ܾ}"ƓH$;7yyy몬WTV}ADw -t:544={645ݰa@ iN333BZ|>_,C~V%I__<Jh8@E4ZTI$޿ܭw:P50[[[) :`0ׯ~PHT*D> G-((yfhhhWWWfffNNNoo]@iMGAt&"9oe˖վ>Eߺu+5k֥K _{50Լ1̮]떔diii`` ^+W曯Ed(… T rrrVX?lڴ Acc㯿['OWT*MNNT(j~~~ TW^ ;JC.ٳJN&!*^TT믿2,Xfx+W>`[[D"P߭[BH\nhhꫯ޹s{ݺuc׮]v266] SSiӦ=~877W&]zD"{/I|ƍ===+WVoll9sfdd~pdoo+V̞={gϞqpp@|>R{ׯ뒝t:ٳ[lܸիEEE... .hmme2oJ655 B'' "i&ooNOOϊ'''p85o[ӦM+sϒ˿K77ԕ+W  @p܏!SCCb2QQQx3Ϛ5+**bxVpdV Id@PeVX5k 0 8LP(_}ܹsܐĉ!!!Bf޽7ߔJL&…  ;::N:5<<͛ .D-X !!ԩSF,𹽽}ggɓ'z)VWZl2L1q[[BIMM{7dۣ<<<<==oݺeee5u5k$$$tvv5*!!appp@;vlT*>:H (T:s̤W"7o/_ׯj'~b`Nk. #G'$$ Ν;S__߭[R( OOO///|DFh4N9z!3~d2e2Y__aZ6--ԩS*JVT*xVmoo7 !/IX,CR^+zX BN7xח4J[3L^@P9twh9y۷GFF6m4eB688h2B!B㵶|C"Kooo^^^aa!0(/r]v!|g|||pp/L2%@X$H^jժ'O^zuԩDJȑ#|>ӦMG7o^ppp`` НᄅUVVfddO 4b Àn0*++> ˗a=~񅅅-6mݬY\Çu|HHȉ'X,VAAAHHHKK d9=rH[[۶mۂzꩨ(秥 h_~FmܸՕB ,>}YLr-Zdee3500!!!z~Μ9by޼yk4x / "& 9d2 OHH`Xsqvvd27mDkkky6-Ϟ=+J7m~Q''_|L&e&뛐 G`0 CppX,OIIfXwq>}?ϻ\pyʔ)0cbb4Mdd$1 ~:˵5͡"(22bŋֺAh燿3L %88X&EEE{yyX`2Ҳy sd[EEŋ/fkkP(N/̘1tշnݪL&8;;O6-..nԩ,+'''((رc`￟?~\\0C710 B\4SfNRd2?)OPlllX}`P&vvvd2www8p5(/F諮.3aKTx;Pgoo/"d21c*?)>00E"zرcF H͛7o֬Y NNNjU-[#CK(oI?md/^? xb`m-,6ɱ4lyEo4[ux6y60NckkkFkF#^?~r}`)7ڎKiIC6,|˿=6DK3؉NjXdfine:zKC d2fH$q-c:nɒ%ƍC{I-ȷ˴C;;VM5IP޾>OO!NjG9d* `0wXR*sf6 ;t fY.0vPOr2#ߧk6 N XCT*u:l6[YYtUh]Md2#Axx@WW!Ybn6i43{,vgŠJJxfCT!Fh忖X[9Իv o@ \ߡz@ vn^ˆPef2*D,UT07ƗGʋÑ4Ro @ pttI!:侻H@}pp_ʽ [>PkCa{Hc,hXdw-~r>X^֒-X=ȽmـX_+9'?!޸ Eܫ`8+Kg+ZdJL kOcHxc3R퐻 @#T*MMM ͆aP(ƶR{d͠V!5t?*Ha`@ t!TM >DҞJKMtZ y@q@!4880@ahjjj+l4 B/11Y-{˒F[h=V涶:J *PaXwwwII (`bWWWMh4 mgg'#G'}%&tgmrވh4gZ:PPѥKp76])R9u |'g1rfKo6H$*TaRhnnjA3n. ve2ƌwر̸W^paԩ导 khhikk{ldC Jemmʕ T:jԨׁ`b0gϞKHHf|k-Z$ ۷oϚ5+??^ qܹ666`Bɓ ѠLҒT*^xX7LL&;%''ǯXWҥK }ݏ>!doooL_|{ڴi˖-wZ8c HajH$P%߹sgcc (꯿IIII&^W^]xq@@kP(曝;wVTT3FVCXe DbX/BbbbHHW_}... .lhhhmmZ`AsssQQ`|2áR۶m{Lc—_~`0@׳ghoGe˖ FGG;v^KNN^t)y/KRȃb0UUU'N裏sxl2_ h4\x,00pѢEoްaL DR?r횘HRnjCPM69::d;vh4ZjÆ ,۷osww߻w ZZZ.\oCM6^ ?Skkkllm}}}ee%a׮]3 ,`Xޮ]bqvv6JNNN/޲e F۱cGEEŜ9sRiJJWeeezz+܀?w ➋[83;bXqqq'OY$-ZŅf8pwUkd:ӓ믣1,R/"0 i$/X`+?~׷߿gΜqss:u*Dyxx̟??((H(޼y󩧞0'Ypk~GHk Wx'N={NS(5k,_\վ}}} #-- &r`l۶-""T*u+WvZWWWHHȭ[-APL&7|eQ9zhOO'B?..ѣǎknn >`ŊxtzKPttt<**//]]]O8QVVo߾͛7x>>o^_x9s.]DP\\\d2Y\\܂ T*OHH6mp8]]]&MZn#[fڵk+++Σl,++d gΜ|?8cƌӧ_xqo6ۚ8qCBBBBB|||B4… sA=s ,kهIE?{FNbVӃ<TRRԞPkk`}VeX!!!ֿE;w>s^^^#YZR׮];z!"aҥz!$ E"BBq"88XדH۰z%@%99YRH~-55! u=zժUEDDDFFwww OOOXtyfAA>a2`xrW"<~'___T%D"P(<7߄JGk4m۶Ah%>Soo7n Ξ=;c Mh4ZXXۋ/rcccB b2)2=0|ZH$ @V*Jh4Jd2FZmss3lVVV!:bZggg{n^bB... .;88@ZhT*mmmZFt:___*zȑe˖'D'O޺ukddd@@p6n8}tBQ__/!oBH$DJ rĉ-[ T͵k윝T* @ஸ;ǽvvv?|QQQBBgˍ7fϞ={좢"Dhtvv޽L&+W C\>?88("##a|2a666NNNGU:!99b7(??_*:;;?sSNuvv5k̵k>}fd2^zoܹўg\.X~cX7ntrrb0NZpa\\'OsYYYiZzt:D"@?m4RVFm4Gh0 srrux %88X*f/Z xaVPPJeDDBz7 $6lkw2Դj*{{|BqYH4}5kddd455ڵ !DM6iҤS¾3gp8oǎfĉ ,0a # @#.P(яfVRkpVF sZJa̝CtZdJMMCW3c vPH$b0;R  dΙ3g9D"}6$8q>ӦM`@ prrS[ܧ@ GGG$`uhb mY:ɍ<@e98ƅ-47j5=D«O. 6bx &L&;88`d(du@cqLqWIC0D ~~̀zpuKcpg¿ٙD"AUVA CJ:::hL(Y$Fʕ+ak0f\|$XzOOO~d0NjG9"WBA"#Ɂ* 2j/|KRr_al6rkkGvRzL1r2#f`@n2!Iq b fUTz/ FS(   @!\]]-_Yol6h4(0d uHyjаBZReF:*3|MwxF5q]mbe*͑bHSe`ta}_+TZ_"p=̪ p#o{ W=:<UO ё\ @0  Z6ZCb9Tv! CrC0C\^p w/o a@oCjyYzؐJwXj\0A_0DR[[ RYRRR]] ObPRR0f^_WW' џ#J%%%L\M!$ gSSSfffss3BH(Au8MRWT(p TZSSm0i)Rl62KHH@ Fdjjjt@p*..0#77\(bS^^ jkkՖKׯ?¶={w/Lj!Lf4z ,>/ל~n;88/.>{|+7+`H@o0F#ED~ ryQQQ]] #n( ͻwBٟ}YvvL&S~~~ee={T*U}}K/ah[[[EEŋ;/SRRᡎ-?{;\=))i:o}7BΝKHHطoB^JLLDa6w\y>e2.]g@HgggYYŋuyW_}!TWWk.RSS_ŋ~!Н~HhzzzZ[[M&SCC({yy!d2YSS\.7 /***B;v쨭UWWPc.\׿sssUVV}'O9x+W Ê6l"ˠ .../= *999Vy`I[[[eed2 PZzgFx3U__jBagg'D0W"WTZYY 3FLb1B7LIIT\pڃj+ F+**r9uuu"a׮]0▖DPd2E?>99gwwwOOOUUovIg}^WW7 @C2=zƍIպ͜9?D3gO?$Zĉ/_LXX^uք /_nooSfWW_㑬ABe˖hDEE@988:n===SLYlpQTIII3 $B`E"6mdee/|wwwP(+HsuWWW[[[Є VZٍ7-ZꫯzyyiC޽dk4?VVVBH&W\yՀ>799ß|򉧧… ڲ-Z 3+Wݾ}{Νi]]]ӳ{nU4sLL&f͚޾|7o5j˖-sYr͛;::Z[[#""[ΝrpZ'|f6M">SZ-8p… -[@*QQQd2ޛ4iRuuulllYYo-Jo޼It_|}vWWWHGurrJIIYv/^а}vDR^^;,Y)<<|ɒ%Χ~JR؆[]]}…:thƌ555$)>>^cbblmmښo޼a؜9sdL* ٬.]e*K/̞=~~~YYY˗/7g @!' !NO=T\\hP]b{{{;L^tSJKKŮ>tA񧬤hu!NC/^bYرcnnn ڳgX,L2TJBK,y3B!0ثt~hB\.W |SLQ( ak֬Y|l?)J;;;lvzz]|}} m SVVB[lYbbbOOO@@@VV 3? 2l09K/d?D"hiEE$ۚ6mZss#GT*VE>}vPff|rJ"""^uFfU^^.{=OO~j޽6l|bB`R1jԨիWBx``? /^z=<|zz:0.:;;!QVXA&~d2SRR`֠m0L&BHt:L- {{{!;uT@@T*5 bLJJx_Gs7n9i$X\VV{ﹻ Ξ=;k,uLfDDL&+--}gŪVmnn&Hv<0 V> #㩩gϞQ*FPL&.BH)Tih4&z`߹s^W18]Ãd^{gқL&Jܬh(Nh~ҥK".2e֭[a֭9sBl4...555eeevvv$ 8D* Рdrrrrdd$ǣT*  @oP(ZKyyynn\.]tiYY7l{ٔzjUUUr`0mmm~z.{̙%K?~ԩqqq ,Rd25ɴh4d2yԩZyl6EP3e˖HƁL&g0f6mDRLJpRܺuM[[ѣAhEL&3((֭[Fq4:,,BBBBrssLbG`\}ҤI...[LLO?u3fhZRE"BCCd2drss}6utth**440kk 677ֺlY___*ORu:]XXV HLL'ɰuaݺu̩AC&˝JI|}}/]?uTLVRRvܶ;wbd2}||N:iҤ)SDGG#^r%?<88}v ?/\066P!@0L}}}e RiccsLBP.GGG?rHjgL`;|"qG[nuuuuuu{uRYR%%%uuu駟y!(.oݺE&u:ɓ===G X>qqqt_%> 'H @B`08::Z~xL8L&< sc 9~BxxS_)"q!5qW Q"=Eth _& i~Jx`0@:|`H-Rѝ=/n3^x >[ {Xc"/=nk2mUpUjy p8>q>y`'%H?OlimFѼalnh>y7l~/t0V»۸,M˻h4_ @/߭yzz1ͣ2EiZkkn΃PIPH$&7rJe6l63L**`#Y.[[[?m1mĄKrʌ<6t:&rAk6* j5ha)tGGA6lpuu on6i4e$MċXDX~~/ <=h"e! OhYmSe,_q{9qB8UfxG [|F ʌ|2dvdkk{pÁ͟a:迃!z[ =i @Qr/gĆ~K# `Bw >X^bȵ`ɐ⮮ ?'u`S+x,bYJF];+w [ͳN۰|x|?$iC!@iأ|=Hذ\ HxwXJRCasssZWW!0 +--!\WZZ 999ٵ҈[RKJJ[?Q{ Р4͍yyyWVV4r|>H555nݪC lH)2h),,h4i4p;aUUUggggyy%ejg'555W^ŷd2 _vB9!!oP(555;vq@===7oϑ^{'Oٳ!ۛpmס--- ,(..J{Dh4&$$uww766^voۯ:B7߼x"qK.{/))i x˗C&<0U*JVX,He%kjj$^ljjmmm-**2L2_fUW\qz>ϟ={͛'OT(|Abb'|߲e ^m{{{}}=a.,,TT2L"fsSSSqq1h{.B}o냂zD"T]]]---M|,Z-[r1p^Лoy V+J|> |7DR*0Yd*JA>TQQU__k.@jll}U__vq )ZZZ.\w!>ӢVBǝRe 􉎎^~X,]\\bccI$Ҍ3~Hd0Ə|rKBCC5ףi4ږ-[F#lyߌT[n>X[lՇ~XUUo8p!2 BH5BJ255gVd2K700P&DEE!!p7nܪU[n=쳁w5+Zʂ?V4d2x^xN7|px<^kkCbbb{~*zɠ8P A^ͭ͛&LLP'bŊ7n|w&IP@Ǐ?00"T*uڵK.RoB\.7##cǎJm۶-44H &,^ƍ?ORD>+ZYY幻KRmmm!^(C{W\ CtW^yh4vtt<>>?c]]ݻ/r\coo_PPo0 {j` ݽ{ŋΝ[VVH&  ̙3gϞMRכ`nf3v+V888xxx,_|uuu/^ |"򬬬0 KNNH$/_޿s=;eʔ'&$$[7HNNV*3gΜ>}CDDĨQ"""aT/7**jÆ \.جZテe{bݝ+9 PQQ׫ZPP^WWG D"B!եh222F7n Cgee>(~߫WvPo2n݊aӁގrrr)J&aFsrr/_l >ӣh233A9994>u/_J3f̘1 uuu 00>---==-xl(`!V n2jLf^^o$JM&X, R<W^aqڵk=o8;;gggΝ;wҥ 111jZ$ !p Z#u^o0  Xhۣ(J^^^___ZZJVU( Lt^_YY 3\ʊNCA2`??;vz }||l6NߵkxOVL&hJ"HZÃN=ztٲe1UxTM:u˖-QQQ<D"^zΜ9JX^^@&aP(/"--mҥFV"TѣGh4*D@~LV(ZťDpܥK$''o޼ʕ+=ɓsrrjl_e2ٮ]lllۣY[[wuu]pA$ڵ bR0 c0,9:::uBz2UVV6vXHj͛gΜp~ײ 6xyyږ BZM&7\/{xxL>}SL),,2L&ܹs֭sppxebbb&M=|* |t&i2L&5Lt:}ҤIfy>>>F&;ᤦj}aa! |L@&*:^\\>>ξd2_(Y2dwwwD;::$$$ L2EVYkΝq8///'''X}}+W?~<$}f;7;`08::Z~xL8 9R!;gy ϑEs8uFw2 cJP`!aݲr(0l@yrzD"YZn0,ÚdR</22 Z-d2p X϶kKn\CdGb%o>iZ`[YYEН`P'D顡v  z}  noY0*C V@߭#\+0LiZkk.$IPH$ En|H$Je6Y,},g0 E,˹\o{ar2#7l6tXH6P( h483T*JƣDdL&K/!\]]-[q74 /0$ 6,ctR% ʜ>>_Y EEE<#q=*((xvssSTCVsrrX,7KAYYYww+a4 (7o09555,,D.L&_p!dee o0 vvva_PP`mmge @!PUrMMM{5L111 Fx3233Rɓ'MҲg6TPPPUUo8qbҤI C׃dqqqnn.7@g!xȑE^zU \|y޼y?\nxx8a-Zpp0rqq9|OOٳgÁ2QWWWRRRZZ:aݻ.]Z[[w^2}ڵWvvvFGGRڵk߷oFRx>88(mll***IP(lnn2FPX__:88}v___;;RMWWו+WRRRf͚RԫW!/^+Cۯ]6fxLiӦ!jjj an`0,0LTR(v)hgg':;;e2ID"Q}}=qpp0R$999AJ,P$¬@)JPph4\./++3666|>ãtʔ)Oh$R<}^noowlll8uwwwssc}}F0Cxr^F{ISקh80sov~w}I%$$;fJ$''3gdddd2//w}W&ݺuk2'55F466VVV655?ȑ#.\Xl>iOIIqsskllpႿssɓ')ʵkf̘;H$)S @?F"ywggg79vخyAg}WRԈV{e//c̙3lt::ydXPP0o޼ P p|.'N,//7 111aaaO?4ɜ0aBttӧ'OVBq5www///$@'' &\~v:88WM0!>>ʊfO>`0 1c|w ,;w#G?[nq8>\h4buuuIII$##Ӑd28p`{񩯯 _U*ӧu:۷XͩgɾΝ{srr&L1vبM6޽O>.))9p@RRF5jJ2L,˫&H3gDǛ+W̙3h8BHNN8sLbbbxxxjj=Bk۶m,o1 /_/**3Ň3f;vwwC"|cǎHgN4ԩSǎ_Ԝ9s,--Bttt߿?!!1>>… 7o]\\ZWWꫯ:tή%%%&L&]6((_~ax񢛛/ݝ1s̒0wܰzJѼJ͛s̙>}q! P(  L&^><=N>INOa8h4ܾ}t%6l0~x\4L&SddΝ;lFqMP|~rr޽{ш՝)ʍ7B/"<8駟 _5d2端>}E"B"##! Te7nDEEr׬Y|q٬V!ɔJkvuxÎ ڵkyCVwuueffl޼9$$DT:99mݺ5((Fqܢ"4~g}6))I$j Fd~7B!--mpp2r9s/R*j|HݻwʕaN~饗Bfnݺrʢ".CEBӈ;vXE=ӹꣴðE?LLL ܽ{wll,Lt$iԩ/L&qㆋ믿o0>0 &;w7n\qq׊+L>|\2h̙l޼ysXXXrrrjjV-//YfM``ѣGV^߽{֭[gϞ2jԨ9sM6m޼ycƌ;vۻ: 2BήŋxӦMӧ1 /dkk[VVT*w1}tHTXX믯XbHxM6;]rb-X@"dff+ x #@ {d6[[[;;;Bnnn7o.))ikk+++SR!ЀohhDmmmj^liiAwv!***n:O?t^P B^߰aBjF!w:D" u:BaXq~~ L&S}}}SSSKKKsss___^^Juww~zAAx]d J7n\LLLsssyy@ 5jPBVVVk42sVbwkkkcc@ jN={688DibqKKKHHFݹs'z { ~~~n֭vvv999gΝ;!-[bbccz@{{'"666w`0(ʪ*\%]әLB|j`t&\,J*`0Z&´Zرc׮]T*fm4A<((Q$}7*I$!400R]]k6]]]wA"`rD0FQt:`K$NJVz= acV,X0|\%%% uuueee}}}'Nؾ};h4Jh{"!$Jb1>Ν[RRRYY9qD///N7uŋ/ZJN81**6L6MVD"HXQQQ]]-B---|>ݽ``;w^d B8²2 @࿂sܫjjjL&^dIsssZZ֭[oܸQPPx &嵷 777tVu֐ rgyF8f``@"gPe- {@kjjΝ;d2 ccc#ͮ-++kmmdgϞ0aB@@Ylŋkjj6ngggW^^קT t:/2eX 8qbQQQcc#LcXf[[[ggk׮Z*444---99y=BH"L&DeۛL&XST3̟?h4d蘘[[%K0BƁL&t:b!!!Nrww߰aL5kNF^߲e ȨZzuhhesrrh4رci4 c^^^$)((ϒ݁*SI$R@@Brnnn^^^@bپ@+++GGǧ~LJ9:::::ka͛7]\\&OǍgoooggj4Njoou++^*VVVZ[[{yy'3 "VVVfˋ`X[[燅yyy9;;x>~Μ9&Looo h4W\ XlNIIYn]pp}NN ƎKR'O윐fgΜfF]]]pjkk\EjjjlꚐ /s @'#.P(яi>Y{,S)Eŵn4Bx7`wqb:2jg͚IY&  z5QTr @8ɲ$ ɇGw(p 94  +) !t:5 @8^"p;nn<CڅcXi zoT*5$$5,,l6z4(*B_<0WIsV=÷C˾( &d~ -W8rS D hx'kѣG = F9x )>nzzoxKsKBSCG&u:LqՐ1 ul|Z^#tg>O ~;/|?: 4ʐ2Zm)z(x HJD"ꑗ;D"T* L{fcccoo/fӑCPtww?%x۵Zc5$ˁ.A&ZqX:aI֧`>fF2r26*iZUOCnߋ*=?*?Hhy|#< /`0d/te,r;!!w|9>nCdbfM^!‰4؝l${ٌ; K`Iۈ0t ukl]i24,<͖<"Cβ]8sز umt~=[@ߏm[2-xg{Ē[c2'~l9 -{Ӳ\o0#0ƻ{b0 *++2.fJKK!T*vss#NNNg04 $vU+Uwuut:'''VVFceeeEE={\.H A 5 -((`0\.2,##C(<dJ겷)..6bV^^mʲaX---YYYnnn ϜVCBBc=x`eccpEG}Lr CqqqCC=Niiizѱ.//`0766@ȜwwwdN%|>իUTTdee3?~ dq'X~gDx WaHw P|V@"*++322x O U.R~ѣG9Ʀ⾵t;t'&HB077Ύ`X~w)''Ǐs8۷oX[[>|]&yxxP(Rym̀&;D˃"@P<==>(//xt:H$:}1crssryjjh: :s*AƘgx~m֬Y ロ6mZGG{b""":::8`ee0c 2EEEǏH$œ&MC9HHLL 񶶶Ǐ~ED"э7Ϟ=;o޼>5 ðڥKZ[[QQQNNNW\J[hh(g|>2޽;))iҥ'HGr Cjhh~7z+W~}!]]]T* BSTTpLdrvv!& CWWWUUA#eV97n9s[<ի6664M \|y``F1--mڴi~mSShjzh4766N:!TWWWXXhooO&Y,փ0R bM"d2 y<^wwwMMuWWWgg3aBU&@/SXX1evvZvtttTZXXh2x<^CCCmmw]]]yy)SPa ǮRΞ=kggx<^OOOggg[[;okk SGGjdU޾aw@$i``׮]:ujGGQR}ٳ!=BXXرcǶo~777QfffN˃E_ޘ?ԩS_}T*K}}}l6K$LF&^}Ղ$N믻^xڵkK.]h͛7333]]]x Z]RRrȑB;;ӧO ©S>3@uܹsegg꫋/DlnnnF1%%e׮][n}6z25  @{k*Q:::ܹsرFcll;CP(&Mp၁K1TrB$IӍJ @P֬Y"ɰy0^駟nٲd/ _|񅕕Djhh`|3<cǎ7n„ ?~]8Ͽ~zpppss3dE֯_cǎaj!4mpp޻woZZڹs琅#Yv%Klmmwڥzzz ߺuU*ƍB, !;[nRbkk+d||ZЄ9|0px)0uڵ_Ð(//wV\g5 cƌٲe L@Y.y+Vx%KDDD>3l6GGGoڴf…O=l&Y[[aŋcbbp7no߾=&&kt"4}UV)ʤ$OO]vM0!11C---r t:۶mƏ_VV| &@F38m/J]~}xxxJJJzzlrWuttfўZ8`T*`0ڵkΝs 9s &O>>ӓNpܘ&SOzxxxxx`&Jǎ蘛xb6 daIq^PHkkkN:jԨgz{{$IN>Fi7n 6npGpByL&322f?(aaa7PWW;G>0LPXYYh4oeeekkncc흟akkeee`0ϟf3tSjj۴iZ[[]\\&L"PIDATL&'Mr-h"BQYY@IOǝb&???2A슊F RAAAqqq$((ō7...)55u˖-<o:N{zzzyyt'''6 Ld֭[Y,Vpp͛7ϟ]d;;; 6;99N2eرb!o H"$ Djii:uj``3g–,Y^]]a} @c$w f3J r<::!ڑ aFn4:;;zkew<ԃMњY? \B&Zܹs}}}ݥ @u{ C8ur+ ?`l|\x)?d2NoI8cɄgǸF R.4`n.Q`FP,8>Nj@b<II h4B{!; &BDDDFH/,pie<5p?X-EqYnK? 00*::Bx;2 {\u`0&Mm5 H<;; Aap1ܷxKYK1DT9[֌ak._ o`\ݡL&ӑ#G\R___EE.}X,p8񴵵eeej4ʛ7oꁁݻwgffdBjnoooiiiSS|ڷo`8ydVVdt͛7 ?~>A]]]qqqooC D"QEEEMM믿~An| *++!sƍ7n@R.''G&aF!T: CCCCNNNCCayyy;wp8>>>Z1==]Rcjjjj%%%9v''HؿJ۰ѣDќ?~ʔ)G:::&ݷo_[[M"233sᇌs ~Gmmm0˫@8sJX}![oavرk׮]~ @;aaa+VdzLd2966Z[YYEEE-^ dUV1̂/ST݃Pvrrڶmې,Edɒ 6 ++۷C NNN۷o_r\.J111/s Y`0t."$k׮]nBĨٹ R]|9...<<!tR6Y&555++fܹx{{wuuD"<=x_ׯz7|/pD"9tPGGǦM:;;z\+_|$%t'OD0WPݻ,YiqX,áR/r+W ڶm[FFP(|çO,$zԼ<<5J裏@!cw((HN8QTT?~h|˗;::oѱy朜'OVTT? ==͛7o裏,9mmm "HR/yyyoJ~RiFFƥKۏ=d24O.f3Nhjj:tPgg?ϔV-((޳gOccڵk Pxю_رcNb0?ܲ2sNTYY*d2iZTj6`#FݱcGqq7L&Ӯ]Μ9SYYR__s=3YYYv키G)///))x˗bqKKKWW͛\nVVVRRիWB/O<ёflt;wnٲ%;;= @I=i8-x``@*|8;;111 B_ ZmssJ Fi#B|2N_jBL&Cx+|}َ; u9/0 tuuu,ʕ+?SPH&92yqƁ2l4i[oEњ===$ .iӦGzˠR 78x`~~3g ͚5k.\}v䔗jժZ~zOOOHCSUU=zYRSSb#ǹN"r#G}]L&!h,X000p!\ܹs111x=~7VXOf CLL̺uh4ZWWÄ;PvÆ  7o3af966vڵ=󋋋o޼d2!a/III!!!7n=z4uƌ˖-h4nٶmرc P(I'pxzznܸq偁K. 6m0dܹslf׬YcggaXKKիF=jԨ(OOO^o|饗̙3/88xڴiƍ4iL####"""##_z%X駟f$Dn;v?_P(8NMMdZnݴivرdɒ~>2;w|H$:qUSMMM J @'whڦ&0͛W[[ϼɌzꩧ$IZZZeeiZy[[[IMS]] ě9s(J>_ZZJӽ_^VV6888nܸHSJr偁L&S$uvv>3gΜ;w?ۑ  @SZKCCCgg'ɤh>looo~~=<}ٳB0LcmmmoopAssO?IR"""\]] {9R ?d2 1...**W2ԩSt:]JJ L޸q#  `x'h4Pfgg~oiiJ80BaeeEl/NuwwrÃbly浶vttx{{;;;;;;ّH$IzxxX[[geeϜ9}ҤINNNmwرL&gh4555nnnɤO`688b( h4ɩ,""|d2***mmmX,ĉccc'Nra֭\.W.oܸ0:d2_lmmlUrr2F۲e N }3<󻺺`WCRRRXXآElmm 7mZVV>f̘ɓ'wtt=xţF hqqqDvŅ^t)** aMMM4mӦM翺 @ S1X܅@ƈ~KuFBR@d2]|D"ڵw{t /]D&Z,GG\WEwz @_ ~^///X^DžGVA VXX9*bN0|N" d4סrد~Adž!.ڀWӤ`'k\0\3LhH<n8\W퇡d2g̘'z^:} }OhQ>8ˠ莆#~[Nip7Н1 eտ3M=8O 7*i9; ~;]GlU!w;lJգhBwBu(YBH${7 fA/*᩺#lWQՏ$ =VAypӡ;_m X2<f\2FH[^3qSed }T @`0 }:}w=߬{|?=waxA{]nx6{E0O[q?*!,{gHݧY.`r$cuwfy#S&,{*á*3q"~N' {'1mWKpR;!~PuGB4`Io_/w(M,!\/_Yڌv <}Mn3eNsqqurHVVV^^MkkkFFgBH,bZZZQj0j5HNN^^^ >y_AU0ҒT*juJJ\.wuu5 l6gddx66ð(|rR4>>>;H$3CDhRX^bH ?_χ)))莪 U*G7n755WWWԀpZe <ޞf;?U$)==ܹsx<ލ7jkklooo++k׮h4xok0,55~aҜL`R.]!Hcƌ)...((8ԩS0+~Nsuu0,//͍`@z]%|L&<"PUfn*--׿ӌ{~'!T?$$$ N> w}/J?p1T OwK{zzE"B)55AVegg^zUTJ$W^y%55d2566^v  ____CCP(|f}LS 駊ΣGDC}?}(2yyy%%% ___myyyuwwUTTgΜ1AAA:1)):'':(33333ðb,wvv^rS*a&H***% a ݼy: CKKKzzzuu5a|>]233lJNNNɩ0LܼyܘWSSݙ H$H$㏥R Euu5Lc"""nݺ500T*/]wGGǎ~I*o>D駟  {񢢢3g |'CTWWíQB?}X,h4=z.\ Hjp8p```#  @Cwx,]jggg6m4mlldrtt4 cԨQ .xP_75C!b7ZhѪUT͛a:yŋj| $]Z~`<\*R(UVX2" +))qrrB]|y֬YFBEDD,^,++[|yFFFvv-[x<^NN[[[kk+N?|g/^}o) .}Wd۶mRD"CX O?)O>1ZWW;v}:??ɓ?3ɴ0ŋvH$[n-..>}4tyyy nϙL&aXKK˿/\.!׹sJJJ `.7 ~G}}}&%%իB믿f0l]]]_u[[￟CөT*L.((ݿWW׋/qȑ#G={ᄏpႍMzz?877^lٲʪ*99o=~8FZM&U*FW {ƍd2y֭>>>ſKcc۷o޼ϟ?o<}}}n݊aX^^7|R^^nmmO?eggi4iӦܶ/B̛7oʕՕfzOOϢ"kk-[?H&@F{*U1P(TTJFWWGGG"~_|a0d2Y}}=@Poq׿ pB9<}B$ #V?ݻwCRt'/@UU6oW_A֯j̙@0͓'O޷oBڵkUUUP'\n۶mGNCT*kvСӧO#7 vvvW~g6n܈D...AAAK.h4k֬ksjf)f4U{޻ {I&M؎ n)cL1#B{2ҨL|?֧LKȽw!k˻ߗ)J455 f;p'Nd UVGFF t:h85Amnnm62 7L/J9x~ݛ7ocٛ7otqqYx1ǃ={y<ڵkWXh2LцPݴi?y߮]BBBj`0ݸqhxW²`Y+1ц`pqqygϞ][[y氰0h:N _~e&}ܒA$% | DFlTߗ-[5ٳgϟ?yB~@CWzz: z{{%%%]r+ȈF577(cǎƷ~{˖-FqΝRt߾}d2nݺuܹ %vUPlٲvEQT@[jVլ~P/ ATjkk;gΜ6@u_UUX͛G$kkk% mmm{A~~~[[TW_}u…h O,++kmmmmmj=Dt*C jjjRL&+//cXӟz}uuummmsssvvvAAAssÜ9sZZZrdEEEeeNsppXhH\pٳ{{{߿?44VPPP^^P(\.bqWf 5LR׷@ (J2\QQ711#<<X_|_GB&mܸQ$D\>88nwss+))Y`AeeeJJhokkPeq܌GLBP8?̉ 2H8j5И͇QZ Hٳgt͛7jh, F$<<ѣG===/^X dggwww!+40ц(l{3M&Z󉉉ZRh ,㎎jz… s###mmmݡiiiڻwozzF:NV3 h" zj\~޽ŋtUVhX+󆆆ԉUVr ·RfѢE666͛;w`{{{uu5:yף ɜ3gNyyyppHZZZOOOpp0?S(jVլ?f^N<}dd`HիWWUU[BsǎUUU:N3s熆-\NÅI///"':T*KJJH$;CPP(rsssQp8F`lY(ŋi4Zaa믿noo?44$Z[[t:h={Y,VDDDhh9sjkk \B}?O<<eiQUT$L&O(H$鞞 ~~~B !|ҥK%D"cR>PRHt^Xp|#N swwZd2577l JDLRE"P($!88Ã|6bb1?~ccBp8"JٳgϞ=N,WTTvvv&iΝ666d2S$|'''6-L;DΦhD .**Z~}@@@HHHooࠗTVVVppu령kjj^{5P\__ ŋtsN{{{>8k,???L& Y,ʕ+Ri]]o- wSgjVլ^NE(P R'`-9?d!> )o~gKn6aiA-<ÿ;$(J@`b DcL4f`5YjVڳ4;4RT,@c܌Tc; F (x<o02'@ @"z A ˟--˃۲ %eRar& dE0ph4Ba Fhí9s愄b0C.f 0_c*Uh4NNNb41`X}-.h oh4¿8$ x7 F[r%AEIĂKK #d78 $P}3ǒ;/ o3W떬OH ZIJ[vR@fBC-eY[ Tjo'''qլf5YjVQ3LO8{uݏc2:!,f9ߌry/e:ߛj?4CD`ȁI TM+_5e<.z2cҘXjX^˟s,A/㾵Xe ($0pA0^śѸuLoec(N9fègȲ!AOj4}FCRxE-`-ep'~t7Xm똗7~Ōez|L{||{x9wQ5d-Ǿe[vC&cEx:ib +aˎso`@,I%:m֓.Y=0U`0x)OOOl>KvvvF1))) ^8t3f2lvmmm{{;nG L&sư9#)7n̞= X>999""ja28NMMMGGdxɖ 4C?@CCCFF ho5Y?1?*3sF Hrrrrr2n2 | Õ+W>|COUU;SWWRz{gm@:ܹsJяZccիWI$RCC÷~ xww7|NtXyP|wGGGO:r9 ᣏ>:|0͛\|`xxɓ:O?5{5 gΜFTѣGYYY)))t:],(--NѴegg+?OߟjjjJHH~uL&H$j>?r>||yyyEEE555W^EQSSS,رcW$L&PQpfkkkVVVooϬ ;88#E{{{ ***\r`0x{{DRUU }Ç>DQT*aɢ(/jumm-ĶL&VAx|[[[VVV__T*CyŜw}Ee2YyyyZZN~WZZ:44T\\؈Fg놢dOOOFFFee%---999`R*++޽;66Ojڔ2Ersskkk$ڿ޽{ EUUomm9yd@@@FFBIIIs9NGG͛7 A>#tС+sEƖW~& դRi^^^CCaɹwJOիWp8\NNΣGǥR؇~ {|7o?IOOEoWWTKKTEETss3 XZkk+YYY.\ _5 :FٳgppEѻw޺u A<P({7n rj& Ļw&&&VTTܸqcjj:wuuo@oR={8={U*7|"ąw#_|EGGlj'(ʾ}FJ:{lII t|AnݺֆẺryooGrrr`W:11?< %$$ZFCww2L@$&&AA1@Az}zzzZZJJLL1ЯQUT)))yyy0.{OO;"hdd$##cbb"55A\\SS ;;qqqeee.]4 G5 1?LjVڿǾ{ӦM0=1'''X\\L"h4ڵkᕑ_]3^{-666-SfٻwӌMlfA_^~+WFFfxexxM&JeŃa6m"n2\\\h4Zii3 III+V Df}}}TTƍ .l6ǧ&yPr>VTTrرc]]]o:~`/HjccRJ_~955E$tzAA˗'''aW!Y>/\]]]GGG.yɒ%666;v쨪ruuݾ}{qqȔ.\>Euuu< A8p?yjVJIII.]u떽-F닏l4~IJ+W466VTT$&&fgg8qo@ |gj:..ȑ#iiiRO@8sLggkr7D2::z!"x!Pc˗.]wQtd2^ziPxرw"fMOOɓ';;;?Ӫ*ekkkkk[VVK}ݻwdSN~WJ2..󩩩'''/8z^TTT[[wMP:tgcc@h4:;;ܹݻd2^`F׷hѢŋzzzKD"ozj~~>H$=())XjkkxAE&QT[[ۂ~W^UUU}GD" b߾}ȑ#555/^,//7+++;V{/ȑ#舍ݶm ޽[   yArr;@-%%$z%Kn CKK /PXX(˽@PO(fТɉya?OgϞϏ=z2 YTTTTTvP(@sڵko١C=zbj'|"  Jr/!ҥK<oggG oܸqƍ~[۷O9rD_|yyyUUU/o ӧO|XwA'N|ǖSpg_~lݺA_/`9tлkooXDpuu5Jĉ8СCV Pg;w0jT 7MUU7|4 Q8tB6cǎիW]vxL+**|||֯_be2mmmSSSsϟ`0 `F722rءj|"//nnܸd2}X5gϞm^wۺu+H,["##lbkk;00s!.nذiӦM"h@dܹ6mDW^|yMMMNNHzmܸбP͡!a4dڵk/S( DRܹsD"ikkD";^@$??@ tJe6-[vZ+{yy٭Yuٲe7oެYnπ(j0`m6k֬z?? 6DEEAMI$Ҋ+^xe˖ FRGFFL۹\. 0Dz{ݻtRH1gΜ9sxzzz{{z{{;ZvZѬ, iiiW\!HX'P(mmma˖- ,zWVXm۶C֢(ZSSo x} \lq=zܹǾ=\rrrss = L__Xc1_ܹ F P^^1_i4ӧIJJڶmۚ5k ÁQTRϑCٵ5)#EўɄ/^W_˲yxx@CL_~e$IvvU֮]/^loo`0JKKCCCwIPgϞl2//@jk޳fͲEQ477wǎ6l`CCCǎ{W08ʕ+{{{kjj4o1|yf@Qp^OOO[[oۍ7Z~ wxx-@P(=ƍB֭[T*D7oQQQ-///*z֭7T*lI6jV,*rL&߽{733@ tҲ2Nd&&&6mpz='[[[;::tRhh(455566-[Brg)NV]]]aAP@No޼YCI JmootVzBfN*Je2 P t 8p8aaa**:::&&FP@E{zz$I__D" NJJR(߿ZZRT(:Nh4\dΜ9d2922rժUuhhhXlY``N Y|9D;w.DZlYTTTsssBBR\f JKK)w\\\~~\.fk׮>",X *ʉ`(՜9sΟ? ЬKjZ(輳3::d&''ܹ͛&III}ќ9sBV\\^VV Ȯ]$R4 P*`ސFEEcN[t)Fhڮ 6(澾y_zB[N*&&&Ʋ3gܹs'&&F*2LOOϖA"##tzdddpppeeeqq^ŒJd4 ܞԔF|A~~>ᳲ"X]]P(l6+ ^TJd2YEE$766F?=zT"7\ ¬YF]\\\]]^A gϞVV\p߿T*{ ]UURt:V5JrppT͓d6666 _~…緶]v]r%&&(#zn5Y?f^N<SRlb ZoΝ;}}}asё`DEE,Yl6 5<<F#\Nhmmuqq1Lg9 @~ottͭXR@s8"d2CBBaK+OhhEh4ZEEBx \.wvvjvvvo 7o\x,NzxxlٲBսKԴbŊy!%Y,Hs8@fe2Y{{ի}||8X,r|ҥ>>>nnn Wp8l6+J 8ón݊9sDd***ݽ{7LV(AAA5 J koo 'J󃋋Ȉ@ ӌD"dlkk<==gooﶶ6"6}ŋ$ ,FD7DF3<_ tgggZ uppp8[ZZj;D 9***444**J(ں744[4 oݺ`dhPf ^0_~H$UVVnܸ'44t```xxѣիWC[[[_}U.=44422syzzH$&h"EH$L6k֬̚5k###,^ƢRbɉdVVVY><<<((;** n""""""TX,H$*++sss3www h@Z[[|77785t:}Ν #888===&&fŊ"gvqqJ N޶m3/2t:d24Z9BF9;;;99777/X ((H(D";;;ٳgupKcc;;99555BBÁOXXXdd$\2 ---QQQS*O ,\pRb͚5111uuud2_$x<&1{vR ?D M"`www0|LxyyEDDC(?|788X&1̝;wFGG/[lll,,,wtt[vvv#xf5699SQl˓H$ )П0j<O>55b^g;LfDg?3>< gAqqxMS'iQӻz\(tʋ/hkk/ 7oޔz~Wi[i4cYjV4p,i6RX,řw\iRb$ɀ|;pǂ߲ Xi4Z }keI^Rd2^Kwtt$C,bjb<3j4AbO0p!ڱ,gEB%Ge'k i9e4CfyYC 3Lǃ3-#b1Yv=l?:dYo-53j=[2H01vlpj3Z 3Z2w35Xjp8rTH$lZVwcB3&fD"5_v 2'Ce=%T?`GRu28X 3dš2Vլf5YGd2$ 3 ̏ -Dg<O~2V`B{{\Mfxq?K[bǯ/^6zZ>Xy1%\!l8q ѓD"ҷc3Z zupH$bXcͨeF֝%heb:KCnX c??YkGȴB Pr{+eX~Zv9?X3 9ʒ;K7fC,&3&3h7Wf1aFj\.P(,@7>q[hM` P-9chk,S˺cy|-h4ZFFFNNFsttlnnNMM޽KmmmݻWPP& XeRirr2~h~!Ӭ2(JKJJ\.wuuUIII...!+++77bX,(`a04-999++KRx,@DH&]\\ܹb"@&Abܽ{ÃH$b*4D>EeQ !nC.8iECG:޽{\.nppd޽{^ՊD,>okkO"@ ( ڮ^ 134̟D"L&8p(16662̉!]G,-t8L/,S\]]de:XÒFprrLP&L0LJuȑh`%xMMMnnno\ ؊)))L&ԩS</!!wjjԩS^^^>tqqRCCCn"uP HΝ;@QB$RRRPHݸqchhB%!!!22ȴw} ^}Z(fff1iɌ&tg,ki8 &$$'''㬪!|<4gggg6Azzz^^qqq㮮(ؠ(ZQQ!HBRyJUWW{zzT@`kk;::zMT)Hn߾]ZZbP-**d<@ۙ7oތP(=KA@@+ M(@H$`$&&D"XRSDD ce8q;r,W_9888::GX jc5444::j_d2v<}mFӁ6f5=+1GYefnd`0<|0##Aﻻ7Lxf8裏&''xzz޽{7==HJKK++++++o߾Mӏ9211_'Ovtt  F1##$!}NvΟYxwdd$;;Ç(vvvfggopNjPڮt(߿@VV֣GdQmmmvT*UTKiii  qpڵnW|D"UVVA F裏QΝ$A}\!GGG[[q-裏 _|ARݻWVVXTTdoo{!2>>ݻd2]zΝ;gΜJGP(?>x𠸸4""VΣ~aRR x<^|>>>@®jZ[[Eobٰ̼w2ݻ~33g|}}}p>smTa)(( W666(Z__LT*u:UUU7oEQ=:s̞={z{{>--+..Z֭[jZ洴CAKrr_-J$?'AQ׮]vZ$-;wdwc6zʕ+_d2h4.jG=ܪU d-RA֮] ի𭭭!!!W....,,?SQQKKKQQVrѣGssskkk׿NNN?~N"HD"%`QRAyyy׮]#H~)v$^zHш㽼:;;x<#;v쨫D6m7+Wp`ѣ]]]]O<n0<ѧ;^&r<###//իd2l@\\\{G&ߵ߿ŋn;<0MMM~-NO5MJJʾ}GFF׿2 .]~].5̟?ٳ'O9pFxׯ_x񢗗׷~+J322ůO[2m2Ο?ֶ&.b8Nyyy^^^qq#G&''_z%V{ܹ#GLҫWfeeD8qEEE"h۶meee_|ŵkllld2@hD"`x* i`˖-NѶoU]] ˒DT:gΜ >~A\[l6f1HyyyCC˗*W_W_}ujddf˗/dCfYR=zbk~t:NԜ:udt:J˪k׮555]z@ L=D:Fٳgӧo޼)H._\QQq644|G,KьBiw!weJf˖-yyy&լfGӶ(`0zh_~?#G( DLBor}}}yjq8<e,[@ ő#G{=`ч1 rԩ{ܹs87n cqټp})ʆd2\^^BH;7C+ w~:bp+V=D"qtt>>>>+W b4hfsGG䤟_dddAA\. _7pٳl61 "J i&<_j4__ߵk;vJ"$tww曛7oh2%**jݺut:O3۷]mذA(9s899Ak֬qqqYr%K=zt:(nܸ ;((((e`ccz} %((hܹ"d2l۶M"tvvRT YTTt:òe˖/_Vq8\@@+Xf@ Xr͛7kkk׭[W2Ez͛A' `ݺu>>>"(44Nʕ+n*֯_\XXX]] Lz|}}y<,/|%K|Ȁqwwo2O"H$yu|||x  MWWL^ne2YWWK/fZuuuBpŊs۹s缼bcc`-YbEll\.͝;w/7<<<7n,XNcqvv`>pM`C$?su`_HVA|呑^Сw}78rHaa!Nomm, l.//'ΎNwtt,\ 8ydFFFii^0(R(OOϰ0J6棣Νpjk6k,>. Aj;w0K,dn@ {֬Y<ήl6ׯ_W*[l`kmm)))YtuB͆ o>>>566fccfsrrV^k)f̙r)X,޵k׬Y_xRy}Bakk fjmmhNNNBQh4޽믿b[jV{}@.TUUMNN&7HHHHII)--R*HRYvuui4D4a÷~;((`?jg}v///D HNNN]]]MMJUKГ-,,,,,TT֭srrR###  k֬ioo0j̅KΝ;T{d2Ydd$KR -nNFc2233 R$HuuuYYY>>> 򜜜s¬}ƍ/nPx1`'DFqhhAk!!!* \… 髊⤤LNNd, ޹sih47PTE>h4FV;pRPą j4wwիW @̚5fOMMmݺ`0ܼyСCOt---鍍CCCSSSZVRVX!3(n:^%1 MMM:W\T*===2W5a%jHPhZL+:訓STTBV(RJÀH$7nh4#GRSSr9̉5F1 S(JLJٳgX Wh/^ Hxx8H\b(_^vMV[NTTTh4ww"??wttСCqqqJR@>::zƍPZR\UZZz-700022vᑑT ]`׮]p7`0í[8AۛdnذappJrfwwŋ:99xg.Z(""ڵkgΜű ׮]C$00p``@ pggݻw+**D"r9N $zsaaaZZ]xH$vvvjN`xKV;999:::xtt4((ĉ ,9լf6r* &I(ĥKL7xuttڵӳ 0̰0 vJohtt:]TjZ@EJBhZ//оqo"p H```ww7D,OXXآEh4Zcc^᎚kl †>+,X˫ ÉD"`0JJJ7nZmmm/xkճfBNT*,K,l@*ٞ\.W.Y& Q,;88(+WzzzB˗/x͎"WXT*hooogg'ã 7n܈CTTTVV2]vH;w dr*J uqqY`Nqvv?8;;r>K`aW B:. i4ooo[pp0lr8xQ(Č8;;BP5$lmmV^mgg+@A^^^@\G j0H`~~~ܮt:WTT,YbYچFH$X bˋH$0///@5|>͛٩ܜᾠH$ EoP(~z6M& SggglMwvE "##6m:22266鉢hiiiddmmm{{{_}U6  U:<d4ܺ-Z599144xbVop8;v|EQ tK/DѼΝ>g6  ީ)WW׾>J500g8<iZzؖ!!!QQQcf_{5###6l U*oP(  x ,m ^c0QQQeee۶mdMMM[n,X*( B.R(E"Á戊0^hh(˕H$suvv5kؾ};Fsss0sqq  'ɮJ@ QXTTT{{;H XdZvvvW[[K$_z%.&aa١t:=,,fKe˖y{{H$V!S.+x<\.7** >l6FIZ[[wpPݸqP(Dd彽+W|լfgh?z9urR i'<4)c29ge<%ԭ[^~gKn6%H$_qׯᄟ[[[?<Ե^|Et= ;wݻuOpD"5xg Z; ST 3R74O6t͑hѢUyHp/"Nk6~Vլff28/:s.˃?F9sK(J.k0& 6q{CcO(`*5ibYp  גd2{bT؈=ZU-i[N bNsAK|E%p.bEXFPTd#ƚr4$f&͐CĤ౦L`tp F58fS*T*џ988Bꇪi[L}F_z<32BcǸ-[7MnI?bذ3I9P#% eiN5HV$47 eլ E[~ĝ0m,`)7CX~QKʠjxPAP{e?AX~B`jEQlk\KiA,/>`!^xNS(pcYq'<[Xxl5ݻ ֯JOKV՞`0q7?&49in6I$Ň899KP<s2Ğ*e4ǸPY`U2Y@eh4PYjVլd3LcccO8{׈@:vH:CV&Gő2de6Aqrܿk}|q8ejر_1O+J2aKDhX) BWXc&j ӈ62@AZ^Jd{I$|hOKqdzĤa~񣣣vvvLBRr9DF-{(vBq&%=K b92h0nk_*KPx X:>SCGٞ0?Mp8Z6 9mك@#TFe釢$@ t F1ew@^D"זX>V~l< !,grGլjO9|?LWW׍7 ݿB.555++Bp8Dл5AƼTB=x ;; yܐiV[ILLPTp]߿?++ 䣡T*wED(c uuu---R\\ 7odX=JJJjnn$H@wHR`-ɲ}}}ioB)S6UUU!_|CX5Mrrraa!˥ʕ+EEEIII%;;;##C S۷kjjZ /_;w. BQ!0D"L޷o@,kjjX,\.ʲ9>A04III:3js8(vdz ƩSoݺ%Jzٳg}||jkk߿B$ oEQt:"XUUj2DkAj V]]}@`ggYfŕB[[ۮWT*P/]!,k˦D;edbFGG۷{zzfsvvvZZH7n8996//O* B^S===qqq8.;;;33j~UNMMDd2977733S,hk׮Q('''JuA._\VV=66vű1̱>P(xz wfx5uuu|>S,c=nΘf3+WDGGć5|Ϛ5 F-P[[꺺\\\;Z6틭୲;wD"8K|VլfgeeիWFcdddBBBAA… իWKR#G,\pjjԩSd29$$EѢ?AAA27L&[bLj5NOOOOKKK.}EQS(22L0kܰaXkk+>~e4͙3g(Jpp0ӟ.A[pIDAT̙ckkgmٲݝFUTT8;;wbr|jj>##cɒ%ZsEE֭[ϟ?o2"##Ϝ9O|0h-_rev5???۷owww{zz~WZZ$}O^vmOOOaaaEE@ JII?y$1 R400]pa͚5֭[_p>|311QWW BxGGǾ$"hoo_SSpD"QMM 3 h$ d2y֬YEEEqqq۶mtUUU"믿5kFxT*]`hbcc8 E"Qcc]~~ؘBHII vZttᄏm۶f ˗/ݻwΝMMM׮]sss}vLL_|d2H$Rr@@~vZdrʕ;wXlYFFJ2 < I$PPPKR?___EAmmmzz:˥hBh4 Hloo~ Tà ===gϞݭhX, U*UjjjSSD||F!>j:}bXT>|NTΟ?6;::~K)RT5558fddZ-JJJPmooꂞ. {zzh4Z}}\.oϞ=iu[jVfSSS?:qC[77+W 7 #;;bX,wwe˖ABmmm:K/=-l--[lRtttr!Zjҥ s=rtt|###kҥPD&N dddM6)/ X???A7l + ͮ.P,** 6lx >{Ǐ/--mooh4ډ'ۓΝ;gooC>8l{1 rȑ#\.СC?9sLKKɓ' .^p;;;z֭[n;wnpp0###;;s2@twwk׮>|G,s8啖lxx>((h(644裫WJ$o߾>((CfE<()))VA@>Cggɓ'd2"T? `d˗_yʕAAA%%%A1[2L{{{ooo777OOO}/±cbccaj>bX,x<~d2B`O.x??zڵkTцL&جX"::z||i-}]vmٲ(:::n޼yF/Tj?LNEDEE1̒2~zP痔/&&&zzz2L@#99d2E,5L}p>NsG. () 7nܰݴiڵk)ʁD\.P(BQc!d 5Db}}3P"r޽UV!nkk;00rvvqssjkkD"ѪU,X0<<\XX| :::Ι3bWWW[N755͝;7::ӳڊ@;;;<_RRy%K$߹svzx<^eeeee#""&''CBB-[ZSSSYY`뽷_^r ;;;___;;;2LR7lذrJ+Wxj<rJX,^nLnmm={JuFquuwʕ+Z-F :~լf5Y z=T*utttj D~~~~~\.ߺuT*Yf %c_hϟǏb'O(|Nsu@Ӄ HfffuuuEEBذa\hjÖqqq[n]vbqW^yD"Tڛ7o޼y{Q@协DQuFEEH$8*RL& gh4SSSCCCMMMkoo'JH$666>zJeFFƼyt:W7004mmmAuAx{{ؠk׮I$8@Y'''322H$0-v{BB~;0J2 KRB0S($iҥtRHFd0֭[joܸqoVն466FDD MMMiZJcccxs+V0 t:FA/_VO@vhrssA`0"Ǜ;w\.={BHR)BT*e2YTTŋz}@@~zĉwj^jZ`S*@y-[f2.\ҲzHFpBO V^=wt 6tBtҥ+,ABCCSSSz͛|~ww7@)F^7oɓ'ϟ?3 PHJ₢h\\\GG… LfFFۓP( \.Rׯ_OaAA~,5MvvvaaPxxe$B_x \rQwwWZr JIW4000>>I~ ..^رco^dNp6660;̴ssshZk41eaaa^^tR٬V͛w{ؤEDDTUUA@k\.) [[ۉ\J599}{d2>| 7-V}}}>|H$LsJKKANd2.\P(|}}/^,>|- LRrGY h4B/P*NNNS(QQQ mccccczҥovٲe::}%Kϝ;܈un5Y1ՕH$xDk999 ݻw3Lggg&9|ڋ/Ad0`민 {{25Gnkk #쉉 DBӡ`0-Z4::.]J \\\TV 7o^LL` 6m1 >ѱa6=|OOψ|}}mll`T*L&omm i:.GFFǍF?L qtt ?>Tjbbё899022tɒ%111"޼y&wﶱ ݶm ;w^x7g޼y H$FGGWVV[(:#`c0|>?$$b yzzΞ== Fݻws\X h)$${zzJ$YfDEEٳ]]]QCϚ5+$$Ãfz Vm֬YR+66bA$0X,7776-\]]%䤛gVVP(0L`ƍ ,uww}g[j cHQLTR+?;x SN4=%͛7E"Ν;D"DTm_~:*t%m֖\=***"4 65\H<99>e\!HsKoKlKvg L3jD mllF8 qBrʃcU0Bh/ce64UGhY,,, H$e/B{;bƟ,V՞,`b;a;&I.L_p '>%~0y_ibO?! 3M)~~LANs4P, -/[rx^R?Zhg3o8ˮ ]~aN ~@uYjO4|i ?` P/Ae`j?*+OG|p_6TA_ *c5X2Vլf5d2>y=AyL Z(]oߛ`Ė<^_Zjov{fFiB\Yhc Lbgؖ/nX `acQfBP{E n1WϨ 7ba<Cxkhh`2Zz=@}oyttt\x`@Ν;7jkkoܸfa{]z$T\)===JD;;[nՉb q!Ӭ2(R(8LTW\tw`0l6p,cooGP)`pW^mjjrss튊Jook׮;::NNN;Bz*x);;;!!4H$EI[&悸?ayhRgggd}jL+길|.d2.\0::j]V^^acc)dܹs' ^ #K.xQQQZZZTT6 E d2> ́J2''L 0qB~eap>.؞J&1:LjFFA XL~* &T*8O؜ٹv Έ5\_f2ONNζ=s挫+TT/^+//OMMm/p8Py`0ܸq zbiii\\cX&H$^repp߸qcΜ9/499I$O< R|ĄlNJJ̄ 3LD-c MY--33Ν;DK.x@ @6++QT*oܸA&]699)aTp8RҥKàJPvuu='C"まi``… ~~~F͛~~~SSS, wMIIQuV EEEIL/þ7@P*wD@(++KLL={ C,xcǨT*ϷNϡ —_~fl6vOYSRRmll^Z߲(g999ӗpp8Zxb__(ZjVf0ʩ` H|||qqy}gϞ!:^TT#6>>x###?722`ggnݺ Y'@cWXXXPP/GGG͛d2 ETTԙ3g˱X??{8peAlll>| ӧL_-:~JuMh"r˦;w]pNgڵk999J۠zT:<<֭[FܹsXn(J2, ?#Ѹwޘs qرsι'FBܿK jo߾FS\\H "---)) EQpu^^އ~xiRVsss/^|mAFcBBBBB ]]]оdMMw}o.//GD p۷owtttvv9sX1OMMܼyAD~ƍ?ٝiii(NLLڭyP-))IMM_פ$</ GGG333/]B>66veguuuBBBiiԔ\.WTrAޯ/Άejss3ս{Je___ZZ+++a%o>gΜimmE)))|Wzh4;wn``ɓ{왚NHHhhhx~QQ_| Hsssbbb[[L&sNNNNzzzyyyTTԧ~:11~??Ç€ (={VPtwwK$ޢ"V ? BR)JV >Jرc\..Kccc,((xQbbbKKwA?Л۳gIMM-//kjjj'OH$Oڳg qDDDMMMrrŋr9;vLxhoӳ_*JB[nUWWCΝ;[ZZ?sILLulE7ovvv"NS*p'ܹs?:::`=66v…GBhĎ:s B:uj``h49OaaYKJJ,9{G}wJJJ .\011rIII_}#G$I^^d*))=r3Tf5YҾV,/]fF1??k֬hG,7j2&pf;v S~ ^&>СC XWW뛗wԩ .8ܙ3gV^ e: O{D9:!W_ 755dx&>>^"(gڵ=x@mmmbbN+,,E(3gPT0{׏9ja{/۴i… VZEPACC׼yBBB ˚5kH$RsshH$F߿\Pd.Mh:;;oݺgƖPZ9%B`<LA;wYnyTs46lذlٲ>fGG`@(:OOOНimm-//7L&FMMM[a`ֲ1"DR/^|ԩL& BP2~~~֭H$NjD"6mE:'\K,7o(Gs\rJ&nݺׯ744_s2Ez[[[/_$\|ʕ+aqPQQ҂(PYΎd:;;8::( ^$=ӧcbb@(00_$ X,~h/BTTeee(lE}݊7ntRR-3gX֭[/_n2vM"`. gϞ oϟ n )Nj;wF)**ڸqT*uuuH$Ë/v… ) .h}ns ĉGNNNRRRww7 JzP(tpp8qDvv6Bjz>**ʕ+.\5k\Bidb999#|MIIIr9 4Ν; .LOO4J266l6GDD,Y3??r2fzzzz$!1K2LA-ZDRSSS# ӧϟ=zdpppΜ9qҥKmլl3 EXXXgggMMԔoAA… sss#""bqSSSsslvwwG`䬬,NA4,**\Pdxk֬~xusslii4؄-ɚ===9N~~f[tP(tR턫TVVBXyM;q<X֬,WX<d2= f⽼v{`04VwJ sؔ5GKRU֣u}iZX Pt)IT*$I|(}!ZAjSGmuthes:ESEITTvb?85iQi<==!Q4E~t(R(vӸǻc}1i# 4I3G-*ͺ[֩.蔃}ie.iM&|Ņ1i\x8ȽAr*mEkJ섃0<{8-T, Z`ޱ'yok9;c7̎ 48]T`z`[0ԧ93}x6}Sӛ#[ 8πӳ~uzJ#e}ZrAwLmCt IG>rpǦ#&ndx! ޱSO8Rp!6MwgI>Ʉ3mcnq`0O qu wiُqfȏwmV+m`0F#dOS_xR<4EQQ#0Ld‹kԏezw;=rpU7NK3RNǒ*5L"`0 Z4w_OMp*Ś> SXG4PsjiRr`!h2R1uO7HُghLiU xiv* Ot+;`.L&rwG{6\9www.N3OnlB[P6Ngzg ȧ86#KBt:.K').SGr0>syVsdd  m/?1:d2I$={|ȳ9}ŋe2ӧsssY,L&uÇ}||@?`۷{yy{3$޽{###ޣIg{ ***/z`` **`09sҥK<O,Cyb1Lu3{juDDD^^ީS,Kpp0|l``СC %^^^^YYа~oooH׮] p8n:x HƓ'Oq8=p8PkjOfp9C 4 ÂX>)׮];vXyyF ?y$#I2;;!ܒ6lؠVjkk\re˖-`]|DMOO?x7Lܹsׯ_j6m:qB577 vڥT*m6>>y椤oVڵ;11lSצSN=zsϞ=MMMV\\|\@9vX}}}nn;FFF>Ӭ,\ZZ{4î:k֬Y_|l^~+ޢg^vm@qqqiiEkŲdEG.'|ĺv*,,$0##CTmذa&00PPOrcǎP6ǏX0## HRVVsΆʞ={b湜|ު*Э[zzzvYUUE={)Rcccccc6fOLLOt2=xG-[;vO>iiidnnn\TTt̙3g@NzUU5kN8188X^^/B^p!&&wMHH8{L&_zA`0g"l??4(={^xb\\I~~~RT(-Y|wa*ippʕ+>N/[ իW=IOO_` 5f^^^k֬ p8L&300Br޳Z|>?44ٳ$I ...dlZ%hqh?={ߎFL-HVVV,]4((F1''G.Ia Pfffgg_|?\x7nعs'-7n$IR&͛7ʕ+gϞ ,_}UHr]\\̙sy4k,>iX~힞pB#tON?88xΝ MM_}L&8x`ZZѣGHo֭[ù\n@@w}R.\PRR}K.d>x.Zl޼9<<|Ϟ=[nKrܹC=zmmmWp܀. :|p{{{fffbb/8q;vi˖-qqq>tI]]]ΝS8zÇ'WWYfEDD̞=ÃP%H,Yr̙7xl6s۷o_vmllӳ͛0[1 yk1UQQ陖&ˍFL&۴iS```]]|ڭ[B6T*ۯ]~=N<@);wΟ?ժUhRh~P(vܹ~zpSn:00PWWWRRoذ}}}A|f͚EXo9{ZvXVH8pZX,__ۻwc}Rkb V&"""111>>bAfl uNcX-pښW_L&XillDAZ??d͛7$ <u֭Z Z%11199[PDDDxxp&Z˗/5kիWs8aFpf͚;TTTԀmpp棁aaa|>|bccVڵkϟO$DRBF]p!̺GFFB~%444===>>^.K$D"|||`YVGEFzd!!!|>fq8 xPXt`0 _]0*/_\RRBg 摑}effKR\~ʕ˗/+wy'11Lt$IFEE!YX^…[nUTT_ӧIlkkC={d||W_E555+W\rEPcH$XKJJJKKoݺo>%U(/_>>>EY&55`0l۶MVݻ+**bFD/XԩSmmm,Kӑ$ 3!!!fC˽L&SJJԴiT%ǻyfsqqC%Й3g֮]ͶfX6::g!}СS544tyWWWѣrN bh4"(//oɒ%wž%rO:%-nמŋ8q"33SR{P(0LA$YXXfwwwFW?ĄxJj*.u֋/>lxbIIIee%OLm_>22"ɔJ%K***`WL&+**joojOo…`k0, @ `0vH[~u`G^pgUWW777s\`0ـI$$$ܾ}fGFFVVV 2Z J[[[!=::Q q8>P(Bz^RIRZ]^^nELM:2LOOJJR,X 򊊊hxʕݭE!|>IV5%%'&&&&&/_殮ׯ_ .BP([ZZbx…!\^`,UTT$ϟlBb\J AAACCCGf6% ŪW"(""bhh~Ŋ===!!!3? JUV)RT:|ZZZHpbFGG5MHĤCm2\X,vuuU(J߿ lH0(//W(/nmmmooOMMuuu UTׯ_eX:ϏK.mڴ [p8 +$$dddUWWl77иL tNqqqlUUUnnn|>ѢEڵk|>?))ׯ3 P7d_nť,'((6666$$P(zzzbNWRRV T**s-Agg'9eggT*ohhX,qqq X~…/`0b}9jڹsΐD"y gT}|||zwx㍧[AWgZ]P&zN99;193FWZ0 [>m/?1:d2I$挌 @ HVcΟ?/H??3 LX, ܱco۶2&&f[,:;;86(pss+--=r@\\Z޵kWoooll^?y \T*u,P(xvUTfͺx' CXX|ouuu\. ׯٳ[,L#Gq7nݻdWŸ@t,XVV"IOɼyb@i4>j<_ #z{{ _D"tgϞ^ziV$_رc l6{ѢEJJVmۖ }}}`#cuVRm۶+WnٲERڵkppZ'&_=z֌zwww>zjffsT*UAAÇkkk/^u^B>|h4eddNk2uԜ9sf/T*GGG W\y恁m۶[ɓa^Va0.\Gׇ-\pttWToĉ~۷A3/--E8qVl6Å ??Qo֙3gr͛7!TPPM.X>HLLcO>!K/͜+`0=C;+HŋCTh;6w\$%I^^^@@D"INN\x{=x_T''bbbRRRBSxXlٳ  +WlתUD"c2lѢEpֱ{j SN]t$_|122B6 +++-Z:{??͚5 !$/^ jㅄ444TUU'%%_zh4;w</ׯ3gξ}ZZZrrrΜ9m۶{x`P(H6nbRRR._|…O>l63Yj섄8.h4~AonnB0[>oX@,$٣j[㰆׋ٳg'$$|WPTŋk4wuu8qbժUG`̈́Ν; CLLgxx8D?sIIݻ.]'9$+@>|m˖-111!!!%''O>qDgg']b=a0V~R*jii9tвe|T*7o^@@ɓ'oߞ|ᎎǏx<\~9Nu'O^xkCCCl6A.[ԩSolp87n8>>j__`d6mJ555j322*++an Nd2/^j]WBĶmRRR``0~/锆* ڸqA`aÆ?KQԊ+6nz֭lBQXX |d:zL&H裏,X J_~夤(h425,,lqqq%(((==bܸq:fppp}}=ΐ c766^t믿6 555T*y&B(''㹹aaav111?0<<]6==6͛?P(ԇ2>ぁ贴4BBBB!˝5kj]t)iooOKK{e2 }Y,ViiNj'::OSYYYEEECCŊ FcPPPpp;A[[f7of[z9sH*Hf po`쬩탃 ϗJ'$$˫5))) 1$$dҥ111 / B^^^ezZ~饗9$hd2 Bj BE `~Sl6fZAVI 688STTT*RJjkk#btttCCCf]]]B?&?dggG|>O9G}Gf!tɊ±_0z}www^^]TP(v޽i&___??uֵ Tk׮߼y3##cϞ=$IFGG988344dX<<~xzzNKLL}x~rKJJB###eggkP)c6x QQQ˗/G?w9ٳggd21ÇCs \(===KKK-[VSSm6L&H;vlhh>iiiǏ߹sZv|o@VVV^'Ibڵ<O/X~y^y6lذ`s*ʀ+W.;;jr8r9tٳg]!-7oH$˖-̬ ,,,lnnt,kΝJnFHoNlf2@7oYnJ"`0tuuZ,Џ>ۮ01 `6 ĄNj:Q_sj___[[n -𨬬h4g!Bpl6U*T*陘MHHP =֪jJ[TT`0|~xxxCC^(jҥ]]]E9ݝ$r՚zMhTlvUUOHH 9ѨT*e2YWWWGGA>>>bxܹ[n|f+++q& vZv>V>qF0jjjRb8((hdd155AAAя}} 0>>^__Q˗/WT$>>nwuuGOYYłĤ zzz"(6555\.ett^%I__X, mTaQ]]=22]]]-bXCCCZr֬Y......zFFF;E;z{{uvv®րRQSSc`tttGEE=_6>**fT7nxR7o<@hCJUUU9sB&O?}RRRnܸAX,dp2OOOOOOP+**e2YOOV5bxQ?x"HѰl@CCCf9**J @]?9RAi7<`ށ`+;;;}||~XϐD"y gT}|||zw=5{5k< R>:;(:Z6++K$So?Cl&aXu1 y˜L!__f6 z~~~$IRn&&&}ώį `0:6"d2 $I> .hA?Myhu p zҔ6Z @B;V+hyxZKMfp^%O`0^y8ZvT;;]CQdh4M-\/n.48$L&,bP=N-@]i{$I%OKӇӍLĿ뿚Le˖!bjЃ玝d2a$k=cǑ6Gj'q^vs.k9I;9-8ݼp<1\;`~#@ 3EEE.] F*p/Q ?hwjQ`z?W)Q<ޏM᩿=/1>>~zQr?h{#<nZA/tϷ!xe?ޓW"4q#2Ӽ`0 hDS}P8ȉ @W;EQ...3*sL3*t(3?t H?J f*жSe0 y˜LA:o65czcX,]'lyBO@T>܅J%w}ע('ϱ`] Il6r̖qN1 }}}fHF#rz?0 X|݌KJ~SݔCp-EQZE8hl6@{{ҥKA0M&p Vb8&a(''GT[$ᖖT@($!!4@+'|k4'},gl{3gNjj^f`ϝ;?h7=DX,։'H|뭷 1 y.$7YVVt*|AT@ΥAGw[`JSa.řŇuDۏn#u҂)BvGH){vnjB9G3 `ff삂XH+,Ћus*_hkko~Ϟ=jl6`f鼐!cw iFߎX6}iϣx3uXSO! <`>(rrr׿xЁ;|эW0 `0cgTG`0 `0 zV0 `0oƣ`0 4{᳟%tEXtdate:create2019-02-24T12:58:04-05:00*H %tEXtdate:modify2019-02-24T12:58:04-05:00[tEXtSoftwaregnome-screenshot>IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-graph-control-left.png000066400000000000000000000066561477354127100311500ustar00rootroot00000000000000PNG  IHDR*}'( zTXtRaw profile type exifxՙYv#=߹^B@.9ww)۲/-[G]LZrkҸ(yO a(y=o X< Gq_y,Ϯ>dOc7|3fb NV.yoUZxCwwW{>]qCǸO_{s.Dd_Ϗ'=붮Ō{sōW3-TzgA&< >~GwȐp 2N0=%<ӅB4Q Yٷ/<=wg1"B{[7gxK "gE@~4{`:n.خ~/ѓV8qܗ;5\ه䳿TDǏ4N.!J'>%mbB&8Elo?J{B RA DbLGcC-]J)'M%r1fQMFMUhVB%\RKR%,\RkmMK7f7hK=s^zmGy(6eI<2l/J+/]e6Xaǝv޺ˮGQ_"s#jxӏ1r,fDL'jb1Q,r Id"FG~K&7",t3nDm(Ȳ|zMaVVP8f(K/}oq}֔SX;Y9{]1)$cu96ݛ!Թ5 9ڸ7 ;9^=pHGlEӶ;b_3^AhQ֪FoΉyjbocs{(s/2ckl|&͚/q?۸m+ ŧ}S[O J":ZgD)DpԴحPX{H?Oga=+;?\m啋iC^_?'>9t3O͞z) ZxF7!ׁXL5,V<W@{R((u\}Bܸ4 yj)!F HBoAt{;hgPIsםwq=)ӰH_tgA'إDHrA f2ݒ̤+\LƎ]˲ f§ٴ*1B1"AS HcuH_H |9uPH!W@.u =_}62GqheYEdGD L) @4R Dy0sKhv%*>rnns .02Oۦ8̈́{,lΨSp8de4l-q1ck Pun- ?E\DXs4lCXd0JֆNjjmrsB6KU(_A[4@>hKI󴟄 iS]81>e,/j׈5:KK7]=B> P> h{aoWqoCYÝpoL8rַ:~0D9 _~6ch`u` ƹS-8 "f% rMС:FLQ+F;j2m֢d%u!kT۞pkLO0e0`H~h&ъH晩È̻h֮zR@=fNznl DȒ|ESP Z-U&a9lnq["Fƒ62jQ'v9.u ENm>lr(*ǫGB{X E j$c9*0+ܒ~BxwoOxԛ0cRF=M֌"!6gԶ׷*~iqh)Jy(߹p'z38SbRysK߯ߢBA-խ.&mا4LR&ﴵcONWN#aȄ2|o(63&`e1i-jpzJ&Yc jZ>=5MPi EmX1ʠ᪱ @-n=eGX2KU4%Ea"enUrB9lm[1Y+)M[=]e䄟 1yAP5 5R]7 {?}afBX !Ҕe%uHj`EUS 쫧F[z`yo'~vyo'~^!R5W>sQyG rh4дb)-+`@&˲*~l<˲Xx|F [ݘL&l[a8X,jia,]vضa5 ~nCJx<0}|Т,txdZ0mQ^F\8⭷oP>4MR!PJUR4Rz)%AB))+p:H8+iH),;h :Ut IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-graph-control-line.png000066400000000000000000000144261477354127100311370ustar00rootroot00000000000000PNG  IHDR("zTXtRaw profile type exifxڭm#EYBKY\iW]eH"HbZ^kU8w4Z~\oz^lY޷I31,~`m݆e|v~;=_sxfo㟿A'x IƳUK;>ƧhQ>Lulg_d!W]V[Pev۾{ BF EN>r/j6{SN01.v 0ˍJC0H eP#=pb X6}#?qȥA.t7߹}CmD £i@axY-!]HTͩkQgF @TCWZ#5bL J^ρCiPnծ+eB`fZl+5jeVUg݀QQ7r:ۄ[TGCeJ@ vD/|  kkKB{B3ۊ7z@R.u.;8iAZlIFN{! %G$en|]635bש֋D#̰lC"vHdF5ruaĢRO Y(u)):j3O(b#['bGJB#6}ʣFb]kB0;C~ OtyG'>tL&rsF'߲+i4&ɦfV*bKGD pHYs.#.#x?vtIME-@?IDATx{XT PQÅA"W)'TsN!Sh=(yAr@!@*+tbaih ]+'m_R_FDD}K䚚ޟB2NyjzlV-Afy&DԣmXˈ2QA%'""""b-V-,nfb/.zσm?^w Qo4^;0m4TVVN_F:}4\\\XD k|GBQwx_uu5,,,Xǽ\]R_œÐu֩ Rzyy#.-sU/[o˰7tyzmźuַ",, (,,얾'@3gDDDΜ9 4jll#<<>>A )@BkkVQQQ/ ?$~MOBgoW$P^WWs}sqAPRa]'Nj2x ;p t;ogmΝ;sΡ_~OR*b]<;Ꟗ/_ 11SNEtt4 xyyaܹ)))8z(jjj0x`ã<,X{H$J022”)S_CS FqGH Jsw׿C̄Iļ`.ލsFdnNl/؎6BP y,c^Jz .mBX 7y]NH1w cҐIbܶ]_A@MM 0qD4֭[qaڵhll9{,&O7bj+WGaƌ 8~8tR$&&bXf o999hmm#GI qYbܹHIIAebJѣGKK'ڷƍ|իW{nҮZ Xbrss0`HII_~)pႸ-.,wŻ GGGlݺ(((k<رׯW[Lwyǎŋ / ::x::c{v.mNKVE swGT7׫BT44_} }>͜őٜ:XvfZ$.s*J맑Sׇ<,l'Af$ávm~ !>"@߶҂Kb}?%^z%AOOP*(++qssèQ埙իW#""kGEpp0 ;v,Fyv",, sڵk;Ɔ2iT\\\]]1vX;wt^^^pqq-v܉-[@*}[u[[[ܺu m67߄F?Oػwc7c 899A" ,pXh#/M)---χ<<< lmmLO,,,h"qa;.ޞ(..cZQի;PXX|T.u]>H|BBԶIJJBXXYYj_@P H*NB<cEdz~Mco%- T050m*{ȬnG8vvx}=_\go++ف`y08/ޏm+@ooo8qXtiF$$$ŋhllT*ECCjkkm,--M>UUUo,khhCyv#y(J\v 055G‰z[cc#كe˖7zوGdd#y9L"$$'OƍsYY8@q_SS!&&yrw@FFo>3gD@@{9Waffi:Vߘegg#)) !h I< tzd۞2h =r@j{U= /ޏÏ?bE=qW px[xg}෕>?x{XJ|'{ߡE7n"B X'ng[vvxyhP6 =0J @D7]y4eҤI-F޽ׯ_իaff S ^%Iyؼy3lق  0gƄ :-Wgyebb"3f Μ94&99#8y$|||:Mkmm-~=|_ǎÇ~/--ENN>SСC؃'m۞B9scL<R_}vŃM}ƾ,HLL̙3nnnerwKSkjj 8|06R st_swn[ 3ڝMgi߆&D; RH4f rBE]~C~90p5-O?>ןԞ|Y4+WDii)>s+5ӦMî]PRRJ&塢TJRf\r/_Xl߾Bzz:qYk']JuuuHJJBUU@OSSSǏc֬YpuuEhh(`޼yطo:f(J ;;lllPRR"___R wwwHR( رC-MFFF^$Ҥ5]1c`̘1Xr%233!HwG8w煱;2v*0vn;Е>|֝GnUm~3]5f͈ɨoGt-W(q4~=a'°{ b^#D44ab:ͭ͸eDeGuzwǶKP]_v]wcoV+9 ur\-(}@lڴ ׯ<==1hРvyv 0117DEE.]ɓ'6mO?v#ӏ>>{mOO2 ^^^~72"(((@NN1p@>͛(//ǰa0x`m\\\'DEEaɏܧ R)LMMYfa… 7ٳk֬%KAxȑ#Xj`eesssHKKbXt)O$ 0eʔ&Jq x{{:TF㮒/ëo #ؤ@jj*xUQo|T_vv ,Y_~YE=Vrwl*sUuemҥk.ꥶ˳8SJ b̠ed}~PE  Qe2T*$LےJPTd,f븫Coj]b%!"畈z6/}/#""077G~~>F5PT(((9˨ce乪:*^8aGacl tA:Էԣ~#x%K_ˈoCw܁BЊ7"`nn.>eԭ2\lwբ݋cJn\+"xxlonh[ɾ4mmO'd""""""D* """"""bLDDDDDD2d"""""""DDDDDDD  1@&""""""l͚"""""">UE#fIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-graph-control-minus.png000066400000000000000000000047701477354127100313440ustar00rootroot00000000000000PNG  IHDR*}'(zTXtRaw profile type exifxY[v++g=${*'I_:*@hoGN ‹sI!eRK9J5p:HsS $׃ϟe^}KAƵ^ Ůqz-;k^Kw\8eof=N0,c=!N&>𩮅w[1#S9v <cwk?Br (O]rOr~c->v`mO[tyZRR%\F w%iq/&0fPq@"^ȨѢ l1wqD25MFVc| Ƿ[A F f|g¿\o 9z:ݧ g?1 к0}7Z_N,aV؎~.3oq DНb0pLQGN9n 1Gh9b RHRP˜S9,YsͭpI%Rxj’$K*MYf-*ZX!,R%T K7nZ{깗.]{m}Fy!CG͢[1 VMpfeYg[+ʒ#kŚ38yg b$;g`,& sv(9"GF1r`7ޙӯx_1s'Y7A~ Ӄ5"Vawօ5ZW%뽓"\,UYs0 Yr1l,d87͌ear_0Vtt&C⟴>?sMA|􈆭YK/v@aYmMhl[ {sPL 5{=?Ws5sՄW̹W^1^MxŜ{5sՄW̹W^1^MxݧO5u>Մ}T^SMxݧO5u>Մ_&HY1Q*=@5Jqwe:dZQآ v ~B9J\ BFZM2B~M Af#!e m9riBD9ڨ 2a5ˉ1rNvCblMY&HT M, 18L647/:΀IAfEPMHr,u!) `~GB&VЇ=a,,:M*(Șjr \NCCBG>n>Px!̇͞ٿѕ'6S_< 0<<=vXubyxcQ"iI(2w`C0շ`Z9.Sqs݇Y+^y=džkW*hfAꐨPk}{Z| 1 og07&6hohDžF8N &X# Y۶5bf,bWl7}#3;FSNù4;fhe㻯p,fۢ3a^9r8N׈  5R5ta>32)ͮIIZ6+.ʫxjlȲ&֬YX}f-0=kb{aIqX3N!19gGKpZ,NFg Sxoy %s_0?y5;&Ƚ1=0*C $ʐ{1FYVZlkTUG[D@ySGg qn*qV|@ql| !`TB]8ZmAs9w 1qtÆ{:ڂGP3ǧ`br^LxGG1uńwyQQLxGG1uńwy޷SLxߦO1}>ńm޷SLxߦO12RV(`lf5("a5kq6] ;xiR80; ͐"'D'J\Jj(KH E=[>i@B*4*2\ks Y l4+2ȂZVzIĜd=! e1RvlBgM`PcAl3`RVIZ:D2R;\j3$p4_P72Qg?Ù0uitH Q)ʨMQ`V#,cdE!ljM0258NtQ"-=pƗ,ɰβn yP) ?`=v?5ŭxM@2aKB7,G|)Ծ㸑L,{ZL2 <2/R3+ bYiKzzGɹUXOwA)NRRB5 eUF#ln^3VQ3ln 2}ETt;7lF?Ԝ&8\%/G'Dy c[>6'h 7"T꧝^:"ʨNӀ4ki(q>0mdVHX.=6''Ilw 㻟\ql, WO 3}iQn~r=eɃ\5rH;#Bԍ^q/}~>{z4yMvG؞"ѺE3[@ TM?1v$*ەwp~YMk۬' a#Ζ' *UQ>x(az;IpʬN bvsϋv \sN7So~VN. ۃqK~`aU(#%#xdkgx~RLu*vI؁ WZg*6m;pmpS /ȃ?EMK9սךQ#Ht%*``C/cUMnWiTXQc("DǺPT!;t4 G0c}+2- jp ; b8%s̻5FC.vۅo bs[.m]eLؽ@$$;q-" )-.ɼ|O П]CbKGD pHYs.#.#x?vtIME4IDATH헱0E,^/b|!Lΰ[dX/\0B{Z*03>YkADZgyADh=RJYYkq9gT(x]>r*=~' ?(ifqٶ_d.X)IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-graph-control-plus.png000066400000000000000000000062631477354127100311730ustar00rootroot00000000000000PNG  IHDR(y  zTXtRaw profile type exifxY ߹,3p|ܓ{ږ) p0Ͽ51I5g+X}u};ysqr;Y |g^qx^WНv] Zwߦk9??nb_̺ḡ_g]nף|Ǿ3wΫl]>| zxED<1euYbS܌zq9Ž+ù-rޕwb4;a\uootmp_w{g#m/3M( 1@-_uqgzt\w6y [C9uf W|ziPOyWX^ lt\0~ɽV88K6{y; ` eg{q?ihN.%?`Buow_˔H!bLďB R4)$TS!ǜrΒF5 %I"UZ %TrRJ-(a*ZkklݸqEkcO=w3H#eѦa3O1:rPZqjXaǝv޲ˮvC#jQs7x7Xyᴜ$ |t .3[\^Sl$E撂3"q9{ /q3) 7rF'3 ?q{l\٨Y>aSvTRq*[ȅb9nڥI֙p뭴i/yԗYq=sS jtHu^+`qquJ{%۶cY]IM6lݾCzY 9xjP3|$~l~w'PID"w!%Ҽ*R! ;ufӎix`ws=AOFE@N 's1<<-۞<]bӇ *V_Tͣugca<# a*ܗOMZ$fBvqv½K;INU62:CX!tc9*]U |p^Q]3DRjzUꘄ8ͯS#} #Au!=1W\HĹ Iu}f/lvs1]iRC騥ex=vÄOFRv{?}Xٔ)G(>a(mrV)%t`9>HEEW?^B*%2(:ݚv_GƠj_jU]"k,I[>ۋY murBNsKt A#$ߗLq.4WBxYt&#VP K h %E1WdKW#5\ R]85_9x,JaOBҩADj0rQDC㫩m:UaZ$r~ 9wt9,{ s1 fsq2UcëV'bKT@~sy/xyXÎpmeJuZ߄ ԘV0k/C5 ?]]<5hPFEwD` EVh~i֗de@#{ڜP*Q灹_1Fp3([ ~-8Q`SS(. c€jژv 9w>_ApjƄ>65:p'9ѹ85j;nLrH_5~PaBAJA;kJˎݐ}P珗YVwd 쪰Z_[kZpy._1d\RNH&͡T1c(9-@r A昿Gi utMlD5Z\p2^Eyd8zCӸ/_+kט_ҠOR^h4IDATHՖ0 % ILu+YCSS:vd12d;), 㗐EZƖ0j^#sv;vD+;0 {VBH1c%󃛊D8KN'E~m[LӴh7kMӄxG.KiZpzx<( B|hqc݆8MSdY+jE}>kI9s,(sRE=M A!Z'y,7 2MIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-graph-control-plusplus.png000066400000000000000000000077051477354127100321010ustar00rootroot00000000000000PNG  IHDR*}'( zTXtRaw profile type exifxݙYR$=ߵ^B]r4犀~j F9to\OJ\pChR>3=߷c<ZgW!y|vU!)59ӛ`X^/bG~?yΙssvE, ͦnnKYIʺŷ0{タ5eX=';Y9{]1g1ú-!ܚsj1[>wSɜcY mwOb0 [dj}r<t2"نGaЬa:z_8oq?9eOv]8oq?9eOv󘾗q?{󘾗q?{󘾗q?{Sf$ `{' L cݪ {/ٳfPldݫ2_cPdf4%FaY2+t2_n#Lkw)shcS ,sQ;e YĨqj&'ƈ1k]me:3huliyv0/هΰIVmR\SV(}p8~mZ;Xq{SfHJ)\qilO:Q94R:b?)>W/mz08#c~Z*J Z.'VD(]c3Y؞SRj˭1}mib@kt Bs0{.J!U"fcB,Pn#֯/u@FS+<^RWibMJivE{I/ezH)y2b]=皲4ey;vR(ȶDl}6}r&) xHT* #׵"T%v >Wi"ѩJYlqu?(<`3THW)t >4d)h8HY,r¨yجN&\>QO(J3kK!š% f-.7c/2 l%/cWbXBd0FF?KRs0$曺N5KHtN"p&[2RN˲Qќj$@' UA.wk "SOOQ.C=Ʉ<6M7%R 0[ Y3g/2ڡ|xaQĸ r _ >lHaՄerkTRU: ;V&bwMb(A8mf]c)]p \HDyP ~$zSN.+5B6pä\̚JL,Y /İ#"EnQ^jLvAl .6%vfh2Qsvʎ. ;O 4R0$~I#&s[{mh{n%) Z6⭵k,Xݮthk`m$ YGcZG3>*?$O&eAKx~CvZr@ʅb\)!Gz;DBnBz@ȕZ7LeO Rɤ ׊ ۲e?7]51oFth CPOXlgOjvEMRSO=oP쁗Aƈ AJv3ua-CSPl AX]Ghĝ]ĮE1%ڮzMM) QddIXZWH.*r3t;e=ܵa$ Am:gՕo >j)8sK1Ԟ-B=;[;`N &jƅ_Uz|g=.ѣwwy ̧)HlYێPݾ6VRRsQ3QD.]xsߨ.=;%cVk1g/e4fl/<Tv~AYI^ vr"Tu2C4iLmݦ⧆1*:|du|m0lbңZ ƗN"ХX|x}?m/ʆXjPKP N9:g%Z($@>}{̑ "-PZ10@DD!M>Ԑp!$E.? vȍmO;U.mz+}C2U֙Մ#AYȕ[>F vFYS}9-9B*bdQ`JD˜;t2LjtF*@bTd_eGwǹ?ȕ(8*Flż[=aYL $4Aǿ?}m*#PjͨA{":(;DUkB/ dUE(lF԰\J68݁ǹ8}wqy~jqyAqPTL^ѧLSHfJҁ64ZZQ٦+whH;58?;wl`bKGD pHYs.#.#x?vtIME:oriIDATHݕ10E# p % Pq 8%D!{jE+_ɖHc Z"2ʲ$(} Cs.dYcLT.n[F#,N c EQ\K9!٪U+& Z7**X 91/ǯ=Xkk4>ѦB+n&ܗ~\Fkd2֬VuJ/saٰX,p8p:.lnw]:NcO~^3o#iJmG!%q<k4~g\? UJG>=Iޣ|)%ڋ{)u{9J)[HV @"IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-graph-control-right.png000066400000000000000000000070521477354127100313220ustar00rootroot00000000000000PNG  IHDR)f+ zTXtRaw profile type exifx])Y,!?3;+"nU;r2YD@:9v{c.Rs[lsQu+';) Po<O?'_]:YH~,|^,\} {X5^ί ⳚB +ޮ>?qyu?O_] "l'6#\YB,WJ|:;!A$%6 !6sg}0@C!4$1+)RJ9TSK=s9l5PbI%RjiPcM5Rkm7%,܊k;F;Kwfw}FiQFm |fiYfmv׬iզ}J+*k;λ?Dרɇ}5yf3j ZB$Qxho1-ry"y&ɂb#qO[~g侌K_)rB9g{"{>(Ȳ|zMaYkFYliSfVamVU&.-Rrhmm[(4Ĺ=c}-J֞E{5g8EtTK"ۜ-3o+/֧ ^ ߭P˅ 5pߦY;1H9Kƞ Yna*w d黆ܻGzreȽ{!^ܻGzreȽ{!^ܻGzr䫏"SC[+ɏXYFhZiS\,y؊cGsnxuPgh+k T+q'e\14oIhLjFL:zBf CP~$ъo Ztq xeO@ε.yI hlR3%]/M~" a46KuuUsQw*Usk6q!tF,VXNT*"Jo䆳%)ƕ B:4u?g6we-Jfʢr z>6;Mʎ"7H\v/6w}]S4ip ڭpݣm^^:ViUFc#A[d*xMI_<3,u'Hړ6<xИoFAGO*'?M eDF,h3dоXA_ JtWg0KH6Zgm'L ngZze8(@@kz 2,i[ZYkQ sAXrQ!Ef,7(jIip"ϴO2`*&.MѩvtY qbzlBڶ_4!ln'"h)Bz8U&\bhԨabJ ÙvsHQ4{9f6SkD>`xn?ݽXJfd NPjlC$/56CU,pE^9kͦ\{|PnRgJȵxnJVୖ+=mzL+t*xp-hTvX!dScRD,-[>rRkPIk!XQ-gLފ:$v\tVY*%G@NAZnrȾ{8Bj *)X|B;#WpMS^9fI=a̾ZG{Jz}ѯQEiaN3*Rz\xy4 LEp 5Bdzvn}&Mtt#6Gн{A >{]mA-Wϔ ӊhJ'ЏR,oe : iNkwDɎ(0z HHe,EMz5REt^Kr I!Luo?G𬂩SbKGD pHYs.#.#x?vtIMEbXIDATHՖ@ X6"`,|KVY|  ,Dl,WHIEfe]ܹ~>?#(Rh^B$AmۘIR@v;%}BPV1$^J㹃 @)=m[7B>}u'v)BK!ϐ0 q]nl6#MӷN[ KӉNd2qՊR ˲kVx8F#C~VX<Njjgv_.hfʥ uՊ{wtFx>T|>^lvkk8} `lƅOV=. 4oc;?cW>?xgP;Ncѯ.v{d+ §Pg>=B\`l͉ 91N)( yq{w^Nzvi,0̟г?-yf2e/ii2t@iqߘB(_Li֯<0u~B_j R?Rl8C TI~s<59Xcea!M$] iҋ q mUT֨f̆h:l#[4`::0#blO:m3Xbnu[cCR:cg?Z)i93>Y{Y`YXk6en9N`.4_2w9H aFrtK'w_-oE'ʥ\Խ?9QC‹im–sMwkLk Nk]zT'} ^$v.;3mI7AF.;&z{WN[#;+na; mdq :ψo#'`h '- /746*"=׮.]NNof"'[ttyrZDZK# DYՔjmxκz΢Y" $OT o9$]\ò|V*Z,':ڞ#8[,O{:U?a *T3\LC$2s\c82:||AH{|]g3rף R"yg] /@'|,NMSIpI< u^jg靐s{D9*h>HPhijO #y2*sw.QXRe0B>Bo7$i b 3n$ * u@nvXN@y Z+fFRD(PِaCNہ{` |hH-!ڢT[<鯢vSyTڊ=^-BK)"KKVLf1L G~+{Ϲg~{Gr-@ g(@ !@ B @ &@ xFEPή]D!C&//O@ pp@ gT*@ @ /+z=ddd#ػ׆(!q'gg׮Ux]5a#3_~ٞKtى h$!E޽qvvwwwBCCٴiSd2qsswAB7nAAAj<<<>|8)))tԉ5j HػwU~ݻSfM o>I&rڶm[iZL&۷G"pQ#H]ZgggӶm[\]]QT駟>4ׯ_'::{{{\\\^\_b899QzuvʩS*kHR4=fDO]VVƄ FRFZZ3LX>C57;zTF߾vh9stlz4 lǵkϭWOGNN}JYSC:%{ ?&h5 qێ{1^ }yMBa\/nǶy3sqNP6eDZEq̉Vqfe<Ǚ[O_~呕ERR7ofʔ)Vz뭷HIIѣ(J1 V3l0BCC?sV-))I&۷cʕl۶7nFxx8EEEOޝ~WF^{M;7 ӳeKǎХKqYX <.u G,q4`2`4= ~:C2(U8tXu˧?%y`2oҗWǃC8p:/#mHSîGI$lllppp`ԨQHRRSS-^iҤ /K&L`曄ҴiS,Xŋy뭷v ۛ`.\hIێ; bƌҹsgB/i߾=5k֤Yf1Xׯ_+ ꫯ2j(4h@57n#GX4h]vZj̜9ROD"ATZ[roIj VZTV ???ju;;;;vX<'66R?wW_ L… ɱkرDGGӨQ755TZ|[#FаaCj5SNR{i΁GInԬU+N qcGjwƝt:;V@GfRl ~m rd %tQj6tvm ͛;re̼{w{`G>DyGIƌQqҼcR x]-&~, $ܸ!aj 77##-cPRi>#gРri-CRĸqZ %lf{;mî],[VLz\\L[+m V[NwB*z-̭>xWi_U}@v >}x{ج;v<:^ԩc` {`&[ZrSClbMJ!<oo FTph;4ԩC{~?dPQt11jFTSٰ9!2ҞqT9R^,}}Dݺ-GL|*oXPA8ҭ=.I-?qBƴi*r;bbԴlhБMռJRZhiubEZs6AMW,LYh],}22qn;_O̺zD=ߛ&KS;v &&$6lɓȠv̝;777INN&44'OoٳgYf }p $˷َ?Ί+J%%%Ѵi'i_N&Md21dMk%Gu%00ryqqq ;;;^ JII*͚5#77˗/WZ.իWrnݻ?2Ϸd2U;viV3uj 4mjo_;a߾B+d6[ֶ°f)9xІ IM- ?_BfR R HJ*d׮B[HNN>3Fűcp7Y&'0z HI1{DzeLr>32dܸ!Q#:-skפ_/GJ EF/~RSeP?V㣡aCGbcUH[deѷAߊ'7Tφ "z\a#-'Mk4%-KP)8yGz#ȷlЬgp{|T#{Jap;Lr\>'j:Ԏ#Gl,m:9q^tHI) 33ΝgW庼KE"m]2232r8%^`wy-5gHIL,|76Ч.ll˂9r=Uo?h9RɓקM+Q#&\Ŗ0}g:*$>_ױ|yĢ" 72`@~MѼ6geM5|gl0T7E38h0C91{+jo$Lft!00҇=U'W/ֺ赃A)ۻ3>i<*=>:Qa\]-J̫Corݗy!ZϹ>4\Ґ}m.p[r%xzzˇ~HƍQՌ3B?F믿46m! Ǐ?IDD2  FBB=~#G ;X {n>' M=zc  ׯ_6lٹs'K.k׎k֭,Z.]TB/((Jݽ8~Ǝ… 3,&&&E!?|ڵk>|c{|SZZʔ)S(**0Ot4ib@4ѧl)qq%891Ү]o^FλjUˈ\Ǘ [/(&F>LR)kC=W;p8QJe%$$Tmͭ[ P曥[Hxxhph1c*6KGgtgbRJKaL% Oː!-ؽbōԲqו, s'c͇4vkJV4 ª .`DI\&  J%m1"{xcHۗac;ѵwXA.:z֡PJeuk'HDDj o-eepN\˖z(C~thQz,5)62{y\Z.^ZyQ֣UoCBHNe$'?ٺ-ViJJEs9~-F^xA_rrT8ҵ^WV\iLab{<~%~DF ϰ&H8mKRХ^zF!SQѺvJ}mԌ B?_uG [OkIÛy_}ž :v%${'-vu!H-K Icc>&?>۳gO&NJrҥKxyyY{J=4իW_T>tIII!$$rjOs2}tCz;իWر#mڴaUôi+'00@[ח̾}₋ C aL4Yf=ع)((heGGkt!ٳ|ll,]t^xd-[Fjҥc{F:uDaa!z"$$?ԬY>& V\|ٙgqOObw<k͕ ͛'Rrs%וrysdKk$iOVzO/q;'%:ڞKq6{w{v.aVzFHBd7P Md0iR J%xR>H̙VWǓߊ~O&F|1+3Z{G^\(`u.4* ˗1)kNcG/ݭvvHO.}@-#'GJ b S(ٻ׆bs-,p0R*5O+ϛ +7i6UEUdw[gtPXBرZ/WTvƠ탘6W[Kw_2=6PмV󪷡Kxi>.Y'[r*c'Kf<-=ࣱ~M*vMF - ыpp$2&Rُ7G?̶3MRUf999V>;;R'^^^>m=~ ß? {!rss-:۷ooM\\܃kcL&{E333+ָqcz=4nlB$''jUvw,^=zXűsN\-8 YYYVp +Jx\~g5\ Y3ÝI\*ZٱÖO>QeK1;8; Fj6qHŞٳo3{_ %2Ҟ.]ʘ:Z(<)d*E"1c>6m͕Vn/Ӻ??}32)Sq_.qcGbce ٗNuYsj /?8a0a 7㘫,k[FjCm{]p:ɀLbn)RhڰJi7#)-E \Wh9wΖa:u=[q|3gdl^ΤRciU^tw'O[UKEa=M2U9 x]e8!cnaaٞDz@mk#艗Ƌ/Ulc8lي몂E<r r^vA6ֺm }5TMG~rg8u1[k#FA~_9s`Μ9 \Mn޼͛7-̺uؼy3:^ϩS駟u/cǎe޼yܹ///Z-Vs:V3gJϞ=6mZVk%,F#ZwNVVǏύZ{0ĉ瓙ɠAppp ,, m۶}v\իWYd k֬SN4dzsN gرܸqLfΜoaӦMDEExb:ud]o>,~W Vڽ{rbbbʽ*sqzMHHd[+7):ũ>IhLԭkn/ii2\ryٽ{:u*J0ޓ￷9R:u'"qJj͟bL41 X@Ng$,ZÈH_J(}/J9qBFA'd lx%7cG=FTh̟/[N7,֜Zø8s %2oe2T֞Zh>0,Rk9y$3~+`+ #|#JO=9{ؒ VMyzo '  (,;qՄ U0sO^ձq-?`l&_?Qʶmr֯әz8`ciFh[\΍?}? Te,9Iؼ$4U=?k2+O^ DJ}2K6gl, ̺ul،ΠCos)~l b[6֧GgQ/Ezrg3/}"]sAgБq+9Gc9pLj_vrp SF<=ǟ'rQJ)!v_,s 4ǎqw'PZlO7nĆ HLLߟ(z;D5hЀ>}7w&((kײh"cȑܺuq%''W_=vZ-3gŋ4hJJʛR,{QT}wK,… [«T*f̘acСT*f͚ERR* vږ֝777˧URSSڵ+nnnnݚB-oFƏ/~~~|| 6̒%Kp!+V///ZhAΝ^z0/'jHN,XcGIJ=Zӕٙغsd4o=?Q+W*tIʜ9 jrx_V*oԫqcG._PlHHRA׮W% d({ ^]^47Ťqsg{:v3~|I]v|C߭}1 n_z K. >ڗ6mnVa$tO`athӶN*NġM_y>#@Unos.=QoRܹ%gn['*7-w<V.b5rdz{iʒ@J0oOsoS{jw$CǓ9;laH/HMO4mЗ×nNHe v[ˢE~B?F&lc5fu,8߅4Z҈$F|o‰ =6"6F+;wfd{{+WCOO@5iݻGWWpL&˗) µk(!`vv7n Yn߾Mgg'Hl6˕+Wd2 EP(87nܠT*O^ʕ+loo388nܸAZrիWftt!d{ORwazzzN?oM{{{ Bi.]ܻw;w \rt]r˗f``]xt*  AZegg|?S;7ol vffo-oj|;yH)y~ 7h4-gkk MZRL&׾FR_:Fwկ~|>8|k_ciiwy_~9o__R(~P(ضL_4MfggWsssd2~_+.|k_cyyϿW4h@XZo9qX[[_:333dY}]H$ ,ڵk],[  o|w-nBP_F,\o\|zΝ;wk ‡|[en޼__aY}\e~.RJl?1kkkڛy/e mkbHThH&yko}5z-^z%fa8v#q"O<.\h5<{,?N>ܹsr9.^ȅ Zp86L۶z*'?HӭG"d۶S###\p!߿O*8CGG_q7Bn޼ɑ#G?3lfqqw_ B{'Hx8}t >BP(/@(_+_ y?zzzp]P(ė%/M>gpp_|V |2a0118\eccGH$B2$Tx/R|>ORW_Rittt011R 4+_ /"7oޤX,opUK_??h5;!˼|+_io^zSO?_2nu]@۶HɟٟM|O>IRg?^6B\E8eH$A^' "0 L]BP(#ŋ/mz-2 {_g6?OZe{d? KϣiO?4_Z_`&bSBN9qO<?fBP( W@zƶm~O<ꫯrA2tIſ?}{$IOO ˭>2a/~y.^H>ɓ|{ò,&&&?C>L\  p]~x<LJ۠8pu)dY4z98qq!ϓdH&T*0lk׮133C"h{pܹÍ7DQ߿O>V|( >eq LOOs}ݻm$IrDJB,SgϞeff[(۷w[ B{믿}}Y(Jf$V_{6rvVWW}6wmK!D E qFGG9s _9rg} YYY _CCC\~A_|gB355$P .裏s=_~JB>ɓ۷K.Q>ɓ'rܼyO~8qw_ B{eY\tB@"`ppW_}\.G.crr7oR.Buy[$< .\~h4K/,?8?0w孷¶m~P(ĝ;w7dssR(J7|FA /pY^^3 筷bmmB(ikQשj;v )Z B{J^w4MZG_Q622µkװmu+j5 ='8w===|$/ /ÇywsLΟ?a{>|g})ܹC<K_ꫯ277O BP( BP(KYO BP-hmۿ( B[p#G?CJo 3==?8( B-dY@kBP(>ض׿uz!yA/|_BP(qXYYQZP(0i[oQB BP( BP( Nt!DkgP( BP( c u߹sp8ÇP( B񷰰@R̙3( B[p]K.199Igg'LAW( BP( B.Jl6Π+ BP( BQ@m BP( B6 BP( BP|PtBP( BP(> BP( BP(]P( BP(jP( BP( GAW( BP( #ڠ+ BP( B@m BP( B6 BP( BP|PtBP( BP(>7_ w/8,Ͼ[:?[a/ =Ev[& ۿcԧO`q|9V9|\L~43OsiY۾@ʌ<#"G\+@l4?=^c %4!.OfC)!f'^~6߶~@=_浃1z@z1c8GljsrVX go;~z[HR}8aX73Gxs0n#VdPK,fq_m PrWKOf>tc23dd772 t.?6I@C /t6=݇5޷9TXSg>0"Xٜb@.Oпf"3 ۬Z|:y #Bo=ˡ*FMV8gj_(wN9x7&٩Z ^5sa*r7OM&X 1)H8C-0]{ǻya.>cHäk|ُ{C,?a3XbB fDn>o0#] zor֒S=#P97´ SX>Α+&7\œA^??ġ.SccBf}k`t6{rG± @7n5ٟrn‘,[S>qvn#9UxͰ2E#KzYwK\pr%G4S>ONs4b9G <=ܜ r4z|8W/xnz_ƣr36չɁx^1Sd3)sI{מu+p}u`{3aD:{ҜIn}.,Y-!xsۼ|GsEHWy~rvu~Mcu:>Fd=Fj).ə%~y0G;<oĹ2p'X㬌1YJKo"v{Ȇ"2g/yb*B]bgkoFz(e'oѽVE&8Sa=Dح#'y^>nO!ƪ 䡷 2@['kSjV#Ct5Q:IC Cl}|6qY$xo͆jo"[f<ưئ7>f*|e8ӑI]ag>c/`9Df,ϳ~kU~iq#?p)ʝOމ/Ru/!=`q"(H6F9_Á[!|:q^}P;PQ#GGhLeܯKdnNJ<=7XHڃDaj/sow6.Kd*37pvHt?$}C3Xm bކ0P[:C!z/q>8% <͒dhYbW>@51e֟L3}w^~q OSHtDom=a#vqj7 /?A܎ ;)V;U3^D'(27ŅZ:3l爊"|nIMe" @_6TC_G!)}[lI6g`x~'-$ж[shG0鿡=-qΜ4so)}Nj]Q InwNS`Ux{\;Ž .|lݸI~@u(Nl9Ù4zozSuWaĎ29}uu +O!4͹Ο%y&:9~?#3J;)6ؘED_Uꬒ\8px f1~#<7!v) ~fkvu D:8'o`?8h9'R<]} }^ _jpīsTS#L2מfa i*^/N=6N>Gf/ݻ{$#9Ve4Ai#s<~ڹOaJLR?=b|N3Sx}h١e6}&XocG2K\8wS(u8=`x.11jGL<8=™G;m+Y?0}'KOR?./7?dK>3{iLccb7T_ @~}L.m S7y7qTN'xM~8Vᙁ_ҿQ`][ (%yE`%; _G#Laԗ{ 1,vɝAu٤oFq/~/?0m[H:`tctħюPo?F5O\  ?{g~#Ll ?op󧟤!lէh7j6 UN}N,]{W'_g %>hukዼ ]V 'qCi/<ʼnLgyxyda'^^c<=q{"I\6 ܸëFK+wwml] Ν:9xG9Jt`k3={"p` 7|]mrUn M,CBצq #s|09կƁ_'ps ]Cwv`ƨ׾O׻07r:o(b} 8z7Oc.lQo~z9~sv6:yfv8oRqqcqZ?B3tod|o^Rp/Os6}ێpf= r UGbW$TgVRL4G` 85zz\ ʩ{or!~b36{Wuo <9OO9x'O1~S+9s3Ln\(3a-.ҕqg,oي/Lrn%s<$sܘcD׹9A v->7,hb"=w}}ߡ2s  ڞq'~ #]%:g,4۵qN ^Gx%LGOrq, L>un!:ˇxs♷>X9ohG_wH~:gzt3%6¥H'2| =ş2R3?y~=QG/L}aQT,FW:y?p޻HIrœ1GZ; Sl_UX`7\YF&wO̽᜛%6ց>"G_[fqcTp2ALL~Tg7iz?|#7k~oFHZ+?ňd Ms=+CmCD~x㹷'8/}ϑwtӰq9=G~vdqye,&fo5r0rqSr435xYW}~(4Cw61{udO33Ϩ_pAdX?Γ_[O31]sGoyAp_c[Pq:wfoݯ?JLb 8tk+Op{HqǓIU&Ɲ 7Jxc79`JW_=Ez~q2ЪΥ*ֱ_q[f\#s 풟t0:)&_c/ݢ .=6LW[Dy,!yWbQCܤS̳v?Q}*}>J56F37Z}g.S1x9FxY[=?`&`̷F驗rD.Wet;6{,bߌa&qFQgN'jc|]L7W?GۣKDߧ5Iv$CUVum;C8Pëd4fi)νlק}:S$Q1zb2%8{ǥ>~ʽc\4άҗi;??\$EwBBA/t?ciM?#3!QzC/T?A+.O/ӓ9+\8>Gcܜ?qY7_矤_L|X! Xw|?>'0aQc_Z7:5wM{\sh>o6{ oH3ͩpg&zo;\dt~;÷/5]>dv-~jg?l@:lm _/-"DK&YI\4͋)3V^\f r7vhDZ͹^+Izz Mw@3.ZFybnL3ZыzF4}أ~h: 4/G! o[ ?Gw K9k{? ᭃϳqьK<\禞4i͵}];bOkyJwĞ'5Ǣ9nk-o=q^4woNr n;9 _F{֦&blI 6++a,*dž4mha{k.-u5IᏣuA_vkߋfP]\)ϦOp={+qX"=Yin @svڲ8=6mdov}bw̭P}_HD3.:HZzӜUSZ׏R:<ֿNkt5սZ*pD+>6mef&t"ZwLf%wס9{}nzSa=oKZTcb/{t7%W.Mף=At;5uShMkS4u{،k$^ڴ݄\ֱ]#mz:7Mܚ܍MZ]#47fw[ |7𡾥DqF,h.=E1=|{{ ܠ1I+_4h<l/B5nZ;lXUĐQLk uc8?<Ϻ#;`'}\c,Qaѥ̰Cw8_"oqc.]{wI8UY`a}?̶~0cN15r_MT#R7i$ݜkܣZ$:/208.ZsxQrn7aHۦm2F:|NFSo_*c,l?A\M1-mHG gj1vBo&2Lcgn@}{{p9[X&'ٌ u%9Ia469"gi/8,2qd"ؕ*a42ngZc;Cl`T+Բd{wL3ByÇY)`8CE†Ch2 LTkm@_tuBMìO S߉fHۦjofqݴ7j #zK 7lm'gnVcsppEOpob9ZaveP"apIPos8C(d(Q:y8VO=2Xe%Ir?K>c Lv"] R%Z\vm B3 2P!ڝPw1M% UnӵTu)24 p2FV vՈ,S?zx.#17 d8M{F':ODdS +m&#b׈#XhCtp3] A:9B;)C@ez#LWX" 3Wv>huj 8SɍEV2gw;6w{ѧH> vF'=磜-+TBb%3yiK%bnFreR+ ҿ [dh&[]' A)w\# Ҙ=`]4ct$V2fH>F_nɚ}HSp*z%x@_t?Et s@%DO;G^6,bow~1gǘf a9Khþyj_zq?Ai*YMurdbǪ+8ggI6FoR:EϤWL3cاqAcbgV{zRW+O1`wUvQE:e'^qD\ 9:)L8[cA4cl8hK#zHVCܙ"v;Ck+y)%Hnbr" J:؈DQ/֖ uIzDR0@u-`.L_|^'C-a/ mgj*֖ ?"St1t=[I-@b8ަwthccDWIDNcaB^!PI)46fq5?ߨ"].J<);g+w&;rC,w>z|4@nBlm0hX!J].}< z-=$c&W¡E7(lC?B|<]8,QD_)H-]`ݞ`Ma^:hBKԂ"I>rGmuR۱O.h<\u4$8uKF} }G5:vh0Z{M[x5*V[M ׁUs0kwQp]xO~':>Hx*FJ6H& <\9 5z*U}f=J1#kA#V3ptDΉ 3#vRHFH59Fi(9,VtYc?&GjL`i~Z­h6-nJ]E \:XQ% _5/q5tl0D~#TFy+\ Ŗ&zw#Q[=c`eJg:JFaX9pquDNe`&1X0xds7APG8pތ^ B.HhLըhAegيs([ݡ $lʇh̆Гrq)&B~pIÜiҷbgHgFx{;G2IL?pclt{O6>L{8>i.ޠ>P;.n?H-MCJY%L;ci_ Qä:2hgKr2E+JWzpa'^՛wd{go0;qZl`]kaVilF mt04zZ@g9|S ڼ9RqqIǎl$.'"L&s$ΒiE:tF!Ff0 djC,=g`;(`(m7>–FX8kRK";,}h97}g̱w* FM`v bq?]}8].#H@1;>mAMR롖%9aƁc$C Jt4d֏;< 3SUdgxZ?IهU%4I.BVlnM\b?ʑh(20$XqҢ}wi!vܦkNwu:AnH5nG~8șAˢ\gퟂ}ob~6rř>B;_!Cm_LnY`}8;TzMzR2V*v#W,7m1 tT vP_8@Z*h9e!zᖢl)/pN9?L=֠R6$ 1{ >˰ t;y8'6\3@9;B:v#)NSvh'h#Sdlb&Iyp.P>pdkm?!(H;zP>/F-E"Ži:;gp}A]A*eVk=xM2}P.Z:Gxpl8J,ݝE'h'% CLw1qTmi 1%$&שzk.WQ~|S%?Q`0Eo0FRq@,>tb ab t]zt>rl@tmclk#̓:FwxhH<>Ar Pz\q`4aoQjdVNnWH0qjnxăiءhuJFh2ZC<dpC`GLڶ?&c;m,sIK3h\t[lG؂bAs\:2A{}26)h d-1 LMֳI=(%EaWԣ.>S w>Y~PE XӠR!ou}duipMTMce6t)jgV1GȖ=}~DNy8F@>\az@MPseOUq"&z`&C]\Gc68֗bs6d'mmISӹ%M(e[L ٻF(vcls%| `r<-Bn$Z#06GI1ԱvƵ6ڱq'쿀6)ڠ?~ks~Ǟ2'/mpj+JK4a%"{KܛfIW=F~I8fiEK䞲fA;vKxffip]/6q\/!r{2Y.qp~{JRxmk6yO%bepeMye V*?ʡ52fIWfxCцV9f}+ڭKWe#S .ЬUM=B9_+{OS+ v˄vKy[bf׬vrsVJN-lK~H7,Axkܬ+m~-mpJJ\)wmWcM;lEM7^T.lxf $nӏM;}v+ ?N)6}ĞBuvs[^bOmi] aWGdl]ZGU/yw jo=pvO5$cMص!וHt["]+y$ BP( BP(~`𿻱Ďy/ 7i7;hB 8/.44}WmD߸An!bhxkoBHGCC yƛLs|Rh8xCz>!J4}!Ѥ7gZT/mk/Rhғ qK {MW4%mM5gJ.%/;wǖu[͏kMٵ?9~MusM?ߦ][T?i MD+[s6=qAkWZݖƈ|Kx#w ~>4];tq׆Zׅ]_%>4V>!hw.Z_!iYֲњ2î͜I=/Xo7h |Z9dmʩ5/ԦZcդch8ۆ+l+bosVIp諯S5أ=&E=>DZ-]{bi3w^ٷbɁ[uEryhs=A{ơsV[{5ٌvح)_i; )[ՇhqM߲wi'ɽyq6T~|!ګeviw_۷ܷd7&ۍ_ N"D˳Ns{r˦l˖lz)vNKvZ+^ͮ_nGt+lM;J?f Xt޽\_{%ZSWgP4=>wm95_Oդ=n>T$3נaVX5RBF 9ʚnڤ 1 fV|)I^3f0-f6j`J6$bY(;"WIj)zfhq\l T[Z \GI9X'SE),&R4%r"¼f<ws02v!Mf)A~#Z!r[i3ANĆLf!IvRJgX SdXSvw,\-9JY Hgt6VRD L`%Je>)sbb<ŦfbC$w;,W$t~Z[PaYk$nXm̸3h[$+Ӕ\aNN?b%R&Vbq8vl@Wȹ :B m y!2J6Vemᤗж h`'kW+ۦ\Qߥ//dE UFBf:tRbllD#Av|jjiQEiRpIKZ`ɓLejirv|0bB5`m˔#4B kX,֒N\0˱ԖY$+5$+1,㰝uVtʚ\MmU6ȳ"N6օ]f.`-W"[ԷTY)Xbo퐪uK*Y+uq [R63T+IDIت,./aUS++ tS&XY&!kmΑ*p'W%Tl$YssU*, 7xhUc9T IKd6w*=ҥ(<%Jq'PHIVs;T,ijk!BiLSIIrFmmBRhd-A9gVbޭPgyLAp+Fq\zR/ILX cT n-j<5;] A9V#7MlAy6OJ2Q!^LmҶPc+d6wfYX˳@dF2[ L\[gv9LN)#V ccteU7NBPL8_N>v}F$ȝ\m}4dUb%4[',WlUfh8q;6 V d16׫j*۹se,ƶL'Yic.WDY,F9BD!R0I[E)h2E,j颋Ye-h1W3biJ-rj`Nê&Z)@`]$onRrD;g4\S܉ӅeUkEkdiUbqFlP*lSpu:4E]4$T Y/RDrsث[OklT@A6 Ut#&HĴYVsdb[hyx1C_(VyF8Cj4krĬ8٭E$SXV:Tsܳ N6CzN6^`J:2;y6ʛ$*B96J81:ہU1:*e*<:4a1Z^-9$]a5W8.qjw1{,sw-\u{7Bǔ&AZ!CFЩUp͒{2k긎-N),L7@PФ}`iԥ#+]44iHBGáyAG5[K&9GI5\U-hMD$dRÔz뜙#AAC0,ct4iRsíGy~X\"]ݵjU,#jA QGZ "\KFkhTe54y  ,l)Y޿Ғ8 ڸhj -cf[i!qw4İѥe!` aI tAlmHhZB(A\G KF EC޹hTϘLn 麘Dyb-BU׻H :t!?B`;ח+Dw\L;?l]غKy qpעi8&+hmcK mxz+k{)K*y!ݵ4 8hXX9NCHiy)u B3"k:᳃p5I] u vF\\;[I@-$ V<نw>Rj.!ҽ*HKb]y0}h.R4i hސ4 -z5J%f4V:8WDgٍ ifs.hwZ:Zװ0S m,!, ͨaS3tUq G%SCz]Pu`iB 3b8M"l44 C|t\l3M[jHS  GG&FÆQm=ĵtt"p%% ;-эX:Z{̏iu А SDzCK@.\ $hXsA69a [!m=X-lFe6daK XKE" ו hC J Ŷ`ih¢ie;oiخ?nO` ħ#]"nѨhA-0W@-tL Fa 5= \l)YFԽؚw.&-Y ` 겎Pz° B8y%DJ|?b?0$ha 1uخހ zc]C;Zt4 -n#Jfa[2 CJ.@7-] X6u EMwx~CF3tLKNShĭ4φ 0Ќ97fAL,)!Ѱqk!NPV[p\ϟڍh cq5ۻ׉f|ڗp5u-6Njz͓{U5ۥ!-j &v#6@ݦw;;]GnjL BiaE jd$A@4MoEai`^Bj4cl׽{Y @HT@{0uoMe;gkite1dBH/qm[ `TѰEϗ:R`nsh8:^tߖ4\^[b-B`IlEغ0ic8:.E 8i4}Il{\^ r͵5Eձ40\ .5z~X7u^$k@ 0# 4Džwۺ3B4 pby:.4t2hBmËHL݋GM[qϮ\{c^7w˫-t/~ ϟIAoHm/gwnB^ڭ ?<#@BuD]lGGX[}Jζkz񑀅|A:^e 8&B8vl/7ij8˹LbÖoMo,x  [RzB9:Dק!L 2pGHGnFuח&l,Wc]O/fr R5>]Hr-tB n0:|3abxJl6w۠+ BP( B?]wP( BP( AW( BP( #ڠ+ BP( B@m BP( B6 BP( BP|PtBP( BP(> BP( BP(]P( BP(jP( BP( GAW( BP( #ڠ+ BP( B@m BP( B6 BP( BP|PtBP( BP(>*Lځ,Б.{5ڶ:DN " X4FAcU(u {ΛD&0m49AHFʃMUA)7,ғo ; %)I&؎Lk딳CT;a: 25C0%"Bu L1i/#KdtY'1U;F Tr!.dw9`]m̈E6)kb"t֫Xv !dwq PpQ ĖF0=.L`-:j5b;u7HM-Khh}a&f2\Fje0S`?A("8M6І1袧^~e;0@'I(8u`kO%ӭsƾOPVq]4wPޞZE"GvX8t! "Nݘ$͒wk_#?Vk NCS!BO$ S 8=rظU6]V :00V!A[&vfa>Z/GU-c;+!zW)oM(tEiA=Bξ v!XҩpSrJp?d1Nw֦T%ԑ0nIH=JJJ϶>'Ж}It5ʔ"wW#m0F+݋Wl0ѺTM4AC)*}%d҈ش\\Wm ٬"h[t.` m,8%A_. %U(݄D5'EO&nށ=!TsLQppw=iG-,'q3Ot']B7 ]*#k:!A{$ґ/A-9LFnQjDGf{bzPYR Q(Q$} ӰqSIeB ޡ#qz]֋`/{'U{}B9OY9 H"g 66689\q 06 2$f4s񤽟?Ωn}ky}ϨNk:3kKÄwO1l"< kmP pHI-"LV!3Kni/)Nwjˉ6㔻UzuL{ at͡T&н"R˸|'X Be,Upe}Do.d{,o)1՟f09IwVRdFOreWE[襞Th搮xr+egՃȔ6rwZE-awYQzHX,S;qB븚Fև=T$yjP۵NӨt(G9UmH1e"0 l3 *nz ,vbDvi/VmDOsɬhTC!Pl`64TT1>Nif-2LG x0Y;Py'+4f!L#hTI0ד$jRr #A`k&2Y^'膍BeKhkB jwUE[Gp>s upbs[SPU)R54[ged]%l;6pX4Oe]'[ACtp67]gx"HlCY#2p(P\FE%qT^>H)% r\!"U+i(e*BE%) (Jpf;M!)ti\v@-㲜}H5h4Ҥ+緤2,oQͱNA> Rarږy#I̚ldXa9 d㻻^Y&D+㽽$˒ɐN!S 2vud5IHAu-xq JU[gٜCIu/%֖Iu ]Opes .,*FJ!3@Ōmto\o3Tl=yΥGHyzTULa&k) X&2ǐ靤*ythi=ρ 3N)ib<>uTbh~2vUI 'YMG1=EvoE9dh rtf5!,MCa%J*EO(AXbLRV  abΔihRe+]N2j,71rMj}NB! U"óԫTKԉ_JI&2 9fRjulGoeaYŒT BZ[tuWZ@%492윯P  w cTjEȰgS<ܯ>BAOR._ϱ_/a53p*MkW|x?Dgg7qÓy-戽Mv/q%N\x Ư*2~d}a㾡CW~E[K0T㧯5f6*N\>Qynƾ;+>3}h| g8v-7.M| n'+:R '_2ja,Wch6g?̜;?paȰ1oW7߾B.c{ j^|K'zW8]Iwd m'7=\硭\έyϾshC훦.F*88^[J2,?r;=fMS2|'\awsǝ fGo-ߠ?uϭ<o/JnǗ;'uV9="ڋ|/4~GoS|^^WCM|xdx4H>:^?G~o&oѷϳ׿/7#ᅤҋ39~Z[A"sog%_~ۿCzr?w;‚<{ŕ7&To^qɡ|=xoo owȖg)թ6Oػ3ϼ{yv^q_A=KK_qW m /:C웗׼upq0_-Oыhy?Tz7qsTAr92ҼE51xƴY{#*bƷpe4^?# .O|z~_&c;lD鯕(9=돉^ʫ'X?~=kW_B#yv^5nacL6Υ2|?G=U~w3>F4b}tM$xk7]7]G{6v >V_|yO Q:wm{'0:^rch^+~\15(>r'?d?SB,:zFOt=@RRGʿ-;^ n |q47^aZ1M܉k8{c'_; 7D,gaks#],E~הp¾<,]}2+X$=o#9{׻xAu畼?rwܕ)^43Xiȿa>J!|V:> ;~Z81v1zPwΗo@d'KI|ϾSe~ \mx)=eP} w>=E [9~-P=gۯ#1D\ W->I5$/y~1yW9+'e|Ү})J83˿jco\{: 9G rgЩa8\ :>41!4V?:^{K{loa |?[s]LCc ٵ|Ws6/ꧧVRd𿿘n )&~ s3y8z7,4(O6˳X#h9s}#|2^N/玥lIDAT'9ѻeHG߶{&r  =X{y?}w #b~'eE}#÷>{H?;?t#6_|kK|מ¥sřSl~c~/_~ c_7؄@O9z/}{GOWXx}9YvYsĻ}Ic+N_̱־É }4ÿhJpa׷Xǵ# ,If{S,˔n=á'/oo]~sW9\?͛g@2)zSNj\w~32̝'E_{Wq&=ʯ|>vU<{+;uRN e9dx=ϤS6ĹG᭬>p;yn:?%Bީ c-i9/[`OLU7?o]S\x-LS1:GW>y)o݆K}:}?){.=./tl6|ٿL~:+ٷW3ד௝s! ^7اpAtN6'oV5_<Ns|ujY(|7r\^33/-wo~Yog8SG_&s.9Y-z!.S$ ;Xۍӛ[_'n;AbCzۯY3Ўg-sܳ0z5/O)m/;qAU7)7Xus:ߊ|<Orr{v\f>?90^B: _B?LT}.\i?&O;_%>;^ș7M1./u k R TP B)_JKK0J:PҿN)ѺC0jLѾgkRu@-9Q7h}ȪT[/dS `n2nWƹߧ57ɆIn鴩WI54E%Xߖ^|+?ͱO K[or4_~S[E|mꫭ?Chڜɍcljf9ذ-VmoOnF` ,$D!7]|?me^Z6y.>$SnƷ.61i>kFT[A f<ױ;~ۼ6&i]Os6&{ZEgl^;Z6->n{$us,ܬ&mfrkLGW˦q8svT-!||&$iQVnu1sm& mZ?f6~ތcc;o^٬ 6Σcpצ]nyߍ9ӗjǓMt|ؐa:m 8njw,9\M:| ?'7Ol3ċyh?swwAtAtAt:tAtAtAt#ztAtAtA?.%6oO[@ ~C.)@5_)ZQ׀P/ϔI@h=@S_%P׀5y !Ђ.-TYќ@4X $B:T?SS昢=Wt,~T?Phx͋k*I -БBV#T{]lԗB褩wA\\``lȃP ΔZ@'Mi^ dnl6xm Je-y"[Kn'zv'Zv@AS*[CS] $E ɖ}`Ji}#ۢ o 67ך 2\4 Դ_RZ^MRh %Bk2j@mDibHpwͿl@`}Mn64mֿTTbU7E(TE*u39Wװ j8SFF-|%J7"]ZaduriRZ(C0acji QFxFVE C A]M"Af-4X4q T 2VXe{:-DET ]s8NTí'6 EK9jңr*`uQ)=+B&M_i ܘGH^C9&.n%0l7-1Q2]hCe% XVD '(BU*XAr1]QL$0eU?륭h2e%#ܿB0^Ij %$DTl CO.rtͥ\g "t$u$T6]e}wEStmIb #5-B5BZQiѰR{Z!FWtj(2 Gpuju'JRud,%JSW1BK)zݤ+CT \֩պ$rԋ}̖3m3dp2u\ k{5FʥLR4$D,Gwc0Vh54k W*˃h Z1N*kG :Z)F>6) NW®fNJ4݄Ax?YVʹH.rJ"v¹lvz7k0+^VH`/b:ň1j&%-NY8)M#vƫ$I ^)tSX;HѰR1pJ8#8FE],ۣ`"kXq'Z8FXa&UZKP*WC3ԐCMejV$ckʣ@b4;)tyѫ,0B01 wSq3X1JU.IMIyԻ-ܘ' \/Dmuս8^:Q씍^ 5F9d9Aem qN%htj !p8acd8{-Lez T=JTԨ<̽C&x:Z5lDXHt!cz,FJI#7BeT5NE%NIdq pSq0qtęAYfrih3ZJ!eNCY1zmvOQJDipzn-ɸ Kؕ a7%* RfZR/ CdC*^} #H Ur&gS@bWJ(LR, +I0q=b~ bNni)EMz4t" 0npɄlbʠ Mc%֩Lz5 K4%Q-j4B:xFHp B zJciI$)vjy;fW$KWטcèTgh\Rn K~bZ݃yoF%T5&"ĪHCa q0NA*'WG ]8HP08aZ2Ft1T+8ĮfH$VTX׻YQ/bG=%zChj:NHQ q ^%Nʂ$IF9&]0^H/4XqH yp+"NyH[6گ]i(цd9 VUXa6Q,v%,8t"XEK9yRI% YvV{BҤ P66%zQc+Y$k$њ)QҨn~B.EP"+zȇc؄(AJjA RRc5Eb|'_L<ӻ&ih! Ev<idUÒ`9ԃۈ3X5B B3[3X*D5.( /&c,y#THd-byT7RGhne5E]XHp ۋRb']V!(Քd.4 0<2 ee%EB/Q %0\V! 2`erBCJZBPvB`(T"!RI#%-DKbWAA P@ LKDFb)܃\R53,4htYh3[M9Nܣ.?DW{m5GD4tRe58`-d e *=.*RwS#T"& TatKnhu*)aQ cep l+A͚эy\n$Rl#h90ˑ."ŹIHY%BxqBnk1,^#?+CXSD(01by@c4=O] cH  25\B,#crJxgct{K Q7MW^lr+qw$_nzNfwR8F#,y`ج!62Tg%c̜"J;;_P6ϿiO'ScM (͒JR1#g] ^f%prdX}89 tm;t)—>C+yD &p[ P(>{%UbOo4&Kpq&V1f"tagla?yu]ƊG4'^bya</c84s9Jgr5Jק#T qv9³|-u3W3q.!> ]oqȞFnadv\z8?St]V^M""i7(n'ZKǾq4Op7ϟ!TT+dfD5pK*"Fm|?ZL2Bs|J$?N+{jNbdl{1&f){pE1g^ϿJԤ|pGJ-wT'"k<}MOB.l3o%-|-t+ .3.}HB5ʮ'oG2\{a(ʀeO6u!{y>?>w!n?TH+5Uz0φcPHX㹫="r=Luw**B`% CEtܰdfR"{Qr \K,[ΚT .'f;E? y73[Co6J,b<g Ѻ0z \`7/,OqF| .Wcdn`6 m ^Lx"nR-RqES[yӽNǨ\~֦;vWѳY&OFhcRaꬭ%ҵg<{Onq$"wl?? L-^}ŗ7ؿ~b7;N>Ý%B;9/1oc~(sY{Xܦ^r(P;>LUTpx!CfR=cZ,*߂S*OVЈ ym=S,]ی/a>řn}oyS;,KJurC`Rη^=.Q?67}qFq³Wi(3|Ed{{Oe=D+[=Ӽ} kȶϼc!f[)nzq0)w٫1q*qu|̐FSޗ| !Ξ{<y@#Ȑ}) ؏]ɽsfg+r:N(=bu5u1aZlŜM>nguUb\2_@΍'{F iUɩAĞ)vN&zz9sG"{L~-<>L|xEw of׏pq=3T44-Pr)zTn<ϿJ3N)?H1?Jҫd-r8"K?S>F ݂q&j4nsޅ,5-1 <6*VIUah <˳D~"Q NaL[P\Ez>>-2|x/.UTQQS2HY:Tw2c{:1()]:OMJ\q6KamC ӻ(yuA΋fD_w-9pvepQ7Kk^CWhX$e5~F\N69isG} raw CJƭC1s r~5ŋ7_֝|z=]ʼc=JxsN/+=˅!^ލJָ׺||6>y VwFh4RLҘn|ngi\Iej+:wR5"hf=]O >χG_I.$nPx|ù*VF6"\(\7!R[ĺIFmY&3T)4!{ L_犥){}d/=8yg: OkR B aULMrH/ ֦) kh45*r ּUy5we[6Q5;eڞ*kRJr6˺Z%"Xc| ,s΁мv9ˣ&:mnPofb|^CIU)TBBhxJVɜJ&BƴT7&Y)ڦk*q׵ZC*]5WOU)KI[߭v PUR ʿr`$:4}]Jl(oʍck]YVawX-Tޚo+I[Z?KJȥy5T/UP$5֔ULDo&2szo&lM*7hmRmCmk߃O ͣerflh󄒺?)rVQ %\Z-Y2q/4kӶ^u}Y",^@[VڥvPB!MpʧK b \WiM>9]#PL&`ۗM#AFBhjAٱ @)/EzZ>zMA҃-+ZPjD_lX[CC%-Hj>-=DH-MjKL Nxpc6\Dr`^SJU~&WX @ʏr}6pܰ,X )D̶9C.nzB r 63vTLך~nm3iZ[\d5%3J!5ZfI|o'M~q6aؚ-6``<lw|-5yn&=:1쀇|n1v|OoqmԹ`һ״̓`Zkv\}le8^.gakƱ%k櫚kf>|(2>n dtm, O" -s2YlA jk9Hnh^ӞI)9_W۶[~8>o7mr,*_onf1 l$X ±M+CmkA\@Vg{>GrplCVO>Gl l}76}9πuahn+8_Ʊ}icO[=|vQב8q7m;+\kXn v <vQaQXR,[ f^`h 4 Y8׶q;8G;OwlQ9.㠹&ݵr&l!vZSe^`uc<8ı-?oi#6'[~.ccALt,dO xByg,;ıMmctp08mxAsl[x`I叧|dz|^l\[6֩g[k-q8oZk3m8Z3[c5ux\ŵ?o ƶ=KY-qlъͼ11۪4=۵q@׶pT`O9/kɝ{<S\ ~8^XOu#|;6乶\[i=9ǰ9SyXՐ B)?]Y1q|ɉFjg LHs(]hMj>}e1F~8JXefT(GM&$4"t$Xk>~TWUT.Qf}E&0aM5;B4Z Zxy Ϛ8)(FQ9E&[ꦰzh(QC rtHެ`LGRzX5LYA)(ubu[qzԊGzbL)x: ^1A 7E*H'DvHҥ^Feu+ 3%S$jɧMT!K#aRt=Wm.Ķ2H"qKD-KElxD? 0 nTJij!j0AtklE*q֠$:>l4NҲ[SlR6HCRx5'`Jؙ: ˽,FX,Odbz:NbzɮV-MƭPYJHX}5KQ".P(; 9H R ']XF$k6RÓ9Df$CyV1z R`Tn[]'+,ﶨTrĜFlYd`%Ş4>5nzdI1uA2tmA| JqVk&bS".RXZ=kfW3I QPhki*qFXqIAf6Wv#ˈBST $Yj(@OTH{COl?N!^wuy/EtfvGMbh6/EH Z%ƨQVrrFvjKx)hSu_2/txsb+Fר.)Q_%evwQ !Z6]xiDba`{ \t4qQF-Pik7)H2݃ NJdSd} iUfi}?1Qh6 IZ˳elha=C-&ɢ"S. H/c%<]8bXc3.<sE`BRfՙU[)iIDpuF!Bz٤4ZT PrH1P@!_J9f !ī!F=ӵ0\XJ֙K\ LLbn"3/5M6'Sr8%VKw$aJ"k2? 'a[hc&O`T(˳{sT&=S.T#&'=ct(C881#aɥd#),}R#DJ:`dNj Yjd{tƲeAVSNjc븕4r%&IGW ;%/s([K2B Mw۬F+YVapբ5%ѽ4O3ѫPfqaG%s0E;z:ѢN%)#^,2׃,Z`= VJ4:ڀN߲:屰!Wa%3E20aQF@4Bx*b^F]%2UdkQSXQuq;C8͐`Qqb5C"dc?+8T,3VFD 35.[bJ tp UP=zTC*h f9{3VH0eXjgO=QqJ%.p}ɳjcXG,Zb{<3KԝFMr`K1aR#44d,oHTӊD]UfpiV1fpJ/ *fQ`m cӈKKEQJkDg*BfLE_<F] ki{@WJX-Soao/dyfjWJk8a]oYUFqͦ:L74S*c3C7{dU@@Zg6--m7LT+}Ioj nn)Ef3M6]ZYdsW[k4`nhZ'!g7o(64lke+UXot#D*h7i6 o`7Ck-Zo<4^4j:ԦݸlM4k(JXJQ=tSWަG 8y䚒x?]|\k6jSKfvӦ/7ǂo:HVx4 AC;o5 Y3 iȪڍ[ ZM66pL *m[ >X蝠ɓ& MfO,6FjccvCfդ _~sxo~Ȁ!<Set2]1`7v-Nf qsi5"f|nUL89jw&~?#d AtAtAtAE?uZtAtAtAt:tAtAtAt#ztAtAtAAtAtAtA?WiHw!‘!4xf`k&2`~\6tWh'MBXI4dB0\@!=4Eܫ#G)? )Pn jzai!,S bIB%r)!ti82D͈y A|TĴ*AMぐ8^MCC aJ9}&.:J'ux(|^3B j 3|tҏٺ.A nkY>IVn4IX95t/uDhH]avTr=ӑ3)z}>}u~ Ƌܷc^=ȎоaΔ`c\q_ W/}Q= > ejs̭+7`D\<1*Dwb^{+L'? &_zӣ { A}/ x3[mI>y5'n m}a^,:Ji\]">6y޽ F#򢵧 U {s(|Mpo*ƫG2ahwy߻%̟}-=4g2X7=i("S僼'[L>j{ia /Y![v7x*΅w30=¿޲7?ʎ)*"Οeɫ־Otlomjc S?V^u3d<}=;Q:Ջ{yfoկKq|hRKߣx |ew-O=c {wreV#im-5u6n=L,_g.^gLeQ42Y oO0naӜ_ɟFyOł3:3I>oga~kEXA{/$y'}18 lޫc{6υ.n=5˷lgcyq?'|?0|*/pl2ǁe>0&~JM ::rkK+/5hO3\KFOONowe`[<~=x:S{/\J^|r=yu3MX\(/AO/%caK[R,Ğ,+5z'_DlDMl兏Qbb`y7]d./.ź4J󇗿W>~XUgp;s;->zQ(;_?a޷p8Kn{i`/R]\-nNG;zX%ȳ teOK+;xesē^ț,3;bq7og?ɑEtOsXX >ƙw=u09{j燸gxMdNОoO+8N(Gئfܱ,i\lcͱo2]Inyrp;[N=y`ICSX۹aw/X'X;y-ow􋼮Uލi48SI\2{~~/|vV>~Q4Z gJ֓1n?G_`~SxķcLҫybtF%l1 "ZY%},[xgg80SG-gBG({ h9{3|G S2%wS:o\}i&ϼ_:.2&-Mߦw{~7qy ;BR:Z//.r1:̓? #<2>9Df F%2Sa#<3S\uسgbɧ_9ȫ<3:6"3b #:> -gαKM\޸ʡ/{ Q|:HLry2xTF[ɽ>Xg ~yj-)6W}'_^ܻ;gW86 |{lq=OC)N|bF8~cR92o:~VX<#?ۈ$ҳO% Jfe!սT/mD p8^?LԻc޽|=/g)a\LPT䒻"qY>EX%sj+ j <,'uN'$r !ņMj dז10<eXp'WY" Ԗ֘,+!H*R?Pb%z"Ox%Ee`ًpJi{FnRq]9L`]\18yGͳrY#+4&YusKXKӔ]͔NJMgYh8V.gmhRnU*(j5ol2$s뫫4Xp7peByT,#'{PFw erEM|zAHmi5s:g bku#V&XɳuU)Oe/V)#/( ,&%K<:Ts,֩,-0(q yT% Ru,Q;RZ'o)d+,p/b&Hw|dϫ Q`qOuCYV w Rj:Nj|:E;4mfU<><6V̪KzSj~XyQY d=P2im暢[>Gin'6tO\n͎c j`jŽ\z!Oގg9Ǟ ?e!TbH']j綱LI%iL0]kĜRJ5WgY,XVWVw'Y箠V"ywaaQG) }zeiA}q7~ibpdrբ2%TT&EE6Xuiq/Ա6(]=a\fކP"Ou@LAE$y+Oc1bSb9EP޵DU$H֗ăLiujk@uj9zPr]UfD*سQ 9/` p1QvQ+4ĴI*13Yf)bXĜQXYF5.Xc"$J9vv=Ki2Or`mJR nlŖjpu\S+X'/QhVeۂDP j"GDVQ49)(jksk}ȵ E}9F9Wg-Yؚ_>L$4jEM Ac*#Ϣ͂qQj6u*L,{IŘWDI`.S'^.3#RDbB!wiWQ3!.s *2`=d%VjucL6 ZgM!%]EV Xis$B-Jj 0i&rVX P!j[qVj)7@(򋫨9<DziqUf6Zg=JH6=2*Ƽ s. ֍5dj 6jk:˺S0EEmUr YuLq9|~ТMPaNzE;J9GyfDgX]sQI*Wu4PYE5d"bn ]KUxHnl!cf4ƂB,Ta<>9F)G'Ye"/PSAg=%VF8(T.R_UƫLk89zLU W ɒ -RҲB 8$gI]Yv͚{m>g8áB n]U]Z223}s"!p̊8Ǐ'5vHԙW锟l} ʋ H+1f')֙[%PL-blF !'7 i+cw߷\Icɲ:'ߵBR9DD9کPV<"X]_ DRIH(ˋVRg8@ EzfV;%2*6_&Z"X]ƩH֒V$V5:tg"N6,AГrbq-**4R~duggq;NpeVX\vIzEvIȑX-0ޥ^bokzdJN2. Wo[DRfe{ ,8B# *V~BjeAW„ջ_j 0 ͊4!R& @P\+)@*)J!yOHH)Rk{#H =E!)M;~vߦB=^a!$14#j)s8ܔƃiҌIt_m^yŒJ뮮>J!6̘=Zmʦ;ґk p*ۓkjG&Խ0vd|X6Hj \tepGIMK}%*ܸ#"wٛφZ}w٨Wj] hH4?Dv^Ge8T+r'H)\Y˖z|ڄlڥ-qlM/͋apo&?*$.g{>ᵭzg67sWcZcTKSOAxs^{K5_i'cX<[.7s =j7[8޽XM4ZsJYMߗ&Vi?痮i%<կٷ&'V-> Ϳp4fϞڭvC4ogOSqBk&e|Zfi~\埸qZU冿":蠃:蠃:蠃:o ztAtAtA @j_//\K˴K">?7l?/*KW>Gڼ}->/=M7x>yV~ay xe _/ks}>Kܾw e埦r|ߞ/" '~דi|5`/HտW^M//3kF=믲4_/mL. gLZ]L|wǿ)uP8J" B2He e"RH,B0eaJ瘲4Ҕ4=mG(SCIhiHI]ZlKBLi#vKaJSGec5phQ89VV;>lL ic;R8Q AC(wl-[Js$ԥ¶@bĖ"MC( x-M@+C33&4c|{nǑHSI9H-)%RHmR8‘6emd0,18Lh(ah3!4BjGi0*-vkt/8J[h Z phmJinڔ6C88eʵޠDjMآ)?$@D\i#Ц!6Ƥ@;Ҝ48U;Lu1vXc䤍-ؘ뤣;FS/!)YaaHԚ0v 4B!1>;[iaD2BHa?16'BR{ڔ8XvDS57)=[ v qBu܉bNM=0eg0mEkҔ[ML앦 ԥa1s gƂCak ^gK33nɛ8\0z0?4!6P8OQ-0{e(oE[(SN兄˳ZcCj(g-uzQHTfL M״NMyKL6x42mreeƉY S` _ %~hU3ƶqa0q@H,Fn*otM'FjQO+[U:Y-)sܲeiih!x6%l0#Bdp6,aXեc5ڑ8}&8մW]”jHyqcʢ9elW;nJ6\N`Jyur ݸdl*)GqA?iˑ1hk1հli;Rh-7%J`52lk ؖvF>h M)'mi*_HQ қjpii2D&))AK'<L3xqF#v)w*0e<.&7r4yҔԦ̪& e7mmU i-MuaU1>ci 4\[p& L(C G m0%8&nhm/!] h[( R[JSʌprYa,mv!,;ab<3hJՅ}J۱ 1:AXu<Ɣ1e'1אl^nrl8oإuHlVlLY3 l29919)fo6nM\4|r0/dèE]O-|ѕf{)% `r8K Z|gF'>pc{;1el !fNh !4BnD#lqLd%6JQϝ}%0:19{M(M3G c{VˉHTüH3A19Bj9YBvh0lSd绎s|>K_23ѫj).KFIJ{x? R08&ca %8j~B]fo*˛'\v3gYݫ8pǏU1j9ػNN/ΣuO)%4{g'ލ;B\[\0\={xo i=\?·7bޱx>F;{`#|8vyq;{qbe3DH߹ '{ /xooE\/̇='[StmJ8E+֝6Yut[}cA͏rpCFYn\L~G|W9,g8~Au*F??3Th?|ezWώqZM8,ГVp™?qOekOj~'EjNb\/f,R?}|}Xp=oTby ƞ9f8G 3_ N]o8ѢW'ȽYҡ01N'Y`DO_d"͍Y4ũS{{9aw$T  \gܬǯ%gX _μ{_la|/F +O_ qU;>ddO3O5#QÓ?89B,BHj_xaRٿ\Bgk37|[@f:LESS[S|'%VW9͈ZG(ǿ1Nԙ?DD/@?gSs ӳFų|*2bi_)'tP1f'kE&[U2\ H`{?ܗ):@T#ᐾÝG ?fSY~v_0nQ r䟾x.Y^gu~\GE,%βs<DZ5#vk:ѵcM7ŗJoq3OXfiGl-L(%|zpMrGg 3As0STtP&,goQX8?d#y?wD _GwVybbG >j?u^DwH}Xsa|$=Lá\b;͓s0(F/Ω9Fy?qJO;<SK:,?ĕ'm?U"S!\)T&,\ P upUW&cs[vm%n}A8 j'ƕ}t{9<ǿKo<xơ 7f]aMcgM_wXc> Uבk?"/s/ =ā&^Qn}\U|NqCφ8_ZJ<3#3.:Do_dwH,Qجړ|.eO'8rӡP<=E5 3I/"eq_Tyq~5RprY`/W'xdΉ7͗/ˣdS ,Uhv}_cӈ2p`|nQ qfן$׫g`oF~-IM}#e>~R|շvq使Ӿ/DH?%ك wݡ?̴:̽j۱Qʹ$澁Z>=crN7g8=3 %t.f&X;CDSNVF[#2Jg"Orp#š>VG;DUb3,xtw ??"Z1vI|y7^\'"b'ֹbd.b:A@܍%9rYQ;s3 e$cx'&S|ȥ!6!.vf,8k?y>}zÄ&tmȁ_xSňF˷_`| 0E;5 Y1=+zUGi% N+Jl3()Zy!>rNv)vcQWCSDWP?j/)ڇWtI+JXӛS 9VRvZ7l®(DyՅS `EdCDe;` ޖ$12*NYd!4 &/:5ҡ0Jt u1;(ЖH-٨rp+ Vg/"-g٘$㋲R=^7V}4b5lmѐZ ˪P+(@@NZ@EHV`Esd!&e`P$-h| m%|CJuPdq2HThB@BeCȮ,T`G^e''TB|TQ tFT`IPGP,dƢVY l ʦ8X%Ha A])T!@^TK=XP@Su#Ķ)r YSȒpQ.㔃yUZRGJ5FE])zKe"vRlJndUtvhG.ppŠ5f>+RSö}t9yJ  _Q)lжEPTwCd ]vtOH;n权,; @5KQylǂK^#ˑT,WȚ" U-c QD]ybBU>?]eMc#O=b`aضJ5-%!4"lZ8BkgX{[+[l"!b2J̷Jң3X;twOeNZ?A#8]8q1"@ETgP&h4ԄH#Ci̳+ݠtZt }%;f5P!]P WlR!k%+8k{"9"i*/Ck|;O ѻnfGZalWЖC N*吤PD D Eˢ "4ݦd_}IDAT[$Z-`¦R"k }4s=O l UuJ_$G*KՠO$fEiHEX(Q6X6nQQr*JbkԥBH'`S A@V2Jر*EƲ55iH&^lPmS*Ȋ-P,mK?aQnME= RيvmEԮ[#eʖ@"ZZ"'7qj!͠D]U()Ux`Bڦ.-(JpqV4!PPԻ+>v'V򡕦'EM+!Vb"* pBbISA% jQ TE%u qMʐ Q9nv| NZ9T=Dr%y~ej=|MAj̠ƒ5D,|CDPŨ%B8(%E(%, 05idt%{ Qxb%½%OEWS,}6u;v'e'X@: XpSR馮IZM1L- TɆ Y!(qe.FG* ij(蚟zPkb4Fj>B, {U\YB&ԨiD(iXZS bBbݞ j4|IC5aYT%5i jb/VURY TXV>;C?Yj ua_` P!i,S )oZ4z!*HY,Z?B:5(a!+P!hVIwHor-N 2Jw`@44$=KfIQ!M-E(c1/+4AT-~-rb~N~Qc] d@fЦ`[Ha'Y26LC+|;/SGJ2E!AK*Q&5.~IZ4q|cYX6zm Dڡ!*עa W͹@-@\ 8R@S/` EYp dMC*!PT"0SA20W T!/#(P%7 W/ >$!_ebżg .!BW֡]aj}vЁ"BhM,X1 1d!6T{jdT2Q?î2* :!pϗ)$8*yb]Ȇ 8u*LoR}6M=M#ܠ "y _UJ.> evT/J`(z _io U6j|r"V2EFؒUh^Q+͗?U'UDC %TZi :.}p"> GԮ(|K_Y4BuE3./[ukZ7y}1%B{Kͱzl [kwi;6.%X4om1-hmi.kpǢW}ϻO% f?!hʁ,'W]Ƕ>xmIOSaPP=[wɺh4e+B{ˠ[RI-SAvx"lDhk- [qh6վӻ]֌ݼ.ov>q+a4.ijrClջVjliusdMh6=9yhmڮ7,!-[SJW˹gX8,ݔgNS7\-<9{kkF'4u$m#|b],Ȧ)aY㩖>mMm-~մ۵n|@V\em'IRhw =#i٢ܭ2G!\vogxԻvɧ%[s=m}nSצ8Mh/te"m)'-qRl:X].xt1=.dc6 ܭƽ5q%z~'إi+|ܲ=/Oxm /;5uִ_fiDcZJohuuwY~ƱZH+V5ߓ+WԞd5m h|,h3ycbJ7dzKPBnlfwђ]&kKL[q*!&n{=?pV/l0%CnarkD~`^6=Zh'8/ɺ.YM&ښܝ^c66ɇ[&ٖ4,ae3sn7Gnn-x!g\ƛ?cnOD3:o[+.ׇv8M;6?.&Dݭ&ܭC^ZvLd dݚ#}rvوzMw@e:蠃:蠃:蠃:蠃ͷx|~v +JXHKx~b '~NnDIT,lʇ>J![]b5 PR"%$ %%JJ A n_Bg)BJ, J _H@ Ba 7s2m DR'7RJ T -P(sT(нP)\mi϶%flBZHkEJ3F1Ka+ؔwHTX8_JHrFmB eב ljrј1J$(%H!$HW%0չ)ԫػ4m2n2%R(Fގk?!ce+R2XB 9ed/DKosRZqeݒկ#ڀB5eѷeX،l+3VXZarbږIP5Ho\rc4n_[eC'^7¡}5㎫˕lڍk%]ƕ %Mp۴$(-c8G cF$#3wO1۔9#w!0p#'06(+\VBc!~H,d{̿BC> (W|Ko@8M?J ,j_j'\F6ptBy`I^c5|{aot ՙL>̑I&3립'ئyصҪ5BIrГi.(اOZK)1ЎfW q#M+MiWъ?xV‹lK_[P 0zha/ x+w#;#S(K0oxЊ?ID3Vm'ESDŽxϽV;+'Z(7.scPHil؄{؜+A3\;F\qfbvK2nvo]&wXħ@ ҿ !\J,fndlהϕS fl1i /{ؤۖ>4b2yT ڦ6㹛X%KXg7ry'^b$$֕Mj xܤ4˝JbD3G˝״Ojtsw _9rj/V\S< ʧ@Xs̳/Lh$f~!lc IfXj]/V6\43s$vs@3Gp@z~!ЮψfGݜ!Iԭ̓=n\w%ic䖀vnj5^!>9pcws+؃6K$H >o!re2ckR*ARC}k,iʍWɿ)E[/r:| -fU7D R [IH! ˧hRF [ f,ȲeUkbz9"jfpqJj:+ Q^XMRzw6mJ>χK͑<_tZYH6;2 iYݡۼQء8]guN",.f=cSX99z*E!'$&xˆ ,Ud9?M.rRbeSn̑+^)|TRqzC^ǚʲ,2'if-lt9FB̝:uj:7\+c^5DzF$uYf'K\fHm'>XgK\FUXd&x*;$7 j~?[;&E0s~.*jaWFu}*2:iGD\Zv]BC5~\b3.Lc7Y]# 7^!P<[gF,7d1 2WH)T`U͍rzC9P>X.nX]R`fY';Sd˩P}|G8\Ng^/plnf*Q+dSZO2 s,Wy:ƋdT 7 ,<߸Mv\*mY+Foq˹HZ%YTdB/AqYvdtPnu(HVfC0{M]`%?afDcD8jz}kbJ5B4hT<3|3[r=M6ES$İy33Jf#e:ċ/H r3E4$m"jO:,.lY_)4nS(rYnZ`72JWЙLQ-MQe>7˰Γ,XlpT;+-Ovej+ \/'B3trȕw7(nUwg{CUԵd"ͻ n%wl|"-U9G5s6tJ(G2UcwvI+6eJa} u6xŶN2EeO f# [k9V*/$9$MQ]t6FIH k*y~XOStU_YެS S.:hV 34VɲnFdϏr lR~C^%HHŇS^l)(d^b*b溯ld K4vJ^k+; ~T~f^coR-"mr,&z5g%0נ]bM>l'خ6X՘9>&UF`]CR:Tk6qz+ΟuօOirȩfv>=V(Ҭ.‚\"RV/R\t"k\QIߦg;B]@Y4.R~A ]&k\NkP0UlP6zDhwܬACO4&[.?/s+sk$oSL&)شg7^&7wdAga_YVezT H۫+5B *퐥ʵ%,gz3|7dQM`wfmqfn9tqؠ\L "WՋdMl֣p3&+EI"VN.1Ÿo ϳ2M!d%dIpC_'%\&[rh&WYS+lrt6!f5ɟ;"˺;%9??baC"jJ/?(/OU1Vd. kK97j7HNlf[NpfES)QYkVX R f,ֶߡa"p?-ְ;̋xc*J%/xo:o/]C,4)ы$(r&Ken'G^ae!ƋVei`U8lΔYY嶺\/M~'CeA*by Qqx3J=ǹ-tN\ onŮ;\R'aK^ݢK-,,%6=_ \+=˳"33eJb!k%83\QvXvإ"WNRzBA36fve6L7A\-NdppNae}ƚKX ,W^y!N,bmgkљsdWmF܏\盵-p!q-&icuH&Q1}SIkPÔHFIU\Irb@N1{!O I<‹K "'UY c ZES[dY℩ֿx{f_r!AsOB8$my%doJ8-={hm<1qZ˷ho&O)t%)?(a`lUi!gY+&nlE4\jw&jOnRr/戦?q4}e΅Zvޞ9MY&-DsKOC3`rhO7l" T{37hjH4c=s:ic~k?>Ͳf/p/6}D#vlomū9:MM[+l˓Sr|7H/OvV2[qE+ʕ ds❻M^.z͟{B2,wvOk?u=nk$V >%O=}jL97Gkn: W[д9o|?:9<5053ctua}BvrG p6\DJtwAtAtAtA&~StAtAtAt]t&tAtAtAt+:蠃:蠃:蠃~ЙwAtAtAt::蠃:蠃:蠃:@gAtAtAtAL;蠃:蠃:蠃:W ztAtAtA 3A:蠃:蠃:蠃_t&tAtAtAt+:蠃:蠃:蠃~ЙwAtAtAt::蠃:蠃:蠃:@gAtAtAtA~rqZ!|wS9.FH؜x |~N`NLI~wmn0Ha&'gH[eαh᝱L37PpFsLj~5: 8H6Inm~%I,F8_1Ȏ/>`]>Im-?!(照FGw_`?A~fbQz(qF?Wv]ÅнI? /A#Ze`vK,Ws:t#Ü \;p=pSeQNIY|07 B8ܪf2H/=p`2r?y+̎RH/lV<%*Ü?#?cLo=,{z^VkSÕ!ظMyW&aWRf2{HOses<c,-vl sHtc>:2ʍ(ޠwH}$hXcO]a*> ;9r:هnrL7\/CC9n>l#ӈk)f&W86əWLJ)N8DwN1*8{N$ |st+l9;%#'_osvgN(R{w m⛚,//prKbܿVO>20N㋚Hdt Ǝ˂}\`}я-~>N]a-rE*BG*b3AR>Q%ܝ@K[^7\#z(A0Ù vK•|51fw׫|tO?="?N?M^ԧFvf'mMedz/;c_qV+#>3 \=HߺS{. h ziػIUFYiסvp+P'5ߧy"y,.1ZgGO/GYfN w~|[]28'|drϲ8WYStJmFG*$j*:)K`ϲMynG9vƥ}1;J!3¶396k\9ez 컏үsU=|19cG/A!9ƅғܷ˗^Q+.O&r)g; ^8G_sS7sԾ.sby :v$s=xwI%`ש8a^L/ftʣP{ָph{lĻOshNWhc+Y.0+-VÙK5^\fMW6̥mVXH$ȋ(;d2^Ygߠ]fa7X%&/:[G8'^hc# ] G.+>X6˛%|oMSJY&zoZ34yg48KGN0q=ȩQǽ)^!FjǞb8`)j~An$հ睃蚟ߘrD_Y1hmR8ЅqMsmÔ쒊y2`Bf8'y2sx|>~uM'N2qM"#$U7cK$xnNH ; 7đO֜ | fYkƻJXl^<;_a~/cavjF&bY9˥Qd9 QߒTEzw?*!/‘Af&F#1Lop;f$~|<7t_b߽?'< M,y-z]V 8u&U>UCI$ۡ.NnNpPIk3(w9 o#J1?+}bɋQz/?fR8b>Ζd"Qd.>\AlX;qZֿ2e^?9{I A0)b~a =,zq=Dw>?,>i~>Vߞ;j/~Ӎ  Ƚj6%݁~✹`mBqrs=E o.^'Vbn㜺QD"pgγq]bςRA"YAUSX;M6;7|e _ >rMg s1O#|u6?zO-U}<3b{u-޿gw7'P ];&eÅs >=C 9A](nנ@?~/'8{휤jG ?&ft*~ǿ ;?XI,&_b1G'g^; ~/v4̑(߸(^ @ա),d^X䝯@ <ϛk? tw_ ?ݗA44]E!z8F9Q>\zá_mSŃ>NWX2?yJ]&0>B|kOĺ@Q~OhGWy_e4ǐO}'xDޯW= `4E=C\?W9Dm_㼯A8t?b?7B e;q;+09ē|<e.I0ڷ˽rkdw(gg޺y?,#?b#@%n όe22"on~jXdR?Y7 6S7ca7Qc ̥_>{g?;%5oj"9n 0?r4#i??##5\^9lr=${+$$ $4G <'řS2U:K57gr{8Tx߾6$Swֹ=M?wxd3kn3"o}=/25˻OX{x`u`p$ř{Q}ycG׹ro_}-;K8y'2_;w'e{SPй_!r.-E;tQ~ilY7'y/|,p?]Y8'̝rE|^`{0| ~Zcu?/d9eVc1?XaxGCI#נܸ?cr‹>&cB]"~/cw]fۏ] 2SO𯃓oo} |ȷLg`F%?ρswyE s:3%nӗ?C5_9^?\#}7k*wo%nc{w']=Ɍ>2F߾0)#ש]&"t?>{lfOwk<&Cܗ.$2 >sv W?~-~`d/a*<3`47#'EA^*J<<Cct^g_ٽ% _8S fl#}/`=.zy/\'0rE^/=I~ynΎco ś{[!8Khۯ9~k$ u&y8v Oy/n0s 闉%-./LdmY1:w}\pƋF!> K C#ڨ$fc9%g/S'ykcm?l~x-&/l:#kbd .^`cy#>N3\?53Ŗ$腅5F8n(sqFW7x~IuKf:%uz>j}|*h;88ݠ{E^u=tƩ~v<>1N9&}TRwlb]ᕯ1z>f]eo>O4QOa`k6<̡x/A#o/Ywr2̾.o8yxKŠĻ_'0}rˇ>aR~T:!>>=qw. G\hKlK=Ρl 7F[C*x,7GT-N1 ׷Vؼ@2"]l8#W9u?ohr7s١y=dQ|),.l;sk˗.p5zt$ҧevq"T{NЛ=-{E#8B||>x},)djv}#W$`{Y<8C<)2{N]atwG杧$˵w? zo/4+ՃD6Den(vm6^ٗ U:rG1f&<=Qo*鋳޷.~[{(shw*]Lkn8Eo8W=Ht+o51k_##7DG^Չ(އ\w_&~Ր7G>Wv9qgt_ܫWp"A~5ˉ?M5 B(h Q(,,P@ @PH!P(!@Z )-H%D %R$%BYHia $P e !-$R)RaY}_"eBI BX!-R)M_@IR()J!D(THp_BvT(%@YŒI(PXC"| eIR)-(iI,Hea}TZ@IO,pW*#sS;VKR-1"-XC( r@YaK, (#[)H퇰$2:HK"0RS@X~,x-edj+cBYua{ eƢ,%\= O)O(g$,p@fBIĵc_B*yMZJPOZH!؃,,) /l/j rǨ=Xgޏkq!]?B~<1 ,K`IOlْ7i|M,n?.ǸzBy(DhPz1nտMޒR g`Ʈ)jgel֧4?B4>) ?r%\N.y2˥W[?pK_WiO,pp/-=1^ۦ߆3<{(P>غ('}B lrX8r},cte3lk׷&VJriIR KJ$p\rȖ.Y#.OIK50\\̤ՖUB{[؛|'1<"ݘ)%rղKK cn추@X͸P?׌ BVJ ,mC)tHo'QqLq_,,O1ZKH|G ^gӋ%XHW0~PCH_S(70~nx+K -҇r"XXݼA7TҳK2cv$JZl-]|&BI %MiyrP[5Jia+S3a1M9Fӽ[{vԽj@J&7|Qty\[E+ |n^+ Zlڱv)CX-?#e71ӡ)76 lo7rs /JIW~>,d.2->J5uej͟pby'3s;P뻉ϺyJz1>?R X帜+;9eb 2|.>WR&WN+LKy'w .j͖ky\PXH߻T.׸|g| Bܝ=tAtAtAt+:蠃:蠃:蠃~ЙwAtAtAtZcZ/#5Bh7U;Yh-p[fA mZ^FhyyvF:aoZ=_[@qD8HCU0 B AXvnӺ96lLgHl$O6ci^J( q8OX>*AkOF-և'GGFpu&@8^@9Kq\#<@lZj\-]k6 }{q`]Kwh3vs] 8B6 M#WfƠ\hOiڊ1SG͙ڵ )L[mcl 5 Lڳ^[}6QwmTbĴz0<;6c7\I.2n٣1&_Wϗ{kK@yY7b[q]ђ]K|s.G5ckչЮj7}1:N f4%Tw R;-bF^뗞ggmo4cnaG4cl[٪hV#mt4hfs}_ی[8^SwIOGL ޘFJkld!61؏D=3c)5ә'-Njs{ qHy(l> /K=jیU3iҍp9-[u#>ݖ v m#\q ];l%> űa1nc~+ba6ݴ/3 #$v3'kN@؞'&u3lͭsn"<ҭH-k8-tl8JQ)l)/ozsf1Tu˛g)1fLB;NτV$dVu?izvZO) xhd gzdQ/Sws$p <&7X%61̇]؍E#UYSܑIEWXw3ɱgx X [Ȳ3 ON[Xi *9HvhJ*'Wয়rxxiD? Qޮ|w#P iI-oC3<:c6 Uv -p`/]~$a(M/3W<(Y #tϐߟc?/}ienÛ)f%Tr͇)8aUOibsC $)6=Gvlʄ3́à GLmP=;db!fl n%v[b xoA7a_rpƦWΒ~l J}u+j['|Lc,kj~ߟVfRK\݇:J*px槿`dAaΰ`q0@=[Ezć牅\C('9bܢpfeb Y$b*e ARF#Fv!\$JD)pHgVGۤ7P;qܢ_KS>Ig? ?X[@#v9/1;M4XSo)-E@E38^bkk\e*Kgl[O:E`go K֨BWdN$ m`^bz ej!\h} NP?aB!Ty6W\'!fY#kl03rl&2!Ё:@9-=\!stpaë^TOϺXD?7.!Z:Hu({O9yƲƽ>d-򤅭-ٞ־.Vabr#? Ñ4!,Té mٽ#HG36P7, fA X njfO5J25Fݵ,)qdD'yDj7z9&*[8 ?8u{ϐ9w] +Ux8NU{%mpP9Xf4nd`Ł.v*:GXL5Nb-R=Mߝ(cݳL2(zd[Iz><2Pa/ªoGYc9<*?`C܅eWb9F fjpnp޷0+[gX },ityv GJ|s%DGyj@ (ɨ `wQn]XhKӏpFDjdt<"Z9õ1_3n(Pd8 gHcXiK\փȱ?uD9)\럠]:sLG] nC|tٙ/5&K rp AD:\l.W3(HQ-z9>F>><1<a.yI e%֢>nv8P+|w?z,O 2S:@7/}jn6$;y6U?$#,؟!,h-ٟ١WmALHv;L8/<6F%v̑0fyI^rv"v8~ 7=Csax? .M2noR3U1_)zk{G#Ă;LdҜDbEV0zxl^%އi8-g8pOKaJ)#=-YJbZT0BBb^ntM{=\~#Ca la,ƈ䡜$[RJWjv{-;4Ճ b2,tC l9\ ot=D0f~R;?fX r!i>n"w_a7@wl+VAj'|Cr4 ӯUy Evvm8R~@a_n\Г[D%zƷ.v1gxU'E`t;)TDaJG.%k,EV$" wߡ rZ_#WrA~o t%hɾ$=CĚgc?@ZDzBwXY*~E.\0S9A_=K6JƁwzcf}0'peTb`P Ţ7vbQԕCQRQ5I& y,E gza&sC=<$(X9lSM"ޛX\yODϐsUVe;NȞM! 2,V fBSL[s|y{8'2!BNwĊ+VdkGi.OA8sߙ+9=eoxhg)ш-VaZ8Mc?c}ŝ[` 鄼?31:GǏz |<_}AkM9cr1{< *N}cB|c1H{gc+~"9G OK~q/OhDgnf>9!o|7^r~&cCߺEk~ILFmy˳oq[.OX 1?y x{G`!ed~gn=\??s9w#>lgW-4G|0DtO[r3qK1߽?G>č m6;ސWOvv"7PwSJKCǵjL?kv^Grxk%ϽoRSş0ݥbOL~rq{̇wַK#F< ]ޕZMm7;p?+o74oV#| ,]q:&hwJ.i}qQp KN_Wps:>KSBn>Ճ]n.'Vnoh~w\S@S #F{['۔ÈWS; ɓcMx8 0%/C{ןTQ ')s^%|ߦ,x&/Yv֒ME`pa΂;)w{G;1=׫-^?j¿gn07Gbv+[D]-& [3Cwy-=>x'm>xh< =&؎Y~ЦtVa?sѵ9Ai'w.w^!Kpi}>f7Zp{ȵb1\yzr:!m|VȐi|ܢ[5^, ʚ͝]cΊ㛇)oCw">~sݥt`8|3qL^݃~K7B07|.>`zx2F~Ʒ8sNd~qzJpsOǿ8^}r2uT)b1oQ D7ݮ269v9;'=&Vph=9hN>^qpHչ`v^kT>_KɂQ#^ܣW'X~-9F..?>W?< Yav]Tw돿( S\\Ww9Ç\^ߣg_é?rpŝwv;w[ٽot!=2uDKtwkzV :;ͧ::]c{%sY:yIpjx57=|DAm>xO?rvxG.O"G5-f.}sxv[> H7;|8Dh͞`J>##yʋhW?-}m.9ٺAOD_p},:;xl5vĄI)\Bң0 YvWO`E"W;%?-~2u7ܞLXEhY1c_Ǽ}ɂsZ[|p9~  }v'w(}j:osqs {\oJO<4gCv= n:wx4J1Bhc9\3wb)␏=wˆxw/ gGTOϏ|rr#{Lcb/zνל?cx#n{Mʝw)[!||_,n/P h΋7>>;>G#>^|I{(dwi1Ewg|X)M 3/sg1u JjϰPflE˻@!{߭>>BTn* ]' M>WlmS C|iҾ-Y.ڍØJmC}1w;l_:,t']J} z7fzS㘘FwA}mK{< 0n;>j~4734!;wOnQxz ^qS,핈'{23}ڌkјޑ`0Y Ϙ˟w1;}a0 Yޥ}Ɵ6U?G?z1`bvyT;P}85M?:B d_qns5$۠Wy9;ڌmӛ_;ˀ3N7o\c6wc#o&[38|e>xmE.ol߿A?99Oޠ %L*2Ά (EhЬ%2d2RD"1Z_>9d*a-"%f)qe5cIRu*-AƩښ^ؐ;guiЩB0Lcdx-|5+DT>\ޕQ ?Iڥ RR!H9 hks1ieuڔ&~3ˬrU(쒱KXvO܁T"rY L&]7Z$b&]t;d>iDVM&*)%6ңkDj\G"$67N3"Wy{rLګLf}Ly z\Ply"u\ISu rXLHyI#eLqC~/vҽtlIK8H^&f$LZnD.^c7$N%4Z&2yykI_f\u.MG+'&l t dqˆr0$q_Kd 2RHyZi65T%ZTK֎ltMlLNxgfI6f&ωH I! {6~i 2ږ]wn^ِjfga!fW"YҵB~+K{T.εdwaR1ys.HkKw$CJm7ۻ iϕED45FN.'H|1d=߈#"we:IyNYƤ^nHSǬK9A|]贴a]ek{jܫH%%w<`t[$z$g2=sTo$q,͜4y%&SBm6kZҜlcl;5k/LZV$kS&i^+\IRk"YroOl<[rt6뜔ں.2FXQ2ul)XKE&q!Fukdnl!q>ll|5S:_mE_4&g&ڌk_RCZLc{HLbX,bX,,?CBɿI@H 9|)@&'B&OH)H(Bd'BN۠HCz<"LR"%_Y7:%҇F!T~_!T~=6+ K~?#CJB&IlUyv"҇0$C'$_"UaP62 /1gҧ%&m#BW_"%mkb[ueVDr&}dP?fNҾ̿drk˼3 /#ԆMenBHQ˹gSg~Z1'لgsΤv|4 is$Ll%!e:7!2_Dv-H<q-,H3y;؈!/cl%_%s@dmj$B؜v!*/k;M[lĽ<#R?]]o#OU~}2{s57r[2=rm7}%Am3nB8%7aGJn%!m?R,ir :O2؈Y6#_/F,1rmŕk|,xZo|Əܧγl׹-yacFce1g9ڐ"Iϥ'y+7ߓS>̓e#UN9g>VrrEBo`Zܧ2"1#|pip<}^W fC.5Ɨ 3&kqҏy'-^ugWۄoTK>z7!m%:a˒ptcy 1|AkqkcqcNeQ!E98TU40^\/u.+n 5xL6;KAHi"-Œ-Ȝb0;m359g *hΊ]j6KKf;)%byƋFk.z^]jfs1-9No)79|#%KyڦrJ&cZK55G{Qb]ލ\;3N-FCV"1ϫ<':Wg:U KK3$4iLfyzy`h*SN#j:-1lڣ==eZ!J#X\J+N˻i[vZ"%nC.FE^3٣_SYMXTJK3;Yq\Qo7F oڡ(z i՛9en)/fj-?$5cEp0kN J7VT:VbA10,zMgjT}܅` h˼."eyۚR鵙g&Y4(u1S!9aE|ئx߾`24=}:CȋEG5SߡS?"4,+E!i@I7/у9i&[,Ej\r:^d:#6 ︜zjaEAiZYhJmrAi 1 XP /FH'd:!ariMˌkYҘosBSFUqLw0mn8X24fDgСKYe>?ӟjQϧ b~qFGv/xh/ްע=.Wϛ:tϼمpX;K͇ԇ/8NF Q9Az9?UY^v&Fsf #Nriw0R\,u%g!; |MΣ3cï* A81KA_èC[.抋AfeqgȢdtJ}1o fc%tjԝ.S۝1YG;4'/ֲCcy̸UEoNQ8 swx495g VnD֨JOی{y7Q=1AFKџxa /G#΢sfKCCDx^UIwQJ=};ȊʰFp>b40Xyhe̫3Mb.:see~Lzę *M[oh5ߣ&XΨzUIΨtr>m0m7ZrPEH' >Ŕƒ~,&jzޠˬ$7YϠX "*i%1ͮ˫y 8p}68ŪC4gY{bz]fS]b;IW?aQs9šf\uk_02?gQl`|ˢ;6ǣ3jKAg>XUEEyqkLuT\| x_TxYr9?'iv([U^tg\V oK Bŀ48Rl/#*ހNzF ],G16b5 +BT8Lh>6 x#ڪ`ӎa>2]iV.io;1GRޚ0|ABOQعeZiW^Ui "f%59hЋ%}g3&3pXMź9V9qt=}U#S`, S\()e5ߊLe7C*5?7x՝1je@]c`zѦ٫Xnԡ^se50tF 8# 0O2YrE,5FDu$Y\TWQFaTbU _ t{1CѤn̴eC߭SxW{bN}ap!5vãWvjuω! RH[D #_PQhb)@8!1FKĢV>nhX"FK\II!K$g |E1cbAF¤PK#"¸@쀣c"d9@t] )D1>R("VʣH7@E]tሐи(_꘨FysⰀd ( C\ 5>}J7oCA-". u %"Keb"_)< )#%tNi#GXbb)RRs=c G:+a+^%B%)!.Nqd\C:'Jjc!HJ$'54QR+#)# Vh*LLHb 4 W0pCLk)b&X'B%+! H!cp"Ja &vXPN"I1lE+枇ҚP: mʗh|bʗI%&r@K#v,): l9q#M DD(Q]Mq8&&2ኅV +v /BjBO`bE;'48ǬKrP{SZVEAO*IH{zQmx!^ķ4(Öx{< T @ERb )It v /&ǒDR$ 1M,e4st0Fห!d K%"6HdpuAB>fL9I xDJPcD,gz(1Z d$0PPRW7Q"fkP r0/x( E1X9.JVhd2'\C_ dIz&NuI4RFH JP(E"ƍa'6heEP}V*O2ɳnAH)+Єa GD#%4(`p%q{QpVUZ#\A/њHh (Iӑ. 2H3 q!$ !bXJqEFcCT&rܴ6Z&g9@bDzrC" &@#Q1y=ĜPHb@nG}"9rW*6i p@%''M{7 YL:7%˜K%Ƅnz|kC0ݥLa$Ҁ_;(}${B%+1wu0 !Ɖѱ9!] q1DFc>|M1$`|Vܺqrv:h&O`Qw^Ef9,Zsc"ԯ/?4~xC\x{\)'51 jёdt?Ms#zl7ONw_Yp–|/[r}w7֪@.V$2lcW~m-seԩ?Z|vCakB҅' n?ZcYv~z?*pJ[}'Nby؏UmΗ?J<=yl]q9;p3wn_h|k.q)F+fn"w?sRy>'5iEj/}+,OʧQ$w$4G!umkѹO"$7GhqO=Vu hھ׏ ±z~UPGA VEh<=GJNz, LO|?bBI?*}߭FepTl&N>xK+(rA>r([Kk[_ N[vr 0}1O2޸Џ{\x[çi:mœ|3!Ӂ>>ğOP ^!ͻ7`xJp[\W5GQIX_l)&{UfoT6'}ނmy?#]#})*޸ cZ (Q?|8? 0o}+nX_ /wBg޸i߿ޥF|z~LzuH H1ځ uwN'rÿ Ǥ[lҪzO\Ho/ v楛HҦmudjeǧSo x}Uܑ+M6﬿IARu޼ODqp՘܊iJn_m-<&3hU!roIOC3\1`TG {xإui7Ϗ*g@WTy=:U9r]SwOvwJv*r:Lӧ~己# >5<3 jĻ.cҡowY?ǜPòc9'ʞ='o\}p}W,uH8*<WrI~O7q'_|g\)B^BcS\dl_zJzq3TOxz05y2㡞MYڌK81Y=v!)FMݫ_D!%1kڬ k Xcp#Dž4oFd za*ϸ7O?\K{o?CE+˜noNZvV ۘZ bۨn78:n]LsiLŃ|k?O?wRV't RgY AV?j?J2H9#ߢ=L_+N|x;Iaxohۚ9]%jM;9F=[``))xSQU'4)#LAćIdςs3%tTT>:nVH%&V^`Jh]wv.]޻4Q9A9|$ڽCBt}Mr?y]|3'6=<|Z: *MO3**Sh.n>|&Wiĝ_G㜮ҿHh˱JӺz~"r'= +EyLX J(w{Is_SE>\<i[:3%&9ܞg{OspUzdO>Nr=,7&g?'tQb3֜䉿oQF91՘|@F3t?WAE9ZY`I&Dde {b/tiIOQ|ߑϹnF1U4}2/&pBw|'!tEXtexif:DateTime2019:01:17 12:48:12q:%tEXtexif:ImageLength300~ktEXtexif:ImageWidth1843` tEXtexif:SoftwareGIMP 2.10.8IDMIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-graph-plot-title.png000066400000000000000000000074551477354127100306330ustar00rootroot00000000000000PNG  IHDR@aBzTXtRaw profile type exifxڭk#)Y/!XszLW:]=#AtuIqGEkix^;?^{^ݙ==}sޖ6m(^f_ hwq=m6=+X8.,u5S9'׾s9|~pʋ /}aE93>Uُ\Tq޶r=;¥gUkB'B'>d9c3F+\`2A-y5 Wg 3?]? +WBlXh12 9sT.^%n/&͕ v?&gl D?tl1bB_BP5Xr D MJpj%>THj X9 C]d'"ET4%\8kҬEU65\V{-AaJSjkw&}đF2QG}>3Oeꬳ;J_e[uw؄[vٺnbrNG-iϨ5C,_ͪo&щf sq5hra[$)$ZgC QNx܏9rΠ ϸ}WEI@Sv4Ρ)H"#C6_lht}.+C^UڽzѮ{7s*1 >TGmh$[o +S*mek~9o3+XGr{zɫ;0qimeO@mxu -+JcQZa(}:6:!:s+kkHc-dwOk7-c,NP25BDVܻHMkd/j1:G{ Zh+l3J~9o҈Ja+%lL͕(ڒ0\?*=2y+ϔj6aAD r<S m4 u'ÆƬ PPo1͊zmxUb|Yb]{=j}/\ښQ:P@s5Œs#P§PIWʫ Ir#Em #)Ix 1*ڰ]^}∇PN^G4SP2! yСVRhIu k o>ÒpBYj˞d9E)Mb2.D8ѧlO}#% d3BrC6T;G '[>ZiN3ג'} B䔆 Qg-b{V;E ю Y~dN jlŠ (R[_x~zx~z֥w7<`ecvKj}'B^M㔖SPCH4@7dm+TqBL>-)?]< zU9":('E$_Ip #YBB=CT)LG".NES CPT7|FFbc'L*0i1b (T DŽ6bÙ-;^Q[&G@P(#(&``b'{VYT OZ4CFb v2YHd#RkлR0b ZLBj9@R1G,*f22;𥤎e~w.b1>^mVRjWYVvLcll n[VTj(((@yy9222" `ݸtRd'AScCCCFNNz-$^c&2===]{UVV .\`j @ @ @ @ @ 4#5[ٳ'uuu+5fXpy`xx ;wXiwIjj֮Ν;aZa٠-VLjݻDgg'z{{9`~jl*,,Dww7~?FFFpi=5fZaQZZO>D |~{ݻwPmmmhnnƕ+W" kmm QUU֮]+.K5q1>  @ @ @ @ @?ObBNhIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-list-adjust.png000066400000000000000000007776151477354127100277160ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME 88IDATxwwtF9' l0 ˮ=new]]mْ-aFYMΡs==H <k>S]OI۶#   b4Rg]bAAA5UU#N#I:7!No}ABB   TU%J{ІqIK@vՊfZPRYAAAfu UU~wZޅ.Ht @('b+2=Dv!:HmoԐe YVu ]Y{/Wґ$ YVUզ+g$IB>sr$I>j{)۞C_d:wzI*wF9.7S< 4MGUUE緦HkIS0C˲Fg/G4$&YI&3wfSnlih0`# iɇ Q*gΜ EA6cF ܲA1~<ȺuZmrL'(OfӦ 5뺞;̙N6lXhDut]G$cVt]gppg?>UUh6xfϬOL"7e:2>>bـx]|2|x, C"@`08v{b`ll~ l7p8B!&ǎZz{{~Ȋ+|={P( 1>>ggddшhBT&'Xv-]]Yt gΜabbN6x&p $ T5hrDXM__!| s;SSSb4l<hJNp355A48"_7t l◺A#M|G?f |Goo/?Zmvn|@ee%7or122Ÿ]V5\ :D>Z[sSSS(CCCw GN>Ν;> /nd2}G8LMM__!Ip ***0I:(ϣPRRŽ299I4K_]vq1(^SNsAdYnTU>رc]]gYj%۷nr=PZZ7Ç"Hpm/t&&&ַCGG---裏100@CC8pC]] w>n&qS@AxG4M'O9fL hQ+VHee==r 8{B]%I&ԌnG5b8w ]Ws٦bpIV^MSS3{&vI&ȪL&H$$$ҩw}uA|G|G|G3]u]'J%ٹs'ǎjE__?~/|ccxxqqx N8j̙NFGfuv/Ol;3H$Boo/`M ݻχl_[9q<,䭸\.t]# q=D"Qj\Z#G~'׿${cbbl6ϟ…-;v{raV+==/N,\:N<//[dY&osqlܸMXlinfΜ9'>qq뭷rW2<<’%K xݲv^|TVV3ϒNI$=zX,F"̙3tu?L]]- bHoE O+444zA$ tKfG|G|Ĭ۷i~tDx T#IX֯_,<3x8ɓ'im]D__fEy)++errǃj ' |ujuni*#DQV UMNKa01f$IBUUL&cn 64+}]׉D,ɓdRv;h կMIܺOUTuO8p׬ gbl͛7:WfiX`>U( %%%RXe/_NYYȼy󨮮eAn`0D4c|MlVhnnKЀba]FQd-j[?N:R^^AA f&V-rdb in˨ qM7vjhm]Lii -lRP4D"jkkihhEZq]̟?P(²e˸曘B4*6mD]]FE\Uz=ZKH$Yt)k׮V HbZ[[bR]]Mmm- .RV+˗/gݺlڴi[Y,]Ō[ĢE Dt6lUhiijXt)555yWشi5n ‡ c0e)oX D0f+8GeR$ 0>>fd2纻g?ٻv{&H$͙댍iv;##C$ l6+W:vHW4F9gq'X׈v' |4 t=3xvDu9eG_M>ku4u 6edTU5N:FQ2d#2tIPI[U\TVVLg-6LeTu& 3\ X,HN}kNWrWfkv Pez@)s=w5\]o2w6yWH$3~KKמ iƉ'H$#3o\tRFE_Ma7d{ }KzwlV{A࿋2GUG AwG$lzxGߒ7UqAAA>t]gjj A$MMM[AAAH$>!n6AAAAC a.u&Åv]v3|\ ,N-?ȁ   \_f΍r[,QpiZnt]EQ JJJlsNd:fI(UUUMN*ͧi[ΗH$.;Rw˱>WAAA)7,˜9s=z@ $L{n `FuW~xSNaH$X,|Iv;;w0-ٿKe۹9z(|>?ҥKsu1twwꫯ2o޼t.$Dxٺu+/]]]zsyMUU <,[y[$IAqxG(//p^#I{/xλ.I~]w݅l܋ۻؾ};re1 Q$Q֮]W_,˼+n$Ibxxz UUٸq#{Juu5O>$eee\qϹpr-G?b(< h344֭[Hę3gꫯfl6nv^{5?]wE4`bbV6l/Hoo/uuu,]I`i6lE.XVdN͛y78z(.뮻YI&׿e߲e ۻ   ‡Ԝ]eYĉ{=z1sO<(v~|ZUUmo~& PXXŋ8t]]]K/qYǹ(,,h)I<,Z( ǎ8N^xXr%6l8͛hEłbl6c9tPnݻwkNGGNBQFGGg\2d^~ӟ244O=MMMtww~EAUU:::Xr% l۶=?&    \:s躮3ou]g…|_ _fMH$v\.Wn,l6n&\.>(oM<`D"j-b2pFRWW_O{{;/E4">OpmQZZJ2$HFimm>wA`0`61qq\AAClΈbPUUEII vNÍ7ވi`Z/꺎㡲"F#ٌRRRO<ŋd`` wJNAAnEfrظq#NdժUדJxgrϫ{^,ElWwǃXP(=Ccc#[lnpxb^/SSS$w^TNIX,RT.xe@("Lb1]H"@eFco@*d2JF"Vٌo~6fG7LD"$. Y ù8Xw]X,5ٲr˿]׉rft]' t:IӤR)nnVp8#   aKg{/;^tͦ8w[u;fs~4%ITxbv.  !'MLLC(;~5k   ‡!_<   GRAAAA>    AAA@    tAAAA0\ E6lw   >Pz"`xx;EQ(//AAA~. Kiڜw/[-+JQPP@}}=疯Ȳ<+iͯ,h6kdO7/]hc~YJ,{ۙGfN;]\hY]h zȖC:3?ov /HH6X^Ydyen}7~_˒ 8>%IBBB չ   |(7y'''$`P%\ʲ 3g4%Lb2f}spgtM(,,De&''`0PPP@,chhEQ((( N344D0nc4djj ݎdBQ4v$LNNb2X,099jb(Jn4Y`ll ͆babbbTUeppd2399DQ8N CnyObB*:fd9QS*+Y_hU@@bNgn>А͖ce&'% tIn pXn׉%dt=3L(2b<:"+N_FňkDQ, a1d2ҌDFcRL Z|> vւ  9VSy=+OTT]/soD \&Jlp𠂮K\zns#?su^Dɤtoӟ+p[$dIhBo$¨Q1|76KJK1b*>`Aƣ GѱL&cTsAAAh~=Ɖ'4551::J<fD0H'cZy9|0 Ȳ(D"7'a0rw%I"L*x<֭[9r: ,`ppロ V\ɩSضmcpp s=JQQ whoo#NvI<쳴Ʋe0 ϡCػw/%%%LNNrO{{;-^?yny?g߾}155/K?8uuuL: D 2V=il(($2eDo7f7 TWk9FΞU)+ع >kb '0qjj455 PS[N1$$Ot<]EǘO17?g~©0Gl&۳eeJdIf4:ʋ=/rlGƎZ܊I61iH|u`0 wwcxMLͳ!h9xPa`@a" -|H&%FF25Vx%&khZ^ΔcsF*FA3L:F#ÙVD zMyi*##Z3m&el6^0֦PWYn  Jٜ S) qv`2,(B0Ĩ &FGQ$;,Ztt#h`% HHi)lF$|d`?ϟ}#cGw1;#92~;ip7籎2(_}   g⮪*k׮% с,tvv*W^y%8?iȲŋ%K0d}cݻ)lB(E׵l6sw:ַc\tvv0oOs)[VFt~s388zu,QioW((y1NgL,XxJGDyFuFG±c 2) P^q-)%^sMI?00 IiTV<)S\sI^~ـÑX''>j`pP榛R۶X6,3CX;(PC+jG~Nx:dRSl--% op*hCU]^EAyu @: ͺetvs!E$OНܭkMӦe0"˙x{+T**4}ֈǣjJ<ǎ)|2ݖ`}W2A  2 HA'zuR)ز%OPL*ET.,ݞ3&|>d6ok]pYDehHKf"={ $PU15%s ȢE*+W:a2x%*4yx-_e#r/3O09X\`?TyyLI)>5Sϟ}iv09AA?}Z"`|> g>úuؽ{7hX,F*bͬ_jjjhhh_fL&9|0x7aV^M}}b˲h_fFcn;vnl6c2rw4O?4h4 XlGD$WUk3+phqy(]AJGec71)&"W`3ذ,)YŨpx:g&3[x1AAQfnO b2dtt45[uL&S.L ~?d׋dÆ lذEQZhF0$Jt:ɓ'k0' ?:PP(.NsС\vUUh4Fu6mڄituuǹYhne˖qYg?0>`0H(:\s /v|r9y$mmmXV\.>p8@qs1f1uN=f\22fÙee:g$nFO|"Iu*nٹ3Z,: +Vxc3gi8sF!UfOQW,Z~}UTVX=P **2`ee&h_F_CflLfӦ446jX,0>.KD" 6 dz{%<X@4X,L --*'O*lْVGV!# 'N(\aCA] dfW7fQaANMfQRP`Ukx,Rj=C{0\[-6 $gp::#\uX ֙eÑ#HZEzI ʩSh huuHze%ʙ3.W& j)kVPikS4((*SS2*jf),<2`2e:%%)kת(JBCCJz̧ s̀|i3&Sf 5NTH2UVfk6Î>dn0)WPb"6AoʲG90zJGqԹ5[ [jMGq49i4t%+2JG%}>EuFԹxsMYÖ-4hkg,:u Qd-RAAAx$w{O*jxwrs_u߇B!=2β߮]y;yK&Dsr'Jڥ0: о&d2vnzZfvɟ._iKWj,YtmWx^}w-~ުi䏸(ITho8L\^WsNC{ϗ4\vnN$| ";z~hd-!MmVIRN[Bm'BAAA qfF sDo; ;Y\ߝFr[YN ml\\_hܴ ޲{~`xp&.[%(p21 .B{4kil6wSSZ_;Yyvr  aw;HRbu;/[|Jw_EI:  ¥exIt][.]A5h+MnAA{gAAAwB    tAAAA    |\tcw_kk/FBBܻ/ =/M.]>`~X? Cy(u* B!h&yf3.t:M("J 8F#`D"OvdYjp8D"D"mNyyB24M# oel۱Zokz P"3]OYi,nd]:G: u@II;// Nh4J4E?~t]t+I|}l6^>AAxKD4%NS^^Yx)t]}y߹iLLL`),,|y$ PVV H$H$2(,,NR) @S$ v >AAt._,_bfzw 4MC$MʞB=!};u~4M PgB秕]+@/(]g]UҰijt4RM8H<GCCddd444]krmյlJBM s:L0>ϕ+3Δ:t:9t ,q> Up\:t 6oޜ (&''ioogƍo>$IbŊr)Μ9Ckk+<8pn7ofbbCN)..fƍFN>M `͚5tvvrI.]JMM hFYr%nؼy3&#GCUUK.՛av]]]̛7Ʊcp:TWWUeGAA|oٿGGG9}4j*++s eǷS>z{{bڵ5Mc߾} t:Y|9]׉DQ\./䖛Jx'Xf tzL&S~v_-  \Eoos};wd``@|Ҍ%κ{3'{Vy}ٹs']]]$ [)It:w;++VSh*Ąg VJ%`ԍ8[X]AMT"c_]Un13 >dt]b1 sY~_L&GexxO=?x~?Nex#G̪T*|>q}q( 9~8G!2119}tӧ9{,F^x!."oQ!MxGwHnz*駟FQغukm|>yv;}LMM199Ɏ;hkk#N366F__?Oxel߾)TUeppk  ERt:͑#G8q>.8AtttpimF"`̛7oiʼ՝l"IEOzq{9E5k>]h>rQ:::xW444PTTĉ'سgμyf=wnioU.Η뙻T| • n(B\ 7=ϰgt^lk+%L%:P};vz@MX]ݸne džl6g޽NSS6mZZZxWhkkl6sWr\98puE"(//3 ODoo/EEEHehhEQhnnR:ĕW^(l߾#+Vȑ# #n;7آfppײk׮vލpWo>(FbxDZlsW#2 ʞ={B Ɛ$grβQ'ID"6mľ}[gmתcu͛1 |;atuuQZZÇ B(( NdX,Foo/|Sb\uUok AA ?I>j,'p5PTT ϝ>NFQD@ @$/4ds=<$ Nϋ( ׯgD"~pً\hF8&  qTU% seJQ]ٹs'w}7|>~_u9{iǹFCaRK) [bƢchhGM&vTHlCt03DWulX++VL7sLMM#pUWQWW>?h=pqz d{6lݺݬ]g<裹 pw~v ìZ6ߏ$Itww399y^:;h4J2Mv/}M61::0:466UUihhIؿ?Ź.pT*E,]H" #IRnwYٵkh˫J$:H@$9ol˲ǎ# :` YYYɊ+$~~?Nl6s-PPP RA-N;8vկijj:/+轐%KP[[7p jN C/| Ȳ|}48?8He˖}{n}f;o9,vZꘜ[nMsWc2榛n"HZe\bYz5fUUq:|=;|캚b.#swh2Mnwd/-d]kv.,,*&bvyhG$ne9ו=\>]-KłuYy NFNK:&OME'tMa߹;t^:Z$IXU+Յo{kaF60 B,`>?޹ld_(+pwznFQl  s: "{~'IfE:& Js Nɔ{^,FƎD"D"wtB}Qe~.CӴ rG;l6DO̠o=C,2M%M|cحv ɝh4J(w۸f˽_L f$a4EDwAAf`ouLo\]d?if]S]R;:.||]:wAA-Gq]]aIKAAG/AAA9   z'I"ȥΫ    *((d2nV.IHYq:SAAAAx$Ib||ݎdʽ6p8L$l6ϊp8x~}vhjjڵe˖!2[n;}x9p%%%l6n?O*z_466x8x QK]Ԃ ٳgyxW$񧡡ömx9ruuuA?Çf s,}8x ˗/g֭x7|Bbox7e2yn8MMM({Yd }}}<ٳFiiinyPłhӜ9sR$I"yq%ͻh"NFFF8pX4Mfqr7sYd Vq/2===~|>H-[l2ضmСCz)++|+lٲ0;v젷D"AUUMMM PWW__rJ, ݻ}s?~|A/| m6v;+Wdddd2``qڵ~X`}}}tvѣG"J188ҥKټy3&֮]KOO{WPP5k&L"2+V@UU~?*˗/o믳w^-[FCC,|rt]P__Ouu5CCCA -͛yꩧHRZ UUsǒfN8:˗388~1>NGGX{6;F2dϞ=رՊLMM$EEE466RZZJooouee%cوba|Zenvn/@Go!}vTU矧NRܹ'NgvڅK_~;NB48Hߏ$JL&Yr%wu+V !Xf ݻ{nsϿ*I$rn6eKU /Yr%k׮}lٵkop:߳ݻ^u|M'>ɟJ%NssWF*"͹5M|d˖->|'?@I;& …$ x 8sG+Yhyi8q#Gzv9s 6p]wB[[|_oѣc555vmCaa!\s 7oĉ$ .]g?Y:::0B!(Pt:͛oٷo$Hi&>Or RԬ<˲>}}!tUU DB4?Ǐvn'PWW޽{y͛73|&''Yf #o>ZZZ+W^ছn7$Hpiz)zzz+b߾}X,֭[fcŊ kG̙3R[[Ν;dŤR)>LOO\{ / |t}ݻ1LȲGHDQQ,LMM=PqF-[tRz!v܉l/W_矧-[8|0eee,X@<ĉtRV^́hooUV+m6X` "2L&sUUFݒ]vp\xYx])**`0066ˤfJ0L shzl6299,˹4$8Nv;PH*"`x>F<i$It:$0sM0LLLJxx<$I#2(Baa!Fb2ݑ/..&Ju˕/ *"rK,#i8bBIHR$ B! p$ &''1\.T p\2]$  1 DQ~?n;N8xݻ?/N(A]$_̛7. UU/uACIQoΏ~#~_D"׾v" j;w/箻YA5Mؽ{$mo\AAA>>ft^l ‡j^l ‡jpNҖ|>_nIrz/z369F4RgEA>FGGZ·  G@xw_|٥Ά  |蕖\A.-wOD& \l   :@G   v.   "@AAA   AAA@    tAAAA    |]AAA>D.   KItrĻ!&431W5SfԄ)R(o9IT%vdkYrFMݜ远SFQds>b IIcd})vGlHÅ(ZN8Xc ebUvg#1[Tte ۻĚLѣLPf HErhQbX C cWwpYϘMTωI4ց0Ҹ)Pr*g8XNhԖH3nZOFԤ 71Zj,dDr ?] ` (3G1$0XR*KLo<0LW yCa};A8Z (:$Cjec ^bBFK;eJ4 ~/`]mLac(Rz9Kͬu1 L \Lj88aю(JJVP!`;&7{4.lcH`r 4cE&&ƨL09:VS~ $qqurbAQHiψpE; h6LDQ6$رzlT3VdDrI ^8ʤI0((e]FS S2ӜtStNlB>gZAOxHFS%$[p\R2HO5a؍sͩ2ZiIcq-ndp$QGjJ(v0En=ͼ{KP) + -u0%]f&nB!|V? W%C-uxZo*Nc (UkeL%%AG=̏,(8L̢33>"RMa c/5Z""M%^F-SMVchiۨS㰭t >މthP#5TEMxѵDLcMv`)DOf",.CDt:*T, wrJ6Oob &=&I4O-c7݈MC._t(Ի@G3:j?0ݣpSXMANLl$_1v9(l؁5#ײ0zn8MgRDvDGO aFVcsL7ӶZd$`!z%J vB6#Jyv!9!S`})z[T|n℩ea5A/-2:016f7I(X S'ҭx'`uRKg5Ƴ:D.SuҌ_QjF)gVCĄ%bg1v6X'Xd,XBS;Z?H_sBgݸLգNk-}Tcؽ ß(ځc9J$Ij˴9 MX p04%NƗH,eJ$YxG5+I"TI&rQ]2n5ֳr*Ihk'݀sA;#-`3I6Ϧ ĊXcH"ZZq$4F1uͮC+&M4p!H~;r!Eg8k $JXD- 06>KW1KLEF#Dee/QiTYS=SZc]9 S,Huk c + JF]CʢS:`[Ι5 ?Ic 9& t^SՓ!2ZjvJ[3n1w[H`҅R6JѠBw5ªyx!K2$2D8^DiQxu~|Øpi!EIA)nS>dVcj>jpTaI crJ&,#Z맼(ZH^H:F{OLڭXhC ]-9{XQto -jHvע$b˻'zI$BdSg'p౏ўt*(ǍZK(tF;ác2MYsǫ 7]gx+7„0o"? Ǯr$vgG2W sJ7?a7Fݫ|\yضzS\e1jK i'qr˸grS/99{(q]kf!8[(IkenNqOY(S+:ˌ>;[]6ElqN}LU%OPg_sg\' j >m}-(]2W"5 ]X;1u5 8ٲ=>PN66hu10? Yk/65ԕuE? zZ1g?c9^,ȇq CԳZ,8Ou7бLca{Xqv?ZIe~NVz4>Li+m?%dUwǞcPlq5L]FceKH;V?q)ɀ{Xeg_ෲcl0,8[ vx>՝zGJAQm -f*Og)˫H ^}5FA;\̲[(?K9)䛧rˊ'sFy/s&~:V QwC}'llT*2 kƿn6E[ATu\͑~v\O5̅clzi5^eV3,.Nxk:x nfɩJ-) `ɡ4EvTsx(عz ||ŅYO\wTTO-ɉlb׷м\M&-cڽ$Y{fW]|O }ˡ2>6p!vo獵eRήRaf)6F%0>_[˕aĒݴ^OA}#w0AZ}D#Wʘ9x Q߫~FWSx2,v#)UΊ?=}e/ƻV4QVQXsja{i7o ~[*m/*2z.P)U5@DOɏxf w#R[ ҿ"eNKXxH/ p?,OQxcu]*FZCDEFXš|c+"Q3C;F5?r~dU'`oZ6?i)W65X-~W1Cup)ztk~GVLz>S +2olDqшu_ܱ$߼vR~[8nib*]LI4gǼ wc&"+v'p=氁_yƛYfeC8+{|叉=Oxe_8xC+yg~W4:Yp/y"D{xy9f:7Zg֛<_b%*NN~j ^o?"y<90͔_Eט3g;7أgŏs 񦾙d+϶P٫Yt/B'1,>xG $Fx E}E_9x㬋kI`˥$MͯRp'wO/}ǡjݬ q͕\QpVΫK)~n(⚦R|]/'ٚ;^hNyXi} gX}͋eGɩ$u{Y|l5ΚZ9>KuccŽCt %WfKßĠ^S PFsgSuvNXjُ*KtkT2u1h8u(6)|kU) ?%t|=ᵔۻ hcLm,xMைYq:H6ř{o-6pśI73~*JDXRK;I4Qr XxNqP_3֎Rl'd7_裆j,ψ5QFPn#ۙx iSLFӛN*>Szkivi!|t9%#} \LN60T_t>ʳb8ʩ/vir^MOljNs#}.z%!)*՝nsQtQ3RVe o ;}^IY)&c$smgyi>}+aykWqL om[ֺ}h-{7a_Eggt YЦ$ I2d ddI$i߲" dYe IVPdP+ )2,(6(2,(e$2Is˒LZ,旕JLHi2ɠdKV$ο$I()2䦕sNEs̖IΔ+t%yzZY|^YΫd~NCVԧ"Ku^̏WA2#˳A$2u!KNN䗯WD$9e$Jn_<,aqdOLIgI g+OI.[=SNMRri+䕋+INCɮsd3Wn夐7,O>Jv~ m\gl̴Ay\ L)^\[e6ɳk/y̞_r/2ƕIOr\cRm~wHR+R^(2Aʴ:M;$%N%YK8L9Ka1?if;ϵleKJn?Gi Q^R^>&︘kKym@R2m),e!{!mf5q'{nKv;>NǕmzD.   o{8̙3$IQӧO#2MMMHFTTTd``/z    0?O0LBڵVmF]]Ç9~8_?)l߾NXҧ#M~@Wy#:RwI&//5eM7KesS Hl䭿쟤e2Hӿ3.鲔/'I4Ч=SV͉K眄[Nnl-$ܙYrёgeإYJys~f'grG*\=up^fO'& f?l=M#i嶍ܟ esLHJ=|Yo=WbJpNm&Ը#ۆtIlMʞn.lM6sr%~ٲdxfYYd٧^\I:&ʹ!>%XnԳG-2M_^izINer'K}VϬ49%%MsvyB~KCs_/񫞗D~g[:%?M~y.gs>vf5cڬ$@;g;ؙ66X-p^ZyxoV'ܬ}+\^R;Ot$mد^ uT?w_l<֦UdzUhyc}^;s.}&glC~*Ob:JyK:J?)/Ѽ5k{fM۳.LЧcf=7Onl9g 4?g-\䷕sOֹ3??Գu$=7G]/0Sf:ya9ߏZ^^;߲%90.mR^udVo?s4g>7Wni.m奯gC~Yf]%/͜/.Mkq5r1YO^LݞS4:BҦm"[Rw28rfϯ߹رcկrwpWc4)**@ @"@^)]ѴӁGRTTğٟL&}U5@jRK+7 WmdH"б|RmT'}<]9[?C=k FьN%32-6f|]: h`$cTƻL;}> &>u/{K=>Lo!εs8{M:syiZ7de1BhPiro Nc|];'Q|bQZ+~>}Rjr-{|ihu"ש#DD3fyp};!fz4I*'2-Z걺V;9TGa5&Iz޹Sr+!Bf|K {ijCG9|EqAc'^hQ&#E!N䘾u@1Z7K\%'vÄFҼ:bcc&*Ff"Jau>kG^b#8T,;0'{7؝ =lM|#ex26dhGh/wW&.DYX^NpF8DgC9IJ>ÞgFP#^oS{z}_]z8 [([no Xps!!W; ./X07 t7FX3[TqvEyMIFɶfyYI43s{1Jht2+^1s^C^>HeK).zmsǧ>IhdF,f30l3CH=t#On.#s\\V(4^yqvx7#G8x#4Tltri/{mr~j\l>Aw~Z`jLT"J/9t2ԃ6bũ|0EEk t $f$<2Q63:Q¡,3h0h'{Z 3[y2/1;z?g P l\{/fANGk+ʞ/G1V8m+U'zm,Kdj]m#,o4apn_{?^Afz5&wusX6αϒK{*ZSE7}=\c]#zdBIDATDv5;^(7.AiF;|m("5FM)B&8&%1}Binvkgb%G(ٍcT88:VN-Ν׾=mVe`#f D>N5y#I6V,2B5I4Mlσkiewɋ`3{yW| 9S`##ݨp `*vs}EO5EWX7LVwl1OS$(uS yx3;{ KLWKZ-J]fu.Y(b&yuh'zӣ#1ju8;Bxa0o'"tq8go!lz]=u$^^g FiT'$ !s8὇@B3x`ڷQ$+3Q3L NnPqV#VبSÑ&^Jxn߇tW$;(%{Qa5iźttɬ!n8N[-Lu {>zņ7BMRyI\. e(iPOFpmg38AlF`Y"2Ț0B9*f M45kT @RJ`YJXͱ'_ E\옆2޸#8*4}*PfXC0MF}u0#Cw(D*&Uo!ګ>H>w=Rm5J$iLË L231)SWai)LASl{홬%4"@Eӈh%b%pĻ=0RR%҉rSF beYAnh21.qs9D'Flޝ#:{A \፣Qx)ζu,R/O Z"H}G+e7m# R~mZf>@و-H :͙ Qc&!F*!ꑭ,qg:ȁWÄslO GzIy6Րq{OYNkk+L4ۇ(d)0 6(h75FqL*!d;E(iMԘ.Ven1rS&ۊZ&8m6tIfy_zYSd${24SQDH%옳ljMk +.(J1 lNq>̬KiD_(xn= "T=Ew-_>jXgfߑ2G)Ax;ĖS,xj:CIđ6=bcQҌwin IƘLVI$6ISLhT)vG㟦=Y?؞Q h6Tuo.QRt*Eh5j-e (n FG9xCDleOt]:fX o(xK7fpm _īz4m{z[]il7h{HM/i!d!IdnBz4bλQqS[1ה7G1:~pfkXGF;Q=ψP#|0׾P`;ovX26<ގxi{4zYdds2Bo בd4q9 an <=FҞ*Sbё5Zhߣъtғof2TA¢SxeB fz HhI78UWS1t_P2I̼{^YՎR0..0RDm#&*,E9dF9tzk,ڹ]`vF d]f}_,Nu(ũTS;ȎFFx:SىGY*L- $1F >2zcguS]6B*c5"Zɵ]kaӰ|0H݊1aQE$qMFM8dcoHXԖJfdp.z2OߴeoSOQ120Ӂ5|mLCi ë4F;$XvrxAۥ3.NzAuEW!;nhL`0eOٜa 'ߝ+v*6;VKSFؼ}9ntMT8InJcS`s&aP*7}ve*1k* T϶~:n)TJܴHG݊MO47=qjŒE%J@H]HV{;Z1;L`TL'A杻"[I/a()mF֔=+N6eʛ>o7=*ˎ́[e/س觟_?Ke.\ZT BgQZ__XF6}cX[vلtyX %v:0,}~pY91 U'DR);z2mN0|´enٮ) Cʕ%;i0N!eurtЍjhL=Yc;g 7}Ź΍{banZr:ރ)6G),89XeM9.@!N^J[[-kf;~#>OGwd_‰>S9=Kr]2Yd/P a-է㖦Q8G(L۶ߚqr$?c?ٳgd29s'Ol6kN:EV_ɓCwXO{ RD&TH hB!Ht/(Ia=sD /Z%MA<44a?^`/% 4#BG~нАBCݝ#j#RIBG k౿Qt\jБB"DJaVJ4 ^ ! Z4t%~ֵWR JJ-/O!R]`i֙URٲ )4Ape,DHCj\4АRlG KNu$HnC!fMC iهf"}!5Ԭ+#&,@Zk RkBt4۾H/^’ 5֤Rh{ V`fRslӝ=_[GΚD>-VSR(Li!΅5GMXVdهe){AG[پf]9}>92mm/lh_Қ),]J>bM7Hک[B"ryHickl2i.XlZ %Ǒ +6aضւ5Zkvxn+{'{,YyiJlZXjA]i&|J:AWl\l zY6RVp om~]qךlr8\ Ms⍥G/\vږ&E[Rͺ^hKӰno;ik4aekK kh[jMhʚ$6;[ӕS> )4MK.1J6Iaq]צ,ъҍ^mW$~ccgRJfSiH{fD}iNjL ) 7;iXI'\{9U]tlrރHtt{=~eMʲWxm)|ٵU'J@Nsč;d_ڬxds?)]fQ;XL-5@Zב,_|Z}-w^O֖Dc\l1n ;V;1_)tONܸDGaKt7Y1čӎo9{kv &ulOHn}&ݿ56pn7رkك|(e)R߿uۯsqc8Ya\ɮ!}dsBi!c[ߡ(5%~N^N)<$ܺJ)nuCUk{ʊM]:_F7DZ~khiwOhEU|/Dx_ˎ'MN5$<êY7j+yQ]V0$̒{+ {mI '%|?% BtrWrhG$XաWe˲C= neU^֭[xNO|uۅso9G}rʠm6t[_rۼNlrE{L ]bnQ]w|NgRd ]}Թ ˤD;Y?+UKmr<՛%m:*|6&FM̶BkQk)MXq:5Omd1dϑUEJ$n?Ce% zfU dROns=vXy:-s5ҽ g|-6HwFy=K+݂bR}j^vHfZdwM|Nangh6[t"P-. jWP,r[A{>L˫/{46v Jh56(KKYB?ߦI? 6Weq@cC|y`;ղNVo5kfؠ2j uȿggM+/rY2.!oe+ԅ=r9M8Ǖ-iTDyMKu6vnA)nrڄ{:J +ׂ;k_ K|U2ORZ N!e;w^]թ rWi63d#VlMŻMVVt".clx]GҹXb (QHzg x** nVYm lowӃȔ;j=E0GYBv1O,PɓA*7>#Iܬ?IBnJѤW>5jAk-_'u.[s&ZɲߠjRv)3-|t}qM JfiVLʵ{ٮlSepA.()IH/r|wbb_#B9ʯէ~S@H^i mU.: ׄ"0tTN zDb~"Y-ϤRoc*@U;=POh.G Rߩv15uj~8u&5­&8r͔vj0 .5JXvwn=)D (QXPb 5np;'iY[4Pe2XcJuN 鶗Uolv[ غn[6ZYEnS7v=Bv]Wg*ͽOcr&٩62aZ:׃5_/OA~Li&ljpqqjQhv$wߏ7/81u;sT[>L m!VU M&~9ƭsQЬZr>栮{7#\K}Ymѫ4]_Uʼn;۶wՉ+|(՛u#k+cǕZMgߏ7|CGVJZ7yk׶KҶKbgpP^0ט>{C([R;Os!iuؔ㽵ۮp ޯ p1nv8EkdEp+Aٶ}ڷTjξwe`ۼef|K>_ow$Ŗ{?#T'H(SsĪ!uoQ܃\ݷwd;pª?WyLGÿַʾ@"`zvRhχai('% ihM Rx"αw6C 1C 1C 13=fm!b!b!b!>C 1C 1C 1Їb!b!b!C 1C 1C 1C|`x@b!b!b!bo C 1C 1C 1C MoǬ 1C 1C 1C 1!p_gЇb!b!b!inQJa澟nЇb!b!b!vl6G)FA,{S}!b!b!b!ipP(>IC 1C 1C 1Co !b!b!b!&>C 1C 1C 1AHmnӒJz{ѣaEH OCGLq2&6"یy؞@K1X;S[*RQ*ڄqhFѡnVJYLE̎fa^s9~Ki0;0Vja(A 4h"x>ڵ8r49Y$#ƸNxJs"03Өhr.ח^tC'hAC`4Ro(*'Dn'Ygl Ӟ+P7t'˄:mFe I1$iM4FmxJxVAZ!EnKlsT+S!m I0 (ގ!\.22sf2=9Q5blO _EΠf)A?zN]I2Fr~NىtZ*t!uˆ m 5W1֡P!Fk+ ~"qQ F*1mxzrnMZO-*${+(|7P!ՈҘ nv`@S5 8!YnG~5dO~d³E8IwͰbt&^ إ0jA:m|#=foaAH)17gKDz j>vv7LtjDN&6ۡ$SтVo5x: 2gZ*M؟Gū2h c(B&3D[[B";##DVnM!)'hu(M!.Þgz3Xl,m30_,k7)u0f/8Q@HEZ@ AEYm{E W4s1xA~Tj\Y Z)th@7Lrܚ 3,3j#:RAswH4(12FR_}<5cm/:ay:3U'S1 d>ݟblOP덠:^fwq=04[|5*IFAb6EbP5/+Q $Zb,0F9VER=Vhe |=D!eQQa̵)TGP4Ж -v"]IPDhCdXH`L~b ī= `G;3D1Y$t=* N_xdʓ*&j-6ǘJA%Q^@ƙPzH [>~αm&[ERqA ?+t Ij^ZHc:d6;Hɋx}U2=As m/xPM0:F'@vR{6N&0SDj&cdhǸrnEYX3ƛnk`BB+htGIIfM<<45RWR{4 h56fD;M/e3AKzF`v-NӠ"xOl\KM(@kO`&'܌MQ~ & 0:<~Zf7B%--=| <[ :'5i,twXڭ?X'ke jkD[}qGcܻI-38xZLj7KGiuzk#=#WE1Z^xFRXkc9Y#Әg;8Jh$E1$; ( B,Z]ᡜg$vgI<-I'PS4n'H[z($m8Z#r5pLdsx1jQ9b%:ף79m\F{훣',4=]Б:6"MIUb[LRengIRMkokFxLV+K-|eFǏ%{O4I*}1$I(uXPy4؋F(zx! QYF(C0aĬR(ϓ=]fnH}:!¤aSlIGCT^Z{2hXKiӈ;t*k+ЅF4" Q= ג\½k$mS[DW#>i~Hl$~-ͷ6?*/}_g)H":ws?Goq^{*jzru_ UK|穙S,OB';ƋBSS$o0 j(,}+Oޡ V qnGZ:˗oᓿn~ ˅sǡ&o{|Kp;~L܏g6v3^shmA>A׾¯}_3KSs|)B/ 7urzk3I?ٞPs7F9<ۏ!3*NijAY|k?rJ]9/9sӿJ{/LXlx7EO>o?* OOr;vv߿ʡG~קh p[.4K>{gƯHY$LdrU￀W)/uor|ǹ>>Qur K{U0[ex׉/Mcz_KwSe.2WW?ÓFyE~7TC Ͽ$G'_䧿x+;_O湲:7ޟ !>Y^N}翻ͺgN?M~;e9?.3|petCSo'?JⅹC|KؘY_KF;cT枋.~K/o=nh/KW 4M d4_{'8{G{1WyK?qts~PQ8aY{Ļ}#|}?RPIw,w:>?Sܸ>w_?:EKdoo4P)faN_&Sw6?hܺaĽ79,>5ŏY'N#1lk?|YJmU7`hM{}Gx1'yϓ_rqAgZy|Yw";G^'^4y#G&̻6Fo|񩫬7NjgNβy~􁟦:֥[X<4sLio";<;z|ş;/¿l9ˇo¹}>o3fvJRuOhKL]gѷEt\Dž[]JygSQ8%V/|þMY=ZS}u|Wx#M>6^g'~c] YzչZЙdcONP~̬kwI9#?;I+ae2;8K4zS_qp5^?8u5N?/3E~+6u>N4>1rk~ kI<;q*?$f_o4#rd|cޙÿ_6d?ģ+t&~s#ͷE2WI5ip$Sڻ{«Sܯ!o1zR?U@Ty1x? ޅ!sB\nǗ6ŏ'x]vB'ŏ1Ìe[ͣ}xtc4S&'oWJ/q\_\ YoBce~x:y 2sv6LC|g-P1qR>g~̇.}~@>~g>:kaf_:O?˼uO1eb} eF?N_sF8k~]-?ѯ A/XSjy:|ctMq@n{ƁO/~.󋤎7?ѫ>?d-+I'vZ1u>o]|gɁI}{i~9bޢT㍱EԋS|ϻ{‰9~/vԕ,T,UϼIük-;';x=:h>?Jv o<1[ߺNC!>-x9bl*(#+'~n2IsF+#Բ<}T _o-<񓿴1yo]`jn# ++?ͻn{Jۊ̷3]VQΑ|mܤ mce~k=`Z<>_~ǟxYnv+ʧJuO2g|6ta[ ^k](WOܻE:/a{="z S_S/]~DKwPS N?\#˵ 'lO _;8+SK}YC9*~?'_ /-JefBL{7!FAws'WJ:+Gns`o=x㭂;ĎwG$ s{:Jƒ}LޗY>}Md_3˫w~'ng.r5y9 #Gw𽋿DAy&M7', +,W>\9?H:$o9/n2Fo-o#'~W]=ꯢ??8W*W)͵xgߎl[9ɵQI˷z?c\Ⱦ^yOO+*~3b$ߚY[.n'xnFN{Ρ_׌⏤yy8[7?M/y|7cz1‘>|/~,=s+ I3yUF_}s8RKY*~7;n3oo9*~ݟ{N{l>y=;Nj}o>b}_cXTwIoj78}ݾ~bZ/oJݽo /WGNoz}iwR ڡ+65cnmoUߺ[߷3-C_obqNkvfuuugD?طAޥһlBio 7kˢAٱOח[ؿc5c`~>-sq=A.] .}|~Hmsk@us0稻?~ˮ?}c opхٟ;i7ztcb__7}Tb.y\;ȝw z:~g?u/_Gߦջz}{8"^76swMM1.^gMKs `nN9p0wl}05F`oR __p6+}:0}r[bʮ`|wqwl'\z3 .y|g{7ow78A&XRMߵ7h<| {0n>A׃2e\ݱ\ ^{ D 7 pIjֿڿV.1Ab!b!b!bo C 1C 1C 1C M?s{aww^BvwwB0==R 4F4 :X 0HR4^C 1C 1C 1C|St@oZ|P(H$SOqRb^unܸ_fg>._?gV iP%XGsWU$B85 {v[a"Ss9ʴĮI!Lwx߿^`Zc {|51PH5 \GسSKAB4kJe q3~g"-71@~4(@}_Q2VְCJtkB*Փn4?!LRh&ӞBHKҴ@(ֿa 1,*aZ'N´e` .w (ڑҒ0k^(it}Fa 4ZӚ *k~}r D*%aB qs(Wa}u/aLiC 4:7R°ekIDB2M+K@5NmWJZHm9mvp=&pn#klyjg’# a> \Q¶eB- i[3m#W1PPTZHinܗcg6(%(Aʞ-s_]ΰbi.i1>яw xE:nVB|&H`ƟeH[Pzi8β.&yCHoM5]zhKy g[MzYXAN(meB؅L-Q 1Bxt[&BZܤ}xW"QUQb#ck";1B/1IX`Iǿ2NӚ=iat4(Bzeӈ%ߜ!]\~G/uFy R` .卣G 55hkZwrst24={?E1#\3tbmZi nu<xfi kؽPdsgxgG&jj~ NObV";#ȵiDcKx&RH 8V$ [N=1L{D"Yj9݋^ zdl; FQJEZXzHn%*>YypVgȕ<76МQjL*{f1άD /Ӗn4nr}-GuW1R4-"6lH"p.xl(LHxu{T"7F2gymLwNfed =<Wh:J 3gȊ$]zgGȝ1#JcA1E#j>UX_ ZL;F;}Um #s{!H9&uʥY|Z*Dұn./&xf9Q':AetFj?5rcֽ>}?yqLm=4C*.H1N~%F1Jg12ù{#kNMJQLaud#cD4=b{ޱؓ"; 2u  ',5wM0&h m]po doSk4+=>n&'c̥ꤏ40AԨzt &N|FS-uL 0wǠy@ :/VdJLxdǸ0\w_"PvLR ?R'\<2 YiQLu}u6|Djܜ1]~3mR(;<"=a#$DzUR .f& 4eT'l 2DU*_6hl,,#įz\.sZQmWۧ&ۅNUE3uXWL[ Hzzm@a=L3CiF!4^I!P%9bwWQ 9CvCf 3\b#2JKٛݼۓ#\/'XG>tkT]\%<E3ʺ|^t=ɬb#4/$Jtז9﹗R T;(an,CaGwYTY/1 z4TfBZ(FcIi /@ǃryddLbǪBQ{9ӻmT.9=FH5IϛLoje 1]@}k SC4S6£`QgPMc lb&YkW8J ^ՉӜV>Z0QB6Eԅco=J:I;B=eKD@@JD߼Whr-> $wC>4w$QX=գQ$nLٝ׃#:TqJRD"  !… |&Loox}YQh//Ͱ. 7G@`ao]5]FhKeƋ'5Lu1NQ:ʸLa؅l-'>BxlE瀞0~L sT;Qұ m| ?Jo^ avT+#%eKo'A1^V]r uVCh*Gwk\u{fv^7= rK-&zRnǓczKўj({ #oSOiyh/ϝag4WT|>T> H(Ve"4= !i#kRHhLܶrg ^RrO¸g1D봤}@.zz'NS 5 |X4ƶݺs<|:34{xn^JI/@)V{ nREG 5 $98kRؼAMAۨ/ffnKa0^)?t#w^"$>O8yEm⡡Y7@eƙ%VNhlqf\8H8fW#K2:2dO0}އŘ\2۠D) o4[َҌw ܉FY_ٙt| g,qiv }*M9$G1EXVS:s^뀮VБne8at:^}7P3fʄ N&{BJ7AWtvfKP?(@-L;3~gw˞;6z˧a䓄ex :SeX\6aw ZD|lh1u؜BoN% RS8B+3M}IaЛGtTjFujϼA57ҼhƳkq6VzD m$2濃W=ghzʇKT_xځu% lNU?S;zj]U#:@+٢[c㴊4(މbm1aS~EֻH._DXtiDA5;0okav44/p?H&zPp j|[.~bjD1jq^;Q%ҽi{!1-R1 7R''ϐI#;^zU #Ǩ4"U=[D y z)%5ʥYz 瀞#3I'>Ael堗FzB 5u@IgK ^]nhQk‡w HKgO+K|}>lP e빿Su{x@N87:}!]Ԙc: {`Ҥ 6DTb[3!eXVLJJ( 1BzdǥI-E"tF, cL6_5F37VWM LHa$d{\.qZ(uDuvOQMk&jl>sl+>&smz!MjEdLE7~Fja y5qH# \`8gj5T̹A/''Y4Hv6t7ˬ =ɫ5擣 ^zWgrOj1ސHfi̚,͸W9繗Rbc2̿>Zn CaGg  +EAT,b4%&Źwl s.GInz-TT.o)H>MuP,R쌓UԼzGyPNȠ=WVQ'4t4t-q~b{hiЅu@x_<ùV7HPNg |:׻#hh*ƻ_SG vis;2堗r2A%izG9a2j*3M%Ef$;!zhA}Nh>&9UY%2w?{@?ttW^yMVVVt:-o~x[loosuJ)"Jb8p>QrRM>@ dde;v ShT~{?H}`ژ5;% b eQOMINGMg9 8Nʆy?^b(m 3F/)fqIDt9GOUD1Jٲ,M'IusT})uJswq hz;NQNa \g~*S@vbIuT*);J}(HqʴSެ~'ޒn4gIUr@@u뤠)] [,+NGT8ln>k)VhҴSMW`WZ;tK}wCUñ)Gqoni :`I3%w'K20ڛ,OU/} ړSN]; a_'~pyN!in)vR/%;N̵54 wL!m=RBG24gJ+є%"KJk%Jp؟4@iȞ}⇝@Ҳ#'f:OQ78l[rC9|jtZlЀEfLmצ]O :)v5pXc[+4]B Iu[91~#l.c8+x؃cJ'g8*8> eaǞ7K?駸 ~&uO+wJ |mpm+Žy qđv 馝 ijrҠ?p9N)wtgwӵ=ᔮvaчtJѱ9ǧZrJlYR0#ls5t9:a L'׉7 9{iҪ/}mhB)}@B}Cv#GbYHEc=trW҂O+Ձ觮Kg۞GvJ7:N8e٥6]R.zOqw}q^v,Yvtc{ U-:``WۗiSˣv-%p-tnog'fySX{ 4lOqvvae' q<.S%t3ՠ?,//311^s}d?Sx{~nyg|={Yw\Mt !b!b!b!f.O~?ЇNءwZ|]D&$H D4 B"AӐDGCk]"5&%RJ4K.&a'$x@0Hº#@V=D´դ55hҚI4M DChiH)х5Wi@ t!1څk,t{.k=i)4nY޳楡 j/-9hHt=3R`ӗY+BRfAJ!BG%+aKY 9)&,} Kn5kBzƒsӥu&@{)%JX2B)R lYj=waJnۢBlG ]HD!t tͱ+K۶$t͝nۡ05&nfB@l[БR%kRH[o\u:!4Z[-s.CitI㣶}jNejFYhh]CB /_ߑDZd`٦6k~&9c]+!%' lܾ-_MDZ7MIeZCʝLOb]:|(.K,npYe(5Xk2g ‰p'xlsRSٱC`]Xl(g B}c:\nsZwb3{#%3R֘BGiNӕtmBLݿnqtۦ=.,IMsmAZ_JMKe!KD@h t mlK Ry@]°߷IlN+1ۇW_VLm]=4inﳜ5h>3H{`٭=GigIw/ҷyC8q+ {$4G{HkmNm Bko#־#oqǵ ] <w+tF YmX㢔X ikwZ,%lsg{ŠO@AR"Ņ؟<+=٣ˑڧ\پ k!=)4,;4}0i(5%yi'u4k2g1o|g1T&u +;<#42[Ti#.m j5ےԭzNJydUy=׮:اfiAA1D77Qo3b3$3jb 0(27cwCwCpSSuFT;tծwk{M yzKadbM2י~&>4p$3ns8*j {HhFtafa&rOǔ N9ʣģE)C;xrd`;gR f;H ϰsqFx݅P:|i7M̖*H<;\%_Vb&is1LQ 8\Sݎ&CNAKLVI(Nx|f ɬB-vŽ`BdlYFO@w833@gљADT2{0> i~|hr]d!͔Ї[e J& U${!7X\JV{Ffq"3%FVjq00܋8?ÎI;OXM(2 E mp<&#Ȳ#vex_w˴KT f34UǟFG7Rt'<5րdd=qZ|9op"ϣOQ .SS  RrdYF<.(3>A$#;XS<񤋾w1YbrA~D}1Qbn gaʣV9ɸ33#al&ă$s1a* 3CĨAmUF SgZy-(;zf]F'Kʦy=p]vc ʓyx§m,eWP٣0B0Ψqƶ0da> *a6o)a+8@-{Lw:MV!fɪ%8n"pZ1qLZθHhbD7/>@%9D=O힥XDeWu|~VG04Qb:]qQ;ٿG#E,,m4G1FG skHbKD&|? x|~DK4v!2~4^HAFOuf!+N3A=[(>0I{s"0CUxv'p T!O_(S+p>Eqog̨ hf(s߉sM pOp Ɏ:v:Ek~umT鞄J>~P d;Q.fl吣0NcfF2]zAqcfC+(h &Ef y0P5٩6q&ٽ|qrNG#?|/TGvL3mE@2=DtR16!uF3F2,xwlg@bA!9)mLW(C~`,U1Ħfw3nc:x Ŭ2ug0g&vو46m(!1N!v CAESvQw`z \'bPTٷBkR>̨|PuCDv15r?;LaP ֶceEP8L)<2Dh-S30{vx3k&h0BTw2, ̓$a(̈"r™9–C- "Na S" C2,1K`EIffu`0aEPJrCAT␥Tt؎W%3Or ´0QF#r!3[1" 1JbR,]0wN{e,oR>s<U ϕ*K%bvv1w\A>ΗA/CfAyb ^'%%%%%%%%%%%%嵍 +VO>|0 m{oR 0윷G+vss=!N[r')%%%%%%%%%%%%%%C'cvI4R<%%%%%%%%%%%%嗛tˆxŧ0%%%%%%%%%%%%%E!uSRRRRRRRRRRRRR^zJJJJJJJJJJJJJ+AOIIIIIIIIIIIIIy:))))))))))))))R=%%%%%%%%%%%%%@ꠧHW @{ˈ!]_zJJJJJJJJJJJJJʋIdo멃"# a&I$ RJDQ3h]A5=x6 ]xdc&13&lFQO5m9+2-j ۊHԮ83ڧ!Tڊ ]تbTܜĚPnjV=/qv>+T Q!D%ıAlV@Wz5LBy8$TT[ K(ѓf\L?!1c(e4_D0iĊX91kٌ-T)ZDL, r|@`I,aY8dK d<B5lGZ!"Pǰ6^QF>N"UUFkfn"A dcI*ڇ|Z+e#14pz|V̖9ҋB@g 1'qlAY R; VQg!wZfD(D̶شv St0$A^9BcgvAkAxJ }2cVDC[pJG)dQs*Q!~$8í_CQvfWhzx^)Q+n؊` ?2w>+ĉ뷂g2L'zT㗈TAoLDT"4bȠ%7PZ*G( "vĴTb2eB Tr [iyۢcF} I) H0NwP WiqCb3!Jt-DHɘ3G%S"YcG>3,V3wM\dEJU~5L90  3FH ,ےVQ$,P4'α2T=(}ӧPw1 S8Ah!z&vrd#6i9>EۤG 0OY& ,|CZf^HbE&JWX$dSReH*RH(eɶN)!#jK Ցz1:3FmX[ 'QB. AKfVY&.#qmڭ &f8AW"F# (PZYeth*8T5 ݪW:I6au"аZ(U@f I`r3=)0 e%*eQ+YvcgDMɌ%:CbǸTujFw[IA8M.r9l%1N' d#aj e%O1JZ%1#BTE5t&vVuS6-4"֌UN#LPH(v$.Dkf+N;:,20HlS%EQb! (| &&-JJPS0,$T=Il"͈bE@Pҳ ~m.")G^t mKU3iE:# ?d܏x覃3Q'323LhDm.CIWtөeTOC"5D\$B  eڂ3tc$#j^&.!2-P ZKEhJHEȄ$tURq%B$)X6UyZm)L}E>IDATY.%5vF3h%z*Eq Q+aK])C]NFw! y8KВ` ϙh.z`7E%jCW}d%C ZJ լB o䊒Ȁ8cR>8щR`W%n1L827k"K\|Mj4*᱈H%Ve=NCvY?&#$ I{%OXm:ۃA'+Q&LgheJ'C.;ryBA&i8q7F}u9CȧQPQP9K.N_} =W}G"Ǟ[ޫxg~xS z65ታ oxv3'rR @ ֕qu8c9%bh˛ȇ6>CIO)w_ţq=*kg tsh/VAf:d6޺mqZi6f;6-qm{r~m3OGGApH ֞@lv=~7oc=}kg{8_y399EGGZ \qirl>_>A?v᝷ƻVq^δȏo#?x1o '_U޳ =N8*5Sl8ߪ6'{s]{y[fo=~ wX}:ƹ[ VYhw=K'!=LWX˙QyG|;p O8{V犩ML{+V{9@[[9kWa'}m;*oo ||H72gq]S'84`s$SSxR;-9qLׯ>_}9u0Ͽ]u1>|nw2|#>ac{2n}YwoU 5v +jXy©\+s׆ʗf;VN'Csʡc >&>VN3 ַ D/!? 8͘Ǟ=W9?Fqr-{uyDx|߯LtGOa{B{}TLN1CW8K2_u#Dewa;O7y8zoЅY9K Oܹ8z'Nj=MM;_%7o΅a x̸Fw;]]ڋ,?V~3pwx/畟edj{oZ&5ɯl|+SгqLnONr@E|?M9|ə!Rt-]]xr!i[SveC޶+~ amy^q z7ױatw<6AoI/G߶9 z'^m~0?C_3:.gpxvSɪ|ٿUښ?3x t3Me-{QWO:-o3J8g~/ \?J^ϳ)i\#Fw|Oٽ*F^?H8`ͣc6t4J?1v8gS8i.|fcν&.Jd"gcOmZ.7J[fSqD%88"VަY`Ud^ ]۷ύPe>s5N}Vl۩x2g||sod,:/>~_lz+QOo]G36v[>laQ /%p^fZM=spa'ko:3vŵ%JN]h<'{k隀5ze.7a(OpЋ&D^nBJDDNLz(A@9DJ 'rbb'$\!T%"  "q|b'&$Fa@DnHDND腄OxxQDnL% jUȉ7 0 #ߋ H'\ b B1IAR!]"'BN-]!NP\O֞"Dxj~L$Ո$p#Tx~D% ?<|D̕FR ЍO#? {Q"0je$~DR 8rc(r@!x>­}v+ zaM/$%>Z$$GDKDK~OCL"5\?DBB%'ȃ!Ƞ1XǗ~ ~wDQT+t4Pw%~HXM^j&NpC'*!!/I"0_8b<7!bc|/"<5!pc HH dwc\!1!8j~,H&$CkK!xQ 2rG솵]8ЉKMjy<\3'5V? .«2$;2% _! qǏk!!w/\Ϗ"Tb8rC( ݘ*Ð c/H"= /xx^RKJR%HE>>aJ{ 뒸s|1!= I|$ EĄnͦ{qHD(UIX'5QHd(kҗT?+7Cz.xJ#k& $v}pkVk!Jt?!0$2pF@ͅ)}BBp7"t$>aGD~\{lKTHE~ # y!qY5$rfP'#jM<9]IZ]]~\5$HQAI\U֞u]b C^sxDn@k>]8H;~Tk߯ <7UkODT 5hcDxaDh^PB8>vխ'SsPp~gyIoD~X뇨>ej>*$yVB7<O$C! ۲f{*$~rxnB̵cnLāK$a? Gs6i!7y!;\p4p]9׮Wk3!jE4y5;*}־W#$Q:D>Q\7 \zGQ@$Zk#p7߯Y~FX뷆AꇵxߋG82 H<ܨ(j}/#v"_%tjql˚l? "'1< }78]ЕߏjA@DAMbͧ%At G+;s>NXO"7FjwEaη +Լ}{dkv`|. ^t sq^ł/h y.g|Ē9O .a޽ra>EDG )]he1 ~6j̢BZ"mq:#\X,yil*ćyq"5=b-~M h(u^,os׏hzHeo.H5JDȦp^ X niΈ\RAͫ 8jD,9s5RЀ54KKGkk\BK՜9y^Ҥ7[b:&p^B9/-(m~&{BIZ 蔘60K G_?Kk){!+\ (- ÕK=OAF"3/b&chV"tXMm ECRʆ}g/ dx2l绮ˍz.߿D]_~M.YӀr^ 5/mz(ur^5;"RXnұ*440_ԋ^1UQH NR5Q5Q4*c4 :HMza*QkD 6̨XF)BD.AEV00.T4tS1$CAεu}хXFT&BP@G&Fl-ɘؠQ,!-uF 2.T2 Bjhah3N0 HlDVkSQH `"QT]ݔZa*(vBdhDMh5+:"#0bHz6B[|1aD2D QfIL"['cEBdH2*e*!k픝f$!JL,#"`j H,61-ZBbV_F&X*`Z!VkcT ,Q)50Ê1MIk]O- S"$$Jhh@ǐ 4Mj6BjR1 nYdB*J`ZaoEWju4;ưB"fii( Dl Jr i&RJRkLHlj̠$L+@dLDw-!3$hZ; B5Ht!Ub%.4$gXDt⬨#,!@L$ֈmDPMjvP̚LQ2h9"5B&Ϊ$\ݏ adZ,HIM#YDTT VCISuHQk?CMPZUQu`X1H1TL&5b馉ES*1T"inh8!tK E!$)` lP-YBд^ck!f&QVi DFb:H]GWA$IdXaP$ 0=NbT[ B`jEd؄0T2H㬊&i `]CdYjVϱ%`1nV!$If61CFjh2&QJb)*V& ``G-C(@S$!K$NFD2"!Y/$DïVI\}'0\z٠́TUJY/Oa!DDx_I[?-uNTnAW% a a T,F(QڋhqB֑@KBU%WIP-jV*x0&n\K+pBzb"}CsıN]@0+BP,R]Fe8"R@yYBifDM9dk;##$FZ5uP`ȡ1}%b[5n9?陌TJ{)"4$R1LUD thdp JΞfZ餠ҚTT@S0Y+H)5 jaʐlD{G3 ԙV;Ⱥ1Ʉ#TeD!rBU$%#v{JJd3W nuABzŵ]6E3CeTkC# r/Ba%Fn@*;QrNa&E8:>R*8!bd\8ZD(Mt_vO&H"T0kahK Bm(q cbҎ)zbYt42Qm˶B:"&f꣖-D RM=D PшUA z*U$yRV+2"NJȉ y+A$hQUq 'x*c J+@R,0U-0,K)X#2e R#CZ [+3a1H"+h1UK $F -TOErjdE)9 AE0 Q:K(U%:b $1JFCXD )uP9e)4DХMY>DH9ngֶvQeB"j뷅Io4CJ]F :2`ʀID'c&T !1C26XGۖpefD, m)Q^FQ"p,|]ajHHI{n%>4NyH21:T3H#B $YQ!4%VT5K2e-LymEB%uylDOP#Ee0%q?hJΰD搄^#:9rZRԁI,B>%0*`RmOP&aWXZ5ld("mJc:XxĉkH=?DE=K.ٔM-(1=4"((F,%ķyf>t!5$!FE":~0@V38}=k!T<ҵpUp VB iE&Sj"T1ELC 2ġY9923@*-q"(U(K9c xN $q1)z>7ˑ(qU&Bg\vn6| *E .QڐRZQU2dbiD$ ,kZ9i3m8JLM )jhD!*sHC֜X!Z5ied'&FQᘸ2S뇊,V]A#e+\HUPKA -|L0B1?BTPCAU0u`!P&1 יhAkuU lB5U=NN4%@=WE]ci1vOu,$){tvZUHiR$REW=4 IQQh hקI SjW3$LTJTn#N4TbN$ZPflݓKf-A'$AxS 10eƠ-IȄ!Qht@ËvJ:(c-/V I2-g=S#(h",kL@`zY$YZB5| u]D$vD$$d5\_.QZ.L)ʒ@WD+dI2ƓeXx""BHrT J MӅB6qfU%RKcGm5hV'Ȕ7!|،gQ԰P$kЫh* D,jK,ƬN2aEH)-]"rxv0"'Q{Al"+fK>JW+ށ)ңwKcB0DUƔf:cfs_i!kW&ȹiR&Ζ9 M٩O$Sէi5ϨM<V}·bQ"B4MXKMi)b.taQ%I="AJE|y'Mk%$JvE.N5秞!UM4ޘ:'zz\(熌r_,Gf I=enlJ<9ˤ{=ׇ65o:M󂕺>-,92ǺW$I}}޼I/uԦ-_iҧT8лtQT"A"L^.mO͋|q/ /d:*(iPbS)eNE?I> RI? hDըB)Dmt{w&|~Z2RuYW98g+D>-\Sol@˄1n1L+tWjh3u{ d͡)]|4U٤IG.&]iLs#qAY`Qd9۵ E}sݑbn9lҳEud.f]5GS i^٤xTF6rξkqDG=K֚.57R!ő6)_GqА\:BTΊq(s1e]EIad݆6yz؈2'z瀦rHs#sWrJ4ULJJJJJJ(/wRRRRRRR$ Ba:yAarr8_dȤzJJJJJ+ )%u]ڵk9?Xۣev(KA:?.%%%%%8UEJa\l68Iq˝t=%%%%%idYLl\3M۶1M1zߣ]KIIIIIIy哎ˆB@E>j,333j)ecļ>rӓP0 yꩧٻw/=_ټy3uG|甔WzJJJJJ+ !===z|CbvvL&vzzzXn]<%%%%%嗐W(q366q]UVq'f_#))))))PTUeٲeJXlI: <ݕ=%%%%%嗛z$bB4v5QEQ^)h֧f N/ iVEILy:)))))) ^뺔_ZM4lq_|>_3 P*5!:oZm1qjeYJZ}ItU9j9芢;gA.~Q`񢆯( I#/QqAZ 4SgD 7t!b˗/I⍢C1s e$LOOST|U舔JBEkuжez_L&NJIIIIIIIyy^]AEH)QUgvƤZNW*H(K G[o駟~$IXY)i^w6oF1mo۶m|{cβj*4Mkt<]wřghhM0MRF9I~&&&8|0+Wli$ 333H)'摭{} rݻw/---dEӛ4"/l俧rPRSקV8F4 zF۷(Xr%\\.Ν;[y_O7̃>Ȏ;,FYQi{G?g}"}뭷299ɉ'H&!It]g֭lٲ0 ٺu+6lX6[+y6NJJJJJJJ/-a]w%\d2LMMrgM??q. 0Y|9v6mX,ry?uL&áC8PIwkR(( {y9:::Bp!K;Y~=7nZ oxBCfYz5_|1pY<۷swA&SN9: NmRa֭TUYc=v^OEQسg?u7ܹ;v000UW]7FI/R~ Ps^yLNNرg}˗sUWaYK"C!m6JVN甥4O]n~y.[n(wT*qs!֬Yg}yǦMo\.w%fgP(( ^{-_җtwwsgm6&&&X~=q'me]6oYW_,oii;hxx񆞷sYgq5zzN8]י⡇btt!JO?4Bw|k_Od``|P "ڸ8KYnV0( ۶mf͚5tww}vt]ꫯfϞ=l߾\.qG.|ߠX{/6lT*qwR(8s敕!n(K/e||~{9rA@P`]+"uSRRRRRR^ubMxӛ֭[馛⮻b||˗sw!'|2ei&''yӛۉ=^0 Y~=֭cƍI[[[-siϖ-[}s=LOO*Bo> ;w' Cfff8ظq#Ae]OwJ%6nȻ.x'ٵkׯM6qqqeq')#<ٻw/333޽1i&lB[[<4F_K͛7/ꤿ\N9ظq#uVxNs=G֘rOa?_}T /?y{Xlټ47cExGwwwc`6J6Z( a.?T*{N?\k0MoLMM5)wy\{}cʕK?奣z)/'dzzVTU=\1 qhiiAuTUmlV,沏㘕+Wtww300@[[.aryqgP.gi{!yl>[`dd;nͣL=X,sϱe~i|Ix x O<ƍYv-\r ô-y]$}ٌO}+tvvIKK w;wDUU9lc߾}8CXDUUl&!a200+u9i6f#4 <:;;"֮]˶m;߿?k0 GXL 7;抢ƪU8Sٸq#6l`jjzzz(޽}s<ÍnwΛ0uUUYlhij{똙att>:;;Yf =z=Nq_,wy'nW~W0 t]hrr{r]wqgpwS,Yj6l'Er _|1J[nSO=$I8|0SSS\y,[lt_ww7馛xH(mo>/Blذ۶AEX79cY|9ccc0 s=[n䤓Nbʕ 5l񩧞xj*:::8! CZ[[y衇(9bvvLZR4FeTUT*8lL&CTBaeY݀#e@E޹>:dT*XLjN&! C,"A4G3 ###6֎ؼ3jEJɡCRf͚[u$IBP a64FSgggey^CQiZ,|"3w'θ~%!wfzR(1r+ c,J?gH)/bcI}qd2i0;; 0b8ƶ톼644MjJTjl"4 rܨϷ~;p%4dTpu]\.y^cG]˲( $IҰ۶{۶_7%%%%%%%yeK][{ڐRז 9̟¯?3::JggKvMnj4w1?,x%lҖ$ (qZ#8@___A/JxG__Qџ6l!I~,/Dכ_4_K4o:ZM]KRTUmRa}IK"%%%%%%%%kA9L,$k=/6/dK/"Wms_ B|"䛖aJJJJJJJJk"%%%%%%%%%%%%%%et*%%%%%%%%%%%%%c2RiyĿ%I8kg~&(_ VDʡ~INjJyyy%EJJJJJJJJˏ }c{iii,IaHWWP<|ߧrKa`YkQBP,1M5PTBf_29H)) lEQDRe?e1qS*x2#`ll,"IqbH[ry$y)zxEi}ᵅ!:ۜ/Y/!DCvK'|]i^rZzRJ]2IR344+A_َ-UrRNIIIIIII%/4 0HdQQנם|>A@ggK6bXiRJ{{;x:ccctuua&###5eppqeY,_+g0vS.m>ǡT*|s eXsaX yۘCn#l˗7`a߿o\Uy###Jl2\.S,Q^puubb(o—KcccJwwHK\j֛ә2::JR!IZ[[Xfq"Rxei<== 7܀(\{tvvө_.|?!cccoGu0dll~ pA:-[t"0 On&,bڵ\{|S@uN;4~7~O~r {?S.0_*7ndhhUVqn:4MT*QTRb8===h,rN,Ps|A/dⳟ,w}7͗e)$IBWWm8iiii8ϝy(""ZZZhmmd_Wxco|#GVAOO0==ttt0::w]7isҚ޽{rMǼ oK/w]/_a|MozO??066W,}N> 5mjj EQN2 r|>eYhF$tvv2;;V}>Oc9.BZ àLĶm&''QU|ߧP(4ftvvrM7q7/};]_"}UQwΣ(s˖-믧P(4fq8P,k o}[ oP(>q7>K)QU|3߰cL$a&|_:;v`ŊDQ__000S0 z~>rsyo}m۶1<<>VZE:::89餓BpOK.U7<!kkر;O?B@EN?t?? _gu?1uGLJIRT*5;l߾nqkؼy3I|r֭[M7݄]|X,rwLNNaV^͏~#/{|CjX,f99S9x ԧx{ 7ox|scÆ Gy۷|~,_U/'#Rvz!:!~w|>馛뮻8ShmmM垒*yi/K>1ӌ76Zz5{,a$(4qiG8p8wòe -[^JͼTU۶P(ia|3\}8ýK.c֭\q?/k}PVy?υ^'k8w}7}{X:}kٟٱc,[~>(|;;4__.EQhmmŲ,zzzXr%w?JR4믿׿DQRN}7t?Ar\C_VZټy3b\.;F\ʗ$ i200@yگv|(SSS_;3^{-ٵk\pӟ4KnZrtuHJB}عs']tk3 ]t{.ꪫ8~jʢ>Zjv|K:I`6rI'144e]6o"qf֭[׾5RrI'( y׻E{{;|^n6z)4Mc``!՝8ioog 'm׮]xիiot8mlذ'x+_TgN#c\Yb!B>ƍ}KV~uÙ_*}}}TUx#< 7G>,'p<_|1{noLioo'7[_2 z]Cq7SO=ŝwgx+ 222mۼol|r CZ[[IG}uqp|/u{)1p 'ʕ+>zj:;;T*]˗*m300iaH{{;rm۶Յa:x۰5ٶ1M81 }iLl63ـWB0drrѯn8e-zNg>́X*Oc+xIE>ݨڐ 'v"qWs ' 0j8_uk j#ʞq饗r14{\(KPK/~A|eYJ%\mlx:WfŊ\xᅬ^Q |gc1Æ <3\0_u֬Y '8Yr%B;<* 'pgy&j)8A)\,Y֭[իO]y^dž T*~3<3yJJJJJJJ/ r ʹAad2yψFoy ^꣗.azu$ r]o#k]^$_\~]&/Ys >FOO'ss&8j7yk$^ !p)%lvLkq\(hkkklu|]f|-A_f؆\xOty`޵6XRRRRRRRRR#`bb]ۛ+(^GK|=Ο'z8<c7F}V'RQ?ˡ/ZK+^Z[[o0u'ţf4]?e^?ZB3P:s.*Rz5==eY/x7_LMMavc"B  :.gEJ8}}}Ð_SEi46ig.9]Q_QsE/F86^,کC}QO~_/AOO\:g_/q()?o$I"I2LcuMӰmaLئݻw366i]p;:? $@HbS+dw9=='OUeE,(7 z} 0Lj)R#<ݞ{뾮{yBz,WVDjhH$C1j\jettP(F2<>J"300 (f'$$099l F4ezzqr9r v;ZXbhhχFv322B$, xvrO qctt<@yӲb+Jv;###FQf3SSST*a,p8$&& byyFf֯CvILL\Н;wNC 9<:],:|nbqq6HJJ~k?+sss( hll$##㮞ՕAn޼` XV?... tH$]5wӖ@ pOm bZQd2f3###,..z{V8qĉ'N"Hcm4/TZɧW\+Wj`tt!!!~a6g} b1\rw}\.ba֭j7xafff̃3TR)ϟg``K.A0_ݻwcXr }}}477S]]MCC< u1??/~ !^RqEz*믿AѠVywyWr\?ϙɄ׿5͛7ʼn'Z[[_ɴ@ͱD$bRen(`Tfph4o~Cqq1jiWc~@v\vN'/2455QRRB{{;+;088HCCz@ @{{;W^={ t4.\D0ӂ1S>77$2 `$^J8ܼy/[l#q\8HHH@"0334h !!^O8&99ÁbAT"p?rS,Gtp8x<$%% HhnnrQVVbfT: 011A(BV3??fr+B?yyy,--aYXX@*"q8B:'1}~~LfC.cٰZT*d2LLL H8s mmm0>>N("11Án}4ϟ6O~}H$BVV'?Oyt:|{존V+$&&2118 JGrWoHRy%))5kpMyiiir¹sr {֬YO~WX,yX>۷r g>} 6l2}}}LMMSO!HBIX,! fxx5gΜ7nD8$}233Yf 333 @]]"3gΐX,?۷ol6o}L.\Bj5W\!11d#<c4D466RWWR$99}kB^/ xa|MY^^ݎbttW^yr o~O?MVV]I/<رzHLLd֭B{***fa6ihh׾5N:E8СCtvv266&j}Y-$H(--.N8qĉ'S]zR7nDصk>`v ROsQv;vOO4773::Jnn. Jb޶X{-%%Hx"IIIlܸQYV"ӧyᇅ+SNL&pϟs=!sI6l x0NyHR"8NʃjyWB 7oR]]-|&F4E.OPQQAFFKKKZZZظq#O?4 ߏh#-- RI4ٲe W^% 1HRnݺaϞ=AV+ $$$p 6nHrr25558q333TWWݤ''篪c=Ʈ]o}6UUU|;ߡL&ktww羴M6Q\\2he;x 7o:nqF9t`͟bۙd2Oj1ͫ(DQ<>v455166}vaͅB!.^APѱjT*\.d2:ƍ!//]vQVVBѣ;v)nܸ\.0Jsiii`QT puw͛),,d׮]$''399ɟRXXHss3a).."F#bɹsx11ի455|M8qĉ'Nj={]v!Ʉ馦&:::CFjj*PRD"!P($0`?r\:::s:V{O{7~:vB* t ᮱0݊ 0 BU*tuuۋ$b!?Ϙe֭D"YXXRgggY\\fرcB@(bnnNegg UUU3==džFQ@Bhr$ SSS vfLƭ[$''χX,v3??OFFZuc}Ű.\oͮ]PTfrrr8rV%f3k.֮]hdÆ QRR`= n)N'h>\. B!x3gggXVN:VEFX>V[R0͌H$sD0La6q\baF#sss ILLD& +Xgikk&\H$6# vt:***x'Wj222HNNfw\,s˅\.G&a4䥗^bӦMQXXH f˖-B[׬YO>Ε+W8~8l߾"֬Yڵk9YYY裏b2>sb۷oD&%%H$•+WD"O$nSPP@{{;fKnn.{e˖-c0/_jr14 ---D"fffrkjjp{yڵk1L455a08t333477 Fh~|IL&v^Oee媐AH0Dd"99HDvv6ZM61>> ݻZMAA v$ Ŭ],{n399Ijj]=(V755j72== vY)//```֮]˾}̰e˖Uin8)))TVV222dBP\.')) Hḧ2=++ FGGddd077'`0F!77wHX$AVSZZJ$app@UUP(PBzww7MJJ :-[Doo/{XLAA`tzpQZZZbd2H$FȠV&''IKK @mm-6Mggg NHH 55~^/#112JRXXL&# 7͏D9K$J%J}ccch4jkk|477V)++cppZMee% dddo>0999$%%QTTDmm/++KHDRPP@cc#mmmTTTk.!t>VH8qĉ'N8{A9N|:|``z޻2?XRnGVR$z*333$&&ow&uaaHtQ^ZZڿ:SSSDJlٲ@ڼrM6}=2::ÇYnGsN'TUU^\\_$77cǎgC6slj'N8ql6 N4 \?V$.>bH$_G"ubDy>gĉ'NEUSRR׋^a(jFOODFGGann"ffzgg'###tJwIoo/t*uR|rr~ :COO~Nc``ٌJBR155 s ```ZM(Q(022"AH$CCCBٳAfff0 H$ K8FFԟ(bZILLDT \v ^ ԡPJ0h4F4IIIrE, 5*̙3|lHGoo/sss~^~ep:[|{ D Bbb" Yfgg?'Sq_Н:uUj*$ׯ_g͚5455QTTtWmzܺu NȸDQN>b8CCCdff~gY^^b`6tHҏ]PBIh4ʍ7HHHXan|>ׯ_'%%saoZP(Dtww399)){˼{T*YZZbtt^O(Ox~T*Agg'SSSA4}1<gϞ%##TWrMvgl177bhh͆V]5SSS j˜~GVRp:^?ta`P *J(oMMM %j5JݾDhZF*kյH8qĉ̽~ ǹ|2 dgg388oDOfJR\.\ 55_Vv ofll۷oSSSC[[>,B)۷obݺu8N}YF#BׅTVV /ʍw> + th4 \.\.7o`0DHLL088CղLMMi&>hT.JYZZB.3==X, Fl6~SPPFl6 _ϟG" h4\_J= X,d rηzh4 ?._Lcc#l6jjj%PZZ 8w˗/r-SSS8>{^Ν;GUUKKKx<~?Hj5v\.WzX,,..N4%==ÁJbttYZ-)N'2W_}X,***p\a6piiiz|>];66ƍ7Xnq:ׯ2o߾#==g[oDl6K/n:RSSF\|u֑Gss3>,BV/FbqOz8qĉýO?H$?1x^n߾MUUb1[~ߏZ^D"vL*ݴi[lԩSX,{ X̣>J4?N*{1NxYw|x^x'B?233Z~y衇`hhl=Ǐ yyy t;wge߾}FܹCJJ ?Coo/999#@qq1k֬27O{{% BΜ9CuuPY&111͛7IKKٳ|{ߣ43aX>266eeeB!ɡ^( Řf^xR^J/_L[[ Ν;G0$77hhh`ff~={TСCtttv(Lee%R7o~zyyV+PRR`vv Evimm 6C=qz0::H$cǎqe0o#l6-[ξ}?rrrP=zz>FP($xmFEESSS!;v3FhHv4ٳ 6oillwayy.~ى(((… $''Vddee ^oo/dggLff&Gqq1o>77|Pc'##Q._Lvv6 Hc HgϞ%''%\.{x<pɴZ-H`0(goIDAT\7''2JKK)--EףV)))~VTT\.??$++7 /f3gΜp8 ;;[~ç+n$ LOOs~? D"|lj'N8q>?jۜ;wZ{d``dNytzO"n@ L&vr|Bihhgaڵ/SWWǦMD"f36YV+OBB999B!l6V)IIIf100Q.Jz?#vJ!pn:BnBA$l6 .%vMrr2SSS~Z8ؿ?zדGBW+211AWW69 YYY|>&''a~~Q~hD.grssɡC~r9p)--eqq׋h$ yccclڴz6yEIMMezz!!xx&'' F:;; !%%0sssDQ:::X\\y&&&aٽ{7T*ioogll@ BdbϞ=ڵ VT*ٵkPPP@cc#6l`bbDFw4)))044|X ØfJKK韨$11ez{{KܺuKc||~ ,--]HOOl6SWW?ϦMda!rrh4jell͛7dp8Qׯ_gÆ H$֭[~2228qĉ'ν9`tl۶Z ذa$%%ۅNسgSSSܹsRljD"ܾ}9>,hAv 4Vwuu!Jrܹ\.GPRX,D"ˣ.iرM6ۅ/..rqB&afnnBAuu5fͱcHHHJ 550;;Koo/Z-|FQx zppfñ2],F!77 1͸\.!׻Lww`DD"fggιaXx衇(//ĉb1"T*[nd2QVVFAAb `t:6oތT*%99dRRR0 h4*ۈ&&&n:av؁Ν;,--q֭[Gmm-PSS󙅍b91%Bnn.eeeLMMa4»}>E2}zzvrrrطotttr|lD"%%%Ya<k֬>)--]%ԷDKK h ۷Yv-YYYHRJJJDLOOk.l6dggjFRAJrr2tww yp[@]]`P(DFFfYINNȣ>Fb䔔233ٸq#l۶ \NB-[HNN,$ yyyjrssmՊRmۆT*?ٴi֭#;;[ ###lܸ[R]]Mnn.۷ogaa9v>sΑGaa0fBVV>ŬYM6qF6mDJJ IIITWWqF6n(D"***رc9999U*߿χJ";;[KV͛)**bbbѣGtz҄pؽ{`ধBJJ p>$|>0錍А0&h4 qA`L:::0 ] }x^^زTU4]&&q1/ɖ-[(..+),,, A4eff/]sr5n7AJ@UU՗i"p>aaϞ=N BTrr~)$`0 r|MXY^^&99e$f!_vWĉ'NfYpB˅\.`0@X5XXB$ B^'Cy/ HD8-Hx駅>r8{?  4=6_D"|R;NP3흕RP՟bt!wD}LLL淚jĉ'NI&[w7AQσayyY}~kE"_vs_܇Fx<vV7zsVy|ZjFl~M'N8qĉs߭G h4Ra_4+[+!6 Z{ BcH_f{ `~~ qs"*'N8qĉIQqpI8wg*qOyV>k;V9|%K* UeXy<1Yɇ:?qĉ'b~{JJ tttv1b0===DQAA XVvfffHNNf~~FgNss $Va`0 ?sbjr:;;|FA:&FzdddD>ݍFĊ~?$%% ihh`pph4F>$*m$a``J% n&''9ZZZXZZd21??O[[PHQh4(J, mmmz0o1ObddR^^^fffzHb*JIh$ jHDcc#X,z=>Od&''ijj* Ĕc*+7xFV%oc0HJJR˔ks֬Y+}Vb[c.IB!^uRSS葕*_uyyy9# 299IbbgL4\.ᏭF ߏ` 8Zǝ;wfffTN'A HAQ*uM@NNg_(Jt:( a61 BO͛dU#'>v=pM'a6Jw|7с1ĉ'N%ES ;w`ٸr B(?Jb?% r5xz rss|2n"##TB< >R)(4xq8 RSSae[np88>>N?2 DBww7FJ$hZ0<"&&&X,bŨj$ønJ%SSSLMM)V]ckbll)jžC`0Hee6>aȠ[nv`͚5LNN2>>ٳgٸq#=H7nOFTb41044 >F#h}L&F~q^/mmmTTT011*۶mC|tuu`n3>>P-|XuffAtlliR)"9ZD"rvD"V+< PׯSUU%<^0l޼QFFFHLLD"2,--*.̠h`zzEt:333HR sssh4/|Pns%R8qĉ~q/Z "2;;vƍJ P(Ǐ~#h48Nv;PJE0dzz*:;;b˖-B?LKK ;v`ڵ= KgE,s1Bn֯_ϱc8y$hl~iFFFկ~E8f޽tuu /1㫺ZxH$LMM^穧t-a}Apc=F{{;HD\.^(L9}P(> ' %wvvRPP$ \rT?3~裏"ɘ`rrA222zx<}f`Xᗸ;G$%ە@4%))}qmjjj0 LNNwߥ#999 e˖1^|ED$l޼ߗ~^x.jjjHOOԩS( idd^FGGw˙3g}A$att#Ϟ={hiiq\8pW_}~P(bappF0vxuvh4?p`0vcۙhfv̐ZXX'9sr8}͛7zimm*TUU|Hh4믿N bDKK W^%%%VqㆰƞXU7dii\RRR{86mDt78{쪵{1>L8fzzZ('N8qdh{Jݻywi^p/H|;{\zݻwטL&^}Un7'|&?rp8\.N5g0 q)222pYH4O'Ha4孷"11׋b!//38qw&''ay뭷B_̳{a-[t:y饗p\B}aсh4VGeڵcp8X^^&ƍy'tB!xILL  ];wvFLNN~)wC4D"0k2Xf 7o& hoo'++ J>YN>?kkk'x|xꩧ8pDQv#GHLL䩧Mt:=֭\0KJJ(//b 2p! O<H%ddd t${졭 H۩B$t:q8|_g˖-?{{{III_:H$xGVhH4dddJb{>T*jD#!!^/xsrrضm*V=GAբ9x ֭Rb'pRIqq񪵫RÜ={FÎ;6N8qJ穬dyyt LLL".]pGBBLNN2??Jb͚5L&&&&SRRBSS.\ 551~P__OYY~/>ww$$$`0O$8N zf, 6 ,*e~2??Onn.~N権r haVӼh4zerrՊhdǎz6mڄV% RSS#xVFH$?\H$Z8ND"RDBSSB RE&'')..`0PUUÇW$y9s ~0_ӉgddE֭[|Pdn |?ZQQBD̻‚0C!LwwO^֭[㄄T*$0Lܹ]va0bppcU&c!r\8 IRhllU8W^E.!0??OII < W\!%oٲB{{;۷{#×Enn.tvvb1FVVLX,F. RlLcz+_'}OLL!bXB!u_zz:VF D*P(@Lgdhh,RSSѣz!Ժ>233D"$%%Vdxxh4l6 333{9(++1??Ovv6DDPPXXX,fÆ Amm-,..bZIJJWb13>>NFF0F}0;;Qn߾\.GV3==-sbbBСغu+zm۶؞[&F:::F* i-hZ\.AqYIVVVVf^__'//KOOCCCDQc(,,dvvK.vRIrrIMM#GNmm-KKK466P(ZU3GdCCBmmm,//}W|24f8qĉ/OAONNf||R‚` PTTƍ)))h42<<̮](--e``!֮]ˎ;Vˑ#GB244Ν;H\NNKKK|>?~W:+sQ8NkKB&xexxeb1l޼ٲe "Hh;~8 XVT* dggRF(ѣjÊ rrr/}l@bb"FNd2=999z)--e۶mdUx*j5L&%99YX̰ȁHII!33шARvZݻzΒFJJʗ~? r9. Fƍ4czP[[+^M6!堛L&b16֬Yfd2a0BVc2d,//!^ޕ9sssRPP޽{)..fppGAA& J%EEE111汱1F#ʄD"/}ff&@ff&iii[N8PJݻHjj*Fyv܉b9 D"fggٸq "UYYB\v܉^g݂qj02=##C8KMMeӦMh8ta0jdeeP(`0J"55@bb"k֬aݺuP]]MUU`effjtddd``ݺuV;w$##l "P(Dee%hZf3[nEVc6jB:rrrؽ{7 RPP(STT멮F%3ޜJuu5,--qaq\*MNNo>֮]K^^`0(xrN']]]t:***ظq#jZXIIIlذh4jСCfal1 x^:::HLLG%11E^^܋bh4rIOOG"),,$771, EEEM&hp8N w4ŔRRR"F~jo>60>>N-[D`0@OOp蕝&I_DBAA,,,N[[tGVVF_QQAII UUU֮JbllLx0L/ٍ'N8q.r:1H$***h^y}nQ8N'>O|xuУѨ^eAx[,T}QꘝeBxݰȵkXZZB$~}^B6+W= bcw>'axwQ_Sollӵ1 pe^/ǎM}}=ÈD"RRR1`ο73)lj'N8Of a\.r\Њ̥beֽ^g~~~"ÁJBVjc޲Y(d߉D,.."h4Oh9RRR`0$%% ʵ uh4OH$177B 99X|WmDb:V/f]p|%#Kb)))TϵdžanVUسzXIib~~NJf 9ⱒ15e"Wp |e*E,Jĉ'N*")"3 ddd<>xwA~PWAGG"ht8vT**FFFHKKC*bXs b۹}6PD84 jqF s/2E{z?ttt J@PnjjOJQ\,WnA.d2:N[RFadd[nߏR?b*_VJeii_~r Կ4bVft:?5 = 1::ZY~x^^xJKK?us8 B ?ܹsg>fz- OfyyY9H$B6T*IIIvnݺXOss3$%%!yG؈smIMMիΒ |cYXX~F={z *]f~~9t:uuuHϜ077Gkk+999w(7DsBĞ^`A###\rE'N8q.q/*jzr 2<ۿ[z=iii?GRq%JKK9qhLr T*e~~9p b>00j [UWZSS>J… gl68N.^ȦMĉ \CYXX7ޠdR),//s***k׮qEF#FRIkk+;wD*FC]]`>})nJ}}=ϟG.s-222xt\t|t:oH{GEEvbJU C1r8( ۅF+X,fqqQ:::s2NpP~@ooogiiׯ;wFÅ (**b``;ZH$***XZZbiifFGGٽ{72f3SSS~|>Pez=cccahiiJT*t"˱Zj\.NJEww7zn7jì@ / j,..2??T*ell N]]]( X,~?@Ll_W`ppU\$nd2W^ܹszimm,׿5ٟp>99I4ezzC0dqq`0( &&&nĦM h48B!ܹɓ'r122"̑VpR^/L&###\r˗/'LOOt:yWHMMpOYYNbΝܾ}@ h#))˗/SVVs=G8Ʉ^Brr2ׯ_D͛7Q*,..rjjj˅d^n399),4/͛@ pA1ʙZZZ|믓B`09crrR(B!~?bł& 2??ϝ;w#99YXs 266X,`0D"azz^jsGFFp:,--ׇ`X-  &Q!^݄B!zg`ddJ2 &k#IJJ)&''Z-KWĉ'N/{1?=tABccc fss3[lA*244DBBַя~$΢V"11ٔ{nl6;wXBMM 6l7t`b>立@ @zz:<o6h,h4ʎ;hmmqF(* TJ?ZB{1---Bb8ŋ&&&ɡÇH4E"@(""(,,dϞ={Ayy9PCLkkpBP/_& Q]]ש׿5͝;w(((^yWD".˭[XZZ"055磭??frrD޽{O]]@={%`XBXL0D&?jp8LMM ===qKff&ܹn}6III\z|4OKKƍ<Ü={dn̙݊3šy7)//[---|ߦWXFz{{r裏si '\U ttt`4a׮]ۨj233 ;ѣG9y$h4HIIW_}U8Dܺuimm+lf{۷zOCf͛7D\|%|p⦦&b1$''B`rrȍ7ؿ?W\AVg~?gϞ% } $s=GYYAD"x YXXĉ>.5wttc=FMMͪr^pDaa!UUU ^XXXu)))a||\(VQQAII Ň۾};6l ''M6sHQQ$&&x'T*{qn޼ɑ#GKZMEEVL&eeehصk%%%}0`n:)--%;;{UbFXlbvIOO֮]KEEk֬aݺuQSSCAA>|\??rvb$ ܹsG?N'B>{,'??m۶~^~eCšC8tEEE8p3gP__/x~m?.iN:O=I̳Jbvv  ׮]c``|D"p8LAA;vfqq`!//۷oxZcaBAbb"tttDϧ?ҟl gϞbPPPKx衇f||\0Hc"^+żb8III]DMM $$$p)zzzX~=z*++ٳg`^ONNN@ @$A,STTDII iiiܹطc[*R[[ /@^^6.JB:ԇEbklM!dB>|pPXXHkk+6mj"HppeA&֖H$1;4*N8q*9vt:Yv-k֬aƍba޽a6bÆ lٲyIMM^~?F!+sQTa YYYC+sv/H$bddtjR*rrr0͈D"T*YYY԰vZJJJ bǏVSKVV>ZqH$>RK]/++q سg 2d2HJJh4288HBBǏ'!!q\.<P(jر$d2EEERUUEnn.ׯK4ØL&RRRSRRgBqff&dff`Ϟ=,.."ňb222p:L&\.'o2ZnXzhZ6l xz!L&>DannN0cmD"lذaU~&))P(‚ Bh4 ^Qoe\.'##&''VKff&*J^aXXXZfgg`ݺulذH$f#99Yt TWWSUUEAAXL~~Xf#%%TJUUvvZ $HOOgbb֯_C"~zQ*,,,}vr9L&oh0dxxL)((#fiib*++ ##Vhj Y$d2ө2JJJcjjRn݊V%##Z``Ϟ=bHLL$066e߾}TUU {eYYp,TUUa<v|jqfeeaXعs'B!>,hdggN#%%Tz=$$$D"p1RSSu)..r Gl.8|0F222ZX,vAuu5x^x^&&&e$%%j|:t{ cgڵ̠VyGH$x^;B$"77yt:撖hDPZZJnn.(JˉF|>JKK<))dA O&a2|***#))INd"--M~zz::;wj1 }cINN"d2z96oLBB⒕hBPHHH ''Z233YnEEEF, vb͚5~P(fǎƉ'N8_e%]t:XH磢6>^eAx<\Ϭ xPugffHKKK/QUUźu>u>0"߿@~xtNh4Jee%6mWyEWW---$%%qϵ|>.\ Ym۶5:::hkk#j9pgV'N8q~1͂ø\.r9aUDNJąa~m|{ gq&H$(K-yT*h4>\WS[2XErQA󐒒޽{0ND"7n BeNĉ)ϳޢ(7nMZ}DR)$ ĉ'N8|^{'tځ@ @zԄB{1aA,uqqK+Y^^ŸSH􅭡:灍L&ˆ"לĉ#~hĈ.{ݮѦ8qĉwH[ YFQ(_TX, q<ȃ qD"|tX8LLh.>'qĉ'N8qBXq+7; ~bpO'Fa} Wb%> D~Uĉ'N8qĹ|{JJ }}}ܺuKH$B!D"zy&&ꘘ 33i.^H?$%%BCC"HTqf*, f.ۂի\.222XZZ֭[tuuRjtwws-zPVr5z=>)Acc#žC455RPܾ}~JsuqU~?AhkkCѐ uuuay dee},gٳx<222>377Gss3CCCzF8NRSSkJlD JRΝ;"H0 suW\yDnWh4hn"'N S'^~tttHYYozz{{)..^a.\ڵk?Wv;/V-,--ݓ7oޤZMbb"ܾ}iAڵkLMM'N8qĉ޸O5{zzF\v ~` 55gy.\@qq1o*233z*TVV*Ŝ:uu qb(n>FFF̃ZWWbϣhh4ʞ={p8LNN̹sشizTŋO~BMM :u !8y$Kŋ~:YYYL&T*}}}[رDc233GPV9ѨPΝ;BY@ x<zzzؼy3}}} Vrgzz&''gtt$nݺʼn'`qqf3˘L&&&&}P4ЇF(JzzzPMRRj~Ŝ>}۷o,--B?Bپ@ D?bN'x^Ο?ϺugRSS`\.*qĉ'N8q~;bj={2.byٱc2a4 _0 nt:˴`Zh4d2P(Q\~=GYUn|͛7p8˗YXXY8x &h4L&Cp8É<3 ve``!"۶mѱ"p8{G}}=n~۷ovΝ;Dž hhhbp xQ(d28u`7|~9s 7oٳh4f3rݻwsaP#ٳ}=;;wzq$Jҥra6l k׮Z-dӦMD"<5688o2fHDvv6Z7n H8|2_h?ڄCSN gΜɓA>  0͸n^z%yqݜ9s&^~eW\appƙ3g#'Oxx饗_,KLLLʅ xy&v~L&h(봵!x7p:>yLLLpnܸKĉ455[o!rB?3.soA[[ /__Wt}QH$L&###tttLNNQAq;N8qĉ'WO5oiiiڵӧOt:gxxeo("??p\vݻw77q)fffj"*FQ\n'-//SZZƍ4GFF8wO?>oFZ #Gpi8qÇ%!k.ٳgaNJ\._kΝ; üx<Xn/(U}Dq5KUUpjkk9wɰ}v=b~z֯_H$ܹsCss3A^/"[R\\yyyHRo&lٲ-`0ӧj۷ID"j@ joOj~b z)//=FFFȑ#DH$<455aZyʄ}QbjjjI0dyy*$  8v(J֯_Ǒd "Ga֭˜v,^,4KKKD"|>>Kkk+KKKa<2Zv؁f#11Bh4lٲ۷;C(􁭝ˆ ի188P(DWW8pRRSS)//GRxxG)))a``$vM~~>iiiQTTDaa!z ҥKoR)nضmN4<VE* %T*Pر,IIIUD"sqN!LII'VOKKf a`0Hrr2BmLPX f}H$JKK%''cǎANNx< xB}GYY0ﭭ08X,, `8@ӑOYYY^QQQ0<|6n4qݘL&$''ɓt:9rbggey7ZİΫJVVtۍ^fcwp5KBBRU҈"&&F(\*ZX, #??|=ZXV\.x<P*T*y L&a]}!?~cccٿ?r׾5  XIII8NR) bbbP*9 "++D$++|V+f|{0]ѐHLL YYY~a I$VWWٿ?G!;;[+j%66 GÁB 33lNCQZZJrr2a&66,Rl\.^JRRt:L&٨T*~?#11ZM0dhh~_s% fZh48NF#c0 Nqq1$..BDDVUxc0x>N("!!zLܹsDGGoKl'P%\l-J%qqq?D@^W(4H$^P(髒g`#Hj}q>:]B!!E6|)(( ++K(>QGۨrڿ/+++ܽ{+\; (\@+,E`AXZZl6hhh"""hjjDB||<###TWWVܿJl!HA>DGG6tww 9s Tg?-===?VAVyǩ|DIB!˙G.^Iy255S)lnnRSSCOOt:illdaadu333OLy:g蓓DFFD0$33{`YYYTUUիW!//DXVu\~jC<`IFFF8tcƒ2kDEEq-Z-znzzzxWnP^^Nii)ׯc2HKK# Q]]/K<&?~$R)DFF zJ">>Z ׮]HR~򓟐+(466ѣGijj$nݺd̙3P]]Mbb"AD"|fffp:^uGGqqqA[[G׳-跏b0T*sL&w6.\@ll, ݻw9x sssDDD077FRIjjvCRSSgp=())y%"""""""~q=FAVcĉ( `00==bannNunjjbnn-j5LOO3;;uǩS}jOT*W_èj!^BT 0ͼRdfffĉB)}J^gbbMLL III N'166`vwwxj)//'twwSSSCuu5CCCpit钠Nee%2377W^ݻ444`6GVs1NǏSZZFyGhZa=DEES nLF^^rM&|>xG0(JH$XVihh@&!Jq:ڸw3g__ ^\rW211NcccBV% BLNN_*޽˙3gBl6^/MMMLLLp8#J͛H$Μ9#l|aq8PYYկx>1L[$''Bl63::JKK $&&X@DDDDDDDKg{{{\pT^z%]fcii+Ad2?hjjĉ8pW\СCL&.\Đ`0HUU|~pYJJJ8p?+Cۼ;.`0˗q2<111ʿWu:::J|[X^^C4}]PT,..r~p7akkZ[[fJ%jJKKIKK{井DGG377T B-HRަQ\.n0CCCtvvʛoIRRPk~~IHH`oo8N\.[[[0;;/(w%%%w211A{{;B!ȣA]]] 1::\.jT*yW0MVV& w\| zzz'//&]&䫇; OYYQQQ \.' 2==MAAwfii?9---T*VVV&22EJ%2LU~vfwwaaa8l6뙝 DJJJA"H"HH$?Ntt4)))>P(ѣG 55LFFEEE䐞hDcZQTh4*(t:tdff" $%%T*>|\\.ZLRSSbNnn.DFF nd2 GjLvv6f] BT*%77WJLL…T*rssILL$##׋`AH$PTTDVVIIIr0LBwvv'77BAtt4GvsIHHl6RX,dgg ?qqq zBj㯾*~ɓ%""""""""lytb%I~ϒgnۿ:vv)"y^:$$$P͗`0Hcc#ccc$$$o|(Rܜmg釟XJ.Hpx<ϥ-HpWpaϳ*깮5azXr  zq\/,Tx4c|xz/Y_(@D"> ggAnsa#f?h|UY ˿Pv_6|Y M>̉A"8= T*?wqzB~|:~`0(Ή=/ƺy! ED=;;;~c#_$.KOjp<[[[+b! ),n3omm=SDDDDDDDDDSs=Y\\$11R를`0H||Q~kk+x<ݻGRRCaO淋xT*g~9233zBmmm(J$瞖?)ccc?U͛tvvRZHKKcyyK.xZ"""""""""TqL}aaHKK ^,/~A||ٷo!͛LMMGSSGyP ՅL&n"22FFFW^a{{-hCrd2F0gϲ~^$N'K.+ׯ_f3j5n޼ǑJ?tvv"J1LtttѣGln޼hŋ=z*L&qP(d477 :>XjkkbyyVKss3޽ ~~c0j455188^RGEE ikk>8^S[[`vv"""Y?4н^/---ܽ{Zn۬Lww7*E222 z*}}}9rUL&CCCx^`ll шD"{O~.F+ݻwRPT3662+++ܾ}Qf3 Z[[effD}6SSS~VVV@__111Ɠֲ.li4|x^vvvя~B ))wn9 }}}Aj5hZ۹wNGgg'MMMH$n޼ɝ;wZlmmq-ܻw^AoggۍF*vETruJJJ8<999b4qtvv /1?---RILL ˌꫯP(&..'Ob4#%%Ynݺfݻ$%%q)4 \w||Ço`xH$;v|"""jqa·d_&..(J%#==]$r8thZhoo'**^z$"##477AWWèjʈ! R0tww`l6SRR"LBVB!;p^/ԠP((//gtt'""g2;;ŋG6.]B`6IIIڵk̰˙3g:DII JNdb{{ntddd%DACZZۼ돬!0 F"%_X?$77Bf:;;O Bhiia||7nrܤ[n1<RSSy饗X\\$JKKlD.u:Dss3gΜ!??_B?яХ%677tww3:: C```~ZZZXYY[Wq5***Z'묮ISSӼ R__OVVԄCFB`uu6D"D"ɓ$$$hPTp-HH$d2Cŕ+Wp8}nvv+k4! (F#%%%Oq/IMM @)t:@!\MhF#'OC}fZndmm B!lrinn~ܿ?]]]\v!FFF0 BT*iZll,W{xxX1 ̵kטC؈nG*gϞ%22"?loopתD"!...]Dss3>TBॗ^"::^싏 JEFFfׯ׬2<<,) ~fs68|0eeeFbbb(**)># NLL gΜatta!(jĄpeHMMemmVxkPDDDDDDDD q:KO"`#??_xa Bdgg*2 b6l&##`0IDAT(阛c~~lF#?e @\.O$fQDFFQAoo/~_j۷y#Y\XX &&R\r9 !BzT*ckk FCqq1LLLM^^BV+ }PTB>tNN>.ϓ&R(VWWh4x^bccaaa쐜b||TV%))I|>LMMIJJLlll2kvBX,FFF ##n[(7?? VBL&aB!IHH@*233&JdVWWtb4x B!&''Y]]%++`0 \.bbbPTB!R)bXX\\dmm JEbb"[[[F|>ۘL&Y__'77@ 4)))x^f3sssB;j" deehq:(mmmdffrI BTjb^tL&F %%͆L& ~_xFAA0GkkkX,RRRgMJJ !z=ьdaaOm[c(BѰo>&''Y__'99Y BXV222})"""""""UdnnNlmmT*{(S yy_f_$aq63666z*N2_m4П `P~ь@0DRobX~qݴ"-(?<" 9vs6EDDDDDDDD<3}ggCϿ($my T*jK_Y!Hp:Bw(?$+ p8/,IJ\@!-tB܌اv0!ˑ85?< lll?Y.hzs ؟} <sEZߋIy(U?ykKRgp:< y_WDDDDDDDDGF{Rg#z(,I8=\i _@ !Ȅ}! }*~~8'"""""""""jԓb /P(񓲵~txOmoo E8|lnnx^tSEDDDDDDD~/˅'>>Vn޼ IIIT*8什H1B!Μ9Bx"""""""""Hlnn A< ivRRRhmm񐝝MKK ~! t:>C^yAÇX,āHJJBղCUUǏB4НN'%(++{A AZZ555T*W^y˅T*%::K.QZZJ0xܼyr.MMMdff"J#)) .#W\߿Dj5TUUqQ$ ?y" ,//xhllWRXXb… -["DNN8A6֭[L&zzztww,,,0;;hdssSԫL&fǕ+WHKKl6vihhСC  󝒒Bcc#*n۱Zܻw-666\z"R)fSTTR TJAAjd&''ȑ#E 6(,,ŋp]FRR'V<qCqAJJJG"F(d2{D"lf}}FF#&Ç !DADGG:Nzd} ȠLtttǵkׄvillCMNNM LFjj*n)^abbb"""h.\D"!%%F#gϞejj;wEMM vIJJ tR\\J"))^,AAAIIIϑ3gΠV)))akkϓý{hmm8VWW"))}jdxxFr9?я~:& Lqqm_]]$ Gĭ[X__Ν;raAii)qqq\.j5*=""""""""7|ə3g(..7o2;;===x^^/@׋R.[Z-DFFr1?Gttt%4rU 7s3g/o>c^@ S^^ CCCtwwwy666ڵk_FQzR՜:uo~477 UmX__giiǏ,saX8y$ ۍׯ_// H$lnn222Baa!d2x׸qiiiv 9|0x^ >cjjuF#Rz=A[UUn(N'O?Žٳg a08~8lmm122Bee%`B&5VVVHLL$'' No###LOO BAa}<+d2b`)))!33XAá~GDD111X,r#R);;;?ݻ,//3??O(1,--ǁ䬬,drrr_pQΞ=$&&233CWW69$ G||vq:zrMOO ,//}2z=YΝ;˗778q:444055믿N__ }6###ezz]4 gΜg~~g$&&T*up:; ;י%))-?4lll HMMhRX`Fq8L&V+PivvvDR1<<"22R(Y3 ,,,|IOOvjֹC("++Kv 6B[YYYA* ^H@0`~?HR222d MNNۨj󑕕\.gxx]j54lB!, Vl6( FFFz4 vHj5+++z* \&&yJLMM Mχh4bۉ #̫r9~ *FY677 Bc4!Ȭ7L )))L&"%%Z(^JENN)dz`PeJ,--R$!!Mzq8 677Op8HHH`kk χ^199%33JRC˯P(XXX`ooJjemm ARR~_06= v^/jZ;k'33P($:">O~?6 .SSSx^PpD񰵵<@@ }#\.k9_$ B5P=‹vhu:,.ɾ4s@ `ooOS$ {{{)I?Ds5By h="e Ãc</s"""""""""Ӽ?$ s>){] q_#vBC~sOE>ߏDDDDDDDDDX=1/ƺB=Bx6 Lp\vbccBQdxLN'[[[]AQDDDDDDDD/\fO||<3>>jEVr* \zmҸ|2ׯ_gllL^YYɭ[K.qR)p /^D)˅B@PPSSÍ7%--5>fqe B$&&ٳg1L/HLLdggw}zׯsm677IMMa4 Z˗/SWWG~~>*V^$ G188Hbb" rnݺ%H?rp}]٬'표Xoiiavv[nNTTP/ hbbZZZz*XV^/.]P(DTT׮]Ejj*]]]׿&""BWWϟۇD"aggVP{Gllƭ[$**3 vj[[[466`~~fffdBOcww:V+KKKl'*bN0r?*khh`tt}}}g100coo#ytuuFqqsq/7OxnݺEKK ߧk׮Kii)XVAY>66͛7YZZB"PUUE? Hoo/¦ӘL&p8?% f{{@ @LL `~sVdlmm?  D"Ap5ۉrqU߿/H4g̓L~~>{{{388))) RUU qqqvZ.W\att$JEoo/~!111T*n޼I__Fqdxx&jkk1͂#vVbccA&v9}4$&&2>>NEE c(ʪ|y3ߌ 0AV+SSS,..ꫯ"YXX@׳~YZZ"??e.\̌`$@ll,viiiddd^ͧA"PTTDLL 2 ezl6IFFExB.SRRB(Bc6簷q=蠵JE~~d2qMHJJ"##D=;;KFFxQQG>Ldd$c69}_{eX^^9bbb(**"'']dBE0X,'!!ORRUn޼dd2QTTD  ..(xVNcuu^{푱璘rȒ>4eeeDGGp8h4fL&/_F& l6bww Ο? ߿;w`ٞzxH$fff~:ʁb``k׮o>J%^W8)|Mt:ϟ'%%͛7tIEEF8wP(ŋ˼ V+WBRA0fnݺŝ;well8z({{{TTT/M0sAjkk/z DDDDDDDD~/LppJKK9pLNNMGG>ǃcooJŷmݍN_lnn0W%xvsEt:7s+++9sSN?;_Pfzzz~H梨Yz{{h4///w>z@TT'O `"_ױZLLLr8{,8qBPܿjPRcsss Q mmm:u7n#77D(bbbt: 8N )))HR t@yy9ٟKhZl6O_-nə3g(..~, 7llllGmm-?xШ n@AAEx)&''D" #&<~d21lllj  XRj1G;;;x^222@&&11^zb iiideejY[[>|hJjj*QQQ쐟OFF6 LF^^nJ%t:q:HRRSS1 AIMME+єd1@+Wh`qq|jjjғ4 ۍF!// ΋~K>3oo#&&HIMMnϩS麟@ ɓ'ihhe^{5V+ a`4|$''# qz*.\b%-233Cdd$.\@oo/ `T'%%Kyy9,JJJX,Q\\T*ƍtvv %$$^KL[[SSS䐛ˍ7 p:8 ɄL&###;wC||dzIqq1ccc9rEV%++Mj5ܾ}SNヒb<ҕat:Z0g̓!?Oioo'66ZMDD### HHNNJDDP`rr+W@ZZ7nP\\Ph~8="".VVVѣPVVF͛[ý{#>>s9<nYZZh4<}}}撖&# *### ZfkkhP qLNNbZY]]ĉ g8Ma1l6JJJ 2<(Jz{{IOOgnnA.|W q8NAM"`ۣ@' $%% &R(677C111,..`KKK aZZZr\Y3 F0Dד؃`QDFF2==.P AbbbfaaAhKjj*6 ÁD"y   /PV׋L&#--]"""dnn/xh4\.hZYYYa}}P(D||< NJJ 2jv;jlnn ;;;űJBBR<5T* Bn[777''lllL0$::ł ..% B$%% 9_BܜpSX, x^J%iiilmm|ښ 8l6vvvP*zdqq666e{{J|> 3??/l~p8RTjR$!!uN' !%t:C.cXp:|>"""D µ B\.bccuIG~?6 ٌSJbY__QP(xsbBje{{\JzqqQX狋\.3$..yj5fP($\+v:Z-fdd2HHH@"Htt4|>!i^EDDDDDDD9 lmmT*{H/3 Ƀ!ltA/*EAq׋T*_'%%兴 t1IH$|a,H jgwwWwD"v!} B_8B!n"\'OZ-7/Qp☊v'\,tب z^]^T*~J&/rB P(T*}ȧ^✈ODs^P<"Eyz!^ H$/tB!vww>Tx<qNDDDDDDDDDo}>; |Rx?N O~?u''}q>Oz\l6[[[O}ӌ7\~iiKvXauuE7Y`ii guusɚmnn>ng=~`Uw<,S`’m|fnnaAۣL [[[8߻O|c>zykϱMooc}GONN2>>I24!)V[[˕+W OSBVj>#N';wr  rUJhZ._L}}=;;; y>Ν;Ggg'z~ 3>>Nzz:kkkQXX*ϟOrr2uuu? FLrr2[[['?S2GQUUnK.ЀFAryٷo*z\))) RpJ.] TJ||<7oޤJS(B}]233ړw%^c B444033Cee%---h4L&KxMM W^eddG%ʬ566reZx<Μ9Ccc#>N˗u[[[ddd{GDDIIIܻw3gP]]rձü{rUVVVƍh4gU}Pf9rwFill+(Ztwwsݻh$66h4 ½reY4O(8wMMMHRf39sbccիܸq]nHHH`{{%,MN>ͭ[ ==slnnryjkkO>MZZ կ~.z9 7  F^^v/^)((`0H$N[[ $ .\ 11fT*׮]ݻDGGŋYXX`yyY^[[#pzzz0Lpuv;z JJJC*r-:Ľ{APP\\LKK ~^ tOQQNʕ+55ťK$11i._ QQQ1?? P^^$)))sQ(>Pr ---HR]Fgg'!***Ykkk#bccqQWWGKK 8 s-jjjU/<'a}ww7nP__Jb{{/200@RRTUUڊᠩYӹx"tuua٨BR4kkkvN'뙜daaaZ-X,P(P(DDDΝc||5A__Fj qE1LܺudrrrZsixxXemm>ʀ=og~~D&&&HJJ HNNl63==fnrB.]Dff&t:iii<+W8~8j6HLLl6SXXHWWo}G,..233C @RQWWJŋ \.?1rׯ_ Nss3dee1>>իW&)) 4v.,hkkԩSt:X\\رc7 ._̑#G4BtuuQZZJTTOBee%N666z E& ]Y\\dttXpUfcc@rX[[Vv;wazz,߿ϵkjr&\@ʢ@P())`0<^vwww(J233<L&/^dyyd쬬,HOOR::iz#ީ|\.'))wr]hkkcll[nR(..ŋLMM199ɉ'h4\zU0Μ9#˗cwwW^yY'995LFVVJ@ @jjs!233jn/b6^N ɄlVQ(,,,ꫯ>2ֽ+ Bf/hb}}"</^ѣ} xa``ӧOcZ+Wp!z=@sC^^q 1LPSSf#'''O>"ՅF~?244R$;;۷oġC8ts=f3{qꨯ,_s[[FMBBϟNGyy96=Nvv6N }6N^:;;줷WPx"KKKO[[MWW333ܼyQ9rϧ.ӹvLLLp \.}n'))IH$XV/L{ĉM__ܾ}'O B?;::AP6111ǓLGGuuua2`mmtj5iiiz>j  7YxWY^^R,Y[[x<߿$}Q^^Nii)###=fNGGaArjj|㉉!%%E~&$$1hZ!2H$loo 2ܹsDzz:a_~癟geeW^yq666X__g``@+"lfrIN'###Iaa!ׯ_LJ~HBB ԰&Kgg'211榰QBBRR1Bdd$~.lPZ,{x.eff)嬮*zݻG(Dfc``SNP(X__gppCVt:FRSSl;Azz GWW.;wм竷hMۇZBLDDDDDLg{L}eeӧO/o>jkkVA񰻻Kdd$o6sF#rQaIIIw\.'p9L&oSΝ㭷DxQ _WW(ʇ066Fgg'mmm?>lnn۷˿Kbcc^y~m|ÚٟiiiŇ~H~~>G%22MvwwzT*t:SL&{oo͆dv޽˛odggJFFucbbdmmM"##/ynn.j1\t`0ȟɟR8t%Μ9éSn7C8KJJ g ttt~O Gh4A||rC2""" &&\coo@ L&vxj5Rֻb!77N'}|;K&a0x9vhhGDD)ZBdW^EDDDl~fRү~+FGGQTzOIee%ZߢT*Ƞy7ի>}t:tt: ܸq'N+ĝ?nj1 jppFF#?)**}k )))Or lnnRRR0 477jj(--% 7nHII 9ijj>;t>?A_m677INN~:tzZ-,--QVVFEEÇ:/mmm|_gxx׋dbggJeaaSNy饗sܾ}W_}_LOO^'77rQ $$$t:jz9Z[[Q(瓟Ǐė}1<<̥Kp8(J4 ^{$ 7nȑ# Lr=,,,t:J$$$/KRRR DBdd$7x-am8._ҒPw!`iiIKMM\^|###ILL͛|;y(422\Nl6 5N8ZF.#Ɉl6@}}7FL&CTV h|ߟѣGx"3g8y$KKKT*d21N WDDd2AYYP 4<6qqqO<]ѣGsdeeqiBjj*ǪJdd$.]СCvHLLqxii)?e߾}³QHeĉ >7|e"""0F^z%{L&czzV+l(PSS``0<ԞP(4~LgkkłNcjjBZZZЀC* e^E&q5L&jֻD"AV #ݎN`0/SRR»x ijjݻ$%%!Jq8+M{{;̐׾5n޼理n~;;;턄vzc6 bEocxdb~~hEcPTh4V+ft:vB!KcXӉ``~~( Ea20ǣVE@뙛#** , <j .+RܦjILLbje~~KddXɓ *I)"Cv366sJb||GBB.Kf,BAbb"Zy"##I`0$y8r:%<ŒjbAףP(>Knr)eV"Qbcc;VZ9IO mjK/kl6J%*f,qnn7SSST*D3 VU|H 4wn"fbbp1W˜pNc||\t:``rrEBBF|DFF8*E8n㄄bajjJ|f|/MJ$j5(J m*++y1 vRdaa7|S ,, N,,,t:ES IU4пK ׋րo@YMhH&>EEEOUuR466hd׮]߉džvj$KedddddddZ tɃgB{¾ҥjqoG%q#x. oJ5HEʳlo }s% ?v$/d*T*_Vh4*@RqN3}V|>'K!2=r)X4)IV"Pp8!㹇x<(g~?VuFR~Tx<"7j<պĢ1R)'H!_'k|%4YOxqO+B/k/{h)NKؘPmu2uR[dqqil6>ױ _*_ͳdnn/}`pps{@8 r4662::*{x|D}}= K:_Ijg5OjY,Ӯxhmm}bOg?I?( ;66rN>Mkk+iii f3կrN>4NFF| 蠟~+zF?˗';;[rn޼IHH>|/W\ٳtttݻw9vMMMBqO>x^ӁG^J%yE>_IAIHo:u MZZ8c%c~JKKuY >2LCvNT֭[,..ǹr 333RWW??HKKO>R߿ϺuP(ƒ.Շ?$>>+ ~\ⒷVjQ(omJUU֭T?yZ?r\CIMMsN<ɝ;w BF:FkÇIHH@R=Mo9.^HFFƒl9Ν;ŋy!999qAjkk1 vGEEnbՔ999'P]]Mdds>}M6144Ç'..ā(//5kHmmH'######őS%h_<S tJEqq1wbPPP@EEUUU$%%jp.eee@ff&۶m#11ʦM@EEJM6K tx_l6$<n޼JEGG۶mLFFGhZ[[%##iiia8yXlZHV^͉'>86l ++KnbÆ (J:oͽ{cժU cww78~8k֬a|| .033 /FV*֊|&.Q^T_Vɓܾ}P8x LNNC__333\.N:Ess3111tvvritn:ꈊ`0P\\Lmm-g6 tRɺudvvEؽ{7ϟdVXѣGYb T*Yl111[aXzl8N:EUUcӦM%zOOǎ޽{$%%q}N:z胃s<@TRVVdbbb)߿ٳg ##'OR__<&D]Ftt4\r) <<V+ׯ2"""p\ KJJ ?~[R__^'22u" ̰m6.^ȦMHJJ"77G~zbbbBӑOTTk׮d2vٸq#(`dd]vtzl߾]*,,ȑ#s^y&''aݺu<|h`xEvAXXny!"Ŗ^aQ!!! qY.88xvLNNR^^b!66n8s UUU455ϱchkkCTȕ+WZXV~ʕ+TVVIqq1܌h$)):˚5kD.^s^Ff֯_OFFx鏍֭[yYnQQQ\v={f<Kx<FFF(..F!e u322zv d2yfJ%F233azzb9p]]]tvvbX'ohh6^|%@ c||+V|P(deeLz=IIIc#<<4&44ćZuu5,[L|\P]]-Llj^wMGGNwRVVF!55Uyr!FGGIMM^Y/_8͛ =sss|DDDISSuuu477SSSFl©S`jj^z?.">Z-ӧOߏBॗ^bpphrssa``˗Dt\.n6 hB~~> s@LL  hh4.ɧj| m۶OuKK Gl[["N'gΜᥗ^bϞ=KWWmmm9r |2ϟgǎ|*lwll. INNfzz7nB}}= ( ڈ;wR^^NTT'Bll,N+WIee7ROB͛7q֭t.vo6ANNk֬C0r :;;bӦMիIKKcaaVKZZZ III| EՒ*rssIJJ;v8IOO'44hEh4jzzzرcǒ^D$'' ` ##AP*"g~~>O[tK?H3غu+-/&5y~=jjjW_Y:::X~=yyyŋj+pܹCnn..]z=ϣIII!%%***BR`턅T*y!сk׮}-4###C<ϒ|}HvFxE1<<'|‹/HAAnݢ*|l6_tuuCII o}}}TUUEUUbob :t4v+8q_]txtCxddWUUImm-555gg;ܿL]]7og?aaav|>lٲ={յdB`zz!}]w5\v-֭`00;;lv333CSS555 x n͆` 11NGmm-{dggp8%11Ӊ#33PQFa~~JDDk֬ATF\N'GAoh(,,$((9޽{{v18|0[neʕŻ8333TUU+7߿Bxx0lDFFHdd$~ݎ(Nʹm6V\ɹshjjBP@dd$J4222 l6c6YXX ''Gl9INN!sˣk\.111B9_Ѡl^'44l҄nj RRR팍$ñX,DFFVpt: ncٰZ[HF#)))LOOvIII3gDIOOp&&&R$??9t萘ܹC~~>.L&]Fgg'?ϖNJ r5Z[[~hDP`2sh4v;\d0La2l|>pݸ\.l #++$RSSIIIATxP*X0233˗d2xh4`Æ l2t:;wwyXٵkommm~>|lfŊQ iiiDFFk.oν{G0&''ILLDEEE𑑑t288Ì0::333OO=''sm"""ezzSVVFaa! \|6oތhd~~H~322B]]:ϓ8سgn󔔔PYYɦM(//gǎnʲex!W\{m}r :֢Vgtwwe˖'zȋ>'NjT*)--eÆ 477rJp:lݺshh5||#"-¯ Fqq1NbrrSygggy>233t3::*brrZMxx' """ ɓ_)a={[zy&z5k҂BB{Xv-(^͛7"Tnݺ$l~~ݎdbttR}J%^Z,Hddddddd Bhr|ܜ?䙙f8;;+^b.:L&-HH"e8Nù\.<Z...Htt|> QQQfffD5,7[V3==--畼111f2bOf M&JR,.rP*rD.v$$:&&ۍdBlj #<<\sbjGjfP(Bxȃt:q:'#p|Jx<_BJ&H?ãj% @5x>׻?/<ϒrIeIeAz&S$?GOOvKgV{|>nѳI*.x]Ϣ\^y&?~M{fZ}bΜ9!=='~8zQ(KKKy&jZhx^._̹ssJgup8D N:Ecc#))),..GQUUl&**GR^^{}ҥKܻw V o>a1 477NFF'88/RTTNx1999\r';x<( 9w(,Fd|>BGCR~X3dzd>%}g%-#g+ƽ4aiLtuuiiiX-p #G"Ҏx=IT3\pE\\Rhjj5kֈrJ]~ڻbarr9n߾M~~#i7 +W$((hɵ'&&8s V?&әo,*GFFFFFFgaaPwӉJlڴwbX(,,fh4\rW\!::Za۶m#))gƍjR]]޽{YrP[45 k׮jĦM>w%衡lڴjT*+Wm۶T*$''Gawddd`9<ݬZ ŝ;wxY|9:x9qyyy9x ӔMhh(F۷oaJ%G?GP|rfppF??я8qYYYܺuM6Q\\,RIV*Ցי|@zz:j;۷ bnn?)Y9y$MMMDEEDž Vee%[l`Ynn"&&ƍihh񐛛Aٸq#]]]t:_ŋŪU8v+V 55AT*˖-#..FFFJVP9z(ܻw-[< 4Ϝ9CYYQQQJCCD|ڵkTTTP\\qqq֒Muu5333tvvrE ի I~~OÑ#))+WPVV$iii\|r_Nxx88qfI__ 322R\S>,,!w%jkk9z(|>Ξ=K}}=x^?Nuu5Y9BGGiiiܹs'Or=222pnݢYdhmmeppa&''QT:tIRR6 AAA\pNDZcǸsQQQtuuIcc#A,vN8AEEZtwwBzzH).bccinnLLLӧq---deeT*ô '&&7ochh'Ob4l?~6q444*^MM ~UVk.J%ܹri ˗1ПTbfrJ޽lfƍ(J0$%%,[lAPpAn344ĩS cƍGp@bcch4 v/U fffhP줰pbbbD^X7oM~~>^֬YCSSGTLoo/ "Œ墫 GWW.\@V rz&55X^/^)RSS@ղ /$>ccc*,>F}}=LNNRYYIjj*wܹs ȫJHHfaa9BPP:s122`W^app2331 tuufz(kRR[PPDRRϳb `$&&MZZ111DDD\j[nT]߹sY~ϛ,^x6o s/LLL KcݺuP(p8edd6F#"o}}}H9fqq}{";33]Fcc#w?1v]D T*/^NNJ+P՘L&gll LOOJRؽ{7.]rӧQ,_Kn˗/Z͵k'++5kp N'166z+V}v1333墷~&&&XbF͚5kž>(?Oijj!^z%|>/Laa!rMzzzhoo'==]׮] 6AXbLNN󫫫y^Ζ-[شi/^dݺu? ;w$22FSSSDDDrX\\$== fggQ"繌w>O>a޽P__Oww7ׯ_͛#yxl޼ uݺu+ T*Ͽ1>uYO^^۶m҅wN&55X_vs&&&JyVn߾Muu5; `6y&)Պ#>> 6c>|(J $17ndժU155dtݻO~<}Иz=ݻsΑ&,,⚚*Vpvqqqbq&##BAOO,..rA"""xWQդرcdee==00Cعs'ܹs\/gK(чq:a4 cZqX,! ZR[ O퇕h4|>jZj5 СCLMMObb"+|WP(t:pxx .bRD~$%%n:^uRSS9~attQ, VѿX\\p֭[ 7nK.Q__B 22 08v;E(FsVfcŊٳ۷osUBBBHII!66vN"<<J%(d2q9f3 T*~ӟ2??>9ʕ+ٵkUUUTWWիWٶm o4T*GԦ%jEѠjezz 2}2222222O qo~Coo/c֬Y^^Jtt4۷o˗/t:ٻw/s]֭[GDD_^XX(BC/\@yy9* :)[RLLLhpA߿/>8}Ƞ+W0>>NVV;wdŊXV6n܈ѣ444vZ;|>333Ѐ#777or}6oLZZǎeXXXݻ,..i&]F}}.**V\I^^Ǐpvڅ^_>n-RIDAT22[oECCaaaW_$%%QYYI{{;6m"::Naa!CCClٲ,+WdxxAzz:.⨬dqIz=fxʈc %66u?N񑟚Jkk+< 99DR4tvvrINNe,))!))IG q())(n߾Mpp0 30sm\.n4>|(«ݻ$b/_b233`dd`rss1ͬZLAnܸlذK/1??OMM ["p8dff288H__*beٲeD||<˖-#""FwV&22!v;ɨT*&''ELHH|>JJJiiihZٰaPXXH~~>QQQ Epp0f"󑐐 tHrsszjaʕ(J"""hkkFl7gڵ.άV+oFc2pOgg'FINN&33F P$"}immG?mmmlذX&''Yf 8N~:$&&2::ʪUERNիW)++cbb7|;v2222222|wܜp( fffhXp8~BCCR*+Fl6c0t✐nj l6<2|%,333bo‚PGT `V^jxPDDD< <`Cxf3Jp~* """pݨjj5GXX 9!.j1 ‹ !$$DN*l&gffJPRpt:v;AAA(J,HJ:NtX,\.BCCQ((Jfggimme׮]\.l6Fhh(v^f^~,GP C-<_ $$ tN~?ǣT*\.j5z)Q -/}n'WRVոnюj)!NC׋"h4٥qp\ljZ6"azznܸAww7!!!hZl6n[ڵk?%//MxҼ w#Ӊ`@bXP(VVKhh(^,w~ֶ˅RDPx}jX<(͙O{Á^s“U׋lR]Ku/m_zh4,-fT*x8] ASNjsbvt"2IWKGG ~hh(CCCx<233n,######5244$Џ#ـQQQK" j?O B]"@^Ha&@YMh>FSII͗yD>44|GSSdggSRR"/z賳ϓ\r P(X,k]A*Vޚ" ͆B 88,,,,|x^VZ"$OY&> !########ǁj_@W?~$0> vR t)Yh6ˠ 3~R=H9J?}~N&v6j{۽$wB!vOVy"Tʫo V,=+E,^K6xh4TcAFFFFFFFFITB)z+W088Hvvȏ]]]J"))s%*;Fuu5] )ݘFӔLvv6Ӽ{twwS\\(| ΒKyy9@bb" #?LNNsss ܶǎ/TGGG9p  BCC9x 'N`t:N:%1%%wrIjjjErUV+TUUqIz{{Yfo>rss hz^T*z={Gzz:RZrd+JΝ;eeeܼytq%.^H}}=_HAr Ν$l6|`49v׮]c``Bjkk{t:477s .^Hgg'7nDP`Z1 Bvs!0Z]2gffX,\rBJȰ~oX7A`5x].*NG]]h4>*++Y\\$33SNq9k֬\LFGGQT,[6n111X4XXx<F޽Kbb"n"??3gΠhhjj.$99 6Kvv6ܺuM6/Mkk+/29s&RSSfܽ{hll//tvy&l6NΝ;ٲe m6;#nٴiϟgÆ O|q|TW\\XV֬YCcc#&**XcΝ >ZZZx^ETr FGG?u_ш㡷 6| ghhOaa!*(!Bdd$NddTVVGVVdl½{JRRIII#OSoo/*Μ9J3x;**}1<|>t:q :ׯ_GVaZ -- (IIIš'<<8bccrNFFsssh4F\466GYYVUD ":::pK*()) 6vZT*---dddhdʕPUUEyy9EEEٳDLL qqqDFF233CHH~$F#X͛7INN&D:֭[JJjj*SSS̐Jbb"#######mzWWGW_%##wիWy&*L&󄅅fsN !77ݻw cq&&&裏X|97n҅kii̙3|p:=zyſT*|>u\Buu5h4^}U^~eFGGEpss3?O aaaCRRk֬aӦM"^mmmo>mƲeˈ`||IN'dddsNbccaQJZ-6H_ܹs򚔔$Ҵp8D]x<RSSyP(C^^}K/R$66ZMGGǏ7|{{{9|0w&77;wϿ&&&x"'?2K4440XKPPA<.9b8YbäT*Y\\vֆFŠ+w#((|***^cŊܹs:ٱc333a4y ҥKot:9v(J6l׮]###_~R<owܡ"??200^m:55ŦMx!]]]"2h4288%??_w /`4X,,,,rJFFFcݨT*l( Yv-555 T*yW,JJJ83g133CPP!!!b fkZ^RIHHNSxDen!Bv]IHHT>Of0h|&Rf9N\.N'oل\*wpp0nj[Bs Hm]O7'########~@B %Q灴n%1,IP&JDw)^Pr ti2OGDFFFFFFFFFP,yQ?J>y<<Wޟ,-H߿k~R=(gZ"VƼƁ,ARm"#########PBTw% \9!Tx0ͨT*T*v:h4!%~f @wǃbYϋ$jq:"]VS6M^)JT%"Hv]l6v!R$ j֕*)a\.Q.׋lBJn"DpmIHNC*Xj7IΝ;}i#%TR8ͶDNBj[(IK7PjqqQԥToBlraP*"M‚u$r\R6? \R|X,'"l6URY%QD:Bf?>د́*OB{R_{RHrׯ_!!R~q*++jܹsy&''{.[nL VU!׋bAPǑzi >in|i.lB|pnnJ4 aaaKJyrJ1&&&0KgX>|>T*8–ݍdppNx{{ }H}sboo/555$$$={~rrr~'T -TJP>$/ Gd0IOfppWrMn7YYY~^/QSSCZZ3 4(--cXhjjbllN87ahZiiiٳ\x6oތBXbKG!%%+ ~ t^>#!++K.QZZK>tbƍ"AuDN z3I[¸4H8 <%%cKZɓ" $E}mETbE&x4!Q^^NIIb菷I__~!MMMLNNÕ+Wx"dff9v333444qFE/Ձ) +W顠@l 'Nj8wtvv244DRRǏ)8<ϟ,pQ*DGGSYYBISy&ǎcժUܺuI 8<ׯ_bɓ'tp]>L}}=^.Kt:b`nna(,,dvvVKHHȒz$44/VH ɓ&''oիWٱc4KeZ9pqqqz¬d,J}7oRPP$Nu).EBzN8dn|VJ3`ٖdp8T* /Dz+thc%N''##1(y|p]illȑ#]k6}6۷k׮zN>MKK GQ[[KHH7o233Cnn.NB裏!((0>nܸ!֙3gps=8@]]xTUUaHKK8onnoodeeqmشi^l mFGGp%D۷ooݻG||<6l 55'N֬YCnn.)))#gΝ򠇅qFv;weӦM=qqql۶Z4 W&((.n݊Ncٲeq)6l@ff&< && V+/^dbb"|>---l۶˗Jff&%%%={<ٷo Z\III 6V9wo6}}}hZټy3ccc`6_ɓ'1|'PPP@ZZ*jz}}=\v JCC>YYYT*9z(uuu( GV+333"~>{, Z[[9|0^Pjjjسg7o`0p5֮]Kyy9񤥥uVܹ#77 @=::[<SSSٳk׮yfVXڵk9u+W$77 T*˖-#11M61<h^/'Oqs111"/(Kgffۿ[TTTP[[$X*++#::rjkkq8-z*tuuG}}=OfhhΟ?OHHn1fjj29s 555DDDĵkHHH`hhK.LTT|'rؾ}ײU!@蠢B]]NΝ;"!!|rHOOÇ022ÇIIIaJ\\ϟ'==V߿륽 Mcc0O>۷ Rhll .\@T_łjҥK466رcJ}}=n:BCCz*[nrQZZJTT7nܠYF# bbb:;;u\rH9<<`nnLal{^.^H__MMMSVVF\\T*&==]MW^'?0rKKKO~޽{ ˞={8}4\|FCee%_+b-[Fyy9^)~s) UUU_58(**bժUX~_pBBBy&/b~~ZvM||<555L&T*?8uԈqLqq1SSSrٴi!### e ~FX,_ZN'Vb2 22ػw/?~Fȑ#"y}}=7o~qxx8Vnn+$::b J%aaa/UWWn:""" yIHH -- EJJ wfhhKdd$uuu o墿`&''9qJᥐ60III1557od2@ll,z~FGG1\v;w,)B`jj>"x sMv;nݢ\rqy뭷f߾}h4V\ɉ'FsefggIKK_f``8x<466uVBBBXr%!!!DEECVzn"**fgg)..&22>ׯ͋/ի9uz*/"w~fUPP4ٰa'333DDDpE顰boNjj*wyz&&&p,,,0==M||/LXXFшb.ؽ{7۶mcͼk^{aoƍ h4 Cĉ Z-.]Ol9|0DGGEXXsss$'' ür|M~#5kÚ5kصk رc`0"&&1IIIPf@<111|ߧ l߾m۶177044DKK^#""۷s=Φ f3Nll,\D;i4?LQQRضmW^F||</^DѐFի}v^xL&i\~mnܸnf}}}x^ !//oIPhh(^Fm&>0Yr%BCCqݴ_^{f /hkkƏ~#Hyf$;;z:ԋJ⭷bڵTUUihhRRRYRJw8Np:$&&&d`40h㙜daadq:LLL@LL AAAq+III!99DGGzH\\slfrr$h4. ZVQ( /E ?j߽{cǎkLww7իܺuKz~~>w&&&QRSS)((Y\.>l6STTzj֮] WWW/>\.8p[o%rP;Ioo/---TWWsmJbpyя~DPP(gjj*YI<n[zzsss}v RIss3'O䭷>|{)B 311SwA v%S__OBBB{ݙN'8f? afݻ]!ӳ*nvWl6fggEz QQQe믿NTT_~wyRd2qIQRD`|P[[K[[֭TDH{n7>ZB`ʕVE{= qll2~_ߏZ8,,aFFFRv;CW]\\dffFO ̫LMM'g$ͥ4{˖-_񐔔D~~>v]xcccyyy޽d())d24fj5NÇILL$;;M6vh4,..211iiiG__XPC*?=.r8u6Ml)G3gΠP(xE_ }_%mpp '<<\Fy7qݟCoX0L"cllxViQlϞ=lݺ۷sU ]?33dnY###»T?R{J󅴨b4 rq8b.{|4HlJJJb4͒q044KHHXbcc`hhJEFFLNN /lIIIFǂINNfttQv;b䜠 q6 266FJJ0"))Ax<.OI}@22222x|f{LL bxxiBBBx饗G~aa![laff 233ټy3/_! 477s]mF~~>mmmdz|r !t:Y\\\2K裏a||h<| CCCt:^/'N@P0>>NVV555TUU111AVV{졸ϖ-[p:9rVoNLL 1^hiib 套^">>GىjKMM ^;vpMwϺuꢦ7uV|>W\Aӱw^BBB{ffzNw㥗^7|4K/ *77)lقgzz~[سgTTTXXX 11J8ucccLOOēu~0Lt: hooe˖ϡC!BpDž7.ڑF^ތ &''Y|Xh Z"{ex<JKK 7 ))`2HMMeմ͛ټy3###\~˗aŢKqq1TTTGff&###(J6l؀B^"uXv:\|^}UEXo)BQTB8355UCƪU{SBv+v J8066F{{;6Ms,ǏÇ8N QTsm1Z-<⑑LNNh0sf3"|?<<n7$&&288$ XVڊZ[ujjj>??Ovv6*Y )))›?;;ƍ>,_+W299Ɋ+ 55FnSXXd211+Bff&$''uV%33&'''44^zXJKKY\\7$++:{~xxJ ؽ{7*Rj5o)))ܸq~^{5VXm۶p8(++#**_~DnܸÇyWYr%TUUh˗ _'..rx7(,,F^x֯_k.ZZZ|2$''E"NdddddLbnnN 3338-[&V~?ZVfK+Ǟ*HҤpsDHHӒ!-yY}^fffDrB>PUyN'nR2z\.גT^R :NxZV+~,}WKwRK&݃G>@"ij||Ģ$q>^K+,CSS477WWDDDP$&&gZ lJ#Ei\JZ{R].>Noҳ~x<IHHXlm"6t<|ʪU|(Jzzz8{,IppSꏁ}+zXRϚ4>+< Ƽ4H cCY+RHsސH}5%(IB*o(]TρC*$v&N8I}]wt /yKzfiΖD$>8K@OtHm-={|"];5Hm ]KRևāHHH`Ν#UI=] a!RH{8$*՗?IIqX?'R<|Km*yR}S@edddd144$Џ#mA{|S IU4пKϋo ,wMhQioo^pv;<ZnЀb ++'磡 /_Nvv墩 Ʉ'55+W~ї!@ȋ  '+!+]^)-/~_{ٗ<󃌌wYz2?k,!?TQ &ep F UK~R=zПU=HQBxTH)j> =|iWݟ,)4?}F=ߵr? 3ic>odH?Mddddddddd%?ZLNN xdX,!vt:QEK,..±'''9rfnn+l6&''Z?ە~z1==-ul6Ha$!)K"-ӌa6Eg'~%r\LMM:v8LMM1??/<6i!L455%T~ܻw աv.VJd6:u) \MOO/v%P6 <ngofa8س/ujY<~+޽{-cQt:~N{{;˗/si}}}=.\ RIzz.nLVsYnܸ۷d~~M6122ɓ'}6,[k׮{Hrr2)((`nn?'j8y$ܽ{e˖<twwc00 9r#GqFt:ՑHGGTUUFwuuuLLL¥KСC,[QnF`qqQ,2X,7vjB#CtѣjVIF`r***uqqqX,> ))/RSSÑ#GXr%7oޤ&,o>Z[[D_Ҭ}SufM2vr K9#""1:.\@^^wNYf[nn7VR)ԯf 177Gll,N&An7EFnx^]R^XXJRJ+3g%**J(KH.$ii[tf1::JYYh4l6Kg?Z[[ IbuՊfQ+µkװ"{ihh ##@8/_&77V+I%uiF>|:;;Ylْl ~~:%%%,yjm2 Bш[iq磥dddddd2i֞߱c*o$''ׯq:ܿqݿwW޽{8bbbXr%#III`0 /pIo8 555)++زe˧ۂ^gӦMZ-===ܽ{(zܸq4󵦀n޼Izz:\.JJJ`OjILLdܹsFÇ;p%&''䥗^_>'::MTTӼX,nݺj7ߤ{yf _+Vk;wl***Rx@Pp 򈎎|>ˣW^yZ uuu bccikkjΫ{Gvv6˗/I\\{ˌo͉'⹯^Jqq1V\IPPϟg⋄zvZAhh(?Oq:_%$$Ç1L撒"r9sӉqa7A`;)R"%Jܕ${b8I4_'Y;+i%DKTaD% zo`03iXUHIs>>ےx'9y$KKKT*=s233 B<믿.|8y$RϿWJEDDDDD|`Ŷmۨ' QVVF0nc0t \.O?4EEE8qfQTd2;T*n_Fsth:zzzطoWh4ىD"`aRD&qmFBBF3 pi222HOOgee\`y¦oݺuMf3FÛoD"A L&C3==-SSSLNN{n)))$$$T*릦&*++_SF駟&77B}z{{YXXnS__OYY?q\n"XnhZ.]DFF[n>}h4`ܹs_)b0fqq:t:cccjkk1LsMl6BVcǎ=f. 155 >,III,..LQQ=sN>, _ٳ{̎;عs' ?G?j9<cqqN?#kO~9x twwc4)((v"8pË/HQQ@ ]]]Q #77]vo>N: ɜ9sN͛񕒒BMM =,ɠvK/Dx'Θ 333tvvHss3p 6P[[vo344s=B| (((`,-- ӕg?EEE088ȯ~+8@AA&)L&燐:GQZ-FNGRR=vnA6 j6hTh/JB`ݺu<3|^ڛ7osarrrgfv;󌏏 s=G^^R(,,-"x333C0dff,W&л\.v;~\hDP2 шZ&FG+d2aT*>  !wXEJ\.ԹO'''j1 $$$Vz|,--hX^^&..̙Ԕ`1WRQQ2jCظZYY! R#//~kReBʸkMlm * RB 99}{sz=+++D"? D"!99atkcj5J<=Z&!!aMf3\xFV+ǏgffG j2G &DQ. v./ Y9b rǃyGEDDDDDDo377Z;v`0e.^HII uuu={gϢ9|0ܺu.͛BAr 7oc/L&8INN& [o177'/N"2;;Kaa!\~y 8t[nEPk.o===d⭷bddMMM 2R)=  ͛73::JKK {졢L4e۶mj~zVVVL&N9ܶm7nܠEvM P(426m8]v1==b!--=~b{glfT*njjjظq#( n @WWmmmOGoo/ٳRAX8IKK,HLLC8,Y>66FGGӔQ]] #FɄjeӦM 133CII#u`R֭[8t: , `RI]]\pLVV+++Y~=TVVT*illdddRu1??/^h4bو#??L&,,,p!v;g|h4gj5)))TWWHYYhɆ `aaݻw3334& ZM{{;֭2,..Njj*:|A )//'##*"D"t:كD" OEEruFGGygn[496nsss۷fff+8 v())aΝ$$$PQQAZZǎn$V \|q Y~=PݻwxE.m6 B! gqq3<#FQD"HRlBss3~8 Z<<n ɢ% P^^N$77pt?e D"d2D"#w8`=cg hbeԑH$B!ᙱpX}α:o1t캸8ᷱX'zg1MZLk;/e[YXX@Ѡh֔5rhkkczze?'HR~1LϿW>J΃~{ػ-cF!Eb8e$HKKܹsXV~ }v;%exHOOX3V}v[_WQzzz0ʹ n @nsB!!۝"V l̝ȝo}X='b~_ܫwCTf \}{[wWz w^~k;L''$%%)Ýeltww388(‹,_W'j{9U*}{L&zzzwE8bQvͽ'\UΈދ߶߹Ry^ ֍;QVVƍysiKnL*`A> T<̷Z&*MoT$O]?4kpX0c\gu|Ԙv EAyOOG_>Y<2|. z,Md 3qЍaAR Ѿ \VH$kLܿv5<=f+J_UOl\;EDDDDDDDDM$ ~3w/5fyͧc~~_3//,v>L?|\.A"J=F,uV%11Q\cURiZp:r҈cyyÁh"_r7+ʻX\\$..BN'Nxh4 X\\$ RtvINNYZZq[V{ii + F&%%VY\\Rl6D^`  t:q\B=BOO}M(ݕoRL%%%}L&cnnP(D\\& D<*Jy`00 Z_`7oRRR"D>~Ebb"p Vh4*E YXX@T )!? pE~?)))T*" azp4k&ӧOիW1LL&fff7c_|E۹u tttLAAV_W T*F144Dee%2lM6Ξ=KCCpO]>CZZZvn~_Ν;>A*++r ?IOOuuuc;\. N|@[[R^crrxZ-oǏg( ^~e:::hnnd2100Kv:\?OGGSSS_>)((@ 񰼼,丶( p$!{,b;N^/A;Fii)*JNR=VY;w\z$N'/2 ŋikkرcphmm%--@ +R\4k1!v s)..O0D"+FA f@Pyn7r_|$~Xf/,//ikkJ菙yؽ{Wq-6nHss3'N`vvoաȣăYD=;;;wG(?e233 tvvZJ x7`ۋg?*$''Гپ};>~>u#Ž;hkkCѰqFF#ڵ VKMM oMGzff&;wddd׋B`~~ݻwʾ}ؼy3:x?l6OII EEE&Q8qKKKH$>#8u\xQR\>7x[nq-9qNgϒDKK ?Dºu|_gV SSSܺu KZZ$%% yg8w[l,S1 k.$ D}}=FIMM@TR]]MII 'O_W$$$KQQ_""""""""?Qjc._L(χDӡVR[[ٳgilldnnN0~t[o133jizzzxAt:---r!-jsOBA(̙3޽Jܶ'O$##$<?&/Q(={rrr&T$ ohZ-lR)JBRR*!f3dQ(FyqwiǢ(~|;[^CYZZvDuu5? sϑOzz:Jk׮Ζ-[ػw/gϞ%z#IXݍngΝ(J&''9qDDqq1.,--133V%99cǎvv"D^^Hf(((`eeL'--)&''ٹs'Krr2yyy,,,`4gLf(( ZZZFnTj>h4zq:@&w^(>O0z8zzzhii@ @AAŸnn79r\.<[t233sr-S Oj!IHH N:ő#GHIIܹsv6oLaap;%NLLӟI\\ "$ n&XmJlݺF#EEE(J*++QT,.. 56 sQ&QPP-[,O&b6)++#77˗/8rȗ]DDDDDDDD &.bWVV(//no:cioD c4n>&΃& H>vaaZ-o,T*+Ow)vg=lX~fu2LOO ?O߫%VAWܫ-Ws,bXHKK{hV`E҄zw%n޼ɟɟh Jrrr(,,\3c}{/5EPFzzgvIk( CdjjJPB2 B_iVoElS;7w~ZpZƝ <^Y}}5w>^u6_ݏ8F#: A0{{TuPt>6=^@III?F%pΝ zݯ]>o;vݏ{ ;JDDDDDDD {:}qq@ZS@ @ @} A. )ݾ H$!=B<ߔvH$|>Up||CPaNd2`qgcI Dx<o%T*ӠGQJ`:U3qOII\*['+HlD"n#H0_jSSS{ `ii+"' "J>A"?s+nU RT/2޽iΜ9í[F rrry&Iee%KKK?' 'O***xOO:6xZ-'NرcرB /0$%%1::JSSW^ER!ydxx^x&''vyyy5iKKKByT*G=))ypLpFYXX`yyVK__)))AVcp:h4GRS:ŋikkFv;B^cÆ 9s_NJJ ++++LOO#˅1vt}uP(bt"XYYATx^,.|cGTL$aeeLHrr A^/RTH]v 8n7P8~_&E"ׯ3Ӭ /088 eeenJ0N:+† HHHt 9οI""""""""mAҬ}G]]}}}rIA //hjjBb6\app[bZl)gϞ%##ɴF@7Lva۶mbR[N||d׮]g={;vPZZ$)))cٸx"pXxAaa!ŤR^^NUUΝBpzdffn:RSS),,m۶T*|2;wdvvdvmۘncۉFg?ĉdee޽{T7z*tvv2??O8fhhT믿(}YYY-p\immt8<999f.\3|UsrrcddߏFann[ž}ذaJI]].Sfzz)((d2~>c<R'NP]]G}ϟb x<;v!nܸAZZ}\pTQ՜;wNSEdvvwyDb>cfggy뭷0 zimm% ʩSoLիW 1~!|G8.\@ee%QQQARRׯ_F`s""""""""_sD@DJϮ]8E zg~211!ܭlܸE"B||<>,$$$ hll$--ZvɅ B¸_5*vN'{A*233Å &ڵklڴ DEEo&,// \]ݫjrrrJKKH$š\7<WdN'$$$pEJ%qqqcQ(_z ˗/fc``a7ߗAףVCVqFM6f-t &&&"""""""""|~y>$pP__w>e~j\;#}, 033Cmm-JaL&F~U|>z v366YRRikk:^u(,,'D;ﰲ"\HLL$99gy"z{{)//br_PvO oSSSNQ(B_Fט~H$"HD~yu㳴D"ATIzz:_i-w>?#{RnG5˴ZCmGȷl򙯻Snʵ@@`0N\&..[o["ZϘPM /S@w\?4˃p8,S߉L&:bPy&Dxu`RE}m Ǵ߶z߫VGY2X=VV{QE#'O~,£V/7db~~Q~?z^u6D"j5vd2iYZZh4bdnn@ VerrF]}yyaN|՟X4sBaz=^!Q `||Yj5J9&''cMLLV `6FhZf3SSS5 h&&&P(( &&&XXX`0 Jq: ^3G9 166rPrV#^c )>-1ME3:###|>z=h)f`˥%t:P!D<###H$!F=4!cu/N$V<({<ufiih4J?VB&bctt{WÉ z{{1L077f}F`llL 9~8[+hiiaݺu299VE.399$Rk,CCCXVBAX~?\vWjIIIYӎq"4>>} .a{133lg#cccsb1?t2;;AX{dll%q/IDAT7oy21f]}8;;+3z'@AX\\DIF;EDDDDDD>3K.ǥKdff2::__j ]yy9/cffnΟ?555:u_;w ͛7ikkeJJJ>u#U\ٳg… ddd xW`Ϟ=peioogÆ ϓNnn.頻nϣRtjΟ?0/_B͛7ya[pi;Ν;F#SSStvvR__L&h4op!0׮]^5f1??&0==FLfaa@ \.f y- KKKK/DQQY Ɲizzzr ZαcǰS\\Lgg'?~7G144Dkk+ +p8P*deedqqLEVvz\.|qLLLn6%\nfjzj??É'꫄a.^Ȇ (sssk\~{¿;dffV~:]]]ܼy5s0o6qqqX,ؾ};X#011!4Af3K/lRn޼ΝP(PV(>}9֯_/KfggH$( ^}Ujkkimm%g!p!>xvlj'tNK D~~]կdxx5bddǏ(cccl߾y7ؽ{7~)4 ~iz{{C_IFFFX~=ׯ_gpp/RVVgrrH$Vz ۍ` !!IPE&aۙ^7n`xxW_} 6 ~:7n|SBDDDDD[σOCd?gnnOCCEEEH$B_7 p8JB*RYYIYY6-[`0 pݴiuuu|LLLH$BVV#f3?OЖggg~'Np8X,=z֯_OWW=)Jٽ{7ՌR[[ٳgq8T*}Yg||vZ͛7?!?0;;+X3==͏~#6l@UU333޽Nعs' Ӊjeqq)F]Z;СC$%%+O bo_ƍ¡R&y'?Fs/ٿ`TYYɻ\zp8Lbb"͂O~ennDKK 8p;^73;;K8fxxXhɓ\5V@̐yn~ӟ3yyyx<N>2zaO':Kr]F$aݜ9s`0Hbb"KKKnT*rJ?1< nKKKTUU $ٸ8z{{ȑ#\9LlڴI,\L1:q)))rFff&/2p8ϦMMa8nS\\LFFo&pX{7Ha-Jikkcnn2DQ >,dddi\.@7ni&~T*$%%qQAD"\~Ć ضm/_ǭ[{ illo> Vׯ^v͛7ƍ9~8ׯ_ Ay뭷X^^~պf-Nʕ+LNNR]]V% e;22B[[ZVp299IQQ#99ϣRXYY{aÆGaD ))za]CߥW `0H$4>|4=}M _M6O4-[ JQ*(Jf37oޤ:tR)XFjr9+++$&&rXYY!..J,mM를\ԩSB۷v)ĈN>Ncc#;w6kbKgZڄEQaP(jd2"p 4CCCk5qqq466b6eeeTfii F#|;y䅲s{sNT*SSSSO177fjj *4IIIlܸrN)Ӄ㡧G^nctwws-x7IJJ"77}a4.FDjj d2aDŽ90$&&gv܉L&{d 6 hO<͛˿K4 CY^XX1טA"0>>ҥK8N>`&o>,,,;'O$55Up033#??yJX,f3'Oh4W^BAaa``20ŋ9 kq vލR$//V_Njj*^+Wҍ7nZZZK.z~ٱc60Gpu_,^P(DAA &H$f3?TT*`*6v8==Mvv6`L&YYY<077[n`qqV+jEDDDDD=%%ׯZ vM]]R]]Bm۶Q]]Mkk+~d2V:;wG RW| |e2D"fggIMM%seAˬP($@AALMMf֭L&v)Oqㆰiazz\ƍfqqQsz~HNND{1Y^^nh~?EEE455aZYYY!775 d2IIIA*hdӦMLLL011`h4 m\.*\.sss۷f3)Wj6|>6 V˦Mexx={PZZ<&Ruݻ\!HÇnn}``T```$&&&t_FydddctG%))\.{1T*)((@*b4)**͛nSXXZ&++KAWUUVIOOgݺuSXXh 76zBhb$ r\0 \rÇIHHܹs RWW'ϓ뉋#Hjj*Ք#<8Ny'1L444Æ عs`YByy9XVmۆN#%%p8Lgg';w\0HOOpuN4ūayyg}9ٰa[!!!V֯_ώ;p :"ccc<3r^ƍ0C `֭ 1cXͥ\N$tFMM ׯT*h穧"11W200֭[ٺu+2E)//!8r,..P(,dt:1 TVV"Hhnn37EDDDDDD]bGD+++m,?Ot_XX@328._b!>>;$]H(A,..ޕ=sI?5VVVhhhv#HXnW>ϿɄB!l6_} n.S`0xϨ_7VVVB)#݋h4}^!{7 ݎV3/<LMM J;Y^^FP&=w.h+/H$uA׍XcmR(..fݺu_wbhT#kyD]\\]gffG=׉E&a0L&#>>k߇1kRk']2\NڷߝliI>uwjc_>zǃ\.|Ŀ H$nmH$t!H?ؘ_2  w u炰߁ọB$ܳODDDDDDDDD]H$PTOFQ*_xz|.}aaAQM1" RP( aXHLLD&DOO^cyy l6`bbq 0V{E166=WVVl_Q[`kxx1֭[ Qx<a rt&debوD"k}^V|_VGqx<;v BQQWp8aa``&P.KXbh4"˙ZvvzzzD" ~?,-- c{llqQ*wf~|>F.sxxV.?~xL&Ӛn7w|2ceeN믿~QfffPGn{"[[l6t:IIItuub49y$BQnv}{,Rg;nw{ǚ5pM8`0 `vvrpFAP0660Rx}}},,,(\|x((_v .^V%;;!t:{hhhW^yZ-999l6Ƹ|2(B[顽"MU\˗1͜?Tvn7ng, MMMƍॗ^"==]Hjv;/2IIIFJ%׮]czzsQQQ!D~:>pZVs%;Ʈ]=nzz=AD"$''ra"---򗿤Tz[,fffp8ajrbb"cffJ4ejjy ݼz}#?LV qT*[~)--exxI^ujkkyX,z7! VÍGI@ 3??\.gyyNvp8A"ܵw8 h4bZq8 y&&&044`00??b HyaLrnjGCCW^J( GJ;Y$&777sUz)(㴴c( ,/NfJKKYZZB277G$رcLZZ===?N'*^z ΍7X~= z z*ׯ_Rl6^`iizJKK1͌si:܋IIIBj9ՊNpzywرc@R)o~#t׋n  裏8|0p1 +lr)++crr1Ν;hh42002F 7oޤ;v}o~u%Rm5`0 ,//344$Cղ "ecc#- b /`innRpZXX pqa Ϲscii F/Kmmm/377G}}=tvvr&&&C_|Q9{,eee\zFXYYaݺu{||zaa!555h̙3h4ggR󑔔DAAB~ݻwSQQAMM v-䛍 ֲ[lԍTJ%TUUq RRR"11!vڅ`ٱcLMMa2czzf eee( AMvv6[+WP]]MBBH_|Qذ撙ɺuq۶mCºu똟'77;va&''|lݺLػw/JRMn:!V@^V&P>ƻKnn.a0PT,r\z{{~:fG2Ej=?? 6044L&h4255EQQf{RVVF0$PWWLJ~277Ȉ`QLFF#);w˗/P(;TUU355ٳg BB>N_W8ZZZHHHsMrɓf:::P*8q>rrrHIIW_}\__ijjrK/ +---B!X~=mmmܼyS8?I#Z@蠿b>CAp.--ncZ?˗/c4r 455BCCehha>LMM ϟ3gΠVϙjÏ~#hhhfQTTѣG9uRʟٟގFaÆ -[ggg9upPom8y$q$ YYY466R\\L&tD"\t7oR]p\m6LLL255E?j&''9}46I222.6nHOO]]]lݺP(ĭ[hnn2 >>_dffHKK… $%%eӦMi7o رcvHMMlڴk׮199ɍ7hnnt k]]]`6lijjO?ˤLww7MMMhZ?s\.>x [lӬh?Ο?/9,//޽{پ};NbeeBq9֭[Ǿ}(..ڵkp~˕+Wصk7εEDDDDDx$ ϟG&{nN:XpT*ٿϏ~#z*p۴t NѣwnG`xxgy$rIؼy KA*b8q< /ZV?sJKKo~fee~۷ p8墲bz-02L~xRTк>H$._L0dx<@P]͛INNǏJ pywq:39981L$&&rEfffarbttAXBORRR4ڵD\T*\ξ}LWr9;wldddΡCHII! ͖-[(..ŋඖjZ-p!uV6m$6P(drT*;v_d$"פ'[YYAV 4^LB@RD"5P@ J^/JT*0fddAJJJضm555TVVRRR\.]]]&&&X\\dÆ l޼*RRRزe UUU(JN'qqqH5n77orqM^/—^tv l߾~Dff&[n%99YzHJJ"33t|I֯_D"A&!J B(J瓔Į]ؾ} v;wdppZNXT*V+Nټy3O<#wYD"B!FczzH$lfffFm~~>333444zILLۋD"AVHoo/eeeJss3YYYTVV244իWD"Dz*###TVVNss3mmmSVVFww7 h4vJVVnf .3CCC,//D"a``B |>5?>>^O}}=_7oB`pp?aGLw:x8}4jLMM1::";;[x_bsb0??υ Jdddsddd`2HNN!fBB@9sya'$$j͛7q8dddAUlVv;w"v횐 ]va6 Bt:.]DOO%%%su]FZZUUUH `0HCC cڵkRUUĄpMBBO$..]Fss3[ȣ}MSRR͡fh4}vlB~~>Oww7;v젼.(--e޽Bm۶jgffF`e>::FZݍ\.jF4R)hmfggJ8gaaP(DNN;wddee}v"MMM,//3Ϡ&..N0;GTaqz0`4q:Iyy9~݋dffG2j>(t:6m"߿"vzu}}}lܸ;wdzz'|r{||<+++LNNb뿔{Mgggu떠OHHڵk|;!116^/_cl0HIIaxxp8LAAGbb"Ōa0زe ccc,//SPP^'++.vNZdIOOGVT*EPYY H{ BRVV{(=PLch4FFFHOOr JbIIIP(Drr2%%%twwSPP޽{gjjP(đ#G((( 3>>ÇY~=)))twwS]]M]]yyy h8|0,//377Ǒ#G(**BÎ;̿9x 7n@"ܶBdX,jjjؼy3 FEET*'''GΦ4Ejj*lݺUhr騩A*Y\\$992l +++e ===ܹ2'V$0TTT6l 11VKJJ }vZx /_ZL&#//OsbƍlٲHJJDZZ%0 '1189pl6~w~GV]]ͭ[֌L0駟H$(Dgg'lݺ\=~i ہ:dbhhhͻJ%GŜ71qv4G|ee+/zxϽ1_XX@V ھ-,,,h>UDlX,L&~>a8$$ bXHKK{hV`ŻI0|sss ʕ+\.JJJeF޽{"1 ~4<JRԄ~p'(|{YKF[^^FPƽ󞻬yWI2?i,H׍Xc RIMM dee}}eC_V\b|"6l`0fۧ@ D"!!! Xh4J\\m# =$MZ~ct|d|ݝEv;_i`sic>1So3;&X~\4b>_Fq\)  wWW(7;~g!v("""""""""lR>=Rr3MǃMz. (<+gKDDDDDQAFq7LLNNr-n7IIIHR0BYn޼L&`0OGGioogll G||7nH$LLLp-F#p;N{h(vcZ6u`uwݎL].}%j|餥^ҧ2BLMMOOOn'<(W\aaaAN bbbbͻcyy!JgqCFh4΄p`ZYYY˔-b0a\h'&&|~477399Inn# ?WS΃DqDƥKP*^Off&O(ʕ+ꫯ |q8XV1lذ!8w[lAP{{{OӬ566ٳgIIIA.r ++Wi&MZZڵk_pk )hmmnsI!@CC'O6Fx vڅL&?9DE4MMMƹs裏8|0HN^yJJJ{B!tHRR) 033AP0>>쬐yvv/~A~~> 1==hL'_VV+W^E.ᅬ\.TVVbXZlڴ~M[[* kB >>^0_~t333B1fggh4hZnܸJvv6_+G3gv355eqqAd2nzzzlz 񌏏c6 zt޵n'`X#)) AWWNDl6v_NNNPՇ=4;;K(rZQ(oPPP h4Fq8j$ ZN__qqq|eff\(JT* >\6~QTp%.]jebbjp_''' `0c~~^/DF>, ~!UUUw¼ܺu<ӧ)(( 0==-륻%Bin޼ɖ-[a||NRdff^d2CCC\.VDBGG.n[nad2Þ:""""""Xp2zzz0 h00L7nR\222ϧ z^+zFFUUUl6ټynT*)..7nNEE k.  ZZZعs'ׯZ199I{{;jRT*őJAAdggƍ1a^|E|> ,YnB^6ҰlQWWGee%ccca6oLFF]]]ݻRɺucݺuD"?墩\}}}~Μ9&???h4!7nP]]͛7ˆ/$Ej=7j%##C^TT&SWWɓ'O,LOO3<<^'99Я]kFjj*W\`0ww377$\zUؤt:zzz(//'==]пV ]]]SQQkX,|2ż kN">>7&/|HRJJJ?DP;Dhjj"11`0(MMMd2iiiq //o&ĉ8N^}Uv;,..rqj5J+WRnYZZb``DSSHR|2yyyDQZZZPT\vl9s P&֭[G?f& կ~E xٳgv?f֭(Jl6F*++룩 Ǐ j\\nӧOc0HJJ BAss3FQRR,f/RXXH?n7oř3g6466 0ʹ200;lLNNp)ucǎP(P8NEV >b9©Sذa÷>nȗɃhGD8uj={GzFzH$d2p'իx(++ ??+Hhmme||~ `'N!Vĉ^9#y%\.KF =JUU֭ѣ,..sM6sa4 BdeeOp\nHLL*ZZZpDQ O"p9$ =KKKiw,YlCuVسgǏH$㡨>@B(F)//'$ ))P(L&c˖-:t9 eeelڴ&Nee%t:Gqq1LLL;;詩aD"V+>jv!(ϝ;'X-Ĭ ]***p:kM"Emm-n|>fn7o6;wPXSRRx'ʢ̳>˞={zGQnݺŦM~4dff}j('N`0sNp8,Bȣ'_uΞ=Kyy9>tj5LNN… ,..lfffdZ-sss jW__ /@ii@+477SZZgeeafggfff_+:nSXXcjjl6f9j5>YZZ"77OWWlܸe, zh4mުXVΜ9oAUUznttTZaeddD0Fd?BD"6pL~:vD\.G&Ғy8Nf3EEE$&&RYYɓO>țF{|TTTq8nt TTT¶mۨ!255F6p{3r~:˴xvq_z=(455 bg\T*%T*LLLj5LOO#HP(XV(((@RP(띁<+WZDBKKXyT*ġH$.]F!==/ux|I^l^sbnܸAii)@Ijj*RtpVb(++駟v!8"~amۂcL&wnKŁ,b̅ \c~SSS_dJKK9|0jZh& ^fyÕ`0˗h4f:@ V'ʕ+LMM -ɄPTzZ[[*:t:͛B_:tBkkp}ii)nҥK 1#}MSRRDRt:IHH`lܸ"jkk w捻!FFFN~?7oFV uCQXX HRA+iX=11VeiiIhZ\.rCnn d2ٺu+7n$??::;; <3t:V+jAvv6NZMMM A9FU8(//'77Xy4 FNz=HFHRtkjrrrh4D||<III!33$^/**JKKH$vكjdz.VONNT*Y^^F׳i&<"77W70==[ne۶mdggXXX੧"55mj"Kwii [=Mưl(JCQQ#"..d233IKK#!!ZMyy9P%h4 pEEEdeeR~z*++)--ell K~~>III䐔Dzz: b222`ff5o\Nbb"h4rrrPդSTTn'55*@ףT*Q*D6oLnn.jA.OYY`Ů]X,A]XX ##TB@299I~~>YYYL&T*8VLF ә //ra˖-ϵF[<QvXXX 55o/ϣz8fnn^[[j>:pz{{q8P0RN*B!|>skD"r+H7+H.8pp8dҌUd"S$|Hr ;v  }iJ ?krssILL$!!(bcc BozLHH`޽BdJS"$ IIIDEEh0 y,""""""M?>AlbZk|>>7BJ8NJS;"Te ?m]g! a/J0. !FE^ϒA_^gq_Ṱȋ!)aڃrboƧ q2B#/CA$]xgi#De`#UED>1YDDDDDDDDD* *FLF P(D\\ܿDN0==lf||zq:X,$ ݬU> Oy__͸\.Y]]ӉdbccߏF!66ZZZjzK(T;::Jt:-`.QըjZZZb ˙'&&2==YZZ"11σ"%%O{{;Bhd"%>QINN~`rrrS^fWq_`4 ôӃFA"p=kD >@R bbb^X*>{,111ONdݻ͛7y7q\tvvvvEEEʬrbaaGWWHRa#qQQQ 099I( s)))8:@oootr=Q@ii)Z۷oc\x={pR)---d2gϞ%!!Me^t$r%Y\\duu:::6󴴴ahhVĄ L&#))饜 dgg ~:p;w̕+Wعsb۹}6MMM?~|Q  B!!7<{\v-[0<<㡴ʋ<b;^#066F `mmf8 |F1??/Z ))&x޽cU튋)..… >`HRz-^/~, o/_&Lrr29|0qFFFb݄aj5r~Z-|f,@An߾gbbTx뭷hjj"#ˉ& PTB[͆!>>7xAco~ZZZ@ ~# "::@?YYYLOOB]]III/}YYYarr222c5?紴W_}P( @(J( Z-]v [nEӽ5+**c߾}8.^ȿk׮jd׮]Be~_M}}=7hjj ~~ ^yMd"0={аir9 @ i,f{S@ ۷g8F!==^/x^Eo/~: =zk׮bbb-xr" ̿7%jjjeݻ8'cffo}[9˥K`Ϟ=?|;!66v0/^DP8ٟǏŋʙ3g8y$)))#oZ |bj܈u=VWWtRWWfTܹY8pׯ_')) NGff&&MUBVV?~d*++7333aa-uuu}*фB!N:KKKalŸɟ멯>rebbAaaYZZbiie666-//SSSC{{;SSS|>~&ܟEDDDDDDDD8|lhfB׳}vgdffbZرcdgg399 ߿_[\\Jh4RTTDAA;wBA_YYAV Tfbl6t: 'Hl6-䊫T*|>LMM!Jh4$%%k.e޽d2J|_Grj\.x,׎d144dB&a6zhZ666HIIAV "..$X,t:t:X,n݊fyy5N:ERRfD  &&]vZtr+++X,2eT]v YYYԩSx8pbJ8N~M"qBhdmm Ʉn`0t:7 ~<(۷FCSSַHHH`xxp8̩S6y_#d2h4~mt:jRSSX,,,,֘"xRl6Fzz:999dggcXHLLjP(8&(RSSH$HR(**~/IAZ__ԩSdff&ܷ?ג"""""""""ϳKv)xزesmX7Aܼy%rss׾a6_:@/vIurQVV[{/#:(0RN۔"q`\y% ~L+|OvDž|=ןG4 xjG=zF#?ξ}-F@ s"""""""""C">wgUO{^|V}Q~OkF,_t?qσp8V$iy1օ !ayPY|#"""""""""UcUJFL&r9@:B Q[[ hܻwI.񔗗ֆx?>==MMM OQ3W*tttЀb`۩bmm$שFC\\ד |v\ܽ{<eeetvv cDss3p =>|Hss3jFC}}=}}}$''#ʝf&&&D|>#222Ty*ձd" H[[jLFee%mmm `2X__eA.&aN'111/,q O]]Zqbcc?q}}x^Q*:*pv ݻ h4J%---ϛoɞ={P( wn<ќXo^'lj'' [oEqq1J Q^^ΥKCgiinj@ @(3::ʥKJT*y&mmmLLLpܹԟW^y'OD"0R.66]vCqq1ݻ{1;;(/`EEG.xx"6ׯįkrqUv>;wp8h4lꮯse˿K۹u \|EVjY]]gccׯs,~~,oo`0};w"q\LMMo|W^y'>K.a69r׮]ceeqg0??޽{bgg.eee,,,L(bbbF?dddE{{;v]Pz*8q)$ |>߿_z*BJ=***/w˖-ގB 337n`9r;v`ttMb j^P^^N^^fP(Dtt4M"fL&_ii)IIIhZvM~~> JlOgg'kkkd2NjυH86_ξ}fffK.o}KH|e[c"""""""""χO4QUU^gqq"233Y[[c}}LN'ϟgmmThlln uuu޽Jߧ Vjol6L ->$..--- 300(?zutt̡Cg}} ߧ^?d2N'<`zz0>>N{{;p8Lkk+cccvqLŋ\x^686;HRNJd2R)r|~(";;n߾f>ɷ 33p8Jbuu>oNBB9rϑ(--h4D(BR& 188e֭#3==D9޽{q:466QD"auuUd}}*D"!??eؿ?%%%j1FZ[[7H^Br\NKKPs3 sqh4"ؾ};:{ QXX(gϞERVihh`xx~_իձcǎF<f@ ``˖-PXXݻIMM%--U?Nzz:KKKvOqq1pZ͎;"0;;Bʪ=v1 d24^O\l׋b _ dffK||<111k!!!$nJaa![la( fffk_T`  D("&&m۶ 7xRh4rsscqq<<66Z-qqq̐ATTfB` JhHHHd2Nrr2AVWWq8 ߓJűg yN*L|m۶F!oj4a|>N@id>;L&}0׹D"Btn&>RO z)*r6,~Tcyy?""""""""OǪ'&&ݻwYXXbP(TVV twwSYYI0l6S[[˝;w#%%hiin(ofyyR&q***h4~*숚RÇ԰BRR+++`IMMemm*Z[[QTt:ڄrZuJKKn^Jkk+PNG]] f^Qn߽{Q( PYYV*++b}6hhh^P)JB?J!0cccBamm'^VWqΝ;aXܽ{fT*2jb)//gaa$$ ---TWW1L#I?~_t <>77Gee%8N\z^B&IX?un4h4tvvRUU^Çܻw5,x"~bRhkkݻA⨩DGG>GP__OCCHuJ\t<#`2qMMMXV"11#ƨ2&jkk6***X,Q666C||Y^^IMd4r jr!""""""|yOGiQ[[ @kk+.,,,pipܽ{LFVV*_TTT:zI.\L ))r>|D"aeereZTV~  _LOO355Ess3YYYf<`įkv4<^SSNC.  Bp8p\|t:ill.JJJ<ߒ~?p{>J~:333T*PVVFcc#67oB{{;oY]]ݻf}}BSS`߿~_bP]]GV"W^%..-Bii)LLLI8fbbAZ[[|2O|wttk׮ڊTUUQ]]y`qq[nq=^/TVVy`TWW3;;KEE ҒyIBBKKK={IΞ=KllHׯ-|wllyf3555|>/+Z~X\\dnn*ܹ#Թ?)&d>f˗A"FAA---,..vEƸv&Lii){100*ϟz9}4*.jkkill|a uuuLLL|rJ%|p3gΰNOOo~SSS;w8Ξ="&EDDDDDD|~!Ott4jEzzz8r QzcccXV&&&w+++f V%T*IJJ`0g3 /ܼyիW痢{ֆ|j!`qq/T*IHHh4ruY^^ٳ/}8tѨT*.qqqhZ H$ڵ yyyT*Z[[gvv~^>߹s B\~En޼IGGΝ۴6#_J$hmmx<z{{ijj"..ɄB?9n[L~: QCH$>Lkk+d2$ )d2rĉz4 t:阚ȑ#ܹZIldjjXr9&yݻ2<`zzAPTF:::P*h4VWW  pmƘ#H &&LF("**ӧO$lXzqcccl6(J">>^?<<+k\.<_Bzzzz⺔d޽fزe o&nͶn)x 9BOOQ$&&o8III~BEDDDDDDh{<Ο?Ozz:^#㥬 2 B^$ 999RRR_099 Bηg̙3ر]v^7&ZL0ҥKn&&&#%%??)++cuu9Ο?7M5e2Ǐ7ޠ\DRR,.. H)?F[lazzz0;vB9r.K(6>>ζmxW1 B!ٷon"::dRRRaeeǃT*}齦^/b6yWAR"9x qqq|ߤ>as.;w$!!B999\zѣGٷoBhuYFFFlDEEz1߿ l6F\n#J İ~VK7&/P(Drr2[nLOd2Fv$Rgvv"nѽU.ٳg9pwe2pOO DO}}=l63??O\\ǎA._SSS 066F("##066*uuujd+$$$033C  ==]0\- T*!(_nV+ ,..xW͝;wpy?z|]ME>ǟ@@H)x2`0(;y!^"""""""'?OFT233پ};@`0HNN_WFCC,-- ݻL֭[D%%% ..c!0Z[[H$,,,N}}=tww344~r9KKKx<顩EN:EJJ<55%nZ,<7v;. A}}=+ HZZ ^/ B( 9wW\A2==qnbll|p8,ԁJMp788!==]P_]]bHIIa߾} Oyy9*iJR`( Vd"11Grv;f7vʄ0s۷Y\\ݻOl||>RRRX[[ӊ ӉFѠKMMe˖-hZvIZZڦ $x=mkkcmm{he֭Jl&2~'N`yyYfggGGXVjjj߽{$$$011AFF._W\.kz{{ ÛX__g}}˙$99}۷ILLdccWr-P8nݺE}}=;v,xB0n300@ZZp=llláCͥF B0f#j;sNܹõk(,,dccB ?TRpcǎ111Amm-))),--_R(-ﳺ۷QDDDDDDDDX8шL&#-- \h$''lBqq1V,~?Ǐ^/bB!)**BPj6ąaRRRPhZApix\,M.T*b q:Nl6P*XVVWW1LX,, yyy}vvATT |M4 ZV8jE.֭[BkP(XXX //x(,,d}}m۶ iiiBhVnSPP@LL ɂk&GRZf )))$$$Lzz:iii p:8|Mt$%%R߿tL&ph$%%}ҋq8T*(zoNll,p_]*,,6666p9r, :Bo!:NXm0t:R) Tϼ|>VWWپ};HR:;;M||<+++DGGsIZ-Pp8Ltt4B_RSS 11NGrrt:6RRRHKKjϛEbbbHKKd2emFVVǓ.xGF!&&l233 LTTd2a唯Brgv-R): śoIZZYYYhZ9t)))RTTĎ;$11ˉ'(,,j"Jh \Njj*YYYu'JItt48q*[lA*P(rÇ 66FovSPP 2VDL&Ӥ mٌB_G&1==ۅ\0߿1HJJ &&F^{ DOO"""""""_]E$Nbۅ=D2-[<VuЗuЗnڵkP\\ѣG_t?3W9AAElOΟ?\.w~w6occ7n&>۷H `iiiS/:pX, cCycDҽDDDDDDDD&'''q8(JA,rYK"!_%"H$O5v ~F]P|nnp 3^D('jއaN8!*/ܿ a]|H$|O@ԁ"ϳχ t'eTwߏ^!p_"O   s"""""""""IIITTTP^^iiir lh4\Bcc#===dffI}xx[nObbG̕J% TTTHJJ 6˗/Dff&+++J%F&nݺ`TWWWt& ř3ghnn& 騪׻&㡪:BRfffHNNfppRFGGZ~nܸAww7~jjjf}}ՊL&ۤ^q311!{v;;/U(//(++(J W^\͛7!%%DBCCaAtBWq<}Ν;h$bzy>Uܟb`6f޽+C0eee455144D\\X,ffftz<jkkMll, villtP(l6 L&pܱ1Ν;Ggg'p@ k׮*\occcjIKKcmmF}6tttihhN'P(d2 503`0CJKKBףRw+++,,,`6|֢XYY֭[̹s稫ÇLLLƍ7hmmn _v*Q`Xƕ+WHJJBzݻLk1rrrG+W{>5==י$%%.\F``pp7o@JJ MMM655K.mgF2v;IIIBYHY۹~:gqq\t(--evv4ZZZ~:IIIR^^D;>Loo/$$$ЀV666(--Ĝa߿OEEQ_lllpM:;;JZ`0͛7q8{"99DBEE {ۗA\RDDDeYT?@&11:|>99933^ VVVhnnf۶m\zc0P(TTTw^~_uVzzzp:l6JJJ9hz %***chddp=& fwtb0F#?O"%%EEE333XV:::hmmtb2_vlقfh4ڊf?!RJ?A$ ]]]hZ0_:ҏÇDGGz{.ønq:=v#o}[ w念:|M&{o~ 555 Hjj*)))B;>GV366ƻˮ]cկٳ@ 7qN>\.B:;;IKK˜:u)--W_enn3gw_׉ڵkkb2Il6w `0|@QQ3<|XD8P__VٷoaHLLÁdb֭ڵ RV%&&{ 5 tww#JlA.\什JJ%7n```6jjjBVsY&&&q:\th, iii\vq!eYݽ{7;v@Tdb}}]x9jdffrعs'ۍlF"Icc#sss.(Lܽ{, rfgg)))app+W_V۷innʕ+( &&&x!L4 ?ϑJtuuq]ʘ" R)FtVVV#SQQl6 NW\!>>/̃˿K&&&#Q:_twwSZZJJJ %%%RWWǹs焟R`"3R RjGll,v.Q(|d28mdRkk+)))?~_x)**zj}KKKZF* l077T*7T*`7墯^/suooJ$ ,--a4 1::NDP(s}o<ڴЀBjgdd\.gjjNgtt\㡵׿u҄Ƚu||\s( F#׮]/b0p8n._F"0eeep8x_}i***1pccco>N8<>JJ0͜8qxx<W^\^^'OD"tvv233+۷s1666@q L&/v)""""!>@̙3s_.x人zA0`\w](JF. [9p 7skkk>}{cɗӎjjj u3`+W`ʟٟܽ{U&''t;d^J%'Nk_UUU~E4yg֭zfff\xNɓ'DF /""//|ۇ#ɘTIOOgǎBHj61 #664Vvs99z(hZn݊`}}Ç9x Zߡ!`޽|{ߣ<2޽{ILLݻx<r .Grz{{LNND\\ :k.Ұt:P( aوBPKqq1FqӘzVI?T*t:,,,0;;f#>>VKzz:> _Gzbb|=emm bqqxFHQ՘L&Q*x<aq$%%a6BxCCCϳ`  6]* Lf3Fv-EڧR6E66d2~@ L&CT=5 e7J~?rR)|>R/\WOL}w7d||W_}Y***:{=\.ܽ{eٷo hmmb|l^[׿`\0?h4233CLL wޥVZ-ݻ#11!:;;Y__';;o}[l6h4LNN2x<~`0gmmvV+ǎcS^`uu{!l3g())~!=={188Ƚ{(**'''9uԦ~K$rPNG^dVVV4zވ~FSSohZ 6 T*xϤR)kVhW_vSRR7HNN&&&FxyH$hhhȑ#Q\\LWWyyy~t:$$$066&ɟ w" `P Ƽ|l.//O0>T*% a6}a4|w^ywEDDDD^$v]p H$x<ݍf ''$/8!/2o)f3kkkHRbccYXX ::GBBmmmLOOIjj*.!{Gvv6&UZOOKKKdee ykkkdeea2XYYv }bbbRSSX. aX,x^!'{vvdfff0L,-- 5~͆lfaaZ-yyy?jKvv6BL&n3<>N\\zORRcccX'q^v"b! 122 rNbbbajj @8fuuR|jOIIrᗗX,dee1772^|A bL[,fgg9n399R$!!fYQAs%33Ȉ|\^^6fgg'33s`ng||\L&CbIIIaqqZRdyyd&&&h46 }}}x<!j+ b0 --&''&115tdgg#PXXJbllLЧtl6X,xmT0vZxY""""_&&''ȇq8ɦh3зl\1п޷gA_]]իvD ϋn6_hx"jԾ nܸ!ю;>6Bss3(~>M 0_ן{<ׯ_geem۶qСoGpǮ]>pڈN<)DG-""""""|$336xHHHx]D"Gvۿ H$v;* J~>{rB,BA8f}d"Q{~HGGr!hJ+iAVWW?rN0pl|^}P(^H~I]y|M9bN D^}>sm~?E /8EU%o!yz C?qe' ~D>"xvzzzx! tuuظIK"fmm477SXXիW Bx2Xmmm ommmA޽\.'==;wbx!D=<z=. FCTT%%%/z:DDDDDDDD0|ӧپ};{֭[LLLCkk+>G0T*wDV0rcǎXZZz>+WP(~˜>}W^y[Džxe@ יl6/~zVWWڵk>FQ(V9q_שT#mXYYavvÇc6rYV+a¤R?chmmP(db䐗Ν;|d2 dggsNz=p4 %P*zz=㬬0B?_V9}4yyy:t feeÁ륥wZ[[">>Jž}Gkk+v}|ϓDqq1B!V0$ >ױdlݺՊfcdee Te|HuD_RjE.?!'Jq:LLLo% SSSa:Գk.!/9''!Hnn.[<ș3g!!!$ƄklrrDB~~>iiit:Kۍn\aGJJ 333zmۆbpjX,( FFFXZZ"..Xrrr &&tZ-VUFN:EGG QYYɶmۘdii ->>$IMMJLL vb۶mlll|eEDDDDDDD>-h'?ex7x7<-[ H'33r>!D߿DB||l6r9QQQH$fJ%ZAcc#r>1e?9555288h2::J"**q rF#Ǐ,,,pE222j" Y^^͛pM}6Ӵ U2Lbnܸkph4JKKyb‚QQQE.#ɄǏcn7lFVVTTTrP*S__/x}cbbB o0F\\UYY(& RT*64f3 ˖-[pW^*lg?cdd;vxz7LܿE?T*Eד̍7w\.;wX\\fD<,--uVR)hZrP^^Nnn.={M.#킵!HX^^PXXa1L#0LF||<6 1c0L$''h4%5.--aZH54Bwc4,//Vu0999DEEG(`0@FCnn.sss,,, Hrv#L `ddTJvv6R^/ \Q2<<#''\N__jq:jIOOgzzZxYZF||666E h4j5 N'hl6jOll,LMMۍl011!|/HOOgjj Arr' (VWW2kìIMMd21:: -- ^/xu#}cvvłj% 111 ++0sssfR)P(X,,//c0XYY!>>K0h4~fl6f3/䍏fccE!]R M<Jl$''*FP2>Z-x𗗗ILLD..l0N #11ӉT*`0%VVVayyT*1""""""""䤠a|y-[k7"Wz@:諫\v5<ݻ_t?37?/>l7ПIܹC*r)^HQBW~\.H?x< n;Voo d_x<qLEDDDDDDDDH$x@ DDDDDDDDDxTi"G>-tz/)_JjYFd,"{ڍA @ӽ讼 _jn#[DDDDDDD7D_\@ @bb"555\~ARSSQո\.}0VwrUN'\t7n088HVV;wJfgg͛TTTJ=#` ͅ hkkh4~W˅B@PPQQ͛7 ##E})((`iiK.QSSC8&))Μ9d E}]p:'?Çz=7n۬.xU׹~:DGGåK(väͥK!)) ӧy;wD*288ȅ #33M8fffj>x...@ffB HPTsUIIIqjkkGuϞ=KUUw%33 .^H$(++# <숉4&e$ jRRRlLOO82LP_8N'UUUJҧ p\2::;CSSuQTWW300@aa3wrrvkO-d788㡷TFMKK gqEDDDDDDD^nBiy^d2jzA~~>0gq}cc\Y]]p000#G|2 }կ~ɓ'biiEٷoiiif$66Oyy9wnrMfggH$ىJ$q:6<<(&*l6pNt P(DGGwޥ^OCCd2? BDGG ]vsUz{{YYY!%%入 |s1{{{Baa!k׮,iiitwwSZZJww7:[v)++ZW\a``d(M||,//S__OBBmmmd2n7III QRR$p}&&&/†ɳfe 9effcǎ!˙F׳cyΝ;111DGG̱cǐJB!>qތ p\?`H$jd2f3 BYzm۶vX,h4X,eKK r;vXVܹCII *"҂ᠩ(,,* ͛7Y\\$99,x`дDOOw%lZctvvR\\z!ݻwsubbb8v` f|||&&&& ЀJ"77CaiooG" Jblln'66ՊdҥKd2rrr8tKKKQVVٜ?q:::صkciiE. D(7nܠ߿Oqq1---tuuq5P*|>we||SNj9wfaOOdggSRRhd˖-l߾3gz \pN˗Oh$55۷<_EVVP*ꨨ '##x())ȑ# bX^^~S """"""" tӧٷovVx^~?(o@ @{{;P\\Ν;illDR}dN… hZzggΜĉN=vp{'BP%%%LLLÇ1ɟ winnfmm^JJJG#.66Ǐ` o))) r8}4YYY9r`'JP`X`wQQiJmTUH#ஸbNwN:93g̙y3__͛L'NhpEQԈ ʎ( /Q;_P4ƎNVխ{wW=}wαX Dyy9QZZJ8&#J&++bbdeeW\f1::\.Gףt]vl2֭[G{{;+LMMt: 6jyerrTt:֭wޡSgzzBii)b1"hP(D4%3jd2r(..fѢEBC4g hZRSSxR)ܾ}!p%HMMV ϧ,yyy!Oz<6-ZĦMX|9  tLNN/SXVrrrHLLPRRB~~>d2T*$&&2<<@*#,z<h4$'' "27xH$j8NFFF裒d2rVhj)..bP((**bҥh4<ϓ~Ih\ry7~@^^YYY,[ Rɻ @~~>uuudbb%K7nD* x^,!?|0ppGjX4wrml6uuuttt!ɿoz\|Y'O222 /jepp;vPYYIii)`fjjl6Om۶Ç|]]BNbF# _Ύ;ݻws! 'Z@ZZ /YVYx1>,fhii>_FA4R^^"jJ%444 Q(|9sF*"""""""8ڐH$LOOXd jU˅T*%11訐o>22h4b6bLMMRB#z\5:55 FBr4jF^X,Fvv6 (III FFFèT*rrrn`ZnrȇJXV$ Ar9999x^T*!B` IHH 77ZL&&&'<99۷o Q`0`XhPl6|H$j5. 0;;hdvvR)&&&%33qn7Tl{ CCC8Nb餦2<Oc< (DzG_tB!_Cwll{=ep8lG~\h1~>7_߅59}vzܗ"""""""_/!H|aL&'OtuuaZP;b)((z{{)((`rrO? .%9|0`$ PHHommeϞ=\r}>Pȑ#pM򘜜gppK211={hhhTO<_f3iii.V~qU(FP__4Bd>}VNcS^^NBBNܸqJ{{;L0;v젱u133î]8~8G!''yLNN~)1Μ9CaaDr ʝ>}*:;;"駟rBZ]vgQ__OAAnbϞ=tww @MM D"V+1Wǎ`Xjh4G=p7oR[[KEE3gΰjժ/u.`7n 9}4" (~!fk'E4=0z#NZZPa8vrn̾}z{r A}޽S[[Kzz:.O?f222t8qCrG"055{h48p'N 0TVVr1jjjX,b1{=VX^'saڰdgg?R:@܈|tiz{{)A\.}֬Y3ׯS[[˭[۷ٽ{7r233v466RUUE{{;V`0Ȯ]9`0o>?"77k׮?D233vGyy9Rί~+ˑH$|477b ^/w>p͛7O ''Y?hѢ/%F)""""""\.6Z0D& x<@,_\[RRBCCǎ###ZMUU?9z(?<6mDFFuuu jcc#o&UUUc0P"MMM_;aFY|9OF.STT-[DHMM%++={PQQ^ Dnn.pVXʕ+디IK.e޽ n:rrrj(JN:H$|G|ߥX,Fnn.qmV\,.]CVSPP@zzN-Jٿ?.\I;RD* %իW"))K8ĉ\x@ww7~!zRÇr ,6@Ôގns=ٲe eeep5***رc`llqΝ;dž =PBsEEEn~:;;d``pmt:Nbhh蠦>y󦰐P(XvpMUU.\@.ֆV \NOO>T.^Hjj*---ֆl~*Ozoo/UUU\t1hmm%''~222줶&b;v uuu aX~G__twwsDZZ"JQT,^)INNl߾CQ^^lڴ={zjd2W^E&QUUźu(,,jnz{{y׹pݼ޽[onn|XlPkZj0")LOO355 )ܹ# FTUU111!35{{{ a۹y&jjR)~Ν;deeqq.\ QQ ̑#G&--*Z[[XB-[ɓ'Qrn߾MJJ  :ĺuhnnFӡT*)++gwCMM +V 55b˒%KHKK(JJJJHIIL(zj9ƍd2~?׮]c֭B͢"'f<nbӦM%V&yD@`{QQ*Y abb-[ %55L&,_ή]y&999s1'## 7++ łngŏbR)D{199Ivv6Z,҄K.j)//jr)8RMJJ`B!!<ڵk:u RI~~'R0ݻ1V+V$n7$$$OBB f0룴<ݑH/㡧˗7oޤX,ƪU8<BHVVh41LQQQAuu5^WxЯt:~|222a߾}ܼy+V`2P*LMM199ɭ[o_ww7G-Hhmm͛lݺp8DԄn`0Ⱦ}X~=[lAPؼy3tttk.ѣ{`xx>֯_Omm-LOOF[[9r-[033Í7hoo`Æ RVVƕ+W룠[D8p\pv Dv;EEE YVKrr2 aZ/npp-aQohhH('VAuCoVVyyy R$Yz57n>s:\vWrU:;;P{W^^ƍzرdhhhޱN>Mcc#eeeLLLp9Ξ=˗illdrr:n(gϞڵkL&VZ(_HOOgzzj8w\r%K VULKK#// a. L-8G߿_*..tb2HIId2.FFFFxgC4%V|jJKKq\fp,Yƞ]DDDDD qv͛)++7or% zh4^}U_4ikkcժU~A17Cee%fm۶=rܹÞ={xO\5h4g}FOO? g ÜKGG>E=p| ---d2(,,͛466b6ILLTal6v;f@ }رceee$%%R*++ƍ߿ݎD"TTTDyy9A6mX9<ٳgzǛo)|:P*( !$nǣ._diiiT*od֭B!/_8&|-Z|c444 ˉb,[͛7sA^z%6l؀"99(ׯ QYq\$&&b4x>,RL~o{zz:RafggQ(dff Dѐfcffh4JJJ zQ B9MOO nIbbATDtvv244Dgg'N8rE'''H$jz=6P(df 1t"H0 LLLvF$>4!w? }t:lFaXT1,0 nP($P(fbvCd2DC&a4rl. FC4<D$ RI,Be20X, vAPhpt:N'~_HQzX,BjX,-EpF")) ׋T*% axx'O3ϰzjaarvQ*z$ $''#˙@P`6qݨjFIJJR%ܯ`?o.Dc4H$d2 Nj,YByymXP*A|>蠩۷ ~jj ӉR$--KB@b(Jv8z~?2L+"gffh4d2fffBB4畏?׳drrr_kTHZb y!_B޽d2P(# !aوba0p8tym>}l2JKK%bcccaR)YYYH$P*fn߾MCC/."""""ܹsGYJ%)))h5&_ yfe5wOW㡾-[Uݿ5x.l_|dUOgsഹ6m6?u!HQC$иηGiݹ$Ωjb8NXH$~`٭G6}[/{Moxڸv73A~_qxv\.Bu-ۭT*U^8 x?)Y8F. d2񚈈 H1UBEkC~2?t7RXLȹ~!@kOEO8rEDDDDDDDDDr9@X,&D-Ǎ`0c*k?6w LI$$N|!> |.),tq>/ 'T*c~jmybܧKǯܱpo?lUW_E{ܹCRRv{Tݼy/z9|>~"y0yw' z-Z@P(_˹ HbT*RRRn3;;&D `jjL7@& 233OEDDDDDDQ( H$\엿H$dTUUֆjE133ŰZPUU$|rM O>rO8r+VV BpDee%/^$99BCq 󙘘,[1>S|r ?aX!\.կhnn&`4ٷoGellakzzݻwsZ-ڵZǎNV+ٳk׮A$?ԩS_H$¡C'??c~йݍIJJ>jw\炎ӟXnwᥗ^[j*hkk? 222(.]bƍ G(ewbÆ 58#GHIIattիWy!}Ǐgݺu`Xhjj"//K.a顶 ihh`pp^/^,z`ŧ~Jww7sqXV>3^x<aAd2KUUn"77an߾ccc( hjj⭷ vIKK 2ns999;wÇ388Hnn.Oȑ#LOOc69|0ǏP(صkׯ_͛066ƭ[w駟|ryyy;wlgbb*X,?~a)((l{zzؽ{7ͤEmm-AĴ\`s ":IIIF{{P 0@]]6 >}NGSSpˮ]'336: sEp\BI47222ŋLuu5%%%d2:::Xr""""""">00ٳgt 4?C$SRRq8lܸT8F\Ҙbڵ|>>cnܸAvv6 ެ ) 3$ yyyBM|T*B` ;;~ "xRΟ?``ɒ%BߒΝ;Gee%r\FGGIKKEc^}'ǦMXn0uVt:'N}AA˗/gʕH$~?D"}6W\!%%bd2R_~Aa||)^{5$'';Ƶk׸|2fhh;w kjjt 2r9Koo/vq-ZDAA:No?;;K[[W&!!R\\Lss3---dffl2^JKK W^d2QRRB[[曜;wVx饗g``I\zzz'77K pN0s5J%K.%!!h4ʳ>|bŊR]]M__h{'O +V\ɶmb0!0>EEEA._Ljj*EEE(JvW^۷z,^^zH$ɓ'پ};7n 11W_}gvN'I~~>l6F#6MH!HXb?xضmhQܹsO?{sFz|>n7Zg}bEKK G? aN;wó>ȝq-w]!\y.p:O*xaPF_ŋpz_G?ťK8s ?U4%55M6m6nܸA(ws?)((l6>cVZ%\sJp8RSSצX,h$??trrrrR)>yf۹x"^)$rzh4֮]Վ;wd͔L~~>?nxdT*~c:33Ț5kx7}6n{z$''Arr2X O$Q @౵3~}%bJłhJ>!!APx0BۑdTVV2==Mff& |>ߓO=DH$ rQq:8 (MZZfG?&xz+Dzz:PǃfٲehZv;"X,( L&4 ^+f< "C\dvvC,.&ݻw388Hzz:F~?(^/2l, pXX(Wjr^/,^g}gr(Z-,'$$}v',YӧOSRR|T*QBٌ^G.GnngT*^/ӉjzhZ7Dիy,TaJNo GEղj*:;;^+ܹs366FII hp-jjjx0?~'ORQQٳgHFfq9t:jnܸACCfO>RyWiiiqV+oF*|r8y$. B|F'NkLVV:G͛7ń:t}{,^Ǐxظq#UUU\zTJbb" ?w玲 \Nbb"eeepqؼq066( ~G}իIJJwC-_^/G&-[$`M6=vZV.\S0 jJ%|>xy+ d"## !ŧD4 zCb0(,,\NZZ{ΪUؾ};8N crrFVe͚5 D)))deeo~ @*T*-[099``0& LFOO333hZV^M]]0 a@BByyydee z~1trA(..֭[LMMP$%%!HJ[~b>,6 BD"`4O{Ѩp8Vn#:~?U\$N*v(JZ->FGRb_{'c2!!RI   ^OR <~_jжb"G<]3008$%%Rp\ܐH(t 9-bjjY =333F!*"~kZd2l6d2z0 $&& A|h4|>JrH$"x}>*h4D. xzt:0~}iِH$F!=!!3<33#. DRDPp8y9 T* ÄB!b8N:׋D"A. s*?8 2iT*X,Jw~N__+W$t:~v""""""D";Nj5 bx-| VIII@Tyq[ߏl6S${Q}nK=*_V~ w??>̶拾B}2z9=Wq].me>:Ecak1&-8wxvz .022" ͩ3o 9˴~߱ϝBneڲw#^<++X"011\.(q$}`B̺JF `EG!#""""""""EV +V u\R\@{)Ёz{{ٱc/"EEEJ/"""yZDDDDDDD17lrQYYI(bHy }w!kshth<<%EDDDDDDD)h4fbbB((6z$eA"""""O.""""""" |;y!2͛7D"\."""t"""""""""_ht,˼|z,^ t#0' zq8ODDDDDC(EDDDDDDD#qxj|ZG$! #/y{7ʬ uEDDDDDDDDDDDDDDzZ=5eEDDDDDDDDDDDDDD %vCLJIh<wwjI%tEXtdate:create2019-01-17T16:13:56-05:00Kx%tEXtdate:modify2019-01-17T16:13:56-05:00dIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-list-graph-follow.png000066400000000000000000007623331477354127100310140ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME4IDATxw}{rٝ9dH"0H&%KVϺlwgmI'KHYm$Ia&cvfwA@ޯגvWWK۶!   c QUbgbAAAL&0tIعygttM{+ ,oWTAAAd2RI4{Z79=C s[5H{s\<   "d~wϵ]$$tP]'cs+27Dn!Hk-6Ȳ{]YAAx'dYAT4 dY{\Qސ$IȲhd2rt鳍s92+'M餹TUAA dP=UUCxOxM@ @:Ze QUd2`De~ѐFg6 KL,ntHDӨ.  adTz{OS\\`zN'7$5a4̙3ȲL{{d'NaF =2-:1$ N<ņ Wb04 MӐ$IY|>łf[t¡iڂs$IFT?頥\ۯiKqT*Mgg'˖-jsAᒤi¦J$(PI(((@׿'LӄB!,Y((ɓ'I&EAt:H^O&cܴ:E,cZ9o{+A*0w]A.Uxo;\WW03㡲$ (r>xTUUc0RSS ?vH$·mf(?RZZn?&j8`V\EEXVTUeGe韾ŪU+H$J*l6xX,TUU( cA c Kx<_z*k@djkk8q$wy'J{{;?[^/Q̂ $e/0)%{:'H$X2('Ot ]$X '1 d2i2݂9***)Z9}gѴ:UU'Ȋ|^k)4ATU# oS֭[311ɏ~CL&3&;KII 6mb۶XLMM%jkkOl6cZ[|gK& W_M}}='N`zz;ؾeoppwtI<~ z_-{/KvEWWcc;v~&''󁩪jlVos|瓟$\.w *p{vZdYosqΜ9C4__)**$NH$8N*inn[>͛կ~{ 믿N:7}<3,Yh4ǹ5ȲĩS__'2Y8v~p8$)F. \r4M%]P}}},_ϛٖH$8;@=f2$T*,KM+It1&&(++.&ݝ_8D<l 333xbGt!L +2~Ig0 ¥*7$W'V^p~:\.z2rb0d2TWWa(((`uNՈD"۷ݎa'N!IE!sN"(R)2 \NR,[xLaaB&'']^cŊFEEtm۶QPpiuu:<uuTUU#2˗/'xT*Ŋ+4zqTUe4f DQQ&m ' O36 U055I4l6a2doH'L+t|>NBU3baId2 zL&F1,3FaQDioԩSLOO| l6h$*_NR ̹]fMAx_(**bӦM\ufVZŒ%KHFuut ,] 6VZIEELZ=BaWZ[[qXbL&V\嗯Fjkkk8QZZf`x`ݺTW`2KPTTDYY)f5kV~lܸB4c\~:˗/`0P\\’%TT6l`͚5a6imm+`ŊTWWa2)--e۶k'Ϡ L&:Y.Xo='2TQFGGb`0 $H$FQdn94i246qYL+9zXhi=@8NA~t:]~tsNk$3 E,]^YQLc׸i:t:(s#2tItUu^Kss3"(:T5O'i~_gfGͭdGeEQEEo:Aᒤ*'O$Hq\f[}jRE AAAD" uw   dؙxGt7`枃ޓg~-bew\GAAA>8t2t~DWߟl2po+8TUt:i((EEw`X9Rۑ˳iF^/h7LiF*ϧꛎΗH$m.7^̙3c?   o|_Ȳ̙3gHWW`A2dϞ=$ ( O>$?X,&l6^}U0 ^.dY.8q+V_`Ν_ss$H$£>??O__[&A133ã>ʕ+й:H,>(uuulݺrv{u<$q=P[[ʏ+FAAAx{tI8Na49qx<>vA&aʹ$ILMM~zlق,l߾$Ibbb'xL&Æ طo~KR]]o[ʸk)..>rr闗smUV( >gdضmoa``P(@QQ˖-oQ__ϋ/H?333tM]0$N{1,Y/p8xqݬY+ӧOciiiA_"dd2a4l>|P('?I+BOOwq===tww( SSSFIIɅ7,399=sǙ'8(d2zzzXf l۶]?&    \< 5M;`=說ň\..7](l޼O|-Z(Ȳ` HL&$ 6`X(++tii|K_sFUUI$l6Ngn,X,>t:yᇙzn fK$|ޢ(z=DL&C]]Ї_`vG?'?IJKKI&$ (K.>ADa4qq\AA}dV+6 ݎrq-* rvq\F\.cl2*++ߡw\oaZEQX,8N6l@ww7<]vR)zꅅL .L&ի B}466rUWa~ngٲe8uL}P JKK)))::&'' XV\.zt:SO=Ů]ظq.  >&7Dtt:d JWYtB!$6 x$ dYF?t:RT*E4FD0F2̛is "dӉ,˄nxՊl~[5b8]p8fΕ_hF<ϗ{<h4i84T}caUGAAAx/3@.q{B^\Z /fy=םwsٿ~o7s-K$Rdٲel6ѽ]AA}Nx<"{ʍ{͚   ;   OgZ/vAAAAAA    \D.      %@w3p.a~W   uID tK*[wP^^~!   ]0$)'WUso}lYT J}}=嗯i9?Ȳ(iί,˨hN\=Nk4,3 ;,2 XwAAAKtǃd2QVV^&IǏl6ظ(ЌFhj>/$I4fggqDrQPP@"`||rz=333b11 @ %%%$Id2t:$NS^^{iB!E8zRTUezzh4JII v׋AQl6SRRB:fllh4ᠼuADAAARo~9z('O$ xB$h4"I@p8l^ȑ#444 2SSS$<@X,eYF$$LE<رck166]w݅a͚5twwm6mmm<},] ͛׿5tӉG.py޽=zFqq1w=W]uPzGw^VX/K:D<ẃk.hsLT*E&AQ𮼪HӋ>    Ad2_P(DOO,K&cttΉ'PUYYl|rFFF LrWo>|>_>-//gɒ%oF#ԧ4dzze˖}^ZZZhoo{ [oR9s24LN墨'?IH+7ވgll+Vv۹;d2~X,??PUDyy9& G?Q~i`n|Q7m\Md2H6}&c4e2|AAAt0Hc~?^{-~\~ٳh4J,#Ji& zzza444K/aXH&9rx<Ά +Yv- eYF /PWWGss3n/7ߌh`0ȧi|IZ[[B!V\ɧ?i"{/t: \9Baa!UUU~ꩧXz5vm\{ٳ۷#IҢH$B0$_u]G&l6SUUf#D"B!2 EEETUUNI&ok[   >.Ipj PBG&ᦛnB4 X,TVVb4QN:(Y^~?555z***((( Yϊ/|=ϣ*1== 8B]]]$ uuuܹa~?K,a˖-\vev:&&&xg||#~)"tuur4 ͛A|I`>vB4ƨ;vPXX-B ^  ingyǏsWlٲ >~v/yn   'vrʅ,na00s-+ H$hll|C |evs-J&AAA wv |7>/^_s;yvEr1   ݻOc2Pp8|rщ]AA%kUg   B&      %@   p     \.8H{i5"!!2o{ UU/^.1W|_ |P 6Aq]4Bh4KFI:& J}u:v;zYĻ>ّeٌn'D޳w8ox{(zϗ*Yl6f[^B"Serfit:JJJ|Xp8|Q߬p8DQ(G4G~$Yfgg෧b}=AAxo3@$h4J:= 8>Mp(TUf]U$~?EQ(++{H$nw~9XD".PTTi̠o:,<?s\Sщld?ߙN9tSSS477ffff8r]vNÇxشiS>ztvvafffؿ?$zjjkk8vbŊv?qTUU?r\ven>߫pj*\.ٽ{7hɲe(,,/7Jcn:4 c  pa0>_.xx<꫌!?WPfiq{9袻7˝Y^puL&'o$I =O惘\wnك^?ou۽\Vj EU>U)\/6lUWQkEhp j E0h,2Ud5vG; WSb(Aͨ۾-Udt"}2drrMbݻ;vx_d24?0@6'L СC9rQ~O痟N^(fQRRBww7Z>X Bu]A4,ssرE&Jů~}Q:D$ȑ#tvvD|$?~z wu>/ѣGILOO3<ͶmH$riޕy; =07AygP:֭[t? dꢧ۷chhhvsI݋E4ZZZ=wv+d2fN|ij>l:kP+``vESV V|og^BCX 7VH$!JrC {f^ogNSUSYU={(0Pf,c"6-`XG> C4ظq####9z(F뮻t:Z[[4 I"ѣrعs'k׮]ԭ`0p 7w黺Xb7pOnOQlْO_UU*++)..f׮]\l6yeBcc#{!`߰MvZFbq&''bɖ-[e!FGGYt){% 阞F$kg^C'ID"6n>hd2Xr4MM6́룴#G PEQtF$X!z{{'>8  .x+tIwTc=n۝Ϟ~ᝰ ݭFA`H$r; >t3zwϒL&;|^(MEQ+شiH7_p(afggA8LYpRQi*wuCCC~~_㏟3w etRs c1‰0zMOEbc1iL`*4E&G/Lz{=قj; Le4,+J `V̬vFMng|lݺ믿 փɧ>Er=qF# ~zoe˖c+piR|X|V^VBAs<硇kp8mmm455z)((_"7ndjjm…uvi466p&@cc#$qp8L*"/-zT$HǑ$);,˼DQ ٹs'H$iD"t:H c_e<Ǐ' i@vJV^$Ih4rmaZŶAAxoz\'ȹ?{r-455!;W{>˗/7LQQ5z;y!>9dY`Fgw>_xG}H$ʕ+g>Caayq^ˑeSWWnOe |&H,Z8ŀ+kb4d288{ϳkls~?d3349(le> ڑ59j&\iiR{ ǽ zhy{Zؚ}V:6KW;vScDַfcժU`?!rK>Xl/Xn7]]] EEE/S\\kƪUX,E,cjjX,Ν;IR>}\W7%IbŊTWW/N)..?ޒ{X$ 8}4 $ ***p\4-?@^xw`9\uUȲd2ݽ袑gϞ=LMMNٰaECCuuu( $qQfgg 3::J4e]-QAo~2 0v >ם3ѥtttښd2fa0 V}r^hٹiV|8HɄj=KDUU֭ttsmFW=kdι I(,,([&`0P\\f{<$sC|W|el2_/˒̮]B4qDSQ|1zYO~?If3)8mrgGec&:'^@'8:u9=?󓊧Xe[84d"b555B!B\.L&S.zJKKvc2hlld,]v֬YC,cxx2nFXd YZ@nD"Aqq1mmmX,47|3N3gPRRbɿvL&)))pYj&t:(Lojz\~]Yݘs_(MD|YPYYr&`٨˅bh4RSSCuu5T|.B\.f9_ TD"AGGTU=yu]2|[@|\t)$IfggYd Nߏbo0J7H([nJs**++|,]łbaՔDO$06~T~ߞ  Y$IY^JR騩ys_0sVq0@$@ wٹz  JQRRrtUyU6LadY=}ll,˛NcӏƮje QQ_6w#7J6P_*7YA||zze~H$L<QU5_nm^-ž'gO\캻>-|GFFHR߁ͽf*ɕknq%7ܛf-AIϥp}n$1>>Nyy9H/p8,A!WFc sݍBNNҶZ"xA*z?Lb4 {ܝMEzKɡQ[T2]yDB!{b=t:2$Iœ1S]TGP(t ۗ sr> 8[9]T=;}^/KAAs8t E"wN$F#Nt:,T]g^p80 m@nDD"on?l٣\Aދ2X,$fc ,44qu6 Νh4J(wrbɿ_iA.$IB׋..  ,vުsu̥ZOeVIHidwwކ   _( t/iq1 PXAA~DBAAAAЭUAAA>[ z2$\   j`0,nQ.IHYq8SAAAAxI,HѸ(>gwݎgLUU$Iw?{w2"y] G?_:iZ}W\hsQӴE -_AފۍE{xB;Wyvwy~oDA>N\zvx.[i` +7.A$b& ;+|UUyꩧo˩Shlldjj>VX$?/Xz^|E~_P^^NII ?3uuuA_ÇN㥗^⡇bdd{ȟy~_Eee%p{wm۶K/b , > ]v===y|>:::z׿_& ٺu+ôMQ `pGyg}ZZZ8~8wy'xfzzzkdgy{*n7|ߥ ~q!EvO3<Ț5k0L8p{+WC>lb]vhllDQ&&&y(..jsϑJp|8a ٲe eee/ /2CCC$ hjjbttӧOٹs'===رO~ rСU N/OO8x }}}S[[ok\.'Xz5od2\EQx<@'H$\},Yڵkiiiᥗ^brr2:tj*QU:;;8y$<$I֮]nfIRt:V^M2$_bA.qz7O}ݻw3::Jcc#UUUoKO"2k֬!x<ܹ>8333ʵ^K{{;hi֭[_X*> `kRRR«ʾ}Xbf֯_Occ#/###<\wu(¶mPU;vӃn}nzP(eqQtYill$Ѐd*]tR[[ MMMv),,_uؽ{7N%K*eeek.z!DZl455QUUD>K.l6#k( .6n܈,l۶/bTUpPQQRVV)++#b6ijjQ di\.eee8NmMqq1eee l2E˕osW;::PUJxWغu+$aXÑσ餼<(TTT000=܃$ yz477i&xtK2D$I~ VNGUUL&%%%x^b$:g2d2x<t:EEE; T ˅b! a4IRgXh4J ʳ]dͣq~x~~ϫ  i<T Y)))!H仠;dY&++,,Rt:Z$I^/z" z&,f9ϻ˲L0$RTT%N\F㢷E"z=LO:η>`0Haah%@AAA?T ˺AAA tAAAA]AAA."@AAAKAAA tAAAA]AAA. BŵAAx(B&AUU۸;$mIoٳgg]AwF$^/w}7_)**m  dYfxx}{lٲ%' Z[[7q" <|󟧮bgGA>0;oo\AAA.tnX; ( . EQ.vVAErj{$ χ餰b`D"AIIΊ  |`i&'')++CvBT"VYg pI&LOOS^^~ >`0Haat\Ac:* yx/2Y}`0PUU{]   4Ί `D.  gA~D.      %@   p     \D.      %@   p     \D.   Lhg8`DLK֢Q1jѕ%3kxt ֳ>b" ,}g0F%WڶaqNCNf{ - ϶c BF0l0m*6ÔKj ]`N EML^O$Sj6d] {5 )c TZqG98{5ƸCǧ9cTYFIIO$ ǹFގE-as ig9`Ё1CM~!%XGlT&0S RC\ۋBŦ o12"2F7FYَ=CSNC覝K4NqS )VƩJA7^’539DO$Km&`6GHMV l7Di 0]MXǬ 5fhRKnzR!9 Qa4JLuOcYCo1od/ECX%4fxTdBcQ"W'(14:]cPif,e¯P-Wrc j(oj$́ "B)8;Kx 0[o"<3xkÔ1MeDZPbzJ$g]t^x:394FE') (f(Gm( =Xp3vN/ѡd`j, I*fL&YʙJ':UEv{[̸)hhT2`SfI4|b&f-HI37z SpNbʴiHfD.֧g/#icdR.%V+i;⫨"8;vS:uI.%)c4]%gActotE`KQLI$D?@:=ACLOt"#k~,g.2l8ঢqN9@R23nbAdʘVS) P`,^q'xg똰:1[Skbs@#MQfXљ jt5 /^ )B֋dlf[Pl Q5.ink- uez>ʢƨS[I׋Kx/L NQ3h.c2fWN!؉WudiF qو+aA'F#}43`]{ ix-)K&P `ǜ~Ӭҗi@h 2Р}vI!6:5ðZGqQABL XiPX:`bLYKS>zd.0adR:Mg PalGY'\<4OQ 9)Jhrf0 +]$T#Qs4W(3Z!Na[]=6l|FKQk&qT#v+*T'BږqXp&.zaL#Wp5EϚH$&ܘ*&c dv[JGQ:@ J;ɌV"ONm᙭ j_r7dd,2ʬ5&uL+ʶS6gH2BtDBDa)JRaN 3F0TԎfza K,CZ@ZpBkPIi%#-ϖ-d0 qftZrΥvj};#t?I쭫U R(ј`)zװh'րub/W a8f1 bqF  "qzHT kԖhچ-hce^;Qh^óil ,I@m1Jq:|*4U0cEb"IXsTb` Y:gt 9N0޽k4CTo }Qf?o+'( 5{f:5:fj}֑ E-Z͘&&%3f$< F(P|ETwLacbz z5ߥ,MSc3JY0T;R0!8ތa"Z]#YPK}(I(A?FHOcl9)MkGEbq_e~xƊ uarA85\ ql8md K{,0=<}FLkQO u2#HQ#e)/F}՚$ѓM0/D$ WPЅ XM><1<:)D :i؇7Q\2ìՂru']uxl_}4: bӁ_0et%|#<{*=v Q%ۿ"J' ~B·;:h8 ,7}iHp~>G;(Mxv^>M|?Qb lFD<_9zUKg> 7{f؟lwuMʃj#Uw4J9>_{oF=oZ;yo*yefFs۝_%O>A|7?r%?okknPv c\c{JUw݄kg_Tߥ'ek8yQSa,&e=s:ę:;e:8F/|{ [b`{)?%[{4˕([t8CIIsr*+>=q#YN~YzX8ix@Zgw Qr0|c+x:' XC7*O'ךէrki_mPteG-<*|םA6$Y|",x rh v}AO,/adeC2qg#\¤*WX&ĭ4,}g& q=}>z7쯪yFLj .NYmK5IAq`JWr5EnJrJyj#s+P3#㫹R݇~o;Oy`QlE_s =φQJbhCw5õ=[‡~Q^e8_}>M'ӳεѿ BZGٺN6M˨["|b7ߋѳ[b-kߡᗫiݭ=x1zq/iw2po}7DizMLdǯǮ1߬Fe߫%cȤɾm*yrq=ko&4ULx7 {&FO:O4U5nzko|׶v&E]zNї]6ĉt WVbx?Hm/s|cO_z{ump㏈lM#]DKef>?^h%7]~L=WǒC~OqDR[R2"S> X;xtM\O 3ߢNl95QD_5V8kߨǿK؟d+Pgyoۜ|.arKK'^搵ǔ5?Vf6BL \gmf&iC*c_S /hX ]+ Kñ:&J+_PO3uf-5'?ǡJ&z/m^bpL78Teܯ Zǟ]ϞRNW۹᧼?b"IQRr՘Fi ASq=T3W1Zb9qu 6ŠbVq/zݺØ*|''Vc=U49ϱej3sE[ܿϳg}ϰY|#n&!1AJykOQsF&8'sL X[34Q{qtddIV-i>>7V4SKp^gܺr?v<%KP8RS+ߗ97Q}Eg٩(~)s=C/Q#$*Rvfhr5e_߻?kGu6`qPYx343CKInW GC1=H[. |௨s%4ðd2=-tA37 [乼g9;d 忟[l .YKCA^4$)H"I N+ͭ62r{ Y);/2$gӐd$IΗIJ;EҐd]vE˛<'IZX>2H $(e+Rv{ lzd7\\2HRvs[_IɖD~yL뇤y>_~vz] Fr Ϯ2 e <2rg@ɗ$eZBȗe6$y.}yn[ʲHsuGʥ/e\=?-l\[2uսEU!I߇ss>[7Yi@edma(s+cNn_ɗCnNS}n\s!-CQ% r븠yOf~֧6~ndOAY:*r掛[an }Pu+ki~dž\ w\* us]:+KJ> )W4˔4%_4uٶ ׶̵!0RN--//.(WwHnus%qc"ܼ2HRnK'_I,ocR:y6߷rm.,|CR̵j~q-M;ϧ,ϒ)v$I7_/J/cٶBAl= d] mS9͵Rn[Z~N˵tmH =qY7n( ;jץo'̯s$+zHȚo+=f|? g=ix 6Bn߹Rs~2|mw<҂ʵw3w'Is|[/-^weYF͕XKcP|`N/<ϑ`~~KdYF;Ξ'۹&r%k9CbA<+'y-)$d6?<_AYi+sj񖴨/Kcs,X/^(\"?msruEA"<۵msһAAAAD.   =s$(ӧe&$I"PRRB  RQQllQ(..-   a~ӟb0(--%  xYt)۶m??ȑ#8qo|Rvp8y%P%ФE_iOHHH} %M-;s I ҜNe˄-ʓpg'OK'-ooR iQY+/^o˓ѤlYJ&ϕw54i>wy ?tM"ϧܹfׇEerֶ4$M˧p\R>* 6\ڂRªeyol҂EJ:WZ>݅$淿0v44iafWT+|YKٜk4y>OK6\ɖ|ڂ+lMʹe->,sy~ȭD% n,ֳEźLUMO,gQ~ޘܺ.eEf:JuWs~j|!.,\Ӟ3d^ϼ`yoXN҂cm8r4y. Rn/LZPgok7iyU|ͮRLآ岑/֋?Z7D\nߕoqv/.\I'U7vz.ۅEm6s86i 6 M?.h-]r(i ;ȵ_sm|~;0>|>T`ma\mሲEbn~!I oA,.|ۘdOF/mA4W}֩7Ƣ:p*M{SZ0EOrO:~Ф je`a֧o%-_n0.cF7ronIsmOA돴h=[t {#iAZpjn.҂=_B҂ ՛1s[;,oLgW;+'ǚx74S_2? ->GM7Կ7nµ|& 'm~ߕ:νmrXPԋ]m~[Kh^XFs|+un O9ov;_S^pm+휕|a^w9.Ǐ' O}Slٲ^`0H"@ p|_%L2446b) ŭ|1VOY Unek5Tʣ9 CkVf#Yb>`I Z1ۼPb:fdtiXiއ-fJ.Ơ_FwMOG=qfl#L D!U(:%6{pJ&n=ǘ2W;^Neãq"X9S梾(E&]}OmSISњ,ey5 q{KH`}gҘq] E.ŏrjbf-d#\(Il˰R҉˧bdp=oLKhG׷P♭%RcMWZkE5S3+1dtR%r7ᷚ7qY0ǪKp/7ưIz!mو4vBm6zC$JøXP+QL k3L /}8@rlz,pfZq؟g<]Eyq-ǖH0uz=u%蝬E*Wb(?L0׆8]gKt&hH sۙNR[f FՍWPQK0$\olI)ǘVE4B/Vm"aRBLbՃ{=&J:EQ&LE[XNI$Z e5/5'N\qwKLabfq1ս(SR 53[Ѝsly G#L2HnVG4G.BW67V+l41%0'L?"U圊yd?3Bȥ1uJvT"WӘk#fTHzqLb{(*U>xA ͜1aG_x"4f6"3SLUa> f` }TG(TFy‡ 1J,NB_?l%QRL4``5.A_ a7lf0ڽa}cbq ZO!%uU6|iSN0jvz:f fӍ)ن v|e*i#5a5ԧYB[ӋN3kLn}0gXV*-38: +ɬvk)LPHц4)b\]yI{; cf&0w%cpp/QTTD: NgGL&1 ((.I2J2uC#T'&PjjlFr`rS (6LfYVO:ISebe䀅K9zSƍRuJ1cJfJT,ZL8A2őF&D2vL-2*xY%4J\10`)Ú# &`3i cPSUJ8 v ,ۆحF4 iI,3#O_Cq2@}d2:0f r_vYhH1lEm*nt>S)a %bօ73U,PCppMZ5Qc2vZWLb 9R=&AHM2"u"Q @9^4BjD)&>12TPC qDi>K2mEn MUy*09<(D YqI>bLU0䠍Kb465JSIWM-$fZb̗)=Vlc˄KhAi{dĉ+f!.gL1aa W8)'TII<ž4DSYxnW9' +SRF5V1\FdU9@էIK FW3i%5P+ȣ "i)(ctP$gR(UDX]XTD۸-fTsEQ39B8biӔ.cd.q1L72Sh`EešF\AdX3f2jㄱI(Rr҉ʼn{OS >'R+>&[THRףf#uk35Rk$785rD#yZnB-δY6a&'Wfѣ-"Ud&4TvD3LJNZTS'Ѥb3Fx`hP 0ZP j#TFƷQ[ .@PG050f+t’j)1j4Oc!EHt酡!-Se,Q ƧW4CAd5F3s2xHG-:A 3;CpH; =RضKcVNM1**cH 4iשtf ԬQzI pΨi)M+&CiiS9xRđ[PE2d+7EP։ȅ q PdM=L4-d3K'm"2`N}a6D.pX2;H˃ +F=OPJP0&+8"o_-J]SGX.ZUNerr>~p[*plʫ'N02rݲpMgj`޻|[n5L5>Ǹir#Os V:J9u}g~KaY8<²Shpd9Jo>Ҧխµڸ/+KJ3LquPE=(9⶜bٸr_V:T|F.SxzO7F9qZ %RX!MN47;rzOٹ+sW \svKx^0^%mIDATc5u80]/dtt_yq[\빕!/>K ?{6c =uJ)<(_1+~4hοl1}1i®ubö攨A躧Cx|ꪇsps~9pravvB +7kMl*黫BZ驫j3\6*o>ɕ5m͐@M7wcrr^\h N ۻ(%=\`Y#LRTXY }vv̙3r9xnw}Gٳ}ݼ}>;y$GY^^擟$ÄÇ>|Ç3[~#G8r{ ]}{߾ MxyT),B(M+%8k_BwӑBC h>^CGGCCB=t^oф!АH!@H ]t9ۿ@am¦ +w›_Z MH:MH4 Bc!,| iϭ!mRHtiӯ T:o[CJ.@-5I{ )RJ$=>JԄ[H$:(D8Ii/ѐ涔H 43G.^=:H͛-@ (MӜ4&+v,$B#%τt#gM[R$ k`:JLh8:¥GiNJt[\C:ǹG {.N@j¦O:-$:1^&cKCґeژ&a|5g!%&l5[=?XvаiiptN 6|3Oj86fp p| ݴ}%?&_@_lI|sln?Mᗣ~5,\k]GWt  !H' |Bߪ;-x96Z>i^!%Bs|'h-ٿh6R $ ͶE!to±kQ[W ٻrm%m-5[o./m9!]н1#3 i[l{/OgĖC^Μxn<$ʴvb믴c5a 4g=or]mo@Bc ⷔ}(~ټtʖM*] MS6\uHua\kN>2 &DHq4mȗk|r.]}vKܘHCjbgat4p HM<ui錓chҮk]>(<ϤtW~\ ]Ct}"v\^2XX@ GhҮ`R96eۗvtif{N'n{v.愮l۶usH';Nv|2C͑;5, xqºۣTN !#2Z-Qy ~LsucKmMx~ MZuJ2I`L޿ȕ);9yG,ϭ0#A! \d[eBqaUm7"sa`m42af$٦d.WktW6G?OE&U3K-b`M?˹zBz 3'^Ej"QD$nZIz w.f;B*sYrBlm  Ywhzj}.5*VT=CwOԈv6 a'챕 Rz| ȴ2lG՛&֍4[ksphZ+z5- wj9Vw[*/XTѯ߂=Yrϕ8[\i"VиQ-Vۢr')B^l/ VMcgG|AkCqM=FYd4cΓ<;Vv/ӿ q#C%*5^yEzy' ;7;T%B F-ΛoϒI]Ǖ+[ef3-\Ah/Kμ.HK1#W{4k]sT^\oe(*[8ګiUI^C-O? oXYː+H*]5 9Iw%^z~#ki.(4^Aq|\V#W im2t3=.+OۋJe+֗ϵr-Wohz Dי$ZmryJ@*tkTbA^^hFIE}#rt*74ϖyРֺ՝:nm`%nv7yJ]fVmyv7f}VC/'k=v.<ֈ!jMVatj] b4K^L|&%5V+&w8uZfqdXbU^]I+XըUT*N[zoJHJ3 ,*k,vahdk/h^rƸ -P\Q Ul<_,`ąB~j}"V$B, "VM+iZ$=` [m=V*!"]Œ-:Ff$xI2 =tc]ˤTa2Rt#+ZT:Ed*J=D=hO _]R`ƫDL)(LWlwUddyW#V٣I\UQ-^B]d)rV*f RW*=tku* ^=n -kyV_$(,D{"WZKmƛ&{Z9ą5>_ PZW(:#Un2ۗ6,˫l60nhtUJPܺxA]m#ϳV,oSʝ!p:&l#>zqŨiW*+*w7EگDoXt ~d'L=%eBE%-X`ס&JsKJNZQP7^`dchD:Cl"uK29BzkU?XeJATbdd9iN۱{O8cqC~-Az;+V] so+7 Uvoۗ z -^Aۗ.= z"-)6ɠgҽrGXN)#,[>vCN?n wHZX\^ 9\c>%͡q^ 9-SN_K!ޖAc;9vt7cDz=n#A&z=q}t{0nw_XNcrvdcm̑&8B%ty^e9n߭tWoMN?xvXa,,gij7~p:-ci7;r{ԃsWm=ӃPkxnwB*(e$:qzs[8hR=>:; ;n/]PNO;>s%=[sz؄ghH[l!۟Zs3\F)?Kzyz(\Z@9 58*TQN-R tv>xv]oyu|%Q~dh!fn^pߝAzF#;CXhC=|?1Sk:S@ll]thtoQUv2DPsicȨ];Azt0t72_.r}nqz8i gf³%a7뵕@J8Ry=u\3ܸ'^Xa S_/>{qz :4MKy=AiC`U~<Λ2z/lK=d;^"e#d3??{_r$y% dOpi#Nt[NOPXn'k'}9;dmJf'*=gM SxGGӅgrwöG-BXOI i99Fn;'OxÎliUzj1dCNjH6xtU5X}>5ǑyvQ5n^!sIGFհprd5$ K✭p2'Nj!M:ϣqSZaGlMX./|lГΪo.մ$BJJ|=kFaZQ=ֿ9Jjq44xi'EÇ>|!Lj\p1NN&LJ [:f͇>|Ç>| Ç>|Ç>| o}Ç>|Ç >|Ç>|6AÇ>|Ç>7>|Ç>|݇>|Ç>|xߠÇ>|Çot>|Ç>|mÇ>|Ç>| o}Ç>|Ç >|Ç>|6AÇ>|Ç> JS-=RiH@Bdz:AX$wp0&&ɍDZQfJ6Chζ ΧY PԧԻ.B 1*cDc%E L^1B),L Ӵ0j4Xx ݩ&^ƈw:V7L`h'HJU%GnQ DxXhh^t"Pl1]P$3J1B\#i1o%te [$ ՄZXۤLgMdOf$eC fhDFyRs@7UO>}+ȡb@fc5Ң  {Y:f\SNPU 6XhZ cE-Hg!-slJ|ƈ^j,H/4u4G6{'3cFa|EpN:X&lnl1g֪eBͨDhvSH,8#QYځFKBm+ u-JیQF`iӢ?a&O ʴAb(OHs}N?6tڨ@6z3`IR%wWK$P$fkD{}beI'1 ӂD|B֨d$-Ìޙ`j3Y )Fm0ia* wTǍ9Fk\%Љ[ `>ӥ0dRe("Wf8V39A͖F^D 1U-C:HK>Ir P>}3]eB}ȅ=~p Σ9/8IɛwZan*%9ʋni'#_4f??G?;~r 1b_M>R?a%:}?˄Náuc{)3hO+=;|^ L/^aXѱ-vrL\GsKoeٽExY{O ֗opez_7 &_c1f\?6G7S\O7/} hLZ3dvt?ɽ-4k12?fbew|q?ʑSO8|cGg)H@W(k eRc Bq?{SfCD]k^a9ν3ĹwC#Orտ{?y3?.:Wxs_6}[޻,ű_{_}OƎA~޿Kǘ89+,dzG>_?im`c_;¼kqY7>FNJoYzׯu>k#*{h/vx}b\r\7KcM}?R\OAhUɇ?OXC`{dbmf\F^=OK<qG)Qrj9;~O1grx/~̻$NTsモe4dɛ!? D#df&ɯ,<\{?OhyZge5xn|w^ ߸3M'&~_pN q|k,g>šc+߳;]ܓ|?>^8W~߾k"Ͼgj(·MuOn2;4B7XX{f>oqo>/qbz'.p i5byZ|l(=q6<Ըί|!~/3 eeF>y->xwy.>D}n'sK=C;<7w=֋C-~ ݍu2>|]}o䝧 X-7ԝ\>"_aa>y'}LǞl?/S Jq[>;Dz}2Kvk?\%&ٜc[Ɨ_޿o_ѭ'hv?~?2o⡙gغm˛GgW^)S d{XȗX;%E+ȭI4OOS_=~Ǿz4J|"'{|W9].b6?FZ+ne|v>t;9]c7טԞvc/8}TH+_C) aY\j.g}oHX򃤎*}eBy>}t'(|Ua,#/z>q^6B_׸陻OԞE:Lnۘwy4x?#,x<w?k\f~-=yϽc qX8}@\t/C<\ڞ'_~_*+>*7Yy{PM^F-3ld k0s+<zK"ݟcV{w0,n*>ұW?8F>^Gxs4a"?H ƿ"+ܗ?%|sx/֧ƥ?+|׸q߳1^|`h'$ͬe ^OV0=.;Wh*Kc׎· ,o~ƝYmMo؛5ҟ}ѣl5O%g}#|wM.\sOVrߍ|U O3!p靂EF wh3a~tX'XpPDz+7OQ|3gFY{GDu3oݧ>?= Noвl̉49g?=c ?z?}ȗ>Ŕ,{w59ykE+c+t(gxϯb;R46l?ѻ{ U.-OxWylKd չt{K3<44/o~𓿿~;qr1·^ YfҹFhwiz?Ĺ%/ɍڗXT.N?ԽփJC_`TGc3#Uk.R7?w~7^YEh&BT 5m+=7w9+$Sܘ%^^1C Y և8 f3nϛo:' a Ѣuh@>Gߠ?Cl/:,4ܦD_a:]Ϟyȶ뱻V_o~'}vBvlܳ,v7˛] 9] [iqw:qooٰ(\{)/r6 G8;Cv__]/ouj؞'|saٯH}5!|iXC 7ҡχcِ6O?|>_yzǴo3cٰo5v_No7m!%VX;L7Ƹ=6ӕ}1Ψh7CV^;ЍqSkax66njx}}S.t ;/r aܧܶful2C7~O}msx4ݮ־fXηo_n!:O^?tb>e~͝c@S}Æn/McgB\_xx9?C Y>{Ѣ g 2>Yy >?=>|Ç>|݇>|Ç>|x[.qzi `ff!t!(,d2Iբ1:: id2,b~~MÇ>|Ç>|-m;ۿMTb||%>>,GE)"iOgrM~Gv͗%\?o8!X ,r*BQB;ۇ&HWA9Dس ('h !-Za'edٷ aSPgBٓ a?RH6IG !>J:fJHg]6HrF B F{5WҔ7T P64ac vՑ–P@:kQ` 9xX(%qk{` 8Q_mX],oW4,GW\!~8sMK],;K Ҧ(,!-94@H !LlhJ:>(fY;AJ5(PJC` dR,Ooy"Y+ZmK]3~B" ֐kB 3-O_YCWh°ek4{q`9|AkW>``6Jsuʹ `IfiN ˣ52Xm}^֏5a8*`ڐ²uܕPcCu!,$RX>xȑ=WׅAXjwlmB =az~ _(M9;pC=!lE~ЎB2táYWRtayfh0yr۷ok2W Mi/QZuc꼅T@577]j2ʎ볆‹-a*{ },, g!s.ގ=B <БmCnN Jr]y]MB B)m|9^_'rڦ%HrC!B8W 4U8z;ZgK /rbݐ߷͎jAWamJڱK1n |+8]`yñ7Wm>םK a 4dq'Z8-9bߜ}B8.;\Wǭ;SȁںbSJi!Vচ+})lcwצ+[^&9et O<%v(81¡c(KrcO oU.-}m(v*GwQYJL7!B<۴9y.mXl, ~Hgɏ]jyVblSZ2Q懗Ր8l`@ s 77Uaw:ē OnG5d~mU!؋*a\('TNrrJa 2¥E YM!J^+OBXS85PXC@(1V1 Jܯ]??ȏ~G?ez~Nԧ>8i~+S>q8K'9 L2AfP]4x!1P#DNQ5YTaE"]-%,ј꠯,POP5[h~.m B]=cd$Gl9stcDQ՝Ebx&L'()VA֩?S3_%w]DFr4:}+HHt1i4"ѥ:ף:dI@LzVEpkr(rnʽhz&A6Wg=xMACdyX_œP9ΘV4Crm`V Si?{4ʦͣ1.c78KC̐>2H]d%Cɜ<.]Fe@Zr3hٻCwN KDEOi瞉 vځ&FiPSV1F;]4Ӈ%JTSԎyNpm"/܃}>##~¢ uX:h#t*$VIF/ (V=;^{2d(=ʜv'֐`INwg.n+3 nvIBǹܛA7'8[<‚!$* ɊCKԭ8zCLKZG(kܜ›v3ONB?s{/E3*hv$ZGhXILlMS6'ɈYc[ǰB TiT?ř<y.Wv?q AjҜOMH;GZ fnsN;`& =|Jy g}h$LD9N7a3gSDnͰ %e-\lнcf~X"K@0F4K1awZt0#yB$:c)F#tOC'T\pz\gT9d<܊"@ќf WC'3$C.>Jۊg,RQD2$yj$DKD0p!L4QHM4}+h%-eAE@-1K>{1U"5T\85V ]:Xz(g,Pf$TI_;q|EvZ!ZwrzBKLdWN`lj&jKiflo%t89KP Jjg#li5@B1bTr8ɭ"fؠIPY1)>krxb5"XN|fu1YfYʤw1C ި}>0njJfm:ts+LeR3荷c, ;5Fn^C Qfo,kAL[i~Vbɭ4S1S&sHwxrL,'"L>x>å#L|WF QaZ!ë1zr3aܨP=QBK5J&8 9N3&x rtHkG; R2,IiL2ڣVu$fM{5$BIsi~%Qƛm.зBLz}³5~=?Yz8S"bGo(j #yO? zB"lG0qrmi}e!Iy/L2W޻@^#;#q}q6ɓ$\b (g-8w([<>>wcm>D#HO04C&\ZG6DuRL_&WUMu %>~ON>΁^)Fh$S=Dr| `#hExsACI΋o7ƂO111mR1!V>LpNPw0QL)sFUẢ9&A}٠io7KTDD7Fc6Oٴ72QT7V8[PM+# ET7#R E[_φ%!d)J] lbE{TG,V|AW!C`vhD8yGeG-}F&IL4ʅ#h {lC{60Gk%{{ ,js cB-uQ@X(h l/*/qh ü([c=꣊B3l߅HPR6(KfǖS0ifOvn@kktZ'g%s!}ű&ՃM8 mccdfxjwDN1:E{A/gduz?a:`qjhM1թӏl]_ ) I/G0 zA/y|(۽i\0ټOhcӗw'IwubeV7v-P ɂܥ*M q҉Qvͅ;S ēYʵEbPpT+Oٸo\"J'.5N$CܱF`;ѬO1u#3cy|'Rekdz0 fAAޑc'L{8Ņc";A ˓HǴ7Y0C zN=eoп8K|0m:QE0O$ e7 ef  *Õ * `&^ޠf9I+g.#: a Mig>bijZ'5U**5CƣtlM2eX1g^.2lbH?ĕC4j19FifTS#L1z]`24v3}\\hUPTL| s=awa.M v` loD7?gbA.O^}8ءkcf)A' ("PfsrA_NrTeq&M=BO zN &"`?^xVH#nx!r#Q6Gޥpsd6YkGǿpv$]U\`s6s7S%RㆽA/Yb!:{ b2gq$8FT6 N)6:VA' Lt\&<{*fuԨH4Gɹ5z9ՙ4o:~;f{'TsL䠻X@+4Iee&يhGqQSM*U SFDTf(H7i`F̆v/L4j{(KG\=XN..˅GHT ZLMBlR?ؠ#^ _P4;as[cLފ#TQRS4k-.e?@1g,'MX,;1ތC-1F[Eޠǩ0_c~%̰Iw6ŇӨn&-V@ͱTZuBfeՙq,hqk$2L9%^}dNwCa5bhS}2fC6E1div $ sbbnNh#L n.YɼE/f2T\+Cdc#jH~N]7Ѕ=.e]ֻ$6GhaUnjMΜX -Lt0*TOzsw #! rV|`@Co˵ãܛR((4J [nKQFu7+) Ņ933[o?p 1]KٌƟ,&faUcXy}Eh&z.XhpၨA?Lqδ>H Rc|Fb|d4Cs\_#MÇȟ}?9E>ɣlE1?~o5D+ä&buV!zSM.{y^rKE@6„55RN_&WU"MU %9q'OO=ّSG zf\{[B`oзhb1R&c &5-+s z٠&ff@H3(vf\:OD Frb)4Kt3 4$%5I#>LP3γr(JR&i(+MXKp+rccźF;x#y7[DEn+1XH5{ewc:6ckZt3 OON\s"0UByg#DpW{<&G2D. %{y(Z+A?~8l7xmnݺEG''y{r Rejr{lO%NI0^I GU^)cPug)%yJ*:= @ ׈xCy(v澒~ʳ2[-o!;%@2D-7YhHpr`tɭqJH[[J2)qwp\<ƺG ][:;"Cz`Jv5`7x+dpą[nn[&Jh<㔳F 4)0a)*Jܝ>DzYPjP~ rݲo[c^Y[$\\+_zNPAkNt-SjPvJrfɠWeb`v5(Q.qw다C*K4iniW&K\=5lߵ}5jv%aۖ 2,5xmnٝ ˣ{ݫ{P>;W 2Jܖ}% OyǸ:ºݸm nkY(%Pr ֐AbP+9Ny0()ޥ[~[mu<'\kZ Ӯa[o*`legoC9@'싩r ? |W^yw9r|\.155Ň?an׿uBgΜaqqd2?D>|ÇФ БͿ+Ç?'|Oqa>O7?g? HhH$B]Ci HMPhDhRhR ]Ht)Є.%hRC=M4MCMJ$:RjhR Ҽ1:GJzgnMk™W MhD )t] 4ͦA hҾ. &uIBvh]zM6? pes˻OyHaAiMIBC }? t)0fӡcH4k5)BiĒY#/e mHR8Bi5-7]H=‘=ԤM>j hБB|)5W4`[\}.ݱ>I:BJ&1u給 t!SCC8c'm tm߮ ͓>O+"uhty[9c ix%m㿥Q#sRwt̍ER"u .$A#d)}_pkݱmY6#b(5iۓ#7 t RA-B"^/*ٲObo]4G\;EMhHMiN;޺~FtPȀ7X9iy;yЄ;Ka3A8qѿc\s֯#ct;;qAʍa'qu坐tN‰=r} =pe!3{.]?1ó?ۦy&|O\p;ǥcOvٺtcr!Rrc $מ K~px7LJr.֕u)ՐR9P#4X ly3O)OC׻~[!r|c6t f?8Ύ!˞kO<ʹWڶtt!϶M;Aw&Mu4v?ȹ=ure4;_BJ 4)o ґxvhڴk.?y mlrpm)ЬA^"] ;E<ׄoK ئ[GÖprP!uI\Ξ~?RٱHp3|G++)|8> {\ ݫ\S;tƑX^̶e(8?CH&-4~whHiXR۠E >sbڰ9B *}u5TffNU-n-6`'gF\l;vzhnl5g_h+ȨӪMb-Ψ.+-Z"E&:Mn -f eJ EI&]~FfZP+oɗd.769C`{K|'Je0v dvr 5F'}~F)rm^oU]+5wP.)~ȑoQ{3D:h^^׷l=F+ERtӻt zMmVVYni [³.oKcD 7n+=.02%M d5}zNYRcnVx6UafJF2[T&դF"(l`1V^ߣT;Lfxj*~ר<^zu^ ڤzJxl).nC# ev n q,w(›Wf_!Rl #JM[7(uss:B7\/Qoi_j\9Coul)ϡm5FE&h*[J>[g2TVV7yWQ:56=o/nb\jS(W۠T2@ -μnJ"Nj+4rsgT[-%f.oSUx>- zcdb/)ҥ$zZUjtۂZvݚsdY_*<~&ze*B8Men2dE2Wyzn.fk봫 Inr&$Q$m\_#P7v4{[f#Sf-Kl[YnR)?Ik:oX3\V5I`fH;K0NY R]p*wEAh.uF{MDi1c*L Qm*U%kW V[IyﮐHh&ur!<;JD5Pv4m> +:k Jk8ZG9|`g.mPkhڼn2j.<5^6 DPMY!WI'{7ޥTڣ+j2b}3M*/ޤ*p>M7h{l]&.b˖,am1+M+MiH_-޸I7kPhiWj$T#n=j6_mq{j0FNO(ve3|B֥,vil ŋ1Υ)aۋмT6 _SXZQjH4.gyMبo߽ERla6tu6.ȲIPԍ3-̘/R$%jo^zP5L X[IZQnK]mj\nnc_l&nRѫ%Z]Q'*ԫbKfu7)sE!r7EhRE6Aϡ*yVP|- [אz2+ݵ:ݗHӫmV`%|Ç*(A `C-,#kÇ"CKj}h{[:z׻Ç>| q3> <'2ǟS}Ç>|_:G8YߜIt>|Ç>n}">|? Ç>|Ç>| o}Ç>|Ç >|Ç>|6AÇ>|Ç>7>|Ç>|݇>|Ç>|xߠÇ>|Çot>|Ç>|mÇ>|Ç>| o}Ç>|Ç >|Ç>|6M|BMr@(&#m&+ӔGKY,3%)2[`e f2ؤ-"Ba F& A9#cŁv u0IJ5 T?@',)1EjkeGL =z!A m$.'@]Ĝ2&4AIGhGpbgE&%LJ:#5c&Kt;tn+'S -F:mz-"Lϊ יN rYZ^qģr8Vz#{:4qTN?!à!D=c,!ѡkDh [Afz%e&lŧ,rU'2(X1FC4{,l&8XR D=1ALRcQJtz#yI@`dݴ4F` ctl iXBjJr&hJȈ^酠kDbauEoEM Qe8ONed{~CD i8=,~ |i,NR!:b ,DjkfLoa(ЈetEXHHW%ަ 3񳚺̰1^`>_w^x*f )3v,7԰L-ca./{bb#JńF2i y20DW- Ta6(y,Je*`^F 4T,ʎdQPWy=tsYoD&AF԰D_W>7[U\u?[߹*Y~wr{\X"̞ v5~#Ň|#@/sv/>=N.s<8H/$}l+if ϱ͛R{m̉{ k}[yY{)]l0^|3bt%c#ϡv[&#DΝN0#03v*^3C~={榞oXp+Ko; So8-W}v&^~q{<&_!Ε%~(oY*({3 qq=2G򞉯/+ '~_C.z/'ӝ;Vq>oލ=`r.+Nrj6|o/%+Ý8x=g33G_NVolsι}BKřV}G5w:8ZML6ܻxjW+ٿomw 'I?M1d |1J89^zMٓ|~+s{=^(Ox#UxnҭM?Ň3y] [啽̿_[OÝIy ktvLs|ow|]>Ou tKe2ǵ3|5Rz&INndbqj?-q5RDC[M'| ~㷿ӥ|>Cs7r(Wv?[9Z3¿ouᇷS^ǜn'Sfzݼ6y^~xwXEټao{=[8n1D%s3G'tlΞ%qtW_ȾzO}ϗAf9|pіEFok1PiuVrQ{3m:[y>5^$á#俹W$ddz2l/1=yO[w~'^`?Χ{_?2߃(l{?}2]s4*8_oqmtlEǸVeq5oO?Ζe0T1"v˘9N?+fża֦( L$']λK,0CLx?;kgd Op~:z3/%k/l9m;mO49No{|v'~Yb;waߣ=F~70rc|П3_NvvͰ%=umwƇFMcd_>ÆiM֪rɽyNw8>|^r;o+w5/y&/OPj't o1?d4cby<[4էɼnMW3ģs$O~3o=ѯ|݌\2;_?~xs?"7 M#|[?${g~_rbK+ 좒6 8{od3r+s_^\g_X"owN;d3,w''p3ҕ^ 0N9rM۹kOLT/aۤǵIp'vPNdYH9lO;^w0c<}<_oLk|o}ܴl/WnUG?|;Kw,})&vHޑO~}!?3~ʭ< K &'Ϲk<MD?=Oܳ<0p)/~t3ޟGR bNOagx}˻RW>6 vڶ%}~ufC\5?TwơX߿|yHO$x}\0ϝ>W'z'\DzvVnfSVW[o|/f;y?!7#YJ?>Vz2u_ο= :rw Cc<cu1]覰W_%fn\/JbF~zGK|o4/6n-?D ,3ӗ:3('7qKN;đ;O?_'R<+^_ wyڸߺ-t?]" +nf25ȣ:RqK ,a/16r+΍q9Ϥxe>WA~nG88kyr<~}8ڻgl7ڷa4<C>ě8/3߿xkk oːޕԽ3x:7H-\C[>͖ ?E9;ŋ?k1C؅cyg.}+mݧVHp?NiWp 惗3lxar.'#G nu[}f"qn|.k?N˫>w~k?Eg _;T#EG/s >7|?? |W1ds?3r/gp2wy̧?GߌdmMmnb[r_3 Jd‹?ashq2[_=X~r~zF5#]81<ꎏ8NzqZ։b9GDF.9%ca 3 D 2D;>qaPFP#T]{z' ]^FDuA|҉ ? PCYDB/}:=YjIDATAza:~80dHDN \ ċBTX'DN3ċ"\b|_G.pkCAz(7+pc$~^c@&z}e:C"T.%'W~B;JM(+ 8DND"FL\UNr"#@9>4J^k/35QLECƄNo'Psod2Q& Hd8n+T=D!%1+]CnD%QD~DZ%B D2@ˈ  <"lj pZl7 %r{Z$r=ݐ ю"LE"pb!q!va0X2]#r#"ÏC^a<\'E Mp(|# 4K&C|?2m_rZTrOXW#&2bN_[ FDZ%a5PN PAA@hk_G GxxaH=8:F;.*c<;ɑNkMjЎ"tAH"=;+@ 3' $'DNh=$ =b'&5로OqDKh(N- 7$ ˋpDC[D8tXxڃ8wk1ЋRpE=WD0!0 _ pLdԾr0&$1NrhC"/D.sz rQNb_XEIL&n~&9M8#T;^IJp KƸ·ݓ(7@; ^kb#tb+F{>xGI}`'q4N~u$nc b5 Y7AL=R"c b1z!uР]8>B7ѱ\xI~w]M oK%4WD\ȉ=0Q.xJ#$8'9Fzw"N^LhDu%ڴ\(s!2C+"tIx)rqB ~@xNyD:F9#Hľ(/E^uu<$riIloh$H'P( 4q? I]웨A%5x<%B? <In % B? c Q- VA+'xARxʣ$E/с4!väΎC"7C'k B\?Fwp7 BOto9EH" %!PᆪnQuAIlVB@5bIrRx"cB<%eK52_ {ųʻvz~3GZc \*֏y3境]|E\#ϐS_Hgb[+Et[ x`?eȏ)Y^cM?v:?XRP-w8 չ=#(uAl>l"Ƶ1v^o,">FEn&b{6 XxXďT.ͳg@ C/|M<˿/g3l~w(m퓟MƋ߰^ G[DϞO..ŧ, 9hkyDukM~ij>R]0#TBu\`'@qϳxQ@uYwϺ_:vrkcZY-V~A u.wųNWgWz_LTL_TGϸ"]? |ŷ:S u.홏@b~dA%qmFmFmFm7J)2q@R5ZkRa1tuoR!c:;;1͟_ܷFmFmFmVa3gΐٿ?wu6mbÆ !ykx'9wo}[R;v7^KE4I{z]@FpCA!j]FA 4Ok'IPoi*b-ODj FqeC>hB'-Nq4ƍ՚iJ1D]'h) ȤA1M@hbUFO5!h)Z7= m)[v]sM_jtCJ&y n8D#dJA(2ZЪ1lDcNUb$mmhE2sJ[?M55}T ^busjlF#0[4 >iG(dOZ^ nycH(baX44Y!o"$^4mRc{GX2qk4$j;B@5ECO"VME(O*TKϪỪ9F<5C5Ҵ|V4[% ޑ"nɠiES wZь^WEЪ ЫnƀҍoMt#fWXlr =[퉪_iċT#49J„N!BZNwjԪ'/ZsY;6U,zUg qWy7Uk"'M薌 * BčM|<!.R2 㰲ҺÆ ogii~/k3!EWrJT2" oe9: vsiXl" mufb!;ZS s%"3ns\FoMI[M̚nn.C]Af$5[klw( (u0`wF(X7rf2U:j9Կ!Ŏf&=l6 v{73+\~.<յ3ͦ d )JF܎睘 + /mO(] VQBR{ &]`EvMvv+)&=LmaV2b%f \{jsRFl_(s~s#16;ac]=8*Q6Y^ 9 s>: ː)N:'3tFu6P%GWX0Y@-P#Ů Ӕ<:ru+YYK;kawy#n<{gR)EPҧ, [(yx&f݄EzU簁fmhU3rQob7O ectR%8\twFMg1q- TIFx6n8Hh :X( 5I q7Ρd ݔU7{:³(LY kx!L9H#'02ufj{6/S[C %T. [FhͰqEh^} ^A %ݪLU Jԍ*blˆdvq_SN &]t Ljzi#NqLB֨flz€EL"ӹ@N,TFiy`)b"UJLEG-0*,,O-E&̆"˕c16`5ٍ96+\B- JıMV}Ql$g.F|22KWP$Kju/TM=R<ŵ8ņG?^Z&̆[V.ALvS?J*ǜ\bm;DMO}Cml/9*nKDHST8NE/ HFLf)[2KD4DkSK[D^?_&)8CqL6kqCR3y2A@\'21;CXHV@23̸[1_K_\Ddr,C]ջ)UY{;8⎀]!}nZyd$\z숺ȒI )ӁIU >z?V7٢c2[ْ?Cm NvAɲEeBX}UclqWYHwѷ*v_ V l[.c {9K9gqrSXC]fUto'ٚ&JtO[L dn<=MJ{ 䫚KF}J{J;uumSΐ6RfetfPAh#{Nm>K2K::T XR Fg@)o!Bgs uLP{zҧ͘.(:&izKMlqXLuʌtf9%q芪hCC`A!fjJ`h!۲4HWeXJG>IoC{)La =a [<Ȑ=Hz 2']k3k4,3#B,uq6:&|3 Af@Xru"<ЁljSoYy.lc'{1R;;dÆ ضMgg'aXd0M{wnK+d?v u]wX® 7V3V&w)t vsܱظ BS̩ALX x~63s%b/pr*;yxI*X8rލ2xj3_A:ed5Ô9-1ݛed85hzB 8bY`mvO~;p#Oe.l|=\[YF2C|{e<~dZ- Tg\yļ3Dgw3iq憐w0]ȣm,]>[rʿ2SEgNʻD`Y cέ}Llg)6R kj'%D9эP`c!mÜqކez\~|\2^pvRz0O^Y`zѷD|(v3 fCXd*nˑ2_!&q+},v0JY&3tҳ7{ؑ>•tEL0ك@7$˜}PO\A8"CZg9kbAs 9:, d}[q{R.ָ~ Iel?mm9Zc]MJvOW3x[>n<{9N֯Fk%SE%&V.^uqtfCd쿏~3%n:ɶsrd )]v 'ե U u+&vUORf8U<\˭}L/ag(o`S{^ĶM\88|anTo?̎13F)g>t-|%\S;M.U$8Ef|/{ )=˧soV s07~gٜc%F:Oqp{YC]F_Eg\Ð!z5_̼if%qIirRCSl1;J:\檮Y>ČOa)f62,!·I d]f#Cb8D0z#K5Af&!4`,8J1H~&KظR':cSt2וc9;'yz[?7=A 0H|5c'+!0rK#ҋp,M-}$ñ-iũH vz\KVOw61鼌%ك9EWc, 9G/li 3p'Q~us6Φ&fj9_NƬ@}g.ۯB0n8L5Gnϝף+,A!gM@z17఼&:$O˛"x>,}\~eKå2;.%+U%,/r>?< <;=V&S=\=6Gf'JtgQ䶍tĖi&5;;Aq.ƌ*p(Dp?0=L\!.26q{Nxؿ^>3H/Pȡ;ƻyLw߈"ӽ@k]  xNy YF*CGT{(.`=A풫iݴu1:oal*,@If>%;DFz`jM,SYڊ4b޲ * 3HwzC\|ƾvIn]>wžݘȥnbsX۶mcff3gP*& Cnfrw4jQzzzZj5>Opw{IRYa5k۬u{fVKvi5nݫ/u ͖5 Z׼ipk.Bڲl]+wZA;:l1@J.fͪlbsi^毭ĚͶPIKլmhњWy|+r/|w״zM[˔[3bԺGgkٶi "9~kŚ8j\fKԚk9n^ZlmcsA5l^G;k#} [rUOZhk_׶SDbM5km5iFamNksxfݱr:a 9vE5uk8M_iU{[>c۠^?,4cUEc>}w-[7/Sz^XXNi*M3kG]36_UZˮϭb]>Mj՚tyfMk-.̪a5oh=GH%KsV [H6JtҴObDqѰlaoHӦR$rK)[B$zoA! g6}on0z\a7 YuLlI ^6eSHص-x_;nheMժ_7%ғF뷊FwјB 92k)iOcmU26hQ5?Y'Sf#d}M Fv!LL$T5n%H8ThGMK| \%kxu:4_5yi})DzْtoÒgH0q hhpHhģJ|ɐ3uwIxW4hH3VOtoWhŲhZMd E D#Vl'q%RL)ВV lt$i\O٘l4ūM^;r5FoC48ūamhp\naE45>j.jw[FmƘ 54ASdU$jݰ E-ھ3Hx+hůhqQ /2|Ȋ!6JkrT3-]'㋆o5yK7's1#1ۊْS -Y%k|a759` 7sEmI$'%':Z^1Dϛ߈[ZiͺU^7TC'٨q\V|Jh-x%FʹFmдG n:[1Ś߬-6ǬU7%klmm>a5\$Vhpr/cDB8ۍZ6cE6hٷ[3$|vh4F#R UҚךy >|v#UnrښQ'g F I=;I}Ᶎೖ9ʆm\ÏR7j$Vs@'UijGZ17pWs!J!cF㭢U{ i"aN[xK5:[f]S 0 Yhl&5P 5͜ʏM"#3T$VD6xd,\Zm]K)WKwK\$;K@Ah-p,t!@קX>s:e2x83sY)RyܲOq!W&`vlaHm<ሣ8!:gCME5s¢сXpαR ɖ+Ud)Z%̔Iix+Uϲ$㊒[f$;*YӘg3b)3q@_7lyRLy1)!4.L0cDGO"KN-M2uX\:xe<%u`ɹE*9-p00N=:2DVP5EB4s\e+MQ\YAKcIrʯpdOZ8OxneyҝfxBT;e ۣbt)59Ef<:q&#5vyMYqpL΋9VBIʵ ,Q,x"q &sbqV.Fk|02̹F} G`'Xv0|URmyrd@RZ{"D<&3Tcќ'))㰴T-Ȉ S.#FCdtX87BX`8Ŕs\gdlP>bfDQ_řs)388Č"<48?;#"\)4'9,ʔb E+R[aGk,4EɄ! 8.91iG/⅚)rG<$zDQ`[L<r $s KO3V*Ɯ\#gYayI1xt\U2c&+c,zJ81=Ug(sIq6xДff8zdTs"7>V)9%E(WSTs4/SuƦG)9 +<2p|qǦuQZey4s̊PL(fϓ&fxq4͘sG*,Ԧ8+ T-f^ee9HI3<22Vfl`I(I}GSZ^pQʣca\9nN/qԜ8[g9Esg:8xĩzaJZ.18"K10c:Fx +<2²/1p ?cTJ89;DsST:NcKtU&I#}Y̕넣D*d:&lejOXLQ\G<>\r]nGbHgg=)ʴE[h2V@h0LIj BHL9 {$q|H* m4E#2%$1RiBinˣR(+Bk/$&F36Q똉H 4JαP)CurDN~CcF:y%b3N2T[`@XoQr4Zh 8B1J&hTyJC/caT?g!ZǢh#T3F*2}Rk(9NJ BiX*"2$FBAh ,Ddy+3c #L(q4"9bD@ BućbC(m$v1029rP(C !ƞHbeBH܈HmǘJLjO*LJH"9zO)cu? 1ˆPD E`XqL,q.&(I(7Zk嫖J5O/90Bk#9F,JqE3T#tL$GsDED2Vh>ZKBL, -4a &R5ddKGH݌q!2&ɘPnr$&[nbh1*[rCB!I؋  [HPId$:2D㈸?X"HhıWcHb!&y&nkhCa222X&o[բuL!C~y  "SGFL3h23dߌ;$UR:l" /qZ%Kb\o_5Mc m$%RKIW!;#tx$Bi&y triA2d8Qz"^%P8-9ɡ!Q$z P" Z"@i=&y\#-UR*Ѩ2+$J:o44jI/ڈ}8O6&HD!AC0bVDq C#[BNr ذG:#J{1  $d`K"i$u+HJ8JLj0cB#ћ'c%U+ 11\Z%Qn1DD(M20U]5R5zE`D n3F9XF_H4@IL'j$2E`8b5{ х2@f׫FIԑəInw"j 5!V4#Nkqh3Ɗ6Zcɽp[5c$¢Y] ИZR)t45J"Ho4PFǠ,s/$X,R.iqߠT敯zi1h6h6f3|5}OFmo6h6h6h66h6h6h6~^FmFmFmO 6h6h6h6 @{FmFmFmF?h/h6h6h6h'zmFmFmFm@o6h6h6hmFmFmFm6h6h6h6~^FmFmFmO 6h6h6h6 @{FmFmFmF?0O P(W} 3@k@J f Z*r2Q:&RoJ:MhHD$ (%׆U#U;ňH"Chjvt 3Γ#<@sUt@jE5q 4~E"PDaJ"PY9AR9 HJ֦P12 2(71cSEJB \11uD=/IG!uțe"mB b"̈0Ph Y?+"gVЁM>1Z Dh[y'/#@'5mZ0HK\*qS8u:X*&QlSJ覈vJ̑ 2mY%vsQt-p1c#2:'J[=6hPH\#&!/VMH#PHՉ IFMd*M:VHuTw#(4ɦJ*1#9U#b', [HROtF5lPL0b'SC䝈Z${D&H&(D伈8HauT 9td]Ҏ hrnD`D"U5q3BRlL *t*Ž#pSD$B$"`!c0#0&EB,pr` Œ@ 0"NŤj*EΨP2 &G*7#y1H @6'9>^ZR72Ǝb"àǩSOY|M`D)M M0=U%0Ɂ% /-AK]cI1 #Lıll27 =\z&mL )(+qg! 4OQI%R6 %AG&VIlF -A0|IVdDŒ/-8e+ eM`dkݐ\A$[ר̓F|F^Yh !"Ni6#`h+$XY,eM` BjmxI!v(x>"r@`I^HLAl#DEMlj1:)wI:H0Bk2Fu:؆$6y'FA4ڎBaPy:BS u#M;oZ" ERG8;И:t#)atE$ *le*`r"EǶ1aB)"b7K[I I`t;Q↞ Sڦ#xFHpt(AGH|g1EHS +UGyi"mZFe)钑5AoXAf2qYAKN1B)0ЁER33RP "FI ^YlҭASL@ƏRHIG/Py?,97F"2i")b! 6N!}( :p0OcPt"pS&)|B@EaHnZc`yRr b[ao`0# CduKI* HS"D2!9! $: Иu H#tA:{=)'eD籤OV.8H Pil%&@%kPD $`%[T@.7  U S72:A*#̈́W5l|i#U8!Ja1% Lv ܎e꤆3bj:t-  -tTa^XWRt@1Zj"aibg'uTHd T"q* A#iTl`hMMz\/-IIД"Bb!4B%MC+ g 6P @.]$SFKM^ר|QYj))Tcjv(DiĆPјD;:44v(eXQLo%V~!OaT"cEH(L^ p\N6V ID|JyRV[ ߷@җ =o_V?2W8weuT_wΑ/2x)=O s{G9T=-G{"fÇ~>WO̒\<߯{X ;NI>뽃睘侫 R:J}_f|θhR*du{5n(_i6+~p_H񛯢㭟e|G0\k>k_&kbv'wq lg۳~lq04];-|[ywWq{^槾;?MA5O7`nbϽ=}Q7;ă;ft3}|_ 76ȹ=,>X|#Q/$[շXz#/z;,mO>KCdV&v*uoKN{w?r/{p/]y 2<=^fd{Ή#LkMf^u4oy*|p=|֫菋 ]XtjsO\ýov-ӗxGė ĝ'n&y` wYoe 'x۷93wx7yT& V9HiK0]g8mX`t;+`ާ0v^9gt^^moál}KN'xjLWsj/ȻWne o" bċ}\bt ;C2fp__q8,~d+v_Iyp]U~A~L>/O<;+xǰ + N >Rx=5v揣PO\<;~a=Ƈo2u&W~2`;gpݿy7prwY&VD%p)zss#xm;?'~x\^˭_K_s*߃-r]eUv wg(5·_l?poAn&op|-=o4#7sʽZf7at{?P|p;=>m.?g<8U</ pN^4o67spؒ=sOLqJn})?QF?y&Ńl|tK|8=w?G1޺Ϙs96} ol8_r +r߻79}ܓ#zN}=F~z_a͋w ^'𑫟MxٶXwSxb̾E<y$%-Nsȼi3?>-vg=ȍ |A޶)8!,Gҩ :eq{ rg8uG;9#z~4[J[SJc77'Mw}'nTMQ=_fo?§m[=g7oRB#_ {y<=-Zݭh㋔y6W\r~ >0\mϴ9To>gҤ "d1O>>~nc)tCT~/PX,01}'cx'glϓX?Oܷoob~Qp[)bj;ϑɑVNyҽ$\o;/I]؈>?ltZ|a[ kw]Cru _p_dsb{WflOs5S\59N~8Hc,ˉ1?ƒf(Cdyp3?x㥫H{δO_}'N.o b~_y8_c^KW]fwpӼ.~ \t|Ϝ#~''Q mkM$W/*չ;fp;ЏqK8Ə\~)}3IDҰSh]2r\'LuhӲqU1.U- x"W1QOPs n'p]Z},.]cb7{9rDb- K~{a5]~b'fUmӪE\i-ʖWoь==٣wj&QvmO=: ![k6vQw&.ѢbW|KMK*}kS": Ojj~Ee6˄mg|f4 Zgt& ޲zM<^#vܨ1<:J#LG)73F{YY^G]&m@b7P*}b-h|\]SU1p.E4ԦC|T 00~܄EzK[ؙILS1Z{U&vLj]AfhDPF>näszeApQlbS&RG%0QkF.^kTi JfkN%W1Zmf #jWfeŴ;}R@e:MŬaXpK&NTi[0:j7(u8xb NG/ccz.͎ ʖQ 7إ1z-ڦձp nJj4;S2iDiK-tjIw٧bUn)܃Xr*^fDI!B>˶fuǷm.VM#pOԦMQ,|k.KݎA\n}zQNgxt&f@ЅV#LMӧaxRvR2SXijMqK6@fN۴iw.β`XV3qD+1}Agd(W[-^DK11[.NCFlTz>mͤЋP:1F,flۧЯУE:>פӯfjbC^]"QUvt,l⧫ęeJwOo%-t>KPmaw&a7?^Ig16mOЪduLKؠ1([Mìt&~Kߪ7|LJ4MVLV^-.V!VAM9/M\BdžH!mW2LKw f_=ç6p }0: UaMv 5x.v!M׵~MU*>aCp1^:t;&t&Qr=RwsHPg,V#.`t*]rLmkb6lc>G?v mVrgIsi2%ߠٳX" DObyU 켏/ӱ:4>L_¬xepAGv}zb: iVݠ7&V:55vcB]ªimTD?elz8Fl;d36BcڮOjb)/d,6 v ˬ %\@O$tm*FRu^c46~P1Tv6C_il`5 we[:Vb62~ǜ9n 0KE[dMfݦaMU,E8IE$j=ʚIۤH-n˥vB}ltZߣ0D-բU0"V'0&Ys3ߢ+DJAïg'c4N̄`Tp=J^FhfD 5]!WԻ1`4\RAHج/'zE 3Ww1Nl4.ZMq=VߡQ*\6nk`LѴY^ [ƲCU[=qM~ 1F)=qkΒa1ZpmN$TrA;1S+:>Q#Af4mlo0P}Lϋ GYm,6DvIMz-t5N8caIwX2"lP۸6f7ZtBl5+CY!LOk7jci &2e^EoPtAbURBhvؖFg`U|B߱ |V +1]AtpEV>[{w韛RX=$+IG0າו.?|"(1 9+eU֧Ea$0 F<{W'k5bז!)/IW.~ׇ 3$FV箭oFYHݏ<#^jyQ֑(XJ\O)Ҡ.:_[v崶ԏN>Q2P>hCkb;#}s4#?WYN?^aʺ>*sdʺvY-7BmxZz+WV3ʗVjNk˲Vyj>ϬϏfLYs}ừOc#zq8fꨡQ֎B(ke/7(>\=Rb^ b0+bm;;kh3WAW qL#zcXַәLzJ*aʨu0T gǬ[I|PIkjSF^]dFFts@eabuTFJ^3URĊ %NL)CimGmuXF{83:2N%XoJ˯2!qD"H$D"<8}(HRx@:&(Bq(zGǤ76D"H$D"HEwy'ַHR\|Ũ9s:gi4ܹE8c%Z9 yOb!1qv0tlEr2D$ʊJD<89#HD8@ĨI @a+້R++s'`uV'b"'''YQ}8$/"ű zV|O2' J'׉4(jޣX%+q<8^D+% ^-|OHaʼnU" JoY$A:ex'+DD@VzOĠi ep2l X]Aޔ|+m V'njdD2RVI\WM$rr!:J8B,PDİClʔqipMa'Uj?qV_$$;0MҩbJ#v$yX;{ת E)IվeUOwt6ux~Jc҂c̯a?cHjցWūɂኼ'6Jd.r2lPF.]1SJ Ve/l;V|gd; eEV‘JwV]((Ԙ={U,jvb뮻7rwbʜPtVƧ ?Q)~ (mj WA\豬c9'sl B,)1bA4Yҕ"Y/ 봋)\b!A=~w9G8aooU5(hcGZr!+NXQgg` fNDΘFʋ(N.c^'κdS=Zt+ìşC7@_䬈89g.]eRXN>8iDgP(4;x* _U2mBIMmg0zOqt&1&(..&q#&=SaYl,''S*.ޔ,,6Ʋ :&zy9OfTb);,5,ȄV2lh:D-L 45o3)eq|δOr2 C,dHe 0ENVk9!Ԁ @lR1 'E+'mQ]ڏN3^(|G)%im~TĤڤ=`}R Ŗ):$%62o6)/ʐd7hiXQҌ6F|KDz#c; QAVeq%!uBنO{\c`5bO'Isdk;994S̵\g G=ZA(yũ)2}RB(vt&vE7w"̉Iӥ͓,z8voU+٣bbAND{ z.˅I6(y`u}A$FXY3c9&X1f4ZH73l-C}fE!J+MbQfBTeX5FO[ַaY(&PabMw \C+/mph+z"ě#Bw$쐎B(bƣY̍nF!UM0A!MԦ9"RN9趂L=4ڼ@fb1mY,nIayLzoB;gWNSL7L}tK5dܐL'Em:EV1)!cI2nU!YdMA0/ҵvKጅIj$]yf Q<}b7"OwR+hEZ >Y/25ONj33E&*fT+X^:әjH[L`v6=4fLc.ͱ4qO0m5G? ԭ5zZ)LbKI嘤MlgYp2?GoLmsvu |rvF.r!ZڦMymRvkg)I1ACq<0OͶ`MNOSi&i8C ֌ˤGD1=65Muӟ&̄)8˅ r8oݖSɁ-#FG!pQAhM"n&"73A)y)(428ìgq)XP/t9NNydfV,LfPi8ƙoDW 3*6٢O0ٷQ55g( i<: e1Mpt[W5 x.Q<!! ]wW(&ȶ5)CR!"Z\?"K?G.N9{Ѓt kgt66s*U~My2O:͛ٽ{7b7i7?W_a=<`d2lf׮]d29HnDan( )d!{ #lл.~܀Wf۽=OWƯl`cӡ?(YτmcL r0>˞Lm2˖aXQB9 [MЁ6(F6ŧj4\s(O>޹9o8]Bs<7?u?{>vwH+KQkN1;}3uxt$cm5_I\#[ɣ{51&8f?ggqC,'w=?ѡ[H\T6\]ÉhAmc ڃ(w_>C݊8T.^{,)&a+s%{j>k9pB7s]<ǩF<6img5z|r闘hmh=FԜ`q ɳs3ıip~'Aoqοfg:ybL/Rէ) ߽|=M7%1wӗn }jTмʹA0a|by>KMr<#shJ$e vSO&i)N_SL/jҙRT axd<_=E#jM2( d%(ێ}X.LlgS)lnᡋp ܟ+k+g3pR qe쐊BnORE,eYT71exd#1_>.6#yzb+UmE?KwV>څ UOPyzٻŒ+y`\?IN0=OA\x?^Ɏ> nJʦR+R~jL`空[ȕ-&E3wk9z2sT6=D'䈶C3lxŦc?Az$2TndXxVejXEΕ cmYV6rǙA*;I~9uc;XMW"LE4|>ff!8[s{:0/;d\S[٬d^-q{% Q6)M䱺s0g6C'XLeyvS[iG'rCϲx _WUpwp7.-{)L/y{ d۞>u~'slNRq"vҰxn7sŤNpU l_x1ɾu.zKet|3~nKp)|)Cf2[xo' H^a}% țYsޠպղVd幣e`%a6ky]a_\>Vʳ>.#hܷT|P>YSj\5u=ZwF?#.\ķUFa g~뚘b]= e)r1[bǒVZ]Y[UwdIڑQ9a>VP)#:mؕ-##ⰕeENHvU#ec}Wh泤^ף:Vè~XVuvyf2^ `]>վ.g겑4Ҷ$Ⱥg2v*kSFӺHƞgBg:pI{t3l$=e錖 Wu]Yh;i1ZN veXIz(k5ʪ)#Lsau$?ʪWU\.KU1KCUBr;20ct*eYPK:Y]#2QβIˡɅZAцCөiSh*!'^v"M"h5g*M:hi*fS.RJ9b,vk!K.f O)NM֨ZIj ]PTN6Eݦ9Q+Jc,H]uheѨI=@\RovS]2A瑭{- aV}\}YDA{5ze^}U'Ujn^AY9nTE ˉ9Q镉ǻu8S8: Ne-N sȱɘY=% :'ܘvpZotP'8X2P2SSiZREUh6fKQ6+i3V,;eqFFcE`t'iX%0EY4ua(wkjDӛa٪spգ9xez2NqIyƪixJsҲZa(GiZ=2v(jJMw*,u2QS-Q/ T-"Cshʜ*]բ,Q77mzeR7)J̱ܯQpZԚӥ߫aK ^kYg٥m.ukѥWbrUAu:U.1/v|~m^ Rd:T)̔G?s,԰jjCV_2YT;5ʢۦكtcrT˥Xǭ@ kQ(4S_&'H|2jG]p*[mϦ jjԡ٪pߦQ9ii[: b?ۏX[.]V06nH)iV[deN&ed-zaW84h~'n4.K.j4:Mc~Jۢ]s0iPʘv;A'uͲۡi.ѯE,Zxz0r8%&TIEDrPū%X*aS bE-acVIe eUq8ERqk6hmQ8*K~L(0~yjI+XD'9 qMf?]ƈzV^<{A/DWdRvLZ>+5ZipY X]ur| hU957= Vդ121K=ec4V$j}@ЌjӢZ$EX*FI#S&TNhK=aqq2*)wkNv,+=4]_bҬ31HgN6i6;ORnwp]QS8ZwY6hTz,:8Jghˈf+-&h \/%TJ> fLQOjT81yAK,R1+,K؎AAtڧ8fX[=Lqnn> W(PlTQŭhT& c]jK1[q<]61fKX/nE=~EmX&6в*,wZR.QFX]*2f^$-L{Z;E}EN%V1}:MZJ-b\+&IaWG҉e"QMŲzUqKY,Ku˴3=*f5h>'Jۦ7hJ}I:P4M8YjxգeJ:vu+,:ݚYnҫaObVh%FoQ؇,5INDdaU:>tbR];ISb 0Ot9Rs7MJN#-U']:"5KƮX&Grn$DGꇔ ݦAM!L]*K&Fc'i*Z{ =b)yk/v*4Ktj6#ɺI5iiJhG[}*KVzܢ8QUNUOP;tM~0)rvNٜ$S)s٣Z 0h`{2Fn)NjILjJ~=o#"TJǦfjkwh,^lŴZ]XǠ]8j[*5S؋uZ>ZJ'ӥf0:yaK\霠^76k\X]2fZ/OQ8m1 ,5j,,̮nzTEcvj&TENnLC뙜4'h9u:sTS45NXmK]HߠWi'h)%NyUDԺ-GG`wN"eҦCӶʤDpQsoSoVIՒ0h{Y5cRZNA`-0j&nD7Ie Ic>֥ڨZ1|yz$UOk]"KNjGnC֡/1α*.mգڬZt [}2C^ߙ!ro.7>BLWxs{]2An5ͲQ8哔 ZǮ.b4|N):[uUщ(ZSxJ]k1 Z2Ҥi4L]UrۥhVcf)q kT.m6eNGgn@_Uzn;6Ezu!hZ355LNuS 񽘾";!=NTpQ5&"D,/ JqHC>NXdS)i&P^fY?FȸQ:WT4#z0 ($**F: L86̩#8A5cR 4'e@ϚaAG#X!y9W5) JiR*!j1*xEi -@&@Ȧzh+,)78/D"0 )7 JL:e`F16 %@}Rqi]"+gyٔPBrOST5C,BGB,w5SBR^DDBAP5rCF7l7)|MPP{jBGwWb )ԓFM9V Ii6AAJx8&:= 7(Bs]t?&u:LE+xA N?BKtL =ehi2Dg t=zk(L(IOغ>g PlS)z6 PQ4KdI* Y t{,R cD888:Rq3 B&a | cp/D% t"-T# PT0F !?S8&,|T_Ȥ0n(hKPW観z88d+ >㶃D@@ b@U'k 쌂 bܳuAgI"PpU#Hk}3>t ]xġFހ~:5".P"R(O* i /4"莂IJBE{p jL6fҀ+`jYz=|UUR &ydR"|](!!*a:BP!"rOPQD-]i "eM\"-"DNpE MuÈN6hm0A+]{W43A  ":"x@**>818E; "J6r67 z#X'VbBTRD>)`k(!]=XdA "%)|D&vBwC@.U$cHE""(&bfW  {U:=[M!A^1wQZB*@|G*i?o L=xB/P4~F@E1.P x="&P2~;"p )?BQB~B:uA;U@>yHQ-+([D rHG#pp18 u( T8Ɇ.d\ttz8(haI|0Fl8 J0R]Hwsd&57OÏ˦xX1w%C>z zag㼚rHp/@O 5%։ 8D^0 8ԈBY/(J8Q4' "Q/pY,|BE!;h>Ac98$4"Eu\@ P[.()T% DB!H Q@Q}_Y6ӐQ"A_ds]O eӨ;~f +J:Jkn7J( BTQH?58C7eAzHPB'H(JXdG*P<[(Ӽ~LfںVnqE211/ِH$D"(%>wO;ΎD"yNqH$D"H$D" tD"H$D"H.H$D"H$Y4%D"H$D"9 D"H$D"H$g@H$D"H$,@D"H$D"H]"H$D"YOįv&$ iK$D"H$#Ld&o_H$ګD"H$l"x߾ِH$C D"H$D"H$g@H$D"H$,@D"H$D"H]"H$D"H$iK$D"H$Dr tD"H$D"H.H$D"H$Y4%D"H$D"9 D"H$D"H$g@H$D"H$,@D"H$D"H]"H$D"H$iK$D"H$DrCp]8_I$D"H$D]x4=Nt0 ηD"H$D"H$uaHX D"H$4硪*q1EBaH*z)H$ tD"H^!F9:)B!dTD"H^CH]"H$ T8QUuhk64u]ƹD"H$1tD"H^gL"H$kiK$D"H$Dr tD"H$D"H.H$D"H$Y4%D"H$D"9 xݞ!axYPM4m<F/5\%@Ua ^FeE"H$D"yy]Lm0 (;6fen,TL&(v^BaibY"_( ccc텚R)&&&^y$D"H$/=ɫ!ċ^3 yƾ+'Ӿsq8fΝRI?~(رc0V#u]k S4YXX ɼ,m4TU"۷oYEǎ#罒!iCI jEQ( qBg6EIL"e^"H$Ƿ !<8uۮ};8ȑ#S(s(}0DuEYs0 j;v>><ɧ뺸KP} @UF/\.qvq2]t\nx}qqt:8r9.H$D#ioy[ؿu}7TiU0 FQ[oofϞ=i4>s=ʎ;IRA@:\.sm?:L'1"0.%hF'Q (;aL+m=)g _T$'uW]uQ <"Z aF^)L嗫/B Dy4?}Gp x7g{da_?lTG>+ᓟ$O>$b믿kf(ߺDֿtJ3Z3y$ecnnnxcp->,vA099ɍ7ȦMyL^`IqJx衇w]k`Yg PUur!JqqFؾ};o|/1יI D"H$u@~o梋."RT\zl޼o4y[J:s۶mc<UW]|_Du9v\s RTg>~vIӡnsmvKCUU?αcǸE]w=oqFQロbo}[IeY<|_fbb|>)g'4Mz!LDݻ9sNs}M&o'Ns7OrAah$'N NsUWq}ƨ\*e)JU|t:|IwsAZ7peLʞP.~W!mO|뮻VE> _KKK۷0 ygxz+^]׹kx9u-oy rxvɱc׾Fx㍧[7f|<\ve?#7pNb˖-L4M&''ȱcǸشi?0{n .`Æ w};vǏn9~8o|IyZ0xx|ߤhEwG*"J/~ݻwկ~|3\x޽7M\z饧g$?o}[\s5;vm۶qO}yL{VOo||>5_{ |e۶m\qqL<*'>>;4Z8y衇}j߾}\r%~͛iq֭[袋˹; LüM7_v{;vzgy9r{aӦMH$D"< zǜ\|}zE<#Nsc V͛O>'c6lzǏ'ϓJ+e8éSXXXrE`5S&8a055͛errY|'c6nЈH'u] ͒U$EQk`nn5h;ayd.bqgX,2;;Kߧ^fQU4'v܉ik^p3;;K.q#O|{Y'B l޼嗼|$+zl۶mw˲m[gϞBt]IGOXoH 7&4Gaƍ8eYl߾ slvz<&*7?A\[jBp4'N ϳe[oeǎú4 ]4 uBL$BA. p'e#ٵkǸx衇XXXsGѣ>Ά HR=z׻fLLLpeq9'qtD"H$WnӒIV4Mcll EQ8C6%N@Rv2%nR!Qq=J:ϓd, uW}=C44A KVځT&aiiij2qs 8f:0 0 ˑdpT*ƅ u]t]'NW;} r?8q/us!6o޼H=u7otȉ(NGuR^) DQ4ѽ說<!zT*9jiUk󆧥GQ4BXE*: !8q7n|^r1zd2|'"4%mL&C>QUU)UUG>5\Þ={CwuMKn! Cشi @E,--*w~Qa$yǎc~~~RBA\n͉/%qWo?I^2?+މqc2 >ر|3DJ$D"H^E4zwT1|`we~O; 14Mz$t/u&-b0NsqHV /7I<0^GeE"H$D"yyw\X_/R//WjM"H$D"y%y}mN^erz),+Q %D"H$dLD"H$D"HθjVBO|x-z*+Qֳ>φo>|s6>'N,4McӦMyN< SV`ƍ/Hvh6mn:|1jj5a˖-:~;X'wyyF1;wi$jzߧ\.@*:-=ɓLMM1==77ݻn5/U$D"H^8×%Jy{y{__BiǏ8z(袋N`o|<3~nn{7?l۶\.~v֭[ Ð??OO?#x.sssLOO311AZ`6PfJ^T*e\QNis9,//cRrLǜ  C.{wͻ.6m"^l6]D"H$wqGy{Vر0 h> m|SX,N9~87o~YVs4:3?3o,^aȏO|o4}0 qk_eO\yʯ gqq??daaNî]8pȶm=4l# '?I>sr>/M.i!KKK|#\.yz!>__󖷼}chF*~/ ؼy3ks!vśfq۶ݻ /|O~."_җu.[ncyy`yycǎя~y."2 lMU?i=\ yt::t{([ɟIyȜD"H$kģV%\?ߧRz8ۋRl صk۷o/5ž={X,bYQlٲ(HVT*Y/ Ul6K*`tEQq~W CnFo^{-AbI;0[oeoaWٷon y3F>33C|ӟRpWw<|yC /.{[o0]vAO}ۿ%DQC9G>__sa[[y6l%݋mۼyy{~s=^|0*0wa033OO a_N.ggMۿ[w3??V8H$D"e@fýszX$".BN:-B.Z/uե]vo>G( ^x!c?c}cllVŦMG>4[lTIzEIlڴ\.8s97qơ|!|gϞ=w}4 &''i&sdI$D"!qs5װc("Ͳw^a|/Pe2,ફX,b&{aӦME.B0.#ͲuVw155ylٲK/|>a<3z=wrM7177G5\C>g׮]l۶]ٹs' d2.R(K.[q3==-[TUu]TUEӴa\y̐ݻ?M6q^K:'~'ؽ{Y+]q+{ _\zLNNE~K/~/hqt]_pW333æMؽ{7W\q-fÆ xƍBo>6n܈[n.'Ob6\p6l_"7t7x#Qa6L۶fm\veCg?|`pV޽{9s+UUٸq#W_}5tJ'!9Dn7/&''< 2 7n ox{.LOO?l޼YD"H$k0ԒP}T*u.p'j*bqrXK[']4 (kjEQa>>Q7YuN4$Ѱ]g<)ߣy~kNNʝ>i9z|rb8ì{eBtRIhTo}ݮ۶G?]wo{ENj0 tQ\ѓGOz+z^_IM>)H$D"93B*̽t]RSSSk=<{E'zbGl[=iCWpM~n&S>9<10n`˖-CyHަ$7D"H$k0MN}izǔe_$m/*۶45B*q/:R_ ˣR_cY"嚚hq]וwoD"H$ɖ W! }Q+zl6KPxݬT%N;~ZJTU)kET*~.BLĶ$D"H$O:<>L.}|IN816h6J%&'' Qԟ(T*:D&!͞F1l6ygp]I: zIc8z(7o~.FBJ$|>OZ-&&&PUu檪d8pGRd4Cz=qt:LOO( i'}zN/u`&B%3~(y0 xyGuߏxXF{-[Hyr9jO=Xsmnxm\}^YBm2QqN1Mt:}׿Ne~~nD"H$nKEg_%Sܿ~!}Y4MT*/}JÇٳgG9qB?N\gjj i?~ /zgy/| o%ɬ1qq|AZwP4;'Nկ~ 6EԧxGxӛD\{ȑ#\z<#|#aƍl۶ G}w ,A$@S")Y*erOd'Mvdמ=gOr~39ɦl2ؖ=ʲ$K2(HN`A(, @>đcH1^sŽy~v^~e4 * ^:?OvB*hjjbppzb1Ѽ l6ܹCii) ijjb``z j'Op8H$IIIAm<8N~?fH;jLLL`Zx]F^^LLLp)ioo!VVVn._̡Cd t$ DDDpN:šC8l64 wdGvfgg̃2T 999F\\hZسg111@]]w裂Iz=rmR)[lA&сV%55xn޼@$# JDRYY8>5v;gFmm-޽  %%J&''dR\\$$$$D?fnnzgrr@3g0??ϙ3gHKKPT( b }6yyy 333upeqn0r155E~~>lݺvIqq1Zq;ƅ 8z( \tgy"III8dmm'O *%%%,//,7JEvvוj5LOOsU^/2 .Ioo/ ٳTVVohkk#** Z͵kHNNKgg'oXV}6FAֆZԩS,,,ֆ^oopzWWJ}LKK o&"fyWRUU%^_NMM J{ $%%+077 nI, \r ۉVHDvv6je_Ur9X,Ξ=8V9J477>DFF211A__V1‡6a„ &Lo@Srݻwzپ};CCC۬ F#G`jj*^ux<džuZZZصk'W"0O>HG}Ve۶mw!s8~81119sXc hFFANNo===ܺutv`q-v;=GO,&Jihh`aa˅J|GNgg'^/v0$""g}bRSSy癛cuuGGG۶m;QQQx^z=O>$qqqEkk+񔔔m6p݈b_?B"m6233ٿୗJ $==Fb1N222pĐ&;;#Jٻw/cmmaa„ &L0_[>@gqqQxi4)//h4RdΝ x#)**BRݍD"!77K/DYYPoR__ہΐ|{aayh233|,..2?? NN<N'~Z-]]] 1;;0k׮;sNb1؈"%%%ANMM o&;v@*E||$''@ \.PXdb~~^8d$$$ׇdugg'#Q(b|> ł!-- NٱcMMM42M7w&%%gb0B#'11/ejj8&''jnjS0 g&L0a„>UOkk+:cǎASS ~d4 mmm}vFFFGyDرC0V+-qtJ0$##3wX'b \=999 |WA__x^RSSٳgUUU$&&{nv;Faa!۷oLoߎdb=BAII ^8@~~>---XV~?yn7NTJyy9@>OUUttt޽{囒#Ɉ'..LFJJ TVV2;;VIKKCVp8dSTT: <,--1;;^'11Oػ%8ؠ 'T*)--E"`Xhmm%99cǎP(DtFCDDCCC$$$PTTFh4L&ӹ)P z0$22RSSYXX`hhHVVCCCDFFRTTDRRP )++#>>>F#:Tj5FQ H/==b`0멬On-q|366*iii$$$TTT '))"! -- ٌdT…Q*T*l8 ]v122"vN8`111t:^/,,,w^lݺ4҄0 4 رHDww7 sI&PW &L0a]dwH$f@džښ l6"""Fdd p8\v9w[*_}v`0(?RrqmVWW(..&//?fVWWq_x &L0a„ U\.rVIauC1 H}^ H$$_:mD"J%J P?CW< BB1ȿRL666F+jކ &L0a„)']񰰰@;z\*E7;·zU־t*q]?,{~$a%a„ &L0<^}+ӿ6oZ,Y/$xg-O>oSD8;o[{>+&L0ayO>==MWWNV |\zm||F\.rqqq8N:::X]]E111A{{;nt:ccc!JQ,6N/jY^^Shq!lh!㡷h^/---qX,LLL'|sss/TBAtt=X,tuup8:qqqՅH$"&&fS?)C`PvX,}6wgqՌZhZR)&^!#bWWLNNT* "צ&L&6$lׯ_r=0u џyfqylr_^yϭ[P*,--}] ၌owgqu\.HOOO(K'}'w$j|B6J磹Qfgggeea4Lttt0>>A!^ %%JEoo/3pсnGP]]իWٺuASWWG||< 3}3==}WhC9Ƅ=l6|LGGt:AmX,'?!&&F`6E$Ȉ=<׮]# XXXj[oIss3L&1L&vF&m2 JEffk̚gxxX8HJ 233D"ҥK Fe``E!Q 㴷gϞM4A,,,v| |=Z8BT҂f# o wV)H$f}},ccc ˱ZLOO %GGGx<#&&8V+(J@E,܌bʕ+hZƸ|2봴PPPlfzz۷oFCCp977ǵkװZܹjrQ\­[l /ҒP~/&&:vލL&cff^xhVWWA'2D"=?D\. T*eddOtt4nx+++B i^/v!b1nD.D"T*KKKbX~:j̥KzܹsK/R䣏>"773g055Ess3ʻヒ餻 | Ǐ:v;4}eeehZٱcǧ &L0a<>V~~>LMM!!// ?q:,//333Cyn߾ٟ͟@.P(h4V[YYIUUgΜa~~s X,'399墴'Np )))ccc$N"11qD8N^yQ$ř3gضmqqq\~YӉfvv^f3{GGGN####N&'O$77\*V>Jb|||p:tvvr rssQx^q8|s̹s0t:, LMMsqebccw222q?裏HNNf߾}LNN͛7ygX]]pǍ7HJJ}{qa=J0dvver9j\.GrUv!̫??䭷ɟ o>?"Hx Q\\Lff&ODvv6waݬ >CDD줡XƑ#GattXL0dCMM III'L&☞ ~q5D".\ --k׮$%%q!癙ի=z5v;SSS|Fjjj}//\.kV,Xfl6?֭[#)//СClzaC <3ގB* „ &L0_o>UGP(8t'N`eeGy1z-^/( ybϞ=ttt!OPaa!ˬ011X,ĠyXLKK &zswsy UUUXmHΝgwRX__;[tttP__^jp8ϊD"jjjX]]ȑ#lll JHOH$ѣGYYY!..z+W W^d2#SOQRRBff&O?46 M0m۶o}|>FGVqݬىN2=#X,}YVWWY]]l6 |Z-\|||ǎ;. ?Yt:t: vz{{yꩧ8q:Do0uuuBE1:::8~8Ǐ'::zSJ%,.."T5z{{mdgggFFF(,,'??Lƾ}x癙>ęF"w^=JTTwQ*XMȑ#dffxX__gppKNN{edd)D"@ >FsbbbرcNx<ܹs;wj7ޠSXKCCCx^ >oӧO룻)~ZZ?imm~j)((-[D"!99-[th4{9Cgg'ftO˷mR)KKK~FGGQT|'//ߏJdggd2t:b߾}LOO388H0p`xgHNNs%سgN˵izD"$ 2LP^rd2'>3 cxxwyGr=L0a„ ϧL&&&&$''k.4 ۶m$`ii)zo|l  22۷羷o楗^ T444P\\066baffYoh~7>>n'==ef3SSS,,,0??" BAZZLLL@__333\t{[zvMM +++ J*ռ۔Ann.LOO ;w$=={<`DT*E"P(/SsRRô`OD" &eR hZ9vCcs?)((@,t:Q(ر+!ڵ lmۆFa޽H$Z[[j3Z`0H? 033#J`0HDDwfmmVz=---rP(d2znn.Z {1bhh}Ϛںu+FQ1Lzr9$|>`ȍ`0GP( $I8g@.#1p:[`\$0$&&@zz:< B>~JJJzl6F#eeeXV666󑟟H$κ:7 {ؽ{72==M  22򞄂KKK͑KDD L&bsӉf^E sbb1bߏ'!!NKK Ab1r!?@dd0t:F#?~T!ڵkzY\\$))rV+ HRvƆW.ͥWRJ1 ¸`~?mmm099)F &L0a|j z(ɚhىJĉ a__ 76͌sNo.ĵVUU)0k.śbЧ|nb1iiiCwb"z`0(_TnG*Lzz(HIIaǎTTT.\vy'ͥ"(//gff\.ȉH8|0YYYtwwT*ErDT*)++C.3::ʡCd``yqrss-OP*N#**T)++ciiYN'"..dt:pb ,--o>VVVX, ;=$x<AmۆD"axx*njB!L9L&pPZZ*$dbbb0ͤRTT$:"\FKRb].]]]paj..d2dvv%RSS)--x ڹAoo/8pLbbb$55rrrdl \0qqq h4DDD.wwǠKREV\.'%%NGII r,v"%%EX"-xC{uEEZq04rݎN͆fh4p8!99`0(wf۶mש bill$77XLGGZǏc0t m6JJJhhh`~~ݻw JaFFFزe {z)//lR)TTT?OLL={sOETJRRJhD.Jll,DGG366=@0|-ʰ.&Jn0 "|>;*_/HN`Ph×iArssIII **s!:o?"!!B_giJͻ`0Hqq1q&L0a~W;' b$^KI,:na|R3_`?/~23)a]J($(u_a„ MSfYZZ"..`0HGGƢT*YZZΝ;,,,ejܹ2 0z"22RH~twyC}bֻ_̇hoogmmxN'wauuVWWiooghhHhjNKK jK}}=#655z^$J"-..D"all6 j:;;MOO܌f#!!EԄCnic566(ɟygXX]]%**7o {ƍX,!&, ͘fZ- ipzd2qi7UBRݣ2 \pF<ΝC*r%Cuu5 266&w||Vd2111E__DFFM7}ofhhՊ``aa;wp8HHH… B`^VVVjs^8  B$&&nk766x3W1pݼ3OCAߏVX]]ԩSLOO{zz&"fZ[[==fnn?tT*T*fggsPbseeeM0!W~r磭 D||<2!:;;3=4/innfvvVxw"""=B$i3}}}R^a6556L0a|q>OO5ЧYXXA&&&hhh`cc68y$nJF_F,DDD* ACCsssT*N>Mdd$ׯ_g֭BЋ 333tuu155Eiigˬ577˗j(JimmeXVl\vJFFF8ut/[npoK\\P'? oHR===,..Ѐ!22'OP(~:L&N:^'##nl6SUUɓ'vlﱱ1ƄƽT*V VVVP("66.^xRSSQTB=pV{_'_wCCCLOOW^yExY/((`mme}]rrr}6LMM177Gff&VDMM F&m2ggg룵X233H_Ce֜N'DDD0>>,o&qqq\tBN>$ji755Q]]ͱcXYYl6cZeaaALOOV\ߏdb||ښP]`Xp J/ӉNd\.:;;fQYY###B򪮮.Q(JfggpEܹCZZT@0??* twwooq:FN']]]3===tttT*m@7~VWWY\\˘L&l6ccc Dtt4 r5ۉ &''H$)))H$0L!JҥKP(qN'~f3466FSS;wrT*u333Ù3gX,l߾]K ,.."ɘ`xxj=BeZ-VWWᥗ^bppD* 0B:N.B}Y\\*_p8 ++ !? %+{zzz===LNN`ttɄH$bhhUbccebb4ͦ \|H<rbccl8666AHKK ϟGRqrrrx嗑H$ܸq,.\ Iuu5>(j~i 77W \.NK600@BB6 ^{5t:^MQضm `V+lll yw^|=w'Hd2ꈉ̙3bΞ=K Al0~_p8$""Ǎ7z kmtt/ITT2)n7TWW#ɨ`LIDAT~Bf~~k׮Bkk+ T*}]d27o$66ӧO#hii!;;=gކ n.\@[[Z VVVjr-;Kmm-)))jq8PSSCdd$W\a۶m;rX[[#11ZT*?._hիG0%% 0DGG 8EEEpi ~(J\륵`0ȅ Liii4773<Ç~HNNsssLNN@VV*"LFvv6999 Gii)DEEDAAcccz&77+Wj$&&v/2(J.\>X,&>>/R^^Nuu5vׯc68NY[[ڵk,//VƍBuHDzz:-xo *ӧOhfa||W9}4*O ||8??Onn0&NӧOc4%**J~6),v;rh4L&o GJy'x ''(<fq˅)J~QSSC `bb_+)FGGMJJ vy裏P*Fww7=ܼyEzz:=.]\0'hd˖-a=L0a">5Hĝ;w[5\."Ho]]h4=͛7z*@Hng``;vs$ ?<<38p5n7BwT3,۷o'99R| bbb~:v|LMMaZIKKc\.zO 矧ҫ Y[[*nRRRַ%xҬV+SVVZf˖-߿!q٭Jz-vMVVTTT֭[)**"''2233)..ĉ s'ikkc׮]8qB(#$UIKK#//8!333LOOLyy9)))B8@rr2wrl6 -y65p%d2~ETT>|!222x'ٲe }}}߿Ǐc2zܹz Fñcj|Ϟ=TUU100i deesϑf`0pu(--lٲE":D;|w[''XkR)RTDP3= tj_τ>C ͻ:JEzz:1$L0a@ojj!Z͎;"))Ii4rss`0sN㘽[Att4t:K/ʥJ󜞞^TVVO@jj*񴶶hh4@aa! J g^ }}}ֲFvv6tvv244@oo/fYo~~>###?\NDDMMM<466rk7 9{n*++ŋuVtٳ;wuVfffD j .̐%T ֭[ijj`0`4zx<rrrvnݺELL F&''X,Bŋİq%6͋HFFFymZinn&77\.|/!FFF8y$999V%//{L.|>=p0<<Kχ#::Bt:w令z=:@ #`b1QQQlٲXmFUUF"ZZZ8ryrrr6<ڽ{77n %% !_Fjj*mmm444R7 B F0?b 뙜$##۷[oa0ttvv255%|&$pp***0\x ŋt:*++l\t AUU*>.(((ƍ\r4JKK?$PYYD"a***Ƞ:غu+\xJEII n .0;;KYYܸq7oKYY\xh!L`ffFPF|Ċa„ S%sssÇ| 8vFǩL8߳gR;w2??H$' ++h8rǓIDDX,v;jSXXJbaaAPn зоQ*p1$ Z^hDRV%..^OTT)))|>HJJѣ833áC((( ##Y|> 9Bvvo?~taΖPRR"=HRؠFR$551ؿ?:Rȑ#SZZJ~~>[n%77T&&&ضmeeezh4nN#99^OAAVZMvv6İNqq1yyy$$$`r9#{``֭n~?^$pybcc>裏x};##,zdee ;33Brrr'..<, (\qݤp8G!++EAQT#lo>n7T*f3:m۶ G`@բh`0. B ŔjfϞ=OVjÇ),,h4211#<"sss$''裏rqRRRczzKff&SSSsN233YYYA.sQRRRfaaGNjj*TTTP^^Nff&6 VˡCHMME*̱cHII!11iK~~>,--h8|0iiid2\.Ǐ'66"##D azYÄ ay$".D"l6>Ƈ1nŋ,,,ʼn'v?3byu0 ]}nnׯ w&==u^{5?~Z>6"/SZZ{dMmm {~ P<ؘPСC/R}vvZ)k}}}=<ka|lllpI~ip8B(@eeg &L0a> B.j7)>@_[[۔&Iqt-D,--P(HD"DDDXyNХO'>VFЌ`0j%!!ᾼxޥ%!0T*R< bۅzJFk2111DGGo>xtH* ~>CJ0a  7&L0a~;DB1Хt @(Az UZ$B !7.//?/:O~n[Aq8˰[*.$zΟD"ٴ8OOTTM?Duu<_!k0ܽw}8I{P0a„ u ~( zm%qiaK$ SHHH#||{0a„ &LNBN!  =rD0aR~P*  &L0a|2}tt[n @&%22͛7X,$&&bZt o߾ (illܔa,333355E||}Br9===ܹsz=ZILLdyyFz{{ݡ؆YWWGll,+WӃ&~dO#J\Nll,}}}455 ֭[c0XXXի233Cjj*333zP?-fd2166v_YWVV0L_Yggggbb8r9455y}6 X,֭[f KKKNMMT*}%N}!7ɢ^/ׯ_JII jkkq8 ^/ofttxa/knn&22fffy&B6ZR)ZO[[¾k2' ~CccZҟ隣fP*,//k0]]]xaTdBB=(k׮'!!/B]]BBM&L0a„ yJKKrO~BKK F*5c###/~A\\W\Ų~CCCnq8B- ٶm'ODV ueu:ݦ~344,T*`ljZڄq ===L&t:]]]?h4Vz:_ 6ư 266F_'33sαeD">3gΐGmm-vy&&&cmm)nݺ%|wtvv.zRcee2il6ø\.Gj ׇJdh~aͱ._H$0<۹r sssLNNbYYYŋ(JnݺEUUoM0a„ &׏c-## *YRSS;w8Nعs'QQQ477j`yyZ0Fod2֭[9qFsvb1GBvPPVȉ'(--2^ܹBk922bR'֒^+ٵkO<`0ϣP(0رcGjǎ?~~?޽Dc=@o}[ddd׷>^za.]{gΜa``fy&sssۿcccg?c}}###YJ%.\;`g'PVVƉ'HII!\.n#Ɉ4(((`zzbrrrujZ߃nJ<ʎr}2rHdӧOꫯrMx/zDFFȕ+WZ:uJȨ#/"###|ᇼLLLG}|i[tttܳq\p&$ Vs=ǶmhmmO`2hnn&;;o}[|>ZZZ.Ν;DOO<8N6qqqljH$zFGG---TWWk---ܹs5>xwXYYԩSX,o`0m6"##jl߾HvI\\v z-x5/Kv;.]lCVmmm\t ZM 9 $$$PXX^g``zCGGGeee|;f1??K0a„ ƧJg}ӈb|>j??`nni=ʻK__Rb1JRxM^ʳ>;vywͥRݒaŋ'HC>}_%GܹsKD"l6oz|H$9"&υ =zT(۶m58rcrxΗ;H$"000ٿ?pxi~YZJJJX[[MWh  0112~_Xw!nݺEVVZdrrrtݻ|1?? LMMq1ۇ㡻[;N ?<< %&''Y\\2/۷{ﱱ!UUU@a„ &LjsM:;;İeٽ{7۷o'))F^/:d222HLLGaccJEll,N8s >OիWy1B% t:vU:::0L0>>__T*e&azzzlر(N'+++ 1zv܉r />}>dV+yyys<322BOOv3gpiRRR777B|| b$ bLE?Eww7׮]cqqqBVV@B`hhbbcce]YSSË/hdii χT*%>> ^/cGVs!#DRR=c1pD1>>Nww }W]$&&p8Jc2HKKC$m5W*lllE~~> s{bΥR)"Hx<zzz ͜n޼Icc#$$$pYڨZ̤Q>d2d2}]زe 388bnΞ=ZfǎﳸHnn.׮]Eh_FF455Q^^NKK T!9\hMLNN4ȣ>墧ݻwIOOR\v;dffMDDIII\z;w ),,$66m۶QXXH]]B(Skk+bD"SSS455100@||<2 (//GTDž [ӧ#!!aO0a„ &7OAw8ϓρ8DqZ-ϳsNXXXfw^2L=z,!aۑ#G1+++ p4^]]%!!ǃ`@"0;;KZZ%))) F#%%%e*++JLNNT*9v)))eJKK)((`ee(!6?VgFLDDB#NGR R[RP*ddd`ؽ{7) t:IIIb4%>>tF#[l:N9Bjj*  j5۶m#;;Z:{A$rHJJB> {w *HB`֭bZٳglllLff&b),,d޽H$j>tZMbb"KKKQPP@ )J0%%H$g9""NGff&vv؁Zfqqxz6XL\\=s$!!Z4ɂ7))i?sw zVV>Ezz:,..RRRBee%Ç1t:VWWyINN&++K8@,..jxHHH@P\\Ltt4>'x$RSSl߿,ֱD"!11BIJJb0(//'%%$rssl۶mc֭$%%aZ&99YCl69ra73[,^}nnN,Ez0== |)}GÞױƆ&L0a„ 399)8˅\.GnRJ?B~SRH" AM -z->|/4͡yI B )//By}ik&L0a„  .X^^~zx^! ۍm^jD"`L~I<^g񰲲rOmE0ex8Ca!&Z!7e_ &L0a„&rޯ"# P(xr/K.Pg6$@K~?a)_G{0a„ &L}^76~.ׁU\.{`0W^PO>88HMM z~?uuutuujfffW2;;hdvvV(e4YYY^4 2ZHKK۔7@?111Lߓe3崵Q__ 11Nuu5vN'7oޤCȤEmm-ZJ| |2:͇~( etA<44č7`0 ͛d27<<,$ eFplڵkn æ,!08&<.M&wgq댍B۷oh4Hgg'* Hĵk%11&d"33T*dq܅ p::'ϓ7oCZZڧmmm$&&~߭+r7nܠKx>hΞ=h4~LMMqu&''gxl\\QQQtuuqMR)qqq»Ғ&kjj---444Fd2qURիfaݾ}V4 *jjjzV+/_b`4ؠzd2:i._h42==Muu5~"'O$ N&L0_!'!Oʍ7|L&Qܼy^|EILL$::^zTnOO&Hnݺ֭[ܹs<#n}rrTTT|A0\|JVߏnj8"gϞ%!! Ŵcزe b9(//_&997nH||oDBGGLNNvijjBR %bccihh`xxXֆdqqqtuu /`0PT477388N/ )p$667|RΜ9Caa!QQQd2>Clׅs### Ν;w>22BKK  233H_WVVPTl6ƈ¹s(,,ܹsoJrr2aAZ__˗9rVcjj χH$bxxN'|>:;;oJʙL&C&p8cqq^ 444088 X,&>>`0TJOO2L{VKOO?1 jy)HhllaoC?6׮]cyy+dꫤ`zZZZ$''>FGGsJFFF8N^.Ν;hʕ+122BLL ===XVz-nJ]]G{{;UUU;`6ZH$IOO-[͛7$&&rYz{{ 11~ضmFhhhh ,// {졺mƩSP$$$j/~!Yb>twwSQQ!$nYYYA.Ȉp8X[[\J$0LzFFFybq@a۩a6ijj NNcyyyӳp``/k.X:;;Q(LMMӧڵ!P*DDDQQQ,,,h4666pDDD000L&DDDCCC {gCCj!-V͆frEvލT*IDDfۍH$140fSSS҂Fa}}VFGGx<ݾ})QT ψnd29v^|EZ-###8Nfffhkkyguuu5YYY:u FCkk+J6;22D"ٳ$%%q/IRR k}nn7oDP__hW_%==˗/{g\.QH$oMjj*kOcc#*(_UUUTWWO<;a„ y O=Jy"fggjl6z=[l&Ů2EEE;!!̌pB{MII X̣>ʎ;D&޽{A8rYYYr$ 'ʃ,--m6 QQQ(J"p 1 Bb1UUU<ĠT*!11'NJM PՔx8|0vHēO>IFFyWX,ܼyr[n*  |XVj|1??o0&xLj)0L( T*yyyt:RRRjIrr2DFFR^^H$baa7|XCKK$gjH$ljrqmN'CH^u䣏>!p&_gqqũShjjwA*rYnݺ{"JqrDEEq:;;9p"JfQ__OOO`UWW U ywh4t:.\yN>iii! 2??-///+v,..bXtZl6ߏ刺T*`~DEEqiz{{YH}d2;88Hnn.< ;wJ"..hz=111Ƣ鈎&>>ݎh$//vZ[[1 8qhz{{yx._̍7x7DLNN011l޴^GBB¦u$X,?wA$EBB]]]|Glllp)l6h2t줽5>C/~BWx7ʕ+l6311!)99#GBb1?cccz łFarrz LƻK__rfqq>z-8ꀅxLOOs9VWW i||<3338Nj5<#;v BWWzz JEkk+<СCL&穧'N 77vf3f߾} Iyy9O<v4 'N >>n9vv^v?bN8B3>AZ-YYY԰{nDGGX6]#!!F#111TVVRRR6|~׮]c2O,sAQ(ڵ I[[ۦ@ lf||(&}v222HHH@8Ad``7nPZZ*HAPLff&===,..xR^^Σ>zuy[ll6hgqqGNN?яrqqQ8v ٽ{7}b1@@V)..TUUa4IJJ"//rrrh4MRR|"9pvOVVp>==r*:999K^^<;fvv{y㟎 t7r#sDQd-{czfgU[-o훭]oojj==N%Q$&   2D@4BKDp?U( >>=9{L&III!J ¼Ģbs3lc%McL&[wd2$ɊvbΟk7v Tbm?{H$"#f3IIIbZٽ{7R\.Ν;չpo&III1~R(/hiiAT277"nݢO>^zzzhnnfvv_~J  366ƕ+Wqdff+u#nb``GriałG6 ' i?vN`0۷lFP*>|/q^h4Jaa!wvnD"WUNڝN'lذ^OVV;vX¼\tw DžBs#sss uVt:hZ^y$ MMMdff>gFZH$]ƽ{H$ܾ}A޽Kww7\v1R)~0`0hdݺu\~ 233GrQSSÕ+W'##XXXx^NNz6oƍF={vfc``@8ZZZZǼK.qܾ}C4%;;h4JCC[l޽{,--T*%>>E{{;6l )),oNii)ݣO͛7{^^^.h%ƩR0 Bh4J[[~JKK \~#Jinn^avZ9xmr-\~!nq{e۶mv:g֭]xذa۶m6l6܌j%??"ؼy3唗@YYk֬ 1fKɓ'ijjbͬ_:N>Maa#YC& ۷0.#Z_,--zcÆ 8^xJ oooyI9w:^n ՊlfΝBvNNJJE$$gzzZ0R)eeeX,RRRؾ};j4ૣ?c~~^ B?/,..222"_vMp#{b~~-p-Ξ=h$??.\mp\xQH$3;h޴i8qƆ p8|`vn:vM4evv,^~ecqq^x"\.KKKݻ"rrrJꫯ r$$$BX HKK”FtD"Y,d2nB1 )\.'--F#fJqq1[n'))W_}"\nܸ< :FCzz:2 ^f#33@ LɄl&%%VKzz:r^dBPP^^V%..<ٵkyyy+DX,X,L&iii¡Ivv6 HX\\v/}F#a0frr2p;vR|="2m&wƢ3V+$l6nx˧,++`0xسgpFdgg Yf !J dggh4Iyy9999XVHݲe yyyL& ;v@VHMM8T*;v 55ubFe۹s'k׮ETuV zW^y PK_ d"33 ~?~!m&va6L^CRΞ={0 =NII!%%4  f l5;;K~~>{Gbi8YYYB ##5kFX,KDQ4#Bffr[ӋT*rrr(**2֮]h$==LNN]vQTTD~~>~2֯_/(L, t233ƙ&x^ ɡTJjj*6mfNzz:L&!r#;;kײH\\糴).. D=C|vv\t:( !m޽T*lBddbqqDII IIIT*nJ^^,--n:!jǎdee%ǞX>n';;]v < q( *_|\T*6m֋~"dff,xw%7łjEV/ sfæ@Bˬ,݋f#>>N+BJJW^!--||>7ndݺudggP(0ͼ^Fҗl&??Ν;),,Kl6/ '2/YYYXv-6m"##C{1ddd}MMMe t &&&IFFƪ|(9!$ vGiisUn!ޞD pވX(gU}zzzOMMaXZuyrr . ݻ~?GerA._,xl6^|?"w]D"\~>! W_@5;R}~~^оqm!ZDLww7&r}kk+hN믿.R|jvT*f{D^^s2>Otc~q8z j?u!>un B}A$nc2@?' pFY^^\rZgׇVWSx,T&h>SzE2_" 1}KE0|"ϟ3yH$a{^~3 ظ4:B]*>ua#y4z5LJaև\.:w>uEDx<<<,H)"""""i# >uD#z4ET>sq_wC?B? V== ~$ȧg qlz',--v7>,//?jDX\\|ȉp8ykO|0k/D"KKKc4}d~V'zEDDDDDVTqŋbZ B\t  s9`ddjfffvS]]M[[D".^ȝ;wU]` T𘚹R֭[177GFFv]Gl8jjjsqqqL&ܹŋ1U{rr2;vV0iiiLnn(J|22 H{===\paҘԩS455ONNMMMՑ&Ml3=<<Ȉl$Jƹ<>ɨT*nܸիW r}.\|>bRڵk+cLPӧOr)ISqmɛo?4yffCq'OOOMvvns=Ahmm%))C>L&L썩Z"\FFFz`nn^, ~nܸ!({3~~^/uuuܼyP(jettjZPUUESSȵkאJ$%%QSSõkhll$>>D%}nnnNbUpNSAa^*… twwc0+vE&''?w_1NG8jA\DDDDDGQq@=Mz*`FGG1֒o[F᷿-k֬H$Bww7 _NqqPOӼ YFT2<>7o288H8nL&+t:h4>==B`ll. Ǐgǎ:ul:ڵk߻wbہPr9ΝgϲqFT* :::HKK׏ǃNr\/_޽{$$$PWW2SSSdddt:|2CCCf|>ܿQ#Hz:;;֋NCT |W\޽{šnhh`pp`0Hcc#===FZZZlF ac`tt hooJ^zz=t:q80 tիWioo`00;;Kmm-NJkk+mmmy wU:;;ebbVAvDBSSw]$$${^ʕ+tww3;;K||<  HNN?F~pc{n><&9V+ܾ}v 1+K 4?~R;&^zΜ9Æ 8}4guu5=66͛7'Rv횰i4Z-uuufyyYdOBVDOO 5cz?uuunf3--- NMMFFGGIHHXa~hjjB2::Jkk+t:$&&r] x<a~R)oݺŶmۄO b._Loo/8Njkk" u>^_Ӊ`  tG֮\.ns [uBDDDDDG1?ЍfZfffn7dddŝ;w#Á-;wfT*Z֭[Ekž={ 2rssnشi KGkk+P:1BT*elٲEq;88Hjj*G1::ڵkWW^^.|&>>^{rطoM6ذp8̑#Gz477SSS#׹>rw}a=`@Ѡp:8qB8Ƞv9| }Rk.Z-:^L&Em2vc޽۷1:;;K_khffcǎa0ycH$tttpUѣ'_*V֭[v̙3TVVp8Bx<^p8ѣGB @ee%ccc8tccc=zT0XXXĉcZʢ60ΊfJErr2999rt:KKK;vHIIպ:?***jw;$%%qubff~N8JI:Fȑ# 311իW:tCqEn7G%ŋbpp^J__R299)*jŽjXV2228y$###B푑***Zŵk׸wgΜh4233@[[Cq سg5h4XV"%%^/Ա~ d2fddlZ-5ks=jjjX,TTTǑ#GHJJnٳgqv;'Oy)x;w$!!N'C뙝 樨ӌa2Ͷ8/|oo   rj5r7tCCChZ1233C ~<6/s9_?n7bӦM<(\z(;pXx4|ߥ[nq allLFۇT*% DBH} K$P޽{ŋ>T h4J~~>%%%ܺuNعs'ׯGӑΞ={dbbﳰ eǎرNHݻ)--;v$###}van:av>~Ez=DawVehhFZZp2ŔPRRӧYZZN)++[#HgÆ D"愵Ìyfvf3d4 7hZR)cddx/ %w^d2qFRRRH${Ν-q:88Hyy96l 55JŚ5kXv-sssA_8F"`05hZ(/_f||7xCT*e޽Dd~~P(JbB>77' `Æ zDž>TG֮()""""E ^tcǎ \hD.K/}vөdyy4wZprz{{~L&cxx[Ν㭷"..4h4s޽cjj %xsb!?π^Tꢳ[n133__PPP\.GT266ٳgx"] V(ˡC8{, AJJJXXX#yyytuuAcc#3339r*J%CCC455+GtwwsM#cչJr$ RTx+))EǗd j:NZ[[ٲe :̆ J͛9³ؗR$!!Aid2῱{[+n߾ٳg*vHOOG*>˗B* h $&& Q>N[[?OX\\$++ Koo𹌌  6>.be֒y<@"`Z)))I222gBBY& vZT*LMM @Z4(JX\\DT*Ax"255%Ǟ !P\\YYY̠RPtww(,,DۋD"AV0all 2xnL&mmmO EFFKKK#jdeeK8`IOO'##cE $ k^V ep\$$$Fg12k`{x(--% )@c2|L&Fv)ۏY֐D"A1==Nikkcxx^na/ǓE__`q\9wٳ۷O)v; Ǧ+,--* ]~=`PXk֬KDBB`P8)))Azf0v/]D{{;v"++$r0LQZZg6w&ByllLCwX,dgg311![#??H$"c)((ĉz)**BׇC`6::*PRR",(JV+:<yyyA0255%%%h4(2 IJJ|0077Ȉ8h4Joo/d2˅뉈|tޏFT 6^4П'WES}O"t:te^xI򰁾 E(Zl+6m9{,۷?+a|>.^EEEڵkգ0:SNvٶm۷o׾'Vz477+]YA,]g`` hll"^{U N>M~~S^Ξ=,^t֮]{?::ʭ[w\""""""4x}g$..5;O3h4G",S)$$$|"%H$ǞF B>ág]/qqhH$=xO[s,';RD"pcy={?ADDDDD&z4#cBF H$B@ sy% PHȧ]mGwyc:yvnc5QL)|"Fl>$sϾ^k>K bq"OT*+ |Z\"""""_DbO{FQ*B."n0:H D8E.?:0 <^t ê{DX'nEDDDDDDDD>=x<>h@,//vW""bX"""""""""""?}#HzB!RRRhkkܹs bZ ={۷o^*AӧO311AVV*sqM"VU%riINN~P(P*\~ .055EVVsss=z󙟟ٳ444 ˱X,444PUUErr缰ÇX,,--osBPg[[gΜappP]{u.^@jjОd"))vΞ=K__B鵛7oCVV/_իx^Rl3=::ؘ$JffjUahZdj5\|%222&##Kee%X,Q*f.ZG(Iq]d2GPj< qh4455q cbbQ;FOOf\gg'gΜTfggywiiiA&P 0Z[[9}4G((""""""""rD"~?2 4Jk׮ nc8<999%33T*oپ};mmm~߿jrmF4eii3g56IJJb||Nlē:;;KVVT*={${;y$[l! RWWGJJ 6MP׭`x<]+BNNZY~388/\.'`۱X,ttt077RԩSر*d\|Yhnc6a||͛7cXp:ܿ^xe, ǎc͚5$&& d\rfz{{q\\zVL&.\@GGccct:#P__O[[F.~b0jގh\ca}aa^ЧJǩSȑ#lݺv"---BMVd2lڴ*6l؀Z:E.^Hkk+ B(577GOO333t:ZasưX,477#Ʉry1w)x@x"oeeeBYq1͜9sݻw k/ P(hllv#Hhnn楗^"''gŦrp:x<<HD7dǎb6IIIYQ t099VG\\ܻwO0caap8Lbb"~.TZ-L&cU Y~=R#@J$lBvv6 ^^BA4%%%[VIJJBRQRRioo' qF:uuuc˖-$''vZlJJ äsNhE{k֬D"̏fcvv^z$mۆ` !!ᑜp8Lee%rS__^ܹsիWh4r)8{,zf3@'O@ff&TVV299I(СC.vφ J$''c0H$\rEm6yp^xv===w^rPӂD"FHHHΝ;r5@<,..oRH$~_PYYVΝ;vRSSYfsמ"VٳgW\ JFܻwVL&ӊdfff!55U8,Ah4JKK NSN)8ڵ4W{*DDDDDDDDDJo|8pBիWtjV+O(bjj7x&&&C>;;͛73>>2J}7x㑺ʑH֭[)((7 Bd2gƍF(YYY2;;Kkk+T*1LL&XXX  ,Y- O&o|CX]^&''ٺu+V1 ,// 'V>Op>N.Oz(EEE_zغu+.]b``]v/zgn7CCCFa RIBBiii{OHRz=7nJJJ r|B룰|_ʕ++4j5WlOsW,:JDDDDDDDD.\ߦ^UTDQСC|>(JV+{`0v >>1<ȻK0|l~3gxw tuu}E"~,8.]DWWw޽{ ܿݻwikkLNNoqFz=IIIp1*++ʢVիܿCqE|>ݣo~J%B{7n`rr#Gp9~?ܹs"g?caaANJqK$ PrM.#HHR$ ֭Ν;8qyd2JD$`ՊB@v}6;v@Ւ &ռۄa:;;IHH@. 񐘘9>o~L&`sfggfffׯ˝;whoorJVYY(J, DfggW82L d2, ={rD}}=zOHR8p###B{QQ7⢰ax~:))) ra mDh$##t222 \j5op8YfBDDDDDDDD}HઑH$v|>255ERR999ѨRGPX,3>>$餦\.p8fʬL&FGG b6}vj5nFGOOpXrCdjj DBAAп)\|TJ^^'55)j5 /SSSLLL`0 1==LM%D$ZD!P((..Fbh4j&''IIIaqqDB||0/`'x^RSS|>NJJ sssL&\.j@ T*}$ 255jeqq yyy?#`֭rHOOh4 ^ hl\.V#_$33S sY3Lvd2zJRTP* (BDR^^qiB~JjjjOQAg|1>@>^Lq\(ʧ*}p:T9h4J8>+|\XXX@}`ٺOh4<RXpXHWxgp?% 2-&d,//D|/H1q^c@"<",׉}} gA"-{qs(Z?8?u$y>sstA\m!?/$"""""""E&f=-hBB\y qVh(B?*ܱOڃILL\X="=b>u+""""""""v 3jw3diifW(':?p8ܜy~ӟ7K("%%~)HLLh4ɓ'féS!;;Ή'}6F})U`0($Џo399IqqS P(P(\|s1::fcvvVnaa!v _@jj*=zAznn7|4OSSpLvHR(TVVr}PT\ts ?~\h zzzHOOgffr5… vB*#4sss466b>̱ujw'OݻL&4 ΝҥK\.f3UUUpez=`Ǐގj%>>XXX ''DAV(%WYYVJKKuJVyx>::ɓ'ٰaÇlذap͛7?I~mطo`FPpY^y*++),,$>>7nfcqqleǎl6<CCCܹl;Fii)z^T*&XXXh4>}V>Nss3\pAr Fuu5QZZJJJ>\.'11Dq8D"V@:u RWUJkD"q[lARo1jJJJۿ[_N'u֑ weBH$ٸq#na|H$bffy!*eƍY:Y\\Lj5ٔ̌IJJrfJKKQ*ennYvpH`͆T*yHHH 99VKII l޼g2;;Wu==/nJCClڴQXVfff(((fa2l6zILL Vl6SRRFA.T*"TJ0h4׾5??088(aǎܿGDDDDDDD &VWW3=={`0ȫʶmhoo#~BK/AWW~^ͥ9A}}=;w|j=_9z=t:줡s֯_Oss3/"ܽ{ݎf?!N)֭[,,,Ϻu0 366FRRW\bp ^`ڵ444_VK~~>MMM@^^/^Eyy9---bɴHH$!JQ((Jgr\Nii) p8j$ aL&D<޽^r`&ϟȑ#߿;wB \Ncjj ņ ꨇB!J%#;;?a0VxcZSNڵkQ*hZ8C&!PT266/JFٻw/׮]KsXZZbyyh4L&cݺuOxяY3LBu8Fדj4 x<(6 RH@bb"cccBifggC*%Yv B $N'vp\,,,FX,X,v;ddd^iݎT*%33O0F$ .Qz=iiiHRfgg%==](5==`@Tt:(J ~ZJebe0( |>ih)V+~ǃd"099 %%EJH$XV[XXtFFFCB8Rx$V1\.q\LLLV1BKabbBH'Dfgg1x0(Jt:~@AAs_OϋAJ왙F"`6=& BE X,$%%177d"LMMDHJJj2<<,T311h4bZWMDDDDDDD訠~bAaEdϓ g!f 'Qv\TUUvٹs:Yaa}5Si0B4%>>_]{R0.\  4Y矏@v? ^g!6wq\=#D( Y>qyA||3 > h>z,O7b_OK$TCDDDDDDDD r GrcK[RtUЇ۳yK""""""""_d>"q1A\.G&=);E qOYF.#H>qO2:nUCܽ^/ _LAt:'e?^-sȧZr1??Te֚}6^{ \Ι3gx<۷RZ[[l6|.0L|k_pp9{b?LFYY/#v^\.W_%''Fp===} ɱcHKK7`vvst:ټy3;wʕ+oPTT'[o~T;C\\7of~ illD|dΝ;Goo/7n_7oobn߾ͭ[P|k_ciiJ^/j\| 9pI O4꫟PN\T*W_%==*K_׾5A`Zbdd;vcǎsettJcc#ddd|566t:y7V{<,--ꫯ>^ӧgΝlݺu,""""""""?oo$ ^P(DJJ^__O4h4ʆ 8qJ%7Aww7.ϧl^kFii ;O^^󴴴}'EPP(q \.:::ؽ{7`$9z([nEDJJ 6@ 3gg,//sm^uPՌray饗;rK. 0L455,WTTCCC޽bdΝj 9vzaR nݺE[[un7?~f߿^^0466>ILL$..g܌^_ձujrs\to~TVVEEEP(DSSfn޼D"W_}'N~z4 Z9N'OBAkk+VqZZZrssWtwwsiIMMp8Lww7NK$OCCCdff ".\ܽ{W(1[;F%;FOO333dffę3g$55K.QWWG$+pin޼I\\PWWG("..ǏPJ0JܜP7znn~ҥKdggc4ƍ?~HYYYt:H!HCTJzz:Z2 @FFZ,f`455R(++#LVVuuuTVVxr v`0h?77WGVR"##C #ԂE.g޽t:JJJ1c*F8,N'===YF Fкu~:ܾ}-[F^^* L&lٲ <Ç *ޫEff&8HNN& qaj5LEE011 ذa `(++#..UH$q=JKKX, E}}=.˗/ JNW^l6_˗/cZ񐗗ݻIKK>F}6˗Q(pw۷oΟ?ϋ/ϟRs144lɓ\x[nKUU477}vhnn^[1115kذa. ZMgg'?tLLLPPP@yy9 BL D"+_ *+ىd`0C sss|ghhMrr2weV~ۋnݥ%9dyp9raE"?#`Phnn|ߧ;wD{{;MMM 8<Ț5kغu+*%~?ˏtUܹ!N'eeeܽ{Z?bJJJ$//|0pT$55\A*==,illp0==L&#>>V,. TJIIs]rQz=_G.~h4JGGccc|_'''4 %!n D"῁@P($xE?I(ڵ+W̎;tü |[tRQQ>X,HIIaaaF#(rT*ǓjΝ;wp:LOO &++K0&e2FR)_ܹs|MOOt: [ᾬ[R^jXVq\nR)III3;;KVV8NK/^]]Ӽ+,//t:Y^^_g۶mtvvP(D~~>###nx饗ꢵAFF333\zULG=wOf޽ܺuK~"կ#>>d8s ]]]\~įk+AKK 333dee\.cttׯp8(--eÆ 1<}>N' x$ D"F#N$^/uuutuuZuu .PYYɞ={y&YYYquHOO'==Fؼy3\xDYv-/~f#==}\|>Ξ=Ν;illd˖-@TyOtsss!J Ô^x~`2طoMJJfttFa]S[[^'++KFl-rj5^x/& =gxfff~_ė%H$D"J%p}QSS%;;2N'X,7pgϞU]k'v̙3455c ?sa~_T"""""""""m$CH$v|>vtX,(JV+2%IJJ`00??z0ARSSH$LNNFIMM^^/^$DX,'nʬzFP(#t9,,,t:Zt:=϶F!355T*jcx8NJ%G;0LL&\.vłVeffӉT*l6p:@RV{dRB5ÁN!HPT,.. ƑB1:;;? AfffH$jz=sssA, sss,--a2?^/KKK$''3??ŽpV$$$t:tILL$11)VxL277`0`0p:vq8?~|; }XZZbyyD$azz`0Hzz:KKK0_"""""""""-FGGvQ* U>@55bYF_}EHz8ҥK#Hf޽O%tw ߿D"!%% hϓYطoߪ }\@_"""""""""$ 333(2>(R4H$aBJ#K$r9 ♮YC"yŸqu< 2 Bz"OGl^OGF{Zk}O$JH$:>~DXOz݊|zV= F +<>hH$gH?󸶟X~?ؼ999_!֭[4|>E(o411???9---a8r NZ-mmm:tF#Gaff4***шwΝ;fx"ϓD"VWTTTxhmmڵklڴ˗/r8wBm񏃘Z߻ߟ1N<ɦMV?qy6o޼cp8֭[Q(x!p=E/ `P(.VUU 罫w}P(u^JUU===dff~pDDDDDDDD^KdG*|Rh4ܸqTJoo/qqql߾GG֮]Kii)J7|ܻwƐJsUL&7o$ ].xr͛7s5d2|>ؽ{7HՊfȑ#lݺ@[[)))l6~?UUU~z|>ͼ디Rx'Odaa_|Q0$ ׯg`` R)׮]{撞Nkk+l6֯_0⋔ݻWH?8wk֬d2 J>|7orp႐+vaܹCGGÇG8ŋ }__o& d2hjjza=PRRMMMf^=Xn6m"//FvSؼy3:ׯh8v۶mɴ@H$\t/Iaa!\r5kՅT*ettAZZZHII!))xzoHRjkkGP8z(---2>>αc844 ܿ `||GFall Huu5 tttm6_΅ f8ԩSܾ}N,//܌T*eyyYX[~V`0(8.]G* (..&##+W|t8o>#== n߾4r=ʶmxW8p!9x fyΟ?Oee%ghhP(Dgg'>Lƽ{8qjL&n7DQ6nٶm555ܼy@ @zz:\NFF N' 8N222󑑑AzzP! W{<<.H<|T:Z^5uO۷owyfn֮]ppRDh4&,R)\.+ z9|0IIIhZG211\.;k׮kGDDDDDDD %_pa򗿌abbWUnJOOկ(**i222x饗֭[LOOÖ-[>կHJJ"''v'''9ϑHwϣVIHH 11Jl6?Rjjjx׸{.LOOɏcD"[1!xlٲ\ BdddpURSSqMMMHR(++jimmeff,jkku l۶n_XX<^pTD"BWe2 j4 ֭^~^_QwZՒh$ RSS/ݻwq:x,ǎ\rZ-ϟGӑh2D.믓FWW/IOO'##C~4%;;d>6mBӡjҗĥKdt:]BBgll<8  7N^^󌌌 HNNfdddPXX(DuhZF#_WPy۩h(((* JxJKKټy3vUR): 8sl޼t:j.\j3+)((_2nrrrx_|\.\K/B__h4*DرCJR[[ӧyr k׮Ӹ\.l6FSN1557XB#q8V"RN'nV`  277Bd2!J脄p\nA+` $''T*YZZp$Czx^L&>9(j'nʬD" ɘ%h7 P(HIIvx0L`!..NT*%99YB!g/g>u >jh%?ʹ4Ӆ~?~D"y8# 9ϳ1#DV?{|ֈ[R}['HER=q3cD>k|D>qW3vh>!"OG("<"""""""""T* O-b%&  ^D&vuMFBgk+v]7  ~ʑ_L}~cs~{g"P(b\O 100 Cd?O[X|("%%[nQQQ;w0,--oS__R$--k׮qqFGGƍ8qnrss㭷ޢAPSSƍQA!~hha``m UUU9sN򘝝K?6l`rrCqe<999*ԽENNNp8Lvv6;w-[ ɈFܹsT4 Gٳ8󩩩᷿-B}}=ǏۤGjjj~:\x .O^^JrŸ/ȑHDPv:f~P 066FuuPVq{։Vݻ:t7o@||</_fllt*++ɓF\.$''9s Ofaa|VZF& mWTTzilllݺ/rHMMxBc {pjȓ9y$B \~v;fX[pcǎa4ؚyQy&vhСCܾ}p8͛ EQ'N 11]L݋P($?NbMX쿋9rQ$H2ccc,..r-yD"D"xwEEDDDDDD>\."cf~?24еZ-* '!!={p!RSSy뭷(++c͚5(Jz-^fggBTf^kƦMLLL~R = 000ݻj6T5 ۷oTڵkFtuu{n$ sQmۆbdl6˜>}kfT*}}}={E^|E! ..-[&&&hllCee%6<:;;1Ll6 [lattA͛x<Kbb"P/RVVh-H͛7uTWW#JH$Βo͝;whnnh4?0/^ƍhZy뭷2eܾ}VKJJs_2rijjjr 3gPVVƶm(((;wrIvMRRW^EVsIoNQQ& D"ΝƍۋL&Dcohs؈RۘfjlLLLϝ;weffLOO333={'OLMMկ~%bp1z$&&_^!..O$))oX,n޼ɱcHLLPQQA[[YYYPQQ(NbnnlCJ&&&HKKK.@BBc=C~A; N.Keɲbٲ۹]Z7+uW).-YdJDwA BD~3@>Β%K%55l#11q222Q/^B@RqU6mڄJjUgffdMbPQQVettm۶QSSC?}}}:uoNKK twws}QXXȂ cb l޽{D"$$$[o}OJJJ ^.]Jbb"@_ h4N~~>tttɍ7dttśoo>.^OKVVmmmnrQx<\~ABTR^^?bڵkurr.֮]… 1呝Myy9UUU8N.\C=hsrx'8s s}155x<7Ћ`ӉRDVj% c~RIWW555|[Bղw^&''q\iMRP(L&Q(aINNF4QPP}v޽{x11m|4%5|2(T+QiT<_4B*C[TWy% G?[9 ֫Q>p !&G*U674_f(H ^|Q#pKSo=U)T\;rX 5r~)! pw||ш Qm /mc5Rh.g1ve&(J52wqhX__#*D) j/#######e'k#wӛB  0s73Va0[`24H`䓝狆S)Fo/\0 ش||!acdQjp  ECE/s{jcz;|}/?cO\#ߔiUZ"$hUZ %H tjwj=XDTɎc"bBl5QLjT(X Q"(J?X ?H@jJ" KmS@T"RrQ*YNBV=}p4ǿAbBDcQB* Z.L(BԠV FD<"ŔIk{C,+PT*Ƣ;yS 1 %zRI,# TIc(it2f+ȷ@ATRfOJ*(Fܸ\|c LOsC#՜JdFa1:TLW< qL>T)TĄGWVw_7]sdeJW VQYJ⽶<>qj-ս՜;H_km{YiK<ɦd Z./̢g0k ݼ`$8 <9G|:~s74 5!okV[c#^R;%o  .h~5 jzZqPԄ"!*-&tܸ\^2E;@1#(6PLoRlĀkLk&L?szF0p3S>(7Jb;s f'q1!6q]牲'8sF„Be,㽶0j*lQ!*%qZO 0iM L+v&0YTI琙A na]:&|t;9~8XRE$!JJs6re S)jB)݃jh,*xFA'&(5ĄtGx\.)JRZbBLZ+ڨ6bXY3gIDža*2*OPYm!]CPdٓ,L]H>~W?Í|qog5Nj*`5Duo5+3W~Ν?DZcE_8u1{NsI6mFP8xڛXt~XC*{+eqbq QgdKLfYzrm`A.5Sh3.Ă'X2/r~gYx}<-c-4 7hl̋ /يp<4!N+JzJ5A9GA9q8O=9=jO0yiKTTlJGO=܍hTz<|ZnLݠb'sֳ5+Ts*\~>'OFRk;#:Ekys[r㭳-T*)}lk6Ǧ4m)җjJV>#W#'.o-]S]QYVlYlEqRL)<&ge&k {ZH#Ƹ^i8D^g/1!F>:+KӖRd+͖7ꬔ&2;H6&sɦdz<61lFQ7XԵqwo|i`A( S:k5a05}5,I>"[헥|m!*D9y$ʼnK#P!vBRRaiR2,B>4J #ANvdiR;5amZJKCT7ZJ A@D;*1ee8NƼczqfn2P[ɪUXuVPbM'Uۣ #######1mMQ yQ*raɉayrY$bN!"Dxlcd3&{ %%dZ3v2s%Gc1:+/xwЍ+ 's`9D% BIx+H ĴGI$ӗsu*΀I$GDnʨwI=7p ynsXRؔ3=g֨?XFݣ5fRͩՓlLf3mphHuN_#8Ũ6iEXKӖR[E,QjqgBI~B>=.,: dU*2,[ٜ! />}TsֱV';w2N8)yBL'ylcg&@qb1uuL'1| D8b) q0bqbSɍϥ DC"joDc)$”zUF#(8udzFkL],: V}Xq8+z$SldZ2gkҚȍElk6h#Wy\AŶb(8]9q9;Khv6{-V#Wy]A7yy^FW~˚5%hLd_>Lʼn){a%fMD]?,NYL)wZpB%y*ܓ--j-koSXts:M&&X.zutK"Y 4ٛD׉a:(A S݄#aVe bVd  c2‘#̳CPڕhoGP9'Yl:D@Gy KFsb²e9C`= z9sq«W_{,XNuo5\~ Xgɿ]7L[6\PMO~<:Qa5 -+c'˟ĦiwOR5 Ѳ$m KҖ!gs׶id~|JJْ9YΌ^'ϖǷ~ʞJZG[q،6 XtSD@NB-}jد0?y>kШ5>rPd+%?B3d=4WL[C_yǘOQUAEf }´4 4* 1'oi @%?]S[ɼy"F!7.Z՜?G,ubҚb;Bx ;SH4VUJhWЅ7䝞Jcy؜΄^Ǩ1bZ>񆼨* hp,<S);w1`H *L3Ąc$/`]:^* 1jsZ a\P)TL&Oѩuww|b ֱy7DcQF=IDj=Ho;+GB1߇ "jϘw o؋EeA 56ZF[c1i>HXO|!ﶾAmO0kڥ;]%8t5nQTĂ'H4$rDcQA>J{ a55cwY) I3Ac`?dX2YDUo\_%7> '.gae4 ! p~iUAx;l+”Ss)wIDbӱg{ϒAl&O,xF0uuAEpR΀BM'+J# LbRP4$)z:} Qj0jx/FJL+Ӗ}B)UMguv5FJ5o.̝t;puUk ’U^lPT:.";.¿PĨ_8& S5z*,1(RW4S*z^t*AjLlF5 DiL'83z18 MXT(dm FܯfD4`JNb4B%JRͩ| yfUbP*4&|t&XTr/y_؇شETP`ҘFĈMZ'cP44+!W#W˱ch4 jtXx:!V9-4±Ra~ iO`$8-sfzs/&K4xP#L E$$yCѐ4bZXdz-x(5<2=bXCt &:|s^s. Vf2 P@SM#Dp*}'uяM:##Ԝx7+cl侨BK W1I Ƃl!³ |YqmQ~w(/c¨Uj7Iq^gΜ~CA% %J4GqEΔtHx<Ϣhlͽ<,يͭXɛwnE=ggiϕ8_gJ3cK8xkل߭Gf;<|r1dAGrMk#^OK2b p]L&} 1 M8&CXTI 46]Y1x BIvO@3Kd}{ICXVnnܑ1b,I\B`7w1nGgѡ֨?dddddddddnKL0n!;vߜ,7)}~.sWb+ 'M4 BFGrǟ':###$$$jݒBPL߇j-g'pks ~#v;Brj2:tT*̗JEI |tm(PߏF~H$lFPzɣL5=Z^ |>b& RI0$ b2nD|T*Fvez=:h4*GImFfmp M:ݴk%1 tn8FK>zs x< 4 H$"bqcbHdڒ9#P*\9k4h4DQ^1|0@ L4:]6M9o:Hd:\^/*JZ'E"@V{}ׇR$==ǃZf* (--駟`0000^GTr9͛GJJ Zc> ~P($>١T*1Lr5hmm%77:O   b0$Y̽"z}ױ`0H(I3&KkM8tD"}5D|NiZiI,x G0Ng0099磠#MFFFFFF擡hHOOG.o+F1ۿB#9x 555$&&t:yW8FFwѣQXX?hmmeժU oPYYncǎddd{JJJ__ 77AxWٷoׯGR!Oޣdf3o8q,XcǎIee%{ٳzy78q'N`ƍj^}U<Ț5kPճDBDYj˅'99Y_hc`zc&hq.GV è.ŋy뭷FaZկ~imme޼yݻcǎQWWGvv6v_`X0L⋜9s JKK]=Y4w#mZbuR ohLRIIHZٳgihhDY4/ ̍F#./7n… kƕ+Wp:̛7OwCC_^/o{RINNnk׮| MMM:t rEFGG?~SNf͚YB摸.DQh?~'NPWWGAAFQR*j5۷j4 ۷C122Bnn.:fQ]ƪUX,or 7o}}}Kb4̜%X,ƻ˾}hnnMM΋/HUU~ h49~8:FQ.^Ȃ 8|0wcl6|> BZ?WVtO;wÇs9IJJ6j5Iiit>J%9 6mBHV(g?TWWs N8A(B0L7JOǏK/CCC޽~?.T^3tի B\t,7ɓ')**̙3V\ϪUشi4EJ%)))477c2(**bjjLRSS BKNMMa0HII!##crr Px,W\!//zP(DFFiii7]wpp_|Q|\xxǥaukzyP* p8& Fcc#ԠRغu+[latt9qgϞÁ磣W^ym۶Q\\,)ߣ\.6;;;o~Ö-[k׮!gpp.;Fmm-׮]gAZ$''Ojj*R l6,Bjq]GQbΝ;za^|E.\Ț5khoo`0p8LCC|gHww7 233dxx@ H,cllP(8`)^Y"%%%<444p֯_fŊ<XV~2999xqVXtl6 PRI$\cپ};4ٵS&ʒ%K8rr /0449V}8BPD)JJJXr%W^vp8(((`0P\\Lyy9^7JǶByСC(J~_rs{/|>6l؀d{.nJJJX|9l6ͩ) JB!wvvJk#@ee%'O_:IIIA6  188Hrr2###ILNNf``N4h49KُFTWWzAss3k׮%[ovbRY{rݺut:Y|9yyy477sqQTx<<o0 <s`zV+$$ű]ddddddd>ѣ߿qvڅ 9s?̒%Kp=zDmƵkhll$''xBCC\l*++{eѢE\܏=JMMQ*_|qv;IIID"^uzzz0 D"vލRdxxX1酅ر˗X~=`7xF֯_ϦMذazjkkD"TWW"Yd.]JOON 6p *++#++jz\x ILLdƍjپ};:NZR<T@TfIgݺu|>-Za``Vb6FFFXf .Y$3]O8AUUHͲeҥK}v0B!oNII Nƍ<,ZV`Ra4D";vjjjl\rh4Joo/3s]"xb)wAqq1Wرc Ųe$Wtى磨K^^Cyy9.\ b nܸĄlXξecn'..UVDII fTV\IP000@||tߙfڈƍٳ7np 8tWFThp~n*ŋ)..H$7P*+lڴIZ@ }qqj5w. ˅R$//1~mzzz{Xx1SSS;vTl0R8FÛoʕ+h4~_HkTff&Ŝ>}.|A<fժU(Jf3`C}Ǟ={h4ҼNNNz6mDzz:򊴡VNv؁Nc||NG~~>]]]B!i㣿_ϟ?>K.ɓ455Q\\LJJ ~ϟOUUppP(AѐB`Ϟ=(JFGG)((```@(ذas1bXV6ddddddd f\oY=PVV&YmĘX,F @RI/.ߴZ-jZRD_{XLr-:Nz['%%IbR8$uZhi7ShR^^O1R~BRD"H쇘9 tRxڣjc",2zbElf[qi|\|~v;7Jj+ZjY>$̔͝zINN&Hm牘lfJt9>.ygw06nʺF$`0v'??_\L(y3Vr+I{TK z4ZF#Ťk2 ݗb8Tf:&&{pW6UedddddvVTQ,IN`0xS*w 'aUbA|>)ʕ+IMMT?Kf*w ܍FbdFI,[+W:L]FFFFFFFF fZ PP(lDzdu2 ֞ LπΧ5O>˅hkAraZoyiL+h_C2ߤ}Em6kILL \Ha2P'AT FKoB}VT(DQ㥰; D"l6 Brr"[Jwh4OFRhrpjWpXϒ=ĘVF#ǀ h4D"/)########G>Nm~TL8rkѨ/NLLHAp055%U>g&HI^'cllL:b1Rb8䬶b1\.gbb>V(~n0d||\߭>z3addD}k IhTJ>y#KsO[☋ '''R4q>Δe8%ڵkns9io;b/_frr@ p9L__K}}Gi~f. "HQFFFJQZK`3by''' B={Çg `lllֽ|B444>1 ?XsllLϭ파t:v:޽ϻ檪*:$|ιmmcc#.]tChػw/ l2e׮]=z.T*O=?~Aشi/׿5Nl~雬J===$%%c ~F<쳄a^|E+x(f[ve.\K/$ex?N>M__<( *++;vPVVoi+ 9!N8+f]0bv^//7  X,דfh4yFIJkgRu C8*΅p8̿OE$KD1q:::|[;V)))aݺuLNN??rYzzzP<oLˊuttCXj-frr7nOO$$$pA6oތ`t+$%%#u|{?0>寧33f~?/2v"??_yn4bǎP(O?gϞ=j ٴi{ett^sӃJ駟fbbǏ344NPՌĶmۤR| b mƻKgg'yyy<Øf?Ζ-[n*"######!a'dXh"~Tvtty|r_Ƒ#GX~=|>Ο?߱gN<֭j[o ?q͛u\vٳg? ^F#Jkk+s=G%·mW|AlBkkdMq\={$1(--˗/388NUQQ͛~˗zx^~NoNkkd-Yr%7n=uuuɫʼy(//WRYYIqq1ɜ;wX,ʕ+Ynַf,^ӧOS__Off&^z^z@ O>(?O׿5=ne֭b xq8477K%J.z-l67opPYYI\\6l`pp^{P(s=GWWl߾]R#NsVLW^!xb&''ȠJzz:X1RSS%)) NMcc#K.eΝwun|ٻw/---T*⤲v< {n CCC|_ Vz'995kP[[K||<ׯ@ @zz:{/gΜaӦMlݺ]vVJ%))),\'Ok.~PWWB@P__ori<YFkmRRFSNtRڵk?39vIIITY  cZ:::v00k744H%A`[oa6Yhh4J}\zFlFZ-O>$l6=eppP@b_ _^P(x9s ׾5N>Ͳeزe ?Iss3zD-[ơCxGy( g?η-oZW* l6޽278z(7n^OJJPFFFFFJϬzo2zl6%%%$$$PXXH{{;ǎnۋ ==088HNNʕ+LLLP\\ŋl6Vٌc%$$pU K,h4:uիWdUȑ#dddI  ''|1^|EbݺuR t~yA6l؀ !!Պbtg]jO__6l6.]bƍLNNRUUg]O$155<@vv6j'xfƘROÁ!}"1͜8qLV^Ͷm8x Ǒ#G(ëWyff3_t:, dggMII 0<<ࠔtnvJGaa]Ivz9z(?wHJJl6SO@cc#o6qqq(J=ѣGٱc;w[E HNN&++ܸqzl6###űxb{1ILL?!/`Ŋ|_CUbܹ~op8ellV</:Nr]޶mV"++Ν;G4e<㴶A^^8NV\l&..˖-#>>fyRSSΝcժU$&&Ɓhnnfttf3P q'Wr)НV^}|x:Ŀ h4RH(UtRHMMg~˿dddD:8ڵA~iDZ팍qUn7/zۍ`TTTAaa!/_ttR|I%??&:;;Yr%XVZZZz\xZZZسg҆s稨 %%:իWn^\\LKK Ǐgdd\.iii߿ׯϪ1/######sgFx<H ${_.*455zjlLҥK1 233Dqq1۶mcPPPng``PWWWsA{1aB^7D"v%8駯˗/sYjkk+WRQQ}}} s jjjhkkc||õko=C~~>Ɍ288$99X,&] _~emFQQMMMT*͛=zS.f, Yj5@`V e||(׮]ȑ#h4|>@@6^'KO .dҎk7“O>BW_%33&l67nC,CPj [LܗL\\^֨j1f$6|>$G@||<>|D(dqL = j .\wG!55FV\ɷm:::|122²eh4|_'==)**rN-xݺulܸA?>&^p[W8}{RQqĐYp&䞔d"55łN# !0L3::޽{%CɫJa6QJR… ٳ~4\ҥKy~:n[z,_NǓO>Izz:&ӛ̒xO[M6Yټl2z9#W(Jz,\\T/bH$BJJ 'Ox<x"N =zt)ҥKrc۩DPSRR X I1Fٻw/(JJJJ>CѠRxWb``d";wZFFF(((`ΝTTTVٰa`7|&l"cZٶmuuuDQ,[!Μ9ҥKYf 'O󌏏Ʌ hooʕ+Gbb"6m֭[8sFZn3o<~?VT@Ѱzjiiiabb 6 (//' 100Z&11+Wr Y~=vξ\'&3gPWW|r#;;7255[lAVMUUF{BdѢEZ JAד,ZnbnbW\S}x=˅Vfz'6̇=Ḽ>oRy Hue[fZϲ0Syv7W625S )mwkqƹmُ[nqy4wظ6w3i0&՜ռ]q8t,L7-w/0ay晛2nz|c92^1jBHk/++I&wb] +Jꩧ\Y=>o 0 Y}>}埩|eddddddnɂ>11!CIĀOeh>GL틔8H,yf6?n)@n7SWxEO:w;Wc43g,wOI)}.ڂ.ym .<zL&J$ kb ߵ1_RRG\_SFFFFFFFF( G6ҟ{@KRrþS1_~cYSV2%1n|q_SFFFFFFFF揈9> x!H&''q:FJT|c0D"bR11^ f̵Z-.1A@ #Ft:tT*V>55F!122 Hr nzwa^1s' uCCC8No ߏj]B=zjjꇖXv203yQ*ҘT*Z-`Pz.v1 1zIx< Py<fg g%4ՑD(̝,{H$BZZXZ MO p8p8|gttT*Fo󓓓\.g: At: 0>>>kv:LNNP*LLL011!ksijjtJ%.oE[[Tdد;cccnT*`}I%Ŧ|웹v$066d(>O\.FQۇBŋ nE"~c@a4ett`0(S,)%>_g3T\5Wbccc/#####Edqy˗/366Ʈ]h4߿Jٵko6}}}sN0ho| r k֬a[\zft݆jkkq\lܸm۶}dab1>L?^g}AxX, 8p@IR]]͞={w+%inn; _Rih_|^I-w\s;LMMx'z߿͛7`^z%"<3D t: XVic(I7@7XqsIbXAb63g044ēO>`%$$ b1$hbx=F&Ο?O?MBBnP(D||NwJz{{ٲe >IUU6MZEYwvvoP(Xh;w6?^/ /r0L<9;׿5X|~a~&EyVwDQKII FQs7 SSS OZh$ P(K.裏bXhkkcǎ1>>NSSODrr2. ٌd"p8F$$$055^bp5cΝ,_\R0ҋGB{9*++tܹGJ*++wӚ)# .Vt:)RIHH9rgyF(@ K/$)ۢ M&~Zӧp OjyXt)6m⥗^s=ÇimmEP3055{M(//祗^">ʞ={B^x8uvbŊwp[ fpy233ikk#77;vꫯ[oEii)fy~Coo/]2öm())իWKɾfZYn~Yj?ђeաY|9qqqaL&K,vZJJJ!99|8rTk%K`, \v Af՘MOOg199I(G>| VZEww7III瓚bpp-[rJN'VUVQ__O{{;p 6h~+ ~pUΜ9CGGBՅVW^GOSn7J*jkk8ʕ+AiAl]P(Dss3\|z3|Ο?BS[[˦MXx1ǎ<;PZZJ||ƂnZ~: h4^/wn344DWWi4BJaaz3FTTT|k׮aq\˽f U)Dkw\\~7`0P\\ +W0L̟?2֯_Oaa! PSSʕ+tҽEcc#O6 },)ԢEZz233Q՜9sF0*))$\|Wl2l֭[`ҥ 8u<>,P^xgm\.^{1Z[[IMM;v0|/^,vKsjDذa?Frp8$''c٤F,4, 6 Ӊ#!!A'118[h4r)!H,JAAqqq~z[VVd %͹ttt_ JJJ>v?ѣGy衇C<@ߏ◿%JRrx^<~IUp8̼y?>N… \~ݎ餱^{{tRRRܸqAjj*pX \rl۶,`%TR\\$SSS8qBDh4`b1I6, z*Z[[ILL(Q^f@ii)<]O^sVX qFa瞣iii8L(~|R(iA ''Gy.>ڵk9u,^]v믿>=łdbƍ^JlFVDPTx<B@yy"ZrgRTT$mL&i JUXXȣ>:K1>FRH BYꢫ FRd||IJJbrrnFFF7o*N:;;!##VZZZ0L088HWW.ɻ|$&&OWWmmm$%%%LMM1<H8ԩSB!qJKK'NÖ-[hjjҥK̟?;v0<JJJt\Ϟ=˵k$eCwHtVTٳD"Ąd>y$Xa p }ի1 lܸP(Ğ={hoo{a͚5lܸy摘Ȗ-[hhh qez{{DPHqլZ+Vp)/_) `ILLdӦMbؼy,wFRoJJ ^W^+W7nDϟ*t/_N?CCClڴIrMKK6$3]ϝ;իWzx^***… m64 gϞERc͛f r6oLYY BJjF&%%l6mmm( x<7Y?-D!*++Q*YBΜ9CYY˗/ԩS`-Z$"mmm8N bJj\rp8̺unh$>>Y2Lv***HHH 99%Kt:)..F099˹ql۶aHLL$//+:3Ih\d }}}a0Xt)MMMaZAvmmmڵP(D$׮]cɒ%b1u|˖-$$$p Z-<\t|AٳYkע9qIIIPSS8<ϧK.q=Ż),,dݺuݻ&ykl2v;mmmt:-[F8q$l*=o|W\g!H`lݺNAדǍ7HHH`ɒ%( d.\HUUCkk+."8|0Pz,ٷoW\aժUY8N>`0ɓ')++cѢE\ro}[|>t:eeew /6MJ'׹OA&--M* ιWw^y222$+LǝNNNLiit9fkll6a!w{M^/~3w.Εo<)[xcĹ"###7YC?ug~wn2s=׭ϭ3;==}j{Δӭd(i̕:Fl(/s'#####eO2Brjl[R0VsT( ˭o̗[ggr[Amۏzɼ1\}wxb-Z$o7VVf܍B33EWO.Yw>W~v}a̍9ܹܾ̕ssΝts>q>~Pn7?l>h|ܛ[}~_4 |ݮ;ܾ g} ?a//2{qs-LMM}fnx1llθZj~]Zdϴ|Qi͓srX,7mL̵l六|ii|##########FP099^dtAtt$ \e﷘#agu@X}7)ZRSSr_6>MFFFFFFFF拃h3N[U*G79jqmJRᗙ;5bݒU_F뒌W1GYA2kۙd2RKuk`xAp`6F 311`@#=088(e(̵Z- fW̦f||\>99n~D"vnz__### 055d,.k NAt:Ƒt:F|0Lx^Ɏ088\gfq?z{{UgRv3|>x1|2P,⽽J,Xp؝9sNGcc#iiiɓ'INN瓞[s$rQ]Faamex~|ϫϸ;$Ν#;;CA`||\zkZ  k`:*ޣī{ngrrRp8f=c=1sw,q.b1p:13sJHVRž}e)MO +WԩSL&x7ikkcddbx .^(ڽ{7ՑASS@ V\t-[R_WqƏ$QQUwp}پ `{ AT%5윓K$3wskkkD" n ]르S۰q\\|s122f#%%~)~?,,,pFFFDr0HRa]nkex Z-TTTk3{9jkkE[[ͼkdeea8}4X,xcppD"kkkB~߲Abb"&~QVWW`0B@*vY[[󱹹I[[?&}YQ(<,--\.cllL(Q/IWWB.~@ù'<gϞenn99shjjd`Q(XVx8tlllp8t o~anL&f!^/~zeav\r(el6#˅>(J 0/>L&Au\(Jl6?RySӧOH$B* svq^ O= PVV?Ooo/]]]q N:Eoo/111n~_266 yyy<䓌GUUgΜtvv ?Ǐ#!!_b233Qռ?nkgggٻw/UUU{޽ .\]w݅L&ۦǣRXXX#MBP((((`Rرc LLL܌J<Ξ=˞={(//GӑL~~>/B,OII s hnn̙۷Nb񰲲}.\@ZZ{e~~^x^FFcyy 8@}}=dr Iz{{1 &''H$]6,v^Orr2q˔KVV׮]C&188X,trIn7DGGsijkkyLNNbZ/_& ~7xt|MV+---B-t n&''ͥ$ijjbݼ( 666~ ~: )332.]DZZ_WxW(...(,,_樮N0$%% /@ff&}}}z)..fll __q9R):HEE.\@*r9ۙn 27==]]]P\\yyy\|ly7"&&ӧO3>>`g~~i:ŋINNnjH$zv-ȐhAuu5ZW244D"l6 DtdffkQ^^ J P(r ]]]v222xw p[Wz;v۞y, mmm$''sI#K/(f͏cVWW9x^;k`yWtttVyרҥK,--ꄽ#"))1v;|_%==k׮IOOK_o&"Nov~?7n3;;K]]G孷"`ZΝ;'Լ˿KD"SUUw͛o)xK}ߧ`0Hoo/:apHw]^u*++ihh`tt"T*/"r;w!B>YnEA+PBAii)wFPPSS&u<uuu\rEynS__ύ78wFQP&Ϟ=ѣGS,"xJWP(عs'nML&rqi:DBB2l[&~tj5ViiisEZZZD#_giiIh_$1??d{UUU=W0$;;LVԩS( ^/Vj&''ikkFYY ٿ?7nf m6M%BwnY\\ʕ+FR\\%MV+}}}|[HRΟ?&qqqt:IHH ::k׮1<<{w}7%%%>|;v`2HLLEEEj4 ­ߏ餫dikkcccbpp}T*F<^xWtt:èT*׾``zzkq466n3<8∉A&MMM ,GMM ǏÇs]wQ__ϑ#G8p^z-fT*azz4 &F#A^y` {P%$$Vioog||Er J%N~vMZZuuuu]fRSSINN_dccZMTT Mr9*xaΕe޽9rN'b=Jyy9V@ @\\AVWW*&$_*.\fRҥKTTTgg#8vFRTTĿ˿gعs'eee9sRI(PRRѣGf [nCmm-ٳ(J B}8vjZRdhh%=*yFF9pj/&^޽{?X,o~lj'(,,dbbѣG9x 7n BoLfggQ*tww nllXL&c}}wyG0* l6 j'lnnB &&Menp8L&bcc{p8BV Fd2QQQaXp$$$bys!| BT*9rȶ!B>PAtB;v*++$++$ FCUUvDEEQWW?)4660v]Vs=BV]͆d??ݻ`0jb68===rHMM%33ۍlrUz{{eiiM:::8y$FѐZLzz:.Kx^ {Ç bMaa!>8 RDV#kll,ze\.pظz*333t:D\.v;JEUU?Ox5>>c=FCC~[񰺺*}سgSXXHNNIII7[X,]WMVVVM? D"6e*++fffF7MV+~B4^0w\Jh4 cT(T*HNN桇+ܜD".y7XYY (%X,pzQ*\.VWW1LBF%_Tc~_L&7DnbB >>$~awWdvvVe^XX`rrCq1!55Uɰ(--m[Up8h4<,-- 0YYY144CR1==MMM BѰ 4 vɡCb۾K||H:On}>0W}'dǎr^VV?LJJ (0@plezJJJ"66ݻwsAx D"qqqBxd#YYYa~~ǃX,FV#HHNN&66={paG}}=OfvvVh#}]cN)bbb0ͬaXdUP}d"s,..nrq0LF'O" [߿ o노Ydxx bll HDee%V(J#77lFGGd`eeVbh7999"111 1LTVV"```D )))l6v;fY`0x["D@.]D"J0GLFkk+EEEu]OMM Ga}}]җh8pV+"|fٳB򗔔~?Nn `0tww ͼ<?ݻǩS{e׮]477S^^NZZwuCCCB&bzoر6Z-6tY]]~4UUUddd===ձgϞbm6A4 |>!6q0LL ڵkA***->r=fb@uu5PTTDff&ZG}}p0dTVV n܆{{{9x lllk.a6fB>OAAOrrֆᠠy***}fQPP@ii)LOOswsNf3]]]u]ڵ ZMkk+=zTMNZZ2LT*`,)++\NLL ł!7!!aDDGG3::*<:$&&KKK$''SSSC__7/_jP(~¢r9wbcc\4 bXZZJoo/QQQG0d666a[·W^IR@ _:B΄v w'NT*bmKa&Y9|0)))r!233$ ${#c:DVV~z!g||ZaڱcR(((`llE|A*++ltttL}}=)))ĉ0>><UUU™!l\Tnd2CQZZ:?~".^dffFE!mV\E&In*++?Άo t F[GQzA6ޯGmV{3[ûru!{v־'~kkkms(buu߹6O\"PYYIZZ.<8~U誫o}fX9j)yyyp@}}fڻrGellD!ŋz}fy{۵.>Q}z<EEE8ŷ-'2}!B:N~/V\FU`nSñեn67 ~}+Ϲq~Z {~пU(BfYY0?;{8?sn瘷>} NtTJ(B&/}/|x~$HII@NNζyN8Oz^?Ϣ>9gqz{0|'O]H$D(Bn?bߛnq{zB\~Hٷu?/|q8H-χXral7B!l6P>؆ٺw[XX,& dD݇i'mE$}hZlݳ~{"D!B "M!{7PBAZZmVЏouqCRD|fyܷk}oĻNS"D!Bϭ>0``vvIll,n:HR\.333XVj5ni^;??` ..@ (JV,VY͏r!{'66,>X^/󬭭\.gccC(Av|t:LNND(bQBˆ/\innBRJ̈́7j8kkkvT*:yX,ޖw177'x^L&ӇJ>w;ؚf1;;+H$šK$lr% .-~Ӛv{*_lHOOMI~RQ<,BiV%++SٳdddGA155JjL><h_~S"ȏJ … {txlKKKT*tLNNV?tVVV@Z2^Fb+vgϒT*fIzzރY\\5ZZZH$o~ lK!B"Dun%*裣 q% kkk {9zsI 55.\ĄPQ_Ν;o*Ǎ7fQVV'!JRΞ=VL^/,//sEqM{1d2Ѥz~ٳg9z(`0H{{;P(CKmm-]]]<㤥ˍ7իHRbbb蠧 .k.MQ{S5ш^pXDVVV0|>R)M L&bcc駟h\LLQ^*!s{1f3W\_Faff7|1|O<رDQccc|lll`4 ( F#FۍD"!66`@&/~ 222h4[;Vga~~,v;F/v~EEE ,ˑFx|\MAOKKcXVhjjГVT 444K\\uuuh4&&&hnnFVchiia߾}HMM%//u\@ee%R>(,,Dp5VWWD߿TH$";;&p\n666OKK ۷yRRRzMMM,..b2hnnU233ڵkjAoA<(ddppݻ Fy[o[[---$''X,&##J9|0"jٳgmW_E, Q\\Loo/7n !!Vb1/B\~^xxא055E `uu .022n/c6gnnO{{;BD"&)G!B൚BC!/jh4ؿ?,..RWWɓ'rD{{;gΜbرczozL&Cբj9q-OT*J%8fH$XVz-nH$nx Q(lnn=`jz*eeevNqtuu9z(Nhd2J"lyL&5?z844Ğ={PT|ߥ7|SPÄoy*++_*l6<===444\A. {A׳g._E.w3sd2&&&2n[ׯc0P(x<j5*@ fCRP(dš|裏QQQ{p8||шL&ǏmO(B"PPP)))!&&'NPTTB@.ىVf|#Gg~yGY\\?'RSS|۞عs'>(^o|T*&** N8b{wZfggy׸)rx.]DRR===XVHMM _>TPPܹsd2TVVg݌ 9|0 |+,,,`ZÁR/$ꢻTo'x o X,ms)((஻SN  |ٳ={l3vMMMv  ~DGGSRR±cBPEOO[oţ>J(w*++H$vC=ĉ'hooʕ+466o}l6>,TWWoc&B"D|xjj χdaaR9ZJb$ djkkЀbp87=w``mW_}V]?OssׇZ&??#ԂD7e +~3 $$$4vHRD&q5t:ق d2F\\333F|Arrrt cɔ277Gww7>~1v;B^Gӱr[ƺ$  P*H$#e>cd2]:<44999bbbx<̰1ΡPJbazzpR(`LL r\ȅq)r!Q(ARRR(++\mmpE:ȈP>l ˤ\.`0z >>{r16776'CCa(ZVSYYɣ>Jgg*..!xLSS߿υ X]]}QYYINN{nX,lnn"J UUU3??&--L&& DBvv6Ԑ k.vuS #??XLbb`FV($3:t( `0 H(**bccERSS?RO.###`x<455p8狀Gww7?~Rvw}7EEEK $%%IY\\D"`2A8`0000墨={ G&!AR餲`0)!YO1*1rڢV1LB!ؿ?tttBRF!55ݻq\Lss *]IIIPTT%??Jh$55Jj5yyy(J6}ccm Ţ =zLƎ;HMM·ڕhZA! rssq\F!]8&^ӑ+NBl撗^gaad}p8!--bbbP*466k.4 _d||DBss3lllKll0[V׳w^bbbHNNh4222޽{ŋ 7QQQ D"Mee%*asrr!77CEE^)//P$t1CCCKssD3333tvv 6D!Bn[qqL&vw:8Ώucly`0[,Z[[YYY!::o~0A4Y[[ BdddjthL|[gkOGkk+˘L&;p#g!VeffX ϶VB!:;;cnno|E:B"D KbZ¥D nk|H$" mGm'qC̟H$BPPXXH~~>œ}7HHn.qD"!~Iɇf qwp»XbE#`kBOAAiIa$یpc"D!gH$X7PBqtÁ$99c)R+p%D"zOEΑ`IIIT)IHH.";/#l@s$%%Ѿ"D!B&}HWc;&y3??vV]{'ރ[ú1um>߸y D!B"|V3fq_[[Cbۉ' 1==qqqBiQf3 8p c...bQ۲vZG!\.>x]C||>B ::efff !xBBAX,1==$VFX,ޖw1;; z>n7JK-5lFղ)"HRJ%ZiVWWTZ fssQA7QQQ\ܯ\jԲ. ^/.]"55@LLLD5{%$${ښ LMMRb0::J  ..MƐJMcll,rbq῏pIVVV8{9l6fy] ի;w)Jleuu BhZX^^ꏇ\\RU&''9B"Dr+Y?PAdjjR)+++9s5())W ;3<h4vSQQ`Y]]e޽v}ii^xA<&!JRZZZXXX…  xr5fffqSONnn.7nd2SOOllP?)/^ѣBb.ǹzp(~0ܸq:xꩧHKK#//NZ-W^% ha``vſ z{mmU, @y)h4,,,A&PEz=qqq ORTTDLL;Z}G⳷*=== x \xRt:[@ +++( ^|E&'' 55V˙3gd2SO=`2~_ĵk(((`cc'|E]]ccc<󬯯j)((gccׯS^^~Sul:@, I&&&(++r!0 ( 677A* {M0d||NNj/HBB,//gfggⷿ-wuvD"* z˳>Kmm--i666?)^Y^^fqq'O`_GӱJbb"O<Njkkm"D!­+ EUUSSSr!Nl6D"/" ىC&Z̐3ܸqӧOr`vvVpu\OE7 q4 vzw[2bF#o&?qqq7=_'!!P(?{!^Jnn.& &W,ڵkf?AP Hdxޛ,Hhoo`0p= ;22ݻ8vgϞE4h~aK_p李|+zIMM4|>zzzHNNp\bZ/#Hfllz׋fc```[|իW)))!)) .p9FZRq1Ο?N&:˷mvqG|egg311h &aCѣGrHyy9L&cff! G|/ 0xW;Fuu\?™;::{җDFF^P( .KϐJ8!%** M^𛰇\.G" w舘ׯSXX(|,N'}}}D"ѶRn~>'V:;;$33vIff&>vٳ/GyRhll$&&Gկ~qbXlp022 ;;$a~ž%Ns|;-."D!B)ρgǎرL0T*ٳgUUUP__Oii)GRHBBJ>&''1L7=񰼼`@^x]FSSP" я~Jߏ``}}e, 3114&I8Do$bbb!~ŋK޽XLNNܸqFvv67455 4 nl6p|op%y 322"Yr9R7nJ^^^Dfccc{{{/~AMM BǏz1XVP*C\\w領v;bx~(ږ{aeexםvmmY1~*{("33Ub1YYY QPPX,.x<,--F~x[q(#,#@ @||<`0&s 'FKMMeddYB*k׮188Hyy9EJJ r ~?~ژ*8NTʎ;0ܸqursscllL_II ˗/@KK ^,~'666tRRR _`tp\tww _ JMLLvbccϓRD,VbffE qVj~t:|>F#"Ǐ.===۷Eq\iq!B"|N@wV+8qKgg'Jn(zcIDAT/| deeOoo/5554551==߿ > QEE&}cc^kAAQI]__'55`0CTu#''f`޽A^lĉTVVDUU4662;;T*bf3 $ 9rRzzz :nł\.'++ jkkIJJ$cǎ\T^^2dddgghعs'+++t:, FVZl6#(// ˅^СCL&IMMluql6 2H `dd;wЀ@TR[[D"amm{B$122ؖ$.>>^H(JUUrv;`PDIR TTT,'''hBbfgginn& 2??O||< *"HYjTPPx"~?SSS?~\ٻw/LLL QܹS8q200ݻ… h84(==&R$++ ZMuu5DQQ255L&@0.:D"vB" HLLʢ{@|p8\};"r!B"DKbZh4m[= ~HD UWpm:J8ki GPHC%BO%!%B"D!'KXH߯!bo׋؇M֤Xn[uCz?unJ[  p8|TT> 0 wd\W۝N!B"D(ܤ}B!Jm/v88ΏyuqDGGяv)pqp,G!B"Dtz33sDhfn>ܮw! ~f\#D!B"DcV迻qqq Ynv;UUUT*V+DEEQUUfC %|>B t:̤ &''Q(TVV~d0sss,..Fqq161)..r1>>餴$Y^^ {ccc!vGaa!nR1(*333jˑdt:t:Ť2?? $$$4TVVb63WWW3>>`@PSSݰggg1 455}9t\ oi >MF#( ***bvve`0011A||v@q<mmmաjygHKK#//>t:ׯ_>go-666$O_Jb||+W^GT_ M{{; HRֺNll,@IdL&wnQ\.M(6 Z ,R(>jk[Y~`6ٹsvJk2`bbgϞCU}!B"DpkJ԰JKKbqqD4ܹyyyab`X^^x饗~:n]vO?Mee%r5 466k~K!y,,,`Z^2[ɟ 333<:ptLOOS[[K0m |8&:;X]w݅X,橧v{|#կ~&)))׿&77JETTz}~?oF~~044D~~>X,ZZZHII~?D"a۱l?y cccw<[}}= ,--!HH$B&L&͉'׿5@\ot:JJJ踶xhllDRqy&&&X^^f}}TJKK),,4o~d2F 6{qݘf<ϝ=QQQs9!~("99DFFF):tml6N:`@$!J9vՓJff&mmmǓW Y"D!B P(8v=6ffffxz8 <,..s=G?`ÇɩSp\ddd477/twnfggp˃ [lDoVojW_%66 yyy=;w^WfYH$ҥK8Nn|>RXT*}߄"V, {/MVsƶ> C=DMM | _`0rB >J\\~L^j5. TVVR[[K{{;P(H-ejjGyÁ`aaXt&Q(r ^\T*E"DY__G&Q^^Ε+Wl6Vu[F#~|>KKK:t˗/#T*e޽GKO`0Ⱦ} ! B%>d2TTTP^^NYYM{Xee%7`Zy9rwz*"D!B"Tf~~DFF{%>>]v@FFT*TVVJcc#ٳXO0dee^/dׯOPYY3NUU4kkk,//??RHNN󱶶&ޛL&lϳ^gmmMpW*155Q9}4/o/]n'77uppY^xeq\A(BPls(B" Bp挌 &''d2 7N AbDQQjN8qGݿnܸc=&[, x^q:ܹFh6Z[[ΦΟ?pbۋdbdde&''T b޽8N^Jcc#8 )))K.m3RTTDRRڵWRWWfjjJr]y;Aѣv9r; jx~_ث=$CCC,..&?яp8vTD!B"Dx7}llL|>j|AHIIallLp7gff{ԄdbhhtN8磯‰'G[cЗ577Chk, JHZZEtt4fDn'//Iv;"lvΝ;cϞ=v)))*JKKٱcrVжRhfffWԡ!TV+"ATTfHHH188wuºd2r9 IMM%11rssINNMVVVX,=z$HLL<#)//' a28puao7[cЗ|]JLNNĞ={HOOGՒƑ#G())a}}Hĉ'>AAǠD"t:ɬh0L(JAILLTAZ ϡCHNNFeccKHdz屸$##͉'󑙙Iff&999ϣh%(ɰ5]*Nqq1r233IOO'##XJO`aaNR$66VH&˩z궭bapp<@ll,( L&9997L&Ν;|_ܮ:kkkwz(buu}_r.nSW\auu{="DG!B"|t%{Zr!'Q t | "H3D"afJ&BiiiPs.Iq|{ #|m z(rbbb](,D"C"D!B ºGE~ y^Fm~vv;nu[x=j$>)9}݉Rrt:ܼH)~h8!x<|>_D9!B"Dt:?r 㛴P(Rbog#.oqP(DjjM.G!B"|z[9rvpk?XwqQ: ~|j n`0(<'1w9 ~ ~gB8䣮'1 >rY& }"DYh4D(IP*lnnr 666HMMessl6)))nzzzXXX )) L:fRSSD۲L&:::.lt:INNbp8ebbhT*SSSVhMWWjK[[Z`0(܈-..2==MZZbssd$ 333P(PLNNn{" RRR0\r INN~677IKKC"~ afff&++Cϧ`ii;-,tuuLbb"rVK?"dzzZȠHRe)))D"!kΝbY?mv;*&`0(H$q8tuu1??/vyz=q~Ybcc E!aZyWȮE4[Ngg' h4 tvvrHNN, ɷT=@288J( r)nܸ7D*riٳgIIIajjsss Ɉ~FGGQTDGG3447׮]c||uw$%%SNUB ch4s |>T`rrya mmmok}>/"111<_\.=7y묯I v8BΤ۾ǬoSUU~*$,//I0$11΍7 d||FRdnnnAM&7nj裏9dLLLOLL *J8y<p\tvvLJJ FFFeiiN]o/%|QCT m巳_}o#D!V``0NGoo/%%%<䓸\.bcc穧iGGG8Fi233y*++ XMA9sA>&ak.N'gϞ>gϞVh4rEɓ˗я~Ď;0ͼK$|ӟru;T*% 2<<&ׯ_͓O>BZ9y$3<<` 999z؏=iii$%%X,6ifgg122Bll,bXFaxxl6 ) h4 _\bcceaa;UAdii駟&55~r%_ׯ"kkk$$$O y|(===$$$PPPp[.fXXYY!**YVVVo~Crr2gΜW^yNG\\iii^NyN8`~~ nOP7033<~PxVWWd2!p8B m 28N| 3;;+?QQQ$%%!p\b$ H$'''XƄŌ211v[yȹs瘛`0033CRRO=QQQT*ŋCUUt:$ qqq,// p\~!'VɓH$^Jyy9KKK ɓ'illڵkHRD"===߿^zRf166FJJ O=rjjjzbINNwڵk$$$$o֢jciLL z~l6Jmmm>^PfggdϞ=XVJ,//믳FSS Kz\.g~~Iy> 0g5H?8fbccv뙝f!>f3 F P(V w ann8$CCCt:0LOO333X,fbbABB,,,{ zsE. kX,|>歷"66S\\/K$ /_SN` Μ9fhhm2~`(zgE&qx A[[aZq\A'@*r%JKKiiiAٌ㷿-Pged2qhll@~"Du>q=qY222ػw//9sd iii\|o~LOO&pir9.]"11DBII RtGtt4 477I+ b %;; 㙚x***S\\<1;; єE`a… D"B999TTT099Rft:wIJJbΦiD"0::Jee%eeetwwrmAD?vq ccc\.ZZZzRtLNN233Zfhh;w(LLLPWWwۅ|FUUf 555)..F"x8{,">>/nG\Nqq1bNtt4V'|Lƍ7 Zb),,DՒ` ??g}D<nGc׮]U766!y饗hhhb(^ud2mmm#y7  HZZڶ 봶hfpp8$ }}}~:z r9o)++cnn)IHH`pp;w# 1ʹj;vު oׇFae}}]Pf %%%-Ԫ7ͼkp%9zzzdjj9.\ Ebcctg?5\SRR"̉bW^!++Vbbb7x@ 6 $l6㙛oojL&Z-wPTAmm-wOBAݍ`zz}{x<Ǚ{aΝ?@ RϹtp_ammMLvv6׮]l6STTΞ=Rduuatt0_ʕ+X,ș3g:iii!++!BR_"Fȋ/(#]9r'OdppX~n7k퀳nqq7|/}KnP(ī\.l6@^^8Jww7W^ER aBgϞs=ňD"braۅlR~X˗CII EEET*illdllL}ΰ,9r8nPGy:d2l6o5lnnVett{ǏSVVFNN ٹs'###Q^^H$BcARQ\\Luu5]]]X,A.ٽ{7<)))FX[[cΝ \.^ǃ"''G}6 77:j5?~Ғ0@ @ n%D" /}(,,$??zJTWWCjyW k><^ ~?7xχT*~x0 B<;;Ga߾}( 677 Ӊdn7 zUz-wÍl6۶~n7 k.HR222'++K(h41LMMa0#'>>233?m{h{BG#99grrssX0d}}ٌhdyy%';;[xGñ ÇEGGl4r/~ž OF&mz+,,$&&V;<TTT066Ɓ8qx^C=DBB'N@Ѡ뉏.Vm #` --VWWTTT1nb&% 7 Ob/|mAAnC,D۞~rJH$m}o_ÿ B75 m;ƒGMM7`F!B|A__ZV㮯GV{n`ddGBBŔݻIKK^P h4JV,..277w˃{'$77ݎbll N'~R Ϝ`ss*ݛ̠RU666Z x7xW(--bPTTOtsssLNNbZyZgg'dddp8`rr`0J6vXL&a%,''Q]hD$ rQQh6DA1ӱmmm<rp\d2zB @ff&qcddL9 L(D"966 i(b&''+W0LDEEQ\\DRQQQ&馸, tvvMjj*o3.^lHOOѣܹիWj|>^/z|2#ڵkc6@ @AAnd2QXX((V***h4TVVrqahhHP>KCJJ ===8N222@SYY\.gll RhD&,Ct:)**v/=GFFeeeLMM[o!Q*ttt/Y 🥦cj5uN>ngǎHss3{졾%t:TVV200oMRRVVKIIWի}033SH\V777qr5(**"++ Nښvqifgg[ޭ+HMfjjJ덍 )))A. ncjj'xb\.eeeh4JKK9~8LMM188dMMM ojB, iiix<N>2;w$33ӧOsu˩SNȮ]0 >}LSSjwyAꨨ˜?^0o ihh@";099Ν;ϧ6رc:uXjjjpݜ:ujkk˴RRRŽ;ԩST*!L`iiIu8#D!§177GAAǎ3>>NRR'N 99Lillؿ?X,&''㤤NopR9}u,De;"(Z'qLfb>7;Iώ'D-*DU$(RAс/Z"ٖ([gQ{>󤤐?^@ff&^ՊL&cttDZZZX,FJJ P|n߾-444yfJKKپ};ra^z%TUUIi.K ӥL䏴YZZZgddD"AZZ&IJBRw `˖-dffFy&nKwkZrsstXVbX륹Պjd2I]WWGyy ݻp8jnH˨SܓK,CP@ZZܹB&rr4UVV1Һ݃J5虙0;;KYYR=FJJ ~]oBH2liMM LOOw^)**brrRvڵ.\Tb4ΦWJA?x x^T*4vNnjejj JEee%ifffrvv{ uJ%999x^JJJn7,aɑ,&Uլw^Ѩ4ke hz 7m4%55%Guu5h&!]'!HMM%779<̴VrI/Yd---K/`_DPlnjldeel'l6/p*++q8F),,Mzz:---K׭^zi1B&&&P*RP^[[^GPPP餠}a4h4DQZZZ`RSVVF~~>U󚚚n_7lrss1TVVNz=@@T2LM/N'2]vsNNfFnf777'jXVߊ G8fa2p8377G8BVWW)..fӦMh9n~SZZ<@eΝHELj5DZ-kkkz 墺} ټy3Z۷oKnFÇb`b2V+j+FOuu5[l!++ Vˮ]rN>Y\\lڴ ݾ#?طoq"/yyydgg333)--p055Eee%;vpQ>|?EJJJx7zړ>77}gggX,}vvӧOK7vIaa!`z^z ~",SAAw̙3Rc鳛\>66lǯ}ffN.[ܹsn~l᱋D"?f̉'e[O7  ]w]Ai\r(>)))'T{2YKqW(mRܓ72=c2:)  ·SrQ_ϐh4eVh4AAAcccܸq^֭[twwʶm0RNq\ztuuIՊ.]ݻih4l۶ NSaBgg'&VWWyfY۷oָtd2:::ÔSSS8sss455I3Nׯɶmh4 qMjjjp8\~qnݺŵkפVvKKK\tX,Fff&;wf3=Crcǎއ>;wPQQNnff>jtsm$F\|H$BSSs}%]]]y>w󑓓Fy7FpNؾ}=M,$}}}8  ul6??磽h4T*.]DYYկFt:o.j5LNN~:9y$ͤk6>> 7ntRWWmmmR!^ʾ}pLLLOغu+SSSfNg?ObX,z=^fJ%xaBRۮ7dggs jjj[~###AY^^@ ۷|2[n׿5EEEXVf3r|ݸoܸ333B!^V eeeqY^^&55k׮111A<g``Ӊh_ݎNqF#&ftxall ^oMqq1ǎz:;;QT ruq:j?9}4jxmd=χV%А,33U&''Y]]1ټ.xstvvhdttZ<^\J_gaa\Y8fll4z{{`zz5sgpp|._"999ߚ"SZZZ'NH$ yyy΢h% J-.^HYYo&:N%m47zH  _Uڬ=0p4:غu+\t~eeeCSStuuIBPcRRRسg}gx嗱_*\.СC8p@j͛oP455QUU%97odnn[JT*}}}LNNH$8s %%%fi{r9=/"RvkFJJ nbǎlڴI;vH=c;w"9pZGQx FGG9~8>wѣ ŋ`nn猍 Fn޼||^PNGqN'}7o>qQRt233YYY!R^z1z{{).. RL&cǎ!|Gܺugr\{Ro>ҥKLNN_~υ Dѐ(^4رc\r>A|M 7oޤ[z~<Ν;;wޅOAvC&&&p9r_SZZ+"uҘ%"]CAAW_}^{Y<GA.t=sssLMMqa{=_J{ׯ_D"B100@SS}7Hgx(//QgN'17#N=s'??⋴ɹsP(LLL0??/v,?DPB<mMg,㣏>"sag֭?\~}MKK 555TTTp!^/PHQPWWÇ&SXXȞ={sKKK (**^ vH$`ff^{E jL<JZfee[O~~>׮]SWWӧq;wd֭,,,066RuKSSݤRYYI,C`X%++Kz~ZZ6nh4Fhll$-- Rd ^Ogg'^D"TK$b69}4G.300Kۿ TAA6sqYH$t:*++`Νl߾ŋ Bdggcq8XV{9z=6m"--FOOz^J!'O_ݎJK$шۋdtt[nh4"PH࠴^;##|>333twwׇ`l6ԄJnO,,,P^^<|PbN'7odppѣG9ryyyؓfnx<~D"\.GP Q*(qԩSuQ\\,U_^^fddZ ۷oSկ~fciih4J";;H$B zT*" ʊL>֭[TWWoAAkЗŸ}6V(,,d~~&Y\\vgjkkLMMQRRP*b1jjjwA r9lk0LA,  jzRSS KkASSSvjkkbӦM466T*$55}{RYYɦMزe |>ӑdggKX,VVV8t6 0 L&J40Lqjqi(--[r=hfa0kbشih ---c2X,dffHII vڅ\.guuͶnI{ GףP(Pa0X\\dp8]vQRRB,Cs!v;F/-G5fgg "L&CѐXƚ\ b~t:}}}ڵuC~~tjJKKY^^&cHII q8RTT YYYt:i eeeR\\L]]YYYX,F#l6Y[[#33&VVVF?s-5r4 &RYYɞ={v )--Ů]Vf  DBJoGiY|<ɓܹs|Q3.\ efh4KDtAAg4 E^ZMVVֺkmOle2Pp8L0ʅd2HDJm,LSKV:t|'=P(D$yۜ< x|CM"ዳ[lRy紾^jV}yy9R7'y-.zR  HJyFֲ>O諫_+@DQb3CX&Id4}q'u|Gg(" }aB!|>ߺOR"=_6LnQ?_|xZ%?HR\AAeIGȽ'H3LOtTL&{&Se2C=x<)Xu)·HqAAxGE![AP-L<׋h4J(]!b X}xxv1b1Ξ=K?YYYddd0==ɓ'n333ɓ'q\v|> c2P\|/H$0LR~~r۷9}4N{*=HZ<ԊO?eyyh4j|0Z[[%cZB)%yddDZM__gϞځq :Q۹s6>#^EEEnN<8T*it-N'?^/RuvwIN:8999Ņ Ff9}4l6Bܸq"=ŋR51OMMVr>OLOO!%wWq~:rm㌍jD!>3fggZr.^Hgg'zJEGGR9ıc(,,3;;KAAXՅV%q)]Vq֝ 0V~>'NpmY_]]ӌH׋/ɓAV=p8!++x<ѣG)..ް AAd7GD8s h:gRRRoAFFV x r 2Nn7hѣl޼u$h1FFFmFGGIOOĉhZr W^e߾}x<|l۶EZ[[18mmm׿?NSSvN2?룹Y*511R4 ǏS]]2ǎd2p8u Wrشir9zzzhjj7D&aZls_$kkktuuB c0x"###RN'XFFFΦ_X,Z-`47}jjH$dxx{6o̟goq8tww#`bb`0jZU駟HJJSkZ /^ڵkT*t:Y^^ܹsRyΝ;fa#;;V?N~~>)))?Ӊdbzz>^Wsw믳}vnܸ8Np8Ljj*'NZ& N'*K. XYYĉL&N>MEET*>./^yf~_Q\\LII >+WPTTlFVzsN4eyyJ4=ܹs a0hoo˗/OFF:Nomme׮]D"Ν;Ǎ7LOOt:IKKlٲѣGٽ{7jZ]~5JKKQ{=hmmw}Onn}`0( ݳg}#G0;;͛lٲeߗy{1tttp233`׮] f  >^D"HSX\\dffшd2QYY4+@__ˬR]]Zիn(**BB`||FsN477uMC.~vAZZ*_"fq!P( )//a<[n%HFҥK ioo "lݺ}Fall /,e 444{FOff&* NG}}=Pfn7]]]n)x뭷ٳ|ᇬ?a\r kkk/n7 jRB`vv#GVtFZ[[qب\R]]Mss3FQNJ8jL}6kkkq "!d2IMM{|>nߏjRVVFOOXݻwcZ;LMMSVR@ ٳgYZZ{طo=IX7o~8'5}rrB+Baa!###΍7hhh_zlo(  H$u}YG_oСCx^Z[[`h4x<yWhmmettF/餽RX B<o%x<Ή'z_yg~}]jjjv3Ü8qRac8G! 1990?W_K.q9 HD8z(iii477KcK$$ FӟDJJԟ|nn bddd(J._n̉Dy`޽~0rImm- ;;x<`ǎAn޼"7o$==| vKKKҺX,x s)xט%HiSSS\.f3Z˅\.'ǑdRVA򿧱 [QQ%%%vihhԩS k.z<rBl߾jn7Fbf3x<@&SqqпAxzJ%kkkdff;0Gh4o>53 );Ə~#i|q ?OO~۷GTOl۶#zСC8zzzhmm3iiil6VVVXXX`ddFGG b1.\;B,//ϳ}vj5rK"9fff0Ldffr}4==M<n|lΜ9p/»M~&?'_i ͊B! @@ Z<G}Dgg'jT h4ٳ&l6mmmAf3ՊbasRRR8t:NlE| `3DgRX\\duuK.122??QT,--Ii7nʕ+,,,pAV+px<}Ν#''|)N~/^dll?b0E~F)..ޯ{ѣG1 R\i4lTVVri\.=)DBڿ2 R@"WKAB@&122B p2ףϧiÃ'OoJ\.GTJV"?O?TJmll֭[;=0mmm\.N>.]bllWrڵ:D"A8n:gppD"A^^ |shhh@QUUEuut.$t:ǹu۶mCRXXȶmۤ"7OV /000 ͢//344|~z-dff͛7s5~a6d;`u@yy9wsN>M8jk.ꢰ1Z[[9uPZ$8Nhii!##h4J4EPHטh4IӱX,\p^)Th42>>ΥK;ɔxOq͛\z5~J9 Z8~8555;H[T*y6mرcIe\ᅬfjmi( cRͥB˻ﲸAݻwH$X\\(--euu;wRQQ kkkݻ B.Jvލfd2y)**X=aIIIAb6z'ܽ].KbAPzҟsrr0 (Jv;KKKdggc2ZTVVR^^Nmm-jn7ÇcX())zJJJD"hZETq8iiid2177GNN222ozlT*[l!==ZMYY>FjkkҸSRRZfEc(,,$//2d2> /@QQt %%q8xh4al6}SMנb1l6tjjjX,w^jkk)))aeeM6$f2߿łj%Hp{%}|d2t:j/Mkc.yyyA(ÁBh4rAT*dee},eOSWWGaa!l޼jʤ /@YY: v!XEEEA򋋋88B`~~b222(**Kqq1w֭[HE:ϵ5i|eeeITH0.r2331 LLLP]]--r8(Jl6nBYY@={PTTש 6 @jj*---DQعsz Fr1==&MVq Hx2 E0n7r=}ГرcnٿFoC{R}6,e]*l"ԩSwww,)YFAOf0-䛐xed2T=}AT*T*8  !DP(d${d20Jd谾0r `7[T*jZTAAATfggN ԕJ%jz(oM)httzʤ󯓆.<ıAAAxWVVxwD"466"˥~՗\_qn7x<."@AAA?v㬮2??/z<'e^/қ M   eDX,R_S w&M NAAAxqV+ez A|>Hߏ} !)Sg6}WY.KW[}ӆluvh-8$4jXx/nV?Yo5Y;ެltA'\pƊ]gIgFzYthЋ7s-+?1usPw3+o?|t`9آ% m.nkJ90Sjhe[]hSY%R;J׬`6nw6ns2E3&Si\Br9IxȒ3܅7ՇSmn$0{59؊.3bq m 宥e$%g( -髑 8q{6'$zۣ1U}9ph+Ji Jè:YS%5 ~ cml#vpYC{ʁbBvC@6i4B^PO7 @̲ x]($K[J5W, .c"8Pķ?9. Oѐ 9֧Y04}YbzɈ6hsnERgGy9Nn , hQPm,L?6m)9 !'nh;D5u@XaW]NZMCX贱 #N G*AI)dI#RPebȉ dG'z©֠); p5mmCUxTGjVGLp9"wD2ظl/Dmd7ֺ0?; W7ΛKI>bKGD pHYs.#.#x?vtIME "flIDATxwXWEB[DWT\H@f *jXUW%QXb ] ťـcPl<<2sfs93"B!x.B!BHb B!@!B!B!B!B!$B!BI B!!B!իdee.; 377i;ik!~`E;T٫oJ|\JE&MdgNBR(mjZv\~GG {,}u]+\VV۷G}ƣG]̙3䄥%7foe;:ĬYG&޽{SzubccIJJb4h}'OJߺu _Κ5kHLLxxxaÆ 8q-Zj9y$͛7=M ^e-ZCvZ@*U:uk-/SRRRd޽3vb}q+~G۷/EOZصk}Ú5kiLWd\]]G?h4 8;;3j(aTT[oooWZEVAceSL[nlْ]vpaPԫWѣG|(ܰ>[[XٳgSF ~ZhA͚5]6dƌ_Ӹqcj5ݺuŋ%ݝd릦 E 2ѣGccc+۷oٳ`eeEݹ{.999b :uD˖-֭/ݙ&O<ٳ4iDלݻǮ]JݻL&L hڴ)ǎCr] vvv 4HN_~I@@M6iӦ:tV˶mXr%w 777rrrKKK "55UYW_}E~jdeeahhȒ%K???nܸ,l2ׯ%?^Z sbVXA&MU[&&&VK~~> 2DY~ƍX[[ʤI8wѫW7(D|||dffV-6P|zĆʙ3gؿ?ofXXXj !333gpiݻ34`ݬZ8Ə)((G 2.\ Z**Ub޼ypeYqg~W9s u%<<VFaҤIl۶4.]DPP(1pqq!$$b+V0|y&JbڵDGGvZ._̘1cN:̙3wwwO΅ زe[bP Gy?3C ~#22pqq!!!x]FXXzzzۗu)a߿L%oߦG-r`ȑXZZ)sU_\m<3g`ر:eۙ7oѥ33fԩSxxxp1?3m4_Δ)S:t('O|a}^T[y,DZ"66VK^^G #F0x`HLLdJY. ח%KЦMX|2L8Fm۶U@PT8991tPbccuѿԩltڕ޽{c``@ժUi׮2RJ̜95jVڵ+NRoٲKXtgÆ 7''' 8q"۷wvarahhH~x!5jS>LI`>"K=<Z*s WjbbBhh( CCCe666_oѣGĉҥ{BĠ4˙3~x”哓9s6lm۶8;;+W J F ۷sss̔󬬬wU<T_i޼97ndر|wׯHUVٳg3p@+ڷoOBB_|EW {4Ü8q:>%&&2k,Ν;rss122(mKKK=TZnu*xQٶmے+WeΜ9ܻwrssDOOOI2͛G111|+1x̟?s-'O棏>*|FF[???Xre?fKvvv\vUsYg; JɴmVRRR૸Çd3yyyg̙Czz:ϟGR?ˍ9oȇ~ ί _P^=yhZRRR9)) RszڠAeŊq%ͫڵ+]vlܸ}TWZnԨQZYW[[["""ٳgeϟOff&PSoɷ%֜>}ߟo=z믿6]Vxb-[Ʋe˞{^zj6oެȆbjj}7l0m%$$ЦMd:e4M֫&99YoIIIƋҢE v܉FYfzjrssիR~ٳ' 4SNe__FF'OdggɺuHJJRÇ3k,N>MAA>ѣ\~aF[jٳ[ce֥K=zĴi̤7nw^e>7n0n8)}(-x:ЏdӦML4˗/˭[s}ׯOժUo[eΟ?φ (((ɓlڴ4Fpp0;v &&|ٳgrUuz{{d<<<ӓ'O_͛>* U"1044Ç >ggg6lȺuXt) 21c駟ViԨ-"//f̘Ac|/P7fӦM,_zѨQ>eYwֹiYu!&&;;;>ԩǎ#88ߍ1ggg>K<NJJrAƍysN>C@ x/_+;wN:sZ-k֬@yP͚5YjUzZ5999,Z K@@v|\64F~eT3<|BȱDwWԬYS]K-#$1ҙ 9 I KO@}|$SSS PT2$ӣ@y%=D߽U>:f̘!?TI ěbll̥Kpuu-s/ HHHPn`{:>>w+DR?&=%ْ,> LI#@ @v9Nα?vgv@R ,鮮_jigtAAA]L4b]֤L&-tAAA]MUUG(HoP,7> !!vEAAA.UU)aj&h9bt (e{I \<   "*ҿUs-|' $I C,1bV$65dYw]YAAmȲk:Ȳ<<9..IeQUmn[xM:ks9o3+']wIsi;Ƀ  4MGUUE9ߚ#IC4X,\ -2Y^MLfdY&o6fa9FŝTlMշ  TU$L&ΜM) AQI:qx<޽ظq]@ ӧey;[0h6躾@d&9~7od2:#ISSSOr 6 ñCiZdzOHkݻEgg'_g B~ "X.AK *IH$ $I`4ߑeE˖-GQEyfiT*hDUr]֠Nv;o%8SAK$A6_]wg  X Es6 PFff?~8NR_%xZiI]]-HI, dYbsbLLLRQni<+dY`͚vmr94MP(`Z l6Pqb &FFF٬Q % 33uOXv M "I2M;v}{ɟ < Br-hzYAbE=Y]dr[wtǏvV.IhL&d&ffL&T1{򠮮Йf.N]ktA4M'6l099wm,+o7*n`ٙO477~Պn[o=X>gddv*Z[[9v333H$_322sϽ0r3.},_%KP,{D") Eٿ?_e߾}LNNO<86l}3<<ߎa'?:nVv(lٲe3ӧOazx_1::Jww7N_ﯤNˍ7P-^A.%}Lk;]H$²e˱ZF%^d4Kd 躊$ җX,`tt,WwNx<9 2_X(z':eARV;L:bW^šC\s5 0<яӍ34~3gIShF2W~zdYqQN>M:Q,rb1n7 ,Y7¶m۸/|zP(+BX㏳lr G!'N`ttQUx_`L&S~$͠i*|Y/0KQ-\. `jYv . ƍzFjkk(RQd2* 8<7nP,IR*NIX@$L&EQf3رT*P(*MP+VpRU|Lf|>SS4xxXj%SWWGX`x<^\.̮]pLCC#,rJ.GP(j*t]cbbMػw/Nbɒ%`Zxꩧ=b1AA쀧'Uո誷@THX,+Z|]:gWZ` s4M] KLF, fql6+fiQJĉLr*t*_ZRf/*zd2YA***غu+W^ 5kְl2"---,]zzz0*++Y|~Y:TUKhll&Ik׮6&+XjX,V^ov0S]]ad2 dÆ466aXhjj˗QQQAMM5VuֲqlٲF:aʕ\~\.+Wd2QYYŲe=7ofݺu,]JWWW\qVJuu5۷?5\Mkk+*AA.=211`Dix K,S(cll@`͆d^0_6%fR$"ϙ̠ESSr9l6+<;0t]ՋMFyE4-Lhw d0ʣ UR'*ii./( ŢZ~k\u@XDQhtJeb$I rښ6P(D0bɒ%(4N) .K+p^7ME>0;*,(B2ԩ(NA$ir|ǽQ?fki:B~wF&/e0{3z(~l6+55= `K! .@" "Ipaf\>u YDBq8 :eAAAR:p@ 3E "AAA3rܻ2@7̾MAAA $,opsp;,{du XdY,T~AAAù}\RTU`0xYzu:ZI<P[[,G$.zu   n.IhEf3ǎ#͖_>00?l۶^Q$i6n_,OU+fqۻ   »9/ʲǹ뮻8r333ÇzEQp8***.|JDoo/=˖-+߆ /rxꩧ[M6qIN' dX,X,f3H$G?ݻy9u~;NEQfttKRUUuʐe뮻я~SSS<#ttt088Ⱦ}PUU9u֭۷AAAtvvr̿]42 l_ Qm۶|EQY1Lr9<$yfl65557 >u]~|Sl6i\Á._me-܂旿%oxrVt:d`4rJKK g`?G?Qr94˗/|B`0`61dYq\AA]b*v;Ӊr7iSSSX zc4zf^/>*z!VXA}}=ccc+^ WBuv;uuux<Efvټy3}}}{\veR(xϫ|>,ҭ^UUYv-D;3vJ?q:XG8ĉz(B]]TUUQ[[KKK ^{-SSS$Iv;^HX_f˖-   »D^E"BP^eY`0H$8feXl0( L& t<]*jb6QU /yᴥQM&T|>Fedypl6njeg2\.Wy2p? (/|t]'͖=b6ux<X,R(χ>!jjjp:MGAAAx'3@[;Υ^^8[Iz+Ϳ2Ug~ϵ,I( ߿+Vp8   rR0ݻPiDkAAAw7C6yAAA{~    ䷟    oAAA tAAAA]AAA.s ;AAAK*@rLNNb0\Rw( ;   ¿ F’$jvW-P(`immEu]?gY4eMS)R ]N4R]]drrl6[\ B8N$`0H<I&c2CeFGG1"2X@ l69۹wAAAKW;СC?~X,FGGdYl6T ٌ$IDQ$V~ֆ,LOODQ2L9eI󨪊%sa^z%.]8 [>o޽{gҥ<y,_s=WUmFoo/?(nl6?<bݬX ٷo/^BcN8 Ku3ϰ{nߏhh4oo ( 555g?СC$I:::yK TUEQo.Me P,}AAA.=*7n$Hp)dYUUktr14MCeVX\Q&''\uUٳp8̕W^I"e˖.x4q133Ê+xO?twwC=ʩS( rijjj(`RQQ`1.rvM:&P(غu+W\qNm۶Ƴ>f#sA,7ofӦM_s,c4yiiiaɒ%n7LA^xn&f3&|EX,裏Յh$Hzj>JQUϺuZJOO]vT*jb4fܹua61K>}4.V^) Y'NJ{   > u]l6smL&LOOuɄlFh|>ri&6mڄ(XV4M#dPE~_p nF#FI$dYwCkk+˗/GuD<]X:tC*uuuTUUN A#344D4ell Á Ǐ/a2 gΜC֭ѣtttPSSP(P]]Mss3(B>K"`AAAtIH&466xPǞ={PU}躎fQ__lFQzzz8qn:D"455a4pdY.?+t:SO=i =dE"ȑ#r9(---ر"˖-.tr299?N8 f'|Ça֭[Ǿ}ʷرM7D[[9rov&&&p8^шW_%s7b FFF8r]w6l@u^z%ټyA?{#/9 t   ¥ED"9ץs]]8 8ײ\ץ}ZU>'N_l   N.8HفtF?<{xΫɿ3T   OcXPd2yrщ]AA%NXAAAwb0AAAA]AAA."@AAAKAAApAW}b.nHHȲmw:hvpm p)PK"D}{ԩ  躮H$HӳAd6qEBg`tb4r}#2VI*"Jcr^D"/C4;VH<y&Se+۹ru@:4_&!L^7+ \.tt:,:.[ID<'קfSAw9tIHEjkkߑ +uߏ(o;MM8***v^%I" QO\.G4dr20;u@ `h4,TS|o{.!IX_pYeֽ3J$E!˽"dʋzr'IX,-/ī(${]Ni&tAAr9L&92LMMa2pH%I"Jf#ir9 8wdf3@`\.cjj EQpH`%I`bdz|JH Q-*UG[%ys]C .O[BT]En!S0g[6.w7 rR "dYF UU$-]!]8igffp::udWe$IBUE+RSUUի`(:YP(`0PM$av u} t[u]?AB M[J^-4 I.dJTg)t00[ OӴ+:i K+(YttU"$8;IW_#[̢!K2223Fz[ؗ5t`|.*1d2=9[>x\L+=.100@gg'6Grhll,v WYٻw/v˗{]<==ɓ'1 466R___]X=zcxx 6nX^4$.5kzul6ˮ]HӸnVX(/P(Ca"LrҾZAA ^ZPAvsof6'$N/zsA\l6Ν; ϗ@(MI(sSzFG-1!ؽ{7Fٺ{+2.-\UESfh3fUo㏗1A+ڌA7boF*L0*Yi4j+M&nW7k}k2U7/qsͳyq$~ 7<'7{9y$H|^{T*%J9~8'O$N f9v&N 9v'O,_?y$gΜh4SOFJ3UUBo|B>( F$p099}0P^xCQ,add>5_Aw)_ zX?~H$BUUmmm|N:ɓ'پ};\Kyi^y+󺮗 =07 ㏣( ---lذ||.CUU9©Sxp89~8*P]\e|LUU4M+ߺF\u}*ΆqXa0>+e;&L|+O =Z?ƫӯ2ƦظFRBn?M7sb'k;w0T4]co 'w1{10D7{g@͌Nh4dfLMMlr#2Ì|r^}U$I̙3\}ՋR{|'}'IcccR)l޽{Ї>hVUK|>n݊`_*c``j` +Lz 7܀/gOJ؅֦ib\X,F*io:`0ȝwO? y4E+`֭R)~s̙ ߹ݳ%4d2I<'fJ<'L˨P(; t]gΝ|gxxH$O~~s[HZT9Ӵ9pu T*hubm蚎Sq2d>Bcm\Q}lbe-ZQ^-l~]n###J[[Hľ}>$BL&tttҲQ\.G6E/=,+N|رT*U]uRT* J/2`GH$ux<Y__ڵk$Q(}}}fn6vKAA7Wu\z==w7LGG낺srJ tMTTTnPW:zԧ>,[ϗf6$Jzj>O{^Yٸq#---B!n4_=&InrܢX +X~=fUUq\aVg[edDΐΧ99MC=S{t#쳪s''9;7s4ttL+gOhWϻ|]Jgd[$ڥ$IZ򉴁"[JKW\8'O\.G]]^򴥻=t]/"0ޞX,Foo/333\yȲbWmwfzzb͛ x^hiiEQ$CljF266F:f޽_MQA| 0v+եg顫sM*Xob2pnMӈFH9g>dY.ʾ\J>-K $˜H@t( B} i(A™0FH_33Lf3:'gGeH''t0HMb^NNFd"8ְ~%.bok]6 ~"t]y<˷{^QUAkk+UUUx^l6f&) tvvz|>^/VL&B\.GOODQ4Myu]>K@EjjjY|9K,!YlnH$fo_f6I$|>nfiii)αZ'|rl66kR]]M**ן$I$I0_  R$yQ$IYN\* b0hjjzK_0sVfY0o@$h4J PYYy+gJjhh(hB@UU99W=W٨,>>>fd_{k<4q~; ih욮-Z|pY%mums'0J#k^&+Y?c>446xroo$ih/R/lW Γ) .xv]؞fm磣 .]{7sWQI\K+A5kNJTt})_%IbbbZ<.ҋ.LAA(;(\~w'Nۤm9D^,.B>l6/:p5Lwt+މ2.-^'NsE3ʨ^ŽG$fK?^BZ$IXU+ozka^)0K$-`~a)utca}\ci K?Iճ7bAA8s^AA^*z۷IlvS, yd2S{,l6N'TT*VoK֞=qehVD(cӉf{s@"l߳G/3IJ,QUKau``\K$zul^L$F8邸]AÛӛu[d/4KwSYRvIuT}wzAAw7ww%e\̠FG"8AA?BAAAA p[    Wn|T*u*   YvɴE$IR)dYrOAAA-$@ d2_I[z{K2$Ja6tz4 Iʷԟ=ro3"yi"~t4MCKuϕG].|AAx37~ -\}y\޹]EAxo:W?Kq}bRF-NxX,SUsQu$Id2, VwVc_'N4`ժULMMq=ϒdhmmg?1TUU066??B,8pb}Y~FGGYdI=O=?O9r$Inoγ>˪Ulw}\ve:u}{azzzBg?^ s=< ST {X2WO<tvvrQfYd Ng?/:q. &''wk(~yz)FFFhoo/˿ |%K0==Ce]FP'̙3tvv255/~ ^y( ?dϞ=y~anVZnE- \8<O=tvvw]t]Ǐ]vt:q\<w}[}뮻Xz5|XVl6y ô( s=KTVVbyy') ~~_}vhoo;v6V+|[ߢݎlh4rIN>Muu5$fQUuqE̻l2>055fڵ i6o[oh4ʕ+Zr>,CCCDQ"T+իW311?8p@y###|>zjjjsW^y%.I^xr444'O$sM7cN:?G?Qx.V /??b Jsssz|#aڵ׿FUUV^(A2 < gΜ!Lr\uU,[ gejjZZZvf&&&4@ @oo/vǏ{w|>z8N֭[Bڵk$ɋ]̂ %h4ev444Ê >|r}QdYfݺu$I2 `;v000@6%i\s ݤifffذa_~ydiw}b1֯_OUU;wdϞ=ZVV+7n~Q~aZEah?ϩS}}}}?eΝE eYl6 @[[nftR[[+]p,[ MӨaҥLLLp8蠡r/_jW/`8r[lAeo_Nee%r+eazzgԐNZttt(^A]b ^n7555徦FFFXbP__-===hF}}=<Hfcrr:\.W9n, MMM\.]ױ3221466bʷo߾UVQ__i455s=C=fc͚5q]wFف:DPW_eǎ9rD"?0b$HDP.&&&ؽ{7nݺnx<^`q_d1L|(Wz./ɔ={/g??A;F"r~ʙ3gr -IR|f188Hmm-{ذaǎ;o fݻyԧ>(*-T{M7ݴh~IBڵ^{{w^7̑#G0 ~|ӟ&3==M6Euغu+ǏpvZ>366F8|3J(B$"PK/ĉ'صkv"ɠ( ]]]\}\uUn? |d||\.GEEb_;v C&__p8b1ZZZسg?8tttuVBlذUUyػw/\s5sp-k.r'OGahhk݋b/fvZjkkI$xA~_ri*++illѣp8뙞Gunfl6Ei ¥/ |+x]]ccc<9s:뮻pb1xxꩧB,Y[A0d۶mi:իihhcΝʵ^[{, _x[Vx:``ҥs W_}5>;v066UW](B{{;< ?ٗ/ɐef>' rp8$ F#BX,f+&Ney MHR82 p}g%N|XVrP``0:dN>' a4fSWUχb!cZ'aywYbi***cr[ʷl^T*dbjj UU1LKT Պ[tE AAAljj ]\zDQrtnAAAAXx|]AAA."@AAAKAAA tAAAA]AAA."@AAAKbgB&&&Geq.AA)Ά  hmw[Iٽ{7'/8AAIBy|sB eop 7 I[Ns]]]|_YA!y>Or# O~AAApI6 y! )zQbgEAS ^@D"k$q|nb1rUUU;+ Q,~MAU<333133l6*ic]ϷvKWv; c0hhhAKwAAAA}!tAAAA]AAA."@AAAKAAA tAAAA]AAA."@AAAKAAA tAAAA]AAA. Os:#NrDX0VGfaM%+VՅ=9BvCg}T[j#tԳɱ{NԠWM2Ul63gk!`V5J8Rv䯣yiRdCg6`C&ƭ~ -o{8JBE{(fvVdcrv'xa}z;^Wa긌' 1%nUL^LrBcUq/웡u&ΉX#>6WX m˰:߅R" |?+r\ONaQn"b9@@sB\vbL)LjiG\>aMh%RpյTEn+';IJv7rbNqVw`|{ʚ~RM1iXq43HdSF8>ngM_eIjpdw( r΀썲n\UTIlbֲ21њ`<6'p>gBgbDBդHDLqidtC+@q> q [t4ni.%8#^7aj1K1.=Eh}u2>V({IUH6e"lÞ 2DWӴ\>z OA#kTΨ$g^$t)x֛Q*ƑR!nz}TOXzJ5Rd {9Tvsd\} IVIX,=1mulJ٨MDɻ 8LLIJB|$`Y)R=*zoT|G8uSQRjseWiKLQ2l!؜gv;4 "bWi93YWaCJb ֐#Fq+6#[4T6=&FA0@^yl,ƀnkpW)Lu G;{9Rn݁iYj E{;Hm'8*J_)bF;5) -f1T9M!ƟJ21Vά.В˂h%158+FY}tNbW!Ǭ{S=r/#a؂MͲp==AXI1%o`VC&SJqb4'1YvWt-3=hȺN ӌw`S׾%qz9jO1FczZC Hk0Z9?x G ['0yys2c/6 b=X#iVX՛#fL#j]م{܂Cb1X1L.Fl`ib&i>{3= 29F}5(4Ы=B2yl?=qp%ymi̶H/|-T# YkX0I6z i~r*:bSV c0xs)<.o z͇FQ9)BfV&2s$ڲAAٌ+BF Ka1یtGXE+H%]F*[VL|XF1%8`2L^OGNQ#^hL1HSzOՌ}Y/Dkaj3adQ'L KʹWc\5b 2wQ̡)v]ILFƱIf4+F]E'G5F]UmD^Uj{/@rOcO5eMpc<#Ԥ[xԖ݅pLmY:s;^W,~h:-7T9X:~'/U}OstyB0YɝVni { [xD'GPn67^n+4+'Mr4[io/aw}+_n̖Y~f%!V1J|ߔW{zH\MqVg%|p꡺6jo?ckg$dD-/^\oss,d;Esϧ"Gkohz?Kw:Ȩ6?uߨsXmU"ԿeTn`kdȍg.>!x;}}UU=~?J&&ϟ__1m38XDÏ—sq.^h/s|rt;^iI9j 7q^0#;?HE _U9+ÏH;[އw'^DƓ9mnO,IbiG۸kknqRsOx Fi;,Ouw1 pS߇b"dKicntjM#FOy3F_*FWg(+x ќgKyV;4yVeH=r+m˟f<LYݵ|led8tsl۱hpZx~}̑\4UhɯO!/~a5;x 7F}/wߴ/atb-=_?KW2^FC~S[/z)^2l"y=՘0me]׃t}{=~Ͻ*'o ?l}_/ ۾c׶ q"+tGX`㴣3}A^w8S'x~yu{Huz|s U ? lxx;?ٺUGvt 5s!5,hZ.?}Sc[y&}uam4N`8{njF6LNxhũĸ1*.cZʿ>ȞU0bRϹy4x^5>I2k47nj- sI;8u>N`Eۻy8bOOQd/'Sjǩ6'& UI ~e;{O^z=^1_qMZp(yhL{--q7.cg-\>1]J2v DfMIm);~p|c4yqW8ݸŸ>D!9'_'6ӧxN0S>+l%ck빣~˼Oѓ۸g?Cq)0xݕ+s-N)&N?S`]&xOjz?Ri;cOKӐPISHnwT$2W=>N|ܳ8}DF鏬"'leȯae$0H?{-ݶ39K٫1kK 4ncO|[|3Ro|_'}>qY kC aDͲ]|+|L+ ײ8J(~_cjTv&G = \-L^G1+_TOs)"? l9ȩKҺW7bղ-,= qKn;_~gS|j E^6qPʄrh mE*3N}@^'di SL" 3/*\J>VC(đ&ƍUotIôǴp{azD5-6-G2;FK?u^3}Gn7~b~=՜ltrkx}67;CUI4s_ٶЗHWy܏?Tb+d9=t%cUv>Zn ߏ\ͧ?H}%6pf/~+NHnNX[=s-ʄMCTGDo;ZjVęZV)"_τmE(`?-p\OJl~?gJbu ͙I'e#yR/i>@@='m)1H ﮢXblg;HZ >[Hz¶,?ݺ=̒8?kʟCoCր&3 VKWvdw9݄yx3S|s ??GG*N*knS==<& ޵Twp|'Yo؏3W(\/5|ja6>p/_,[E9CeҲ1|׷A(2r;ywEIQ@2 2,(wHȲ"t"!)쟤 ϥl@g?˲,Kiȳyn Ef0 )l4`ߒ$}Og瓕لϭl a64hZ IRdEL7;4KȒH"#Kl$2RNt$0[u&IF "(i> xv=fn.]E.$iv֡2[vi2A]?$e yg1ȳ˖nHsT2gABY 絴e_fZB(e ڸ>WO<Ey%e;64NiX(s\#u4m]n(}]y_$>FˇmsU}77}i<=K2ٴm|n'Iv)_VfrnWO-Im]bm Il;(ȆRPS-R}=}v:׏\](҂}}2D6ʂ|ZuiA9ɹJ#t< (ܶ,l;P$d]*<>)uAre~_wmoc\+ /8Uo>I'zҶ+2Z$46+ׁܱϗci5v1[vGJ8vK>ua9> #$}omN^p|#4Ͷw/l?i}WY;yidZ_ ܾQXp%I4~Y*̷9`|/q,sڳ sv))adZE.#XG-<*Iooc ٠O/ϗAxPVrZjܾr%-jË쾌cRW/y^)WR[ʻo(6D}sǼۈAAAAD.   7}{2yZ[[Q'O"2HTUUFIՕgll6*++/z   %MdL&b$ ^y/_iii8x ǎ_2G???r@@}U>I I: !Is,:sM0 $I_F׹LH< qvٿKH崤rR~/&~##-ʗ^z`B9kT^ zyy8?4[s].~Eϝ穔qIXj7:߬ [gҲ7r{FѹJ ?A_PȂM\ ٢b]P&妦ϧqVgQ~_Һ.heEf:JmWs~gy]9 ]\y;XP g=edVVμ`yW|A,\'i>ca-.ҿt]=Tn 58w}qͯ^GZXzyR#(7iQ[R6uzRW柈+mryMrV•Υrvj^*I_P:7}~[^J( ;(_s}|u0?,4ߪ:XA_8Jm}a_}ۣ,}Q],-41$ia-؉ץ/rsVK:ڂhs<{/ڢϳmu; -JsNuSrL*ͭ>d~_40?X;tvMZe^ϙamT}sۀTOr zy6~m@5 '5yw'~Zŭ]ZоKHZpxvSg.E F_N}4 .˟mW:C:u尠|]Kh,^XFs;r/ul O167w:7 H+|a^sx=zX,Ɨ%zF#~6b\D:638r~/| yB4,Ev;fU$݇~3^Hխk^}-b|pFoOU2f5țPtau+d jd EXm݃#SdZĤYJ_ߤ03vpz| ! iGp` Չ$qĶ+]x 䤅[_`Rt+#؋YvWR `D NJNxibBwxyg Bj]K[zSUL1Ջriτ /81#dqQDZ{Og/ްYUq©v+qI]0M0L`.a򟷐B[iHD1p ;҈f-LX*L=*G=Ǘ2bF29A7S+d5ɓvSy>=3sSQ5#ѡU<ڃ ݬ 0_BѪbi)y*Q"Cx~Oɻ*{֑/hR9j ԞB&_"!5D%FU+!+?ȤK}(kLZ#Yꄖ SqV4nņ<ݴwg1 -Вf4MaD?,hYDq md]F]q%Hh$|j:USJ!jNVaqptnQc.ܩGڙpC96]y#FT`BStƃ+WP1*N9yQJ1δJ^z[*i 2i&-ΐ1huMpT!I͇p ӻY`d3ݷRMT0Wvf{:)67$ݻ1 IBnZgt*^J^bKkWq$td YO4uKlj9 XG݌[JyP{ 6Hu>Qz/3P 1ҿUV4=pՄtI6 8H+nH8n$NQšWN|)z0uD t=Op Zlk!LzmHtb:Hz}?0$l%I+r;]կ=??̨W| qr&mAd'rJ7!~jxhB|TH8"rWUb31ϴԹTd,:}tdwr`:nkz~P` @bMq [`D/aXRQ08m$kVFu}íXQ Sطlkw$%[( 0H- ,;Mxl6Sqzd{ZEǑuL؄(}z scNb3-d P%bL6gSX4aL9NÐn4Suӯ^6D %lK3r~$iD,U1m 6fÌ&Ybl&;fBJX)TG{P:Ɖ4g@0J2쨜}pV!~fc}1>)c"Ҝ3du)o m jtz1Ƭ~^I\Kd%2ӎfHqiN]dI KM bIH&mU\男C~RLq6']ˣ masCDdb!Cowp̘7% śh-`8h5^y08i*gEN: q-xQW_V'R5L59 SV|t@r 0Ԧ6z&jb2f ̝btt~TTTP,(#L&EAQtou'$rJĆQs`x`7/ArWaqwTZG36 $] 4B誂1hhIQ[BVtK^%&P2ћ[ODdf"KHND w6K*љ#`WYkg2]LZF\=+BɴFcÈ>Ù)Y()Ԩ\$&*QZSSqt#X]䨓&Vf2օQ/2:4Q\,lգؓ:a5$,aHM6km5xyY?E͂'bI0QL rƈ7"ر-cLFm.c6RZBF7(E&%;݀dz$r̰ǃKKpаi'_%0)duX\AU֣'x04ffьfsxsJ_ġI9mਥ|Jgf56> 栝[8#2zEљ%r-$qXD(*S.'$mDv[ T:+B}ZwRUWĠi670RGe:3 489B3)J j$ckIuQlƨjHd:=5.tESNm݌{\f[$k%N3VYd^ZY)y/3X8 Q,A3-*Q4i'3qI.25_;ޘF9Dá5hFq$98f^$TSu܍#$UpD](M 8[,& Դ%8L8CTa !c8݀E+j&FSnɝ 2PMbg|`#3&rvd+''GJ ` W7C. 35=Fe2.xvRD5^|i^j[L2$ 8$6b#np=3GcLnT5QdHjSLb 7̘Kq#o\ʍ!6Վ_ N+8HM1;).QiTF5)՘|2.@vHuZY2J0NvSphd"ߌ:Am1@RrNՒ l"f33c7ƙnSQLyؕV yWI2^!`RL-RњUWXr:eG%8QXNh8ESt2SFD-*'j3X$\BH? N%Paqe_YmaBUO7f4Q]dșe(Q ێRVLhLUZd߂Ee,ÐQ٥?$Y#rwOhǢd.(2"f:b{^RQ;IBtO#ǫLZ8a2$>xT63؝2V"whZ:JF6؉rGo{06+k1A?fJzF6QFLN 9Y#UN{M,UC&HŪ'L: a_",05:*{g(kwO I#24qzrZ$j.zNcH!šn1Lh":};snjH{#c>ݧwJ3 ϲd>cBβ66stz*wS NƊMuI㴳XC7ѧݛ`)ssrȽI4lݱ g%.{FKJ/1kH)8GNqqh$9I1Qv73ȑtηY~w3??eYC=se.]ĝw\ ^{5{9zsssv_2%p FHae_ 23W!Ht0H1˯ w֍AR\A4HxJ y*+F\\gKpS!7_z厮 >/מ6- c+_qqVHoN/zY렊zPr,ux{?gAU``Y逩nK=7.LJ>i8J1"H\Kpq@C<66B l,AQJxu^.T`CPJCخgw?Gtp3+_/9A*TA  zM{> |wKt~-I{ j`KxoG,l? :ud$=@?~#rC>?fgc^TlCڠY ?A 58P^b׼?53TW=7Qt{svvEPn$ >yК28TI!<{Fףۡu| ڇ5p@ynnQ8ޞ?jz, CG5TpT .J f*?883o*LJ8û?,??K/DP{yӛDٳs=} ;s GYZZⓟ$ӂ"D!B"D+۾9~ ]}{߁Mx{{!h ”koB2#.@ Д{ }=:%:C5W4h4$RhH)RC]*w$BW4:B_uW"pBʟ'⾆Ghoj&$H &$!ݱwέ!]RHtʯ T:Wo[CJ.@*5Iw )RJ$5<=JԄUH$:p(DxIE_!ѽm)htol)k]s@V]"w^%uZ0RsׁB\+Q~N$h]׳Ώ :5͕OjH\;J B 4CURd3$ ~b =n Ms1M_ IDAT ^ʍk59Bˍkq뺤pכ tn2<>QW:H?ָWx> ~<h^\%>t4 2y/t("k_|a+BJN4|_" \&@HЕ E!`kU?hB|vAI7nKЅk777/z0l!8rA 8+%<~hu$_. "Q+t+.\ 7Vy tK5`##4mCսix)t R*4M:}@|ׇE9=]׼Lh BJiC\ՓGuMyH<]*w,ϚR= wOϞNh=}jCqchҭk}={yQdt=OV.9En^+ƋeIQJ_BU>"/wH71szy_j}{B6"zs=x/{{1 xZlyBe%/G(\(RJе`H7O E>VT㪗@գ^t_6#!o:.?{ J<~WJ})/%p}={f.''CZ&ΟJPR4;I4|YA>E`EB &`Y8 عǷ+t˿uR{#\+&_X檝]r=f|`S̼"44nNX;eG0*Q-D/o(]nubZ#@IJ;Q5i7 ߡAq gߒm Rm J|a.M+lT^)sXAjN rN[ù5zvF\RQtDFfG =Eξf_f*${XɯS܄}Y OV8[^n#1Ymh(SIVxN׫tQћl-Ő-(|q`^dk67kYW\l,>M $gyXd ^< hҪ.)7;uQs}8a5⩑-UKMoq^9NQѨjqLMc$R"BAb_Ryg_k;4{5 JegEFk":1 ~tsTAz:7u4ЗMD,k9PU+ uniHEsMLbFg%*;<*.3ըܲ=ROv {^<_OW v;gyJ!mVW`Օ;äha+4^\y-e *+5yoda2֮0+lƋ{%ʹ j^%kp*,Iu*}?oWYtK#x`wkY6i`B Ee3¥|ծQɆS s\ߥRjbBD7Sԛa&Rg)^t:]\8maBgVe`21RcAoҨo-Q쵞gWcn:bF̲Q+Oj2r6*/S/( Z$M9arKu* lXWՎMj6Zӷ>j1>mRz*fJ?DdwD'SP:v"QIN0UE]FJ}-G0y}6!Zd%%ZAH\Eޤб_2޶ٗ%VkO".FjaL)ctyNr]kuKiŒF{E]͛gZ4u%=5KDr#ѝX+;FE<{ƈLaˤRk龐$z9H]&=FnQjټxksWR4ZMiF>QCO(ζ.ild#WI\b\9}3EZ ڪT*FFF>ckk=Dj3n_7ae=AoIgU}W {Cۛ58=`녗jKx}C=AOd3q9Sp {MIu;CrKCIgs8.)/%Ɛ~oˠşGHwHzPcD=~#A%&=q}{0np+۳ lWg7\<}  q Cvz}OA_7yq!jO|zOrm,s;.­v nn+àgz*y oC (㷐RZ'^У|ys{ MPʻ޿&ej^ 3?_25Mxz{PI9h}+J92/e<5[g4OR?DD;H5'o}{8];w Ջ-ND ~ g6s| =A^=z]ǿ _CˏR؞M?kdWA?O!/1j^1dЯ|Jp؇߃>n^b?O:|I zm3c`->3O>s_<*NɀA~thNЛ:_G"҆ǂ WEo/}&A/rkwP|{|'?Z&Q:=1ߗ߾@Ox'חz|<)|?:_;s*!^t@0w84{?A\%x^ F sr 1L ?OHs|$S`_|ÞmU>< A4ɩ'"D!B"D!m=f-D!B"D!B"D!B"D!BC"D!B"D7z!B"D!B@x@"D!B"D!!B"D!B"=D!B"D!Bx <"D!B"Do!B"D!B "D!B"D!BC"D!B"D7z!B"D!B@x@"D!B"D!BGiLx!B ]{c4'N5i,8V"#{lhCXHd."n%-t"QR&Ի38GZ9>5%87NIf[%Qe!#Mb]IxLJLG4j$5leA!0DIjanjQFѱ2DmCg(qفc%Y6hhC2QT q"v0c D-.&B򎫌 7'(Nm8[A65_R?W0]a}!Ƀyz=J!''7nPi-X<=9%V3pGS:;$HNp8{J"E6IGk;Nr$y&2ٙCe:DACЫM(xR"S6نȡ[ wh'hf%,1^ً',퍳lމ2tFd/nB;A64c1h&9F\/R:!7I6DbFF1GOFZds1],Ob-1[^+z'!ۘc]g&.b1(h=JԶ1BdtDMW1b1Ӧ\ i3^7..ccOױ+ctdrk1Y#4znv^"'V줘lA?J:M<ڤ9ӧ['uUg4FYʮoE/FNlcK(G1Tb9J1Chv2hN4>B.ЎEjc$SZE-sNj?miwqJ6S=4ÌZ-VF8B$7BMq؞ӏS;e"KIŠ HV#h "eh1V:9:6G/#cw,;LW{4G(dLvNkޓU73mz'ĻЯOE1htT/N5H7spݼr8F)1Fc:)ZL1E$1,=:)AQL!LS=ډӕEm1gp\yf Mۜddvjo-R6gГ-庐0> ]P[SfH;Ƿ;Gi 3IJ dRlTi4V!6g)W S&7%!+S.BF (r3ycJ4ɨ64R6`rG:k# -Ti흠0\g*A+A3d.*cLY܇P0OB0 b3+Q(%iQJ쌣: t.F2)LU ucA&h}H5ЊFi:FxIyю3i'(*mL 2%rrNR=`D/aKI=[Q'f 8jD3w +a1_8$Sh8 n IRo J;h'%Jwh&#LvB,G$ӍDhw&2}2^ԒtUg~m8=fv #*Hq4r''8W1*8'3#=M3T= Ma2 :ǪЏ(M &; :6>ʑlgw83NfoMaf1=h4.o#F9F"%\%OK; `>קItdJ%ё2Wfp8Y)2=CVyN Ƙsuʉ=]gӧјc_e$V=D=^ Tfˉ2Y5!Ӧ;ndqJZ *OP'ή6{QZ VL0k3TJ'8FeI;Azr2#,-[[NRI`Ggv(UN5`9QE,Q)iLrq$)G,BA+C7ᐳDZ>q{so"LD%Ci(# X]-rKc,뤺6)O+-?zѭOӶ3(3blY~iN7wƓگtzD.9)sST 'Ar3HEts" Rz'[)zY*ҔtDjq''qXqqZ'Jݘ`l/Bs\Fj&#V"B1)5Nj#TI11EUİ+e(;i)ϓHT1N䱛YtF-ͬv)f;{? e/$_ʭ[,DB(??O8$G16=ݯOsG*#Ӝ&Gru{1,xS${.ȕËt8u?J|o?awyz_?|oz[(tt49::יa.qFĈrg 1S1 ~CU|eZͳs_jGb_a] K=ʕ9oo]5㽿K컾)œlop~?ğ~_KI\j5rډMN| wػESKQ.1K.Qw}(Ŀ{q< _T_=>0; ~|at_MQ x܏?[=Ͽ1_aw,C>N'~Q~?߬&y.WY8|so0qnCxC<˭qo{ ȋW~?*ѯK0?|Mk? >Gߢ5f9g1R'W "]"\;G:l™Ye!go!_~}?}%^='ɇr3GY}Gxe-H$syz_羏w9'>Kxj{7{ߪK:',H>C="[dk3cD.4 ~枿\v⣟ʩ\F_?QSUS?[L6yn+Y~}◱r4w}ER{Η(ih*$??E.Qz~Ƚ=O;ocbz+1i|<ǟ`~/Mf&n1_mSX/29Ε3ݏ;YCWwM=}L ~_|z@~>5ӟa6yۗSz{/ڧٯ]?ߘ;KG򵷱|8uaL|Fry8s$<=Nwrs|G 1ڕn}zԥEC*O}/8k|_9Lɛ}| 9Y^}y^M>xx2>D}Nes*{GywVn~g~:{~/|;+OWv#wf9lMpCY-;WY؀ 듿JnML+Ǟ|w>{6S%Jo+'>v2W0Lr_Dw4?}#1\!MOf٘c俞z֗v_便o_<ֻL ~}]?w/.?%%'̳c[)̭ü2}|lS9c{;<7;^;~(!`NXSǙnr#_f(Z5?%n]XD>U0#QP$ٹAoqu/6*Vu~Ow~2w=1˟)lr!o2֯x;)Oǿ\/V>G_wJiWor3*"Ѿ?>S>"GUOrzʩ4/|_D)op\ٙ{O4@:Fa[اvxg9A8]~^rݤbzdS4l3gN1bm1T>_Opa%PNϿL}[z`S,{H+M^E.o1s+z3w.x2V;},n(¡/xx_mcOҊ9wr0}'/Zd“_|;񛳼{q>u.:Vʅ}HØGx_22W+z_?Y>\>>G TЯ|0[,m|]ynxk >*W'le >zTߺ'~z|'%lf'y,!~~O&__d{x36="¯|7akD+ .X[/&_?Sy&߹>fշt8Кt\8?o{o޲NI1'KE~Ǜ^ǟO'8#ǖ;57fIG{O7N|6io9_?ejL{X o>6P5MR/+3G^6ξS=n=?Jlq㬴߄UGf Eg>ǿi~љ3J8//|uz[Ǹ;Ex뽟<~wGO5楇>~ڂ|\]ykr?~9r7o3"=ibsl*07K>DʃkeǨœor)f}Nқ ~?Nx=^0'rNE sh ~ܦoϐZj0 [59(ww!:c oANܮ~B~zP|[<-^·+_\d[ew:x`oԷzo?8R9uvev<5sg[1N;}n^;Lf;_ 0j觃f9Ԑİ*#h7w@C*X9ܞӾuq@gñ6}:r ymò tùvXo5q{n:9gmrm[!?;ԩs0to7!0ׅA8j(v\<6@ m/< ^׏PHiyq׋ҝrC8\d֕Tnik(7xJct8]*P<-%J uˠ Qx@:>r?KPp9:d* ?f מU#ҍ p }/ o!yR9 !? S݄WAׯ'Pe }[r_+pP|%PrƪS{3 `B)/ }z}Otsb^?W:~c|b??6h8Cš^V?w)ù{pn8BCgM!n)M90 —1n~}[re3CIWʥͣ|a~9“ch!==`/=zҼ{(/NU︯kCSy x* lܕcPneqFsl? <}Hoq Y!t4e`﯆ ep$c{Cy_5AC:]vs??`8#nxbPz}Ja|(o?{)38_5;'ZWd9CzJyVp8:k(pPbV1 m_vU~~ J)N8~666VizT*ŧ>)DZmۙQcyzQ $acGkh秊KQG[E& ʬMs̡ FIm"$h1Fk@͜kwв :YEwqէ=gCd2vKC9F"MP>CZ4.6IrZ5r&͇6& zu 7Nb@;c:QbuH'}sݓLwthvnNbQ-@^M3@V9|~֢( T#wb*!Sie9#D FZg8Q6C]Nk4n< `y˕7s.ڳ]IK!+w")%2l'5#lBB̤ӚbD#I~$ (4sG1S&wѻs΋1Pg w!fJ8[.`V'%ɮE12F2K9`8C쁋\m1;F MC.t8=z f(DiuFEMcy*íQ њqZifq5v}{Z*B6VG:IE*3X3_<ROvD/iܷGcT vii>t骠W9(dWQ{3o'ڴ LXI4r̟ {m6uFH|KgF ٌcW&xebBbs,p(Z#V0u=@cDS7H6$ ԬI99=`g\N'n)${ wZK.yR[,x -ټDxͱe[.'4j GhgY:gmY^nūwY"}0Nў4(%Ӝ: VSj) cCcܦL0k`Z1&MTHXgOlvXa;:Kx8U[# hb06sHxr\*(fk6<ҩ&-nOz=K[8α'u^<3Ϯ7cܪQ?]A3%g%^C164e‰F2Jx>#я"t 0PnsI.L8č)^|g!n_9&r_}Emd+2q $^ӱ3bԖ8Glv5IK&XlUN#{1VL{'Z) t9SϳNJn6ߋ!uZ҂Cj7{ 3ة>S.ysF87z*Z k'4IF{]r SIh^~Ӝ_Xѩwp+z;⊼@**ʌpw9=U80HZ#:IGhȟV1>>N&AA,Cŋyԧ>DpVJ!o xAKaS0ƩmF֐GQG[&Es;ypCtTLB5G[jĉni*마E}Mg=#Ch(&wN[_l%Qd%rD-oI'-|w@`Q8RZ 44N0jS=ڡ;Ӧ;3!=FtmatGtq9УzފbΣ6ahaT/ȃ]%lս816C8¨w@|M$3r樢wBqԶF4X$ZST%cK8)t:Z;a߿-;(LM RNg4N>y@'#b*NnicWljdsMaݣU)+<ulѱM݇,(ų!=fǹJ3T{F$APD aIl`73 ^}l'vMU4aqIl}3m>ӗҐf쭼wyLϬTF7_X 6;C)&:S0G[ٟ7bm8vyΎsPi/ &L@?G~]>͑&S[Y95h#gxqNy4g͑_'O1L[[ݻ7#~xɂÕ#I&qJŚf661;Y{Gh)1kq;,1۠X +S_RdV1sw~DT:f֌;(fԚsLXpLbfWΣI5ҢKλ)PN+e1ۢIkЎEg-l||0fiqrtd5ÅM wX*L R-,#-1ҕM#;zpk~[)ZzCŠdWcejvҼå(Ҍ$ C{=J%%ڕX"  ǙK9qlf}.IkN/'MjT ɹ%9A'n1Srx1ڱQHƨړ(4*S#{t=J铌>bL{@C>EL+θ*s򺢞?^OhF/d"=K-.w;x^'\cw" 6˜jsYR8rd+N<>*4KEilpu0Y'K_>Ⱪwrv~GzvZsJB7kR)vm*'[XmZp=nGf(OC= N~)<*[[[ܺu 0x;OOw9ƍ+V4 jpKT ` *R5( ?\ *!d{Yp@PZ8^PK a(we<[1(+|@^W4(CKrCgX^,JDdw%Pwpk_6~V亝nteWs*_ȁ\=KB_/P M_Nyk}9^lP GP_P%=޺R2FS(_}:bȾ.|yR{'~IpAg  ~_P =z@/ȩr`? Ç|^x7?~3> B??fjj{~o|b1^z%fS"D!B"D+۾}?O|g?q@JD Dk(M"4It@ MMCjMJt44 .ХDMjRQ=F ihBIDGJ MJ5!BCWZ0@GCH}ޛ[hBG&ѤB ݽFMse)$t? W&uIBwd}yM> j+NpuHAiMIBC }? t)ʡcH4jR ҵ# !u^ʕAt ʨkHnD4O/*"uhӯ <-sޘBD\Yt7_Io)t;9R{sH݋ {qPq9K_r?k gd[\&]&5.A <~hAә.$Bz⢒k;t!֗Axд .jBC4 ;|=ࠐ7nJ Z|M{TBD9] W ntU"_B_ M{yӕ|oOsםtOߞ^˿?vqc ?{ BJ7f Ћ{\~ռ8SBӂ&.B?ǥO`r[:.qcät7,O{.~֕u) }ޏ )<Ե+}kk\8?(Zۧ K<7}5i;Ot{^ݯJ ӷo ehyPӽq)МD:x~v? "^J@Ǯ:R'"=i#^>^XJww#ҫlu'gy|m%_uc+^BA.B*/񅷧GG9۵Bz4Kgoo ޹C@Jw%Ł?_s:W-w#P9\8^FVhZ1 ;V)cg`Dld,Q٬ 1A/(Gȩ ӪKbuoQcȯt].γ;RaVnQm<,S,Qm\1Fo,QEl([m=Wi,҈ vt U m^"L%iٺds>VflbL69Vf<h .tIԚhyR"z&7Tc5;$ln-ٔFk{]XՉL\аKݡ~m{ڹy.jת{ WIĔdzFSk 6 Wt9IĻn2ҫQ^b$wQFg&[=j vNbIU lnU_u>'VيݭPe\;_@lO(}\B4n)j=^?"Vl^@tx-R|krk6fyRR%cJ+"֭yڝdYZߣXql VHg"[4 5^~٤/^lH~ +"zH>fqWi VoPl %&mv [W#o9B8>c2\_Wz-NSțerWtE^Nvkt-ڪMis66ņ$^&l\Pis}&UJqR] z˗yY VIjG,_&xܪg[ݬaYlzu]">Wؿ֡\SQzD sľκubQYcyZk ]v+5 Qɪ5"rNZRmW6k5 1<OW0D=Rn=b+[t&-%zk9J˫װiA5|dT.hwhf^b$J6x*mb.jnB-v1o)ԯCO(bsyJnQ`Ҧ[S&{7ڔ{3ؼzv۬5ꊍĵUƜ=z}]*eUEjMyR7٣|Afs K&Wv_ڧ 7GSD5 ա{5J7;FS<(R"je2ϓH {Z/FY*; .wtl2XMvTj\"kz8zN+}rV(.ڥ=*Q+4^.lq] &T*hrR5BT赶袳ג^T5.s|J 7 k# 5ulm-sI)*GG.VM{ $@YYdu:s>ƚM:,nHϊsi:B4G( qӣZJ*Vq*vO|B>fhW[ycj-Ȋͭ uE˶zf1AW^xJqYbJ-R3UezɕD{9uB %Z֍:V69+vZ qɍ|Ck8)&V٦P3XR_nRαSFh[[kA$ob˔UEQ$d}%uL 1&*Yi Ŭ]`!ah#cUvfJ' (G-8ZۊՠcX',䐑 :)f]'h n =%cƘXkMrP"C_FPV>Mӛ2TQIJu(IFYDu`buҔI!]J"LgWEzd^{ ]Y,DempEMLqDl &g_t{;`(Q NnOiv7!uRMwϘL8teBRg>ڴkhO82];M3'Ard!A*8$XNgb:N?Mx}2n|cb&{%qyÿ,_``f-AtIIt"e)r)-%ʬ2\\Q䊢h` ƻUMYU=pz}_=ӧ+3#n\56ZI:K0筧;?FqN mhD"9c2MǼD},P*w]xMMY1=+f4ӲKzU4[KxkXOR2RUa2.D-:YE[E.!^F=QTkյɪOSᬭd "!tYbr5rZǴ}NBC-1W|܁ YL(%aWc[3!}JgfIFV <)͒T#~Q\G9b?(rD;af+^@5lGp($ڨ):dE;ol#̀6S,&ژgB10VX%hYOKLj:B@>aQb%D9t)BLçh5+|b"Gƍf)<^ hJqTZ ],Ћ mVNv2@LH#BTT4E3%=JB.5TI5laAX$&2Lj 2t9D°9UleiO͑ B@ teAvaS(SaB'{ lfP>D45c&E^Wi3v7Ah=vKxk%Ɇj%!52&6]`*ك@$:ɪU3Aax;2 #f,s/ \8\|?z /_g0vD]g==COv^lqξ}7gӹ6K`~ec.==/"G{60I0\SK7n|r ypHc)lfkV~ɫa&: tgK(Yvyǟ׶q|Ι 7PU72Jun#># =Xs+0u![3'[<} W%G~t 778a"+?×s/-w''L󔼊? &9>~#ߧDzbksRYgs|d3Ypu _Ͻǹ{٨&oo|'78Կ$W|i+)}&Q&č/O|dKy;9\uc/}桛M5sS@%ӌz溸wv^/;<7ۙ/n#LE;]7+fcG#f{u n6zr~>{/pu>ď7f}</$߆nygcu_{_-w⭼ܽ;y:U(É\ltg7x#oT_crN~'_}Wݯ_w~EET|%f߸He_wFEGޟyx#;ߑvy][__ ,A6,Tq-bl?{^[8+'|jt>? Pw"feȭK{[{~ُ9Νv-Ӝx/uY80fcczr8cpq8ka2dwp~2/E{ϒ6-gfp\i= _Mzmu?&Żo1 g+F2kK )=Ed˱M߅% {9v5!:<2in~W~4C)Lj2VKqo~@>_dR[xpx?!Q?̟%G{b#{"9?Ǯm~&M4WL_y9+yxG 㫘lgNQG =箍]}?;+Sd l_Iv<Ɖ!ԟ>WWA\A9i1 Up5>NpEq}|aiK_m׽N.1O_~R&wq2ڋ[|2rV ^aT&g̐6O?X]2X6\\V|u+k~S&znyRӷ0!ÿs{xKs޷箏̑7~4}9;9r毲ȗ'ݼ+3{6z ?ɞ}îc[$oO^w۫pΛ9q?ʷwyo9_?5T:KcK/Ɲ[NjCũ/KyY|<俒ݗc 'a_O_IbVׇGャclM#y&~s_Pۀ!"gZځX?'\@W8yyMknnCܛ} of,@߾vcK7s9xY'O)N2=QK1]iߟe}xjbˡVX|=0G~;h.|'%W~](뱪nI^d̛3[d'M"aӞeǚ\M#FylGF|\~{sS8g^ʇ. c/pۛ|b=A$|f,d?5$×{c^adfsݖEMK=C|l q7w8xm'F8ڽ{d;۵ +Xmמx._~lrڀ>KCܗ;>xWo9O)U.ԁ9;?[7lf||;N_xyӿ=7(u 7I WsS~uR|Gywq+O;]bsi?AnOY|SpӮ}~V~7ˤlѻT 91s > ?+f)jvn:?Ovc:3&>s~@p8U5m.*`1&f相-x|:IlxGHr"xi]oḠywřO)A9Ipe6=ņ':wa{W e^ 7SyJXoy b=_&aW%tpp]oQ]j5qk)=?C熄I-;| q߅>~DE Po+"'4\ "0$t|O$a^"( vQۯ~M?<xx&اk P xDFNBGy.n̍\y uQ+Sȏs}!5a%ܘÚ' ]CaԹ^1xa<ǝm;A qxMY(8 $p (w"\G!.'CkAC!(a˨=ADq2"B nk8ED& p 'L_z|(ssFઘw\?e;\pg!DED"!CaRsGz3=A@<ׯB^Ċۄm–WlO..~5e?=bWn.>DwV7gp15).UnX墍]pb>gWÏgɩ/PXqót|Vz$Vi6e/!.hB7?cqq xNWXSgYe|A*e."H's^#BXi l%KwAROPţ9r泮N₯"_:urx+SYJW9-~A :@UC9\=ꗓj_LTl_TGϺ"]= x÷V:OS u.h]\Un~|()~j^B -B -B -B ?T*EmmmeZ&LQJϖe(} -B -B -B -j79s \ݻwpwn:֬YC__AWzs񖷼1P,ٲe o|I\tF#4~/@?w ]_"XBcjFA wI=ԫe^F#Z%Hb]YO1F֗\Ht?Fg8TAj0"c 4Fx|e+ B Q{{î-ZXQSu{HZJ @2^X![v]c _jt]J&~ ;D#d܍^^JcA(2ZЪ޾D}NUlĺmnרE<c_ 5|T ^lUcjF#0[4>iG(dOZ.Z7=RrI0M$4Y.o,8^4< y f$ 2VM<ƦThZkyѢ9Ɔ>حR}]{Gr[2Qs$r6@ jGD|M9 _֋nRMTUwUcx+b+4}V[%uޑ"jʠiEC1wZш^WWEЪ j݈z.{ ˱b{6':c/RRʆ$t z VrF]7:R&kc_Q5DzrB́umX4A$.nr5-WDj#NY-nAeZyO xuy|Y؇ 'krdcT+!gMnT]&!9N:Fz9T`c=jlr2_5YEV/<rmDM]躝uBk"msh~F5\njND+䋹᫺YEk-G3?ŊTۈF g]7}ru$bYU[{LSh!z9fy!{#FchwVsT#q>Pe\.VhZ] Z6Ju>_vhn/fNT=ߋ\-w#ΨSLce{x^OJfV'f.^YG渖馌|TWU 5F=mFM<ΆoB톣ЩjpPc,Z5ZzsZfm: x~!t}:dcZ.aHR-K='ɩK@ .W4kBK"ss>W`h'Lh6VY&9\rX"ʗxf+NTa6AUd1337Γ2FXm77ʡ޵l ̷%w3bL0xz`2E;vqJĠKDRj0%'Ȉ.j dguX'KWb8TnNlϳ$;'vDf6{ KIƝLbSk'"] L۸"s: EiM3NT9A"EjiAa~=RD,T6a]fR UZ%8kqwe9=ÄN>Q $=z]p:c:I[y51oB#k\Bm9O7lS 3DfrS.lc@0FKxz\U2;p5Wb^c"ˍG(D)Fhepw*EHChȋ2~.m;'hO7\?s Ls?7r/iFv(F$Jzb(D"k"[ H6Eڬ-w }'yR_ˌX'dd~ibTG9ؾ=9Bbip6cϭl_ 5J~BE1}))7b]· Iuα!.RM# sfvOi$q*=N^F*QC'd1Zo ]@E.o ].AaI~CD~ 9;HwZ3! Fq¾իVDbD*i#6( }&=blCI5'is5\.tgZoMRũ=0@cQMYn/W"*2c,$LrSW3ۖ$rHWPa8ӏ#ʉ49c#|MX$,20md;ˬw5=Qv=XʗEdg ] |iq>ziXvelhE60b0G EJU =Et%^'ۍGQY2bj̴͆y,l(ۘOtCg 8rk$2%_JPld,Ioɥ,*`> mی+YgvXlȜG Yq&Tˆ[w6#JU9&=vCX5޺f.&1>Q*$UN2-h%=g*]"7jQ)N\Zc0듘kFaAzmU~<ɚ.<2#}9n)(fOHbĖi殠,`J.6w߶&+seyoB=y9KNb4)F׳K嬱9̵ei8Gvl ykeFB7<c[X@) bȀ`E^f}~'ĥlr\n*8[OMrt1LdC-vrl,S9{gq]6DS||';9N`.%Ɩrls7(Gڷv&4W>םdS ^g9:~R*%K;ƾKj(dJ.aew(7a]sVu\:?H|qxnbc;_'gYgΆk{Lh칍+gIwcl h;2@~1 {&~zT:`|@.7,Lg-tlj9xy{^MOSPݼJu]# v\^vPaRj 7%l;9r3EJa7\Qȗ q$V{YM1]ʑ.:{ S̴ظV{7aqi  FWR(H_[?b~}DߩLƮٛxԼ 4}sx]"s؂Lqrl ڍ[OYEqM.\|[Ng)|f9,FO0#sk0Hr- Q:dRB`Ls ?,:3zY#fؾQF)>GTs+SO]\>1~Af1rw}>~[HgEvCs3wa^t:ʺg:9]Fڬp*]g/@ĭb\wJ쎻'Eg|Di0M6Q* |R>ť- Ѷ YmQ%}\ p.%$W$hʳ[L!\Pr\YdbtO OUuCEz3xQATXucn1m6L\RtYt%ZNl_۶bcm7O3"kT82`3Aaq c٪-$͞g#˖^Ln# Wb9@Ұֳ $Nk &%h% FěÕAkLrF9ɣ[6nXb]02)t(^fX\1Emd93Xs+r]`lt6O=&;qRUAuS Qp&fIڶ@&<<佀K+CZ,R䝀MӓlsY0$XK-bوpmÞ}c;V}ӦMLMMq"A7s]w$JaWU>Opwzb׬\f.\_+l.i޳fK fZƒ JWip+nB-/?ivdw܍{ՉͥӍ%HZɺJfY6R₱4nXcs;@3by\CƲPrbˆ]/gŵK}k}Wx2UW,wkR?[+ZKhlc|*6uA4oXhyn.\McIԊk:n.GPyܺq2XrһK2?1-F]U>r q ٖ5b㡹T+7\z W,Nl~W|tWުB_-,1[lY5cB<֌7]_y +"~ϯޔIHMo+WƯȰ:6jOh士\ɡ%\Tu U6yW:V-7'M/k_W.lĊЫj_/"ʜ$VRc+U~erV-m_im c6y_/mz؎R+yךn+O5g{Z`uJCizU+J4W>Ӹ֨2WZvuni\,פK7jB]\kq4%Ϯ*f_!^Σ8;+l\zEpUc`yJa6G*i -|;2ݨS/nFO=?+rb{4bv0..\?y!\^WJ4x1wXQ_5Is|Bx.zUXbE\Xċe>{kš[:WbF>]9)Zm6^Wo~4ٷok֬!b񆓫>x_|~xx#G~z׾\.LZhZhZhZ?]JmM7݄˲uO>o}+A`%^z)Lj!E4!dE_ C )@C  )%BJB M&a:w)$0҈1BJ4@qH0R @H!CH$!EXCF! )m:q6d.o} e^C 0/!$Ɗ{gq_96c[~44ڈmUPaX' vulh7uzF4lj A,i !D )|fVVe6|ChYgȸخf}LiguِU L F,ul׺O4eF~ĺMd<S4dV~]KH'!>v00r6d2VcCV)\>em ԣ5c?Y'Sf=dsa;e&Bc@*KS7 ^S*Q>ҌK.֔A* Iݯ:Wy?lm mar}3\-4b_2]翆nbu31҈eMݮe3,cf_&QEq\<` S kB<" b}L.󧬏Q6/S#Ruh@Gc7 1[+bQs0u*bϳ]jV36C1&eb-А1noY'/6Zm-eBXK˶4b^n +\~C. +cl9_IJbHMRgFSq[ ҍ:q~o#fd#f1 rJa Q%˹d/F"F-w>z̋mC\֨;XusMe3?>/yB1nu+'1_kvh+͜k4ۦ {4QvC<܌)VFmQgeYΉ\oJVpY|@N+H,sQ.) _05Ʋu>~}#57bEhڷ3|v/M3FsF69@}w#enpʚ^Ǭg F q=;q}쟆P糦1ʺm\Rk8s@'eilG?G81uYYXa1yVfJ٬=40-urEv^^5*[F]Q 0buY5ǨYsFidžr}xc*b^+fm"sAo5BH$.:Ro8)q{ju2^:IMMx5≠gfg%s8%¸MU(-*Ӄ*|">ӳ~ک)fgfp33$,(fGIF,r*>1{INOPI08;EQtN.2 r"G*sE,CHcqr9ƽyrisKyivR!|R^.0Kg.12rtr;‰%V)ԦU3̝^HcO)2&\hN8k3R Lg(+BKOc#4#ss)88EhWg_XUcrYb)0+Xp&f `O%dUy'XjHq 1|W%|ƼT是rvfĒ}EnĹ8Rg)̏S^1S@WR}K,1ENǨG3CTd9SeY Ɇ>Jrj~α]u/MQy[sR$ѶB X$-O8 ՎS"%cKg>SeB,q}I¢MX!Emi{g qlbaaf샜Q%t¸d|I15{t9I86EIFX(3Wd,%ƐObT8MB:0 )ER:񱀑 Kgֳxu9-0W;O`s-2Z>μ%3?E- 2'$(?͠70jE&33V_,hXp8^:8=5tՅǐ~Ci:*CNR n1Z1{񅓤8F&,f(8 1??` ϒKOE:R\TDZ X9Fr`Gʌ'Y9p!J,9ӔYF=0BjRUU#T<ԬT0%U$18l/bxӒj; }# Kɐq0apQ+ Eqe?yܮ>zfBZ,29L#' 0#+eJK<>-03w /#i (cLy9ل3qWOcE  tI2%=Z̔jm :$CT?Y04J!&8|hr7x Odz.#AP}9>)K4E(e-haaU?A*>s!>I0UU"ڨ"4B#2%$RiiˣR(+DkQ/$&F32aP 4ϱP)|t|DCc:~b32T[`_Xoa|4Z` Qc:">JRQ*uX:Q_"C4E:>G Rfl/3$@2փ QfhD|Ĉ2ѡ2@HaD Pڈ*"Bad|䈡4aRmB*=1ʄH0c_$:a*25?t2+!B=4ZSG#D))a`E0ǹ$0tjE 0Z"@+IX^|laF|,X: f8%}H>gz|P֏搱>$ ʐZ~%JHxh- 0tH( +PHUߓ%" ,"u#J@ȈHm"DEV78'Љ!"@2-0d@-Q@0H)*4 XGWK{ "(}~̑q,D} Dc aO$H nOA$㷭j<&ΐ?̼ VB#@d4w2Tu #Gf:͈tSWH߈c *^sfoo|&Jh?Kq80B26EǍc8 c/-dD(7y@aȐ0JС'B*g)ѺDeEC|!Bh"eKgHD)F J0DD%L`*_A|bQj|<)(blUB 0^ dT+(FZƹ*,MX'3R(eƼK[J,:hL#|a P1wKz2j9o$f qd f̟wB˸o DD K&#>Ma``s^h$4IHQ*dا4,¨ss2D4u?1Bmy &:g a8W+rձW9AGf3E6~%|4 cJYͽ J(~BIJJP:>UI2hboĝRf?)F  1/qZaP@I3W6c)vS8+IF~<_PM4㼉:>4 }k2 W/Lsm(DڪkQb=EA L -ᣴVq\F<f* ׋u@K+o4kI/Z}Y?O6&D!@C0"VQC#[cBs ۰G:#{1 1ıd`hKBiuˇPJ(JLh0##֛c%Y+ J`~}1hKzb@(e`j?'&2f*(sC1xi: TIhi~j\Z~ eguW0#3 QX#ӌ(aWCD@+mڨ[sFNkjDm:j~ֈfFNu)BckI (+; "#@EaJt; J333C[[d(PJBkMT<{?o#NWk1ZhZhZhZh8oZhZhZhZhZhZh~КB -B -B -ZZhZhZhZ@kB -B -B -B ?hM[hZhZhZhg z -B -B -B - 5AoZhZhZh&-B -B -B -3ZhZhZh~КB -B -B -ZZhZhZhZ@kB -B -B -B ?0'ZRx@D[P^T~Q%Tde TD, $gtP|R~Q r!IJ-*0BHHBaP9RA0P,)md(Z@hM&ɫeP#aTeZVe;TdC+*IiSiFjI ")|tVNH{& [bZN jdB3K" D!A$2^VH, KzDh-gɻJCrb*oIrn@LBd BDAG QREh?ACTQFz&NZv4݆ a8(!v"S#TdyJ!B(*"G[`cJ?]ߢfH㰔*HЖ& Mט:pu- S!Ib$u) ,2>k*$ W.> dHF9a',^kXDE,`E^$OW&ot6J.Du=IA% tBaT*P|υxQS:I5"  rT 4ER: ByMQ󿌝/cцbIw5@F7 oѮ*T4#ρe}{I^4TZIT:!TIҤK/p Y'B'Cґi"I"!6N"=ethaIA@!R4h$Mx -<$)  BB  OJm%F ,%RfQAN,XDR"]0H;C,e8"E.c $HBG9 H%|FӄnU&]X #"5\ҁd)LPX"2!e I1&ݸ0EÌ^ p9Ԛc;V̓40O͘k(IU3!m>(DB$Ne=UQ P#a$he}RjLTk`EnNT\ ǹJg!26³ҊH"#v;aIr ^'PhT: +DX縘mf#iD6P#JhjnfҎp{9,)63U #ˎTA BaDIH%SpU%+O6r3 1w Q38:Aꜟ,!͘W(c$d4oEH!(h!Cix$l-B:ገ! CD {7%mJ!-.4VC%IG)TP(/g$&ڣ :{;EԽ|^O} #{o,[󧿿W?Ε?O׼`PD]sJ-O*o:>l G`nd-E,<nqf5ow_Ƀ夹7]K+W\N{=nY!&qՄo.F|pq_| ,' 7_IoTioa؜8U&~ݍd3osY>ּrnkN絟w)o,ʧ.ŠuЕ" K`DGx^]t?Ӄu!^8&|;|5;Ay57#Eti~t/yt`ӗ3Sގ+# #}5,Lၽ {q{#gJW3?BpL14v#+y穦,6ns'[)~`Ҿ)|dnЛ'ybl̜X:"o2n|r.U'N^ȋ;N{1]>rl`t=Qgu{ WX2oC=}<1>fryۡHж,0}&?ʏ/ m+3|kxʽ OqQ;Lo\K{9ygP_Wnf9}]~h5d=pwr7n;/o|_G?5Oi=m'&f]sLl2x޷ۏy6wbpV;awy|=OVǚquk˔XoMSXr8Hv Ǽ(w4_+=*oӝްa~N3kV~>cKs$ˆ_wxj7}*s1{9UusWr&Xswl8Am3gp6~7~_E{ >wva#b\7/|%[}SL㮩2n P8x+o5Cdφa([ },UJGj&-l9 H;(7Tr~n⺞qrk;˸~4 4##7O1 ==N200`x̷88 n=Zo{?Sבxd/n˯TO 7yd6Q~_Ծyi{.n$Ll6w "r\1|nvį7|6Ms {ig'cG:Y֝/w= UػX}<~xu?}m2yiѻmMk*SӋz3kLNF,؂.r,x%R !z(QhVK|F<,D+Ig)̜T!L:s+jEbcě( Y,Q"(I*BrʴVV 2$e;RB4LWa]?97T=3=9i43 $5ج&~Į116k1$3BaibOʹVW@Tս&n\#։*,t=TP \:[fEkc:-]bѦZ$٭b7S4I]aO`\Ia֫ToKt րep,SjPr 'a]phˤҦ8.ڄ2fQgQ;I8T"I{$$\rh(>дF/h׳2B@9&p -"a9[nP;xJNޢ!%J&Z)4,:& ]a&FT|t%(B~ѩ8ԺlJ#0#T ߥpJ B 3t "ݢAsñ{e0M%&Uw+) limڂ%`'PtmJţmKj]j%.KAT;4.RzsZTI4:~Shԋ4nEӅSu5M&FNųu(YXV)lSs%mF6ajJe-ˡQP8ĺ-vYRi;bf`ԉa4j;&0ծp,sɤө6% IjRovqMEvYob%Z U( u0M' *TZ& [8^F0YlԔmPtY6C -֡dQk GQ!YG,vhwj$.n5V"Wtq*fn٣ݩQQ;t>^AX_"*t AlhǍ b֤MHS4i*]JXltvVvPV6ZMB)km&Y$V;FШf*gm_z?+!yog/F|V>$KKauBWBYBqe%װ&?|"(+{]"z,rYi).QȷO<s Zɟ<}9k߯eKC~* e0?bྫ뛁tV3PZJ^u*2 Vh{ǣz_Yե2Pˮ\6Q'J_JlcU]\371 sDž觩2aImi5Um*l [.܏>gED?"$V`Ev^]}Vꐵyfm~D_g R9_+D}l_.+z鮕Q."cb9ݹ2^(M`{>:5q%5J2CWƯ dUc*K"׮ =zDY=N (ߠ sC(c@=zHߋJң\.[x]կz2s ~YXN)x+z.C_)\LRn%Zw,}B'EtD4,'BjA}J*\PcENVeUߍ[܁ep:] Du2ny޻[VfS_Cb sSYu<(58&j }YRVZ=V__?WVŀN_5bMϕ/2[OU[VA27JEsUr5[/b,u_{+c2?󪩒"m(qaeJOm;hDu7h ߫ƙ5,*|+nH({V~~]M$D"H$D"xo0u] 8x0m( a!u0 Ol$D"H$D"D<#=._X,QUbllݻw3228z|{ٳohpSTغu+o~uYg:\[! #_3 D9*Fng}ǦP;+C@@,!-g@C9R MD).߿a"DJ  ˻]zFnHa,υ+YΟ eE {Eð"UZrPzǗP1X6Nҫ/ rG 4 JރP%+a^% \)]'SYG D*b9w-J/~?'+\9'F4zɄ6 a. V/oJT6Qe #y C"D(+D.&"9 ] `] P2.2EnvS_F%/Ǣ/Qo(aO\:(@!J/NOS,wPan9ျQ׎Dл.rZQ!%w詵.v~ .[i~nĽc%XY>\ְw{s {y^V"dbYY PUʰU+A:, w9=ϋ2Qe/^(b^q/zu2_1Џ..<QàןDO>+m(D_"eYBDw U'joOF% QCey#=ף1(aؗ߾H60 ,"@%wr(qQ/P,a, ٢L4) Y_Bt+j}A Qp=uyVJГH52<ؖ.ɡ(bpYp@OFTp͂~[,+ E@O %QJ_FD}_n1 ߛ,>=ߠ7VmnMe=&V"X̀ ~(h|4'`༣_a3{(J#%\n(%koD4oZ=+r +2JH"+_"\ KWD/ =ҷA$sa؋З~,d20wY~R€HF6蟷"{aoݱ;Q](˲TYNveR?GsHRC"iXA؛G*eyl #YbW=H?B?"N+W+GWB޹0r1_}Q5@FSo%ѷ2G Q)˲.SU?*ԩS| _|'}{ٻw/Z;v?|੧X,PYXX_똞殻n? EGKndhY]&tE Ʋd1 $]HbzRâ>!R,7kZAXRBx% 9us1db ^ nsI?lЭV5 )E\酯r>ÌA6' 5yodzo6] }J#sr#tB\'m &mM-M`nNHtlv4)# tΥISZIr 1+hdBcmh̡4Tafc]<+V8YAN4Yi`[i ,LpnlINZo⌚NݙE\0TJ odÄqݸ^ ;s x"ïtf#[ަ)n8ޓ^aθ;q o3dNf*qNl‹:ENͦٽNDeﭛeva?sz7~NbΡ.˿fVP$'ٗx%X<{Cg NoN04ě*.*;=Ǯj 609W`J8[Mq47(vIV!}DJ&LI֛^W;v^Ԃ9"r'nG}k+oc/?_呩lr9xJdkq,Էvi8l4J׳8dlCչsFJ8ܦ=p`v9>3JiF撄 ,\dkvɥ9g; ژ`Axu*ň)6[E o]:'_W;cNXdyd(%>9vuLt=žG~ i 2K)2/1#3>u.;şn1Z֡E+F;וp|o}ˤî'i[,dSv.q܃ck~'Y[9F,6L>A3#LL΄\s7.Qp'Py8?zpçr̖ <aqq95 #Ae[Y}M&gXbi/2k\<ïzg< 4a!;Frx%qۓ&3>Dfb>7wnF{l 7l[{qP"SmidZߕfRfxg/]+s3[EfEo vq|^S.w`oD$, QNf̮#<0LM1b:?jdna]ɥ5{-*{7n㘲^M8Dt8Jw{MXs+B69?xf,cӜN {t'Ӣ@gi+am'scxI4sϭ6'ݷ^ko&,v`+0_OwsтKWS᪣]6 ˷w#&p5îGCf=_qrr#Qgmym|1|?Q^LJ0Ɏ1 o_^G\Xl7wR[0]Ε/ eh7fi HT FEyf_U@iP]x[roSĚ0e/KXM$?ßO-xGUE˴,Au 8' VeWwFw [[ENo"Pǹz<|z2$ ^?űͷ;i/ncGxdr??B*aM3j,N%طP%"L)\ČiLP㉍_15;'h*\~hxh_9o>y'珽֞ V y<ws~5umk3R?7dۂ3/ +U2ϻ{rrzvߓeww}%>Ely+Sl130sʻXE}˿͎9{'Fo8L?A tlt~'Y̌PmlffɣSw/bg?u|} ٹرT7[]2qlfgٌo'ZVdyuѶC2ɺwY8a+EF8ٹ_n;awP')vP$F?8LW]x`,(3_I7|Sf,; _GW [-K{ȣ3KBAo,ǘ(xfT>M*]cDԹza8mo͓9>IaJjc 7|Ni[>9ΦcLk "E43nHmeҮ@rb176̭q|a>t3$*S(ؚ՝cLZunfo1`{B5b P~>TC!\] :We"@wrtW7FPgl{L!$[H0)={IN.-t,=MYTѳLP;[}KQ\ng15ʮ~,rg=L|w'g(Cl[v569<LjdR8޼2;, 1X7v'fƹst)LN$}Wj|7LlNHjHE$gO6O.\UE8w{7 q*4q-y4ERsxF7>|3[u φ/O)>́Y1~8WĦa -[wY_)lPbm0l0qj27K3:qB3\.ϵH,ndOg#Å^ϵ>==M>gii ۶ϑ#Gx׻(rYZZ",qwPVoڟ;V$ {A,ry XqS@7z#W0pՊ\PD8v|`-> ׺9ȫRU+F 3~n4+bMdumzi}'|n]P"N䂻JBҏkXq\qU^qucE. o^y}Wq3EXiƨִ["MƊkhߝlٍjE(*K\o;T]Cw'\qo|[X0Npu Wy>rb~`}@aU_l.)q4K`Y+ʊk/+`UFb٭tlr+2PU :[q ]y~,uM.^ JF̀a |Msuo`֗PBˤX*Á r4յ5ǀ^ F\I1 k _9rAaU CBeEbPǮv@zQr/XSQµM]"](>P/-YZw rhȊ;rz/\-}_eQW\sW :KB]s:گSnIDAT.IF6DP PViōƩ0\M*`='#ص,VѪ:ZsWeFecr!2gW.\v9L+qte(A#d7I(\} Ŋ ư eCGz$VpY^i\W3(XT-1TI{g]OVˮ(\XZ/3"]FA/\%Kb$({20mEF`ee #b|Rޯӊ{w$+؊Tw^n^;[x WobX78[Y\& Ճ' j+c954dl@x' 2'S|+vN/((bf de.TU1D^?[G˱< B`y뇁rSeqsA+}{d+ ,뽞Y وdK ulxF/wu]__Nٻw/LY41awilٲu=Yi\4D"H$D"y~^vJ$9@4-կ}2 B`m1 D"A2۴iy{ÐL&0O#*Eoԕ~^̾؁B ƻbK(:hTq,WZd^~|518c/*Vb/^V i_?2ƅ˧ q^ȕhʎ܏Wُ[YTp QYYYX@|~^ڬas宰^Vde`9~WuVoG_o-o ^>ț2/.67~Y`]wE{PN[ H(egufp4Sd! F?.Gt@_AY=u*~qp=0Md/O7( ``̹О_19SD{yݕҀ^=ϿPQ/O2P@Yy7YAlj*CCC?tR$S4X8S)TAyF!7%J6z;Qho.k3΢QT|EIsJqț:Xp :U&FDDšXj,,Z.ym4UE¬jaFFvviSYj.R35Aвϛx-ƒ@pjJ.- T:)%2VRUt[%:yB;Xԙ6)%+$~IX(9n*1j)̢h8"ArYT\niV B`PmZ̙UC7^ñO,h0J JER-]PPlx*vj MδZtKj62v VrAa"Svk3z&(-:u0OV\XޢSP TkwT &sF.#tch݀FVFlA `;1:ezgk$EڍU4IP VYXU^ RAS,P+Yo,].`*Qm1߭RKxAx4[,-uqYBF3DKܻZ2sMPktRi* Ѥ٘]oqZ3Nr[:GXKѩUyډ=fb.-ҬT=VdAAjxZj(hF n =: &: zʂJ pyFH֤j:dmeӦAPY;9_V54Mvv#M%_O6iXsemVQ&V VZ%OJqY'iḻ.Qbci*slQl1 ;Oj1gHVNV5L#) y*:ѤX/p&hi)Kw (5k(^yl!*ySF|In䉟i5b.MlrH|YDLK:tXZRik( KK̀!fVLr &JSd,*8s/5),X%lx#IYAAWC3E MCZZ uIsncH<Ó(ZF:դZ-.YlizZiv1+.J#< ʵ2͢hc5:8JYh[iSє*MG1X2 M74 .bHSpCriK&su&yVEc٦GWUظ; tQ^BjCCChs@-p6j7khɒ@Euډm#  b];t]L%kD@5xiWx $ p<8^xy(@ = cL$ 8((K@F8:x n&K1$6Bːi**A!h^H;'CKI3 r \]*1֓B)تNĵ.Jx ]8F x''mpNPTXd\ WhX"Fs-Wy@uBxfo#GgՐLAƱI>FJ%!~@,tpUGWuT!~'Z\EQp$ ]X"domn;LOU0q 8&KN [Th$8zc(vՊk!^Kb^@C(t]= $ Љai: a"4n#(NKdC:Vo"B,E'tq$.i&mlEiiAЍ)!aCj7q*!t*Ń^B*.noQcqЧ'Є%A M &P1 +WhJ\[@B]!(C7poW( KT) C-L cXq(>q׃@!ˠ ЎQ-IM+(HA/rH,Z:VMd]N,N$}6x?ք(h~@;#~a\o&gkHv@@^ cbZ)4 f7Ϋ1v wAHhP~@ Q|@PM@bES.PI6P}!it< K4RB!P> CuכGA@9d< GXPo|< <4'Ẹ c;8qE׎#N k2BG^o\ !B| M:Zߍ&^?K_5b.h>@X:n Ϗ޸jFMCE zz&۸h_i(AHL8=I!)W肫:m=FHJ`:) ,%x$l@(x^#lgPTUFM8L@IMv b>dQu Md%T.Bu ߎcB&1Um|<Μ9Clٲx<~I۶9vzHQX6oOW6EQPWD"H$ZEq-YÐ'N0==M.{ډcd xG<_5BjرYI :~1&??ʵmA-.9# *sziڳ[IMp]/֏"oM}w^<۶QUD"ZC1 8ضM&qA4b3Η>8u>|t:/ٳgI&A&abbD"H$5.}Qt]n.q|ᅰu]!X?<]W;IӨzщϷmb6moFu<#LR(W֭[o Cs __WHA+_K~boM`"2FF{vBcdΝwI6/y pNq>?h_z\y ׼~Q_\8=a2==*no+_Ψ^>fffg˖-LMMaYVGT~uk%D"H$/Ok{7 ^WrWJXZZ_2ir嗳qFjI&?#۷og߾}w}5\8|GUU^גf9u_=>9~g͛7l6j|_jqAQUӧOsind_zhfqq]w(333|vyҗ0T0<<|yB6> fEQؽ{7;w?p|aȱc׿N2oԩS7zЫ^*>xZo|#gϞ%NO~l6뺼o橧bÆ u#L>ouh&> Z !;v`޽vp]+h48~8wض?]wEկ\.to{;ƹsH\}x~DlR7ߌ8|_eii|>ϡCb=z]׹kxx[O rD"^:~a:2ϣiVi|_uR}D"s=={n;h0Eo8m;ꫯg~gt:9Wyv?$a|Zc=}w0?i>|m۶qa0l.bnnO~<yn_,{ᡇٳ,,,peq.lfͼ oG!6m\uU|ȑ#\yyro~gjj{wn˽"G'$ Cضm333H$D"< o/322Bi^WCQ.4z4d' fffhZ96mȑ#y_5bƍ 6nѣG;BJBQd2b1&''ru֭Z>7ok%NcvߕR7#v nАh||+_od۶m)TCQ*PUd27nK_xQLdffd28D rc177?xs Ձg `ttl65\Wy[ʷmΝ;x_u]6;vַŵ^j'`rrX,roرct]6o̾}g?˕W^I*zqׂ޽{yMV/5Nw~<\8qd2i cf&HR955ia[D" 77 0n\.fazzT*??( ozӛLMMqΞ=ݻ,Gb[l*J$D"Ȉz8XKea6xX,aM"h3P4mY!0 uI&b1,q~ h&qEoԣ7LѦqaiXXX`rr*z;5Ǘ2ar90dnI@oé [a\dJEuEz7ћD"6;w{}7qu]|I֯_*zY~dQ_4;t]_կܢu]4MEiGa=$TUQ_bw] J*m_t4!ΝczzIDՁm L&1M˲$Uyvxt>1:vE"?Di#T*կ8nM"8(|:D"H$ɋ5BHX4:~޼333}b;~}9;bKKK(W q3g055oN< l6R)&''WZw}_|,--R?Swc_{&cǘettBI$D"H?q:@ӡj؆R0sYh=q| '(b6]ujt`h'kFGG_T 'H$D"'@1'đ[qٮ}^UU qeMt(D&$l6qk.:gaY񼺾G#EAAAcQX'UUW}|0x>OGem|ٖ;*K(NvZV=a'j>/T[t3`xaIY$}TQ MD"H$Kt*sa!B aY֭{E[sl6crrgvbl޼D"ӧ!JqIfgg?NBUU|'pw3;; =hdGI?zN6eʹm*;vXeEWtMQ 0 }cǎnfǎkp olٲ咎qN:EA46nH6ԩSLMM.2;;{ËgrRDRa۶mi0dii 0زe˪O'D?(k' C(A@:f׮]躾J~1xv<[n%_mHԖmsi&&&{O|߿wbD"H$0 %355>8O(333={_ 6mz'Ǝm|ogllY~g~}C$ITUe˖-/"v~\wuq=SO{n^Wm6,JzN$ t]j1;;K<gqqzκu鿙׾Ƈ?a&&&?wY2A0==0 8yvB~1uOX)?qۿ[oqIvM7ĻnDo...tT*qw򶷽 LMM]ro^o|Cncaa|#ٳNOO]`;ۿoo,1MqFGG?c?o߾|MMM122¹s3>>vTUehhN,f9G>>rv{^4Mcy `rry\eƍ!G4I|Ct nw]A^4M8ԧx߈eYxGy}c׹w\yvm\ve;w[n\.sN?//qFL&o&6m̙3j5qWwӧԧ>5\=C>'J>=L!y?)?8۶mh?`ӦMϪ~ |?ooqUWO|cǎqIwe>~zj??裏++LNN^r@$8ë_jFGGG?JPm<ò,6n__O}~p ݻk>bf߫`qq"SոxG8y$YZZHRaߤjJ?̹sؾ};7p'שضlڴ={pQI$yqF~~;2|Sbƍ\ve\8Vn#]|ӟfTU>jx'Wʉ'alݺn__`vv^#,_ 266Ʊc׿λ9ZVG?oo?I<>_җضmظqc} r[lmf3rض]wEX/9T=Oqnv9r_~9׾5OÇ8kyn(DIr8'8{,y{M4###|.<~~;3Gw}s*wAvLOO~AW^IZٟw'?;CD"H$Wndnt<>::>|97Nvs}oe]G>N8i>|EQywJj}$Ifgg7o+Z>66F,cjjx\.ÇÇٷo%g Duw}R)V_XX7Çٺu3Z_? `J%>3==y|5yM_FFFXXXczzLd}!FFF"ykxOsСU25nxٴiWt:rE׿k_`f ω%׿NVcÆ EJ$D"H{xGTZP4/^E?`"i"`hhX,_ζm۸랷 qUWPTf޽5\7x: lFQ&iD+l68ڵ 6066Ɓ4C7}{_i&L<gÆ \uUr9j{!Jc"hC1>> w>e26l#Gطoruoeݺu$D"H^Bض0tX,^^g|BjZ5xpk34۶mߵ!YoEvx6[9:v75_tI(7aQ?CoEwa;:o.k7 u)YB8e.(v1a$h;txmOt~t^$Q2 {ؾ};Ah4{tD*\WtAYA})Z6(Oσmw)ID"H$ʼnl'emFGGW/R ].r[  !]_3x]Oyco_ETE{ KJI$D"H^:am~.0Ur<=B^7!`[v_^2z373ם>!ܺVNOsuǷ!lncn篜!s;f񛔭RT]M?? @<®]lJo+K_D"H$C]v7 =WބTv^buE^^<凼&}y|}_Ys~ ѽ/.־kr\fm{4_r>yB@,J8rrZ]13D"H$<9GBHh N]W/@lrvQꜪzImz"k2Mͬq~dNzOQ3klLv415ݜ!$Z󜩝a,5α,k˱>Ccc=7誎+tMFf8^>N.c"s9}l;c1NUOQ5lXjKu :.{ 8 F~SJ qyM]u˧.6!llM$cI~/rp px؋] ;9 ֣ b:7Dz#utצ4M_ƶmh,I-xzUJ|ڝe(9bǛn~+t>mx7mxJPdgWz'7xl<˵W2I-(H$D"yx7q5uя1]O} ៞'TT~_c(1ģKrǓw=oC|kyo:y?_g侾,;whQ`~3)6e!p80ussXE\ tR_{^4n/oͣ |W=?1=Qaf'WLPͿg9Ǻ:V5|kc67K.7S6\1};1~_ O}dNg׳g|n0#vbVlf^?h(/i8?qY^e yGbyn,v!$e̓'9[?;"5a2ឹ{0b(1WNCӇ8U;EZO3 %iMyL6r[fPXj/Q5:?x(wvƲaK{ฮ@nt9$DPAa$͌=z^w][.z=ov֮um].ΌdRً}ɋ> Cۅo36GTD݆#$iv9ww~ rM Q>xp@(\*^/ ]G?B.VVnnNיZ¤4aR 0>"Qa3i$!ʄ=T"eտʙ3tv24©S$QUH%RʓijxqV|6:'8Ţ+٘A\SHہJ ۘH$Ѳs{OQQh3O;3vgqmk8sr_#V <̂{8yܣe%NxU<~vg,FƗ(4fVّDB CAh-Dh+2-+vQ9HrkXI#a$H(/`Gl6҉"<< ,3CB/ W}EE@|qK yZbW.v`hqhKs$NG!$M)/|?CҪhmG.+2fݿ6] b5C,$M C8SSrL9d20+ī{m( d!ÐEES1)MFTr"PTF(/xsMdj(uLJg1*hZ,: I$2 T( |!a‚N&1!7>b D䕴WHP'04\&'a[q]c 4mn!?F_ǭ[(d qJ= ܱ 87ye27&n`V)O*'ID>I̺{Hcl݌>V&& q6$nG1*>R7oVٝmGP3r0 80(yhj`G:f;PʕS$$?'˔*V7T;f]tS_i$Ә)T]*&IN44}yg1\#^.m&QH!Mh'""""""""sC#Gr G_g-FC OMz?t9,zYIadi\S.ec1dRR61'ۘeG%>u~lKHc(I,Ag9]-uF5ŦMx^z*+^v$9{P(?n1&,b[ [T$Wpkøsxe<8v]v0v ]]#AV|+{I$CC>@1wͬk"pv \8Qh.lYZm̦}Ie 8Hӥm.VGKCp `P:|ɕITrL滨E'ߜ)?o9KޥuH$=JTF\LrؘXD 5b_sv AU?oukGq ut7oX`hu~tq² *F&__k|J\S6mc٪Of~DϷ8i[_+"""""""M#( BfffH@PN/}ȃp8kOV%HR1_.=&CX&,f}yG{"K%_/ڳDL PL($bʃèQE#$b/JnEDDDDDDDD:HRt))zw\AD"uf_n7nRDVlPT6vY[[#!!nc2P(^N_H$ bqx<_|011A  .a?37p8|d&^'~^DsU=j=EDDDDDDDDD~x=0G!?;D& ( t:st  Rp:444|!OF.P(M\(\vjZ0t:zinnFs}}}af3444 1LUdllzFGG1x^ܹC?333$$$ ˙$ill NRn@(h4 M.#?wm"55srr\ʉZf~~&fffG.300@[[RJESSRi|477344$9Q*dNz*X,j_pA+˅Ncnnfӟ[[ ## }~||qU' Pؘp=-&05@kk+ >"""""""""L8~d(u?>::Ç ??ryٻwS]'P__ W\!>>X.^HKK {avvN権aLff&ׯ_ooظq#NÇC||>, 1::ʵkרB&Sv;466b0Vh}su\h4 `%66nfgg uG*244FazzJАp8 v.0V) :c4H$J%CCCLNNV l6&''q:¡e z\\cccj 68 n}}} "jeqqNd2~l6v*DJ 222Boo/TVVp8صkǏ ZMrr2OXDDDDDDDD+III\.0eeeu*J8;w|DXϧJqq1Fv܉`VKcc#;w$??qdllT*(JZZZH$$%%F{{;{q000fC&Ibb"l6f3۷o֭[ Hؾ}/..uVn߾Mll,oǎ`0011w1VWW),,-H+<wa``I?P^/ոn;FVVZf||>FGGh4qFs77==͉'=999\z˗|444T*_2sssjIMM)~_!ɸy&L&޽F`_222T~ӟiӦ G   T*Pl6nܸԔ`avvZZ-jFf3*G"Hv?h4sUhjj HQQ8Nv;[nҥK^PPc`^%"""""""[Qc˪,8}4iiilٲמٳ|{Cծ|$ĉ(JVWWldffرGp8dH$d2𯫨ٟ 3gxhnnW_evv˗/c2=4*VVV8|0aEl4y)//'77~E^/===TVV~H0$--T*YZZbuu%{J(n|vD½{wwYYYamm ÁD" /ܸq 6`0xרիB¢"^ںONN"H=6mڴ.W$..}o 7nHee%6o}[8pM"(ᥥ\|TFGG)..gnn|كNܹsL&o߾n100gmmxHKKcaaLmFbb"۷}a۩jRejs)))ݻ!tzzv[oEAAiiil߾Ut:@\\$%%q!ʢ" 󬥥~~VQTLOOp8|z.]IDDDDDDDcEFFFpA100$_:?O'77ۍ륯I&&&l_5jFC 988"222J,B/_f|||:::gzzFll,d26l 333,,,r>o0xW0 l޼7 r sT dHR {"qiiirH$ hnntC0D.t:Dqq1[x#~\.KKK}vٴiz{277۷`ff桵LHH N&&&d{he>;@NHHuFXL&}}}۷7oOZZCCCաT*1 Ûo [gHKK#-- 믿NZZ`( ׇDP J1XVNy{ɉZfnnTJ0D*RYY)x(++b6),,D*H__>B ++ LjjLOOc2Brt"qJNGYY䰼"VJn7SSSXVrrr"++KHyW)**BVR ***(++C3??Mظq#6lrrr'99c9Ĉ}344˗\rss S=RM6aÆ,կرc7ރ.A(meeBdZ Oy~ @ cH$5^_&yu!˟G\\;wBNkD~9y#*^WZa]&uVBDh/T*~=^܊|5hOḲ.X\\||!_^gmm ߏƼ?%xuukNo>T-Hxu+H$BllxV!8oZL&{3/*=H$BRRc="_woQ' BO- "& k- y%<3},px](K"OgD"~¾z` < >00ݻwYZZ"))鹆>X}qq7nJJJS]'Z\PMCCВhyy7oJrr2.zzzzPTt:z{{ihh`0^x۷|>jjj"$7o$ RWWx<jkkb|| ӴcX_w`0HKK t:bccuMMM8, 2L*Faxx'^OWUgff}66 ٌBF4 wޥ~j52۷o311ARR>۷o'@tJr_teV+gϞ% \>CJJJ~c9N8AYYS{qPj\bzz7nݻ a0PTLLLp-Bкg"/&w@Fzzz'..~ݻB`0i+++O""""""-|*U"JznPA_XXO?{>ulJ0Fj5׮]={0??0\r͛73>>ѣGINN&33M6ɓ')--%))~V%--MPfO:$XVR)+++re<O~.]q:\xIoΝ;wOQTՑOSeZ4y100nֆVE&!H02::2qqq211A81L&G?"55NG{{;/-A}xxz{{`0ٳg).. 7yMrVINNi())N`ΝdggDl\zW_}VիW墦RݻJ\.T*'?AQ__OII߼y|=\.:fΜ9Czz:K.199hD'۷1\zsss ns!AA_ZZ⣏>B"wwdggsU dbb, 墽ŹsZϑ#G0W";;[|!g~YILLD.sa!2Fq1AmjjB.s=V+7CJJ Ǐ'000%sqillf̽{(((`yy>7"JYXXVVVh4ܾ}^aY]]'? j&''IHH>h4rm㩭enn<wF"/~ &99YÇhhhEN>MSS ,..RRR† 444PUU%xWWWΦ JCC:r J%cccoY^^frr \¥K̤Jŏ~#JJJn377ݻw477SutttLvv6>Eee%fB\.SSSF?>ByyyD"޽+eiijrssя~T*ERq &)):t277Nx]]jHNNFPRtuu Jsloo'11Zصk/_F&W_q=|>ziӦEDDDDD^_DAlY dzk׮=r rssټyC-GGGp3}8ĉHR!##˿СC:u%AlosŢZ[[ٱc333\|8l6qΝ|>9:??hii{=#QPPk2^DB?6m⭷">>P(Dff&{A*2=====t:rss)((Ӊgeee]> p-&''ywq8x<n7nPRR^筷k\RRŸ韢Rp\4r|;)qqqݻp8[+4RSSf144ěoɾ}0 ;(MMM\.B kqAZ|߄r97od֭\t$$ ,//ۋΝ;,//~d2HDBEEv"^wy"bH$Hvۇ\.vRXXHoo/:Ce222x뭷E/;;~,mFUUSSShZ'??tz=lڴIPҶn݊xoo/q!222gyy2?@ ;Q([oaZٻw/l6y78p:|8&??{R͆J6L&a>B:n|E1;;L&"_~z!??7/Z٪RR݋nώ;D"ضmSSSx^~nHy{{;MMM0Dn2$HJJbzzyFGGl6gd2Fk466*TRRR(--}fgg'UUU߿tZ-;v`ӦM QHDxʢ@Z&#HٵEDDDDDD>*/j~MOf=88Dя~DCCIII,//v!+juwwp8زe qqq,.. mmmtuu̙3STT$ԔڊZ&''X^yVWWYZZrt:appqj5hZjF8F?4˪T*E.{y deeɵkp8B;1TJGGeiiAJJJ0Lo߾ւ,yHKK \bzq8 }vٰa:033Cuu5MMMϯˏVQh0I 7o>SE􅶸`0H?\v{t:qR^^`={KKK 3$IRhoog߾}455GOO =wލ^… =(_ѳ*_5"Rnܸ{( .]999c4*&u:~N=&x#IMM% Kww7wajj7 |ڵ5H$jjj?8L577ڊ Q]]2IIIB!RRR466244D$fnnn.@ @RR[***P* gWYYUUUh4Ξ=KWWPWڸz*HaoElZ[[OIHH@R"syyP($@#))5RSS# 8Z-twwL^^qqqBD"!))UaiZ1Llܸ۷Vp|w,//SWWݻw$99Yp8D"֭[BMEE>}5lق`󴷷 sCX^^&>>׋ld2=<⾲ Rj}ly0{eeٌ!99Tiiih4t:rZM0$55i Jyy9%%%ebbbAP[oBff&v*JJJp:h4~?6\[ERɆ (..rXZZ"99VK||YYYβsN }URQQAAA)))X,f3:yٹs';vtzIKK#??%t:FQǬ,"IHH ##{ARyf!E,> I$"Fߔ|7D@TR~0Nhx^n'a~~SEpg||X! Y]rz~c!HX[[=tӈVe{ZVWW1{<!?_*녔h:All@DDDDDNT ẓ. YYYy|BQ/^Ix<Bк}9{(/?O^/"Ҽ̼Q$ EgM\\^B뫎#+Nr{=- O!""""""|>bcc3iH7BܥR72=v=E HHHZ!""""""""<^S7o@`]Ee_Vs^¦SyW“UXg/F(zDxz088`wFmm-###fbccijjΝ;B ׯS__OGGZTJmm-äzR`~]Vr/^t 2y) e. Fe}~c8,GeƍO䕟'###Q^~?ra?cǎ mk׮j)))G"zzzP(ϭ0ׯ_grrMnH*苋|>jkk|>?;Nn߾MWW{}ܽ{!Pմ266F0 N455ӟThBwwf*fooJL&`0 ɸwt:Z[[ILLb?.ƒ ޽{`0XZZ֭[HOO݌hhhz{{q:vILLD& !T~H$K @ݍfiل϶Lll,qqq}>==ͭ[p8NOO>Al6 oߦ9^yR)fFGGL&ZHGGɤ GQ*6 Tӧ)//G*œQT?,.^H~~>>{ &''ioogddd2MMMtܻw^ J׋L&ppUٲe 8N}6?Vj222V.;wƮZ[[ĐƍLOO Pd||۷or###d2\3 Jv:?҄ܾ}ٴi 7wܡL~HKK[xJE?a6gzYF;>,%%%/{ۋ|!tZZZz/V]vqʕ/| TqܻwLFbb"{ԩSD", .ۑdlݺz[l!ި"H$ﰸH__EEEܻwLnn.6mbppW_}V˕+WZx<$pr9}}};;‹GBBݬB!~SYYqqqqilBff&GOOOʿDB8faذa^Y^^FV3<<̟ɟ0xښTNLLӁ\XX˗ٿ?+++;wt:0J~ȶmg۶mʃL&c||??~.O8x `P(rwqqqn \."CEB?رcF9u۶m,,,ݍj?/~GGµǙ //O0044DJJ |;KFd2 333;v-[p'Ν;oT{D[VTTt:9r|'B!Ν;baeeZ8~8w'rm"^< D"پ};FPr?Οɟ eP(ٳgq8>?#0kkk򗿤BAww7'OСC=ַDTڊB|/OwիL&=֭[lD"Z[[}6pk믿ؘ fY\.:$ :tHP+++9~8x<yd2===¾޽{;=z]vH^裏=._D"P(x뭷a۶mLMMG^^GP~w^/RIz=uuu1W^E"Hbb"( 嗿%۶mC.Juu5.GeϞ=ՑիWЀD"!P\\LBB2o,,,K~~>Pcǎjq8B!ܹC}}=999|P__/qTƇ >}a?g?ߦ%ٻw/HZ gϞoJ%7oyY=EDDDDD닋{{'d|p=zb*++? pe@K$AQ=q`)HOOʷm.\ +/J_X,\x`ǎLMMqe0l60gϞ%&&_@xh4o{ݜ# 8pb ٷo. χT*exxr*șdgg8p*z=iiikdee1>>N{{;˄B!n7CCC۷{jaf32>H$ [nef"lٲ0T*np8.oVVBII ^u<:;;vsU***x2e)ٳ*bbb;200``߾}lڴl0rСCdggyfn݊nGVEVVX,4 j)..eFFFgMII v"55u{F06mBPPVVIOOW_%??iؿ?w^j*r9333d2jk[@F甕ERR2 ɓ'ywQLMMa6e@@0&$$pa<qqqd2TUU-[_gvvKZZdeeE10DqAFGGٷo"U6ŏ P(1;;믿 lSZZL&cÆ ~E< "H0LIHHc077ٱcqqq3??ښ<%%%aÆuk.^yg۶m044o0 BNwll,psDx7_v<|uhnn/eLF" yPT444088Hoo/JU|> ),,dϞ=,,,xLNN200<RWWǑ#G`޽*va3ڊ^'++ ;v/2==Mqq1GhZ o2e2RT[|p0yyy444RLD"MVV8N'lܸAVVYyTWW\@ryFGGyw!ٸ\.v---\.VVVy^")))H$n޼I__444`2بAgvvAv&Agg'cccdggseZB*&m޼Db!''Rɽ{/gRd2A^311R)|>233YZZBѰHWWFii:%"Ekjj>++ VUP|ߧNGYYK/,R)0??bATrixטt`0((RPh4lGVqJ Avލ墵/J  M*E}}= Ee… `XBXVu#`t^v|>֐JBh[nQYYI\\,i&رcg?HRX7'99V+|p69C177GZZp#G`ַ܏.O?E"C\\ܺ.\Cq|>Ο?OZZPfΞ=K8&??NnݺE__{h*H$=fsjR__$^;vzX,CVV--- jiii!99YZf\8Z[[x<5 ɓ'9{,.333-/"""""xlNRv\A_[[cuuEIs0VU(&X\\pF#T*b`l6cXذaPYY\.gnnNǷ-eee;wRPP- 6[2z=qqqQXXHEEBT*EQTTDBBp7x<`%<7\Nll,III$''jh4Bff&iiiB-y7hd۶mdggc2رBy0\.GRQ^^NBBNݻwSPP@("33L$)++cǎBZ歷89Z4VWWg$Jjddd^r "= w^JJJDff&YYY$&&b2HKKcƍ3~f3[lYWM"X,IKKsKKKo}te2lٲ\z=@W^yF"99y]\.'%%U6m$mۆln޽{ZQ9999HR^/999t:DRRR0Lb2HNN&554HHH %%Hjj*RXXHQQ kMnn.FQP شi%%%Ff`t Q8NT* PTn7-[@8xW!99\RSSY]]eƍ gUtNV`0F!>>H$Bff&,--)jr2ַd"??͛)//kT`bXGaZ)--^{ DNNEEEJbiiP(Dzz:VlFVP(!//Uv-qrrrBf'5Nl&55U< TTTQ9[\\`0J  ++ ge呚*̡H0䰺ʮ]E" Jv͛)--E׳Bbb"z9222ؽ{7٬ XQQE:`4&++bmFzz:@d6o,=*yyyzyHdiiIwz^!E/,,|#G#PҒgZQQ_n>333$''?>`PNdeeqOXXX={<}^/BCAAKxQ}^P B_31|8p@(D(//_W/Ν;iS/D"F^{5t:9uªԋkkkB>x4q<E%9 !ko+a41ңBkE*ϯC@ &66XZ; T D"_y|>L&CR FH$B @.mDDDDDD>D4S)1P05x'~ Eվ)/yO< ~y~Y9y~?nF"~#sƟQAczDU H$ۯ _urP 2ZK+__y=xx<~ nH$ ~#r>"/<YwCܿDCܟwp(z!`LCE^b7ԆgZy̿jxu?==QOxe?ϫ$GzE$rkz y\.C?7y<;@jޮςryOuh5sB{-VñNjl6Luu5BΟ?lvsIZZZBX,|2. *$qyz{{ILLvsY*- qMʕ+cX\|^ ܺu7ovy?.sllQRSSx=-,s{_DNj5\r~Ν; y&MMMt:$ .]|>W\XBxEΝ;28qP(DJJsB<6}yylܸ7ra6m^]P/G{.:Nd{.3??vl(J9y$O011CY:;;:ohjj%|QիE?VA9scǎꫯ K*~]]]ݻ`1F#W^EVHGGٳ 2gϲeOHJJ"++H$˗yٴi\z]vN0ޣZIJJ+tV>VU(ƍ7xg?߿ÁRϧ~ʡCH$ 9uL&a2{(kkkܹsG 0,jz444Ӄl{DZ-oߦN>33T*e||nF#ǎc֭:ubQ\x\BLL .JJJps%MӃ zoo/wޥBvv6ofrrt:Z5fvs tD"_Noo/Z|>XVett$^/׮]qv-(Nbbb}6P(u NHkk+ Ʈk-puuutww Cbb"555r0>>" Ȉo{p8ǃ 55)jjjXXX %%.aύpMΟ?/->ihh`ppP(Ljj3SУVKGG}}}LNN(;ߏlrxz|>bbb!..>FGGٸq ك"""""""""OQFknn&&&Z(99m۶{iZR);w8J%l߾BA$,Gr***^ݬet:*7oсf#&&_L1$%%t:vj6l؀aΝj_NVVJ'jTUU YtWWCJa(ìp=.]D(ٳ7sa7Jpp 0ͤpYp:|/U|Sk0Xt:٨jRSS)((tbZIHHJRɴ -Hѣt:fffvxp\={D"k׮ ^ߣGp8X,HRL>|EFFF8|`0& ̧~\.>`yyy ޸q ># B!G}ccc9sfݜv;W\ҥK|ܺuv%>>tj5JիW?gnܸAMM LNNr5t:)))zGyh4r)~3}gΜattT :l6TWWȉ'q8QUUFFmstũSX[[cxx=->|J$H)(/ſ<ѿ B:u ݤիWYYY! BB_u/\ܷtwwSUUfʕ+\.# rI4  (**f]$!11]vQTTDQQ;vR ٹs'fp8Lff&7ofuuFRaZZp8z -}^p˗/=&'' B%nܸƍh4===ܽ{WxD"ͨǞ={(--]wJyWX]]}.H\ w===LOOsN*++jw^222%aꫯcZ}l6Qձ{n.^j<###x<zlݺAX^^FR ֍[*TVVp&&&XZZ"==:H$BBNN:,Grr2x<OAAcccd2"`0 }nʆL&M6X\\|fE$ pQvM0SQQA~~>ccc}5VRRBJJ P(Ĺsx뭷쉈x>S.o[=x>o/dD"?v;+++ܼy^ꯐJzzfggy7F"/_O?%99 6$ܺu>۹pdeeڊl&==^w]t:2 Tʑ#G8{,Jq<wahhw2??ϙ3g8s ccch4VI$R)H$BQQ͜;wR)111H$z#JQT8Nزe z͛_L<˗/ J L& !Jcrr['%%Rx7l9r .xUmD"XVbbbOE*rDL&cffW>~Y<H$fgg)((… \zEr|U*UUU(Jؼy3%%%ܺu۷ov|$  {nEqeetr9p)..&%%֭[CHRRW\U۷RȠbf _TT999 H$ff3ǏR, wΝ;a2{=FH$Bcc#'OD& *ςH$T*+WpfffXXXŋܼybRSSH-~?Lӧ9r*g*s"""""""""/ҒJ$z 422Brrs9~mmm~, %%%ORDR eee(J@WWPVKEE㌏#J)++Ba1LAJc0Trrr9y7L#˙B&l6djj DBvv6\.FbXYY!##C(^ kbZq:HR!<[bxSSSdee,C*j```O~~➝MZZڋV~f-!!aH$X,`zztrrrp\v=__TT墣BnڬMOO3==\.'--Uj5>FB`nn,999_D!%%E(')..6lpnR:;;zE"T*z{jjC"LBB?GFFbjjI֥B>cxxBABB\JC^^ /C.阘`Æ 0D^O(F?111 , T*+++4773>>͛Fc6k~\.?d "Ʉ(G}}}LLLF|DDDDDDDDDLLLu> ɴ!D YA*ߴ̨$F%Μ9[laΝ/{Õ AeUГi`0ȥK ;;~h`:HKKOvK.D"aC^^n" gϞgzx8~8oB{"""""""""_ryaH$Bbs% NBJQ$ KKKB14H$"~<< NضuϓH$B۟%>O×d_c/=ka|>< ole=cccdB]giv +DDDDDDDDDH$fff4y ẓ.}y}~^K-B @"|| B,BN`0i"`t`Bd\A8 =>N e!HCܿDCܟ|FK qLgy9DCM& r=u'auuek:Ͻzp' = ~_"NEp\_LOO ?`Dn޼ɹs'99PJ4ǏgvvVinr9 7orUfggIKKcaaǏ377Gnn.\xw"IJJsΑ`U;vɬGD0$55NΟ?2iiidzSN%|ĉܾ}vrssrssŋ aZ9sJJJX]]ܸqz, z^B(&&&j>z...R*?NNj5CCC;wnP*\vk׮ >jkkszH$ٳgbzp Bi|+uagϞ;vp8=,. FwOS*++c޶n磏>bOڵkDy2`J%//{dž P*AܹիWinnF9z(wޥ|x"t9{,SR)sY`xxKbbs^r,//|>d2Jr>}XmۆbyT=}}}" 'p 6n܈墶?1[lxŋرT∏'P__ϡCx<J||>Z >>>/,,hĩSطo'OTL&W^/b4QQQA8*ٳu z[[7nܠ4Mٝ;wcll ^^su\hZ\.մĮ\BWWk׮$8\ x<._LOOSSSٳGPЗB.駟L{{;܌^r166Fjj*S__ϝ;w%KJJ d2bttgRJ   CZ[[IHH~?ܻwJdjVVVHJJ7o"H333\| 477311|Wg˖-rL&} J%AZvtjZZZP*rINN^gH$vN>Mzz:KKKvH$d2Ν;\B% ܹstd2G!PTT\.gyyZZZhmm壏>b9wOP(1G \r~_ȍ7 rJ% ܸq^ÇD"ꘚ̙3( ADd$&&`ĉhZf3FX>c9~8X,d2 {vii ɯ~+'O`0P[[Kgg`йqfAm6=zVZ,fffhkk#%%ZMNN ڵ J%(>&&&&ؾ};;vf=oDHHHXwG`FC||#(//[ZZu(X/ 8s NJJ }X[[N-pA/lذaL}}}TUU111Auu5tuu144$$$GE}~ILLW^!??B6oތ# ɘ&??[O$!33Rhkkc~~qHHH 11!PeU8 p@e||H$֭[ pM*++QT eee|8u2p8P*+ D"j6oLee%n@ ̍H˹ummmͱuVQXV!Jn388"R[ne͂'dBRWWǾ}pS^^8Nf3RH$B8* ajjWNj`0JYY>Ffffgzz8Aqlp8HLLdrr>[nDUUjRSS"'' 6PQQ26 6m6^Ç}vJJJ"== 8ٶm |[ߢN||<2@ '&&szZ-ȐVy7ƍD""p/,,P(ضmbX ##~@@UUv9tܽ{Dhh4b2mRp\˜c7l߾o-ܯ "HOOgΝzJp8 *gϞE";lqycnݺD"!''RZ-%%%LMM̶m2O~RdƍX,~_֭[9wԿH&gdiiIvH$,,,z)..ftty/6kќ^J%*NVVV(,,$66.B388H0DVaF*RPP NOO  JGղ)))155Jbmm ͆` //fggdfá@Nrr2v~ARRݸnZ-\.\.׺bo T*c*F<*@ ^IZ[[?vZx<eb0::J  ;;1IOO'%%dmm]4]!??1v;q g"3 0A$s"%*YmɲZyͺݻ-_U[[]۫9(bI$LHD"3CH$bI3~o>)t\.4"ىh$''Ikk+&T3jFV"##b¬ ᠽRI~~>J6~?vRRRX,DDDI[[z=r4 KBr1::JZZ===b۷ohvK__244d"33AV+/~ ֬YCRRyyy\l2p\a4Q($&&}6PZMvv6ܹs8233b``HvvAvikkC.n'))I 6Dzj$>>;w`ۑa0D#&&ѭ:YYY$$$ikk# QXX(n sN^z%RRRhnnl`0NXֈ#;;k׮Q^^oM\\:99Iff&f.n7L&''}61110887p|(ӹs.t  BVV7Fgg Bހp8LNgeep8$ C\\vvL&YYYtww300@8&))Gq&!!!!!!$j8c d0 V]PпHtƑ#GlXbF:ti (艉tc,pi ++{|>:Ė-[8Yf*"C+!!!!!!!4yd F&vE/'ɰlYq2ked2G>v Y~a&&&0\1 b<\.l} ÒRţ[$$$$$$$$$> r):pI g$B!Cƃ[~QCϧ`NOCKO^yRr+!!!!!!!!! == PK}R.{`0L/urP(|z^ Suqx>bH%vl6nԔDQBH0dttteq\Oi_ O)|d\.1nرcTVVu`~_ oiiСC444`6z_%)++ԩS;wdhh8z(.]B&Dee% >>^b?$99)~S[[K  ==z:8pUU{$N'w… RXXFƍ:u"9rٷo̟?p8̥K8yM].Lccc=~!F={`{_bANt:ÇSUUh|ɩ)"##g9rAGG7n`֬Y\rǒkjj~(7nLLLJQQ#oL~?@Eyy9-Voo/1EEEq_h$**RJKK"ɸuGq:$qQ, :tS^^N||<=zv9r*Ν;`llGRP__OjjKLMMkt&''9vx^niP(fypqgŊ$?,j+Vp5:ĻƲaC\\ .h4rU^|Ed2nvMnn. Gnn.@sQ^^ˑdoW^x-Z|Z[VzjQ{illF#֊[ZkRVVӧy׉ɓB!z{{)))7L&ϟO444ENN󌍍O(vB,X@yy9jbL&S{~7gϞell|v??8vͼ8pd2^`Ϟ=[4"##ٰa׿K2[Ν;B`bbbvCٺu+EEE3R㔕zYjj5k׮B\rxa0W\fĄ;$bvv6ܹ|HHHHHHHHH|{0Nuu5 OQg~d2 , >>R)Z⋋Q(aL& .$F!??_*\~@hl6sy'22e˖Aww؆L\.Ggh4ʘ;w.M0$)) V˜9sD˛2R )((`||k׮qe:;;)**jnnnĉqq5k6O>/---OL̛7UV199f{d q ̙" ի9s `ƈd2(//gʕQWW9r_N(ҥK 455q-:Drr2Z%'}6:={v[$/`…t:233رcf(((`޽x<\.dllRJJJ8}4.]vS]]db֬YB!)..*Apyyydee\.eNzzz8wnDl6999dggSXXHFFPB,nܸ#GĐp8 }iRSSl?:3P]]͝;w())ax^ ]]]:uN:Emm-zER0_?YDGG}v6oLUU@z9t_<ڵϨ>]r uuu?DYo7p ڵk$$$>/_vH## ~z~ӟ2w\.^|j-dŊPVVFww77nܠ Ş={HOOg3 瞣 aVIJJd2dee1w\D7QX,dffT*p|#""[#d2V+Z瓛+ҥK\zUP($f`6)**"11FCff&nB]vr9^ܹs5kjZTƺZx<Ja۶m( N8N]8h4011\.')) LFfq)ill͛x^;W^˗s14^nܸ[xq8ܼyX4 ?fllnB/_f( &''ٵkZM6Guu5QQQ_5Kccc`@דKRR###( ~3Kr&''4''p8, Vd466ryO^ABBBBBBBb@0fϞͬY[CǠ=zݻwN8~ AV*?]]] bcc b<OfRRRy&ǎfٳbJ%Nիf{9Z[[gbb۷SWWƒ%K~6l؀Z&33HٰaNT8qJ iii2::JLL ۷o'22rF znn.+WD؈fC˩ctt/_NGG֭fjIHH ;;r&&&XjYYYOORNBfXt#jinnfhhzfϞf###"vͪU200;w8n Յ刺k׮Ott4VBCCk֬!&&FL}}iZr9nJh4\xBGGk֬!""ܹe͚5z<_ի`xxW2{lQ*L&L&x^~d$''CBBBBBBʗAYV$!ɰX,x<fϞ匿 M@(ʬL&& ._"*VLMM1jBFzzzM999066L&#++KTtƈ]' hZ&''&>>DFFFv344Dtt4( Q(3@ b.Ė&%%a2a``I2220 b?Z8&dfn"##1Ll6㙘```^OZZc/+'N,\.rrr0FZjell Zdjh4twwEFF6i\8fhhH`cpp$N:Jb….V҈ ( *P(`JBB RGa2bddDrr2###㨨(L&$''ׇ"55 ;Cʼn###.<z!XM&.n$t:p j0}6*Jػ}6> ===x< y~z{{Q(t:Ŭ2IlX,>gl\.T*yyyדģW4B$j8K d0 Votip> .ܹs?k׮Q__O8F/>$2]A|())=rI5kW6$$$$$$$<}||I233Xe2Gt8/zݎZ&22K47߂x<bbb[?e2ztӓ&cZ}`#ϰ0JOL=&)PHCI%$$$$$$d2;AtN4;(V*~OۓWa, I7ZG G= PKm~RT*16aϤ:,d.nr0 @T>MBBBBBBBBn?1қ3bk֬ԩS199)f>}4r_|N8$-bŊ3gΐĆ 8vgfٲe2)n߾M||c//?~ l۶M?BJKK={6)))|lkk+Ν#??p8̑#Gر~JJJB$''?.KHHHHHHH<|nx(**Z{zp8(mmm[3磸rJ%999XVXv-~hٷo˖-CPSSC||Z-FIIIT*Ɲ;w̜!s2~Ξ=˪U3=dff7nܠ;wtRJJJHKKCrҥdTUUqeJKKōjYt)z.]J\\TVV=ɓ'ٳ z~: XBR>!G?׮]ʕ+ ~~ar1^իq8\xsnݺEuu5$&&rU*++Bjj*vrssq8TWWyft:67np88^/NVK(" j* peFGGfpEnݺE}}=---8>E; r), wxp:$ ØffϞMFFyyyrV+)))eRSS\r P(zn#|nߏ^祗^B;B PUUҥK6^Wtq :Z-dddj5kyyy |W\R$??ш"77{ǣR|27op8HNN`0&''J%t:fo||Ą(3FA&ITT}X|9UUU\~%K088j%"","55(n6 El6/Z˧ |>VXɓ'qa&99."""x뭷|8q_~Y*t:P[[OSHMME-n(=sh4*_Urssq\(J yup49<]]]^TΞ=+nؽ{r򨫫C&Aqq1TL&ΝcϞ=lذJ.\dOVV7nx^qx:ȬV+ɰX,x<fϞM =nerr0L8N1V׋1_Bdd$Z^\.h!VT1 z1F!--Md2RRRXVZ-`rt:h4x<q )) \nG.Oexll *Z#""$ jr188H\\FQPfmbbh1IIIt:1>QaDballP(DLL )))2p'Z&11ɢ5zxxшZp011Z>"""ıT(b̺d2=H8fhh$~?NSh~?ܾ}Z`0 Ɨ\.bbbX,f ###LMM\.tiq"##>DFFzevc6'""Gtt4\.RSS*D囆vy j &`0 np\.gpp,0 &&&0>>(P ^WܔVINN~oz{{ d2+Dh4nW Ln'""-?doO׋y(9"ױZDEERaѫ~| _MM2JBBBBBBB⛏L&cttR@ =>p\K$)JCr 3^+QK?n_!)ӒP($Ar9P(x62T*gH?  2졯zIw]ܿ [>N'QQQOt%\.'7ՊcݵB;_8& ӯ/! m~a~$UX@(vYdpp񥏷Zaلa:;;Zҏ/fLNNu<. JJB&h".\ v\466vZB dddg-[FLL ׯ_'>>,^/ǎ x_dXVvɛoIeeX (JlBFFQQQRhoog֭o>z{{Y~=̝;.7oz?ȑ#b}uJ%[.w^gxxoVݻXG{{;`RhT*Gh➸ r055E]]񔕕opΝˢEɡ+Vp!.\N… ^Nlڴ R)M{SSSDGG3::޽{GTR[[Krr2}}}ӧ'77w͛79z(mmm$''s vP?tuu.s\`0IHHѣG%v)))d9|0---|.~@ Vej9}4fJ%cڵO-BBBBBBBBBBzQ(DFF&ь JKKbshJ9d狵322$==]Đ bu/_^gΜ9a… 8p((( 55A fBRqV^Bܹs,]xtl6󉍍%33AzTTTn: =RTT,^r줬 Rɲe˨att7of222(((@qQ7oVx<z={}n)))3::JQQfχ~Hdd$hZz{{IJJ"''N(IJ&̻}6B?\t ͥKHLLG9Z|'$%%188HEEҥK҂"??M6Ki.vʕ+\~I:;;ٰaN^X~=|Gbҧ=|_95kspE{{;dBד%zHHHHHHHHH<;| ~:/"֭k޽{پ};XZZJGG?JMM  ~}f $z@ gɒ%_5 .nuoo/˖-˗/sujjjhllj?srJ~?t~.ꨩmØL&IMM%;;,1[.p8'55(III˗/399(rFFabbADDv">>m۶ֆJ& O8˗RJdB9###X{v z^~?>X={67n˗/j*JKKaժU|;ajjcc=VJZZp8h4zd2 t:݌,jLN>͖-[pDGGhDPP(PhZJ%Jrrjf!1 h4l6熟HHHHHHHHH<|n Bk׮;w477s96mB7a||NGLL 9r&IHH=Ŝ;w7npUHOO//q8|>fϞM__eeevϟϼyhhhߐ,Z2X,455aZyhii8o1<<$߿jd2qqq+())a˖-?}}}nRRRf[Ȅ/ˉDV٣5 ̝;#G&3 d21^'&&шٳlڴ7o299IaaSI?s 'Od\p\"##9s :@yZGGGQTrI\.3'N`͚5\|e˖Lrr2VZ-x\'*,,dll|F#.\s-`6ٺuXQs~mzzz"##sa0ϑG(bʕTUUV7v/L__JTe9ruuu[۷osp Z[[9v;v%$$$$$$$dVU4d2, ٳgAP`6k _˅d2x!jE/bˬ vEtR:N8~ZMbb *8B6 C.J0::*nLNNR|XVt:qqqr5LMMZb\pll,jB0DѐL&#rD+bˬMNNzd2j.Xћ# łL&By. TJF\.N'f͆f# v;111 ~?.h1QQQz >>^L5<Q l6{=^{5vc4E ?<66F8&..Ctt4>@ G8fllLaT*QQQLMMa0t:r9^(<PZQQQbA0l6K|Zvc2X,~? x<S˺f#22B @R7$$$$$$$$$^1R8S d0LWП%+IN:d͚5?a+AAuЇHLLa.^`۶m36͂ ϟg``L֮]@qմ!0lڴIRt gGcIOOzx^<J)DDD|LCN1p͆`z*QB{?_v^U׉all J@ =G8=sLF8& =ue2'L&vVLJ/rJEDD*ꩌg8FThD FߟL&RƾqqA ygva3qϯ@>Uw!|K|3x% gZc x0@@a0*Y @@,#sM?{eL#~=}>6Aww>ܹs):;;gD(zbm`||9_p;wr5e2SSStuu=V###_x*xرT[>QBBBBBBBO?B@ @||<555ݻׯX'UrUvMuu5111]VR8z(ǎկ~Egg' ,`hh]vqyN'ٔDO,v;?Ϲq`LΜ9þ}&??_~)?BJJ SSS|ǔRZZ… jk.-ZDmm-{d|>{졢EZZǏ> //{=!t`rrARRRø\.>cٻw/K,!""BL߿Jr"d @ՒȮ355EddkGrQ[[KYYK.ٳl6N>Mrr2qqq BUA10G2 .bv1STTHč;LÇQTFQ!?>|xr:FYNO>*t:IIIB!>#_΂ O>ڵkvB=:|[^p=&&_׼8NXxckt].3|\ g˹x"Jٳg ijjbڵd2222a޽,[x0deex8z(MMM̟?իWپ};sa||{;P]]J"## J%[l!33 PuV8|0ì_^ŋΝ;,_(FGGdӦML&!))~çY)--ell ^Oww7޽˗/ŋinnfѢE?R, KNt:BTj*>̊+>S piΜ9Ccc#tvvr%u ^:::l6öA311;wp:޽n7.> ##c08x o}zzzCaZioo'33ST|>%%%2::d?7n`6oKOOQQQٳ۷oIII߿g[QT>|X, x9J%8|>w簾Rɮ]#!!JN:(R8=== 2<<, x"k׮={@ ŋyĵ)33S.!!!!!!!2 G z{{zh/Jbb"Z~ϟ!drrp8Lnn.3j GGGBGGDGG@LL\t HQQP$Ν˗ٵkDEEIJJ 7yP{7n`={+V嗒匎2gT* .Z瓒蔔YffTUU y饗DKBƍ3{l***e˖-qY~ӟrʕ'2_Q199H/_hBZ-[p9n7rP(ļy… ߏb͔dijj{Ajjjhhha._L0W^tvv϶mHHHĉ477p ?YfQUUō7hoogÆ :;;)**b۶m$%%qm6oLQQ477sg2+Ԗw\qX-9_IDATn7>|cǎ} ^rěo͛7inn+WE__wΝ;tww355l`0͂ ͛7hܺuP(DEEWxָ[oP(p8=P=j͆ yؿ? =pq/ZaOuu5TWWSUUETTMGGi)V+A,6oSSSܹxyijj… TWW/s̡i3}cijjBVo}֐.ǎԩSh4<_}!rssYnfnl2{졶9sa(--EP}vzraz{{ټy3աjYt):ŋd˖-;v+WP(x<vIMM ,Y3gp9V+yyy.,YLFFFp:t:, W;w066ҥKcƍ8Nv;Hdd$[la qˉN#:: .p V\ٳuw@OOMMMܾ}9sxHKKcΜ9={e˖r'p8PT444PmvFGG'3k, Ν`08c#KP, /"رTz*366Ƃ 룸HZ[[),,111l6Q6233gѢE ^ʕ+DEEaYx1*IΞ=O~o|1=]se"""xWt"// ĸ+WȈOf:;;\sDYY@p8XjK,!::Z\"""8w###lڴħ=\ji{e2ٳq\LNNETTcm`5LLMM155%?ƀbˬMLLz ƊqFarr@ &v*&JRBl6r9( ~?V(Z-NR)*kDGGj\>Ú pSSS\.BzFjE&}Zx^;Zb2kBzOdd$ߏZ&22ǃVbو`0HUrt:1̈́a&''\<*1j<NSkP**$׋3 rec0CCC$&&|( |(nFEEo6>@_"** \$^Xd2>H^/iEݎ=IbbbPl6j5z^VK(bbbR)OoohIj5FqF%*O 0]AMb8? +ˤ?66Fss3@nn.˖-Ҋ`\,X@QQgdd ֯_/VDxV[AHql6iiiO^ХܦPT\@Vz|jtO-s}8nQt/Kt= r\,vw/`Yʀ=x^~cDj CV?~Q*O-$dDEE}yL'""V(]###B/r_V? ønt:r5GبUn%$$$$$$$$:d/n>׍gB<o4]܅6]EM?%$$$$$$$$Jc z3exq!$zغ`#xk|?uPQQ}'`*7%$OeUL((~F/(//cMhkk# )(++p~l ֭[bB.1ςKMq_1iooҥKyv8ӟ BeeeY[2ڝ;w/~A{{;K,yL/7vaN87all_xbO(++fGii)III$%%f455Μ9Ccc#DFF%8( &&&p8  Bb Mo ^N8AQQ B|yZVe֮^ݻK}}ᇔEzz:ǎ̙3۷;wʕ+L&8!2k Bܘ9z{G`08o=^/>z^\.*Iy:;;9}4F goyjçw# 8geքLc200}XrEll 0ww   ~\.vIII(sݻgϲk.immI\.^|ᇜ:u$ ͉'HHH`׮]t:IMM?&22Bl& 199G}Dqq1:P(d8>jjjHMM% ^|. >CHOOGPߏJ"::Z\544RSSCrr=Dnݺݻ)))ʕ+̙3dddd2/KZ[[$99YTwލdǏs5222__e…ݜ9sgݴɁ!>>^wa>Y?|ܹs璐 3}6y2=Wu<  8<}aΝx uO.cX~FLL O{ xF2eb4Yyy9Z>y=ɬZ:ټy3կqׯgÆ \pP(DLL ;v`jj_Ye˖qul6lYY8r9~UVQ\\L?UUUի[QL&6l )) R__seˉV+~"ϟÇOOYf ?o'|۷1bDkLjj*\0߿_2o߾Hqq17n`rr322¡C%'' .Yv-{s dffJΟ?Ncpp~`//fvs=?k֬… ={[H8~8>r^vIbb"l߾z0kpM|>˖-#77SNzYzn8UVVLww7~^|Ez{{%++{SS֭[sqA/^̅ p8,^\;dɒ%fvM^^?cY?괵Q^^_& q1n:tŝ;wpWBVtRl6eQ^p!zr /NQJMMedd!~_n޼)nnݺz sZ-eeerzzzlر?u122BNN+V 66VN>c4y7X,|GreF#.saZq:XVvލf``@ <?κuZ|BWWuuu,Xv-[$''+((ro>V+lٲ  ؿ?nbʕ,_VQn#""Ν;3gg&::Ç)++cƍrqF)++cbbFKK ---x<q_NUU ۷sM)((Ν;j͛GOO}}}dffuV~ߠٰabo޼IYY:^zjn߾Mjj**/^^֬YCww7O&~ziii7"##ܼysQ\\L__ /rY,˗x g@NJJXSqdz(+L&#%%!BT*L&h)l6s 1 šTTT`6' ̲e˸q}CCCDEELRRcccb-ZDRRǎٳd2J%Z`0ٳgYrX8>>-BPV 狵p8D+@(5kfc۶m000 $$$}v:;;ZKMnn.EEE NAd2^{n}iZ'sFGGioo'77W.%33#G000W^`0]]]lذJɓ'5k7oޤ|>p`XNBRR)))DEEHIIF!!!RISS)))̚5ٳgvZ̙>h֮]B?ڵkxb֮]GGCC&ڵkh4RTTD8… DGGo} R۷uoqqq|>N'dddkWzz:iiiB!RSSYx1+V6z{{h"JJJp:311q Faa!/^?f޼y(J~?ͬ]\ϟIIIѣ֒Enn.\tS__f㭷BOBBʼnQWWlذR)n T*JKKz*2EeNCVZł x<$''ͭ[l ܺukF0111`6III!>>~Fb @ѠDw|Lll,uuu ZfbDeibXchxw  |2+WDPo}T~رc===X[  :N1ڬ_T9>>Α#Gvq:Hd2g ŕJ%ϟ-VB!*A.KWrsws2l6x7`׮]bHlقJ"%%V̸Mii)mmm~q-5  JXn2&&Ft7LF1rJ͛w], | ˖-cɒ%8qWbؘh7bJ^eVZ|*3*[na6ۿ[&&&eٲe|{#))q xسgN;vRD r.\"::@DD~FCLL zRFaddQz=&1\Պ- ȚB@T墯Oђ.\#**JܔhnnFPa1Jp8̍7x7ټy3uuu|-[сDa0j[n%==&`泷VΞ=˥K]u:'@ՊnsuuuX_x/+03GNN/]J%M/** B!zILw th4BX!FRxP*\K__jJ%CCC 3c~^Jkk+\IHHHHH|]o zCCG$ΝKuu5W^eyz z?{ b+ ~_2<:t!yv Ŋ+eZBV\7n n:bbb~+J:;;5k6 NGBB$%%Yl/^V\fc…300FAV|rgѢE p8HNN&== ӧOSZZ\.gjjb:::hllD׳vZl6U.\HQQ3g222HLL֭[\x򨮮G?MMM5n߾ͶmPTC^^ʹ`6Yx1OԩS~^z%DFF)5kWf޼yx^VXܹs8^xFGGill%Kӧॗ^b֬YTUUq5VXA^^}}}̝;W܀74o߾Mww77nlfϞ͜9s(**"..HJJJ_p-ZDss3gϦ"rsstvvdqcwddUVaZٻw/[KL[[̛7JN:$[npo>:::tlذ+V1**JV;#VIrp:fQ>CDEE ,B[N 0<`Zbjj !&LHH@RDyq:B!zavŲu%N'nD01˜ """{N@ ZsMMM!tTTt0zn1 ƒbwhLTvxB$** ߏDT-ܿB˵gMw* V+z8B!\MkAߋBxM\B+\.Zx ݂7F!))I\z(ZV\ Q( +~Ϙ.rǃF筄ēW4B$j8#$ d0LWП%+)x<\kv8? +,Xb---\~V\9 .3=K.>K,!##㩌׉ !SWWG^^CRWWGWWiHܺu랹8 <}||FJJkY^˳F(=VP:CL$$P>a1+$`Nx<;v]--LNNbt 1 8QЏ/je644`Z~ WٓJvvv288H K׆Zjz\~]Gƍ_%b(';jjmܸqcg>vq8-nLNN,u100 W73}w߿ºI'wBC^}HHHHHH#a^f}q%Z T*:rrrX,֭[,]~vMEEPZZʯ~+IJEg?#????~3228x ǎ֭[V#GgܹCjj*NݻwSVVYlZǏG|r\Ç6prFGGO>ׯ+fr=fjH `rr={ÇYtXV UN/~;.]\.ʄ2k B8q> .p V^͉'l`m> s(̇_?c.\xOFi!k6| r!VZ%Ω'*Id27RhiiҥK,YD|?55l7,~A^/2L3 f@@ka1'2T;Nv܉l3h "c6|>~bY)YCا@ @[[eeebB{!+|8$QΏ;F8&33>Y,q f֬Y>}cǎQ[[K||<===0} ~ǔ200@ff&G7nPPPpO) o2_}k̙3Eٟپ};# ~̞=2.^ҥK2׳}vF6n֭[97011hdժU$$$Vۿ[*++x"F۷os <@ytRRt:9q###$&& /PZZXr9Yp!~!-z~?dhhVq8ܺuz, šCKη\.jٴinsΡX~=CCC|?*d2۶msI~XRN`xxrq /J֬YCEEccc,^X,)xebxxEii)fx{98 W' 6N:Zf֭܌^;GabbOJJyb @0l6300믿NLL 3&&XΟ? .B222~:n۷c4ٿ?^u֡9s `UVxbSE222ԩSt:ܕfߦrnjrf---۷ "##ٺu+---pi$//nK#@^^;v  lܸF6l@cc# رE$| ?Ϙ?>֭K.qEHLL>"##1h4* ,X@iiXG~d2+_uVj5O۷EylkjzZ&66[Tccczjժ/}xܹC8BALLjʕ+,X ÌsΑHvv6~46l@GG>DEE Ąxe˖GII Oe~Ξ=ʕ+FF?˖-C.o$!!~>|_+]]]lܸ͛7v =1BƍTUUQXXHmm-,[k׮_bZIOO'%%Et}qkk+)))bm۶qQ[%KpGڎ1V+t:?ƍ?SQaرcWw^bccQ(8q'Nn:6nx`0ŕ+WX,\x bcc#))ӧOvx"/^d|>X,z^{5Z[[fttGQ9O?… R??CRq%Ybo&Ƙ.dgg`jkkEKi0̝;;vuoŬY?2z=MAA>]=ʭ[(//͛W^yӉL&7ߤk͍78{,? kFh0߿&ыjILLdrrrzzzlϬnX0 |͛tttrxWh4pYrssy)--n5͌Mh W^eժULMMll6ώؾ};#55jjjbxx5kPۇdsEf͚/C=q?3/_εk!99qݢe3\'ߣOztuur36>Ė-[err1, FqCC qݸ\.ۻKrJ?%B#""pv16xz{{EPcccvteee3(!!!!!!7͛?~>O>\N^^#C^RRŋnrssyXlBo~d2عs'DFFٵk arrr!rrrغu+-=}>vڵk\UVp88uFm۶Q]]M 2>>΋/l͛1oe˖1{lϟς (**"::Qjjj0T*DPTb6ٸq#׮](ϟϝ;w )) MBBsΉk* fzrssb``@\d2\xQ~vZƸy&V9s0o޼}< }\ng$$$P]]ʕ+gjj/ǦMX`gϞsddd okk+twwSPP@qq169scd.]Dcc#k֬a޼y2o<,Xܹs1ʹqzzzcppcǎn>,^IJJJHHH`˖-D 1󙚚"77TkRTTDgg'SSSÅ %>>^RP(\>;&gg:2L~-p;t̻wzQstK/)B{_8`AHNN&--M|獷|>-)uH˒0ן֫5ϒ.%? ~Ym{}6Sy=|qs{Gu A"R()l-efdZ$of^%+$8,ɶ%Q"$ QH^{{p6Sz$ٿkw{~wzݺ߭?%ɒ9q{'qVV @dd$J޽{ILL\b־U4A $H;h1Ymq݄=p^Dj5_dDb͑4}efJ0̈́?tKžƣ(_8e]hhz}O_sˈ ~Yw+nMCA3MA $FU*gӠ &pg0DpVO[ 6vk4Z׶GJw!<&yi N#A $H A˧T*}f÷P(D?ς\.h&_%)V(b[%{_WRп_$H A GR4v1 b(׋`=*< Ϥmr8/Iyc4ş~?f1h4.Zbz6^my^Dۅs昝 ?FѴbZE…,˒v\.@ł^h4w&zz*׋jXVFb(.Kk!?իW1{N'KݰX,466w_^,hmmezzHs9:%OWWwmba~~^L&Wzfgg=p}w1::J__}^x {h4.ٯw1ģ&`Z;bffYXQr A Qs4kW^ϧ>j<"Ӭ566r1.]R$--Yn?\rELQN֯_8555|r***W_% 1$ ={v-[&8z(p8_Vˇ~kƦMɓԠHHHd2?bى` -nbaaX&=z$N8AyyZZYfmppW_}+WzhϱZh41B|>.\cغu+'Nh4R[[K\\aaabQ%B…n緿-b@ ."m;1ƍh兼BeݎRp`Z7 ;B³8q˗/G.t:h4kHhhX9!B> 441ZWiѥG/A,8N1Cf}nIC}k.?ф/3a,D\.6M\﷎b G*B/z{{fڵK2[0fƄ^N 336rjjjaŊOX hB$w!6 +w0466fqOZO s7@T{UpsIsɓ'E&}sC A x4k^RRcnn.455QUUݻI*.!mee%W\aƍ Dݻj?]]]ڵ'xg{bl۶.l6pyҥKjX|9Οٟ_k׮k.222իWZtW\!::SYY7nȑ#455QRRŋE?Vχf+W1;;KKK Fgg'~FFFÚb?h4@דOIIɗ… zj^~e֭[Улn}] ==(L&BCCl;vLe]ZZP/J'22۷c6x"lٲI|M</"466{n<gΜb2Y??RX,2==͚5kȠP=Bd2s믓ϲehoogaa 6@ee%YYYQYYeŊ⺀VMM ۷S__^,{=BBBؽ{7ro[ (++fף3gΈkmmZͳ>|lv` ++-[OOaILLdbbÇ~v-**|SQQAII iii`Xطo111{l޼ZMee%~r6l Ε'N000@FFXv-e\.Bl"Z֤tuuqqOO/IKK [lJvfqY1 _^$##^xAlѣLNNOxx8O&''JKK;Gpjj*+V6^Wt.]DCCFh&&&8qn<2339qєЀ^'22R,nZȜ;w֭[ɓ'g^Jyy9~Wc jU*k׮eٲeXV;Fgg'6mz A @SRK"΅t:v۶m{dy1Ltuum۶.'**NeD"5BT*UUU ]ٳ$%%"--3==ͫ !!!DFFyƍZ*>cM6t:`h4|>LMM1::ʖ-[hiiA׳zj<ÇRm2==ٵk.Y\B\\wŀr2댍q!mƍ7?r…G2d"))8~mϊT*exx!~E @To>0b]vaz;V+h4N>;}HLL !!!G 22ӧOӧ~:?СC8NZ-/ܹڸx"dK̍f3Z^Oww7zLZZ]HT*T*BBBxt:}6|vv1֬YCJJ &SN166lF,F# >]]]8|0sy y稪l6}/H$(%P^/W\a۶mvˆ$** ܼ`=s vb߾}={Yx'ZLOOS]]w[Ҏ^?cۇj%..^xnM7CHRaaaՑKBBpS]SSáCؼy3@g2==Mjj*p8HOO'%%B:D8:u͛78F#O<TWW3;;+Z,zoJ"""`z A @ _Ujtt_SRRQYYɳ>Kll,!]כoL&H$¿aW\AV뙞楗^Bbۙ`zzc0d$%%fcbbF#VB3::4uuuܹT~mGNNǎchh~?笠Fo3-++3==Mmm?K\T*5m?!(V' >>V_,_ ( 3x^rrrd[V}c@ @NNO=UUU Ŵ2** F#d2 i@tEe2|>(j5NbxxH1`έP(p$%%SOݖK{{;EÇF#JIHH`ffqǼ_%\+fN111l6bbb ("""AӉ-Xx\.ԩSb BLL n[O̤FCXXsxX_||#wƍ?f֮]˕+WHMM%66NǡC!99%&,V+nLFtt (<-ƨq@~ߐ-[l6399^H0GtLF\\h$;; i9EP|>L&(OOO.j}>|GLNNϋ&¥1xSOQPP@LL ϟgvvLv[mu|X,XVjn/˜ ~Z|>ȁ$H A<AommٳLLLn6}h&ϋ}+++illpp8ͽrUL믿zyw@T8vSSSdggseꘙ!++{R^^T*e͸\.{=ضmk׮rqiسg ~1WPz*))),,, '99/)++CTsNv/ ,AV ܹsT*YYY9==^OVVV+V033CFFxѱvZ)++B0 F!//ٌ^GPȎ;hooʕ+zjR0!!A4vSYY^'..LFvv6c6bٲeKLLD$/_fjj$6l6md2܌nJJJ6ywyVʮ]իlܸQ訪b||{RTTDee%uuuΒJtt4===222Bqq1XV 1 T*˹r ر+Vի)++hnܸ:^ϹsQVV̙3sNb#**J;phYYY$%%qyz{{dڵ|tL&*++Ek׮1>>NAA[lazzv8gV\)wnn. ~FGG$$$BJ]Sٽ{7ӌL&[NGmm-KҸp% l6Yv-b\˄{E/ A |%A +HtRXX2 Tׇb-A377F!$$׋s Z(A VPTr\~QpH$L_N -j#hrnh~Br0FGhdnnVĤr1Bg}+S8 v;6MaC&** R)jz51S,@  N8 pBsDpӊl67YYY}|7L144jx^$ Rt֓XRSSEMbm]\a~հl8ѢB)Dy&[?s'5-M+A3+HĽ^-y)%aow9(B\Bss3 ỷ;Iol=5ϋ ,Ǐr8|;/=x}BRXPg!ޭ}=<<ׯ_gŊ sݨT*Μ9=/ߋ?w m\>:33 @FCnn7+? 66V;ͥ;Y= $H _Vf3J%o>gbb1z؇n@ p055‚TGxd"`0(ׯ_x<ա멮c/;B_|.ҭ bűv8\.XXXpPUU%fZSq5`ppv:;;xvuu1::󱰰@]]ݧ2wݷzׇdKi.DПƸ  $H A|ݹ:_WJ_&''5kPRRBuu5###8N~nfa0"""/RZZYP`4j>^9B `߿ǃBpjq\( , ~h&&&hhhTnujсlF.Avv7:""b>"\ ѲJXG+¦MP\x|ѭa4QTt:ź~.]O?43YB~k#<%&<<+ t9=] ,,,P^^ݻj= $H A|S@/--WԠzjN8AWW#KyTRRš5k8{,ׯ_ ]*o>4 H__v⩧~~OfcǎܸqClht:\.xp ;;QOʯ~+]ƞ={P-[NCj^Jtt4V|[[ʕ+JdddFaf.^lM@x===ٳ~Z-rV\.k֬addz CG"OSUUΝ;q:444`ijj"''7ϜIFղf<***dӦM$&&رcmmmhx"O>$8N1`߶mXl ?~$H A 5j>!*L&#&&e˖>CBB]v=p9\zTʪU$v96nHdd$fISNL||R)UUUKCgg'}}}Fjkkŵ%HXbO=iiiRICC---?&##L&l6ömۖB/,,`XHOOcppa1% pYmO~q88p"jjjXXXrvG&ITT:N'dzl2 $H A pOՅCFaٲetww?tH```_~rs|I"##&. ӉbW^A"Zo˅nۭimmʕ+444(,,HXXv!&&&HLLDc4bժUy_X,`0z_g׮]#)((Ʉlh4RXXjellvo޼g}s Px^N'n[J"$$H:Dbb" ?=V\HAIHHT* TM^/pyh4x^V+ӟ@t:Doo/gϞERa0X,x^ GR EVrJ{14(ꫬVӧOKss3׮]#**J+)))~FFFDׇo-DySRXUVc-nZZӡj }qCBBP*b`=шjEբRgrrݎ\.pg?`4v#j'!˄hbsssϣT*Q՘L&fffB[[6YbbbKG$H A $D"nz .뉉fGyyy"ǃVҥKaZq8w9vBL&ȑ#L&lj3;;+ϝ;grr\իW%33{n:T*[lvs vEYYXNZZvMw9~8nIOO,[plBaa!aaal߾K.188(JR}]xHHHĉԐƶmPTb SRRBHH<6mO4^r%V-[ JA"b!??;wH]'̓immОcZQt:l6ׯ_PTT\.'%%+V022Bii)r,e@*200@VVgCxx;7/_VXKqn'11UVݍ^'++˗ѬZjT*tcٵkaaa#J&//D6lkظq#v4 p|rr劸u:Z^z=iiiNjFXbv]v"bccr h4 #77D***P(߿(1$''SZZJss36l.HdrrUVQPPng]0jIHH/bbbhmmEt:9x 455@RReeeOyy9W&""N8 ?8IIIm $H AL&~xM. L@b0D;uDNB~h.HH$6a" Z똘Z*~g͡h YR` ăT*?#iLs|>Ŧ\@udw[.[Wta\o@ ϗ|1vFll=Y&**J i̓"!!Dr۸[6]]]bZp[;//Zt:󗬹;ShᠫKP¦w wnYВwww%..'Nvyg~Z4 xBv;~c}uܺ $H A0::**ol6T*Ew];̞|1 A]\Bso=**zнӳTuV^eZzZ: 㴸~W¸sw;]ܫ-9AygiM軕q-o\.F_\xf!m@w[v#DHzK.0˗\=yuC*hַETTԒkl5/ $H A|9xP6 <'HpݸnBCC͆\.GR}cB-R)j|14jr9YT*Ւ WzRc||YZp3mlfll F1::ܜ6Ld~~VfcrrӉVjX,&'' bԿQ^dn7.]BpeRRRS(@YĜ ՊFY"_zUtp8h4, ~+HߧChh=Mv;.\ ==w^&9322>=}Xj. \Eԥ$ 4ozzZS~? qa~~NHHN ;)1,o&ᄅ199) _r8>VKkk+'O$;;{I_$vmY'&&0Ljn7cccFT*ZOTp8p8nF{FTP(~h4v;wܣ $H _.$=Oaa!pӟJrbS[[!''U\ɓ'z*UUUaxWhiia͌s5(..ҥK+IIIbڮ/+V~3Jx~DSS˖-ӑ9rsaHIIrQYYICC}[lA[oouVt.]"$$sl6p^~ez{{!33 fłT*vhdffSNٳgYvx!ˑJe}yBWWommm  s~ \xTJEE;wرcL&]Fdd$JFP`~~qna6x<=zQP|p8jlڴIz8R)& RnQL&BBBիb2PTX,1w7 *L&NC듯*~qRSSq:L&|>fY[nff׋Zsߺ΅Pl6  `0VJ 8veeer<gϞ*222ޣI?r}Z[[ihh ;;_Ğ={䥗^-[066&7nܠ{Z &&sQPP@dd$p3*̌p ˱Z( n7333x<4 6 ^B`~~"^Fzşۅ@WWo,Wo6yWikkcddˍ7o4LLLOaa!\t+Wz1 ˴MAA>uuu444`… \|PA $HCZ|>q::u Nbb"˗/h_,Ʋ~zl6===_UJEVV6lJKK\7o&44UVɩSذaKff&TTTrXbRf X|9sssTUUtttv ׯcZY|9999DEEj*1imm ǦM:OLL0;;K||==͑#GP( yyy8qgffQݍZߧA$ Νcʕh4^~ehkkCPΝ/ǃCTG1>>NLL /(t777sߦӉRޣōO>,,,j`xxZ1{zzرcΝ#))"֯_Occ#aaaL&$ yyy{nV^F.˹s?ۙeǎH$fggYv9شi:ٲe/s9rrr8s ?'fffbʕ\~+Vॗ^bppmmmdgg_D;FKK Z[oR N>Mgg'N~Μ9‚?"Hh4|ǴJ?1 YFlŋ?LYY zٶmUUUh4R)%%%1==MLL MMM`0wq)BBB|2'l޼Nss3oW A eA{d%UUUzIOOj>jFFF{r4 uuu(JQˡT*ÌBrq)o.g>cb /\.W_EףhD~ٱccǎ75W\aƍfQ 8Nj5]]]}v233yJ+n|>Ǐfv[?/÷mmۆbDVVsruebb'|233o .<1QQQ0H$Pw^^*jT*`ǎ=zÑH$\tC/CTT/qIQc]SSCUUO<DV/ Rh˄q$ DGGƥKp8?.z)#66W2;;fbv <]o|p@ {/8Ź\[[Kgg'!{~bccի;TUUQWW /s='F%##I]]EEE t: ;wDӡRATRZZJjbbbJx<Y~=qqq$%%q:::}OPSXJnӧOcjf1CRpX,399FHHڵk9q>ZM}}h1L&&IJJ"99 Rm'99Yt֡`u!,IJJNDբjE0t:tV^ȃe $H A>){<, V׋dbbbK.Ԅl~$q/2ddd$TVV"1Ehh(!!!?qtt4o>Q#j4E JEBB555ݻgϒikk#>>ۍ";;9#"" %55#114Mkq&&&&FN'!!!ucc#x<J%niF#aaa3TjՊZ&22Ckk+r"T*ɬXYVZZ&33\.g`Z1==-*l۶"%==@ @~~>6DJKKaffLVXk0L$&&RTTDXV*v܉jeǎDFF2==D"!!!<ظq#mmmlذM__bL&ݢ^btZבDFFVeffoߎT*6l؀㡷RIaa!IIIt:bccallLtn@XX~M61q5t:555bʨ( ioogpp;wKAR`0P]]˱l9s\.GPPSScjjbbbbpqqqݻjkkYn\.jjj`լY1FFFtl۶ FCuu5ua4CRqFFGG')) HSS񔔔!唔PZZJyy9k׮eժUKuu5& F#8T*.]b``8 '==x穫#223??Ooo/L&ؼy3k֬!44*ٳg}}}|'ͱ~$H A b.1 zB#t:Es%~0ݎn'&&@J$Oܹ91Y&\wNϾ߄鳟V{=onnN4?M۾L,΃~xLOO%@{ϸ@)J}3(x./g|  jp8oͷoş;qw;*N(餯߭]/d]oݽKݩw{}?} "w?MJӽ~?>>O{iY󳬭ik A íE~|'ۍ}D"jbٰX,ߘn0O|>#_ł¢ [3'>gzzAVc01n{`M A $Hovw6]а%$$|}Z} Z-!!!_v 1GND"Fq"X=Rj"lN6 A $H _O$4V-HRR9[?k9_5V})̣/J8|L:yx,^_$H A A}n2F.Vl 0==L&d(a<[TS ZfttTeT*ebbZ-jO^/cccj|>LNNɬV+Kdaaz=!!!x^bL&f133CXXfav;aaa\۞g4"n 388n1RQܭV+CCCfJrJ%CCC3??/h4axxx5f.!44 t6 ӉJM`qw NX,8NF1eRdbbiBCC{Iڈ1@CC8qV$آ‚X[gppPbLOOzh4~(Ol%3<<sssb #G`2顡?(J|>FFFp.8ҵ1??Oxx8466%p8*) \r ѣhZ'33\.&''7n\'bAfhhJDD팍zCڏ'Nٳg ٳ144˗ |'d2.^ Fg"qݴp f3O&22ӧO{{}}=@'O2::d"%%eI c0 19211ܜ斖N:%fAX١!ưDDDgjjJ|eJ$r9v gffQ^#\Tn4f}AA\.aaab0 $HǃDqs|>7D*.>  裣׿[~rAU.si:;;9<)))\.^{5ٲe ;wYr%W\{ի_EEE  DF!&&W_}._RRRp\rf>#mۆJ7୷b\vF.]Jj_@ @XXZ_LMMQ]]-!^,/,,077'9/faaǃL&caazHhh(]]]7!//OLe0j_X@onnzV+Kq%蠫z4:::ǃN_իd_*]vJ%Nx<9vrj1LK3gΈ}P(x6yV+Z6 ,Џ9??}vݔ3o~ҸqGahh%QO<)?|2ׯ_?zbZZZxׯROL)H8uoommm455!op{{{yٲe Ǐ'++ F}}=%%%?~rjkklڴ#G333pi֮]'|BVV&ywXf ( j5}}}b \Α#GhjjnL&crrYz\.N8oIYYj_~ &ۿf!JȠ'Ob4'22~ӟGXX7\.'..3gŋ"""IL&x);;;4jN}]Ԋsss̠hX,\r69"@*RxwihhxT*gΜyA  ^/ vpTSVp!J9x 2`rr۷saN8'99LLL//8NvMww7^Oss3YYYx^J%RRItt4LOOWWWYP &aaab>h4v~?7ofǎ QRR">/""χ3g`Zt:NJJxq1/}^~e6mDAA̐Z>zzzhkkC&ɁVZEyy9O$ Wرc~yǐdHRBBBĺWUUB^g||Ccc Auu5*xRSSnR(LOO/gZnebbY!33Sl044Dbb"y!## vh7998iiib&''bxxDBCCinnF*zٹs'gϞe͚5h4 GE3::JffmWT,=UUUHRbcc- Ogg'jjjb#A =Ubdɡr^{5>+ .j)++n` \.jrIvMddx>sqh4 222O~Btt4EVR pߵk壏>n lܸQ4[|9. ͆BLMMsNя~NWvq8 Ç|rxgl6t:ijjb>rEdd$"99Yr ^ 6py<*W."P*朕r񦪮lYv-TTT`4E۷gA.#ˑJDGGB]]ͬXB4jKRYYFpڊe۶ml޼233ٸq#EEE:uJ\ׯ_nSZZ֭[`y_G۷ogrrd2@˗/s1rrrܲ>>|~N8AYY}}}|ϋ^pW\zדLQQvM6100(tuuHkk+l6&''EseIkk+{gahh'NP[[l&99Htt4kttt`0O=ڵk|'X,BBBv.\`|["<> B***P*|>9˗ 22nn7?)**wޡ'N tXf jjjX,~JKK%Fx~[;)**[RVVFYYw聆]vrJv Xj8v;wu։s׮]}vXzS\\ƍGL&r}ڵtttp9xٺu/K111yLII Gy1c8}4 hF#:??&337xC:}4IIIQ*\v ֯_}rss"77NOEEсdqe֯_M\db]ӉL&3L $H/НN'  1MPxx8n^yf3&裏bΝmnnɄhd~~gh4JKKf sssXVR)477.GFFvQAV_]]]x< rikk+W[oe"##EFA{6 /i_ѠRD_4/j"##bhh&+Jjkk!%%!F)..СC_sGG/W&)) 4 >,.il6---lذr6l@hh(f a``y\|+{{{E9QcpY֭[Guu5˗yfrss裏VGӉcA&zrl$$$Aii)G.* '<<-[PYYB*~~ӟ244YH%77{&!阙BANNAzz:{J/ Dndd$[nex%{ߖ\.?8999$&&R\\L||<ZDxx8yyy|["))Yfffl.]ZlܸQ=eP 6m6~?\vfBCC"55gyr93V:::Xr%[n%44Tz1L7n ##A6nȶmcvv%333 P^^ !JTTwfʕH$:::hiiX駟"##|XV ͛Yf !ghhHt\`X,rVXAOO^x> mDh0n_߻S611 n Qբ[HHSSSz嫩I `~~^lihii DFFq;w"IHH߭$!!l.>8"""gEEEp)EWJEKK ݤcQQQ_$H An>7nl6x<={ D}'''p Jɹ@Y/L& |>Ν;dggsuZsN֮]KLL 6mr&&&x),,$$$Z زe ]]]ۅ P<2>>NVV蛹aJJJHLLdƍ }aaA tv)ٿ?˗/G"@RR۷oGV/Aw:bhbccNyy9 `4ٶmjl*ʢfffؾ};z1B'}SX[N6XBf0zxꩧZ9sQvM^^Kinn&..N'񏤭BP&ုT*ٲe iii\|JJJctt2/_.^h4h4%j4r9zٲehFBDD11157>.Kn-[F\\dgg.B*f.^HXXO<.|><(K$1(ZAAccc剱4\.Q\\餿Jņ غu+yyyddduV`0.\ $$TՍ7a233UyyhúueaaLt:555^ZX,\.֭[\.299̤Y233ٱchqFV\ZMbb"b]˻2پ};6*8|add\lB\\/_&11{ژg߾}Fۗ$))0$ $$$Ӄb]vQ^^Ntt4۶myFRQQQ({-HHH`۶m@zz:G*bXdڵ?^nl2ill$~1vNN. 1AZZ^Wt(Jq:ddd&~E[&^P|>BQZVVڵkŸ")))>UV`ժUX, #++ RSSFTt:1Lűzj-[˗f߾}tvvR(-- AZ > yĝN'kv;v]|Ph48͟p~"L&DV}+iqG4QQQ_h)1b'?$&&&rʠ͆vc6ʬ[q:\GDi3|Y1WɄR$E4a4Q*5O AQQ }+fRITT;:z d'M|>k9_5͙wR --T_-GYf_d;(66^xA ,;:Nȅ@_TDXǼDGG(JT*f /K{~/\|Uz/$H _3E~ϳB$cAVWv8X,nD"e[,f݄|yr?X,^}X,4Nk4""B\7|{`Mٗ $H An M@ >vA˙S|SBZ-!!!_v &qqq 5qnd ϲ $H A (ԥn}YMiN9_T_ i:yx:o!8~Tnŭ3,w@ ؇A K̓}aa1+̭- zX,ny@AB4sRx<"""rn7\.ӤLNN288HHH000F@L&7n &Ex<`0\.l6366FDDV+HRq.p%<<\8d``SE_w\i-n2d2qe2*AV#e~~^L$ZVs!`MH(v_<8OOOo3==``aa>1Y'!zNRcaav&&&0t:Ξ=Kcc#>Ǐ!F_$fI!22BA `ppPL8==M__2~ܹsdee=+QVVGdzdjPUU3n}s~vq\.t:DL&enn(hkk#33S,l6s |>8zzz~ɻn ###,Ig;`0ۂ ۋ`vy!E###a8wbf[G>AƖ $7~O_x^׿5RIjjC ۴m۶OU r*++D|>ׯ_g֭LLLPSSC__ rU^yIOOrW^!,,0"""/uuudgg jRRRzɱcرcJ_׼ر6:::n+#HHNNW^yї|>334f(ZV6fggq(  v^}Urss allY¾4k׮]"""x饗p\?|&==qRqU:;;LЅYd2, jۍ`wr8 p8 c~~^|'\xJ%ⅇbazzDhhnjjqZ-ɄJbzzFhdhhTVS91L&CףRcttTucGٲe 1&&&())abbIBBB|LNNq4 SSS JşgffZn APY,r8N^/QQQbv;\v/ϛoɦM8<_q.(J 088͛ ׿5( RSSh4ggbn_L&._LQQ8z a4 322 [wfffn<###vnd27q eNNN/333իW)((d2j|>zzz⭷"33Zn7\xvp$ uuu?Xr%Z avv/SRR[رJfzv(J$^}U#33 1Gh$??9l0B"Vte6 V!!!\. VYq^/Ctr\ˌx* LDV322`/~_Jjj* 'FGGOsj5:1?l `l۶_]>4ư|'DEEC~_y"--H-j 9|#Cii)| 200T*e׮]O~~>#RSS1ݻG0L:tǏV`ffxx뭷عs'/^$22j-5VaD\KK h(((W[nejj~tuu166ߊQB^lJKKt\.}YΞ=޽{t|>yx<ZaXx"wn ]]]]d عs'EEElܸ.&''QT sEzzzHNNh4200@mm- Bt1zy̙3TTT XZk&ZTVV󸣣ӧOOWW ݻÇr!ˑd 0<jb ~"JE\Zp̭"ZOln7SSSKw}6l(NLLzrss|,,,뙚l6!Lb4EMk  )) E}}=###dee㶠@ xnZt/IY(8N¸v7nGPЏ4ؼy/Eww7qqqĐO?F$H|t::;;E"6l@xx8ׯG.3<>.^NOO333fc||,oĄx$H A|ZǍ7Dӭ2, }}}޽V>4667o2@Ŗd\z'>>@ KD_Jp233vp\e֮]Kbb"7nS]]< //(^JII ׯ_|._LDD撒Bhh(k׮nNB, {^n{z$d$s9ddLfN6ݲ-ٲ%YDJ"$X@Dpd$S}cS".>y>yT6mDOON¨Ν;vIKKCVJHOO'<<8bccxONGUU]\\dݨT*Q ڵK7MHH>NJ-gqF^/mmm[cۑB&''dQQQHII 6l`pp}f`0`ظq# `0(>L X,LLLmشi锕QUUZ`0Hjj*--- =.e4پ}pX W"̷l`0{nhoo' 8cccݻ 1ü]ŠKoHr(**w:8Λ;evvț~ٙ䪿'l6wH+8 ު˗Vy~?uuuX,X~6v'&&hhh  زe=/|=n7>>˗/3224ϓ2 `[Ӄ|/&IpB͆\.GׯR]2[0šȐnH$AGOBRBҾPlBk^^G!)lH" ~ZF eDEEM07M #,,iff&:D!ޣLHeq wFyRDDDD%d>AZQx>wm!H%BRw+E2acii{ZBOB?[mKׂP)GME!t-Gx<͡P(>= qPJgff~I%[IExwGsǥoȟ,o&rg e߭Z WPˌyX=gfqpT*4773<<k[}nnV, w\>Ziv;VZ}Gt:D׳D[[VKxx8&N""""zjlFjÁJ>Q*,..:`0H___&Fww7v5yw8N.\@rrrHHH}>===!Jh4u|={.]hxq\rillw U^9~1V+JR(422W\!++Z6mA__RШV׮]?dzz~***֬+ Yz**SNow^;n'++k@X, q݌cX(;r|UDR!iR)VbCV?r+ tFWW,,,//$''P(evvN˗9x YYYDFFppIUD(ѣ?e߾}LNNNkkpP/prx ^}Uӧiii'$$/ =l6oRTT& .}ttt/K"##h4FgllL(i6lDGG3==-}ZOIHHj244D]]Uc$Hp\tvvb2裏()),DDDDDDD]@ Xܹ@FFLNNyhc2]呾R)>,~aqqR{9}!=gttt1)--%P(d̐v_+/aP(p,,,穧ㄇj|P< }vv+twwjq݄Oqggg줧͛q: ھRTǎ#11sIQRXX(dhhh`˖-TVVyz]_"`x饗0R\\Z`0p̙{[*2>>Ϋ*Իnjjbtt2]FNN?7_Pxf3v H$HR^˗h4477}%{xq\l͡T*d2122B0daay& 2<Kaa!ϋDDDDDDD:xw299QR)UUU|[B*uϱcLjgXg>矿Gx0dddהo`Z G& O<?g^/>.m F!{D"yx v;z~ӧO366&\Ӽ@Ro| jqq1T*.$ XVv??)W\gs~7|>"""ZH$OEE`ݻ>FGGﹺXn:¨⩧bbb!t`YXX`tto|޽p!/ŋYXX@"`2p\?:)))x^牍%//[tLBBeeeP[[!088HTTPPP@VVn#G`0LOON[[?ۍ@VRSS 555 srطo۶mcttzEj5O<'n8pDT*O>$Ŵ`@$+AQ^^N  &&FRSS  oQXX҃^""""""""L7fc||\FGGse233i6~1͘Pktwwo׋T*ehhłlF*|XV&''faadfgg"33YV+pFGGZӇb=ڐdbZIMMe``a&''ȑ#|Cgg'SSSd2r9X,FFFbC|_۷Mbpp׋D"d^2ZZZ! Orr2 p8X\\iL}>d2<HR40L7yEDDDDDDD4>44dB&0 ,..nݺ5:AX,\~Ls=wG^r9  MMMDEEATTd2l6dlBUUlٲ`0H}}=gy TVVRUUd"""_`( '!!RIee%dgg~zL&`NDDϞ={Φ-U*ժp %%%PTj*++q:XVGRQYYNcpp0lܸuPȞWƠ">]C܊P ztt4a)**"66$rssQT`Q(x<\.ATBJ,. Tʾ}(((v3==MNN_XX *RF#_8Ƈ&1CCCS^^Ά `||2\.Jb q88v,333FJPՔRQQAZZ۷ogvvݎJkk+<3RQQAYYl޼EZZZHNN'h4IOO=yy BHZFVDdd$_WP(444011](((BaSՅJ"66{,ߏkID"yEQZw<ʘەmH$ݻLcOEEaaaHz?~/|G.rAph4EDDDDDDDB6ŝv y<fggknv#^owhm Kp WA8fggo:$p8>+6K&QA* [J v?U""""""""K(|N;dA !Jמ-q%cdwGsJVq*GD~?U^C݋:=""""""""""n6'<z At:.+W$񄇇3==Mww0捍XVbccdLLL2Z:;;Jye[a6innJ\.>Jѣ8?(Vfqׇ^'""b;'}ԩS,..b!..1<ǎCףhִ iHMMg1񵵵vǟ]^^VZVL VfqSFFF +5쬐=}"d``@Xnׯ300N쉈w3 az-^/eee\tSN΅ X~ZijNne֮^fɓ'hjjbΝX,:::ٳTUU˛oIBB`^pTTT"66B/K~?/^$-- ^Ç ))$l2裏طoR7=zݻwߏbӉZ_$,, RF Ʊc(--1bffZ-(GCC999\rM61;;K{{P:;;q\Ff@t'Odii*++0\iOMMEcc#ќ9sz{Gp8%N[ݎJ UDDX,ns4RT*DEE100@@ @RR7ٓ!J gddD(kF0b_bbbhF@W( T*z %BFD"~wl6III JɄD"!**JPrAR) M?XV~300;8tj _DDDDDDDdXs`0` 2==(111l66o޼fh)l6UUU}ANN455DQQZ>oߎV744}vrss`00DEEOdd$ׯ_`0p8hmm N|C&F||<͛tKKKlٲ\ ,,Ο?Oll,Q\\LBBuuu_F@7\|3g088hnsE GA"֭[!))w}Lƅ l6sZ[[lT|ux9vUUU7-n/":JJJp8~\.hp8 a[6st:yw(((ˌիWٽ{I:g?YYY:u j<DFF ZMrr`OLLk!ɨ!%%'OFkk+|GDGGFyy9 PH^uJ%&Z&&&ebbٌb… jJ% oT*ܹsӟZMLL Nŋ466܌^bX,lذ'NFx^^/"* OVVzDDDDDDDD܍{ݢ+hsss8Niy:L&_W^#Go٧q>C uwC ydii1ۿ[mojE&!Hdxx \|ܐ766m6, t:̙38N|IIHH&/^d||E:Ğ={07ܹs+DGGS^^܈3ꢸ~$'' ^z{{x<,//yxhhhg}7{\XzD8o}[[NNٳaH$T*|Ivؚ# `ݺuSOwޛnD/--)**;333LOOΝ;h4=z^͛W#===xp8x^lY~=111x^ɡ%{ k\rFJJJB'''~:۶m㩧"//6o|EP'55 '//Ox555ŷ-imm%**IV+gyVIDDDDDDD3 9faa%bcce~~^E/7 W^%++ Ӊ墧1FGGP*T*^/㌌x^&''X,X,1LDEE狀QrssimmeddIZWBAvv62"f3fy),,nZ^/?Y\\`0rn7 r}]Ο?/LLL@ @rr2iii$%%㏓|ѣGIHH'? {'}`@ӭ qqqAZZZٲe |>d2rDB0dbb5kG!իWijjZDDzvEMM 999000ŋDծ Qy'1\zuU·RRR08pV˥Kx~:sssAX)--A(,,DSVV޽{̤ffffP(tuuT*ŋvJfbbIf3,<,D&Q^^k~)qjT*jTUUp8Z<㤤YCVJܧ vG߳2}rrZ" H$Jv#Y^^&--!|>rd(//'++7"H OBrr2lܸr, JAOO߿\餰8(--˙!22e"##)--ET2661 ͡T*lJ.ɈbbccQTz l6xFGG --D6oLII Z,v`cbУabb, 1 $%%`DPTšP(p\$$$|6T*ˆ!55@ll,f~ݾ}ĐMYYIII[t~?sss<Fz= r (++caaD!^'..$*g}\Fh4Rjf) LFlX\\dnnN+$IIIdee111Aff&m6 PT$''I~~>唗SZZFaffD"TXnRRRBqq1YYYL&سg~Y#F.\eY\.EEEbχX}m Uxufףּ>00ɓ'IOOgvvDBvvM2;!XqyyDBee%d,uEDDDDDDD=L&$6 \^_^+xk=>s?hBceZ>lMDDDDDDDD䋃D"rqG@DDD|ٻa$!&qd} \0 M zG#CXp,//z*'6og~pY^^xp:vr|8N+`e˸n|>ߪq|u,X:г~|}ޅd}Ynz<<,555rt:nt7e>qjkkz ~.^H?111,//sy1L$&&"˙/_fzzxҥK8bbb|2XVF#2lUOchhAo{0::h.\ Tfggy|=2޿! #Jb0::ŋQ(:tõkd~~'N|2YYYu~?׳L||<+WׇV%**jkk"11VṖt{ԩS\pRg`:33`3+jjjbP]]J?f!Hz*n8N7 |fjkkw$ իWH$z:::hhh +UJJ }}} >44˗2穩jJyy&&&HKKe;v;###tyz\|T*0&rV+C#JSS B(k28qħDDD|.5DR »}7///S[[NCPFcc#jZ uuubbb|466ֆZFR>CJ^^gĉ\t[>ƕ+Wr~:uuu jimmqqq)"QQQ477 ckk+Ǖ+W0 EVNww7JK.quz{{jf^)"r+&gx^8y$MMMHR^JUU՚m?i9s6vuGYYf@ @uu5:JijjbΝ088լ_Q}] ={eݺu,..{QZZ` ,,_(JΟ?OJJ 111LLLhD*4۷`0o~ٳgvYZZBRV+׿&--A=== [ZZP M( %0111 /Z!zS:Q* 2;;Kww7CCChZ^}U),,{rEfffd2$>}m۶!]V311A[[EEE   X,A$ mmmx^zr477ߏZfllLbbbXZZ r9gΜ!<<\\.'66vC*y<Φ͛7MGG* R |>bbb&v-Yi7551>>Ζ-[Yr92t[\z$djjXz* B`,,,,..}9.]ľ}hkkQ'::Lcc#kט%>>LW\!++ DBgg'"**/dBVۋJbqq={088Hcc#8n7ΝRvt::;;ioo'22@ KիlݺU\0f HRN>ٳgIOOG*R__/i('<׿ׯVٳlڴ{Bf3dggs 6nӧpSO=bJp{ ihh GSS hZF#/ d477ۋ_D&..N8`[ZZQn7~ **z{{@,-- %HCyBϟ?9r7rIRSSYZZڵk_8Ο?OBB`OLL`X(((.j5˼ ai4ڵkd pĻK\\111v^~e裏7ߤ ũSdדK/F̙3dggsammm nBf烃/OLL mmm j|444044$<0tuu133Faz=ׯ3::<111Us%H'? r^z%t:O&55^{ ^ŋ'O^ .B(ziyq8199בdj:;;imm3!|>---tvv 3g̤ 60<ߪKR$ Ng?7ofnnN0/^Hbb"ӧO˗`0/y^ZZZ= dΝH$0LTUos***=\.Iqqq,// S˅BAxUJ sN' ͡~Gll,h4^z%RRRhhhn/?CCC/R\\^'>>^{('%%vo[rrrx'..Kdd$u,"r߹3_EEEl޼ [jb0ּ#)))ٳ'O5R)rֆ'!! INN&99:;;H$lٲF `rr*/<^xFFFP* jՑkO_|񰴴(dggFxx8}PƮk>wBÇ#** \(JRSS'==N:Łl|| 66?ZPzrR)$''377Ǜoɞ={x7طo-""B"=zM6q/N'|Ǚ"N7x^u3Ο?0SRRr~HR /""BT*%** Fdd$r0 RT*EPlfyy7x??gyyf~?тZV300@SS[lN.^d'n~~022¯~+qvAxx8 ~<ٳg=JoܹsH$v!$ KBFWh  s߱cmmmb6wҥKՑ&vٝ~;222b``C ϒcX0LhZ P(,-- sVؾ};?яhllDT|g0>>o6ٹs!!![oeeeɓ uFׯI}ZZZ~ѣGGP044DBBQSS??sYH$HRKtt4===l޼LFoo/o}[G?Unꘘf188` ;;[hdfQWWΝ;OO8z(111:⣏>z{?[T,/2?0x),,W^j8~4WTϳ$ׯ\tuuٹs'W^ʕ+z'55UP q5yW?NTTǎcyy~mlaʵ7(#G<)lBSS۶mR__ϵkאJ>0+ǙZ, 22Rx~Z[oWUO $ >Z@R&'': dLq{Y#{ejjC}!n6šCΦJ|K+%F*233#(` OO<^ѣGɢٶmfj cccĉ~|In7)))?9477ٹ; 8pRxDZl\.$ [zX~?ܹT$tuuh&77ׯ /cBҪ o`Z롱h~i._ٳg+..ÆD")Oxx8%%%<$''cQXXH?v~? ccϳ>KDD Ʊ]vk.㙘< O}v4 <3100@CC6 '!n7- ب׾5v;׮]CSOQ^^PŜZ, =~\"^ILL Ťǎ;c||Պljƍ9pFHoo/aʹقgr155,tuuzy稬$,, N'\.`ayyyac=Mee%[n MDY, Eh _Wزe aaaҧZQL&U^ҒP !::\Orr2zT&??:--bΦTJKK , 333111ߦǑH$t:q\h4LKK __3gaٳ-[k.=*wCzz:< ,,,ɓ'fӦM$&&RUUbݎ#,,0ͫ,CW=$ $''}Mx?ϳaT*ժu #9|02YFFFOOO^{qp\<qqTVVc0%==\gH7FIDAT UUU޽1l69V+<#r9@iX,0<<ݻٽ{7J,z=]]]a^^a4B;ʎ9Vc޽߿R||癟<|wzzz{{X,hZQTl۶Mr5!0wu`0/K0 Ga$ xj~z l6f3ttthȑ#RPP ۆ~:BfT*DDDi&ns:DZZŵkLKK ?^) [*"ɐJ233iooܹsXVS*YYY"""O9{*ބ_פ%<v 'r\\EFFRVVVTd2aIn)_wFsԄf#,,LBNGqq1۷o_Q%<<@ |  ##~ʅ %brrOLFee%:"oߎVe``qaC+WT*1aYHMZp}QQZSVVvZ9tuuGxx8:Lӧimmj۷o|+A͑#GP*H$˗ YիdddV̠RVERQ]]Mkk+tww#lv?3HMM%11k׮xjfݺut:֭[q,.. v;`P35xOʿ,T*N紷/`Z %%zn7*NxL<33#Uz@:u ,477p8Y J 55Ǐseʨ#==իWjB"%%%oNvv6NܹsP^^N\\iii۷OP$YYYsIڈ%lذ%ZZZjHRHLLrpu?NLL ,--cZ)++h4r1\|477sYIKK###CT*l6GNN;wיz{{Wл NGnn.vz.\jnI-.. x(++CcZ#33‘#Gp\䐑!xo뙜UQΞ=d"==7rQHHH ,,bcc"11]va4IOOGpڵU  ߿ꝑ|>qݜ>}6nNBUU B8 0{( %11 nʦMc```b4$azzZhPQ]]MLLM7V>N'uuu$&& \\r+WT*XX3n[KKKRxy{dd$8p{Zflٲ&Im0'_׌#ˉE`Ϟ=_%W^ezz@ @UU Xz=`Mkk+W\att~nED|f .z?O>{ +cm6$"##IJJmoXlFll,Id"%%JEtt I$''399\.GVDYY~zF.O  j51ٳgx^Ѝ"JJJ(..p(JtXVߏhd2aٳg¼^h4 1yz^85v?Nrr2@ @PYYINNqܾ};`F=;uT*YZZ^|r !),,`4B*b0LsN~?d2yAJ,,,+x4=h)""B\kv` 򶐼7..NhRRRdaaMjj*F$Z- ǣ0rdee HNNnJKK),,Պ%##C|i4YnvArr1tDEE!HXnB ( ?8_b0zce Nchh\RSSbrr2ۇnDnn.HILLDVLaa!$''S^^.111ƒ@tt4Zzz\.Yz=^uQTTDJJ#::)nJ~~p'F۷Hө `ł*$d#n:!Gh}&$$RDL&~?+''Gܾ} -MII!55bOFFaaa7=ccbb`0HJJBV@\\0Z$t: BΒeJKKO_LL .K?Bʞz Hjj*f͛7STTlfzz׳~Usjj*III$%%piFFFHMM ILL Ja>^8HLL$--UINN&++lm0 $%%p8lh4{+"r71y]"0;;墨6~ꠇb:賳]}~~cǎ1;;KAAO<ănmsOMM=:fyUf൤ׯjO1yN>-6l C'렇.]TwoJw/0L={`0\.gΝCmm-|>o_ ;qI1$Pf??zMR233믿ƍٺumK.޽{/OO{lˑ#Gp:gVY"1NDBee%wj?fzz8 <[yrssrI, 999l۶3i###:u ݻYn=C0w_A""&IpB͆\.&!niN',//sux% sssDDDVơd~_\.ɾgffjXk 333ޓ tx-t;d~_H%8NnM`ÁDV 6P Pտ *^>a& pCr'%B5R'z84=CB-߇Q`͆B*/~EqΆf oG"p>dq.u(EQZ_ľsNv_11;;O3o> Mb$)=Ta?u/{ xwSj/&|q\_rCY5C/~<ϗ\H `yy'k}|r=[WFe/"""""""V|f.^,\r&ZʌWfq7L;w(..\.̥KX\\$119N:%Hm6/^Ht:mmm\xQZ7_gΜAr8~8~ٳBݐdSN#d'!(0<<癘 !!\N__Ν2;wwwsEl6D,OOt7$::CQTTwNJ%ZZ[[]S@(ʸǏjedddzzzkM(ZI~?(JvNZ4 ===By[hooGR1??OKK bҭ`ey*g2>ӻ 22wBT*x2UwXXXիT*o7$--S9?X,| 222:u^xua8~86l )) _BDA~`Z)))h4&$h;{,'sαgf3`&Q*KF/H~~>NJ}@8ۙBx6:::(((͛73::J]]jzQ,YڧRٳg'""WaÆ54ill@MM o6;w̙3\.׼vZfQ ]]]P(DR177P/nĵ K__;$nA@ww7q5!??t:G[[MMMx5Z Qj7`zz|hoo7 11ǥK!!!qⷿP.t599Imm===& d2~r2]W\bۉĿۿhHLL$<|D믿NGG/2? a, :~{rI QQQzAEruNf~|OF.htEGGZnA|v9|0IIIl۶`0H a8}4 |_8NyWyWj@0vC%M2>>Noo/?y9~P nxWz x $%%G7e&&&&~ ?$,,OOhiiEbbb4J_ΩSh46_4{9o/~ d2dgg3110SSS P(HAAz355'`ݺuLNNb4yꩧdbb,n݊ZfyylcÆ TWWSTTDVVFB@ 33 _"ɜ8qm۶QSSCxx8qNff&l޼͛7@||<{L ,""""""""rϴ,~ry4 r9|0,ɓ'~GllS oFcc#b۩n\fv vufffصkBqjjjr 111LL&z*twwsu!ORFFJ}!H2L.LLLPRRBٳBL&#""`0㹩_я~h䣏>̙3W\ajjJ8$77^͛ȑ#?"~ӟ{{2wKYYW^СCw`DR)555O4 v@ @}}=CCCtwwԴ} ɀ ihhfZ-444ܔ!2::Z/"""hhhf }YxD.300@GGDEE!HA8epp?BALLp%Ʀߚ&zЀN#>>^PzTTHDDGdf3|.Us!P(\v ZMqq1: 69}4?immezz@ kׄd^4===Ν;h4N I^^.]ŋLLL&ILN)"""""""OA󑜜L0$66ZݽUM߻ee T*n:+ckL&cnn\A~뉎F&a4Zt:bccR~~gzzh|Ifii۷a;vFVii)( rrrϧ|FLFtt4yyy$$$t:ٿ?yyy177Gee%֭)ID"AVͺuHLLDѐLAAؼy3PPP@jj* DGGDff&6m"++K04+cГQ*DEEq7>tZMrr2v]THKKd2j\\._ÂP8BArr2z^Hp8HIIIVVDGG W*v"// HII!;;TIJJ")) N` Jvv6~דKff&vrss#661Bn1`9xꩧ+i&|>yyyFRR*`(&77"##)..h4t:ٳg$%%Gll,)))deeaΦPsO||>Vmh4Fjj=ˤYFFFξ777Wp-+)ׯ_'""⮪L&&66VQWW0iii,,,p)Z[[$G""""""""Z|>pevܹ+ Prnٲem_gez=NJ {la9q ռTTTĩSرc|>^x9< =ng$%%!ˉtRSS?套^ٳJTTX,JKKQ*Jyy9/yyy;w@||Mz0dqqׯ399Ncyyx\Bss3===qu6mD__|2BکS@Q[[ƍhM]]F._Çٱc.\022<&5)fQո\.N'~W2>>Nxx8555 b0V+CCCHR\BLL ݨjillDVt !Q b0tuuQ[[Cp@ z= `6Q*(j<^ߏ\.DGGr 22V8կ~%R[['&&zzzJt:q\n$d0djjF6o/b֭+,,,EBBš+yYXXc3͛7SYY)tGGGu{n;E*}vP(DFF͛AصkDEENyy9قqUUUh41.|zz:BXXXܹsL&J%8NoߎR… dff @yy97oU*EEE,--o>d߿Lz{{o{ww7/ 3==͕+WFbƪÇT*9tfX:::x饗x~~zx fff_K$ywh4LMM j`x#9~[_ aaa\z6hhhc||̑#G --Z-{9|0*099H$-/DOO׮]CRQUUEZZ/D^^۶mh4 XV4 >***d\t3e2  tBΝ;)..o߾9ۑH$T*vu똝]vJ,[laÆ 7IH$\zm۶G޽P(|2111ccc΢Rz$&&aY\\$..l4 iiiuV!<$//Oyٰa/_JZ~R)TUUQYYIJJ 111䰴^gݨT*y!66шh$!!A8H=s 333|;ߡfb wK^^.\x#""""""""T;dÅ|Z4_sE$ 8.^Hoo/ $)@SS.'O$<< `0ȿ܌ejj FMM ݴ??!JrI{{;W^bOT*%,, ӧIHHB8\tZ[[9vddd7bucccIMM%::|+h4d2R~?H '++ NGRRkL&JKKoWΞ=ٳgPPP0.\bsrrGRQ^^NѣSUUO~vyOnYnuuu[dgg`$8s Zf޽fL 555k֖.'++'NpܹJ"a0bǎKAA/[Ro~B& xp8ihz{9^ K I~'HR8@0@Tdz*~ |ۚP{賟]+~<u+""""""""H$TTTzC.t:o `0\.'&&6>$qY-@GF=(nYIyx% UUU볜_,=o<0/SEbii݌5󱰰fvlO'{Chnf>n7""""""""w2!g)do)qw\LLL!#^d I?&t>ZZZZ6>2nV JJJZGGiii QZZ*̫׋Q&%**{~ x{2v~F#Vfggo+TTT$zoP%O2}a0@ @{{;iiit[r߈o~np݄ B!IddM) h% u/-- Dddu +> 2::JDD2P{ݮ[}OfFaoWIyu{?""""""""wK(S=b!,,찥%ReqGP7JR \@Exx8r|j܋|9!"##1LNNRQQ!aaa[nw5>xWyG.#έgRzTUU *곷S @ jr@s `ii "dkz S^^fCT _Xr"έ' c߾}ڵ ஫d}]&}v|>~ _4DDDDDDDDDDDDDu$$$7_8n%U1n.byy׋`~~A=tY""""""""""""B(`p,nMI7]sU5Qp<辊|iQ*7PɃJ/""""""""""""""roUxȽC 2y tH6%tEXtdate:create2019-01-17T12:49:42-05:00:b%tEXtdate:modify2019-01-17T12:49:42-05:00K?TIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-plot-cpu-1.png000066400000000000000000000247121477354127100273330ustar00rootroot00000000000000PNG  IHDRqsBIT|d IDATxyxTLBBH D"*YԲXBYiP[T*P~j] KQA ժ(ECId|H2yg{>+W͜3|Δ<9g.2}42,L>С-Z؏ +]èqvޭ]v)77OsI߆gi΀ԧO!PڵK=hƍ:r-I[V޽{l@VXX(nnAEIOC.$qy(+U0j,˥k3~KRbbTJaaauƋ$KRFx:qd@v$&Fum5Uь 8EkWP7 R̨P1)o/_ZBOomܧIT҆!AK^w^6%x$e+uKrHRdx$3y:<''G|sJ1,8N)3I;ʌﭵJPW|r?ѣڷo$kQ+חi[n_|}s%%%)>>^tq8p@;^/\Gj]v/yAiiiS˖Wi< }M҉Eo\.5i.]h񊌌$:>-a֮]^nԩ |~Q@w5B.K\.YǥӧƂ ʵSNcǎ۷Z h9r4i"׫SNyS,8ur jeO'iӦJNN֑#G?{eV=zTM4QÆ ^kV)((ȿNvvUXXhӦMjѢBB x}< EEE)?o<1B| ͛7ktv'.3rGo{C'NTFkt=5jdx䵏sN^? GG5zrIKY?՛7oeϘ|2 ԦM-_\FV||ƍ/˥(?~\򊒒ڨað2m( :*z#jժUںu$e˖ҥK'22W^={Zls)$$D9~%Gϕf^ t! M:Mt=ZO|>_uv-mYYv%`nsN3_O|\㩰Ȣӛ>}ZW Ν;w^hСo~0eggќG8w $I={TBB֬Y5k(44T@QQQUtuC5+?:wl-YDԮ]2mBx.~niˮ$3= &*::Z|j֬ƍ%KK&T|]<): Ԍ'f<s=ԠAy<=O9sF 'ȑ#_4kɖRݺH* #4ֆ hϵ}v\R֭S׮]5y$NJq\N7C|%¸{%S/iĻǏkr4aD+5u^ziBB(<}ZvP>W7ok_^A|;vr)4K,$$DgH*:;9s+u̙,u|㕙K(11QRѩ\wu:vXNH]-Sq?ԬY3=Z~֯_/˥޽{+.s_t;55UǎejѢEz$s裏k׮:#ѪUiE?нWzUX.mѲe$I۷+;N|92Җ-%9ںuZnƍ?^zi:w-[(99j9rM>կdKݺ7>׀~},4N>r ٳyQӦMSl?U^SBBBBTPٳ:}7VDDDdݺwJONG+,,Taxb!8sT.ۭ3gN]g^W (<\.NA͕=*Җ] %av`'ʯ@HJJRZZVPjP'MOf= 4PӦP4kL9ˏ\AṾGy rgO@]vթS'm۶Me~k>*ӃPԩvɬƍGڸqcu"<@hР+~$n`،z8r*3s9`0Gx#<s9`0Gx#<swIwVNNN*PI999ѣGiӦ* PqR?<( {J{=fNw͛7kرj۶7o믿^f҉'$IFRLLbbbtUWO>z7$I_}bbbfFFF/Vk^WGVǎUPPP-cꒀ-[jv~zzs233{nG?ҽޫݻwr(rJܹScǎUhhhuSjȑZ`v鷿F_r)88X5< ۭm۶y?|n&]}jӦ(_`J8z={4mڴ2=_TϞ=kV?Ν;W1uI“ ^v㯿<ڷo_}M1cƔ{s)jڲe>s=CŎzq׊+4c ٳGyyyJOOٳꫯ^.Kcƌ?[*??_;v~;u]jР b >}Z.Kqqq VPP$飏> .6*lٳ*,,TNvu)-Yꢀz뭷tA 4HmڴQjj^n2m߮[W_}RSSկ_?=uVZ=z(11QC~3 0@ŋW8ɓ'+%%\IJHHМ9s4l0 8P&M+5qM>կ*Té}nr=gÆ ޽{{+I?w$)**J6l(sT Ԯ]PKs9`0Gx#<s9`0Wdzq@@-ӳg ?lD1\U#{@vJ=S-s9\Dݲ\ktDum@ eT=Mh0FGK]m6jJ111F#PYѣձcGsӦM6l=C̔$qr\r\P.]rJIÇre˖bLOOҮ]JoZZ~aÆJJJ… *VórJܹScǎUhhhwQ޽ժU+:qOAAAz뭷M2EG_ƌ1chǎoVVz'uk8,\ 8z={4m4O2E?SOcǎPrr͛qs\ VTTO.ۭ͛7Wx^̙(q;s"<ǎ?Δ)SԬY*Þ={'^v+VQ*[K. \=u oN"<ڸq̙j휿Ӳ饗ԼysEEE[nwVV%7n oN"<7o#v$)..Ntȑ+;j(mٲEֱc_BԠAI)s-XTTΜ9SӧO+**|"<4~xuM>ƌc:ۑ۫m۶Zte_x)<\۷oajUx.}C;*""Cq׻~n[7o~Gx@;vTf4c EGGO> ajEx_qv҉'ԥKmT+ 7hĈzյk׀lV+ ;vLW~?"<7;xz[oUO?tv@mPkSogGwy̙|&Y TZrC(͞=[۶mӑ#G3h֬YzqXu!q伺ow]/̙3yfׯBU߾}kNڽ{wFb p jڴWz@u37{w5aZJ Õ?eggwոqJm.b 4mTmڴ=ܣ'OG)q5A .rPsԊS-Z]7w}JLLÇxb\˅7KIIQ~r֭\.V^+V &f#|>=j۶ڵk'|RO<&MCL՚y~C ѐ!Cʼ>PD/ "WhJUOu@Ux 9`0Wju*ƌ9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0GxL{f uIDAT#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<Wvk׮ 8# OϞ=5Zs9`Ro+;;['O xj&M(::ZIIIk\YÓ.˥n)éҴo>]s5]kMOյkW9So>v,^r&TxsI9ȱ BeSk޽{~^puVlj裏Cwq6mƍoq}:t}?ocj߾ϟ^zC4iΝ;_'##CFR֭լY3_N8:pFVZꫯ<f<0Q-yu7kҥ^|K!עEhܹ>|?_zjMLӯk9vV^qM0A+VcqW)))zxٳQ͕KBpG9rZղe4q ?IffZhQ:W]u p5h@SNDFFjʔ)rG 67߬O?TS4#*,,ըQ#gϞЛo)I5kԸqc͚5K%IxP̯,]TQQQ%IFRaaV\Yl͛_#GʼBs^{5hӐ!Cq8urrr_R]vUաCeggĉubccݰaCH<$]*33S]tL8Q!!!LT'iNvv{<-ZH&L?o߾b޷o r˯KN$sJNN֪Un:AUݺ,ɭުgP6m.yܹsk.[NM6$%&&]/֭~y^ſjJ-[͛/;2 PZ6lЁn:og}-[/_\6mRaa^x8p@C /߶m-[&׫?X˗/رcKFqw駟[o &T4+PZwun >\k֬QffN>իWkԨQrGNRVԤI9%K'Svmr\1cxqFnSAA}QeeeСC/@yUT<_-խ[7?^ziѢEu^͘1C ZpV\8 _jݺ&N[K¹뮻tau]۷5qZjƌ3g*%%E]ts=[S]FFnF 8Pǎ 7|Sԩ5sLy<k͚5PnԲeK 6L;v(wxL_>OLL 瞻+==cኋĉ>*iӦiڴi]޺uk[:u A[>sb'%%iŊ%n^`J^ ˳UV)''GÇsU_ԧcE~i-뾓SO)$$P}:VVY{.ʵݻwWb4Fxjf_J߷رS7L땑q?}rsF>c_?NwnU~}#{|4z\.kz嗕FEWjkfJ}߶mnWJJJ]3IJJСCK/a*ltUW[{Ue#zKK4z5jHtAa*mqoN9SVOJ*99YG$\_~i-_\7n$hB]t)R';q]^W={Ԍ3ԢE +22RO1?p G?g^{nRuIҢE 5by<%|-{eQXX(]`vUXXXm:x|}#s_KGyf(swRRRSssspBIRv*c;9Zv:4v8%$$(;;[>OM6cpIτ*ßg=ZČz."""x7s),,Leܹs5lذ.Zr8>lB{ю;~ں]vJ* #%&6Pz;ڸKm޼Y˖-իյkWM8SS(.ܩV ??.g߯pl7??_~[ݪD߿_ (˥c)))IFݢ_TjǼ^:+){q| XQF;ciZv:vNV }}%-ӿ?}oÇ_~Fn[7t|>֯_+V/wg%믿RTT=JvUE`ڱ#KRtM~Xs|SS}9 .PIII֢E ,԰,>^xWӏU@E|w6m'|RiiiJKKW\&M0O|G}5|=J9yԵkWhW5o|.R?z*)xWF۶iŒU|>M~O%Y}kÆmܸQ[R ~ڟW/8_\p6lؠJ5u~ou(_K]ݧw@u6Ç@͛7WLLJJ YstQsEERll\X.Gvbvuȡ^H4?Jh޼ ]/C X8ղS0<,sI_Xm'P9[hݺujҤq* OLt=}:y<5DDDq5P4mT ;ʷFṤ{wyU sgOvsڴi +?F4*HHHPΝef=MkРw5k{(! ""{U࣏>o70Wnrq=@p8s9`0Gx#<s9`0Gx#<s9~ٻm۶)//JωSjjj-8Iyyy޽{vZ p#Lڵ￯ &h۶m&BA_^rڶmf͚K.߯HD%&&sQ^K;%&&/,ͬ,%&&*### {ァEZbdn׻۔m۶闿ƏW|,u]6l̙TĨ]v{5|pz.K_NnmڴuWsU6mԷo_|>9s^P=ԲeK{T\\1$`TVVFu.뤏kx7P_~a|͊PII.]ÇrI& WXX$?_@V=zT%%%ܹn: m<@( hx*[ڵk6mhԨQzk+zH7pnV{5jG}Կս{w%''koZn:-X U%-[ԃ>Ao߾0a5u '8 ]s5UzNzz.Zpq$iǏLHR||ӫCx$k.C*>s9`0Gx#<s9`0GxYfMѣG[_ַoߚn j⾸VZUs`0Gx L\ E綨s Otn u޽JY `B:׮]AI&Vtw+;;[t7rr)66V]tѲe$I{҆ m333S.K[np֭ӥ^z)%%EͫjYϲe˴er-;+ԪU+}:px 魷7i$y<}9rFQuUWi;wsu*Չ۷O_ceI&iӦ>oF7nI\>tRy<uر޸qt/u]7n6`ቋӚ5k*;;;(k8-Z_|Q͚5S||&OUnݪ.7h@999&Lu"<5krrrt}v$I&{vÇkÆ ڳgۧI)~qqqNjב#G=vaW Q'#IcƌQnOkȑIj߾ڶmEtןbbb3c%%%)66VTxxZn}m_xڸq^u /AUgvl9)SOiѢEmٲEo4m4-^w\;vfΜu֩@_~>5ϐ!Cv5c kzW5a„@"`΄Gzꥉ'C2_>H;vW\ j*))Q+G}T Ұa԰aC 8P\sUx\Ro6lo]O<񄮽@`*sxO=TP߽{w.7Oh͜9S3gά~/"~#!^m!;!u3`0Gx#<ܻ̅Zҿ ~60Lx#<s!wqXST9QڡFy҈BHHmp H8k>uC;vꫯֻᆱ۷kРAΆ,4;w{ァTt'nuV8p@]t 6Ku69ɮ0~ݻ5gEGG?~l@Pk<ϳbm޼Y=zDNS`oٚ={vB]H'/??_7t$S6ٰaRh]$b\BDHK3*\I?G?:eZnyq>:̱)5khO |+ֻZ'gRsԹ>}uzxzMbz]zRSSՖr)4[`Ά'Ra8+Vaaqh_@_<]{{qo.&)7!Ά-TzبD)\ b]MP‚5L'x巎sbWkT҇B3uLo'ntmڴIZRbbшT~;jĈԩLܹSW^ye}Ν;vEu:<˖-Ӗ-[t-(**kƌڴiݫzJ^{@`.O8?&A׫3f(::ZSL17+SvCcAM>]ׯW>}߆ w?kN111ڶm[:1ٷo/f;&MRӦMk} pC.L7Vrrbcc5f̘o:1㉋Ӛ5kjرjذl7[|ߞ={j4_ջᆱ͛7A5,ubYf)''GwlG*C>|6lؠ={h߾}/7kܸڴinM}WBA$3FݺuO?#Gvd̬NjI?j9)SO馛nRllnv%''kϞ=Z`:tpk.ЯCر233O{C7|Sn[ݺuҊ+trx$W^8q:t`:)|>s=j۶ڵksӄ uh:3)SOu߀4`JOܞ owm!s~Iԩk< 9`0rj:P1`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9S IDAT`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s9`0Gx#<s5U1gGZs9`Fogff*77W xBVFSk^Ó)˥+2 m֭uyt9 P9>U׮]8YѵkWT5N3q@N8) P95s6~ pz\:l r* pj5fEjٲel&Ux<֭[ Zx̙(-X)**ٳեK%$$e˖߿V\T*(xы/ ^jРAZpf̘ mڴI&MҼy=<eƓ]vi޼yϵqr/2u]u嗫gϞ裏n :TGV^tEg9Wy[nڵK ʌW^_ոqc5h@7pOղeK%%%wOXbڷoٳggϞر&Lb:YYY>|ZnMꪫҡC8vܩaÆUV:suw*//L%C͜9SWX'>?O͞=[V:gСڽ{wO w:s~[={T6m*<)))Ѹqe}4l0=zԿ޷~}GZv֮]ŋq_~jѢ6mڤݻwk̙ ѣGշo_j˖-/}vO"<0a}iŊ3fرctWR&M8z:^s嗫GrG͚5ӨQhѢr(66VÆ _KzZxƍW5VO9眣(&&F뮻xyf:qqq4iQzt5?ΈJJJ4{lկ__aaaѣbccoJ~EGGA/pϢEnA4|phٲek֬ ޻wonӫ<@ TK&Mwߝr<P׮]վ}{uQ:p {;^z˓$ڵK))) ;aۻvRvvt7n"##w.W+^iNnnRSS{<͟?_cǎ?}r޾}jc'[~9p I\pRSS|r^ZFRDDD|kru鷿ԦMr4sLmݺUWVƍ%I|'=ߺukرC^Wnw/ZR-~TVzzvܩիW? mذ}ɒ%ZvJJJkΝ0`Mxby^}Zdn Qzz'[oiر: ԩ7߬.Lʕ+ÇkŊ>|ѡCԪU+5jHh…:թPc_\.My<YFyyyUTTx@999|ڽ{w TUOI;|_ݺuSRRO>ٳϟ_w6mZlyiٲek>hРA֭[kܸq{uuUs7kϞ=袋Ծ}ZNe_ۭ˗kȑ>}:t.]gѭ*)}.++K_~}bћo,uYɚ>}<bbbrJeee[njѢ ?2Q+\osrr +22R=$<t6+TS.衇m۶`4-g<ωΦcET;<|r\|SHr|JLLp^r}رYˠ|>l٢ 5*i۶222n::t(c IJHHP۶m+\]i׮]q5N_`0Gx#<s9`.\rssU~}97p͕ӌ'=]u@lJKK$$i)6'&yMrIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-plot-cpu-result.png000066400000000000000000007463651477354127100305300ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME CQIDATxwx}lb{'@`T$Zc˱;vMO{{ؾQ,۲$U)REb'X+bERrHI<+3gΜsffH;v<"   bL@ @&Yyۤ٨AAAwt:T IԹy{4T U}3 ,kWTAAAxJ$ T{ Z35E<1Vi\(:ς   fHHWϷ $$'4PfVdnZBT$6hm  -TdYO79-.IePI3s˕=i$!I> Kg$uwOM!sW/2z;$e7JmQ>y-7[< mJ:FQdT$w4WURIeYY^L&C"@#2Dj^O15|:;: ;y! ߤiΞ EB.>H͞#nT~?fÆ &ff9{FC[[hlٌF P1ΞcӦhZTUEUU$Ib||-@UU'觵j2t~l;>> D"妲"?_&KC}]S4.46  O׏bx>Bz=T)4 2|~j>>_{R#{9dbɒ%#U͐L&q=8N24ǎ"9ADU]$IDQB$QXXV}GJB,]ځ((ӧI$E4 HVK:عi?+NʝV#kcq D#!:A7C$BEybӦM>FFF0 HOD" . E033(&FG?+xX,B'O2<R4h4n7t:F#ǎu~KB!Z-DQ, `0^AQ4TTTN O`X2<<̳>ˮ]hnn__juTVV2>>1==M]]`@ !H288D(l6(2suG$ #-:0?A:;sYn7կ~""~_0;;K{ҹ $ 33ʹO$!jjlBFFFh4o>篈{^jHRn`n ,X0xEj2 x Y/ OY:$sp?/z9vDԩTTTjyꩧx䑇;X~=7 Ug?÷- LNNR__(iii.F8}4Ng1VeM\nI$|ȑ#LMMBqq1AU_܍!~W_}'NFq8twpadYA ]]_|֬YMss3dhh; u]q뭷pQ|#ꫯTn/Boo/mmm166FCC:tB;uuunqQ@AxK2X,N~@zF#Z*)**BAp$KL4ٌfo߫TVVh90 twaڵ455kF#Hә DxUW]$~;uuu8q{riF#g1==hxfbX7#< 3 Ha J `|>z=G}}=O'͇>t6 UډD ]|5krqevZ[[yeT*E,:>`;xgep8/eϞ;ټyL+:777sY>inn;kerr˗GGbe_}U}Y׾JeeO>kRx'N2;;K<ٳՒN "I{ev>OCCC~D<GUmV|G|G|Ml_}4ghhǻ8s4nx1jjjjvffIRTVVbZX,lذP(DA Î$IQXh޽gYz5ivɊٱcz (Š+X^vڅ$z=^x!555l6^}U֮]f(GU3NZ-6t:Cmm-/￟zjj$3ظq,O2::Ʋe9t0gΜc)###zEgǍnh4V' s'uS$vUoL&fzzh4h`0N^Nh4^/N?c&G$4:6^8&^(}UUDsffYL4h4|K_d/ݧRiVEfMAx[T5l;\ylݺUUYv-KJo`ɒVhkkCQJJJ蠨%m\224P]]C[ےCԂ,k׮[od2RWWGss3tvvЀ``ʕ_FQd.;n'JS^^AA Nf:FK.f|2"[XrDr-_IG2JKKXrZ[[Y*D"jkkihhK;(,B(aŊz-x^2 ]w[lVGGRV^M:ᰳf:;'d 455R[[h tAUUjjkkio_JqRF#+WdÆlٲelذY0-tv.`p8YJ2M6f0477q:;;A7P^^ /d˖-4N/uAE4h4ZdYZX NG0d*x﹏,$ d2szNO$FQdNyVUf 8&Y>W:z숚VShuZ;>w¡(utA'Ff.{:wxR)TU]udy-#f:ΧJP%\:ȲL*B$EC&M;NrTVV=/366F]][z5]I{gR^^<+$   /+ eg|'NZ$ G<! SE'D<`0ca6ٳguuut:Eo*dY8qi|>N3ZV w殮%:$ID"~a}Q}Y)--p[:FrxY"7ZI<}v˱X,HwMmm-v}sAAAw]A$ ߏf_"zSN/ng׮]i Z[[/xE]$Y~=۶mCevIaa!$199?N:f߿GGG1^z%N:E(wn6ms=0uuutvv"In]vJشiK.`Y% (B__[ne޽8qƍ7ވ,$ ~_䯲_y֊a   R*2Oĉ0>> yEl6O}t;v_ P"-[M7đ#G茶\.7x#EEE >%IGyKXVz}YN'WfӦM`XhiiA^$``019rP(G>K/Doo/EQftt%KPRRrʐeO~SSS<455188Qt:Moo/W;vƷ    ytUUiiic{3 b1v;6lxÅ(W\?a-GQdYFI$H͛1La0TUv>O} ^O&!c6lͲ,c2[lPZZJ" F蠾>BDѠjb1q\AA]` 0X,V+voL&F񢁭v*++q:hZv;zݎᠤGye˖QYYX nÕPU***(,,DQL&6͛7Ϛ5k'LOWw8 vt:ͪUBu]466rWb6baٲe8^/gΜ!Nt:/PQQAii)%%%SWWǵ^pv;ZT*œO>޽{ٲe.  .&|ETT*` LWYh4B!f^хqdYFh4$It:dh4]$h4Io~. =u^DH$l6dY&(((h4e䮚bZW0f9w/DUUbXczUU XVRdqaX   N:oC/8Υ^^8[Iz+og+s?wj[$I$I:IJe0bx   »vEd.{~5k   »&]<   RAAAA< AAAA~S"@AAAˀAAA2 tAAAA h.uG6jAAA޻.=399FsYe뿝(_l   . Kd;e%I GUUU=,/_ns+2Lf:] iy-t:oAAAEAw222B*$!2Nb``YFD"@vaPpsI(h44 ^A0ZxM ib&H$^G$~?ps=ѣGihh@ey~?h4TUDt:n'裏rq^~e,Y8?qݬ^nvgɒ%088H*/_UU^/ 033C&aݔ*CCCa/OOݻ'Nܹ]va2Xb7n??0d2/o|zցV)NG0qOyz}t:/   \.:=k.|>\s ]]]|eÆ ۷h4,d[qFz{{+^xD"ѣb16o̦MXv-[sQWWGss3@>Xtn^|En&z=:.E>JOڊV% b >DN*ʏX(ɠسg/ ' RQQh{ٳ(²exyD" ZH률^QVw1<^AAzn6/ގNc||i,K~:N^GpjO"p`Zٴi6mBQF#L`0yT*Ž˙3gji~?PX,wUU BBtT#Gp1;F:"Ȣ4~?L\.|fŊjjjjTTTPXXȉ'e9{У(>,L!ꘙaΝaV+P'Nձ{nFFF|,]m۶f, ^{-o=woz=~ ?wsAAA.?}]Z.0<_@p- &qeB!8KbW/7L%HF/u6AAA&}Hܹt= B\^1vs[ /WTAwtUU BDll6RPd2g^bj `GeF#H$B$yj=P_F&! cel61ojz P<ĮO\OYi,ndC: PUFCII[ovvp8|I߬hZDQ(*V5[ID0$ d2p8) ;$IDQRHzDQ8L&l6STTU$|>nEQ(++ 8rfgg2^/EEE;vBѠjpzYyY~0҆4\C$a1?gM+ޙvn%ITp8Lqq%=0UUU KKMUUZ{UpBl6v̝8d2"@A!\<Ga6ߑ(V:d^$\.H2L&;f<vSZZbyG_r ׍hwtSSS(f{G+IpݤR)t:SBb;LڐF53wI9W3(r)B*փF0e7W`6x{9V+\!2^-i$IzKWHNd`X:dp8eIHӋW%_tzQj4|/$EQt)Ib]  7]t<([(w`}isi٫LI.dJg.T`ta~/N7\/_&ɏ PB/L+T_.}EQ.jFEMqz=Ki6q}X*F $##!CF;zx:(OfPQ|.Zdtd|ҋLR>|iikkc||#Gdq\=z5k`8rn[ CWW7orq$IbժUٳg蠾>C188ba֭n9B*͛7j!n:8s F9x hիWSXXe֭t:?UUUtvv.Mf07]v~ZZZ0L[ʲ́(((#~ h2Xn{|3cxx ֯_>p&''Z\ݎb1^y(6e˖p8M&<#[T*E}}=:._?AA.7͞={{] ~Ҍb<3DEWoQ^b1C?D"FiJD*o=O f߾}hf|re[ޛ*UU7sgsE|e3M&,Zc-UCՎT)CG dP֒kЪZڬmrDWB&!:Ғ/qs<=I.cH$BUU~ӟ2<<,vvD|A&''l}Ç9z(EEEL&FFF{F}0TU׿5~ݎFASRR8?<,xя~ă>wCرcp=G|w}~TU%J!2wǏ_T7d O~ 055OOO>~ÇD8z(]]]D"^/OE4r166F,ԩS?~h4ԩS000Vgͯ/N[2 ۷o&SSSd'xEQGͷ ǓO>lfrrx^</"ǎ#J133?яxf߾}ڵ K:f||=14_A7)_ z*>}GII ܠBz{{aǎq,YBKKy]xU据I.zo4hA,㩧BQXn]Ӆ|/\F:ĉsNf3 8NN>kAUUZZZwn/Kd27*sKUU7Ŭ1h5B(B\COk 1)&nH2B" qSMG? % 5JJMP_HIduߎbJSS[latt6عs'ǎCsrС|9:tFCkk+bو;vFFF(//(0NIp8LLL( ͔QZZʑ#GkQ]vё%bժU?~<b0EɄbnW_͟@ihh`߾}~,c}222B4V,X)\.&.mۆ, 366FGGPF $100W_h;˵wrT$IDزe ;X]m,9p8غu+}ky{R:IҜr暛ѪZJ uv*L닙pp ӡi, 4YxqEtE[1&ԌE0A<jZ$X̏Q1ʹL*f۹먫0h=t]]]y睋F F6)dYÌ}4c?0H+VO|qag{rdYfxl۶ N$r x|z,\ƅNlܸkעIXV~w7{sD4Y(jke~ ېU9{j:{_y7IICxƂcg,/Z=^=oufnog.f3DWlfʕ`ĉ\.&&&;7|s>w{KcIظq#@<h~hUU\ @ @WWW033ÕW^,l6  s߷oӤR)6oތn@]]}}}($I;v`0茶1(`ڵou  Wʗ寜e`|+չ{KKKioo5MN 'opaa!Ns7]  J]tٹi>bb1"$ITUUn:1 M7w/q{y]TT-N(..l6nL&G$ ϛYCKO*cz`]dL M&t{ 0uL%ph0g$8>=8+ugON4>Ɓ%Yi^XmVRD"fgg!  (//nc0mIRZZn0hlldtttիedd2n(++m6q\[5k^bl6ioogʕ477366tzj8tnBz{{`0P]]a֮],a̹e^,MRD|YRYYn۩&Nc6ݎdBSSSCuu5d|vÁnh4ۚN#LiooO&yu]"xKLRAss3D`0ҥKl|>L&7p#J7^O(pp7SYYI]]]uUUUSUUEee%^L&&UVQZZJ$ן$Iaf0_  {Q$IYN\J&hysOhbTUU|UXXHqqܟ{PRUUU>@$IJJJΛ 7&N322,ԼcOq뫑5|#d==f-u>_8,=%N`!/z d>[Y>TUWen'H,RU5_n_خ{ȓsn]؞fm磣$I,Y{ڛU+ 8/tRZ.AAWЁ|D~w$lR) d7μFj,'cG""[Zu[{SseN.#"Nbd2| y}bYi*i0" l+uhP(tIqɔ\IV']CAAX:1Y"{9K ͒Ù/%UUIg~w᭷?AAAxzç66}ߵKԨBǂ  G/AAAy_ZAAA|U_' "ȥΫ    g}(@$H$,XVq    $I" DqX,z2 $ԟDܻx>EBd2TUͿ/<=|yTUurA7~gDžoQAS0'^(ŬoTU%{_WrH,[+L&ÓO>c=ƙ3ghlldzzw/SRRoF]]@ȑ#R)xx9g}_8qJ0?ٱc/L&^z%~_fz{{~륽=Ë/H ;w}vFFFhiiA&E% az!~iFGGiiiɓ? Loo/s/2 z)np: o|v&''wÇQ?γ>}{$ ?1b͚5$I~ayhiiajj{wW_} $?ٿ~G}tvvRPPpZAAoγ>$---tuuUUihhW^b`Zپ};կXz5rwb wÑ#G0L&w^^/($w/2裏3ϐL&q:<ر)N4)**l6ӟ;vى^ϯ,xuq%̻tR>055šC(--eժU d0Lp z|R .hذa{ǡC茶|_c?̪UxHӬXEQp@ z\uU,]^ڵkiii^`jj*:frJ&&&d2\.8}4}}}$ ֮]nbzj&&&H&h4VZE" _bA.sZ-[pw+066Fcc#UUU~tttO 2W&3;; fp\d2ڈF̰n:6lؐ?Ydկ~E `ڵgOgg'F֯_Occ#=<\{(Ž;d2ڵ^n7 6ry|#$@eFb  l6 ԄbÑ"+`Xt)L2,Y޽{yl6DUU6 555t:TUjhpQ$/2 zEQl6 oh4%%%a(--LJ8NFFF@S]]d[]$PSSCmm-;wGd2rJ@Aǎ#Lk{nN8A(bhhG}T*hdrrj$I"LNkk+۷EQXz5{kkkKv۷s뭷А>wNyⓟdFO&ٳӧOkꫯbZg?>1d2b1"~J2$Hzj/j*;ccc[Qٷo]]]pԩi"H) :t;vO~,kfggyt~rw^N'?ȩSBXV>a4 L&_s'/| x㍬[SN]0 AAx3TUe߾}ݻO}S\DltM$ +Ç9p??oĉh4>O4X UU)))c֭>}̪UЇ>^R>ϐNx>N<T*Ž˩S(,,dvv}{fuuu߿ziغu+x<֭[G:f8p6عs'r xqka&UVQ^^N(nvrYɓ`6ٶmڵ UU1L- +y<o䇂WTT066? rwcsN}Y<lݺ&n7W\qhcǎb կ~Ş={H\{c|0xFoαch4,Y>H&\}8vW]u۷sQE]vXdA r\|_ PSS =TVVri~l6H*z)C87R[[kezzx.֬YCyy9{/ N-[sG޽Alڵk9pǎjx݋Ve۶md2}Y\.z+6m@ ˩e߿L&CKKKj]|p^$^/6-AUUnwlD033L&tEp8}3,L$nV+fP(V%L0LahYH,^ȾnF8F#xǓ_  \H*H$$bR>ȾUEd2 JJJx<"IRC tۍF(e!Lb1LB!z=drL&S\F,os'shZN'>X,_s* 9T M2DeJJJ!VY9nw---EѠ*pVKQQO=Np80 AFc5dwe@ @4(T*{sނDjh4Ih4y^cK   ՅtnAAAA ]AAA."@AAAˀAAA2 tAAAA ]AAA."@AAAˀRgb&&&7eq.AA)N/u6A=%pm} Iuco>>O.zy  o$Ix<.>STT$XAAxȲ7ٶmEEEo9:@㴶'':+ 144?Χ?i.uvA=ܹmAAA2pY& z! )`QRgEAS4 vm?CM|k$zl8KnxfƢU] {F*bjj24n7AAxWI$P^^~^@ X4sg^l {FJ tTUUQju ]l   oe#}AAA=AAA}B   p    \D.      e@   p    \D.      e@s3p122S>=k+܃:k@[|gmB+1GHwNV`g"]M0Z8l2dNIFm%0utꨚu1m*T27X 0Ƒv'rL%Ț$X:_7g5a?}Enp`Vѳh9}g.j(V3XY2ơUc*V}O۷`MEHHZ" ;:9NL&X mK;f rƽc&ΈÊꢦƐ!R FʹTB:nXhX)b"A;iA養$H5a;&6N,1 iiB=KN'8le&65!|&!? [eAZdzxMFE)Ծ:'qi픸JQhZ@G z3mj8(; UGɔa FJ)]J TA3QF(Qq܊aa?3R M# :aU B24-Uxf"i]9J5<[Nx!2(LRKШiJ:,u3-I9jkCѪ(ݬBg5+vS=6,ex܁:̱$i6p6QBH#*e!b"2uDd#xBR3X:L4X3$*(~rR ݅ǡ;}\5TL&NAUG67iOenoQg=Df iZ+a4Pes9x Q+M!tv1jhpZ)0b.W``ɤą%n2]Bş(i~&gͤ)j gZ) DnCj`N6VDfȤ-ǢcKdJ( (wu"t$gMiѷ`g$KAbBz/C>H,]g6jG7m%( j'*fc %"v;zqMh03Ɗ8^+Qcz HH:|+J6L A*%Q&ub*$+T!uV (0xq7ׁA&`b?xr$cLjS:<$(#f:)z:dƆ'SIb6iq)Fhŧm$5*kB~LǸ#eT.DıwPP8,JL2n1p*Ʉa\R1Ft{0/"Rdע'6Q8吹]]&t K4dB_ѧ7Ռ$j zǎ3cp*+ühk Ƃ#\r2G4^.==l_d3N,kB_sӒS;/WLr)e:*'!g޶̞uN]IM9^Gkͷд:V CGK<5@YF)# [ X,m ϯ?qgvJ^0Q-۾sk"+抉nS{_Zί=cW1}p򩧆c+tҧòKMs%7fͥ^σ`O@{}oZ{o%WϨ\Ų2q~V>m1Y1?-.)~gݯ܊&&>ǟnk'k+-yl q6?w>JŋUFy;텼aF|3p__?xW=i`Չw݈}'^LU;ߛᙏȜpQ*#aL/e}6^yuδc7h[ۨFG/l[ 䪙`31~pugo;vRr'#ӫEIi~z3#:A>>O#.~VzDF?efcfBm|<;C+ɑ]xu;Bl2H<sr 6?knJ~NYQ6|_} gu :l2TdO4,V>0R>)@/-5?1T^YR G”{ ;oUXr6Ʋ[/_sKodd\y9v橫1dh;Op*kޣB4|KωT e8XE_cv5}\RTLQ>pp~~S'[hftb2Ѿ&(f̻CE][u1?˚M7Q]C?n}/6ïsCM*T?LQQvO^[\7FϚ~`|a`0q\a+W+7.+%v~V?AWaYP+'i$qyoB>tA([=D⯾e;WwUXON qEQYNX' C<2݈>~9*~TІfT†~3[1Y3?lu|/G.7?Q#Ŕ7;ngn៿6#|79\Z>*J0(Gh󍳣+1Ox5o_RSxelMʙ~=$jN7ai<_>~_'?AݟYr Ċ ZmLkh|˗k+ʝRk) 䑪Htfߌ8Ɓf& odk3x5TղgF[љuPd Wws@^˝m_e?FYF{9C_j 3x 5Wȕp^3)HM=TEڏ?PS);i. ;c*9oqߦVq709-[E/;YUGmCGO<ÃMv fc^K+0VLLs6VΌ9%ǯG> b |=g{=A4FLa~bej([ _r1g$]ϕkź0=>H<ơʔĉ`̦M[6'&sc(("_|X;[N eT<|,͡zko\_zbG%Km6nOKOR.h:WǛR٫C9Lsv]ſOT? r-A.}_T4 u l 'Vז޵ :&3xRsfZV6ܿ*҇[i=8{iFQ~]Kտz ͍/b:]˯\_xS*١++)Ç9u;q51J'‰b^tUs ͺ#)~'&V zC+h,} ~9#%G|ͽ?4~O~w2u( QtR:IלLzIN=+RjdizL'~+'|ZShl9b{oJu77u|puQ` Fa?Gkʱzd<-/?|/l1Z (*%^`6iVQeIz! _}#i3_8 g?Gh|bKCɺHKo@c{3@2I" HHs#wrwEIQ@Ҁ 2,(r;EEFV$dYFAQYNV$$E~$y.Md [edYʦ!g+%(+4$eMGQ9e> [乼g?OVIلϭR6 IY̓,ͥ /VB$YAe?o9,IHYiH2$$o%"Ht)Y "(Jvيd͂:ήGUlu IyϭCn}%%[vi2Aή2r~e4rv떍4~s(#e]e e B^PGV.E|?c|H>^/݇_osi+ڳ$)syʦos;I̷KyG˹_~?p_$eۺD6an{$ γYru*>Tܶ\NO EZ^QȚ~CYߙWs}_~.-(|?97]n$e~=ۖ%YɶEBV|_-7[o}d~'$난r%[s/;671~yL$ yegO ߮qenەeL$sen6+ׁ4W|99wua9RH6'/8M.'7r2su';"͗,W F7*s/}~ $)ߖE̷9`|ϵq,˨sㄹm;U3_q"4H,g$Ϸ1Q秗 w<(+R?͵sen_M>ޒ\[ k`% E_dꜹ}D~6ie(J0w+W܃.      eMqÜ={D"A}}=Ӄ,455!It~?h㌍@qq^oAAAA=NGii)@P(īJGG;v젮ѣ:u??`bb'k.s-AFUZUKIR IR %U5;s I ҜN2: I]'u2MV=w )OJ]ߤ7**Ң|&$5sVpQyI_ޠ'JٲTU+|-|T A~stM"*-(|٨s3Hâ29.$IUi,'fϥʂQK]PJ|}Xl> gBR^ͧ|K 3.ՃJ 5\YZ\˸$sy̵l7+u-hVo96綑Emt.?r.(QI}d/lQ.(|SS8':Pe! DnYmdQY|՜_6`*+|o 4Aܴ綌|,W,j/$-g,ősXms~a҂?.SH ]ϙk]]uqekEe#_^ rqmWoWIl/.\I'6zv.E6S\9Mꂲ!u+GI]߱hDx6a~}V}Ρ?ԅ#FsYP=}~AC߂X~]r{21ԱdO&3W/uA4,;ۦ^#Z©TuOig綍\mR~>iOSP#-l*`YVXvWw8\.n҂=_B҂>sa-̷^:UIz.uő;hZU.scT/Y^^`cڨi}/u~ە9ο:~]9,(E:_3/,C>[j7έ H+zN^9!'O$/};3m۶jq:444㨹 BUdw'Nt$ VfUEAp=Xw9Ngr3vFz ʯRvL:v7{]kc0HP*lh0C*Ѥ`q?r1LK)בߡ15l x͜߂']4ݿ 0A5F['CagPt+}]bq.2i,g#9[fq"~$7cfHX$К,5*NHAq'쬋VjLؑq҄e9(l͠ONlHKh׷PKP S`_oE 8)_10&}%8O_ˆI mzxnc-h$qȇ8g LMQ#j\2NU~&ͤi ^f(+%n AQʏoh)/T.9f6 l~$΋7h19sFG5x#JIDQPlbF_4ݥњdd:W!10u#qE2  ,KUKxhlK%YiXs-¦>^]Z3Kɘc{ q\A*R3& L4#!JY æe(IqLy 3'WIm{t-5U}Jd[`ֳvX-]U)u)* V"h{xz#)"+FZ`ېM )';̛@gў? qZ2!3mqq f֝r3R/S ̌.Qx$WP*M,XSa&GVJ[9,c̖EМ%4F #g-4A&&5\@KMSi-Kcqrv(Yz5 L Л=㘖HE,LŸ)cX|f #nSO2e3cYx}K9t]&,6L/ .P;H -GQT˘TQ4ZxIluitS}FˁI PbFVkt1-lɫK))`HGz:te.+eqmiۨ:#T(%FϜuf{Fy%5),I2yj UTKk|-T J(w(θqwga /%QePDiYәrRx!LᠴsfVpYRLrY#X Ǚ^O}jiW5Ќ^6W=¬-EȨ#ӌ@i\ll/m5B'=]ds&Z(&qf a~Dg]GcZEօbh,aB|u? oMҘ&%!51T~ x gHkUK X4Gm'Jم1Z (]k4TzBre5ϑrZa&ųABu!zm ilIgZ[FfzhuQgb,Ra' 2շ]Wΐ.Ǵ $TI+2DFHA[?Htm-xjc$X1FFZK_%vӍ9̨N| +A:+B!-h{* V9A`E5k&t0ZP/j@է:=V<'C"bqi#M0k`⠥D(Gf{X CxS%ԤIn9AODyTK'ڼb"\#02ڨR[Ѝ[f Wu/O.CD6Ǭ ivQ8TӛL1( *^ i Bv3Z\=Ac| B`YBS-5ӊ⦨Éa-'P5X'5L(UCڇI<ҏS;I(j({1ѣG Hh +BF~ HUc7㫝%ୁfIkdasq51Rƺ`D[zYCZ %4Uf[XbеuF|3Xʆ%q.$0M67:CtaGf=hz) Rg7RYFAze 3DgW2Y0'~]gG$K9X^G+ 0rji+"dk  ,x2gkx5ԧF]’ќgtevNU:yYrݴMOh-ɳ:*N]hAjj T!uZfTI%-~>;;hDe ̝btt}sJHR'I$t:EAQto$/CIX7эq*3&IT&bv27xB]FhItTxlSN9~z  4UM-LsT)IZ-S͙.! OS&Ҵ?U셩bw%sohD&lPߤ 7u+-$:dj;ΆDWNtP$[IƵ$Z"Li=#)N@=KL9jb1K@3{|$N>B`:mkňhmryVh"tY%X q^)GgbN)plR :>fH4C<%7 $pш@-ƌƒ q*ZePRXB MŨ,2cFfk2I8R@E(\%5g]آ6h]%Tgr0AAX;'ɏQ*~I&L.¸}a5ԬQ 2wu],X BKQLpmΒmPV)S}g&g~u*8A

,׮]#550vE\\rRV%11$&XJ&JƆ`AFFR??#&&nR.%"""""""""_,+455a6__w؁D"_񐞞Nee% LAArY.^ȅ HLL|hRΟ?墫35_.癞feeJzzzw}}}=.mmm Z鈉arrSTTDff&.b0<< Aee%۷o'p (vFٳg)//p000n֭[ r- BT*E&!˅d2R)v/bX@`0*MMMVUH6222@dcuut:6 %e~~9IHH399*'>>-h1 ,..2$b`05NZZf0 vIII!44T v BBBguuDL& GGG,FZM @.t:Z 18QQQfT*@qRRRH$LLLP(HOO,Wx^L&?;;ҒZ3??B`nnN<> %--b}U!fۏwV~y _hOjrUl6Ga_GEP@7 5zP@jK[̤v;BOrugyF$>,|O"p:\."##?߮D"jR-7Ƞ50D"amm D"h@eeuuUHR7_/Hx7/χf{蘈|H$,,, >.XA.-?'=ͧ`u/j=?i6ތT*Ⱥ}X my慈ȓgVB 22K|&{LIqq1UUU(ʇܹs ߁㔒Bqq1RTz"""""""f*\.d2v;999ܻwANNuuu\rx4 .\[ׯ_T9` 22lFFFdDEE[o{n233E"lv;FD[[6 ۷s-!dǏv މpKIDAT #../r!JQLKKPVVFUU{pp^ym&ŋdgg A.]( 99YHqUUUÇH$矧S8HOOghhIv*ogݒիرN';q{.X,n޼ZF&Ndd$W\"""(++cppGuu5DEE"## VgenٶmXVVWW\|cǎm6"""scxx:ta$ SSSߏ\.j~@***0qu%66z.XYYQF#466bILLJ>JoQRRBhh(ddd088B`0PWWGAA;CAAprr{ 2s3>ӷ p^޽{䰺8vRż˔R}=))"""""",ǚرAs866,O?4rt:2??YXX… Fl6sI`ffׯcZoZZ8RSS?SgH$vڅVE&a0 n0NcΝlllOhh( Fkk+r|:nݺ 6mxhmmeuusT*۷o!!!QVVIIIddd46[rOGDD088Hxx@\\ Aee%SSS:۶m͛S__ݻ1 "˹|2dgggYYYAPpܹ'>Vnn.KRR ,..RVV&̇G#Hpl6hmmd2KMM#3<ܽ{ nݺd4z\tdwAKK )))8pNoMtt4TUUq$ ;w ĉ1>>\.G*288HYYpLVV뤦^g޽zCѠT*µ aQvv6VK.144DWWSUUT*EOll,AVV@rp\lllpU %&& JKK'::AXX;wի*QQQ\zZMZZl߾̮]ػw/˵7n011Abb"---l6:;;{^*I\\G>&&&b޽666XYYݻLק1 ٳhX,n㞂"""""""_A>V@X,={Cw^Akkkx<\.ӉJW_?Dtt4mmmtttNJJ L/u&&&.]B/s9N:Enno 444sT*Ֆy'''ioo^?k&ׯN'q>X,!jhZfggMlzz/pv͡C"!!_~Ʉjeccv9F?1CCC,--CXX'? ===BxߏGNYY&]vqE^/ǎW^a``- ,--a6III!<o+DDDDDDDD>-g``|;|'==ݻQ*7 ##k׮oȎ;z ݻw͛oZ&99QTT ͟a~7 Z{µk^ν{mmmܺuY/{Twܹsl߾c2hoobP[[(?Z[[9w E"`|t:BCCnS__ω'Д'~o4}}}FDDDdff.XN:ʼn'XXX̙3dgg%bիWl7|\\\rp\8pmۆT*e~~^p,dffr\.NBBMMM,,,sxPT$%%V埣__r9Jz BnGPij>Kvv6 竪8{`➑L&7 r~_1<l.,,'kӬİ(DkI0ͨjBCC*A8~H"""Bjj*&Iؠ%'' ˂4Rd$ \.r9vBBB ezz#lllRHKKcccY4 ,..,h£rV1ͱAll,111BCCCQX,"##q8H$j56 J%i:;;/FvE*Jtt4nYXX`mm ݓDP4V@ @||<111̰NBBxf#&&@ A `~~x<DGGNuuJ<jennFCRR?@ll,x<JfRR T*IHH`}}(666T*݃./N-~d^/&x666 ::ٌ%,, Mtt4v-waaAx6%'' Ʉ˜"o~6IKKC&aX-,,`HNNF.355%̇pL&vTh\QըjYYY`0"R)Y^^z Ea2X,ƢX^^\fffpݤbXѣ|}}BBBHJJB&1;;+f[ZZbffÇ }2772dIOO nqqՊhܒN8!fjj RIrr2m6 *<Z-?G/aWWWQ*DGGoQ}eY@<oZIl6JJJX[[ѣ>*Y@TtX(N:pPVVf>f9xcב"[,VWWIII*.Hp:\-&ğ͆R4VT|vOAUG֮@ QQQ&pRCq>"Ϸ% 7D"rS 8 }YHRR)2s rt/oj?59BNE>D" <4Bxh^GI0 C7r}b3>Dhjvu*x^N8&"""""""""ׂv>)tIͥ?:ߛ?ןRO鳖 /..~sf4\x<2;;㞑~~k>=?M+v >mg雏'iO>HW:77uߛS}~T?!p:twwrggg`__FDDDD |!Hp8B[nqHNN&44u^u!oEEW\ayyLΝ;GII CCCdff穨`zz(}gΝBߠ}GG.\tO p)_NII ä{&''cqq .P]]!99[n;^>ȧdVWW't:l6 e֢h b׮]T*jjjr $''ťK 11˻KCCrq5˙%--MHlGҧ b5??O]]YYY_ e)Qǃ)<3gPUUEEEpHKK |>0#qgccGzZ666IhiiL! u _7~?sYoLNN_{a6Y]]exx4˗/S^^NOOnwKTT7n 11A:;;4v˗/Rsm>2D&''9(JIMMER cpY"22j 22p._ccct:)**"!!ix oߎl7ի444099OLff`I~Gyy9pmӅk333׿&##Vj7oKddg_UU$999LLLpe TOOgΜ2O4 qqqܹs"{RFFFHKKʕ+HRrn7o& ***())atttaܻwsq &&&سg~;imm222hjjΝ;dffիWY[[#==#Ν;,//c0p~)Q~ 르v;iiiqYFFFdyy{&PRQQh\xY233ޣ]:{,ըjq/_fyyokȣfu\dw?V@z:TWWSYYIBBj˗/rill$==Gb0a׮]ѣGE"0<D"OO&ebb{v{.NB.VH$cbbbvKR smmm,--QYYRD*bZŋ477Gdd$ zy&MMMDDD000oVETRVVx"mн^/veԩS\rǏsNiiiw}W_}qYXX9rt!:$QXXH__2V222hmmellv[*ϝ;w~N:;;wߥ$z*CCCFjjjgcc$$ >?X,&997ooMHč7X[[C&QWWGXX7o$99YHUaƕ+WCPt:9wCCCL&cvvٌlF.377G__;rss`jjGgg'fyyo-kkko%??hhhbcczs%9Z/ș3gHNNc۶mKa(//gzzO?Edee~>}Z0yyyFmm-1LpI())?)z.Ϳ7DGGSUU~3z)x<\rbbbؽ{}>żlll܌b(Jٻw/PUUšCgy+W{%77nvw'?!33J)'Ovsu9"յk(--%**;w[orя~Dbb"!!!$%%qMù>ׯ_d2vBJ .ى$!!K.133VennɄdjP(xyꩧ0`Z1L299"dff2;;G!66T*7n >>Y'44^ݻw)++CV~`cc˗/Mbb")))ܹضmEEEܽ{A)))[8Nx8l6cX DBnn.܌BAuu5())Ase^xY]]EHY{|>ݼ\| yWijjB&q-rrrJ%h_}***HHHT""""""m v ?~\LĐKll, 糼̙3gBV#Jd2 =zpш``yyD %--M8-b۶m,--Fh4 ݻwh4ڵKMT*ammhAcxnBMM J d>$$8.^<$''ښ@Rd311N{ b磩 ׅMLuu5 S]]M `߾}466(F XvIAAv hIXXddd,.]">>0Z-ٳXJ%&%FFFdyy?ɗAkk+K{{;###ֲFcc#$$$ln||"233inn477 hmmmdddpQxw0 qMjݻwKpߏL&@ @[[۷s1>>NUUٔJW>Dmm-+++8q+W088< 3::Jss377T*ettۻ%H0F4066ƅ v^SNQ[[V} eAnn.ɓőMDDgppK$zzz())!##-9DdF~~0bxx8фh4f\Baa!fl6رcuuuܽ{7or 4 WNff&.98~8󢹹Pecc;vIII9s/DZZQQQq-FFFd2qf3Bz"!!{ {AF!**gϲJ||<;wĭ[ A&O?͝;wXZZѣnBCCt\x%ønz=999t:vֆdffq8rtttݻwٻw/,--ɭ[A\ :nmmd2@^^h?Oۉ;vl߾<, ddd{nBBBFVk.feeχT*fa0HIIq1 ԄjeqqT*3L"ٹs7K?#KKK>}Cw^III?! p8èj^{5ZɡC_044f۲!8·v\|GǏCqq1333ٳ8z(wڵk[ְZ,// QQQn'$$pAZYYNXXYYYjh4~!x\.GR*6 F^^hZIHHJS|~ 0 HRx<8N C/YYY|#$$Dfhȋ/(h?6-u ^㘘q\a6INN :Nn7{%66$##G }?9::'OgÅBg?ќ:uN0n۷@۔J%O=/xgd>|}aZ5P(8|0%%%q!ܹ BvHRyW{4 'Nȑ#(-nZ-333DGGc4ijj~|>NFUU垝ERh,kHMMR\.rDnguuZMtt4N@ Nc۶m_/C&~3h4^{5oN?J$RSSx<100ݻw>X,XhllWRZ[[&))IOO'&&F?$%%!BCC '""ݎp~2 T*@ < XrrrHMMÁfCښ'** :. N'FTTJRFVfp엵G&%""""ܛo(Jt:Zƞ={hooWz*333ѣ_OOd~:׮]ܹs'N|~^uf3NVիP[[Kll,o;w^x.Z[[YXX %%o 8J~~>n7pmhkkh4/sM:;;9x @@+--6)))444`Z)((… lLrrrvp1_.|=H$JFȓsNA\.@VV%** ɭ[8y$8xvd2z,ihh ..p!==2qqq<8N.]ĻΝ;6RLMM 'N[nqaZ[[|333,// }[oQL ]tt4TJvÝ;wt+fˆ%,,LLh4r-XYY"\BAAyyyXVw3 dee}>|B&&&&66"x d2-.Xw例+l2P(p """bhh7nӟTXro)@zGff&Gq9bcc$##~pY***ַ%)JERR&BB*Gff&DDD믿GE& VBACmm-P__/` KV+2|>Z-iii:udzzVD"aΝl߾]˿Krssjtuu{n=)Ξxt:IHH`nnNcjӟ{b0./_fppΝ;JNNVXCRTTEJJ nB((( ))*\.9@s}^/y&NvS[[^e:_GRυ 룣G2==MCCl߾gyeY^^&99@mm-NxdDEE sGo>r kkkDEEa4ihhf:2۷S__ϯk|ZMZZ׮]cvvl`0hP( ER!PT+f#>>(q:?~WѣG_r^}Un߾ͯ~+8|0&?x^~ӟDEEDp|뭷'ϧ}t:N>(vСC_ B!􋈈ȓdeeE8juN';v`aau~I4Aͪngii0Lg0 ZV}N7aq88bbbX^^feeGDDqqqAfYHG.3;;K  <<\AR xK$ x n! N0ZfaaK||r?%""ZVbxb{?IXV$ ,..G^OXXs!( ZV, :Nf3 m*l6ñ-Z/ ǃb`0d"44X&''N<^^4O zÁVrQ*,,,Fqv_|^^^CTTCЂnL&^~?Zÿr^/&Ih6$&&Jcc#?vزNLL srP(DFF"JlZJKJy&C\.666H$h4bbbP(nv;QQQ,=m> !J%?vaXP*RwSSSdff>a||DBbb"'Ow^/7n`aa4~鯼$^ ϚS"lt|S|~v@Џ>V+m#-A"|<1\G㾿ȓI0SPF0%?ڗ &ğr9 +lRFarG)qiн^tM ~"""""""""ltG*7_zdϠyM766&L0R@ D}&NSz""""""""""r\& .롊u @ d9nu0RTa掛͟p[?a|ޟ`Zܧ_%>jyO2_^8$l .@@NIX,cSίscrrؙ2A|SQ(Ae?>Պ~ D"Dƍ\|N cuu LII /_fii,{=JKK&++vΝ;ǵk'++gr-R#ܵr9B|HPP(())ի"7ؽ{7={jiiiܼy? !z4WRSSlK[[>NǥK(//g~~~K $穫CΙ3g(--eϞ=T**++)..d:::p---$$$x7HR8Ю-톭 r!ÃYn޼Ivv6R=I#ׇP]]Maa!F666x9s7oRZZʶm… ъ󑒒| ,,lob0>wOB0fm ayy2҄ʽLNN&d*W^%55el69מ9Y8YZZ̙3׳N-?BlK$*++q:>~?.]BmGM6F>Ar97n 55Uԃsٳj<6 /,fUBCCz|>jk>V@8p6ƍܾ}DJ%eee9Lzz:Ǐ`0`0طoDGGRhjjG?޽-z0*---9rwfAUTrA논?|6==s!bbb$664N'gN'|[bǎc={x"۶mr9sy z J>}W_}>ٳgqR)geeedffsN/ B(377Gyy#l6 0ywDܻwOH/Y@d߿^h/"<۷^Ogg'{ٟ277ݻwyꩧï 슊hhh#G(,wuuq9pՅRqVWW,e``DY]]孷Ra-//v BjN*++vqqqSUU%ZoHp9 p,_fA/&''yjJJJsQQQl6}&&&~:===$%% c588ȅ Cf\8FӧOE{{;:3gMbb"333\r~rΝl6Vpp%!)**211baii oM `0puJLNNK[[a7>>>{G}}=aaadffx*855SO=T*eaaNGZZzq8{T*x4V||{Ν3$ 8iNLLRRR#33VK||<т樱v!"ۜ;w\NZZssszaS< 5( (~!!!rifggINN&!!BlF#JR844餬-|ttt{n=zz&''Fd2100SHKK#77pJJJ0 ݻǏS\\&22/>߃5rrrgjjӧOFAV͞={%,,QfffؘsY^y&hb8y$dee}JEOO>1\@Z-w_fccAzz9{9a}őAjj*T*v/cccTTTαcǸr 333,.. / |"##yill$**|^z%t:KJJXZZbvv^zsI!ͥ餰}ꫯb۹q*&ٿ?*.rrrx爋'11E׿5gl۶_|Qt///Nvv6XVimmF:;;dݼ+O~mۆ"'']vQ]]-F6"Hسgַ??Vٳ:u\۷o8h4)1;;ӧ9vv ~3772paBBBxׄ9N)m1DEE@TT@ |>`rp:2t =..Hal^/v!I. \.'44tfsn_bXfa6͹Zb#vbbb0 n|>III"Jwu@kTWW399RD½{X__b&iZT**J8x<\. B|"##Y[[#""HDD(JT**dffV@R.W~?`hh+Wͭ[!gRIVp85 $&& ."""""""ME"~^x6-ǚe``Ohh(Ge׮]\.RRR8y$֢jy駩5^x"##qG!!!TJ__T*z)j5ۍF2BCCq?͂?r3g#22 Fj%55{qu䰲|\t{sNF#O `uu$޽#33z8x iiir^/L&Y]]СCܺu;w숈.]DKK }FCCL{{;屴h4b4\&^:Ç344jڻ0v]^JAL^yW^ Mڮo] |!s]9σiHE@u*677!2:t],A^Ǎ7h4+A(0775Z˗p]333ĭ[Y1887oވ)F׮]} ,,,Ǐ$ իPU_~ą@DDDǁi"Q8[N.ٶ-wI`Yl ,i"ϣj!"۶a4M Iu]^zq`Xg:]uA:I4i7iHkׇl6=i4 jQAQqx0MSr"IXYQ.j`Y-@UUX8|=Q/Q,r91<$Ib]Ed6˗E뺘"}_Yi;5LMM}1l}}}j}Rܕ$ 8>ppp _0P(`6|߇i71*mz.MhD(fhZ"I,pG\꺎F\.(jhvtI:>mxrQ^CQ1&m[EQP,y\ׅaHA@ل,0M!"|>žd2rmA\.#Ik<+"H|>0 qpp8ۋ8uۋzL&#z}1,˂i( beQ92|BAajAQ|MG$E( @\* jiΐZvzi<=硿VT*Ae(Il6En"""&C֫=oрi0MXzG~pp\.Rԑ1}8cYۿ H9ݖi_ge9>qeNʆ+e-פ&cw|ZG~]Ӵmgs;g}c_Trƻ"""""""#8eYVwa{ a+r:Az'fL4t86i'v9w1 teޯ11ia`gaWs[;IALoC q5o^zC)|ٶeY\Q{~۶apExǁ~R$MӤ۶I$x>L$j4,ϯ3b8,@ <Љm_""qcYǎfɸ\&TW$??t;]{-C?;wdŊdeeycǎv7oH#GpM+qݧԡqI[ ;΍7ހq0 dZǡz̙CeTlʤ B")S*2v:R]]((t@<2tuudbz{(,,J8yM^^.yٙ75n4];fܹFcL&۶سg'//O9DD8KaD" aPPP"LRA,rr8x D7"mnp8LN??%SEQ~?Ȣ('zqGVVDDd,  r466q7GKK ~Àv 088HWW9\n:;;imm%''_ w}7yyyALUtwҥKGCC`~?^1M^6#hoo'77Mww7x^سg/۶mcҤR x<D"188H}}P^oreY444'#ڵkY~=555)SƳ>ڵs)d``$M!rssqLO>g> àP(2tΡf~'dѢk8vpQbO$27DDD.0RtvTN?0XK҂t7 ]3-⽽:u ǃa{ DTTL!??P(Ĝ9sm6x e7Tt}EDjd6}}}|+o OVV6<Ѓ?L2o5k~C ?ǘ4EAAUVeZ!BmBn6MƩShoo ˑ#Gظq#MM|.D"sB0@oo/{aPWw <k֬硇;_W 9y$3f̠|+̞]w],ng))_rtuuS__O"?î]8Ŝ94i;wq ަH$׾U6oD"qv؉i9s&X޽{hiia֬Ylذ/_FMM ۷OSS= eee<㔕Mӟݻwsx=x~an6o}[8=zys'NP]]MYY;v줠*ϟǶm۹( ""Ŷb8Cߡg(^,<STHqq1 7%0L"fՐD1l̔)8vz ~?ke֬nB$D"i6Dx|>f̘YU>8M,cppB[zm>O|۷nmNww<̙3qmƮ]ʢCͬYhoo3 7to6Ϝ9sx70MTX,1~vkI(w7q<裬\y#mxL;ƃ>@Mlz!NkJ,ˬ-yf֮]?=STzR)8 '8v ɟ UUӱ,`ph4alڴ 3c ~L/x<0Y=C=е:xXhjjb߾:tqJljⴶ^::Nq)icR)x ;PR2X,:J8PlLEWWEE$͡4n۶'.<ȥpسgͥz}]\\-N&;;"'JYS0bmrssIR|> 7`@d2eYL&dܹrxb.ѣ_ngnݺL=MF `\{2ǦDZY-<@˲>}:ֽů~+f̘iS1 ̟?^{naizjZ[Op5رCQ[|>.ڵ3yr==L'""o雺ThŶ-N ²Rghbn71fez2|>qСCtvkK$&++ ccS)  2k""rIg(.)-|o qk;wT3;wSV2o<\.R\\ܹXd 'Oƶ-fΜٳ:uL68$rOGvvUUU0i$-ZDuu5~%KpQ]]MM,Ne`A-=Eyy99x^:::N7󒕕͂ 暅SS3%KSQQA$믥څ`|˙3g/bJ,+Ō3L>jYs& xb>ŶmNn&x.`ٲeXMQQ!˗/gѢk,Z_Y3>}YY~%%?S2}t_I%Œ%KXznֲb L 77EQTT‚󩬜m;x,_y摕EMM 7ܰE1m4|>?[7tg`YxlED*bY'q=1lX9g~I2ĉ8qNz}G>77G82)))5oqIJRN<';; ؽgc9)<^ĝP0̪xWf;xr8 ^zT*8#f]۶>>teeIR\>c&T 0pPޖeeEST].`uzB#3Ӟ}z_n2PF.pxhy^{""2vmsA8>2um!Lxwitп![0zkfggQ>yAw?2Uȥ1 ^usms>7z1E+{DDDDDD8tuu]z"2z{ژvbӃDeh*_{hmi #bW @lkʲwb^fy-1ǻ=x;KOsyc )D9gtNwh,`xܵI:@DDDDDD.{֏KefZ<\Tphvfv]ʼn'(..RG) 3\a@r(vwGیъkL&Oo;4 f8qZ.=Sرc}uoLرc;g``|[l!S]] /4W^ᩧdggKqFz#oI?ފCr_$ΚC$ /rrP%0{R6:#Pm9S X1=@co AwqȲə}A8_dڵSVVFQQQevgGpa088?OUU>,e1 'xӧSXX8bzՂn{1|>uuub_˲'>9s٢nN箻4Mz- 0 'O/cY+Wd۶mQ[[ԩSy饗9yxLjD"\vE0䳟,[lwѣ|sѣ>|ũShmmeܹd&<ioo_~Yfᅬ²,=ʲe˨7߼a""""""2!;ٳ>Amh4J,+V\p'.O|<؏4M^/xD"a\l&OL `iǺ#<wO٘x]&E0e8R6o%g$Jr<\ylxL"^<x˲S{78omSRRƒ>g?YH$q"̘1#sCvx[*ʔ'jFϴB!rss3 \fF,X,q'JL&~C=ɓϒ\QYsx\""""""0x<ɓ'q/\,0bR)\.gD===tvv_6$a0c hoo'PTT4އMDDDDDD> o=r^l>W2$''3f8NfK3cΜ9$ "sw~w0 &~߰i&vMUU,_ 6o>*++[JDDDDDD>;GB*Ȇa`&uuu444`"p8;a\.n7n^ Bx<8---B!neM֖'77sg>}:immeR)X|9+W'""""""F__9q̛7{Nn7&MK  8%%%Y~z!~?]]]x^ D"L$//43v("S]]M4駟`0c=FWW?񏩭9pp>U===R]]eY84mǓJz]-' rQLXw'ˣ۶1M ǹkhmmɓ$ nVmFoo/r `r,XpVwxǣ>8|[ߢ O}Ǐ0i$z{{tm&eCe޳, 4L` 8ׯg֬Y~k|k_-[P\\&Lr뭷b6vbڴiTTTP]]O<^K(bb1V\ɍ7HoooixXz5UUU`5Wk."""""r9g8>o+Wy뭷hkkԩSR)n7$ g֬YL47|,lfppl*◿%mmm| _`YV{,/]soai 0gP=MLt àI&eLw}|>>OHVV>|Rsa477sQ~w~۷300@ii)sΥqhnn⳺b1xyG8ph4];y^1 1H%h 4tw277DDDDDDd:$qg.^li6|Yy`0H<g̙g=>N c@2wm!^WMJEDDDDD>;@:|뛟ks=>Hd1٣{XQLtO3D(\i\.BӺL݆G ,޺;hW c(}|ll500Mo 7tqHRcJkF&nAA[gyXiYx8934Kyp.e z"l8KsowQQ yi~ c=i~n*`eUE|n󒻝yڍ7LF/""""""#]e0 i`..{1OAց~7y>7pM H9^ܮiv{LKZOTXCEDDDDD>>zs<,GKqwGisݴ9^O Cz(n=ԀXK+[h{%nÝ(Hl65[tln'^:fqc]a:kmw2yI6nXOpL(H89$q%>JTq3'-]'3˫2 M c8rH`08˳]nY&Tn7͹wf1=cy%y^+ٹO=a }79fi]G圊ȕqq H۶/{G>@ @*" L&/+?Ӏe#O3 L/L& Bط{O#{J-op<2`6a|>m>n\ƼeY ǧadggXv)--vth<>.qr~n"`N?8C~~~;~2 A?3;;|ȕ5jnHT*Eyy b8CII .3 g eh h -ws4ˁTqr)<(NoS1l2"/)xޡuڋq/=qvx.\?}> ݍfʔ)*0p\1D9l8 Phv_kj9}:>J9RY(@ ^oٶ]DDD2q^/W㡣K  à2e`4D~ ( ̢̈́p8?+ˏM 2999D"@u2Ow`AN$n)N08v$rrsjArPnR^wLh4JIIP]OLu˲.i8֞L&줤>Wixpea;-'ùNg]ėqLzϊ0h"iYc .i[41 ˲Fr2˲F|nw;kd2r94 }/ϧ|48Q6ay޴Z0<;oDappM6qwz3JwM)ﺺ:JJJ(--ͼ7T;wr)jjj7ommmڵsRSSCWWw`vEww77|s&a޽\.oߎa,]bvI(bѢETVVfʰcoƶmmFNN_=x]v˂ 1cuuu444PQQ%K0 R__ϼy󨩩a߾}fo>dѢE#nx8Lx_TB$'M/a`'e8}zSL&Օ ߎ`C=qbM M aP:uݻwraΝO|K]]MMML:EÎ;(//g#GNNgf֭S\\̍7H[[˗`ƍq̙Cmm-ǏСC,_ Z[[ٷo999\wuR)}8K.wy!V\I<g߾}s8[l!++믿~9Lrf۹G|oɓ'gɒ%8X{H$B `… M& :Θ1כ۝\/OKK K,aʔ)#Ν;)++c$ mۆeYXlˉ'Xtiٳ3fP[[ ۶msuپ};˖-󩮮""""ԣ=Vww77nĉg3kDFތlہeLY,Ik(vΙg$w6rqb#tCeM$Sm"(%K0w\>yWN=Ce1]n:̦6v{F=c=w۶=qJxYf h۷_`0Hcc#۷oĉ$ ?΁hkkx<ljD"JmA%<SO=E2_WtuuJ2駟fqv͚5k2466_X,Ƌ/mсa[[.]KK o&yyyF`7x#ss'9۾};/2AyljbK/DOOexذaTz{Q{?X5Bm| d2+墾_|1crI~KOO6l`Ϟ=R):;;iii?!֭ԩSlٲۋeYkCxg?? POzjo~vM]] uuu< ӟ'OP(O?ѣGy9v[n7IJ,LӤ'|3`YO>$N107:_nx'y'ijjʴr/@?_ms!^u^{5^u<^(ȴ,x<>ԭ"s%fq֬YCOOϘnP g6>Yfe&2Mʆ 6m_gڵlذ!^1N&L;r)y|2e dP(D,ckeƋGQ}]Z[[dD"yo~V:-ZD(slxnF<f⦛n罹˲|qL>=ߎ;p̙3qqCWWSLg#`EEESWWG8fҤI|())0 <wy'wygwޡFN:Egg'|jjjhnna=+Dz0l}}cqQ-S)|綊 pԩ$Ilˢ&x+*0#';**;LYe6>=J^[[<ӱ,,.***2ߧUVqeYTVVr뭷fZӟnχiQ__Ç,+Wr=P\\<[xVVҒ91|_{w}TTTJ:u*> ,m<˗/s2{lON0\w}730 tMYE*;CQQ7|30Mgy.6l;p\\.n7>D"A4_|P(=0gСC̜9$ Z[[e|3kZロÇ`y"{Ŷmyyihhnc8t999z'>'hjjc-"""r.9C4^`ǎ̛7UVQRR2rxH$xyy+io~C"8g3M+no&_o×EK;//bP(sEݰp7fOʋ/8j~:y3g;0i$H$ Ioo/̟?BZ[[innfٲeF4ʹT3l֑H={K<.3rwRUUy}xcˣ>:@ /磽Fz/ sϑJhlld͚5<#~_?Oٸq_a9y$=g())!3PSSõ^K<g|3a͚5̜9~q\}n[m{(@mڃA2꺻s(w8uweqkE'Auw|77MmwvrD2ُto[.(:-[Gɜ0O?4\s -nr444hll$H''Ge׮]8+箻{_w}7W U9m7|~9?OVVi&-[r/|K;g0M͛7D(**δRpM8>>74M9pӟt\LҥK1 V9|0>￟ѐ>ÿ1鹺;ʕ+7A2dL2}gwޙFǛ~=;;{wYf5\b CC|_4Nftf bǎcɒ%aRGa֬Yc,uOΖmٸ |2 ڂAty54PǢbwuv48Hg$¬ϻm66dHamC?6m?!<@8۷~C=.sq;iN477H$_zGy~z{{iiiaڴi>|N|qz{{ؼy3< Yn.9spB~_ϓŢExyihhwwI$]`0Hmm-ǎV̙3/^̙3/\)o~s拆aFnT)++c̙3GKkYVrzis= ())13hHRw:يϗnh0~Qo\wu̜9|ӳgWO,k}Cg޳, ˤI=k۶0 N@g>LL65'}:1x\˛eggvaҤIL>Onn.$ӧOgʔ)pݙtﲲ23u/,,̌Nu3gϧ<,`0HNNR)DQMF0$ R^^Naa!~?Yx'?IQQQfI7G0{w)SPUUYαr*++2e ֒Mvv6K.,3#=+|("77OII EEEB!^`ԩ̙3n,Y’%K@;$F{2bʕ̟?Yf :u*z+dVwyyypRZZ[ϧw֯t0FY~%YK(rL6[xĉb1*++3K/F&*((`ҤI dzl%UVVf~df-UfY---ɴiӮ,mmmi9Igtpf ̱gn xap$OrUa(Zzt:qd輤_s#jO/f4 ܦIi,ƷV`EZf2kcU&JO2weM4 #3V=ڞ~==rzaNyyyFY(Hm/"""W9|L gZ9S_J9999WX,ӂyH$2Ky^"G%? y Ik^~?D\_D"|8^/99Ü9Op=e;ZP@nNq7 G ӽV?O\7U?=^DDDDFyp#J$L^vn7x^biM^^pp8|QU窿%xF>Wrmg&8///5w,Ti#``(غ'Oh"1neĬY̞<Lry5KP ]DDDF:g aw"êpW1%dfxK>,#߫%>;0S`,""""ۥ"""""""-{Gh px*""""""򑕓ڈ0 0iq"""""""0 fM |q](,, m6adԟ9sHi883r>m8Nf fnOu2 KufӞ3^ 8gZ33M??3>L?D"3y[w<? o~~bhOVVևvmfռK:t3gr)~P__ϢE੧bݺuDQf̘oc)--ĉ?3UUU ooڵ ˲(**geڵ$梨/~ V^͒%Kp_|W_}fΜϳ>ˎ;2e x~~X,FUUazj|M/^EDBo~Ckk+g|'QSSѣGλヒ梨5kOPYYIII |f>,O?4˖-OxbwvEVVٙkZ__3g?<< Gaڴia?:,YB__/Yn̘1~_~0}txgغu+&Mx<9rcǎQVVab1,:+ ,_*ر2.]JSSm'?I>Ofkʢ x<κuhjj>0r \s n+Wl޼[ZZ(**⮻ʕ+!`&˖-+_ СCTUU/}x )((_Ʋ,?Ζ-[hhh JfŊ|K_bǎ3c OΉ'(,,fҥKX @47ޠP(Doo/x[o z[xGx9uT ---O~Xd R)^/v?06lZկr)vٳ?#.\Hvv6---ڵ/| ڵ pM7裏{q fΜIeeezX\\#$7n|[o<ǡ'Nd~\&+++R\\L ,QRRBKK |>NJvvvoɢE2e m3m4O[o /\MFAAA K.q~_sˌ3hmmeڴiKww72ydrrr8u.Vs/@8~8>,μaYohjj_b$I6nٺu+7o&??}k|sȑ# m6~m/F$ -[c=ҥKٳgϨeܷoW˞={zdSNG?---$I%%%lذYf1w\vٳgswdn```iӦȯk2e W@p8Lee%k֬aƍB!-Z 7;ԩS<3ݻk|,7$;;m۶v>Or2sdggc&JVVL2իWn:۹;ٰaoFfR@ i8C"<,"w}}}9 à@ apLn7BfggO22i$3k ޲,zzz0M33iNww7d44iDM2d``l qNR."Aqq1xP(9k%%%eFɹED%JC"0 &MD*ZUvׇm~JKK!bEEE{(cYݸn3T*izqɡd2z)((gĶDQǡB^7Lz|qq1>oL`TjDVZZJ<|LӤ?3_YQQݙkhYYnqBH$P\\mtuuaYiRVVF$F RPP@" qחKKK a27҃ mܞ~a(**ڸ"""""""eLcrztq'kqRVsQ.""""""2(@L EDDDDDD&"""""""t =8vSNa ""r\.,b|ضϣ>zIO^b˖-|_88A.]DDB6\ƫ"""q]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @]DDDDDDdP.""S$#^‰ m:'qm;wGf6`}cw/&8Ǯx 󖳓8g7S&N9p4uN#C]t?j=1:MN۝88ltA?~"""G EDC pb$73NMsnpv55m'm?M %[7WO8&vyYy}L:yyivv@95vuf0/;K ;mW|ǻ""f`` /lw6cWGa{n ɹn.Xv'Q7G#"""C-"""""""t `]Cǎ#H0c \.G4Mf͚aXEii)D"***2۷q 4ix[DDDDDDdBS 륬 7o7|*/{n?cSVV?#ǻ"""""""Ƙ000χ8^#zp۶3߿oww477p ױ=HIDDdBR}mm]G;A"3Jr߀7JjS=" ͙€6]5v_`Xm۱vB| \.|(Bsm. ÿOsY9ش87xy41hSNk?q4hrle$)ZN~kl~=4C~9A_49'¾BODDjPF!_3ŇSFYw:u*_9r}}}R)L:Hzq\\.R*h'DN+""R:H:M`lp{ppcy-dp@bu8f7r  C MNovӦM5L88ƧO>1Ή+z, f8rEsa&BzI3t>f;j&&8iq\}W憈f6S"w<ϛ7kײvZ***HR$ /_E`(ߵkc޽̛7/̙3پ};7n$Q^^>u E""ခ vq%r6.Lv2qqzY5td968&&&nÅs9<+}u]{xϟq̲/\"""E&nc 'Oc=͛dɒ%F3i-ZD(bǎr-dޛ3gVѣ rM;jC6u;RDDD,TWW;#[neD`r曹/.s0uNDdB3LV7eڐNN?P)P묁app.W[0EDDrf9@)=yta\fWp.QNp]|n:hl:=2 \qޑ<&6]6E[DDD.eċ~/AVYy:8L$bwۜL j6ISI8DhOm&u:J&lwmdjʼ7`5m<]NBɳOr*gvA0Gr!dwt´ayܷogL=Tv˘?&v}QX͛=gÇsaR}}}ȑ#<8t\[ZZصkרSpz;w 6m"HH$شi}DDDƓt fG{4%6d?ǁ/FiOmgKppwZ?3'^8+O# VǙlR5y'W[#+pg71$ypp'[}5'ְ'8'[ۢFkrYM̾&7-o# 71qEfv~^8\$a{z}wG4$֎9sYf w.jx<3O<O h4_:t?LJڵkQ%/R_9ugğfAO>~"""=39#_ᜯ8#3=ݹy)/qF-3"ͅJ18W..8sc3Z/nݥ;| gϵ͙_jEDD&L EDDDDDD&1wqO$J(++0 1 mD"$ g:::m \.Xw+""""""0=OKQQSN%Lo2sLǡ˲xGٱc04K/ۿ[JKKǻ"""""""ʘ:˿KrssI$]3gr뭷O L2#ֆeYc.ĩ1JDCg`c!E3$Z[j+b[_q10Ifnd[;Zp6aRqYic3hr$]A_ӑ5j#lw?srl~(;.wJ;}V2`7e'har+1IWj?}V"ߡϪ>L LN$7ptgճ50))XǶ迌,ϪXb ٧>n#21Ϙ?96鱎fʔ.WUG"y/vј|Ȼ: Np\X/""+c )**"/o0 ={vyG,w8ư axE8c?+Ui[|<f3N/֖ l#.zKΤZv8+x#`c79 8o8o#+ñMEuLuq$bMu#ߑuV{#M<|N&ԎG!01;iJX9bއ9shTj/RW2,wcq>$G/iqcXG:.Su4Hbd}vK'""[35kְm6ˉF$ nL7͛7sN8C(//l8}}} ɓqYQ42G71P9qf.npa: ~z_8=[ \xpF2XbvstW0V@7EDcfL4MƗe6me˨,fҥtvv_I&qwfދlذ͛$??.""""""2ayŋxsy׾K*Ӹm1M0&lN7؎}jm`JY8C2z7Nr.۶HRƲ'L9m&JxvgrD"m$I,u~==˲28ΰυpl<.cDeXE".W&D"A*QsGDD0 <ϥo Ϭ@ @QQx׍hro."r5pڂ ĩ>\&6owEǒ+}1M0JM P ssCtuo8:9sg öm>}:@LӤ3fJ8p3f ??ISSe1k,gܹ#;Q5]n[ XߐW̟6a9v ,L&1[DDJm3g:::enT۶8 )**qs x|;<`NDD~llvwܐM ˙x-aʬ,MRR0og.ׇw=4˕0q3^(a4LGR~s6q]r:@wݬ~xCDDvlOpBnx~ 1[Vdhh]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @]DDDDDDdp5m `Y pq|$I,gIJ,nw+""""""0H9LK/qrss;w.*SLR$=;vرc|_իWό3xG 3(ȑ#lݺ??h4?>wy'X`YYYD"2ۗկ~nr}QPPp[IcoD0X؎<ݴ )"es ; {I9]"Hp\5幤,wtt0ydz\.6oL(&D2ۘ۳Flذn@ 0$ v0]vEDdlll3NqqR]Q{H9$o!/"""rZ3n0ӧf9BYYpd2ɍ7c=fA)**l ~FVVsŴ `zRt,/UDDDùuL̙3yx饗p,Y2rrrpZ-[FSS?ӟtfFCee%?<?0}DDDDDDD&1ir뭷rJ9>//|+$In. ,?!eaƨۏ\tncǻ@pn7-\}4 .gJBax޳^7M4/z {ۓO$؁ vHM=]Mg/ey Atl;"a&Zg;9jB&q_XLYM MT4\cSPPκ<&txƻ""2Fc_>ÍKo?;9œb^r""""fi @]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @]DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @kBqH&ض Hp4qq0M3m"q|>awEDDDDDD&1m~z}^//r+P\\ܹs),,$Hpw{ny_jx<x]DDDDDDdS~q֬YQZZJ8f˖-p]w?,8qDf|n&m)**~S6mu."2Et˶ǻHg1MS^,\} gh)@oiiaʔ)̚5  n77onM,0].~h4̙3c*\4LvFˋ\lr[ d m[􎅃5Eˆyc y2^{vD"X=rrrx7ٻw/eN~~~fX,FII gwéS1c* UTDD8`;.|DXo1}Μ9tM'?!''瓛ԩS`ҥ:tq~w~'}{{;*`3f0y>v"""""""ʘt̓>w܁eYbq{1EDD pIJ{IyLxCDDvle>.>;]sj|+WwQDDDD2q\DDDDDDdP.""""""2(@L EDDDDDD&"""""""t @\Yx`,e )"""7.|tח-b]DD{kb\ЭUU]]DDDDDDdP.""""""2h ȇ0 4Ɲ $]DDDDDD K&twwxpqmP(;k"""""""WX2d``{d8x{6 EDDDDDD0Myy9>/zn6 0 mƻ"""""""5.||>_&8, ˲gm]DDDDDDC`Y۶mcR)M~ZfMDDDDDDC`&555Ioo/s!++Ղ.""""""!).. _pLQ.""""""!q,kF 8X삋HaH$2quzĨ۝~ B]'eYh1O7;C~~Y}}}g5]DDDDDDD.h=cM("""""""-&""""""2(@̚U(Hr2k9ߖezǻ"""r\L4M qL8DDD]DD*v]‡r2x< EDD2.""\DD]DDDDDDdP.""""""2(@LYSew1>ixH&uq?.|[\.Wf3}vgxNRʄWivĜ-""""2^>z$!8Gr[4|ez1MP(D*"]<x= F+afe]@:}3'\TKQ"""""4 0 ~~LA2q^z^sa?JЀm̘17!z50 xL҆;Ç)//'???@*kFd^F$ 8$ n;r'F1qqXl999z466E$!77I&M杻y׳o><z+\s D˲2d0zҩT 3_UV֭[yzL>UVxHRdeeoAuuuɶLJ2/mXɤm;mۼ`6r˄a.uKK1ϝa!}A_'//o138}CDT* <mH$FÑ^[ϛ^`_5[l!Jj*b^T* w,n͔t+pZoKSO=E]]\O|q'wvc^gްI9Sd{q{$I:믿@ ஻"Sw1݅k.ǡ|Dy0/"K,3}\lBEE̘12bXfeYzxL&3cEDDDd3@ORlذ[n%KM{{;k׮%h"M[o vYYY׿f֬Y,X-[FYbDW_}ŧ>)8~87|3.v^z%/QUU]A/^Lyy9.z3?VzLX^^N[[[&STTDEEV>0۶m^l.\HAA  }v0Ms2{ ?[deej*)))go-[ߏ磷CQ\\̧?ig?yyy$IxѣG{!++C;h۷ۋa0;ҁ7СCl޼>8uuu_۶;" eZ{8@SS999\gHcydժU$ |M9y$K.sN<+V`<O^g̠< k֬//9.~inv/_Noo/yyy⋴Q[[K*رcp}zjB^+V`[n9sp]weر9;w9-[غu+~O~ܹ˗sϱj*ZZZ:u*v"quױ|ݜ""""9z<~<r!^{57 J1w\Yn}}}b1Ovv6_ר,VXŋٺu+L:5ӺۋcΜ9PUUŎ;x<|swߥ 4 C? ydeeǹؾ};]]]~C(>o6---n)//DzOeY~<7n1vxn\| _  k./Ƕm8q+V`ڴiڵٳgj*˙7o۶mioon#77;wrQ󩩩r}y2+H8nVZŶmIJ,~Zf sa,]n6-[633&әI&Kر[nVjjj瞣H$͛elٲ|V~?̙3Yl000@2dҥ477rI曙:u*c׮]466r /_TUUq}w^B0}t/^u]o˹ky3 Á~m^شipM6Ν;9r̙3FDDDdݶLKƍYv-ضMNN{U_ޟ}zsLhf4iTPClj뛂8yS}牓urc߀1`0HF*K{9gΙ~Ό$HǏ{^owq]wQWW4* @jj*z^Jߌt:p\twwQQl~dvvߏFc/jH$e~~Frr2l6tdfkZBnZ`H n:l6$&&^1ϱuV+'ǔcf3399``~~={PRRJ׍[yGhhh_?UVa6Z\u2Ŏt8&##DvC=D(" MYY-"Nx{y[1J%s[lARARR ),,$##od=^APpSO=%mݱX,( YbIII IMMo>RzXz~ZZv]ڲ[ iCDQZmx~gN'/((g{ܹsdggSTTģ>Jmm-$$$HLLbinnfppP:FDld>~.W_Fl6n::jG$TPXX޽{9u6lXDkcq;$%%hD"vZ-~<999kzj um_<l2077GeeWO<;Å شizT*V'-h%͛xB!)ҴcegHS*C{cQlC4`0T* WARSS?ľN':N҉A j|~Z-:nIc ʟlܸbt:STҢc-Au=*JZ0}.Kμht:EA`ll &9 B5066@ZZ\M|/?j~q7h4 k*q%s%`>Q)}~j#ek>??`0Ħ.O_o166&E?,/oZ쵥L?A222222222AXXXr}fq) iԤ㏉A>_m!A潉Yl^baaXL\\n[ҟi1TX\NFFFFFFFFAXZqyǍR|,`0h "ѱ䱅gpIDATB!"|nt[ YHFFFFFFFFFFFFF@vedddddddddddddn*7y\=V{rhh4z%.'VV2N>P($՚Yj|Qv+########sPՒX8 bY+07'rh4t[˸~#p80L7AEÁj/|A, b||xt:U' ^qU9ADScc( A@E(JR,VIT.y:]ccrT]X;W-'Y|qe>Xd>? =KŎ}|:/6 wU]EDQD&&&PT~RRR>h^M`~~NRRx<4 999t:z{{IKK`0Mff,rP*D"L&'N 33|;1H$LNNnY 8usW~gAEH$BKK n[jPZ|̏~#Z_%{_Cff&DQRSSZ  xtP(f^دq_0׿5NnWN':NrTGGGYXX 11)Z1-vïk~_gxxGBBۿ?eee}%''cOBBvJ8d~~^9ϟkTTTPTTēO>J"==q(III  BQTa2228z(߳eL&-u?,^k_O>$۷ot""F8yΟ?=܃磧RIff,]ioo' ri<=toACCzFFF_G:::~Ʒ-/zq8|>{1 ;vF|>L-7nOOwիַczz"7IVVoL&J}{dgg=UUUh4.^Hoo/;v`ݺuU0::/KǙ[twwꫯ266/K (ww|{ra0HJJooя~lٲ__ٹs'PJ%ٔR[[K/ďc~b t:DRZZʃ>QQQ?8 cX|-w?\n{W_}rfggMCC.Ny:::lݺo|ḩXUX|%hW==ˬ/KVVPyD"D"(lFrF޽loA4% -SL\ӡhFJvxz|u!Oh4wͩS%++@ t /7222__ׇfrQXXX`ٲeTWWӟo~|ߧK^^ַ?cΟ?Off5AXF@lfNKK G+_tL 婧>ׯ'rҿH$OOʒ![`X%0??/-|vvb!pQ&''Y~=??Ekk+s'Oŋx<G?555>|dժUA^}U~_ȷ-iB:$, 矧~|{h4b8v˗/'/~R[[?owJJJ*J!ɰn!55'|o|DQV^,Vg?/?8򢊌̧XVn7yO=>>ZͪUh4G!D(((`?JŪUP(O<9233o~É'dffJEb{v;dZ-@l֦MHKK斖fggc٘ĉ={VXA4`0͒T*n^u xo.'"<쳤T*|X,Ν;ݻ׾baժU[Z[X&}k Ɩ__9~8V"//C_,Faynɶl6###={T۸qdL&"qqql6~mFGGy+YrUvgӦM?lFGGll޼шRnK\9Bzz:6M|n?f*%io9r9222jǏ B!Ǘ }>|@\\Jٸq'&,8Zǚ5k!55e˖VYnt:XXX@V@ BDt:Wl6 )..&##NEE*+WJo?D"Yb4q@~?=[n%)) RI `ӦMQTTDaa!k֬`0PPP@VVqqqTVVVYbϟGRϦM[9^V+2***HOOghh}Q0L*P(D^^-"-ի_VUUI/Hum~_bSR HKK#==RV^MyyP?dddD`ʕh4-[Fjj*z[rJ&''D",[D~mN)ZI]XX RUUEZZFGy|***h4jJKK)))AѰj*Z-YfٻA6rJHKKDJ}2LdddP]]MYYӤKFFFFFFFSpPF^_rp8A`nnNJ ^, If@ @ ڽDV|∟B8ۍZK&)j؋s^JB"a.>?H&!!~Wi24q_>PbdU ~rM]MZ$NшF:ef?c"|y^~_pi(N8)#F$YR+b[ ۾?k\F{({w+>222222222WG&''QT%ނ 0??F!>>~gWsУ WxBL&GX-V{~T*WfÎ;QB~f'NLMR}}HaZ-,|z &########bvvNwTvuU CE&&&Z71R|>T*էB80;;iG!K'_SB\\_ "P($;Bp#|z|WWu(++x4 ׋ZF000@kk+`MMM~|100`@344D{{;&I\ b41F1tuuՅR\7zttzFFFX,T*%!!A]\Y*T*ߏngbbfAb,CzzOԔ&f'F9fR Bbavv&LUU B~DQʋ.ftt0 HqqqjQ P($-H$BggLF---h4L&nwBgy*Īp]zWW=p˗sq>ᠭ"zzzbΝlڴ /O?jp԰vZJ}llW_}FkR8q>4?+"T~璘ӧOX,<3~4 ZB!?N~~>eɸGGGpDR 0>>C0<<h&&&gy~m^/OR8tżksV+pY()).-MLL}v>̉'BN8 /-[0L N<Ɇ Rhx>Ή'&>>~8iA={0==Moo/g?pi-[+0Ν#!!#:|zjj*^H$9x ~Ky睬Xۍ l۶zM6'0 dggSYYIee%ϳyftAlL&ٴi5MBQjQVVF]]TTTOgg'6mjRYYI||<555lܸRHNN&''aΟ?VVK}}=t)//'77'NPUU% 쵷3>>l&//FAA/^dڵSZZJqq1gΜjWVV288H$avvGn??( JJJq ~権1D"ٻw/ݻwÿۿatvvZS^^NSS.ccc R^^~Í|JUU -[Fcc#%%% P]]M[[YYYΒٳgYb{!PSSC8;tgaaasQYYyCtBCC;v`0`Z9quuul6~m4 N"==ǏIgg'^W~2==Ͷm$gyff_(Jz-rssimmvinhhI(_pET*_X,~ I ^G;/2ǏgllwyP(ɓ'IMMedee_@ kRSSٱcG?gΜ!;;wy~?o&^ϓѣGʢ ()))8N-[FKK EEE SPP7I4GyJXXX q&&&Xz5UVcoNQQMMM[Ʉ燐Nr{zzxh4q1$Ν;Z+h49s `Zy7P(;zivڅVn3::ʮ]x".\`ddB 蠤$龽 Z daaߏ륢ɓ'ϧA8}4+V`۶m߿`0H &555B!?SUFFFFFF8ڸq#===ر/ynvobrr7xF#Ë8o=5] H{ի{c#V+@G}}=vrfHwBA}}= <EJKK9tV^"^cǎ111Omm-( FFFXXX! D0u]Yyo͛7sc0җVejjJ`1|+_P(N{%??_Zjoo' QTTNwwb=::J8GjFy1L[,CCC(J< wJLDVjgϞe||c;hjjb,,, fNf%FR?K_q}裏h8y$(&33χjb٘#`(--e˖RjZy욱mK R455c=F}$ h4)?hP(T*~? BʎSbddQ\.YYYlܸ8V^MBB]]],,,|r0 000@?|>l6~d||_3gPYYI(" /]w||L&RSS LNNJbIzz:N^avvV*,,~p8x^iSSS zy줢`0yWXr<311RbqFrrrfK,"*JjQ(bJ$!55q: ǟ;wiB(J\.cccynOSVVFpjٸq#`qXv-vi 9u'O$++ Icc# /QYE͆(ttt0<< e%tww300 *"F͛7xpсFJj*Bl6Wf۶mMww7>o3RHKK… }ݜ:u"??h4J(bڵhZN8Aff& 裏^ApP__OSSIII"iZiHrQ[[ T*=.\R) LRR؝h4fffHNNFE.^hDJm) \.999ttt0??(dff~zbȅ x<V'4v~~z, [neBSnn.V,T*ZQfggm%jII yyyKGJJ k֬jvZRRRx<(JJKK),,$;;M61>>Nuu5:~L&˖-CR166F~~>477hll۶M]<8]Pjl6J˗Rgttn sQzSVVFbb"TWWcZ%]tHLLdppJ,v*b۶mXBfNNN[la``h4Z fgg%AAfVywQ(rrrell7Rx<444 [n1-[&锴aZۤB`aaL&&&dݺu؈^箻"??UVIbߟ ْHNNZVTXXH\\;Acll1n $Ѳ2N'III S[[+[<)ƈ/ڹ,VqŋcQtuuI6I}]IHH SWW jkklKf[XXd2}BZgϞE祲_2?U")))\.3g066l^ 344Dmm-N mmmRvj5C+VoffD9[CFFFFFFFczTA_& QYYÇ9}4~-[SSS~F^z%~_}vz=.\?`ڵh4%${;&aqsr8xx[oQWWǖ-[)9Buu5⋤HUUN_~|PTrطoҢî]&==tDQܹsرM6P(x".zlƘٳ|>f3?Q*L&J%>,z#GHe>fffc2P(na<Z^FGGFtvvJNycc#O?4999fxlFA`ppfg%>>zyT*gΜAٳgctt\zzzѣ_Ry8fp8L[[R,ɄarrCccU\.j288(t( j5O?Tseݻw6o,-V300̙3[BA$N8~mVZ%Ø|^z%x$!//fOgq߷ٴi$500@aa!V>=wqǎc͚5q(rU^Q1Ldggs BUkfggsrС BO(GZZ<Tw~w(r(]g``V\(hZJ%$''SXX \L&z{{ C=D]]H?륥`0Ȇ x|сjtb2<455QWW'K?O(,,dddłj>0dff  ߿Qt:rJVZo8VZFj5zZB R[[+կgyIOOرcRǭ 444o~zv;GI@T"^z%)ncnn}xx8?$O0::Jss{ѣG%=%%|^墣gr]w鑑\h˖-[W^?E"jjjX~=vfff^CP!ϓO>Irr2.۽^B:^aϞ=Hee%DQ֯_/e"J촴% h~R]w%-l*JYv߿ZPZZJii)999ҵc k|A~HNNf͚5űn: PVV(3==8T*frr!Ξ=KWWR}9.FFF$zxg9wx^~?0440hd2 6P((LNNFǏ~#|>dll>fggX,Hgg'ccctwwvzzzo>vɲeXXXBgg'j8V\Iff&999TVV.(( ] F"233ioo̙38A^c{] èjN'OYY{MM8}4O?4B!)]`0(-JbXp\rq9B~~>mB!iΟ? NOO':FQh4^Z?\<())ԩSKQ\\Lbb"6l`ժU?~5k萎ttvvvo=<Ft}Q(~_CCCJڵ{RZZ㡤Vz-L&*! a ҹG1::fXd={=522222222{w0333Fl6&V4IC~~>t:Y|9EEE[VXAAAk֬h4ֆ#77X*p8fj{GGG18NRRRK) zL&~F';;>BFn:AkR0n222ضm P__bATd2rHJJj|z/_hdxxロlzzz{怒`ɸZ-F L&)))v&%% n7SSSϳm6IOO'11ߏ`bT*~III){ЧP(a VBmڵkȠLp:jxDQ`0ȃ>HZZ_"q 011Abb"sssvn7zP(R$>>kl㡭 w܁nuQ\\LWWlٲ>'--p8̽KNNH,ftt%B2X瓚Jii)YYYL||>>~:ǎ'|rbw$رc"YYYlڴg:ueddddddd> IAq\h4%!x8Q"7 Ĉ!’^e1ѯiCiĈ0l̝[>91;~W@57Q1_}.@ey%++Wb6<(PY^Iqa1 ynU[[oz\+J:&;xyJ* blC6G֏Qr 9̇q|csirDDTq6m'cc1QϏ \!*.ix{wgQilUf:D(Rnp>W߸{ )0d?-}A:O"lNEȷSW[o}|" Og?}SV7! ~ _⿉8P:1_ ov>$,Z?b&^qk<'^>]|*(J(EC0y~s>Xd*ťlh修UJ1-j^# ?mg~t22YhUZVfĬ5D3cP 9I0&PTAp HRúutt02P4DtMj31iM\,\[.c1',N[͔gL+SWbihb=Jib)y<{)@ҳ6c-l܀Vsn*S*I6&5El4B*+EC>|`UЫ #'a`9@tLp\\?'ǖCyR9Q&ȋϣ$^G/3o|aƑk%sW.,~I_Ik"͜FL/|jI2@$ы,(O)';..^C!vDx^YT$W0~J'[4{ a;;FJqw;ưs> MŋB>ׂomܑs;wtbG /!ٲRJo N˾ /ߑ[|lШ1aɠ{fpY~~E„B&ݓoK6%"ehw% 1k#q8]ԎRXL-q'?},w1{#D`kV6fm$٘W> Ae_DҡT(yb|{ݷ1iL _ʒ  g=WjN%ٜL% BE(hf\&wE~j3ٔ D1j6l$՜JIB Ye#ۚլZKyr9 AA![6O'SЫ'cTYٗ;U UUܙ'q|k=hRUtNs#j-9[8?zBePD'/i'MUgu\[tM)uT$UT(P![ 0a9BIb ee:CuZti\7% Q\7ގ$XŢ5y<\%.c9s=Xvۘ5fVF2&TTQd/b77% R8>p2ncE f6 %R'Lm0除^H\L ܖq#Tng7W_F`֚Ɏ&ϖG\hp4EhLQd/n 0@X_(voK0Ĭ5 SXȀsvo@,Z =?$A(vhR8SEl/gBM%x}<[B R1Jf\&JA`GT*uz=y|K$!͜ƗʿDL2r;(}itS_wsnhQ\eN&+.lyc1gS&7v]{ f@ErNւ(dZ2qT$W0рN#H3pôNʯr|s79{)_," DDBCd3wTS*O,{(QTeFp 6jN%ǖ}BMo#+.;r^J"ךEgz(_NE_E)ʝe %+ _8Q1J!<[8sѷ݊@]Ӽ6?!Nq!Jmf~wr~<( +BoUiv bӋl@$yV~ Kb AoilsơS)S7VǾ}zgQ J?N4%͜MocY2\=s=tNw*uVȿEkA)s6aWzf 9{3-S-׵ Y+.DQDT3WbMr9^$͔F(7G#ÒAw ֐nN_Q)ttpf $ѫxg(m&3.7ti޽qmM_YkF!(H2&ke~lI@dUQ)aQ*K[B5RVQcDT85F0}s}46 yyw]ey[ɳQ;^{S:g:&V&NJy{ryrjk8ycԎb֘qnٍ7tikƸ{}Ge9(mt.k*i;[v5o+l7n5dL3$#######t͉$PPDr\2fA7N3fY26"bgѩt6:+8Nz;6ɅIڦH2&aYѩt#s Z[-6*}a~GF7XI$q8 Z)Zs)/ ǖm;|!Qiȵ], λc#՜ʊ'9ѩtŦ z.&/>\[.+SVnIg;B`yr(O.'NwnypAdwh&|stusph "Hyj9Jxi O0D9ɤg@$@t'ӭMQ;VK\/tvP;'gGBGow7/|Cff0 L.L^rq yp\a!/*t) t=Jx#--tvػDlyAuVq.9Q4* RK5޹^4 a? ( |sUz&DT zhnwhHP!F#deaҘ߳! -O3g=|`q8s9f 2uR`'NǡCFLJ}Z.P;^K\ХSC fokI%&N'E C  I5rz4mmhTc""km3m<ɔg9DZƠwi4 $in}1c1fq0t30/CP22mJAIKd3hCiA/99>x hGLt8ш`G28?HT xf|3O6FTT(Ϥg]äR  / uT*lLx&a|aρ{y<6vF\#*mz0: + "Ir9HZEka}IR Ʈ{dS2'N5ۅ`la Ol7-S-L6݆;Ƣ yQ0 r(5Ϩk$S)93|.|U%{ JՕǁ@R^_wpH 0gG˄]UBK!_N|e֖A]"J->PjU.v~eύӷӳ:s-`偢H4&>΁W*K+ĒL|J,%5Ҿwk߮+_~U߫r5w.ʴJR ]*U*[x/ ^}us:藫_^{{|ԣGuпu+>v\h4TB$NEJ-)+w}BD(v8M#XV<s#ik?p AApN}‡"f'#!"D]" WE#TUfuɷd+šK‰1Eih6znZZSaU[o>bMV[[Ƥ2]O}E}vvITԇ! GQT:A%P}>aJ3Y|\vA}aZ%&͏!_^}F5>gG7h8Qd\FFFFFFFBn_A,{^^/ :333k}ڙ`0`0nvW>Q^/O h47e(2>>NJJ k鳈}7OCCCBז +B [O8~ϣ(PqzaСCh4v;>ӧOL||MKK YYY\x3gINNcǎ166Frr2n;iiitttpI>ZFVGFFƇOEww7IIF}䘝F9v}}}$$$jFKsjjT Ǐ5p1XV(7/%yaa?w 0>>J"… 뤥o1#L("c0vM|| @4exx]vR0Lűw^eΝ7v{%)) JbA044Fl6chmmftwwX,`2njj@CCo6zQ9x }}}8q ./pE$ /t:I?_Ajjjd2aٖ>Ngg'v~|K_СCK"v7^;wRVVƪU/N|_R;1gdtt.?̾}p:LMMc|A)e`iii[Kڏp/yfٳJŽK8&//??ŋT*V^+p4[RVVFII wy'  TVVrwKlذP(D__333tuua2&77&@p8|#(rQy' `QffflFP(DQѨt/_ΟٟRp7uLW#''> v;TUU]1nRB@PRGQ ̠P(P*@{{;^\DQDt:imm *97;;3ϐ8pɩtҞX867+V۷2&&&سgǎrR--l ywΝ;Goo/ ~cEp8Lvv6Z&(YYYhZrrrhiiYm٨"..˗SVVƁغu+pKuM&uuu.i?'''3<<ɓ'h4x"$%%Mg~~|[JN:ݻ),,d|| /~hoogǎfoveddddddddn+8c1Lw-EzHHH@ѐOII TVVMII Z $:,xf$z=)))Hrr2Z4 bRRRxO~wff-[I""333$$$\q|>JV{x<y,ZmPT O}ܪľ6s$#######yFAW]Br`7@@ Hz >//±qzܱݿq~T;0A^5E?NDQ$ x GQBUύ-*,^i[@_(VFFFFFFFF@5g^}dOJq>)Nq4KqS#MOq$$$e>)22222222?^{ sD #/_#TWh4D}}>~fO-wwwohHJJp뉏'w^Ν;GSS FFF8x T*|>{d2'!++ BDqaHLLj)"fh8<ǎcvvtfggٻw/t:ywx"Zjkkywݻ^/w瑩NR>q555aRRR䆆K{{;h4i8s 'Odaa4:;;9t399oŋ8c~=3Vb---f*TŽIRRZ3gp B6wySNqE, ~:;;IMME'33A$o&󌏏Mnn.|>^u>V텅L&u^ć\Ҟ%UUU)ݿyYXX)/VqVj%744ā萢:ϟrI]]GazzZ ########ѹuǎ# QYY޽{ !!#GzjF#(rAn݊R_d߾}l߾^ϱc/~AQQ:~LRSS%hoobp֬Y|Yfq!F#III455Q__ϖ-[p:\.J%{ao,?p/+Wvs!6oLVVJIصko@uu5鈢({eÆ jFGGlٳ4":F&''Y|9)Yb4ǎ#99$iJH?3g`2PTD"l6'NIF#Νh4ʅ hkk#!!&~i0ֆn)q bo~Ú5kx(++nc4y뭷(//T*hoojsϑKrr2W8={FҨa׮]l޼Ǐt244DbbǢ|+t:9}4maXEcǎLRR>#G044JӸnN'iiiLOOs1FGGIMMe~~cǎֆ$55ÁdRٳgٰa8q@ d! .e:uVv;LNNF@#ϟ';;n?7P(D$APWWj҂^ɓtuu >}zj5O=344ɓ'D"vN:Egg' Z-m$(QWWGNN v999XVn=g2ξ%#######zz X|">??O||<466())! fnSTT@__ccc_RIkk+]]] qE|>vvvvZ^&&&p:< M6b t:z.fETҤ+V@skk+nիW N:ECCf-[^_g999ѣG`0al6h^͛)--XYY&rq8(J\2H$/߿H$ž={줮'O/ /2qqq,vBӑ@jj*{졧+rŮb- FՊJY3h$##bN'$&&R[[K]]S__$]عs'qDQ$..*8(RgttC}lc?ܹDjjj8F>̫>KKK /^$~n7JR^ϛoIWWג~tvv+B47 ?Op\ىf###vSmf "*sȻ˻k477V%..,fffصk6]v/(j|M^|E^z%vlٲՊh .p9"1??/|`Xzq{oPT.^ƍe߾}|>z{{ioogO[[>,322Bwwm*JT.s /̪UƳxL9rߗ"±c" JFFwȡCp:ꫯ裏dk+ 333+lݺB wd2m6AFDQ"騢($9lذA*P(M6@4%''jn7mmmLOOۋ` ==tۙjF7^F9pnT"ppI0L277CӑFj:|l=5kPSSCmm-+WY" ^&33 qs]wa2'55kbIJJ"--4RSSÇ355Ev;ɓO>ŋl6GGy 鑑\0uuu388Z&99Z͝wIBB---j t.8/~ }}}h4J%^Wrva͚5hZ1 l۶*)*l0K2==JÇiool6s]w@$ATJsT*ԩSXci1k׮%99DQ(v vǙGVK N7b4ˣ"N:ٳg Bddd044ıcǤ-(RPP@II &% n Brr2444hLAl455-Yl2n LFFTVVr)V3g`4gΝBg[a41 R6ѣGy1133áCؿ?fNǁxijj\V,333~Q)..&>>Ft:hZdffJ #9###Fl6CCCGVVZ$Cee54̠1 \p\xQrDiii!`6Yb P(X|088( 㵴P((++CVS[[K @ղb FQSVV t:1͔ގARQQQ!9 KAAfy i`ffFz1gcb.DQT|kv}v^AR)III244D(ԭRPPn̿,eRSSeddDBFFeee 177GNNx<((({"\ saaA(677 l^V}w6P($Xn7yyyx\z^VVV!CAZ-7o& ㅅ TJ?hM6 VnLFrr2 j䰰@~~> )--ER ; qs8;;^GP&33k2kCCCH$  x(..&55t:u '?? an !JIKK^ X,Y\\fQZZ7DDDDDDDD~[򬽟5J%fy] /ϫzB,A q9N*++q:ڵ><*пHO@O$QIGGx^k`xڷE."""""""']"KqD"I,5% `P8i'1H$BD!yP_Xv~RH\qB^SY"%\SїM:Fb<.뒈DB('( B! 4?m'uB8^|H|1O>HP(q"`+)a}ƧB<"""""""""H$"K} xQ)χB@TD]]dggc9s KKKp8U(!ŋIMMh4%U;}4iiix^?NGGh]Fcc#@LfT*|2mmmillEVV022BVV>}*Tڵkh4222g}M$As9vM0*.|2gϞe۶mx<xG&vIKK̙3b2! q!۷J 33*Ґ夤,;v 55 7o׿5;w҄vd2n޼ɽ{NC. 0L III4662<dnn,loM8hZ:::8z(`0H]]dff2::۷孷buuU(022Bmmݽ{[n !/uuuBY>B5rrr+Z7tvv255s4 YYY(J֨Jpq'Nb̍7Br]v;dffR|!|7//RBh4|屺ʮ]0455)bٿ?*v;7h aΝ\t!illdbb3g,X,^';;B! qĉ쪤]vP(0B[h4F[ 33|>PüFGGe D"aaa .$̞={z*X _XX|ZZZȍ7X[[cddw;nyyFb8N^|$&ɘݻ呚JWW0Gm6vxO[[ܾ},N:dddp]*RXXqL&"ʢ:::66nHrr2̱c"77p5ϝK.۷YXXnsIRRRr ccc,,,FZZP6h4ܼy~m۩cee[na4ˣ/2??Oyy9*Uf3㴶>JQ՗_~Tʍ7(J<3,//seVVVxߧ%>p0{y5 @@HK/?6߿-[yM477fA3hT&nbuu .\CV+Xx<Α#GO?i&s?m}~~'Oo~gΜ!55Ç0==<۷oG*FFBvcVͽ{RRRBii);w$ dQRRݻIII!͛tww$jTV+###˞VHK.xIDAT$xݻwX^^;vj~$`0P(ذag8SSS {RZZ*ztww =Qظ(--eÆ ,--QVVFYY邋bzs-1WT*F4c??&''v&''a2A!J!//}ń-[`48' /ggXV^u(6t`iiY4 c6q  <¦VeiiTOLLp޽(D9rtg쟑GRRz^{={DRRrN233?0zܾ}GRVV&X> X뿦 OGG?D" &֭[ܹs\x< 7VVVbuu[n:::8u===lذH$7͛,--brrEywtha999,x7c֭-HP(H$d2r\Hl l޼Ξ= 2L8&a!@.p\o>z=F|~mrfggP*Bڵ xODzj5/2;v@p)z:x.$3[YYaddLAA2ifR2 (J!_ףj~F=x<<~VWWIOO'166館\Ąo2 \.g~~ӉR$;;A ^Nvt:zq\jLLLɿl6,--QXXHRR deeV%))K'_5e, KKKLLL J),,$99`XCR"lL&ccc y.\.CCCzJJJXXX`nn< dff`ƯP(:LVWWf~~^feeRjp-RIII 2q򘝝bVYZZ"-- PPPjzD"X,=<""""""""_|?kkk;*пL蟅@eNS}uuJVWWٷo|yT<*П cܝN'W\vٷo!tyT|=V z$%%=&ПD>QMϊD" qYń8;~dR):egmg x<:g% uJKBdߘmZDDDDDDDDD~sH$b1f3rx<.h? NAIH(XH$Γc YYYݵ`N'@iDZOM[܈|~eD#`ZFP餲VF#x'OrM)((@344ĩS(//bz-F#zK.q ^/999H$0pVϟOdu|( J%7nLOO2ǎc~~ 6LUUMMMH$innٳXVf3^z <oDQRRRnrrr۷9uP(7ǹvvrrr񃃃B&cǎq-zzzؼy3ݜ?!RJueff,o$v;w!//+Q2+1Ot:;wRSSj\rk׮xHMMŋ\vF#Hsq}qEH$<f]Jn7twwi&x<_H/ǃ^=s-z{{q\ܼyĄPIDQ1x^>|(dp0HV˝;w8q,// ĉ'dBO~B)K<޽{T*:::X,B)UUU\. xPTB `0(x?ʇ P(Dww7p-[py^/TUUqh4477/F9~8---Kjꨪ@ @mm-/2gϞuŋvv{r."Q*BɲP(pكD" J~~>HK.qemۆ륹W^ybd2HMiipU8= |uuu۷ZM *l6zl줺ݻwsbPF~.] ۷oڊZfpp,Jvʢ ??`v#Jׯ_ Fׯ_V_t:1̈́al67n͛HRt:UUU~jJ<*Я_\..p z{{ Bl6nݺEss3lڴIT[YYttt`eqٳgy&x^jjj"==VR)>diiG266FVV&h4JSS7nH8e~?333a|>/dddFcc#JFr IܹCFFW\add>555r5JKKIMM%++x<1Q^^΅ X^^F*rĉ\XXȦMD"dddV욚4 &T^/FJqc||q|<.]b|>bgyZ|_$444yfژg6<tww;nee8x<ؽ{7۷oŐJEii)999VINN&//K.p8c׮]D":::sݔs9Ƹq%%%244TW]CCCQVV˗͛œK$;wH$x<={͛7E{{;nBVpM233ټy3F>|(|oo|26LmFZZnjHOOgaaF\BCCM8 TWWv|eHe/^\j5>3ϰD]]333 ƙᥭRɑ#GB,--=vMJ > KKK8q{n]]GU[[w菄DսGOX,B{gTTTp-܉^m3go\^/'O$''{x2[nE.DD"~$6oNaa!%%%TTTTBkk W^yD?F| ͛IKK#55 cZlHRQ(GKK ۶m#997,199WKkk+_@.|>tvv?я8x iiil6&''9vgΜ`0FLLLߧsmT*zwM[[NbjjLsc㑒@uu5h4F#uuuRd( d22cǎ1==,//cX0 ( f3ׯ_gyyB-[7$%%Eȵ ˟*"ɘAbg2L𠩪bjjJP*ڵ˗/siR)f7xi6o,yOKKLOOFINN&==K.T*ݻGzz:nbrrߏDѰBFFP, 2a\z"9~8BB^Y """""""HN`vK@ @YYLOO`0qrVWWdi (KKK / A뙙nf_5B,crrOaacI> ݎFA2<Fez=hqd2H$FGG rx=|r"_._y< ?z<GP|lDzp8tqOԐ8.$2c0#99Y-@..뛈o˅JZޞxq<n7`P-!`0(iiiO}NT6bBF>u/EEEz/.fggzt:l6Fv1)S$ vh49&qG/?<mZWr9s ͂/cǨƍD__[nEPt:/dBQYYɵkׄl8a7`jjO >O(S[[Kuu5ccco 6mbiigH4%;;F;FZZ d{p]^_YYImm-Nsj5kkk>}NFcq _˗p%nܸAgg'7oDիQ\\sgΜannB<Ν֭[L&\.'ObPSSC4pM|͛7,p8cfj# :;;9ugDP BЀ\.7A8`0ӧٳgj;w`Z'sEٶm>6^}U6l ԑ.--lذAxvRÇ#׳o>a0ʸx"VBqq1LLL3ϰa|>(v`0p JJJD|LNN2??uFc֓OD" F#t /f2Dӑ/{.*[DZX,deeQ__ŋQՔ 0Bmb(ΝJņ tqT*eeeH$4 6|l6>< )))r!J%EEEhFܼy,VVVk׮1:: 7n  i&XXX;vAaa!J .`Xظq#;w… hxwb_l V|, XӧOhHKKfqEZ̰cv؁nG" J#//+'B% >M6a&׮]#55ueuuGbXܹsNj,mƍ9vsyz{{YYYaϞ=O-Rɑ#Ghjjr!ˉ㴴PWWGVVֺyhZ87Q*jF#.uVRTc^XXƍ),,d۶mddd`4CRa(((ҥK pYv޽{#GPZZJ$ARgq:撞ٳgAPPQQAAACCCtvvxhmmBٹs'lݺ1FCii"&HlP]]ܺ'mƎ;px>NGGlڴ]vq]Z-~n^ʏ~#f3ph4ʁ߳m6Z[[]?q###?}{deer8~8%%%p8G&^gaaA(ϧ̙3$%%k1<x^fffx(((`ddF*n[*--q8O,K bx1"㔕qb߾}\vq8=UUUnX"v͆fCQ\\Lff&>ZMrr2yVWWQ(BƍDu3Xb222hhh{پ};Pc+FC$!D8|0 @۽NE"Z[[ٿ?2 N'8.-[͛7n · n7B,URRT*ehhF H$B0Bt: G޽{j0LhZF#PXj7n0;;+<~`0)jq:x<h(Jb@ǃV}up:lٲRN‹ZZZ(**d2ݻwq:ϳf#77ш餸l!gaa!8N^}UZ-l6F#z$(,,n7'N ''RɆ *AjW"v݅jkk><쳟#eK. Gsl۷y%?S\.399ISSCjj*wh4IZZ9tpjr / @ww7&+WCfǎtuuQQQARRӃL&###CG^^Z-2 RRD*hP((J6oLuu5 tBu,#%%UF#^F{9U& ^/.]gݻw300@FFNJn eeeJ[[H$Nran7:tm_"RHOON^~eFFFbdddDJBV~*++h42228tضm{[p\l۶۷Rd~~1ytC"ꫯm]xA^ʮ]|b2d;vݻwe{9hoog߾}v~IMM_W+WT*yW1f˖-zN >Af2ܹӧOTTT~.]Dgg'7bTUUFٿ?pM46IIIBB!Ν;^… s]1LXV޽˦MHNF/Hp:,,,YzQ*dff ֈgb8 W*( ffflGχbz!Xv4l bB$xd'VfeeӉD"!33$LZh4,RTH(6==M0,I>JE 61AJ#y^NNoZq8j!>vvۍL&#++ Vn,2@ FTFQ*1==OJ(‹hdyyP($ܯ%55u;oY^^&a4dyyÁb6jBYaafff-,,`6v`0zQTaR`I<ϓgnnNo;;lݺY<VBA8޳d2㤧 yIJJbvvRba~~/yHү]/׋b&w$t +xur===jXXX@V 6~?~_I5fqqQfbgeexXXXh4hX[[ZfaaAXkRSS b2P%Xz=fH$$PJEvv6NߏJB֭[g2rrrg~~ݻwY EffG'r<ÁlF& #VdtLjj*FYŒgee֫X,FÁA.2Nh4bf ײlh4ٽ{G/)!Y[[CTb6>T<*? u rQ]]gę& /@uIKK{,QVCCNYp"RWW <:T݉ǣ]DDDDDDDD"WVVp\Ot=HA!&Ӟ'PZI#Hp\mw"i'{$ 4O>uN'zBTQ<B !J"_m[(`0c&"""""""5@"\.Dx;2LO=or\H$ _K`0]Il&|럪%))IHRR闾<=Now|[m,j'9r@?꺟M8F?zO}c4H6Ic99,Dܿi!?QړQkGa $l0N'[W{tD" s>Dbɏ'񻉉 X[[O|/O3w>jv1"""""""~L H|D"V+?G&<'N֭[t:R)G\zR ]]]WbܻwdF#.\OAAp8,OLLLLLr>.>BB*(((`ii`bb͛7ɓ'' y7IKK%%77A4l6sY^GKFFrw}˗/e8UUU099IAAtuu2~:lٲZ?NQQIv ,//Ŀ'^yƍ|%j&Nw}6f3:ӧOSWW"ܼyOnn.;`وF:uFyyyBDIAЇ月< NQQWbDppqt{4\pAqq1ѣ PPPw֭[f9<.]"Okk+'Odttbx뭷s(J}]jkkdrEjkk౵e'XSNHii)jzjkk9wc* TVVP(|TUUBMM ԰iӦOp}n޼Ɏ;>3+.X,D dBE* cccD"***8{,*{rI}YnJrr2ݼ|>N:Ńx饗r/SRRBoo/?lذu]*0>'GD"aǎܼy\Nii)>^f#77'OgF#]]]XV \xvmF ݻlڴ B`ӧO /r9" h4466w^Z-j۷S]]j%## c˖-~xgRXX(DR)NtttիW9Nyw{.}}}L&N>А o&B!6 |QFٰawbZq{GUUyyy\xW_}A"XV233ihht: >|\%N:EGGrv222q\cb*>|(tvvb4ʕ+l60.\լ%O766Dpt:N(viN8^'99JZZZPTl֯Op8L4E.[o̎;hll֭[k.ǑdBYF޽{f҂Vp8Lmm-S\`ŋ9ry@VSZZJ]]sRSS;~ZZZh4ގgll_~gϲk.RRR\x۷?&{{{ioogxxXvwttO]]SNlfzzZX&''9{,{1 tttT*innF&m6ioofFGG9r< F /Auu5SSS055ӧ%33A.\,2fX\\$77._n'##7|zń(**+WqFjjjGC(7nҥK\.8s o իWh49s>1L댎bxPy";Cjj*ofԄJE.\j? \N}}=6mBVݍ`aaÇsyyw~@GGPRR^Ν;ٳTJkk+>,XK.q5_ <^>@PwŲڪq\,,,022" k.z=׮]lbF.^H}}=dddPRRBrr2]`0đD"h4 @nn.!h4RXXBu"0͛l6y&OFTR\\ %%e,!Ϟ=KKK J|4 x\8h$;;[ad2:A:B ''g]GFqFܹ&&&ƍrÝ;wXZZˆ tTUUaZٲe … 8uSwajƍIMM%[ojIKKfq)IKKcnn ***X]]jJUattdff^4558w:?~t~:===l6ill$77={e?\.G&qy DѰi& cuu͛7S^^"aR)CCC(J(,,d||)\/T*%77b*++?2 BDDDDD'>/iiit:\.<`,..Loo/ܽ{M6Cq]Z-nߏBs)oQTTbFlD"Ν;̟ٟ r蠾??h4ڵ5۷o OUUKzz:+++=z nls<bPRRBVV ,Tj%X222d``VXZZB*VQ8n7*[~aqx<8q/ÇQ(?&{GII >D׳ƻ/8FA0PP(1SVV?Occ#8p:&''9p?x<9s%p:8NEՒjT*j(Jv;kkkz6oތBNN ֵ5&'''55lA(( T*:n7m۶}%7B,T*Z`0Hjj*9997Jyy:!Y]]IJJBt:Z$%%z aXbx<[&1N'R\.'6^/L&J%kkkV1LQ*$''''$''311}lf xH$B8<~j5 JKKt:>F$)annnf˖-jJ' rX]]n6c`ɗdL&a}yVWW|HRz=F;vQB^ZFp:B(FՒlvNvv6PHD"~am`0Kղe_r9*JD$l6˅# J0p80L( N'Fhc$b x<1JRh4*H$fggvvӉyڏW300@SSp RSSY\\|d";;H$OSv;vb:::rw^oν{222(,,|sss\r~_Ç? \,_geeNh`0PYYI__ l6x ˹~: ܻwyrrrO~& QVV47nrcB/HIIW^y.Ұt:yℕ&۷j\z$ F={tb1_HOO_ȄpW*BpEE<|PD".%%%a41A]Çammҧ]yn޼IQQZt:sM\.w令$ bff|><u/]immeϞ=DT{/KKKLOO eJKKY^^͛7 X'HMM套^X)))Bmh4N#++yv 'BTRRRRdee,;T^'==5\‘#GhllrQPP.7hblٲSNq9n7r+WPVVF~~> gq_ ?h4רjyb`صk===_5ݻYX,GMM /yyy׿(J|M|>@,}]nΝ;DvKK +++R^^NOOgΜpT*T*oKii)o&f!_I,J%)))p?N,.Z'O[oQQQlGt:j5ܹs/Fם;w/Ɇ طoܻw[uV͆Zn etA$ JRX%LMM100h4JRRHݎD"AV$HMMpAez*X$w. Hrr2~ea%+aZD",--`ZWf3 Uz=^N2yǙ'==P(2 */w+~f` eѝ(ͷBh4b  HJH$\.,h4zjD"O=K$n7!EZ^ߏbk4R0 x^j08@ f# FzRRPNJJ :H$"jZv0V\.XVkp0diiIؘb T}P(X\\$ Fu+^/`łZ^ޤ$H$B(`0}f4`IzHRJ%G\ x͆L& JbrrRț6t:L&+++B! +Ͱ% h D1K7Ejj*jyFO*ՊD"tzl(<&0??O,CR kأHmejjJȳ~l6xQYxTxTkkk\|)))yڷyT$Ӭ>??OZZ:x<֭[n^~uh4J}}={Vo|wbb[nŐ>|+  YP> n[m:JZx4d7F5O>ibqVWWINN~, G!ϟǸ&IK}Ix^'"""""""""Oe '菩x<.$["IO".^7RH$ AYǹN"Bx*ǑjQX߀SDDDDDDDD!H>G/Eu~ld/z|{"i'K""""""""_gJ%pox\ Q%D.:PHF?v,g!q3 D[j{,{#ȺsB!pܧ̧ǯ*U^{t|cǼ|~㌏h9b ȵ|L<ѵkyD;,//y~5D+~w裟y|'O~VaMycغs痈ȗg?_&~H$|>!{kd2;ԄZFP;P__Ouu56mJ?gׇhDVsQ.]ۅKVeaa_ܼyNR%+ x"}}}122¶mۘĉz)((_4l6^p|\.W%fN>͕+WDpe|2Ge``Lr9ǎ۷ǹp555PTTݻw9uw%##[oE]]MMMl۶W_bL&c{H$,//p8HKK{bqG633CmmPVi'N'Nz=ǎΒŅ r ϟ'%%5=ʝ;wHMM%99.^ BDM|> z<Re;oݻY>77lj'ؿc=bT*"??J%'Jp@@(&p8L$<\}}@IPw}4h4ʕ+WBVVVx뭷hnn&VyvΝ; EEEA}]QTdff /rv;G^L&7ޠK.uV8w< ٳgexxO xF>IJMMET wDž lt'>ChZ.\@OOyyyz(_Ɖ'crrݻDZc루qO59z(vvsQh4p1Ν;GYYz~ygeEDDDDDL\.XLh dBU*еZ-333B3gΐ9~8bݘL&xWp\={q^|Ez{{q\K eUػwPQ~Y4 {졪}}GFa޽ܺu \NYYh>o HͥSNgV+}}}O >nJ0޽{|[ߢ Jbaǎ9sZcc#r#GLcf޽;v`jjQ>̎;\.}Yf3wޥPؼH[*osmژիd2A =ݻww)));%ի477᭷`0 HpwA}ԟģ]*RQQ磽tnݺ?gjlž={(..h4rM4 gϞe߾} %ʕ+Kii* ىhtrIzzzHMMƍMII ccc;wnV+cǎӃÂInhh  144D()\.Bi7xH$dF4 333tuuՅL&#++K_e׮]ҥKܾ}9 ++>x" 477c2z*mmmB!:;;cuuJW(wuzXVX,Fv͝;wFٻw/uuu>|;w(;wѣɟ 8NhZ, {졣`02kkk8pZillG?/_&--J?'1??OEE6mB">D"p0;;ˑ#G8s }~, lݺɄBÇٳ/ """""""?Fh\Wl60B}׮.vڅFڵklݺ b%%%dddPSSCMM ]^^P HcmmxHFzzz{.oF"088JW_}n^/?)..&ǡC~SqUMadd^Ν;ijjW^ahh>|ȃ>sss,,,Oyy9;w$77Rjkk Ôk100@ww76lݎbAT# QRRBff&}}}>}lj5jnv-dzz <|/> `Xctt0j.@vv6;wӜ;wnz8㌍ xll ÁjW^!_˿\v1<̙3|&//ﱿG"G?`Ic8^ZZZ}6zG?`ddDljj1 |> [lOOؾ};ON._cZYXXfڵ xS^^mfHKK#''L!^*INNb}Fjj*ݴBHJJb߾}}}FVWW9z(9999rD?OD"LOOhmm0a2`6)++>ujψ`0H( 峼^x<ΦMxuׯ_' VQLj%??ɄvzlGbHT&eaaSNOgg`qr9rJE h4b4h4(J !o"QAFFJAT*)))$''LNN\rU\.@@8pgydQՌqIoRXXݻwپ};?я󱴴 K8&;;޽{y'<ֶ_~b!DV;P*|;_*v<{G8fii Ӊ^`nJtrssB hFx<԰$ӧO344DUUϦW% v@ @YY^M<')) Z@.c4kO<GV '|>:rPTUbeeh4L&l6#||>, x50f A.Ys8L&rp\[[#P(0x<~?˘P(b"J1LqVWW H$RRRd2"nF#G?dn7PxϚ |b1z`BX$ b\Tbۅ2k>Z-ܓ\.' ˅G}}}LMM144ĿwX,V%rH$T*4 np8,ezIMMxbK{wIIIt:"`P@UZ-A8^WٌR$zp\N4E" BLA<g~~4"0btF1a4"Ʉ9i4Q* s OZ\.>Rz(J!NT* Bx<L&`Mrr2L(' cXd2aj~aT*<`iizX,T*RTXJ%Zp8,p8^/É6 ^B!a ytN'FbPHXy&'--J*y(mmmx<^xd2X5~?z ۏKZA~BuZP044IKKCP zǂV%d F'U.'s{~^VvҜX,hZ1OMM'66Vř3gX`X,q}|bިpe˖2222222_Bgm6SSSh4bccgx=@蟇PDil6Μ9d͚5_+P$@_c>44@FFk׮/PB%KGr8y\.z=jO`04AP(P*(/u|uP(LNN>q<i~ixAxx> VFeS7.Rd?7WzuCn{k@@x… :tya4֭z6pyR}gg'/}Hz8tǎFGG/I[[K,l6{n.\yyy9s7$'' @WWrss'? 7o{tuuQPP R=z>6PTڵd ĉG]]臨d&&&عs'gΜKrI~moh]`0BRX,l6 X;JEoo/ǎH(+իW裏/^|N<ѣGihh 33QyATw^ʰX,P("mnTQRW n3<:;;ټy3˗/v3==ͺuHHH [P[oQUUEUU:uJDO]]/_&>>~[z>} >h49t/_&<<'>C tFÒ%Kp\r?cN<ɜ9s8s jkk),,1< QQQ S[[͛Q_=**^~I[[ɼ455a۱X,x^vIKK x^~md^OXX.׮]h4rnݺ磲vIKKZ^/$''s(bDEE8Z|zX,PSSCjj*CCC:tFΝ;PWWǮ]D˦&{ ;vj5aaaٳJ4 F?JXz5qqq( Yp! ZJe麟WRUU%R8pL&=zi222PT\.:D[[/&33"L&Gab.ٽ{7 ~?ݻj ߿r*477Acc#;w*MMM߿jf䒗yz|۠3^룩*+Wl24 Ofb\Ξ=ˡC$..k׮`ƺt:?.B 55A/v"""0L455QRRh$..H񛲲2L&~RRRX|9MMM{( RRRhii!%%QR9rgϞEV(j5)))tvvANNȓ<88Hii)pwǪףR0Le tttvZ"""`֭\|/^$11۷сjepp^x\0?~d-[ƦM8|0@X<]QTܹsK4t$&&Oww7IIIKnn.@ VQPPyb||W_}B}}=ݬY:::ЀVeɒ%KO%_̽Hlݺ"ذa#// ;͛7ihhxgltww388^gǎR[[8?Gd``>˗ٱcpAOKKcܺuk׮ɲeXlf?E@bP^^Ν;wx<x _3???x|>Ǐ'66ViiiX۷PTT֭[f``K/ą $%%qJ%FN:EMM 6 Ν;t: - e͛Ǯ]D~SNEJJ 7oK.KQQ@^hƍ ۷`Ç)~kka||_~A]]XVxĢyIOOiuZ< ITTcccܹs+V0::ʵkר'|;aժUr㏱|;yA8ƍ^JOOܹsinn&::ٌl&<<@ @bb":===8` ^/x^l6. DA jZO q2_-B,>>۷9w)\.jmYV,q8N#<>fbbH׈B3Gs 6mիWQRցR Mvv6˖-#**ja2<^z1l޼z1_Y,\.xL,[l**Jn(ҥKhrƍTTTP^^$~!J_~Y[||<bϞ=BB0 lٲ/7oLDDJr}/366 v`0^Gל>ɯ_NUU^s璜LKK |;!""f IJJ_bRXx1TWWxغu+9rB:īz_?'NǏm۶ٳqN:%\:۷9s 9r\:/,^q:FVXNn~z^/{h4ra^~eHNNfdd<;v'|‹/L0^LOOPv?΂ 8x wP8lgɒ%8qN ٴivh4?`0ҥKC׋h4ս{2<<~ZMdd$JӉ$>>׋n }14tbgAR;#jE̽J"**J3v=ɰ"f0 p8ĎeddzصZ-`0Ԕx`zzZr/IDATaDD rN^ Έfn7FIRzؑߢP(h4 04PxAq:8L&zDDT>χfp7_0$""@ f! KXX.Ke]Tl`ARRRy&'O?!hZǡ` N/-<= q?+B2 inv9TLV9ƍPYYɟٟ q1JEBB(J^/ZV'es)F^ƐbpwzJJ‘ΥT*|<ҹl6aaacbHo%X*J>s:nL {vx<{< BkE,nσ~>i4h%W? tOxx}|[P(FT~q(ב$7'&b425|}6"q*ꉻ0Jq7Y|Ok^oIˮ$4]ܥ2n_|>2|}PBo쑏yؗ>ۍV8. ߏ^'t: jt:JRHBGF:F WP$4HВ 3&zI)qBEmIfy^!g0PT\.஺pkxx8aaa|>Qp^HN1ކ>1Rz_T*tBrƨZN‡>o<~ikk#..R+HX DT(84]rB!RMFFFFFFFF櫃?I$WLGBBW\'? p7N{{;;wZ`ٳ/o>.\hg<3TUU;ILL jp%zzz(***R}gg'/iiiaŊU!I1>,,r)\BNNccc˿ ---,[~>#3g_dRRRgbb'wݻsFQQ0?Cgg'jvž}X|9`p_N^^uuu:tJp8޽sqy-[ɓ'y7),,$..zKRLAV399d2)χZO>"$}/ |TTT鈌ߦ6 8|0'Oʕ+3<<BV~Hge}6mڵk1}v9~8cccl޼VV+< DDD0/_fÆ "]dK͝[A2T5 &kR]]Zf…hZYv-" ؿ?+V ++vL&sppY`>F6nȼy0 dee|r:DAA0ذa999h4RSSaŊDEEի9u j*dͬ\R]T]FNN3P(MMM twwsY^/`> .W^~G ̙3V"Ftt4nCqjXxz˗z'--˗/op9rrrp/2===԰pB8u7o&**~ٴij+cGEE{GKK jsΑ۷͛aZv0ҥK?~k׮ŋZ\|iz|'9#C~UjjjtbZyqI6l ^tt4SSSvJKK9].uuup0 "VeѢEDGGsx7)..oLj̓gDFFtvvRUUEpeٲeT*N#eԩS^{5,Wslk"xuTTTPYYZge˖- 255ijj?zՊ ;;^xs9>2.^}bbbwe܌裡WA=AHLL$&&$bbb7v∊z-  IMMe֭Oz%%%^۷o{|> ̝;f顧^'::{.Qg@ q<8Nl_j رzN>͚5k8{,,Y??`0sN,ˌcKKKYx1vV+9|~~?III,XSNQ(<9LMM8Fnhkk.w%>>-[`4dÆ DGG3<۷oq |0䣏>V\yO z__ZX;J= >N?DR144DNNUUU188HNN=~V^?5k֐og`` |ܾ}0>> /hdϞ=\viصk!L&/^A233#//<ǏqrssV"fAbb"###$''P(Xr%ܼy֬Yngl6f3ehiiaxx+V8ddd<~|l6.\Hgg' dzyf<n6mD~~>ϟΝ;رî]z*ϧRnGDAUU455jUrq룢BxsiXbgϞe``-Z$\hz=:NN'\r;vVBR`RG F+Vp5AVE7ny8::ZwaaadggpB-Z… 1LbѭG0>>Β%Kx<)########Y\VUlQK].x^<`FZfzzzF6imv,$2p\BE;A+INx Gell N`r dI{zzBJ",, ۍɒ@Z0$<<\|>T*(B*9t:@@qn-T1\P{i'\jIMJ'Im%)KǨT*ƄvhY6( 555 7B@Vjzj$.jp`2zvEIJR2`W(3T񇆆E=ߏJі}4>/`AD+J>OO3gZ,vF#B$N_RHTZr\>bq8LOO !z2Hs4΁Ӑ~Ȳ!Uy|z{{&lh4蛸 `A"CKZE0J:),%.gv$C~m"-v~SO[-Il6 o=e}|ro|yJ踸/RO:Yh >>UΥX; 6MZ%s?i3N)Mi "**оMhP4y^"""VgCZAD t:{ɕ`0|k^zt:z78q:k< xr|>bbbBprq+########@]7}]ܕJ=n_6aaaxmuRoIˮ ) F oaaa|o)########=1Sqx*fgss3'RWNDD}h=q955%BzGEE>Upp.8I8QTru1kLMM;T}6RI"} B̛Ҙ "ٳgtDGG?v9l3PnݺEmm-r 7nܠ@ @YYh+);iޚ=2{%:~4 I1cbbBx^"##g\o``F#@JECCa隣FCss3'::E@; Jb_tȎRn055%QcBTJI#011!Bz_ }ƥt}i,~&''Xl6\.׌`}.C<88ȹs爈xb3o+Ez}}=?O(,,]vq\..\ٳgYr%Ow ILOOvEKHJ^FCGGcܹk"@СCTTTV7իܼylΝ;ǥKؽ{7IIIo>0 Ʋ{n***"//O,Hɓ~H]%]yT*zZ[[)..Czz 1Į.ʕ+vȲ )[@(ҸVv0|v@ZI=ƍ444tR\.br83Ɩ>OPpYbllHa|>FRRwAV@ Qv4ϟgjj/}J/~*Ǖ+WHHH`TUUp8appSN҂fcѢEbAQ7Η.o6QPP 6ln޼8;wKrq"""z`D?PVVFgg' jZZZhii!66[oEuu5N| -~v;@>:9w˖-cc4ٽ{7 hZxż^TTÇ9vMMM 1t\.xjzTTT000@ff&"DAZ|Gsrf,\.&''裏())O---?g``@<b@hg,YBrr2NSxޛaaa:tA233\"era=*J.bK ( VUVV)//'66V,YGܧ=(ew)Bf?ϤW>,OK[oȝ;w(((:u7nPTTDSSw$$$zOMM vL}.\@[[%%%q`ttT(Jy)//.^(t,ˌwy.]DOO?~#GHnn.b0t[>3كb_Wo*@ Xr%vrYx1ҥK 9|0 ^v; @EE. y;w"͛/_ -[~Fss37o_?3V+?ؾ};6l]///'<<\ AΝKAA_B??288H^^pW)=::RL&aaa+tttv1 hZ_twwtRV^˗sf3F[rH(300^?FRa?#vE~~>%%%455aXD_xl"l2VZTDQQŋ֒n?o6.~t}]^|El6ǏtR]]͛ɹgg, 7o$++QTǩSX`7odx^^uvIww71#//k׮O"--N<~_j)--Qx饗8}4X,6n$w!;;[-> HGG֟ɟp1p:ܺu FÎ;cll V+/̙3g0tttm۶'ڧ/^Jŭ[ձi&̙# ihhd2QSSCmm-s!22Ry7O;w.Vȼy#,,=?O(,,R^Jaa!7n ==+W㡫.q|KK ˗/'33~[x?Oikkl6smj5;v`߾}jrssIJJĉ$''yf~_0o B````0ȑ#GXj& |6nȝ;wf>.]իWIihh`͸nx<+\v)z*whoogddRImm-+V ,,[nuVZ[[ioo'--[RVVƆ ƒ%KXn{wT=zŋȶm8qNROX8v%?G/6+WdѢE3;wsNj5>,)"=h\\]/R裏hmmx|2/_fǎX,Μ9C||<)))lܸ7 f3?~_R[[KYY!zzSPPݻłׯs~ŋ̝;}~?6韨ǎҥKaZ-gϞexxX?VZ?͛7U]]r)####dxOXxx윜n߾ʫY|9'OT-ZUVqU۷`ʕ> l6)))$&&hec(.hZXl111DDD.~siRRRHKKv⭷c4dΜ9b`,Z2;J"**jFh\BLL DFF288Hoo/k֬444vZ t} m6suFFF -wX,l6<䈝T/_͛9~8b7if͛_(v;oI'== rsso4ٳgJn?sW  ##_Rw`0$!!jjkkg˗dFGGٸq#˖-… c beZ-™3g?1&1`Μ93]v;.]?˖-CRqqIIInٳ\vA[RTT֭[Yt)fHFFF~0*ˣLII Ӕ͛79<_O%u={r/_d… ;wtf3>>#dժU,Xg}FCLL Lgg' fQPP@ZZIIIǣhh4deexb-ZYl>,6mbٲelݺR6oLii)ׯ_ŋ 144Dll,F(Z[[9rPVVl&::~:$)))L&ƛEjj*ϟ7nX,bJիIMMM6188Hxx8.{200d"&&Drr2VU6 ¢Eظq#uuuLNN299Iaa!۷og zIMM%''˗/c6H?lݺ}Y?d2qEN:EFF?t( /^عs'111x<t:񐜜Lrr2SSSHLL jZgHLL f`0HRRX,1| Gtt4QQQ INN&55*2$&&hl6{?11QߔRRRp݌\255EDDTb4zQ(ܼyn EY̙C~~> .jfNvv6^W<{ff.jx^qnJ% Ŗ\nh)Ν;?>K,sfZZ/a ](=J>?8ii@PhPT̛7իWsA1l6IajL&U,\kײ}v F(kkk+6m"??_]M7LLLLwǃRB !!( 9ZR{z,Y‡~H  //9֭[dddghhGXsőFooba||AFVc0LtvvىV%;;aqH wΝ;$&& }4͌{jl6Gzz:tttADD38 ;WƠ_vӧOc61Lh4.^W_%%%۷oXt)z5k0oE|>#V~?| p-''j˖-CTvZn7{lܸ|磿L]F 255Ŏ;`Ϟ=p8HJJb8NUUUL)(( ;;@ ǩg||Dj5t:$!!JJJ j+VPWWǭ[gڵ\.͛墿ZMLL K.!V^M?$%%xRƠ_pn7vRr [07nDVIEE:W_}U,QRRŠ+xx8111LLLЀfctvvXBvXl1,ZիWg!""ӧO}1`Paa!266&+WAŋ @ 0yyyddd 㱲UnJnmUU46mڄll6Kjj*fZNc֭XV.^&77WxMFFl߾tEy󈉉,۷op8(**"77W?,XFٲe 􈅠͛7 9<n޼I^^999A#??+WO+WCyy9/f(JN8ATT?2GZZz&4C󩨨 <<Onn."ѢEn233q8SVVJb||իWc6$>>RnܸAgg'jRILLa\>|~t:мl6ׯc2z,\D۱X,deeRZ" // Ԉd2dggsmZZZHJJbTTTNmmmbqOzVK!5gFSS˖-cpprJ%K,lBll,^)**fAOO X`qܾ}۷oRxHIIM6Muu5^Wg4ikkڵka 'O$11[ٳgZDcc#6mbŊB1//-[ɓ' ر9sPSSC[[۶mcRVVŋYv-:u ˎ;ɡfyJKK1\x i&T*'N@/NYY}}}رbqKcǎ yyyvRSSK0VFFFFYbVU,+ p\ @(JB2ҊthL(r -  w066N`0(<TB2F\W7 5V:z<{iY:F&H/r ~ZBQ`POrW7m,HR*iK:ppUX,_֒/S$ I0/)\FHR$q! BǙ4g! Nrە~txl`00RfSYYYr/k&b%ԌcbbʚqKaaa\v!jkk/vwT*}}}Inn(c&]01H唎!}ORݤϒXt~e :QDimkVիW1L"fTTr?c\_Cwߌ, * lw$X:KIl 3C{Zt_HuKq_Ic= t,CoT mG:yuQJLW۷oC{{JMM%99}pT =^ =F/r~=.cr3A!*###mwFPh4BV"q_f{?,]TW%_DZ?tA  =BO2gwvg6E zd2u.T~sfC~Xw[^qawArrcC_触a-?$eA^R~#iQZQ=9{Μ}a]·15쟵3tKѰ}vX,B&66}}P>xfvcWO;q7:ddddd.젏 w'VH%""3DŽ* v;aaah'[xzK(ؽ Iq_6 ^T622w9B_wGvF J;wso:_6.79asW ɶ-.;蒛$p:LOO"<<Ӳ}Q(tv7iǗ;'?]V3>>|~ߟw~zP(~*FKוUq~R|[-~՞R}[frr(T['&&x<0^/6n7@ ،x &&z<&&&? 6M(FEEzZ~Պ`6 ILL n<66%**(&&&&&&f 9wC- SSS"``zz ZSSSާ%%%|r}%=nP*ET>x<Z"|c\\{j;Ok׮hYiubމ'BJ%111̷Ykhh ̝;ׯ&Ǐse>#.]hɓ?gҥK޽B||Lee%dee199o[nܸ!R8pܹCII /^__HII!-- ܹsZg?cll0"""8x \zbg9rqRSSQ*ݻ>UV 9|0UUU֒OCCgΜH ȑ#\tgϲpB9Bmm-̛7V+&hZ|"oZrp8݅it:mmm|GjV}*Chz;FEE`(|Mihh{kkk%%%>vŕ+WPDDDp jjjhoog(Jv;:Š4kR4ԔP`@ @RR u{%,ҢrT*9{,dddT*ZB\_Ӭzyr ^ ZZ}w8}4k׮%,,LKFFFFFFFFgI7ŋsmRZ444zIMMf"""|n%99A b픗P*_IE`˅"!!tʕ+dee0cattG ϕ:6l|-bll Zܹsٱc0z=>/P(f||NhW^Ar(,,d۶mdeeqQ]]+ !!8^/T*_u֡jbPT$%%L]]CCCO 222222222_5PW,]͛7V),,$&&~Xd SUUE]] ϟONNȋ\XXȂ p8b:`0(gE9u/?v:n\.6z B> u5p:###\v._笠y199`Ϟ=ܹs_~FƲh"q}Ӊȑ#\|W^y7xټy3\~0z|Gtuucǎ{% AĴƢ  Z^騨Xv;pW`zz^Oxx8KO]7|RJJJDWWx^nܸ?я((($ZZZhmmh4x.zrgzz!&''b|u dff+Ή'Xz5ϟgdd /ݻ^5 zkײb 9ϥ[hRɜ9s8{,[nE̿HRa DDDXjc|HHH6 HIIƷ4\.zzz8qx<q|xh ׹p###šjpn^{DܹCTT .D׳zj,X@xx8?<:tK/g\v3o޼{b9z((Jy7]VT|LNNOBB>}1::F! rRSSC}}=̙3[b Z-֭o>ZZZx爍~̤@ @gg'K/طo]]]8N9q0L&W\Seffr-ΝKFF8p@ @OOYYYDDD̈A%//ǃhd2aHMMEղb iiibn:~?s%`6Q*$&&RZZJOO[~f3III?^YYISSҥK̙3M6VDPsQPP@uu5fW_},JJJD^y^ҥK$$$pUbccimm% 200f#%%Kn'** LYY+V 772Ν˒%K8RٞHp`2fR!őK|3`v7eC0dpp$ 7*7np!~*@P"w)((K.7ttt022;w}'!QTŘUB1Ϟ{~sW^ =) -ԾHdtJFy(yd6fv}KHe}s6%~}еW-"<:2KDž~ mB1s;?~:=)gܯfo_amesJdع uv0!A{%xP(Gch;~E&{fcZIIIyb/ #r* jVy\5KFu'r)z=j,ry$ WP(p|>#########FP`X|;蒈XBB-| 1R MDHuqĠhJ]%.'\.ddddddddd>H4J=\5FXoQm4FzJrKn߆>6Eo222222222_$mA/v;I `ttMJJ ~|>ZDZ-qfxx@ @bb"\.'11Bl###x<bZZFp݌c>O\'))pVȕu%jԃx<bbbell A|| u婩)FFFP($''@@Y,&''h4bۅ{}pp`0^'11"v#""=zzz`|tDJVIJJBR>7LzFVc2t P(HLLDRt:`0`2(U__h$//iW}Z,Y%**Jx`0O `dd/$&&j4p066&`0bnFp~fpp+W>%CݎJ"!!$-- ׋V%))鑽U '33a칟@0.z=LOO |$''߷eddddddd$Ms'ի|477366Frr2.\?˗c49|0?غu+eee۷O(t:vɵkp:RfYqvl6 BR1ZѣG oMMM]~;իWinnf_F_ %%%X,~_0==V`0pD}ǜ9sAjj* {nV^ chhh\_ΥK(//1gϞgϲxbN8!7|gYlLNNhZ^/`8DZlB\:/zvEaa!X,tOe704իW9wոnF#o顶<\BCCv"55۷os)P({܌&''GtT*X,\xRIvvn'""˅vQ*8N<\.7$77V;x v&&&p3ƈ&"r\LNNxdcsfM2V+aaa:tK.QWWGFFwᣏ>I7y&R[[˕+Wϧn͛GWWnl6oMcc#H &m6X`0p-nܸzT*t:EV OUU ޽Hzzz`rU˪UEPjBfCxX,SQQ'++aq:NΝ;Gcc#/_:ٹs')))X,vMSSXܒں?5/?%C $v;~sarrrxgyٴi+V@`ضmzٰa]]] R\\Laa!7oO>L222Ƀo>JJJx8x ˗/G>R#HV%;;UVq /&::6֮]KDD-bΜ98qUVQXXHOO&9s0>>ٳgqݔT*illB)..fѢEѢtoߦq~?j>n߾͉'HMM ݎnɓ288ӧu6'>C xV\غu+,]K۷ٺu+| /"III9sFӧ),,$++y=7oʕ+,XQQQr x"*Zr Z˗/Çvsa0V.^H{{;uuuLLLxX,DEEw^뉊"557P288HXXgϞootttڵkYd Otj ޅ 9~8|{(J:::?RSSN###cF'?h.]DUULNNfΝF:D[[nݢFR$//ZZZزe .]bhhuֱ~ze˩P^^ٳg&11s5)**bʕLLLP__OLL ɜ>}())`0N[[7ndѢEdffƋ/ÇYjVx<n7;;Ɯ9s{GFFFFFFkg1Rfl477'0>>˗x8~8CRaYl f>1~?;v;wsibbb0ngjNGUUR4p vs y! Vo;Frr2l6233?j5o. Jʼn'(..&33S\ƍ<ͤTkgϒBQQZfٴip7rSSWq'O) xW'&&}{ܹsՊᠦEoFkI||< Yt)̙֭3~z=OEN__׮]#,,):DXXdee… 9w.\`|| EEEbWZ4l\|[n P#;;bV^MVV~JV\J"&&DGGW^}{)N̿ .]JTTjxùt^8,X0 ˤ4DGGX,Ft:Ly<@zl6v;> ez)axxRl6.:hjjBRIRR.$#?ZZZq3?8qgϲm6 @Ipo~CXXk֬!t:•+Wz*.4233psNz{{ٺu+*>Exa I睚o>پ}۹s'7n$11bv{a6yg]Nh4 wQ鿈r`0jTTT!QϘ %%%+O]wcɒ%Ӄ^?!4 "`ڵ\NǢEg>^bcc)))A׳j*.\HTT=;v /HAA. ϟAOMM.v!GArVT?~A__(:rSSST*999\r7n`ZgeŊDFFvZ<N>M LĉرVÇpYRR'!!7nIRIFFbjr)̙3GtJ1蓓Ů&55innXV֯_RJ*4/^ _AHLL$--P:ڰ8N/_8uuuzj&&&fʕjz{{$&&_~,&''fٲe,^XĠڵkjϟO? _8. |1w\j5Vt) bhnnfݺuv"++kF~sFnn.>8xmH?%AVO;2 d2ܹsYx=Xl麳~m(ݯ=dcEш9FC Ti7G|1v^(sأq(,yy> Nv|zx<|>g~1ԷS6 ;T~B_ql|bIrC/f';>>~S׷iNܿ-󒌌̷FӸ@hNJ" p8p:LeK ߚaB(z T(Bi MR"M.o)########( 8t'm(JJC!|龜T/8zZƱ4 zo~O峼=T}rrnj5!22KGGLNNb0Pո\.f3QQQl6:::fqtQ"##Xrh4Ӄ'""izDDDxeddNFattLxx=|Ν;  ff3jz bΝ;QTcX*}}}( z=tww c۷p`0l6&\&BUDww7$''?r{z<&''Q|ZK*SSSDFFT*Ej4 ]]]3>>.rwww311!ltvvx;:nثn W/I~]###1zCsb\.:Doo/YYYOmA, ጎru:y<&&&*p88Ǐ'>>jFs_7.}Ͻzv0h===BU><<Lww7FbddD_p8$ HXWWG0'[;wEQ(TTTVQӧOjijj"--n7'N ##7Jϙx8z(ofΜ9$yvwGv0d``Z-ZFWWx{^p8DFF000Ǿ墳SE01q(}}}c &.OOOl6wABR¡CHLL3u|I|7nW~yQ[[ˡCl6NMM n?dʕF8smFYYGAP`2'|3zaVXpx҄荍TVVR[[n'**wQ^^N~~>7oޤ> n޼IYY7n)~mzzz|dgg4kn}Djۉrah4XVy뭷yq)q80>n޼ɑ#GxPX,z^$jgYV|~b.<<ݎl륷˅`<99I0Rq)_)&1{jP(j[x)((@BMoo/.\`ŏRݭVpEZ[[Z$$$?^s̡'Or j5-ncXP( l602}[oEgg'---̝;Fxx]vxbt:X~= ++ ʙ3g}6ccc$%%;w 2H{RWWǵkz022ZFCuu5ȼyHLLdllax<ԟ%%%׿_QGG׮]ѣ;̝;]vq-jjjFf#22χbabbѣ!.. Q(J8@^^Z(Zn1FExĉ,_\tߴa.]*ƒ@ZȹsGa˖-Ff3^fOOoo/LOOv\c6}}}LOOq\`2pH'Nxx8fJ%AV+8ccc(JƘ`0`Zcۺ<:@NE%[$ݎ8L&Nv6;3lv';u'q4{Hn\({`+B(wH[v\%;yآx9s_9wL&tƵ5Q1>O2??Okk+Wb``k׮QTT|2---DGG“O>VTq췶RZZӧijjFFFx饗?O"|Izzzhhh //^|EX]]h4twwS\\O?Mgg' ٳgC?ett|y{1vETT/g۶m&B"\37ГqAxo'ȑ#ܹKwq  r&''!33߿nغu+IIIpq^yNy뭷P(;dgg*筮 _򗌍DyyM5У㩧bqq&f3ٳ^222Mrr2qqqoz_illz)Y__χ\.矧\ܽzG?bffRɛo$---$''K/122« 477p0R[[KJJ ={:.]"::TJkk+੧"--:ZZZϓb… ^`zz n[@|>6 HLL NK!%%tjkk\*< PZ-ow8ٳS\\\. \7Ժؽ{7`0kFee%))),RbyᇱX,8N^/l۶Gy\h4r"(644`6ٶm\p@ JEܑU(Jɓ#f3UUU;;8qrΝLOOownW("--t_Ç/^DTqرI._a'Pyy9ǎc޽466vEUp},rN8T* jQXX Jްpܜp QYYIQQǏGx(,,k׮zbccٺu+… x^T*mmmQUUWUFNm޽Ǟ={dtuuMtt4t:*++y嗙`zz;vP\\́&''|+vFGGY[[;)}>vHnxN jTVVTUUQVVFii)Ga֭|LF}}=O=h4ֆN#''+=ݻ}mk4- BABF*I$1իLNNښoEC{cm6Av!:vIuu5:۷i'( mpjeyy*4sssvFFF>6Jh4Ct:A pn7b޾fd ǒR`0`2HLL怜L+CvEYYgϞevvV<̙3z1l8&&1V+kkkB!ĝBl6Ν:III#Jx>>#G011o:w}Aݴۼ1=55Qfff{>(WI ɸ|(J% .8ɡVWWȑ#TUU޽{Y__7dff;3h1LNN"ɘŋjN:R7pzILLE\%$$022".r9iiiLLLPVVFbb"v:"1##V)aرbZZܹSKzebbb(..&''vF#YYYtuuP((..d2@bb"iiib*S688HYY,744rroqLLLPUUNǎ;eaa;шNq999AduuA8y]𳘚"%%}jȑ#fzzzdbxjv%j.w^RRRhjjBVsIrrrdrrSNrSSxx1=z,l}rn^O}}=yyy8p YZZ⮻"??M{{;f֭ dddс箻"//9q\|yv;d2q]!B>>IdeeEt^c }x<<qqq$ &iӘp<÷i"|~~4\.bdZQQM!B>ahNRdtƐ؛ƐOrVmT*233IOO'77KWy|oe;? fP($*% B+_ &(:kt)))d2Krr{rUĭ[M6,?D֭[Ű~בd|_%66VY5͗;!B~?xoG>;ˬ|Zٟ~~Y]]W~_>v+Jmޕ _'p[U3\Ǎn|a3 }Pmmp^mՂD"p}VV"|I?B/#q"DE"eF?zXfnC||2h4E"r!D䖆$=mmmSo"D!B<77~tڟylf3|[՗R"|v|Q͸N8L8 fgf"D'~fcpp\NTT`1fff0 ~z{{dyyh 1bbbuIbttT Un7|]b-fT*add@ `1 |>FFFFѠVŲ3ZVT hX__,: 7`aa^VXlttbbbľDݰZht h,Qcttc|>.*AVVV0 d2d2Z-v]gl0B0??h$088,QQQ3ߪ=k^\.n##|UܣXXX`qqшnvveiiIwfqqA\.FCoo/E,fjj }}}LOOc1 \zK.733C("::#1AxW0LܳzpzzzG&111k}9e0>O4>{Y\\dhhRyE;v^ Dsssd5׭oR_ bوamm{9233J\rӉlljj";;i&&&>?^Q3"*===b9:@KK o&* 4n󃨩#LOO366&~CkjjtjL&WPT6> c"De瓨OS)++ի2::*i.^Hyy9jz>==O?Mgg'X6Tr9ϟgllwy$ >,mmm8pjkk[?NRRXڵkĒc?XCZVsEǹpK[o3ϰo>$x;Cvv6CCCP[[D"`0I{{;ϟg011)//'**j>??/֟ X,]X&''Y\\P(cqqAaii @ww7?k/..o2k477c0 .\@~~>O>$ a07`hh)ڵkܹL2CYd2. Zgee Zkkkbhaa%9{,.]"77RĄp\p8t_/2 ^x477OOOMMMɎ;Dkxx^jjjBv~iZ-111_}UF#111ttto-[W.KS^G.PVjbT*9{,Z`0`s1==$*{'N`2`ppaZp痿%ssstuuusgΜڵkttt6bxǘMezUhmm%%%7:t?***/"---eI7t::ܿo駟XvMMM߿ifggpvQzy&&&PTaQThZx'477?ۙ#X,>KWW뤧p8hhh`֭"D;'1?Ѷm8|Kqq1۶mǹ{v*$ "u @RInn.7ԩS?wT*%%%{シb]o~X,_N<;;KOOEEEAT*2 ׋Rh4կ~~\.`V(Aܕ^uZ-<@?'sAx W}Y222HNNGt-uߑ& Ll&==)<gϞd2o|Zc4ZLOO300 FT$%%q}ݒfܹ֭_]4&r9yyy3 ntR__ω'<?~\qqCnRN^z%lB(w`hhhSJ~~>6 /p::t˗/055LLLPXXf{jRx&  %..MEEELMM1==`09MwXΘn ̃>/Lll,2VWW9p[nett={``vvTO.\T*,.lyIIIA""s=<3Đ̙3 ;sΠG}˿e`cc#Xz!^bpynJ0D&[os"D! uKl{ ϳJ0Djkkٽ{7kdggf|;<~(u7|Ȏ;*R^yN<).|7Sx+JY\\$33}{dgg_Uoعs'ǎXYY̙37k(W^!77bR)׮]cqqcǎwDٵkprĝ0 h{ٲe iii<ΊƎ;xᇉSHHH@&Nss3񔗗sN\E&{˕r9r]wp\477#BbmoÁ\.)`,nĺ_$Z-ZVɡ*++{"555d2|>:t{266FFFUUUo H$عs'շL,wAؿ?KKKdeemP(nCߓk~?oa]vDqq1UUU( z{{| hii {nرc>(h4N:=CKK ۶mӧOp8HKKBz{{׾m݆R@ @cc#kkkbj\.&QTb{|TVzoVIvAZZ[lRsfXP&xhmmRA{{;> > 111Cg۩… ;w@ @nn.z^/ַW;T*hP(Hͱj7T/444k.)))aݨjgǎ#ˑH$PWWB[BoPRRL&c|_gll|>YXX >>bكVȑ#<# vZs=z9rSSS֊W"DfVf~~n7999:t֭[cddAyy9~D6Q^ĉnw]ߏjeyyOܸ{Z ؙ -Z< 6V aŃT*,,,;CCCXVާ<;; Vsصk p%~iv-4Cffxe*++߷\RDPB$}}}8N$ * BA}}=dffJHjj*Fr[O~***0,,,V9q~ v;~;IIIΒECC $''t:!Y__ EOONagjjsmc6ߎn… TUUQ[[餠m۶QXX믿fjǡCF"1$##Hee%ǏG./T8§' 8t.]!J;M* 1<>& b4q8 033lb066f3<BӱNjv;]]]fm& eggVYXX@pw`hjj"55'OߚRT*QVVFqq1}}}d2p NaanwF">ap}]xn"D!mqD>7NY]]~?\gt_>qk'l뺙*R};ᝲaA9>C/V!B"DؚN>Š7;vx>uk"QQQY!䖆7 qfG!B"D?vuoE{˛Ex|s .D#n+y"D!B'>ɚCUm`bb(annшRr100@||>f#&&cMP|###﫝a1??"E7*6.A.3>>."GGGLgg'byfff8To*:s5v(uX[[ӤΖuۨa,,,ߧA- ߏbAVcW֘ally>V:Ggg'===Զ`0?OBB& ϙ3g0CGG8}P(G~o F2VuSѱi>cjj Ʉ\.KXo+++tvvfww7L&d2### EUN$f!B"||>CCC׿&PVV˗9<+++(SSS<۷^3>.nX,b1soyy*8T*o&|>aq:z2;;_"SSSg}~YZZjp80x<|>* n?cx<\Baa!6 Vj% 233<=ttt޽{fll3gpal6CCCu.  n7}}}1==Mww7:L=`˗/̙3g0ڵ (t:F*xg泥BAzzxB7#Zb?zv;DxWX\\dddLVVVPx~㡦b^x&''ijj"&&az-y?9nzx'XXX4]FCCCCC yꩧp8ttt?ʕ+DG!B_R>s=)) M0z 8SO=Ç)//r!H8z(팏#Jٻw/V1t:999 xxGyg(((l6o2cbbtLNNo߾ aCUROII mmmflقdbpp}a4)//d2Q__޽{),,b`6djj&T*EEET*ۉ"99 JKKʢJn?V^Ovv6111BUU&" '??;wR^^$>Om=::Jnn.۶mCr5&''9tb% ?l100 . }}}^uVVVx饗C044Dww7ӨT*())fggzRR077Gqq10999y$;wcǎ c}}C} h:::xjDEE/B[[mmmrPT;~z9ۑkLLL033vBII uuu0>> ;wlžz*JTT ( DBKK ZZ[[fJx:;;IKK㥗^* b]iVO?ҒX=\ FgTΝ;"vn7)))?F.C(faXDa[[ ٟ׮]CD__PRRdbxxSNq5VWW9p,,,Ftww7\x\Ξ=RV3<#:555jjkk??… bAףP(8s ^6:8ԐιshM??Akk+ΝnsYAŋSSSCrr2.gse222hhh@Պ3gѣsi1( 1??=ZZZDgן韊sGa׮];wN wŋ!, pe{|KP\\ \r? TUU˃>HEE.kwlBvv6{/x<B]]]ر|@  99'N`4|Nll,%%%TVVRWW'㏏rEjTJ{{;w}x<VWWA*ell5BjT*X,//Gy8^-mӍ!&&EJ%Ν;duuUtYZZ`0gbb\ΡCb~A]رcǦI% QVVƉ'Dll,wqEEE ͩS8y$St J  墭fAbXP(vm߿/eNsyYPP<?0{A"AUU999t:?Nyy9mmml۶={ ( R)rBy')((v"!!AtzijjbbАp \.n}kG}uJ%<㌌E^^۷ogzz"򕯐N0fffDRDR`0Hnn.GA׳{n.Z-=Ѹnrssٿ?LN:%;:uj|ÎRSSyۑrR) ׋D"A&T*Eї|">O<\."JJ(Jq? Z->K+FCT*~"D!BȇNifffp:w^ ;v ..!VWW)++c}}L&''bT*L&'>>Rq7h#^IZqO>$bΥjevv7:$Iv;vƘdii%J5e|il66 ǃZF1LsrrO~(--oϲuVqL\\\.Z[[bx6Yqa^IRљ IJJbxx61SP ɸvdggd8Nfggd2QVVƝwyËO~BII T*{*TUU"rӱtvv!u:ZZZp8b1;;0kA@ղw^n7555ܹ ),,HL? &>>\D"a}}Jjeyy\L&;v \*q!yyyye22L{](,,d۶m133C(l6BJJ 'N`֭#GvB{{;_J11Vh4ׇ j1=nL__IIILOOoo,..RSS qm1<< n6ѰbE"PXX2.]"##(R)1112<fݻwEvv6B344"\|Q/l6se)**btt+Wl귰H"VEL&t211Ass3˘L&zzz6yyyS[[KLL IO}}=IIIl6jjjX\\d֭hZ\Bgg'%%%SWW˗IJJŋzTVV"Jr F]] deeex"*R</^bl"D&!cccX,d2111hZt}t:v;dddhL<---t:N:B=܃l6-..ݍZF.sQ*,--a6VPTDEE$ TWW}vөFpbLNNRlJnǏG*R__B@ETlf X]]EVʊb||*oߎL&$P(瑐 Gee&p88r&4L&. l6wł عs'Avɞ={0b6j 뮻477t:;p;\j+>ߵ5AJgsùC@SS;wnطoh$u#:##IVWWd2NCS\\P)))$$$`6ߗ10(JB 1 T*qr9ǏgnnmFYYrlzۋRDp/MY!2DHJJbhhӉhX,Bt:L&Gf0hD188ÇINNfmm_죰#\t $%%RPT\.rrrزe [lahhJKKIKKP(DNN(fV]]M^^}}}XV;FQQ2$X[[cii***t\.yfhh=Jgg'PHJ RRRJ⼦jIMMǏj^^^AIMMpt:뮻|$%%qIv;300)++#==~2339p٢ߝwIVV(Vy1 HJJRvMvv(z XVNn7 'DqQt:p[D׿@~n17{cfQK"|E8N"D!B[mkZvBEIII7O q2sB܁[)~m!"D!B~;/="E8i?ʹ>k >-c(˂~}QfQkcAxEm*!B_v>TjԄBewvv2<\.l$$$o7ԙX__'!!AT}6^xd2!(q7}"D!B'QqP}||gy@ @yy9ϟKGGϳK/āj~ Њ j&=СC6YvNzKtrAaqq .}vyILLk_|γ>+‘崶rx)--/###bmgAhllc߾}HRZZZX]]ٳddd0;;< x<Ҙchh+WpA&''Y\\W^ѸcccH ^T*X,>b{jj Dgg'=zX,|Ge>00bł`={\x r9h4vVix"d/뙙ʕ+(J Zafff'$##JEtt4nQ, R~ yDGG344bA"lZІ$ SN"ӟAjj&g~E-#:^|EHKKkONN266v388hD.300( V ֠ߨOF*"x^tMuu5on]DZ!t?zzzdppd~_N||< ,..K[[j3gYqfNz) HLLdnnūFFFF0 RIMM EEEQ[[Kbb. dhhJ%> :zM&^.fffdֲsN&''91\txx:JKK1LAyHR,~Wv# ىNٳFx'p H8s jg 79AСC<<ڵ_x^\.o?3.\ȑ#R>B"|l>5lطo811A^^۶m}x";w$99&Byyy\pbccbzzDoq***6]7##cǎoΐJ /)g|| n݊ T*d2ccc$$$ r t:h(©Shmm Cww7~={_U8z(:th hll6Ώc򘙙Ac4#;;)VVV!))z//DEEaZbxxt~s133Zf``7mp߈[m6Μ9ܜXY.;>F{(K4*xx"j -Hqo|;$AVVc0wyzӧO˗{g7]2^{5JKKl8tB!^o$ebmm9w_Y__r8wzd$III466OWW[\t \9(A?mmmHRH$l߾ߏT*Lg>A,//cZ|2w1,..255EEE/_fhh\ҒnZ,1闿%Aff&G f1,--!ɸioo޽{z*׮]#!!nL&b`0H}}=8^}UL&KKKXV<%%%=zW^y.LREy@ 3gHKKcǎ7<4 pz*J,p4DTTNy*rz)Ŕ-B!R$ J9~8mmmXVq9@ R BwA}}=KKKߐB8 wM^^eee;vY:::{ajj&bs"bL(B&A*r!x 46#D!B6QY^^l6}v v">>|>*--ymۆcttNGQQ333x^222w]LNN~=\v<^djjhZ4 c(**"⮸Ncmmaee$`bbYFGGY^^`0 244%##ks=Gqq1&IIIt9S N Bܱ]iiiS__ʊ8dba}}BngbbBL&%%%q4ի,bIrr2o6 BJJ "gÁ7eB!hll$''Fgll1\.&Ttp8f4s- V2j5CCC(JT*LMM188@k׮GEEEbdwArr2;v 662vڅ\.7dhhdeeB{{;*?66FQQqqq\zN/v BDgg'H$VVVaffYv;;wdxxzZ сn p{e\|Z.^H?:~ϾOo}}]tTUU(++cuu_~s1;;Kee%@ʸz* ^z%yعs'r|ӼPQQj7_fuu2p5~f3<3466oc{)M}}=Ffggj@NN9rM?33f#77y|MQ9ryg||M!B"|^|hhZL&ZV9uMnn.)))jJKK)++#??;v#l8q|رcFGG2W{1{vv^ 11DB?qqq(CTFFFcccT*IMMeTTTCUUBNBaj\.1/** =zDB{{;LFbb". Nl6Zfmm(x>KTTP(p:8p"III7{yHL&c}}TʶmPՌ{nHMMeddDqnR8y$ ׇԩSNr8= \.1GR&ObuuNBd2F!==$F&aӄ0L&jK2,bccIKK 0T1XՒ )dgg`~6标X xh4䐞dAJJ 111L&J\\a6tlٲ ***())Aѐ4߿)++󑖖Fbb"qqqzzL&YYYsc˖-ݻLl62[G?Ǐ/~c(--1>>dBQVVNczz#GI__h#QTVV"@戋#66$ w}73>>Nee%;vL֘!%%drssettBKnn.VIVV)))>|Kll,)))lٲ\ʊy+> 1Ldff2>>%//xl6h4nvn7޽ݻw. d2󉋋m۶ߓ.D"AՒOee%:h )))b뮻"**tILL[bÇ9`0 p=N###f3[l!>>l***x<OffoYrr2Fv):ݏ?NQQPAYY155E0$33M&KSSSvmv9ufYLx77w[֛VAF#GEVߒ.fŋC2228p@$L;B"DX,qban('B7D »ᔟ4 ^?I-TDr>-GEqAot PSt8E}=nCʻBqrT_tnָ]@eYwCoC"DM?.3eR) <12ZF @BA`^~AȈµrP@fT@@#[" y/ FO1N>…jzY #)2XVK #3DLJ%zsFw:B"D@VmV7@J$9]g yz=禧?A$MIafn%-A8ʈŰnA ':BSSk;<*lR)_I/7@HV33g"D!BCÜ>T pimpm=|cI7 ޟF &z1o}J7?x{ȤR@Zqsƭ~9xT0^Dq~7|<Q$sm"D!BPl iF#f3=lrW*i!(TPj`_[#Nlz(DqBYF#KKXv˩X`wP!4`%f3F#.ssjv$'v>7NdkR:yfN1haau$4r9Ut!{Qd ./3LEb" Z-C -/ǖC!p|lKK#J.BP(MH -:qEҍFJq|4Ѱ+5D~jxt:v 7὎wGH\Tצo l\o7JE^'w|If3`YV}>$&n002ef35ZggILIA!0=B*eoZYA6`~V7rm<·wJIa@.v" GFC Ie2R)f3@6 0'6¸8q BT$%ah5) FC"c++vU*RRpF5"D!Bn1jeE+boz:ܖ޴4Z^^T""Hx\L*bCUQ ےxTB*E)hYf328I#[|MhHxII(e2㹿DQƤ`Tw۶W*h8UP@I|h/Ɍ!hhv6NOBYE![-w03X^/`LFVˣeej2Iz=oSYE&p #yyAֈj9L*EooJѸ%ؓAUZ&jq8^dR)RSٛJEer2I7ٓɁ,*Eu5Jv/3-R7߈YE-Sȃd-[?$+&oUV9CUj*Gsrؙr}aT1֭(nd2vr8'T8R)X2Fnͥ,1)&YYT&'('Z"` `D"۷sI Z-A8&+&KOpVZ-޺P&#p 3r I++hH"J.mߎiCDR&CL& -[18ᬬȳ!B"D|5";?OԔͤiv$'ɸ61yf9TCKK ¬Ւi4ղsndE}Ƅuû/i4b!a\>29GGH$N^mvD[,.,\A 76dY$Z @ bLJt4v:9IP6uŠRQQ n7RO !.[_G"8=ͫ,(Rln7cc\ǵ yD-Jw۶QϩRRBVL QΔvq83hWUEğ؁V@)W*)bC! 'ؙJ^l,2|7ssׇnG. 𯯣WXX p|hJd Pr7ympxVWMO}H;!A"1{Kr*( h@F22 :*lӱ͑,vÿ۶oTTW؛N@g3Y_cncd2QQHI$?YP29A=d [fyXT+}}4MOW¸8mݾcAVȍ^LLPf6G}"D!-mk#Qb ȕJvQ75EF]$GGf4hANR&B'tɨV(xYq)ù,; xUoӿKe2(.&$GEä\{w֤-92”y 熇Wq׻n6]ЫT|k ,."J9QPL*aHŰ{$n~B< .HXZ[a\ZaU*r9PK,gXzw?asy| PcfchqIIU*2*[23I^b54 8v⣢yz(^ 6=(NLdoz:twQ0F))¸8r:8Mq|< V+QQdĠ邀IakR*w#F''ٙw}d u.,QCJ$4 H؞,ލlXtk\*"<Ʈ;7̏ `b^`ymM<1l7S- D!B"D<`]H) .gaU n7$  SSrj5 ^x 剉d l1Q- ^u{ٝEEL9s?1(;v#%yJEJEyb"YF#&11[L)C^l,%f3QQ4]_'F!Z"I21҄VPվ}h4~ ;RR1ȎakR,zKKRQwPdT  LFIZ퓛 P;9~LFӵkn&``GJ W3y5*fO$^xLF8EsϚHTPRywHp8AYGss\[]EDDDDDDD0_-DBgpu:tB )LNrur`8diMc }ӻʴISE$`&+HP$BJEJŤ+X(W&' ZA/LH V תK ILdD K,d #< }++ ZnlйL$h$ry|we2~?j%L7B)Ȕz%czJ$}>4r9O~?2 o0&O<RLDss ~_l0`Yq,{<=~?-f].V<Qd$k$TNMvcܼ&O0H v;Z;B׋K"Y¤V3vcPQzVWqd$$ey$``#JT^+J6|>T2H$#\_Lʤ$\.TY779;;tNL$A~v{ "&LAxQꦧr8N'K}>܏??tLj5IJ%SP%9Y%-V^6? ϐ~rbQdBr.I$Tr9 ndo 5VVmkv;FY;鈈|;19L~n@ L&CsO vd==X?S}J \ wAly{DY\+y~[>Y5>Ěr9R]#]R9yB>2j{Lc$k4Z9߻~y\r+"""""""" wIIHύݠRQPXۿ&]fh}&͆VE=O򵵵&>$''|Bc+++?CoM|>7^DDDDDDDDD;LY/CB>-%'" c@4rr#"""""""""/p (JRRR|466OJJ Pk׮(h4VWWy&yyyH$illD.T*y&hZc(BsLdBPT*顱EFFvZN'YYYnnݺEoo/H?n"99$''|2}}}D"F#---F1͂Kb2P(ܹs!rrr蠥OZZ444bamm+WYYYtvvJ l6#J~+zt݌eut:hhh`zzɄJf"0A0A׭-&!!E x^z}.&H$VVVߴcXHNNֶ1L&hBpV zߘG"$&&>拈| \.h:equ06jkk% ;`ڵkaBgϞ7dkkV.\V[!~p88}4$z(vHuu5DQOFx^"7xM ͛w]o~<477dEBBo6@SSj |>.\" xHJJ?dtt˅`O>^OQQ@IT*j5o7np-FFFr h4455qu:::p8477smq5558Nz{{ۿ[pܹs:N8Nj5SSS={iHNNLMM;RhllW222"gϞw.(DΝ;\rY vdzzz|2hz'd*;v`߾}o}}tyzzz޽\΁0ʹ`0رcX۷ocZcffL^{5 Q( q!~򓟰ATɓ'9|0:Ll^@TŰX,k ˑd߿R]cccl6O,CӡRhoogllD^yvލBfM4L8Z[[Zt:^|ERRRFhZN:Qr˩S0d2ٷop'ObxxX$K$=s1ttt((oӼHR ;w\^'))jX^^̙3OZvygxW1r JyJ% Fj8u*f~\.ꯃD"W k555LOOs-ywܼڿo餹&V+?N>M0Ez=F=e2j4imm% RUUE8`0`2qMMM8N}|>UUU-axxGn7/^ghh ~ӟY[[{MyL|/?P(D[[Gns%fgg!p?vgQR)hT~]ikk3gPYY޽{{q]ƿWJPv% h4ʹsB,..266FNNWOS._`mm?_LگW233O??OII p/"yWZ̰~f3?*++YYYX,Fjj*NRN8% Jb׮]KL&(>|`06qz=ߏ e4Q__fY]]%D"aii ͆hDaيF<~3Oa| nruFFF8vGeuum(jLyyrP(̤bhH$` 33rY[[ckk +FV;z2331]`M IOOGRjErϳk. q8ra 傗A,rJB8T*XѨP`0P(h4\x^!g*YYY t:z{{y(,,f 8y6RIII HR, zǏSRRBL |Xb1$ X,T*2 q@|B؉\.G~i$Ff]!#H0ܯtH$XKH$@o!e#7[ewoKN`0K=|FXN" qrwI>V B#[DB0iX R]?˷ ]܁vq.wqԮ‘H䉻a!w]DDDDDDDj_D7^I8~yQ<<+B|&aq\lmmaq{c}~S!z_H/_χlcFXc:::\N?!J~Q,dee=xKY,'-D133õk'55ZMSSo& YSS2~jjj ##`0HMM (J~oj\.999^$W\aΝYӝN'X,z{{|_D?zw{_xKvv}essNǝ;wV rex홙yj5555l6fggsz*Ѩ]%ZX,Bb… EVVNֲF… 233b Q[[!##Vn޼bAqMimmE"'PFh4055ŕ+Wp:dff F52Irr2.^rssV9.^Ν;|v#33<ct>T([uXXX`uuJMM @rXsfffڞLh,7Ftwws tR]]*njjjDP`2ի$'' </_&110555\.hiix<, \xD"T|ARSSү 񿯮bXʕ+tttmsY^^&##LF{{;H$j5ׯ_}ۻ曬p80_KZ[[QT߸j8555LOO!$W`ǎB!n߾Mcc#~LffftX s'FIMMeaak׮177GVVxZ,\..\`ccC9!}'hIDATX&''vkkks}0 LMMQSS|>a?OAA\|Jvv6\vIL&:nrܹC  ##C3#":YܿPAw:444 صk͑ٿ?:X,Fmm-'OD&;'jkk)--%--677qTWWsaT*60ǏJpoYEa6裏Ǐrpr.\p\O4ڵkٳCmm-?<999d2V+;w2E|%^/6KKKTWWs KKK$''sE, HFC__V;wX__^z ~;xQ(Be2mmm133&zr9p͛7jhiiajjh4J[[㷿-zd2=w{d2sss c4裏x8<>}rqFsNX__ڵk m ---aXÕGM*ovzIJJIxwIMMETb0X]]ABmmm|>֭[|>RSSilldttLl 8hhh`nnthiiaffӧO@vvp%r{VXYY!!!Ekk+KKK?~,P֯>\.^ܹsyF#`PAR)oi<r222tvL666ɓ,,,D$d2Ν;`kkҜ/^СC瓔MMMBff&pax뭷((( ##အDX&''S__Ojj*466CRRCCCܺur.]Daa!o6455 裏e߾}c6B"(Ӥ}6|>B!f0&---tuuH$ܾ} B. ߏxp$''CCC[Vlmz{{;^ &''_Lss3###$''w~Z-$$$0;;K(j5r***@1??/% Ez{{Dף멩jR__OYYuuu3;;Nctt@ Q*,--Fyy9pàr95In7fuRRR`ttD"$&&LGGna^BH}}= tzzz_Bŋ۷-jjj0 z;wFIOOd2I4bno>8s %%%c4Y\\O>a׮]xH$\zF#pPTToAYYdggVRns%JKK2. R _rr2mmmtvv r{{nΞ=&''En޼#))N +++p8HNNfxx~?7ovIKKFf#c @.Jbxxy˙_~p8 IIITUUQZZL&8@GGl&//'11,DQP(deeǏjBff&v&''-"]]],..w^j5P=[oEzz:}}}!N'99瓑!)F#1EEEz ""hp:_YABBv)\.F#(--% ~L&MMMRRRB, ###t:#!!'C6<pY~0f,bFQSWWGnn.)))dee= np8,L&t yn7W\0Oftt .`Xp89s{{ϳ/27$`4 ##D^^FLf3f$R) |,77nf'T*eccVKRRtttᅬ^jDHOOg߾}E9fff$rrssl6 kkMM D"N>jEPTT b1^~evp}HFFŨgvvsΝ;\|Irrrj$''㡱FZ[[QռLOOGD]]󴷷{N,c}}+Wd2, 00087oޤM~ߠR|2}}}{j^J__}@`T*.~˗qݨT*R)>˙3gXYYfqiZ-/_W f``:FGG={JN+BFF󬮮\r@ /"b||\hooo//_Fl{_p|YL&7n`xxxhZ>#OO… DQ:ݻh4j9x h4dԩSX,Z-JrJJJb9x R~o%@vv6{$,--1>>Noo/Rnd~~AJJ 8uꔰyWdzz,d2؈jeddL&'NhR^EXywD"+<'vӧOhgiff͛D"{=T*CCC4552/^joRΝ;9sF8Ν;'gϞfsN9N~>Lbb"h^mOP(aϞ=j B`qqNV+mmm0FCVH$2::mmm!HgX,N'333V)//qd2NW^yg}!q݂@?333) N8!|C"|eO/A*~W @N=f-&''@"pAO7ot:ٱc?g4 6 g޽ٳ灃488ȍ7?s"L$ 4CCCdee/tٳg?C W^//),,FT*ڰ|K/DQQ`*z=/2,,,pFFFܱ19b6y)++#GqRy***8v&X,F^^0<<SSShZwdd *Ž<"HD̰FAAXVr9`p8,Ν;O?ŶşcZǩ|"b/"hٳL6ZrA8z(Q)`6yRq8477 ֢|ecc)v-Xs ER8x ǏDسg5l6#HbdeeqqcccA666D^Ozz: P*H$0PTJYYvî]0LdffRPPlLNNYYYdff pɟ /h4ܸqe8Ç1 _immehhLƋ/Ȯ]0>;vmFNNF!x33CYYǏgssCQQCvIJJb?禸_|ٌf#77={EZZ( b{ÇѣG1;;jZCNcr_RTp9d``u=>?9`0xhkk##Hdĕ2S^^.xjo?+CPH$bannD륹>4k!.c`!{y0];>2LL&`28p*jߵZ-:^/x㔔pn߾y&r-=x{\.SSSB477se)..dmmk׮Q[[Kbb"EEEt:jkkܻote󪻻aq\~z{{9r=f$(i& B!(;LLLk׮m}bL&~?7n`bbBP(عs'uuu\vUj5nR)SUUEjjuCDJfŋ=9?5\hnnܮ?YˣFΝ;vq/ s!pJnn.JH$BYY/~! TTTkIqq1 C4%pM>c, cbov:;;wЀarrs XLxb瓐 (9@*nVK87pڶO;A ;vb(Jp V+1==͑#Gx<\rEwdtt&\.W^NP((((@*Ǝ;v8vkkkՑjW{f'T$!$ 6 OEE`-Fbw~gPT%< ΒT*exx-,aˬ9%`h4hZ:::h|!c~ݻw3??,2gyFHb777Grr2pXK@P-(wwpzLOOLEE.N'2FFFz( *++Y[[cii DB^^EEE͑-N󱲲Bnn.2 &" QR z`0HJJ ]]],--M~~>BL^'77qB%%%LLLt:)((x`GM\SSSByy9,--Caa!a0 PݻwfBPfmyyex~r9jo56="͡qdgg 1p ~1 qaat\.hZJKKY]]r)="(ӬM^^ccc~, (Jh4B!222p: $|ZC$Xuܤ_cZauuUpdggߏ^9am1 aRRR'//OȓwO333֭g  cccDQ &!"YVA+$+..fff`hhe {A233CQQ2H$kkk䐑!oy\Awn&`P zB|㡢-(((TNLLAyy9Jnn. $''?0kkk沸(X ISSStAj5jZ5XXXh(++j\.( RGGG (Ja IRSSTRQQbnnJEVV} SXX(弼<Ҙ!<׈g0??dl6 ijl6^ʫ*$gff0066F8p>vy2-k4WA?Bq_I0$ Ok$DH<So"'C8& >Dx=$;{7C`Jڣ[Eۈ(""} #jϞ=B!xP*lmm=;)X R M1˗\ QDmr B'Iy."XoVDDDDDDD䇃۷OEFj/Z>3v>kaN'~M J rp8>w=F8N$"""""""}*.q//}gii5Gw]p|m|Z;l}gpݔᩍ￯B(" >rE=DccchZK,)=MLL`XXwP!% ,--QQQ!Zx2}_z{E0dhh;v|}DDDDDDD~D"u:BX,&]%e/InGV eu{<wkE<)}XL(#ɞ:xutTzT}>ldiqBqgV\Jڞ]" J>o+BII~ME~Ĺbu[w\|B!'x?>UУ(8Ѩ ?hǃj~ z4%{nn7:NʺqnEDDDDDDDDDDDX,F$A.K/q Y]&q10Hd _TDDDDDDDDDDDDD~DQ222HOOo~o{YTн^p8>P(&I#dkkH$"Yp[V7WmnnR2kpNNw_ ,4""""""""""""""""""""""""""""""1XDDDDDDDDDDDDD)@TEDDDDDDDDDDDDDJewd%tEXtdate:create2019-01-17T15:20:20-05:00AQ%tEXtdate:modify2019-01-17T15:20:20-05:00s+IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-plot-task-measure-preempt.png000066400000000000000000006102261477354127100324620ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME 8 [OIDATxw}{"  f ˢ$'> -}lg[eS:HuD9 H"X`,6as1;]`X  ݞٙvUW7x]#B!B\ahhq*D !B!ٶMss etqYg P(øhT!B!m$qx]=i FW@ Ϯ4鮳B!B1m>^ʛ"R\C0b(2z iB4(ť3̝`gzB!>_ Dk0J:%avFUS'M)RO~3[<^W<2FקIsNNTLy|#JL\t q4mc#G5Іaa/q80Ǔ^'=> QqC!m466PZZi4551cLH=׈R[*( ۷ogժUhl<墾p8Yf5.k4@MZɇA{{qhZ8,Z59zsΥ DZigs'glZǣRQQqRySoY6==]T@<>GaٲŲ,:::q\dee5ljhD ̛7/HkD"Aoo8Ν;?>YYYC!YD>#D)E8& "77}^ʴ,`0Ȃ 1M4ٿ?x;..P(ƶtJk_URVM~7# xpB1J) gi<45+`pp|>JA{qB 1<(7t3nncCʕ+9r0/2O>krrr|>n7455a&vl?Nff.^x<~v͛)**fhh`0ȑ#aȑ=LEyymsQb8YYYD"aY~=6l`-n yɧX5exx!45#!3348~cyQJqh##Ŗ9ahh%KHoo/ ~LN']_~:;;6EEOnn7pC4X.\W_Muu5]]]?~0y8v ?3-ZHmm-xgd$wg]_P Oyy9n_~gy+WOO?ytttPWWGkk+<s?!>),,/vY zzz9rx||tvv1wؾcb~|>`Ϟaih8ȶm1 3gԄm;ڵf͚o͑#GYb9gf˖;vz!JJJ[ٱc!q_ꫯ4}|{Ck8tS3fPRR¶mͣټy zt !8+Fc$?۴N ,vر& ,N]$lHRpYfH?JӣFpK/YfG%`؎C<#OEIXO|uAuu| //_0 FFFظ}{o#wW_8,]$~466rw0{.Z:::Yx1{G4M-~zJKJ^|%,"g^"XF9P[[mD"R,X0:~w~3fGAb1f_H?a_@<Lq9M,0 i&dl F\!$֘wv}ϟOff&yy\FNN6bRgvq)++%''˲ӟO[l&''L,a$xo6J)rrrH$ضM^^99$q*++7o?8?>yyy|>rss0WTcYtcY6bQ}"( cn7yyytwwaYdggŪUddC)EYY)9'CY|9uuuض[oҥK7n4Yt)-СClذ^@z㨮&''>K/]ehovjjjxͷx'  .`z^}UU/Hkk-f۶8p ҂4 ֯zs6 !bӣu-+mzgff86]]a~>۶N'uO%Kq\oߞ3)J)lqz?N _kM(~>ŋI8`~;+e&-ƶ'~ʒeքB|"Z'"֭kנK/e޼XE] ͛KUU%Iqq1 . yYl8̙33gUUKO6<$p饗rmedf̘cٲe\y3f`YTUUa ,䮻lx̃`dx" ={˖-p8­ʕRXX…())f1w\.]BUU%mQWWG(3fPPP a9!.]mJ?puױfjkkq=,\˗cyX%KYd +Wb֬TpB*+TUUQSS (**ϲeXj%k֬o?… Yjbɒ|^ Y`>8+`Ŋ={6_%KP]]룬7|5k0gll۞Bm?ށ0Ԙ `!SO= F[[==<oz{ `歵۶̤8X@a$'U;v~mmp}rwFaf9? !br\h]<5:K;jYZqqbOӶt>eafT>eY(0M۶tzzz|t8lQfa`' >Qnj⚱{,Y^v;Ü9s8RB!~i}Y֯_ϑ#G())!???]TlrO?ҥt J)y駩'?J)yjjj|B!B)=J)6^}F 9r 6`6W^y%sΝG])EWW+W0 z-rssQJ?m۬^͛7300… 瞣k IM_VVοۿl2LӤ_|p8_ygD)Ecc#\SZ{ywٷo {!''n 0?O[.B! ] `<#ٳnӁ3k۶y7/~AOOMMMA Xh_җ9ruuu=zn& N|*صk< ,Hn`|r ̟?o}[|_8XLrrrҽ͆a[ᩧN麅a<nbmS[[7̮]xO8rwrwSRRB<'Yp!uuu ". ׋&JB!B\&H}>Aff&YYYdgg-܂8tvvOjˣBn7yyyx^ϧgyEQQQA[[[>//&##rrss1M@ @NNW'x+VPWWG"_L߯;mꞗm\r%Az!fΜɺu'? YYY,Z|9pmSXXx0MrJJJ(..ZZ:;;!##c:Mu `###ݢ(*#kDN=V@hFvFx^ eY$ ~q]wQZZJVVgB!Bq>MÉ!8f].t4 <6{NIʘ N~;'*K)E"`۶m,ZL.B!9+E(5~j5!B!7W4:!B!_x鮃B!Bg{B!B!8W !B! ЅB!B B!B!5,6ZB!B!>.=сuAU3g&eee] !B!FJtO8>xOLe% 222Ck._k=a_*5 qS*Tc'+LudumD΢lLeNKmR?9TNT;@s⹱ەR(>MB!Bq;m>Rnw9{3sqR8FkMFFF:h},irZ0 &//\bǏ MOOH2<顸x<DZm$QZZJ Hqn?:0< ϧ~[rW xxXjYYYm$ lNbpP %{໻ \dP'dl`Y`0<RvA_aC^ft (F2X`7;wx}UU&=Q rs5̙C(G)1'Fddd7]8RRy٭p~ /xtv ("Ů]&6_Z Q˥3g::-[\h-~h22lb6c z5Kظ\F>2ո08x 7O 499E<YYĩņdPY,Le-o_4FNUB> e?LlB!B ŤQ0|<tuufkx<Ӳ,\.q++4M~?0<!K.;f8PBRɑ#uuEEL3)(Ф_(h %B|!v#jGYZo/6\GiF)N @.H  b;6 %B!2=J)FFF"774gضM7݄֚|x^Ld8p4Y|9f``jn7g H+>p8qcǎQ[[Kww7o###dgg ٳgXAjkkywhiia`` p׳b k_;˲ظq#Zk:::1cw裂z>C"~;J){9H$Xq裏ꫯflݺ5=ik _~.Bg{jTP^DɠlZ[ 26X備3|>1ZQ^dM(hj2YbhȠYٔ$пHDi6[gxΝ&6W[j>EQk-vt1l&F~dAv*dKp.B!3:"f?s B!BL/׹gqh'B!B\d,!B! B!Bq]!B!H.B!B\N;IXRl5>y~ub(a$+?wN.8sBDž >/T!Ǥ֚`0H8N9eYAĹW"++ 0X윿'++P(D(:oǟ}:`8筍333SJPcA64nii3fj_@k墸D"L .l0pZX)fxx >B!5a"cYeee%ȊFw8dffRPPpuUJ100@oo/iRZZzb RXX.'kr1ZӃv1aoXσMbl!ncV/VJ)L$M)eYPTT47R###TVV.Mk\,E922Bnn.999_ؿԅ3q$@B!Dڤ\,񐙙y^@n:;;x<䜗+! QZZJ 8/yb1z{{)))!++륧gpX,>etvvb&999%RJۋeYx<3Shohvwe$kS-T&sAm 5:ހH"B@;WμsnTs fgg " @k}ׂm(Ϊtlzqwww!ԍ|} @)m㶛>m;.+}Ǟ. 4h*ȐKS!O⮵KX/֧Kk㠔:mJ3J}[Ɏ)t*9A0YgcJ SKoiY;mk`qbbvC)0+{{88|ng=K̎ iFG빼`9:iY۷oٳgS__O{{;1ccVXANN1]6Pk.V^MOO[lA)%\BAA۷ogdd%KPYYC$a֭B!V\fdddrJR444Hmm--ȑ#8p%KP]]ٻw/PQQ%\ۉD"]|@[[[כTa*]v#G0g{%;;t`70 lBFF .L~cSwuuqA\.UUUTTT;v`&]vl߾AJ<رcTUUdضmeee,]4׶m`Μ9|G?~ 9pyyyXb\677{nYd MMM8p+VP^^[l!Hp饗rغu+Xe˖QVVFGG۷oŋcl߾e˖͎;b唔>0hnn\r9޲e dggl2ZFٴip-ZD~~>@D"3#6l@oo/hGx(n'xG222omᅬm388m8榏[)[ośoޯ~lq z/ݻ'`0Hoo/?0g?cppgy}[o?~]v /ǣ>J$wl۞BOOOtvv{/ir}kc``_|L:::я~D?}}}ܹ˲ǼtuuamI8p'|a~aB裏Nj/Ȯ]xWرc^`߾}< 裏~3FFF/Icc#vyWٰa}}}$ :OׯN?6N$bt`1v9Zd/3ayrr]4 7aj #nJ%CX"F pcōfR-[~T%ffޙ! ,v|H+Ro)r{ ;+H_5kk֬I)ogضk&۶mr1w\عs'===TTTptqm7<<[oE(a  h|~1 ҥKKҁvuu5+Wrquב 7@QQQO^^MMM#>Lkk+}w>HĎaYiG,\;lsS^^8x^nmSYYUW]D"lܸ/׋asmիW/}qw줩 K.d%H  pw`P{gbٲehٽ{7K,_2;noo' f͚hlƲq֚|֮]˽ދalݺ_Wom6L4M\.^x(>}öl[h3ݔJQ([Dw[ v1#kgvx ˪#`Ў&̢c[ mMpy F~.)rOϓO>u]Gmmmza۶mڵo\sjdó>455rJ/ESOaYMMMw}amFmm-ׯ?hA?p4QJ{OlF̛7/!–-[>)/,,Dkͮ]9sfzn---ض͌39s&J)nJQQ555444022B" /֎U$F>ٽ~!G{9B/Yx1K,wѣ x??;?Fk /OH$k_qoiy@)Mٰa?DF k.Ν|>wA04MvM0񐑑Y!|0SKArXD=թ{KJJ?>sM=QZ۶_SKLq3FOnhh(exSiV|thP(###cWJQYYe]̙3|75VjvTm"??smx_OqQJ;a= H/6]RC'kcχI>&c(ρ F9_v)))B|>3gd,\0pG"ZZZ(--妛nJաP"-Z@zu"j~?-JO rJ,YB{{;fٲe|>,ˢ |>2005kXxq:,+}u˲ͥ"==//*l&33:#zD"9sy呟O^^~?Zx<[0ϟOUU8CQQ.1MCYYJKKQJQPP^q 33%K`ϟϲe˨!*͛G(˲#++x<μy(..믿Z[[1 JJJX|9P4[ÿS2̚59se]Ʋe˘5k ,+VP[[Kff&xo9=y[v^4,RnF.\ٳ `rrr p7^ [nrQYYIEE,\@ @ K.$O ?22Bff&>B[n!;w.,[e˖1cƌ뮻JrrrD"|K_JׯիWS__ sW*^/EEEbY7tSuYIO!B500pʷtԸ5`DV\.gLW*=UeeY?q( ===RTT4)+5QReee:@$HP\\Aj߉ƶmZZZ0 6{{{;t\yIjlvƕ>McYqN,6z#5C2PabD YM~**b ogF7DÇ85ZbJɡ)l5Vr{(L_SO4 uJ>cMTR j3]RY0:A8{;%ucl=Y?Qo'zrn[.B!&0a:B9KMeY H$ι.l<Oz2s H E(" Jn{s6>e8D|qVV@`j@1͆7ih?/> 0U|/B|arss|8\eʶ?bS1FB!835\N$SGC;rľmkc*N >R5c_[S'=M/LB|ZF_'H}A2e9^*N-S{cjB/ Ѕ<u9Q,F<7_Gpzxn_p忡f}  _FSIl_~yq (_}d w`\q"=F^-x31+p:^'Ewc5}x9I> u\ <7=>30V9v?0} 0r]mX{~ *0ta/8ø&Fn9t%a_H7w#W~{Jy$? ~6ܫ~Ħ=2\xn[8H|cTf1F~%O- ;(:qc"\KVEt!Ĵ8O^=\X8qA|DM!y8NNLX{;8Q98]a֮Ɗt'( q:g^݀z7OV:܋ӵ=jcz<} yg*ibTL28Sto6Fv9N1R`NsLGA'"P;M=cNFq:vmӍ $ł81rg1kNbg>4Na +:2_, !28Oc eՉc(89q!9HE *ctȻ:D 3]/5vhaR(e&Z?RDžB)&E|%N 3ߙs}yZ2+!3ƿY|nߓSѮ1CS-gyjO{m!BӒw!B!pzoo/PhC!B!#GP^^NFFƔٱcadɒItww~zXr%~!۶mn;v}v K.kW^kײtR:Ć n#''g\q5'N/5I'u4I&G9Ҥ3&qe=yE4ϓ^JO}S^$m/#ŧn9b8!ڔ^^u"Ioo/z+e 6`&555yf(++?&33noox#++ H.l20կ套^;f˖-\~̙3Gyqظq#\uU$77G}S__BD+Ű78dEd w'3v,_d88b&FWt2i L ѝL' 1Lgɥ 7g'p`graґ`0pT'?>g'L2{1<{2U1&1?nlw?VF K"«P7qY"a`& /#ՇbOn'b^8x(_'3D00xA >\Oq{` tw;|Wt{V =0܅ب@o 'bP"=`0=׃ [(3 V&j$(TĂvzS08Q02&Ȅi9BOߔ~{=~~{n 5>lٲK¦MXp![oexxzy6mDuu5eeeիW~֬YC<ByΦ_~***  Xf ۶möm,ˢ]v@ii)*̞={\1F܁7K?Q^Vo`~84ZP?^NY(5KCkqr"X+gI(:-PKnw#~xb? 7 }bBDWWDї|?E#GGPM[$ Qp \/p^O(3NuVK\_4V5( OyQF_W\:3GooE)z"ߘjb [.AO u݌϶~ί': F?J)gAZ;ب'PeG?'v,F'N]yw P8-kpΥS5!3gdTTTh"=Jkk+J)! 2w\|>===ɼy(((`Æ 288Hgg'RN(,,$77M6Dعs'v p1կqFg˖-STTڵkl޼,(**'`޽ qQ+ƈӍMl8O1bz {G'F@нfS#= 3k `T6'P{FWD!xѣAOm00t7O;1џF\^+#gNSXv;%ٛx;A7f2ۆ?c`2*T̆{R DxKd'RgPlrͻZ2} S.c|;& 2r !.S Ma. ǃm~/^SO=E?x<>nxרફ"C]]8paҥ|GZr>c(**¶m_@<'Yr%chhj[1䭀j9ܜI2.w@uJ sSgrrjN% 7)LwqI7+ FBcQJdV1ms jܯ'pY>ٶ[Mr:{8۶B\lZUUߏ77!??ŋ8~:JJJضmyyy^D"yooݍ!;;@ @aa!,XVeVVVX#77o۴IEEZkSP'33K.˗SSSJKKP'9仜8G闐chFYpEAFj tmz?+T?/a8>/!ؔtǓ pҴc222 粲ғ̜93Dγvd\=O+0o޼nwyGbTLF> "ToJFa:{YǗ4+NLsEGɣb g=h^|E?A Qm6n~-6ZMPĊP/AF|ǓE(QaDe!WD\bA׏..^=8qo2(mfm8\\*ǡ6?y=ڵ]8\~JmPٳ5k;-[ctWE-$ k:n6Odh'W/k>?)4dȫc 5oI,(ܟGFul?MӞRw*LoֻJbY:As16h(B hz=Y<ױN@`J.m>y=Ǣg']ibYXS 0?=]!>mZ3a]e|W$'{SlK O>Q߅e;'Óɟ՟) Aq+}5Ao|.XEB"7zL"VK^;=m%.ngZ?_L]$/l;7=cƸ}^C pB!SZ\_JBs#B!Bq]!B!H.B!B\$@B!B!. !B! ЅB!B B!B!@t!B! B!Bq]!B!H.B!B\$@B!B!.鮀B!.bZcU0Io_xQtW7'x \_PE]-\#=/r>tc p}np'/yە]u!t!B|rZlރwgA; |yk zp8q>>i'x#~oCl sbہGB"=B!87Jۤ mNC).Lh^4yLs'TeH?B|W!B!s>22B<B!B!.j<}׮]TVVRSS3}QJ1k֬I {144ĥ^J}}=cqUWk.C<gZ{n yq/QUU5m.B|=y1ꓦgU!\R>44Ė-[5\}~n7===x<***c߾}JJJػw/999]oɖ-[/裏ꫯ棏>`x'eӦMܹ˗c,]}Qnno!xbAZb A~>w\aLhmI_ c#h=>V1FgZ'PXqt m0sc(jx qP1CX8AО9DpsVq&(/BT>ܧwww_{uƍimmeܹrصk .dƍx">CL$??G GaѢEl۶X,ƺu,JKKپ};|>ٵk###PTTq*mF ٳikkc{.=c/Ha`mM*IǕ?@ῴќd9ihs鲫y,r?n\pB\,`><}Μ9Y[rJhmmE)m/6n܈i,Y:֯_Oss3Oqq1nFzX /@({ѣ;<ضM{{;^{-;wEGyy9k׮套^_rzZi& T!9ꡇ븎柧*b0ússqYUv$s+H *Չ }m C<|Rt0GϋqEh XrEqQr+?\.R\. @)~x<fΜɋ/HOOa`. 5 RTT֚|6mDmm-]v^/^Luu5OXb---̝; b֚[n:RAAA[*F,^xϥBqҀ61NcV9^vs|x+hgBN_>3$m=Wqjuc`0 !.JSlR^QQwߍ,͛mdgg3k,K8&++UVQJկ~V.\Haa!999222׿΁Iwl󑓓wO|%{^(**b…((..~yB|Qljné_29y,sf: ˱5 8af1x=MYfMqr]x|gnii!HLx0qːJ$nb$Bqf0;b^鮒L #ӏOF( !Ąd1!BQf$eU!lͼfrR!S^!8,"}۩%@B!B!34x<(ZB!B!yf&x^lqAk X}t!B!S0Qd B!BqA]!B!H.B!B\$@B!B!. !B! ЅB!B B!B!@t!B! !\b A翷Pոܟ(R8y i1<^*w/y۴=xk(Az7y ɜf9?t[Kja?B`N&sc8qw44os(r=wP5>kآf,v]1*SW5Bۏ)R|O=w-5D;Cn"!wu(Rg׻D"X *oc~8(wyP˦t !]!.`PGQx{'m'Z\Ch !&;shk[Je+C/ZszM@5%dgq64ybSXGLoVaLǚ^O# Rxۉ !3ɽo&ki.ORz%\7mg1w9xhKmDBU>aZ'(]!I.8n$ R*1]N #@j|>A}Gd{*NjsdѼNGqۓ(1 dƗFWj:GJ7!B\t!B!pz">!B!vC7oLUU555Sާ哦 ر/^Lee%޽B/_illDk̙3Yh;wK.>LCC,^4ͅB!BSL)@B:t!,`0jCqq1;v 4)((tR~iybh"\d  3=-bضMYY y;w.<_~W\O?bѢEBqvFcO|Oц6r.mPMmjmA' Y7G}[Jq>z\N-:ym8U(l7<s\}dbC}߰ѦF+G7Lekt25Z'+y7Iѹt!b0o䩧K/H$ѣGYx10 p oo}a8:hۍ!裏RVV֭[ ]۶ߏa222m|>(**kavZ^xz{{bxx5>o[!Ί=Ȣ\~p6#&@׃&dEKר,?%6'!vpG=xOcs]7'WySwc' <욑AWhGc]<@C\h[#>^}##pbuC-3~;eߪI0 `U6qeq d-TB6;k~$YFL'-MKty2:~o#!0&Tlf?zʍşB!'3]k͜9s[9tk׮6$ ZZZMKK 7nD)Yd 6m^>LYYdddcq.~_ ᥗ^4Mz{{)..4MFFFؽ{7>j|>< /, aG!.Z]JO^~k;rVn&׮&v3tlD ։,渮0|Q:8pw+%G`ѨkRkz yg RE=ZEN$$Ӥ>K,I}P%>Yk4+Wwґ؎.׿/!B|2S].J)LLN?WVV;Cgg'D"Vk|̙3)))!Hɞ={3g .$//3f0{lJJJZp%&8%%%477 شiV4M222Xp!dʕ88p@t!EIikeѦm 39y43H=>nO<0ZM  mz倲Ѻ3C:1zJS"=>DjlZg|ycn4c8B[5z >-#!R^ZZ7ߌoKuu5mSPP3ؾ};tRbJ)n9_NEEEEEضM"1xߏp 7Yf;;ٳիWseH$kO*A4UV׿u<ȍ7Ȋ+B!B M)@f,\qi?ikkcxx|BL21˲PM9#RFyNc$M4n4i:i>3+l #L48k>F$;v0phbg %]<0G3P؏ʂShii&9e(D9L+?_m*>].àp8́|>lbZQVVJ)!??2 zʚ;O^{-=BLg΂loе8  %yGAb_3hɆɾ9+W|# 7\o̓7 jj!ZSq(Tp 9Ice oO&-R9r /ę(.*c˧͞wm3e3ofsl̥&5 Lve]hPXXrǯ[orr'۶` ۂoZ\f[rl\njv0 Xq oځ],9ɶ2]PPaLضB! ЅWOW0Os xǹxxkq6@?fpPs{1\O^D)4Xօǧ#Lwj^Q: 5.@?-oy* ClH5 :,҅<8y_c.O)@?R>Ǚ䕟Y~%Wnvxϣ2X|˭E< Эǹϼ䖜hLς/XRO&H$a֬YÇe455@EEuuu=z~͛Gvv6]]]455QUUEEEtB!B1)XǶm0f͢@ @,M^^^nNVV3gg!s#G̤5z3aWW;wdddz?)EEErxޣ.^zR6o̗e~QYY믿ooI.E@TAOKOb:]Ѽ'Sk-{9zg.gk>WSLDѶҎgq {۠s3A@g(9,Z`%@h˯p nチFvEa߲͝)aб5.FT ˮg7id9O ~C759>3Y?Gc)"fD'8"(t6ȫ-k?67fcAig25oѾ+@ۢ;ߠdMpo-YW wگqplx!n`9m`\Sjn h 5'(#]6]pTLtŬt3iK!Bs1qjjj~UW]EKK MMM$ (?Hss36m¶m.]ʚ5kعs'D8@mmmzMꪫF444L(fdd;O(p81:Z3sL^/555tttsQVZ5-84j} o< f789@7lf/\Hf*kc7Md_Mvg4 !&86QarTՎcAYW%mOsyɛG" "j+?% tEqݻd9 qq iY r!+cm1?,W'\"oY}K&ݿAQT.lSuuHePt!B\kzbm8aǮ]hkk#H_gΜ9D(,,ŋS[[Kaa!gϦ,app̛7J z뭼;qeqF.Rn7Ŭ[dfΜa455… SikbF9r>9/2N,ih Z'/R|k. 4j*mm0p%Sɀ[f\q狄nj bt ZChdD ħZAGBL$`zԹy @5VϬG2h3_.`phD"AOo/>3 )̉Ny E4n <(fq3+|#dz1>YU_F:],A H"%I$R%YlDZ-+''7u&qbGv7ɊdI$KVDw.zb{N6| Μs,B/9~^Ѡ}u.~um6N m ژ~l:z0&x,JICPE"7zA.K8'g.;00bA+ã(,3>>N fZyݍ4­IB!J؇{[U~ KG_ M&]D+ߠbvAWDBϷ~x<у.\$q`h_:ŋK= ܢdY&))f]tGnn.7z3AᦐJxHII +@3с3gb tv?   AAA& AAA$鬟     \eH˅NSzQ`AAA* b0zpE.   WZl6w    \,O|ETqAAAAAA& tAAAA ]AAAn"@AAAAAA& YCC̼< .a̜l:ezd$*r.@}Liĉ(^f-sKf(Lh1Y8]+,ñSgJ~^LIĴso  p{= ܴ:Gd0eO`|v76n܈h4o|^zH$8O<=zFCii) ,_Fӑȗe^{5&&&B|$==FsA.,}v$TD/lTTDK@DR!aJ:{%e٨$d댨TǟKHaFAAvQn'? ֭rhhhvLII ~){/ 444088C=DOO̙3F7 n7n%KpA'??^ G!--z۷~/s AXSM;w`cQd_U"=J|̳Qf HZ@7D1ڱ3:%&T (] vGd0}L&oj\顪(2-p~cgo $$&!" &~ud'@x$oPIHD|7_ 0a2Z UID|Mu:xvˤHt5U|:qJ X^˯ zDt.bTHLX\Du1~?c6"Ѕg o Ŭ ܚBQ| f3bIDAT:шlFFHhnK$ARa6e>x<$$$0::J4%))VZEff&jH$_$==E1>> ͛ille˖a6ٻw/K,5ka۹{oEUhUH*yQf6W/t{K|L~]`s=g ­@%Ш@4I1\CRH! 8AɀvW/JHH`h4***0dffR\\LYYYYY}:| FGyM6a2yGxbؾ};֭c̙|)pC}\P(D\\Y\.t:6 y͋Nq,dffRZZJaamWؾ};jEABƣIctt2AQ$YbT"^y1X*d*ɢ aϝZnZYpu-Nу.7$I! THCx DE%\$1p"UDV (Yfg_ϿjMEEōAAi]v{λ(nAюֻYbA8RAAAn"@AAAAAA& tAAAA ]AAAn"@AAAAAA& tAAAA hn   $Ih4$I:k"tAAAA">p8,S^|hڳ#tAAAAT*V^O4%"Yd"@AAALVcXH8ݻzAAAD">|*0\ˋ*P|7MKH8Io4rInG˙[ejzlC|}L0 Fy]e&_4zebUw~co;@{GO0@GoAAAUT*PTQRRh<7z!~}U>ꆓ|$_-;FXpS>%{;j;[l|9_]-,m8q:~oቖz¡Hg:h}|.A?6xKá%}h8MtĖqߵ#Oz^   ė%y/HqM(e9ʍP 2%d2h@<(DExQ(ۯ$W۶ 9*;IRK.+>Y/\n3K/\)y%mHeX,D"N ~[FCC}~"Wpǥ$")(P߇_npIB  jf{)a )~e`(- !ACahH) IGI J=$ Jj[PD!\\@k{B(B' U @|8 aDEB(BCV_ p3$?Em!"Fxh(DZCֈ>"A>$I" *qu{3\%!O׋BW0e0,3$5Z+Y'e<&YEwű(VpHL0UjG 26"Hj˸(Dž'5hf 풀dK |otMa,F#I(|Aq"r16 J<."\IqqAn HJ5< .2)St叒l$^b쌹Q9Ӗ{.g6!_`W]g~zWOBB| \{A[ݹ25s5>c.gEWu^v7X p\R A0.   7   M@A[P0DV*jHNw7SAK tAAT*2,Sf_QTȲ& ­A p ~3=V  btAA  zD.   7   M@   p    n*pH$r7PThZB2/br?zQJɢ(pRTh4$IPLz-  7m{^<,.ܪT*z=@ u:* M8ћtKjffH$@e"Ȕi_s86g$I$$$˾Y\x}  T+%IB+Y ##$P(D{{;,3}tt:Um8ײpv(ӦMCߔz+$@ @ww7&I|>t:S$IW'H$´i0 g,$n7III9v gY1+^J:Z$2ع%U  ܊>3@Ȳ^G!,HFF7±` 매J墿y89VNy܆B+эỵѨr,n&XZFV8M -}FeB2 V?&s}WeY&D0 W}P,)&dY+5+L=$hyߏ$IJv}͏C@y_(R`0() )b:#@@NʲVUwhۍ^gbb8(~`z/泥ⳮ?~\MoMoo/iii RXX(  vWw{qǎ|'`6Pnc7}1FYBJI0$oj=MÇyaxx|T*PNGgg'[l؍v>`E||26e"//OiFF}tt6>vLAD"ʱTTlڴAD"dYn^h4OeeQdY&%%~r3O a4 @YW;$%%+PRRVO5}wN'o999)xllh4fS ~jkkNG0T7vF"}0u&$I +w^/^L4壏>bƍttt0m4vŖ-[we˖-SYYO룰Pa6n܈b!11ɛo]wE$Wӧc4iiic餤011waΝtvvRTT<8D"hZ|>YYYf㗿h4Ν;;B8r]gj5cccwb8JΝ;illd٘L& Z^6nHrr2۶mSPb$Iʿ3. ­=p;wrw3w\&nӦM|>̙Cnn.۷orb F#.sA|>-" aj5?񴶶tRj5}}}||+_!??qشi. 222Pմƚ5k;w.۷o' ȠW;v`{;x<>|7H\\f"11BUUU1>>Jbƌ+7YcF^N,EMM < : <,[ ;;rJKKodnqF.]Jqq/IN.VZE4d2|r^yseΜ9L&&&&سg ={ebbnZ[[?syjkkYhc=. ө& w醴o|J@WW>}:xmOIKK#!!y1<<믿O>IRR~={wӦMcƌ$a6n܈fܹF~?pV-[F{{;zzXnFMAA.yZ-=N_7222Bvv6[l!3c ضm<@mm-qqqEEED"-ZDEEl6,)))d2ѣGj<ݻavիWc4 X*1 <|-ZDnn.Ǐ{wٳgAii)nN'}}}X̱chnnbPTTZQa0ؿ?---g_ޙt$4vލZɓ۷<|bPVVƬYXv-SΙ|%IW_}LMM CCCg㳆 qIOO'--Qt:ze륣;3!Qլ_ݮ innVzeYFՒJt:VXA8_={ӑezYp IUUUtuu144tV$Iۿeǎ9r'|V\+**0lذ>Ӊa͚5SRRZf80_줵NǺut:u Jhd,[1WBSSmmmJvJb߾}裏w^|>ǎԩSq:::cƌAA[yh4Jaa!7={sYjǏɓV FJl0j 1 $''oV2nߏG)c6c7ZH$e||JZZSnٔ)ҔT+;vnAZ2F_G$-Z7 )39T+Jl6|ʍ8ׯrX `ٔ"<67|ekPYY׿uz)222~ڙ܃>g?~"R`$%%jù3{<Γ;O7 XFeFaժU̝;{Ǽy3q6Ʈ;Hłftt:s͛hDRqq໰իWRh:'?@$ c2hkkρݻw~j5?8@DVVYFSQQAYY2<%33ZB ,p8Lzz:f}Q__O4r]/vcb(ctKYh4XXc9(YbddJKK?k֬!''{.1n]A[ySܣ(`0ҥKc֭QRRBjj*###h4SG.]yYp!iiit:F#Ț5kFdddvZ>C yyy̟?͛7y摛;v#IqqqRHLLl6HMMb(_؍w~~>/d2{PշL3fSܝhZ^lBUU+V^x8͛jшjURz=6 Gff&Fd )))X,0tuu)]w`:Hjb…۷st:imm%--1vڅ$##>`JdŦ_V}t$''DXd NHLLdƌݻ2%Bc=~)v>k2c ^~e={6ȲܹsŋO~_ ʌ3eӉRj^ }'vZn & xb^/V RZZ=Þ={eioogɒ%MW]}1|I%FX/Fa$$$(yAy(ǫJrr23fnZ,eƮK/EYYHJJ -bÆ ̝;8=Bʿ?Beu:L# p+`y$I}}}XVٙH$B__ʍXMn䞵si򲟵܍FCR) ~?>q̡Jvg\=s}g~~l9I8V2XHɎ=8׾STMk[/  \.@Ճ].vJ"..@鍻j2-&.^lIN#>>^y-322rQ.Gj4n5YGmIII vAAnNNDVOI=s|MV3 ! wcx-Ҭ'  t   p3   M@   p8KQGAAAs͜3%@MrѱjWZ)6F]}Γ yo<­z  #jmrP(DBBeϺ[ ä`ٮksO  !!>r0 moK~ϓp807,@eAbb X,7zSAA뤿͆`P:lb3 z9s&~sэQTH,DQjZl%Z=&/(sܮarkӭB)0IեqBSsꎝs1;mŴE6&GU*y-  3bqqq;g.2,#Ih4~?׬7/N8݋8IIIсAӑ`Lhii!''G q\j"fݻwúuZ ;yDpO~~>RTT4%wN߀ڕȲ,DcbbBiwbb"EEE3O3mڴz~vAZ[[qh4rss4Bl6rrrzxq1bdd7}CY2mڴ)?;e.FL&JJJjSΡ3mNLL`ۙ>}:z=ƟGchkk#%%W_e̙|_F]  z裏#--˞7@ϓIGGM^^UYy>K_1jM7M}Yo3g?#K,! og1cw}7322@e ZENNz^XVgv۶mG?"%%D/0<(H^OZZM׫>lۿ =jS9>$%%111AOOjn7999+Ƕ?9>f͢~FCVVDQRSSB!rss$ ݎF!͎;{o˗c6oy50ַx駹q:Ȳd"!!_|Çs}hmmEV  orr ۷x;o9y$mmmFzzzͽ7{կ~ų>SO=pxG [[O8&J0~%K?{ ,getvvL>aihh?1fZ}hoogllG}s8z(mmm[,Z={O\\??S[[lF$l6?^N'?˻Ft|{cΝ_wJ]]---|_dڴiG?"++ RZZ LMM NjjM N Yj6pOnn.y뭷xY|9eeeٮ B|>%W^y~xgwy>^ye/q\őw]~Iaa!˗/痿%=o6PRƩj5yyyr1^u~TTT`0ؼy3zR֭[7 f͚EOO?8vz-rss={Mw?g}o~>|K#,IbvǓD]]۷o_L,뮻LpXD"lܸ\e?X,MF `||\ys9ײ@ ;䮻"..J}}=w{ѣx<ϟϜ9sя~ٶm/$ ;j}YeBl X,f͚/̫JGG}L&V;w2{l0O<7oرc<||;aƌ,J!\[8}x*++)//i"}o}8c׮]TVV2}_?`4ehh_~ 0*srnYVzzz8x ʗoɒ%9i0D"Z|r=vZ?̜9yM9gcmLLL`Xt)?OxG9s&yyybZYl& ZMRR+۷jc3xebu b7okrAA>IBO+/|ŝ>__|HDBB:9sPPP%KYaɽ qAYYZE)`ۍVk_s%R"i O0l5ky)E|A҈D"QQQ@ @gg'~zիWZ&tR(..;8 %!!9sjh4yYteWnAm4?>$&&bX(//g֬YdeeMrr2_(..l6GGh4BӧOH˲BN PPP0%;w%h"y/J!6V/^L(--e̜9S ׭[Gvv6Hl͛N F#Wf޼y D(++#%%O?+W*Ai&2w\2331L<#0k,t:ZRf̘N^Ovv6wq1JKKu;oc5͛Grr2̘1CI}2dgg3|&==뤧% p q݄s Bt:FHCYJ$ƔɥL$zϜ"+6}?JurhZe>XzTl{jؓ{Qc9b= QTJOXs'?(&99}{ݱά"~Mu3JD0cX:'b̝I$N'& NwL>gNw'|ly~y^^~e??PXXH4tdtD")u1\sfysm9zPfN  &Ih4L&Ӕ{oIGa٦v=^ ϡP@ lvK_m\}}} ٿv[W" uh4Wa!`ddd(LuA]AA[(ᜩ.Yч, x]7>V|.CՎc WYRD8Vk/i+ 2P($ρP(D8  p|gs _׍xo  IWW%ώu;c-\+ 7 AAAtsOVwK8&55xN8F#444`6km6LB!?Nkk+hxinnVAL4Fz=zz{{INNFV322Buu5͆ᠶp8 3ORR )bоjooޟ>!,˵9k/Q<1LQSS0VFCgg'NBRa4 ZljaٔZFqJ;W捷Z  Oۍl`-[PTT޽)s\\Qg``s+kg+NILLDeNl~_vٽ{7eeek8NԩS455QUU 11*:::ؿ? .DVO 8  @UѰ{nؼy3iiiT*};wUUUv˼y󨩩W^!##|vEE^{tt߿6m̙3BPdjV+qqqڵ,]Fs {%!!H$믿Noo/-b``0`۶mdgg<ݽvHV%]RahmmχNn300@4_df#11P;SNq e{_|EZ-6moөV6_|QßwV>22B[[l6e|MV^ZW*_)M||<~.եv, ,(>]vaX) ^/ \.V+@fhmmD9 Blٲ Ecc#Y"bYxJmm-hT,990{J tQHLL$ "IZZZZΚz)oo)Ah|v;.-[‰'x/Ƀ>HQQ@ZZNASSzN:œO>y#w*++Y`}ݨjt::u V˲eԩSuV~a\.1jzg8._~ 9s&񤦦m6e N8ѣG;wݹR$s=Ox xT*###ۤm6z)۷oԩSFg֭,Z]v1o+VqQttt)**`0vO>t6mė%~qw`mۦjZ Ν˦Mhhh@R!''ZͬYhll_  `e͛7jOhZx<9څB!zRr`D"|Ǥ``XtׯG9gᅬb! ϴi ̙믿^w,Yvă>wߍѻIAvweƍ̛7`0mhhtwfddLp8B!F#䥗^bh4j%55A^QQǎcǎ\oo8ps!  `pp~l&##p8ࠒBt:tFWW###*|>~0::JII2^}dd ~?cccF`hh.&&&x<,ZF__~nZ`0H(b )4QTȲL4%Akk+'Nt*C1<< Bj\.}}}L>ٳYvu|> /@yy9:Á^gɒ%AN's]wP\\… IHH`Ŕ?y_ZV%m<DHII;P^F`@R)J;eYF!I$''SRRºuaJ-JUU4FZFPTTDRRK,aٲeBss3@R+NdffŃ>ӕST`(//DףhsOz&*;O>`0{Cϧ륢ZZZ;w.XV*++Yf 999:Vp:TUUvlP(Dww7ގɓ?tJoDVN=  AOIIQRưZ,\SPP@ee%$&&%K(++SNQ^^βe& xPJa9Jj4)csrrvC)sD_ct,=zɄ^'..aT*.|WR.ϟOnn.wu,SUUᡇl6ىNcllFGG̝;Wn:e|F!0sL#33իW344DSSzHee%fV\Iee%:Xt)ZvJq~?h;Ihlld̛7׋lf֬YT*!??LZ-MMMX)clIJJ"++b5k)))dggjE1>>~Eycc%I">>, vTWWƪU(++ ɴiHJJ";;ZM~~>gϦ )++̙33gnqf̘Aqq1f RRRhmmE$M^Wu8NIKK#33dRRRh4R顨,l6zj%hr8ш^WzO0CCCdeeQYY(dffO{{;deewɬY qqqSYYIee%s%11ݎ&DHOOȑ# p}QPP@cc# bŊ6  A#-I###>^<<###]Th͛ 33/~7z/2,ߴS[[ @\\+WoHm۶q)~m8  ܎N3\.t:6mʰsFB$ω}ƕ|έR-Iz#2̾ZŬ'Xoi$I"%%E3Kec"2̛7p]9{]VAAybK9AFFF(Օnߏmn'~f%IRz+].-bf0Q ,xt8&׆(VnxxF7隹Z7AA>n0.}g,c0ȸ )WRRoe+)M.\. p6.\h4z vtً FWsAAUSSSLLL-]SSC4%>>=J"11:=J__iiiqQINN& )sWzTqMJRR%bNfɓ'+ő#GXˉ'hnnd2a2hkkŢF~;b! reY^__샘H$BCCF tvvZf``#GrHIIall#Gly㫪|ѣG $%%)M՞B`L[[dgg_jsuyb2ѣV'ORѣA\\F9?h4SUU%%%eJ)[la||v 16 rv1͗ϧ~JIIgwttcf̘1e}۔h>kU]],?g\Ruvv*״K5::ѣGU >|:<ʔG  Wr_0@pcz=yyy:u dff_I7x`0Hjj*477c9qJOO6mb…t)={غu+.͛wAi:bʔT| ǏgCCCl߾N~~>v?!sto*Qk4;bÆ ̜9Syw^6n܈bjb49toK,Aӟ^Ͼ}`wߥ;3^^z%e:/K, [l!33SykwGG파 ihhl6R$$x<z=mmmFijjRj^x󉏏WOLLÀkerHWWvx饗l|'2118(,,dtvv 6_|Q srr hhhȑ#$$$m6x V^'|㡹Yq\X֫obӬ|>C+]Ǧ`D(  ٽ{7z`0jvS]] )) Omm/ x< zzzD"l߾ŋ3::< S__Oww7VQ&&&Eӡx!//Ob`D8nc0ժL҂V?).,ƨEVc6ijjn#IqqqJ&,˨T*ZZZhooV222xj*bٸq# OAA8 /%vF111AUU ,P6|k_?1---$$$022B__@;;~ c݄Bs?~K2{l~t:/WR hmm󑙙ڵkyyΟ|IZ[[y嗑eロjs:;;d޼yȲ^GVAZZEEE jAz-ٽ{7O=vn޼6L&PmÆ   h4(@p8|Cϝ!>qqRSS"y$&&rIJJ"|L6;vSOoo,_Ď;Z{9s0g>SZ[[h4ىbAR1c 2  p]01a裏xrrrX`ɽ===_=Yyw1LLL`Yx1o\.~߲rJ6P,X_2+p݌D~2OZZO<{족(,YZ[9sPXXȺup)*++j%=܃hp011AMM VRfΜÇ 000pdzKÇikkrxU*ٳ2عs'[l!(x KggA$|I!,ˬZڔ<˖-SeJJJX|9Nbhhp8(6Dz{{什/~Z BAAO<鴴o>~?HnYnw:nXXmll$ U/~\.HA $b (j,͛GNN =wnX9s8pGa̙>ΦM%;;[IzX,v/LII P~:DssR}3fPUUŦM !!K/q! z~须~L&fP(DOO]]]066ƌ3B200 twwc2|G?pɓ 2|&11Yijjfn7@Rf3###x<Z[[b``R, MMMt:@yy9Z)mjJNC$%D"p8H<9vN0ZIWW3ffQ^^Κ5knd1^P(뗗 q8;e޼y$$$l2fΜIbb"MMMh)ceY&%%Y8fq]ww^0jzʾɓW,+i1R\\̚5kHMMASSIIIٳzn7:nʹ0sLXhK,!##:$%%Guu5HD4%++\222{p:/--f1c ֬YCKK pJۧ|8뼽̙3SNFEE***Xz5ӦMĉ0֭b$==1f~?:O^^B!t:^QQAaa!-RF"z!f3ccc~V/WTTt:F]ǕҲ2imm%//+V022BOO QQQdnzj̙Crr2rwhvzL&٘fIJJ"!!<ә5k 1>>νKZZYYY(E̙CII qnä_4y *p8JRY뮻={6~df̘JbllFYjfYj1LHH ))^ (++SUaa!iii̜9 0ͤ`0|yw9bEZ-6te>RRR0466Ŋ+9s&x<MFZZ 3gaX3gf"z3g*kcWW)E z $I̝;ŋz'33B1 ^F\$h4bX={60>>YYYTVVz%++z{{6mtvvdJKK1L`41cTTT0{lh4$IS__8?yyytuuYXlAAA?.I###~˯ƋyЯ̥̃p8ObЃ[}``σ΃^SSCuu5,c2{ooJ̃. pV:rtL;1*F}-A0PǜK|)X!b0Xt}+XO䕜'#?op`0xS虙#˲2rpc?g Bx+ھ`0x B眵\IAAVqOMMp8HKKCV9|0,@{{;@$8vn立dG1'trP(DUU$''+#V\Q__OUU2%8{ebbtn7ԩSaXhhhD~l߾:(?~'NlK$ɓ?~шh233h4v߯㡡!K(RMgg'񐞞N[[JR} 1}v9]7*߿ݮ[uuu9r9vMMML&j5炙TZ-۷Mzz:$)U'oܸQt_^ĪV#Gq|>:^Rve]k߾}t:,^appzEs5L~ZZZ. 匿ddYf׮]8qMff&:t,  \ESɓ' BܹJŴiӨ__l /`Xغu+żۨjrssΦ Amm-v9sÿ˿066ŋ;طo`jϟp'Ov 06mjb2رcǎc 7oftuuo}vy1>>{ǬYHKKCp)0ׯ\ @vIKKSvwaɒ%j~ӟ1 6l@OOwy'ݼK$$$N^ ++-[Njjv766@'OZF$V+'Nq  twwFFuu5?p:=z($ITs>jD"{=oq1<ccc8NMFss3㣏>b~T*p8֭[eO?2^u}Q^|EVXAgg'@KYѣGٴiK,! {n.]ʻK~~>hA`0H__?0jǏuV x?S7ob4q8htZ[[1LhZT*:锖[ogg[u>vJ͛kkkILLr!IvDjkkVj)^{5/_{wT~122$IhZf͚ŬYFb6ihh@$JJJX`'O)  n.8= wgbb^rSN}g}={عs'####ҮXPt:4≉1 W:D}}R1[V+z,$%%q3{lJJJ#IMMM̛7kגD$!??˗Rpp), p1N'`u׋,۷/2::p:`Ϟ=̜9֮]پ}2cAVV_Ws1C#0w\xۊ+[Ic^v>ȬY1N:uGPAAFEqw2::Juu5EEEY3gEEEtuua6yǰZŠ+(**:yyydff訲^ҥKVZʕ+$Iɓ|}>rFq8z.\… !11"1,[+V`X{$I̛7pQfϞ͑#G'p8aŬ^B233dbbD{1&##+WE^^SXX<8t|_$%%'d۶mtwwO6AAƺ`ꫯ}vcƌdff2<<LLLp8ɡ'N0>>NJJ [nW^!771(++chhӉ?k3g|G䐘x e**)ڭtvvOOJZA0T^gtt `0c||~Nc޼y8csssx +MrHNN󑞞Jf3Vd"M__:LVVsQwh4t[N)jH  ;;`0dbΜ9t:?zF̘1Bzzz(,,dٲe8L&fϞjedd{r222eqjzJVVddd`HJJ"??L r&--4(̟?"f3^K"2NR8nع;w. tRdffRPPJrEYYw}7l6{PƠ[,RbSVVFNNǓN\\H䊦sݘL&IIIժ>gffRQQANN䐕5!V%%%EپQ={򷄄RRRsd˕}\PP3a``%KPZZJRRǓ9a磽L/_NZZYYY+*##9srB׳b Ҙ5k aZRpzZb!_nn.SSRR$IaJKK`0R'z] yAAnGJ'\.:6%㹮c3c=>s+1L7l^M$FGG1}fc/)~?^Γ1<pXyR+_h" )c%Il6_ԺChNS'28tm:n:r0͗4ܕ$ C 8,  |>IDOO%s}P8>ok% |auD[L17`0H RWw&Ym 46>u]w';?_J^ BAA=KytV!2zN=W/=6R.:VvRܣ Oqa2s)  4BFBДK ϛΪb~a\q\Z-2>/jjH$rUzcւ  p8oTسgdddhB޽[allld׮]ȲLjj*`tvvE?;wT~)ǏLػw/$''_VwNlj'طoddd066֭[q:ʴC{졺j={`ٔjm۶alذjeCqadY&%%ea4ٷouuuhhkkSd``m۶HOONσsNn7444{n\.RD, 蠽ޟ.Qq>vvI{{;z=ʁF$$$k.:DMM T*vI[[t:Z[[ٱc.Lez8e*O>(dggԄ> %%c/l6f{UU555t:Q^x<7a``KJojjR2jvMJJg߿2vBػw/3gμw1~? 2Z*NwY;vJrr2,i&=444k.+ p* h4޽Y)((ĉ'?!))T^|Errrؼy3EEE{fʢ`0HCCl6z-,X@ff&Voݺcǎh8r ,qYkhh@׳yf, :t'N|r' a,X~!iiiL6 Yٲe /ra233Qtttj(++Snrl'55Hss3|K,AViӦq%xٶm===yttt_ Qռ⋔eejXj5Ӄȑ#ǣVeiiiall ɓ' p INN^Jȑ#477cٮ[&|>Z[[ijj"117x3gP^^`@V~zؾ};>QILL䥗^"==]2Gr سgo˗/g۶mtb~a:tH$B4e߾}v233immUf_(q֯_z$&&288`tt:0LQWWǑ#GFk4ih4<9y$6СCaZinn$ ̛7?`8+xt8߿>RSSijjNWED/~";; zz, `&F#]qjjjj`dd,8x p#GhmmER땬p8ZMww7k1o|]  |]N~e˖ F2::JMM K.EFBB<n' KEEp*6hl6sQ~?g=uwufq:lK*UVz9|0jT/_ᅬ,ʼuuuTWWV;8t@,X,˘ft:UUUD"V\}{QٱcHzcժUٳYjXVz{{ frss;ihhɓ477D8&??xzzzeH_TVVގ` ''>bv;?~|~my^z%!Ihݎn {ƙ ,V&YP9JTZdbg0pgks|^pK.t:Gx )..ʕ+,--K||)--eǎ݌PDDDDDDDDSk~?/^j+P^^n322>DH$g?ܤ 7oxl?O[nyFbf8z^>#JJJi+?~G ƮD"ŋA!==YYYayys@HُɓܸqCt:IHH@VrP(Dvv63euuUh`v9fSRRBaa!*~R)޽7xD0YYY=z@ Z-deeۋ $P__n'? ~F#?;755{nt:?яhoo//ejjj=X\\$66o޽H$B$ĉ,--188D"AkqC4ꫯRXXnv><))4222JD"R(8p2VVV'77'ORXXHJJ $'' 2:}{ HIIѣdggcٶ;'' zzzXXX@"N#Gc+za<,.. 'ܤCXٳQB%%%Bz~t/E HطoʹSZZJww7.`0&:tcǎEJJ %%%x< h4cXxWHIIjEVV~vfgg?~3!kky|z=QPP t$acc?U222tbZ#11Eijj޽{ ){nx"?"ގZpN[[ 2>>O B!h,Q-ɓ'ILL󱵵wܡ$|>B8p}fgg9z(tttJ$LLLсC*T*H$lmmro׮](JQBDSTDhDdHRR)r|ۋw8&//.q8HRd2A^ޯT*YYYa``={/g jjjo~CRR`ĠT* B!v;ȑ#LCC t:h4pU^ :^B8;w_BN'wݻB$> w.<XD0jDHLLٿ?deekFFFnÇٻw/[[[L&r9:DP*|{נ Rip8j% a2d\.$$$O||>D, cʈayy^/DbccKNcΝHRt:ַ뜜NIQQGamm@ @FFz"L&d޽mkFkV+ f233IKKxa^]];˜r9 ڵ#Glfcc7xCtNGZZR jAqq1EEEdeea6#55FL&ga}}F#GEbb"{!޽{IOOjjEQhBbl6޽ , qqqf1Lnرc[[[ǓO~~>٬rq0ͤj"Q"?~Պb!--m\q8(J^{5V+FVWW1LFAA]jR8~8d2rrrHKK#//O{Y7%--2V+j N V+x^233)**bmm'Odd2T*ΦB j~RRREVc2X^^F&|"7:&Yj%n[ȏnnnRRRB/Aw8Ht:nWt:)--^{̼ٗ(ŗnل.ϊn ߏD"رcCfii[nT*رcMLLPWWovz3P۷o366@jj*WYuEDDDDDDDyA菳B`0l+Y}Ann h~ss |n!ZYuC"rP*vIDAT4H$kS{|ϵNA\\ܧ}D"uBܨTfĆB!^/pDR|sGY. u~nt$$$|c%o22O;P0 u~߿͸lj6G 7X|e/*FϜu&e B ILL|w&b73@">h4#}q8MDH &(/5J?gv T?}|^EDDDDDD|bdfaXakkj0r-Bfjkk ##Yn޼)))T*A{pT*}bbjFGGINN~pBAtRQQ$33jjjhoo'66D:::h4 ݌֨ 11˥K$c0}6# b2dOSSh4j5uuutuuMLL ܺuERSSYXXGjj*H:%JOOuuu~A,:nTݻw1Ot|Goo/~ׯZ,//S]]Moo/z^1::JZZSM+ . ΅ }'qǹ~:{999w___͛WVVxw|twwӃR䣏>"&&FS(3;;j%G?q>jjjp8XV>0 OևR__Ϯ]j޽+`0ʍ70jAN`0Zt:dbb*<###TUUgϞϼnƨfyy4VWWÇLO-d>KO5ЧP(Dnn.mmm$)) oMII dggs5ٱcf͆\.gllQf3o RL&crrA̓ ܺu FCrr2tuuqIVVVX[[C&qU*Zռ{ݻí[8~8d2ŋ Zڕ`Ϟ=TWWc6IJJ6n!h' 4f3PPP@ss3 >|Xzillbpi͛7X,Bn2twwp\nz{{1BzoWW K -ߏ\.l6??Avv6 \ÇD"wۼkU1u:+++4773<<&Ip:x<R)7###cihhÇ|>Kss3t:Ǎ!޽ Y LLLO[[ӽST8q87 UbffW^y8N666tttV&~TÇp8f188Hqq1 LJJ 455޽{YZZIz=.f.r9R__fCRIII }}}HRnc6e, nzp\߿;w ;wQT*ն~^nRRR!&&~cΝ\vbFFF"##˗/sQjjjZvYZZطoCCC455Q(WFz=8ILLdssS_JJ N&7ػw/)))ܸq2"++K-}wˣdn޼)<6MPZYXX`pp2߿/<~zd &Dn筷b`Z1w󑝝-B[&))m/ҁ@?P($ ܿH$ӧ֭[PUUm}\z>X\\dnn}6?n߾M({=$ w/{J_:,//zPQQ!D|{zzbaaJ666>Ӝ={9:;;innޣ7n`ۑdVꢭ,JKKqF#n Anppx^^^ H$8wKKKT*v;jN޽+d555q}.^cmm-at Qh;w1FFF8q Wr5ovHNNb@ZZf3Fd@I?{_ŋQT\x%F#~ ccctl6\B8fqq˙%77JEff&΁G3|;! ׇL&.tuu177ǩS8rJd2laΞ=Koo0vܹsӧO###hnnfee~dDDDDDDQ|裏ѣ\vEyPCDBd2?H$uu ? äWWB BTUU?<8ٳg)++$ɶ၁ !m2P(˗Y__gbbRSS???֭[mr^{5QSSC @" JH$Lvv6qqql6ỏ_c~~>_ =z+Wp8H$D"v\s1x<,..n{|---ӟ<9իWHRΟ?ϥK|r ill$##"B!V+ k.HKK rOBBB0y-l8p:a&&&p:Sh4 F@uVWW9qGP088V)))aaa[nQPPn#9y$;v9W dyy5T*6?t:t~m4˿,{,ǎѣ1>>nVKAANS&&&jb`6h4R[[Kaa!,..-fRӅw!j5r{yD"+w)8vp1JJJdttQcyySNqaT*ӔpID"dddo>IJJbcUBU;jwuuq0dggLVV&%%|{/8e 833NN.Z-j<DZlLNNC`8q ݻ!Jx"qH$BÄB!111H$>^!H`yyǃV% RXX(8|WWWhtnt:PT zqΝ興|Tc333=z} fAA~w}u233ijj,//ɵk8}4*1vI\\HR8oee%PYD"]]]Y[[Azzz?T*fw]H$rfff&?GQSSS?~Ap}P*|> R΃Fii) Z-FZ-B=D_£/EEEs5lHRf3˴ _j5 `8>|h4D"233@ L&35 n8Of?ةS:O\<.]ի\.L&?яdTns-w"Njlf׮]T*CTr=VWWzhhh@ IJJ`0PVVFVVTVVrСmx"d2L&<ݻlnn~L&F} L&eeeT* 9iD"d2ܽ{W0xwIvv6zRZ\zC!JQ*JCT='')v!%z^xgggvHkk+===LLLZ\. g-+HMRSSY\\p{nN8s4ׯIAA F#J\immess"ihhrm۫$ JR١RP*߿7orevTVVnkq'hHJJ".._}ιsZ=zz={j#њz***cvv`0Hjj qeN'999l6l6C"|a[VV0> RxСCsC?:H$IIIh4RVVV>-+ݶr9;w$!!k׮D(**b޽3o-XJDA...KHo+**xl6d23::Jvv6 j%??Q&''H$QTŤßlYebbDBjj*< ÁJBV`дHMM%))~B:RF*k.0==`  ߏT*%utt˅N#..NhĶk.bcc`eeN޽{q݌ǎ;p:5eddPPP DIII5EEEB'!NMMa0fx,..R__Oaa!V'OLoo/p,46o0عsGY]]`6"--MxNKKczzZ0 O%}M饏ϣR-X,n󳳳?i,..b0dcZ}ӉVessS0Zh"6 N 1lnn288B`׮]0>>Nqq1qqqD"R)1r9 2<<bۙT87O%++ưZv YBQQˌa4)..fzzM `׮]B!t:bmmT233x>Nff& BvyO ^[[CP`0/?@6yQ|Q:Q5?&/^äޮ_EfD nل&J}}=###}znDرcǎ8fVx:ю?""""""""//@___''']D":G}㬬P(P_˦`un[hi E~ɳt:qD"8NFsomm 9Or%M"ڕ|kkEuD"f!H@?@pBE `sssMB9ב@ }<^uX'B0dkkk[I$! 6qycD"|?j|~~:ƾϺDB0|z$BH)pD~o/{}^jAZMq6Og}}@ \A|><˾ ?p0nkWBl6n7ܛWSdvv ɈG%㞅-:ssslmmm""""""""?%Z+ INNjfggIMMEPr pjkkijjBѠh< TVV2;;KZZsss\xKFFSSS?f)**ÇTTTJzz:RTP033j}t\tuu/:h4q5HJJBRQ__O}}АW^e``@XƍD"a}}J%{A.^bpjV}abbm?/>bccb|c:V pyRRRHII! c0{^> ž%{pTbzzrfffHOOSQQA{{;hZܹCMM}xxWb`uurX,P[[۷h4zD{UUI\zNƍ|>RSSH$͛7 B&OF&q=imm)UUUڵKV}=Jkk+ܻwrss%>}rpϿHX[[{jv磪f SO{{;~Ҙʕ+LOO>{CQYYIff&X,݋dp>|ш淋7|m7!99۷osgN}P]\\jRSSJb066Fww7'N j\t#99,B\x={NCC:YYYd2<& .PXXHBB峯]vaXP*n*++9z(R_Wˁu))) j#cX0L444`Zioogrr7|,bbbhhhԩSR[[&--%n޼Çzܻw;vpu#4Ҽr %%%s-VF#j۷"bbb0366ɓ'INNfvv,fffq QVV&CTOc߾}ꫂ"H8x ( z= ݻ")))9rNG||LRR%Gfn7<Jž}Hnll,ɴBrr2&;w 7QՒn_?~lǷ; qe$ 466j~:###twwz .033Cyy9őŋhZիBٳg_z s~~>'&&F>JRܹJ">>^Zzh4a|| ?16b^e#H룹4Z----pmFGG|2J /{GLL SSSH[na4jrYVVVp\rVۦ<66Ɲ;w|2uuuQGBS]]ÇJ={!\NJJ 999p=222p8D"6ץ;vLHonnoop8,//IIIu?Nii)CCCpN̑#G;vꫯ x<F>|RD=1@ 萟?!ohh 677Y\\NɓBVXRj9tFQxF333YYYa$%%!gm__ϟGT b||B?N(beeEpP* J NDL&~SN100 %CP`X(((N ӧXVΝ;w9fff~:+++ܽ{1O!ǩSXYY!0441l6'N`2vs)/}q1\.ݤs j5ccc\.N8fxx2;~lll,fW2==O j{<Ξ=Kqq1122BOO  r~ӟGTJ8\~(|ycbbdkk D8xn7gΜȑ#޽xdߏT*ER ѬH$B(L&Ur9J'|/տ"++Y0PHvDΝ;9x ~_pʄa * Hrr2=zt۸Y~JŎ;!55UhL~~>zxRRRh4x^:;;9r`YZZbff͑#Gػw/9:>ĿLgll ( ?H$˅h$55U0j5[[[w\B!>L~~>KKKdeeqaB`lGhdt:tXV9uԶhTAӑO[[v">>^VBR!H|>\qFR)U("66DO|qeo륫)X^^~ُWO5z-޽:BVp8o~677ʢsαD^^|D"GFjZp=>JJJ>S:l8r177 uuu 7C0dttGww7455aLii):N .]ڵkdff?t:۷o311Joo/DghhFz͆ERHssxőNfaamH$/Er\prDevI{{;/^t"ɄD#\Fauu6>V%>>;vt媪*{=QVE.3??#Z)~7nrdXVRT߹s/eBT*e~~ݻw3::JLL fU 6m,Zbb"G!&&JNN:F#### rqbcc1 T*z322p\dggVkL*=zz=;vFנFu Ty$ ۜDӧO`ff9faz;vN>-<sQRR¾}p:[(J:DJJ CCC=z2***Ç3<<~;, 9sg2??O||<ϟ,x$w}Ν;Gbb"SYYਔ匍 |733~߰Bvv6YXX`ddDHߏuCj5lnn211AJJ=STTDuu5'PVV&l6P(8>B7n`dd䉽\*Dww7###ܺuYa>LKK |ƿ7F D{RPP3ghnnȑ#qR)Z$@lt"ʬ%%% M LMMb!==׋ -- Ddll @vv62Y E 2RRRp\$%% $;;NBBkkk'RX?+H͆l@r9H$/:tan7$%% L&D"rrrz:Z]]h42<|o!5FFFh4177 ''q:bZY]]%11-yJ\ H1(**V+$%%!̳l288N#//p8,8 ߘ9rrrHLL244$!zލ ߾hobY]]ETbX^JO/!c㬭P(0 ۲K?@/))yy}tУ蠯P^^ R"_&QeGF= 1P[[<*4G ټ꫟D$uuuar9K @d."""""""" 3za.HP||gOH$+b~,G}H$lnnHHHRr?qYD"\.!qB29#B%Z3%Z!l|QD"R tm"6y,D}|xqG_y#:/6 O OmxC|}<~̗ȋZ"""""""""_g' H$BLLVKDS?yC72= =s׋L&ק'..onnWhWEDDDDDDDD^g[/gA|~ٗeuuuי@ 󱲲r=~?NSLF n8N1@DDDDDDD?ѿDI ܽ{ &&&HKKpϞ=+te{.W^իW~:dgg366˗#%%B7gcct$VY[[477c4+zz*++%33ӧl`۹z*MMMH$a</^$99!;; Μ9Ý;waΝtwwse\.d2aEhip8hmm%33+Qw]'!.]DOOIIIja}}$]FMM  tfZ----\vMH$BSx> "N   Vʕ+Op8Lcc#:3gɄB!HHH>zayV<}}}H$>|ĘywvJ8~dO}BNNQPPݻw裏0Lt:Ξ=믿NUUiiiד1LaXÇhZnݺŷm.^Ȯ]t k׮p8̤C=K*աP(`~~^N8&111F.\H$455LVV`ׯSYYɞ={ݻ|;!//LF0$33SXX(8.]0eeeR֭[>|Do~N:EWWHcÇl6>R$33%%%{v"xReصk WNAAsssp8&$$0;;& Fsr9?яG"oYZZݻ߿RO~N' J%EEE_%xtnj5  !hg/ZA"Off&N|rrrHJJB* OTD"! B@b2y{R.?ffqq׋^'%%E.XZZjgQ455"xV+uuu>q?֊ &''QTs-N'd2bbbdd2N>,333bILLD`NLL wfjjwFL&P/}|innaV+VEn߾>ݎV% 199L&#++ D8~\Nnn.(JZ-匌yyylll0;;V%33U $%%2*JH_]]effdajJ2 R)* ۍR$ hcffMIIIϳEzz:x<f^$^WH ll6"FL!*h20LBrɄD"aeeiIKKKKK 1 BnGP&jRԔo*JТM"6 ٌ񐘘H$ann222͡P(bшBrBd2,B-&JRxWWWJXV|>G(͑D"h4bp\hp8rP*8çYKLL2g$ hZ&''e H$R)z5?괌7j233q8,--VbӉF_ff&`T*& ǃdnVƲ$ LRtriixbccq\$&&233#dβAZZ~# s"""""""}> -S !jӌ,WWW)//gmmcǎ=*e2&陣nj<HC{r"y@fN5233_؅K$677}fD"D U*K~QDR|qa$ 2p8dss/Ftց<vIHHx.p8,K]"H|lmm}MDDDDDDDDD"aii L\2E|j<˸uHk5O_닸<5 J^~RF|xp8/28?ٰ-l68ן*yI|>t/.tQ*DX\\dss?rX[[{ٗ*"""""""Rt}>gkk멟?ѿH$^ իW"==Jo6HDxr kkkdeeq]999 s:;;rjjj+xFn7ΝA.Yz|͛7`bblye.^Hcc#P49}4&Ih贴įkRSSx<򗿤P(h7ovҌָr h4Z-ϟ;vKSS ᕙ o61>>O}}=ر:Ο?Ovv6zq ,..bXy>RI999_:h4GсhDVsUnݺd2Q^^Nuu5$$$9wL&t:wܡInn.uT*նr<{nx<$''c]__G~a!!!H$ +++466bXD(͛ 677'55+.A-{LNN'&9szfeL&l]]rH wݦիg\DDDDDDD峱ALL BFT*E* OȎ466RQQbAVs~QUUb,=*:egg@^sYv܉Nf(,,Ç?sm;v젡\NNNn^?N @cX8<DTJrr2YYY]Fcc#{} BΟ?OAA>I>A~Rƍ HнH7}>n:::HJJ_|2;wdΝddd)//ZZZj={Cbb6]*r]jkk#77>ٻw/D"𱮯Y\\… LLLCCCCT/cZ///JFFwre, .beeFuu5555h4y&T*oIBB^hhh 8wLLL}x@ohh@gg111AUU|>f3466288Ȏ;̕+Wx&a^f###*:::`0pn߾dbeek׮111!,// N |>ڢ%666zo~f;wP__B`~~~!EDDDDDDD`0'H+Jy(z@"Bdff266fĉrILLdΝ$%%Ȏ;eee!;; ^il6睛cΝ۷#% %%%eZj ƾ`5V+,A3RZZJ$!11TvJ;vE||ݻw@jKj%!!ALh42>>ΩSP( N }68N(,,qS\\LCCܿ2, 999( \Bbb"EEE۷OȔPT|/{FFx<HLL$syj0vf3r666X__gppfffƍo[CssspQ"pNlj'u@Kw8s!ZZZX[[;qqqlvvmߋ:."~8y$111->vM^^N82D8~8ZZZȑ#޽{cxx*\xn&&&Ekk+G%  G/^Z[^W+0<J%?_c4࣏>"99^{{o>())!##< }Tj'>8---\.l62 NVeqqU$0/Dž t?`ttLƏc0 ܻwO~~?$''j)))ng~~~{<j5ddd C"ڊT*% /t, dddQ~Z!MIHH-k&Ub4avve^pJJ H$666Zdgg9>B@Thַ2RFFF_8N}DBJJ YXXXR)rXV+LMMoILL FJNǃ9R)~_x62331ͨjF#JZM||<211~;hӑn!.Hp8Bp8lҪ֐JhZX\\$998!j4IJJbyyI8`0Д-zzBf\/шZfff+Dcbb:F0DTv#HZt:QZ& 1??T*d大zER1??O0$55L~BAzz:l64 HL&.Kx D"xdVKVrlnn AP P(3;;Koo/֖lngkk 2$%% /+p` cZ\.1~<FQ/,,RӉl6 {qqBrP(űR$66F\\~X!y#6 L `ccChLҒdBJZfccCFQޞ"ԼD󱹹A*gccR``kkEa>p:`2PT`0X[[CPVWW`}}cǎcǎ} jLg6fn7n8]^lq]DDDDDDDDg1Пh,Hr H$lnndY[9Zh4GS~~Wc\.oT@*RQ$ o_{Lt\D{r' H$"&/\N0ܒLRLvY% ri/kEr17m_&Y(˅ZL&C"|od3Qg—>766j/5}ccN'HRR WEDDDDDDDD^͑4>O;ƳHv{|{QMOs}5F5G"fff57'Oښ eqBsssx=== cٞ><|t:q8BsςfE^~Dp8bllON8fzz`0<sss?fgg?uF"|-~>/:n1gm< BO<ϻ:twwrbqqqqtvv yoD0|ٳk̊|3?ѿDko p@xT7n8Nrss9s ׮]cdd\fff裏hiiAѐ+W󑝝D"!Ptuuֆ`h4>^ u ^,//[o155Ν;Y\\ܹsȠwL&XXXFFFioo' a0x",//#Dy]..\ۨjZ-~!޽Xjkkr >d~_v),,d||w}Z߿ݻy&gΜ!77WБ[&100 E`>^Ǽ*׿5kkk055ř3ghjj"&&d*++~:gY\\bO ###ܹsD^S8u͐XYYooth4.^H]]nlR)?#Q 闙Vz&&&P(BWܹsdms"_,@`0-eqqӧOs%Dx!qqq;wO8F|b}W{?+++|466Nffnٳdgg3;;KZZrعss_g0w%>>rjׯS^^ 999O>@?A$ommq5?1vsiP՘Lmz|2555,---n"?o ܸq'rqM233 ppMEE嬮><+.\ IpUUUaӷ}.z]Q㸫 ^իWIMMݻl6j5ܽ{8 ݜ;w`2`bbseew}]v ㌾VTTx(**_Cvv6\pF~~>֖h4'a}}X@/*=ΧH{:EEEQ__jETR^^ΟٟQUUddgg+`6Q(h4Dğɟpe fB!XYYÇ?$*^y<ϟgjjSN=W@t~ijjt~:fawwwSUUl6SYYɭ[(`JjkkfΝlllp%Z fhjj͛\.'++ /]Dww7III$ Ν;Goo/nÇsMjkk|$%%qikk#))fn tFFFFp(Jjkk1466r-\.B6668s yyyT*z=455ىNC&q9ۙԩSQYY)HkVVVjGѰ,,//#J_MM GÞ._L{{;j>#:::p: /^4&''pdff 2555LMMONN\xIWW+WpFFF(++ctt;w%533̌069?S_Nbb"G<2x l66MPHikkի<|-z* a@&Jmm-~Rɹsc||NvIKKp0772vB! {{PԐE||ʕ+ tuu1<rssٽ{7tvv\~TTTܞdv;"R".],Pݻw388HQQo͑|L.^(zioomooo=팏pBq8oDg44# Qz-|A,XSꢡ(^/=?OIKKD"֬Ywj\.|>^dnN~;F xwٺu+%%%̾kkku'rs}8ԩStttMtBBw]nܸᠹ'N"Fظq#[lڵkB!lw)..ƍ9Zݸ\O\Z6322srrHLLp033#s ٳg^{\}Yz{{HJJڵk FJΜ9Cii&N(+WrQ***PըT*t:FV{OhӧOs-p,~ӟ t\r&Z[[YrgHD7R~irHHH 77$Q0??_D3( z=?}P(HJJ"%%p8Lgg''NFM Ybzl233TTwC$. BA\\&Ӆ?1VNG\\:DHKK# j!==vZ/^ÇikkCד0Ǐgff)$IBft X|(*ln fn'--mBsBbb"vF^f||}" f3 ,@a0}("G8 ^rJVXAmm-.]"cZb8Nimmr111$''GYǃlz^$, EEE"Dn\b9f1穩F!kz^όF#O<YYYBjj꼵Vll6 HII<mmmHDFFptwwSWWjejj ߏd";;4HII zo=wpχnJn333#}l6Gf 1çE N9Jwd믿NWWZ·-G!..%KpU~_a0())a"f .dŊ//deeQ\\|s9‘#GX~=͖-[r 999lݺcǎqU֬Y$IٳGxg|I 9uvuω'ܹs_ׯtR}q̜%3kZ^bccch4B__LLLp(ok֬ĉxغu /**"##ZFFFD",]QILLh4B@\\XZdbڵ;v1 $o .Ò%K(--JKKcpp#GvINNE}7իWsyz= BaPդd^yؼy3 %_PݎRHբQTL&,Y‘#GصkNSCuuIX,$$$PUU%$ _ Bjj*vpVUVkFַ5O&.^墸"FdQME$VZȈs#c||Ξ=ƍE ƍjǺI0$&&bXD4ڵk9w0ܒXf8 U*$''qF>vZ 'N`0 ޽ 6055%|JٵkoYv-IIIG?bppϳuV_㡬L 122B8FaXذa 1S"T^Nhll)o###RD>JKK۽{ xGThdڵ 2r*K΋R ))W_}P(Ŝ{FW)ˣdBr3ϰdZ[[կ~la0dffRYYɕ+WBԠT*qI^^"499F#n7>,P>~iqFN8A$a\|_WT*VX̦$J3<#RHnܸʕ+ILL߯b+ yq7;gx6MvIDATi~ؠx^()))zbz%..Պb`XpXVZ-iiiT*\.\Ꮂ_D;r>Ӣ8>OxV& BhZ222p8")55U ^SSS(JAJ399I0DTA IIV( Pddd Eei$I">>dqIߦ뙞e֜N'z^xx 6 ۩%KlFbZKPSscHd3c2;r縸8N'~E8#1W&<p=huO%IJJBшy<|c)$IRro|033#R ѨX[^dL&NF||OZi)JZ d2D_SRR>`ZINNMLLt z=IIIE,=C$%%9D"t:L&hR2"{kZ0333|(IjN0vfku^ LMMġ`0Hի B(J!$''xFh41^. `6Ed$ J  ##ߏ$I?fߏj{|>/y'&%%P(̌0:M&vArr2 BkczzZEt:-GW}+b0:#V+dcqYw>_pt:IMMzqߏZFTqq\ FeT*qBFF+@k1aa={5$$,+w3?>@qI,XpcvsQx;] nܸ"Yb\B$N8ҥKLNLzf_^mEQ xG ¨5j6l@^^nH!b!nZ͐@s`N5S* n/jVGoFF~+PPΆg"!'sjQRuB% Iɮxb!/ v8}=w*F_aNQ)J\s.g'ϢR|V)uuacFC`Q`*ęO-' ͙i63AiVٜ:B>;D(EEd297ysb!b!JOsP*P+ԄaVRITbi8:˲T(Q "E BTRH"JB9;s5*l]B$.Xc %QfۨT(gTyݐdL¨121/STϓ-'ϹZO)JD E%TYkJ9mcX? 'OJC~B>};dvzz):FPPPw w}d'd|E S֑kΥ{Oaϟd}*0esujzVE#BJMJ5)">K% m].ثGwQD:^̍R=>"DQJ Dx]<11ϘC 1C _Jiyi?UUB>:Ĥ{x]v6g3`ARRِRCp#}>, S/]~iv?w#AF|ߪFcǸ2v7 x)*S*.xFyʫdgTS$V5Rvr|CWhJh#NtD)K$J f^Xl%GY&9 HKkKaq씸 T<8Nq]$ᑢGt rW BhTjM> 0̎Vy{|;f/y lsϡUiinɷE./*g-g7Î<[,q;ťK&l+;ȳt:jku¢0$D>'˟t}o G8mI2t1U?,0a6O:QH `=#W>+IKdHx֜t g4r窞Rg7v2{%˳ő;sy&΂bL!ݔί~--P3>ͩK>:zl=Y?/X]GA1QRF5~1݁V$x$3gś1L=Ӎ/NfӸB!/iqih߁Eo0}!> @?--zl=YJȭ#^ܵ#A>+69t&8MvRO0dI^/,|"Nj_aZِp4̞{9뭯SP/sf|3Ba?S%$s n5?]Szl=,J_DV|g2w=}W@ 1C 11{4UUjѫtMwQRYkee6!ƈ} I$.]F\s' xP+ԨjlD"ƜcC sI~#՘Jt]]zs3uf 3B\c;qP\Jt΀ v]xX6o`?(JcM&g [="L0@n•/k_# 1oϤw/>\x"= Y3g >o=δgz*,H_@X3)Bf|&gΰ!oy y'p8NNbaBR )$P[KS7p|댻imLxR- OZSs&\nrr:~i4:/1F041^f|3%QXHqb1ɥd2H4$ohH#By y^g_pi%ϒGnB.mmnQ _eG~;uuzg- oG+6y~1dkևZYY+X ק^{dsz RMSxωHPT;y y8}2JK(O)2RvEV| S>qftLwXchO]`ARIs}c i C!j#Z.k#-[b1?SQőf|TTkΥR@MF :r,Rnb]L{ɊϢ84* %Khnqpd2Gy<,kRN#N7r9DOgߏo6lBY1IVe"ǜCQR[Jpv,QRȈ@q(S)&Ыgm{fz8;pc3Aү yq]xfLS\Bdvo˟)z pD}"x.\wdH4ҤRq/}w~B1{9 ,,H[FaAn%_Қ1C 1dž$I"'!+~k˳SX̪UZq8Z#& o˅ hgb4J &q)bS=s.tfJ#٘L$~*o\yj9߬&;o#SRca۵mѨ5[´]˺unmcgNJJH'.6F8NZ#J)SSGyJ9D1|^*].- 2 JJ1 \B`C7q\wlf|3w3hd9Bs$Acp0흞[`=Δ{6bLA$0HքQct8x%WŸ, #?RMnB.J5khn$nl>)Qj߅Ik"-.m#$t*qȯithUZ jzRC6sJ jk٘GA0FLgaҚc31WpO0  ~ [ m. _<}>f.D GÄaz{ge1Zy1 OQ(QB>j=Q)N#`Zq8ƥt }zP$D 1`(5<#"uVdem$H)BK!M#MB>l{8M! . _譣Z ѫv ;{7=dVWlIt'9 9;RM14H5QjЫt I(JƥVaĽ$$ ;s1`3AcMxc7ÌoP$<3cPH4$ 1kvsmICtDQCv|6 ҿ;)I* .^"/!HMF w#vE)CfxqJKQa 1C 1Ƈ) n܇Ik\FYbVg8Nl}l.L9JÉ,X’%5FP'3Xc܇'D'No8}1O~B5? ɐ$8xYRx\c|ww9}[9ueX,SC!~kLZHr9l.L.ơF4* ?\Cf|3l)΃,\c]Z%K83pB7Iqb1T<Þ{9}~ فhѣy"#|ǧ%?d;Jƾ}L> 6$ FD FDvOȃ>ug+,xm,ϊf7̆NNz'Nc=Xt'os7nE-zSq!( xttdLBҡP(l0Ɇd`ufJ5h & o  ZHBEo!*EgI ,z Ih]-*7lHVR`!`1 $|8#H`4Z&QZ ClB[[Fa?Y^' v Kȣ,(J!/*j6@8/#^Fa";N!_$(/"CÇ0L" Ikp yP+T:W-xC^Yy4jk"&'O3B# FC$A}(F1̒ZQ)Uv4J Z7[Y bQjA,z8|a4* vlq#ATYviOȃAc]J-& φN#^# hڀ7r1OHPPN~\>5zS4yPjTVƦMg2& B7A!/x](h[f3$yQ. _ ,b!b )sDDՒ4Ϲgȉ_e L?8w\pa?~|7k.?7 Bs|A0㙹'y9l_dhrw!6mwSe|"i΁7!|0OőmFA} vĜ~nFퟅaA?2 x獱x2A ̟_Y>;dn;ϡ,*+0e^ isG?e|a۹DϹ$"R$ɐD9{v Ss#ph,"ѬuwˑS7N&ѶC|o }i(Q!3tIe.S4/<;E"+6T:us4p0# auw]gVK }w:>GyQQ0o޳b,!VwZb!b]|Ahl/Q)J1dc2y4)/3!*E2~KҜ:s<=_vD()tip-I,u %-is}l}{ʩ}%]Ec=g_1oQ6!b!b4JQ[t;04^/^GJRʧU:cEc4O(P0=3`h`rjKV{_F$-5INJC 1C 1@!R=+UJ4: _$4 pcViT/jVP$*R4hg<%Im_}jT_nc!b!b@V G#~^y4:h4a|>>o6\$͒C8|yA~xN8& {$Ia@ % B uq4H$;] 룞Qy.3Fbl^/@@# λFѹr7 011s)U$ʕ+477ϹZuhTiWW.]qchh:&pLʲ;W&(vSN122D>Rsi9}4\|9y$VUm8xW|RD{EQN:nϟ7uYW.}}}LOj.ʹ2с3_!ىnƍC͛;a$ׯs;wQY {kˢnz26w.BG]Is{[oνN<}1C 1 OB%Çٷo撐fB ??;vpW_QZZJ?vܹs"\x۶m8qIYY BFa^yΜ9` ;;whh4ݻ{WR\\Jgg'˗/gddz'Ob)--'33L`v/%%%vׯϲi'&r1(//GoH\\&7|={l2zh+W(((`pp_WLOOpBzzzx7̙3TUU{njkk룢Z=ߒ$DfsX 0*\.iiiEPe>8QT {QYYJ"FWW8ZZZؾ};Νd2믿ΩS#//p1vAjj*333l۶ .ba߾}:tP*n *J߿OQQWۍ4[IKIlk9saimmߦ<>>22›oɂ HOOƮR.?c.dYe%!3sBHtWFryVXA$28T*Ž#*J<; P(8s ߏlBs0 ۷IJJhGbZ)++6c4F[n˗LzRRRسgGtRRR$Ǐ!-Zh$+#tS[[磸X\Fzw#)).TWWsqBY;vЀ` %%~C111Ayy9*J7J|M.]$W^ɓyzzzx뭷8vOf;(JRSSٹs'OFՒ̛oѣGlQWWǻ͛7)--E׋V1BΕJ%333x<._V x7t>PST 9:xxשk\͛7g&&&Xx8w'&&x7())!''g޺Fѣˉ|oY掃>]7={]vqINNs ˹my\A#suzettݻwSSS#޻sw7699+B}}=pvͭ[^{/M$'999ܹS}*++x"۶mիayW8{,F$|M9j&m˗)((t[oqa)//ɓ\~RFFFxWihh 99^k&y~~>_$v-`0|/bh4*SsPTw4M&֭MUUGlj5uuu_%$''sUٰaYYYa4qlذR صk7n@߹s'III_{f͚vnk&$$~zΝ;JbѢET*nܸ PՔPVVƻիΦT z8pnjjjB\| `0bŊڵ2Iy7ZXRIMMիW7 P*r`$&&zj~ 6ͲeصkUUU$&&~+ ^z%hhh`ppG&w\x&RRRx#r1m6D"ݻ&z=_5еZ-˗/'p%8<8|0555]r._ƍٵk6m"99'N`0ػw/WT 0%IJuujfqHh8v$?ѣG)((^#//E7o?~'OdN8Khmmb҂CPp!JKKF<+܌$I\r:)((GrYJ%{SXX8 ϟg׮]GAA0"qqqٳSN!I߿Zv;.\tFFF466RUUE]]333tuu{q-222x!##FǏs!]FQQ埻),,$##k׮!Ik֬T… HFa׮]tww366`㔗saz{{q:pYyعs'=zÇq۷OW ppurss9pܸqj/_Ύ;9$''<͛7a۶ma-[Fyy9Ǐ'OsN*++9vuuu\.󩫫cbbK~z~?~B~ߒí[gTTT΍7~X,:tG(--ʕ+zΞ=ˉ'|2:@ Mww7466r(,,сb\r a*JZ-o.]bpp 6pyŁhwq݋hСC s).]`޽\|dسgW^%;;ݻwBzz:Nnܸ;wvcZEhiiFh^^O&-- N'ںfcҥ~Z-G!##pIa444p\⋴puڨ'??]vDkk+&1&0007HLLTTTp%zzzr[[===<=z :O~.^ɓ'yҥKLLLFٺu+{!..:z=Gf100@GGiii^{ZM{{;g&ٞ={xpMbb"ׯh4]Əc8@\\G?pE-ZDAAN"322 /;Xx1\|F#oQT^ZVC 1bffMMM /_vj* SSS$''Irr2333<h4q,o:Z-őLkk+/k EEE qセB ;;1(h4RRRĉd"55W`HNN&>>^ӤRVVF$!++UVqU^u YYYܼy,ِNnݺž}PդHNGJJ CCCINNFAz*7nDד)6FfÆ L&v;?8MMMtnJww761x JJJ$!!Cʕ+ٴi'Ğ={{{JJ *VXArr2>`0J, ܼyzzz&;`~P*I]z^x%L I999A~_P\\L^^v^zx"}}}h4jkkrʼ{TVVb jjjuVcǎ188f;/l2ڵktQYYɕ+W8vmmm|EP044$6ȕȑ#Ay9<>11J%@@Dl޼N>M(tQFt:jBZ=Kf67 >>D+N&EQ$$$˭|ȣRD"uVy^b[z" +d@TB>MKKOLLd||\H%$$aFJFȊLJŖ-[fQXXHnn.333v\.qqq222Xf W((J&''9r@ӉCTW*tuuYd ?0###Flx<rss BLNN266& Y @ՒIBB +FP`ZٷoN#VP@ ݻࡇrn6yᇅZ,TknGZ;_ZtR8 p.|Z-Jχn'jEшHb/_3>Z&;;Պnt c_&))DQTdggp8a zy\sS/C 1×/#6]=˗/GPPZZ< Ǐ'==7ra:D8f֭\~;wΆ Bt:%vbb"gϞ~X#~ȡ*_׌p8̶m"..@ Verr"Ο?O]]ccc#xb|>k׮% }v.]ʕ+7 HDx.]D$3gƍwޡ… q\"nk.-,,B***__$q󉋋VtwwSUUn'..tFGGD$VZٳg~:]ҥKZEjYz5׮]jl2FGGq\dee #GP[[+r,X[vlܸέ[زe >P(<ӔM}}=yyy"AqOHH`ttVYh݄B!B!.^(>+!7nMMM,Z>INNfӦMjjkkzlٲeavd…>}^ټy3999466288(Bͼ///'77#6˗/fq9n޼)IMM ]]]:u|RO.]Dww7>8C=Dee%Oh3V+233ٴin#G`0x'HHHȑ# Ο?OKK Wfƍb&dСC\.|I9uׯ_gӦMZ7npJJJxGPT:tO>)橭|իWBlB ȑ#D"z)2339v===<,Z+W@MM ˗/СC>}ZLMMb!>_|ATWWxh\\Ó^dFFz=`ǃZd2xh4Nd2SPۍ^!0LC;>>>Vjb~eLYIb幐~_h$vj$QA$7F"_RQ$t: qs\b-wtt099ɓ'7Aii)^ <Arj+`@׋jz+N^vV?RAףR!8h׾v:y?/֔1ZjyzJεTJKKECmm-|h4VEj5:Nn}!̽-$\CT /k0DVYFBA0,sV(B}x]Αf/=tq۲w&_P(£I-{s=@OA\\*}ѐ$ Ӊl ̱뿜zCorʽ%ybuWC 1dr;>@å%%U"/o%$$^z$Ac4h ?~aJOH!&$$|y1|[ 1C 1C _{5TR}1e7Yαrze6ϻr qp!1|?C 1C 1W2=]Q_B!A2wc El`0BߏR%ThPO$$Dr8lhmxIɘh,26I~y-B!1wk^GV>zB!H1D"be> Ayqn7%%%<ۗ$K$e0P(Bf *JȇNjZ|,#1pׯSUU%b  \k.L)|hZAr%:Y'dfsl6***>2y`  @zz:N&(qM)**H YzA^*Cw<Ʋ!b!b2k… 䐘4Rm۶q⥗^!JKK`޽w̙3 PYY)X~^~eΝ;Zr^FWѰg=ʥK(..fzz_ܼy+W2<<9}4S[[o~233!/~ ʰ?nbrq:;;o͘L&L&o&;wdʕt:vchnn&??a~_199IMM }}}?~'O`vɓ'줪 F3߲Yُ͓^TqP(*A0j>Gee8 BrH-̎;`0/LCC]]]paN8o-jپ455aXHLLdΝa)++F]x}!}uݘL&1r.|#I0b۷o| \|.&#|r~y8ç\fM6eYTr v+W(--eddW^ydW^ĉPZZٷo7nܠ7n_p8LEE˜={O~~>۷o12sd.LFtkk+.]bBeH$"eYLmm-۷oh4299)ʥ9rSNg-[hɺ( B[[:,@ dꫯR__)--ѣ[oaXP*K444jINNw(YQQ3c!b!GIIIlܸk׮xСCܺuJ%gΜ8q\~l֭[Gvv6t:ۙfӦM311ASS> :nsNxٽ{7k֬^APjaΟ?ZNǍ7ذaZJٵkWxSSS),,pYx1p+WZZ{R^^Nrr2/^VVFBB466z{瞣ZҥK|LMMj*Yvmܸ-[޽{&11Q[Poo466:uuuqqqkP__OZZhZΞ=Z@ ޽{tjxFUV hnn&''&R[[˒%KX~=ݻyIKKNǁXr%|]8y$W^e_n6x^__VK.qiB( ~߉… x^ 1 o~Å  ¥7xD\Bq_`o͵k?wΝ;Gii)7nd\z~:Xnf_Pb!b!OOcdLajj*###\.-[FSS>e˖F&11<#$%%}vZZZD]Ѥ$ ꋗ+g#''GN4HKKIX`* " шl… ,YBBB¼ǏAQQP\z!nݺ/,H+JAzzzj {nJ%IIIbZ-_!j$$$pO9ʕ+lܸVKJJ W\!??y}F#B ੧q&''9}4<쳌p8<3Q^^NBBG%++իW裏rA$I"11wD 7odڵX,<oX,^Jvv6̕+Wf``ݎJbLMM}8J?!d2µkF˗/gڵygg||<=n'#QH8'\.$%%144Y~}?$K]]$QQQARRG~WD"$%%pu)**bff222D" Fjj*& y$b!b#Gׯ_w'k׮9s * 46-ZOU皛ٷo=0de&9rsωPM iooʕ+׋͛7裏266СC\z^xшf# ŋYj###"TX~1˿Kikk>7D"TVVk׮|I0ͤHFFHD$aɘfΟ?OssJH$Idggoe||W^y n:0 PBMMM]B׿uAEE?0Ph!+VE׋`˅tvw5x> HD~~>}}}(J233pzRSSaJba˖-D$HKK#11L, H*lBcc#uuu}5 Iy:FFF&##C>99)~?cccnHIIaddIBBW̐Լ9vWi;j.dJx|h4O?MNNN[dihh`ɒ%<|>>L||<_׸u`ppT.]JKK .]bÆ lذI;FNN6mb׮]fI|$Ib֭Ajf=>Nss3fx7)))s {1VXAww7Okƪ'C 1C 7>Mf]狀Zx3$I̷Z2[Jt:4 p/JFIGy̽^+A29vI!qqq~Av$3v|> * FC DGFQ}C0*h4GP`0<&r޲읖*˹oIR_2)R$>NRRZVT*Q`'O&,C$@T /y.jgk.|%[fHHH 33S>( Aԥ~ǃ盧0zR)t,u<s=Ajɂ v8NZ-IIIh?@"qi1@c\x' rJ222w?1'B.]$YYY,_ ~ BLz!b!bAu:=wP2x׋绣z92..f#,`0`4`-ˉ `XK? '&&<_q( <~sb!b!m{|ۇJ (_HVhauo9Qp?CU*Z6f@C_1C 1C 1|`cqOKKp8 + P(@RRx<8AAZ d,0`z]I kZ|>(#oN F\.<F5y<j7n}a%d~rt:q\>S__ _:_&ZTp->r}%~+W|w.t:yB%dFAV+uuu OŬp\Bݎv.\Vٳ( ]0hӧOyA]u|CzP&{FVh4:Ċv]`$IwKf$I" r5]/WrPtvvY(ŋ! > HMNNGD~j:]FVV=<H8vxFQPHMYn?Le$r=~?N%k=zqbϕ*I.kb5s#俇#11uC 1gOC8v deej5>Ǐb :d" JDzz:*Oj$IBVsMm͛7IJJ"K/qy^/eee" @>D"n(CCCݻ'Npq֭[Ǯ]8qMMMdggsi 0v NdjjEc9B[[НSSSFz=~_9tidffFn#o&D"RRRpݢʄZCF}>v~+Wq}5~_1==MMM@>乐<0qQΞ=Kzz Vy Qx^1.rd9r_훜QϢEސDD롯_~˗/OYYuuuS]]ͅ xwx"YYYx<^z% BdeekqizzzX`ǎc߾}PTT*t:f3/S^^ݻ9rW^ׯm6.\@rr2/" 8N x뭷8~8,Xk׮orEنv;۷`ʕdzm6J%/ob1C  t6wt\睘 3 z@%e׎퍳gS:99IN&lq,ْmI%K(Rbo($: z fL`{w%KdsD̽ovIvv6gϞe||D_S^^Nhh(===DGGuV E*ގbrQTl۶ Xy@?q8p'ORZZЋ=>>;wR__\.ٹs'j<֯_Oii)ܹs(X\\ܹsblKkk+eee̤>lqAo~b!//,z=444uVd2gϞ Rزe .YnJxx8۶m5MvBc4pׯ388HEECVyhmmX~Q]ƍ7|pI"""X,|477HJJ܅(--eyyVinn_:}v233d}ZLyK?KKK(Jz-"##9w7n`yyĉ'fr w-^{5:::d޽L|BnիWiHII!..tdeeC]]v]<{<z-&''sj .˩SH$HLL( ɟ qqq9sqݜ;wn޼tuuŋ bJKKyQT \xZ[[z*n"..7|7a^Jpp0=ׯJIOO>9lBYYvL֭[xǘ@T233CKK^q #**3gv\.֭ JŅ  \b*++LZZZHIIΞ=ӧFp)\ﯾ* g\B||S0L˹sl077GEEtwws5ڈ .(nܸAvv6׮]cvvJ]T*Ν;\xVéHll,W\!66V,kTT;wL^^p2ҥKXVꈉ7ߤTb᷿-~;ZZZhii7o~z^z%:::hooGRr w7?.t:gΜ!//W299NS }6><v5Hxx8o`ӦMH$&* RIee%%%%z4͊.]">>DHNNѣLOO+x 4rAш DNrVo8HR4 ĥ%ZZZعs'p֯_Ϣz͙{91 qu׿dbrxgYn,!![rΝ;@XXM~t:, ޽NjWhjj"))d֭[GMM LNN2>>f#44~AAA 344}?_^dBBBoQTTDll,sss꫄x"::ZW<#''[efggٷo%%%c0DM̊z1LX,֯_/^Kdd+=55RPPѣG)))СC߿9BQQv***S?$99@ee%1>>ΩSXXX >>(1}jj* \v.:::OROٌjl6n>mE"##Y\\H~OOOgӦM>,^*T*.+Ll}>ZV+ST??B@.3??ϭ[x'xghkk#&&tl2CCCnEbI9UբΊ###,--阛#::Zͱ" سg۷oEzz:ImvIii)IIIlذ 60;;KDD #ɘC]*\.H$:;;d2144Ŀ 6.ʐ"((tbt:/V#\(+JLS驩)N>Rk3ͼi&d22$;BF!èK׋D"jǎbZJ$((H6 x<J5BP J),,dǎ<䓤o233Z^Q|M{1RSSCCCX,n˅A*kQPPr\\"## cfvBaa!:J41333(C, ̐Jbpp+MR)F###8$&&x9LLL ARRxYxHIIa~~ fffHMMEш _ۍN @X=**wLLL`0 l߾FCNNeeef._Lff&۷o… \xZѣGɓ qvͮ]%>>RQ @WWG%99+$zKR^uL&vo311Bpi5/333sJJJ bΝ,--;ξ}ⷿ-n[u000#Gwޡ*VWWz9t3g099Ipp0鴶'ORYYItt4CRdLNN~zv;Zhfm6}6sssܹI^^Nqd2zbqQM˩cii JQQcccܼyvڅlfff}!ɸs7n@V3ϰn:&&&$77m۶<---X,s+\b &===X,oJAA477޽{h4\t GAeggS]](FQ[7odrrP E  $''vjdnn(**BTeegge )) MssbPPPdppq\. ~&&&رc+66͛7*ey&j o.v9B&qqqX,%++}1==MGG"wcΝzGWW111vYXX 22V ;;I222lTTTvygٸq#SSSáC Ɔ XnIشirA/8ڵkL&222$33tJ%.jn7n388H__;wܹHRRRػw/\x(>,ZXLNN&%%\B ++kv8RRRĀB=¶mcjjinnfttTJAA$''VQݜ;wIBBBX,(Jz)HNNfQTTDhhB`,RSS$22ZMKK VR)IIIvyrrrqT*|>.ØL&JV9IDATѣGimmeǎ Q]]B`ӦM)ȍF!66Y0 $&&&tii.P:th8x ))):+\t:ioogƍ۷ŋIJJȑ#sEv;Ǐgݺu455Çٲe 333\v7F.\/-SRR~:w' //O\mΝ;x< O!r&4]!Kiоf{|> P/;55^ygIKK+ 8IzRSSE|-XnX1F#Zu։m$qƍ0,wG.q'|Qcp8DFF}(HD-J%DEE,˗/3==K9 ˍA+jV?W"^ oAso07XQ.,BW["9 "_dTC~/q_?ljTQc w}uƿuӿk`- uWB{ !|oo׿NZZKKK2HLLXan[~ɇ0?IX]k.ʱz?sz1&ȆY<@|T" {_hWL_5W(|i*견8߅ }_8ԯy Z~PWu?!**#GF_ģ`Zol-yok? ޳V=2.//377'nC '|[HC(I X" ܅e_$=}>\~Qdt-??m]XX wsVn5ݰ<ݫAjX=|ue9x9suZc~%A2QsZ߿-.օʺzYFa>~8577'f"XkA$r>k=cu|#@=9s+$hyyFrRQeA?+, Jsjڏ_|X5k(4C >s|4 @_J4肙yaq8bߧ!T*!!!k5Z=8l6 GXX#8/v!; @r HT5@W}h{g|M\? *L>z cQSW6Ok~  @A6X_hl6FQT+3"W ngggdr1nGVĜN'j,f+F⾴$[+̃+ , sss|>1mT*xۍhp80MMM144$rQ__OXXؚd2!H8s{gd@@&)uY\\aZGf.A1;;KGGKlgaa1tbb^%B`inngb0Dvl6CEX6 tvv~2rĔ}K?]]AttCIww7&Ykqhnn!P`Z9w6 7PT\v K[[###XVnܸAHHXVu>WN-F[,T*Fbbb{90Ll6q~Z͉2|>v%z^1MZkܹsL&hjjB"pBBBhnnf``x1vRG}}=z.v3==<R)[XXc2]lFqpb~!Z[t~. ш<77/CBtvvp߱xp85(8NW@}X|>^ +ET*RPH7߇ٳH$ZL&Ο?8&IRi kq\bvc`0`E^‚b0b`Xĸ0A܇ {%A X&d2q/x0,..ޓ0@OSYYɍ7%**)~򓟠P(HMMWtvv/Lccgll˗/s qq*F荍;w7n H2>jIMMeaa^z1eɓ'cpp\***~F||<|?Oظq#ftFO}}= B__oh44 ؾ}; _HHH`ffdjj-[066ƙ3gݻ ~_qyvرbRd͡żB_* ~!2g ߧHRR*ܺul~%4(fqIh4x^Nn#Hfjj>ҵb}tt=QQQDDDpikk#??\{ǯkvڟ/]244DEEb ӂlzr>B{T*.' ]Ht:E_007غuXO\N}}=333lذAyy9 ƮiIxgyy1g.,,m66M̍;۷QT[oEEE---dee~.K__eñX,L&}]mƕ+Wh4+5yd2UUUL&qBx_Hz=.Z+Q__Oaa!Gl6iJJJ8}4 Z[[?k׮Lnn.v]r 뙘 ..ӧOL&CP}zQ*466r ZZZpݨT*~_ ֭ߦ&qNX,+dIx.ᥗ^"44Pb~Y8***8y$&/--Buu5R__D"ArJJJ|Xތ x7y&Rv; ( /~Agg'qvn2*ZČv3gpMx aǎ;111+444CNNgϞŋ455Jhh(7W0JjsD"eW!B`qq)Feikk>Ell,.]֭[˗tb(a2JHR୷";;Rb>,}uע[n@OO6_!l]]^pHJJ n^{[nvIKK[}b~~^ .066Fii)>O/~ %22[neVp(f+q\L&qEGG:hkk_}Vkkkyebbb//p:dddpN<)h4:u&1bߗ^zSN͛oɆ 8u 0??OFFF/@O'9?Jl<K~z***j,//,۷orgÆ by}󑜜LFFƚ76mK.޽{?vccVۿ[9pO=.\w]F#wfc߾}twwyjkkb~[DBjj*hZ?c0XV233D200 4'''9v׮]ctt={pHOO9}4jTXM&<7oD"[o~z_'?V˦M8tNRRRHLLD&1==;#!..{wwlذ7Me$33ٳg9x rmܼy͆Nctt#,, ͝;w8q Ij5)))ܺu\fffxH$lٲVKMM <3+ҁ.]Dtt4/D[[[jx^q\t:~iЦMhoogll>ȠVL&cll^:;;IIIazzq:;;dddv Ν;)**_oرc{x<1??OCCV{ZmFtt4xhwuO~^unܸA||<555l)fffRPP`T*19s[RXX۷( ۷SUU? fh4x< tvvCvv6׮]cjjj9}49sF\lقngw qixQ*TVV2??O֯_Odd$W\!**|Ej.^Ȏ; ﲲ2J%ϟ'((__R__/^d2nƍˣ:9Bii).\ѣGQ( w7n022Brr2l68kVéyfR)$%%qpTUU177WrH$pevARR'ODTchhh/z=;w_:7l]]]޽)N8hdzz۷ގ餵+Wk҂ ##CT\t6ny7N]].7R\\Luu5v{]TTĻ޽{)++cnn6!!!m69}4O?XC---( x'ַEdd$?ٳ,,,ydeeLww7}}} P(p\,,,Fgg';Zxq @Ϗ8VKgg'VRpݬ_%jZ?~\CPƍ%::Z<оBOHHtvvrO\9NGSSAAAn5/_LYYaaaj$$$n'99{+BVsU233INNԎw>FVs &''_\8ZZZعs'Fׯm6 |>s1==MBB3qpp 6AT*N'UUUٳj5'Od``+WTVVbDGGz_<,Lؼy3{!**J4|XQ**aaa~zt[lA./AAATWWS[[˱cw8p)))ܼySN7n`~~b>/fY4]tw{)))DEED[[\~o}[hַEbb"MMM|jd2+-ˉ#&&J,T*xſtvvreݻh4nV+ᢆwn`[n^]4Ouuu|G Hhhh ,,2::L&sן>}pW_}:N8ٳgAV鈊jk.^}U"ܹs%6mZs|]]ZGjIIIaqqf񐐐@pp0FC^^< tvvLSSӄ?Z|vرcl۶}{nx)((СCsN{1 8z(O=aaahZ~ibbb #<<\Ԕ yzxH۲e \pǶm8~8p]ve:DLL̊l6vsUHLLł {;vPUUEHH,--Q]]&// 155=!J9s yyyt:ٰa\t ,aaahA*crqqQl[GNNF.3<<,Z uV{1._<ܸqz>HKK\pRBʕ+TVVg;jE">rj5&&<ZL&CP__Opp0+PTT~jtuulٲp%n7\vMTS/FCRRUUU+>|\vSOQUUŅ HIIE.ut:ٶm՜?)r9[b |'==ŦMؿ?o} JwwXVLFAALtTVV܌OOjv, :NLk?z=X,W^>+WSO==;vLt[ III(J"""h4ϋkoAffX bzzz=2?u8@/:<{OCCCSSSZl6322h$""8 d2a2tىeÆ lڴ &_O\k׮qE?NXXp~ii ӉbW^A"p!$X*o0uuuu444x!//l6o6>Rz=_׉ 22,EcGVVuuudeea2XXX ::-N}}}lݺWf>oEz~2==M?UUU4662==LNNr~:lzt:p0==-Z0LX>G\\AAA IhZx333ʼnVvX,|,..jzŹ9Bss3UUUb9=CPc#22>ڸummmFq \0l6y饗tڵ {*7:u Ipp0;vJyyydggOVIOO'%%{N<lܸZt H$X,ч_V^p紣6j`pphf3AAAh4j'aqh4l޼hjhy$yN >ΝcnnNt`0044DII VHmm-7o͛{nd26l ++'33DBOO+d}Jrr2oؼy3ZV\ۃQTrqlٲBv "44T>/~ Ľn'??it<+&.HœNXX:Ũj^)..f޽TTTԴ^.\`bbVb'RS.jc%}]yꩧdzĸ$%%$a%L4pU$]{7oޤY„CJ~Z$kxH$$$$p5Z-7n޽{я~ĺu8r?)++[Q;wIGGsss߳deeof㡠@Rn233Y|YzTTN`0055EHH ^O^^XV]FNN[nʕ+\|^?NOOOfrrG"Jywuw&//ׯގjpv .( |>/_299ɺu먫Y8r۶mCTk.\.@>|p}<cccpm$ 7o!=Jdd$.CCC\.LÇŋ qvm6nHRR޽lBCCٻw/r|/`%N⡡T*FѯR4gLKK^(--%66HN'pw<==͞={ "99|ذaAAA}v9|0FV%,,P|>G '|j8y$MMMl޼FVU&''X,+?Mt|Ϟ=477ZsYYYv(**Hzz:X4 .KMbccihh2IVe222`xx$toqq(lB__{MNNFx<Ұ޽~ZZZرc;wdnn*<ˌzHH---$$$PSSdrssIIIH溺leOS01<<͛7)))aƍ,,,l&%%\#==HR)sssdddVQRK.;y󦨉x<<3lٲJ޽{CBBɡݻw111PSS#jtfggQ*dddNCblݹs7nV)--\.B }}}HR6l@NNSRRB||??ϱcP*̈oM6QPP0jbJ%eee!9x VUygžݻwh|2Z\tZC~~>[lׇ^xg߾}022Bdd$GTjl߾pQ &55xDg~~>p8x[o111؈SN@^^|X,&&& w訸oܸe?4 CCC{n&'''&&Bcc#aaa8\.Q($&&QQQrnJMM ccc<MCC: ź剱mn7###$&&3g|;v,FFFhhh`SXkkkdDGGsScc#SSScǎ󄆆.^NNNDDDh4[n rrrزe b] ##N1vP(h4p>77GLL̚FYYddd\.gݺut:vCCC;v3==MYY#$$Bff&v]t1(//x|tlՖDBy(wA dzHudd}@]FZMHHȊA?<8Q/[a:U_Su]xFKP KF#̓.hQ~SXXȆ HJJZ>v(/ZI&<<\E?Ţ"66vŸAn…1PAj[ANN']]]KAZZqqq!Aך7Bx^&&&BP/r#ZlDDD-ʢn˵x'j_ws}(nwc6?6k}\0]]roVZƃʸV[>I9|G, {97LL&#;;[<$v>q_՚!J!-q_/ʛo)Zܯ^{T*fu{d~_9ZZZxKFZZZL&cdd1஦?//rhnnfrrn~uLޏ%:;;q8|>HOO_\?,NJW/ 'L=ZozL 潫Ym9ezZ_k3,?H՛ G[뻂o>KbbhaouãbGͧϢ]kAz\._qat///rVlLWʽrjϓcG"tqo-Ɯ\/ ԖyZyF(Ru^KM@ֳ?oìz.RE}k_>}P}>aʻV?7kcTג3 T!rBJֺ)_B~A$77WS8r\+QZ{kק!׾"233W9kKTJHH5݃x $~g^|u"@瓞Ѡa6D"rrh4BL&* U(~[KKeӒy`v gy2E)lQJH$DO4QcW0 Z/8~Xkr0r湏;w{F?ϵӪק|ZO_3|YwV|H$L&5q5A4yk?>tшJLp_4Iߴ!F`YSrp ?2 @_%ǽLapcF[ܯڡRoAF>z B~ @_>eA.,,`2h4DFFsssfa0Db41rX^^`0 ɈE&t:FRo`r'U}\f3fP"""ĠE!!!b4N=T*f3h1(avvV P455sFl60LbTU!w%&&Tnh4 f155#88XL%h"""zddy6mm(DEAH'ȖT*\h響)=VV3==-F7w:bqZ-,Bll,:NtbXp\DDD`ES˙1g?,..277GHHQQQ+jG ::.fjj BAttt P #i֢tTVVILL ccc_5*~_Fkk+999+cIOOgbb*jjj'55_[naYnRtEx ۱X,_+n̙3455QYYIrr26W^y6v8gϞ.~:?ω')) 6~򓟐dp8(JBBBimmnEҮ.|M1hHH'O7ߤ \ίk:;;%..s&'')..frrWR[[˥Kؿ?/9U\.b FRi"""bQFL&1Xww7o٨T*AV?m '!!!477mDhh(/###ד͛7iii7 !!>.^H[[DLqT[[˅ طo ՊZ~u*BbCѱ nÁffff yge2tRx7X^^/|Y{wGK}}=]]]sybӦMOdEE555TUUW^Ibcc9͛l޼/ZΟ?ŋillDߓ/@ '瓤Y{N(J^|Eܹƍ"&&COOo-|J"==۷:vڵ"j?ׯ_^?g޽+4CPPǎCPӟa3<ٳgz''LOOv8@OO"jnnFq\r1e\\:o~,//fnn^>fAXX~n7ġCbzzݻwsaHMM?'OƵ\.1-??%$$Edee8>'Oկ~Eqq17n unBT܌D"aÆ :t ͛)..twweϞ=x<?4Ӭ[_}}< w}6mDMM >, bpdeeq>X^^ȑ#tvv"ɘtNrr4B+WRp88NJJJŋbmDž={8|0կogﰰ" b$娨(݋RfQ]]Cz{{b͏y @,\vjr9))) Ξ==u8zBCCzaVAPPTTB0r%Ο?޽{Š`BgGXXo#xWp:HRΟ?ONN)))݃ ( ~m1Y.sYfffPnkkcǎpu Y^^m|>n~,z=7l6c٨o~x^<쳤BƍQ\\̮]|2`yPJnr9ur\%5586oիW)//gnnNKK eee>C0h4Emm-deezQ(bjY.^Hhh(6;#ly =z4p8H$߿4>deeBzĶ6L&vjjd21݅ (..&**J|WHHHq.Z @xt<^QQӧ9r:&&&~: h4L&}}}N#--V+A8wwwGRR+s'>>n::: ϟʕ+<㄄zYXXfaZ_D.c^/v]4"wwwsMq:$&&fctt#G JfETT8N<v1LoT5Wլ[N,WEE---KhPՄvFanniN'pw#T*q`zzBBB駟~/~-[Xn###~=;wRZZZLƭ[P(dff v!l6L&1 i}> ?~Q.\@ii)͑ǡCHKKwd2U(zt:{a2sss+G~U)++,//?;_SS;Ç >>:::H$_߿ronn6`jtqm> @GEEq%f3SSShZ8@YYѢy2UUUe*** 66#G000s0<t:qlݺ'X~/T*ܹsl6ƈ(z&##7oсl&55Cm6Z-;wrp{1z=.]266FJJ QPP@kk+<sill޼jjjP9r)***GRF?ݻٸq#ڵ \}aau։(D[E__fݻwJLOO#JILL)ؽ{7SSSCbb.>荍bZlݺUtIX~=eeep8(--E&1::Juu5zgy`ٸqs}н^/DGGAxx8H$ v3۵ZhZ~:R2ӹqPYY6m"77WtQDEEcccddd#lٲnJnn.JY>667nēO>s @2I|%fYi;NrrrDEDr_.<~߱v"##h4* l ]U+:!o4 'HZ,..RSS>??Y P=]> Z-%7#Wӄ? 9y, ,͚bjlJR|>=rGD"aii\n @|1H$L&T*Apg>\Dfn{ЍFUH$LHHl gYOD"Fuy~hN? @H$\.1@">CAPP}|!_%O)ѣ: 鏲 >=  @O|}Aa0t#HzLMMh eaaIbccLMM1;;B ==%&&&$''rVINNGKz`ii2^ h$<<.^}UfffӬR]]M}}=VN/~ F#ׯ_'++NoKrr2TVVсFRSS͛7p@.iajBuLnGTbayy17KKKjf32 ÁvRxWq:NjFoT*eb1~_NcvvV$p8p8d2~O;Cww7fl6c0կ~ŝ;weӦM_K @?>Ij>\.8ܸqT|>===,--ooF&Ȱ0r9Ԅ^'&&??ŋhgJKK8|0:c5W*ӟI3<Ç~%!!~LLL ayyjmm%==ۍB ((BAXX|t_a~~|>gΜS!!!hZۋ`ٵk555fv#G 99^x'NJsboߢ1LDFFvIII!11q1NΝ;|;_fǎlذNfffBR100@?#JIKK'x_PP@II .\M6!H(**, \.'++K򀻖'O-|ZnܸL&#++}|\.ؾ}u:hZQ{r>Qr9ed2xdXVΜ9 C*|Ѣ155DDD_ݎ>`ͤwssso-ޞc\YYܜh*\rXV)++crrׯqF1w?> y6nHll,7eqq͛7)**&2%xIHH@ H#&&"oεkX^^FT#+ iooѣW^E&7U555ddd֭[r W\aaaχfdd2 11Z[[WXlիjof߾}>}Naa!RIVV^q !''={jq8|>v;l޼#Gp L&ܺux o& hWt:th4LCN#88Bң.r @ω/]ć~Ⱦ}PT⡳0Lc4&((0 .I|s``۷oذaÚMJJ&t:rNP(x<Fgnn@VSXXeqqٌhjĝ;whmmC4; vcy嗙d׮] ƍE^Acn4X,b:;3V+CCCFǙLѣp%mFUUf7sN2339usssoU*111zGii)t:R Zh.q: cQQQܸq4:={PVVF||<D}}=P[[Kmm-:t!]j'$221֭['j>艉 211SO=ETTCWHŖJTVV,xx<\|%1gx{{;^@FF--- `ZIIIalݺHv؁ŋLLLO騭`rrd O>$?6mBЀNСCLOOSWW@R0Ύ;%>>2/YAw:wͣz$%%())appAٳg* j5TJzz:6md2133޽{1 K||.>팎)mۆb\^W8"ÄDbb"Gehh{Bj q<,,,۷9r8 @|$>, yĝN i kGFF^1\c!@P/,,PUU$*^xK?g44X*444p~-͛͛?p)..~dmfp[ @/z5( W|xϵ^׋'"HIJ>!|JTYnݗ, G8X]|DEEo{^zx  cYHA\ P! @{t7:..s-D>tՊ\.GT~e6B  #-HDpp{ @|T|>V{u߭F*$ AAA%?s  @@")/ d>l6v;QQQ}vvZ ^3{ttgZODHM܅Z&\h @|yncNv}>}i=ƗaySxϣjK!ߣ,CO/BJȵ-@ |}GGG3==M__NPю~xxχZfnn^R)!!!ۋhDcannNL&cllAd2}~~^fa+ &&&`yyPl6\.BCCYZZb``qj5*IܹCHHJR, j۷hfhhhE}WB@T288`@<8NX\\ǃVl6 ravvV9 CRݷn7,//ׇCbeffFBh4KPPF|(===+rg ,--qy"##4z`6|?Qᮦy``LT*e``Q ^(aaa?BJ/!… ( €ih_8ș3gD*299IUU)oߦTz*5_C[L&z{{illDPP[[833ChhGXWn*3gunbppdnya6>8n޼I__!Jyo˾}v@chhH/ P*LLLC|L&$ 333LLL󄆆̝;wX\\Dӭ8y<FGG 88+WRdii n7AAA|S@l bX|\xQׯCBB0 zh4vFFFuM6122;whlldӦMΊ>k-|555Dhh8M&e~mvAKK V^Ν;9s SSSOww7gϞ̆ attZbg?rҸz*+^ immGoR\\Lxx8~!o:͛7|2K/ uuup hhh **3K @ٲe oFP̅ ű?illDV3==2qqqdҸ}6uVW(..f~~qnЍ TJ%YYYLDD6m"<<^vIhh(7o&66Jظq#Đ$d26n܈\.HRSSILL$77lGzyWz҈gݺu477m6T*233CBB⁺NGnn.cccɯ~+ %33B!ĉhZ\bٳ[oQVVƭ[jرThd֭zlقJ8?s*++dffMss38^{5ra0P(a4rWTT`ͳBRr \rRIbb? t:^}Un7aaazJ[(J~c9u6*]mmmwE__KKK۷gjjQY}?ܾ}Gxx8,--Ndd$/^$((7noߦdΞ=Koo/DDD`ٸx"Β_HT*ϟfn߾Mdd$gΜIHH`Ο?Oww7fY,XZZB&MJJ ?dpp!ܹÁ(**ҥKDGG{177G[[ܹC^^UUUX,jmmF WUU"H$X,;Foo/mmmH$oNee%999{V1_%8N:::я~`pp# @'9?І2((rvͅ p\t:Z(JR) 3FUUR|;Rp͛7kd2:::رcA$ /^$,,b`e렠 f3|Gti""" 7?яHOO^jɓ')))4E6l@jj*'N8nn7---b?\,..Aii)vɁz;N< 6l7MqC?22 uJq5;Fff&k ȉ'xX,x<$$$QܹCRR^D"**JfyÆ X{9d2jHHH'$##Q.^Hzz:VO,KvwCqq17oȑ#|k_7nh4.KKKx|,--vBСCFyy9AAAx<WCoAqq1YYYd28ىj}M$<<ǃF*IEEO?4:d^x@&!ao{n<---:;;jb #''[RUU֭#-- N'bLƅ 3Sq/DkAR:ꢫ^|>oll$--!rx)zKcv>**m۶Lss3ƒJxx8iii<ѣG0 M?\rCLLxb1)**r裏222ػw/ZB0 466277GAA HOOԢ @<=**Jr BCCٱc۶m#%%EjZ[[)--%??fZZZXng||j<ǎ#;;Agg'%%%I{OOfՊ%--+$zKRAbbb|\~ 1hph3LKKK$''k.nJ\\eeex^رchZ:;;J̐r\4㜟'DP^^.'::"##9tܺuK)))h4Ѵ^0Y]\\DVAnn.###"HD1n7T:::剚TUD&}vz=ddd 44D """$** ^F!))+ȉF!;;[DII Z7n0<<̞={غu+[neӦM$''SVVyZ&>n&<<\_{} Tv޻$QT/VeNqlM&77w&d{{kgNb[f{`;@ AtXnc|f4})++b||okk#44[ cǎRP"B\\۷bz=nlrrr$%%Off&2$*++Fh4<WHGtt4;w$""BL&=' |}pp>JJJ(++#**G}4 QQQ¥e޽( f3:2#,,*++cmm| '==6mDee%IZZ}}}pQټy3[ne~~T*|>H$B --!ٺu+۶m#==]k_"p\XXr:::B&c=F||x<ضmL&)(( $$ ***tݻ5_:( :::ؽ{7t:HIIGkC A $G㘸KfH+H08?¯Oh$,,l]4F `y稪"//K)@VBq3;;Pfp:H$JKKHYaٰ_9$H A 199).OY+C<s׻΄HxWD"a|%&&BlǑ[gf0P(deexH$DEE})$[ A $H/AANϵ. *q7} p8d`.D"I|ZO}h~?= 6qyp\.n;$H A a }#}~BBBDϳkkktj⾸(29yK$jP@r92^FGGQ*DFF;E|@ެ$n"77 qnX8}}|>-e 8V?вdjjE4 AD>;WVVxw ի|H>4Xy&ׯ_G&q)d2 tww¹s;wFGGmmmd2~m_Ժ9jz?FFF'11fffFT2==MwwzXcbbp\tvvw|A`rr#kn^]cjii_~Uǹy&~SN!Jy&jzzzp\j<xw==={By"""PT-kss3cccavvJEHH磯 ,.. Jnىl&66  $H/' wazzZr#U\۷$&&"J9uٳ9Qj***: jjj'JKK1ͼhZbbbP*2??ϥK())a}}=2ù}6:vB.rARzyטf֭X,FGGƍݻ^{ ^T*%--uil6jYfggJ,,,099QQQLNNrEyטa֭&-, ˗/Kmm-^Ctt4.>F#N EP Hfzz7x۷Vy뭷xg8r5552;;8YYY7jR]]M^^.\NR8 $H #5ˑ#GxgZl6(++C&188B?)/ "rOLL011Vebbz)16lذTUUqifgg?VcHRzƍy'8u~T366o[^/<===25507nL&cqqj5O?4_v[Ë/t:X,x^"##׿NWW>DL&#..!//C100N'W_%##ĭ[ؼy7Wg^x[NGuu5,9r~rrrˣ+W0??੧$''0>>NWWYYY;wR^/( F.t:v~?###  >r |DDDOss3V\NssPd|Y$R)kkkO(9}ʓO>ɉ'ֵ`%ǎctt]vgk_~ӧOaaa=z6}QxիmcZfJ%fݎdbqq'+ܸqc=FDD)--&997ocJllwBWWäSYYz~?===DFFrU~ӟraX\\$##., yyy|>)++#99_פvOP__O__ٳa/A +k~._RdϞ=8r9sssl6aVP(x<_%0oF*RYYɷm|>%%%x^?`6+4IRaFO|y^Ν;GBBz_mDTnyyy?1l6:'Nxܺu Z``bbt|>))),.. ի"HP*RVVF||<.ܹssss|>RSS 233ŋ$%%dca"HEs1 |;!66CQTTD__oz}q!"##wT*]~:ēO>IJJ АpIַc=Z&>>~^-n|&99|6mDdd$>(JvRp= en ۍ\.ٸq#bMXXXVv׿u<444 HX]]bݻ (Jٿ?FsAloFEww7CCCLLLގjP(dbqq<]]]1??=J|?$,, ݎ墣 IOOb`لsJJ [l!==7occcDDDPXX(eeejeΝlذ2***c޽QYYIyy97ndQUUEQQTTTPXXH~~ cjj D…  cǎ444go ַ8t2 L0wᩧ^>O?4?񏙜ۼ^/:}k133C^^{!&&48@ZZ999]rss T*x^\rG}QT\~MHHRP.P(APUU޽{J(Jd2Z"$DGGGy&鄇#Jal68K$ޘ6oו?8 @&T*%55VˡC$338vMUUgޮtvʕ+DEE!99^^Ǯ]r劰T!J<d2r\A777344Dbb"!!!TUU7 {1v__DNNmmmbA׳{nJ$&&f$\1Ě#FP#8}"QZZJnn./_^w;33j%77W̅c&''t@p|x 󱸸ȭ["44ɛoիW)//knww7,//a<}}}˿ YYYDEEcΝHRpkx=>>!r9KKKPUU͛aVgΝK?޽yP(<ގ'$11X$nbbӉnG"[>胃d611Okk+ᄄhD&aZ```@JJ ۷ogͤ}v~?MMMl6x "## $$D93LPZZ*cǎN]] BXӃN7PTf36mBFRR===sNr:tBAzz:111fczzJHH a0r9~v;|*DZMVV8hZ{@̤8*++Q($$$@bb"Z'HIdd$l޼LlBTTqA)//gӦMdggSUUu_A3;;Kll߀g:+.HjٳZ-ZNRqdrrLzz:t:j5QQQ$''P(HKK[,++Y YYYűBvv66l`Æ a6DV\.'))͛7377h$99XlDBxx8(JRSSEߏz)**"//^f#++*e>5SCHHZҒG[lh42>>NRRZ}!H1YYY$%%1::JBB %~\.Xc۶mB {kbaeecǎt:t=ze6l)**0LH$%::Z4Boo/vbR)n< &-- JEZZ)z"={BRQ\\4r]v1JVVֻ\R$==PfJdPt:BCCIKKCTHllXJ%\XXX@&a6QlٲɄ^'%%FGG`ƍb{<\.6m"::JJJbhh^ٷoV"""D]R)KKKtwwAnn.۷oGR1::NCՒBTT7ni&IKKcvvD?l}a6X 0ZhdFGGcݔ G%33HƐl޼pDEDDp8z<裤Ldd$T*YXX`dee,=$$M6QVVFFF;vnNll,ǎ#..xz{{ٺu+ddd022B\\zhi7 $ȗ.1jB"`4q8_[[cmm ;_o%Hx< ?s$Q-wKtte'=w$ Ηy$H A֡N\+4qd|?>/w࡛=M܃ $H Arz0x R$H??~+R>~7r} |P~?Nsq;] A FqOHH@ qqqHR^/~0 477===033CBB Mkk0(NFFF}[@4sR0j񬭭DFF222BGG6p*200CRCOOh^~ #44Nz=d2fgginnjdǃFaaa;w0<<‚܌` >>((###Q A $'DqPe_NHHOOT*T*ƍkrHHH %%ENNN L͛7)--%44t^]]͵kװX,S^^Ӭ544`Z|2pZ[[ٻw/ټy3khZ֭[Wex C. ϟD;555\xhbbb Ǐh< !!!ܹsHR)o6m۶a٘ghhjv+HæT*{ll ^"n>JH$4 LNNJHH### ~?LMMh#==($&&#,4[@`rrn&''QT'66SXX 'NKmm-LNN277GFFsssp }ݻw*SSS{x x"aaabX}1:: (, fy뭷سg"FEJwHR"""W_`0F^CR=zFfn޼\.'!!6PEqEʸx^)++9rifllCaXX,TTTf+^p+PZZ*rbH$GRax爏'..Dfffthp\0==Ffa2hmmÇSSSCHH$H A|CUa0p8z˖-r ?!/0* 4nBoo/HRj?g?zd[[;wdƍWbyyopR)GCv$=ʩSٳN^8"L&cllrss7lC>z^._bff"##9v~! DT*%''mСCpL&555"M-=>,6NVGVVSSSfn߾N׿57 gvv)IKKvrx"ӄ200~:9rO>!!!":T*%44*hoo+W 'СCϳo߾{&F"3gؾ}P>< 0??4d2~Pf9?KKKB^WƜ>}łʛn>f"<<".]NEDDLٽ{7 c0-..FGGIKK!!!ܹn ٳDGGj`0o>16k͏cx 4 iiizE0AFFFlٲyFGGE&ߏJd2 ehEEsss8NN'Rq<#H$fggY[[j277'o}[~c41moocǎOO,..k;DBEE SUUŻヒD"ATk.:;;)..&;;AF#7n'`ff~dx<R).1xꩧ`0œO>Ixx8SSST*^/F_w]A*266SO=Ejj*رBARR"[C A y^Ο?/$;w͆`0L&C" zG?ooƍ={Dn~7T*++ヘ7 ={o}[nʓ'O SSSddd?`ΝX,q+#tel©SDʬ?*KKK§~L&r!JyꩧZ֮'&&cǎqFrss9vKKKGEEO>$111x<8x aaafVVV&&&JJJhlldeeCgH$466ַbf$"TWWSTTZܼy+W!l6֭[j}>VKBB~JJJu===lݺ"qywJ%DSSv,!!!ٳ-[0==NcӦMdddPWWښ~?[nXKضmvR)~iIJJHfɁ ͅ{srj5YYYlܸhF#CCCTUUt:Z0::JWW<ݻ rrr(**"**GraX]]eyyBww76 NǷ-C*o~IKK YYYi& ܹso>Jww=|>RLB}F& ˢgtt:)**BV+fYGȑ#lܸ JKKdΝ|fffvuu??SOq FGGYYYayy)z=555xd~~^(?h $H A|P^ʕ+屲BZZLLL`0HNNbp%L&)))zưlDFF\.`0033CFF333\t Azz=-((/PTr?< dgg```)&&&DFF 8,--QXXfffyq;499Idd$v_Wft:v穬d2111Z300 CCCt:),,$22шfcxxX!{DVV%11>NAAb9Mܹs=GNN. FHHŸ\.VWW1 m6(//GRw^R)%nN,-- u( 6oތ墾Jp8deeFAA555X,[JE~~>qqqرC( 2GXX aÆ ߿\?|>\. "HNNV+jZ QN'O7?΅ (((`mmN'x<8}PrŋaÆ "ڣ>._,2`:u ,p8hnnfΝm633`Í7Yz dqqQNuu5*JEyyy|>v;CCCzy&bٰalܸQ;w/Β{ A @xfffy)--%//JrrrHHH`||={/eeeر\JKKe47w[X=33#'Z-~DP8ӉRnRIJJ 7olH$8v,-- )))yӦM,//9z(aaaRJ<#FfffPDDDjBCCIOOgttbn݊L& !"""##jƢR 117<CjIJJ">>Axx8P(Zٳ":sIu~$nъ BCCl߾7t:Trr96un>H$l&66x)6m$LgӦMTTTEgbb"( f3G%44V˅bpAii)2 RIbbvJnn.RT"̤͛7cX'%%VKJJ *p8rBZZZJrr2,--q h4XVaPQQbaii$4 N "##RgϞ=<$H A|e8>,$ FqgM0'Af.\YYY<+Cσ>;;{<7oޤ'DGG{^nܸ 4v-|vynwKizz4<>CP~PQχ"44a7'&[S#H A199).ߏjET ut T>O\.קf_%mQ|WCCCٵkqqq_ D~e~~?EEElذue"`UP|e۟F?7O/qs@&%H A2"HQAn[}^w: Qcp\8Ώ/Zi@@Ϫ܁~\gmmMx^}L&9~: Ok} $H A A"p8=sLv_5wLMܿ|^&~|>1q2q$H A %pI O_!^ A4~?v}]Zŀ_a>57G%Pf ZM $H A>2=!!!1$$$ٍ|>j5ccc"HDt麺:j(J\.w!<<BACC###v$"W?HО@4sRIoo/2լX]]^ÉFE;֢Rp:\~]DrWմ'륣V !LNNrf3Zjjjp3;;evvFCMM KDDctt>Uz(299)?www @dd$uuu200@dd$2Z&&&jL&ѾӤ"D`muu ji0??Nex?v;7oDV1U(z_~px<曨{"nZZZE7(uuub ^ZZɄVk"{cc#T*権f ּqtvvFtt4ֆ%66qz5Eq5\BVVp0>>Ν;w?~FETp8ngxxnFFFjr|2oߦN5LܹsNLWWqqqF^|E$ nbddr$&&6 TWW}p8cttx ===!2t:IHHfqKRe<V里U@A +ljzGGn7o"̤_h4yP\z<|M iiiBMNNIIItttpIv%7npn7l޼# )wYkooq%bbb͛w^eeeK.QYY'N 11L_οۿQ^^bɓlܸDr9}}}x<Ξ=Kqq} _.R[oΝ;d<3S[[Khh(?mp:l6ǩGauu5N<ɶmh4=00\.:::¦F1, 311磧^Oll,$Xkkkq~V222!""A!z-v;( ihh`mmMb{QT\v|^yd2uuu0z9y$TWWSZZ*4:uJSfp:zE I^2/2dee&s=Gtt4׮]###YÙΝCVׇ^|>VVV8}4wfqqvnn^zRY\\sO"0* ~;N'jd}]:::'!!˗/311ARRW\^> ؈d"!!)=E}}}X^^ptt4Bt:yH$ףRlHRL&+++TWW2ccco͍7=ܾ}$_``||eVWW9w z222xPT\zLx>^ρ8x Bip8{* $H _H>T@wݜ>}xvٳgL׋H׀Nl6aii ^E"ݟ\=[oENN7o^z|GX>|HR#==?'ԩS,//9r>;w{ny<Ϻ \.geee oٲEΝ;lٲ9#Gظq#>|Պ@"088Hyy9G%..KFF{E*233lhrrrˣe\.V0==SO=dZ7&m6lذJ?.~0L QUUPAkkkruؾ};,..2>>.mmmXV=,,;wRQQ<BSS+++x<1nJQQѺqPna6$''vERRMQQ͘L&aUJRXXj%33cǎc=&,wƩ=.\`߾}넿w޿&vow]>$~ӟR\\}m6}#>Ctt4iiiSZZʁֵd޽/.tHKK#!!rsstR__c~~ccc<ٳ,RSS)**"""m۶O,,//ׇf#""XV!=z._Ljj*lذ rrr1aR)t6nHVVO>}om6ڐd3&7n7&R}D_.'NKEE&Y81H AK/ĵkHJJbiiBX\\dii aFh6IMMułFaӦMjL&Agg'tww&zΞ=Kjj=~Lbb"5:;;0>>sD`+^0L&*++ l6cZbbbp8l6fi0 [.&''fmmM+JVWWZ2<<,nINNz=KKKݷRLT*EPa@iEww77nd2T*|`6FCAA3==-jaa*ߡ?##1222D L&ٸq#qqq|!->O9322XXX李Yݒ9ZaaaJX(IJJ"44T :4{awb[VoH$LNNJdd$* BAxx8^fffP*DEE̦M())Jr9zRɱcDŽYd@XOIIrMp:裏 :P `0ˮ]0,//jBx(++#** xϲ!;;[]4 IIIjh4őARR8NX,>|ILLMEEDFFƮ]CRRҺxw6Q*dvERRHRV+w^TT*eyy8ֈ H{Rhoogǎ155*<JTdNrr2IIIT*BĮ]LJJ IIIvӦMaĸ !66BCClMcii{|ܹ;H\DDZY]]lv;jZy)))gѣBP."<999`4)((`֭ddd>(IIIȑ#-$x9pAa9z(111]nn.dggRvsA233feerrssILL$99YD|O 55CZZRÇP*KII RT݋tRXX(QRRBQQeeeX,v;iiiBAFqarssdRYYI^^RQQ!+8@tt4Zxj*ݥT*YXX %% HOOgݤJLt:qqqj&x 999,,,PVVFii)NS@EE.(:Drr2111XV}QRSSd~~[aY]]Eӱo>RSS vsQHIIaaa}.@"2 $HAfa?.H08?ZyЍFW2hyf3Νh4RXXȣ>=<賳"Zq===_պׁmZ:zn߾C.sZ`n?,Wۍ\.J) $H 099).ߏjEThֹt7p|w:,K$n0 HD&$$D{Ͻ? . G!: 8{tƍ!溺L(BBBp\X(h4A>:؟}<_dm$H A|Ȧ~x<|Y?z nxrmvA6'e!Op8XYYyhi~(Dwu? w#._Vg=n $H A|q;?H_ńϵ🖉T*J|0_e{'XEbn$H A ^ߢO4;`}?~\.\.~*l{2z7>Sˋ?g3?EZ&2Ȗ[Nsɻb\.ͧ1^/Ny0ݔϧ57}>ߟl_uw8/%XσO|σ@?8{t8"-➐@OOoh4n0J000͛7$$$PWWǭ[N'W^%22ϭ["<<\D;$7n`||JfT*iooΝ;X,t:KKK\reRRRZܾ}ˆ۷ohDpƵkh48Ο?Ogg'^ijjNvillp¨4r9ܼyEի8Nt:\p&&&477K||Hvmbccx7N~7nVdƍRjn7~ vINN^,@__FofϺ{k׮B6Rԏl0c'})Gww7555|1;;^/DDD|lHGG!!!}_`~~ǏSVVYIf?N^^=T\rLvߛ]lF}i-7:::lZaqq7n000@LL}/+W0??Ozz:H[>~7|R),"??Oott7nt:Eܹs(JN>!^/'N ::iE揙^Fuu5DEE3JB/ى` 33TJww7###b2v333$%%8ꢺBW_%!!Jj2<@ss8'P$h4oRTTւfΞ=KTTgϞd2kk`m0+>n޼ITT'' (Jn߾';;v_X~Gjj*/_&''SNE^^ꫫMnn.p8p;v@@t2880sNOhh(.]"::ZMcc#mmmݻ%fggxKff&(J~:l۶ ׋D"azz&/9s;v#P(0DEE(2azzzX\\$>>^OMM ܸqCo~~%f3w!99_~\"i{ J><L[[ B3ۋJbll Rܹs\.n*!}wh4bX8s}WrUZE@j06 !Hկ~"55uj46oLss3]]]DGG3??/uww)kKGG---d28ul6jkkYZZBӡatt_|5222DYn8؏r^墩pBCCq:477sI>* 1::ʮ]Y_.pXXH <`xx\NOOEqq1===T\bDMM DEE/EssHf)kj5}}}DFFb424>>!-,,ISSPziiia``YVVVāΝ; u1vFFF0 c effh4HR!rU&5pqq:o.bBhh(3==M?,--T*]WJ @LL Fj}Z7!99ׯjf@X7(**⭷b˖-"{ll,7o$==/+"?,,8ܹ(ܹsVz*iiixl$&&GCCD\baaaX ^Oww7d23088ݻy t: BAKK ꫤp%JJJpGll8uttPPP nr266Z^/X"##ettFCHHtuu>9 2L̗8~}}}ڵKXƝ\.… dH$fggYXX@0<< ###HOO($&&S~p~<88HGG*^~JQP(v16z-Zb-.."HappѦ)))⋤pe8<F#Vk׮R}6[lA&k!VWWill\ODD v0ٳg9{,Ʉp&&&eLbb⺾r( r 111ܺu\FGG /@rr2׮]#55st:277Gmm-444+"Be``qj5fvfgg466255%F}}=vjjjZ$&&nNsv8{ Lrn72q6z*yyyR;kSSSC\\W\`2ppUj5դ?d^.Mb!2210pn$<<ioo0hZFFFahhH(~?LNNR[[+[ӃL&cÆ 9p\H=<222lܸ~"##) 瞅y ,, .pa, x<4 tttEWWD UE`d2yw,Z 餤!rWWWh4\.+:;; t2==b!''E:::!99 6`ddDG[@#V\ghh]vRϮ]`ttVKFF I^^tuua6Q*Cdd$TUU^`mm ݎJٺulӉd|n7f-[FRR͔RRR"VÇJ:jlذyꈉᥗ^bϞ=BYYlBLL ,//377GFF|֭[磯fff0LX, cnnJEuu5FǏG[[kkkx?)t@SS$&&RPPH$8;w۶m ьRq(8q8@6l ++KË/T*ejj Dᠾjjj{||<:UUUb1';;8ٺu𩮮~6mdggH$n߾͕+W`Æ ( z{{&::zt:ׯ_'&&̎;PT6[oF>11/Hvv6 LOO344YYYBEmm-ꤽZ͉'HMM2Ν;Gtt4===122Bww7UUU 멖l6^!oxqFHII!<<BYY]]]ܹBCC gee#Gp Z-?{X,IMMߏB +++WPRR7HLLp`۹r z|tvvcgddd墰ׯPژgd2^G466VIIIv EVVV(,,.T%Sl8Nٸq cBCC11<ZLҥKAGG&rssyDŽ0}UjkkZۿ[Z 1w^_.p?я|@IF1L\r*.]ngvv)n7J\^u4 blW^!11jBBB0 +WhooT(j~k׮Ν;wfaa:;;O?1??⢰Աl\~D ?O;#L&ɓ 6lͩS%..˗/ܹsHRN8AFF/2444hx" X,^Jrr2n"55W_}xjkk ܹsjILL$22zVۅۿeuuq,B!]WWGZZ7nܠϋX$44ߏFѰD~~>aaan?T*G&QXXd)Ějۅ\.`5 ?~\*_|뉊BAkk'? |>rrrx0 Յ… s51LڵKX d2:::p\|$^FDZ[[rQTT$ <?oRRR.]{ՑH$H$|>o6n ̹_<䓜?ǏرcBcx޽{9t.\7_篬`2!<|X(vP~?---,--vōT>5++#Gajj vtb0N팎 ƎC*8K.^ōhXXEEEz{ʱIζmشii@0*,,diifpp,8@FFH$:DiiX^^*#<",9wDDDz\$ ϟ'::4~?^/js#!!xTXXȎ;x<,..YXXcǎa{bMOOOMM%$$~ ۷#J}.Jǻזa>F*r%YK7{8ضmZh4bn裏eEkoFF,W[f۶mw"HD XʨdzzMYYyyy,,,w^oߎ^'&&FYWgGtt46m… )P@=BJbiiI|~wn~(*++ټy3###SSS)((Iv Hظq# --;vpfqQlقD"!"" >uu.Tf\.벲2v N>22MQQ?hhh`zzF__cZ޳2‚PVŞ2==8BnR)㌎RduuToNRR 7`1R F#}}}bZ}ࡡ!, R=Fa||DvEbb"su6{1Dӑ#ֲm&쎎D+JEzz:999Tu ))IdwN<c?T@y&bCgmmMkl6x , 455[߶mvn7CCC?'44Tlb ..iii!,, *MMM (?τ&t} 7 Չg?cyy LMMcFGGinn&%%Oss3bۑJBIrXZZ~322wll '- <|2!HHJJd2&ڣ_Wİ(Xrssٺu+ @STT$6Odd$,,,PYYI oUUbl }]_<111LOOISSZF#6#\\.oYN'.]⩧brr^/ Rt)c_@OߏL&#//OĦZA||<۶mPRzehh֐`)H0 \xQ6/..Foo/B=77 Id$-[Ţ-Q%DI{ %2g)H[{}9QƌrhlldqqQUtvv// $uVL&ERbXr ~Ν;Grr2ofLv;---᥄qܧRA>GVV*cǎ ̷~|jgffb4ٵksq:;;a޽DGG+R}2>>N]]Њ@ 餩sΉV "11Cdeeq)Z[[N8AVV%=z(n{K^gmm-.]"$$DkkktuuITTHln&""Ngg'===|>q9wEI7tww騭h4 㷼_fbt*WVSQQASS'O@8KCBB(--رcTUUJbrrYBGJٌJ3glV),,SNIZZ6~t<Z-?or466RYYI[[_~%TVVt:9z(V*󩫫ŋTTT %C ر#G6QLMMqj8y6 FQ8oҨի<+' P/D666ϹxHϘNӧOseѯ8yx+)*NSD6]âYh !33/BAA&Av;:̈́8u;<%%%[yJq'$$o>222l6GOOl6t:eeeqiVVV+//g޽|[JFDDB]]qƒDww7$&&E4n(++֭[Fa/..bZU(yaaaBfqq|Z377Ǖ+W(..&))zY"_?DUUfy˷DJzz:dggZ!,.. 0,..Ajq2kE<\."\v G.CCCdfft:h4=֠{ $''p8XXX //OS300@HH,//?9RXYYahhVK\\YYY3;;Kff&boϞ=[tvvr(++#..0ܹs^OZZ>0}6CCCTWWkq:R\\z ӱBpttTIxx8寬hl-A__1-))attq{>P0INNˢ/Z,z=o9pIIIرih&..;wJWW񔗗[Y|**-vz=8h4TWW JEW"--^!//o.``ff$PT oOQQ@mm-qqqTWWNcmm$~?"mbb1)/N4 ٳG);vzCa~~Pp:ܹPzzzĎKaa!BBB(,,NaNGRRj LOO'v_GFF(**bffF)y6 Ѿd IeeMwwAYYFAHHHX*)fKKK,--z"**aL&q7%@hnDDD.l4ett-¢~Eۤ033zl_w#ԔK;Naa!t:"""ˣiZ[[裏X__gdd+Wg:::D%$$^\z㾦ffjsssߏ`0-P:;;ٳgYYY$''3>>NaaX#,--cL&țU,|>UUUjs\ ann~!&& )(( ''utTWWaiiIO6ř뷤a(bL277iBCCIHH%OVSVV"YYY]31)j999eggSXXᠽ@UU*l6UUUĈ-뿒@zz:\.n78jTUUy&DFF/uauuU-0>>NNN}9 2004t:ѥtwwFii)+++b=YUU%:d2155l&77wKT$7aǎSYY)* &zzzh4FD(,,,jq:ᳲBFFcccdee"W555dXHJJt:QRR"Ⳳ5撙~,HQNKKYRaZQ)"~jj 픔lfzz4 q}>--)}v;!!!b@ϛgU]1juau].ǎG~xQu};ΊEw122UACCZ)--eOt~ .055@FF?^i#ixuЗ8s ~Cazz/>ոx<={V:HU*|ٟHO?lE[Ϧ%4Vz*ݻwoIߌԩS͑B__:?P8G… Jxx8?ϷҶ ;!8؟5ǎ?V'))I4+)z"!yt-% 6G_FbM{X@___Q~(. |XVz;N"x<"DUlEiɣhܖ w V/W@n`xA!DwC+Ɖ! t:33_5v?“+i%iD0bx~xD}WY)9gccCj]ODDHr\ QeZ}i4G.5cmD(J?E]eJk>͚YRDSˬP"vEpO%OGP?~VQX]]%<<|^ފГ_HE}az{UQ^,ٓW>f?ޯg/3M^m{~XvKRHHHcX!>*I?c@ qޡŠv|>L&OkcEK$D"H\plllleH!Jgɏ 9!iO0նM6o&w ^KזD"jho)Qr%}> tuu(Cu:s |p%1N'gΜ!22FÅ y&jZz^@t:pP}j`nܸ˗"2gΜayy,l6.\^d03g_}bWzIJJnf^*v$;;N Β uuu8Nw)Q-11zZ[[$11(qdrrl6lw_OÙ ի477z… pMQaRRRXZZ{-Qcmm֙BQ^VLlnOO zx^|>ٌˣ۬XX__O?%??4t*T $''srǑ#Gσ9s- oum6#]$$$8<- 'äoQ||$%%=XV>LUUՖ4`0HCC/_frr8sP;RL|077GZZ7nܠ6Q* y֭[;wNjjH$ɏUQ]n4=낇蓓DGG܌'//6>c㉋O>zrrrd2Q^^NRR˗/'OFFkkkvطoz~^__QQQ\zݻw?K\1TZ-@xx(wšCX]]nj9}4vbuugϒHvv6@z9Bee%>(aohmm%33`0ȥK$))UVVVyu~ SSSʕ+LNNb0y&hlldppw3P^YY^Oqqhu\.ϟ4jeQY! r9>jjjDEy׷;??Dzz:㴴 IHH֭[\|uhjj ~?QQQ.]Dqq1466Lrr2v˗/3<LNNEEE$&&יb7ߐٳg)((?> GEECdd}Uٽ{7.ln Ź 440ػwPZMJJ7 99NcΝ[f555DEEa0hiiH:Dnn.aaa"g:읝b0ؿPrVvX__'66TqDzp PT޳9z(v7np9~?_5tvvGarrcǎᬬW_J||<)))9sQVWW9vضH%FCOOz^| '--Bl6)))phhݮ?~L&.]DOOgijjbppsˉ'Ǔ!`0( 4BCC9r*(BCC||gbLc4\Bdd$'NѣGsΖs^~f|>ot355E0$66gω'X]]%11 K&''4k[[IKK ϟgddǏ7oɑ#G팎rY}8nDDxX[[q)9u466ߏ>rɓ@tt4sss[ڢ{vv- mmmĐhȑ#XVqmj{n ᄅGll=NCVV:uXK:::8vќ?^uuulqjKXX455qqVWWIIIAVcZ9z(=VINNfxx&V+iiiԈO-㚟'55>q:^g޽fggv|wDFFri3==M0'??_v###vvW\d29L"H$,*j;N ؿ?_5sssX,p\~ ~F/K~_Rhjj믿f111lPTTįkXZZ'tpp-H\x_b|s  ''\p4_~%/HNNj曼466zQTjT*6rssfvvvTTWWwV{OdA  !!R\\Lqq1yj)JKK9p&`0HVV5558f3 a0HII!55Aq'Q}V( ??Ν;~Q+teeffׯc0h4On8t&9FFF`~~;w˞={HJJbvv^{-Ο?Ϯ]μ<1 jac6YYY半 22d1 ڵ}㡤FGGYZZt ,,,011(_9Q[oEAAf9~Odd$Wů~+ܹC?pNbb▶TڬJ~?NS[)zMJT(**"//7n011V"H$'F\j5Z)Ν;Dž HMMrXVV+v&''y1ʹ +WChhyqq60+B5p:ޕzjF) )..3gΰ$MR166"##Z`fͮ]0$''SSS71BBBh4BDIV;wصkzD *7oungϲHCC"ܼ~*N8۷U(V~g0z\z۽Ii),--F!55@ ɓ'ikk8YYY,,,pIqmW8NŎq0?~肂8p ݓRy݋` ;;;w288###Y]][ECn޽ĐȮ]X,bRTKX,[cbbnn޼%@3 ;<< v؁Vǘ|wI>s뿄Zb4z*XV 666طojǏ355Eaa!qqq)Νcttt3HHH)=޽<Μ9CCCTTTp!>3t:;f.9f˱X,>|(bbbhllo󑜜^{<7?lv6a49|0[a wa񓓓=l%D"y"n%RTZS}ii EII ]]],//PTT$©߄%''G*!qEDDhQPP 6YNEEcL[ZZ",,L"choo󑚚J||<"""عs'SSSLNNEbc``@t::;;q\zv܉j%""Hoo/rz=l6"##j222he|dffRXXb!22R좬`r0&''IIIfVڒGGGtuuGaf}}!4 dff222률[nay*'E񌍍166J"%%nݺ4沶999`W땝Irph4HMMevv$rhD~AfggIIIa``/z222s|>rܹsE*++J"yql.p8'!!ZMZZ@!Q沰EFFFHHH 11u'Rf3\p_WE4 ̐۷aeeBCCINNfmm$t:ETFEE'x"r:111HBBfMQQ`%`0(4`00;;hdmmt|>d2_eee155jEד#", ###AJJJfcmm8z{{1L$''(b<aaaMQ{=^ZZbxxNjKKKc~~I055Err2t:RRRX,q:f(,,vߏ磸#99(OɃcaaA|/##"FGGHp8䐑e||-iAFhh"55U|nii LJJ yyyn,tWF#t:~S%D3==h`0l=l6<=uhЋVu2W GnZ>}Jmm-d6@:芁>11͛7?mZ<ϫ륮BVV999 >xz]FooYE UDqjH$D"i諫B0NՒn 5rss_؅T*N'.K=q"f/ 1`0(B*bɣLTTC=O ¸ 8EQco=~P۫ӠTNz^D"H$?JbaaAD;v o;@]{)/ǃv?Pո\zۉJ|G'+GxM/ pY)W귊p}lv)H$D"<EG:!!!lll;JӆE>.Jf'!$C#lllj^m qWrRvT(!ϻJ$D"H^\.l/p:ۖ Y[[>(gL&9x| eH$D"Fl6n7:`0(~ndpXX=߹G$neePQ{\9p8D1ɫZh [D"H$D"y8WWW9v^|~߽4XV0ʥ.H$D"H$΁@Pkz sNv;⤛uɏl%D"H$ ~Z-o6oRj!['H$D"H$:@do*f@_[[Tp:x^ױZ~Zݗ"H$D"H$/%j沺]v[__Gs-enWD"H$D"H~SCtE^"H$D"H$~iGD"H$D"H$L2H$D"H$%@D"H$D"/%tEXtdate:create2019-01-17T15:56:09-05:00v%tEXtdate:modify2019-01-17T15:56:09-05:00AIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-plot-task-measure.png000066400000000000000000006063071477354127100310150ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME /&+IDATxw|}<,:B${DuYmE_˥9]ž8?ٖIJeQ%YEHn}g~,v }/pgfy>3όziB!B8 8ShDt!B!W5۶ill²,ܵ0.˲W eW !B!xmd2WoXc HZq31MrY!B!Ek۶QqXw@)u `7 2>ᴊt!be5a+0Lv Obt3QJa&mg\5{ҔR(5vԇʌ>Su.{s{(c|}4J>ϕQ&gmrSݩB7ضicvR\^k0CA~~>1qH$x<^ H{L[d1pD"<؅\/B!>hlۦ&M4 >\Ao*pO}5tA300]Xz5>Nr;w.HG~:\.p ֙穇Akk Xv n5ZkR… ZƉǙ={6UUq;6x>;G^No?u<#B"ʊ~CQ˲$??@VVG=v8,]~ zXE{{.rrr8USmu*뜝~Q#uvޅgΜ9/FZ;$Izzz)..ql˼y͕B!΋֧!J)"`KReYA_iɡCH$xQiq\n7dbtZ_\^Lyq> ҏᇏ@pǃ5`BPJ *ipk20OSSYYY(m dhhnrr1M]]]477ۿn#77`0qJcc#l2b899s BA`ǎVZؼy3?k||>/YYYnhhh0L</ 20Џeٴ墧F<>{kٶm%%  q?~H$Bnn.CCC?~P(D___0Mض͉'Fhllg˖-̜9nJZ[[y_/Iuu5CCC K"$`LӠ}yQJqDP8s%uΡF~388ŋl_:EEE?%2oB!Ĺ)mՙ~ab˖-'ȧ ˕n~!H} dzvTz`zH$JEE%yyB!fϞM__.qc1h2Dr7B8|u|󓓓ý ֳyo ttt/~R[n~&Ă 2e ~`p?'G_F>я P]]M"g?P/~ wo-CTTTvټy3O>{/V|$?vMFss35k&r);nuI$|#{n:::={%%%ڵW^y^"üH$Baa!Ge]IMM ضCm^1c Ǐ`Ŋ̜9wpIxG(+ĝw~={pq8GMOO/_;w.WӧSVVΝ/ymv>KB8X,N7֩@z|>n7U<@QQ W 0cLrrr!uTVV6YYY9r+W2cLyg+H|88$q8x <Äaq4l۶~^/ɴi8t>^Z;b1/ 0}+Vo>vAwwA__/۶mٳ7o.`۶m޽ɓ>|f̘A[[wׯW_={6/; IJ,b8cڴj~a y0 P(o믿>Ⱥukq%KgϜ9znfΜŽˍ7H{{-be~my&M*TVV쳿,8 'Sm`ph4R7|1m4~ӧgFAq沿g!yCW#YG=lfmN(c&H$?7Si\cO1L} Y,ۂB!.4޽{͛GNN]C 㥬EEnf~ )/D eٙϧ`0`Y^e+($Ilۦ@ d2AUUs?9?ϧHS_YYeY݅eTTTx'FcL2%3aN,ˢg3g0ydL`{XMyy~<y̟?@ ER\\̙Xt D"Q>jJY`!ee̟?rfϞ͒%< ۶6mpS2}t?fϞE0fɒ%yqn&֯_Ouu5n |rlۡ+Vx"/fժ̘QԩS#`*1ydNʼy))) ҥKYzׯo?̂ Xz5eEdey),,fyTUU8kײb Νc̙Yŋ3e,y饗Y~=fĶBqmv\.7FLx< g=0 d2AKK ---twwxG>''K84 [kMWWmCGGx߇a&U{ֶp{܌9>5;`!6Ft,H5kSO=ENNJ)멬ocZkf͚)^/!dz @ ~+:;;9L|lxϗ[$񐟟&c6|Cwgq{G?JYYDxl~Bই`6˖-# #PSSu]GNN?e…ÇmiTTTPVVFii)TWWs7A(";;n7eo~zAB!B?#*, ˲ LfW0p\A999x޳1 ۝yrH&x<$H$3]8zm<2mzyC8&H0 P(-;2ҽhLy("'''\ٗB!B!qY!B!bI.B!B\$@B!B! !B!WXdٰjB!BuExv\+Z94)//B!B:k$:3v8{UV2$;;iӦΔ9aNsz} qQǔ'|G72;:]m&G<>JJN~ꧧ>c1ԩn4|}4B!Bq59kC?YYYL4 ۝٦|>jjjFKH5ٙRBkMww7CCCO8㴵P^^h4Jyy9HwwwSZZJ" ۶)++#778&Mg8n7mmmnPJ144SQQCCCR\\Lnn.hvLӤ۶illĶm^/z4v>Es`}˂`P3+5:@@STqho7H$녾TM^&>ZCK֩}f>P(,mj%n)10$g fq0PJH$mbO=7`Μ9}/_Α#Gxپ};̙3<#,Xb^~ekZ~aYXo~޽{YdIf[oO?MOO%%%ضs{9:bwijj7`̙~yemݺv*++yWٹs'կX~=999gm$Il4M P (T/}W˕ T , L N04<⥦!;[߯Km3TÖ-nu.&Ov7yi7'Nk~c/mm۷̝i]bGMy;}&ZCuu*eY]nv'햷t3ɿwhA(bOMZƁ$wy'uuu$IgҤIXm۸\. (,,|3OOB!<GNN|qh[ogy֬Yñcǰ, jzzz8tiRRR'?Ixsۍzq //^EljkM5\ͱctÜ96 ՙtw+&Ov39p=\\Jb-Xx˵^KQQX^f͚E8gA)1gbdgg5ɝiL:kRRR88o͚5kFݏ~6a7ߜdr|0AGA"U֚LbOz!S\;LRS㐟iowh.$[B<Ν.vtI_.^6.wL5n7 (^|эǓij~M 榆'gއ>$דKCzr1ɑ# ΤIh4 uƭ((l 3 gs̖/B!Rjzu]Jgg't׋aXb``D"Aaa!yyy]kb&>q"$Ypann7m300@0$·mMƂ Z  te{v۶H$B?Z~zh5kbZk e]?ɓX $I:::H$PWWm344ŋdkTzm;fgk Z[ aMVx={R&iq֐H1dgkjj'Kk~[7⦛deiL-$ǎ4&&eO#;BrP ŇP/=N[!BqUtPɓ'im6lnCkMaa!~J^/i2o<>i,_cǎϔ)SpTTT1 #s{#?ldpu6k2wͺuvQRF)Su14dfbsOEN:vq~R|.pCAVI;;muyuڭ] ー2l)&-{>rOtB!BTcU:gүG ԜzCVDxދD"A$9F~,푈M:; Ag? ;azO/Xe\>md>S~ϱ edHKOFn(G;cԞN#B!WNwz ~~g#_wݣN7hjX42>5[S^Ϸ9秧K~mc3^gbAxKӜm 5 ΅B!W^]L#|s~B!BuY\:Zd\@L/B! 3d !B!W ЅB!B+B!B!@t!B! pI.b]krnugPZYnJcs s޻eU+W 9W"9_ΩB!.qt5`H$ r.%`Y`d2ywv344D</;a%/坱{0e8%k㜜|>߄+x-[hhl_> àՓW3?ָ\.JKKkh4J(++\.D"D" ;GkM^^^wjbhh^S!֘RH$eY_ +ׇ֚K޹8CQQEU)E?===ɤI.x3DQ%-3.\5ݸ\.n9G β2u)D +*VP^qiW+i'޲,B%%%Fw< QUUEVVe妵v/ B> gH.Bq#x^W.U_:4zh[ \EiiO=N˲صk̜9sݻ3g3gΤ={b w獵 6d^jkkYnl߾˖-]v Xx1UUU:DQvA8fժUnmFvv6VB)ő#G rq>ŋ2e ر#u˗oM<sײ~f0sN]̚5 ρcənal߾l,Xy GnwvvrQ\.'O2}Nكi\s5dggk.kx<|VX1 ٷo,^>̊+  }v$+W$;;m۶aY6l@kkZk6l؀8ܹٳg3k,xװm 0gΜ3L<?ikkcժUioo'//KRPP֚X,[oE$!pB 2&I|I,bڴix|8w@!r9kȀzG:x_@|\yb1{9"Ȩޛ/}>K,_$s婔²رIߣiӦLyn݊s߉y8]DzE1;i˵e򙙟!aF +ٹY^ɾyan\|GUVJ707v37o. Q)űۡ]|;HV"1>Hс֚G466Fywزe ===b1N8OS]]]WH< /vbϞ=dpp!~!կ~1 ˲466_D"Agg'>(n{'N xٹs' *Kaa!>Mqq1X~xJ{{;?яBh4[o믿)o|o>(H'MMB! gp{2~ӟӟ'Ofz/4uÇ /s /pK۶M<'Hw@:ޱb16o#<͛NOL&ٻw/xy9q`7|^xW^y%3d|8L3D|kS莦/G(byr]4 5`jl#z'U*v?Şb8~ϭR]$$>< Oy+@"aiRo%ו$$9wwڵk38f̘3ܹs뮻9s&mz:ujv܉bh qKww7u],YdT /9rCCCs뭷Zc``0z,Ye˖eLy]]]fX~=ѣGba#+FNJSS M4%m8z(Z7xX,;ñchnnwa߾}ۙؑ4,:먘 pw3uTlq7SQQ8x^nn~?mSUUƍ3h7x5kz1 B?Α#GmuqSTT4jX={8z(444lٲQ;??d2I0[())\l[beee^ӧaÆI\J)Z[[ ì_>3c$۶,kT 6`;v%ݼ+ܹ41M˅%HF9y$O=P;v|>|z!@bw-bǎ:t[nn#GcϟO$q>}:`٬Y&S^ww7{eݺun<sĉ nk!Bu}`OkM4'dΝ̝;[nLwz=ag #q g 8G=^:H}{GoK"7z-O4Yf 6l /v~+8B!b Űm!BPy]Z}FyGyꩧoS۲9s;AkP<[)*S@o ].v3ț+MP)bZ4hr\ChAomk5ek 3},+^c9a禛n:aΝ}NlxꩧzUopB~_aY l޼|03,>;?hA__H4QJezGoڵ_5׿5Zk0{e͚5%//|* ܚmӧSSSR;vPRRԩS9rPd2I4\uH<'e}{ݷnǹ33rT@8-bţk8q"s!HGG| _ݻwfӦMdeeq7gN&L:O|޽;4 !piOG+?΁O~w32:V;E1uT:ߺBwO}SqɌNA/X,Ogz=|m?A$y3w3;0mۘ?C{U}GrbwL89pH/-C-D{XT(uG;.W::ıc+ǖ-D:aҥK3oqwdÇ@mm-]w6l aB444A]]477}KbvfܹsY|9```J{ɓ:tχi8hv9Bnn.ׯ)--E)Ş={ɡH$¾}FlޛJ)/^ɓ3Ҏ?eYdnoIwb͚5rQON<3iӷuh3H Oo;2¾}8y$#??tuuq288i߿cǎQ__ԩS `s``FbDB{1^~e~룹gmۖ1}}}}^˲#??Ǐؿ6l6z! uh߾}B2f &Xe֬Y]]]\wuA  +++3z`0[ىeY[ >}:;v,sAi޽ 100ihii!}vV\9rsկx</d6m444K/a&gf…׿'xbvOMMMr>}:[l vB!̯|+w% 5r0Ͳ2͛ٳ3|ֶ:= 5DxԌc|tڑ-],#EvvǯkΚoz{m eٶ㡤3qRY02˯lP8++kT/x e79>Vm6!0ahn͑#?AGH7I+IW;ACk&S'ғ8\=Lh?X9KYT@eH$(**"2e `r ʼn7eee466R\\LVV555,Z dh4JSS&Mn999p.\Hfu:2e > R^^N{{;VbŴPXXHII nF*++zXł (,,DkM{{;_Eea˲2-P,H$i|*++3 @~~?zk=vzA ;:cUUTUUQYYI__ ,YleeezVP(DNNYYYSXXH(;A&Oٳaҥ,]ӧg.tMTUUF~uwwn:͛GGGh2F+Vdާp ^IO!BƷtԨ5/Őd2Iss3.)S3}~V^TUUUfYQ3:^ډMzL>00@2t|jcm455aSLdOl\?dד8S)Ԩ*}*PóZmFzwT>j)7Ĉ|3F.6f$s$DF5OJzs-.7}AP)W=۞~=>RQ^^, /ֶB!ĥ1wכ{zzmto|0w8䝝s)#L^O$xQ_\=H䒖^\ң%&ES1M➩# ϱFgPJ}L.<᙮), ^:A8;-}cd=^?Vo.K!B1كd&8:B'K Xd+rd&S؀0 ~?ayVw{kO4Ɨ q2]6s1b(>KG^Md3JgqFr|9 Χ. /k^wg Kq'2SJv 2]!ėcͰ{%:6( g]dVm!BqY FWKU3H`~!B!_(B!B\A !B!WcV=#@O$]W!⊔^&PAhBK";;3QRp8aB!.ſWV?^Xc sC):aÑB!ĸRtww,I^% z1RPPpI! 2H(yy*褐ap2×K|GB!)OVVV85!||PiQ*B!Ą{xwsM$S!B!B#G> ׯ7B!B!Ļq [nAk?k/B!B!Ļ0 fϞͬYp۶mX,6fz ЅB!BK,=R*3{zd29> !B!X2%4.> !B!idgg Gt!B!]bFi/weB!B B!BqE]!B!H.B!B\$@B!B!2o_ܫ-X0*N aU2q-t*m㯂R1u)p-t8\ϸ1t/w3،{'I U_=^Y@Ƴ+`|/"?Z$G60/)ց'\`Ϟu7q_$F<̚ϾO{-C p\.:!\Ʈ{syǪ}lhքKn7n::܃u^TscC$SNb 7c"0]SVcN]'mfk.>wޡ.|B~QPQ{'TCzЅŮ ^tV:ԉsUopb>JgLZguo8p]N8"DӶ3[wǶ#^B'B8MX}|K˩}3Ӌ5>xiZOh8}'&O;װnۓzOډS Bn|+7q[.wӈb{X絟Ӽ.8S&>2vn8X~*7m??^Dxbǔa98>u !t!e{}ե0A+ÕF.+e+q]*5gT.P e`gk?Sά{L[*O)P#D \ϼOw*KpyN$o!;:#c 2pq*oL\PF*!@OS!B! pz("_B!B!j=Ľ*N:}0 3f_AV\ɼy8pvnZG"`Y^{.֬YÌ3hmm_'++nBwȁJ9^lO8\ЈM*_Ũiy6 qɌ^Q '[jTY䗹nB 胃l۶!Z 7܀vo㡲BOvv6eee8p@ ^˦Mⳟ,l߾֮]KVVjFD"AQQ>G}??nw!;;瓗/Ky뭷eʕg?_"?яHe鉕1)rM(@cƍtuuo̢Eػw/466o>,Xo%8eeeۘ ~??Yhv"suaYL4;w磴={044DQQ%%%ncΝ|>gΝx7_6BʁCcl~".f7q/( nhQ'"Z8*rlq0U"?Tsz@ۨ݌,:Aԍ8X*JoD|}C7Ձv,}]ޑ*ߎ2TEѥ!Tq'݌ _MY3y6˨TmÈ?0fh{brrqtOԍ[}oV,6G> CEdYC'<My9*/MyW#pUFU96oƭ$o3ՆEs?wo{ P;:U+s^rl s`s`?HcmXu z~ !x>k,֭[ǎ;khhhm}GSSoixbyhjjf 2cǨb6>,H￟ǏkO}d2Ikk+7|3w玲 {n k7 opx^xعs''{L!{#Щd̿|n@: ޑpR? 2iy.efy/7\^\5K}ҝƈHii)yyy̙3qeƌ/34< 'sK;z(7HAAAf[II %%%/_ooJD yu۫he=v⼳w+9v4y+2\4l yWƛl]0=5b0:Ȗw^eg{ch=$gZ\tT yx?Au:k6{޿J}0D'-ms[}2 47Sa8W[I96Ծt]0VM0'`Zk&OܹsߕUJG 2rd2~^zűqрτ9 B.lschl_\:W8 4oM ƍۯκyij!ǗҊ 8CM] Zт/RTrjZ&ǝZk)5(_qc Mjdpcpxo/`%l ,<7S}y (qw88${̲,>iH&cNT>44㡰=% o$mKqtf20/M;+\5&/p!._k"V>MKa(E??f\m2 >Z_ui p _1ѶB\ZZk\.ׄ:r/$@qnng$}t mb~֗^L \!K7mB!B!. ЅB!B+B!B!@t!B! B!Bq]!B!H.B!B\$@B!B! !B!W ЅB!B+B!B!@t!B! B!Bqp] !G}3'nG䍝mE^@wC ?*/܇cECڤ[p^ىyqU0oZuk. ! E0 {~5 5sJc8G'Z1nZ%%cqfwa? ן wB%@BB!xwL֠i wzv}_qAiXͪH #u>B'/B!Bq=H`>!B!vCܷoɓ:uiii0 ***M ٽ{7`%KPUUESS˗sap3fh"CWW+V 77zA\.k׮rB!Bq pG200@YYe144Ċ+(((ejCii)999ԧe߾}-Z˕ a~''?dѢE ضMee%l޼P(D4W_eG?|b a6>jٲe _=w隸uOٶm ,`ڴi\ !usͧ_Mho۩<>סiYG')އ{]+Ο`ٮsaR9Cd5B+E1]B)_kVQQJ{{;d2Vk֭[ a̚5 ә9s&eee,[ ۶F8CII 'O$ [ozjL3o.]zϥB 5<-56l1 P뗜 ck\8_kPBFkaIzyԩSmBjjjصktRbJ)>qq֮]Kee%%%%8C2f$I|>ˇ>!9s&X~=+W$Lr72g H0eV^"'']s)B\lz.tIݞ(]!!}Jg7)#PXXx^=z-[;;w> JL!Uh(`-rCجKЊݟ嶮?Qcw}+aW'[73@!Ιd2Ivv6Z044㡰pԶ^f-mzɹvѾ /dcB!Aќ\z: V"||Ʉɓ>ٚ*\}B!%cIfMKoYDݲ.Y XrWC!mwh"~˱.wuͮf>Q)LGqjι̜-}E{δ$Inw"nZk">A ] !WQp.dROO;be, M!8+4),,b6dȔB!8+R= ORLs!bF|Gt!BL&B$@B!B! !B!W ЅB!B+B!B!@t!B! B!Bq]!B!H.B!B\$@B!B! !B!W ЅB!B+rW@!ج$I塓ݿSJMdɤ#6]nI:dŎ\z #DG󬓶5ϴoQr$GCDAAbr5.P#@5G9:59^ЁArK.B\$@B+BRR1^IԅH8SXMjx?+2ՈcFugbcW#릮ȳ&B$ !B!Wеh/q!B!WuV2eʄE)Eaai(D"f͚Eaa!דϬYhhhJOcΜ9:::8qeeeL>B!B!ĕ`Bz<!,H$̙3),,ǩvSPP@VVhϧ\f̘O>I88;v\1T~ww7B!l]w݅륷^{y144o~ٶm=1c='={ns!0u ()=|/4 r6'>1Gwj޿QT^glSQ:uo}GI,#z:ݸG!W ---?#Vb̟?Nz=ʢE8q===7o=?PǏS__ϭJ8z)n7\X*>Or ~L&qN2dp!6nHmm-s=9]wRmrBLmߡ+%nQpy8Y ,.&v_%×M =HONrrzNXF\ 8,uO=o돱mOXpO:;E" ߒce((CHҘ48ؔ X !W P]]̓>HKK 7n,"qO455ob6K,aݻD"A__3fPPPoƍ3y1B< s>p8Lcc#H$3TL>ïk~ FdrB}.v?ħ?@njiTO28 bc_%LmCrtf9ݜ;r 1n;HFe@B]ikt |P8sȂڠ@ktL:!N,JmHޞZ]},5[;- SA}&UFU(&SZjq*Rl9XL7ױ?*vuHliǝC6V?'BqP`n׋aض8AAA{d2R ׋֚w̚52b!;Ɯ9s~z{{yٶmX8y$ضͮ]['?޽{n Hp̰x˲hjjvS^^}Ǟ={X|9W-*S,KUB!%40ܮ[@ 0*M}}=X W&m…,\pTz(iӦQfuu5_Gd,Y2o1@ >Q׬YÚ5?sppx<~[!&P${F$/z Tl:s]M hǦ$:0~r0'ч3[n \=A $1usY$77]C^B.TkrXv.>_cǐtwuqJ L&%`8ĪB(Gnn|*#u D"Φ_//yp.z%:!8oMN, 8IAj5Uw*蝕$MC)q:w)CZ6pv ~Iׇ ǛTW<ϗa>/`QQQqδK8&Oɓ/w5B\AGb{|IE.w3CCa̙|/ ! ЅB *IIDQ& ΅B޸<!W+ι&B1& ЅB!B+B!B!@t!B! B!Bq]!B!H.B!B\$@B!B! !B!W ЅB!B+B!B!@t!B! Bv@YI8fMS.2e+|9+&M}Sx|hHS0]w!B+ !Zl9"ǾESo%zѠ_?Z_3Nx@O(?MOcE,jK͇l^5?Dm_eLf};obI<(WY)F)B!O$@B!B! !B!W$nΝSYY9}BJ)ML&ioo'SYY'FNNtttۋaRZZJgg'P* .w{ !B!cPnYamxBVVdeeQ\\Rx?q>F8f߾}޽ qF~_MAAwu?xRRRr\1L`P1Z D;~]h*WkplZq2pl5 Iqc8팓]ot'>M>ulmN M:G3].;X.mRQThRilv{!Bw˄f̘1v;̟?۷saB̞=͛7sm8ty睴%K8|0b1n6͛@ee%hkk[PP(ٺu+}}}lذ%K͚5kؿ?s=_5 կ~ڵnrb ˦mC;O!03(5ϔc%ӇW=G\ch Ga$%MQsZ-3\8z]DXIMMFMVLa!s[w*`Y@AIƕ0Jk;dތZ\W+9n80,7tyy/ `\̙3SO=/~ :;;)--gձlٲBq.ҟstU> i;ƒFf΃#gXf> N´>:צuAh:.gS]4 }6@T1P`ܓ>D;b\Pp{j$ܟa&f#1[(qj7l`44sSt!B\&|zNNGNN. ˲p~fZZZm0FkͦMp8L q(..&??o \.m ~@yy9\s tvv<ձd^u,YBVV555~:ts2{lǎٳg_BV(k<=vRgZT*`%†OIƮXU;T.9 ׄvmjB*2NQG<Մ3QoCP(L}vS!B!:L@ Ep\,]***={6ϧロRWWgԩ̜9k֬!SQQYt)HF>OƱcpL2iӦO${ǽ /@nn.7n$HPZZʺuD"۷!>OѣG{aΜ9B!B1M[ooQiN8Aaa!,Y d[.D}_ѢEg9k,zmƍlܸqkG2/,,;@I&8w ! ,4.WʡRx"2F~*dи.z ֠DRc8 s  ÷' $878nJ+4v,, bbi i%HZN[" 7mcvrj`(E"qDg B!iޥ/? @ @aaye400@]]@3f`_Crpgpòm={a[qYܼȸ3_ CL;yqJ5ǖy{plZ.HPv d!wj8 o"waۛ`m>/=;Ha9DGd%6uV4h1j֠/AWIJ8hsL!+eq}ggLA^^^۶qqZ388H<=% ojkk0.òGB|h1 4S fcxR d8+8s%}!r"^6q2󛘦9K۞2yv/M~o}Gu߉I#i{A]BH@6`:l%&$v6Mf7}ғN16`Ӌ({uFvJqc,~V$`[[RuAB  ##\vttK I`,Xp7CAۿɚuk|1 |2}+A|X,4 `P΃ vE.   1׋lF]f    |ƔJ%d"@AAA ԥRMAAA"@AAAAAA: tAAAA]AAA"@AAAAAA: tAAAA]AAA"@AAAZo ¥N1I?|r9K/ @Xr$47FAR%&$DBABxr%L j%L!9 "gq@Ty3A6W%ZTAA(u~s w^r6|9wKxpZGݫ~:ƂWN+>~?pϣ^v/緩v #9yY3k}TAAA.y|||? 9^y/H V9\oK{~[AAÈ]/6M^l6c2qu8s>t~GWAAA>=xpt:> $ l( 4 ǃCp8h4{n7oFRaPzyX,W /(@Asx BIPr>IO  J O$pK AI¯Ptf@mB"P$"(  A}Qbccq3::]wEss3Q]]!55y{QUUE\\uuu8"==Q:;;Q(vmdeedYl ?]չvZ\ከ +[q}>x JXc7&S=NA.kF"##`74>< "IJ!V*F ;v 99N4 8 :FIIIq8h4lقbڵ:شi۷%K<`dde˖])ܗI -qBI7{φ˭s6/=( 9I@)5'9H (Ő AK* !] FP0o<ˆ%]7mľ}h4^G$*IDATh4Ann.:{|={NGNN477SWWGJJ ~;֭^CVsM7 ]ryYz5/frrg}4-ZtO    \d6FI0LDEE]L-R>?700@kk+q9|> T-^J] ~@ $IT^/J|S# V ~]u+J 1 o>} |6؇S4]A47+x9ftA'DfG.ߏ띓 =dzzF#:]C h4~-[FEEEˆhyŪZ }f2aȕRQ~_pQ"@O@pZ+I xLX% LxU؃I{ǘz?rAA" x}Xpc%117~N[p!QQQ]Z_-υ~Ѓލrdqdž<[!(MAK(+Ȼj_4k֬a͚5z3Au8NrzS>W饗rm̻`   <,      u@   p    \D.   ]AAA>c$R$   gt:|9s:>#tAAAA) bbbj``}6   gLTb0~8ߺv/AAA*AAnT[P(8 $ InHNN&"" W8$ Kww7`4gŹ&V.F In~{thHKKsl%Ic=~t,$Ifff^#`*B*<<\.l$ Rx  ||drhZO7d= Jrr2C ¡`jt=$iFFF-v]ho.®뽢oUssu5}uVTSTx9 /+j ^W^Q*z{r`0~\ IxjzÆ GT^2;qǎCѐɆ P|>e޽P(P( ކ@ xC@{N `ʕ]y]Ԅ-$=tBG:F$Vٳg|X9 j5@3g uF CO {Cx,X>ODDn{NT* XV|MmFll/68 wQQQr 9w^Eɕ$188Ȏ;p:TVVl2vI{{;l߾cǎ҂Ffll355Ell,?OLLpQ6oތN^x4oOܽ{7rDXX455GWW h4rEƥ9# yqV\IEEzavލddddo>Yz5aaakRRRBuu5N*<JM6Igg'+V@T2<<[o__jd2{n)//'99RIWW]]]lܸ7| ' ߽~F#)))lذ nsI{=̟?6ȓ$ ƩSZ( ϟS0۷06l@mm-ű}v^~e|0fX,hZL&---rmCxx8< x^oNmm-yf®1t::u Ʉ$IQ\\t>܅-ٳ@Ӊlw!--, wfxxTnfvҥK9}4{|>.3;@W(l6y/~ --rΜ9l`0HTTlڴ8y/jP(8v111lٲ?DFFC=ğgXd +V੧ܹslܸb^|Et:JDww7GJUU n JKKQTtww؈b133Ç8NΜ9h䦛n|+O\.x@aرc*| s(**"..Fv]]]`4 ))^x z=sLMMq7f`z\aP(+W299I||<---hZRSSq:X,fƍ  _(ZQl۶fx ZZZx$--{(,,D`6q\l޼z=I^^~*9q4ɄVpAVsr&&&l6XnaaanV^ͩS@ӱyfjkkߏJbzzd~_o?jÇCtt n7;v`ҥw}pYc69y$TUUٳggÆ LQQ'O~, ì^Μ9C{{;>o}Y&&&8p7tիW9v]]]p)j5_P'AAՇ@\oSVV&Yv-gϞ @rr2aaasP* t:)))-HqqqjLL .\.###\.4(TV~V8_LLL[ʍF<Tbb"rA?NΜ9 cccjz]?$QUUŷ-o>ƙGFFb4tgʎ;tʅ`0(&T)rc4y?-&?ɗ݂>gݺu={Q~`ժUv&<{k9''o}[_|Qb] : .i\KTVVr7˕w055$F:|MlBff&$qYbccIKK+f369=\Bu[V9ӧ9}4 s1=… 曱Z~}Yd l޼ jΝ;GXXeee"I)))h4C?~9'>>^:0y>2-4^բjDDDaaatttߎN㥗^l6 ]A/8z(x<VXAff&>]]]$*Tz}tŊر?,]D4 aaa$$$044Dkk+7n$֭[y뭷tdffxbó>… `tt Μ9Î;$ ^Obb" h"""h4$$$`0TIIIrBP0++e˖fraFPXXMrwapVٰa{ԩS^ycYp!(JˆkZF#NˆCcZ >>PR Aq`:*JIMMeҥ=z , $&&b2X,$''o>습kiiio8~?˗/bAjj*rJо\.}(1ekk+foR:::x''x!8@0-[&$$^䊒$|藺;vrXd g޼yLMM)//opCUUV+wysA > lٲe1޶mo?8 K)'Ћj-W~`(**"##1 oGQUU믿Οg,X ..NXbdddPZŽ<\ÌvQvAAd6?txp\(Jy%˅Fբhp8rPa4:vq\=T%,7Fp8r!FȅP7#' T9CI * ǃFapppJt6{od`^ YYYr*ݎ[v;:F#' CJݎZD>ֳuh$'SP\\,I]!K[[rb񐔔4W땓ߏn3}Oۋ'33sNI/P4pz>p8HJJ(Jy̴pJtʳ&[0U[[NH>fu:vILk WYxm>LNN> _p}z:NܹCJ+Jyz5{CAjZ>ޡc-tAAH.I0111r+υ7:0)))r!RgR.se?jk%0<R実 f ɽk. .}]BB= >@'&IBPAAƗ.@azz ;^YP-iKW<=n_B,4bdd7JiΡJbff檬#o E|~  \K_"0JgMT^v_u>W#$Iނ  p=   p=Q\W   pD.   ׁK%AAA)C铦?C٠4aShKٗe?x^T*5z_u+  \?n7jZf'=zDEEa0Ң#>>f8w\n{h4tmۯ_vݸ\+N>l&""`Lttrx0 zSAAFN'7؄fZx<>s٭KtU$Q(HD0$T*必\R*s=Ba=W m0}ӍB90ꓞy rSs]s!vڸ/1U(:m\hгEAA1]X 5H˖.A $1::JrtZBXVbccIHHݎF!++ NGWW)))z:::HOO妦&Q*~"""8tvm{v .,D~1DFFfcjj9A]賳Wh=p~߮$@~l~GGG'W`\zǙd޼yrkJ`009k t' @p Ps ڎl VnQ\n'>>x)--k_3\AA o0_WHLLe?4@xg߱c|M~ߒ@d0v$I"55U%&&F.)t<?>qÝwމGՒxݵϾNf3w566|{fppw133=Ã>Z},ر\.8N0׿ǔWbb"111'..Xl6(J!==*;x7?> 6mb  '**?@ ??|ro~2z{{o~CNN__/K"""P*G?"33nL&wy'h4jjj⥗^Ç322^GKCCHhdddyaXOJff:@F??q~,Y~F:::g?,]"vI}}=w` tڵk1<裌v|\.222x'y饗xGYj_zq:r!z)FFF0L<0O=z`0G?bzz^OBB~3z{{eժU/2^ǩnJ%q?_Gyrt:{ARTTmƷ-ϟ wu K/AYYuw.nCϪ'|W_}RGmm-Ӵڊcݺu|IAAn -L%hpݗ̇N688HOOl222zWPXV022N4@_LF ٦P6sNFA$4 * ͆n',,0z!SUU$I=zpX~=G̙3dddv嚎3g3˗388_nbbbp8߿^fff(..fwp8o'OK$P~DFFKcc#k_L(G__|WJ>O{̛7"##C>ln7VUԲoF??9MMMz>|v;/fg?رc|gѢEx<^}U}Yx! mt$$$`0?>O<O?4===|G?p|s=ٳ3gp]w[oK&-vywK )-Z?οۿ1883<]wEbbTAAAzbP ЍF#jE FW"KYYhmmERh" wߍ^d2+¡C #==]>P+VhLzll,DZ-nLyz+V"̍LMMѣGZ055šCرcp\)JR.wttoxHLLvwO0dbb?O$''T*q: V^͉'xy衇0 ,Z]vh"JJJ@`v71뮻x衇 ?88/~ <ȢEXg' O駟f $''7kh4'**}]X~=[n)--e…sоjZl6F+V_;3R233"&&[npJ%r%Wh#551spu;$::Z^& {c߾}L&jW+  |$I2222'P\t:}N_fD$h4,Xy|XjvkaTTK,`rrdQTUUNj5<n $MQYYIdd$҈eT*.\('}۲e ~233)//ŶmXn (Jn7+V **|Xd z\222bj9y$*4lŠ+>uP7~xb∎`0PRRIMM8󉈈//QTx^rrr,`Pn ]䕕̛7oN [QQ!W~wC\\Ǿ~].MV]ݗ-[FJJ QYYIiiPvmIKKc…h4INN&,,uֱpBϻ˭ʚ5k:Nߙμy?>ZMQQh4-ZV%--%K`00L)I @Xp!qqqPXX(w} --ŋSRRIII|$))I/AA > Ƚ^/9f$IL&kWsj&IpݸnyN>kvBh9͆ZN:H_ {v+j3Z_hB!w~=KOr>jC]EzlY$ ǃ`0\tMTOO$aXG\=] -Z.t]/O<ѣGO~Bnn.@BTTܣ#ϙ+G]s/ o{=]  pi$166J"<<|N[$V+8o vvK~ni T*/fw(@Jx^\.Wu=n*ʿ#~j$''˿Zs*ʄ\MAALMM.ٕ}zzEG0dttuC>,t:QT7DPw+i瓃nr>W"** k! bz"@z|+~  7yQr=**uv;C Ӛ$,,u z~v2::h3$%%b/ܘv;Nk)  礯ώuɒh >sfg8o7 K_^h:@|t%jlG(  _NLQwÁ#!!AI 366FCCJRlhmm%..GSSDEEp88s ===LNNb4^^淋>bbb>QmÁZFKSSfffra4q:477ۋ^',,~ZZZy<rY:;; DFFN{{c烔.Z[[jhZZZZ"..R$uuuvF#f|>cC}cMgg'x:N1 WBIxx8&z&&&ARKss3 0hmmeppNJqF# Njr>.233CDDU - 63yp88x FrB]z=CCC<( RSSرȋ󶧧GYB444RnSWWf#&&`0HKK t``fX,xA""".jRWW&&&g륹aKKK ᄅa2Ibcc$NyZ@DD477vOnAjgPh _6@?z(۷pikkG?4?:Dqq1z^x{-[p!:d:;;ioogΝ[N7'@FGGcPR8tٳD ogΜaʕr)8r .zdfyFp1FGGٽ{7rA;vT*AsA^|EVXJw#G3CCCTUU?O||<111 wޡ@f~?rP(0tvv222D000(@^FGG?Aww7DGG. .4;@olls?Zݻ)**bttQ^|Errr8utvvbZT*ar199墥ELL̜233CTTccc 3>>Ntt4;w> 77VK{{;DGGcZb`0@`ll Izd21<<^xLa``k6tZ aaakLNNn:L&]]];v<9cު7`rrvrrr0L188333>|"^uF?b9~8Lww7޽ד:'HՅVE$ZZZlDGG311!/711$I344$'sNJJ 8t:<O<0Ǐ')) ׋Bfp8fãx v;'O'x)9BVVfy_|QTfq!͛GCCݻdعs'###|w  ܈>M~kƍZvN8Ayy9J6T*=/`ttyT*"""fjjxno^dKMM ˗/X,ONPm6~?/Z}vx _<~֮]KSSq``vוJ%ͽދjp:{-y444i󑟟φ hmm@VP((--ɋZO|>ְ̔0b``iK||<Ν=[l!//vhii!11łlnZ-{zgѢETVVoߏRDѐ@ss3j[n>)**gLOOoEXXqqqtww_wC$I7xEؽ{7wy'mmm 2>>N||<dggˁ_D$f3˗/ro& Juu5Az{{Z;wロLy8@llGFF8|0 ,ݻwSXXll6322ӧ1 r_ k}.fKGG'==]!sAJJJ? Xd /g$&&x(,,DVC_cǎ}N:ʼn'p:[L~N||tvv244ٳgٲe :Ʉrk.F#6 χl`Xp8L x9vM^^aaa(++cӦM<#TWWT*y衇o~Cgg'[nę3gXz5yyy׿n 'uS`={VYr%vrVnDk4yIMMezzIl6 R8Njjj馛.^׋V[>BΝ;IHH;V;47ݎ;/ٍ7`0z!;;,X?r+@cY`%%%s͍rv{9}TTT`.:g~̟?Nq8ꨬ-%%͛7]N'Ν#66R***8v8]ZU(;w6333ttt1|ՂF#k֬gϞ=n^Ju9^4&&Fjp!멬$33ǜs299ɱcx<z{{QT^o~Xx1}az9vUUUnijjn"rssDSYYW$Iutݜ={VM6 r pBn& )++"ԩS,^ロTڸYbgΜ  |>l۶ χ易˗˶m /'[VaժU:tKyyjAP(P*\.T*|n7@V+x]Kτ1o} e^{{ x0rW.0:tIIOO''' 288(h4.޼<Μ9S=?~ zx<066###?%""d|>Bjj*.djjJXt_) ꓓr0Lz===ׇfnSUUhdxxE?rԚET2==-6Fغu5 pI{1JJJh4fZ-˗/[V+MMM|tRXb6(-[&ǞRSSjٳX,yfGG===Wu r-v:Ē%KnGqq;l6˟ ;;xV\ҥKݧ%Ijd2h[oU.Mss3YYYx<V+ r>PaXb޼yF_F~GRR&vBss3&I^6??ZyLBoժUre¡Cg…DFFrajkk)..ǏsA)--epp`۩@VsaZ[[?>TWWsq(++]O>8\.=J{{ljj̙3j.Bl|||gSSS8p!8rWf``1^/'N`ٲeB aLOO{n222( 9}4LOO ݺ`cccCnn8ɡFۇN*-駟TTTm9x A2c.&.]ŋ7o-hZZZX|9S^^NVV˖-c޼y c2زe fHJJ7dtL&333l۶?mmmh4&''ILL$ RSSCxx8Z^ ihmmj]of/^LFF7|3`SNaٶmh0L-8nM_IPZZJjj*n:ezHq\l߾[7JxjLt:FFFqqqTTT011ua4IOOh42==V|>SSSZiy=_fXd $Jee% .pQ(r⩬,nVqtuuj* $IC||<###7ԛjMjn0Xf :u%KP\\L}}=X<V%33>fff"&&4""" +Wdll RSSIHH 118gB-\L1h44 8NXf .AHII3ą=s A\Ҙbȭ vmX,IHH+V`222hkk#--իW$Nm۶F 6PTTDJJ< dٲeߏJbdggb˖-qY)++ddd NMMvZ &77b"##p`ZIII'4p7b;$22JEXX ŋ-;&;;,j5z^󩨨q0 dddݰj5۷o'##CaPRRBzz:gϞehhիWSZZJvv>^~祧cioo'%% Z[[1_tP(CLL r/ @oo/FDZZrFss3,]Q6mDff&.K2<Luu5=Мp~#G022n+000@uu5@R-rM*gnd_yЃ CvDA/~BFqNKfi xmCmC]??m.I,紽}$ Vŋ 0곺N>zB zaKsnn.DFFιO 999$%%!Is~cIyy9`I au^kZV!Z-@EAAn,R]<ƻn91Ε333\.N |v8ߡpF9Nk\nI`0ngrr=Mf %~ La&^ Y=AAGh'ͽtQJ~e>I]܁Kvqn<_.  <'.J_@W[(+a1g]c-V"rO"4 Z}jiP•~Bng^guvÕlu}|Vj]g͇fqOHHgbو疮' 555( y:4Bmm-IIIx<Ξ=KWWQQQhZZ[[GTʟ}||ӧOˉ.fAmmr5==ӧXshoo'<>ӧ|FV+մEcc# bbbƋ2zPSS3KTT:Μ90')Y?---_.W_}Kfhlldbbs=fuviΞ=+g?wh49C$.,2S(ngdd|ff^zkklv+ٳᠦp89s"##<8}4DDDS={BATTyA:::8w.K^OMM SSS$$$Jrr2$ ihh<3磮&$I088H||<˾OǙ鿼^/uuup̩S ..Nl6sFVH{{;vX,|6hnn&""^Okk+*799ɓ' 3< 1>>ΩSs79Dz̙3LOO{ED믿NTTG͹sjDFF^B, 曔\Q/*t}a0.!}]JKK?ѳ~pp@ p.]]]vRexꩧ|dff+wgg\VgzzZ&mbbSNaZt+gq>.+O{{3ꤤ\_'55hΞ= @XX477AΜ9^'""IN:1115+)<|0CCCddd|fǩCQ\\|ɿfN>b!>>ckVU|MT*<;5==믿NVV֜a*`4?r s+ oZs࿦-ɓfz{6ܹs򻲥Zn7qqq q{hHfffgm0:yƈ>6ӧO344Dll,,?|^FGGyw9sKLL v^?'@onnf``Z(++r4k'N`zz={Ve׮]={UV166FCC۷ŋs=GRRYYYKrr2:CCCTUUAw__gϞ%--?Oo>rrr q:jIGo8C?ጌS0x<-[NȮgϞ'? iii0vbɒ%( x ^u֭[ LKn08uO>$DEEBOOzX,y~^Ogg'Ԃ;wDr>F0sa>lI  h JEDD\U͕OIFF/111ADD p ,Y"_<3SPP@CC/DGGcy'0!WOHH@ӱo>ǚ5kW"==9S鍍aZٹs'aaaaXPմ3>>oMii)/26Dh4>477͉'XbSSS444 vpa2331 s$I\.9oeOf܌f#??8tuuIcc#ԩSTTT`4 `ڵ򻣦;wP(8vϧ{>ᅬFߋVn:;; ˕CCCr0 #͛vgBO< C`9l444`:tW^y ~?uuul6bcc<f3dٲe{OӡP($&&f{QoͩS$>>^𘙙avjj шNX||CTbXX,mmmr``FGGF Sj ԑp8hZ|hnnRFVKWWZI~\ZFv;ryXTʕ.0 LMMQWW'W|KdffRSStnqt:~ш餶qj5|ݎhDKS_xڈ ))I._ξC恁&''1x<꒧: ]U$:;;1 t:룿ZMxx8rIIJJs,%Ir9~!h4qq}$?G8bbbwy$AAAp>hlllؘAdd$dgg=܇mWWڵd 8qI233ٷo6mO266N#-- 2ef:N~j|5==-;ddd@ Wqbbb2p[[TUUP(.*Hę3ggOiii< >,@l{Æ l:uJu+B-[ztvvt:IIIa֭<{/<AV\I]]=pB ZR)|Lmmg<Cx^^'N`LMMxزe ^-33;wR^^'77Z0&))]vo~Fq\x<y^>9 ,YB0Dד͑#GxFFFf|_T*1L8qKP(PrIv;j RUU%?233ioo*xט7oZtcqms/Jkk+sv^~eϟ^,]ロn/_?ƍ`˖-rOA@xx8k׮edd{s1/_o3<#v|>9!ᠽ]䋎fΝw}ڵ ٌB( .h4266FOOoGVo>Y7̾}(,,9!TTT`o˲en300(.K~B, /" .?FXh'N`ƍ CUVy8:::ۿ[ZZZ8}4 ,-JEKK |__笠z&''h4,_`0ȓO>9'ouu5`8N?… zrv>׸8nv8wh4iii111lݺn$Ibpp#Gxb凛oyε裏o|}Cqq1ܹ8q4s'O߿ $IӔb2X,LOOى$IL&l6.VIPl޼^ϹsZFO||}5k|e~rJ~mv|S:J%$RVX&''ejj ݎn'099`jjJnYj;>zy7IOORhpp;vp]w]ԍ. kfc``,e˖K/aZ_d͚5dffkn7K,7xC2+t:d2/y,rssHUU/v8oP^^dy$''a&&&())o'--䖞$IÇswSPP@^^\Crxxcnn.$>>a$ȵέw^P*h4rrr?رc\0ŷmimmw%&&1>t-%$$PXXHii)MMMlܸM6hd,X9 Umܸ0:;;INNf\.ùXn&jjj8vv [q)((+<iiilذ!ؾ};  )**u3lÆ >|ݻwP(}կ~fff(--eڵKn5" )x<^uYhжDDDq|twwYӧ'99yi&|"įa6׾w]&''yyw>}^__ϊ+ؾ};tuu(0|> `IIIa员("}|fV+g3L$8u{=4ƛoILL SSS馛p:>ʰX,FGGiooX) b0qF ###$''S\\,ogZZMMMV5k֐o-'''J.X֯_Onn.ttt}vnVzgmh† app[ngrXx1iii,^t\wkB ,,˗ϳp9CBv;fIΖӧ`hhLxx8~;6lϨPK]]<;`ɒ%s]WrB t,[UV/i177" ϗ{!@ @ff&qqq{_~)"\.rrr(//ѣ<@~~|_ʆ!˗/rwΩT*C;<l޼JEkk+.{K^tog…dffO}}=vDذa]wڵkh4Oaa!W_}ӧOYwzz:A$3|"""X~=[l{iVTTxbjjjlFFFFP088"));Rzپ};:NTFV300 Y~=yyyrm۶q뭷>g 8q2vMbb" ֮]fܹs$''swO0虘4眅*B_Vx+4;SeV$yrTTw}7˖-}t:w2@jj*111 aو`ժUMUUyyyvFGG_T^Q* կ|rf3Jkrwt:/zx^$Ijr1N:E|| `0Hqq1+V[n͛7SZZJVV YG^^NB=jrssf͚5MKK 6l`ӦM j5͓^[o%~bcc;6l[o%W|R _xK~~>v "##kdV+wfjj`ddDjj]\.333$??w*O'N 77Á墵A^Ad2QXXehhQk;N~a6INN،xbL&<1 0v)**122b"""?~6zzz.%TRP(ddd'a||@ @jj2 ʅEANNy~t:~?455QTTf`4|Ɂ*++!//O~yΞ@l4 100@uuPPPRR(###j@1͜泥Nvv6 V\Ioo/?OIJJcǎ133p%Kr鑻kZJKKqX҉ ?rrssx<ZZZBOO===( t:555xoỈ'餿fff<++0L$''#WTR^^Vjtt*!,#kppPI`͕[CEkkk-w |tww388H[[N355(tttL\\/h4RYYIRR=== 뭫KSSSsQ:RIMMeɒ%twwJZZ1112<On,IKK#**^y0Ltwwݍlsɽ9L8rfY/|ũV] O^^Ge`s j4׋addD>|>())h4ʭsj=?w999s!^/SSSR9lR())!66 vZF#/]]g2>>fɓݍᠩIaX|r7V)((Att4>O}wP/⬬,Ξ=K]]TUUsNJp.nt:&&& ?^'MMMLOOqxxIvvb>22d~4 ̟?7r}Pkhxx86 … )//'??ŋGBB\r:??J0Lv6o,TX|9%%%IJ%^Jf=}hhH,\B\\(rɵ(twwzh4r{yy9TUU!I~mFDDlr uXXr֭[ ٳ  \Iff&W/("""0 rm۶IFGGYb(9 !!LLL`h4$''SXXؘ\)w/R(x^222d2qFy|Eh{\\$&&RYYIZZ'==poNyy9aaa$%%?qqqƒxN"""鼼<*++V 60|(++E}qԡs &B bccl׮VŠPPªU* Mzz:V3ettn_RR` 55xPa:..kRXX؈)>p2bbbHMM%55JEOOqqqRVVFyy9c}>\X ]z= 3==V%>>r<lڴRj5,[FFF\LOOZi4hkkcjjJ~C 5 :rT*333roYjrBii)rD<k֬ Djx9Yg~VVyQRRBbb")))DFFβeˈ!9a4bhh 6ȕ1$$$PZZJii)JKK)))vt:YhdffRRR2P(0 ,^p$++8 #55|XUTTycUZZJnn.CCCDGGa\TdFrr2 c0?$WO0[^/Ōyuh`00<<̭*'ݶmZVn }BlXHKK˓{Oww7EEE^JWW111h4ʈK"11Q~w]RT$$$088Hvv6%%%$%%`ϙn'&&FJJJUZZ*_ǡ^[ntڵkq:FZZZ\ m!"őJaa!PYYI\\͘L&֮]Kqq1]]]XVIHHnJ^^pPVVF^^Z`0(+W$??X;83}:hL LERizYuo [޺U{.xF#RHD"r9V%DJCJ"!SR@w|}}/>>ZͶmHKKcjjT;'B\\Za !!Çݻ`0F!%%;w299b!//-[/Ǽ<4P~!?2~8~8pIvE `mmm۶` ::Zx!++KhIJJ"0<G!++kh7qLAw\ٟf˅ ?7e "]Ddsq8vػw/}X)--*A9a~~wzH$ B! <(?~f033Cee%`Tʉ'*Uix\3 V{^DJ-uH$,//V7'w8Fe279޴="y$-NT* HE.6|뛈'}qmMD'IQ=y\==>O=X[~%H[8>x^AWG"ND ri8@7?l< _&@w\޷Ai)&`0<1D(Z٬aN'Fs{ V"W|q>~]Ň|_st|o\zs>[T iȍX}Z5YUGmYCL;Kx^%pxK0qqqA |$i[D0| "& }Uލث}/{( y1|ňT?;7_9Lwl6d (͎PWWD"bHNNQ__O?QQQh4:::>ZV*{X=H__111'j466rZ8Y]]%>>Ž{F,|Ħ(** GYY]]]B!>9KmmmܿFFAZ/,,P]]M  66Fyy9]]]a!s<22 "#0<~ӟ233C(buu)>CyY]] J\rƅ ŋ8mJ.^.\`zz͆ŋӃR$PPP{qKUUW^ǩE&! Ü?A(..fbb.=R299.]_Waʨfllrʕ+p8]*ri^{58(555Occ#ܼy ###LLLpABFz{{Q(T^R__ŋl#iiiƍsYzzzznR)}}}\p5aT͛7inn+WPWWGAAPǃD"\vMhY__^{7|>}FDDDDDd=@aXx~:UFGGqqZY&''! Aݻj={ۍ\.gZ zt[la;(ɟ z~#FFFHKKx׸r vΟ?ϙ3gL8& q1N87X__Q^Y]]}n_~WJUUP\X,ܹlN>|/ٻw/o`0Hzz:'OD*233fȖ-[Φݎt>Q$SSS?X^^VUUOTTo!JYZZvp NW,8r&~fggYZZbaaFGG楗^"##qjjj8s QQQ) RRR())aΝܿuH[F\\L&p\cرc/fLv؁F9sݎ%// >ӉfcvvF__]]]oe˖ >K.ΡC6\LF\\yyy$$$PWW'q6 Rɑ#GF&|:66F8&??j\ϜPHoω'p8½Gnn.wY[[Xz-vM(G~^~e^}Uimme߾}kvy&vzӊ"""""""ϗ ?HJJbeeY\\deetVWWvCzl8N|>bQ*رĞ={2ϧ7n"= p466v %CCCBY~2@V`vv6fX[[i:4BּCE2 Bt ,..BOOQQQX,8 væL&C*nD 322줼e!'J`uu,B* frrr8uԦg+++/~AJJpP(HLL އ9rJnn.F_~p8Z&!!HSYY ,--=qJ$(++crr4z=lia(J|>_, ["HZ~ x`D(++cll챁\.G"kAF4X__G*"J Bs)._ʆ۶m 8qB#?F#CCCvvItt4wѣ &Vp#aoFk., [n^JHss3㗿%?R 0 3??Ͼ}0ڵ#GkݻV21JJJhnnϟ?2J(:::hmm2ߑMy Bdff YvJ޽{YXX^$ 0KPNmm-դG[[uuuLOOj~ G۩[{""""""gp8X,x^, ;w$??۷~INNf~~SNKvv6yyygm&o ,P(w# .oSY=܋t:bj1( t:$''333#v&%%k.a@. o j#99ߏNc׮]|>J%:*>QTeزe 'Nfaو`0jzdcǎnSTL&&!!ٌb!==D|,//t:9}4'<߿[q?~p8n'!!aSAÃ={Ǐ'77Obb"YYYHRN'r Q,//+bktTn'&&ۍl  }Dz#>>cf3 hZV+µ6LdeeaXXYY!553+UDYVVWW/rEq~~>iiiB0wSRRHLL$::D~~>:NUx1Lt:X,ƒh$++Tؾ};J"66^xA|X8`0ɾ}*Zjپ};nVˑ#Gp:x<RSS`7b;h48NHNN&::HLL$&& VVV'??zcF#۷-[-MC>ۈhNNJq:nRRRHJJ"11Qe2T*cccHR;v@T"HHNN={aNMM%>>ݻwVY[[dggcZ&**,#Hh4$$$w^tklݺB< {nlB jh4r z"""""""OAl6P"5yyy*ol6n޼۷o_bܦΒG?/ƳAܺuqL&vP(Z̙3Q_DQ"e昈ȷ ! iN'Jټ-O`\"|/s.HHRAۀD" ek*W^y@( _j< ,!!!~B7,m8ѣ߿( p8T*ET~;33a]&͓Mh}}\ Ǘz xD:%du%eiٯHt:>ZQQK$@VVR p8Fl7n,|>S=}aT*ГJܥR鷲]*>q7U 6= ]7gU."""""""">u]|)zu&""""""""""_W>SjEUU$$$ ܽ{W0QYYI8sssܽ{W[{.ƢViooFh*>j:;;B*JVjjjp8$$$BII vdN'UUUV1LtttPUUl(--l6z)((P(d޽{444J 444jh4%(kSQQQZZ#>>%nݺE[[p8!))i#222BrrOs,VqbbbPT477SWWG("**JݻGGGTJEEÂ}}=rA>⾙l.K~VܻwD,r\zF{ U ~7O8񰶶ښ`gu:˼v<Z_n8q_|B`yy?B`xx(aX ^Ovv6PٶmܿdRs{zz8z(wBT*_رct:d2V'OT* $&&믓\.G&qArrre?KKK8p@xU*466288HTTOfϞ=( _x}}rl6݂/LLL pBdbzzZNMMȑ#BNCPP rssM ׿fjj2^2W^&jjjhhhp;022»ヒD"A" ҥKrz=QQQܼypf]v3gZrF#J ~OxNNsssl۶4jH$_;K$DB[[nBs###ܽ{F>C\.#ngb۩y~n2DVz붺f<#lݺRavūJLL P ;F `dd%AGG6 lf)//gqq2Auu5v`0}f޽Rdnn`0j󱶶czdffڊfc޽ /cǘ{ƀf&d8@[[Zm۶ ~V\7{B!ۇL&QЃ f@\NRRdddH;о}7볳|'|ڴ>7@wh4277Ǿ}X[[8v/B0 deeV9ugvvB`ivE]].]"33  p;hZp\B滷aoR*>z{{'O355EUU#66` BR__$ǎcxx 455122BKK TZWVVhkkonn !!!SNOO[&!J C[n"Jd2$ n222èjv;ٳh! \II FB@V,..2::ʡC0dffb0xׄ}JdSRRҒp=ikk1⇞@ww7P(Djj**t6l0L&CTT;w$//"^yikkC*"Hܿ-'"_-ӧOֆE"~/Yhzӳ!C BfY0000[vckX__DDDDDDDD|H\ll,$%%adggˁHNN&##ũSغu+YYYk.vI `~~^|E, IIIx^N>-=,*X9sF}"birP(DRR`xd2+++lݺшd"::hR),--MLL 撓C~~>CPh7ė"K ``ǎHR Oʯlݺپ};GtHKK#** <&7|xaϞ=l۶mHJ"..x\L&HOO'%%Ap믓.Y.c28tfǎCTx}<,GPjٵkv^|E D"񰰰Ν;9rDGGkFJJ ?DR#aF W4HNN_DƉ'bii +CTuVքx饗غu+ ,lGxX$.::%77,1L`0밲B8&55UXfTFF۷o''' . ``0h%$4c<0@H޽{9pP90`Ϟ= D_<筈DH; ?WH2-‘qO"FϺ|U%xo2g]* 7}}}GEy%"""""""">nSg'o>1y}H[ȗ3UܭV+1;;KbbZTTD("&&tDwa˖-\."..TJII ddd{<JKK>'PD\T@EE$%%͛7Y^^&==NII ͨT*bbbhiiBTT͛v|2T޽Kmm-9Kuu5uuut:Z-eeeBbA{ff7oxHNNf~~+WB8&!!HOOߠ8o'>͞Nctt;wߏjERQWWݻw L&JJJшD"T*:$*QqL+9˅^lWESSRqrSW` 133*GgD6򰊻VbccYXXF#QQQQTTbU7/QQQTWW ٲe g?#66{'+geejo~CAAoW^v#HhnnfΝLOOsM^x^F#uuu;;+ݘL&.^r yyyX,t:sr9.Ks;w:tJ n*Q*bXXYYapp*++q:$''oggg`vvJ{{;r  _i ,zfxxUZZZ˗ikk#%%@ @yy9ӂ ޷Bj444(jvd2@Mee%[n׿5[n8VfIDDDDDDDDwEύz9h4zɓ( FGG1L>}Ƹwm۶q8XVhkk#sqL&g%s!Μ9vOT*޽ZFbpJ~饗HLLDѠP(ؽ{7[lnVWW9pFVKuu5mmm NFFCMM SQQ={ 9wNn߾M0s}?d||sZFղ̥KPĐnsM_h4鈎F.ىJh4N#99lv;III؈h$ ETTԦˉAPp]{.µtgϞBuu5?ŋH$Ksx DWZZJCC/ill!.]D||<㴷 sWVxhoo|O׎~9™3gpm)x饗AӱT*7 ++KXstÅ رcܸq9nPL_ZZʳ;SSSTUU 6@{2uf1WWW9w>ݔ/2‘ \r$''WW1vfffO/r^~e|MJJJBR"`YXX 33(fggF1++#@II ---B1aV+'N`l߾cǎxHR&&& HOOg⢰DRR,//zQTBMP(DQQSSSe;@UU{AP__Ncjj TJvv6ӹc4p-[ý{200y嗙 +nk{nz{{jdee E-[l5 III /PUU^l6h4rL&Ғ9 "jÇ#Hw)jP(D0d}}]=s_ܽ{DǎcB>tgbXdHRJ% ( Μ9R7KMM oB}p@ Njz{{ioog``ۿE*2;;륻.ݻnݺ"S[[ ttt*ݻw` **|>;wDR҂n`0w^l6DEEpLB߼L&#//Oox<̐L&cii VFatt$v;R,z'MOOO~N'ׇT*`0~m۶ %|xDlbccfhhDBbb"yyy 033Cjj*YYY\.H}NN^6HٷL&cxx$fffHHH`yy^E&33;;KBB ԧP(CT_ԩS tttBzz:)))BT**"0۶mcyy4~Dhd}}Zaw~xxm۶188Hrr22 NJJ ~ $%%a69dz6k5k.NEl6{n%%%011!}ӉRl6ohyg*HmAO"fٸv6p>'Y 7}vv UpRя~AT" RTT$=dffrԩ*GP?}#"O."""""""+ ].YYY% qO>vRVtD"f bxkpZq~IX^^h4nZu8fyyY(mߏL&C.?r|>`xRs~-JQT@YDDDDDDDDH$fggH$OFPH~@ ؞9 !/>Dg$z߿)}#b]DDDDDDD[D"a}}~pRby Bp8%d"%z~L&Ӧ~f#B"<"%fyEDDDDDDDD9rO[auuuCDD9Y]]jc}}̎r;̦[9~8NfffzB!gIdDZeDDDDDDD/˿"JFѩdJ%>W [nINNF"0::nSPP@[[x^ ihh@T *PV466h|n `JIIaiiO>l ףP(޽{ܸqXA1fqEY[[?`0bJ^/IIIBPZZJuu5:Nǭ[w[nETƭ[$%%).]&--YΝ;GSS:ܽ{9222k1B%LLLseeMQlyƍtwwFrA֭[TTTPWWGTTpׯMbb";wP]]M8&!!D6 ˅^=###LMMi6=j455Q__/(099'|"xG0ܺu1a-.. шRjr/2gz*[lrsjjj0An޼IKK Zŋ9p9811+WrQPP@SS:իW޽{$&& ߧ4 hhh8}VWWQܼyRRRh BQ\\ TVVR\\Lmm-R.S__OQQPhp8qšܸqRRRY+r uuuTVVR]]L&krOO/^DNMM zir IIIpp%jkk'==*^/ p |>d2#̟͑@mm->m۶Q__O||<ќ={Çs-222j|ᇔs$ :2k׮ /P(6腅LLL`Z{.z2߇չ9())AѐmmmBfIse<磬 JFF`[nq%ك墢W^yEWWWO>!''G~:ܹDj56[nq1R)?9tH$hmmeff#GGuu5/YYYs9<1uS(d2޽KKK 8N޽NC.1LJ NLL b騬؇gz:::0\rSNqeINNl6S\\ݻ),,d2D*RQQCtFR}mt墤V İDoo/ aIMM}$sSSSjkkBaa!$''#)))8ƨeaaR;wxٳgÌ399^'66N8L&#@\\ͬbٸw999ܺu|ŋ۷Oh񩮮& cΞ=Ν;ٱcVK.'OFVVVKYYNS;w;wp"--bCEE FCtt4zb^|Etww gOOܾ}Lƍ78r%%%$%%1112۷op^gggo~K/ĭ[HNN&##8***HOO'##ckFFFp͛dgg .]$l455q nwab0 J%qqq055ETTϟ^yyy9  jT*T۷祗^Bzz*2\.IIIB!.]͛79vz{{EVs=jjjH$wFW^yDB}}=E"EDDDDD_$@ܨwl߾Bbazz!N<\.gll ̉'ZLLLPWWGRR[n%xF:::9r^dzCԩS,--}2KD¡Cزe Jшdb޽( 0qqq=z@tt4*<ӅN~? ::(***Eqbcc,9<(fDgg' \Jj޽{vV+رCF*++EPJkk+EEEAaSJz= Fee%cccF>&&&vDEEҥKzRRRLMM -vm68Bl6 UUUh4椤$mۆh4hii!** G]]&Uϟ5NHIIAs={.\rZ*gϞEPEyy9%%%8N0X,222HJJܹsvl6W^Nn*_!'NP^^Rp8࠰J޽ ävl6s P5u2..JJJ FٷoÏK^p8l&>>VNc߾}&/bXuFGG9tǎcffť%^z%1̩SZ$&&Nrrc $$$0;;+Tuݻw;v`2SH{{;hZJ%IIIܼyQQڵp8L8&>>en޼ISSŘL&~btgbccZ,,,>.T*>zlg("?ϒp8Lvv6vZJJJq]<Z0hZT*zݻwuVDdeeP(Dtt4r={oB!1BT"l~{mmϓǑd|>e@T200@QQg!T*_Ϳ7l6t9s_J|>'? Nbb"&99N YYYzzzHHH`߾}3>>Nss3 ѣ~n7d׮](Jz{{cϣT*!11TJ  ; t:9pYjkk!**P(!T(¹(JEs"\.' JRp^xN';v@#ֲm6e&&&%++;wd">>FCzz:{F####1::"\~ezzzbxxaMbqq&l~9z(`mb\DDDDDd%555\.yWx饗0zoN(wvs~`z Rz P(D__cm P픕Mss3}}} xhkkjfgg?#vލ``0011˗q|>ƒnݻp):::(--J룲@ hdvvۍFann:drr/ -@.^D"!99yø% D"xeG8#;hnnҥK,//#ɄD2䉉rt:F!::Mn߾ٳgY?^\.gzzx3??ρ^GVo zGAA1??Ouu5466ǹRD*2==ͮ]DPl63;;~ѣ( B& PR8qJlfMƿDO>(~\Nnn._k]]]S^^gpp˻Kzz:Pr122ArLNNJQQ.\K/ 77>c.]B@133eɟ  t:& %v;ɨT*R)ì^'55RL&^/`ttx`3xA|2{effg ~\\{¹vu$ On^;(r8d2vK.ۋL&C&1;;9wd2ƈ'ſodm޽ c!'==}\,DDDDDDHl6H$,--zͥF8f˖-`pIMM~ ")) FQ P( noH]籴$ uvvt:ARE0jbXd}}NGnn. JDfffb}}2n!@b4RUt:yyy8NFFF0l۶ &'%%aXm۶RcmmtqkZ4 XVVWWH$z!)Z[[O~&)) 0R^Obb"233plϓZll ziWضmccc͑Hjj*n%RRRH$,//344l&33D0ܜPj<11A||< bj|>R)_80$$$0$ kÇfJll dx^ deev /ÁbNGrr2 &R,جİL&d2144`@"T*1LBjXB D"!--dFFFH;K @R/kkkTVVrQfgg{7))@ x<JlݺJ.(2334 ax299@T` 3==-̡rP13334&-[p8Qp8LYY۶m#55uoo4ڧq:(Jf ?"=?nڵkv9a$oKKKOOPɩS""_wX.""""".gD"}ݎJBl⋌;& Hzx<L&3=FpAacsфbp|U뛈7DRt( ""=yZ"u_}i<#Yoy"r>7+[__`(zH_D{%M-qzLE~DJ~~oOm[*>X[[{affF,y.x^f=6 +voy<+/5*n7øMȷ__?H$n7XVjjjy&###Vx<;wp8LBB555\~MZZ.\ j_rV+ׯ_@ @rr2@ 4;N\B]]婲NnBR[n199Izz:|GΒp,DϥKZf|@bb".{F BJKKY]]%55Ux\. {.:^ϵkרTq199G}*LMMH8bp9***%33\.qޠ2XZZhPdt:|2Ƣj}6%%%\.bccq%%%TTT:/_D$ 7nl"rh6fry`||o~CttpA ݻwjߺ E `}}KUB0f3MMMQZZʝ;w/^Hss3333rȠ!r{V222B~Hff&nzZ-ddd JY__Bz{{h4288ȵkhnnf}}АnF#N4 ,//c۩"66w}{ ܧ0>>Nmm----ܾ} \z{ۋh$FGG"׿5well ˗)//gxxdVVVhjjbzzZl)..fǎqEijjbyyn k"%~"]]] ˗ٱcr,:4' >wJRpwرw+W^;޽ŋ$99VKUUnCQQ8Nbcco~CJJU>C4 ܺu2VWWIIIy֭[ܺuR 茜={۷SUUŝ;wls5z{{IJJr4 #"""""8Bcc4χL&{;stNVVx<… c08w o&-- FG}D]]gΜҥK B@yM^xjƍ,--NII ~@@peP*1==MGG/"^BbO>СCH$ZdddNAAnbϞ=QSS믿֭[dŋ8/_L?#99F른#G Hxwx饗hmm --fgg9rܻwW_}m۶ŋ9z(;vD"JHww76rZ-2 Ctt42::hΝ;Ree%---fyw0LhZ>E$z<GEZ[[X,oreٺu+ w^ r9uuu)((8M&vN'h4p1IIIܼyNGFFEEE|>x :;;{\.h4RXX  8㌏sm' &b(,,ĉr)))fmm[n;þ}ؽ{7P1뿃nº}6&4 p\x^f3z_uVp8q:455տ";;Jss3477Gbbp ^szv;|8Nj5w%66z>Luu58p_Wr222_;wRPPyIJJBR ?99Iee%?fdd3=sYn޼ݻ?)FSN -^z@jb6)++6cccݻtwwtww `EEFVVVp88N~?.SNq]z=CCCr|444V9~8rUGZZ] r ;wIFFFGRRR˗k׮qi]IJJ  jkkbpu:::7o[oQPPNdddr;۷Z.H%;w2d3>>ɓ'LLL`X8x VI!)]EzzzBh4?sll={p1v*H$ٳՊ\.'66H~~>2p8LLL {%cZQl۶mCV08Gl6KYY%%%hZ݋Znycc#PܹSx VQRRĐ#\DٌbR [nW>rn oh42>>NCCܾ}! bccINN&sٲe \zERPEdee:Uaa!Dll,kkk$&&m6A=ֆlfmm;w`X6ؖ}H$p}lقl^ AcA%ʕ+ܿ1vܹaQIII!;;^Omm-`377GZZ G@]]===8 A᷍+W H0\xV&&&ؾ};W\a~~n߾MQQ Il6d2NIRj5VX∍E.300@qq1DEE+rGD"2 Faaͫsx7xdeeY__' (rG, l߾p]zzz8r%%% sqﰰ;wX[[^r2t:rssIOOrjA366 R$ ;v &&f=ɤFGG /ߏ\.GavvEVKffS>9Wر;w:iiilݺUXT*jZJdUT\.A % ߿-[ ioo<߫Vd-fGr X`8/bx!N'񦥥??G.oXg"m>v"!!Z-U|zmX,۷\J%mmml۶ %ßjٹs'gJ% ,c2ضmΝ#}vJJJcyyrvsl߾}mh1xx;w|dDMM +++H$l6qqq,--$L&>BKKK2334Ʋk.Y[[w^rssJh41(JanjJ%*Jnzh4 ** /QTڵ,,,299` //qSSSBOOR3g1͕Zrrrt,..î]bll`0kD"ayyYtx<~pDDDDDD5m;ӃFa``z0ر~8|0,,,%9~,,,PQQHȑ#ܺuVٳI B? L&&&&I}}=fػw/BryyL~a٘"..qݻ ۶mwwӃjd^}U!{c0EEEQRR+BLL }}}N4UUULNNr}5nM 8Nd2O!)x`+ g2 \Nnn]XYYA.VH$,-- -6 * RHOOtu۷os9N>-+ dBf Y2RW^A ϥ֭[=zFO__vJ#͆G*b9rjr}taN8:&Tz{{&˱Z+$* 9GBعs'VR^}U:: d2O~B[[;vx*-0RSXXT*e޽l6jjjl$''[#>͛7Y\\dyyz B!=??O[[ p8+>#jkk9yp[lAR_E].s p8r㏉\z_,// ۓg?jbXH$ڵ_|?\޽{W* <ERvލD"! RSSïkxWqGL&rގNr_466rmlzf2jJTT'55˗/s a8vϟ_W~?? 66VÇT* T~[ z'P{nJ% N_fbb^zgϒiZ^^trp8Φׯ3>>ΫJff&׮]-[lSdgg sh4b?9ӧOsM~122BKK .QxWILL?ܹs†|fƍ{nl2ׯ_Dd2B0Ntt4?lbbbBxz%4 ZVI dffT*$ a6f||\ b~~E$ -..q&LFFFa|>r-[rPz!KsvVY2==8PJtt4###ùB`ddCrr2EVEѰ nG6 Z::N&&&hoo'? ^ՊcbbTN#66i~?LOOJBB0'n5bccevvV83=="B&nD"n3>>Ntt4)))H$2 ))Isssfr9X,VVV0Bj @*>p8, 166&́@ ??o~FGGq:$$$`4 \N0d||\xbbbXZZbyyJj>/%%L Պ!!! ="6k111 YH5 q?vasdjjL 2(v;ccc뉊ĵN'n{CAzi||NGzzc">Xa-jP( U~#JY[[CT RH >"lpOKR\.X^PT*ZH$|,..nR)6Mh  Cz# 1::JBBr\lTInnłRdjjJX,p8"..D###|>T*A"=f l6&I=<>,HV+ᾷl6>̭ȵJHq:ba~~"0??/\'Ľ *V f3 8N$0Q* 6Gd\ÅJű \DBR155n'##[!""""011!}ӉRl6oype߶/H$*k׮t:yسgfp,>;;K||^8EpA 33^zKeP^^N(B.so]pi1ڵd2/} <bϜ9 pqqycx<t~~ <~$ 'Nx@DDDDDD2-]5׋#** 6K$JF=ϋȸ#}O2uW9N׋%::]H`0lZa8aY BA(~ח=T*ZX}SH$BYߞ xy5rL=|lk """"""lH$#ɞ*@n`[rdܑHMc}u87>; }|}}EJZ_|d btG0dqq(|1nVWWt255ERR  KKK$$$0==M||7 p8Â7,`XxRSSh4{IJJWt:Ǯ.~߰gpM0䷿-l۶ @PjtttpE߿OLLSdn  ;wpMFFFdaa{)rssYXXҥKTVV 򕕕|G N 99U~H0bp5ܹf#==]xPs:\z AŋJk׮100@zz:{8n8/ill$ J__/^GP[&ֆl|*UUU|>{=VWWٺu+ZMll,ܼy OFFcEp\PRR`rNn v_JX[w2㬬0>>TΝILL@ (Jn޼lAl6X,\` 55uZq]]Foo/1<cHJJpEjjjH$O5{p8i|>ׯ_DH裏p:Q__^ڵkfʰz_N]]& Lqq1ׯ_gmmMpAy".\@WWsyRRRXYYŋ Jbppw}]v1<<˗ILLBmۆNs100@FFkkk?, fr\"(몈W J%TTFQ r #jCee%7o$11V'|=n߾Mrr2jsq}N>'|B\\qqqrQ:::|2pGtCFF˴pȑ'> ~|***deeaĉF#\xCVihhj V7nܠ={vwoقnNN/^$;;[Ap:tTZ-29D"_p8̖-[ennÇ388Hss3gΜax<kȸr9z E"PSSC}}=]]]dee188 gllY>,حjƍ?X,vN6MpzaiiQ|uuV+MMMrVWW}6n\~#= Q\\Lqq1dggT*zܼy^xùsԩSO~9tMMM#H{訮bժUra, yyyB!*++r٦&B$''saF$$$;Osed2Ν#%%^OSS˗/uuu,qO__?~`׮]tttP]]),, ~?۷okrYn&:jkk1 [\!sП8qtvs=ѣGȸÌ8qĉx<$&&nZ-jZ hK:{WTT`4D"֭C.322Brr25550<<ӧ)--@g|x^ʕ+<裟='//IQQj DBUUTJVVzbQJLL IVV:1g6KPT"dggs)ߏZ`0dPHܜ]xsΡR(++j4YYY9Z233裏8t\~Ƒ#GSH$Bss3ccc;wZQ_`OvAee%mFYY>ׯ_gddӧOsi9s̜ħOSNq9gxx,X@$sq:L&CVMVVJSNQ[[Kvv7.z"HD)//P|ǏGrYvI~~>.\ʕ+q>fdd{~zjVl6xXlccc444o[=>#&''QT̟?FGG1Lۿ$''yfR)~{4Vn߾l֯_F!##"كjTM{0رc$%%QXXjl,YBYY۶m#DصkӜ?sQ__˗tj*˩aѢE|rYx1 .ŋS\\)++c޼y,Z2*++1TTTp(//l6 #T*Y|9GbCnn.;w$ &?)) E\)**b``]vQXXH}}=׮]fրgϒIBBǎ#77+VP\\IIIk׮Q__Ϲs8w QPP P*˿`(..e˖Q^^ŋY`,["/^FztjjjHJJlٲ zzz;Bl޼yd2СC S__ONN%%%yˣ ɄD"nzYt)555388ȼyXx1NN!===Mĉ'N?#A_1K)ONNuVVXAmm-'Nfb@ rZZZxgQ(tuuիWioo\t;zپ};<_1FFFذaW6*XOڵk?4sQnݺ˗x"=AKK vv=oAbb0_^Ԋ^SSS ϒGwwu?1xLx RRRhooS?6̤MFF%%%p8DsX;$s!V+/2lڴ6⠱&Br Ξ=KQQSSSLNNM4%==`0HWW/ѣ#ˑt:P՟ˤ0r nݺEss3/^v??"Hx"gϞ滶 FP(D$!_$ Onn.:^׋jezzJBXV ɾAt:~=?U D!nSP(HLL cڵrJ*++QՄB!~?nNGff&@BBLOO~h4*A<P]]cccXVX/R=r!h4$$$RnR(**"R(t:rFt:f^dh4b00ANh4b2rN:EX~ҥKY`03DŽ^Μ9SSSܺuQ}YE_jÁ-;, LNN255Eqq/:,Ķ0j@Ӊ+6>].לԧ``0Ŷ3lڴ D[[)))$&&@H$bajj4RSSY~=?O(++ҥK7dddȹs裏y&---R10{. ݎNCt:E$e^}8qĉ6DR?4GA3|/~U7o>x <\v+W`X WAAcEOSRRRt&+W?.,ZA8p>|7ŋq8388G}(/^$11'Ot: yf\.ׯF~.\Ν;`||A4 r)Ƹtpw]sαvZN'Nb ϚQ( ?>t:L&j^OffhN___Oaa!TJ4ET"3;R_~޽{grr'OvJTUU-jcK,@Yz5.\`ҥܸqLl6*Ꞧ_GyoΊ+h4H$q=onP(O?ҥKimm*kr|be||~Z\ =n{իWcZ$'')Q8?v7nȑ#,YwA^z%ŋ,YEq%~_ z'N8a$6M###t:222D-#zx^jF1dffwVh?887 Qm0#VEfAxbZ ͆V%022T*%;;D@\Nnn.^JFaddp8Lvv62~177ؘr\"FJ&%7~YFzE{łj?Me,Ys?ZhTX,n7zc, &iN4FBB0 LOOdJ$d2~gF9zx<9‡5Äa222ľD"vL&}\.jb2D?UǃJ" !Jz"cccddd x< V+A|vv;FLngbbBK>QQHxP)|> ?JJ 2H$^}D$AR)`iDK4 @ jcQAnc0D0::Jbb"&)zbGGGdff244D$ZlP(h,l6`R)t:<JP(̸8N<b^j$|}H-b Z͆dv@ ^n5NSlC˅Jd21==NZ-Z9B*Jlq/c*+kOLv\T*]~n: 244DBBRTXiXVl6j~F#G{=XwD0dxxX<@J8&&&HOO'!!@ 0 n7SSS 1g2_1A0A\ckT*eppVKzz8ArrrĘ(cccs2qĉ'ΟhDDX @ @bb{ _'?]˃>[@4 'N`ѢE_I: _1AA#==[Oq2[@qU.]T*So&իWjƍ466"j7~7h4ʹsB"Σ>mkAN:ҥKu'N8qSSSb)qH$8NJ%j[pf : G"DWU~DfCףP(H;4@Gq`0HBB·#6Z8qĉ+MKK\1se!yĴQߵR:;wUS*>Fbo?1?3N8qĉ''|}]wr\dH$?@;i>ρW=>=zT*Ɖ'N8qn0;; ^?"Kr?^ۯE+lSO^Smy팏mMnckv{!{}Әn?*!300p_ ~vIp8"1ηbsv:Qn~ng֏۟;G~nIm~'N8qr?KIMMĉٳvկ\:ݻ\R~m,Y[ndB?Ϲx"^B$ PP(Vj{qF~z(  b߾}twwSXXb??罹q>N:E  //'O?t񾣣g?#//L$!11?GbX(**ܹ3gΠjl۶Ç3|T*'OdϞ=ܸqCLFyy9nW@BB>Ǐec4ǙtclQ>#JKKбqhmme۶m\pDt:;vX,233ٳgGbK.uV>#EEEH$n(޽{qbۍ^gv~߱lٲtKg˖-Xsk]G}$d||seX.  ,= 3rnoo'33S4h4wdΝ?~Ir ۷oʕ+100{ǹ~:ٳcǎrd@vvgu||Jzz}խ[r%1*'ػw/SSSsɡC#߭{k(b|eʕ+lٲNll޼QT>}OO8qĉgXf\.z@ @$#=" d۶m;wz֭[;w7|͛7SRRBVVǎϾ}(,,D׳}v{9V+򊸁#GT*Yb;w mJKKY`innfʕpE(z@mm-cX"p =䓔 Xt)Vߙ7o@722ڵkIOOGPd._E&q)s1\ҥKˣ)\.?8 ^yxHDرclnݺիtnv;{S.k3gXr ߿_~fjkk9s 65k3BDGG7o$//M{{; (J Yr%ǎ5O>vmallG xҥKSOqI&&&<[[[Kuu5۷obc`0044$NtRf3s͛7y衇h4nٷo`Vٿ?FJq\UUU|$$$^g|| xGɡOdggk.1]x9x =؜mhh[299SO=ECCKRVVtp5n7R^z7nJzzks[ZZ8\βehjjbʚ5kˣ NǾ}HMMeZ={۷ߗYWIVVX,***HII! ªlF288HFFEEEt:, f֭whR)CCC={J@;o޼Ioo/JJJشip8̪Ulٲ^O(bϞ=ݻ|1j5.]FΟ?OWWZRSSٵk@OUUNfݺu?&xꩧbbb⁎o"v"))^xh4y'ܹsNʕ+^z&&&hmmeմVIIIF[[/^@ @OO/ԩS˩SPT,^&ioog͚5RVVVe߾}pBVZŇ~H0D׳sNQx 6EKK ׮]6q1(W^W/)HNN&77ÇBaah)'6B!FGGbll VIIIm?22b.Xr%RNQK].b^~ߏ^璞:;;a||={t:HJJ{ Laa!޽q^իzjfΝ͛7N7==޽{Yf ?0p6֬Yf6|>rvXN TWWSVVTTTP^^"RTT'N8qDQ<GL+z|~(>=MCC DQ^/~׋ٳ\vfyg0 Jff&o&?y&SSSwWՊޤRyyꩧD SH$//0ISSϟh4׼kܸqAss3N?&@ @4%11kײqF]F(9?44kFQQ7neddWWK\~χʕ+Z: dggSXXHAA-Jq\^ 33,1wbVrRGgvٺu+<tuuP(˿K"Y|9 ^z B0999tww__255bs׋F!??_4 ÄB! `p8|׃/!55RIZZeee$''p8tb2ču^^yyywix'8p rVߏ $c\Nnn}jj N'|")H$At3 0??$v;F2ˣTJ  ;;b((( ''C0vvq\|>()))s|Bx 0 @VV\~t:G.Vh4eR3H$qL) n72 ۍh$//TA ev~A… ;wrٴi+V 6T*aQb-[vG|Drr`o,&33^/P#3_LL&UUUv_.RHHH:v;SSS|>222LVV& ׋nݝ233Q(9.*v&55LN#99VnA QXN'6z=6 ˅L&?C'N8q@ cXZXVv]{twwT*1L89Nc\zT*֮]ŋjRTTdrrP(K/jȑ#8Qy;֭cݴzjQƍiii!;;zcǎqUVX ޽n3,X0$ mmmݍD"ARa4ԩSHRVXARRk֬d2F7osɓO>Ivv6׮]7 ߻Nh4w^JJJFCRR B{.]Ν;bPPPu똞FדNFFॗ^RSSw%'' 2>>N'oj#G0>>NQQɬ[N]bلi˪X,x^(ɢzH$h4^/VU߃ra0LNNh q1-eLfL V`0Hzz@]jӬDt\.j5t::)BJthR"6BVDD*$B0D*N @PVX,D"ҐH$ 大 2'''z=d2RSSQ(~B?*Ys:t:R)iѯ_ 7n'? HD4ZH$j5F("%%i^/xHIIncۉF Ʉh$ zIHH NNNILLD"055&99YqQ0z8J%z^X[d2~((A,8b~pAkP($ Z4 uD(0ơJBVh481&L&9\.4 G¯}|x<|>QskZ s^l1CbA }>ۍZ&: BӉ}\ H~:}}}wwD" 炘x\pN:ūhDv2nJ%) CB!Rh2{d2xF!Ğ۟'Np-6mڄlFT c0ZIznsn. Njj*Nh4*'>~? O~ ŜAP(@urr\N(7h4b6rZ!A&''5,6/a Ɖ'N8qvb9{ _'?wgt:9|05k3[@*-?bE8ɓAU^^ׯ4H:nݺEyy9W~f $f͚?90}}}^Յ|p=zΊ+>u D"bqXvxt:p<:܎'N8q||)z;77k-|  rDw ӉJh7&/k|v^C _U8 :7Y;iLL+UB>PpDχڼ'N8qĉ]&pO>E&bf( 0ϛ H$w]޿_bEiR露Ŵ0^XcAm^$W=cuJbП1v?TJ88sݺuL1'V{ɧnt"000@ff] bF#hZL&999_c劵gۄD"vcZF! 288HAA}?nj`;~׈F ~FGG]w;ݍ͟5a\x\rv`ۉD"}߮<ۤ41-h^^]]]311ZF2>>N~~>3=='==>pz+gͩMw[gn3O|c``1***$--@ '55[nQSS^v~ucu>^续p0v8qĉA!#:ѣٳrss1 8?L{g&&&(--E&qE~_b x8ٳq;PHt|2۶mt|?"+ iooI~_˂ c֭:u Caa!Ǐ緿-餥3O p8ۿW^sر#G022Biid۶m={N^g߾},\JÇٷommm000/K\rDhd֭8qݻwSTTDRRXoL&VTs|gol6ǎ# _ Fee%n̙3bT{rA)))7==iy6>?_|tt@ ׹x"^k6qOMMF ~!'ObPRRT*̙3l޼EݷF<5Ann7 pa,Y2O5Gw,o>;ٛٿLj}wzzw}ŋP(n!ç^6 ᣣ߿"8@NNhX}ugg۷o'vX6f#NB&3~SSS8qS\\̅ سg8vvvuVΟ?/>۶mx5V;w$sRSSWH^(GLvv@CC)))۷|.^(Z;~8yyy߿ȵk$11]vDZcLjD"L.{=Q(bz͛7y9}4 ɾ}8pCCC;Css3999D"ob1UmƉ'g3ΝcddD<$f.oΡCp\&))!IKK?$'':1[Ȏ;hll$11̾}Xg?ߓlݺgb4jl޼'NDbݼ{a4ihh`ǎRPPf7 ׯ_gw_ D¥Kزe ׮];Ù3gHHH8qĉpF猪 d;U*˖-MEEǏl G?ǎ#-- RΝ;GeǎTVVRXXȡC0l۶KRQQ!-KRjkkq\477rnFa={\NUUHv֮]D"!//"oβeHMM ۷vjkk \|z*T*,Z;wRZZJRR[labbe˖QTT^h4r9/_T*_`ܼy6x 1TUUEKK =Zv~z=[nA8v 466RYYIgg'cccZiY|9 PZZlСCsqoGb0 tvv"ٳgV+CCC(Jnݺ`׮]dddpYR)SSSNS ~H$Ç|2TVViN8ڵk޽Qzϴ*M sl۶K.ɵkhhh7ok.Z[[̤#G >lpp>+W`6iii Q\\LGG;v젻dΜ9 W\!>C\BRRfYŋٵk ,&(9rDƷw^:;;ͽ60[@?{,* /~ III:t3gΠVimmѣ\~p8LVVxh4J]]bرc$$$Gjj*N_΅ F"pa^/>({%==:Z-G%Kµkx1L,_F+F9??>ILL͛޽qfqmmmر7nMWWx@V18p3gΈi9;::dttqd2۶mcrrP(ĥK(**jFGGEsIGTb۹x"YYYnݺ(###r:;;r :{!==> ::tBq\B!ϦsU-ZDnn.G!--#Gor gݴݻX,,_RcӦMڵZhnno~^y&''bٲeHR^ʺu:t'N055E^^gϞСC {3<$ttt`67og'N8_*_D@*+VUUq5v;VB*211ARRyyy$''3::ɓ'%33Dc``ׯ3>>dΝlj S[[C"B R߄顴T<=7L{}}=TTTF`޼y466ed2yyy &AnܸA(ڵk>|XԮ3j5l޼!rsstsrgffRUU%/ViooڦV+]]]< ٸq#7nMee%:4MIMMjf3Nn&&&vsi]ƥKpႨh4455q%]ٳgl3==MMM VBV˄B!,Y"jT*VB$ 'N^R(.Zǃb駟#p]p_̍~aILLOr;ݻw}RSSd޼y;w7nw^VZs=NC{1A… l۶ NL&cϞ=s]PPY|9ԐSNuV A7Wbd2Ƽyشi/_1LO:nܸ+a<3byf\L&Ӝh瞻=TTTw^ű$Pb~h4ڵkQ(LMMaXW0j{R-f^wZG}|LMMٺu+ZM6DbgǎA^|EqNGVB`rrIz=IIIXVN'hJʼn'hoo?|L&׋L&ȌF#YYY5vzL&l6.KxkXN=SPPdtv$$$DQQzj~azzzjbp8,jbT*7 v']<(d\F#Ojkk)))!p8Zf`rrR|ĉ'N=Mz-hZ֮]EsM0<3,_sU^|EMV7o޼{olzʘ?>>JL&|L&6nȊ+aQH,n7ZP(En$jo޼/nGTdΞ=d"AjjjX,FE2h4&''?qj:D^rl29u$''366ƢEd2QYY)7??N,/j;;;$++ 4R%Kh'RYYy}m`\.իGGG .T*###\z[nQQQAmmx hmmExXhׇdB&SWWGAA~0K.E&a28{,---,^FCGG:MMMbL xAF#/^dj|>Ch8}4 Ɛd%vSTT4=n"8_Ο?nFFFXhSSSx^f3dddP\\Lyy9ddd022"Z,`zzzD?mKYY]]]244DFF:QϟOGGUUUrn6oތ`fxbill111Gt:ݜ9"6n܈J=|I9{,W\aŘL&~T*]@$ ǎ^֭[Gffz),,‹DM}VViii\z())̙3更EՒ .2^/MMMAy˹uuuu 6mڄFallLt̙3|r-[Fcc#/^ rlގF^ e_Fal6N'Z%KDB.`r9Gazzgy06r|6uvcibzL>==͛9j( N'HJlt0sń&KVV {y^z=`AqTXy񐒒"yF$Sh4*߻_˜B~?j`0\.#A`llt(PJt8fjØ9bz nA@P f`0Pbm b bx&\.1uLh|T*Q@s8d26M|4ɄaZ[[)++C.r0͢ud'==+VՃN/R)JOBBϥB r$&&yh F~? `2tf"Tp89$ ÄB!Q;fA[?bϠĴᮖ8@fqj9=.<ŞX`08g>D"8r/T*5.v YsjlKRjv֝ڒ\.'<狇"6M<U*k}z#su\߳GT[bsYlNN# kzl Ibal6J$PTbS.ΙHqĉdppPߎDT8ǒlOa]biB!gy _1AA _EvZH0$D?Ӹ=n$ ,knoL~~>`nYj,nH*~SS]lzХ'N8qƗ"OMM19=9ŌTKdF{Ҫp0/DB@&!Wȿ?hf4Q! &`! P+P4_?j9L*"J{}cB" Hr Q.-FpoRT $ORFH9KӑIe9=N8qsF"ර1iMhwZ .2#-Q 5rz4231֥c;M!;@DPC zs;*DQ/8,6fnESH 3K<$GF Q Edi83q+qĉ'N8q9D/?.;t |w"/ƯA3C+q=_ӁiQooo0)L8lA#&suB3" ß\JcA"NC%S}q r[3N8qĉ~r|neSf`Rhp4,nd3fRLA(1c22$#AR)Jٌ_o캢I䓗\*G&?אd(3e3R!B$:H)S"H ȥr)hH< A&" |G&EB( dҙ1fc"(d $*0hD\*'eVJ?_8F%S!HD#sWܺߍm :~[}o%̘~L?D*A)SΤ!2L{#AA@%8Fc/T\*'%:WyyC~&_p!)(eJJKUh3i܇ofDM"7o~3>O\M.kzdB9J3TrՌ9~4L(23?͞2 LP\3ccaB[3G!S̩UH0dqb6l?dxa)uu8N6oĤ6Qh_a?l^~\ǹ8| Dx9ʒ=lRǛo2?,+ĵk9cED-c3y M(oz4 7qu*/T@VBao ^x\ͩSNZk v/2|a@6lmJiJ)?Z#}4 5ni祪Hӥe~NdmU9P_TN(B-WWꁙ D"!"DrMC\e3S$2H#ȥr{7潁Ymf5ʁl,H)G!/O?}Lxu -7m7ձkNiT ;p} mp4L4E.#AB*^⧍?t<e3vdT^xyx'03bc!v$AB(\IJe5x!HIe#~fx8ǂHK儣adFqP ?>DhCJ{;bZg}'}3}dɓTTyh^| TFh3,xeLj)ܿRV8No:+0dpco_y!*Pd.b}z.^0˟G!SQG\c cavwF)SB \63W2S7T6s`ˋ>kLI"}|p LAT~|߱v];u1 gJG_ LL/UD6 WG}hT].vwGxI6ny9nY'N8q|ǹő\2鵌9X$MFceIeycpO4s)TܰrTS闼{]d.aiR\̆I侏=ΨkTҜN:-;jk9:C*bƇz~4Ă4&@p$0 D( nLs10Cv^x$m3sqa?F,Xk[Xj e23y *r\~;ﴼC0靜SgT_/k4r ra0\`3KU/ H8}+^d=Nd;$(84}/To&֡)8YG iݫRt)dOLZky /p:={_y#a 㙲gMȥ-h-m[16o-Q!ʑ#(d .}L^DC(@!չ:~j^-`eJY$m/X,\Dz+z Iao^/6+zLN:,7lTT!vIq [yYIzucY24 WǯK#ߔ雴MTSȤ2N:$k9V嬢ifo ;Wǯdɓ4 5֥XMe GiOyy)xo|Hpos!D?tG#ؽvޘ== xUA7W ,^?pajRkHmml,ɾ8JKDK/GAd C ,Z"`xyTro]z \L*#Y?`Q"-|BV15&x]Ős:*RTo[wMkYm8ĉ'N8q45<4aAuj5:@&׎e浑McM-LyfrZ L&cA%əZZåKD>@&[ӷB.} ]RNk'p*p3鞤6vK;)K&ט˄gze,bOr )4RRI1Ǩ2M#8|~{?N.xLND{:PREuZ5]S]l,H61dr577s1/uV:3ag.i)΀Y)40k̤Ҹ0taNƞBjj(0N3aBM&טK1 SsWcR^?KD+^}h4k51¨6x#L Y,j'=hˤ>陜94T*%ߔϕ+8}N&L'+^:\ CqFq]$k0F*R`*0c֘yl3kw$H8qĉ|%JM!ה4]S]K $"i4{;ry*Dy)ayrMM=O[j0WƮ4k)Vca9L. wM$K"`$ν"!Rxez{zs~{?^yDM"U9saV}LN@ׁ/] & Og^ϋ/e?y7p2q;vSRGթd'd3!A@mz-Q(S3=NIb /Tw1{:Zkpf Q, LGyQV箦---|^N:k5Q\N]Ígwu똟6}X{I8qĉFbDB"953/o+nH2L৏iZQRp+SFB6 X /@b :dR{& c1х^ Q *0- UhKD΀s(߱M4̘zAt!ANC.# IeDQBz~Fp#HT H"0# K%R JHOȃRD  Ds &HŲ!ƬzqFg 3?֬I 4/m9M/.H)t"! jŌpQ̴!@rc9V5H3QA7jB7% ȐbY2z/GBJpDॼ8m9ͤoLF! c:غ@!U* ^{;E.rE&Id"D#3-R9p$N3/$i(4nIR@-SgR}<ggEBha?JBC 򢒫PT"!R)?Yv`9tw ʌe8>z\!pTH"(2L0*Ru<&3A΄̜q@$L*C zIdhZ LE @РH$n8onBẌ0QhP<8hɬYIh3 *hw ̌eR7% $s jsdz ӱcl^|~q|.^53z2XƠ4̙?o'6+ $ ΀ gЩt#3V s|D0 3cWʔb!t ]ל8qĉ'η,|濣P+xtT*ILL.F!/^XßDdtu@( 8 Q@ 5#mߎܲy"{v.j{>q}s E)S0$A~wDPޱI;) IDo}_|fYOz~B= a ހo{罢3?CМ1;g竪o8c Q<1q((0Kfbgۉ?2>>ē9sTtkNs۸ >X*&D2#0&k޾QIDy,LxOOă;{ܘ ?o0 bÔk~(3~f~XK!rǼx͞o Ν#|X`{^Nuysj8qĉcv t۴&Z~mAkA IIcU(9X!;Sw,gvۀ@"De"ޯ zFp)Ȩ0TןIW}eb}UO8qĉ'Nyyl,߈JOӠ![V|^_[% GrrA>uSV4j :;7o͟w%HxRS8[I4%P* ~e-?Ο Grĉ'N8q|{H$  FjwL%R 2kL!C"iˆT6s %Hҙ634$+lf }A AføG*zm8qĉ'NoRT\P("s EH$Fb~XχO .ko~<ϟm' x<߂ zq3?S6AD3n7/6 PHl IhtNG"<z9_\߉Fs|fID"npAĶsbx9 9\jDg WK8H$B8&t:E1bc:̼ll^"cX<Ϝklj'N8qypH$x^0:tr1XVHRٲe GJr9Og?=lٲFZ-~#~'  js!ͽ y^  ݻwsQ.]DQQV_ttttRٶmObPVVկ~EFFL&۷oɓtuuQQQR9whh͛7܌^G{sN.]Jbǎ;vf?9Z:;;~FWW2TlB]]---; :r^ PDD"!F.޽{O2hnnfǎףh0 wn9|0Nb֭211֭[ijjl6#o6.\```*R)nFL`4n^D"! f" Rt&Z@ @  f", *#JIII$6 hZV^MSS{ڊ餬 9 ;y$隣L(o6O&`6ٶmuuuܺuKSF}.^HVVfA7U8qĉ'Ο h4Bql @&hzbb"k׮ڵkx<*++9t===dgg#J9s ?9uIIIH$<?0~!K,{A{{;*ǎc 9Ν;䡇b׮]X⮕1AUTš5k8&''Yl~zϟѣ|ˤ)["_FĉhhN;˗'557 F9~8gϞE.&@ ={tr\<:-kZ-[F(lx8~8 ,`Ք&'xTN8Arr2<;v+VV1zBBttt 9y$twws99}46RQ3gp!Z[[IKKFSS>aB{exx0[@|2$%%zl8Nȑ#g׮],\a&MMMܼy^HMME&=$ mmm,^A7U8qĉ'Ο _D@{JJ ###\.-Z$n-ZD4jb6INN&111;ƢEHLL$˵khnnfhhZ෿-AHnKvv6p狥IMM֭[@uu52 $ 0Z.\ 0LFZ'ONaa!P֯_OOO._LNN͛(JٵkRDJ%&w}!P*F8''zn~mr9J~IZZڜ:GQFFFxGINN&reDZX,>}|^xFGGq8vyJKK)++h4rQ233Y|96llf߾}$l6 `ʕL&<Zd2pU'77fZZZd21>>;CRRjnLNNw^^hf1Bqqj?$++ ιsXt)IWW P]]ͳ>Kaaხ=2'x6FGGdyw(//p$ LLL`ZYx1SSSdggT*%ȥK(--%99YW4% *^Onn.x8qĉ'N=v>~iv~0?;k6`xxB^Bknnf޽ddd3Lnl֭[q\HR<< ~:---׋&=6l`ll ɡCz*:ZF(";;l2FFFD_'''oo)++ DK `4yGyߓJGGǜ: @BBiiifESI*tIII$$$pyEx@4'xcq~S]]ͪUFB!B455rJ$ 6m@ @yy9dddX,#v " bz8N\.,!eee<3477s1V^͉'cżKt:6o~.Z vQT[  9z(HDƍ/0::I^O>婧b͚5TTTy'l444yE222Xj*j{rrh.^[&I&&&HNN&eh4B!n݊L&c||"8}4cccwt\}bz `'H`XDJˑXqd&yOv{wfWvbV %%Q)NA` E*9GG{~mر+Wٰa^?S^^Nbb"*~Q222' RTTĥKd۶mpnܸᠴCMM ^m۶a28t#x뭷hjj+V099Imm-J[!T*`l6 LLLL&cݺuTWWvJKKlVY6)++cxxDrrg e1ԩS\pA[lϦMX, 裏R.O=DVVeeeT*v;:lj'HHH `XHMM} uL܇|2>KRTTɓ'ϧӧO3::JJJ ˗/Ṙ^N'㏣T*Z( RSSAr1h4IYY7n`ѢEbJn-Jd~? ͆JbŊSSSæMW^A&1<yn7EEEx<Ửhč% BhF3_P(DDwRIXحx<4f$E֖3=@F:"^ѼZ-2 ˅L&CPRx<~r9:NH,d2Z%V%K2] %JJB.|njЖMMMP)Q)AF#? Rh4L6,,|8NzŠh4w-I?oo;w111jd1/O_6`HRR#?!b @@ @XXjZT]|>2 Nwߩ."D!BappP(o3A [p6WW(;~#m^6i,O|u:߭>~ uIBݾ~s/e3 ͆^瞛 ga83\>OXY !}'K.LOOk.2331$+ RRRHMM71P( 3ZoqМ_ȵ!B"D!|РL&2 ǃ%<$:,,iЃ *NuG?}$S^^Kjtomqt:8~?QQQŌnCGttW"p8>nC"D!B|=dϚjAw\~OJbvv DߕzKt=_<( juH@R|"D!B07.rϝd2ݑtz[&fY 6MZ" xe6|w}ngzz v\L&N'p+@" nвZrW@ n, v v]Ӊdl6VUh|>fY,ӸnіH)\.gjQ?5RP#؛)EHّ֌{oF"D!Bq4k |'`ժU(J~5k֐7gΜaŔ]vHB&#ximmeݻ'OHHHG?_|{͛7*VK.hp\( K,^O?L&h$???իIJJB}n^/^z)N:EOO6mb <(=.###"׿铒dʕ1::N3M[[r={p5bcceѢE(bbbāfիz=deeqyDRRRBRRW^%//~{P9>}KRPPڵk,^z=:_TTT̛!B"D!S-Mww765kPUUeҥBEdd$ьq V\IDD><]FUU###$$$0==ͱcj\FJJ ~aY͛"ɄFn … Yh ü'O$%%4<(?#GDD`hiiaӦMDDD`yW #""k׮NFFyyyTUUQSS[oELL&\fffdffZW8deeͻnrrCfr?~JKK1( ٷoӧX,$%%qil7a!6o^Tfgg/IYY6$h4]!B"D_Я_{޽{IMMNΜ9åKPTX,F#fRpUnڵk rJqINN㹱GXX៫rUUU=z'|RRYN'oݻL&xI@ee%[u155f???A055!++JJJ{^&''ooXhMMM-!(++cڵL&m^ X""")$WR)4qTTzJO~ lnyYlV VzR[[+vbҥMrr2?g|||3F8n)v;Z`0H^^O<?~ 6pXr%O>$qqq߿,djT*eeeYIa?7L&[0,ɿffB}<\.QQQ}H[oopp8233CJJ xzE"D!BqWx?222zGyc0(**bÆ X,N:E^^vbƍ ٽ{!B"DD>b02)n7EEE|>~ȍ.fKZWLF T*iT Q@Y JR楰`|~j;/ie20"KF`R)&Kf*`0L&ϭ{0z}]R%m<,755NCӉ;_fۿE.ʨP(D@1ߏJӉ >>^%hRT*`Pm1bbbA4 EIDAT%A0h4$Icw} ##YG|18 R=Ί1`0sGBb: L&m]0.kmn?kR~.D!BPBߎjEV3/3=ZJrAB%E.+h~ڳ( vc\>nsssϽBC]z7!Rٹsmt{]ncaP[\nm}n~Ud2Q`0a߾}‚A@ pgAj)Hw{mÌufn[Ν֞!B"D!ܡA7L++L&|%{ݎJ",,;{p&Y|SbH~ ͆N{hB:-<< ܾ)͂gEq'_"D!B⛃$[k4/A4nG8N\.<3e#j v ˅`0HTT}Y{<@/pv"D!B⛁\ },h,˿r3f'>W RoAS=%c;feo!B"D!9(,5{BB)~?aaad2HRpLNNT*QTtjdX,l6\d2Vņun`0k)Zfa21;;dfa^P(lLOO6bމ , p?|zzZ|jd2 bp\I~?ǃdn299)'^A$!!r&vFqx<"ԞRK$f))\.fff2oxn0DDBNGARQ[[r0w R*Ki_͆b%0Lv ^#Gv܍vΜ9Cttz4N 555 uOzWx<T*3^I!ByS@?v.\$%%h?9j,^}Uiii_~Zf3oPWW#..N <_k׮x˻FnTVVRYYIVV333wY r ===syhnn?9K,b/255J`0 kQQy޿?  .Y~=j7|WrRSS0ZV ˆ_466RXXF'Kf^W 0\.Պk֦rj#/&,, &6#\ڵk=z˗/ ॗ^zt555߿8|0׮]C 5---P(V'VURI $i.~i|>j#VٳgaѢE( fffp@K2Vաh_6mDMM mmm477jۿ6RqOÁ(((`rrSNQYY%77wn7ǎ7| J***7nܸ~+\.%%%|>, gsAΜ9õk#<<|oF#/2׮]h4dɒyr0TWW;d]/R[[o%Kl6 71)foRTUUrezzZrY^z%N>MYY>qqqt:j5ׯ_رc\|OZZ.LOOGMM =C"D,G@mسghoo,LNNOOܼyKLL /`0pYVZEAAoH / /Boo/{y-[ҥKOyyT\ή]j򗿤۷Opq?fjj_|֭[ikkr0==Muu5x<J%2,g% 22>N~~>qqq z)9::޽{9{,l޼۷rahhH+<裢>;* NRRӔ*=os L&+WRSSCQQQQQ\z`0ȲeؼyC%%%\3g@VVpozygjjl^yۇfO>a߾}T*y8 ѯ rN}Y|9<Յpݻ8~8Avٳgq:r֮]+r/^Y]F0Q^ʦMشiSH%pݜ;wN9N6l@BB1Gydou:?l6O}}=111dddrJ:$>|'|B?ՅbaÆ 8!::'O2==֭[td2233l6l2|ܸqDf3;e˖i&q8::ɓ'E6l0&F/>|*~y"!!}_-[,dٳο뿒ǩS& ߏb!==_gbp D6n܈СCtuuzj?-V5 233Zf۶m,]+Vpܹsl޼t4 \x۷?!"D!B v<<<v;֭ŋ|> x;6@?NNN:g}vL&333TUUQ\\s='42~j?֬Yöm8q@pΞ=#|z&&&hjjbhZV+o6jZ z*d.\KCb4yoٯ-Qzz:PWWGVV6 @jj$游8v;W\jR^^NEE7n //-[j*>C … X, yGC\.G~r9`'O~ HA2NJJb$&&W\tJKKٲe 8(//GPBrr2׮]ܸq'<rJqpŋBӑI0… 3vyWglljkkimmeٲe<#l߾uQRRrGJ6jdddP(xkdQ%ojCxx8J۽`577Xd EEElܸQXuUUUGGG(9sr~PVVҥKپ}4((( 99ZMjj*QQQ\xNjjj(++#0;;B`߾}<#\xF$<#fn79rnN~o!B"D=+WgsQUUVb000$''b "##&11:::ja4j.->!!NqMDDٳg9q#** qxOb0h4{nT*111~bbbXv-'Ow^D k 66ǃe||X233y&333ܸqcV+MMM_^WJDXXyyyp X"LNNATT299)|O:E `tt<\µkט$;;;wRVVFXXx^IZZ}}}444PRRªUٱNsE~:111 f@jۉ`dd .PVVF^^.\`ɒ%ZJG zeM{{;333ill~zzzz0dddhz`.1bʕ+(())'hiiٳLNN!tz=t:FGGgϞ=8Ξ=ڵk622,rf3$$$pM/^Lff&r1^/ӧ';;[@pq|>{)*t"##9x lٲe˖8s ]vt:INNFӉԂ⩹ӧOc2"))Q׮h8wW\jӧOΝ;9vrL顾[āXb#233 ۷o184 YYYY~=rf3ZEvZjjjhnn&11@ @^^:tQ{1A&Î;ضm-"22M6155E__o*q:8\.O 'kƈ9RI˃h`0h$)) L&ƍBC /*@&&"QPP ʻxÁ۽k9바"..n:233~۟9hɌ|Z|B܎b6{*@" nz* 泴Bi6H>s/;cttįUL!BPBߎI,&&f|`8!,%!bnLvgJ-$ ݋=g& -ܶW}kotܲm/\FJVKvvиνvbMBsB {J|i<3B3& 7oC~]occcgsM TY>}uzh4i {DDDq:b,'55Kmͧޑ[hݗook\.,B8D!Bx8|VYV\wd2aXHII^2 +`?se2RIXXwfc"ɰjո|S'ՊNCT>Zq`0n/Z-2B|d2<>OX"D!Bv#0h4/A4 >5" p_7${i)F\E0$::J Op4ַ!B"D$%g|>Eqˆ]j+ȃԞ_,ћL&jȈ0+bdd&r~OLL`XV{bbՊ^sKX,R4sZbh4tx<F#~Vcll ɄFATbX$,,l^` j5~a&'' "Ąh`0lf||JRd||\OKץ:˅h4<<,Ld].;7R100}?|>v&(.Q'R+JJ%ͥFQDiL& gjM@`0h6ۍR-\.555x6ca27l>󑜜t:z SSSL&t:݂n322"ֽYFFFzœtff11=###"X h4b<1LLLhĺ>11\.xMŲ`*M7orqRRR`tt\21==RmSSSb9;Fj=uUUU,ZRNjt:h4Bp8b=n|>^>#t"Fy0+;v6oL `bbcǎETTԼh477c6rVZx<^{5nܸACC?~gR[[Krr2466rᥗ^VxիO}}8ziiia``<.]׹tK,c?qE,-vn7o&,^x^z/^9~?W^ ,, Xz5W\wykעT* ,,@ X_u TUUaZgrrZ-`||OVVuuuLCC7o$77GR^^Njj SSS(Jd2x<t:ݼ\N633#ߐN;PHee%dee ׋磡H `07oŋٿ?=S[[Ç~:zY^}UZZZ0dggkH}}=%%%466oo"a||ǃV e"Dzt=##*r=zIJJ ~fJ hZ,YBVV>˖-c۶m|TTTdjkk)++\c>C֮]{Z8IP `X(:::ظq#˗ͱcX~= Ovv6&ӧOx(..F.ŋ),,$.."/_)***,󉏏'//:[ٳlٲXz׮]Kee%O\<.]hmm񐟟/ //rE:;;v& OWWJ~N;Fjj*w1H\•+Wv?Njj*F'OrMl6_ +űn:<mmmΝ;vWfdddΝ;裏ػw/III8qټy3ׯ_gݺu}my71ͨT*=JFFTUUQWW͛7xf122Boo/>èjEdv;ISY~?*>Djj*|===P^^N]]jh:Dvv6{$&&raV+UUU-!R[[__3;;K[[]]]Z =Bd2ǏT*1 Į]XhΝ|ᇬZTā9^BpYJKKy뭷z?^Y0@gg'uuu?uuud2jjj̙3$&&vZ y&۶m***ؼy8h{GqU?.,N[x1===={*4)B"DoG@ Tq5\.={GffztSOn:Μ9˗x<{m].DFF ARUUZfʕjlɴرclٲE4G%99(l6<(J^yn7 cǎQTTDff&pkC>>>Njj*j|s7j5>>.6s899 @aa!|"`dd$v}^ >}{,ZhO, +W|r{9. NSO=Eff&qqqj._Lrr2WSNtTVV~f/F7n`ǎT*V+BR^]]MVV,[3gp9ѣ / Bn0HJJ">>j_΢EIlld8qH˛6mVrss`ٲe|JII ۶mw@˗ lcc#IIIA{1 &--2mƩSlDDDPSS#% ****&66^xAt`pZ!**JR'''ǯk6mZ5 L&r9z(V+X f"##:255Jk4^"##x(ټfq`˖-_^)J|> BJ`0(--CR-8~:8&&&HIIAՊ`R)4v-ZēO>w@ `0xĚ ż2ۅ/q/^RNHOO7n`0cddvV+/N__yyyFkk+ EKKa4IIImmmgY8FLFTT?>B &&hhh 99˅'66lqpdrKmdtuu#x~XX###LLLlf``Ӊ\.`0P(d|>333x^VdBWWczzDZZZhjj"::E100@{{;N"\. h"bbbq$%%MWWd2/^b1|XVqp1q8sr!Bw5qɓ"Vxx8۷ogÆ $$$l2V^,/^dZsy O<QQQ:t1\.-ђ{jj*fBO>p044DBB~?X TUU9܌b!++G}2ٸq#^Çˮ]ɓ̤ \ihh`xx={G}$,[ ^OUUZ;wb49<ӄn:, W\aڵlܸJŅ s}gffM||<Tz=k׮N, 6mB.SPPB`ll BAZZ+VA6mڄhdhhDҾ;Ľv;Nkb2 6àu֡T*hX˗P({ [:4>? vpƸt 6˗)..f\pJKK)..4VK||<X,rrrdffh,7nQ1 Q?Nba͚5ƒҥK K+W288۶mcbbbbbΙK$""e˖1::JWWڊ^BVJJ tuuw^^/2g}JKKQ(b .. .yͥ!ǒ%Kʕ+lܸkb0ĺsN222z*333۷BJrr2Gڵkn:9B||޽{IIIa||`0HJJ |'466j*HMM.A{EVjIIIvSPP'|FtwwSWWGbb"\t`0Ȟ={HIIƍXV\JEvv6,^͛7\P/""Blݺ&K||<Ӭ[z&&&طo/frr:l",Ο?Ovv6۷o'--jn7?8®]Xl>/tR6l bXVHLLh4h!B"ķc.X,B-EeumL&Z^KϜN'N~*BϞ[>鷷~?u:hoSSSt;5-:22B0^ [>] Auq666&;`HRRr|^'DR;466b2d$$$P\\,u+}PsM Rbbb>S]o8\.׼M~䳎_cEs3fgy5 Ͼk@!Bn288` g%jLbA[i/qOl3^ϼ~s߭wCROtt4K,Y`YdqP~Z=e\xGVYKm+ItY0v&w[~?,5^#ms>o? _d8`ށ5~]\B"wXzt)SrrWZY^ȕyn(ߕMToZ}nC"D!B|=dfv[.i_ p8p:!]>]d2&''tom L&QRz0_ v!B"D!2 ׋L)vZ(BEjK~n_V}ݑ)%Kf !LLLI(6~aY)ZQF.~ajzEYZ-jIFFFh4B{Bш[RHzFFFDHARr96><8 "НjY_@KH"GEE3buqJEda:::HMM3g{GdBv&''3333/B̍|occcjQӉh`0X?,w rUfdee}1L\|K} ܇d{<.]Dllfq9r9ׯ_Buj /uR)z..K2 RIww7LOOj9'''箿e``^o`0˗|2GGGGZ8qJ'|㡩v;Ǐ'22SNa4əf299QUUu׀^NF#^```Z}ǘ QT p]fXh45N'z;CCCK80<OEWW3==MDDb| fggWT266&;l6ZثNOOy&&{d29ztuua4|Az{{qZT255%b4Z"u:b~Ki(va||\kɄf`0ԳgK=xr}!|(Ϝ9Í78w$''swHSTT+Bww7~ywikkczz^ϩShjj+W" ׯ_jT*9~87oٳxx7hhhN:EKK ,[+W222vRRRb??dt:Z-'NU7n ^ϑ#GxwذajSYYIBBV^zQ֬Yl^d^{5Z[[aѢEKfو֥EvrrYZ-9rp^~eF#k֬3g@?+ QSSCAA=@RB`zz`0,6cǎ^~_r+ Ν; eeenZ%n;;;gHLLf*++YbJ~7|-[wUUUZ ڀMMM!ɰX,v x9 6 ɄlFTb4h)ՠZ"h4222jevv>LjE4H,ϝ;X,Va<ߏlu:`0EF֯_ccch4e3W@okk~FѣG 6011hIF#*J iiivΝ;E===LMMsMM >mmmvRSSq\"͛7yzwn޼oMYY&JJJDn7nq+e֑X_2cǎCff&`!]q|MVZEMM p+'++aѣqq222p\\r;v0;;+6`ӧOٳgʢՊ`@ l6 lee%mmm߿5k044o[d2K,! 211 fZ[[@ll,yyyCiT*xIOOGVc6E6:MMMԈzn>"<MuuH'GR xaKwYd2===T*҄+IkN#;RÕ_J(Pikk& 0OX,$''jbvo(300@׋4fYj5& шR\P |G:u Foo/;3;;Ktt4:\~ɢEݧ"22j8@gg'Zo"m~3RRRHNNFriחQgiY7ofP( ꫯ"QմrA, W^eʕM&?z/ω'˗୷";;^~emG|>qqq=Fuo[<gϞe8pW_}m۶qY(,,nJI4Znjlw񻽇x ټysr[Е;PT7axxb._LVV`v</KĊr o~͛O~BOO/2^wժU")rq /e˖-<|RSSGYVzrrrVFZXvczzX Gt^'<#Z-qqql۶wyHXnha^u222Xr% )~mp\\|.xDZX,"^'..JmFrr2'%%K. //o^HylRY,|>Xv-W\h4֭[Eo߰j*fffڟ"q\8qv; -A&//HFGGWh>0 333266(CCC`2D՛7o //{__ҥK ˣ>*꜐>˳>+Trrr gϞ%99r}Q林TQ]]>֭jRXXHOO8$~:wl6s5="11<r5 )VXA?JRh 444~3ppJ%$$$`0(--ٳ9y$‚k||x<.\ OG|騬D& k{9f3R\\֭[Wq\?3կhiiaƍ-ŋioo1=>>⽿rJ ??m۶V`llGy^weݴ288d"55'|ӧOz[u;wd۶mj^z%Xf /C?j//XVdXV.^ȵk(..fjjKbb"7oD YχٳDGG77q|/+@ ÇYv->(###t:HOOgΝDGGs rrrXnr"Obb"mmmxի_HJJW^ҥKDEE(1113<M[[~UV DGGGcqp,> &DV8yLn7>,;v젺K.1;;KDDXX VǏs#کj:;;immeݟr*sΡXjx)H9rGy(a*-$$$jX,deeWWkt: >|e˖ ҘL&rrr.\&R$, aaaZÇKXX].׼:A88IMM%"^9sFr"Bs8?NXXm޼|F#'Odɒ%x^v7sBr9/_'x\Nff&?яP*ر9qaaa~k.errr3._̣>ʟٟ @kk+]]]\~??g!::hyhllɓB~嗬M$F BA]]yyy?e``gϢRO:O8O>Ijj*---l[l;vht###DDDֆl~9wr7 z0jkklWWWSZZO~8s _ׯf ZL&,'!!2T*[n?7odhhHc]]'Nd2 V#//R;֭[)))^@k ˬ\RX~q8WŞ={ĺVz=B ,,Le֭q"""ZCvv6999OFF%%%l߾˗e֯_ټy3l۶+VvZoҥKyG(..fͬ^+WRTTN`0*ӧOʕ+?1BT*rXӥvmsKTTTիJg}ՊdرBAII 7o&..,6|>`0xغu+Gja,Y¦M(//gٲeM}Q.]իٵkJ7|>ѧzN'|7nv366ŋPďc222'<<jnCnܸftHyy9ccc\p%Kr%_n[z 333t`0zGyhll$77WXoRZZJEE/رcB1,,+-GEE-̙3 N'W\GTTTk8߲WbZٴiTTT8|8ėh4޽'|R('a%Kرcb=qb5j;h4ryV/Ӵϳzj.^HUUw'%%1osssGVc...??cӦM>}:L&YYY$%%q.a0xHLL$<իWK:33CRR@ n'99y뭷r![֦ׯ_55%̎<䓤 ׀), N,RRR)dll,n7n088("HQQQ )<|>0vFFFկ~Eff&t:CFF)))j*VZJ"ǵk(((`zzF||<>J%===YK./~1\vf(Ja Y ||>WndA"Y(h4ŦRT Ei×Ddd$eeel۶MzjZ_J7(fO>!11Q+tBsvtDDDWPjEJ}-$OLL`jjj\JR?^O__|>㉎&;;~>_LMM77oޤ fgg!͓XF#ݨT*RRRmݻF# vZzzz088H__jyΝ;yHII!%%E&`٘fѢEH)!FFFXz5pK+-Ke|211!6jx^~]ׇpv܉R䣏>@Dbbbؾ};k֬att&nܸ7 9w=T?37R@ Ν#55B>l߾]P ݍF͛!4CCCeǃbl6xf``Ql6.Z6l0 twwc;XR?X,Etvv-z{{Ƞtfggusc=FRRz=ׯ_l҈'xHzz:O=X,Z.saAߦGhj juu5FbccXHOOgѢEܼyk׮R(,,b؈h|ۋF'|ºuPTf\.DFFfvAii)ׯ( '&&͖-[شiayfiii󲭭 ˅ 8x [l!<<\X3hZz{{1wj~yst200@?:&''dըT*, n[o֯_͛Y~=˖-ѣ{z^>#4 0M'ҡB__###I__8NFFFD_ݸqCXjùnQ*|> Nimu0w^ ='ObZIHHba׮]~9"\}A\\ZSNKjjx~{G?h4*!Kۋ/K& >N:E||<111r%;;{[ZZJ]]mmmttt!/R3g033CqqXۿ[ lذfݺuwgvvcZy&iiir.\@gg'555,[Equ(**$%%111Agg'###rev;%%%?'11:^]v-gΜq[&L~Hfffv h4)%%E;wb歱d2X|pEl6!˗q:ٰ͛a))),_+V ˩a,_\gdd}vfll}{\. LNNJ6IV(\pA&&&9uG455 77zd۶m]8|8qCDDTo崶2>>?Ndd8u\իWGellLhQ4 k׮tr5Ynzj/^̆ P(|n7 Ӵ:::D(.]Joo/x^t:`B֭[Y|9QQQ"NXXx^1 SPP&??^O||rrrhhhŖ-[p:twwc0s Fш ,YB!uyy9tuucV\餦0DPUUfӦMİb !))F#;vڕY"##---L&O<&dv J3g099?Nrr2B4%a AQQ333~222D322h4I.. 1 Ldd$+VZ| Yz5k֬aڵ I$6T*|QTDFF(4^,P,ZH |Yoܸ!0 LOO344ģ>J~~233)..frr8nrgtuuqMRRRPT\.֮];M#333ZkbZ$##DcժU]$::Ja?N||<q(P(rL&#""eDMM ޽Ea4!ۊ+UhN'# 0LRTT$utt]v$''MyyL_N0d޽322Bww7=K,ATRSS#`6cΝ$''399O?4qFqMMMvy$%%$ioogzzŋիW/#*դ%**@D Bikkc͚5lܸngժUt:ٰa^B~zfggŞ8foŸnDdMLL x^֭[kײar9---zJKKYjPjHV&svпE|tb4Rqip~H6>-Hا![@o+R \$N'5k(((x`dn1115h$)),]]]BsYf͗6gl6uuu8Nd2X~$AɅ!;;+_  1y())Y:~l+Ann./~M@0d2ʕ+l6;J.\?vQFz-6nxG0{! >Z׫?ٳg^|{hiiappejժv~?Νcll1~ӟ|z;w +Z.>>UV3u@~{|jjJXb>h.]D  ,, ɄL&n`ի?ӾtRWW'xI"7AՊZ&&&fĂQ>\k!- _>4)sM0BVw4mn>k0fT%ˉ{oL6/U_xx7nJm;wĈ2+׭ZJdP|ɤ8<^Z 1!B|;4oWu '=z1 _H@"wI@jn}|~ >4k`Ͷ`/)xZ_FX x&_=<p͐Y.x;6R o[ӃGw4uӞU|ɧ\b筋w2߭s{v-[o+wLlF|1 %=)罏A p_'zt:omE2qOHHxd]z)=(_?m!B"D!n!)wW3ȳ|Ֆs5]!B"D!gw( ى&22RT ?IDGGH400@GGSSSDEE!att(~? T((@^FGGӐjUFp8㡻aZ-Qz{{Ebl==="͛70CT  ZMXX===LLL\.gzz6ytu$@%}߽ۉҤ:tΙ.N4mi23NqؖdٲvQ"ER;  ;~H-1>D^>s{:ZPzDDD`XtjZgnUq(FGG*wdaaᎊ< giih4d21b2 A.388T*JLT*1*+=pjclLccmn[ ‡ϭ* 255Eoon?i8s t8_+xY,éayyy]%{rYjX#"""~x< 2004aaawLLL=}USSV{ $H A<BCC1Lt:Q(ri~Ottt0L!sQYZZbnn333T*YZZbtt%׫T*fgg~& ш5l6R,EܜZUUEqq1v]lFP033#v3??/|J%ΝLd2l6"##q\%@GG/(hZŁezzZT蘙avvV:`6Qr昜իdgg|\r._LllbP@|2ddd  7oooؼy3aaa477͛7D&1LP(l6qFn2KFy<,//jX,ͱ*FFF|)}Q^|ErssIMMepp‰'زe f[2;;8! Fbajj^zR6o,$J%< ?ω ++PƍlذѣGyW36lyEn޼)j4ggg3==O0 |+_W^!&&J뙙k{n~Kvv6>04- Vy\R)2fQմRVVƻヒN{رcLMMsUv/̎;K_t_LL { A >XT* Ĺsp\DFF0XJ%.<3S]]%,,P~?nx RSSq8;D"hZ****REN>->;<ɟ ,//v9q"b((( ==7|׻#xx< }ljٳgCT" tks{Oi&RRR8~8^[[[_*aaa\.bccyljE&xhjj"&&b*++p yƬ\.x n}hmm-999zvŋp+++nhoo  KRRO?jP=z,^<?jE.SXXᰟ~?2tv%_ynH$E˷-'}><3LOOڊN&III^J/H  L( ;ƦM<zq=R^ʕ+$&& QQQ$%%c!##;v˗uOO7ndΝ{nBBBسgǏ`0`ȑ#466J\.r9ZZZHLL0H$.\Zf˖-=>toNNNΝJ}}}x^vAee%rӧB&a6j?$$$YP%ue⪪*P*Q]]-ҭFFFX,$&&OCggœO>I||<}ݻw?i$H A Xwg"rmm6zzzfqqf3񬬬JIOO:z=N!n7S[[NCWx _ہFf3sss+zE 6 F4 bZwD**" JKKE"6mB"vd|>Y\\dvv%8|0qqqvE8f#;;XxN' LLL~\RDPRa>׋C311Aoo/6MBiq\HR'99VKqq1O>Cnkk?1%%%hZ GrnḰ"oߎFaX,t:ǎcqqպ7<vl թVHww7DGGDZ,pt: )SlT*T*]]]tww#""A__FQB5 L&mzDh/P(J,,,p9pGBBEEETUUTUUo>zzz #22R0 PRdtJTT۷oc05J%*J|>ٸq̐$::&Rxn孷ի} tNFFQQQl۶ 4BL&===c4t2>>{nt:x/}Kdddt:FXϺB 44^ $H A>|dzLL՛CѰsNnJZZlڴPضmEEEJvv6###"O=RZ&''9x ˆ 䠧'|Nw bBfggSSST*cccBltuu133#6wf˖-$$$c|>,,,Aww72 Djj*333( 6o(V'xZMUU]TTDll,z>,&Wee%nCyy9QQQPTT֭[At 111z )))DEEQ^^``bb%ߏZ&==, \6m sss۷ł` >> pkz@meeÖ-[ptvvRZZJEEyfd2333455ģ>JJJ 6>vIaa8Dp8:NnʧA l6ݍ%??-[/BJ"%%FCbb"n 6 J";;c|ܚJDjvm۶hhnnBdd$DGG ڵh^WrL|>hZHLLNGZZ8;rVu)F(JGxx87o&&&҄x FRm6&&&0ͤt:ZB2<<͆` 33$夥IJJ "=@דnںu+. RRRشipkii>xzܰad2v%T4 DEEDbmڴJٽ{7k׮a28v8}(&vIMMK_Cy.|2o}yyy$&&E"|wB^/T*Xo|}L||<^m۶ A 3@6}؃=$p\\߸ʊ"v<2'>y턆>4s/J<r?vA%R3>ir`~ I<gu$H A|vX,f@/^YYauu7][.Hj{`|Z!A $H A>\uW;F>4A?~NxP§r$H A $H{ll,nQ6Pv``Oxx8&Nd2 %AIR$**J(؍bلѭ*^~}nU|||\.QQQ,//ىêDwIDAT@ӱFoo/j!r!<<MKKb`ppr9^|> rJIz^`eeN"x^7ssstttFtt jtta?0LDFF~>UbP|W("vuuԔYd2J(Pql˨OXq T7s4DGGcXX^^fiiL&DB"shD.FRdeetA A $HOQqXHUU200Irr2?Y^^ 6ՊF!--7orYfff9ɴFy@̙32::JII]wBPTWW3;;˅ C*rIZZZسg455199IMM eeetuu~:)))aqqRٸqȏq.2(¨旿%vB.h4x^^{5F#[nevv^xÁJ"**EjjjD[m0Di;#:afffX[[CT299,>1L&.y233QՌ033Fy(ٷ,^xBd21;;믿Nff&tww3<$ 2 ^`񐛛Ç}ׇVv355 K/DGGiii/iiih XZZҥK{ !F#}}}ű"T*_CeeeTTT299L&CTC__JR3K.Obxw $$^g.["ɓ')//'44s3000``nnF◿%2 ®]avvƑ#Ghii!;;f3kkkj^ %33 .󑐐@tt4aQQgnnnuv;gΜaaaD\.deePPP@aa!\zQjkk5׃ $H A|X)υ P*ٳÁ\.gvvV(KR g}g}!JB*R__(ZmvQT"~Kx^{=bccjK$L&O=GO:;;h4n7<#hZN'kkkMaa!7oz)TJ[[<3RPׯ_'??N|2.\td{qxDEE$H A !>@9w%%%\.t:>FFFgqqjf3L&, .PijjXjtww366mCKK UUUܳ<+B}}=Ÿn\.L&fffQ$$$x0LLOO311j%99(ff3KKK(J999"_l6yfVWWX,9DZuVt:3338&&&0,,,NcvvTJjj*jYfߏ\.F^:KBBCCCbZH$( d27od~~Ln72 4t:xzjCC?),,DPJbǎ\.V+KKKm6rssDѰk.v;۷cZo,nYZZ4CCC}m h=ܹƍM~~>\|E]ZMff&111ٳJ(..fmmaYR̂||>8p5558R)g||\|n399``aaAajjFFFeyyY~5.##Y<mTA $H A> rBTT[llGΝ;ٰa===QXXΝ;?8yyyTTTϦM砧2O>=ޚ=00Rl6痢0T*aaafa/ پ};夦}v~?OV@RaXHIIaaaJEII0q_P(|lܸdIHH144J"442r9CCC߿bbb2R:q>>aoApp8|TVV"HRVWWQlڴ T<sRRRp\w^H$">affh1OtV }iiv4 #66F*++ٰaeܵk999"CR$%%£>*ڝDRR)))鈊zέ928.(( ))'$$D ԒU6l ց͛7il6^Iaa!IIItuuQXXȶm![ A $o3.Y\\Ɏٌᠰ*En6 #,,~jrfggILLU}vvA ukjjy& z0;; @JJJ$H A crrR8?fCT1ݖi"Hx!z?mUC` >n,> >q?uX~ ~juѯro@[ݶ7% p/'|݃^Mw/ |vf~>|HXhmmnJx^:::Dm@SSRTOknnfzzX$ 파㡾^N'zwDss꺓Gqmmmseل{LL 188HXXjaۉhAKK^WWG?>FCww7ݢx^"44:::#..L MMMl6bbbXXX #TF#MMM,3q Ԥv:c(n&''q\455tl6'22P&''iii%ۮp8x뭷HHHc4Cww7sssꫯbXX\\>|w0U(ߏR5%66C*3}yyH&&&|2M?wvׯMDDħro&jK"s*wdZ9y$2k׮qK.aZV{gQ).6ƈ-Eoo/aaa(J:;;EPɅ JbmuX,yR)555+^:4482 yD>{OF.cX0\xD‰'|1<< ϟGr V+YYY"- &&ϳB||guuZG׋BHHF^~en7 R>euuPytU|>NB*r%F#\vDFFF"** Ju۞v1 jFmm-CCCf*Pfގ^nF^*t^磵 Q( Axx7o^=RN6!!!8NE| W_%++k]ԭ߸DĉrĻ^XYYETH$LOOVeddVVWWF*3|ܳśoNȧ>x &''&;;GMOO,--`͛ #YXX͛΢jo{n:::P*bcxxX<4551??Ott4~fT*ⳁE477311!>GFFǶ)4 ͆Bƍ oOwttz`ddDӎH$DFF244Dxx8C ,QQQ(JVVVhkkc``@.XRSS~:W^eqq!4 /t;}}}LMMގ`;2k7ofqQT={݋dy\Byy9kǓk6oތj_'++ ^\.Ι3gظqx]~sITT444osNr9QT֢VJ mۆh^@.Ndd$?OzTWWNTThBXgMMM!0\xDN8hd֭LNN$''/ƕ+Wimm B^UV+uuupb1 >.;vk譭|&99ߧLOSN<zcY1`mmm3>>gllQ^/Ʉ^gffNq(U]]MHH}}}C Ntt4..h4.8J% AHHccc R__O~~>L0<n5F?e؜㡪xٶmKj$ׇJ\NTTfYNHbzzZ;]tZf3$$$B`jj{=BBBāRgg'Vrv;MMM.,,ގf#22FGGQոn^J\\l߾]|/` 5RD"ԩStuu륽~$ ?g֭磥;wofxΟ?֭[ybʱcDŽl6ϟ'>>!L&nZD"Kr _Wl߾/K~?7nwa||\ŋ)++?>>sssh4~_LFF󌏏p8h4D*266K/D"`bb^}UJJJZر7|RL&7opNjj*?OĞ@z_qF#deea2͛!͛ 孷^`Ϟ=|>XjjjPTx^Z-nW^y7|P[[K}}=& Hhh( Rٳ|>VWWh4FBBBzꫯ2>>Njj*>OoN>Z͛7wCNNRHR)..&$$ͩS n) 3˅`%vioogmm NhITThg||n|>ZϓJss3~q\b?!4Rjr5.^Y]]G?W^%==at$gHJJZgLOOOݍf^#<<˩߾o+Tʣ>fxx5yG9y$~RRR?)~={!3668~T*2QbccK_C˅ p\TUV ot`@ TJvv6biiIx}Y^~e:;;xx"{^gaaFҸx"Joo/YYYr!z{{srry&UUUX,\.<ttt |PTJZZ%%%x^Q(LOOSSSC||<>{L&j=6lwCyee%~0222~:. R͛7 #==3Jw7snoMTTv⥗^b׮] /} o"..!rss9{,)))444pQ|Mt_PZ 088HRRǞ;fff~TD"APHUU 455qa|M6nHxx8ccclٲEh 188Ȯ]X[[d2F{{;_W Ӊ'''v8@BB/EEEDFFGP ɐJDGG/Yy<233t˨jv;?OINN&998fgg1㏯÷211/LYY &&&D(կ`0pa\.~HIIATTC(\.$ kkk9 ӻ\.R)`d2q5OGy ?~Y طouuuL&cΝ" pmm ^/ƫ_z^y233匎xp:x<~ӟÇ9s bڵiַ366FSS2>,uCD-r!#;;27=]fjx/_[SSS&6zGA/~{A"`Xadd L&6mBRq5˜8q00ܸq^O^^޺'? ٔPUUEZZ$ DEEo|CNMMͯ|^|Jx zzz eyyJEtt4qqql6BBBi3~?nH$,,,__Hdd$UUUdeeߏD"aƍ199W:;;IJJ(JFۍJ/;>իW)..y.t$&&ü(n Gll8_vߣ,x  Ӆ;""^OTTv'33S<\~ 6|ڵkdggկ~\zߡVmBBB8v!;ۼ^/gΜ!""={{ﱲ`0*6O2 7MHuu5\\.eÇsI7n`rr~8NIIB `|_XBv;SSSܹ_W,--axٿ0^9xTVVrIQ2+_bzV|+_ZpNzIHHSXXSO=Err2 rssoD"a``?Nnn.999Kꫯ믳D"!;;W4SSS{dffrEӑ(J233ٸq#?;M`B?Ν#** Ʉd0H$ܸq)y <3q ncZaxxXP$ vi?NYYtww裏r@PsNv!~wnܸArr2Ǐ'//ODM8N^d=^׾].NwwxurTRRO?47o^w}VKZZSSSXV^/'O$=="T*{駟h42??$111#&9MsE:2+++v~?~m;&cnUt;;޽ }yy.VWW?Z-Fzr(++#<<&uc2!?? HJJ">>,ͥ"rrrؼy[~~>6ll***dOJJ Vev[oIYYR]v|iX\\n):lٲ.'0233ٴi88}4O<ش,wŶm$..RSS 撒"^]w0ʶmxר 77W'??JJJDdeeQRRÇ_ֽhhh9X,VWWa r1yBBB8y$زe {vljVs) #<fjkkٶmhc:??OAAKKKL4 j5F"Ӄamm^W" mFn.J'<111{8qB  m]>hqEEE\~VvAZZrZ[[qy+x<rssš_iivexx,.//S]]Mii8  Lu;-0Wd2r\Q/0^iii9rNGoo/|_&FGGy8t455a2xΟ?yyy;b , rMqHJJn3888iVVVFjj*TTT3SO(##^\.t:^ZMXXSSSTTTLNN}k{p|>Dhdbjj7n000 67nd2133s_n7,..Ѐb)ںez=gϞr@DL&cuu+WVb>44Hjkk!''dnܸAgg'~7pիWQT0 j fłdddË;|^LKKk׮ lno5&$ %%%SSSO>8ڨ'22d{1ݻy駉!'':HMMeff®]ĆIRPPfcff9s. HLLz~:0<<,om#% 6mBRSS#DrKtt4;wd,--1==hh4bX:[V>h4BNNf<󴴴 6jjjD,-- ~'R)  544H||xwfd2JRxa4ldgg355ٳgx*s/ 6<4ߏlfzzVKXXXOMMq!6l@RRccclٲu"qJRőHBB~yl6JaZ&$$Dz<RRRbpQQ*"]דF\\i&RRR'--xrss)**"%%BCC'!!xd>L`j222HXZZȑ#lڴ"6mD^^eeeN?J$fggaqqhv;V^ wf@RRqqqj '99l!TUXXHBB㌌ Kݻu90!!!$%%VL;vJ% STTĆ ċ1==R_DnAAV9~dggMjj*111TTT0Gy|!hh &r9E^^6M.G aRILLLKKcyyLƣ> "3W>33Ñ#Gjn'%%.Frr2H$`#HKK#66vt:EIHHy4 [l`0r 33Sx{KJJHKKC&IRR$&&Ett4񄅅Bdd$qqqzx"""tB`tRXXHff&6sHhh(=z*))!##5233IKK>X,DDDMbb"(833B륵pz="55 ›>AףVرch4T*O<}XãHLL$<<n7t:{1kFff& r9<yf"##Í@Ö-[9$$'x^NcqqR*++)** DE,--P(8v예40L;vl!%44CVEnpEEzɄNc˖-LOO=&]v+SDZ&)) ^Obb"H$!gee^)..㖓R$++)bbbĞ!,UVVEDDxNQ| DDDNQQ7nD 1 D V}KQThZe/(( ..$t:[UEi BЯ@8}k2D*MLL eee c;""!yfrrrHJJb~~j5w^RPPP ""M6[M&;wbƍm 8iiiݻWS5944;o>vMyy9ʼn5Nד@\\###hZ~iZ- 6i&BCCŻ'::7䰴n$bccs^dBq: FVVqqqyfv;333l߾[NX ??{R∎&--$Fbb"YYY$$$PPP J>.=;v8HMME*}Gogƍ@aa!M7oO4͘L&諬,JH)xꩧ(//gƍT*EdV%::Z<ץ ]gyX6l ~/99Y8d2QQQ")##ܳgAII (JF# ~PTTVBv~BBBa?KOdqqQ-% fj:wS}mm^z۷y_ʩU= N0<:B 22ÇߵvuНN'}}}B!0o֭[r7rE!vTXX(^5T*}iŋZ4>/ÇiOvΞ=7BV? GMMȡNLLdϞ=V… ~=ׯw}`ΝyK.\g}VT^~O?隣Q(Vt::uYF#|_kGHUU`VVV@ODfNMM!HEDo߾{;N^*R&rrrغuCGIL&"4Sccc~9p2?<\&'']w4@oꍴX,| iw &<<3(DɔO90|]~geeEx|luQ@4R@LRU勀ă9|X,!0NJ@;"**j[ZZFBe>?p\|j{ ‚7h4,-cf o~_kҜl6xfo}oK$z=1&D Hᇹk}aaa]uEoZ}ju_ݷ 8|8Nif#,,L> :!>j}8Aߤ[]snٮͭ׺M~֡[?}ZoOvkǃnσjcZ6t* ێ8w4Bq_wLkCxP!~D>$H A ䷟^@x{ A~p{%8 $H AHXq e|>ZQH$DGGB}}=SSS$$$ Hhhh^OHHFׯcZgnUqw466GttG*߉[{zzhhh`yyYg HHH`yy7oCXXPohhXF]]ɕ+WV6u^vZZZ %44FIJJB.399Imm-377qK<>>NmmwuuFll@?N`ftt?x$<<ꘜ?]]]ާZQd2ꘘVP*".0s*f7DL&g `ppP(:/\rmM@)A $H SGc vn7W^E&Agg'N#..{V˥KW Tz*7opCrr2?OA@MGGwmZfM z*---ݻyFFF? &&&x7###+W%N8AQQqqqrz{{x<>}B^UUŕ+WD P:::x뭷عs'2PWWGHH!!!9smۘ_/bcc_'//O"~rNDD06u:mmmnHH}}}LLLfllh:::xD)FGGt\iq>22lQZ-?IKKlذχĉR]]< |>'N >>{-[T*?3zDD.6P(2NSS+++Ʈ{V, DJɄfC&P(x瘟%5ޑDVc4Y]]epp(z-IMMJf K.[%J%7nҥK۷LFww7( A $H/ck;v VEoߎ\.ghhZWUA3==M__Sk./ Op$ĄP何NvɗeDž J9z("""K||<Bj{=~_166Ɖ'룱7nPUU`>###?`ee˅n'N(z+ }⭷zs|%%%}%v;ccc /o,..RSSL&[s\o|^QO|X~p8[dggS^^8s _WEI}>o6RyFGGIKKoo8|0'OjbXx78z()))}>;wdݼx<Ѯz!`$~n7)))<ܼyV~?zGRTTD^^G/$ 裏zw^R),..Kdd$ڊjra~O1?~us2P M6hxǨʕ+HRf3NBeuuNB?pz{{پ};eee3>>.bڊfl۷o6l ())YF\\.\\hDGGSXXHEEP(nܸnd=~ږD||<.]bsgra4YXX`xxŇ݄ A $H k\|D, $&&2??b!==ΩSX\\$%%nXZZ"&&BxHIIa֭hZH$wqFnܸӧIIIZ~G455ttt0660?~\.ccc fcff6p|EYYY Ȗ-[0 ygg'tuu*>{hhkkcǎ2552'--MJlz$&&"9tH$222HJJ"##łN QQQdggS\\LFFBBFBByyyv4 ۶mbvIMM)_dnAOMM>GyM^^{>74 $%%P(㡴쇢$H A ޸t⢈H$f?:f Yl6uE{=f3;va]>:333ǯ TUU3~F@-KC]] vuЃ $H AxLNN 'l(Jt:ݺn.zq8NKߜ@@@j LסR8x A˅Ns8iQQ7oF.;͛JrS\ Sg@m A $H^Bg]. `/--FY[[Q5^]O\.B?Oq~yp8vkd`3*H[nm~|V  $H A !|/f}~T*?wT qJwyA|z m!A $H _<={у;/ Av>wX*ES"B>K>OW}_N纱xj744@XX\~RSS匌pUIJJbvvK.t:IHH`pp*VVV7n/TB`1FGGINNl ӀW^ett^Jz|>k׮q @*RUUH$n޼Icc#r\(T2jr@NEV^IKKcrrٌd󌎎NIhhWb0gqqNd2ٺhZ[[Q\p6HJJ̙3aZihh Ibbα^~en7333444rVVVr BpmmW_}y.]d"11g.PBqTUU144D||md\x&Qsp8hnnRSS?_]]W^h4p8g~~;x^jkkY]]]7Vo6X[[[[ill$77Ztw 'HLL-fzzϋOMMԩStuu͛7'%%}ܝg?>@cc*4 466a7nЀ!>>I}}=MMMh4L&}k_ A 5Q*TWWʢ}{DGG?OJJ .\ ;;'OAnn.III\x$ l޼իW9tmKhmmE.DEE]o-GHHϟ'22VKCCݻ 3gPQQdw!.. ~?/^瞣ƙ3g$99L&ʮ:u 6hx"uuudddChh(Ü:u;v J~@FF7n@Tɕ+W0l۶Q~fz)N8A^^-hoo)hjj"""LGq YXX ,,LltttsOdd$ PԽo5'''Y[[cxxZ-7nԩSL&lذ+Wp8X,ywԩSlٲJ1en޼IOO Veii1V+vQN0<PwܹsRgllXfff`~~/'ͭˏ~#nJOOÌJҥKܹS]8\.]Fyy9III ĉ瓘l6surssy嗩 ''PjjjH$pu",,~nܸ磾.>cmm'Oa, l6J\|lڴdꢳ2FFFhnn>(#񐙙FFFxHNNf[Fx}>ӧ)))ᗿ%]v =$$VhEF#@Vr88q7q\"r(7ATrirsst∎ܹsg A y~ q߽{7w&""BlݻwP(FSO-j5ONN؈j;wO011@ii)~]vömx'0 X{ Tʁؾ};d2bccٳgJObb"ǎ#77\L&|a `6J4 GB!6*`0T*h4t:Qդm6 Hرcw zK xwX\\ԩSbcX[[KCC6^xQ~ӟ"JOMMo#QhZ{=WfӦM=zXr9(J&''Q*j %55|L&P*qaaaH$PMH$tttp9^pQillW_eee6zuu€ԩS 2==͹s !22Zͯ~+FGGTWWs%y aaaTTTpu*vłR\wȒ""G"ȈGDDPVVa޽")**LQ*ٳG ~my76$$FN#99^/aaaT*9s 233֭[J455QUUezz/_uFFFgtvv_SOT*1 z;vA}&$$DEEEdffD6oތHR\..W^y/C.%** 0DEEp8P(phjjb׮]T*y7JLNNX^^fjj Coo/<裘f,˺ff3O?4gZ2|>{/:NJbϞ=b|MnVThZt:z Jd2eш痿%v#GPZZ*q/_ǰX" $H/v:$%%k.N>sss VI"o~_S|>|>Dnm۶R|>0@7muu_Wlܸ2^opp]lHxq HMMooyꩧ8s o㏯ H$ݻÇsY,k?,,,ӭ=z^233}ژ\wϾ}X^^t"JC|ddd}v\.###fQդAgg'8N<}2~jf?,NSTkjj(..&""'|jjjPTΊCmӝ 336, \|Yxv,===EHD"ammpnJQQf^ONN񴷷cZqx^R)dgg.>|>ʐd466 V]w RxgWhdÆ -wp`M*++h4$%%T*HRSS1͌0$&&~ HHHQ@qqq) &''d21<<̉'p:F`ƍh6 {u '~5ߺu+$&& osssl޼sssߏÔ@JJ #0994ccc/}fggYXX`hh~z=GaÆ l6V+>(۶mC&|/o}~>fݷ' $H/"k\zHfgg)++#//U٬믳DZZ"o=11"_Ή'FLttmay&33V{ ۿ̈́b6Y^^!}}}(Jl6NSyGllP3 P__/Z|>v;7n`jj;v022BSS~5Rȗt\X,•+W E ---T*nƹs0͢nD"Uj͛7j`ǎ=ҥK>.<:dddV9tH ҥKf͛vG'rg2:;;|RHKK{CTT7oFPTTĦM\DDLLLP^^Ndd$lٲELd T8z(8$ ٟuuu;w&R)WL|| '))1#99y[߾};^HOO ;;i.\@oo09{,/_fbbB$$$|ܹDVWWq:2::J}}=X,z{{"$$09quuuą D 3@bb"/>8ݴi.\̙3133oNmdd8k4 ++ BA\\rF!`rr .]B!zlܸM6_{wוp 4 44MM5Z,FI2T* UyT*T^SRy$ڵv_ݿJVVHDnHwظ/Ee˗ %Ϟ=˵kטXff|ߏbɃ$ o~ʊ388HWW999x<BKJA3נezz:eeeRYYI}}=YYY糾ΡCrzill9DO>AբP(عsVز=''NGbb"MMM/yh4f#bXPT8NJJJHNN&55ш`@R)hK/Aɳqqq,--a0HHH >>L,gГرcJdh4PXXHbb"Ŕt:>ט呜Lyy9 ZbZLN'V%##BZZYYYbZ#;;RfÑ#G̐a4ٽ{7 ػw/χf#557kЃ*!!jf38p"yyyɳܹFHIIa}}O>l)JyV^JHNN&..N%OIZYXX ++yBh())a}}RIvv6dffb0̤FC\\{% l`:П5詩deeEEEMJJ.|>n7:th4"fO?tz줤$)..;(J,h4RUUZr744P^^Nvv6NSH#.p8Ç";;[%ݱcr׮]Q(466R^^.߽{7TUU!$,~?| PSS#nP(Z>|Y Fەw:FCuuB\\w怜2n7zHOOgccCCCFa׮]o,((b.ki&;wRQQARR9r UUUkii)PWWG__[ʣ*J9rH:7ұFv؁ZjhHKK l6NDvvt\D">#***sN9bJX,8pVU~bL&>#h4lm+ ?ګAW\.yAP鱗OU}eegY}ee렻\.yBMM ao¶AX,-αXW222__oiH˗/ktEx[MAbDw:asD"%U:)yDZ> ^ iy<F<=v\% |WP(( J[UsuR('֠>K\\~)]X웼?' v"CiXP({{׮]re. WJ#S(o  oB!/{m(dYRSJc:R9i@:n[x:?U;y`m}֞?uVL E9Bhb;u}WR= v+  㗍}!z!S?wCeRD"1L"=BAAKϢ7@ fTN,c}}}Kmb8^Km `iiB6ocsyNAAagfq7tuuqUL`/F1L<~+W\zqrrrF477#jF$bzǕ+W$==HK5 ƍܹs8p\rj1L<|f,sY{O>MggevyvիtvvO\\477cf~~%y25/_bZ{.7of3q?-Cdrrɗ*_#X l>11K&==ximm% ʕ+WhkkrK.144jETrMn߾B ##,ۙlkmmךizzݾ3=z6dsd}}JKb1 `XΫWJGGIII,//s boPXX(gD'O5[ZZd2=ܹ999rniiatt'۷oc0^&|WJtb4_===477  -//h4ʵkxF$:;;z*X ,Y\\k_|f3ܹs7odbtt .JVV>f?~lYF U?>99IJJ D"??HOO'--K.QPP1LرL.\( ttt9w 9sjt/] ɴgϞ\fmrrHss3zLww7]]]jkk9rkkk8-, _R|FFFƍ> N>n߸x"P9>cGÇ15駟R[[K__###O>ann.ijjBp} MMM388(|7$AA*e_A||w^Ξ=SSSD"b1.kB۷h4Rdnnb".UTaիbz^?N]]\z'k׮_Z,>D8s ^q˿K\fnnSN_*o[Vs!>3^J(;# `۷\LIII O?333Ͻh)//{(Jd߾}L&byyyzgii1f100 j}Ͱz fggD"/ڵD~_ݻw΢T*)--x/QTTDyy9we~~^0v:::]]]ehhyPJS__Oyy9.Trss1Lrh4T*n ;v`׮]B!===399*Vz gvv>FzQT0== ))FFFXYY!>>h4JBBTUU1==DB /ٷouuuőJ^^&(,,dll*#oGRmyt:jkkiooTnݺEUUfrssKcc#@>e f#==<4 2;;<,--1>>ν{biiA8p(J&''feeqjqbT*tS__/)..:N'\, jʘm!pinnfqq[n122ƒ~ǹhOmm-( l6a||']ZZ $$$PTTDYY.`00::(z233) +JSSS!R^YY/_bJ%ͱ cbb<P[[^"׹p/_ ˤ$ou|ͺr7pvJKKY[[ѣA, /_gvv-_[ZCCCdeeD||<;wׯrs}-N:ō7LNN!?3OΩl&))ׯC(^//ѩѣG'++ Rm9Q BWr[0򠀴\ƍTTT0>>N[[\ GpPXXfffӧOs5ٽ{7t a˓;ˬINuuK%YYYAӑ;wxpX%HMM LNNRرcfnh$ׇB8:;;hZjjjp\$&&b0& cZ->vĮ]*}}}arss)--ellYyyoo/BBB:I233q(J$&& IKKÇr??xg}}AT*P(DII ###n &I :==1P(dffRQQsssPXX vi}}YY A),,iaaшJbll ͆n'&&QTO$)b1v;VUNGee%ݻnN'[>(J9"B^/iiib1N'f^ɡ5JJJxZZHD~F\.Bf)V+|>eyy,VWWD"hRIEE`Zgnn͆`dd$***X__g``8 ~Guu5wf 2kc4<===hZ~_ct:_}}رBЖ$333S\\LJJ 333133CRR ʃKKKb1222GTbXFvh4T*ETRYY‚r||$*++F Rێt2SSSh4, J 4 iiil6YYYݻwPD"fff{Mh4DzrxΟ?Omm-V*^/^oz/r2b) y^,?SgzsFq\o<#bq:nv;̰ʊhEans?^[R.Is]  Ad{zzBվ \v ɄFannJKHt:kKu{^$VH9bLMMjQTo D׽_o{^~RyQO?'狜c?]jhT zс9|[L}޿{[AxӤO"B"jV5SBETp8n\}DTRVVF,}W\\FdAAAxiPXaۙVKUAOM~ s1())gM~LVAA6r B[ֿzVh4HrAAAA;GQ^/rW3?FD"xn 'qmAAA~X,#VWϯwJž}D"-S'   EQV+ez͉6{^Ŭv J|>Pu\.v5 <   ϙr K@ DsRf #*   -^D 'fХ4    O[6~   EƂ   tAAAAx /GcÇ$%tEXtdate:create2019-01-17T15:47:24-05:00g%tEXtdate:modify2019-01-17T15:47:24-05:00:IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-plot-task-result.png000066400000000000000000010170001477354127100306550ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME :}IDATxwy|Nn  0$,YcY}],o,[fyk,ɲDRL") HOw#ws\U(NW۩ @ #iDQ4MP@ @FUU) HwP(o= !!G6@ @ EUUѝ6P.Utv(g@ @ "g/ޥ $I!Oqth[r :H;VXJChb@ۅ,+躆,˥ube[z?$! Z)\mI$ Ib',U$I.u8b/U|oHr)|2nu{I*oǻNQ@ vi:(E-5MGx_x]H$B-2Y^ir9L&3,gfSōj6ٛ1,, (H$h!28xzEfdd+Wr9)+EŽ1 eŭN$޽1 tvvJ8wW^PRP땿$ٳ F#:$155<6t:SS vZ[4ⶨxΥYr @{VCS @`Ǎb rزe3^LP`ffpXمŁ9fcݺu#]!4^p:C ]_TЗv!$JHh4/a 8w( pirfyH$` La4QUc*miڅi*_e綐J1L +A$8WE/`dd={,0>>bA`jjh4J2$8v<6&&&o[q:qo'O266F[ 7[n%p8 &Ot:I$"=zzm`41Mh<@(f׮] gj5cX0aFFFeHHdBAezzÎ`  266djÇ%1 Jp:b1I$aկ(PUaNt:=/2=F&xGx癛X,F4% %Op8PR$de簰FclڴA vsH:k}i0@ F@U UW2$ɰu6n E"ʌx8fnnш$hRip$ ֮]K8̭A42 "_ښLB!NZ@ (i ?{ccc|jp8{ۿUW]3,Zj+ߠf{]w1==7M7Ν;ǁS$wٰ6r LLLY׿u,+__pik/FC dhh\.'? zzzc5px PT*y9q$T ٳ8v8j*FFFPU^Yz5chh۷#GxzN~?fԧ>u]!կ000@gg'<ϙdʕqq</mmmtuurN1) wd2Yo뻱ZFK)AKKL*bNg8tuubVzٳgرcWwHx<r,irY %l|!G%.qK\i$ tSXV Y _^{-333s=q)<ӧZ gnn~y?t:cP]]?y$cccb14M'r0_ߴsizi>pF&!xI&Sfz5n6oA?G%!>B0{fvZ:9y$Ǐjett3gYz5|+W^_"k׮,+ 2,]]]s=,$ ^} g>݃il޼⾣A::p}q 7033ƍ?32Ll_{zB@6ĉi /J<#N#Id.+WV ,^f%.qK\Wge9rQ8s4]6%211I("3;;l SSS>85d2鋸ϒHıZmȲB "˕͢dsYdEF̆, @nuE?Sz{{׾FWWC]Nn&Z볫|F4Me%6 GCC=nBAOx#Gvq8 f3Y.x>$IvQU׋"̺uO׋b077,755R(| *d1 cF#^9 MMM\.N'w&cHDCC=x m6QU^z͛7a;x;illDQ6ŏ /  ٌb_믿Ύut]_h4vQU+V/vZ[[$tuuFȲSO=$6lر9sc6Q{:B ^;$O oҠnGUf277K*j`XQ›) ߴi3p8̩S'*{̔$ UU1_f3SlVf2u]'Lř3gcM8R$VOK+)ũBAEU/~%I\N8fM  ]/*5\s\uՕΎ;Xn-B[f:;;QZn]'[lMSYjk֬uMb8T;vp]wbYikk6mʕ+X,lٲ]vrJ::V҂Ȭ_}CЈnd21;;[Zofj~zn7n5lٲFR4wy'v ղ~} ]͛7Ҍhoo'Lb V\IUUwYv x͛7s]w4o+6Fٶmyپ};6m$ͱi&vիXB2nXb SSSM]]V-[{.Һ$޽Yp8lڴŌW]477i:{atvvbZ+vi&Z[[1-444/qWfM~V !TUezz,KK60LbQl6/YsLNN299I 0fd2WWyc2I&(LuuEuyT`vvl6fEJ] MF.j_ĝD<ŪULnw@ xb0a+Z(u}ٮ ib'v0~ZP((J%̲?ȲLP@$ŀVU@ @$y[lLeTu1 7YFcX,NU++Z BR/-,Mk9LEQ(RFy //Mң.rZg6qWd~gggiG4N>M6l6YH+ _z;}YsW ׽of5,Z/O,9@  Y(74HD,G ~NgINJ+zˎ@ G7͠KD$v/} ̩Sd2ۇxQUk^rF]$صk7t,K/x$x TUe޽>|iii\\4v }?3[lAQyꩧHR\qLOOp8$A馛lo_ul6ٿ?NK_TAٳg?):ӟ4={EQcbbuQ[[{̐efggǿ2==,O<WfddG( 200mXr%/{^& @ *躮f>O,itL&eo(\}|򓟤jY8 2&l6K.C$݋fʧtuu/|??l6ilÁ6˲f;v#077fK7ffXJR& ǃh$͢*mmmvm_kFuu5{/ԧ#ˑfIRtww^1 fF#LF̞ @ Gjfjkk8N'. w܁ibZ/꺎륩jF#^ٌQ[[c=Ɔ hjjbrr2Cz2cill( 6 ޽{9{,?ؾ};yzzuχb[6uz֭[<ZkmN'6l9s R]]}t(Bcc#uuu@[[7p$ v;^HP੧\yb] @ >H oJ B@>(,c0r9fdYdYh4V6 yL&|T*Uٌ.LbZ1ͨmyyD2$veD"Q-`۱Z(y:rUfwYV@%K:L"L&lFub.B@>&w8p@ EtX4iKEǁ^ٯKݼ*i~7a\L>0}%I|cǎa0o@ 8R0Gc@ @Ɛd>8@ @`?8@ @G~^@ @ x] @ BA@ CP@ @ `#p1ıa?] @ |l6 Ç*ZqE჎@ @ ~\V$2iEÛg/uvu@e+0,iڲ4-Rqe]*N%Ke*tީyGݕݖ->/ޥ޹(K⳥%IBBB/w_K::zE١ ]L6$2ٗe,Hˬ:H,޿k/$$]\$I.N9][rkɳw$ߗ{oioH:8o@  +_^a(bjjd2fCQr)2N"HPUU,*T\.dZv M iTUU!2P9 vt:4`) LOOp8FBpÁdBQ @A.cbbP(dn( XT*DQ{ N'B)(v<@ٌj%2==i8NdYfvv'ìp+~d,S)(6 l O0De,ʛ 0'b7T$$jLe$c1 | љ>:tnWҾTPv$#IQ΅j2 L%kb@ld bcf̑#.;C@ ex^N>M4e͑dl$If3$DH$XVy~?+WDefw"tP\UUzd2qyWYnSSS|$ m6Ξ= /#Gbݺuj^z%qWǏ~# .$wPU'pajkkuW^ycǎq9ZZZxg7ޠpQ^ydhh!:::x'~ݻq:yTUEQqHD",*72CQi$jjtaBbѨDdV0jݮ l^~Ho h *Fe50+<[U{ٳ ǎhm8|+8q€,CkkqP(`4ɩ9x'_g>5O8f.5ǏOH6љ$ s~od$?˶md,O>x,t7YL#i I|^dD(XL"1h\CyUEHD"fjBfgf<3Bh$%һnoI"`~TYfB'sa;NER82sM?SַѾ$F#1's*xGOMq2x=LbL!P0Y.0 0(\CLŧY}@*@8l0cTd 6MUWqx0 ?C 9OfC8;wj,ɜ ű!½Y[L%SS{1.*### R__OP@UU ^߿Պdb1W³>ˋ/ȗe6n?N8vR)xƍ*}} vn9^0Ojb: T'ffdQ0A(JQY&׿nark459#SSxENgq`|\/2ˏ~dW LMygHD U@ >Fw9U*j7ߠPm&SP EbR dWx- ,<vZ3g~ws<:ӧ45zż~^L`0[;1qJ0(qyFFd<UU:n +qGD]5pJZdYFTmv#|nssԏI@5F;w2[r&t 5p\l,Qrj8ZNWu5[߿µ Ӊi4Ӊikqht[ir'=nM$w$Fua!UL'q|3>Q6bM)>4>ك`axaQS,d)ڳuu=+00Bv?k߿r2xkZAՋ2u&_c{v::ƶ+J$ISaΆm_f>Ofge%\]iq _Dd<6Bf]^o|<\j&gvs?jfN}0F Xk8NNvw; (@ >\8/_O__?wСCR)4|+Z[[Yr%/"6\.'ɰw^Î;hooZlY1<󴵵qTd" o>nvf3&2#_(x'Yv-Fx<͛g?K2G?'NtwwL&r8Nx9rX &vMss3Pꩧغu+---f^{5t]g ٿ?>Y1͕uo]Bn)϶m*&|39fge$i>V,f3d2]wYJѰZu1vlؠr yRH$$\.c ;f?61:*cl imuj]q UUAI]r8:̺u*ޚ'x5ss2)r1;;iιV˶m4Re=\j>|rXd5S1wlB煖Ӊi&blJ͵+V fQgVY1Se"Spt(MFgU'YY/Y1s|8y-ц?b2>I c4992}tUwQ3$ f!OtVw~;׵^m[IwB !nnjb5XqeHx-^\&::95WQP%$ZYlMnRԛeo]hq]W`V̌Ŋk6H bMev' ;7H&gX.F/lPdō4.Pdda<6η{jjV{WSm&q&t f}L'$ ERhqp*x؍vttޘ~WNNs>rg #΄TDdIDf6wjjev98IL! 2!xq۸wX VS)jD> #/PmFd2  f'1ec>RnA{:c0&f=:: /&tS@ .]$---x<EqaTU[oEu|>6&f3ř3gPm۶qyhmmh4؈ĉȲ\15_=Jsϡi1??K/D"r9qlH$B[[ ,,,~zn&oߎn`ffgyp8w֭[ꪫXjl߾Çtvvr-033/KFFF[x<۷]י#GǙrqFΝ; ]w+V駟fnnd2IGGV7^*A_:Kj( :DSSQi߹SebBf`@f~^+  jK46jlڤLJ(\yehTflLuTFiY:;UΜQ+Vh*XrA ۶S`jJ ~{rr˦6FG#gs6|FJMZ]e#Hō, +=+ӴT[Z8Ӊix,™0Ñav6d}zBResM5^ަ4:9:s֕bV-j՞ռ0&ggCg9/){!ˎ[zle|$XBs3d'LrYb~њ@aZ&Mi0_XUhF VS1ɖ%V`!Ae~,{i]h,;#V~Vs4GAfwq`I4eeJ-efK%i9fP/+%. Oc^*eG]LvKT^KgiZG]יOSm@ ~\VAMfuGl6AB: n,'-.$wu+55 _ĕ@Gwz³/oۙ*'@ .IRH;|C4QBQ.. 1@ {CuҼ ^6lu]] @ wY_@ @ ~-] @ BA@ CP@ @ pMs/v^_w\Q[:w$!KF,{o|ԏ+#"-y* qRϿ5͸n x|>#o0t:1b9YZ8N$d}K`X.x<8,:oG9/fN&ȫ*U]Gh)3k]+RYQ$@p:|ĻzWe$Izr(J J4?c0PmKnu~ @ &_l)$!eݖ*_oRrYR]KAv֥4bAp)t /KA/ǯ쿢(Ms]P`ppʕ+ ~zf2C,x㍘LJ:rq*>u.+e Ǐgnn:;;uA }vn7===AꪊB c޽9$Ilݺ*?N"`ӦM477Wp1FFFp:\uUhÇڵl6KOOpΩS-[ IOfhhN:::gbb^?477iӦeo'tUEqt|Hla!e8\IBҚ뛚*R[u4c=VIc{{;&vr[}ĉeǩcr9>޽F__lݺ"^&qa, ;w$LrmFuu5Ofdd.V\L@ e.U/v`0ȁ|"~1d2<쳤Re7}owzMK& *o$I )+O>dE.C={Ca4/ͻwr-U5M{[Fu]P(+3ϐN9r?ω㌌p&''r?'O255E8&ryR333=z),J~*  zYÞvVWc$|F#}>6x<ԚX%Z6cGu5Ilfzct{'DQx+ecaaz 7 ÄB!Goo/Byַŋ/_&*SSS4>s ?0X|;$IhP(SO=E__/:u'|SN裏F wI$< 裏288o /Ȳ?9}4=%S@ _մ.pg2~,Uz5M̙3<<<:u}QUU%͒ޱBzd2yxyBXʅn'Hdx嗙g% b0HӼLLL0??/L*b_h4lVԩSlڴD"fl6s{ p^+vvvrwсfnVXQرc ֮]n,ټy8HczzSNL&[nfUgٹs'$a4+gvv星ppW3::8Dp:-+t]U4V9l % rq]c#<noi!ϣ*n747colnFvTWscSSܩ*k`(yW P7{aŊj妛nM0|\l6TUk2 ^.cW\qfY| qYTUe޽~TUU-3 ZFNOqF=ӧ曹[9{,GeR)4￟+WrQ;8q՘fΜ9ngaaW_$Z@ T/N:رctvvr7S]]lr T*E4%FI&U8})w@eꗿ%\n/4;EQ+ꪫH&?fxxGK 4M#Hd2DQ2LegD"QQ>Gso266y/߻]6t}ժU߿V+\P(D4e~~p8륫 cccl۶Hӕʪ**YR)z{{q8dYN:u%p~oñc32ke?lfzzv__ay ###<3|3Y_ TR5Uš(hQ:%oZ$I|A6nȦM 0Lr_?SAu|I, 7tS%+V77zJe\W$9uO0ɓKlp8hjjb֭HHgb6&ey.Xzu]g޽ɟ |5k}>; @ N\[[o+8y$?;Xz)bƍXp8|٫wW(y^Y/х33裏L&ټy3|4|5Kזڵ6BP^un&L&333ydeXƥ>L v؁lFUU\.[Y}zrzTUDkk+cccDQٰasVyWYj \.jjjx<˖=H$aZijjbhh;w)Ndpe˖2r LNNOOq$ ꪊ {"`ddYhhh`bb~lٲUU+H$D"TWWrWʊ+0 qQ>Oٵk|><]]] eطoBsαz]ߔ%Y4NL0`a$l.]^/$1.SUt6XTOkZq^@R)M_߃o}{"~<ַ#( 'N Vff$allL&C.^z￟H$B8f||VΞ=<. Ν#sWCqWt:2==g?Y8JU2FGG9}4۶m{Wc45kve#G0??5\,˸n,Kz`CP(w^ ^+WQI%DhoogrrT*ő#GرcEkGd2Q]]K/͛q< pw222‹/(] 6G}ʦM8z(>(|s#sfppq&&&bX,֮]07ofժUX@ W򕿽f0(_l&.֮][9bnUU|(ֹx^3EQ e.][e2$~KDss3;wdժUX,ių˻ګz0UUUgb2pMӈD"H]xɲ\lj\ʛ>]JT)|f`0`۩aŊX,n<+V*n72^6#Tz+k׮]KWWmmm8NN'DZx< \*4q8 x^,K,FªUظq#tvvm64s뭷zyu*H$B `Νر2ڊna4q\y+rrTWWaF#|o(& Q2Ggf8 !:|뛛i`0H$p\(dIHDUUlz4M# Ԅ`ӦM_.lBKK DQZ֭[W9P(zq:fll ̝wމcbbYEQ*[;RIM+lffUVqM7*cccbZinnFQr;hV([nrXvYXXfq-*Gf8>;&477@ss3MMMall6nJ]]]e9GyWD"bP]]#HpwPUUE4k ٲe [laʕofn7to@ ޽{bqZZZkLLLv;q:pwP[[)@9=WG`-ݗ_6$L$I(Q*2oW6卒+ z$!Wv;2Qe2>>,˴oOMMx*N eTNҙ Yzo.9LeN6 ]IDcȗfǪiPTV~NuX/{`QmW$ Y02 _ݽ6c1kuLr*o2VǬ-JTY^m//)rs*mg8] AK {Ugg%ͩߍv~5Tf0߯rbeL&T} <LoEZeX*JG* 6Fd _ /[g+yOZ<v2qx)-U/_Lq,[,U/^ @Π%/Lg;I0͸n X|>#o0p\LfjU!e͆$LL&lեo2pe2~?4!cY1};3neZY#,NfN0\lիYS_h+麮W6(S>@l&L@ , :&Kw0Yו|dN(RuED.A楮.@ ෝߏ0>h_@ @E @ @!3d@ @ ~\.G2Hh蒄I,i.IHHH.H^qkr- R)tE/IHRqGkI/C- h Ȓ jwm@*H&KHuy1@1ťSJ&s$$ E$"/]dCI:bXHEe$I!RN$^N>f(=A.PVutYG]Bo]bt t]B4$bɥ<Q2 z #Eq[,^r)pe]ґ)J孜d Y/T*#e$먒 r1}:Ų:ZiO=I/XCBъiA*.Uʭ+H+Z*1?䦜"RY-כeһ&2ːTʭ^.G#+*$U(W.k}Y\4]^,?W %]3V凄Vާ^Y).!IŲSmُR8_? Q)Eot4Pq#j1 K!jTʄ,y_+KM*I4^ҋuEGZN[4I֊ukI\TIG)9t\nJ/].R= q%=K6Jԯr$^zޖVҼڋJZK8ŒP*JYD$dPlOmRT!!k%*~aJ[TYRž 4wZkJ垮%M*Smy9TM.ֳRWT4 Iѐt"uV&C|H)fR;KzyOQʛi$/ ŶG+b.whr%C+~\jk^Ee+mTQS4犮JRIv[./#—Jm$!!hKʘ^V rVu].KHY+]BdI]VK:mW^5QV, z)ӤRZp`M*~hTiYoKzQƺR_^UꌎR_K@/Jrb]ѤR;A^-%KiIvRNH/P4R_W^ X)Idd]+G]+ߧ<R]JŶRu +,ojK]|J8@/~CJJR۬eUF(ownd2-LA$d2,˸\:bY? ن_H7+3z>܅$kXd+2;_ڟ`tQEbkPI~l}™F5Ask8pHdzxSx7[1Z8Q{W _|^24S]*}0{H.Nf(M\}?Q 2IFʹ&8,hUL²gϮ_-1ՙʎůxyz>Qo I6\Bz݋}LW׾,>,Ob-? RJV#?y =;cb GVWLueP7m)mc/gV>/:9N~ ]1&0Z+32zEoU`'%;eT+:jg{J#{SWbvz/7Pw5 GpXbNuYdC^5O]GBWu77ikl>ʦ4?i5+!?L:L6yz^3ם@zvkjd?rn:ճd}o6VfmәenUOnJ>k2BwUEIlܴIҸ&ڃg<Lk(/k{mo,n߻Owe[֛xc.0|/?}QSӜְnaÖO:'75x$b]/ױaV'zp2p*kз񯷌Uq&4zp5kl0ۦ1rFA-ڔ1VQs9דͤ_Dc"CthGH}Ȟ[Gu*A{l:J^ 0쬣ktK TzHPdMDaHt[Rgenr5-dZ#>|&So3뾆; AcF>qkXyJbvS۬SZfzj xټt e Qo!x-Կȓ]5l  Ȳ%{=%o-k$CO:|̑IZ8OR[83,öF"&rK}#T$X&9VAkuʷ? ?zfUjuUu[P>@x~5-G8tp8{ko&y=S< i=GOLOZV_5f_IʩAF^ϋm?J:Rwk h;/o e mx )w~2]ŏAIui3~VdS?0du_!Ds1&/@⏟\ m ms ~&>(/_f n!ukd]l.^/8]ˡTu?ҌQ#i.ca~1B-vRH/v#3j(O f$yc?U`]]T$sBt\@+QF:; OX S:&/8hd@k8F<_T{Җ%HL&1;N^+`TUq_3GIU&vg̿I1;gWIt"& V? Y<5A׊ovဍHc oZƪ<6P_I'3/YWc[T.l0Iکs03Mf,~%駪7D&Ho3{ NY1#Iz;gcx`\ϊ:?{Lr0ȡf\8GΑc7%RJU!9mI !"?ә j~\E] &W'c30Ћ&0Y`ʀ-sg3G#z_g2$?5O0DeZ;9ǯc;9mNڂCOq'G( Id9}{TEZ=:&zSf: 2M;HL~ 'bDaԌR_ '.~¶5~4I92~ hӟN17!vq;LdCVGIShId41?^$7=Q{X 39L~&Sv ~qp9?N!5I`2GF<$NTS6N"kͤY84;aƏIP,y Xٹ^j I5fbqr"j/u4=uO7@qj~2N '2YH'ԃ?T<@0.fLUN?WѦ9I. I'wO;14[n?1߫b3 'c`nC-9Kۄ&yb_ًß"f01zƋ1d9´Ě!Z݃Ɵ<Δ(HS"u&B`TgLx0%'ۀT";@"PMb(`b8&Y#$jaD|pYjmcMO FǗa4X tXNHD$, =~TjeX{!ez@oҋjOEpBXI:1K68CodPɢg ;?d'>DA=Nl*ɼ}s{QT;~5&ϰmhllo3:R;I/N4}wEA0 ?/Cσ*L֏)Y8q^PcRה#b]712H8c*zz'wϣ6? t/=nt2߃3㟧I1'3I ~jtc^G##O4iҳD_ ?3zYL4!}6rMxCAf:AuVla#NDO0ϠՅ]8O1sҏa'zf5t2 bi;a%zp}f#W~iI#2~͊W'Qfg)qZ{ c 4sxpPj{0O3pw=:?'h06o֧3Zz >8g'q^?/',5R~,^BZ =^N$t{zql}|DkOVx'-L[F9TT&gP,BHӌb2 0NƾYz[i53 ,2tےx\/O1ed4V?Z=a)$R͙NYf;Hx:SKm/=GqbM8yCX&?7G_>O.g^Y2&zc &譎Sꡧ` nzIAtqR!5$*+9yc'F1 i y丕>?6:yu0U y" }h?Q;D'Y1s|yIfˤ'c͞ST'(qD Ho}WOtNs|:C/=M)t9G߉w,Qs1?\1?y0Q't?xy5Lک1֪ ipwL9`!yIg]L'zM$cn\@p!F{mɜ'LI j)^L'375NƐa:ĉNyg/9+SF}=te0f FaWÊc&zc 3'QUo_VLRx<, :V~g75Iøn|>'pp1ff&AQ*)~Lq`KmPJ&,EQ Mܗ9\,^W&eP2*O& /3[߲Wd>_6)QyV2՗WhFhY.TҌh\1[nZXK͝JePMY4+R^jV^~b[ɢ2K2+KRєxY̢y2Sݲ!i٬wMI^iŌ%f̨eS)EsJͱm\ceDi hq\Y^QdX%&UEsR}\bX/bQY1?^d>Tɭ ])e^\nQ)2^6МP_j^ί%az9J&ovSKɬJ_DՊWnhTseP1_fzԭ~IXq;,mI\`TMqWC%:ϗZXgsPX"㥦mN`y[QzbM'eeM}ReO*a|(.tҢk%c<d-`WڥJdeu,#zV2/.ic(-I*.*gqO9}ٸ^6/m1o1R%)pB+- &1&esr9,ׅR`\4G-hߡRmgyIҺTn35i}=^4eRƋqzM$lditAUJoe2|JM\l.\ri b,/3qP+4KzW34iBJJ|,/[Wd[|*}FHbWdXŒQ.KZ1*˟j9Le}I ~;='Ҳ~VZv-v‹eRmG)~ZyӲnhKҒEm}DgXKr)T) $/;ҢK*,QG*}TJR1_*e7> ̗Q[zyPE4Kڤr[4e%SZR*e2TZi*;oJKd_-.Ж|{&I?:M+]tmٷyK$Ҵ #"uT.-!(/ ,%r(w|ErЖ/OKJ6K2Kul/k+ټi#oٳg BlٲYD"dY|>[Ϡ`:&@[G4яAGG ٳg~@8&sW^ҭP@ @ 5i,s7:6BpIBA@ ׀,ˬ]5k֠i*L.@ Ly#8I*;7}G(@ @ y&''+Ǭ,M] @ EQX7=}G(@ @ eyQjuAGV @ VޮrBA@ CP@ @  t@ @ >] @ BA@ CP@ @  A,S YɈ9%a-IHkvUY1r^&jhF\r@!s#eރAѪXFU#%[:6{LyVs@5U ƼNĭBƥbMkd qiR0bIv"5:TɌ4 Eթ'2F01bMjǐ2wC ygBJhBN@1T`(HbS`,0nƑbTQ44ҾdIV2X]5j*`JKزL>tsbpU =K&DE!hVNm0OnB4& =nPP$fD[RxIAALօ(Q;9YR&c,jnHbkH1px44K{L" )*Iq'o WPu`>^; " o41 MA?IBF Ԝ<`^':q-v "kЀrh;ؤA`) 4rP4QZ<ic3sH٬I8v@x.P0DЦ"¦KԨ:ݤò}|TGǠzoShzk=AhmXȜv 4v2N0"6ɫ _뀍8!4 ,PJ"Ê5f T݅S,3%$h]$ hCљ[ gFV)1sN]a@j)%ZEGC xtSõ-E DhR4b^ 3;c:,܂ 2Uу#ruG, 8"@G6F4zMAgѰsD"-FXH$imhtX5d,4mf@EP\Km&^UI1Ʈhu'Ǻz g}\1nԍo{.ANR6Yt  Cǡ !0I m* v="b[D"M݁c+>Cפ\ؐQĄ0*CyGE`sF8G9G! u槞P?|3|l ȍ2q^ic7' ] {Xs'[,4Q.~tRP2pS3 }7 .bP¿Z>s8bk9q=|~=$d`JЯ\X?O

-?>뻘'Xz|-wP2c̝oC}硃;~ߚ72߸/Q|b Yz ul?[]_l]/b7}κKC<9g>dOܼ^7`d$ylz^gr|n55?=Dԡਘ+͓yxa̖}TK۸u'Ķiݗ/$~m6v!cO^el&n98BSw)7.>oeŁ/kf0.$3#{2.%"#o#|}//^Gq65~ +S+~ |b-%)IDATL$_{7'nهCqbg>yŸ+\z/tFߎCl Ww]k/ՍW㈤siPw򕎛b~*~a;SNmmRs4{1>;?1 sSGyGkx'<0JX;s7̦rls/7} Fl |HwvC5f-3'S=pۼgzx8f`a\t7cn nלl}78++s𳥯.jp\6p7?]=">zqe$<;w΍W_`F¾/q-g6Iʟ_*Nj/7yˎ?d[xssXx | .)>Ls_-+ U;]z Ӽ< N)Vx9o{~VSĘ3=tMNdt W't?gӊ+Sx?`1G֗| \}l~\.ʣ(!rop+:vSk .E6G3{8a߰y4͛[rܽw}[=/_zB^_b[<·ˋ/ }kI1{B o׌ +M{7x&^ň️Op<2R{ &ybկ)7NKdEC~xul5j . jn 'fo靼3#Z/#ԟOsgfz_:#ܶ#tM_m_;ˆy}#XϓW!CNKK%wi F_I& Jpu;9oMrv W߁<_47|oOW$~?[\c8cy#/w񨺚 L=z+&i}޻ y|E/k{~`ykN>x[p\Tw{Z_6q }.3?[߲o伛>*lp?+.58^LϮCznfEȅa*^|#^B$-~|~G^wݴȏ{~'oGJ|jVy-xu~wqA}Rnc|9S;m ݽoɓ/~9oyJ+ܿyCW7Zǚam}!q_Ϸ /<=\d_X11})?q5 m{65˔dkov]þ`s{߹L]c/1ײa>dd앿u%|muE>)Z| ^)̅"7^֌bu:8q-?>4bq?Iަ (lbKǟ? <]]ubQ 춟Gn5 qr9\nƟ ."W Uz!B~/Ahv>־or-h"}/})xbt1@4 ^9 c4o:nu?6zNp0B6:?p/t;Զ5< {|~b+kN3zJ𞛯7>0.?Oį,kgoW^NW3S'o-OtR;ۆv .tj>*n{޽O0;{9_}>>R/#/=}?b;g~o7'.)ϯȻM_D=?yäGMxSZt}vE[^[duO;{]{ n9/rMmּ0{%{/o%7rAp}ʿ?< .6%7r(RG0M>kr_ Cߋ7τ$T͘ A=iT,Ƥzb'E@yAhTJB$*ʡ ٠ĵV.CJz^ 10B՚I{$ !6$QPNڭeZH*:( B|ϧn$ÔFM68eWJD=iaӣ+(xnH\ H ҠJyʧ FV|fHz}/ A%%!# D>Zń aTGƤK5\ !I%@ qH1A-wrJPhઐfU |< $Htfb4c+qfd[$֨kR4ܘ bW.ʭ#^2? !$hTMh5['U9ZL]k!!qԭAEW4 Q9!SA>DUx"F5k$Uix ڭ6cF*"lz^PkjRIC&DKӋ *lujSC>Q#RuMXH͚"nnLӋtVWKTΔz" 4dJlbU}S5BR =K{fCx=!!>uWUAwD6 j^*wfVjFOR1i6R\*&nEc߈mԛGYuZdquc>xՄfNQPԕ uDQYq1ʹ A# I.n]cd%T(QGSE4@ך]EM/bT6pm^HKH heBN4Є( >))InV Qǭfm(&Uo.TEB? 24)^9%QaXp]쨆xX9 P^ /7Gթ!@Q#t;"$$55p MMMOMxШ4=nO9A!TB+&u@$BRDa#41Q9"<.ƝxO5P+L^BX QVi&('x͈棚 GS$ik:rqCh]! C#P&B4Qn pq j>ʗa5Bw4U'MMXdIҭF&IBh(P/fey'HD+rŌtAyL)G)YxqUpьITTTwUC[!x*%qkĵ/mqXKl'MWQ&\݊"4"4A 5ZStl&h5HM[!4լJUjJ pCt%!g>f׈x/ 2t]nJӍy UЎr 4”v&ШijB՚(Pk*fB#M:^#DU z$ j@O5Du4\4TF: z h헡KZsUZLXTbfI&^-*zKiIXP^JkL/$=6a= RTdq#z&5^5OI9D5kDMԨӬ+QxU=1AixNC5 ԇzf@ DvLD*&"* uR(PmjD -^ Usĭ ehAPOH\ \GcFITեX0Sc$KqH$#*AJ.})Qw-ⲃy‸ &$UuIfGDxĮK* ZƕA5 2_1_WCdsB"vFXpbj&!5Pc}gvs|8<ܻ*vAq竂qUEXb.VȲVG+p:F㪌zNs:|<6b]\\7۬fsueXX퓋r{?7mFmFmFmcg}]kyiJP<"ZC$MSRX^bamFmFmFmgAOӔ;3R( R/}AmF?qswOpY^066Ej{xaW{Bh2Ȏ1hȎ=ux @Qǘ$)Bd55B*J4H@#E6kZ!FD#ИZeO hu-F0B*PRzխꥉ 1uh}&~!~Fl>ZnZ](thR/Oiɲ|xF,+ZDټ3 !B:YЪ%@.٣eZdfrh/e&8}ՙ̮Ԛ-dKҿߙ"3ݴ.t)*\H[lV+Tt$[V5t62lݗVK RK}5Z,M@B-T#0tԧ$S\1Ųԧʬ[R/Ń3{- 0Icxohg)XG%Y Yhݻb1nFe>E6^"c+>%jiB,r&ҊEZ@胪%)JV O[W!Э~ }zYBf/Ӣ-ؗK!(%QB"C_zL.m0Z1$"|%rqF(Bg|hv ҥ\Vk B%["g,-[\7 -*a)khђyBc1}y-{8iŊ-k=`I%k%+*并4[dNB`|2ZHoҋ{Z P2ӡ-[6-+Э|6Z,*b=IEk頥,YfV, :&r`:bvRk܇閿}X]-woE^ -ph4-?002y{[N?<(xi)篣1έ>ft@Cv^v*N$RLNe("ИV@הC1Cܓ<Wg!:844yB.J d7(3΂͚pm?KFlG2%f65NIQ>$$;9̨Fu.q Dl}Vc6Yc$.IᮀMr8idHlggNj X`)UyVc^css͠C{M໽Dfa'z׌8aeg8H&u*e=L*$I"(C9c֐9 (ۃ`GlFilg( BO;L9B<҂H42+w7:rҡZ ?e $EǦQ~:/)!n8U \rCX"7nRJ8ܵp9D)a^#CR}QǥT]e&czOmO9w{f'sg0Me>%|g-$v΃@65DiH{S[1 US4r6y(=29OCbKaa sہ%":sveN92':+XrpK؞.0gcU &Mu*tУu@o@~$ Nr*OPusFig~dŒ˔i v;ĻDa01T\OW 6%h"Rir GMiNzIƦ|JV_ KT.r>]S6/Ph*K(),Rtv]E8!&"s:݀t1"`jT$;@w n9CͤdЛ9Իީ-Xt0 6\ЙI7ZdԜc&|6ňbK#=xǶڎf vvop=tRMj=Ef~FV즉WGgL&>P&5\u:뚡Ni'vݦB,4J:z:/"ՂQۉ/b'@hm``4(]\Bc|D`3R\mE\i>LJº]X`XC 2͙\a|z^1d3Ts;M kLM׷4[ iPaa¤Ck1Ef ljTM61%]E@,]^ {YU|C4k8Yd@lPI+פLC: ׳Ý<(FXKy;ع:w g-!6AW ]EHwD^zd, M$279CQ{L(tT`?&$mvE褐@@BD7:0 &%~7ENQ15WF7]XGO\2aVxt', a]HB\)xgņB91g"dc܆iYW\&#V65{P.& lsٙ܁^~gj<@isB2ZXW Nwr (OO=!vl5 \WgtJxn?v @b*߇IV8LS o:Y1#!}GVH(]zfFy(jڇYa.1 ;0- {鍛5Fn֤ebG=gu|jj 6yf<>g>n&V/V\,)zU*F|J&VTsyDle7F#ϚS|m>9Vvu*#+Q z8a k3kcܵbGk\aFm׼kɝU<8߽?:.;T)`gl 8{Sxn3=wsz^A&&50F9Xuz ѓp<xkkg~fיqg3''nĝ܎I%~:>Jn1D}3ZmؗB6OluZ+Tdrq{S:u{8P0Ǟphc;r_,7M|Fuc0u!蹇L<׹3WpJχ6N>2|. 2GϜ;nr󆈻*w%Oד~ 6Bkn%[ҽ3kS=DB`V)q;ѣty~p8>~xYIgCص6e0YguX`xM9zkche F X8u9fT>.:1*쿀FO$9|yB=S 1Z_f5}XQ20m簾Z*6 DuE{qg ຣ 2gtu׳S.fO_ő2&9;ijM1| ^aäRx9\S>α1eTg+ddZr?Ϭ݉BRuYg3ǻ׮eͬZ#o6ڗ2#]_$.<~7$fg/?t.ǓU;6<-tax^ `l8^؎muoabdw`9M31ԵB,գW0c&;)AO+eڹ$/?&qWs*kUMnc?I6I΃7ˬ<:?6daSo<ٱՍgs, sv}穮2fg8E{ Y?͗X]{9pnVN@7pRdmK6pG &&&\MU (oq h+gN ‘ٛ?Ȁ=ꥨL<'bN^s1׉ibl6>im"=Oiz}'i.374~۶=Ʀc<=^14OKXV\ïp͔n(.y []<_|] 0fz88s3/򨺆cc7Q]0ָwbׇ1D]G&gh-sJ PW=Om"zvM.:ck;b1B@$ 4`` rӌ{No >9x7=nB!yMG$BjH~ꢋ %ёkټ^۲1O蠻cseϷ!!kߜp N{t8.J֎`\<Tv(n/_~3Q\da@rm ;RMfzL|'9v: .f>]b7^!.:ala?[17N "#]lLעיjWa֪GKY(gyJDhm$^O(0n?3EuO409H~$~Ag'ws6::5BGmc 9ؽo(w3LwdP Ǟv ;C[n&E\vC-D:֎'e qͲ9#6$#C׳s˃,dѳ&3=W񖯝b~/Ɉ *cl<ˆhro!fXʠb`8{7;w>Bc۸ץ Mئ8æP;-œ(D.,Ƒ|u®1OȜlcbR[UgNtl-9.,7|u#">zSNvxS؆m ϲ/:ijڠoڴ)FFFh6Β$ \s +_J&]<>!/쿃.SV?.|Ս>c}ي^{~vw(٦_J׊~fg|=tÉkA|?HwL]VsLA<~4zb5>`9qYK? +F]>x?<Lg3jΩxןv"H&^g^~{53>Y|wG!ݻ>8߿>,¶m.rΜ9b6~?s w۷o糟,x+qmFmFmFmYm noD)8![ '\p%MSKUqED"2{0ZH)kB"h~l! YRd )ZH!H$)6ƊR֏Z~|G6? rQٚO͢`,"Owi9!UW HDKg,) h`qR,ʫWɉ>[0Ra,'esClH.y~bYD-˄ԏЙ$˾!Đ [}a SXEd&B_R,1MH )1e[i [7M_ciz5@(# ,&Ġ5ޢ/|k٪d^SVZBba\8+bW#Zi,<[?{\=ĀUd_VǫW5gZ"V:1ʮKmnY.ly-򋱤3|fɶr}Ȟ^H#3ܤ,[\!ehkVW%yc^$BL&)2Z++xXe Z'![ϣ1V^V,.mWيED-$:Z)}bGVrXR䊜أ-|5c,s}K7e3ߕ1nGC|➕Bn+1ҜE;?Krϲ?f4X̴ymVpbrh^e_a/hJ^lɲ"eylJڀYb_aO!eY]kQK%[`c9V[E^P1Vr,gs0|b)βt)~qͰVqke\^~xyﮈ[Cdeyxdq}wp,%{:%lEujYd˿jNm Ye_^%U!W؎b= 6,%+cSWkUuFҶ~/robBV[\[oQ |(m^lԆ~$Vhq/ii"xzÅXK-IV"Vvh/8LSmždyoĊ)YˮZ._3Vpy-o,ȵEFUk%YEbE~nzu5!\1 boW( c,NQjgd|yF*L&'#X= pk,>{!]cfI,s 1 cYioCMy*!5]{8nP/n&㨠L8 &Ϝ`Aè 3:7\h5vNFdI`nbj$si&h8v*M8Li9u+1VC&*Ua&g&9pk<`d P) EgTs ,9hp 7Y@ƝLOMR/&}QEC69떩/TcW: 8X8D0mMQrNpڞg?M:䴋fFrx%bOF9 3LCAYJ|1*c0fȻ`hefP.EwYpp֜.f 81svGjeTS!Fizg&HYhj*20Eq ʴ?ΉdRú_"J4OFLFӓTj%œQJd$:CrD I^.2_oV8aycT-Ƈ98}21S+1㟦n:*t%.+TOrD/2jL:Ch|0RZ22Ze,>E\pԠbTiI3KC7s)%j5߆18̞[#bLv`zM0%C.bvKuf}hIf=f gOӬt*c0R(s px3.Ք3!4M/03?NR*PƤ|#4Qi1<z̔b'RX2$' 6 ԝF'C2b?Ȑ:0ˬ>8RϳPѤjå)*%x8L s[V9KFTqrFyFš<}CO-3p|Q͕8Pf6b&|r!Lc`;pe)f$EȥP0@0gS2ΑZ4ǻjx`D`LgҪRY礈HR8Vc;Ic6ѥ8V/341=?yDa{% IT=Fݍg~qIO5fR1)8FgtiɑɉU eϴwSz ;2QK( Ny,z8S:>O:۠:6Ա&%D>`/7̆kGkN7ǜ&X?ɑjbۢM0g~.אC 4N-2ip:n2;aF6_6$& &iYNWm &QF@ioJ@2=NyS*MdTyx CW8-s^B Y-n.F3T™X"dʯ#G}asNJTdn(*+|b,pүQXBm2F<4T`̜"5*pq5aDeE;N=:DjiÓT.xefNcs'& ).4ب0SQrTq$]0\RP4NfL,~q f)yi&jjn婔)f9L`Y22*hև(#4zı|d4i15mP.'iiܘBAnj$F$aR"0̀H;Ҧܚ2MI!EX9($9BB*MA7{li V#\'#o R%)O&Bwe<۪k- 5H< #,xĈ ;lJ0R2 2REl , Pr" 0 4q38DK%(y" J_Ĕ6jR)1E-l%M$<b@BM.L-4y_:XTY !-SR5lXJ։DJL++&h#!!t0UbLJ h+IR$F 3D*pG 5IXf@8D1=C&҈)/Yn˫[$J )HeVVU"L KǐJB3vB*dLL* #0)bbH判2 S'(3L3_02#ʐFH'ЊDX$XEbiBlYy?'x(HE,cP剥LuVRJ*D;c SD!S4CHRRL8aKibObFXD$B<&&1dw-D(Ij̈8Α[ńiChm,C"%ȃ 5/iaJe ISX.3UFJJ&/=Ҵl G IшUfVψY6RkJ AN:H%Zw\9U5i$8 ŹU`g7eȾ6jisUƯaʖ 18E 6&)NK~~J%v5Oġ%BԮL!1 @㈀ XWpg1S)щ\ IcÌDd 3UY%gzI%ZD$U0EH%eeZPY>KXOl[6`8#AHDw1B&hO$tD)2FGM+@l]DjLBd blpZfK\JZ+HY612 LJY9_S@`"Q62(;6 t\ MTY6fkuւ4u&(Lq $hSg9^h8)#ЂH;^K" +UYHMlȌ'rDJVJ0I.IlDJH| 12JE1FRDX "h+E%H# HE`(Lhe`J GEJSLbI\{ƈBkz۶[u2Y%^rpբFmja?a^rƍFmFmqmFmFmFm[6h6h6h6!CkM$I;R%6h6h6h6~0C{FmFmFmF0M8]물`RzmFmFmFm^Y|3Ao6h6h6h7mFmFmFmc6h6h6h6~ ޠFmFmFmƏ6h6h6h61@{FmFmFmF?hoh6h6h6h zmFmFmFm ):#&IrhIvRlG Ar\jQBk6(1oY(!='&2%B-LRL :C&E C`iEDF&vS 3 9L#M % &*Q>DKV$!2AFJ:Bc)%L}КU1AB:䣄ؔi0R\ˡ&*ȑbH+L*QLRl@!b@8$T ,3@D&aa$&~ҁ0c F?-bCc&JsX2"A&4 Ѐ@lHL7 AsR>1&V0eLhX*5 8HIQ4!5 EH<1°( ȑQǔ h.t.F)H0M>0eL R`K$V1k3?-;Đ9E) <%(I-"G8}ElkvH10I0So8!(Sce>)XAdC>JIm@X1hcEdqbh 7mAhHevi ,L3ѩA((%XNR4+&ɥHHo[X:3 ,3D"*X"0,Ђ)1e)Rj($VQ N[B(!͙ؑƈ  ~kGt1m`H 1F FJJ'QX!D&iTHj+|$IN!E>LI B``G#ӋTDL5Ď^GblGHlJX&P i#alhf:m!2݊*L$Z"̄DXH&&1Q^c$efq#؁@$/P2TtF,ih!H⼔0"BTH3.S "YcRa`ǎH HmE.N0bTbaa@QJ42$"-FX2D b !Ru,H%$NRLptȥ!h4$$cPX(H T Ȓ(' Z@ I柹$!4 &Z*U֒0q ۤB1VJ1&cJ$;Dl`!J" rQSܴK(aJ001Q^aIN+m%Z!"PbC`IJ Hey.5PʤiH|D:g ba6#ba"F0IQ!"aY^L+@#P(󷦓8Gd|NMXL24eK!|A\L(1B*H%:1i ,/gKHG8*&TDւд( "$XO(ma` S!cX!EJh$D g 5i`-( F` N uq iމL#M*% \G)XH5cPt5i>J0H- 0HAu3\ vHQZ&v1m321Rs5"2f fBA 5Q\1)Q`Xa\%R|LHGxC(-lbf4HMhd-J1M\H`ȄHB#gxIlri&9ij M> <+*SQtdN"B[Y3|&$BLm$TLD*%1260E0$p rq bF FYDt$Bٞ$򇿝noП'_QW'~dy3]gn;>~CW ||'kXw𷏾_Dtwm#tl=ş\RH>IPȖ)c]Kγ<ɭ/~'ݲ|v_8}8n 7'.Cthc>x!_|W]1ԁy?w/M; 2^|6>Z:l3;}ܵZ2bar1Ol0o!5G&.E^}5Cb;Û gR9>υ׳1l+wwF$^wy|fj?0ԋϱOc9p轿:^Oṃ睥PfwrQSrYw8D k+Zqm0W][y]˟x#a_kϱşL9u/D 9o;1}xnFz^|]jy [,~B^tmg$k8-I a././,2|aC9|wWEӘ7ټۧu 7o@+|An>JƓw[\m|G_^w5kkl ֟`d^V5wMpM ̿U9Gw)W$O_,nW~o\ݿ35Ğkϻ+Z2t+F\Fħϻ-?=s)jqx#r^ΐ58q%\j?olb꼄s8cjrg*[Bb>8܁(wѫ/"5{YrTm~7Q w-7_}2_ t~'8ٽ}LOߓC=~gff9^q.z\q?}᫸p73QՇ;ű{6QQjσ8xbL➁+xqNӷ$+`ٯ"E/q+p:~=W]/l<7;cG8A4>yvCwsk ;ÝWnX*jCwG1u!v~!>)j _w}{0-L 48$o9qGg~Gػ>^Lc{g?ŧ^2Ht=7|s[x巧9_L&_}?}rnP9tg#(#Nmyfsq^})MIXi:? e#x_6 /?wn_)9ҹX{:ƭWo*"{ۗmr O[W>\Z.}眙%&zq75kN?½obˡ׭]6;GNz_UKOO"*|a_ϣl5Xwշÿ=AG4eko7r|`xc]Ed o|ųX뮫̱݇_4A  B(-);Ci7ZEhgvbc1Z +2t"! 07n.__o+_JO/ XuqGw<( o#o6'꼬yXY87k|~"|*^~6<%|HZ P¥p N#pS/; fz)x媻NpMlWlcewJw٣lP6}IҔ&ë&$k`g;a0" q  ]BdK+һq&%T)׎"Yl$x4M6OG>45W1Ii]J6Oڼ2Zkk}vAIRV- Pw\D=%>z匰/u /Qݕ3 7.FDnNá-i4$&'l)w.EH eth N@Slioi b}~E;cm8%f%+\$֢{-bHA,_۹]v5c4ٻ{zp@msUatB;md[F)贇z^X&B.K0!-FJPaiv,_FD4wJ܈l%;wd{/jY] 51m$ ]鱲:j}Lj/ z2vrihPcps]5Ҙ .wi.n46׆.~wNKK2Ҭ/i&WV;B`5!zR e ui# tmz 4^JZqq,PWw޳Np9qs9r ^CqݤY0چ[#`KhS]Z$ncvZqPkvRB\4hTSABVb:Wt_i3GaMlvyb:6ݽfK%rދ3ht/I M98:& Ez)D.;)w86}jm0PzG} <46i.ep #:"abA``})rGSq ):&r/ec]8j$Gw<#%)b6z.VE7 ^j2P0۸ W؂Nrq UB^[AàλNFoKzVh.!z;= +q5EiŰIT_:F1VjLp Xvj3&ڥ]!i#;+.:-t=J]d):6͕HQaBxC iigzD\ۣ1mtJ\oϲW4MvRC:mg+!{w 7;6}ohۢ?`KD;:Q$ •Ϧߥl͋-Es͕Z> rvZ//UHcP]('o_ :%NV̱v }M!Kc窓2w<6#ܭrBL*tVvz}[)Y*ʸQWZY{R S؅m`q٣l.Ql;q\gatI/5ѵmwh,IZŘS{[B5_Q_^N!\_x:ŭEt Q]+k%Ts Ռ`a}X^mv{2qݘ#mTaZy9!w-V{V}`PkGMIzQV" j'-m5CT26_ݹIjk,m hotw"N= cdPh V_m0 %t/GULZY㞡4l"2Woti>ao$[e$ңYTwM1^g\v6"}!MRPx.AetG\vE{rScPJe4m a=޵!Gw &x ѻ{ WF^ڥ[rmlstֱRNKhX07^lݣ vh>MXhl ]ƩWiN'u)\L@o_C6Ժ\ZPv\HQJZMVlv\FcO%U^FolYH_v2#4P/wc۫MRWc)l)]:~VFc!bo p[!26~HU2W.i*ҍ$\bXZۺb\_:_A.Y$ÆNۀ(&i_ ;HW^nS{9 Fq/wpjF"Vᦂkt{{2AXWo챝'_CevMY7rO @ !q1MN?ϗ)sLD2Kڌʼ"]~B}K钓qs?K̈́&)a &|uk1C0@)RH/$BNۈ1"hsG˜'R1'_e,Hc:!ghb: -#~i"k~#E3Hc2EtgDHS0Klr1cFrS}ḻLyY]7|b"onb bo13)tLcbNNx?Ãv)-鸒>y}Myx9"qft|oLc¬Wrwc&~b6`c;×9g&f>cG8 rFF3ҁTrghƟ)jM0v2Ĝv9cʓ}uc7)r2~c4Uc0Frc71㣙T$u7cb߹;]0F6t|!G:& 9C?yr9_7?c8*>[4)&|Qfu#`6ƳIR]'s6f|M6wcv6v/7Ě Yͩfq.71o8T39Gtq5e^8nOTczdq)l!.S(fώ6u,_3=w2~ԇӜgVrwMsc_yƛ?$n9c9c9c9~Y)ZJt?v9c9c9c9P%Zko} 4y1M??aii~8< ׮](^??ns9~ѭ_BZ>k4&/&Ҫ(!OgCD輹+"QW~ʟ2hFGm'zD BF4:#!)tZ Zo^rYO矗T<Ҍ?Qz 5dh5*J52(=ԄEc:S BM(}=yt2d5SNx6y"\|@# #h"@ѹp,y3_<=hgh9hSPr;ڏM=X5UbBՠa^$fLac;)S[;1]Ψz"᩾Mi*%vHwƿ1Gs*9ӱ#MWUhT&&艎2K<>'d|Q2j=z*̑;[7?hDs_isŌ|gw"G9mdB=ʩҤF)3}ާcd~8Xg йKpa11 7K&cXojjZz)Ge}r7rʃh\O %="ȟȱؓMuiV}1-mzۍԣx8!B*ٓ:lѯAəA$g:g=sODn7gҥƮffIStMoIZjnG ȱc`,)>4;Xia$o"131F5]gg+9qr=S^Kϸ<`C9͆&:G_dzT"TuifffƞzdSRe =#I1B#x6y?ΌsqP3o|$OMy\IMh9<}}J<4L23ی#ok}DOfb$NOg1c#{ it,rg8aS]̄ &ofq|ėNun9NdrJXrԑ̤?=FY'珕QrDz_~5J&Pw/_|O~9szΝw?q>/ @ʕ++ ~9qgoڄTC)6+8f(L1Qg5hDejaqA`%/xD$l>ҷQvʠjP S$rmNM" =R^i0t1.h3FdQ\,"t4bPtXN8*a/R-(;]QfqX#uge ". $5v.TY,(+C*fa5sXd%'ֽ p3pLjX19>T.+DZ 26DG2CCǢO Uނɂr;EddP4a5c!8uVz+ȒNTdOc,"^ac tJ%uhTJ4G"U+dG,{HHPN# fe`)ChQwYLOfJj;Ytםeֳ6jͨ M>T64M{#ITWjJI@V\¨^&B u] IX*_EJ"\)`db1d4J LqrREE{*'6% YqAIB RD/ѷ,p>B:ѨYAd`_]=^$bJ9v!%8*foo\{EU?aQZ `UvFM}.݁6KjCQ. GyxkЩ8AФ2cK8IJkae6kK.֨>k{jC*MTAqi,z,"_j2VA60v[N^\& j ʥ[q(td!TbAP#$];t{qe\%!H+EE5 ҫX8!d1P$!5?S)`dlR)бr w2JǮbضG`_1~oAFA&w3ja>NkZn24 d*d@6 `BzKʲ]œEM-/lV4[*BǺ_ݩ!dFx`Q,⤈g tH* 偠]./ rtt,X b:n*31di\Kϲ U6FdPSGTظƅ)B۠EM5 :%·XUҡ'De UA*wpbr_zЫ.1Y(1GJWRbJ;1Y } Y%# fv'H ,>VjBfB}U.SbDlgEJIL1l&.( &+Sf^2ٳY$&رY)!E*q ,*IHs`khҩZ]$!¦u\eL Qt%"ReikC-Я\‰'xYYYXw>OS&'G0M۶iZu]JE.$q4c^N5tuHP c3\\[_Ы XE"A&WP7Wx4ε5,pfsw]X|'<ư3IwS.w_S? /Np *\WiTʜTzU[;ɏ?^%"<]^Ncg8vxėg;!]d&RBu']JroPl vVqex!>PcΟ, b {6!Ov?Fk]c/-'h]잿8"l 7 Om/O<E`勰u-$}NU|7w?R9Jᾗڱ{Y{{<(w?E½BTƻ|noQ υo}L:qS.Z]eU692 Xy9dŇ [$~! 3|VWyg<σ$O}?أ&9Yv=Svhy⩀*ԭU?zMpyAkƥ5~Y>QVA{GW\Xye]`|rϟKl/W9XYIDATb;l)8ivOiqLů_IYr=Jc hƅ ~C6>ȿGPǥ5{|'౗<%B:p5:zqmN[zqEw¿u/pEEs7we՘uvwD<O8qiދ -?g^`O٫VY-m=UWrs+i_v/p:jymںye/8+s/N?pl/={٧}GンW'cxɸ9[r Nȋ}l)>v8ŗ߽E5ܚ7+:ݻyw|;_y2Ҋ>·~B>͟Fkŷɥ[)-4v̵wws/w;&^wyn^y+"_}ϯ N]~NP[:6r3&{Ͻޖ;.#R/cmc>[Mɑw[ERoY1sko#_z-8*P%Cvr*s%]뼒=@|nb%rIltNԑ;9s9o:WU'?xshS.7Ask/x2k} !;;{/r|ۙz/s8=6xлB{⻏.Pxy pѯ:b]|;?1>~mqm;c4&NQ?*.{M]^Z?mNW_fR?q7kkjċ鷓Sミ 9Ǐr<kR^!ɻϴOngWy|k?V?WWf1o9"QIdgqNl''Ẇxc\2O|:6غ/܋)ߺ,zN~-\9tʯگ++nT*qs >O0 !/oq)T*Q ըl#/(1U "/VRPy)Fe T^7d>%Q2A&UWH0T^ #/QD(< )!0Ԩ' G2I9)TrD(2CqP:۬5RddBbre!F:J9*t Z Ei-ZdrR&T>/- #=7#ƨOȴ1(!RdBXӒٲqPy2/T"/ɤD J$B $9]J@fhm Bk@ =1"y 5Rd1T XhM&DQ LZ 0Q9di /B`l9/O79N8HeƤ)6夜MK1)+5 ɨ<N^ Fiqe>'FpJ!fʜfkJI1)[RHRsT"rRe*o3.ٖ*CuWfK%S;דq2בqYR#^ 5-xT<n=L=*IK'帤TM&PhSM6M!*磑3IfI)c&s%hjT9-ZQI\239.9m6FmHsUBr\޳ez~GlYE(C2r}" !!5r27]=UejH j cf&?A:;I>D9B#&l}dۨmGB 'J楟Z(%"I 9J&ԜWӭ;J@*d2_C写* Gq@k9eF:5>r/b=.h TMgӹg@) FSqwRnF+9yb",v%CfKGۢ!Gicw6rZN:?qF^>|G7tK֤ 5$HIѶ!rУ-=J<|]UDmN1&6رX"1)5y}[<}t%DeĶ[2ƾ\6} %jʱqe_4x+`߼ڇ'_MZܹsEN<==_K0~&omm|u9rGy&bv׌tݡKq_^k5{c|5,fxWya۷ +!~xu5`vu;?R߮-^ 7 UOSoǙ)Jĭ>OӇ<|+t/n:!-;~tGPfizxu@R$DjnY @%2jRJ^ ^__`0\.SV'N>[ 8M xa.wlCMFO&$F'}~g0;J$cJl_w?Z'h0~oV̑wi)gfķ)?`3>&:S̶)'y4ur7l;13w>f̓53~śپqɊ9g|RN>M>oFbzο֙;޹ /DO{?/f3I}z1QV93/~=S:3C̾sptr?_6&6Sz>]7{nS>}m{_bnn;4yy8kYOd+gxv^Ggu:=ݧlЌ([7s<}_3nFuA'm_?9S;yȁ>ccq:GuXG~zlz_>jߨSާL}}z_yYFăYޱ[ uGmDg-fǹ.f9=~8d?cfǔy̸㐱O.>|z|ȱ_g|I?{\﷽  aXSz6;gބr^LL gFo6?s{7haLO_7_q]w/f]ݸ}3.x<%9wo+f-۔Jڛ67+6_0M^NZ6鵆tbک뵨'~Fڌa  -HMn-v!a~G[xIJ'zfwt=vBN'Ꝙ-G.`#K)M4= `z'xg7Be7I>f0iM2[={dI7pGk2Tt:ްJ?n >.LGm:.g1pE[ ؎}Es ]>{cu?Yt;팠pwH{Zavz6~wvk{x[.aIoeҋ \AF4nofS>aI=-G;lӯh}zBu[T[z=`g*Ia^I4vta;w軚#'Oc! QA'u46QN;KؾM)!ۡ` ]vB~|t!l7D!Bh!R xnwp[}I* َbhh*60!n)IO%=txqBQ͚D"E'&isפ4=!^E׷>k4^;$ ۸j`ջt\դpm.a 4:O3w>^v]vf|!NҲznؤt]"whx.ʏtuC k@6hfvXFإ7iYm﷉ۻĞG\hP^D=MH[ 1^oHw&6h\z]oHh3tTD tb16ىhC&?o綷vǠ9 q6aזC0,7[(mRO:YBM9;$ItȨAu}z6qk"n`x6MG :%uͬD\vFL0t(A^6dد O9uq fL;+nGi>Cٱi%6{!mMۦ ; ?t>nC4qNV!-yբws= ;tU&~a ;mt)Cwt=mަwqCܣ8{]Cbl7Ao6 Vnq}vC^H=kR]g+pavbG {!V07l KC7pnZ`/Q4(- he]>M`h0(vH}`'HJLP{t==A/3:nhg'&~"h׉{Eb bA3 [MMj$ = "r ìD }1c;pٓ}.=%X6^A/ 4AA>Oh-Ik ;awAEݥB'v5Q7H;Qw:aEk%n_l'=KЭUN7 1~È^3 ~^s"v=݈פ{ly>n괓aw1,щZ>oh>tׅvC݂ȔI+hMvvtmuw0ug6=,6Fǧ[rI,vxCa M/Fw[q#rNEmΐ_' ͜FO젻uz>nr5fc]u:=i$A~c0%?he;`2l\Q  prno{ꚴz h% ~n4R =pf7CZ-ڴ܀8htiCХct6KPw4![*i7=>CE1d = i75hwu`wH.[È>]M۴}Tq0Oz..ɰGjt{=;qVcowI,h]W1xsE۝VAӡV^&~]ݢ7p)eR"* {qG *nkIdMY, S&ZL0coڔ<$VS1zP%,aCe&IZ4H3;P:3vW0T!̔.8H0eo- U?yǤ-CjG,3,"J6)5Ҷ0rŵ|wB;W6"baa Rp9MPfnMM 3!$,B% +x͢٦gTeEր xG0XӴYV]@tFO.)cQ5 H,@T61%$<~w&)*Hm ֐"!]-CʾgU`Z#0b2#P q")b*Â%4''QPS Rp(qejIW( U\B]].RaS8IF6E=Ef@0.0%fV4XZP|iM2K&Ėi[,5(e 0APdjNߦhQ)xE%ǘ2&Ţ J6ΰuUl*+zt ,#r$*}=ΒI-(% IPƈLKK  &:3Ul ]E0;%&HLh;e`!TV #3Af)$S)4aIvLy8{k2V#K auщMjk"J[js,qIa!ʭ]\$Ec@^XD (C:ǗFCYa- <%DZAGdqފǸV1^ReM)JTҐ"׶fnfuS$s2|0UNC0$t$e*q)S\&)ea$uHW|8O]2|!-h`Z3,K§T-$Ҡ  q9$EE) L]ED8ڤ 2'paLfjF2:3' k:,CAZNX(zU'KHMDSkaU .@-srm(, )C\M13V,\ZJ3 '"V1b'ԘQ\A,2ӌݥ|X<Ȱdbf(*aB (SbRCL ZjD*)е+L T8'Y8qUy %D#e70v1RJmb0}A4S* 1%Oc CB&fI * aX!+ XTg,2dWEE{P0p 6a ߶pTZ )XR`(KdʢKAD$ `%|-񋒚aXHL($eŢaP&4/9Bi Mm"0_]0|TX(ӳDXq̰,ѧoTdLf@9NEl_6o*@[R%H5t Jv~@e&Jdz $.?uLV1zx5 2M%KPfIAC) U6KE\BJ=z"ET%,t%d6Lrl*ID\@Bd %,dD` m N?~G?}1ҷʨ0D5˱KK~s3"]YLEPJiKV#A0%|A#p4R ըMj-8 J KmEu@9 10ˈR* +_ȐCQPQ]cRTEeE"ifCEfa<&_Ŷs1s1s1?/c9c9c9Gs1s1s1s`@c9c9c9cs1s1s1s&Cq6s1s1s1sIBen4Mov@c9c9c9c7Ap[. 9c9c9c9x!W^ӟ4iz`ɻ&t9c9c9c9SVooPVy'XYY|~L W[o8Xh#͜[s[Bn?Ρy_Z~ 葜^_^|9w:::?,dus2os+}FO;cl׷$._8oTx#9~0@7?~}>Wo^W?Jr15cСbW74>fMrq|s=5+5;;;o&a𶷽% c  *EkȮ~vޟ&{4p?j{'GqZi 5;C8 1sG.)> KgO§^,02կ#n*ø v~Mhk"kH/|}hby߾;ʏ9xj=Hg%dHH/~_ܠZ{W7o@rvjig~O|7 I1AHoWAT|@coפZegP{Ͻ$08Ajkz\N~T: ֓_2#xֈ 1կ8L~uݽ~BeGtE՟CG޳.0nOZQ[OlZ>L=to㵭'Y=l}'!'Gm|tqPsPo﷌oިګ]xO?}JaHb}}!|~0&yiVJ5 ]Hq@ 1*W;Dy0>fF6# UCߞCiTgVZ()-/5^q|]crmRa0G\D!Aioƾ䍰z9'Dqq/o3n=_Fr^՜ 7hQS}y1& t!i?eG7V&:?Jիud!QQ }[0sf|]|#^5k֚Ǐ裏w A0Sc9c9c9֚̈́cǎ?ϟggg%N<ƕZ-"r=9c9c9c9Ce:u )%kkkz6F~z=wo}[<䓬?<|u]{1|F{^{1Ο?E*??KV=F)bE.4Q!2bfu %z1Uz4֫:k|Ɔrb&Z}8 gy$}S;=M @؄}\n;51ó(M3c>C5guGI hy?ߞ}nvnC(Ԡn|y>ǯx=\n)8=zMx|7mONus~_r}jSZna7fp|n0={u/7ν)gt^^R̶WCmϲ˯8ַj|Z`oy[};9~w];wo J)>~wE~7xqǹ@eZ )$Z=cX ]If iQ^`DiiN™YT,AIM(G#SI@@1̐ 3RLHMt1ʷ)E J ZT{ FI V#쁅iEd8I~J 8%цFd 4i9%@ T9'Ԃ ({ ":rňa*-I E@%԰,'`*A("3N-U 'd*D|P&+&`dT@#uN;RCf2‰f2@dm$QU`s`=,ᯇ:=_@8T 4R9G:2Œ* ;f;,o$g h'0 F6HR!4٘":%3E9Pp|*1mh"۠D%2h%fJTv&xU6Yj32T4LsY㖹m(P6yy&1SmD;w2hB`INme88"hC!-s;lB"щS&1@adf& `ǹ}f&EA/2Ctx"RI&5Q*QIP_UfkC#uކARk31@*05'2%Qm.^"* Dbh;%5vLLT&f>O_2(2"EY*A*@'=5Ιv2R)˪%I 5h3^ْhQR }9HJfMVgg1#,H:%N@!KЦ13&v;ChRfSho刟Z?qH,tl#7e$.%_CZCp%h@#'oSBF(Cce/m]NQ7+ G҆F& MIDl\3 "rM@c #! QR0DcFc V$N-&h" +Q!)Tbh B[:1C:!F, 5$H W+;(YHw)4\IR/h닌$v%(lUgFc&> 5s#-v$Vr%"&q 2$HHAF ]`  dw͜^h;cXw{5Ti6V,P弘Tbr< H 'hEhHD 9pPZB9`{Y{<BtXmbQ2ϯ2EnA 3u*D~UCAXT呍I%@Me1_!'?'3 Y+H(d}h!j"6@dI8aPejP3%jAJQ(!J`&ڨR9]2(IQad&S | $r+){`eĖ 3: %SDLA*Tb#d|\c܏d$@Pa8$2eD!@HE`XXAb}0$7I"Pkz"KHMl Dl!S)R[3,K լtb*"%tG9)F,1  %RdWz508qSNQ8v<0v:կ#!Zg}->Oq|\xw,..rs%opiq-ָx"_h6loo?L?~=ʧ?i:'N\.cYc?c%I•+Wxgxt:9b`wDžW2K?x2[xq.,v}%k/3;-2=ٓ;|w uF`bEWѪyȗ_[Ih+ϽS>egVcGQ:i~g>0>Vy!YTP">EOʵՌf W eht`+;] |$O?•5к+w"O^|ІbşDhg~+C&;}1z,ahU,E?B#"9ŧ8*O?Pֻ}'2Wnwp-aVU-s?[d?N"*IVjVA] U/W$M aA@p B1B}Y\#իX-2*;5Ni:w zOgq"{)lՈyJ6s!̢O8K˸5x 4nCsB rPh.(2p{4WJGL" laҫ\9c| "+79f|Fq q?׉y+w HL%*)bFs?/eakdo/P?f['0\$=smW~{!ЈGI/Rαg01Z >w&3H./E &zq^ILIdDǩu"{gD`vJ0,r=dU/?ѩ10G88珒< ҷ12{G $(vP[Z"* Ad~N0\ᕷ%l4i /ݍ򋷵YpO >Q晀KS^!S.5*:?|p*J [\;Y;l"RӺ+d|qt1)26HK\8S@f2׭wԏWrݽ_([L,8۵-^\-i\8]cWI.l]1 1| hKEaF]!IQ,% Sw&\+];^Dd_xy"q%e2:rH\w[g^z{V' \w?@ZHbJ<Rcgq dó|)Q:I^v"x~݅x)|T)%3Ŷ/L~"W,(gDA|erw,~(Jb5+/"ֈ/A]v7Q?^[y_3tBH.|F--ҽ釸ho)d'$-PL"MΟb_[!(dO?DXaݩ\=1'BdON\GR?b 3w3)#1QIcuJd%Ο)n \^\Y=B3 D5W9nrnIRHE\@d(!N;EڭQNG0w1\bҸ/ h'k%\XlԠ92'o 'Nlnn"@)뺜;wqh6} _җzz=X^^FJ=6kkk,--o| &%< ' WKK|k_… |㬭8wKZeii5>O;;ie,[$:1r&JW3co jt0i=@IKQNmsX]A7r$@YTd`S2}>F}+ !шn)HuCPj4 )d(C$Cr_GwHIe~Zbt'/7\_D6ӊ+neIGv -Z9exeE=lȫ%Fz?Hj)Õķ*H̱9DՈe.7,Θqu2C#0-~Ch@=:>va!hDjHltq\!A2$F#ߩw)F|2'_(8&픖h3MfFCbw!Gr[eL%VWa1u9ZRS[љ5HGm2KeIl0HrZ#}Ѡˉ2 ~YJyT,!Ȅi$3yb(+/)fouRVz3Յֹ<<+#QGb 8*nt?FqdD $*.Z҄tT& IWò UV.sd@JS=JTf"E*4&9pLbaQ>'!5/dT18ƈ-bUs %4 {7 #93%&7ѴШ,CȯEh80ulD^Ն\LEXyhzoP۸1b r_$6sQ5蠄h%'{6aQJF'R =M|ԘWy D"5EK2k#b P'.ب@*qP!eNCT 6}UA)ϱ d6JIu_Ħ$գ=}mP/3PZH8in+:(9> aP,BP(Rb&mebGy??P.m{RRt(,//cYǎs'N}{q]wŝw K/ĿW{oۼ_}D9Zؘ*_e7yMpo mͯ 7}k6p;F}7<4n&ff'c>}LM?7m.;mu_<̤n +*foa'S!6%uM~>~7/q$nMO 0ȡZ\O_moշyUI75bq}> n9Ɣ.1; }c?7]c|ʹ!7.4>j~)~q_ej+++<#((y9r'|%$__h`6 J%VWWT*<ɘ'OB _5T*8q5'XYYRַm>}˲'?ZG37Y^/-qaqE7~MXp1q_̴{30Û7-x8U斯$>gqno;v߮Fqk?[Utd۷u=ax[ǤzzZͶ M[?=pr[>|}c).87Ua^a>|k/!\m.j*'9c=mY|nn㷣Vܾݡ|׭n YHaufŭތ燤_zj܃BacsClRj,>jdjM^/Ok媯"96sè|>+Z۶=YfO?M\ RirZN6ٳg'*;V~,ߎ9*Jw}+"yIgsgH„a10eGa fA0xQdFP^FXA4#DƳϽH 7H!L1')2  8a #"?#5tS7$& #3bNs% # 1^1 2FB_*Ϩj)e$dQg؁% %IɄ$Øaaf^R6;Q\S b|_0 5/dwD(<_(KDy+M3h$HꀢDJ)JZIg~=ҏ(Qw).-(0$3~L.si#GnXΩȈ7̸h?bЬG4ewLW@Fb'[^ԆR). fxX~HF~ qRt {6vb.rpe )dLfDݏ2! OHM֋ /AC2CA$x͖m#6VCW.p*hu/bT"'M'B M=HTu^+$t!Gz1n ښs fͦ?#2A/x^@=hz! OD!Qoh`?*ĊNfz;Ԋ/b?DNA~Dؾ^D=hz $f@zMW~ "[ #Y.do|'vZa>ŸpbycEX'+IBqmS 8tt & DI!W_ ~D.M"F4U~Hi"fD#P^AeQԒ;ԭF#O$Dȏ-i*KSb.|g'D*hr~H 4Wo$h1%s$2 b?h_UZE &" B"?+)c1x€`?U)Gqܐ;%%p[s >f@w8w)q ^h*z2pMLADË!n)hFG&5QL66m CmU2}}}peƘaj!ԿmlVWꐃ@e:X?W)_/c 4jO! h뚁!U!CU54K]#o "k1vyC&T8u7\v(cC氃4bڱ l(,U! &泸LDC}6K*(4td`'PBDGC0؄P^`FQRdI^Ĕu2*FVhGbeMRuz0YJvϱ:Q!0Ď|Q6VR(#.X$6hl;W+B+d7]mHGCGRoH"Zc!W0ɲJeEԵ«9FxƲBO[zy:uySjL[YvW, +6҉^]-ae@R^39,;8InpAf2X`MvJ`uV5I6:M-PYD¢PzƍcX .F%j)]rM} "$?M'H2$Agqp8F"X>XN[%4sr4(C7XVBcb7H T];c]>-lLSbH240$V ~Q 52ed'bD7X쥐ihgCㆦufmFd`V"hdh!#|Η $4c˷QKm(Q:$ !ЎQ+Z!9"ԓi P$Ahm혬A9/,i~9zuKIoEvC! kM|]ssUFG*qdLO/5XZ`X,Iru!C@°^)ܺMzEҿ c$*ENrrOU d-d63s-``nh^ʊŽrfoD.Ԭ# ڥ$/dXܕ<-܏55pd'nC10Ce.K)љ8& &!{ȡUV\Wˎ]I'/獝(1Ҡ40°p`3e m̭: إ*$r^N X06,/Mv&J6˄0lR֝N2.NB3 .*"DRnX;|30 nX!YR`Po[c`B)U?\j+5âp8L3 heG4eL.ؗ !VرH'V{v`adW}k L]dKwɩM [E6|V!46,J?$@#G֩NbforJ%#r- CqE!舨 4P8^MbD ?+†:ҿ٨%ʂF[uG`QF`e1}8`yPY8ۗd} Q&%ZW \*ݨ=XEgb i"CvZ F:tQ \cd3J#- K(܅"ZпKka$VOUA "6 G`G4 j<*@ϪNGFQ`6zYBdL&NRi*c*w*!KȬ3Y瑹&qCX d*2qId=5N"# `EInx&>N7 .n)d|"Vcl0b$-OK*'IN$C XS2DϧXM6 2PZXŜ h!S Dj5 bУ"WRCIy$2!JNdOfilPYj}b#4"krF$r` v sUMer0I<4e jU,*Eg\c+CZn-<pCtmlL b5dZ'@Z@X% W)Q. {]T37 _,z veu 㪘 + ML)^?9 *uT1ml|MQj {ѱw{~sssNww:f-׿sлWar J.?>կdihmZ!HmĢ6tR:7FlEvcS;'Ҵhkv/Ciε0[׸H-T9!LΖ)[ulk{+v΁\:d-4}xw_sDkRk;h %>t3ǻ3bb@gӫ2Ġc'' vKnv˹^vӳ,7UPoo/q!ڮ;]ڦRiݦc7>mqM슭tndڕ۶vȮx=3vmL]ïvܔuyۦݜCR&-v {.uNfO&)_ĝ٫Ϸ7ȾsV/=%.?@ֈ[v{;Zv]o݉숝n on뛒o=Bܺ۵JFqevڴ=y`vգ.wencnVw\%۷M}|necKhO[,{϶!='{;lm֖{{y7[G䉸nNn-ݭ:^:ٞ=c=&Mv}wߙ)RH";RH"E)"H"E)RH"Ef!:? )RH"E)RH F8N6 ]I')RH"E)RH"ŷaL6qlR.w\O')RH"E)RH"ŷeQ,) ;u/}F:AO"E)RH"E)C05H7K"E)RH"E)^H')RH"E)RH"k=E)RH"E)Rx H"E)RH"E)RH"E)RH5t"E)RH"E)RNSH"E)RH"Esw1MB .2F9Fc^۳|^fzA" v~vNƜw;܍Yςܥ6'@_uiшǼ|eoZ M̍=ߏ1Y\N MVĶo|Yffi'oIy lwŒI/QP݋ۑ |}UwoG Aɸߟ+ıϡv)^㈄|_ohenU,/(b?&=gy(1/^ޝn=fvz{gDkġoGMu[Z^C>JiŘ{;飔F <'U4+c7=w&@~cXFWanL# }OڨLbTkR_؝m###诞]~X?~&6-?4k;`K2. b n]`V6Pq1QǾ.cd Ze6uNPqQQ⎉XVfjڢ\D?fr~2 ؽ_F{9ae ӫ.`nL >Xf@'_p'n`.t@ 1؇wRB?*%?]Q>ԟ> owrJ /A!_w~ %E0 gP A _SK7Q8خo# v{Pv[ϕyߘ U qߩoGMu;|T#=0|﨏c} M/{M? Z3y׺-1 9/ B2${"dY(#ebl{"f=۹CZev3Rhi۴#, c[X+` K"l c{QDw"ZDMfԺ۱w'lkمڱ2/Ju U=)R!l -;kHmߺLR&ۢ-˞Cx/Z|~̮_BDBGݒEu;|e!_>v+Zہo; [$GZnYV.%ָ[Ѿy^K ,Z5N2w;n0;ollRV*oy[r8_q]Qz{{x"|a.\@\橧(KKKO$bg}J_z,AK&0#~w~-|k_#sJORg_G~_|A?̻;b!kH!0&V v^|`i0FlZR'd,-AK6BʮmA'6h:KEjkCI60FmM8! "LCKV!B K1chF C Rr1812BXcF[\Ԁ`ŽD0L(cdѮB[*$p# hGFb gR$j{BIcB&<׶Fĩ#tGр I ' F[chˠ`l lҠZe*'KI~2*dډQ2Z TV!9a0Z H$r "Hȳr4"Ze6#@#-:Am D,i kAKDZeRb蛈m4DdadHAKJFO[I"XEHdSK0VRr NNhV(1F-D.H42J#P6K!w:LRF$2^cDE!4DDOHVH-Rm!BF6PϽˇ?aDž $W^ennu{1=|+_x?Op n޼Rww?[Wrr&xOl:Q"!3Xx5n/YAV$#́+D!?]{1NL" 1D,_\axz)4Ox?"[?+ {O~R?Kw>NoP>}7+DKp_EO.Sy.7W]|7^Y?z7c^ejW~Baѯp2"bn s&߷H21sY(CxȞDa{}7γ|?(3TBQs>jY>/|YȜs&}/F&[0N-o,*7pJ`뇛8c ?K_r} FD*7TDhvbcg=3 g6<7蒏5@z|ar7=\?2[1}X-3yi\?;_$vkX<tc~(=|1JHI}0bsr9s`p_dRhn{}z+?uRy2-_#{i?"/f;r_}8kxoq23ACf` #zni?yCދ|auBe{Z=Gjgюf흗S#F"n {8Ygg`Y!Vl?ӧ5Bʅ"KUWQ $Fظ+8C⻮#R8zIk%%|onRGC=~lEZ/`|/W~ÿ6cUP_S#;4^_a~Fnf2La(c M:,>W?;1nï(\P6/52~%fw|(Eg(\ѫ_?^l'Nshy1r)G/,ٱd ~ n2WE2wc-c$Jg3~0_ rqXgDm// q^V} a$%~9Ipx {i'ncsPXޅ{i$xϠj4Coeg:f/^E]ɠ>BÿHc[(G:B z/4pn.ϲ} dip0:7 _*G/5ȹG?J"l~>d(+I&uW +,x %43IJcfZ`.aDC2ŕ{>0W4DK$ s G{z NrDFޮLp_<+E?Ǡ\\Dpv̺ G"IXY#jV3&Tfb?/!>} h!Y}MZG<|Bϕ"ߵHo\#32×$s#6p! GfL&?# w~YhV4 W޿s#8%e~_~]αZY`z>J~%Kɫ؁`Mn Qvo`fPG"rʄ_ۗS8Xp0#g }pR3e o36/݅;HS'xy T"dcQč#hIGs+1kGC xByCp>}&b,czϛ8%3m!‡nP_:a\:甯VxCGD_!p,/4]Ϣy'RȸG i٠oѰg N,r坫 ]c;[↵N%]^74GK{? \,e^?c=y=[BP|y ,2QBS.x3PX'_?$.F pCחYíp{W .`#8CtM:oaݓN=ߗ lllq -n^TIDAT:u'|{{1BbiiLNN/} ˲9z(ԧ`yyIq]d2q>1?#?͛7>!R𶷽_~9Ξ=ˋ/Hoo/穧qL&1|+moCṫQN~ Hޤ` n82pI>=ZoÅPxYBK }wJi1+ =&,'E#>xʣk哷Rehe4K'<> y-Ze$t("Zڬlf>bMcԈ|M}CgZeM2$=L|]`fz B%%qL.%ǐLLXi ر!V*Mj FZMDJT%jlr }>-X;[; ]WhCCV"DKDL{&Q# q!Qq>hd@>D`a&S@+ ohQN8R pˮ-G4! aFjG 4+!n6" {( HI! lڦ69N^b/ghde@4}D`l}7YQ^S5M;R#psS)&#LjY@&D|,|Z |rsmG6qZ+$o^&艨Cz1FK"G4/Ȗ0T;|y 4mր~FS͐WrUZob~9ѯ6h":g5pD&(jr/5V;?ch DspA3TDf=1!.[\Gy8RE_ "Zaa)D"/J`APaW`*!8!phAW>U"7fG4YS^oªf}4zf2qwωʇx1~E$LCFm/p7PDVl.yɊ e>S QFK Jɗh)XZuvd_yh+2j`^6ˠ Iu6p{`z#:Z p6LL}8DYE\ cg-%Ei1nL1d"4c0FaTM|dch6c)0*+CX hk&$vhP hQ-D2iH0C5Se,&_$+ܘI wq*TD[/xML>)yH&12nY2irJQ)qVUbk\MgSh'Z/+hm 81[FK|FDx8.4"ovi Ɛ3aBLI_nxECcT%)T9@1*C}"Rl|Tq&7Sa#Odh7D X`iCH̊&Y HQBI$UǪKSD_ZK% qʎn21E1b7w w_٬M-zۅ:26$l`m-e݁-㺳Lz:+䰈q[n%-9oϗiLn1.+2v]ƯqΛ.vԵtUToϮxogN2rfl͇ұIK{昛.ZѶm}mO;.7;v([Ǩ#z2Z M.EMrnvc1`;@NoV=Ӽ]dSYm͓θwok>f3e͕fK]Rew"m?aDgg[&E[h.:ё ]2n1[2nɖ~u~owҴmv6 ?0ֱ=ӷ;9c׶N?v{a5;wtyQlئwlnǪ]w wM|%vkliE'6m^Ŏk 7wGnV>ty=3[i3Vņ ^v[UEClm}^ݾvMQnۙM߹;I7NG6m1-mڿ[ƱӦBbخ[v0`'||c a:=~l˶Gw٤=[wvxt;+Alc(]&裣| ~!JOF)EOO'N… 4MJ?8a"~ǘ{e``rL>P(}K.P.;ms?s(re~~WrwwΤ>088{/Biw)RH"E)Rnͤ./4߹)] z>Lۻ7skʕ+;w!o{bhhhKGyc=~7n[=;r9^m_TT*0c֬SfC  XKTbiipiGkFTL(%QJ333WqܓZTV1Ս CJbj$qPڰAժ#P R͡בjUOLlcoURĨXbueI; bn%,j͏[:SV@6uc[ګ/YiSm~ĻЉ#ku&Qw&YQk'6M2 rg>ѱѨSMҗkub2NTqOX I^8Cp&auz7"x#ut>lgdePҳa,5 qF($Va@XqruhYP!'@^-"|ht d0bLJ{bV*{X9٠HqصA 3.CK]>ʎɞ,Cez"ȵf|-J>X&KbJw ndrU!БN lɀV%ڂYԈ,WQ4zaIQ/eÁKF"G!KnhX< <'ǠPZ7kPو rPEwDPz 3 fLg(TA.UϬw V,U@En&}39740w"Blg}ȐXld93ũ"3!򞈡CdTb Scײ_aBW9$|ؑUe.P.go ϭ[.2N BT㨕rb-eY6TUCyY`ճ4}yrH`YJ"L`3hh:.+\\-nY f7B]zNjHcC:V1m58b=Sϓ]%M1cXQ93w(CfDVɔJ M2kB zOɑd+gra16bC!J?Ż$QZ.}}}J9mH)w|Uˊ<}[QFJ\dc@L5"1#hNXI6vG+M99#@H0ZH:9 C''n$G)uӢEg{d/9ʊf3RK!9^M Th-:Ŵ &-ƀaZ9 F&3'$I'nF,d—̶=I:n'ysR;J%Y"HhvRvlqjntڕVzY(vqX&9ΖHLif3X.'dBX+ɴV־h%3ytdvml6+&o4-hӶ3c3t ]umֱ_M:Hyn3k'-͜,cmҖ;/A눜1sb37MO7_ wqG^2-6sMfNn{ޙRm|%6oEΏNK+Ҵd 8Ϗ|Fݲ/鴤srކ6-4Ao?-Z[ $c.ZGeMmti2#ɦ_hEO{D-6UU"e/Dr]jm{Zf*Z@m26+ٳ-;]Ufmwvvxvۘ_[Fs;-<ضmɿlnջed:7-keK/Lhl9ifJ0&ue&]G[aB`4;] ѱV;ۡ-6IF&{bD|LO̴+5]6MyU۟j2+:)IlE[ B*jZ&9qSG$I[vt+<})7itgO֑nYhMrna{LǶeK ߷}P—DGl7ϓB$-G-_eUlV;[L{ȥADnu @}^HX)]Ml͔]=]HoK2]6͘ǯ7cNW٥WEcIȭiצOHbJ #Pf&iȄK1ҙ^o5ܴ[}(ZoeG޷0[״$]hvn.Bu%m%r_َ wmW ٬W"E)v@I$l\6MN)RH"kߩ)RH"E)RH"Eo=E)RH"E)Rx H"E)RH"E)RH"E)RH5t"E)RH"E)RNSH"E)RH"E z)RH"E)RH@:AO"E)RH"E)^H')RH"E)RH"k=E)RH"E)Rx H"E)RH"E)RH"E)RH5t"E)RH"E)R`EZ?1kcHz_f,ʏ6; pz ]*ѐ=P{a}%ґ_1jvP/,v-!p=˔,F͝e CrG l|mu:r XEe fc24Δ0yg;=xsTJz_Xʓl|eewPzBOy)_R|,b>}Ŗ/3S&z.:aDϾ=޶Oγ%*jǎ>w׿V΢і0{"_ݎ )<Ёڵ}Uyڗln y>K{sKe.pvcs }3Z.Tvm{;ZwRиTp2gXzߔ/ ?5+'_F!g{:S&z+B$^}v !ﮤD~nST_\SohS|CR?MH12#YH'{ wW{(Ur8G]] r ~Ʈcn09;a#{־g=1־Lj훴놡G7˟[ؓש]X߃8` ]i2Lfk;0+5/v1@ Ƴw9E:M!ONPYB 5T_Z{h%n+;Bf-E'18ؽ.?u$fwߑ?^CLڍ]iV'/c=|܁ ?t(||`0_Ohߛܳ[(d2{NЃ9ߞ^&:rn n1 c؂?C=# DUcpg^gleH^(tOU-f?v^&>_Lj7t}׉ƻ&ߓ{`bOLrRVfG wB DߪJ!]cB$?$1{kٺ&:v.ӪE Int!h;m6my'ovnnCK2I{AR̮}ޝwwwL fC:.MnWS Cz)d]+{?MH>JM=x]Q޾֟@ےDW=n{*wor;{;mmђC}JiG5&]2*+[ǻwm9bo9L`-w` dSH"E)RH"E zE(jRH"E)RH"E-/q׿9|?333YVK/Q׹8pSSS;w~a^}U]֚'NpY^~ey\tQ~,˺c:SH"E)^F|S)RHⵋ;7 ^:qLZG\.יPbq pu* <G:??ATܹseΞ=m'$mllF~={O}S(a``??Zl6?]woo} oxGpggFM,ad7ArM~\O Fй0$ڼY<'L?1 BhӂHhm:iGK t˥ lԦEm IΨi2zM`f–~IshB0Fa@m$Ҡ[dWbS0][4n AN_URM:#hha׽34U oZѝ#Ȯ12fd",v`v:AV[o!ᑡUK|L;[l>۩[&GA,Ǟi "C㻵`dOLE]Hr̖2lzw"Zv][×qK'2iMX젥lEKHYzӆnfu_|O2dh].D+睎'2!6=7mvg,ݲ?vlm}׶ЫܴzR9޴YD:EBLUěH&|vN̖%6obM;i^lڰliNd ءt9 ;@tIrw7mV"2R6e|Wl:11oIXlDb햁o+ޤ-SxaS?&B0$ʛ2moئ.i[EK.yin;<+<&IةC٪Sm+➶jmd;6Ovٱ6-FraӇё$Л9kFl#Z1%[{KXۦ|m:b- fkn?ǻb/4"KivҾ)I|%z;ux"ZdЊE;~6b#7 e;dvڣni6yԦ#w|]a̷cU#7lV|fcSmIWK)Iҫj0`F|{;.tl)Ӗ.)w29/Mm[ݶ-lRk[㚤.;#MδdLM?M_w<,..>7oҥKH)YXX@kͽg?Y~~ZF|3}u]00###ַ^xAz)>LOOjc ﲧ=ȟ߅Ԟ T!K󫏲pw/d(^ae/>-"S/Ι?.։1\;?߄s&ͷ\׆qkLפw]3<ka,qW߃y,|dx>$QrefPy2=>9f~*'~.N\PwM|w7OF,扯+o2B81-W*0qx΅{],#e EX%}^C_x,s0ǻgCS(‰kob(ZUWO;Kߕ n^y+k!Y‰#dOgq ~d 35Ox3?2|i4Q!`u3OGE?6}vs?1yކƓ7(\a?@ng>66Co83"_d?C?y;[s4F28| n.V1|^x?7ـJФ򇯣s?ssO ^2g^̥&S3&}$Vd~a\,\iSo']t*s% ?z?X N]TgV`lLg<+ac8GhL/Bᕃ{2/\8FuLsUEC\-xq}`g{˟sVlz8ڵ6b}+ܫ.Rn֚#y~ ľGWorD1JJ1K Y/x!" , z>}W-T!2?,Wb1ˡ7!}9s9!BIRDG[gg^=i>"gXv*,?9ɱ:>xgj]lgf_ ~q񣌎WVWX+}6cn #xk:s'`^)㡱E*2>|_i՗Y}yOKn"d*١"Ff|{8ɮW[!Ԩ>0o~apƙ9AzYdvyX9*ʐ={ᅩcGa޵I&o}rrN_OXiƏr<@367Bn'?E:g^"~ {^"]ɟ\buN|zm6N{׉OR-aGs=xNz y+~s^ ws~F|~$>6cKg,#-=zL&I~z]=8Nn _e$q{GSwW=(0+ ;\P}G?3YR,4AgeJ*] o˰?^?HV4) VZ/~7,|z9<& J( ̋{.<&Q{/2r7koAOe_5C(RU?u_|AlLG>H랫G(slYFq_.mrgテW8{@=acNzȽs _q_O*}?8id%cT/pEm g'>.`"?!~"/{q _eQfCaM\c_ߘdwqB/s=x7ױ\f:pNЂcNM3Y~i&+sT"zˁ8\E_9 +-6zS,֫{!ơ&߽B=@/⼸%q%*cX# 5=1k OFg)[pD& \ȿpN<=~CC_Ŝ\eY2 %[c_xq 8=Rx: fd^G)t%~%oBeXX~?Pp#J:Rԩ.[%Yg4~%ǰ<gwo>N zkv<5O^9<5Gt2)ϗNRIέ2Nc ~ys?4~Ě~#<yMW:jNp?N }o4˨(c8u{z*O=LOOc!"&''o399ɗ%<<3ͱСC ^z%zzzZh4Q'>?A,byy!,ˢ^p9,"|&c:Z )gn_D^ga./!i8:A,p5\@]?>Ffx`pib>_q(`Dy|'4T#޿J!]GbۊҲ1u©W qptSj`V{s0@ Q ǧ"+E* ⣗=. st`@..Nrp Ajܓ7P`{%J _.d0a12O)^{C,q 15g0Cc8oиC|dR1zX=`{ !4Ѕu>rur%>iJŸZzG L,B|t[!:KUlW\GBD~mMb і"2oXuOPw]#~dDfxeDiҁks}WՈ8@TAZ&ס0:F UuvA\zӘOCЛ%s9K>ЍL|CZ1q m0GDJ}S:tE\njeb?Ҋ1&cCHoM~3` d/  {6Q$ѣ=vY< UvDow9|q`ӧ܍ب#d* z3D1dAc,_qy؃82$$.{oF?,_ݙ4*\ Ȏ\.DN*~~KJc[bCe3nFpl1 ̍sNUj|Vq z{lˇdD2<ӏtrWLM b= ,J84zWɝJ3,Y̩Y7]h ub+Ĩu/1 \ܞ/-}UgF=7R#x}A[Yr'D4=vC_f8O%\룩HQ-1TS !rʾTԎ)X!0LiC0^Y2=-60^&09B2KƭѼyȜ4Q8^B o${6n &v`("( '= Dezz!@ #CV7]p.Ovڦ`ї/Ȭ}s` #쑕!2WX}pUԅ!>:o~Y^2;0A3PDA*o|0m@jo(nZ`QBY~oij ^Ś;8n{<)Ұ\k"3hm\Ú쩫Ɓ(a+S^D`P8's?kbB?ucb#l"3M w_@>$n<0SKfFaYyh֫1^K)T1E kjN|?U'89 <shh(DIz0qN_ż~FO+Ne)l%r;<^q/z`DPZrǩz;v:ow7r["˒(R`@mf?EuQデ3s{ΜoE ْ@<9Ԡ6X +%d%U=㼛pqPW!,a)&B!YB 8ڎ^X'l '#1œHI,vCǺ~3$aDwV*% :)U/c+\4:dLw{Vf3$a6Ϛߕo>&&&H&HdB4:i%3!(y>LJ6N˴yڼ4r/ Ku..WҒ)df*)g%ǺqZѲ]SrL^Դ΋JK?OKj)9d _u!2h#sea52r*I&a\U/ZV鲨f׋U/|΋^f:2rtƽY-kYewT~wzںLʒ!#FФR(RzɖYL d\*rFk2K F tΒQnig%Ku4qi=Cvoe\u߻4vGK ˤ_[ʪY-g{zzXSyoHJ:=)k\>bwf#cﳥ$%KNIK%d"dƍeרqZM9y Cnʖ^?ؗ2޿%E6QQ7 WYǗN>"LMϯ^ߙwO YxG-u1M%3| K`IcCyW*kˮ.Y^˘/{Y 1&iأ˞i>aۮf[3ubR2n,EҒ\h,ʌAZV^Ԭe\}ˮ&hO̘SdݘS#5c|1T}4^٘ٲyk ҲاK!3P~aD]>1e6i]͚s2Eo?wz]IrHԋ1ʖ[cL }J˪Imnij,͕;S2fRttYϞ#=)|XVnvlTVV( yyy(~uǑ${w>mFii)(B29~8DÁ՚^qZxLLLP__ӧپ};7o&Lr ,b1***غu+~ߥo7^@ t˪Uhiir-!TUꫯ^桽e774KKK?o.[kkv/{.ʕ+Yr ->H@BK!|*s33Jե&MC8_T2M3Q!X\XLjPUfgf|k4RK>Dt `D,^,g@j:/FBaPY.ݯ3 Xtȍ58s șd$ݙ?A)NiF^8lNH;X[K  $Uo :nSݩ!3Pw ^bq~[^<ݮ꒖·~M>uF2E]rR*-=Rz{2a4-&ue'Lֳ5tQ5du)r8f,HȪu9MeM]/ge`~vEIzX&L:~EɌ,yʌctv#'Y3vYv,J*K>eQiwc-kTX4b&/ڲzggФ%G=1B5*Lśƺ,Jz,,.Ǘ5-_H8L(L7I$S%bnvLyyD"|ڷ]fRʼۥLG"B6O7#HQG1gY^Tb(Ed;ڒ\!".}ERLh*O^ ĩh;ÔJe1|ibvf|%=jR%G[8#K>diٙYI3m(g;UUMו&-Ota4$ 9L^X*HĢq KyN+լh- x3RdVg1Ӈffq*ʒ]ߠ)ZeOf"0O;ez evЗE՘%WI;R\c4ӶJRa~vW`Hcnn*IzꭷTn5=hyxX 2cLdZN}D]P{2Hכ'OY<>,UIZ5NeP+4 >'uX$F`qȋ>\JOqxI#''D"A fx.]?&W0Zm'0!"V;9?Ӂ uk&H(S0hd:Dr𢓙Em3$|QJ gTx~r9ݘaʓ8#*yX,14jaHOn~/h okȜիfQ:Hc.bk=  B[LmhS)Ԣ9B%1íL/6 /Xm2U`E;M팘t)\cY\q]7c);e1ԼB6fhflHjԎZ O-,Y$$N&I|M`;_Hp@A `kcՎǓ`nᚴ3f3M" j|,kO㝰X,ab,ҢR4az"y.wwͧ@&~lcEJIm&uc?WuRcAE;)[uHBF`xh4ֱz0꣮<6PxVbЛ12u5c'a^pJ I|M4lYq9k!\3]crbQ5c,#y5o\cV#YE"5K)H07W}ARH&4 ,:|V3f҉ f-Xy)N>Yu}HahLKZq)a!^mɘ )OL fO`pQj"%32GѸ2ȡ(2h e*J&o$\a&UÔp`^3sY>ɤIVGNvמ`r<0jR&` E x|8 4W貒('7"jxo`_!Iǰx籌 NXzM'/E]M\uϴb49ϧ',hb\6†)fSDT(,2q37]O@R6S(:paQ;a-A>_Jw<:"IZ0mgN43Vтnv6+~G72v/A CIlZ4F|8k(:RJ ?|.P.qkϰb }ʦ@Ұe)bXc 4xUԡ2!Ϥ^8H)+$a̹(c~bS m]V2]?ɔي876 y1[#hxfM̸]LZ8z̍MLʔZ5,K4Naw. !ӫ.tl+s:~M@"瘓xK,\:5`:,+UEfr$corZfҌٚ(neIL3l%#FY/%E ^#&P:d },*de&kILn"] 9ִ:YjC.QlhQj׍Xp(yþ(ε̍@A/B+[g)xTEU=%K9q7~獳/&I+EڈJ8<ot`Yjkaμp<-9}$f0%F !7ӵX֟e] g$X$xr ȋ?[NNys r)I'5{ B[J# N 'dL;E:U@~7aɁt1W!zې ;O`F}4<{vRnbdyG*3O*`rPN՛0Pb Yn*.Շ)T*clee]|ỿ9:dVt icn~H,$k3 SYjZ/IhB/H&eXf&!K KK^'JKZ*~z;B*a2dp$ 2hK!}LH EJ SdNE^*ԭII2K.kTRr&ƹbc[DzѐLzT3LܐC^ ٚ**R!*fB%IJڱZQ$cYBB5vhvh2&ˑJח^5WP^[HFrR MVg̪~&E-[Y#I  $-]d$mI4Y+Y*a2ddOE2v@%5nd隴.]>e-u*=/r> YE s'I`).fLj]@IMnz!^ϝĤ!K 03U%Xvv/H25w7s,eKyFv#Ijvdi%7d'F,#-O55$S#3b1_]zf׉, #lKϑ }C5eNѣPeKvhF21Yg>*Fǘw!S,M8C㼒 L^zJi2U˪̹tD&sLِ)2(x'dLZr5.車o}cLf^#Ϝշ|eK4إv΄ia2c'C3}Mʼ65̙9MeˇIKȌJ/H#=&-gMVReBy黝yi/f]/g%ؒ)oFGUM˺cl"3IɨFEhFL}׋(ob FAbw.'!eDD,"5@ >eHD"0j݃"}ZC"@Y@ѣi(9v;VYF@ >(,vMpMz8et.E @ Ls1u{P  @ x+Ž] @ + @ @p ¬ @ $H`2X,/( VrgS @(@ |e iڲ+,i@ OBAٜ~gG^1Lg"s@ >a3@ | ʹ@ <.@ P@ @  @ @ WBA@  3=J(%Ae, d҈Y!v0L k6ϩT8eټ @ @pL*Hp8iJ/,cIj"2PT*ubvq F|%Iv}UQ\srrr׳O"@ xtY?B,I$}h  RRRM%I"LׇibZ?r~my)˟JCUUjjjlWd^? HD<ghh˵L1 BTVVb?$Y&&&ɡ-iyiK((Z \(C,xŢy{ɲ,({_JtO@ ;3X,il6dY4NJJJzo;qԕT*f[6ɕ$@ 8 x'MW.Tt?rOГɤ,h軕F[\qJ^fl6`1$ɷbHV0FzN *Tx{4 Hq$ f%I###]attV\.Q~HMAA?@ ;*{ԩSX,vŚ5kH$(b&I$IjT*bY /={p\LN>́ZTUUg, T /".JgAUUEbתjܫ*/". UUk읶eԕv$I2ub /xضmqXoP(D" JJbAUUIJ3bҠ/|J[f~_q CJسgX J*2qMؿ?{nc1Ezgzپ};W_}qNblFUeV._Bn~`6[I&ttt / 7@iiG}a@ ?fhFIIɲaq֯_oSCQZZ0555Ōs}]d8/@ |JxWkX~=N1y(k׮W^y@ ݻq8򗿤UVq!([n%HOc2x d2ɝwɓ'9ʞ={Ǐؼy37n@ x[_wsHGG=333/Jhjjt/3??O,[n8NEa֭[Çv0vwlXEuu5ǎbLOO#2`Q =I sp8޽G2==n[nɓB!`iү*CCCf%%%(+GQv;^{~6[aw88O>$[l _PǏsFFFغu+?~FÚ5k())#G {nn7mmm?KCC&֣jnsC.P?.l̞={8rSSS(?l3<Ê+ػw/?86lݻwںLf.L'LOp1ihhG}B"dnnӧOsС}??|V4Mcqqd2Ɇ ܹsS[[Ν;Ǐk֬aƍݻxnVx7üFWW188H]]@ \fv]UUc'^*.뮻Ǐ3==lf~~avJKK twwc QMb1`vvX,j5ͺu(,,dxxAII p~Fa痖gtb kgn?7tFnf@ wTx H$ܹ*^z%z{{Yb`6)++tiܹ'|}{lٲ"V+BFGG䦛nBUUJJJx'TUUqF^x~ӟa*++6|I$ItRTT,|>n7VB^/& I(..^vUQپ};.x}A㺏c'-@swE/UUuV^|E|>w}7```|C- z_۷/D@AAXVE!//͆;̙3aYjկشiNm> ( +W_"sss]ȫ㥗^ѣܹNfG454!trW40hdή]xW4]v1==SRR䗿%,sw`(**bƍD,H$BMMp(@pVI$b1L&b)DZlXV"$L7k֝CTW2}Ȍ$DH&8V+XD"a`5% ñ;Bwtqa6I$XVFFF(,,4CSy$ihFuuS:( . H;wtq"d2X,dY6:I}n_f\;L&ꢬlY􄡡!ʖ'l6Ų_g[,(,u3m=Z~d2JpUUq:L&EI%%%IN1paanXu|8(X ͆n_gû>V~gǎXn,"l6--ZNQq0fX0q].P@ .3蘒$1~,d+WEQPJ. .|V0999AG!77Gv8@ gϤ1?bݬXuA~Rd2B"$h=&Q#˲\ @ |ft@ @ $G @ @ .@ E ֜ @ @qrt=p cG;Dх?k|?+H&F˅#\[@ C<b:Zd2INN^w2[LR|xcx@ jnly;>˦ k<>SY H$z;+@ qrssƆIlqqD"{.k$钚udYF$4MCUUL&d2-}=`YVv8wxˣ/| |k_p`2W~~o~رd2C=kijjk hnbf1::<~cg_6|>'MEEӨJII >T\0$QVVf|L&Ƅ*Nz% ~MSS_=_YXXn(Px{PFQQ-'|K_2ּ<}~OO477 ?ߏby2e+O>$?Nii)Xa(?ۿeժU|0'??< ###L&rrrBTTTh|OOWb466rc6)++c||UU),,dxxd2Iee%$1<A薲YưZaFFF7nd2yI&( .nPU{*/S^^$eyҽvV+$aZ1A0["Io..n^uڨ$+mmm<|fǎD"ݻB+Wdƍ?_WD"կ~??ȑ#TTT3’$[x {/EEEbQE n;#obXhmmepp;΍> (׳fNf3Ȳp}t:e8***JП+5IDATIjRTTf#SUUeڹs'|fgg7`qq,СC8pu֡*X ߏ1edLԻyI$kS]i?D4{n>c=zimmgUV]q@^G{/dlllY۷Vjkkl'255CJJJHR'?n0d322¡C())1:ߎ; v( 999~}YFGG?† ɬ^VF0$77;ws=PUU(~˅d"//XW(++mvx<|>/{W^annrl6%@ =$L&_WHFQN[3&!hIjvZرc%s,[͛+WbXغuvVZE(b_x<,ˆ4ΦMx<$ VXAyy9yyy^̆  oz+EEE(BUU֭3*.300@,;믧D<gΝHCC7otR__Oee%999]ºu8rfrnVv=7fz7n$??χeժU^2鈴`6I&^q^5M3v!u!ߴiuuu/uV/7,a}vJKK)++M6b(Է~;(Byy96ljrJJJJp8\lذIEaʕr7rv(o(BUU֯_Oii).:V^jbLSSVVl6l޼x<}Lr@ذad>nٸq#Vbzzbb^@  BTȓ$Vñi~~޸J$ l24$Iq!Y;~,`0b1 녡Jҿv.~WBdY6vf߯(q׾56w+~݅^/_=ԕ*IDX,}La.I$p\Xַ<'/ w1ѯׯB_H999E(uidڻƅ[8n+O @ .$ILNNb6q\ޒ$j%77wwSUU=<'I8nCUvf}lya2{-aH&b1<%MGwf6?EQfQRRb}qqqBK" H|M @bvv~QS@ pQ-ڇiLLL>Λ{%b6?ގusOR? TPv.%pX,brrr%Y4p8L2 d2I*@ C4} qQ=''UV}D"#effÁXt~DZNލ rss O7211Aqq2{'p8L4%??rgE @1188c]t9v3т{l+O3ם$k @ ,A۷xqD"R) ԩSX,n7TN|$I?NooaoZ tvv,ˤR)Ξ=kx?{,\.c_7qw:N:E4%77}(`XZ pY~P(ĩSbF9w8NCCCtttv kDgr2*syL&Ӳѣ8q^/fFGGG$z{{0,8}d2155E{{;X<&&&8}4$zL顬=g4ejjHrˉbnnSN1==l6300se,N2“ٳg%//D"ӧ4d2{HqqRP(~ǎ yXbŻOw廻9|0K?m&;xש~iø\G4FFF8{,hO*~<vAΝ;\B!Nܜ16AZ6RQQ륣!|>, hs=/?#$eftt3g077a``srrfaXBe(tuuLgΜjv =,..Q.Du ;*ϟG?T5kְo>^~e9w044#<Ν;x<x R^}{b1V+6$IG]]^wYGGGf~~EQ1LeY&77ljFXV@UU ''ӧO}Zn7}}}>j9ssq #X,<466F9pNTTTpxٺu+&i>33Coo/vS[[5 x64ty3Izzz8tP& 7117/σ>Ȯ]p8N^{5on2立J86vاp\Յ$I81GGG`F刺ÁxT*ő#Gڵkioo'? fidYd'O2>>"77xcA'|iz{{))).p7x+W_a>L~~v*#WKJJD"(š5kxkg?^{-֭# "I{ĉ#I;w$ ~N'UUU]kz9rW_}gZW~?nAv*AWTm6ZǏSTTիͥ;wXv-8p;vEEETWW3<<̑#Gl477c8qN2hii~z^GGx<jkks1lBnn.ͬX׮] 0;;޽{)..&//'O''۷Yijj2-I7tvv266F?p9RO=򕯠*Ν㮻bڵ X~=LLLi&~iVZEkk+?07|3:u[vb?~P{zzO~j%''W_}I#/~j"I>_׌N2䥗^bbb4/l1::/K;ѣG:;;ijjh|V^V^mk bD"V^M^^uuutvv"Io֭cϞ=vٺu+`Y0LaB1L, v݈&p!ǹ[.Zݻws){1B㡠Y8T UU|> ӟvZ$D~|[vSRRB*brr!^XXz{{dffY#|4eŊy星'bppH$<@WWW&H /_ 6cnn.L&^/;v젺*֬Y̚a6͆,b(É'XXX@$}TTT 9{,H<'NԩS$I24fgnn.@6$ dq>z( L&ZOOEEERSS=܃ԩSD"y^y6l@*bjjJ6n$SSSX,(c߾}?~fT}ݺuotWTT۷cbzzڰ m6۶mjw^^/9syˍ# sPWWG^^W_}5W]uƑP(Ν;I&߿EzzzQEall)Px$e^y8x ݸn.JKK)..ȑ#9rH$BII ȉ'x|_0[/ӧ@ lg~N'mmmnNn7p8X~=֭;wƍf֭TY b6OOOsicZ]]'gZPTTi;v ˅f3Ғe@ @uu5,..il۶7RYYɶm4G;p `ZYl6 ?~BndYf4MQl6177~zf3ϟ뮣s1>>΍7Ȋ+vӝY,ᠲ|֯_4,,,pדKEEl6ZZZXjTYvE 0]&CCC.l޼IdӦMl߾"Μ9Cqq1_=+V`||UU;P7|@ jX@gsrrx>ƍvYr%f1hhhXV~?{1.~6qe|> f֬YlQ*ˍ5M#b VZEAAlܸg(++chh1Β뙚bjj={n:ÉƍٴitttP]]ͮ]@UUB6rfgg $ֆ;bo"2xjcǎf0'OD$z`ʕsꪫㆆZZZ  QQQlݺ2q8\wuj'$ ?"l6hPCC999N$jkkcllnzUXXX`qqo:N'ϟg׮]PQQs稯ꫯ,=@ \>4??oleH XcDD":Ng5 ND,,, /011Aii)w{]? QAW399 w{֍F ܺ3w^ߑ zeSwt)t=:gip|fqK%Ibaa#_2f~?x|B@ '=]4v;%%%kL܁n|&1q@ |:H$R?C^=@ @ q=j5e:u~?DCyyy'ORTTd"Lrqv;,sqlFl/ Sͼ'O;W@7|xn$ĉ?˅墷v^hkkH$8x h̙3={p|300ÇaXhoog``ɩSJccc1;;K~~>&1=J4aڌ0`徘@=}Ȉ&ۋ4ǎc||<, ϟ7nN9}4\yO~l8:::8tcccRSSCOOݻm۶a2J8wF,M8frrp8L{{EY\\188h Ȳb0bN'n'[A_qW F9x [nEeEɓk!2p%LoRWWG{{;<쳴m;>̈9( @ >5|Y;wNhhh{aݼl޼R=444pUgϞeӦMhL&/󵪪n_|W,z$IzzzFrm_ʈsMӸkhoo73006l@4l6&~hhhsΞ=Kmm-ϳ~9t_җ}8twwSQQA" s1::n"lذVx DZZl6, $aXp8X,dYFUUڌ?{)++W_5,<$$Iɓ<l۶<~in:::dllrL& X<g?ampUW177O?M8nȑ#466( XLp:477/[PxG  3;;,,.. #JPUٌl6v?#rrr×LBtW_}3gΰuVgzzzY誙=J,#J199W_klf$Iv;l޼cqYGUUmfX"tt¥<쳘L&:cad2cq뭷.S}>MMM477Luul}g]@ 9gnn"6oLNN[n%??N8VB4ZZZf||q0L 399IaΟ?Ȉ|~paD"b1:;;ahha˅&Livww377GSSdQ&&&!\.hoSRRB4ɓ 266F__x^4M1 ?#===TWWFyyGXr%P&^/]]]X,rrrذaTWWvee4 YɻjE$CU :::8x HdLuuuR), Dnn.V⦛no< $I\ժU$ cQK }+PWW,󌏏%d2iӑ#Ga:::鹤e4 ʦM 7n4Z*++ijj_gqqѸ7''+VPPPimme߾}l޼x1IG_IJ" $޽z| s~HN5FFUOϱTmwj eԾV4Mo1{ ^2@ \9J_EA%@||{ rs|`}H=e{ ҵICo'Cbyhig.i9﫺}M_Zd Q࿒Pˇ+|+rU苟)@ XB?4y_}tPFbiRf}{ߴOFzst_ 9JX v|.r~>}{/`M$Ԭ_nޮ}ߩFth6EUIl2hGcvY'$aLԻ^+K2$Z l~2s19y]i_G.n@ |p>t *r*XW3Sgf|7GDUliqO90||VJ֪tt2`mZjsޒE|#nGY-AXU c1'ڽl*Tx'q[l(ـ)F44Sͱ7 M-[hhGCc{vlf]3]tux-E"ϞyX]a㋴880tESh)l[Q`U*ƎKƨWRh`'ͭ)^f.<$}@F8j|5;9<| ٓ67RϜ ' J%-^K\slDr8?{A6WmY1gS&TT}H"BEsb[l-]nd:2M0fmMF^{a>ٲ<݂Cfa_<|aJ l*#gIg ǑW}O>H<gE.Ƞ[Nlw?l(ك NNE+^GJM؛$;*wca80LX+ VPc<4NDG#@ @yZvT;(r;kYY-"K2_yf;&}+k[ mpP-k[m5QvUښk۫% z6lf`Y}:r|iX=~l+5j5վj!IFpZp?e2]5hk$ PXLΚga5Y)"K2wYbw1f̮]Xw#9ՃY6S-Z[k;1U\Zv&ߕO8f!I6Z.ZM-%RJ_%۫suxlϷ9K㲸T;m{)ra7Y_VG/Bw!xp"̝+[}+K/)G͋d}ys *|\]{5--xm^\q'߸8 Z]bԩEp[ݴb3y<aW.r8VnںkɱයQU[}45puլ*ZD-klmuzexJ(Q-,ϫeu2ZSuuQW|ZMV6odgNV76odGJ<%47m_gkV|UlĖ- K2|՗[.=2_laq".[V^4f֗ںk))+U@ꮣ_,ɬ-^UWQ-"[ qZ/箦)1BH`3ϳl'a@ AYfNOʼe .r|8߸#owM统np5&/=+A$F#,TĪUhh:ҍ3)rldH2BB?Ou>E+-[<cjXYyyoEd"ϞæMHđ#/W$x=yE$#ĕ8f̾}\U~7giM?|Ua&Ó453C|g>W_H`]kwc+Cjyʩ_K\)5EJMqk &45?|+ɉ;V} L\W.xyd2ͳb!+X*GF9݉,ܲLgf1_N + 'O{kro[ɒlt纟)fxrl9v44Vq|,&*R?+ Vk֒V|ο$];wP-ѳaq2:A<}iWn纚4 h`eUgF䉳OpbR߫R-1 `" /p`e&DL'"E"fN83UQS7{ǩױl Y)tRrˆ,IHixW5:qY]dӲ~+26V!. LD;/"}H2›ordgp}jiolҍ<ŦMr0䚢5<]/3Xp6'Y/39 ]>f3\Uqw40 &7~e Ocisx-5sWODQjROpy<{X*F#[%v~‰p lkP2oӑidYfM*s*i)j!Ǒׯ:ZfxlnV|M#tT<]]ɷԍ)((JRKJ3$ӿ\[w-y<44MATc;׋,Sqv? :\lΙNEє'#' ɱ`5YI*IƂcXMV&;y<84r$ OqnxW^) 6P,>$\Ƽtdc6*aMF]kRz_6H))&C/ McPf24ɍ 7"+"P%M҈)1NL`.:GXF1%뱙lL()gsfʽhhȒ }}L7AC+K3'E"IгX,V2]3Hidf؈ M(fcW!7fb[]e$ A{@fiEVY}"*d{ιシy/k +Ԏ6͓đH$#AtJ;Rw ʈΧyY]_enm;z n,EdttҹJp^&\`Afٝ_؇Im·+8½+0 Fj#Dd/grafuʀIcbwnJSJ Fb1fP!-Ţ#O?H$B=n.$UFa%J`ﺗ< zd\ BK.ҷǃһ9@I$f$U#! G>|_=,18N - ޅSb&33>VCDba?r:6K|'= = ,p>X\S.u])p:k(J|>T2LFWF`e`$ȂwTJ`\ÂD;F!S[ѻԋ+"YLX3k3d&fW1r)VWX . z[06Jpe2I]E%Sa֚IT%R5Z aLu/02/paAwx,sMR%aQ[^&Q(D ñ0'Y-X!Y̭[=KOXuKo~g?sks̭1 sks:Ȥ2_MM&ø>OC[-9LEh-,6f3除n(eJ̬Ͱ[d-Ƥ{NG'fLŤg4I8N9cȤ2=`=΂oӫӤS EBLN?l<ݗQd2& gy< W0DR?33/m#̭:ȨwP4$4tO2EPcP]{R"`Z[cxe̸{alzn3<+b;G0dxyz{[c-AeLj"8rL9(eJn`vuJ>vvMDDDDDDD䷈==:Lxq(B&h6^rD\Dti~Sež$'C|nܝe6o>_"$geRsvC<~HVѵûw:k H.~*+,#clG-dKȣP̵kE]?k{Ow6?i=>{/3g.'%biI݃D"bk#qeRC!?$ ~zyg?I~YQDDDDDDDDѿ@Vq(46)Iv]ĈGԢs."""""""Z a6KcgJrK~~?kth9}tjj[=oߏ#99[= )) R%ϓTbm66_&""""""""ajjpٲa7p8L(a,z=7n 9<կ|455A!55s=+/F,ceeHyy9b1fffvX K$!_U Skkk~SSS455a؈ ##VK$q%<묮ӧvc0hmmI> |t:Ο?c蠺zqFCBBH;wP]]Mkk+.wR__555TVVv//iiiauuFnݺ pݨjFGG9wccc\p$>FGG裏P*444̍7ezzstK$ \~ zzzX__gee>FFF(//W`0HWW+++211h$_3gΰ |7 re$ hi(_ǽ{`ii9Y]]hTz[nڊԩSsUbo稈o?_q!DJJ ;w`0ݻQ(ܻw/~ կ~D"A"Řrz=,gΜjeΝ;XVr9RJL&sssAj58qw}a4 zF̟D"ׯhTVV266۷iii?>|ᇸnܹÝ;wXXXooOY__Ν;̠1L9LZjMss3?H$^l6SSSÝ;wpݜ~mRRRXZZ" ۘJflnc2HMM%;; <.œr9&C+4#G%%%EFTbX|3gyIƦ`୷"}v***"55X,ƻᄏ)ADDDDDDDDWi'q\BxZ"t: :'ErQVV2w7?5/z<֭[ ''<RYY)4*_,+hhh[oCCuEDDDDDDD^<6tП䣭T*Ot}>7"`>q\.* V}C"Z~yq!Z}oj\% @@~tu&xӉbyd2*5|FfQ jx^xB!L& \yH$<.ҁ6B!B>k9PHhoxyoDe~VuiX__?S${OƦ£1£>Fp8ۭD"a}}3r>o*x!S܁Nq>m G-OqD"X,Q1]DDDDDDDnP_ BA!|[y4ϾH$DۈbH7 zIDDDDDDDDDDk0W\ATbZ|TWWNRRHr"==V # ILLǝN'HM]nݢ'J}̕J%ݣev;˔Lvv6n7oڊJbn޼l&11xXP^^bsڄ޷oΝ;D"RRR䎎'99R)_nn.MMMzIKKcpp*&'',,,peZ[[***|ByQ㤧?znHmSYY VJESSo&c2y& b0H$ܸqARSSQQYY!##D"tq+Wx<3<CUUUdff"XXX 11ϳm6r ^cۉR^^Α#GP(b2(++#--h4ZvڅVeqqNv-emm-6 *[&q=:;;Ԅ^G.F1Lܾ}>t477322B,>, ]]]?j;wl6oI:|lF#kkksNד%"""""""[Wqпg׮]‹!)):;; X,ܹsLaa!ccc/#ehh)Z[[ wppC;p8pϼRG{nj5,h3qRSSyIKK4wM~~0^8pP\@GG ;v<4ͦe͆)Z-Gd2h4l۶Mcii)/POٱc^'Nrd288ih'Oʽ{qh2ikk>c&''9y$B'eΟ?ZbJYY###nN:ͮ6 :ш\.[ЙEӑNQQnNrr2cܺusz ~zzzhmm% q ֐dh4\Цq^|A^/N"qYUzzzd2dR 8rf:;;>ŋ0??ϥK~:dddRHLL$331L?!Nc>N>EEE;v шN疖FvxK*255EII GbfhZv;v~ T*bwmbTTTƏ~#fffD"D={?{.ZTJ~~>_ dj;Ν;.Geeen$ z^{{t:sNYXX`mm FCQQߏ7`׮]t:y7HMMezznN' H$`f~:::P*8qB4H$L&6mhl߾i;w$$$)--7n033h N̙3FZFӡjl~tRUUō7HHH@VSQQKz!/DDDDDDDD'$.KSH$8N %%%O<$:;;QܹJ"P ᠑HqbffNdbjj1rss6ˬEQzzz|>KDѠjiiiauu]vhhmmdzzzF$$${n&''D*k.aarrRhӃT*BBT*vލB $JJJH$e233b Hff&z~Z-;w$ yyy TJoo/h۷ QnLFbb"v! ZL999,,,0<<^J%8ޱXLcYz= NGGGvu }}}x^ HNN%<7g}}qrrrHKKm||!R))))M( l6|MDDDDDDD䷅)gY]]ETt oJ}A"A4ns\\|Ł8zVyA6yA 6&mmm{ s."""""""U']"^;D"tD"! &fDИި"r9j;_w@P(hs+ˬ}r});Pظ/sIDDDDDDDEF"'( G.B8䰾(M羌}MDX__߲FxxH$B(z.tܼq62/l>(""""""""ۋD"!&3#v Bx^PiX__l4D3".sbfd?Ob㇍ZH$je``3gΠP(HMMeuuׯs}L&h .B1>>NYY%r ?&GR )Zǵkhiib~)DQf37oޤ`0n"---\xl6JׯLaa!x:x<ǵk!==Ξ=KSSl۶>x<Ƽ(bCn?z޾%۟Ćt:FFFr $''hFhuujkkijj"11x߷zo,=܌` *ol63::9 z%##MD"Z-W"Hn,Xw}g% OVg wn?SWUP( ?6'ˇ~Hnn $""""""xbOB2w/tн^/̈́aJKK|2KKKdffru^z%V+rZN8Luu5[nq) ),,$))P(Ľ{x뭷P(k׮155j:t|uTv7ohHKKcdd^{5ֈD"z.\ BTWWcZׯsyك륶ǏL&cmmΝ;Gqq1& k׮Α#GZ.ׯsaT*+++vHIIA.c6evv}b``;wS[[l&%%EL&`vVczGGtwwAKK .]_H$BAA7>W׋``yy[n166Jj5cccFӂ, <\!--6\.? q(..& p8F(uuuB!J%?Gn7fX,j;w jTVV288l?p8̑#GjcXBTUU1==ngtt;w0::|FFFuߧ^(yd ?gVWWdllj|>n4ikkcjjAѐRduu*:::PT 0 q'ObHMM hZ߿drrݎJ#"""""""U/z).."d`F#8~ln7 ))v t:yPTt:yW a8ίJ+H8t(J &{P(l6^~e0T*JJJ:h4Hmm-wAqatBv]:FѰ~!Vy饗HOOGVc0())a׮]d2j屴q(J^}Urss4h4ŋH$PWW^ի A]] Ν;/_&==D, //2fffX__ɓ[쪰P(HJJh4F![nSXX4;::dtt16K$.]"33E,#11CQQQA,kА`#5552227}oii:b\.A/>dp}INN]Q˗q:ʹr9s cccRypB<d2C^^2tijjai۶m$&&7`>ʢ7o#d\zΝ;wp8s:>}̍7p/---l6RRR{N@pmZ[[iiie1dggϕ+WgǎT*n7IIIsݭ""""""""_Y<; JAףT* +Y^^.._"tuuYYYaxxC= `0(_6'rOy)--hll$ll|& I?oͿO}}=n .]O~V+Xx<Ή'߲}vc?m}~~ӧO;; 9wɼLOO3??޽{JDQ(lD5_z% )..fB!029 9x fxZ-?񏙜  EEEgjjj///hx饗(.._!8wEqq1EEE,..RRRBII Bjz7lmVT*FL4cL,.JKK1b8~8sV+/Fl6RSSEfggh4ڵ`yy@חMGV"ٔ@(d2err%, J߿Oaa!iiif222g̶mعs' LMMիW9~8uuuh4!%!!JJJ 333}vf3VCQTT$ADDDDDDDD!_OLLp=߿(D8qLOO:cJJJѳo 333nD" tttACCG?bpW\!;;P(?,//355~Z[[9s Da``۷oOIXXXԩS\zh40ҜHzz: ͱ{MH$( $ 2 \.lrll ܹVΟ?22LF<-- \NÇFvر7n?^\.gvvR)N^GV;o>4 gΜAoJ㤧R~:HRR)z'N000@<a5ػw/\|)l6uuu477?aD4aT*zZVVVk1'TG}Ą6==MZZzL`ӉL&cǎ'jYd^$޽Kmm-fl6ܹsa E6dEaVHbb"~)555䰴ć~H<'++KxBB$$$g h4n޼ɿntAqq1=zy233Q(HRL&{gjkkr SSS(JR)2l˟!""""""""%$ N`0HII Q8999FQTP(X^^&"4233CZZX,,,h0 ,,,lȬY,9l۶홚"9N4 Zn3FfOOhՊlfxxH$Nc277T*HD"oD J۷xfwF!忧5t: ##,fggR[GFFHMMz9NZ-YV+kkkH$z=KKKhZ0ttt033C{{;gGGG'4--q0LLLQ`7d֒w LLL~NlyyE&1==999p8HJJBT@T zVА;NG4}~*qIMM%vIMM%166"??\Ąo2\.g~~˅R$##@ 999B! >Nemm ˅\.'++ χAVN `bbBhe٘fqq<p8V%!!; 5"HRHLLdpp* ,lL&VVV#//OsxBSXX`nnl KKKvA~366Nnv`~~^Vs)J d,Z")))^\VG$blV|ϲ*?wɣaA:o8Ov|2nÇnȣɣVᠧsПXDI"HB!:ljbBF_:oT{'N3 z xޯDžiĥR)o.2{smo"""""""""$ X$r9x\Q7?@t$ňD"_8N=gFTNߔ|U57m$y.w}uߏL&3 )`˸|lU# mRzz'rz[<>oq:B:S? ,k˸\.Vs8'n[s߈|~ӟO$jÇ~Bnr|2wh49}4oߦ\z=CCC9s;v5|F^իW󑙙D"!jrE0u( J%555\~iYZZO>a~~"(++DBjj*?JRR|@ZZ^(fk׮q-"w̙3twwB444IDATm687oޤIff?00 tO;wŋYYY6Y]Gavvs힄޽{dgg?Yv… tvvVƍܼyKrr2W\͛b4D"\p.RSS477sVVVE"zh4d._ttt}vzJ/׋^=S__/Cww7۷oc٘TD4шcppP/ńa"Z{qIZ[[YZZɓ'dBg ӹI>hllx<΃PTbX) x)++ȑ#dgghhll䭷"駟oZ2 TVV;pyvEBB&ʕ+8Ny&/S>z<󩮮FT e]]]kA fsq!$ XVrrrD"\zׯg|> ɈD"dggsY 8ǎ`0HUUFV ϧ ͆^'##~x饗bmm1JJJ9voh4&[*RUUEKK \.jjjjd2FW8J'$%%/~ L&Z*0"Mxl,--ގlի?… رRSSa޽\ztadggAJܿzzzΦr<Ƚ{b7}CoHe]z1 wݻj0L211ItNzz:ͬ?tR zq-h4 q-~?j.$06n߾T*EQVV&oFFƖ5{xAur?? 77jjjf}}F}}=}vaSmyyׯڊfcllk׮Dzz:555tttۋlܾ}T|>׮]cjjT޽T*eppE>cHOOd2Fihh@ pv-`4CT233C?To]ADDDDDDDy8_➞N^^!H$r9~RSSF!77>VWWy饗$''D~: OH`Ϟ=9rۍyŐH$ٳՊ\.'99;dq, {%cZQ.̹@\RRTWWsMZ-{EVc069~._Lww7jZؐjك`@`6),,$77h4JZZ* ǏvR8x 999ow4ƍ &''wiiiܸqzzz],7oޤdӉ\xH~~>;vҥK,--!J9y䖧7}v"iiiBڵkh4L&|>(,,$"J8TWW7~_*,..rI;IQ''‹Ɯ7Q6l6477vEw1~ӟk.coΝ;dffr1wF.DD"all6ݻ< ٵkJ,..î]0Lq233)**bffVN'333B@4.h4*8[I(ҥKr~Q$ oXaP?fyy^Pl۶??evvMrj޽|& Çijj⣏>bϞ=$&&>bWEOOLMMBEEܽ{>/AF]]sss1G%%%$| ΝP(I__+++Ͻ{o~C{{;v"PQQnp_arr8}4x<z{{۷o'!! f3?Y\\ $ JT\.GPdrvMkk+Ofee\ZF"t:J``mm;wQ[JE~~wq'OFRR d2:Áb߾}sT*~h4|GM)x Z-/_fhhHXS^[ouuu ݻwyJR477sTWWs޽Ǯlq4 F*QTd2 2 L'|4SSS b`0P(HJJ֭[,--P((--ebb_טf\.rydXLX3L&dД155%(J89{,R$}ٹsJJ ]]]LOOoFILL$55WwERRSSgrr@ BѰLZZdffbXdf멨 ??a>S G^Y """""""H\.vpЂ %%%,--1==M<'==  qB ($'' /^gffIjj*6 ˬY,bk:E8N4 Za^/x\J%Â`hdrrR caa%$ 999FDQǑd H% !V c0`hhߏF!33~?R<NxRFBVDttww355Egg'gF0j ꉓ^gggY[[#55uKjI~?>d癟'c6fvv%RRRHII HpLNNb4 dddIII(J\.KKK(J, `VZfbbBFnӸx<11׋ 77"v]p72?DDDDDDDD~q8 '{<BIII2aA.yA:l8/S?ˬ+<yA6yA 6vf\.y饗(--ݒlQ]DDDDDDDD8菵WިCu% `P(ʵ͏vD"[^#]1h4Z'{!Hd e'Os@ u <6%X"o "J7 {Z__VVDDDDDDDDawyV>N{/j{Cn3G]yXg||v+""""""""< ?xjjjj((( !!>#vލBr ɄNܼyS& #Q੩)}رc3-d}*++)//gll\ya,..ryFdddPWW'|BJJ.,,tۿ[ZZZ/_EvvR[[+H P(8{,nuu_<ٴsy`aa?Z[[ٱc՜={\:<:cnnAZZS=v̙33ܹs͑… c2x<>}µk׈FmrF7>Ν;y_YYImd6Μ9wtt>ZZ[[)..ɓ|>&''z*/\'/K8s ͂/~  UUUl۶M{.\hll,//ŋILLZ0"""""""_5r9zJX,L&{Lv t~"v… b1vͅ 8z(۶m#!!~mBN~JEEE7odCN<Ν;IHHq^{ExQ]__gǎ"rūJ8`0ٳg9tj{aZ!sسg~f~RTT$HsY7o"Jy7j9|p1JJJr VBAALLL+PTTgzzcǎ!ihh ??_ޘT*f:;;YZZ͛jd2kkkF.\h4reA֭[`4Wj]Fkk+&I.yAdggrxTTT\t,.^[oE__HX,444/Vq\ܼy_\8 p%Z[[ttt,LOOs VVVS^^vF ))J_Njj*x+WсfcppJ[0ﷁ:Ν9fgg8v&~w JFq^zMddee 6{nN>L&ݻ, UUUTWW̤2&''ݻTTT YYYQ~:uuu|˽{ܹsy8@ff&W^[KQQѦF:Xmm-GETR]]MUU^6.]:TVVrȑMx< t NGqq1>yL&Nb=zZ[[Gܹs¦N[n M9/]ăl455199 vK.DVV׮]c}}k׮K/1004CCCv$ LNN2<<^?f߾}¿ sέDDDDDD^H<h􉁅P(D RRR~V(B!~?~ jjj(,,$;;. bF"~??v^XYH$hMg^O~~⛔DII vt:999f6QT޽x.ŋtww̡CRɉ'hhh ˉ455QUUEzz&;ZOͅJ%jшaqqqS}T*m6سgiiiFFGG9v* Fnn.W^sA^z%FFFĉDPT:tr\.YYYryfffP(ڵ\hkkr]cǎ߿vFXHH$l6 )//gnnn7þ}X[[n&k. zlT*IIIq1233),,TЋD"8pLFaa!xr޽Kww7;Czz:Ν`0p |@yy9r@ c``Lqq1%%%x^JJJJܸq\|,ӔjeaaATi;l6:::X,h4^/9rEjjj***w}v8j[MriN8AQQp܍cqOOsB"ZZZX,ގ $0h#Go{ݻο1.^O?G0>>bݛIkINN, (**"FJ\.v;$&&IOO'''QYYYa~~LFBBz!~mV8w { #я~D<{=rssAvY[[v_DYubw$SRR‘#GÇsM9r eee ,,,t:ll6t:v~?jD4 n Pm6Q7L,4jkk;ػw/OeWH$B,#o?b```0&,p]^~ed2:Nx<JKKYXXt:Ƿ40 aXBR)CCCձ(lF"Bxw9q<@VdBb4Y__?6Mjjj@ @(nJhZ\.^W`?.JX,F0jxޱ1\.(Jt:P^D~~>&n߿b~~Áf#++ ш墠 g^^999\.~jfa4$$$@^^5ɓ'7@TRTT?:;&gggov .\oݻwIOOGTԄR$--4Z[[YYYadddPQQT*ѣRQQd27e0ի+477sAHKKrR68NW(|innF"D69dɼ曬HMM% *ThkkwaddX,FZZ~_ T*j5/2/_&hHKK_//aϞ=z<{a޽dddT*gll~عs'sss?p '''̢qlD;::g >IOO';;LϽ{/~ۑJtttzIMMh4HOO'!!Nff&?BVzR)WUU +W000@EEdB&'pAJKK8veeepaN'eeeº$''SXX/K '7P*5蠴^2B###G?6L&psY~_k.^~e^J[[*X2(/2p5({GBB.\p@ ǹt;vV8@ww7կ0LXV߿۷EDDDDDD% N`0HII . χV++++j>vv5d2hZNYYY`0 Glmm RI4ET4]]]ٟB~~^xQ6,--.󑜜) w:,--0vXYYbJhZ`p:ARRr) |>*p8T*"i$xyRSS  WW.wfvv׋jEPALxT; $$$0;;Rb0??O h#BRR2u!Hb2p\,--hdvvP($dlD ϫX,*F^/r4p\DQ, 6M8fC7m<|wLMM }>*JMA/tпKuпT<r^/3wJuпM6A'%%FY\.~wwSÉh4JUU333H$y׷ѝCuEDDDDDDDD^ }yyoTP($DlLTV0q$ GH}yoԱougg(" ~-;y\.z= bK( %O*JBWk盍:Af""""""""/Er39ՠqRSi~ltw]R)2m12S5|'wCj( cZL&ȋWyۢ\.+6W}B2= =ǘo>}>z~KS}> [T*E*~Ur /}l:gjcEg,J~4x~>>>ͦ~{ҵx <ɆE"~p.Ə@gԗ=מt/{|w Ń6~?GÑHߥcy񻉉 zzzX]]gΗ=/lޟCӟ/6~H$~"V6oLFvv6SNp8,--ĿoD=Z<77GMM υt::;;9u$%%8{,UUU,,,۷x"deev裏hjjfF9s uuuA Iudhh {NgC0p8LKK υl%pH$V*HJJ"`Zk"§~Jmm-:MF\~K.BAA]]]|壏>$x"W^% ݻw9}4p8w(JN:Eee%2d\Bee%333>vKKKNd\| b:7X,z{{룸Ϡqr|477cL0ܹs\~H$BVV 9s) ? N<͛75FN>y[[[B!}Z[[ٽ{JDDDDDxbOB2LP tBH]vqyT*/O^c$&&;#̙3oсwޡnO~ŋ)**"11q.JY]]exx^{QGU"o>n߾\.OwwAk:tH{{;VBW\={ >?پ}; ]8{ P]]\.ĉnF^z VZf޽cZIKKc׮]366Ʊc(--%k^ݻ ƼR)gΜΝ;p8rHLLԩSܿL&gϞehhHԄ``hh_  )l00߹?GQzܿJMM GDYY\r Dhiijb۩ѣt:VVV7D.?7``qq3gڊ\.4iiia||7n3IYYœܹC[[Fjnܸf#s%ڰZQ^^2Bt]]HjVVVp\H[[h4'ODד˗ijjBRaٶl]p8L4E.ľ}Q882L|饗(//fԄVp8Lee%=nܸ`ʕ+8qy}}}jBď~#.]Drr2/_&DNNFccc;?`6\r{>vwwnmm%''*VVV8s $%%1==-<&''9<Gĭ[0 T*illD&gvAKK 4662::ʉ'xW0tuuqqZ[[)//gjj\8{,vtd2caa,jkk~:N4~_s|>8N9rtttp mƵkׄ7-AFpU< ;w;wz}}}v***h4;wz{{1L`ttࠠ<裏$99;w`hhh@RQ[[}}}..]jrE~܌\.۷V`eeoŋԩS?x|(,,Ds=:T*ݻkb1^͛7 deex"""""| S-˦h^p8t8pz7oc222ba4r ϓFaa!,,,oٳ(J XYYl6om8ϟ RINNx<.|hdddZEEEd2t:( 2337?J4m۶ e211555r:Ľ{X\\GEQQ:2V+9rK. IHH̙3[l۱Z,..m6 |hZRRRl9siRRRc׮]ڵ h6J0::;vn333Cww7 HIIy9w\|駤2??ϭ[fC]]YYY:tR>Sr92/200@(ѣT*kkks]ZZZ}6@VvANN~^}UYXXjry~V/w=_\\̡CXXX`jj~p8,Q"A~ff?1Daa!))) F)..{ՙ'O*UJ9Ke!"cLhngzgg'3{{=ӽlc09d(@ r*ʹ~w.6KU7~Roo/3oc"͛imm,9}4x^JJJ())ahhk׮a۹u_r%,]TJܺu:y-Zıcj,Y%7^fJvZf͚V311!pbb$ܹ??j%''bz= ̙C^^LMM1w\Q*ܺu VKYY`5RٳgU*̚5B8n2222226>S 60{lnݺEZZFiYbr5._̥K3g5kt1118<n+ Ν;ٲe RFwvvlAΞ=͛7pX,~K/q |2OXd WŢEvAB*9x HOOgbb[2o-N۷ƍ@GGB!ZZZ>EEEttt`2`rrRw~~>(6xdrrr5Jyy Ad2155"hfBll,. ׋n'))p82Ҙl(Jktr">>Vngjj ^O||@Vb?1;wr9xIMMH`0H ?z@FF%%%:ш`ۉ#>>^ID2|z=ZVXLMMq VXѣ155jv3k,qD&_R/Ǿ>N80SSSnJhcD\\|~ & ^d"cل+ &&Lp8>`#f3G̯ϟ/EVDJm#Y b6vINNr$>>Ffcrr@\\`$~?NS\je`@P088ɓ'Zl6NÞ222222_+>6ύ7!0o<r3`Xx"YYYdgg ?bZZre._4˖-cѢE\r_ddds8z(ׯ_ԩS]3a^}U&&&0a69pmmm={Tx 9u6m+W0<$ׯ_pׁh`,Z-EEEhZ&&&HHHNTb2HOOnsQ֯_Ouu5}Ӎ 0gΝݻÁZѣ1{lVZŮ]qK.exx??pY^|E/~^G[oc߾}׳rJ,YBkk+/dٲe p8KUU֭#77z_הjy7qx^xY`/>뙘 ??rZ[[ٽ{7hZL&:7o k\RSS/F!//}477lٲ^/[n $K0DѐH||͛z* gϦn~_ /`6ٷo7o&%%w}W_}3|5O?4 :t|;\.CGG0zՇu222222CaDxUBjRVVngrrH$B||<111hHIIATv B  Chw&''$'' f#99Yܻnn7IIIx^FGGD"Ĉ`m*4###B󐚚ZyFI4EDdw8zB(JQ1~?J4|>ߏfh4 0@ZMRR6 ׋B %%Eh%!ZDvP(HMMEcZE5ݎhP(jBc%iѯ_N__7n?@("66`0jEP뉍v Avq\$''355pXiX,x<+B0dll a=22BBB)L&. шm)ml"äCRy!!!Ahq 3>>.o@@Rj14 qqqXV|>( J% i,...ELL `PYPp80LLLLo. CRRn0Sa6q\z1#x^RSSB!YcZILLh4 E mj%ZUi |p8V@D _hDIv>\.VaS-H̃><C6~t>hoR/k|abG"X,Hq$޻?_FJ{|kvDFFFFFFFF0>>FL=G$&>s%3GN@Q(ޒ@EɧyLO\4/ݽKHA?>1>> b]~`0۷Epůݣߡѿ~ gܣ̜9sDcŊ\xW_}6lݺ#Gh"3-mbbb᭷ܹsJVh8x |yWb… }vN>"//'NꫯFjj*s_ٳg3==~3IHH`׮]=zA)|֭[qj{=<ȢED"߿*(((ҥKܹK.$o6'N r1z- =_B8׏X&?.Ҫ=lciFؾ}Oo2x8udee~=ʾ}HLLnuV.\@rr2*:"DZSYnH]NH$m%py7۷ogŊ݄an߾V̞=N'S*߿+҃$ K<^:@}|?@'''p 8z(|&&&x% ywZ>o<.^޽{y&|>}N>N#33P;t+WjuVjkk1LT*x N>͑#GX`###ݻGyFaϞ=?~N?%4G>~.r%''jߣ{wnOjj*Fs( qqOkk+b=җ}vN8Aoo/EEE\r{6 m*g֭,Y֭[`0{޽{)++d2qu>#V@a``@A߽{7UVm6֬YCee%ܸqM61==͞={aÆ \viPXX(Ҫ԰l2'Z@߳gKrA/_7т``ٲe?ZMYYP6}Q f"??;wtRRRRhkk#99ٳgz9x mmm,XǕ+Wزe eeet:`jըj֯_Onn.* Bmmb*̊ }6k׮4W&!!K.//z+JyhlldppcǎRn6ٺu+.]ʕ+$&& McǨh4olFP~.\h#ߏh]T2oʶm`…ڵ׳df3lذDkk++WDpmϏ~#Νl 188bMWWCCC w/*Çz9ww!77k׮9uhcǎ@8ƍTUU100V7 6\Ο?eCRRK.|>DZ\ǏMuu5/2|iii8pg}!7osAPpYV^B`rrA֯_ݻIJJbX$X`h4:::Xt}7 2222222_>G@Xiߵ%K`08y$ , ##p8LQQTUUQUUF!33c}{)**+ v"t:Ӆpb6̤"f3ʼn]MM IOOg޼y444{R5k}}} ;X,ݻj4 YYYBh5k0k,Vklly׮]CVŋQT zjjjj룷3g`6Yf ׮]jņ cΜ9f>LZZ/f8p`0H\\w~覒L&Y`III|>^{5 hZ:;;IOO'//tvv222fcl6qRI__/^l6?s>7o&={`^|EX~=^˗/}vD"8p0w\***1ٳ TWWʥKCPpMt:<r?# fN:PL)tuua2Xx1555lڴ[nEGGtvv /044ׯ_ŋ3k,JJJ8~8@r|InܸAKK >|JRRZln7~"233ikkc׮]dggPYY)r߼y~ܹCKK >:t6@RRCCCܾ}.zf.]z  ;;ŋk.;cE>Q1$%%M6xp$66%KPSSƍ~:CCCtttʭ[w ܸqR-ZDVVϧƼyxgԩS̙3Z:::Dl<b233y&v"''B*ZV#//aΝ;,\8fs%BחO>B_neee Ill,6N/_.\ʕ+\pF ?#V^իW?d2166*s>`<}0 / T@ @}}=׮]:L&/2w555!fۍc?fѢE\vm|K/DJJ ###;TVVdÍ㡼DHHH 774rrrJǃb!))ImZZɴЀjFv˿LMMuVrrrX~"/`0H?paj%''xp:xCד&,#|>~#g\H9saΟ?ϩSB+RHIIat:q8\.RSSՇtxjgx122Ν;={6MMMB)j5jN%..8 ZNGbb"BNN=z)z"$y, zٱc7o&??K.h"^~ep݌#??r&55e˖qFzzzzmƍ ^?C3P[[+%755%\;v a0L8t呞άY"&&F$tRUUؘcR׋vl2(((l6E\rsGGtwwԄB//P([V, nm۶MfdaJJJDKfwo222222_>nMʕJOOX.^ٳ$ fbbBMMM466rXf ~ݻwŁx饗 ㏳{nZ[[Yf| x, ƍ:utoNii)UUU<\rfoop:hZ***ĉ8/_N 7$!!GOLzz:BӸeQ۷osAx y"'ODRq \B@׳b n޼Iee%111a;׉D" DpJd2jQTa4z̟?}q-zD^ >"RRRHJJfw|2=OTVVrI1L߿xAV3o<V+wAO7xW%''G?Kzz:۶mcxx˗sy`0@[[O>䗾V(p-J%rxGHHH@PKRR=---XVx9{,1113tru\.hDʰZ0@`Ϟ=,^ӧO+aPُl6c0h4U\\Lss3ݬ]qVQ(a4f޽tpp40f͚5l۶^t:F r V+ "!Ũ<֬Ye˖XzLOO _,EEEºj699Μ9swŠ+v[d eeeW?>>۷7o0f{]GYY,I픔IOOglٲ%K044Dbb"111TUUQQQ;}69vǏRZZZؿ?Fr<o&*_~>.]y'Dq8x<^`0k.nݺ?c&''x<ܔl]P`Zzrp8D"bccLNNVڞH$^7D"nF PJEBB* ۍ&))H$n'A*ҬMNNǣVɣdi h4p:x<>hLMMT*'055E @PH @R q8 a]włj3~?np8dyZ-l6>OZ*Ҭnz(ZVE6u{0111B!Q(t: @ 6^Wlv4nErr2NI8&bcc1A|>&^/SSS`6=جÇ hZ^/.K5jB J>_HabI¸f# G `0?J%d\\Z)1n~zjNrjEmшAq:p8X,*Jrx<$%%zQTb~t366ӧwߑNCTQC 7`1 L&K6)~XC ,1P bܹsX4&&&jU(PFN'֭CRx<L&=I[Q.~?z~Ƹh4ܺu?h4T*\.X! bۉFC\\n[%C$b`4l3]zJkV(brrN'N8Fד ĉ̟?<&''l0FCC.~)######'ݍnGՒ0cIEпMD 蟄ĉnyoTh$Z@D _c>22@NNV鯘h"YYY/~*B5550g*++y!######R ~z?Dt oVT*7)p}qILOOc4Z:"VNH}/=a6B#,r|YH$ǻ(#VZ2U(L-0J9mu:111(P( B|qiz'ڃ"x0B@TT*q+########AP0==zDNH,\.z7 No0Mܥ2|$K)########;4 @3];p8aDp8,~D""R8vEndL4IHs)B!^E$G7.|>Gj{Id(g gQj/7Pۍ_? ܹs3]u6B 'Wt_D"^_@@\##z |p:tttܷmmLNNrR@ @{{H럅 zzzßz F{~V"R!!T=g nf``3?'sMnj7B& ¥K~B}]jjjP {=Μ9;w.:~_裏R__kFGG{qiv;EEE4]rWn?-RF9r---3>>ί~+:::Xx1l۶3g055Eaa!'N׿5餧OJ[[sN?NOO"UÇy ++ J֭[ٷo/&w^>),,ŋٳFәwĉTWWd=믿NQQ]oIDP(AT*8RRRBa 𹔄X;JE__GTDM+ȕ+Wxџ~mΞ=KOOEEE=zÇĬY7ޠxJ%;wI Q(8N6at:E(+t:%##CFR1>>ξ}={.ב@ @0$&&>Fff&pP(4Z:s8LNNiRtn)Dh$Q^LLcn2w\aI}_i]W"cp8\vAf͚Nq;Fqq1G񐛛+]GT*^I3"39z(;v@QPP|"nNoo/f릴EOp"N'o6Ν?]PVV&2%D~}+;wD辔ƘYvz0==M8a4R-,?V@7͌ 7o{!99[㏳b bLLLpAXnׯ_gjjSTTF\ã>V! 0oGL-Z,yjkkQT̛7Jō7Xjjعs'˖-#337oٳq:t.,X@ 7R^^` ##%KgHLLJڵkCѐL]]˖-#66dVXѣGINNKOww7֭cҥ|><>()))455/z+ ^{5ꨫcǎM0&wy/rxׅԠsP(pz>ȣtVŋ|\t y9z(gĉe>99}6 ܺu ߏjgA000 YTTIJJ" RUUEBBXl[l7R__.~3gt:IKKc޽(JʰX,;v?3۷oc0())dhhb֯_ܹsٺuo~1zzz`ݺu{9(--%bڵkTTT[nQPP "S$͛7Ooo/<3\..^Hww76~x qxi|IyC]FFFFFF p5k`bbYfa6Zܾ}e˖1>>Nkk+B{͋/Ȋ+k.N'/G DviH{j@LJ&ށ@+WJmm*?sH8233INN&33a zHNN&>>K.qB6 ]jߏ'115k<*++1ͤ(N#++dΥ'`XXn/_$^шbo&*++gb]^R]d^//_ڵkpyپ};JgyF[RRaǎ"ޅ?h4~zB0_n& R9cKLHH >>ш$CLL㛚ZbjQe!pBvMgg'n[h fYl %^TRUUŦMhllΝ;̛7G?wx^j5-ŋرΝ$j* o޼aߏeܹNj+ |>'N`ժU444tR_NFF6 NGeeWZOBE1>>.dL&($,I~<д2OII NBӑ6CD"dddPTTDgg'o(--%--D,Ȃ 7`xx󩸸8t:4 IIIf, ^TuB`Xj,..agg'F!pF(((sڊ'//v&''yǁJ%{d2a2ĺe2HJJ੧ɓ‡h4X-Zđ#GصkC F('ILL o>˗ 撘8#Nx<•*ϟϾ}xQո\.._ ++xB/>֮]餫lZ-D",Yj%&&FEܹo &T Պ륬 ׋遴Z-CI36iV hH0r PƢT*qݸn8Nq'aZ1 B E;#Eh4t:sR0"Z:0C&t H$XI0D"v`L&<hC4# ` &&F'H!L&4ظIjL*@ ^J?wooQ(hZ0. BFAՊRy~(4nErrd q8BD"L&0C=!!!FcYjW-$[$axx 8z(?1Lt:$j;):t"p\x<Dp?*B% im B8N9:`ZkҵkG"J"%%^R$uR iK>[C\.ñ!p{)Jt/ÁFAt: BHZ,WRa1n7>O+in|>YpAtyNs:A(χZkn3͢/N'pXKRTyBZz=CCCر˿`0ų :NCCC9sؼy2222222@__v7vV+,#%>V@D _hDI8NΜ9eŊ"P7hDftI@ZpBY-B!Ο? .D"իWψ#yhmmf3=}e\y&hAͅ HHH`ժUr  _>115L~JDky?o%-񧩷U/ASe"~d>iXh%S?P(^oW-V(x<J'9adFD,2̧Zddddddddd9HϺo8JM%?/,S> 臉d5^o)W]O)4q  _&########AVxc2 t"8% C8vQ J#:yI)`kbbbu4R4IHВx<⾑HdF٤Tb@^/&ĉR$m>@0#P AF#* |]8ڴ_ףhz@ Ryi4 ~_h?622餠S_#g;:il)J ZzE_HcTVC>o<>Abb"¤V% a&nR)֢KgzF*W("5[ddddddddd>J$S`0HJJ .]?)ajN}]E;vpYv͂ X,TWW5kPWWoAww7j˹sTD軻կ~E{{;˖-L"k4DZcǸtXV_v*++ߧ19q ddd??QTT?O>LcsNN:EGGB?p;v젻Lj5[ne,]H$޽{9qW^/~jkkIIIrm6N:ӧѣ{-i%TߏZfzzMrr8rB! QpJKK alF._̮]`0믿N]]sA=ʥKftt7|:f3j={pyFFF(--([`w:Lu[JKwRg):CT*INN@ @0$&&o#pn޼I[[Nqq_\;wr9|>>}K^^MFFFFFFF+dzzZd)S`  2ogΜg,X@ii)ǎcݺufhnnfڵꯍn6ߦZͩS֭[Fuu56"!`G"Ν;GUUrYl6.\000@  0k֬e+W@bb"n͆nsrQ{118N***=^//^۷oӃht: .$..'NPXXo[(--%''[g1"####### <ڳ+>M]]TJT*GD!ϟ?كRŋWVmSRR&P^^J"..N0111fFb0ʊ+paXKbZ蠾HMMe,^\.F-[044>D<|2f龒q8<"\~fjjjEVa֯_0v*ZZZHLL 6 E^^O<s̡{ ՜={[oի)//ƍB!JKKԓM$l6J|||~RSSjTWWp8xf˗/'&&+VPZZJ0d˖-R2D"S\\AgtwwV?fS2VT꫌3::JRR`{;w`0l߾JQ]]0|;ߡP(ʕ+l߾&yRSSy B CSS`[nw^&&&x'X,رV<iiilݺɜ={V|D5k/^B0UUU311AAAfY[V ~Ád"551Q(,_zGt2|hZF#3::ʲe`bbtrrr6q?qA ,&Xn~F|>k׮ӧOsmz)~?[nʕ+̛7 J%Np?#!!Bl6233J&2?Naa!˖-ɓ … MLL nn7999\tz ZnGRh̗G0e˖*\RSSYt)jqx5ʼnyhc,\ ,9|0,^X瘘6lpߜ222222222_]aلZJz)++#D"hZj5gF6Iv/d, zEp8,ZIQCv$ۀiZ F#^WDL|{< * F# RH$^&`J%ʯP(Dpp8,q|>-:bB&\j).N &y^FRaZvtY6(kiiaoBZKjRp9NP"n\.b|J^zDIe'}P(fD!!!V+B!T*ՌED" &\T={:AշX,dff qE\rxZ2Hk4΁BȲ!^FFFFFFFF'wcj$$$̰؝<8G6jZ- qT{y_rKl~6{~w>"wMp`4y饗).)bD=.H,H)6mĬYfGF222̜1cO֦>~Brqiآ4]FFFFFFFFq}bb;:xll;cEk ( иR%  ?h$ '. < "v|{GtMt2i} Lo||HNbH$F!!!vx)gdk45azKvqi=,3H$B0$>>ke\ . [Y3_]TcfUh_X R՟$̷R {ƒR>V+ h4q>5cQ*"rBl6N'~F#\.Z-@)\.*JDJQnVrSK̵Z-G+6v] 8\.(rV`E#8amrp8&>O]zI麤6LOO_>&E -tz044 III=@w_aQ~:LsZB`zz.$*Jv;~_A0f|3 3ƍx<,d2wGSv] 555PazzzHMMLIJ%W^E7D4>O^(nݺn'>>+wtN ҧP(ĺ)p8,R[L0sf>p8Lcc#|s`_ˎRF }5XBLOODp8xy.C<<<̩S0L}&###mDqX?vnʥKzűo>jjjعs'X,N:~3֮]KMM o6ǓEOOL7x"gԍ-۷ӧO@^^6W^yׯ|rعs'555 0gN<ɿ뿊[&BII 6/(J, v\v2ݻw/{app,J%۶mcǎ,[H$޽{9{,W\˗/sajjjHLL{nΜ9ɓ'Y|9ǏGIIHw@RR']F4jtuu{n̙Fi4tpe-_|SSSZl6+WF^^Nܹsl۶4ؽ{7/^h4mۨnSXX(R$]DpQByyy.W*xWijj͛Q__޽{%;;{F0ĞvˉȲ )[@4ҸNNa q:"+t Rk׮Ē%Kzx<`\cKJP(8y$bZ]0mrP*(Jx j5)))eBx<N>n+< QWWݻt)))l۶:\. s1q8,\P(Jq wKjS[[j@ yyy111All,Nbɒ%TUUa2HT|ML̡H$Z{v|kv)**nh(tg>}SNQYYɶmHJJbm6tf^urA9BKK EEE"PjEc0zpahhYf1::*\P(OVVPDFJ^4>bJ/~ >< vŋIOOv +蹩hؿ?̚5K%R&R [o8FPj8< -zbJsP#w)BZ~ICCCFT믿gϊ䌽OJJ oΝ28t;Ccc#Fk&y~~>UUU3 ;vhѢMWW>j|rN'ϟE//,Y'477sA룩IlN'F瓝 @MM ^}:uRΝ˛oҥK?saB뉉?97n`ݺu<?~p8LJJ ?яl?g˖->L `Μ9,Xcǎ1::ʼyXjvbrr""55.??ȑ#v~:Zz/bZtٱ<38qAؼyӳgϊtf>QT\~p8ŋYv-gD"455LCC̞=X***祗^̙3͆baܹ\xF__ӟ멨ʕ+p5tfOOO===v.]ʬYxׅujzݻwV)(( -->t֭[/KΝKCCe>Loo/yyyl޼ۿ rx" 9raVXAVVMMM~g\xK.޽z):::ԩSjDKss34Z[[[n˳>+7ob4yg8s ` Ϯ]P( D8t+V 99"qn߾=c܌q,Y•+Wiijj`ݺu|><쳴bILLʕ+tvv266Re˖h~:7n͛tvvƍ/GeΝ\xy<|0-͛7v ==YllݺU8f&&&ȡCf,\pxm}]j56l!"=hbb"eeeV<]ijjbժU( bcc?1311͛9 /իWcbbB|{crrÁ矧|9dҥ[*6ab6q8zjf3N_]h._Lvv6999PWWGcc#CCCboXرcJ;wßٟ|arrr0? -- z-F#PaRRRq=Xt)/f||JΜ9ؘpQ10_Nϧ'Nß韒jeddٳg:NΝ;C*++QTTUU111AFFO󑗗GRR'Oa/7RZZƍYd 266իWPNaa!7n`ppr}Y<ϟ6N>Mgg'?O(((xԥKrIΟ?ҥKINN̙3:ul L&}FFFfŊ̟? 6j_7o2>>N$a||Aqq1YYYSSSVEՒ??QXXȢEXp![l 6vZ*++ٸq#[ ^ٳgadd, f7or!rrrA`LOOArr0%33ӧOs ]Ɵ韊CLi\r%TTTvZx^vc4BՒLzz:6MI.\?ŋfzzl¼y&I~~>.\`ppPX ƍ1Llذ*\.ɜ={cǎC  E8TjumIOO'%%,]JΝ˾}&366Fss3lٲ 022"I={6k֬9s CCC 1 ,ZH  qqq x_dff??h" B_.Of||K/ׯ'--MXr<裬\3g̘H8LGG^\BVV>| `0 Q~?餧c'55xjxD"㩩AHLL$..Pt233l"Njj*p!1, b񛑑AFF>11u:v$,f3;rX]2;ի B'%K099I__466rXj qz{{9v DAݣq{9n7o6@'|R|>ߝ;whnnz/_˱Z8G{{;/"zՊn'##իWSPP~"Ǐ}{bs[ovZv BJL3Dbb"fdLH&>OqqqFjkkiiih4bE4qQR1{lx≇l``W_} xb:;;1 ~>~?/^M6 -q+**RTG7AB`٘v_6n')) ͛7IJJoo?>iii[[25.v}PD%66Vlڴ>.|ף=%%~z{{|BK"bsDEt>ID".Rw}yxbffeeO`4g6^KqHmP(jT*Νʕ+ٷogCczzZjdVV`VZŖ-[())a׮]ܹs07ofڵKLMM wO(B %%LJJ qqqDs,bbbXx1۷o'SXXx~urrr+FFFc3300 Do߾Mww7dee'b13110VǏ388Hrr2Zgvy֭[ ,YBLL <sETyfٽ{7###lٲK裏FFF˗/ 655 .p lBNNΧoRxwт ;vСPS__O]]TRɪU|ܹW㏓{G0d``YfJ8}ayꩧ0Lر\.iiiٳ-ڸv5kG8˗/311A~~>fY[V344Dqq1nXRRRldddVYl/^LLLj*^/s200Z&>>%K+Wd``QfX <(}Ϝ9CCC>IEE\tL}Ql6 eF!//ٲe _߹sO]]I(bɒ%B!.^dΜ9_X| gϞeŊ188ܹsp$QXXH~~>H! )**ҥK’fry-ZիQ*|f6m$ JkY0$++RTTDMM zP(DAASSS…|>f͚BS]]Jbbb+W2880IIITTTp5QTTTpyRSSWWWd`` b^088ȟɟpU ,XT:;;$77Jfn`4IOOAh1̚5dqnݺŭ[PT|;!##:֮]K^^qbVyLjD"=zT6nHJJ 'Of3PRRBKK ͬ]e˖_ѣG ܸqM6QQQ gϞe]J|`'$;;jyꩧ(++\ڏ9rD q:dff~22222ヮl^P`Zz@/T*ND#E\"hK)tvF0'jb00"xtIC.@2ZVJ'N022~2xFiE_+Ż}OW XW wRzu0s0#Ǣ&{ŀ4]z(,^zI$l^3׬9-=SRݤ4/iGoBt==O}v~wY~_ݯkTtdHLW^a˖-_ӷwϱ9=!-=RD_# wc5ROs']sAUFFFF__ߌLevZB+AD(3gJQB?e0|\>@ 6Pu]tIBwmI7Ҧ)997He_>,7>~hv?A<5B?Sϸ6zCoۅ`-Ev",KRg>RW^Pk yrGY֋-G7oEEE3[_gݖu{|OBthtܷaY-iQ I~_b%ܶYݿHӎ~TE 5GT*E߻YΗ}OI'#Lqk I;ħ֠KfRP񐘘Blt ᾝr}sRte6III=GE7o k|?/>W AmdfUS=%hFo._&########A6,|n0==bQ[$%%' F!p8199I8ilV+~D||=LMME.σ`f3@& lApvphjjJfQ\.ȹ+mP("h055N&&&DTq~}LMMQ^^ BxޯEP*ϥ4=~_H9_񘘘(r}B!aJjj*Ed,4oӯD$Nbb=nҺT*9|4kMMM˿ H9spUoNKK vdp>K,bpQ~aΝ;Ƕmۘ$)) ?1""ʨᮧGy3U(:\o~õkDʰ{۷)//ٳ+dee!9s`jE`2طo\r2gϞ=:t 233Q*ܹ+VD8x uuu466RTTDSS'NX,0ܹst:qf9r"fܸq&F222g֭\t Zd>NϟRtb0:|fMJp8"_lB B"-VvA`'6#,ҡT*9y$CCCT*l" Ҭp y.]D  ''G䣖Ex ?ΪUh4 V222222222/|4k[hn@ii)Yb?ijj"Iww77nd2 |z HOOgxxH$BNNrssٲe ϟ܍T*ٴigtvvn:y455XV~rxioou^XHurss%66}{D"oaXzL&IHH@Յ'>>~F~-[ƣ>ʎ;hnnOOk88|' j+ 4 N4;w. hؽ{fx饗x)//V&&&HYYqqq\pH$‚ xPsRQQShnn&77O?ͻヒjepp͛7s9zzzz*k׮%66}l2.]ÇikkϿ.(JnݺŞ={HMMe…\x{n:;;z\. ټy4TGH$͛innd2122Byy9dddp5&''IOO'77k۶m^W^y??ʕ+dggs1VXVގ%;;!:::lڴ݌_+Μ9ŋ)..7$%%s/2>,8$9u}}}K/C@/>ֹU .QRRB{{;UUUeҥB!>.\`PQQ y&۶m#==]*)5nܸD"ej5z~B륤'N{'g466>vIJJ">>@ @ff&2GThuB&Bjj*---Lo4Cپ};GE.SRRBll,sss,,,m6v;444B[[ZJ%%%TUUvOz>2\v/r)!z8N^|E$ >(qm6f lڴ Á7d||z BdnGuu5,--m! O?V_~G @OOQQQx7'DD8F 9qqqh40Pp8Rra ǛjzrkhPTpԩ.^699o~nJEEh4/@ @oo/ ?aRRRdhh^' Q^^,^9VWW1L8Zh0<ӌryõk0TUUqIxذjh4Ν;%>>^y) __A*˕+WxǨ#)) J%Gd2\.Phj5w)*fxxV+h{ wdzLOOsy ~_xfEDDDDDDDD_l&>>R||'99qbbbؼy3={PUUJ qiV+N" ́شi'r8{,HRٛŖd8HJJbmmwy% p˗/ XXX&XZZ"77{;wT*ٿ?~wyA;F\\>`Y  1113g:u Z;$TΟ?/211!eggOYYYYY,//{ &'' 9KKK$&&t:IOOGTsN:;;j~ eeeB!J$''uVYXX`1??OJJ }®Au]]]nn7۷od2Lnn.GA.s-$ ǎF***`0Hmm-IIIpN'iiiH_].111sMvIAA7oޤm۶q5fffHF!66! SOʊy  6޽{1 A q:T* ijjBQ]]-̭|<>=55vxꩧ( yܹsx(++5#>EDDDDDDDDɗAl6eQ(z $ PD"xO#"cF8& "Jc"s}#^넄[,jԓ+A`ZwKOG<]"e66d2{}h4Tto͆vGi_dD'Ҷ!xp$&&nRTk$㟛+x\<[o٧ ՝;wy'58yΈ1z}Ys`PPg7&"g% H$e?VYYo'wsqwzЗlݷADjJ$n7rRyd+ yO5O:+++h4rt:'6 ߻;}g({!̏o+ښ#""""""""ǍD"jR=""t_>Jp6"?F" Cܿ)0(H~RRjD6м^WZDDDDDDDDD"N/ZJi'ߵ#jDrkFwߑ9M32&z$LpO |]뛈CD ?\.C XZZ󑖖F0daa5J%(J~?$''"Pdt:^ɄJ"99BlfOjj Ell6z=|>fP~lmmMNJJ * &VTǡKKKhK\\MBBu啕f3TT*fP($YVz\.n4 h4Z9::czzNUU=!&&K݃oH<\NJJ 2L牉h4F#rQ՘L&$ d2<hZ?U ^Oaa~?of۶mbbbD!ߏhDՒ@(l6 ym۱$''V5Tbku8jrHMMEPv_yh4k׮{|Dr!HJJ" r9 T*IIIhNT*,.. =w\\\FaaaU=ZEHMMXO>ZWW/: `XHMMtttSSS^̙3?yǸy&ЮVyWPPPL&Pf?t:)..EʍrΞ=K[[7o$++ ͋/HWWcnn>v_W eĺSQQjY]]ETj줩 ˸nӑH${kٳ>(((Z+Wȕ+Wزe ϟWYYJPftp8(Jpxq:y@xh4 ?T*Vj/իWill4oߦV:::@zz:###\x.$ qqqK jjd2XVnܸT*%//r% |HR<~Ác7V VRx ø\.v;>oDJy^~_4VˬEgFTTO7ޠK+>FGG)))_۴RTT$/|lڴI~wtvvR^^.l@Fp:6dWWWjKee%@L&h~x<0^{5t:ӌQYY۷ioo筷b,--!HP*FDZձF(z 999,.. ϮիtvvLII ---tvv+j^K܊0,FDDDDDD˔YL=%%E03gΐϣ>/̑#Gعs' ɉ'<$FrJJJ>l>QwޡcǎSSSRAJHR:;;)--˩… \.eeeMAAKaa!;vƍdffm6v< ڵ tuucپ};YYYcpIRRR|2 K.QRRBNN~^z%hmm111ܾ}^:;;q2۷o@kk+Jft:gΜ!!!Ǚ3gf~~"aC_ahh7n0::JKK v믿j%&&z6bbbHOOzKK >F(\/~ \.ccc o>mƥKx|jɓ9sݻw{nΝ;|GCʗ1?*6>SSSܹslڴ Lbǎ<o`XG1>>뮮^' ԀjP(lݺB!FEE8<Dr>T Nl \΋/E&qya?.Y3ԚBʕ+QZZRd``99|\C={y.\FS8fmm~"bccyfvijjP(*dggBTo|2`Fí[p>׍Jbvvn;FTT+++>}(a766Cjj*7oի\~ef3pR}K$Y^^KyyJIIa``\. BÇj͛y'hllbKKK +++H0>$$$Q!Bӡjx<>|;v<{B8ڵk=z'$''#J!66VWW1 t:hP*B V%66 !vc0(Btt v?ѶHISSǓ B!a7it:inn$aZOGGQ^^Ξ={! r-vڅLBDhoo^z%yGZ]VZF ᢑY^^d2zj(JhZ***x/۶mi4 ?OϳJGGRo>vڅZJJJz399Iff&pXXC144D8 0f4FGGVVVhիرK.aXHHHr DGGc1Lfz=:y҄s~011ngX,Μ9Cll,2L5YXX`yyYؘev;cZ|gAz=044LDDDDDDDDsBhhhjJƍ3ϐ qqqTTThؽ{77o&&&cǎ166G}ɓzO䠧300$O>`< PoLƹsp E~!+++DEE!Jϐd"??Vz{{l裏sNt:s&&&8~8\tP(,ٌ033x'Q*9sF.KII<=sss$%%+LJR6/ !77WtFrA+HOOGRSS###l68T*LdB&-[0F8hdvvd222]0. CMM ˴P\\̞={k.r9333ܺuXz)rrrp8466cl"䠫T* @nr9!H0ͬo}lWaa!eeervލ!;;[06oތd``r$&& ͝N'OBB~JESS {"V>LqȠ~rss͛ qrrrl6s)1ʹqAm&Ź>|!ۙ{j TVVk.>C(R*j#G H0L( $**͛7366=z\А|8p(<: INNtFll,[l[n111AUUjR)F.^'$11qڕ˗b֭Ba޽d2h4r)ʰX,pA***y2!&F^]y%/b*]$l2!!3<,#r_߇}|y}]nm1]bAѠh>wVVVhhh`~~p8O Oߗ_'X}޼h2 /3 aJJTXH8{oo/˄aٴi=-fuuUXi?mcϯ?g7^K>צZDDDDDDDD 333NVVVP(mxks½/NĀi??Owjϧn~QQQ$&&KYY'6.}";r;^~w}B_~^_ ;P(Bk?{Ƚo_c>1#ru }kK8}cDDDDDDDD>O>N0@ڗ~1on!O@?󙙙H$!a!2O7zN'kkkR$ OvBB†ү"55]YDDDDDDDDDl;K~00J }wx<Q8μK$h4h?~G4"!d?% --Y^/ ϧȿ HAi'FT*E*~fqkDM32qI]xmXl1?"""""""""—yLwrJE(bnnٌN#066V\.2??OLL N1fPittEN'џPq\gii NŒ#a 4`hVWW"gffٌZFP<*J𞮭1;;J" 2>>pF< *|Vqf3LVA%yvvDFn355%;NFFF0͸nZ-Fy*x~'U#*+++t:Rpr9 IX^^jOMMaۅcN'~t:T^SS.KMl63;;+́@ Pz}Mlӧ!''灅PՊJbii222>sAEt\v a655jC䤰VA {7kŭ[E*G!Jcvv͹sHHHplXm6SSS(q|Oϟ'++#R1=i~Ξ=|W!r}>]׬o%ϿkaXXX@TT*q:LNN ǁ@In7:?u{^&&&bXc;c?cv399I(B pϘdb~~^x73L&bbbd riJ""""_F3 ^`0ȦM}6Ofbby233ijj_]vy/ɉ'y&~!DBMMMtttp!j7|!(//Ar .ϵkjwvv~|2}}}tvvyfMZZYYY76mfZŋ PWW'x뭷%D"ٳkB]K.100g``P(h4innʕ+l۶+W088(LR tՊbv jxL&V@ L&jbZnLQQEl6pYowvvr-n߾"&&^xB]]EEE100JVV}}}ܼy^~;Y[[#//O(1].&I'yyy. NrP(lF^|E, lڴ/RWW&##cLJ~ȱcǐXVn7F#𱒤R gX^^fmm`0(ST\.%033EnxQv8 Fjd^F~+t"lH$lDGG/Lqq1jzülpulrO yf~DqCCCl6 P\&''prq\XVr9) tff_| )++tR?-[B0DVxfqeFFFX, /0>>NGGP! Zjy뭷hii@ @~~>fɄRDPM6baqqJ燐N(YQQ~+1gb6韰X,ܾ}2?OSSQt:taZhZgϞevvL~?vF#rT{Gaa!Jl|>aF6a"Ɠd* Eo.̥HEF8~!<zy~?p/_~efffbuu(^/>OYkY]]6gggY]]Ezan޼Igg'ׯ_E Jn3??T*EP`4lhZ~?X,R)UZ-6MX\_pلad2+++w yyWX\\!n߾Mii)W^͛fW^addHFF0۩ߧfwߥ_xo~}}}+GSS ;000`0RVVkFww7MMMιs6~1>>8EEE\r^x;wh'ٺu׾i#""""1_& RYYG}D~~></2Gaǎ^Ǐ388HWW`0==<999Lee%NFþ}6.7oرc>} ފ"b*J ؾ};z6oLll,۷NGuu5\zݻwSZZ b6qprd2dggSPP@JJ lڴ+WPQQA\\l6ڨ!66blB]]ر;w yfIMMeϞ=TTTPVVիW`0l/0>>Nmm-CCCb2X[[cxxD›o~!(hmmfvLMMquFFFX^^OzRR;w066FQQ߿^jjjزe qqΜ9OC, DGGs %%77:|MJ%V7n`0PWW mmm$$$0::Jff&Rp8L(fyy@ ^q\0::Juu5^9pT*&33 8pqvE?III77v)..࣏>BTrYz{{p8gffDVV7n ;;nhkkn222fΜ90_ưX,|>|MСC\xL!!))p8n`ONNoc4# ¸a4immx1½/))a9s 񴶶CWW +Wߏ'11/ZF"Ů] ccc{344DLL *( 9s CCCv, oYZZ⣏>jr5G$E0Nӧٳl6|BiضmCCCtwwrhmmg?ZvF#EEE:u>@ktvv_(:t;vpBkkk_ϟG.__3==2۷ݻwsyVWW+.\T*faa9z{{yꩧ͛vx9}4۶m>H$PYYyX"""""_/cf D"%ݺu+;‹5@}}=;wduu>!$s׮])N^{ 8$ݻw^N'/5 QQQ\~FömoS.g#`0dB(3gHJJBVc?xwYYY!h4#j===ڵ DB0ٳTWWpT=HIIcff^/lݺ\`0O.(655֭[ٽ{7׮]#T*ikk< B(===<W"˅|ʕ+\r!x w~܆?33?9]+ IVVկ8|~: ߏfLOOs lUUUp1Kss3n[P_M\.ĉHR:::FYYY?)%%%~P*7L&!ĉ)Քrqx<۷H~cc#lٲs5^/JOO0 :Q{{A&Coo/111,//Muu5|SSSͱ}v8p1118Ǜ>;wRZZ*\7SrZ-555TVVRQQ#Gزe dϞ=l޼i&Çioo>tt:jB) n޼ILL CThoogll NGmm-;w79}4(JVVV~:&h~ G?СC\vcPVVF8b@BRD O ۷!a}ѣB(D9{{{1HRBN6oLbb"< W^Vܹ^Oj80:^#x#i6QQQBL&CTpx^z=:`0 BXn т^'::P($ w8 Ǭj\.zȤp8L\\eee߿üy|zZB^YYGEQUUE||<,//S]]-xq@ \G >dff'/չӧOsM9"[,veZ͖-[/B͆br!J^!/`0᷿- ߿@ȃh4|>2~W_}^>L&W_}c0 ::|^wO9¯V/o\N("  0 F!N"pnbzz VWW}.J<\^x[X,a2팍}#}P]]SSS ~B8Bk#9f|| t::N۷Z\R(zHIIԩSTVV y&p8Ν;ܹs,,,|>}N' 211hduuP(l<%%%XV.\ݻihh`rrt~?Rǃf0/O:Ebb"V,!8<<,8199޽{9p撘ZF*2??@JJP^0:::&)) ʊpl&&&hoogmmhٱcx^PP(D8S0<$::͛7S^^hA^^裏RUU8ǎqqqϕD"attzzzGSPP>K0daaV쬠)+uuuTUUVH,// fzzz6Bd#\.[BzT$;m'mFRRIIIzGjj*˘L&<P *poպa/..LYYڮT*IMM%66GRUUᅬFA~Ar9 LLLT*EӡP(HII`0g8ݻ?d~~$\~wyC-d2BAA , ]\N۰E'&&bGضm z4fkdee$tww3??OYYz^H"77~PTTTHOOM6!fhhBhooxU*** ᘎڄH:;;qݔ fllbth T`j@/W*""""A:::pšRG*XHNNF#'&&r|2kkk:uJB.((m^➑8 QQQA~~>rȑ#Ԑ޽{Y[[ŋOCcc#xLvv6d2~:*'OP(8<KJJ mmmYRRcccK\.'33)*++IIIn|Vݐz0x!?33v!vZ-6mbqqTjIrrrVqH4*g}V0=]]]lٲ]vBCCqqq;vlPW0D*Ekk+Np8O>N`0y4z)**޽{ٳg111ܺub/uCzz:*L! 55DV S[FEEQQQdee щ c2!))۷311iii ∑P㱱1{rllx D.S^^NZZìPTTNcyyXϧ@nn.===DEEQVVF\\III)2Eӆ>zSSNS(n!++{)jjjpݴl6O`06 $$$0<<"oF,۷F#G!99>d2  {nv)h.TVVw^iiiAR㏓4Ӝ( bZ9uEEE8N8z(7oFHaa! ;;a, O>$EEEn:;;9|0[lAHnn.&;;.~?O>$f9qiiiܼyEv;d2@DDDD˄Kl6}مz_HxHHHJX, "Y, İ,,,RW_=4A&1L=:F/`XhmmDHMMeuu_<3w"ǶSf||dff,qqqر%"^_f}&..nÜvKKKA\?**dB?!qqqw=o8`05OkCzz:2{&|.R*%%@ВxPc<_vF#'HزeV-"ǎL&OOtV0{ZP}|73}ӃfB~~2erʗu B0>lpxX_y *fx8J?}6@ЧzQ۠A"A >H$ u[D}kםkwyPDDDDۋD"ʌ~%zD~nCbbW2ЗP߸m"s#!D䁆G^6LȷWZDDDDDDDDD"N"Nvs_\:w<{m<N$L$ ~<{p晈ȷ/}*Var9`0z~?LOOLLL QQQx<&&&n/%h42>>.⅍*na|>.Q3W(366F @ z|>ccc͡VQTBV+Qլ }DGG355f1Bqf3XnD`0BOO8bbb֫!u'e6^p0<O49,--122BkҒ=vٳttt Hd2!ɾZG}A}3<׮]W^yLCCzQΟ?+++B~n߾͎;d**IDAT= 1332 ӉJcuCkuuUs2X,bbb8w7nܠBԔt:1L8o3 ~_}6x>N @ӱJv;JV vVrssyٶmSSS~d2:oAOOkkkdeep8hjjb˖-^DDDD䏂/cfݣ[raA)2nǏSO؈&##C盓C0D.Y[[#**@ BqI^C*r)oX,y_+fffկ~GappP^XXR JLEP`0?n7?'NE0]t:yY[[C39x /P?!o٤ϳ-u ?fd$'',s?O## /`:͛7el6fJ{{;O=}դc'qebbbA HHHiCuii)zBNzkd3ѣ$''L&l6r8p[la||={`baa /LJJ F.\@VV2nݺB`ӦMQYYIii)z=ᅬbaqq^bY |s`aaAz?ϙݻwx"+oAvڵ3 /jؿ}vdvv;wOff&pQ`ǎL&q\9rN<*555ᅬ^R>rKK 8qP'}=ccc444PSS |{ڵkHRatGYY/"H$:;;YZZbmmz_X XYYºlD6~77tuu,lnnfffx~PTTDOOo6333\z-[ ddeeq%VVVp [k.y뭷p\A0ڵ ٳgcuuݻopJTTԧ:Dŋ1 l߾بR-Jl9s\x]ߦ T*eii~_K/"{crrrc;ƿӧP(ę3g((( T۷YZZرc^v |rijjj|p8Z駟fӦMdffϲ ۷sϡh$%%qIdJbb"UUUر:^/2-刺'|@ 餵LF(j{;rIr)RSS&Z-ZVS__OWW$&& ^dDmm-2 b޽LLLMMM \|P(D"appǎ;ؽ{c$~, :ugg'/_&77wC(jjj8z(p2'))^z >Cv`ΝRVVFMM QQQ)**6Bmmmǿ]vя~Dqq1j'OSO֭[pIEE%%%=zB!@fVWW\.%B;FT Q#wSJFپ};lڴjaMNNJd2<455QQQٟMgg'>,>,={ݻv.\ PPP@uu5:O~|cǎ!J|jJXcք5^^ijjbΝP^^ή]PTL&&''پ};kkkr$ }}}444O~8@kk+%%%?L?3&&&HOOK/a6ILL={j9r?<###nF#/_橧bmm ˑ#G^m,_|vY\\l6vСCzlBBBccc8188(4F y(5t:N8fyyFX,_so&޽v~~^8lV`0jl6c4]Hv]xyJx<_f022hduu l6F#^w sN07n^c׮]BNc[[[^^/pp\B **J( o~BB D"ATEcc# J\.`0PUUũSxsgg'ټy3ٌJĉ~<#@nn.MMM455 ccc|>!$s=kkkt:ceeQdvvc6##VpV%##:ݻH$Ę[ZZbeel ?~\PaN("::Cq |>R{y jp8cuuUjZOtt4FQT d=eDEEЀh$;;O||m4IIIa||IY]]ehhA %%%>|NǶmB` ֒5rss֭[H$ W\tnSKK Y^^66hoogxxx466C\\y'Hz477g._L  -- Krr2SSSLLLt:IVWWl 1>>NBBڵv܉B0Fd2ifffc~hhf *WF!>>F(((" 344林TkĐojj"++D //`0`p044<011j3::ry(--%33SDz000Faii;iiidff@AA^p8LTT6 FAWADDDDDg栏 qqqh4P*</[joΖ-[HKKQ__\.ɓ糺J__;v<sM&---Fp^^=Ere2mmmɄa_R$qcnn.F|>YYY߿RSSٳgPZ9y$:>d2deea4,--؈^'@.su #JY\\$999!o1** F#UUU$&& tLd";;VA/ CTT$$$Eff&l۶Mu8>|hrrrtXV(**bӦMnf3j277GJJ {^>22"SQSSC jO\\裏R\\^WֲE$.388Hbb"SSSa4t!r FIKK46mDkk+sssڵaDR8+++DѠV)//gnn5Ad2N||0DsCIII!)..&%%8!!p80o&&&'Ot:y&SN /❞EJJJ6H"Jq8ܹS(Iiوݻw#JiooGR{nA299^pIָ}6}{B{aa! P((.. ՊZ&??{x'@VSWWǖ-[P(HRErIz{{q8`0P*o>JKKr )))Y8fqqm۶a0#rrr| ,--Mii)wnCrr2[nPTfj5=V222xDž J%$$$PYYIYYd2JKKp)q4 7n`֭ƣ'n3 ]pj5TWW BnO^^{AڊT*e݂Pi\\III|>L&>(477t:yIOO6^ X,atzz`0`ӦMdddJVVKU*唖}o+9M=B'’g333 B J:DWYTJLLC{ߥRiD LttH$DGGf?"{_5ᾉئ_N0~SoOи\.^/.>3"7> |]h'뺟a\.RЈnhDP.r """"""""" ntQ̽nC!KKKh4?~߯wD@C#w qy_!"""""""""~Nr7xgy3/ƽ_8FkE>kς8/pq->|2n6mbjj d2a0P(8NHLLb4*h&&& j^=J\\z5)r*LMM -#~j' axx\<<΢ 2??OBBq zfRfIV+144$oQQQ)311'j,..~Hdj%bccLNN 111,//ݍ+1??O||<~^9 E\.ߨnA*>e֫f 5Ocaa^a^O0AfffPTv?<,..9۠m2@[oERRqqq~N>Mrr'%{_&j$ 177wm0dxxX>[h0. !˅7Fww7~_eqq8d2cccUn$ɷf|4GFFx饗TVVrM^fc``"Ǚ孷b߾}t:^u^xx jkk%11fggy 444yf }aawyn:!brjkk1L\tdR)>8pDkk+333ձuVz{{OjjPؼy36_~bccQ(444ŋ^yOذt088EӱF{쬠0227`pp,, FÁ`P* /㡮V+ZH0d~~E|Ml6w^昘>|Xehhٌ^v300*sssL&cuu^x`0͛7IKK v܉hd||z*++YYYattTJtt4:tuuEVVֆxƻKNN/IHH@V322Boo/sss(JZZZ(//6Ozjj*l6L&eeetwwS\\4۶mc``@0villg\pcǎ ihh`mmC} x7jh4>蠣zN'J,yW1Ltvv"9{,SSScXP^^NCC}}}LNNb… 呒"ŭ[Fbz{{oDB[[Z6j Dw6TZ^{ "k@ש'## .ĕ+WX^^nvIOO Zf۷oViiia``F)//'..QN<۷q\8pjf`D299)((ܹs !Jj¦B JE}}=A/k׮Aӧztttp!&'',.\~3 ޽{ ?$;;v.\nܹsa_NVVt:oKbb"7o$;;&Z>>}j}QΟ?OVVi X\\mmmf__ kGaΝ\pA7pu0###00<<}y& ~pyj5SSS_5 5EDDDDDDo&^p8L(]vt:IOOp`6ٳgxW" $AΞ=KRR۷o6jK$xꩧJh4PUUūoo>c?__x7\?ǻKyy9eeeal?~ 555ϲyfNF^'Ɖ'0 |>VWW$>>rihh'''"T*axp\!JY]]211*P5T*JR(cVXX?OBB^n bjkkaǎrʹ ~)r9b̐m(**͛~pw7,*PJN8nr `Xaz{{9y$?8¦ PT08N:::hmm%z!**G~ʜeqq1O8\."JJ( IGJJ%~AOYg+++1?? ݻ^IHH`ddEee%kkk0==333,//cXp\(Jؿ?TTTޠx^Y\\h4~ν+466RUUE  9FDGGښ<==n'##X,, B*w2BVՊAR0in7˗y7زeJBBYYY8NY\\dffdzpXxIRa3% (BgTT2۷oD^^@L Gee%O</nnn׿5DEEaP*ٳGPq\EEESWWGVVvn!dM@ @[[Cerrc8Fղw^n7ر& )))TH?M^^8p@H$P*F)(( ..j;\.TȼB2 L&̽JJJغu+  HNN&==tN8-["))#GP]]NJ11RPմ300@8FR )vVHMMennn|aiiZl6)))444pQFGGln:::>RDBII ܸql4 RXERF{{;BL[[>dvEnn.yyyBKKK,--qMdn޼Iss3SWWa"DJ%8d x^hmmeyy86<tvvR__Oll,iOcc#XVjkkYZZb˖-hZ"y&TTT033zTWW#Jcxx*233ihh\6mDoo/ׯ_GTRQQPTT}3C'&&A&VhN:Ett4vQl޼͛7޽{Y\\hNz)"qKKKR\a d0h4J%"999 ޽m۶ݻ ôv1FTbZdyyRn?T*(0))),,,P(X^^&99J(rRHKKf @&''a۶md xQQQHJJB׳HHHZv89r8233¥#!`q:FRRR{w?Y>33 رcav={HNNd=JQQFP(ēO>I0x  q1 wuup8ΊGrSz="))vAYYL&'4. ::NGYYP(ā0͘fIJJ"99yd z=( !err\1LuV*++QTUU8199%++~ jǏ?4eׇd2RRRHHH 55VVV0 >|BDGGǣ>ja@tt4>|4VWW/Qd#J0ILL$!!FII (JJ%N|6mĦMfQQQAff&B!1ݻwSXXFcǎQZZL7BVWWX,yfq: III}U>oJ$ BT*?Q*U_."_yyy'NDDDDDDAĦA_^^f /d\.Aa0:h׋ԅf$ ~ɽ\geeEG~P>aGSh4BTTP/Qbcc455188,zyWWHRD*b0ZN6vZZZp\$%%}W3S\ 쉉x<:;;A]]]hK{{P!Bz>E) QQQtww399)l M0$..X^^&11enݺ(fDܷHmOc||1222xm#{Wq7ʹ QQQ ՅD"!66Dkk+`zzD|>mmmjȋ qw\0==իW)))70;;+x<k744 ~A|>U/]k‚y ?8NZ$%%}b>F@ @cc#{}'vWbb{%vEl%Yٱ7wN|yN&]f2+]|9Dzl%Q"% E`>>L")gCbO9?NRRGavv|XA͛cyr8vܸq v]tC|2Fb倉 n޼I jM{{;VFCss3"8ꢭM|gggqP晈F߿.f}{TTTP(1Dw%%%c%ֱ sssB!q- 477 qhh[n1==dbddVK0Ųbupd&''$-- G}}=Fz=,--aXKqB$d2QWWG[[}}}c23::lFVB8l6ߏB@KK AVg ü~-'яjc488HccăY>88oM$a՜;wk׮ ijj4`ǎ z-~_{gh$99P(sqZ]]V]!'6uڵSu2kuuu|>N>-*N8[عs'.6fff8<ׯ}p8.]Xf wyG,T*u~cǎQYY)*8@__XYnܸۑ444abbYZZ"++)zzzr ;wdxx>LII +=00 333D":::HJJB.vFFF}}}QV+?%''$:;;b|Ã\@bddVFFF0ͼkpq y7P*֢蠮I… lٲBГʕ+jb^iiiW999h4L&322\.X,lrB,d22lņ6q홙r2/^{{Y._r1Ғ{"++KE><<^EINNFTE?fp8Lww7fկy#Q(D" ./222BQQ|[l䰸H]]= F,--믿Nvv6vfffhoohZf3~!lٲ ^}Uiii477[oQRR`jj ϑ#GtTTTE__f.CZ-Ǐ'P __Ů]xWٿ?7o`ӧ)//9<{a߾}zx"ɜ={VϷoիT*y7;/RRR__s-n*)))ܾ}[Tfdd(񰴴DWWfRIGGCCCL&Q!PZJПHL&cjjg( .\@yy9SSSt:&''D"[o$դ|kTUU}vѥqhh"֭[ܹ .qFN'7o$STT癞&%%N>A"++>^{5A`ǎ477dhhk"Bv"^~en7MMM+b F(( /[DAk_KKKٺu+ l6vd2QRR7ˉF'?qHNN|FGGq\|tjkk??/뙜dtt^D"aN<8Z.=}?֮]˺uk9+J8o_o|8N.\VB{d2q9so}[_WW$kjj"//n\.fQ֬Yٳg}>rsst{??uVNJk^|*=Jee%x^0q2ÌhkkppIF B~N˗/ݿl>^yQ}8uX@^ydaaAkc\.nG?vx<.z4,--?dÆ tvvL&cxx͛7Zn:?N^^,,,p8t/"n۷oUVHII>?uvffw6o޼bL$$$$$$6VY޾;bX,Fmm-[lrV+LNNDEE{x<Q`<[E">Cذa}=66Ç7!Zg>x :(G?b۶m߿׋wa+3?sP:tH6A(--[f)صkvZ xZͮ]xgZKT*n߾Mgg'HE1b޽TmH+X,޽JFFFFhZشi3Vy'׿puֱqFXf yyybZZ/2%%%Z:::Jmm-b1 TUUuVl6ŔRZZJaa!* AP(T*(6l`xxq|Irrr(//gݺue Rrss5y''q)yꩧWBRRv??g޽wT867nf_իWЀf ϡ***/‚(d2yIȎ;xHwJKK^zg}Dş`7AAAXҲ2HKK#h>v$zF,7^7_Ѱzjz-Ő-J%Z& y}69NXIg$AVwJ%^gYzwHªĹ}"xg-[K/1::͛7)//_&''Qa p}_^^$P( ٵk'NnbnJHHHHH< >Q@AHKKcf6oLjj*]]]B!q#TYY) .u h4RVV8N" suallܸW_}: XZZ" (Ì Vchh^)++#.KFW&==@ @SSCCCLLLfAbbb~?oaiiGR^^7opc pLl6T*hH]YYYtvvR[[7' [nx((( Rx< QZZjg}ӟB0h4***âR"Q3QVVŋ9wq55$bqn(>v nJKkldz\N<'==\xg= wM sؐk4ђ(Q+\``pp%rfB(++#%%bկjB!&''`bbB0q:9sׯSQQACCv$g݁eqqt:0 ZdffE{{;>K&*鑑&''BӃZF088("uuuQYYt:ٰa)))TUUyfJ%NqLhhh%*a٨Kee%:tE8YYY2 8LLLxظq#>}WH8&<nP[[ٶmO>$.]ի\pNF#?w޹'_4<6m"PUUɓLLLf"TUUQSSlP[[ѣGٸq#JrźP]]$'NСC,,,PUUE$!??IKK~7np<xJR|7%,Z[[%99&&&hiiarrNAAٳ?>><\.N:%8w{r1::bpp&!!!!!Q0 XV ^@ӱHaa!hZ*++ 6PPP l~+_8^"]]]dggw^d2f ߏh󑖖F @Duu5b1bTWW#vk4 p8HIIl6YUU~˅e޽8N'Az=ՔR|رP( 鏤Gh8BA4E.n:Z-<lڴLDsqq1F? tttyDKr"=&%%/H*{S}^,,,`4QTXV:lq:L& n'==dV+N@EEh]R(呒BVV('tdff1.S}4Ľ,AO4͘L&455t:dggcZ1b`Zٴi 099f#33FZZFUVQ]]Muu5t:#'''|y|IBdeep8l$%%%^7)) J^^,//)Xj۶m#77y k׮f=;&//JBXVF#UUUFسgtttB[vv6JV˚5kP* SSSl6RRRB&} Avv6Y 6B_nn.@q222p:RXXH?l۶B&''|呑ݻ UP*n󠰰PjN'V\ <. NO?"<<dgg  l6JJJXn>IXe2b֬Yhd2QZZJEE###B!^|EdggᠲkFݻw5l6SXX K/h$''XjS]]㤦+Zw$99ƍEs=GYYxKUUWQb,Y婧"33E^x%z=mĠnXD&1;;K0- oƧv9q}qOMM=:蓓7 99{jKKD2M'L"bpםFvc;*9чIz=wAh7kv^݂@DчopbnGJ.[7|JHHHHHHHH )(`oq:qeS0'n 8Gϱor󀝰<,qkOⳏkx6c/ھ+gˏh\|ZW77?'g.zb![j*x.$>>n&߃O^G~ݚcϲJHHHHHHHH|2Qx]JN:-("I~| %+ JE8fdO `*-8v;yt2!+ RɵB ߽q<ъYF~r2~?MSSZ68L/.85Qfmz:FfqT Vn32:M4OM![(t;7GÁ`gn9l6VDq X^fd Pie2113Cvr2xC!DZtlD! <5tΙtbKNƦS7:z0|ÿoF$gg?a ͬNK#Q?1B(*l޹94JKc> rYۓL+&~ ~TpMz(rfB0 m6Rt:I7P*rVp{rײyXB&hh 6dfLb \Y0%d.,OUeG^kN 4ffd2?\+*H5~g+>99{7y kNgg;/T] @s@@< ;?/ߌzĖ=x|.ؓ((H3MOS32"婩(d2:ff GG*$k5nc*=D\Xpc6*- _ew63YY|QN e2 lYAѰ /9B\xIwKJ,RRHK#E~|`4EäѐJw VG۷cX 1TlȠj%bamz:&3KKrVߍLKìl!ba> IJKfy9WUA`Sf&>S~?f=lk bw2fxXp;LFAZM&X 8̄O$m.]ss4LLɷXsB'DT2V(XDP+dݜXEdJ\w= pEwr FåaL̇xA&~~?`٥%^&~:ff(Xz gp-.޹'8̭IYDЫT\c'_f{TX5lZ->&8 @8qj o(DzR5w-&n7WFF蛟GP9wG Fr׊d b$ߝG@Bb$2X gQ S&29v]őkqKCCB!:\w~,$ CC,+/su\X sv`~x=cjIVYDzx蜝eegnig |m"J%zzE(d2|QN7 w @4m.m.n Z<!wt$$$$$$$$$>X,A77{(BP[?@vL&vnc#҂(v~e>_Gˮݧ4[DD |G˓-G%sFmϯ+56^?ﬨ| XpaLIy GģQw?2@R\l2ڽL2OH BYJ2V>|G5o%$$$$$$$$ d}>RqcOiA7T?_ZZbii gvvN#ۙEף-O򵴴":SSSXVԏ޻ LNNp8@cqq@ o_FFF|,CD-%'! &bC<JFBBBBBBBBBpO%(vAΜ9Z&%%@ @MM ---D8unݢtt:SSS\t\d2oߦRZҥKINNH^O(իb>Uxii JZ^/s<|>._LSS:BKK /_jܱ~;wJ0رc477ŰX,\~7oDZKr{{;gΜ ͆Jի @}}=ׯ_' /^d||4'Na233ihhP(nG.VT7 !--q`00::ŋfhhhhX,& &==p8ŋą  )) :Ec`aaxI]]2IJ=77o?tbZW[ww76M?Hh4^' rZ[[IMMcFf} π%WF,ܾ}7npW 77ĩSFD"}^{5СC;~8hg{{n޼f߾}?$AcX8z( q&&&8~8xb2W_}G(ҥKtuuw\/^??322ddd`,--oX"8p5FF :tK8̻KWW^ĭ[8~8FBB/^OA344tO9WrY<c+x<33ӧE%PKK 344Drr2XW_}rc B&F%F[[/.]"7nԩS011AWW>Fb/Ν9y&&&Lcc#ǎ#믳oYBBBBBBBBzII ׯ-x3338VZEcc#`jJ%7nnsuL&%%%+Wp\tww388HFF=TZy'xL \.gϞ=lٲBncj5 t:y(..FTP(ذa}uww3;;ˆ F͛twwc6ygFR&l6n7uuu\. w&%%x<^穧bÆ hZJ%֭㩧bP(0ͬ_h4ʞ={0dff!Z/.\СCn>CF_}UxאrJ%Fd=Jkk+߿q]VZų>nGTb2PՌVIJJb011A0DSO=ų>Koo/vJCVd2͜}._͛7y7Y\\ڿo㡶k׮r?o>0׮]cll шbA,B@ՒF[[uuua顽 ^z% ӏ%$$$$$$$$jw^<~(F"nܸmۘȑ# 188H,cƍ|ٳ|>x"wWMqY%Oee%֭?_~N:ſWJve22x<΁D"Mvv6^z%;fzzw}^x =AFFǏ_q=n~m|IF>|Rɳ> bpp 6`?PYY6 @jj*O=k.BrYz5O?46xv˨ \pYo255E("%%L8X, ܊8477sMf#??FYv-Ν۷m6hoo_+vimmv#lذA (..&j픗!'* IJJB8X DFF崵1==pg~Z,ؾ}NI-5tFMM O>$*sY$$$$$$$$$||>99IKK c0CӱcRSSikkC.SRRZf޽T*Bp'xY]Fzz:?jx<=]z58pBÃ"@CC:Yy&===tvv+Z}6333ڵ N0+WP[[+~+x~_Noo/\t~233ϭ[ooBRvy9x 6MoܸAnn.vÉ'8wdB!ZV&?S\\Lcc#'Odvv\B@&yyy S{{;k֬!99}cǎQYYI??1LLOON9{,\p隣FAwK֭[GKK x,4 999pX,YLUU>,yyybU*V7/&ܺu+j@ @FFOI0F^E˓O>ի)((vSZZʖ-[(((@T^ J%YYYr1I\.x\Sh2PTt:q?oĜSSSdffc MMMرfggD"ٳgZEr9NΝ;)..FRQPP@FF/A@&aZq:3Vٴivٺu+III,,,p8ıx'h4K8Jd2fgg TTT<қf|:nÇ377Guu5{yܷAs<qi1Qa^^vTnW^LFZZ{gѐHu%$$$$$$$~HAPբ0}E ٍ',`qݢEˆL&c~~V@b`RŸA0wvve& 0;;fg| @ b؉RD X,3뒄22L 4~'bL&#  X\\P($&X]' Hxc}b.og%𙏏b,-- G7xK!cy$Vo4z+!!!eraT*ܾ}(Gƍ^gttӧOqׯ_( z=gϞ\nX}jjG2;;K^^ާjP"Zƍ\xY233ȑ#͑ٳ444hlܺu3gΐl9rT8po/_ڵkD"ѣGnV9wo&??Z._NnΜ90\.>C루RIKK MMM"vRCCCdff>p&J9=WW NTZ-׮]ʕ+a?O>AN>Mkk+aN>۷Qբ3}yGz~$m]XXd2lj'ǚxhkktD0$%%s$ZZZ0L,~aʺ{]]],..b0z*k);}=88ȯ~+Z-Ofvv!^hqq݁;BPMM gΜ)&p!n޼:y&&&t:tP(DFF Ι3gSWWǥKp: .]ą C&3G#555\v NGJJ 8qCFF؎ax FZ#( XV^/MMM| >|{*|>Ƞ}䪭Dr 555A222ȑ#@zz:p?~8xTFGG9udff!r!SN1==->'N -- D?OTlii!??;"++N:E__6 brU^J("==]3#!,Y?Q@x<\xH$ի9z(är96l؀`@Μ9Þ={P(WGe˖-h4tttsO ˬ aZ9s NKK ܹ׋CTr!6n܈ȼ<8N7d͚5~Μ9ÓO>Ivv6 ˅l/#G  8Ge֭T*DZZ>|I,C܌墪 <Ӹn~ݻQTb 7nܠAh4T*FX,.]Dgg'. 's ::: OSRSS1\vvl6cq_.ONNP({ǦMc߾}s-_8---TUU Nbǎ(zgg'ׯ_)*W62kSSS\rGss3o&jL&SSS444F$ƍRSS Bl^oo//^v322"/2<<`zzׯ388Ⱦ}%++KTnIa^WW0$%%zc||>NX֭[4773>><7n %%Rɵkhjjl6 z*###X,hi r^}UL&~;244ŋ%==#GzjΞ=KFFsss׳gFGGvX oMrr2UUUŋikkKs>|'x<ڵkBFF ey'==QP\\,n,V+.\ 55|jjjhll$99v._Lyy9G7x]FRRXchh333nLFKK ]]] F4ʕ+'"v]ׯs-F#2+Wۋp4 `PLrz~?>Jmm-믓Vh42;;Yy& '*v;tvv`Z;SKK z"D}}=ZRשȈXVq8 >F#FӧOrpeee={.B|jq)//x466ruJ%2Vf߼y>|>vRRR L555fjkkP'K$X,\pJᠱ&vsssT*>YZZӘL&`qi^u?'//Áfcqqx<)**_VOqq1Ǐgդd7npIb۷osx7wl6j1 sZ-8N9B__^wy类;cL&d hZ}gg'~$صk{ahhZ^պ")L&czzhs>L&G}VIOOn%nϟ?O[[^gh49Bss3o6zGʻK<_!B!}طvLAbցΞ=KNN)))dff>-a|>h>&Μ9Cff&6MD:<333[|8qBF۷.:v~z-z->&&&f޽<0^{X,b!==tl6X,222v$%%ﮰܜ?Y?8r9z=ܼyzfffx1\.b׋Fx<ƍ2''.OZPIDATb1ۇBQXX ޽{)))0ͤٳg .044ā sU;F__zV+~jjjV˛oɜ={n޼ɛo[ośo͛7L&'N}P(p:Mkk+===\t۷o??h8vͼ[hZN, sssl6jjjp\tvvڊfc׮]bZV1\~]Xy7b#>'۷N'>K-.]"[ohhooڵk\~ >7@pY^=3;;KUU[n`0?[ll61+t*l֬Y#\.(hT*hhhrq CjddDOOCAqT*v%*~ C&}jO_>,`'OZP(DCC۶mcvvGD__d26op%<%%%ٟ:ه!~~uֱf͚vR[[ϟ{hN|'qA~?__={8>_E'gy˿ӧO=;OSXXH8F lܸNQ6qv;O>$eeeuV1U.322BEE۷of!_OGGE ogg'sssB!4cKx7~o266F,7DLOOjrT* DQq?#Šӄ`jٹs' PZZݻIIIC4֬YCFFiii抛^͛ټy3l۶ NGWWâŰlڴIPܹMmmh-cll.ZH_FaܹO,c͚5ݎL&C233ٹs'EEETTTi&hkkcnnEt:hJJKK18N'餥VdDQ"r2^FFFvdggIFFhexxt:Ο?7nd˖-L&RSSя~=hooGP{nV^-(KJJ?#&qX,ۙXn?A0 bh4B!**I0b 6$CCClٲkגfPԀRVVΝ;Y\\SXX|>q:O)**bvfgga͚5dffF~~>* Atlڴ-[m0tww344ZVo޼y2NTϱcؾ};7nljjbrr~Btuu}vtDGVKee%k֬a~~nj5DQq 4 ֭֭[b_=p`rrMRRZ2._,ZXnIIILLL E͛qݢ7^pakOծݎB`aawy 6l Ʌ w+&M'AN42<;@<_qOGGGuhPTT*ٳg66T*EEEt:B@.m68{,p>Gsy_Ngg'j)Occ#H)|>W\fzzz\.gbb`0H{{;rWJAArR'O> nۍիtuuѣG$??X,FMM ===\~Yo!z>|NpGc^PPb!--^zIt_rBB) eeeܺu#G0;;+M&O0$;;\^ƍE+|Ԝ:u^{ ^O?jB"X RFjsI:իwѣdA@Tr9:;;iCCr…j]OOb L&~?7n "P($2S^^.zj$o?:"X 02jkkinnFӉs -zgyE;JII~qcP() 6oLJJ 67hV]c007Nqq1ʕ+lذK.Q^^NAA/_~s9q?^~1 D"jkk9vcccQZZJ}}=׮]cqqiN:ř3g0b08s {kDot1tttP[[% ֭[شiv& i6 J% f_WzmF0cXCU*UUU={SN155Vχ\.}rMؾ};Ӝ={t\.@ {f"oQaa!],?񏙞z^7n޼M6EQQ}p88s |8~_ 3}8z( `ꢭׯ333Cmm-ŋt:1l6Avv6֭[_:qmmm%V7XYfv,&/|`׀Yt:zz"X.6ѭP(ZJLb7<SQQ *{{{N"''QV}).--1==MNNccc=/D055@8FբjPQ1kWW:2\.(JYOxuuuQTTȈ h4Z ,55U@z=x^h4dff{DQQb,q]%--a {{6 ###l6vN<44,'Ogs xA, twwF)++o>bannN k=3JJJRTTtw tww322\.''',|fRdڵ,..ގ SPP L&#-- Eww7ۻ?}d||~rssΦ!r9W&/*t: !zeee/G&ȑX,444 İNMB2>>lFׯb1<pպ8󪃞'Iv9tn 6}}ra\@$tH&&WzO ώT]El^x(ÇSXXHEEx׋dzWo}]Cᳰ{wzYJHHH|H^WLT*ŤV@_XX5L&fX,U8&h=٣"D2_nAD/'&s-qi9RRRI D\>q!h4RωDuP(筄į#Q WF\I"q_Ib1i%$$$Yv:::xw|<<3++w$DBH ?Nd2A7Z=qMIl.y DQcKHޓH(X Ïݿ$ʬ=y+! ? eėi%$$~HZf Hiv؁Zfii# Z^QQpqM1&ʗ'<䏒%JCDX,=(\%. wެ`PLX~zB'P;ɲy |}_Z~N4 |BO57tpg^]8G|9IHHHHHHHK‹a=~QI;!l}w|& SWB$!?tAyaa@ !FדHb)rJ}8N1}vvCd2B?semaaa;/0픔{HHHHHHHn>Ag2ߓ$n~~V+]H$c_' Q(_8}?urQ\auyM>hhsȣ_7/y#!!!!!!D"v€=BThVfj_$Xٽ唖"X[\RPRU !attLNN2115kDA]TV+B&T~҅zzzx7xg(..7t/>JHHHHHHHHHHH|2ֽ^/H׋޷z<gnnM<rI@9q\bB"3W@b1| ˅uN@,CTOk.Q>]P}v(Xl _$$$$$$$$$$$$$~׉㤧p8Vě/OOu_}aaAΝ;̙H*͛ӫWn kzYF|*X[н{w<9F CASY6u3[$ѶmN}Sj"]u݄NNs8wr._4ڇ~eo!˲)Tt (iεһVe'z<)QAo0ݾ<$Kg"QV{[+F;VX  yTikU 7=/O7% r%ƍ54jԨ*#UxݴW+C dYYfXYYus2FC\x'NвeK6mzoٲZ P2 IMM%$)hOOO8}4mڴ%55j*v'ֳώ;Eӧ_G&MMƚ]Jt"NLJ#I_}MiK6mxh۶-k׮A2wԩ<a0ͭv,@VFd^4 z*jZXY;wѱNa0Tŋ8u#F< Κ5 4mZ/?jřP1bV **ƍݸr2JHHj]PKZ;Ko9SS?F)++S[n?$;;FѮ];FZݻIH895e˖;''[jYlNm6d 70nǟɓ'OOOFxUV7yC3߯pԩoa4gʕ<<==yg$ gggXz5-ZcoPs< ݲQFoUUWd=;TPpRuE|aÆ3ǎgFD=fru˧~J.aL'N2~WZǏgȧ$++윉'ÇgժU4nQ{wcCx3<ó>#7K.S򄇇mV5 |Ę1cٹs'&LWe^X9^oP# %˗/ 0U8h42}ju8;;sA@~yfY>[Fhh(uռ%#M#OFvSy<99~JY $I6 ^O~~5ݝlm$W(*Faa!h4zȲFc"29ammNڵb++T,>+|}}Ԫ"quuAVW{[e6o;M=ڻ.Y5M*\dHq]8:#IyyŴƭe\v^b^^M)))ggJ/,T*wƯxsUdqGsʹhтd<<)J={NF^ A4i Eփۨ4t `R'ARѮ];>LiiI/-7DU>nee% Ԁ ڵѣS1 2WWWطo_]7% 666bJn&A,ά#I| ,x8UxA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8xA8 ?~iԨ[G-x*PXXHXXX߿FzP~ 44Ԣusz=4o.zN_^x4Msssk*AZ <.\P~0a|GU !6ԲW>* +++u !!!ҥKV\tknVKhh(k׮m۶Ѻuk[,YBjo*i∏ݼ#K,[nҶm[MFYYYIEO.wԉӧӸqcvATTmڴcǎ]}o>\]]ʪpx_0k,VZEΝ9}4o;wusQ%~?%wՌWߟthڴ)/bIEϨQٹs';vΎRRR֭xzz*eYw%11Vkk.o4m:w䫬dI>sV7n?ÇӿdY65D_d9rM /(ywYjY> :ug}g}|KZrssb„ :tx e!XŅ-Zʖ-[w j5...XYY7|Ì3O8y$۶m[[[<<<$IX[h/+**BӮ];T*Y{~`s<Æ c7774hҥKL4sakkKhh( .,WNHHT*2Rlܸ777"##-f|}}yxpssŅ|, BC#M#OiAM߿FynjvR[sl`֬Y8;;uzD@V V/EA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,dzo߾j Ln8]KǏuu݌;V/vA~0i3ȲhT駟^BAxn D,R(K.eɒ%g,^H+<#tЁZn]2>>@ڴiÞ={9s&}W^0tPz=~-?֭_~\]vsNtC,r>}.EW5\ĉ899K+2Ofذa;ovq/Tgs2:t(ޤ~zFMPPL'O? **D>#LDD+WdΝraZnTODDzJ`0k?xW_Ec0z˗SZZIIIo3rǣ6U[z#%%[[[z=>|thժh4yG5k$={vZXv-={g*9Po΅ ػw/6m/O?eȐ! 0@I ,3g(((@e233hӦR~pp0={Y %%ɓ;v,7o׬S7˰aڵkΞ= @PPȲL+<v=\OLL 7o&77,KeSrYVX+/$00PI}8ASz9}ժU\z/// Ƃ (wz0 n ѣGuǎ3ִiS1 ̛7"##䣏>͛vwޝuֱ|r>vZiZ%dddܶ0g֮];k֬ t8v6lk׮>}%Kշo_Z-[l!::Z =$U%{<**-ZiӦ?~2 /{[Se&L@tt4k׮^w} /ӧGѣ 2Iٳ' UxU:bθq ?OʹZ$I~N>mv̘1ѺukìM2| BBB*ŋceeU{)XZaa!{彺y?SN^^w怜>}oCvZuƮ]޽; MY۷gϞȲL޽u>Vщ>7cմiӆM6e^xjsʯI&1dΝ;oMaa!:t0K׾}{XhsA/+y|7xxxW_ϣ>Ͻ4j///U>͚5LJ-ZY4yr k+SOL >;U? ~r6E떦 q2 lquGK4Lw߂Xabmz-hG׎m@՟H?5Q~% LXx5OEʧ[ $O(R E؎0:]6i'+uM^GXh ];GkquV Ԇx[|ƥ?6MqRt%%8;d480.VW>Y9kƥ?C>:}^MRi{EŇɿmacき'~r9w#gl믿ΡC:u* 6 0MC~&>>۷FݝHΝ;%2-"$$ggg7o΢E;vgϞ4 ,mkDHH{QEtt4NNNvZ CV3``z*Сh4d[_E#rSh(Y֑s+\ ,d.f}JSqikxy¥%E. w0=-/!+*:w\:t̙3IOOWf$˗/ѣeĉB*gV~VTۛYVSPP@fffP?9.-}886VXt'pt0ѹ8Gԋ+yߙҲs\Dhfũ? /F. [&jJwH5΍n?}He3;:;ȑ#8p qqq8::Jvw8kZ*NovfgyȲLzzz&|}})))!//WWӕ>q~kxNy .{%vd_Z ՂIm~Ŭ%8ط9l}F$k]\,7s6¢dJJO璛SiF.{yy)ҦM̛7lĉe޽F'LU ^Ojj*wﮨ*y?~җ~qXh|^sJY6p1k)^MQ;fm5Y9kسߓ_4\?]PC_UoWkbbbشiu-btޝ^"&&{Ny IDAT-;v$11 內'ƍʕ+GHHzٙHT5zjRRRԩC _~w\Pz&q(FSNw\x ܰu9ݸ"B%>A8xA8xA8xA8xA8xA8xA8xA#s wɳ wMxA8xA8xA8xA8xA8xA:~kA48\ W@RM9^A$1M=U=f89u3r)$GWAX=:M   r$fi bΥZ\UX=Cf  V羒6*(+FF?Ntt4ѵs@| wcXuo`5w-øg!yc<#y"5khTݟV.WWTa~)#P=0 sNciΨ>ocB_~1ɥ _jeu:666R Ԇ?Բ7RyTC>O.gF2Y(X٠8QS)yz$LOיz8HqROqM@iPE@>B:tSa #&&~L||<۷o'<<F;;w~2-"$$ggg7on6s;ٳ',XPe xɉ٣;**haڵ$''Zffp]xCh $11[9uV=0T?T_BsSSpzM;eW^3f[`ӧOGxxxÉ4 yYbO$VNGj GaX`v畨z/_N^ϐZVy z..İi&4M-Zٳ޽;[nf_z%bbbx8@ǎILLd…xyyɸqrJB^pvv&22*UM^:uĐ!Cׯ%=iyʔ7L U2۷>a%ͭQFCNNۅw?({QsY=[nj7F9RvdYAꯆ=N#ʼn#ʼn#ʼn#ʼn#ʼn#ʼn#5D/S &z< X< X< X< X< X< X\^N߿?5sx _uxkDXo tqq&`aP/ I榞O]+-1Brqz`{Gr#%G9 (|צ,W8ӔCiPc;2U9mϷb>>]dP 0l/2tP4 $&}xnߗU[l R2@o@i?r^mgeVv0 LSc>03ȅsΥC̜9tm,_GSOamm"-XǏ_p!,^<8@ΝHIIᡇbҤIqFΝ˺u*mѣINN&))W@&M 4lf̘Att4ӦMc͚5\p@ll>** GGG233ٽ{7qqqwu섺Z7+[#4N>2-C)_W}κ{Hm0fdSErA RMVScǎGYF4 3f <<\Y`ON)=<<0>cNdd$ˬX'x\ϟg;v ???ZjewJ1c0~xƎK@i~%KLfddDff&jZ; uH?m?ƠޘdJ O=T~Slh>zI<IY';UJ>ҥ[P5qvxOJo@rqgss8~8ӦMP\\LQQj +,ԩS$''+--E5 'NHTT$ 67V~VTۛYVSPP@fffP?.D$eSmϘοx`뮁Rb.^zP\XGr붫T%|l7rHH\\Ү];d4jU8V͎;f|ydY&==`V+^5s<%S< I|ݠTezeUVŘFïUY9evkuxruGGιJ} F(!LsKS3}KmT%776m^g޼yf'NHll,{h4%>aVZE||y #ջ}O-5ptr lxvٷ-&&M6h*\h"fϞM߿?ݺu3K/s=<w:vHbb" . OOOƍǕ+W*/..zꅳ3fWjjդЩS' B~,I'SdUcw\yrr25ʣhԩ隹|;ڳuVqpEшhȑ#徼nGM=Yf9 _ {%BGGGGGGGkp7YsYDGGGGGG'?oٻ Piϯq`A:ť s%xku6j4h9b6`/͟2^c烿0чޛB)>۷FݝHΝYYh!!!8;;ӼysCwAϞ=h4`*VPPk?NNNgQQQDGG䄏k׮%990j5 0ŋ :FC`` =>[kFrho-&7N&3>C&43p 0\nJᢓ]S[PsҡCfΜIzz: ʶx/_ѣGyꩧfdeef?^IpBbccYx1yyy8pΝ;C=ĤIaƍ̝;uUڶѣGLRRW^%!!&M(4h̘1hMƚ5kpX%}TTdff{nn{|WjdmͥϝuxӰ~AE8ҏW(>[s^:>H*#&,"SOCՀAEmcǎGY̧3f[`ӧOGv{xÉ4M/̊+x'}y֯_ϱcUVfiz3f ǏgرOd222HJJ"33ZZwaws:$ϟ?>љڑF-o̪x?_߻n=LQPw2N,:=q>ž-7r͓'o[{јp'n:Ǐgڴi7;veJYMRRRB^^2z=ypc(1b,5*{p6>א29ޙY9'ǩޑG2J.qryNb[T URzUͥM68::7o'޽{1dgg+wO0UVOYYzTv]a]UCƊ|M~?sjz|gMP6mڄFrݢE={6ݻwtlK/DLL =<܁ر#,\///<==7nW\8BBBիDFF]իWBN2d㲄'M#OiAMrscw\yrr25ʣhԩ\aI _֭[zF#F#GY60k=s7DAA"`q"`q"`q"`q"`q"`q"`q !gV|QQ;/%:%z< X< X< X< X< X< X\^N߿??fߎ'BU'??A{ABn &40[liӦu O]b_wpFD>_kXF4x|}bU>yPx}M]f=8% W1+O}b۾1}Q;; RrVPP|A{HKK j'Ld+| g҇Ci_xS%n52'FO6xI+Wd1XGê?ˇw᧬xgȼ7Q<)_p=pq(.YW,H)s=wu:66.aiC޵}ww=HlpvVѲ5lJfJ[FܛJn:)mM+oL*/ܛHxxI?-#VXXPRSSYb0~xFS}xWۛXBBBXf ;СCz qh޼9NNNnݚ>L)ʿ̚5 ӧOI&MfĉL|Ց2-o q?IGd zؽHYLA idp2R-/fXgD2V@ԋ7bl2̙Õ+W Ge˖-$''LBB_uycccٱc啛4##;;;:޽{ڵ+ ?? 2qD֭[ә2e ۗ N:Ejj*'N &&z;)s4^#c':5i&M't k_ƿ3-kܛ ~6sQuTv]=)ZSF&}emxI-~gܸqtFɓ'7o-[2h ~ ~L:lmmy3KcooɓJbl IV|>OQz eK<6ڊ72\q<' IDATiݛJě}'|FOAFmĄUiӦK^E'd˖-ky衇̚5"^|E{=2e AAAó>#'G#ωDs_t _ތO{{_}B_~tlWxA9< A|N >'G#og$ 8o556%շhA^ p^$Gng~?ښEPPH[Ox\. , %%I1Ѳe #kٱcVyn2kxrg1QF-/?1)d}QsA~xMvvyn(2DL&.]ĉvnٶu-kѸсZTY(6:2Zb>؏bS ۍE4Sܲ&ETHn( O'Fn7{ߧSWkxQt=HOYc;+aD'&Ea*y^,3zapgRXwdv ^=P'.iq.435!·o @ V[Vy/R?jz$OJٴ6toO` 77O>G}`vfLd'j[w$)125!BNnysGv; } !ҨEV搸32SZ^PuÕ%'9[Ư҃#8Z *@i#_"7 hhsIu4$@%15V2?+h#LJʒE>ƒEީV%#O{B|J,k?:{])}Yv-իW{G;O<-\n0Ңl).ljP?2C' 9LWL $_îfﲼ n7,;BN\y4 j*IXie dI&.Y`Ԃ)LQˆR,N*ᆫvvJ[rqܼkJڝ:e m$7(kbFGtSvDSW3+yuп… $++,v"X]Hei陳5vR#hw9ӵ 0>.r]'wh~pV; kYrwv'Nɍwӹ!L ǘ!搰$ڜ]'+Ġqk\u~8v%Br1T5u_H0j֩c7d8]n / }&xr96m"==""Jۺ<ޓu+-jfR\P 5I';x7Bgc(zkgZq_>,V;C4V:Һ|/xl\Kvr ӴبiVK#SK&O̲eHJJhK g?8oVQ+:>UHDd FGsg?&k3*eF0Hbp^qJ;;ex*k(ZeW֑nw,AAJt@]5Z%6' Nb{b;.t4; n@I d@)ąQ\yfmKvvHn7c7}e<Ö#1j[l˫fWSroA.A2N[y'9ة8+Z%A“;^ߙUhl_S7QdLޓcdǣ49)khc?~V3ѩh ?`BJEѩZ.4_1e?يp\Kٍe =Y1Iƾ\5(syorrǢǽ5'Z?8t:]+$!IEEEжnOoݺ "DzSNE`?W6RY>%f'k[{{ׄ~L|8BFƽ1 3Ia[D pf˅ }ꬖ A|N >'G#ωDs"xA9< A|N >'G#og$ 8{^}AW'\䮻nw^^ Gng~?x "(H\>]q\,Xl6[/zce76G<ҹF%٤h& ":PI^Wm0'yZJ!PƖ*+t ]0&_~3w9 @JO!9LO oOQw_}ni}נV}:0Tnd2OO'~*6|Z 4iS1̹#eoQbnބ`ٺVM-d٩MNb*6Mf{~ O,&ʨ凒ڜyopGu`y'nv캎Qe8%q?fc2Xt)'N$##:ڹEu-kѸeсZTY^>?xG(>ٺ6~5-fV@VJ.بQ@CM&6k!.MXv㣍lz0s+E&+KvtKvyZZW?x4 9k)u?^gڵX,V^:xB#-Ȇ2ʦvUX#8||e# ku]WawGVȉ 1/5R]hQŦlN݅f"Z6biwRΗe 7\SBؒ[EՎ]]Sx.; L49p}s)Â_NC+˙1պd,[$vͼpjc9ŽADj`t?wFShvy9(olpm `^ ?sGἲ)m?ɃW5@nE#5Q)<k_椼3I sOlv' r~:)Z W3e0t 3#K6omrNSfgc2$Fsmyt ].:%SB8R)s+$/+NJ)+ k*پ0$oɆ}i L1Tڜ5\i?+Trq͟Wx{!O΢T jvv lŊ_WuxŞ$TueZjjPP+<1Eۏ{/![C2 I$QTTDZZ m֭}x<"B7T$ pe*SbnqwMķ~S*ddÐ . k< f3. /Z "xA9< A|N >'G#ωDs"xA9< A|N >׫l'\yNjlJ{^Q>W'\䮻nw^^ Gng~?x "(H\>]q\,XlG| J1Ѳe #k?]ܒmlR4$l/+6<-_f%SrbcKny./w %ϧƐZE_ 1>ڈZ)ㄩr8^c}62?+yůAtl9ma,qdN.'ӃTlZ 3hX33UYc™sG.ʽ =uZ7S ݏ拏UlYLQ%a9yp53Hb_a9y(^){:^Pe7}OdbҥL8 hVvގvu-kѸeсZTY^>\͘NvY`".XGr\Ahrr/k  wַ뺑F-v<ӆbPUəƱj+5WzP^)#O(҃#H1l+ ܛ|.بQWQԵҐ v7 X1X&gdgմ8R ,yɎ"rЪ:$mWDjY>%Q_Dz֮]baю/'4Ңl).ljP?2C' 9LW6"H]eynX|w$j`R0hڙ?:O`Iv! +œg|*IẢ0>.]Vɝ<599Z݉ ȚLaonΣo{˿j]lX!awI49,S_KlAMu%Qu\THn7F F :*Z.t1hb00lڴtvO`^j8(o\R{OypIqA]'Ԡ&=>\ftf^}Lz 5VH_X5<59Cdݭ8d/ΐ Ǫ=g 9]/м|c"XueWժ-6jm<5fpSK&O̲eHJJhK g?8oVQ+:>UHDd FGsg? Õ+162AzTG~)mřVNVR.c0J9'ͷEf ԠF\:VȮf'1D=x:\nڝwԊrN7Vhj2 _͔aЁόx.ټy϶Vyl|;;M$2IaJ-vU)tLCw N az J̭<T|J,^4RFyC;+=uVx@Z%$MT6p?Ӵ&h* mN󏟕xt*98Z+Xcxght*V; WLYOb/+W@v:@wrssYybOVt깆YC \^j'Ʊhq%B~t+qqqtW$IB$HKKmݞ:޺u'@D ~lB|J 6Ni0poTȸ7!\XyHW) "g3[wC`Y-A< A|N >'G#ωDs"xA9< A|N >'GNHqb'56%=(Bիqr]7;//#^hDEE$n .E\.,X@JJ 6u--Gnl)7[xstFsKILDtK `N.|BNy-UW`L8fB3s0?CrV j~UT<;5 F 94hXzַYMJ9OT4vOTnd2OO'_OSRN_h%̠aVMg՞ ga,{s+&npֵRlj!;NntJv?~'/>Vyn2kxrg1QF-/?DZ.n L`yM?^S]k{^J Vn1L,]'tʎ{5hP@-G,V/#%(6 ؝_ęI15-R!_V B+k?&7WSqgd?|󘷓+xwr)[⿧@Y^ #B<1) V'.Ggܞ 3=+B<&;ķ*>8q VNcw A؜nu_kwU`:zhڙ?:O`Iv! +œg|*IẢ0>.NZ<&G;`]X˒{ǿ}gFl;τc#vDS2?ջĆTw]u-]CՁ벺THn7F F :*Z.t1hb00lڴtvO`^j8Wޓu+-jfR\P 5I'}uǷz?Ca[05YIqA$7Ǫ78l3$@ݖZ!gOxl\Kvr ӴicFMCnC}buɓYlIII><59y,g-6J9jEr "5 Õ+162AzTGSaz"ZJ d8zꖜNܻEf ԠF\:VȮf'1D=x:\nڝwԊrN7Vhj2 _͔aЁόx.ټy϶Vyl|;;M$2IaJ-vU)tLCw N az J̭<TfxtJ-6<\[Go!_Uhl_S7QdLޓcdǣ49)khc?~V3ѩh ?`BJEѩZ.4_1e?يp\Ke =Y1I":eVyb^B _GNye@$$Iږ[xDHo ҩH&T 9˧PldmkoЏoTȸ7!\XyHW) "g3[wC`Y-A< A|N >'G#ωDs"xA9< A|N >'GNH{ؔ/V }VO]wX\<@ z~⹖5-&E3yXсZ,Nr62o9eVr:%-6V^QG)!<6>6'{ͼ{@31.S"3/+6ɓI؏bS Q6'{/Pbn%=C4 ouPxrR7x楆-<%fOg9Z4a8Swno=2g\tC)klg{%$O?O\ŏ"=Sf gzV*1|'y0.Mvo' U|pAB3S9,|0 $@lu`72/)y٩GrMʼUOx YՌ DmG?&u$QeLOF!'bC/Jl1+y0J!~ :C$7';gQ F 5IiH }~P^)#O(҃#H1l+ ܛ|.بQWQԵҐ v7 X1X&gdgմ8R ,yɎ"rЪ:$mWDjY>%Q_Dz֮]baю/FZ 9eeMGFqh~73?9ӈ!x-͈ d/L僓uSV`ԚXV`P{(^)yiwW__ŝ&M-؜ Dl)/nkg%Z++NN/뒺DC ʚ7w2|iwH4;ye9_1 Kj,\Lhgp~EdG!g<]Z*-6jm<5fpSK&O̲eHJJhK g?8oVQ+:>UHDd FGsg?&o 1pWTr<3y_6tz4F@-킎3K;2?c_dyz U=ow,AAJt@]5Z%6' Nb{b;.t4; n@I/L&. ̈͛7l[jG@r/+Qbg[^5ySuy~0Xm.k`c:s{Jx~F^;8%|M64=y 1Fv'G#ωDs"xA9< A|N >׫l'\yNjlJ{^Q>W'\䮻nw^^ Gng~?x "(H\>]q\,Xl6[/zce76G<ҹF%٤h& ":PI^Wm0'yZJ!PƖ*+2{cvJ ¨ɞb3>4PL xKʼM4I O`̆/oɱַY-{0>4r W ۍL~*6|Z 4iS1̹#eoQbnބ`ٺVM-$S‡ ֑57VoYQd~F9ɴ:\l⦹?k(X5=+ή= \Sc><&K2qD222[Q7{x\ ;]HSud2|Ŧ5XmN_Jny!z@V@}V=XœEi#({q񧬱U0"D0j/~tj0k8ӳP)d,O;ɃqInM|;iHb8vf[qwl Zfy)ޟNcl=X Net?'%lWF^B'j<\֬YlhjDpq:(2'B4OhT6ژ<\?EqIz\޳JNE朝{P^)#O(҃#H1l+ ܛ|.بQWQԵҐ v7 X1X&gdgմ8R ,Qyl=XV%#)o׎׿"2P)73n/}"xz=k׮bzjhǗ #-ȆN]@+9Ta nf/~rSaCbZϡ^'w;^jwu?lszv(6`sJ.4iԲ!Kv,kdd᪯–*jv.7:;%^?tm69p}s)ڙ?:O`Iv! +œg|*I"L : Cݗl ^ᗾbwݔ}7[;9$.6ge~݄\AM㌡%Qҵk}[cp_r~*$NIUS`uj-p4 o1_Lr6mDzz:OG;E0/5Eַuy.)ԏ'WZ8Z̤ r4Xu3eWyC;{OTm !zN=ӭ0= m.[V;C4V:c"Xue.f56ښA %'Ofٲe$%%lh楆EP+Ѫff$"2P\#3ҟB7+*SLͣq>Uhl_S7QdLޓcdǣ49)khc.rN%GkyTz ,Njgw3 lId+V½r/=d7Ve =Y1IƦ5(syorrǢǽѭšz^$ I(**"--톶v{xwG<!қt*q B)1T78Yۻ&c[?)22aH5Vy=V3vQۻ! 0}ꬖ A|N >'G#ωDs"xA9< A|N >'G#og$ 8{^7- W'\䮻nw^^ Gng~?x "(H\>]q\,Xl6[/zce76G<ҹF%٤h& ":PI^Wm0'yZJ!PƖ*+2{cvJ ¨ɞb3>4PL xKʼMzڇovV}:&էv#yz:z rB+a kf&jZ<0L8scE[7!usbS !z~;3:budMxap2_;Q$sN2?}Lvvyn(21L,]'tʎ{5hP@-G,V/#%(6js%Vr˛H [Է:* Zzd=]ϸRSΪJIQJ?q?:L^5Yy2$7&4WT rZ LMtc[ø;6փU@˼OfZbhg2:擒z6+}/5@nn.k֬l6ls5c"8QOjg`azrQ-,FǸ>. 1TKrs{X ҩ1\Г奜2t+/=8#o+`̽ W} `zA]{, `wIoxl+`rA}|_M#%Eޟo9փUhUr^?6{{+",{)}"xz=k׮bzjhǗ #-ȆN]@+9Ta nf/~rSaCbZϡ^'w;^jwu?lsz}ŦlN݅f"Z6biwRΗe 7\SBؒ[EՎ]]Rv_͆65\#㣻o8e'2hjwrf%>1Xp!deexBK T]9-0=sSNP6~w9gdOǰ| WXj԰DOe㧥]. ux>'fkG76%*!bPSm8chwIԵtZ/!ܗB ƨSR>G5TShLƠQܒBwlڴtvO`^j8(o\R{OypIqAi )TϱfrEdG!g:UGg #_b6v \7J.<WsB?`W%n61պL9d8h#ۍ+o#HmG$p޿#1nĈv$2|(M;no}rX`)))l_0P[?COE>⹖5-&E3yXсZ,Nr62o9eVr:%-6V^SBxl|F mNye:%Mgb\vĻEf^WmxZ %_MC"|3>-]v^?Xu߷3BƮEcx|{!-•Tnd/U`?>-V L`մxV)`pi6i IDATƲ(1roB0fl]+ŦCvf)SuȚB}7W¬(d2fvVIdZ.6iqsKouW+X2! Uwx-v~R&y]c#k><&K2qD222[Q7{x\ ;]HSud2|Ŧ5XmN{%Vr˛H [Է:* K]<66f ;%Ei#CI SiOJ6HFr$`L?7ϲJ.&ܼ[dfʰ 5i -Tb]n:3c3*FN}`})ω:!̠fɄHR Hn7_6%v '{wu?~mWAA,mq7Դ\Ȭ̟5e^zV̕KIi".)";|~ +y>Ñy9e{JQmm'{"h4bcc5jL;?GNdU'ыB /{N_*`W bӍKM%3>-~2@7[:4vddB<dNV3B!.VxhԦehƴ'qP+Q),IEБrC܍ٿ%S]y@/d4*>М '+Λu ?Gk< _h*dV!c3)(O7%%ӗ$^nMLC-k~u HZ`J@^Ǣ:5& g쯉-Ce,P{O>0v,~:6^twJfp #^jÁ:1w0c5XTĚmv2?iVRX7/.(ՙNUGyeq@B˜|R̎S4rfɾL J/%l!v7=fnph 2+Ck0 =rl+ap #0[ֱS3Q/ճY[ll\uOFWlJwOxF… ꫯꫯ,+|yuq2+MN}"^<0%qgSճ+)y0[om8||7o;S)*ӣVxEezS9e:ue\.*Ju<9Ww{vQj%:ZҊK2ꛯjgEVaeb2sKt诛y'=]q 8(PpdokmT,ҴM!I2jEew? y~?m%9)5Gi(z> <  Э[7vtep[oƮI UPO;6m?ϡt taWR}4+=-Ƌw©" fdnzٓsUkf]OBZA}caUyt]~ O{+N\{VHت˯[{1u)ү D*pc= JTPص U?SꐞΰCa:'EipO=S-裏2n8BCC-ǣ n͸u /ERVV4ˡ<↟ |sСj}cGq2w wSR2?N*;GLeG-k%!x: $geOg34w;+:`uj8gѸBPATi۾s2Õ{AamנO}RE^}/5zṪ`(:ZVÇÙlx&>ZU(mEDiಋD}WâʃNyg$| m#|61&48N|lz%aЖ/# \pg׵`@b0زe AAAf?Oƀy?CPP>z3z[Un. }Ώ3iTg$Ii=҃xhTOE{8::aV^̈́L@ic|1m}w9\O^ׄw,W^}5 Yj%/? zV6(QX I]}ߙK(e}BvD3/Q%?y.^+3f_oBCYF&仡ց;E=,&}Uξy'LAAzMlg#""kkk˫ʢE8w=pwwo0ң\xJ_~p5kfZՕ^{]JFFF 8MgmmM=P*ڢv3hV!))ttFDx +}QڵkB.iI"[`$I0|A8xAzjőW999Ѿ}T#A,^O^^^H\\] RNN{ط 1#uZ`ǎx{{sV=6oLa,p'IL*pzs;'\S|Y&h`#(_%JJGe.ӇJ{Cy2{d~MBCCOB=kr.Ox{[ yXVE|K Bö2i+Ѻ $;Kd&ѷę0ܝ<1 YäAח|\{?Z-VVV.#22zZ^ =$xBExD&}ظ >iY2^ Z4.-%Ӎg^]L*>q2|Y×yڷoɓѣ-Z`ݺu=SʺuشiM4atЁM2fZZq퍳3M4!** ^ׯ7{̘19to'>>>̞=lZ7kzOA%N9 :=l9 SZ~KF +Qu 2*%(MDv\5eTf WyݺuDEEȰaêtLZZ8pcǎqVX@TT{!11\bcc@T2rH/_nʧkךz1| ۶m#..8yd_SvWVx=K ~3 4}[_|4B1>*1}Lӗ z@O( 8aJJv8k̘1VFĉ婧b|>LYY^^^lHmcpww`ŊL>3gN5pU;d <+%L )XVv8TZ#!Ly 1]c %=o<ڒ[8 id'wjuss3֖ Ƅ 4iߟ5kFǎ`DFF:{,fy<_d,T~idwh8)yԘ~< 55e~iZKp"R2n qe a t8s _o>t+h()1_ 4;;P(xw8x 4jԈѣG###Yb)))޽QF|}}p^ҥKժkgo7uR-*;Hl/NCI6Mp̾28/6;^5'UM$ u:M#xOEW)}‰L2{O˺mu:$u7:ug}OOOlmm 6[{!ׯ mOw >ԪoYe:>kK+ %ZFKc|b߶nl6›w*-mpHU"U{9s^Txڒ#NC/$u}l~Ш|ԴJ Z!pT*ӺY#Gښ%KaZ߾}yGݝnj^7__4^R|gIKtu[mE{G;5v'&ȔT\ʣ.;a%I r[BuIWKqR)y jD-Oi8zmaԫelgn/j-m3SJ6 饬BR((Jmcǎ7oMkZƍ74iĴ4oNFذaٜ9s &燍 -Z6/2/UV8::ŋΌ3VkJKMM ƏOQQi߾=t҅ӧOݤI~W . I-6]yHNDD;w6NڵkiӦ mۖߴ솨ѮJzXTB|~1ZYf\J 2O:͑ ;k;V9Zx?3G $*юKe:ΕV|~ʥwSxAm<wǏ'!!xYbtޝPRRR8vIIIL<\zK/DNN_|-qݩr;wd޽w܌v͈#;w.W\O>aݻ|Sי.`~s_Ӷ [kz8!$;3X C1~+D2.1 C]a<[RPRtf]@hߌ}Xw1Qw;v,( z)z5>|2Veӧg{n~aSO?g}F֭?)}…̘1Ν;P(CtJg}#AAA 8qF>puue|lذWWW|MJ%aaa;mtM2kkkmK._X|9C wިT*s=g"kCx}qOR.>\Nd_-hjg";R'V),\4^-cߩL>u!8 ` >Uc*/RAׂV ,X@TTYYY(J `ذa\pI&qIwܹsM';; h 3gd̙zj^y߿?iii]6lXhp)))dee2 j$88,Wǝ+^x? vjoӦMM=Mh1_PUxjo$񘋆G5z9trIW$fvּ–km5dxUX[q3j kM61w\ 55={P(xw8x 4j̔;ӦM3 nښѣGġCaޥhܸ1'N0N:˗qrr]^PRRbzWfg 3ʗnܸ1)))f&''Ӹq7iϱ8ƒ `Pa\baOnh@g yE) 'W_ȡ&jz929:2/"Xr6e+'2yvrrrpvvYf9rlu׮]:t^FʼܩS':uiʕ+[QPP@^^K,!99Ν;0~xf͚ž}0 \tW0R{=e 0f~+Wp6}z=ϯqy51zh֬Yo^g֭㏼5AҠZ%sS/Dv$}2 9|xY?p+Z=x;}]罜,-t2J8vwd~HE}L.\7 ##ZMvn:Ѷm[vœO>IAA'N#FJ"$$+Vc0a H233quueUEF0uTBCC)**ח#Gҿ\\\ؼy3'N䣏>ٙÇzjSfbԨQ}\FDnXloj*tR4Ҕ)S5 KϞ=k\x||<999:Ņ)?]cٳg {{/rLL ;vVYlۜ3gnxj@A59A,OA,AO. pʗ \s]|, 4`/_fǎU! 4`@Ӆwb00 $$$Ԫ\1#ʼn#ʼn#59Swjy}W@`q"`q"`q"`q"`q"`qz:=..jT pW R p +?_Ame>t2--dk1@+ɕ\xUՃg?7?Ȕ,_Λ^(SkI3Rn+2h\,BTGbԥxȅLO9P#tOXYJ›㼣`ɋ~1M^-rcʖѪnL֮ƀȥʖb5U:Szk&APk`:+.9J0Ug*VL3\" _T(l)ٸre!ɆpP\j#fvIDATpV!pIIJLe[+(#xY$gItUTv/ 7߼~;wSNs=ٳgM,xbZj#,^y͙3`N-><[I~\Ȓq40$\ՈgJ?笜CST}m]y9t-[Ǐt_Jł 1c믛V\hse͚5tԉlRSSt9r{Y-$''=δ*?זdq%Ѫn|j_,UB):Й#MUt92TdZ)LG 7$a@欜&!SBWEs>n!W.&] QV s:NyYEy[9s ۷oZ'$`вeKt|gfǏg֬Y۷KnJ|ܸq̟?z{V=S%?[Ov% `U_̈ȓTvc=m v=\4 LU7Oa|[O٨%("zڔ>Lr1c˾@._%>Q(FAәxbz-Kj5Æ cŊ &P($33WWWO~--#Fޞ~f|jp/۰a6l0)۷ʒL,OTEҳgONNNqqq!<^?%#ʼn#ʼn9AHt˟+Zm۶E=,]ZI[m߾e*T"As< xA8xA8xA8xA8xAZN?s dggU}Ynnn899tD89sIx:xhڴMEBxUPP@vnDծ];ETMfjξ+n%DVs< Cv'MY-A,w7o>@ ^z<=yWtt4~~~w%MjjN8Q'm"׫3oPz=dʕ|G>}Got u㉎&--Kr9b#0i$C.]ܹ3111w}3b}Q"""XxM.]JxxYZZZ$''K~`Ϟ=/www۷/k֬AeΟ?3<t֍}ؼy3!!!̙3Ν;ӢE ^{5L$''3tP{ 2 2ƍӤI&NHaaQ/o'gϞ7qF-[ݻ={6>,YYY͛73n8vƍ3g۶m3x`222>+V[n4iҤ^ϯJΝ G1zhIOOo߾ 2"~C\\qqqDEE!2 ___=JFFgFTRTTDϞ=i޼9dzj*۷/CEӱvZox*W6f֯_Oaa!;vիeZ냇Ν>;k׎ZhAAA/_6jv:ƆB BTސwZZ.]",,=z4jZ XD\7^0͛kZ-[ƨQLےNJJGm7KaЦM7oκuؾ};Ç|[WM~iƏOrr27/Igĉl߾www0 7/ߟz= KƍСC7N"5aѡVtt4l߾{^?æ?8t:K,!55մ3ѣGB׳o>;^|[QDFFh"nʨQj4̪?#<³>˖-[tl޼C"29994n777dYfʕ{n7*֧O$Ibj>}PZZʇ~H~~> SP:e˖ѻwo4{1:w̲eL+L>???.]ڵkMs>,3p@O=z4>O?-?8?c AAA|7MSTbG,:SyWuQXXȳ>[:WgP4U;l)vV͛c0Xp!jZ:Ԑ~WXtUU;wmYɓ'kQA=׈ύ*ԝ $a0N$B`6qqrr"!!-Z4A qrr>Mjjx9}4eI...899|}DBjYfuUhA3wA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NPPP+((x^+$ƒ;L,$E̛O+_wY[IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-plot-task-zoom-1.png000066400000000000000000006010451477354127100304700ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME -IDATxw|ǝ{f9'1I,ٖڲ|t&=y{^ӭʖl%JDJ")Q@$rLz HoF3RF!B!9C?\\454]!B!5Ͷm, ti.˲,>B5{B!B!>l&LjDc'1҇VeΌjLӼeB!B!Fmԇܪ<ƻI: W8ʶ# pZEz'b4?9B0Ak0 c9r[R 0m;U~&M)RcO}L3[ޱW<'2ϑq^#.ԹeN^^, N[[{N,YLOO/yx^,ˢ ENN69y.:Huμ{3{#$]]86cܹw!Dȏhp8R,n7===gǎ?@8vs (999 pDo} tQ^^m'ah(J}}=/27ofƌn y˛hoo&Hr)A1MsE)E]I#-s-Z"5|ߦP 1wB!)mў~E"b]`0\.Wż חi顽ۍR^m!+appYf;*qbiߛLe%Ѥ3/Z8|?`͚|M}}=?dggRQQukٸwA׿JQQ1?oϴ~& 馛~g˖-:Uϧ>I~㟰`|I$`p0׿5zzzطo?g#vٸq#<4> +W;_#|%//VLBcc#_9srٟG_n֬YMgg'N HO>Ğ={hkkg֬{bxMF|K;p!(Pcg׮ɴi8y$>>}:o'NԱlRf̘Νq)|JJJx))){a޽֞ O}n tuuo} 9so~[:u*%%%ڵ|;w;v{F!q4Xoj֩@z޼|>n7:u 7A4edggPߡLo-ر,_gۉF#H0l!Lj'yc$E]%/yKTh5h d-[pa|>'N^}Q֯_Okk+?Ǐ1{u0_ߐ??3PXX#H'O:|`ٲ8p{./nvIWW7?~Yf1w:Ď;سg/>S9z(]L>z!֮]˛oWf͚ŦM`&eř;w.ST#_0 ٺu峟,k֬q/^I?c ?ό3y[hmmc…!X,3;/Liiߦ^x˲mܹSNq~=txX,NccN{{;x⌴1,ˢ7|z ņHgp00L:;; H$ß4.DZ'>ǀ,m !Cki|k_c߾}=s%;;555l޼.@zke`0;Kڡ ^{un7`v.dy p 1c&K,ht{+SXX ())f޼1k,/^ĤIضŔ)SD"L}'WeD),,bTVcҤIL%Kp+Yvsϟ_a(sXh!YY^BB͛KeeYz5˖-cΜ9|>f̘U׳h"z(++^gڵ̜9۶e+b6--\n CVx>2 d2ASSMMMtvvxW>;;%4 [kMGGmM[[ x߇aU{Ѷp{܌>5;(Ӫ\B|<\.N.QNG_, QA81ҧӶL>eaff|1 ˲PJa.'mۙ2tvvOEEqbS O}zkFo͌8NfteYttKcM4M0ih2<3ۧo؏La~~rA,Z(3ɓ̜933ιC)E$駟g_ĉ 2eMͶm\.<,^|Ǡb``~jz)L?)'O&??9B!B!]g+# կ~ÇbO8͛mnYfۢ+Wrma:yyy(hmmǶm֬YÎ;eL4{RnfOz82>dLӤ^xh4ʪUhiig%;;Ǐn VZk~?gx뭷8|0_WF<tuu1|V^ͦME͛7cYWf޼yU"x3Ivv66l8sֶmꫯ_NNM,zdggg0ԧؾ};o555|3cǎa&4662{l}2 6~ӟ6yOɓ'y0M۶aҥL:W_}?& B!3@Z3sL>0w\<044D,#??믿;1MnO~ڏi!H$PJf~?ZkΝˣ>^/& fZ s= o~C{{y-2eFx<pqlۦO|߿W^y;Caa!<ԧ())!HljF̟?)Sdn\.^/nX,&B!Bq 3"ʢb䐛K~~>w}7ֆ;g`&?? qz' Q\\3< )BރZ(//'//4A֬Yñcկ~Ųe˘2e d^x!z("++n{~~>msuyǙ6m7x#׋m?]iӣ{<"D`0a fwb|>#j>44Dnnn|pp2֚X,X,EkXE2?!> |ȗB!BKiNwiw_No:#\H+X-g߅?־R$Ivł ΖB!BqS]]]]#ꧧYB!Bqmsb+]!B!ctB!B=g!B!BJt!B!* B!Bq]!B! t"ӆ=WB!B*@㴶r]UЙIYYٕ.B!B9#aT%q1--?߾$@)S_k=a*_:͙5 qFS:t#8V_:O۶ x0m:.v4f,:]/z;˕R(>B!*v^(--vg)8t>iӦ (Zk@&hF}$irZD ??<8---vdhh2<j줸D"AKK mSRRBNNmmmqJKK8C{{{&?MKK nR dTPP)磸˲hnn&KYY٘Ǿ!2mmFeQh "/Og+5:z{`PSPqhm5H$녞T"Mn&66ZCS֩m3F>P(,m/^bosEQQmOK/q7~@CC[neƌsďc{=n&ZZZG('O3@md2mۘ >E$j0pRAu" Sei_a۩ |>Mk{6!*zzR #y}\lb$M{M]IKA^?bsɜ96xع.8`5TWX&a'xizh=ڣ/^{ &۾JP!^{K10;q^}'=e18N:B!B+MmrJ0555Amm-ms-DNNq `P[[… illD"ٱc===x㍄aʘ7oY峟,Zko '>Amm-3gdΜ9߿gy{w$'O㔖bYmr'  җDww7O"OS\\Lnn.qH$ qwǪUŲ,xxӽrrr(++:n?8AnnB!…6CN_Lf϶YƤSQV0iCMɡC&Jpw_n|{Y45 )JK**455h*_45?nWܼ6oOvƍn֬0M27Nub~Lݖwȩ檛S/$fdF1=7>NrQuB}QOJ{{NT[m%Y~6A[AobhHIU~b1˥$Ӧ99|;] ln%&\ͮ].vr_z8ul,Zdri7y]< }}W_ui_ j䤺'g?'ǓCP9Lero4]4PFPg=*PdY@17F×B!Wqt5^|+̝;Css3dy<^/a`Y.>P\V^ի1Mχ8 0444fdYѣGqضM__pX,FSS2e GkM8&gYŞ={2]mۦb(?Dkڵkq'Nf̙ bh%000yv_"~SNaYH$p>"p۶)((˲H$>Yn77zHFRpɉS8i59|ؤ@Bʭ"y;fw&fX\.*N@)m6NX1ET*#/G8/އ(B!BkʸϠ+dҤIa&P;v`6wy'ZkB~ ^/i2w\=i,]Zz{{vS^^N^^0̳#AF8éS_Arss rH_zX9}|ҧ2Ǯójx*n왴Qid֏\g.B!Bk9;3N~fG.wݣN/4hX42>sۭ)+̘d3ӥ?sXv溱|20 i[/B!Zv0TiBq.,@B!Bqe>x:3=8 !B! YB!B!U@t!B!* B!Bq]!B! sK=Dy^t|>&R,WڅGC) Ɵ)4 .oj$}TΩB!.qt5ph4s ,p8L2wv300@<_v 󑓓C$!\=kp8|8|ƶKv>.R ߏ륻chq\_vG~C?5,NJiF1o5kR> )BKkyЕRD"8$Ȋb w8]]]dgg>pYRH$0M\Nx< D2.>(((8fZI^^n{BӃ%;; rXT)0Mx<>(kS \S 8,q36y2ެ+P{W5n˲RK0]o9#Ӌ !"c.x.Yvikk /IRtvvD(--_<8]]]sI9u<v_}a&`z*²,<τ944Daa!@ SqPJ:gk۶/ah3uL&蠰\׺ixHmh9E xu\ZLzsZ1mC8@OEmkJ{43;mw\YqO&\.LӜpKR@ pS!M⮵KHJ) 8gt^ εt9P/#;1N$hY>q2=ƫ1t#Jå Ko99β,?aԩtvvyzNl۶[oǓ9WeJ|a )..u]Yݻioogƌ̙3fٳ1cݻe˖ ٳg]]][.Ptww~֬YCgg';wD)u]GAAwfppEQYY)î]8y$999[qرc@+Wٳg===̛7)Spa(//gɒ%(8r'N`Μ9TTTe"SLaҥ444p*++Ype"@6v2Ifn(nISO/T 8ό\QA8dwgg&|kq NkMy ‚Cagݻ4Yb@ݻw 7܀Ü:uI&h"ٵkeee,^x̜9w} Xz5=z|-[-[Ǚ5kgwߥ5˖-chh#G8̙3;v044… ̜n|N:eٲejkk9r,Xq}}=---\rԵsNZ[[eɒ%磵&oF ,XP(:M&<3X˲2e 'ޝ_3{L ֚_|>q\b1y'I$D"I$9e y.-q;O_vgzgP !B\猴p& vs~sԩL+pQ6mK/ĦM8|% m&H$.8 Xb7ngƍtwwOHgI&۷W^y_~W_}:0۶mcӦM˼B8LfO^.}:nɇ $b16oLKK /]]]\.غu+tttyf(owTÇYh3YzuYvm&X3gw3fm^/r 'Ok.\.fBkM0$o>:;;cţʠ" ÇD"qw33w}Xn[o[o5z[oɓ'ikkv8x ׮]i{a=+F6qeZNC![^3rsyy5idǶ rGe%rL 充ZQlmhAgm>s3ydlqmQ^^8x^nvnf~?mSYY3klժUx^  q ;m۬YQ}>nCЀi,ZiӦ1i$.\ȤIXr%nol8z(. ڵk={v2e pzrssywihh!H$ڵk3=Fm˲FZkB֭3 a{Oo]0M4q\x^CCC:ug}A{= 6xQM>9@fY__= .dϞ=l޼^jkkcf^KK m3uT>́H&̟?q(--e͚5([';;믿g!BKX֚!yvŜ9s),,z92Ȁ\q4xJ8 'eFFQ2ZklCg?>]lP0}ڴi[H$twwOGG===3w\illKKss3CCC ;wnf4h4ʾ}&sqyᩧ[o:|dk.g?Q=}Y^/---$3f`q/^C=~;~?>OeZ׬YO N8+*S$6,Y$cʔ)455Fٹs'˗/̙ïk~x(,,_gA6l@MM s300@II J0dO?M]])(( m۶1o޼͔G0k֬c!BK7g.LOncTN3k֬df*m à꒍L^^^9鉜t@{fid=L3rQ|[[[37>RJǣh%_\Cy @o$™ㄏ}A,[|cclIyydQ:NKd8{=x7UvOxz!B1[ЁLD>p;^`0eY L&?p].x<`j4 4 ߟ)\PkxxQu|)8NfKQn~Re>/`BZꎴN]C+sәYZ.WRIP0)?ꤋB!F7@ i_*/e#tGB\-Ե\Ip7sg%B!GyGq.GJ>t`z/>8 B!pIB!B!*0f =Y!B!(Yz" \ !B!Y@3j٨])E$0 rss9b!B!)$;;Ǔ6={ H;*{NNWB!BkR4%//,AkmۙY qB!B!enwŲswM$S!B!B\cǎooYvi%@B!B!.q0 o5~ !B!a̚53g8mc6Xl !B!Xz 8Tfqdrm$@B!B!.d2ISSSf58=h\<'//m$@B!B!.14 |օ1]!B!L ȴ7.B!BQ5$@B!B!  !B!W ЅB!BB!B!U7_R 5PBq-v hEmoW.zq 0'ÅuI Q2t!Qn?*lt<~8>؋(ՠROuK}E̒$TnEe;CbUgqva%ߡrJvF^S$&Ȯل}b3fqo0*9-׍_Mob}rʓ 'p P/Fhꕮ q987Ce7}r 1' {N`{18nμj^]CϢL7*XI@n܁Yб>/5֡g0˗rN{zCOzBK?vZ1M[ZЅ9vntыza;H'ɷ>ӺMv*]Ou[gz`Tz{]tS'6vNo`}h2սazki?Ӳ]qlA^#.UӸitb`p:i5~X_z=}]O7S[qp鮽 .ԽlXޓ 6suմ SN`׾ݲ;Yzl#gѱ:ԇ]ڶp>-W)]ѣ뢷7@(Tː|2Lk(8\iM8jxzϨmR*5~p61őB\I+B!B\>p>88H<!B!B\>pSYYɓ'MMM a0}qeY|9sСC޽BnfρH$̛7UV[oU>}:lٲ,nVrrrt !.Kމ[X>HgQuz5NԈjtZsvy^ȣ^ϯg2Y!% ٱcoχ[x  qA%%%:t`0 7 G%sNYz5YYY$ |g?//կ~7̻K `޼yOoY|9/׿O~&MĔ)S0L(6Q\ȺmSw[h$=6Wa8tjP+Ig`8DA[ml#9rrp%Se$ eư.#J<8@{@h{A T1$6bm,m " .f&wttSO|_W_nJcc# .d߾}S__ρ?>[n菈㔔;`f&?e…޽x<΍7ވeYSZZʮ]Q\\޽{"n7p7k.|>?~]v~|>۶m\q =Rh#~0So蛺PGe`X$3qF!g~vYוjfx{n>Ș1f0= S,)/-u-=h o5ϧ8Ad*yG-`@~ػYr݆W A50x-@߂ߥqGл? ÏcJOޏ0XjZ7-<z~3})px{7.o*cÌŨ?T҃g_h7LmmgJ13.3gd͚5{X'O؈R ۶䡇[b&-^zhll$???\RQQŶm^x(?0'N୷ _dfn6CKK ,`Ϟ=S^^ 7/ȋ/ ̯~+vŤIt !.3ۥv1hw3ht^C>3 t#`}}~wj3:\t3 [= @t͈^AhxAtt3* ۱^~S!hUc t.tMcГ0Ԣ|=Ŝ 2 ƒZJR m,H 6t tNnl % n. 0PJex 6ى4M\.Zk}JKK)**BkM(fɬ\CII .*qol2={6@bn57x#J)RúuXj瞣իW_B|4VLNw)6F|LG.?=2>vuIcާz7m/=zkמsP:!cM;h3~H. O\ #u.B\U&|Lt0-g-B~~~f]QQEEE/]4+gAA֭QF>˗Z|B8p6iQ0:]mc;:^k،V7ƲcUX=jZ;vhNUǮ1he_p].JwwD3( v[/3KRP?CJX r?(uH*7>5C)gZr&Ԑ{14vv_wB!B|LtM!B!B\F !B!W ЅB!BB!B!U@t!B!* B!Bq]!B! H.B!B\$@B!B! !B!W ЅB!BB!B!U@t!B!*B!ĕA׷bwFcX}U:+ T n낾6%Wp^Cq߼5Q@M`:/-\9+]j! !sIv?PW~D=X?}כpysSb9tgߕ>ԫű cԭO~~uЕ.BKLZЅB;={ .Jq.0M0 0ۘu✔9v=)cxR(O!Ht!B!*D"mW8B!BksN&Mɓ'MSSaP^^>np8̞={,^J8p,]GRSS8L> w^:::Xl999rXz5W΅B!BL(@D"QRReY l2|P\\Lvv6N4M 9~8yyy,Ygy>/Á,\+U~D")pL Q6 8#he 653V6Yۈ4cj1P*8(@_ !NJB. [[[ϝwo[VXAGGx:.\ѣG1M6ak<裄a,W_%vzX~3***صkpueJ=Ç1 <mGuu5l޼n={PXXȚ5kxaҥر3eʔ+}.B\i|>HH<:g2&=yl[O8фQ稘otl@bH {8(:{qS:T,kT=9_G忉 Ce#׀r_R !NJl\eB֚3grwn:ijjBkM2~444uVR\wu,\m۶LWWQUUg߾}Aǡ'|H$>9:::ظq#0 .JJJp\a8@VVUUU|>y˲2[neʕyϧBk ;N%8V`>n.Tهϙvk ]`i{,nUН;nwF(` v4!`v 0@B񡲱(0^'Tq\֙u更L&3il߾iӦegggsAfΜɂ cԩ̘1ZZZpua6CCC8CQQNbpp~믿4̝;V\Iee%uuudɒ+}.B|]ڌD( 0eFa+ <]2AFy0f=9crÖz};{ii)wu^{wB@GG3f+_ bڵ,_d2-ٳ0 D"AUU_=.l>ϓ{ϥB!B1.ۛC`0H(}6oL$fΜ9W>FQ3Bc`pR䫥_e]:t.8 _NG(yڿ9NJEesbrY[B-V=?oچ$@G?400! ZwFM:B^/W>lڴ)B7۱.mᶏ 䎂ٍ ey0Xyc\Yw8xd7!KzInXz˲H$geeztZ?jbWB!Js}:/ϬYt !/F'G /Sï+K]q*s ?}짿5:فl83eQZG:˯FW!B\N ЛV\7otM,\:3w\^z%~a9qǏ; MWW>,nnn&-[@ee%@]]=dMaa!$I.]ʴi8rׯgTTTxx<9~8m_B*3G}₶5ٿuN,O]S_bKx+S8~ O#P"JqBc=Hi9:QwV?buysN¡<[y '~_ɀDuQ?J <ԋpHljt+[$^!7Dt vwDo 3Gˌvƕ8DucMnбe&rq繗S"6 |Px.B\&;Cuu5gijjb444pI,"q1m۶a6/fڵ۷D"AOOGӧ;3y:uH$§?iyy|D"FG`ԩx<~ooa2]䕮k!`iRjMaV:fKGh4:eFaC#[t5:qz{\Cx?* {p->&>:QO}5 \E5T;utzpBniP ͖(=5vTRqBkP7 )I*y{M^ 5hl x ЅBk݄t50px^ m0 ٷoMMM$IRx^ּ+̜9bŜ:u P]]MAA3f̠\ǡ~̙3r}ݼ[e-[ncǎdrss] 6ܹst !pLV=JOw׶L =GCzMYԱe&gIMֈgtNԈ3i_{:921s3"E*hNB!GB֭[f1m4 ,Rxw&''ٳg344RO|2{l)//nyvA,cڴip)mݻws۷iӦq7H$X`A[eY444vyG(++㡇b޽,]믿J׷B!B1 P(ܮY`08*ljb(6t `Q?e~2eYOOG-[x1/[n ?=jUXjWL?xWB\>0E0]h,BWoք5p bd=QN7*1T{y@__7!O`` <@WiՇ=O1߉Hb>7cET;kBk#''z{{3J)zzzm,hV%%%tfWŦMp>LtBZ3rM׻~{kBKb3FoWв)@ߤ @6mvMxEA'&'i}%sO;JRk'24}ca1΍&1`\vԸO!Y?ߜ7m[[x㠵4BiR.YQH__5A1@9Zi.xRq.nqڸ] S] V:sRΕ.B񱠵󦽘]1i$&Mt!B!crvBB!B!I.B!B\$@B!B! !B!W ЅB!BB!B!U@t!B!* B!Bq]!B! H.B!B\$@B!B! !B!W ЅB!BJ@!.8L=XDpءrA1^3C6=-y!0 0\zaro@QfO3mIn|Zj8ĢYNMgaקnqpy3ܧwl8f()dh.6QBEA5ICP1 TnPƗT5t7;L[b48L0OTrF!VMqAt@3e{yB!rt!G΍'ҧB!VI.z5fmϕ> (>YE}Fά3׏%.B!Nt!B!* B!Bqڵ2***& J)i$q***D"ZZZΦ61 P(Dqq1 RYYIVVQTTD~~o!B!bL -ˢH$Bnn.m)))!''׋eYr\.0mS\\̆ H$|$++6(,,D E/^?q>>OD8p{a_OahhG}+]B>_g!㘙Ht1plZhG5R9kxՎ5Z oQ<+chm2Mp&6R1Ж+u5~_339^@ǨO@']*B!. 荍?ӧOjڸ{9z(cΝ=zA 5k7n;$ r۹{ijjŋsQz{{by̝; /??388 k׮en:/^Lgg'VTTT_~oo޽;J׹C qkMꋸ}UsX`&YbEW\5R0uA Dr kItKRVq%\t8Y0 (-i.B)Xs:n*a ( aɛL3FJ\6 Sɟ%|3gf"8>9-2xMayxeg86l]4U$wx3馧ȁmiBжԢ?Fkf Z !c2ٟxC^Yzd%A SYzŇtCC!"L\2$ /~|;[L@>88Ȯ]xG9u۷oghhٳgswPSSC^^>g̙̝;2q-{G}}=Hロd2 /Jnn.op?N<gٸn}Y~_Nqq1뮻J׷CŸ#:_tYz +Vo/ P+D[o4:#5XNB x':a:p~x%E@).f/+5TT?Sn%kFo7ZCY 7$yݿݪQcp}YB6.Pp[j]Lh Q j* S@"U(XJ?SBL&p&BǍRec1Ӽ@t!B\&m.;;ǃ#;;˅eY8R Occ#MMMضalذiӦO$! ݍ8-Byy9. ۶+VO{{;/LMM /f˖-,^,M]wő#G3gf" R[[KEEfͺ-i`5~vTuT|t}rvi1Pg=c?#K#Unzg8(lRh-%e(mmm0p}!;ӡ>"cX:LQ/=s&m,7jlN/B!ĕ6Q܃ .rd)//g֬Y̛7 ~>LMM ~ɓ'3c RZH$Byy9cɒ%DQ}ZZZvSUUŔ)S%K/dӦM~zŬYh4ʁ_"9990{+]B!B!Ę&Ԃ^RRw]w@AA4uuuB!Yx1Ϭ[fM&N׿y…gs̙|l_~ԲO~򓙟C<Ȩ{EUL2ٜ%.m;drhF&32I&F] DH`(wz,5 Ji8ʸ\M  D=G0RmܗBXV6Ox% !2MhB!B!U@t!B!* B!Bq]!B! H.B!B\$@B!B! !B!W ЅB!BB!B!U@t!B!*BKo)jIj5y~;;M$':5^L/V÷8-Nui|iE7.ڎ6U!E]&iCq8L.P 5 BA]f!B!-B79|E{݃?x_8c?ڪyI-ϟy|'hάi<$/VQ\M' ~ O!B\$@B!B!8@?tM" H38Յe&I:;; Ù48g4m,ˢv;:>LA (RDJ")VbGI:/%\'g'Nyω,;%[Q&,`  z0?9HJڟg=g?AAA>O4=t:"PɄB@$(( 4 @ @(Bxh4F8@$ᡇBRZ`0wa~~ K/1>>N$'`xxcǎP(ذa>?Nkk+tttpiii~6l@BBx<{1!##qQ(ܹl7,< ;vѣ 0<>#ar'ꯋ^k?G?bYAA&HHwstHNN Huu5v0 HDaa!v2337ߤ}kףͥVIMM7G{7@VswPPP#GFl۶ FGGybzz_Wf͚[}:AAA᪤9y$IwE2XO.}\tRo߾lP(BʅB!= R}^h4%D$ g `RRAU("VڅabV*( |w![d!I\AAO)Ӯ]tpp`0,zFu󉇸hy睬^ecb^tKjq'OA|0-aDcD;AASC (A􏓜oa*++P?{.  Y$%TTp_4ssϭ AAAKBt   m@   p    D.      m@dqAAAL$T*$]oW#tAAAA0^P(D4]7׋Z5"@AAALP`jD""h`})   uT*X,p8 |лxAAAÜ;wZBs=.   7BB,EEE]^    O<&))H$ˊ]AAAnh4jb?|H|]NAAA+ID XU_wEXXXr}AAAϥp8̲X'x4b\innnrAAA\mĺ.(   #ʬ   m@   pehIDATAs(T*Z bpFs7SAOA 9P(P(HD4EP,[4& AsH+|iR)VEp. 3b  |\A>D.      m@   p    YCpVo P(PA."ET٢D"BJPR$醞CJ,   J_vF_, V RB" M\S՘L&L&p8hp8|ކc5%I"..F}!  ­qtBq$IHt7닋8L&Z$ DQrssh4u?ǹ %V-@$~?F3zh4/;$]^z0999t+K4.|F t:5]$IBTD=h4z]  ­#jQ(>۔h4J{{;7±`  j =$(((=voh<yݬkq^~#|.n7ϱa*3[*4yY& pRϗ/^Fat:5^?nE$v/oc8hp\z">Ijrh$Ib~~"OMM yyy}$  ps}d~.]Zf֭Z@ @8{e $hD"DQBjz<ߏhDT^5;{,NBѐߏZ& '77BB 7PHmD"ajl7*vc4D"lٲ j644K/ggٳg333zV^ώR$˟>aZ-333ݻ,dlێ9,+W$922‰'Xnϟ'//p8L$A\1 v  ~|NAAOCP(ѣGٲe W`00::ʁzIuu5 }zx )--̙3x^6l@ CTb6f(JFGGy]q:rpT*顧۷{nV^Muu4:FFF>rvT~?8͹sؿ?V@YYV $IbqqZN' b 𥽚hf444MBB<*A0t=pjF||<;w?l& #@gg'=Kt 1??ρ%--7r֯_dB!qs]Ph&ѣG"== ꘛh4J\\<$$$|ml~nnExIJJd2r8x .oAB;Jss3~|Y;Fbb"III122?R_:qqq,..RSSCRRN333Cqq1* FFFطo~ h4LNNt:)++cjj`0(;v\5  pk|_Zͮ]hmmg3==Mzz:>Pb fnnC=DSSo}[ٰa={DFF|;;;VHvv6.\@V}'N055%ߠ044"CCC{z~?w}7LMMx衇hhhr+DDR{njZ #ٳOrsss;wa6l@ff&rj*%%%;w^gttD]]X, u 4 :SNu ƻ<Q*444pI8s ӤŠ+(++cǎemfz{I#++ ,;v젭v8x psq%&''X'P(//BA8fxx* wf߾} xʢ@ @MM 333jyZ[[`0裏F$f3lٲA^/O</^dxxxGp8x衇8r`sIgg'gϞETݍjHLAA|Y$!??gժUry$h4m6ihh`nnÁ^21t:RSSlt: 76 G__>1|>FHVP f#99Y)r df|['@__uuu\.&&&P 9Ȼ]IĆ oolcb_l6f^|t:ٳg x^<tlc$ɓؼy3YYY:tHJJbzzJEZZA>yfs֯_Orr2^ORR###}v";voʢ_J233'33:ك$I Q(XVL&$,*%%EN(;h4σb`y˃ZOmm-w}7yyyg?`0PYY$J^fkZv;^Tz= t:X,B!=مWՂXR$994֯_ɓ'Yz5tww,?9v8v޽lRKʯe4 a6m<]]]aZ)..ĉXB~ۗ@A,[Wlo[oO?RdX,y^}||~_E^^CCCK+Lǣ)**_RXXH ?۷v222!33~VFIbÚcc~χ^#;z>#o$xz4 >@ ߌǒ9)TG]R->KFQT4 $%%ɥbΖnY4h4Jvv\v1nt:FN J%nZB;Ku'/ ɣ#nui~VX!a]`0HGGiiir:??O  %%e٨ؼXX5ۍJ{cm.a4 'lҤ,a \l$KI񐒒5255%/m6PۍBh4ʟ%JE$GhZ9<\!#vm]bעǮact|B!z cƮzNAA>2@"$Ql6^ϻp8(2//_j~rJ$attBA~~@§%99Y|$%%}h/G˧fȣkbs^?5 fY[(bzzS%Z4bPRrn:bE   |)t@ E ЕJᾗT*: ! ogsx#Ć2c  K   DAAAۀAAA6pɗ"q    8KK , cnzX6kM}~"j'' Rni`0(jAܬv+  >~?jZі&=aXP(Dbb"vf8|~}h4t/~~|>5377der4enneX,[)  M266nG6JbN@ pkڝ0 P($h4J$AT\R*~^@a>/=Gucy!IҲ6,{RiOQbQcm.泖$"K? CŖ][AAϧb#GQ($1>>J󑒒rzbzq:ǓD__nFCvv6:RSS1 tuu!---,,,T* ØL&?NFF;wbKX@tMt8fpp9f3,..233CAA.ڥ+]KF 477(j@~q>_|;crRl6Mrr2`v;W<$뙜dzz<7}Ch4(e6k㿴]~(LLLD0Vm...244Dnn.Z=_Ds!11+kjjcʕ=\AAn ;(_WINNe?4@SOJ__7`SO{n'?zRINNϓO>+W{{_56m" K/QSSCgg'lٲ0?O)))r|;AV>- Ë/ȋ/Hjj*>!^/ v6_+99F|~gqqaJ%qqq\.222p:ϱO[oEYY|;ARH$dff"ICCCT*B9r֭[1LZojj~|;d~~h4h$..;wxKww7J 9XAAnKc/F ɓo6 &33$.!joo駟'xBHK(;6m?OkOj*'rss6L~`2P*?$++ ^fggWիh4\p^y6l@MM ccc ijjd2!Iv1g?---1??Ϗ~#>D"h4G_֭瞣.~7~~)))wҥK|')) b <^۶mnSO1>>' gW^ᩧb֭Xckz ^WU022/KƘ'.^uFGG/` ??!  ~ٺu+ꫯ yGTEII uuu ?MEE:j)))aΝ|ߦaqW^!33UVvvV=쳼\~:tvB{/(  |FʮYUVɣd5 ~2k/!33`0xCn0p)ft: D"|M?CӉD"efh4HFARFףw˟ɟa$IɓF:::8quuudff'uuu̿뿲f:կhll',ĶAӑbgy{>~~Fl6GeժUB!~7RWW?o͟ɟP\\|դ;ۍ;H$aڵ̰f~ioayqCAAωبXlxCtݎZf͚5 #`4?4ѵ  j*~ӟގJb͚5( o fgg^z222{bǣhHNNFʒkm޼T9`nnnfff N]vqRyf(,,ua0'338QTTTp9T*ONĦVwy'QRRڵkYrPܹt0TVVhXb^ϽKee%aVXAbb"{Bt:y].HիWhG%//24 jh4YVKzz:֭b0;;KII fY{7Ir TVV@jj*'Dzz:UUU255EJJ ?'RRRAAq\B& h4zHsssR$1;;+ ^Ff$ ߏ{yX=~ Qr=Xzy)AlK{Qcb= Q(rOX}>? !!??I4;Y/?PcϪ$I|>6+3w,f$Ib~~шF}]Ė-kϗgɓ_D"牋GtĄebX>mΙh.-mvݎIAA$IbbbJh\v-INFn_Hgx~L&5X-V{ӶET~dO߱" 07t=n*caj8Nsك2+&  |̠:}aaG4e||zS7>ò}R^Jv033syk `Fr|OU;Z(n`0(/`0H(  zqQZZzS7vxZ4zxSV`0|v|qv fD"lvz$$$MAAnO]w.6'Zl\o\&|^Ī\.zM  ,%>"! 0͸nl6䬳H$hdbb&J%fMcc#388HCC|>F#w@8l6ۧxPh4iii!`p\\t χnJ?^ mmmL&9Z H0n"fN:;;cD顽VVD"\t(JnC;;;  ZZZhkkc~~ 2=V+))鶝k'F9.]\u`ddZ-Fv$11h4JKK ###,s%#Gt:III)r0LdONNfrr,vfbCܯ6hqq^/vP(Dkk+vT*1 @8j255ťKPTf"ܮ- ZI.]Bb|}hkkO|$6h4ny tttzILLԩS8p8ETb2hhhE||@URqq9x ( z-زe 244ĉ'ҥKp g׮`nnV+SN1>>΁Xr̙3ٳRf`0p1^~e6oތNq^z% 8s tvv@aa!_`^d"-- R,@_XXCCCrR|__===jF#. 8###x<*Q}bbN&##gnN8Aii)*F999=zG @7xCmm-(e4===={DnnMW˅lfnnχa~~^&nZIOOj2<.\`XV1 C{ǡCؼy3d2a2XbgΜAP`^޽{r1ٿ?P'NP\\LKK li~!jjj ɓ<ACv1F$?SYXX`˖-|> ۷LqO$azz\xZ-?y뭷p:( ^{5hkk|>Z-8Nz{{IOO`0oz9}4EEE  ]p XK.a0HNNl6o>rrrBFF&ӧOhHLL$++bڞB?Ǐgrrn~?[ox8wWrV$ @?<۷4@Ar%@nh4Qlٲ{PՌv:j׋$Ih4t:`s<vXo0D >Uoz-, `1rrr?SyX\\ki&un)--__Vzi'Xbv{r! Gejj *'|;wR]]Mkk흙a||aÆ r͛7k.F#?8jI0`&&&Ba;v 99hBT*^/jBJ"~}k444p9 jB!֬Y|0eeeL&&&&t ^\VAAuuu9r\WO`0H  G?& A(bbbQ'--yzzzo@c^/ EEE|i***|b0D"199I?pڸ;(**bݺuXV6n܈n`0 SSSLNN2??pEqɄZ… D&$PTHgΜR)ߴGQyInnYYYLLLpqHIIU(l6ω'!--tlقnRbfFiooT3::JWWLOOxCh4JZZ(J222hii!77W~0VI||!FFFX\\jjjjX/sNN455ۗ Ǐ#GȐ>r> RRRd׮]>C:N> EQ星gaaVczzy$IBT^qm/(( !!R~a4 Pydp)VZEAAJMM :NdA!tttRf~zc͚5`ZikkcӦME{{;s=( \.ׯ 155<@AA$-➑,.]v}Kwtth&99h4ʅ 9)  dggގ$ƍ"337Fvk.L&h4fgg`ffVիsNy~J"G0bPZZB`rrFrssyͥȠ~6o̪U%3%772lL&QՔqQRRl&;;JFF*z|z}}=v"??@gg'۶m#//ON·zj6l@NNcccD"vڅBn$...,]r8zj5Ӥ_׹$q*Jްb RSSYr% F#*bZ-lڴ B!'ZLOOTKZ&++ NGrr2F MMMvnV+WMn&|rK999X6rssٲe 999ٱc999۷SXXᠥ 6l@__(J⨬311;fƍYjGpCb׏L֬YfcvvBYYXVV\dqqbNV+===hZ:nNիꤤ$z=ϟgrr￟|T*\.jkkD"ܹ{v!t:%))Ifc4%33UVQVVFgg'$CQRR瓏Ux  \2]bC}>Mxx<{e>==``0p77ɹ՛w|YGQƮK`0ȩShfq/,s; D" BWpFuҲy_@ KD"~"Xۉ|"H$rczDz_mXOsוy^/bnDAl>4{RR}}}׳HBB\ҥKD"f3\pBjeaas1??Orr2;wn<HD{{;rYCtwwz1c5 ]]]444=W ?^x<\xNF#FX,ro磮B ӴiiiAL8&z=:FINN&syh4P(8V+?PT~_KIp8ÇINN^6v4 ϟgxxՊVz4 FpDg``J%---b6stᅬ\VFFeq|{$K.Rp̸ny&''ͽe?L($/^$++#nFFFWoIvv-oK_m_b.6jcddHHH 022B__: 蠩iY[D"ݻӧOxQT۷iٿ?'oosVX,W7 D[[&h4癝%%%@ @cc#(JL&466ۋVEɟxj5ֲ@RR^:HLLzt:9w$&&m+>CCCjqݘL&tl^vvލJŋ|p8+Bbb+|ԈP(oAcc#EEE099Ⲳanȣ9z-?w`$FJ%VYΝ;!11O]]埡qjkk v<LMMhoof阘P(D||<311!f۱Zt:+5,JLL$@OOCCC<0vcZ/cZoʨ4A/ϒ#Z8rZ,Z[[Gjj*/$I9r"x Vd21;;˩SfӦM77LMMq555:tڨpY;{, ;;Kcc#sss@oo\].A{{;* "qqq 288"6Kihhht~P(8r?Gbٳ266gϞ=( N:Eee%*jY|yV+7e_].f3::ʋ/joۋdp,r~a<LMMaZ&#If\a' zsV GRvihhtbۗ ǃn' J?n`0$I|>J%JRn aٸtO?4YYYfjT*ikk/RUUu˧~, D"nfff8x LLLKBB/giiitvvr!.^h!PT( DZX,z Br /@4ԩS0::*⥗^bݺu:uJ~s]wꫯRTT(.]b~~7$Iѣ ihhvl6@$}v|>===j*YXX7 --K.8~i"zK/Doo/A.{f9jkk1ͤ|AT*~? a2$>N"77IlLMMD$!..Cld2B__vzzzd2줧ӧOj*"\`bbw}Fn->~z{{y뭷ضm)))0::nrE&''lk:utx^ffftww3==VMfvilldbbxPþ)իW|Ďeoo/z) b줯P(###vFGGg||ټ!"{E0 '''Fa]ww7=6STT /ԩS$''S[[˅ KD"N>Maa!/;v\Ooo/afggywz444P\\~30Ǐ';;CE{{;@vލXƾ۪)**_grrzz====9rzzzl<3HıcXj<󤧧>$Is=! u()) Frr2jD `xx\xMKK <@VVuuu{$''{Zfݺub{シ;] 0@URPP@aa!uuuQZZf͛75}f3ϟg200@rr2rϐ`^O}}=$H^^+V =='ORYYj%_ǃR$55Lpׯ'.. J%###<۷ÇٴiTvyFF o>~?mmm:uy}]t:ǎ8v+VW_nSO̱cp8FXf8qDQN'3gcbbEZ-޽;wR^^ΡC$ V?+իl\. ?G$Μ9êUnjnXp:⋴288Hnn.299INN=B!`줹*y0CCCLOOD(BVꫯf9@G?ݻw#I'Oj[oDx֙, )))tuu1::ʱcHHH… \pA'si&&&BVkQXXHww7tvvŋffftR]]M _?nd荍ݻ:V+@ǃBh4299ɓ'GSXXȱcHKKxKKK\ Zٳg B,,,P^^ξ}rÇMOOiii8pB9z(ͨT*;磾Ro$Iq=p9∋jt6o,%+Bss3MMM$&&իILL/2;;tRZZ믿Nnn.0??oAII 'NAp===f9z(rO|\\>}lˁF(D^z%t:+~^/F~+$I;w={rʕ+凉7|ƹsPT8pls133Czz|}mjj044Dgg'vbʕ>|ERRO<& 1>>ΓO>IWWӴo} Fmm-Ӕk.݋`'|^&''ikk~HJJ̙3QPPc=޽{F8N:;;'?fƍ8p`w]=Jjj*֭AFFGAӱf %@9p{̖-[xwp݄B!S$J\JRRyM]]]x^V\ɓ'o\.D"T*gW ٽ{7]Va?~h4o^gqq!oqw+t:YXX_{!++KϺuXv-o||bbjjjXr%V۷sa>L4 $Ibddy ԩSkvvaT*wu?06Gy^/r^$!OJJ ###7^ B ַE${]cַEgg'OG}_͋/²$a$Ik_7}g$!99|^{5m&g럝%xPTڵh4ѣGGVVEEE`2زe ׯP($ρ|nm4fq} hkk#  J%EEEnFGGiF,..t:&|AoNII YYYlذH8f͚5477s Q*xtfBVZٳgq:aill;GdN֯_O__cccTUU177"`0!--{ǏPYYI\\+V`AN@)uU$f3UUU y瓛KUUEEETVVj* $//rvEKK on~FFFp`P͛7S\\o}㒖Ʒm򘟟{y8wPߏf_:uuuDxP(ݻN~aoߎf#^E"J%wq[lattP(@jj*deecC5= a2HLLD&&&B8N(,,7~7䇋<ˎF.L&֮]ˋ/wAII r<pXfcAykk+ɔžKDUU={%rssD"899yvu]<rIAڵkyؼy3cccXVqhjjbڵ< t:)))ppwfjlܸ.~kLjj*>(W|jjjhkkcqN۰J/R`0BXvkcjZ,FLJFR5~VU JR^χmklع.77իW_q# ZKvl63000iii8N84$$$w^.\@II AEEE<8##^r\!(|ZoٳghoogxxAۿ[F#&`00tuu1;;Kqq1`aF^/?񏙛p&&&bvvVzF`ttNBSSStuutVVWjyf|cccX,,;69:'Np%Ѩ)..رcTWWMrr26ljRUUlj4\إCfabb .ܐ@PP066Fgg';wĉ΢Yb(z:eyb/vN'gϞ󤦦Z,-3FVVeB锕/c8y2339s;^p8Lnn.j֯_υ V}}}ʕ+^mgĜ9st1dff211+ttuuhFVD8r <yyy|>.]Dgg'hƮ{EV9w_W@464i_lݩTUUaX;b||rmٲ7RQQ8l6|>4O!".FyTjj*k֬bp]wb hooTYY===ri4yhhhbm="IjZ[;!ӱ@MM<"8E("??$ Rq@n1nN;)fqqs裏R[[锧2Fm6N>M$!++Ky=cZijj"]TRVVF||>t{bb"FTVVRQQAaa!UUUD?[laŊ\.$I" QUU^'99իWSRRI!ɝ;w~K砏`6'%%6L&|>GVVA4^QQA~~>6lav%ϱtyrEED"v!X,MC$!!!" tttPTTĶm̤bgddCii)6l@Tm0HNNf``1rrrXz5)))XVV+rPcʕOVVb0HMMj[a90 ܹll6CCC{dgg֭Q*xeʕëX:YYYn'77UVG׳j*y}ssslݺ)))TTTx^eVP($ݺusss͑륷 ***6[mmmr{}g;em,77T0r>(wTZZ|@VcZy( v;.,Nv;:7̌|-HNNFV300M*}}}~zrss`0}v233f=٤wAyy9yyy" BnvIJJ ~zV^Mnn.ccc$&&m6G;w$33Dغu++V ''Gڼy3999n(?ܡ222<@ffSq9"=;sϱcyR`'N0<< |#iӦ n;FGGnߕI$̙3roURR۶m wR}ddŲ, 9qn:ggg|zl6ۇ?6f-+FZO_$r} ]T9+6]s _:AO$9O5333ߴZϱ~\#咳nɡn;ؼ/ I~f ۷0RpjGQX,zI?-}ǵزW[Ӽ]h 6Q8AA]bkV+ƮFQZ<{0v9S'fhhiiERRN'NHJJ .gڊ`bFmm-VUz:u8~?477DZsEm 444P__^GS[[KWWaN:E}}=L&$IԩS $':<>Nihh ݎhD\===>|+V\SnIKK vi1X%&& 9w---z, Ü}y8ə3g듳$dq_:}8Λv bY?ʘv~eqp :u ^` .٨?{#_O?Y9)AAh>K =zBANN.]v;g?bp! xx<466T*ILLq9&&&HMM׿5rIX9r'OhllKˬ]xQ7j09r:n===,..rAW_%%%l'*++q:曔JKٳRdɑ#G&99Y.믿ΦM0x7())3322Bii)G?"PYYn7|;ݾ,@^/gϞ% X,+'"x"NGKK\tJ||Kl۶mfD7Rd2[[vΝ;_ذa dddpwhضmܓ"gܥKشi?8ꃡP(ؾ};?fp8LJJ @.==G}J0$qFV\)Oww7TUUFjjsN6oތRp8̡Cp:5oNRRHJEee\W!V^MAANtri6n( Xn)))l=\8 188,/g?cxxA^z%x?)###JVV`>իF(J, np8,a^/z^{yr@sF.I߿__?~SN/sy({uϜ9Á_ yꩧhoo7ޠݻwsK8/r[6hxxN6l`@Vˉ/G"~mٳ8N~?oͨT*  ;PWWo4կp\sY3  G`ݻwϖ-[سgNEx(^~<h'Nnݺ+155c=w܁h{ $)))lٲCJJ _WQT Ʈ](**bժUs=칱cDF\;v}Gii)7FQN<0_W}I@R=В$RpWmK7::Z[!''n^/&ӧOSXX``֭D#33rxE"y)--x9RSSIII9F#[n%''I[o Q҇):R=Jkk+UUULMM1>>WdD"HDcc####x^zwImm><  ?sTWW,Ť255,,..o3;;ڵkq8޽Z8qk֬A1==ŋt&.}+Wry222ZzǢ(O=$''t:}}}!kiiaffkע!ccc444܌jr0v9<###_HJJ"r%ijj" 299Ioo/ׯ ))+VwMaa!yyyLNN2??O(٫qqqX,JRDT^np1~_5:N9jYXXc۱8N|>MMM rҥe bYjkkD$.^H?MMMttt066ƙ3gn>GQT*!;;[>1:`0HSSEEE$%%˽{EUBR\ZZGcZ咖>Fxx_fN:!==<$iiiܹs\.VXAZZl۶ @FFyyyvAAn$>>G||qFj5hZ~?}}}ر$`X.JC=J-@BB^ ddd`2X,jF#PtFGGh4L&(//yڵT*z{{h4ܹSNjgZ0h4tinnN$i|>7uW/eiQ:uK"pQFFFFuVDz4%  sr'h4Wº`,A"I~@ C%I" v,u%I"C̿N>:nUmh4J(]s F`ŊH/|Ӷۥ-AAϗXliFPt^x^BЗ?S#<=Ĺvq|>3p=iIh[__VF[AAj5WDhV+ Y/wB!_GHq$&&_f  >u  O=j(=.K~Yv˥bX.4~p8 * N (Ċ eYܓhnn)*`0v;F4%)))>$iiiqap:dff200@uu5P(eqѣ2HDzk4.^ɓ'q:8fgg9t󤧧@MM rK.QSSnl6>|ݎޣH$fٳ;wh4Jbb<$9 r9Ν;`@sI$sQΝ;ǥKGTطo DQv;={ORR BoMKK 455111Arr2/^D,a׿5uΖfqѣ(ׇCTG}}=O,=gϞ… fIJ~#犏255%nXa0hkkLfbbۻ pazq8W]СC?K.HWWo&~`0Hvv6 wy<>]]]$&&jjj<[GGx0մbXP*677 _cN'fttTTlO>MCC\m㗿%$$IJťK%;;;\p%gt;Fkk+IIIhZ8}244Çq\@ƾG8|0###ddd\uL{ltt+LOOs.^Hgg'TWWsIrrr0ꫯ̑#GAmm-Oŋ Z-Gǎ˨ʇ8qxL&`Z/..sYf3qqqR]]-qpE]]7* g=賳qjjjhll__gjj_רT*^z%xXXXɓO~~>39938z(O= ri4vc2x.>|0F$I"vٽ{7NRIjj*9r^ywޡ3gp8 jNs=Go033믿륽{M$ÇS[[뭘GëJ4EDx駙daakFkk+P[[ѣGQ(>O}\.JKKGFFF١j/%bM??g||^g{{uYt\86nؠGcbbbH$&&&$!!dZV+ˣJJJ󱴴DII |>Dž r@2dggz χlFSVVGxXZZpXLLL 444LMM SSS3::Jyy9CCC8HLL9vwwe666"""Bp.,,#zzz١>}6###ܹs+Wo륨^UL&crrNǷmz=||!77^zYZZbhh艛#G/c0mDy9wjDBTT/^D.1+ddd JH$瓙)DdFGGɓ~j5r6t\|cǎ!Ʉ㡪 T*yz=>TJNNDY]]%##Lss3 \N{{;r"ɏVNVZb͛x^] nhooSqa^~eJT*C&?ϩS *NbѣGciii"Q*~ʘ6}]vww?m\rMaS^PP`Dj ͛LNN299ɃѣG?GT*'O@l6r@D8--'O~d-\\\D*c}}?PdFff&( """ %,,=^cff@VTss36 BOOϟG&~3N'%%%reeetvvp8\p_~:;;III."^ɡׯ:{{{šƵϟ#h8~8"gCHHTWWс`uuZ-NOxYHOOvc4w199)xQQQ&w?v;7n '''NwllR~~K0vE""۷x<,..266F||<ʛoIQQo`2ŋ<|P?@]]ǎCoVH$''SZZd"))loo#q8f^|Errr離u^ba{{k׮q9y&n%FFFG&qNgv}$&&Lww76ǏSQQ0< Νcee/F?6 H>j3gΐz4bbbfssS(#瓖|8qDB[[nz^CIe"ߏG.si^x,ˁ:~ZPFRSSIMMRەJ%/2~ozy!;`ffdLOO3<<b癛cuu)^xOdHff&jYT*p8h':5~?/^wr1??ODDZ">($H Ai|TWWjYYYĉdddSRRlnnr)qmmm=z`'D¨B$=z ^#~T*666"LNNrvvvp:1<<,_x^>.hii`0ϟcggf9wtvvb6355Egg'.@ӑFˬS]]M[[QQQv`zzetww z{{;ddd@dd$< QQQSZZJ?O{>~*=zĿ˿`0X]]eii"*++Y__LLL ˱l?h<55R3ㅔց;v NGnnP3&_055,yyyhZ9}42W7˗/Ӄ B (i1|>Dii)QQQrʕyge {|>K]]Әf9Bvv6{{{BjCj9r/V%//8:::0̈́vVpx8bIDAThZfq1JJJhkkƲGgg'bXx8&ܹsx^/\.H|4 RQTFZ-!H8rUUUN~~>333HR=Fƍ OBBMMMxߧ ʕ+XV싔 gKoo/><0z{{|~D" ڊjE"022H$"33SnCCC.L\ oooc2ctt.xg͛T*ữ_Ғ(Q(H$P A K63 x<L&~^OVVdggsIf3III ivC'44#G tűs=GRR&q:8LFhhzA0& KLL JZZZp„=aaazF#dffr!N8L&cmm VkZFP_FÈbؖ͑Fd2!HHJJv9rgϞjyjl6\..]dt:E ?::&:xRSSH$p|*M'j666H$=a4"++Cqq DFF+MMb1NH1G"JQ*z}hx<`6pjZH3NIIacc /p C.b81t:F#iii¼9w>˅l&>>DhhӾ<$.,,8f3dgg"qqqh41j/M!!!BcǎR_d{{}sx<| 09r1233zX,rss9{,& rrr[[[rassSp~t:9t>荐ΥK|BJT*%..Nȸ2L|>HIIcZ4$$5a l6X,FVc2HHH &&@.Czz:D"^z N*2W^yx!++Ç#ּ ΀˗/KZZ>}Cn'..>NXX؁gСCB6@TTFdD"J3gMw&..4D"|>r9/_d2ٳDxx8DGGx ] 111ó>Kff&loo /<F3A $ȯ"If q" 999_^:H􍍍SA_^^>9ΎovOzp8= RZloocR˶ $H A>+?{TTTVVhjZKKK|z(//kx!300@qq1mmml6J%222Bbb" @)JKK'**SEr9TWWcX0LX, X,$&&ɣG@PѣGDFF vܹCWWջF<111BJ餾&j5*JINNz544AXX>R0Llmmq:;;Bݾ>zzzwvv1LP(dl6~m;+H.Ӕ1::JTTtniiF|} rZ D?ͦS~MX^^\#444V"::.###\vHbbbxԏd= PVV>xUU555 `o6!!!TTTBjj*2*++֭[tww#HJJsuqqwݍT*EPUUEKK ~(ZZZxmmm8N?9ӃT*}rkkK륹:BBBd||vvv0l6d2!NN2,,,`6qTTTETT :::A $׉c t:x^RSSikk1 DFF[oCii)ܺuq:dddjc{{3gΠT*١_|\~@_ZZB"0==0yyy"<.633Cxx8j룻/6sI(..&::$~?\rǏCyy9ϟ'>>D*:۷oEXXŴItt4JE 9{,DZÇRRRB`kkq ;wx4 K.!Ʉq\.~qQyFGG9|0o6ǏgffR"\.Ưq}yyX,?~]wǎj΃!&&z-N:$ͤPTTD^^r+ck4v;uuu"˙&228V1 e 0::^b0>>Ntt4󴷷Fttp- ˌ3<<,4֛ʕ+ z=MMMhh~qx^r9.V/2<|XS(TVVӃ^x&''Qtwwp8z*ٔkpdd$CCCnFGG@PсV֭[dffCyJEcc#[[[v&''*!!2RSSfooFllG.FFFZz`0ߏjw!##xA>PQx뭷̤4jA-,,GMww7ssszJJJx Av;*y emmz~^z%l6UUU餦 v*ƈfddfΝ;GBB~5T*oĉFCCJa###`t444GDD,--AOO2X\\$<X,gѣT*̙3r!sa4Q*d2=Jjj` ɓ'jT*ApERRRP*BͲ㡮FWWT*Ν;Gxx8~DBjj*Jӱlf"##ikkCTT*ihhCuu5ǎ{bhoo'<ȎPդ011D"}}}TUUd2>>Nmm-}}}\~geoo+Wr줺Zn١ VKLL zׯ2ݣ&L&kpp:_Nii)匏su<J r9јL&tr_u#Ji*** ceegFGG9q/6=*++ۿ[fffXZZBqeioogkk_|'N000>,/+RK/DNN===LOOs.\>|W^yӉbamm VK}}=]]]f!˹vCCCTWW)//gkk ^hdkki᳋T*^yf3SSS,//#HHH@ףj9}4`2DDDpmp8lmmP(466ׇcǎq:;0<׮]f|>r5   JQ!299pnn߾??`٘$%%˗/#JiooG"/BOOsssK\pqW_eooOp4;::l $%%elj<}'>ǃT*E"rxKjj*333eǏsE1p@Vlm j 'NB||PH`0`2HIIN6gySNP(HMMOOy7r&V+cccLLLߏb:{zzX,nBBBcpp5kÇq:LOOSXXȯ Ummm9}eBCCygIOOg~~#GpE,OF|bcc`0`^#""B~X"HHH@P0::ɓ' χ\. s@& R1wD3ϫD"A*  $H AcߎLmm-"9Ν;G^^``fddt:yBdkk+'N|Ittϭ+..? ~ 3<o&''q8X,^~e!C"pbbbJ\pxNb)//guuF蠯 >D"&''9z(ÈD"L&P999HNt;qmmmܸq$V+SSSG?шfkkK(~:mmm瓟OUUn"##'N~3$ O&""W244ӧ9rEEE<|#Gp)yw0 DEE1??&++;w{`ܽ{0RSS١IaH$LMMQ__/|6!!Hob!%%B~1??vΝ;|?>BBBHJJ6\.sssS[[Kll,III QT<3T*8r>l:~N2B)VQQuuu$$$`X{{{\.:::xgʯ_~`wIff&`6deeJ 簰0ZZZwfc())#G000X,楗^lfggywP*;wJŕ+W:t;wP^^ѣGˣwyXΜ9jrYqㆰ8y$555ܸqLR)---LLLP__̬ $H A>f ye" tww@VVqqq~DBTT,Djl6 ER)‰<.6>>"H|R666P*T* 77RIGGnٌ````׋Fѣ2;;X,&77W67999d2:;;q:( =jEMsN'B:&ǏvY]]%%%H* ڢDBNNgiiD$ ̚`xx4b1џ@iBjj*SSSBsVVW>Y3 LNN211!rHKK#22.vwwJ>|Xh633#ȨJ.VVV@"099dbiiX, 8$hLll, "A.ҥK<3aZILL$..NH 4 Ԍgee#ZVG{{{ F@ddhD"axxh.8Qsss3<<%''qIHH 118q5y$[[[( X]]=Р2446ﳿdbrrR0III!..mfggnsQ577'ǰX, Ezz:.Kp>֮QVWW9|0* '992N<)dn'##H&''llXn '11fffHNNfeeBVevvVX, . ^< 366X,&<D@r}> $H A?D"ˈDOeKE>Ks\M>E4beWs_G>yIx<\MLN-}?qv?kL A $H D"Ѐ=Ѝ5Љ"}#S~7*nrFR$H A nw`^/[[['$U}{xLq\?;c_nSoma~677q\lmmT}s_png/* A $Ho&??(Z[[Sf\餠Gtt4 (((`vvV}=t:ρPJ a0 d2r94V\\ܺu5RSSZ<|fd2Ѵ 1fqMbbbիtttR=Ád"TTTP__ZFVS\\LKK x^ p<<`hh&W^FCAAuuu`4tvr9[[[HSSsssQWWRGA*zikkC& ݻ(TUU4uuu Ohf#~~l5hooGTNMM XVL&}}}333C\\+++\vN$ 444P\\Ltt)ׇY]]]hPXX(Ja&j&Kkk/=cppшT*ѣG֢hPTЀh4~˼ $ȯ@ēܝN'#я5WVVIzz:g?#&&0\ӧ)))d2q-gww\bbbrJQQ/^9r:Zy!`d2VVV0LNJHJJR\\۷9vTWW /D"aggnݺEff&]?FBBBlsZ-8vzv;cFCXXsy@dx<\Bnn.׮]crr{=V+**bww%fWP@ 44%zzz8y${8~*,,$::X~:Ofll>̽{8y$  C]]ő5 ˣGBz)++c``0aaax, eee> ŋf100L&z{{Q(TWWىNcwwf3===T*^/N:q ۩gjj Nl_W7зH)++cccDkk+ b۩E,V)//eioo'66XjeooOD?F$qi~uttj%::ZAnrzz|>TTT 444Q*444Ԅ\.?`4~~򓟰-Ȉy^Za2uӧO344D]]$''Occ#<$QQQSUU`aCѣ)\3@`b 9w^H$F;::wH{{;.]")) RL&kE{{;jvwwd~~Oxx0::Jtt4Ru8pfffNcffQBCC)(( ??p!BCC//vZZZJQVV0rQ"<>nL>|(Hzn߾Mnn.i?A $g1?6GVV2HAŋHRAKDEE?<Ǐgll0L&>Tv;:RIWWhZjjjhllD* '22vz=twwX^^ofqqMbbbiDzz:'OgHH^ˆ ??8BBBjS \.誯C+++fD"455 /h4d20 tuuիWq8 p8rv磬6y۩߯_fzzJ ]]] ֆd^HNN=Mrܽ{u>nիfZ[[immxDAAzVVVlKwTUU]&Q;w`0:, 477swܡ 9{,gΜaff>s=r3Ϡh4<;H AX}ggk׮ӧ)**baa1z{{q\x<|>n[r:ArTxqn77̃l\zgrMSWW ޽{lll0<}Lw~_TwOFFG'''ZdܹsfVVVj"P*,..O^^ h4jkktEEEdzEWWkkkp8r+K$F$133Cxx8M#ɓ'F"xgHNNfnnN>Mvv6)))3nӧIII:tՊL&#<<"""@V Ӵ4N>-aQQQ?~ݎ`ܹs(J!رc066 sJ&!xHIIٳF, DXk766j:u&*ӧOsȑ# @*Bvv6.mR)L&N>M\\~Z-\>~w~XLdd$?> ׯٳgIOOy7>buuӧOV%**,f3b~?^'D C*")TJHH-D#y!l$H A|l>??300˗^`yyrBCCʢnsV+W\akkW_}VN>X,&44X"EEE\z^{!N8;VVV,,,Jee%ttt+N88zQ! %%XVFFFh48Nz޻ȥKdbb ~?UUUP[[˛oba}}]BMŋY\\JbbPxy'~J{Gxx,ko߾9D"hnnw~w(//G?푚4~^z 70LH$A=p~:CCCdii TVV2jz=q |bb"KKKDFFt:°lFVVVv]0?arrJll, jmdB$5!!^0T*RFLL R?==:X6771T*CaZ1lllB &&V2J0Ɲ( <A8ݻwt||>*@_DŽAZZ>O+J9sH$"--}Kjj*,,,z\j2==M\\M_Tbh4"bii20::%55%|zt?Đ>SSSB<0.D"d2 33TJoo/^TJnnְ.H A, }>6rو?@y/ _MA@:E4111㡤D`IJJ⥗^32&&&7xb7 ^*c6y嗟J@g>DIJJ"++i/P\\?666@dd$`(onnRZZʷ)H A0KRRҗv"}N'aaaH$bssSB|S)D8!EjjZW{ߏj%""sj4ϓ@]i:?)U拞Sf=ǟ_w@ $Hσ@iX t链(м$x<|>)7oʸ?y\ϧ 4x$H A|1~$~#Sܽ^7&]"|tj <zlll|-Sn{ڧqOsn7+s<}*(_Áb~|lll|eI~666p:OT~!fԔЌd{{ o2[[[LNNr>^/sss=S$Ho$??((,,djj8BBBڵkB؆߿n'11In޼)tv԰Lrr2TVV"Y֩Jbhhwׇ`@~vAbILLd}}{e222X__#ܾ}(o6F]z-zDFFC***!>>^xCjkkQՄr=t+**&""۷d2a~F[[>D]],--L&n#˱lՑJuu5SSS$%%Q^^Z:z'O>OK`jFFFs $ <ETTFBBRThD&QXXHmm- B膽R2H)//vc6?SK`|fZ/eٸq}}}dggP[[KII $&&˽{hll$** ݻwikk#""B{cٌX,_~3?wkkk8DEER߹ǽ{ȑ#HRx$$$­[",, ͻK]]dgg3==-H&&& MQTj #$$(:;;)((dYs0wwwy ++M]F]]uuu$''ÇY\\$11޽Kuu5DEEVHNNfaa;wC0KII 9s&? H A~ ~n?"ԇH>@$%%fȠ7nFڵk ۷9|0l6IJJbll H墽K.q Aq}kkVVVԩS" tLTVV"Y>.\6bnԩSD"A:)) CQQ;v=xWHKKC"xHLL͛$u/'N>rΜ9CXXzX޽{$%%vE‹/HFFTVVhy8tnbffLn޼I~~>TUUrtaZ'>>+qq}kkh6NH$"%%" Fs}N>Ü:u۷oGHH`b۩b``z_$h4(**0\.AUU EEE.<```U{9@zR]]墩,..͏cWTUU 399 Qrj5SSSlnnOWWl6AW tJqq1z(**buuL}}=---MUU~P߿OWWsssԄhNύ7r]ƩS顺Z,++cmmEOaa!kt:BBBX^^%f3͂wdd$%%%<|шÇEKK h4sz^顶V jIQQ===LLLpZإR)NVH$g}V\w6xcc#.tjjjsqqq\.=z+۷IKK#,, KEE]]]loo355hdhhM&''innf``FCMM w%** MDD4776HR"""GTTl6a|M5yl\|GãGX__رc^/qqqT*N8F/Ç 077lrIOOgssɡCp`0١UY[[cnnPbrx<ӟHd2RIdooj&~JKKY__l6p|>r-*++t.\p.D"H$ŋzũSr yyy v<hjjbjj'Or]z*ϟBÇeccq>2?RhDRȥK9rT*$&&2::l6SRR˗@.T*rrr01>88H\\YYY0SXXܜ :>>4Ѓ FYfggx"R9"##'::~xg8rSSSfkr9OLKMM%++ QC$q1JB$СCH$~?zǏ"$$n"""0 TVV#T*Ǐ'$$V+Dn7mmmlmmJ{{;!!! z"hvvvteb1~Z-TUU jt:?"70[[[1 z!*0??OII f-橩)d2!QT `0ѣP(ɓ'}LMMz`-//STTÇ_zzH$bhh.ҐT*N:B`wwdFFFC$aٸwBoX(--%66hbbbikk8;g)rrr`ssa||4Pդr1ƘUj`PVUUέ[0LTWW300&ݻwq:;wɍ78t477SUUH$b{{GDii)H%'33ǏjqLLLP[[K}}=~Z-٘L&\BHH.z^pfgg%,,,ƃJ666JKK)++cnnѣGx<ƢP( chhJ^СCs#66i8d2>(Kf\.Ì؈ ""2zLΣG ass (..F#nbqqa|ϣV9|0jZph4JKKzjަ>AqpZ~dlTVV v &pd2ccctww<,.. +++ttt099I?RHIIȑ#LNN2::J}}{ݻSRR׮]#&&&:;;UII }}}paZ->R`ѣGX,bbbj uBdbqqg}ߏ"??lhmmessvZ[[|BQǑ={T&&&|H$RՂvG*b4Y^^ɓ a#0 jt:6 .JLL uuuHww qݔuuurHJJ2ǂy A<>@l\zǏGqq1333ىrxp:Bc@:zۋZ&>>'Np!jjjOLt:ܽ{R믿Ƶk׸x]ǣp---@Խh/?M(,,7~7B[Z?oAss3nH$%666OHH?X]]exxp?~l }+ȠHrr2aZb2CHLLdyy)Mφ餠Tʷ-~?Ry&ozɓֆf#77T*&>RV|0m6>G2dgg * B`~~"2LY2RRRp8vb1dddpAD.{[^^[%8axfggիD"233IKK"Ʉ HDj?NVV)));v L* RD*VV.]dbjj .{{zX,r)aN\.Q*r^|E|M9{,qqq444%$naaa:ӌ T KOOgϞ_IIߏZ&11pߥł`7~71 ddd`6⥗^B&Cւy Ah__BT266믿hZ>Lkk+̙3lnnӟΛo K$q:?EEEܸq˗/ /OY[[#<<\H+--"U Ǐ .JBrr2?ztt4`ZIOOtWW ̋/HSSCCC>|Oii)### w|Tp5._LOO&JzHRoǃh$**jDtt``;N^z%bbbšRwccc>|$$$x嗿Mfr ǎݻsaBBBDHRZ-/+++T*222 @pf"466$le2FfL&Ӂ4@ID"!>>j 6䁿tSYYC* XRRR8y$^_EӧOSRRG!::e}}}{TTT H,!'BL&CՒ.'44TpINN2??/j z1L xY^^pޯ:>b!ʕ+XV^uS*Ess3iii\xݎN#!!) 8 innӂ# 1 LNNr Y^^fggLF|||`ŜN'N"##C8FHHbR^^^xYd2illT*cLɓ'ZQ %%6,,]***'Nra0x\y7ݻvd2ad2^/T*f}YYY?EדHkk`('&&R__ޞpe20~N&uuu|> r\0"H0͜={+/9NA3q8TVV2::Jqq1?<vvv a~;66KJJPoS[[(999¼x<cxWW_}_|aHJJwwl6"""'>>Μ9T*evvzV+F sp>.\@FD"aeeBng\^ A<%D6MD"666p85.Nmt:V+ Fz=N j5 ~VVVrn7SSSx<RRRu@fM׳ > 4$lllT*QT'99\8>! MIIauuu!ezzDBRR"IN'RTvww !44)n7HRư턄Q@-H$bssYÉcoo)R)III(J666X\\$<<\h쳱!ȬnE$H\\2  d2jZ*0 ,//'22qǣVoIII&tmm FD"arrdaBDDxo}}]H OY^^&66=fff9 vl6r9 iNpfgg <<\PON||<) *JGFF eaaauD8$ :RN'u KKKRr Ύn3??B 11d6v.dAt:!;IbXh4looc0^/6xAP133CHH<@sssHfffH$$$$ z*^|L&2Lsssx<r9F#etcnnχV%..yw4[[[QoZ4dі\.gssU9qBmÅWTjkt:xK.`f!JX,looc2H$ܼycǎ/r(V+2 F`~~^?( <:5"##YZZ@ߏn'""5a-C&,䤐͐ޞOHH`{{9 III( , bX)4aaaL&u8 5 mfgg1 `X`0`2g||\xΓ|>1,--)~h4399F!>>^x-Ϳ7np:\.N'zz=ro}A UfnnNa23\?@2y@e4 3_$O6Fx $H A?D"H$OeK? `>SӲ~|l_8 >' 城/{ $H A#| }R߄wH}ZSMq4 ÿ1}j A $H֖Ф9 m;o0x|, ;;;O4ibee3Xvןpn~압\.jessuv?ooocٞ΅appOY]BCC?6%zss'Dì{qO離'N|&vÇ)--ettF͛7IMM:`0{P7t.))AR 211)//gddVWWǵܿ2INN۷oOLL \~Z-!!!'? 歷BV )|Й:u)z-n7IIILMM *޽f͛ "OV~폌rQ^^Ç 226]Foo/!!! r466!(Lr-QTDGG͛7YZZ"))ݻ $H Al JX,ȹT^c @76̤BF#*[no"##)((̙3cXrBuu5j^u޽KVVZORREP>ݻwG.kk8, [l6]]]LLLp8h4ܺuQR)DDDk۷IMM%&&!##C0"+++̤sQcpp@edjj \ΩSgkk<ǁ͛曔Crr2>>Dd2뉎2AH<h42::Jaa!DFFR\\LSSJRޞ ӃT*=(//f MMM$%%GQQ6 VKRR8NBBBlttt@^^>$)){W^y6d2dff:_ $H t:A <$$Dhhz?bl-++ N%11 pREz=&::!СCa6R0L&hZ?rDA4%%3] HDNN`dL&BCCIMMj$bbbe{{; Gf*++y!!!:tEXXwtuuC[[ k@U$fYJB6`WUU̽=VWW :@KK DEEADD333TTTBQQ8NX[[iOEBBL&#$$1bcc ';;DBHH111#H-n>+XXXѣG;wN^hp/F\$1:: (JnܸAtt4?6֎nGT2oK/Dgg'匏’%Kⷿ-ӧOsI6nHII k֬sݼ Chh(>>>P]]MQQ,Xbx 0&& NGGEEE  n޼`z)aXd SNQ__ϙ3gxWazz 5ONNVٺu+?q͛Fa||q222xyy100@RRF:&'' Ϗ1/7?rss9vX'aXP*j?Iee%|FX\.–-[ x O/_,BGGGٵk6lUVa0o$##Y%ܹs\ %%":;;fѢE9r?񏤧fN>M__K.e֭Mpp0\.n7 P(p8F{<PTVVr5IKKs}oZfʕ'gffE? PRRڵkٷo---BLL l޼;wR^^. +3 09asWlzLА=fbbۍdrz=`n% \.zzzp8lfpp0q雚bjjJ vU$044$DCDD*񡯯ӉV%22a l[G.L&JRmj4tB͆Z&** ۍbh4 moo/~~~`ZAPZ2~CCC͚d``@d2T*e``@\f3SSSxyyPʘ!: ӉdˋnV+2A/r\JO Fj5Vnjh4fN˅`RxQr9044$#J%nG344D@@ :22Ąȫy뭷ؼy3LvqXVA[wE#7* ///NGHHccc"of* ( B]KBO Kt:E>ԝ;wP(t: VivgKEH"ٌvr9XVbw)$!!!bL&|||D@hhjnn&??g}Vu)IRz=QQQLLLGpp0~~~jvzzzp\d@066Ɲ;w0200& V;kVF#>>>"*J'2YR3WVj"\u???ܹbWОx<Rt~~r\T5A_N_\v15@y?09as"J P(d_62fUK9_D!RO9r\Tp09as_By\🆻~wX~,<ػYc}HMI=ٙ]RQO@9~k|>p\bTap8r=qJŭI{{zjsΝ; wuΝ;{Cww7YX,ܹs硞/F|d||s2_w:˖-{w{n-Z$Eii),^vEA[[Ǐ'33KKK)))! " NMMEdd#p88N9~8VYq\$44>-rrrZU ]ee%̛7n _{tuu1|z{{裏ŋ˙3g 11BvMMMV>=={O+++9x Lyy9X,CQQnYMDD=CR=t1;wpiRSSgE$''J ZZZxp055ݻ9z(7nܠ&RSSillDNtIDATQOF.v ɓDEEqnuȯ~+n߾Muuo7nܠ ȱc8vgϞ رczAWÞ={8y$ܹs(T*Mmm-ո\.L&'OD.n>cwK.q1/_\.Çsu g׮]r-Z-߿ׯu>55Ů](,,$<Lrr8pnV\Ill,:N}ʕG\\W^eժU=z+VVvGrJRRRl8pW^y+WpҼJ%G!))IMLLԩS\+WAAAdggKCC "997Xn:N\233gѢE9sBCC9qŬXٲe gɒ%x{{ߣvOuu5˗/ٳ #Wł/twwLYYj2zbb l6.J???Dhͅ ꢯX.^ș3g$>>:=JCCAAAM~~>'(,, r9хĉٽ{7fN'j[n Dj8x O}}=G(ܹjl2N>ͥKDFFR+++9~8UUU4q8 344d"''__G>SAy& ^=zk׮̒%K!>>Ryyy$( ߟx~m?>!!!|,]Mmm-cccfV^ӧDRaZ9y$\..]D~~>&V$88{f"##r7::~:::```@={׋x8~8[n%33'Oxhoo2}||Xr%gŔ㏳yfJKKijj͛,^p]FII 7Cdd$!!!í[Xz5ܸqŋsUˋ_|@j5pe ,F}}=G?bllǏٳg8qh6mڄlF.FCNNn:a7oŋINN7xK2<<G:;;Yf ͜={~•+Whoo+Wl2._h$''1 zjjj4IJf3?!++( IKKG?"??///n݊ngttF7+IVV>,J.]GYhwl۶u։4\oΓO>Ihh({!(({dsA͛0III SSSѣG)++Ŏ=Jmm-111 rYfn';;Krqd2MMMx{{ՅdbѢE;vm۶7xgx'~:b BBB/ 6rY)--eÆ |&u:̟?|FCDGGSSSw];F\\O<CCCh4~R׮]+䄟锕a6mĥK^k._̥KXf <Z&11%p/V $z::: 66oooܹMMMKoo/'ONGrr2QQQ̚/!!!\zDhh(%%%BAA c=$EEE_'88P*h4:;;`0jEj,ZǃNcrr~ﻤٳ򯭺+Wpu  … )++ϏOreڈرcfT*O=444μy(((cǎb |I1""^ȥ͛7Yv-W\arr"""8~8TTTzj"##)..󤧧*DiŦuύ78y$WF&q)N:ERR8'ĉW6|ʕ+ nE{{;oLJM6ΓO>Ixx8477SQQԲp:n:rss9{,CCClܸ48p8ouEECCCTTTfn{n֭[$''KQQN"((4N>ի^qILL ]sdx{{c4Yz5SSSy355EDDZt:z%K˅ ؾ}=c>db455Ԅ7It:~~~hZ]Ɗ+HOO)((@P+Krr2|rpLLLϺu "55 !ՙ \77bX?ؽ{7ƢjCCJJ K,ĉ⋳"++/^Lmm-Z_~˗/с//s144'Od߾}tuun:سg---d7CCC7oTVVڵkQ*QRRf###ZMGG!)%HVXAuu52Lt)**ȑ#|W^ys L̛7???Í7eǎ9rUVP<6vڅ ""ooo|||z-[FTTKIZ?%ޯӘfx<痢呟gs>nI&''E[)VS>UAe߾}>.d^g=ZBBBfttDdd$$E{P݁EZFMM N_&$$Eӟ+Vp-hhh,Jdd$/R0͢۷IOO祗^SoN]]NBTpݜ;w&&&0h4|||l1::Jzz:BZ,Yptww/d2 .dӦMLOO33堠 k ?ַ|2Gbb"yj*&'')// VK{{;It~<hx c֭=J||3ȥK줽b'nsy:;;T*o~TTTpMBBBHLLw͚5k0"FшeVg)tuV"##s!}Nck׊ypev;̂ DTN'`۶m~3-[ƾ}^WThZt:2 ™3gl6344 22ɄL&'$&&'O؈fߥ5in6$^.^\;%>K !!Ap&BBB(fbcc%..+وn݊w?#11Q)Z`DGG^^^_g9a FOO¡!FGG+?5e׮]466V1 ˌNcѢETTT[ojdjj>ëJWWׯ_g``8n7'Nl^}U.!77\֬YCQQ6lp`xxN'xNccc,Y{G@@lٲr"""x9{,dff0FN:ŷ-FFFx:TWWdǩgrr HrY.Q("MI\p!1===DGG* ZMzz ߳'BSOBUUK.kk&M)((r {xy/s6L,\PTf)fn:N!_KDfjJ%/_ŋr/vpasP(Fe>a-3͞bzzt^ɛ455%.SSS a4Bh4xp\__CR3)uttQn7>>>30mZ"4]TJ:N0ZMhh(cccLLLx$bNLLjq\ "˅uw``.12n&&&p8F|||x< k||\ݐ(F#tعs'?<jf\.Fn!u V% kv]i|f||R)r'&&Z8NANbY9>>\.b0==-)߼PT V6 ڵkq=$ͤbrrRWyp8BIw:sRDiT*ASܟ l6{)>fR {$z&''j "z!11M6188}9 i~r\8$Y1g3yxgJ⅔.t΍ṏxDT|jj V45==-dl68%Kt.RFtk79SY̻'3/ _f*ɘoLڵk466ToڴKfjjg266!==˗?\;Ć a4p>9n.^(Bg#""x^룠͆L&ct "p\hNQHOPHr(** 0?"W+WrPlذaVїI~hP__ϕ+W㩧z AAARG߾>.\BTf͚Gn7Ġj*y>9(Ìn櫆fe&h䫰Y=ZZ&~= x~g?{?9es>(ʟN`8qDEEկɓ8q;wLYY{ݻ)..FP ػw/XVdBz{{SZZʁz*P)T**,&>>AyYh}}}߿/299I\\ΝVgg'oFll,cccÇͥ$088ȁD^Ͼ}bx<>L^^Ǐ'((޽{)))!$$N>Mvv6G}Dbb'=55Zfpp'O2o<=Juu58pȭᣏ>b6EGu(++c?Vѣ\p"""8u999466(zG&g.]Ed BCCCp!|}}?ʗT=Bܥ*hZ^Tʑe˖I9t҅bdd={h"4s(,,$22RyxkԄ331vł r=MQ;&hs\I{dE~$H)oooN84p8 cxx$_vv6ぅf>d2 ^/7asEg>ϟ:::Ds=&~.\HOOvŋ1|N:Enn.$''L}}=cZo~l&))7or!>R㣏>ʕ+5qnr9tttv\3deeP(fC__'N ==}Vt{ӧx.\TTT`ZfCj5޽%KPZZ9pLMMOMM .d||O{{;/Byy9FFFǎCV3==͞={|2DFF`ʕ+CjC[UUEee%l6N:Ehh(կvՄ͑#GΦ*l6>|XtdGN:EYY+={j* ׮]СCCxx8|ƍ'3裏>BQXXHDDϒwӧO"dn=TTTOll,yyyl6(//p066޽{9pnݢRSS}67n %%Ea``{re뤤PPP@{{;'NSyƑ#GHHHxdBVvZN8Affhzqf3K,˴h@x Μ9Cii)o&c2xgppPL&0#::w}///zzzQj޼y,\>W6o̢Eؿ?{a``g}V(> R7۷N^uQ1}͚5ĩS ^clllVM{d07n>{°_ddd}'NC9y$eee8Nі-[HIICP /Omm-UUU\dW_}z{{~:jm۶۷j\z{/LAA^v¸|2 <  C( 3188HHH?r ~!/dff299:x .^Hii)Ooo/{{9lMoo/;v젪gϒH~~>---444ǡCODDCCC(Jz-L&7onjjjqd2\.TUUa2x稪$(,,LJ,b' DZ+o[Z-t:z{{Yx1 ߿;g}4v޽{cǎ nݢG(Jj5/_f߾}ttt?Ҹ[ZZ(i>>\vl͛an7՜;w4^J]]ݬ޺u NGZZ111dddyf?>r\^`ѢE<_iI)Rc\pcbbbDOr///tl߾1Λ7>#Ο?R^̙3[hX~=yyyW֭`0-"$$=L&c/]ĄGKK >(5:̟?dپ}= 233ikko+WdzZo}U233?>W^%99TCNN.K(#))V^ٳgq\X,`0\.^Dooo֬YjexxXУ?R VV%..+VK/4$E<>|233ˋW^yB#==r?N?:t?66mDoo/sfdffz,dddp ***8s 7o`0۷q\,X@`okk{`ddL6 A2tRdr<ٳX|楗^TRSSg={ѢEsN.\/"999[P<ى𼹹wvPT پ}RR}(*JAooo,XS#55bΝ444|e0GOUٿ?6mf}}=xX,LNN266Fhh~|}})++cժUk266Fvv6k-e6ٽ{7qqqlذ O#GsݷԩStwwoA(NWRUUիW)..FoK/o___D۪Uشi =p8~:(J^z%|}}&** ȼyx饗gpp3睚ʙ3g #..,p8XVV+Va၁bNeϞ=DEEp8 .^n߾ͩSxWEbmm-W^zj)5.Xn}}}!˱Z8WQCkk+2P]FJJ :HqqR*bj"Yz5j^O`` FxƇ`xxEPP~~~( 5".՘@faJE\\(JT* vMzz &xd2a4`zz@0((P4->55gy2d2/۷Q딖2==nht:* Z}㣂 fbbHhh(zPF\.fRp\l6_ F355%R H@hh(Ah4!088Hxx8AcrrRp_#V%<<(> b``@)gnXd kHzz:Yl\~F (,,fͳ>Kpp0]]]jחJ222x7 >1⋴p1r9jӧajj1J%FȁI,YBhh(ccci;Nb v؁babbgk4'))go}{P[[Khh(lt\,_![9>>jg,Ny%~ͫdf$1@'k׮t ) fqZ[[ioo… x<^}U~[ $!!AtrJ&''hmmm0g?(G\]SS2 ___/L||~7]cbbjlݺ?'+Vtvv4@"E^MLLۋ۶mW^!**D~ӟn:>,%)jbb,gttE``דO>IRRǏ ܹ#$G#>(Xj/cccLNNjw`0fp&PTT$RbbbD|f!66W^y ~N\\ h{].'///m&0?|jijj}_u&&&ۛ%KPSS[o+W\믿Nww7EEEtww3|Z[[ٿ?#''/s(((`x{{O|\.vx{{' .`2ؿ?>}gyR%22gX,j5K,s111Aff&;wb4gHyN>Myy9ׯpZZZ8y$o&fYxv4 =;Oxx8gΜCHHaaa枘B 66V(WBOOB޽)^{oz=~.\x/|r.]DRRYYYX,t:x"O>$?O@VtR  /ܣl6Μ9Cff&qFQ\ptg޼yt@XX&IDkL& jL?F???>Lff&W\~~~f}4 )))LXX+W?&,,UVl2-[ƹsLד!88NBrjEɓ'yYhyyy?ghZϏxΜ9asZZZh4,Zz{{1FEcc#/ǎ*Z___tAAA_8zCee%̛7˗sI9 ( FDKKqqh4"ˋpnʭ[%Ϝeqyd2W&)) oooT(⇯/---˩SXz@K~J.]J^^eee,_06mڄF)<ԩS477sy6oLCC>FCnn./uuuܾ}֭[INNfÆ bZIIIaʕ|<rQd2;v`zz<Ν;7066F]]6_yKbb"yyyl޼kׇ`LJE  ???fJ;z)Ν;'j3x{{vZ}6k֬h4ΊȒd"''CDDQQQ???lµk?~J|}}ٰa`7LNNc0jHJJbܼyE-|RvfLj;FaaPN8oPjbbbxq9rRϏD<0`Jߟ'xbF#/2YYY€3ψqJrnzocXx h4Rgŋ"bbVv% $,, NN;F'OvYv-ߟT*gϞߟ˗399)"LV\)֐Bh4P(0 h4j5`Y|91BggKRR 0rRɾ}AOri!|||X~ZtX[M@kk+/^pdXr< Ϸn:k<,HMMeӦMܼygp΀aZd2ˋNrܹsܼye˖z/xras:!3 'yIOOgtt*.ezzZl6FGGr122Zǃlt t:T*LMM"S".%'/zhhHYfCATf)l||\h4 #VJªp8p8P0KVTrx+U.t:Ś9Irhv/-^f򣣣FCtt4xyynۍR-///\`h4\.Gvk000!1XT]p80B>Hϑ" $mۅ,O '=~u\"CTzyyVߕ TIml60H t:^J???Q`ooo*)1>>.Bh%9+k.al"L&jr39)z~?;xyy1<<,"E3{rrR(/t:XsҳIUSSSnG3)C&1>>^{urrR|ǬYh!n0tM4ZYe$///O2J4G3HbbbB`T*ccc^#*`ZjsOHv|gڵ8=z5MAQQh-R)((ʕ+hkky>9(Ì~l6fX,k)l/}vgallL& Un}ӐwA*!=Wj%4s=}+}Osg٨ai*x!~kt΢3?Y͙߹=)8Njjjp8S###"a`٨L222BKK =,<MMM?v;uuu_I[xݴl6SWW7K\BCC( (}&A[6nQDJwe3RA& 3'}H?\ג<:SoG̔3t:E!Ǚ$T\PT`K^?R\)f~ zyK2Hn ~IjyǙsISݝ4INûu7=vt"a_ҳfcq}53755%ug$477SPP@ee#+_fWZsMccXߤ%~ߏw5kΒ<J 0oGL&vpp0gΜɓܺuHѪ__dDGGsa"55KEEqqqtuu"~~~9rK.Grr2r\(ܼyR\\*155JBRq rrr >>A~mXt)===۷|FGGILLܹs{L&Q즭"!!Q~_R]]-:tgFrr(Ǟ={vh9g?ҥK8z(ΝÄ000}())m|N8Ann.cccsAΟ?O[[)))  p2228p{n0 lf׮],_\T^SNt:8p+Wヷ7ǎŋtwwIvv6ODZ-Dk>BU˝;wHOOg޽ aB7%nىJѣ$''T*ťCPPUUEaa!K,rR`gf}xb^n*ezzZ9ܝ']T/E 4ݻwh"D?p8p:x{{sIV+fk."""'44T'N ˉy3+]d2;w$,,LYݏRϓ0{uuu\~{h#:!.iy뭷hmmeɒ%{nadggG]]\p={$MNN_LJJ >|f⨯g׮]ܼyHf3;wիX,MZk\NQQʼnK:z( B-{Oݍ^!gF7!//JILLٳQ__ϻ۷E}o>nݺEmmUUU&000]z*v HKK#??F(//gɒ%bNҚz*ri9wn{VZY*8pSQQAuu5deeqAΜ9CGG7oDP޽{<8uUUUV|,_r8={}6$&&*.]({졨6HMM͛qIYx1D`Xصk׮]Μ9h@PZZʯkuvN8d߹u儆r:DVVTVV255Edd$Cш.wrMqW? 8|0tvv穬ˋ~Oii)HQ|׮]reѾnʍ?iK♟NHOOuƾ;b\Ǔf?rX,߿={P^^NMM 555QVVFII }}}|\v&&&|2#GhjjTq1x(|<)++CppRQ__Ͼ}ػw/%%% smn7.\ 775kPUU??޽{ͥRחI]+ݐa/^ڵk裏())!22K.100l*ܼy\^un޼I~~>JPbbb(**bժU]bћzf8(,,… _ʕ+y'xw}rn7_|o[֮]ˊ+(//흦g|| aLXz5iiihZz)J%ʪUHJJ j*E_7XV [g~i9y$k׮ҥK}6mmm( VXdĉl6֬Y m"e2fJKKq\Wre 7nD_#""@TF`dd|rPdeeSOqΜ9Cdd$z˗s {1X,>|’%Kz*---055EEE~~~l޼ .PUUŷ-ZZZhnn&((g}^2(^|Ebcco@T2>>΢EXp!;w__ο˿e/^ٹs'bHgbqq1~!CCC\~V{1z{{ '++lجTl%<<_ %%%|G?M/~ ~'G?==6twwsmT*wܡz~tܺu;w2<<̷-gťKgddD݄OΰY0DEEӟWk.^yۅ3?!hll;.\֭[?>&ѿ[fhh^z*.^HJJE}}='N$JsCP[oa2زehY PWW͛7JR%ˎ;dĞ}Ν;b099I{{=a^uL&op Y|9 ۷IIIۿ/"iiiٳ;w222k68P^^wVERqU>CHnn.s ?4,XN>/'? Gl6=կ~ƍYr%### S]]MKK %%%144/LRR\9 RVVbaŊ*]@@&@p\ &7or bccQThZl6 D&˿d2vIIIARg'Ƃ`޼yLAAAAA$%%+`׮]d2¨#,,Lv6$'ODT2kJ*"##&44*蠥V+`jjJ/""b@FQQaaas5BBBhll뤥q%^ۛ˗/s!00BAKK ˗/}IHH@c2hkkˋx 0v fhhr:::0}!$$+V'_ZseZ9oͶmHKKp&""_| {9ӹy&477c4gѵQY~=AAAܸq-[DEEuVd2o&??_xp\$''}v 9s _~JfQGNMMrD^<͌Ͷmp055Ň~Itt4W^̙3n:rss&JJJDVoQQQ.=== NLL k֬ӧOΖ-[ettCCC cQ oTTUVExx8ŢE #++/RWWGoo/k֬A.300@WW SNQQQf#..X %`DBB$%%i&/_NXX ,Vyq撒۷spp!X,r\xtx<NCѠVſ*III Ν;^ 67nٳ8&''!33S+5L& N'\BX,AVQT( ?><(rJ/˖-:<ַ(**}Х&2+WIFF.Xh{СCLOO/RRR¢Eߟu֑drr̒%Kt¸3slZfvQ(rz{{yw"99YCqի|2;vեExܿ?mmm_۷oxW`0HII w獵I{Z[[yƍDZ,^իW{KDDͣrΝ; F222jBIMNNΪ> Z?-Y|pyvI\\>>>bH{a픖2|f={ҥDDDR䥗^`Fg|f/F~ml6d2sBAZZ)))TVVϢ\.GѠT*h4ŢEbarr挜 zcc#`˖-s-ϧP@a6@&'2֮]˷m! _~YXV v"--5k|UUUqqo.,RΐuQxP("\T c,--+WPTTVe>ŋ)))7D311d2l2֯_O{{Kf۹qVBP}vL&8IKKc۶mLMM144ŋ)++7޸oTΜ9d"..,EfƍFQ_ Gl+`6͛͛7EXKHOOgxx{"<"GsڵR-˱X,v&&&~s<mmmrBCCv)))x{{c2%VRnJȳbƍh4T*ިT*8uLMM z^shш`uPTBёhd׮]̟?}ɳb0 ϏIʠDNJ%t:Yn#=UC&N9>>> 4=V\.gzzZjbX0jJv:(_z{{p\PPP@jj*fAI>Vx ,\}{ȩ`^y8txjj,팏T*\.zj"##s4D?)϶Y ׮]wqJ4Gll,/ooo^z%oJ "66VD8N.]L&ƍz|||}6{+񱥥L]\\ϐ (KyvWUUB~~>TWWSRR"d$V+/^V.^f'?'>>~=/_.z^O}}=N!UdGc」㺮<ݯrDH 0 @Q"%$[cvu{7yq{7o:LGm[eERH9 9G"g BIQEt,ꆳϹ>g?c.]@#dywt:/!F BEE8FGGGY~=`Ixя~DVVg?'o0T*"sssynn.?OHNNuEn;"g7^7 QTTyyy^G?yyyHHH<6O>ϣP(ԩSz֬YCWWٰa`w}Z~8<[? ///ϟի|>r9O=nX(b߾}XVN:J"::C͙3gHKKȑ#,^Cw^jkkiiiabb ׸nٸq#ccc:u #3gΰyfeǎtuuhD'4 i#&l`bbdjd2#>>}QRR"c6xTٺu+>IIIl۶ 6~z.]D\\c0غu+ndwEl:~9ud$$$ILLDTb4 ,]3g}vf3O(Z(fZ[[kr!>cj5$q%66t]ҥKillb9ɤ$d2111F222سgדJ`0uG}|X~+?B׮]#==(=JIIl6"..N,Oڵk9qlٲTٳ g>..Q=J?Ogbbbbp\j>w:;;ihhϒSO=ťKx<,]-[oVټy3)))|( ^z%^QTT$vq:dffRPP1͘L&|>tRN>ͮ]xL6n(*0&@ӱo>f3111>^moOz)_444`2سg؏ 7#**nߢ=HLLDVAZZ>,<#bdF!%%;$&&hARf1RbǎGӑ@nn.UUU9rh6mڄG}TܩW*$&&P(wh^/)))$''e{=ɡ.qa+Wm2߰mt:{=L&qqqر'N`4`0a:::dڵ$%%c^ɭ qY|>DHMMBϟyMu:dggSOLqq1 l!| 8h4Ѭ){Nhرcİ~zm?Rfd2q\ d].JE8puHI(N'H(%v?Be8FR(볰X,)\K]шy` ɴ@`0//~_a"A(**P($:;N0FQ8V{AT*NP4⮭j2P*X,^WO&&&B"\.' kNJB. B!K ygILLr1==M$A.(FiZH'*@ՊTJZĄ8.z=f׻~_\"M#_?|b4n3ߞ!_P<;PRRBNNN"΃PPBVӉyB_ Q3>OM(WZf||\b0 f1ZiMgJxN$;z^k I;!rGTU!""x nz.o||>߂(.πL&a3 πcttT7=ؖsR믿K/$ SiƨW7>7yrrx.B!G{o Cp= axϓ144$j؅)dsпJ;_7Dpd$P[[+űm۶;^l~zRRR_زe˂o"t p8̕+Wdܳg}jjJ qdlܸ7aFGG]Qȋ{j fxxH$"ޮWM$E TWWMnETTT0::L&#%%M6=p/A,..[q$S  z(YNMMqeBJuݓg 0<so!F>AiNyۍ%::K9PhAhݷoKK\ɝ\GX,BAjs$>&!!!!!!!! lw[(p(sǾ B>7=dVh4v JB~ q_JEf~nķA;p7@ G($-D"<.kPVB!N(uѷp8D"nQ H8F5Dׄ)Ӊng^QAlD% 4`c+cnnH4`û{ZUr8l'B)o՟w揁罕=FX,' Q r xŝ{ ,!bA9~8ǎtf3_ r,{=N/vEur)jjjb+?ŋLMMdΜ9??Bjj*׮]?D~~> ===İ~JKKbҥ0b=w}? 6p!Ν;LJ~HJJ ccc|\zLtt4ܹsͱh"N<ɹshnn&??V+eOOOj*}](**⭷"11QTIU(R\\@0N 8tDEEq!.^H?9r3gH~~>:>~_PPP@(7ߤ\TQt:h1V\oll6߷:NQ_Ƚޘ',؇:Y _0SSSh49\.'!!A z=⭷b˖-\zNZ[[ywijjbnn%K_;x78$,$!!!!!!!b|(6oƲm6ZZZp\,[ǏCzz:rK./ſܹsT*Μ9Ï~#vZ-+V[reh4lڴ X 6n܈㡡͛7߱]V֭[@Tj*4 lݺZҥKYd `ƍdeeCBBٸ\.9+W$ ?NQQ,6lCXd qqqR\\L~~>ѤQYYɆ 0Gss3=1>,111\pRɱcXnb-nKXf qqqbu:ǎ#33+W`Yh}Q._>|Qګwz=6l P]]?Ntt4TTT#xbJJJ8{X'СC n:Z[[|{wa[:NB*++YxM5%N o6(JJKKȠrZ[[x"62.]455ą l\z@Ç322Bff}]t2AR|nm6sssRTTɓ'yGű#YF<륺z{{`04 TWWm۶!!!!!!!!mnۆ'$$0::`͚5K5kX,f3144D8fѢEddd033Cbb"555>|ld۶m a7|>)))k$&&G$BALLzL&UUU^wJKKINN&''@ Ex᷿-HXhuZ| *=IDATr\-v\NCCdddh"^JCC### 077B?f5rsssor2RSSIKKʕ+$%%Emm-344`{}u`6tttPRRL&CףVGO[[<Ν;GBByyyAҘ!羑H$B||<%%%>`0{:@ |B`bb\\ŋ'77z5k ())P__ϖ-[HJJⷿ-P1222'|rfo>p,];v@TKEEj^x<(++e˖qΟ?dbtJfvIBBMMMݻŋcARKkk+}}}nv-~]~.^H0vc4)//'77"~m$''c Bl۶ ȥK駟^ >}D, +W$))6{1jjjt! !}xx˗/ Yb˗/qFΞ=^Zbν&##كR#30 \|D1EC1?}||h6nHSSFذa(JqQG2<]]]a,Y"KHHHHHHH|MfۦB1u|VO,) q'ZՊR)֐|at:+T /nM||<@@ TT_bAa0z2pmǃL&CPRDen\^6  Q(a^/2 N'ON##Q(xA]`zj15 jr|>`pY,zX= T*2L'&&EVQ*al*NC*80>>Nrr2X]{-sF# jű&< qINܽrx_0 }ps$&T;! J7odnnZMllH۾V]NBX-V\.NV׽qFc}VVIyo}n[u|;(ʛQT.p>oB&-|+[?nu7l5ߞO¿ ׿r8"ڵm8D T?vճwc3:HHHHHHHHH< _MB΅c E&p8ph4otQ,bnnP("LvӮ,8#??_<? o7iMz$AR޼ܴE# o͋nN'ƉRNB<!Ml6yL&rzz . q_y>Jz Jۖ}{NAAG"Q@r~o)!!!!!!!! /m^/V˵n(Zl6O$ann& S255%Y݈pι/xZb`0V8fnnQH0;;,Q8tl6SSSbj6VVUr8b[MMM6D"mXVzCA+|>/o,xzhK0 nXV$`l(q\cp\y^7,Y[[SSSbzexxnQlP[N¼p8v oYf-11Ǐsi\Bjj*qqqLNN?J,~mΟ?OWW\xO>Z233wߥN_188H0$;;LZuu5 Z- ˍ`͆V$%%;r\p|ŋdѢErҎuY7ߤ\΢EĪ@믿ٳgٲedC )v[=))m۶ڊ률cǎ122Bzz:oprEoo/nNGaa!,^Wi&0L h6mڄ륱͛7߱]V֭[BRQ\\`[(**bɒ%S&''Yv-mmma^~ey~y(((<[[:}}}wRӧȠ˗/ȕ+W#//OD"={g@bb"/^djjJN8YYYfz~dEzz:l6z-qxrr:IOOSNQ__OBBxo3}ϣ>ʡCɓx^.^Ț5kHHH-[<%$$$$$$$$nnۆf]`\rϊ+ݷ1͌DHNN&--Ybccѣs=n^cnnL&v;>B{lxNŋn*++^xJ%Ne˖3ϐIHHpҥ~`|q8'--@ ߱qFZ- o>u裏xgIKKڵktwwSZZJYY* 8J%.tss3۶mhii!~zlMpo5kXr]7ʕ+;v^xAn7o6@g}V r}>444P^^NEE6mbӦMX,^z Vb󑕕Œ%K(**bzz`0(^_WwRRR3I||<===\.&>J/_q\“O>ɺuP(<#y, >,/z $%%177GQQ#P__^p8Lbb=k.$a͚5PZZʒ%KX~=gΜaxxlV^-j z ٻw/ZݎV%-- ĕ+WHHHS4zu1[n%::GAAT*rss)//d2b }%qOJJ.v-:/駟ߏaٲe>B&]fD`L&/_`0H(k ;fL&# Q*GPU*J.`NjjpX,wuX,t:d22 B!^KmD"JRlC8U PTD"d2Q-߅ ; PbX,z yQ88ۍ"!!qT*ű&Vo 0&揳 bccŅA ߫hHqd \gg'ǃ#8|fƠBUgA o4Yx1 bAl(#"0f\.< d~?0&a<)!!!!!!!!044$nBj{n)[:m_oU3ƿot?Ohsek4Y:ny{ow`1~oa8-5Nƣ`>2LH$ F& 05ne;-/8B[L|̿:*v9@BBBBBBBBM;VFjjWw2-yN'* F!mju_p8,/_(upO[P(r_xW󛄄Ã[k/.Qvxޭ!Z-+L&C}sȿ,% /"111l'8ga˅󛄄ÁL&q qBp!^mi~)<ʞBh|m{5IHHHHHHHH<<(/r166쬸Db&w(brrYVIvg||[{|>&&&X,_Aq8SSSߡP"뻙333v"6eτ LMM1<<,03==>O+^>` AP + unK.}5%7?Ēa1)'\WW>7D__n[>.VV/|~[ 8u\br}HW^ݲM>+W,x%$$$$$$$$gYKLLĉ\x˗/LBB@Vo[***hmmR;Fuu5-?fV+999|TVVe ł2k?~˗/#ξ ƔJ%~)唗n7 ---022'|Bee%r^yRSSIOO_,[ cXPTFfѢE:tJUUDGG?q|[;f~?MMM<Fimme,_͛7s0L;v Nqq1˼;^ɴKMM 155Eoo/LMMz__p駟ӃRٳdddN}}=K.ѣX}r8}4nXjjjHHH`zzhqL;wwy]FYY$$$~|>*.ygppxbPUUEnnNVwЏ9BTT?<999pq8r⣏>r9^/YYYL& x__cZl6s~?III8qZZ[[IMM?piG%**,4 ]]]gttJũS0L̙3rq:?$v;刺Huu5Ôr$$$$$$$$$w6=**VN'6má,YcvvVM3LLMMORRBӧIMMejj Cff&f`` &&&hmm'kL&jkk^`RFgΜt:݂]'NFRRn rx7]R񏌌gbn)";;T-[ƹs|2ӌ IKK㣏>˗/qF²Z--ŋΥKHMMf222ʕ+e`/ SSS477}vbbb!??R`̒%K8y$III ccc;vQ1%/X 0>>~3,Y"֮޵kUUUX#z1 tR|, `%?l6l6z"^xbccxaƍdggfVZEBBiii444t:)**'66V\؉bhhRK/RAwt:t4lOKuu9nѮJrh{!/\VNZCjB\P(ݻbppLfffpKgg'gϞeɒ%?~gyK.'d( ^/>VnC QQQt:i|HHHHHHHHg'$$p!`0ORRRlM6t:9w˖-l6sYJ%{!99Fz{{ٶm6mbnn/tRJJJnA/++Ӊ!//$z+ >#v;###$&& ㏙_nϜ9#:/ZfΝlܸFöm|tttSO B I[[2UVQ]]M?< |r(((np8ضm >ˉC`'''|2<<c= ]e$$$022O?MNN^r9⢋4buc~{yy9\.<fR[[Kqq1>|(<䓬_N#<^̰w^NVl6r'PTTR$==BYf 3,DR|N'QQQx^1$55&HJJ"))j\.yyyzŝ 6h 55BAff&2BΊaBhdz`0PRRl2v;˗/fl:2?ĽǏ#^j^:: $%$$r Uo<`bbXq!e$a||䛞ϤL&ֆ#MzzM{:pyNmHBcN\.XU?,;#"?[/,vI̍s߭Ʃ0Ol?>/n7x܍tv_"JHHHHHHH<x(ou"W"%b^W(+T*q8ߚA!7v377m'wr9JS;qd,^xNw? ̩`@ }>%$$$$$$$$}QH$F!11+!_AX,hZFEX؝MDH~D"V[ENLL*arz_j~xx6i;EY'I/6nav |PyBO ܫMBBBBBBBBA.a3UMGoZ èj\.(J4 @Q|>zH$ĄX344j Tn7cccn;EP3Wl6 z|>B!t:` V+ZRfczzF@Xnjj ZM(bddi4SSS "333LNNRP*LNN277` B8NSlfdd`0`+|͡~Z9|>Yd2&/^$33q櫸{<p\bZJbff d2^jezzN't8赵b Ap8>St:1LT+p8P*8N ttt ˹v)))=~nnJjIp8be>ˆD"|~'p|p8Luu5P(Ri.tZ\BBBBBBBs7*uO>MUU/^$>>$?q^{5ihhSNQZZJuu5)))tww8?*>Syp9 ,^ 8JGR[[ŋro֭[رcΊ+(++W,ZF~_PXX A`08r TVVRXX(Q0 |'T*)++w} :::8s b z|>A^{5N8#n';;U( r| ӉjET 7p\8N^{5t:f uuu Q*X,N8dXDW^y^OttXp`ZŚ񳳳 1U0A?tpHIItbQ*fɓfӁ?,l6Z-PI15pp8ECd2SSSqOTz-^/  GԀ$$$bzzZfggK`JHHHHHHH|]yرFïkXl.]"))P(Dgg'難UUUHZZ鴴sYL&faN8A{{;O=6\.gEV }v^x;F8&55U_O^׺Tőd_&_jb6D"|駸\.rssh4K/#$?󌎎211ANNկx饗X,9sMcc#۶m󑫪h4e"x<:::p\D"zzzp:wC&Rرc}~{߻/bժU[3gƮ]Xn~)===(J^xr9w0 bp8Lss3ݻ#۷o!y BՑBqeѹ_d2?#Ouu5fbjkkyett|;CCCEww7zZMEEVBT222BGGSYYɟɟv#sN0Ln1߿BALL ;voo(..j=TV~VXs=NӧOB`Ϟ=T*ZZZزexlUUeeecQVVf# w}@(bƍ 2::JAAصkͨT*&&&Xr%===\.rrrvkYl333qUHMMfddիW B={^φ TTTCvv6/҃ -kxزe Ν# CQ6 @LLhhkkҥKb @ իW)))uZ-ݕs.r j5kVpRJĉqЊ rssINNf՜9s .`ZD&QPPbMΡF!## .ƢEx"iiitvvFrr2ȏc󩬬|0.j Ν;|ϝ;Gbb";v$p8066'|Ga# q}]x<!ٟ"\ ŋ<O 7y'Xv-}v8v8Nyؿ?v͛7dv%. F\r N jkkIMMevv y$%%??gd26o/LOO.!!!!!!!!q3,.\Çٹs'& (eee\z LOOSPPFfÆ tGG~e˖_n܉'8{,O?mpY~_Rزe pۍnPWW%==L<.wy!v܉B`xxE~~> $&&z B͉(.Vl۶7Yz5999ddd"n.\@}}====7{ҥ9srrr8~8K,!&&(wKJJ sss333CTTԃ_n^}U֮]KNNsssl6-Z0RSSݻ."--={`4'))i5Z-2 &:` .]ʹs]DA^6D"L& QQQLOOcZ|bH-kgggp8,:2LWvbff#G@&o4팍DPzq!J8Fd26mC֯_h+T*"6 ӹ``bbd2p1qTRa0P*b@N(l6ţ>͛#V+ QDR9L8fddt1=c0 `XĴ $o~ԏB>3=!!ӧOBkQQQ<(.]ʕ+ٶm \x^ݻIKK~oNvv6dgg+W-hMB\.ILL$ qQJ.s0RSSCKK 6,|I6nHTT[n駟Ǯ]0͜>}p80 Yz5 {nbcc9|0n,YqF s=Gvv66J6lyGXll۶ J%[Rjl<$$$`xꩧSr9/j244FaΝ_9tuu%bcc9vMMMlܸ|Μ9gddTx 6l@ttpv;?.,!ԄRFCZZLOOzjiQ ~0/&--.HNN&--z z=tvvhXv-FW*H(JRSScccŜXV^MTTc2ؼy3cccSRRBAAnN')))8 sgggillRRR&==6n܈륭 V˪U0d2RSSe˖ŋIIIa81 CT|rPլ[l6 /&++bbbHHHRVV8k׮eժUv~]f sss,^JE}}=7nnSYYh$**xx<-r792&{^/_\߽D"dT>? ۍ亷bou5ο?ỷ[}Y߿ouϳgۍϵѭaQ_][|bbXq﫶+|#墱C$!??}>?wr4. ϲ}~o{'owҘ344$nB߈P+66vxm QV孎wr!v߿{?ݟǝĝ/j[=J[Bq1}m]ƾfv~Ͼl~u󊄄Ľ;Ey ¿J2QBntrp8ߚCkSI(p8$P|R&.~?ϱsm$$$$$$$$>M!AƿHBx<ETd2 ol!~S&mIII]%^"L^o)!!!!!!!!d2EP~ɾj@.#˿pg=ƽ}8zPα A1&?n>S=11 ~e}"ZN?JN璘KTTp!? Pp000 ** 9(BZfjjABF@шghh)t:jiFGGji0dxxVK(W^gttQHD,qVQT033d"VF#*vsssfhh˅dB./PqhxxH$UUUdeeWg/ D"~Ν;Gnn.rp8LEE/_&##CTsr"Z|wI?sssXdbbZF`f+B`hhYŇt TVVt:Eh4v\:u Ƿl?ŋ"SYYFsmEotLOOh|X,F#NsSɓ'E/t:f?7p8nR pՊN:0448?ZVv300,FQxv\ 15(--%// JVB`vv~j5jSNQUUҥKEi|6/:u4}`ÁZĈB4XV%11.XsU"LOO3==-o*uppp8hpߏnh4 YoppÁdvߏL&[ 3>>ΛoI\\zl˜w~mضm9sVXj7!55 jkk?RTTf׿R8u픕QXX(l455~l6& ѣGy)))AVsU:::xwΦ2Øf~ߊ/Cqqq-Np8LVV b~)(P*FfaZ B~P*T*V`0P(ZLLLh H$‘#G8}4vA9}4B! Jٴi>I.^F!'';Aohh*\r\B~~>/^ϳd.\3gD" ؿ?⩧dbb2jBph)4 J1fÇm ]pCCC\|-[,pTl68p׋'ngttZMYYVh@   R_WpqV+ są: $*ÌIMMe||\tn7Vz= |G,^ԔX!`XA.c;1 B!V+ǎzVZEgg'\pNnҥK\zƲep:_5ͬ_tuuQUUErrX… űb yW ¥Kffft^}UgժUT*ٰaj|M昞&##f:㺫7|B?:ϓ$:NՊBR166`0rZXVJ%D"t:nMꯃ"d$d2F׋F`0Hnn.###twwS__L&ԩS:u ^$''#Ea gϞRq:TTTPUU FSNB{{;+LLLI?:Ӭ]vAZ[[ٽ{7ütttuVFFF8y$---RXXOcc#UUUdffFii)˗/'::A?rA[SO=J˗/E$sTVVȿw****HKK#))z{{z(JO|7]wڵlڴGwWƐٳB266c= /#Gä''+zٱchhh ''`0ZF.V!::_~YD"=zۍF`0w]h4%ddd\N8K/bܹs|>ZZZزe &I {V(^v;OF~~>@n9uv7!=="h4B!+Bvv6deeaYz5˗/z ?я^7ߐjӧZ1/_fڵT*h4444t/ǫWfűa\v }vzD"T*hiitb6룿B' ]޽ɹsj\z FEE?' |2UUUrVZ ,Zшd炱1h4CXz5NOGG^~vOSFFFկ~cŊRQQׯgՔR__O8ҥK h|'?|zՁ(6l@LXbΝ;Gcc#B! ,Zhf +W)ZQ]?==m۶QUUE__Z N>#??B]Gj*+XZVJKKq:<455ͮ]wqijj"&&EJJ v8z(Hw]-Z$ĉdgg`0ѣ\pϓO>h[LƑ#Gezz̳>KLL 555?SNhp:?Y|9V]vs!2>>NII ###444Gzz:Joo/z(  111T* yYC/^̳>˕+WHKKϸvo6x:rW^^v%$$$$jnVr @[r IIIp803N'GEEa2x<PWWGtt4HYΝ;Z厄Zv~nJzq^T/_JѣGٱc111( 1_O?%11Nf#++??%..7|M$O?eժUdffw̬V+999űo>q+WGbb"6lԩS;wݎjEVvZ:n?)(n6m?O$?!HZˉb͑\#4 Z{cى G?'DZh4ٳUVSOQ*={ʕ+(((`۶mL&1ɓ<$&&-[pqJT*r)v܉ZFP°5$$$$$$&n렟>}#G㏣jEzbbbi/_^իalWf׮]ۋdbjj677kn:n8t/^djB,V@Q\\L8fnn͆bt"룡A2 qݼ댍m61/zٲe t:PHjD477yf͛1]ŋ*~\._ DD "j4j5@@ Qfnn^<& FFAӉDžB!∍%33|;bh*\w(--ehhz1SȭJE"9>>b`llq1W~K罵W_}5k֐,F?۷ z|>HՊb,ED"b8ViXabbY]v_H$Bbb"<`2cll #Zd)))DGGn:~ibccdrr߿`HVc9ptvvJbhhtB2P(LLL0::nG.c‹-&rrrv )Dc6y'Yn/^u糮vv ߏhDVjE] !]cvv$L&K.wZx~!Abvv@Rzj~?r|>Z4<pr۱X,ܹf3ŷaffՊ磫_WXTRRRX,477cXHOOilvv~i^/cccgSSS477LSS?88HSSMMM477355f㣏>ʕ+Y UVQZZJoo/---bA1EA)gxxJ]$.\kZg׮]XbAVXAEE===ׇZw?pRITTLNNh7'p\yBcbb_f Efr>cZt.h0GA, 6 ݎbϻl2Q7KHHHHH<,|fzBB/_v311dGTV^Mqq1r*֭[ǦMHNNΝ;Ƞav5kUVvZE@ȻllldttT̃ͽ /Ϝ9Eۚ LMMK}}=׮]tٰalٲ`0ȩSeݘL&QlllLP*^v&''ٳgќ8qݎ!?? axxJRRRؽ{7njkkٺu+999bڵkY~tFC~~>===466"DՒ!==VKVViiix^jjjXv-W&G  99֭[|_j5/T*ą!RI[[FUVaXĴ!ܺIfp:~)--[xb***B8(J{9Ξ=++((#+t:111b`Ir9333~r9deeSnITTӔVyYbJ"//OZZk֬)233Yb---n222XtxJټy3K.%n:IMMeʕx^i&N'CRRf@ @~~>?A$N׋qEEEp8ظq#/&))N(gZl޽ @jj**`ʕ`xg1eLNN266O8{7훞p,"!!!!!7odnnN x_H$r`FBL&9Æ}c$`6 A_~_~U?7^__75&&p8th.W1nff3w yTkZ?h<~"D'y=[BBBBBq]LIIJoŲPw{)z_nnWn!^/3NANDHATT=wD}d|>e^(',HHHHHHH|=d̠jz$K|7/'$$|)}zzZ7 otNL@C^K| hKo&|Q;AY'C^_\^au-R<6q{2#oZHR%o$H$" ̯➘x^I8f``@lZBP`0ztttrRd׮]c||(T*###}*tuuawfVڵkq\tuuq5FFF{O,&[oo/:`0H[[D"FXIT.D" ۋZFfp8Lgg'}}}LNNeZDGGP(GLL ^N1 T܃ DEE199h42>>\._#<77ѣG{`_*v]'фa]АXbjdd^d2`PTWT 288(Dv)++[P{~#D"bT*X2IL&q$&;;uOO_2\/h4\|YSSS( E ;bh}755% sU0dffa>cbbb9Sw&Dp.]"pr9ϟgttY;FBBLLLRdzznj-g``Hss3cccb8\fA 9ro\ݍBk׮ K000{Gnn..:oVLFzz:|mmm233h4nj56^{ꫯRWWGqq1կ_:tdXN̍eꨩaff,jjj… PQQA?gΜ!''LUUWEqq1>BSSWE ,\rE,GU Ys΢Vfllz ˥K(,, IKK[$555q1~i"SSSvF#sssb8 z~A~ԔX39 /PRKPr 4200@GG[e``IF#* F__`ǏS__/jx^z=vw'x< }nn^ %K)p88{,UUU299Ibb"o$qIZZZjZP*rl6:&^3 [LLLIJe˘A155jcݺuTUUhG2==ͥKdttd^}U&''bŊD"z{{|L&8~8@`0onŋsIbcc{gh4399IMM ٜ9sL(zj\.hyD"nbbbX,LMMxrj/)ua~, 111P]]Mqq(p688bۋ%** j*nh r )**"11QOD"qʕ+tttk.B}}}d2z=ccc P(?h4L&^/:ł\.b099I$q?3hAD *6DS^;ݍ}o;9o6'9b5(JH {A#DJ%:G4[~O{NFGGdT*^Cpx<իdggh֝feeZSSSjvl63??/\`R\ 8{N#ǃn ^EHHoMgg'===l6^/f``\^yƨ!==;wp-kGzz:/333Ԑ˗innH8}4cccB^xyԩSq \tY/3??O{{pTWWEee%ttt J ֭[<LOOkqa(CK7)++BArr2/_&$$<CCC_8NZZZ~F H\. ,//p8G?ɓ@]YYajj[~~॥477(..&::~vލFxnݺΝ;cbb8RSS\N^^!!!IMMh4RPP@nn.7oޤHKvHKK`0Iss3[nEՒATT=zgrqqR (+`@ѐBAuu5}HϩSXZZdΞ=L&޾r͛X,w^BBBhhh`aa#GP\\Laa!"ɨ@&Q\\2{'ORZZVjVq8KQ\\H Hy7 %%% kFBBdggDII :&A---\.r9ND0N'J/b2'66{Y>C !HHLL@ ;Cww7B… ,@SS파`0xWYZZ144Bʕ+X\\*q V˙3g0Lӧ,rss 赵TTT |$HR񰴴Dee%FXҨBۋRboP(CVs%6n;#\.ghh"(JO . Ν;DEEQUUErr2}}}BԐ [lSNP(X,g?DDDPQQ8MMM=I{{;i/|DEEjkk"&&4FFFX,9hZܹ㡡H~~FTT'),,$""Ott4_r9 n޼ZJ0jjjHIIfgga||VK}}=tttkM}}=455Iee%`$ 24#j2;; iii={ViiitwwOuujvjjj(--W^!227X,d2/^l6@xx8o`[,ZZZ>!#HƍB_Ο? 22s z=OUp/,,܌hooQ*m nZI|QQ/aaa466.80iii|__1554]]]<$''SUU2III޽.PJ%rp6mįkvA~~>6l`޽k.n*;//m۶qaZZZp88T*rRՂ#JII :{-[PwczzZp=s߿VWWIKKwyBCC( w]! ̙3d2aۅv\OYt|[B XX8pz~Ɇ P>|\ pN__8t@$9.зo:t,p\ttt,( R)r sαcxvJ%d ,{l|>v}T #j;w/c$ JAkk+t:gaa""""}P433C^^{attFÇ޷^^x/v;pmv|Śl6 iկ #++ 'βFaff'T_6n܈c``e H$x<g Y^^[8bmۆFa֭D"Gvv6NTTT`0HOOڵkdgg^h4| D'''ץP!o~JJJj,--188abbU^}U:;;ٶmGNÇp]-r  22@ (B*(SSS,-- u_6ևܹVѣa-|<|NJbCoo/hZfffd23V2 ^O\\ ?~N'===)..ׯ iGGGŃIMM Y }}} 5+++~ 6mwFT˗1 I!"!!o}[ettizTtvv鈌W07o0hZ!annTJ\\>Oh522Bgg'V $ :&I8nZZTWW2}сn ׻sssٳglܸ"fggguu\a9t{aÆ ~^/r\H󑜜̡C5+++K"..Np0Tfd1}}}dffCMM Rt]pA#Wz?99D*R[[ ɂwwk׮QWW֭[ !%%^ρرc311J4YZZbfff0Moo/~GLL  oRv( <P3jeppP8nt$$$e݄sjߏ Z(1a>tuu1==MLL RT եd2ĺyp~KN'F ^~ed!xogffرcEEEEGG555(J233BvPAAqqq466DJJ yyytvvRSSB //B]]SSSjihhL233ioo( Ν;RN6l dl466OAA)**rQ[[6l >>;w MOO$.DDDDz|b{LL x^h4ڵm۶ƍ),,$44VoNYYFVbcc9|0)))2??ϑ#GcXxgSX^^jg!-hjj>ʼn#PUU%)Jfuii4:;;r̞={غu+ ܹOee%fgydϓ,!!!222 Ǐ'<<7o c<%%%HRfffhjj"99Gb4|tuuw^6mDLL MMM iq\.gǎž={HIIAP000\.'==DzEbNql6 Xc w v͖-[%n7h[]բT*GSPPl&$$"NOOFc)hZ}Y)))Ö-[ؼy3Ff9x:`Dp(J=Jjj*vrrrʺ[rr2Hc\6lt288( AG\.'>>.BCC(p4!**\ِΎ;PTBD@5 $%%$zzz ==>܃:^Lq epp'x<غu+X,z)1F!;;׋hl63>>bǎl޼0D"и8;vP~?*:0RSSJǣj %99OJJ N:"##ַErr2r͛1 UFFUp :Lx ijjbaa~ H$=Jvv6sssLOOs1 twwsH$#GزeڵV+###;v Ѹ>IDATRHOO' 99^OooP 'hC0F#aaa`6, 999dddCHH355%~0vRRR񵁁vEii)&DZ-ߏ'??\*ɂMFFD~~>j aaa#JIHH2n9rRo.8ٻw/,--k.IVV @RRj zۅO{_I$|>l۶L^^:&رc)))twwT*yq:TTT JJ (B""""h|w:H$L&N'v;vb2o& Z}_>۠{}~d26mh4p8xMRR=y^wbb"eee^]]-dG?`0EZZZ^gΝuf )0QQQ8|T[?&"Hɓ_%!!!DIuGaCDDDDD211!?ښ @{w6}#O_:M!9&;8G8< SJEffPo&|~%22$$$QO] ӉСCԨj#g_eoiii܇7zTEtt4?Z2-R)*J|DDDDDRmt {Ts>/6MM"(u5O-, @8߽0H$O5I ow[< -f|Y[RD's""""""_PT_,W[,Q`ٰ_8u⾸(~yT)䱦?6?OW/.""""""""oײO_P_>#p_M^#?>^:E֠m{w9EDDDDDDDL>}*LMMՅf#** T磿@ @XXttt Ɉfֆb!::CWW333DGG#˙J%D|Vq7ttt`2z4㠚BZnZtttt:pjZP#<<J|&,, Css3~"""\.GFА^T mz=~"44LFGG DGG q8t:v;͡d¸Z)VWWh4LLL EWWWQp[}iiQ(jFFF6D>9&$""BAˍ7X[[6Vv\ܼy8AZtv}/)اn-(OOO 2mmmx^X\\CXk(JaJ}eOOMMMdee}tuu 믿 t8wJIoj5ոn![n>Tʇ~nw%447o288jehhqj5Juw||^BCCB"""""""ϣzuu5ܼySh_HF#ZTVVa}ill$22VdffVˋ/nJ:~3_*˩dnnWT*>{277Gcc#TUUi&:;;yWHHH 55۷o_y׉'** BAMM \rEhspΝ;L&#** ZMee%owFR =z-Wh^NRI||}ACC7nD&3M&Nzz#j%""eN'ver9& Ԕ`'F#ZuFI,//z",, L`$-//355nG>chh T*'Odrr:bbbƍLLLHhh(*6zrssyW0ܾ}TyWq8;* /`X"77r1]ZZB188 l6 sssT*@& NW:u NGww7:te%-- oRjee@ @dd$ǣhP*;wNpꫯVܹs=z"'O$==]X%""wl6())ky<t=##" `0pUÉv3>>__܌nؖ-[r~?gƭ[#>>~n0(--l6͛?EJliii!..BghZ'rmm-v"77 HMMerrJ%6l@T*gJJ QYYIii)ZK/@VLbb"455uVZ-j&''yꩧpǎCpMR)n">>h$ *( PT¸###%,,id2 ;#墦dΟ?OXX555DGGm'$$PZZ2޽TJuu5+++9r"rsss玠[]]Rd2'NߦDȶPl6^|E㽸葑466LSSnB"NUUr o&77YYYY!v_Udjjq~!aaah4m_~۷o Qj~xcxxCi&_n'""=H$8kkkݻÁ㡤K.s=˗|L&/VBBBd>U$ . 8M&`4yQ՜9s;wAV#JIJJBϷ-X,zΜ9{qF"""瞣ah4&9sJE]]*! ƶmضmp Ξ=ٺu+׮]nO~IIIDDDDDDD>S@WP(ػw//^t"˙"wRN'BJo>9<MHH2 \~AT*[qybcc#ZmD<~!'No|@dd$nYoQ\\̛obn{nRRRcl6JJJBZū#::sU_jO?$30??OMMͺ大sup5RRRbxxT,sssDDDd{ܷ`F9‰'nAbPHDP \. RTOB$x&rlܸv&$$DXڄqχ%zikkcxxDdl6;wHJJ">> 6n܈bh4tṪ!;;pBBBطo뿦'Ob2.EEE KYYlذBahZ^ ^߻تKDDDDDDq{˗))) DBoo/dzLee%B`DDDm6֭[vF=ǭ_\<R\\v )e~~YYYh4L&!P(p8?#f,^d2QZZngiiI=::ccc|>f3}}}l߾lقVeΝ2$v߷^2''*IKK͛dggD\\IIIq077GKK $&&>@| &6b /Caa!ښh4ݻh6nܸ`  **@ @oo/133 cccL&0 t 4oNGNNַ֥3T*0 cݬPSS\.O k6 ׇ'22 '33:jjjHHHa*++(//gxx,l6LOOcXΦ*J%eeePYYiii)_ff&fJʨ󑔔ܜ49~gnΝ;ϸ;4Bv餻f|,.. *\"MMMkxP .hh[,:::sȠ())attJ|>W>HDDDDDD'000\.gii(nJYYV]vQ\\LJJ F8 mmms1Q* qa222"q\.DJA 8BMZd2!X[[#55>VWWDvAYYر@ @CC6M0|Q*,--lFTRRR,NgyZMmm-!!!x)..F*P(qQ  Oc4QT,//Ͼ}P( ZPZd DXXXO\.gttÇߓ/"""""""y<)e!LQt:?ғ/\Mn23cR{<jjj%&f*Ą8kkk( e7\[H$xuw?}|M5O>qx\@@ENBBaaaul4ռ}PJ==EDDDDDDDD6Ń"ߎn7&鑞nZq:8̇qsv\.MDDD'2::JKK ^/b `jjFR)Z5YYY!66EKK zmmm'߭>??OSS mj AZ[[ښnj5 Fddv:477 kjjI.kKgg'T*%..Gcc#T*bbbLOO؈ 66Bcc#SSSrC1::2QQQ !֥Xp)k*p΢B*BAXXz@TMOO=}]]6RS~?ttt h4vGӭ[V^uHOOk(,,,JJJʧl6ĿY[['55u]zncZijjb||\>N^fzzQN>^G=yѱn\xZn7~!rK.a2022Ȉpccc477P(^zzzGPN__,..rurssgpp4hmmz777300J"""Yqt:\.LMMdյnwTUUn TVV"ju TTTAWWɟ -Y%B7088H{{;aaa{ASN&fgg9COOPH$DEEaXhhh`ii~? RJ%,//S__/|nZZZ@#sݹztv'66Acc#xw#33Sl)"""<*j7667P*/~ 4 _HRn޼INNOfaaT*---tuuȈweϞ=B*zt[[SSSpw:ָz*:RɥKhnnf߾} v ɓ vnݺ??PZZ o6K… ((( ""۷ose"##"44zyvڅZfffUN:Evv6UUULNN 5 /"r0z= jP(v _|͛7 /NII/bIHHsn,Uz__tvv2>>NNNCCCp%bpEܺuۿeLOOs9$ lڴ \@&Z-dVVWWEV366 oQQQ\||{=FGG '!!a݃˗9v6qjL&A0nffa|>FGGp8Ve~~NVVV f ۅyzfll ??VtH$N'2 L2N&''!VL&W0{8~͆lڵk k^祗^"$$0봶Faa!LNN ivvHfffp8x^YǛoI  6033Cxx8ccc,..rIlBMM r\p޽SN4Gll,/227oRXX㡭 Պ^ʕ+TUUIll,\zLFUUܾ}R&::LWW`KDD0ڵk+BUU KKK~m|>wܡ \N fjerr5W@NL&#**.FFFd2ƍE===#5jIOO"UK{{;*OLL TUU188SO=f@ FappR)r_GbkkkDDDhbbq]gg'RTp^  ammmݹ a28wYYY,xEc``\.vt:B"ݍL&CTEpQ.qݬۍjER!J rttET**rrrxWq\TUUHUU=== +OvDZZ/"7o$++s155%8U111HR***ذao&ܹsNG[[277BZyzܺunܸB[n~FFFx78r^PDDD!Itt4111\~(;55şڊf_+,,,qF2228{,fÆ 466m6Á`9(++!h+JΦDj {nZ-DDDٌ'nmmEVKhh7[דA^^FQ04 >^z ݎL&`0Lzz:MMMlݺFCRR2i;ƥK8|0ܺu TJee%z0d2&44TwDD(JQɩSTVV̅ ȵ  YXX`ii;wppQ HOO\n7j 駟wޡ(V+jZpxH$ܹCQQ#5###Y]]ɓtww311Azz:$$$HZZ111x^rrri0 MYY|LNNb2©S|h?@PΜ9L&hZ>gϞS[[2ǯ 2;;KEE:&ZZZG*LVV^ZY\\$$$w}lMV+C---a6fuu7nzСC,|c v.^Hss3ZۍnG"Qj!ͭ[HLLddd(VVVx1 TTTVz*7oԩS( &''l3?ʕ+F_Ngg'F2zJ%SSS EEEsiT*^??Ν;r5MMM#P"HMM166Ftt46 .]Dll,n"::gbB4* ^Off&J~?yyyVĉdeeq-, <\|"##q8:u N??Guu5ܸqFCkk+d2***(,,1ZZZ0LMMh%--1z-u6fBBBy& T*1466D"A&J? 󩧧?6 KKK,///7bnn7nFMM )))v)++W_EBL&ٳER[o!D;:: j9xIiiiA0<n0Ξ=0CCCPSSCRR }MERUU\.ƍK/hmm%==BD"("&&Ed2?Oq@1~ӟ277$>__222|h4RYYɓO>IBBٳjjjضm# y OA|\plx<31r!bp!p=qs<쳟x<Μ9CRR7oq8{,=>barrTڵSNo6 [la˖-| Z-Gr|>xyF&GGQSSnrt]Fbb"\rEp6xX]]euuȳ>Kqq1_||H$61t:9udee{RZLLLPVVnɓݳ`ٸq#őӧ9pХ`yy@ nG.sq7o\rrr"<<{uVzzzzBmjm8x`nN']]]~{9JJJd`ZYWX,,// 9r#GaRRRغu+aaa|>6mDWWo&77LVΦ:VWW|9~8111_ʭ[2::,eee,--aXp8x<v;F|;TUU<ŤqF4 yyy9r0`}>|ra͎'OsN233IOOl6nHQQٔAqq1Ǐ{O7winnrg6l~lncZzt{9fsϱ}vR)NB83gp8dee &&JKKy7C&Jd2! 5{|>~?'|Xfgg¶mt|>N'KKKbNGrr26'Najjjp\x^ƄہH$ORRRnׇfbammQVWWIKK|@LL r ϻv,fL9bbb~@II 7o䤰޶o>~iT*f}{Ehh(fGGB4<..#G|w#H())ڵkrw#8/^v\L&C*"Jx<:o)+C. =wo̗@ T0[!87 zr\ ^JLL$33ǽ,ŧ'OڵkdggcXHNN&22qHLLduu+W`2شiz/Dnn.F2"""سg233}Emxr}KՑnt$LNNww.8dii 6xa~~y <<??LBB6ټy3fqZ-@>a^Eپ};1UZZVeϞ= )A;;;l6qP[[Kbb"iiiB^ZZF;FBB333ܹs~RRR|| oKff&^jkk4Hο˿OZZ6~?Bzmjl޼y]!^[[###H$!պaA3aRYxg}6KKKn',, 6e?#/^]] bccumIII!!!Ci&n7zILLnnܸ`4s`;|>vnܸ֭[ijjbii ~?JR0:rsstO]]]\Ɲ;wHJJB 1$''3??O^^JJ%&f4hTPUUn'##I{{; h]… %7wr&8g ,!!2"##پ};eeeqV+%%%B ޽{ٱc%%% hrrrXZZv3>>NMM SSSR```ƍl.(..&==DvEzz:TVVIii)]]]\tu Vṕ@DBHH===X,R)===LLL)w;{,---C׳k.mۆ^^/&fa@ k¹666`AOIII$''ѣG ,!!$$nr9kkk244$7R@jj*ÇJ^^TUU111A{{p>T~ֽIHH !!6hjjǃJ!+u, t:Kuu5.KpLk)~?4 sssdee1>>ŋ!JvlܸT***}6ٔƥKΥKfƍq '??zˉgƍBifH._Lkk+pm***HIIaƍ pd2@x"Lyy9lذGOOӌsЊ|uY[[CӱqFJJJfdff{%//t! w޽X,z{{IJJѣH$Z[[Zє ź,ywנkjWWWG"ۋ^D\. AJJR(s!uV$=|ggii0, FQ_...fee@ c FT*%55UZdgg#JYZZx  crrCa&??m۶!Ʉqٴi111dze@$44Tz=v4v8 Fr9qqqѣG1BM6QRRBff&۶mCTӃBĉ#x5 :it*D0J%/ ---a4y'qVdϞ=(ڵk]zL&JTZ[[ '66C 2RD"!<<Hll,qqqB=m^^qqqLLL0;;K~~P[}v6l G.YYY!==B6m򲐢o0"%%DtSTT$RTT$oee{vYXX >>v;nҾTA;o^/L&'jo߾YO=1==ÇYXX@דJh4l2" g~~, l( )JbqqgyJF駟F"M\\ATTǣV1x^zzz穧">>(&''9x yyy uiiiB)Jȑ#dggp80L=zYYY;v/8())raZygPtwwcyꩧHJJbll98@~~>uz'INN&$$%;&$11Q(h44$''/D5"66(jV`MOOr 77it:%%%֩`$TD"!))I( [XX`׮]p8HJJ2mbcc=>ݻ),,$--iػw/8N|>ǎ#99V4"++Tg,kJJ<9rD8Ql"dÇ'^B %%(FSDDD!yR%˂T"`2p:?ғ1>_.7 4ܹN'O?4F<ofrr(ܺuK{s8p7Z!A&22R((M&*CbnnӧO&$$Dȸ:#Q|嘘gmm BAttlv/` ztt*ko~Sp8߇ZSLL. ,;U*}n2P>X,Zك +++vJN|-M˅?""A|>v]h=yG0y""""""D"=.ߎ<KKK]. y$ 6 ۍU}Sar698C<|\nid" |☂-3?8A톏AE ;_}GVD@p>""""""_JmwxݾQei)2LLq ==M<]")"""""""""4 Qls7V6]Hx."""""""""UcccΝ;,//+(fjPSSD"AӱLUUfN 墮^᣻Ugfffjjb cZcee*AqjRWWGww7jHz{{G QxAMM ō7%wVKss3j}>mmm477Jhh( 磦@"PSSqqq066Fuu56x>Hu*NShcrX,\vu8444!ڿ{ UUU| a.]bǸ[}vvVVz@ @]]}gg'nbccdܹsQ4ʠT?6awA"`6db C"Vbpp ˘L&***'22r]M0wl6b"##d466с\.ާ166FMM:w/ϣZ… TWWů~+1ͼXV^u&&&x7ڵkry:::,// /}rhiiӟb~AӴv+++bUYYɯ~+ڵkDFFVxx饗… B$077Ǜo)@VsYfgg9u###tttp&''~jzꫂۻn܁@'ORUUJbjjyCOOuuu122Byy9x<:;;nݺ*@^nܸz^^}UP*oߦ@ MMM.,yN'mmm|>|>kkk+ygppzzz8(o< ˍܼy)x<5%*++immvLNN /"JoQZZZ}67od||E^~e!1==իܼySx套^bmmv;o|>A!buY]];w<"""""""""¿a8pGjv؁\.gpppMCCׯ Fl&,,#GG.qFRSSIOO''')JKKʢFerr\.\0tttCSO ly뭷㥗^bttY|MVWWy7׿5ʕ+p9s KKK ǝappG:tǏhd2{188͛7> giiODII 'N 99KXXȑ#߿JCbZbyyV˓O>yzWDB[[gΜr8wcccTVVrm^{5qv9~3==͍7LB$vbbBȾ>j^DT#m={p1t:^NGDD(JbbbַŖ-[O^^෿-gΜY',W\\,l'""""""""ԯ2Ù3gaϞ=={Vh4::*(]V@DSO=Egg'W\#|{߻] yo9NN>Mff&eeeN… |J{HR!%%|Bwȑ#$%% cڵ={p9^pm>*駟 Aq;))ݍbA" ɰZϢYXX &&}v;ٰaT* ZZZ(++J6RSS&33uY ZBt:7oׯ{n\.]]]œPtvv~ۡ=*2>Lcc#ND4߿[\xdVVVƍ466l旿%n\.ԃ*+++`Z9fgg룷}iDDDDDDDD|H\LL zN':B ذaeeeb4Y\\' ++Lf3999ر8*1xXZVN'dzo>4 ܹl&''Z߿V(0 r:Dff&4IKKciih[$.<oУr jßW+X-JQFD"v#S `ӦMBJZ'xpx cA''NŲ.QsIϨD"yD&h?y+""""""""!X c}bccY)R.JiQǞ[`} SEDDDDDDDy8_~==q?^*pp:R}n7.ᫀR{0yoKWWL&J!GEE@X~:$&&b۹uA5n n޼111Bgn5VY]]%!!%] F5*++ikk#44(:::$::ZPl… Ν;444R=ףV tww磢::;;7n n޼j%11^*++Y[[DĂ nSSSCcc#իW)((xX۷iiin#H8ud2~?}Y[[h4~1VqbbbTUU҂L&CLmm-vW\NL&AI?8Ǫe`Z 5uuuH$fggH>(KKK[rjjj(((x}LLL000cuu?JVqw:TUUILL=jrMFFFHII3(DDDDDDDD@<*巴DTT7oޤ v~_" ftt7|JMM ՜={19u~Z^o2jN>.455ŋ~V+>DK/.[n 7abb jkkHNNDD:SSS9s |8>CVWWd y&fwy(Νcll^{ DB`qq7|FY7@ 믿Nkk+ `6իvimm֭[ Dž vȍ7+W`6sE&&&>Y\\b0::Jyy9B+(T<@!]FWWv *aN:E  44 /VVӧ룡I b69s#H$oҥKՅfii9qE^ʝ;wp:ttt0ccchZ|>/N7o֭[vFFF֭[ikkŋLNNX\\fa6kuu~VVVbׯ_łJ"<<3gK/1<@߳g{!""L&ٳh48q^OSS8q-[)))deeԄT*EсRo|qq1O>$1116|I8p;vLB{P( =Jvv6rL͛L&6oL  ,, RICCh4|IJJJ ]^7oLWWSSSjߏN#GדFvv6`4illA&&&'$$&&&D__ٵkD133#DGGGy1͘L&N:D"ɓU}***ŋp<YYY;33ؘpܣGhpdqq\o~i|>B9Bll,rZMll,ٺu+* T*UcffHx ZWR]["˗իW~cv^uVVVy_'Ovajjp=>wyqz{{tׯ_˩Shhh… |>^uJH${"?;wr%2>.^8w!44VׁvǙdmmg9)""""""""S t{Gbb"wٳfS8 ~R)< ܸqCp?9{~:+++|܃:u6m$n!''4.~?)INNɉ'p,,,;3ϐ8\tIRUUEII 8qzQ(~?ShooguuNB`yyy ߃ۃrrr8z(zEرc. NDZc cbbO>Ɇ g߾}ffmmǧ7xO>$,[*Rȑ#> 7L|;>WWzL&kkk[ܹlߐ;'jNkk+KKKlܸrz{{ٽ{7vbnnuutvvD"tyf#;;ߏJ"66uFᠵe|>. TJii)۶mcqqN222xꩧp±G||<ZoΥKHNNj244lOXKbbb$..q߂/Ga\\ٳg߉|T_Hشi999vN'l6~mVVVغu+IIIBd222PT>|%.\@yy9fW+뙙\ ?3MMMb2Z444000@oo/DPSx bcc)~_~?;w099Ν;H ap199֭[h4(--ERq N^&T* utop.\ \ ڇb6$'' \.l((( ))XvIttp܄rssy׹r ~!kkkr1sw:X/JTJ{{;LLLP]]W\oyt133Å qx^~_144B nݺIIIn41LܼyEqJJ lڴ~?III(JRRRf FEEQZZF|._| &<YYY277w\jaEDo( ˘rss!??2F#iiil6Ojj*v ؼy3.rrrطoRɄBرc$$$E< N||gPP,M.ILLL&ciil"##"::F#ԃf !!!,,,h8vjZ@!Aaa!RH|I dddAbb"240L&JJJضm111c9|0999ĦMظq="qyyyjl6dffDtt4111FRRRCדjec0Ea0j !?~LFAAYOOO'%%HLL :N8nIJJfQRRB^^޺vqR(<qqqHu"qnxJ%aaac6dn8`H[x<.]$egggϞo*]DDDDDDDĄ8kkk({2Pkl6233ى#NSSd?~Q*ꯤ@"JzdB|-> NS>qL&4)L&zZ䠨ǝ'2;l"(w^D"k|o.o̺$"""""""MF"b#ϷQraپroʇpp#D" X̗5O> n@/`f[= Nϳ'ϣ#_E}[X@BS?Η|#S܁G?TaSܽ^/zuCLqaT4/o^ GB?CzHݩ""" ۽ރxXXX 9Vmr fYsl6|>ߺ봼q,,,k㏏q6*R^^n7/_ioox^ 333\xiZ\zn[ejX>22•+W$&&恢A5sBA}}=L&F#fsa6IMMeeeׯԄRD̵kth4࣏snޣEVVVRSS#S].UUUrZZZHOODillD|2$&&3ghlldhht 11Q6w[,n޼I]]V˗)**zؕihhj"Jyٸq#2 Omm-@w}B!B}Y, IIIzUGGGr P^^N}}=Q;wPYYbh4ٳgF!ɸr ]]] .8ճV+bd!s{{{;ddd0::<333;w~É]^^c0P*.\a|˜?:IJJ*RSSl6[oիW8|M6l؀J>jw9fxx: c( \ng~~˗/s^/.v <_t?$%%ET* 51K}}|LL̚{C\\---477e,.]bttɴnt餶vzzzغu+MMM;v-[PWWG[[PSSCjjvX,ǯV߸q YYY봵FHvjR__σ0LۿsU$Ih۷y&|p88}4)))?aN8J7oR[[:u ?.<8Ξ=T;# Jvv6ׯ_Ν;T*ill$ z*NFFF\~'N099$===c2X]]EReN<ĄXz>3Q , Vihh`aaFC^^ܽ{G}D `vvOyy9:VcZ)((  r… hmmʕ+ ٳgrM.]Dcc#0==M0saZ5_8x<0>>ΥKhnn&NP(A~ci'333>}BArr2:{Q6O>BWWNB$pڵ_PLCC555!vwwϙ3ghmm]3fٸp7n͵k׸|2N+W>\.\|EFFF֭[/os]P*zu>s . ΅ '''IΟ?իW7ٽ{72;;KMM zZիWX^Oqq1iiiܺu xԎ^իWE;eΝ$$$z>Ƹ|2AѮHMMe߾}`XŋdggsYq ٵk,--۞p8L0|yNyy9Joo/7ofxxZf3+++l޼rKMM eR:wbbt, ΝJE~~>ܹsõkhnn/~:qqq?~|6B!N>vc\\\dl6.^HLL jO?z&''h4#~_N}}=h4q>y;w1J%n .%y`08~8~ihh p bbbX,ܸqzzz^$I&PZZ^h42== Fp}x7ٴi[oQ^^brBFF===v>3gCh|T*9x t:z=III8p(Qt ={xv)++ 66@ss3]]]parrrW#܌`RdrVTvVV۷otb2HJJ@aa!nGb0(//?ovvQ~_RZZʡCHJJbzzX2::ӧ|\.jkkILL?bpI._۷qq^Vĉ8N\ݎn?9eee=zXfff466244Dss3sssjv;gϞ+ "66ш^'!! jϭ7P(0\~dZ-MMM Ԅl棏>";W8v@>S.]fvS__Oll,iii$''s)qkkkhmmd2:ϐ^<bll (~yשjfV1Dy:|~?dee͛vccc Ftt4x^8@rr2NRjʕ+y! ?9IOO磏>ܹs$%% ?HLLDCTTqqql۶ HFF'r}/55\~9}4111IMMe֭ab{>c=2~yjjj'##yN:`11`֭dggԄ餻!)((G?@$TTT0<GVVXO?IGG,,,@VVfƍ7ؿ? ( tDllد$I]P(h'ӧOKee%.\p0>>.z<͈@ߏZ'? ܼyNGkk+sss ӟwɓRRRN룱_A3`sv͛7_k׮r̙3g?[3TVs~m( Juy&DGG;K[[Jfcbb/=ؑϫ q6mܜeHJJȑ#Fl6&js\.l6N'kzjNOOg~~^ 9z=!˄B!qݼ;?8fffɓTWWZ),,\ <p\v)zihh`hhrQv;kF!,,,p=fggŹMYY;wtdp:PT%g( Q\\^UvѢ=*JJCRtttA>|(z7?NEEzTx!eee:tX  yw)..p8L^^h4xHOO'##Ų]B!|299gǎLqq1P(/ຠl6Enn. bVTTUUUA||vsNjn~11 TTT~HJJ"33(Ĉkbss3b{x z-G "9Fd?(Jq} TTTMJJ [lpP\\Lee%)))JD[[(Jbbb8pcrr`0ȑ#Godjjv;ccc,--i4~m>̕+W8z(>˗/lYebb\a$I*P(aBК_;?OGsU?{EZZ7xr=JBVoq11iaՅp͛7X,044ğgJ%6 K?ܾ}i~RDV._̵k0Lx^?t:q:,..UUU ̶mhiiahh[nDRyy9华?!h^NNɄa:::uM/6''yN>e֭HVc سgdzw^1 '-..ߧgvr#됞JAj5fƸq \xqäA{ ߿Ν… \.B_Zx^ŋf|ܺuaZZZ-QWW W^ezz{.fykBjRRRbAP`2D5(//`0K~~8w#]\\###pȠDҳśobT*)..7zECMM s˖-aD2Rb?^LłJ"//o 줩eT*fHvv6pyhjjbsEFT200sXYYa˖-mEEAȰAѠVEq^{5hhhzimmeddVWW9q39=2rJru0TVVfΞ=K0$>>WW|磾+W/[k.)**b˖-vU]]M__lݺ}q=?NRRѼ{e^ٷo3gά9zrrr BAAAX*J$qW\6>>Nbb"@~ h4:;;zhZكh4lfuu"Z-\.bbbػw/@ANN i, 6m}Ĉ"}}}l6xfggE"ȰY222HOOt111,,,Ve||qIMMebb,hZ>|HVVVIRSSŋ xra20L8mԔHRYYY8L t:N'錍}vT*hЛ6mjbZQ(ddduVz{{|رD1UVSTT Vx BtvvvZ 11Jjd2aIKKcnnшEROp8n'==E?B_ѣGl63??϶mL}P*n9vIJJAWJJ }}}ƒKKK7SRg2kvZMrr2ǣP(Dĵb65`7o=ãhZp8rٙ<kZRRZB(/s>|H0d2o-#͆j%..]vx7o&ؾ};iiiXV0aFFFd˖-沼fטF222D6KWWQXXHCCUUU"Z0 KKKk;DEEABBVLt:LLLv&))^d2166$ {nqӍ$Kh4RXX(gggP(z)**h42<NsMtk2Kp8,j}Al6. xo6T]#z&A0.kÑ& OU|LNN><$I$ZdQqzLMMp$db"CTl|v?u|YEwNk׮zױ {%z{{IOOgbbݻw2l5Y7Y]]}[+3YZZ "% ^QY]]%xX^^͛7w^ }}}dffʼX,$&&444D?G!>>m۷k.)=''5\(ifddb1upByy9YYYq$I$雉HsRш\ag5 #eqG/Xd^_dHEW8ZJB_ã`_%/[z{>̿OoO BP(rNGob6/[6b]%I$Iz5Dr>mٲexgzzZV][JMvT*ZwFN`ppRI~~>pX(.FCTTԷ{,I$I$Ivl6%%%"PWDEEm| ⩟!;ƛoɎ;DρAxc+I$I$Id[_XXԩS~Ĉ6ۍ|a ɼ"A %I$I$I$s(v3==-#?M̼a ٳEB֥W<$I$I$I_. QռTWWO.$OR8x Q+IDAT@`0 _q$I$I$I]("==5O'U0@_ZZ_x,//+ZVVV_$$I$I$IQ$ʊ}$|-//j}2k^򷽭$I$I$Iʊ^WC}]z$ $I$I$I$IF_$I$I$I$=?r$I$I$I$d.I$I$I$I/&x%tEXtdate:create2019-01-17T15:45:24-05:00t%tEXtdate:modify2019-01-17T15:45:24-05:00?IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-select-a-1.png000066400000000000000000005112661477354127100272720ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME &IDATxw|}lX{o"EuYId(.u9'ſrn9Q,˒HV(Q(Dm,"h褮s]RVfj : !B!C(ecYoUyFIiڨ709} j Qi\?9mt]B]7PF)u8Kӭi(,>]61iiçO~ kg/{-QҜ9kZ|y\ݖ*7y-LB|ٶ², m+4+}}}fNк-Ƕm8.]׉Ǔn+u;{tye8(@G#߁m_B!5eqaJJJ0 zjk'E*M G RA1(رc7t^o;v̙3 9r%KnpPR*_&ᠣF233hllodee߿SNQ]=SNEĉAtvvǶm/~VN'N ۶xo8+V^uxp:P__\n맯ӴhiipũSp\x^vÖ-[(,,@ 餮p8LVV՝  w AYY9eq b8YYYD"aN:ʕ+Yf SNq:]k+?j炙xiii=}hƉ͖5^N:̟?cǎEff&G'//_D"f͚}fBq~eўzB!(-ϡÑn~1H~[{zzhooti^}leedgg >}:==C:l&Ƚ40T}B\lۦ'z-|[ũSO~כ(//g%X>~6zs[Ahll`ΜqTUUNKK ?sGaJD"Q6mHyyJYlp!zL͛C-&EGxĢ$E](w 6pA^/ǎcHj?&++}{[}P(ĩSlٲ^n7G)h499BaO| _g޽l۶./nlJWW7>(L>Yf~lΝz((($ >F0@ :;;'LqضE,C7t( \!J) Cؽ{7w5k>orS\\Dj|v~~N۶%##z/˲Xz5 '3?DYYa`ΝѣGYf ]jժqTUUٸq#_lJQfժ8N~?e3i$VZͯkjjjD4̙ͬY3oBu/_Nccsc:t9sfЀ0tVbr! !7uM3e9z|>lۢp8bY9ƄϟAOOK1ier9nZZv䯔" 3s,:DGG;zG~[3MiaY?YY̚BT2.((dٲXt J)zf̘i2ct*++9s&aPTTĜ9scƌ,\lbL6*fΜDm` @8"#Kuu5SNS[[a…x 2u*++1 ٳbedffrhkk;=̅כٳ7o.L: PVVF8ᡇ9sR\\ٳ(--e,X0 ,ˤP(ĤI%??ٳ琓gi!,X?DOOmswdq:]̙3ŋcY6yy\wu̟?X,ƛ2e2&Uz2g**xTVV2i$f͚Maax^.\M7Ȓ%KN1gn&t]byxb^t=9kNe)ɰ \=v'p8P*9xjFu8󅗚}4MRCf] ۶| >UF*O˲a2S:iiy[Cgg'}}&i&b`|+Ç xx|_j\.[RMus=Ǿ}hoo0.Nz֭[Ǵiv x7x뭷Xr%uuuknep87`;M7ޠ^{Rh /I|B!B9-蚦ׇgvshz:֬YeYvmL>}uMhooo{AuV^MNN;#eYzlٲ^̙Cee%o6%%%y[Nj:Ry~pB à˗iii᭷iǎ{sWJe>8>K8W^9sp-r)?>Ś5k0M[nٳgx8Ǐ'aǏgҥlذ}uxyY[/Lgg';w.<;w>#N8Agg'?g|MfϞvZ{Yr%,^[n#GŴip:dx;wҗĦMO8z(_9z(0 illdƌ~1t6^x_xw2e l۶ 0,Gxbjkk/yB!B3lbڴi|_f֬Yum&F妛n:o!apmO?0uE,#iz+|*5k7xgpضM,ӭͺC=7 &>xbX,M-rtŰ,j/g>Qm{1/Q\\L<'3g555"ۍ$JB!B\ņH=#++lrssym6^度R\)((t&77n{Bbt:DE" ' Bx^n7e7TM:rBq~? ӓEQ233zTF<n5|ԹD)E4Mh4F)٘I"[G!B!4lgu/y*\Hp-Spg߅?\YH$ؾ};sIv!B!i]]]]R3꧖YB!BqusDB!BqsdffwB!Bk~Y!B!RI.B!BL !B!B!B! G ~v!B!_*@bpLjAiixWC!B!oѨi\۶xJ$dffRSSR*]Rj_*u۶S*TG*o:%²,"?ЎcGΤK=} 3S6x^;09̶!׊A'+i *.Ha>NVǖXʸV4N_] ~_(N~Ni+;}SυB!Zַ=n Bddd`F:u px<݅;۶M~~>M{{;L"---Aff&i>Iww7===|>\.a`&|>8twwrx<ݍ`aCss3~4Mh4Jvv6tvvvz҂mdeea@ft]G[[9 Ds4k>lP^li˂~ LTܚj6dd$VnLE5 ZZtv6Ϛ 0)C *+Ϥ5ٸI6~cH@0|mc|?4&fp;EtRYyf)`N\ +ESLf@#x gƐz!Bq55@ٽ{7)SN4%##P(F4x^>CvEmm-N,KG$p[5M#cYDQz-˧~ʌ3hnn瞣ŋsa>cnJss33fgΜ9zjrmg^z%L$''4yؽ{7wf.={!RSSC0W^>`ٲe/_ݻټy33gdl۶uQZZJ"?9Npp8x9q{aܹ8sνeY$ ,0 >P(tt$^ۆx\Pӣ۫c o`@_òz:?fdLEoFOOr[*`'w;ذAeͱco e{.-xMlڦE\de)Qi8NV7Ʀt;n/c[6 wdX\@l.jjvC,j\C=P8t  Cm6>m͛;]ix^B}>"fLW&nk:byrt`o^O/r1+FUvv>k[3-ox]B!⢌ݲ,nFGEu?eYu]455Łm]י;w.---?~yHkk+xo-[ӓpKKK={9]n7O=J)ܹs6m3gdϞ=<=z4\__ϱc())4M,pK^^yyy|_" 9ݬl6nR<<'?,rrrx駉D"? | _pFvACC7x#=zȑ#,\pkt:Q 6D<_yyy,1T,:_jW^q1cܹGtvjTV=jAk֭Lkhbp 68yRCOdf*εxubݭ;NN߿w~'NvJ߰ɍYiܙl̄<uinN>fͲhh74;[q&^^M͛H V,/ssliقpsXVp23&M&vdAN%BJܲ`3wTcףPLϛμy<3z=dO'(8<gqxjpM!B!FbY^NÓO>M7ĦMD"K.oѣTUUqmQ[[˪U k.(z+r _=555Îouɇ~Huu5SNrbڵ<n\.WE4M}]O$`~wP(ċ/Z|rntw};>kעiZn^|9-g}RnV_4կ~ESSӘǙ+lY[\Sqtz{5"={ ,~: Ѩáx'x[ɀ﮻ld jdg+ow}_vqdunb| CqVpmsp&2;9p HvO7taYC?O+s>9w2}n͡C4p 4|s7YZڜZn-)9S8u fu ;e7skyȪ< n?N݉,>:7@aF!N}nb}z65oeװdyx\v*P"ĦM49ueA],wOBm?f(t8}hEECx]Gee%䝎ӕ0c..4ߏ:}bX d_az+|>6_Bs--K{}.46&'np:+-3zC,+9'9+5q^Evvr#$(+ƙz͞mq} 83G^8p(22]dg!yBr*ƢEfs̪ѩRU@lP+^X?q;4t%o`V6MM˾}K[@"{ǴMn* [ٸ 7r/D@3Y,RB!B\Fi`Jrrr0 } ,Ш1 7قh'nhl9z4=z&OxSG)2-B!z%KLuNͅ38O>q9̙44,[f2iɓ&&{ 4X[L$ǬwIQљRd83(󕱣m{̠(K[zrIX 6lps_}d82P(r<9dsf-dQɢ{X4 q݋ aa֢:ւ` ƮD QgƤ{iL1tpXcFv@@߈k>%/pe t .gp}끬ke=xi.]jm׈'/u gO_džgVn .N3ܵK{ACCrLXL_ʶ33&_?q23հ!5zzh 6J^!g>lL–wB!b"u覞x}Fz>uәA}mxZ֥#Kgǒ)NTV>88.Tm*ܝٯTH`#k4mOoNp '.7tNx~?F+o)eeYF!y P.6oԟyB!B\FmAWF]RXօM>>o)>gR\HB!q\zR 4ǻW rB!b|藞B!B!.B!B! B!B1H.B!BLNwKmkwW]uDžJ.ea/b=1|^xy !1@WJ n~?iH$^y,N'bK:^,BPvv9^m \s> @,ckhk3p27U@5(p8]~H`08++8 Äat";;;Zi //諭B! 5M#c&%ȊFಬwn6]]]|>/KWWaPRRrbQPP.'.k===s3b(pt:ϛ^uV^O`4M \Wve}|4 0bcJo&`qA***x30~s璗.7Hor 7`&555\MB!bt6o {.֯_OSS9pAF|!7=R?W }K4e?@ϗi;>1n:Iu<|06mtX݅Jgg'[lA)Ŕ)SXd ̜93gzjvލ殻b}vӧOG)'{n={6:t 9yyy`SN <l۶ wߝO>z|>n6y:u*6msXc9i$t:D"DQ$##={p=:N9syf4MĉqC>gs4&BK,a֭זe(cҥ8m6(..f׮] 0 nxhy7ҥK B˜8qb.={(mAFF,`% QbL0$HD7G bDQ4MKƍ n:BPzRP(  3WANWW'b``HNY^^΢E4F8|0nGyLB!q~ +ؿ?/"> SL9'.ɼy4i===<3хC<3>dFgw)h4oA(b>yyy#vurt]onyt{Ekk+=Xlq .c7|3_=n˲~cGBdz++\GD 0z1%{ 9m 3sf+=9VJ+?s'xp҃ɾtih+żyv|zX{3+wkN!bG) |>.\FGgg'---455|0P:tzòeXti {06=Jii)|;a…XE$a֭L:`zFx<ή]8y$|;L4 A 8y$_od˖-ر9ضM__3l=t]Owe|^R>t=Ohl!hpa‰0}>ԝ>̉ w0t;޺4ihS}p'] lmʡCF{&X[ȼyd1MxH*@Rrssx<餸SNQPPa̛79s0sL/^L$t, 0 7_O4*233tM"$=SPPܹsq:$ x9y$.~\:::榛nGt7т_4 sCyyy{{nn.X磦"rssvSUUEee%DiӦ%//\^orH$b1f͚Eee%}}}ضMaaeY:j/hH4)))cΜ9L:x<gKFFwyyy%n7@<|A˩N/XQQAii)Ü9s ##EQ\\L(J_?M|k~V~8s=B!s~k6dъH$hllpPUUuYG鱕h nMKQ999x2>;5QREEE:@#HPTT4l>ÝԾÝ˲hhh@u.,䐑qu͎7g&Іn+{H34vzp3˵&YM7У:_/:{RQY.oO4g k?}5߃{&5ˬ H"`ƌ| lj*JI>+IηZ AMғӥZS|S>UiPZZJNNxq e=!Bv]x/5@O-j#v333?r.G]hr<vr×TK~jqS%ƴI0 ➮#49 6\ᵼTWykqF*0 VT0?8.xn| G S ~H7UtR!bö / ]r;Mp~Ld``D"qɕw8dggrғ]j@:dee BZ5֞=q_2lNO"w9qVVcV^Eso!u)ES}> H[R ںgdd׾)ғ\^4MtMB!1@/4VuyR?tJCKwgOJ),n|\…B!Zw+J{*c<Ɵ !B# B!B `ЭU!B!9z<' w]B!BϭL\.א׆蚦 ul*B!B\ MrKҦVo B!n{.YYY^J۶i.gϜ~13<5R ԰ضR*p3ñ, Md !!crwx}N{vg;Ω;B ]3óM=) xy[w,;ƷohF$zɷm˗os!&OL{{;=uuu̟?6^yVZE$>"'__عs'ekʕ+immeʔ)8{+W䗿% /Yp!J)z-{=N8ɓٶm۷o(?яG[M.O!8[0_ߧiӦ~~F:u*G套^O?PVVƊ+xz1k,Z[[Ȏ;p8|>?>L|r~_o>jjjD"پ};]w@^zUVͤIy9pSL^x>͛7`}]}?ԩS'B ۦMƞ={RZ7n!]~CCyyys=t:[&:/_*СCTWW|LVZƍ9rMMMqYx1K.#B!Fp8馛W۩I&@nn.O<-Ʋ,,XatuuD裏8q`b~;grl2|I֭[G{{{ r}QPP@VV .4q\q<]N̙׾5پ};ӦMOO;w. sNy=J}}xj!dɒ%3~?gƶmJJJ1c6l׿5Z(,,L̙3믿Χ~墪 ǃR Emm-dddPUUEyy9nn̙ɓ'9q~;x9q?+*x\JJJ[ )))sb榿?S 5kmS^^Δ)SOxW477M7oꫯyf<UUU^)SҒn&[54Mtra-[Fnn.n_|D"Aaaxj!MmEEE)..NLJ9spTVV3|˱m*&Mիy7qê*rrruXhJ)~_cǎQSSCcc#UUU";;"^/{LNN ?k?Lmmmԏ ˲x9y$O?tĤD$ ֯_ټy37n$;;|_ȑ# e֭[3<'Yx1>,-bq޽,_ߥN~_h"nF6mđ#GX~=6m/~ir:B!۷o?駟&//83 㯾*.G}4_j[$Inٲ 6PPP7 {18@$O?e۶m<3dffos>Lbݺuܹ~ ?|0i2{l&YYY;vlOB L)ŦMذa< CB!^y~?<5M>;vuVnJee%ȃ>F]{Oz X7̳>ˌ3صkWTmj*W</~saMuOw>;pe eY?3b11M_W8p"?я|S]]͖-[XbL2K2}t,^{[2{lR@ @EE7o&qyN<]wEQQoϰmb~D"{gv[?>J)5k:֭vs=\(=8`2x78qeee /g^+WԩSYt)SLnp8+ݻYp!p8QUUņ m}|r{qݼk޽˅=*++~FCCDOAAk׮eʔ)L>M8v'N dɒ!B!`?#TUUQ__믿ΩS(//׿ `Ŋ_`0曙4iu]ꫯgzw륫Z>c222زe >---| _0-K__,_UV]wݕi:D^^Rx<~XE88'^z{{ӝ5Mߟ%(Jw+((pH$p\200^=// eݍIsH$Naa!xA" rssQJсiA^^b14M#??X,F0Ķm?6bmvIp.bTiM<G4 1M^ ᠷ۶x<M$AӴ!7`ǃeYtuup8OFq\b1$77D"rɡ{ȾD" L .+5> ׇB19$n+**"@vv6ח,//whqq1`L88NmN,Bu x<"@GNNxNRx<|>x@ @("++ O4MI @)LܞzB!^/yyyCƫK.B!B|ӍɩuЕR eqR!B! j>1 ЅB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!bpwF??ގ˽!r1 ˲ƻB!m<#7ի/B!B!& gdd5B!>W 770ƻ*B! 77hwM7F?XB\V ә9UiQRR1G !WxY_?헬ŅsFR\.\.K,c]=!BqB9:='Ofͬ]?ܜB!8mz0رcqjjj0 #G:SLA4,ˢ>0eeeijj>n!&hFoO3f`tZ~jNd,B1)@?rQ\\L?@72g>cW®]8pg@KK Jqq1k֬OOcBkºv`2O/p3ݘB!R߿~nR,_jkk9pX $;ڶ߾}=Nbܹ-WYfqEB!ĩ6o!Οm̏F:kJA"o$Euk  YA^L: 6_Mn?^bo @~sϱNeN[CR6߱}Q_8ƯնZ|t4A?.h5 niT|%yw7(N(mد=jh2@{8NѨ~/`8Zy|v֮Bq)uAܸ.*1Hכ5-ɓTVVo|#G if\. 0 LK(;Nm/fr_!955HtHάnO&JͶnx+k:h:_ \tA\۶dϗb}f=9cydk[;cU]=*~z^:g79;Ӌwҿ{zi,:+Ֆ18'Uk|+zB6 iT4<Ϝ9+WrJ0MxޝEgK%vBkl&,GШ{8;Wp?dnߍtp'P}F %7qB1,&ap&tn8}ŗD2]!.R:$XI%p٧ҀJ1˴+6 J!B11(<N7tCgڴ] !#m|)[8B!#ŅsC IS ΅B!&2 ЅZ B!&<&B!BL !B!B!B! B!B1H.B!BL !B!B!B! B!B1H.B!BL !B!B!B! 0 yCn6H3EݑeϪvs!-:BubuKgKnvNs?v#bn!C҄N̝:,v*@} #礋ݴQlHbn!l[XYƍ1MuذF;A)֭[im}Çs1ݷoǏO?7M>1wIvڕ~ɦMQΕma5nAEzٰaht#qG}c"ur?b8wEƉJu@U'A\8}Iaw1W> N:ƧKEG=b_ٿivhq9(ۿ[6nxy cJskB!/G+V?|׮]_Db䝬c`??s#K/_9B!1BEUwk1rzu}GGu )}[ƅ{1yRg~Sjp7q >8G/B0\qz ! !B!B!B!0.xLӤMhiiA4PJa6لa8999@r6lۦ 0B!B eLz4嗿%===QYYI"?f(,z)oÇ?C"o6(**B!B!&1Yr%'Oo^ 33@"Iff&O>$X5Y*Ɓد ۝i}W) vs)D9=EXu  ڭCi5wM]ϱrYzKd)Eu賓Kph^Dy_9 np"^["GVuǼFy }vGǫPhXGO%AuIB~Bv;{?ǫ3UFn#d=c\Z&MFLr4tFM+Tv;{/ -l&fs"Rh0hJl<纟8.RY'Gmb| Pgη$;Q )BLLc #++ ۍi޽O>I[[@rSmP@i.kkcacW4_.Bk:t_0s,?S5:{IV*n8XH?H!$v;C52F'Uxn3gc9X.'s"`g$!׆M5>A -#fk_\NNGCgS{V`wI%Czc+Bv m4tlnR)[gH?a) s CNA˂xB!&1SNeŊlٲR"x[n%ݍ}ƍ߿&:Diiiz KIIɘu HHBKgЖsӞebG4DDrE]>y1cGrFcmc( ~s8G~V=MrиM0`hHt.b"/*y6lŋ8fѢEtttSXXwߝXv-n7RQQAvvxB!B1a X`==؈۾_Tu55zN!.do_5אzEi)ɹWl4!Itpm: syaXeY(H$SFt:LL?}Ƚq 9 ]C$ :p8Öp8us(ڠiNU37F$1V=@SAB4[%ef}d 5 onZlGBQqA:ȾPS_찦f|4MnPJa&s0577>}:4551{tnDQJ\s?ԁ+&MRMӆ-CuN8 >Ag'B{{X3f{Q^^Nqq1EEE$ qoαcxghhh`QSSSO=%AB!B1Ș#Gyf/\"k֬a֬Y}G?bx^0׾FWW?y衇9VGHhx+!84q3 k+B!RhἨ,QRRBqq1. 0ظq#`￟p8L8Ng{^"k׮oUn1nY!V6Ll$J.Bqz<5KѮd>i$VX#G(..& H$[xg1 uֱqFx^x i 3!NM !B\I[c 'Ọ>o`…a$[/^ɓ'ON___ݻ7'B!B!&1躮ss뭷<>++~$ ǐ.g?)eiڰG ]t!H2B!]׸\4kMp\缮:_ {Zۗ !ĵ¡gܙ@I.BqevڃLΔK=h҄.```-'$N! Q&''^t:@w:У] ! ~'xWE!BBB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!bp5RD"m۸\.8nB)}8J)n7q !B!ʘt۶Yf ۶mr` w%??3fK<g׮]O[oEWW<8>v!B!bS~qVXRTTD(bӦML:{sKSSSzl,Y–-[Xf wy'yyy-״aO"SHB\8C9ڮ§$B!./d5Wj8.r0˙2e 7noA4@Ӵ! DZZZ'cY]w@ff&1{,ZZZNF)((K_ioofl*JB!We'K1},Ydff2k,|>dffh":Ŀ˿w~w{dϝB!B1)@w8>,pǓ0i$կpyx@M!ЅihWtB!s)k6pn7n _p唲"1Bq13;3H !B\ L7JUn @Ҕ[M>u;9ݲvB\X]n'( ЅB!Ņ uQyL⏾xWC!j?e ߟ|v"B!F!DžB!B @t!B!b]!B!$@B!B!& ЅB!B @t!B!b]!B!$@Bk=B! !nB!8 ЅsnF fj!B.B!B! B!B1H.B!BL2]!B!4MC4t=65B!B!eH$tB)m'׾ s]!B!8CnX u> !B!ᠴ۝n=m`Mg+-B!B|Avv6n;[eYbs]!B!,b˖-lݺ4;1,&B!B\3uTt]ӧzGL/-B!B! (**J> ЅB!B+D)ENNX5p)Xh4zEԅB!B1it\=x<>~xB!BqU,!-FpL>ZB!B!.p=cM(B!B+GYB!B!& ЅB!B @YB!Bx0k>ߖerƻB! !W!]uMPJmJ6!B\$@B!BG+|+at:%8B!22]!\!H.B!BL !B!B!B! B!B1\eY]+BuN'D".boa٢v%ϯHlJuǐYB!/d B(>꺎 ]Bu iwjNχz0$\Wj=gM|ϪeY=Nhi?SB!oo-@ubM4@ @ii)>scZ4'N@)Emm-.帖WMĉضMMM n{BjiX233`*<e?M[[~sHb4 ˲8qeKle;:YYYC֢غtl:e ٞ\j6a?B!btEFQJvÔ=T0`&n{ȏ\MS^tKZ*;;MR\D"HV}mN_K?ႀ1^;~ߊ$A"8>G #:it gi0 sQǕzfߨHx 'S!Bn}͚5ݻμyXnM$hJ6M9d~ȽKff&a q|g\.&MĽދ4M^/mmm|G֦[lNi_\۶, әNkvz_۶裏Ķm-[6ئ7m𱥤1i!uSA?$++[n%=8u̓ x4AĶm1qzxen|>WVp8x7ٵk˦M0M{wh4 4t0O>,͔T+pJoK+[onKSw:;۶8M*?R(((Ho{q8<$ :ć~{,]ԍg1ՅvsNRo(⭷b…LM6QVVFcc#555F-JS#uD"=_!Bt4Yv-˖-c…dddʕ+D"̟?*V^wq^_)S0{l6mD$ᦛn"{a_,]0hii+_ ʕ+`buuuq^:4ܜ{͚5QVVƽ B[l> '' ΝKNN΄ 4M#uVu3f0mڴ ?R߿իWz{ٽ{7ǏG}W_}HBwy'6mMOO"??~z233y"H裏{n=JEE<^H$֭[A4NʬY \Ͼѕw__bƍ8pk֬m.:;; ;LT]]UsVGuKn! g{}v؞gǞ@BP 9*tt#%@уPW{ι>y÷At:wuU{,~l߾gbbUVT*CPfZZZxioog~~;v|9~}dd(x;s@ @OOFxCp8P*YD¥K"??{WXjkkˣgm۶%/^ҥKjvA]]ݻ۷3<ZZZj| //`0Ț5kXb.]Bד&xwQT̤BeΟ? Rƀ6 m64 ^-[PSS jFP(0rNRR`p?`ZBܹs ᶋ r.p8OOX,\|Q֬YCzz:,[۷SZZJRR\|~Zez=uuutwwc0C&qT*jCgqE#"پ};/_fzz`0k&<~|N:Yjyyylٲ%sf!y뭷eӦMGII {%>>Ņ /^5OndD֪o~|Mrrr(//'cZ!^xۙ ;; 6Faa! 0::Jii):u Kff&<MMM80XիWs***ѣBzA$̙3$$$PUU餪1"344DNN{#"""""""r@z(<Νȑ#L&B:[R__ r@RRFߌjVp8d000@ZZsssx<JPΝ;t,[Gy:x0wȇUUU ذa?~>󉏏gvv\NJJ ZX06l<3u]$$$T*h4366Fgg';w$ <[oZ&## ={VZEzz:SWWǁH$hZJFz=Jx 2 DBbb`0Hff&֭CzP;@PPP,-rؐhl߾cǎQSSÖ-[ɿyIDAT駟Fղj*dh4L&T*f3nd4 j0 ZZZ>w+<˖-1yuŇ^PLTTk֬رcFy$66V j8tϟgݺuK*G>qqqǣT* ĠR0 <2LXxjZ8Dcr\8XV+byӉ\."kDtu:hf>@,"Hd2 by ,%תxWFg?E(b||TJnn I\\磿%zllLbD\s|\[6 łV%>>~ɜz8[1>>.x7_[[[IKKl6& @p8ϬT*r].ק&\D>ȘEdnp8nDDGG ԟb0ͷu~,4A!G?j{?id2F!|Rk ≎hGZ>iRE."""""""""r""""""""""""""wbE ;@f[Q1[ɵ$na~˵CP%ODy'5O~_К]D4E>ܪy+""""""""rzQ('::߯-ncQ*[;K^/cϓ?bA69cX0Cχ`MELLL`6QՂ&$f|W}^%M }-GJH$0PL&,"$ɖ}u>.oWݷ3-`3BD';FOFaRmL=GR"-"""""""""N޿8Zia0Ir9ě͋bو!>>N'JLj5}}}$''j!--M0ڰd2 zgϒݻb#;b bEff& ͑Ĩ|wxEmc a ,,,6 #@gg'/"?8YYYw>|]>^rt%!!f/>Β#x҄aq\dee-́<bjjP(N#??Bdv,###dggRgY$,^/}}}wZZZx)))_*J;\=\.<8_IHH~㩧"99O|z_~CAA۶m_*VZ-ccc8☞ѣ| _  RHHHb[`WW|'`tt_p8җ?B}Zl,8p_~_~d<###nbcc1ۿ?X_ L&KLL "Ɉpfi/KYl?8r&&&B322'==Dr@ @jj*N?!͛woffo~<ڵ J8F3<˗ٱcn^d2iii.""""""""rvihhGUUw~ t[oEcc#}}}h4FGGIOO7=D׿'q\X,n7_|k޽C   v 1_˿><288saٲettt|tzd2?y/rJJ%kfΝ;ZG?3---z$ f ~6rrrZ˿ i|CJ>}Xz5?IJJ wu:tf/;L||lݺSO=$^@ !==k{&x !e!ZM||<˗s300׿u~0L>}R_җ8z(uuu<裼[_,J!rsXJBBx"""""""")!M#G>@7( ⡇B}`qC$4 Kii)/D.S^^T*=Zyx9{,4a"[߈+R$!!J%##CڰaɂiiiTUUa0LqY.^Huu5+V  x0LDEE L&6===߿GBB|`6~g%)) L`0e.]ěo7M ۔S\\|D"c裏o~V\Q~ӟrξECİ|rr9V$$$ `Ŋy^x<B#"a/FsE9 J',rk>?_E=χ`0\5'"2sתb~#}H$XVt:J,~|>ȼ_.{*\BVh!#B0\"\׷s֡?;6)r9:n["`P*? nygߏEAnT[82C_o#ߏ!**'RM. ###T*lKD>|>|>ZDDDDDDDDD>]͡Vnۯi_e}a&''1boTzqOEH8Ǿ֧@ ;7Ӊ!Ctt4s!t:>&""""""""v_Mqq-mr ZY4 :v333Vrt:?8Nn7)"""""""""VǺvx"9"ElwAzt@D!R N_nU?xc("""""Y鯪r3==Mss3 ^O AF#~zxRaZijjbzzh!{``.GBܵZ-vfn7f:rP((Jikka2p8477x0͸nDբh^/\|> nd2ْ豱1`0 `llX$ }}}ttt Ӵn2ixzzz0 ׬rhjjjb6XYXXʕ+ 055E\\=zTJOOCCCx<B:tRd;0_qAЈIj8q|꓈ȝfTOD!jwww@ @ii)gΜĉX,Yl g6l@TT O?4wn\+V`zzSSS]Xjw^زe BP={I=JBBR}QWWǦMΟ?ϪUhnnwIIIdffյWXb^ 11Q8frr#GPRR"ڻw/͘f8s Kvv6SUUE `03xP* ~_h ɖ{ll, `^Jfz{{vT*arrP( DGG3jjj(++[UUEzzUmmmXV)//_rp8+Bgg' (Jӗ\r F[oEii)/+Vl63>>ΩS.(Jfgg (d2Ο?# ˗yw`0xWزe FN0B!zzzf188Hmm-555ر*rGDDDDDDQ V\ɖ-[\P^^C|AvŹsP__"''`0Hff& K(~`HR|A ?OlCo>0iii|k__AnJ[[822Bww7L&cff\F#_l'?v mPx^VP _---At:_x<'?tqF6n?j6FχD"A0??MW 6n&233ns1hhhW?yyytww366FGG XV, ]]]Rhoo_פJ<02 RI||<9Gz,.^DNA"̾}(//GVs/(őOVVǫD"b~zΝ;JBR100b~~ŋ$388f{=4 YYY=z$%''CccR\gddXchhRضm$&&RPP/HFFNfff8u7سg`j4^}URSS x^J9s??1.^֭[Z_{ҥK키frYL/++ٻw/CCCX,x ^~e]zy衇DYV˿Kڸr ֭[r ݻywdhZzPTTDWWshjjb w%77B ގn'77ulN'> {dBAGG>(LMMrJT*iiitttPQQqurC.k6},,,pARRR JK_r*0LLMMrnZ ">>J`ivD< ޷oYYY_5eeeK,,,rxY~Cf׮]|%oRTTDQQΝbk.fY8X,?ؽ{7'O}I{0QQQ<,_l/0==" Dee%=зd>F#^MCC111rJO0izJ444#<6Rۍ㡿%rjT*󚗗Wbccxp8@5kPYY)~B!֯_/xI#]]]TWWv])@@XKR)w}7>._sQVVl&//rF_ftww4_رcCCCh4կzjJ%k֬_* |>T*<V5k֐;}Φe˖Q^^~UT*eddcǎ/~L&Q*QT( RUSTPSSÚ5k'77JJ%ݸn%KCCXYf җDII J;wCAyy9###v)((p8O<$344gjjA ;5v;aIOOgDGGSYYIll,8JKK ddd088###tuuhZF# `ٮahh)&&&>r~s|>!pbb _^ORR@@jjS ng͑/䫏2??brR4CCC\.~iX|9>Gꫯj*x4LNN" BLOOcZI rJ ADoo/ XV$%fff#ɰ팏lxආ\|~bJ%J஻"&&8<Ν#==]055UtOmm#lZioog||nj0:7t:9{,Wŋ8N(**ǏcXzcӦMu]{vDB @R111e˖a6)++c׮]BUFFLLLZ""""""">4_6LhZ%%%KsgffhiiAR!̼Ź]]]B`BBpZt:*JT*nIgg'6M_v-vZ05558N|Az=(JIKK>.(r5se2 c0(,,$99$RRRtja#J(!E2;; wSWWZ桇b~~>V\)N\\EEE=99h, *\.˖-cժUֆ5:##B [nHXl+V --6Xf 999<`h4Z&++K.鄐iލbٳgMIIIaC=YWe2twwijj" #>JbɎD(:uu]..c;WYZ-Z~jrQ&''INNͿn>/:pkꠟ;w/o~sIQ`0煨4 rtн^/P誅=Rxlq5ONSI}'rPaF.: .kȭexxXpBݎRl6/?tDP(tK"`ciJ$OD"ARQQQA8&99S3VnVȝKDFw#_}XDf-Dr#BϜgz0?P,kuU'&&AT zb2|\xFGG766W\a||\p|>Afqw*TJQOj===466 +Ε+W\.Fӡ룩 x=uuu |>.\p8`6R)FQh .]b``шBApgg'Af3177Gll,2qjjjpݘL&ijjb6룷%n'P[[+TWW(nD"d2155ŕ+Wl)8^/uuu s,p8׭`QH~n7Od21;;Ktt;U܇yP*x71 WU0nF5CFFFC&nXVB466GLL J>h4zfgg5&66G]]"蠵JV0&yzi?t9wYYYBM1jkkZ0 466ۋR{8ɥK8jjj~*+rؿ?111|jhhLvy^aoo/hZz=333vs&''C"NGGh4fgg|2>X<W\abb8v;uuu Zf||+W\ي|(U?@W^SVVƉ'HQQLOOw^6mڄN㥗^ww[WW111,f~\yr9.\@ŋgll,z{{ԩS]LvQQQC.377^t255餩)"v&l6&Ql6s;Fvv6j&&&0͂TFQ1$ Dbazza ^^z%RSS1Ltuu/x'~?`Z͞={c۶mLMMIMM d2$ r{G.]wtJVV333hZx<7A*rIٻw/ףhԩSׇdC"p 餺._LCCX,B*`/|rc0ҥK V LOO(v"rssq/y~i0O&77WH_  bXXX`DEEC?[nf133޽{ٸq#6~?fCKKι\.ls p' ^~eimmE"xx饗tDGG3>>ٲe h4~Rf&''ijjb0dpphn7Nr~FFFZt:~333Crr2. J%ļ1224)))LMMVgK/{ٳgIOO̙3ۋrogyùsHMMܹs/Tկ~SXlUsGDDDDD'n'$$p8BrIXn/2s%%%͡P(ضmpr.HXnR]]Mzz: ^4$h4jbÆ 74CURDze˨#%%bL&lذ(W\aÆ ,[!dppzZ-h4H$őCQQTUUj*2Lbbbɡ LAA\xB***(..L O&66VKZZuuu|>4 999d2Ǹn.\@ww7V. x<?_'++_z= \ZZZZ[>III,_)..TYf ]]]L&… <qv؁̙3d26oތT*c t@}}=oqqqt:8@rr2uuup9:Tzyl455m'&&abbeee:u>FGGĉ/;4`믣P(0L>|,̓.Ο?ᠥϕ[ăVp~ 6ԄF;w`ddD$wno!Hhiiaxx-[vZ9=7ٳg |B?}}}K|/[ܼy3ꫂS0kb8x 111211T*eݺuɟl߾}1==Q߿4*++yQ8>zUo87@֭^fayW{k.T*y뭷{G{ {aʕ9qNMBB_җ8{,|{… hkk&ݻwSVVFnn.wf~~@{{;<#BAZZ{/͘L& ))),,, 9˗/Ev;N9R)6 <@C(B.#˅\BhNmӵHHH >>!JJJ8}4YB, 333Ko#a@ *M6zjHNN,.\o(b͚5XbɢKUUF9:::!&&[F0$..VXŋX,fffJ'"YYYbG%++ _*H$&&ž}ضmJRdº,JdA9kF$'"ܟ\.<@DQZZjf׭[ǣ>VUb1PRRªUضm`0L& Hزe '==tjjjHJJ")) HLLRn$ vtvv#c$ 333b!)) Mcc#CCCp8LWW¦%33ÇٳgEEE8 0 tuu cpj7eRR)l#4:::pEdaZBV+CCC`6)..fΝZUUO?M^^~_CB vBΜ9ɓ'annj~_˗/3??OSS} (J*++B0IOOcلFGGO\\֭"O(B0::4L&JKKٺu+r}YYYtuuI0p'̹q9 ٵk M|WX>:N8All,.^və3gHLLnsd2qqY|9TUUq1RRR(--ettw}Cyy9*cǎʕ+ܹs={\V\I[[ZFùsf``@ SXFQTbhhhޛȁ8---wSSSqݼɓ'+\E<,,,p)222r8<---\Moo/l6$ /^$''ZF!))'NpeXj>>EQ:$v.^Hww7pIKKcff&`Ĩcj!rT*9s\d׮]={8z(VB"paz{{)--%33'Or)++cǎj)++C.sa)--%;;SNqig?aRSSq\9rI{.""""">>4}ddYt:& ^O[[fݻwhp:䐚ZR-[]w݅f(|Ad2nx9EȕTT_G}q.QQQXV 66V(xP*x<222T*+e͚5H$Z[[ fiixJgg'SSSl޼"EB#zDbbb&##D/_l6oNBB)))xW~~>rƦMz̐xK%rj5}u]KZZ[laٲeXV <p6|>wcFB☟'&&!T&a6oJ_#9Nvbbbزe 111ձffnn͛7-+Jl&&&OJJ QQQBE$j`Æ XVIII< h4bccCP(򕚚RDSTTD8fyf3GBBM-~wHR$!!|R)ssss`0o~aܹ#z0lذ,N'p￟tcǎ撞^lfggرt <f:;;fӦMqe`۶mRX8IKKvu:v ax<<ƢP(h4:%P* //T!fOII +Wd||ʲeg```0HNN^ Z-.)))attdlBff&PHDF#)))h4RSSt F#qqqVYv-Nˮ]Yl0^C\0 x^ㅃLjw}8233پ};"b׮]dee111{Bf"Yjdgg3==hdǎB$ D,000)..\"""""/>Jb:8Yp+u?7nX}z%ŕ OBpٰaǎtP(L&{ )㳮D\C* EDDDDDD>  N)j6H^s ny#?p$7r\#|׵Slذp8L\\ܧj"ȏ3Ox."M}p8LQQ˗/GV/icgϛF!|ZFk :S5gnռDrE>UDDDDDDn.zBc;N|>^3H$B§f$Hͺ0.Kk2LX,x,HD1\&""""""""!"zWpJuCX?H-]&]w[o{{8&!!wOw8inq9" !1ĐݍȠ}TOmkDR$H]OA~DDDDDDL`sΡT*1LMGGfӧinnxj bhhٌZf|| dH<ΝcaaPRl6Ο?8.]D{{;Z@GG555F v&::ɓ'imm% a4-===={^f3 zzzjexx .055E|||]{;iiiK6>>' ߧ9w~t|(U?@7SVVѣGC"peJKKYXXn~lقF__0;;Kcc#===dffSOh0 J賳8qflrCXf@ #G0Lt:N:E]]7offf>8z( gɓ?gժUl6|M/_NBBrvX0(f{~zr9---A:DZZsss,,,pe7!::hL&>,(Z-wgg'LNNzill$**Jп6L444000fCV0PV1455SO`@cvv} /`2x`7773??O?yyy322Y~Q ZKK x< ]]]xh4(JaR)ۿn;~`0Z駟$FGGKWWzN8555\.h Btvv/uuu9>l6pKxiooٳGGG/_ŋ:ua~_/K>:::x7r~mjjj_eXb?0K4!$ "hjjbΝ޽[сBanz- VSN /_v#?4B).\Ç BBzz%)2lٲE\7DDDDDDn#7dl۶ +H.EB׭[bhZ&&&A*yfqN'NxNWWM7 77 o88|0G$T< o J }vۇje~~W_};w. 9F#vu] xww}x^׾ƥKOp’>abbbصkcl6DBWWV &&`0Hff&7oF*2>>b@nn.aZ|-q TUU1::c=ܜp`!Hj2,,,,ykhZm3++͛7COO lܸB˗m6|>LVXq ݉,%#HHHH`夤ƍ1 `XHLݻ)//G. :Vb֭v:::HHH$;;*P&qw}vL&w&66 fggf||F#[l!++!عs' iii?~R $$$úu넴JJJ0L\rA b|r6m$\l6h4lذ;wbZx<zjZZZb۱X,LLL`X줵LvMnnU9/^$33SGL&#!!bpႰY,J%w}7d2~?o&9`*| B{[QQƍl»IQQ=N/<+B>|tʖ\֭[{ꢡroNff&.CQVVvpxQ^DDDDĎ.=55dbDEE~zhoo' 9sw}7MMM={:(**6ld/‚f:yꩧ!!!͆B{{{?V177Gee%jyl6466ڊhłNtr1B477 #~3aaaw^233V˕+WP*,[|lW F62 T+fee©SzRf! RX,PRRl{綇M9s~4asP(HNN DT*N8˲e˘233sq9<188HKK 7^N<T{p8Rry(<$ |>N:E[[ےg INNfzz'O288xMJ.#H@"`۹x"DGGJHRBs=W-[˗/qFtz^V+FVXڵk룱QVf.a"_VVFLL yyyl߾]! /ECC֭jBQQQ155Eyy9f2naM]̪Ujahkkv sss(JinnA|% *UV1==͙3g@"/~>jjjKPIuu5ϟ'33bpccchZ{1!g=f^n""""""Cs'''q`6Bq]vR|瓐JbXjaIII!11I6o,/ALLLF!%%ObvaT*exx4z=BN#ۙBYY%%%RYY\.?wލVc4z|>FFFe֭g$11Z-f< aF#@^/xfggپ};dgg3>>NYYHR* DJJ F$f3111dffLqq1^9v;;v 55MQQQTTT^ra0VR8nqnJ%+W$::I֯_OEEƍb0عs'HR!HT*jl6zh R)o~DrЧ$11իW|rf3IIIhZIOOd"''IOO"qB}GT 󸤤DZVxwHNNh4b2())A1336md2 t$''C\\III rrrHOOtRXXHII $''Rch44͒iQQQdggS^^.Diƒ  MLL˅VnvIOOH~^G`)..&55Hll,$''KVV$&&RRRdZ|9r^//9ȊvQTlذݎ"--^&wT*E.Vu˗T*H$bXHLLdʕ-YILLdŊjN';v ??xƈ&''JJJp$$$ Hh4$%%j*N':۷B`jj$Xb~q%99.*"""""".X,B D" R:賳KAX,:tY ٵknust'''oz䐪jկA|; a2(++P(ZfΝK¹? 555Bhd׮]W"Hx8&"""""exxXpB.(,N˻! xnY% ^χ'^ӆD" a*m۶a|>~c͓!rۥCv$%%C "."͘pkRQQAtt4`FRwvvI5vs="""""""=""օvv bluM mn7`'Aīs'E0"8w!<P v1vޱڲȧ~J $FB0.~DQ# ۅ]"{=\e}aT*vBܥR2]*^w[ p;C܃ qqqwȍsBEDDDDDDDD\< {ŝHH6S*;v RILL n*ZZZ0~=J}}=$%%hٳdee199ɩS#&&#Ghhh4J*+ŲDWzT3W*444PUUf#))y?j%55ιshjjBVc2hnnܹsfrĉBÇD(d2q%._L8&..NInooѣtuuBV… B~N>8 (Jzzz8}4fgg9y$$''P(~.OjjunGT|piER  4IIIlZdz^N>Mss3F~;9ASfq%$ rMbqHOOgxxY8rDEE CCC8qp8|CbӴPT\p+W(;z}>uuu\|cǎ؈=z}]~7xg}VUW_}U H$;v;00#G>`B!1:tZBۄB!/ݎӂu8iooCQWWwU=ʥKx<4773??O__F oسgSSS˟y.\~#zzzhjjŋ?ݎ[hnnKq8NN'.`0:9}YV+nVo[&&&nP5󩬬GmFqq1s=8^/R>ʸ{Â,֭[刺YdddEss3K X⭻aN: =x^bbbH$1;;dB1??T*#Ϡ}{<233ΦªU8q_u199I[[ےBKK EWVV؈Vj5 !"7P(Dyy92@l6L&U-Js夤MVVW,//{P}}bb{#1i+"""""""""ɇ477:Z-6m"..6$ (JoߎBdx9<`LF]]111ddd\6:zzzhooHpV,C|wttǏcJ% x^蠾6oLll,n(ΝҥKvя~j% ŋ{9s>RSS B\r~X,?eppBb77$..q/_ZԩSj>{,>~d2Rxs ˣ#G0;;T*E&!HrE8FVcZikkcʕFǏ3'* j+ɖHDXGra>}~ .]Fnj#zwr BR̤)|d2rJ)--#Gm6HR$ zzn3<Qرcx<$ |ebbBH%p8L(˂wy3grX,?N@ ʥ܁|h1%%z=qP(BR$''X|9`YصkjDBii)BCs:,,,N#)) eErB)))Adϓ`d2a41HRh4Krr2EEEPRRByy9 i P|)Rp)AyM60<rL&wuBAu֡T*quo5|>Q(hZʈji&VXANNsssn:rrrdr"ɘE2X"qRTG0A('jLNNʦMt466qFrrrm۶%J11Abbpp8̉'_y 9zP0++-[\ ruEDDDDDDD>  NcQ*05w`u.Hpx^nG i\!HJ:6$ ^WmCV*w}t[?n?=>c͓!rۥGVZEee9JV\ a||VDDDDDDDD@"o{k]("v+zz8Ώe{^Bps~G|q??<|>.y0>yP(/|$&XD t筈ȝAy|WYF7;|R!2O3* o{{  66">w.놽sTyEn>NcGRDDDDDDDDDDD>>ZŽT*trI0:ĥKhnn&55V(G%//19BWWfZ穪"(G触8tsssdffP"̕J%/_͑ܒZV?Nmm-*X8~8111ByΡCroR__/T>{,KȡC ..R)_vv6.\ܹs8رc JG@zz:9r^P*BU!0 ^xF$֒o\VqѣtuuJ… ={ORR0cccz9r$%%8z(T*bbb~;z > W\A*244\.^YXXv/QfOWqw\?~⮊ȑ#477c0#Gt:;RC tӧq!ɓTVV=zm۶!x9|0v Fgg'߿J|MK tACClٲa &cǎ鈏6oތjn#8pl6y-#G /j*8v7n$==LѼb48x  RRRÌq!֭[B`ll āHNN& VijjbffZ?ONNhZ~iT*iii$''P(~d2._LSS8N.\^G. 1L={vt\t^B555Kss3O?4DEEQ]]M{{;111%~>11!mmmL&^uV^;}_:$ LMM hnn .6mB.1zTT.sԄRd``a~~3g`IMM]bOgp\g~:gN9 (JR;c8go(o[7yϺ<$Rb&H" @H$Dι@w%D**OKI{~Ự[XXXjݍ\.gzz%Tܜ 6z=w!!!1n7gzzZXs/^ 2xt7+**AJZZ}/x^(((׿5ܺu$VȇI tSVV&<\.F#999twwAqq1@}a6innd2QXXH$jVшD"}sٿJ=z;vVh4L&|D"cǎe۷oСChZ ===2>>Nww7ttt`ikkplw8̙3JUUprΝ;[o155ř3gGVjYYY… jf3)))3::wyŮbqqqt:VILLl6300F388? /$JVKoo/FK'IW1( n߾oߦG ^߿Occ#nܹsH$ݻ'H=nãBt7oޤ紵QQQ(.\ 99)1 JtwwS__KԩSϳAUU?񏙝%//ٌNn#JyWcppYwADDDDDDDDsC$Ɲ:u Gee%j\泥#G`tt$ /`p8Yv9s wbRd1?pX{M8ҥKx<'==ۿt2??wCJJʦۿ[qRTh2/".^^[hB/~IHHj5FZe>@T4=zL$!;;={vy!v1Z-iii100 >JE$|WDv~YB~Fnn.,--!ofl?Fq\ϴO%Oqq1---,,,w^n޼0G^`aav|>^ +++©ݎ;@Ւ'4Lo25 iiiTWWsܹ^h4RZZʖ-[h4rE9b_rr2V8D"҆VD"aBЗIDDDDDDDD :;;ySSS( P(8qL__ j5w0Ld2d2?Z 6z Oͯ]]]>6 Y\\dmmFfxxJ,,,璘xWE"ܼy4|>?'.K \~rrr4551<<̽{X^^?$>ٳg)//G011Q*\v NGYY%%%TVVbz2 TT*E&m:FBիWY^^F*"ˑH$D*jq:tuuw^IMMeϞ=4_WhZQ*֖L&CRA0DTg*++r ۷og~~w}W8Xzov/uMM KKK477322BGG==={?7660LČlDBZZPT6l3LݻVKAATTT+p}a}҂ft\FFF8~8dffT*7Hww76#GͥY./%wΝ;={մ_A299jEo0==۟uDDDDDDDDD>'>0vc0l6c0p\B\.G.uVQ*deeQPP]زe R x$%%`0 / |>0cZ?rNjjrssQ(B.g۶mFL&X,j5ɸnRSSIKK#%%ٱc۷oGVxZ:u V+|R$99JEBB oÇXYYшjl6%~ǓF!11|222FKQTTD0d߾} sZZABB䐕E^^+BAAX,>^X[( ٿ?HRIFFy5DAݓV'N JGBB999$&&ʢH$s='rIr%CpOK$|_A_^^F///dt+Wp8ݻG>db:sN,CIDAT/Y/,,bw4͛LNN` fffx>q s>D"ɓ'E3@A1==-8JѸ)b!// kD"accGbb'.>&Hp:Bg]B"p8Bsh4@V?~~䣰B\\3ˣFd'C rR)*sy&p $$$|c%o2$2OH$"p_@`0'`0D"TU$ n*>a^EX'P(D xf(P9 B!^ Ig /""""""""$ Pc;0У(Jv i/GяU&y`0(UxDQFqSWXh|Mx<nY7CDD "v7B gϞEPH8ŋ455NVV: ٲe \v>F#:P*XV`sҒP]fT*ill222X^^l6Y]]{ U[ZZz*QQsΑ:Op8d|>iiidzK.GRRJJZZZ(,,$@]].t>|HEEh>ȕ+Ws---z1==4iiiy! ۷oʕ+v233XVr9n⥗^୷ޢSN 2U>dhhDBSSŋ6 C?qCuqq4jkkh42::JWW=Y\x}j 啕\p;wxu/"999d2n7ɜ?bA@ ÇIOO>[n܌NX,t:ݦ4!`ddFÞ={'V9pj(-- Ll hnn& \t DB__ z_0]]]444099I\\ϟgzz+WN|||H\\ q8Fgg'X,A=55E:;;IDT*O&nگF#gϞ`0Dz|>Z-twwٵkfYBKNN%XSss3@ff&`< x[lرcB!VWW7=3559tsssOERϓSۖ^bJvv6iii(Jٹs0)++T"PTTL&cmm 7o$ F$&&ERR$Ο?(o2X,f0GA&'6|1|hނSN!JGףT*|tvvrv;000Çx vA^^H-jY:N>͡Cؾ}vgg'MMMɟpz{M8ʕ+|Ν;8N&''|2j%Fy饗?CD>j +8<_|DBqq1(B!ZZZ8xDZ8pBٳg~`0L&c~~Bۇd"ͶmX^^ jłjett[*B\~`0155E4e߾}vERR`oll'V۶m?t>q|'h"oNcc#߿ZFFF8z(/2ܾ} kkkajT*z=;v젠˅` 55FFFX]]%\.<2F$a֭$:999=zLTJ%TWWB9<˿7t:N:/LCC~{˅$55U8D ÇIIIa,--155EGG LNN ---:t@ e߾}l߾RɫJ8V0H"$۷o'==i覂+r8Nh4JSSC&=|P(aѨؾ&HU2R$ (J###|>lق`l6 &JKKj ۋngffi ضmƾ}(..F)..f}qh4bZQ(ܿiF# Ljj*h}V2EDDDDD|>99Ikk+팍!HK/dNG^^z??&;;[b[oqudQ~!rrr2wܡOdE"~*8N泥AP(tuuEcc# |eǎBx"W^%;;?0==Ν; ٳgP(D}}=ܾ}355KKK;\~p8?{,$%%166F(~K$ Dʎ=h0mFGG.\`eeL&'!OMME.p\qAz= lݺmUUU#^G.377G4Ea0X\\d}}ҥK޽yx Ν;G4}"suv;,--0mmmtuu}t(JR)sssl߾6h4IVl6s! iii!Ʉ(Tdbxx;Jh4ej3#1}'O211A @.SRRŸr7@ {a``_dggD B[laffMuu5gϞ%?Ogg'nݢaN>ͅ P(t:yw`Ϟ=! t:lllFayyIzz:* TidffrMCV!xWQ*477344͛7 !!͆FDEEO _RN;v1 oHII!>>_ׂX*g***(//gϞ=o}?giim۶q977Gjj*:ÇQ(RPP@(QH:F!q8+HX^^QZZ"cccDQrrrHHH```JEqq1 রp8,iii011F\`-[zLfl6rXV ?G}yyFV5QTZL&FFFBt:JJJc~~TJQQPh~~xBe2|>J%%%%\.Z-̐ X \.U ++brx<-//jh4aZqH$zE@vuu1;;˃я~%-- ƐJzRSS  $.̏U"&fXwtB&''Y\\$55LGSXX###DQzra2BӑȈP3OOLfl6cۑd$&&2::*P煅A2022nG"Ezz:㬬e!% RغupдNCCbaaAw )**bccQR)T*x< Z8fnn(lll^gllLv7Wn)r9t:XصDTRVV&MPTTD[[pd'&&dddҜN'DQ(,,$33xtMNNLaa! 7o /ѱ1D"B*vuuQRRRHKK{ P(333B`0⢐򵸸HVV`OMMT*Xz`dhhh4J~~>v5T*8FFF0L山ښPST*V8&??Ԕv?>>$?ZRDDDDDԔ`k5!Uq_$蟆MAEtrN'dϺ ϓ,uM?Mլ0Ղ077'N_7EDDDDDDDDĜjXG2=SC?/$z% NJ%~$U&* H|lll{uugfFQVWW1Ox0RT(.8JR8Yo"""""""""_$ +++jr<PC>iEn>o0HdSOB$!q~Z'Fl>J%<>n?^?*z4EP|yO{p8 q9w?O~?4󑘘T]E,]7?}%(:Y7C+N4e~~y1\[ ru38MZ^{,qYϒp83 y/?c?H$^/PJ__o p8r r)}]n߾MSSz9{,[nEPo[HHH*(`0Vevv~y?V^/ RI}}=̐nfaa"v;466"HHII .`Z1loIMM_60& n޼&33Sx677sYz{{INNFPpٲe hZnܸ2pIKKCp=]&i?[nqmIHHP(wlfggTX^^/E%:t rEX,hZvEgg'匏… tttB0477#H_ǃFy2c^0SSS",o& D"ܾ}V`0 PSE\t;o߾͹s%==V˝;wa65, o&ݻw9y$j)..RYYɉ'r %%% Mz0djjA?qCrO]]J,P(0L?#HhlljC(TVVsNijj_LF(";;sQ\\,^'##P(>};wErr2Fnݺlj-J~hZd2)|uػw/\.fgg?hoo(**j蠴T8G{3gwý{p:|NPܾ}½{8p w^^un޼޽{!))z^~eʸ~:{^ -- J%\ffO"immݢ(o׮]cǎf8N8!xzAnT܌hN8X,455qmٺu+TTT/샷nn*.578q۷oE.ߏ淋ZѣG\|ݻw%ČD"\t2߿ $''jŋ+W8y$W\a˖-SSSL&rrrhnn&//Dyy9===,,,illɓ\x|t:wEQXXHyy9@T8rȗZDDDD'1?0===<("H-sKJJ ݻ4s>|@*2==Mzz:`00??uM&%%% 0$ ;wj"˱X,űuVd2ḫ]FXVj5<^g4X,Q[[Ve׮]j6x^\Boo/j2 hZΝ;C`2(,,$77p8Lzz:LNN266F]]`xGa{UUU155Ekk+TUU1::J__ ,//AEEsssR\\b!==h4ʥKHHH ??[rev;R3g<漼ASiA=w^VVV_#==-|)J!''gS4\FFô)"""""+ѩSBZÑ#Gl0;;Koo/\vYzzzp>O0$lu?)63gpM?촴Ο ұkǼ1{gg'III~ZZZp: s5,T;~87CYYw>iΟ?Ͽ,ywrJKKiq')vذk.(,,LIRl6999 re1;;KGG p@\|\ηmƐH$|[" Q?<LNNVxqP(D4?O([la޽ܾ}rAjkkѣlܸquNl<Zٌ^grrUR)iii( mۆlt< + $''v*< onm6XYY! EAAx^T*jZJjzzpߪT*<(ri % ٳ|0۷'{cQ=όFCQUU%H4> p\Af3$OmoVVw?9F4d2}vRRRPšwwo2L޽J%]]]xv?~ VKYYWΝ;Q*`X1F$&&RXXș3glٲZYYYӹi(r-[{M)x0552MMM"Hp8$%%L{{zL&(|D"innf~~9fffX,l߾l ڵR)[b4Q*T(JT*h41==M||}x˗ʊ=33~3V+& Dyx뭷ڵKR$##CB_jJJ ;v@"ijj׿5KBckW&xFxhkkO[[UUU,11RV+nxCff&/^رcÇyw@ X,u8R6R) z'P cǎ(J7Dezz7x~gӺ:VVVX[[rDQTTD}}=LMMK/˕+W'??ӚJHHHXqqqdffb2or8y$׮]?ܿKriΜ9#p8X,~^J(bǎ糲"Y,d2B;v ..NH?!(AD8\8pEEEtww8[n%==a!Ei%""""Bp8WC@|bۙ166&>^,HNNfjj KFF`Ht: 3~?fe޶Z222dLNNP(Zlllf۔#M &f6 BLNNk$a޽8NaGkdvvUO*2xN'B!z=Bq5^tJ:SSSt:cłncXx Zl ~ 0l6pHRQ*BP,?Bv͑  xo$ >O||'mH$\.J%HQ[(D"BQll|>A*Sh4*xÞVg *1~|ihtJbD"acc@ ϋX|sxσg|>jX֏e?eg>Sr>Jc1cm"eȍ o2_8jkksrV˹sD"pZZZ';;^***XZZBPAnn4r&&&0L?!&&&HKKX,fffd2mZ/L믿Α#GtӃ\.'==;w Jw'O˔nٌ"?Ցj-99y yL244h4266޽{B |OO> Q\\,O#!!OU8G"PZZ*Yiiizh5t䐜,xQTرh4l&==:^Zf֭6 ÞJNG4ERQZZD"AѐDNNIIIx^bffI_.h^pMz(ۤBoo/266 ~JJJuܻwݻwJ^^J˗/c6ٲe {ˬhxwy,+l&p94 }UZβ{nvPj||MkN"0;;Kmm-EH$ CCCSRRFٳ$%% /۷ogffN~mA\|BFF~njVjjjJEvv6?@ @?.]"''U>|ٳ۷oNkk+=?5eŋT*N|qwqqqDQرcuuu,..r]vISS|ml6455HWW^۷o ===SSS4 ٲe nn®]@. kh֭ٳ .JٳB<СCEgg'q! (yppN'& Hff&uuuIZZSSSTUU ]2A{˖-9558!ݻΝ; BQ^^Z&++st:iii&Z[[u<(JMHHcǎGFFɜ?Eٵkccc,//cw%''6FFF(((رcgϟg|fΝܻwocmҥK\.N>Maa!FRuVFgg'h42>>hBii)YYYPTTD("#Jq8QPP >---L&`0Y\\r!H:?k2~DQz{{^#77Q4 N-dWWt:7AۍV,$S8&  D"ϥhR>LCCMMMx< IOOBmFRR0oNGff&" 8KHH !!N<ɵka~~&VVVXZZ󱸸(iii_/ 1Y HKKq˖-`IHH`۶m䐓Cqq1RGff&%%%dggSPP@nn.n[(:#VRˣ@ 9222 333att{`0Jzַ׎tQ H0dΝL&n7~^{ڰX,dee+v;dffRZZ" C$ڵk RUUw'*/..r zzzhhhHv  _N__f~ӟ}vyFvv6[\.Nhllt X,IHHd˸?O0'OOODu?<ٳ>^uزe ]]]<VL&>_~I(٨T*>ܿÇSSSCQQB!C&/ٳgAVT*QjWCCCKt|#G{˿r}jkkWV 6=.Q(T*L&{/VB"T*2 TZ޷uV*++5b{Abb".  ^*vI$aزe ºp( RRRdbiiǤq=^x!RVV`QHk)))BRY- &Hx/0 dgg300D"bG2ݻwΝ;(\Ncyyu *^*z*\qu/|D"a\x9&ɑ#GX__Gדl~oZ7$##2x7X^^>r7n0;;KNNڵK8XQTX,oί~+~?G墪 Lٵk/~FJJ !q8;M"磴"!@333R$--MiD"L#$&& ^%SSS~J%( ^/^:D" ?QX^^Fbt SSSDQOP(BV!TדH$ uVK8fnnT* ^/* 'F7=%%ƆpuNoZYYYaee N%IJJ-&J\\Rp(J0J>fffG?@@/,,F@BBv@ w}}Ų)"lXX^^nDHHH -- *fY8PZXX@ Op0dvvT"FRfuuRI||<>JE0D&!Y__FYXX %% d}777G0FRdnnN3F#i B&ejNG @׳F$0:Ӊ^g||yn޼ɿ7/||X__gccCHØ ssscXp8z!o]t:t( OD"8N k@P###_`(TFuj 9蝝{{Fp8$&&&|Ƨz_~?333½E4evvVȅJHMM֞f#99^taedd_~Y[[[#11Q z pGrr2PipPs8*HD8P[__h4drr.~!Ʉ{?==Ғ FQ*ž?XV!FP߷.gvvNGrrVCrVWWYYY^DDDDDDꬽX]Ѹ) / OC@=8upZfffH$dgg 餱W^yEDDDDDD1m$ >/Dωu4OM@"rPT߱\g]>:(׉y1 3YGhTH12:TL }وo@@(e e޾X?\|u+&(3ПAFHTBOUo>~,P _T mxֹ"X}_*_w>\s)"""""$O}Z_L&C"|od!_ebfz!ԢG*"JEhoC|{C^G {B۶Gm8 z?ކ]}xw$|t E.w6O[O[&/P~'< Ϻ_kGO{?{׏㡳էappKAߏz=;z"3CLO6 aZ?)2l8s wA!Jy뭷y&ǃxٳgJ~c6 Ü9szA  ˿ l߾cuP(P(TTTP^^0l6~399ɶmX\\wߥOVV7o׿5XVGp\_ c4pl6/oMM o"ywdDQ˩`jj\߿ϹsxP%rN'YYYTWWsU=cqqNJJS{@|MSSqqq Ν;ŋٳg*>.\ѣG7?MJ~a1׹r <|˹vЀh`0pe! `eez fWR^^yyyܿӧO3<>N( .R8p.=;v >>.N:ٳ o} RIEEwޥ,IMMܹs=zR@>s}AxPi޾}\Nqq1^^;F$!)),}]OBB%%%( (++ܹs guuur^z%A7\jjvŵkװZRVVSSSHRΟ?ρ(..fuuׯggTUU 2t~KRΞ=Kss3,..R]]-p;C{{;}}}$&&r9 p]׿5qqq( ikk#../ p8LQQvV+!dggsU~w~ABmmmXVҸuGEӱʭ[x傁.H BxfqYIHHvs903??O?p%INNtӃĉhhllDP[o۷;wVD"͡wf*D"Z[[ͥF8 줿_i~m{.v[n1;;Kzz:dggS]]ͭ[9u---~4χbz~?VFܽ{h4n{RSSCZZ555|{ߣ Ο?ɓ'fQ\\Lii)sss w^!:Ǐ̙3Fn˗9|0*&<^G͡CP(\..^Hss3!!AAjj*\|ARSS0z=/_xR)ccc,-- jZZZ())f.]4LFF2[n|ŋIKKf B޽ Z-wz*f/k122EEEz|F|hfyUrX\\dttT}!{ES[[֭[F"C4%..\GV?qݸ8233?UDBaa!p,4 q@^^ Ʈl<9`0m6(IIIsmΝ;RUL&&޽R$''GАw}}FCZZoII ###1??ϥKH$wikkc˖-|>سgnbrrQ߿Vl6=z,tcZپ};|> gϞ}!iiiXVl6b oV%99$Ξ= SVVFYY~< pN|U߿o-h_|+WCqq90jvZ[[wwehhVKAAV/yW^e֭ܽ{^t FceeJJJ0TWW?ӵeÇH$l7xett^_fxx9:::eSTTDee%`"NJ={W_}|KxddOlB!nݺ ܽ{x/nGGuuuɟ |> {_WvEGGǦώr!$}jٶm?X^^FP!HWFf IOO'77"pTj.x5SSSIKKÇܻw5l6RZZfuuۍJbǎۼ}T<gΜjr)P(ٟp.?C B׳0yyy_%KKK8Mzh4BA@P(\F)--ĉ444p-666jT*IJJٌbee5(..vEVV2|qqqFnݺũSv999LOOsm\.|>d2t:x<|>vލN#  zhZL&\.1Z,Gղ!hZp~t:fj^vzٽ{7qqql߾F gΜ[tttPVV=&''ωD",//?qqq\.~m 7W^!--QRRR"+BGG555d20~`0Fd 4, UN')))oh4;CRR/"444 x<¿]>uj5'N?/{Aaزe VN{cXD"}+rE&''DTՅ^`˖-xxQTl۶Tl6NBD"~999&>??Ϲs#!! =Bx8b4'? qqqױls!lݻh4ʅ hmm,h4ڵkLLLpqx"DQF l6s5*[nNF#b``i2228uJRL&m۶aQT$''3>>NRR`ݻw 8p%$$$$8x R\\nG")DI|<~5.^H||<~>|,hG}Kuu5qiZZZ0>|L& f``m۶1::J `ll ---y`0FKVV9993::dbzz}111l&??ER)XVZZZsmq^[[??o~&&&0LSTTdwo>VVV>!Jc߾}0==8Ǐ'-- _/_qh4 wÇb9v޽{H$BWWIIIrv;CCClݺ-wTUU/KH$šcaaݻfvvP(?O$տWTWWsMP/v144ľ}p8twwv9y$\vMP\\ ;v Bf׋d"//v:uff&z^8pf||e0IIINrr2[nbCnn. nݺō7p8 }LNNۋ``ii"ߺu.8quuuȭ:z{{ٵkǎ[8}pp8xW~>$]p8D"eJ4%11V ՊT*D6F"n&(ǃB ` By^f3>%(ZvSN,Ȭ-.. $rPZӡKTv`XCvV vR.F @*GPp8t:!_{aa`0\.l6p8|H$V+>5" F\.. łZfyy ,0˂:ߏD"dǼLOOCp8,K///#HP Ab"}x^t:q:D" ;EBBlll`QX,a"VP($ZV@"FQ;˅RD KL#>>3g4eaa6 L&w6P(bc0zd2 v]8􉭙Xm4%^W {A4ERV Bh4N'񬯯t:FzT* kD7u6660ͬ#ˑdlll`0p(J~?zA//1h4R)T*qqq~b{Nbb"kkkzW5ݎjVq\8N ,--h0L>77o j̖\.*r`0f#bZdzvp8HHH`0;))IbEnQT¡b{Fv!#99ySaeeJd<q6eY^^ AUf3ZVgV+׃i ^քⲏG}Eix@&aQYY:GY7#y,ɟz(͛AUVVY ihh`߾}W #S__8%%%>|3]"""""""""_ "33 mo$n S}Y[[CR}d RngN>gq/h4*x?k싚{D";PFK"|J$|>ZU2rWG_ۍV}!nN'7K""""""""dJ2>GQ&O$! Mu=sLVXܹsСC?СCL&f͚%[Ro@SS:tZ-+Vm۶B[[ɼ[\~h4ʡCl6sux V+ ܌l3߉ Jb|>Μ9Cff&|{ce]F4PV jkkY~\ ˠ[Vy#ٳjɡӧOs5:$s̙g.]DVV'O$pYb$ޣ\tÇ䤼qVVVܹsٻw/֭CVe.]JWW6xgٱcUUUP^^Ύ;Xhh 8NQTB!^}U6nH07D>QjfIHHQ())Q]FOO^^ٳgYd FGRYYIVV p4 .$Rtl6fϞ}ǬfϤ @~~>. Q)**Bד)[V+\vbV+$$$JN]]IIId>}~ZM^^}}}Vw |@MM Zz=(j˓keX`݌ax èT*:;;룿Ƹ ŋVfڵGoo/'Njn:.^ׯ_gƍ̞=sbZ裏`Ŭ]={DHHH`Ν-6==B? y0dddƶm%##1JKK)++v}Y&$LLLȊCx(***"rFFF={6sAR͕7Xky<CCCrxQZZJII 0/La۰a M\\vk׮|rhnnf멯zq:dff6+WsNlrG#G100}5]s8/HCCK\~ICCuuu1VG0dɟ -ŋwi{{;1 iiiotRVQQK/@/366&+WRRdddKvvRǓ"' 55sqi~?rAV+ű|/lm'z~FiooՅjett1t:XYf p8n!|B!~?@ (̝;7R[[˩SXr%G˗op8̻;pǃt:PH.E(* FNRnP|݈bQ\\̑#GЅ5kְev;~_>m۶cQ^^N\\v(fǏsyx.g||qưƚhD2>>N踫{GGw獵Z-gΜpSO1g.^H0dݺu ni&VXyz̟?۩#55իWjgc:;;X,r\ zja^/DQ9&<>>@ ??c2ӧOsA)**bڵ̝;ɲeˈD"l߾3gΰ`f͚p8L0|Oӧ dddϸ\.n7)))|ǜ>}ZX`455Euu5ϟ"x ZqwuuQQQf-ɒ9dN:Egg'CCCX /^X,ew322B("''܇`KGII ]]]\v Nc=ҥK8NVZEaa!<b1mFss3f͢Zd2ٿ?))):uܸqFvv2VŽ6 ,Z}ի9y$6 ŋ6:: @~~>uuulذX,%Z % `{OO+Wr JJJd/b0$/^7466̢Eg?Z 7RRRBII g&>>^.%S2FFFxI؊וqqvl x^ 8..$T*`Q1 r(0E.qvQIHH χݔy?1rIh4l60U`0rD"r,#[q~ZT*EA8F èj"nшjEEl6hTGw݄B! B|>bՊ񐘘Np Ҹ2k>O,@FC,CE:::իL,d2Fq:^h4v $&&rXGRzIMMxbF0ZSX,Fbb"h._yFFFHJJ=F#@@(BFaEa222dfJ%k˔p89z5L$$$j% a6 rZrCB#KJJ @@n7Fdt~y]ŰZX,n7~_Ls'99knb1.) }}}V\.:wU&ttx<9|ʕ+)((xݿg+_$(K tsQillˉ$(NbxheŊ4ѝton'1-0H@ DћH jVqK:Yˎ0U<Eo~ur/A-*#! `0J*6o՚ۯ3MAAAAAAAA᫃ xL M{~~ZPsf WwE2&(kΥf`emZ}p@%|3^E(?FOv11F%ٖٜ9ٔ33؂6ۯF鬧98tp,Яcm/l*((((((((|yQ^Yum ~}#QcĢ0!&G9*AV% \e*-*AE(Jt#Xp,(Uj".үTDkJ4* jAM(WmCVO?&*kB,%NC%FhTTJTsS㉊QQԄca0Zj`AցHEւlը4hT*AN#ǨP舊QѰ|t<2T:377/IDATYIܩ/QP :DQ$ 2תSFk,ϹUr.Kp y>1m>? Bv\6&}Iqv}W)J*}K&p~*A(##:nyѨ4s~3[AAAAAAAA (,^}rA x9 j55\s_&ɘD9m[[ s_w;&3.?whjGK1.l÷+Qcȍ#8sJϕ>GIr ސw/Yg?`3oZC5J#ы쿶y)^?:gPX_T:+bQՏM<̹s<_x*KZ&R o?}ԣ8Ȳ6SZZfF!{IƢ(޾ k 7Ui9r=/\ky1/  sC!ʯD]& ٔ "lA Fji rˌ{IKguj :j-g'O!DΩ&7>!,|!cTG/N)I@Ǻ*3*Yɛ'Yps?_<̅$jҙx|XVqZ:; DqH,_k:qDH31dI=ÈȑG#OC_)I)%΍ckVV"iOT>._\dcGG,\D.ƽ<=i±0{/%ÒL&4~<~T#Liފ7eqbtj--l.LpTmOg3¾  XZǩЩu<^8^G/˞' (O-g=Ik݋RZN1#׏|CZwʿÉ:,E 荣CnnE%hod}z **ȏ&fT ΂Tr˶9߱8k1 7օSs±0g""/@IrɔHk61ߍ#?xGeEeF%y yf(Kpf h'}12w%h0s9qm.""dL{{:n{ޝ" :4gT\L8f;!_02'6 w-?VqڮVrq3'TPQTD]_CbY2Ɋb]:F=z" de~ۮ5ޅ3gvsf {d *AŤ>?CG X¤BZZm5F~#~;hrCtd3BEZe)e%QXH)Zw*35m=Q^;a; p.fY^+̓\^?qXV|t#f/%ÒAg<9?r8x ;;w yF}ITW݊2&NǦMRM8Nvu¬5 }+sWbzzH"1d-:AxB-[\A ;;._ è1RTRSɱp M^#ɘD)S ɦdj=IB%% `۩YC^B?! rs꭬/\l OC!l΅ N \PɖkXyؼ6f%T8rGAx'Ǣy=:3>g #`5ȸoA c1TJQiDx^9.u;ogIe/C-I4$SJSl9hW)~\]f )"Ѩ4֨Y>k9DQ>!qtۻM~ m F! 8p\qx'6k}td7^G܆;rOy">NTTJPDZ{Ψg&+.<? D)xq _]v'ݒFCtܤ"QGAAAAAAA]cgg嬕hZ:; SZF>/'a\̈gJ]dL"*FijX1 ϗ> 魡*ى,6_8}_<#7 ]P |;$y)±0Π[)N.fcF]l.l-ʞ{Xyd+/~Ikp4DV\O=EgT)*-߮6΀-%[sy {I3(s:}Wxex9>/ P4C\0L&nF9s 10ᛠs˞gKGΠH,칼VKP ofK9|0 6fm,z :ApĘl GALZT-1+¨1Le32K ,: (0hTDDA7jX,ZƤ5UoE OȃQce yP4T ؏/COC$3Ui=DĩR7q}kk5zBn"TM & Uk>YO,*A5嶍H8& aS}#ZE(+40h 5FT,ƀQkQ j4jWZEgR>5V"Ky/Q3VøZQk$2ֲQk$ O%Chj85*#J˷#hTy-5FZ#E<XS}a\qAZ(b[dK{,ì3ccSmҚkZleH, kZ+h,@8ZZ?E)J.{km1 $Gp&o.JtFvp,=3ﭿ3͔Ͽ*XDR(O+|!O\ҳ:M4Sg91ݸ*_Ї?ϭJ036 >͂n|Z{}$I&p{㾋Oo\3d"4|Ր;l4n@D$ID._ƕ}4ZPSWF3J 7_""K!^o _DDgS&m6}bbOYiC뼀2Վ 0ah0b6ãF7=n߇%5%ɽ\gdl$:goc"c=l 7 G4d2} *,bZFV|6eDjCf)5*jJ_q*y먧þ$DQDPO݇Gy8VAAAAAAAA˃J=DzD" x^DQ$vq:x^b)wX,F wDQ$ N%z8N;'$Fx^BP(ۉb3Eχ z3EQ$ňbx<N'@@!'p8tDEߏe q݄aYn[n[cs_~_b"x|Z-Zݻws!ZZZ(,,dbbK200{GMM cccp~_IVVׯ_?q8?ڵk$$$c;ƕ+W(++CgoNww7h4mΝ;Yl(p.\9s8s ~!`ZٱcǏr9~8W^N7chp8bɒ%c9y$?'9N#??_ WqM=J8FE1ͼ봵QWWGZZ'qjkkh4&FBB`?40L&-[F8yW8v8q{ީO2:Ć Z pY֯_F(V^x h4;v\^J}}=`g(s(r)8IOOɓv ٳg员8U>vD&33m۶ؾ};Z^ݻinnn9B0ot}ǎj*Krr2G!PSSn}{Ƨl~CPPPPPPPPPODA[d"..NKww7 Menjjbҥj}DzzzHMMhF'&&صk8Yt)*W\~***زe gϖϏclܸJX~Yt)[nȑ#LNŃHOOgbb Fsc:p8%''@ @FFۿe…8N`0r>E|D5kְb |>g&>>QzzzXl\rFقAGGNh4yꩧl)]dIOO̪U8z(,^^z [osVUUh"<z^kp|JJ`0 q:nٕ}uxevɤĩ߁DGףBL&" 288H j>.+((((((((<$~y>#b騩versse˗c2Xbl-YjK.EE,Y^wߥŋSUU%K/ܹn4}Y6%WoZͿ˿0>>()))D"~mn޼h$Vjjj'|*(+W$ ΪUHOO緿-h!rssioo'pU>l6ַg?OFF۶m222Bjj*'Ob,^jkk)))aɒ%455q.\c=Zǭh ۍb!==1233˗HGGcccZ  p 0,].FGGf``Fff&}Nwq?r555rҼJioo'%% 6 hjj" ~z9~87n`̈́B!mF[[ϗף&)$Ν;G4Nvv2VŽ:9ԤÇ3g9z(CCCdeepBمd2a4󑛛KKK 7oFȞ٘fHOOC4IKKvn޼I(bݺutwws֮](ccc299Faʹ0wo}{JJ uuutvvOr477zjhlldٲeTVV~)=;΃߱z \N$":FGVc0dۭHdF"h4*-e6 󑒒"[aʂwk\l&ӍF# ZV˫T*L& ME XH2 hh4 b`PӕKl^/K򐲦b1t:zH$B0`0V DQF, U{z_%Jc;w>?sA@ȿK5 Ph4`;./χ%55U^ҢI~F^ן&AGFFHJJh4Z!K Q>EQdxx `*d)((׹^gppPǓ-'֗$iJg||\>d2VERH6ji+ dJ" ɹx^~?)))9a0gZD3֤W>}+U]B >[}R[ݩy$E6#%zYxn훤i"3[w'IY_{<4OInf3m}ugZ'>8NSNNN+CCC\|Α} LNNr?̹&&&zz xZfŶmhii!ݻcǎTUUϱc;֭[^$##;vpI&'')..FV(vu~qiDQݐʍiZv9}4gn_K.|rرcuuu 0w\=?? ._b~F?*x}jkkx">`׮] ɶyoNuu5(pIژ3g|GՑL0dΝ8qGb >>ŋ)--`0w(3{O! 7^Aϑ2͇at:ׯ_gΝ̝;V+2sO/ʇ~H]]ʫJ[[̞=cǎq)y222`Ν9sLRRuuu\.̙#Y3j"@F9q{aڵ۷A}}=iiišh>x<9fY2~y ?G"FFF8p\Lxdvv6Z\ _ ]/X˗˖ZYhϒ%Kٳgٻw/ގF!8y$z@ @GG555[;T;v2͛{-[vYA'd2N6l>Çb?Ov<3>o}[z͛,Y+W̿˿d߾} cٸt?g|MZ[[ٰalذC۷ogrrԄbzٳg OhѢe*n_SXXH[[Pr9x𠼖nܸAss3̝;x j5?8{,.\@}YvcX8}4P+WcVXJ2>>N\\/qqqr?;;;9~8h%K|2v399IFFa#pm۶qF TTTH,cڵXVك`&&&j477cHNNf֭?,_\ )wEQ\\Lii)O )..f޼yhZ,YB0d޽׆]] Ìs\zǏ344$666l2|,rrr3022kF4%>>z 5k|+WpBjjjؿ?j:UBB---$&&RRRB\\j*`jw5k0$&&n1X,f駟&;;Jŋ/ȅ f-ewP( /@QQq1Yl6l$$$Gjv!+6zV+̚5\hhh!zdz}vFGGU*7oޤ??cوNcӦM444p86l`Ŋ||T*^xZ[[ ++'NC0A8|0j%!!DQΟ?Ϯ]HMMs1?͛Yn,DPT\t: t]]]rDQdD"RRR8x s̡_իWc3|sINZJss3XV݋Vh4ra>ĉ (++c֭~&&&322¥K||[ߢ F#rX,~?gϞeڵuV *L&(,,T *k[rJ֮]K4Y\d Q__OSSܸqN:E}}=B,YZ->INNz KyIMMa|>opg}VpA͛79{,466|r/_nݻw/``bbEVVk׮ח>L}}=Z\|_˖/"dxxbj%55U.I&k4B`PvCNHHl6S__Ϲs0r7jQo}'/__d\v P(D__P3gM6aYYtR"/VoD"kkbbskJJ z^Nγ>˲exꩧhnnFv{b1 t:4 K,aŊ3cFχdrrRJBb0xϟ?_fbA"V9)ʲehjj,^XJKKٸq"QߏJ" bT*HHH  q5.^HGGnFGGyW)++cҥEXv-@͆b…xQPPPPPPPPx5>|ARSSt,ㆆd8//gRRRBAAqqq>LFFO<:NFahh|>qqqaBP]]͙3gt6իW7o@4 ,Yׯ322ʕ+`tt1'NA<UUUBvv6k֬n3::?F:F#?yRSSCEEղ` 11A{{;n#̟?NB`*IZʕ+w!..χ르l$99X,FCCիWϑ#G!##H$ܹs\餤\%33j:::ARYY눢HII/#YYYܼy&++uq%IHH ??SNa0Ǡ[,nܸAJJ ׯ'--nǙ5k477Fjj*4440g0555b bP\\LUU/fѢESWWGmm 99;vpi-ZDee%yxtniA`bb@ @yy9hTN4VQrR#ɪ(YxnM%Yx$$K b1"+#շNIILoY F#fH$B4ۑ,Rj]t:|]).⒥% ԆxKMDdy8#F!}ڋFb14|tKh4Y~de̥^/mmm399ɿwJ%%QVRdiZyHjjjܗX,&E֬&[822BRR:NX Cr֥Ri( !/Mdò[?iKM_CNqOj99זRghhQlPT ӯR는OzI,9Rg4RGi͓{D 䶥k={ZAAAAAAAJ__l˅N#))iF%!KJtzϟrxxJu[;yK &'mL6$Λ.?I[x$˻疎UFSOv[2}I;[uNk֣J!;uwwv[poΛ>[ކt-Ʌ_EF#h^ǵq=_&n4e9]fLt*/=M6 fݡZ'AJ=h;V^vj︧ɒ_R\d2=2(nI9Oc|z)((((((((|ut[Kܳ]r}=,|>~,peپhx^UBE7HIIy>;^@ o _ DRhrGG*?~Jm|\6)\vqJ==πWAV> thDEPbDQ' 299)gm$Ο?O\\b1T2 ">шdff2::JVVccc,Xmx^F#v^*++ $199I(">>NCz1 )继6DQb6+vIee%h1AZ[[Y`!I\AAAAAAA]ˬܹsp.Νrʁhnncɒ%sAc0qMNN:S__޽{YjFqF5xkk+`{rc{zq:׿ŋrɰ>ӧOs ***8y$ODVV999T_ sn Z-ݻwD[[ vž}ldggRرc+V@EKCCMMMΑ#G%>>X,ƾ}8uGaʕرZΞ=Kii)&IVN^'ǥs`%c4r eeezyC?eZ[[ٿ?uuujW_vm۶EOO{^ORRo---x^PTx<F\WpQ=ʮ]Xn{r`XbrzZ-oi4"[.F Bh4>werr3gP^^N(h4t: T*NZM$7 qqqr]4?RVp׋%) ejjjسgD"v;1nB!.믿d"55UBzy \H!~_cZ岓v]' =C7HVEQrvRu)ݛ^~:Dqq1zǃ! ^+(((((((|y2kwUqD"ϟϞ={'7`XɄf駟͛:u ǺuEr(,,d,^X.n:tܹb6nȮ]:e՜9s@UUV˗/zjL&̙3}b ̙͛7IMMgϞs璘Hii)K,aq---A(**d2QPP@KK K.%!!ٳgb ?NVV .dʕ 300?ҥKq\XV9vpEBEEEAg?Νk׮Ѐ"ݍ^7ߤÇ??p8PT:uFٲo>Ұl߿s |ʕ+ B\pΞ=s=GCCUUUTWW3{l._ƍٽ{7ַȑ#t:<ȼy(**"33SNg2D"l۶Z[[7occcr뱱1F}m"+Jww7K0vw^]Fѣʛeee|G̟?۷z9|0>$ZZZHMMe||x:;; B?~zT_Nmm-c Z+WoA{{;77LLLDaaa3]A߷oqqqlݺٳg‘#GHKKvs1Ƞ@ cZD"ڵZ&''INNߦWb8s ڵP(Dzz:1tttΝ;>|p8G}D\\z\›o ZCaZˑ#GPTx8q8NvAOO3gO}}=_x> GŃ(wM]R8pcccAYlh? b4 =zJnn.@555r;ZO^/iii$%%$Jkk+* 462ha&==Gnn./"^^{M:;v9s搛+fV^MKK CRa6eTMoo/k׮B Yz5~b!115c̱X ͛={6&o\|͆餡 ^yr./"g&''ɓ'bҥ_CňD/h)f1.\ 0\.~mt:677Kvv6sΥZ& ܾ ܼya~SRR"ߴiMMMl/[ 1x蠬'311A$t:g  ݎdb޼y<$%%1::*399Iuu5TUUQYYIjj*ٜ={üyغu+IIIl6HHH'? W\F/F/#/F^{?lVZņ HLL$77I٫^x sɞ=\tǼ tvv"" ^~e(r8uf l2%##j,X͛CrM$ɓT*!..qYr%ׯ,_K/QQQ t((((((((|f!~DQdɒ%lذFCii) 044ŋq8l68s MMM sehnn&p|>ͻuҸz*W\h4bZhpǏСClٲ`  n^{5A`ƍN=669}4DQ˙7oN۹q=:III,\g\Fٷolݺŋy7ٰa6}Z-EEEapprx(b6$L&(EQv9aj3h4RWWGgg'IIIx<`JL& lٲꫯRUUEEEݘL&ݿwB!rJ6l%KtTTTٳ)--tZ-*JVN`ʭ8??"?(r팍}cMLLD`08H$Zt2<<,oIH6aT*[,)[,gΜLؽ{' *JTC!"vǃN#.:N ) <3j5fʷ-%//OD"37{l{9._ѣG)))<3:ud9$CV Nn6C]]/\'#99^ω' s V+L&V\ɂ 0 lڴ˗b f3K.%77˗/Kqqܑ.;wWϒ}\j5>N҈D"ܹqȑ#b1(**Ӵ2>>NAAO=z֬YC(bΝtuuOݻFGgg'XnK(b˖-FvIOO>L>cBwwlҥK̝;YfG,رc̚5ףjgĠ3g9 Ujj*nlz=՜={.&''Yf hsDRNUU f$##Yf=;ŽsqK,addffϞͪUp88֬YFZŸ1jkkYp!K.cХq^v0CѐCEETUU +=)C\\@P(DII YYY?6IOO̙3x^̙Caa|db||\.[ ^Occ#YYYjL(===8]ڴX,,\DSSIIIfV\͛7對st:)//nK6~~E8@OOk׮eѢE\t1䄅$&&OVVH&222HLL$..Jűcg匏S__ϼy󨬬0w\l6yyyL&N>IJJDQRRROO!11h4ʥK={6N:J?яf[Կs1o",-55uT*y>M9ڙ.ϑ9~>Ea222nTu~.]D0DE ɹmz:[ϗy^/~_~鞗 w[kwm}\L_ҹӟҳIbz_{G{/sCAAAAAAAQz\.\ mˬIJOgR3e9˟kObyН *}/;Etx~ܺAr&#Fh /$s1}2;IVwm8iߍ*_΁@b1/)nr=p/KI sslܭ}~>Iӿnϙ\Y e%4wj( 222^A  qz]Fvc^TχqK.0ָ/+:\.0摭#i.(EEE3,CCC @zF"7湤MFѤm D,--v~ gQ'&&,ߔa:5ݵ눔#a($&&>:ޒ+rZZ#OƧِ΁@3=:HF|v<oY)|S-/z<U\MoMAAAAAAAA᫃JoY=èjz=X1&''1̈́ab0h4B!0rlF$###h4,(266nQ7^t:v;b1L&`a(FH$6Mng||^?#:h4rqy|ƻ\.r٩Q\.\[J`0xk_|>l, @AA]&gq$z{{%##)Z>G,~!^N9А,s)0ɄJ100 ?i4g(譭rh4v?13g`X>Z(vh4x<ۉbtuuR~:w=_fL%=0=f`` 'ɰQJ{Yn7gcgΜAFh4=x<$''?D+(((((((Ξ=ӧs^/|;#޿?RTTą 8uL&4 G#GrJyZZZhiiDV%vt:6M($''cprs4خ.mFii)I\.FX+mmm;vF ׿&̙CKK l۶l^ʡC8w oAgg'`B̚~&''9y$*Gc֯_Ϟ={p:|cʬEQN'nZfh7D"|>t:^ëh$11P($mmm̛7H$Fabb#o^LLLVF?&x"\f5.h4z17_W+~!wv t:%ǃn$&&LmLNNʛ~hQ94vvM?P.&ccca . F#+O  ++Kޜx Go[,Yܹsx"ccc̛7A8<ϟGֆ qG+++Yd GRb=۷o'eFFFW_}{Ç ôvZRSSgl:HoA4Bj5`:Ykג™3gHLLdѢEuVnܸ /|n__ǎOOٱc\zɄNJ4 tuuQ\\L{{;OOO|twwxꩧr VGOO;vVIHH'?)-f}<6 B!ϟϖ-[0455qa̙Zfl۶ VŋYj|nSS$''n:jkkDQm6f3hjz{{7o2<W_}ܹs$99fʒreF=zIJe466r5 x((((((((|i TVϟOgg'{fɊ{]]˖-# q͛Zr!V+x^j5v?pGiObb"bVF# t:t;V% n:9)Fٿ?$$$vh4kj51ٴi,3A3Jt:=JVVeeez:;;`T sαrJz^bz<cEH$֭[)..&11|;ܸqݎ,\W^yX,d2 /GJJ ::233Yd k֬ȑ#DQL&Oyc0kjjظq#[b7oORRb16lŋbΜ9_|ORRsαn:v؁dŊi&DzyCdeep8HHH-[pe233O~… +V+pڵLG]5 D'd2Q^^NRRRUU&pimmrq N>M{{;$$$''rdeeŋ1XѣGy1b1Np8gZ-V"dwo)cxWW---!//ߏ孷ޢz ZM?6M5u\D"vٳgyg[o㏓LFfϞMbb"~˗//Khb`4H, 6f^O]]ׯ_'==]~ƙl[>WW^7 /^L&'B(bppO{{Rzj/_hd…̞=<+m:I Ann$!772?.[wi3QZjf e6CvQL)'OM6199ɾ}p.oXp: !":$oDI(AX|9Yt)EjEݎQl6322䤜chhHkj1h4L$H\\=+VիgfCV399)oiZy3&##222b #b19o$rXj'7۹k zGG LNN`ɓD"^|ERRR#)) L&+VƍfŊ$&&d*++ -[&LJ1tvv͛EVV8pK?iiiDQ''RT444.^n'??_C\\W& w^ٴi>|X,F?yyy\v r1ؼy3z{2<<'##SN --/288$*\]FEEYYYX,Z-555chfĠ;NT ٘f-[Fgg'W^nvZT*%%%jFFFPh"fڵ Ozz0~\"׀_lPRRʕ+q8~/_FzytҥKYhn0HHH sy43!;; Yp!rm' b͕+W8{,dggN8||Ʉz/^b, yyyh4㎓$.\H\\`ZYbCCC&Hii)>R<Jr0fƠ;Ν;ǥK$33xrrr@ K0 TVV deeFGGs%))233Y~=n[h4sYt:K, Nnn.7n'..G~~>---$$$J a/^Lee%NEZUU墨VK{{;8NN>b!..̙3GqWPPPPPPP: 1nJu;`AEQц󑒒 r=p >c8'>wobbɄdT\.DEOt5y2'͝~d߃ςdȸHKRrb?M>'^0׋orO.iھw볲&F[q\t:fw4cH/wN?('}~H/֗Oj~i26֟OqZT;wmҿc;;w/Vy>1bO;mztZ}5}cg+ygO9$ܩ!^D*%Ŷ><^y9-f͒&2#h4ί&9!Ճ311`b|c^A`||Ʉlڎ[ʑ A(Ɩȓ)|6s  %%k{*((((((((AdRRPTwɼWA||eG=Ni=*X}}P~o~O? }wMt:DU b1 uxC\ @QrrrPDQINNl63::ng֬Yr2~L1&&&HJJ"##vR\Pf3v99L$==Ay&`4vAbb|IV~~>FA(T*FFF`ddDNNG%m6͕ޱ'qM&''Yh= ,_6<hZrssh4gdd5X,r~"D"x^2Tv;@Ln\n``NGnnl.RRRnϝ;` ''G>֬YD"zzzh4ѣTVVb6F3~hX`'#UHNN_q:r5{C$att{nDCteJEb^^=b~?}}}7.gp}}=}}},]p8 H$ѣGYlLgg''NNΜ9Cmm\Sf=ʚ5kW_L~!^fMAza 7NNNk)a$(266b믿Nqq1&I\1L$>{zgR__OSSo~&&&~nHNNƍ޽帾sNUU\Zh4>tڀB5FFFKI5n7p~Bm/PHn2p:LNNp8СCR\\Vkj[,^/6 ǃdR,e}~_n:줣|2-w\/]o~N' .,Z illnSVV6`F\›oIqq1555T* yp\y?эn4bHwIQ"%Z-[qDZgf$)W;Wl8Dɲ$RIIŝA }ߗKh޿?;HɢRSŲ.s=y9TTT HĉBm۶quillF+o>֮]=C*͛oIAAk׮< 166@PPXX(Dy 㭷nxxx0I177G?X,D"_xIHHH( z=gϞ%66ߏgڵ$&&r%B`VVVo>Wgjj@ @jj*p}ssmj!fggȑ#L&Xv-:T*Ο?`o}[;v Iff&[l_GRQVV李ÁJLll,;wdzz=zk׮K(BRVgaa ]0@  +WP]]Maa!/8xએCCC?𭺙,^{JKKٷo: eiiJ!̺.:;;D"LOOBGGF@aa!\7 p|?~˗/sT* B,..p8,-- Z͆ 8Nl6nR)%  ̮]c~~^F6"KKK~^~eػw/2:^~evڅ`VK^^p#pt*`T_V b\N8& 1 2662ZRիLLLʊoINN&..un}YHKKcffZO?M `hhEx ++fZZZHJJbyy9bcc2q vcqqϽY4tX,Μ9֭[fQZZJuu5?~%XJErr2ݻ۷#J0`0\.jLJJ z 6pArW.'nc׮]?χT*|gllLЮOKKKXV<d~?^ $f)..FѰuV*++1L۷M6m6ٲe bZy9fVVVJg$d\|@ B!Ξ=CT ޏp8}:D\\uuul&&&df.^J(JN:Bss3pLRRb\.8֭#%%p8̥Kr u:ݪt+QQp8Lff&qqql޼FFF޽JŚ5kP#ˣՊbaϞ=355EJJ v79I֭[q\RVVƞ={t\~V˃>HQQ===8x ~?OfrrxB,Vxhkk#))kZz$''.mut:z*J]vE]]Wnrr7RZZ*ljRSSnGLL B&)++cxx`0Ȯ]l6^d2ݑ9a2Xn~"HNNR  :NԌejj BG}NKK 7nhI4=:Etyy9)))rxIf o:^z|a]~<h4!p8`6QTٟٗrsϓ9F=H`Us8RSSY~;`yyO=}-x?xp8NMl6! p8 ZDwt/*PJBB=v299)8?DTb4W6;GK E"O/'H{4!H8-&&R8G"?SL&Ӫ߇aDߓwYd5э>G _DB||GRY]D"d2AEDDDDD[s|۝177wWo>d|s^'9FPv4F%\.mD"²].N^7c>88\.=>G"\.- Qv^ " sK""""""""_eZ^*ꎎ@EK͛x<$&&~*=Z{7Z?@#'%%}H$4=vw/7o}MDDDDDDDDC AQ߇Nvso槹gu/_v߭vFs2Z^ރgmH-i_|5 _;|oG[Vh4B̠011qqq( <caffJFann!T*Zw2|>z5(fT*axx@ ^|>xf3#j`0(9jgll얲T0;;+;a~~x@ӱn 'p`0arrR};(ܑzSfw6M>sLFll,v~r8fxxł` 000lF<~/֢%>EbyyO㡦\.WNvca]IDATܬ>77/ @zz:PV{[8f||U,.. tll,+++|$addٌ^G.3;;0\.2 288nMOO sB`ttT(vŏjllɓdeer\}?Øf >w8N',,,?r^ ôf͚G?N^T*enn$ *ǏG(رczA]b~~TzAXXX`0v.3·MRt:{ s`@"099:R墯O  bZt IT?@# n:^ʩSznn. sQvA\\/8x /_̙3h4z==+BGGwᆪNr3::ʹsHMM% qZ[[!_Ά hnn旿%BBɱ_t:t:*/266ƅ (//T*8s *H$sΑ "Htttƹsؽ{7ׯ_矧D%@X,t: BLNNhD"H$~B D"fffyWWկ(((:-,,2k---455aZ<|>.\@aa!/\v ^NRw===444yfd2@LNNb6d\.T*~͆gddZ+++ %gqq8{=.]D~~>Jqar177@ KKKH$l6`xnEc=>>ѣGE133#Ԝ ǏcXطo. ._̚5k}kooѣLMM1>>N^^C(x癛RN8Agg'»~qFGGh4cXhjjW^yaʢsۋG*9)))a}JKKo\z*fVR$p8h4,--o[ ),,$ )%N{̵k(**vT*lA^C099 vbpp^}UvA `ttp8V% 266&ew`6ijjiZP^QoDkk+A^xafq +ll߾Ȉ0MOOcXj~n7*Ed2<*8NRSS r=pgΜeq8(Ja>vyڵkYk׮QSSCww7pc!K/1;;׿ftt:rssihhҥKtww 1 ?~3gΰgr9¦}tSTDDDDD@OKK XnN"77{K/qSUU%8pNfff ),, O .Brr*=>>Vw QC5&&B*++iii!!! F#TWWY~=)))\|;vPZZ$`6z*rR mmmL&rrrȠ\n:;‚P`0OKK 7oh4RRRڵkz*yyyl޼7 wIyy9SSSdggqF #??_NE Ϙf\B?###LMM #[o177?PZ6, WRPP׮]cllYJJJ @ONNfӦM\.&'')..7200@ee%]]]@bb"uuu>.LSSCCC\.xwHOO'55UwyƑ#GX,LMM155k&l*;wJEkk+fN> cccB!J%Νra28v66inn&&&FCN8Aii)ɓsqfffn/2]]]_]]]sNvũSJsp$aqqqxGytb2?cyHIIa{$X^^Lƅ ذa/Rׯ =7jwuuww蠿+W̤~Vfggٹs'[nٷommmSSSCnn.555 TǏgddDx"׮]#??^z*|;A4$''f"h4TTTlWbiiH$.LNNLss37h4nD'hZD"s222HGra9IAAϟ$;;vvE8>D.#"""""'1 pm۶100 ,ģJڵl۶ ͻK^^+++XVo=9ER!Q*^XK$N>``ӦM TMRo8qB#@NNM^^/"n@ [o͛ݿ?l?~\yt֭[0H$ZgڵdffSOa6{mmmeӦM|$d2`&`\r׋L&P(ѧA.COO<@ESS2p8L0 Á\.'jP(Dnn.>(|{ڦ+.t:֬YCmm-TVV(ͥA& !{aΝ͖-[())ٳa$ }}}|>6o|/''WT*X,twwV塇b͚5x^RSSd\|ÁB```{ݭwH$\.-[`[~c~?jZT233o~þ}d( d2*e$ ZjQD"+ˉv Qլ ARxo`0Hgg'.nN'CCCX,Ƙ\D0 <v.\-[tRTTDUUŜ>Ζ-[hii!%%ױX,TTTh~:]]]Occ#uuu$$$PRR4 \.***H$466288Hii)BDEff&eeer5R)j|>XTO#azzzd$&&rbllLpljj*nffflݺ"`zv!+A566ngݺu\.}]҄jHWWaaozzZhSt~deeT*Q*H{{;k֬\0֣w"D7!4&z{{0*D@BD"! P(0͸\.aP*ddd)@,--155֭[iii!''Q4%%%ʢ^唕z*CCC꘨~A:00@cc#yyyH$aBDDDDDD>44$F4 'nk֬AVi&6l@ZZwfzzZr9&77H$Bww7?EEEj9FpCqzd2D"\rTR$&&FX(ZVrssbvvGVVvb˖-c0555,--qat:iXbvv\uuuz:\.ŋB[SSS@*bXHNNfzzǃnGP,$&&v6 Gvv6:n8^t#DPdBPFƍfbb޽{jZ( Yv-ϳgV+ӤR|QnqrY [l!Iee%vh4J||<> EEEzy`Xx衇\4=Gbb"FfggQ(Bϥn[xׯ_GѰ{n̈́k4۶mX8QTddd022r333h4jʘ& sss QHRHOO'//OxsrrP*D"***X,~A+!!X9ppLNNMYY@FF裏1 BjJ";;%|Kؼy3J%l~n݊\.'c0HMM6j%==uֱ~zZ[[Y^^&77Wȓ^n۷o' r̤R:::߿HYY 477S^^Ύ;ɡBYf vI:Dnn.PRRBuu5wA.^(T/(//' ɡ+a'""""' ql6+HX\\RVVvWoxn1EjWN9zqqQ+}D=o~Kc,E^Fq{Z=0;;{:׮]ʕ+|{[  b77mgffhjjBUoˬ|J$rYA*ƨWI AN'JѸ*,HGဟD"rI4[RQVVFII ٫D|8 =>D"233ַ`Xup4!U}&Vѐ/|ޯς4V{O_mDDDDDDDm;>%l6,O]o{yyY*-Aqr}sr bHH$$..膛Ŗ>h.g/~_Hj`ZQT΃Dx˛>K˝ wL?C"eNYAm,}Y=6qg$""""""IۏTqBV% 8A=<<R)ILLdqqV&&&z}}}fUCp۪}7Ӄ'>>MggPwee^U뉉 j裏X---t  rpC\)z=r>fff0LH$FFF#뙟 ÁhfVvT_2<<|v i7[V:;;YXX >>\"bWWLMM !]]]X,F#2:::x<$$$ H.\$%%宴vj?v\^1E}]JJJ+ z** v[!vINN+}eftR[[KNN~>H)bcc?H$4===x<F#`>tB!ennioo ̩ B놆x$..^&''1 U?sQYY)i Zzd2 y⿏P(lFR}{nVVV0B!z{{1 HnqFN'76:oozebbB~&''1ry.\EDDDDDD>_>G胃֭[˗9<6^ t:^}U}Y:DMM 555$&&L&=zj!$f'O277(ׯ؝5Tr9555qJ;v>hjjbrr+WPUUEWWoHMMOO_o[RRRGTr5, O\ȏ~7h4 9555TWW#Hc}rssgttW !ZKŋ޽v~PRR"D7{zzil6`aR)FaVRdrr90cccX,z=]]]>{ ϣT*9}4;vqrIww7###lذas!._̥KXZZb``._̫ƍFnzG"""""""ObUYYݻ R\\LUUy8+Wp8ڊ!??P(DLL `%B:'x knnfΝ[*wT*G! uxG9v옠''s ػw/pjj!֭[G8<& c07?!+++=T*|>vp8VSX>x^~xصkv_dqqd}Q~ߑE\\j`قѪhhoo'77)Ν#11V:tdCTO?}*شid2J%T*fbb^JJJ8w>(Nw}LFOOqqq|U D׿5iiitttvڻFDBgg'ǎ ŋ";;FlIoގf155jZ;Uy?O~~>2Ahnn&..tZ-rZsEj5V+|;߹c̉'h42??OII 333<={/Lvv6/_6>iiiw}LMM1??˗yDŽgKMM~x~a"?Op8(Jbcc1 \. |>Z-3339Gիvl6.kU.D""y 77'СC?/Dfݼ|t:o=@[[uuu C=++sEFFFc}˖-.c///@ ;l)osy$ 'O$33/o>, 333={vYZZbjj'Nʅ ?ؼy3  ݎV%66xv;RR)DT-,,066??P[[Kcc#ڵk9w=);88HYY?GWFVDDDDDDOUWW3<<ѣGzD"0׮]c۶m\.yq8ϳcoNǑ#G/a@aI҄B!}]شiӪkGbĉvqqq~fgg﨨n7Gy .011!_"055E8OO'dzn{{RSS7Ann.CCCra>,ŠCFF6 Ú5kG*LWWBHAAv o|#ٽ{7_י6DnE*k.~a4 O?4111'66??&??@ JYFdG AJ y1 aN:Nc֭8NVHOCC۶mh4i&~N(nS^^NUUǎҶ={[onݺ__3 %Q޽iH$XVxHOO]VS]]biiIn9+ H@ @OOmmm<䓷_$a׮]k fT*꺈| Ht N v܉^gӦML&qݬ[`0HNN399nT*P1]AA---\x;Gy饗@ gtt,fAՒJ0b`6nngtt Y\\P+++?eiiIX0==jjxPTD"Ǚgbbey)//sY9† GSS&L"333X,zD¿a*nv]d2XXX //@ L&tb6h4n::t_3Hzz: j.H"==ӧO(III(JfggIKK# GFFHNNfdd/L&ƚU|ԫ}?F#&''MP099Icc#d2Apmxx'@ىѣ\p 6 YXX 337bX )))A"i&JKKIJJblܸߏjEV6=33;vNOii)pXje~~RT**76'GFFrBgXZZ_ٳG4nhT*%  HLLf8HD0!;;Z-&F=iiisansܹUMb ٹs'@H$B\\W\b~FQQF`0e 1>>N(u/ >::*Kkk+ZG}Vn'''GX_דΝ;X,477j9|0 :J%H\SAfvyGA7b T*PH$BKKhX\\Мq8ddd}v6nHVV۷o'`Zdiiv;$''C!JCPDHIIl6T*YZZ"99J864$$$Dhnn±333j <0Lj0LTVV Hff&FQ0(++# aZٽ{7.YRRR 9蓓x^^/p͛7#H`ӦMlذǃVeڵHRA.''B`hh={PXX*]t:]B""8p8hoo'..}vZa񝛛` ++ BAzz:7ndffJVVׯgrrTJqq1yyy}~ApϞ=ظq#PTTL&#''([lL&)))b0PTdggntLFjj*hZ233n: ̰m6233G"VVV(**DFFF\㱱14 LMMa2DPB3??(|a#0jرM6jnsAd »J||<<jzyCuuuβsNr X͝bƍ Yf*,hFFV~7 hZ222deeYv- 2??͛$##Cgs\~z42==^6l6z 6,> ( ذa۶m#;;>rrrسg\.a[f ptߕ+W@RJ\\>(jZ ,;vCEDDDDD$]bWD"aqqKYY]yǃuuh4nsHKK㩧׷[uiH$"l|n( Dň޵ϗ; t wAxH jwD"l6w~deeo_# FXcii DB||EDDDDDtT*Lna!n HB!'Ou/w6nH$— }Ys5B6&YC$!??_({4ώO2n&99JuWO>D$X5zh.wFw@8D*7kb ۝׹7Ocn^/+++_ v{~=R鸓/3w+!Q1ϝas'+Qh?"nFkT!h9OS˒$""""""HYQ(B쎎S__/JHHIIIbPWWd2ZZZ&66Vt߬nillvtG Y|hh6st:D<mmm  B;Âbvziii_v~0znJJS__ؘOGGP^l6,--qU'99!zzzݷSUeȸ&>>ގ?7 ( hooĐhjjp`2211Abb">[cT^nZG/..Hnn|LNN'zܬQnfrr>{xoաVYŋl߾L1u:!hZCVRfbbL,?ψ'55׬Bj{9HKKbjQގ%66DD"addIT8N4ͪyFGGE&1882 LLLE @3>>v***X,d2Pµzc6Q(pIC&&IHU~ZZZ/IZZ,..Áfggh4  PvYLL @qqV`6qݼ[L& GӧO@NNhn/lz]|lܸ.ihh`˖-BQzzznSVVF__O{b0X^^&.. p8$$$vioogii`0V*ɸn0֭… dffc^yKyy9(J'x4% ;wd~~a$ R^^R]v!WFw QC5&& iii!==2 TWWc0(++CDuu5LNNccch(..FV db͚5իWrB&d"//flقh\)))aƍ1<< ͛Yf }}}~z֬YCoo/)nD~VVVhhh```P^^/Ν믓˿ۿEllQENee%tuuw}lvZlNzz:f[200``iiICn:N>|\|LݻJ_=..a~򓟐˗VȫB෿-BtᅬFVsEJJJavv/ /!==^l6CCCP( /B'? Z~?/,..-u{1;;АP{ttT"OLLFEELLLxG"R\\Loo/8zzzɡƈW^APݻ1LH$҈'xBwwwD(vSRR™3gfhhM}}=---T*ebbF4 %%%vZ"}}}TWW#ɰX,<3hZ v](VSS2d2N8D"ڵk _\`ܹst:yh4r~:CCCl߾^y>{c_oݽ{79rD( c8yF#̰sNT^{5bjT{{{#>>`0HVV<j͆墫x)//\.Bsss<]"pu׾`yyՊT*pva^/p\\.rAKJJ?Y^^mH\|AF#$&&r%Ғ`ܹvX,8Nv;.:;;k_k_~U"pXx.ׯ'33<p9r9;v젼LF0رcT*n7SSS QSS7 CjgnnJ8&SWWf# 1??OCCf`0jeyyOJJVIIIaflZ|EDDDDD|nZall%ٸq#z[H?>2>;;fa, )_zjmdzzOܸ_444f<^~Ƣj LOO3>>VznXSV ?яlB{{922Ғߏlfpp~3FFFrQJKKx<466"ɏ1557QFL&C* ^1 ̤OX J$d2`Yf `Bng||bF#eee8p{e^ʳ>K~~>~ebbb(++ EEEt:N'%%%\tϳfvBAOׯ_j}}} }H$rUIOO͂SQz$APzE`h4FFFG.P(cll$ |>g56> W^ebb⶛v9@P:jjj5s@8&++;wocWk׮k.EU e||EII lڴqzzzsT*[H\D"HII s|LOOٱcǪG"B=ڵkIHHJHG嫎),,$333b!99YG˗z(**Lvv6&>>1jkk#33SdBjz=׮]]r!SSS,--h$66F#FVL~~>T*YnlٲF__&XYYATzɹ%f122"sf3:AJJ D(CTBvv6AJ%lܸQ+߲e n0FbZrFѰL?YYY"~ɓ_ISSKKK>|{}""""""" Fs:(JF㪴/ow@ j7}<~|>'>ϗ;mD">].ח$hu$ &w/xÐJB *zhyys:/͜e&j^"jD"w-""""""H$^/111wt-z$&U{4.>vDy{8&99|BEDDDDDDDDD4w  xaİy/<55E{{;znkk+.M6!ɨT*ٹs'E:;;fvvV$ UUU$$$Ԅ墼[Dss3lذ7QᠩIPuݴv ==>FFFؼy0ש@"p5|>EEE< ׷mۆ^Ν;dtww355Enn.LNNӃ^gӦMl6Bzvf۷?v֭[?1n>Q1;;KGGJM6jbrrAٸHUUPF[n%ʊ0JDBAL&'O0KKKlڴYA7FÆ HNN>:W/%lذɄjJ͛T/Aw:\tWpy^< 0o&^P(oۿxhjjJ  l6uu=8q7,355oAkk+~^z-0vՊngraxwW譩?1㌏sYh4x<, @_]|! J@ /2v,H^z, P}J% ,,, lH$B__׮]댎r%E hiiիtuup8hkkI]FMM .v~ֆ>b.Ǒ#GH$⋌Ξ=9{,8Yy/R4/2== @@=11s%7jRSSC[[~~N'LMM =o Jmm-/^dbb~_qrҥUD"|>>/ކ_dyy_LLL / im6AffflnJSS>[ ޔ_Rp8L\\^.tӃT*mMLOݑJ8pxNG("%%|",xo^  vbcc9pIIIa4 ={i˖-<#$%%0TWW#˹j޽5kV) ǻko}}}466R__/{? 4r筷j{466244oq.ׯ#++K1T*q\rj5qqq,// dtttp>L?D__ -HhooA|>P[[ˋ/b:veewpg套^rqU&''Q(_!}|>0H$BHdjwqq1۷oB_g㗿%xG)**"0>>Ncc#v[ƋȽVcnn7xDT*% R__ώ;l;jf3رoPPP__nzy7gƍo^qI~iZG#R) ??r1 Q8@ffpzh4;*Ga֭9uP~!6ܮN$d2q֭[GQQtzH$ a>NKK $'' ޼&ns\tuu166'jX$ijj"99!Ώ1<<8?PD"~p͞!OTRap:Fww7x^~bوeyy&FFFi ttt099Iww7b4q\?~7xl\IOO'%%H$tuubPF"R)2LPqTnh4tuu}f"7Vxijj6ζm233288p8p`q86hLrr2dddGSSfoD" IJJbnnKBBFN)))<(J~?EEE$''Cqq1eeean7sd2B!<(x@FbZ&==xP(rN'&RSSH$LNNVEףP(h4B!2220(Jt:TTTP^^Nqq16mB.366Rh4`gddj~שT* F^/D" PVKrr2`J;644^'66t!^Ph$-- @ZZFDNNiiiZ8OFF=QUUEAAZCuuMKK' 8r }T*`00;;Kuu5UUUdgg333C^^v"??@ NLLL 8| vQHRv;& CBB~_(`\vtx^HIIazرcLMMvٻw/»T*giiP(DZZrx|$ jh4wן:@@HjC^^s0LzpCkayy$z ^T*)((rV=;˅F6 gff7RYY)4|8mӺ}>P"f$6MHdH$,..z)++7YA_\\JA_\\uУBxCܭ:sss,)))H$ŋ7;wN*-HWI AN'JRmr2kP{Wo>Bn+~qH$!D" a꿏O:N>k,w7D"A^-tݺuTVV"W=H$Bee'">ﮌ[/QND`pU. j;Ou2E_VVVB{r$Rn|qz p;QD"T?D"_rx"@ǭGLLs09->wT qJ; qjP(Dbb'."""""""ޱ]\؊|2~62ryxu(sDE> _0s{~?v`0 c' A^?)ȆrƝ# x>)4+++8{^+M|󈈈ȧ#U8{,JVVVz*$$$8}4---Zfnn˗/>hZA,,, Vq|Յd#pT\TիWq8bZ9{,v N'555VAnxΟ?/׮]8bcc,8s mmmLNNř3g#++A^Bh4εkׄSSS?~;7`0xK_2>>ǥK0W_%..6233?VZ_$771a69s ^W>o[(,,HݕVVV> CCC\|Lrr]82;vo\.'!!qΟ? iii8Ο?Ą0^`0ҥKD"XXXܹsB`0ȕ+W"11ZM{{;¸\\\ܹs͑F0eɕ+Wu ϟp%aW*sNGss5õk8y$g&"""U㓨5:u>bccr 6lN~I݋R䥗^رcKJJ qqq466288HBBG>7蓓0<<W^yr?NYY* LoMii).\bZ`0_L&Pf}ddfINN&//﮴5ZfmiiZ-===q yw(..ѣ񑒒\z3gp`ff`DFQ0C ʺ:  Nmm-KKK2͆ hnn^qRWWGoo/qqqhZsU233dH$, n6я~SWWG  ))q$..}F >AC`vvs ^yRr^FFFH$d2ajxxISΝ;Gaa!###zzzzȑ#lذZd20lٲ^{ǙE*Ԅd⥗^"33ӧOSVV2vRRR8qdggJgg'.]"..+W~zZZZ@R뙞իvdfYn=֭rq9rrrHNNfqqGΙ3g(((_$!!Wb0p }}}œodgg HHH`ppPؐ5 \t|[__Oww7sss$%%Doo/RIcc#ttti&l6111iZ|2l߾]C6Az=s/lxLMM,W\jȯ~+Z[[dzz 8N:::X\\D.S__4X,jkkX,$''3==FA&E"܌jTh:N CCC444Dt444ߏhdeefz{{ 199IRR355EBBªMʹs,//hb{ʩSɓY_|.]Djj*gΜt2336K.멭%##_|LΜ9C^^: nE{{;vz=*]W^yTJoo/P1ZZZ477/,[KZF$.R)Ǐ'99gRYYb7ߤHuu=KI tqF8^XX %%kֆer6oLRRQXX(,`^/ zr ;vPxOO۶mGazz~ǝ!Jپ};d2P*D"x衇(,,D.#شiBX\\dӦMD"bccz=gB(& FCCXKBBpޝ>uv{7K/4{!$$!OQjR2IH% W$Sy3c: YYhB z_~/T}#,Y7!ϧeI{yصkUUUh4 ڵ HTTTVVG׳uV222 iiiO>aqq?{qM\B[[fddwrccc;v B!E>F\.G`4t066Ǚ?fjj ۍRرcz=4440==MTT>Oz蠫sqM9r.],p[nfөy\Pp}]m111hZݻ:u ׋FvF$p]^ʕ+W8<C199Jى}nڴz3)B.gM?Ǐ'::Ln@__~!nwyYZZZꢱ1&&&8ugdgg''N`bb3gp}^y3>>^gffP(ʢkQ__ݻw줼_A[[qqq8pB{{;3338pM6ݻwcn޼Ijj*oN8p555pgjj7o,][7nvggp-ݻǞ={ػw/twwgggٲe B!Fb[TAپQ={XZZ?~6jkkYXXO?uVz-JKK9y$p8dqqFB!i0mD\.>LII ҿ?+)L&C& 8v~ql7:uEfgg9t?IIIkϤp5aqqoN^^@'NP(طo333ܿnqpxvEqq1ܹ^/raؽ{7P(Dff&[l1<ڵR%55p8LBBV&\.yyyܿq&''$%%QRRvB!}߾}72=="<|hdqq@ @NNwGgg'}}}vIJJ"//hٲe pi܅B! ϑP(DLLU]]Mjj*`';;THII!''266ƩSPT( 0pXz22 CTTgJm?"Nv+Jbvv*++1 R{r9555\pALDEhYi O^^2899 1 R27|.p\rݻdž ػw/ d28D˧}GGGSXXȹsغutMfYZZJ>|QxJڑ$pJŦMȠE0~͛7v" _BR &n6:]v199륬zRSSidƍ9lڵΦI6nȶmۤғ(M&a6zRH\.~H.ǯ\Eh<ǯ~"~omITL^^7*, ϼ3011^'33Vˎ;Ν;rQTٳR)%ŋܹsdrrrrIuk׮q1|^/< ;;B!9sFZ'ֆf#11q fLNNr 㩨`llC!ɨ"&&i#28..Nr9KKKܹsLz#ⷿ-IIILLLPQQbfQSSCii)\rN8y͵7??/͌F+LOOůkZZZJ)((, R$[oo/SSSf^*ED'ZMMM 111P^^B ;;i9G#iinn&%%gGAAׯ_4jR|g9N.\ŋ\3+xMMM KuuO[[k^P(PTx^RRRP|G+ɓ'9lB\\Ν;TUUaΜ9ӧ)((!0 $''saeeeA5 DEEl&::)l6wBX,T* 6dffk.ϧ i0t͆V`0wo5PB&vaat: IHHtR__Onn.yyy86l@eeYBZMZZtwwcc۶m͛$9$&&d"##Ez=$%%IKKKt}vl';;INNeeeq:XVj `aaHqqT㽨$XDrr2~r񐞞Niiq8Q\\Iʾ~YeÆ (J6oތ%&&{JP޽{L&l6\(##;wMBBG`RHZB!ߏV%%%:0҃xRRR0LVKczz^}UF#6 ݻ 77ӉBfQRRB0jꫯNll4jوEVS]]MAA,--ILLDTRVV&%NLHH ))Izhy@lHNNw^ityfJJJ94%99Fjj*B!iNNiiia*++%--1RrȹjHIIۢ4~Ցř<9x233Zϻb~?JK 嬮ƍlHQ^P(DZZ`Amm-yyy|>)i8&\."mf5.///GRjٳgEHLL$!!A PWW'-Q{r ^)))xصk沲BmmtYYY֒B\\QʫJFFyyy\.JJJfI#=x<6x<Iy'!!4nikee%dffEBB;w$))Iz0~3$%%I}kA߷Y.[\\F=ϚnuvsA_\\ĉϳqF׻EA^:SSS$&&~I( vAVV^CgϞfHa}ee޽R//䈡PVHLL^{f?uߥn`0yPy ؿz `~?4npM6qn  |J_p8PTL5MOG({Dv"qu:O&K&Fy$cvS?yv][pfTY&jҲvKJ%Z+YjH9BNQSb4q~\$]$y~)= INQZAxYEhxچ /^wG~Jk" 7n@R}vL&׮]ctt*++泥̎;\xG}}=r?U***?]]]@jj7eee^^᫹\..^*uuuX5?d߿'\OA#;\455144Nr2RSSvhF:tMOO4Jmkk#//^\\ҥKB>,ZZZy&QQQrBhgyy(nݺ%՟ BG1>>8#**4_t:)**"&&Fʪ%dee'ۋ#==~N>h FC{{T>^ct>~IDAT#)} N>͹s#cccjZ-> .pi._n… ?AΜ9É'tuurhnnɓϯs},999;gΜ!++GJ`V+n9sqN'GA.@ {d2VWWinn?fhh^/tuuq]=ןX<99ɉ'q\3;;K__CCCz^/> k֭[8NΟ?~KKKCt:[nh4 jl߾){YY555zr@qqTl6SWWGff=q`mmm={`0ȉ'֭[r]>CFGGill$66F^gaacǎh'99O?!ill\$|EEEرz=qqqDEEݍFt:޽{ܹzFGGQTt:zzz0L/]VlL۷iiibVt\t۷os!WVVtttpeVVVO>\.ƍLOOc6ZPfoK[[gΜahhcǎÇd2V=n.\oKg``$ngLLL`2غu뚲ubnnnAAAx2'|7o><gϞEѠP(zS[[nɓ\.w5557SN??_Vfff~7t@EEO}ܹÅ )Zw Ǐt222ݻwIMM孷//8?``Ϟ=Yб1)|ll?> Zl߾B ٺuTJ.Cٶmp8LFF8Nz{{exxNGrr2)))1??EVKnK( /K Bgggd2133BPZZ??Y^^^cp8LNNܸqIhnnf``m۶Q___|Gz2v)L>z=YYYaj5f5tVKJJ MMMre &b j( F#zzzz}TK=KTT~_>j͛7KZ]]q̉'jB峳X,,,,H[XXpI:ɓ'x3fffr s8].&I:?!HII!ȚrLUU:\rss9}4Cܸq5bpp:lT*) 24Ltuu1;;Kmm-:,׵***hmmСC111կ8s ׯ300 }FY  ) zxt:j5jP*x<زe c6IHHb`P$$$+˛L&L&Z7jeT*Qqk4阬V+iiiőFff&dggT*q\8Onn.FTz=VIJJB&yf P)E^\.'33hbbb(**"-- G]]EEEx())ZP*RgR\YYfe2fRdBTV%:: фal۶ J۷ٹs' ٵkVUz*P((((  hHNNd2Q[[+-#%%EZNY,^y)--eÆ fӉV^^JHuu5PJ%Efu:tMZV^}Ur96l n7%%%ƒOZZ*-[`D8AAȸ1>>Xbbb`0 O+iLnnIA]}qqO>Eضmz7E8^:SSS$&&innftt^sAADYYYh]}kk+d2ػw`DtAA bccY^^fiiIDKJJrz1Lk"Ɵ:@_YY!;;5\&vx<o|L&ZFӭ{%rܑdx_wpX 1~_yn3pyf#O[bzċ ?`χGK%T*XGE"^oAAL&cvvJoo/8v޽{rxچ"/ }z$ɲd2~s++u"!ߥ<@ [Dxp@ }9 @"|}>ߺHoAAG @&Q^^gvv;vRp\O}p8Jl6GBM&wN|O-= =wYw'_KyC8a2ք ?N  /Hn5LFeeI_,}{޹f}\%eY\\\wŸ6?? ,..~m|gAAML&"Uwr#Ϫ <r:{_V~ L&cbbAQQ3sz/ ߏ+++5Q~YYYytuuQVVn3³EX2)(**q\pd***u$*  `0KKKx^J%pXE?-Ih4R F"뺝N'VuVDr |ՠ/j5QQQ/ p?t\zc6{Q>wF:yס  ³Dr>E&/d̠P(Pk3d8Nr'zC.SPP@8<ORDR=5K   Z)&'')//ꑪJO{ާ&}V>X4s+  0`Bݻٹs'η(mF   8AAA. Dbb'{ܳ*f=u"m0vY]]N5l" "׻)   /HEixYȸ>$nuuZ6הYGzWWWXAAAO^34    0l\(   G,2AAA   KvL&(d%tEXtdate:create2019-01-17T15:05:16-05:00Q[%tEXtdate:modify2019-01-17T15:05:01-05:00) gIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-select-b-1.png000066400000000000000000005312631477354127100272720ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME 33q IDATxwt\}SDa/b%d5+ˎ\Ol9oΞl߬gmgnR(-۲z(Q"EREWL>?$@EH}^>cqf}`s[B!B!ٶǶ.E"B!B!heqTii]0MACC+B!B!^eHQvttuS܍9Jɪg=0&B!B!JXU-.hv  ̖#~9}F2Ʋ4fB(e~zإ\JG4teW4MдяR4M?ek_+Z*qW8zy }/Q*}{LB\l[aYa:۶e L3ch]FGc6xˍCn+uv;tye8,@G#¶/!6eQ[{b C2ICwF ܒA1(ؽ{7]w^o]]֞p0{l0Ǐg8P`J鴶P[{nӉR FWWC)Ekku̜9)ض:v(~;~,Q{(++Mg4Y7MN}x< <:Yh!}}dv1MdddN~Vңfg^{&--Yf~)eH$%??۶طos!33S~s! J} 4p8L @4q:%O4 ̝;00 #Gq#p88N,Nc˿|JyN߼}:颬V^xE֮}N*++K<@ HFF~5si Ŗ9u,Xp ''WzH$œ9sO_ B!OL:SP(D4e%|455p8R/Cq>:;;q:hZr`p8BiiYYAfΜI__cmE }dfE2n~!W"۶g?9+Vw:uxidddjJ֬y GGG'SPPȓO^lwqGX&͛g>***줭 AǏyfO? /? ~ ?6}}}۷G(--tf^ye|A/_Ώ~#Cտ//dgNUU|_eƌ'?p_5G!?dŊx<?Ğ={d{B6nDoo/pklݺرڵ]7˲ٿMMML67RWWҥK>}:;v줱|"z){ػw/'O3 {J'={6ͼKP]]MQQv&;;J̙;{S@!mE4cw1szq:@^^cɋc 4p8̴i@)H$ʶm[)++G)+5x<;ʲe˘6m:}p8Dvv6x ݲmXX|[,JL\Mnrܔ" $q6o̡Cz@?7ioo鱗e9륶$]#W|Y233~+ @~~>_B:uAl[پ}no;UUU9rի䡇M4eppB0 {zm>ϱt28Ν;ooer̙33g6bٳKc)=JwwӦMz+Wi&o2sLy]t4Ms̡}kvN0y<裬XqmpӧOgr뭷5\ßFS{nݺkR\\OzI,CD"b8TVNŲ,A"eΝCUUS]]P Mnrܮwu,q,;ȁ9zJbD1[N:;;g4MZ[[ٴi#>MMMFF9>F0MC #:ax QXŴL8]q!b(0 o۷̙3 rr)*/ MQQ!yy8Nlbʔjͥ/ ӴRO@;4Mn7>t} 4 G",rrrH$┗3k,}Y<tvvCsJ1M\0MRb( HԂ1N:1M2#FnnQRRLvܡĉZ,YBUUe{p3Xn{… ?'N`Æ nSuV-[R6%(e~{8N|>e3uT֯TUUQQ1MӘ7o.ssס:Wa׮=zyԄ0t֮}"z{{r! !tS/fr-:;;x</eNrN q8q3IaY.34/nkDJ)B0gѣtuur5 z0ǿC]iaY߂Y͚BP_M7ȪU+QJl2f͚iTUU3kLL)gAaa!#//Yfh"mf̘)̞=+`p8²e˸{HKRYY)((`TWWxXh˗_Kuu5ӧOcʔ)ܹx1MRp\tttoMcܹ|Y\s|>}-p8=g޼2wJJJ9s& .`ʔr,ˤP(ԩS&//s瑝c!.\ȽC__msmrJ*++q:]̛7%K`Y69,] !`/ij:C(&?yQ^^eʔ)L:9sRPOQQ^EquYry!͛u]kddd`5xG2M˲R阦a<$ˣ:iiҶ,+Un^=\F !?۶9rX }ǻe۶"xtskdп!9Z0w}C;ްii^Jet!jïd2OOs!8ǩSp=u`c,ǎ#--X,^###͛7SYY}K^3y'8x sa,XtM1cFj;sC4B/2*k׮"rssSeMͲ,ݼ,\8iTVV /PRRBfffjMx駙:u*999#B!Bq:]4|L4Mm^WWdž ,o3g٣i,_o]yF4yױ,+V}v7oSL^[nQI._RR}~3-Zatuuzj0_=mmmdddiqvVJ)Çy <0o;]׉<3^nSʰw!B!B:G駟tuuښ _y ##7x-bݺuyyy̟?={PWWGUU.twwswwS4+ܹsS7nHVVwqk׮%??%Kp 7pq2331cN<MFF{!m۶s /p ;atvv̬Y(,,a:.X,F<G4VXAZZ|J)̙7 vmX,FFF>/۬:iiis=|>^|E:;;;L|lX כ*[8r$aY|scL߶my?OQQxX,F8f޼yTUU.8n7Nh4*B!Bq5"xVXcҥK"Hz|\<9P,bz)jjj馛̟?\8z(ezAii)EEERRRBee%z+Atb&Wf˖-\RzЅB! ix<D*xuA  >g&X ]q:D""HSхB!^/n˲Λ~ÏM:rBq|> SEQzG<5ddd' H?h4hۍRA0MD"O<>Hqq1෎B!Bi>>ELO=ɴ?B=_YGi]!B!SO$B!Bq$@B!B!& ЅB!BI@t!B!bpLtF#ۆWB!Bפ c8XpaPRR2B!BtHXӴTOmۣ>gxJ$SUUR*Rj(_3˫:mS2dc7VYfO.\bO~(UUUA}Y~mn&Wf߾}|G̞=͛7sN6mDii)lٲ{xb6o̾}ضm ,H]β,eaCT 10 ] mqE_FPpl08kXt^E{SOIOWk = c1ذɾ}lq0eMmk97hkV<6; f϶y ;v8ؽAYͱc۷;غՁ 6Ji8NVWN֖t䷇@l; &9ox ::x_G{k?gqx11ωLJ.FD"5t45uNp:?NCӆ^|<*K< jw.Lp1aˇ,_ _-^9 ܃iԠPD(4lmʴi='_`Alec+ֳsMM/5}-[`&y]{ݱj2ݙK!B9[ 8q]9y$eq뭷Bff&N ݞ?>mmm9N< 3={6W^{ĉ熆jkk)..4M,pCnn.|_A gٸq#F իWxbL?D)u]@GGNbٲeq2sL, 5 ߞ` }4NGNF$AEcp!p8ޛ&;US̟oq m35v9صo뢱Q'-Me[`á5#l9+nkHKS|H^8tȠMͳ\c~2]zs5LW&fp6rW]b''0 /i4"HgXk7236}}۷;( {Z< ḺO,Yb5\cr ^uzN2)p.n[D(kaɟn7(ӉQ|n> 1?7m2\Rd),,2r<9C%B  ل+bB!W1#no~̙3Ekk+dffs\nt]4Mqrssnn0 ^/m388H$uiwѣqC@h4JKK ?Ob޼y(qigϞv˲(--p8L?O<J)V\m100@zz:大 # D"===z]~;3tnԩS),,dppninn/ ii [p8=,zh{zb`@Ug n޽CŊXLC)LJgg+556<gE,odfݖQ8axw'8yRQ'=]/ p#G tmv4xyV٩`69"P"ĶmZ9seaB_8Mb:B49w$pG{0 ^@@EomE "ڳVjQ[~Yl~3fXTW| 4yǙ:])^b'R̞mqA<>>Z.g&55eaˇ(iF_%:lI t%v8<r0@t'=IIF sh qr -Ԃpiĭ88HYf !Bq9]4 SL!;;0eXŝwމR\(++vcsѣ%K8y$TTTt:)--%;;zj9pkb6TVV{G0$++@ b PYYɦMR͝;oKɭJ{{;k֬x4PJNuu5 33qF ;bT9lقRVJJJرc@|>EEEjkR ŕgh Kx)J m4gi4>lJ_%WB!B\>Z}agnsj3J>vvXgx  QSSsVZ\yhiuܙ\ g[s a[ :;uo|#v>]'5_zsFҒ 9>s3-$]S[CuMVvQuN,Yh^E<G5ʮ0sMY=W|xGkQuz˴[ȡy8mDoy6Mn&B!ιHܙNǝNgj=~y]Jp>V; | T(-OS%3g>7Z:c*I=VJ m3%.Ebj[݅B!NVzB!B!& ЅB!BI@t!B!b]!B!ιHܥnv5>i~eJ-\z]J'KY&څkڹ de;L~jyMBqy+a37nχiĥ 33 X躎%33P(D(l:k@ pmxqcYe{=.ivTJ)tޑ56&R{<&0wЏRgJi ~_ϴ4rssS!רkF("wYh4 J)/~m@FF\VM'cyyy\NX, |"P(c``.\ dggt:~}}}n222&4@ p8(++TTiabq_1MCilih"?>Sq{<zR ӉiXW~FVV>SL^8m[B!Dʘ\,r] tс]kFww7Pb.KX̼,wtwwrp:5 ]^OM4M\.׸D'===U۶4 M[²:JT' '##J7<) ,l0NwBchXYVJ7NW MeS'( ^ԹiYaώeY#>#m{"p`Ƹ{5M#==]>pѯB!N⮔Gp9M\&˙LR%/XuJ O:|mF:9tLJ ГKo9<4Mjkkq\TWWMSSsvH;< en6\.W_ɺ'˔Çϧp"4MvMgg'ӧOgٴgf͚f޽,]Ǟ={aժUb ٱcxbؽ{7` P^^*î]hhh 33UVa6۷o'==˗سg}}}̝;*>L}}=,ZM8ruuu̞=ӧsS8pFY` y ea%Nr`"҂c1~8CP}z-ee vwwR R)(MO皼<M (;;;ٻw/apגݻorqa2e ,]vQRR… G̘1>6hmmѣtRn7~͛7Ř9s&ɓ=zKRZZJss3 ==k4ٹs'Xŋ +V qXlJ)mۆe#^{{bÆ Fg!ŋ/H{{;0?e``ݻww^z_2o&p8F:uxLDu}Y80y/~^oˢ۳g3#3fpCAu\Wu:Yl nFEez:.`Qn.hn7rs{e^v63<\UEÁ}F.@ww7XcǎϒH$=ݘj{ػw/k֬Isy(*m @GG{~yMMM[@ ロ|ر_O zh4JNNkbYN7oc&uuu⋣~,kSl^G? bD7x0W_M7Yz5OGoo/7nd߾}IWWMMM<䓬_NmƆ ò,Z[[}Q^xOB04W^[ow^>oÇyW_A{9N8/Lmm-}֭ò,t]gy#GcY< jS!BO9#sɞgygyT/msQy~my>|Yt˲b HǪK4e͚5b2>.\8 K[[& QPPg?YR3w}\{hnnK޿ttt@gg']]]dddp7HSSӧOԩS 9=B)e6'dan.MLgeRggsה)$ lbgq2*=[KKYmeeC;BYʶ9ie5}޼yL:˲z~픖b6n;[n4,ˢo9 |]nt]'77:;eYX½^/NCԔ91^lsɔ)Sx;w.mt:Yt)EEE̚53f0uTN"##ǝwIVV%M4VB+WLβ,L+eժU| _@uv?Oww77nd׮]a8n7xH$Bcc#*`05z`ѣG_"xf`b=\s ;wȑ#qy;v;w2w\y0Ƕmyٹs's=|3v9z(riiiZ!R7@-SJDxWصkg; ??DL 0~X,' 3Xzx<>g80YjPן~>s*mAF~hje`0jD"qA,Rl޼'xSNϯ~+^}Qӻi{kjjx)((E__999̙39uK,V"H2//9sV۷ bsC__/vLJvb<#F $G6꫸nhhh`_4MXf >y_+ؼya/CO4g,[X,… y衇Xf 555dgg_P(adee+W^|mȶM[ REE&0(xr8DW==´,n.-%hO r:q]`WGzz'|\~۲0 Qtm۶QWW#& ٻw/=zR1uT@z>/_ٽ{7dgg3gjkkYhEEElܸ49~8ӦM{tl6[9CHbNNP gYv}=,`w7itLzPOmmM$ qji>ݲe O>$s8@vv6O>$]]]<~ رctuuǏ_֭[yyGRUVD, ]tݻԨF9’%K.*x߿3fu;vM7݄|><Oja۶m4Yb===P]]Mee%'O0 4Mc߾} 200@UU---aveFݮq7x'Np=1 3g2|^z%^~e^/ ,`ΝGGq֮]K `޼yDss3x<fΜI}}= .X!r1|[аzs3g3gL=ڱe~('M~~G;c9N;|sF Bx<GisRSS9g=7yru\{˲F#9:///eY\. 8۶@4O@gt]O-65]>˕z%YZZt :u* JKK|$ NJYYyyy|>G7=9仨TsrrRsgΜɜ9s$33L,"Nvv6i#PQQA  PRRBNN'^r:q)xIKK㳟,-n7@\nʨrJJJ(//>͛GZZiii,^t` < 3efΜIOO-bѢETWW.vmD"u]uwwb ̙ôiL2oD"Ass3>{L),,~ '_O!B8>}}}rlQp88,B4<5DRATvv6 d6ɅSD"x\[YESSSQQqVqomm%;;;5OzpOX,v.>07^y4{۪0Tr-y^8[)$Sҁ[J4 ]p:(߻:.X ۬m.d9Wrm7yAPӴ\do{d$?.}A]!)cqwݩ!'O1S_L9h4ՃyS[%\.e#ٓƽ$GK7-Ǔ ".Gp8Փ/.LEiz:g>XG[[|QSl2/Od7<+-pLZ~?߱.~rνB!it BK~inχi H$.,\.Wj1K u]'--LBPzƪt:GY' !B!WFqBDU!B!jrF<6"@4P(dee'N>Cii)k֬駟|~9shoo'? wps=ǻKWWӦMKXz58x UUUD"]vtRoX~=L:wy^{Ç3m4xyw裏Xp!oo'Odg B!Gm3f`g?C)Euu5G᷿-~!dee /sϱd<;w駟f…={zIKKK}SSS _~ey?NEEPg>|E~;֯_離M6s!NJGG?imme<NǏS[[KQQF,문{.kϝ;}ktttk.Xx1ضMZZg{Yf \s5x^b_F' qM7q5p8XbG֭[ijjJDnn.~;%%%8NVXAoo/p]Yd _W9rG/ˤ~zniii!̒%KXjBqN뮻/ڵ::u*---xb^{5,b…AOOHw}z }}}b1nfΝ⦛nGaӦMtvvDII g'33Eֆi\.>qF7o_d׮]̘1??c188Ȟ={8q B!&1ʕ+yGiiia^^<7Hk`H$@OO6mh4Jww7ms-0k,n7z+> ^*TJHyy9v|>,YBss3i8w0|.]ʞ={8t%%%,\֏;Ưky6oތicń躮SSSC4Cyyy cԩ4662m4233)))!7775d?1w\lۦYfe~p8T;yzK|\.***x<(p\TWWOZZve޼y466R__7ߌix</_N}}=/ꚈBqxS=1 2rrrR߇|̙3۶)++cڴi<|Z[[S&]s5h?G}㡢"u2m4R=DTi8N;M7DNNn_$ &BLb^7磨(OSSv3eR׭[ǂ (++öm***:u* n;}XQQAvvv /F)~;vޝ>t:dddPUUEss3䐑AOOYYYz)++uw'_pI^x^S'lX[oEcc#=XaW"7oȑ#|Glݺ,/|Ǐ388ٴi_W|D"8K,g۷o28pիW/~"ygXx1˗/g۶m?~͛7m6x衇?cLӤqW!b׮][{\9m0;rS%E"ٲe |D">vWS߇^{-'G|&WJi&c=FZZuuug};v 4;w.--- o~Ljkk'BLbJ)mƖ-[WBVVֈB>,>kˇ~ݻٱc;v`ʔ)|[СCDQ6nȁxza,g֬Yݻ7w2۶Y~=_2Mx衇?>n3sL>p7? nY/Bkk+X~3g{vZz{{>}:Vbڴip7ygٷo-***زe msAV^Mss3wqn^x}rS#ȦL/~ H$|>ٸq#ӦMc̙hFmm-qV\9B!SQQACC/N#GG(5kְyf ,gԩr뭷?YlYYY|Cuu5֭#--۷[o>9 Hђz PVVիY~=mmmz뭩ѣ撓a(㩛eYaE?58^4|===q8Ԑ.S{撖Z޲,z{{u=hNOOD])(( p8H$~A)EWWib~bG,# b6YYYX ۶qݩrss%8BqNiK<G4 0M~`hWA?mx(,,H$i#o ˲p5M]),,$rb NNND"5grMoos~?H$u:==`0J B B19"n+,,$100@VV300Z,77whQQ`t88Nmn,Bux<"@ tww񐑑A*^,,,$ FSäPJt:S+'oPKnn !B!W|>_39RbYlN*B!B|Et!B!b]!B!$@B!B!& ЅB!BI@t!B!b]!B!]sikk?!\KB!.0,k!B\UlG'ukm6{s'B4^z)<B!.]ijjG?wq]p:@b̜9??!WF^uկRYY9B!޻2n\!B!&uFffDC!ANNaLtQB ''碆hwM󑛛;u(,,!+nI ҝ].Hu\h^4蠸cRvB!(x.JKK"++ ۍeYضm(RnnnIp.o?]Oܰ׎b\q !墼w!BK70PQ?vIuJbC/S>#M=fwjxdyNW0-Oo>6wd:mK^:Di- ),qE?^,lDxO"B1FkU M@OB+B)dz}CT y>$z}sju(x(U soHlv i(F߿<6\D {,l~ޡ^}SxN5N~&17j- KAB<]z#V-(U8?B!D !ħ>~`}Mwr:: -״42\44 _ ̠ڜc2/2 5יe|o/!J$sЅB\Rh_Onn.˗^KWuu)҉.B!]!I)ŊU㮻M>MtB!.ظ`0Hmm-x* δi4 ˲(,,d``p8Li=P]]MAAD[!β,(̬Ytcv8#:dLtB!.ܸ`0ȓO>墨O `̛֭7uQYY eÇ?swذagFVVD]!LtvB7cf⑇ k=]2!B3СC~nR^|9|0X  ;m;u[ȩS?yUVn>c1#!t-DZZҰZ`a FI.xsP''L_Sw@bf!Jmt-o7px@Ӱ;@k (P`wK ټi E9|]7Jc\z$pMaȔ)S7VՇq\a9lQvPk]B : OqhjWӫ~uB!,lf0ǸE1}٬]kRZZiq.]c= {߿ٳgίaǎl޼h4JIIɸ %w$BB 1͍;Qϝٛ`8ϟmh/cT[p0kP8s5jj^p`_@:츄]g?:nB!Pt4Mh㏳uVXh#Y``]v1oN:;e:܋,;L s# B!İlXR0YS4MGnnD˲k t!@Jx*]eri07}"KeN};cLƷB!x@s!B\$@BO.nB!W'B!BqE]!B!$@B!B!& ЅB!BI@t!B!b]!B!$@B!B!& ЅB!BI@t!B!b]!B!$@B!B!& Ѕ .ǺQ60RXGΙgݑkgwǓǙƓG~mmbnTQ$Tx1asNsb3\\h3w``:~qNk7(,ۉYsc,b֭yLUKU;svs OR;v~;Ʊcu9ydi| ;FݛͶm۰sma5oGEG}:eϏ9r%Bq> !>vD~LSQocw mC#Ӝ>f~ Gђ(9ee>_O#Jsb4Q}l ݈nt7 k6=qXF}q]Aysq3xp}V-?,=g=+СCcs$Gbύ\uãrPJb֭O?O?=cx ^xP(__sĉqf~ݻۿ%H}#awLWWtwwXy7ᩧ6B!1B? EWwc:cy5.$39oxʧ9A/QƝ8r__QsyeqU|BAzЅB!BI@t!B!bxV-#?BVuǽFy$DBvOsP(4tSl fc&lwPabOdxjvE~KK܊"#LCggn:IC]bA_ m&fU  Ns0hIl=uO#`5#h]f[&`7n $Q )BLN %33ۍi۷#-E;|8AujF`O>Phoաv\S cZ_qn{ƕX$0t8k&0T9㧷p塴Cf(4}uȵ-F!s~1윑y$mq ;NG4ś0{B`_39}:#2"xXch8OC%!6|ζ.(Rb ~",]Ohn]D"υBLZ ЧOΚ5kؾ};%%%D"87pCj֭[9t---=zJ)q: ͑&B;Ϟqο/#{>=stst@L4Lu7.1FluգShhhu1SQ@m8Ѧ̮C4>&o 04$:B1AEE_Wزe K,1/^znsX7vٺu+deeMt݅B!BIcܗ.\… |׿*]T͞B04t}hH4 Mƿe*|Z{ŶmLq[Ym@3aZr8ض}:sceaYJ)xkC*abk#ʡiڨyNcc#eQ]]}޲ !m~󟓞NGGYYYԅ^۶QJb掼`<ѕ8gsDBCs&V#)Uñc, $躎O8/dva%i4 ]nƘ3򸐺 !RJ4&up8nu] ![nur[?iɒ.B!%B!B!$ B!B1 H.B!BL !B!B!B!$ B!B1 H.B!BL !B!B!B!$ B!B1 H.B!BL !B!B!B!$ B!B1 H.B!BL !B!B!B!$ B!B1 8{m~,"++ A|>J)RnexRbY>c !B! ㊔Ǐ'##YfoRVVFQQ$ |AvEmm-_Whjjb PUUţ>*AB!B1̸ǏG77Dذasn?)sO_TT׾5zzzO~=Cvv3X"iVBqqhvG}Ϣ&@vlG78c^MB!ĕG)4o6;p^T ;::(..˅alݺ`0ȝwI8&{^"7n~fbwݘvB+ $4[3,@W-CB!-yxV}ԩSYf ǏP(D"n0 6m֭[ 444:? _]w݅v!M!ą4@ a3uOB14uɿpkp8XhEEEcC=K,'| ۷r^~e~a222&B!BIc\|ͬXN|_%Hp8F q;w.O>$eiڨF ]t!HWRC4u !ʣ]׸\kMp\g=:_ Zۗ¡.âkQwuRG-☚AB!- {)>4BB f`08Xh?Uˬюn+}s $BO5lsQE1tɝ?B+8Upz@4z'.B!>X0Eq755QVVƴiӀpuVq8DQ`GaaxD"xUHym Cf !pvrdjOS>n& ЅB1q,jK' y2~6XҥK?cYnDz,JFݠiUU3!B\]qGʚ>ۍ>q0|\8lSzc2]!.rbfubr#&Mƹ !bX6(UI]HW[7]tfBq v9nłQWQ|l\?˧`]EuB!ĕG)EQAnp]T;@wb!{ '(^֪*_d"BqdB!B1 H.B!BL !B!B!B!$ B!B1 H.B!BL !B!Bi`Ot>z٠DB!pLtB|nreYe]O7.,3s!BqYH.WY?k񉸽z Bqw!B!b]!B!$@B!B!&.B!B|4MC4t}o\g ЅB!B,HӃD)R 6 v:Gt!B!2K$~aRX,: ЅB!BpPRRN۶R`0ig3хB!B!6aNe`YXs$@B!B!>e}vv؁iTTTp-yl&B!B|t]gN__3gy !B! ЅB!BORl,kF ch !B!b$Mӈ㩸:z{x| =B!BqE,=NpYYYgM~.w!B!B\F;{B!B!>9͚B!B1 H.B!BL͚BqKU, 5B!]!麎hR ]G\ BA@ 6@(@ @ ] @  @ @pFb7JV (yq(,yojZ}97r|59ސW* F( @ @pB*~χ,˟(* ^@(B*:J%&}jX,,ˢϽ^/@SD>gIX,ʳ>uE:tMeصw@ ptJbI$+L,n1-IH^dYNӘh4Joo/xBzm$ l6/RL^/yyy O}|%IbffqɹD[nIb>Krb!Jj]zA}STT*bآϥ$I)@ p>rE e^Ju}GeYLl6.@4E/ZJfll붤%ntq}+I,#lh$y<W2))S}N^k4[%4 Hϯ%4L}a%<@.W8(PZ`~%drEX@p8L(b h4t:n$I \ucjjj0J?0~, )@ p>TA?|0MMMhZm b1*D$ N,(ZvgΝfjUgΜNG~~>;wDF1s+R<Wh4| xX,VUʽx`6lݺ_&ڷҶo }L(퉹$IQPʵZ-ja pbν^/ph4(iZx},(,,$==`0bʳD#r_ @p@=rnʕ+1Lo>q!n7۷oh4+PRRBee%O&~z0o6j]vaZfͨjFGGy7} gvv}vYbjzzz{URLFFF>Lrr2YYYܹ7%qY݋nd2l2vmIܹsϣR(//LpXe:hdΝ444MJJ ?0/pI;9}4ssszfggiootׇljDxihhŋp}a4oΝ;,$QZZҥKP. ssss)\.PV>L<箻bjj ׫X{[ZZl6nݺ+WCsٻw/p(L&<" r}܌d)--%~zVX3gX,*Yz=K,l6SPPj'N`jj JaddHx< cF#P۷s90 w}444z[qh4n233b~bVSm*L g(7dݺu|_R__r8{,ì_<)++cΝ,_L***8{, 277(۷obPWWŋlVo8t: BI9\>/;wrY&''b޽[wy%Kpa^uVZEii)۷of,dH$oٺu+CCCRUU/LZZ~SN1;;Kss3OBNEV/2?xW)..Y'j*xikkcll"6oLnn.0˗/g>|P(DAA<x^dY&??+VvZ=իYf W$=z￟tN<ɓPWWGgg',300@qq1YYY@ |=+Ǐo>x]wE}}=SSSh4\.F}3n0vՅ`P\DeYp #77 :NHXkZb~y$''p8HNNVIӱZB?Q'@__uuuD"<Zt[$Ib8RSSIMMo.z^qONDzO/Z$''3??& y|M ~=MGy^x ;;.kjjZv222#᝱PF䐚K/C=D$!Oeer,"N{y] j5s۶mCAZZ)--%''ob3W^ARqo~`0SO=ݱlT*Ybiii a4oSVVF(Ru$󳲲p:ʑA"6D<G+ '~7 y^Μ9C~~>eee<ÓO>)@ n!G_INNj~z8nG~RRRjRZZʞ={8q7n\ ^c͚5L۾,x,cҥ|_gvvjf'x{syf:::0h4v;@@ЄK1?L&[l)uheZMFFm۶qdYf۶mLMMaZq8dffb2xWPTX,l.JXZjQT^8 dri0nyj~.]z}މD"tvv({ ًғ%%F;Z:-QV%R 7DjP&1LjBUID?KN9 ⥓P(nh4z â6'"'ޕ?شiK,`0(FQ6-h1L/#h4ʆY-H~>??d2H.wߗU/ZʁKBnn.ɟw@ )^MǥR3~3i?D/+|DEպ{ۍ!IJJ('>mo|,L'@ T%'qAp+N:3UQoH%:`0H("))vt ہ/JC`GrX,LAe˅no|al6ۭn@ &166Frr2A1$2朅V$PD* Iex>F! qìy:yN'iiit`0!++ DWWڊFVŰX,;v\|+^d'ѱXA\.V<333.R.D=pi~wDAeX,FKK GnTW'hW8׋F!//Jww7D"FFFHNN&77͋S$+4,3::藺p$ 9HB\~dYf`` 8f%Kj'ڱ^EEEv?$2 Cjj*W\s=GUU_t@ y뭷K_x*pz) P(SO=믿$77~|h4V),,OOw/*oM6Dx8~8/^[R\\jezz˅, Z-n\z=###\.222p8e?&55_曼Knn.SSSq233 F$''$lH$Pת8%/'NEyy9;v_:sss EQ$#IOO ro~SQZN'ww***z|_'D~d*o&oo~CVV`!)))$''OO_Rtt:x< VIJJ{/kƲe(++'Dѐx4D"!ICCCh4(999>|_+wǶm۰X,~^Y755şOk.eLRR?O9{,s@nj5.@ Y\pv0'O>PA444ӃhdxxO}BO~} ߏ"cٽ{7> `h4J<'Feٴi?Go5k|˗_"(++o?bVO~~>crJt:ϟݻw~z?&?hnnb IɌ駟bя~D~~uo<G9rwڵkyhii'xB~ͺu먨`Ϟ=455 --Sp8]wErr2O=B!(`<}YvSO=ŶmXtGka=H@ x_1fggwCcc#]]]ˌ_Ʉ, qݘL&k~OII ۶m__^z%"wJ(BVOEEuuu׿Ȋ+0 ߿^OEE> ̲egjj!vM^^˗/rxW=쳼TUU133w]ptvv{A4eǎ|[A@ >C$L?^Kzj_o?OQQw?Ξ=Knn5$IG@VIKK _rMB ᩧ?6l 8IDQ'w^?3qH-l W6t>n=Wf 8|0lذğ?s=?~Xz5?y/Icc#w# 6 Ұl,[<|["ffff'? 0?$D[W(. L+S_$$t:iӦXj0))k0==Mff&K.Eղ~zE1 TVVzjYr%PJI3 YJ8fɒ%t:YlUV)A~Ӊbb eBAz!vAZZjP(͛IJJR֮]d??hL%?M @bffpUWv}U CeDZ7`oh4h wO\gߟh4(;7G0韄$dAe|>HD("h@ .U$*++oj}>~_~LOOc417)L&~'99Y㌏^HIIM@ $9;UWb8->>-p.gZTgy"HǽVȡ@ /ף^FIKKcrr&Z-h4JGGv"(n:CGG)))T*(JV0͊?n2p455HNN~Z-:~Z[[ 8^/MMMA ߏdh4288H{{;E imml6+}&cZx"/^DV/:=22… fhhoogdd$Ivsarrf%ZfrrF Nq$ ͶKww7{<J=ffggijjbjj ÁF6T*6dxVFFFp:aPd.E\4\><7^W_eɒ%?==oMEE5[建8s eee77.W;vs >ȲfeaZ[[ 8(aZ1 \:rzihh󑜜4*&$?Of vJEgg'!2{\!08}}}tvv*E222BKK XVwtRRzZ-T*%H,S7S1::JKK :ł㡡ANlT @a~~^ u9,\~E}Y(˗/ѣ>ξ}RA455LVVG_TR%ݻw/EEEɓ'Fl6~ӟ tz~D8z(lEahhE,[q}WT$''@Nq'))f~ӟRTTbQvM v9 ڸpޟhZGYY?<@ZV+>|~ͥNN8QՋizzz8s W׋jUp``@iŋ p8tvv2;;n'qEg͊2AV300barrZMWW###$%%144DKK ˖-cdd(L&dYfff8$1>>쪿PAfxxa4 ===b1f3@ 阜ddd`0 t:07)))LNNӃ``0077JӌrN'~駟Fp,YkF__Νn311Aww7OR^^\g׮]>ҥKill~V^M[[yyy̐ӧYb{{!Q[[K4e튂n2|?ronhhh`ݘL&v;ǎヒNĉdggsQ:;;+عs,OOOZSRR;Caa!tttޮl 277G$_qy4 dfH$ŋ ʆ /ѣG#pq233ٻw/yyy$ Lv ǩSޣ`0[oٳraXl˖-QONNK.2())ѣ|&#(<NL~~B:;;9vr&ŋ\>155Y`1AR9r166Jbxx׫C$!aZ뮻Xv- $-[pc2W^grrR`1|_H$`{兩X٤joo'PVV֭[R\GFFF}1ᆱm455ꫯze#='V+ Fq |e˖Q__}ǣ>NȲL(bhh\nݎ`vvP(ᠢr.]J~~>jn2ǖ$IBijj"//{lQX,lVt+(BӡRh4AT*uS@ Еfxxn7yyylڴ$֬YCJJ /^|r(O__G8ҮA`ll;_SNQ]]M$!ק;66Ə~#, DQ&&& ( K,QΫ3;;+d``O?Mgg'˖-#~^|EVZ(ɌVllڴY|>˲FQ~z=*JLbdffͅ C$=̙3LMMQTTD$AVvd/_(x<Z[[A$\..\4qwH(iz^9*x>q188$Ijs(--EV+׺IOO'--B{1V+MMM~^z%:ĪUFLNNի`rrV<;X ѣGBqU_b*ݹʿ7n`0088Ԕz6l؀Nl6hiir###C٘bt:ٲe wqeeeʑ,͛D";vy须bLNN߯“$uq!8u]]]X,{1yٳ={Off&LOOSVVƅ 8qv+W*nn+V`28x "ƃ@ wqU,,D]]~łREʕ+Ybl޼*V^MAAׯWΦT*<EEEh4E.SSS477+ׂ_xN4Ȳ1z.Je\6lիcÆ Ȳ̹s|ZMEEyfXz5>, K.E0::Jqq1477p8ܹS EdJ"33ݎj%77F<˗/Gwq999,Yd իJ\lIMMe``F N+W299$;wdŊJիWf hoom۶O<`ffF (Iuuu8~aZ->*P(DAAuuui&4 >$Ibǎ3:: ҥK8%mmmve㸴*z2>>ׯ';;FF#wu(? Ba8"zhPii)IIIʿw$QTT(}ݔ(G+++c~~|bL&/^d۶mTUUK[[%%%lٲ@pcwr) I& <~QOOOc2>4Jt98YYY</JQO;z,رcLLL,7nԭ`~|+7-̵AF:t G(#HYl6GYeYT*v]xU@ \388/vLn'\ZoHXh4zݮ’$)e|r>k\K%IB׳zjdY&++33V|zu$lG觪ȲLIIjl6/rPT|k_jwmUU+goW$I"%%Y?V;n @ .$tkEs07PH$,˟HAOD  `a>Evf)!@J7RAOzUeY1==[zaϺ$I}fFq=7F  - \(@ l8| )V_ Qtl@ Q8w:NɗDww7p8ӧioogxxөD/ohh ==ZM$JNzcva9%RZJF3ꢡA\n}\υ x"fLOOl6 f9uȲfV%Q~Μ9C__vVKcc#JJ133CJJ jQΝ;G  --!4` } ї?x+jFq󌍍t:j\xQp8g~~( J(nEߢTr^rCi>}IW~ >}Fq`pp4&''qݸ\.N:(Vu' uuu͑J6P466ގVf}v%RMOO*5@ >E'*}}} D"9x 'O$ ҥKgrr_~[b6/~ vڅhܹs? f߾}[NHA`Ϟ=466}kiΜ9f;C}}=۶mcbbf&''9tW_WdddPPPѣGя~ʕ+^4 uuun~mMW^y.FeΜ9ݻټy3*vywgttqN>M j ZbAV3`49t萒fkaezzp8L{{;J$I8NZ[[addx}QFFF(,,>>̆ PշnZFӣʲX,|>&&&|466^yv;JJ@ǃJBO+9?*YزeYN?@SN~zT*X9~8* o[">466rxwQ0lp>X[=T@ GAЄ˗/gJP~JKK?=۷oȑ#],Ν;G<5k 2|;F$j|^8p݃RD"tww^S?GenJccRN?Z YjHOO/}K\.X,088Hee%zzbf~OKK p7p8<@SSJn)--exx͆n"p\;v N>7MK_F1"77p8L(b޽`0hooot_UVQSSo:^VE$Z-FVJ"SWWgxȑ#$I444oaN'o6>(LLL0::JNNjY, _Z6;pYʈbAq&`2`߾}6TV+QEVl۶ )TUU_!O022Bss9looÊ>hv__pEN>]wuG  Gj# -۶m_|QIŨeÆ [ot:fdd^{ JE `xxx$zD"f͚=<<̛o?XȲ+h044DAAWƍٽ{7n^|EE]?st:oRw.Y_z%V\IEE,sA|>w@t/sT*eee<_aM?TWWSRRƒ> }Qh\nF#. CSS 8{,X,-W$Iٳ/} ۍcffJ<^Y(`x-HOO'--R #G멨r155(u4Ν# F`˖-?~FòeˈD" rssYvM E'a)/`gee-ڸj.ecSV+ꫯr/Rv;TTTPQQAAARv²xD,@ [χ*賳,]$֯_OJJ B!*++e*cllbj5CCCLLL088ӧxR}9>/2<<(%3<Ù3g()) `xxA{f3H$,D"FFFgbb^1~r$233fCe:;; n ۼK,]Kyy96NZ-IIIZ\ ^gYQT]!Ib1rssiooԩS\.$IRDQZ-sss P^^Nrr2{キɓ<ӔDwJᰲ)QQQfvSQQѣG9tP[[ŋH$ٳg!}eNǚ5kWV"(//ĉ+&%%dRSSٸq#555=zk P5 tvvxn~ njkk T*nAzzz_yCEE>rZ[[ywX,h4D"N'PH)9FFFR6l6ݻӧOS^^~F  χAbzzٌbJrr&(..&''@UU˗/S^^Ί+())aڵfxE}Y쑑V+sssddd\>SRR0X, :`0H~~>D"t:byOHLJb6x<(}>sN$I… l6j5n, n4z@ hdfϧ^JJJ[c6b$))|222XlIٹs'dggJ0d2Q]]͒%Kh4ϳuVBSSSdddk3蓓T*(* }}}q[e픕177V@eZ[[ p:l߾I]]ׯgɒ%\xmFQQt:# E4{怒X,F^^322Brr@Ogi,̤Š+$ C=`ra2x<)6N'լX+VPVVX%I뮻nI\ @ +s]r\$1==M06^Ad\KD0Ixou?67+-σ>66v߉,) 22I$Z}떓SO(c种 %wi\?KyEe:V [@ C\Sa`Gk ]%u?TJ{n}H; 9y|֐aW.=tw}~-Crz'8:q-V ~p, :dXb_B9#>ϧ@ ߐe;΃ F/{g~◕P1aQ9vv$I|&_uk'k/.磮Yw*5*TDkj>h~?lAQ]JկQkɱOoS+1 zHZRG?ZB%VBB\\En6˟@ \?׹`]ܤ\Vde>WzU9ꭼ?>19Ɔ &BCH1,mCcatj1oj"mSmWTUiY¹s**)t2qƚ5L&io*sf&F<#TVP(NFu9hoDFfcF=ӝtvQQM938sQRg)җG83t<595Fjk1Ҫȱ?OT\*S+qܜ=O0Q@UZ#(J.<Wӝȗ|cwQh/$Ŕ™3Wn,\/΢e8Ȑiˤ:P,x^2OEXTS*q9Nh5YkX1/\d˗}O=L=ze.w͑# ɶpS(ѦpZ#ݼH,r;E)E^K-/]r$ryyBЇ+r ˽L:39f.5/eC6JSJLa.ݒΊDQ}p,̦M$rQ7Zǒ%;8l@ UlzwɦME;ؔts:_$yT/W~ƀZ扥OŢ n?L8r@WVm۸N |m׮,ti!ѶUЫTVQI*;d\M:+fiRe`+/(pP`/`gNw=|a]:ҫPI*RL)8 nHxT$e Ȓ%fgCNJ̕Y|'9I9|kxt飤S)ppW]8 PI*3#mhUZtji4L:UiU|ꫤRx ް$Ы|ˬ^)@9-Nrjzͥ\-RK?ewsnq6m \ʗ)sqfVѲ`gG΢Ui-ed`yrNy v\~׵Yd׵eUj9sǖ>$I WbŽ>rmxJKO`+e_IbXQĞ= ƀGymf3%5s;J<'˚`iR!7ݳtNuRY]oPK6ĦMrxeF'FQYlBd y޾66rW]ȲVe=/ L%H,opa;w[e2ddFݟ_=Ő]gC(RU 5`\ )I)F=tv4:ktK:qq"Q(h.Z&[hlm OȃMoDQƽ: ѩuˈ{4K .]Щ[&@9bc%\y PEK.Kqĕ$y33f秗*ƉGh OTN,CH4_ -9((jIuGH ֨mNٓM<Gʨ B9@ rpڜW5Zm&E7~OJJ'*gzzxּ:ӘL&L&ӭn HMMN%e1222PXMG|>@@ DV@D"BЭn6" F?x<@ &pEwO4%-->8Nt8y$$''Dؿ?ttthd||cǎF! qAŪR__O0$;;w݃ǙngΟ?O<gxxwyx<%"2?pA9BGGpȑ#gϲo>ͅ Dڮ]xw՟h^`˖-Fy7h4{DQ?cΟ?Fa͚5⋌_.fc*++)//; PTP]]w߭lqF"LOOsE, Ԅ" FoeTe>O<B!N'$1224,*xTAFFF0c2غu+"It:v܉V%  ذa999~08qZv;z穫+v?,Ϝ?4^W|N! qE۩gjjm۶B  3<<9s ~277G<piGCNNx^q\?hZ\. *l2 h4LNNNV\yEj5* JFY㔖r4* Z$I),,De sssrJvjk{OSRSS.)A9'fŊ߿~Jy79rnfqbp8{pzzzhhhQe(RSSCSSx>Η%Kee%޽Jzzn@ &AlN'1rssKOee%)))t:)//j)//f3 ~N'8HP\\l&33c[4 xlbjfgg)--fp8vT*YYYLOOcIII!++K.jVerrߏlF+it K.e֭PXV0ddd 2zPTl6,YBFF>{ bڵK/o^Ozz:8Nq8dffRPP@nn.pڵu(**RnܸNG Pʽ, @b2&559nʊ+(..fffr6nHqq1jnj5Әfx%.B"HJRx\ShٔjzJ̀qrrrغu+flBqq1ӄavرȃCQZZSl6}vJKKjEqq1@@ (2$LVVyyyFZ-֭T|>7njzP;@ӑr7sn5 %6Ul6;w$tRZd qvڵȫA @zI.K1OK4`JĵAw\̰b [=,JJJnZ`0xE˅^d2]w95$Ibvv-˲ m6?3g\%I"(9$%%}hں,LOOrj5z1|J^g8h0L]IB ^@ "#IפkVP"l|(" > K_pw*ou󯹟TN>pMOY |*xH$r{ 7bv%/p@ HD8f+YY|Z..e.7U8rh4JJJHS9@ @ |hT D(O@0Tܿ/vc죈FWxOgg'iiizN:űcLjD"8{=N8lH޽{$33@[[g~~\$IR/>[o1??]]]L _'--SzX,}|xx^{˗d.Guu\./Xr'romme~~y^.2(ʅ opp}ѡX_uΞ=&77z:ԔA @ɹ(\.9B$={OJJ b͚5fdYfرZͯ~+~mvڅhȑ#? O?Mnn.J }hoofq)֮]|Yppf3iii455qmnZ͛oɚ5kw%==]o>yVZlٲ,~ӧill$++Z^ylѣG B377 JD9N}7ñcB6'hmmt2>>xF#$kqYINNsD"b1t:v---F?ŋIKKC$N<Ʌ jxXf p)dĉ444`ZٶmEgә b2ظq#x>\\.fcǎ뙟'))b!99d؛7o~W_'mmmLNNb0?^z=""""""""4)ЧiooI VBK/D||<===( rssQ.qqqHRR)/2۶miQQ&rR)޽FΜ9C~~ iD"'?@ 444OWWCCCT*e~~Goo/===7 H$r!͛?p8p:5ڵkI(!_󱼼ٳg)++Cb,bccIIIAp (..~2LLeS m6@ղFgg'{%&&dJKK?EUUoZ1J%2 #%fffطo* ՊVW^a׮]UX/SRRܼy~a ;Fgg'PL&L&ctt/QcZIHHTJ\\8222x"8N jytdeeQRRB^^ 477lLMMQWW'D"rrr(((@SRR%'T*FV+tvvT*9~i HÇ[6B5o4 qA 6RJJJhhhL&MMMt:N'gϞ6:}j5:V+xܺu_t:ưPYY`@VSUU˗y3YBDDDDDDDp~ݎ磰D"c6BVSTTJbii Ojjp`08Acccdeel- vSRR^v;VKkk+hhkkHBB===B! ;wdrrIR)䤐TJaa! QTܹÁN,fB$ <`mm mv#)**D"!33&&&0 x\ZZ&lv|||֐J{^ fggG?dffv@*b0HOOghhM!AYYY["Zf-!!QFFFH$$''SXXsss dee =__PP\.gllirssṰ YcnnBAjj*n[p;`v\ddd|vF"BvYYY!--p8 KKKGRTTD(bdzY__'==F#R^B۷o2RRRjIKKcaaLFSPPJw8333pvv^B@IJJ32kCCCH$rss|Ann. p8u677'33dan !JILL$++n~?300"V&"""""""Ԕg탬T*1[B?R|QuУYE'Ip8r {rȑ}Gɣi$_7ikk#y70OuEDDDDDDD=>@% ݸD"$/}UH$t4~t?o;^/~ QDauϿl"\f$33S(uMG_5|V%gD~?Dp6`ss@  @``}V[}}y"'! E" ~k)akƧB<"""""""""H$K} H$Rܒ, y-_G"OL˞@ا⾹lZ|:.rzg :F|z\}ό`0~ |>P񓰹| q8%Y__JlE?Dc% Ξ=B ))u_% qE>t:)++dollpYbbbz\?IDATp&>|HNN*Jpjn***hmm%>>S%x<( J% ԰Hjj*vϳDNNTTT,kiiի$$$`2;wDn7mmmB!q|>RRRgkk+.]ՊR봴G$ZN'6>***fȹshjjm۶Gyy9NS(mGPDkY|\]]dlyիF֭[ܺuKHuuhjj"&&H$BYY$%%j蠢5ӅxjFōu&''%77vnb@a.`F#@׹}6qqq~8a766%55ku" j,,,p5Z[[҇[J}p8Lss3:Noi Bݻ|봷P(~M;dee=s^N"""""""Np8Dd}@ؠ@ @II W\ayy4_΁X,r8~8'N^{ F͛79}4yyya6ܻwW^yBEWTT055b߿>*THIIƍh4^xE0DsEۇ臨".~:.\`׮]lllPWW/Lff&2 Ebb"ϟX***BB-9x *URRR(++#11\N\\βgp8 PTTįkJKK#..D2۷olnnKMM `0gxxP(ݻw">>n~_N^'n뙛Çf.]K/ŋٱc6 LMM ;wX677h4o}vRRRX, NܹCww7re:Dcc#`/FVVVy&cccT*Z[[immEV366dbaai, Crr28~ sDhߏRqqqa, MMMܽ{\VAlb. wy@ Çjq 0==MJJ ܽ{Q~mքz###TWW ksRSS#S(X__'--1jkkqBuD{{;SSS?E`P*SSSCgg'*Qqqq eN:E||<111ܺuZ-n399IJJ *iȗgz322(((,d>F#HCFFkkkݻLCC)))`ns!T*YYYv'ZFFF(--套^n&WZDATb4e( "VCa00LT* &L&bbbݻt:>^tMYY333lnnrԩ*//{P(0B;wh4L&[ %%<<Pü.FGGi D"aaa˗/ "1 ISSCCCu댌p--//S__O8!ԋd2333ܿ jʕ+vxKKK mmmܽ{ٳgd߿S#_GYXXH$Bll,dgg#ɰltttD[[===Ҷmۈ߀9y$6tqεkHIIݻ,,,g9s qqqTVV266?'Z[[Z$&& hii!55F۷ikkwޡVVVs& rrrz*رJfqp|XekT*֭[zJ%>v{9~:+++C\<|@ *߿T(|>!-\.|"{CQRR"6 τB!AERR_k;w/_?p8L$oؾ};¹Ͷ>??ϙ3g7AVV>ϓcf~~ݻw#J BB!677ۍZ58@^^ d2c߾}DȠNgg'LNNVIHHb022ʊie8 v@crrH$¾},//={j|grr`4Q(猏355eh8pB:tMgg У%YZZB'FZtT*L&iiih4Ǟx?3{oo/Shmmerr<J̐ BEII &IS/2b7$ aZIJJ>EP\\Lff&fY+++³,l:jZȠ'66 666dyyxJ%ܿ<#55UXcmFQQ LMMɵkx嗩G(Bbb"333}vX,߿| """""""""}bb{q}FGGH$ӃN#;;^?' z7xc00 rIIIX}q]N8Aaa`14a~*333Q[[Koo/mmm & 2<<륳N{;wjj/rU222YYYajj5ܹC?mmm={. ܺun߾W&''Y\\dqqӧOs5BKsLL 6 [o;wnDB@" ɐ&Gtc6.\ 2L8&j!ONNF.p:rAz=&;vOeccc3?D"ynRW_}UL3|Q뛈op8lF.D?Dt$  iƇDO[܈|~uD! bXwAPʕ+477c2D"9s۷oHVVz!Ξ=ˎ;~Ʉ^ڵkܺu MZZ@ @ @ղΥKhjj"..SY< Rɭ[~:dddɓ''??ehhh@"Dcc#.\b`6$''[oEkk+P8***y&.4y]Ξ=Kww7( \BCC۶m#p L'OΝ;tuuQTTDgg'.]buuU(m? ZIvݻGFFעdVtt:x"]]]$$$jƍlllիWquuuL& /^Ç$%%iiiիD"accF ԕ+Wp\ iiiaccKI^=pq:ܾ}ĄPIB!1Ln"M   jwNe8u2LȚiy!v}KQ(ID"RonnI K.v)((ÇFW^yP({GSS*j(((Q]]kƅ (..`0lW^n78p'Pu:P[[RJ=|^xχB ..ϳ~$ X,233 \vׯk.n7"dddp9 *"G磦V|PVVjEדJ?SSS8pt\.ccc;pQn߾d"99YhT*Vz{{q8ܺu VL&b2vc4fppPa>ݡPJF#ܻwd*++z6xEEܸqlD".]d"'';vpeJ:uꩻ7ggg}v ɂFCll, n# !JD"8x̡y]FQQp8h瞣Z8ߗ"uuu,=1[[YYH$Bkk+dddo>$ w%#JCVCFF׮]cuu K0{Ɏ;x"cccܺu<zsJ__7n`hh!zzz(,,tuuqmaEE".^H0lllp蠵;wV}6)))~+L&oׯcZIIIa׮]$&&r(//'11$:jkk@ ̭ɑ#GHHH6BSRR(//'<Q^{ ^/j<>ciifff,333K[ww7JǏcTTn<P 쳰ĩS8z薺 ߿ /6GQ{{{;VHKK kkk Q^^?x!CѣGLqq1wޯwyo̙3qQܹ\N0$ z{lؽ{7Q\\,XR)KKKdffR\\Lll,H4󙙙 ̌0066iPHO˗|;attD+B8fqqxuw޽jﳲBoo/fZͶm?3fgg2Z;w o><S4+9]"GFF+++呝MBBRp8L xl)**" ~dȳG hnnܟ}Koo/&LF#gFQQ$$$_~$, VTJoo/ 1>ijjwe׮]|ꆅa&''buu*innс㡭v뙛?!G!11$'O?ccuuzw蠸`0HUUܼyoIFFF̙3TWWt:w޾};T/~Ғ H$J%R\B~'ɐܹ6Μ9*rZD"n !* шݻVRԳWVVr)<f ===d2t: 8 R7MJKKh4L-.HTZ-W\ahhHS^+ CvJR!w߾}pYHII{=6qqq3>>Fd2QSS * LB@&!8y$LMM1<<2F f7oB ~_'ZO}|dpX3L&xД155%(J9wR[o4EEEBGD>|4/Pv#T*< ));w099 phXYY!99M҈G&'z*rrrÇBQTȋ9 DDDDDDDD>nQ(,,dyyi"6 (fff"Y[[E B,-- \F^gffNRRVe LNNz~,Gah4hZ RdxxX(o2bCY\\dyyDBff&& ez=Pqd2H$FGGrrrr@Vzh4FCZZ333x<R)8Nv;H$YZZBN)a#nVFaii ٌF*hp8j :nG?>łgjjJ'NHH`vvVx1rTbI=n癟'GFF,//Hbb<11DL&RSS+"Bf3J2Jx|>ZZĄ;F#ԢI"$%%q\Dammtr9333(J ZV+JVWWq:(J|LOOcلX~'xx<N'R^/. Zj333bA"F1  O. Պ"VjG0drrۍfl63;;`  }LL ,,,KKKQmgaa:Nߏl Qy gMD't:r ~cB zWEݡP艱O7@" ɾұ||5O>u^/O-y$I]% /R7flΧ/uފ|}jO[Cӌ׎:~vGE3~uOsWW=oEDDDDDDDD>&`1DP()1!^7<.7hf/{~z^FSuqx<Ĉ/d}accӉJ}q<\.~_-!(|T60BFrrr>s/999y/.fggqt:V' Bv1)Sdss˅Fy,1j nBWW/夥ill|Opyj5;wvL&cp)n޼IMMÇ455p5nݺE{{;EEEJtVUU177Gnn~޽{?9ŋܹsXN'gΜ!>> B[h3 }"񾺺*c6Tٳg ++󎎎RWWG[[:u $׮]}9_ ynng"{7Q(԰m6;\xN1 466rVVVHMMҥK| ώB.QT[ dʎ@' R\\ŋ ܹ/rmۆ`W_}ӧiooW_ERQUUō7ؾ};sss<|o}[:u" DXZZbpp^xSu£Buss;vPWW\.';;Çy F9wGVs=, ^J}}=v·-:;w|eƍHR;FZZsP[[(,,իX,exx {9x};wr ikkMCNGMM 7or^|`ZijjbrrARRR|2ft***ܤ0004CCC Herraz='N`Ϟ=w###=G@DDDDDt hXOHZZBx`6e޽FnݺE^^<|c1 IdzziH$hzl6SXX:)))t:233GRsN"l6jkkz*j;vdh x"mmmT*tD"T*H$4 VLV+  qqq/T*PH(l6VVV7n0::n}vXXX={Lvv6J˗/϶m(--ˬh8}4p˛͟t*I||9h(((\$ V<˙]سg.-Y[[#P\\L^^SSSJl6366ѣGIKK#//^|0d޽d2D"Lww77l?1 n0 #znB666(,,D*RYYIVVɸngvviY__b(V c}װZtvvFacc^>nbddNZ[[b||6پ};{h["zggg9s Ǐ'??_8oܑHz?DH01̿]vܼ{ҥK6 {G^^G`||Ν;ϓ(@aa!撟O0$ !Jq8KLL HFff&<2 ^gaaA(ϧ x d|{# oYYYhX[[r ;YY]]}bYMF_̿L">|::::8x 7n`||Ç{{RVVx<,..b۱ZXVt:xPĠhgmm B!n۶MLT%99:yǎ޽O44 `p8L0رc|>\.a innСCd2t:08NJJJX\\aᛗGrr2. Hvv6BT^^R!YZZ6` ~_ t?~V1 Ƣj1LlnnxkwtSmuu[n1;;+<^)jq8lllGET|llljxݱ1%%%(Jt:^DNNtwws},,,`ZIOOd2p8%55UHꙝMff&o}[hZz{{ZL&z=@vv5r8uiiiK(J?֘VI"""""""4@ `׮] x L&$$$&s'--BN'`P쬯r8v]waaj>|H}}=/§~?eyy ]vM>ӟ޽/Lww7,--ٟt:Y[[#33IX[[,w>&vY]]E^|E PYYɫIll,/ɞ={蠸 xvuu!HNNWVL&CTT*Jh4 J"Nb0qqqa2psQU<##㩋J.^K/Dss36 RISSJdikkcuuRRSSB*rfgg^җ>k׮s¾}#99ÁJve`ۅD\~Bz-rrrHHHDB0"8v. NGRR/HPT$%%D{{;###ax??R믿.Ygg'%%%z{AK ss!]F{{;?> pXv4lbB$H Aj5p8H$`03kZBHR!4~_$y<T*>O NNNQ*Bvq8;bauuZ-rdl6Z-v]Ȭb4|s\(JBJy!?я‹dbyyM~n7 [*<p}2pDJJ ˬ/l(ϣj[ ,[XXl6#˱ hvRHRED')) ܜ0nw~wعs'lll`XP(}L&cnnH$BRR (5f v^fVRRR? 299&*T^J^;w d9|1??a ìc2X]]ecc\Nrr28BXVZVFCcc#۲(""""""155%Y (Jf#G G!*П5Q@8N'llls}LOGIT?:$&&>(lI8 affDBFF/SMt'> tg/Dt:zeu%BLg=OjI#Hp:'mw4i'{4|5O>uzBTQ$B !J"_o&FQ3gDrS b#R՘"fwYR)2k&$ k0J7Ziͣp8,ӎd2a{rUM\yIw]n&|v럪`0TT*UC}R>t B:?qn_] G"Bp\}vGI|(z3ɦ~=i,44E b~@2== $~zO'Y>n]{9>nMc>j[~=~o`a}҇M,q|XD711AOOtttYǭ;FDDDDDD!$ `0bd2222ԩSܹsNT*ĉܼy* 0ttt_}.bbb0L\|r^/YYYH$@?11/~ &&&r9ǃB@PPQQAYYCCCdee311AQQ 9sZ~?ܼy_W$&& ْooikk# a6pUUU,---Xykjj8q$''#9}4ׯ_H$BYYLNNŃ8wl6͛7innj{=rrrLXXX`yy'=hn"//kQK7:Ot:]]]>}f3:sQSS"ܾ}K.Kzz:kkk455aZ B={z|>BhIzK.>2D$T'JNNb}jd2 \zjfffzl`yy'I8ٳ,..RPPZj.^غ kgyy9W\APx(++#.. jkk`sÇܾ}={|gyw"==Lƕ+W"M||>G/zfmT*ٳܽ{6p8ܿbcc9wCCCB&&F#CCCWh4P(F|?*Clllp}, n)++###Wo} X,RRRȑ#t:VWWرc@7,--qYڐ崶4SYYcb26߽{vL&TVVbZ \|v, }}}f ֲ`ttF Bv9uz\BSS* iBr~mٳgܹsQ82L(|(vF>LNNTVVm6***GCBnڵk8N ϟݻB>RRRBpyzzz%667|QV+BH$»KZZ ܽ{JCC*:w~w|2K.r9l߾ZMgg',,,p1.]Dff&O>mmmC^^z{~R)ͼ a]ƍ7|?x"""""|.[z###Bn__{Es vAjj*plL&W^y#&&Ǯk4IKK\H"G( ==FCZZk2fnn,z||܌`H$j%''۷os9J%.\ RIff&H$"vh4*BG&_DPB!Z[[ٶm>QJKKcbbnݺ\.gܻw%8r(++bPRRÇ|2>ٳg sJJ %mFBB@~VKbb"Vg2==Mbb"sssS\\P+V cRRR^/ $&&>&IIIsMZdffR__Ozz:理{\L&ҥK 9r*J8Ν;477۷zc233$11RyY\\bp<֯3_PPY\\djjW_}@ 9877G^^B ݿwL&\.f<  QPP@~~>βcAir9dgg366*l߾.X \.t:333$%%=2_QD"<|BٿeyyDAA,--aXajvJ%PZZJvv6z~CLL q}:::8<۶m7s= / $7AWWl6vAmm-|> (((`nnn\Çٱc6n q]{nP*ݻ˗/322"ln<|Agg'r1<jA4 ۷o'++1(**bǎ,..2>>NNNHRP*8C8&633S_TJzz:\rc DDDDDD5>UW^yLHLLDt:СC,..Hww7mmmܿ۷ܿVxdn={o~c;`:wMMM}}}8Nڨ0L|>{ݻB=RVV?G$VVV8qLMM >|lllpyNppp8HMM%==VKFF׋RDբT*)**BPN"  :dff@jj  * N . D®]!_* V'!!4eǎ[^gmm M$`0p8X, n:a666ow8HRp:rݬRd}}5j5P*011~lj H`0H <~j5d t::&XMQKtcc#%%%jJF__SYYkkkv<fl$,2Xa}yx"n|;ڊf#55`0ȏ~#v;v\hkktrv̓ۿ[~sssTVV͛79vاv ü曬0LF\BOOuuuXVz-v͛7yϓ__rܤinݺdϞ=lnn8y 11NOOW^yEp!ZYoܽ{VKUUMMMH$L&裏ݻwܼy%.5 ?NT*їb\P/&&D"$]2 L&f3~7np1X__g{۷oFNGff&ܾ}ɾ}ɡD‹/ x<x&D_v#G%99ÁRd߾}_j;tL^^f۷o*XPNfVx z{{q\BqQl6J};wRZZ /XYY!;;;vY]]ETQT XVoBAVV.]rJ,//o~Z-ԡ!# Q(ˑ#G8{,ɼ _,f$G__J88|0p~hZΜ9oMqq1fYPtwws=/x޽{?'??R]]̓عs';wK.!D"AբhHOORǎ#66LƋ/HUU/`+jkk7Ç_ɾ}hҥK|boRRRBII ===11\zW_}ͅ 0jgzNDDDDDIH^U"`|*HXZ-( , RC8,8v\uguuZMBB`u8$$$>C||<>E"ZVHI킥`aaAVMB`Y7 lnnbۉC Y\\DV xN b jt ,-- spxs!JY[[o lnnF-+n7~xj |>`0&FQ3ǃnl6hKF*T*6}>u666PT&PB$(&&ښqb4Jwa j"x<ºRf|:XVVV8{<z [ZZh4 0)3λ|s:$$$VPHX,H$nՊBc aT*=!tVwbb;w;vC+KR$( MQE͓#j5ZؑH5bbb %Q~0#1p|k:ѼODDDDDDDDD鰼BT1D`_p&ƥ}FU*WzOD"_6;*?<$׉&8S(O?#rZ- p[|o$g2=\GE置}&]ܽ^'vqM&j97aiGcv2>/gm]yQ*OuGG"!whٗߣ>迣u677١PckhG˂}|>CО>e1 n9&@@8*333>吾}gddcI3\y^5 [Cgg秞_"""""""_-A"x<'? 2,fffxwihh@VP(xw۷ ~ӟr!Z[[y7d2V9q׮]cBt%Nղkn߾NT  eee\zY^^vb~~SNQ[[&++|MZoo̹s稬dvv<8q>RRRO(&@ @0<\}}@l?)}ssӧOFy NYYYߦ`0ZwbZ[[x"9}4T*RRRիW9|0v'N؈^G&[oQ[[˵kعs' \x{B… TWW3<#q~nr%$$T*?zXVt:P(Duu5/_ a=/MLLԩS099I^^<ɓЧњӜ8q{r8q h48y$/^^Ooo/aΝ~-U4 [vt󡩩Yn߾twwHuu57of0}}}TTT033R?9 ܹCuu5dff؈V%>>ֆgyyu>Luu5ׯȕ+W]星۷#H^@",ǏsAN>͡C;wB`pp?%ADDDDDDtq7L[ff||\޽{h4ܸq;wL8&//d***@P򑱽呗$ DAR$HJJ a4ZL&Ů̶m$%%Q\\Lss3'OD&VUŋGP`B ==EZ-BY%=z\NRR҇ƲF7 JKKd /ܺu ȋ/Hww7v^yؾ};Fr)--^ʕ+AL&ϟꮒV^4;w$>>/K4 (JIJJ"++ ㌎2<<p8KRhmm~0Ojji\p;w|q)L&H+WpسgcntvvEff&`z>wE"000Jbǎ|[ߢ͟ɟK0$##_|7o>WFFF믿### 0caa^vAii)P]]M `ǎI~~>vQ*x$//zzz8wjj5۷O=>004tvvիi377(###j5߿/ TJKK9w/^ܲޯ1>>8cccB=E9cuu믿N %%bxx޽{ihh^9bhhβL__۶mcl6JJJ{.b033͛7پ};  uSSSzx^IIIa``sΑb! oT*YYYdee1??ld2111]Xl6 |7{<٧B),,dff a<ܻwrrr?^x>|^z=KKK >sAΟ?Ϸm222{0~ V=w}FFFˆшSRRŸ韲{nا\~??b;þ}ػw/eǎH$l&##DHIIR)^ㅾMLL$!!Nzva@P`0p?>'kkk8qJ:h4r  Ab(R'hzfg\[[0gU*}={seaDٟ>> W^l63>>Nzz:ꫯbu ۍN#11QxFn<NSϲ_I 駟˜;w+vEU*̛7ٌfjbIHH^F5f3wfϞ=̛7!j5jV"**(z=,|7t:INN&99Y\.J%nVKLL & Dzz:ccckv_n7o>_SO=~?.c00L^'::[n/ aQ*$''Çe͚5DGGP( 66_~&cƍ\x0l6on6q '''~-[-A)fl6ˆCD&***JQ466oŦM jBAbb"F48 IHLL$SOk.zzzjF,Y™3g'??^/B$$~zzz⩧bttʕ+gӸ\.fff|Gx Yl9rD̟?_|#h˗STT$bf3;wpB:###1 V%**"oKwwR萴OLL III۷۷|r`0pqJJJؽ{7wAףYhNRXXHSSh4R\\FR N8+8}4= V)_}Uz={#GGGLNNt:{SFFFFFkbjjJ,+ q\a۱ZA"""tLNNV=`N'N q8bwbffV+v%&&&T*QT8A, ^G2EIQ>ٌZ.KbFtt46 DbnXX@iJ%f`04^BALL ^Jj{thM&Vx<8bG^V)n05 "͚@Ӊ2j\.jZݺu^ V^jzK/Án'..͆f#voF|>n[.i VUýh4 . .t ^/jߏB@RvELA0dhhD|>s1>55'** ׋^q,*Jɨ(4 b,8PZݎFFӉF`0͸nV+&IJ)dC߰8Nbccq\T*1 NVKKK ???%66VRsF`0zzX,z=b`0(xOvl2KRFFFFFF櫣WbhPqjB oaZ9s 5k|C PIj R0]V6bB O#"-[ĽU ~***fK1'&&&--^'6Md~Zh4\oR)IAɧ133h|b鈤8[iwD{:OZۀ~f/ y.######e!eВI}G0DV?h=VP F)V`0| /B8z+ ~Eg`0'8NF GPT*Q*_鸕P(y=E?/ҎŃ< vNMC~+-͟Tٽ~aaaxG:o@= @ x<3 E@ pȒ'$A<Υq\<:Ip/F7.ָnGjuKkzYfQj/7~ÁzP? cccܽ{:zJ}!I`5+H$l6mmmlk}\v( rssfΝTTTV|\pC`L&dݺuTUUo&?Ο?b!//OK]]]W]Hz8tǎlկ~E[[˖-c``]vq̙3˿ III$%%~ƭ[:={8}4Te1|mmmRx9x ˖-# rN8AKK ֲ~jjjHJJbzz;wrY|9'O7$//O([e( |>*IV+~ B\JFJcǎQXX(ՕƉh>+Ww}/M^^'O? x뭷l6T*ٳgLNNBfaO &REI_@7*1<ȼyuz _G^/>'"%%@ܫ@?+ZZZLNNi:#9p S8)C蘲X,ܹ OJJ@)V+7od`` wԩSs1N'⺡uIRI[9$2:t'O{nZ-999qzzz4ׅOp]>"ToBoAee%r)=44Dxx8\zX|Mui***tܽ{>ɄСC\zNGbbcFaٲen]Frr2UUU?ɓ̛73gK/E SO555l޼Z1###__ꢭ${=lLNNzٹs'--- zy7 ⾓yrx^~?aaa;\~ā}6>+Wpyn7?~'O2==Fa``Qǭ[&))I,R]x4f ҥK۷jƍq;Fkk+|Gz"))3g/D].'227PYY~!}}}x^&''9t322;wHMM_ljjAxehh`0ȱcǨFVݻr ć~ȕ+WhkkcĠP(c444PVV&E}}="U܁hhh ..*>cN'T*\.KAaa!qqq=z׋d׮]\rE'::={PUUB ""se*%wޥt1ܹVhjjbTUU1<<<+̓H__MMM`QT\vR4 OfҥbΞ=ˡC &&ׯhѢƺzbcc.B %%!+vÉbL&111DDDߔG^^~dVXASS. dZZZHNN&99Y$=ٳgQ$$$1ZMrr2]]]-$ QRR۱jjjbT*>15ڵk gӳNIDATzz[rUŋ$$$}v:;;bhh{ 1L?~$JKKٴiG! ull,*;w|rbbbp:+zbccy{.CNNv@ V󑟟yX,LLL/399I]]we͚5dgg8>W_}Z-˖-^x"eGg֭͆ X`s1nݺECCSO=jݻ a0رc555011~FGG"h4OsUv!\SSSYhotuuQZZJii)E@|rr˗/sioo0>>΋/HXXyyy|8~8@HMMeʕl߾BnJUUv^x.\f#11T*)**d2q)Z|G Ν;z '''$??-[`}ԩStww͛ҥKDGGSXXH `0`2y&%%%BjNNN&9rDdLv[[[OOOvjkkbjj>{9xyy~C]FFFFFF phSO=EII ddd8waʕqujjjIZZw(++ ޽{l|;DQ?7orA^~e6N/~/\&%oK}}=ׯ_ʕ+bW_fǎbX8<>XVN'|{c…ΪԦ՜9s^{xwYz5/#rKPAHII!..{&s5tb ..̵k׸z*~)T=z8L8lذVt:磾OLTT $$$ꫯs 233jr%TPV@Z')) ,Bd^Yll,qqqs9<%:Zp[V$%%tCt]KVN\\$%%a4ȑ#LLLv&""5P(yyy8qM6Q__Z痲f搲Ln(--%22Yj'湤$ ׋dbՉjrr˅hd2=0GEEVWTvEy/_.> 0<<̑#Gz]B!vmr`f8Bvs֮]Kuu5+V$''355V+B`tt7x0.]ؘ0fe%IcM(p 8wZYx0$99<:::o~Caa!`2vDLL /zܧjB 66HL&.wB`ѢEQ^^Nll,YYYb>蠰( nHtt4999>|$^~e_!++&''ٸq#p;KT~ Vxx8رgϊn8kZt)ǎc޽- $&&~:|>aj?sN,Z|ZnJjj*fϲe8q]]]i&l6h& |r1 b6LbquϞ=z|PLMM-B8."\.NSh4XV']wfJ#⣍F#>ݎGVRpp8byC_>qzYΥHaaahZsRjf#v2l6 vc!$vVh$ bX vxx8NSaxx,r^` Έjnᄅ7FIRzؑƍq]/BF!`Q(hT^# Ǎn'Ƨ.&aZ.#K  '`ZEHDGGcYjW-$[0dhhdnݺɓ'я~Dxx8ZVqB-}'K.2Oݎ$66VI^Q,\HsfϡejZI7odtt+WB\LRNCTzj8)tK1Ҏ4&'',ps)J|>8t.JXX:͆E}+!RyU*8 vgR|%n[|~ iZ^&bl6>O<>#vV)="##E_l68tJ4t:ٽ{7?Ot:q-χV TWW3|m +tbXh43R$@"&B Ofq\.eeeB@U"O2dÒ%KdCJe|2,YFCSS0~ׯ_?KGpu/22 6<Н^effVJKK?ՃWڵke  _>11cu\=ؕ q&v?K]urbg=X/2N>ufff0'2$o i;4E7 i~P$LK;E)Aoʿ-sDrK}$i[>~>i2k%W? tߏN{@*ߖz+ N'J riHr#Ha"&k,/7o=P$NR=vF)5KO">I"y [R:) =Iw [7o222222222jOQzE*0z=G?6<\vg:ܹ*{n.^Ⱦ}Xx1&r~_SOQYY[oEWWfŹt=== q)_WrG9u׮]#;;qJKK磏>Q9s IJJ"99N<~FGGp/ў={8wmmm C޽.RRRPռ۷+V 9pgΜƍR[[ˡCr vvŹs8<KhZ=R$..N6ھ^/>CxYf W^[nsu, ؆H---ٳK.v:td7g.R.^?5УpBOrr2[lcӦM]Doo/۷ogddǏ3>>͛immejjz<ÉdddWa.F2Х殮.֭[H 8֮]KUUjŋjinnfڵh4 g\L:::c޼yv=J?-ƍY`FLVXCFsee%6l ;;FCJJ լ\HRRRXz5N">>"͛7j*˻vZRRR~:$%%ͪBwrY^/`>F#TTTo~9s˗/V"FTTnCq5jXx+Vz#55Wkq9p/"===TWWxb 9u7o&22~ٴijkcGFFûKKK jsΑN{{;W\֭[355E^^0 .]\~.^W^tߏ1+̗C^__Ouu51118X,`N<Ɇ ؋b`())t\;wh4T^Z%Kř3g_Bӿu#22222222c?ԟ`0!>Eee%URT*'Oa/Z ߏRWVm" R\\J"**J0Hjjjċdy9SO=EGGo&`8IKKlŊr)N>N[[UUUTWWS]]MBB۶mcٲetwwc1l߾AFGGz/x\WWÇyWNt^)?j+6n466RQQ+WPinn&&&zzz0 ~xgux0==b`Z:Aٱcuuu>}5kpYXl{hdΝLNN:VKbj"-ȢE8u~B>388bu92owޥ6:::liybccٲe & 6l@TT###O)dddddddddPׯGBBrV+/vժU (,,}v)A>#gժUŠo>PՏ)zT*~266|>>޽^R&;;J";;gy~?W5kHHH7388Hzz: |>9pV+/bccټy3n76m"//sv؁ߧ RRRRfa0|"h055EJJWRWŽ RTTӧeʕ={AYdp1 zp8s5v؁ZbRHIIh4p)DC#}hhʕ+~IHH`ŊVŢ͛7<%0Xx1K,aʼnE>c&&&Xl~99edddddddd>bjjJlQK].EEEx^<`FZtJ&͍eD|>.Kh!h%=p+vYGc4q\B1YRv:( T*aaan~PO҂ :N|>T*(B*9z=@@qn-T1\P{i'\jIMJ'Im%)KǨT*DžvhY6( 555B@Vjzj$.jn'Ƨ4%{-NRRƟB?<7oZo2HII"qE̗nt %{2Hs4΁YӐ~Ȳ!GUytz{{&\, Y^}TC1>ȐVh ᇡRA še+'3l6B;zj-Xu$V+F^{2=hyN4>M<%t\BAF~y8,H l|.########o}bbǪ<""sǝKBw ( VqzKH;_d|,&$X,"##  yrH%<<u|>$Z~`0HXXяy_<+hּK zKp|qY㞔p0a6̗Bnrq+########@]5]ܕJ}n_5aaax/lMRoI﫮 ) F |̿ ybT*nnjLMMax< #ݎF2==nGRHIJrSKj)I/EV+v]tbQ0 `V6XVj,h-.fvEt]R{<ffffjjJF9C0`ppbcc?s{JBw_Pw G\VP(bDRb>|LMM a>iY܌d2=l68C)K"BzGEEn`X tLhJ#yE[HK1Ҹ@ Ϟ#ě`Պ ϥrH8wy&###m?@g?s5\.QQQl6J -xƇ~MX|9. )&,>klI gϞLljmdQ*(Jz-j5Ye8NΟ?b!??+v˹鱗}q5ٵkvԩS`ZYdXPt sK0>>Λoɕ+W'??+V+YYYܺu """8w˗/ㄇzEy ۔EQQ j>ZZZvoPUU //OH~F CqyΝ;Gii)v"66Į]hhh@ɛo)B9±chjj"//O协\.xjZzTTT088HFF###"DAZ|Gsrf-\.fff裏(..O---?#Bݻwl2p8 - СC !)xPT t[:o @Pr?˗ ostJa]ʆ"e樹3iUbpp#GS<ҿ}}}466r9pN͛Į]z*x^~R]]f###{ .Fqq18p:1JX|M._LOO\xQKiiiLNNz筷ҥKPTT9z({GMM F^o!l?>aݸ\..]}]]hVfpeXt)?9rIII ^m6FE@EE. ;wB,Xo͊+YyXPe /hnnf<>}@ @||</ؾ};6l[|2:N AϟO~~>FW_}B!rss{JQQQGXX/nL&=Zwe^{rU~=zL&[n֭[l?/K.-))1JJJepp޽{QTl6~~- Mjj*ɜczzzb۶m_%1vjkkرc QVVFjj* x<r5o}Q]]͎;hkk#33s1<|˗S__OTTmmmPUUECC7ovSUUᥗ^X,bbb;T*aʕqmnJkk+uVٰaXl֭cϞ=ֲpB^ʏ?Kȶm8q8|0@+W/###?G/6Vbɒ%;wsNj5O?4/_Acbb(**y(JoG}Dkk+7n?ȻիWz*;v`rr3gKrr27n__0 77WrODd…k. g?ƍ\p466rE~?ϧ{ߏj{z*WűcǸtlذVٳg2}Ynݺ%1011mۄ;󫯾ʍ7ebbB,|errՊW^!''lsŠ+ؼy3Ǐ **J&?I"##Zܺuf7;iuuuNNN088(^M&wfddD_Tr]?cW  ==_wh4">>*jjjf+Vl2ظq#\pQ2222~ LNNeZ-/_&;;Μ9Cww7?Oc||aÙ7o,wWƥK~@ii)*Ǐ311Arr2ϟvEll,gϞ ӟ[RXX֭[Y|9DDD0::ʍ7QDnn. P\\K/p-Ο?OGG'BNNcI]bgϞˬX8.\sHKKc``Gxx8}tuuQVVƢExh4f~Ekk+cccAưZ瓚*;==Mbb"h44 ,]%K}vJKKyٴilݺ6oLII 7nŋ 3<466RXXYx1𛜜dzzySOqa\pAz=z.]*  QQQ z^K҂_h{#<<^{~lBbbXnW… `0HTTGDdd$mmm\.'55B _ٌܹA <III$%%aX#!!ٌZd2a6  HJJ b'$$$&&("##DJJ SSS"NBB@AqoL&Ľ orr2ɸnFGG}jX, OH-Z3w~Ç޲[ZZRdڵnÍ7ظq#qqq||>:;;9x ;vݻikknq8+++iii/`466OVV@ǏSWWDFFzjpA||}۷ϊA r {ڵkBkҥ#022Bnn.|>:;; xr 211Akkݔ\J&''IMMeӦM 000@tt4))) Vlݺ).^&''GxEzz:UUUl߾4E 0TVVlb٘?W>t^ŋ)++#++,XիWcݺuÕ+WXx1poQMMJJjRWWGoop͛8NJJJp@\\TWWvZf3w'? $$$p8(((`ffX"""p:088Hvv6v/xW?>CCC\p"~iF#v ;>,-FlBVV===b!hAΟ?$ܺu\  K^^׮]4V˗/tR֯_RĉDFF Ai.|b0ZB3$// t:~E%Kpddd`tR` 044Dll,%%%ܼy.j5%%%\|ɑ#GG ͋n̍7xb`rrLT*SSS" 77 F#IIITWWsLdd$ʼndeeNKK ,\ RRR=M,Ij)ijj!._RdٲeTUU–-[XVݻZ`qݴގJg!99J6mDVVUUUx^qdׯφ KII \xEi&T*'N@ϓFyy9}}}ر"qKcǎ l6RRRI0VFFFFybSSSb^P0>>墨HBTVCEcBm ]ŖVCUx`|w? zF#K+$hu%qPcEvsHnd"' 8j! $Z-~ΊT/R8 ^}vv;199OS!%_siHaj_%CJeԉIBR3i<[C@+)hK(.`!a\/2̭tv:::D3331͸\.~_+ftww 5cLff{] SSS}Rc||rrrDy3;F*tt~&}Ī{4Znt:UDimkVK}}=qqq"fTTr?k\_Cw߬, T9Z7߹ҽ:BCI,t%$:gYtM龐&z @X4BsڎRuAe BCCǙ{ͯkoN~~>BRR}};A l3wJmzt_H3w\JH>1˟vwЫ̷YBX,h4!B+P/3},]T>P%_FZ?tBz꓎ m?ɨ{޹es-߇o98n@6}RϽoT2K?nmt 7븹߹ Pמۖti?w^ss, ۃY=s9wΜ{a[·15쟷s3tKѰ}v4ۇ'ᣎOo:AecuCFFFFrĄp~ly^?wLBfV}챥OGo RWUaZ1 OKm#""y#J mw.(9> R)ݣw/k~{NiOFw9as ɶ+.w%7KITqp8p:|t훎B@?p:Z8f,in<>>%22Hq:Y*|v]ܕRMOOP(X,h4t:F a *nXxOi?1~HpB8::R)\JxkU111"׷'&&?)_NBB&IdxzzzD'M" y'&&0 i^R*fYIFFFFFFF[CӬ544Aϟύ7ijjbǹz*}˗/d2qI~Os%v$l6 *]ww7̭[Xf#U(4ؑ#Gr W\!33~pM2TWWsx"ODrr2<ϟ/',,pѣLLLRdϞ=|G 9rԐGCCgΜ˘L&GҥK={ŋsQjjjchZQﰰ0.察At:|"oZr Ӊ^>BZXjOpMVWWDZcǨ  믿Nss3 "oMM 555$''ϵkPՄs `ѢE(Jl6zŠý4kR4Պb ̒'xjj xi4 C((K iz>@ @bb,u{%,ҢrT*9{,T**2f`0{ǵkz|Ң[oӧYv-aaa ^222222222+|4k}[t)8N),,/eeeG?KJJ ]]]477v!))! dgg?d\|s7RgE6ő/(r&$$q~_`ٸq#---TUU o)Nff&DDD~`0oQL&.p󉎎F+ىl6 />V\ɺuؽ{7?9|0ccc$$$}q"""D}>@XX6DY` ƾ}7kƻKqq1\~ JJJxo6TWWݻwK/{'IΝ;Goo/kbPFFFFFFFFwJpqFGGq\r+V9qK,At:)))駟]v$ w]Z^;աT*Yd  ngΜaDEEh4'N %%vx <zsΑKzz8uXv-׮]ѣ(JFtF (((`0EOOׯ444fT*: .OJJʬ:l6;v ++ w]Z[[`ffJyιBW_%++Tz=/^$99R6mĩSDDDp'm4ƍl޼^b>@``߾}j%>>8C^^999_KE`˅">>4"##ڵkdff0call?Xxֲa>Yd jϟώ;q`0|\xBAUUzL&/EAA۶m#33'|_;v;zIKKCROO[V`J"11$jkk~Uxz0dl޼ZMAAf~YlLLLPYYImm-uuuF.\Hvvȋ\PPEb:`0(gE9u/?v8n\.V7xBO? s5p8ޣ\~j^裡 033ngܹs_|F0DGGdRSSu}Áѣ\z^z ͛7yؼy3ܸq0rssz|Gtwwcǎ% FQĴGGGc0 Z4^멨hl6pOtb0t /nRػw/333c߾}h9s@ 999TWWSWWc֭\V˺ux<۷y9x ~>222hnn&ő#Gx< zGww7$N8!8]FWW̟?t&&&8p@233 >66Fnn.D\\VZ-+W&''Yn~@T@II === n: 11>`CcЯ\BSSvի̛7M6Vr gy|_vw^wP\\, ~?.]">>zimm% 288j%99+f#22Xr%9993|-[ _`l6 iii477/b;fjbccgh4LMM}vFGGYf QQQ~rssZt:rss&""%KMttc'_7BcГ_|i4 *n"&&Ǐ300`BXSjа'']155%$rEQQqS( =D>`0GTc$X_i:66VJoV̭߃P?Pv BFRqM:ďcRRRD( ZZZNll,vɥ~NFGG{^ 2*J~3 9[(66=CBt>hNz+6bXD&P"q)塄桿3Pb:׽_B*k-=']AEO{h=6qxBaP(DyĎϭ_:N&jynԟsyX~0+{'v>B-LHux<( qgch;~w: n당1222222222_O>11ɏEPPxDn{]BnGVj5/KF;{hv: |Y\b`0PO}, -r,H^o/ߔuEPv|³GFFFFFFFFwB$:K"b._@G} u]DHuqf4dB󛌌7iQ3_?d;sE)f|[-R{>蒛O |Y󛌌7IQP?KDDDvgppχV%!!VabbN'###r1<1>Addꃯ) Z&11J%<..NZM\\za  T*###F>QDnn,<555,[ Kdd,$ 044h$66@ (~_iIHH@׋9d2a6팏: 299f#)) Fn9>|]Xjg$thPT9~8zj$&&~foFt:gσ:GFFp\c0tFFFF|$%%=eddddddd'M??<ݻfIJJ… 444b L&G[n} v^Ν;~:T*լ4k7oƍXV?stcj?:IOOnoڵkرc… |2LrrH#/b&''/Db49z(TWWS\\,^˙3gP(8pvb;v._LNN7nҥK\|Y@={*Ξ=ҥK9qℸ… tҬYVfffD Z-^`0HLL XVx.{@KK >t:&''X,'fsQUUd2jjjڵk444B{{;N BAtt4.͸nENp^Jt299ŋQ*dee=l6q\~^/nR033_urrr0X,&''j`0fczz=kHa"R/ G6Vi$yjj0:ĥK%==;wG$ʿܺu ڵk??vY`ݼ[ܾ}y7ill")aZj N۷y& .R`ll Z-T~?444k."""顳 RSSC}}={졬 1 ZV,TXV I._#pe***dff222"]shllիP[[Kcc#;w$99IvESSXܒں >1/o>'C Dl6~ ryyشi+WD`Zٶmzٰa QTTDAAnAzz}yGqq1< dŊhjʢk׮a4Yt)QQQvZYd ĉQPP@OOqqq̛7 Ξ=RIcc#KQQK,ɓl6'''prrrv+Vl6Kii)/^$--e˖QVV###lذɰfϟϢE8u .$**JCss3.]:&&&tttVhooĉbTWWS]]ffqIRRRܾ}Jvvczll,VvBvv6MMMlݺ:/_IOO[ray9s ӧOSPP@ff&{<}]nݺŵkXhc5###͛466rET*555TVVr5Z-W^%""#Gȑ#100@^^XPx}j, F:::hkkcƍ,Y x9reeeqq<n??رc̛7'=|ddddddd|[*j.\Hss3fbb@EE+Vpq,XJfQZZK/}~8vwܹNٌd"v?Wz*++h4hoXXn'NSO Q0Z-~s1jVy7p\T*N8AQQ7ngm& Zh4={d j477ϦM{9XzK>y$M`K/D^^f}{ܹs)v;,Y^{@ `0+All, X|9̙֭3~ W\yx/NG__ׯ_g!,, ¡C LXx1Ν… LLL0::J0200 ίP(abb??|%&&Loo/6J>qFVX$qqq,^{*1bXf+BNN|ߥCx]DDD`4q8lܸ'׿+AΟ?͛я~DBBJHf3ITT~c0j"h4b6ZBv;QQQ g||p!i+qR]]M\\111$E\ijrUn߾M||Bihh &&,Xz5~\ªUPTf줾8?S.\(4Y|9jbcct\t KLL -uU҈tMTT>IL&z^x&lȠ^N8;j9rD%&&~yxT*!v˧8u@^͛'v:rrrbWvhdŊ477ׯGTJbxxJEjj*K.ehh!֯_}}}$$$l{mm-mmml6+V`bbZYz58NVZZ+W`6ydff*JKKYtAtDEEz~:j ߏB`tt [,R٤tI+77V)++p! ŋcZinnfݺul6$33sV~sJNN>bccx>Nmm-6lIo0]155%|v%(@w^B!(H0|R{$؇iAyBZ:I}X='~n>*'i1  çb ?gR>oAqY0BhY%w7o211A0$!! |%ű8wtיA!@ {ի-Ynqd&INv6;{̜=gNvJf'8Ď{l˲lu");H QB?Cڲ-7Ɏ9&ͷy|a~;#s|1t~0}?qA却"D!BO^622 Nn-weaz7rϟ:aAFQms||=_"**D(++{FVbt~]?ofzL&xd2`# [㾃tG7s8|Fa7z{i'O{L"D!A6G!މ^/F6X]]  ۽V>33H$Y@ >_-+Cf';!!a]ԁl%*Sa_y)B"DLF{oiۏ}z(B.].nOeU*Wf!,XXX@PT*`HD ܶw//񐐐~F!B"DwD"q~nQ w}Yg_tG8.{ٱC~?#D!B";d*v)R)AfggGVcnnݎRD*x0 p8c~~^(4::lpRާjcüe2LOOPT055GRL&caa@tt{ Ǚ# P(0  R:>8( $ X,bcc䙙D" Ԕvp8a~~˅Rh4b0B&֪SSSLLLzSUUq///V3Jd2&''eiiIq?55fq8LLLPŽgLL̺ԄB?o*蚟gffF~iښ'OɹeaD0b===ddd|l*rp,"Z),0v&''*`ۙW_%66}qP(;W\z:b1o&b+W033$$$`V)d2uø^`@.<==-GGGc0nh0LNN2??/4L Ǹ\.&&&B W`||^B  '>>\yr9]]]dddܐc[o.|>SN122Bnn$i?{9faa+WB177\.G.p8~I\.j9f}ĄPcc־czamr$ T* LOOcۅwd2a0hd2D"app'O!BDC ^~ذa׮]ɓLLL`0̤~{9oߎFW_?)G˼D" 455kYgwvv /0447 aCU*rpB Nك`ٳIuu5MMM --,aV+o&|cbbxʕ+B9_|:BD"N:ų>+~wŋ300@KK W\A&P(hllsαyfΝ;P2)&&fnXX\\r ja@||<& łG"`XX,gPT " f*8n6k N^ʵkp:cȕ+W(**y %ƞx Y]]%//O(6НN'&Ix&yyy7NZt"ɰZFqilldÆ \rEFF:㣯7xÇ#JX,\. 0F]%I\Ntj*@@(1`0GxP*vYH 8NBBjZVHVJE?O=ĬaG^ŋlܸ|6v*.DtCCCXVx'Arss̙3"JtbXJD"`dFc0S^?p8~;6nHKK @ػw/*999XVΞ=c1>>NGGP! ZT*yiiiO~~>L&r92Flذd1DGGrP }466Fww7Nb~~x~_ȵk(++w455QPP %Z*͆Rp)ffffh4"Jż"ˉevvՊh 6L&o³ 7Wl6ea,+9~h4 >B`ffFxO=z,VVVz`0"8gffXYYAPx{ B\|N.^( hl6XL&h4bZQ*|>X\\D, J*]_f3gΜ!;;P(D"ayyY6B~L{{;%%%7ahhk׮QZZ|2mmmbZyh4!v***8q---477 %QZZO?M__MMM244/NV+KYY>,455O{{;O[p=3>>NQQΝc۶m( ~_ȦM>sM"Dx@OKKr7$??ozuV]#G088HWW@{2==` ''BpP(ؽ{7:W^ÇsIjkkV|aCU.SPP-[hooGP]]M\\޽ZMMM ?;vPZZ^'11\tPr$ dggSPP@JJ lذsQQQNJ^^,((Z(..fƍ\rlnʶmۄ={P]]l&55;wRQQAYYϟ VN 8uuu ۋdbuuaD"/SSSdffOOD"hkkՊ… 255ŋaii>IIIl۶ EEEtwwgz{{eƍ266Ƒ#Gx׹;IIIw!**sΑGFF t:O>---TUUT=663<---$''3>>Ν;';;@QQѺf*++ygappUzHR^|EKO~ 2~iHKKW^all7xP(DkkE{{;ӧr%bccŴ355%8 y233ihhM!=<999z.\VK/,SSSvm<d^__Occ#]]]x^, Z8\t|ʢBA__Rs=G0 R[oEMM /"11s%b1oAJJ oաRt ˕+WHLLdddZjkkyX,/K.jr (bB`^z%Z-~z[t:y饗RSSBiKkk+呝Mff& w^D"l߾~hmmrQ\\ o\.ԩS2::nߏ^d2ťKΦ.(.. (((_qa^`vv1oMffD(f3'''y饗0DCC:Hkk+W\!>>fg_RRB[[Okk+===tuu!8w|>yIOO'&&HDVV۷ogll '8xW1 3QDEEqE 7ovt:9u~;ZD"$%%j%''}{& S]]Mvvpnz^ɓ'{ ;c|i(++C*сho5zzzؾ};"@ S!==}]Cb2RRRx,//xhmmeӦM<#HR^/Z{wt!Dd6mĎ;p~\N[[#dñcǀwwlΟ?T*^INNsq9vuVx fgg׍^{7]+ IVV?9p {Ed2>Ŗ-[vUUUpavEss3.KP_%TѣGttth0׳̟ɟPRR \ްpd"=7 jjj(--ȑ#T*n7%%%tttp5!2H||<7ndϞ=\pǃ\.jkk׿V‰ڵعs'z{{eii JEMM SSSβeػw/} 8+++NJ˶m(--޽A*T*韨 <ƍٷo;w}av́hoo^pp8P*B) ._Lll,v]p*366Zm۶IDATsIRSS,//sEL&*>l6)))ٳBB>(… n2B7#ɐ(J}۷ݻw344$vmL0D9{{{1b ILLx<bbbŋl۶GyDgy^8D"gy={j@Rw6UcbbT*% hZF['\W2==MFF+++¾f J[.^c=ƦMHKK`0?d2rA[neǎT*6oLAA`0/áF%PEfgg1Ll6>6zBCL(Bkc".8jjoX$h4t:RRRM&Pm۶QYYӧz9y$jZcbb `ya™3gرc LNNC,vZwMbb"/d aa<66$vb޽ Kbb"111b )))Byp(.$^/A_ZZbyyYnvv6Jbpp[2<<  B!a<a{߾}T*)//h4ݍn'//x8tUUUsaaRӡJ$1::JGG===ǣh((($077RdffFД+WPUUELL C$]ww7v`ÄD=JB5 GC~__l޼$h4q}& M0dnnnk8bf%v\Njj*qqqvmTUUq  j'# Jcbbb1jLFJJ Z;ww^vAUUo$\x_~RߛL&)((`ppV‚jarrr+JQpĄհv\\\#IIIl޼~FCZZBɒߏdR~1 hԌ,rss吝***0Ȇ H$tww344Daa!YYYF||>^$66[ yi6}M~~>111#Hˣ łlfTJJ iii7} qA ;۶mpAEEs0d˖-H_SSIII?~l!`ΝTVVjbP*lذٌX,b$9998R8}zzh|APwtuuqFoNJJ t:>N+ ʢA(;$''av;[|>rrrHOOGP088H RIGG333t:*!A"񔗗uVTTGFF"D"*{6mڄb`0pAt)veffR^^SRR[nw p:VBRQRR iiiXVưBZehhHH癛# grr26^9">(&Ac! VE*!''M}}=111{hmmeǎر$p8G[[ U]]===qaaݽ{5>>ZF y4z)**b߾}]-[عs'\zb#uMzz:dff QR\\Lgg'111-OKK(щ ~?n={`2$%%e&&&XXX --RA1j<66Fss^w4HRIKKcxxeP,--GYYtvvjͥ(t$%%Bff SYYIII }}} ;MMM8g022BVVwqSSSrhmmERe;DբRG\~~>@q:B!;n7,fffHOOg$$$`49x !HqN;v`۶mBee%v"==9vLOO3==CE8Gbb"$''s!rssbpwSTTᠫnjj5w^fqq"\.8p7hhll$77MWW>Bѣqef36$.!B$]dZi x>0gvγHLL:(ò177Gtt44A<1Lt[Zh4#immDHMMeee_<=\]] c[SSbMMMLOO3>>η-233w===BNc֭S*$0:nݘp <÷i"||>_~LBdZiiM!B>ahd2t:ݺ뮘׆,ֆT~Ґ=ϗphvB.CVV_Zl?{^{+IErr2`PPJBDEE} NwB!Z o=#Hصkiii߅UZ/o5۰cD"7nª#DCG"xAg%11QR}"D!WqA_ZZj~Zٟ|>|>q:WcnL&lp?8UnUP($~ k/a껵TA߅_-ZPV"j܊DOLOODll,QQQn&&&f/%U(0>>.*.a^.V3d h4>FellYbbb(JAM3>>NLL BC*)&''׵`~~~FPl||yݰZVeyy vXzV`||c{^.*vaV+D"[* yjl6\..~zapjqXafffB000,6 FիWtw`0Hll P(믿N枵߅pՃ'OGQQ)]FAA.vzB###d놐-,,!Ell,NH& D溕|u>a, qqq /`2A,sINN-B^^LMM}`x<A!fDI__PNo\.G3;; 0LLLк:.]0t:FGGL&m}hhh "D'QqP}``_򗬮RYYիWy뭷c||\(266 / y~ƱcǸ|2 dV+?8^/RUUEtt:}vvg}n:!lJRΟ?Ν#55@ ?OGG{`0P__(lܸ6qRSS6׮]c?PC:::/299Ʌ /P%==wy{ݻw#cϝ;G^^###Q__H$BMgg'ϟg155穪BP3fP6Q(®F||<,,,d2@(`0F'xBj-Nkk+Fc=… O3??OCCQz-FFFX^^Js5n݊D"B`^Att4>Պc||q4??">}K.QPPL&cjjJpx8L&vJ "@饗Oʾ}hmmepp>ZZZ0twwe: 6g}RI\\:u7xVK\\]]][oa~ '&&8uCSZF*`RhD#8}4J@ F3g0;;4r^xG阚bxxQZp'd2ƍΝhoo'==W_}cۙ_$66lFGGY^^&66XdbjjJc'&&X\\D"}vvZ^Y?JVVv&6nف!B|CmڴJi&9r{F\.B=ߜRP(*QQQ~d2_7&?//ǏsOb/sk uoogppPRrDA&j׿G?CX0GEErWjxAVWWQ*<~_vþ}xꩧ_x&--Gye~r!2??NC"LVV333nN>Nc``??~;EEE `4Bb4ehhHHMM%=ƍٺu+o`LHR f  //2=zZO?͑#G7?f W^aÆ AΝ;<Ⱥ蕢"222祗^|^PPjeffyB{{;sMդC'qYbcc  HHHi]uii)333xh4BNְ3n#99|^{x$ 8NƍgΝl6###;wSOBqq1F3gΐD"ayyW"ذacccTVVRZZ??h8NN8"fF"PXX%//~cnnNpB}{z]Ʈ]('? l߾}瓟c=Fnn.łeϞ=B4Ζ-[mFrr2'N 33P((ddduVL&8N<ǏgeeW_}Z1͜8qFC{{;k aR=ʏcNg~hhhv][pbXp8(++'==HDgg' r=sGAA˜|xwGm۶z[NX,CTTb}s0+J|>u}>MMMl۶پ};јL&&''ٲe HRD"}}}444wKkk+%%%|[ߢDž={7x^~2??Obb"eeeܹRyGra49{,sx<< B/4B"DY|r0rgh46nHBBcccv|t:ư!j=bii}|FX\\č{gǎ X w~~@TRXXH b0??hpÑl6xŸn_ya'`ddZF<O<l۶P(ĥKxgپ}F\\999y. !JdDEE ‚4,//#DEE999|>b1N222jTUUqwN~_P]]Ve~~h=cjj Njj*sssDSSiii,//366B2ײJOO>l6399pmoƅ eٴi%%%X,XRIFF ߿;v ؘ[XX`yylZ-5559rTP`0Jb\t ׋X,;oo׍`0(,+++BTZT*F&??_xQ]][l!**F#|>ㅜnHJJ LNN CCC j)))j6oތF"ZО@ @}}0(W^E$j9wc]ZZZ$//OҒˣuHNN:NpމD"<ܹgIKK񐜜8bccgrrV+CCC@MM ۷o'66m۶!ɄP($FDVezz^/CCC477#Ɉ,//P(6 Ȃ (--6䛚"11!:::#j a0HNNF311b1::Rnv(--%33Sp"x<FFF@P??Fff& xBDEEaZQ(t"D!B>::*ct: MMMr^bccV~~>111lٲ7ƾ}Tgee>n*`A7Lyyy7ŖH$&'' r+˙cͥш%++={P[[Kjj*;w$ RWWǏGVׇD"l6hD*@cc#;Tŋ2<22"SR[[裏كN8:Dqq1x<ȃ#G]$. 188Hbb"SSSt:F#QQQ8VWW8Ny477P(طoiiif† hmmevv۷SRR"8N`||erssQdffP(YVWW]Dzz:X IJJ TJqq1)))- B!v?~˗q} NzJJJ0͔ E,cٶmPjEaa!;v@,Ntt4;v/h48Nn7Ǐguuk׮P(p0|_X"P[}3DBoєSZZJvvus|o8  KwLoj_0$--MWR_gLx~F~iX,!>aaRnwF$R>a"D!Bw"މ^/7>o>*uSVt:x<8pe!g5N>vZI(t"߷); h8D|BU"D!B_ \.tzV̽. C! (?v߬wHtKC노GqB#D!B"|q|:uW"w"|p:xt000Ԕj===*JG|T*3>>N0DV3220Rt]y@gg'333h4R) D388H(B0??/t:V+mmmLNNbXcll!sPq W;XYYl6HdbJLNN ȱ,--ݍ+a00UoȔDR}ƺfn+++8q?زnkU?y|>DGGc~  f3 +uj&4 }}}$%%|IH0dvv@ =^h\׿Nu333t:RP2}Ztwwfoo/fND"allj ݍH$̽"D!B'QqP}dd~*++|2ϟj200@QQ/{nj5==wy'uuuՑHJJ 333(=$''3PTLOO{ aCU.STTDyy9$''at:޽VKUU:FvEII zdrrr\Nii)rN iiidggSQQAnn.uuuuv1j򈋋6jkktR\\Lcc#EEElݺ*zBmq شiJk׮1==-я~b!aqobZyW?) 022Boo/rZZZ(//6昚zjj*555XVL&eeetwwS\\47of``@0villرcTWWs>L U2ccc^@TP(xHOOq8rw3)R)gǎz222ؼy3EEE\|G(mزe˺I% RYYѣGl8N^/~;az{{9~8ǎ[p-//  ᠣVB^OTTv{졻Kv^c6yٹs'"ljkkGRq`ӦMܹS8'** XT*%**={OS\\,D466KRRKLLۅ>! ѣ8\.7'VUU>(d2xCPPXX͛}kdeezx^FGG1 D"d2r 8x j۷s]wT*y衇rQPP={h4pq!vv< /ߎT*E*" H$d2A%si4J"55U!xzzFFF6 Y\\dqqݎL&ceebiiB!_}vvłbvM(4q\`dd |>gϞgƍ"p8c6umB2ł3%(BgTTk׮@^^~D2sss騬;(V+r;w Imm-,,,PTTD}}=W\!++ Fww2^吝 .sss2991 T*ٵk.:nJSS`PZZ*QT员޽{T*E$\.h4DAA:>T*@BD".yWW i&0 AIOO'==GqFHJJrhkk/^&&&vBDGG )6VHMMevvvxaaa:V+)))444pm1::jr!ZD"JJJXZZҥKdggP((ѬĄ:ֆ%99۷K^^eee~ iiifFFFXXX`aa˗//$''se)--e||+W뷰H$-x%:)Z[[YZZB׷(,,zpLOOgIMMbPWW7nDTr)//._Ljj*z.^㡦X̕+WLhjj"77 6ŋTTTvx"z[=d#D!B7 q@#HCTсJFRa!;;&'']va6ikkCRqqr= [XXhR)9997_=<z]]»hy'?ӯʊh$w[ݔ"D!W^/lBed2:n]uW?`n<X]]y"H8ǧ9ϗn\͛ B}i'7r5nUu8%zPPP (;}OCBR5E"jjBb[6f~aT*M>-5nE"555]|[B.Y2Ҷ呞"D!M{VUX߬LTOe;NA`t~|v B_~D|>|>ߧ'7re!VZ~QOc폵p+qeFK$}E8N"D!BXmO*JMM :>NNA$GG!B"D}숾+DX=—pGio\5]]]%b BYWWW?Vٯ77 BcC%"D·FZZZewww3::J\\>&!>>^P/"99XbZ-tvvZ֫l6ZZZp:$%%}U3SعZ^^qtvv222B@R166FWWn㡽]`FC__}}}BLMMZ(D&阛%YZZի2??Obb" DŽ[1>>?ggg׉J֪*GEE1<>S_DFY5\.P:GVwt^7JinnNPtN\X,7F#o4662<<OFVoH^^pl(bxx  ¸0ͼdee$! шJڵkAr---N\.NFGGD8 Oxinn]U^|EaXx饗(//G"@[[B /@||1^Rdii +E>n6NMMq$P  C?N|>/2GLvg499IggC"Dp|5'''yTUUqyxVe~~z8v;"'Oӧ zPۿehh/m6|I<wy2_ .pA}Y \t V˹sA}}=HRz)]åK(..'? ܹS_|bN>MGGPMOO(ǙfvB J`jjX!vmذAxna?HdW/RVVd"&&шgffgyZI!B>6@6޽[iM6?c߾}\x[FKK `B.\<2;;KJJ я~$뮛Ç9{' X̱cBZZǎĉB!233dll_ׄB!KwwpIظq#P\D"abb$ Ztuu1PTTVVFzz:Ǐ]0nn7|>v kN' :t9Oll,477 kY]]g? j5Z򘙙jRWWGjj*|?9?  dee|9s@tt4CCC|߼izlܸM6qIL&PY* ;>111`.xHKKŋDGG!E"0Ϟ=׾5;sp^WW c6h4PSSùsx衇8q999\|{w;w$%%e5ꨬԩSTTT`X΢Rxʟٟo0vGEVoC Q>lݺU蛵s ==￟zfgg@kkk#!!Ap8#(//7 NS0 E"d޽;vl<#p5ǹ{;Op)J!>77x|eYYG.X ;"rPNsqhBur9UUU<3 )[QQQBd2~?b#Gсhv:d2%\;EzoHxW!c聆J>]]]ر{ZZZ(++';;^/8= }_VVFZZ`D"Xy뭷HJJ"77w،!Bnj[,Ǚdiid6oތFa۶m$&&244Bqn6ٴi^qT* ~m<ﻮbddY?qq]F~~>n333LOO333ÏcJP[yvv)FGGX,s,슫T*VVV{V+sssF! 144###8_qqݜ:u^x2n7---?99>Updx%XLillj DB{{;6|VWWf155EII :r[ pU{1 |\.r9|>)Lii).]糴DCC^¹VUfffAFGG?vB!av\8Dž"h݂^, IMM%''d>L^^ipk¿/ûN\.v#||d2ٺT*l6 }֡6~JKK;3h<^sssBIZZgϞrHOO'))6Alm8ڰ`0<cbb : gyy,8i^hhFFFdr&''axx~?׮]"JKKȦ;4lB||QlBAcc#.\`׮]ٳ˗/S__ŋDR?>1US[[鱗kƙ3gOzz:\zFCuu5 :u["J Fz-^{5N'~ڵk$''SPPs=Gss3gϞf ,JoS̤FZ-Ӄh$))|9x `0`X(((l6o ϟffff0LNN266"D!BϋAaii RNCT =Ǐ'&&EAADGGSQQAee%EEElٲ|!dѣ`ŽtP*++놽ksPvRRRD  y^d2+++dgg311*2 6oLuu5"# rqT*RB .!8t"N4 *eYYY!:: nj0L޽jbn\R!SRRGYee%ٌnСCFbb"BAuu5DEE޽{z,,,zSJI$VWWlڴh&''پ};ddd066&8aِ;vP(>Ǐ ;pbbb"Vx#)H'LYt:QTDEEHII!&&,RSSIKK#66DbBOHMMEբHKKCTR^^..I$rss'33S0Đ!+J=jN}7'k#D!B"|8І`="S:9&-R)33Qd B!vdfpUǶBRIer2WzVAʒj\\Do%3TJ^:Q ',ON&OedB͖4].:M&T2SSQdt)ML$_``ڌ M&Bά, KK.-QBR#KKB&$!)`^/23QH\ BT$%ˤYZ-剉ؽ^Z bbؖD$83CYb"*6 ^GVKBkkJ.']fxq;N>B!R5zِBFKKdh4T&'cYY}nXtbfg;F激uЁDk}զ3c#Yt{C$ !Z RccJ$DT%'01$$cx5:5d6ebb\X`jۉ˩MO67ֈ!B"D|+?7]YYp[^23IR*fUb Lt9hh4rNL fT<=ޱgu]׮-;;Uzw<i$JHJL" A sh@>DŽHIT p*@9_xw{'B!Nu5: B?oǠV%;߭APV((SR u%/(B ?[̦ g2 6ggQ*{(4t4?۲T^+dfJJBj. - x_8j$A&hDP'7c2I_XHYFPHxxZ\))!ljEP`(Ƞ -KK`'%]c_QLLZ-f3yf3 [2oLr'(< E LQf3F#?޼]9T 9(KJWXƬ,~V[K^`Rg[~O Q*Q+֯$=}=MÁV8P~I$t@y,´4lF#H,ܧLw0-)(rfh!0Jy##qA`ho/ggQ"pmr;mEJ32p:;Q볲1Bqb(PO(YeFNJ8̙aVVP(8:J8CnLOs ++\%s~l 0ȘMYF`4J?۲L^jj(X^UUV+rrؙ3L픤aT(j4TZ|X"A4[eelͥ,#?2|y2R(XFbj (pFR'l'd>Hw7((n緪P)hU*SQAaZ [PߴJU*pFrL&-*bgn.E e iZ-{7ޝė%kj,F7:=%WW# @Ѱ3/),z=ߩ 0KKCT6?U^I2\:Q-N1L쬴ܢHQz:߮n+J~(i0Pl0+W8;T]!A t2rQ?4IER!ܞ~\w7H"T,z=ՙa\\dsv6iZ-V o`oa!9&zzѫՒd X%jwj=EA.?> S>S^/V+y-.:3kܚ#`bATEt٘Z#&&ؖK(wa Řie5B!ܜA!lu8]φŕ;9R(ͪ*VQΏ9Lg}E,ߪh?K]o8~37?}GG+袈-5J ,O(DHIWVD)..EЩTtZn`*JBhS`6>+ ^\dg^YUŔ{'*QseVAeNQZZ,SO[LRQdPAMV-33b1,z=&TjvlAt*w/HZM]N%[,l&dbquBƻ1벲0_vQl [| 玫(=7y^ϳlk }ʘEw"w{ 9;;!  9Z) ѵR0H <_ZՉ J%벲$YFYMqSpS*ﮝkLTddHr2&^2 zXgܡqQ?ۇF$HgM(Z)#E P1߬bOA Fw? 螟ĞNf9d9$P30X diΕ8igA&Pa2Ǚdhk :HpjxHT(K0fNRD lfYFQ)L|LDq~?sst;/-:;K=8n7ֻnsDQFnD`agr0盎U#Ma'232r12| ݐPR/{a`4N X ѪTL|w `NNF5kXz= ӑbX_PRunp8RDO vK;2Aݼ_wv"&ˬe~Po݇ˮ=4[DiJ u?u?\{TJ;uГ}|"ic5[\oBqF)IMdmwjG=YS|п#sf_o&HQ*\>YK5>Ě4 kBU_GDTbx\(bj1k4d99.լh4/eүGA\1k4XZo pkj c%'(jl:BAJ]#SKK\(3w0r1{V8Ǧ"ލy2$DFCZHVFFFFFFFFC\Ip}ii )XD,ngB(T**gW{G.|!rDAZژLjVWQLZWin<. |>2RSscOiA7 ?j\q\znura00|͓|Bff#x|>zҲFNF#SSS\xQV+ZV]F<… ,,,M$ŋrz{{IMMd2(uş@\ܿH_ ͡Rsy&>5mj 0 B!\BWWy<fngH$}TYG"n߾͍78{,D"~_PXXd̙3b1(◿%\~Gb0I$b1~_ y&nP!HbĉH$> H#s%;/^g?LNNr5rrrZB!VWWIMM_g:]hjjb~~| X`0ѣGzD"~?iii;z1Lܺu>JKK \xN?Nk}nkk\|>N:ieKl6T*& F$T, B!t:===k*:k׮ԄŁD"4551==MJJ =ߕJ%:,~:H#G0LXVΟ?OSSz`0ȑ#G0::*[?Doo/{;SSS|>;??188HOO555|% ,########T;^x/)h7ng9~8㌍ٶm;CCC>~.^5 (D"!Y?ҴYn[l~9s ;IAH$>|h44.'Ov;+BNNt_~ۿ%''>`mpݼ[yRSS4ddddddddd=$nyyRInn.277G~~>?^]]jEPRRBee%7ndݺub0P*t:f3fYvL^'%%_|NJ&KST$ rrrH$vJ%˔c2X,Kmq8,--aXZ8jf3ַ0 REɂL6Luu5O=puDVVN" ++ N@T&%᪭,Ƀg}VrO[Ւn'##\, GEEp'㥗^HZ&==m۶Q\\,%ܽ{7`0HNN I"vV`ESO=ƍ)))vSYYɮ]())ARI^(J U*yyy( )IBDBSh2Pzih3`~~\ۇh}QRR"Ϯh4Bp)//GVSRRBNNAi,DQDq83hؾ};l6VVVؽ{7v4;wDՒs4&ϗ^xD"AMM vBPQQAvv6D_~3PK8vKYAr y>>MtͱcXZZbӦM'-P~nɢYUCtD"! ƯTk(,r~].fc=JDQraZ`0R|`xC,f~vR0 _)2\0.|A 4 A㏵ a0+++KARoF8o&_< H'4.{@9H<$ ҡBRa{(U/+}h˭̗AD"#>CE4#w!0_;tqLQ 'Ť2_mdwo4}D8-{ݿ'X-F-a(YU5(euuE8faaP(cyyXP({Ybx<'o0$ =I$_IQs$\.皇OY܇8vjZ|yn߾MFFXǏs :;;`0055E}}˗Q* hiiAP`dqĉ\.>U5 7nŋ\.rssYZZ,--QXX㡡VZ-V[nqY2220Ǐ*ے455FKr{{;'N͆Fܹsܾ}b]˗ 88{,t:yiiiaxx2T*SXXBq1㌏,p8gΜappLt:MMM\rH$"g}}= l"ܾ}F#Y8Y>~ ^/@0NbÆ Y=8 Bddd|Ggg')))e|Jܛرc\?+++F^Jnna~~'O255k_NG}}=.q^JJJ G!HHQ9{,###8)GGrMVWW͕ɳg2;;^ѣarrrEΞ=';;ׯs%FK.q_ h4&z=p)<999R?&&&xIIITkd,t^/| ;v 6WANN]]]鶴oMeeT055o}[pY*++"55|>'N`׮]h5 z ^2k㤧sYF#6Nؿ?^χJѣl۶ +-EEE$ Μ9oAmm-~gSORtb69|0UUUҋ 'N`ݨjfffHOOرc88zN'6lh4H[[?w{9J%bXxwپ};EEE8pjnݺ k" 6"gΜa߾}T5 z__tttp8ÕGM,SSS455DZZ[aY]]ŋtwwK9;Ν;)**"--!$##ZZZc׮]kQ\\Lvv6CyyLOO… dffR\\Lcc#mmm˗㔔SRRBSSR)w}qn"6A~FGG"q:;; ?Fl6iLu)))+Wvcۥ\PP($%9p~Gzz:׮]chh^{5222tr<7o$tkٸv}}}wN 2>>N4t:*fjjjh4299)%鴵a3==M{{;äB}}=N .PUUECCvqF#a{=4 333,,,P]] 0hkkJ tuua65͛ l,..AKK 4f]FKK|>i^Ѩ… Pvhoog!ZرclݺU1L^{ 6H$XVVVVH$9r2yyy[)//ncX>`ƍdddӧOҲݸnJKKyWٳ餽FayyǏSYY)zh4}tttH _zz:7nܠU7|M6q!|>LOOs% iiib6"HsssdeevIOO.B~K.ʢF06 /c8FR177VI^xX,iii9rJJ%W\vuVZZZgl6?3f\v;PD"ACCj\nݺEWWtANN,//s guux<έ[f˖-t:(/^dϞ=kv:::C;99Izz:կ(**";;[SX,}JKK@FFx>.%%%lذA:]zX,  RYYI$JSS#"MMM8Nh4b6 55'v۷oB޽{ٸq#:NܹF(v~i1 j6mDii^~(L& W^TOIIT'~x<.\$ݻwcXH$zz)*++ xjjj>Ç LLLpUN<0 ),,Hcc#ׯ_Go0::ʻKZZ LNNrMx |Mx n޼(,..b28u8pR 33|ҥKܾ}~j9y$t:N>MGG.pxBŋܺu477sI|>ZBoI0$pAp\8pɓ'ikkDQn߾MWW R8t4 F_|l&''9up9yvvN<^_{СCXVΟ?Ooo//^daazKR{= .|ewjjHrQ;wdӦMzt:ر^O"jsp80 h4)//2;v@P(㴶w $ RSSˣVړܼyiooGPcǎ5#999LNNv ==R0=y饗att\YZZj؈餯.V+O?ԿF3h4RRRhnn|XZ:bÆ ޽(ڵ L" %%e͞NVOmm?p:Vɍ7$Ii<- ;wD!333Í7$CXiip8x<BQ]]M0d(J</"7oݎ<:;;dLVOK?#FFFS{|b |饗B>}Z:Uôg\.'N`uua;v\t CEE?Gz=. 筷b˖->p9<(Y9r(===ww. x<fff8tۿ-?%%%KV(Ryy)--%pRRRxejjm۶' 055ωDSO=EUUUUU޽[{U(LNNRSS޽{ZHaa![n### 鄷%0Z%~?&K1(..&==ӉJ"ŤyذaW(kONc[SE*++ygȐB4jkk!++Bi`0رc;v 77={gbbBR86۷K^vvd-***bzz~`ӦM5DZ;v~~?xZJJJ$kfCDQ$77SVVFMM ۷ogiinXYYAXn`q8dggFAbhBAUU~6n܈j%''bl6eeel6%''GMMM111kz=ϟgvvm۶k.L& AT3ϰqFi=Lp簱??5kg7nbE~?z-[`yE(Ubk233Cd5x<bbg׮]l޼V+ UUU߿~?lݺ#-- !$2yl6.jkk%++bj5(پ};v"''={,--$;ƩT*9y${ƍ122B8fjj~t}^2YQӱn:jkkY^^f``FCnn.XLV˖-[u4pg}bk\GGGvN˗/Kż\B__ ӟB,P~:No۔P(PTLNNri3 ۍqUĉQ\\L<Aq\=㒛9vzqΉyII ,JB@T9E*nݺq\RA`ddP(D~~> 㡽m۶IV[#9s /1 hP*QThZpBѰuVN>ѣGٸq#;8qP(4YErrrPT;w> rJWWSSS\pZדM&~7nR)MR);1ՒF22F8&&&@ k@K2HdGsE;ȠisT*)JvAFFVm۶j`0`4IIIq9x W\K.Q]]MII /_ YN222B~~>Fh4ʵk8y$ӔQYYIKK MMM3g8{,fRF#gϞKrnjjJɓ'%ϫ۷o˵kzB!ٽ{7۷ofaZ%%jV%El6_!6nܸ(bZ B?!iΒkZfÆ 444pt466P([N9BffuCAjkxɵ'96 vvQzaa!֭C׳a~Kee%޽[?vSPPF!SUU?;Cjj*555ZRVVFjj* H$\t$TTT "r ~077UUU>|/e֭Dmm-`V\x0bEQ#QTIO bͼ b?Ϥ9^}?g)HV7o277Nj/HEE46mBp 2{qQ1L8N_NGG޽ϩSpVijjri9BkkD]]jb կp\TTTP__ϑ#Gy&ݻtD0=3^9lJ%)))466b4ٴiFua69s gFOOUq1ZZZXn$g1'' 6멬pRl H$[J%. B Ԅ?) x<^/H;v}v-yyyI'vg{Is0۷oK'N@El6tww"׮]ȑ#\x^/ۘf9ܺu[ru9jl۶ Rɉ'0 ( /,..pO(#'N BAT꣒ n[ډ " QSS#Y$݇ׯ_Veaap8&Q,c|| |>i"IV7X[fv!%/YnC\.z="\ȓ.ɘnɭiӦMLNN2>>RdR ӉbR\bMM j۷oKݦMpFSSS ܺu ǃd>juֱ PXXHii) QPPRrIkBd2177GJJ H nݺ mmm_%>"VVV䔔 $R^^&z$:33Iq8TWW344 0??&IwuuFٴiPHJnVYY) Kefgg?~B* N."sssm2)))|>drTB䂘L855n288`y)B#"H0::66b!??bUUUǍbttt,y$ 0v<)^SWW$(J֭[GVVffԟR)'ú(--!穪"##jl޼fgglR \栠B%33* vSSS#ŚqiPZZJvv6\.0LLNNRTT"TWW"\.Œ'ܫ/LFFUUU`XXZZZ%ό z=$"LNNP(((( //6|>fjiRؼy3+++ "ŔHc(YYY8NΦ5㹲۷u똙addBb||Bƍ Hbz9DQz*#k$eeeX,Z[[ RX&#hl6c0X8H$Bzz*菓/zRAAO*vsQn7uuuݻI7WAܫ? n,un}߾/agG.eY:4ͼ+}y1JKK!Hz1Ljtt~~Cxw?zY|H*^WJRq mb|fWᤛV`0<$fd>ߢ(J._%'& -qiE%222K d\>q!jr/dup8VFHV€G'5:E{W2x<.ϣWd>+Foo/o6>_|#tՃ.D"(ps)_P豶I"a7Z=y$7GNX,F$yb{Ivn"וdG-22YO6|QFF@2GTmm-hۇFauu߹OAEF y1&˗}\ܓ QDm**FX,'➌Iy.2\oVFFFFFFFC(nݺUqF/_,}vf >I7+2~Չbx<B>p8d#)I'#wvzH$x{ֽ^/o6h[J޷=#D"nD"!)岂.#############os"t:Eg~H$lڴ χhnz.D[OFE8*~s;}uqW*ݻX,F<_c—8o:Dlvx{Uz & DQVVVpOz d!q|Gv%޲I*ߗ$neeV{5הY;ujWVVt_edddddddddddddjgAOy4<(l\ytA22222222222222_d]FFFFFFFFFFFFFKuFƢ%tEXtdate:create2019-01-17T15:12:51-05:003%tEXtdate:modify2019-01-17T15:12:51-05:00B]IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-task-filter-dialog.png000066400000000000000000000722101477354127100311100ustar00rootroot00000000000000PNG  IHDRQS?sBITOtEXtSoftwaregnome-screenshot> IDATxw\%aH$ PPVP_뮢ҡVպ'VmuTA NઊX`R2dq4Mr$F())aj B4BBXH !`!!D,$h B4BBXH !`!!D,$h FKO /^j|~Ľ_!|1c_`H;`2ʛ7tI(vJs̱D·x{{ӧOΝ;]]]E"݂ sя} ڹsg=Baǎ-Z$HtsMbC׮]/^l``8f''.]:tׯ_xu~77~!))޾ѣG2O6441b]|@ 8pUZZژ1cLMMCCCnsM&NHMxzz$%%u҅f~޽{=z066666!IrŊ111gΜDw155wss|s'F@jvԩ.\BBv[nׯ_ǎ㋋`ӦM[xѣpٳg;8;;wF{Ν;iӦ۷?xݻ'I Fhhŋ>|hjj:sLjyCCÓ'OXbʕ8qٳg&L0aBYY-ckXIIɘ1cf̘_ݻw#^)R}}:cccW\{\.p8L&Sww˗o/Y,@ :؋<~8-WeeL&ܹ3())ٳgOm a# 6ŋ{6440`5???ܹϟ?gXο:u3tЊA]ӧ :p8p)CCà Z&PrʡC* xDx/֭[bqqqѨ|֎5ff =B-  B4BBXH !`!!D,$h B4BBXH !`!!DF}M=Z=zs~C1_ѓ'OZU6 $I"IRPP]pƬ|,$բ"IhOc 9|>AkjbB4h{$P9lm%ZxI2dȇ==Rzz:fYYYoۭ[76vZ6fmmm߼+::fе0i$6EԩS\R޽{?~ҥKcǎ(VÓн{w>?` z%:::)))))SNзo_]jjj `iio``гgOe#FB.+WggΜxzzz ڵkvرc]^l𠦩ӤΝ{n---ݻwS]'N;vfpppMMMDDĥK_nii o$Ifff6hɒ%;:H$iiiڵw'M8?ϯ[nIIIeee&&&ʕ:ujܸq il!d2j?~իWT IR&r\.UVM6ZPdƎ;|HMMtW\`0ry-=zT5LoUn}jjj455,Yi&Ց:Qij;wŒd555wMKKKHH>FL&>zC:Իw0j~G I .ɉXZZ9rΎZQۗzR9Z"#B&&&2,;;G555'B0??ĈǏW}z,zUNP&~CnݺㅄdffRѭ[[n|ӧVqΝ;GꁞvRcC̓ 7'Ӎo;Gu1zŋ^v\جY&OLMM_x4g7747z9--mԩvvv7o~=/Aə&O,H @ (hjjiӦA8q`رkUWW_zͫ|Bbu2رcرYYY?6lݴiӉ'***UjO/?gΜVWy;wg.]dWW׿z:...OHHJ`顡/ETT߱cضmRzߍG~zcAɓz?"Zx{j!N( $Iqe:Ԝ' J56 ᧿ޭB-$DҤPd2Risnam<jl!54ZjmǍ6FAkxhז\rh B4BBXHр#%''s1}}}wwwPS!4nրoӻB#O&A}АAH= `TVVFEEd2l4qy{{[ZZqȑQ= E~~>>r^ (7޽{pܹyǎ[zPHNN3gNoo[[[xcVUUp$mֱcG}}}77xj~BBɔ)Sbcc Q/n޼ILMM-//WkA?^tÙLfttRRR_+][n˗:%6|7oZYY}Bo0VK ;T̖r]zzzz*"""33snnno._ۗ`=W^o.y%K2!Cرc]666-~ll޸q㬭嗦}zA!QT/xy_|aff}AxBjPHm۶9s8::x_r-;$--#F;v,77w477ߺuk&NSSRRΟ?檾ŋ'''+Djkbbnݺ={>y$66vʔ)1O#͡I{III:::qqq#GlN0a„ EEEopf___##?ys fҚjc4<j V !`!!D,$h B4BB}CkM:7n[lDrѺ>oIL]Otv@=>k_[z }8]cY`Ԛ5ŧ8qh$~lmhG,Jj3h{;$twS읋hlxĢq+ ՏB2eF~gHmFS?6Sݻw۷o\RBk r|NNN555Ͱ&D-ypja&TRD"庺GyܹslmhWS;cMfXv?ڟ{\tI.H}5U!ꦧWTT,_\[[{޼yblB4׬66_]vR~~~HHۢEL[?~$$鱧0uQvXK$xXl`rj$ 3<$ɹDzqI1 uH\'ꡝ`ɪ ϊY/qQAH]1ʵҥlbj.ryQ [g͚5_#GΛ7$ɒBA暟$HG'Up?Jَ& O@*Wis4$ ^W+g{YU~~eRFDNRf2>.zQ^S%Uħ t3{ Ӌ>)jW[#M0aӦM J&Lp/^ZWTHVft2cUR}0%28hQ\ګF7sʋ\n9=.>|&zFFejk23>DNWIbB[e?B_uQ$`0֭[D*N8q߾}/_d0_"AygVY V_[!>)f֞1|)Z8*,6p0yV\u3T@ʵ{Ebݞ-OV4T&xy꤅JԒRT*>}tƌ湹UUUGA, &ђZl7!$ Z$$ȯd_KI.&A5c3IjBA*H^UI<- Lpogk`3ΦfƾOp=X.u4 FhR;%DsOqMܡCzzzQQQ=gnG{ ST95A?F4cӞ#%&]v2܍!3fTTTDDOv&rKa_j8bƃ- U2c~]2T/mY2C&,$Bf':N$7aiӊ]b&uȖz~ZS# }jtLm=ؕ13G?G'Qo`ry&iwI2 hXLc ܞ^\^YYzDwmmmkH⪊]jii5GQ1P=?kG j`0@---kkkpX,ȅ4١@Ahii5BHM'B4BBXHр΋ eeߘ^: i)͔FPۆHj}N:o|uÆ ƍ&b֭6l8~ӧz=Hf͚s%''̟?ɓ't@]HoSYznr9PQL2e UEe˖ŋՋ`nݺת III)--p8ݻwhLO?khhKWWZ~ڴi}Vhhhnn/`K,quue0C ۷c` .`aaaj!Cݨw!qtu?7+AW6"ʲUYXX9rdϞ=BGNLkkk&BJJyҥKvbxMmgmmv}8Q ˑ$<~S57XU'"RSS===UʛԯH${>2##l"hŊG3ɉi|b)))Yڵ;Þ ŵ4ƔBmzڵuKLLD-2D,fң@k]!),$h B4BB>ۖ¿P+{$h B4BBXH(Q DL@xԺTTT^EEEA(lt0u9ܨ4ƱȫtEqz%do>ٳގ->>>PTT4rH]]]##ٳgdZjSg1fYJY Tjf* ?u]jD"oUVFI$gfff;w466vtt\`ۛlԣR,3IEO70j-zzzfgggdd@ll iMMM\/5 IDATٳ€aÆUUUYXXyzz޾}7$$$///++kܸqM:u˗:::l1c^reϞ=ʅ׮]y̙<MUV%&&޾};33T5"66^(޹sGCCՕ^XXHuGE Ʉq[tb \{lllEEݻw.\,$ooo AAAb-X@*޿lݺuذaǏg:::S޵|rHroܸYYY 7np8`ҥʅ#"".\f,YIdݻw… Y,իl!r.cjmS- G=2'ßļ|c>wlllbbb.^XYYy***+GG[ZZۺ>33m}U&\---e2`Ky`0,--/^(lSSSjZPDGG6 \nyy9I̸ֶܖԾT)H2R>w|| |||?r;w ˖-{QRRRNNNff&ǣ~SJXZZR'W! b2O·P(|5P(233۷oڵʢ(r5}}}GGGpqqdӪ@/@= INXNJb9)ݖQvD"ϬξS_#4G@RϞ=bqDD ^~}{KJJD"@ ]v)s(̊.!!!Ǐ߿D"xb[D}]n+4iRXXXjjD"YjD"ǯ]~?y$;KKˁ~iii֭6mm/ӧD= i_v@d< $q7^#[\ݲS͝Z X,u]K.S^^N,^8--K.:twyĉ|>ܹs]v=u͛H$ڿ=p{v:h /// 9$!!ԩ΢Ezjii:t@&)O(G$c˖-d4 r;iNQ5N_ņ.]bX xjP'(Pc޿o߾555D...o޴i'^EM?fIٳggeeihht-**dwXRծ]GP rXH !`!!D,$h Z #[zҾZ3#!D,$h B4BBF 0!`B4s(ԔzRaP-W׹녢|VN7ڿ12uQ,K+z_v Ined⳪I𪽟1-8 G 5MlllVZw> zԞ3hnf>VԃiKi_2_M= m3mIU_)Ii4fx>]H%dY㑚.^5ph[J@tQB+<@Ӊ }4hڝ5ǁ~I@tQB4!_MC=DLz@5 |/4%qZHk ҧ5a7"G;iNV>Qԁi09'4愅faEsR rXH !`!!D,$h Z-=Z3#!D,$h B4BBF 0!`B4sl%G/LFM 5zR/ %=tV.󍤳 ETK kҲ*XLDZZudnٲcTEq?\OO8|Y;U: ʏgƏ S~P(/T*l̒A~T:rВ3g~ z2| |&hh8х1Hta<+Wݿ?22J__?$$DP ciitRWW>}ԩS-,,#""S'occVȑ#\.رcnĈ'Ntuu޼yrQ=zU3hmzlfbxxѣGf͚اOW^kAAA +!… U!lKI׬Ychhعsgww8mm8L&S>ҥKǏ?qℏϹs炂z111IIIݻwOOOܹ(z9a/":{QL:M[[{ĉ7n yfҚ?joxF ڵkuw֭[|h m Sq7sTsn]vaنʛT~C?6mrssb,Ο?_oeX[[+Ɍ󵵵QaEi tW+!n-=z[0^.Ynݾ}c}( Ƞ((zR P#{/3ؠB{CQRRlmmΝ;gX,3+I&>|… r̙3Ǐ5z˗/}䶭QlfقDz͟9p}`Z7!1ǡ7QM 9`0DWj尐B4BBXH !{vl! Q !`!!D,$h B44 hi(#.Adff6XQQAmPRByýd8 =!՞G># '8v( ϟ2e nÆ -=.uz?kJ*)ި$M_ +7qggglAbbb de˖YYY|//wR*;vu&}}}/_/`ue^z]4djK OO쌌 p5ᡩ)˃={VXX0lذ* pSSӴ4OO۷oeee7NSN|RGGk{_3FGG'77ʕ+{Q.v3gyxxPoB(#0233KKKUHQSSsƍ.]ym;Y!QVgѡ|[Xm'&?Xrw]p@(q8`Tz~=.n:lذdzl~)Z|H$r7n7r8@l5""b…l6{ɒ%`ƛ "88]v3f̠DS!onrG8-mk˯>ke_=^ޱݻwxbee+WBꫯPzC%233]r_KHjiiFQAI\&f L&?~|zz3gIm E\u8 A*+cm0.\?3ܹ3,[ѣGIIITǫ7TҒ:j P(KKKB2BPdffRoH!^xqyARBXb9H+i%E'S`SW+bӳgOXA킼ׯ_OT@IIH$k׮"jYQQQqq1u3$$H$UUU/^l`"o߾֭\~z]&M KMMH$VH$ @J??Ǐkhh()RBR(/rIjrxK:ɗkb_䬓_?}0+0$E]WN}||˩ŋu#??CΝ;O8;wk׮Nڼy@ Doxw^׮] 奜`#G$$$(w,-ݻ%SF` ]t)>>>>>@[[[[[חWz(>WF`X, L@Wo۷1)'7)RI .6 a!!D,$h B4hǽl!ѮZ/#!D,$h B4BBF 0!`B4s(ԔzDbYLk!W[#.i-_ҏvE0FѾ}{6mnnZUUCSKQHP^Dgs5Ƭ2l2a7yy?#4 #;9dݖP6>}˗ϝ;w eq^ԣ7}@ߘtaHޠm¢305!M=F>>>"YYYGLNXt T2e?@VC8i4sx+W̟?_6I L$]fb ,ފUb׌1och{iK.MII9yQh>Ho"v+Ԇ,(Yw+.LKp#(ͩ4ٳgSi?TTT,X4&@EϞ=]3QPǖ.rBaAAQ6{$fř_%s6 z={0F$ɴF QHck2gC!Hk@&æ;| Ti7? KfOIxQDDDfffIIIll+QB֐g %/Kgv U{`t$e1 =Ff(444۵kvM>}Ĉ;v$4 /޹LsqL(PcaEsRv`EsBj09Z=,$h B4BBTK-=z !`!!D,$h B44 hi(#5Xe+9zd2 ?n̨ԣDy*uAdyuRySJDߔ$܊888]Ub L-[>JQk֬122 ĦvL= IQZg+uL|35nE=^-deMUI(~嗍_^*6rI BCC[Fّϟ?u@  u~ԣ8?p`s5\D/=dөI}m|Xr9\K[[VVV!!! }h`KK˥KNjaagooA=j=ٿ:vGqvvr...ǎf~w#F8q͛Wѣ= O>¢z?6?4:E~|w~Q''Yf'%%իWz0`@?`@pB`,6Rҽ{5kv=..N[[;..j-ɔtO8sܹ^z@LLLRRR;w<`x#رcf*++H$k֬N]F=HJ5.K/=Y69Y;IY?yF2uT777mm'fddlܸ[[[0͛un BKKK5Ieԩ`ǿyDDĨQ|}}544vEݽ{wvttu5N۷/^ ?:MgǾeX 9@AWU%azU:Y;I Y#II+\Z~?bN.CQRRlmmΝ;gϞX,zC)'Mt .3g?~| D5V\ѣ;wL6‚a`DHſ>+jg1EAyb˿*ϕ-ZTRRꪩ9sLe0Dbcc;w,+,,l镕q}gD{ݻw#9y}7o߾ub###[X,:'Qo}2ͩ؄ `?>FQP0B- EDЮ 7QM 9`0DWj尐B4BBXH !߃-=:0B4BBXH !`!!DL@F 0!9҇pww߽{ǬC 100z8" T~tmn1qqiS}0.Ο-ngVk޽7nܠ=lMӧO_zufff~jCpZgTz[jkJV&x|;;Azzz;v400033300ѩ$G7B3erDZDPܭm t-SlC*((wqq1k,33/^hjj>}v3gXYY]ӧ[ne;wзM*JKK}}}-[6sq8j1cVUU5Ju 'NP߳gW^N0_Oz|0O|G]k{r?GG,SZ.o<~gϞ;v젺ϟS{{{{$'""b…l6{ɒ%!ո(@W_1LggӧS󳲲6npj+VQtԩ7oo~~~VTM!1f,zNs]X\(M.SROHJf{nW_)[qذa!!!kmmM-`0,--srrkCqVVVʻ,--󵴴ͩԞ>L9jʔ)uJ}0) VT?ߙVr~ɝJ yFj*wwzc``iӦ7nYB2-BPdff@;B(fff*o*BX,JT/|8q" M$tQB*QL^r N5yq4+yr(w{ussׯ{ر,022ѡv#&M KMMH$VH$uJ| IDATV@DrwAD}]n+?s鼼Z u)W+b}1?䑖@|GA/vZ' l|>ڴi!!!ʻ8p޽]4ˋP(-ZdccckkyYy>RMh(c\i!uE5_T3Ri=Ι3GIP1bDKSH^#F϶"a!!D,$h B4BB}wo͵Z1#!D,$h B4BBF 0!`B4si &MD+GMD= )b"d<3٘ͫ/C:FI͌>EqeB HIIϴ:tk׮zs环 A/^TONN&H9'66 :MK!s{Xy/ܲ;e)0k$͒ 8u]&x mՐJX\P(Czzzl޼944466XÇ8qSBѥ7;'v1E^DoBcZ:xN X?gK&)$4.]۷jjjtttƎK-vZ(,,7n k3͛xQP#333LLLڵk7k֬J ⧟~rssyO?~\.\2$((hԚSӎcG!v`ױv ցxIN#WK~:uJOO… pessX$e2Ybb7|=zaQQј1c:z}=z_Psd2ٴiN8qU{{*OOOgϞݿ?==}޼yʇ_xիϞ= ?qWWWepww;wPQQQϟETޯQ1__vʯ?rT]>O0HgǏ\rʔ)TGUV><***""ZuTW^^NMPjymTHчv*` k_u8PvYxQOݻ|jGqqÇccc7mTXXx…JOOOC2KPjիWKKK@={VPPS(,S}j˥ڑSJKK\>Ӌ/R/_V3*)1Gc -)vvD9{ zI^VZؿgvϞ=9֣GUUU!\IʢX222z4Gʻt"}ovp H\N[JJ>S333###jZ9Ps]1Gk2 H%gܼB^K$kjnEU%3:s\anA85e7(~ӧk׮_N YXXxyy͙3dܹ>>>oF(͘1cÆ >>>W^E$sԩz?`0VXQUUucǎ)懇:t&IR,D"?xjPH P Y@1\9K7({/~eP#w4 )//*v֖ZZZZ{?~; 7R'~>}gN6m˖-gΜjkk>|Sz(պy6O4Q`DKQ 10~9BB4BBXH !`!!D,$hzG8C7L@o{$h B4BBXH(Q DL@xP6j3d2Ao6CjR$I|&]^i~6j 8D:&RjZ,#W\z(-V[O|tdnٲΞ=K*Rhx ջPw0nLm[d|k©Cuy̬2OK=((RTS%(Q m18:HKaat5eNºO>AP??kegӥ9=infLk>4/// ٩6ƌgnn~Сwww]PP@-1|pSSS矗¿3)lb^|I-O }>>>ݻw֭ۥKȑ#۷ozs̳gϞ2e 5rqFZLLҥK]]]<Ξ|f/PYXXQsݻ7x}>}tРA&&&u^Oz쑔vݑ$dvޟss/3f@JJX,ޱcF|&ܹsq}M>z 700Ç+H* 'O_ك ?w\{{{NN̑ Ɗ+m*::zҤI&LRvvv_}k3EFQUљ}u_MoMo*X)Qv r*cjM>  -vQߚ+UX͞SUU`0dW|1q@P䋱XF(//$+ /*1a„ŋ}ɓ'/_,222?++++󳱱9p#tt|񬕾lx삲4H$233 1*H[ l;;UӺW(Q1P \P(lhh eƷyiiT*%#7XMM-<<|߾}QleS,xȑбgϞ~͙3gJMq333 nS5[lK꣍ Ÿ腄,$oS#y.Kҹ-j) FhQe7ڂmH333񉊊Dm۶תaX,%Y:2wܓ'OFGGGDDȧ'$$K$'QIID")‘*++ټ jkkeZ ,b;wOp$~MQ괯9{;?k$N4Ʀ6Lbݪ4/mP&9r?4hѣe=DSS3++ROOoʕ rss ,[fƦӧs8]]]B^#Ky팮8p`XX->{Sjjݻ#""_CP^5 w0|R4>>^xoR(..>zK>!Q͆OS._\s V^^.bddKq GRR^%֓P.\@5PBA@r$#!$ H (4q6D}hJ @@r$#!$ H 5 AH Fz3U [fԩS{R1 W^C OG#cg-Ys磳' ?:٪bFħZtҡCAE[[˗/N4ʊB_^ٳ9sA9GP}}}P"\8um?@udX!~%]g!&4 IO 3 ӌ{28[2a„JH|ww6OOŋGFFݻcͯ\C?&&&&&FdRRRpppDyyyNNN JCiҤ˗#Hjey,}**wEfePf\&/3D {WpHNNp8K,R͓{Gѓ6R_~ill`000puu]~}}}}}}=!h/33x<ތ3l۷]Fќ1D-*H-[ww 4aC^h !߃y UUU,sssSF0X%ۇ ۼy3$dsrrzd2L?Q>??`|L`ȋMhkk0а_~KJBQXNDVILL\fͽ{BBBd~ 5 ]TPT`~uQ5r޽m} H GB H9Aȑ@@tl6 4"!$ H GB H9Aȑ@j 5 Ah&(,|bb|-#HxL>V: 'p~b >y>u!<$ /O$מ}XzVۼy36MZZ{FFF$ɪULMM544)0 F^D᡽4< l<߷_S^~;cuA0 9D2ޱcǀ.\xa" "7/..8~2###bqqq>}ƈ\mYn}]-"EԇpS05pl]/#dkjjD"QUU~+L~,KKK"P @Ս޻woF%$*H@P 6lذ}Ԏ/^SXX֖p”R>O\ /7fk,ܻ"+O:MMM/s8uuu.߂Ĝ?FH]WIn޼9ebgСDPDƈt#_266vǎ|>…cƌO?UWW-x #IDAT@RSSw%˺tRNNν{,--WZE$?^ $%%@LL֭[>7l\QQ>Op$IU6d^ftb t{f⪿MRwQӖqwgXbqp,YBR͛'_r֬Y...T*uܹFl :(BBB0 Yxqff,_1 Ǐ|8ת ,--XnBq'&133*j?eTJgn o߰S2}aSRAS{ɵy4L*ע[ro>{,::Z"ܹsg޽/((Jqqq'N>ooo!oޱͦ&XLLzLall<J}~G???OOϙ3gD(!!a^^^&L v5-Zrٳgl33[bPb5V-ݖy-x*k֬Z A@j2S;BA AOH GB H9Aȑ@@r$! "tЈ@r$#!$ H GB HQ $(@j 5D db;x5)bc mDQ҆2{=:؍UVUUU$:$y|,Fc\<&{6+0).IoI qŅ#t皓gjȤ~$Y$ ar&_rg͚>y(?Ul>$mJ,^QPAn'mC0umhDATuz0n*؁VVVRԒBbΝFFF+W fX׮]>OR+++ŋ% >}hii߿8 1ڱcǏ{.A/ ۣG08۷AddJFF-'*+0_\(l (&?~|Ϟ=VVVVVV--qmPG%⇗0:1~  ?Q("}^^SwRVG!ıd3mڴcBBѣG<޵kѣ####""eL?<_~Ν"`Ȑ!7nxݻ-Z$y…+WqܷQ(--]tijjjCCCiieYxǏ XХFbbCMF;rի 2&M4o޼b HMMM%/)~Ƀ_ť=lP okI[{11{k>>A*/G}kuJ>}?r]]]wYL2fkkkt___sss337$xwT*y @U'C{+~|CCqxЛfCEZZZ'OVPa///@sN55#G+ԨL{{{ מW 鎂kkk@(2 [N8 (//'q|@ rFbbb@@Bٽ{4K( YFԜ> 6Q@,n wI.KI %$CP¢eI??{>Kݺu̙3j'zzzfffĀS__/S(.. jjjM6UWW._0WTPȨD"tZ]uQ @)"U+$eLdI0~/KŭHkB XwY[[{xxnݑ#Gr>>>D֔)Sx<91c^ȢE ٳ رcŋܹP(\n]QQB!ys̙O>uuuMLL0L&ptuu 9wܒ%K7l0vXӧO?qÑJ=z]L 㲿ƍhy({Uke'-d~dffSN%''KG 7nT*qB\t Q 81V7. QN!pZYU GB _w[صC H GB Hϐ?Piz;@|w9FB H9Aȑ@@r$#!$Уd޵5dѻwo}vu t;Rqq1a*QAAQȺP566:99ufEqrr}wJBS:ut:yȺPzFR+U|dA(h >Fr]uш֙\.-QtK{{ڽ{(C?A>;֭[8v7H$ڲe?}[ZCk-PZH^#8^zőA"'$$lܸo^p}>]e)33b߾}nݒ/_|̘1.]"W\9iҤ3g:966Vz߾} %VTTXҞ˗/zzzcǎ=vO< rW^%Y[[oٲn޼ymmmDVii)Sc``0|p>xyyɓ Io2@#ō1bԨQqqqAJJJ|||NN͛Ǐ_]]M-Xŋ)))[l9{5iҤʮx{{Ę7Ι3g<<<,,,q\,UVV;vDneeƥK_~C88zh۷o?|pT*yԨQ666EEE7n())-7B ӑ={_8vQ3fp8ǽmmmO>^SRR"kחxnll,;&111##ct:-hѢRy91 ۼy{222̌,7U>}I$yi-SSS7o*W,wmB!mjY^^q%III7n?ׯ_ſKyy9jn߾}!DrÇ_fڽ{wzzzXXXOJHHO>]SSА6e|i޽qOHH |;onjaիA{{kךƌ#6l RÇe{~oFKz:4hK|||<<<_~ի\}?NpӧOxx~wBBB'ݫjQ(iӦ]166v֬Y8\sԨQϞ={Ն} ҁ]]CCӥ 211 .,,H<x{{ϛ7/44T!?O]]]lll-8::\Р  %==]p,^@mĦ܌.Jw :z2uJvRSSCPNS .twu[$[@{'hDBOw$6-J1 S:BJl6cGн#٩гeRHGGcG#Ya:::VVV~dA(H  H GB H9Aȑ@@r$#!$ H ?ELu/IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-task-filter.png000066400000000000000000005244701477354127100276650ustar00rootroot00000000000000PNG  IHDR"gAMA a cHRMz&u0`:pQ<bKGDtIME -`IDATxw睶}q ;Q`-IlI&Ƙ_"XPFTD"Ez9}rz{3>3KccB J)!1F9encL3Y [{{[B!бBDQ$XZ(ou "8Iv$I'l͠JAܢct:$fl6YO!BP]]כt]/***,,ܿCxT;я.AMMMk744X,`ϛrl"2@=@  U秔B5J5k" 9lbٶm[yy%B!NGRͶ{|1++n/^2$ at]oo w\V511q֬YIIIs\(aN)ZHZfܹOݻK.6mTUC?5j(HDuI6B{7gΜw}(99k׮~t D"CӴ{nqqq͒$3dffv֭3k,YF&B!:m߉w%Ijjjy饗(K,\9sIysmm5\<'))iŌniɒ%uuu}:tO<ѹskcǎƮM3f\s5%55ohh:ujz)Ž;ӯZ*V6 㷿gϞyƌ޽=3{_ `^F?~|&!JUUu-YD{GQ\#G=: }!B臣uon߶mۯ+W6773g:W_}XVuܹ=PEEÇ^aɗ\r5klݺuȑ^aaa4ӏ)#??wɓA?~||K/I&r-?~ѼH$iW^}7mRh"z۽{}j=XUU_~G}0_~gϞ>oΜ9N<8nܸ_|AA!B|'pIzz'Gi(ּo=F"kKKKu]EVPXQr(f> PgϞ>=C)4 Z4Ƙ~ƍ{'w3p^c@LZD7sփ`RRң>ZZZO˲j=<]{n݂,ˡPhW]u#ȲiZ44 vB!tqw8:uZ_J͛73xݘXoM9V'7/Aï\.UUE yJi\\C (J,ˆa( 5MZ \|pڴiG4 B!Ninnn5-9:cR8~\{t3@~>`O[QE~j($/x&e%yUJi,oݺwGQ-!BE|"횦a;B!:h4zp8QB!: :m@!BtuB!oD!B!Bv8 B!B| !BKRSZU6]Gt|dX,b<262WgS˗j뉝$_uB ɑS18!.¯R1FBc |2g> iժͧ1C{~ZG%~̗.:z%|~[3c ؑcb_`ߗ5~ fD050?0'93cG6?aD">Ym99RB]k#p烀ZV0B9(;Dcц99 htՋw |\M"u>gEZGWQ~' |cĚGv\clEFcp0U%~$ҵ٘aUm1슝 i!YՠFH ɢL5! 2eGԨQm, Q8i9b6V'4F2:aH,$i xtdө3ݜNa:cOĀL"8e'0AhW=!ĩ8)a=JVYZvQCZV3ZXDbka`w WXkT#@$"d)1$~vgnݑ@o9ѻ<]*YzOQEs-LKDJըY-%0lԂ,!jć~8oƘ(uuu۶mknnNKK3 fBV5kjkk;w ,SJ#aNSUU.i$)gA5MKJJ"TWWݻb8P(TTT$˲fu}߾}ɂ TUUUTTx<tRJ +I....**xQF-^G8p`zz:Yn馛~錌 ՚t-Znذnwaҥ3gμ[.X //o՟Mv{bbW_}w˗7SEΝ;ia(Bw ­V!D dR{wb;$ÀDHUH<{v355 eeg)]ҔF)xWK^B(Qb u_#v߸:XUW N=c:@z]ٍnte+UCAUUY!@pa aH(*%$ɢ4 o"‚AcǾJD٠%&&2^RUE.32XNWk++EQ"Hl6]'SV7l6(,}>Arǎ1p0nXT] b ՇSl)-hKt)#FD$h}:XMU`F'ㅍ/l/"*3`Ġւn||hGR={wMU fHܦ7/ HEU>>*Y ߻&|bJ5zştS&sF/?mqwKf濺l{{)\Oj zM$]kTcX%MYEjŢ :R%ɇ1HJuzwn>E0`ވ.wjHI=IӜiռQAxk|¯ J4Y_UWe_ugϞ7xc٣G~Wx$Iadee `&%0<x)k(D ++aZ驧O=eɡ;wݺ %;w^*Z%|'{)` X,`HlZX(:ᠪJx 3sRjP7Hą 'LD+;-N6Edafœ@uJE L-[JA a>ݚF{2N6ca˗۷zI3-:ի;PyƚE7mV)C.=[)(Fak+SF+*UUʕRIؽ1f^^.,^,<(/Tk r®]M1b_~) j '}]uQcQuWR.]Voڿq߽ h EerQ=ZYXE뤜Ic:Pͯ.:]VXC: >t@5ԥ}{ۯ)ox2X) 0`.ŕlO۰1M/+JW|S̓C׿+{^yDA_=j7tھצH{sǛӆD7w5O /I6P=O{ &?/>oT,w5o9(u~w xSզxk|K_qoS˒/][Bl̑/Խ0$mȶmxtWoʿѩ. rS魂~37?CzԗxkjeOÞ419{rjRk^,n, tOowC,ўhU BG#78 ٳ+++_-Y'[.\Ȼi%Il߾=77G?ѠA}tBȚ5kছn9rԩSGbw}{cǎe+ r(zW>3 ^|ž}*r?SG=eʔcTUu8)))J>I&z322ꪙ3g~NӴok׮a<'N|vwJ!%2l0rҥaѺYY4/qG4+ΞHl ) ћn On݌uf463lfY, (,u9'`Pf ~QUh vG2*IdhE8tHڥB4'!#G^95@N]D5x"8j H}hq|\V&tB͓ۈD@ $&2) 4XB4S9#\,=8ڹ3ݴI1#t]QtvV+c !4Cc nykE"T߆ O{75f_:״Dkb=n/OzG{?ʋe+n~%HTz{ۿ{(mplЗN&%{P &NaH@ OJʼe-b!`zȃ]Q H-[L) SvJ-[Ϥ]ԸmXMq.ťQͩ8-ђ벯7Wm9*њ[qxrf U+scp}~yfۚ5 {wdKo}($nj'?)UVo,'ٓ@x%> jwBڸ㎇z(77fY&???--RjRJ#رc~PRRR]]-rl(/7|s뭷 UUU555tw{z᪪*HNN޸qʕ+nԤ(JJJ cݻ7%%e֭šP(''端ZlYJJ ^ү_ꂂӧ,]tĉӦM#L0!ǯZFѴ4I4M;X8LFǍӞ}ZY)K.7EE¿m$mCND`Tm$- ".B$$iiV-rmH=!\y1Ƽ罂u;vVԘ?{d#D{7ߔՖjؕ*>?\( ~{0(EJJ anPUiI0U+rs͖JKBZ$(C8LRS#ڷQU%֊ J!$=z^%?_ɡ|љ3-Dc@ AQ`Ji~1QdRP՘K 4 `,ȄԙԂ"cEɊ; !<!;"M5#z$ӕ1"Wujju;"Me_-Ȍm[/lc:7VmYξw^ɽ櫃_)ʎUkC 1D":d"*7v1דH1"[*ү:; Vj^ 14>X_\ڶ&I6ƘfhjWoٶjj^ջjӶm[) >x~YϺUA-H珋u]w'_Ҿ}@tg tUKvꚮQ&ۓw];FtgN z}wĥ$Aj 76 /xv?SzoڴzrgY$|Bh B/4i҄ V\iZMdɒh4z}Y, 2$++tfee:t뮻 ?쳮]?Yv;v{-[/3fLh4*E~qDxꫵ<|&N7l Y&buL^2y-[Ĝ:xKXm` d17bp^|^t`QUgbOlOuz$OH M{^~I%a=l-UD>I}($1]%&_͜Nc0 QBUAZ׏(ɪ Aadm4-Yb"KIÕWj[E`-&7Jl=%l`ÎW_]Y,,1Md .ظQR4IS^zIf&KJADQ ,%/!ϫz'v ք[B'{PA[\iCK\d T&ۓ{%:hmZ=9w ~)7-n*MNIwv'ݮ}GO{oJCC[kz-)_sUU#3F"* /07CvﺾS%-/]N=ޠ]oOIzF7TmUGb{߮*fcƎ=*sԸq(&Z/˾ld1Yc ѨS}t)S:8:Dʢ\[qO<5Cڒ:u[59grH X{K[Z`GkB+*Y;w=T&e[Q"Lu-_;àej#9Dk,ߔq߄N/:;S}9q9;wjT+zye+{g'}0!:jcpPdYv81%IOqkl6X$ hpDdYz^7)'8?sV m6&Id KJ h0HNAk;R 0QdE"`"0?v8(IqȂ a^C*/KiTUxljH}gEV+2Bx: cf#P:L0o$A8LaA(<Eݻ5k$EaAMҨA8LVyD@5v;u7jeU5kh2YQ Ai!ETx׵@6QcZK/ uBHDR\!-D^Q~s]A h=~կU@H B="y2Sv}^R BM&;;$,ʪ"* Hc]/bV(cIY>v /1"u.).pχGOw+nY˅]BBZ. !%B8u=##\!FO[/B)g"tJf À2J3>nsvNp={Ğ= Y>2Z32 I|YQhdT=RFHD|[̏͑[vB<'OyͰ}1fYWk%~!v!,x]=B!ɺG3 }[{|Q` 9$GԈFJ8хy}7&(Q=QNvSB:w;D0c%GuOoE&^)B!.Xҙ]F*(1pW BF!B#B!3U͂3eՀ gW ƾ xqI{܏=r6|7 oB]dEQ4AƘINoq^RӨ|lWA ^Ҝr櫒ek8lV,ɧN1#~A:pu=lQ;73yts0 ^$|7!FUBHss3VkJJuuu|NQG]]](:3BHNNMMM(JRR(|)A@cciJ夤$Ykkk#)m/v1ERE~Y s9yMr'8Fo7 Յz\.?<֜H$uB\.*//o1cSN|0ݖo PQQD'VE!γց(>/ eddO PRSS%I:ȻRt:O; mV[?^UUTUcǎZX||NZH%ğߖw[F E@˘Y|h%ދ," 0 R[ aq B˕cƣeK.|V EQ>|`પ*vWo oUsT/~I^Q.]DomߜP(t]-yeDkb,~IȾ}zuAN>@B]*Cj(hBVkYYj?GO&33pLJC 8|pZZԥ@>KvbSJjKNֹ1Bqf B;ZVɓ fo;nm zYYYBB(=ʜU)JFVyr04}9@ `fx~~%b86K6O{K, _I !.m>NhnNeY$3W863V}R({[5uu]?$9FU87ox{MeY4CN˛- '4 C@Ќ`0gK|SU^qM5!;BFHJ?žbhѧdAvΐR* M&ٶoI6MPFQw^~}NNΥ^ -Z2~xUUW\YVV6a„ܢuM0SN|/Zhiii~ieee׮]'Nϟ;zh>[uuҥKCФI?P(d'MVX1qD߬+WN6-))/2d8jժ &dggǞYo+| 4MX,[nxV|jm bRe'͜Z.z /^yf~em'싣7f͚5KQB)Zf3ivl$'a$G$>hd%9ݚ.?4,tvt,A \+ fMtc΍Ò..'1iT4tws:,X`b֬Y꒒~Xh_ lٲOSaa۫Wlx' Ø7oުUŐUV]vС ЩS^{;Ι3O",Z/l/R >dȐ3gZUV}pԉWI}X|oiݻ.]ZYYIٳg͛KKKy֭[yղe˪ !ׯ$),^G{Yly{MlrA~6 `w}Yl6aVu߾}+VXn(aRb6`X^xaܹG7l\3sz֭|ŋ?Í7RJWZŧ|ű<ζĶX[{)8o!PiTitήkH )xewOk<6PkPcRiUM`3&MzcD* ,a\  ViӦ]q O~?OƎ v/xMMݻ_aWXQVVzkjjǯ[oQjj*|$5*>>~„ ;v\~[(y9997x5kh׮] nwFF_~'H4ܹs||m 0`@0|ICCûa}YUUU]]v\ZZaVk u{}N~V)NO?}cO$khhPKX5ꡇڼyUΝt:}F˗dCPRR҂ ֮][WW7XVG!tQ:f~t({ח,Y2hР_:tFf/?h4EQ 6roRG"'x?O?NSUu„ r =֭[VkhNꌏF@1y-R߯iZ56};vlg<=zWLgv|"+&( .ɥJ+&XВ;w[j5KգM& ~~} d̉.E),2C7~g0wܴnA}?cƌ?OВ /bsssyy-[E裏Ξ={<ܤ1cxQF͛7n8xܷo; O?(UUUZV?I1pwy'''jFц]כsss/䒴]vٳ+,--]t9r$/ `0hZ}>\t F,Xrʾ+mXcx***[P9a6mƍ 6n^_~}ijj4m|>_!E:ma{YrE~? i.rtD 4dȐ[o599Ŗ0]zxʟ6jbce̙eee#FXb]^V3>|ԨQEEEwy `pԩ]t1 oB<-p8ܻw3fBx;b8z/#(34)9ks քj|ĩZRCb!`wpӫ_}rSt H`6b GÝz:b@| jH3|W>bŊ]vw6lP([b\s5W^yeUU՚5kuV__fD޿7|sǎ? BPbb޽{ۥK(,,7ni7|/))inn>߿͛Mܜz~a6l\sMbb";tgҮ]nڴaƍӦMf4 BP{ݺu={%\F뗒bJi$X,pfZy{0>0:pwҥ~\$J)rٳg>|ذa$L2vչ\;w|SL[lkM{ BgoQ=ʼ5|7_<vaĈC q\< L hllE,p899ټ *[D<(pt\*)Fm6]4Mə6mZ߾} iG!..hBByl4 ÉnňFařy 0Go p\mC1bSgv.PW^FC) { j *JUWmںP0XQE>;\Vu1f q`T6;N\7uVSSPPPЧOYy人>}>|X 3p={4hNs޽h;tC=xQ p8Ν;;ut-ȲF ,B;rÇn~]nFݿիWO2eԨQu=;; ZK~ru(666\.>@bbb ...;;;55wޙ)))G!CD첲2EQ:t萜-)v{EEE||e]O᚛y~hؔh4z=?u6,++k 4m޽\rɕW^/d%$$D &L:5)))==}sΙzX,>G?Gwuzz:{:}sa!~Sǝ1(JUUdffb`3J$}ewB+S/e)77Tk(~YYYGסEa0DQ,**ſ}>_ccc^^^]aX̟R$IDѼ((JEE4==,m ΄y=ᡤ$o+U2`!=$ 2c,"XD eTDYCZ&"zEBS,"@gfhA(`6O9r:po;eUe3>yD(C$1xK[/NB!Ύ#EzT?,KJJuuu:*NHHp:%X/CSm(IIIi /*Y]z S{W 08}re4ɝt݀<~`!=uuuLLLTg|Z=he_h ;I'E!FU&F?7e.]N8wј 08}B"v~&?xcV8[r|S9v(Ĺ0 C!k]3\EЀs-OU~1>Rq~..aB}̞7B!BϾ揿 y%^;!B!t.֯!AeYu =^tao%bVwOU qoEu-HVkH5?7syi:bGm3 M8QZ# 5[!f8ʧf؟ƶ|0ԱBEo ͸11_Z¿MUGQ@47/[SSG3Z'xB!BF4F |]5M#6X?0[@ `Zvg7/9s >}+&L ^{w}o߾6mlٺt7f~Gҁ>۶m8p 'Xfjzg-Z4gΜ.]>C|G}tÆ cǎ*--|0̙|7|lߧOSO}ݻwwGܹsy||x_m"HsscA3YYYOwnaԩm۶A?壪B>kN6mȐ!eeeǍÆ 2eʧ~o߾Yf{ҤI=\r͚50f̘{nٲe<9s<>>>>ߙӻwoUU>[os0dJSO=zjDs饗BK"fbbbRR_j/ 6;vlcccqq3g,..VŜCYYY֭8p #9#B߾}(ݺu<III7n8p(III| M:5&''3f/L2СC=Xee%/vZ؆ ͛sW^yw177zȑF%%%{xK~vvsssc[ y䑉'A뿪>SW_}5EQ$^}O>fA'|iӦO>dŚs=jjj> `p:uxw/Y_|qWyK|fA(**ڳg[o%US⇦>@U z}[ouZEٿv%K]vԨQ<.\{׬Y͟AJ !O?ܹ7|;SN6msfHG"9X>|?ƧO>3?lݺ?_x$I<_۷WVV|].ys\G~0zqw477X_׹+Wx}>÷v۲e̙k׮_W /ҥK{9bĈ^xaȐ!V={vyyQg̘sξ}^z׮]o7o^ ;^3[RRvڵO>xDc, |tJ?nݺ߿˗/={vEEСCꪞ={M쳟y>}&N /,\0 s=}YCCÕW^|Çlٲx└^[`ÇowygÆ \sUW]5bĈQFx㩭5 CU: IbILLljjjnnGˊct:~ssf8; !CD)|`0 vԉ1V[[+˲$Iy^Y;vȏx%''PUUVVVB !~?==bQm6[SSS0h4Z]](JccMKKZР:x<|>߯iZVVbi޽{y$ɳ D %p? f]VoIZq9v:K!tv}k5dGťZ1vVQ"uHnLUUkkk333ynzdYۨ~~wV[Sf{5Ճ6&e:8GcVܣ}8h:N2>/o"A`08q?=b!Uz?OH!${f3 !t։ƍ4h3TpA_Oo B}Q.FZyMN{% p0@u-A1(!.YyL{G~=!tvv^{IBpG :pEƌn:!:+m6gBX֯_^С0e5ls!:Q333!W?sxn B].B}H{A@Q\DBvGpf$B!~CB!!B#B!`B!P;;B!B!B#B!`B!P;;B!B!B#B!8pgQJc@)| !BE:ӔRA!OA1fN|ַB!:m'q'߿۶m`PӴ;wnݺUp8z 777CK{ ضm#B!tǝw?ss9/ήf͚իW?F{1EQ!?8G!BckJ)!d֭vz^uU 4o޻wEb !+W$驧jllܺu+_@B!.q0DQlV4޷oߡC@eg=x<HHHVB!Bw>bĈݻw^r޽ͣF_ңG;v+WfeezU\\\ZZZ^^ޥKh!B!tq'0|y>y޽{'$$iC}'srrn6`un׿uwdff4g ؅B!ڥ3,B1&ruuu|||bbY:3D"~y{Sbʨ@ !B]lTU41f鴤$55U$Ƙtµ ov-T<|&Abn?Px S.B!޵iիsrrN;-;!Čm ٹh41uܹA=H#B1֡C8wa8Ρb B!j.ݼ90 F0W!BK,= x(B!~0F!B!BvwB! B!j0pG!B!BvwB! B!j0pG!Bh#"t0 |] sˎD,Ⱦd˂`@Oؒ!.XF!@ğ[re?iI]YoB]0pG@VFI ad( qP0$ :B@ Ybm$>̚PXeXa# kȍA9j' QAu/B]0pGCiQTAnB?7?>! !MjEB?l#qpy$S0e)^Έ0o'qXGq u$@]"Ǫ3K/Kz&˱Z"f)۬ͩ;YT#~B„ft dJBdDA Gi@H- "H|$DȂBDjYk R e!Ѕ !tS,1';:yB7')'9!)amʭcNbޓY F!t;^!7773  677r̛Ѩ{BSjN)a޼yVx<Çw:3gҥK=>|]w}77n|y7>cǎYfnqB|B߫c! tBD`{B}iǝ߿??OE@Ǚ@(3!#~mٲB7vgyfҤIvx%gB!!y2Nս~ w#A B]hǝB)o~sYǧOu]7nܞ={?:_ "կڃ>t:N{K8(7:B$jP(1]]ta3?F 2JQF)cJ5 0`Q(eRJ5` 5Ԩ1 f^~==J 1j/_">Ht&1oN 0Ǐ7n/ w_l\7~olmk $I XxFUR,  .pCkdb (VPAȩ f#ybY (2vEA R(dX|O 3,-_"D!t"MMMe:>>>11ь)Bb<:7g0xM7c3pJTqGm(Y~8K P{쌌 ;555YYY1 avIIIjj$IxSGY30 ueiw&ʨ;:p+/ˠ1fMos膮)**P!"0*0!(PZ VG'lo#膮+("(DHP0mMӵЀgO B`7k*?lhL5W, n~r@fDbj))(*BgwO?ac'Zu!p17bBg1i7|wo( !}E{97"Yfvm>O>֭F!BEm;;;{׮]˲ pO>_lr(//WZRk/^\TTlP SnB![=hL^&M$&&0bl6ظq֭[7}􆆆dY޷o#<2mڴz[og!A #xB!.It&1oN+;pZZ!0 >}zeeeRRggg\ `ZUhNHH,uL ̼A!B?L'㞔d1&bǎyv+(J\\Yj#Prw/3 "cnC!BP0?IIIr:FVk#4€0 jT۵{$è!B+]UU=H'8!O22H/gמ#B!tv| cS SB# (CQ0XDv.B}{`<N.IR9B!E  B!t3pgB***>h4:qĸ~[nAѣG\veF?ÚK/t| {B!jc_9!$|w~=''W_B9MG!B="Dh4뺮<v;GdɒhSN}!C,^wٰaí $.\0Ԥ@K4x7!}`D#\ 0(0 *!c$ f00 y:.rJ5f#cUe{|߿Q PJ;w=:77 taСp>k2-eDQVD "0ADD  DQ$@p " EQ$$ϼGì;%6?wРAc-ۓ&LWt2tP5V(>_ BF] P* GYPgUoQ9a9[Be_,T 8Q^cl„ fvW1 ;֒9Y-UQʺ_4 B{"![(e )²/(t5Nmނ;B2&G)N|duw'Bi:ǀPsλ^ET~s:Жۍ9C p꣏v[nNb;B}wm#"xj3n{ͩ `;BKtwD!`B! B!j0pG!B!BvwB! B!j0pG!B!BvwB! B!j B\ ea@F(PՂ>Bƿ]=Q3ƀ ?DH3W!bP"!xЩ! -$fbsT՘/r2+B3Ǝ?c@ ۵\BJgq |7 bc^}' ]7")t\iV8IAcB͓0Vk,/t'o;"&tδҥE1nBEI6XM8*(B{nҡ\"gMc2CZ}YLYp̞{1¼2lPߪY^}Y9ݦC!J׊Dޠo^ _BAo;~ Ji4 0 h{{b#Ѕh-&.dD-")*,i#rDI2wѮIR$bCn Jzp8I 9F.(NIvz qI*`'  D@r q;Iʷ[B?x'Ij,0 1:cG꼻t?TNw1f6R*b%Nz›P0 (3PeAA3tg=ǝ00 t 823@+a`-1@Xy2c_`<`y̥0vG!`3_PJ;vhFˆaq0dYfI'\(TsN Qk  pJA?B]x /B`0aYCPfff^^ 'A=< !(  <ȣv>'إDQdYfPPP0o޼f8hBa#đY9'o|9zF0s^s?BJn/-->}nZp;v߿Сh477WӴ:|]tinn~g{!Cl۶lɼKtHdёHdƍ{|Y'%%?G{w!йW0@%@ 0(kfra|coGBnC :0%An %#17_ 0F `:3DCR% PQ2C1W!{o^zBU=<޲eˋ/j˿ooԔ֣GInW^K/?~v]w|֭[bbٷo_||<`Ƙ1c.V/ݺ1@$"a: #taAA~^)tQȬ(9>렩 N P(2Q`LPT<R*J"袘[ dz&ұ"}NQšA" Iʨ Zy=`DH^y(U Q\E?5:$D IelOIoJwwYE)j1L~G1 1F3=_!iڤIh hկ b;w2dȦM:utW@[o-//_f޽{rrru6k֬]F"Cp K,k !V*--}g-[m۶͛7ϙ3OSFFFssi/mN GUDЅ v [%ܹB\(KB8,hT^1P,QK$,#B(ȌiaYUCQ{"JaK8IFD=NiQYD(iVeYF&aQ~C{0U]7)S&@Xi"~4bcJ xB1£3:0$I$I-Gijjvi*IjÆ [~,w87nڵkccc m6[jj媬ٳ֭[SQQ ]tz={ BX,;v$%%eddztPS$W_e+5a@ƀ`=dWG~N}5@jfᤰ XIR']UI7$ba@!"nwlBUHP{0V:dJ3=뺮*r!"*vx.X'Cea^G,~Xs@҈@]`D T"@$b2|#*` 0!BDh16¨!Pf0@b.wsE"L %BD*SQR? Dp B qFylFlVYۑfG^|c?{|[2vcaQFEo]EË㘩]0 p! !L82~{nd0o^%c'cGFc-Ea0FTKc _(0N@$$1bA8ԧ!v؉ց;B!Bݓ!t8L!.ҙ!L[Vs:BgwHPJ:9p$I;]ױ!/qGG@!~a;B]<#^u!<"oNE!B#B!q.dfiݐh|cpv*fA B?8p$]+R^]e醜<6ا (q^wB!΅3ƪC,IRbbjFxk&b\\ g퉉nj !~ ɲ,bmmm4=UBGRR|t@B#mq7NGMa0Ah@&ruufKNN4->64 c0$s20^(~/byy.+..ճ+beeaHF;v?u:nA+ !UVVRJ;t`9zJJ٪cͬa (?Z}? "t]o5)}B!tmh >>B' AKLg0;Ęi<MHHQK0I|6Cyxa3H b;>prr($AKya$6@[[sss-,pB(Rs{@o;!DP($b1S,<|,ddd\B+FNH$bZE1\5j3Jiϒ1fJKKUUu;ܷR37\ICn-p8c? Tbz<ϧzFF,h("BA0̵0 ,~Bͣ9s\2!!!99f\.[onfn].f{g# VUu|W_B r$I*--}ǎkZUU`ٜN'x<_FF (~MY:|yEQZλ@JJj}>>Ȳ|t,{ޮ]$%%%&&F ;wu(NnBNvv$Ipg;vlBBB$l󟉉yyy.K円3gv=[aZc.K4"QBhS #e˖\s5(~ᇄ+R/2?~˖-[n6mclٲeSL1 =zѣGvm۶]{;#FX~}N*++gۻvz+R/"c<ФF?}>~Ot]?xceffBUi(..+ny222Mm۶R 7,^O>yꩧv_ݹs)Sx<UUNJ)]dW\qI&c<4-++0c)3/;;{РA^:u*(o۷hٲe#Fҥ5 YM6mܸqڴiק._|̘1k׮OUW]e^8?B!t!j#1֭[;vg+Wxd$ʪ3gNMM /лw={$Mjjjh4e^\\\SS2n+((;vs~UQQZ,EUWWϜ93_r\KJJ̙ӹs7xJdfϞm۶7ݻWQԹ{Xwe%%%$n躮(˗CӴ'xr}˗/?;DQ|W;v옝z.]ϟq 6~GMMM~|vݻo/L˟xGyd[o=xM_{N:=䓍=ڵkSRR:vsBrhyd`0}vgϞ7o~wӟ~7Ο??kwmZ51fX>fΜyw;I-[6nܸ믿NEsϥ:Ʒzᥗ^ڵG}gϞ@ `X-[t:)IIIYYY/bnn;SsNt: fϞ/}7n|ꩧm۶zO>dݺuݻw2#B:p!?IIO?yZ#FmXxy"JNE>|xnnn8" ꫧNzu]z饼Zϣ뮻n„ n?:u;t0yɓ'744X=ztرW)))q݂ \S;^{mϞ=/_^__`}z ;믟|snݚ|rp8t]hT@ zh}}}ZZ޽{gz&4iҭުMvܶg@UUѣEQ\r1crrr~ȑ#cxG"*pጌ*+++ B!5jTbbb4>|x׮]N)SDQsUk;&N>Ek_ x^X~=(vzwMIDAT3hРF9 ZP(TYYٵkWM^{:Z:^4mذa'.^x߿b`BKr1IWXXrFt:׭[]nڴX__(ݻw=l0]1.._~cOut֭o߾;w,**7nf;tP=ḸΝ;dee555\VVrssӹs犊~{+ |U>t$I ;wVEQ5*../HKK1bĞ={y={ZJQ|۝o6Ɇa477~.] 0߫zVm?TQ򆆆=zp*CxUUm6[ee%c,333z]UUuСѣGo޼'455 |AM$,))juԉUWWwܹi͚5_r%N4//OӴ-[@VV;wI233w{UUHK.֭߿vv}233>ܽ{رK.()) B:u*((2dnݚ;pj!j:1# oX,Hciƫ[DQJnZt'8;B!yfߋP($I(;?` ^7;;[Uc;*ZecNj,,B[N3e˖kax#+dY9Nsh4ʿnUU- hpKʘ B0јNw@P,˼]]j't<'ù؂B]k|݊3jqCﶜmou{1 WZFb:+ 2*B!.n8po/Q{oo{+geWݽN B!tJ9|7bwi{ogw?!=tR,cB!,mV!BcG5-(I`f]9I0(fs8uNr)Q}> 1Ʌ|YsVKk^mjjJHH86m^h(͊"~]Ahll-0%\Q绥!EG;vRYYxOjxg8:!g[|V?f usl#sV#ݘc}_.Izqy|{@媪*BH{s^>+}WUW'#ALn>V/ͷ]4s MӠ%XhFSN#!j osmO>) UUf#Y֝;w׏=BBi<.Z_~;v WUe(6m|̉'a ̙ݻ?r ֫W7u]EEEK.5M3 j ÉcƌIMMEK oWUU+裏n~JCyqTUU|=alw}w͚5Pr]uUSL+wŋ !կxN?#1oa+۷oV^=pM6[C?LSRRVVgw}ɲ^AXfMssW\FV+hzg4MZfnXTUs0\.מ={yĸxpjXt]Wb&{ׯ_^za[1Xp!\y5^{oeOwBAl?[o5o޼]wΎ^0¹s禧 8b jg{awiKEi6&ļ1n-{EDQ^QTT첽:%o7a)939dճf hll,**277߶m۴iD"Quu5BH$`+ro?pmJKKN<P]]ŋ/^H&MdjjJ&#rssKѺw~uR9uTFJe]]ݲe.]TPP@R$vJ&M֭ۆ 6l@$:T[[ާOG 6d2ǏN6MPg1cC~zǏ'HeeeSN 駟4? J?2M\^ORsssoܸ[nX,OO3gh4ӧ?xBtm111ϟ?ׯNjR| t j֭۷okڡC:thȐ!_NII5jƍtNp֭Ey{{+ wo ^*))166~arr2D5jT^^^ff~t577ӧw`\ ɀqm$̏rgmm҂q?*@!yyy:uӧOKK{sssNNβe˼^0QJX,LEEE{8q]\r֭WTTܹsRt?u֧OѣGT^z=x **jEEEw8qݻ󭬬"##osZ,F`L766rwޝ2ewiiɓ'8qDLWAF {n:߿5f̘xP1ԶJRRIbbsuF ?z{{kݻw;;;kӧo߾L&/]`>>G3gΖ-[,-- ֬YɓpgggwwwTM݇",+77̬wާO6mZDDپ}͛/vǁ8r^g2zaC5ǝL&>}TwܯOqu[[۲rP:sL4pu:LJYBV+J8Ft:KK.]8;;;::|T*J9L&h4+WӦM5kJ511RUUUJ0Pd2lmmRBNKN-|r@ DϏ jjjp8k֬/((puumjjP(2 EQ0 0h SSӄhFYZZb]mBɓ0 HPBMMMt:FR}gwVTs5TU&.ZH,[YY]~_ׯD0f 899rhJO`L'>p\S* ;1lll8p3JT*  {X3^;::7H=>T(&MZv@ vqqYhP(8q"yeX0NI$4vLjZccS>|P.#h4ZZZڵk F@@@PPн{8 |BMHHxQ>}8T*C|b!5JZdP(ܱcٳǾ;љBI(Ο?_"|@WkVe2򋅅lfX 3&&?{JKKL&\j###:`??SI///>R'E Hz5˗}暘p8ؔ [ vf}||pL+[:NR) lf2`+s"~8pG{2Hliißc_KK z@$\.2L~t;(Sd2SSS:$]+++r9B fmpaV>*ȨF&YYYtpAx'$F HdaaA"j\.,f%zs\L!sZH$ò]h;a"H$]}}=NgX{QT"ҒF@AUVV0̵kFFF4x2_--- dxOǃO9PPލ0x35.3Fv U{lhll"Sh Y8pFrkkkz{cccCCM{ T*ڟ3HZ3Ho{@S6*JPldFFFy'NizARE"Q"@̑JcǂH$JRGŁ88vvvVo8e~EOK,[[[?g2L"`f5p7?EAMc- "u`u:]CC4)hVQ KD}ȐLә*NCHÁ?[=@D3U Huuufff*WW8pq;6Sv`mhΐ ~͏U,J1f'X+R!OL/3ٿ`[Hdll ?8p4MMM͇'Z;mn% ηKYj۔'f 61|}Ͼm[bnzO}|熵[vmN-[;e!@8|;u:NGTܹĉO 8~ĉϟbLVE`2XcBǎ/;wj|9...*sFe2YssKf̘!?C]h_WhlcccBBo8m?=goopY[[;m߾}wE*8pўi="$J!SLyqccV=yl\.F:ukD"Q="##ZիWΜ9sȑm۶}djj=cƌ^zd3uԘ&577;v#G"""رc4yIII#F`2vB,UC 8Ȯt:&888ܹɓ'W\ɑdh)@Jd2Fݻ,0::W\QT;w|CqqϓlѣGo߾`0vܙTSSvՀ7ojjGGG:~O:;;p .|;vtرc&&&uuuRtݺu$Phjjw]__߳gtӧOwѣG{xbx˖-FFF{u떷wmm뛛lvVVVEEEII dzaSN=}4˭9s L ϟ=z4(8p|:t:]SS4T*511~ϯ6lÇu:]UU՞={Z1/"(44f3QFyÃ@ 899#D<<}6ܼSNwqvv8p_~Oܥ C---ϟ?ojj:r^p7ťO>cƌ9rHhhĉ8РT*Ljy<^ssP(tEEEk׮;vpTq8px'Z;n666n޼y̙ oo޼Go}PYYٞ={,X`ggV7nثWP*ZWWD6d.> [l9s'BD"a+n\z!S!t֭_~]}K.jjjzͩS/_nll ~pllg}}{痔DEEׯgپ<@u}޼yW\A ѣG+[nJ 555ÇPK.֒H{-[ܾ}[GGGھ~Z744(]>ydԩw)***--9r$IPq^>|=PأG?eH!HÇONN622žiiiAAAǎ )B*R(S777\^^^N&=<<.^(8ĉ?~liiY[[۹sg^_TT4}>obb2`wy/hllLMM !!!2 b"HTYYIP!dnnjjT*U(LOфBJ6jڦ&:.Jb1aFYHVdliSSCq:bPrt:l\|JxT*,񌌌 F}}=@r譀 LL&d2Babbgh,VWW;88t:JT*hAP[L] B*`0@dSh&WT*SE@0X| OCCB177oiiQ(D"QR|333d2>ollfJL&P:@Wؖ x\`aaph4h4  ( +`m---! !haƔd!Z-rN;rKKKxl&z_m8pjz *>9s;f*i$hPՖegΜ8q߭9wT t5?˗U*Bӧ߭;VVV\8pFrps YԆvO[%#JR.,as"D"T>=w6}m@[\I GAq}E2bQQrkq;p?@inncSD^DGVFROR Ϋh4#jD)mR1vq`[ d2q 8p?F{Ha>h4w~4 rRih| uk7^ OjLP 1\Ҷpyޢm ! 5LE)1i[vH޶)Bjņ |~aaR|R:Kl>33S$1<ּyCjxzma'd&$+)))))Ao*W8ph&vw…ٳg/_@ 8qb剉ݻw YfYF>}t޼y+,,W1Mmm~zjԾwj~iٲe!qYfEEE!ݻ7j(\DŽ ^x!_x!tСٳgoݺURA)%%%K,YpB?-[BG?֭[e2YEEƍׯ_*J/_tұcJ7n̟?ժU `=oh$ Qݻ~:BXxاa&>99ҥKmh;:XrX,>}taa!F+o6"@ yСC0 -j$ذ_ !ÇF 2rBAⲳ PPPpyq?ygF]"j&9iҤ&J=nܸ6nݺq\6=y7o s΍3322r˖-#FHRfY,B2dȇIN"t:'554<<#Ft^^^cǎݺukhhqq1@#gΜ֭iLLd2˝4iL3B(>>7{>rȡCN:흙iii9uT333aggѣGGFFggg7n˖-+W,)) J!&jkk;w|Dliiy༼SNADC]rÇMMMǎ#ɮ6mzayyg}d2X,666&>™Ǐ711y-[ V^^A_6d~tkkk&O*`>##Ν;W.޾o߾$..Gƍ (//?s̚5kLLLΟ?7vXGl0@ZjƌڵkDbϞ=[ӧOqM0aРAcƌkPm۶o߾}ԨQ'N<|pUU~{//Ç1b|>K.WƎ۵k1cFÇTj?~]ZZzu1իw}gccsС%KL6MR(իWXqǿPc@lݺu,wʔ)!L)h򋵵\._n]߾}inn^hQ"޶mٳ]]]Bd2>;H$˗_|rJ $%%={fɿK]]{Utt+X,?QvuΝ/_>}F]vW^?/Eu~u|`o=ZT޼yȑ#-!zjggYfYXXxxxX"$$dРAs={K H$ƍp8d2Y,[XXH$a(-]ӳ"VVVHT'߿/JA3G888b:NRBKd2CN q@g /_fee:ukԩፍzذa˗CBB""";NW^^ᑑQQQѫWW>}4((hw%Ǐtɓ'|ٳsssw!CFw̙3 ױcǺvjaaqA>tw 1Yq 8p;=TwGNDbllLU*L&P(P(j`3Hw^;j"@ @I2L ڪT*\9|@8 ,rFQ*P** tZ622"Burq'Ɇz^,6 2LTB T*h4`83TRJl6E"BrZ-@@R}u:˕bĄJ9szjZ$d>BCx<fmJRp8>wN'a C$|^777GI$1q!UU3LE4440LD@@јL& ##ZP NNN4_mX NX,>+ZFawl[]]miiIRU*X,fX`1P`0t:\.7555 `0CH *ҖR1&E"1H$H$ tcaAb!J%|XBM0v:`0B!Hlճ8pիGN}{r@ igΐ sA{ˠ---:,bǏ+nooQm?gcc#`Nѣ"`aag, qǁ8h4v 566vP|wH$H48bUooo&'{ < ՜D"M2E$^>{JӪ& > յ5ڎRmwӆtD 2L*b&???hjkkWr\4X,Fw.iusۜ&xg[8ph4XL$L&T|U@ aAfYQT?ZWVXO4,(vl!!S`[1bCGUxVt:|x`t:Z"؞V 0q0pB` 8 "H&A k B!PT2LRnܒ\ӵyd2lxJ'rTuQH28pq;;V e n \V !b  4jr jD@UD $@W.d2,((z' 24Άq[0%0aX,wĜ !sssHjέV>|RPa=vgϞ B7ԿXa)$ֿT.gee2/j3[J 5@LX=:.++ :8p &v`K#GYիݻwO0!tyXBV-X`޼y:'˗/߼y3gjS[[7,_ga`?ҥKy<^KK̙3AŲyƍs=vBݻ#Fw4^*92ܶm[bb"B۰aBR /^t[n!ݻdɒ 6 8hѢݻwd[nܸ199Y*YfʕFJׯ_3gڵk!f*fz"10Vw DZ]]x;P1/s3F2Ao?D BRR҅  C``~aѢE+W,,,3:B?~c\#+۶m$7)Bƍo@a)8NGsss 4ͩS_8Z=/K$Zmcccll矧x<\3f̘㓜 fff_|ŝ;wBa߾}ϝ;7|}"@ϑfs8ss!C|wDӡ>eee@qĈzK.cǎݱcG=ˉDB̙3EEEΝ:ujXXB⌌B.]3fLTTT޽O8q3gx{{geeqɓ'fgggee5*22SNEEE ZreTTTVVV^^^}g2 ŋ]t9pH$|rZZ=~xnnnPPPff3g^zo߾W&%%ן8q!nݺQFFaz'b$<==qd Cϟ߿?--ɓ=8p sAw2L6mt#Gt*gg;vt֍D"WKKK߼y Դ(888##9s&666##ɓ>vZllGYY/vٳĔ&ikk euTa~ڵ71 <}^^^"hƍϞ=jC ~?vXss֭[L&_^|icc믿xyy%$$\vM&ڵ e׮]d2ˋB8p ;;`\r~իŋI$RUUUyyѣGj֭[_xy___8p qP]]]UU5vǏU*rttt|H$ׯFSIIISNmiiy7|>tzvС!sssșN[YY{{{!W^5jD"177322V\R322B=zݻwի#""X,ԩSi4K߾}׭[# 4>}{f0 Ly{{ÇGee%BիW{7oܼys~?~Ւ)StիW+WLNN>w1h$ ?:[:zٳ###AYYYW'U^>G&L .++;w͛ccc|~pp .^:BQTbŊE544|~~~?wСC+&߶m۔)SN:eggiӦ3gTTTds ŋ߿РA{%  A4<<ϯ?...fϞ=ڵѣ###w5uŋ ƍ'Z;ym۶m޼yFFF>>>&L|-rd͚5ٳgrrrvv mmgsttDo ppKBEܸqCV7nΜ9---YYYΝ[byEǏ3fݷnzeIIItt4JvZHH_ݥKO"曄+**oe˖q8T_˗Offf^^^˗/ ߿ccc@hRtĉ,ΎḺBypb;ހx0Db@ӓ@ L4iBD8FUR ĕ Lh4 @@$ 5yÆ ٳݻt:ǃ] .*JӕJ%ԩ0TPH$T*SSӕ+Wn޼Ąd2Nf #jюh4t:JlNB aZ-䧟~211d+ vӣ7NDDĢE ye˖9rSNfff+Nh4MMM-,,LMMa2*#J5k***i4ȑ#vرsݺu<.\huuuǏ1b݇ h4 f755ٳ'''L&`-2!&zꪪ:k |999ݺǔ.))qww2eJ߾}AXX]~K~g^_\\ŋ޽{'&&߿ƍT*uĉ/^|xӦMʼnd2gϞN vuuŁ<Ot9##cԩ/JP@R鬬|رc\rÇϏ=ZRH߿={,,,LKK P(/_qL޽[,Xp#FXYY6 6>rHnnkeeeHHD$w8pPe9UȈJC2JT*"uDPX,_/Jt:L5dVVjh73XTdLlD 3 l'r\RX,cn@ imMLLH$~w!p4XM Of1?cSb~DaMGZ)`1N㠷!Ubr '6(JRRbYV_3uvj]n`FjK*x:@ w}36p Nh0qohhhnnvrrNXm38La V!X,WU :| ڶmo[H$TY, I@1χ+gC BV?"&BA;9PH$P(t:Pť ޶VDV6}~!ܪ[li;ֶȤU78pсj g J;nx\.m|OHdD"Ld2䫱jaS0ЁL૨T*ssO ennh0qtCGӋjt:ݧDl2@0333Lб6|a wR*WWV ;oh?g0y)*ϞD@G17&`m;;;;@tu[]x-a'?}~Q-.JP(Ϋj&G^rv|tہ'3/J5d1tmI$F g_P8:$B`PDs Ӑ"!'66B4!F[Boara)S ~V JXV"H(BzDt:X,Xu\vҰ,a8w 8kpٳg ӁsEY'x?†C솆n6>}9~zgA3agcx!$JSRR~4Ķm mYAy"Fh|; :.㺺|͚5$PBF} }tn+Wb'''J%bcc=;t@ ҥСCwQWW7}t&7a„CD"__Ço۶ML6 I"hР#Ft_555|r=??6eG---B!DΞ=۵kWxdX,x]tjСb/[lRIKK#zuիWX,KKiӦQT''Alذ!))L&T*EDD0 GGW^Om$44ŋEEE48,,o޼yt:}۶m}ʺvZuuKJJ~״gZZZ\D"yD?y/2tPJ%ɦMV[[s [\թSA?Bܹ׷eӧOKrrrϝ;h.]f|ЫW4MXXXΝ{:;;wĉnnn}٘1c ECCÏ?hiiYUUdMMMse0]\\rrrT*@ Xzuqqq݇ r0 KK}}:zJ=|p׮]&Mvrrڵkׅ JKKe2ڵk333v=>ߵkΝ;k֬*--eX`2zҥ@ xEJJ/,--{=bĈ!CܹB8pjʕo߆E˗//__~611={grrr$ɕ+WT+ -h4<:AQ%%%JJJBbW^SLrJ׮]G\XX(ɊN 6^z599yo޼ N+J*cǎׯ_"\\\>#F(**rqq&h Lxx<4W^yK.~~~ȀO>}CUUՐ!C"## ᄏr劗רQk@͛ӳj͚5O>|.] }dll!'M~0NDݺul63:5Z$-YֶdС 94<..4M"%%%^:44MfoooggF"LdSSS@rÇ*aÆ֩[Qz…;vX`x-Lu/^G6-%%̙37nPT#F9s& ϟ_r%FŋnjgϞ7o啖>}B\z500pɝ;wBueڴi/^D566yfȐ!%KXYY) l>N/^=sLbŊ={{ϟ(J'M`0L͆_,8ԟk)mT*@ ɓ'8p& Fp?0֭[G".\R0Ixbd3se2B` ^_5_}NRW\qwr `h40Fۂ@尡DVcoor!R0wr1V ih4!+++.bNNNL& !`0d2Yeee^^^AAWJJJ"##gϞgΝ {gvppXpacc#3fjT*B5>1`/8Bb0N2i 7l)ͶAo׋U*9bi...L&N+ 5keaaa~~W^|r* Z-t޼yظe˖YfX, py<%@X6"LMMׯ__\\믿"!|ШQN_}F۲eٳ&\__!CL>}ڵ?ѣmmm=ZRRrĉ+W?~\ >|zyFFۺuD"4h2pN@\QFƍ=z`2aaa8p`AAABBON9hѢy=}$ ښ@ kbjj:zC8p܈P[Fs۷/Z0arSLٷo\.p8 ѣGcǎ;wGtK.tuҤI;v7o̽pƍ#1cܹd23\ww]mܸ1$$dj:~ȑo~B(44ӧrFFF`aafãǍN&\.BʊBlSN|eyxx͙3'$$dʔ)3gθq㜜 vDb?$ $;;;&9tpJeeeݼyɩx/_t֭ӧOϝ;7>>>--m9[[[3fbd2KKKW^Çٳ4!!!Uo߾Ç/\LV=vY__߷o_D{]v={;wi4 DbX`5l0PlccpF nNgdd윓3sL 477NNN^dICCC\\\KKW_}nݺ9sL>n@TSSSRRbjj $͛7R)޽{#Z7B˅~A|||ZZZt: Kg;::l6|EDD?z&<<|}Nҥ HpR466޾}{eeĉKJJoݺC_|hhhpuuٳ… 6f̘d*曬={B8/~!tҖ'Ndff6/{ 90 _UU@vo58p&S}}X,"8;6[DTR(.jF\.%iXbd2@`kk [uEl L&MLLBjC":P("`k捐AlW@@!7HR X`^ rv`GI!yg0pA\P@#Gd9s;>'L >as^E^p,d2rzTq 2m`ކp`Jdbא+ "B0G itzSSSyy9Vzyy؀nDF`T¢ށ>jeV[ LME@ a9` ?%---44nllByy=98Ʀ9C2qG㎽9$իWGd2nv^offg4llld00Qq9y&-- CڪT۷oK$FwOV"n޼iee6R)|:8pJjhh{CCCSSLvT=`QP^I$D"!L&WM@$AWbajz$ 8özHzs0BFFFFKH>nVr:\.m_@ 022 5 Rm݄kO~`7&?n.8p= ;::Nj帷STKKKL'#gZpD"%yS6L655mu;?a{(oL5:b@033ķ&!FӖv 4!_{~Dx.[[F6¹ؾU,ZL7L&bu&STBVP(FFF3t%@wc"K܏kBڙ}w;nC2CoJc9Ln{Hş1Dj %v^5Uw~*QkSΎc'3/iDmI$(, 8p\)$Otz=h{ag|>(¶N8 b'h|>WmbnK 2ATD"8jzp*ʆ,P(lU\BCDn(NxfpmiidX>ycO(C΍  O`=`k(Xh`755=}uhB8hnnɩ|%2 J$VbVQ?pNH +Ib2ְĶB"ܹsIII=ݝEVm0æϟ-%ɣG!bP [SS[Re8p/(|TWWWVVVUUUWWTUUVٳW^hx3{ٹs۷B3f +**B FnDXJOz.yfyll,,H$TӧOs8 ,^`=z-qG^|f`j {/^#I"j++c>}T$ . >< 8(((555 ڎ7"h/^;vl߾}jjj@Dl6ñ2dȇY0D"t:'##:,,ɓ'Ç'AAAFڳgOHHH@@@cc#@tMMM~~~\.7..n̘1zcǎ|2vvvFȑ#!ٳgw̍Ǐoaapkjj]cǎhÇܹٳg0)d2n߾-J+**RSSwҒknn~̙'O$&&fggo۶ƍwޭ8{BXrejjjqq1c Sb1ģ{?,yҥKD$mۖnoos5///yUU.]:|{{{<}/88pZZZ`aoLfllzʪ/HMMe0D"qӦMr$Uamm)H S/!8 ZbeeUXXX__?zhԞJC &`0 8HPhff7ߔ.]T&YXXbX,GGGE1_9Nppp```NNΫWx###&&ySA7bNӧ.]ghCOt5`fvvvjZ&y{{Z*##"4H#F@ @*___OOO@зo_~Ν;? sy<ϯ prr ;wkנ27oTT;w|ً/Jܹs9NZZ$ !zT^Ҁocjjbbbpʕ ihhhhhU(W^555yyy>>>Æ tP>N\.KZZڱcǖ,Ypx 2jRX_v-PT\͛MLL={ֽ{ϟŕL4)22RVl/_2dHppeH$RNNwnnnyyA._ѣAEDD466ǛM4… ǎjsܱcGjjĉJJJ._ܩSI&ݻ!wh4x2Ld2Ϝ9322߿5t%==` >ɓ'dgg@2BF9p@fffuuuhhGLRe,,,***MLL`3e{J[QP\|ښJ:::><---00w}JGGGÇ߿?''b$$$}z+++KK˲?@aZڵk---3gάd:ۻ_~gϞ-(( 3gά,((us1^zu֭{t:| ?Ľ233stttssϯquueٵ ޞ@ \vb9SNd}III.]ZP( h@P(r<22yyyl6z_~J‚喗C׻ƆիW={rNNN! zׯ_wlذaT* 11FfffO>8p}qq=z8qĄ::: @>htllltኊ 666?t:]SSS[dTjbb]X WS)ֿ ]Ju:$p~m[& [[[,͇8,r*zf:g@Ѱ4L^u09VUCMV0aTp?, `:6p3 :ca]uu;Ir0g 6llCCnFJIz@ 0̮]b~+ QD!ԩSKK˪UvTH$H$~]oo &X]1ޒXwhRH$ ?cCVwGo1nq_9ceaJoڭX Km3Ē3Mon Ԓ6 tvH&885ǫWSIDAT,-- GGGxCW{_B^K ~*6Hհr? .uB%y +~m.O>ՓH$Cme[ =Ca?OaB4]}J+ mUU(Q TVVBV20Cp8 x!TRRҫWH64v۹ձ5Pi; ۶54|MY>@kYC ?y28pB{≮7444559::v5̢)J~~6HL&fuw, ^722jN" uVDƟ>L$a;a;D"t:EzVI?݂ D@`ddz=J,?m۞t0-q ; Yb?3'lll`wkd2vnAχ3Jo^'|>_YXX`p.ۏ&|\f^ݐ!UP(N4ܖ 0ןn+uԐh\.Jj@F~FVR>ld4tRi`gުoy?|[QzZu+>7$Z1 z)jg d7"8pS3Fn{B|#z$31B'T? ,D쪏~hO=[O?:Ú˻m?X}=)0Ro'mF7emv3$yh{n['ǥ@6Ow8gŻNܬT*!@t!hd|>b("jucccبz* ڪ &0 6Ç?!0)C544 V& ܌;Je]]68!Myy#Gx|XPPp#G@ . |>֡Rbca&jjj5'Nܹs9B<3P(GX0nB ܿ ][[Îz Dmװ+**222oY E[T*233ol|juT**ÓCb Y﫼H$BxVbX*HFra@%r\ `l0@ EdPgH PϒC h9UP߾}4J}6nاOsK.ݻwW^ϟ??|[mllV\=zH$ZP(lvMM}ܥKu֥&%%Ν7nܨ󫩩IIIiiiXjӧO00( F#=r͛7߿N"mۖKPڵkBBBZ-fR)NOMH jⰘP(D"N7Pj޽QKK ZT*Vc PaÆ R-pLrYtz^^ޡCd* |>  x0, $bjz˖-)))>ٳgYYپ}LMM---Ϝ9x~988rZi3H$>ydΝIII\.JOOOHH3f̺u <==w9~ׯ;wɓ'aaa555k׮wrrr=lÇ377ohh h .qСC7nhkk^RRuk׮eeeEDD<~x׮]III;w&H+VsZBAN:?B~$ U T*ʛ7okZ33KD"Q(b ‹/{ir`v \pիWcƌ!HFD\.L\._f;(B*Q C"4MKK L6rwo ❩T*`z^4M"@ GaVzGIIIQ*(vZmmmnN8ާO-[ܻwxŊ7oD]vݻw 铔gϞ$Fjժ۷ot:OO-[\tW^~qPPJZz͛7 EΝwq֭''' 5kܹsNlܸqǎ9H\vG`` ·+-#qW666:u5jTFFT*/^2dIHHHzzz@@utt=ztrrX,2dȠAZ۷ܹe˖SNV6R  a'g$NC}?^SS흒2|pԽ{>!!!xOќ9sF$u">>~zFz*?ݻÇOLLp֭[/]cƌ211r)))MMM7nشiSLLoPPPss3Dҥ zv3̣G&%%)Ҕp |~BBBaaٹs޼y[nxo˖-o߾{nYYY\\X,hAƍ0d2900ɓ' 5w{RRÇ={`0k|1q_~ITT{,XP\\LRA`gH$655A;vTUUUTTp8cǎs޽  'o޼qFܜfmm.,)ؽ{wee1}ueddM<ʕ+wɍ7RRRBBBo^ZZRbbb@$55Jmٲٳ777>zX,IOO5kǍ!wP(֮]w^GGǻwn޼^^^GR={&&&qqq?qDZZZjj]rrrccMBBB8 5k,Ybeeum'OTVV\tl6["$%%y{{_pĉ/^ 3f̾}|O8::oڴƍ \.ݻݺuKNN~왵u^6o `"8{,;t\+**͗,YaÆÇdDr5WWٳg߹swމӧODߩS3gܻw‚FSƖ;88^r%### ݻNJKKsvvkD^ ussgСCb899?|gϞΝKIIҥK\\ݻw+++oabbbwEӷlْgccs֭~m/_(WPI \twްcرcuuuL&sGINN>wӧ>>ɛ6m޽;4551cB5j/̻ĘL,,, a+Gȹf|277W,[ZZܹsT޽{`~Z(MMM6lʊqqqYbjK@(*L0ܹs˗/=z4,[} MfthѢׯ_ 7%Z"""b„ "jŽP(ȹgĈqqq'O[ZZxOOe˖qׯ_8q",,,77ݺu~Ell3fϞ>c JU[[啜ckkhbb=|޽pܨA/NWL&s̘1ׯ͆;ƦŋNjnn&F  "~^߫W>JϞ=iӧâM޽ iT jjjH$\.ojjP(Umm\.j?Nkjj233߿w}JJJlv\\lv /++Æ  H$vvvDUe-uȮ]N6-??˃t钐@"O?h&X,dɒ%B… IIIO|ƍ[r%;pCCCϞ=2xӧ_L&O֗/_ RٵkիW?{Bz{{0nϮ]۷O>fff!//jheeT*kjj\\\BpSII Hx#L&ȨtGGG@ H`ef:88@b6mll|˅###`kk>|p8p~C$33sΝ BSNDH$qLNN>~%KLfCCҥKnj{Juĉ/^r y;e… D={fϞ B\WYYYzzsܹ#'O,r;w.]J$u:ݕ+WF}vXVVvI"x ooaÆkZ!Cܹsٳgĉ|>ٳg!Je݇Y~G:޵k˗GDD̛7ҥK$ >eʔ={DSSSrhz1 FtgJj4juuu5B%GEEENNN@YIJJ:vX```bbb׮]XWW 8rBd&&&`0d*D.222R(=z>}:[RB \`K9X/D>-[sJJB4 Exxx^^ީSLrGYXXx< X,Jڵ̙3a VVc h%%%ɓ;wڵkHHHCCCzz:DG^0,[ZZI$p{0ŕ܂Eq\Hh\RDTt:՜9s4M^lvQQQaa!8`+WUTT1|ϟƎ9[nή޽Çe2Y~~g}qJ''?<22@ tƍ}Y``௿JP233+**zG1W^---Ν4i҅ ;F$̙sgϞM<9442>>mĉ>tRuu%xL&3!!!??k׮={d2ϟ_fMQQ9mllRSSE"CC/@=<< gϞeffHysjC^|YUUiCu|||MM;~葽}BBBpp'8ty撒{!Z=y7nܹsgNKK QQQϞ=޽D"u떧Z󫫫STFuuuT*dРAUUU_|EAAAYYM~_^PPf B̬6))i߾}׮]֭B]]]O--N<WTTľ}J$"P]] $+aÆ֦=zH$N:ϟk477X@0`tMEǏ?/zTT---L~\>sJggg&XRR赯Vq蟛ڣG`s݅ SNX,sbbbFFرcSXXx#G{:99M8̙33f ȸxV7b;;cǎIoo/~Сph#55իSL֭\.m-C >tNo.x̙3ʰj___X28p*Lbi6m Eۉd2Phccc3L&c/>m]=ø߿+j;U o3773߽{7J@[Pjna*VQz)[#1d2l6:)B^^^O|ט7ohh(((ߟbaƇNx/_|j5BukfffXHRZ`b04Ÿ1$Buu%6 vFo2D2h ܹsgϞVX^oa>ҷ=}~n0@}|aۦϥwyp`5UwV ^bb\]vܹ!ԔO&u:]@@׭}zy:U)<@L38p[z0 pV׷}!+y[mD'VW} xSl;Ϋ)J bAi^; 3Ób|EV|X7\ņ@)ׯ29Zv۰`5HQΛÇD[}3b 4n3f̀;o[~~6=Ӫ+۞Gu3,86aQ\g KH M1[b4$&5Ęb%Vl) {,,lε$0;ss<܏]AիL&c BOt,~(ev8p ^3}}},AP;md2D"Pc jΩ]OO '\?,j<؋fBclȂd?LZ6D# y6O rD244T*\.3P(!cl QrcdI Y@hRy;QŰY[݂xA `qw ӟK!BY[[ѭ g6ɳg0H#C@.---X}}CfUZT*ݞ@ lP$ vO!b~I1G|233 csXPtuuuvvnf[[ۡCںwf.X#Ӂ`=$o0 oN།\8pxaT|.^XYY)7nzL6qĹs"jMMM!N3fhhv 2 ܹ\.JR*L&NT*c``kFSNr_~)!N}}=Nꫯ}Z*>|+(!@BD ]qƣG8ͦR'N鎎o&gff&&&fee%$$۷KүZVϛ7o̙σ҆8p cK/-_|݅o7BhӦMV.Xh֭)))/~zff&̽zTTv˖-'ODc=:uuŁww OBU,D_~,+--m```ݎW_}z;vԈb:~Ǐ߼yڵk^:u͛gΜ{8py`䯋ayyy__oQPP`hhhnno>A/!dddCT+ |MOOO\Vаf/^!DP`BPԣGCW}YKKː##͛7 ?$''ĀaYYY _nL677_p)S:t-6D400 7n411-Cd e65eʔbTjooqF rȑ)S455AuEDDx}UUU?c톆c;3z{՝;w.X ֌Yjllf{{sr\\>iҤk*s΅ݿ="` '۶m#Hxĉ\.ޢRnC~={6χXƍVVVP Z,A X@Tgmmr|X,uz@  +**@>( v ːF SYf|gMM /V'NhmmsyLHHBhΝgΜx7o*++ۻwoPPTQ\\\TTBH[[FY[[s8@`iiillLPR݌8p㿉" ~駏?!hoo?uTPlN{ӧ!dwww'|dWWW M6Q(kkk777GbD2ؓ{>H#rso| ]0‹/޻wO(͟?d[n%$$@^\K/}7)))UUUǏ'wqtt>}cGGL&HMM-..}D"1L---:.-[6uT1$Hߠh*L&JA wuud6PKK3?Q;} &b1e488<%\jժ`D V<,g˖-t:>DE&FI$xmllʸ\. DUUU'N$eeefffnnnT*T*jucc#^% ͛}vsNP} 넄^{o.**7o͛7߿kDs-]ի'NٰaCyyKKKzɓ'3K.yzz.\0333!!64ƍ;wlhhx񢡡9sϝ;rlX,&nnn---/.)))**Ս8Ns\_:::Lnc*fccs>www]]ݜ[[[n={4@kwbVZU__/Oӧ>|( T*hl###.hM[[ی;;;R=Z|)H~xuuuKKKTT#GDU<==SSS>|yf2_Λ78TvvvD:::|>ƍ^^^-ljj1|qqBK__Çs155!zzz .J'Odnnn@omm-**bk׮J,KGGeΜ9wyW݋BNNNǎ#+W{n^^ڵkMMMOqpǸ@RX,) Phhh  ݟ~"`Jj"RpdS3Fg)(p)wwy>Kv84n;;U(/000v i,F ١;*ꪭ hsE&*277񂱇\}j[O'?Dux:e>6b{8pcpMM 0Z1bBcW,l? ,DɊD" t3ٚdH3 i'r#S QTJ$.lS}#SCB ' #?  c<4Ăct8p1<f\@ʧc]8w%DHVpD"Xlzv۰jD"S(DYj* c'Zpl "`E88p@BT*G_VafG9F#wrmll<" :$Cek:r@"lJ233)JPx>4Pej5})(Z655Ռ5^ t AR 0G_G<Eh\F)gd5_5904ވCnA}q!]q )ş"āI"Jx</ɚ` L"bqkkP($2 n%Je__(6T>,@{{;̼D>͸eX5558] @,}b:;;1#[ZZHDРT* EKK VFDsB/0 &X&aC~RX`v|RR=W6 `|OOOjj*H(}[[ÁqH$jllz\S__?CF菭\ _ÿr.lw8SZZZVVOV&#{@fddok,$K L&Ɯ$PgΜIKK+))9y$駟Z[[Ο?O :;;!.f0 i>;p.aX ]]]UD"Qkk+WBBb׋D"xDrݾ}k.8Օ`FFF{{4Ud izPd28AJr|YkJP_C +ˆ;;;~2088ގl  bvvvBÇb-{ FVi@8=FQP(ľ_H'F )$ ܹbjjBzر}>}:555999((b%&&fggܹ:Nݺukff9s (R{!TSRRܴ>^zرc/((z LLL<<< /}]V㺺"@sBP[[[.ğ~)???%%ё@ |7ZZZ 7ܹkҤIRt``Z_T;#_B*X,% TM x<hn¸TOO?}tqqqPPP(ׇQ( vӣEP>sP(zzztttd2Ɲ+5ny</n%_|АqĎ=`0 ~+W̙3֖H$* ^3{akkkii]ą ޽W^y&Drvv駟-[v䌌)S߿?++H$D" qwB]%''8q"##ԴSP@;d2A߿ &OGfdd?~ϏBP(PSSK/EDD|g---'OD"(JA/lllT*9&O@pJ488P( )S`5P0I.ŸvҤI{(**pBzzzPPPOOϾ}|833FWWw #00~ۺuyobbP].[YY999͙3H.3[nEGGN0aܹYYYb822J޽{>>hAAAjΝ;W^l33ٳ'<<Щ;vܹsH$&''wwwUVVZ[['$$eee⬬,77'NՕM>^;|pllCjkkͿPOOO={|׺ׯ_wݻ+++I$RllԩS^~e'\v-**ۭ ..!꫟y*ԩS~~~ׯuVXXXJJT*MLLd ڵkt:=11q:::0T^^~ђmmI&믡!Jd2Ɋ/))ihhhnnzjYYӳ=<<?.aU!44t_uAAݽ{ ǎ311wޑ#Grrr\ݻw?cKK{uww[XX|g򋹹yffÇoݺe``p׻%&&Ν;؈b0 w8/c,>xɯzaa}`#ܿ_P,X!dddkmm277͐'cGo޼ihh!Ckkk}oFll'BzzzP~9 &L:9??_Tr &_L&;vlҤImmmiiiJrÆ 111d߾}.\LMM1(<[nڵk…J,g8aoܸqժU^^^_~ess{}} Bٻw/zS$22rbݺu555UUUDb\nHHȋ/믿SԫW޸q㭷Z~H$띝mmm1 <==MMM333322rccc=<<.]*Jʚ'Olnn_QQv7oN<̙3;w ӌ\P(T믿>wy9;;kkkabbr1E&gϞ-[_vM @  b V{{{###+**=oDGGϞ={ɋ-2eʌ3fΜ6{lÇCbTjbbbhhh``III**$$… &&&\.[Reee%$$@p)S X,L~̙s֭3gx{{|cii222!T&֭spp(,, 4-<<|͚5t:[WWRL&c„ !!!&M;w?-H`>[t)z曚H$kv,^8== ,pww_d@  +(((--xwfBbB&oܸ̙3SLillLOO'nnn&&&˖-:nJJ.,(>}zŊ=<<Ν;駟[qqq<W_}Z[[wbZ[[T®^9R~ e2Yuuugg9s\\\2ofҤIykk붶6wqqKCCCϬUKK Ne2RZÀаR@ז0LyGGL600077/Hdrxx8LByqPކ<駟lقruuv@NHH?c2ebb2qě7o:99566 vxip`o?[ @ػwP(\z5x]lr%%%/_3f+WRRR>#PwwD"III3gΗ_~y궶#GwZZZ2 Hddd4q{>|f B! l+V[D"ر#&&f撒~72 kdٲe 1d2Y&'1#BX, uttl6ÁFlkkJg~`t؂@w/&&&N8bҤIW*)HD"P(kaQtT* [z5H 6l:<7nܸu떭m__P(Tr!ڬY6mFw >/LZ~wL)X,[4,, Gxӓ*JdXv4AJJJ9lmmA|`Vk֬#QQQ&&&ZZZD"Fm޼Vaĉ|>Аb)Jr x ȑ# ]f0\.7;;iGGǚ6=00R K FܸqΎf+ `S(o>H$/ҥKJ 6ٰ#nI[[)T5ӣJr&&&;wƎBL&FA`>? DͶX,եP(zzz\5Vw:bBl6&&&fݺut:j֭[?MLL:;;ACCCxxL&khhurr+++#H'OxQQQL&`ظ$77WGGǧ(&M"HUUUEEE̓iZZZ&&&݃666@ tƁ|Tjmm}iX\[[KRgΜYSSxbcǎ577]tITp8~f$ɩS͛kJR,t&yi! G T@R7DRYY `2rt:='''44 55b/X`ڴiӧO744uI&h۷oرț̛7ŋ&Mz0릣3a„΅ VVVEDDsr';;;'&U͛F*<숸x񢯯Spf*؛7o~1L<СC$iٲe'NLKKKOO`rb:;;KKKcbb FVVnXX!,;ǧxjʕ+355]]^"hjjꫯD3gΨTdmmmsww_p%!!!...Ν ussӦMRnR&{zz'>>={[ OBoߎLKK[revvvRRSTTٳg֭[lmmy<__GnnnSST*]z6<:''֙Z͛FFF0SwkSNd'N9sfxx' /_^ZZf//gϾ꫓&M277?z37ovvvYӳիo?N?zh``ܹs]\\.\  yիW{xx_uڴiSNuuurJSSSsw}kmm Ɓǿc`QVS(GH$r1$@'ɆOa|M &tRLLL0U*7|cnnrJlՓ&lVTvvvϘ fH55~!A Ν;'WX5\ sraʔ)C Y,Viiiyy)v;.,,SS??;y2777 HLn˖-6lpppZ?DpD9QGd_!]i yD:'jJH |g_5J#r<88򉞔(g ;>KF8p15550S__l$?~Ǘ`>(|Æ'4j5o.D4`) qб+W6Dq* +ybxҤI8xMd^q78] t3:r0 [ 5SHZ !\@" \+6!e~ ǣhd2y,u;d#]O+:::RTRd:#F@0 Ł6`}ppdm|kkkliyDPrGLq Yadd4䮱d:sCtF_'n hT*P IJP*w՜"z@u!dbbeT__J#Ǧ(BT*(CK5'8l럠>H$vuuikk[6,< d141Z kzHyU*RѪ?m >4ˎ=Jc6 8:3#Se0QElqDgqCnQ?Q9cd+G+G' iZ4|3bG\3.4逵Jgxŀrbg.?IC|1Ʊ~%4;jٛrDǟ>13ؕC} R QͲ828"a``(@tuu5sxL&YSS#ɔJesssOO"jkk%ɐRďM{Jegg'!A.wvvQ\q"s8zf(舁$@ RE444#x<^eee]] ËMlG+5ŽՏy&4cL渤JNNF <,޽ֆ͵k!NbbboofI Аu?lf'$$?}=)Տ΃%vf655Jjll"www""e,^fJJ/MMMB[[@ NrW*mmm<OQi`B٘萒jVѐbxs=X]~^b!Hсu9Pee޽{Ai djB2 YBffp8p04rD"xbzzzBB}Z[[U*Մ N:o߾hCC3g 8::VVV^x޽{D"f֭L&3111,,LKK {ǎsՌ>DTj\\\fffBB„ T+0SN=|0&&Ç6m266$===/ڵk!z'rssA+'Nhlllhh޵kWiiiNNNddK233o߾' =ZPPf;vDmmm:fAzpp?W(&L@DЮJZZZD""GǥdŇ>potp +ϯΆXW2npe2Y[[Zhʕ+ dٞ===/^tvvƶQr`F&U*X,ʂjuww78W\ RT pܡ E__ęRFK$(8Ġ!==="N߽{ٳ$G,t7ɓ'sss ۊ;w8;;WWWϯ:ujRRR]]=== Bϟ0aסC222z{{ߟXUUUݓ&M"iii;w>{ C>yd* XF&DBR~X,&IP$ :cXgϞ6m(..~|}}+޻wO(N6pӦMD"1 ;;bD"//ݻwEEEYXXoӦM  8p09ȡ+p^ݽ{wUUUgggyyŋBׯollȑ#vvv7n #WH`|s(4_[[Myy& l$ Ϭ"{1554iҾ}/^L&_~Ν3fL2_~H4K.ݳgeaaʕ+1.^XQQbnn^PP0cƌ7gϞ;|:@QԞ ꦦ&DRSSzt5k֘m޼ȨI066!?;U*ULL̂ ZKKK.}|͔)S (=QT---@,CW$Hc@x0 NL& [ZZ J0!+++Dx|SEEb'NHc`ҥ'OP('OEEE:::N6аwE:naaoJ<|f+w^CC{WX,V\\ԩSg͚R(qg2Νc `w+ }}} r8LfjjzuX<ﷶ~WMLLbcc <oxzzﺺhCKϟ?w˲eˀiheeeӦM8q"FKII/]dnn+]r?44~~~S.STkחXYYW|9rӽ]]]!!!O!'qi4۷|NiimZZZ```||S,]KKL&_|#66_niir劵5F100r͞='//O__?<<D"1///--̙$IOOo֬Y===K, eԩ aaaOJ~~~l6t|qGq܀ggg [[[̚5+++N*Θ1CPx{{GEE7xˋf744uDOO/77wڴiǎ#VIHH(,,\lĉ .]{…˗/{xxZ@~OOOXXXNNNjjjxxY򊊊6mdddtiSSӉ'"T*UzzzqqJ1^PPPTTTxxi(Jddd#hii͟?„ D"9wǛ={SWWWoooYPPph+Wt:=77L&K$ &N dff677;::\z5 ݻ VjkkIE y{{:(0_cps\.Ƕ_b-, ό 2`rfppi2ćGp{ ̊m!,=f=XVP2kHy5/1 vR*FEE}0fL5_(O!־OfiYJIi6fUkd t!! #?C hQQQSLA5ۂ(f{ `G|s4[277f abq v-5R9j.Vźfqw?k^=szzz5sW.@!8pX܉?̸X,{{!ޟL&J1ytGQ D*IW,DjZWW ' ?,jîg/;9ȧcjmmmA3(=wx4mIt3T*|Ui;{LRT*B";z#8p+A r࠵qZs iL?;@򈀯2Frאyy(%? T*pIq_.;;ǭӿpgX)#J& I’с7ʰ(L&bqUULYPاK5*]]]UUU rrAsKdZ_{{{~~~[[Bi:0/++++r+++ D"Oyyyyyy[[0 ÉIPFd񊰓W^Ojk\RLHHj:T*%%%لGaCGNyfOOAcǤ}z~~>裏***U*ŋ_m۶^pGݻ9rDVٳի_}\.y&\ ˗/?~\V%%% ̙3Gݻwocc#Je}}}ww7 BRd2BwNJJb¨d(8]]]<,Ϟ= 7Ϟ&@ohhcXUUU?,++p8Ϩ.J{{{T*U]]B |>!'>(>Áeee===!+HN qWWHJR,P 4.H{=T #^X,J $Jhnn ܴi&}}}0xjvq[r܄fD={`ؿp".r[lllqq1ɓ'Ovww733}۷bqCCChh(H䴷ϟ? 8p/XtGTjvv6]hQIIuHHa]@ sTT}֭ bʕW.//x"rrr***:w?lUHO*޿?B㈑2ڵkB~~~FFFMP(r9 D}vzzUKK ~.;FIHH8| 6=88(B}BXp!. D人7oAXP\N$O8{!ڸ\Mu֛7ow},222!!_nDjooW(:I$Riiiaa!G6꫓'O޲eZ cccySNQ(zȗ.]%T*!07,,, ,p6_`\.(=5h4ZkkkWWL&\.wgϞ& P(Riee哒sMNhffRV\+}Imm P_tttH$X,!VVVׯwtt :::b1˅XJaaa+WD*GњJ吔X,֖d ^IVIDATh(%""b͚5t:@ Z*&&lۅ233khh100 d2sss sss+**dɓ'SRR֬YDvvv"H,C8pLjUKRkk7n h4ZlllGGիW/_vi{kk)S .,\000!_:d2/_,x<^@@(*zuP^^nhhhaaqaX,޽RXXp,--_~娨(KKX}}G>x`宮qqqzzz}}} ,HII~wWSQQtR˗/S(rSSS\~رכzyy <==ϝ;gii|rFsNii/@R?˗/[YY͟?ƍ@Q**JOO1^yR>>c2]\\rrr$G||ٳ͛W[[ࠧ쬭-,Xbtttf͚ZRRbcc3}t;w0ڧMV^^haaqNNT*H$B$88fff$}ʕ#@ x<:N"lll.]jeeejj'Njggw%&b-[v 6 ]\\,--ã&Nx"Nqss9r߼y@ 8sLVVҥKSQ8p㟏Pe`>.$%9S0q-Cta_|tQď%O8?{:PvZmll )|th45 )1G6NS_?hVf:-@ i4iR|7`D"4"ͪ^5\ sǡfƁ82p=== L>^yT*UTcܜ^@ )]E"Z})`0@QZ;;;ǥ/FLȂ |=<<"f Y{gxH$xOy$C|)T4,P{ Έ a Y|HcH(ᣝQ~}͟6ce7Ͼ0 ! fp #r o#ͻ4 ϟk\ݎ955>! 2lL.78p^ )..Ax&l⹭@$]]] :x"3B9&@ bG lvQQ "8E ,X44t <G^fg\\y;jukkkKK˸3ׯ_GAD"LVXXx}2B^ϵkU,{%'{߾}KA‡,ׯj<@F\R(a tCzBT*/BdAZHTRR 㫪 1.8p: ))){)))_}U~~>81IIIN{{;B(55ѣ555 6slЍ7yp1Q?p;У-c=eee2СC1B˷oBUUUk׮MLLD_||[twwT{m۶ c߹s_~III_J={+T744 ݼy[JɓgΜٷo_]]Jeeee{{@ 2|>_.T]vݼyTVV[nBQWW'ˁ8Ғ 0X,_|yժUOconn`0?.//{ƀ;"_Ps\goBR[d2r2@ M!:dX$UTT|ZbD"Ñd 6mjmm}a,$\.///2 6 H&fJE&I$E]rݻ۶mLHH8rHOODyyy;wwDA] r+++ww ֖8a I&~g'N$W\111wuu2eJNNԩSУ8;t:NUTT̜9stV+F#&&T ͝;JFDD;w.,,G,d???Holl}zHHHP(111~*H#""BZݻwoKK~cccJJJhhݻY,(&'' __߸ {899ڵdut|B ˋ'@-.]JJJ*--𨯯vvvW^+((:u*Ì= Pollr tttꫯBJڷo_yiiisssFFF#ǎ뫭۳gOoooEEELLO~ԔVUU%HTXO? J̙3...7o޴wͻ.kddT]]}رiӦ۷OKK+%%;---((ĉ>T(* 666?FJ֭x.]*..ikk8qbtttbbL& hg0*f]8p_踏-dff  |װM `3ɓ'/\gmm $DQ)@322R+2[YYir###}}}۶ml6[KKٳNNN0çWUUumsss???GG#G}bbJZd Be666˥Kbbbd2x2 ~2ZXXd:{===p2gkk; .\100iӦX*k׮+WL4ivvvXϩӠgs0޽7ޠP(s333Xu֎TtB4> Ho訮vpp W\9s?777JbŊwyl6ή:..*""(JO>mllLѣ``Iy{{׷lܸ_7omDD… -  `0\_Ο?„ 7nXb'|$"##g̘aff;/^tvv4iRDDĎ;ۇ255}؆8p#Se_~!p(tuu D]]]!oooP(mmmMJJ*((P===woop>'>>ȑ#V)^pjBgw 2͉ĵRT СCYYYo6By`` 77wԩ7nLHH@QQQ׮];{;CV[ZZx<FKMMEUWW찰0--- Cf͚'T;wΘ1ߴttte2믿%dJG Bkkk&900\'#"ԀVխmiiJr^:..D"R 脖<92244]bɓ_~e==۷[ZZ1 PRHP &0L.Fbqii)zDgggL6e01z{{/Ybۋ`u,22r͚5ߞ>}@ S՝JʪĄH$T+,,ϯ$ɇw[oR RR fff?PeJMNN*//722277?yJdfffٺEEEeee|ܹvvv[^^ފ+oݺ_PPb.\XZZ&%%UVV._|„ T*LR>}{Æ &&&NNN!oo+WھD"6h{͛7WGG'++k˖-mmmW^Yp}bbODD9H#ϟ7o^WWWee{pp0XуGJP\xQ N4&±T*___GGG---}}}kkk*joo/J]\\ƘPe(6W,--mmm>|(H<<8fou!( Rcz=/Rct}Śg,Ai4!BD导򊟟U\cR* ;H$L2Nf`  EH")B kJ,;Ga5L6D;;;71Ȁb1Ƿ+9.e-En*pF|]\\`"H:::-}re$<OP8pǿ]]Vkkk[[[ ~w艚T!)TͻF 81Ǡ9Cr|\:nD_Mf:خσIy\13*K\hy\3fp;tܟ  şNJ&!i|5CH͜zR,]39ftR~F3C<{<.5T`ĉ,4+4Cǟ$4P.,./ok4_)F* :w@oMLw]F6srrp߿ֆjjj@B졚|D!d2Yyy92sд8b)444bb HxKK 355!Օ 1J}]]]AAp8NNNH2̇BUP[\\XKٕٴc1;󃃃1 W`xYl?xu5z쩁3~Z Bbb<U(B˗/s8ׯD"ڱB B@@ nݺd2\0;xrPoVC"^;msT*ظNs = BAAAQQVa-X624q\JJÇꫂTW_UUU㞞#O:s-,,p8nJIIٳg,f> " g=߶mۆ}vFF[__e˖$(HgϞWSSsΝw}WR=zի|MUUf6BHP777x<.pd2YGGG^^BعsիWT\\G ASSS{{L&J`bя/ub۷?SUʠhVѳ555)nH300 *JXR.\_K$'''==H!KKKkkk H$***jllD]|/4 !TYYK `o@}}A$H?ojjسgիW Ekkkaa!ď>۶@hjjjll*t|GD" F͋K.۷F!JUVVV__/bL&Q7733sttܽ{ٳg1Ru8pJGvѢEZZZw ,w}o 7nffP(^yHddd駟[N&i[[[o޼ѣh "g޽ -[ *:uE ܩP(LKK{饗@D[[[,HիWS(kvtt#T*m{ݥK">󊊊%K?x]KKk͚5RT[[qqq7o*wן:uj}}}mm-[SRRlee%jkk\uƍ5k||p/ã|Q M6566b0t---,ƆH$FGGEFFB[j>7ntpp?J""##۩T v74lҒ[__`0^|Eo_~|ݺuuuuUUUK,Q(---]]]ׯ_ϟ?f?~ᘛ.Y? "H\.czzz, j޽{5kOCکS_~AOO(%%EVKmmmپeeefff]]])))AAAgϞ*!7򈈈;;_ᄏ} zkjj㻻'OlffV[[>%8pONֽ{R!6ͼyہ@!Ù;wJ:~3gTqww7BH"/J߿ORkjjTjTT;sotELpnݺT*y__߈gg^xATjkkL&1:bj@ Ef&A Jneeٳg!M33R]]ɓ'JRSSә3gBxӧϗ\!--ȨݝdEeee_,%%fŊiiit:‚@ oܸа!w ''%KDVi4ZfffYY٫奥iӦx{{E9::޽{+222++x{{kkkO0D"K$9sN8[p~r  ŵkry___PPSyCB4+33D";::h &)Ĥ1//I  E[[[T:99YZZ޼y!4gΜ???lKvv6B񉌌,((PTvvvzzz... D"q8H488allVYY,Xr1ussFA x<DJOOqㆋ˪U377puuP(l66((!bRSSmllΝ188vZ\neeeii)"""LfuuիLfYYࠫҥK O^__\]]Byyy3gΜ4iJurr2enDDB4iRjj]lly.eq~g:pYvv6̻̙3/%'5q@PTWWkT}}}$IVa"c d,*&)@ HQ3:6ʄ.-=]Phڃ ;vE )cKHw*4-SI$BXd'zp/DAU*؀,G5;zjX[cU'H$hJÊYr{]H$Z[[kkkB <9XK%=(ABׅbBǀX/EBRd2X :B#bZиXc=?De 8ps,Gy=RL&J']D"Q ܸHejT*ttlll mP|>y#}|A$|P(bt:dyT*UOOsn'I8p_Q>pj$cROZ&UoSeh(Ơ?F~XLgHYHC2ʳy3f88N\8B#m Ѭ!u~GO3*v0A~դ9=8pxN-?#222[800pݦ&Pmmmii)ĉDbMMMZZGz>VKJJ?["'hӴG&J̄ Fnn.Ūl+--MHHD1 M笲2++ l6;==f6x\Z-HҊ EooonnP(c&c'Y,\.~¿c`":u ǑɠUUUUTTKj:ũTz/14Vy +A\.HLHH:<ùv(Ej<"7o2L,͖'*&55ݻ,K+Br8SNˮY'HeL&S9 P\ Csh988x B188tSN$" ~:KOOrssb}ټy3hߺuٳ,!0|>8ӧۇi0)K.ڵ !d2SSSmۦV[[[o~(|CCëZRR288gH$Jݻw?V7oT*_}@ ~uu_~YYY) 322{V[[aXֶcǎ!A/HZ[[@BӋD"L&///999555K.޽Ḹh4Z]\\-RYYچ1:DL&۾}{[[D"xuuu ~O$` :  Bgggqq1(lDaÆtZd2>|(bqOOHkjjڰaCmm-Zhnn~!6Rr*jĉ)))|Ioo/H-))H$0}w8ptL& +)) nnn'N,// 455ݾ}N8q"Dqㆭ-D511IJJXp!BH.KR:N'LPQQ1sѥH$"H:::^^^aaaeee "88;??Μ94mʔ)qqqbB@d[[[;;333777 )S$%%999#ZZZ 100HOO믯^J".\RPP@$CCCRiBBYddd``D"hӧOrZZZ]"(J]]m۶l ]vX7n#O:޽;a„/yyymmm555_~T*}믿NRѸR| 2iҤiӦA'pPӧOVTTPTOO;;iӦSхi{k֬a0G500xa{{'|2}t2 ܹ3 ƍ4$""˦Ǐwuu:qDUU_eeݻw Lfyyɓ/]qw[YYiggj*{{x77DU*Ujjw}oܸ@P233;fccw!WWח_~yڴiNw144 LJJB&&&jnnnccoo8p cqoP()))J_vuu]xl6B@ 3Ǜ?αcN>MPh4Zgg'B>[_S2z뭷BD"7|[oYXXŐO?Dh4ZSSNcbbd2dazORyyyիW/^ x!+WDEEaj:p/r<::zpp&&&/\.7110a²eT*bqyyOnllgb>'<6&XXXcǎKjkk[n>6#^>@"H$O>dԩ!C$BP(---''YfI$!Jmll]\\ߏU(yyy/Wꪬܾ}{dddbb+hѢj I&y<͛7^:00`eelٲ^x"33sʕ֭#B~駳fJHHܶm[eeeGGĉ-ZD&|~pp[oUVVh,Xz{o„ &M3g4@ 9sfbbX,pK>>>[n]|Mf̘QVV_j8p0m3g9r\pOR) nnnn```__L&#l6;##d#''x _f?ߏ;``455uww3 \rJ2ʔ)r{1$$$$$d޽J2$$dϞ=3gן?~qquttuttܤRkR@绸tuuuuuSujbXPZ*>>C(I?KF@1reee}}}---հ#!mm꼼ED!@}||>|3qD}}}'''[[[cc㶶6oo'B(R(mmmhnnneeL fϞ;ydooo$E \]]}gxTgIϤM2齇$E{>>l6ɉNCD"\lYooV___77xKR'''cccha0T*u||{W^ fϞhL&IJJR(6mz---D+@rppHKK[v-*((`24L&nnn$ihh(!!ifff&&&0,X`jjJ$Ν;<~PKs PM2([aOCCef'TK4Lw9C=~T*>腳GC>N ca?'y:9LX޼AGъCĢtT߱uP E ̬l*~1-(;F5So:*  zhB بš~t6m:Gv|ٱP̰?6u7+ B`x(ظuꉉ( GHsrrz{{ T(޽{͛GJ޿@ (**9rHUUL&-**:|0PwwwR:Uy}}GdhhH*r܌ Tʕ+2L.ggg(:66VSS$H P.//xf.?9hkjjFFFΝbFpw(:44%WΆ:olllh4%%%oFIIX,.---((@#juuuugg'B?JCT wuuUUUA-++C|P-R4?? EBJe)**hooFQqRDRRR9P3А=11188H$dYYY]]]EEENWW%%%(⎎xQBDP466WQT777Akkk꠭h4?eǡo #211!|~sssYY }Ą ɜohhD |@ ߿2=uT~~>W*R߇Շ4lH$Rt…Jt||:sff&YX~AT*U__ pZi||B|>%%%dgg{&&&@&(:>>s@;lxxwA><8}tyyy[[[CCÝ;w.]h[WWgQuA.\ H___yy9L< 35 顇zxWXXXeeisssvv- ---)Jpp0Hwrrvwwu떭-;w. *J.3LCCCgg˗kЉD"e{CBBJJJVZe``{ͨ(DBPBarr#(/C666+HrqVV־}n߾M"l2k֬b*:{lX|}6/.\fy<BzLV >Hf͛w{ښeggS(gϪTdgg} ûGnnAr}>PhllL&CBB.\<@Q+ jjji4訽}WWWtt4kK>BP(oRoebb")++R>>>/ɓ'IJJsss~ (*L&{g2ϟ۽{7Vﻻgdd\zU(^vBܸqcѢE߯dX555.]p8fffZlٍ7ZZZlll|~^^KKK AqѣT*FFFW\|rSSSmmIdd$rvvpႇѣG5Mnnmn߾]UUjg͚U^^nddRD\UU|˗_r㥤LLL R\\tK.9rp||رc 111IIIYYYUUU111nnnvvvL&?wwwh~~~l6%##cܹaaad29//oժUTUVݻƺݻʊdZ[[999988 -...((HII9~ez{{bcc8??311/GFFӫ<`0bccgϞWYYdooM'''##@kkšUV9::[8 NOO'c*jΜ9J޽{QQQ0'N|t:=%% x _JJJC`֬Yf׮]...n9d###_ >Jzqx>gHDE׬Yk׮cǎZpvM(nݺٳ/^DQTՎ;::j~a |O"ydJ9|+vW_}EPBKK'֬Ya"xix@ҲT*jmmEQ/ 㽽 {uss-[hڰw}4gj|>?**J(XYY^ ~ggm۶T[[[Z`eeo,Zݛ3gݻ]]]SUHl[iRzoNRE"QxxM\\4aaa" !!!007pssS۶m{嗻333ǭ&''cbbw J6 `2|>wA -,,"""j׆ lmmRpon:FT*}||cgglٲgyD"Ĥ)+|f555[pavvʕ+wvvΙ3W^jժz2qƗ^zN޽dvuuyyyĕdz Xz7/988̞=֭[ĤY.Z7400x}}}˹\{キi&lNTFFF_^&577ˮ988/88"Q?쳳f͂) lڴiӦMmmml6{vvv.d2|e˖XũP~~~AAAbzK.UVVj4~^zA>k4,,lӦM B,Ϟ=ӟGDDƢEv#J%a;v`X733{wl|󳳳kjjx<^ggg`` L?ؘ l4ڵk A~ᇾ> Gy׿;#H/" AAAuMMMZZ{[[$XN`Ʈ*))=L&61jqFkkyIR7pM= ]w .={vݺu*jZtpp mooq777X\XX@&RRRjjj`ϒ}}}ccc㬀=ϟpš5k 2WP d2[.zss3 Bmbbd2-\PR566577Y&??AUV988E9s۫WH$--- [jr l!/44СCo߾+VhUVܸq`t///LnݺyMNN(Vi4Z===MMM'YAAAUUT*UT- CFFƓep>sT B(Q(& / a,vٲe׮]nݪtvvD"_рӠP(¢:S"bYjZ~STT h4$r9Jj@tuu~KMMʕ+KKK\ /:uBXYYyxx|<oppP(jX,d*JVC2JZXXWUUbBTUUONNNLL8;;@[wwwWWW744TUUA$miiw%r喕d2䩫jL&;X 144P(/ill@###PswwihhP*&&& uuu===/bTTBz\Zh ǎCNmk֬tR?lsa!YP~( tzkk+r.S EVbGGGР}=<cccvvvP90\]]Dٳ !eA}LRYG&-\PPxyy1p8$$$J$OOO8XO@f:99YXXp88>:::66pLMMtZ^pyII L 433IMMݶmGbb"466fdd7xYVK$1???A;w LLLt]vvBxj?xb+++xۧP(QQQ ɩfZXXP(0@`iiLѬmxxmii)>>>P666ιsp8%%%QQQk֬r FFFZv…s󋈈pvvNOO/++۴ieeeKK9LBrrr  p87o 1P8{l^z ߲FGG#""qXSSK/Y[[9sv{<]z衇*‘#VK&BaPP`s> ()ԪRijkCb ećDKKKX = xDZ n ga _"h5t"tf5@ T*VtEZ-B={+Z-'u6V-@SpY.( -8^&F[ZRS7֚`!~zWb!$wT4 /Ph )`W>PEB:͔) 0/A$AdcgXѷC`>П ZV$ `ٕJojP(H$bNokk _<0 JَO "\LX,>A5 VF,Ry?Oǩ.dFYC=`H:NOwVKR?Q*BelL*P=C=WARG/JB8N8?8]Z0'(>:\/|66`b_uVe8+łWs1r,~AvcY`~[GS ڊV;OSs7σj,,J'<e s׳N <6=MnOS'>댎k,쿏hn*~3Sj:3? 3Ei)z衇zЎ{wwwMM DdppǧB$EDDIiiEZ-HRuYYټyF"h܊,3ӱG&ZZZTʡ YfYXXï8L\]]CCC,00 {"OLLDEE1 `4 設ussx %::ZPkZ##ȮFPm7{_1A7h؎tROd2 D"QBBy?>.fONN}9rA>HT~iiiP^xv||/d2T*UV/ҷn݊>tX,޿?;xdee%;vXYYJŕR b||X,.--xohh@p#d'&&H$MMMbx޽.]JR4--Eѡ! YYYBEѶf86%WTT|g3rlKVWVVVWWZ $$$ LNN@=c/6~-KHұ1A@s=11Q" TWWZTɀ|߂ZoooOOOH$455%%%MLL`'Gnhh8ydmm-299Y[[[]]hIIIQQ"! DhaVUUUTT9wiwwRݍ H[[[bbRBgddRDWWWqq1E}N>-Jxmmm"A:@|}}}jjXVmiiQT###r<(((??$GGG =<<.]{L8_wC=M6ڵF"$''wvv x=sAAAsߺu E~kQ\.Դ"ɠUXYYkXP(:`eeo߾](xYfmܸd<WT4ظEP^x_$H<r177733NP/ ͛7^}OOͮd2D"q˖-ׯ755ݺu/Hр^zG(VWW:u A͛'OTD"bP´gΜimmO322.]_TUU;w뫯rt:}3NWu󙙙EEEA>:GKT*TWW:tHTb * KK䄄A?^TT~!Ν 2_|rMM@ JΝkmm~z~~?pĉ/:u*??ѣJRR:tرc{x{{ \t ^/_\\\\PPpMLӓ/^L_}Ueeӧ</<_=zĉ* j5ź~zz: |MyyhBZ.//ǚCqOLLOrįX,J"ȑ#cccykk+MPK.z|NNαcǴZX,>~8ݱcGUUٳgnܸT*$%%… <obb… ِoUU5 ߞyX011<㮇z_oH{Q(+W['N X,~ݻdɒ3g~$ T*^Dh;v@(AQT.9r7X{cꫯ̙ͦ3۷o?|Ho͛cCCC w֬Y|M?ʕ+6666mjx)򸸸(gς. cj ,dnݲݰa(Sh4GG͛7TdKKK"rmll^}Յ ٽM1gΜ;wc޿=)@@}}￿m6 #S^;B[8,ɢvܩhۑPaX* 9 .$$dhh7lkylؼysHHHVV ’w}gLJJd2### <00/00T!HfN߸qK\\N700hoobl LJ\,Y$99~ӦMK,innf0Q@@D Xh)lR܃qW_}V{שTjeeeppƍ''+VI$ K.7 cc7n\]]{zz~ueeedJeoo⒑gϞ۷;88֭$ZJ%& URP? G=C=~o:(U>}XZhB(//766600ijjBdΜ9}}}CCC4-00+''gdd$ yB$Nq9yŋ/^ 흝2ld2A&IRj!!!Jg||2 cc?r tppEs8ŋ?~ݻ . MMM Hii)h#G̙3ڱH\WWcǎT\EE566޽{ ++Fd+WFFFB17UT<ۻ7 ®ż'aU;??_(zabb,cL&+**b*TUUD"+++dqJj[YYqjX`ǻp@eZ/VP(eeeǎc0$ݻyyyFFFFFF=Udddgg7ry]]]ssscc#eXT*yyyᐋL&ir/|ٱ1;;tR{{2@dr\*666677755 Tr\(644Ԑ葑/,%%%cccoXTUU ]xޞ@ |www__s577YҥKxb.{հK.=s111LLbG\\>CT*,_!A\]]޽{}A=<<=z|D$ BBaccrڌfϞhYYET*wwbݻwdff;wqR)ɘLxiiL&{(*HNokknmm277OMMx599iddODϚ5gѢE+,ƦC,͛7755577;ƅ]]]{aX---4-##Ewy`yGGhjj*JZ-jllܱc3 hzz֭[]\\*++]]]Ab8*k0lX5TT٦ P0qX 633Rccc666]]]nnnMMM...d2 آ(*d2(WUU;99qgyQEE LMMŋmll]w[O[^DOzr```0<=z衇z`uV<ljT@2~an[ğ ~oZuID~1 C_z衇z1>GB쯎?D=Ա-F<ڬs u:kvӹK2|坞C~Xɰc!xavV1:)[G Pv(LٌIWH+xN0~=LBUᰈ|X:Nh > #\/;|v Z0a5n!k2@CP P*!Sԇ Ռta+Xb/ (Dga9^3{z/сXR!f#?k_u k bdX.4NN7o>GgP<΄s2ªO܇quB)aS vP(^zv ?aD*ޞ)l6 ں² lT*MNN022266ή J%JLX,D6669 t:=##JRKJJ,,, ;::rrr@@ ̼ X  B{{{E333 iiiw50001N$_}E,WZennYTTŋŃuHD*8q",,lV b`C___BBL⢢"e``קhnܸQQQD"JjuZZ A)P}:teee%%%T*ɓNNN111'11QRY[[(ZPP >"bJJJ_$\\\0?.??%%%uuuח`0aEJKK9[$&&ݻZPP6 "`- 2333 ?pjjj***l6&dD"믿611Cq L&L( ΦR knW0t>>>pf9F,^0dffZ[[EY,FqrrBQ>??PT*Ujjt GGG2ߟbfffddP(@hE꒒`JNNGJJJJ,))vrr"mmm`Lzz͛7CBB@)zU~U!tTWW+K.eff#ST1))NdCCá?[[%Ivvӧ?{H$Rii7| DccH$裏 ?wh%(Z]]gϞo,kjj4_*H8  <66بhN>]TT߷oFR2l ;v,'' Duuu ~ 2!!D{{{ y<^rr2GQ);;+P4Ы:|Srl***0ݮ;;;GGG?2|3gh4|={ÃJϗ]]]BɪJe||8[/((@ڔ(r{455;<000pvv.+333)))? ȑ#}}}300;w'&&Ι3gxxEAh4|ٳeeeOLLJ111>v%?? .XD .p܌JP#>ϗH$?Y,֗_~|{{{:^^^^RR299 7߸য়~8j=*/^XVVpÇCEdRҒڊ oI]]] Ezzzvv6t+++ё5ЀT*-**=>}}}GzF\><<<22ߋDx޽{<oKJJ-sssGGG'&&ݻDݱ* ;h&''Lg}cQ"x< O^SSPEEENNP(LMMjMMMp@. Aalll``윘Ѕ|###_}7rssbcc?>00_ x}bH999UUU}kk_RKVGiooxbMMM}}s:;;9jݫP(;|ʕׯ?~ECi4X|I???CzcCqd;v䞞Q@ ֭[{. mmmTd2[[W_}uʕBPgb˰"8\aÆ;vX[[={(IDAT눥={6n(Jrݺup#.K*FUWWx<cǎm۶d8 Jbbg 6lضm𰙙*// ܸ֭qYz{{az~Gmmm4̙3?~ۧORV%ɗ_~)Ο?__psεͰ1zvrvv~u$'U\\\QQFVSRR|gy0==}n{{; qddwޑJNuȈ!wUT ֭[&&&2?loo?~@ ϟ?D"/>>Yjռy󠋂 [UUuqpI ;s\.?p<СC2Ns!rٺ}}}GU~mMM'|<]]]CBb"##B!TpĉGNNN&''߼yS"D￯|իW~C ŋ1}uvv~W 'OD1110SlPzju||Jz7, vaiȑ#󎹹9\ y}WjZ ?~Ϟ=ǎcǎ-Z(44)__߈ofpp.]rtt\~F;wg}ߏK^{{oƊ+4MGGJ?f7oM ֯_T*333MMMi4ZWW޽{wTT[oaH۷o;3|>쳰m#Oͷu7xÁCCC@ #… o~d*`̟?Nϛ7oժUBAŲP(WvwwONN&FFF۶m{LMM=<<:::`zu~~E{9??*OW^yeŊQQQUbŊEH$ pvv>D244Zn/lgg7h=ܹEQ>?:: tR^;uTww@@Ǯ^PՂH){gy@J$y<^``DFFƺulmmf͚5|//Аoo۷eee a #==^e2Ygg'jcJ.\^@Q555oܹ|M__@`d2YV/]ֶNzyy-\ʮRD"Xj,kbbb^^^WUU500oܸQ.]v lRj;v숏J0 /_ q>2H$655i4ooe˖1L ZۇR+`uϞ= >X|9Lt*j˖-###gϾ /i&IK.466޾}ƍ_x1000k֬˗{xx!SJFH$233)))VVV/5\6<<,B!2 C&r9L4 : `SD"(HRabW\g!3e~gPh4>>>sA@z_] oロ7oH$ZlT*RAΝ[TTߟr ŦMaDpjuEEEGGGOO{;ϝ;wttAVT3P(xlDjRI"jjjrss˙L@\.noo yDD%K=񚚚 )**R*J2--277 眭m@@3gJeDDW^R"""\Lfjj*J H$K,GȞ'''~;qV[UUYUU4h5kk봴|J󳳳Abb" qqqPv‡'NohhЬpܼlٲ8JR)R)%%%999d֬Ye2 ͙3GPl޼1%%%33"##ܹLyyyVWWp8___LbŊ =<< C"LNNVVVB3֬Ys厎ggQ:8222w\RzzzVWWqܙ"Jʕ+}ٝ;w|E&''y<^tttIIISS)J)))...l6&77K޻wsprrrʝ;w.\X]]mll`4E!6&''bZQkllzj__ׯ쨨(CCCsN 2<11Q,YFPܻwtܹ7nܸ}gTTTaaallFY~hrr2VVV.] ȸv\zuWWWjjjWWڵki4ڍ7rssoݺER׬Y300r׬Ycll|մٳg_tƆBfBUU 3Kz'SB!NN8=SWWK/YZZfggktttuu /088XPP`nno̾>???d2ɜU*ؙZ(8q1{{kkk338+bJqWWWPPPssD"ӱAAA-200(,,ݳgА]kk;̯_wa2eee򊙙YooCGGAAAJ}뭷t:ϟ={@訬\`ڵk%;::jږ={xxx<3...555RޞdYYY͛7.Y f*2RTZ]XXhmm-}||W0`;w.J...B-bF(*^x###CC˗'$$oٲՕ4@ 8& 1*֭sqqhnnp!ñ)rqqٱcLqvvV###AAAR׷'00w޼y===}}}g϶ p8666l6<96o=P0>>nhhm6R޽e˖͝;߿dIIIs8"&ieeyfWWQRh";;nhqAf͚bgge˖%K@Yl5fllhllb\nuu-[<===== ~aP9s8;;߻woʕt: ۶mGPPPhhhhhF)))Joqyyy__ߋ/bZ[[ׯ_oooO _}U!!NNN0`MLLͽl64yɠL+-ZP?Zә*7qx1[nDzeU*< \aȦM,-- $%% ̟??** n>oذ(0qtArȈ=ɿ_|fxo<1~ |agҥK׿ikkKLLRxceeAz衇O J+Z0˩:@  0EN2 ia)o ',cןD"AX,`#STb?kq22<! 왇]Q:xr87H$uN> eJG}:52#@CCC`vJ R×]Tb4t$#A t"ǟޫԩ mw ~0sl lC8m?bEOS =DeuW|7  u:Iy͛@g=r42ULSJ8N1Bt?AR:m),Np_X d,d+2 i}*0@uaWO8-t>T[0Q䧃nH$T*SN /,lF皟됟"?=C=+ twiܹ(vwwgeexKVZR4**955ull,::qGH$Ȱ {H$4kkk+((rχ}`aa1̆UV1̶y999544TVVzxx̞={||<##JXBR"b``rJ.[^^ƀ$Pmkk100CuBH1?n/y5x+''G&\iR H"Z[[|M,VuF W/Ʒ 䒖|հ?Ϡ5nɁHE\tdd$--m֬Yj:11`…(vvv\d珍YH$JҤ$kks"7::rJ]oo]d'{N#Sd8 `lܸ1++0** EQ''-XCc{8pb` ֬Y#Ν;<>;}4DTĀ`gg'x '&kkk:;; _h B+SRrrrJJJ |f%rT V622RYYYTTbX,|iP޽҂_)++r:T}vmmX,.//SZNJ} ~J:r8ͦ_t o'&&9z(Tlqqq^^^LLLwwcHŠ\;22zVAe2YRx(秦*J='O>}ֶ?߿/ ݻ(ܽ{t`r[n,qΝx8rM&ZZZ._ '|BW\_3顇z@qڵk7olnnN GFFٴiS@@111imm=s N{sLLLJNJh4/^?p@MMMllΞ=rY>Lg@to#8qD]]]CCv\USVϞ=[UUgϞWg666III555,`CgςCo>'Nؽ{7O?T"0{NRo|3{nFK&_|E__x.+lٲ4++koĖ-[@oʕ+sss׭[o755ۍ=zT޼yXPǏg?H15KLL|goݺjii`GGG2L/^, +** t:hp`0֮]}vkk͛7ٍmݺutt:mTTٳ (z&{nC"˱$,HOf >N1"űcl #$$ݻK,PTmmm4M@:JIIIZH ɋ-B'$$ 222<>>.4MoooffΝ;̙S\\<99 ګ6QPP $ls= ,8t s X%pnu=C=#?RѣGYfxUVDtsssSSjXO?jjj<=={zzRSSkjjA\\\JJJUU>AJU\\ގq?|~!((M b͛d2BJ|>L&-Y&''@߮p8R677#b\\\.]{NLL466&''C [ 233 ; }/_V*s=rڵk%IPPPWWWRR 3#xBJrrr288"kkkkV[RRrKJJt"6R&''322|~\\ oƴTAo߾sݹs$!Y TRL&G&-[, W,+JB}L& B[[[6}e@MݻW__RQQq-Zn:XS[[rJWFEE_rܼ5??D"q8/%''_xŅB;vL$A^nliiiddty'''F#j5Je2YYY .TT6mBιoooA&&&`ƍy{{w.L&H\~CqqqvvvCCϩSlll@hٲeEEE...\z544Ap8]xʕqL,顇z>"E"Bwvv555 `2/YaaDrvv^`Ass3ڶm[[[ڵKV755ٳAR)ɘL&kmmuttTTnnn/J(*H鱵555---uss#,L& ٳ ***={|CWWFQ*k֬{w jjjFFFvmbbemggd2+**LoAb9s,-- Bcc%KVX .A@|[[Ν;U*U{{]x<^QQז-[\]] 6665o33p*:44b L:~Z-ݫꊊ GGG\->~R(`0 |fϛ7ެ@>}```g(D" BRA>00;44ёbs8ZVFP`MĄᘛ[YYl GGG.;::{nGGG6 e=pʓF1Z 2w\ ^{dlذ-00iժU*N///S*smnn \pZ寿xyy9YiZccc[[ۥK͝;Ғfq\GGǹsFFFJ$. T 'O(T+D-^í` wwwS]]];wh:N BCC֬Y700`gg"MDz衇z<=j0]Xlbb]TPGmUOqG^B>k.XϦj/o>22kyƺ 2s=gll }UקqC=C* 1=SOOd.?WQ']p{o:Z'"hLſT*< 8Hb 77,>Juq?!t-h~3>nćlO[-+R=6F/|bB$rB`0BX,H$2,Lчp|mD׀UAtn29J%M,@X!@ (J 7VTӯt^ MX@'& ۧ:Al`0}|CqSTD%2tfX~?ao;بLJZ<2T:\ x 9Fos3)*#mll|mmmwQvvvYYY...d2Yddd:::D;w"vvv`O`x2uEQ:G,ō;::*SSSLLLC!!!޽{YYY"ɩ899H$3䘔TTTDZZZbccLEMMMBBD"p8111ͮ իUUU---NNN ehh(??ɉ@ @ ;.`0T*4Fs=_1~9|;O3A0V://'KEQ@r]6g7zJScd*9addƍ...('%%ZXX S^ "x`.gG܅LaG*'&&;?ʷP(2s\G[@`hhc\.(j̜kkk&ޮV]1$ gP(bcc{zz00FV{9ׯ XYY=nnn$ rm Ϗmkkŷn"#.722斒RSS9d---<֭[E `-66v½{X,!Vؼ>> "ĉ 8NM:MO$'''?>o<|vvvƚEP>|X,{zzS1emmm(Gykz#666 -<#1,Gl-a*nܹcj%)))%5<<|M`ccf(dgg;;;h;wZZZd۷oQRRF&[ZZ,--MLL ŝ;w\]]Q b͛|>ziEE+BvL{{{Q[[{i'''~z%/<]{{;ź{nrrؑ#G,,,DgϞFc<(,,5k>>GRuuu}7555PS/_.--522ȯ4lll^MP{zz@S̙3y?@p?n*((Eibbطo߉'ϿqFuu5)))CCCnCQ3&y!HW_MNN$%%BСCFFF{E믿NOOOOO/))DJ722e2١CM299gϞꫯ o߮C… D"ztwW^fcccՅ ڵkanL(Bzff&x?lN۷o 15k֬YT.{-,,{ hZ_b288ԴgJe```mmN"y晕+WdruujCCCr|ٲeB0//oժUVb2APS߰aaff1׿Y,Vggs9w\\\ŋ *WWW9r&''ãٳ Znii!ҙTF۶m? Ao }z{YYٍ7bbblllooŋ###p̙3+WTꫯ0w0))iŊJɓL&- o߾]єFDDرc֬YRnɒ% N[XXq8~޼y/Z [n\.M:-ֹ^}M6W<0 vu̙ 33v###1:: :;{9ud^^^s΍Js '2 ƚ5kQ511H$6mڲeE``y󪪪0%AbqV*..زeŜ9sUvuuz*rr|bb!**jddFYYYUVV(iӦxN<_|sIұ1"866h^|ň/zxxxyy999ڮZjҥPB;^ B[(.[u...5$$_>vXEE9Xji4Z^^l,I&{ eee}'O311_~e5͎;{VZf&y崴4PYY tT*=~8驩Q*h(d2ƍCCCA&<< R{{{5M[[A:FFF<oÆ vuD266h4%%%>mۘL&D1uXb%*ܹs/Mpp0ϧFFFBphhH,nGGPC733ۺuu^^B133;vmRhDx! ~pppؼy30Xo7 ]nKnn.I,/Yd͎k֬ rNNN˗/_d t0IPx{{^epppܹ7n+V >;9&&&2 })|#:]N;0y xtww ÂazEÔ8p~@ 277| .LMM-++w^II vuu]hQss0,*` EnnnSSSssYU}]zήD6lADT:>> ]"hڵVVVbxtt޽{366fXj}}=,㕕566rb`W}ҥ~iBBh}}}\\\\\ ]P<㽽XX_$x<+++*ںl2{{>8PjzЕJ$BAR333'&&h4Zmmmvv;HD"JE:44|rLtR__̴4KKK+++D"466~'OTTL&3,,L _xfKP(h4ZnnnffT*>O$###E"QPPPDDJ{.4(zСWzxxB8{{{{YY_|_Λ7<%%+""">>ʕ+ €8 411w]???djˋ@ 777{yy-[?a2MMM0+ikksww'׮]rrrxg͚wnذatt͛===W>ydRRҬYBCCaf՝[h"o޽{AAAsIOO?s挹ڵkoݺ500~zSSgee͟?7n8{,^pakk+ٳkkk'z8=P(lll$А/vK&&&t:̟?v]7o<99ponbb zT> g\\\_@Q"l6N}||d2266677P(666&&&>>>ٳhᘑV]boMӛx<ޮ]$ >F W^yJpsss2 p8_S(Y(VTTnܸյDGGUhh(ɜXv#V{xxh4xU( 9qttyJbD"pR(*i4˗YQJ={dscc#uֱl{{ޥKz{{h4488X ۇ(קj.\mۈD"EѥK{{{777FEED"E̙b=<<Ν`0|||#"",]dddSSH趶0=Pa`Z*$$wppf/_<--mڵ0lmm mmm]\\rb 599!!!###V^dIdd$D8;;[XX@jVVVpX[[qgyB\h4֭[Y,Cssk```mm[ZZ֬Y XaKM655lܸ 866}v+n۶fΙ3'22ǧ^R;;;{{{6mcccffdookcc6k, Dxb'''fa:D eڵvvv<NXCSFVVVFFF?>>rJJaii9{잞P;gAss薖YfCIHHH__X,޹s3lB#œ q`@PPвeT*UHHCKK]TTX,P(۷og0PQvuuu,}ݺuD"R(E8;;/[@(N{삃7l?:: ݌b _~`Kmllf͚`n/jooߵkqhhϒ%K Bxt/ݹsEhhhGGܹs Jn߾ťgFFFuuu@vw+z_ZSQlL&  'ptCz<8)ecccOxj#S'|qƹsYccXO𸏌<>Zʕ+IHHP(7ntU!Y`%G֭xDEhҥaaap{oooLL .o޼`01yܕJ$:#Goq@9iu 'Ǒ#G{9wM\.ɖ.]g*C=~STXjaD:|>۔K( 5(c 8-SPa; ^*"l$bŪ>&b!GY-}||Nގ]e`mղ< "W^z֭[vvv999n~Y;;;kk3gr__ߢ\䇂pBqq7lnnʲcT 80 ᴶ>}888H$'ONMMU؜zFYX,87186^ٺuk@@D$,]e޽d0 6L&& ) Jt<;d={ l o _c$D") HwHMMų<@Ӯ2ЪðIhX|Th: FFFh/;pF+,,555[RRbccۛi6`ٳƍK.D>w$);;ޞfB "eddNMM<>>KKK/]'MtA]]]^^^__'ﹹBLf啚e˖aBi2BaNNNuu5z  ÌFcuuuvv6$:y;dr@577dWŋB7o_b2.\aX,Q(o3?ϝ;y1[[[O:m6X78q`Rb ~ƍk׮aVXX_cBIII7o?@FVaA3 VVV޼y;PKKˑ#GpHuuJͅ'|hFcyy9LN볲`?͛"l6!,a` Rt…QSSs А=}7ovss۶m%KlӤJ x>C jժ+VXYY^redd¯^:44 WPxyyA B7nZ|2k1Lhpի/_nccߚ:LG\oFQ ,__!ok0l)ƍ,YB}`F>11钒R)xoBH&555tzCC=<<.]$_-[ YO>3D! ::rȥK|||( sss[nKOOٹspAA1 KIIihh8uڙ`pss{cao^iڌO?F޽{755h4*~HrI;;󟭭f0---wUWWJ$#GTWWOjjjurrrtt6m2Lt:ðuAP=֋Dj_T]n޼988xϷ l۶믿vuuęw=w;;;hnn>vX,.,,ttt|7`944Izzzϝ;d2׿겳[bEUUZ^d Ny&__j-++t===~!.O:O?N,æӧݛk׮nZo߾(Jwߥ677mE"g}p|~~~;w:::Ν;uu*rA.}͛7[[[oڴ &煅ahhR+`MCE/_|ddڵk]]]|>9Grz(2_q'ǎY`Ptt:u 2H$ڼ!iSSdxx8C׮][l_`2|Qu! 455{> شxΝSSS c߾}yFFP($H׿xpvlhh \zurrD"1;wDUTT ۷obb^'n0-ïkty{/!!rjjyѢE:B8;;d2//7|3!!!((6ͅV 1S! ׯ_4KA!vGFF:::###W^L"6nܸaT 4Ν;K. W_y&dvo~CA+PL-Zl6ONN{&)$$dʕ~~~mc###׭[qƱ1ljjڸq/~ >o4!uT*Tmmm\.7&&dh_ D"с6oތPiidx˖-sss۽{\.~w.XGg?B{*;vH$Zd" E8n{xxAF'!}]SNl6;88W۸qc}}}nnׯ_|^Ꚕ2::Jӹ\T*3gdJHHظqH$jhhXj՛o G}4 ?~TjIIIKKBHl]k6mݰaTVV ǫ7Zd1ЩSB$ƍ,7MMMx_~eff+ qF]]ׯ_O&'''jxQQQQQT*}׼FFF ՙ3gN< di4Blll7:>:: Z`J"D"/  '&&̙#HFFF֯_gϞŋ#]"^?]v_^$yxxgggS HҨI>p8>> cܾ}i὾YYY׮].˛:uB(==]R=%z=Juqq̜?ݻwsrraEJ$8؜ILL\regg'8(r< |``ٹW_=uW(ŋ555$!ܫg#j5aZ(SNegg+ )ryjjήbpppʕJW^imm}BXfft:B(++kʕЪ$iNNNnnn[NfxK.]b(5:P(555eee6mZ`QU(RT&I$0+ƿi&2|̙/0P nnnf9//o---VVVYYYaaaz~>Mj**&&=qF*))!0?EDbRy֭ liiiii4$ w8UTB*xXPrAAA>nnn \|yCC;#KHHoPRRzN">z{{ f0 STd29D"777Ψ(:!xHHP(𰳳 ]p!0?dX4B˗T*DG1nJ;88%%%EEE&$$988 {'::ztt4114BZ>jP{T  wwŋ|>ؑ2lƍqY`pSwqG5!966pBx<^P(,qkMf0̞Bxyyyyyyxx;;;مDUVh4Pp򶶶kΙ3y… vvv:dnذa``d;::|OOO5aL&龾<BgOOO@B1J[oyzz:::FEET*ggŋ^{M*yP&IR|>$OHH x sVkkwyF nnnǪ)))ibbwƍAAA|>?(((&&fҥ s!. iђ^}U`Μ9aaaQQQvvv %"""<<<<<<""D"xUV_!0$L&ݎIII uCCCs 谵<eΜ9m͚5|>_Tzyy twww[[[._lĄl󳵵ezB@Ez-[nuvvYfvP<#+:~8ufT\|ܝϜB[Mǚk6B}}ǟի0Ʉ 4ƞBA>pbի}766|h[>?)4<' fg̩3wT `2ef4-eSgh3j\.z~TB;-Ӏ[2 76Rxˌ ,ݷjt H$Æ5\l4A?oC˂3M[D[&KQxs}CPFז>Y)8`٠qǻ z d3x>/g FҖ gteA/-,vOLRIR&N x_ψO>n{?34͓?#Y@(VP(\Ձg3xZuxA ^)0y H=>;e{ T*,3XJRϾn-MH@U*e÷sXPdY;He"'֗cTlj TLJtj'0?kg$fFAg!x%(RT/l6 |>2'<h[N+! xv ɇo? בř9g 3b=({Po_Y;^6  r- r``DW35b zR}qcזpRXn3C3 Kwo"zdr-uM%oY,lxPۢ f NKU^/m{GC>HUsQ(Zٹ&++kbb" ðƓ'O OOOȅ@Ǐ;l6 ####@Rf% u 21L'N F{u[[[GGGR`D"edd@'NܸqC&ߺu&Mn 333Y,χӖgϞ!988466fdd9::b688xʕ H2 ɰexTWWb@fL'RWl,]errr*++###> p mmmgΜ3gPMMݻwAcJwG F;\Njd2'xiq|rr2DrssCaX>D"l t<]e^ѤhZeD" Ecc#!wθsAAANNN(++lM%%%8 ^Bf]e("##oܸqő]v)W:588:::Ξ={…/|ϟvͧΟ?'}&^sαlFsB͛7]iiiII [nꚜJLL 7 2lܹRǎ߲exrrrbb!Α#Gk8sY\\[n۶-88믿Dԝ;w*Jd=<<|ر[nutttuu!jjjFGGo߾}ᱱoH$G)++0.;;;779}9ɀg޺ud2 NR gϞUUUΝkiiĴuuuGee%B(%%ell ;wNBcMLL`vΝQV[__aXggBܹsϟvuu¨G};v,--ͽxX,0 ,ϟEe8. !gSSАe󎏏9r/KAA`xbff`D/_V* B.r8055{ȑիW;99iZWWW;;yT !]bERR$zXkkk]]Bh3S]]=55(*++CBBlg^^Owp8֭}<~|pʕ+X,mذ#7n DK,w3666WPQQAP֭[7|@Cᣢ KllT*DQoBhjjNojjrww饗ڠ+VMgR;z(B(==ʕ+'N b2...h4~W|>ɓ{Jvb٩Νstt.h cڵ...Ol߾]VOLL( ~_rE,ۛL&0DoŲ0׿%HT/[:88xzzJPPaFٳ%%%W^ڱcGUUUNNjFݼydhONN߿!綅B;|}}۶o?ytt̙3J2%%9sF9x B&'vrww?p@}}]X,-xAAAd))))))q8>ysASuH$Rjjjhh/ wD"MLL$''oڴYڵk||N5Bð-[!!!Z]]"##[[[ .+vh4%%%===nmmh4,M&ƒfsEE,{˗X,־}|}}ŋ999%$$hZXT^^^j|||HHkaXII d |5OƆ;򊕕^bccmmmu:ݒ%KV^aZ~[_}UBGA5k,\5k֬^Z,r[VVtR^ SYYd_"0oooLhѢa>ٲ_+V`/?aZސvD"7|sΜ9ɩᥗ^z7jʕ+]]]l3m۶qFy߿ɒ%{AR(QbŝA|/`O8u /&''|~yyyyyիW!t!NPt:$E=qđ#G W9Pk4W>?s挝]OOB(//\*_L&Tႂ۷ow}7((H,dHqpppvv~w[[[Z\./++h4ZV" LfHHHRRommm-H kiddĄ\.R()))SSS/~H$x O˒H!\yM^?7pJGGSNQ(ŋ9sbd0F`?~kk[d2ݸqڵkO초iɓW\QBz궶[jZR8qqg#0rJ\.J111 !777111''ٳ\ l6B;w%K (o߾jF#N_jJIIICBB dsvvv|>̙3 mgҥK?ӘBj*:~|&W[[xٔ9s怵9t:NG">Z<99YSSs+WfԡC éJR9;;h9sd2)}]++(bŊkcP(~߱XQ)BzBCR===]0LRd&I#""R ,y{{;99ꠠQgggpB& o~C9N@@T*L/6jwN ^x1-'&&Ν;.""B,;<. 'HZNNN}<OPZ3""b͚5@P-ZhxxL&{{{x<㽼|Z~\\\f7lh48OtŊJAAAnnngҥF ((aFtgXaaaCCCL&w>>>svvv!!!0} 뽽Ɩ,Ya@񬭭CBB\.􌊊ͳ%B&afps\\\tt4M߼y&&&D"L6lfmmmCBBBl6;88xjjϏd u֙橩)&Xޯ|<:3s\.|F>ΏgN}ˡSSS;57|'2 Bww٪q1}RɓFѬ\2**߽{c(P(trr"| ~d Css3<,s*Bh4h7Ʀ$x /&HjZժjABh4 EVt:)б +<8gi>lB0!~O0 L&V \.Gb -CE,STO/@okt:R Z)>_!-MhzjX)|`@C ܪov%/^ 1-} ^{54=˕/\N&mmm7mDPr̩0 ѼxM9.~oM@oO@@@@@{̩(J^?ߠp x8Ͼꂧ[>3 2041z;\>g-ea?kxd^WT 8!J@@@@@{;,%YHe@RX~2 <%}YKef)_Vutt$2?2abbWpDRC5/փb'K%+Ae p~3.qgPXJ8@o}?<!q\ \vt|U*hǽe_ T4yO_Px7AT. iׁX)Gk nEoۢo ݊MgF9|Β|$ #!UFPhZgg犊̱1H^S[[뽼rrrnݺLӇ:j2NdBdvǏGGG ܽ{7""<#T*JxCh=gggGGG| W_r8Ĭw&HpfxJq@wi٤xsH$\~]hh"ˡ;7n8{JmooOKK+--urrKOO/**wppŁM@@@@@2?*s2,))(''ghhhϞ=aaannn!' ByTT`vvŋnȑ{o+9Dt/_Fpd2… lll(ʅ B*doٲE*חw#/\dɒX-[VYY -uرȭ[8p_NMMÇ'''ONN" l߯Rvcǎ1СC߯R@jj[[[0  7n8pzM'IDATo>55566v;w`VYYyܹbvƍg73L,O P(233_aXDzlQ__ۋbԩSﯪ0v޽0 nݺgϞpڵL8fpCa)Zmuu5aRd2ZӧMmoo߷o_SSh|2anD~~~ _xQԁjݻwyqǽO?tgϞMKKccc@.OMMbX 5͒%KN8\UU500a^i4HD@@@@@f.[,..L&^zU$566B$hѢ@h FGG'&&n߾xwwwHnՐx{^sh4Xi~WL&B~͚5,L&{zz.Xf$===o o߾MP^~娨(VBQQQ"֭[qqqr\ӅJ$溺:___R---^^^-rqqioo/--3gA/R׃}uZZB(33͛l67ouҔ^___gCUVV^|˫d' 3؍;;;ê۷omBa6?ׯD"022k.D;;vt:}֭ȑ#۷owvv~+WΝKR'&&ٳ7o޴߾}{YY˗ZBo߮`24-99Y. dDv}~PBa{{@(#`0:t!t]v|w<-22СCBd2߿;###>>رciii/_6 k֬L&h4uww3 s@+fpwtsD?/^Bawuu <=={zzjjjFFF5u:GM_$i111/܁N߼y3dz…}PCCCqq1F۹s-[.]_}|BIIIw߯P(H$ݻe2YAAAGGꪪZ-,CݫhJKKD:{lLL ޽{~^z)??pp166V655L&nݺu֑䊊 l6GFF,ϓX !;++`"СC...w)//t``Xb"B!J%2 "H&a?vRrss޽[QQ>?(_׳gR(N竪֮]jmmUT~aLLJbX"ȑ#stttuu}뭷ڦRiIIIMM ˕J @l2hѢ?Aڝ7|sp 66V$''de˖wh4xȋ|>`0,X7n$R)==L&XB$A&4SSS .liivZSSGt\q{=//+Vmii0eϱcw6V*r<(((..nrr2<.f$VVVNNNVVVc``@q\Zzqpb===... cbb&66J&͟?ή3>>^r\?xyy577wvv `q8Dhoo#JmmmKKKbqTT >bGGGE"Q@@@ggN[l(_wSta4j5zDӒqtTx~x4}FpYH$ZhT*R'ZP(T*O%e{@zdtY ,2^ qr˟-L à&IRAM>P(2vрPG˚>!c6Z\.qJfhZ7Mxjގ[vr-׻eo>rd2啖uCVZ\Nf [[9~BK,?wh:~f NwZgD"iZV]9 ס > He~{;f2 yt ,R)?yu:2Fǔ/Vp\B*C@@@@@#.؟B&*/.K{ăb'K{ǤAU}/,xy\cK,EVy-4pD޹ >PMnF>>35 M1nP6$lhbpAP-hKK3  cll"NHzp5 0kjj;< fH$Rigg?߀ ܻ"""\T*m۶b ___#HN8Im>uֵ uuu &%%ddd7پ} L^VTT+70LRH$&gjj*&&͛ׯd$44oYlΦ]v믿7oo?pJRtؾ}G}gϞ {{.##c6667o>_{g۶mp믿`0$>}Fwrr*..6ͥׯ_wuu/ OII۷H$ɓ'8˗ۗ,Y٦[gnܸVbOZ$ə3gH$}t:ӧWZĖ,)J ܹC"d2ٱcnjFFovwwh'&&.]thpΝk4i4ڙ3gjjjBuFFFgggXXÇ9JќRѣG*++KKKkkka2aL&?Oӟt~VZZgoopxzzzzzBrjkk̙ZPPPQQWXXyfooo//K.vttVUUݺu+===((#BSI$H$h4ն c۶meeeȑ#L&tddDR  Lq, gFNhѢ}ڵaczyyy!!!aaa.\or@  "Gks\Њ+@zaooK/9::tWWyA:::bo[X ξ|2BYre@@)CCC/^LHHV lܸD" ORmmm񮮮EEEK.Od~ǖ-[BJĉ삂sr8ooxЦMAvvvQQѣGi4ZggѣGn߾ +ڙN/[ N=pa2T*f珍A'r'{ KMNNL&sǎޅ 8 W9sF" 3g 0Le6_~^6ؘp顡;vݺukdd.%%֋h  111vvv۶mS*vvv111AAA!!!P+W\~}ѢE\.wΝpJ~~~}{HHܹs;::|z300P|T*YYYwٳgOIIIyyݻw""" W_}% pDDѣG'''G$ hce O_$H{IHHs|塡!Deee/@ hkk+//\~}yyy-[w^pf</ʣaXrrrbbe4 944W_Azܜq޽}}}T*u۶m[n~ Bh˖-@]AA+RQQo!鑑vvv۷ox׮]{ծ.Ff0)ի###WZEPjjj"""ΝIFA47.ׯ_lR*IIIG$>.`IIInnn dYYYY[YYtDѬ@b` AIx<^KKK\\DzNft:RtŊMMM .JϮS~dL&Jݼy|Ō ww PqqFDSSSQQQ\. "wDGG;88[nÆ FqѢEqqqBX*JemmkootΝ%K0@|É'ry{{kvС%KX,n4rڵk(JDDDTTGO1E$ 11F`0 p !?9''h4vww߻w@ puu/--===###T,wuut/ E{RybFG}'.\tXa\SSR_~ڵ[`hp8o|믿144$H*++{zz ԣP(F122rw/_~||`ؾ}Z^|a>lrpph4.XСCjlV*mmm...ǎ#HWJUmd---b:d2]pznMI ?rȥK4 a"hɒ%CCC}}}J255i nEQQQz~޽%%%O﷜~xyy;wҥKJݽhpp|0u:hd0lmmaکT*U*Ν; .]*JFN9Yj.99D"\p !>`F444tmh_~Ν;GNJJJNN޹sgLL Jh4AP|t:PH/bΝMMM !ooo@Plv___bbbEEExxD"t...F lݺ֭[JVanQGBөjRT* \.W(?BS$D" 7ouEE(ah4ZAAmll,Bzjjji4XWTE&֚f6T &&&`JP__/J!DO755T*ټhѢ^,<<<B P(!>>`Bs,XݡgX555ͳa. noo?>>^WWk?dX,6L\.7**ٹСCŕ4,,fPXXP(z=陘ptttssR`f2BhDxܻbꬬL\.wqqtG$yxxtvvY0lllbAGӧ܂!ЃZ8hAN&{{{U*MMx r82\\\HLj BGT*UiiiTTT*A(|>BikkH$Խ푑NNN&)>>~||F zzz8H$hv@P[[Ka166f0z{{'&&H$),,EEE6660@~% x pJpddnnOOǃ3qwvv~,}jj qGaP(l;3BJݟ}˗/766H$>-B& wV;22tZqss2)>я҉?!lt::No߾T*b>p*vf~툈`4.x8B<Ѭ/Vi񔱏Xt Q ׶hby{uuիW?SpSAf3wD.#<XO<2<'|hzA+3WI$Bh4+WjzlhJ>;\hL @`ظq#h40C&TeifX,e76V+i4LJ!g 8Hqv^/p_G0J$BI{Ag~af,C{Cnpl ~bG|R}Fw|U_IENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-zoom-in-3.png000066400000000000000000006466021477354127100271720ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME )tIDATxw|\y{cA/$:6QDbI$VHnNMY:_$q8vl9HdI(Pb$@$۠ f0{?3 h&%3s{+m*Q( BP( ]eY aY֕FP( BP(w5irb a ĕfR^zA BP( BP(޻I,Ew^tt$dRt]2+ BP( B1 )-LDWg oI!Ĝ@}uC Eḓ !n,4MFVP(MӑBJ4m<ۙQBi: 1Mk,\qgĬ㝽@Jk3m?[:iH XVҝe߉ BPX4Mt]qeIUॄA #c:iiñ,h4D4jH6>~O%vɝAp˲ BiZ46֓ᠹ2|> 7A'Q!N\2<<̑#G x^^Ν;i,_h4Jmm-7t3˲Ɣx )夁]]՝ᦛnp DJ.;Xzx<^rLq: GKcɒ%$~)ONN6Auu5VU B*r\AU !Bcߑ0 re%:uuuDQN$Cl6vӴ:v­M R0k+9686`/+ jEG7}477… q]tuu]גs8AOO~"zzzw~SRSS ?~H$Bzz:nP(?󿐗Ojj* 000Hgg'."0CCCYv-deeeYzzy'usy())| _`~x,˼٬P( $O0F ]OV'%~B!j|oKIB088(0pÁimɃ n-[J}}$6˲Gh65C"ft+ B1;%'lp=Ogg?pܸ\.ya/r-l۶'nSRR~cn7))>|ώEQZZZXh~;eeeÿOhiȎx"Op7fܹslp.\瞧˗رdgPZZҥK8|{Or[BP(W% #ďiXۍngB.\8OVV)ٶ  XjjjhoԩS~455ՕTL-Kݻw}~X >o}BA,bddCsuסi_4Ν# //deebH!|> Y[ow://9paPVV?&^{5V$\{z4MpZ[[7 Lbxxp8 }k/}b"t:6wBP\uHi&ow?r0WߟD'\.b14M1ɭ0hoosGV'^.Gq=hNoo/Y1::x(..fҥdggf-Zb5p,ZTNE"JJJ.[!$//7N__lpEEŸ\.)..r%YYYv{Xn&<(W6իq8r ,(7tׯgٲen.]ƍYf5EE\nضm;wyeee:P(4fi"y4-1><<Ǔ2yiX6p8'\a"X$A5g[JIOOiz ѴŴd iJΌ B,*]vP( ͖f%W}iheL~M:a&M͸?Rb0 ]ד'Iȣia f%q~>?/F5t݆eIM;1SfY[d:###44cŊ躦v) IJ,D"3Jqkܲ$Xtov}N k-!o<<|Iܮ)Wv B=0qjPW, BP̄~.^]l%ޑ~>Y)+ BP( jEJI?;SDҺ BP( B!+t[6BP( BP(.J [a}荝ޑpq;wzn7W M~''O9P( BP(~ۏ37 $\./K9, 0R:mmmdemxf)rH,t BNs\VxRJbX=˲.y;_$2Mw9wxN8ASSeeelݺfz{{yOVV֜ʧj^|EV\܆k.Ҹ{زe ٬_ozRSSYd v}I˅tz9q@~Ot:,H$%W5Mo~Cww%O-vB!v"iRZZ>ٺu[Evv6G?J^^hH$B(䄈ftb j\P( BP(̨\. %%%Kjj*iiidddpcY]]]9[)%,\lv;8N222$77_|UVpBڒ+,X@zz:x|tM={gyk2b7oNWrͩ&gdd`&\s @{EqmzOJjj*V"33~Μ9idgg]Y`yyyRPP@ii)wu]]]BFFv0ؼy3oV+ BP( B.F LJ 0 \.X,jf#Fz89D"hnO~lb1XP(. vq:yI2Otup F|>4Mcdd$y[8&%%}Ya$VGGGIKKKzi$ß )%p8pӉa0 X,ƣ>C=D~~>碣P( BP(wt>_vc~O?Un.K:JoLi0]3% q1VZU BP( ]Sݻč 3k BP( Bxwc WZBP( BP(౥\i BP( BG{^( BP( Bx(]P( BP(+ BP( BqtBP( BP(lWZPffծP( BP(.WDf:WZ BP( BPSB$Wr-˚9L_KHII )e2|)4M$_Ty5MòIqJc6&i$-ᚦ̐-ÚlL ~&O g6733M&&O9㻗ٹ"?CZޛMWXߝ!?51>{KBP( BB׿w= x<躞T65MqE4 Fq8~- ݲ,4 Oww76FGG@uRRR0 zv~?x^cx^(~..~?n˅N? Ӄr7)<4ioo'i0 |>_2'1ŦQ\!48aJ*S9b# a@gF_B!A[F4*x$~CC劻imՈF!%w{zFb#DmnCƂxhBCt#H$6->wh H$iOD@`;z"dvg G:`O>Ĵ wY"C;6M8tFAAy⽉L:]Аn],~&"ZGhBC" ԝɉ37@4@H;#B#=Nͅ]cXm6x잙\P( Bx2cQUUE]]CCCTTTM8 q:AFFFpݼ曜ac*UUUTUUvG}j0eee?VYr%[lߓWѣ9rly'to ())Q1MX,ic# :;5Lz{5vIwȈ:. !⊧99P\::4nSSS[bů~#GldeI>뤫K#%EO=堡A',\(y6Q^n*;lyCinA:6JUOu:k߇#?%Ɛ%i% e8yp?K3`FbtہZĶs'"Bzt5)i:6)*J:;5OH&u:%_锄ÂM\w\AtGFO8(0 Rӟ:qd2!A0(p8Er wSbeEn"f݃PC! ѓ @xvݎDCCm{9yqܸmnzVdW8q@4@QZn 3? BP( {9_O Mhll4M.HMM˲4UVAcc#WN(~;n@ @AA+Wet} )%@OOV,Y˗S]]͋/?Aϟܹscib 33L>w. okw:x+_=ez P]]׾5vΝ;x<]7,YMHMM }렲L|O~2B_Ə~$+p7`pNА"#CrNMƍYY}-O;),0vw೫>iĬ[ws}iĬxI))lY:E4`3πa:EK"E?|k"bi q=gub1Gb45ŕo68vL3L:?\18(Ϸ8piJJ,]]=#kZ<_m6زΝwx/lCr-?uLwipgfw5&~` +L}?%-Mb&`,/OOǻ3Ʈ jFNzC9I'eYhhawn욝 W7 72{%0֢[f*랦y@ev%6J@;.`}z|NNݙ\W( BP(̩F"vwy'

o=Yg@@1W?/D7H졇!Y&Dv./|!BN䭷l:яx(钴xz;f_m+{_E, +KDRpM񉔺:mDŋ-7#2.#:kdeYORr=j*YnEEE9s*\.dffRXXaDyep]1JJL^z@a>;mm992  [uV2hlXԤ$̉ 7mQJJ,ΝʒddXÂ". V IG5"{G:pnMM:Sw`Ń?eY22]yzCxrR8) r!~P<ܶ6Do/foo##hMM[ݦ9KbqE}hH)ۡ] n~~<̗kyCWvJ,xNgt|$HAA\)̔`'ḵd^/!)+3Fa6;6&4qm 13ƒ%Isq›f\zB=Ihm#m!kvRl)4#P[CMo ggw繥zΡi{ id3HBP( Bb3BFFF(**"==]Ø~dffxXp!N]YbgΜAu֯_Occ#cY`ԠiZ3P-[`Y.\viiijjjD" RZZݻiiia``+Wrwsג]wEgg'|0 ݋N9u:u]v~x"On[-GdJJJhll}Cn6oӧYj՜g 9bEg*s[o5u:%7HI+oWH::4!%tui,_nIrIdz{1XddDpk1ٸ}lY|DPJ P!:G:)L-Į)J+"Õ%-.}Yuyi8 /R"SR@lN!v+))X99HaȬ,3gJKA&/4Vq%}3˓9bMcPHBNdŊvdεײ=sVux׶PQ?݁lC繭6m/)V|́BP( BTsi J3)LmIL4 !D"-Z4n+2Wh4HnzZM}S$Tsi a3pKӄܚ.Q9ٔĿOt;Iֱf45Q"?{gSnM5833UL|~S:rIALdl`rƬf7Vg'Dxڄޝ1 kI* BP(u$n@;}l}v=yD.4rE1?sunfPm,[!n}K*26RѧN$CֺBP( Bne߻0Bķ.+2~Ӷ';mSm[%G%BP( xRbƕC,ZmQ) BP( {P( BP( tBP( BP(P( BP( UR BP( B w~R։[ @ӴqW1ٖe]92~eW}u{q+yP( aV]JI   ŕa@X,HMMn3<^/YYYo[V!:o[NH$ pFGGD"hdeeM mRۋfn_ҽil91˄+8$/Cɵ `;S߭!uH$2/a022BNNH q\WL+0E922Bzz:>^&&,R BP($jpHÁ}GPv.>^Aoo/`|<;g$ p\RNbELtKLˌoyZ|˹Ѕ>gx1WBLiFihEzvZۙr$4 / %B4s4B\ De% 55ZAR722[iBLӜ<5MsRldO̓b1l6[B%P( ɜ[ܥ&X6|W ,B1)HʙNw8%Q'gYVrliTg';'KqD X~k=N:C1ΙO&%K455d<O&--b7jƑ#GHII2Y~&*v{ww7l6Xpab28|xx"\-ȑ#tvvƺu@JI8fB!|>V"33 n,_dÆ AYY# ?V+ BP(f孉 LǞ={hkkϤ_p8oA(z3'1軔K8fϞ=455FK)0vwg4_y啤yYҔ󱲏ɭyşëyH඼(q`6.e}zEd9p`yrM[ro]]Yk2!בeZXE=?[g_x\17Jbɍ.y^ANjkkO܌ng˖- ^r4}TȲ,{9Օ\Mb+NSS/Rl yf^/<ٵkUUUAOO---'?atwwsAvI?iؚP( BfCsSc``\gu?U靍ٶmHe˖dɒN\ʼ2u6{AyuR6lؐ\}-3>1 4;vz)//';;::GJɒ%K&3)`ibYVrYRW-I9?|]h)8pyaub"ý % E>tE}7bKZ\΃;w9ډ&p/8TRRBKK P_򎀞n64Mr8{l2pzz:ٓnavۊr \.RRRfB6lEp\sl+qz⬽i3! 3334q8zcY!HOOQMӒ['Kҧr%ΥkBc_> d0͏c0/'|{rX`?8dggpyob :;;DZlx^}YnJOO͛կ~EMM eeeOuV9ٺu+/]]],^]שg?㏳uV>ҥKygٶmS( b*Ó%KP]]͏~#SWWSO=IMM%--{g}'G㏳vZ~'px<|Io-B4,W_eӦMKH)旿%;vrayٱc7ofժUOq1(++6222G>5\/i]]`tt[D"nvV\nftww'ehii{w,***WŠ+HII{S[[K]]CCCڵ&`UVt:zvm1oW: Bqc۹>ikkcѢE&ì,~a*++yW4322(}}}޽&0Xŝwɲep:u]yl6tuu\uطoTVV&28:;;)--%%%Kww7>Gww7+Wdʕ AOOO>$W_J$BP(%\ |'WsrrϧUV: .$###ݻVXeY,\ z-~_'iooO`!Çl6'## x";v`'vΞ=ߎ,X@ffNjBP\ŸޖKVV>~Gvv6---TVVt:)**$o۶5kְpB,ˢv/LŤO!W ,YB,#x#33yΝ;Gqq1K,!++M6m۶zMӸ{xGHOOtF{9>R^^}_ .O~bٳ::āHKKs< savͧ?i|>piRPP%FFFhmmtrΝ;륯>\. /~n%%%|%??s]U( Żcǎm6>O&8׿p}(^\hO;|0#;;|QѣG?MJJ DQ6lj*`ٲex|G0XbRJѣGԧ>ɬP()%d߾}|ӟ&--m3`0O?9~8Gȑ#/}￟ӧOٵkNⓟ$nP(Tǚ5kpx^F餿6nH(̙3|`ݺuTUUl2/qwp btRnIg⊜A7M}{D0 ~_Q[[Kzz:+^!JKK9|0TTTp-tR~?6l4M{99ʕ+)..6RJ:t˲뮻Xx1~o!< q5װyfoߎ{!??-[]wEqq1O=C0d޽B!I2 BPLoh4 ,^xf,Xy| tRv-[,^[n [ BJuBP\'" ''0VUl6X"77(Bd}iaJaiaHaRRRHOOGA t&m200#%%###x<t]gddÁ0 z{{1 !.iU( b"aLrssD" i &+̤/هaْSJJ hߏn'++ ˲4M4M#//P(Ne]݃᤾:::2&t?AVVP\.ٴb&#ys{ qdffN2vEtBP( BP(tuu ;RJD"teTP( BP(W'~fC) BP( BP\(]P( BP(+ BP( BqtBP( BP(P( BP( UR BP( B ]i梣|;twwij.AP(w ]1MJP( { ˲x>[U+/2䓟䜶 BP!~{/~dee>VP(wMhii.sBV#K._EP( .\`ӦM|3JP( {SNcǎz[W( BP( *V=WZ BP(SNFF_iQ BxOaڻ~|>W:n DͽҢ( B0 fO) B" !-- ӉiXeYH)nffWu BPl^i1 Bxp8V{UoqW( BP( + BP( BqtBP( BP(P( BP( UR BP( B P BP( BP(WJAW( BP( *@) BP( BP\(]P( BP(+ BP( BqtBP( BP("`tt˅Ҳ%i(YG My"c39xA bikңnMn!fEkQg5%|xqsXNrkܲWoQjì “pg`9"r܎mBL >pB0";rNokZI>h'L;%f Nl3H \)s"P XѲ͝q?(ʛt֭8KA%71# 7ysH*ddߌz$߀ b6@,M.$9/9!)y&C([(ٓɜ.KYx$ϟwa̜vRbut2d D6&ǥ!)tz>8<ȳ~;EFiR`ATDᣃ^b,2rhhEyD [ s@ZPOIce!٘ [6•>w:NFNō}O5iZŬ5ZVZ~8e{DOnUCލG gѪGvٴ[-W>@ZN앧"@<`Oe˒X;b:!R&=F\I͈]9!&%#Wt3Pwg3%V14_ᔒ-;{6rt#N/Q2EZM<١^SjqJ47+VC9jd=G#ޛÉH?CDٻ<0ڥcO:7|`!ps#QJ$z堍."M7qKp}і>D慳Q&MG*bȧktnnϡ7FOn8ElY#uMZG:é\U-o5es!xZ.DYX9z07og8x4yg8]Ms8qv^xg 8y$ ,7T4vtw&+41ܼCQvEMkpΉsNzD.pE[LθӚ9/Eø:FW( q"8X'TW}#1FI?X~MZvz\0M؎72|<խm;YʱfN1^rV;kI]}/ޚlYC]=lK#X砰X ƪrU*sYlͽ g)4NF"CGV1袉vqv1YGY[ @Qoot{cR >`6JnI6wtlI3h1^6Dz1~,'db qelA2EI2D*.na݃ټ;>>2[9zbu-`1$EάbBI^alG D6NVw-!b9zZQ&Ed~LP k1`ыhYK0/›;mnVaAԡec68x;=963qz`^],L%JkZU@O^Bh@0F_/; q+Zb7j,=j~o-y4 9Ӥńfy<=Ep'.2fѻ[}hNmz>22f!L~"iNӻm *N֓om7=Kd_|Ile/F-D[>N} |#0Z̟>VRSò g/߸l6aPqN,*y(rnSCgXz%w G0i5K6|62ڿK[`$I _7|l r7U?-Vqg[ .=䆼TNy 0[QB #n\#Nz;3l+JNLl܇X9>xn釯=oY (Y>KI_EyC5b)N&Wz<A~rW~oHHsUN4n:FV}6!y^![m3wߞGn9+aAG,z-l`?~Y:ñoϮڴ9}~nu |qe[mW|EEg& #v'خ,x=5NWVvSÄjуv_INVahKz7Nn[i9%'xmezmR48wd_mv:Sr K(6JbGe/#q,؄uO􅹓a[X}Z[2@Q(#? OqɾE/ahN=qtY$N(9+/֓W.;{kր{=6[&#jj.SRP"v'q+ytI?z{Kywi|ˠ꿯ßfz~9ZQ-бا,^ěu.9_Aŧ X;ʚ<=.0vѴ{(w9p5'9X:\WoȲ Z近Z57 Dv -p~rE|g0ȳ}t+Ap?2}_WNț|ǡ76taΞ9Cee%ǎ_*/ī?&75YE1./C/|᝟%pgƎ[Ѕ;$oN/^Cv x탤2oϪ TyaYCe)K\,q &]ǻG~_}lw>F6uLźy7;'a 3o(m$[ /e^_y_#.u''o>9)oM?P֓T0XujzaBTj変ٸp{>uCoXp۩`nnfM2?aoB,'vU`[OA˫/FǾXF􊻉y ?^ng."Z4%gb1s5<#hq#_p?j qow~wrBVsO8r ,L1}o-nQ=/$wW&D|ŎESfndbzG@K׸l~X=fhqM.Xa i`?UFbzP}34&Bٞ >}};MCGKhB 4 Dx">+_ϴ7{LI .) 4f~oZOЦMxDgob ]hsd̔<cD6K=1me=P<6 4]l&ALk\d h3sz KX\JF@bK}6z@xx.f+^c?"kSʖ`bfpjzGUG'D\e$ı>!%)rLc쒃q;tҸ8g1e|.&? EgM]MLLmvbR4F2/Da2) m67(Qo&h&r9δ6~oD;] ~$ 68H)(cR*^FV'U{ yCn1]]1wu]P( BP(+ BP( Bq0-###;wh4JYYS__iTTT 4Mrss$ `v(//'''g* BP( B~p8chh@ d۶mO}'OR[[WU:::~F^^;w+_ iii z^H!_"5)B2/?SD %.,1/1$tN~WBJ64D&&d&n˗\* 5k&E&ܞ ytyuX$˗䲲e$cq@^:r|ͻRBX5ˈ_XP̳Ǔpy3׽KMx>ńfrZ3Ay411f1G;+kaOULx1T9V1'ܓZ\6/'M9=_r,}fNM)F9̔xU$QW4QOwULl_X ДJ:<߈DL&i[73G)yϥLzD,gJ]dsr3|[ͮ o~6϶ zvX͏?=c=4Nַgr'yh/VƅٕkM`\9 cJ?i{ quX.~Vɣ 7??rqg#ǯE䔰-rsZ?< 8{7Io4j.D YlKaѺG_υ@@ Iݙ&0?E1,_ G,b9 ȏup*lj.#k8a.{w6FP-%6}k؆hFc{у_3m;"X?iBZ Ȧ~Nmt9|!j%MǾNUas&&&;_umIb9ó/<}ezdB W[# %.'%B@ݫDoXK,GNLRsHX[i al'/a8w|6v9DlTuSU-~- ),Bn.V[FKŝw zbe3@ 6#e4`Eo53Gq7RD6b) #M@]/:Y@w5KZ#Cx[Ӊ.%',ykK>b߃&ޙo=bE.&¦kl.]żi:jpZF.ƹg ?l> f]z#l`F@ C'ޏs3 /B^QfYsh }) 8qgjN{9ULo>h(|+-%39:kI;,\[~/n>qdR[-m>+ ^W?)(6GM>f'X>ˋIoJ׌_e霾Oe b ?[<$elFV/mAĈYRu5cF^2:cg8V@s2tώ`d+Ml xBρ("3m$Z~DϋIkdo]>lnp+sAv3Lj@-HOoG1-?ʙQPm񾬋D6hv [ntfLO 8z\nkfuC C'KHֳ}V$~{|NmG9͈'mCG FsV#͟π5Z"QZwnkHHM#}ܖaVz,wMB;/$~Ƅ~0C%9p"\1=ȅ#o&X-zzsf9 V i2 ꨆ0\j tĭ],C^}KDO{qf"vdQRDžShIvx#"aBè5Vg5BX^E)@?őK85fzA+ edaL.%$7uJWA}ǷI:%Y063~/r$o[GyѶR6Vb9opkt~+e@ᚇ 30/}tt۝T^p">S__aoc#p8u]1 c^0.Hvl5*/YZ=R?]JAN㿘B s17p8䧃XK80&F$ Igy;f$qAt5_,hz<^U ]8s~Rr KHskJmr<5LG&+>7Bg9 BOQta^EO\y|ۜIs\~`J[}SЎL[e+c9Sd]?13A4^GNN'4[G)1Ov Y5VMrs.eǤ7'-'E"r~%}z/eG[(k ¡ XzǁMЯ˃˿и#DzEbm-nA_z Ȇ +M G 9ZB+B/.LIKÿ^\Ve֥}=h14f;gIۯOs&aei:;~7`uփcQ9 ZO4'i >SȹJVu4z`-}]7Lr/Q2J)\[:~ʹe3$7w10*%`G+ ] 2J19Xa-1}5 -c$id#+/ ; lgIhGVε Կ$!/8G fG|h(8`D`K/p`Ѕ%M==@@0p.)]zIbS1&H[|5Ȩ/mnF_0U0腂/}b(k]dS?^!i w"pvahw7s#[q}~ɧ[3@1j}_ކ$] p!޴PW(>y_NUcN8MNi.?)ޮǺq?\ UFY:P\J}uFr)M2U#V`!8 f# â2 H~6^hmǟH^}oT=uf`6M"8R‘!dfb^ѳoM" Ќ y!ICt-Daz7w&˸1JttOAD`ik-(?-ivR !DK헱#xۼ&Ǜ[[h-s aŰ,(^qߗKA_|9[la˖-,X0F\{|J'8u,_>nyѢE9r={)((Oq>tlZA fM&rbܾT;BnCMt $`%.XO+>@yq>M11fF)mRCxףkV,InЅe]aM&9%ƌXIcb_ ;cOu:fD$M2+&; '4I6fL:fN[Ԉow9:g&Yi0ir9 Lx& ئ:UDH0Q#->-<ތfk_L3#%X5Ud&D#߭pea kė.a'Ch:8&bЬxM] X,Drtb%ĄQq&ukR2$O&*9-,7̇C!+ ^h6feBdr,mָ̑0l$+S},q/\ooMheI+?6a] 5.b-/Nc41ۦ @tibrR%`ĴBJ5c+31sXnN+_{%051cL)Kh2]2.cDb86Q/ VՄωXR ʹ&n1akzb (LxHDD])mc FdYfC$.xZq!JIh#Y?K&W$ZKdZ6)Є4WOS'H&Ǐ Ncce,mV v49]s{ĉ+)&00%!bl6?x/%GOlĶtqKE]S`=Ī6V49/yl.&$$͚W o?"D~'NMA2ޖ Mװ ͊n[t)s |#!??IP( BP( {y唗m6I1O:r rK%f|yI8щ&⳯ f66W_zn.36!dc3s_!d|[D$c+GvĠ 15e|[ @x1s_[vႆi] IJ%@c+fSĠafE)$5LaRm퍱-4\|! fN1^A6߰Mn SCu e6k"o!bnnLNr}v 4t?$c&Nc |+Ӵw<#ZI- N3Y_ &EGOwd{AƧ)L+p2Js1<<ɀpOIDATB0:HNmA^+&Æ ضu mH4Dfa9EC:6NF~>">Ǜf4}``2vr~;G !q0LfoB{13@6dz&dD#m:@aLl;I};3K*VYLG"2G]K "U({Cf) aph$w1D"`kO6E_&nH1y"Ր5X] 7tܦ,dН\I;1s˜bU(ah!Y.--x4vtib$zY_L,;77T@i΀ISυ!xsԆ>%b@hhaH52!͡FdsPli j}2ct }`0LI=z u#M uX1.Y3B a*)\k\twI˝Њ;G9Q-: N,n`Kd !4EDe&D|n^Hljd=<Ɔ$4q w-Mk|ٌfup=:8>Z~ѰN+4& Lʕ+O(=G{(,jBw!ߺH+1Y?QZhjep^_z͚nԵCrrxXV9M|VeL3Ҙk棍\k5J&y[`Q8S<-!Q~ZݗRDDѝz.(fFEsǡ_ecIj,lꤿ ՖB_ĢU+Έ΋e᲋nD{K~-~ɀb~-״;FG+q6Br69Bmt ӯ/jy_"BWnUgC#f X>]y]pGgK}bnO=&R:lbZad|M7_c|󅨐)ڤHUEgKd;si)k6sh˫Zk +F2R[8(36FwM@Jgl"qGU2*<:7.KC5|T+&jPhdQ7RhTKQ֟D*qP"=>eP'9f*{EexQIwq̉N*̴69>_{W2q ]P%*?ܝTb;)#zDQR2+~ޔ8^z Yc MMMuSq466BkƐJ<+WxKO bX,bX~<-bX,b!B&輕1It#N T߃CD˪pIa͊$BT2BKqdN5|j5*V$߯Pt`h>}TѺB1=jyT`4e{GiuOaF`4UhvD+h@ ށl[ x$+3>A]<]hf&w0CÚFdSouH~3#+M ד$g.W&߃Xd\A1 aZ{0>D)/Y.7Ho0NִWkFV[*c*ƹiC#Ó"tVa w^Dݭ\+f&6*үpӀhh 7Gu͢i3݌4:+Pi]8a,|%wl/&;'-0]+;1sҴhpӨt@)*4FգUHŪQ[ 38Xf[5)qZ"z.p+%'Hôf0[AS#=qSL۬I  ZW#ܹӆrꖊDy F>CWcBE:iUsׄCxQV Dcgm4v1jJ`fG0S߾$SSh)Vʵ]AC6Kc2]lKc5eNmI9K h< 1Ud-r}ADc;my}G#YUC>&/$Sj?- ;X DOdmd}#(bpU_3ICjd2 $3ހTqG`F W546u͐#2 Vg4jdn5&*8x.ƚggAƣbcGҳ8S-4q  h[?RHGf#Z0зѱ!Ci$Z0sgts@@:!I:vGѾl falž$Gp4CHg0,Qvx/m `rVlm>'?K }ki_4 d9gb_JF:  IZã4=y)Kp6ϾG;flcu7#[HM-{%aLVoa|9hh_  6tYK\@b B*hoAoBdtE1ح>sjH39hZIvПESl;=}m>YDMxrm!}(j3<#Q;ܶ:͍ùf1fVL2i`iQft/8ɌG~^SDzlILxrBֶ@±dpY=FsROV=C@ :0<}gޣ ndYFe)C\?=TØ飈gya7Oi =9V/5!H#Q|z,FDݴ|fACE=y=q/y+j۩;FƙG?}5|妐PE(n]2>gȦo\1ngFub@_eQ0<2I]O{Y2}?`'MUPܗI#gB=I Y}呬}^d*.u3:l}d@/b ?*%o[Cy64>̴E0ſ?=XLr5MM7}রn^ኯzVX(ѯupv[k`x$-~)vQ+x7oˣ_4\u#>_F?Z^K7ni/a?3ؘ"i=!dS *"xG kݑ ;?-hT7\}xtOn#bcTw'_-ɲ0Wwv}5$<L#V6{A7[EeK޹6CL ?֫~~U|ӣ_YJ mL8{?'yv~g>$ Gjb.VpCG_' !ǎ⏫~R.CQQo zۗb ̥Л,^ݡg8}V6S;=@ l^R^[֑r\oy~*T,9bgbn彷'__M3Q8`\=GBs!|v0|uu|?_>ƿ}U$so +1&ߜ燾W>'w}A>W8/r~{o h7e_c̎wފ1aFᭃ()0 Ypow'8rW>j̥ט.kK7ƍ?x$">3//?M|,?;oKo ?7>Z|B?z<nb5';`x %n7>rD~|G7S+HuW>Fy꾶1\Q)zvcEnx]յ޸ѻ<́9@w)Kv`[ſ+Os?%/͑OC{wLw~mh'6v}OL*;\y;M ?h ᏮB?z3<%lIA Mgndva{޶eپʅޚ;DR\uj G蝹oW@JXJqߵ׷нEq|)0\"?xtm\.6{|TFmiYra&Au9z/2z٘y31Sɤe׳Aw cbiMo#a/"z,C4ǧw}Q0s5u~;g2™yPi2,y92MT2~-we&NT.7dX/u upI'$S6V░1Ҭ~F b| UcRS7-Y\,%S^Ue/}mJBZ߲Tދ r<,x+y>6l>+V-bX,b;vnX,bX,˓eoq}0dݺu!A'15y|ߧ ccch9qbX,bX,XX,r饗L&Yr%vApwsgcSOE);oNww7( p ݻ|+]v91ȃ>$E'rY<΂w618[%C`NHpԈ 82&u2w[0˾\{tAhFˈBǭM31!CP𡧅JG'2 Q6BZHsOB `Ie5bA% G,iZE'ш93A !v FB@ g5HX@038\hB߈Qq*trdx\VF/JX ^L+Z`83VLiEϽlq,/7S+\W1NvJj|^A$R3? 1yCl_sljpV-OፑX﨓)U0 4H@,Zn!y<1,䋂uq ̜8\G{`ʥoWHyBe Lƅ?n髅=1])N0_ڍlje ϱc?O[[swpgW/V Xմ(xeKpof@$}6l  )#Íxկ@dS^s.wrR@axNzmEUQ_fƘȾ,p_ IO2}@!W%G aq8$ӟz @i!烩/Wan, 0l`K͖{_KOT:{/gAV7Ccz^Q?̣3L\E yq;W朗Zq@8@? 8v"ދ޺'bv)jd^ .¼Wb]BظxL"4r7!O) qLT ǎiv25T[߁gl2` #Lkr AKp>Xwz#l-%K'=RC m?^nI٭ihc4;tax9!,M b!F2*%אg_2rz=ŋikPڰus`iLD&Yu .t hnkû,t*T@fGe#ƒU}@P3&7/Ada Y'b ؄Bh(if/F iK;q±mEoC=" <1[v`tᮗ{)Ù$>IH2SѰ&P!f%ax!J3X.p`<Eͮ$iYF0z^h(03 AfIΖ4mڮzUh6<|]'`"=e(mn {Ia~|M9)ր/ !=M 2dHmװ'RF4cccip=pA>яOR˿ ׯ_Vyx'kS߃1 1% s_#KhAIڞ?㯑aMow^_pfd. ˾*ĸ0!~V Y)y_ë>aM1ꐦ.0{m3iAq}?mqv9 &d"T)Oi8v¹Y[#`ERwqU|# gҸ`$q)P0Y~Q74'}b#wf:q{ьxsk^WKw%Y%xO(WW~ /%U4J0S֭ض) BEO-~st7o=E}#h ߦyu M.B]r;[ɶV-U5bμ{- )|Np}z;FJ0{3,,|{+^rsrE+) @ug WFt @-`ˇ^ie'9ej^?Y3y&>84s\|tN)ǍER'B9!Ϟ]|gڟδ?A皐%DC}gt04{t N&>uyp0(5gOgn~-Bf*zřsu&Oz5ūcFr_S렅5"EWrˆqօ#q{aōˎanK6*a .î?8;NHŹ/kq)k'v+M?Y9`D &;il+_0|c||z1ZiW.xܪCF~vfNl%h(7_O?+~l|Z2HG D\gY& N%Q cX7AqGn DI֯^U{g>'lhBF[*SS]I~j+a.!0uArG9}.e  9B9y>adyUTH΍?m6\/L|)Z?><. \C?|Q{GǞ߻|s]7W.=c7.Ñ&#h *|2`.\njQ._f.{铖Εܴ[iwO}"2 2/ǍkGoIEu}y}g %aK`+?=HOꉐ;BiIIO*Q`|0Dlen !pTPT/uHR^qoqQ?lP'*B $׉g"+"`;NQ7dOƭfX`atJ[ wN;bn4W)R?Y:1'" $+뗈&Zb9U (Q@J3ewV Zį\'ڱcDܮLCUL<ϕіoi Rx:&S#cDd4$8%-ΐ 0r/440̹v,*a_T#E4%5/E5UK]뗩;ΜkrLޖ)뷎R2*EeHD.W$ˢ)Rv."ׁ)JX!s#e`Z(d/Tճ8E5CEJ…#8nq,~]⡇/|!gu֭+? Z֬Yë_oqȦM8S8L[,bX,7==y ě{{sb9 CDqM,e70Nbe@:5zB (]bI񬠌fD#kH8XjfD3kNB + Jf888ѾyB?s@'.G 8fT쿄 O.hB=;Uu"rh[Ju "IJ.X2_&q8Eo t=KHE#pABF[s]+mJGq1ҭP p-5(ppfP "jh\_~IvAQĕAT^<q+$2ˀ}s6dַ!@4s/KD~"VO~ 'R&XWDE:_ $ 2D|:?mm'>a(pNdjf ׉F\]zF||r8 oD,E D7!E. $Z+ٜJZH8j~iW͒y eHJQ"Gī82}#pp+K;Vf1 H$Q:$d\G8q_[7ĜKvQ_[-rRY'K? MvҲz_EBĻq:D"r*̡BH!8)Q_J;q<>FL-ׯ/+DݾC:nxAB[.rAVD;ļUE IKHʨ?R<]7W \S[5N~\QcH<ُ&1@H:2q__BH2Q$cU_Dݼ#JKXwCD}r!;G VBTr[]:گF&'a1!^r3c;9؉YaHN8bdH8Շ W/~Ic#džB%N5I;w͟ᠡ7ބm>j*lF 0ygc0X0r&` s$ZWV&!,Z/ɫQNAGZx f\M e*2]4<.73ga.c[/W_ԑ$)^ ЉEF؃ !]Cwo<56QE8!BNrDcu~΍uT(I~ ?=A|̑ N-yLw #M{;oM_H^eEۋ 0m%DOe8o 5 .*#h&)Ӵ6NDN2A_nq#s[qOU]fj%@vߥ(.p1;<:_aW 8;IpD/?^!3Ki SM=k!x'5!ڈ PY(6@W2UmaH 3:PXJn[/mɤ';"t# 6dټHnZ?Bq {VȦJm8hjA&ٞi'mI >K,9i1h!qpb'2eƹKdiqT ŽW0ybI]!]#IAWrMjN HHѓyҁWzohO.|þ@3Mu*1 Qn0}x iF%n$'ho!  Ӎ ~ {vɁB'fXWͭɄ1?I Mb-a응"27 ͎p#aVd % H<^oH(-Nkk"{ TUR* Hӣܒ֌排* J>maL^벢B{f/7'PK е =Qd!acmܺ`_hd$%dqbA_TjLGnÒ 'V{F3HfY\UBq$ q-ʉPy*QڥP6Xv4q.璸'0 پ}lfg-eCVw^15Q-bX,+0Ƌ^"\]D./{KlX,bX,;aZ,bX,byܰtbX,bXbX,bX,ObX,bX,'vnX,bX,˓;@X,bX,I[,bX,$-bX,by`bX,b< tbX,bXbX,bX,ObX,bX,'vnX,bX,˓r0z kM ;Ea*h9 -Lz<X=Oa,&3\u6&5N#mmMO)k M@kbEGu| ~3[(l "I ΥCt YIi~JkM^IÙ ga}+p̓1qLfѶq2|q0 P>Tr\ڰ%wBO!W=-˪ !OD+a!NczDt5ia6&(IgK伬4䊈Sג?-OՓ(p$V6Ԗatzu ^Wb0)ikINQ4 $R k&ZGASfh>iHa $hti>i"sQ 0 47H{XChPUfvd$tp4o ijE᠍[hwf6\Q),(\ IӝL`CEiI*s '"ih3k&X#ekBCXӛMY5v,S>< |=] 3("V묪6-[O}z0p;qZڞApϗi4u=gg=})5iL_2Dۜq{) ȮӑKÏ3W(z٧;<0Lş _RDScճjNCБOEe E_6"{ ˞ ׽g3⛊O:5kONÿ(4wnǻc7;OuDu}ȗjϕ;La/ұJpY@bgiufX~?|?pOasi'v<á϶ӹ;)~s[}McU6$hydoÃ/Ʒ5nms=wKk&Mڀlⶑ/Ph,g~s$ϻ8ocW1t:>˸i6g߫>_U_;' Km߸WyB~5oN1er_i']{V~I2~f7닻إ'1y윽)[ƞ˓|)rYvWQwџ$p;Z+>kz2zp+eoB; SݷnoYv;G8gO&7+3~!'s#U8#jVKo/y|/^VEݶ #A!<у}=կ[`z}_99pׯq' o8#']7-ӐѼ$ږvo rsOwXV}49INXkIsO4q-Ok+ci>itMW?Kuk~xMϗ \}8w.zA]?&o0\p=#?s8_7Oټx[i7"|$=>®zpרއi8>>d}js//Z4p%{El?)x&؈c@QP&_SPrW( >8Ph"" 4yR%&__A}M+,{haTEA}odFab7p^1 <'vEԆ8Bȸ.*=4P,j )]1X@E(~"ݽ|_q:,hGj(W@BtttEѓU5c1 YrA961~0cZBh G?8t۞cтD')@B|x?N xL[Wb|Tv>bs=XK\ĂA˞XfɎXfh1?ݱxJUNkËB/\G[Q:cDm kߏk=N(W'弄[]vP,,ʴbnT`/Ynw<YHKOwbX,bX,'⮵&J#:sN,oll$R455æiRtvvkv[,bX,{aY# 8tmmm<%r r ֭cڵA[oΑ#Gx׻7|3<)Ox:HĶ"8Ǽ Pfk(E@Hn wrk,?qZ& #B Uλ˿zSHʙTq|' m\_cq"O-W33'Êr "ǥPƍ9#UY~ibb<LԎ.oU@SFMe4EsPd F-$rIB7 ۭ,AcDd3eO3Q"gg s}sO#-K<Ag۔L18HLdOb wzֳx_~= t|ruOOLMM׿tuu-n,Lf`!TVW]> wpTgBG>7Zd[܅#ޟ3{ȡ1s!Y=/M3} g w_5wiJM{8⃨fvv5Ascf riЗc04LឫP,S۞rGm*mR<ܸK"^ `69şތpߕ}lɠTi.Č b\hoap@i F9t>#. W ^2)vњBFO{d>ސbFA] ҁc;/?HO OxC#O1`, WmU;|l ^( Iʦh\{= ^bb]ɹ2Mw>XSp1#[ϜC֗U$a& ߷!Dr ˗]gw# bh%mpBb$S4+Jڜ4g?NGYOE4qoCA^Ѫ Ui*LhcԠvdӼWNq[ϠyH 'v 欧@5v"yΤ!6SC̑jsmny}̜J҃i˓; jCN04oRзR7J!882NXI FyJsgp-go' ТHZ89:4ЇU>`Ҽ~}6aj,Ӳ&֓ ~)Z !Fs֑U$Ѣ!G+HF3 Z0'6̐{ ]ȟr:zS̒t;qImL54+YQnթt99#3Mt9dLIKN*uZ94Ks8]{02O Z/rP09BG}ޱ2a0|p8Ԁmc$3L΢nPPuI$Ө`#m%MmCzJ6vQ|HdfCDwA nE*$i &'nޥY*ui*ÚA[+ĒI(& }M[{ UW>Lq:L[d{4G "w,QM7LgkvGŽ~XpV]pŃt(ى#%3Bݸ? n 0ɭLLuG^L<11s.N冄8u㤆h8\!%hg@ 省g_x7̫x0d c`d6*woHóAE]Hڇqx؇7y{9+Љ( g젓 INRzG`mHV~¬Ea8 :Dt!8i133SΥd2Igg'+Wν{aΝ|S*wM7qWO>~7{/hBW\A[[_H8"G Rw7Ի`DUϴ6wmUԡqyEh}+.~< S\ ۹;%9c/C1! xwYyr*NS_=ESh\^5]Q ?j@]9Ȁn2^ky}4 *heş'7~u/"K}ݬXwB2ߔv8kNuo&!TNk 28zUEs uʰwp.ń, ~E#ݼq!A3>?E"y[.d6bf;w To?uU]usU2/2)̡3aEg3azލ-P/>Py?qɃÑE/o)ظeF@tU},sbpޗn幜2o?DӅoU7y?93(G~g}Й䶿Xq3X;2{_֡i<; /ja֓x^G&=C >JBC3}nʏsstϾguz8o=~[?3ֳk?⾾O_07}WhBKMӾCw_DCF I49A܇+zgCN>e+ڇ0+ހ+ T{~!*|\= qTUiܛq\q}d-vPQWK=ct/ _D_8[78KX#_*T!dzoAδ"^10bC@KTn\ʔ ibU>m;ã#,y /=p:^T+w_;x1A휞Z[8iOǣKSe"\a5Gqob]3,Z${0)kz,^#}|W̙r+\1?wKr)pf8߾L.KRI'on9B K{ncDl.r>O¡3E|6j-^찛,r /z^{ɨ~__FNT4QBo._񡼫ݻY_`LiS lZy})2S{|Sw?-d.e,ySa+z겙oa*~Uu^J0d,Ceܿ\ַ?CX>!_N҉} \Ͽ+L˾h/ )ME*)L=#sq'86ϱX[vkoqbYdTe=v}eل{Bez~+ETֿ(']˒Y2bM/),K_u4vK"ɸ̋&J̵w8<5@?yӛ 7܀Fzp@.@,_*(ĉM zܖk-')•e;&qdp줐H)D8 #aoWeyբv%we<'DŽdoW8H_$WZQ$0RFiQJtϚ迥ϲ#D= cYoVtd̉?Qyp-x$ߨ뫔ג9Mw+a7ޅD}x#eՉڤ#"]a.F.]R ~/e[R"eK|х.3H!p9DzC8BD+gDZ'W~,]v8D,d[ƻRDuNnC&} ak都Ʒ""TtZE"P;L42QD I&ѕ9IluR4ّA!rp\[5cdΠ LO7u0GQS!3)f]FH mDba(1/Z͓(S(ngH^-8x(`%9d4L#HCu#5@ 1 Qi w"=(6>@͔€9E} ILrpPU [hD:\H](.^-dj㍒<'gBp:#i"0Y7173j fH?2Œ!:>ɘ1Iw#L]2cQL(VD*i2[p,+!8t0#j\.M'a)]BM8B/k[:t^U Um2Bh\^=v0{rpWk$K\cz"0z]D\+$@81nF)n|nEݍ Ž-'!$ י5h#Md. be%0CX Ҁ)6u@8呮2h" ѡѽ1RGMM %0aJѪ $Brat2~@HH,7@tF\+,kJ*^JɆ p4B0VA%Hh#hP8A;ѽ'~q@ P8Pbƕ DFDqD"g&&*Z\ ?cI/U-L%rʦ4Tg>^əX/e_c 6gD7.vq>Msb Cke>nYDFwG%s ~!nS%@(Wi]`0FT @-]D"1K E2XҦFVU} DwwIE"M bX,bX~<'n,bX,b-bX,by`bX,b< tbX,bXbX,bX,ObX,˓\./SbX[,by1> ':;bDgbX,9g>/>!( 455Dmp$5?Tl>k&97PК iNmc* ~E8$E 0സ>lOeCT6iv18/9(U7:'HF`G6:Y+kia:lI@Fv$*f ^jXP6$\p$&?@f(P]sW  ~3SW櫒a: hvu1TyNg3$thm:VsvKOBJQkbf#A,.`:)Q=7;yaT^!NK̪2@&iM8χ/ ^#"l*[1Z0W/oHORǧ_y|cun I4`)P>m*t n,@2Q#Sa{"h Sa@:15C ‘3sVOzD8s,&ΏHۤs0\Bf|LQfBdS}Oz)81 \3A45\|8LhO#ȎfBT.DQ_`I*lҐhfeL CC$|HKhj8 *@8 L~*ҭճ%L:Eː-dHg]Ѡ& hz|r(>PCj>}mHǦp%W>>=p;fdN){\  {SH5N/ 9}8G>n:5 (>o k^>ۚM}r|;wDŽ~Y].&dGߜM虀Kl璩ii ?w~t3Ϋ08ݤpоʇxd_JwclUS]O|djI~}%mF?܉Qvt< xOO7~z[}6 dG= (׎p3.ۣz<ᑻE2ɹ|sEzdQGRO!t6x𻄻.g zv*\=[r!}@f,^=YM~طnWܴ{B)6dk3GoO7vq[~/*]=>W| f=|E|Zӌ7&?1F_K藤>w/A>rͽ+1ƛfNrxibsHA$S S Id+o5j"L}&I̓$?q+F(̼B,{r􏯤Ϯ6G~s#kmk}~s#(nfn ]/ZjCE`{9ojY7Q{>n6>o-6xh]x%͇w~y{oS_q߹wik>|G0!{| A~vCRUuk7`F&<=؃gn ~U.&Ox;|d?~>Q.cVO=R]d/f󟇉!c(iɼ!S^蝊ږB9V]f&merO^L?C _Ux].|#Csd/k k o?:D'#}(vQnrOT]sӲ†?1%S w}I |`ݎ->xՃzq0ˇ7}Os'6:_$Gm|ߗ߶`Z|[s>5p3|u0}p?1AqԖ$ޅwՌ:]^[v~[Mki_ss}-BWu3Uϖ<ӳlwa6GxO >w!&]^[K- 埽{~㎐'OlW|-9ol /w'.+ͼV| :Ƨ Q38@U&7pa*`:Y,a ꩻF}Nefl KtQLy LH\xpTkTV)Tk oW^4t0sy$ ^6Br Gݴqßf0~&1ѬajO?5Sg}|4(z!@a0 0; ֭1iW09NWΨfY%&O䡸@OxM7Z`rf \uz^0=˻7KN+| ?M!vg Le ^B>TSvЀ?(zh'<_GK05NIg1S3>ڄ'cbd.'\l +`Ƨْ%RHσiEe3i"GMT7cHOR5p_ L>2Lϖc븮̫xxQ X$R"%Hv>ǻYyd7euu]'vlɶY%Ylb)6 ${3a(QՇxofn9={ 2jaP'tװzNVzƵj0Lhk$ %WԋU%s31!s[0cƅ3HMn*~?A.A$@  !E _.$Ib1.%loU1jhy$h Mu86>He$4S}Q~{ηW-0Ibprz=huPa@M*iPFSBƒSLpF@RI.kEP cĊceY QJTA>/q @# HEPXS#gA102H1sц:FN_CL(hi0iI HMM&ˆOCQ$_̣O6M~Zj*=(t¨ LxgXsiĢs{ŢIeKc9|*I9 * 0j`lMK*-iRhK B8[IeՌbA #iĂI}~4E#6!hNJDx4J|#W㿢mFC3q-kˋ%>zeń?>ŖP (3sM#1ϤzhdO{]|$bkbJo,J`R=Qs'=0Iz5XbVs xs)i B|I=p $=REp5L=e H4=0q~%>:`IɮRʿWg1K$x/iFG+O W4IwO# It7HfJ)Lt'UyII̢3s%| iˤ<ƜwWޕqrn:&?yIImn;^i ]'<004>jci6&˕%Mf#ҕ,R+ʖ$I _Wlzr_M)lj3 ͱI&䱚ϦwyU=m[bLF/|jsR=_94>!"f*l4J╒F!I>v+9hjJ\F++ץ)6Aɕ4h?OANsq9y<^zH)Mc9EeXR0^0&;YQo]}"e~,4nJbwϪf<}sM{_8Z 9<.sjw'WNLxK[wN׾jiA2r5o)\v%e^WAIŠ|rPݙ.sZ~2G5\޼zjh34KeIi&.*tM5$ TxAFY׵ % }pBcӹik6Ֆ*`" mXI 5y]YKC5 S&Rwrm3YA9x$Uur5e&k-IUg2ӳ% UJ/ˤ^2kg4|qtudUm1')،,Hkv.9\5\']I{c4fv:Y譭|_`0ѣG{Yr"v{9gff&7o۷ܫ>WKh$q8dĥ$L87$!1)cyP2mLOr3dPgrIB!FFeYLa0ф@, 8Lg`K#2H&FINIx'D)d@/( 30a\7^Ne j]-*M#}¼*΃xU09}':/fD 448a K+GH@KQ$v@qSX49,K 9[1a$IŢeJ|fl-T. 4M20;c3$hs(CQ4 ZkU;ш<⠧39T3a4WP aM%i~fIb$D^C@'i4yV/CShˢY5Ej2υ> YCӠ͝ aKlFJĹR෠h0R>;Bl,]B,Kǽ6Uǣ '&u pߋSj+JD8+Y^YPX61w!CfD%x5#Pxa-NzBcLMV%{)2C~UhGO,:%Xa<<=% G>GMFY|iZ0L=D!6ނEʡPKzA IC&ya ,>_؅KYEXCZ9Xڙ4uZ]"$F .q0!/MuF IDATԩ6 u҅>hw4i%4s8X* WdLSdKd"&,n2*"Ը:4rhI9 I$St  a"߳&DeOn hLAD#HjRL%z)Ê;ݏUz"DvLLgI^ڃ'qD($kX`3~-AMQL2 N4_ a4g2‟DgD<+Y! <5A/,h=fUa;JQKD4NxM A,L3:g27 5q^ M2F' 2ODӂDX,ԘLx?إi4욆6:!KQ44jʒ@?ŝу IUƼdBTI4;Vٝ}H!fF .hZs# hyAl0ƀ *)Rg-Gs)28%?o#V4IB> i+혧Y5WU= k74{y(oI4$} Lʕ=qfJzJ$䎕Wm#oҴ"߿LMjJIh\껕abXLc &kc 4x_~5%$it =ɤ,? q6-?od~aFI;$|N/).r(Ǿܙ 1 $ &x Ϟ1ˑ1K*X)Q̓tْ$@PrxfQi[AfQJA7aRKXh׿"о ɬNo:ağe) y)tE$Y#U}eW/MsGu]G`֔`'n1DL-Le:\> UBZVrgv&RM9~dpw?di2?x~ӸRiR(%z69s `& Hr29 {)7֓yk.QׁgaQ6vN&֯|ŖFb纾Mdd[u3w_-rY(p6&I.+b8dg$Qޮ5C2iHT|KX0  !pTպ^E|˜4w6x yǍ>WƋ ;ՆZ\ [u3#i.SU )N>v*y86Ӎ'G&wg fWo&Md+AYȒU}q/n^1<[Ym㍣If" ԰|YcȳۮxV z+ͳrL氉__B~GAI/aYaƧOcAj}bWXPSABB3Iw.LTL}v|`湂nhZ07[s t'67ZT5$Iup)sMo: -Rti{UMC1xT ϝ@-C(w%lT elˏIaҮ.[*2kLr"1,66])t]'f٦oM&}r̃YȦd%~Bf( *zFa;ż[G(BQ֯_?yٳgΝCQ4D"o!*++` P%ii^dTӭL]dMJ+:|\iuN^R4m?'l\]j4eUElKǕ&re5MJi &(<'ϙd+sgHj2u§h )LBf Ѵd*&6UEw@ӤY$=g L7mheU IQ'&5MbKSYUP$%ha*1S%T]Ʈ ;f<޿;¸|@lU@49ʗ6*kҔqL.I *Ц/{JӴtJ*Ǫkc4>5%3ɶ2CY/IeKQYWRe]2tIgn(iӸjj2=ϯ"_z䵚6)I$TebO^oW}˧^~@KTҒUEEd ݢ W~]"]Ne|t}eKЌ~ƍ _ j˦6; $}54EESUTYE56'gryy/񑪿?OXhG\59Uij;kZ^.BbVҤizscB]LihB9)V4^q'%XStw˲k-erfhHw6qLn H((dBgi]2{yKYՐeUr_.H3TIH54T$Ihljun|+ƛI&1]MP$ ]5M׶=;iȌ&wU M2$TY|r{iJʤPs(MVgA'gy9ƇMr>?e]U i*8ߣΚԠ'72>7%Ӎ/Y4 3e6khwߍ(8N$IBM}_"PnG೟,t:1g~=Q #t7+/30s I"HtIJ/W/=gxO^'SOhjy] Izɗ6x{Ӕ~f6өe yUZ'Rt~ݸi)5r_t<4&e{W 3==uH2]{I\Y?;9$IBsYc4EkwwxSsl{W6\uYgDG{R16zdO;-Ejoוj m8rzq1pthI&N4ޏ$?c| }8czq+6R>^ͮ]6k u,%5y>z?ErMJy[|54Rϥ4T}ٻA?fr` >|>[e{٘/L4Rߙu8_0s>tO##E/XJ+uriN394-eI&OffMd"++k΅d7(`n;tQs1&:)B IMrhjH2xB."]i|2ޡAZBީ*I+>sza hwĉ,DJHFк 6fmqpߏ2#K*c^mj<N.l#JAt>SJ"04><wa{'F31(iKZ0va Nq$0}]2 (8@Ρ83( Q/p+i"pPzX2u$ICB^L$|I(J<d":x"H]0E":DK3?L{dpzB ŇnАz UPOqs3#a3gp Djet5&B>^o14w= ㎴&ϚUDES54Hɲ72j]Dl3C" F'05l!:@ٮ@$D_J7M.0n7 ǀ.$UAƄ}q799G H,j0``ldVw@t dӖCQ-(=R, I(*W@ܮOS^-BV,tY1̠&ׯ|fafMX昚Lf&K[PZBͶY?[#dr,:ɊjEQJ%M"1wi?|I&Ï'r";bD8^ J1w+1>Y@IʗߜFd;貊fMiS#&7YO |Y2 \Z5?VmD &Gɜ@ dRH$Irro\Ӵ+~_@ @ qFGGX,hi @ fMF@ @ q^/fD[4(Vu5@@ }l6S\\f3vUUE4$MFZ @ &Ll6a+(D)] @ 뀢(?~'NH$(//箻"͚@ @ YBe\.դ}.@ u"//O}SA H! t@ @ Mff&LNgZ=DD] @ D$I"v],)nnt@ @ P( cccvMpM̜rvl_i] @ {c:ul(@ !Ҭ @ @p t@ @ nD5@ >b1L&KU ?+j@0.YeI4 Y'|i@ @Cٜ|f^1LE@ |g@ "s@ >|] @ a @ @p t@ @ n.@ MomD"(7YX,q#/o (d2EOzl6r<'Jef(@ @BA4MHFe@44ЭV+,H$7Hj, N9@p8˗Y$N1VEy i}1'++kNw?:E @,gX$$Iz笠LKD<MXp!V}ї׳DvTUvSÀ$IDQIOO`˱{JdeeQZZ:zYْ$( (2dEOdY&##cB.k-LueYQe$@ +si$A4l6|mG5Mb233g8@"fMJc``kI Ɇ~{\H z<7~ }rrjeVVMgu]f5˭ l&OtHV0Ƙxtg" b2T/]V&W"UGeggb1(NX,F,l6cZg].Iva>jkkIOO7AZZPIAAM7>@ W}8<[RSSC,CQcW6#IV՘H' ,˄wŎ;HOOd2M;qty3ͼꫜ9s=zD";D"XVakƁPm۶).[ty.^Hff&~;wqqNbzl6 6}uׯ^wI~~O?l Ȯ]{(0E݅fqi4MxBy k׮5꩷ѣG)))JD"9{EQ^x5kP\\d6>coFcqq1}}}ƽGnn.%%%رlA?[oEvv6UV}y$9q^YYt)K,1R'ߚq~mرcgϞ|y~IC讻ѣx<l6.Fx衇 ==g} 8<gϞR~Ү[aN8B$X|N=n(/^d߾}w@ps-LПگرX,ƞ={g``uaZbi&yGihhrq^L6{zzo@2ŋ/]wq\dddkʕ+I$̓>ȯkVM6!IǎjC:u*.]āؾ} Gr1v;{/uuu__~;vMYYO&qF֯_[B fbF_?LCC< [RZZݻI$,]޽{qD"~q8|s EQشik֬رc8Nʌ]˅ft,XSX,|СC 2~> 9I}v҈Fl۶'N022nٳ_UU1|>Qe7?EQX,v9~8lڴrN>͒%Kرc555l2?N{{;x<ٶmN:̤ t]jb9ra_ l6c?0/oR]];}xXnUUUl۶ 249x_:u;3Xr%/2B!}]\.=ztEVt]/_,ZZ4MYn]]]<444000… ٲe eee,[ӧOAoo/555_}FY`> Ν#iY7;~z6l]qwyx">L0QWWǥK4.-ZDII7@ 7wUU5v<Ν;AUUӹ9}4###fn7ŤnGKK vp4"166F$jɻbAQB^%''\Ý c?:8~łw$IbӦMPPP@AA?.6pO#322244믳tR0Pȸ~(裏rYy_ mm-dgg3o޼i/~t"~ljTTTb XNzTeN~d{e֭f(,,4cUUU/dٲeSΜV^R 2w_D"|{3dff"2YBzzzHKK`0o%KF =<Ȏ@džPUfxŋOs}q1***Xd =uuuO 7w@  ÇI,c˖-TTTgڨQf3pilٲ_r-aZIKK>PUb|A~_b۩`ڵ[r)//_Ip8!28NV+dffb2$yM8( ,o'==h4jҥKAR }Acǎ޽'Nm6-Z}֭cxxDZZ999[oa%SRRBZZv $HP__OWWb'{ɒ%S꯷grtE/UU%##M6{ny8r2hX8rUUU׿СC~"H}@AAXVE!//Fff&<.\  `VXʆ p8ל=,(,_OӸ\.V^m5=='x={p lBSSiiif Ƃ&$c~8̢"f3a27ov[~4Mc֭ANN8^ydYfQTT`ҥD"BTVV@ 7vhb1"&HDFl6V+P5!}nnFBqҰZD"bYŌFIa҃il&aZHNÌitvvi ,0rJAE!==Hwq!d2X,dY6>:I}nf,_ǹtϟ=OHO%l2a\{[,0,u7m=Z~d2 J}`UUq8L&A$IYɉ=v MZZpH$fnO(]ו?ټy3vcAcfXH]hq8FۧfcLׁȩ ] sE$Ic FGaUQ())1"}wվwPU~dYfsJq%J, }gbOg`ZIRzq8 'dw~|SoRϖh쓟3@R^/\@YY $@ 6~ t@ Ȧe8C >4g zX3F1##c>@ p]K'oX 7T>R @ ~{4#'GqBί퇕ߘLbu5D9Y\@ @@ fBD@ &@@ @ Ln-@ @ $ӥ`빇}>;ZUUTUsǍ\7 =G%@ h4b1lԠx,233'}l1HPPPD"DQ}|>Vf෥hH$jnN 35Mv_tm ̼E@ |@ n76lLb^X,6isRw %IzeY$ MPUd|u2L~N]PH>`2\zo䱀>zu֙,ޯsM:65ml">QYgLMO-@ '\oZ]44MC$1D"͛wvgBrK^^ttt Z,XN[[%%%8ZZZ(++3/0L(CMyvD'ъݍ&## jQ_^s 9{15MCQ.\7ꝝMUU1MMMO>$7u~x\XVfr222hmmxWIoX,~3:DKK K.e|ӟ` C@ @AAڵ(fUOEh_*_Wxꩧ.˖-#O|'|r:˯:?~FII H0OO466X"rrr4'??<~?L&zr~W_eժU,Y'|@UU !S^^$I`6I$o>olݺySGſ/O} ǃi~?νK8DYYa @ n~Rm3gH,3^7D/ٳgikk#--^IbQSSSO= p݄a>xy衇D"$ TU%H$ cؼy3W 6SOQSSCgg'… aɒ%466/r?8NL&_ר?q֮]jԩS/i&<t"I >/^dѢEx<oRQQqM*Vf)_ٸq#?Op---<TVVo}s-l2~_sy›\X,wMnn.$H$D"_|}{lݺ˗_^ωaë rxꩧ8w---Ái?׾pPXX__o}N/^֭[7ox<T(& -[F]]=w;֬Yng׮]l6-[C=UV?===⋔SSSsGrGˬ\1pY|>.]bϞ=455H$ؾ};_җD@@ lmm-555j%N{͌iz{{0.x<~]&( ^nPU_TTT/}RTU%O(ncZ$ Պl IKK#--/| |_eӦMHÇIOOҥKs=:t:ˉFJG]]>,ַؼy3ٟ طo/_w˗eoK. Xp!O=9~8eees>#,I~G^o po6Fn6@"0)[oŢE?CˍvdffRYYI4 :}t$o>p8ɟ o.^Ƚ9u`׳zjoq˿ۿQ[[K,_?)Ν㩧2,eɪUxgO~BGGg׾Fzz:999߿'صkuuu<_*K.6(*w`b|I/*6l`llZg}""@!AmS}JȌznn.ZxGHOO1{AwUŋSSSw]0"2x'p8\.x饗8piii/.~&=//JQQ6h4JEE^k˖- ÇzallpQ9š5kPUH$@NNl2zKK Xvؕo?M駟D8&33m۶q1~_/|Ljkky7eŊ7!&?owyZ.\8AUUexxgyb?O{ ɡGR\\l ͛72DQ7 }}}s=<9+WdݺudVf˖-[w?qV\IEE}}}pwd"//Xҟo3|rrrr:>3226%co۸\.JKKlE @ $I"3000!>/ 8)י/oRo$,V+WfѢEl޼J-bƍR\\˱X,lڴ0xv;+V `X?֮]K4Ee#HngÆ dddŨ9f3x tQ5M3v!u!߰a-`Ȯ]X|QM6/~Yo$1Y,ol26lʕ+ EQ(--eݺuXV/_Nqq1iiil߾u144(,_~pr]wvݨo @UU֮]KII <,ZUVaZX,,[KbZfQZZƍrl2222˭aݺuSRRҥK 'Iii)ׯgŊ0o<Ơ7O@ @ @"6y<j6vߒ$ e$I"FNNJey~?S鍤>9v.~tӟȲlM^Q_WorwV%I"D̜"z题ϥN$xHOOjNOjON7׿˅>B< /FUU<YYYG(uHd*3!ԾǤ@ `z$IbhhLzz$Ix^V+?@WUljF8z-Zd2]1lz8H=l~7 Ӄf띰P&ňbI @ >\aۧue|SM$;;-mhv%c6?юuw|S D0v'`H$2,,hF0$ #@<'Hg&@ _i ,VX>  \(iiiьp8>B,'Wcpp\# 2o޼ .'`p8L~~.@ kٱ߈;LژMF8܈ uL 幉D}'z973樓ׂ@ xeN?%{("HPXX0ϟbt:I$455Ivv6V!1Ldddx8wP\ƨgllf3466b6ĺqy0sP(b`Zŋb1rrr?H$Bnn.p:;;q8Mcc#NŸx"qN>Mkk+Ass3FŨ'33MӸpl6444ΦE<'//.]fNkk~gݞpa233gq6t9IOOrqyFFF 줡YIKK&z{{f&//ɓ'dllL&@}:N.z:~p\^/Ofhh C@+IãGX,;wX,ƙ3ghnnLxH$с&??r( :Ǐ… _Q~FFF }C$~inn^f[o166Fee!υ  I5m`0ȹsL뉢dYVpYä+D(vU 9s_ ŢE455qEƮ>}Cݻ)..%fY&gEG$ jjjxwػw/n***,Zñcfdd&N8n3`6ٵkW&--m/̹sضmۜA7Tf3`pp]vQTT,˼qw288ȉ'СC[b,X`D^f ng}y#GdΝ\rDm?[p:={Xnmmmȳˮ]?FFFx饗;8{,6h4Jvv6HcArP(je޼y \t Y_$33h4ӧy&ȱ(޷o /vvJgPWWGzz:}ǁXl#{hh>L[[W{! 144 /@yy9\pgp줣{"'==IHOOV, $//F=GCCPlTU^222B޽{{9{,Px @ ڵkٶmKR[[7 X,| _;'O?9[xWd2aZ),,iZ7J|Av}͍!2?0oKMM <*QVVg>wEŋFzzzhnnȿn2adggO~??2tuub\t:Yd 'OcXj !2˗/g\xm۶q9*++g>׾59s̴nD0Z8w ,ݻ)((̙3<ۿ<UUU477Gcc#EEEx<n7.]2v'?Ajkkٰaկ [ X,hhh`ٲeٳGyk#===SPP@[[]]]Myfc444ʢEx0̛7KTTTFSS###۷}s?jRQQAzz:`X,Ӝ;w*֬YCKK ]]]"I/^$33XPڽ{7֭#x<8N\.px<>f۷#2wq\466R[[˶m7a|>?9qr˄vuu( _w˅ 7oބ,Y*۹A4M;zjjjVl6wfɒ%h%( [o~6ٳg dƏ6yB?~ɹsԧ>??OII 锗֭[o @ sۼy3F^_ł,˘f233ٴi?O9}q ^w!~G~ZZZ&(¯k ٰa0񬶞_GW_%33x<)W x饗ؼyaq^}UrrrF PQQ>)dffs뭷/"IUUUDQl64!tϚ>ʪUXp!& *ΝcÆ <FJJJ&9s yyy\krBtgEeY̙3\t{P(D 9p!宻bϞ=ڵˈzp6mfQ]]́8<6l@ @('9rUUbtvvb6ٶmvݔ~z,Y;C,C4:::H$lڴ 6||͛|/]đ#G(++wJ"0,z(//gdeeQ[[Kmm-.0::… Yv-+WM6OSSSlr͛ Bx<)ύD"tuu1445W?).W&0;007MN^wuux?>؝ellH,wyJKKq\Νcxx^࠱ IrÆ Ȳ̢Ehmme޽HDqq1 I$PgM0?fzpbZ[[9s I cǎ122… L&|>,\\jjjxo7ϊ+Znl67o6&^/rm[n,6oތdiw8N2{<痢p_^hFzz:wq`qF=J0˗n۸tRYYIAAwyh6$D"fc``ŋeڵ{x8n Ԅ5\o6֯_Oyy9vq ?0NNV+.2HOOo nv2v.^Hss3+Wd˖-J4eÆ vyww7?%%%/_n캗<#^E(bɒ%[Up؈GQVVfB4X4Z[[ =3m6lذ 6 IVUUEKK ---lܸM6b޼y\[nO__vYr%D"#@ >8 vÎ$A><8@4 NqqZޘ..] @p&fEQIjkguTUϦN&l~Aˡ( h#׷@ W>00'ZFJNN6^N:,dgg3::ʉ'0<<̩S"//ψ^__0\S{<#R\wJSpYcqIzfIOOsΑiFq333b455i\p/mJ$ԩSdgg*O6gddĹsD"D_dffNi+EQi]zzzd2x< PUgF^^{ٳt: X,F]]c6ill… dffb٨… hFNN9ݿ?W77 ƻ@SNL?qΞ=Kkk+Vh4ʏ~#===455EAAR˺w^.]$I̛7oz^N< ill$''O~E455Q]]=sq\?~J7XӧOE~~;ϟ?o 9qx<0N2-2/^@ff&={x)¹shmm5dQ 2zGG?L$ٳHNp,X~3TUرc̙3 K/aؿ?k׮59w۶mS#Y;v>]voӧٺu+CCC3<o+W`ٳz+[oEmm-}}} oRTTlvw^B?E49իillgeҥD23::J,Ӊ,HD^^= bhkkUUta;w,XXP!;;׋T]CVVO?4,[ ߏ套^b9rNd ʾ}{X,7A"6f3ccc8N CCCAΝ;7ǹszKWW}}}믳{n.\nrssT]cccdggmׇ$IFbn&H`Xhmm瞣.]D{{a6Qsؾ};CCC455q 1LHdsǎ7 ` .PYY"?e~j^~e9}4iiio>hkk#''gyIxwXl?O 9r"?Ι3gv*/pQVZEgg'üX u>vvEaxx z{{|'?a,^p8l\.4xbzkdddB{{;w}7^^~e^/qrssD"G<?1k֬rrbL4M駟ra)++c׮]=zIQQo6gsdUUimmݎi={C^^F~ ݍinoRXXHff&~߈>F~@ w%??p8,˸n ѣ GZZ>,$q!.]3+V ''flBvvaP(UUU\t*N7ӧyW((( ==_ꨯ$ 'hg}˹sx7`ddBCCC^}Fooa8ݻ˗SXXho~y饗 |dd^z BNNo\tC*nywdff_ lsΑfp}[o`^{5A$l,477/~Im۶qmsN /|( |_vN[[16ߏg|୷bڵsپ}sqyV+ǎj~֯_O~.\`…xb.]Dss3O= (BKK Gɓ,[KMCC=/^eVZ(ロ&w؞={hiip`Z9~8Նn$SNh"#'yCC'?I(++駟6toyy9x^ijj 'x7 O_ s9Ef$I?9Vg}yoSRRѣGYr%f'NddYfdd{_!E8fϞ=1o<:Ľˆ ؽ{7pL~婧g>CII GRYY?Λo ~߱cQ\\̉'ؼy3wqozEGk1Яz=uRuV:;;yH$jȲLVVwq=gϞ5'q> ֭d23f ~q^{5ذaô_i iii~zzzX`΋/ /p]wQQQ$]_立J>S\\%++ex<Ο?lfѢEqf3& Y$MFC=իYx1=.H$@CCLvv6ccc466h")++CQ Xt)k֬ѣn###F6gfSYY <`x@rU74Mc޼yTVVꫯ}vVc2|,c2PEQ0͘f#>~O=E[59lw=ݟq3 555?dggh"V\ɺuؾ}q(ӟm6^{5)//nqq1TTT|r͛gE[$ χ磧FxرcK,5kt:ٲe 'gxxu><~O<G%r=P^^Ν;Y`Vb,^e˖Myϝ9s 6CQ\\Lgg''ٲe ϟGQ#բ.]}݇i(¢Eظq#-G5.TU5l6( [lѣʪU 0LF񸑪/U&t9㙤ʄ~.Ww~_PZZʆ  }qN`*W4].tttr(**bƍdeeq-a<;wdllϬ^vm;<3TWWF[n!??իWm*`fZy9v/& Dhjjnzzzq:ƮAWW---\..]J<Ahoot0ַp9{,]]],[X,f\ѣGinnijj0>-܂$ITWW›ol6&s===477 &9ub-2V՘2ywq݆KdâEɔ㡫Kˊ+nÇOUUxp_bX@ [or֭[GVVwy',sI =+Ǎv:~8.sZGMӰZlذ0:֯_o .Kr!^qmVVpTZUUexxe˖CMM w}7fyվJ.]Ă Pň7˜n=,]<-[>9(pysթ-[F]]{%??P(Dkk+wsNٰa999ٳӧOj*VXÇٽ{7ϧ^z-"l6vMcc#k׮e…D"W6y^N(###̛7Iu6TadY&H 2v:::ۨ!ҥKeESSK,aX, WJwq] p\IKK3vrssK]u9 FPm۶G]]6mfغu+ .4Ɗje… ]XX 77K زe Ɂ7 e˖AJKKZ8N/_ix^nj.¿-ZQ]],ˌrJ,Y!33HYZZJ<' lwHEQZZJgg'[neTVV… ٲe A4M {Yx1tttPSSƍYp!8N^˱X,\.|Arssijjbxx;3˗sq*++q} l߾*l6XX)++# =Nl… D">On 1f"uпEn y)))|[?3/J}fffuЧ~]M~?w%$$p/0::JuurĉOr-$:`#Dl&tRDDDDDDD~?пDTb47}=U%Qǃ~Pn}r\Cx<$R8|0`'̓g!4[E(lAERmjco[AsA!}B|W5oPȓ"}DDDDDDD^B6gEz,--ƻnX1WWWx<ۍD"rWVV6*v\uuV Y[[jf~SQL&u䘾x<"% l|Y뛈Dg~@/+=dgq:B܃AŰ~CEDDDDDDDD$,;/("/d>5$E I=~*?K~2XDDDDDDwVqDTb0Y  q}$ &Y^^&&&Yh4R顾JEdd$`Z?SB̕J%]]]rX,,//SUU 111\.jkkFV鄶z NMM n$innD{0LjkkDT蠾5, TWWݍjNSS(JhmmE"`4P(Z!0Om\.FFFVxijjj'** RIgg' J<^4 2ƈaqq2 >>L&TqJ)9˅VԢ[!M[__ghh^/z<^}ttT8]]]OY[[ٳ|.9Qԛ0Lܺu Ӊf}?N'PYYFT\qtt^LNNR]]Ą 3B[[:sIMLLPXXHVV֧=%%%,..tuu׹r @irrRXSEDDDDDD>?\t K^^oߦ DB}}=;t:ܹC||k׮iW\\??rz=SXXHAA PXXHtt4x<ݻ!<>'O~.1ӧO'&&_0 qqq|f׮]~$ $''Gسg`p LMMy9CFrjXGUSRRػw/8q.m~VWWq\|'B8}>??a._LOOuuu|{Gww7JKaa!ODp\~F+WOS^/ Ʉ5ܹsSWWGII ccctvv )J78\xy eeeTUU122¹sp\zueamZ^^fxxxSػwzr9z{{Ν;ܸqM ~`ff(>Loo/SSSzr sssr|Y]]$HJܸqF:;;|2ߧ@ lnnիRdz }/g}}WO>xbc4yW9wBhc ||3<+olQIDATlpEسg=<|9Z[[QT$'' xO8}4 1Lر N:2H$z{{ٵk70L~8vR)v;t:Ƞ Át~a/J0BLﳸ5*++!22o|PVV&"}}}ݻwKiLNNرcL&ȑ#l6\^}UKJJ"??_ S H$DGGfjrt:v!B&o{nrCk.N<餧hoD^L& ~mfaa9FsqӧO iH xJKKٱc|>IMMW^2`0ЀaѣFRRR%<<Çsidggw^:::XZZvt:LOOcy!$%%oL/`LFtt4XV߿/qvRɁQr9:?YZZb~Ν;oM- ݳgGayyYxv>|HVVַX]]foO '>N>NbbpB!! T*qttt|e `<""">m(<<==DbP^^NWWצgenn2FFFZ@.#H@"t:yDFFJHRIII8qK.=!m68r`؇;@pcz=>l歷"..&9Nibcc f}jy<t:111HRƈGբP(h4|>qqqLMM 6쐬hff&넅qaN'kkkcوe]ax7dBh7M|>}}}T*H$aۉaΝoZ!??J*N"##$CNNDGG#Hjk.VWWh4뤧P(jO~~>iiix^, eDZl_']bۅ6D"~t^J􅅅gAܸqoof^̖렇?G-|>͛b0ˣ@ Jӂ!yz=o_$"O cDDDDDD^^B٧hNRhܔVԝgcc5\"vx<ϝ&HzHҧP}E"x0ﰰ0^}Uuzg}}m< B^˵MLq<]llleޯt:ǫ-|kކ C!`K#:ݚ!"""""""UMG0$,, BeKҗ2]*>sי|HEE`8,--a٘AL&2J7U~|ȭ[|>555؈nTVV244Dyy9op??P__餺;wp8^~:J | CCC\t ȇ~6 ݻwYXX… 2::˗Qդx(++.=D"accjn޼x<f``7nDyn߾Mmm- ###z~?ϟgvvv{ۿ[ikkTUUt:qWxhoojAY]]euu5~k4/`}}Zͻ!""""""""|AAA'&&\ڨGoDww7.;wRhllj zZɓ'JOfqȑϜPcR)'OW^A ɰX,;v RI0$667x r92{) R~"##9u;wDPln l6ގRDѐ NHAPpqzzzضmwqݸ\.N:%f~webb2\"W\Ç444P]]M]]`hh_H$$ @q.^( DFFr ۙ[=wX,r9:Rؘe}vA'<33mFbb"<@PPPɓ_h=$ ܼyp ofhh{Q__|zb.q5550;;O~>#<555LLLj1 _>V)(( ᾭ`?cŋ|LNNGBBo}Bsss|Ǽl6QnKLNNO0$==G oơCY0ރ @`0H0D&1;;˥K7ILL̦>_}Uĉ\.n7RAx׈"+ehhj$&&L{{;vۍ n7& @Ш"//oȽ{#e~~Aݻm$%%BKK v]vqzzz8t 333tuum1`n Z[[Ql۶M˶X,dee뷺vލL&^0~? '[Vrl6)))$''DݻwWWBi>|eVDDDDDDDDD>@N&''h4V9rguusα̶m0LѣGimm*~?~zijjzjѲe炙sA466VYXXr ;J%+++n项y;FTTx<&&&: ƒ;>>Naa!eee,..v)--gVR)VKss3[zO_BJN $ {b033C[[ݛ<ûaߴVqM***X[[n77D4 Z$nii Tfd2j&>>^{ @rr2.'OngeeGfaaxx !9--l6 bSUVVVHMME`Z*l6~?111d2HOOGa0zR)W;**X$''ݻwP(C[o ŗBBt^/777W_\\D.[oaX^^fuuW^y;w1 dggP(bx7d 6 J%;,,hbbb0Ll6 V$yy7HJJ*`o>RRR0x^^yJP`0 x8CLL ZM^^fѣGDRRuرcp Jٹs'ZVNHT*!`0N=^r 5fffѣh4Z[[9r,,,xxWT*IOOguuUǏB 55XRSSY__TQ"qzx"++T0 !܇% پ};dddlw~"""xPJ&4O8n\.666~t^J􅅅gA\vE9yV7yQ:333[>==MLL̦p`0ȝ;w6s۷B?~\PJ:Dt1 8NJ ԝgmm5>me}wݸnVWWv7U{x~_~~y,x<ֶ x<>5#>B _s,tB}VDDDDDDDDAyY#r>Bwoe/e;!_gB!;Toy#**ꉊ"_?wEw/nk1y~PZSsuJ%Uhii`0A{{;%%%~V+CCC377G||<ۋdRZZJSS*JЬ~,7n`qqԡP5sRI]]weqqu8HXXQQQ455QZZd"22x X[[ҥK477 UݻGMM >M!\v * iL&{.vJKK oߦU FZz !FFF&..3$su

sssގN#22R\\*bT׀SS tݻwzq FFF ƯkA_bISS~X^/]]]$ ru:\.d\.ZZZiY`0PRRFbNKK ǎpt:d\vy&тxqq1gΜa׮]PRR‘#GHHH@&1;;Kdd$/^dzQ78s d2ڵk߿#.::xt:uuu( EEEr-DDDpErsstBe2uuu1<<*G"{,ZMTTg?bAMM ݘL- @ˮ. .\`޽\|lL&"rrr}`www{nj5455k!ɾ2zDDkkkTVVֆRdxx,--QQQ$..nA?==ݻwbֆ\.glles&''/xhjD388 MMM sҥK를IAeq~j5uuul6QT!zQQQAzz:.ܽ{h,VwIDDDDDDDDwy Ouäcaÿh$99N0:u L__ HhiibN?f?NLL 橞4zR)&??JExx8&T* XV?Nll,( IKK t:j5UUUcHMM%<<|Srgg'kkk QTzZ[[jh4l6}}}a4!99cǎǶmx뭷|\.?NJJ jiٳgq:q-~?׮]f*++>`ttgJ ֋/Rjr5p8;wnˋ]eeeqQt:^\.0t:)))h4p`0ףRaee'OnYoC"Nyy9QQQ( ݻG?ݣ]ã3gxhjj~s$ <$7ӝ;w?9100ŋatt6F#6 J:mmmo~>})׹u?~(4 HR|MRSSyVwADDDDDDDD9;$Ɲ>} n޼JBRVfo}[344$xX_{5`ffO{{;s5VVV8{,wBRd!(++OO^|2.!?JJJp8LMM'| :/_fmm! l۶Z9z=HJ|>~p299ɕ+Ww'- bX8r۷og+xJÇ"Ğ={XYYyQl6l6===,..AXX@LF ſLLLHKKTVVsNZ-wjd2333gϞ-Imm-p8|0'Odzz666:>|pjOOOjT(d"--mfCQYYVh4 G.c0ÐDo!!I`XhlldH$jkkiooPT~?>OԵ=S qiiiattBAtt4 cǎ~666xq\dddꘘ;Fcc#.\JE?\.gbb ?---x^fffp:TUUC[[}}}Ri666ꢳZfggy7Phpqq1wf`Y^^tR]]oIIIHRr9\xk׮t:|qzzzh4B+@nn.CCCFT*p%NdHRR)2Lcio߾&_‚>D $$$ JQ8Z[[)(( 22XٳWBV344RD&G*277{ ,,hj5OF"@RRSÆn77od~~fggF۟{?1L ͆#66ML&jIOO7|xt277)))s1HHH@Tn2% F68tdn|ٽ{7?,&''?GV322bAVs.<'>5}eeRSS"""e!SӑN ĉl6cHOO' Ajj*JXf3XVAMdd$ e=^,MRBran7FL&qqqfT*111fjNZZRp\X,N>Z>GT 1޻cj5DDDobZ#GK  && r9QQQl6J%O<&[RaلLXX;vd\.R'ObXr9~ˆ`0p!233QTl۶ &Dzj5@`0HTT;w$33\rss1L$&&)̭t }P*?W2xz虴X,8qTJNNCӡINN`0hHLL$33@ ѣGIII<']bD"aaat^J􅅅gA\zNAA?3!t\Jibbb6i)p)..f||x>qg DBtt4N /Q]DDDDDDDcllLpB&NRh1Tr.HX__gcc𹋏I$JZE^.]nT*V73˘'":n Bhx<d2r1p~Qg-xhTJXXsy{E&y<zK.H$H$@?`(<^wS3^D>̟^}|Y|V*vzO}>`H& = T*1L//z@ Rgq: qb04`4*E("n4)"""""""""/˅Lw/묬lu3DDD^`mi|>[n7.k+gX^^fjjJHGyV^/,--= 8N1CDDDDDU>|Q(XVN'7oޤ^^7ox7n055Ebb"ܸqNF#7o 111Bhz(>+>;;+T~VB̕J%UUU4V||< |'͑EEEF~?&R***fmx.--q9ܼyRl466RXXHMM N$ʸ{.DFFr]Y^^&..N Um166f{\ZZ*\~.Ar ͛7{.'22`0ȵkfy]]]dffP(*[)%rj5|hh /Wqohhl۶~O>4C ---ܼyH$PYYNCTR\\LUU 3 \r4 )//gbb<oߦNƍ455 .\`dddr(,,FDdʕ+TVVR[[Kll̃HLLF#s HJJb``7n044f{vΝ;ܻw׋dիTVVR]]by"zh4O-෴ĵkhooj>5B7nt:"⥳WRSS8WrKEEɧQ]]͝;wX]]~7oRRR /^vA.l|*j\.jkkzqUIHHʹsؿ?nh4'PPP@KK $%%Mww7󱺺yWPT u>|Hww7ǎL:33fpbccG %V˥Kػw/n2, FŋܹݻwyWINNF&BLL |  &ڵk\p`Xxt/_fΝXVF#۷ y&w~ˆ=wPפݻwozxwسgX,'B###͡V9~8B322P(ܺu~dTUUq}n7.]BՒ@}}=󬭭MCCa69<ܹhy&X,R)wޥQ{QQQ[o CCCl#$"""""➔Dff! <<DOO---L&9baxxGTT^L&  ZM[[&N/+Hطoiii(Jt:]vP(DGGsA"""MRR玎<{D555h48lFl}okkg!_ֆhDbX`61LX,^/Ge``tN< <.nXse$ TTTj),,V***A'066իW#22(׹x"ZxRSSv&}CmFAA;yz-`ضmkkkt:4 (JRSSĉ[sېH$tttp}jǽ{˨T' Μ9BrJKKՒL&l6Ξ=ns ==]4οD9r嬮 nAS`H*Ovv6rYYYlllx8x FN%::\NBBܺuEݍN Պ\.nc٨:f ͂$` ,,>`0Hbb"kkkdggc49<@Vc0蠧vdmm Jcc#<1!oMM DDD%55'9r>Mr<)'&& $%%188Զp88y$fXl(J ;wtddjjjhjjbǎDEEaXHKKCVHrr2 VիLNN,,, HZLOOsMn߾M[[JRXSRRX\\ѣBgǽOF*R^^FAz x<, d||N<ɿq^/~^v;}$//O?jOT8,sUSֆjQYY`dd+WX, kkk\z%z{{󑞞1==^//ٷoCCC466%ln7^ߏL&#**"==M}X,϶mdϞ=gd2ضm{d2 IJJ"77Z[[gttJlb000۪ !|>x^1::J0d޽G^ݻwV(MMMt:a<&&&C$ 7< dddGUU۷R9|0o333ܻwuNAQՄj'==e"""E@^\.<[IF  ''NGuu`61Or99|02 - (J(..7)JnՅFӼTTTv)((G?8bccٿ?qqqtttPTT===BTje2::Jcc#ӌ ~?nRI0| gcc۷ATTi&;;ZM__3>>䐔hjNrr0<Bz=|G|ǸV[_XX.?'XZZbbbAYY]]]466C|>Y__V_A~~ҥK\~$n7"ccc8ݻٱcZNgϞܹs'ի|G`4455+(/Fpy>#DžpBD"C377F.^"2LxOC\.GѰL}}=@բr֭[9sxjr&''GYfgg)((=$ZJ[oD"Vw2??Oqq1TUUG}}=Ͻ+++(JR)/x1LOOoU( l6d2aAJL&ȑ#a4پ};*j#!}SN1<l!<Ν;444FA&q)rrrHNNO>a}}T"##ceeFCuu5EEEB?#""K"T*p@QQ555{ÇyZDFF2>>.ܧ={PTTĵkسg9sFhwRR?gvv\.\@KK˦{^[[ˮ]' k28pxTBTbXH$˗'Jܹs8l6###ۜ?!xr:+`6j½ijj">>^ȅE'""""""rMM?`aa app`0Hrr2z„bZsss je|| l2<>2.666P*dee,lA&''Ex^RRR0 DLLj Ō j5\.l}SՄ399baeeDV^HZ[[GaX__gppTV%66a###,// EY3BѻP¶maffXX[[caax$ `4III>dddP__/$a牏f >>`0HYY۶m#!!x􌍌mP(ܹs'O ǡ1 BҒp `Zlܺu,pqeff8n7333$&& (JRn ɂL&cbbӉj{N'JXXZZf ###( """yaATb4x==->;w099nf)..<)))8qB .""""""""r033Cdd$aaa~@8n.pD:n^z% 0!e;T8T0@(Dd}}]Nx^,--̸ ,-- ҄9JR8 eo"""""""""_$ KKKO5OyބxC Y~˚'xnUe{jc'T{z^Լyj?aA ; 2?sי5!yv XAP/"""""""xgEDb۷"_s SSSLMM"/ MZkkk[64eL~?[.*"""""w?5|>NΜ9#4v^ʃh4R]]͵kX[[#11\IIIqZ[[`0z*r^/j >CLZ[[CPT*)//͛<~!ddd0??ϵkרB"`ZŋX,>\.~_Q__d2QTTĝ;wXYY!!!as~~w}D ׯ_׋j޽{ܺu)㩯ʕ+ܽ{AJJ 7oΝ;(JbbbGڹ*ɇP(~LLL099)TS~#))+!'r%0ͨjnݺEii{uJKK{.zǥKhoofG}DUU---P(p\o̘B>qctt3U䟘׿5z8}@{V_߅}>hrn߾Muu5\..\@cc#SSSrINN,// zHOdfffAP<@VSUUErr2RGee%EEENW؈cyya UQSSLGGጏᠲ/Kjkk3::JMM MMMܺuwىʕ+ӃN0Bнzww###X,.]Dyy9űDCCB?NYY)))477SRRBnn.\pX\\B^ cO~ꘟ$5===\t\r9ssswYHu"TY ={vLmm-766reIJJzbw.\8j5ܼy (..Ӊl׿5Aq2::Ç9vg e(++CT$=z  &O>}!Hb磰7osNVWW7 ==L#)) .)l8}>W^u_QT( 4[[[1<ȕ+W(((n244ĉ'P(BR)%%%Յn\Y__GSXXHKK t:n߾-H.UTTԄh_ j5%%%477c2t/|?nyZZZ0L[oq%rrrHOOjR^^ή](,,$..>Lbb"q d2W@`yyY+ X,%%%'Ry&###RWWGcc#L&nݺEQQHRn޼Igg' R^^.0 ]z&v86Vyw&11QGSUU`F~Yx@6!}cvvÁdeep߿fƍh4)..voAdd$r :"FFFhiiСCDDD>|QnݺE\\LDD)**ȑ#r(--fuu7o/~ vM~~>@鿽{n:TuD q\lll`4GRWWǿt:;;w2)N , Hvv6B6668{,wx܌DRq=f3<`TUUGAAwܡd)//7`ǎgNQQQ?Fq !KrjF#eeel{ENN%we~~N8N<.{'Np=Z-rpաR8|0 pvMbbP3pevASS ZK. ߿W^ԩS\z۷EII NxL&Ԑdڵk3==VSNq%p~\uX***8tWZDDDD1?5=..T( "HNTT{l63>>.rݍ^r ^eyW7ID=d"++S DΝ;X,rf3:d2`(vE0bRضm&`KK :шlRj5vBR6MMMd2 pNX,t:Z-:taxW匌p]8S|ϭ[tRWWGll,nb``N***m"&'')--%33L\\`˗/IKK#''+W0??T*ٳ[ޜJVV>XAªp fUbccٶmP= ֆ\.f111ǿМ{H$inn&-- H[[===TVV211AQQ ɯk"""Ν;TUU h4CVV|GB˗/;v4.dddj,9zZܿn7//_F"p---}v._,ܺubܹ,>˱d2aJT*, fhf3r>JJJhoo'22W_}_ݻ9#HCpPUss3 ;;7|u*++ 㤧J묯HXX&T*ezz;w066D" hV+&X4 333ܹs:onBR{'rQYYƆ^^^ؘ )((`qqa8z(ASUUV%>>H\\@ @}} 8>1<<\.4,--+UUU0??o磽E]]]  444p=XYYauuϓ& yyyLMM s֭[444066Fxx8r9Hii)$v;W\Ç133Coo/eeeH$"""AףjY^^"x!T*֭[j""" %%bB"T*ٻw/lllʊ=T*S8)//D%!!A4EDDDD+3/ӧOjyz^>Mtt4@ss3'nhiiavvw^277ٳg9v&]7;444ggA!yLtt4?G~R[[ᠯ7n(.B蠥Kjj*?$ t:տWڵK0뉉!::0pƨ679tذk.RSSٶm;v>n FVvr ro "Hx ܪJ}!h4"gzzzG0 U< l߾ݻGww7A>7M}6{Cc!^GѐERR. ZMTTZJl6 DEEmzfBT^/x<rVKLL LOO3??b6===|Bc5??Onn.;v`qqGbb"鬮FXX* JEXX` mXX. x9CZZ~6*JA^[[qu x^X__>/$o>N'Omobb"w?S9D0d2jER s~eeE\L&w&++ RIkk+۶mr ~j;voͿaΝ(J0˜A ۶mٳx^oNii)333,..R^^4V`\ٽ{cǎ'PQ( TWWD"n e2XXX)&''l6GRRx<vEVVRprrr0(JanT*J%aaaBtᤦ266&Ý}gddYJMM h4$//FCNN梨T*ttt}v:*#"""""|HPPP^mN:Łhii'? >۷ u>"}}}BV>#킫!dmll<At  x\B4bXX\\dbbJERR ’C2kQQQ044h4ZXX <<Z-I T*'`4 2??D"!99Y8G řd2H$qrp\B{0dnnN0CJHH ""11 _,l0X\\$99Y+x<,--aXJ,,,V gnnN_y?v;* χF1я~RFlfrrCBB`Z1/|®lfzzi㔔$\ALL (z^((477Gxx뙙>==dbii (z^Rs LOOcZY]]eddD0м^/oɞ={tbZt\.3::*DI t\DFF222J"&&Qֈ F#xACF&** b׋G&122BbjennnS@Hf-** ~_ p8 ͑ xTJ&`ddχV%22R(t:Y[[4X]]ettFCRRcl6vc6xdff8j$ na<xbnn#P1))ZDDDDD333t:„@ @0dyyۍhq2_T~?2W^tr!vܹf7П'!}+uЧ 1??M311@JJ Ǐ< Q^^N @.sԩEy@MtvQTTE&q!;"hjjxdĞ>}F<|mX__P0srrl/YD"ȑ#/nb~o=y>H$ GT PY˅Bx@neggw(1d}]x/_6|j"""0͔qN'477sEIIIatt/؈N#ZVWWIII$sVWccc( B۷qCCC077ǯ~+&&&bnn/RQQ'>> >CbbbNg?#..~P__d2qUn߾n'))iS4OA6ܽ{5(//ŋHZZW\L&*++޽{dgg#6155SuTWW FCgg'ϟ ɄZڵk^Jqq1 n71ƲOyy9P(p\oiB>qBPаzȗNO+**uyyyttt022immEPh0˗/-T׿x"w.]DYY.3I  GEBB}ȋ$f4v#ɞTǎ;t@|._LTTׯ_6nBpUoՅn'''JÇ'!!2|MP 4Yoo/GLxݻrRSSs^/:X.\}PTaXIׯSQQΝ;Y[[o|dddz\p A Z(J666(,,СCt: njk.233 ::eyWt{a~~311Q(BR)׮]6)--ER!XYYAs%EsUz{{ܹszz====$22JEQQ AE򸁾NRRv&f3|撛Kbb"UUUpUoߎB'Nfdd'N2M_=""%\Bcc#rVV+0>>έ[XZZBp @ @ww7ugΜaxx-'Orr2׮]رcd2 n۷ֆ`~~^>˗Gד̮](8,--VE*N~~>avرC%"""""""{1?CBBtwwEnn?>...ׇNcuu9RUU˗xM__/_ҥK?D8fxxٟQVVׁ;}FFIIIhZ^W+WBww2GQf3PXX Bar9V ŴƠ77o4( F#1v;2kw^F#ַAPoH$uuu\Fk͛$''T*}6"3  BBhR֭[imme͚59s>֭[ǫ4tz<DZX,$''Jjj*;t:sQ"PXXHzz:ϟKeee,[@ 0k\MMMc-[Fyy&x<0:jjjя~4K@yf Bnjn,2.q555A.]Jbb"Ns=իr o&rb:;;q\dddyfikkcjj"8{,6|{&ccc>}WRUUŦM>1[o199h$55ȱcDcRRo/͛7˗E__`۱l̛7~jjjl1\t8._LJJ jb0oկeÆ 388fyVe2111( j5j\NCRVYp!G͆JB#p\D"lvP(\*N>^HONNb+ p8HHHMH6==d!h48Nj5pXrU/~\\Ĩf&_5G|barrH$B\\LNN2==MRR~}e2NL&0===!QBBJB\\v]th4ArWX-2::JZZ^ n|M^x,Y0.dT*h¬VQ(FIII񐐐˯hı, px^p8rz=V*zl6h"N4%99$q:dee000@0DRFyrB!qMOKKC7 o~xjYJO&3/ ?jyg ѣGq\_3GʟKf _%>yGGGIMM%4EQΟ?j^p"SQQ2\9 t'qģ"OMMa`JE{Z x$ɰ[ǟ`o~Ƀ[ d2I}&!!!!!!! ɘ@T~&h4\.|_JP(hr .WPS?& k(z(+?w{~D" ? BO GϳnQT BL&`?fÄz|n ÜnF$򇾮JHHHHHHHHVU3C߹;'}iσI8R=3+>^pܯ>if}SmnH$2ffGY%>Lww7yyyLLLosm.\vٳbJ{=RSSINN1/BNNv_477IHH`߾}:u gB˹sdggSYYѣG%''&ˉ'ݻwsIoKUU###T*gcrr]fK.SRRJd2h"IHH455j*ӉpI6l@BB*ӧOɊ+Xh׮]Ӿutt /o> dÆ /JB.{nhnnfllSNZƲsN.]DGGٳn1x}}=&n{=L&*ÇsEL&}0rq%9w8t-bb~5kp-[^… lٲŋC.mtw惡RŋIOOgpp/ɓ'C+W8|07n == . z*vI$a-s:+ b!))cǎ1=={r9?~:4 6/"ɨ7ӟ)ݻZMYY'Ol6ԄRaz{{ygٷo˗/gᖐyO5'%%Ҷ 1[qf"B1<<(nBzq8rMX,{k2B‘L&p8 @NN:lQX#??ĜIIIЀhd…b.邂.\={P2==-2'66VVPV ''^hdxx@JJ ߏng͚5 Gii)* Ayy9===l۶p8ŋ)..qM9F#ws܌ L0>@OLL ^gbb nܸL&`0c=߼y^`hhvjjjzԐzpnZٱciiiPUUEvv6o&555dggى㡨'|R̫ wϟq:ܼyp8L[[,^zӧO3<Պj%++\p:hZF#2 BFA#LkZz=ZH$Vh4Fq\D"/_^Gp8HIIa#&&il6rXZ-6T☞p%$$$$$$$$ >UIMM `Ea6E^`մ_NGII mmmLLLSO=ECCv.\Ȋ+hoo緿-ܑN<ɵkר'~HwLMM뉋d2q!:::8<)))QYY3ɕ+Wp8,X`͖O>Y~=.\NӧfFGG BmZ@R /%K-]?v6lUVq5ӱZjV\sbbA1Mׂ .\ 3l6uV1h?&q\bcc7oxJ%\r#GILLD.sA6mD]]6:::OO,ב{Cq%6m͛7OJEE[ne׮][0$$$$$$$$$ȬVJX&aX|p8&T*x<,  l6vF#.)j5( \.5pw񐔔c||h4JLLgڠZ,1^W4MW*LMM Qդ~pGҵ Zp8$r\,@\Njj*~J%8af3)n7qqqDp8FfZoR$~$|ELp8~d2jZQ׮]c``NτaF#PłL&Bz4G߇vc6ll6"FQnGll,`ǃd}'''1 $$$ C V+>gllL`0 neChKLFF `bbBArr267+111%!!A$hD|>&@ @(G4errBB VE0VC*xvh)cq\Ɗjvbcc0gqx^FX, )))|>af#66!yF3ŗ qFAfeTa2S@"%f 'plذ.3S@*̃>::Jjj,6R]]駟e9{,qW___/f|Yģ"OMM)&~ߏdBq:TGNp8A2e|Y!h*Y4wk8 Hh4z?ֱu DBBBBBBBBbnDR}&#\&FD"_2 χFykd2^W4[8yT*4 *jN3T*j_a}SBBBBBBBBߐdKw+JC7/\H{6qcFt:SwӉ^IUr|2hp8B rѨ|* ߹[Cx~g)YZ ̆۝iJ:+ MfLg m##NS/˅`">Ax>hfass3]]]bûg F`0H("&&'O{nVZEKK ===tuuJ("77W_Wx^ϟ/~ٵk LMM{n!55u=;v̙3۷BTr!***ejP@Gȹs#>>~1 9y$Gazz|ٹs'׮]ݍVɓ2k,o ԒA;wMQQ=d9sp8>,sQZZF!))˗w^HLL# 999 u&))Q;VX,#bOHH;l6+Wdtt ttuuqM ǎ-@P(eӦM000@?Νd2ގb-[GII &GJyy96mСCB!ػw,-\``pp%KwAZ4HHH֭[+z*6mZjlhkk#STT4K8bΝdff299Iee%ׯ_g޼yP]]M^^6l`ٲe|hZZ-͛T*|ILKDRuVX,ϩSعs'XY-PD+dhZѲin:Ґdttti&T*cTVVrN< /֭[)**(+V`…>|NǢE8u===LMM1==͞={}6ׯ_' qqXp!=6m{/0?T*?~Zp8PT0o<1L5//B;aT*˗/g^B4 JBBK,֭[\xG=-ZDii)6mBՒͳ>˱cirիW{, @5kְ`?Nrr2۷otRvw^FFFHJJb:-!!!!!!̈Û7o!IOOpvov `tttd|||6ƍݻ_|EwQ~0˯hioo: ?xnSWWGMM ?я0Lx<V+tttP__Omm-O *|;dgg EO\\Fłf󑒒Bvv6/iiiܼyJHH 77T}r9^XDQjj*f6zX,'VRrx<F֬Y݃`ؾ};ɓl6d20LjZBAbb" |>jkkikkaXe|t:^ ''^^ZZRdbb@ mHss3>)|>b}cbbXV, \.vxXB!4 raٲebj9uF9qnvcx<$$$KLL Blxի?$J_|n,¼Z|dffyfL&+(JFFFpƯ塣'6 )--%%%>N' +V_QRRBss3SODSS.K޸qE[0Ǐ:u[~f!0==MUU111r:;;$--?b?η-ZZZhmmedd,~rP,_!***p:Y`0{GBB'O[n#)//gbbGrHKKd2w^zlݺ@ >,+W_,Z+W;3<32xTRVP(CXx1ӉV%11QL/wA%''$oݺf)--ٳg9{,+W̙3a08x 񤥥166Ro۷QT<tuuQ^^~OmLĉlذVZ%OOOhXrWVGL( L&EEEv,X@||>""jh4Jbb"F͛7s)]ILLDRa0hkkcppe˖a6E몴4MnAnn.z'NFy'ܹs\gϲj*o~hӧOp¹j22 ł磴ۍ$b4jLOOT*C.lƢjq\\.bcctx^v4 bV +ǃ͔m6hFX,bi~?hxJ%SSS)  RD-CwU*H͆\.'>>h4f# "HLL$ nB]V+HDv;>` v7ւZ& bZtfbi<ZV,RT*`D D!cEWN$ a2$v.H$" Fz=P/ >FLL &I#!!At|>Z-@R)ȗI4ettTB87wy|;,X@0Lnq'ΥX(HA4 6 Bhn]UoB$%%t:EaX.Vzƕpw9w4 4l6jxFGGq80D?x3 *jV!_0DVC4jP(j|~qMD"vqt\xGܽ~ .An޼… E~#K/~t:l6Ӕ#5}"@ww7K.d"lOߏDR|# |>qMU(wZJ8&..Fux<'sχn(**5^$$$$$$$.bq8LKO&3/LQbp:TTTxX~=͛?03A@<肀>R!R__'bttl֭[7$0S@x4R)1ji[t:Q\o!Qc!rnGYh4n53yf5 1 s] AKHO>(Jje2h(yfY检`ztz /4N9>OL7FgJ"tJHHHHHHHH|}d>(U*_,hhP*ۍV}[ z zT*t:ݜ e`|_R>?%$$$$$$$$ !~gSwHD $ kw|>h4# kk&郾sBlP@ 0KF Bbߏ; ~j}vw ^W,S0 mgP=ܾ}3LZhϙf-a,zxO33w Uc1$$$$$$$ L& HNNҥK?G&QXXH__~!555( ٻw/GappsYSfF#>x ǎ|&''y7q cΝ;f ~ߐFZZ}}}(((f1:ݻ9}4}}}̟?V^ALKw^Ν;TVVr \¼yhnnf:t yRXXHCCwƍjFbddB4NdᰘY&7BǎB! ]sƉ^;wR[[`h4pyȑ#>}={`6棏>$\.۶m̙3={kעVs`ra0> BsAO4oj\. B655NAAo¡R(Ƿ]3BYfq:\p" pp8H bﺺ:Yd & ǎ;HMM'.UUU(JyDݻG244Dqq1رVl\p^O||<۷oԩSLOOSTTDee%{졳300{G}}=ɨj{=Μ9C  --#GpnܸAQQ=&'ObPTTt߱ٱcPYׇB!8Ç%9r'N{nJ%.J9z(Νc߾},^X m۶RvhqN6R]];}!oΥK͛;w,>Lnn.YYYM2 /Y$rΝ;),, DQΞ=ݻv9OoݺŻK]]qqq >***p\p Gww7ܸq>&ӉF={h4JVVȑ# P\\LCCo&111:,$$$$$v;Hd|(Q(XX~n2  h"ۇl'`ǎR[[__s*++kaڵhZ:;;#99f^u?ŋ1tNG$͛lܸ35LA566S[[B`ѢE( :;;ٰaJؽ{7W&##ׯc67o#G˒%K\|~2t:X}QTTDbb"prJ1XV.\c=Fjj*H3o<֭[Gyy9]]]044 o{%%%?".\HVV BL&wޡ:8uꔸ1`0m6.^HSSIIIH$ӧArm>#1EijjBՒL]VS^^ҥKS__~N8%KXv-lܸ}OHEE?ً/АU\V3o<p8FbccyN#)) d2222%`T*IIIc00ʹQVVFll,F;UUUfäj*dt ϟ'--狚NV易V^3!՝f F۷Q*8qYD"a 6~&󤤤sۋjett㤥rJ|I>L$!!!̹bRR 7ob z]Pp5%55}|(a||rssx<\|zt:׮][,vMff&Ӝ={>JJJXlcQ^^Ν;tpQe˖-rd2qףT*cƍ̟?222Xn[nѣl69|0n{FQ,^M6155_-_233gEz$'' 1׸MAA~80w@rrrebb| FFF&[nV 33aN'999b˻o̒P(D~~>.\An4Yt)6m"33sցj%.. Z̛7B!}ҥn:bҥKc0HKKc…¡Cظq#(l?PXXȫӧ,XTN8}}}( =իWBRLMM -blݺKf͚{***_%=z^xLN8vG__˫JWWH˗/Bff8].JgѢE;PXXjDŽf``  qSPP 3rssE.s-IKK#99I d2xbgϞ))!!!!!J3p=,_)fa۱lddd_4RVV֭[ի-n/*s^y1mP{߾}X,^uфQ0pjkkE+ /grE~b0p:LMMs">>~LMMuIII:0L166bAnn.[n%55YuFl6H$"B!p@0+5s%â_ZIMLL;Oaa!=ׯ_GӟP(p֮]B_&33I^^J7n(++hF0n q:|>n7+c4{*++Y~= j*P(ؾ},_p8,ƖRVVV%%%D \.󧦦~zT*YYY+**yt:"''͸RD&T*gQ|'{ Q(D"QNNfeЈglli1K\.GTncZ 255ؘfttJEZZXV\.A 99Nccc RSSc||ߏVEV/#gjjjVR!(^~6MlP(%L&V)D R)τ:99)Z%x^/j|p^Vu\.'&&Ft-ikkP(4B~i%;; 6|rnݺ\.OMM155%of `0C0DR~-[騩'$!!ڨc>ڵkl,[) իioogjj˗322$==]4G}4q?y$r\.eeeގhdƍl6zzzxgPTԄL&_&11F())r'0TWW˗ 1==MFFWRW}``F ,`ѢE8q<֮]Kee%dz|rQAT288H05_(JV+#Xh\.rssD"zW@̚5kP*hZ֬Y۷)--ETrMV\Ikk+YɢQae˖qUnܸ4+W F# 7 ƦMF ʕ+o!9qN_|\Ξ=˵kx'Y|9TWWSXXȖ-[x<+/Lrr2O<3,Z/Hyy9l߾ .xطoZV"ʕ+\~ f_΍7X,\i իwFFF$11Qojt:<0119@|7l@8( /&??ӧO- LLLNWWK.%++۷o[lSYYB#99g244Ė-[D,Xd 2o<yHJJ!T*|>顴qP"r9:ɓ' <3TUUyf4 vŋSYYɍ7غu+˖-KKKyꩧZFmq:h4C- 111Qճ,`P8A^ o?)2 ZM$v#PTj|>` ̾{x<n7fYHD ÄB!ؚN35ccc$$$R|Xuf "[4ettTQrFyOaa!.K<ܚ ɸnQ[DzB!T*111nD^5iiib{ )o|Qx^B8i2(vzAf>Ol+a B$V3H$DR`0T* ø\.1]# X bP^Bƍӄ$XRF! (ZSwpܙy3Uhk0jX~a^sAr Ķr}a ½fOVEff[) @JR#Z-`I=)QVj|hZ1МZ%1q{FӡhfS@;zP(7q~7ZMBB¬3*?Lf _Lr8w>kQ)\Ah4ŋ [n߄ \cccd2233Yjt744Dcc(ܯ_9i?Vf _>55%?,{$o G%L&tVނV_YO!'.jbEQ&}wwلTT=>-W" $ a}P#(5gЕwQ0ͻ_tGll0ZGf#[0_hpσ6s`5MRD̩PG)7P(o<(J16΃;P($@K 'B ;B@+/tκ&t:?Vz$k#@~Fx<1XpPI Dsp%dfdB@u|8L>ݎ0*pm PH7uDxvҠ Z;;ncgAGG= %~gbpƍR`0H[[}V&&&]Loo/_HYi߄fwirrY6s188(,a L>5ڥK~?H$BFF;vɓ`N:ѣGikk#//a|2>>NAA.Νn3|ؿ?7oޤV;ނy桃RPL   }}}:tb( u~̌ ̞={Aa4O]]r Ξ=Lrr2|455eǎTVVr֯_Zr9 %f0?r\c4B!oٳgCJfs4kGajjL %'䏏D"xur92P($ a> Q ~rP(C&c* p8رc--f5D"!ͺthiia``\D9%uGeyꩧؾ};&f~p90UUU'?͛ qFT*׮]f //ٶm , >>~.u7nL j̆ GTd4 lذZMqq1g߾}^\zzz0̛7͑#GbńB!Z[[y'Xp!z\VZ?>ÇdŊdggc4t|>n:V\IWWK,a``qO}G}DQQ%%%dggT*2zjjj}6gΜAz=>---Ԑo[D"TTTP]]R1===Dضmpp~# QT|tttΝ;~:H:Ν;"++Çsv; ۷o3>>ή]bG}Dcc#O&''G̡pYvMcc#ׯ_ŋRZZJ]]'Nl>C.^H8fll ӧIMMh4w^$vd2oHMM V?1~?cccp%233ȑ#\|Dњ'++ K.* o`0ȱchjjB&hؽ{7555d2ill 6qbb"/ύ7z*1::ʡCpL&T*W\3==M0{~!K.`0t:ٶmXfG8d2k.BFvE}}=SSSz!^Jvv6/^DrM.]D^^---8pZFFF(++!/!!!!!!?=&&Fܘdggs-fppx'dttJV%!!RRR?l6=h4}adnݺE4 BA\\]d2ҥK#66;G0$++~F1ʹ%,FTVVA^^h:)V/**BV9~srrHHH`ddβe˰X,dddV>F#ͪs$axx͛7_1&&&"77W^yE|f_˩SHOOg3 f3/W^6N۷oIii)ׯ_իaV^+VujqTWW366Fcc#}}}зm4 ̟?gy{n Ü.<֭[Gkk+|[FJJʧ>777s!^}Uf7q:ꫳLk׮JMM (JlSO=(ǏoALLpó>8Aqbcc `0HHH`ddQ~?999qFf=hDJJ 񤦦?+`Z*E qbb"&zExTl2##~zN.w)++cݺutwwO? ' ڵkd|[ߢOQQJׯ )))HB `jj@ fM 3bz ?I.hDP>_?fOBB \vgϊ`>dL&Ctl6c6abb>@bb"2LXh4Jbb"=:$'2h4J\\FV+)m.Fir B!JKKIOOʕ+nQVVFOOoΦz:::?>7oZB7o& (}r)8v?glaȑ#d2bcc9thɹse+\xׯ311ANNwcϞ=X1?e˖-a?hd߾}\r4ϸnxDZl8pEYYIII>|aj5b@8A^j===;[e˖1::ʻヒ^G_.J"11ZJ"##C.]{r-|>z^'''#%%Vy穫ƍ,Yd7\zP(D$aժUGEnn.$%%W\AK/000 \ [;w7nUVq5ӱZjV\S&aZysVKFF& @zz:f}zĿQVVӧjdeeP(G eoSRRBFF)))bL\NZZK.exx>{BZ&++ LFjj* t:IOO'11 Q^lk׮󤧧/sdffj*nݺEYYz^\ˍF#pyhnnvEww7SSS<hطoh$[&T^z%N>MWW-"--[nw֫˗3>>ξ}tG.]˗Q*xbL&,Xs%Ѐ^8hnnҥKAlق墽=Ѵv$ Xz5Ǐ|In7Rll۶ Jʕ+ZF233$%%lk'2*d>Y'jR띕MDkZ @@ VET #h@^/pGS Bd$pG.ӰX,t:z=>OT zARr9111bh4* d2:N #h^t:HdFKV.GD$ STb(!P pM$·PbbbfUhCB`tt'd2Q$OTjZfBr|ց j1^8lB[⽿L(ӧw߉.B#hg@`ˆvz$%%sLX#a~_CJ%sR) Bq.]o! RIvv τ! MV&pgwrCe\ ߵ2>O0/~>3zgN^Y_}f)j~ B`g e[,VX3HHHHHHH|G>55f{Q h4~nYSRh\LDV?P  ?l ' hÁdsO!o`[A=bF˘wrLHٗGBBBBBbdkF4Ba!*Sz S?2ނ78x<_h<p9@ s/Ődn|>W>n%$$$$$$$$gU׶W|T*GʹQJU"?y )!!!!!!!!ǒ |m v#Nn r NZ&ch4pv1L B\.1OxDD"\.BX׋`0eD"}9qݢGt:T*1xrxxz׋d2!ɰf`0<dd  #0 6BFJ%C %@&a4 b:9Z-QڵkfĀe_-~_ &-F~aNa8 H13 A  HNNg,X.oΥK|dffm6Ν;Ǎ7X`G̙3Mll,|SZZBs'N㌌`͚5s-f3ppq, -"ʺu(++d2QXXʕ+9|0 ,l6=$dggc4<p85kְrJXb}}}XV{|r6nHZZ7ogAшdŋTWWsMΟ?/ GIMMW={(߿DN'h4JVVC3tĚ5kMKK w9˹|Is=GJJ 'Nॗ^b͚5bz|mtĭ[xy&JӧOMWW555QWWᠰpVz3gpZ[[INN  9qccc?gu2S@ommD nr(--Jqq%&&vq\,_\륶WMoo/FPQ^^N\\b ɑ,&$$$$$$$$B>2V;}t233dggs166;C8&66Z͛' h 233$ wfP(GAA& /pdIMM%)) F#WCC .D"LMMϒ\.6W^ebb))**.8N*c4$##UVyf?@\\'O|_%& IGG6md2rFۦ,)((FFFF\lذaNI\NN٨j.^HSS/t:g{ܾ}ŋ3::B_|yuurnJgg'( (Ǐ>`q]~ B!] B [HK$i8v fy} >`0ȷ-d2KwmZ[[5kְf, NwZ- hkkZl6axxMyy9n)))!&& ~f3V(DL&fYLI&(P*~Q:..^Omm-mmmzM\P(7o?B %KP^^NOO:#@/^gaѢET*vh{D3>>brZ=`2FK/ɓ'Yn|r^yؾ};2 ZJbլ\I1՗]71,_SN <'?app:a=> C{{;\vM/w!==M6ONN2555M!!!!!!!!!qj~N>0fZx<,\)Μ9Caa!6m˗/Bʕ+Yz5jrVX UUU,[UV`>88ȁDRQQkSoBmۘfxx$BvbxxX hw!FGGϧ:駟fʕr6l؀g\z'xG}D(bhh\"nˑ<DQvMcc# .dѢE8qJt:O?4J+WOl֯_ϢE' vZQHT*abdV+(JV^ŋvSSSlذ… | T*gŊ266ƺub||97q?w ~wppK.ƍZOT*u555t:^}UL&W\-~PgϒLcc# Df lA.\@4e,XJϟʕ+`ppytR1.ݍ"++6^z%Z-vVKFF&:f!1}rr8VZEww7EEEFRRRXlccc(JăL&999K"/_Nyy9˖-l6kBss3D", ˗/G&q)bccٲe=&U_]fZEL&b(--Ib@ B< T*gRT4G& 4&JJJ" ddϔbCpX.U(aᰨm BbTeR)hF"@@aRFd23L݅lH$2n/A>;E/\w epݴ0884\.'QP}*Q̶yx<n7fY,K$Ӣ=ٶ`};hll G-ݯ’ 2::JjjOsׯ_g)A1͛7E~||J?f a3!v0ڻ}2-^H IB tfQk?2OW޹~c7P{ B&eN^|EтAH$ngrrLR$w T3p1y!ד{4SSS9C+L& >. J%m) ,1 ILL̜iiF}w7 bV'o<݁X.h܄j ǃ2 V^kd2:Mv?1E4%..nδHH$BRRҜn|>/!!!!!!! Tן*n, a?,z _u=90W) $7 ? ŗ# x^v;t:(6@ @RR χj%..NG0djj NGll,ozR)lh{|N'Nd" bZaV+PH t:x<NjH$f͍- `Ʉdfz' pdB&1==M0$11Qkr0⽜N'r@ll,NMbb"r 1Z|| a(++{6 |EjT*IHH@.}'(Yd2X,Nl\BJJ bB?<ɿF⺓x.r8?f?3h^L[[vl{=`:t1U||<7o&{n֮]+ 3Ӭ[o?Sf;|<77o[Ŕa李7oRVVկ~Ezz:4GJJJZ˿ J`466Bii)ZV,O[[7-[Jĉ466rUJKKZܹsF^{[n&77{rgyNszzzؼy3/'O$ŸٟaXn7O<]]]bm6NjXLFnn.FF311!ZLOOSWW'^˚5k;N?(D#`{E$%Q˖,YN2qflLݝݻswg7f23(qݖջDQNd]v9:)>Ι3g%uVv;fvŶm;6mDKK 111|;ʾ}xauuZ~gDEEaINNfyy z=sssDEEo"1"& FCtt4jZ\y:::X,\xFCff Tu#J(Omh4"X… ܹSpӗdµϜ9CZZzIff&7q8?~׋RҥK Μ9CFFIIIn[^^D"ȠTH6>>nj & b9rT*o388baee7oR^^SO=%XE"7%==RիWIMMe˖-J%6W^yL&MMMdffFii)׮]Evq$%%F0u-..rI477o>^yF#՘fR)9rDsz*"u+ǎC&v)..&;;~[Pp8HJJ">>GFFٳ\nH$$''Bss3F^7!B"D!ć `PȮ C*RTTDqq1)f3;v4 ,,,088ȍ7hjjprx<8λ^7 7˜;wG ܲ z<n7?~HġC d2ECCMMMpk166c=L&h4 444eÆ b0XZZP(TTTT*LMM122%11۷okEGGjFӡRBABrŠhP*ܸq~t:vrRP(s{=11s=ǦM(//g||JşٟzvΝ;A&aR)===DZz 333nfggq\FP(DVVǎcdd3gΰsN._dG}T^}U,pD"!::Jݻٶm333lBIXn_WA,ŋy%)) B!B!BN0DVT*ٱcǗVq/IJJbhh!^n7SSS9sX^zE!B"D1\r$$5r v;/_ݻwA[[EEEYv;*@ IJJ N P*K[v;9]mڵkyf._4TVV 1*8YYY!##~{1j56M@BBºR`2 #OlAOIIQ{1d|ߤxN>NRf3^Wߘ{ݤ"D!BO.Z,vSVV&X\߉D" "H ÖYX,| H$(TD"PJ*p:$$$ qufJ` O8Rڀ` _4{[[~?[~1kdmU*GJSS8N~p[c}yt:q8$&&_X,G  /b4ϣB$''#y+Hw?iiiBD"* w\ۆd2*JKKﺠ܍=b0g"Y<ڱ/ mM!B"DdzzZ0BߎfC&wM:BZ 5w,,Dv!nZ!ly֞va~}p9>kk7&K$ 1999u1cx|`r }:ַG?~ΰzo !;;Jg% zDk<ܮԹ]a0ڵޟ"D!B_fHnAX,XVRSSH$zQ՟"ÁT*E.m6"ݎL&,a!5l*Y͓r͆JB*޳lܡ0X;vZEزq_"JˊH$Ϟ"D!B؈D"P(΂N"ZO#f *} k] BuqB!I[III<_OGXv?!B"DCHq+_I?d' lH8&|]#w;E?an_1:Yo"D!B:s3}nb鈉! !%%(&bbbx<F-..jJ,,,INN^Wg=d2ReXVV+Zxc~Ʉ%99BjeuuU('\lx^tfk ,,,H$baa׋^GRa6YYY!66Nbaii XLll, ,--aHIIA"077%** ^Gbjje*++?r~N'E T*%99D"ybb"*y\.RDJ%FHDrr2n@(BT }uv>VWWzt:0HIIYaلz׋h󑐐@\\[$,,, Q*$''(6mqqqwu8={(bbbwnc4 B R[[֭[X#}>(Jz^IIIwu B;!> )))QWWGeeq^PEJ իXVj5;v@^9|>t233gqq[޳ncf4OII 6mR={RB`޽8n h'łn'>>FC(b^gqqJUU"D!ב-?? )++7x~tvvAQQo455B||X,FVs8u6l෿-eeevZZZxwX^^ ɄnGP ūH$&ʨ#;;HBnc2B( N<{g$%%V2FQ@ lF" 8q/^^$C@y&ou%ֳta,++ܹsT*t: \z V\T* ϑh_zd( whz{{G<*TfGZZtuu111Att4bPRRrdzoruHOOhs6nȯkYYY~ƍYXX蠾^x?fgg#׍0DPp }n7ziA$vyֽ/~:NxU!B"|$e>Ԃi&FFFz-a7/U="--:x<<3e-9rW~55Y{tt4sss<򗿤Rzzz0LTTT ꢫ \N[[":tO&z*jjjp ٷo@Gb41scӧo{/%Y,300oIVVܼyo|266SXX< l'N`~~<+Wxٰaǎc?ٴi .`2(--e֭HR***jOLLrx'0 twww] 2t☜wJ)~?uuuLMM!7ASS_+:;;v%%%(O; ߇B!]C=Bweǎ^Z'|l6 QXXȣ>͛y嗅9~U joۼ,//B`jj, Ν#66Z9tHJJ H$:;;ٱcSSSPZZJ]]6l`֭?pB[[?G.]͛7_g|z\.,..㏳k.~ӟRSSdŋ,,,PVVƖ-[xWJm0p\'`02_ atLNN!T!yyꩧ'?h4 cV^' 233CYYٽ~\#D!B/5J$u 6{KKKj DEEQXX믿N{{;˜={F^n s+bd2٧)Jn޼L&֞7** Ù3gؿL* 9u)))ƲJVVO?4RǏvH$9s2[ѩSHOO'66ܪM]]]MAA`hJKKZGGGq:Jll,jL&'y@ ;vBx'jp8hhhz`0BRo|,dܸqjjjسg.\ R5 xf%h&%%*.]ĕ+WX,Bٹs=mv[KBaS."ΝCp8hmmrw^C?yyyٳ*}R)2zl6[ZoNVV6lH$A^ZZJTTԺ5DŸٟw^***ؾ};$&&}LZ[[j$&&255E?ȑ#o)))G?6d2Νlfff" o jW"D· >Uv;~*~T*a6fqqL~atcv'j5۷okF@ fpt:?qΜ9ŋyᇉ& n/~ صk`){3 B[[ntp\8^z%yH$b4q: nxLnrr2.)DrRSSχ^d21::ʶmhs8ZVT*jrV0DVcX0nܸqQzvMyy9ǎ ygټy3LMMR/~.|޽۷T*F*ՅL&sqllL:fggYZZh4b2>6B!8z(Ӝ={۷sU, :t^uce2qqqh4ώ;7TG"`x47oNCPpU~?7(,,quؾ};]]]S^^ΡCظq#;v ..m۶q㆐ԧu1sss?ՊH$#[ñӧOp8!))@ ᅬf\o޼)K^^---`ZСCl۶vލĉC,FFF⡇b˖-pIپ};\z7n̡CDLNNgj5zH{{;?  7nem x]nJ?XV݋X,DhD"ƍg~~{2?? z/|®Aonnfhhݎd֭B@QQ;wdyyۑJLOOSWWG\\?8*JKK ill$))t:D"L&Ns] gIrh4E"sNrssqTWWs5\'jX,&++ BA0~|>wf||@FFjNtݎN*(4z=8NR)zP(DkkrV+.Ç a8 %%%GNNPFAA Ctt4bXxSSSٿ?!INN&** %&&|111b28u^GRTT8t:6o,(شiWCPp{uBcc#;w^{2!\ZZ---XVqaƍ J%6mB$aHKK#..a6nHRR!mh4_2q8LOOÇUTL&լۋRd˖-dffԄ'//;w244>(bgϲeR)QQQsUbccyGr >\ e! hjj{pуb٨R,f3XZZBPZZhx<{1T*&4YYY҂dѣrh_"DO.Z!\GvSVVvu[$ CЇn~Ӊ$!!a_vv[ D"Ѻ_{޵AA}vߘfT*]CnfqMB?Xg {X[=|_kGoшNu煌kӧOPىbA$Dyyj~p8p\q wfyy^Koq"~|G׶aeeEp|>r3Ӊ#ch48^}v"D!B"wM d2LN['5IZW?ۿ??^+,`~o~=X;}}v>7"**D(--CqQnn|Q Vz=C|Iºrdu'|q>$''QץOc¹>Dp߄O;?OgJJ缛bh9tg5v"D!½d{p9/>+ԣ`ۉB.m^vdO{b1"h]Wb|VWWQT2 JLL(D.. :_[[8q=o#D!B"|9D,--P(>=l"NÙkN'J@7(FX$J"::awϰNH$dۦy2v|F!B"DWc WH?d_P ]k:~Ve'ܾϻytkk?3B"D!'}h&''R0`YL&111H$VVV@*T*q: na7Yzjj шBڬr\B?l2 @@(^iL&JL"sss( zAPe PH:?77'ZjJ%PH(&ˑdFF  `2AR21q gq &''X ^;uXn311f#&&X,yX,$h4ØL&v;ZX,dqYv }^8n=svpfq0l6~#{nXV&''d(uA&''l6#˱lB9ɅVVVøy&ׯ_gll JEll]h9wg4#::# ݎ([U+c  jRGEEP(xwP;|&3555(J顾 6Ioo/.]"==LGG>Ty$77{y_NvvPs7,/--a6q8B6rn%a |H$XZZ" a2X^^FVϯk QT,,,`ZY|Z:h4}Yf3K? r5zzzpMZZZ8{,wQQQ_*= 5ץR)N\cuuU(V233ARp90 BjÁbnR!raXX,B٧<t:cnnNhfffӉX,ޣYD"P[yffߏRj$WEpY+bXp8D" . H믿YYYvVЇ/r|Z<쳌Fii)B2~.xW 0;;˦Mhooz}r0 b >9VVV555j"..!vMLL dddp%vAII $&&dիB!ʐH$E~~>ɔSQQŋ)//sUppINNfddnjjj^>D?'==!v(zwƸ~:`4 !xט'##gD"hmmj {^._LNN\ra,PdĶmp:B߮.COO[neƍ0::C=ĉ'8|0ɜ>}cǎQ]]"III|itFC__/2. \.YWW 444011A  77WV~z-z{{ikk#&&w}FFFp:LOOG^^===ߏ륻wyNGZZWvE^^tvvEnn.OhjjBŋHGGn^Oww7LNNJzz:'OdhhVx饗gddANN=ZwϟGR[[K__ϟgiiY zg}FGGJy&&&aiT*jkkҥKqF233ڵkfώ;p\DEEsN蠾B._L]]vsΑhdddIL&܌d"==zRSS#..W_}>@TrMe^6.6mZzE?2'Nd2q R)K/<}}}Bn=mmmB ^JBBΝ{qqq466b0(**Ür9 b466~%~mFUUɟ [n󑗗)..F,s*++ ny2ׅ7ݻ'rrr4)--e׮]hhh`BxNkfdd6x oQQQAYY{ERq}O#D"ƍB^y:::0|{c˖-rp1118gYg`D<@II Z??AQ]]!77{RUU>Ȏ;hhh 77]v뿰ZqA?NBB999~h4>&&F+++T*!`eeXZBhnj`0(xrr9¿j56 χFAzZ!B"DPvjPZZ}GLL TTT`Xfqq,8@YY\VennyBzu~?&w}k׮qAd2@ X,Rƍ͓jl6cŌAOOtc0سg $ ccctvvݍd`0mK7iR]]MTTF F6+Ja'J  5.fcjjtp^GѰa;v݋{{{ygٴi͡T*y'x<;-[cj5555H$:;;Q*u.bf3˜}^B!xGXXXl۶ׯcZ)--ebXc z88;r$ ~TdZ-7nGA*}h\v \s)LNN211ALL ;v젦s 9Z-$''sQ6l@||<<lڴ ccc{|X,IHR!dn)-P`dd)bcc0iii,..ҒT]] Ess3;wn |x^***X\\zDJb||yn7`P(fjj T*T*4Rf3nӧOIHHrG__BΓZNްQQQbH.lq8 sp(Oc :;;d2rtIVVyyyՅ\.a ʐd477Onn.tuu ^ LMMՅ`Æ x<^OKK ~& "D!WuqÁNCPp BX,jjj7ƪ*8@UU۷o'11m۶P(x"###۷rD":wq\b?F<-HvG \p#vww 1L(v,<֭[IHH`׮]~Ν;FP__J$ ￟-[Ͼ}D\x!Kqq1455}Jk.T*zezzz8tUUUD"!q(u1n\Vybb"` 4 [lall1ٷo >)!n?y`ۉaqq:d2{!33z*++͛LOOyfJKKʼnR$%%aE.RD*RVV(~={055` ==VKBBIII+랖ǃ"--raB!bcc<333RRRBuu0Fqqq "==t:z>|VOZIIIA ቉ڵB#<<<# xNN|;v Ba۶mL\\)))̐CNNnl6ٸq#477c0! /ăF|A1LB1--/288Ⱦ}زe nr9ddd֊ضm 裏"ɸ|26mn !hYYn>f`0E4 2LȅRZZO=IRUUEss32ÇSSS>|2BMMMl߾-[멯'))CKKK=zbv;.JwFT'mL&' >>k"D!B{Ox݂nXZVgq^Wp4nUOK2 L{-lXp><(޳RrpK_]]%&&cw;Dg`X;_WsF,Jp<>H$cSU+"D!B?D"KKKBip/Z@w88N?(d#lVTDGGA;➔S$S`v7_- 4ַ"D!B_Fh~ɾ4U/ܫ |ᐡ߷eaE!B"|$⾴RJE `||94PhhhDBtt4 vjD"cccd2L쬐Xp044 e2sssjy^/Z((J q{|T*155E(BV V122"XGFFA.P(hk4fff`0evvv=fcA366{<,˗&,+++ aZjH$a% r!YXX@P Jb*===ͱNC, Y;h;㳶§HFYyxH,ׯ_@ngiiIв^~}?.n[Ȋ{|2ͼ8N>ŋIII!v7n`dd&6nHkk+Ǐ'%%,oocǏ6p +W011˗)//_'߸qf֭DGG׮]FFFpBӧOLRRկ0tuus=*W\!33NN@_XXh4bLOORWTPh4H(bnnNh_aqq{"^fj~:ccc[ok..\@ZZ>:x<HRr9=rӉbzz1/~  ѤaۙU_djj۷344/~ 4 111$''cZƍBtZ֭[X,4oXYY2^}U'55Ux K.ZfttǃF399"~K.i&V? )) /_&++e/~<+++8NFGG줪 %?ͅ HHHtsp8G&qUV+tuuQQQ!(?Ohjj^yWb~~7nP\\3<éS8popKozz*pk}ԩS$$$T*y7fjjFoΝ;yɓh48u@@(ݩV ,..2??n3==Mtt4RYF#»kjjWRRRRn9<\.Ǐgjj7o!** ͆e``Ǐ#)..KH"DI5mڴ룴M6_68?~FSS_%ouuudddBYYW{Urss?2ˣ>ʥK>qgb= _ LYYǎ1?3^￟^ P9 ˑH$nd2<8oU,±111ۋl&***Ƙ#PUUEII ݻ233wcvvHD~~>333xZ[[%99N:c=9.]DLL ?grrt\.sUj5j|~_o~`0͛7!::}ßO}}=#caa.( f3&T<+++l6&&&l6\neP~:---b, DA&vRG}|>Lkk+`ezrVVV8~8twwSTTh$**h4477V婧?@cc#_>---ʢ D< VVVxGfhhl B\z%l˗_&99aD"uuuI6l؀f# XO>-xO,//s~QXX9uZ|IpK P(Ncqq&''ʢ J~3nܸVeiiZ.k׮qanJ[[o&X,'__#\aijj" ,//s%~RTTddd077^'M~~>gΜAѠhعs':IIIzyWZ>|A[[ddd__/ގvC=Į]䌈!B_8ןl9lxױ8N LZfƍ˴r8y$* \j RRRX,gK$q9bccgXVN8#<"m{G||u@ZZG!;;ELL d۶mx^` ˅RD.vڊ8 T*9vdddo} k{{;555<T*^/III<$%% Ԗd˖- Ծ>axJǑ#G| Ax((( !!A?.dK9lB!RdvvDz!6mDEEwnͻP(ľ}xGd<ABTb2Ap;ꊇ+J|A*++v#_h2?R){'drrIee%]v ~8婧"77">(/_j"bxϧBH$B!xؾ}; sA ٸq#{존CQRR¶mؼy3 `6y'?#9<]]]<|6x^AyaN`іJE|AXZZz BB(#oR8v444e|%;;yjkkQ砨T~FPPVVDD!B{ÇJaVɄ //j LSS رr$::Zp\[[[׵x^l6ƽkܸq;v6=sssyM&?O@ &yl6Z lb+X,tƍ  377Gll,sss388hdtt4E7B[kkkٴiƨ# 桇\ Jd2V"  FBBSSScD@vv6^W^\\$==X*++9z=.3 M2 (CjHRP\\|D.  AK*騯|G B`0hkd2^W-1!!Y a ;`l6cZt:|> kZ(cǎ $JJJظq#R7n000@^^p^^8X,Tfrr ejj &Xt^"\C300@__355ECC}}} 1LMMvIKKٳ r6nȶmۨvǑJ18uSVVFEE[lnի088Huu5>tJKKz**Μ9 'Oh0ܼySx ̤NIKff&'Odxxf[kOu;,)) P*,Z&==xlܸS]]D"a~~8|0rHEEźXp z(b``D&''t*~_ Ǡ"233 jFѰ` 33 Z-hZr9YYYB!HIIapp@ @~~>QQQw 7 h9HII!##>W1@dDdeeOrr2 #HII!''L&$KIIAբP(سg6MiiihAYAWWLOOg***XZZ"55UP Ntt4J| LJJJl~rQRRBbb"7n`nnCaj5t:q455!PB?0H$INNF#r111All,zl6G%77a߾}Qff&&Ixu:FRR"??~fgg"!!Ca2h4dzyf^/QQQAYY0a/z=B8QBBp8x衇xdB^^j\vލ`AصkVUUQPP@ww1 deeQTTH$-[Dww7P-[Ra˖- "//Og!F,D||<2;wb41 ‰"J7 bܧ!B"Dt8 :#苎/v88Ouuq_\\DRrqD=\#|D\#D!B~x^!G;{|{yL>e"ŽrM^Z |s2>YӞe}ƿkJ$޳v4爌c|CL&BVdrrXd2 tww#Hayy.N'Ķ3<<#>>Xfݍ~Tf3K\\vnn7:E?BMة),pKGtt4>60<<АPu-^4 `>DžHze||ngpp  :v-C`qFGGIKKrXXXsY=Yxqq8R) {zzdffRT*YYYE(D"Mtel6_H[v;i]FAAֆϊ:D,.]nd2D\z}?.NNl6w4L&opݴ 'ODVsF#\ BLLLՅh$..N&ϓNWWxu׮h4CGG`V餥QBкjϟ󱸸kFRRҺwE(brrAJ^v &ʋ/kcnnTnjrh… ܑ-\T/$"X]]w!//SCݎjE0jkz||' ܼyLv;2;;Koo/N餧x< 0>>B ::Z(P(@@^  %:;; {G\\>!aj)HJJr-p6(&&&CTTBՄ^/]]],--B{iG!&-$VWW?ݘf -Bccc Z,zzz5) >Ǻ10NC$1<<8|>ZZZg~~^2440DEE1}T*EV366FWW&IxVCcxoHwwP0B_ $ ü|>6lk׸tV~233yg֒o[illDmoF(ϒ$ȁ`7ߤN Rׯc49> gϞ%%%@ ,ϟ_׬Jzz:/~k׮FYYfggZ~FGGwXNctty\.2iF#` jϓ+j$>{FZ-Ǐ'**sQ\\FwB^FGGZ /\CZ'fhllJ}ˬR[[4 K/ 4 i Dpj5A%9 dyy8VWW{yX,dddܱ|Y+_v s4f7|!233[Fz711111BpDLL Rӫ( d2~ǃbڵkLNNR\\[oΝ;pny衇팎 /ٌV%==](622Boo/?~NV%%%(HRo۷ogpp_W%L&###466 }jٺu+F a^+~(++_`0@RRsŋtuuq}vaaa:477' `bbID"B#HJJbzz DLMM177A ֍H$d2q%4 ^ Ay2330 233,q|>bvv9~ A rd2fffGT8s 555L&R)j (@!H333,,,Rd\za\j X*N?|"yT*sssbNNj,.. YCCCbfttXZc\~?rQT{`6ihh`nn˗/SSS0QTZ->,HRfvvSNMKK 7odttUZvū$b,N aΟ?OVV{巿-*%״r? xq5NRIrr`]+šVb‚\.2TTTbRYYN]vQ\\4zlfffhnnF.SRR" WTEyy9999\~jA3955ESSr 6H$< bb׮]CGG49wR)~q5b1BE"7odppyԩS‹#;; !!R0==="innnZ[[1 LNN 5H )))TWWcZ1EQQSSSرRbbbÜ>}xΞ=c=FII P]] U*Acc#_n69u B?%&&Kww7tvv Y.^͛E]]zgZa_ɄB6jeee~hll$ 2==+"XHJ%_/ k&YZZbbb+BNNٳdee ùs瘝ettłf4\ 000@||sssdgg̟ގᠢ^#DZI?{nFGGyx<|>HR4 ۷o祗^ˉ'" a0_;v^\NK?KKKJtt4III_;wߦw]amsNN?***xiooGPOSQQALL lڴ~L&"i D׿fqqχX,F&P(|5$77WX+ß>::eFFFhiia;v2ٵk|>()){yxGj q)))!55P(Dvv6O=BHΡCسgڵ L# k.9V&*.ZZZłQpS,J$Ҹt^rj299ɹs8r6b1v9!_A,X,f֭K,f1::ʝ;wJ Aib-27??O<K`0(;#==}vZ!,eee\~m۶1::B`qqdAl6BWnn.TWWP(匿X,&A755 2 /_fllBn߾Myy9i?NNW\۫t233ldgg~FCss3whjjbyy9'33S l6cٰZ:tB6oLjjR622"\q0GٳlذH$"y&&&X\\D"!;;H$t:X,{PB&33Yz777 P\nݺ%hHRb`2(--ennp8Jb~~r*++^.]DRRHt:jXVill)\9 ;vf RbΞ=+THܽ{LV4T*v\NNNRXXH}}=wftt9^/--- n-X L&q}Xnsк044n' rM~_vZjYXX`lle~322Bee%`',,,INN.,&A||\(ӯ˗/1 BTyy9*uvl672==MFF.W2??Onn.EEE466r 233h4n*QTTjeOCxhd2 afeYaٲe uuuQ[[K^^7oFRz--q_XXJERRc ۋߏBp`6Kj5CBv֭[%''[illdyyW_}U(W*,--`ܰay8@AAfv!lڴ J%Is!, tJKKǓ撜LFFPCZZ֭p055f߾}F1x^J%TVVFYZZbx^AA"WO{K b6mB"ƍY~=+++hZ֬YT*eaav8x %W%zelv,x<(J~p8D{B f!&--RSS QPP@vvPHII!++ B5kz^cyf6nH4e~~jAlD?W-TMwL&UT*h8JjP(`0֭[ LNNb2BcZIII 6a֬YZ&77A233ٻw/ڵkzR$77B!⦤PXXHRR+++ mA]]]g򘞞ڣinnfiiRQQ``hhJee%@.jP6~]VVV8tjv;yyyTVVb0/1 f䐝Mww7]#??RتOh*t:l"l6"-- ƦMBLLLpjB_f\.l'd2CJJ RT(Slddd`X0h4HJJb BFIvv}TmFZZk׮h4J(2xXYYl6SVV0HV+###dddPYY^rrr0P[[Kuu5SSSٵk*,t:t:dXVD"۷"֭['\*d2y˅NCTBrr0wE₂G&a6OR.q:B/QB|WmAw8jA1a\.Ν;,Vg僞(~^x\Xy>G^޽{ȗGAytvv-Dݻ<|0lݺh4*,f|vp;~dq@_WꫫڮDDDD$*y< FqU%ecPJ,HE/噙(D"_{[TR[[K<j~cW5Oe?}<D9:D2 ̳""l6 q8p\.%_)q&J܁^ǟYE,q *H|P+y2ֿܫ{n$lDD%1F¦IDDDDDDDD~>33Ccc#r\noogppRdrrR]8z#H477RPЀ&##CLr؈###t B 鬬<44D[[B6:,߼y>b:._Ķw`0hiifSRR룭`0dw244D("##>:::HIIAV3>>Nss`v`xx!|NNN yܫ>??ݻwd2!吝 TZNFFFP$%%8Nnܸ sssX,d2~oqXg2VχVJc$''۷ ܹsJEoo 8v]p?hmm%''GT}Uq_YY젒H$͡>wx<.Xa=iUGVHR=9Deǹ.[na0p8iee>{_#"""""""$* v;.pj.^͛7 /~ R)/_&//wyX,Ɲ;wPl6k +X ZMvv V8}4ٳN½6kwp9L&JO>fv]]],,,p%jkkwb~W^'? ֭rqa IKK#))f^/OJpwG]] 155ř3gذaSSS8>cAtrEVVVHII&s-l6o&\t|zqpG"`4vχRdhhI8LLL`4ioo_'77z{{+/z';;;G_ӧ)//vy)..͛2>>,yyy244˗ٿ?r|U>;;KOOMMMz X6k+++  0ccc ~x<\.ת LMMrG²L?k׮8r92'DQIJJ"-- N__ra4#G8|0999DQd2  Rv:rHKKcbbnnIVVVH$'?!cp:INN&''0s.><<,&< fߑ9"X222T*ի"dz:""""""""O' ZvZv!`R\\̾}{.oFVB҂ 7"Jioo ۍx`lnn.R, ?^{T~?VC *;v OvQ֯_O<GT"ra0?pAU=Ì~zbF!B$''SVV (JJJJؽ{7ݻN㡣H$/L0eո#?ihhwޡcǎKCC|  >|B@ 8s ׮]cǎ=y_GRDT *͛7f)//gxx-[P]]͵k0 t:ٳH$\.x v;|1~ӟt:ɓ\.XZZ .vrrcǎ8~= q8={x7 qex }a6\hiiȑ#\.\.|ijjȑ#pYA1sΝ;󱸸nɓܽ{y__؃~ok݌qa"X LD"A*b0عs'hkk#rq$ ~I<GByI ?~l6nĉ|q;Frr2^ }v9pa+B!;Z099 @AAW233q\t:~}v\.r $%% Y}٧D+ڵk)..W^aii@ @OO6l^`0Da$''t:ztvvb0(++^/hT֞'v;q,//$( \~ z=ʕ+?h4D"tÖ-[I$ ?EgM<]vaٴih4$#@et:ݪ^Dz~~>?%<CCC|>rssټy3h4Jww7EEE!^9ah4277ם //h4***fyyr6mĶm(((`F|?d׮]bX?cd2v8@JJ ~|5kPUU%/hIFFcccH$2228{,֭xD]__͛H$288ӧIJJ"//rrrˣz՘8RLT*E.#H .Moo/nt"Hdd2q\BfO.r Hee%| ,zee`t:룮tct:vލT*ݻdddכIOO'N&&&exx9ZDž똗GGGmmm84 === Wmj 188(T ^L>IDAT6ryX:r2::ʭ[(..FT ׇ% v2 N'̽wP(Dvv6>B"\|Nl& H>uB!\;@q===ffggv+++U>ARTTbadffrUp^aKPP[[隣Rn޼ɾ}hkkbP(F$''p8#77fۙD"燈gxhh4F#nF#/2f FGGٵkeeeLLL0>>ٸq#P\\,hn |V$t2<<,\=սӤvX,H$z{{IKKD Onn.###D" YYYRSSCaa4wuuxWj,--hzdee 7n"zy饗n311멫#!JY~=J T* ddd044/ƭT*h4deejX,L&t:yyyf֮]+d;n7/"Jzz:@ZMMM r<vp333gHL&# Jٰa* ֭[Yv-`4ʐJ,--Oqq1/III,//SSSJ/у0LLMMQXXHEE@d"2 R%33+NrF $;;z5h4j*8deeCZZVшL&CV sfLUUdee199f#77kעP(_$''Nf#99Ͷ/ʽ=B/2Smm-^lzY,z=LNNNjj*2<9ZHld2=#"""""""Txt~A xt'|<g>;;}gffrqe|>6lxȃ}EDDDDDDD} IxP(UIX,&5>+B eD"ٷĹKJJϪT*v@ZZ7\%2O>F! =r.˩"ϟg5oEDDDDDDDDH$UOJ҃(L>R~Y^^q-H|9O `0i z:D"gz<&""""""""A"P*}zJb<|U%:o[{wQJܿ<xրj n|f\.ׯ_}>wܡZMjj*444,͛t: .]z=ʹܧHIKK#qP(ICC+++C}}====233蠩RRRb1L&pr0<<||M^n޼8iii( :;;{.ح[hnnVL&͛aXX\\ҥKtww355Evv62LPqJ̙3nl63kBRF VYYY~nݺF>ߏFaqqrX6sW\˅j*cǎ O*E !JWI|XׯT*!%%>st:#"""""""?4@?$S]]͹shnnF*@vv6/\xlyRRRhllD.ͭ["x.]g?ׯvs1֮]l|#'NTxΜ9~3LNNӧٸq#ӧ1͂׵k$''{jvl6srss1 333B!HIIMHkk+###nT*nc2hoo_'++h4>v?W0C[r ***Lc())ڵk,,,0;;8x^ǹ~:'))iU>>>N{{;---QPPLƚ-J]]](JPո\.t`00:: XVŧA֬YC<r0 iڐH$HRo`0HFF`Ogg'r:::v&O80UUU ( #HMMݻw `4q\444v}}}u`֭[illtb2,N'o&تiZӠp82x |>qX~L&j2::Jkk+Ja@|ڏDDDDDDD~1;;+l?;;˵kѣ8|MFGGԩS=>~~oFnsi~ YcGE*_%/"~!.%{=GUUoO,Yv-8pC @"9tiiiDQؽ{7RiN'===RTTDII ---\.B繿hqnܸ?X\\Sa.ׯft:/27oҥKy]\\d``͛7~D4r^{u=qQWW7nd߾} [<AhFfcݺuZLJ|jp8?c2YYY[^O<"YXX //={`49-qYZZbeeTJMM ׇ^W_\P^^x'}'77t:vb͚5b6B2X ֭[illDTRYYjFhgINNfLLL0>>NQQ(ꢤh4JJJ YYY_1***8p(JoK/$с륰X,Rt200@UUF2ݻ?ypU~_"#gFFo>R)dff eK @CCH$Z[[~fff}Sͮ'%%!H())۷o3??OJJ mmm477 WmB0=MM\񸰨;088dbxx&QTCGGp/222¹szR9'r?)))dddP(D"d2al6hlln ( qw3g0>>.A%`20@bᥗ^d2{조yعs'555RUUEyy9`/=9l6lGc񐖖'33S(Fբj(YYYLOOP(HIIfQ]]MUUeeelܸ$v; W^yZM$,B¶lܸR8H|;0;;"7ofӦMb1j5( t|>:dbrre^z%rssW[Tb4ZzV+F4ZTVV YZZvs0 wjj*6lV ;vV}xς{{н^"P( ;v젢P(jTa|| vލL&#PSSJ; уbpPYYIyyOK쯲:!P(0ͤT*eqqlY\\$''UV`0xXv-0??Ovv6yyy`XZdddVA'PSSCYY,,,EAAvy&-- łNf=ǬAh4\.b1  ***HOOrfBn˙aZ¼-++#Vپ};h4*s߿R)\.z=zX,PKVVՔPUUENNz^ׯ'##222Giiidffց""""""" ]t:tD"p|U;oxdtɩSp8K/=dsAbx<ΦMXfs9~Ո>"""""""">Dž$gx<( F ä}Q4}}`P(K~HDB8J-H$BPE(J^xz7'4 X6F^xH$T*~:]]]V{Y233t'N`$%%8s LLLjgWѣGW'>.;wG$!n޼Ivv2@ k&==]xG"Yl60<p8Luu5| h4ldggsy233ywZ466"H?3B!9BEEǏF*@w\ܺu.X'^^T*gϞ%55^OCC---޽%fffD">}7277G}l&??xPSNa6@.S__O,6Ο?ρO;Fii•L&&&&ܽ{d2x۷`qqZMkk+vh4JKK 믿b!55F0LTg> ߏ^wޡǏSYYJB&q ***t@%>Um}6/@Oa6)((x&c|sBrMh4\xx<%99Y+++҂\.'A.c6 RIJJ ( FFFP(\pZF._Lmm-ř3gشioΝ;( V+III444̦M/r v𹂂~_Bzz:YYYL&ضmr%~_RWW\BByX8& }?!:77Gss3JZ}BǍ7HOO' 1==@R؈``ddJnΝ;HRZ-MMMvfff 477T*QRRR8s *`0φ 0Ÿr ]]]b1:::>QT8qF#r[n/g o&N8FTryz=eeeY\\իm6pU/lի}_ss3."""""$@hZ!ba͚5s] &|>555(JZZZ`ll:8d2QTllرW L*e߾}lݺFL&###]vP(XV^z%JJJHJJB&qFʄ1p8ظq#xFR~t:\ꅰ)lLZZ( 4 xtdeeQUU\.g׮]{nt:x\ζm{`ya47drr˗/Gt:9~PЀᗿ%###׿F* ?11ѣGIJJBբ9uLOOsȑg6?5kpA222HJJ"55B8 VKyy\VV%%%pm4 D"۷j%l{%vΜ9Crr2HQZ-xy ϟÇ355EOO1'OdhhDx\Xܹ|2رc\pA_Z4Z[[9s0/ sss,..?\zI@ cŋ sQR)owˉv~ǃF!--.N8A$fvv6B;wdhZd2&@ 4~zR)[nEvFR܌j TjT"sjnn,iiiVfggZ,}Nqt:6m>))) onnWoկtpO>dϻh4x<}~_qڵJoݺٳgH$ Raٿpٺu+PahZrssϧI0$|^ίx<˗q8?`vv`0d̯_Nuu5)))477su`aa!!#x9ETrG.kIdb||^x[Jvv6 ??1q\DQVVVb޽ٳU lڴa())FC,WhHMMjRYYܹ\J%۶m}O JŶmرcjq\d2fff⋔ر^ mlla'%%ꫯyfv;JɄ%BSSuuuzzzzhllj VǽOhll?J(3""""""ONh4瓜Ν;ټy3>|MII & Fff&۷ol~ H#Q*ynf~e<ijj"99ÁJ{{{P(x<𻖖سgB$ׯ_֭[ %,8ܾ}Ξ={HKK\tE7ŋ ۷ouVR)@&FFFhjj"h%2lxN-())2CO* Eww7֭Cד϶m۞ 7L&ͭX,l޼4 G/"Hhll$;;xbeeU{%##>b`۶m W;;;ee\zSNQRRB ҥKnap:qnݺE]]𷡹!ZZZx֭ LFJJ r|]ZZWZAD"Βݻ*((( ##Hvv6֭# Ffڵaٸq* DT*eXVuaZ|\dffrLjEaZKso`KFZZІGaa!4۷o BZZ& D¦M(**ڵkra20̈́aL&R&T/P&]YY)T\.|>{존h4Nc͚5˴Veff+pܹnܸgӦMB%^'`6wʎ.==r(//f!JYsRua63L]R8EEETUUQYYIyy9k׮%33͆c޽s:99\Ln7&Ixƪjعs'*iD"AP^^B@׳~AW oX$99NGee% P(N'NHMM {އ<+>33bJKJ#gϞ*y`)8>H3g?&Q"BPJ$aiieI^ϒ{^Go Bx< FqUUߐϊDf3 lN" H$HoMD"! *} > \~SB/5O>w<'9yfa\rM"8v֭lܸF̟OjR<7י/#򼞏""""""$ pKzEU: `/A7ױDVxwVVV;.ߨ׍{$e+_5P@ Qχԯx<ˏt""""""""""6>88ȉ'ddd̥KhiiT^۹pHgϞe~~,d2~'OFzJQWsZZZHOO_E$  \rAVVx/^HCC4z*NLZ[[9{,w2gΜWD}6W^2::JVV#τŚj}suqΞ=KooPuqpٳgo'Qqhrr pjN:\t o[*++9{,{L4%??+WoPZZ"/^>WgϞTn޼͛^QF#ϟGѐAGG޽ۍ!))>M6vO08{,o6֭ryvINNM8z(B8uo[nd2|8q-[D:u LNN:d2 p%^|E܄wwb2۱,//s-Z-IIID" W^94 ofxxX,FCC===믿.,ܼynҞK9 21zzz0 l޼?|y***hnn9b?^w7@۴cZ)((͛LNN2==N#%%+k"@tttp Cvl6,.. wɓر˅hdzz^J[[F@ `IKKzǩݻ466T* |2X,hkkT^|jerrnfz{{ BӞhBAKK :@ @WW\~a1ƍ"Wfggl d2qu_`PB^^f֭a0X\\ܹshZ[DDDDDDDDr;@h[XXڵk `0KWWF8@zz: H$3:: [nE*zQT1::}g"++ ZM(BǹsJgIMMWΝ;磳f\"̃SNq]Ν;GNNjN'x:_z.=htvvrhhhXf_NZZ2z9y$9y$NY9D".]\.v  o磷syD":u FCff& ~?eFFF!QRR__jCNXhnnFד{5`ΝS^^ζmۄiT8ر48yyyza~~aj5VFooU*OUnz?`rrh4*dv;`4#))P(D$A*"ɸ{.mmmɟɪDRؽ{7UUUVc˖-xާ֏>66j"&&&p0<<ЅHff&VUX|HܳJ׳f^/yf IKKΝT*effT݋dbrrƍeaaaվ(..._ղqFJKKbff-[yfRSS1??A:::X\\(j5֭c͚5x<4 6,RSSټy36l ##cǎR(..~VU`ӦMܼyf6l@OODQR)ֲa1Lz1ݻV,lڴ DZZVՊb.^?0L_K EDDDDDDDz6رXlտ{h>11Ass3!1$%%{nlB 7 >R!SmXصkRR)( 6oL~~}ݰa>|'*Ag?p8,ׯK{{; Ritvvrx),,D*8gΜ… BO__t:q:x<nܸ/2BGĉx<(1Ǐbl۶Mh9uB{KK ===ܾ}y9qQ^^NssLM"0< ê .//9墰P6= ㌎ OMD"TӜ? .mذLz=7n\E̎;PQUU%'qNz=:M6qi֮]\l***`nn*jdeeaqgΜabb^ϭ[h4n9'''G8RTpHS*\|_ZȈP'j1L ݻw~CDDDDDDDX,F0$+U&HNK$@J&''#QZZhʇ׬YRdjj!add1^'''vBk׮vYFtuuLuucY9Qܽ{W(]v-455DlE,CRSS8d2֬Y#􄎍a4D"tww#HD.B @TRSSDQAP(DII B&jR\\L,cddT*~V^/u?^@V(V˅T*%55Z-PDss3SSSx<Y^^LV%770%%% r((( ;;OĄNOOgxxa$ V "''BfggDp8LMM .v$ :ZR)4( zh4 ZB<9aAǙbUvRSS VnpB^' sss沸( B4EVR%;;Q&'')(( 55l6h###b'''%T$rATRYYl6 BnB?zZOR)+++ (//'tuuT*Qdddhg?OL&3Y@*RTTD Gqq\p\TVVV cٰ~B(H$, 3TA&QQQDEDDDDDDDmLMMPիhE(Z ?K*DmAO"t:裏p:lܸ;v<d П&σ1`DŽ;(//&<77ǹsDYYng9<~gv/a8ps}QY  W xO{ފ|}D"H$֭[G8f~~]vP(XYYy6xBz3$J܍F2==r7<"0Ṗ'zRl?'Q筈ׇ@ T ɫ%Vobfysxz_1~]I;|KD"ajj CEEC_C-'pP(eχ_uV~IxG8D"ZyyybH$$''GAcN ]Rw"AL&k׮D333Y[02kۄŞ `$fggxkw׸\. rx<.O+qH*JO|I c" {㌍T*d_q?z~}{}t O;{}Yȳ_W~ssYTu|(>yIo D޿9BH$x^Rw__R2AaJ"|r9 b ȿXLONNfffi֭['III(`Pp(h``zPRR"2t?y8Vn>L8VK|A> cO"(tc^9A|IbXh4JMM F#`]ڊ|1xh4JRRgϞ=OwLƎ;D"DU)|1b7W8^ _Y^^t>s YYY! """""""""""""I;N!V7WD▗Q*}*5ԯwyyyUDDDDDDDDDDDDDFs} AmIAd,"""""""""""""5@ EDDDDDDDDDDDDD$Ԍ-%tEXtdate:create2019-01-17T14:26:41-05:00f%tEXtdate:modify2019-01-17T14:26:41-05:00ÌBIENDB`kernel-shark-kernelshark-v2.4.0/Documentation/HTML/images/kshark-zoom-in-select.png000066400000000000000000007435171477354127100303120ustar00rootroot00000000000000PNG  IHDR 6wgAMA a cHRMz&u0`:pQ<bKGDtIME IDATxwxǝq{rI0GĤLYq-{{p{߻6gu^dٲr)*bI @9Mgc0MJ@tWWWuuWW͛3$I$I$I0]׉D"~D".tI$I$I$=M4z{fqs,w($I$I$I޿4M#IcgЦqzɞ%F@~rR0 ҚNL/W/L%$InuMPU-u@0`bbl61(|>ert]'NcXQt:j1٭&>}"OE:Xd ]$IM>Fyy9'zhnnzsO@Te$n099ɮ]Yf5. Àq?(̟?t:͡CXv]קx0f]022GXr, a`BFFFbɒńBa.kaEig[o`:v0w\~]@Adtttx"N$I.J1qB02,SSS,\UUQUÇNZ`2f4M/iM"tr:9V $Itַk8qf||6FFF*9LRWWball`0HCC=cc|/~sn7XoJ|v8SYYpxal6$I"`/y˖-chhN's( ---˿+˗/[n!J:LN pPWW Dlׇa|.F_br8u$B(466pa~ӟ/}# 馛uBW$I$"Ds6AUs7T+/!s!^; ҅LLLH$Xa$dłe4S55(sX׬iML%QTܭd %I$t 3V^??0<<~Cl6;6[o$HEEׯgp8/}F~bq:|Osihmm+C166 ?=}}l"tӍx<~Xh!s!r=?3@LgoݻzAV^Mcc#w[oɯ~u'555rl߾~nZFGGgL&ǏgU:u~ϟbϞ)++ܹM+4$I$)ri3 ,\ݎlSNRZZʹs5B!6geN"dר04Pl6=ªUhkÎۉc|>&MISw-ɓ$It17FcA6׶W]u=== kr睿d֭tvv288ā+9H!0u7M^zEO| >ĉ1t]'cNVZ(:lj;%dYRHK]]-sq7an\r*կ yf477|I.\D<\rJEp~˿i:$InKss3_WihhDH3XV]$IN2.׻];Yd)Pв-Jqzf! ɠ(?kZ!lAd21tuA2nw(*㔔H$WLJPT<d,L$Itw&|+_ѣ? +V,xXf5~LuuVJKKXhF}}. ǚ5|di b;wvf3!X,|>TU%LK/|d24M{d2TVVxb**R,+%%% ԀcWYt `PSSC6a|~<aȶmq=H]]=dk#ɰtR '`hh]ٵk]]]̙31v;< Rl6[O$I0rnkySo˅kDZmlv4-{F:w—.]d" qP'͊hbf`ZcZfoXpFYd).x[Oxys~p0,I$I$I$]  1>>3EBuK$I$I$IT=rcI$I$I$Ifs\L-s/Zw]8ݺo.EQ~/ϗ|@$I$I$t/se =gFYY[ u]'b200@iinLՊ Y{{+y6 J0$SWWwt[Zad2|a|Tt}OwǏS]]޼+$I$I$I$I7_(Hgg'HC:fR)ZZZ ꮪ*?8w}7GpJl<裸\.^yX,.~:EQnQ0bҥcf3'O䥗^bܹanηBb=<< ===TVVRRRRk>oa2硇bٲe!tηB&''y衇hjj狀]GwAcc#~У]_$I$I$'B&&&z|k_jr!da^x4McÆ Q֬Yõ^(lٲχa{14Mcڵܹp8̢EG.'ߝ~uu5r ?OX|9266OvUÇswFUU\.?gi7o殻b||'O255@ii)/n`޽s=lj'믧~a.\Xh/xxg(++cʕ\~;v ܹs1`ٰlXV\.{ejjO|l߾_~.nV8z(2::J?ͣ(pw_!FFFxhkkɓ޽UU4.V\IKK 7o~ǯ H$I$I$IYt0;w.z+ ,fAuD"A2s饗BTUeÆ |trTUEQ, Tt:kp8ai ,_"ZN*rz OEppM7zy}fR)v{!oxłl6J4&>s=wu]|#|t:M*"h" 7DL&VL2O%I$I$Il6ꨨtrpx<~?7x#322n?o`k~Z0~V+~***xYx1 7\ 0p:PUÁeڵ=z{K.f2 O{X,b14^EQFݒ$NjH$xӼt(g{vq28ﭦe !d2ٳŋrdvI$I$I8ddQ??̚$I$I$IfJ&:$I$I$Igr::$I$I$I􁧼$$I$I$I$Izd.I$I$I$IK$I$I$IE@$I$I$It0] 6cK$I$I$I_UJd*:$I$I$Iy#a!DIg|}hYLIss3aoY?(2+iNϯ(>k(N8NO\y*|.E(37M}F@4E34̪yd C!B6 UQ3nHcVXT $I$I^wog>|H$B[[$IX Պ (vg}}҂(J LLLH$0L'B4I&<#8pW_}y188mF `ʕ=z͛7k.7oO=~;- -[o} 6o~,>l6~;Yl& ]ٱcrt:/~#G8uuuu򗿤ݻw3w\}Qvͮ](++# _C|wc߾}߿+VeiLM OM &&X.ź鴠 ùXUarR4- `xXۭ8 S)x3غD}*>j !; )ڥ2[ص믛hh9vL8bԔ{Zf1̤4w=k1# 1Cw1`n(FjyӬZB<ՁW98,(]lbB(m#{`2if,Jé)::UEbjݵ\p4&ڐ VRV7O&L&)AIA&:7fya 5dpƆ Y\ܓyM iش)O 7\,RQXPc4B _B2pʕ٬X;5m,MMM̙3\bxZX,l6?N{{;f)-[Ƨ?ibwygiO<  GII b1^/vUUtǏ*/`ǎLLL|x<`SO=ƍzo Y +WjX,OQCA㳟MaB2)0 n9Ckϧce5XX3l߮ <={Lc⮻,:{u `R q;T|݉ f,\>U0z \vx<ꎤ"-nJ%(Bmq "7@*.;dz^Pj/eY2^ Lӎoc䟒Oד1exx݁|EfaN\2e⥗̟/?_8:xcʕ;$3,Yt|z{5qJy*7ܐQ0rYQxE>A$"8xPE6dY&*:gYR#]яfH&sMGFZZY:!hl?GvSj/eN&S,.vU%_fujZ|-\p%R&/S`^tCʆ+YQ2{Ÿ¢ZeblUW09pY\,XŅWSOy\@jtuXqNRp: >4XFpJOBsNy#*[0h4>AԒ,\ז}kYHlSS QI&S G 'Ås[v#Bܟ!Q0 +W('N Q8|U9{x8w7 FGzʌ՚.7%Tb\|gz6ݞk沤i3w0 .kK.vsW3<<̓O>I(#lW_}01 p8̆ 0TUU1<5,W?_c,>k(/7, :xcovoW Qf &;ftCo2ځdeS&&{w ,\Ί:#4ӁX QzP&D,Q[z8כ +4W 6eYP)MPH6hopR(tfBB PZ{eb=Yp **r7S֬PU8~<KB*J=?vLajJܬmbM`Α#*LӺ\~VxExЙ]qgTrUUԹ$NXY8{F`7i9މkQ`cF8 <VVVdeU]Kd;wbQMl4xX_ cǸzeX*I$I$I|t0Wߝ>韋"JzFg[Yu4~hytx<~Z9,WTFGs*4;/'?;2O+N nqzm"!z.>K w4g8ߘfgh(qxQBZ*ttd TWg,gѡ&̽pU;=iR3f>TÙytrEhM“70tiC~;)>uL$I$IvwEo.5Ϲ>o61%:xl@坭ӿ0 |>9sBp~t֧v,9WJTT+xOseMfْͮS{23s.\{4B䞚zn"xKink˽\˜oxhe}([ bg_K$I$I}όgr0 4M{OZ,~>U?Żay䭤#I$I$ILߴ]B7BO_\딿 }3uqt]/ 8W\_w+@/]gC704ĿXJ%I$I;l-+000pF ~L& &ѣl߾|ylݽ|fXw#jVlS\6w+7hodhwd%zJ-X03Sgc}z 3=YQ Kk:e2>Xwc.0nE,ɼ/122=ñcI^|SSn,/Y>U 'QnTf[Vjllx(&J3LCXlg())9g3]EQXf MMMAn4^{-an&RԬ(^ƹn\veZ Պix<{Z‰ 8i3hsd'}Q %{X'"'FrjxKJn蹧%wtY_ /o)o%HoB.]J}}}FZOOl-\ve r1ZZZHR/LoaF@^zg"̝;[#`ll7( ^ѣG o}vFGGf]@ 痢&QU!grr  k.VZk$I$IRo_p8g}R' ^ljF$)0~iaGYY٬6]$!͞wi{+>tdX,ftuձzjZ[[lM7VwuBJJJ(---ir\.B|>Y(J){q;}:WlBPڳ##`"9GGgL&89qP"Y1s4xFfgx085Hde\쓃 5##a‰0d,]oƜ|o6%+Gmmmy茶Mp\477SQQp`ZihhL&ܹs i~JJJ¶fXd2R),X@}}=Nyy2t{]:~K@fYشi-bΜ9i&''Yp!^p8`ӦMtZLMMQRR7Hmm-MMMꨮZB-pp8XbbB !F\|0S$I$I"q.5f+ߏd O[L&j |s Ls2{4>E]}ppχx5)&ܷyxatLw17vg-c&/Fӽ 6}#߃N.P5$OOSW_.Jnd2I(nu_];<}-ޞY+~L&üy>O`ìVEyrϓ?;{aB:?mOu_!|H/h4*;Г$I$Vkw?:gs귓,\yM&x<2̻t:be;oz78ZM 'Aci#j5q/J>9}8#bg[fMt-fSSS,`8޺|Qd+?[ȯs纩zzfY$I$Igq'@!ȋbՊ%299I&yǙ7Lx<,K3w*vňboiչ?n\Nލ2v87I?< (UqŜ+p]2 l'ux t/;da:|/B`6MdwI$If;go~87lMd/4ֿ{,(4g @ٍ ]ַ?I$I$Izz^~WC-B520~$I$I$$I$I$It8Y$I$I$I$_z:&]J$I$I$IbnV. ( G*I$I$I$Ioq\.0$m~h4J,jΊvu!DI=+^܋u0 |=-a.(|I$Iz3N?o>·g;_oyg;g6cDI$l0~N6{jVw*:c?!H$l6vu]'Gȑ#2::mFOOK.eddロD"Ass3=Iuu5 ~&"?ػw/l&y>3gNagy_tvvR[[K4;d<,]/̽%\BWW?O B,X`0o~^|E"---lٲ￟>Νdz'E%I$EQ|Az);w.?)d9so~^}Ul6555)m·|dѢE<(ʕ+F$ /===$Iuc\z饅պsDXj+ܹK܌ng͚5#̎;xx<)z+GEu$X <Lt:ʕ+׾Ɗ+ؿ?CCC zjٹs'wftttáC OGGGb^˓$Iٳg7o泟,%%%sM"b0_D"Q8ܹ[RVVE>p!x<|_ns RL坞 X|+8N1BTVV/|M!AN'*Ga۶ml۶D"sWrWj6tM TR,o9t>D"c\.H&vɓO>(mmm_v WF4~vꪫ`˖-tMl۶T*űcx8uW]uuuuڵ ƥ^`ŊTWW355ŦM<?~r9x }}}\.ZFGGy0 oqA6rI$ wSh ^SS='N'OrwzD"ey saذaxロl2{yW4z, o1L̛7nN8A&+^z n7?CUUZ[[yxD"̛7O%Is6HN<Ƀ>Hoo/>|{K,'|W^yh4ҥKhll$ rW3::}GGG\r e۶mn:}B+^z'On:VZŮ]ؿ?s}uVf3^{-30>>7_΂ D",^jE0 tO48qÅBB^p0 @nEYY&B&d2, LNNh/)))d(RH3Nx<\.0d2"L0(ʬ;p\$ B㔔`IR$I$\,`t:r,pȍb2躎f`0H"@Q8@9͆iL&' Lߏ`jj J&o1͔I&:}WI$If2 PQQA**4Ax<(D@ZYYd0 (Nt:M0l6SZZ S4l6MkȽ( HxNM$/tVYeEs9~Ί$I$I&tI#x6TƓ,'&e.I$I{ %I>t=_ I$I>.}hh~(ݧ;$I% QFKC#]ܼU Nt oh{%I$b:r ԧu裏}v>Ϟw8I$0z=kY57b B Lii(d.I$I$I$IK$I$I$IE@$I$I$It$I$I$I$]d.I$I$I$IK$I$I$IE@$I$I$It$I$I$I$]d.I$I$I$IӅ΀$It! !2r4 E00H@ 1=_S@FaR "9?]a*/ $I$I{E9ũN7_H0W¨^1 ;v̓3Gz)kIcXGcCZ= rf1pR0}qE@SvsFu4QgQOhyNq/}Qy( dyq50h/#Z6N Sc.WJ&|Q5d0@U9Z'~{&4ÄLn6dc Ófbi?%ɕ @; <6ɑe}%qvaRXmh);ձ )Þѻ8Ukt\s kƤ\6oL0a骦q2L^Lc^&v3G8XYMjі K}r$dZW7Qd &CYhf0*0;Ƅpn*ҁ*b [v3/qړ.&UGg砓n9JCYyVL( VI2ct8=VFLn JVd}d [ܔ2u7`̝"P>R1l*.)JYl o4ɔ'Ѳ1&1E_^@S=N劃X{I }g~5%,V;vT (d*^DC#̾Q(%@3jOcuY&BX%@MN-ʐR~qd_]EڰҾN=ˆRI2}̎D )Y描2Qd\"L> P᡻ (r%#M2PM֑1m$JҤ .-N,LL0aq *L*,jȉj3t!pSa/Jo*NԄu܁9 +!}}o*Hb qN VlTŤŬgPGI +I݁L]dS:?PE0%ltà|GqJa=YFMNSP_e\b<^Os V9Aczd3JF,=Apa~뀟 X6;pxǘȖ׆]'i)G z0bc)㼞XK&BjbT? N1XQg# Ț@SRf5N RG`aʲcA9 ,89 (O,%Z`I0U7IgˆY WakGZ07ۊ?c&pVKYD%j{cV㲄 :T룄`F_xwD2 <9F7=|JN?G¦IiOoy?qͅ甋!G U>N:iI2q,8H6._E[Nha?+;1WiL*#ڵT Q\T_$Zzj՜"R`LT˩"#{EGDҗFͲfn3!UX0ejꢫх+aJT@pze!8ʘI.+f$K֕80.^l .x[0OHRDReR:Sm'&)4m%ҳXkf|q2,6w̢ Ԣ ulIl,1Ew>jm)8&I;3+KNhm,Bm,D֮ SR%~rQ2¾e6ZEQM^q&a N2^f8YÌ?YDlƺ݄u8*SG:lJTW;YO$WNTSYKbܨdh_bI(JACv}v45 uJE(Ię07$T+YV %]uPJ ҄+aO2K$'!|$ 5}UCA<"TSU(A7qAGpj"deI҆d\ƝN4oSU$ M X8\B[v,N!jD 7YD'.dA8#~;. MC ]37[n܏P NHU8=eNaֵc72>A!ЇhP:w/AۨƼ J8qA`$!&ҥqlaxl!f]#WTfiuk*clt>rg/Cc#^ãGQИ^"];{BW.DUP= n;b:N0SIg>:!k <{u&'IjN q?QH)4?r_elN tyh%QE]\)ϲƒ.=1Vl+_$%-,MZDJU&Ewjfe8JLSz) qN&/AxiI0UR1d2nOcTMBIE7I`jDڄMjLI%0Oȸ)9XH2b^2&Aچ=L*{0A4W(4}^ E8}# :I39!C Yl%y>E.&MvH;XDuk\r[Ii|CfrCzE#cv~ kp{0f µM?'BMCs/ۇLN`x*_%7ncwGO@Dq3L}̕[Ńs %v]=ܿO-rPM~6]_{^=r6 EuKe, .O~5e|S$d3u9etp/üW\$4l䆞þ{=J60kaMs -\pJ_M>9?\s+~ʹ9ZQ}5Kz.gCŵ`#_ƾyG]:ȕ''۩y'?f#lf]bf;ʄn? 珞xJk_އ??Š)noϞz#~Vl1fӟP8nm0)5a Qպēp9\f*a/<̟'b}j$cW04f7ro ootG7SQ}o^KmRq#xw6.IphjTi߫`qq.Nwdw9^\@0D$,x˲Lel t~u".{5KWJ&&TnUs u>bIJ|IgZv>tՕ\{m>/iINUWп,A9۹5{'1[c\H`[nVw<įS_ai(neѳ̻̆%One;?'z#Ue2Et^zHNgzݥeTjf+y1vq KYVpym1N {386+n-Ʈ:oGH\z8yoz %5@kFl%oE҉C[dV6>ƭ܇?cWƟ'bN$YN }/OeoaGpxz1k~ǣԃaT~$)ԥuH]|ؕYKP~+x,S=X\,l<.el> 7LS6Fwvt Ki=οO;rrn1EWȯ:SlS.SC/i+%Oȵ Ss'u'{*p?(G=;Kϛ;pG>@G-{/d'KbxcNk$˰׼Jԗ9.ɧ߈n<{<#b4uNI{ß!b @m||R>?ndzu=%< ٯ>ʞN*Rp`/$4{㦫O5(j(|Qj!/lʩu%__Vռm v=vUv6;1of2x'Ƶk{X42Y^w.3jmQeA?ҽS?'.3O3o|Ffh{r5kc`eh/\@z-eh>ޟX>As^W?O[dn.trZc|.<0]"eL15r/#O-[&fJջg~HpQ?5˃uba5;LqOmd_?ʡ]|ns?K? :k)QR~LbߣnNͧr]KKrdbXvv}]LOa3k.c~ZRXDMރL^u ښzϱ# q>%fi3wRJL/Z=c' &q7ctd!ך u-_E?UocS|DůP'k7R/Y|$NXx9bo&ըC%\OTmD-{YAՒW9\GLzP[r497S밮É=7h&[Aw'9|_TcTU*SxS{'x-mtfQ:xE?YJ:ȩFn\u91p駮6}̆,7o 1u ~ԶoC騫>SE;[+Y<:|YnlG͡_sbw\5.Ժ8aC->B*_v Ɵ]-V'č|jyѿ.o,s>}/u{%v'yZj@AZ Zd=|{f-|LJMb~R@` &2HR7Q T uG(EJ;UUAQ*?ENQBUrBENńPrEAQD. %X1*T!rPɥU_IrB{OUr)jn:K* (\12kZ*BQQ(.7^\E*r%PB)Ij;UŔº)yRrn 壀PQ断\}8NWUrեysOC~}+;AaeLPrPe&RX~nz[RwƲoDnuPPP %v:]BZL7 Ηeao1]OBN_E|Bɕu{PNJ(2u,PO_䶋D),#\]*/2޷:uo{U)lCBYMQsG2b >\}9}Pud;CN79W2},Cn_:sNŔ;-A/|y(P~mGbuz>}B |t`~NrsΔYV>߅m~ՙ}n?=w ?VgV ٹ< ;!Lq;F_8U|,s w"ӿ w TSSp͟CE}?Ogϡy,u fEu8b>oEǝjW8r.'@Ugփk @((+r;mY8º(Nj\y_3sPs;]LaۘP H2͝WT0yDQY叱3gOtre+(2+e~>+f@g󢘮 c뜿)\寗ɕ]:=)QtScuXΩ\GѶܕ>E(-)E7"wєE_䧝]_fkGL)JxU|\TLbبN?e]cY\l9R(߾%`L_k|l_WL9(ZU)\#LQY<)3B镙2_*(O۹:}oYp~[peΊ U>?_ mQ8|p<޵r+L4}׼o;I$I$I$I$]d.I$I$I$I7=rq4ͨʱcP6hFEEqjjj 200@KK z%I$I$I$h4~3, D"xXh7o ??a߾}:to| _J^xs-@ӣ|UPG E` tB(͙ЋafB3eqQHK2A&g(n:m FayLwsC&1{$aEuD Ӕcze&BVgΗQ4(B(Q)Ř 3S1s8>酕?+Za 8sn2ʶP9.3V|9 |Ǭc9P탅:>'3Sn׽^V~STsqD}+6]&_~Eº6E{0fB10YSЧ9wefϹmJ^E1ku1E~PV@~EuCf3 3eDL#K~Cɗ(32gsfjez(s('ωz!p|~D6`El;E m͢(?jngoh)!Qtxp,YC|Eԙ(d8-cØ=őh**i5j~3K33ϕEF9L}1Ӯ?7SgCQQ:3uY(sfsqM ]Qp55on^^SeB*c~?ooM5q?x H|Skl6SVVFKK HT*" ]9tvvRVVWU4o!EbiSɧ`iSZ8V{=aj[of2VNOr> Aڂ:g+@ 5abJeYFr,z]ymњEqGQC.#U K,GEr*ʤW!Idgf %j{2Zebcg6+eKMxJ&7D~G9ǫ4gF]C:iw &3=Te찯%>ĪpP u-?,cTR?92"hs-h*Oe:Nb%vX5 5@:Z̝5s L68 Gq&b=(vŒJљX6vrGaNsLu-FۋiNˣ0쯩Bz= 0O͎dFLZʨ}L^VzC֮ᴅkʠ0Z+}iJO-V#Q3%ԡ=T:P]b mOWcl3bo{ vѧ\ OJqCjB1DE$ e8ѳJ1qF[ζԞ]דa:܈6@mnIY=Fԉm6 UibfBN+KCgy Nh9S8 L- \/S2* O'q G`飴v+T [ml_Xv<9r{qh$h9Ɠ4u[Lj0X̐^G頊Peu=IF-%,lAͪcZ(2&dgJqbĈotZUjTgA.6ZNRZqv{:Kvxx.;pD!VcN eX TX 6G`nxF]51%m.@ T Gܠ'Tl?J&Tl9FeA [{:HT.>Jj)BǗqSx3K컈:ADI<2j|^aZp 7SS}ʱ$S6jjm;ph~UUa&V%IĩuQm 2*aw>eYNN-bG x0Kc92TtvYdtjZtud&T=c=#t62/2rl-Nu>Le|\be(zqSgj^uN ΀σ?!= O׮$}^zXRj!v/Te3Nܮ=1p^ z&&0'mei2ZO86~ 0li WJ=*f/K'B pomcXG9i/ɰaSkrib,S#dxChl,a+J1(}XN^cgAɊ ÇQBAzO!._GM2)GIk)QY/$]gVJ Ǒj&A})BdXIu:e,cm/%Jщj&]~^s=|7cl8*רg" ȜiJqjIbz{9v[ǡe;5ƙm?ķO96 #W([Sv1sDJ"{yrCWeDyB*Nse^RNܠX>J ڡ ;'gܤ%GI5Z' l$IÌ&(Lkȉ2=QG^8IcT0H#XPЉhI2VBT[D/" qt #L}>xq= mźc09U&BcZkP[јaW&#iӜbUF ݤ^gt'h0$F&wP+GoMpfr=FQ_|N.# # Zuj(I5NkWىMr1*%R3TIƮ;ևMvMqSf #i4sktfR#tiMRߜއxW:r9Gx,غ~v}zԏYIQqH#5)q#'9}W9(W'I\'9i.GEN{*B}"F.Av{c$QqμD/~tba3 aDZ, ˲'z0 p8ih\| $$hVonۇ FD6Z8hrq]#Me!A<^Bg=>K(ڢbO MzF m8^#jD ,{cq.b."]d3BrBԒ4 8d]1]-z|EvܿNQHN;&7 HAK0 8MjD5ŠXBc.1iT9B%+-b"3qYNRPna"Mj] K&ThCLo 7b[c36 ,'HK4 3$ bۢ%djC5w TCI9lIiUg)2Y1K786Pwي92Bip^>cXqF2PF8G4]<`Tp+O3rD'md-ImTYӦ]W'1';Db5<5"<"U4{Z+he5$cY3M6f@5`#Z 8"LqV1Yh%90?v\|f9 ݱ8Y`kz$ǫyVR\:F-:: ;:~Qxѡ]F$#3#iȲlArHcgI7"fJNXצY\(G/ĈMc:+Ds zh1BMd{](9:Imͱ%FkxX1lIr5r!ӷL] w'xNj]6̬KT/Je2Dai6)MHFZ=D;By$>FuڦP&)R!MVm2ʈ"i 'Ì# T/N;.ut© =LSIDAT4E=ji"ntR,A/Hm&9>$ m%jhA:Iht&$Xq=O=md 9"a $$5yZ :*JI:9VhsYbX!\pQĚ+n Jr<6NE#E*MA&%ӛt$C;O9G4cPO0H$U-Mر(q!hEBbD l^JH aw؜H9mO2өpHlRSDdr<܎E׎S8dqA%"R!gg]tgF( Dc® #GBX!H!Bug sG,FX-K$z82+)t]F2EHy%yP(f+tJ=q #M2SDSevjMJ,_Cc3s=)CwK5I2s7S=b*4Xdea4 _?F8b$R@t41'LN6:7iwG0۔Oub,3[$6MwC"VD:8N3N_AMPȥ쎦8z"QYLb.EԡNpFΐ3߁zPY=ONƥ3gOO277eY>sq%.^ș3gxyv)V~ɔkzP +J e8[1XVT8J(ΐ^>P"ҡJÄGK 8+4(rQ1_2/t^ #e cX _+r4vw@8N/uA!={ ū~ _:X^"$X6ˢKP5-~)oP,mB! ;@؀Rh`9W4@_1pDP%GU(<Q+qqiNP~znYӀy;﫰Gʭ! MEVHRxW?\ݏ_%@8da@w& C}$®rK[*^y@ g} ƕXs*RA[MӻGْϾ̂ W.A8^`-WDߏx | 鷙koҠ1 %(^,|rξwuo{6@D0POSO8.:U^>A`_*l*u'^p>_" \)Oo|_3l5>  =+/T@Y1J :׽10?[Jp < +wti}Ӥ'?/*6.~FAY9R"9}u[ S/wm9Pr.W/e}Mu_~g2EЮ+c(ẩAV^O: 8)ۋN _31i#T_u)?[}yyP A) aS% t_۞\<*?N Uٷה27g_ kAz']P}Y*#Xؾry Iz-./Vb|,8M?y;)O]|` eʽ_1 _-vW?7n.敨x<w@@ ۾nTrNxN{C{z]?ൠ58N xzo?P?gĻ6hmT>=Ǡ}_/ ?ߚ! 藛Kp/ a`+ R) QJ>3Xτ'gMsWR$ knpFj({h•½ !tOǻG w.N@jܤt[HtdcM ϖ뇤{ҕoc:Y8h޸-UO7r~wƓ^Z,M^|Aƕo³yMh} ͓.Awpc9!y^~ٶ("k_|{a@WhD`RtK͕rڢz~ٵꨫ~}'|y+myz /KWnmolF!`LL{K^K xQu?BetKOuSʕ&\_'-Ak"׮^Chnд~R/NpнPKRioi>?\]>/Gr3); r OեoҍCgRNh=~j3^I>F$M3!]*7Ǖ}{*}%ݍ "ȿ{<_< MR*Ϧ\ Dk^^H70szq/n?ws_ssy?'e#vmT|Cz17/ ct//ՃB yv&w~"Dm ] (G>/?:҂ 鞽 }m FCz^j5nDJ)K~4 9g.GGCM?M1#M`_Dih*|qS7W"74Qr yFx eg_$ܽ9[z!ELCF'dk4q,A.q˥+{m Źe~k9-zdW2t8-l(^*^36خ P5y$*YiݠU}^R7(5#gVi*nYث<=rx;7+ XY)>!u%:yuzmvZ5[W4sm*5Q巻&<ܥb6NNh7cZ\oc|^\מ.haϹ@k:xޢCьs|K~l*XmDU3ų&Zur;,suG!fb}s&jm?ֵ5.g)|r-:Cqm)SkdB+Ȋ+T_{TM#[78o&lMm"hX`&JǦՠ,Ӕ*$:kDBKYsiQ+1 7i+hF 'kyP`6 n p<**(+mj7K;~|kej;`hmM b{VWAAXEX=ߣAi:bxlihYv;dCk!yMas-XW:ϟoPk7C]zV4_FoQ~p:6fc"uWB{llՈK [ ZI}٩heur0TH-!y+a(̄$(Q~U|,*D&s6Sϳyk%Qo|I{ݦ4ɵawF,ܪ|fV@֮o$n^cJxY J:U_-RMy^ZK-- !Z`Jj1Zg+<^lRo_vӰةF|OHpKLk4,6Ϡ6S2|U\%UN96{6z.Le%ώ 2wx<۠``KټzLJզh6oV7mlvJeK_=C:uj\!ޭsW,5ʥ}J 6>-*oP<0#Hp-NXΣ 5E#b ~sՕ.Za4r>mdMhJ󄅃vؽAmae/VF_vibNMv}d֥&6ZXW6H,z%(m@<ۤ;$3Vu(_&\+ \ -|e$[sde[&*_xFD8u^֕4޴.ܢkQۤ'X`-MnuqCrFc3<:z@j/KHqyPx#R3>W{`QT rL&all/{m;u7θ}a'n(a2ӻhl~ߕ;ri{Cۛ58=A=-~<}/]*w 'Б2iAu+Exs]poYؽ^&{$!9kGs-0"s ;z6x)dLy}q8^Ǔ7{[-8BC{ހ=A߯oP zAOn߰M< >~p?'GM*Wq=>}!TEp|Gȁ^,^cwH?v+0`M^?fxX`>GS\KspE.|:۟wP5w< )8Qo!}}J2j`xGj-7A)~@=VO('~?v_^4_{eA& ֣a5@߾!5xk7l[?ڿ_?г$@ߤʋ{]v"x.t3 .x+Y'J<v풷 ?nxvBY)~\{FC I.:S@\G $a{47oS/ `@ |Ǩy~o 0jN7e+7^r W{vEJ!$~PneO#^t;^OP8~`lzy|~[i =+A'%I:TG |taz-Ǡy{pNn?`Rx|D:^ݷI S />pİ'[a|U: ؐo# }]תGp@G``qd*Oq?9Q'jtxE%oqVEx|Q#?IQn|?mr\]vxctV}[t;#_ |kq5 !slRfi"m8>? mll,8 ſA4ɉb!_[jX8&|XB5-"$ge3C 1C gƷ}!b`(ΟEOLğ!b!bD|S1C 1C 1C 1nЇb!b!b![ C 1C 1C 1C| `Ab!b!b!bo 7C 1C 1C 1C -}!b!b!b!0ܠ1C 1C 1C 1ķ!b!b!b!p>C 1C 1C 1nЇb!b!b![ C 1C 1C 1C| @&`!bD J  k }(Sk= P*!?pJ ,C:b!b!V{Nޱ=MC*7m˟1>vAjǰ8fX G31viyhI"kPL'shVg2u=Sp'M32L=Be#:|dD:faTBDt4ĢUte$zA.0s3Ib~njP+B-fi[)¶¡wl]c,T׻Ǡm/("yZiEwFzM(5sqӺ -Ǩ]G$ڤEn ĭCʦF.pC(9L:%4Fܦ]#/&2C|b^BQID5٣pVZ1iUߗln3W1ƺ4wE:FT26{4rLFVpt<2#lN0z "$(mELo hBݣ18Rx֨S$xF8ʸ*8 tP=a$ė'69LR4hͷϖ15Dta+Ѝ wH%IKYXB:1"PsE&Z-68rfuŎ}+!;(n$8YA65]؟\;i*>灍ݐܞDE4\^vlټAWEotjFZh#.3Rl'&# 7H+ Mϝ!ߛg)z1K#c"(3p4E[9CoK)VCkc "I2\}ha}d؝$,*&$ *C:4&R[Ä& ƋTOFZ6ś si% Q^ %ϣ퍱lND[e Њ8Hq3IL^BD,m"PFkLt6%fbf`V.z 1?}HWQQcd sCiQL;B!nѰG6U2& LMTn%n5m\"a ֳ *8$*CuBc.ʑd9iG5d@PL"G+a&43ncv,EF"D),'D4YjFB8BF'd0ђM phtb$jMz,b2O+ƪOi7u89FG).L0S1b5Yp"~P6CoE̸~wtOE0ߥ(cTi|DF\&uB:MT/ªsd2O4K{%㣤69}RJz0T.j4g;]IEr3Hͦ{-'EhD {+߯1TNEl)%{8JcIiL ʌ4Gbs6 REVơtb zS̞(ݡ1i` CB4┦*G'JZXբX *,n8#]wqÂ|N(LAL8qTdګPf)FKL^{XrWmT UKcHS#n$ 'p: Sx\|Dr$im(gf߷Y(F3mc+;ebp}bLȡR˳3,q '|G/eHhs&%™ &Wfq8^.05E͔yNƨqAyX$KWɴ{Yfz2<"x{-'Sqfu,'DńT\Ƒ+n1"F4N-#=FRFh[YZ2ƌQlLS..q$}^;-myseX[XI١aG:v(H*0iNZ&iu9NR#P GMXt8g71FOat w.@DSԭQZLݦFؘ5,"w7Z܊`Zg.SM1룴R# .-;2,DH{YKrvu =A%~6%v%b% NB?u%̨". H5KUȥtK3)tzQ'&v XQ.Q:Z;Lgt/D#/!5L۠ ѮObJ6-Cٙ M]ft4EgiI4G,VXa7MEiXD8A=ӿu~b)BB_Ͽ+_7̇|~o??7Y%/G06򝝯Or:|ؑ+\Y.̟_$< \>@wO oSg S!n>52S]3Isd z3[k=:TY-4^0j#g*{\}v9X/b0Ya pŇ9_~/r~_j{>ЎmrwM/8i滈o3;}sXJǺ}8~93LaūfY<=&*pe_N{3wurr3?GϰQ;G^%:Q$/P^{>AaZҾt?,m_b޽g=eVdp_ék[|fg_;rI"c<(x7s,}S|߸|ۣM~ Ǚ9tlYp~?x?$)㜺j֪d[G4M>{{[ݤ%g!=WoQ{w|F[wÙKQG2/+]iؙc u/]-G_?|(/;"#c~?~_?W 8|6wsw= nr_[~M>{Cl;>Oyq߱ǹяkgk\7iJTZ{q(Q7J̯H>ڃ]B[㤫ӣ..qyn ye1^'xr"[=W}do=`^ Fa_Enr'Py#y\WLS\Hl~;s;Of9{S|{|2^Eez&s&o凿T$ǡlɻ^¼zXswfxs._ Dzpq}L\hh.(oS6?./fz/?KB|5מg~Ͼw)¯.̓OF k _^ѽp9Ʊb"%?zK<1>e|;ѧFX}Ç5œ]'~fyhogs_aV 쇾̏>wo<P׿eN|[Rz>U|]'/$#]laܵj$y<+g dS)x{k/ܗyaӼq|5~gxqE|5K5ީD_ o/rw;Twy6Կr(|乧|_#| <^֟,~B4Ý- kc3r,E=Ҭ[1F3sG}_}sYaCq}rd~4?|{ȥ|ɽ{{ȹ<5P3%B/rݬy۹gw>v&W˭/M}|&n?'\xwHdl7?J^?4't?'OW~dxe~7n0wP#?+'*$/?sT αOsuds\k`kҋDKQ޶ |>Ic͎(qΗÿ$L,^ၵ<~Tq~~׹x/t?ėCmy]kO̻q5V>/J}ޥ{YygC->EAW?o{侦@ \f~:A9ʿ/}z?R5 _pԻֹx^ѧC Y y s --jPЏx`AYǼAy6 s@9Hπ4uPz<_KW*= Ao$VTY˅o0W0<`+|c"[iw:ooޠ(|{p2? pxDmcۯXb.}֠rA?w/;g=onIJ9}[ԇ~Pt(Ap9Ӿqqg6~׈}z+4񇷮m8c ]h nt@W:n#o' ئ?m_7 O蠹uZp·Dm9Hqn<͟!s)u. Qz@rП 864d!ufk_'x5|o}-_w|W6rݷ}C2`? 68M8%ޜ<~yo_ MXmr?no?P/w\@iٮ\,]It F_K<:-ҽb|?\@!RHzgkGߔ雑Hǧމh''P<-%J+(! Hywk?_4JYE1IRit}G~/^_wtH|}7'W׆x/g`Pwr<2P DaC9E_"O\$Xb{[ .GIѷ[O_]_T齟coŁ-_Pʋu~ߕ^ 77FZ O}*ƮhE1(~y-=y9W۾F8 g Yec>iܼ@=ks)~+xnݛBRJb~ ܗ1#1^[`ӟCIW|K/ͣ|bY?pt Aύ}>i3'};@Tr=]Mhʵ8V]\}Ӽ^(T}{^^R9LhV) }9꒬;gR)*}yH ϊoի?ȏPJ>666T*itD"'?Iưm9a Kl`qqb#UCwҌK0X#yEyƦ1P#üb="m'.2FiNvї穚 6ZN;謝 zQ‹ZHaZ$˓[^>Au.zQb8p)AgA2j*I oG7h<3_'LVTtDDHvRA3=jLZTLiI oN`Q),!gYރn 1d3JGxkClp"zވ=b1c`m{JmZ s)Kz5C8^GGgI=SaC[R gh\|;fwi42]P.l܉L _[$, *cّ[$HNkQIa-wQxм@c$B)L]"m Mv_<2VVyHKװF=´I&~]F}n41& xyQEFܚ$:fdsA*1R0`Gp)yޝ,4*a¯X^bĬe:"= N7Y/(4Cҝi.)SܓFRμܦFvqhtUqA N$zK&2coLrxuvzGM=~hKFC+.huGF$ZWkGhelǦޤF mNQ'ȊYq"<գMTy.|Gx:&;\0=tSMk {c5Clr{ƪ)KoT*Ny"*?㻟|;6{4lkRjo.lM,Zh;C0O"Z'PhB `f(7lc]~~^8;X.swӚoO}bH bCɊ[10D irf(9a$C,xn\ZmV 8A.~s\>2ΫsKNܦF} PO Q8Μ@Lm1dOգlS']y&LA.ijM0aT;ʹw;o!Vqʣ4O[/KT lҙnQ^>FgsgOfU̸7^<*rMXP%C@#՜$̓1p ZZS\B4'ExxBZ)K؋юdC$g6xqLͽ(F9c"{}1"fx]̜mEڥ96f=:Kb~>Hr^d;=^H6='B981El'CD5trMvl0E;M.|B7O*N:p<,tHͬafg1 3$>߸HXvvBl(ԚsL7_P [a*N͢i?k$eP8dV 3y%CȲ(%4#!5l*L=Nq YNr~8cF|<ŝ%nN&ab&bk&r¼?@wK{scLJb8; +c̴g.O9d4'O8RJ$8p[NFPERZ?lb)nF7E=sl٦>peԫ̅hfX2cmi^NƢkw9w="-j%hMIN:l )5̄1֦a2_jQt1FK(Ua4+3'@L4ڬqfj<+l ]  H# fHpex"xɍwHi(]9>ีKstǺYUj'h#dã Sc_tXbd D5Hʣ>4#}(#wm0fԑ(nuIsvs(Vv7&kFSFd3:c'Ň .N-`Y(t]Q+y<n311*EOrĜ v['{ɦ|y (iVhk c 0bg(&㜝\bK.#ܺlc\ao"I6ĘhqA+ƣ$C qPNWF5-5E|Nx3Ρ7S eh%$ DVrpcx]xS3iQKy9H(;28+3VB7L['8:nHRVjsE#um(q…-8Git4ϭC z4ek,C]2{VnĎtcN=,{s㼚G1NLkRwH&R|+?-XU'q]bNN0퐍3I:G*tss\HOL%.`E9kD6SX-K.wgݘ*L Xeg,Ԉ;]o,CjT !H!.\_䓟$[)b}3m<ֽO6I1QafHynqAorgY4Ƽ w^e(͙ wTVZY?ATu)cDmB-ETYdbyRN'߉%VSĨt[_hEF%d9rMorKtjn۠0UbInT {KL6[TLhddڄ'Ѩ^M7Il QD;FCp?Ew6Г fv5S{q;Rbل{fA1Vz;j| $9*2"de(8zUCoFX_{ET;Ѽkl$&IZ!֌bi֍3Ⱦ maVcɥFH[cS<*-{i'+)ftf{"&B@*#9uyRy1ű[*Fn6mq\C cb8M!ژe< nc$rMܺzFR4xy-50W3Dlr*®A+&3MrC)8>ёG5)/rvRUH6S7[347tFIC*;Ow(74@#ή68ӭ:9S$K{]&ܑX#m"}nГǘM8ō"v& C=T/LDVrox vCӬLQAˎ1_%W+xtyAM6.ᦆJ7)ē8u*vKI sCeԤ$&5HPݠ6{!&mVRlG/ʌ3^12(& Ff6tg/5%2ZB&l>x~K'G4 -=8b>ี'ٓtǻ[Uj*h;GEE9N;a1]ph1QG(4,,!}|{ r.Qw~a~%q&m(Hl ؞Ɵ,ڸg0(ckZ"LX> 4=F uY(69ݠR[Z/?@. uvg|91r[Y-&x#ξs s\[r7όr> 37Z?r( L] dK^=J~fh=)n%CdXKp4ybk'O'l4ao6aE}F1`vצ|5֢%xqAzt2B6GxzJ4̎۠\!HYu&"eiYijH1ArbiИ6D ,I`Ӕ 2BnrwًpN^g$wI aboUZ.6oCӉkM 6$K`p]+I٣\8ki֏;t:]ue>R\y|]-q:v3␷fI`2C,龣C kYWbz$t z%v/v~ r[[[ܼy0xɟIw3;;;;;\~~JzNR D-o=_K@)cPug)%yrJ(8? @ ֈ(n~ʳ2[/o !{%@2D/7|2ctɯ.__J3+qJ\G [[:{"GzJvgk0g3(峤ą_~_&Jhp[_LPep6u{W8yxJO@:~y_KxK/~%ˠ=+~KTP7P2d3~\T]CP\;Kp_&.9:wH:A9r$~M旖e GIs/[ J}:s{t" '{= ;}KA#t%뷻fy6PYo|X -bkyތ΀~{ơ_+9N/Ӡ{~a?\)[ 3A]x'dnՏww|~\y^2tǷuQo)qbۀ~;_e)Uχ:m Rn_ IS ;^ɬ 7~}`Eg>>GJ@V~?_N+mOu8Wb,C XOURc.(??:mL~@.F΁o&]|ܶ5/Ρ髡㗕 K /u͋9~p>Ag܁6[.Rvo|18ʈ"{? 8lNύpV>!hRʳ1O6^y#Dy%A,v+r ʸ-@^DsO/#[-9 -hgss&^ _z#'([xBym^p\ߨ%]pܞ(u-q}Cy{zⷘۜ 5& u^@ ,ԳSaC`|~sp?ᕼ@ ]987Tr x1@L}YM:tO}SmoرcLOO<yI>z=DxYXX Nb!b!b!bM?SߏF|S?:&R B HkH$B]Ci HMPhDhRhR ]Ht)Є.%hRC=M4MCMJ$:RjhR ҂1:GJzonMk›W MhD )t] 4ͥA hҽ.$q.!MxH#Ѫ*]~tVp.$!!:BD zR`KͥCsґhjR ҕ# !uO^ʥAx ҨkHWn4MsAׄ'7-[k;B/kBjµ/)|u&Bz{e+RCJ8 !90G/:Jjyߓ&4RC,5=G`y~IlM8KMC~BJ&w\_$hBp-!Hw!$/=+p^㎂^[7){ӻW_?WpwUɧϣY}!)е;|.@?=!tRt~l :)DȥEw㕔}BGy۾ێpϑ:H1?I=.|h!Wt&I@Ӎx"%B\)5jͳ5M˗S+&D1] ‹ӮtU<ԅ$_5oJx2FGh+r_| {>HI!XW.oߍZk_R"gsz~ϧp1#?צ&|O|?ǥgOnDc攮3b?SiA%4=Ӻrc.R*/7t7q H->7}ˡ|4pܱR*y6kKokn\hkϣ{k{H/OW\tJt{k$(w\9w^R:H#gBzrmv;q 受 /##qPqϯ=.4M⪳[x|4ͱ8PA@rVgzTni-uM̛Er5pnʮ+ ɗ-;V!ť,;MKm²Hk*LF:P"LKս5FT"Ҧ-v4;ϑnj5YIjLuH~۸E]dثZq@=,W6)CdWW6}2׊yQ`fͽdX1mKY4٬eYQtWsV_.78^'VmH \WQRIll2ֵy˦̓ v9vcy3[#0YpuC.:V|1o搛egJ:m^4 `T,ݠWh5:^eח5,kz5h.+g9VȶmME3![IVqiáQ^rm}4K0Q]|Kg#K|KIwn+[ڪ`Ԯ]Q-Y}ȓklR=ƍTx4دI -fMHZxȆS/QjkVy}u|)6Xa,ya'ދ lNXٻIY=EyWyB"7<[eqNVv75mjinUPXƱ,O~K* ..%ٽV^.Zk}:jwڕ9N7:dU6J)J6zVNVe"_{Cc~ Bu(w{0yzkHi4lw.vU}ce\ ˣm6C6l{7om v 6/ۼ*Ph6x9uCR墱NE v5RWJU^DQDxlfoPcK[U^y٤'^lI:^u+ |@fa.*ZW/n^ʲWwZX{2ozhZDI^zզW3ЫQNZQ`vZT6fAT[EIP dâA  - Dٴ6]CNK;O+hi`lm¶InwRdU&OeT]AEj5:).7MBuhMNFBPRanٷYJTl kZ Sm41uDnJ>,YBHnNSX+Loj2bFW&cake .R JqBrn*nbUNiP%8a[m/o[}%`IprQc5LB;D7jkWYڡ\ާj~|rnA`ڢ[3&{[3ؼrw[{DjSDUF==ʛ%EJ z9b'٣tNju·L.TȽO rmQ 'kMѫ{MnWQgx^6] %vy#ז5cnswb\\ctil4:Xۍ{f[ro ;w>99gfdh$hF#! 0p1l1`g X@`hr89ww+Wc!JY{U뫯TgZr4g=Y\t7ڮX 8[e4յ'Y:B}ޡ~ruVyrsK>+16ZWs&AwAάԹ> E>QbͲBllaf>6To^b]`$!8\xFumj+&ETMkU)ly$Ӭy'`\x;D]n嵧PN a%^Kvejy\SD^RwOϳklrY% $׼169(6N7|ZVOqepzq{ ZgѿF,zD:ϋKTkO8|ZE}NwW\f=OT]VD2˝T%$?]g=ń3O_siLs ]iŕgنno8?1Y |ݚasIr4]W3b¿` [s$Z;80>2۟]W?7-Lg be{-[22222222Zc(<ضCCCr9RhZcj!ccc mJND}&GC5Q9DlS:hG3H NHU@r}ʦZ䈉">Ƣ6(2a s\d,WY `%P#'iw ,+#xĈU#$N E_#r! ž4$c"&vh=V!Ǩ3Ԙ V90.M.4#qZ 'kb&u .SSNBN.#Zb: ,C<Qub̒ɤNBetKDXː Rc6QU!t jza-Z۔ebñ|t#r$Q2ϰi#(bLHM(TB$8[ # Kgޑ;7EcA}ȥŔGL0t2؆O╩ y"t³,{ z&ဳ@.ԬQ:v!N0.qD!˳*Cr:F9HDDe$RXVKDҦ$zc!qe0)ay6D!Ě@[(/FKJjLS Ӵ*8I16$S4)°c*tXO1&,FoZe#$l(4) \،Ѩ(.W!ur:fJ ܋ |2vC1nm@lE% |n2Ni?RwyFd5D'-6vBajBhƌ$j%En4S2F .C1,b" Hݡ42@Q.ӖL$BbϷU\M/oQ L"%Ђ7lq?2ib בF#v]!V'G\^)t;)R{jF*(儵$a$)#T i&!QfL;!%Bh,szMY{Тwa:TpT~rl8`jTf{nZKClIW&]H^AOt' QX0' zÆ:RGiaLòFun4J$)|acQ'jf )1k<іe[5XJa$i,,M[{nVr6#E#-(Q1V6ӕ}U "aEAELq$t%]`uHYtб(MJaDӓBoRyW):y5;9P]MxI(kt vd+9^ ($?`(Ya?#݈vJ 7 ֠Pc<֌x1:o "UL- Q2k1*ː`58MTLx]Vpu:BĂ8āJn;%J z\ [ Ck!yt)`(1WWahEtO7A?E|%C]qᯚÿkb~|]n}}sw[OS_{> Q9>|A\4xpq.;ý i~WrFޠN`2}7#_F{V6l󃿱1?"p>DLa`U?_|zoOz#ʷp'l~+?ݭ9=ſyף|ׇiq_pOl~3wL>fB5-&bw_ⷝu$?둥]k?K/3<< ec7&L| 8M<ǟ= m'X/9֨i(t|_V 3x#SNw]{y}_<ɣ/wOp y8#c{ȹ,ް|Bx;bfx »~ľ+~fD;dz0x~Wk޽هe"޼w>C[H[{KڞW"Z=^:n:/331>:5dy$8xn1dQǺ|3ܚ-};WD§PL_]Ϗ`qY_IDAT})5r{Y'_e{7>FrhG g|yyyяp8Xo_&?+ Ko =9 x;O߆X͡yPx'y20ӏp`%.SYK̭yn=؁̩o&?>s{cGև'Yg?λ7>s[gY~~OEn>Oyk|.˧yӈFhfԭ|=\} /~+=M!{Y.=o1{q}+\?McQ,wsQݍ_όWx|37Or":ǘ(޿pBN,O_M>v<5u_U>8^&Br2OۇևpmoVڧx\pHzP׭/4:/:?̾gq~wRv /ї&˗Gx:>XTO=B~/3+Osm\v۟=|)vM<aD/)J+%T)K_Z9Wwp>s7x+{ʳ V#wxO}'T猺_#W#+T]CU&==(ezo+KT1\X=qtNSsz]|| 7ɟyf|%ws{?񳜱Gm>+"܈Wbn/7S p<6j׸z0Nj_r߻3y{[npodljů7xhiNoGg}O9>.֙RAk_̏/GxW3O>ƒTnė^",{/yhC?ya_{O?>)K~oo1<)?y71s@gA=Ar<;yU+͏ >u-pɿؓ\=a^4[fsNwx)&?eOQ?y{ć?s Ϭ&_v I/=a<#ɏě3W,!OL_;[znys}3o?>?{0,O=~w56v ^oylgڛ!W>O?X. _cz~JN[3v߇̵_<Ȍ95lwZ8'9 %~{{훠'qBԕx'P BCy1az=Ϗ 4QC^ DbB8$} QQ૘$ &NbtyE$V@O?& %'I( ƨ#>: {8 1G!NT⣒X9#B4ac8$B#@0G'G!I$8 1bt#c"O'!ØKБOI{$Jc$G8&ךoqE1TW0J8 ςOmD&&c($ t|FR0„ CM$ҠD$=@%AL($vo&ڏHDvBF h/4DAB`mMDG+b/շ 2!LCMRHRكԏ݋nL$χ? iXcF?& !M%$85cB"KۆDFE1qCࡃ$=p˘R1Sˠ ;0"Օ@$Ab"_a&zƏ^T(ўI>("ƏL0Aߎ4QƝ D=b/~G}jB#ƺ0PAY B Fď&MDyP.0CP$A " A{mM, 4yyAeBiä5G"vb *P;>I1q)b( 1aDGi\b_!TB"bT2>:ȑ!Q ISࡽT.z[zi$t/&I" $!4*Cݵt@|TI@C!q,Qa:'?Vh+‹4J$B"'=0q|iݜT1F*[D1a }C(kXo[tO0IP龯{iNRaH4Q„ Q>xI㈟24ăz[Ictޒ`>2I؃~V~8a@hoCC'$*&Ǘ݋NO*~h@Ko4_Ok# >&$"B&I}8>N$_{=Avxß B jGvvk[X=sqokKf9scn&cŮ__|!^됛rK2x 1h{kʻ{~ū[7)n8Tn妍lM#ܠHWf)Mtۥxx qCb}Fo{h vAvkZ6ղ7sG۫r\7kȶ݅ϑk~~@ u@Lu>v&>I5;c75c7t`97Sy'>㼶x9f&^|tn?[Hyג'vk瓛 vnF¼=0;UJ%g m?n(o|w7^͛"Ywufm_fv|ynީρW;E57b{on^3 .,MMR`Ů $^KUVMun=ᬛ5lk>8l^Z_7K`[rwQR|dOqs]kMB)va1crqR|>unF)0}FFFFFFFFFFFFF|N38G>•+W(˜2_r!Iecxn&]c@O譾K&!Ne2;A@b[FOCj0R"X2cal/b`K[KCR>Z^JeRAh2Z at}cLuaLۭ5~R` 6jHm/]}؈ P}m42p>؃F=s4f-"KQ J qzKg?TR1`kly(0}ҕ޲Fk1bߺosݾ-(7}vے Kҷ4-z0>F$cؒcmlm+nǬ~6!Aa55Vۂlk&uw w3#rӅ2z5r7lȭ+ѷ=mka1jt<'~ݹاVol RPom??;cA .[1ݰ}EV_vC9k*vn+r #wxO`ގ˜4oC/ ^R[M?[F#wM(iҘ1STMer+=Imh*|S=3Lx}G5A=ѷA2Zlށ gT 0e~[/iݘAL݊!P;3 mlz}ߑ4c+c;O3ƈmfGݶw%w?7Յ}4-E{L!1fg@A4/eIoS۪ LK=!`mb [n#Kx8wvїGݪ:bG3XY>vѲ?@oiw֑JrٶW5A˭ 8DZw j~l/䎸=0: 6bLgkR-,^?#jiX aӁAL6!lm? 4fk,HkTd䋭:8o i>ޞl-!0f{ kj4$3܅a ]%u$v&JC,FǨ>]QŠpWZt"1Y>;YSX- dJH:8"pAÅr"Q~EV&J<ž%;je/ذǑ2Fe*"\ɵ FtCiL)d>+5ȅ40ËՃ1A}k#{Yc{BT(F 2hYe~fIgZ0E B1Nŏ8sP]cC8{K׬.ЦQkv>GiQ"W3|y {ʱl01TL^`&Iw*<j0X8ɓG0,uBu׉~m~g6XOPqXd0"+jkX͏ctOYoaFG0:vܥ;xJ1Ný-W8Y:ŚOyt gZnz!aC>[yK,V`su^aAf)9ʭe~Z^g!"R[p}|&b^$SmrB= UMzV֮'NBTNxr7GU\ǣS=nyȑM5 )9TXn;R;eb9coMg(WhCY&p"Z`wsSЬqC ܑ\#lA:vbXϏ0v+E/ppb]!?w'}*~Fb؟lk[hK0Ď,bqTםĕ!QsI IQ0&Fo^FC}Z;Ki 5AN #Z%bB7vB&Q96T}``R6Et"(Iu#t˒yz]z1N¾Q6 rzgh]n)]DxydZ婡3F\h؛[zC&ңb{Ne3w ;hU =VMQ*0b>ufh%OG4kGʴ<ƨneĶ+>:̱X@X wn#@Mt;NkX32@l\z}xC[籉R>hܥSp)=BαR`6ݓ U#4kGP2-/!r9#9Ft˂5`r9bx!b5jÔ*Ţ:BvfzzN^'q ݼCŏYR*B) )Q\r'ۈpKHUOqǧ(7O0c/ 㰧%Nη(D1!q<@(۹ؒh#醣uY*JN L$-\ ,=a&eSB>UK겞akeF0rFĚwRNðlᢰ݆.05Mƒ6a揲i`9̨ "*hJlr7w2^u?ML7%²h 4JQ5zo?EqL!JRU׋{([mNʼn #Vh%dg,8>Ȅ# g~+b'68&qP^ ]"0FGp&𺓄šNaJ: {T=bK}"ˢqcT6膣]|u eq0͉hY)tG/YDzC{;cAỈc#lLL^Ec,+=9}U1F\)!r  Mqĺ e <3t/ù*VHaECQA\r= au6oX;3q`Pƾmyl0W( =QkhA!&ĕnoMgbG04d\Gf*_!2.f/F.{&2aSL1}ca#?Ħhi9&j X4=(nHp %ѓJm5]vX*ۼ29nPj{5ǯ4om2Qz7R)nw mO3<<9 w8w/kwc\nI* <>\e/coؗ]'QaȶU\2w03:ɚދ5=;kn tzgJ@^޻H8^c^go]n#V&=S`ދ_UY/rZ31Sdž;ԊLrF_j2]OMa4A9_g]L'9:y?=v=r.;<}ħهWgxyaZ8U*,&ӎ<beϙQu_]NqX%a%ٻdQahm?f]I:G8}|.-s0l^@Fyb>N,\+ j7k\=1 w;XUws8Gz x!;{RH+F#DŽ|M8͊3I%/>Cw*pi^{7[O,尌x7Ob,0!=[] nǡj&WC P3O| uqO/=FŒ8b}1pK[@HAȵN[Q4C1~ zyb0V6bő/S|Z6&q]Dm3ʞo`iX-؟Csi>5yIwRn+a2nJI,Vz|Gqn1NnްN7DZA^<9qCFh}/ t{g2m뉭+A%9r(Q} +.6VFJ=pl3Gqi7gT4(t˒Ǹwi%/ JvCL"8*2j̞N8gXp8Qf@ZGgw,4qKONs},]Cw|/r)/9Fux!1HaF=Fex66!n{Cyͥc ?Eq ứ1̱%Ƃ F1Tbz>tpg, K14dz{2)иEPc]^Kek,ޏ96'xz,x.rs$x(9VzQJ(qTƨV Qz Ý[G^aq(fk1/N0q䥑阍~gc#7ns<#>n*mFG-Car[cXҳ<;zoVqw?SGiT-ܻkO;kővcK=\d!tl& ~H;Oa^ߋg[n3D|Vvݽ_N| g^Z>qG ^TqW.qgNk|j~*yHp[w^~y C5 .TwxgaG;ρgXYN+\ `wyzۯ2 Ǟz): J1ňaJ(M,Ly0[8PUgEKNwI|S䚺;V,M=xBI]0ix>F ,p-HKm }yZW웸ӷ%8@5xyd?jҕI86ѹo7^;ΞCL8+V''尿z<5Q8EbsH+i!ETcb;3ti?nסQScHPrCcWIuGkӉwL {o-7OЏ9 W\lLǼoy$t:_n|] a̎?\f=XyR݋k^sK\juave/y^T?gv.3;N)n/,)XĭӃ%7HBiZN=28`ǯ[ ; ,+/g^+vF/ܱ~(ώ϶ll/47>ЍCcw,wJjhhƷ,1:LjW;v`v_R<~"НKq_}%vsZn=2>XsһK 2>j-ݨBZʔs--;&/ymibDnۛs> o-q[Bv89N3#~ӷ H["j ]hv/ZƾAݾ9Xu]cv ëltb< KwPV5NߕvhUNaV 1b[w;Sn˷uBke2;oٹvNvvݭnKԷkifnb0[qlfn40X;XĦܫtw-;SJ3ZޙGvڠe4~c$ێûGvwniZlפK?Ԅ1iK_]U}f;pm)砥Aͷ%MFƈ};n?ؾfKQ823Sz2s63ٽݯ㖃 lZc[ ]ݬϹ[5NwUb7s>{p;.?/*vʍEW}sdOwN |N7?~|#m~CT²N^377//S.y{޳u9}40{(3322222222222229MХmoG8:Rqmۻu]/2J)7=f RIOXB DH!XFH,1H)Ri#AKB", )+)DJ D )R|!D"Ra 'EsH~baO۶/b }y}/ZRnXX;%W2[Of:udU/C,$1Ju2tR[ MLj~V}6RʭBz %vDb D*=q{ !]dzt\~ϒ[ˁR`KRqĖL?/T7u5&2-2m_KHkKOBZ[*ZV aadǁR">#mꏁ֖];~"6m}On78/s[5;?~}=%Hc0Vߎ@H;/-ۖ }za-oWw-Bi\sz!4J¥!B>s$l/`Ù>oȠ[t6E vެ-_[~-oazvƳ_qB )ɖ gmLnO),Ķgcv,Lv䶏HߖLj*~߭~ ۱[X;|?Џal碁}_ʱ9tcR1|+ʁ~ [mD b鏵ES-m%lDߒb-NXa߶@k`G3kKio[euH?J?FAJk˧r[Ŏ#rE۬Z۱sK,݆jW`4o?~Ld+sڠ`;;Tn OHvlm鿟0Wr5nd ;vE_-5'דuCΉ۱ޖmvo;qvlK ~=TBJ%r;^ooWd?[n`3nG_ҏ0ϕRX[![dߦHk۶bgӯӨg!A i==;i}mL@~ (c+(MJ}k;mڎ9[cm#[+ 5wn>eR9 ڈ~mӶ:q^h5ҮNamfBu4S rV~ 4o=mo r՟ZVS}_6B UWˏJ;zcE҉azwLG+l6jbz5.4EƂ+tW^bvgtfw4$ds1"9.m.1c:kϳ.V{&1Kegw, Hupz.f+,ש;,!4s$Mֹ+^co)b.6+0:Z%25Ò2b MjnHs+C fq"A[0+<1!j:Al蒣[K__K 5}BgEƙ$U_eKY\IT+^ǥfmɕ$eVj1kl\uY 6IYX Ԙ5ٌ7Y^^/s^/љ9ϵ2fEG[Nxg2VU3](g~}fZJ] 6WD \irzN"YXuq/[<q~s疪\Ѭ]g{2kEô/Jhfi  6ygyf"i H;qx)Yen0vfZ^>W6yv!fKbjtEiECgka4ë3 lnnpv|ZeY]47Aob"yi$",,+,t(Rgv4:y^ ci:8McUl/i%<!m4^lfTg2LrNu>zuB@ؠkXMӜ_CNQNE^zE FVFBl5 c֚%9l6kXrBo_ޙcQe^JMڋDxtѕ.R@w,3k fCifl.Zhl kxm41"ky6" YuÚ"6]LoUo2^iK5+:ܮg2NT!=$/ro6{Ŭ6,]ˆȪrFyGh_\my%hu]mrk"fkį\;:k\بBã܋TiYB4g\/,oX6v+"goxЋNqimI;aNYf6h& txby%aws\"tϱ^?(^_TUDXX(t[ <ݹU[E=6eۜdyr,s4zKjڊ^"%mE{NY#̚ǒSk*WM9Ý6yATgc^sq(,Pwiwa%<ϕ#Y[g^QU*:s1vâHQLHQZG|}a}}գ:.<[.k/8_m fau5A3v h4۷#A^gxxx=/B?s)W1N F8X&FzB#Nw@PB U' o"ҭ K|ۢFHZHRbiocRt('տ_HC",$16Ac-c"R&"ʤ؉I:d%iX VvUN8:!ή7$-vJвM0F[iW*0J$0:3emQI7c0i Nn'mPXZ$NH,ФOR6 H@ZttLd;/D#$!5R$[[|#@YX2F+WHn_AtKNێ $( ʤ푚S[S*lѶA'ImUv%ҩ]n}?}6 a%hm#&,P&- _e,Ԗ:"hI?tct[!pLL,v GF 4J6gE"[sTCBӭ2ѩ!Hbl #I e!BH dɴ-cFP&m Z9ݘA쐨vO.q AVR}X"1qHr&BcE ʚ HщMb:D~|pDO%4Ro/I"墤gob1 7{g`h~ZW(0rMտ?v'z4[[P ~UDCU>N:]8hccҭ=թ"ya%mm Sm2IcTlmlm(X2!Q.X[wI1N㳔ӏD(0eamm0(mKChpilߦ-V.XK(b"ֆt+D*`-cqܺV 4b!U^A!]^Nhmq>[J~ 12N][J-A96ں| X+/`kX"4~]#Z#R2k$q#&#RXX@eRO,KZI(a A4o:JFjSˤLac.m#Q 쾝X ڤcyB{ a쫕Hk+h,#JۄVL0H2F-#rEwuB"-T0HeMml`Hm~wZi>3MZ:F`mҸ۹mi M(^Ɖ5J4 Ҽ%ibV=_iLM0閦 Ēi9xI}ڠߪ-PHt[1 HXX" :"B ST7hl@6A gdddd|~!q_*|7"=####c`0nǬK4#######㋉lE\̩WSOQVIzFFFFFF%/z9s_xR̃>[7+PJ /={Z)#######D zFFFF A /@\ƶmn?ߢeddddddd|Nd􌌌o}g}}ӧO311eY|Kɖgdddd @-M^bM!vnx[ ^]C'xW}=AE7nV'C@1 (IS$ Ԕd"VhSv&OlID"P|q9!tQơqH$2c28!p-tD^GaDyƠaUKbF9eɎGWcOG&cEJ/*xh$.V<0F[ RS ד&W䓘EДq($1H ʂ;! FB1I(mLRwpdmBǢEVԐqT @d\bGC <>t)H%бȫv2a8pl̕NCC.Q" \A%¤H^ENQ@KBbLԑ2KDƱ$%FmYyk)%)ъ(B#(NK=tF( :$m&M],;Š%~Itz CdR&B&^f8⊈z Q[PE HlKTI( *a`\j&))'  1qul۷KpU~Ė}hWD4Re $!l\hWgvFLNK:%MӮkJ ~AP !ȉ@.'i /Y&IJzrI<-f3\J F h =Ikɛ|@Hl`{6Ӿa0r.Ps]pz2O.$`s_죄E!P9C!дsi|9 `Gibac`"d0Gcdl%6J6Bh4e `$!6҉QHDN I`$qfPQk$A FH~ (lZ 1Rh 1ZLbQ=?D>zc#D1Vrӳs,q(eᚘD(۠Sȥ5"h Cc(=AbZ>Z`ekʞB+h(&tDÖQډȡg)pK%ZR(CTRndwL'I 9ۂ`L C4 pIbXe GH:BE`9(場2l"J9M6tMdیzvѕT_ORqR=<ҊITF P E$*'-b"8:ȓ؁2]@uI@4!6Zi648%ÊcB"DúC.<¨ F!BF"J*H`j6Z+ZD&.8„n.Ԇ|`]pCK@) K(0ӡClr(!5!C 6&q8^hE,- B&9!eвɇK$?/K)PX8Yvq< j,7 -;@i;1h 8Ƹ Ug%%9,bˢ,(E!\$H;&΁#"eVL` $A&gx;x v.C.RߵaQ6=FB7i ]8-bPa,;FC(;M1H۱ vK INcMr(l J EU¤&&ˡJ!$,ji#Dh QR q ez( BCI("vYL?5.`,7i,Cv!tE:26e塰!I!Qms&Ơ 1%!@R` 잃QR ƢHzvKpe$yc*2t+Q#5tn DX\.p*T%e!HX2U7E,\ iq5Q.J4(#b\;vMkl+,!MZY)#}K( qڽcْ!ӥ+,;"YJJ ITWiHsM.QM ,t=P%1$=+Od o1{yINĶD9@%yTX.#V6Fe4#TP: F($*]4M]{8ˎ{˝gg''iF91^fzwYe^l!F(K(QHz:}7_1 +P_}$~SUNչT"Ҿ!'1b:! 0~cr'J"iF4;P_z"-PT1TO&{ȁ'bVe1'$>b#2N G:&aibZ=%soFϟ~%ZWS8/>1ő#_!hѷ2|<Ɖ+KJ3~fxȺGI-fȿ.yo8wv v>yΫ9g>G8#GF8Q?b|o%l>$93E%i/2u4p"bG|Oh6F=uO)}Ϗzo߻6fm\X{MY/Qw'ߺ>ƂCeܼG?E r,H~gyg+%F'?T+N&:?sy:)>.!x?C{r+* '_o͞Ƈ?6~'F&?~bß/«35\sinR& _wG#-8}it6q(=z|k\~=_߸cnح{yN;Q~2֞MOrᥟ"U~?{l+_y6E_"_4ǬݜgƵҡop){k]CƫxnSW5~m+o9p}|w1V=0iߞ̹UO|lĹL>KqCn`}[[בOMߠm6?E*<_>{-Scğeϯ-D Wq}t9]ܳq;9>O2y߯^ы~91Yɽ՜K5Jg۞c>Ej&~ ?'>Ə?~lhݰwNSßoλ=0~~қ'@r[N.w6lIgd&6GR=E'YY5mGE0n88dŇ LjkܯurbBnAGk8;9!^l9/ή=qOyi/^u7!i\Mg>yhhp۷ob31iSҧk( `W,>2T>x{)ߖ:='c4Nz_p-?ɘRM&k'9;jsxt6ٵ\}/⤿_؄0cIZ8D ;X7h [.ǸxuR@$Y[x|zټY(Ű*ky\qoɷHa~zGb)v1l;-*.'|8Oܷv73P=;Jx UYWuy7:'?(k̟1?SbP0LjUn ;WIwǍ3{pk'ĩNm{M~B9~68.'c?/|YpdiSF*J-ѧ^,s5wΥ9 {ôuql_?݌ H?fڮյ뭟`JɳVDn8wl?.U掵`F+!Igkpn fg.pF.G GSlYg|qoEj\.p 5gݟe݌%{Y6<][!~[$rt>{}.٩^.f!=QSy' ג,`A+O^g_;n}G<\BCʰI6?ǹ3,?^ gΕJG>89^ .;Fgwxuf]OrN8<86̘µGuw]?^Oqfss5?sۆA6WAJElSai)lJ4}rQ@SW[H5ՠ6N@lPRq2%J*15I#Z jP[4uRVqY@x m`ԚIZv0kIbAy]kjy䄁YijWFfb3D M$g**%ִ*MmhXDlSɇFzgȆU ]i$)٣NULbeKC/QoH5pdA,"# ZQ֥.ؒAq 9J _UTJT!%]7KD4^NM)uJfMDVE8c,xC ci|n8 TQRE"!QvCFLbObG)]G^e-g0j*NJsǔ}\S 6Rɇ(S6h$mfբrJX=G iWZdr٧e[hYb%)6"fd#z֩5&p+e)dEìT&a@#cWj+,.n3Vocg}U [Ǫ8F'kPi -\z2krEclDЪp2ߔTt7i$MjXq:6cvZb8Ҫ 5*u ''o,}66m%Z6喆!U Z+YmI Hڔt0_Uk tzˢPX3viw [ԱFIUQKK:KfDR6-E)m-Ie$d RL|fWӨ[Mir"0UlQ+xM]2\RbáQ5![Um $.6i-LPxD4=\|Cñ<¶1+{ @}L7<(Bq3]J 1\B  5"tN=2i7R~"+BJ88>PzO̷O~^}g 9 -Eۥ^3X2|T.zߊcX56KQMEc֫ :Bm\ZF3aFŢhKf4*n *W/D5(?heMECl\?V%gZ,5CQuuF%'dS!"Ejf4\pҒA˨yyTC V6ڴK>-JY10J~NTevQhPXR+ŗu6)Ԡ!)BަmTI,v,ѪQ3~BPĆ4-rfHr1 k6Kxe.P5Z SdqA5k`5-Z!V*fX'@sq+JI _ˎۂP&),ˮuxAc8IPt;cIݗ JeKVg eJC!MY]K-j3E({ӆM{yw[Z ;'6x*Q6ژ&fBX"(np,m - "R Zz WزYW7()6ni h JqVL6 5uL)nbV4VV#Eg}dMli۴K.!%rMEgKӦ8vF3:D2ɢrTk)ShaTCp9frÞ(y%7 RmFfR˴ jj ؄Yj(Yte Ĝ51K-mݢRq[EKf[2z9i)ix N;יy&CªU1ű4QE])@U*1~3[h_6$zZ"NƮU!ע5lli9/ˬSo17iX6ƨK=H6IJ$ޮTԭes UUMkɥ4k.m*RIN55*]XͤTũ:T}zF1Zn7T\Fa#DիTK.РZ&M j)6mԚҐR,^&e 5ډQVSZyFl-YPI*q)&`h+mJUit? ,FuI K!1UrhUDiJP*Q9E #hmN 9DUYp MdS3/2KV@Ózz@m5%J]IJ[4BZ gTmhj0kjHq,z yNXGf[4qL*n: rmh!Q[jEJc+ HVB"u|ecv&$(V{6m.TNш&uY'ߖi,Eь,Ԛ&FɂekV-Mf/8a #5L9*3bef#F -QLHj`ZLusXJ´ xv 0~`eư2Rw]/R_ggyskɬ?yz)Xl>hSV9xJC[Lih7)=D}Nѿ1i?^+dE.W۪h,Q^juϠ Y=b/-f{"޳pJѵkA,)U <0v>\\rퟧהּ@jsWJ;ٵ=t`YwSR/Vާס=خ04_}k6V bγb\`,`9mm),- iFZe瞣P(PX\\?44ĥ^4wuVN5,c@EhIe #pDr*B!70\1FBF Z"E*4iFXIc*ptJҌp|THʷ줟!!气%f2023F3l$ͣkJVLОpɸ6FF"nFaԀFJcL.Q_1D',%$6lCcIaKA PTij&39mLJ$P_ڲS7^X#tma$$PCDZg׏`1!E pH3i5.k >jCD)I p%S= t{aH<O+"!jaJj'eE `1J+!3줰t8A,QHpнGSmL:)QžuS:mr E ʌ=F6)SPcmN@SI R-C5%)F!OgpC4̩NpuL@`\t&Eѡ6C[(%*CTqBV$\x+L!)!V{ [Q914A)>hNA}D_4q3čE5G&`ԧb.*Afº ecGqt Ҙv)L[0ٔب(mbx:Ff)=B±q-^ 4N}Yv -z4q@"tؙryzh CE9ljLmo@XJ t͋[Lqr|׭cۄgOqpgC" jDD4 ǣW1*emѶ:(> &,4 K=SGɨ5bmcc8-$OmLo]qN Y5 i88N6=BJT -5I5퐧la82Z6'6ce8d=²bP cyZ>0#DMCQ&e6j MB|'EyL#0S1$8FCIZ'2bژZH  3DBz:)NoD:N̤W%LaN[c*#r 5Behy<ـ-.ؚpśhWDJH;1r)kl)afɤzI!5AIlEsH 6R!`JIZ"?RHgj M31îID8kZ8 8!X)+r4A,0r=EJnMϭ#mz1 MH;Cgm ^&JYXI !Ƹω r3Gb)U!jQu [Yk%Øpj^YB g8oaԘhT!f<'3̯MJ35ؤ6`CI+N);:1'RtFg2*QOx#&V{|&pIf0CIM,pDq2kw4ᵇ6z aF&4k"3I?6ߗ>??ϺuضmCCCLOO*BIDAT馛;ֽ:(B<Dz,nJ<SHy+ϖ&^&F?:߹Pv`%`5YUnM{kw{fIJh(z£Ō޻ sS= EO2琣ҖG{EY\X -&I}CR5]Z*k>s ?9Ʌ4.=DV94[Qno`ݢO`ie쐞pl3~i}h#H6Ra F,%cϼVB"Y={|`3Ry?eN[Va=oxTñ:ۥfDS3e{]G Ysq> )ņCqC&ǘ6L>ṫ9!Xa䶎T_^C^3Nןs%w,'$*N`: _߱Cg3˫mqpWHxٷMS?B{3D'v s"f$3CD~nq&k%5 hiEO~ Zτ̟agSkֱ]h‘-.3?g&QҦ>2kQci*΃>ϕjsZ5p.) L&᳆YPoii/uܖœ8%,[7Z%ܙbwLTapgఴ+ǽ%(n<}zp,“WVȧ1j\g?G&&H۪Ƨ;'9Ȼ]q⇘(#5ft!rxh=sSD]^Ce]QwY`Faj0'^1xx i_ʹ;k_wZ7㩩/%6?T)IG,㳬i,sb䞧x<3 $tKbgc KW3c식TdΜ/"k;Z#|}">|K[ /SJ*k}ldGR)Os\w^lSX0z,Ep?͍ݯSG-RK%Β.PF<`E7) 򙇸׿^"dr}?8\dr9ӳ<} OX~ck r$`}Wx5aowO~r Gyfy gq-~T̃mJ/q E& v^+Lo~caǙ̇54 -V  Ja"+Jr?<zߧĈJAm+:{;J1pn}_aP~$pnb7RQp^(Q?n u7cV@\mmNh ^8rՠ.X E*׏ ZgoH‰[J CBTQG]l ʬkm?%eHqru~R(C޲Va7\Z+,@\VʷnÅa#=R.#)Z&^ DrM@aWKV1LJ+/:T$@عp=O|%_+j%JOEDrҠ;m!+eھI2:Kl[ȷ^_2: %"pe^R?czDbE% KF N0'^aWrdFH%TL(+dbW*}2X},Уu`N%i9~5vveNܟO i9glYi@a._;v7ߒV>B/!/C\1qe-HR>Á2H DWEϝJa{w]dYnh }jXk^,gwLQm{&W蒴ZW7 F (1X/aDZ.߲et ַrnmi灱'MꍯrzSm]?Vu(2ݹ`P=x`v,s?՜4ձ酶/(I9<0$D|iՍ}* SVa7\؛ IQg|;?zz+|6ٳ}^;Fq#:Un}kp/3HeDZ]ݒ]:&;wK/ӟ4TN;t:͆ HRs9:t??$"wfz뭴Z-6oڵkb&xD"mƍ'"4o _~ްTF][),!uѸ|܆:R{W]{;jX֊{rq0/`^Iy+M2Pfy9o$" Tvڃy{*{y+}yz![Vꫛ Rȏ˼˿ٹܕWDq._~nE;X˧ xyꎁ69x4o2r4FY!נ~!:Ҫ=de}uxE~uei9 w@_dr[1^_-ԻGߞrF/o#'wOeҳcM[9vuǖJ]}ݗkڒE`hn׃ڷA+ӷ1}pJzepPV!ܻo@vuX^{U}vNyq@ZUݱg`ރJB#c9v^Os ym箬`;RSrtρS'+Њ-t2t{Oy_<ܤ7zeG`fݕyo16fyC=~?0gcoK杲BWwǦS]{:`9zџ{u@W:=?0] qh=> cΩԠ\s`^!uus:+vWJ6x I!m˴m0hX&hDO+N;e[F :t9֤XHQ\Za]'lxxMǦXN -7 OECܶ4\p E^`kb1ZVFbUc2f#.RD95 u x VA!,T4s{eEr'CmP &nLòI8vДlШU25KxK'8jnRU 'G+,:4[VvFDc6 :ՊVĨa FQkrĪ!\%E;Pk P5,իHaB29F2IfvR`rҪ&IHȵW  gP(UɺUXQq.S# YP']OP7%FZIި&UFY2"nMj d"95*nmslUXT< Fh*4KIBlQ%kIzUufy%Y>US2ы!f~A@3rȶkXœTy6 GArjm5lQhXkrfRUh4NRԵ6z; giTZ"ҢC~Ѡ\.M<$Z[D 8g]bEyaE4<\z+ɒA!R4:Ǫm*jRT霬թk ('BMQVsyJvOnQ^X0HV[ʑ3#%SoQ+L"o&i^e[rp#DyNtmnAb,J4";w\L56XZe1ORD`!Crz#>k+ M` UpUʆI*P7o4/&lH:OaM<֩kE jImB"']jR_*sVdfw~`]jIV 366ù?Ol ܈vK'1"Qm0b V@ " SӉ>ȧPA| R')!2I14AS,|E&A?PڝuNN ORQq$q'$xA~GRBq5 - %V,DH*B(J$ T+6/5-EFmIZZ[Hrh4$RDJWQ@A<"=@wCH!d' 4,M%ĵx*vDqHS%J$ki(bD@ZnE2buILdOGUX넲.X0#ziAU|E&d͋<:#r*B<4P6юiubx(jBq@$&M)|UA}0)(GiXYgȖFif\ ORWUa'$FmV#JBvZ"~0RнGǓȞL|룄!ntZ Y0UB %!xĭzP@ΎiߦH6d]Hd0uvH7[ ,G06}Pp.H J8(m[SQ%K^ɴ:#-3)2""edD8RfL%i NIjJ5$,?ֽ@% !P [r.B0Q ,NjJ~j+8F$HYļv\ (A YHmI&%d@G$3RP B YuI6&a;Ý9UQ倸iiōI;k{XǮHa"iFqX#q1GGw T#IF C"%"Yj%N?[_z/#fI.~#);#M%JMd6jر3CE dl]E#t%[)"zL"QmTP%Q0T e$}XFw8>q' d|oԘD4!{2iJ!xz@3C15&]b$8Jpq L]CdTTG5#TB 1 "!Ɖ4b 6HeRV@UWPPTDgOs UP1HRmcjQ$ D$z4Ca KtPbر dX Ð0 F8 !7a/@_'X/"룫grŮ[@ .(" Sv9!Id@ xy}Y@ @"t@ @ ^] @ A@ %p@ @ x t@ @ ^] @ A@ %p@ @ x t@ @ ^] @ A@ %b @ +I$ Y{/t@ @ ~xG\F4(""00 b)] @ 1h4PՕnwE8맜#t@ @ ~Ĩ4X< C(0 $I:[h@ @ ^i(XA@8s9A@  y}Q|gvvWxfM @ Yپ};,SVٹs'D/ޠ @ @1>>λ.6SSSܟ 1H?U@ ^(bdd! x<8mI@E=B)Y~zF6@ H={{>yZ-i4MdY,OW:\9@ WA V%xE L&W_|L@ @ x|{@ @ .@ K @ @@Ye(˥*A-@ Ae,˽a(Z}Ee(&p@ x!|0(Ϛ \ b @ @s. @ @@8@ @ @ @ /.@ K]}'[Y4 zyq\,+P[j^UUd+YQUu.@ ŏn&v(^ʲL,qK]udY0 |EzYitt:{0,G_|Β$N{}5#}3<9,$IHC;Vi+n2-Iqq(b˖-#-珢-_ Ð͛7^$ q'JpL `vvx<#_IT*yY~)[$ A]VVy,d2Pپ[dYFe X{_J@ Ϳ:#m(bd=">4CCCuu|'JD$˱}MZׁ[Fm6ðז/9'[n赪? :y||jOk{׍Yp8(B<ՕՎbF, uqt:뺸}%I`ѣ,--qJz8qD4ILNN@ {=~MӸ+93p] zoe=C$t]M}GӴ~\{R)Eyމ?̃>lܸkM}D"A>;`˖-Hau{!AiZ0 {awA*" C⊗Ķ+u閱wNЭǮSi~;LWU567 u}iFb Q~ۯ}o/'x}csAK{5MUU pE6v{jeHLLL~TU=q!nvyk^LOn_b1q(bzzzvo>Wn>C̰͛Yf mAޚ@ wu}+&Lf۰,3(FYٵk;v=p|GQā;I$\{<=z 7/|8B~y衇b1*b||n'NJg>C&<7Osϱ~zz Ve裏RV$۷si ~t:6Z q8x wuarWS*0 ͑J Oc]"^{-o~l6K.sAuۇi\tE߿7<3TUHGV; d2Z_ ō7ȫ_j;<*Lo%ك9r7} 0u.Ix9y$;w5yM=cl߾g}{kf z~x(Rx<_ϓO>a@!Jdzz VR78q}qĉ^}8r ^x!z׻0 }j5y袋gǎ\{qLOO{ny?`,p}X.r#P, o^_ٹs'wu7|3s۷o窫s]3V$_E֭[N=\2 ###]y/xFg :Ҿ~z&''F<<6n駟[ \ZwW߫(\wu\y啨ÇỮY~=f|+iv}ʚW_ee׾|Ķm>O !2笳bjjӴmnVv؁80=333ttÐX,֋6\{߷m׾~7c򖷰o>;>.@"=x9\.cƍ|رcܹ)2n:$DQe]-__qft]'H055浯}-a2==ٸq#w~;g9s%3;;˾}[$d2ɚ5ke4355 Ik׮]56m%\B*q^(KAk.`&wDƵ^w>UW]֭[ $sbEQH$2;;7 bcccX D 8 >ɓ=dرw@g0dllL&E]woy[xcbb}vqs%؉{LNN255A8X!7q66mO_2>d><N;4PV93{R)wo~G}.ÇH$PU,=ЄΞd/vݻ5kPU(Pkǹ++RD&atti$_e7b1֬Yylj'صkmo>LdbCE@ V}WOu]lFQ^%۶qX,똦$݌v;:ݷeݷ=a$ 4׎{Ðl6,l۶ߔJp*rq֬YzoWN3:tmFAV#L255BV?߫7lep7\:z6l+ @ ~0~t0h6t\,֐ Q뺽v~ Nκi3̊ߛ&a ՍjQ݋allEՏ4p@ _~,t8!wskn_G(5 udnN5,r @ /6?@ @ /%Ď@@ @ @ @ /wM@ @ Rܮpл{0 ߜh5|?n|\ғ z_,9/V @q4Mh{0CCC+?e>xmq4Mt]'Rǥ܎`'Zt:9QQy?tqm\ehhE @D.cllx<{a$h4p]su[gI^n.,#IQ!~uRe +,`~rwr'jVضڵk_y{B-Fq8qv]ٴixcǎ133C2ȑ#lذ,Йq("8@{dd۷`.#Ç>yt~\rQ @UUfggd2=z5kyKKKaÆS^|?)en{>&",iy7AoDQɓ') aH*bΝhBV1xV[l!dH-رcLNN299yqٳgy{uGpQ @`&_Wfmoc͚5꠻˱cԧ> 'N7~7ظq|88ç>)nfٰaz׻?L"@Q6o}?{?ǹK<w}cccm$Ibݺu}E>O{n '~'>ij[n}s|scff۶YXX,&&&9tۿ駟ӯ5k0::\}&&&j( c6lh>w'?ɗeˎ;>[\.GLMMy"I _cW^y%t%վTJ%~|u^ETaGy뮻˲8z(aÆ.@ x3<:tuyyAm|+<;vD""?IÇ|C~7iRհ,ˍ7 7܀mOX=g#^z)+G?Q?|>qg077eJ;vСC/>tEQ-6nǩVoFu{1;ƍ7E]}G.#Lai$Ibll\.ǟɟOqmY>Os7O}+N;_-}<ò^TwG.Z}z#GpM7f;$Qofd2G'>۶m+=/y:qP7{n??|笳"sؽ{77p??޽{Y\\o;RnFfgg93^rmJdvmէ?in&CR0O>$fg}o~>|k_i@ ˈngыuqfmqq'NN޼y3xL F-`&!l6 Ð/}Klܸ__`ay+dfuIu?o`̠wH[lֱu6ٜ=9g9qMl)n,(ERlbo g~0 ER,>><20xm yh4h4o'ļrc$q*RIee%KtMniarrr(--ikkCPPYYL&?ȫVezzTh4kocVXLjERaۉ.ڸq#CTp\r%fgg1͸\.Ο?իW|2D"|>f^/*r\|Qvh5}h4$?OHNNF.z1 lݺ*}]o`0ѣTVVRTTSW^ZeCCC?Ν{_0011OS B?gΝlfz*{EX,1f>ٹs'?<WEqq1d66ָ8X,lܸ|_t1lڴ N\.j\>}ӉlbۥSc2ro>}iRRR{$GB c"]ڈEF#*2yYbBȚ5k"99+VT*yꩧDGVSTTAT\ߏL&jV^^'OJJ V bҷ{N8&==rZ-pW__>_|;v\.qFF#yyyfZ-999a4)++CTR^^εkP(sϱqs[Ѱj*l6& @QQ%%%8NlBA0$++3E:VȘ^eʕ+×p8SO=7Ml6=˯)J}Æ 8N'^bQ~HII!BEE*+VFaǎTTT0>>N8fŊ$$${nm&BjqH$ʕ+q8t:/MII * RIaa!T**++#%%5k`0^/){r TTT`p8O񤤤j*$))??$))Iz^#~?& NJ /mJ033# 45,$~/%b峖Zd2mߛGTc GKŬα? {5v͝G$D&XK1k';fJ@}- | d"VfNYgL vŅv>㏖ľ^L.bkqq\t999D"n7FQc}l3m~>KgqMJHHHHHHHHܙNaEۥnߏbY^~GP0D$])"a0an? U02dYz]$v~N>Yw\!'tޱqˑg Ä[ #l&?wlyIJJ"%*3ux'ټٖx܆COeI!"@4ۥ;(Q =Z8Z%]eg1|hy\ֱO"%JR\Og|ވw 8:tэ3 fʹsL&P2%_I =CGD99r7w}JHHHHHHHH|kŷxW;Zq<­GR)r>r]#?Gw&=}^.5ʖ|~uh9]Gr\Epm#|y1??q>>3MN2c|tX;/ڿ%$$$$$$$$`$ j +Nڦژϊt6- ZZV@ mM jV(/ĎT[2<ޭ+=ރSr-|K0>2AF.R{)I|kշ)uZrf7)Rl.e]r,9sZװh,j4* _:D)CTaKLjrLYc(?Y')P^nѪuv^Y / (N,~|k>Z-*=|l͟mɾ}~H1PXD-N}3A ךKtS:Z,Kۋ)M.EPSb//%yNu)ؑgsesfV9V*rA.~ߡw;ſsѼqG>8=R7Bs}xb|=NGyR9?1f=9{8{pgw#Gؕۉ#G_nKj##j?ė  fÛdo"9{"7ՔJ-Fd _G8&A@A1xUqtAG[\sA^76D.ildI la!/SSd2F|+W%~ ro?mgIOb77,>wT qvebrq+qюtI5IqLjf|k>Y,a?+WvۏV>ANjGk>t ^$͔F8& 08 Dž [Y֩VvfP! q^.|#Ge]:"XD#&/S;R/cO ߚO!D]"O;+PU|DQ3/;FNv".tJ 4 YɊ{ٝ3 cd~E\q3gH%.{.zǪF EC>Et00ɻjL]VOBBBBBBBB-QȄ[a?Lx_,~y&&>|]Fn#Qv^*xc7rrᗙ͡)IO?^GZװj#A‘0pL)X:k_C)Srj8py2 ax~ƂEcbVŤ6a  #O&Ș^{ILZMD"d˸>|wakl##|n8y+qy]4M4Q7\dž hZYw< xD"V:Vo`A -xr-D[`cF]L/Ls ;w;g7q8:;{s/SS;13>7VOT;7Sj/ugWţUioǿͦ!m2AJ"ݘ޳A4~8y>w.167&)2. \g^B$A@ ߚφ  / 'r0 3Cd SO3_vqy@IHHHHHHHH<8wT|aslJĆ tMw-i|jM$a}zPʔ*2͙'lH毞+<Qrx;tS:&aLٖlM46Z+8- *-[H75EaR!), fR?(K GôE+~%,SNZs+Kipy2fJo'ÔqG2 trAΨgk++1ř%"SOKg\I8gata7Mx#Gڏ29L.Neb3Vyri-7FzgzQ'# FcmZi |A8#Ȉp,\`A0 GīzA< \RZYq~_M:`AqS&Jy-~&٘dDUAKyIܝAI>tݩģӗ RF8&u~,˲7LJ"^O@g# K  ^U*n!V%*$M-S߾=Y_4BattA!bjo/͂r$O,"CR|8wEHAD!"bqj"˄ϗYa'*+D' ( Bm0vpvhT eVBBBBBBBBⳃ(lHFQxtlAF 6kY\\f}vh4t'Z0I,..@BB#EF$% `aa7 A@ pk7/HM$NG~TbU=>k5%$$$$$$$$$~XNoc?"PDFGGFRa0i `V,(JT*׋9_.H]]t:t:444`0Dk磶@ ʕ+DlS]]M(b"}}}TUUۋlq%!!R$v~V8V 1 Øf)JJMww7]]]| a6_9tLNNRSS(VRIGGd2Z-555ܼy^Z- FFFHHHS[[KWW(pD :ɓpʪ}q< < jkkIKK{d..]b``B<>ABy{raxx,d2V>3;;K$h4e޽{ =/U9|0 lݺډ) *8qV8=ʍ7زe ܼy N>ͪUhoo7$)) Ν;߱rJn7{%;;ՊZ?!pϓrVtt:[I8r;wD&;w255bݺuTWWs譌W^%77DŽaΝ;GFFfyٸ{{{ajj@ @kk+d2Aj 0HvQ)ohh_'##^O[[L/UM&Z~6nx_ո8rssˣIQQf6n܈d^ٸq#yyycȠ7nj)((@p An@CCNww7 r bppƺutsssuDE~zz5kpexgطo&1??OAA8nAwʕ+tttvioo'҂ԩS,..o>233?N6z{{+W詩):;;DӑLII LOOSTTDCC)))OJb``^xcǎm6f3ǏK_>s!ٲe 2 ǃVe~~GիW)--/266墷ĜǙ3gX\\ߦ+WGkk+UUUl۶MnddOvv6'O*uq~?h4fgg^OJJ_\ŋ1L?bpUy&& ߓ(7o$%%'TTTH8 pFÛoNcpp .0<<,2>>ٳgt:_fCo#gΜ!-- >>ɓ'9<555c6),,k֬رcϏ~#&;;KBBBBBBB7Q?1Ie~ f^x^`zz@KK ˘fBܹF 466/\vy0cccO<]]Fww7[ \.A/\p+V`2ؽ{7gϞɓb Bc4YXXX |e"jm۶ϊGz+WA{9vqۢNNN?NJJ կ~I&&&c˖- }, ֭[F vݻw]Dضm۶mcllSNt:ZOT^41vYYW\sU tdd7nqFyIMMeݺuc0׾Zή]HKK#33B 7nWhhh@222 /`49vؓ& /4wUЧ顷:@GGCCC?p;?O"''E|>mmm 100 wt {vvv2==MAA`a4 a?N?yyy466===\.18rrrXQFGG%^o2xꩧ0LZ+W9q/sL d2T*p^,I\jj*\rA@P ˩vM(BTv易BQQ{Y$t:A]@ aff6֭[@ZZFn/_2!!h4JCC===͛7@.P(Devjjk׮vhi=;@NHHe qqqX,ضm/^$//T8<ɄBB>,\vmADjj*8NCjj*xPD ۍJB&a6q:_g2ZZZB, رLꨯgrrZMKK :.\!11LB 3>>0Ì~:O$g@VV YrVrMHHHHHHHH|Q SSSt:f#K]gffl6w_ɱbq$%%ڊfCCRHOO`0J-SO!MMMa^xRSSIIIkR^^8HKKc׮]T*Xb hZ())J&&&h4xqZK/ntڵk)++[$...NGJJ $%%aZ1DII LLL0;;ˮ]v|bQ(βyf~?$%%=RgwN2P(L&R,_R|>6d2ӴΝ;xptшjexxlVXCѐDrr2Fٌlvp8H,]P`XHKKnc`ttT\ X,RVVFrr2dddgp`XHJJBRQXXHYYndb!!!~T*l6RRRyaddBFF"W_}TsA>`bb,^z'{F.?Nff咓sKzdTTTbŊng||_lذ oAKHHHHHHH|A677Jb,^UܩH$i?@ @(" >p=fA6w$qe.Zfƍ ibO#'Bl>p@ pWp;;|>:@ \.g͚5aA /Z~Xϕ= JHHHHHHHH|6hN Ak~?`P~v/̋[fb~?2[^IFY\\sܭ*JGQfff>ڄBA@R177G$$$$$$$$$>?R̷)h81fq\c~_4w\~.g{4}.h~W ]BBBBBBBGHs?Ho_ } į BJ˅B~FL%,sёdI^|h4J XUYXWw" =p,\zv#u]}zz .0??Orr}fRhnnZ,I4;;ŋ')) CUU---hZ TWWc2D+F~?OH$Bbb"CCC\x`0HBBvjz9{,MMMJbdd BܸqF qqq\t\.\.NcMJJ=ϧ㡯3SziQ._ 6 JESSׯ_ >>WR[[K{{;:\˗n|2mmm ƭhcǘtp!Bv5n.sss򗿤LLL~JKK*ƅ }}}H,P(Dgg':£SNQTTtG9>}4Q~=‚XQa)^Q*fǹtcccvz{{p---͑LSSb}wם… XV\.W^ ɄVe``K.y=y%<2 \~V+jv]Jd2y%$$$$$~Sx,wU ={LFff#R}jj?Fnz_,-VWWG(ft:gΜ-[099Iww78qUVoMRR>}7RRRnGPNٳgIMM044DNNNL?~;wcǎsNn7Gehhuq>CZ-ϟ''''bɴ q~zz=rA0,jVD"455ׇb^{  >1 zww7SSSӃd7 ==CQTT$&Z{wLNN2:: YYY088ȩSx駑Aq6,Ο? ק F||<2Zzzzh42y$9t$%%QPP SWW`rqFF  /pI~iz='O䥗^pi4 7oF&xj@UUŢ~E\. ttt|26'Or`bbB|w݌k.QAW deeqI b``7np8y&( < x<}N'ϟj[oa6/~AVVBrСC477Rd޽g``߾}"ZSSRڵk8Ndy(|>"ׯ_ ĵkgvv7|+W"ɘƍ177'P||>NSS2L<\:Ɔ9{,ׯgӦM?~\N 菸v~no顢I/G ƃ(w5 D"߿L$===77ڵ033#*;u|g+L&>p+YT]]6l`ttǏVddd>nܸ[oo!7nܠy=(VgyRٽ{7|>A yV+p lقL&cddZZZ0 䐟Omm-n@ ܲx'A4ҥK ꫯrz狋\pbF#?>\.=_Vx%//+Wb0YѬ2n"cccaF#h6֮]ˋ/0>,999R@MM _W~rNii)v&''e||Ɩ-[Njkmvvׯ3??/$''SRRr[R͛7o~zoNZZz 6PQQA{{FŗL1t:" c{Gcx?8OU~ݬ;;;h4kFuu5vYE.w#Zf\.WFV3==,Ԅ` 77{~ E^nܸTWWN#;;8z)癙viii~t:eeez֯_^z"Fq^Ve2JrS$!337or\.XNL&\.[DVX``ǎr)jjj\ˢ1+`̒ [1/^|ڢ"Bs]GYY&blBNN7nܠeI2Tضm555$999b ͛7c49rȲqK+W>}'*5(2l.\kBT*;FGGc+&vBXcJO v痭酅1ƻ RIJJ pr ì\R\۷ogӦM|ߠA8}Tmm-uuu~qb!NbvvN8&99P("iqq   n)//GѠVŽϡChjj*zNCj͉% ]]]ߍn@JJx>::J^^^O{{;֒ZAn3??/5^OYY+Wn:t:mmm\e׹v###ry^JFFIII"6H$Byy9.]h˙,,,zjL&A<|x>=!!YV+>͆bydY>77(Fk,ŞfzIJJB&100@jj* J%:P(DJJ ###T*q:Q\\Laa!WFPӃJ'99 X~=Ÿn  #Z˂hXbEEESVV 333$%%Ztwwc4yj377[̵l6t:1L$''cXZdddp8(**rcݤ`۱D"z=V"77xٸq#hMrrI}nnNLRXr%F16nȊ+8X-[C&/ y,`0$EEEt8N1$&&b6|$%%ݳލX 磷$oNqq1sss,,,IJJ III b:;;%552qV\yzlSZZJVVeeebZMee%999dee~z|>NS'%%aZ1cXcrr5k֐Rl~?PTTTVVb6q8ZXVRRRHNN&)) Ʉh4bΦbJJJ&&&$33Պ崼\TdHNN`0(+V%33QJ%8NoLOOc٨$11Afll ɺul6SPP@RRSSS~lLiii~1>%Ο`(Jr9R;P{pqYjxI  !!;vFbb"t:)++ٳ())]u:ϓ &SK^^qF uSQ^^N~~>8l6IFFFظq#6lvHMM%// fYLѨIHH ==[Eղj*1D,}p8̮]tW>p8̉'FV}cZkk+UUUDQZ-;wX^//g h(sssT*,˲0;* 51 j>p LOOI(n rh4hOw$v`2>W ⧒{arrSŲpl|bx8 ax|F0~mX-jfغxRsg+d2F '\-ܗSCP:/&%4x^%%/ I>=Q⏊KCnATb FV|e>~# *$֖Xͥ {w_ܦ}DQ{rqd_HXٝtwD{8&!!Aj KHHHHHHH||}.2*K@`gF L|6D2 >rEAAӌqq6n܈BXwwwSSSC]]v,V山10]YTUU$]rt:~!.d<.]bppN tttŦMD$p dqq * ߏjիtuu155N>BxdZ'?Xƍ477eb }Lb6L&rk׮؈`D.rQ*^k׮҂dbffK.1??Obb"---477K0ZTlimmv366Fss3rх*F{`x8j?|tp%\. ZZZtvv288(˗immebbz L墶^N'===\~FHKK, "8x eeeFژ'''G$ZÇѣG7d2q5\ P(``0p5Z[[1Lh4|>@@|rɓ'fՌv//8NN:EzzXpkjj:P($$$p###b)ԥse<X߽\.k6d2 Bv//8N>Mjj}zz˗/, r mmmr~055Ejj4KUUhZdbb&> GX26߱_S\\)w5]q KdӦM8qېdl߾E]\.'11-[p(ASS r֬YCUUh hoogjjիWFEkTuu5hՊ |K_bzz6 [v6***駟Fs N'^AT*ikk#///GBB͑졆a~QYYIOOjTZ+W%"o6EEETVV_tttpq B AZZO^z%9"+[/K]%y8= ܲ566a9~8HnD":tB={ėH$B||RSS"33.yxFFb?Bl۶;v*VbŊT*gϞ=[6wAj5{졤\Ί+x LLLx(B,8,>z`lذZMCC,,,SʓngŊ\caӦM.!!!!!ܹs,,,P[[+ZIKK mF?LMMjV4 wd~~O?B! زe SSSx^CCCttt099j[o100֭[j2??ݢeHff&n;w211!۷oGW_edd"z-݋^d2qeQ)K-ˑdҹD"R]]4SSSd2r9 "\.j5nfV\"33S$Fikkc݌X8R* T̕JPpuEَYN'sssr4 [l޼C]]G%%%`0(ATʛL!*&''%̑#Gpq:p%:;;)**"q"++ 2LKv%*++QբMEEׯ}# pkh4"ɰttt,C~~>555^K{.];444011 |g׮]LLLJ$᭷bll{]Ç~ dggVEȑ#twwäСCD"y&.]-[hK,Afpp;vIUUCCC|>6l؀pB 337nс^ƍ$%%pY\.6)N80\.zj8#w}Cꫯ2::Jvv^]cpݔyG64}aay{UЗƠG"NM.3==-fL&& L`jj Ʉfpb (..R{rrrcƍzEkbŊ毴шZ&77)((]e2BD"<3L&&'' BܹL)J$%%aZq:f 55U%077,<  fkגb! aT*^Wlq4=RDRVVFBBn͛7O8&## A-?lذAt]lݺIYYJ}XL&󑝝Mii)nJHLL$99BJJ $RRRHMM%!!1ͤNAAA\\8YYY`6E055 1b2X:Zb|TNNnVKNNiiibb2EWCp\OMRR9990??ʕ+)((ؘN'PxV+h JJJ!##Cgu:eeee5esaXj*Sپ};)))8V+III޽Bvv6Veffp8LZZ& ^fCӡR&77y6o,dggll۶M\kFJJx$ 19d21??O0$33۷{cժU撒"P<fxXuЧuclffF3-//gO㪃>66렏P렇B!:Ɏ;z099|lٲ8u鐟O?Ľ0R[466+rGΝ;G8\1 gǎbh4JYYٲ|W\annN zܸqZ(fݻwn[[-Kģ$z'mnnJbYzG}aaai&f|u~ۙ!..V|ij=;܊~؉8^/^Sɽ~uef=糰 ƃǼRh4*zTN So~ٗD8S1<$ ,..G\\Dĸ~M.jCh4J0DT~n.IHHHHH| 022p_ N B!Q{\bLQ~T"7p㎽-..>8? @'BF w5w#foL" XQ煥qEbgR)&咀[ ge\K{*ᦄD}{ަ}DQ{rq.=?jWp8]C6K<$w /},+g Ϸz'fY`0xGKםFx9bnc|VY\\СCTWW*fZŋdffʼn'p8~8 t/^dqqQZb;%%%3VbpgϞ%11Rb|Nkaa .{n ?O|2۷orhk.A`~~P(ā(((b\vz{{YXXʕ+bp8l󴴴0>>N."մ`hll_'11^˗iiij>w (2~1۷5kpZt:=Jqq1'N@PxhiiE&''9vXiիWihhp˗btt^cY[\\… 444`0F;wVz=O3>>dvvgۋnqg͢v@PpeiiiARq%1Ln͛71Q]]M\\ܲ{w LMMqyES($&&riQEgzziP񶯿:. ZMuu5^EJJ Ü>})ijj\OO/^bi䃁@j:;;Ťx<4=466⽃ l6<^χGP0::Z^V\X֠Ľ ]h( kb$֮]~dlܸrj5ʺuPTDQrޫR\ |{ ~?g 9|0ׯ_^?P(Fw^Bݻp8Lmm-~!J7|e2xկ~Jbrrp8,&կ~}}}{<66Ɖ'8vo&.]zz{{Zp\hZN<͛7/)z\pӧO399gΜ`0|W\?ܹ́sپ{_Ӝ?A9u߿_p\~z㿐97$$$$$$$$~Xp+d<{R. LAinnh}'s<===477ۿۜĒ>OH$ǙW^ahhP($… \x/իW]VV__F)1]VeJJJ_ղn:z)I455QUU8>,YYYB```ǏĊ+Pռ QRR¥Khkk#GJff&uuul60 r92zChrz*{{۸cmŞ d2A RXXHmm->SSSd2  ݍ#-- LVvS__ի18VZXeN?~hZzzzPTr d2&&&b͚5vV˳> oG.Fq:( >CZ[[d\r1@r9"K===$%%=Ҙefff'p8(..ϩ)4 Zj(--EPSSC0$%%z刺LFii ߏb! ԄL&-*1˻bR0r|Yk `ppT:;;Fp8ܸqǃl6HOOWMMMڽ8Nn72Ltώ,,,ֆL&CדNGG@<=+++ZBBtuu!":::!--l<cccdee {,Ccc#by1###(JRSSGGR111lf||OmuF,&S*n`+VrdllL Qy&> Fcזa 77A] Ϟ233fhhݾ,,~?ݨT*RVKnn. /CTb0`Ŋ"FEH8@{{; ɄᠱVK^^pk[XX`nnZYjYYYFei@ @KK  ~~z(**" ڊ\.100 #!!!!!!!!```@̳QPTX,e{RzLAd{9DcffիWq'{f(Y? b zRRC 8vdeesO- qy:;;HMMeΝlBnn..]" e˖zzywx%ړtCvvc bb vQTh]"333b2Ow4I?ybCN˅`kٺGI4r/O1F oH/>OJ%>-g\\r\̫0Eb1&6h ? 0::*~Swj(8 A|>ߧ`0 #`PCb{0^B'/ ]A)K>MKp8?鞡PH<`x.=Xʣ'V~ ~)hJj}F"/{4g31G-`D]Zs% 1w"!!!!!!!!x<]IzzܲrxB$avvCв2rC d7h4~l!`a<]?;;c񪐐xoc?b%C\xvXJasj;0>>.ִWQ*T*.^ɓ''55)y&&&azzGrUJ%v*}0Lj#))~_QSSC("%%7orafggIMM-8p&seAVӧɡGՅ${Hqq1Ξ=˕+W0DQ:Dss3Ǒ#GM-[,s>t萘=`߾}D"ixD";h~\FY*$..kp8i⦥ 륭ΦTQtr)4 .ټy3B!ywYf ~ӧOHff&p>rJ<gϞeǎdeeя~ի9{,VU,vQ6l %%Zj% RUUŮ]z+555l߾yV+ b 9{,;wDTb2ɓlڴi.9å 񌌌؈bl۶w}bRRRX,F#Fx<:u7nN8ASS&3g0??iii\.N8Agg'IIIx^?NKK lٲETgffhjjBTDCCqqq{ฮ3OF9 sΒDIe9$ٙnjC֬ggl`9g D 997htN@hQLx*{7**qyHKKx_Nmm-*p8LGGܸqLF}}=cXI1*@P(JMMM$$$pm455QWWVd2ʅ #11z^D"9wwh4runܸ`6{|-:::شiT*HII… \|[b6 ׳l2{=6nHuu5 k׮uW`rri^y^=k4=~Gqq17n@*|rZZZXt)Fp8LCCx^cccQWWd .0;;Krr2TVVw c^xf3s%+W 1r4J͛LNNn:^tuu 6*<333X277 ˗/&,Y(ٳg!==ѣG1Ffgg9qСC9sNjj*|F[rJJKKd ֆlFdt2>>Nww7رFC[[`;vP\\LWWX\kň<~kk=TUU=ц=67l2 }Mw+^D? 8vVnݺErr27Mp\B@ E"v/Kr%Mlܸ!.\$8x <:Q [8b~z (,,d|>21 Xv-D"(--j4jX,233#/{ZΣAN:E _2D"֮]K8fzzWj*Z-_WBw? SXX(-Xz5VvE$aɒ%,[jbڵHMM4&&&avvDFattkײzja'dBSUUs=ǩSp7o255А,[fR)Hp8,T$7S/bccIMMh4FYY>dll Z-LNN233baddjl67ndɒ%t:ظq#,]˗p8fҥ[Dr9/`ٳ 6PRRBkk+,_Q 333tuun:صkLLLL&#7o|E s t+s"HDXV+Ju֑$))),_L!`4ٸqvyڵkH$∋d2a0+jm{\\6l0x<n]LFFF[lAVzUFC8zhǏ#Hx7ty@z*'(ʕ+Whkk=p֭[222nҥKHgg'o ===x<innի[o|rz=z!>̉'HOO^ϯkY|9UUUtttuK,zXHMMd2o4z={r)Bn*++p8L__`{-HP(g&,OTii):td2pLCMit8ٰa111FJJJvٳgywhkk#&&\(pWO{rrI! 4Z_ghhw}DD"PT9sNd2W^ RL&|||g>bVNRD"ann?ɓ'&Ja۶m( f3eeeX*\]d I$f֭ 8.T*H_|LGii)h4JJJpܹL&fqq.]DiiX'#̡)v;iii( ޽{L4 ,_˿W_}qyv/JYl\p 'Odbbgܾ}&y&''eJJT*`ǎZӧOsqV\( FBBoM{{;W׋h4222BRR?1P(F~~Pפ۷C\\K.rfttP(``xxXKLrr2R(455"sÆ _{R]]D"!77Rz=%%%w^nܸuҥK155ůk4 +V %%~N֮]ˉ'سgp7iG2>NBB;* ףnZh4hZZZZJEkk+PB||<===At:K.ett1R)K,B0 AJ뙝dErh4\.grrLl ))A&&&)v2??boVV+xL- NDBLL hZfFFFhjjoopݤx 000 ##'8U}\.wt %% n7Vt#ۋd"77Egg'yyyw L&J%LLLT*b@ +zH$88N " 55ՊJBՅ%77^OOORZMJJR/pLMMPFd0iiiLMM1>>l&++1l6jOSlBrr2y"l6qtuua2d$%%D#T*avv;wOVV㌎b26<]]]HRrrrp8$'' ϼL&nD?>RIzz:cccX,ܹ@*`P~~>FI!:000$$&&"SXX(l{n^uRSSikk#HBBB!t:%%%BF||<999ܼy /l͑EBBx<j5YYYׇh$771FGGIKKLJa1dddpn7999LOOC8&55lov^0FDD"FFFu:;;)ett\q8twwc6f``Q"<3GАPg͡T*1L6k?IC@tУA;v Ά 9@,4ПQ=))nAΞ=+Ddgg/>|ϑ#Gعs'bY$I+"""""""4yd"F"xO'HY $Bhge$ ^W>vG=S~D"fgg1L0 B>T*}l}D"Qţ[DDDDDDDDD>;D NK2vh'I(ZT` B}W6Nj! ̅ujI>A'?vgۍL&{a0j%..N,9 UGz!?#x^fff0333|>V(1p8\݌n3??/xp8 EED>B!_&"""""""G?o$ n[8p88qՂ" 9r۷o Un seΜ90YYYLOO{nYd ?~W"HHNNCaXZVyRRR緿-A222hllȑ#̐%԰~ZZZHNNrw^ZMss3gΜ;Fgg'8@cc#˗/'pUN>-TSJB?R4]]]Bn;#db߾}Xo18:Ot:NGRSSdzy4͢Pcǎt:项KruKybbb̵kטGv=.n 222-ddd<еx(**bxxCԄd"&&r !Hرc233Ñ#GIH^OCCǏjȑ#GtX,8~8ݤ 9v555ݻdzzG"zill$--MpQ煵n!sss8qJ|> """""""8p8<|dE2!! 9x 333lذ၌ETan޼ɑ#GD"űcG||<+Wd2q ^{5$ x<K^^LNN2<mFzz:;v055/KAq۶m;w/"ɘ{}6^z%}Ipe|>6m`0Rd֭d0lܸqxF""ׯ_6AqvvV\T1'',vMAAO{J|d{(Amm-o~bˣ@ HAH$Xł\.<%%%d2"f+WDX,j @SS9DBB.]ˌhXn mvs1ZZZPT022͛Q\|2Xd 999B!j ˨B`ff{O~>L(bɒ%pM]Foo/EEEl6v[[N"=='O222ҥKioobs000eشisssGz~D8NM8&66͛7syBcH$RQQƍIOOQ 8v455zp_#GHIIAv9~)t۷#Ν#ޙ\NGVV8qYd v9|0Ӕs9Ξ=իWx^2.]Rl6^w'xx嗑d:u %>Ncc#v233)**b޽lڴa|>ܹs? ݺ: pMFFFeӦM466bZ}6[lh4 iool6VC00eeeLNNGVVbGL4]VىfllRcrrRPz^Z-ۍh$??dl6@RRFغu+IIIaZIOOW^!77ٶmr!N';w6zzz>.D0LOO366Frr2gΜAPrJӉattۍJ">>^8OKRd 0 ( 0al6$&&1H8fRRRp,`6 %%an7iii-">>^x59233#QOlv300@llP2aYw\ Q8QtC`0ׇB6/* b0/ɛo)7044L&C+TmH$aXXV9gln7A BԓȣfhhHpB9J%&iQ} 'BaϚG7菓BCy&D"z=-(r/ tf~~s AqiXt)7o7DDDDDDD><}ff9X% ^W<Ï{ÁRD||ֈ[RV?׋h|lH$΢'M$fG$Ya՟.ǃM.pXCq~|ZH$BtivQzU>^ط'OX>hDǓg>mr""""""""{ W4IP(؇!;8#?C8NVngNjr=kFã'&&khn:`'&("""""""""y Oζmعsi"55}kHсb _v[ogϞnf6nHee%|_eɒ%]|_E*{nJ%k֬a˖-rurrrxWkEE555F/"J9v옠'Q__OCC?hiiڵkhZx Nm6/_NMM uuu\aZ}BU455K/}Bs[[[@&/ʩS-[p*C={TkJԩSͱj*6l<<ر'NP\\̺u[% aX=r o! qm^~e)//>//RPP@$رcB!z-FFF8wp^{egAX,$&&RTTD}}=U{z$ajj.m@Y)))\Nnn.6۷ouVp֭[ZBvv6@'NPYYɊ+p\~^{".:W\A .\@*ϓN#??LF[[/"v={͎;H$ K.l6h8s yyyٳG^LL BR)Ǐܺui.\ZF&t:1>|7nՅhرctuu x"F:::o~`@Vsi[$Xxf Ν7ȑ#RZZJff&W^e͚5;v" lذZf… ر\.KRx"---呓줽]zDuНN'x^N<p'OqܼyTʑ#GHMMٳgr *H$Çg||NG ta3  qU˙`0pF#t:7 ZOD$ P(\px穩ARq X,B!V( ̭[8wN$<۷d|>nRä Z[lrXnկP*,_4Q\DDDDDDDIt2 x^$ W~b1>TmDBqq`dC^^Pdd2Q\\t:IJJT*˗/'`6IKKҥK:uQZ-˖-### B!>Lcc# xz{{ٴiJK.rJkKbb"nLf38rrrh4dpppQCUUU133CKK \p>:;;|2>KRQQ׮]cժURѣfXz5GennF޽{JOL233q:dggc6 8pVd`00==Mrr2yyyrAùMԸsYYYD"add .i&"Ȣ0s׋b!++K@>fgginn;wvZΝ;Gzz:ZW.D"k׮Q^^.l$211ڵk9|0466vZ㩨E6N>Mnn..\`||Ǐc&''Q444`0Xd 6l!Zcdd7oruFGG9x @@09q>O d8N\۩Z HJJƍTWWS]]Mmm-V4rrrp8t:^@ainntr%ZZZ0<8Ze߾}ܹSWH$¹#}P`0ȹss7nܠCpM|>~χB BlڴfŊ\v )X~=\rioot !ڡP3g`Z׾Fzq\ËD"$$$P\\Lff&,Y`0H(B*bHMM%??_}JKK#;;>_,d2z=111LLLp8H$x>M<DӃL&㭷"366@MM k׮ER|'G" +p:NZ-dffWղtR9K_R)rL&n>(۷ vAKK @_WlݺJvArr2/|曋-Hjd2J%JTFAPT*)--ɓ`Q(t:!9nh4rd zFٳg9|0=׮]#-- RImm-J8.+Ww]. _!Ν;&..H bcc9x }}},_J, :NkZ&&&u#jJ%jB9|0nMTJff&lذӧOSPPѣ CJJ T*o9uoЇh">>K}}=?яhhh -- VKll/VF.SXXȋ/HGGHt, .]͛7ƅ  _HRihh@"R())wlŋ۷;vP]]ʕ+1ʹ|>ay:Hl6+HZx^ BQmnn7f%z!`Zh4hZp݂XP088H$`0jt[(HHMME`jB!FGGJBbll D||I||#66$^/艉 L&J,JRHPTXd2!gtb6:$0>>Nrr2@%ܿXcccQ__ϟ rۍhjL&crryҐJ\.☟̠h>h4|>œx<$$$033J,nJQrxqA]DDDDDDDD#1gffp8B@"z|BN'=OjFH$8T*;=H?}>^ǹf#&&BTQ$*gh/ $E {%"""""""G"055\. H$T*}Ir`0aRL̅FI(7`hQ51L&ȳ'yзE\(GI ɐH$}]L|Y&"&&橆\.zhJԞ|ct|Q]3*7Q$D"BwmD"~~6?LLLr` :O[|2*9r1x8}4CCCկ~ș3gH$| _@r v;+V`]TWWt=1;;㡻(LMM y*EEE>;;˞={ٟ*i7YDDDDDDDD !я~ߢ?H$n7`Oqq1H^AKq wR9zzzضmvP(P(H$VZEUU9viiia֭ad߾}[HSSl|>'N+Vzihh^ݻ7Auu p%r9;w$33JJJP(twwK/1==́bT*刺e˖^ɓl߾;&+ RSSSCcc#;wNf`0w^hmm%..M(Zbccw( ?N}}=? ':P(Ē%K˗׿αc(++cժUR[[ˆ 8r+WDQUU͛tRQQ?\.dӞf~d2f̤'=%##㡌#DBAA F!##CFrss#''G\_c}5z=D"ˣC1::JLL K,!--1 K.EPp!jkkv6oތL&ŋ]@FF:NAAqqqdee166FQQ>Jmۆ`ߡPzzzj***˗/#YnuuuLMMq-lBff&K,Aqq, ˖-cӦM=z׋^gO=,<55EEE$$$xwh4šj"99\t:SSSLMM%a#77SY0^JJJHMMedd^ի$%%cl6} ~ӟrU222hoovSPP?/l.ZBijjbnn^v؁bhh|oNZZS_^^SK.ILL 0zHg4CMMMkl۶۷o"ٿ?v"//wih;=;` :;;ɟo~6B^z`0H `͚5_+W[=44ĺuڵk455QWWGKK 6qFGr}~EmD"f HKK#''l![*t:X,@JJ s5昚B*VQt:QT,_i^ٳg_~.  BDe( 򕯠P(!%%p8L^^?IDAT$6x@ ?>F"y稬ڵklڴrٴi_W8X׋ffNVVFӉZF#HdT*t:ݢ*J,Ξ=Ν;"..Xrrr0Ld2d2JV\.jbHIIy{Z-vR)ZngAdpMeeeO,7wllgŋyp_W̠0r1Z[[ 11pE^yqdddgg8N~? se˗/gٲeܾ}A*j*._LRRVVl6/",Yxbbbۿ[&&&###R[[D"!>>^?ްaΝcΝx<RSS;Z _*hP*BhZFcǎ% $PPMc41L|>.\?ϭ[礟?ӧOyfCpyt:  Ylp׫<55B_"CCC>}MJJʢSزe ׮]cݺufCT uSSS  2]LOOSPPd +( K^|gpp:a^dffrE 9 lܸ jNtNY,*++1ͼ #1Ou|پ};ǎm۶C:uNN8[o%<#Hl6H$XV^/&''d$$$>>NRR",pN'/MP(ĥK ++[>P^}mm-]]]H$xE@y6x$ 'xχ#66t:Q(ϜQ177JؒL S>K\ g,z}O$~ca=ip: ,Ý;ww?K'Qfff+pn#D"a~~ydrr/z;Fms$GG?r X,ձ~HOOQUr Kmm-F񁪸G+ ?Ή'hmm%77i~ˊ+gϞ=\t ENNW"))Dnr??'? ̈́B!8<```AO̙3Ty(//+Wj|2{aժU׳~HIIo>*++qݤsI~m󉋋 166Fjj*H{gbaYJ%T&&$Z)ߦVKJJ#<fQcǎvˬ] .`9{,)))?6DUƄ {5$>j}rFFF(**пGQ46$ GEP`2P ϿK   ~d D[*rj/;v!---ԠHNN&Ċ+͛H |rp @7_".۷ozT*e8Nٸq>BCUѰ~z\\.P(Dkk+[nE"Inn.gݺuX,Z[[IHH ;;imme|>nܸ](--effZ TVV"ٹs'YYY VXRdpp^zq=۷oG׳zjsׯ'&&)y1444Krr=U(//gzz^{r5Yz5mmmZK.Q^^j%--ӧO܌T*%66Ly8rrM6qQ6l5Ξ=iii^^JQQd2顾P}6zfggs.{299ȑ#OIIp0dffr% R~;Fa&++K0~?Ν)f3477ka߾}<99ιs{Xt)[ltKMM P_]d2Jعs'\pG\~{J Q__ϗebcc hZvŋxcuuuܾ}&&&vP/| ={^FFFxILLԩSrEoҥK,]fǎAz{{)**_&99>^xg3Ֆw444pu< =z'N`4͒%K(((W_v7 nݺE[[lܸlswa``y0 b fff^@Vp8 SYY{EDDDDDDD5k[B&t:IOO =f{Î;>y8x _ʺ`'O222·mC Bmm-555o|+w c0 زe~ʕ+iii`dd1֮]\~Znݺ.k׮e͚5|>wl6ejjJ8&Z=>>^fFCc=EqF XV0ٟ:K399,R|j`0HYYZӑORR`0Hs% 2 Z-@ɄdGZl6V套^ĉ&` !!p8L  ==]ؐzH${vn:1L$&&RL&#)) LQQR{rʏ-ygĚ5kp:\.Yjnx Z\J" VIHH@Rz'55UȜbjji~?޽+B[[TUUQ[[+N꫔GDDDDDDD9ݴT*җh|l Y~ Μ9Z d?o(r ^_hZfggڵk={qضmK.pn: Rv8d2vEMM >N=/)))444jYv-:իWbΝ8qׯ#ɐJx^vM]]YYYYsEl6E!)))Y,&''q\t:V+7o;w0==ڵkrp8h4҂FaΝl߾jH$B\\ wÀj5sssA<kj஗\PHRdl6111hZ\.r\04 Z*.&aAn~~M8FףVlH$6 'NTbZ?Rf-Z>hp:J%׋VaQT E>-n\. D"½xTLLL`2P*x^\.P  "4Z\OR \G"IJJ"d|8pEee% JD"h|]EÁ"IF#JݎRD ~$ R͆VE"^Ǐc?~CKϣP(|WӉRRtV>p8Gsa%T*H}P3Gee|>@G"|:H$LOOT*@D"'ꁎH$|yDB @Rj`aF;"<<8׉+ʧ2HǃNC?D7*Rc"""""""""$*A>=(ɞxt$rV<5T*3h>g4iGpw()""""""""( s7p8[. khQ]Bx^<v^ߏ-H`0(|>n0ؑHdu^xB18۽G.:[gt|x{ҏDE v/~_8\sYfppJy|^p݂&9ܝBAG,|n< sl0ֹ<]]]B!!5%a._α`0HGGP_}E[TM~\>xDe=@H$Bww7W^,Zgt! |Eǵc҇B!aܸ͛q㡿kQFGG?$["""""5+O~$ LOO˗/|'eڝ;wOJww7k֬y,;z(N\OJWWWftt˗/cϧ_$'' }nimm%ɓ'9|0,YD n~^'77+J#)z^Ξ=dE[|j\# >\nݺ%lK|[jV˗J by뭷xwضmaٳ\.&XV}]v& ŋl\.l6{0::J0СCN~~>'Od۶ml6N>MBB:^zݻwp8hlldժU>^/| Bn:yw'&&ڰj*9q.\@" illdӦMB!.\ƍ}błe||UV!P*B! m_W8N%˖-[n/SWW(cccTTTȮ]f /5yyya08}4ɬ]Ǐ1L9r䩇fd2}}}Yx</gLF[[)))deeDkk+#HPTA,Y5Hַ%h?i昙7dvv[nFYYqo|>8q^W8_zz:+Wd֭$$$PVV&Qfff H$dffyf^|EϥfcddH$;wϟܹsc||+_AVgǎ( N>ҥKu555MVV}}}~JJJtbZ. Jrr2IMMZ&11\Nkk+,]bnJii)w`0֭[d{ܼyrV^֭[ z}6%%%&֭[d2QTTD$X/!룣o}[q\dff)]IKKclذAbff~/_ΪU8w.a|fgg|a),,ʕ+{,[ \N [پ};?~zˣWrA|[BVDaXHLLDR/Gtwwcr)P((//ƍH$VZΝ;9}4'OD''SYYI\\K.E"tR֮]+ly^vM||<@sOzz:۶mcpp-[ J`䏌 pwsرoی~x"uuu| --@ }H$q1\.lv~?Bd\AA7n7 ˗/W^-e-IqqqLNN2;;K8~ޣ9CKK G7P(NCVBET kk@@| 344$R\.g||QF p :;;效g߾}cǎ100@rr2eeer ֯_HC栏~QT !-~6 L0dtww\\R999r^`ٲex<6nH `޽444^"ʹstڵ~?9rq^yy&+WÆ &sN:O}}=lܸqD"l۶ ([.ҥKt:#99H$ºur LNNqFv;+WdffQj5J Vbll IJJ O|.A?{,HR)))z=[nn+B:$ osss{QPPڵki4 cccܺu%ߏn'P__OAA#5:XV.\RYn: Z[[cpp9RRR\KII "1L^:(..pj*ꘙYOZ۷nSTT͛7}vưf☟ϝ}dX,֯_Omm0vYv-all LFrr2Β5V\IQQK,R233IJJ+Wd󩭭hmm/B`xxH~~>mmmի9{,gΜ!/GѠxwPTB4K.e,[ dž (++>N'*SSS022š5kٳ믳tRjjjy&6l ??aʄ ȁaC{9ɡRGp9FGGy7(UVFqq1555G 5klڴ iiia۶m]6aٲeTWWsx饗p:8pt:;v`Æ zL&/"Hzy.!]Fz=/n:㙞fŊ=88!77˅bbkF&Auu5 l޼~VXH"jHG7ʘ ^oPXXڵktƒ%KOaa!d2N>7ޠ86nHKK ok֬! RVVFQQ^DDDDDQ>If _Պ른+Tjl{<( nn7f@ x/ * ңV V(T*aCB&+Xas~~D"3 t:h4G1{-G?݉zJP8*9Rp:FBBY5ՊVEP*B!#Z'pm?!RI8r!HP((J|LL0>ZvQvrHHHg8FR#.ھ1܊]-_ L&J@ A. ѱFD=}H$8)))rY~#1χ\.GR ޥ*y6l؀ju[~d2`jxt' T*qt:( ~0_\.p^/Dx<A.zg ˅l6 yt̢z*Jxs. T*\HRt:z~* t:Gn|><P0:_ r9+. χVBs(fE(B. ( ;$FK0"znEY`Rt^;z~_&??Q |>!`adGRz%111\.r\Ssht:Q(hZ!) ^ޫcK hpMTL&WvjFj5Z s_ kAtlJ%2LJw] R)^Z߷""""""O! AP*LE)Y5П$ a,@Cse^/7nLU]h?NOjepp+V|X{{;MMMqEzTUU yyy=VW >k֬!33g!@~~PC@?p7%n۶mfB>33n'555|aά^E]XQ˳R&*=T*?V^ux4OQ߇':N'>i"sss 9*~&*[! C?=_8w\ -KFd2=χȣ#>t-y: {⾢dh`0< PBqggǃT*}yq,R*O@ gG|v:Cd2#ͧ8B!b{OhߡP@ ~!6cH(b~~^y~NP (Z@)s$ _EtG"^;??p8 zg-\3 c q:¹[g8l6۷ochjjzi!*w$ ۷o?V$xp:]#=pp8 h żQ!-p~w|+Kkpa>yWf`ɒ%ooձ~EBz8իWjS(9rs@nn.VgtttvZFFFػw/LMMdNrr [ˏc ?Ç9q ^cǎo>ܹCZZ.{reN<ɺujLUUSSSdggSQQASSyyyB%hL|l6ͱo>9z(k׮i< eֆo~իWJXYTfM& NSUUũSؼy3NnSQQARRaQö!Z9z /+Wtj65H8r6mi4O4&!Hy v^ʚ5k$$$~B!|>DPf *nGjDp+ s}TjݻIHH*hG*ED  rafe~_>A| _}*|$axxda8qH$BVV=}Z:00ҥK9{,'N ɓtuuϻ˕+W_b:w9:΁@F0$>>#g!n墤OUU~,8SP9vyZX":{9[Lx<@ 7=.D䣾Q{rFGGرc̒%KLMM ?ؼy3.\sw^hDtttGvv6===o>~?CCCQr8u$%%ꫯR^^,%%%X'ŋdddrJyVZȫ>8dddt:蠱ՊZvsR)#J r!Z-?</ؾ};|{c``$ /2@ӧOI(TTTc-[PYY4W$](LLLv)//'!!‹/ȡC}o~̙3(J^z%:;;ikkCկ~cǎ1;;K  55U<ܰa`  (_1^LH\\.]b~~+WRQQAaa!455xصk&ضmz شiWΝL9s :N|gpp N"9v8@ff&^zv,Yٳg3`+AtA, ;)QD\d[-[Nd_$DZ%Yeɒ"DL Hksx$̼s{{}J# ̒%Kxg_5v;wJKK < k׮套^"55^/UV}vnztŠ+o~Cnn.:8Z->7f_Tj* ذaxN?NFF---y饗hnnfx<._,қMBBW^! f0LL&p8A.k.._̵k0 vr1 [nRS۵k===dff 8p--- իWsYG7D&111cUV裏Vx &L0aܞF#""jbccF566Cww77or' b  111b`իWCtt sHII!''ŋٹs'===+LNN)9q׳dN>ͩSuuulٲGYY6m90͌~zrHtR?^j|K? k.كbbbjַ%) &??:9x ׯo-RL&,ZH>H$ḳEBr۷n:\@1==dbٲezN8]/gyV˵kxEP}vvu-::jjj9bccYd :u Eee%ٳ$333DEEqa:;;|2F~!8q5k /T*|2?QT\tq6nҥK1|k_iV+7#''իWSWW'4ْ%..+W3ψه";;˗8<.\ **??aٲe9r;vׯsE.O>$LƳ>KOO۶m`0DYY=[lY`m2oFGGdllNyINNV+R$V%..Z-[Frr2; +06l %%ŋl6u<333DGGo|fzzzp:׻`{Jf޳tuu6zy[Xa%--d1\.ЌuS$[?Q^N'i6MBB{%664333-(? 233O rt:1 /ԇ+V`ӦM=R5 . "mt$%%1<<0 tbϥKp71L0a„ s{̉'!99FoAoo/r%K<0?>Oχ"//ˑ| /"LMM_gppNw Irss rssyGYv0zwM6yfl6'O$..}qe~?ݼ{㏓Hss3Ŗ-[Xt)r={p)q\bss5VZƍRɮ]0 |XVn*4C^ٹs'>aJ%K,axx4111x]˗innGDhZbcc1466233ʕ+ S\\իW)))') ^i`0ҥK~JJJϧ0LZJ'Ӄlfɒ%QUUZ 6,6|>SSSvTRݥ\T*t ĺ 7nz)j8$^quGzow^jQcٷ055Euu5GDZZ.kw\XVfffBT*233s?駟&33SS=q'tXb,h) &L0a~J蛱ZjXMy:׽~`͝u\ҦBPr|gRݥCە3L&>/tK|1oyso0ܮ47ln~7ʺ ǶT$N>0>>4iii,^Xc~{t0v׋nk_ZX873!i>Kgҳ5N5N?999DGG/({o?."Nc{ժUpN}/qS&-˙AJo|CqֈBrJJ 111j~?#55uܾ׃f &L0anAl6fuy{e2v]h?%2 &̑-i>8V+z$B!V+[2 7FW)"##46H~7sst@`84_&L0aZJr]l6 V9ra6 vd2a4E-܂hp#x "l~.| l t:xOGGwlfcvvVHdX+F#bv\SZ+fyz%;eHP(ngvv)?,)0;;'a„ &i֮^OSS||>rssXEYѣTVVVȸr{9*[l'Np%bccIIIb_fގdi{>0l$''.iii?~RZf_~+Wy`t:vs).\ѣl߾Ǐc6"))(yA!22riTt`t:~ʕ+EP($rK].HyZy)oitVq\v:!F*[WGGǏg(JnP>Of3*DFF뤜*{HRRRD/Ӭ¥Gz^ )eYp"C^WdҐeܷϫJ||<a3yBp8|yHAl6xR}rXgT*8/l!e€RRRDN< @vv-mȑ#\t.VX'8u$$$qInn.edd~FJJ |Onk^#p\"ƝzKK fcʕ\~w}J7ޠv D5/$2<&H"""By^q,ESK֥HRl1LƊ+;Fzmmmձn:&_1kVILL*HzrX'is P(h&L0a<,']qFy\d S^^޽{J*.)sr 7oed2KDDHGG{'̙3Awd9p;v젣pޯDՊ D(b044Dkk++µkسgpCcڵkIHH@J\B||<]]]tvv SII 7oȑ#S\\ŋk prJVZu[@ 4MMMtwwSPP@FF$&&[o 5ᅬl&..RVVh$??/? Xt)k׮_dÆ < 孷bnn6233x< SSSb!22ѣGE.5kN>b,~G`Xx1[,ۉwERaXxgo~C~~>˖-96mΝ#'' Ν;gŊb^ AҥKT*vIMM FrrrxݻRbw|ӧEEo~{Պ%%%DNN۶mIJJt&66v-.. \2Ƞ c=FBBo6[nEr9 lڴIǏGVV/ĉƊ sss|ߧ*l6b̵otR 李N8dKKGGpCLMMeŊ(BhX~=˖-nsQٲe=Ä &LҖV]q.** ͵kرcC˓m0X,tttcǎ.'..vaL&I}rJKK%22rA~3gΐFzz: 8$/2SSSzbbbHHHX`yfV^Myy9~!pCUSSÖ-[pݔqFt:@l۶&F#k׮8|0W^y[{`rrg<\r$@S(455Q[[Knn. p!vr…BZZIII[6۟\   PzK`0d' 55R3-[t_vyrI6mT*vLTTUUUͱ}vVXf6墠sUr9FdrPTdzrJyt:Ç͒%KsE?SywԩSp)hnn?vs=w&!!.^ٹsscJDDw0tvvb4bbb^x ]JVQ*h4z=Lll,|B>==֭#==ɓ'jfoAOOPÇ,ϟg}rV{L&CV/xFFFr ;vtELL qqqX,ӧٳg=gΜazzx v;TTTo+W233{ NRR=b4n5^OшQQQTWWdRRRK.q!nJ(̙3LNNxbrIzz::thp 8y$[n?!IIIfx rss`zzZX,Fѷ?CŋÄ &̗jCH7L_}U ٸqC0oظq#]Nuu5Ν&=R( >L&Kq\\rVK~~>7ndrr_DDDt:crr7b2P(`ll >f3Wh42<<$޽ŋocѣG`jj`0ȁXr%uuub ZRRB0drr~J\.4m?)(ZDDO<477Ѐ,_=!11~ *~l|>~< :hZod 㩧!JHK(i.t\PPXXH\\ΝaZ(BOll,z(U(b>d2qqqhZN< 111"dέRzSOݒ9 Tqqa***0rRRRr6o ?J.SBBGtt4 Ɗ,w#LCX SO=EAA ?i -qZlٰn K~̤:{ &L0]}Л9s ccc$%%188(ϭV+K,y`&}ϝ;G]]. Œ%KoUP9HHH[o166Z&pQ&&&TWW355ENN\֭[x<۴c֯_ԩS#P[[K0F?99B [nVݻ9wׯ_֭[wy پ};*jzll,+V`Ŋ( z֭[蠷\Κ5k0ر`0H__r~lj^'))zynzvZ-f/L&cѢE\֮]L&1 Onc0`0ƍY|9.\Ep8(**bvvTbvv\ŘdAQ l ###϶mۨYv؁bnŸ۰aׯ_grr[2118qqqT*F#W^%==9J%EqE %%%jvލԗ>IIITUULnn.={Fc=999Bh$''Ί+"++Kt_+WRRRBII DEEa2!!!NҥKZFT*ڵV\``ڵP0%%E'%%z9wF$ LNNj%..e˖1JQQ2q._iiilڴ lقbIQQ6c4y7Ÿ]t)TUUaٳg\z͛7rFGGٷoEEE;wjYx1tuu+WNaa!& FCii)W\]vb Yv-%%%Yx_·~FΞ=K0dffn7Of޽[lʼn\XFdee111ANNiii?nbbbX~oX,Ν;'|](l۶Ip:b̬ZJ%K㷿-`aT*4pMYh{errQ(\| 6KUU Ҹ&$$PYYIGGѴ266M<>99SXX({ժUDGGSWW'Gjj=Ä &LAL&^W&133@ \' bQ~?Aӡ]BIIxjZ B(J Bzd2Qt/iCR97k4vR@$=#'t@233CDDHm!TOi/r:8a!׃N699I\\jZhz9 3g%Y&P RRRNR8^p1"{aaZ[~?[,ZZZn7~L\._0$iŋ}ί4nl8\.eT(B9}yIskn4iz%ife2X5O5PX&~:+ʕ+466bHyݮMxfK'ɀwzJLo~wGtVX!h8}4333<쳢__w3,9}"ujj)B:%K-l楗^'11Q<ۍ;Y= &L0B }3VZM\\܂7w}I|yowa+!I,I0yE˹wjMneA!m%?&A Wgw12_pX,ΊSR'55$?iz^f3& @Jy^oフym?nFJd¯122sd2v049ԿL|-z픢O^Yh?H 咯ݐ4WH,ƒZ~oyED~ff˒`0 _vIyM)„ &L/;l}su{֠KQ% ) i:B~IOu:M_p\"x$ XiJmp8O &L0a„r ϷӛQB}U-P>vJsOva|<-L0a„ &̗)';HgzdjjjAarrOef|>FQarrRlLMM-H] HRsv}>ccc`4Ez^L&Psss"t?B(d2( oGuu5Fۦ#gb.L?NS(O?4;wN:׾cF:˗/cرc;weAN<)6w  1?b!99??{Glذ6o'r_KfJKKyG 3cǎTJ@.G15507C||<.ƓO>F_$//uQ\\LEECCCn~tp`2(//'::/f͚~* LDDZ?Aww7G! vZ8Pxp\Ցɓ'oo9v !::Jb/\ҥK1 DFF X,r pC87|>* EDDJf# YF\vq:NX"vڰZ(Jy#a-[V:A^z%lقVŋ @ lFu TVV266O?Mdd0Kos|Ёz1 ~s;** -rL|;ο~***{>z &L0a„칫f}Ŭ]ǏRn:Μ9CCC} r{ N??Þ={xꩧ8u`dyfffGvf˗/第,rss'Wڵk<# Wdd$˖-#66~QQQիW!Z-@ 6}vz-ZZZXjr,tlܸŋZ>qEHLL o& !^l6s!|>|X^d Vy(b ֮]˿˿m۶] Ass3¢"}?GA.ͻKRR۶mcff*زe ccc۸\.MSSP;wz9<~պ@ɓ[_ٟ<#TVVb4'99P(癛c|GB!8|HW^%22300Аȿ.˩իB!nڵkE]h$#z~غu+YYY>|΋/%**,/_~[w}˿fq!v-kjjXx1'##6FGG9tcppϟ(~$%%ȇN/dbb??bٲeB!T*=555ΊTDc۶m54nn7)))jΝ;~@||<|;!!!&>=<Νc<h4rr9/^ˢE… \..\@cc# FUUsP(,466 /PRR"n唗/SBB`6sK&b z)222HHHGVS[[KSS/YYY\t ""[Vرc\㹹9l6<388(R=BgΜaǎG?bѢE\.qtsssx<^/( bbb#66XӞ̲eHMM}c.L0a„ &]`0(KnNDze|D__/"w9ϟ<7L=nK/L&Zoǃ6477sjkk RTTl&** cccb41űzjEמl6ŘL&fffVo~Þ={DTRPP@aa!Պl-޺u+71L={6BPVvz^OLL "55ZΟ?O .Vz(~III.4 * \~,8xt:~䧾("33C͙3gh4L&l6~`@Dղj*}Qt:oUj$''SQQ9uK,k׮'Jzz:`!׿uaJ? B{<ƚ"EW^ͣ>"CAA,zjg6DDDhe||ӉRrg? a6T*h')˄lfÃfggQhZ, SSS"{{{;MMM455҂`zzq0や &L0a„lP_d8N~?IIIpF# 8>a.tVχ#""JZZZ\.,Yr8NT* #G`X%)) ;П={`08yyy\rW2==Mvv6cÆ h4mۆwٳQNFF{;v El2 ۶m(vIee%?W.[oã>JJJ ǏҥKdddc4hJ`0Oqq1zL^ezzzUl۶ \NWW2Ӊ 11mLNN'rxBys?B!&&&HIIA&\vߩNwCP !!;N i +X̹Sj墣CX(|)KZNݒ%KHJJx^y晏)V/Bj?/1r&L0a„ PBߌjEV w]̞%|>7 I_Bs7o^onFo޷ם:_x2o.~=n.{~4>|K֖uqq4n#d}2nV*"2;$4Kl)B_pQZZAǧ>&""'fc||P($͏~;F#,ZKee%:˗/~ۜ_4GqBLOO377'rj?(v;:n~UBrtl6 .]"**Ꞃ}:DFFtr233?0A)GFFhkk###ふ(v}Aϣ.Ν#-- J%MNN5% 299d8Nz=n1ĄH(1==o[ QQQ`KTz%Ass3'N 7IDAT7wA'NmYưX,hZ^/###f4HVq\\.~^'''QըT*`NdllkT0a„ Dq?? ),,nl򓟠h>U/sy|s9T*9qW^ /MMMlݺQ>C]FGG+W!--MjjjXbsss?rVINN׿5׳l2ȑ#={Azz:sQ[[|mۈ_^cSYYIee%z~3:/Hww7.]";;; V͆\.lfjj'O3gX~8P*rq(yymz:::xhiid2QPP3rŋrxٽ{7Gbp5bbbPt7. ͉=33j'@ 4.B333ryl"3~?. \bAVt:E< ł^Wf, &rwbNvbXpOx FGGYx1nB jhZy.=o)d2`& V\.d2133ѣG)))AT8s Eww7o6]]]BYY;Lmm-LMMLMMQRR"7<Nh4Rf(:::4k׮[V^~eZZZsu~199Ikk+cccRXXHMM Z ߏd_N xw@ Z>`tt~_+W022BVVonj5o6tuu/>377GDDeee RUU%bHs]vqY(**bƍbA&tRٻw/k׮T*Yd gϞhmmezz]v!ɘf333ebcc m6.gffrY8}4;`ժU444b bbbp\`0---+ѣGijjrjyC.366ƩShoovӧ02 NLJ~HSSJFF`ĺuD[/^ {JJJHIIeǎ$ 355dOO8y$z˗/ggLLL099֭[q:466"(--J~ &L0_dG@MBXPXyy9~LvCkVehhv}.GQ]]ZZZ-63* ɓ'ٹs T*5~!`CT/c4tB=_vc=FGGGnh,\͛ZB BnZ-sNw\.祗^8v[{;vlדw]EfHNN1|I<q…E\\A߃D& (,,o>^*4m]v@!E6 d2*++9tIHH ..{TZZZ8qX_trx >˗… d2bbb'**J\.ϟzFFFHLLիLOOp8lx^BgTWW僣B!!>#gb,WUU4Gľ}Dڸz*o&TWWsϊ=deeq۩{XT*w&66FåKPլYFCGG$$$ |԰qFHKKȑ#uORUX巬^SNk.Ή ::q@FC\\E(f8iiiAsqZa1BITXh)))T*rm:;;ˢE4%˨C/H'CDDj&**Xl6] &L0a|U@|l6v;~cZJ_΋/Hii)YYY]ɓ')++cz Ánl6JŖ-[8Nl6ED ~:\v Mzz:8p:tvv2::Jzz:΢&!!AUgg'n"V+.jakƮ]HNN -- \.SSS8Koo-޳g?X,?~F'=22%a111$%%OFee%'OD&''>}quZ[[ņAjdL&9dddPPP BjEȧ(bѢE< s9zcHz''22{15zCBѐ¥KطogΜ!//ZZZHNNxnh"##Yx17HMMp099(pÚett|J%fۍ^~uuu$''Px^&''1DEEɢExgˣL4 ͉Ktt4@ @dd$NɄ! aX|>Ą𙟘bjh4bZCSTTāXn;vҥK\~Çy71ʹDccкK. Vu`AAtuu1<<@[oͿa˖-$''3::ݤwmff&ttt`Xd `6z{{nHtvv?!&L0a„yĽjaw^lBRRVD|ZlxT֬YCWWSSSdggb ]b!55²Z& {nv;v"&&Id2))),]46oLKK 6mӃNcʕX,:;;~_kZP*ĐGDDSSS$$$sNr^شi>nj5Kbb".]bddDV,YIJJ QQQAl"cbbb(**ڵkr%2..BZ[[gdeeGVVyyyq# }}};wNrggg`2`8N>dBTRt@ V\IBB.\ ))}144DUU6l ::åKcڵ[eǎt:***llذLuu5͛73<<(iiifINNXXR\\̚5k(--e^(b}gffD>ە3MRgݽo]INufffY佔IEb~;Ń`rr8anB!&&&HIIA.\>9`0(g!P\"rOn5s\ 77}~;V}ܺsnnzzzHMM%5R%K,7^n_{i|ymMӼ߆ &L0a8  %XVj5qqq #mnb=y8S9w{wǕivu{vavYwqu:zF# I{Iʸ{T*o޲|U$^>k͝u^&WPTTtnKLJJ'$4i5L0a„ f𽢼]ARχC&aq8lFjd4NC}6 E^fHLL$))IgrrAb22NHkdU0a„ &Lvw]Ұ|}V>_FvK1$NL&8J)|9g}w0a„ &LOd2P@w* r9rߩ/H{%K>g<8&L0a„ r?FqX, T*j8DPS@{e~w >OTdV1 C7zj5ӌj322V%HOfX'sssa4~zzzfBp055ETTVAN'QQQx<[g6  s߉A?Qs+"n300j%** \.RDV300(" fcpppu:f.!22 tۍFU`~w$Rl6n7.^fH'133C__333zj5cccLNNRYiii!&&^D6Z***8~8 -J͉,bGa099GӉPZʹsZ0 033#R9rBWW޲AQշ|bdd˅`tm###b0Q墿OddXSXrK Auu5dgg[m&+ l6F#x^DGGȈ h4\.i?Ngg'v3gΠ9s 333 peB} /255l̙3(J>C^/MMM\~ʩSԩSbm! q X,/AL&QQQz{{ikk珑1fffD8yȂ0ځFFFp:DGG ebbBC2e2J>FGGz 9299)ͦN&''Z Rxt5 L0a<8']V~Djr c}ЇyWhnnfퟨIPU*:uvΟ?Ozz:W_}FmgϞFVZŕ+WW{ի(**d2LN#!!_~jjjXtxTTT HOOrرc^{_;wr5ꨬD`/I("**_ ***D333"Ą8\grr9|> 9BFf3ttt_KTP&Ex/766RUUEMM v/~ fffdҥ믿NFFmmmڊ#66*hhh`ڵ(/. @RcӉF}>###"|^/###x<"""X, ӧORT `vvNDDDX)/9rbΝ!YF̼ 9rD?q~e)**_gʕ455ضmN j5jQSSݻHz-HMM%**q@ ҥK/ W\!++(ưZ@h4r)p6mZ\zׯ믓 X{;w8Cܧ ??E177'CÁB`( >C~ӟe9y$]]]f4 #PT\v/^L]]Ν˗7 t={{~ދ2shdzz^0od2t~?/2o6ޣ4 t2'O_Z|hiiRy;öm8v9998jjj(..رcRUU%қձe9Bnn.CCCLMMΩSX~=}999l6)--7dݺuԠRjlJ#GP__$##B8mmm vx<?~jybʕ ]p8deeQUUʼn'0$''CWW?OHJJ"**@Tӧŋ8ENOO399VzYZqff)t:6+W‘#GDJر1r9zZjkkINNFpi &L0Еw+^! SMVKttCkHNN… ]\.( qvÇ9~8`E366??vٻw/|>F#Qrj5 299O_W466 d%[eeet:v6 [ne׮]k P\\,M fN>n_n?? ~233IOOǎyٿ/e hkkcjjKj.ZZZP(dgg?1p/^RN:Eww7d2֮]ѣGؿ?㌌d~s!l6'NyŻp8k{n\.w}%KPTTDyy9O?4=== `XPT,]d!~{=f3N{rH299Igg wuu Xj׳~ÛJ"::gϢzx^HLLŋ"ҡhDD,]͛7g߾}$&&raǎ|'NnNa۷m*++  G}B\.G׋ h42::uuuBs Xr%TTThHNNfŜ;wNX=|RxGappB; ?d||ƍϧ\Bccc9rD<rBALL *nIII HJJ_;---bZy'//9{,/_FѐVezzyh4B?YYY 055 555\.O>$*~-ZD02Z-IIIXBcx}8{,+Vիx^qan'??_Xӌ244DvvhLMM100@jj*>Y&&&"++1Ngtt fohhq&&&$55H~v͙3gXn:JŻヒhdxx[hx^f188Hff&`pPHxGndgg\.GR' k LFAAIII:u֯_q\t:"##?UoR^^\.'11s \tj`H0a„pWL&[)/**GTꫯF2 T*.\@DD%%%lIQ*vN8޽{PcǎNd2ŏ~#yWFբh\.q={a>]SS͛yx<8T* LLL{nrrrHll,կp:|>Ο?M@>|˗7MZnYv-ַP*x<bbb8t-'W\!99kײi&Ο?Cp7jZZZ8ppÜܹs(JqRU]]Mnn.ɬ_20ºaΝ,^ORDT"ˉ'==jYb0ōXlzzsΡp\477ٱc[nl6oLQQ'Osɚ5kؾ},P(Ν; BA(=zrqJJJcvvV&JZz]trU6nȢE(**bϞ=e&::hnn&??0Wv477#3000ǩjh"f3dggꫯֆd⣏>kk裏lz]ƅ عs'_0 w WSSâEHNNRqVXXHYYj@ -\._L__111tvvzy(**7ߤǏdǺu먫ĉL&~?K,?!:fJ% Ymkk;bRRR(,,d˖-lڴ5k֐牌fѣGٻbkXDD$%%kŋ),,vz)))ᣏ>ҥKl6 k֬?sssCh)5`0Ҏ\ؿ?EEEl߾JJJػw/ٳUVk.6mիų۽{7k֬aÆ b|ٳBvIII k׮8p+WyfXr%?X,p}qY:::o{(YBHMHH[ /@qq1GYFѣ:u JE||8NJ%uuuÕ+Wxٶm111¼QҞr׿``pppA(:F#|тЊ011Cj"==%"K{+WrС乭_]4t|099ᠩM6PZZʦM$z>n-cQ~333a HJJLMMq6l@EE&˗uV,Y|V%99X14l ߏRdnnAJJ ѬYT*?q{# b0ضmΝ 9p?O`||\\ #Z,Y¾}f255@kk+*<1CX&33o|h4qP"111l߾[i>OMMMx<O^^\dYz5?8iii .]׾5ҘfjjJd󨬬\0].uuul޼YɲIMرc`Q]Fcc#űxbyP*Ĉ{Hʹj*oNddFX,,^X<\~,ټy3;v젧ihNMMGii)x&R{L*qqqݻUV!hkk61 O kvJEMM uV֭[Gdd$%%%( FGG. 6aqVXAWWp/?IDj4vnWEff&ZVz&&&0嫾^? 1;;+żo׋VcF.STTNCLNNR[[KSS3C0FvލR$%%E[1 ={# 1@oo/vLvIHH`˖-~N>藺^OUUl۶vZ-O<#|37mDqq1l޼YD'O299ɁX|92Zعs'ZvAILL$ xb ׇlfǎhZrssTPCqq1sssLMMsNF####B%}[ZZ)6l M+VA֭['6W\!))z ӧf޽,]TtAIJJx߾&99U $mj5۶m###˗/S\\Lqq1 SRRN#55nf3999VӡT*),,϶mۄizz:$$$>;vPXX,ǣh(++cxxGyDX>Ž;L8\.f?htl2233# qZ[[Z,]@yyyx<DL ~pj233qdee d Bedd@ %%%_^IOOG%)) ˖-< gΜ999r룷UV7*hkkcƍkz<lܸM6Bii)={vEVVcccf#55Riii!99իW ?8WfGTT999xbrssQոn, III]e˖qeyhooGѰf͚{y &Lk]f2GvSXXVtt:233NiKYbPQQ8Z~_O?L&''\OLLG󩭭G `0H}}{MMMeժUa/׷bZqx<D I3|Q1BˈbAVSf&0ͨ'L0aPBߌjEV%ޒ)g|;}٧-ˆ9},222Rg08l6~s>B!l6-Pi9-#%׍0/Қ*U֥0a„ &L2R,zR1)UgYy).﷜i䫲^nd➔P)>Wwv&a\?@4[0a„ &L/ZJ]z(Tg8/_vVyCVҿ6 "˿mp&w. 0L0a|]%ʝ"UЃb~wAWW} j-zDGGxettTI^/|>t~" bB!D]F#LLL磵L&111(JV+###DGGc2n\.gnnׯx0 0<<`Gq}/LQ-0B\Phꢿ)Z-JnfggE.lj\yXR= fpS0(LNNb2GD[,$EORcnnVưZr;vhE~>X۾#`jjT*P~qrr2^ٳ<+QRGϷ`퉈`jjz roxE&thR:nfffE9Vׯ0 \.kgT`0 7!|71LRVVFzz-AB[Ad2{^J644QQQ8Ξ=Kvv,p(ȂC0a„js?Q*wtt_ʕ+W^fVYx 裣477cǎOT$*JΝ;G?eeex7ihh`팍q%zzze͚5\z^zT233?,RKDEEEtt4/\qoSWWV%==Oss3=z]vVyWx뭷صk---q%OK/,2EQ]]K/DAA%/OMM199j%0</ZfppPxl6&''X,DFF.&&&%""χbA099Nl6300\.'""Br\"Bh4haxxX}c`4ٶm:(..fllqz=@qG@111r\=55n2::^GRa4Al6JR<Ǔ'OR^^N[[~8{|nnIkk+׮]ŋ-[py"##ٸq#sssb,jL&ٺu+NSO+Bgg'*ŋ//Dn_X,._LQQ?f( CCC P[[ˆ nyJ}'LMMa4z|>p: Qt:X,t\RLMMqU X,DDD`4 tuu100믿Nvv6UUUx^ /^Gׇ`0 ɨªUHNNsM3==??t :oصkΝ.~k׮ AT&/388Huu5ٔf[ưdb``LV̠xd2. 8?~ǃf[oPTTDAA KCCC_*+Vrr9?OlT*222PTTWW)94,ZӧOtvv/xXr%555ի4„ &} ʻvZvڅa) '''xswr'|cffB:ѣGE^~ //x^+NFBF24m]ٝ $ H &Qv-Y;N$3S5I2de]$ݭ%[,.%. bPmZl}TD{p!ZZZHNN <</HBcccyg@PjAmƎ;xW_GG7o?裴~j<'? ̠d f3ccc8N>#t:?PłlFncO?}硴s  R={066F?={'||}ɡCR9BQQ@3go|^FFFZj1L¡wvcعs'/^D*"daa1fffaxx\ihh'!'EGG'ODrvѣGINNf~9Veiiz>BAjj* x7ؽ{7.\@p%~-=χbn3<<Аknnٳj"##СC1d2/Kkk`JJJ444 HX\\8 SSS)?jlذ+W멮g??ǃ^GP~zZZZٟH?555 ޽{appN<)l6>|ӉngǎF% ͉'h4\|]v.fN'& Ckk+<G}6j5ڵowy|>IIIvMswnn_F?8?Xv-SSS۷2008h41Ldffc=\/;377+҂B`xxEii)[n>6oL]]KKK1;;… NBBҥK|ZXXW_%&&yyNT*%,,I:::q$--{ww1<~= \(԰eV+N"##CȦ.ɸv߿_^ڵ>q!>DFFSOQTTDrr2>,v^/s!>>{xd2>:())aTVVrdttt}SN x'HLL}Y&::ZgddPUU%xivr%d2nnv֭[nÆ qiDX~=7o!Y^UU!..+ž={룳B48No>JKKikkTVB0$,,\1:pE版e233y'X&!fll Z7Mrrr䩧bdd*A0<Vioof4CCC>A4 {eqqsαaln:rss9qgC+^Ν;ټy3pR ٝfFaڵ8p@8ɄV%++o~8NFFFX~=MMMt:1L<BWWa٨DHKK駟Ԙ0T8tV%''o|B^ LF0dzz3gΐBXX^Ow~? ƒ3>^OFF< B$ ~VKGG^TT͛Qlڴ0`yyl555 `6x͚5 211Aee%11{1233d¡磼ӧO yAgg'hZHLLr5IKK HDDAذa .H$RRRjrAT*& #))D{1RRRB;BuB[[$$${nt:֭C155EWW¡8IOOgΝLLLo""""""gƠ%HX^^{~:}jjZ uzz> bd2| `JAp=2--6, nٰalٲ@ KZ裏 0L(J6l@II f7ݍdqq0֭[磽;vÕ+WXXXvJ!9^  55pBVL.--k.J%T*EQQv)ě&$$R|'BP zRZZJyy9v\.Z,ct:t8p@ӡ`0HWWqqq X, J_vp?jjjd EEE1>>ΦMNBlRHNN&**H  y+4VfppZT*%..'xiP*vZz=uuux^rrrP(z6l DEE\:$#22R8ڰa hHJJBTb2dgg#˅ÔIKKC*b0yƍHR$99HIIc=bm۶1==MJJ ӬYFRTH6HQQ.T*6l`˖-䐝ƍ1p8HMMeddy),,dƍf֯_OBBuuu裏d%())attf3%%%B{nn.477n:R)l6fY;ٌ`TA㔕QXX[nh42<&''dQQQR__OQQׯg``{f`0`ذa `0(<>t򘞞fbbnƍIMM2T*Af3ʹ =.e4ٶmpX yꩧmX0 ڵA!?>>{!--M0/""""r[1蒅w\. iN'N&cV#22򦬮_w"䉵X,hZoe6:w(155u_렇6Vʕ+TVV7x~?W^ezz$˿;11A]]@L͛p8|Mv|=r }ONSȨ;A_'x䋈|Пf!t7?5[0šȐvH$~GKBRoBAAAyyy|لݾ{!9g`0Hrr2wh47/`4](%**L|;jyo"0>E*V<y,i+z)..fnnhlldΝw@X,Q__:!C5,,K.155ũS0 HR}x衇Q*++Ynmmm%11TfxWIHH@ѠT*/ FÇimmEӑ$>`Ϟ=#G{n:;;|>j5/. \Nbb"%//pCW|Vh0TWWAUU7ndqqˆCttFݰ@>`ff>֮]{ڹ@c``k׮T*9}4o&{?nq@`0f||i"##z,-- ώ\.!vtT*d RJaa!R f%dBPZ+WoAdd$}}}wTEb~?O~$mmm/2~/R\\\.7W_eݜ9sf!yBB/#11A, o&LLL0::ŋ cjj>%1L 22Zh>>Ƅ2FLL 333BwzC@ XVz*jH"r`tt>BDDDDDDv ̀vZv؁ --4&''IOOk RSSedd Jy?fiibx }! / կڵvac766F__ 2YnСC Bv'>>r h4\rEQ ٶm۷oW^aqqzh4nyGhjjq蠻ͦMp:TUU 9vPW*"J?$11LNNRQQJ"??|!C:6o̺uя~:]_"`8tF QT Ξ={׳rKRyWz PRRBMM YYY|7|o|BjZX,v&&&G" JvW\AV /pߒ=;\.jl6牎Q ,..@}}=333A(..ɓBN?333()) zzzC.o~p^/iiix^ٽ{7o6*lقBPk.'77H$ /l6ؼy3ώ;P(ϳrx>}N233d˖-QVVFCCq9/B?&66z Hgg'%%%PUU%\fqijjbaaA """"""w'nݺ(2o!JoL?$>>rXgرc<䓟*w|Qx<, iii)))7jL&6!8墮[2;;KEEFQȞ/Hdaa`t<補9s1[\QQsJ%>,AAZXXs='xR)]]]tvv"HXXXjk.|I^/?Okv|DDD;]G"066F Yv`ٳ^FFF^ϷmJKK 211zo:0,..222³>ˮ]\tE$ \ڟd^/ zrrrزe x<N'MMM$$$PRRB^^UUUx<DEEK^^yyydddv9z( mmmORPP@tt4oavv'N`4Y\\dqq={PYYG}pRxǩd``Jq\ݻ[222[o*˿$111,..b2cpptZ,-- oŋ.T*.KNlmmE&jl6sQ{9~?YYYttt055L&C.3994 !~i;PVVZ& HWW===7 L&L&$&&r HJJe,Y\\$66V{G xڮ.dž lBww7j׋"''玵h4R[[Kkk+nh4d2ћ> &&^p\aUff&nݺȝ# Ntt4|& ׮]󑒒"xV+sssdddCVVzAjff3!a.K ۶m7^D"ȼd2 477 C"8nS'({%;;J<)))0::z7_DDDDDDD~1胃"j (--R1466"x'nZӃ\.gnn@0("""bnnLf#55nah2ؼy3eeef6oL0c=FZZ֭[GYYDDDHcc#P(XXX 77YndffR^^(`NDDk׮%,,>vMff&uuunAT*oA`0PTTDNNZRJbݺu8NV+T*YnZHMMEӱaJKK_ dXZZpO#ZfhhDAAz$Q*aQ(x<\.!::8 (Jp\HRK^^n˻ T*)..h4)//t2>>^h4~ir|]X>88H__k֬aDDD0>>NII .h pp8رcsssb4`ڵ[uQPPJkג¶mۘnzfZZZXZZ#;;kRRRBzz:6mbiifL&h4Iww7=yy BHJBR@dd$O= :&&&عs'yyyQ(lj||8:;;Q*zكdBf cP((,,DV3<|? f׮]b"X󱸸ȡC?O^xpdffRVV&(|)Пf!t7(?%nH$|>~wےvD"\\ƃ;5O>~mWܮnD"aϞ=d;]0R=}En^ۯ1rSl0$'' Z).]DDDDDDD@ȦU>B{x-$"nrlWt~mw@w8ksss7p8~oWm6vN|SۃT*,0aaa昛V svH?ZV,'"""""""r,i [oz)))˜>}p.^Hyy+@՜nnn}^VYv6SNKDD'O;v0==M{{;;w2zzzx7IHHً/kײoMFFzB/~ ~?.]"%%N#G'))$ມ<::G}޽{J׿ڵ>z*NJK/DXXѨjl|Tfm2;;Jz{{,ٸq#sss ˅JȬW/_ԩS,//κua@zbbb8{,o{ᣏ>pC `yyV{G;v;JRH&V3==!n333T*R$QQQ'̇^ MF$HRZ ?9/!]P044Dtt4^1^ȈH$twwGXXof#))yU*0::D"!**JPrAR)}}} E__֭j~oÇiooGRa0Č""""""""w;n v;@bfff!66ƦM&|n4)**bjj FYYNP ++lHJJFCoo/۶mCضm c0HMMehh&%22F N'266L&#%%xC׳i&._27o&;; cvv .뉌Bz* t•+W8{,Fv;.]BPpQ$ lٲnxwd\x,, /^v~@?v<|ᇔ4oNTT˼KH$^JQQߏC?Al6999w !#8N~ߑǕ+Wk׮k.s>|OS2228}4x<jkkg?YYY,--133Cgg'* $kd2*++INNԩSBzz:}111fD}:䑑DGG3::JUU011bazz/R^OTTRϓO~T*>}K.Q__OSS:< Y\\dzzsIᥗ^BT &&~ׂ1[tm~~]-osUFGGyꩧn^GLyyi||>o|Bσ ,//366Fjj*7n;#jE&!Hd78pF.s1[2==MEEZ)fgg8{,NGy7ɥKgiiÇ{nFM>< 111<䓬YgIaa!O?4&IӃaeeEmƣ> /H]]]߷Ch ;K/HG"o}R;{n@"T*yGؾ};cccw`0ڵk)--ellgϞD/..d(((gvvٱcjǏشi Hww7x<^͛7oS^^Nll,^x(++ō5kP]]M}}=EEE\zU8[rArrrHNNfӦM,//÷m po>f3iii呛KNN544ɷ-hii!**IV+{ F|IDDDDDDD3 ybqqez=,,,h4Kdgg͵ktrfll?R2>>0}}}ϓerri`tt(TTT022Bvv6--- 399VUJ577P(D&QPPbb`Z9qvrssQTtwwG?KKK \.M~g_!ywp`Xf&&&hkkcjj DB d2BRR?0 ;vǏ??{ro<1 h;z`0H\\`ft:6oLUU>L\.G" 鎵#tEڵk444Tn-""NGww7;w,ҥKDFFhnQyGX,\v톄o$''c4ٿ?˗/O<`pA/֦%%%())aϞ=DSS( :;;faaK.aۉG*gff &''X,x<7222xJrr2&!6l5k&::Aww7f}!q:GTTǚ5k%22"##)..&::1ۇ``~~hl6f$2X),,DףT*tY@ f,8gddRRRHLLdӦMhdn y bcc ##| IIIdffb0(,,$11$J%qqq( \. _ J0bcc1 z=X,yݶm %33(--%55<<FNGBBr^~2䉼^|gx<4ЍF#ַulޡd2ׯd"Ͻ"""""""""_$m}}څ^/n+u}["}JwDJN' ih~&o0daa ƝZDDDDDDDDD:H$\. `0HDD=$2LA} ×#JEDDDDDDD;CvYYY~<ڞd2} }i<[,\(z\N[[P]TR]]MCC(Jd2W\addʕ+tuu s nVԩS)鋋V΃)?F)u7YnBύp8hOCڵkRJ9ֿ@ @kk+(ۇnFFF07ŋBU>: 266L&cqqQx?TVV yJTTT0==.]BPpa<555tttɓ' رc!\Amm-+++p8FCTTTUU155Ebb"---ºt{\xϥ. tuuлuvvpgyWTVV2884(J>l6k׮vt k`bOAvNG{{;uuuz0V* W\WXXXzCB .011AJJʧn3<dee8---444P(RP*z]Çiii!''3{I._L{{;}f\.ZF^aw35::QQQ455 cKK ===Kuu5^O0 JExx8]]]DGGseA`X_{ȧq;Y?@RRR©Shhh@*r5ٳgimmeΝte֚TTTjQ*\pv,,//SQQAyy9### 8w/Bii)KKK{c0 \pdbccx ++ шT*eyy***ػw/`_TTT{nFFFֲR׿5F84կ~EJJ zuj!777RNAP(tuu122B !bcciii_d2RhiiappNwwrDGG300]]] hxWIII> ??_Hx{ͥKejjQәd||3gΰuVd2ٗ@WTLLLJAAAzzz2<<Amm-1>>NOOH$Z[[ztvD__*1eyy:&&&={paSrc||^"ziii<W^%33:6mDWW(JGll}IV yf&&&hhh`nn\L&1Z-o׮]#)))B3??ϵkט#..NxCdqqx穭eiiseKkk+yyyJxx8111X,뙛kjj#>>Lddd HDEEq%rrrERӃRdii{n[Nx穩affVKGGmmmDFF|2999\v-[ D0$22Tʙ3g8wHRjkk1 d|Gtff_W sαqF{=X,ɓ'ٰagΜ!&&A{{;dzzFɓ'ILLN|> /h0:tBd"))@ @SS===|>^~eILLevEDD===LLLhy^~e r.\`llt=ʆ 8ufejjj(//'.. . LOOG{{;T*VVVxh4@MM 3::*ࣣn_&55>^ϛoIII .ӧO#ɨ%99CV9{,9rAkk+444000FP`ل!EIDAT|``^~e㉍~4 >:NfggQ477344NC" oWD0tr9Brf3:K.ԩS$$$4/^! t:333 K/p8HIIarrFd2*ZZZu&磹9={,鴴~zhnnJ}Z,a绡RDӧOʦM K.k`̙3rjkk1 y^fa9;;o͎;H$3::RamZ~ڵk=\.IqqqS˅Bbbbx.g8NG^dBVs!n+?K/QXXN#>>^{(#99vo~x饗%..Kdd$f~ED9cM6vRXV Hrr2wԩS} Tq\IHH`߾}AL&&n:::H$l޼z grr2/<<6y СCtvv \< NJJ )))l޼֭[Q՜;w^/oܸ mz{{8==FC__@>_|"`0KVVPի$''k?9x<,//322G}$B#G'** \2DGGc6#55l;vg}^JRzrR) ;L&y7ٽ{7o{KؠEDDuXZZ"&&ǏqF.^__j8qp8XZZtoSNNff&^92B16ccc|xl+O ,JҥKꫯ#{QZZ ^ٯ}}}$%%+Baa!.>(,--022T*6c/[n6m& M}}=v.]Ě5kxٷö́qIL& 3! rDB `~~%^{5o|ƍAPPPPz"""ϧ|yiΟ?/}{\p" XVn7'BBB6Ep\FRRRp:l6yW7{+//200쬐`pqກLYYC* y( R)QQQl6"##儅P(H$DGG#JQ(aXXYY7OOyYYY OLL VT͛Xv-Z1$ yyy\tQ^v]P-,,~/ /ѣGپ};( xwaX8w'P*M]]?DۅēwI Bd۷o*, qݼ\|W"̯6a淿-iiiDEEDž LOO3::F!//BpC2mC뉎?)͌_&v!y$$$PWWGII }}}|[⭷ޢDP:uὮV識&9ŋinn;ǏgaaB Gee%OĹs瘚B" Jٳg111twwi&d2=== o>tuuqU&&&l `04::fիر*~pqbccy488G}D^^o=|[leqq9^~emaaa+³>{G^^*)N8!$͍'diiI ;;ώ;v|l6 īWRSSdW^'**?xw?W}@x<=zx0kǙa- 22RxСz~8!anXX 399IggaL&>uzmnٳgSSS>|+\.>Lff&eee¿n'NK%GA*2;;+(`/,,'_t?~,[bX@P066&HN>NXX.PRR‰'vn:~a zTQ(k.ưl4Fr333LMM1==Mww7CCCڵ]vMFF:N0''lrrr0| U~'(;Zb~~={o߾K,// !'^5jerrD$ j;wr)aXXX`aaK7@Dg|gffi4 (Jn*H4!}}}u`0/~ 0 G!$ xjR^^B`aa͆bvj5YYY=zy YǛP*ƍY^^faaѣG9|0)))͑OTT555wY-JdHRoikkXVS*2"""XXXW9k׮*ބ_W$''%<6?DGGc4ò&4/z4 唔4VVE&qZZZxϐl6HMM `0JbhhJKKjR^^fiiIc xC?@]](JN'?hkk#>>^04 ϓFrr2nJ%455 邷yvvVhիWaCӧOcXÚ& |aqqQP fN8+W())իb4vOиd2INN&99m۶ӧ9B3!!E(~} 㕕%yn۶M&''c6),,vK||<VKRR*hHJJBՒ ,YYYXr#9x FٌbaӦM`XgLRRIII" Øf(**`0077GJJ M^^0999( 233'33͛7 ~fbbIطop8gݤ,dgg4۷o , 2bF#PZZJDD.'X3B6%%~? ))dfggٹs'YYYdffbZa͂Cll,^ݻwngffo|jXZZbC+rQrrrشi 1JRPQ(ڵkx<ݻUAA(,,$//20 XVa/099)xYsrrHMM#<"r9&JJJ())A&ȓO>I\\ LOO ϏbATb0%22{lXL1$$$Nc~~ݻwlfbbBAVVBsss꾧V>=ԩSLMM=^!cHFB|-_gÆ lٲs˗/ɞ={/?=Ϙz9z(N??̪2YZZ?t"HXnj?ffffc׮]ޕ>*u|޽$"1::*8?fC. jjN%+++{ux% DDD* iR((ϼ7^iVVVp8Ad2jJ~$ _@Z,..R;|zv]z?H,//#oߟLtU [~7B cbb&es_D(н'_}|8E_ID߼}֝[f~;gfqoooҥK͑@uu5 h4;*3^}tt3<>~So&)))IDDDDDDvݍ\.ҥKH$fff8<111TVV e an7===nݺ}eֺP(TTTVh4Ȏ;b8qLOOs1 iiiAN>͋/Hii)6'N~z/~!ԉNLLǎjRTTh$,,LHv9G ׿5ϟgX, ,,,͡C0Bї^z\N>-F q8155FGCCG]]6mbddWReii Juߒy͹s稭%""k׮~;&_m P__Oss3Jyvٳgq\dffvT*6zFFFP(tvv܌B`rrR<333Bh288^ ARR@~樫ƨ?NSqqq 555 bZ1 D 7xrss 7xD|>/_fvvimmepp7Ba$UUUwwwS[[KXXp/XZZB&%骮bڈQ_ZMbb"ᬬpU:::LNNP(%&&Fm:LxIHH@R[[Kgg'rW"YLJ$""""""uv 9o߾۷ ZGGk׮Geqqґ~an0J޽͛7L&#>>z\N0h4r C&Q^^Nnnannr DDDP[[HRx RSSڠYXXڵkLOORr۶mCRQYYIRRH$سgZ\Nss3}}}Cxx8*Q=d``zCڊRdjjJ8{,`IaxwLMMP(׿5fbbۥ7O`XXXXU5x7  ] ?%22˗/se4 N?E:;;'O`rrJEll,vӧO  cxx+W5Cu\HR~mazV+UUU477s ~?*CCC% r|Uj,..233Cll, bbbXYY!""/RSSCUUgϞ%66JN<6_~ߏB#G Hxioo_F"311!ܿi^u~?ôԩS( tSNE ࣏>q1&&&8s rZV~/&&@ jvsU@PDDDDDDDD:in9BRR[n% xeΜ9"O?m_tKEEG$&@#GzOr \\Z8p;III|Gl뭭l޼ *** c|>~@ss3---,--\.TӧOVy衇yAٳgIIIB`qq\墸m۶!J9qw~.R@ ij(H"""SRRB0$ C1==Mgg=n:)--e˖-7W?#22@AAJS266wrrrgrra ~222xGx<͑ʖ-[jXֻ>6_5x {9VVVL7L&&&bjjA eeec4Boz8pR&''1֯_OEEddd`4IKK%L&'Od֭TVV`BN__6mbӦM$$$Ϟ={())j\3-7\pZ4k֬#G2i:uz{A_z"##nS[[Koo/]]] r͆~,;w$>>^7>>Nee% 2շ~Q v}}}tuuqEu!ORZZݻD"azwyLLLPTTBܹsBL&#""`0㹩< ?1|G={V0ಲ) "==lt:6mBsQ.\@AA?Oصk]߷KII ׮]ä AJTVV->Qܹ: ECCkHO]].\bh 111B~H}A]]6Mj믿r~IOO'** DBdd$uuuPvv6|( bcc.16ihh~_CkKK uuuhZSB_b2X,;v ERR B&P(ARQXXVet:Μ9}ZZZ!PSS#$z&77&vAoo/FpЧrrr|2.]bbb0MbrJ1qqq|>L&`^O^^F~ZMeu )J>uVǠ!6!!L<قRL&h4bZjz+xÙ!&&Gy8233Y^^f۶m䰲"xg킑U\\LLL ,rssYv-F#2rrrHHHto>rrrHIIa~~uQZZzS8DJ"33RQ՘L&MHKK#99N ֬YCLLhqݔCZZ$''ld2DRRZ@ l6識lӱ$''MNNz˾}0BX>cЃ DEEqA lܸGNNEEER$99Y(1 fqqH 18NvMZZIIIšINN&##Nff&Bxٹs' h4222p:B ezz̶m0 5kh4F233Q*~6o,rf3 Z-&$X2p;1蒅u\ߩ:sssd9djjAX,BNbyy`0ƍ)../ȃ$6 \NAUs~?N5\"feeeǃD"A*>0ɐDA\.<'wܯ`V.sN!&_PXӑH$lފ|9H$7~>B~qOvq8/dn!A |}t:[ P~qK2LȺ#d{޻>oEDDDDDDDDǷȽ.!$wJ<wmwχ^ %""""""""NbۅA>.z>+++5`~D"$L,455qYHJJns IKKYƨF#}X!#ft:9r~F#===|8@ss3~! N'|555tvvJDDTUUF__Ofdd$9z(uuuM__8FMY?iHMMrh4~Q\\|߼ŷ3Oq\={zbccoi!BYCrq?%, }}}ֆѣǣhhj5b6Z&s1<N4Їh4TVV0twwsvqGsW\]]]y}eֆt>}Z(%*]ZZfƱcX~=KKK/"\px ǏnS^^NRRr(N'>&= Dcc#hZVVV&)((7KUU@\ܜP>VfӴjbÆ whիWiiih4r9۹x"a%>>|T*\.Nϵk'<>*㗿pH:22BUU~X*++F*rv`)ٴiccc?gjj-[+HFF w\ȃ-ilڴu 1111lٲoC{{{cVJl۶ Ʋi&r9`vIbb"QQQf233㤳ePDEEQUUEkk+cccB]T6$$$%::鹩]]]:tW^y!㙙Z^ZfzzZ9Btt4biooСCk ~P^^΁eaa^_"033~;j5SSSAbbbXv-AAxw333O .,g,'AZkmզixc&M^M/U1۪5jz@XC˞wo  |v|\zwRWWGFF~󧷷SN{ٳ\~ÇD}}=ׯ_ƍX,=J[['OgV駟0LnttuuQSSCLL O'N`6ijjnƍD"$$$x8w={vD$`0@ss3466R[[CCC>}JNN$&&qFN'$''s):::8~8`49s G~ĉPTTݻ'..G}}=;w$>> nܸ7oo!Bguz gggfNVr6UQ}]>sFFFUrq1\Ejmmŋ|zP(Dmm-.nv;:to1==M$! e߿Ca٨9vvA޷ XVᠿ*E!/?M{{;7ojR]]MNN~^}}}sN233^ƈ' RPP@ee%QQQ\zuQQQzfݻweJ[o8---(je׮]l۶ ܏CkuVp:ر۷/H@Qعs'Νf1<PQQo/)**җoεkhjj{166F(BUU 6BAA.dكjexxX)))[L233IOOo^p?۷osFGGioogdd'|BQQ/B!xhmNYc˗/( n._LGG+R 'ORWWh\VDos@ar mmmܽ{N+TUpz~!6 UU1 qy~w)))l6s(//իs]Μ9C[[6m]n7n$!!OTTr ~g,ߺu FRRYYYX,{(//_p믿/rE}l޼R__Ȉ/bV+$%%/p-oؽ{\ڶm7nرc瓔\?`… 7wx믿Bz{3EQ+WF#YE.]_!BF8zevvVJTfebbBEtz)))Ν;d|_6k9͚ᠳBIISr:X,bbbhlldjj r, o& Ejj*a=0룧(5$'' (Bii)Fvv66V+333twwLii)FÁgÆ >Nnn.333477N !Bg788HBB111fC~ͦ/k_ WꃮZ%}% _-@;[^._jettxt3m׮]^299ə3gx<(k֭[y555۷o?O.B)``'|>߂}i<(zqɭ( ^WUv/yk=8y>{"~@;99>@  iOCUU}"^l9|gLU`0z*P@ ~im֞e<`0{5E" >]Y߿sgC3՛XϒH+fV!B`EQ$0::od,͂=`2HIIYՃRܵu_p8ʤ g'&BSܵ5)헅V!BZv(TWW^\Sefiz.CvwkAJTRIN^r\*`kcpp2QJNNݔx ¯sDİaÆD!udff266FJJ N󉊹O2N K2-nJZZښiii!''EX,Uy!BP(d$>Ѩ Ӿy<,˂mTql6蘶rV(ܿG"z{{&**j}ւՕ>_dnP;s_kcd-Z]1qA!bOD?c`0^\.TU}*F <꿫*D"^hd2=B!B&!, CCC8*++@`0`2 }>`psN9),,ϟ% ]}rmB!榭OMMqqzŶ]̒z8fllL/  !B!0.ZrbEp8L(ibcc IB!BH$B(`0w^yewzl{TTo`P(4o _8!B!p8LFF֛-7:f-O%vxѯXAP($B!b Z =VW|>߂"qn9 KernelShark

KernelShark


Introduction

  • Graph Info Area
  • Graph Control Area
  • The Graph Window
  • Table of Contents

  • Plot Title
  • List Area

    The Graph View

  • Zooming In
  • Zooming Out
  • Graph Markers
  • Deselecting a marker
  • Graph Plots
  • Task Plots
  • CPU Plots
  • The List View

  • Selecting an event
  • Graph follows toggle
  • Filters

  • Event Filter Dialog
  • Task Filter Dialog
  • Advanced Event Filter
  • Multiple filters
  • Sessions

    Introduction

    KernelShark is a front end reader of trace-cmd(1) output. "trace-cmd record" and "trace-cmd extract" create a trace.dat (trace-cmd.dat(5)) file. kernelshark can read this file and produce a graph and list view of its data.

    The application has two main viewing areas split by a paned divider. The top half is a graphical display of the data and the bottom half is a list view of each event. Underneath the menu bar is the graph information area:

    Graph Info Area

    The graph information line displays the timestamp of the time that the pointer is located at (or last located at when off the graph area). It then shows the information of the event that the pointer is over, which holds the same infomation of the event in the list view.

    Graph Control Area

    The line of below the graph info area holds the control buttons.

    After the buttons are the Marker buttons and information windows. See Graph Markers for more information.

    The Graph Window

    The graph is broken into two parts, the plot title section:

    Plot Title

    and the plot area:

    The plot area contains the data of the given plot, where plots can be per CPU or per task. The top of the plot area shows a timeline. The numbers in the timeline are seconds. The time in the timeline is taken from the timestamps within the trace.dat file which are architecture dependent. The time usually is the timestamp from when the system started.

    Below the graph is the list area.

    List Area

    The list area starts with the search boxes (See Searching for Events), and the Graph follows toggle button

    The Graph View

    The graph view of kernelshark shows graphical plots of the data stored in the trace.dat file. The data plots are per CPU or per task. When there are too many events within the resolution of the graph, the plots will appear as a rainbow colored bar. To make more sense out of the graphs, you need to zoom into a given location to see the details of that time frame more clearly.

    Zooming In

    There's three ways of zooming it. One is to press and hold the plus button above the graph, or you can use the mouse. By scrolling the mouse wheel up, it will zoom in. Scolling the mouse wheel down will zoom out. The thrid way is to use the left mouse button to get a more precised area.

    The left mouse method starts by click and holding the left mouse button and then dragging it to the right or left. The graph will then zoom in where the event at the start of the shaded area is the starting event in the graph view area and the event at the end of the shaded area is the last event in the graph view area.

    The area that you selected will now become the new width of the viewable area. The smaller the selection, the deeper the zoom. You can continue zooming in until you get to the details you are looking for.

    Zooming in further shows individual events and tasks that are scheduled on the CPU plots. The thick colored line on the plot represents a task is executing. The vertical lines that stick up represent individual events. When the CPU is idle (the idle task), there will will not be a thick colored line, but the idle task can still have events which are displayed.

    Zooming Out

    To zoom back out, simply press and hold the minus button, scoll the mouse wheel down, or select the double minus button which will zoom completely out and display the full trace.

    Graph Markers

    There are two markers that can be placed on the graph.

    • Marker A
    • Marker B

    The highlighted marker is the "active marker", and its button is highlighted (as "Marker A" is in the diagram below). By clicking the Marker A button (which is set by default), you can place a static marker on the graph. After clicking the Marker A button, simply double click on the graph and a nearby event to where you clicked will be highlighted by a vertical line that spans the full graph window. The timestamp of that event will display after the Marker A button in its information window.

    The list view will also select the event that was selected by the graph.

    To set Marker B, click on the Marker B button, and then double click on the event in the graph area that you want Marker B to be attached to.

    The list view will also select that event with a separate selection than from Marker A. That is, you can see two selections in the list, each representing one of the graph markers.

    When both the A and B markers are set, the graph control area will show the timestamp of where the A and B markers are, as well as the difference between the two. All timestamps are in seconds, with a resolution of 1/10 of a microsecond.

    Deselecting a marker

    You can deselect a marker by right clicking the graph or list area and select "Deselect".

    Graph Plots

    The graph data is represented by plots. The data on the plots are either CPU specific or task specific. If they are CPU specific, then the data holds the timeline of events that happened on a given CPU (which CPU is shown in the plot title area). If the plot is task specific, then the timeline of events are for the given task regardless of what CPU it was on at the time. The task name is also shown in the plot title area.

    By default, all the CPUs within the loaded trace.dat file are plotted. There are two ways to plot a task. One way is to right mouse click over an event of a displayed task in the graph or list and select the "Add [task] plot" option. The other way is to use the Plots menu.

    Task Plots

    Selecting the "Tasks" menu item will bring up a dialog with all the tasks that were found in the trace data. Clicking on the check box will toggle the selection of the given task. To select multiple tasks at once, highlight the tasks you want to select, then hit the "Enter" key. When you are satisfied with the tasks you wish to plot, hit "Apply".

    Note, in order to process the tasks, a linear search is made to find all the task's events at the creation of a task plot. This may take a bit of time on large data sets. But after the events have been found, they are stored in a data store and the processing of the graph will go back to normal speeds.

    Selecting a task in this dialog will add the task plot to the bottom of the graph area. Unselecting a task in this dialog will remove the plot.

    The CPU plots change colors as different tasks run on the CPU, and the task plots change color depending on what CPU the task is running on. This makes it easy to see how much a task bounces around the CPUs. Zooming in on a task plot also shows some more characteristics of the task.

    The hollow green bar that is shown in front of some events in the task plot represents when the task was woken up from a sleeping state to when it actually ran. The hollow red bar between some events shows that the task was preempted by another task even though that task was still runnable.

    Since the hollow green bar shows the wake up latency of the task, the A,B markers can be used to measure that time.

    The above shows that the "migrate" task with PID 28797 had a 14 microsecond wake up latency. The same can be done with the preemption latency.

    CPU Plots

    Selecting the "CPUs" plot menu item pops up a dialog that shows the available CPUs that can be plotted.

    Removing a selected CPU and hitting "Apply" will remove that CPU plot.

    The List View

    The list view is in the bottom half paned window and can be expanded or shortened with the paned handle.

    The top of the list view contains the list area which has the list search and "graph follows" toggle button.

    The columns of the list are:

    • # - the position of the event in the full data set.
    • CPU - the CPU that the event occurred on.
    • Time Stamp - The timestamp of the event. This is in seconds with 1/10th microsecond resolution.
    • Task - The name of the process that was running when the event occurred.
    • PID - The process ID of the task that was running when the event occurred.
    • Latency - The latency is broken into 4 fields:
      1. Interrupts disabled - 'd' if interrupts are disabled, otherwise '.'
      2. Need reschedule - 'N' if the kernel was notified that a schedule is needed, otherwise '.'
      3. In IRQ - 'h' if in a hard IRQ (hardware triggered), 's' if in a soft IRQ (context where the kernel initiated a the IRQ handler) or if soft IRQs are disabled, 'H' if in a hard IRQ and soft IRQs are disabled or the hard IRQ triggered while processing a soft IRQ, otherwise '.'
      4. Preemption counter - The index of the preemption counter. If it is other than zero, then the kernel will not preempt the running tasks, even if a schedule has been requested by some event. If the counter is zero, then '.' is shown.

      Note: These may be different depending on the kernel the trace.dat file came from.

    • Event - The name of the event.
    • Info - The data output of a particular event.

    The list search can find an event based on the contents in a row. Select a column, a match criteria and the content to match to find the next row that matches the search. The match criterion is one of the following:

    • contains - the row cell of the selected column contains the match data. This works with numbers as well.
    • full match - the row cell of the selected column matches exactly the match data.
    • does not have - the row cell of the selected column does not contain the match data.

    The search will find the next event that has the matching data within the column.

    Selecting an event

    A single click on a row will select that row. If the Graph follows button is selected (which it is by default), the selected marker will move to the event matching that row. If the Graph follows is not selected, then the graph will not change.

    Graph follows toggle

    When the "graph follows" toggle is set, then selecting a row in the list view will cause the graph to move the active marker (either A or B) to the event that corresponds to the event in the selected row. With the mouse focus on the list, using the keyboard up and down arrow keys will move the selection of the list as well as the graph cursor.

    Notice that there is a small square dot on the event within the marker that shows where the event is in the Graph that is selected in the List view.

    Filters

    The amount of data that can be stored in a trace.dat file can be enormous. To make any sense out of some traces, it may be required to only display various events. The same can be true about tasks. Kernelshark has filters for tasks as well as for events.

    The Filter menu on the toolbar consists of:

    • Import Filter: import a file that holds a saved exported filter
    • Export Filter: save the filter to a file, that can be imported at a later time
    • Apply filters to Graph: When checked, have the filters affect the Graph area
    • Apply filters to List: When checked, have the filters affect the List area
    • Show events: Display the event filter dialog
    • Show tasks: Display the task filter dialog
    • Show CPUs: Display the CPU filter dialog
    • Advanced Filtering: Display the Avanced Filtering dialog
    • Clear all filters: Remove all filters

    On start up of KernelShark, the filters, by default, will be applied to both the Graph and List areas. You can modify this by selecting the "Filter" menu from the tool bark and uncheck the checkboxes next to "Apply filters to Graph" or "Apply filters to List". This will not affect the filters themselves, but will affect if the filters are applied to the Graph or List areas.

    Event Filter Dialog

    The vertial lines that stick up from the task and CPU plots represent events. These can be filtered via the Event Filter dialog.

    Selecting the all checkbox will select all events and nothing will be filtered. Deselecting the all checkbox will deselect all events. The same is with the system checkboxes (the top level ones). Expanding the system tree will show the individual events in the system, which can be selected.

    Task Filter Dialog

    If only a subset of the tasks are of interest in either the Graph or List view, then they can also be filtered. Select the Show tasks menu option the Filter menu of the toolbar and the Task Filter dialog will pop up.

    This will "hide" all other tasks except for what was selected in the dialog. Again, the all checkbox will select all tasks if selected, and will unselect all tasks when it is unselected.

    Advanced Event Filter

    Filtering on events may not be enough. The ability to filter on the content of individual events may be needed. In order to accomplish this, the advanced event filtering is used. Selecting Advance Filtering from the Filter menu will pop up the advanced event filtering dialog.

    Selecting Show Help displays the syntext of the filter format, and the helper buttons can be used to find events and their corresponding fields.

    Spaces are ignored. The example used in the dialog figure:

      sched/sched_switch : next_prio < 100 && (prev_prio > 100 && prev_pid != 0)
    

    The sched/ is not necessary because without it, the filter will process all events named sched_switch, and since there is only one event that has that name, including the sched/ is redundant.

    The next_prio, prev_prio and prev_pid are all event fields of the sched_swich event.

    If just sched was used and the /sched_switch was omitted, it would still be a valid filter, but it would behave differently. By just specifying a system, the filter will run on all events within that system. When a field is encountered that does not belong to an event, then that compare will be set to false.

       sched : prev_pid != 0
       sched : !(prev_pid == 0)
    

    The above two filters are not equivalent. They are for the sched_switch event, but not for the other events. The first filter will return false for all events that do not contain the prev_pid field, but the second filter would return true for all events that do not contain that field. Again, if the event does not contain a field, just that compare will be evaluated to false, not the entire expression. This means for events that do not have the prev_pid field, the above filters would be equivalent to:

       sched : FALSE
       sched : !(FALSE)
    

    Letting filters contain fields that do not belong to an event be valid allows for various tricks where two events can share the same filter.

       sched_switch, sched_wake.* : next_pid == 1 || pid == 1
    

    The schedule events that have next_pid and not pid as a field will just compare the first part of the || and those events with pid but without next_pid will be compared against the second part of the ||

    Notice that event names in the filter can be regular expressions.

    String fields can have regular expressions used in their comparing if =~ or !~ are used.

       sched_switch : next_comm =~ "^events/[23]$"
    

    The available regular expressions are described in regex(7).

    To remove an advanced filter, you can select the Clear all filters from the Filter toolbar menu. Or select Advance Filtering again and it will show all the current filters.

    Selecting the Delete checkbox and hitting Apply will cause the selected advance filter to be removed.

    Multiple filters

    Multiple advance filters will act as a union. That is, if any advance filter matches an event, then that event is kept in the events to display. But the simple filters (events, tasks, or CPUs) are then applied against them. For example, to display all ext4 events as well as the advanced filter of "sched_switch: next_prio <. 100 &.&. (prev_prio >. 100 &.&. prev_pid != 0)", selecting ext4 from the Filter->Show events that selects ext4 events, will not show any event. That's because no event will satisfy both being in the ext4 system and the sched. To handle both, you need to add "ext4" as an advance filter, and then both will be applied.

    Note, when adding just a event system (i.e. ext4), all the events are added individually.

    Sessions

    The state of KernelShark can be saved and restored via sessions. When exiting KernelShark normally (hitting the "x" or selecting Exit), the state that KernelShark was last in will be saved to disk. You can retrieve this last state by selecting from the toolbar File->Session->Restore Last Session. This will return you to the state that you were in when you last exited KernelShark. That is, the current zoom position, with Marker A and Marker B at their previous location, as well as any filters applied as they were when you last quit.

    You may also save the current state at any time by selecting File->Session->Export Session and retrieve it at a later time with File->Session->Import Session kernel-shark-kernelshark-v2.4.0/Documentation/Makefile000066400000000000000000000052631477354127100230720ustar00rootroot00000000000000 obj := $(kshark-dir)/Documentation src := $(kshark-dir)/Documentation ifeq ($(VERBOSE),1) Q = print_asciidoc = print_xsltproc = print_install = hide_xsltproc_output = else Q = @ print_asciidoc = echo ' ASCIIDOC '`basename $@`; print_xsltproc = echo ' XSLTPROC '`basename $@`; print_install = echo ' INSTALL '`basename $1`' to $(DESTDIR_SQ)'$2; hide_xsltproc_output = 2> /dev/null endif define manpage.xsl if [ -z ${MANPAGE_DOCBOOK_XSL} ]; then \ echo "*********************************"; \ echo "** No docbook.xsl is installed **"; \ echo "** Can't make man pages **"; \ echo "*********************************"; \ exit 1; \ fi endef do_asciidoc_build = \ ($(print_asciidoc) \ asciidoc -d manpage -b docbook -o $@ $<) do_xsltproc_build = \ ($(print_xsltproc) \ xsltproc --nonet -o $@ ${MANPAGE_DOCBOOK_XSL} $< $(hide_xsltproc_output)) # # asciidoc requires a synopsis, but file format man pages (5) do # not require them. This removes it from the file in the final step. define remove_synopsis (sed -e '/^\.SH "SYNOPSIS"/,/ignore/d' $1 > $1.tmp;\ mv $1.tmp $1) endef # # Most likely a docbook.xsl is already installed on the users system # instead of creating a new wheel, lets reuse what's already there. # FIND_MANPAGE_DOCBOOK_XSL := $(shell find /usr -name docbook.xsl 2>/dev/null | grep manpages | head -1) MANPAGE_DOCBOOK_XSL ?= ${FIND_MANPAGE_DOCBOOK_XSL} $(obj)/%.xsl: $(src)/%.txt $(Q)mkdir -p $(obj) $(Q)$(do_asciidoc_build) $(obj)/%.1: $(obj)/%.1.xsl @$(call manpage.xsl) $(Q)$(do_xsltproc_build) TEXT1 = $(wildcard *.1.txt) MAN1 = $(patsubst %.1.txt,$(obj)/%.1, ${TEXT1}) all: $(MAN1) # Need to find out how to export a macro instead of # copying this from the main Makefile. define do_install_data $(print_install) \ if [ ! -d '$(DESTDIR_SQ)$2' ]; then \ $(INSTALL) -d -m 755 '$(DESTDIR_SQ)$2'; \ fi; \ $(INSTALL) -m 644 $1 '$(DESTDIR_SQ)$2' endef MAN1_INSTALL = $(MAN1:%.1=%.1.install) $(MAN1_INSTALL): %.1.install : %.1 force $(Q)$(call do_install_data,$<,$(man_dir_SQ)/man1) html_dir = $(src)/HTML image_dir = $(html_dir)/images HTML = $(wildcard $(html_dir)/*.html) IMGS = $(wildcard $(image_dir)/*.png) HTML_INSTALL = $(subst .html,.html.install,$(HTML)) IMGS_INSTALL = $(subst .png,.png.install,$(IMGS)) $(HTML_INSTALL): %.html.install : %.html force $(Q)$(call do_install_data,$<,'$(html_install_SQ)') $(IMGS_INSTALL): %.png.install : %.png force $(Q)$(call do_install_data,$<,'$(img_install_SQ)') GUI_INSTALL = $(HTML_INSTALL) $(IMGS_INSTALL) install: $(MAN1_INSTALL) $(GUI_INSTALL) clean: (cd $(obj); \ $(RM) *.xml *.xsl *.1) .PHONE: force force: kernel-shark-kernelshark-v2.4.0/Documentation/doxygen/000077500000000000000000000000001477354127100231015ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/Documentation/doxygen/dox_config000066400000000000000000000012311477354127100251400ustar00rootroot00000000000000# For detailed description of all Doxygen Configuration Parameters see: # http://www.doxygen.org/manual/config.html DOXYFILE_ENCODING = UTF-8 PROJECT_NAME = "KernelShark" PROJECT_BRIEF = "Kernel Shark is a front-end reader of the Linux kernel tracing data." INPUT = ../../src/ ../../src/plugins/ SOURCE_BROWSER = YES QT_AUTOBRIEF = YES TAB_SIZE = 8 OPTIMIZE_OUTPUT_FOR_C = YES CASE_SENSE_NAMES = YES SORT_MEMBER_DOCS = NO STRICT_PROTO_MATCHING = YES DOT_MULTI_TARGETS = YES PROJECT_LOGO = ../../icons/KS_logo_stacked.svg EXCLUDE = ../../src/stb_truetype.h kernel-shark-kernelshark-v2.4.0/Documentation/kernelshark.1.txt000066400000000000000000000015341477354127100246400ustar00rootroot00000000000000KERNELSHARK(1) ============== NAME ---- kernelshark - graphical reader for trace-cmd(1) output SYNOPSIS -------- *kernelshark* ['OPTIONS'] DESCRIPTION ----------- KernelShark is a front end reader of trace-cmd(1) output. It reads a trace-cmd.dat(5) formatted file and produces a graph and list view of the data. OPTIONS ------- *-h*:: Display the help text. *-v*:: Display the kernelshark version and exit. *-i* 'input-file':: Read trace data from the file 'input-file'. By default input is read from 'trace.dat'. SEE ALSO -------- trace-cmd(1) AUTHOR ------ Written by Steven Rostedt, RESOURCES --------- git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/trace-cmd.git COPYING ------- Copyright \(C) 2010 Red Hat, Inc. Free use of this software is granted under the terms of the GNU Public License (GPL). kernel-shark-kernelshark-v2.4.0/LICENSES/000077500000000000000000000000001477354127100200205ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/LICENSES/GPL-2.0000066400000000000000000000444511477354127100206720ustar00rootroot00000000000000Valid-License-Identifier: GPL-2.0 Valid-License-Identifier: GPL-2.0-only Valid-License-Identifier: GPL-2.0+ Valid-License-Identifier: GPL-2.0-or-later SPDX-URL: https://spdx.org/licenses/GPL-2.0.html Usage-Guide: To use this license in source code, put one of the following SPDX tag/value pairs into a comment according to the placement guidelines in the licensing rules documentation. For 'GNU General Public License (GPL) version 2 only' use: SPDX-License-Identifier: GPL-2.0 or SPDX-License-Identifier: GPL-2.0-only For 'GNU General Public License (GPL) version 2 or any later version' use: SPDX-License-Identifier: GPL-2.0+ or SPDX-License-Identifier: GPL-2.0-or-later License-Text: GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. kernel-shark-kernelshark-v2.4.0/LICENSES/LGPL-2.1000066400000000000000000000654251477354127100210130ustar00rootroot00000000000000Valid-License-Identifier: LGPL-2.1 Valid-License-Identifier: LGPL-2.1+ SPDX-URL: https://spdx.org/licenses/LGPL-2.1.html Usage-Guide: To use this license in source code, put one of the following SPDX tag/value pairs into a comment according to the placement guidelines in the licensing rules documentation. For 'GNU Lesser General Public License (LGPL) version 2.1 only' use: SPDX-License-Identifier: LGPL-2.1 For 'GNU Lesser General Public License (LGPL) version 2.1 or any later version' use: SPDX-License-Identifier: LGPL-2.1+ License-Text: GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. 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 not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the 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 specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Libraries If you develop a new library, and you want it to be of the greatest possible use to the public, we recommend making it free software that everyone can redistribute and change. You can do so by permitting redistribution under these terms (or, alternatively, under the terms of the ordinary General Public License). To apply these terms, attach the following notices to the library. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. one line to give the library's name and an idea of what it does. Copyright (C) year name of author This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the library, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the library `Frob' (a library for tweaking knobs) written by James Random Hacker. signature of Ty Coon, 1 April 1990 Ty Coon, President of Vice That's all there is to it! kernel-shark-kernelshark-v2.4.0/README000066400000000000000000000116021477354127100174730ustar00rootroot00000000000000 KernelShark is a front-end reader of tracing data. The official repository is here: https://git.kernel.org/pub/scm/utils/trace-cmd/kernel-shark.git Third Party Software: ------------------------------------------------------------ KernelShark has the following external dependencies: Cmake, Json-C, OpenGL/Glut, Qt6Base, libtraceevent, libtracefs, trace-cmd and FreeSans font. 1. In order to install the packages on Ubuntu do the following: sudo apt-get install build-essential git cmake libjson-c-dev -y sudo apt-get install freeglut3-dev libxmu-dev libxi-dev -y sudo apt-get install flex bison -y sudo apt-get install fonts-freefont-ttf -y sudo apt-get install qt6-base-dev qt6-scxml-dev -y sudo apt-get install libtraceevent-dev libtracefs-dev libtracecmd-dev trace-cmd -y 1.1 If you want to be able to generate Doxygen documentation: sudo apt-get install graphviz doxygen-gui -y 2. In order to install the packages on Fedora, as root do the following: sudo dnf install gcc gcc-c++ git cmake json-c-devel -y sudo dnf install freeglut-devel redhat-rpm-config -y sudo dnf install flex bison -y sudo dnf install gnu-free-sans-fonts -y sudo dnf install qt6-qtbase-devel qt6-qtscxml-devel -y sudo dnf install libtraceevent-devel libtracefs-devel libtracecmd-devel trace-cmd -y 2.1 If you want to be able to generate Doxygen documentation: sudo dnf install graphviz doxygen -y Building: ------------------------------------------------------------ 1. Building and install KernelShark GUI: cd kernel-shark/build cmake ../ make sudo ./install_gui.sh 1.1 In order to create a Doxygen documentation add -D_DOXYGEN_DOC=1 as a CMake Command-Line option (see the example below). 1.2 KernelShark has multiple build types. By default, the build type is RelWithDebInfo, which will build a release candidate with debug information. To change the type, pass in the option CMAKE_BUILD_TYPE= (see the example below). cmake -DCMAKE_BUILD_TYPE=Debug - for "-g" option cmake -DCMAKE_BUILD_TYPE=Release - for "-O3" option cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo - for "-g -O2" option (default) cmake -DCMAKE_BUILD_TYPE=MinSizeRel - for "-Os" option 1.3 In addition to the standard CMake build types (Debug, Release, RelWithDebInfo, MinSizeRel) KernelShark supports a "Package" build type. By default this build type adds the "-O3" compiler flag. Package maintainers can chose their own compiler flags by providing the corresponding CMAKE_XXXX_FLAGS_PACKAGE Command-Line options (see the example below). -- Note that when built as a "Package" the RPATH-s of the executables are set directly to _INSTALL_PREFIX/lib/kernelshark/ 1.4 After building the code "kernel-shark/lib" will contain all libraries and "kernel-shark/bin" will contain all executables. 1.5 Use the script "cmake_clean.sh" if you want to delete all already compiled objects and all files generated by CMake. cd kernel-shark/build ./cmake_clean.sh 1.6 By default, installation prefix is "/usr/local". It can be changed using -D_INSTALL_PREFIX= as a CMake Command-Line option (see the example below). 2. To install libkshark-devel do: sudo ./install_libkshark-devel.sh This will install all components needed in order to use "libkshark". Note that if you just use: sudo make install this will install both the GUI and libkshark-devel. 3. In order to uninstall KernelShark (no matter what has been installed) do: cd kernel-shark/build ./cmake_uninstall.sh CMake examples: cmake -D_DOXYGEN_DOC=1 -D_INSTALL_PREFIX=/usr ../ cmake -DCMAKE_BUILD_TYPE=Package -DCMAKE_C_FLAGS_PACKAGE="-O3 -pedantic" ../ External plugins: ------------------------------------------------------------ KernelShark also supports stand-alone plugin except for build-in. There is a real example under https://source.denx.de/Xenomai/xenomai/-/tree/next/tracing/kernelshark/, which is to visualize out-of-band state of realtime task with hollow cobalt blue box mainly when there is cobalt context switches in Xenomai. As its implemention mainly refers to build-in plugin-sched_events, it shares common plugin features such as clickable shapes. Contributions: ------------------------------------------------------------ 3. For questions about the use of the library, please send email to: linux-trace-users@vger.kernel.org Subscribe: http://vger.kernel.org/vger-lists.html#linux-trace-users Archives: https://lore.kernel.org/linux-trace-users/ 3.1 For contributions to development, please send patches to: linux-trace-devel@vger.kernel.org Subscribe: http://vger.kernel.org/vger-lists.html#linux-trace-devel Archives: https://lore.kernel.org/linux-trace-devel/ 3.2 Note, this project follows the style of submitting patches as described by the Linux kernel. https://www.kernel.org/doc/html/v5.4/process/submitting-patches.html kernel-shark-kernelshark-v2.4.0/bin/000077500000000000000000000000001477354127100173635ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/bin/kshark-su-record000077500000000000000000000001361477354127100224750ustar00rootroot00000000000000#!/bin/bash xhost +si:localuser:root &>/dev/null pkexec kshark-record -o "${PWD}/trace.dat" kernel-shark-kernelshark-v2.4.0/build/000077500000000000000000000000001477354127100177125ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/build/FindJSONC.cmake000066400000000000000000000042511477354127100223730ustar00rootroot00000000000000 #[=======================================================================[.rst: FindJSONC ------- Finds the traceevent library. Imported Targets ^^^^^^^^^^^^^^^^ This module defines the :prop_tgt:`IMPORTED` targets: ``jsonc::jsonc`` Defined if the system has json-c. Result Variables ^^^^^^^^^^^^^^^^ ``JSONC_FOUND`` True if the system has the json-c library. ``JSONC_VERSION`` The version of the json-c library which was found. ``JSONC_INCLUDE_DIRS`` Include directories needed to use json-c. ``JSONC_LIBRARIES`` Libraries needed to link to json-c. Cache Variables ^^^^^^^^^^^^^^^ ``JSONC_INCLUDE_DIR`` The directory containing ``json.h``. ``JSONC_LIBRARY`` The path to the traceevent library. #]=======================================================================] find_package(PkgConfig QUIET) pkg_check_modules(PC_JSONC QUIET json-c) set(JSONC_VERSION ${PC_JSONC_VERSION}) set(JSONC_DEFINITIONS ${PC_JSONC_CFLAGS_OTHER}) find_path(JSONC_INCLUDE_DIR json.h HINTS ${PC_JSONC_INCLUDEDIR} ${PC_JSONC_INCLUDE_DIRS} PATH_SUFFIXES json-c) find_library(JSONC_LIBRARY NAMES json-c libjson-c HINTS ${PC_JSONC_LIBDIR} ${PC_JSONC_LIBRARY_DIRS}) find_library(JSONC_LIBRARY NAMES json-c libjson-c HINTS ${PC_JSON-C_LIBDIR} ${PC_JSON-C_LIBRARY_DIRS}) mark_as_advanced(JSONC_INCLUDE_DIR JSONC_LIBRARY) include(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set JSONC_FOUND to TRUE # if all listed variables are TRUE find_package_handle_standard_args(JSONC DEFAULT_MSG JSONC_LIBRARY JSONC_INCLUDE_DIR) if(JSONC_FOUND) set(JSONC_LIBRARIES ${JSONC_LIBRARY}) set(JSONC_INCLUDE_DIRS ${JSONC_INCLUDE_DIR}) if(NOT TARGET jsonc::jsonc) add_library(jsonc::jsonc UNKNOWN IMPORTED) set_target_properties(jsonc::jsonc PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${JSONC_INCLUDE_DIRS}" INTERFACE_COMPILE_DEFINITIONS "${JSONC_DEFINITIONS}" IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION "${JSONC_LIBRARIES}") endif() endif() kernel-shark-kernelshark-v2.4.0/build/FindTraceCmd.cmake000066400000000000000000000043661477354127100232100ustar00rootroot00000000000000# SPDX-License-Identifier: LGPL-2.1 #[=======================================================================[.rst: FindTraceCmd ------- Finds the tracecmd library. Imported Targets ^^^^^^^^^^^^^^^^ This module defines the :prop_tgt:`IMPORTED` targets: ``trace::cmd`` Defined if the system has libtracecmd. Result Variables ^^^^^^^^^^^^^^^^ ``TraceCmd_FOUND`` True if the system has the libtracecmd library. ``TraceCmd_VERSION`` The version of the libtracecmd library which was found. ``TraceCmd_INCLUDE_DIRS`` Include directories needed to use libtracecmd. ``TraceCmd_LIBRARIES`` Libraries needed to link to libtracecmd. Cache Variables ^^^^^^^^^^^^^^^ ``TraceCmd_INCLUDE_DIR`` The directory containing ``trace-cmd.h``. ``TraceCmd_LIBRARY`` The path to the tracecmd library. #]=======================================================================] find_package(PkgConfig QUIET) pkg_check_modules(PC_TraceCmd QUIET libtracecmd) set(TraceCmd_VERSION ${PC_TraceCmd_VERSION}) set(TraceCmd_DEFINITIONS ${PC_TraceCmd_CFLAGS_OTHER}) find_path(TraceCmd_INCLUDE_DIR NAMES trace-cmd.h HINTS ${PC_TraceCmd_INCLUDE_DIRS} ${PC_TraceCmd_INCLUDEDIR}) find_library(TraceCmd_LIBRARY NAMES tracecmd libtracecmd HINTS ${PC_TraceCmd_LIBDIR} ${PC_TraceCmdLIBRARY_DIRS}) mark_as_advanced(TraceCmd_INCLUDE_DIR TraceCmd_LIBRARY) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(TraceCmd DEFAULT_MSG TraceCmd_LIBRARY TraceCmd_INCLUDE_DIR) if(TraceCmd_FOUND) set(TraceCmd_LIBRARIES ${TraceCmd_LIBRARY}) set(TraceCmd_INCLUDE_DIRS ${TraceCmd_INCLUDE_DIR}) if(NOT TARGET trace::cmd) add_library(trace::cmd UNKNOWN IMPORTED) set_target_properties(trace::cmd PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${TraceCmd_INCLUDE_DIRS}" INTERFACE_COMPILE_DEFINITIONS "${TraceCmd_DEFINITIONS}" IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION "${TraceCmd_LIBRARIES}") endif() endif() find_program(TRACECMD_EXECUTABLE NAMES trace-cmd) kernel-shark-kernelshark-v2.4.0/build/FindTraceEvent.cmake000066400000000000000000000044571477354127100235670ustar00rootroot00000000000000# SPDX-License-Identifier: LGPL-2.1 #[=======================================================================[.rst: FindTraceevent ------- Finds the traceevent library. Imported Targets ^^^^^^^^^^^^^^^^ This module defines the :prop_tgt:`IMPORTED` targets: ``trace::event`` Defined if the system has libtraceevent. Result Variables ^^^^^^^^^^^^^^^^ ``TraceEvent_FOUND`` True if the system has the libtraceevent library. ``TraceEvent_VERSION`` The version of the libtraceevent library which was found. ``TraceEvent_INCLUDE_DIRS`` Include directories needed to use libtraceevent. ``TraceEvent_LIBRARIES`` Libraries needed to link to libtraceevent. Cache Variables ^^^^^^^^^^^^^^^ ``TraceEvent_INCLUDE_DIR`` The directory containing ``event-parse.h``. ``TraceEvent_LIBRARY`` The path to the traceevent library. #]=======================================================================] find_package(PkgConfig QUIET) pkg_check_modules(PC_TraceEvent QUIET libtraceevent) set(TraceEvent_VERSION ${PC_TraceEvent_VERSION}) set(TraceEvent_DEFINITIONS ${PC_TraceEvent_CFLAGS_OTHER}) find_path(TraceEvent_INCLUDE_DIR NAMES event-parse.h HINTS ${PC_TraceEvent_INCLUDE_DIRS} ${PC_TraceEvent_INCLUDEDIR}) find_library(TraceEvent_LIBRARY NAMES traceevent libtraceevent HINTS ${PC_TraceEvent_LIBDIR} ${PC_TraceEventLIBRARY_DIRS}) mark_as_advanced(TraceEvent_INCLUDE_DIR TraceEvent_LIBRARY) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(TraceEvent DEFAULT_MSG TraceEvent_LIBRARY TraceEvent_INCLUDE_DIR) if(TraceEvent_FOUND) set(TraceEvent_LIBRARIES ${TraceEvent_LIBRARY}) set(TraceEvent_INCLUDE_DIRS ${TraceEvent_INCLUDE_DIR}) if(NOT TARGET trace::event) add_library(trace::event UNKNOWN IMPORTED) set_target_properties(trace::event PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${TraceEvent_INCLUDE_DIRS}" INTERFACE_COMPILE_DEFINITIONS "${TraceEvent_DEFINITIONS}" IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION "${TraceEvent_LIBRARIES}") endif() endif() kernel-shark-kernelshark-v2.4.0/build/FindTraceFS.cmake000066400000000000000000000042241477354127100230060ustar00rootroot00000000000000# SPDX-License-Identifier: LGPL-2.1 #[=======================================================================[.rst: FindTraceFS ------- Finds the tracefs library. Imported Targets ^^^^^^^^^^^^^^^^ This module defines the :prop_tgt:`IMPORTED` targets: ``trace::fs`` Defined if the system has libtracefs. Result Variables ^^^^^^^^^^^^^^^^ ``TraceFS_FOUND`` True if the system has the libtracefs library. ``TraceFS_VERSION`` The version of the libtracefs library which was found. ``TraceFS_INCLUDE_DIRS`` Include directories needed to use libtracefs. ``TraceFS_LIBRARIES`` Libraries needed to link to libtracefs. Cache Variables ^^^^^^^^^^^^^^^ ``TraceFS_INCLUDE_DIR`` The directory containing ``tracefs.h``. ``TraceFS_LIBRARY`` The path to the tracefs library. #]=======================================================================] find_package(PkgConfig QUIET) pkg_check_modules(PC_TraceFS QUIET libtracefs) set(TraceFS_VERSION ${PC_TraceFS_VERSION}) set(TraceFS_DEFINITIONS ${PC_TraceFS_CFLAGS_OTHER}) find_path(TraceFS_INCLUDE_DIR NAMES tracefs.h HINTS ${PC_TraceFS_INCLUDE_DIRS} ${PC_TraceFS_INCLUDEDIR}) find_library(TraceFS_LIBRARY NAMES tracefs libtracefs HINTS ${PC_TraceFS_LIBDIR} ${PC_TraceFSLIBRARY_DIRS}) mark_as_advanced(TraceFS_INCLUDE_DIR TraceFS_LIBRARY) include(FindPackageHandleStandardArgs) find_package_handle_standard_args(TraceFS DEFAULT_MSG TraceFS_LIBRARY TraceFS_INCLUDE_DIR) if(TraceFS_FOUND) set(TraceFS_LIBRARIES ${TraceFS_LIBRARY}) set(TraceFS_INCLUDE_DIRS ${TraceFS_INCLUDE_DIR}) if(NOT TARGET trace::fs) add_library(trace::fs UNKNOWN IMPORTED) set_target_properties(trace::fs PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${TraceFS_INCLUDE_DIRS}" INTERFACE_COMPILE_DEFINITIONS "${TraceFS_DEFINITIONS}" IMPORTED_LINK_INTERFACE_LANGUAGES "C" IMPORTED_LOCATION "${TraceFS_LIBRARIES}") endif() endif() kernel-shark-kernelshark-v2.4.0/build/cmake_clean.sh000077500000000000000000000006401477354127100224730ustar00rootroot00000000000000make clean rm CMakeCache.txt rm cmake_install.cmake rm Makefile rm -f CTestTestfile.cmake rm -f DartConfiguration.tcl rm -rf CMakeFiles/ rm -rf src/ rm -rf examples/ rm -rf tests/ rm -rf Testing/ rm -f ../tests/*.dat rm -f ../lib/* rm ../kernelshark.desktop rm ../libkshark.pc rm ../org.freedesktop.kshark-record.policy rm -f ../src/KsCmakeDef.hpp rm -f CMakeDoxyfile.in rm -f CMakeDoxygenDefaults.cmake rm -rf .qt/ kernel-shark-kernelshark-v2.4.0/build/cmake_uninstall.sh000077500000000000000000000007401477354127100234230ustar00rootroot00000000000000#!/bin/bash CYAN='\e[36m' PURPLE='\e[35m' NC='\e[0m' # No Color uninstall () { NAME=$1 NAME=${NAME##*_} NAME=${NAME%.*} NAME=${NAME/manifest/the project} if [ -e $1 ] then echo -e "${CYAN}Uninstall " $NAME"...${NC}" xargs rm -v < $1 rm -f $1 fi } if [[ $EUID -ne 0 ]]; then echo -e "${PURPLE}Permission denied${NC}" 1>&2 exit 100 fi for manifest in "$search_dir"${PWD}/install_manifest* do uninstall $manifest done kernel-shark-kernelshark-v2.4.0/build/deff.h.cmake000066400000000000000000000020551477354127100220500ustar00rootroot00000000000000 /** * \file KsCmakeDef.hpp * \brief This File is generated by CMAKE */ /* ! -- Do Not Hand Edit - This File is generated by CMAKE -- ! */ #ifndef _KS_CONFIG_H #define _KS_CONFIG_H /** KernelShark Version number. */ #cmakedefine KS_VERSION_STRING "@KS_VERSION_STRING@" /** KernelShark Application name. */ #cmakedefine KS_APP_NAME "@KS_APP_NAME@" /** KernelShark installation prefix path. */ #cmakedefine _INSTALL_PREFIX "@_INSTALL_PREFIX@" /** KernelShark plugins installation prefix path. */ #cmakedefine KS_PLUGIN_INSTALL_PREFIX "@KS_PLUGIN_INSTALL_PREFIX@" /** Location of the trace-cmd executable. */ #cmakedefine TRACECMD_EXECUTABLE "@TRACECMD_EXECUTABLE@" /** "pkexec" executable. */ #cmakedefine DO_AS_ROOT "@DO_AS_ROOT@" /** GLUT has been found. */ #cmakedefine GLUT_FOUND /** Truetype font file. */ #cmakedefine TT_FONT_FILE "@TT_FONT_FILE@" /** Location of the KernelShark tests. */ #cmakedefine KS_TEST_DIR "@KS_TEST_DIR@" /** Semicolon-separated list of plugin names. */ #define KS_BUILTIN_PLUGINS "@PLUGINS@" #endif // _KS_CONFIG_H kernel-shark-kernelshark-v2.4.0/build/install_gui.sh000077500000000000000000000003661477354127100225700ustar00rootroot00000000000000if cmake -DCOMPONENT=kernelshark -P cmake_install.cmake; then echo "Kernelshark installed correctly" else exit 1 fi if ! cmake -DCOMPONENT=polkit-policy -P cmake_install.cmake; then echo >&2 "Warning: polkit policy not installed" fi kernel-shark-kernelshark-v2.4.0/build/install_libkshark-devel.sh000077500000000000000000000002101477354127100250370ustar00rootroot00000000000000if cmake -DCOMPONENT=libkshark-devel -P cmake_install.cmake; then echo "libkshark-devel installed correctly" else exit 1 fi kernel-shark-kernelshark-v2.4.0/build/ks.desktop.cmake000066400000000000000000000003471477354127100230050ustar00rootroot00000000000000[Desktop Entry] Version=1.5 Type=Application Name=Kernel Shark GenericName=Kernel Shark Comment= Exec=@_INSTALL_PREFIX@/bin/@KS_APP_NAME@ Icon=@_INSTALL_PREFIX@/share/icons/@KS_APP_NAME@/@KS_ICON@ Categories=System; Terminal=false kernel-shark-kernelshark-v2.4.0/build/libkshark.pc.cmake000066400000000000000000000005551477354127100232740ustar00rootroot00000000000000prefix=@_INSTALL_PREFIX@ libdir=@_LIBDIR@ includedir=${prefix}/include/@KS_APP_NAME@ Name: libkshark URL: https://git.kernel.org/pub/scm/utils/trace-cmd/kernel-shark.git/ Description: Library for accessing ftrace file system Version: @KS_VERSION_STRING@ Requires: json-c, libtracecmd >= @LIBTRACECMD_MIN_VERSION@ Cflags: -I${includedir} Libs: -L${libdir} -lkshark kernel-shark-kernelshark-v2.4.0/build/org.freedesktop.kshark-record.policy.cmake000066400000000000000000000013551477354127100300550ustar00rootroot00000000000000 Authentication is required to run KernelShark Record auth_admin auth_admin auth_admin @_INSTALL_PREFIX@/bin/kshark-record true kernel-shark-kernelshark-v2.4.0/examples/000077500000000000000000000000001477354127100204315ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/examples/CMakeLists.txt000066400000000000000000000021431477354127100231710ustar00rootroot00000000000000message("\n examples ...") message(STATUS "dataload") add_executable(dload dataload.c) target_link_libraries(dload kshark) message(STATUS "datafilter") add_executable(dfilter datafilter.c) target_link_libraries(dfilter kshark) message(STATUS "multibufferload") add_executable(mbload multibufferload.c) target_link_libraries(mbload kshark) message(STATUS "datahisto") add_executable(dhisto datahisto.c) target_link_libraries(dhisto kshark) message(STATUS "confogio") add_executable(confio configio.c) target_link_libraries(confio kshark) if (OPENGL_FOUND AND GLUT_FOUND) message(STATUS "dataplot") add_executable(dplot dataplot.cpp) target_link_libraries(dplot kshark-plot) endif (OPENGL_FOUND AND GLUT_FOUND) if (Qt6Widgets_FOUND AND TT_FONT_FILE) message(STATUS "widgetdemo") add_executable(widgetdemo widgetdemo.cpp) target_link_libraries(widgetdemo kshark-gui) message(STATUS "cmd_split") add_executable(cmd_split cmd_split.cpp) target_link_libraries(cmd_split kshark-gui) endif () kernel-shark-kernelshark-v2.4.0/examples/cmd_split.cpp000066400000000000000000000020041477354127100231070ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) */ // C++ #include using namespace std; // Qt #include // KernelShark #include "KsUtils.hpp" int main(int argc, char **argv) { QString text = "echo \"I want \\\" here\" \\\n \"and \\\' here\""; QApplication a(argc, argv); QStringList argList; bool ok = true; QProcess proc; while (ok) { text = QInputDialog::getMultiLineText(nullptr, "Shell quoting test", "Shell input:", text, &ok); if (ok) { argList = KsUtils::splitArguments(text); qInfo() << argList; proc.setProgram(argList.takeFirst()); proc.setArguments(argList); proc.start(); proc.waitForFinished(); if (proc.exitCode()) cout << proc.errorString().toStdString() << endl; cout << proc.readAllStandardError().toStdString() << endl << proc.readAllStandardOutput().toStdString() << endl; } } return 0; } kernel-shark-kernelshark-v2.4.0/examples/configio.c000066400000000000000000000034431477354127100223760ustar00rootroot00000000000000#include #include #include "libkshark.h" int main(int argc, char **argv) { struct kshark_config_doc *conf, *filter, *hello; struct kshark_context *kshark_ctx; struct kshark_data_stream *stream; int sd, *ids = NULL; size_t i; /* Create a new kshark session. */ kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return 1; sd = kshark_add_stream(kshark_ctx); stream = kshark_ctx->stream[sd]; if (argc == 1) { kshark_hash_id_add(stream->show_task_filter, 314); kshark_hash_id_add(stream->show_task_filter, 42); /* Create a new Confog. doc. */ conf = kshark_config_new("foo.bar.config", KS_CONFIG_JSON); /* Add filter's info. */ filter = kshark_export_all_filters(kshark_ctx, sd, KS_CONFIG_JSON); kshark_config_doc_add(conf, "Filters" ,filter); /* Add "Hello Kernel" message. */ hello = kshark_string_config_alloc(); hello->conf_doc = "Hello Kernel"; kshark_config_doc_add(conf, "Message" ,hello); /* Save to file. */ kshark_save_config_file("conf.json", conf); } else { /* Open a Config. file. */ conf = kshark_open_config_file(argv[1], "foo.bar.config"); /* Retrieve the filter's info. */ filter = kshark_config_alloc(KS_CONFIG_JSON); if (kshark_config_doc_get(conf, "Filters" ,filter)) { kshark_import_all_filters(kshark_ctx, sd, filter); /* Get the array of Ids to be fitered. */ ids = kshark_hash_ids(stream->show_task_filter); for (i = 0; i < stream->show_task_filter->count; ++i) printf("pid: %i\n", ids[i]); } /* Retrieve the message. */ hello = kshark_string_config_alloc(); if (kshark_config_doc_get(conf, "Message" ,hello)) puts((char *) hello->conf_doc); free(filter); free(hello); free(ids); } kshark_free_config_doc(conf); kshark_close(kshark_ctx, sd); kshark_free(kshark_ctx); return 0; } kernel-shark-kernelshark-v2.4.0/examples/datafilter.c000066400000000000000000000067441477354127100227270ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-tepdata.h" const char *default_file = "trace.dat"; int main(int argc, char **argv) { size_t i, n_rows, n_tasks, n_evts, count; struct kshark_context *kshark_ctx; struct kshark_data_stream *stream; struct kshark_entry **data = NULL; int sd, *pids, *evt_ids; char *entry_str; /* Create a new kshark session. */ kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return 1; /* Open a trace data file produced by trace-cmd. */ if (argc > 1) sd = kshark_open(kshark_ctx, argv[1]); else sd = kshark_open(kshark_ctx, default_file); if (sd < 0) { kshark_free(kshark_ctx); return 1; } /* Load the content of the file into an array of entries. */ n_rows = kshark_load_entries(kshark_ctx, sd, &data); /* Filter the trace data coming from trace-cmd. */ n_tasks = kshark_get_task_pids(kshark_ctx, sd, &pids); stream = kshark_get_data_stream(kshark_ctx, sd); for (i = 0; i < n_tasks; ++i) { char *task_str = kshark_comm_from_pid(sd, pids[i]); if (strcmp(task_str, "trace-cmd") == 0) kshark_filter_add_id(kshark_ctx, sd, KS_HIDE_TASK_FILTER, pids[i]); free(task_str); } free(pids); /* * Set the Filter Mask. In this case we want to avoid showing the * filterd entris in text format. */ kshark_ctx->filter_mask = KS_TEXT_VIEW_FILTER_MASK; kshark_ctx->filter_mask |= KS_EVENT_VIEW_FILTER_MASK; kshark_filter_stream_entries(kshark_ctx, sd, data, n_rows); /* Print to the screen the first 10 visible entries. */ count = 0; for (i = 0; i < n_rows; ++i) { if (data[i]->visible & KS_TEXT_VIEW_FILTER_MASK) { entry_str = kshark_dump_entry(data[i]); puts(entry_str); free(entry_str); if (++count > 10) break; } } puts("\n\n"); /* Show only "sched" events. */ n_evts = stream->n_events; evt_ids = kshark_get_all_event_ids(kshark_ctx->stream[sd]); for (i = 0; i < n_evts; ++i) { char *event_str = kshark_event_from_id(sd, evt_ids[i]); if (strstr(event_str, "sched/")) kshark_filter_add_id(kshark_ctx, sd, KS_SHOW_EVENT_FILTER, evt_ids[i]); free(event_str); } kshark_filter_stream_entries(kshark_ctx, sd, data, n_rows); /* Print to the screen the first 10 visible entries. */ count = 0; for (i = 0; i < n_rows; ++i) { if (data[i]->visible & KS_TEXT_VIEW_FILTER_MASK) { entry_str = kshark_dump_entry(data[i]); puts(entry_str); free(entry_str); if (++count > 10) break; } } puts("\n\n"); /* Clear all filters. */ kshark_filter_clear(kshark_ctx, sd, KS_HIDE_TASK_FILTER); kshark_filter_clear(kshark_ctx, sd, KS_SHOW_EVENT_FILTER); /* Use the Advanced filter to do event content based filtering. */ kshark_tep_add_filter_str(stream, "sched/sched_wakeup:target_cpu>1"); /* The Advanced filter requires reloading the data. */ for (i = 0; i < n_rows; ++i) free(data[i]); n_rows = kshark_load_entries(kshark_ctx, sd, &data); count = 0; for (i = 0; i < n_rows; ++i) { if (data[i]->visible & KS_EVENT_VIEW_FILTER_MASK) { entry_str = kshark_dump_entry(data[i]); puts(entry_str); free(entry_str); if (++count > 10) break; } } /* Free the memory. */ for (i = 0; i < n_rows; ++i) free(data[i]); free(data); /* Close the file. */ kshark_close(kshark_ctx, sd); /* Close the session. */ kshark_free(kshark_ctx); return 0; } kernel-shark-kernelshark-v2.4.0/examples/datahisto.c000066400000000000000000000070451477354127100225630ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-model.h" #define N_BINS 5 const char *default_file = "trace.dat"; void dump_bin(struct kshark_trace_histo *histo, int bin, int sd, const char *type, int val) { const struct kshark_entry *e_front, *e_back; char *entry_str; ssize_t i_front, i_back; printf("bin %i {\n", bin); if (strcmp(type, "cpu") == 0) { e_front = ksmodel_get_entry_front(histo, bin, true, kshark_match_cpu, sd, &val, NULL, &i_front); e_back = ksmodel_get_entry_back(histo, bin, true, kshark_match_cpu, sd, &val, NULL, &i_back); } else if (strcmp(type, "task") == 0) { e_front = ksmodel_get_entry_front(histo, bin, true, kshark_match_pid, sd, &val, NULL, &i_front); e_back = ksmodel_get_entry_back(histo, bin, true, kshark_match_pid, sd, &val, NULL, &i_back); } else { i_front = ksmodel_first_index_at_bin(histo, bin); e_front = histo->data[i_front]; i_back = ksmodel_last_index_at_bin(histo, bin); e_back = histo->data[i_back]; } if (i_front == KS_EMPTY_BIN) { puts ("EMPTY BIN"); } else { entry_str = kshark_dump_entry(e_front); printf("%zd -> %s\n", i_front, entry_str); free(entry_str); entry_str = kshark_dump_entry(e_back); printf("%zd -> %s\n", i_back, entry_str); free(entry_str); } puts("}\n"); } void dump_histo(struct kshark_trace_histo *histo, int sd, const char *type, int val) { int bin; for (bin = 0; bin < histo->n_bins; ++bin) dump_bin(histo, bin, sd, type, val); } int main(int argc, char **argv) { struct kshark_context *kshark_ctx; struct kshark_entry **data = NULL; struct kshark_trace_histo histo; ssize_t i, n_rows, n_tasks; int sd, *pids; /* Create a new kshark session. */ kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return 1; /* Open a trace data file produced by trace-cmd. */ if (argc > 1) sd = kshark_open(kshark_ctx, argv[1]); else sd = kshark_open(kshark_ctx, default_file); if (sd < 0) { kshark_free(kshark_ctx); return 1; } /* Load the content of the file into an array of entries. */ n_rows = kshark_load_entries(kshark_ctx, sd, &data); if (n_rows < 1) { kshark_free(kshark_ctx); return 1; } /* Get a list of all tasks. */ n_tasks = kshark_get_task_pids(kshark_ctx, sd, &pids); /* Initialize the Visualization Model. */ ksmodel_init(&histo); ksmodel_set_bining(&histo, N_BINS, data[0]->ts, data[n_rows - 1]->ts); /* Fill the model with data and calculate its state. */ ksmodel_fill(&histo, data, n_rows); /* Dump the raw bins. */ dump_histo(&histo, sd, "", 0); puts("\n...\n\n"); /* * Change the state of the model. Do 50% Zoom-In and dump only CPU 0. */ ksmodel_zoom_in(&histo, .50, -1); dump_histo(&histo, sd, "cpu", 0); puts("\n...\n\n"); /* Shift forward by two bins and this time dump only CPU 1. */ ksmodel_shift_forward(&histo, 2); dump_histo(&histo, sd, "cpu", 1); puts("\n...\n\n"); /* * Do 10% Zoom-Out, using the last bin as a focal point. Dump the last * Task. */ ksmodel_zoom_out(&histo, .10, N_BINS - 1); dump_histo(&histo, sd, "task", pids[n_tasks - 1]); /* Reset (clear) the model. */ ksmodel_clear(&histo); /* Free the memory. */ for (i = 0; i < n_rows; ++i) free(data[i]); free(data); /* Close the file. */ kshark_close(kshark_ctx, sd); /* Close the session. */ kshark_free(kshark_ctx); return 0; } kernel-shark-kernelshark-v2.4.0/examples/dataload.c000066400000000000000000000032431477354127100223500ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include #include // KernelShark #include "libkshark.h" const char *default_file = "trace.dat"; int main(int argc, char **argv) { struct kshark_context *kshark_ctx; struct kshark_entry **data = NULL; ssize_t r, n_rows, n_tasks; char *entry_str; int sd, *pids; /* Create a new kshark session. */ kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return 1; /* Open a trace data file produced by trace-cmd. */ if (argc > 1) sd = kshark_open(kshark_ctx, argv[1]); else sd = kshark_open(kshark_ctx, default_file); if (sd < 0) { kshark_free(kshark_ctx); return 1; } /* Load the content of the file into an array of entries. */ n_rows = kshark_load_entries(kshark_ctx, sd, &data); if (n_rows < 1) { kshark_free(kshark_ctx); return 1; } /* Print to the screen the list of all tasks. */ n_tasks = kshark_get_task_pids(kshark_ctx, sd, &pids); for (r = 0; r < n_tasks; ++r) { char *task_str = kshark_comm_from_pid(sd, pids[r]); printf("task: %s-%i\n", task_str, pids[r]); free(task_str); } free(pids); puts("\n\n"); /* Print to the screen the first 10 entries. */ for (r = 0; r < 10; ++r) { entry_str = kshark_dump_entry(data[r]); puts(entry_str); free(entry_str); } puts("\n...\n"); /* Print the last 10 entries. */ for (r = n_rows - 10; r < n_rows; ++r) kshark_print_entry(data[r]); /* Free the memory. */ for (r = 0; r < n_rows; ++r) free(data[r]); free(data); /* Close the file. */ kshark_close(kshark_ctx, sd); /* Close the session. */ kshark_free(kshark_ctx); return 0; } kernel-shark-kernelshark-v2.4.0/examples/dataplot.cpp000066400000000000000000000132701477354127100227500ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include // C++ #include #include #include // OpenGL #include // KernelShark #include "libkshark.h" #include "KsPlotTools.hpp" using namespace std; #define GRAPH_HEIGHT 40 // width of the graph in pixels #define GRAPH_H_MARGIN 15 // size of the white space surrounding // the graph #define GRAPH_LABEL_WIDTH 80 // width of the graph's label in pixels #define WINDOW_WIDTH 800 // width of the screen window in pixels #define WINDOW_HEIGHT 480 // height of the scrren window in pixels #define default_file (char*)"trace.dat" struct kshark_trace_histo histo; vector graphs; struct ksplot_font font; int stream_id; void usage(const char *prog) { cout << "Usage: " << prog << endl; cout << " -h Display this help message.\n"; cout << " -s Draw shapes. This demonstrates how to draw simple " << "geom. shapes.\n"; cout << " -i Input file and draw animated graphs.\n"; cout << " No args. Import " << default_file << " and draw animated graphs.\n"; } /* An example function drawing something. */ void drawShapes() { /* Clear the screen. */ glClear(GL_COLOR_BUFFER_BIT); KsPlot::Triangle t; KsPlot::Point a(200, 100), b(200, 300), c(400, 100); t.setPoint(0, a); t.setPoint(1, b); t.setPoint(2, c); /* Set RGB color. */ t._color = {100, 200, 50}; t.draw(); /* Print/draw "Hello Kernel!". */ KsPlot::Color col = {50, 150, 255}; KsPlot::TextBox tb(&font, "Hello Kernel!", col, {250, 70}, 250); tb.draw(); KsPlot::Rectangle r; KsPlot::Point d(400, 200), e(400, 300), f(500, 300), g(500, 200); r.setPoint(0, d); r.setPoint(1, e); r.setPoint(2, f); r.setPoint(3, g); /* Set RGB color. */ r._color = {150, 50, 250}; r._size = 3; /* Do not fiil the rectangle. Draw the contour only. */ r.setFill(false); r.draw(); glFlush(); } /* An example function demonstrating Zoom In and Zoom Out. */ void play() { KsPlot::ColorTable taskColors = KsPlot::taskColorTable(); KsPlot::ColorTable cpuColors = KsPlot::CPUColorTable(); vector::iterator it; KsPlot::Graph *graph; vector CPUs, Tasks; bool zoomIn(true); int base; size_t i(1); CPUs = {3, 4, 6}; Tasks = {}; // Add valid pids here, if you want task plots. auto lamAddGraph = [&] (KsPlot::Graph *g) { /* Set the dimensions of the Graph. */ g->setHeight(GRAPH_HEIGHT); /* * Set the Y coordinate of the Graph's base. * Remember that the "Y" coordinate is inverted. */ base = 1.7 * GRAPH_HEIGHT * (i++); g->setBase(base); g->setLabelAppearance(&font, {160, 255, 255}, GRAPH_LABEL_WIDTH, GRAPH_H_MARGIN); /* Add the Graph. */ graphs.push_back(g); }; for (auto const &cpu: CPUs) { std::stringstream ss; ss << "CPU " << cpu; graph = new KsPlot::Graph(&histo, &taskColors, &taskColors); graph->setLabelText(ss.str()); lamAddGraph(graph); } for (auto const &pid: Tasks) { std::stringstream ss; ss << "PID " << pid; graph = new KsPlot::Graph(&histo, &taskColors, &cpuColors); graph->setLabelText(ss.str()); lamAddGraph(graph); } for (i = 1; i < 1000; ++i) { it = graphs.begin(); for (int const &cpu: CPUs) (*it++)->fillCPUGraph(stream_id, cpu); for (int const &pid: Tasks) (*it++)->fillTaskGraph(stream_id, pid); /* Clear the screen. */ glClear(GL_COLOR_BUFFER_BIT); /* Draw all graphs. */ for (auto &g: graphs) g->draw(); glFlush(); if (!(i % 250)) zoomIn = !zoomIn; if (zoomIn) ksmodel_zoom_in(&histo, .01, -1); else ksmodel_zoom_out(&histo, .01, -1); } } int main(int argc, char **argv) { struct kshark_context *kshark_ctx(nullptr); struct kshark_entry **data(nullptr); static char *input_file(nullptr); bool shapes(false); char *font_file; size_t r, nRows; int c, nBins; while ((c = getopt(argc, argv, "hsi:")) != -1) { switch(c) { case 'h': usage(argv[0]); return 1; case 'i': input_file = optarg; break; case 's': shapes = true; default: break; } } font_file = ksplot_find_font_file("FreeMono", "FreeMonoBold"); if (!font_file) return 1; auto lamDraw = [&] (void (*func)(void)) { /* Initialize Glut. */ glutInit(&argc, argv); ksplot_make_scene(WINDOW_WIDTH, WINDOW_HEIGHT); /* Initialize OpenGL. */ ksplot_init_opengl(1); ksplot_resize_opengl(WINDOW_WIDTH, WINDOW_HEIGHT); ksplot_init_font(&font, 18, font_file); /* Display something. */ glutDisplayFunc(func); glutMainLoop(); }; if (shapes) { /* Draw simple shapes. */ lamDraw(drawShapes); return 0; } /* Create a new kshark session. */ if (!kshark_instance(&kshark_ctx)) return 1; /* Open a trace data file produced by trace-cmd. */ if (!input_file) input_file = default_file; stream_id = kshark_open(kshark_ctx, input_file); if (stream_id < 0) { kshark_free(kshark_ctx); usage(argv[0]); cerr << "\nFailed to open file " << input_file << endl; return 1; } /* Load the content of the file into an array of entries. */ nRows = kshark_load_entries(kshark_ctx, stream_id, &data); /* Initialize the Visualization Model. */ ksmodel_init(&histo); nBins = WINDOW_WIDTH - GRAPH_LABEL_WIDTH - 3 * GRAPH_H_MARGIN; ksmodel_set_bining(&histo, nBins, data[0]->ts, data[nRows - 1]->ts); /* Fill the model with data and calculate its state. */ ksmodel_fill(&histo, data, nRows); /* Play animated Graph. */ lamDraw(play); free(font_file); /* Free the memory. */ for (auto &g: graphs) delete g; for (r = 0; r < nRows; ++r) free(data[r]); free(data); /* Reset (clear) the model. */ ksmodel_clear(&histo); /* Close the session. */ kshark_free(kshark_ctx); return 0; } kernel-shark-kernelshark-v2.4.0/examples/multibufferload.c000066400000000000000000000020631477354127100237620ustar00rootroot00000000000000#include #include #include "libkshark.h" #include "libkshark-tepdata.h" const char *default_file = "trace.dat"; int main(int argc, char **argv) { struct kshark_context *kshark_ctx; struct kshark_entry **data = NULL; ssize_t r, n_rows; int sd; /* Create a new kshark session. */ kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return 1; /* Open a trace data file produced by trace-cmd. */ if (argc > 1) sd = kshark_open(kshark_ctx, argv[1]); else sd = kshark_open(kshark_ctx, default_file); if (sd < 0) { kshark_free(kshark_ctx); return 1; } /* Initialize data streams for all buffers in this file. */ kshark_tep_init_all_buffers(kshark_ctx, sd); /* Load all buffers. */ n_rows = kshark_load_all_entries(kshark_ctx, &data); /* Print to the screen the first 20 entries. */ for (r = 0; r < 20; ++r) kshark_print_entry(data[r]); /* Free the memory. */ for (r = 0; r < n_rows; ++r) free(data[r]); free(data); kshark_close_all(kshark_ctx); /* Close the session. */ kshark_free(kshark_ctx); return 0; } kernel-shark-kernelshark-v2.4.0/examples/widgetdemo.cpp000066400000000000000000000063601477354127100232720ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ // C #include #include #include // C++ #include // Qt #include // KernelShark #include "KsUtils.hpp" #include "KsWidgetsLib.hpp" #define default_input_file (char*)"trace.dat" static char *input_file = nullptr; using namespace std; using namespace KsWidgetsLib; void usage(const char *prog) { cout << "Usage: " << prog << endl << " -h Display this help message\n" << " -v Display version and exit\n" << " -i input_file, default is " << default_input_file << endl << " -p register plugin, use plugin name, absolute or relative path\n" << " -u unregister plugin, use plugin name or absolute path\n"; } struct TaskPrint : public QObject { void print(int sd, QVector pids) { for (auto const &pid: pids) cout << "task: " << kshark_comm_from_pid(sd, pid) << " pid: " << pid << endl; } }; int main(int argc, char **argv) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; QApplication a(argc, argv); KsPluginManager plugins; int c, i(0), sd(-1); KsDataStore data; size_t nRows(0); if (!kshark_instance(&kshark_ctx)) return 1; while ((c = getopt(argc, argv, "hvi:p:u:")) != -1) { switch(c) { case 'v': printf("kshark-gui %s\n", KS_VERSION_STRING); return 0; case 'i': input_file = optarg; break; case 'p': plugins.registerPlugins(QString(optarg)); break; case 'u': plugins.unregisterPlugins(QString(optarg)); break; case 'h': usage(argv[0]); return 0; } } if (!input_file) { struct stat st; if (stat(default_input_file, &st) == 0) input_file = default_input_file; } if (input_file) { sd = data.loadDataFile(input_file, {}); nRows = data.size(); } else { cerr << "No input file is provided.\n"; } cout << nRows << " entries loaded\n"; if (!nRows) return 1; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return 1; cout << "\n\n"; for (kshark_plugin_list *pl = kshark_ctx->plugins; pl; pl = pl->next) cout << pl->file << endl; sleep(1); QStringList pluginsList; QVector streamIds, enabledPlugins, failedPlugins; pluginsList = plugins.getStreamPluginList(sd); enabledPlugins = plugins.getActivePlugins(sd); failedPlugins = plugins.getPluginsByStatus(sd, KSHARK_PLUGIN_FAILED); KsCheckBoxWidget *pluginCBD = new KsPluginCheckBoxWidget(sd, pluginsList); pluginCBD->set(enabledPlugins); KsCheckBoxDialog *dialog1 = new KsCheckBoxDialog({pluginCBD}); dialog1->applyStatus(); QObject::connect(dialog1, &KsCheckBoxDialog::apply, &plugins, &KsPluginManager::updatePlugins); dialog1->show(); a.exec(); cout << "\n\nYou selected\n"; enabledPlugins = plugins.getActivePlugins(sd); for (auto const &p: pluginsList) qInfo() << p << (bool) enabledPlugins[i++]; sleep(1); KsCheckBoxWidget *tasks_cbd = new KsTasksCheckBoxWidget(stream, true); tasks_cbd->setDefault(false); TaskPrint p; KsCheckBoxDialog *dialog2 = new KsCheckBoxDialog({tasks_cbd}); QObject::connect(dialog2, &KsCheckBoxDialog::apply, &p, &TaskPrint::print); cout << "\n\nYou selected\n"; dialog2->show(); a.exec(); return 0; } kernel-shark-kernelshark-v2.4.0/icons/000077500000000000000000000000001477354127100177265ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/icons/CC_BY-4.0000066400000000000000000000443411477354127100210350ustar00rootroot00000000000000Attribution 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: wiki.creativecommons.org/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: wiki.creativecommons.org/Considerations_for_licensees ======================================================================= 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. 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. c. 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. d. 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.” The text of the Creative Commons public licenses is dedicated to the public domain under the CC0 Public Domain Dedication. 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. kernel-shark-kernelshark-v2.4.0/icons/KS_icon_fin.svg000066400000000000000000000024201477354127100226260ustar00rootroot00000000000000KSkernel-shark-kernelshark-v2.4.0/icons/KS_icon_shark.svg000066400000000000000000000044461477354127100231740ustar00rootroot00000000000000KSkernel-shark-kernelshark-v2.4.0/icons/KS_logo_horizontal.svg000066400000000000000000000146411477354127100242630ustar00rootroot00000000000000KSkernel-shark-kernelshark-v2.4.0/icons/KS_logo_stacked.svg000066400000000000000000000143251477354127100235070ustar00rootroot00000000000000KSkernel-shark-kernelshark-v2.4.0/icons/KS_logo_symbol.svg000066400000000000000000000114521477354127100233740ustar00rootroot00000000000000KSkernel-shark-kernelshark-v2.4.0/icons/ksharkicon.png000066400000000000000000002351321477354127100225760ustar00rootroot00000000000000PNG  IHDR' 7bKGD pHYs  tIME %fiTXtCommentCreated with GIMPd.e IDATxyUY{ gs ZOOHDA]HJ;E)SB%񐸂I%8ƔcJD B$_o oOcsv'9oZwmI)`<Ɨ0s<߱b5'v7G6;Õ`3Kqa47Mnݩ4cDDJ)F/$97B2cGMMqm7^ן}TW'< _CX/XyX݅ƻ}Auv‘5z>1Fю' >l޾[4;ST㠍h4ZkJ)#H-҅#'XydzeO-RHaç_m<?up{?;UeY)JuTU0_]ZS.z.ڶ(to7Hm@DS D % DHłxTsS,^tc4 HS~Y>2S2}L?NM)= |$;uy*?Xz}v_cyBMD"1'),.yTi ʣK\#BE Q!!^!Khh4)%B (fJP/"R*V׏к1{s4i Ӏߙҍ;BkgL))W^y ~ ߹Zע1oTih" JGDC۶RC"jA$ZbR4Z[LG-1F-(ĈI%Jc1Z)і&vK׎穋V"uoH< V,UUх:^{nE [*y/Q}ˉsQw|[c iCg<`RDvYVtH"tQHPT e#b=>MRGYZlYB")hkL7S m!D) )H`J UP:A\PlY4V+k OJ}P1aPSJܥ/`<XÏ~pIv1MMVD:z^Ghр"ER m 0'3Zm={T=\ wı#N=5EO$X]\GJ#1ĄE(SfZ[&ô5 RN1eBPմQ8"$N7u:aZԪ:/p !5S6G_&H;  iH QbH ,k=Qԕ%)Xx('(kcWFQ&oIc9Sd(%R@/X^?L*Q!H7fsmn`=X'%)S=]pѓpd;wi6wPЙx(a&|gCaPo 1( (+LYp'M\?K%v9g ,oscxשCq` @ $Ep$ gY9đ'NS N -ӫ;|9=ztdf!g6JB , D%B8,\g*xƻ{l]X0XZ?m׷^nM~xsyʃUrj6V7Dԏ!$ *kFLSǩG桷7|'s$mY9}# ;[Ѣfg{^x6bFGP!!Q4c|vÆ#g Y8}T+v[X1>!B)׆ tDx6$4D*-087ٺz.v"ӑ')~0"5GN(_K߼;"3[qWi~'uS|NcZ3 ɳ~kǎ0^3^ N"m 6a&vՓX;J[f缮H@pyc9֩(cc-(€ܾS8!'N`aTÒ(* "IL7 ~9ܼ·ӿ[ LImJ9Gp#Jm;'yFDבTi>_z~oDOiL4X꠱「[qJ*)g^E~eێ<|?echϝ~:Xsɨ7]to,jMDVѹ)fA?9dgSIcm&j؎iܔŶƇ^g1`(/:b/RVǤpt b=zc nt %7t?i <}O+;=LEA:#zJ!9x?Ͻ)w$и]e1z"?PA{ut6),%XoVhMTWٸ**DEcT!9OP}F[SO/z/qo]w(-ľw)D +k;HْO{OZLaA1"JI*#ʲa0B$ui""۔״F#X, 368!&%>|m=ۛ;|.@3a`I*ǜbyW$ "eؐFQc^܃.\1^w; 2,.QbQ 7|_O=X}C{?+"?XڃVd.kcڨjBM =D- GqnaUAPWKĪ ee]Pq"tz[-"[_3{PJMF'Kks#>]ZYmT򦈎lS=)3 dqШR, AME+?rٕ?E:ֿuֿ""߿0>-jfu֤l(B(!{(cBVǐ_/J m d*c09k=) -f+HQHIhvH_R92 kg$$wcZf3*{'$s/[; Z״-* b@ݯf1~@s -"ѧE4o[tL4.kWs[_-jn?iw $"†,dT+}69ͬYE"Dpsr*Ma:bmbhZk^fþU3e<8"= 2Jce*J$|tHXlmA7K ӑhbfcH4)*!C'48\tti(%E]6@p%%TBdI]"-)!<(QJe0 birJj೏ιth2h#".iw-V .<(=| PV DDBݳ?G;{=`ܻw8[|s #-"wЙEXOD! ,]8ޛnj$ܹV w DA2~L^âo_뱃sxk09u c$DL)`xͻOs? "y"[}op*ŨY|M|r7 ݼqvy.YOe染3O7usA%^l|wOsA.\z=ffs9٦%mZ$O_~ǡo?C~_m6f̨6@R 7$[$:Q=-&Kc}BQU"=DP".z5ęEq8aEC$ *Ȍ#"=y(qsab׌a>L$"̘umMfDPS񯾏CozϏ}!+>sHbL&}DkMիAu PRBYU$!Gms\Ô&B;v-QFrHk$i$GήKvfqFg Ѓ?1spϋOTd"GYT\5,,t/Za˜3!r7Щ{/h.HO{FѾkfa0fsK+PJ}Drf2ML(W4d0M Y_(Cuvo0FtDWm.L$IYVfg1v]o1=&?sf==B2фS꺦rȢdyf2m"7=ݶ?}g;׿g</k-4KmoP3p6*yRif23wYb7ۜ ){%ՠGAIBx& ۻL;U D>1s{?9uƜ?{+Ik3UUeOEbf!9`tqnIأ#RQV*u%f(;PbiG`e| )E f.v.'ΟA{ @m*Ɲ(+rބVL4Ǘ8~(`]P3˴8c z:؉¤;)DI=$uIGŒ2 K\(Q1:LaFN):e  PdsI,ZD;fB)BY T3ISϡƑ.P3Q#A7_e|πӧN@=,>~˴ڣ8 =D z'{GqV> X)8rljhAj:ЩC ңfʘ7nskn1ٝfAr狈f ! e^"0AjKO,IALjJKC蘀{u41=B(zqHL%RhC (h',)tn)fN0}nl_` MCӨ!J2 Ӭ9'X@+7-fF%Cǣp?ĉWEY"miB/hf*d(=)Zdx:%(U(J(TeO m4u.* uа3a\M-uѳGYXd5A1FNz6vz*qk$ OBJQaFWnqK챋'ЧsGY; faŇ8gV˴47xcϱw}+J :ABHQ ) W@uraѴcwĄ]zm@Ff A吥6Ħ٣4EAoeY]+b*R +ˋUtw0$%(:&$"TR5< 77HhWJa`PM"@2k :aqb/qIr)e2ia(-2H$jDJ JV"!D e)v9?賸@ݫhcC ,]aoc?;/m`:EjEJb.:҄PDaV : mZ'H(6m^|9^ L]M/Mf^d$JxEOX8H}eVfYV%a8гUUS ba=r UST!+Ey^*baes+ VX\]nw6hf8rV)G/+gVJM$P״Ȑc;#_:V:ȧ>in={ [t\0bɩ_~췿Xo?|tMo6;vn¾Ca=>CBm]rBӄXj]qǎJUl_Kh6vt*bDzEN@4˧s_} Д>7px vPbZV %eE#Aji vݲ~(qXg5Z"aݣ,+ IDATs \ٹ+ϾpW 7eSR)(H:^;.,pŞXb:3I*d ܚpHm9&[ڬۍx %fL,)F] 4 mF(Svt*+uŒۣZ3A-xӟ}#c; Yf-~Oݤ1Ō q7RFUhuBC7/ho_I%$JcCn 䃙g,)1PG1]$M4ii(&m,/& іS$j&S$F553\@(3*)pOp ŝ`s_b/;|:^UaJ&Vc %FP.&ðGvb+4s8bl(KFRk[˅"t44)wyLK :knA謧ZQ./`5BIYMFܾqCݢ] ԡƂ1*v.BG:VlhcC_B (FCO4C=[ Jt ʩ0)UjPW$9G__'?5]DR-eӪ@kM7hGmuܵ2kht"p2? .p혢.@{\t(b(i2"ҹ5LQhMQtՎpԡ&GSl^U&&ER4Qj< fڜ J*!2(si-W *bbGGc5M=pNF%B$$5IB.rp̎PCi,J)d;YqE߈@^δUP粕j߽?`j1'O!(hJ ÒdoH0쒂Bb$urhi *Vd6@o__>_=ݏ> jyo.R\𙀛P >S"LO҄r`%EvqۑG!yR?3p6ơB)ѡzdaYba}\d"L ,Vc2` k-mxBH.K#(0:xœ)4E$ih\C!7IFBj"-WY)3k Y=Dl޼vw0JQzD<ϩ UEAܼQ)OfR42M5"굀C[ @h)T3pchh '8gZ_}ْSȏ*I;:Y:y]cv7wq]\|bcJ + 7uq @KgVY>/}%""9X%8FBz8sG(18a-F7x2i}K*FHa&SF6$BgJ􏮱Yu#&;Ws6zHb҃bf$b.vTF`"tRQ W !ym[&SDazUϙu\V%qZJ!bt.5r/R_\8v4Wz˘4Sݭ-OdЦMk_EԂP9|~'){?/N)P,Y:~ŕelUP_TR"[9[b, tas#nu- V9taNR_HVRCNV%~άm?pѫ kii>:NsܚnGu͙s~9zGJṄ֢[G^Ac5AARb> O 5x_U1+\Ln:ˉX]]bӗyg9e(FڔHˤYYQ"kH\ZBi|B+C q_ s&zꠙн\S""i])^K%C4TuiDŽT%Gs.P=,Sh@&7Ɠ8SWeΊ)fKXPyOr+rRFLsnlc~k~䁻cǢ _]6g2\?D ] L}|iLF=5f&&zz c! _dS@3Qv+ j$Ԃz PH bGR_ІK);2ʵ|CG^$nUGxٯx%yHxΧ@a*wٕU@& A GYpDkן$>".u#gp)lYp[;Q*y) h$wȨ` Cia^ALr*gpl?>p[Qt'p#Oxx鯰xtso~Wn/Y !"I7k?xƑׂ >`qJMN08*KxB(kpoZkEeJsG.J͎9ee}YQ`F%p̘[N\<˩xCO32@.)MQ -^;BGAi=gX)ój&ĝKzg>t?8t(oevwXY;r1 MaSf.^,GUIAQq.|Xz ^Ї~*g9ʣ6Uc9zP~!y:?XAd2BV:ri< 0a9QhƎpu DW8rj7&,ufe6~fh8|~:%mL(J457iwvh *=ǥr.(qV a7_/ y!Fα7v~}&gΝ0-={s]U=&ERԘXb"LIC (#؉8.PHp D1 Ʌđ(Qd]CWx5biH6eU*Tg׷}kы'~ʿ[/\ŭP`-xT,GJCL֢|H5ʀJRSvYEjDpbG_ G9SOP1`" zJ$/xkԴQ<'w-]NcFA_*!;ι;\y9\__@#W>oȄGZ;&ܧcRޔB4gMk9,{㐏4l6ă`lt^ybȑ\e@1{{{vA%Zڄ쐨%R8 pP9[Z;VdHْi4E2@iLJpW%r47 ZZr/>ɳ<]^lݖ?E(,}ѠF9, J,&GbHzϹ1|Ē5%U+pQA~x_=ctJh}hYAU׼;qpt䘞T4H9@G.ua8.ӽ^rlR.S=Vt ALcKr͎H!=Z+z>:KsB;zL(E*Ae"fz=L5|^:p;FmIiEnrʲ( *~;!%bh>WNLͲ۷ 8|LL3U%2/QrnD`;5~Ig]ڄ?ejLoԿ{ ]πж-I%Ҿ$ۺp@% GvWKܐ8kO )@'$.xrF&x2!/$y @SغA5I>5@Ie SL)ZҢȐ$ "Wdz!ED枸 c@/ [5L *DwAsֶ=4iTR1Ȏ\DcQDe<3ۖ VV[td EQGr@.68*.Fj%)z9:B-Fl:9-5yAx>Cْue@EF#X&'R7誄hbt WdQdpe[pn]PMK4'.jO9A , ئŷtй!+5"Iӄt);㓰iNneoȧ]1.lH>_Gt?RIڨG0[ vęK] *mR٥J߇N.\3ʻ'w@*ǣ$20ZE]B_uq4wDğU~_?[?~)y'W<%Xo? P\ڑ@JAkAd?I_W2 ۙD*Cws+B.kR(R5Dol&5\@$232i-B *HtTQJYMw. LtJTQ$U !1w OLX2kru`kyz4 .#G̎̏*挮YUC@ӪMj-ާp:sz'$JF ߨTq!+-S"uȉ%RNrIcpv_%zm `W]g~oX@ԄBI֙μ:|'>7+ȿ^IE~٥5-b (!DuȅDiM)j&fN'iqt)wUu%!ӱCk- ~[j5*'BoWM1h?Q""ڳ<<ݛ׾\&\֧7({ȝyox&cy*c RT >@ Lj3s42Lc0A= 7#5QO" 4MwbC ǿS W~vۿ|OwsМ !NY!F2_74uM ɨfC}5RӜ"Rw_=x9nt1SEc*D܁RtsX!Ҳ֦Ɩs4HWuؤŻ^wedH pqP#tI5xA^|KDS4yx2)ӚZ"ΗԳ s$"wۃ^Mw8"`O!ω^1e۞5;k;g ^=yƫw1t+UޑŐe bEOQ-nw,\DBGT*'-E)l$#h2jJ$N *ADg-3uРE乡,2By}ӛ| Cn <9sMlN->cxyýOeP 2uWsE|AQ)A'4pܩ)jp&&"H:hn'Lp' =yݢL٥:%wp UqiF`IdTߎ;K_F9.SZi8t1$<фhafv'힫#&4 9T'B|2>s$73rh!!אXϔ|)׾ 7ކyDnAq W3]Dw~8XMs4Ml8xje')"B#?gpw>0.9빐$'U'G Soխ\N"E\jXX2=!9ǻX[+chp U /[:Z=#WWl˸~kgqR IDAT?#n\p`7PSWɖ(d ʣgj6 /8V|3gsU8x 'v3]=CWq|뉎ύ|j$+.P:]m)bHDE'p蚣I7w킸J((.$BkaNYBt|ZpӔrpWDޯ&!Z vz;gwf>^qe PUF:g< C[mU -NHN2N `Ig4Dy!%z N{'U*uFWIQ"I.՜6}vlE 1䬥^V Yd δBf$<W7ԋ%¥ս*W*]T7IE$jٝi`6ݮUEXvΠy8'sg)R87^qEWTK%˻77^y5qK *#srGF.1(޼/H0>}s/{@ ({9J;i5]e<[,|Il=;gBzѮ>əZU""HTF.0i*&S\0ihzٰ.pΣB8甫/EJQ{D% 2T2Z 4"b,hTf3̞ 5$[KWn7Zr{{Iהc"i!4r=ۜ łsshm!X+ۡsa- G}H$"hI[U6U[,(˒J"1_]w}/Tϟ_ҕmKheRJHg Z LĦ]VT%44RZi|$ )rV <(2L ]Tǝ/h Lqz$vqOmy.6kqxkn߰z+(TF/y@"a$!*6CH>QˣCpngnzاQg+K:ݑZ5RO"c?+S_[?G@? u#={cθާ=I°F):T¨+"JT/ܶ-mݠ:Z\BW^kq]>|_,*k) ȿ΍fcqu…"ڌdvd;o6y;p|$ 1#4Nm=.TxTd;I?dx2Ep4Mg5Uhn);ͲƠ2ӹiqJbK??~?Յ[ cSΟlU /rPmȋ>*3h o2#(E*2dRY:ԯb mpEAfR]t>AH'8RCc,l0A9)k!aJ(zH/aՙ-$US#e{s FώY箞ʥvkǷ5Bj*KԲ"'~=➦h dvt@5xɃ7Vx6`'(DHIs*aMbŘQ`ˏ*#<B\\K%׷%Iލ!wo?>bv 1Kr# zRn0TڥP  \"B!| ,3tPυ*IHdP %~Hb'bK,*cņ7AK2X+'̫t2SJC >-ʮუŠ1f,kn]._/1)~QM$z*O_֙cn~.8(mVԚS;'}\۳Ke&.F &RjE!Zb:5`3 k"v5DWp\Q-%T0E J)h2N$4*#M* =:E%9#yyH(#3)ssxz:# CB9@<<?&)j=I"jlo12#j~|0(tT~&/_|)o8#x%XL5(v)B -b0kn;hrJ+e7JBhJ^^)Ȟ s|Vod.,%yIPـ)*Z"6&hM:`-Oz"R%sQTJ;lEQ VrwSDuqF[d/&@D_Crpp}BD0t?wOOm]Ng}ɐr5u]c]%Upʢ ٰ G=bwpRS--!E?GoQ"5RK9ߺ3x7`6W&,sLQk׶陒ݢzOnJuNpJ"xp! dfǤ7kWX;`zkf@A>qY{7WoV@1gcʼnbcXqiñ=8$"7:䭯pdztB[rHoX"Z"id;ޱ1DooˊKyt<¢r؎,D u]Gvͥ:MGsL0u>X ̨`FT =֘{)B d ZD&^P/{>7ٹr\zssqvQHK>sl_&1z{=$,WHs剞 췲p|ŧ_ǿߜZ,Pb52| ! C+nL[7鱌Mwhby#Vs%VƤT!bgDyeBqe6?z,pxd.dfz#QdR#TJj"D$ $Ohr}pZh#un?wMтr|Q]4 ꕠ&,zJ/9w<{`q4*0嗞8.o5x:Is&Txq'f|R˅{|ʗ*<[ 23YFn4Z$Rw.ƩV25ewSg5.,Qd6ykW`e ySZ)G_iV1`3C. Pl^q9 dhe0`zkh:iڥD.SLyr-A`s=Ȭ#r*3 O.1ޢ{B^ ڀeB_i|]}o7b~;:x|a_ eL3Z_cm{W@SWJ`>&W^Ey~т)v\K\熸<`sɒ踦F#ȨXRȸZ}Mo?"[  Q@e2KOsSQ>"p[8娠z|ȣW^zWq,d' @ mgX"kWv@I6&chZ滇y6 ㆑-(A>chP>x͊jqñ8e 2k :hZµ̖ q2/5QuyNe(Z|ιn$c xkާUW^ +\xvMDaV2 |l;@5`5˃/8{;:{7s.m7tCAZ&W\u k2c* !aǽWoGm$V]lr;V*?wyAߒ-*o|D 9--s5D("JdOEyjtLjP U@FMU\Xʊ6Okjʰ ,4Ufu!}VJ3C[uMF{\ P=n5EӤ>ɒvٸDDf#LR:n 5Apro0!!ԆjZ64+XmvG /gzczYI[`mn<`sC AWHlETQQ,a}.|.NS{b.s8qY@(0EJ&Og鴾B^!Q.ZoZ2E{]y@_UyK;kA0(FVLXl}ZM,GyN,q9́d2ж-{!h рgύ5ח 5ww#:GaX3XqbLfHdˀwRU* i$sP9|Ӛk+k$-E-WCngߙc8$F}$6&\5jɠ();29fuJ\6G6aFЬl"I[UDdXMX8q޸gx=T I *(M UI E4DOwd_-cIT>(֨egN*sMUUQS6LI`.1*d p>bI3m| l6< =|KQ, q -F(x%"Uj4yZCRTRoL )b})CH >nO}`/+D2Ss*} #tvW!zT|9=1޲XZZ2zMI!5Ͳ&((tk,l=xDz)%MSN;YΗ '},K^ZYf )z9:SyM&NBLn(kQޣ}o$p*U/ܝK]n:KA"S([)MЀ.j)iA Yg$˄~QD~I.jЪtnv2%rR[RxH*хBi)2iDiNk. dNc&C1EԞ "]W*F*Yj`\U3Ac#t3FaɔB64Q&/p!YZ'AŖoyZQI^8ɵSQ#oW=' M娲CK$DM Aju6KyvsB4I44QA$ 5 =A{l) |`kH0'xfLmux*/˒pue#YRbȴȲҵmDT@fOи"UU1 ֚ xĐA%@)&62)&-@u%3DpRIT(DL)1hU&ku<&8 LEZnN~[Z6WeeBVR!H"N%*2Bv,Y(zh5mD@hls<=b32 KFE ī'ʦoő yCǸ2|9- 1rIdHء8e h*g;:DqQH2.0ĵ4nT<* V訄Z\@UZǑ|d_<{rm˫_x͚{w$9$X[E9&SLzNz+8g+>iR2佮iv*&Q:c*S~>@n`ɲʰBUp>CɄMUƒh82 b C^κTT'[HױC@ CF%J״(%ȄisH_8(=9YԨ 0r|5)[G]s /k|ږڡ$“9FD +cu>Oi mo 9z|#{L ց09L.S5tp]5t _[sqI8.Sy1%32,h-DӸt/nv~u{GQg\:n΅$kŤ1Q*cܪ ٗyKd»z^C#9!7$޵,5)%EFp @4$t!:敀 - Ao2,v F4 z!]3d9IQ9w5.B$lC WJ bHAZ'mx٤' YF:^V9HbU&*.tUZ%q"5])qed@4bcf ~ZZ">"@*Op-ށiҠ CW~OOok룟'GEP1`|ш:@DODv+GruU˗Ʉw1o9 /L!="ʎ=~UShRz+ /0\(Lz:.=&*5V3bP8eQ"g9_~a Mhog=F׶3\vM / ]br~voW/ph!'LkgqbDi{DI X-zϨ4&j D@AԔ qd"P54lp>Q֟:7or|xD]/ټ| /<+L.n]ȐuHS:(RMk`xe/4 Ho<`rask,ʒ7vӈs-JL5R&0whHrTeu6_ŗ13 &tOP <aI|m[Tq~Ob̏\ox’C& ީ8<*dHdpa\Һ9X&CA >j m)Vc1'Ew Βx1ڀǭ]n3J_};8xp.хu.\psJ ㌽;}.QA#҃$dZkr4tb1#@c41^_#؍wq;]C+4P k$h4%)#F9 ֆLt(C1SWXC>DdGܥ=0Z2rKAަ3/} 3|V-\@ȐĎ֐6WԄ!X6.'^3WXMr Z4 ˌd/Jr#-;Y'KF{E[W/w~1mF}d(D} ar':L'ˮ[,Du$ڦA+AhD˜ ׶/S\YÌKY\GSiOtO݌Le(YЦwq K3Jɲ8z߯KX<LdYik.ؚ8 IDATŘ@VmX[v3D)Ժ8F1-Zu u,E]y0+ +\T3n:}M⻇/mx?~*[ZRğt6F:0+ %d AD :G%]f%sܻy"w#gwؘldk_=DPPQ@E=\Fkmpm>-',G?d6{UΫԉ r*%@oPRfa+(c%.4>r 1ڊtF1*)hi בt #fet2շUDJz_x#+@%Ӆ5_y׾dRڡDmYS ""rc 8"EtѮM-ܴ="Q Xe/2ވ̔Àiνxm*[Sed_ޣ1X-`Rt1:6)3bmDٔ yUl멦sTёDW"5%VieJLhO=hI6dtqsLa;ːKֵԾ6`<ї/o, kՓ,;s>_77`2Ɠ`2]dVDÒa9A "EM /z!V68bJ o6#%hpmOuސ)s)L`! L 9^P1L)@HR(Zp22 "HM.EQ tPATiLZ&:΍m RPdq<:`lyI1*J]+Gu^,q5A\xjڃivĶ!G樝zg?55M/_ :d.!AT AYlɔ#= i2/46WGL 1eDiق &'?sDa#B{.x5NX|fYz>+Os7H0iDEJ4MmUG.j<̔mIHI 4ηo:a9vIuQ}{޿K0閠 eB{ T{PRf ,FvrOP{ }KOc9aHEt€39p :lsg7/|;1&}p`5bi}&au(46'"1C xlt?8"k~f8.m1f,z]IMH/)$J$5*^$LգmNeʼnznuQZQ`h`W#چ VȺb _~ qaBC{o#oqhmIsLhμ[jcˉDDd6v"Y.cppf4b0^!\/71{->[5[M .jRch=ހ3uozT`"pdhQ;#g#Ց 4-S4 q/ȅRY)g7нBtvSFfÀYiJ r+#a Lo-VXhk-ʚ|?x}FCz֙'.ՌGwܺo0!`̒$=!$Jh&! Y3$/Qdȥ`!datQbe_ɲ\D@d!)ob:0(9X.X'IRWDTJGrq-Gzvu]OpkHqLl!M%](zZpeqe5. הVBM`]iv>W45RG}J45[;H~`~t0 (?Қ=H7_5i/ <(%DuY'(}& %P {s:*A4AQ⫫]hI#Opx&Rj&Z,+#X#CcV|zW^S@CdldHpAh5SxDZ9t܇!eSt"Z㕫+qBu)B:N#{sCma4ajlQz|Z #u:oVF+œi !A>DLlhh Y/hChC+UVta7檭$RFȜO1dItv$P` Ne)FStSe~aX[k> CѶ-ucÑ̳|8Km-B!^x1~O+K=)5rN+#+hDep)0aȪ| @x!VӰ.]9F}QGR5z D apZ VJӒ1 ,'h&GM >Zbb6_F#ƈU[<ōWH~{o7zΛ}[Skئ:OSh >\!ETᆬr=HTmYI.@k% :'p"U6ҥD aph;R...ϗ3٘d ibyd\0-!8tNANJPV%ȗD)(|N1ɇm!fXYTT*ᤒX Y|V"D&L66.1~y !xWf\U"a'#2n5.>< %QJ롼fH ;jR(k/e)l)K s"3e2Y,+/[J-OwRbT !`d)bF]g.{_2|K1>]~]xnW_9+wi4*Q@ʈHy@Xj<$42iRY~Fd%!#R9$DCJ)DV.(R(P% RX_%VFHDߒ }ģ"‹X|qJ0ɉla#=r0 ªs Dɗo1&ay`rR2-YKH"DNAʭEAJJ%TMϯB𧕅z^">e\4'UZ3T 84>̯3,?_͟?V_')EyhNUS#$9=1ろ1[R+olkdٳJIT9(0!ڲrθқ$0(EOR|\uB}o~ᘳ+CwOKxx ?t(c::bWg8. JXTJX_+i4ѻ<ЊĐL'bAIe %I;D#$D;HԠ*MdU 숗VIْ,Pgp%^݅G N{bUpLV6' eLVl$W2+Igϭ$DHx?O B2(%x0 wp㿺\o7_q?R g_R;|< )U~QeLWf5 dТaMgzբ>u5@wst«XlJ'{e6x U`!_~p3s[o{^yIʏ,onudcQ&ggk(R(Q:e WwPBLR(qqZHg$:nrt._o3cF Nl'y^"$L*5"ʵX$z.|o|Z?(~Hɨ0҉/lf灾{ecrάl=V\%B>ښUXmʀx](޴D2*˥IkE$0 X "0321VD(OIU%Y.ga1=I E3էOĵEbX-gPQv D^NIdĎ\{f̵"9JS+kOn/^|̙Ϳ#׹}w[~wK^ќ1,%kzJSCLKaAR  Ri@DA!&RZ.CSӐDRYL;)'hD&"KY !R( x BX2Fл\Vk-Ir/s~5V$PBt}E6r+'THThz/LS#Nj1̔$OVeIEHx{y)t&H1ATheVH| T>ۮ)C4T9)N>!ا=Ls)N NyׯE3o\叾ux?~[|xHSKz)~ $dT9B*OYS$z4vQgA!B)+7y5,ZGU$x% BȇV/I D`IeW*K& jݲ^ ~js?*[>s߽؇r>8O\*T?G^_s.o_6֯ףȃ)JD[ϱhIB0+Z}LH!Wn2%|A(!We~m3\%g!Dy¯ Ìd r!rfs788xkoxc~c+Q$gLY \ ">Ʉ~6&IJ@\70yJJ$ѯH 7C,.~Hmel yRrN{ )L(3@㇀ *2IfPy`' vNKK2t6?aYJ)ՐUQZHA^EI!5Ze' ֖(Bn5*o=<,kn#s 4][ɨe$3q>8 n\},HZb樦 ?Х?}sj \ -1%ݒ#}^3$+3߯y&ݠxy3r2ݐ!gp"@XKҚ!,ݜ!, DkRA ĀeQ8,֛("%A8B$Ed}1㊝`9Ry.B&Ʉ{Sg=e_Cۭ-CU"9TxDeX ZN@G _Wݶ.y3z/YGW Og\%rQ dRZ2Nޓv>(!YkDvB[, |-_,SW*6+N@5 e B\Kt}]ˉML}=&Ue S6֬ݽzcH<if|ጟ;pښQF#D$,#V% )"zu >f QPyy-"t"MR ĘetS% -)-I."eL )h YUʘLPH-H"ӽq ,gse},Ȏ$Ƙ2t>q5+YÁk6U)m]?apt]mF\DtnٞT RP<0k ܯAN-޹\*)I4Y~=zXJ$ÜdzM EK 4)|"B`]r<ڽ-":K஖̆Oiٱߋ쥁knf< $, څGˆb4C§:I xSGf rȓ"`<ր?$V0Wyd IˡYTyX>AшoE>0O9}Ng܇q0KGe_*pיy4ٯ:oO 'a.vd]u\I.$>W~rj-rMIyAo rbAH߄=<Ҳz*(Et).xK]S=k+#{@6V? oFi턑5;cir8% fSipibCYA~:K,j[JcPH&id.;OS Ό$|PhtvVWPRxA&TAH etydBr[apjBJ3=a; qW2}Ȓ]O%$Z)}DJ"s.Ã3p /=*>y xi=ȘrAWUo)S>b̦uaÃyTzm=Moٯ}^?c|ɞ?JxZ_nyĭO+)*J̀P r ,2$ )bLůKEVG:T)Kd>+^nV$H?hFÅ #8B(OMeJ3o]\Ȟ"J2QS_6ulEg}iJTIy&$ !5&p}0kw46z玐aˤe(+ Qa+F^PE|&gs͕'gzqh)8?PF-;cϟ}k?tסwPl% GKdŤ :E:bP*uDof~bSgUh|^V(%p69D ;xzmG?yKX!EgF&*9u>k D`qp Qb2F|0afTc c8Lcfcc C'*b.ٍْۨ&bk"Yhk`y2V#\y& tFAUUΥ]RןlTc!#w(%߹O54f;Ϝa bD !2\(r-VBKYR$XZF=|9ftu{n`cj1#h[C,}?`%YOzTRJa5T[SZQièY5_FҜߡޝR5#cǨS}f]JWAEBbrzؐ&: IDATyD7Zkb<{Eמꑽk=?{-~:pE*P"h+6)yH?g6ATqȻ̽ DZJTb$1Jne戧o1ٽYFf˲yI`rn̠:#Guy#7 [Fd$cv *2ژubJsR4(;ɵڧJ2|QUDsv418!&)֔D`qpDwD\b>1r 9w?t4&i=3e|ee/Kn߹'BJkA[.rwr|.mߣF]bCC/*Мd#oHA[&81A9G}cΎrZkMå3 ۆo</݂͜[7+JgTD-D ER=|_N'쭂3]Ҫw4Hi.H*"eBJ,/)Ţ)AptwcIĹjc=8~[|c\f˗o G͹9G|]Iwu"bP>zԉaXKZ? f1e2`9G۶t)@c1fz‘!bZ,.1Y!A$Ikv>thJmzj9uhSDŽ#fxQVD)̹GnE,vwy'غ3Ó^̿w& H MhI $#p2 E"e$fIƐ Ķgcc6fb6j~iv4}kos{ $yIȾ;)y$?lLG#9hUL.p^DHS4ĩW<8CSeQZ9wr[¸H/>Fbh;x@Q'ecg ;11.z91L|=M_^z>f)ʁ'5HEBN1cSJgQ<5C Hkbswz;EgK g) ;!za_>3?8;ٿ~G&vL} =t@lm00҆o^eP[z" )u#g-âz""R*{h=6c^xk/P9tݚrtpĭ72]2#\Jd SI@Դwg鏳_ηhD])ڽc)%IbwR:ˌSY6 L.r/\Bo)T0e{w3rī#;d\'Rtc'*$؂?WF i^HD+{BY`S!ݩL}H=c$ &Vϻ?|˖ͫ繸smrY\|:{ϭk׹޽ǴטB. PF w kOI@YCuvdv0sރ_!亳?ZJGK 10{w?fv} ]{Hj4bc<Χ!=22I`ȸ2U+H{ .屯Hs:h~obJe`3ԌE(E(8Bt/ػv2^Bln*тru, ̢0V|zLX../n6gwRDd\ݜqx.iHV4x2?)Ĭ۳p7je ^n=,8{uW~u6Ȫ<ꉡGƁIcG# %%>-1!R̠!g2@?m);()Rή1I!fK>*ЩBZ^`I}&?w]v7wO{rÏww16IOW|txH6bҦRM !"?;?&5 DYGf(9Iy,K;ӹpߐ0r(|׈Vi"B$EE Bg_ X"ɺ4G"T|cg*bB EwIL灑L ~1wtsY!bb`ySKȌp@h"዇P2f]gSHeס'ˌim^n 0"NfB*IhC^'3fg\I$#ik euH:WDZ 38< 4BnrD-is|ѣZlI##Q!uRGJ*uiciJ+rVfzĴjXdzCd%.51I QM 2Yz$;ecsA5ьF+[ T ]>楤*yp1 $d?Hl(Ո2BEꠏa??ޚssO1аـ=޵D?`ƚ !k E*iY4)FhZR36Y /=A*blo#FOKθtDžC臈7zt2z*' .PKzవ!'lH&Cv"P`vhBQTi@VhE]lҐj)CTcupvcK3A*, \HDdkF$,TF`*5_4_l9}-~ F1hQcv3jDk|h!(0&1{Iuy^Ġ~CRʼn>fEL+D  fD Ɉ#Zjkq]A7Q;ߝpk ﴴCb1b1_@vBA((a%**!jg+F'A5dh"Ret"mQ'llT9*iB,bćV-D\$Ze2"F"cɝw0=PH:%4Ra̖Q=& a?d16` `H:pfNzcH%34x)'M&\UY}}ZSB@sK<IBLҗBeD$cfLw71xcqKOr3t]*%IRdrwEÇufՈ" &#zLuEZ╆>':xCqw1˜6>K&C 4hV=! $4ʻXYJ #RQ]M?4% d*"lG"B`XT#%jXGGgH_:'޸*+\f򜸞4tTP5 2\*BPɢAوM*)|Xt3P9Vcz1&zUҹ/X@H5ಘ/!ϳ }s6F[39*kdo)0(Mf 2[dDD =,ÀK=hFfs}xz|D:ljFVta,Hh/@i/ԕ]QtWxքkf-{|ϑ_`Ȇ`BJ2˫]y꜇myoD$5>xߛ=xK^{M]̎1tszD%n60Ktvs 2YXt,KD (S0!S6Қg:@I" h-d s@횫O=Z`UglM<I$ CW0 S627><T"ƬSef8 ͖$P % ò?hZ7u=*iTq"KCNK)aP [ "CCѭկa)Q)xH'h?Aw*z*g%ʭ VXW3NhY?WDfKzʚ ]Hۖ^ҋOp.[5QڐayqwG1@4('T#%D4$h\77y㵖qF`*3,"!D = RTH*%y?BE5^T $굆rc.ENbupG\UEi|yE[b r=2!VȠ-as ?xe/!J|#\{7;Hd2-3[' + j8# A0sx-7~,VVY.h]KeH<+p$z{nLv6pD1bK`j]Q! FB)}u*B$KfZtd5^||ǿp-T 4[cvsP#xn3*êL^[^\9Iך" Da6-_o1x~X?DÙqǹ'L#ígΡά$#e0 cIgxKճ=~z~^}5S z`хjA% . H(*r.ǹT0,[Or=C#lI* y'lܜ@kW"aMYV0JYd!!U;J3=f|U&U*QSsfG쓞u]9ޚr>yzw SMz#C N( /v23dعzz+?Az{M?x~"׵ RKd !dR57y[6v8d{[{0 Ξgg{s;T{ qmK- 6Jzq`dd3~fK|+_}j=A|>y-73 5?" _F-ڜ%~)nUIY)A꼫Zy"_u"19Dq !AsV)hF=Giy~,݇8Kow8x:rpHQJ+_ &R_;8?O.ȡ}+17qL?njjز{7yW܌g_asԖO\Wx{|ec<=_m8RPlY sh`ѱ*H688Y.4k$:5TS-Ǒ1I2EѺKs#^ꄐ|87zlؙnRHqgAGʀI9-I,ĽWeYz,qdDzo*uW7d aF# /_!B\.F4]lS]]ˤ&"[FDdV5!  Yg}E^!EamTϰFH91?x]HlU XCAiˌCJc "RYȣ͂GdpH8KAC N\#oxah.爨dwZWHx|j >ax"DF#e5n1+a`j9<,~I#hE%[݀;stIЂo3ztpbd ǬRB·^RmCZUBPZQCeN]̀\X/Qle+)iI󂦖hcIoA`@>p aKrTab^5BɓDi,rNq4\:/~9_|~Ã]¦g#^5 9WzCocQXk~e^#[}]ծ>.(]% IDATf6XZ}l*jz/^8)+vzex=x CۘꒆJcxWVok8=X[ )+#j"N*I6q%tNbVW"^x+o%\Qt"}ɜБiI`U8<(|->C(ktTuŚc &.A9EJ3)7NG<+lIܺ`ieqƼ\xiSVċ?{w5RϘ]RMGxׅԫ nT(v1wDèޚJ9w@h"+P FRmOxm6xdh0UeM|iCsVFi̧9j!%ZKd~/~ZԿ htۄIP ٬6,ǺkqFeĮM$6ՈvƔL@$W7ٷnj`c)gˏxZ1ܗt&Bx`lu#%,5H'PPxWupۻբB/vg\Ǣ d S|Yh%=#]ɵ74B˒(r5nHB[g1^Gx / rx8pNQڄjQ ˜i(Ւ8s#Y֗rW +M:4&l1.ƄF3exqrǿ@V ]Gx` I\%qh6QYB@hTv~!`A@x_!'Wh!ipgOqQ&$!86i[34څ jx*TR$ꗷkXw['iVCΚzTO3URLZ &=:֤&yXюd^78K9p@e חYodc UUrw]Ãu/Sv ɨoB\-^qe(fڴ ꡑ6:8@E6\UwUY_OaHR՟,"w;Sw[/\W$Ʌh_;!|=':P &mRO2uVԨ#(\'g%EirBiD1ltiVk AɳrNPl$ !$N7 !(H9T,2H )R8^hP^G8cD#/U Fc66 ٺf5f,B!Ɩ΅xX' Rm~pcIA!崊V` gmMGy'=rbgPz7(Ÿ{|j>|JE&JD2CJN 0f䐢,ylUJ^uq,1N)U?RH !P$VD`}uz@/u'J?l*!wܣGPW ej8z /^JN/NtOhlk;f|ٟg\xAҞQ INO9s}uph)f5=*FF7v5b>ZօToBo85pRWG}#i7/-:ߋRBx!YWwqQTum:p+ txkv_}Qoc.@BPyU ~+8"{, _K4% JThLn@|Z@,ң%끥9l E@>.-?)ܾ'X.h3SeEkyNО hcFHbiN]MyWVPj P0,HtP݃~Jƹ31oiy~Ms>Q{?>Qgq5}sǽz$F'̹r.v }P %RQnQprاjF|e>u\CZwZ=eY%05`-Gw֡}@C렪AWn}9]Yv= } -Up!xJ)7k>8UWՄK;*_TqQl;iL24CW 7y-:RЧ'&1ӏw+~ 7aqέێ+{C]b>Z64͸ڈl{ȋ9<}a2LQUiR&1$diY*XZ 5RҘeOW _>W z=--._7_krJD.&=w`vvcbע#tLf#iŶ*w)'fd)[V%܌8GK^۳S 򬪍2's݊!krJaY0,/yڱ' r4sC_+'hRHJ 3-EZ:h]ӻXȟTqœl=LF HRAmX;8{q38z3臨pN"C[OwÊx3 LE%E` ӑ'U*;o.k. h60KvLPDWu#1\)+!eUsm]DRRQ%rG9nZ:j2_Pf̣#_#\ȌsPf9޺_Wr Zhյ6o͋k^m?^NGr5I/ܹǝ3?.fa Rc(9:(ݘ{_#Οt uE=1Z5uJGpb6_Ÿ71,e` =dv'^Β9)wDbf8#9֖lG Ӏ'O\qb3 2x @'@)iSg/ FHU%#M=VFo)B Hgg <ߚOZu<8hÒc[Y4;;8Bᘍf:f8Hg%m ^ ¾<<[,LЋ)T/qCe㫛ү ֎G;]HG w݆w쾑s3N(4THeQ:X"8 +"ëoķH9Z tCБCi WT`;OoVҌg;&KQM< .\k_AP##sD鐕 EoL%qV]!*8+KX$&h֧uz{<߳|锟}~b{'`_!LPۓC3(Dhtxtv7`emwKm>:x# FHc$kUU'S5NZz0+ꪶ:\+rwqRڂbdT9t rv^ XYOw)՝4 8t I,_c /[A=fh=˓nܻ'(0*t+Kjダd8)dc;皋CW\Zn(wأb0 dZ 6/ H>Z=5 ->}vW2mŗwHu"3i֚C_+\;okEZŞhHY[+Ob_Tܻ-xxÌM9ɳZ #  QdI;{G3(:<3 ˇ8'OKKVO,qI:`@_+HS`6)&LG `[==Z^:Y]T1v{Ŕ9{)Wo9g0|Cɟ[vY2&N,),ᭊ!.^8}~ڰit IÓĒƙ-8+YV0?2ڽ#=sրϻ20ER: agZɛo'v~Y %+(w 9kN75rv)dy_}7Ō4ytb{0z*M;?c\,УϫpW[J3;HiΕtQVPy*£xReh>^,Z镘o_6eJTTEPێ|.Oŭ;ƒ{'4*"SbmJMA08{8yl95S&f(8,(J`RЌ9gMX06bgs5H'E2 gt l>g *cEbI#kؘN/[n=w*._IeU*~)8,℞8@)sv ;{; Eghu< MqhѪD.<̳7jfSF;37'l=g]v0^`DRb7;!_ 0=*pٔa fo'p(rMF"(+G{guDt$8LY(IԓK/[??ڝ Ƒ[k|2hXI@%tbh0^ADUp?EI>[oKng"&/2 >?{OmDi~A~1rv*67⥀ I-ɦg#hvlZt(F>y.3JE 512J(h0@GM(%"b !TļdKt=!/}h/Ⴊ(܌tI~s 7TV(p7qUtgmzdnF.^=kk Zm'ϜLJI/~>}go*1Nb`ʤ^2.4.]UNJsGQdYFcgx$ݕiEA`2f6b#5ȈšW֪ZI X唶B&?pw뫇v0[\Q!8!:!CS(b$o xᅯ}9%$Nt@7Hqfz0TL[c9jDs͂Lx`& a< Gq ǣg;{cP8Zc~A IDAT%k#xU{G㐩5V4hs8〥/ixnWsOQZ<^aqLPCIoXTPg2x[1:FU]cyRuET)IjNv:mO . ~)oBYբJ\Y6 5CԂF9&+CS "d"CGU:pıwX16 $DDH¸Dn(;o*7ފ8ݏ"&VlEL\575Itw/ SYhOݐ]pp`*9,YA~wQaŕ^;z%)8T(&*e mEdILS/_GqeDp87 h/xjIҁ祃cO_wǥ}O=gncXT-&G4"Zv:D4?E>xlLfXwq1{rJVT( 7Ȳ+02%%'OiΝU;r\ʅ '6vO ډe|'Sg@ߢ<[ 8=u nrܽ[1fBO C-ĕ`%KP%NIz,&/eU2D+i186h/ݸ`)&̧$8Mwŋ1䀏~O;JL5H#M6}J Li2{)$e0MT'TfSQXSsJ.]Q\t%KNy}Gw߹:^K9sO?sΌgL,z sA. }0$fվ ugPi(A3: ah2à*b^ RJf)C>y{|^$vTK!rO~vӯ_zo?'xmmCEQ(% Б>^G&!-J4BPK̲C^<E-9=`5T` 1VP#E:p2\r Οq$H &[%{$W6z4$i@9p$\dV{ď-y%BmZld1 a]GHi u]!,(ıDkPi!N;oIv3 uli(}ų9ɘuDž8լks:4D[Z+ޣ;s S*U u05n{AU(xmP@'V8+x^{#!^ '̢*L;T&y扂V >{O[{~fu-@j.IE_1̲kbL3;;Gn (SsdӔu:6|4dY\٠Z:0+6ڊ9Y%9v*6ZH`.qXQimx"pd_dӆ,( 8@'زb);O($hҰTq-˲.#gZ%D.R4&篅K3ឭGVJRQ8մZNKi4hEu++'=8MzH +^pri?9`,9ew/r-:#ml/F]X>K+3^ó'Ox`k+b{G080L&pmN dQ9v$-A'h4Rʙù '.@b T;/a Z(RЈbKV,K2Nnp/̙Ut]<r"ЏLfc؝ٛ޳7x%1KJӜcg L2.f6~NcDV? 88*e$钧߯r"f_y<,Sƭy4qA"``g*l0R0P, /,H[wvi k`J=V9IBY[4f3j.)+UAN9|59E9$h_)ْ9#KYj'i:KNWfBtڎaumPo0-g n >PCYNP~FIӘ_L[Y>O틂ׇlq{-`a{9ZTā#ѬmHO鋊 7bΜXImIp|dGO>Vd/ *P+*ZMKEdu_~o[\ NI]bM5iDQxʪFhGwIE$JXG7鱶zeCnN;uMlV+csko+AGtxtR2, LHC1Iڀ*x|L+Mrp18JY:g>uބNz4kj$7cu66G?{?h 2ɲRY:xM.R3E)4BX*dߒ5 i -nT -3SOiM& ԑ*!l' F)3bcF3Zmt[08wꒉX3 fH %wAmuRvLđ ^DsxX =Uo ò4* j:\KQY#3RcUſsVSW܉Vu¾Gw8}~rDG H V3-X"Y*TI[ K=Vzhg((%0 g ]n*NJGqɇv<,crаwpk̩St6i42,+Xg6g2ZtuTcTJdY[ 2x u+S{|YAi Qp5DH7{XKкR[co8$J#d&hJW+vQ]prsԡ tEч~⽇Nο~m3F|˟a] ٔeP"#YGˈJAn+|lO͍[?ݏ "~"ITM/| :9aQ:=ZHbFkMkCҕ ݌bz4h{pF=(QeD=qh4uqOZ$ܬPyq.J8NƒO B|,J'DkGצ%35!R3F+pZWI5f )Hr6kgs:g?f<8~yyV)ξCTt@31oyM;o{>f91CF)J!Cpi+S/,@/plY9Av+iָIΟ*uQRF96/* K+"/dsa&Gcv~qkSkء-2p$@Jp%ж4PR*O[T^q\z2KKHZ;~΍mnuWbGo! [xS1.#C 5 hJb$1E$Q@"75@6ί CC.2ESjnuoq1=ǹ &w–ԥ% UoݑvO}z6RX!c>wZ^{k7&2mE$ Nx/au%&;" l09_.Nl(WcF`g~$PW*I/7k0>ƎPENc5ϻ G[7vb Ҍ ,J&884sEY8B6K%;vdGkraA35 ׎0(:H,e@GiRLyd&q-%^ <{QGraujsx$x,tV9sjB&4u{cEV^ýVYD{Lys88>9?+xݘ"VWϷhZmsn:XeL&$r(Bqvc+/phu'9x>vXpg\bDT)G%I8p~eNlQ nutZ}w%SMgYFyN9ͱ"G|![ LY!Z֩>]&up`g,+}Noo.2>Cf1E"um 6sT *QA2~,[?J9AʥgKtחHbnQ+RTqi-i&>/-$Nӯ|ρ;)_t&j 㨄J/IHqBb{LMH6)Ϭq+,+>_{0<>|!™ ;`4muXhh>h$6+[A΁4,ui:8ZVK̼clic*'P\bi}2)-8·7y[o3;R/>=oy)jT<,W|͌_^is\ZdwX3X7GNg  vf\`w5є7o PR-::el53 [ZϷx)W ++yklQ1(v`pzt^9' )ˎ9 ^;28.@Xm||_Th[Ƃy_Wg~U3&~.)(% !;,͈C99ȃ. )Ik >*{*v8M08̱Kzi 1E/sxl`y7!!ʼnj2)gұrf˯ qTJ!T g9uvC1-x]DhʒΒdfٗ;W_ s;'0&1. ` fQ! ^6YXI{ew_%;& 2[\X-"Ξ[sgyg=SJKL"(i!3oTjT8ۅ{3hg(YbR{ #m\F/%)^|K!y^? vJ\czkw$#Oeh g$)^X?'IS=o{3`w?6\m [SRZJb 6kK ?uKQ Z\\f?ဇG5FU= } +ޯ+.-Sl^@!HDk-^J|[u}jRshkE[F$%m.3U]P썙DgDJSV [R >[/K8X~ӾG_~gȍ8 \9eY"$0?IGrt/shg EAe]ȱ,( ԆI>^Ělᘱ]_z!r\F-̓”8ɢDf`vՇbxjk"*28J`|? IDATXv/naӦlTd*&[K>1\^]gYglY%HG(c&:47^fs(H %}{qo|wK}T_Pւ*JJUڌq0fjo;n 纊~.?:~Ԕ \Vlմ:`ii/~Z ggraS.͈WC_#*N/a.vq6vw(J ȧ =$+6 G)f)%ݴ)NԢ&TǤAkFy1p(,o1=RU#L8e2me*%nIӬ$4oo=̉$"jH/R>zȅs烥I?f-n߻Mh78NPa%~o_߁<?˲y TX.Ȳ^,s JadehTeN"ިB5n-kL}S+d?yZ>: 8>*P$=.)1i>f:`aTS* kIlZ`$+B$ VH&P(؅uYx_!\ MĄA|(Z+++$qCd4 LiFM;h8G7[cKڭ:To2aakw?<9)fLOE ҌsK^xW^U*g/t8:7eUFǹE}W~>O~>҅/o_wbl DxZD᝚o}BI,,t:V7Rİeq\GYbI#.44Sɬqq'̤  I8^17N'wwsW)IîX&=N7>YhIi 6 s2Fʐ4E0{͉W^Kׁ/=t\0L(WJEX+P{/zHbc20OkGiB+ܚhY"q%8-dsʙ0Z.[d8$udfuMplZ~llbKݥ]>5gGlW~Ϟ{D%萫ԱJLjsK-/0cax(f%c:LGJtdtGU0B#8K;s(U' oNʹ<9ga ^4M:9Axd}f.fu]7'EP h :vy3;w^V-jP(l }Bd:-ϛ7³e#B5wRJ:Vl lZFaf[4تD{-ƕ<^B]$crBW0-g#= Bi,HӈV˲8{>ԩ6k]: ZOşb' nt9 :I'aZ| ?sv)o~hCy"cV?s#^lxӖ#8>ZHdSUD(YTX%glKZYWﭡM>|cߩj2Q; 39;(*> 8[@.mkCITnF΅YN v*偪,Cyc[³rzR8޵w4B{;Ӌᗜ)Q.ܡ8Q*p"_h$ 1V40ӚHYtu[D; 5%E #\(&Q97 (CF #6G(}LS)#T$I-h OMFJYfXD2!A;- EBL-iXd61=.]@Ej5UÝ)~y~Ef8kPhS~Z76PCߦ%亢;"0BѱBF#I9(Q3F3tRX5%QI\fgjUIkU#j N'1v^ع{' |HS{|b)0.q'B;4IV cX;8"`*UUS7n9*HD2BJ%}-IRaIغF($~wonyf\_~Iipv+"CkgQ"|-jjuiw~n?{b|N(\R,@l=xƂ?K/_D U[\ayS4ƢʒJ&UE _c[  'pR`j tJb#Cf2QyOzF jQFP]yJP6Ϋ"]S̾i{:<2}J5~a72wXeYK K;jgB,pH(-)уc|ߗ8uĢ 9)b+ B(754s2 t`Ԅ v ^RZN.`;0f8GaAzaj+0oEeOMH(p}4mD*vquMYp]\ʪ$6b~sz,f8RaNnuE] sq±]˺' ev>y~=\֓ZآZ|'3rath hьX$}~8gl ԾWoŭׁ pd %1q@ )Xh[j yG8$M>Ɯsn(>hnBRo)fq"! ^mūYlV,nR+v5;.T"`Z'Xb"g%Ji\ #o嬠6ɄQ'IU,* `Ar ^UQyuH`UHEw;Χge3YHDw̸`Z/SV!A̟WS4[r:9nBIlsUo+M$0MUQ{|Md<4\9Ex.MQZ%qm$Ky\ f ~ q/3gdƵ&p0im]8?|ѣiBc\$Ṍ Ix>8*PNIXl"ɄDYZHChA%$-ɸl#snqmsoU(vCl$B4襎c(6BYt !!m0^+RH5%Y:O(oO2N%;^$'w*BP^d޿au^yK's,$I 9,GX\G&|"e4 "Zh4 !` /qǝg(\JOKR*yO\UeQcm#FdwjCjeN2ttX<ۈtT&䪢YII&t\|Bz i(tE)*r_[)v%"D{ۻ䣜\*AԞnrVCptCbYrmfLM$Y#EB51 &Hv Wdqvo1m gNXS! CG-VZ Ùc.C;@A% t*PDVP^_ut3Gyօ-H2)Qh#-hM.GyRoq`mM%mζ$:Ĩ,AgI 4X(Ԣbtc5mRj)/"pl㷇_"?dj\#ZNJ ͷormJj^+[$"nINpˎ/e)-xu|*TT]XG(Xɖ[P*zCY(+=>yMVPH$2FX`p8΍c !MνXLSf+\YnP37ٹ4O@ Z7"vsL!'-.lq~2/9۷:wH刄#RR`_skf}YϬRkXzHqd3<wṵDa MeE5vN"c<'/Kjk@E[jC9m:WEI=<D+gO9G jzL=uFx8fHcz }1ޭegWY:D*(JlD=6%L>C{.-p3wVB/?Bτ74^JdZ٧;FMs\^b{ }ޛ1"B"/_}%5*DYLN).*@j sy Ctn%P852VX:Y:BF$|7sn/_O@Fcq}S"FphS:(VE$N#VϞ" abIT>e3yK!mp߿{]+0B bLk/%E9>!^J) SVyKY"2Fy0 d @+y Gl2l6iRZdYF׊dh8Z0r} F 6TD)B xg tO/q,8q;)DL,5%l wD.Z$":3^ D/i؋t֗ GV aW0`ϟߒR~ %z$Y7}nq.jC`&Bd$Vr$JU6."KWN[{Ȕt֚d) M_oȊWz̪!V(OUFia*TWC̋g9˜~"YDŽQ= IDAT*t0orM9B]%MdjtK*tέ牷,&OqeiR;nqt!w3cjT[wn=5pNg[XQt=&5!Ь]+omZ))8 7ʇc30h@-qV"QhIXw!pH"ʂ4(IYAFؘ0^JԥY h/q\f ڠ;QGSD%X?JgY>bbR .Ƿ="'3H|1qHTkJHt`͌g8Y:VH{$iʤ̙{o#jheiQbHI%4Qz(DL$Q[cKtK^\c)#Di9uQ< rA@GZaͨD6H+El:%@ʹGiF> IV{vަ&74>g{w[g @&-1&c 8 B\2)U!$hZ#1#>L}n,gy{{4F̨Oͽ}m RoV\=s6W3AfKQu/E~?!]q>S$4jB(n⩧Zw4 :8QDBQ}VqwEff^O "$z#zL@|->a!~uzsJ_ U T.UcBzqZC HrYa2=_kOPY\X¶-׷(Q@*츅ZIdF|J[Y2U+#) MMUh(X-q" S+V6M$[ZN?鸕I-Ӫ쭧L S,O S ߦM"`8%f_2'[>UPAb4Qu=aIsCj̤{T %/`,K4`:L]p%d~OU_cMDo*!geOpkgAY2]C@ # rk 2P!|\ IHHRv8~uNĹ3wQ7 ZiV89G,DI?/iZr%S@q1Z10eZ6pm!cA/k Ɠ)Hf F8XYZ.ۄXh+K5Eda6EN+TcJeoYćDIJ$P qM{m h1)S}+\\děΪq&UiQ"fg_%RE2!Df:砛x.za(qE%0%Y JZ%2eQB`;&MnRdXi1h(PV`H?+#(LP瑱nɅQK1/UH4mD#=H[ "Q;؛1b$xۭn~M :@eKM~":-AxͰmf6ٜ2z…4AS&#Y]&"SG߿l1t&c}:n'J#I|.T,7Ib]H9Sh2eh*f3\SdO*zwN7s^#Nsη?y(٠-m\M=%~ȣ$1R8?3ɔnQM)1R!JΩhqxIIiu&M9ίZ'.\vM& kÜGQloluq"Bq_҉{]O+q_]_Gi5Z$.p@ѯ^i5ѦCDbTa6[2oT-,>]GY:bA]O"$8I^qK\~,nݦUA&yp!mG;`]Lƞs(=%O~a%؈9Iﶬ;E+Z8{G\F}C}=ܳ7 mLQUDH:wЬiQhY6wu@AϘ)?ъu7Mش ;MRDz^H7P6( MSdBxஂM HoX2\>G jb [6qC_(B+>ǿԽ$K<>CB\*(&C269,BBt'/E"{Oru||W^COqÏo4PoP s!]hG XPDZºt,z9m³x}ܸz'aC爧F( 'x7{MGJU+@vq߽@=0;-^hhFȩS8ëqޤ dېA!Rƀ nX],I%Mx@~kX|Q4D4"&d"mySN73 UVq0?ݮ"}y*b%"s-"2RB;S,wlWכ?_HBs[sν|ӑۏۿB00i*7B N$|e í.+-پ!KwbϡUfs\㬆>Di45qrX;D[Ju-Mz DAaƅi ko#;f3܃rcg]SP>'γVW9v1TEDO!ts7[ҒV$BgnO6YP+ul^Byh|C=}10lUc 4FF(# F]KĨLW/y ޑ(Gp}t OIɐU9 ,u#{L$ S:(阒g%&P=L޺bj+Bbsy^"n}: %2fO;T#j7+#/T!oz?;p_Ա>gUYcX#ԁK^oV5!aU;S'7#roVK^K*05"Dи1 f{'vLh!iT3qIcDV=ʅkTצ bGmMsm>DVC|5F[YNh+vQ&HޠOabB,$=TX1r5JGtsCھO1҄^~ʖu ^:Y(CC߿#h/Nܠl%PnQm/'9rCG΃?AaJ"`&5Fjh\XL@.*Hў>$n\n[mJ$wf>$kW.3nQ19~1:de>UAҨ6T"L " +WѨtiΎ_}<0G+E4JzG%5+F2%w" g@HFRFSpN޵&]ڡ g>c}l`m}-_ew[|K%VWB;enwISy! O>(qjM݅Y'fqvligD&1!НiĸlMfЊgN䡍|\F'}~hc@'aP*ϾY/&>ٹ~v#Ua׮"еwGq+4yϽhl;wlALϊƘ_'~/_'~7[>cDh9w<{3[wBH"E3xxo $+ktx ƞM0K[l%3bj-VI&3FXٮH,k UP6\u"E !b jjt~ &V}~.ssד ~~oK<=-^f]C…'@ȑJ3 Qdb8^V@ #}Chb"T\ ^vTH ?, Ԯ"xuJQ 2*Ddf*ހ"b@ D%i8:TDJiJR(Hm Pnji+ꨡ(P\e.bW| Ul@D%&G:㺔I2ɱUē I4i l`˛ RTYJM!4ZnL>Cx@#^% ljia B_ɷǁ3geWD;j #fY7_R ep{: "Yb9䎠V5>8/#_/¿Os wbdrĘYCge QI!rf4Iz$bG׋ &LJTdHm51__=p_N/H\^]zvRtNL.6ƛVFԔN,J)2iQ.>i!ѡ"=Kn D%RL 4 ZE>t}[++`gŬ=p7/8ih@z֊~큳_ fz.B@ =6n`zyʊ_ERI,>S<5rඃ@+tg:Zd^6X>2*tV<7\c z6rc+=?F/&%tdSzېZOM6?rlwRIDATהcPffr_ADkrr'A@lJ&Z %؈B\Ax >x\G F=SH/RW "nX1%:0UATPbCNt Brp9ڍܮFM!6IB z{3M,{a$QIGM"c5 bÜՔPaNDsmJT%(Dcu9bv;牉R`V; 8Z 4 \/Ћ$!b̞GD:"uA_D ȅ>"m߰ K18 -5²!b"aGcchc:>CLj`$ܤm%bҞyReIQ3|}畴5xŔ7{;UTJ4urgUK8DoqIFX7E%Vc0,s'q7R )UN) skhipc˅O=+d䘬Nzb?kvdċ>p=9d:)mNkaI''J"bcj> q϶:zQ#vTNjtT WXΗh7=L}J # ӭ1qdS׽%WN r zEhF7Wx^4y,*y`)m3ǨRHf#mU3TlۖitHHhAS)MSQu)2HM*!ik~n܃†~o2/7U\}2,Vo;DvF~&7Z# pSm_?5J:&/5lΙ=Ngez m {&_賽c7\~3D۵H4wW>HP]d uɇ:FM*>T= O$}B&0Òf^z{h'@'1C[kۈʑGM=E~fih@zdPVNrSx" )sssCY&WiORP BJN'(tq1YVQjWP9&8":䢏(5'J=Wj!dN/)%~=,ݶBA5󑥥e O?(>iۑ"h|!STJ(AGE[7"'0 jOejCCNrr6So`5.q.|q3}X<0d`VY䴊;?M\Xe@zAh=-{ 6e:wK{h:Zp.B_Wi,L*^CpKe['29&%Sr޿:q>Ei=rii(Ȧ3<޿~1|kl"d0"OD@&C2]_ 豾ď\<+oK#?Ԏ#7έ񙃔,[ahJ(vs?.cVmP H]\5:2'8m-YOל#\>sS8}p/`ri}> |AUC%4$sn"h)d4*ιh-:Jdifm~L+=EaӖMQZdy F[D9NIMen i [2>)j(2Tg:D̑Ґ9CXoic>-<:Y(U$ SfO!Ddت>?\?y7?_ ojh=c`])%j`pZpP#,>vEžH)ɤBIb(z)&XL)&PH>/iƸ4uKRv5dHݾڅgL*{A|&YQQ D~Q׉ѳ+b0#Ltk tXdZDHx֮BꪘgvYQP`"E_cՖ~ĠqӖǷ @yj`ɽFAR%3]TǢFV w^j[WS䷟h_n) $"0zr>R6UnEt"jPJIIRʩ|AZLc@, :c\|U!GHӴz3ʳjöd)R{٥we4RJڶi%o^iiM/+y<Ƿ &Z2g[)4,$[]|Rf ):D5H-2C\*a=J@"DX۠(OA ,jڐd}H!mEsoU6īٿ׺O }P)p:1nBwQ}ᝅC(ڔw[&m C9Sraf%uF444Ո& \Ւ ڦkΓ94ʜBy7X$>jJ=C| mE6ürCdq$ôl Iiju[=ѴS2{L& D5}evsDn S˲ )O[(SZLjW[2U L&Jg󢗈&ls.FږLD'N?w]g~ժV>x_liQ+iKss:lGtZĠȵ0#G3! Pm1ҠOXh'0I(M} I$uZO"0+"@XLG {CzkK&l+$6~oP!#7XFL]K4DJ` `'a*bIfm;6䚍z0>H=Iٵs :?R+De96Nڣx^÷;z৯^XG?\h) #s(g2ٟ sI)ؠrkZaQ8qlG ٺtх5bwS ,˰ǵ-YQ;FJ'1E7}=<i2|c:WoЮoSxEQu4(RdXR#< /O?d~JyA^tR$Sy-Qڐj_'+=G:##Dq ?8?q߶Ct#rhP((\ܶIKD{wqwCZ=l]b|u'>7N LzJcg[dMb^Hj)Hȼ'x#_u85]{zpMlfB+mrg>`Brd}ZہgLtKiCI響ʗ_.oO?孃< =^TLvz'ZQ+Iρןய=ّ!/_C3Y!Ü.4]l5V M;J1 K"f`錄8s\'׷XZXd#yý,\+h',}f:X!Iw3b222YV-s+OS OcdTE I0;/k"SvJ[2%-Y,އ**ГT|țJu;$HħPsŗ_noxW A ?*" & |lECcQ\Bk9<>}מb˴[DSFtwr gJ DiX8ȉNo˗pGΪ\a2`,S8|,=9rikJH($N1zjA`=G8| %7u&f) с%41؛>g%LϥʜeI6ۊF9Rໄ< S۸5|'lH=_O?#i6M\<ž*t™yXիd6:&ֲ/]cϞCE>'q}:Hi46F|2XuجVci}`yn^cC3}z|O!/#tTH<}pX\^fXpWXDH޳;[g @*}>lLGl]fj+:QSfP)%!^ 5]oMo9?!yۭsn]`zfAS QXōg >IyX#\cثnJft7 ,(7Xܷ7f ]SO_etó8 6zO]Ӈٱ{r:# H¡s 7ƃ|gQn0]:~ALnlS*EȢ] s :Z- "=DG৖.:ijVB^xyksg|Fp_Ue:Ų$zt醅*g*W3^b't̃)57>MF[7]p`ϛW~J5qx]GNﵭ?E+q!$kUUu4EGGcTٹgX\]!+rx|N*pNO54 R:NDĝl|$KJ-P=6ty̐b!Zka<L]\wsDtUwkd5_wt4nevh*8$jE9,)jMz@8=reu23n'Ӕŝ*DLGcF B `!?w*A0BDcېӂLYVpq/4|k >1La?o]a&|k8?̿7u;b.@ii"<2#IE!_\HLm$*dXVjtVVN/1FT|EW4MAEL_Qew 4d"S۶sピ2 !8.]y֕tk~۟yWxPm>Gd0x"JtnHe4iG`mUKEBk|1=uhgQJbʂ.d%Ad)P p-4>&E'x'Ƈ߳g[W̭9W=w#1ƿ:F%c@d imRZ4EKXA0!!BDĐhm1iۤ4<AךyVIF֚Le4X;#:@F:{ːW xVЃ3럏>x­}ō|\ 8-q@_c|~!cw{bvQ]jmV]s'mѻ ݊;SbǏo GwxgQMB4λ&^|BD>|Ɵ]oMWx?x?ٿ.+wZޮIXDO $SeQSDMh=й-Df־@Ka,ґ2dn3 &p Go}|}5ql?X=nxW>#x8c'XQ.9P ! )D d׶I)50&6 7k2px]vn}O/!n]+ow`!IENDB`kernel-shark-kernelshark-v2.4.0/src/000077500000000000000000000000001477354127100174025ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/src/CMakeLists.txt000066400000000000000000000147671477354127100221610ustar00rootroot00000000000000message("\n src ...") set(KS_INCLUDS_DESTINATION "${_INSTALL_PREFIX}/include/${KS_APP_NAME}") message(STATUS "libkshark") add_library(kshark SHARED libkshark.c libkshark-hash.c libkshark-model.c libkshark-plugin.c libkshark-tepdata.c libkshark-configio.c libkshark-collection.c) target_link_libraries(kshark trace::cmd trace::fs trace::event jsonc::jsonc ${CMAKE_DL_LIBS}) set_target_properties(kshark PROPERTIES SOVERSION ${KS_VERSION_MAJOR} VERSION ${KS_VERSION_STRING}) install(TARGETS kshark LIBRARY DESTINATION ${_LIBDIR} COMPONENT kernelshark NAMELINK_COMPONENT libkshark-devel INCLUDES DESTINATION ${_INSTALL_PREFIX}/include/${KS_APP_NAME} COMPONENT libkshark-devel ARCHIVE DESTINATION ${_LIBDIR} COMPONENT libkshark-devel) install(FILES "${KS_DIR}/src/libkshark.h" "${KS_DIR}/src/libkshark-model.h" "${KS_DIR}/src/libkshark-plugin.h" "${KS_DIR}/src/libkshark-tepdata.h" DESTINATION ${KS_INCLUDS_DESTINATION} COMPONENT libkshark-devel) if (NOT PKG_CONGIG_DIR) execute_process(COMMAND bash "-c" "pkg-config --variable pc_path pkg-config | cut -f 1 -d: -z" OUTPUT_VARIABLE PKG_CONGIG_DIR) endif (NOT PKG_CONGIG_DIR) install(FILES "${KS_DIR}/libkshark.pc" DESTINATION ${PKG_CONGIG_DIR} COMPONENT libkshark-devel) install(CODE "message(\"-- Executing: ldconfig ${_LIBDIR}\") execute_process(COMMAND bash \"-c\" \"ldconfig ${_INSTALL_PREFIX}\" ECHO_ERROR_VARIABLE)" COMPONENT libkshark-devel) if (OPENGL_FOUND) message(STATUS "libkshark-plot") add_library(kshark-plot SHARED libkshark-plot.c KsPlotTools.cpp KsPlugins.cpp) target_link_libraries(kshark-plot kshark GLUT::GLUT OpenGL::GLU) set_target_properties(kshark-plot PROPERTIES SUFFIX ".so.${KS_VERSION_STRING}") install(TARGETS kshark-plot LIBRARY DESTINATION ${_LIBDIR} COMPONENT kernelshark) install(FILES "${KS_DIR}/src/stb_truetype.h" "${KS_DIR}/src/libkshark-plot.h" "${KS_DIR}/src/KsPlotTools.hpp" "${KS_DIR}/src/KsPlugins.hpp" "${KS_DIR}/src/KsCmakeDef.hpp" DESTINATION ${KS_INCLUDS_DESTINATION} COMPONENT libkshark-devel) endif (OPENGL_FOUND) if (Qt6Widgets_FOUND AND TT_FONT_FILE) message(STATUS "libkshark-gui") set (ks-guiLib_hdr KsUtils.hpp KsModels.hpp KsGLWidget.hpp KsSearchFSM.hpp KsDualMarker.hpp KsWidgetsLib.hpp KsTraceGraph.hpp KsTraceViewer.hpp KsMainWindow.hpp KsCaptureDialog.hpp KsQuickContextMenu.hpp KsAdvFilteringDialog.hpp) QT6_WRAP_CPP(ks-guiLib_hdr_moc ${ks-guiLib_hdr}) add_library(kshark-gui SHARED ${ks-guiLib_hdr_moc} KsUtils.cpp KsModels.cpp KsSession.cpp KsGLWidget.cpp KsSearchFSM.cpp KsDualMarker.cpp KsWidgetsLib.cpp KsTraceGraph.cpp KsTraceViewer.cpp KsMainWindow.cpp KsPluginsGUI.cpp KsCaptureDialog.cpp KsQuickContextMenu.cpp KsAdvFilteringDialog.cpp) target_link_libraries(kshark-gui kshark-plot Qt6::Widgets Qt6::Network Qt6::OpenGLWidgets Qt6::StateMachine) set_target_properties(kshark-gui PROPERTIES SUFFIX ".so.${KS_VERSION_STRING}") message(STATUS ${KS_APP_NAME}) add_executable(${KS_APP_NAME} kernelshark.cpp) target_link_libraries(${KS_APP_NAME} kshark-gui) message(STATUS "kshark-record") add_executable(kshark-record kshark-record.cpp) target_link_libraries(kshark-record kshark-gui) install(TARGETS ${KS_APP_NAME} kshark-record kshark-gui RUNTIME DESTINATION ${_INSTALL_PREFIX}/bin/ COMPONENT kernelshark LIBRARY DESTINATION ${_LIBDIR} COMPONENT kernelshark) install(FILES "${KS_DIR}/${KS_APP_NAME}.desktop" DESTINATION ${_INSTALL_PREFIX}/share/applications/ COMPONENT kernelshark) install(FILES "${KS_DIR}/icons/${KS_ICON}" "${KS_DIR}/icons/${KS_ICON_FIN}" DESTINATION ${_INSTALL_PREFIX}/share/icons/${KS_APP_NAME} COMPONENT kernelshark) install(FILES "${KS_DIR}/org.freedesktop.kshark-record.policy" DESTINATION ${_POLKIT_INSTALL_PREFIX}/share/polkit-1/actions/ COMPONENT polkit-policy) install(PROGRAMS "${KS_DIR}/bin/kshark-su-record" DESTINATION ${_INSTALL_PREFIX}/bin/ COMPONENT kernelshark) install(FILES "${KS_DIR}/src/KsPluginsGUI.hpp" DESTINATION ${KS_INCLUDS_DESTINATION} COMPONENT libkshark-devel) add_subdirectory(plugins) set(PLUGINS ${PLUGINS} PARENT_SCOPE) find_program(DO_AS_ROOT pkexec) endif () kernel-shark-kernelshark-v2.4.0/src/KsAdvFilteringDialog.cpp000066400000000000000000000271701477354127100241110ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsAdvFilteringDialog.cpp * @brief GUI Dialog for Advanced filtering settings. */ // KernelShark #include "libkshark.h" #include "libkshark-tepdata.h" #include "KsUtils.hpp" #include "KsAdvFilteringDialog.hpp" using namespace KsWidgetsLib; /** Create dialog for Advanced Filtering. */ KsAdvFilteringDialog::KsAdvFilteringDialog(QWidget *parent) : QDialog(parent), _condToolBar1(this), _condToolBar2(this), _condToolBar3(this), _descrLabel(this), _sysEvLabel("System/Event: ", &_condToolBar1), _opsLabel("Operator: ", this), _fieldLabel("Field: ", this), _systemComboBox(&_condToolBar1), _eventComboBox(&_condToolBar1), _opsComboBox(&_condToolBar2), _fieldComboBox(&_condToolBar3), _filterEdit(this), _helpButton("Show Help", this), _insertEvtButton("Insert", this), _insertOpButton("Insert", this), _insertFieldButton("Insert", this), _applyButton("Apply", this), _cancelButton("Cancel", this) { struct kshark_context *kshark_ctx(NULL); int buttonWidth; if (!kshark_instance(&kshark_ctx)) return; auto lamAddLine = [&] { QFrame* line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); _topLayout.addWidget(line); }; setMinimumWidth(FONT_WIDTH * 80); buttonWidth = STRING_WIDTH("--Show Help--"); _helpButton.setFixedWidth(buttonWidth); _helpButton.setDefault(false); _topLayout.addWidget(&_helpButton); connect(&_helpButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_help); _descrLabel.setText(_description()); _topLayout.addWidget(&_descrLabel); /* * For the moment do not show the syntax description. It will be shown * only if the "Show Help" button is clicked. */ _descrLabel.hide(); lamAddLine(); _topLayout.addWidget(&_streamComboBox); _getFtraceStreams(kshark_ctx); _getFilters(kshark_ctx); if (_filters.count()) { _makeFilterTable(); lamAddLine(); } _condToolBar1.addWidget(&_sysEvLabel); _condToolBar1.addWidget(&_systemComboBox); _condToolBar1.addWidget(&_eventComboBox); connect(&_systemComboBox, &QComboBox::currentIndexChanged, this, &KsAdvFilteringDialog::_systemChanged); connect(&_eventComboBox, &QComboBox::currentIndexChanged, this, &KsAdvFilteringDialog::_eventChanged); _setSystemCombo(kshark_ctx); _condToolBar1.addSeparator(); _condToolBar1.addWidget(&_insertEvtButton); _topLayout.addWidget(&_condToolBar1); _opsComboBox.addItems(_operators()); _condToolBar2.addWidget(&_opsLabel); _condToolBar2.addWidget(&_opsComboBox); _condToolBar2.addSeparator(); _condToolBar2.addWidget(&_insertOpButton); _topLayout.addWidget(&_condToolBar2); _condToolBar3.addWidget(&_fieldLabel); _condToolBar3.addWidget(&_fieldComboBox); _condToolBar3.addSeparator(); _condToolBar3.addWidget(&_insertFieldButton); _topLayout.addWidget(&_condToolBar3); lamAddLine(); _filterEdit.setMinimumWidth(50 * FONT_WIDTH); _topLayout.addWidget(&_filterEdit); this->setLayout(&_topLayout); buttonWidth = STRING_WIDTH("--Cancel--"); _applyButton.setFixedWidth(buttonWidth); _applyButton.setDefault(true); _cancelButton.setFixedWidth(buttonWidth); _buttonLayout.addWidget(&_applyButton); _buttonLayout.addWidget(&_cancelButton); _buttonLayout.setAlignment(Qt::AlignLeft); _topLayout.addLayout(&_buttonLayout); connect(&_insertEvtButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_insertEvt); connect(&_insertOpButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_insertOperator); connect(&_insertFieldButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_insertField); _applyButtonConnection = connect(&_applyButton, &QPushButton::pressed, this, &KsAdvFilteringDialog::_applyPress); connect(&_applyButton, &QPushButton::pressed, this, &QWidget::close); connect(&_cancelButton, &QPushButton::pressed, this, &QWidget::close); } kshark_data_stream * KsAdvFilteringDialog::_getCurrentStream(kshark_context *kshark_ctx) { int sd = _streamComboBox.currentData().toInt(); return kshark_get_data_stream(kshark_ctx, sd); } void KsAdvFilteringDialog::_setSystemCombo(kshark_context *kshark_ctx) { kshark_data_stream *stream; QVector eventIds; QStringList sysList; int i(0); stream = _getCurrentStream(kshark_ctx); if (!stream || !kshark_is_tep(stream)) return; eventIds = KsUtils::getEventIdList(stream->stream_id); auto lamGetSysName = [&stream] (int eventId) { QStringList name = KsUtils::getTepEvtName(stream->stream_id, eventId); return name[0]; }; while (i < stream->n_events) { QString sysName = lamGetSysName(eventIds[i]); sysList << sysName; while (sysName == lamGetSysName(eventIds[i])) { if (++i == stream->n_events) break; } } std::sort(sysList.begin(), sysList.end()); _systemComboBox.addItems(sysList); i = _systemComboBox.findText("ftrace"); if (i >= 0) _systemComboBox.setCurrentIndex(i); } QString KsAdvFilteringDialog::_description() { QString descrText = "Usage:\n"; descrText += " [,] : [!][(][)]"; descrText += "[&&/|| [(][)]]\n\n"; descrText += "Examples:\n\n"; descrText += " sched/sched_switch : next_prio < 100 && (prev_prio > 100"; descrText += "&& prev_pid != 0)\n\n"; descrText += " irq.* : irq != 38\n\n"; descrText += " .* : common_pid == 1234\n"; return descrText; } QStringList KsAdvFilteringDialog::_operators() { QStringList OpsList; OpsList << ":" << "," << "==" << "!=" << ">" << "<" << ">=" << "<="; OpsList << "=~" << "!~" << "!" << "(" << ")" << "+" << "-"; OpsList << "*" << "/" << "<<" << ">>" << "&&" << "||" << "&"; return OpsList; } void KsAdvFilteringDialog::_getFtraceStreams(kshark_context *kshark_ctx) { kshark_data_stream *stream; QVector streamIds; _streamComboBox.clear(); streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { stream = kshark_ctx->stream[sd]; if (kshark_is_tep(stream)) _streamComboBox.addItem(KsUtils::streamDescription(stream), sd); } if (!_streamComboBox.count()) _streamComboBox.addItem("No FTRACE data loaded", -1); } void KsAdvFilteringDialog::_getFilters(kshark_context *kshark_ctx) { kshark_data_stream *stream; QVector eventIds; QStringList eventName; char *filterStr; stream = _getCurrentStream(kshark_ctx); if (!stream || !kshark_is_tep(stream)) return; eventIds = KsUtils::getEventIdList(stream->stream_id); for (int i = 0; i < stream->n_events; ++i) { eventName = KsUtils::getTepEvtName(stream->stream_id, eventIds[i]); filterStr = kshark_tep_filter_make_string(stream, eventIds[i]); if (!filterStr) continue; _filters.insert(eventIds[i], QString("%1:%2/%3:%4").arg(QString::number(stream->stream_id), eventName[0], eventName[1], filterStr)); free(filterStr); } } void KsAdvFilteringDialog::_makeFilterTable() { QMapIterator f(_filters); QTableWidgetItem *i1, *i2, *i3; QStringList headers; int count(0); _table = new KsCheckBoxTable(this); _table->setSelectionMode(QAbstractItemView::SingleSelection); headers << "Delete" << "Stream" << "Event" << " Id" << "Filter"; _table->init(headers, _filters.count()); for (auto it = _filters.cbegin(), end = _filters.cend(); it != end; ++it) { QStringList thisFilter = it.value().split(":"); i1 = new QTableWidgetItem(thisFilter[0]); _table->setItem(count, 1, i1); i1 = new QTableWidgetItem(thisFilter[1]); _table->setItem(count, 2, i1); i2 = new QTableWidgetItem(tr("%1").arg(it.key())); _table->setItem(count, 3, i2); i3 = new QTableWidgetItem(thisFilter[2]); _table->setItem(count, 4, i3); ++count; } _table->setVisible(false); _table->resizeColumnsToContents(); _table->setVisible(true); _topLayout.addWidget(_table); } void KsAdvFilteringDialog::_help() { if (_descrLabel.isVisible()) { _descrLabel.hide(); QApplication::processEvents(); _helpButton.setText("Show Help"); resize(width(), _noHelpHeight); } else { _helpButton.setText("Hide Help"); _noHelpHeight = height(); _descrLabel.show(); } } void KsAdvFilteringDialog::_systemChanged(int) { QString sysName = _systemComboBox.currentText(); kshark_context *kshark_ctx(NULL); kshark_data_stream *stream; QStringList evtsList, name; QVector eventIds; int i; if (!kshark_instance(&kshark_ctx)) return; _eventComboBox.clear(); stream = _getCurrentStream(kshark_ctx); if (!stream || !kshark_is_tep(stream)) return; eventIds = KsUtils::getEventIdList(stream->stream_id); for (i = 0; i < stream->n_events; ++i) { name = KsUtils::getTepEvtName(stream->stream_id, eventIds[i]); if (sysName == name[0]) evtsList << name[1]; } std::sort(evtsList.begin(), evtsList.end()); _eventComboBox.addItems(evtsList); i = _eventComboBox.findText("function"); if (i >= 0) _eventComboBox.setCurrentIndex(i); } QStringList KsAdvFilteringDialog::_getEventFields(int eventId) { kshark_context *kshark_ctx(NULL); kshark_data_stream *stream; QStringList fieldList; if (!kshark_instance(&kshark_ctx)) return {}; stream = _getCurrentStream(kshark_ctx); if (!stream || !kshark_is_tep(stream)) return {}; fieldList = KsUtils::getEventFieldsList(stream->stream_id, eventId); std::sort(fieldList.begin(), fieldList.end()); return fieldList; } void KsAdvFilteringDialog::_eventChanged(int) { QString sysName = _systemComboBox.currentText(); QString evtName = _eventComboBox.currentText(); QStringList fieldList, eventName; kshark_context *kshark_ctx(NULL); kshark_data_stream *stream; QVector eventIds; _fieldComboBox.clear(); if (!kshark_instance(&kshark_ctx)) return; stream = _getCurrentStream(kshark_ctx); if (!stream || !kshark_is_tep(stream)) return; eventIds = KsUtils::getEventIdList(stream->stream_id); for (int i = 0; i < stream->n_events; ++i) { eventName = KsUtils::getTepEvtName(stream->stream_id, eventIds[i]); if (sysName == eventName[0] && evtName == eventName[1]) { fieldList = _getEventFields(eventIds[i]); _fieldComboBox.addItems(fieldList); return; } } } void KsAdvFilteringDialog::_insertEvt() { QString text = _filterEdit.text(); auto set_evt = [&] () { text += _systemComboBox.currentText(); text += "/"; text += _eventComboBox.currentText(); }; if (text == "") { set_evt(); text += ":"; } else { QString evt = text; text = ""; set_evt(); text += ","; text += evt; } _filterEdit.setText(text); } void KsAdvFilteringDialog::_insertOperator() { QString text = _filterEdit.text(); text += _opsComboBox.currentText(); _filterEdit.setText(text); } void KsAdvFilteringDialog::_insertField() { QString text = _filterEdit.text(); text += _fieldComboBox.currentText(); _filterEdit.setText(text); } void KsAdvFilteringDialog::_applyPress() { QMapIterator f(_filters); kshark_context *kshark_ctx(NULL); kshark_data_stream *stream; int i(0); if (!kshark_instance(&kshark_ctx)) return; stream = _getCurrentStream(kshark_ctx); if (!stream || !kshark_is_tep(stream)) return; while (f.hasNext()) { f.next(); if (_table->_cb[i]->checkState() == Qt::Checked) { kshark_data_stream *filter_stream; int sd = f.value().split(":").at(0).toInt(); filter_stream = kshark_get_data_stream(kshark_ctx, sd); kshark_tep_filter_remove_event(filter_stream, f.key()); } ++i; } auto job_done = [&]() { /* * Disconnect Apply button. This is done in order to protect * against multiple clicks. */ disconnect(_applyButtonConnection); emit dataReload(); }; QByteArray filter = _filterEdit.text().toLocal8Bit(); if (filter.isEmpty()) { job_done(); return; } kshark_tep_add_filter_str(stream, filter.constData()); job_done(); } kernel-shark-kernelshark-v2.4.0/src/KsAdvFilteringDialog.hpp000066400000000000000000000034761477354127100241210ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsAdvFilteringDialog.hpp * @brief GUI Dialog for Advanced filtering settings. */ #ifndef _KS_ADV_FILTERING_DIALOG_H #define _KS_ADV_FILTERING_DIALOG_H // Qt #include // KernelShark #include "KsWidgetsLib.hpp" /** * The KsAdvFilteringDialog class provides a dialog for Advanced filtering. */ class KsAdvFilteringDialog : public QDialog { Q_OBJECT public: explicit KsAdvFilteringDialog(QWidget *parent = nullptr); signals: /** Signal emitted when the _apply button of the dialog is pressed. */ void dataReload(); private: int _noHelpHeight; QMap _filters; KsWidgetsLib::KsCheckBoxTable *_table; QVBoxLayout _topLayout; QHBoxLayout _buttonLayout; QToolBar _condToolBar1, _condToolBar2, _condToolBar3; QLabel _descrLabel, _sysEvLabel, _opsLabel, _fieldLabel; QComboBox _streamComboBox; QComboBox _systemComboBox, _eventComboBox; QComboBox _opsComboBox, _fieldComboBox; QLineEdit _filterEdit; QPushButton _helpButton; QPushButton _insertEvtButton, _insertOpButton, _insertFieldButton; QPushButton _applyButton, _cancelButton; QMetaObject::Connection _applyButtonConnection; void _help(); void _applyPress(); void _insertEvt(); void _insertOperator(); void _insertField(); QString _description(); QStringList _operators(); void _getFtraceStreams(kshark_context *kshark_ctx); void _getFilters(kshark_context *kshark_ctx); void _makeFilterTable(); QStringList _getEventFields(int eventId); void _setSystemCombo(kshark_context *kshark_ctx); kshark_data_stream *_getCurrentStream(kshark_context *kshark_ctx); private slots: void _systemChanged(int); void _eventChanged(int); }; #endif // _KS_ADV_FILTERING_DIALOG_H kernel-shark-kernelshark-v2.4.0/src/KsCaptureDialog.cpp000066400000000000000000000400151477354127100231270ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsCaptureDialog.cpp * @brief Dialog for trace data recording. */ // Qt #include // KernelShark #include "libkshark.h" #include "libkshark-tepdata.h" #include "KsUtils.hpp" #include "KsCmakeDef.hpp" #include "KsCaptureDialog.hpp" extern "C" { // To get access to geteuid() #include #include } /** * @brief Create KsCommandLineEdit. * * @param text: Defaulst text to be shown. * @param parent: The parent of this widget. */ KsCommandLineEdit::KsCommandLineEdit(QString text, QWidget *parent) : QPlainTextEdit(text, parent) {} QSize KsCommandLineEdit::minimumSizeHint() const { return {FONT_WIDTH * 30, FONT_HEIGHT * 2}; } QSize KsCommandLineEdit::sizeHint() const { return {FONT_WIDTH * 30, FONT_HEIGHT * 3}; } static kshark_data_stream *_initLocalStream() { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; int sd; if (!kshark_instance(&kshark_ctx)) return nullptr; sd = kshark_add_stream(kshark_ctx); stream = kshark_ctx->stream[sd]; kshark_tep_init_local(stream); return stream; } /** @brief Create KsCaptureControl widget. */ KsCaptureControl::KsCaptureControl(QWidget *parent) : QWidget(parent), _stream(_initLocalStream()), _eventsWidget(_stream), _pluginsLabel("Plugin: ", this), _outputLabel("Output file: ", this), _commandLabel("Command: ", this), _outputLineEdit("trace.dat", this), _commandLineEdit("sleep 0.1", this), _settingsToolBar(this), _controlToolBar(this), _pluginsComboBox(this), _importSettingsButton("Import Settings", this), _exportSettingsButton("Export Settings", this), _outputBrowseButton("Browse", this), _commandCheckBox("Display output", this), _captureButton("Capture", &_controlToolBar), _applyButton("Apply", &_controlToolBar), _closeButton("Close", &_controlToolBar) { QStringList pluginList = _getPlugins(); int row(0); auto lamAddLine = [&] { QFrame* line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); _topLayout.addWidget(line); }; if (pluginList.count() == 0 || !kshark_get_tep(_stream)) { /* * No plugins or events have been found. Most likely this is * because the process has no Root privileges or because * tracefs cannot be mounted. */ QString message("Error: No events or plugins found.\n"); if (!kshark_get_tep(_stream)) message += "Cannot find or mount tracing directory.\n"; // geteuid() returns 0 if running as effective id of root if (!pluginList.count() && geteuid()) message += "Root privileges are required.\n"; QLabel *errorLabel = new QLabel(message); errorLabel->setStyleSheet("QLabel {color : red;}"); _topLayout.addWidget(errorLabel); lamAddLine(); /* Disable "Capture" buttons. */ _captureButton.setDisabled(true); } pluginList.prepend("nop"); _settingsToolBar.addWidget(&_importSettingsButton); _settingsToolBar.addSeparator(); _settingsToolBar.addWidget(&_exportSettingsButton); _topLayout.addWidget(&_settingsToolBar); lamAddLine(); _eventsWidget.setDefault(false); _eventsWidget.setMinimumHeight(25 * FONT_HEIGHT); _eventsWidget.removeSystem("ftrace"); _topLayout.addWidget(&_eventsWidget); _pluginsLabel.adjustSize(); _execLayout.addWidget(&_pluginsLabel, row, 0); _pluginsComboBox.addItems(pluginList); _execLayout.addWidget(&_pluginsComboBox, row++, 1); _outputLabel.adjustSize(); _execLayout.addWidget(&_outputLabel, row, 0); _outputLineEdit.setFixedWidth(FONT_WIDTH * 30); _execLayout.addWidget(&_outputLineEdit, row, 1); _outputBrowseButton.adjustSize(); _execLayout.addWidget(&_outputBrowseButton, row++, 2); _commandLabel.adjustSize(); _commandLabel.setFixedWidth(_outputLabel.width()); _execLayout.addWidget(&_commandLabel, row, 0); _commandLineEdit.setFixedWidth(FONT_WIDTH * 30); _commandLineEdit.setMinimumHeight(FONT_HEIGHT * 2); _commandLineEdit.setMaximumHeight(FONT_HEIGHT * 9); _execLayout.addWidget(&_commandLineEdit, row, 1); _commandCheckBox.setCheckState(Qt::Unchecked); _commandCheckBox.adjustSize(); _execLayout.addWidget(&_commandCheckBox, row++, 2); _topLayout.addLayout(&_execLayout); lamAddLine(); _captureButton.setFixedWidth(STRING_WIDTH("_Capture_") + FONT_WIDTH * 2); _applyButton.setFixedWidth(_captureButton.width()); _closeButton.setFixedWidth(_captureButton.width()); _controlToolBar.addWidget(&_captureButton); _controlToolBar.addWidget(&_applyButton); _controlToolBar.addWidget(&_closeButton); _topLayout.addWidget(&_controlToolBar); setLayout(&_topLayout); connect(&_importSettingsButton, &QPushButton::pressed, this, &KsCaptureControl::_importSettings); connect(&_exportSettingsButton, &QPushButton::pressed, this, &KsCaptureControl::_exportSettings); connect(&_outputBrowseButton, &QPushButton::pressed, this, &KsCaptureControl::_browse); connect(&_applyButton, &QPushButton::pressed, this, &KsCaptureControl::_apply); } /** * Use the settings of the Control panel to generate a list of command line * arguments for trace-cmd. */ QStringList KsCaptureControl::getArgs() { QStringList argv; argv << "record"; if (_pluginsComboBox.currentText() != "nop") argv << "-p" << _pluginsComboBox.currentText(); if (_eventsWidget.all()) argv << "-e" << "all"; else argv << _eventsWidget.getCheckedEvents(true); argv << "-o" << outputFileName(); argv << KsUtils::splitArguments(_commandLineEdit.toPlainText()); return argv; } QStringList KsCaptureControl::_getPlugins() { QStringList pluginList; char **all_tracers; all_tracers = kshark_tracecmd_local_plugins(); if (!all_tracers) return pluginList; for (int i = 0; all_tracers[i]; ++i) pluginList << all_tracers[i]; kshark_tracecmd_plugin_list_free(all_tracers); std::sort(pluginList.begin(), pluginList.end()); return pluginList; } void KsCaptureControl::_importSettings() { QVector event_ids = _eventsWidget.getIds(); QVector status(_stream->n_events, 0); kshark_config_doc *conf, *jevents, *temp; kshark_hash_id *eventHash; QString fileName; int nIds; auto lamImportError = [this] () { emit print("ERROR: Unable to load the configuration file.\n"); }; /* Get the configuration document. */ fileName = KsUtils::getFile(this, "Import from Filter", "Kernel Shark Config files (*.json);;", _lastFilePath); if (fileName.isEmpty()) { lamImportError(); return; } conf = kshark_open_config_file(fileName.toStdString().c_str(), "kshark.config.record"); if (!conf) { lamImportError(); return; } /* * Load the hash table of selected events from the configuration * document. */ jevents = kshark_config_alloc(KS_CONFIG_JSON); if (!kshark_config_doc_get(conf, "Events", jevents)) { lamImportError(); return; } eventHash = kshark_get_filter(_stream, KS_SHOW_EVENT_FILTER); nIds = kshark_import_event_filter(_stream, KS_SHOW_EVENT_FILTER, "Events", jevents); if (nIds < 0) { QString err("WARNING: "); err += "Some of the imported events are not available on this system.\n"; err += "All missing events are ignored.\n"; emit print(err); } for (int i = 0; i < _stream->n_events; ++i) { if (kshark_hash_id_find(eventHash, event_ids[i])) status[i] = true; } _eventsWidget.set(status); /** Get all available plugins. */ temp = kshark_string_config_alloc(); if (kshark_config_doc_get(conf, "Plugin", temp)) { const char *plugin = KS_C_STR_CAST(temp->conf_doc); int pluginIndex = _pluginsComboBox.findText(plugin); if (pluginIndex >= 0) { _pluginsComboBox.setCurrentText(KS_C_STR_CAST(temp->conf_doc)); } else { QString err("WARNING: The tracer plugin \""); err += plugin; err += "\" is not available on this machine!\n"; emit print(err); } } if (kshark_config_doc_get(conf, "Output", temp)) _outputLineEdit.setText(KS_C_STR_CAST(temp->conf_doc)); if (kshark_config_doc_get(conf, "Command", temp)) _commandLineEdit.setPlainText(KS_C_STR_CAST(temp->conf_doc)); } void KsCaptureControl::_exportSettings() { kshark_config_doc *conf, *events; json_object *jplugin; QString plugin, out, comm; QVector ids; QString fileName; fileName = KsUtils::getSaveFile(this, "Export to File", "Kernel Shark Config files (*.json);;", ".json", _lastFilePath); if (fileName.isEmpty()) return; /* Create a configuration document. */ conf = kshark_record_config_new(KS_CONFIG_JSON); events = kshark_filter_config_new(KS_CONFIG_JSON); /* * Use the kshark_hash_id to save all selected events in the * configuration file. */ ids = _eventsWidget.getCheckedIds(); kshark_hash_id *eventHash = kshark_get_filter(_stream, KS_SHOW_EVENT_FILTER); for (auto const &id: ids) kshark_hash_id_add(eventHash, id); kshark_export_event_filter(_stream, KS_SHOW_EVENT_FILTER, "Events", events); kshark_config_doc_add(conf, "Events", events); kshark_hash_id_free(eventHash); /* Save the plugin. */ plugin = _pluginsComboBox.currentText(); jplugin = json_object_new_string(plugin.toStdString().c_str()); kshark_config_doc_add(conf, "Plugin", kshark_json_to_conf(jplugin)); /* Save the output file. */ out = outputFileName(); json_object *jout = json_object_new_string(out.toStdString().c_str()); kshark_config_doc_add(conf, "Output", kshark_json_to_conf(jout)); /* Save the command. */ comm = _commandLineEdit.toPlainText(); json_object *jcomm = json_object_new_string(comm.toStdString().c_str()); kshark_config_doc_add(conf, "Command", kshark_json_to_conf(jcomm)); kshark_save_config_file(fileName.toStdString().c_str(), conf); } void KsCaptureControl::_browse() { QString fileName = KsUtils::getSaveFile(this, "Save File", "trace-cmd files (*.dat);;All files (*)", ".dat", _lastFilePath); if (!fileName.isEmpty()) _outputLineEdit.setText(fileName); } void KsCaptureControl::_apply() { QStringList argv = getArgs(); if (argv.count()) emit argsReady(argv.join(" ")); } /** @brief Create KsCaptureMonitor widget. */ KsCaptureMonitor::KsCaptureMonitor(QWidget *parent) : QWidget(parent), _mergedChannels(false), _argsModified(false), _panel(this), _name("Output display", this), _space("max size ", this), _readOnlyCB("read only", this), _maxLinNumEdit(QString("%1").arg(KS_CAP_MON_MAX_LINE_NUM), this), _consolOutput("", this) { _panel.setMaximumHeight(FONT_HEIGHT * 1.75); _panel.addWidget(&_name); _space.setAlignment(Qt::AlignRight); _panel.addWidget(&_space); _maxLinNumEdit.setFixedWidth(FONT_WIDTH * 7); _panel.addWidget(&_maxLinNumEdit); _panel.addSeparator(); _readOnlyCB.setCheckState(Qt::Checked); _panel.addWidget(&_readOnlyCB); _layout.addWidget(&_panel); _consolOutput.setStyleSheet("QLabel {background-color : white;}"); _consolOutput.setMinimumWidth(FONT_WIDTH * 60); _consolOutput.setMinimumHeight(FONT_HEIGHT * 10); _consolOutput.setMaximumBlockCount(KS_CAP_MON_MAX_LINE_NUM); _space.setMinimumWidth(FONT_WIDTH * 50 - _name.width() - _readOnlyCB.width()); _consolOutput.setReadOnly(true); _layout.addWidget(&_consolOutput); this->setLayout(&_layout); connect(&_maxLinNumEdit, &QLineEdit::textChanged, this, &KsCaptureMonitor::_maxLineNumber); connect(&_readOnlyCB, &QCheckBox::stateChanged, this, &KsCaptureMonitor::_readOnly); connect(&_consolOutput, &QPlainTextEdit::textChanged, this, &KsCaptureMonitor::_argVModified); this->show(); } void KsCaptureMonitor::_maxLineNumber(const QString &test) { bool ok; int max = test.toInt(&ok); if (ok) _consolOutput.setMaximumBlockCount(max); } void KsCaptureMonitor::_readOnly(int state) { if (state == Qt::Checked) _consolOutput.setReadOnly(true); else _consolOutput.setReadOnly(false); } void KsCaptureMonitor::_argsReady(const QString &args) { _name.setText("Capture options:"); _consolOutput.setPlainText(args); _argsModified = false; } void KsCaptureMonitor::_argVModified() { _argsModified = true; } void KsCaptureMonitor::_printAllStandardError() { QProcess *_capture = (QProcess*) sender(); _consolOutput.moveCursor(QTextCursor::End); _consolOutput.insertPlainText(_capture->readAllStandardError()); _consolOutput.moveCursor(QTextCursor::End); QCoreApplication::processEvents(); } void KsCaptureMonitor::_printAllStandardOutput() { QProcess *_capture = (QProcess*) sender(); if (!_mergedChannels) return; _consolOutput.appendPlainText(_capture->readAllStandardOutput()); QCoreApplication::processEvents(); } /** * Connect the Capture monitor widget to the signals of the recording process. */ void KsCaptureMonitor::connectMe(QProcess *proc, KsCaptureControl *ctrl) { connect(proc, &QProcess::started, this, &KsCaptureMonitor::_captureStarted); connect(proc, &QProcess::finished, this, &KsCaptureMonitor::_captureFinished); connect(proc, &QProcess::readyReadStandardError, this, &KsCaptureMonitor::_printAllStandardError); connect(proc, &QProcess::readyReadStandardOutput, this, &KsCaptureMonitor::_printAllStandardOutput); connect(ctrl, &KsCaptureControl::argsReady, this, &KsCaptureMonitor::_argsReady); connect(ctrl, &KsCaptureControl::print, this, &KsCaptureMonitor::print); } void KsCaptureMonitor::_captureStarted() { _name.setText("Terminal output:"); _readOnlyCB.setCheckState(Qt::Checked); QCoreApplication::processEvents(); } void KsCaptureMonitor::_captureFinished(int exit, QProcess::ExitStatus status) { QProcess *_capture = (QProcess *)sender(); if (exit != 0 || status != QProcess::NormalExit) { QString errMessage("Capture process failed: "); errMessage += _capture->errorString(); _consolOutput.appendPlainText(errMessage); QCoreApplication::processEvents(); } } /** Print a message. */ void KsCaptureMonitor::print(const QString &message) { _consolOutput.appendPlainText(message); } /** @brief Create KsCaptureDialog widget. */ KsCaptureDialog::KsCaptureDialog(QWidget *parent) : QWidget(parent), _captureCtrl(this), _captureMon(this), _captureProc(this) { QString captureExe; this->setWindowTitle("Capture"); _layout.addWidget(&_captureCtrl); _layout.addWidget(&_captureMon); this->setLayout(&_layout); connect(&_captureCtrl._commandCheckBox, &QCheckBox::stateChanged, this, &KsCaptureDialog::_setChannelMode); connect(&_captureCtrl._captureButton, &QPushButton::pressed, this, &KsCaptureDialog::_capture); connect(&_captureCtrl._closeButton, &QPushButton::pressed, this, &KsCaptureDialog::close); if (!KsUtils::isInstalled()) captureExe = QString(_INSTALL_PREFIX) + QString("/bin/trace-cmd"); else captureExe = TRACECMD_EXECUTABLE; _captureProc.setProgram(captureExe); _captureMon.connectMe(&_captureProc, &_captureCtrl); } void KsCaptureDialog::_capture() { QStringList argv; int argc; if(_captureMon._argsModified) { argv = KsUtils::splitArguments(_captureMon.text()); } else { argv = _captureCtrl.getArgs(); } _captureMon.print("\n"); _captureMon.print(QString("trace-cmd " + argv.join(" ") + "\n")); _captureProc.setArguments(argv); _captureProc.start(); _captureProc.waitForFinished(); /* Reset the _argsModified flag. */ _captureMon._argsModified = false; if (_captureProc.exitCode() != 0 || _captureProc.exitStatus() != QProcess::NormalExit) return; /* * Capture finished successfully. Open the produced tracing data file * in KernelShark. */ argc = argv.count(); for (int i = 0; i < argc; ++i) { if (argv[i] == "-o") { _sendOpenReq(argv[i + 1]); break; } } } void KsCaptureDialog::_setChannelMode(int state) { if (state > 0) { _captureMon._mergedChannels = true; } else { _captureMon._mergedChannels = false; } } void KsCaptureDialog::_sendOpenReq(const QString &fileName) { QLocalSocket *socket; socket = new QLocalSocket(this); socket->connectToServer("KSCapture", QIODevice::WriteOnly); if (socket->waitForConnected()) { QByteArray block; QDataStream out(&block, QIODevice::WriteOnly); const QString message = fileName; out << quint32(message.size()); out << message; socket->write(block); socket->flush(); socket->disconnectFromServer(); } else { QString error(socket->errorString()); error += "\n(maybe KernelShark GUI is not open)"; _captureMon.print(error); } } kernel-shark-kernelshark-v2.4.0/src/KsCaptureDialog.hpp000066400000000000000000000102331477354127100231330ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsCaptureDialog.hpp * @brief Dialog for trace data recording. */ #ifndef _KS_CAPTURE_H #define _KS_CAPTURE_H // Qt #include // KernelShark #include "KsWidgetsLib.hpp" /** * The KsCommandLineEdit class is used to override the default size hints of * the QPlainTextEdit class. */ struct KsCommandLineEdit : public QPlainTextEdit { KsCommandLineEdit(QString text, QWidget *parent = 0); private: QSize sizeHint() const override; QSize minimumSizeHint() const override; }; /** * The KsCaptureControl class provides a control panel for the KernelShark * Capture dialog. */ class KsCaptureControl : public QWidget { Q_OBJECT public: explicit KsCaptureControl(QWidget *parent = 0); QStringList getArgs(); /** Get the name of the tracing data output file. */ QString outputFileName() const {return _outputLineEdit.text();} /** Set the name of the tracing data output file. */ void setOutputFileName(const QString &f) {_outputLineEdit.setText(f);} signals: /** This signal is emitted when the "Apply" button is pressed. */ void argsReady(const QString &args); /** * This signal is emitted when text has to be printed on the * KsCaptureMonitor widget. */ void print(const QString &message); private: kshark_data_stream *_stream; KsWidgetsLib::KsEventsCheckBoxWidget _eventsWidget; QVBoxLayout _topLayout; QGridLayout _execLayout; QLabel _pluginsLabel, _outputLabel, _commandLabel; QLineEdit _outputLineEdit; KsCommandLineEdit _commandLineEdit; QToolBar _settingsToolBar, _controlToolBar; QComboBox _pluginsComboBox; QPushButton _importSettingsButton, _exportSettingsButton; QPushButton _outputBrowseButton; QString _lastFilePath; QStringList _getPlugins(); void _importSettings(); void _exportSettings(); void _browse(); void _apply(); public: /** * A Check box used to indicate if the output of the command needs to * be shown by the KsCaptureMonitor widget. */ QCheckBox _commandCheckBox; /** Capture button for the control panel. */ QPushButton _captureButton; /** Apply button for the control panel. */ QPushButton _applyButton; /** Close button for the control panel. */ QPushButton _closeButton; }; /** * The KsCaptureMonitor class provides a terminal-like widget for monitoring * the tracing data recording process. */ class KsCaptureMonitor : public QWidget { Q_OBJECT public: explicit KsCaptureMonitor(QWidget *parent = 0); /** Get the text shown by the widget. */ QString text() const {return _consolOutput.toPlainText();} /** Clear the text shown by the widget. */ void clear() {_consolOutput.clear();} void print(const QString &message); void connectMe(QProcess *proc, KsCaptureControl *ctrl); /** A flag indicating if the stdout and stderr channels are _merged. */ bool _mergedChannels; /** * A flag indicating, if the list of the command line arguments for trace-cmd * has been edited by the user. */ bool _argsModified; private: QVBoxLayout _layout; QToolBar _panel; QLabel _name, _space; QCheckBox _readOnlyCB; QLineEdit _maxLinNumEdit; QPlainTextEdit _consolOutput; void _argsReady(const QString &test); void _maxLineNumber(const QString &test); void _readOnly(int); void _argVModified(); void _captureStarted(); void _printAllStandardError(); void _printAllStandardOutput(); private slots: void _captureFinished(int, QProcess::ExitStatus); }; /** Default number of lines shown by the KsCaptureMonitor widget. */ #define KS_CAP_MON_MAX_LINE_NUM 200 /** * The KsCaptureDialog class provides a dialog for recording of tracing data. */ class KsCaptureDialog : public QWidget { Q_OBJECT public: explicit KsCaptureDialog(QWidget *parent = 0); /** Set the name of the tracing data output file. */ void setOutputFileName(const QString &f) { _captureCtrl.setOutputFileName(f); } private: QHBoxLayout _layout; KsCaptureControl _captureCtrl; KsCaptureMonitor _captureMon; QProcess _captureProc; void _capture(); void _setChannelMode(int state); void _sendOpenReq(const QString &fileName); }; #endif // _KS_CAPTURE_H kernel-shark-kernelshark-v2.4.0/src/KsDualMarker.cpp000066400000000000000000000205571477354127100224440ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsDualMarker.cpp * @brief KernelShark Dual Marker. */ #include "KsDualMarker.hpp" #include "KsGLWidget.hpp" /** * Reimplemented handler for mouse press events. Right mouse click events will * deselect the corresponding marker. */ void KsMarkerButton::mousePressEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) { emit deselect(); return; } QPushButton::mousePressEvent(e); } /** * @brief Create KsGraphMark object. * * @param s: The Identifier of the marker (state A or state B). */ KsGraphMark::KsGraphMark(DualMarkerState s) : _color(Qt::darkGreen), _state(s) { reset(); _mark._color << _color; } /** * @brief Create KsGraphMark object. * * @param s: The Identifier of the marker (state A or state B). * @param col: The color of the marker. */ KsGraphMark::KsGraphMark(DualMarkerState s, QColor col) : _color(col), _state(s) { reset(); _mark._color << _color; } /** Reset the marker. */ void KsGraphMark::reset() { _isSet = false; _bin = -1; _pos = 0; _sd = 0; _mark._visible = false; } /** * @brief Set the marker. * * @param data: Input location for the Data Store object. * @param histo: Input location for the model descriptor. * @param pos: The index inside the data array this marker will points to. * @param sd: Data stream identifier. */ bool KsGraphMark::set(const KsDataStore &data, kshark_trace_histo *histo, ssize_t pos, int sd) { uint8_t visFlags; _isSet = true; _pos = pos; _sd = sd; _ts = data.rows()[_pos]->ts; visFlags = data.rows()[_pos]->visible; if ((visFlags & KS_TEXT_VIEW_FILTER_MASK) && (visFlags & KS_GRAPH_VIEW_FILTER_MASK)) _mark.setDashed(false); else _mark.setDashed(true); if (_ts > histo->max || _ts < histo->min) { _bin = -1; _mark._visible = false; return false; } _bin = (_ts - histo->min)/histo->bin_size; setVisible(true); return true; } /** * @brief Use this function to update the marker when the state of the model * has changed. * * @param data: Input location for the Data Store object. * @param histo: Input location for the model descriptor. */ bool KsGraphMark::update(const KsDataStore &data, kshark_trace_histo *histo) { if (!_isSet) return false; return set(data, histo, this->_pos, this->_sd); } /** Unset the Marker and make it invisible. */ void KsGraphMark::remove() { _isSet = false; setVisible(false); } /** An operator for getting the opposite state of the marker identifier. */ DualMarkerState operator!(const DualMarkerState &state) { if (state == DualMarkerState::B) return DualMarkerState::A; return DualMarkerState::B; } /** @brief Create a Dual Marker State Machine. */ KsDualMarkerSM::KsDualMarkerSM(QWidget *parent) : QWidget(parent), _buttonA("Marker A", this), _buttonB("Marker B", this), _labelDeltaDescr(" A,B Delta: ", this), _markA(DualMarkerState::A, Qt::darkGreen), _markB(DualMarkerState::B, Qt::darkCyan), _scCtrlA(this), _scCtrlB(this) { QString styleSheetA, styleSheetB; _buttonA.setFixedWidth(STRING_WIDTH(" Marker A ") + FONT_WIDTH); _buttonB.setFixedWidth(STRING_WIDTH(" Marker B ") + FONT_WIDTH); for (auto const &l: {&_labelMA, &_labelMB, &_labelDelta}) { l->setFrameStyle(QFrame::Panel | QFrame::Sunken); l->setStyleSheet("QLabel {background-color : white; color : black}"); l->setTextInteractionFlags(Qt::TextSelectableByMouse); l->setFixedWidth(FONT_WIDTH * 16); } styleSheetA = "background : " + _markA._color.name() + "; color : white"; _stateA = new QState; _stateA->setObjectName("A"); _stateA->assignProperty(&_buttonA, "styleSheet", styleSheetA); styleSheetB = "background : " + _markB._color.name() + "; color : white"; _stateB = new QState; _stateB->setObjectName("B"); _stateB->assignProperty(&_buttonB, "styleSheet", styleSheetB); /* Define transitions from State A to State B. */ _stateA->addTransition(this, &KsDualMarkerSM::machineToB, _stateB); _scCtrlA.setKey(Qt::SHIFT | Qt::Key_A); _stateA->addTransition(&_scCtrlB, &QShortcut::activated, _stateB); connect(&_scCtrlA, &QShortcut::activated, this, &KsDualMarkerSM::_doStateA); _stateA->addTransition(&_buttonB, &QPushButton::clicked, _stateB); connect(&_buttonB, &QPushButton::clicked, this, &KsDualMarkerSM::_doStateB); connect(&_buttonB, &KsMarkerButton::deselect, this, &KsDualMarkerSM::deselectB); /* Define transitions from State B to State A. */ _stateB->addTransition(this, &KsDualMarkerSM::machineToA, _stateA); _scCtrlB.setKey(Qt::SHIFT | Qt::Key_B); _stateB->addTransition(&_scCtrlA, &QShortcut::activated, _stateA); connect(&_scCtrlB, &QShortcut::activated, this, &KsDualMarkerSM::_doStateB); _stateB->addTransition(&_buttonA, &QPushButton::clicked, _stateA); connect(&_buttonA, &QPushButton::clicked, this, &KsDualMarkerSM::_doStateA); connect(&_buttonA, &KsMarkerButton::deselect, this, &KsDualMarkerSM::deselectA); _machine.setGlobalRestorePolicy(QState::RestoreProperties); _machine.addState(_stateA); _machine.addState(_stateB); _machine.setInitialState(_stateA); _markState = DualMarkerState::A; _machine.start(); } /** * Reset the Mark A and Mark B and clear the information shown by the Marker's * toolbar. */ void KsDualMarkerSM::reset() { _markA.reset(); _markB.reset(); _labelMA.setText(""); _labelMB.setText(""); _labelDelta.setText(""); } /** Restart the Dual Marker State Machine. */ void KsDualMarkerSM::restart() { _machine.stop(); reset(); _markState = DualMarkerState::A; _machine.start(); } void KsDualMarkerSM::_doStateA() { if (_markState != DualMarkerState::A) { _markState = DualMarkerState::A; emit markSwitchForView(); } else if (activeMarker()._isSet) { emit updateView(activeMarker()._pos, true); emit updateGraph(activeMarker()._pos); } } void KsDualMarkerSM::_doStateB() { if (_markState != DualMarkerState::B) { _markState = DualMarkerState::B; emit markSwitchForView(); } else if (activeMarker()._isSet) { emit updateView(activeMarker()._pos, true); emit updateGraph(activeMarker()._pos); } } /** Get the Graph marker associated with a given state. */ KsGraphMark &KsDualMarkerSM::getMarker(DualMarkerState s) { if (s == DualMarkerState::A) return _markA; return _markB; } /** Position all buttons and labels of the Dual Marker in a toolbar. */ void KsDualMarkerSM::placeInToolBar(QToolBar *tb) { tb->addWidget(new QLabel(" ")); tb->addWidget(&_buttonA); tb->addWidget(&_labelMA); tb->addSeparator(); tb->addWidget(new QLabel(" ")); tb->addWidget(&_buttonB); tb->addWidget(&_labelMB); tb->addSeparator(); tb->addWidget(&_labelDeltaDescr); tb->addWidget(&_labelDelta); } /** Set the state of the Dual Marker State Machine. */ void KsDualMarkerSM::setState(DualMarkerState st) { if (st == _markState) return; if (st == DualMarkerState::A) { emit machineToA(); _doStateA(); } if (st == DualMarkerState::B) { emit machineToB(); _doStateB(); } } /** * @brief Use this function to update the two marker when the state of the * model has changed. * * @param data: Input location for the Data Store object. * @param glw: Input location for the OpenGL widget object. */ void KsDualMarkerSM::updateMarkers(const KsDataStore &data, KsGLWidget *glw) { if(_markA.update(data, glw->model()->histo())) glw->setMarkPoints(data, &_markA); if(_markB.update(data, glw->model()->histo())) glw->setMarkPoints(data, &_markB); updateLabels(); } /** * @brief Use this function to update the labels when the state of the model * has changed. */ void KsDualMarkerSM::updateLabels() { char separator(' '); int precision(6); // 1 microsecond precision. auto lamSetTimeLabel = [&precision, &separator] (QLabel &l, int64_t t) { QString time = KsUtils::Ts2String(t, precision); int i = time.indexOf('.') + 4; /* Insert separators for milliseconds amd microseconds. */ while (i < time.size()) { time.insert(i, separator); i = i + 4; } l.setText(time); }; // Marker A if (_markA._isSet) lamSetTimeLabel(_labelMA, _markA._ts); else _labelMA.clear(); // Marker B if (_markB._isSet) lamSetTimeLabel(_labelMB, _markB._ts); else _labelMB.clear(); // Delta if (_markA._isSet && _markB._isSet) { precision = 9; // 1 nanoseconds precision. lamSetTimeLabel(_labelDelta, _markB._ts - _markA._ts); } else { _labelDelta.clear(); } } kernel-shark-kernelshark-v2.4.0/src/KsDualMarker.hpp000066400000000000000000000110521477354127100224370ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsDualMarker.hpp * @brief KernelShark Dual Marker. */ #ifndef _KS_DUAL_MARKER_H #define _KS_DUAL_MARKER_H // Qt #include #include // KernelShark #include "KsUtils.hpp" #include "KsPlotTools.hpp" /** * The Marker Button class provides a button that deselect the corresponding * marker in the case of a Right mouse click. */ class KsMarkerButton : public QPushButton { Q_OBJECT public: /** * @brief Create a default button. */ explicit KsMarkerButton(QWidget *parent = nullptr) : QPushButton(parent) {} /** * @brief Create a button with text. */ explicit KsMarkerButton(const QString &text, QWidget *parent = nullptr) : QPushButton(text, parent) {} void mousePressEvent(QMouseEvent *e); signals: /** * This signal is emitted when the button is click by the Right mouse * button. */ void deselect(); }; class KsGLWidget; /** The KsGraphMark represents a marker for KernelShark GUI. */ class KsGraphMark : public QObject { Q_OBJECT public: KsGraphMark() = delete; KsGraphMark(DualMarkerState s); KsGraphMark(DualMarkerState s, QColor col); void reset(); bool set(const KsDataStore &data, kshark_trace_histo *histo, ssize_t pos, int sd); bool update(const KsDataStore &data, kshark_trace_histo *histo); /** Is this marker visible. */ bool isVisible() const {return _mark._visible;} /** Draw this marker. */ void draw() const {_mark.draw();} /** Set the visiblity of the marker. */ void setVisible(bool v) {_mark._visible = v;} void remove(); /** Is this marker set. */ bool _isSet; /** The number of the bin this marker points to. */ int _bin; /** Data stream identifier of the Graph this marker points to. */ int _sd; /** The index inside the data array this marker points to. */ ssize_t _pos; /** The timestamp of the marker. */ int64_t _ts; /** The RGB color of the marker. */ QColor _color; /** The Identifier of the marker (A or B). */ const DualMarkerState _state; /** The graphical element of this marker. */ KsPlot::Mark _mark; }; DualMarkerState operator !(const DualMarkerState &state); /** * The DualMarkerState represents the State Machine of the KernelShark GUI * Dual Marker. */ class KsDualMarkerSM : public QWidget { Q_OBJECT public: explicit KsDualMarkerSM(QWidget *parent = nullptr); void reset(); void restart(); void placeInToolBar(QToolBar *tb); /** Get the Identifier of the current state of the State Machine. */ DualMarkerState getState() const {return _markState;} void setState(DualMarkerState st); KsGraphMark &getMarker(DualMarkerState s); /** Get the active marker. */ KsGraphMark &activeMarker() {return getMarker(_markState);} /** Get the passive marker. */ KsGraphMark &passiveMarker() {return getMarker(!_markState);} /** Get the marker A. */ KsGraphMark &markerA() {return _markA;} /** Get the marker B. */ KsGraphMark &markerB() {return _markB;} void updateMarkers(const KsDataStore &data, KsGLWidget *glw); void updateLabels(); /** Get the index inside the data array marker A points to. */ ssize_t markerAPos() {return _markA._isSet ? _markA._pos : -1;} /** Get the index inside the data array marker B points to. */ ssize_t markerBPos() {return _markB._isSet ? _markB._pos : -1;} signals: /** * This signal is emitted when the Table View has to switch the color * of the selected row. */ void markSwitchForView(); /** * This signal is emitted when the Table View has to show a different * entry (row). */ void updateView(size_t pos, bool mark); /** * This signal is emitted when the Graph mark has to show a different * entry. */ void updateGraph(size_t pos); /** * This signal is emitted when the State Machine has to switch to * state A. */ void machineToA(); /** * This signal is emitted when the State Machine has to switch to * state B. */ void machineToB(); /** * This signal is used to re-emitted the deselect signal of the * Marker A button. */ void deselectA(); /** * This signal is used to re-emitted the deselect signal of the * Marker B button. */ void deselectB(); private: KsMarkerButton _buttonA; KsMarkerButton _buttonB; QLabel _labelMA, _labelMB, _labelDelta; QLabel _labelDeltaDescr; QState *_stateA; QState *_stateB; QStateMachine _machine; DualMarkerState _markState; KsGraphMark _markA, _markB; QShortcut _scCtrlA, _scCtrlB; void _doStateA(); void _doStateB(); }; #endif kernel-shark-kernelshark-v2.4.0/src/KsGLWidget.cpp000066400000000000000000000721031477354127100220550ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsGLWidget.cpp * @brief OpenGL widget for plotting trace graphs. */ // OpenGL #include #include // OpenMP #include // KernelShark #include "libkshark-plugin.h" #include "KsGLWidget.hpp" #include "KsUtils.hpp" #include "KsPlugins.hpp" /** A stream operator for converting vector of integers into KsPlotEntry. */ KsPlotEntry &operator <<(KsPlotEntry &plot, QVector &v) { plot._streamId = v.takeFirst(); plot._type = v.takeFirst(); plot._id = v.takeFirst(); return plot; } /** A stream operator for converting KsPlotEntry into vector of integers. */ void operator >>(const KsPlotEntry &plot, QVector &v) { v.append(plot._streamId); v.append(plot._type); v.append(plot._id); } /** Create a default (empty) OpenGL widget. */ KsGLWidget::KsGLWidget(QWidget *parent) : QOpenGLWidget(parent), _labelSize(100), _hMargin(15), _vMargin(25), _vSpacing(20), _mState(nullptr), _data(nullptr), _rubberBand(QRubberBand::Rectangle, this), _rubberBandOrigin(0, 0), _dpr(1) { setMouseTracking(true); connect(&_model, &QAbstractTableModel::modelReset, this, qOverload<>(&KsGLWidget::update)); omp_set_num_threads(omp_get_num_procs()); } void KsGLWidget::_freeGraphs() { for (auto &stream: _graphs) { for (auto &g: stream) delete g; stream.resize(0); } } void KsGLWidget::freePluginShapes() { while (!_shapes.empty()) { auto s = _shapes.front(); _shapes.pop_front(); delete s; } } KsGLWidget::~KsGLWidget() { _freeGraphs(); freePluginShapes(); } /** Reimplemented function used to set up all required OpenGL resources. */ void KsGLWidget::initializeGL() { _dpr = QApplication::primaryScreen()->devicePixelRatio(); ksplot_init_opengl(_dpr); ksplot_init_font(&_font, 15, TT_FONT_FILE); _labelSize = _getMaxLabelSize() + FONT_WIDTH * 2; updateGeom(); } /** * Reimplemented function used to reprocess all graphs when the widget has * been resized. */ void KsGLWidget::resizeGL(int w, int h) { ksplot_resize_opengl(w, h); if(!_data) return; /* * From the size of the widget, calculate the number of bins. * One bin will correspond to one pixel. */ int nBins = width() - _bin0Offset() - _hMargin; if (nBins <= 0) return; /* * Reload the data. The range of the histogram is the same * but the number of bins changes. */ ksmodel_set_bining(_model.histo(), nBins, _model.histo()->min, _model.histo()->max); _model.fill(_data); } /** Reimplemented function used to plot trace graphs. */ void KsGLWidget::paintGL() { float size = 1.5 * _dpr; glClear(GL_COLOR_BUFFER_BIT); if (isEmpty()) return; render(); /* Draw the time axis. */ _drawAxisX(size); for (auto it = _graphs.cbegin(), end = _graphs.cend(); it != end; ++it) { for (auto const &g: it.value()) g->draw(size); } for (auto const &s: _shapes) { if (!s) continue; if (s->_size < 0) s->_size = size + abs(s->_size + 1); s->draw(); } /* * Update and draw the markers. Make sure that the active marker * is drawn on top. */ _mState->updateMarkers(*_data, this); _mState->passiveMarker().draw(); _mState->activeMarker().draw(); } /** Process and draw all graphs. */ void KsGLWidget::render() { /* Process and draw all graphs by using the built-in logic. */ _makeGraphs(); /* Process and draw all plugin-specific shapes. */ _makePluginShapes(); }; /** Reset (empty) the widget. */ void KsGLWidget::reset() { _streamPlots.clear(); _comboPlots.clear(); _data = nullptr; _model.reset(); } /** Reimplemented event handler used to receive mouse press events. */ void KsGLWidget::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { _posMousePress = _posInRange(event->pos().x()); _rangeBoundInit(_posMousePress); } } int KsGLWidget::_getLastTask(struct kshark_trace_histo *histo, int bin, int sd, int cpu) { kshark_context *kshark_ctx(nullptr); kshark_entry_collection *col; int pid; if (!kshark_instance(&kshark_ctx)) return KS_EMPTY_BIN; col = kshark_find_data_collection(kshark_ctx->collections, KsUtils::matchCPUVisible, sd, &cpu, 1); for (int b = bin; b >= 0; --b) { pid = ksmodel_get_pid_back(histo, b, sd, cpu, false, col, nullptr); if (pid >= 0) return pid; } return ksmodel_get_pid_back(histo, LOWER_OVERFLOW_BIN, sd, cpu, false, col, nullptr); } int KsGLWidget::_getLastCPU(struct kshark_trace_histo *histo, int bin, int sd, int pid) { kshark_context *kshark_ctx(nullptr); kshark_entry_collection *col; int cpu; if (!kshark_instance(&kshark_ctx)) return KS_EMPTY_BIN; col = kshark_find_data_collection(kshark_ctx->collections, kshark_match_pid, sd, &pid, 1); for (int b = bin; b >= 0; --b) { cpu = ksmodel_get_cpu_back(histo, b, sd, pid, false, col, nullptr); if (cpu >= 0) return cpu; } return ksmodel_get_cpu_back(histo, LOWER_OVERFLOW_BIN, sd, pid, false, col, nullptr); } /** Reimplemented event handler used to receive mouse move events. */ void KsGLWidget::mouseMoveEvent(QMouseEvent *event) { int bin, sd, cpu, pid; size_t row; bool ret; if (isEmpty()) return; if (_rubberBand.isVisible()) _rangeBoundStretched(_posInRange(event->pos().x())); bin = event->pos().x() - _bin0Offset(); getPlotInfo(event->pos(), &sd, &cpu, &pid); ret = _find(bin, sd, cpu, pid, 5, false, &row); if (ret) { emit found(row); } else { if (cpu >= 0) { pid = _getLastTask(_model.histo(), bin, sd, cpu); } if (pid > 0) { cpu = _getLastCPU(_model.histo(), bin, sd, pid); } emit notFound(ksmodel_bin_ts(_model.histo(), bin), sd, cpu, pid); } } /** Reimplemented event handler used to receive mouse release events. */ void KsGLWidget::mouseReleaseEvent(QMouseEvent *event) { if (isEmpty()) return; if (event->button() == Qt::LeftButton) { size_t posMouseRel = _posInRange(event->pos().x()); int min, max; if (_posMousePress < posMouseRel) { min = _posMousePress - _bin0Offset(); max = posMouseRel - _bin0Offset(); } else { max = _posMousePress - _bin0Offset(); min = posMouseRel - _bin0Offset(); } _rangeChanged(min, max); } } /** Reimplemented event handler used to receive mouse double click events. */ void KsGLWidget::mouseDoubleClickEvent(QMouseEvent *event) { KsPlot::PlotObject *pluginClicked(nullptr); double distance, distanceMin = FONT_HEIGHT; for (auto const &s: _shapes) { distance = s->distance(event->pos().x(), event->pos().y()); if (distance < distanceMin) { distanceMin = distance; pluginClicked = s; } } if (pluginClicked) pluginClicked->doubleClick(); else if (event->button() == Qt::LeftButton) _findAndSelect(event); } /** Reimplemented event handler used to receive mouse wheel events. */ void KsGLWidget::wheelEvent(QWheelEvent * event) { int zoomFocus; if (QApplication::keyboardModifiers() != Qt::ControlModifier || isEmpty()) return; if (_mState->activeMarker()._isSet && _mState->activeMarker().isVisible()) { /* * Use the position of the marker as a focus point for the * zoom. */ zoomFocus = _mState->activeMarker()._bin; } else { /* * Use the position of the mouse as a focus point for the * zoom. */ zoomFocus = event->position().x() - _bin0Offset(); } if (event->angleDelta().y() > 0) { _model.zoomIn(.05, zoomFocus); } else { _model.zoomOut(.05, zoomFocus); } _mState->updateMarkers(*_data, this); } /** Reimplemented event handler used to receive key press events. */ void KsGLWidget::keyPressEvent(QKeyEvent *event) { if (event->isAutoRepeat()) return; switch (event->key()) { case Qt::Key_Plus: emit zoomIn(); return; case Qt::Key_Minus: emit zoomOut(); return; case Qt::Key_Left: emit scrollLeft(); return; case Qt::Key_Right: emit scrollRight(); return; default: QOpenGLWidget::keyPressEvent(event); return; } } /** Reimplemented event handler used to receive key release events. */ void KsGLWidget::keyReleaseEvent(QKeyEvent *event) { if (event->isAutoRepeat()) return; if(event->key() == Qt::Key_Plus || event->key() == Qt::Key_Minus || event->key() == Qt::Key_Left || event->key() == Qt::Key_Right) { emit stopUpdating(); return; } QOpenGLWidget::keyPressEvent(event); return; } /** * The maximum number of CPU plots to be shown by default when the GUI starts. */ #define KS_MAX_START_PLOTS 16 void KsGLWidget::_defaultPlots(kshark_context *kshark_ctx) { struct kshark_data_stream *stream; QVector streamIds, plotVec; uint64_t tMin, tMax; int nCPUs, nBins; _model.reset(); _streamPlots.clear(); /* * Make default CPU and Task lists. All CPUs from all Data streams will * be plotted. No tasks will be plotted. */ streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { stream = kshark_ctx->stream[sd]; nCPUs = stream->n_cpus; plotVec.clear(); /* If the number of CPUs is too big show only the first 16. */ if (nCPUs > KS_MAX_START_PLOTS / kshark_ctx->n_streams) nCPUs = KS_MAX_START_PLOTS / kshark_ctx->n_streams; for (int cpu{0}; cpu < stream->n_cpus && plotVec.count() < nCPUs; ++cpu) { /* Do not add plots for idle CPUs. */ if (!kshark_hash_id_find(stream->idle_cpus, cpu)) plotVec.append(cpu); } _streamPlots[sd]._cpuList = plotVec; _streamPlots[sd]._taskList = {}; } /* * From the size of the widget, calculate the number of bins. * One bin will correspond to one pixel. */ nBins = width() - _bin0Offset() - _hMargin; if (nBins < 0) nBins = 0; /* Now load the entire set of trace data. */ tMin = _data->rows()[0]->ts; tMax = _data->rows()[_data->size() - 1]->ts; ksmodel_set_bining(_model.histo(), nBins, tMin, tMax); } /** * @brief Load and show trace data. * * @param data: Input location for the KsDataStore object. * KsDataStore::loadDataFile() must be called first. * @param resetPlots: If true, all existing graphs are closed * and a default configuration of graphs is displayed * (all CPU plots). If false, the current set of graphs * is preserved. */ void KsGLWidget::loadData(KsDataStore *data, bool resetPlots) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx) || !kshark_ctx->n_streams) return; loadColors(); _data = data; if (resetPlots) _defaultPlots(kshark_ctx); _model.fill(_data); } /** * Create a Hash table of Rainbow colors. The sorted Pid values are mapped to * the palette of Rainbow colors. */ void KsGLWidget::loadColors() { _pidColors.clear(); _pidColors = KsPlot::taskColorTable(); _cpuColors.clear(); _cpuColors = KsPlot::CPUColorTable(); _streamColors.clear(); _streamColors = KsPlot::streamColorTable(); } /** * Position the graphical elements of the marker according to the current * position of the graphs inside the GL widget. */ void KsGLWidget::setMarkPoints(const KsDataStore &data, KsGraphMark *mark) { const kshark_entry *e = data.rows()[mark->_pos]; int sd = e->stream_id; mark->_mark.setDPR(_dpr); mark->_mark.setX(mark->_bin + _bin0Offset()); mark->_mark.setY(_vMargin * 3 / 2 + 2, height() - _vMargin / 4); mark->_mark.setCPUVisible(false); mark->_mark.setTaskVisible(false); mark->_mark.setComboVisible(false); for (int i = 0; i < _streamPlots[sd]._cpuList.count(); ++i) { if (_streamPlots[sd]._cpuList[i] == e->cpu) { mark->_mark.setCPUY(_streamPlots[sd]._cpuGraphs[i]->base()); mark->_mark.setCPUVisible(true); } } for (int i = 0; i < _streamPlots[sd]._taskList.count(); ++i) { if (_streamPlots[sd]._taskList[i] == e->pid) { mark->_mark.setTaskY(_streamPlots[sd]._taskGraphs[i]->base()); mark->_mark.setTaskVisible(true); } } for (auto const &c: _comboPlots) for (auto const &p: c) { if (p._streamId != e->stream_id) continue; if (p._type & KSHARK_CPU_DRAW && p._id == e->cpu) { mark->_mark.setComboY(p.base()); mark->_mark.setComboVisible(true); } else if (p._type & KSHARK_TASK_DRAW && p._id == e->pid) { mark->_mark.setComboY(p.base()); mark->_mark.setComboVisible(true); } } } void KsGLWidget::_drawAxisX(float size) { int64_t model_min = model()->histo()->min; int64_t model_max = model()->histo()->max; uint64_t sec, usec, tsMid; char *tMin, *tMid, *tMax; int mid = (width() - _bin0Offset() - _hMargin) / 2; int y_1 = _vMargin * 5 / 4; int y_2 = _vMargin * 6 / 4; int count; KsPlot::Point a0(_bin0Offset(), y_1); KsPlot::Point a1(_bin0Offset(), y_2); KsPlot::Point b0(_bin0Offset() + mid, y_1); KsPlot::Point b1(_bin0Offset() + mid, y_2); KsPlot::Point c0(width() - _hMargin, y_1); KsPlot::Point c1(width() - _hMargin, y_2); a0._size = c0._size = _dpr; a0.draw(); c0.draw(); KsPlot::drawLine(a0, a1, {}, size); KsPlot::drawLine(b0, b1, {}, size); KsPlot::drawLine(c0, c1, {}, size); KsPlot::drawLine(a0, c0, {}, size); if (model_min < 0) model_min = 0; kshark_convert_nano(model_min, &sec, &usec); count = asprintf(&tMin,"%" PRIu64 ".%06" PRIu64 "", sec, usec); if (count <= 0) return; tsMid = (model_min + model_max) / 2; kshark_convert_nano(tsMid, &sec, &usec); count = asprintf(&tMid, "%" PRIu64 ".%06" PRIu64 "", sec, usec); if (count <= 0) return; kshark_convert_nano(model_max, &sec, &usec); count = asprintf(&tMax, "%" PRIu64 ".%06" PRIu64 "", sec, usec); if (count <= 0) return; ksplot_print_text(&_font, nullptr, a0.x(), a0.y() - _hMargin / 2, tMin); ksplot_print_text(&_font, nullptr, b0.x() - _font.char_width * count / 2, b0.y() - _hMargin / 2, tMid); ksplot_print_text(&_font, nullptr, c0.x() - _font.char_width * count, c0.y() - _hMargin / 2, tMax); free(tMin); free(tMid); free(tMax); } int KsGLWidget::_getMaxLabelSize() { int size, max(0); for (auto it = _streamPlots.begin(); it != _streamPlots.end(); ++it) { int sd = it.key(); for (auto const &pid: it.value()._taskList) { size = _font.char_width * KsUtils::taskPlotName(sd, pid).size(); max = (size > max) ? size : max; } for (auto const &cpu: it.value()._cpuList) { size = _font.char_width * KsUtils::cpuPlotName(cpu).size(); max = (size > max) ? size : max; } } for (auto &c: _comboPlots) for (auto const &p: c) { if (p._type & KSHARK_TASK_DRAW) { size = _font.char_width * KsUtils::taskPlotName(p._streamId, p._id).size(); max = (size > max) ? size : max; } else if (p._type & KSHARK_CPU_DRAW) { size = _font.char_width * KsUtils::cpuPlotName(p._id).size(); max = (size > max) ? size : max; } } return max; } void KsGLWidget::_makeGraphs() { int base(_vMargin * 2 + KS_GRAPH_HEIGHT), sd; KsPlot::Graph *g; /* The very first thing to do is to clean up. */ _freeGraphs(); if (!_data || !_data->size()) return; _labelSize = _getMaxLabelSize() + FONT_WIDTH * 2; auto lamAddGraph = [&](int sd, KsPlot::Graph *graph, int vSpace=0) { if (!graph) return graph; KsPlot::Color color = {255, 255, 255}; // White /* * Calculate the base level of the CPU graph inside the widget. * Remember that the "Y" coordinate is inverted. */ graph->setBase(base); /* * If we have multiple Data streams use the color of the stream * for the label of the graph. */ if (KsUtils::getNStreams() > 1) color = KsPlot::getColor(&_streamColors, sd); graph->setLabelAppearance(&_font, color, _labelSize, _hMargin); _graphs[sd].append(graph); base += graph->height() + vSpace; return graph; }; for (auto it = _streamPlots.begin(); it != _streamPlots.end(); ++it) { sd = it.key(); size_t nCpus = it.value()._cpuList.count(); size_t nTasks = it.value()._taskList.count(); QVector cpuGraphs(nCpus); QVector taskGraphs(nTasks); /* Create CPU graphs according to the cpuList. */ it.value()._cpuGraphs = {}; #pragma omp parallel for for (size_t idx = 0; idx < nCpus; ++idx) { int cpu = it.value()._cpuList[idx]; cpuGraphs[idx] = _newCPUGraph(sd, cpu); } QVectorIterator itCpuGraphs(cpuGraphs); while (itCpuGraphs.hasNext()) { g = lamAddGraph(sd, itCpuGraphs.next(), _vSpacing); it.value()._cpuGraphs.append(g); } /* Create Task graphs according to the taskList. */ it.value()._taskGraphs = {}; #pragma omp parallel for for (size_t idx = 0; idx < nTasks; ++idx) { int pid = it.value()._taskList[idx]; taskGraphs[idx] = _newTaskGraph(sd, pid); } QVectorIterator itTaskGraphs(taskGraphs); while (itTaskGraphs.hasNext()) { g = lamAddGraph(sd, itTaskGraphs.next(), _vSpacing); it.value()._taskGraphs.append(g); } } for (auto &c: _comboPlots) { int n = c.count(); #pragma omp parallel for for (int i = 0; i < n; ++i) { sd = c[i]._streamId; if (c[i]._type & KSHARK_TASK_DRAW) { c[i]._graph = lamAddGraph(sd, _newTaskGraph(sd, c[i]._id)); } else if (c[i]._type & KSHARK_CPU_DRAW) { c[i]._graph = lamAddGraph(sd, _newCPUGraph(sd, c[i]._id)); } else { c[i]._graph = nullptr; } if (c[i]._graph && i < n - 1) c[i]._graph->setDrawBase(false); } base += _vSpacing; } } void KsGLWidget::_makePluginShapes() { kshark_context *kshark_ctx(nullptr); kshark_draw_handler *draw_handlers; struct kshark_data_stream *stream; KsCppArgV cppArgv; int sd; if (!kshark_instance(&kshark_ctx)) return; /* The very first thing to do is to clean up. */ freePluginShapes(); cppArgv._histo = _model.histo(); cppArgv._shapes = &_shapes; for (auto it = _streamPlots.constBegin(); it != _streamPlots.constEnd(); ++it) { sd = it.key(); stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) continue; for (int g = 0; g < it.value()._cpuList.count(); ++g) { cppArgv._graph = it.value()._cpuGraphs[g]; draw_handlers = stream->draw_handlers; while (draw_handlers) { draw_handlers->draw_func(cppArgv.toC(), sd, it.value()._cpuList[g], KSHARK_CPU_DRAW); draw_handlers = draw_handlers->next; } } for (int g = 0; g < it.value()._taskList.count(); ++g) { cppArgv._graph = it.value()._taskGraphs[g]; draw_handlers = stream->draw_handlers; while (draw_handlers) { draw_handlers->draw_func(cppArgv.toC(), sd, it.value()._taskList[g], KSHARK_TASK_DRAW); draw_handlers = draw_handlers->next; } } } for (auto const &c: _comboPlots) { for (auto const &p: c) { stream = kshark_get_data_stream(kshark_ctx, p._streamId); draw_handlers = stream->draw_handlers; cppArgv._graph = p._graph; while (draw_handlers) { draw_handlers->draw_func(cppArgv.toC(), p._streamId, p._id, p._type); draw_handlers = draw_handlers->next; } } } } KsPlot::Graph *KsGLWidget::_newCPUGraph(int sd, int cpu) { KsPlot::Graph *graph = nullptr; kshark_context *kshark_ctx = nullptr; kshark_data_stream *stream; kshark_entry_collection *col; if (!kshark_instance(&kshark_ctx)) return nullptr; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return nullptr; /* The CPU graph needs to know only the colors of the tasks. */ graph = new KsPlot::Graph(_model.histo(), &_pidColors, &_pidColors); graph->setIdleSuppressed(true, stream->idle_pid); graph->setHeight(KS_GRAPH_HEIGHT); graph->setLabelText(KsUtils::cpuPlotName(cpu).toStdString()); col = kshark_find_data_collection(kshark_ctx->collections, KsUtils::matchCPUVisible, sd, &cpu, 1); graph->setDataCollectionPtr(col); graph->fillCPUGraph(sd, cpu); return graph; } KsPlot::Graph *KsGLWidget::_newTaskGraph(int sd, int pid) { KsPlot::Graph *graph = nullptr; kshark_context *kshark_ctx = nullptr; kshark_entry_collection *col; kshark_data_stream *stream; if (!kshark_instance(&kshark_ctx)) return nullptr; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return nullptr; /* The Task graph needs to know the colors of the tasks and the colors * of the CPUs */ graph = new KsPlot::Graph(_model.histo(), &_pidColors, &_cpuColors); graph->setHeight(KS_GRAPH_HEIGHT); graph->setLabelText(KsUtils::taskPlotName(sd, pid).toStdString()); col = kshark_find_data_collection(kshark_ctx->collections, kshark_match_pid, sd, &pid, 1); if (!col) { /* * If a data collection for this task does not exist, * register a new one. */ col = kshark_register_data_collection(kshark_ctx, _data->rows(), _data->size(), kshark_match_pid, sd, &pid, 1, 25); } /* * Data collections are efficient only when used on graphs, having a * lot of empty bins. * TODO: Determine the optimal criteria to decide whether to use or * not use data collection for this graph. */ if (_data->size() < 1e6 && col && col->size && _data->size() / col->size < 100) { /* * No need to use collection in this case. Free the collection * data, but keep the collection registered. This will prevent * from recalculating the same collection next time when this * task is ploted. */ kshark_reset_data_collection(col); } graph->setDataCollectionPtr(col); graph->fillTaskGraph(sd, pid); return graph; } /** * @brief Find the KernelShark entry under the the cursor. * * @param point: The position of the cursor. * @param variance: The variance of the position (range) in which an entry will * be searched. * @param joined: It True, search also in the associated CPU/Task graph. * @param index: Output location for the index of the entry under the cursor. * If no entry has been found, the outputted value is zero. * * @returns True, if an entry has been found, otherwise False. */ bool KsGLWidget::find(const QPoint &point, int variance, bool joined, size_t *index) { int bin, sd, cpu, pid; /* * Get the bin, pid and cpu numbers. * Remember that one bin corresponds to one pixel. */ bin = point.x() - _bin0Offset(); getPlotInfo(point, &sd, &cpu, &pid); return _find(bin, sd, cpu, pid, variance, joined, index); } int KsGLWidget::_getNextCPU(int bin, int sd, int pid) { kshark_context *kshark_ctx(nullptr); kshark_entry_collection *col; int cpu; if (!kshark_instance(&kshark_ctx)) return KS_EMPTY_BIN; col = kshark_find_data_collection(kshark_ctx->collections, kshark_match_pid, sd, &pid, 1); if (!col) return KS_EMPTY_BIN; for (int i = bin; i < _model.histo()->n_bins; ++i) { cpu = ksmodel_get_cpu_front(_model.histo(), i, sd, pid, false, col, nullptr); if (cpu >= 0) return cpu; } return KS_EMPTY_BIN; } bool KsGLWidget::_find(int bin, int sd, int cpu, int pid, int variance, bool joined, size_t *row) { int hSize = _model.histo()->n_bins; ssize_t found; if (bin < 0 || bin > hSize || (cpu < 0 && pid < 0)) { /* * The click is outside of the range of the histogram. * Do nothing. */ *row = 0; return false; } auto lamGetEntryByCPU = [&](int b) { /* Get the first data entry in this bin. */ found = ksmodel_first_index_at_cpu(_model.histo(), b, sd, cpu); if (found < 0) { /* * The bin is empty or the entire connect of the bin * has been filtered. */ return false; } *row = found; return true; }; auto lamGetEntryByPid = [&](int b) { /* Get the first data entry in this bin. */ found = ksmodel_first_index_at_pid(_model.histo(), b, sd, pid); if (found < 0) { /* * The bin is empty or the entire connect of the bin * has been filtered. */ return false; } *row = found; return true; }; auto lamFindEntryByCPU = [&](int b) { /* * The click is over the CPU graphs. First try the exact * match. */ if (lamGetEntryByCPU(b)) return true; /* Now look for a match, nearby the position of the click. */ for (int i = 1; i < variance; ++i) { if (b + i <= hSize && lamGetEntryByCPU(b + i)) return true; if (b - i >= 0 && lamGetEntryByCPU(b - i)) return true; } *row = 0; return false; }; auto lamFindEntryByPid = [&](int b) { /* * The click is over the Task graphs. First try the exact * match. */ if (lamGetEntryByPid(b)) return true; /* Now look for a match, nearby the position of the click. */ for (int i = 1; i < variance; ++i) { if ((b + i <= hSize) && lamGetEntryByPid(b + i)) return true; if ((b - i >= 0) && lamGetEntryByPid(b - i)) return true; } *row = 0; return false; }; if (cpu >= 0) return lamFindEntryByCPU(bin); if (pid >= 0) { bool ret = lamFindEntryByPid(bin); /* * If no entry has been found and we have a joined search, look * for an entry on the next CPU used by this task. */ if (!ret && joined) { cpu = _getNextCPU(sd, bin, pid); ret = lamFindEntryByCPU(bin); } return ret; } *row = 0; return false; } bool KsGLWidget::_findAndSelect(QMouseEvent *event) { size_t row; bool found = find(event->pos(), 10, true, &row); if (found) { emit select(row); emit updateView(row, true); } return found; } void KsGLWidget::_rangeBoundInit(int x) { /* * Set the origin of the rubber band that shows the new range. Only * the X coordinate of the origin matters. The Y coordinate will be * set to zero. */ _rubberBandOrigin.rx() = x; _rubberBandOrigin.ry() = 0; _rubberBand.setGeometry(_rubberBandOrigin.x(), _rubberBandOrigin.y(), 0, 0); /* Make the rubber band visible, although its size is zero. */ _rubberBand.show(); } void KsGLWidget::_rangeBoundStretched(int x) { QPoint pos; pos.rx() = x; pos.ry() = this->height(); /* * Stretch the rubber band between the origin position and the current * position of the mouse. Only the X coordinate matters. The Y * coordinate will be the height of the widget. */ if (_rubberBandOrigin.x() < pos.x()) { _rubberBand.setGeometry(QRect(_rubberBandOrigin.x(), _rubberBandOrigin.y(), pos.x() - _rubberBandOrigin.x(), pos.y() - _rubberBandOrigin.y())); } else { _rubberBand.setGeometry(QRect(pos.x(), _rubberBandOrigin.y(), _rubberBandOrigin.x() - pos.x(), pos.y() - _rubberBandOrigin.y())); } } void KsGLWidget::_rangeChanged(int binMin, int binMax) { size_t nBins = _model.histo()->n_bins; int binMark = _mState->activeMarker()._bin; uint64_t min, max; /* The rubber band is no longer needed. Make it invisible. */ _rubberBand.hide(); if ( (binMax - binMin) < 4) { /* Most likely this is an accidental click. Do nothing. */ return; } /* * Calculate the new range of the histogram. The number of bins will * stay the same. */ min = ksmodel_bin_ts(_model.histo(), binMin); max = ksmodel_bin_ts(_model.histo(), binMax); if (max - min < nBins) { /* * The range cannot be smaller than the number of bins. * Do nothing. */ return; } /* Recalculate the model and update the markers. */ ksmodel_set_bining(_model.histo(), nBins, min, max); _model.fill(_data); _mState->updateMarkers(*_data, this); /* * If the Marker is inside the new range, make sure that it will * be visible in the table. Note that for this check we use the * bin number of the marker, retrieved before its update. */ if (_mState->activeMarker()._isSet && binMark < binMax && binMark > binMin) { emit updateView(_mState->activeMarker()._pos, true); return; } /* * Find the first bin which contains unfiltered data and send a signal * to the View widget to make this data visible. */ for (int bin = 0; bin < _model.histo()->n_bins; ++bin) { int64_t row = ksmodel_first_index_at_bin(_model.histo(), bin); if (row != KS_EMPTY_BIN && (_data->rows()[row]->visible & KS_TEXT_VIEW_FILTER_MASK)) { emit updateView(row, false); return; } } } int KsGLWidget::_posInRange(int x) { int posX; if (x < _bin0Offset()) posX = _bin0Offset(); else if (x > (width() - _hMargin)) posX = width() - _hMargin; else posX = x; return posX; } /** * @brief Get information about the graph plotted at given position (under the mouse). * * @param point: The position to be inspected. * @param sd: Output location for the Data stream Identifier of the graph. * @param cpu: Output location for the CPU Id of the graph, or -1 if this is * a Task graph. * @param pid: Output location for the Process Id of the graph, or -1 if this is * a CPU graph. */ bool KsGLWidget::getPlotInfo(const QPoint &point, int *sd, int *cpu, int *pid) { int base, n; *sd = *cpu = *pid = -1; for (auto it = _streamPlots.constBegin(); it != _streamPlots.constEnd(); ++it) { n = it.value()._cpuList.count(); for (int i = 0; i < n; ++i) { base = it.value()._cpuGraphs[i]->base(); if (base - KS_GRAPH_HEIGHT < point.y() && point.y() < base) { *sd = it.key(); *cpu = it.value()._cpuList[i]; return true; } } n = it.value()._taskList.count(); for (int i = 0; i < n; ++i) { base = it.value()._taskGraphs[i]->base(); if (base - KS_GRAPH_HEIGHT < point.y() && point.y() < base) { *sd = it.key(); *pid = it.value()._taskList[i]; return true; } } } for (auto const &c: _comboPlots) { for (auto const &p: c) { base = p.base(); if (base - KS_GRAPH_HEIGHT < point.y() && point.y() < base) { *sd = p._streamId; if (p._type & KSHARK_CPU_DRAW) *cpu = p._id; else if (p._type & KSHARK_TASK_DRAW) *pid = p._id; return true; } } } return false; } kernel-shark-kernelshark-v2.4.0/src/KsGLWidget.hpp000066400000000000000000000166441477354127100220720ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsGLWidget.hpp * @brief OpenGL widget for plotting trace graphs. */ #ifndef _KS_GLWIDGET_H #define _KS_GLWIDGET_H // Qt #include #include // KernelShark #include "KsUtils.hpp" #include "KsWidgetsLib.hpp" #include "KsPlotTools.hpp" #include "KsModels.hpp" #include "KsDualMarker.hpp" /** Structure describing all graphs to be plotted for a given Data stream. */ struct KsPerStreamPlots { /** CPUs to be plotted. */ QVector _cpuList; /** "Y" coordinates of the bases of all CPU plots for this stream. */ QVector _cpuGraphs; /** Tasks to be plotted. */ QVector _taskList; /** "Y" coordinates of the bases of all CPU plots for this stream. */ QVector _taskGraphs; }; /** Structure describing a plot. */ struct KsPlotEntry { /** The Data stream identifier of the plot. */ int _streamId; /** Plotting action identifier (Task or CPU plot). */ int _type; /** Identifier of the plot (can be PID or CPU number). */ int _id; /** Graph pointer. */ KsPlot::Graph *_graph; /** "Y" coordinates of the bases of the plot. */ int base() const {return _graph->base();} }; KsPlotEntry &operator <<(KsPlotEntry &plot, QVector &v); void operator >>(const KsPlotEntry &plot, QVector &v); /** Vector of KsPlotEntry used to describe a Combo plot. */ typedef QVector KsComboPlot; /** * The KsGLWidget class provides a widget for rendering OpenGL graphics used * to plot trace graphs. */ class KsGLWidget : public QOpenGLWidget { Q_OBJECT public: explicit KsGLWidget(QWidget *parent = NULL); ~KsGLWidget(); void render(); void reset(); /** Reprocess all graphs. */ void updateGeom() {resizeGL(width(), height());} void loadData(KsDataStore *data, bool resetPlots); void loadColors(); /** * Provide the widget with a pointer to the Dual Marker state machine * object. */ void setMarkerSM(KsDualMarkerSM *m) {_mState = m;} /** Get the KsGraphModel object. */ KsGraphModel *model() {return &_model;} /** Get the number of CPU graphs for a given Data stream. */ int cpuGraphCount(int sd) const { auto it = _streamPlots.find(sd); if (it != _streamPlots.end()) return it.value()._cpuList.count(); return 0; } /** Get the number of Task graphs for a given Data stream. */ int taskGraphCount(int sd) const { auto it = _streamPlots.find(sd); if (it != _streamPlots.end()) return it.value()._taskList.count(); return 0; } /** Get the total number of graphs for a given Data stream. */ int graphCount(int sd) const { auto it = _streamPlots.find(sd); if (it != _streamPlots.end()) return it.value()._taskList.count() + it.value()._cpuList.count(); return 0; } /** * Get the total number of graphs for all Data stream. The Combo plots * are not counted. */ int totGraphCount() const { int count(0); for (auto const &s: _streamPlots) count += s._taskList.count() + s._cpuList.count(); return count; } /** Get the number of plots in Combos. */ int comboGraphCount() const { int count(0); for (auto const &c: _comboPlots) count += c.count(); return count; } /** Check if the widget is empty (not showing anything). */ bool isEmpty() const { return !_data || !_data->size() || (!totGraphCount() && !comboGraphCount()); } /** Get the height of the widget. */ int height() const { return totGraphCount() * (KS_GRAPH_HEIGHT + _vSpacing) + comboGraphCount() * KS_GRAPH_HEIGHT + _comboPlots.count() * _vSpacing + _vMargin * 2; } /** Get the device pixel ratio. */ int dpr() const {return _dpr;} /** Get the size of the horizontal margin space. */ int hMargin() const {return _hMargin;} /** Get the size of the vertical margin space. */ int vMargin() const {return _vMargin;} /** Get the size of the vertical spaceing between the graphs. */ int vSpacing() const {return _vSpacing;} void setMarkPoints(const KsDataStore &data, KsGraphMark *mark); bool find(const QPoint &point, int variance, bool joined, size_t *index); bool getPlotInfo(const QPoint &point, int *sd, int *cpu, int *pid); /** CPUs and Tasks graphs (per data stream) to be plotted. */ QMap _streamPlots; /** Combo graphs to be plotted. */ QVector _comboPlots; /** Set the pointer to the WorkInProgress widget. */ void setWipPtr(KsWidgetsLib::KsWorkInProgress *wip) { _workInProgress = wip; } /** Free the list of plugin-defined shapes. */ void freePluginShapes(); protected: void initializeGL() override; void resizeGL(int w, int h) override; void paintGL() override; void mousePressEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; void wheelEvent(QWheelEvent * event) override; void keyPressEvent(QKeyEvent *event) override; void keyReleaseEvent(QKeyEvent *event) override; signals: /** * This signal is emitted when the mouse moves over a visible * KernelShark entry. */ void found(size_t pos); /** * This signal is emitted when the mouse moves but there is no visible * KernelShark entry under the cursor. */ void notFound(uint64_t ts, int sd, int cpu, int pid); /** This signal is emitted when the Plus key is pressed. */ void zoomIn(); /** This signal is emitted when the Minus key is pressed. */ void zoomOut(); /** This signal is emitted when the Left Arrow key is pressed. */ void scrollLeft(); /** This signal is emitted when the Right Arrow key is pressed. */ void scrollRight(); /** * This signal is emitted when one of the 4 Action keys is release * (after being pressed). */ void stopUpdating(); /** * This signal is emitted in the case of a double click over a visible * KernelShark entry. */ void select(size_t pos); /** * This signal is emitted when the KsTraceViewer widget needs to be * updated. */ void updateView(size_t pos, bool mark); private: QMap> _graphs; KsPlot::PlotObjList _shapes; KsPlot::ColorTable _pidColors; KsPlot::ColorTable _cpuColors; KsPlot::ColorTable _streamColors; KsWidgetsLib::KsWorkInProgress *_workInProgress; int _labelSize, _hMargin, _vMargin; unsigned int _vSpacing; KsGraphModel _model; KsDualMarkerSM *_mState; KsDataStore *_data; QRubberBand _rubberBand; QPoint _rubberBandOrigin; size_t _posMousePress; bool _keyPressed; int _dpr; ksplot_font _font; void _freeGraphs(); void _drawAxisX(float size); int _getMaxLabelSize(); void _makeGraphs(); KsPlot::Graph *_newCPUGraph(int sd, int cpu); KsPlot::Graph *_newTaskGraph(int sd, int pid); void _makePluginShapes(); int _posInRange(int x); void _rangeBoundInit(int x); void _rangeBoundStretched(int x); void _rangeChanged(int binMin, int binMax); bool _findAndSelect(QMouseEvent *event); bool _find(int bin, int sd, int cpu, int pid, int variance, bool joined, size_t *row); int _getNextCPU(int bin, int sd, int pid); int _getLastTask(struct kshark_trace_histo *histo, int bin, int sd, int cpu); int _getLastCPU(struct kshark_trace_histo *histo, int bin, int sd, int pid); void _defaultPlots(kshark_context *kshark_ctx); void _deselect(); int _bin0Offset() {return _labelSize + 2 * _hMargin;} }; #endif kernel-shark-kernelshark-v2.4.0/src/KsMainWindow.cpp000066400000000000000000001163311477354127100224650ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsMainWindow.cpp * @brief KernelShark GUI main window. */ // C #include #include #include // C++11 #include // Qt #include #include #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-tepdata.h" #include "KsCmakeDef.hpp" #include "KsMainWindow.hpp" #include "KsAdvFilteringDialog.hpp" using namespace KsWidgetsLib; /** Create KernelShark Main window. */ KsMainWindow::KsMainWindow(QWidget *parent) : QMainWindow(parent), _splitter(Qt::Vertical, this), _data(this), _view(this), _graph(this), _mState(this), _plugins(this), _capture(this), _captureLocalServer(this), _openAction("Open Trace File", this), _appendAction("Append Trace File", this), _restoreSessionAction("Restore Last Session", this), _importSessionAction("Import Session", this), _exportSessionAction("Export Session", this), _quitAction("Quit", this), _graphFilterSyncCBox(nullptr), _listFilterSyncCBox(nullptr), _showEventsAction("Show events", this), _showTasksAction("Show tasks", this), _showCPUsAction("Show CPUs", this), _advanceFilterAction("TEP Advance Filtering", this), _clearAllFilters("Clear all filters", this), _cpuSelectAction("CPUs", this), _taskSelectAction("Tasks", this), _managePluginsAction("Manage Plotting plugins", this), _addPluginsAction("Add plugins", this), _captureAction("Record", this), _addOffcetAction("Add Time Offset", this), _colorAction(this), _colSlider(this), _colorPhaseSlider(Qt::Horizontal, this), _fullScreenModeAction("Full Screen Mode", this), _aboutAction("About", this), _contentsAction("Contents", this), _bugReportAction("Report a bug", this), _deselectShortcut(this), _settings(_getCacheDir() + "/setting.ini", QSettings::IniFormat), _workInProgress(this), _updateSessionSize(true) { setWindowTitle("Kernel Shark"); _createActions(); _createMenus(); _initCapture(); _plugins.registerPluginMenues(); if (geteuid() == 0) _rootWarning(); _splitter.addWidget(&_graph); _splitter.addWidget(&_view); setCentralWidget(&_splitter); /* * Add Status bar. First of all remove the bottom margins of the table * so that the Status bar can nicely stick to it. */ QMargins m = _view.layout()->contentsMargins(); m.setBottom(0); _view.layout()->setContentsMargins(m); /* Now create the Status bar and the "Work In Progress" Widget. */ QStatusBar *sb = statusBar(); sb->setFixedHeight(1.2 * FONT_HEIGHT); _workInProgress.addToStatusBar(sb); _graph.setWipPtr(&_workInProgress); _graph.glPtr()->setWipPtr(&_workInProgress); _view.setWipPtr(&_workInProgress); connect(&_splitter, &QSplitter::splitterMoved, this, &KsMainWindow::_splitterMoved); _view.setMarkerSM(&_mState); connect(&_mState, &KsDualMarkerSM::markSwitchForView, &_view, &KsTraceViewer::markSwitch); _graph.setMarkerSM(&_mState); connect(&_mState, &KsDualMarkerSM::updateGraph, &_graph, &KsTraceGraph::markEntry); connect(&_mState, &KsDualMarkerSM::updateView, &_view, &KsTraceViewer::showRow); connect(&_view, &KsTraceViewer::select, &_graph, &KsTraceGraph::markEntry); connect(&_view, &KsTraceViewer::addTaskPlot, &_graph, &KsTraceGraph::addTaskPlot); connect(_graph.glPtr(), &KsGLWidget::updateView, &_view, &KsTraceViewer::showRow); connect(&_graph, &KsTraceGraph::deselect, this, &KsMainWindow::_deselectActive); connect(&_view, &KsTraceViewer::deselect, this, &KsMainWindow::_deselectActive); connect(&_data, &KsDataStore::updateWidgets, &_view, &KsTraceViewer::update); connect(&_data, &KsDataStore::updateWidgets, &_graph, &KsTraceGraph::update); connect(&_plugins, &KsPluginManager::dataReload, &_data, &KsDataStore::reload); _deselectShortcut.setKey(Qt::CTRL | Qt::Key_D); connect(&_deselectShortcut, &QShortcut::activated, this, &KsMainWindow::_deselectActive); connect(&_mState, &KsDualMarkerSM::deselectA, this, &KsMainWindow::_deselectA); connect(&_mState, &KsDualMarkerSM::deselectB, this, &KsMainWindow::_deselectB); _lastDataFilePath = _settings.value("dataPath").toString(); _lastConfFilePath = _settings.value("confPath").toString(); _lastPluginFilePath = _settings.value("pluginPath").toString(); _resizeEmpty(); } /** Destroy KernelShark Main window. */ KsMainWindow::~KsMainWindow() { kshark_context *kshark_ctx(nullptr); QString file = lastSessionFile(); if (!file.isEmpty()) { QByteArray fileBA = file.toLocal8Bit(); _updateSession(); kshark_save_config_file(fileBA.data(), _session.getConfDocPtr()); } _settings.setValue("dataPath", _lastDataFilePath); _settings.setValue("confPath", _lastConfFilePath); _settings.setValue("pluginPath", _lastPluginFilePath); _data.clear(); _plugins.deletePluginDialogs(); /* * Do not show error messages if the "capture" process is still * running (Capture dialog is not closed). */ if (_capture.state() != QProcess::NotRunning) { disconnect(_captureErrorConnection); _capture.close(); _capture.waitForFinished(); } /** * The list of shapes generated by the plugins may contain objects * defined inside the plugins. Make sure to delete these objects now, * because after closing the plugins, the destructors of the * plugins-defined objects will no longer be available. */ _graph.glPtr()->freePluginShapes(); if (kshark_instance(&kshark_ctx)) kshark_free(kshark_ctx); } /** Set the list ot CPU cores to be plotted. */ void KsMainWindow::setCPUPlots(int sd, QVector cpus) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; if (!kshark_instance(&kshark_ctx)) return; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; int nCPUs = stream->n_cpus; auto lamCPUCheck = [=] (int cpu) { if (cpu >= nCPUs) { qWarning() << "Warning: No CPU" << cpu << "found in the data."; return true; } return false; }; cpus.erase(std::remove_if(cpus.begin(), cpus.end(), lamCPUCheck), cpus.end()); _graph.cpuReDraw(sd, cpus); } /** Set the list ot tasks (pids) to be plotted. */ void KsMainWindow::setTaskPlots(int sd, QVector pids) { QVector allPids = KsUtils::getPidList(sd); auto lamPidCheck = [=] (int pid) { int i = allPids.indexOf(pid); if (i < 0) { qWarning() << "Warning: No Pid" << pid << "found in the data."; return true; } return false; }; pids.erase(std::remove_if(pids.begin(), pids.end(), lamPidCheck), pids.end()); _graph.taskReDraw(sd, pids); } /** * Reimplemented event handler used to update the geometry of the window on * resize events. */ void KsMainWindow::resizeEvent(QResizeEvent* event) { QMainWindow::resizeEvent(event); if (_updateSessionSize) { _session.saveMainWindowSize(*this); _session.saveSplitterSize(_splitter); } } void KsMainWindow::_createActions() { /* File menu */ _openAction.setIcon(QIcon::fromTheme("document-open")); _openAction.setShortcut(tr("Ctrl+O")); _openAction.setStatusTip("Open an existing data file"); connect(&_openAction, &QAction::triggered, this, &KsMainWindow::_open); _appendAction.setIcon(QIcon::fromTheme("document-open")); _appendAction.setShortcut(tr("Ctrl+A")); _appendAction.setStatusTip("Append an existing data file"); connect(&_appendAction, &QAction::triggered, this, &KsMainWindow::_append); _restoreSessionAction.setIcon(QIcon::fromTheme("document-open-recent")); connect(&_restoreSessionAction, &QAction::triggered, this, &KsMainWindow::_restoreSession); _importSessionAction.setIcon(QIcon::fromTheme("document-send")); _importSessionAction.setStatusTip("Load a session"); connect(&_importSessionAction, &QAction::triggered, this, &KsMainWindow::_importSession); _exportSessionAction.setIcon(QIcon::fromTheme("document-revert")); _exportSessionAction.setStatusTip("Export this session"); connect(&_exportSessionAction, &QAction::triggered, this, &KsMainWindow::_exportSession); _quitAction.setIcon(QIcon::fromTheme("window-close")); _quitAction.setShortcut(tr("Ctrl+Q")); _quitAction.setStatusTip("Exit KernelShark"); connect(&_quitAction, &QAction::triggered, this, &KsMainWindow::close); /* Filter menu */ connect(&_showEventsAction, &QAction::triggered, this, &KsMainWindow::_showEvents); connect(&_showTasksAction, &QAction::triggered, this, &KsMainWindow::_showTasks); connect(&_showCPUsAction, &QAction::triggered, this, &KsMainWindow::_showCPUs); connect(&_advanceFilterAction, &QAction::triggered, this, &KsMainWindow::_advancedFiltering); connect(&_clearAllFilters, &QAction::triggered, this, &KsMainWindow::_clearFilters); /* Plot menu */ connect(&_cpuSelectAction, &QAction::triggered, this, &KsMainWindow::_cpuSelect); connect(&_taskSelectAction, &QAction::triggered, this, &KsMainWindow::_taskSelect); /* Tools menu */ _managePluginsAction.setShortcut(tr("Ctrl+P")); _managePluginsAction.setIcon(QIcon::fromTheme("preferences-system")); _managePluginsAction.setStatusTip("Manage plugins"); connect(&_managePluginsAction, &QAction::triggered, this, &KsMainWindow::_pluginSelect); _addPluginsAction.setIcon(QIcon::fromTheme("applications-engineering")); _addPluginsAction.setStatusTip("Add plugins"); connect(&_addPluginsAction, &QAction::triggered, this, &KsMainWindow::_pluginAdd); _captureAction.setIcon(QIcon::fromTheme("media-record")); _captureAction.setShortcut(tr("Ctrl+R")); _captureAction.setStatusTip("Capture trace data"); connect(&_captureAction, &QAction::triggered, this, &KsMainWindow::_record); connect(&_addOffcetAction, &QAction::triggered, this, &KsMainWindow::_offset); _colorPhaseSlider.setMinimum(20); _colorPhaseSlider.setMaximum(180); _colorPhaseSlider.setValue(KsPlot::Color::rainbowFrequency() * 100); _colorPhaseSlider.setFixedWidth(FONT_WIDTH * 15); connect(&_colorPhaseSlider, &QSlider::valueChanged, this, &KsMainWindow::_setColorPhase); /* * Updating the colors of the table can be slow. Do this only when * the slider is released. */ connect(&_colorPhaseSlider, &QSlider::sliderReleased, &_view, &KsTraceViewer::loadColors); _colSlider.setLayout(new QHBoxLayout); _colSlider.layout()->addWidget(new QLabel("Color scheme", this)); _colSlider.layout()->addWidget(&_colorPhaseSlider); _colorAction.setDefaultWidget(&_colSlider); _fullScreenModeAction.setIcon(QIcon::fromTheme("view-fullscreen")); _fullScreenModeAction.setShortcut(tr("Ctrl+Shift+F")); _fullScreenModeAction.setStatusTip("Full Screen Mode"); connect(&_fullScreenModeAction, &QAction::triggered, this, &KsMainWindow::_changeScreenMode); /* Help menu */ _aboutAction.setIcon(QIcon::fromTheme("help-about")); connect(&_aboutAction, &QAction::triggered, this, &KsMainWindow::_aboutInfo); _contentsAction.setIcon(QIcon::fromTheme("help-contents")); connect(&_contentsAction, &QAction::triggered, this, &KsMainWindow::_contents); connect(&_bugReportAction, &QAction::triggered, this, &KsMainWindow::_bugReport); } void KsMainWindow::_createMenus() { QMenu *file, *sessions, *filter, *plots, *tools, *help; kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; /* File menu */ file = menuBar()->addMenu("File"); file->addAction(&_openAction); file->addAction(&_appendAction); sessions = file->addMenu("Sessions"); sessions->setIcon(QIcon::fromTheme("document-properties")); sessions->addAction(&_restoreSessionAction); sessions->addAction(&_importSessionAction); sessions->addAction(&_exportSessionAction); file->addAction(&_quitAction); /* * Enable the "Append Trace File" menu only in the case of multiple * data streams. */ auto lamEnableAppendAction = [this] () { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; if (kshark_ctx->n_streams > 0) _appendAction.setEnabled(true); else _appendAction.setEnabled(false); }; connect(file, &QMenu::aboutToShow, lamEnableAppendAction); /* Filter menu */ filter = menuBar()->addMenu("Filter"); connect(filter, &QMenu::aboutToShow, this, &KsMainWindow::_updateFilterMenu); /* * Set the default filter mask. Filter will apply to both View and * Graph. */ kshark_ctx->filter_mask = KS_TEXT_VIEW_FILTER_MASK | KS_GRAPH_VIEW_FILTER_MASK; kshark_ctx->filter_mask |= KS_EVENT_VIEW_FILTER_MASK; _graphFilterSyncCBox = KsUtils::addCheckBoxToMenu(filter, "Apply filters to Graph"); _graphFilterSyncCBox->setChecked(true); connect(_graphFilterSyncCBox, &QCheckBox::stateChanged, this, &KsMainWindow::_graphFilterSync); _listFilterSyncCBox = KsUtils::addCheckBoxToMenu(filter, "Apply filters to List"); _listFilterSyncCBox->setChecked(true); connect(_listFilterSyncCBox, &QCheckBox::stateChanged, this, &KsMainWindow::_listFilterSync); filter->addAction(&_showEventsAction); filter->addAction(&_showTasksAction); filter->addAction(&_showCPUsAction); filter->addAction(&_advanceFilterAction); filter->addAction(&_clearAllFilters); /* * Enable the "TEP Advance Filtering" menu only in the case when TEP * data is loaded. */ auto lamEnableAdvFilterAction = [this] () { kshark_context *kshark_ctx(nullptr); QVector streamIds; if (!kshark_instance(&kshark_ctx)) return; _advanceFilterAction.setEnabled(false); streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { if (kshark_is_tep(kshark_ctx->stream[sd])) { _advanceFilterAction.setEnabled(true); break; } } }; connect(filter, &QMenu::aboutToShow, lamEnableAdvFilterAction); /* Plot menu */ plots = menuBar()->addMenu("Plots"); plots->addAction(&_cpuSelectAction); plots->addAction(&_taskSelectAction); /* Tools menu */ tools = menuBar()->addMenu("Tools"); tools->addAction(&_colorAction); tools->addAction(&_fullScreenModeAction); tools->addSeparator(); tools->addAction(&_captureAction); tools->addAction(&_managePluginsAction); tools->addAction(&_addPluginsAction); tools->addAction(&_addOffcetAction); /* * Enable the "Add Time Offset" menu only in the case of multiple * data streams. */ auto lamEnableOffcetAction = [this] () { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; if (kshark_ctx->n_streams > 1) _addOffcetAction.setEnabled(true); else _addOffcetAction.setEnabled(false); }; connect(tools, &QMenu::aboutToShow, lamEnableOffcetAction); /* Help menu */ help = menuBar()->addMenu("Help"); help->addAction(&_aboutAction); help->addAction(&_contentsAction); help->addAction(&_bugReportAction); } /** * @brief Add a plugin configuration/control menu. * * @param place: String describing the place to add the menu. For example * "Tools/Plot Latency". * @param func: Function that will launch of plugin control menus. */ void KsMainWindow::addPluginMenu(QString place, pluginActionFunc func) { QStringList dialogPath = place.split("/"); QAction *pluginAction; auto lamAddMenu = [this, func] () { func(this); }; for (auto &m: menuBar()->findChildren()) { if(dialogPath[0] == m->menuAction()->text()) { pluginAction = new QAction(dialogPath[1], this); m->addAction(pluginAction); connect(pluginAction, &QAction::triggered, lamAddMenu); } } } /** Select the kshark_entry having given index with a given maker. */ void KsMainWindow::markEntry(ssize_t row, DualMarkerState st) { if (row >= 0) { _mState.setState(st); _graph.markEntry(row); _view.showRow(row, true); } } /** Select given kshark_entry with a given maker. */ void KsMainWindow::markEntry(const kshark_entry *e, DualMarkerState st) { ssize_t row; if (!e) { _mState.getMarker(st).reset(); return; } row = kshark_find_entry_by_time(e->ts, _data.rows(), 0, _data.size() - 1); markEntry(row, st); } void KsMainWindow::_open() { QString fileName; fileName = KsUtils::getFile(this, "Open File", "trace-cmd files (*.dat);;All files (*)", _lastDataFilePath); if (!fileName.isEmpty()) loadDataFile(fileName); } void KsMainWindow::_append() { QString fileName = KsUtils::getFile(this, "Append File", "trace-cmd files (*.dat);;Text files (*.txt);;All files (*)", _lastDataFilePath); if (!fileName.isEmpty()) appendDataFile(fileName); } QString KsMainWindow::_getCacheDir() { QString dir; auto lamMakePath = [&] (bool ask) { if (ask) { QMessageBox::StandardButton reply; QString err("KernelShark cache directory not found!\n"); QString question = QString("Do you want to create %1").arg(dir); reply = QMessageBox::question(this, "KernelShark", err + question, QMessageBox::Yes | QMessageBox::No); if (reply == QMessageBox::No) { dir.clear(); return; } } QDir().mkpath(dir); }; auto lamRootHome = [] () { struct passwd *pwd = getpwuid(0); return pwd ? QString(pwd->pw_dir) : QString("/root"); }; dir = getenv("KS_USER_CACHE_DIR"); if (!dir.isEmpty()) { if (!QDir(dir).exists()) lamMakePath(true); } else { auto appCachePath = QStandardPaths::GenericCacheLocation; dir = QStandardPaths::writableLocation(appCachePath); dir += "/kernelshark"; if (geteuid() == 0) dir.replace(QDir::homePath(), lamRootHome()); if (!QDir(dir).exists()) lamMakePath(false); } return dir; } /** Get the description file of the last session. */ QString KsMainWindow::lastSessionFile() { QString file; file = _getCacheDir(); if (!file.isEmpty()) file += "/lastsession.json"; return file; } void KsMainWindow::_restoreSession() { loadSession(lastSessionFile()); } void KsMainWindow::_importSession() { QString fileName; fileName = KsUtils::getFile(this, "Import Session", "Kernel Shark Config files (*.json);;", _lastConfFilePath); if (fileName.isEmpty()) return; loadSession(fileName); } void KsMainWindow::_updateSession() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; _session.saveVisModel(_graph.glPtr()->model()->histo()); _session.saveDataStreams(kshark_ctx); _session.saveGraphs(kshark_ctx, _graph); _session.saveDualMarker(&_mState); _session.saveTable(_view); _session.saveColorScheme(); _session.saveUserPlugins(_plugins); } void KsMainWindow::_exportSession() { QString fileName; fileName = KsUtils::getSaveFile(this, "Export Filter", "Kernel Shark Config files (*.json);;", ".json", _lastConfFilePath); if (fileName.isEmpty()) return; _updateSession(); _session.exportToFile(fileName); } void KsMainWindow::_filterSyncCBoxUpdate(kshark_context *kshark_ctx) { if (kshark_ctx->filter_mask & KS_TEXT_VIEW_FILTER_MASK) _listFilterSyncCBox->setChecked(true); else _listFilterSyncCBox->setChecked(false); if (kshark_ctx->filter_mask & (KS_GRAPH_VIEW_FILTER_MASK | KS_EVENT_VIEW_FILTER_MASK)) _graphFilterSyncCBox->setChecked(true); else _graphFilterSyncCBox->setChecked(false); } void KsMainWindow::_updateFilterMenu() { kshark_context *kshark_ctx(nullptr); if (kshark_instance(&kshark_ctx)) _filterSyncCBoxUpdate(kshark_ctx); } void KsMainWindow::_listFilterSync(int state) { KsUtils::listFilterSync(state); _data.update(); } void KsMainWindow::_graphFilterSync(int state) { KsUtils::graphFilterSync(state); _data.update(); } void KsMainWindow::_presetCBWidget(kshark_hash_id *showFilter, kshark_hash_id *hideFilter, KsCheckBoxWidget *cbw) { if (!kshark_this_filter_is_set(showFilter) && !kshark_this_filter_is_set(hideFilter)) { /* * No filter is set currently. All CheckBoxes of the Widget * will be checked. */ cbw->setDefault(true); } else { QVector ids = cbw->getIds(); QVector status; int n = ids.count(); bool show, hide; if (kshark_this_filter_is_set(showFilter)) { /* * The "show only" filter is set. The default status * of all CheckBoxes will be "unchecked". */ status = QVector(n, false); for (int i = 0; i < n; ++i) { show = !!kshark_hash_id_find(showFilter, ids[i]); hide = !!kshark_hash_id_find(hideFilter, ids[i]); if (show && !hide) { /* * Both "show" and "hide" define this * Id as visible. Set the status of * its CheckBoxes to "checked". */ status[i] = true; } } } else { /* * Only the "do not show" filter is set. The default * status of all CheckBoxes will be "checked". */ status = QVector(n, true); for (int i = 0; i < n; ++i) { hide = !!kshark_hash_id_find(hideFilter, ids[i]); if (hide) status[i] = false; } } cbw->set(status); } } void KsMainWindow::_applyFilter(int sd, QVector all, QVector show, std::function)> posFilter, std::function)> negFilter) { if (show.count() != 0 && show.count() < all.count() / 2) { posFilter(sd, show); } else { /* * It is more efficiant to apply negative (do not show) filter. */ QVector diff; /* * The Ids may not be sorted, because in the widgets the items * are shown sorted by name. Get those Ids sorted first. */ std::sort(all.begin(), all.end()); std::sort(show.begin(), show.end()); /* * The IDs of the "do not show" filter are given by the * difference between "all" Ids and the Ids of the "show only" * filter. */ std::set_difference(all.begin(), all.end(), show.begin(), show.end(), std::inserter(diff, diff.begin())); negFilter(sd, diff); } } /* Quiet warnings over documenting simple structures */ //! @cond Doxygen_Suppress #define LAMBDA_FILTER(method) [=] (int sd, QVector vec) {method(sd, vec);} //! @endcond void KsMainWindow::_showEvents() { kshark_context *kshark_ctx(nullptr); QVector cbws; KsCheckBoxWidget *events_cbw; KsCheckBoxDialog *dialog; kshark_data_stream *stream; QVector streamIds; if (!kshark_instance(&kshark_ctx)) return; streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { stream = kshark_ctx->stream[sd]; events_cbw = new KsEventsCheckBoxWidget(stream, this); cbws.append(events_cbw); _presetCBWidget(stream->show_event_filter, stream->hide_event_filter, events_cbw); } dialog = new KsCheckBoxDialog(cbws, this); auto lamFilter = [=] (int sd, QVector show) { QVector all = KsUtils::getEventIdList(sd); _applyFilter(sd, all, show, LAMBDA_FILTER(_data.applyPosEventFilter), LAMBDA_FILTER(_data.applyNegEventFilter)); }; connect(dialog, &KsCheckBoxDialog::apply, lamFilter); dialog->show(); } void KsMainWindow::_showTasks() { kshark_context *kshark_ctx(nullptr); QVector cbws; kshark_data_stream *stream; KsCheckBoxWidget *tasks_cbw; KsCheckBoxDialog *dialog; QVector streamIds; if (!kshark_instance(&kshark_ctx)) return; streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { stream = kshark_ctx->stream[sd]; tasks_cbw = new KsTasksCheckBoxWidget(stream, true, this); cbws.append(tasks_cbw); _presetCBWidget(stream->show_task_filter, stream->hide_task_filter, tasks_cbw); } dialog = new KsCheckBoxDialog(cbws, this); auto lamFilter = [=] (int sd, QVector show) { QVector all = KsUtils::getPidList(sd); _applyFilter(sd, all, show, LAMBDA_FILTER(_data.applyPosTaskFilter), LAMBDA_FILTER(_data.applyNegTaskFilter)); }; connect(dialog, &KsCheckBoxDialog::apply, lamFilter); dialog->show(); } void KsMainWindow::_showCPUs() { kshark_context *kshark_ctx(nullptr); QVector cbws; kshark_data_stream *stream; KsCheckBoxWidget *cpus_cbw; KsCheckBoxDialog *dialog; QVector streamIds; if (!kshark_instance(&kshark_ctx)) return; streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { stream = kshark_ctx->stream[sd]; cpus_cbw = new KsCPUCheckBoxWidget(stream, this); cbws.append(cpus_cbw); _presetCBWidget(stream->show_task_filter, stream->hide_task_filter, cpus_cbw); } dialog = new KsCheckBoxDialog(cbws, this); auto lamFilter = [=] (int sd, QVector show) { QVector all = KsUtils::getCPUList(sd); _applyFilter(sd, all, show, LAMBDA_FILTER(_data.applyPosCPUFilter), LAMBDA_FILTER(_data.applyNegCPUFilter)); }; connect(dialog, &KsCheckBoxDialog::apply, lamFilter); dialog->show(); } void KsMainWindow::_advancedFiltering() { KsAdvFilteringDialog *dialog; dialog = new KsAdvFilteringDialog(this); connect(dialog, &KsAdvFilteringDialog::dataReload, &_data, &KsDataStore::reload); dialog->show(); } void KsMainWindow::_clearFilters() { _data.clearAllFilters(); } void KsMainWindow::_cpuSelect() { kshark_context *kshark_ctx(nullptr); QVector cbws; kshark_data_stream *stream; KsCheckBoxWidget *cpus_cbd; KsCheckBoxDialog *dialog; QVector streamIds; int nCPUs; if (!kshark_instance(&kshark_ctx)) return; streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { stream = kshark_ctx->stream[sd]; cpus_cbd = new KsCPUCheckBoxWidget(stream, this); cbws.append(cpus_cbd); nCPUs = stream->n_cpus; if (nCPUs == _graph.glPtr()->cpuGraphCount(sd)) { cpus_cbd->setDefault(true); } else { QVector v(nCPUs, false); for (auto const &cpu: _graph.glPtr()->_streamPlots[sd]._cpuList) v[cpu] = true; cpus_cbd->set(v); } } dialog = new KsCheckBoxDialog(cbws, this); connect(dialog, &KsCheckBoxDialog::apply, &_graph, &KsTraceGraph::cpuReDraw); dialog->show(); } void KsMainWindow::_taskSelect() { kshark_context *kshark_ctx(nullptr); QVector cbws; QVector streamIds, pids; kshark_data_stream *stream; KsCheckBoxWidget *tasks_cbd; KsCheckBoxDialog *dialog; int nPids; if (!kshark_instance(&kshark_ctx)) return; streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { stream = kshark_ctx->stream[sd]; tasks_cbd = new KsTasksCheckBoxWidget(stream, true, this); cbws.append(tasks_cbd); pids = KsUtils::getPidList(sd); nPids = pids.count(); if (nPids == _graph.glPtr()->taskGraphCount(sd)) { tasks_cbd->setDefault(true); } else { QVector v(nPids, false); for (int i = 0; i < nPids; ++i) { QVector plots = _graph.glPtr()->_streamPlots[sd]._taskList; for (auto const &pid: plots) { if (pids[i] == pid) { v[i] = true; break; } } } tasks_cbd->set(v); } } dialog = new KsCheckBoxDialog(cbws, this); connect(dialog, &KsCheckBoxDialog::apply, &_graph, &KsTraceGraph::taskReDraw); dialog->show(); } void KsMainWindow::_pluginSelect() { QVector streamIds, enabledPlugins, failedPlugins; kshark_context *kshark_ctx(nullptr); QVector cbws; KsPluginCheckBoxWidget *plugin_cbw; KsCheckBoxDialog *dialog; QStringList pluginList; if (!kshark_instance(&kshark_ctx)) return; if (kshark_ctx->n_streams == 0) { QString err("Data has to be loaded first."); QMessageBox msgBox; msgBox.critical(nullptr, "Error", err); return; } streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { pluginList = _plugins.getStreamPluginList(sd); enabledPlugins = _plugins.getActivePlugins(sd); failedPlugins = _plugins.getPluginsByStatus(sd, KSHARK_PLUGIN_FAILED); plugin_cbw = new KsPluginCheckBoxWidget(sd, pluginList, this); plugin_cbw->set(enabledPlugins); plugin_cbw->setActive(failedPlugins, false); cbws.append(plugin_cbw); } dialog = new KsPluginsCheckBoxDialog(cbws, &_data, this); dialog->applyStatus(); connect(dialog, &KsCheckBoxDialog::apply, this, &KsMainWindow::_pluginUpdate); dialog->show(); _graph.update(&_data); } void KsMainWindow::_pluginUpdate(int sd, QVector pluginStates) { kshark_context *kshark_ctx(nullptr); QVector streamIds; if (!kshark_instance(&kshark_ctx)) return; _plugins.updatePlugins(sd, pluginStates); streamIds = KsUtils::getStreamIdList(kshark_ctx); if (streamIds.size() && streamIds.last() == sd) { /* This is the last stream. Reload the data. */ if (_data.size()) _data.reload(); } } void KsMainWindow::_pluginAdd() { kshark_context *kshark_ctx(nullptr); QStringList fileNames; QVector streams; if (!kshark_instance(&kshark_ctx)) return; fileNames = KsUtils::getFiles(this, "Add KernelShark plugins", "KernelShark Plugins (*.so);;", _lastPluginFilePath); if (!fileNames.isEmpty()) { if (kshark_ctx->n_streams > 1) { KsDStreamCheckBoxWidget *stream_cbw; QVector cbws; KsCheckBoxDialog *dialog; stream_cbw = new KsDStreamCheckBoxWidget(); cbws.append(stream_cbw); dialog = new KsCheckBoxDialog(cbws, this); auto lamStreams = [&streams] (int, QVector s) { streams = s; }; connect(dialog, &KsCheckBoxDialog::apply, lamStreams); dialog->exec(); } _graph.startOfWork(KsDataWork::UpdatePlugins); _plugins.addPlugins(fileNames, streams); if (_data.size()) _data.reload(); _graph.endOfWork(KsDataWork::UpdatePlugins); } } void KsMainWindow::_record() { bool canDoAsRoot(false); #ifdef DO_AS_ROOT canDoAsRoot = true; #endif if (geteuid() && !canDoAsRoot) { QString message; message = "Record is currently not supported."; message += " Install \"pkexec\" and then do:
    "; message += " cd build
    sudo ./cmake_uninstall.sh
    "; message += " ./cmake_clean.sh
    cmake ..
    make
    "; message += " sudo make install"; _error(message, "recordCantStart", false); return; } _capture.start(); } void KsMainWindow::_offset() { KsTimeOffsetDialog *dialog = new KsTimeOffsetDialog(this); auto lamApplyOffset = [&] (int sd, double ms) { _data.setClockOffset(sd, ms * 1000); _graph.update(&_data); }; connect(dialog, &KsTimeOffsetDialog::apply, lamApplyOffset); } void KsMainWindow::_setColorPhase(int f) { KsPlot::Color::setRainbowFrequency(f / 100.); _graph.glPtr()->loadColors(); _graph.glPtr()->model()->update(); } void KsMainWindow::_changeScreenMode() { if (isFullScreen()) { _fullScreenModeAction.setText("Full Screen Mode"); _fullScreenModeAction.setIcon(QIcon::fromTheme("view-fullscreen")); showNormal(); } else { _fullScreenModeAction.setText("Exit Full Screen Mode"); _fullScreenModeAction.setIcon(QIcon::fromTheme("view-restore")); showFullScreen(); } } void KsMainWindow::_aboutInfo() { KsMessageDialog *message; QString text; text.append(" KernelShark\n\n version: "); text.append(KS_VERSION_STRING); text.append("\n"); message = new KsMessageDialog(text); message->setWindowTitle("About"); message->show(); } void KsMainWindow::_contents() { QDesktopServices::openUrl(QUrl("http://kernelshark.org/", QUrl::TolerantMode)); } void KsMainWindow::_bugReport() { QUrl bugs("https://bugzilla.kernel.org/buglist.cgi?component=Trace-cmd%2FKernelshark&product=Tools&resolution=---", QUrl::TolerantMode); QDesktopServices::openUrl(bugs); } void KsMainWindow::_load(const QString& fileName, bool append) { QString pbLabel("Loading "); bool loadDone = false; struct stat st; double shift(.0); int ret, sd; ret = stat(fileName.toStdString().c_str(), &st); if (ret != 0) { QString text("Unable to find file "); text.append(fileName); text.append("."); _error(text, "loadDataErr1", true); return; } qInfo() << "Loading " << fileName; if (fileName.size() < 40) { pbLabel += fileName; } else { pbLabel += "..."; pbLabel += fileName.sliced(fileName.size() - 37); } setWindowTitle("Kernel Shark"); KsWidgetsLib::KsProgressBar pb(pbLabel); QApplication::processEvents(); _view.reset(); if (!append) _graph.reset(); auto lamLoadJob = [&, this] () { QVector v; for (auto const p: _plugins.getUserPlugins()) { if (p->process_interface) v.append(p->process_interface); } sd = _data.loadDataFile(fileName, v); loadDone = true; }; auto lamAppendJob = [&, this] () { sd = _data.appendDataFile(fileName, shift); loadDone = true; }; std::thread job; if (append) { job = std::thread(lamAppendJob); } else { job = std::thread(lamLoadJob); } for (int i = 0; i < 160; ++i) { /* * TODO: The way this progress bar gets updated here is a pure * cheat. See if this can be implemented better. */ if (loadDone) break; pb.setValue(i); usleep(150000); } job.join(); if (sd < 0 || !_data.size()) { QString text("File "); text.append(fileName); text.append(" contains no data."); _error(text, "loadDataErr2", true); } _view.loadData(&_data); pb.setValue(175); _graph.loadData(&_data, !append); if (append) _graph.cpuReDraw(sd, KsUtils::getCPUList(sd)); pb.setValue(195); } /** Load trace data for file. */ void KsMainWindow::loadDataFile(const QString& fileName) { _mState.reset(); _load(fileName, false); setWindowTitle("Kernel Shark (" + fileName + ")"); } /** Append trace data for file. */ void KsMainWindow::appendDataFile(const QString& fileName) { kshark_entry *eMarkA(nullptr), *eMarkB(nullptr); int rowA = _mState.markerAPos(); int rowB = _mState.markerBPos(); if (rowA >= 0) eMarkA = _data.rows()[rowA]; if (rowB >= 0) eMarkB = _data.rows()[rowB]; _load(fileName, true); markEntry(eMarkA, DualMarkerState::A); markEntry(eMarkB, DualMarkerState::B); } void KsMainWindow::_error(const QString &mesg, const QString &errCode, bool resize) { QErrorMessage *em = new QErrorMessage(this); QString text = mesg; QString html = mesg; if (resize) _resizeEmpty(); text.replace("
    ", "\n", Qt::CaseInsensitive); html.replace("\n", "
    ", Qt::CaseInsensitive); qCritical().noquote() << "ERROR:" << text; em->showMessage(html, errCode); em->exec(); } /** * @brief Load user session. * * @param fileName: Json file containing the description of the session. */ void KsMainWindow::loadSession(const QString &fileName) { kshark_context *kshark_ctx(nullptr); bool loadDone = false; struct stat st; int ret; if (!kshark_instance(&kshark_ctx)) return; ret = stat(fileName.toStdString().c_str(), &st); if (ret != 0) { QString text("Unable to find session file "); text.append(fileName); text.append("\n"); _error(text, "loadSessErr0", true); return; } KsWidgetsLib::KsProgressBar pb("Loading session settings ..."); pb.setValue(10); _updateSessionSize = false; if (!_session.importFromFile(fileName)) { QString text("Unable to open session description file "); text.append(fileName); text.append(".\n"); _error(text, "loadSessErr1", true); return; } _view.reset(); _graph.reset(); _data.clear(); _session.loadUserPlugins(kshark_ctx, &_plugins); pb.setValue(20); auto lamLoadJob = [&] () { _session.loadDataStreams(kshark_ctx, &_data); loadDone = true; }; std::thread job = std::thread(lamLoadJob); for (int i = 0; i < 150; ++i) { /* * TODO: The way this progress bar gets updated here is a pure * cheat. See if this can be implemented better. */ if (loadDone) break; pb.setValue(i); usleep(300000); } job.join(); _view.loadData(&_data); pb.setValue(155); _graph.loadData(&_data, true); _filterSyncCBoxUpdate(kshark_ctx); pb.setValue(175); _session.loadSplitterSize(&_splitter); _session.loadMainWindowSize(this); _updateSessionSize = true; pb.setValue(180); _session.loadDualMarker(&_mState, &_graph); _session.loadVisModel(_graph.glPtr()->model()); _mState.updateMarkers(_data, _graph.glPtr()); _session.loadGraphs(kshark_ctx, _graph); pb.setValue(190); _session.loadTable(&_view); _colorPhaseSlider.setValue(_session.getColorScheme() * 100); _graph.updateGeom(); } void KsMainWindow::_initCapture() { bool canDoAsRoot(false); #ifdef DO_AS_ROOT canDoAsRoot = true; #endif if (geteuid() && !canDoAsRoot) return; if (geteuid()) { _capture.setProgram("kshark-su-record"); } else { QStringList argv; _capture.setProgram("kshark-record"); argv << QString("-o") << QDir::homePath() + "/trace.dat"; _capture.setArguments(argv); } connect(&_capture, &QProcess::started, this, &KsMainWindow::_captureStarted); connect(&_capture, &QProcess::finished, this, &KsMainWindow::_captureFinished); _captureErrorConnection = connect(&_capture, &QProcess::errorOccurred, this, &KsMainWindow::_captureError); connect(&_captureLocalServer, &QLocalServer::newConnection, this, &KsMainWindow::_readSocket); } void KsMainWindow::_captureStarted() { _captureLocalServer.listen("KSCapture"); } /** * If the authorization could not be obtained because the user dismissed * the authentication dialog (clicked Cancel), pkexec exits with a return * value of 126. */ #define PKEXEC_DISMISS_RET 126 void KsMainWindow::_captureFinished(int ret, QProcess::ExitStatus st) { QProcess *capture = (QProcess *)sender(); _captureLocalServer.close(); if (ret == PKEXEC_DISMISS_RET) { /* * Authorization could not be obtained because the user * dismissed the authentication dialog. */ return; } if (ret != 0 && st == QProcess::NormalExit) _captureErrorMessage(capture); } void KsMainWindow::_captureError([[maybe_unused]] QProcess::ProcessError error) { QProcess *capture = static_cast(sender()); _captureErrorMessage(capture); } void KsMainWindow::_captureErrorMessage(QProcess *capture) { QString message = "Capture process failed: "; message += capture->errorString(); message += "
    Standard Error: "; message += capture->readAllStandardError(); _error(message, "captureFinishedErr", false); } void KsMainWindow::_readSocket() { QLocalSocket *socket; quint32 blockSize; QString fileName; auto lamSocketError = [&](QString message) { message = "ERROR from Local Server: " + message; _error(message, "readSocketErr", false); }; socket = _captureLocalServer.nextPendingConnection(); if (!socket) { lamSocketError("Pending connectio not found!"); return; } QDataStream in(socket); socket->waitForReadyRead(); if (socket->bytesAvailable() < (int)sizeof(quint32)) { lamSocketError("Message size is corrupted!"); return; }; in >> blockSize; if (socket->bytesAvailable() < blockSize || in.atEnd()) { lamSocketError("Message is corrupted!"); return; } in >> fileName; loadDataFile(fileName); } void KsMainWindow::_splitterMoved([[maybe_unused]] int pos, [[maybe_unused]] int index) { _session.saveSplitterSize(_splitter); } void KsMainWindow::_deselectActive() { _view.clearSelection(); _mState.activeMarker().remove(); _mState.updateLabels(); _graph.glPtr()->model()->update(); } void KsMainWindow::_deselectA() { if (_mState.getState() == DualMarkerState::A) _view.clearSelection(); else _view.passiveMarkerSelectRow(KS_NO_ROW_SELECTED); _mState.markerA().remove(); _mState.updateLabels(); _graph.glPtr()->model()->update(); } void KsMainWindow::_deselectB() { if (_mState.getState() == DualMarkerState::B) _view.clearSelection(); else _view.passiveMarkerSelectRow(KS_NO_ROW_SELECTED); _mState.markerB().remove(); _mState.updateLabels(); _graph.glPtr()->model()->update(); } void KsMainWindow::_rootWarning() { QString cbFlag("noRootWarn"); if (_settings.value(cbFlag).toBool()) return; QMessageBox warn; warn.setText("KernelShark is running with Root privileges."); warn.setInformativeText("Continue at your own risk."); warn.setIcon(QMessageBox::Warning); warn.setStandardButtons(QMessageBox::Close); QCheckBox cb("Don't show this message again."); auto lamCbChec = [&] (int state) { if (state) _settings.setValue(cbFlag, true); }; connect(&cb, &QCheckBox::stateChanged, lamCbChec); warn.setCheckBox(&cb); warn.exec(); } kernel-shark-kernelshark-v2.4.0/src/KsMainWindow.hpp000066400000000000000000000142651477354127100224750ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsMainWindow.hpp * @brief KernelShark GUI main window. */ #ifndef _KS_MAINWINDOW_H #define _KS_MAINWINDOW_H // Qt #include #include // KernelShark #include "KsTraceViewer.hpp" #include "KsTraceGraph.hpp" #include "KsWidgetsLib.hpp" #include "KsPlugins.hpp" #include "KsSession.hpp" #include "KsUtils.hpp" /** * The KsMainWindow class provides Main window for the KernelShark GUI. */ class KsMainWindow : public QMainWindow { Q_OBJECT public: explicit KsMainWindow(QWidget *parent = nullptr); ~KsMainWindow(); void loadDataFile(const QString &fileName); void appendDataFile(const QString &fileName); void loadSession(const QString &fileName); QString lastSessionFile(); /** * @brief Register a list of plugins. * * @param plugins: Provide here the names of the plugin (as in the * CMake-generated header file) or the names of the * plugin's library files (.so including path). * The names must be comma separated. */ void registerPlugins(const QString &plugins) { _plugins.registerPlugins(plugins); } /** * @brief Unregister a list pf plugins. * * @param pluginNames: Provide here a comma separated list of plugin * names (as in the CMake-generated header file). */ void unregisterPlugins(const QString &pluginNames) { _plugins.unregisterPlugins(pluginNames); } /** * @brief Register a given plugin to given Data streams. * * @param pluginName: The name of the plugin to register. * @param streamIds: Vector of Data stream identifiers. */ void registerPluginToStream(const QString &pluginName, QVector streamIds) { _plugins.registerPluginToStream(pluginName, streamIds); } /** * @brief Unregister a given plugin from given Data streams. * * @param pluginName: The name of the plugin to unregister. * @param streamIds: Vector of Data stream identifiers. */ void unregisterPluginFromStream(const QString &pluginName, QVector streamIds) { _plugins.unregisterPluginFromStream(pluginName, streamIds); } void setCPUPlots(int sd, QVector cpus); void setTaskPlots(int sd, QVector pids); void resizeEvent(QResizeEvent* event); /** Set the Full Screen mode. */ void setFullScreenMode(bool f) { if ((!isFullScreen() && f) || (isFullScreen() && !f) ) _changeScreenMode(); } void addPluginMenu(QString place, pluginActionFunc action); /** Get the KsTraceGraph object. */ KsTraceGraph *graphPtr() {return &_graph;} /** Get the KsTraceViewer object. */ KsTraceViewer *viewPtr() {return &_view;} /** Get the KsWorkInProgress object. */ KsWidgetsLib::KsWorkInProgress *wipPtr() {return &_workInProgress;} void markEntry(ssize_t row, DualMarkerState st); void markEntry(const kshark_entry *e, DualMarkerState st); private: QSplitter _splitter; /** GUI session. */ KsSession _session; /** Data Manager. */ KsDataStore _data; /** Widget for reading and searching in the trace data. */ KsTraceViewer _view; /** Widget for graphical visualization of the trace data. */ KsTraceGraph _graph; /** Dual Marker State Machine. */ KsDualMarkerSM _mState; /** Plugin manager. */ KsPluginManager _plugins; /** The process used to record trace data. */ QProcess _capture; /** Local Server used for comunucation with the Capture process. */ QLocalServer _captureLocalServer; // File menu. QAction _openAction; QAction _appendAction; QAction _restoreSessionAction; QAction _importSessionAction; QAction _exportSessionAction; QAction _quitAction; // Filter menu. QCheckBox *_graphFilterSyncCBox; QCheckBox *_listFilterSyncCBox; QAction _showEventsAction; QAction _showTasksAction; QAction _showCPUsAction; QAction _advanceFilterAction; QAction _clearAllFilters; // Plots menu. QAction _cpuSelectAction; QAction _taskSelectAction; // Tools menu. QAction _managePluginsAction; QAction _addPluginsAction; QAction _captureAction; QAction _addOffcetAction; QWidgetAction _colorAction; QWidget _colSlider; QSlider _colorPhaseSlider; QAction _fullScreenModeAction; // Help menu. QAction _aboutAction; QAction _contentsAction; QAction _bugReportAction; QShortcut _deselectShortcut; QString _lastDataFilePath, _lastConfFilePath, _lastPluginFilePath; QSettings _settings; QMetaObject::Connection _captureErrorConnection; // Status bar. KsWidgetsLib::KsWorkInProgress _workInProgress; bool _updateSessionSize; void _load(const QString& fileName, bool append); void _open(); void _append(); void _restoreSession(); void _importSession(); void _exportSession(); void _listFilterSync(int state); void _graphFilterSync(int state); void _presetCBWidget(kshark_hash_id *showFilter, kshark_hash_id *hideFilter, KsWidgetsLib::KsCheckBoxWidget *cbw); void _applyFilter(int sd, QVector all, QVector show, std::function)> posFilter, std::function)> negFilter); void _showEvents(); void _showTasks(); void _showCPUs(); void _advancedFiltering(); void _clearFilters(); void _cpuSelect(); void _taskSelect(); void _pluginSelect(); void _pluginUpdate(int sd, QVector pluginStates); void _pluginAdd(); void _record(); void _offset(); void _setColorPhase(int); void _changeScreenMode(); void _aboutInfo(); void _contents(); void _bugReport(); void _captureStarted(); void _captureError(QProcess::ProcessError error); void _captureErrorMessage(QProcess *capture); void _readSocket(); void _splitterMoved(int pos, int index); void _createActions(); void _createMenus(); void _initCapture(); void _updateSession(); inline void _resizeEmpty() {resize(SCREEN_WIDTH * .5, FONT_HEIGHT * 3);} void _error(const QString &text, const QString &errCode, bool resize); void _deselectActive(); void _deselectA(); void _deselectB(); void _rootWarning(); void _updateFilterMenu(); void _filterSyncCBoxUpdate(kshark_context *kshark_ctx); QString _getCacheDir(); private slots: void _captureFinished(int, QProcess::ExitStatus); }; #endif // _KS_MAINWINDOW_H kernel-shark-kernelshark-v2.4.0/src/KsModels.cpp000066400000000000000000000357361477354127100216450ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsModels.cpp * @brief Models for data representation. */ // KernelShark #include "KsModels.hpp" #include "KsWidgetsLib.hpp" #include "KsUtils.hpp" /** Create a default (empty) KsFilterProxyModel object. */ KsFilterProxyModel::KsFilterProxyModel(QObject *parent) : QSortFilterProxyModel(parent), _searchStop(false), _source(nullptr) {} /** * Returns False if the item in the row indicated by the sourceRow and * sourceParent should be filtered out. Otherwise returns True. */ bool KsFilterProxyModel::filterAcceptsRow(int sourceRow, [[maybe_unused]] const QModelIndex &sourceParent) const { if (_data[sourceRow]->visible & KS_TEXT_VIEW_FILTER_MASK) return true; return false; } /** Provide the Proxy model with data. */ void KsFilterProxyModel::fill(KsDataStore *data) { _data = data->rows(); } /** Set the source model for this Proxy model. */ void KsFilterProxyModel::setSource(KsViewModel *s) { QSortFilterProxyModel::setSourceModel(s); _source = s; } size_t KsFilterProxyModel::_search(int column, const QString &searchText, search_condition_func cond, QList *matchList, int step, int first, int last, QProgressBar *pb, QLabel *l, int *lastRowSearched, bool notify) { int index, row, nRows(last - first + 1); int milestone(1), pbCount(1); QString item; if (nRows > KS_PROGRESS_BAR_MAX) milestone = pbCount = nRows / (KS_PROGRESS_BAR_MAX - step - _searchProgress); else _searchProgress = KS_PROGRESS_BAR_MAX - nRows; /* Loop over the items of the proxy model. */ for (index = first; index <= last; index += step) { /* * Use the index of the proxy model to retrieve the value * of the row number in the base model. */ row = mapRowFromSource(index); item = _source->getValueStr(column, row); if (cond(searchText, item)) matchList->append(row); if (_searchStop) { if (lastRowSearched) *lastRowSearched = index; if (notify) _pbCond.notify_one(); break; } /* Deal with the Progress bar of the seatch. */ if ((index - first) >= milestone) { milestone += pbCount; if (notify) { /* * This is a multi-threaded search. Notify * the main thread to update the progress bar. */ std::lock_guard lk(_mutex); ++_searchProgress; _pbCond.notify_one(); } else { if (pb) { pb->setValue(pb->value() + 1); ++_searchProgress; } if (l) l->setText(QString(" %1").arg(matchList->count())); QApplication::processEvents(); } } } return index; } /** @brief Search the content of the table for a data satisfying an abstract * condition. * * @param column: The number of the column to search in. * @param searchText: The text to search for. * @param cond: Matching condition function. * @param matchList: Output location for a list containing the row indexes of * the cells satisfying matching condition. * @param pb: Input location for a Progressbar used to visualize the progress * of the search. * @param l: Input location for a label used to show the number of cells found. * * @returns The number of cells satisfying the matching condition. */ size_t KsFilterProxyModel::search(int column, const QString &searchText, search_condition_func cond, QList *matchList, QProgressBar *pb, QLabel *l) { int nRows = rowCount({}); _search(column, searchText, cond, matchList, 1, // step 0, // first nRows - 1, // last pb, l, nullptr, false); return matchList->count(); } /** @brief Search the content of the table for a data satisfying an abstract * condition. * * @param sm: Input location for the Search State machine object. * @param matchList: Output location for a list containing the row indexes of * * @returns The number of cells satisfying the matching condition. */ size_t KsFilterProxyModel::search(KsSearchFSM *sm, QList *matchList) { int nRows = rowCount({}); _search(sm->column(), sm->searchText(), sm->condition(), matchList, 1, // step sm->_lastRowSearched + 1, // first nRows - 1, // last &sm->_searchProgBar, &sm->_searchCountLabel, &sm->_lastRowSearched, false); return matchList->count(); } /** @brief Search the content of the table for a data satisfying an abstract * condition. * * @param column: The number of the column to search in. * @param searchText: The text to search for. * @param cond: Matching condition function. * @param step: The step used by the thread of the search when looping over * the data. * @param first: Row index specifying the position inside the table from * where the search starts. * @param last: Row index specifying the position inside the table from * where the search ends. * @param lastRowSearched: Output location for parameter showing the index of * the last searched item (data row). * @param notify: Input location for flag specifying if the search has to * notify the main thread when to update the progress bar. * * @returns A list containing the row indexes of the cells satisfying matching * condition. */ QList KsFilterProxyModel::searchThread(int column, const QString &searchText, search_condition_func cond, int step, int first, int last, int *lastRowSearched, bool notify) { QList matchList; _search(column, searchText, cond, &matchList, step, first, last, nullptr, nullptr, lastRowSearched, notify); return matchList; } int KsFilterProxyModel::mapRowFromSource(int r) const { /* * This works because the row number is shown in column * TRACE_VIEW_COL_INDEX (or TRACE_VIEW_COL_INDEX - 1 in the case when * the Stream Id column is hidden). */ int column = KsViewModel::TRACE_VIEW_COL_INDEX; if(_source->singleStream()) column--; return this->data(this->index(r, column)).toInt(); } /** Create default (empty) KsViewModel object. */ KsViewModel::KsViewModel(QObject *parent) : QAbstractTableModel(parent), _data(nullptr), _nRows(0), _markA(KS_NO_ROW_SELECTED), _markB(KS_NO_ROW_SELECTED), _singleStream(true) { _updateHeader(); } /** Update the list of table headers. */ void KsViewModel::_updateHeader() { beginRemoveColumns(QModelIndex(), 0, _header.count()); endRemoveColumns(); _header.clear(); if (KsUtils::getNStreams() > 1) { _header << " >> "; _singleStream = false; } else { _singleStream = true; } _header << "#" << "CPU" << "Time Stamp" << "Task" << "PID" << "Latency" << "Event" << "Info"; beginInsertColumns(QModelIndex(), 0, _header.count() - 1); endInsertColumns(); } /** * Get the data stored under the given role for the item referred to by * the index. This is an implementation of the pure virtual method of the * abstract model class. */ QVariant KsViewModel::data(const QModelIndex &index, int role) const { if (role == Qt::ForegroundRole) { if (index.row() == _markA && index.column() != 0) return QVariant::fromValue(QColor(Qt::white)); if (index.row() == _markB && index.column() != 0) return QVariant::fromValue(QColor(Qt::white)); } if (role == Qt::BackgroundRole) { if (index.row() == _markA) return QVariant::fromValue(QColor(_colorMarkA)); if (index.row() == _markB) return QVariant::fromValue(QColor(_colorMarkB)); if (index.column() == TRACE_VIEW_COL_STREAM && !_singleStream) { int sd = _data[index.row()]->stream_id; QColor col; col << KsPlot::getColor(&_streamColors, sd); return QVariant::fromValue(col); } } if (role == Qt::DisplayRole) return this->getValue(index.column(), index.row()); return {}; } /** Get the string data stored in a given cell of the table. */ QString KsViewModel::getValueStr(int column, int row) const { char *buffer; int pid; /* * If only one Data stream (file) is loaded, the first column * (TRACE_VIEW_COL_STREAM) is not shown. */ if(_singleStream) column++; auto lanMakeString = [&buffer] () { QString str(buffer); free(buffer); return str; }; switch (column) { case TRACE_VIEW_COL_STREAM : return QString("%1").arg(_data[row]->stream_id); case TRACE_VIEW_COL_INDEX : return QString("%1").arg(row); case TRACE_VIEW_COL_CPU: return QString("%1").arg(_data[row]->cpu); case TRACE_VIEW_COL_TS: return KsUtils::Ts2String(_data[row]->ts, 6); case TRACE_VIEW_COL_COMM: buffer = kshark_get_task(_data[row]); return lanMakeString(); case TRACE_VIEW_COL_PID: pid = kshark_get_pid(_data[row]); return QString("%1").arg(pid); case TRACE_VIEW_COL_AUX: buffer = kshark_get_aux_info(_data[row]); return lanMakeString(); case TRACE_VIEW_COL_EVENT: buffer = kshark_get_event_name(_data[row]); return lanMakeString(); case TRACE_VIEW_COL_INFO : buffer = kshark_get_info(_data[row]); return lanMakeString(); default: return {}; } } /** Get the data stored in a given cell of the table. */ QVariant KsViewModel::getValue(int column, int row) const { return getValueStr(column, row); } /** * Get the header of a column. This is an implementation of the pure virtual * method of the abstract model class. */ QVariant KsViewModel::headerData(int column, Qt::Orientation orientation, int role) const { if (orientation != Qt::Horizontal || role != Qt::DisplayRole) return {}; if (column < _header.count()) return _header.at(column); return {}; } /** Provide the model with data. */ void KsViewModel::fill(KsDataStore *data) { beginInsertRows(QModelIndex(), 0, data->size() - 1); _data = data->rows(); _nRows = data->size(); _streamColors = KsPlot::streamColorTable(); endInsertRows(); _updateHeader(); } /** @brief Select a row in the table. * * @param state: Identifier of the marker used to select the row. * @param row: Row index. */ void KsViewModel::selectRow(DualMarkerState state, int row) { if (state == DualMarkerState::A) { _markA = row; _markB = KS_NO_ROW_SELECTED; } else { _markB = row; _markA = KS_NO_ROW_SELECTED; } } /** Reset the model. */ void KsViewModel::reset() { beginResetModel(); _data = nullptr; _nRows = 0; endResetModel(); } /** Update the model. Use this function if the data has changed. */ void KsViewModel::update(KsDataStore *data) { /* * Do not try to skip the reset(). The row count has to be set to * zero before you full. */ reset(); fill(data); } /** Update the color scheme used by the model. */ void KsViewModel::loadColors() { beginResetModel(); _streamColors = KsPlot::streamColorTable(); endResetModel(); } /** @brief Search the content of the table for a data satisfying an abstract * condition. * * @param column: The number of the column to search in. * @param searchText: The text to search for. * @param cond: Matching condition function. * @param matchList: Output location for a list containing the row indexes of * the cells satisfying the matching condition. * * @returns The number of cells satisfying the matching condition. */ size_t KsViewModel::search(int column, const QString &searchText, search_condition_func cond, QList *matchList) { int nRows = rowCount({}); QVariant item; for (int r = 0; r < nRows; ++r) { item = getValue(r, column); if (cond(searchText, item.toString())) { matchList->append(r); } } return matchList->count(); } /** @brief Reimplements handler to return a flags that enables the item * (ItemIsEnabled) and allows it to be selecte. * * @param index: The index of the item. * * @returns Returns the item flags for the given index. */ Qt::ItemFlags KsViewModel::flags(const QModelIndex &index) const { if (!index.isValid()) return Qt::ItemIsEnabled; return QAbstractItemModel::flags(index) | Qt::ItemIsEditable; } /** Create a default (empty) KsFilterProxyModel object. */ KsGraphModel::KsGraphModel(QObject *parent) : QAbstractTableModel(parent) { ksmodel_init(&_histo); } /** Destroy KsFilterProxyModel object. */ KsGraphModel::~KsGraphModel() { ksmodel_clear(&_histo); } /** * @brief Provide the Visualization model with data. Calculate the current * state of the model. */ void KsGraphModel::fill(KsDataStore *data) { kshark_entry **entries = data->rows(); size_t n = data->size(); if (n == 0) return; beginResetModel(); if (_histo.n_bins == 0) ksmodel_set_bining(&_histo, KS_DEFAULT_NBUNS, entries[0]->ts, entries[n - 1]->ts); ksmodel_fill(&_histo, entries, n); endResetModel(); } /** * @brief Shift the time-window of the model forward. Recalculate the current * state of the model. * * @param n: Number of bins to shift. */ void KsGraphModel::shiftForward(size_t n) { beginResetModel(); ksmodel_shift_forward(&_histo, n); endResetModel(); } /** * @brief Shift the time-window of the model backward. Recalculate the current * state of the model. * * @param n: Number of bins to shift. */ void KsGraphModel::shiftBackward(size_t n) { beginResetModel(); ksmodel_shift_backward(&_histo, n); endResetModel(); } /** * @brief Move the time-window of the model to a given location. Recalculate * the current state of the model. * * @param ts: position in time to be visualized. */ void KsGraphModel::jumpTo(size_t ts) { beginResetModel(); ksmodel_jump_to(&_histo, ts); endResetModel(); } /** * @brief Extend the time-window of the model. Recalculate the current state * of the model. * * @param r: Scale factor of the zoom-out. * @param mark: Focus point of the zoom-out. */ void KsGraphModel::zoomOut(double r, int mark) { beginResetModel(); ksmodel_zoom_out(&_histo, r, mark); endResetModel(); } /** * @brief Shrink the time-window of the model. Recalculate the current state * of the model. * * @param r: Scale factor of the zoom-in. * @param mark: Focus point of the zoom-in. */ void KsGraphModel::zoomIn(double r, int mark) { beginResetModel(); ksmodel_zoom_in(&_histo, r, mark); endResetModel(); } /** Quick zoom out. The entire data-set will be visualized. */ void KsGraphModel::quickZoomOut() { beginResetModel(); ksmodel_set_bining(&_histo, _histo.n_bins, _histo.data[0]->ts, _histo.data[_histo.data_size - 1]->ts); ksmodel_fill(&_histo, _histo.data, _histo.data_size); endResetModel(); } /** * @brief Quick zoom in to a state of the Visualization model which has the * given bin size. The actual value of the bin size may en up being slightly * different because of the fine tuning performed by the model. * * @param binSize: an approximate value for the new size of the bins. */ void KsGraphModel::quickZoomIn(uint64_t binSize) { double range, r; range = _histo.max - _histo.min; r = 1 - (binSize * _histo.n_bins) / range; zoomIn(r); } /** Reset the model. */ void KsGraphModel::reset() { beginResetModel(); ksmodel_clear(&_histo); endResetModel(); } /** Update the model. Use this function if the data has changed. */ void KsGraphModel::update(KsDataStore *data) { beginResetModel(); if (data) ksmodel_fill(&_histo, data->rows(), data->size()); endResetModel(); } kernel-shark-kernelshark-v2.4.0/src/KsModels.hpp000066400000000000000000000157371477354127100216510ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsModels.hpp * @brief Models for data representation. */ #ifndef _KS_MODELS_H #define _KS_MODELS_H // C++11 #include #include // Qt #include #include #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-model.h" #include "KsPlotTools.hpp" #include "KsSearchFSM.hpp" /** A negative row index, to be used for deselecting the Passive Marker. */ #define KS_NO_ROW_SELECTED -1 enum class DualMarkerState; class KsDataStore; /** * Class KsViewModel provides models for trace data representation in a * table view. */ class KsViewModel : public QAbstractTableModel { public: explicit KsViewModel(QObject *parent = nullptr); /** Set the colors of the two markers. */ void setMarkerColors(const QColor &colA, const QColor &colB) { _colorMarkA = colA; _colorMarkB = colB; }; /** * Get the number of rows. This is an implementation of the pure * virtual method of the abstract model class. */ int rowCount(const QModelIndex &) const override {return _nRows;} /** * Get the number of columns. This is an implementation of the pure * virtual method of the abstract model class. */ int columnCount(const QModelIndex &) const override { return _header.count(); } QVariant headerData(int section, Qt::Orientation orientation, int role) const override; QVariant data(const QModelIndex &index, int role) const override; void fill(KsDataStore *data); void selectRow(DualMarkerState state, int row); void reset(); void update(KsDataStore *data); /** Get the list of column's headers. */ const QStringList& header() const {return _header;} QString getValueStr(int column, int row) const; QVariant getValue(int column, int row) const; size_t search(int column, const QString &searchText, search_condition_func cond, QList *matchList); void loadColors(); /** Returns True is only one Data stream is open. */ bool singleStream() const {return _singleStream;} /** Table columns Identifiers. */ enum { /** Identifier of the Data stream. */ TRACE_VIEW_COL_STREAM, /** Identifier of the Index column. */ TRACE_VIEW_COL_INDEX, /** Identifier of the CPU column. */ TRACE_VIEW_COL_CPU, /** Identifier of the Timestamp column. */ TRACE_VIEW_COL_TS, /** Identifier of the Task name (command) column. */ TRACE_VIEW_COL_COMM, /** Identifier of the Process Id column. */ TRACE_VIEW_COL_PID, /** Identifier of the Latency Id column. */ TRACE_VIEW_COL_AUX, /** Identifier of the Event name Id column. */ TRACE_VIEW_COL_EVENT, /** Identifier of the Event name Id column. */ TRACE_VIEW_COL_INFO, /** Number of column. */ TRACE_VIEW_N_COLUMNS, }; Qt::ItemFlags flags(const QModelIndex &index) const; private: void _updateHeader(); /** Trace data array. */ kshark_entry **_data; /** The size of the data array. */ size_t _nRows; /** The headers of the individual columns. */ QStringList _header; /** The index of marker A inside the data array. */ int _markA; /** The index of marker A inside the data array. */ int _markB; /** The color of the row selected by marker A. */ QColor _colorMarkA; /** The color of the row selected by marker B. */ QColor _colorMarkB; /** True if only one Data stream is open. */ bool _singleStream; KsPlot::ColorTable _streamColors; }; /** * Class KsFilterProxyModel provides support for filtering trace data in * table view. */ class KsFilterProxyModel : public QSortFilterProxyModel { Q_OBJECT public: explicit KsFilterProxyModel(QObject *parent = nullptr); void fill(KsDataStore *data); void setSource(KsViewModel *s); size_t search(int column, const QString &searchText, search_condition_func cond, QList *matchList, QProgressBar *pb = nullptr, QLabel *l = nullptr); size_t search(KsSearchFSM *sm, QList *matchList); QList searchThread(int column, const QString &searchText, search_condition_func cond, int step, int first, int last, int *lastRowSearched, bool notify); /** Get the progress of the search. */ int searchProgress() const {return _searchProgress;} /** Reset the progress value of the search. */ void searchReset() { _searchProgress = 0; _searchStop = false; } /** * Use the "row" index in the Proxy model to retrieve the "row" index * in the source model. */ int mapRowFromSource(int r) const; /** Get the source model. */ KsViewModel *source() {return _source;} /** * A condition variable used to notify the main thread to update the * search progressbar. */ std::condition_variable _pbCond; /** A mutex used by the condition variable. */ std::mutex _mutex; /** A flag used to stop the search for all threads. */ bool _searchStop; protected: bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; private: int _searchProgress; /** Trace data array. */ kshark_entry **_data; KsViewModel *_source; size_t _search(int column, const QString &searchText, search_condition_func cond, QList *matchList, int step, int first, int last, QProgressBar *pb, QLabel *l, int *lastRowSearched, bool notify); }; /** * Class KsGraphModel provides a model for visualization of trace data. This * class is a wrapper of kshark_trace_histo and is needed only because we want * to use the signals defined in QAbstractTableModel. */ class KsGraphModel : public QAbstractTableModel { public: explicit KsGraphModel(QObject *parent = nullptr); virtual ~KsGraphModel(); /** * This dummy function is an implementation of the pure * virtual method of the abstract model class. */ int rowCount(const QModelIndex &) const override { return _histo.n_bins; } /** * This dummy function is an implementation of the pure * virtual method of the abstract model class. */ int columnCount(const QModelIndex &) const override {return 0;} /** * This dummy function is an implementation of the pure * virtual method of the abstract model class. */ QVariant data([[maybe_unused]] const QModelIndex &index, [[maybe_unused]] int role) const override { return {}; } /** Get the kshark_trace_histo object. */ kshark_trace_histo *histo() {return &_histo;} void fill(KsDataStore *data); void shiftForward(size_t n); void shiftBackward(size_t n); void jumpTo(size_t ts); void zoomOut(double r, int mark = -1); void zoomIn(double r, int mark = -1); void quickZoomOut(); void quickZoomIn(uint64_t binSize); void reset(); void update(KsDataStore *data = nullptr); private: kshark_trace_histo _histo; }; /** Defines a default number of bins to be used by the visualization model. */ #define KS_DEFAULT_NBUNS 1024 #endif // _KS_MODELS_H kernel-shark-kernelshark-v2.4.0/src/KsPlotTools.cpp000066400000000000000000001014601477354127100223450ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsPlotTools.cpp * @brief KernelShark Plot tools. */ // C #include #include // C++ #include #include // KernelShark #include "KsPlotTools.hpp" namespace KsPlot { float Color::_frequency = .75; /** * @brief Create a default color (black). */ Color::Color() { _col_c.red = _col_c.green = _col_c.blue = 0; } /** * @brief Constructs a RGB color object. * * @param r: The red component of the color. * @param g: The green component of the color. * @param b: The blue component of the color */ Color::Color(uint8_t r, uint8_t g, uint8_t b) { set(r, g, b); } /** * @brief Constructs a RGB color object. * * @param rgb: RGB value. */ Color::Color(int rgb) { set(rgb); } /** * @brief Sets the color. * * @param r: The red component of the color. * @param g: The green component of the color. * @param b: The blue component of the color */ void Color::set(uint8_t r, uint8_t g, uint8_t b) { _col_c.red = r; _col_c.green = g; _col_c.blue = b; } /** * @brief Sets the color. * * @param rgb: RGB value. */ void Color::set(int rgb) { int r = rgb & 0xFF; int g = (rgb >> 8) & 0xFF; int b = (rgb >> 16) & 0xFF; set(r, g, b); } /** * @brief The color is selected from the Rainbow palette. * * @param n: index of the color inside the Rainbow palette. */ void Color::setRainbowColor(int n) { int r = sin(_frequency * n + 0) * 127 + 128; int g = sin(_frequency * n + 2) * 127 + 128; int b = sin(_frequency * n + 4) * 127 + 128; set(r, g, b); } /** Alpha blending with white background. */ void Color::blend(float alpha) { if (alpha < 0 || alpha > 1.) return; auto lamBld = [alpha](int val) { return val * alpha + (1 - alpha) * 255; }; int r = lamBld(this->r()); int g = lamBld(this->g()); int b = lamBld(this->b()); set(r, g, b); } /** * @brief Create a Hash table of Rainbow colors. The sorted Pid values are * mapped to the palette of Rainbow colors. * * @returns ColorTable instance. */ ColorTable taskColorTable() { struct kshark_context *kshark_ctx(nullptr); int nTasks(0), pid, *pids, i(0), *streamIds; std::vector tempPids; ColorTable colors; if (!kshark_instance(&kshark_ctx)) return colors; streamIds = kshark_all_streams(kshark_ctx); for (int j = 0; j < kshark_ctx->n_streams; ++j) { nTasks = kshark_get_task_pids(kshark_ctx, streamIds[j], &pids); tempPids.insert(tempPids.end(), pids, pids + nTasks); free(pids); } free(streamIds); if (!tempPids.size()) return colors; std::sort(tempPids.begin(), tempPids.end()); /* Erase duplicates. */ tempPids.erase(unique(tempPids.begin(), tempPids.end()), tempPids.end()); /* Erase negative (error codes). */ auto isNegative = [](int i) {return i < 0;}; auto it = remove_if(tempPids.begin(), tempPids.end(), isNegative); tempPids.erase(it, tempPids.end()); nTasks = tempPids.size(); if (tempPids[i] == 0) { /* Pid <= 0 will be plotted in black. */ colors[i++] = {}; } for (; i < nTasks; ++i) { pid = tempPids[i]; colors[pid].setRainbowColor(i); } return colors; } /** * @brief Create a Hash table of Rainbow colors. The CPU Ids are * mapped to the palette of Rainbow colors. * * @returns ColorTable instance. */ ColorTable CPUColorTable() { kshark_context *kshark_ctx(nullptr); int nCPUs, nCPUMax(0), *streamIds; kshark_data_stream *stream; ColorTable colors; if (!kshark_instance(&kshark_ctx)) return colors; streamIds = kshark_all_streams(kshark_ctx); for (int i = 0; i < kshark_ctx->n_streams; ++i) { stream = kshark_get_data_stream(kshark_ctx, streamIds[i]); nCPUs = stream->n_cpus; if (nCPUMax < nCPUs) nCPUMax = nCPUs; } free(streamIds); for (int i = 0; i < nCPUMax; ++i) colors[i].setRainbowColor(i + 8); return colors; } /** * @brief Create a Hash table of Rainbow colors. The Steam Ids are * mapped to the palette of Rainbow colors. * * @returns ColorTable instance. */ ColorTable streamColorTable() { kshark_context *kshark_ctx(nullptr); ColorTable colors; Color color; float alpha(.35); int *streamIds; if (!kshark_instance(&kshark_ctx)) return colors; streamIds = kshark_all_streams(kshark_ctx); for (int i = 0; i < kshark_ctx->n_streams; ++i) { /* * Starting from index 6 provides better functioning of the * color scheme slider. */ color.setRainbowColor(i + 6); color.blend(alpha); colors[streamIds[i]] = color; } free(streamIds); return colors; } /** * @brief Search the Hash table of Rainbow colors for a particular key (Id). * * @param colors: Input location for the ColorTable instance. * @param id: The Id to search for. * * @returns The Rainbow color of the key "id". If "id" does not exist, the * returned color is Black. */ Color getColor(const ColorTable *colors, int id) { auto item = colors->find(id); if (item != colors->end()) return item->second; return {}; } /** * @brief A method to be implemented in the inheriting class. It calculates * the distance between the position of the click and the shape. This * distance is used by the GUI to decide if the corresponding * "Double click" action of the shape must be executed. The default * implementation returns infinity. * * @param x: The X coordinate of the click. * @param y: The Y coordinate of the click. */ double PlotObject::distance([[maybe_unused]] int x, [[maybe_unused]] int y) const { return std::numeric_limits::max(); } /** * @brief Create a default Shape. */ Shape::Shape() : _nPoints(0), _points(nullptr) {} /** * @brief Create a Shape defined by "n" points. All points are initialized * at (0, 0). */ Shape::Shape(int n) : _nPoints(n), _points(new(std::nothrow) ksplot_point[n]()) { if (!_points) { _size = 0; fprintf(stderr, "Failed to allocate memory for ksplot_points.\n"); } } /** Copy constructor. */ Shape::Shape(const Shape &s) : _nPoints(0), _points(nullptr) { *this = s; } /** Move constructor. */ Shape::Shape(Shape &&s) : _nPoints(s._nPoints), _points(s._points) { s._nPoints = 0; s._points = nullptr; } /** * @brief Destroy the Shape object. */ Shape::~Shape() { delete[] _points; } /** @brief Get the coordinates of the geometrical center of this shape. */ ksplot_point Shape::center() const { ksplot_point c = {0, 0}; if (_nPoints == 0) return c; for (size_t i = 0; i < _nPoints; ++i) { c.x += _points[i].x; c.y += _points[i].y; } c.x /= _nPoints; c.y /= _nPoints; return c; } /** Assignment operator. */ void Shape::operator=(const Shape &s) { PlotObject::operator=(s); if (s._nPoints != _nPoints) { delete[] _points; _points = new(std::nothrow) ksplot_point[s._nPoints]; } if (_points) { _nPoints = s._nPoints; memcpy(_points, s._points, sizeof(_points) * _nPoints); } else { _nPoints = 0; fprintf(stderr, "Failed to allocate memory for ksplot_points.\n"); } } /** * @brief Set the point of the polygon indexed by "i". * * @param i: the index of the point to be set. * @param x: X coordinate of the point in pixels. * @param y: Y coordinate of the point in pixels. */ void Shape::setPoint(size_t i, int x, int y) { if (i < _nPoints) { _points[i].x = x; _points[i].y = y; } } /** * @brief Set the point of the polygon indexed by "i". * * @param i: the index of the point to be set. * @param p: A ksplot_point object used to provide coordinate values. */ void Shape::setPoint(size_t i, const ksplot_point &p) { setPoint(i, p.x, p.y); } /** * @brief Set the point of the polygon indexed by "i". * * @param i: the index of the point to be set. * @param p: A Point object used to provide coordinate values. */ void Shape::setPoint(size_t i, const Point &p) { setPoint(i, p.x(), p.y()); } /** * @brief Get the point "i". If the point does not exist, the function returns * nullptr. */ const ksplot_point *Shape::point(size_t i) const { if (i < _nPoints) return &_points[i]; return nullptr; } /** * @brief Set the horizontal coordinate of the point "i". * * @param i: the index of the point to be set. * @param x: X coordinate of the point in pixels. */ void Shape::setPointX(size_t i, int x) { if (i < _nPoints) _points[i].x = x; } /** * @brief Set the vertical coordinate of the point "i". * * @param i: the index of the point to be set. * @param y: Y coordinate of the point in pixels. */ void Shape::setPointY(size_t i, int y) { if (i < _nPoints) _points[i].y = y; } /** * @brief Get the horizontal coordinate of the point "i". If the point does * not exist, the function returns 0. */ int Shape::pointX(size_t i) const { if (i < _nPoints) return _points[i].x; return 0; } /** * @brief Get the vertical coordinate of the point "i". If the point does * not exist, the function returns 0. */ int Shape::pointY(size_t i) const { if (i < _nPoints) return _points[i].y; return 0; } /** @brief Create a default Point. The point is initialized at (0, 0). */ Point::Point() : Shape(1) {} /** * @brief Create a point. * * @param x: X coordinate of the point in pixels. * @param y: Y coordinate of the point in pixels. */ Point::Point(int x, int y) : Shape(1) { setPoint(0, x, y); } void Point::_draw(const Color &col, float size) const { if (_nPoints == 1) ksplot_draw_point(_points, col.color_c_ptr(), size); } /** * @brief Draw a line between point "a" and point "b". * * @param a: The first finishing point of the line. * @param b: The second finishing point of the line. * @param col: The color of the line. * @param size: The size of the line. */ void drawLine(const Point &a, const Point &b, const Color &col, float size) { ksplot_draw_line(a.point_c_ptr(), b.point_c_ptr(), col.color_c_ptr(), size); } /** * @brief Draw a dashed line between point "a" and point "b". * * @param a: The first finishing point of the line. * @param b: The second finishing point of the line. * @param col: The color of the line. * @param size: The size of the line. * @param period: The period of the dashed line. */ void drawDashedLine(const Point &a, const Point &b, const Color &col, float size, float period) { int dx = b.x() - a.x(), dy = b.y() - a.y(); float mod = sqrt(dx * dx + dy * dy); int n = mod / period; Point p1, p2; for (int i = 0; i < n; ++i) { p1.setX(a.x() + (i + .25) * dx / n); p1.setY(a.y() + (i + .25) * dy / n); p2.setX(a.x() + (i + .75) * dx / n); p2.setY(a.y() + (i + .75) * dy / n); drawLine(p1, p2, col, size); } } /** @brief Create a default line. The two points are initialized at (0, 0). */ Line::Line() : Shape(2) {} /** * @brief Create a line between the point "a" and point "b". * * @param a: first finishing point of the line. * @param b: second finishing point of the line. */ Line::Line(const Point &a, const Point &b) : Shape(2) { setPoint(0, a.x(), a.y()); setPoint(1, b.x(), b.y()); } void Line::_draw(const Color &col, float size) const { if (_nPoints == 2) ksplot_draw_line(&_points[0], &_points[1], col.color_c_ptr(), size); } /** * @brief Create a default polyline. All points are initialized at (0, 0). * * @param n: The number of points connected by the polyline. */ Polyline::Polyline(size_t n) : Shape(n) {} void Polyline::_draw(const Color &col, float size) const { ksplot_draw_polyline(_points, _nPoints, col.color_c_ptr(), size); } /** * @brief Create a default polygon. All points are initialized at (0, 0). * * @param n: The number of edges of the polygon. */ Polygon::Polygon(size_t n) : Shape(n), _fill(true) {} void Polygon::_draw(const Color &col, float size) const { if (_fill) ksplot_draw_polygon(_points, _nPoints, col.color_c_ptr(), size); else ksplot_draw_polygon_contour(_points, _nPoints, col.color_c_ptr(), size); } /** The created object will print/draw only the text without the frame. */ TextBox::TextBox() : _text(""), _font(nullptr) { setPos(Point(0, 0)); _box._visible = false; } /** The created object will print/draw only the text without the frame. */ TextBox::TextBox(ksplot_font *f) : _text(""), _font(f) { setPos(Point(0, 0)); _box._visible = false; } /** The created object will print/draw only the text without the frame. */ TextBox::TextBox(ksplot_font *f, const std::string &text, const Point &pos) : _text(text), _font(f) { setPos(pos); _box._visible = false; } /** The created object will print/draw only the text without the frame. */ TextBox::TextBox(ksplot_font *f, const std::string &text, const Color &col, const Point &pos) : _text(text), _font(f) { _color = col; setPos(pos); _box._visible = false; } /** The created object will print/draw the text and the frame. */ TextBox::TextBox(ksplot_font *f, const std::string &text, const Color &col, const Point &pos, int l, int h) : _text(text), _font(f) { setPos(pos); setBoxAppearance(col, l, h); } /** * @brief Set the position of the bottom-left corner of the frame. * * @param p: The coordinates of the bottom-left corner. */ void TextBox::setPos(const Point &p) { _box.setPoint(0, p); } /** * @brief Set the color and the dimensions of the frame. * * @param col: The color of the frame. * @param l: The length of the frame. * @param h: The height of the frame. */ void TextBox::setBoxAppearance(const Color &col, int l, int h) { _box.setFill(true); _box._color = col; _box._visible = true; if (h <= 0 && _font) h = _font->height; _box.setPoint(1, _box.pointX(0), _box.pointY(0) - h); _box.setPoint(2, _box.pointX(0) + l, _box.pointY(0) - h); _box.setPoint(3, _box.pointX(0) + l, _box.pointY(0)); } void TextBox::_draw(const Color &col, [[maybe_unused]]float size) const { _box.draw(); if (!_font || _text.empty()) return; if (_box._visible ) { int bShift = (_box.pointY(0) - _box.pointY(1) - _font->height) / 2; ksplot_print_text(_font, NULL, _box.pointX(0) + _font->height / 4, _box.pointY(0) - _font->base - bShift, _text.c_str()); } else { ksplot_print_text(_font, col.color_c_ptr(), _box.pointX(0) + _font->height / 4, _box.pointY(0) - _font->base, _text.c_str()); } } /** * @brief Create a default Mark. */ Mark::Mark() : _dashed(false) { _visible = false; _cpu._color = Color(225, 255, 100); _cpu._size = 5.5f; _task._color = Color(0, 255, 0); _task._size = 5.5f; _combo._color = Color(100, 150, 255); _combo._size = 5.5f; } void Mark::_draw(const Color &col, float size) const { if (_dashed) drawDashedLine(_a, _b, col, size, 3 * _cpu._size / size); else drawLine(_a, _b, col, size); _cpu.draw(); _task.draw(); _combo.draw(); } /** * @brief Set the device pixel ratio. * * @param dpr: device pixel ratio value. */ void Mark::setDPR(int dpr) { _size = 1.5 * dpr; _task._size = _cpu._size = _combo._size = 1.5 + 4.0 * dpr; } /** * @brief Set the X coordinate (horizontal) of the Mark. * * @param x: X coordinate of the Makr in pixels. */ void Mark::setX(int x) { _a.setX(x); _b.setX(x); _cpu.setX(x); _task.setX(x); _combo.setX(x); } /** * @brief Set the Y coordinates (vertical) of the Mark's finishing points. * * @param yA: Y coordinate of the first finishing point of the Mark's line. * @param yB: Y coordinate of the second finishing point of the Mark's line. */ void Mark::setY(int yA, int yB) { _a.setY(yA); _b.setY(yB); } /** * @brief Set the Y coordinates (vertical) of the Mark's CPU points. * * @param yCPU: Y coordinate of the Mark's CPU point. */ void Mark::setCPUY(int yCPU) { _cpu.setY(yCPU); } /** * @brief Set the visiblity of the Mark's CPU points. * * @param v: If True, the CPU point will be visible. */ void Mark::setCPUVisible(bool v) { _cpu._visible = v; } /** * @brief Set the Y coordinates (vertical) of the Mark's Task points. * * @param yTask: Y coordinate of the Mark's Task point. */ void Mark::setTaskY(int yTask) { _task.setY(yTask); } /** * @brief Set the visiblity of the Mark's Task points. * * @param v: If True, the Task point will be visible. */ void Mark::setTaskVisible(bool v) { _task._visible = v; } /** * @brief Set the visiblity of the Mark's Combo point. * * @param v: If True, the Task point will be visible. */ void Mark::setComboVisible(bool v) { _combo._visible = v; } /** * @brief Set the Y coordinates (vertical) of the Mark's Combo points. * * @param yCombo: Y coordinate of the Mark's Task point. */ void Mark::setComboY(int yCombo) { _combo.setY(yCombo); } /** * @brief Create a default Bin. */ Bin::Bin() : _idFront(KS_EMPTY_BIN), _idBack(KS_EMPTY_BIN) {} void Bin::_draw(const Color &col, float size) const { drawLine(_base, _val, col, size); } /** * @brief Draw only the "val" Point og the Bin. * * @param size: The size of the point. */ void Bin::drawVal(float size) { _val._size = size; _val.draw(); } /** * @brief Create a default (empty) Graph. */ Graph::Graph() : _histoPtr(nullptr), _bins(nullptr), _size(0), _collectionPtr(nullptr), _binColors(nullptr), _ensembleColors(nullptr), _label(), _idleSuppress(false), _idlePid(0), _drawBase(true) {} /** * @brief Create a Graph to represent the state of the Vis. model. * * @param histo: Input location for the model descriptor. * @param bct: Input location for the Hash table of bin's colors. * @param ect: Input location for the Hash table of ensemble's colors. */ Graph::Graph(kshark_trace_histo *histo, KsPlot::ColorTable *bct, KsPlot::ColorTable *ect) : _histoPtr(histo), _bins(new(std::nothrow) Bin[histo->n_bins]), _size(histo->n_bins), _collectionPtr(nullptr), _binColors(bct), _ensembleColors(ect), _label(), _idleSuppress(false), _idlePid(0), _drawBase(true) { if (!_bins) { _size = 0; fprintf(stderr, "Failed to allocate memory graph's bins.\n"); } _initBins(); } /** * @brief Destroy the Graph object. */ Graph::~Graph() { delete[] _bins; } int Graph::_firstBinOffset() { return _labelSize + 2 * _hMargin; } void Graph::_initBins() { for (int i = 0; i < _size; ++i) { _bins[i]._base.setX(i + _firstBinOffset()); _bins[i]._base.setY(0); _bins[i]._val.setX(_bins[i]._base.x()); _bins[i]._val.setY(_bins[i]._base.y()); } } /** * Get the number of bins. */ int Graph::size() const { return _size; } /** * @brief Reinitialize the Graph according to the Vis. model. * * @param histo: Input location for the model descriptor. */ void Graph::setModelPtr(kshark_trace_histo *histo) { if (_size != histo->n_bins) { delete[] _bins; _size = histo->n_bins; _bins = new(std::nothrow) Bin[_size]; if (!_bins) { _size = 0; fprintf(stderr, "Failed to allocate memory graph's bins.\n"); } } _histoPtr = histo; _initBins(); } /** * @brief This function will set the Y (vertical) coordinate of the Graph's * base. It is safe to use this function even if the Graph contains * data. * * @param b: Y coordinate of the Graph's base in pixels. */ void Graph::setBase(int b) { int mod; if (!_size) return; if (b == _bins[0]._base.y()) // Nothing to do. return; _label.setBoxAppearance(_label._color, _labelSize, height()); for (int i = 0; i < _size; ++i) { mod = _bins[i].mod(); _bins[i]._base.setY(b); _bins[i]._val.setY(b + mod); } } /** * @brief Set the vertical size (height) of the Graph. * * @param h: the height of the Graph in pixels. */ void Graph::setHeight(int h) { _height = h; } /** * @brief Set the color and the dimensions of the graph's label. * * @param f: The font to be used to draw the labels. * @param col: The color of the ComboGraph's label. * @param lSize: the size of the graph's label in pixels. * @param hMargin: the size of the white margine space in pixels. */ void Graph::setLabelAppearance(ksplot_font *f, Color col, int lSize, int hMargin) { if (!_size) return; _labelSize = lSize; _hMargin = hMargin; _label.setPos({_hMargin, base()}); _label.setFont(f); _label.setBoxAppearance(col, lSize, height()); for (int i = 0; i < _size; ++i) { _bins[i]._base.setX(i + _firstBinOffset()); _bins[i]._val.setX(_bins[i]._base.x()); } } /** * @brief Set Idle Suppression. If True, the bins containing Idle task records * are not grouped together. * * @param is: If True, Idle is suppressed. * @param ip: The process Id of the Idle task. If Idle is not suppressed, this * value has no effect. */ void Graph::setIdleSuppressed(bool is, int ip) { _idleSuppress = is; _idlePid = ip; } /** * @brief Set the value of a given bin. * * @param bin: Bin Id. * @param val: Bin height in pixels. */ void Graph::setBinValue(int bin, int val) { _bins[bin].setVal(val); } /** * @brief Set the Process Id (Front and Back) of a given bin. * * @param bin: Bin Id. * @param pidF: The Process Id detected at the from (first in time) edge of * the bin. * @param pidB: The Process Id detected at the back (last in time) edge of * the bin. */ void Graph::setBinPid(int bin, int pidF, int pidB) { _bins[bin]._idFront = pidF; _bins[bin]._idBack = pidB; } /** * @brief Set the color of a given bin. * * @param bin: Bin Id. * @param col: the color of the bin. */ void Graph::setBinColor(int bin, const Color &col) { _bins[bin]._color = col; } /** * @brief Set the visiblity mask of a given bin. * * @param bin: Bin Id. * @param m: the visiblity mask. */ void Graph::setBinVisMask(int bin, uint8_t m) { _bins[bin]._visMask = m; } /** * @brief Set all fields of a given bin. * * @param bin: Bin Id. * @param pidF: The Process Id detected at the from (first in time) edge of * the bin. * @param pidB: The Process Id detected at the back (last in time) edge of * the bin. * @param col: the color of the bin. * @param m: the visiblity mask. */ void Graph::setBin(int bin, int pidF, int pidB, const Color &col, uint8_t m) { setBinPid(bin, pidF, pidB); setBinValue(bin, _height * .7); setBinColor(bin, col); setBinVisMask(bin, m); } /** * @brief Process a CPU Graph. * * @param sd: Data stream identifier. * @param cpu: The CPU core. */ void Graph::fillCPUGraph(int sd, int cpu) { struct kshark_entry *eFront; int pidFront(0), pidBack(0); int pidBackNoFilter; uint8_t visMask; ssize_t index; int bin; auto lamGetPid = [&] (int bin) { eFront = nullptr; pidFront = ksmodel_get_pid_front(_histoPtr, bin, sd, cpu, true, _collectionPtr, &index); if (index >= 0) eFront = _histoPtr->data[index]; pidBack = ksmodel_get_pid_back(_histoPtr, bin, sd, cpu, true, _collectionPtr, nullptr); pidBackNoFilter = ksmodel_get_pid_back(_histoPtr, bin, sd, cpu, false, _collectionPtr, nullptr); if (pidBack != pidBackNoFilter) pidBack = KS_FILTERED_BIN; visMask = 0x0; if (eFront) { if (!(eFront->visible & KS_EVENT_VIEW_FILTER_MASK) && ksmodel_cpu_visible_event_exist(_histoPtr, bin, sd, cpu, _collectionPtr, &index)) { visMask = _histoPtr->data[index]->visible; } else { visMask = eFront->visible; } } }; auto lamSetBin = [&] (int bin) { if (pidFront != KS_EMPTY_BIN || pidBack != KS_EMPTY_BIN) { /* This is a regular process. */ setBin(bin, pidFront, pidBack, getColor(_binColors, pidFront), visMask); } else { /* The bin contens no data from this CPU. */ setBinPid(bin, KS_EMPTY_BIN, KS_EMPTY_BIN); } }; /* * Check the content of the very first bin and see if the CPU is * active. */ bin = 0; lamGetPid(bin); if (pidFront >= 0) { /* * The CPU is active and this is a regular process. * Set this bin. */ lamSetBin(bin); } else { /* * No data from this CPU in the very first bin. Use the Lower * Overflow Bin to retrieve the Process Id (if any). First * get the Pid back, ignoring the filters. */ pidBackNoFilter = ksmodel_get_pid_back(_histoPtr, LOWER_OVERFLOW_BIN, sd, cpu, false, _collectionPtr, nullptr); /* Now get the Pid back, applying filters. */ pidBack = ksmodel_get_pid_back(_histoPtr, LOWER_OVERFLOW_BIN, sd, cpu, true, _collectionPtr, nullptr); if (pidBack != pidBackNoFilter) { /* The Lower Overflow Bin ends with filtered data. */ setBinPid(bin, KS_FILTERED_BIN, KS_FILTERED_BIN); } else { /* * The Lower Overflow Bin ends with data which has * to be plotted. */ setBinPid(bin, pidBack, pidBack); } } /* * The first bin is already processed. The loop starts from the second * bin. */ for (bin = 1; bin < _histoPtr->n_bins; ++bin) { /* * Check the content of this bin and see if the CPU is active. * If yes, retrieve the Process Id. */ lamGetPid(bin); lamSetBin(bin); } } /** * @brief Process a Task Graph. * * @param sd: Data stream identifier. * @param pid: The Process Id of the Task. */ void Graph::fillTaskGraph(int sd, int pid) { int cpuFront, cpuBack(0), pidFront(0), pidBack(0), lastCpu(-1), bin(0); struct kshark_entry *eFront; uint8_t visMask; ssize_t index; auto lamSetBin = [&] (int bin) { if (cpuFront >= 0) { KsPlot::Color col = getColor(_binColors, pid); /* Data from the Task has been found in this bin. */ if (pid == pidFront && pid == pidBack) { /* No data from other tasks in this bin. */ setBin(bin, cpuFront, cpuBack, col, visMask); } else if (pid != pidFront && pid != pidBack) { /* * There is some data from other tasks at both * front and back sides of this bin. But we * still want to see this bin drawn. */ setBin(bin, cpuFront, KS_FILTERED_BIN, col, visMask); } else { if (pidFront != pid) { /* * There is some data from another * task at the front side of this bin. */ cpuFront = KS_FILTERED_BIN; } if (pidBack != pid) { /* * There is some data from another * task at the back side of this bin. */ cpuBack = KS_FILTERED_BIN; } setBin(bin, cpuFront, cpuBack, col, visMask); } lastCpu = cpuBack; } else { /* * No data from the Task in this bin. Check the CPU, * previously used by the task. We are looking for * data from another task running on the same CPU, * hence we cannot use the collection of this task. */ int cpuPid = ksmodel_get_pid_back(_histoPtr, bin, sd, lastCpu, false, nullptr, // No collection nullptr); if (cpuPid != KS_EMPTY_BIN) { /* * If the CPU is active and works on another * task break the graph here. */ setBinPid(bin, KS_FILTERED_BIN, KS_EMPTY_BIN); } else { /* * No data from this CPU in the bin. * Continue the graph. */ setBinPid(bin, KS_EMPTY_BIN, KS_EMPTY_BIN); } } }; auto lamGetPidCPU = [&] (int bin) { eFront = nullptr; /* Get the CPU used by this task. */ cpuFront = ksmodel_get_cpu_front(_histoPtr, bin, sd, pid, false, _collectionPtr, &index); if (cpuFront >= 0 && index >= 0) eFront = _histoPtr->data[index]; cpuBack = ksmodel_get_cpu_back(_histoPtr, bin, sd, pid, false, _collectionPtr, nullptr); if (cpuFront < 0) { pidFront = pidBack = cpuFront; } else { /* * Get the process Id at the begining and at the end * of the bin. */ pidFront = ksmodel_get_pid_front(_histoPtr, bin, sd, cpuFront, false, _collectionPtr, nullptr); pidBack = ksmodel_get_pid_back(_histoPtr, bin, sd, cpuBack, false, _collectionPtr, nullptr); visMask = 0x0; if (eFront) { if (!(eFront->visible & KS_EVENT_VIEW_FILTER_MASK) && ksmodel_task_visible_event_exist(_histoPtr, bin, sd, pid, _collectionPtr, &index)) { visMask = _histoPtr->data[index]->visible; } else { visMask = eFront->visible; } } } }; /* * Check the content of the very first bin and see if the Task is * active. */ lamGetPidCPU(bin); if (cpuFront >= 0) { /* The Task is active. Set this bin. */ lamSetBin(bin); } else { /* * No data from this Task in the very first bin. Use the Lower * Overflow Bin to retrieve the CPU used by the task (if any). */ cpuFront = ksmodel_get_cpu_back(_histoPtr, LOWER_OVERFLOW_BIN, sd, pid, false, _collectionPtr, nullptr); if (cpuFront >= 0) { /* * The Lower Overflow Bin contains data from this Task. * Now look again in the Lower Overflow Bin and Bim 0 * and find the Pid of the last active task on the same * CPU. */ int pidCpu0, pidCpuLOB; pidCpu0 = ksmodel_get_pid_back(_histoPtr, 0, sd, cpuFront, false, _collectionPtr, nullptr); pidCpuLOB = ksmodel_get_pid_back(_histoPtr, LOWER_OVERFLOW_BIN, sd, cpuFront, false, _collectionPtr, nullptr); if (pidCpu0 < 0 && pidCpuLOB == pid) { /* * The Task is the last one running on this * CPU. Set the Pid of the bin. In this case * the very first bin is empty but we derive * the Process Id from the Lower Overflow Bin. */ setBinPid(bin, cpuFront, cpuFront); lastCpu = cpuFront; } else { setBinPid(bin, KS_EMPTY_BIN, KS_EMPTY_BIN); } } } /* * The first bin is already processed. The loop starts from the second * bin. */ for (bin = 1; bin < _histoPtr->n_bins; ++bin) { lamGetPidCPU(bin); /* Set the bin accordingly. */ lamSetBin(bin); } } /** * @brief Draw the Graph * * @param size: The size of the lines of the individual Bins. */ void Graph::draw(float size) { int lastPid(-1), b(0), boxH(_height * .3); Rectangle taskBox; _label.draw(); if (_drawBase) { /* * Start by drawing a line between the base points of the first and * the last bin. */ drawLine(_bins[0]._base, _bins[_size - 1]._base, {}, size); } /* Draw as vartical lines all bins containing data. */ for (int i = 0; i < _size; ++i) if (_bins[i]._idFront >= 0 || _bins[i]._idBack >= 0 || _bins[i]._idFront == _idlePid || _bins[i]._idBack ==_idlePid) if (_bins[i]._visMask & KS_EVENT_VIEW_FILTER_MASK) { _bins[i]._size = size; _bins[i].draw(); } auto lamCheckEnsblVal = [this] (int v) { if (_idleSuppress && v == _idlePid) return false; return v >= 0; }; /* * Draw colored boxes for processes. First find the first bin, which * contains data and determine its PID. */ for (; b < _size; ++b) { if (lamCheckEnsblVal(_bins[b]._idBack)) { lastPid = _bins[b]._idFront; /* * Initialize a box starting from this bin. * The color of the taskBox corresponds to the Pid * of the process. */ taskBox._color = getColor(_ensembleColors, lastPid); taskBox.setPoint(0, _bins[b]._base.x(), _bins[b]._base.y() - boxH); taskBox.setPoint(1, _bins[b]._base.x(), _bins[b]._base.y()); break; } } for (; b < _size; ++b) { if (_bins[b]._idFront == KS_EMPTY_BIN && _bins[b]._idBack == KS_EMPTY_BIN) { /* * This bin is empty. If a colored taskBox is already * initialized, it will be extended. */ continue; } if (_bins[b]._idFront != _bins[b]._idBack || _bins[b]._idFront != lastPid || _bins[b]._idBack != lastPid) { /* A new process starts here. */ if (b > 0 && lamCheckEnsblVal(lastPid)) { /* * There is another process running up to this * point. Close its colored box here and draw. */ taskBox.setPoint(3, _bins[b]._base.x() - 1, _bins[b]._base.y() - boxH); taskBox.setPoint(2, _bins[b]._base.x() - 1, _bins[b]._base.y()); taskBox.draw(); } if (lamCheckEnsblVal(_bins[b]._idBack)) { /* * This is a regular process. Initialize * colored box starting from this bin. */ taskBox._color = getColor(_ensembleColors, _bins[b]._idBack); taskBox.setPoint(0, _bins[b]._base.x() - 1, _bins[b]._base.y() - boxH); taskBox.setPoint(1, _bins[b]._base.x() - 1, _bins[b]._base.y()); } lastPid = _bins[b]._idBack; } } if (lamCheckEnsblVal(lastPid) > 0) { /* * This is the end of the Graph and we have a process running. * Close its colored box and draw. */ taskBox.setPoint(3, _bins[_size - 1]._base.x(), _bins[_size - 1]._base.y() - boxH); taskBox.setPoint(2, _bins[_size - 1]._base.x(), _bins[_size - 1]._base.y()); taskBox.draw(); } } void VirtGap::_draw([[maybe_unused]]const Color &col, [[maybe_unused]] float size) const { if (_entryPoint.x() - _exitPoint.x() < 4) return; Point p0(_exitPoint.x() + _size, _exitPoint.y()); Point p1(_exitPoint.x() + _size, _exitPoint.y() - _height); Point p2(_entryPoint.x() - _size , _entryPoint.y()); Point p3(_entryPoint.x() - _size , _entryPoint.y() - _height); Rectangle g; g.setPoint(0, p0); g.setPoint(1, p1); g.setPoint(2, p2); g.setPoint(3, p3); g._color = {255, 255, 255}; // The virt. gap is always white. g.setFill(false); g.draw(); } } // KsPlot kernel-shark-kernelshark-v2.4.0/src/KsPlotTools.hpp000066400000000000000000000354121477354127100223550ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsPlotTools.hpp * @brief KernelShark Plot tools. */ #ifndef _KS_PLOT_TOOLS_H #define _KS_PLOT_TOOLS_H // C++ #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-plot.h" #include "libkshark-model.h" namespace KsPlot { /** This class represents a RGB color. */ class Color { public: Color(); Color(uint8_t r, uint8_t g, uint8_t b); Color(int rgb); /** @brief Get the Red coordinate of the color. */ uint8_t r() const {return _col_c.red;} /** @brief Get the Green coordinate of the color. */ uint8_t g() const {return _col_c.green;} /** @brief Get the Blue coordinate of the color. */ uint8_t b() const {return _col_c.blue;} void set(uint8_t r, uint8_t g, uint8_t b); void set(int rgb); void setRainbowColor(int n); void blend(float alpha); /** * @brief Get the C struct defining the RGB color. */ const ksplot_color *color_c_ptr() const {return &_col_c;} /** * @brief Set the frequency value used to generate the Rainbow * palette. */ static void setRainbowFrequency(float f) {_frequency = f;} /** * @brief Get the frequency value used to generate the Rainbow * palette. */ static float rainbowFrequency() {return _frequency;} private: ksplot_color _col_c; /** The frequency value used to generate the Rainbow palette. */ static float _frequency; }; /** Hash table of colors. */ typedef std::unordered_map ColorTable; ColorTable taskColorTable(); ColorTable CPUColorTable(); ColorTable streamColorTable(); Color getColor(const ColorTable *colors, int id); /** Represents an abstract graphical element. */ class PlotObject { public: /** * @brief Create a default object. */ PlotObject() : _visible(true), _size(2.) {} /** * @brief Destroy the object. Keep this destructor virtual. */ virtual ~PlotObject() {} /** Generic function used to draw different objects. */ void draw() const { if (_visible) _draw(_color, _size); } /** * Generic action to be executed when the objects is double clicked. */ void doubleClick() const { if (_visible) _doubleClick(); } virtual double distance(int x, int y) const; /** Is this object visible. */ bool _visible; /** The color of the object. */ Color _color; /** The size of the object. */ float _size; private: virtual void _draw(const Color &col, float s) const = 0; virtual void _doubleClick() const {} }; /** List of graphical element. */ typedef std::forward_list PlotObjList; class Point; /** Represents an abstract shape. */ class Shape : public PlotObject { public: Shape(); Shape(int n); Shape(const Shape &); Shape(Shape &&); /* Keep this destructor virtual. */ virtual ~Shape(); ksplot_point center() const; void operator=(const Shape &s); void setPoint(size_t i, int x, int y); void setPoint(size_t i, const ksplot_point &p); void setPoint(size_t i, const Point &p); const ksplot_point *point(size_t i) const; void setPointX(size_t i, int x); void setPointY(size_t i, int y); int pointX(size_t i) const; int pointY(size_t i) const; /** * @brief Get the number of point used to define the polygon. */ size_t pointCount() const {return _nPoints;} protected: /** The number of point used to define the polygon. */ size_t _nPoints; /** The array of point used to define the polygon. */ ksplot_point *_points; }; /** This class represents a 2D poin. */ class Point : public Shape { public: Point(); Point(int x, int y); /** * @brief Destroy the Point object. Keep this destructor virtual. */ virtual ~Point() {} /** @brief Get the horizontal coordinate of the point. */ int x() const {return pointX(0);} /** @brief Get the vertical coordinate of the point. */ int y() const {return pointY(0);} /** @brief Set the horizontal coordinate of the point. */ void setX(int x) {setPointX(0, x);} /** @brief Set the vertical coordinate of the point. */ void setY(int y) {setPointY(0, y);} /** * @brief Set the coordinats of the point. * * @param x: horizontal coordinate of the point in pixels. * @param y: vertical coordinate of the point in pixels. */ void set(int x, int y) {setPoint(0, x, y);} /** * @brief Get the C struct defining the point. */ const ksplot_point *point_c_ptr() const {return point(0);} private: void _draw(const Color &col, float size = 1.) const override; }; void drawLine(const Point &a, const Point &b, const Color &col, float size); void drawDashedLine(const Point &a, const Point &b, const Color &col, float size, float period); /** This class represents a straight line. */ class Line : public Shape { public: Line(); Line(const Point &a, const Point &b); /** * @brief Destroy the Line object. Keep this destructor virtual. */ virtual ~Line() {} /** * @brief Set the coordinats of the first finishing point of the * line. * * @param x: horizontal coordinate of the point in pixels. * @param y: vertical coordinate of the point in pixels. */ void setA(int x, int y) { setPoint(0, x, y);} /** @brief Get the first finishing point of the line. */ const ksplot_point *a() const {return point(0);} /** * @brief Set the coordinats of the second finishing point of the * line. * * @param x: horizontal coordinate of the point in pixels. * @param y: vertical coordinate of the point in pixels. */ void setB(int x, int y) {setPoint(1, x, y);} /** @brief Get the second finishing point of the line. */ const ksplot_point *b() const {return point(1);} private: void _draw(const Color &col, float size = 1.) const override; }; /** This class represents a polyline. */ class Polyline : public Shape { public: Polyline(size_t n); /** * @brief Destroy the polyline object. Keep this destructor virtual. */ virtual ~Polyline() {} private: Polyline() = delete; void _draw(const Color &, float size = 1.) const override; }; /** This class represents a polygon. */ class Polygon : public Shape { public: Polygon(size_t n); /** * @brief Destroy the polygon object. Keep this destructor virtual. */ virtual ~Polygon() {} /** * @brief Specify the way the polygon will be drawn. * * @param f: If True, the area of the polygon will be colored. * Otherwise only the contour of the polygon will be plotted. */ void setFill(bool f) {_fill = f;} private: Polygon() = delete; void _draw(const Color &, float size = 1.) const override; /** * If True, the area of the polygon will be colored. Otherwise only * the contour of the polygon will be plotted. */ bool _fill; }; /** This class represents a triangle. */ class Triangle : public Polygon { public: /** * Create a default triangle. All points are initialized at (0, 0). */ Triangle() : Polygon(3) {} /** Destroy the Triangle object. Keep this destructor virtual. */ virtual ~Triangle() {} }; /** This class represents a rectangle. */ class Rectangle : public Polygon { public: /** * Create a default Rectangle. All points are initialized at (0, 0). */ Rectangle() : Polygon(4) {} /** Destroy the Rectangle object. Keep this destructor virtual. */ virtual ~Rectangle() {} }; /** * This class represents a text that is printed/drawn inside a colorful frame. */ class TextBox : public PlotObject { public: TextBox(); TextBox(ksplot_font *f); TextBox(ksplot_font *f, const std::string &text, const Point &pos); TextBox(ksplot_font *f, const std::string &text, const Color &col, const Point &pos); TextBox(ksplot_font *f, const std::string &text, const Color &col, const Point &pos, int l, int h = -1); /** Destroy the TextBox object. Keep this destructor virtual. */ virtual ~TextBox() {} /** Set the font to be used. */ void setFont(ksplot_font *f) {_font = f;} /** Set the text. */ void setText(const std::string &t) {_text = t;} void setPos(const Point &p); void setBoxAppearance(const Color &col, int l, int h); private: void _draw(const Color &, float size = 1.) const override; std::string _text; ksplot_font *_font; Rectangle _box; }; /** * This class represents the graphical element of the KernelShark GUI marker. */ class Mark : public PlotObject { public: Mark(); /** * @brief Destroy the Mark object. Keep this destructor virtual. */ virtual ~Mark() {} void setDPR(int dpr); void setX(int x); void setY(int yA, int yB); /** Get the Y coordinate of the Mark's CPU point. */ int cpuY() const {return _cpu.y();} void setCPUY(int yCPU); /** Is the CPU point visible. */ bool cpuIsVisible() const {return _cpu._visible;} void setCPUVisible(bool v); /** Get the Y coordinate of the Mark's Task point. */ int taskY() const {return _task.y();} void setTaskY(int yTask); /** Is the Task point visible. */ bool taskIsVisible() const {return _task._visible;} void setTaskVisible(bool v); /** If True, the Mark will be plotted as a dashed line. */ void setDashed(bool d) {_dashed = d;} /** Get the Y coordinate of the Mark's Combo point. */ int comboY() const {return _combo.y();} void setComboY(int yCombo); /** Is the Combo point visible. */ bool comboIsVisible() const {return _combo._visible;} void setComboVisible(bool v); private: void _draw(const Color &col, float size = 1.) const override; /** First finishing point of the Mark's line. */ Point _a; /** Second finishing point of the Mark's line. */ Point _b; /** A point indicating the position of the Mark in a CPU graph. */ Point _cpu; /** A point indicating the position of the Mark in a Task graph. */ Point _task; /** A point indicating the position of the Mark in a Combo graph. */ Point _combo; /** If True, plot the Mark as a dashed line. */ bool _dashed; }; /** This class represents a KernelShark graph's bin. */ class Bin : public PlotObject { public: Bin(); /** * @brief Destroy the Bin object. Keep this destructor virtual. */ virtual ~Bin() {} void drawVal(float size = 2.); /** Get the height (module) of the line, representing the Bin. */ int mod() const {return _val.y() - _base.y();} /** @brief Set the vertical coordinate of the "val" Point. */ void setVal(int v) {_val.setY(_base.y() - v); } /** * The Id value (pid or cpu) detected at the front (first in time) edge * of the bin. */ int _idFront; /** * The Id value (pid or cpu) detected at the back (last in time) edge * of the bin. */ int _idBack; /** Lower finishing point of the line, representing the Bin. */ Point _base; /** Upper finishing point of the line, representing the Bin. */ Point _val; /** A bit mask controlling the visibility of the Bin. */ uint8_t _visMask; private: void _draw(const Color &col, float size = 1.) const override; }; /** This class represents a KernelShark graph. */ class Graph { public: Graph(); /* * Disable copying. We can enable the Copy Constructor in the future, * but only if we really need it for some reason. */ Graph(const Graph &) = delete; /* Disable moving. Same as copying. */ Graph(Graph &&) = delete; Graph(kshark_trace_histo *histo, KsPlot::ColorTable *bct, KsPlot::ColorTable *ect); /* Keep this destructor virtual. */ virtual ~Graph(); int size() const; void setModelPtr(kshark_trace_histo *histo); /** * @brief Provide the Graph with a Data Collection. The collection * will be used to optimise the processing of the content of * the bins. * * @param col: Input location for the data collection descriptor. */ void setDataCollectionPtr(kshark_entry_collection *col) { _collectionPtr = col; } /** @brief Set the Hash table of Task's colors. */ void setBinColorTablePtr(KsPlot::ColorTable *ct) {_binColors = ct;} void fillCPUGraph(int sd, int cpu); void fillTaskGraph(int sd, int pid); void draw(float s = 1); void setBase(int b); /** @brief Get the vertical coordinate of the Graph's base. */ int base() const {return _bins[0]._base.y();} void setHeight(int h); /** @brief Get the vertical size (height) of the Graph. */ int height() const {return _height;} void setBinValue(int bin, int val); void setBinPid(int bin, int pidF, int pidB); void setBinColor(int bin, const Color &col); void setBinVisMask(int bin, uint8_t m); void setBin(int bin, int pidF, int pidB, const Color &col, uint8_t m); /** @brief Get a particular bin. */ const Bin &bin(int bin) const {return _bins[bin];} /** Set the text of the graph's label. */ void setLabelText(std::string text) {_label.setText(text);} void setLabelAppearance(ksplot_font *f, Color col, int lSize, int hMargin); void setIdleSuppressed(bool is, int ip = 0); /** Draw the base line of the graph or not. */ void setDrawBase(bool b) {_drawBase = b;} protected: /** Pointer to the model descriptor object. */ kshark_trace_histo *_histoPtr; /** An array of Bins. */ Bin *_bins; /** The number of Bins. */ int _size; /** * The size (in pixels) of the white space added on both sides of * the Graph. */ int _hMargin; /** The horizontal size of the Graph's label. */ int _labelSize; /** The vertical size (height) of the Graph. */ int _height; /** Pointer to the data collection object. */ kshark_entry_collection *_collectionPtr; /** Hash table of bin's colors. */ ColorTable *_binColors; /** Hash table of ensemble's colors. */ ColorTable *_ensembleColors; private: TextBox _label; bool _idleSuppress; int _idlePid; bool _drawBase; void _initBins(); int _firstBinOffset(); }; /** * This class represents the graphical element visualizing how the execution * goes from the host to the guest and back. */ class VirtBridge : public Polyline { public: /** Create a default VirtBridge. */ VirtBridge() : Polyline(4) {} /* Keep this destructor virtual. */ virtual ~VirtBridge() {} /** Set the coordinates of the EntryHost point of the VirtBridge. */ void setEntryHost(int x, int y) {setPoint(0, x, y);} /** Set the coordinates of the EntryGuest point of the VirtBridge. */ void setEntryGuest(int x, int y) {setPoint(1, x, y);} /** Set the coordinates of the ExitGuest point of the VirtBridge. */ void setExitGuest(int x, int y) {setPoint(2, x, y);} /** Set the coordinates of the ExitHost point of the VirtBridge. */ void setExitHost(int x, int y) {setPoint(3, x, y);} }; /** * This class represents the graphical element visualizing the time interval * in the guest during which the execution has been returned to the host. */ class VirtGap : public Shape { public: /** Create a VirtGap with height "h". */ VirtGap(int h) :_height(h) {} /** The point where the execution exits the VM. */ Point _exitPoint; /** The point where the execution enters the VM. */ Point _entryPoint; private: /** The vertical size (height) of the graphical element. */ int _height; void _draw(const Color &col, float size) const override; }; }; // KsPlot #endif /* _KS_PLOT_TOOLS_H */ kernel-shark-kernelshark-v2.4.0/src/KsPlugins.cpp000066400000000000000000000272321477354127100220330ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2019 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file KsPlugins.cpp * @brief KernelShark C++ plugin declarations. */ // C++ #include #include // KernelShark #include "KsPlugins.hpp" using namespace KsPlot; /** * A pair of Bin Id and a trace event data field in this bin, that needs to be * plotted. */ typedef std::forward_list> PlotPointList; //! @cond Doxygen_Suppress typedef std::function pushFunc; typedef std::function resolveFunc; //! @endcond static void pointPlot(KsCppArgV *argvCpp, IsApplicableFunc isApplicable, pluginShapeFunc makeShape, Color col, float size) { int nBins = argvCpp->_graph->size(); for (int bin = 0; bin < nBins; ++bin) if (isApplicable(nullptr, bin)) argvCpp->_shapes->push_front(makeShape({argvCpp->_graph}, {bin}, {}, col, size)); } static std::pair getRange(kshark_trace_histo *histo, kshark_data_container *data) { ssize_t firstEntry, lastEntry; std::pair err(-1, -2); firstEntry = kshark_find_entry_field_by_time(histo->min, data->data, 0, data->size - 1); if (firstEntry == BSEARCH_ALL_SMALLER) return err; if (firstEntry == BSEARCH_ALL_GREATER) firstEntry = 0; lastEntry = kshark_find_entry_field_by_time(histo->max, data->data, firstEntry, data->size - 1); if (lastEntry == BSEARCH_ALL_GREATER) return err; if (lastEntry == BSEARCH_ALL_SMALLER) lastEntry = data->size - 1; return {firstEntry, lastEntry}; } static PlotPointList getInBinEvents(kshark_trace_histo *histo, kshark_data_container *data, IsApplicableFunc isApplicable, pushFunc push, resolveFunc resolve) { int bin, lastBin(-1); PlotPointList buffer; auto lamIsOverflow = [] (int bin) { return (bin == UPPER_OVERFLOW_BIN || bin == LOWER_OVERFLOW_BIN) ? true : false; }; auto range = getRange(histo, data); for (ssize_t i = range.second; i >= range.first; --i) { if (isApplicable(data, i)) { bin = ksmodel_get_bin(histo, data->data[i]->entry); if (lamIsOverflow(bin)) continue; if (bin != lastBin) { push(bin, data, i, &buffer); lastBin = bin; } else { resolve(data, i, &buffer); } } } return buffer; } static PlotPointList getLastInBinEvents(kshark_trace_histo *histo, kshark_data_container *data, IsApplicableFunc isApplicable) { pushFunc push = [] (int bin, kshark_data_container *data, ssize_t i, PlotPointList *list) { list->push_front({bin, data->data[i]}); }; /* * Do not resolve. This means that only the very last (in time) * appearance of the event in the bin will be visualized. */ resolveFunc resolve = [] ([[maybe_unused]] kshark_data_container *data, [[maybe_unused]] ssize_t i, [[maybe_unused]] PlotPointList *list) {}; return getInBinEvents(histo, data, isApplicable, push, resolve); } static PlotPointList getMaxInBinEvents(kshark_trace_histo *histo, kshark_data_container *data, IsApplicableFunc isApplicable) { pushFunc push = [] (int bin, kshark_data_container *data, ssize_t i, PlotPointList *list) { list->push_front({bin, data->data[i]}); }; /* Overwrite if bigger. */ resolveFunc resolve = [] (kshark_data_container *data, ssize_t i, PlotPointList *list) { if (list->front().second < data->data[i]) list->front().second = data->data[i]; }; return getInBinEvents(histo, data, isApplicable, push, resolve); } static PlotPointList getMinInBinEvents(kshark_trace_histo *histo, kshark_data_container *data, IsApplicableFunc isApplicable) { pushFunc push = [] (int bin, kshark_data_container *data, ssize_t i, PlotPointList *list) { list->push_front({bin, data->data[i]}); }; /* Overwrite if smaller. */ resolveFunc resolve = [] (kshark_data_container *data, ssize_t i, PlotPointList *list) { if (list->front().second > data->data[i]) list->front().second = data->data[i]; }; return getInBinEvents(histo, data, isApplicable, push, resolve); } //! @cond Doxygen_Suppress #define PLUGIN_MIN_BOX_SIZE 4 //! @endcond static void intervalPlot(kshark_trace_histo *histo, kshark_data_container *dataEvtA, IsApplicableFunc checkFieldA, kshark_data_container *dataEvtB, IsApplicableFunc checkFieldB, Graph *graph, PlotObjList *shapes, pluginShapeFunc makeShape, Color col, float size) { kshark_data_field_int64 *dataA, *dataB; PlotPointList bufferA, bufferB; int binA, binB; int64_t tsB; auto lamGetBin = [] (auto it) {return (*it).first;}; auto lamGetTime = [] (auto it) {return (*it).second->entry->ts;}; auto lamGetData = [] (auto it) {return (*it).second;}; bufferA = getLastInBinEvents(histo, dataEvtA, checkFieldA); bufferB = getLastInBinEvents(histo, dataEvtB, checkFieldB); if (bufferA.empty() || bufferB.empty()) return; auto itA = bufferA.cbegin(); auto itB = bufferB.cbegin(); while (itA != bufferA.cend() && itB != bufferB.cend()) { binA = lamGetBin(itA); dataA = lamGetData(itA); /* * We will draw a shape between "Event A" and "Event B". * Because the shape starts with "Event A", we will skip all * "Event B" entries before the "Event A" entry. */ do { dataB = lamGetData(itB); tsB = lamGetTime(itB); binB = lamGetBin(itB); itB++; } while (itB != bufferB.cend() && tsB < lamGetTime(itA)); /* * The shape ends with "Event B" and we already have this * event. However, we have to make sure that we will start the * shape from the very last "Event A" entry, which is rigth * before the "Event B" entry, which we already selected. */ while (itA != bufferA.cend() && lamGetTime(itA) < tsB) { dataA = lamGetData(itA); binA = lamGetBin(itA); itA++; } if (binB - binA >= PLUGIN_MIN_BOX_SIZE) shapes->push_front(makeShape({graph}, {binA, binB}, {dataA, dataB}, col, size)); } } /** * @brief Generic plotting method for plugins. To be used for visualizing * a trace events. * * @param argvCpp: The C++ arguments of the drawing function of the plugin. * @param isApplicable: Check function used to select events from data * container A. * @param makeShape: Input location for a function pointer used to generate * the shape to be plotted. * @param col: The color of the shape to be plotted. * @param size: The size of the shape to be plotted. */ void eventPlot(KsCppArgV *argvCpp, IsApplicableFunc isApplicable, pluginShapeFunc makeShape, Color col, float size) { try { pointPlot(argvCpp, isApplicable, makeShape, col, size); } catch (const std::exception &exc) { std::cerr << "Exception in eventPlot\n" << exc.what() << std::endl; } } //! @cond Doxygen_Suppress enum class PlotWath { Maximum, Minimum, }; //! @endcond static void eventFieldPlot(KsCppArgV *argvCpp, kshark_data_container *dataEvt, IsApplicableFunc checkField, PlotWath s, pluginShapeFunc makeShape, KsPlot::Color col, float size) { PlotPointList buffer; if (dataEvt->size == 0) return; if (!dataEvt->sorted) kshark_data_container_sort(dataEvt); try { if (s == PlotWath::Maximum) buffer = getMaxInBinEvents(argvCpp->_histo, dataEvt, checkField); if (s == PlotWath::Minimum) buffer = getMinInBinEvents(argvCpp->_histo, dataEvt, checkField); for (auto const &i: buffer) { argvCpp->_shapes->push_front(makeShape({argvCpp->_graph}, {i.first}, {i.second}, col, size)); } } catch (const std::exception &exc) { std::cerr << "Exception in eventFieldPlot\n" << exc.what() << std::endl; } } /** * @brief Generic plotting method for plugins. To be used for visualizing * the value of a data fiels trace events. * * @param argvCpp: The C++ arguments of the drawing function of the plugin. * @param dataEvt: Input location for the container of the Evant's data. * @param checkField: Check function used to select events from data * container. * @param makeShape: Input location for a function pointer used to generate * the shape to be plotted. * @param col: The color of the shape to be plotted. * @param size: The size of the shape to be plotted. */ void eventFieldPlotMax(KsCppArgV *argvCpp, kshark_data_container *dataEvt, IsApplicableFunc checkField, pluginShapeFunc makeShape, KsPlot::Color col, float size) { eventFieldPlot(argvCpp, dataEvt, checkField, PlotWath::Maximum, makeShape, col, size); } /** * @brief Generic plotting method for plugins. To be used for visualizing * the value of a data fiels trace events. * * @param argvCpp: The C++ arguments of the drawing function of the plugin. * @param dataEvt: Input location for the container of the Evant's data. * @param checkField: check function used to select events from data * container. * @param makeShape: Input location for a function pointer used to generate * the shape to be plotted. * @param col: The color of the shape to be plotted. * @param size: The size of the shape to be plotted. */ void eventFieldPlotMin(KsCppArgV *argvCpp, kshark_data_container *dataEvt, IsApplicableFunc checkField, pluginShapeFunc makeShape, KsPlot::Color col, float size) { eventFieldPlot(argvCpp, dataEvt, checkField, PlotWath::Minimum, makeShape, col, size); } /** * @brief Generic plotting method for plugins. To be used for visualizing * the correlation between two trace events. * * @param argvCpp: The C++ arguments of the drawing function of the plugin. * @param dataEvtA: Input location for the container of the Evant A data. * @param checkFieldA: Check function used to select events from data * container A. * @param dataEvtB: Input location for the container of the Evant B data. * @param checkFieldB: Check function used to select events from data * container B. * @param makeShape: Input location for a function pointer used to generate * the shape to be plotted. * @param col: The color of the shape to be plotted. * @param size: The size of the shape to be plotted. */ void eventFieldIntervalPlot(KsCppArgV *argvCpp, kshark_data_container *dataEvtA, IsApplicableFunc checkFieldA, kshark_data_container *dataEvtB, IsApplicableFunc checkFieldB, pluginShapeFunc makeShape, KsPlot::Color col, float size) { if (dataEvtA->size == 0 || dataEvtB->size == 0) return; if (!dataEvtA->sorted) kshark_data_container_sort(dataEvtA); if (!dataEvtB->sorted) kshark_data_container_sort(dataEvtB); try { intervalPlot(argvCpp->_histo, dataEvtA, checkFieldA, dataEvtB, checkFieldB, argvCpp->_graph, argvCpp->_shapes, makeShape, col, size); } catch (const std::exception &exc) { std::cerr << "Exception in eventFieldIntervalPlot\n" << exc.what() << std::endl; } } /** * @brief Distance between the click and the shape. Used to decide if * the double click action must be executed. * * @param x: X coordinate of the click. * @param y: Y coordinate of the click. * * @returns If the click is inside the box, the distance is zero. * Otherwise infinity. */ double LatencyBox::distance(int x, int y) const { if (x < pointX(0) || x > pointX(2)) return std::numeric_limits::max(); if (y < pointY(0) || y > pointY(1)) return std::numeric_limits::max(); return 0; } kernel-shark-kernelshark-v2.4.0/src/KsPlugins.hpp000066400000000000000000000100721477354127100220320ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsPlugins.hpp * @brief KernelShark C++ plugin declarations. */ #ifndef _KS_PLUGINS_H #define _KS_PLUGINS_H // C++ #include #include // KernelShark #include "libkshark-plugin.h" #include "libkshark-model.h" #include "KsPlotTools.hpp" class KsMainWindow; /** Function type used for launching of plugin control menus. */ typedef void (pluginActionFunc) (KsMainWindow *); /** * Structure representing the vector of C++ arguments of the drawing function * of a plugin. */ struct KsCppArgV { /** Pointer to the model descriptor object. */ kshark_trace_histo *_histo; /** Pointer to the graph object. */ KsPlot::Graph *_graph; /** * Pointer to the list of shapes. All shapes created by the plugin * will be added to this list. */ KsPlot::PlotObjList *_shapes; /** * Convert the "this" pointer of the C++ argument vector into a * C pointer. */ kshark_cpp_argv *toC() { return reinterpret_cast(this); } }; /** * Macro used to convert a C pointer into a pointer to KsCppArgV (C++ struct). */ #define KS_ARGV_TO_CPP(a) (reinterpret_cast(a)) /** * Function of this type has to be implemented by the user in order to use * some of the Generic plotting method. The returned shape will be plotted * by KernelShark on top of the existing Graph generated by the model. */ typedef std::function graph, std::vector bin, std::vector data, KsPlot::Color col, float size)> pluginShapeFunc; /** * Function of this type has to be implemented by the user in order to use * some of the Generic plotting method. The user must implement a logic * deciding if the record, having a given index inside the data container has * to be visualized. */ typedef std::function IsApplicableFunc; void eventPlot(KsCppArgV *argvCpp, IsApplicableFunc isApplicable, pluginShapeFunc makeShape, KsPlot::Color col, float size); void eventFieldPlotMax(KsCppArgV *argvCpp, kshark_data_container *dataEvt, IsApplicableFunc checkField, pluginShapeFunc makeShape, KsPlot::Color col, float size); void eventFieldPlotMin(KsCppArgV *argvCpp, kshark_data_container *dataEvt, IsApplicableFunc checkField, pluginShapeFunc makeShape, KsPlot::Color col, float size); void eventFieldIntervalPlot(KsCppArgV *argvCpp, kshark_data_container *dataEvtA, IsApplicableFunc checkFieldA, kshark_data_container *dataEvtB, IsApplicableFunc checkFieldB, pluginShapeFunc makeShape, KsPlot::Color col, float size); /** * This class represents the graphical element visualizing the latency between * two events. */ class LatencyBox : public KsPlot::Rectangle { /** On double click do. */ void _doubleClick() const override {} public: /** The trace record data that corresponds to this LatencyBox. */ std::vector _data; double distance(int x, int y) const override; }; /** * This template function make shape of hollow box for two events and * return the shape to be plotted by KernelShark on top of the existing * Graph generated by the model. */ template KsPlot::PlotObject * makeLatencyBox(std::vector graph, std::vector bins, std::vector data, KsPlot::Color col, float size) { LatencyBox *rec = new T; rec->_data = data; KsPlot::Point p0 = graph[0]->bin(bins[0])._base; KsPlot::Point p1 = graph[0]->bin(bins[1])._base; int height = graph[0]->height() * .3; rec->setFill(false); rec->setPoint(0, p0.x() - 1, p0.y() - height); rec->setPoint(1, p0.x() - 1, p0.y() - 1); rec->setPoint(3, p1.x() - 1, p1.y() - height); rec->setPoint(2, p1.x() - 1, p1.y() - 1); rec->_size = size; rec->_color = col; return rec; } #endif kernel-shark-kernelshark-v2.4.0/src/KsPluginsGUI.cpp000066400000000000000000000011561477354127100223750ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright 2022 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file KsPluginsGUI.cpp * @brief KernelShark C++ plugin declarations. */ // KernelShark #include "KsPluginsGUI.hpp" #include "KsMainWindow.hpp" #include "KsDualMarker.hpp" void markEntryA(void *ks_ptr, const kshark_entry *e) { KsMainWindow *ks = static_cast(ks_ptr); ks->markEntry(e, DualMarkerState::A); } void markEntryB(void *ks_ptr, const kshark_entry *e) { KsMainWindow *ks = static_cast(ks_ptr); ks->markEntry(e, DualMarkerState::B); } kernel-shark-kernelshark-v2.4.0/src/KsPluginsGUI.hpp000066400000000000000000000006421477354127100224010ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright 2022 VMware Inc, Yordan Karadzhov */ /** * @file KsPluginsGUI.hpp * @brief KernelShark C++ plugin declarations. */ #ifndef _KS_PLUGINS_GUI_H #define _KS_PLUGINS_GUI_H // KernelShark #include "libkshark.h" void markEntryA(void *ks_ptr, const kshark_entry *e); void markEntryB(void *ks_ptr, const kshark_entry *e); #endif kernel-shark-kernelshark-v2.4.0/src/KsQuickContextMenu.cpp000066400000000000000000000224601477354127100236560ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsQuickContextMenu.cpp * @brief Quick Context Menus for KernelShark. */ #include "KsQuickContextMenu.hpp" #include "KsTraceGraph.hpp" /** * @brief Create KsQuickMarkerMenu. * * @param dm: The State machine of the Dual marker. * @param parent: The parent of this widget. */ KsQuickMarkerMenu::KsQuickMarkerMenu(KsDualMarkerSM *dm, QWidget *parent) : QMenu("Context Menu", parent), _dm(dm), _deselectAction(this) { if (dm->activeMarker()._isSet) { addSection("Marker menu"); _deselectAction.setText("Deselect"); _deselectAction.setShortcut(tr("Ctrl+D")); _deselectAction.setStatusTip(tr("Deselect marker")); connect(&_deselectAction, &QAction::triggered, this, &KsQuickMarkerMenu::deselect); addAction(&_deselectAction); } } /** * @brief Create KsQuickContextMenu. * * @param dm: The State machine of the Dual marker. * @param data: Input location for the KsDataStore object. * @param row: The index of the entry used to initialize the menu. * @param parent: The parent of this widget. */ KsQuickContextMenu::KsQuickContextMenu(KsDualMarkerSM *dm, KsDataStore *data, size_t row, QWidget *parent) : KsQuickMarkerMenu(dm, parent), _data(data), _row(row), _rawTime(this), _rawEvent(this), _graphSyncCBox(nullptr), _listSyncCBox(nullptr), _hideTaskAction(this), _showTaskAction(this), _hideEventAction(this), _showEventAction(this), _hideCPUAction(this), _showCPUAction(this), _addCPUPlotAction(this), _addTaskPlotAction(this), _removeCPUPlotAction(this), _removeTaskPlotAction(this), _clearAllFilters(this) { typedef void (KsQuickContextMenu::*mfp)(); QString time, taskName, parentName, descr; kshark_entry *entry = _data->rows()[_row]; kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; QStringList eventFields; int pid, cpu, sd, ret; KsTraceGraph *graphs; int64_t fieldVal; if (!parent || !_data) return; if (!kshark_instance(&kshark_ctx)) return; taskName = kshark_get_task(entry); pid = kshark_get_pid(entry); cpu = entry->cpu; sd = entry->stream_id; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; QString evtData("\t"), val; eventFields = KsUtils::getEventFieldsList(entry->stream_id, entry->event_id); for (auto const &field: eventFields) { std::string buff = field.toStdString(); ret = kshark_read_event_field_int(entry, buff.c_str(), &fieldVal); if (ret < 0) continue; evtData += field + ": " + val.setNum(fieldVal) + "\n\t"; } addSection("Raw event"); time = QString("\ttime: %1 [ns]").arg(entry->ts); _rawTime.setDefaultWidget(new QLabel(time)); addAction(&_rawTime); _rawEvent.setDefaultWidget(new QLabel(evtData)); addAction(&_rawEvent); auto lamAddAction = [this, &descr] (QAction *action, mfp mf) { action->setText(descr); connect(action, &QAction::triggered, this, mf); addAction(action); }; parentName = parent->metaObject()->className(); addSection("Pointer filter menu"); descr = "Show task ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "] only"; lamAddAction(&_showTaskAction, &KsQuickContextMenu::_showTask); descr = "Hide task ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "]"; lamAddAction(&_hideTaskAction, &KsQuickContextMenu::_hideTask); descr = "Show event ["; descr += kshark_get_event_name(entry); descr += "] only"; lamAddAction(&_showEventAction, &KsQuickContextMenu::_showEvent); descr = "Hide event ["; descr += kshark_get_event_name(entry); descr += "]"; lamAddAction(&_hideEventAction, &KsQuickContextMenu::_hideEvent); if (parentName == "KsTraceViewer") { descr = QString("Show CPU [%1] only").arg(cpu); lamAddAction(&_showCPUAction, &KsQuickContextMenu::_showCPU); } descr = QString("Hide CPU [%1]").arg(entry->cpu); lamAddAction(&_hideCPUAction, &KsQuickContextMenu::_hideCPU); descr = "Clear all filters"; lamAddAction(&_clearAllFilters, &KsQuickContextMenu::_clearFilters); addSection("Pointer plot menu"); if (parentName == "KsTraceViewer") { descr = "Add ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "] plot"; lamAddAction(&_addTaskPlotAction, &KsQuickContextMenu::_addTaskPlot); } if (parentName == "KsTraceGraph" && (graphs = dynamic_cast(parent))) { if (graphs->glPtr()->_streamPlots[sd]._taskList.contains(pid)) { descr = "Remove ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "] plot"; lamAddAction(&_removeTaskPlotAction, &KsQuickContextMenu::_removeTaskPlot); } else { descr = "Add ["; descr += taskName; descr += "-"; descr += QString("%1").arg(pid); descr += "] plot"; lamAddAction(&_addTaskPlotAction, &KsQuickContextMenu::_addTaskPlot); } if (graphs->glPtr()->_streamPlots[sd]._cpuList.contains(cpu)) { descr = "Remove [CPU "; descr += QString("%1").arg(cpu); descr += "] plot"; lamAddAction(&_removeCPUPlotAction, &KsQuickContextMenu::_removeCPUPlot); } else { descr = "Add [CPU "; descr += QString("%1").arg(cpu); descr += "] plot"; lamAddAction(&_addCPUPlotAction, &KsQuickContextMenu::_addCPUPlot); } } } void KsQuickContextMenu::_hideTask() { int pid = kshark_get_pid(_data->rows()[_row]); int sd = _data->rows()[_row]->stream_id; kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; QVector vec; if (!kshark_instance(&kshark_ctx)) return; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; vec =_getFilterVector(stream->hide_task_filter, pid); _data->applyNegTaskFilter(sd, vec); } void KsQuickContextMenu::_showTask() { int pid = kshark_get_pid(_data->rows()[_row]); int sd = _data->rows()[_row]->stream_id; _data->applyPosTaskFilter(sd, QVector(1, pid)); } void KsQuickContextMenu::_hideEvent() { int eventId = kshark_get_event_id(_data->rows()[_row]); int sd = _data->rows()[_row]->stream_id; kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; QVector vec; if (!kshark_instance(&kshark_ctx)) return; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; vec =_getFilterVector(stream->hide_event_filter, eventId); _data->applyNegEventFilter(sd, vec); } void KsQuickContextMenu::_showEvent() { int eventId = kshark_get_event_id(_data->rows()[_row]); int sd = _data->rows()[_row]->stream_id; _data->applyPosEventFilter(sd, QVector(1, eventId)); } void KsQuickContextMenu::_showCPU() { int cpu = _data->rows()[_row]->cpu; int sd = _data->rows()[_row]->stream_id; _data->applyPosCPUFilter(sd, QVector(1, cpu)); } void KsQuickContextMenu::_hideCPU() { int sd = _data->rows()[_row]->stream_id; kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; QVector vec; if (!kshark_instance(&kshark_ctx)) return; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; vec =_getFilterVector(stream->hide_cpu_filter, _data->rows()[_row]->cpu); _data->applyNegCPUFilter(sd, vec); } QVector KsQuickContextMenu::_getFilterVector(kshark_hash_id *filter, int newId) { QVector vec = KsUtils::getFilterIds(filter); if (!vec.contains(newId)) vec.append(newId); return vec; } void KsQuickContextMenu::_addTaskPlot() { int pid = kshark_get_pid(_data->rows()[_row]); int sd = _data->rows()[_row]->stream_id; emit addTaskPlot(sd, pid); } void KsQuickContextMenu::_addCPUPlot() { emit addCPUPlot(_data->rows()[_row]->stream_id, _data->rows()[_row]->cpu); } void KsQuickContextMenu::_removeTaskPlot() { int pid = kshark_get_pid(_data->rows()[_row]); int sd = _data->rows()[_row]->stream_id; emit removeTaskPlot(sd, pid); } void KsQuickContextMenu::_removeCPUPlot() { emit removeCPUPlot(_data->rows()[_row]->stream_id, _data->rows()[_row]->cpu); } /** * @brief Create KsRmPlotContextMenu. * * @param dm: The State machine of the Dual marker. * @param sd: Data stream identifier. * @param parent: The parent of this widget. */ KsRmPlotContextMenu::KsRmPlotContextMenu(KsDualMarkerSM *dm, int sd, QWidget *parent) : KsQuickMarkerMenu(dm, parent), _removePlotAction(this), _sd(sd) { addSection("Plots"); connect(&_removePlotAction, &QAction::triggered, this, &KsRmPlotContextMenu::removePlot); addAction(&_removePlotAction); } /** * @brief Create KsRmCPUPlotMenu. * * @param dm: The State machine of the Dual marker. * @param sd: Data stream identifier. * @param cpu : CPU Id. * @param parent: The parent of this widget. */ KsRmCPUPlotMenu::KsRmCPUPlotMenu(KsDualMarkerSM *dm, int sd, int cpu, QWidget *parent) : KsRmPlotContextMenu(dm, sd, parent) { _removePlotAction.setText(QString("Remove [CPU %1]").arg(cpu)); } /** * @brief Create KsRmTaskPlotMenu. * * @param dm: The State machine of the Dual marker. * @param sd: Data stream identifier. * @param pid: Process Id. * @param parent: The parent of this widget. */ KsRmTaskPlotMenu::KsRmTaskPlotMenu(KsDualMarkerSM *dm, int sd, int pid, QWidget *parent) : KsRmPlotContextMenu(dm, sd, parent) { QString descr; descr = "Remove [ "; descr += kshark_comm_from_pid(sd, pid); descr += "-"; descr += QString("%1").arg(pid); descr += "] plot"; _removePlotAction.setText(descr); } kernel-shark-kernelshark-v2.4.0/src/KsQuickContextMenu.hpp000066400000000000000000000060311477354127100236570ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsQuickContextMenu.hpp * @brief Quick Context Menus for KernelShark. */ #ifndef _KS_QUICK_CTX_MENU_H #define _KS_QUICK_CTX_MENU_H #include "KsDualMarker.hpp" #include "KsUtils.hpp" #include "KsGLWidget.hpp" /** * The KsQuickMarkerMenu class provides menu for quick Dual Marker related * actions. */ class KsQuickMarkerMenu : public QMenu { Q_OBJECT public: KsQuickMarkerMenu(KsDualMarkerSM *dm, QWidget *parent = nullptr); signals: /** Signal to deselect the active marker. */ void deselect(); private: KsDualMarkerSM *_dm; QAction _deselectAction; }; /** * The KsQuickFilterMenu class provides a menu for easy filtering and plotting. * The menu is initialized from a single kshark_entry and uses the content of * this entry to provides quick actions for filtering and plottin. */ class KsQuickContextMenu : public KsQuickMarkerMenu { Q_OBJECT public: KsQuickContextMenu() = delete; KsQuickContextMenu(KsDualMarkerSM *dm, KsDataStore *data, size_t row, QWidget *parent = nullptr); signals: /** Signal to add a task plot. */ void addTaskPlot(int sd, int pid); /** Signal to add a CPU plot. */ void addCPUPlot(int sd, int cpu); /** Signal to remove a task plot. */ void removeTaskPlot(int sd, int pid); /** Signal to remove a CPU plot. */ void removeCPUPlot(int sd, int cpu); private: void _hideTask(); void _showTask(); void _hideEvent(); void _showEvent(); void _showCPU(); void _hideCPU(); void _addCPUPlot(); void _addTaskPlot(); void _removeCPUPlot(); void _removeTaskPlot(); QVector _getFilterVector(kshark_hash_id *filter, int newId); void _clearFilters() {_data->clearAllFilters();} KsDataStore *_data; size_t _row; QWidgetAction _rawTime, _rawEvent; QCheckBox *_graphSyncCBox, *_listSyncCBox; QAction _hideTaskAction, _showTaskAction; QAction _hideEventAction, _showEventAction; QAction _hideCPUAction, _showCPUAction; QAction _addCPUPlotAction; QAction _addTaskPlotAction; QAction _removeCPUPlotAction; QAction _removeTaskPlotAction; QAction _clearAllFilters; }; /** * The KsQuickMarkerMenu is a baser class for Remove Plot menus. */ class KsRmPlotContextMenu : public KsQuickMarkerMenu { Q_OBJECT public: KsRmPlotContextMenu() = delete; KsRmPlotContextMenu(KsDualMarkerSM *dm, int sd, QWidget *parent = nullptr); signals: /** Signal to remove a plot. */ void removePlot(int); protected: /** Menu action. */ QAction _removePlotAction; /** Data stream identifier. */ int _sd; }; /** * The KsQuickMarkerMenu class provides CPU Plot remove menus. */ struct KsRmCPUPlotMenu : public KsRmPlotContextMenu { KsRmCPUPlotMenu(KsDualMarkerSM *dm, int sd, int cpu, QWidget *parent = nullptr); }; /** * The KsQuickMarkerMenu class provides Task Plot remove menus. */ struct KsRmTaskPlotMenu : public KsRmPlotContextMenu { KsRmTaskPlotMenu(KsDualMarkerSM *dm, int sd, int pid, QWidget *parent = nullptr); }; #endif kernel-shark-kernelshark-v2.4.0/src/KsSearchFSM.cpp000066400000000000000000000132701477354127100221620ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsSearchFSM.cpp * @brief Finite-state machine for searching in trace data. */ // KernelShark #include "KsSearchFSM.hpp" #include "KsUtils.hpp" #include "KsTraceViewer.hpp" #include "KsWidgetsLib.hpp" static bool notHaveCond(const QString &searchText, const QString &itemText) { return !itemText.contains(searchText, Qt::CaseInsensitive); } static bool containsCond(const QString &searchText, const QString &itemText) { return itemText.contains(searchText, Qt::CaseInsensitive); } static bool matchCond(const QString &searchText, const QString &itemText) { return (itemText.compare(searchText, Qt::CaseInsensitive) == 0); } static bool noCond([[maybe_unused]] const QString &searchText, [[maybe_unused]] const QString &itemText) { return false; } /** Create a Finite-state machine for searching. */ KsSearchFSM::KsSearchFSM(QWidget *parent) : _currentState(new NotDone), _lastRowSearched(0), _searchProgBar(parent), _searchCountLabel("", parent), _columnComboBox(parent), _selectComboBox(parent), _searchLineEdit(parent), _prevButton("Prev", parent), _nextButton("Next", parent), _searchRestartButton(QIcon::fromTheme("media-playback-start"), "", parent), // _searchStopButton(QIcon::fromTheme("media-playback-pause"), "", parent), _searchStopButton(QIcon::fromTheme("process-stop"), "", parent), _cond(nullptr), _pbAction(nullptr), _searchStopAction(nullptr), _searchRestartAction(nullptr) { int bWidth = FONT_WIDTH * 6; _nextButton.setFixedWidth(bWidth); _prevButton.setFixedWidth(bWidth); _searchProgBar.setMaximumWidth(FONT_WIDTH * 10); _searchProgBar.setRange(0, KS_PROGRESS_BAR_MAX); _selectComboBox.addItem("contains"); _selectComboBox.addItem("full match"); _selectComboBox.addItem("does not have"); updateCondition(); } /** * Position all buttons and labels of the Finite-state machine for searching * in a toolbar. */ void KsSearchFSM::placeInToolBar(QToolBar *tb) { tb->addWidget(&_columnComboBox); tb->addWidget(&_selectComboBox); tb->addWidget(&_searchLineEdit); tb->addSeparator(); tb->addWidget(&_nextButton); tb->addWidget(&_prevButton); tb->addSeparator(); _pbAction = tb->addWidget(&_searchProgBar); _pbAction->setVisible(false); tb->addWidget(&_searchCountLabel); _searchStopAction = tb->addWidget(&_searchStopButton); _searchStopAction->setVisible(false); _searchRestartAction = tb->addWidget(&_searchRestartButton); _searchRestartAction->setVisible(false); tb->addSeparator(); } /** * Update the Matching condition function of the search according to the user * input. */ void KsSearchFSM::updateCondition() { int xSelect = _selectComboBox.currentIndex(); switch (xSelect) { case Condition::Containes: _cond = containsCond; return; case Condition::Match: _cond = matchCond; return; case Condition::NotHave: _cond = notHaveCond; return; default: _cond = noCond; return; } } void KsSearchFSM ::_lockSearchPanel(bool lock) { _columnComboBox.setEnabled(!lock); _selectComboBox.setEnabled(!lock); _searchLineEdit.setReadOnly(lock); _prevButton.setEnabled(!lock); _nextButton.setEnabled(!lock); // _graphFollowsCheckBox.setEnabled(!lock); } /** Act according to the provided input. */ void NotDone::handleInput(KsSearchFSM* sm, sm_input_t input) { int column = sm->column(); if (sm->_columnComboBox.findText(">>", Qt::MatchContains) < 0) { /* * If only one Data stream (file) is loaded, the ">>" column * (TRACE_VIEW_COL_STREAM) is not shown. The column index has * to be corrected. */ ++column; } switch(input) { case sm_input_t::Start: sm->_lastRowSearched = -1; sm->lockSearchPanel(); sm->updateCondition(); sm->progressBarVisible(true); sm->searchStopVisible(true); sm->changeState(std::shared_ptr(new InProgress)); break; case sm_input_t::Finish: sm->changeState(std::shared_ptr(new Done)); break; default: /* Ignore the input. */ break; } } /** Act according to the provided input. */ void Paused::handleInput(KsSearchFSM* sm, sm_input_t input) { switch(input) { case sm_input_t::Start: sm->lockSearchPanel(); sm->searchStopVisible(true); sm->searchRestartVisible(false); if (sm->column() != KsViewModel::TRACE_VIEW_COL_INFO && sm->column() != KsViewModel::TRACE_VIEW_COL_AUX) sm->_searchCountLabel.setText(""); sm->changeState(std::shared_ptr(new InProgress)); break; case sm_input_t::Change: sm->_searchProgBar.setValue(0); sm->_searchCountLabel.setText(""); sm->progressBarVisible(false); sm->searchRestartVisible(false); sm->changeState(std::shared_ptr(new NotDone)); break; default: /* Ignore the input. */ break; } } /** Act according to the provided input. */ void InProgress::handleInput(KsSearchFSM* sm, sm_input_t input) { auto lamUnlock = [&sm] () { sm->searchStopVisible(false); sm->unlockSearchPanel(); }; switch(input) { case sm_input_t::Stop: lamUnlock(); sm->searchRestartVisible(true); sm->changeState(std::shared_ptr(new Paused)); break; case sm_input_t::Finish: lamUnlock(); sm->progressBarVisible(false); sm->changeState(std::shared_ptr(new Done)); break; default: /* Ignore the input. */ break; } } /** Act according to the provided input. */ void Done::handleInput(KsSearchFSM* sm, sm_input_t i) { switch(i) { case sm_input_t::Change: sm->_searchProgBar.setValue(0); sm->progressBarVisible(false); sm->_searchCountLabel.setText(""); sm->searchStopVisible(false); sm->searchRestartVisible(false); sm->changeState(std::shared_ptr(new NotDone)); break; default: /* Ignore the input. */ break; } } kernel-shark-kernelshark-v2.4.0/src/KsSearchFSM.hpp000066400000000000000000000113211477354127100221620ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file KsSearchFSM.hpp * @brief Finite-state machine for searching in trace data. */ #ifndef _KS_SEARCH_FSM_H #define _KS_SEARCH_FSM_H // C++11 #include // Qt #include /** Matching condition function type. To be user for searching. */ typedef bool (*search_condition_func)(const QString &, const QString &); /** State Identifiers of the Finite-state machine for searching. */ enum class search_state_t { /** Identifier of the "NotDone" state. */ NotDone_s = 0, /** Identifier of the "InProgress" state. */ InProgress_s = 1, /** Identifier of the "Paused" state. */ Paused_s = 2, /** Identifier of the "Done" state. */ Done_s = 3 }; /** Inputs of the Finite-state machine for searching. */ enum class sm_input_t { Start = 0, Stop = 1, Finish = 2, Change = 3 }; class KsSearchFSM; /** * State provides a base class for the states of the Finite-state machine for * searching. */ struct State { /** Virtual destructor. */ virtual ~State() {} /** * Act according to the provided input. This is a pure virtual * function. */ virtual void handleInput(KsSearchFSM* sm, sm_input_t i) = 0; /** * Get the identifier of this state. This is a pure virtual function. */ virtual search_state_t id() = 0; }; /** "NotDone" state. */ struct NotDone : public State { void handleInput(KsSearchFSM* sm, sm_input_t i) override; search_state_t id() override {return search_state_t::NotDone_s;} }; /** "InProgress" state. */ struct InProgress : public State { void handleInput(KsSearchFSM* sm, sm_input_t i) override; /** Get the identifier of this state. */ search_state_t id() override {return search_state_t::InProgress_s;} }; /** "Paused" state. */ struct Paused : public State { void handleInput(KsSearchFSM* sm, sm_input_t i) override; /** Get the identifier of this state. */ search_state_t id() override {return search_state_t::Paused_s;} }; /** "Done" state. */ struct Done : public State { void handleInput(KsSearchFSM* sm, sm_input_t i) override; /** Get the identifier of this state. */ search_state_t id() override {return search_state_t::Done_s;} }; /** Finite-state machine for searching. */ class KsSearchFSM : public QWidget { Q_OBJECT public: explicit KsSearchFSM(QWidget *parent = nullptr); void placeInToolBar(QToolBar *tb); /** Act according to the provided input. */ void handleInput(sm_input_t input) { _currentState->handleInput(this, input); } /** Switch the state. */ void changeState(std::shared_ptr newState) { _currentState = newState; } /** Get the identifier of the Current state. */ search_state_t getState() const {return _currentState->id();} /** Get the data column to search in. */ int column() const {return _columnComboBox.currentIndex();} /** Get the Matching condition function. */ search_condition_func condition() const {return _cond;} /** Get the text to search for. */ QString searchText() const {return _searchLineEdit.text();} /** Set the value of the Search Progress Bar. */ void setProgress(int v) {_searchProgBar.setValue(v);} /** Increment the value of the Search Progress Bar. */ void incrementProgress() { _searchProgBar.setValue(_searchProgBar.value() + 1); } void updateCondition(); /** Disable the user searching input (lock the panel). */ void lockSearchPanel() {_lockSearchPanel(true);} /** Enable the user searching input (unlock the panel). */ void unlockSearchPanel() {_lockSearchPanel(false);} /** Set the visibility of the Search Progress Bar. */ void progressBarVisible(bool v) {_pbAction->setVisible(v);} /** Set the visibility of the Search Stop button. */ void searchStopVisible(bool v) {_searchStopAction->setVisible(v);} /** Set the visibility of the Search Restart button. */ void searchRestartVisible(bool v) {_searchRestartAction->setVisible(v);} /** Current State of the Finite-state machine for searching. */ std::shared_ptr _currentState; /** * Last row, tested for matching. To be used when restarting the * search. Note that the field uses "int" as a type because this * is the type supported by the Qt widget (QTableView). */ int _lastRowSearched; //! @cond Doxygen_Suppress QProgressBar _searchProgBar; QLabel _searchCountLabel; QComboBox _columnComboBox; QComboBox _selectComboBox; QLineEdit _searchLineEdit; QPushButton _prevButton, _nextButton; QPushButton _searchRestartButton, _searchStopButton; //! @endcond private: search_condition_func _cond; QAction *_pbAction, *_searchStopAction, *_searchRestartAction; void _lockSearchPanel(bool lock); enum Condition { Containes = 0, Match = 1, NotHave = 2 }; }; #endif kernel-shark-kernelshark-v2.4.0/src/KsSession.cpp000066400000000000000000000431301477354127100220300ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsSession.cpp * @brief KernelShark Session. */ // KernelShark #include "libkshark.h" #include "libkshark-tepdata.h" #include "KsSession.hpp" #include "KsMainWindow.hpp" /** Create a KsSession object. */ KsSession::KsSession() { _config = kshark_session_config_new(KS_CONFIG_JSON); } /** Destroy a KsSession object. */ KsSession::~KsSession() { kshark_free_config_doc(_config); } /** Import a user session from a Json file. */ bool KsSession::importFromFile(QString jfileName) { kshark_config_doc *configTmp = kshark_open_config_file(jfileName.toStdString().c_str(), "kshark.config.session"); if (configTmp) { kshark_free_config_doc(_config); _config = configTmp; return true; } return false; } /** Export the current user session from a Json file. */ void KsSession::exportToFile(QString jfileName) { kshark_save_config_file(jfileName.toStdString().c_str(), _config); } /** * @brief Save the state of the visualization model. * * @param histo: Input location for the model descriptor. */ void KsSession::saveVisModel(kshark_trace_histo *histo) { kshark_config_doc *model = kshark_export_model(histo, KS_CONFIG_JSON); kshark_config_doc_add(_config, "Model", model); } /** * @brief Load the state of the visualization model. * * @param model: Input location for the KsGraphModel object. */ void KsSession::loadVisModel(KsGraphModel *model) { kshark_config_doc *modelConf = kshark_config_alloc(KS_CONFIG_JSON); if (!kshark_config_doc_get(_config, "Model", modelConf)) return; kshark_import_model(model->histo(), modelConf); model->update(); } /** Save the trace data file. */ void KsSession::saveDataFile(QString fileName, QString dataSetName) { kshark_config_doc *file = kshark_export_trace_file(fileName.toStdString().c_str(), dataSetName.toStdString().c_str(), KS_CONFIG_JSON); kshark_config_doc_add(_config, "Data", file); } /** Get the trace data file. */ QString KsSession::getDataFile(kshark_context *kshark_ctx) { kshark_config_doc *file = kshark_config_alloc(KS_CONFIG_JSON); int sd; if (!kshark_config_doc_get(_config, "Data", file)) return QString(); sd = kshark_import_trace_file(kshark_ctx, file); if (sd) return QString(kshark_ctx->stream[sd]->file); return QString(); } /** * @brief Save the configuration information for all load Data streams. * * @param kshark_ctx: Input location for context pointer. */ void KsSession::saveDataStreams(kshark_context *kshark_ctx) { kshark_export_all_dstreams(kshark_ctx, &_config); } /** * @brief Load Data streams. * * @param kshark_ctx: Input location for context pointer. * @param data: Input location for KsDataStore object; */ void KsSession::loadDataStreams(kshark_context *kshark_ctx, KsDataStore *data) { ssize_t dataSize; data->unregisterCPUCollections(); kshark_close_all(kshark_ctx); dataSize = kshark_import_all_dstreams(kshark_ctx, _config, data->rows_r()); if (dataSize < 0) { data->clear(); return; } data->setSize(dataSize); data->registerCPUCollections(); } /** * @brief Save the state of the table. * * @param view: Input location for the KsTraceViewer widget. */ void KsSession::saveTable(const KsTraceViewer &view) { kshark_config_doc *topRow = kshark_config_alloc(KS_CONFIG_JSON); int64_t r = view.getTopRow(); topRow->conf_doc = json_object_new_int64(r); kshark_config_doc_add(_config, "ViewTop", topRow); } /** * @brief Load the state of the table. * * @param view: Input location for the KsTraceViewer widget. */ void KsSession::loadTable(KsTraceViewer *view) { kshark_config_doc *topRow = kshark_config_alloc(KS_CONFIG_JSON); size_t r = 0; if (!kshark_config_doc_get(_config, "ViewTop", topRow)) return; if (_config->format == KS_CONFIG_JSON) r = json_object_get_int64(KS_JSON_CAST(topRow->conf_doc)); view->setTopRow(r); } /** * @brief Save the KernelShark Main window size. * * @param window: Input location for the KsMainWindow widget. */ void KsSession::saveMainWindowSize(const QMainWindow &window) { kshark_config_doc *windowConf = kshark_config_alloc(KS_CONFIG_JSON); int width = window.width(), height = window.height(); json_object *jwindow; if (window.isFullScreen()) { jwindow = json_object_new_string("FullScreen"); } else { jwindow = json_object_new_array(); json_object_array_put_idx(jwindow, 0, json_object_new_int(width)); json_object_array_put_idx(jwindow, 1, json_object_new_int(height)); } windowConf->conf_doc = jwindow; kshark_config_doc_add(_config, "MainWindow", windowConf); } /** * @brief Load the KernelShark Main window size. * * @param window: Input location for the KsMainWindow widget. */ void KsSession::loadMainWindowSize(KsMainWindow *window) { kshark_config_doc *windowConf = kshark_config_alloc(KS_CONFIG_JSON); json_object *jwindow, *jwidth, *jheight; int width, height; if (!kshark_config_doc_get(_config, "MainWindow", windowConf)) return; if (_config->format == KS_CONFIG_JSON) { jwindow = KS_JSON_CAST(windowConf->conf_doc); if (json_object_get_type(jwindow) == json_type_string && QString(json_object_get_string(jwindow)) == "FullScreen") { window->setFullScreenMode(true); return; } jwidth = json_object_array_get_idx(jwindow, 0); jheight = json_object_array_get_idx(jwindow, 1); width = json_object_get_int(jwidth); height = json_object_get_int(jheight); window->setFullScreenMode(false); window->resize(width, height); } } /** * @brief Save the state of the Main window spliter. * * @param splitter: Input location for the splitter widget. */ void KsSession::saveSplitterSize(const QSplitter &splitter) { kshark_config_doc *spl = kshark_config_alloc(KS_CONFIG_JSON); json_object *jspl = json_object_new_array(); QList sizes = splitter.sizes(); json_object_array_put_idx(jspl, 0, json_object_new_int(sizes[0])); json_object_array_put_idx(jspl, 1, json_object_new_int(sizes[1])); spl->conf_doc = jspl; kshark_config_doc_add(_config, "Splitter", spl); } /** * @brief Load the state of the Main window spliter. * * @param splitter: Input location for the splitter widget. */ void KsSession::loadSplitterSize(QSplitter *splitter) { kshark_config_doc *spl = kshark_config_alloc(KS_CONFIG_JSON); json_object *jspl, *jgraphsize, *jviewsize; int graphSize(1), viewSize(1); QList sizes; if (!kshark_config_doc_get(_config, "Splitter", spl)) return; if (_config->format == KS_CONFIG_JSON) { jspl = KS_JSON_CAST(spl->conf_doc); jgraphsize = json_object_array_get_idx(jspl, 0); jviewsize = json_object_array_get_idx(jspl, 1); graphSize = json_object_get_int(jgraphsize); viewSize = json_object_get_int(jviewsize); if (graphSize == 0 && viewSize == 0) { /* 0/0 spliter ratio is undefined. Make it 1/1. */ viewSize = graphSize = 1; } } sizes << graphSize << viewSize; splitter->setSizes(sizes); } /** @brief Save the Color scheme used. */ void KsSession::saveColorScheme() { kshark_config_doc *colSch = kshark_config_alloc(KS_CONFIG_JSON); double s = KsPlot::Color::rainbowFrequency(); colSch->conf_doc = json_object_new_double(s); kshark_config_doc_add(_config, "ColorScheme", colSch); } /** @brief Get the Color scheme used. */ float KsSession::getColorScheme() { kshark_config_doc *colSch = kshark_config_alloc(KS_CONFIG_JSON); /* Default color scheme. */ float s = 0.75; if (!kshark_config_doc_get(_config, "ColorScheme", colSch)) return s; if (_config->format == KS_CONFIG_JSON) s = json_object_get_double(KS_JSON_CAST(colSch->conf_doc)); return s; } /** * @brief Save the list of the graphs plotted. * * @param kshark_ctx: Input location for context pointer. * @param graphs: Input location for the KsTraceGraph widget.. */ void KsSession::saveGraphs(kshark_context *kshark_ctx, KsTraceGraph &graphs) { QVector streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { _saveCPUPlots(sd, graphs.glPtr()); _saveTaskPlots(sd, graphs.glPtr()); } _saveComboPlots(graphs.glPtr()); } /** * @brief Load the list of the graphs and plot. * * @param kshark_ctx: Input location for context pointer. * @param graphs: Input location for the KsTraceGraph widget. */ void KsSession::loadGraphs(kshark_context *kshark_ctx, KsTraceGraph &graphs) { QVector combos, streamIds; int nCombos; streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { graphs.cpuReDraw(sd, _getCPUPlots(sd)); graphs.taskReDraw(sd, _getTaskPlots(sd)); } combos = _getComboPlots(&nCombos); if (nCombos > 0) graphs.comboReDraw(nCombos, combos); } void KsSession::_savePlots(int sd, KsGLWidget *glw, bool cpu) { kshark_config_doc *streamsConf = kshark_config_alloc(KS_CONFIG_JSON); json_object *jallStreams, *jstream = nullptr, *jstreamId, *jplots; QVector plotIds; int nStreams; if (cpu) { plotIds = glw->_streamPlots[sd]._cpuList; } else { plotIds = glw->_streamPlots[sd]._taskList; } if (!kshark_config_doc_get(_config, "data streams", streamsConf) || streamsConf->format != KS_CONFIG_JSON) return; jallStreams = KS_JSON_CAST(streamsConf->conf_doc); if (json_object_get_type(jallStreams) != json_type_array) return; nStreams = json_object_array_length(jallStreams); for (int i = 0; i < nStreams; ++i) { jstream = json_object_array_get_idx(jallStreams, i); if (json_object_object_get_ex(jstream, "stream id", &jstreamId) && json_object_get_int(jstreamId) == sd) break; jstream = nullptr; } free(streamsConf); if (!jstream) return; jplots = json_object_new_array(); for (int i = 0; i < plotIds.count(); ++i) { json_object *jcpu = json_object_new_int(plotIds[i]); json_object_array_put_idx(jplots, i, jcpu); } if (cpu) json_object_object_add(jstream, "CPUPlots", jplots); else json_object_object_add(jstream, "TaskPlots", jplots); } void KsSession::_saveCPUPlots(int sd, KsGLWidget *glw) { _savePlots(sd, glw, true); } void KsSession::_saveTaskPlots(int sd, KsGLWidget *glw) { _savePlots(sd, glw, false); } void KsSession::_saveComboPlots(KsGLWidget *glw) { kshark_config_doc *combos = kshark_config_alloc(KS_CONFIG_JSON); json_object *jcombos, *jplots, *jplt; int var; jcombos = json_object_new_array(); for (auto const &c: glw->_comboPlots) { jplots = json_object_new_array(); for (auto const &p: c) { jplt = json_object_new_array(); var = p._streamId; json_object_array_put_idx(jplt, 0, json_object_new_int(var)); var = p._type; json_object_array_put_idx(jplt, 1, json_object_new_int(var)); var = p._id; json_object_array_put_idx(jplt, 2, json_object_new_int(var)); json_object_array_add(jplots, jplt); } json_object_array_add(jcombos, jplots); } combos->conf_doc = jcombos; kshark_config_doc_add(_config, "ComboPlots", combos); } QVector KsSession::_getPlots(int sd, bool cpu) { kshark_config_doc *streamsConf = kshark_config_alloc(KS_CONFIG_JSON); json_object *jallStreams, *jstream = nullptr, *jstreamId, *jplots; int nStreams, nPlots, id; const char *plotKey; QVector plots; if (!kshark_config_doc_get(_config, "data streams", streamsConf) || streamsConf->format != KS_CONFIG_JSON) return plots; jallStreams = KS_JSON_CAST(streamsConf->conf_doc); if (json_object_get_type(jallStreams) != json_type_array) return plots; nStreams = json_object_array_length(jallStreams); for (int i = 0; i < nStreams; ++i) { jstream = json_object_array_get_idx(jallStreams, i); if (json_object_object_get_ex(jstream, "stream id", &jstreamId) && json_object_get_int(jstreamId) == sd) break; jstream = nullptr; } if (!jstream) return plots; if (cpu) plotKey = "CPUPlots"; else plotKey = "TaskPlots"; if (!json_object_object_get_ex(jstream, plotKey, &jplots) || json_object_get_type(jplots) != json_type_array) return plots; nPlots = json_object_array_length(jplots); for (int i = 0; i < nPlots; ++i) { id = json_object_get_int(json_object_array_get_idx(jplots, i)); plots.append(id); } return plots; } QVector KsSession::_getCPUPlots(int sd) { return _getPlots(sd, true); } QVector KsSession::_getTaskPlots(int sd) { return _getPlots(sd, false); } QVector KsSession::_getComboPlots(int *n) { kshark_config_doc *combos = kshark_config_alloc(KS_CONFIG_JSON); int nCombos, nPlots, sd, type, id; json_object *jcombos, *jplots, *jplt, *jvar; QVector vec; *n = 0; if (!kshark_config_doc_get(_config, "ComboPlots", combos)) return {}; if (_config->format == KS_CONFIG_JSON) { jcombos = KS_JSON_CAST(combos->conf_doc); if (json_object_get_type(jcombos) != json_type_array) return {}; *n = nCombos = json_object_array_length(jcombos); for (int i = 0; i < nCombos; ++i) { jplots = json_object_array_get_idx(jcombos, i); if (json_object_get_type(jplots) != json_type_array) return {}; nPlots = json_object_array_length(jplots); vec.append(nPlots); for (int j = 0; j < nPlots; ++j) { jplt = json_object_array_get_idx(jplots, j); if (json_object_get_type(jplt) != json_type_array) return {}; jvar = json_object_array_get_idx(jplt, 0); sd = json_object_get_int(jvar); jvar = json_object_array_get_idx(jplt, 1); type = json_object_get_int(jvar); jvar = json_object_array_get_idx(jplt, 2); id = json_object_get_int(jvar); vec.append({sd, type, id}); } } } return vec; } /** * @brief Save the state of the Dual marker. * * @param dm: Input location for the KsDualMarkerSM object. */ void KsSession::saveDualMarker(KsDualMarkerSM *dm) { kshark_config_doc *markers = kshark_config_new("kshark.config.markers", KS_CONFIG_JSON); json_object *jd_mark = KS_JSON_CAST(markers->conf_doc); auto save_mark = [&jd_mark] (KsGraphMark *m, const char *name) { json_object *jmark = json_object_new_object(); if (m->_isSet) { json_object_object_add(jmark, "isSet", json_object_new_boolean(true)); json_object_object_add(jmark, "row", json_object_new_int(m->_pos)); } else { json_object_object_add(jmark, "isSet", json_object_new_boolean(false)); } json_object_object_add(jd_mark, name, jmark); }; save_mark(&dm->markerA(), "markA"); save_mark(&dm->markerB(), "markB"); if (dm->getState() == DualMarkerState::A) json_object_object_add(jd_mark, "Active", json_object_new_string("A")); else json_object_object_add(jd_mark, "Active", json_object_new_string("B")); kshark_config_doc_add(_config, "Markers", markers); } /** * @brief Load the state of the Dual marker. * * @param dm: Input location for the KsDualMarkerSM object. * @param graphs: Input location for the KsTraceGraph widget. */ void KsSession::loadDualMarker(KsDualMarkerSM *dm, KsTraceGraph *graphs) { size_t pos; dm->reset(); dm->setState(DualMarkerState::A); if (_getMarker("markA", &pos)) { graphs->markEntry(pos); } else { dm->markerA().remove(); } dm->setState(DualMarkerState::B); if (_getMarker("markB", &pos)) { graphs->markEntry(pos); } else { dm->markerB().remove(); } dm->setState(_getMarkerState()); if (dm->activeMarker()._isSet) { pos = dm->activeMarker()._pos; emit graphs->glPtr()->updateView(pos, true); } } json_object *KsSession::_getMarkerJson() { kshark_config_doc *markers = kshark_config_alloc(KS_CONFIG_JSON); if (!kshark_config_doc_get(_config, "Markers", markers) || !kshark_type_check(markers, "kshark.config.markers")) return nullptr; return KS_JSON_CAST(markers->conf_doc); } bool KsSession::_getMarker(const char* name, size_t *pos) { json_object *jd_mark, *jmark; *pos = 0; jd_mark = _getMarkerJson(); if (!jd_mark) return false; if (json_object_object_get_ex(jd_mark, name, &jmark)) { json_object *jis_set; json_object_object_get_ex(jmark, "isSet", &jis_set); if (!json_object_get_boolean(jis_set)) return false; json_object *jpos; json_object_object_get_ex(jmark, "row", &jpos); *pos = json_object_get_int64(jpos); } return true; } DualMarkerState KsSession::_getMarkerState() { json_object *jd_mark, *jstate; const char* state; jd_mark = _getMarkerJson(); json_object_object_get_ex(jd_mark, "Active", &jstate); state = json_object_get_string(jstate); if (strcmp(state, "A") == 0) return DualMarkerState::A; return DualMarkerState::B; } /** * @brief Save the configuration of the plugins. * * @param pm: Input location for the KsPluginManager object. */ void KsSession::saveUserPlugins(const KsPluginManager &pm) { kshark_config_doc *plugins = kshark_config_new("kshark.config.plugins", KS_CONFIG_JSON); json_object *jplugins = KS_JSON_CAST(plugins->conf_doc); json_object *jplg, *jlist = json_object_new_array(); for (auto const p: pm.getUserPlugins()) { kshark_config_doc *lib = kshark_export_plugin_file(p, KS_CONFIG_JSON); jplg = KS_JSON_CAST(lib->conf_doc); json_object_array_add(jlist, jplg); free(lib); } json_object_object_add(jplugins, "obj. files", jlist); kshark_config_doc_add(_config, "User Plugins", plugins); } /** * @brief Load the configuration of the plugins. * * @param kshark_ctx: Input location for context pointer. * @param pm: Input location for the KsPluginManager object. */ void KsSession::loadUserPlugins(kshark_context *kshark_ctx, KsPluginManager *pm) { kshark_config_doc *plugins = kshark_config_alloc(KS_CONFIG_JSON); kshark_plugin_list *list, **last; if (!kshark_config_doc_get(_config, "User Plugins", plugins)) return; /* Get the list of already loaded plugins. */ list = kshark_ctx->plugins; kshark_import_all_plugins(kshark_ctx, plugins); /* Loop until the beginning of the old list. */ for (last = &kshark_ctx->plugins; *last != list; last = &(*last)->next) pm->addUserPluginToList(*last); } kernel-shark-kernelshark-v2.4.0/src/KsSession.hpp000066400000000000000000000046011477354127100220350ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsSession.hpp * @brief KernelShark Session. */ #ifndef _KS_SESSION_H #define _KS_SESSION_H // Qt #include // KernelShark #include "KsDualMarker.hpp" #include "KsTraceGraph.hpp" #include "KsTraceViewer.hpp" class KsMainWindow; /** * The KsSession class provides instruments for importing/exporting the state * of the different components of the GUI from/to Json documents. These * instruments are used to save/load user session in the GUI. */ class KsSession { public: KsSession(); virtual ~KsSession(); /** Get the configuration document object. */ kshark_config_doc *getConfDocPtr() const {return _config;} bool importFromFile(QString jfileName); void exportToFile(QString jfileName); void saveDataFile(QString fileName, QString dataSetName); QString getDataFile(kshark_context *kshark_ctx); void saveVisModel(kshark_trace_histo *histo); void loadVisModel(KsGraphModel *model); void saveGraphs(kshark_context *kshark_ctx, KsTraceGraph &graphs); void loadGraphs(kshark_context *kshark_ctx, KsTraceGraph &graphs); void saveDataStreams(kshark_context *kshark_ctx); void loadDataStreams(kshark_context *kshark_ctx, KsDataStore *data); void saveMainWindowSize(const QMainWindow &window); void loadMainWindowSize(KsMainWindow *window); void saveSplitterSize(const QSplitter &splitter); void loadSplitterSize(QSplitter *splitter); void saveDualMarker(KsDualMarkerSM *dm); void loadDualMarker(KsDualMarkerSM *dmm, KsTraceGraph *graphs); void saveUserPlugins(const KsPluginManager &pm); void loadUserPlugins(kshark_context *kshark_ctx, KsPluginManager *pm); void saveTable(const KsTraceViewer &view); void loadTable(KsTraceViewer *view); void saveColorScheme(); float getColorScheme(); private: kshark_config_doc *_config; json_object *_getMarkerJson(); void _savePlots(int sd, KsGLWidget *glw, bool cpu); QVector _getPlots(int sd, bool cpu); void _saveCPUPlots(int sd, KsGLWidget *glw); QVector _getCPUPlots(int sd); void _saveTaskPlots(int sd, KsGLWidget *glw); QVector _getTaskPlots(int sd); void _saveComboPlots(KsGLWidget *glw); QVector _getComboPlots(int *nCombos); bool _getMarker(const char* name, size_t *pos); DualMarkerState _getMarkerState(); }; #endif kernel-shark-kernelshark-v2.4.0/src/KsTraceGraph.cpp000066400000000000000000000512621477354127100224320ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsTraceGraph.cpp * @brief KernelShark Trace Graph widget. */ // KernelShark #include "KsUtils.hpp" #include "KsDualMarker.hpp" #include "KsTraceGraph.hpp" #include "KsQuickContextMenu.hpp" /** Create a default (empty) Trace graph widget. */ KsTraceGraph::KsTraceGraph(QWidget *parent) : KsWidgetsLib::KsDataWidget(parent), _pointerBar(this), _navigationBar(this), _zoomInButton("+", this), _quickZoomInButton("++", this), _zoomOutButton("-", this), _quickZoomOutButton("- -", this), _scrollLeftButton("<", this), _scrollRightButton(">", this), _labelP1("Pointer: ", this), _labelP2("", this), _labelI1("", this), _labelI2("", this), _labelI3("", this), _labelI4("", this), _labelI5("", this), _scrollArea(this), _glWindow(&_scrollArea), _mState(nullptr), _data(nullptr), _keyPressed(false) { auto lamMakeNavButton = [&](QPushButton *b) { b->setMaximumWidth(FONT_WIDTH * 5); connect(b, &QPushButton::released, this, &KsTraceGraph::_stopUpdating); _navigationBar.addWidget(b); }; _pointerBar.setMaximumHeight(FONT_HEIGHT * 1.75); _pointerBar.setOrientation(Qt::Horizontal); _navigationBar.setMaximumHeight(FONT_HEIGHT * 1.75); _navigationBar.setMinimumWidth(FONT_WIDTH * 90); _navigationBar.setOrientation(Qt::Horizontal); _pointerBar.addWidget(&_labelP1); _labelP2.setFrameStyle(QFrame::Panel | QFrame::Sunken); _labelP2.setStyleSheet("QLabel {background-color : white; color: black}"); _labelP2.setTextInteractionFlags(Qt::TextSelectableByMouse); _labelP2.setFixedWidth(FONT_WIDTH * 16); _pointerBar.addWidget(&_labelP2); _pointerBar.addSeparator(); _labelI1.setStyleSheet("QLabel {color : blue;}"); _labelI2.setStyleSheet("QLabel {color : green;}"); _labelI3.setStyleSheet("QLabel {color : red;}"); _labelI4.setStyleSheet("QLabel {color : blue;}"); _labelI5.setStyleSheet("QLabel {color : green;}"); _pointerBar.addWidget(&_labelI1); _pointerBar.addSeparator(); _pointerBar.addWidget(&_labelI2); _pointerBar.addSeparator(); _pointerBar.addWidget(&_labelI3); _pointerBar.addSeparator(); _pointerBar.addWidget(&_labelI4); _pointerBar.addSeparator(); _pointerBar.addWidget(&_labelI5); _glWindow.installEventFilter(this); connect(&_glWindow, &KsGLWidget::select, this, &KsTraceGraph::markEntry); connect(&_glWindow, &KsGLWidget::found, this, &KsTraceGraph::_setPointerInfo); connect(&_glWindow, &KsGLWidget::notFound, this, &KsTraceGraph::_resetPointer); connect(&_glWindow, &KsGLWidget::zoomIn, this, &KsTraceGraph::_zoomIn); connect(&_glWindow, &KsGLWidget::zoomOut, this, &KsTraceGraph::_zoomOut); connect(&_glWindow, &KsGLWidget::scrollLeft, this, &KsTraceGraph::_scrollLeft); connect(&_glWindow, &KsGLWidget::scrollRight, this, &KsTraceGraph::_scrollRight); connect(&_glWindow, &KsGLWidget::stopUpdating, this, &KsTraceGraph::_stopUpdating); _glWindow.setContextMenuPolicy(Qt::CustomContextMenu); connect(&_glWindow, &QWidget::customContextMenuRequested, this, &KsTraceGraph::_onCustomContextMenu); _scrollArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); _scrollArea.setWidget(&_glWindow); lamMakeNavButton(&_scrollLeftButton); connect(&_scrollLeftButton, &QPushButton::pressed, this, &KsTraceGraph::_scrollLeft); lamMakeNavButton(&_zoomInButton); connect(&_zoomInButton, &QPushButton::pressed, this, &KsTraceGraph::_zoomIn); lamMakeNavButton(&_zoomOutButton); connect(&_zoomOutButton, &QPushButton::pressed, this, &KsTraceGraph::_zoomOut); lamMakeNavButton(&_scrollRightButton); connect(&_scrollRightButton, &QPushButton::pressed, this, &KsTraceGraph::_scrollRight); _navigationBar.addSeparator(); lamMakeNavButton(&_quickZoomInButton); connect(&_quickZoomInButton, &QPushButton::pressed, this, &KsTraceGraph::_quickZoomIn); lamMakeNavButton(&_quickZoomOutButton); connect(&_quickZoomOutButton, &QPushButton::pressed, this, &KsTraceGraph::_quickZoomOut); _layout.addWidget(&_pointerBar); _layout.addWidget(&_navigationBar); _layout.addWidget(&_scrollArea); this->setLayout(&_layout); updateGeom(); } /** * @brief Load and show trace data. * * @param data: Input location for the KsDataStore object. * KsDataStore::loadDataFile() must be called first. * @param resetPlots: If true, all existing graphs are closed * and a default configuration of graphs is displayed * (all CPU plots). If false, the current set of graphs * is preserved. */ void KsTraceGraph::loadData(KsDataStore *data, bool resetPlots) { _data = data; _glWindow.loadData(data, resetPlots); updateGeom(); } /** Connect the KsGLWidget widget and the State machine of the Dual marker. */ void KsTraceGraph::setMarkerSM(KsDualMarkerSM *m) { _mState = m; _navigationBar.addSeparator(); _mState->placeInToolBar(&_navigationBar); _glWindow.setMarkerSM(m); } /** Reset (empty) the widget. */ void KsTraceGraph::reset() { /* Reset (empty) the OpenGL widget. */ _glWindow.reset(); _labelP2.setText(""); for (auto l1: {&_labelI1, &_labelI2, &_labelI3, &_labelI4, &_labelI5}) l1->setText(""); _selfUpdate(); } void KsTraceGraph::_selfUpdate() { _markerReDraw(); _glWindow.model()->update(); updateGeom(); } void KsTraceGraph::_zoomIn() { KsWidgetsLib::KsDataWork action = KsWidgetsLib::KsDataWork::ZoomIn; startOfWork(action); _updateGraphs(action); endOfWork(action); } void KsTraceGraph::_zoomOut() { KsWidgetsLib::KsDataWork action = KsWidgetsLib::KsDataWork::ZoomOut; startOfWork(action); _updateGraphs(action); endOfWork(action); } void KsTraceGraph::_quickZoomIn() { if (_glWindow.isEmpty()) return; startOfWork(KsWidgetsLib::KsDataWork::QuickZoomIn); /* Bin size will be 100 ns. */ _glWindow.model()->quickZoomIn(100); if (_mState->activeMarker()._isSet && _mState->activeMarker().isVisible()) { /* * Use the position of the active marker as * a focus point of the zoom. */ uint64_t ts = _mState->activeMarker()._ts; _glWindow.model()->jumpTo(ts); _glWindow.render(); } endOfWork(KsWidgetsLib::KsDataWork::QuickZoomIn); } void KsTraceGraph::_quickZoomOut() { if (_glWindow.isEmpty()) return; startOfWork(KsWidgetsLib::KsDataWork::QuickZoomOut); _glWindow.model()->quickZoomOut(); _glWindow.render(); endOfWork(KsWidgetsLib::KsDataWork::QuickZoomOut); } void KsTraceGraph::_scrollLeft() { KsWidgetsLib::KsDataWork action = KsWidgetsLib::KsDataWork::ScrollLeft; startOfWork(action); _updateGraphs(action); endOfWork(action); } void KsTraceGraph::_scrollRight() { KsWidgetsLib::KsDataWork action = KsWidgetsLib::KsDataWork::ScrollRight; startOfWork(action); _updateGraphs(action); endOfWork(action); } void KsTraceGraph::_stopUpdating() { /* * The user is no longer pressing the action button. Reset the * "Key Pressed" flag. This will stop the ongoing user action. */ _keyPressed = false; } QString KsTraceGraph::_t2str(uint64_t sec, uint64_t usec) { QString usecStr; QTextStream ts(&usecStr); ts.setFieldAlignment(QTextStream::AlignRight); ts.setFieldWidth(6); ts.setPadChar('0'); ts << usec; return QString::number(sec) + "." + usecStr; } void KsTraceGraph::_resetPointer(int64_t ts, int sd, int cpu, int pid) { kshark_entry entry; uint64_t sec, usec; entry.cpu = cpu; entry.pid = pid; entry.stream_id = sd; if (ts < 0) ts = 0; kshark_convert_nano(ts, &sec, &usec); _labelP2.setText(_t2str(sec, usec)); if (pid > 0 && cpu >= 0) { struct kshark_context *kshark_ctx(NULL); if (!kshark_instance(&kshark_ctx)) return; QString comm(kshark_get_task(&entry)); comm.append("-"); comm.append(QString("%1").arg(pid)); _labelI1.setText(comm); _labelI2.setText(QString("CPU %1").arg(cpu)); } else { _labelI1.setText(""); _labelI2.setText(""); } for (auto const &l: {&_labelI3, &_labelI4, &_labelI5}) { l->setText(""); } } void KsTraceGraph::_setPointerInfo(size_t i) { kshark_entry *e = _data->rows()[i]; auto lanMakeString = [] (char *buffer) { QString str(buffer); free(buffer); return str; }; QString event(lanMakeString(kshark_get_event_name(e))); QString aux(lanMakeString(kshark_get_aux_info(e))); QString info(lanMakeString(kshark_get_info(e))); QString comm(lanMakeString(kshark_get_task(e))); int labelWidth; uint64_t sec, usec; char *pointer; kshark_convert_nano(e->ts, &sec, &usec); labelWidth = asprintf(&pointer, "%" PRIu64 ".%06" PRIu64 "", sec, usec); if (labelWidth <= 0) return; _labelP2.setText(pointer); free(pointer); comm.append("-"); comm.append(QString("%1").arg(kshark_get_pid(e))); _labelI1.setText(comm); _labelI2.setText(QString("CPU %1").arg(e->cpu)); _labelI3.setText(aux); _labelI4.setText(event); _labelI5.setText(info); QCoreApplication::processEvents(); labelWidth = _pointerBar.geometry().right() - _labelI4.geometry().right(); if (labelWidth > STRING_WIDTH(info) + FONT_WIDTH * 5) return; /* * The Info string is too long and cannot be displayed on the toolbar. * Try to fit the text in the available space. */ KsUtils::setElidedText(&_labelI5, info, Qt::ElideRight, labelWidth); _labelI5.setVisible(true); QCoreApplication::processEvents(); } /** * @brief Use the active marker to select particular entry. * * @param row: The index of the entry to be selected by the marker. */ void KsTraceGraph::markEntry(size_t row) { int yPosVis(-1); _glWindow.model()->jumpTo(_data->rows()[row]->ts); _mState->activeMarker().set(*_data, _glWindow.model()->histo(), row, _data->rows()[row]->stream_id); _mState->updateMarkers(*_data, &_glWindow); /* * If a Combo graph has been found, this Combo graph will be visible. * Else the Task graph will be shown. If no Combo and no Task graph * has been found, make visible the corresponding CPU graph. */ if (_mState->activeMarker()._mark.comboIsVisible()) yPosVis = _mState->activeMarker()._mark.comboY(); else if (_mState->activeMarker()._mark.taskIsVisible()) yPosVis = _mState->activeMarker()._mark.taskY(); else if (_mState->activeMarker()._mark.cpuIsVisible()) yPosVis = _mState->activeMarker()._mark.cpuY(); if (yPosVis > 0) _scrollArea.ensureVisible(0, yPosVis); } void KsTraceGraph::_markerReDraw() { size_t row; if (_mState->markerA()._isSet) { row = _mState->markerA()._pos; _mState->markerA().set(*_data, _glWindow.model()->histo(), row, _data->rows()[row]->stream_id); } if (_mState->markerB()._isSet) { row = _mState->markerB()._pos; _mState->markerB().set(*_data, _glWindow.model()->histo(), row, _data->rows()[row]->stream_id); } } /** * @brief Redreaw all CPU graphs. * * @param sd: Data stream identifier. * @param v: CPU ids to be plotted. */ void KsTraceGraph::cpuReDraw(int sd, QVector v) { startOfWork(KsWidgetsLib::KsDataWork::EditPlotList); if (_glWindow._streamPlots.contains(sd)) _glWindow._streamPlots[sd]._cpuList = v; _selfUpdate(); endOfWork(KsWidgetsLib::KsDataWork::EditPlotList); } /** * @brief Redreaw all Task graphs. * * @param sd: Data stream identifier. * @param v: Process ids of the tasks to be plotted. */ void KsTraceGraph::taskReDraw(int sd, QVector v) { startOfWork(KsWidgetsLib::KsDataWork::EditPlotList); if (_glWindow._streamPlots.contains(sd)) _glWindow._streamPlots[sd]._taskList = v; _selfUpdate(); endOfWork(KsWidgetsLib::KsDataWork::EditPlotList); } /** * @brief Redreaw all virtCombo graphs. * * @param nCombos: Numver of Combo plots. * @param v: Descriptor of the Combo to be plotted. */ void KsTraceGraph::comboReDraw(int nCombos, QVector v) { KsComboPlot combo; startOfWork(KsWidgetsLib::KsDataWork::EditPlotList); _glWindow._comboPlots.clear(); for (int i = 0; i < nCombos; ++i) { combo.resize(v.takeFirst()); for (auto &p: combo) p << v; _glWindow._comboPlots.append(combo); } _selfUpdate(); endOfWork(KsWidgetsLib::KsDataWork::EditPlotList); } /** Add (and plot) a CPU graph to the existing list of CPU graphs. */ void KsTraceGraph::addCPUPlot(int sd, int cpu) { startOfWork(KsWidgetsLib::KsDataWork::EditPlotList); QVector &list = _glWindow._streamPlots[sd]._cpuList; if (list.contains(cpu)) return; list.append(cpu); std::sort(list.begin(), list.end()); _selfUpdate(); endOfWork(KsWidgetsLib::KsDataWork::EditPlotList); } /** Add (and plot) a Task graph to the existing list of Task graphs. */ void KsTraceGraph::addTaskPlot(int sd, int pid) { startOfWork(KsWidgetsLib::KsDataWork::EditPlotList); QVector &list = _glWindow._streamPlots[sd]._taskList; if (list.contains(pid)) return; list.append(pid); std::sort(list.begin(), list.end()); _selfUpdate(); endOfWork(KsWidgetsLib::KsDataWork::EditPlotList); } /** Remove a CPU graph from the existing list of CPU graphs. */ void KsTraceGraph::removeCPUPlot(int sd, int cpu) { startOfWork(KsWidgetsLib::KsDataWork::EditPlotList); if (!_glWindow._streamPlots[sd]._cpuList.contains(cpu)) return; _glWindow._streamPlots[sd]._cpuList.removeAll(cpu); _selfUpdate(); endOfWork(KsWidgetsLib::KsDataWork::EditPlotList); } /** Remove a Task graph from the existing list of Task graphs. */ void KsTraceGraph::removeTaskPlot(int sd, int pid) { startOfWork(KsWidgetsLib::KsDataWork::EditPlotList); if (!_glWindow._streamPlots[sd]._taskList.contains(pid)) return; _glWindow._streamPlots[sd]._taskList.removeAll(pid); _selfUpdate(); endOfWork(KsWidgetsLib::KsDataWork::EditPlotList); } /** Update the content of all graphs. */ void KsTraceGraph::update(KsDataStore *data) { kshark_context *kshark_ctx(nullptr); QVector streamIds; if (!kshark_instance(&kshark_ctx)) return; streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) for (auto &pid: _glWindow._streamPlots[sd]._taskList) { kshark_unregister_data_collection(&kshark_ctx->collections, kshark_match_pid, sd, &pid, 1); } _selfUpdate(); streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) for (auto &pid: _glWindow._streamPlots[sd]._taskList) { kshark_register_data_collection(kshark_ctx, data->rows(), data->size(), kshark_match_pid, sd, &pid, 1, 25); } } /** Update the geometry of the widget. */ void KsTraceGraph::updateGeom() { int saWidth, saHeight, dwWidth, hMin; /* Set the size of the Scroll Area. */ saWidth = width() - _layout.contentsMargins().left() - _layout.contentsMargins().right(); saHeight = height() - _pointerBar.height() - _navigationBar.height() - _layout.spacing() * 2 - _layout.contentsMargins().top() - _layout.contentsMargins().bottom(); _scrollArea.resize(saWidth, saHeight); /* * Calculate the width of the Draw Window, taking into account the size * of the scroll bar. */ dwWidth = _scrollArea.width(); if (_glWindow.height() > _scrollArea.height()) dwWidth -= qApp->style()->pixelMetric(QStyle::PM_ScrollBarExtent); _glWindow.resize(dwWidth, _glWindow.height()); /* Set the minimum height of the Graph widget. */ hMin = _glWindow.height() + _pointerBar.height() + _navigationBar.height() + _layout.contentsMargins().top() + _layout.contentsMargins().bottom(); if (hMin > KS_GRAPH_HEIGHT * 6) hMin = KS_GRAPH_HEIGHT * 6; setMinimumHeight(hMin); /* * Now use the height of the Draw Window to fix the maximum height * of the Graph widget. */ setMaximumHeight(_glWindow.height() + _pointerBar.height() + _navigationBar.height() + _layout.spacing() * 2 + _layout.contentsMargins().top() + _layout.contentsMargins().bottom() + 2); /* Just a little bit of extra space. This will * allow the scroll bar to disappear when the * widget is extended to maximum. */ _glWindow.updateGeom(); } /** * Reimplemented event handler used to update the geometry of the widget on * resize events. */ void KsTraceGraph::resizeEvent([[maybe_unused]] QResizeEvent* event) { updateGeom(); } /** * Reimplemented event handler (overriding a virtual function from QObject) * used to detect the position of the mouse with respect to the Draw window and * according to this position to grab / release the focus of the keyboard. The * function has nothing to do with the filtering of the trace events. */ bool KsTraceGraph::eventFilter(QObject* obj, QEvent* evt) { /* Desable all mouse events for the OpenGL wiget when busy. */ if (obj == &_glWindow && this->isBusy() && (evt->type() == QEvent::MouseButtonDblClick || evt->type() == QEvent::MouseButtonPress || evt->type() == QEvent::MouseButtonRelease || evt->type() == QEvent::MouseMove) ) return true; if (obj == &_glWindow && evt->type() == QEvent::Enter) _glWindow.setFocus(); if (obj == &_glWindow && evt->type() == QEvent::Leave) _glWindow.clearFocus(); return QWidget::eventFilter(obj, evt); } void KsTraceGraph::_updateGraphs(KsWidgetsLib::KsDataWork action) { double k; int bin; if (_glWindow.isEmpty()) return; /* * Set the "Key Pressed" flag. The flag will stay set as long as the user * keeps the corresponding action button pressed. */ _keyPressed = true; /* Initialize the zooming factor with a small value. */ k = .01; while (_keyPressed) { switch (action) { case KsWidgetsLib::KsDataWork::ZoomIn: if (_mState->activeMarker()._isSet && _mState->activeMarker().isVisible()) { /* * Use the position of the active marker as * a focus point of the zoom. */ bin = _mState->activeMarker()._bin; _glWindow.model()->zoomIn(k, bin); } else { /* * The default focus point is the center of the * range interval of the model. */ _glWindow.model()->zoomIn(k); } break; case KsWidgetsLib::KsDataWork::ZoomOut: if (_mState->activeMarker()._isSet && _mState->activeMarker().isVisible()) { /* * Use the position of the active marker as * a focus point of the zoom. */ bin = _mState->activeMarker()._bin; _glWindow.model()->zoomOut(k, bin); } else { /* * The default focus point is the center of the * range interval of the model. */ _glWindow.model()->zoomOut(k); } break; case KsWidgetsLib::KsDataWork::ScrollLeft: _glWindow.model()->shiftBackward(10); break; case KsWidgetsLib::KsDataWork::ScrollRight: _glWindow.model()->shiftForward(10); break; default: return; } /* * As long as the action button is pressed, the zooming factor * will grow smoothly until it reaches a maximum value. This * will have a visible effect of an accelerating zoom. */ if (k < .25) k *= 1.02; _mState->updateMarkers(*_data, &_glWindow); _glWindow.render(); QCoreApplication::processEvents(); } } void KsTraceGraph::_onCustomContextMenu(const QPoint &point) { KsQuickMarkerMenu *menu(nullptr); int sd, cpu, pid; size_t row; bool found; found = _glWindow.find(point, 20, true, &row); if (found) { /* KernelShark entry has been found under the cursor. */ KsQuickContextMenu *entryMenu; menu = entryMenu = new KsQuickContextMenu(_mState, _data, row, this); connect(entryMenu, &KsQuickContextMenu::addTaskPlot, this, &KsTraceGraph::addTaskPlot); connect(entryMenu, &KsQuickContextMenu::addCPUPlot, this, &KsTraceGraph::addCPUPlot); connect(entryMenu, &KsQuickContextMenu::removeTaskPlot, this, &KsTraceGraph::removeTaskPlot); connect(entryMenu, &KsQuickContextMenu::removeCPUPlot, this, &KsTraceGraph::removeCPUPlot); } else { if (!_glWindow.getPlotInfo(point, &sd, &cpu, &pid)) return; if (cpu >= 0) { /* * This is a CPU plot, but we do not have an entry * under the cursor. */ KsRmCPUPlotMenu *rmMenu; menu = rmMenu = new KsRmCPUPlotMenu(_mState, sd, cpu, this); auto lamRmPlot = [&sd, &cpu, this] () { removeCPUPlot(sd, cpu); }; connect(rmMenu, &KsRmPlotContextMenu::removePlot, lamRmPlot); } if (pid >= 0) { /* * This is a Task plot, but we do not have an entry * under the cursor. */ KsRmTaskPlotMenu *rmMenu; menu = rmMenu = new KsRmTaskPlotMenu(_mState, sd, pid, this); auto lamRmPlot = [&sd, &pid, this] () { removeTaskPlot(sd, pid); }; connect(rmMenu, &KsRmPlotContextMenu::removePlot, lamRmPlot); } } if (menu) { connect(menu, &KsQuickMarkerMenu::deselect, this, &KsTraceGraph::deselect); /* * Note that this slot was connected to the * customContextMenuRequested signal of the OpenGL widget. * Because of this the coordinates of the point are given with * respect to the frame of this widget. */ QPoint global = _glWindow.mapToGlobal(point); global.ry() -= menu->sizeHint().height() / 2; /* * Shift the menu so that it is not positioned under the mouse. * This will prevent from an accidental selection of the menu * item under the mouse. */ global.rx() += FONT_WIDTH; menu->exec(global); } } kernel-shark-kernelshark-v2.4.0/src/KsTraceGraph.hpp000066400000000000000000000055231477354127100224360ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsTraceGraph.hpp * @brief KernelShark Trace Graph widget. */ #ifndef _KS_TRACEGRAPH_H #define _KS_TRACEGRAPH_H // KernelShark #include "KsWidgetsLib.hpp" #include "KsGLWidget.hpp" /** * Scroll Area class, needed in order to reimplemented the handler for mouse * wheel events. */ class KsGraphScrollArea : public QScrollArea { public: /** Create a default Scroll Area. */ explicit KsGraphScrollArea(QWidget *parent = nullptr) : QScrollArea(parent) {} /** * Reimplemented handler for mouse wheel events. All mouse wheel * events will be ignored. */ void wheelEvent(QWheelEvent *evt) { if (QApplication::keyboardModifiers() != Qt::ControlModifier) QScrollArea::wheelEvent(evt); } }; /** * The KsTraceViewer class provides a widget for interactive visualization of * trace data shown as time-series. */ class KsTraceGraph : public KsWidgetsLib::KsDataWidget { Q_OBJECT public: explicit KsTraceGraph(QWidget *parent = nullptr); void loadData(KsDataStore *data, bool resetPlots); void setMarkerSM(KsDualMarkerSM *m); void reset(); /** Get the KsGLWidget object. */ KsGLWidget *glPtr() {return &_glWindow;} void markEntry(size_t); void cpuReDraw(int sd, QVector cpus); void taskReDraw(int sd, QVector pids); void comboReDraw(int sd, QVector v); void addCPUPlot(int sd, int cpu); void addTaskPlot(int sd, int pid); void removeCPUPlot(int sd, int cpu); void removeTaskPlot(int sd, int pid); void update(KsDataStore *data); void updateGeom(); void resizeEvent(QResizeEvent* event) override; bool eventFilter(QObject* obj, QEvent* evt) override; signals: /** * This signal is emitted in the case of a right mouse button click or * in the case of a double click over an empty area (no visible * KernelShark entries). */ void deselect(); private: void _zoomIn(); void _zoomOut(); void _quickZoomIn(); void _quickZoomOut(); void _scrollLeft(); void _scrollRight(); void _stopUpdating(); void _resetPointer(int64_t ts, int sd, int cpu, int pid); void _setPointerInfo(size_t); void _selfUpdate(); void _markerReDraw(); void _updateGraphs(KsWidgetsLib::KsDataWork action); void _onCustomContextMenu(const QPoint &point); QString _t2str(uint64_t sec, uint64_t usec); QToolBar _pointerBar, _navigationBar; QPushButton _zoomInButton, _quickZoomInButton; QPushButton _zoomOutButton, _quickZoomOutButton; QPushButton _scrollLeftButton, _scrollRightButton; QLabel _labelP1, _labelP2, // Pointer _labelI1, _labelI2, _labelI3, _labelI4, _labelI5; // Proc. info KsGraphScrollArea _scrollArea; KsGLWidget _glWindow; QVBoxLayout _layout; KsDualMarkerSM *_mState; KsDataStore *_data; bool _keyPressed; }; #endif // _KS_TRACEGRAPH_H kernel-shark-kernelshark-v2.4.0/src/KsTraceViewer.cpp000066400000000000000000000541251477354127100226330ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsTraceViewer.cpp * @brief KernelShark Trace Viewer widget. */ // C++ #include #include #include // KernelShark #include "KsQuickContextMenu.hpp" #include "KsTraceViewer.hpp" #include "KsWidgetsLib.hpp" /** * Reimplemented handler for creating delegate widget. */ QWidget *KsTableItemDelegate::createEditor(QWidget *parent, [[maybe_unused]] const QStyleOptionViewItem &option, [[maybe_unused]] const QModelIndex &index) const { QTextEdit *edit = new QTextEdit(parent); edit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); edit->setReadOnly(true); return edit; } /** * Reimplemented handler setting the data shown by the delegate widget. */ void KsTableItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { QTextEdit *textEditor = qobject_cast(editor); textEditor->setPlainText(_model->getValueStr(index.column(), index.row())); } /** * Reimplemented handler for mouse press events. Right mouse click events will * be ignored. This is done because we want the Right click is being used to * open a Context menu. */ void KsTableView::mousePressEvent(QMouseEvent *e) { if(e->button() == Qt::RightButton) return; QTableView::mousePressEvent(e); } /** * Reimplemented the handler for Auto-scrolling. With this we disable * the Horizontal Auto-scrolling. */ void KsTableView::scrollTo(const QModelIndex &index, ScrollHint hint) { int bottomMargin(2); if (hint == QAbstractItemView::EnsureVisible && index.row() > indexAt(rect().topLeft()).row() && index.row() < indexAt(rect().bottomLeft()).row() - bottomMargin) return; QTableView::scrollTo(index, hint); } /** Create a default (empty) Trace viewer widget. */ KsTraceViewer::KsTraceViewer(QWidget *parent) : KsWidgetsLib::KsDataWidget(parent), _view(this), _model(this), _proxyModel(this), _itemDelegate(&_model, this), _toolbar(this), _labelSearch("Search: Column", this), _labelGrFollows("Graph follows ", this), _searchFSM(this), _graphFollowsCheckBox(this), _graphFollows(true), _mState(nullptr), _data(nullptr) { this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); /* Make a search toolbar. */ _toolbar.setOrientation(Qt::Horizontal); _toolbar.setMaximumHeight(FONT_HEIGHT * 1.75); /* On the toolbar make two Combo boxes for the search settings. */ _toolbar.addWidget(&_labelSearch); _searchFSM._columnComboBox.addItems(_model.header()); connect(&_searchFSM._columnComboBox, &QComboBox::currentIndexChanged, this, &KsTraceViewer::_searchEdit); connect(&_searchFSM._selectComboBox, &QComboBox::currentIndexChanged, this, &KsTraceViewer::_searchEdit); /* On the toolbar, make a Line edit field for search. */ _searchFSM._searchLineEdit.setMaximumWidth(FONT_WIDTH * 20); connect(&_searchFSM._searchLineEdit, &QLineEdit::returnPressed, this, &KsTraceViewer::_search); connect(&_searchFSM._searchLineEdit, &QLineEdit::textEdited, this, &KsTraceViewer::_searchEditText); /* On the toolbar, add Prev & Next buttons. */ connect(&_searchFSM._nextButton, &QPushButton::pressed, this, &KsTraceViewer::_next); connect(&_searchFSM._prevButton, &QPushButton::pressed, this, &KsTraceViewer::_prev); connect(&_searchFSM._searchStopButton, &QPushButton::pressed, this, &KsTraceViewer::_searchStop); connect(&_searchFSM._searchRestartButton, &QPushButton::pressed, this, &KsTraceViewer::_searchContinue); int defaultRowHeight = FONT_HEIGHT * 1.25; auto lamSelectionChanged = [this, defaultRowHeight] (const QItemSelection &selected, const QItemSelection &deselected) { if (deselected.count()) { _view.verticalHeader()->resizeSection(deselected.indexes().first().row(), defaultRowHeight); } if (selected.count()) { _view.resizeRowToContents(selected.indexes().first().row()); } if (_mState->passiveMarker().isVisible()) { QModelIndex index = _model.index(_mState->passiveMarker()._pos, 0); _view.resizeRowToContents(_proxyModel.mapFromSource(index).row()); } }; connect(&_selectionModel, &QItemSelectionModel::selectionChanged, this, lamSelectionChanged); _searchFSM.placeInToolBar(&_toolbar); /* * On the toolbar, make a Check box for connecting the search pannel * to the Graph widget. */ _toolbar.addWidget(&_graphFollowsCheckBox); _toolbar.addWidget(&_labelGrFollows); _graphFollowsCheckBox.setCheckState(Qt::Checked); connect(&_graphFollowsCheckBox, &QCheckBox::stateChanged, this, &KsTraceViewer::_graphFollowsChanged); /* Initialize the trace viewer. */ _view.horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); _view.verticalHeader()->setVisible(false); _view.setEditTriggers(QAbstractItemView::DoubleClicked); _view.setSelectionBehavior(QAbstractItemView::SelectRows); _view.setSelectionMode(QAbstractItemView::SingleSelection); _view.verticalHeader()->setDefaultSectionSize(defaultRowHeight); _view.setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); _view.horizontalHeader()->setFont( QFontDatabase::systemFont(QFontDatabase::GeneralFont)); _view.setItemDelegate(&_itemDelegate); _proxyModel.setSource(&_model); _selectionModel.setModel(&_proxyModel); _view.setModel(&_proxyModel); _view.setSelectionModel(&_selectionModel); connect(&_proxyModel, &QAbstractItemModel::modelReset, this, &KsTraceViewer::_searchReset); _view.setContextMenuPolicy(Qt::CustomContextMenu); connect(&_view, &QWidget::customContextMenuRequested, this, &KsTraceViewer::_onCustomContextMenu); connect(&_view, &QTableView::clicked, this, &KsTraceViewer::_clicked); /* Set the layout. */ _layout.addWidget(&_toolbar); _layout.addWidget(&_view); this->setLayout(&_layout); } /** * @brief Load and show trace data. * * @param data: Input location for the KsDataStore object. * KsDataStore::loadDataFile() must be called first. */ void KsTraceViewer::loadData(KsDataStore *data) { _data = data; _model.reset(); _proxyModel.fill(data); _model.fill(data); this->_resizeToContents(); _searchFSM._columnComboBox.clear(); _searchFSM._columnComboBox.addItems(_model.header()); this->setMinimumHeight(SCREEN_HEIGHT / 5); } /** Connect the QTableView widget and the State machine of the Dual marker. */ void KsTraceViewer::setMarkerSM(KsDualMarkerSM *m) { _mState = m; _model.setMarkerColors(_mState->markerA()._color, _mState->markerB()._color); _viewPalette = _view.palette(); _viewPalette.setColor(QPalette::Highlight, _mState->activeMarker()._color); _view.setPalette(_viewPalette); } /** Reset (empty) the table. */ void KsTraceViewer::reset() { this->setMinimumHeight(FONT_HEIGHT * 10); _model.reset(); _resizeToContents(); } void KsTraceViewer::_searchReset() { _searchFSM.handleInput(sm_input_t::Change); _proxyModel.searchReset(); } /** Get the index of the first (top) visible row. */ size_t KsTraceViewer::getTopRow() const { return _view.indexAt(_view.rect().topLeft()).row(); } /** Position given row at the top of the table. */ void KsTraceViewer::setTopRow(size_t r) { _view.scrollTo(_proxyModel.index(r, 0), QAbstractItemView::PositionAtTop); } /** Update the content of the table. */ void KsTraceViewer::update(KsDataStore *data) { /* The Proxy model has to be updated first! */ _proxyModel.fill(data); _model.update(data); _data = data; if (_mState->activeMarker()._isSet) showRow(_mState->activeMarker()._pos, true); _resizeToContents(); } void KsTraceViewer::_onCustomContextMenu(const QPoint &point) { QModelIndex i = _view.indexAt(point); if (i.isValid()) { /* * Use the index of the proxy model to retrieve the value * of the row number in the source model. */ size_t row = _proxyModel.mapRowFromSource(i.row()); KsQuickContextMenu menu(_mState, _data, row, this); /* * Note that this slot was connected to the * customContextMenuRequested signal of the Table widget. * Because of this the coordinates of the point are given with * respect to the frame of this widget. */ QPoint global = _view.mapToGlobal(point); global.ry() -= menu.sizeHint().height() / 2; /* * Shift the menu so that it is not positioned under the mouse. * This will prevent from an accidental selection of the menu * item under the mouse. */ global.rx() += FONT_WIDTH; connect(&menu, &KsQuickContextMenu::addTaskPlot, this, &KsTraceViewer::addTaskPlot); connect(&menu, &KsQuickMarkerMenu::deselect, this, &KsTraceViewer::deselect); menu.exec(global); } } void KsTraceViewer::_searchEdit([[maybe_unused]] int index) { _searchReset(); // The search has been modified. } void KsTraceViewer::_searchEditText([[maybe_unused]] const QString &text) { _searchReset(); // The search has been modified. } void KsTraceViewer::_graphFollowsChanged(int state) { int row = selectedRow(); _graphFollows = (bool) state; if (_graphFollows && row != KS_NO_ROW_SELECTED) emit select(row); // Send a signal to the Graph widget. } void KsTraceViewer::_search() { if (!_searchDone()) { /* * The search is not done. This means that the search settings * have been modified since the last time we searched. */ _matchList.clear(); _searchItems(); if (!_matchList.empty()) { showRow(*_it, true); if (_graphFollows) emit select(*_it); // Send a signal to the Graph widget. } } else { /* * If the search is done, pressing "Enter" is equivalent * to pressing "Next" button. */ this->_next(); } } void KsTraceViewer::_next() { if (!_searchDone()) { _search(); return; } if (!_matchList.empty()) { // Items have been found. int row = selectedRow(); /* * The iterator can only be at the selected row or if the * selected row is not a match at the first matching row after * the selected one. */ if (*_it == row) { ++_it; // Move the iterator. if (_it == _matchList.end()) { /* * This is the last item of the list. * Go back to the beginning. */ _it = _matchList.begin(); } } // Select the row of the item. showRow(*_it, true); if (_graphFollows) emit select(*_it); // Send a signal to the Graph widget. } _updateSearchCount(); } void KsTraceViewer::_prev() { if (!_searchDone()) { _search(); return; } if (!_matchList.empty()) { // Items have been found. if (_it == _matchList.begin()) { // This is the first item of the list. Go to the last item. _it = _matchList.end() - 1; } else { --_it; // Move the iterator. } // Select the row of the item. showRow(*_it, true); if (_graphFollows) emit select(*_it); // Send a signal to the Graph widget. } _updateSearchCount(); } void KsTraceViewer::_updateSearchCount() { int index, total; QString countText; if (_matchList.isEmpty()) return; index = _it - _matchList.begin(); total =_matchList.count(); countText = QString(" %1 / %2").arg(index + 1).arg(total); _searchFSM._searchCountLabel.setText(countText); } void KsTraceViewer::_searchStop() { _proxyModel._searchStop = true; _searchFSM.handleInput(sm_input_t::Stop); } void KsTraceViewer::_searchContinue() { _proxyModel._searchStop = false; _searchItems(); } void KsTraceViewer::_clicked(const QModelIndex& i) { /* * Use the index of the proxy model to retrieve the value * of the row number in the base model. */ size_t row = _proxyModel.mapRowFromSource(i.row()); if (_searchDone() && _matchList.count()) { _setSearchIterator(row); _updateSearchCount(); } if (_graphFollows) emit select(row); // Send a signal to the Graph widget. } /** Make a given row of the table visible. */ void KsTraceViewer::showRow(size_t r, bool mark) { /* * Use the index in the source model to retrieve the value of the row number * in the proxy model. */ QModelIndex index = _proxyModel.mapFromSource(_model.index(r, 0)); if (mark) { // The row will be selected (colored). /* Get the first and the last visible rows of the table. */ int visiTot = _view.indexAt(_view.rect().topLeft()).row(); int visiBottom = _view.indexAt(_view.rect().bottomLeft()).row() - 2; /* Scroll only if the row to be shown in not vizible. */ if (index.row() < visiTot || index.row() > visiBottom) _view.scrollTo(index, QAbstractItemView::PositionAtCenter); _view.selectRow(index.row()); } else { /* * Just make sure that the row is visible. It will show up at * the top of the visible part of the table. */ _view.scrollTo(index, QAbstractItemView::PositionAtTop); } } /** Deselects the selected items (row) if any. */ void KsTraceViewer::clearSelection() { _view.clearSelection(); } /** Switch the Dual marker. */ void KsTraceViewer::markSwitch() { ssize_t row; /* The state of the Dual marker has changed. Get the new active marker. */ DualMarkerState actState = _mState->getState(); DualMarkerState pasState = !actState; /* First deal with the passive marker. */ KsGraphMark &pasMark = _mState->getMarker(pasState); if (pasMark._isSet) { /* * The passive marker is set. Use the model to color the row of * the passive marker. */ _model.selectRow(pasState, pasMark._pos); } else { /* * The passive marker is not set. * Make sure that the model colors nothing. */ _model.selectRow(pasState, KS_NO_ROW_SELECTED); } /* * Now deal with the active marker. This has to be done after dealing * with the model, because changing the model clears the selection. */ KsGraphMark &actMark = _mState->getMarker(actState); if (actMark._isSet) { /* * The active marker is set. Use QTableView to select its row. * The index in the source model is used to retrieve the value * of the row number in the proxy model. */ row = actMark._pos; QModelIndex index = _proxyModel.mapFromSource(_model.index(row, 0)); if (index.isValid()) { /* * The row of the active marker will be colored according to * the assigned property of the current state of the Dual * marker. Auto-scrolling is temporarily disabled because we * do not want to scroll to the position of the marker yet. */ _view.setAutoScroll(false); _view.selectRow(index.row()); _view.setAutoScroll(true); } else { _view.clearSelection(); } } else { _view.clearSelection(); } _viewPalette.setColor(QPalette::Highlight, actMark._color); _view.setPalette(_viewPalette); row = selectedRow(); if (row >= 0) { _setSearchIterator(row); _updateSearchCount(); } } /** * Reimplemented event handler used to update the geometry of the widget on * resize events. */ void KsTraceViewer::resizeEvent([[maybe_unused]] QResizeEvent* event) { int nColumns = _model.header().count(); int tableSize(0), viewSize, freeSpace; _resizeToContents(); for (int c = 0; c < nColumns; ++c) { tableSize += _view.columnWidth(c); } viewSize = _view.width() - qApp->style()->pixelMetric(QStyle::PM_ScrollBarExtent); if ((freeSpace = viewSize - tableSize) > 0) { _view.setColumnWidth(nColumns - 1, _view.columnWidth(nColumns - 1) + freeSpace - 2); /* Just a little bit less space. * This will allow the scroll bar * to disappear when the widget * is extended to maximum. */ } } /** * Reimplemented event handler used to move the active marker. */ void KsTraceViewer::keyReleaseEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Down) { int row = selectedRow(); if (row >= 0) emit select(row); // Send a signal to the Graph widget. return; } QWidget::keyReleaseEvent(event); } void KsTraceViewer::_resizeToContents() { int markRow = selectedRow(); _view.setVisible(false); _view.resizeColumnsToContents(); _view.setVisible(true); /* * It looks like a Qt bug, but sometimes when no row is selected in * the table, the automatic resize of the widget (the lines above) has * the parasitic effect to select the first row of the table. */ if (markRow == KS_NO_ROW_SELECTED) _view.clearSelection(); } //! @cond Doxygen_Suppress #define KS_SEARCH_SHOW_PROGRESS_MIN 100000 //! @endcond size_t KsTraceViewer::_searchItems() { int column = _searchFSM._columnComboBox.currentIndex(); QString searchText = _searchFSM._searchLineEdit.text(); int count, dataRow, columnIndex = column; if (_model.singleStream()) { /* * If only one Data stream (file) is loaded, the first column * (TRACE_VIEW_COL_STREAM) is not shown. The column index has * to be corrected. */ ++columnIndex; } if (searchText.isEmpty()) { /* * No text is provided by the user. Most probably this * is an accidental key press. */ return 0; } if (_proxyModel.rowCount({}) < KS_SEARCH_SHOW_PROGRESS_MIN) { /* * This is a small data-set. Do a single-threaded search * without showing the progress. We will bypass the state * switching, hence the search condition has to be updated * by hand. */ _searchFSM.updateCondition(); _proxyModel.search(column, searchText, _searchFSM.condition(), &_matchList, nullptr, nullptr); } else { _searchFSM.handleInput(sm_input_t::Start); if (columnIndex == KsViewModel::TRACE_VIEW_COL_INFO || columnIndex == KsViewModel::TRACE_VIEW_COL_AUX) _searchItemsST(); else _searchItemsMT(); } count = _matchList.count(); _searchFSM.handleInput(sm_input_t::Finish); if (count == 0) // No items have been found. Do nothing. return 0; dataRow = selectedRow(); if (dataRow >= 0) { _view.clearSelection(); _setSearchIterator(dataRow); showRow(*_it, true); if (_graphFollows) emit select(*_it); // Send a signal to the Graph widget. } else { /* Move the iterator to the beginning of the match list. */ _it = _matchList.begin(); } _updateSearchCount(); return count; } void KsTraceViewer::_setSearchIterator(int row) { _it = _matchList.begin(); if (_matchList.isEmpty()) return; /* * Move the iterator to the first element of the match list * after the selected one. */ while (*_it < row) { ++_it; // Move the iterator. if (_it == _matchList.end()) { /* * This is the last item of the list. Go back * to the beginning. */ _it = _matchList.begin(); break; } } } void KsTraceViewer::_searchItemsMT() { int nThreads = std::thread::hardware_concurrency(); int startFrom, nRows(_proxyModel.rowCount({})); std::vector> ranges(nThreads); std::vector>> maps; std::mutex lrs_mtx; auto lamLRSUpdate = [&] (int lastRowSearched) { std::lock_guard lock(lrs_mtx); if (_searchFSM._lastRowSearched > lastRowSearched || _searchFSM._lastRowSearched < 0) { /* * This thread has been slower and processed * less data. Take the place where it stopped * as a starting point of the next search. */ _searchFSM._lastRowSearched = lastRowSearched; } }; auto lamSearchMap = [&] (const int first, bool notify) { int lastRowSearched; QList list; list = _proxyModel.searchThread(_searchFSM._columnComboBox.currentIndex(), _searchFSM._searchLineEdit.text(), _searchFSM.condition(), nThreads, first, nRows - 1, &lastRowSearched, notify); lamLRSUpdate(lastRowSearched); return list; }; using merge_pair_t = std::pair; using merge_container_t = std::vector; auto lamComp = [] (const merge_pair_t& itemA, const merge_pair_t& itemB) { return itemA.second > itemB.second; }; using merge_queue_t = std::priority_queue; auto lamSearchMerge = [&] (QList &resultList, QVector< QList >&mapList) { merge_queue_t queue(lamComp); int id, stop(-1); auto pop = [&] () { if (queue.size() == 0) return stop; auto item = queue.top(); queue.pop(); if (!mapList[item.first].empty()) { /* * Replace the popped item with the next * matching item fron the same search thread. */ queue.push(std::make_pair(item.first, mapList[item.first].front())); mapList[item.first].pop_front(); } if (_searchFSM.getState() == search_state_t::Paused_s && item.second > _searchFSM._lastRowSearched) { /* * The search has been paused and we already * passed the last row searched by the slowest * search thread. Stop here and ignore all * following matches found by faster threads. */ return stop; } return item.second; }; for (int i = 0; i < mapList.size(); ++i) if (mapList[i].count()) { queue.push(std::make_pair(i, mapList[i].front())); mapList[i].pop_front(); } id = pop(); while (id >= 0) { resultList.append(id); id = pop(); } }; startFrom = _searchFSM._lastRowSearched + 1; _searchFSM._lastRowSearched = -1; /* Start the thread that will update the progress bar. */ maps.push_back(std::async(lamSearchMap, startFrom, true)); // notify = true /* Start all other threads. */ for (int r = 1; r < nThreads; ++r) maps.push_back(std::async(lamSearchMap, startFrom + r, false)); // notify = false while (_searchFSM.getState() == search_state_t::InProgress_s && _proxyModel.searchProgress() < KS_PROGRESS_BAR_MAX - nThreads - 1) { std::unique_lock lk(_proxyModel._mutex); _proxyModel._pbCond.wait(lk); _searchFSM.setProgress(_proxyModel.searchProgress()); QApplication::processEvents(); } QVector> res; for (auto &m: maps) res.append(m.get()); lamSearchMerge(_matchList, res); } /** * @brief Color (select) the given row in the table, by using the color of the * Passive marker. * * @param row: The row index. If the Passive marker is selected and the input * value is negative, the Passive marker will be deselected. */ void KsTraceViewer::passiveMarkerSelectRow(int row) { DualMarkerState state = _mState->getState(); _view.setVisible(false); _model.selectRow(!state, row); _view.setVisible(true); } /** * Get the currently selected row. If no row is selected the function * returns KS_NO_ROW_SELECTED (-1). */ int KsTraceViewer::selectedRow() { QItemSelectionModel *sm = _view.selectionModel(); int dataRow = KS_NO_ROW_SELECTED; if (sm->hasSelection()) { /* Only one row at the time can be selected. */ QModelIndex i = sm->selectedRows()[0]; dataRow = _proxyModel.mapRowFromSource(i.row()); } return dataRow; } kernel-shark-kernelshark-v2.4.0/src/KsTraceViewer.hpp000066400000000000000000000072431477354127100226370ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsTraceViewer.hpp * @brief KernelShark Trace Viewer widget. */ #ifndef _KS_TRACEVIEW_H #define _KS_TRACEVIEW_H // Qt #include // KernelShark #include "KsUtils.hpp" #include "KsModels.hpp" #include "KsSearchFSM.hpp" #include "KsDualMarker.hpp" #include "KsWidgetsLib.hpp" /** * Class used to customize the display of the data items from the model. */ class KsTableItemDelegate : public QItemDelegate { public: /** Create KsTableItemDelegate. */ KsTableItemDelegate(KsViewModel *model, QWidget *parent = nullptr) : QItemDelegate(parent), _model(model) {}; private: QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; void setEditorData(QWidget *editor, const QModelIndex &index) const override; KsViewModel *_model; }; /** * Table View class, needed in order to reimplemented the handler for mouse * press events. */ class KsTableView : public QTableView { Q_OBJECT public: /** Create KsTableView. */ explicit KsTableView(QWidget *parent = nullptr) : QTableView(parent) {}; void mousePressEvent(QMouseEvent *event) override; void scrollTo(const QModelIndex &index, ScrollHint hint) override; }; /** * The KsTraceViewer class provides a widget for browsing in the trace data * shown in a text form. */ class KsTraceViewer : public KsWidgetsLib::KsDataWidget { Q_OBJECT public: explicit KsTraceViewer(QWidget *parent = nullptr); void loadData(KsDataStore *data); void setMarkerSM(KsDualMarkerSM *m); void reset(); size_t getTopRow() const; void setTopRow(size_t r); void markSwitch(); void showRow(size_t r, bool mark); void clearSelection(); void passiveMarkerSelectRow(int row); int selectedRow(); void update(KsDataStore *data); /** Update the color scheme used by the model. */ void loadColors() { _model.loadColors(); } protected: void resizeEvent(QResizeEvent* event) override; void keyReleaseEvent(QKeyEvent *event) override; signals: /** Signal emitted when new row is selected. */ void select(size_t); /** * This signal is used to re-emitted the addTaskPlot signal of the * KsQuickContextMenu. */ void addTaskPlot(int sd, int pid); /** * This signal is used to re-emitted the deselect signal of the * KsQuickMarkerMenu. */ void deselect(); private: QVBoxLayout _layout; KsTableView _view; QPalette _viewPalette; KsViewModel _model; KsFilterProxyModel _proxyModel; QItemSelectionModel _selectionModel; KsTableItemDelegate _itemDelegate; QToolBar _toolbar; QLabel _labelSearch, _labelGrFollows; KsSearchFSM _searchFSM; QCheckBox _graphFollowsCheckBox; bool _graphFollows; QList _matchList; QList::iterator _it; KsDualMarkerSM *_mState; KsDataStore *_data; enum Condition { Containes = 0, Match = 1, NotHave = 2 }; void _searchReset(); void _resizeToContents(); size_t _searchItems(); void _searchItemsST() {_proxyModel.search(&_searchFSM, &_matchList);} void _searchItemsMT(); void _searchEditText(const QString &); void _graphFollowsChanged(int); void _lockSearchPanel(bool lock); void _search(); void _next(); void _prev(); void _updateSearchCount(); void _searchStop(); void _searchContinue(); void _clicked(const QModelIndex& i); void _onCustomContextMenu(const QPoint &); void _setSearchIterator(int row); bool _searchDone() { return _searchFSM.getState() == search_state_t::Done_s || _searchFSM.getState() == search_state_t::Paused_s; } private slots: void _searchEdit(int); }; #endif // _KS_TRACEVIEW_H kernel-shark-kernelshark-v2.4.0/src/KsUtils.cpp000066400000000000000000001011251477354127100215040ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsUtils.cpp * @brief KernelShark Utils. */ // KernelShark #include "libkshark-plugin.h" #include "libkshark-tepdata.h" #include "KsUtils.hpp" #include "KsWidgetsLib.hpp" namespace KsUtils { /** * @brief Get a sorted vector of CPU Ids associated with a given Data stream. * * @param sd: Data stream identifier. * * @returns Vector of CPU Ids on success or an empty vector on failure. */ QVector getCPUList(int sd) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; if (!kshark_instance(&kshark_ctx)) return {}; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return {}; QVector allCPUs = QVector(stream->n_cpus); std::iota(allCPUs.begin(), allCPUs.end(), 0); return allCPUs; } /** * @brief Get a sorteg vector of Task's PIDs associated with a given Data * stream. * * @param sd: Data stream identifier. * * @returns Vector of PIDs on success or an empty vector on failure. */ QVector getPidList(int sd) { kshark_context *kshark_ctx(nullptr); int nTasks, *ids; if (!kshark_instance(&kshark_ctx)) return {}; nTasks = kshark_get_task_pids(kshark_ctx, sd, &ids); QVector pids(nTasks); for (int i = 0; i < nTasks; ++i) pids[i] = ids[i]; free(ids); return pids; } /** * @brief Get a vector of all Event Ids associated with a given Data stream. * * @param sd: Data stream identifier. * * @returns Vector of Event Ids on success or an empty vector on failure. */ QVector getEventIdList(int sd) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; int *ids; if (!kshark_instance(&kshark_ctx)) return {}; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return {}; ids = kshark_get_all_event_ids(stream); if (!ids) return {}; QVector evts(stream->n_events); for (int i = 0; i < stream->n_events; ++i) evts[i] = ids[i]; free(ids); return evts; } /** * @brief Retrieve the unique Id of the event. * * @param sd: Data stream identifier. * @param eventName: The name of the event. * * @returns Event Id on success or a negative errno code on failure. */ int getEventId(int sd, const QString &eventName) { const std::string buff = eventName.toStdString(); kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; if (!kshark_instance(&kshark_ctx)) return -EFAULT; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return -ENODEV; return kshark_find_event_id(stream, buff.c_str()); } static kshark_entry probeEntry(int sd, int eventId) { kshark_entry e; e.stream_id = sd; e.event_id = eventId; e.visible = 0xff; return e; } /** * @brief Retrieve the name of the event. * * @param sd: Data stream identifier. * @param eventId: The unique Id of the event. * * @returns Event name on success or "Unknown" on failure. */ QString getEventName(int sd, int eventId) { kshark_entry entry = probeEntry(sd, eventId); QString ret("Unknown"); char *event; event = kshark_get_event_name(&entry); if (event) { ret = QString(event); free(event); } return QString(ret); } /** * @brief Get the namse of all data fields associated with a given trace event. * * @param sd: Data stream identifier. * @param eventId: The unique Id of the event. * * @returns List of fieldsnames on success or an empty list on failure. */ QStringList getEventFieldsList(int sd, int eventId) { kshark_entry entry = probeEntry(sd, eventId); QStringList fieldList; char **eventFields; int nFields; nFields = kshark_get_all_event_field_names(&entry, &eventFields); if (nFields <= 0) return {}; for (int i = 0; i < nFields; ++i) { fieldList << eventFields[i]; free(eventFields[i]); } free(eventFields); return fieldList; } /** * @brief Retrieve the type of a given data field associatedwith a given trace * event. * * @param sd: Data stream identifier. * @param eventId: The unique Id of the event. * @param fieldName: The name of the data field. * * @returns Field format identifier. */ kshark_event_field_format getEventFieldType(int sd, int eventId, const QString &fieldName) { const std::string buff = fieldName.toStdString(); kshark_entry entry = probeEntry(sd, eventId); return kshark_get_event_field_type(&entry, buff.c_str()); } /** * @brief Get all Data stream Ids. * * @param kshark_ctx: Input location for context pointer. * * @returns Vector of Data stream Ids. */ QVector getStreamIdList(kshark_context *kshark_ctx) { int *ids = kshark_all_streams(kshark_ctx); QVector streamIds(kshark_ctx->n_streams); for (int i = 0; i < kshark_ctx->n_streams; ++i) streamIds[i] = ids[i]; free(ids); return streamIds; } /** * @brief Get a sorted vector of Id values of a filter. * * @param filter: Input location for the filter object. */ QVector getFilterIds(kshark_hash_id *filter) { kshark_context *kshark_ctx(nullptr); int *ids, n = filter->count; if (!kshark_instance(&kshark_ctx)) return {}; ids = kshark_hash_ids(filter); QVector filterIds(n); for (int i = 0; i < n; ++i) filterIds[i] = ids[i]; free(ids); return filterIds; } /** * Set the bit of the filter mask of the kshark session context responsible * for the visibility of the events in the Table View. */ void listFilterSync(bool state) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; if (state) { kshark_ctx->filter_mask |= KS_TEXT_VIEW_FILTER_MASK; } else { kshark_ctx->filter_mask &= ~KS_TEXT_VIEW_FILTER_MASK; } } /** * Set the bit of the filter mask of the kshark session context responsible * for the visibility of the events in the Graph View. */ void graphFilterSync(bool state) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; if (state) { kshark_ctx->filter_mask |= KS_GRAPH_VIEW_FILTER_MASK; kshark_ctx->filter_mask |= KS_EVENT_VIEW_FILTER_MASK; } else { kshark_ctx->filter_mask &= ~KS_GRAPH_VIEW_FILTER_MASK; kshark_ctx->filter_mask &= ~KS_EVENT_VIEW_FILTER_MASK; } } /** * @brief Add a checkbox to a menu. * * @param menu: Input location for the menu object, to which the checkbox will be added. * @param name: The name of the checkbox. * * @returns The checkbox object; */ QCheckBox *addCheckBoxToMenu(QMenu *menu, QString name) { QWidget *containerWidget = new QWidget(menu); containerWidget->setLayout(new QHBoxLayout()); containerWidget->layout()->setContentsMargins(FONT_WIDTH, FONT_HEIGHT/5, FONT_WIDTH, FONT_HEIGHT/5); QCheckBox *checkBox = new QCheckBox(name, menu); containerWidget->layout()->addWidget(checkBox); QWidgetAction *action = new QWidgetAction(menu); action->setDefaultWidget(containerWidget); menu->addAction(action); return checkBox; } /** * @brief Simple CPU matching function to be user for data collections. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param sd: Data stream identifier. * @param cpu: Matching condition value. * * @returns True if the CPU of the entry matches the value of "cpu" and * the entry is visibility in Graph. Otherwise false. */ bool matchCPUVisible([[maybe_unused]] struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *cpu) { return (e->cpu == *cpu && e->stream_id == sd && (e->visible & KS_GRAPH_VIEW_FILTER_MASK)); } /** * @brief Get an elided version of the string that will fit within a label. * * @param label: Pointer to the label object. * @param text: The text to be elided. * @param mode: Parameter specifies whether the text is elided on the left, * in the middle, or on the right. * @param labelWidth: The desired width of the label. */ void setElidedText(QLabel* label, QString text, enum Qt::TextElideMode mode, int labelWidth) { QFontMetrics metrix(label->font()); QString elidedText; int textWidth; textWidth = labelWidth - FONT_WIDTH * 3; elidedText = metrix.elidedText(text, Qt::ElideRight, textWidth); while(labelWidth < STRING_WIDTH(elidedText) + FONT_WIDTH * 5) { textWidth -= FONT_WIDTH * 3; elidedText = metrix.elidedText(text, mode, textWidth); } label->setText(elidedText); } /** * @brief Check if the application runs from its installation location. */ bool isInstalled() { QString appPath = QCoreApplication::applicationDirPath(); QString installPath(_INSTALL_PREFIX); installPath += "/bin"; installPath = QDir::cleanPath(installPath); return appPath == installPath; } static QString getFileDialog(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath, bool forSave) { QString fileName; if (lastFilePath.isEmpty()) { lastFilePath = isInstalled() ? QDir::homePath() : QDir::currentPath(); } if (forSave) { fileName = QFileDialog::getSaveFileName(parent, windowName, lastFilePath, filter); } else { fileName = QFileDialog::getOpenFileName(parent, windowName, lastFilePath, filter); } if (!fileName.isEmpty()) lastFilePath = QFileInfo(fileName).path(); return fileName; } static QStringList getFilesDialog(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath) { QStringList fileNames; if (lastFilePath.isEmpty()) { lastFilePath = isInstalled() ? QDir::homePath() : QDir::currentPath(); } fileNames = QFileDialog::getOpenFileNames(parent, windowName, lastFilePath, filter); if (!fileNames.isEmpty()) lastFilePath = QFileInfo(fileNames[0]).path(); return fileNames; } /** * @brief Open a standard Qt getFileName dialog and return the name of the * selected file. Only one file can be selected. */ QString getFile(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath) { return getFileDialog(parent, windowName, filter, lastFilePath, false); } /** * @brief Open a standard Qt getFileName dialog and return the names of the * selected files. Multiple files can be selected. */ QStringList getFiles(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath) { return getFilesDialog(parent, windowName, filter, lastFilePath); } /** * @brief Open a standard Qt getFileName dialog and return the name of the * selected file. Only one file can be selected. */ QString getSaveFile(QWidget *parent, const QString &windowName, const QString &filter, const QString &extension, QString &lastFilePath) { QString fileName = getFileDialog(parent, windowName, filter, lastFilePath, true); if (!fileName.isEmpty() && !fileName.endsWith(extension)) { fileName += extension; if (QFileInfo::exists(fileName)) { if (!KsWidgetsLib::fileExistsDialog(fileName)) fileName.clear(); } } return fileName; } /** * @brief Separate the command line arguments inside the string taking into * account possible shell quoting and new lines. */ QStringList splitArguments(QString cmd) { auto opt = KS_SPLIT_SkipEmptyParts; int i, progress = 0, size; QStringList argv; QChar quote{'\0'}; /* Remove all new lines. */ cmd.replace("\\\n", " "); size = cmd.size(); auto lamMid = [&] () {return cmd.mid(progress, i - progress);}; for (i = 0; i < size; ++i) { if (cmd[i] == '\\') { cmd.remove(i, 1); size --; continue; } if (cmd[i] == '\'' || cmd[i] == '"') { if (quote.isNull()) { argv << lamMid().split(" ", opt); quote = cmd[i++]; progress = i; } else if (quote == cmd[i]) { argv << lamMid(); quote = {'\0'}; progress = ++i; } } } argv << cmd.right(size - progress).split(" ", opt); return argv; } /** * @brief Parse a string containing Ids. The string can be of the form * "1,4-7,9". */ QVector parseIdList(QString v_str) { QStringList list = v_str.split(",", KS_SPLIT_SkipEmptyParts); QVector v; for (const auto &item: list) { int i = item.indexOf('-'); if (i > 0) { /* This item is an interval. */ int to = item.sliced(i + 1).toInt(); int from = item.first(i).toInt(); int s = v.size(); v.resize(s + to - from + 1); std::iota(v.begin() + s, v.end(), from); } else { v.append(item.toInt()); } } return v; } /** * @brief Convert a string containing task names into a list of PID numbers. */ QMap> parseTaskList(QString v_str) { QStringList taskList = v_str.split(",", KS_SPLIT_SkipEmptyParts); QVector streamIds, allPids; kshark_context *kshark_ctx(nullptr); QMap> ret; QString name; if (!kshark_instance(&kshark_ctx)) return {}; streamIds = getStreamIdList(kshark_ctx); for (auto const sd: streamIds) { allPids = getPidList(sd); for (auto const pid: allPids) { name = kshark_comm_from_pid(sd, pid); if (name.isEmpty()) continue; for (auto const &task: taskList) { if(name == task) ret[sd].append(pid); } } } return ret; } /** * @brief Split the ststem name from the actual name of the event itself. * * @param sd: Data stream identifier. * @param eventId: Identifier of the Event. */ QStringList getTepEvtName(int sd, int eventId) { QString name(kshark_event_from_id(sd, eventId)); return name.split('/'); } /** * @brief Get a string to be used as a standard name of a task graph. * * @param sd: Graph's Data stream identifier. * @param pid: Graph's progress Id. */ QString taskPlotName(int sd, int pid) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; QString name; if (!kshark_instance(&kshark_ctx)) return {}; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return {}; name = kshark_comm_from_pid(sd, pid); name += "-"; name += QString("%1").arg(pid); return name; } /** * @brief Get a description of the stream showing its data file and buffer * name. * * @param stream: Input location for a Trace data stream pointer. */ QString streamDescription(kshark_data_stream *stream) { QString descr(stream->file); QString buffName(stream->name); if (!buffName.isEmpty() && !kshark_tep_is_top_stream(stream)) { descr += ":"; descr += stream->name; } return descr; } }; // KsUtils /** A stream operator for converting QColor into KsPlot::Color. */ KsPlot::Color& operator <<(KsPlot::Color &thisColor, const QColor &c) { thisColor.set(c.red(), c.green(), c.blue()); return thisColor; } /** A stream operator for converting KsPlot::Color into QColor. */ QColor& operator <<(QColor &thisColor, const KsPlot::Color &c) { thisColor.setRgb(c.r(), c.g(), c.b()); return thisColor; } /** Create a default (empty) KsDataStore. */ KsDataStore::KsDataStore(QWidget *parent) : QObject(parent), _rows(nullptr), _dataSize(0) {} /** Destroy the KsDataStore object. */ KsDataStore::~KsDataStore() {} int KsDataStore::_openDataFile(kshark_context *kshark_ctx, const QString &file) { int sd = kshark_open(kshark_ctx, file.toStdString().c_str()); if (sd < 0) { qCritical() << "ERROR:" << sd << "while opening file " << file; return sd; } if (kshark_is_tep(kshark_ctx->stream[sd])) { kshark_tep_init_all_buffers(kshark_ctx, sd); kshark_tep_handle_plugins(kshark_ctx, sd); } return sd; } void KsDataStore::_addPluginsToStream(kshark_context *kshark_ctx, int sd, QVector plugins) { kshark_data_stream *stream; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; for (auto const &p: plugins) { struct kshark_dpi_list *plugin; plugin = kshark_register_plugin_to_stream(stream, p, true); kshark_handle_dpi(stream, plugin, KSHARK_PLUGIN_INIT); } } /** Load trace data for file. */ int KsDataStore::loadDataFile(const QString &file, QVector plugins) { kshark_context *kshark_ctx(nullptr); int i, sd, n_streams; if (!kshark_instance(&kshark_ctx)) return -EFAULT; clear(); sd = _openDataFile(kshark_ctx, file); if (sd != 0) return sd; /* * The file may contain multiple buffers so we can have multiple * streams loaded. */ n_streams = kshark_ctx->n_streams; for (i = 0; i < n_streams; ++i) _addPluginsToStream(kshark_ctx, i, plugins); _dataSize = kshark_load_all_entries(kshark_ctx, &_rows); if (_dataSize <= 0) { kshark_close_all(kshark_ctx); return _dataSize; } registerCPUCollections(); return sd; } /** * @brief Append a trace data file to the data-set that is already loaded. * The clock of the new data will be calibrated in order to be * compatible with the clock of the prior data. * * @param file: Trace data file, to be append to the already loaded data. * @param offset: The offset in time of the Data stream to be appended. */ int KsDataStore::appendDataFile(const QString &file, int64_t offset) { kshark_context *kshark_ctx(nullptr); struct kshark_entry **mergedRows; ssize_t nLoaded = _dataSize; int i, sd; if (!kshark_instance(&kshark_ctx)) return -EFAULT; unregisterCPUCollections(); sd = _openDataFile(kshark_ctx, file); if (sd < 0) return sd; for (i = sd; i < kshark_ctx->n_streams; ++i) { kshark_ctx->stream[sd]->calib = kshark_offset_calib; kshark_ctx->stream[sd]->calib_array = (int64_t *) calloc(1, sizeof(int64_t)); kshark_ctx->stream[sd]->calib_array[0] = offset; kshark_ctx->stream[sd]->calib_array_size = 1; } _dataSize = kshark_append_all_entries(kshark_ctx, _rows, nLoaded, sd, &mergedRows); if (_dataSize <= 0 || _dataSize == nLoaded) { QErrorMessage *em = new QErrorMessage(); em->showMessage(QString("File %1 contains no data.").arg(file)); em->exec(); for (i = sd; i < kshark_ctx->n_streams; ++i) kshark_close(kshark_ctx, i); return _dataSize; } _rows = mergedRows; registerCPUCollections(); emit updateWidgets(this); return sd; } void KsDataStore::_freeData() { if (_dataSize > 0) { for (ssize_t r = 0; r < _dataSize; ++r) free(_rows[r]); free(_rows); } _rows = nullptr; _dataSize = 0; } /** Reload the trace data. */ void KsDataStore::reload() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; _freeData(); if (kshark_ctx->n_streams == 0) return; unregisterCPUCollections(); _dataSize = kshark_load_all_entries(kshark_ctx, &_rows); registerCPUCollections(); emit updateWidgets(this); } /** Free the loaded trace data and close the file. */ void KsDataStore::clear() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; _freeData(); unregisterCPUCollections(); kshark_close_all(kshark_ctx); } /** Update the visibility of the entries (filter). */ void KsDataStore::update() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; unregisterCPUCollections(); kshark_filter_all_entries(kshark_ctx, _rows, _dataSize); registerCPUCollections(); emit updateWidgets(this); } /** Register a collection of visible entries for each CPU. */ void KsDataStore::registerCPUCollections() { kshark_context *kshark_ctx(nullptr); int *streamIds, nCPUs, sd; if (!kshark_instance(&kshark_ctx)) return; streamIds = kshark_all_streams(kshark_ctx); for (int i = 0; i < kshark_ctx->n_streams; ++i) { sd = streamIds[i]; nCPUs = kshark_ctx->stream[sd]->n_cpus; for (int cpu = 0; cpu < nCPUs; ++cpu) { kshark_register_data_collection(kshark_ctx, _rows, _dataSize, KsUtils::matchCPUVisible, sd, &cpu, 1, 0); } } free(streamIds); } /** Unregister all CPU collections. */ void KsDataStore::unregisterCPUCollections() { kshark_context *kshark_ctx(nullptr); int *streamIds, nCPUs, sd; if (!kshark_instance(&kshark_ctx)) return; streamIds = kshark_all_streams(kshark_ctx); for (int i = 0; i < kshark_ctx->n_streams; ++i) { sd = streamIds[i]; nCPUs = kshark_ctx->stream[sd]->n_cpus; for (int cpu = 0; cpu < nCPUs; ++cpu) { kshark_unregister_data_collection(&kshark_ctx->collections, KsUtils::matchCPUVisible, sd, &cpu, 1); } } free(streamIds); } void KsDataStore::_applyIdFilter(int filterId, QVector vec, int sd) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; if (!kshark_instance(&kshark_ctx)) return; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; switch (filterId) { case KS_SHOW_EVENT_FILTER: case KS_HIDE_EVENT_FILTER: kshark_filter_clear(kshark_ctx, sd, KS_SHOW_EVENT_FILTER); kshark_filter_clear(kshark_ctx, sd, KS_HIDE_EVENT_FILTER); break; case KS_SHOW_TASK_FILTER: case KS_HIDE_TASK_FILTER: kshark_filter_clear(kshark_ctx, sd, KS_SHOW_TASK_FILTER); kshark_filter_clear(kshark_ctx, sd, KS_HIDE_TASK_FILTER); break; case KS_SHOW_CPU_FILTER: case KS_HIDE_CPU_FILTER: kshark_filter_clear(kshark_ctx, sd, KS_SHOW_CPU_FILTER); kshark_filter_clear(kshark_ctx, sd, KS_HIDE_CPU_FILTER); break; default: return; } for (auto &&val: vec) kshark_filter_add_id(kshark_ctx, sd, filterId, val); if (!kshark_ctx->n_streams) return; unregisterCPUCollections(); /* * If the advanced event filter is set the data has to be reloaded, * because the advanced filter uses tep_records. */ if (kshark_is_tep(stream) && kshark_tep_filter_is_set(stream)) reload(); else kshark_filter_stream_entries(kshark_ctx, sd, _rows, _dataSize); registerCPUCollections(); emit updateWidgets(this); } /** Apply Show Task filter. */ void KsDataStore::applyPosTaskFilter(int sd, QVector vec) { _applyIdFilter(KS_SHOW_TASK_FILTER, vec, sd); } /** Apply Hide Task filter. */ void KsDataStore::applyNegTaskFilter(int sd, QVector vec) { _applyIdFilter(KS_HIDE_TASK_FILTER, vec, sd); } /** Apply Show Event filter. */ void KsDataStore::applyPosEventFilter(int sd, QVector vec) { _applyIdFilter(KS_SHOW_EVENT_FILTER, vec, sd); } /** Apply Hide Event filter. */ void KsDataStore::applyNegEventFilter(int sd, QVector vec) { _applyIdFilter(KS_HIDE_EVENT_FILTER, vec, sd); } /** Apply Show CPU filter. */ void KsDataStore::applyPosCPUFilter(int sd, QVector vec) { _applyIdFilter(KS_SHOW_CPU_FILTER, vec, sd); } /** Apply Hide CPU filter. */ void KsDataStore::applyNegCPUFilter(int sd, QVector vec) { _applyIdFilter(KS_HIDE_CPU_FILTER, vec, sd); } /** Disable all filters. */ void KsDataStore::clearAllFilters() { kshark_context *kshark_ctx(nullptr); int *streamIds, sd; if (!kshark_instance(&kshark_ctx) || !kshark_ctx->n_streams) return; unregisterCPUCollections(); streamIds = kshark_all_streams(kshark_ctx); for (int i = 0; i < kshark_ctx->n_streams; ++i) { sd = streamIds[i]; kshark_filter_clear(kshark_ctx, sd, KS_SHOW_TASK_FILTER); kshark_filter_clear(kshark_ctx, sd, KS_HIDE_TASK_FILTER); kshark_filter_clear(kshark_ctx, sd, KS_SHOW_EVENT_FILTER); kshark_filter_clear(kshark_ctx, sd, KS_HIDE_EVENT_FILTER); kshark_filter_clear(kshark_ctx, sd, KS_SHOW_CPU_FILTER); kshark_filter_clear(kshark_ctx, sd, KS_HIDE_CPU_FILTER); if (kshark_is_tep(kshark_ctx->stream[sd])) kshark_tep_filter_reset(kshark_ctx->stream[sd]); } free(streamIds); kshark_clear_all_filters(kshark_ctx, _rows, _dataSize); registerCPUCollections(); emit updateWidgets(this); } /** * @brief Apply constant offset to the timestamps of all entries from a given * Data stream. * * @param sd: Data stream identifier. * @param offset: The constant offset to be added (in nanosecond). */ void KsDataStore::setClockOffset(int sd, int64_t offset) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; if (!kshark_get_data_stream(kshark_ctx, sd)) return; unregisterCPUCollections(); kshark_set_clock_offset(kshark_ctx, _rows, _dataSize, sd, offset); registerCPUCollections(); } /** * @brief Create Plugin Manager. Use the list of plugins declared in the * CMake-generated header file. */ KsPluginManager::KsPluginManager(QWidget *parent) : QObject(parent) { _loadPluginList(KsUtils::getPluginList()); } QVector KsPluginManager::_loadPluginList(const QStringList &plugins) { kshark_context *kshark_ctx(nullptr); QVector vec; kshark_plugin_list *plugin; std::string name, lib; int nPlugins; if (!kshark_instance(&kshark_ctx)) return vec; nPlugins = plugins.count(); for (int i = 0; i < nPlugins; ++i) { if (plugins[i].endsWith(".so")) { lib = plugins[i].toStdString(); name = _pluginNameFromLib(plugins[i]); } else { lib = _pluginLibFromName(plugins[i]); name = plugins[i].toStdString(); } plugin = kshark_find_plugin(kshark_ctx->plugins, lib.c_str()); if (!plugin) { plugin = kshark_register_plugin(kshark_ctx, name.c_str(), lib.c_str()); if (plugin) vec.append(plugin); } } return vec; } /** * @brief Get a list of all plugins registered to a given Data stream. * * @param sd: Data stream identifier. * @return List of plugin names. */ QStringList KsPluginManager::getStreamPluginList(int sd) const { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; kshark_dpi_list *plugin; QStringList list; if (!kshark_instance(&kshark_ctx)) return {}; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return {}; plugin = stream->plugins; while (plugin) { list.append(plugin->interface->name); plugin = plugin->next; } return list; } /** * @brief Get a list of all plugins registered to a given Data stream. * * @param sd: Data stream identifier. */ QVector KsPluginManager::getActivePlugins(int sd) const { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; kshark_dpi_list *plugin; QVector vec; int i(0); if (!kshark_instance(&kshark_ctx)) return {}; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return {}; plugin = stream->plugins; while (plugin) { vec.append(plugin->status & KSHARK_PLUGIN_ENABLED); plugin = plugin->next; i++; } return vec; } /** * @brief Get the indexes of all plugins registered to a given stream and * having given status. */ QVector KsPluginManager::getPluginsByStatus(int sd, int status) const { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; kshark_dpi_list *plugin; QVector vec; int i(0); if (!kshark_instance(&kshark_ctx)) return {}; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return {}; plugin = stream->plugins; while (plugin) { if (plugin->status & status) vec.append(i); plugin = plugin->next; i++; } return vec; } void KsPluginManager::_registerCtrlInterface(kshark_plugin_list *plugin) { if (!plugin->handle || !plugin->ctrl_interface) return; void *dialogPtr = plugin->ctrl_interface(parent()); if (dialogPtr) { QWidget *dialog = static_cast(dialogPtr); if (dialog && _pluginDialogs.indexOf(dialog) < 0) _pluginDialogs.append(dialog); } } /** * @brief Loop over the registered plugins and register all plugin-defined * menus (if any). */ void KsPluginManager::registerPluginMenues() { kshark_context *kshark_ctx(nullptr); kshark_plugin_list *plugin; if (!kshark_instance(&kshark_ctx)) return; for (plugin = kshark_ctx->plugins; plugin; plugin = plugin->next) _registerCtrlInterface(plugin); } std::string KsPluginManager::_pluginLibFromName(const QString &plugin) { QString appPath = QCoreApplication::applicationDirPath(); QString libPath = appPath + "/../lib"; std::string lib; auto lamFileName = [&] () { return std::string("/plugin-" + plugin.toStdString() + ".so"); }; libPath = QDir::cleanPath(libPath); if (!KsUtils::isInstalled() && QDir(libPath).exists()) lib = libPath.toStdString() + lamFileName(); else lib = std::string(KS_PLUGIN_INSTALL_PREFIX) + lamFileName(); return lib; } std::string KsPluginManager::_pluginNameFromLib(const QString &plugin) { QString name = plugin.section('/', -1); name.remove("plugin-"); name.remove(".so"); return name.toStdString(); } /** * @brief Register a list pf plugins * * @param pluginNames: Provide here the names of the plugin (as in the * CMake-generated header file) or the names of the * plugin's library files (.so including path). * The names must be comma separated. */ void KsPluginManager::registerPlugins(const QString &pluginNames) { QVector plugins; plugins = _loadPluginList(pluginNames.split(',')); for (auto const &p: plugins) _registerCtrlInterface(p); _userPlugins.append(plugins); } /** * @brief Unregister a list pf plugins. * * @param pluginNames: Provide here a comma separated list of plugin names (as * in the CMake-generated header file). */ void KsPluginManager::unregisterPlugins(const QString &pluginNames) { kshark_context *kshark_ctx(nullptr); kshark_plugin_list *plugin; kshark_data_stream *stream; int *streamArray; if (!kshark_instance(&kshark_ctx)) return; for (auto const &name: pluginNames.split(',')) { plugin = kshark_find_plugin_by_name(kshark_ctx->plugins, name.toStdString().c_str()); streamArray = kshark_all_streams(kshark_ctx); for (int i = 0; i < kshark_ctx->n_streams; ++i) { stream = kshark_get_data_stream(kshark_ctx, streamArray[i]); kshark_unregister_plugin_from_stream(stream, plugin->process_interface); } kshark_unregister_plugin(kshark_ctx, name.toStdString().c_str(), plugin->file); } } void KsPluginManager::_pluginToStream(const QString &pluginName, QVector streamIds, bool reg) { kshark_context *kshark_ctx(nullptr); kshark_plugin_list *plugin; kshark_data_stream *stream; if (!kshark_instance(&kshark_ctx)) return; plugin = kshark_find_plugin_by_name(kshark_ctx->plugins, pluginName.toStdString().c_str()); if (!plugin || !plugin->process_interface) return; for (auto const &sd: streamIds) { stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) continue; if (reg) kshark_register_plugin_to_stream(stream, plugin->process_interface, true); else kshark_unregister_plugin_from_stream(stream, plugin->process_interface); kshark_handle_all_dpis(stream, KSHARK_PLUGIN_UPDATE); } emit dataReload(); } /** * @brief Register a given plugin to given Data streams. * * @param pluginName: The name of the plugin to register. * @param streamIds: Vector of Data stream identifiers. */ void KsPluginManager::registerPluginToStream(const QString &pluginName, QVector streamIds) { _pluginToStream(pluginName, streamIds, true); } /** * @brief Unregister a given plugin from given Data streams. * * @param pluginName: The name of the plugin to unregister. * @param streamIds: Vector of Data stream identifiers. */ void KsPluginManager::unregisterPluginFromStream(const QString &pluginName, QVector streamIds) { _pluginToStream(pluginName, streamIds, false); } /** @brief Add to the list and initialize user-provided plugins. All other * previously loaded plugins will be reinitialized and the data will be * reloaded. * * @param fileNames: The library files (.so) of the plugins. * @param streamIds: Vector of Data stream identifiers. If the vector is empty * the plugins will be registered to all Data streams. * Otherwise the plugins will be registered to the listed * streams. */ void KsPluginManager::addPlugins(const QStringList &fileNames, QVector streamIds) { QVector plugins; kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; if (!kshark_instance(&kshark_ctx)) return; plugins = _loadPluginList(fileNames); for (auto const &p: plugins) _registerCtrlInterface(p); _userPlugins.append(plugins); if (streamIds.isEmpty()) streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { stream = kshark_get_data_stream(kshark_ctx, sd); for (auto const &p: plugins) { if (p->process_interface) kshark_register_plugin_to_stream(stream, p->process_interface, true); } kshark_handle_all_dpis(stream, KSHARK_PLUGIN_UPDATE); } } /** @brief Update (change) the plugins for a given Data stream. * * @param sd: Data stream identifier. * @param pluginStates: A vector of plugin's states (0 or 1) telling which * plugins to be loaded. */ void KsPluginManager::updatePlugins(int sd, QVector pluginStates) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; kshark_dpi_list *plugin; int i(0); if (!kshark_instance(&kshark_ctx)) return; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; plugin = stream->plugins; while (plugin) { if (pluginStates[i++]) plugin->status |= KSHARK_PLUGIN_ENABLED; else plugin->status &= ~KSHARK_PLUGIN_ENABLED; plugin = plugin->next; } kshark_handle_all_dpis(stream, KSHARK_PLUGIN_UPDATE); } /** * @brief Destroy all Plugin dialogs. */ void KsPluginManager::deletePluginDialogs() { /** Delete all register plugin dialogs. */ for (auto &pd: _pluginDialogs) delete pd; } kernel-shark-kernelshark-v2.4.0/src/KsUtils.hpp000066400000000000000000000172511477354127100215170ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsUtils.hpp * @brief KernelShark Utils. */ #ifndef _KS_UTILS_H #define _KS_UTILS_H // C++ 11 #include // Qt #include // KernelShark #include "libkshark.h" #include "libkshark-model.h" #include "KsCmakeDef.hpp" #include "KsPlotTools.hpp" /** Macro providing the height of the screen in pixels. */ #define SCREEN_HEIGHT QGuiApplication::screens().at(0)->geometry().height() /** Macro providing the width of the screen in pixels. */ #define SCREEN_WIDTH QGuiApplication::screens().at(0)->geometry().width() //! @cond Doxygen_Suppress static auto fontHeight = []() { QFont font; QFontMetrics fm(font); return fm.height(); }; static auto stringWidth = [](QString s) { QFont font; QFontMetrics fm(font); return fm.horizontalAdvance(s); }; //! @endcond /** Macro providing the height of the font in pixels. */ #define FONT_HEIGHT fontHeight() /** Macro providing the width of the font in pixels. */ #define FONT_WIDTH (stringWidth("KernelShark") / 11) /** Macro providing the width of a string in pixels. */ #define STRING_WIDTH(s) stringWidth(s) /** Macro providing the height of the KernelShark graphs in pixels. */ #define KS_GRAPH_HEIGHT (FONT_HEIGHT * 2) //! @cond Doxygen_Suppress #define KS_JSON_CAST(doc) \ reinterpret_cast(doc) #define KS_C_STR_CAST(doc) \ reinterpret_cast(doc) typedef std::chrono::high_resolution_clock::time_point hd_time; #define GET_TIME std::chrono::high_resolution_clock::now() #define GET_DURATION(t0) \ std::chrono::duration_cast>( \ std::chrono::high_resolution_clock::now() - t0).count() #define KS_SPLIT_SkipEmptyParts Qt::SkipEmptyParts //! @endcond namespace KsUtils { QVector getCPUList(int sd); QVector getPidList(int sd); QVector getEventIdList(int sd); int getEventId(int sd, const QString &eventName); QString getEventName(int sd, int eventId); QStringList getEventFieldsList(int sd, int eventId); kshark_event_field_format getEventFieldType(int sd, int eventId, const QString &fieldName); QVector getStreamIdList(kshark_context *kshark_ctx); QVector getFilterIds(kshark_hash_id *filter); /** @brief Geat the list of plugins provided by the package. */ inline QStringList getPluginList() {return QString(KS_BUILTIN_PLUGINS).split(";");} void listFilterSync(bool state); void graphFilterSync(bool state); QCheckBox *addCheckBoxToMenu(QMenu *menu, QString name); /** @brief Convert the timestamp of the trace record into a string showing * the time in seconds. * * @param ts: Input location for the timestamp. * @param prec: the number of digits after the decimal point in the return * string. * * @returns String showing the time in seconds. */ inline QString Ts2String(int64_t ts, int prec) { return QString::number(ts * 1e-9, 'f', prec); } bool matchCPUVisible(kshark_context *kshark_ctx, kshark_entry *e, int sd, int *cpu); bool isInstalled(); QString getFile(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath); QStringList getFiles(QWidget *parent, const QString &windowName, const QString &filter, QString &lastFilePath); QString getSaveFile(QWidget *parent, const QString &windowName, const QString &filter, const QString &extension, QString &lastFilePath); void setElidedText(QLabel* label, QString text, enum Qt::TextElideMode mode, int labelWidth); QStringList splitArguments(QString cmd); QVector parseIdList(QString v_str); QMap> parseTaskList(QString v_str); QStringList getTepEvtName(int sd, int eventId); /** Get a string to be used as a standard name of a CPU graph. */ inline QString cpuPlotName(int cpu) {return QString("CPU %1").arg(cpu);} QString taskPlotName(int sd, int pid); /** Get the total number of Data streams. */ inline int getNStreams() { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return -1; return kshark_ctx->n_streams; } QString streamDescription(kshark_data_stream *stream); }; // KsUtils /** Identifier of the Dual Marker active state. */ enum class DualMarkerState { A, B }; /** * The KsDataStore class provides the access to trace data for all KernelShark * widgets. */ class KsDataStore : public QObject { Q_OBJECT public: explicit KsDataStore(QWidget *parent = nullptr); ~KsDataStore(); int loadDataFile(const QString &file, QVector plugins); int appendDataFile(const QString &file, int64_t shift); void clear(); /** Get the trace data array. */ kshark_entry **rows() const {return _rows;} /** Get a reference of the trace data array. */ kshark_entry ***rows_r() {return &_rows;} /** Get the size of the data array. */ ssize_t size() const {return _dataSize;} /** Set the size of the data (number of entries). */ void setSize(ssize_t s) {_dataSize = s;} void reload(); void update(); void registerCPUCollections(); void unregisterCPUCollections(); void applyPosTaskFilter(int sd, QVector vec); void applyNegTaskFilter(int sd, QVector vec); void applyPosEventFilter(int sd, QVector vec); void applyNegEventFilter(int sd, QVector vec); void applyPosCPUFilter(int sd, QVector vec); void applyNegCPUFilter(int sd, QVector vec); void clearAllFilters(); void setClockOffset(int sd, int64_t offset); signals: /** * This signal is emitted when the data has changed and the View * widgets have to update. */ void updateWidgets(KsDataStore *); private: /** Trace data array. */ kshark_entry **_rows; /** The size of the data array. */ ssize_t _dataSize; int _openDataFile(kshark_context *kshark_ctx, const QString &file); void _freeData(); void _applyIdFilter(int filterId, QVector vec, int sd); void _addPluginsToStream(kshark_context *kshark_ctx, int sd, QVector plugins); }; /** A Plugin Manager class. */ class KsPluginManager : public QObject { Q_OBJECT public: explicit KsPluginManager(QWidget *parent = nullptr); QStringList getStreamPluginList(int sd) const; QVector getActivePlugins(int sd) const; QVector getPluginsByStatus(int sd, int status) const; /** Get a list of all plugins added by the user. */ const QVector getUserPlugins() const {return _userPlugins;} void registerPluginMenues(); void updatePlugins(int sd, QVector pluginStates); void addPlugins(const QStringList &fileNames, QVector streams); void registerPlugins(const QString &pluginNames); void unregisterPlugins(const QString &pluginNames); void registerPluginToStream(const QString &pluginName, QVector streamId); void unregisterPluginFromStream(const QString &pluginName, QVector streamId); void deletePluginDialogs(); /** Append to the list of User plugin. */ void addUserPluginToList(kshark_plugin_list *p) {_userPlugins.append(p);} signals: /** This signal is emitted when a plugin is loaded or unloaded. */ void dataReload(); private: QVector _userPlugins; /** Plugin dialogs. */ QVector _pluginDialogs; QVector _loadPluginList(const QStringList &plugins); void _registerCtrlInterface(kshark_plugin_list *plugin); std::string _pluginLibFromName(const QString &plugin); std::string _pluginNameFromLib(const QString &plugin); void _pluginToStream(const QString &pluginName, QVector streamId, bool reg); }; KsPlot::Color& operator <<(KsPlot::Color &thisColor, const QColor &c); QColor& operator <<(QColor &thisColor, const KsPlot::Color &c); #endif kernel-shark-kernelshark-v2.4.0/src/KsWidgetsLib.cpp000066400000000000000000000776451477354127100224640ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsWidgetsLib.cpp * @brief Defines small widgets and dialogues used by the KernelShark GUI. */ // C #include // KernelShark #include "libkshark-tepdata.h" #include "KsCmakeDef.hpp" #include "KsPlotTools.hpp" #include "KsWidgetsLib.hpp" namespace KsWidgetsLib { /** * @brief Create KsProgressBar. * * @param message: Text to be shown. * @param parent: The parent of this widget. */ KsProgressBar::KsProgressBar(QString message, QWidget *parent) : QWidget(parent), _sb(this), _pb(&_sb), _notDone(false) { setWindowTitle("KernelShark"); setLayout(new QVBoxLayout); setFixedHeight(KS_PROGBAR_HEIGHT); setFixedWidth(KS_PROGBAR_WIDTH); _pb.setOrientation(Qt::Horizontal); _pb.setTextVisible(false); _pb.setRange(0, KS_PROGRESS_BAR_MAX); _pb.setValue(1); _sb.addPermanentWidget(&_pb, 1); layout()->addWidget(new QLabel(message)); layout()->addWidget(&_sb); setWindowFlags(Qt::WindowStaysOnTopHint); show(); } /** Destroy the KsProgressBar object. */ KsProgressBar::~KsProgressBar() { _notDone = false; usleep(10000); } /** @brief Set the state of the progressbar. * * @param i: A value ranging from 0 to KS_PROGRESS_BAR_MAX. */ void KsProgressBar::setValue(int i) { _pb.setValue(i); QApplication::processEvents(); } /** Show continuous work. */ void KsProgressBar::workInProgress() { int progress, inc; bool inv = false; progress = inc = 5; _notDone = true; while (_notDone) { if (progress > KS_PROGRESS_BAR_MAX || progress <= 0) { inc = -inc; inv = !inv; _pb.setInvertedAppearance(inv); } setValue(progress); progress += inc; usleep(30000); } } /** * @brief Create KsWorkInProgress. * * @param parent: The parent of this widget. */ KsWorkInProgress::KsWorkInProgress(QWidget *parent) : QWidget(parent), _icon(this), _message("work in progress", this) { QIcon statusIcon = QIcon::fromTheme("dialog-warning"); _icon.setPixmap(statusIcon.pixmap(.8 * FONT_HEIGHT)); } /** * @brief Show the "work in progress" notification. * * @param w: Data Work identifier. */ void KsWorkInProgress::show(KsDataWork w) { _works.insert(w); if (_works.size() == 1) { _icon.show(); _message.show(); if (w != KsDataWork::RenderGL && w != KsDataWork::ResizeGL) QApplication::processEvents(); } } /** * @brief Hide the "work in progress" notification. * * @param w: Data Work identifier. */ void KsWorkInProgress::hide(KsDataWork w) { _works.remove(w); if (_works.isEmpty()) { _icon.hide(); _message.hide(); if (w != KsDataWork::RenderGL && w != KsDataWork::ResizeGL) QApplication::processEvents(); } } /** * @brief Returns True the "work in progress" notification is active. * Otherwise False. * * @param w: Data Work identifier. */ bool KsWorkInProgress::isBusy(KsDataWork w) const { if (w == KsDataWork::AnyWork) return _works.isEmpty()? false : true; return _works.contains(w)? true : false; } /** Add the KsWorkInProgress widget to a given Status Bar. */ void KsWorkInProgress::addToStatusBar(QStatusBar *sb) { sb->addPermanentWidget(&_icon); sb->addPermanentWidget(&_message); _icon.hide(); _message.hide(); } /** * @brief Create KsMessageDialog. * * @param message: Text to be shown. * @param parent: The parent of this widget. */ KsMessageDialog::KsMessageDialog(QString message, QWidget *parent) : QDialog(parent), _text(message, this), _closeButton("Close", this) { resize(KS_MSG_DIALOG_WIDTH, KS_MSG_DIALOG_HEIGHT); _layout.addWidget(&_text); _layout.addWidget(&_closeButton); connect(&_closeButton, &QPushButton::pressed, this, &QWidget::close); this->setLayout(&_layout); } /** * @brief Launch a File exists dialog. Use this function to ask the user * before overwriting an existing file. * * @param fileName: the name of the file. * * @returns True if the user wants to overwrite the file. Otherwise */ bool fileExistsDialog(QString fileName) { QString msg("A file "); QMessageBox msgBox; msg += fileName; msg += " already exists."; msgBox.setText(msg); msgBox.setInformativeText("Do you want to replace it?"); msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Cancel); msgBox.setDefaultButton(QMessageBox::Cancel); return (msgBox.exec() == QMessageBox::Save); } /** Create KsTimeOffsetDialog. */ KsTimeOffsetDialog::KsTimeOffsetDialog(QWidget *parent) : QDialog(parent) { kshark_context *kshark_ctx(nullptr); QVector streamIds; QString streamName; int64_t max_ofst; auto lamApply = [&] (double val) { int sd = _streamCombo.currentData().toInt(); emit apply(sd, val); close(); }; if (!kshark_instance(&kshark_ctx)) return; this->setLayout(new QVBoxLayout); streamIds = KsUtils::getStreamIdList(kshark_ctx); if (streamIds.size() > 1) { for (auto const &sd: streamIds) if (sd != 0) { streamName = KsUtils::streamDescription(kshark_ctx->stream[sd]); _streamCombo.addItem(streamName); } layout()->addWidget(&_streamCombo); } _input.setInputMode(QInputDialog::DoubleInput); max_ofst = (int64_t) 1 << 60; _input.setDoubleRange(-max_ofst, max_ofst); _input.setDoubleDecimals(3); _input.setLabelText("Offset [usec]:"); _setDefault(_streamCombo.currentIndex()); layout()->addWidget(&_input); connect(&_input, &QInputDialog::doubleValueSelected, lamApply); connect(&_input, &QDialog::rejected, this, &QWidget::close); connect(&_streamCombo, &QComboBox::currentIndexChanged, this, &KsTimeOffsetDialog::_setDefault); show(); } void KsTimeOffsetDialog::_setDefault(int) { int sd = _streamCombo.currentData().toInt(); kshark_context *kshark_ctx(nullptr); struct kshark_data_stream *stream; double offset; if (!kshark_instance(&kshark_ctx)) return; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; if (!stream->calib_array) { stream->calib = kshark_offset_calib; stream->calib_array = (int64_t *) calloc(1, sizeof(int64_t)); stream->calib_array_size = 1; } offset = stream->calib_array[0] * 1e-3; _input.setDoubleValue(offset); } /** * @brief Static function that starts a KsTimeOffsetDialog and returns value * selected by the user. * * @param dataFile: The name of the trace file to which the Time Offset will * apply. To be shown by the dialog. * @param ok: Output location to a success flag. True if the user has pressed * "Apply". */ double KsTimeOffsetDialog::getValueNanoSec(QString dataFile, bool *ok) { KsTimeOffsetDialog dialog; int64_t ofst(0); int sd(-1); *ok = false; auto lamGetOffset = [&] (int stream_id, double ms) { ofst = ms * 1000; sd = stream_id; *ok = true; }; connect(&dialog, &KsTimeOffsetDialog::apply, lamGetOffset); dialog._streamCombo.hide(); dialog._input.setLabelText(dataFile + "\nOffset [usec]:"); dialog.exec(); return ofst; } /** * @brief Create KsCheckBoxWidget. * * @param sd: Data stream identifier. * @param name: The name of this widget. * @param parent: The parent of this widget. */ KsCheckBoxWidget::KsCheckBoxWidget(int sd, const QString &name, QWidget *parent) : QWidget(parent), _userInput(false), _sd(sd), _allCb("all"), _cbWidget(this), _cbLayout(&_cbWidget), _topLayout(this), _allCbAction(nullptr), _streamLabel("", this), _name(name), _nameLabel(name + ": ") { setWindowTitle(_name); setMinimumHeight(SCREEN_HEIGHT / 2); setMinimumWidth(FONT_WIDTH * 20); auto lamCheckAll = [this] (bool s) { _userInput = true; _checkAll(s); }; connect(&_allCb, &QCheckBox::clicked, lamCheckAll); _cbWidget.setLayout(&_cbLayout); _setStream(sd); if (!_streamLabel.text().isEmpty()) _topLayout.addWidget(&_streamLabel); _tb.addWidget(&_nameLabel); _allCbAction = _tb.addWidget(&_allCb); _topLayout.addWidget(&_tb); _topLayout.addWidget(&_cbWidget); setLayout(&_topLayout); _allCb.setCheckState(Qt::Checked); } /** * Set the default state for all checkboxes (including the "all" checkbox). */ void KsCheckBoxWidget::setDefault(bool st) { Qt::CheckState state = Qt::Unchecked; if (st) state = Qt::Checked; _allCb.setCheckState(state); _checkAll(state); } /** Set the stream Id of the widget. */ void KsCheckBoxWidget::_setStream(int8_t sd) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; if (!kshark_instance(&kshark_ctx)) return; _sd = sd; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; _streamName = KsUtils::streamDescription(stream); KsUtils::setElidedText(&_streamLabel, _streamName, Qt::ElideLeft, width()); QApplication::processEvents(); } /** Get a vector containing the indexes of all checked boxes. */ QVector KsCheckBoxWidget::getCheckedIds() { QVector vec; int n = _id.size(); for (int i = 0; i < n; ++i) if (_checkState(i) == Qt::Checked) vec.append(_id[i]); return vec; } /** Get a vector containing the state of all checkboxes. */ QVector KsCheckBoxWidget::getStates() { int n = _id.size(); QVector vec(n); for (int i = 0; i < n; ++i) vec[i] = !!_checkState(i); return vec; } /** * @brief Set the state of the checkboxes. * * @param v: Vector containing the state values for all checkboxes. */ void KsCheckBoxWidget::set(QVector v) { Qt::CheckState state; int nChecks; nChecks = (v.size() < _id.size()) ? v.size() : _id.size(); /* Start with the "all" checkbox being checked. */ _allCb.setCheckState(Qt::Checked); for (int i = 0; i < nChecks; ++i) { if (v[i]) { state = Qt::Checked; } else { /* * At least one checkbox is unchecked. Uncheck * "all" as well. */ state = Qt::Unchecked; _allCb.setCheckState(state); } _setCheckState(i, state); } _verify(); } void KsCheckBoxWidget::_checkAll(bool st) { Qt::CheckState state = Qt::Unchecked; int n = _id.size(); if (st) state = Qt::Checked; for (int i = 0; i < n; ++i) { _setCheckState(i, state); } _verify(); } /** * @brief Create KsCheckBoxDialog. * * @param cbws: A vector of KsCheckBoxWidgets to be nested in this dialog. * @param parent: The parent of this widget. */ KsCheckBoxDialog::KsCheckBoxDialog(QVector cbws, QWidget *parent) : QDialog(parent), _applyIds(true), _checkBoxWidgets(cbws), _applyButton("Apply", this), _cancelButton("Cancel", this) { int buttonWidth; if (!cbws.isEmpty()) setWindowTitle(cbws[0]->name()); for (auto const &w: _checkBoxWidgets) _cbLayout.addWidget(w); _topLayout.addLayout(&_cbLayout); buttonWidth = STRING_WIDTH("--Cancel--"); _applyButton.setFixedWidth(buttonWidth); _cancelButton.setFixedWidth(buttonWidth); _buttonLayout.addWidget(&_applyButton); _applyButton.setAutoDefault(false); _buttonLayout.addWidget(&_cancelButton); _cancelButton.setAutoDefault(false); _buttonLayout.setAlignment(Qt::AlignLeft); _topLayout.addLayout(&_buttonLayout); _applyButtonConnection = connect(&_applyButton, &QPushButton::pressed, this, &KsCheckBoxDialog::_applyPress); connect(&_applyButton, &QPushButton::pressed, this, &QWidget::close); connect(&_cancelButton, &QPushButton::pressed, this, &QWidget::close); this->setLayout(&_topLayout); } void KsCheckBoxDialog::_applyPress() { QVector vec; /* * Disconnect _applyButton. This is done in order to protect * against multiple clicks. */ disconnect(_applyButtonConnection); _preApplyAction(); for (auto const &w: _checkBoxWidgets) { if (!w->_userInput) continue; if (_applyIds) vec = w->getCheckedIds(); else vec = w->getStates(); emit apply(w->sd(), vec); } _postApplyAction(); } /** * @brief Create KsCheckBoxTable. * * @param parent: The parent of this widget. */ KsCheckBoxTable::KsCheckBoxTable(QWidget *parent) : QTableWidget(parent) { setShowGrid(false); horizontalHeader()->setDefaultAlignment(Qt::AlignLeft); horizontalHeader()->setStretchLastSection(true); setSelectionBehavior(QAbstractItemView::SelectRows); setEditTriggers(QAbstractItemView::NoEditTriggers); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); verticalHeader()->setVisible(false); connect(this, &QTableWidget::cellDoubleClicked, this, &KsCheckBoxTable::_doubleClicked); } /** * @brief Initialize the table. * * @param headers: The headers of the individual columns. * @param size: The number of rows. */ void KsCheckBoxTable::init(QStringList headers, int size) { QHBoxLayout *cbLayout; QWidget *cbWidget; setColumnCount(headers.count()); setRowCount(size); setHorizontalHeaderLabels(headers); _cb.resize(size); for (int i = 0; i < size; ++i) { cbWidget = new QWidget(); _cb[i] = new QCheckBox(cbWidget); cbLayout = new QHBoxLayout(cbWidget); cbLayout->addWidget(_cb[i]); cbLayout->setAlignment(Qt::AlignCenter); cbLayout->setContentsMargins(0, 0, 0, 0); cbWidget->setLayout(cbLayout); setCellWidget(i, 0, cbWidget); } } /** Reimplemented event handler used to receive key press events. */ void KsCheckBoxTable::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Return) { for (auto &s: selectedItems()) { if (s->column() == 1) emit changeState(s->row()); } } QApplication::processEvents(); QTableWidget::keyPressEvent(event); } /** Reimplemented event handler used to receive mouse press events. */ void KsCheckBoxTable::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { for (auto &i: selectedItems()) i->setSelected(false); return; } QApplication::processEvents(); QTableWidget::mousePressEvent(event); } void KsCheckBoxTable::_doubleClicked(int row, [[maybe_unused]] int col) { emit changeState(row); for (auto &i: selectedItems()) i->setSelected(false); } /** * @brief Create KsCheckBoxTableWidget. * * @param sd: Data stream identifier. * @param name: The name of this widget. * @param parent: The parent of this widget. */ KsCheckBoxTableWidget::KsCheckBoxTableWidget(int sd, const QString &name, QWidget *parent) : KsCheckBoxWidget(sd, name, parent), _table(this) { connect(&_table, &KsCheckBoxTable::changeState, this, &KsCheckBoxTableWidget::_changeState); } /** Initialize the KsCheckBoxTable and its layout. */ void KsCheckBoxTableWidget::_initTable(QStringList headers, int size) { _table.init(headers, size); for (auto const & cb: _table._cb) { connect(cb, &QCheckBox::clicked, this, &KsCheckBoxTableWidget::_update); } _cbLayout.setContentsMargins(1, 1, 1, 1); _cbLayout.addWidget(&_table); } /** Adjust the size of this widget according to its content. */ void KsCheckBoxTableWidget::_adjustSize() { int width; _table.setVisible(false); _table.resizeColumnsToContents(); _table.setVisible(true); width = _table.horizontalHeader()->length() + FONT_WIDTH * 3 + style()->pixelMetric(QStyle::PM_ScrollBarExtent); _cbWidget.resize(width, _cbWidget.height()); setMinimumWidth(_cbWidget.width() + _cbLayout.contentsMargins().left() + _cbLayout.contentsMargins().right() + _topLayout.contentsMargins().left() + _topLayout.contentsMargins().right()); } void KsCheckBoxTableWidget::_update(bool state) { /* If a Checkbox is being unchecked. Unchecked "all" as well. */ if (!state) _allCb.setCheckState(Qt::Unchecked); _userInput = true; } void KsCheckBoxTableWidget::_changeState(int row) { if (_table._cb[row]->checkState() == Qt::Checked) _table._cb[row]->setCheckState(Qt::Unchecked); else _table._cb[row]->setCheckState(Qt::Checked); _allCb.setCheckState(Qt::Checked); for (auto &c: _table._cb) { if (c->checkState() == Qt::Unchecked) { _allCb.setCheckState(Qt::Unchecked); break; } } _userInput = true; } static void update_r(QTreeWidgetItem *item, Qt::CheckState state) { int n; item->setCheckState(0, state); n = item->childCount(); for (int i = 0; i < n; ++i) update_r(item->child(i), state); } /** * @brief Create KsCheckBoxTree. * * @param parent: The parent of this widget. */ KsCheckBoxTree::KsCheckBoxTree(QWidget *parent) : QTreeWidget(parent) { setColumnCount(2); setHeaderHidden(true); setSelectionBehavior(QAbstractItemView::SelectRows); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); connect(this, &KsCheckBoxTree::itemDoubleClicked, this, &KsCheckBoxTree::_doubleClicked); } /** Reimplemented event handler used to receive key press events. */ void KsCheckBoxTree::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Return) { /* Loop over all selected child items and change * there states. */ for (auto &s: selectedItems()) { if(s->childCount()) { if (s->isExpanded()) continue; } if (s->checkState(0) == Qt::Unchecked) s->setCheckState(0, Qt::Checked); else s->setCheckState(0, Qt::Unchecked); if(s->childCount()) { update_r(s, s->checkState(0)); } } } emit verify(); QTreeWidget::keyPressEvent(event); } void KsCheckBoxTree::_doubleClicked(QTreeWidgetItem *item, int col) { if (item->checkState(0) == Qt::Unchecked) item->setCheckState(0, Qt::Checked); else item->setCheckState(0, Qt::Unchecked); for (auto &i: selectedItems()) i->setSelected(false); emit itemClicked(item, col); } /** Reimplemented event handler used to receive mouse press events. */ void KsCheckBoxTree::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::RightButton) { for (auto &i: selectedItems()) i->setSelected(false); return; } QApplication::processEvents(); QTreeWidget::mousePressEvent(event); } /** * @brief Create KsCheckBoxTreeWidget. * * @param sd: Data stream identifier. * @param name: The name of this widget. * @param parent: The parent of this widget. */ KsCheckBoxTreeWidget::KsCheckBoxTreeWidget(int sd, const QString &name, QWidget *parent) : KsCheckBoxWidget(sd, name, parent), _tree(this) { connect(&_tree, &KsCheckBoxTree::verify, this, &KsCheckBoxTreeWidget::_verify); auto lamSetUserInput = [this] (QTreeWidgetItem *, int) { _userInput = true; }; connect(&_tree, &QTreeWidget::itemClicked, lamSetUserInput); } /** Initialize the KsCheckBoxTree and its layout. */ void KsCheckBoxTreeWidget::_initTree() { _tree.setSelectionMode(QAbstractItemView::MultiSelection); connect(&_tree, &QTreeWidget::itemClicked, this, &KsCheckBoxTreeWidget::_update); _cbLayout.setContentsMargins(1, 1, 1, 1); _cbLayout.addWidget(&_tree); } /** Adjust the size of this widget according to its content. */ void KsCheckBoxTreeWidget::_adjustSize() { int width, n = _tree.topLevelItemCount(); if (n == 0) return; for (int i = 0; i < n; ++i) _tree.topLevelItem(i)->setExpanded(true); _tree.resizeColumnToContents(0); if (_tree.topLevelItem(0)->child(0)) { width = _tree.visualItemRect(_tree.topLevelItem(0)->child(0)).width(); } else { width = _tree.visualItemRect(_tree.topLevelItem(0)).width(); } width += FONT_WIDTH * 3 + style()->pixelMetric(QStyle::PM_ScrollBarExtent); _cbWidget.resize(width, _cbWidget.height()); for (int i = 0; i < n; ++i) _tree.topLevelItem(i)->setExpanded(false); setMinimumWidth(_cbWidget.width() + _cbLayout.contentsMargins().left() + _cbLayout.contentsMargins().right() + _topLayout.contentsMargins().left() + _topLayout.contentsMargins().right()); } void KsCheckBoxTreeWidget::_update(QTreeWidgetItem *item, [[maybe_unused]] int column) { /* Get the new state of the item. */ Qt::CheckState state = item->checkState(0); /* Recursively update all items below this one. */ update_r(item, state); /* * Update all items above this one including the "all" * check box. */ _verify(); } void KsCheckBoxTreeWidget::_verify() { /* * Set the state of the top level items according to the * state of the childs. */ QTreeWidgetItem *topItem, *childItem; for(int t = 0; t < _tree.topLevelItemCount(); ++t) { topItem = _tree.topLevelItem(t); if (topItem->childCount() == 0) continue; topItem->setCheckState(0, Qt::Checked); for (int c = 0; c < topItem->childCount(); ++c) { childItem = topItem->child(c); if (childItem->checkState(0) == Qt::Unchecked) topItem->setCheckState(0, Qt::Unchecked); } } _allCb.setCheckState(Qt::Checked); for (auto &c: _cb) { if (c->checkState(0) == Qt::Unchecked) { _allCb.setCheckState(Qt::Unchecked); break; } } } /** * @brief Create KsCPUCheckBoxWidget. * * @param stream: Input location for a Data stream pointer. * @param parent: The parent of this widget. */ KsCPUCheckBoxWidget::KsCPUCheckBoxWidget(kshark_data_stream *stream, QWidget *parent) : KsCheckBoxTreeWidget(stream->stream_id, "CPUs", parent), _hideEmpty("hide empty") { int height(FONT_HEIGHT * 1.5); KsPlot::ColorTable colors; QString style; _hideEmpty.setCheckState(Qt::Checked); _tb.addSeparator(); _tb.addWidget(&_hideEmpty); auto lamHideEmpty = [this, stream] (bool hide) { QTreeWidgetItem *item; bool isIdle; for(int cpu = 0; cpu < stream->n_cpus; ++cpu) { item = _tree.topLevelItem(cpu); if (hide) { isIdle = kshark_hash_id_find(stream->idle_cpus, cpu); item->setHidden(isIdle); } else { item->setHidden(false); } } }; connect(&_hideEmpty, &QCheckBox::clicked, lamHideEmpty); style = QString("QTreeView::item { height: %1 ;}").arg(height); _tree.setStyleSheet(style); _initTree(); _id.resize(stream->n_cpus); _cb.resize(stream->n_cpus); colors = KsPlot::CPUColorTable(); for (int i = 0; i < stream->n_cpus; ++i) { QTreeWidgetItem *cpuItem = new QTreeWidgetItem; cpuItem->setText(0, " "); cpuItem->setText(1, QString("CPU %1").arg(i)); cpuItem->setCheckState(0, Qt::Checked); cpuItem->setBackground(0, QColor(colors[i].r(), colors[i].g(), colors[i].b())); _tree.addTopLevelItem(cpuItem); _id[i] = i; _cb[i] = cpuItem; } lamHideEmpty(true); _adjustSize(); } /** * @brief Create KsEventsCheckBoxWidget. * * @param stream: Input location for a Data stream pointer. * @param parent: The parent of this widget. */ KsEventsCheckBoxWidget::KsEventsCheckBoxWidget(kshark_data_stream *stream, QWidget *parent) : KsCheckBoxTreeWidget(stream->stream_id, "Events", parent) { QVector eventIds = KsUtils::getEventIdList(stream->stream_id); _initTree(); if(!stream->n_events || eventIds.isEmpty()) return; _id.resize(stream->n_events); _cb.resize(stream->n_events); if (kshark_is_tep(stream)) _makeTepEventItems(stream, eventIds); else _makeItems(stream, eventIds); } void KsEventsCheckBoxWidget::_makeItems(kshark_data_stream *stream, QVector eventIds) { QTreeWidgetItem *evtItem; QString evtName; for (int i = 0; i < stream->n_events; ++i) { evtName = KsUtils::getEventName(stream->stream_id, eventIds[i]); evtItem = new QTreeWidgetItem; evtItem->setText(0, evtName); evtItem->setCheckState(0, Qt::Checked); evtItem->setFlags(evtItem->flags() | Qt::ItemIsUserCheckable); _tree.addTopLevelItem(evtItem); _cb[i] = evtItem; } } void KsEventsCheckBoxWidget::_makeTepEventItems(kshark_data_stream *stream, QVector eventIds) { QTreeWidgetItem *sysItem, *evtItem; QString sysName, evtName; QStringList name; int i(0); while (i < stream->n_events) { name = KsUtils::getTepEvtName(stream->stream_id, eventIds[i]); sysName = name[0]; sysItem = new QTreeWidgetItem; sysItem->setText(0, sysName); sysItem->setCheckState(0, Qt::Checked); _tree.addTopLevelItem(sysItem); while (sysName == name[0]) { evtName = name[1]; evtItem = new QTreeWidgetItem; evtItem->setText(0, evtName); evtItem->setCheckState(0, Qt::Checked); evtItem->setFlags(evtItem->flags() | Qt::ItemIsUserCheckable); sysItem->addChild(evtItem); _id[i] = eventIds[i]; _cb[i] = evtItem; if (++i == stream->n_events) break; name = KsUtils::getTepEvtName(stream->stream_id, eventIds[i]); } } _tree.sortItems(0, Qt::AscendingOrder); _adjustSize(); } /** * @brief Get a list of all checked events. If the whole system is selected * (the top level checkbox is checked), only the name of the system is * added to the list. * * @param option: If True, "-e" is added as prefix to each element of the list. * * @returns A list of checked events or systems. */ QStringList KsEventsCheckBoxWidget::getCheckedEvents(bool option) { QTreeWidgetItem *sysItem, *evtItem; QStringList list; QString optStr; int nSys, nEvts; if (option) optStr = "-e"; nSys = _tree.topLevelItemCount(); for(int t = 0; t < nSys; ++t) { sysItem = _tree.topLevelItem(t); if (sysItem->checkState(0) == Qt::Checked) { list << optStr + sysItem->text(0); } else { nEvts = sysItem->childCount(); for (int c = 0; c < nEvts; ++c) { evtItem = sysItem->child(c); if (evtItem->checkState(0) == Qt::Checked) { list << optStr + sysItem->text(0) + ":" + evtItem->text(0); } } } } return list; } /** Remove a System from the Checkbox tree. */ void KsEventsCheckBoxWidget::removeSystem(QString name) { auto itemList = _tree.findItems(name, Qt::MatchFixedString, 0); int index; if (itemList.isEmpty()) return; index = _tree.indexOfTopLevelItem(itemList[0]); if (index >= 0) _tree.takeTopLevelItem(index); } /** * @brief Create KsTasksCheckBoxWidget. * * @param stream: Input location for a Data stream pointer. * @param cond: If True make a "Show Task" widget. Otherwise make "Hide Task". * @param parent: The parent of this widget. */ KsTasksCheckBoxWidget::KsTasksCheckBoxWidget(kshark_data_stream *stream, bool cond, QWidget *parent) : KsCheckBoxTableWidget(stream->stream_id, "Tasks", parent), _cond(cond) { QTableWidgetItem *pidItem, *comItem; KsPlot::ColorTable colors; QStringList headers; kshark_entry entry; const char *comm; int nTasks, pid; if (_cond) headers << "Show" << "Pid" << "Task"; else headers << "Hide" << "Pid" << "Task"; _id = KsUtils::getPidList(stream->stream_id); nTasks = _id.count(); _initTable(headers, nTasks); colors = KsPlot::taskColorTable(); entry.stream_id = stream->stream_id; entry.visible = 0xff; for (int i = 0; i < nTasks; ++i) { entry.pid = pid = _id[i]; pidItem = new QTableWidgetItem(tr("%1").arg(pid)); _table.setItem(i, 1, pidItem); comm = kshark_get_task(&entry); comItem = new QTableWidgetItem(tr(comm)); pidItem->setBackground(QColor(colors[pid].r(), colors[pid].g(), colors[pid].b())); if (_id[i] == 0) pidItem->setForeground(Qt::white); _table.setItem(i, 2, comItem); } _adjustSize(); } /** * @brief Create KsPluginCheckBoxWidget. * * @param sd: Data stream identifier. * @param pluginList: A list of plugin names. * @param parent: The parent of this widget. */ KsPluginCheckBoxWidget::KsPluginCheckBoxWidget(int sd, QStringList pluginList, QWidget *parent) : KsCheckBoxTableWidget(sd, "Manage plugins", parent) { QTableWidgetItem *nameItem, *infoItem; QStringList headers; int nPlgins; headers << "Load" << "Name" << "Info"; nPlgins = pluginList.count(); _initTable(headers, nPlgins); _id.resize(nPlgins); for (int i = 0; i < nPlgins; ++i) { if (pluginList[i].size() < 30) { nameItem = new QTableWidgetItem(pluginList[i]); } else { QLabel l; KsUtils::setElidedText(&l, pluginList[i], Qt::ElideLeft, FONT_WIDTH * 30); nameItem = new QTableWidgetItem(l.text()); } _table.setItem(i, 1, nameItem); infoItem = new QTableWidgetItem(" -- "); _table.setItem(i, 2, infoItem); _id[i] = i; } _adjustSize(); } /** * @brief Set the "Info" field inside the table of the widget. * * @param row: The row number in the table. * @param info: The "Info" string to be shown. */ void KsPluginCheckBoxWidget::setInfo(int row, QString info) { QTableWidgetItem *infoItem = _table.item(row, 2); infoItem->setText(info); } /** * @brief Set the "Active" field inside the table of the widget. * * @param rows: The row numbers in the table. * @param a: Are those plugins active. */ void KsPluginCheckBoxWidget::setActive(QVector rows, bool a) { for (auto const &r: rows) { QTableWidgetItem *infoItem = _table.item(r, 2); if (a) { infoItem->setText("- Active"); infoItem->setForeground(QBrush(QColor(0, 220, 80))); } else { infoItem->setText("- Not Active"); infoItem->setForeground(QBrush(QColor(255, 50, 50))); } } } void KsPluginsCheckBoxDialog::_postApplyAction() { emit _data->updateWidgets(_data); } /** * @brief Create KsDStreamCheckBoxWidget. * * @param parent: The parent of this widget. */ KsDStreamCheckBoxWidget::KsDStreamCheckBoxWidget(QWidget *parent) : KsCheckBoxTableWidget(-1, "Select Data stream", parent) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; QTableWidgetItem *nameItem; QVector streamIds; QStringList headers; int nStreams; if (!kshark_instance(&kshark_ctx)) return; headers << "Apply" << "To stream"; streamIds = KsUtils::getStreamIdList(kshark_ctx); nStreams = streamIds.size(); _initTable(headers, nStreams); _id.resize(nStreams); for (int i = 0; i < nStreams; ++i) { stream = kshark_ctx->stream[streamIds[i]]; QString name = KsUtils::streamDescription(stream); if (name.size() < 40) { nameItem = new QTableWidgetItem(name); } else { QLabel l; KsUtils::setElidedText(&l, name, Qt::ElideLeft, FONT_WIDTH * 40); nameItem = new QTableWidgetItem(l.text()); } _table.setItem(i, 1, nameItem); _id[i] = stream->stream_id; } _adjustSize(); } /** * @brief Create KsEventFieldSelectWidget. * * @param parent: The parent of this widget. */ KsEventFieldSelectWidget::KsEventFieldSelectWidget(QWidget *parent) : QWidget(parent), _streamLabel("Data stream", this), _eventLabel("Event (type in for searching)", this), _fieldLabel("Field", this) { auto lamAddLine = [&] { QFrame* line = new QFrame(); QSpacerItem *spacer = new QSpacerItem(1, FONT_HEIGHT / 2, QSizePolicy::Expanding, QSizePolicy::Minimum); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); _topLayout.addSpacerItem(spacer); _topLayout.addWidget(line); }; _topLayout.addWidget(&_streamLabel); _topLayout.addWidget(&_streamComboBox); /* * Using the old Signal-Slot syntax because QComboBox::currentIndexChanged * has overloads. */ connect(&_streamComboBox, &QComboBox::currentIndexChanged, this, &KsEventFieldSelectWidget::_streamChanged); lamAddLine(); _topLayout.addWidget(&_eventLabel); _topLayout.addWidget(&_eventComboBox); _eventComboBox.setEditable(true); _eventComboBox.view()->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); _eventComboBox.setMaxVisibleItems(25); /* * Using the old Signal-Slot syntax because QComboBox::currentIndexChanged * has overloads. */ connect(&_eventComboBox, &QComboBox::currentIndexChanged, this, &KsEventFieldSelectWidget::_eventChanged); lamAddLine(); _topLayout.addWidget(&_fieldLabel); _topLayout.addWidget(&_fieldComboBox); lamAddLine(); setLayout(&_topLayout); } /** Populate the Data stream selection combo box. */ void KsEventFieldSelectWidget::setStreamCombo() { kshark_context *kshark_ctx(NULL); kshark_data_stream *stream; QVector streamIds; if (!kshark_instance(&kshark_ctx)) return; streamIds = KsUtils::getStreamIdList(kshark_ctx); for (auto const &sd: streamIds) { stream = kshark_ctx->stream[sd]; if (_streamComboBox.findData(sd) < 0) _streamComboBox.addItem(KsUtils::streamDescription(stream), sd); } } void KsEventFieldSelectWidget::_streamChanged(int) { int sd = _streamComboBox.currentData().toInt(); QVector eventIds = KsUtils::getEventIdList(sd); QStringList evtsList; _eventComboBox.clear(); for (auto const &eid: eventIds) evtsList << KsUtils::getEventName(sd, eid); std::sort(evtsList.begin(), evtsList.end()); _eventComboBox.addItems(evtsList); } void KsEventFieldSelectWidget::_eventChanged(int) { int sd = _streamComboBox.currentData().toInt(); QString evtName = _eventComboBox.currentText(); int eventId = KsUtils::getEventId(sd, evtName); QStringList fieldsList = KsUtils::getEventFieldsList(sd, eventId); auto lamIsValide = [&] (const QString &f) { return KsUtils::getEventFieldType(sd, eventId, f) == KS_INVALID_FIELD; }; _fieldComboBox.clear(); fieldsList.erase(std::remove_if(fieldsList.begin(), fieldsList.end(), lamIsValide), fieldsList.end()); if (fieldsList.isEmpty()) return; std::sort(fieldsList.begin(), fieldsList.end()); _fieldComboBox.addItems(fieldsList); } }; // KsWidgetsLib kernel-shark-kernelshark-v2.4.0/src/KsWidgetsLib.hpp000066400000000000000000000331651477354127100224560ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ /** * @file KsWidgetsLib.hpp * @brief Defines small widgets and dialogues used by the KernelShark GUI. */ #ifndef _KS_WIDGETS_LIB_H #define _KS_WIDGETS_LIB_H // Qt #include // KernelShark #include "libkshark.h" #include "KsUtils.hpp" namespace KsWidgetsLib { /** * The KsProgressBar class provides a visualization of the progress of a * running job. */ class KsProgressBar : public QWidget { Q_OBJECT QStatusBar _sb; QProgressBar _pb; public: KsProgressBar(QString message, QWidget *parent = nullptr); virtual ~KsProgressBar(); void setValue(int i); void workInProgress(); private: bool _notDone; }; /** Defines the progress bar's maximum value. */ #define KS_PROGRESS_BAR_MAX 200 /** The height of the KsProgressBar widget. */ #define KS_PROGBAR_HEIGHT (FONT_HEIGHT * 5) /** The width of the KsProgressBar widget. */ #define KS_PROGBAR_WIDTH (FONT_WIDTH * 50) /** Data Work identifiers. */ enum class KsDataWork { AnyWork, EditPlotList, ZoomIn, QuickZoomIn, ZoomOut, QuickZoomOut, ScrollLeft, ScrollRight, JumpTo, GraphUpdateGeom, UpdatePlugins, ResizeGL, RenderGL, }; /** Defines hash function needed by the QSet tempate container class. */ inline uint qHash(KsDataWork key, uint seed) { /* * Cast the enum class to uint and use the definition of qHash outside * the current scope. */ return ::qHash(static_cast(key), seed); } /** * The KsWorkInProgress class provides a widget showing the * "work in progress" notification. */ class KsWorkInProgress : public QWidget { public: explicit KsWorkInProgress(QWidget *parent = nullptr); void show(KsDataWork w); void hide(KsDataWork w); bool isBusy(KsDataWork w = KsDataWork::AnyWork) const; void addToStatusBar(QStatusBar *sb); private: QLabel _icon, _message; QSet _works; }; /** * The KsDataWidget class provides a base widget that provides the capability * to show the "work in progress" notification. The class must be inherited by * the widgets performing heavy data processing operations. */ class KsDataWidget : public QWidget { public: /** * @brief Create KsDataWidget. * * @param parent: The parent of this widget. */ explicit KsDataWidget(QWidget *parent = nullptr) : QWidget(parent), _workInProgress(nullptr) {} /** Set the pointer to the KsWorkInProgress widget. */ void setWipPtr(KsWorkInProgress *wip) { _workInProgress = wip; } /** * Call this function when a given work is about to start in order to * show the "work in progress" notification. */ void startOfWork(KsDataWork w) { if (_workInProgress) _workInProgress->show(w); } /** * Call this function when a given work is done in order to hide the * "work in progress" notification. */ void endOfWork(KsDataWork w) { if (_workInProgress) _workInProgress->hide(w); } /** Check if the GUI is busy processing data. */ bool isBusy(KsDataWork w = KsDataWork::AnyWork) const { return _workInProgress ? _workInProgress->isBusy(w) : false; } private: KsWorkInProgress *_workInProgress; }; /** * The KsMessageDialog class provides a widget showing a message and having * a "Close" button. */ class KsMessageDialog : public QDialog { QVBoxLayout _layout; QLabel _text; QPushButton _closeButton; public: explicit KsMessageDialog(QWidget *parent) = delete; KsMessageDialog(QString message, QWidget *parent = nullptr); }; /** The height of the KsMessageDialog widget. */ #define KS_MSG_DIALOG_HEIGHT (FONT_HEIGHT * 8) /** The width of the KsMessageDialog widget. */ #define KS_MSG_DIALOG_WIDTH (SCREEN_WIDTH / 10) bool fileExistsDialog(QString fileName); /** * The KsTimeOffsetDialog class provides a dialog used to enter the value of * the time offset between two Data streams. */ class KsTimeOffsetDialog : public QDialog { Q_OBJECT public: explicit KsTimeOffsetDialog(QWidget *parent = nullptr); static double getValueNanoSec(QString dataFile, bool *ok); signals: /** Signal emitted when the "Apply" button is pressed. */ void apply(int sd, double val); private: QInputDialog _input; QComboBox _streamCombo; private slots: void _setDefault(int index); }; /** * The KsCheckBoxWidget class is the base class of all CheckBox widget used * by KernelShark. */ class KsCheckBoxWidget : public QWidget { Q_OBJECT public: KsCheckBoxWidget(int sd, const QString &name = "", QWidget *parent = nullptr); /** Get the name of the widget. */ QString name() const {return _name;} /** Get the state of the "all" checkbox. */ bool all() const { if(_allCb.checkState() == Qt::Checked) return true; return false; } /** The "all" checkbox to be visible or not. */ void setVisibleCbAll(bool v) {_allCbAction->setVisible(v);} void setDefault(bool); void set(QVector v); /** * Get a vector containing all Ids (can be PID CPU Ids etc.) managed * by this widget. */ QVector getIds() const {return _id;} QVector getCheckedIds(); QVector getStates(); /** * Get the identifier of the Data stream for which the selection * applies. */ int sd() const {return _sd;} /** The user provided an input. The widget has been modified. */ bool _userInput; protected: /** * Reimplemented event handler used to update the geometry of the widget on * resize events. */ void resizeEvent([[maybe_unused]] QResizeEvent* event) override { KsUtils::setElidedText(&_streamLabel, _streamName, Qt::ElideLeft, width()); QApplication::processEvents(); } protected: QToolBar _tb; /** Identifier of the Data stream for which the selection applies. */ int _sd; /** The "all" checkbox. */ QCheckBox _allCb; /** A vector of Id numbers coupled to each checkbox. */ QVector _id; /** A nested widget used to position the checkboxes. */ QWidget _cbWidget; /** The layout of the nested widget. */ QVBoxLayout _cbLayout; /** The top level layout of this widget. */ QVBoxLayout _topLayout; private: QAction *_allCbAction; /** * The name of this Data stream. Typically this will be the name of * the data file. */ QString _streamName; /** * A label to show the name of the Data stream for which the selection * applies. */ QLabel _streamLabel; /** The name of this widget. */ QString _name; /** A label to show the name of the widget. */ QLabel _nameLabel; virtual void _setCheckState(int i, Qt::CheckState st) = 0; virtual Qt::CheckState _checkState(int i) const = 0; virtual void _verify() {}; void _checkAll(bool); void _setStream(int8_t sd); }; /** * The KsCheckBoxDialog class is the base class of all CheckBox dialogs * used by KernelShark. */ class KsCheckBoxDialog : public QDialog { Q_OBJECT public: KsCheckBoxDialog() = delete; KsCheckBoxDialog(QVector cbws, QWidget *parent = nullptr); /** * The "apply" signal will emit a vector containing the Ids of all * checked checkbox. */ void applyIds(bool v = true) {_applyIds = v;} /** * The "apply" signal will emit a vector containing the statuse of all * checkbox. */ void applyStatus(bool v = true) {_applyIds = !v;} signals: /** Signal emitted when the "Apply" button is pressed. */ void apply(int sd, QVector); private: void _applyPress(); virtual void _preApplyAction() {} virtual void _postApplyAction() {} bool _applyIds; QVBoxLayout _topLayout; QHBoxLayout _cbLayout, _buttonLayout; QVector _checkBoxWidgets; QPushButton _applyButton, _cancelButton; QMetaObject::Connection _applyButtonConnection; }; /** * The KsPluginsCheckBoxDialog provides dialog for selecting plugins. * used by KernelShark. The class is used to override _postApplyAction(). */ class KsPluginsCheckBoxDialog : public KsCheckBoxDialog { public: KsPluginsCheckBoxDialog() = delete; /** Create KsPluginsCheckBoxDialog. */ KsPluginsCheckBoxDialog(QVector cbws, KsDataStore *d, QWidget *parent = nullptr) : KsCheckBoxDialog(cbws, parent), _data(d) {} private: virtual void _postApplyAction() override; KsDataStore *_data; }; /** The KsCheckBoxTable class provides a table of checkboxes. */ class KsCheckBoxTable : public QTableWidget { Q_OBJECT public: explicit KsCheckBoxTable(QWidget *parent = nullptr); void init(QStringList headers, int size); /** A vector of checkboxes. */ QVector _cb; signals: /** Signal emitted when a checkboxes changes state. */ void changeState(int row); protected: void keyPressEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; private: void _doubleClicked(int row, int col); }; /** * The KsCheckBoxTableWidget class provides a widget to hold a table of * checkboxes. */ class KsCheckBoxTableWidget : public KsCheckBoxWidget { Q_OBJECT public: KsCheckBoxTableWidget(int sd, const QString &name = "", QWidget *parent = nullptr); /** Only one checkbox at the time can be checked. */ void setSingleSelection() { _table.setSelectionMode(QAbstractItemView::SingleSelection); setVisibleCbAll(false); } protected: void _adjustSize(); void _initTable(QStringList headers, int size); /** The KsCheckBoxTable, shown by this widget. */ KsCheckBoxTable _table; private: void _setCheckState(int i, Qt::CheckState st) override { _table._cb[i]->setCheckState(st); } Qt::CheckState _checkState(int i) const override { return _table._cb[i]->checkState(); } void _update(bool); void _changeState(int row); }; /** The KsCheckBoxTree class provides a tree of checkboxes. */ class KsCheckBoxTree : public QTreeWidget { Q_OBJECT public: explicit KsCheckBoxTree(QWidget *parent = nullptr); signals: /** * Signal emitted when a checkboxes of the tree changes its state * and the state of all toplevel and child checkboxes has to be * reprocesed. */ void verify(); protected: void keyPressEvent(QKeyEvent *event) override; void mousePressEvent(QMouseEvent *event) override; private: void _doubleClicked(QTreeWidgetItem *item, int col); }; /** * The KsCheckBoxTreeWidget class provides a widget to hold a tree of * checkboxes. */ class KsCheckBoxTreeWidget : public KsCheckBoxWidget { Q_OBJECT public: KsCheckBoxTreeWidget() = delete; KsCheckBoxTreeWidget(int sd, const QString &name = "", QWidget *parent = nullptr); /** Only one checkbox at the time can be checked. */ void setSingleSelection() { _tree.setSelectionMode(QAbstractItemView::SingleSelection); setVisibleCbAll(false); } protected: void _adjustSize(); void _initTree(); /** The KsCheckBoxTree, shown by this widget. */ KsCheckBoxTree _tree; /** A vector of Tree items (checkboxes). */ QVector _cb; private: void _setCheckState(int i, Qt::CheckState st) override { _cb[i]->setCheckState(0, st); } Qt::CheckState _checkState(int i) const override { return _cb[i]->checkState(0); } void _update(QTreeWidgetItem *item, int column); void _verify(); }; /** * The KsCPUCheckBoxWidget class provides a widget for selecting CPU plots to * show. */ struct KsCPUCheckBoxWidget : public KsCheckBoxTreeWidget { KsCPUCheckBoxWidget() = delete; KsCPUCheckBoxWidget(kshark_data_stream *stream, QWidget *parent = nullptr); private: /** The "hide empty" checkbox. */ QCheckBox _hideEmpty; }; /** * The KsTasksCheckBoxWidget class provides a widget for selecting Tasks * to show or hide. */ struct KsTasksCheckBoxWidget : public KsCheckBoxTableWidget { KsTasksCheckBoxWidget() = delete; KsTasksCheckBoxWidget(kshark_data_stream *stream, bool cond = true, QWidget *parent = nullptr); private: /** * A positive condition means that you want to show Tasks and * a negative condition means that you want to hide Tasks. */ bool _cond; }; /** * The KsEventsCheckBoxWidget class provides a widget for selecting Trace * events to show or hide. */ struct KsEventsCheckBoxWidget : public KsCheckBoxTreeWidget { KsEventsCheckBoxWidget() = delete; KsEventsCheckBoxWidget(kshark_data_stream *stream, QWidget *parent = nullptr); QStringList getCheckedEvents(bool option); void removeSystem(QString name); private: void _makeItems(kshark_data_stream *stream, QVector eventIds); void _makeTepEventItems(kshark_data_stream *stream, QVector eventIds); }; /** * The KsPluginCheckBoxWidget class provides a widget for selecting plugins. */ struct KsPluginCheckBoxWidget : public KsCheckBoxTableWidget { KsPluginCheckBoxWidget() = delete; KsPluginCheckBoxWidget(int sd, QStringList pluginList, QWidget *parent = nullptr); void setInfo(int row, QString info); void setActive(QVector rows, bool a); }; /** * The KsDStreamCheckBoxWidget class provides a widget for selecting Data streams. */ struct KsDStreamCheckBoxWidget : public KsCheckBoxTableWidget { explicit KsDStreamCheckBoxWidget(QWidget *parent = nullptr); }; /** * The KsEventFieldSelectWidget class provides a widget for selecting a data * field of the trace event. */ class KsEventFieldSelectWidget : public QWidget { Q_OBJECT public: explicit KsEventFieldSelectWidget(QWidget *parent = nullptr); /** Get the currently selected stream Id. */ int streamId() const {return _streamComboBox.currentData().toInt();} /** Get the currently selected event name. */ QString eventName() const {return _eventComboBox.currentText();} /** Get the currently selected field name. */ QString fieldName() const {return _fieldComboBox.currentText();} void setStreamCombo(); private slots: void _streamChanged(int); void _eventChanged(int); private: QVBoxLayout _topLayout; QComboBox _streamComboBox, _eventComboBox, _fieldComboBox; QLabel _streamLabel, _eventLabel, _fieldLabel; }; }; // KsWidgetsLib #endif kernel-shark-kernelshark-v2.4.0/src/kernelshark.cpp000066400000000000000000000073371477354127100224310ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov */ // C #include #include // Qt #include // KernelShark #include "KsCmakeDef.hpp" #include "KsMainWindow.hpp" #define default_input_file (char*)"trace.dat" static char *prior_input_file; QStringList appInputFiles; void usage(const char *prog) { printf("Usage: %s\n", prog); printf(" -h Display this help message\n"); printf(" -v Display version and exit\n"); printf(" -i prior input file, default is %s\n", default_input_file); printf(" -a input file to append to the prior\n"); printf(" -p register plugin, use plugin name, absolute or relative path\n"); printf(" -u unregister plugin, use plugin name or absolute path\n"); printf(" -s import a session\n"); printf(" -l import the last session\n"); puts(" --cpu show plots for CPU cores, default is \"show all\""); puts(" --pid show plots for tasks (by PID), default is \"do not show\""); puts(" --task show plots for tasks (by name), default is \"do not show\""); puts("\n example:"); puts(" kernelshark -i mytrace.dat --cpu 1,4-7 --pid 11 -p path/to/my/plugin/myplugin.so\n"); } #define KS_LONG_OPTS 0 static option longOptions[] = { {"help", no_argument, nullptr, 'h'}, {"pid", required_argument, nullptr, KS_LONG_OPTS}, {"cpu", required_argument, nullptr, KS_LONG_OPTS}, {"task", required_argument, nullptr, KS_LONG_OPTS}, {nullptr, 0, nullptr, 0} }; int main(int argc, char **argv) { QVector cpuPlots, taskPlots; bool fromSession = false; int optionIndex = 0; QString taskList; int c; QApplication::setDesktopFileName(KS_APP_NAME); QApplication a(argc, argv); KsMainWindow ks; ks.show(); while ((c = getopt_long(argc, argv, "hvi:a:p:u:s:l", longOptions, &optionIndex)) != -1) { switch(c) { case KS_LONG_OPTS: if (strcmp(longOptions[optionIndex].name, "cpu") == 0) cpuPlots.append(KsUtils::parseIdList(QString(optarg))); else if (strcmp(longOptions[optionIndex].name, "pid") == 0) taskPlots.append(KsUtils::parseIdList(QString(optarg))); else if (strcmp(longOptions[optionIndex].name, "task") == 0) taskList = QString(optarg); break; case 'h': usage(argv[0]); return 0; case 'v': printf("%s - %s\n", basename(argv[0]), KS_VERSION_STRING); return 0; case 'i': prior_input_file = optarg; break; case 'a': appInputFiles << QString(optarg).split(" ", KS_SPLIT_SkipEmptyParts); break; case 'p': ks.registerPlugins(QString(optarg)); break; case 'u': ks.unregisterPlugins(QString(optarg)); break; case 's': ks.loadSession(QString(optarg)); fromSession = true; break; case 'l': ks.loadSession(ks.lastSessionFile()); fromSession = true; break; default: break; } } if (!fromSession) { if ((argc - optind) >= 1) { if (prior_input_file) usage(argv[0]); prior_input_file = argv[optind]; } if (!prior_input_file) { struct stat st; if (stat(default_input_file, &st) == 0) prior_input_file = default_input_file; } if (prior_input_file) ks.loadDataFile(QString(prior_input_file)); for (auto const &f: appInputFiles) ks.appendDataFile(f); } auto lamOrderIds = [] (QVector &ids) { /* Sort and erase duplicates. */ std::sort(ids.begin(), ids.end()); ids.erase(std::unique(ids.begin(), ids.end()), ids.end()); return ids; }; if (cpuPlots.count() || taskPlots.count() || taskList.size()) { ks.setCPUPlots(0, lamOrderIds(cpuPlots)); auto pidMap = KsUtils::parseTaskList(taskList); pidMap[0].append(taskPlots); for (auto it = pidMap.begin(); it != pidMap.end(); ++it) { ks.setTaskPlots(it.key(), lamOrderIds(it.value())); } } ks.raise(); return a.exec(); } kernel-shark-kernelshark-v2.4.0/src/kshark-record.cpp000066400000000000000000000007011477354127100226430ustar00rootroot00000000000000// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ // C #include // KernelShark #include "KsCaptureDialog.hpp" int main(int argc, char **argv) { QApplication a(argc, argv); KsCaptureDialog cd; int c; while ((c = getopt(argc, argv, "o:")) != -1) { switch(c) { case 'o': cd.setOutputFileName(QString(optarg)); break; } } cd.show(); return a.exec(); } kernel-shark-kernelshark-v2.4.0/src/libkshark-collection.c000066400000000000000000000612141477354127100236550ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark-collection.c * @brief Data Collections. */ // C #include #include #include #include #include #include // KernelShark #include "libkshark.h" /* Quiet warnings over documenting simple structures */ //! @cond Doxygen_Suppress enum collection_point_type { COLLECTION_IGNORE = 0, COLLECTION_RESUME, COLLECTION_BREAK, }; #define LAST_BIN -3 struct entry_list { struct entry_list *next; size_t index; uint8_t type; }; enum map_flags { COLLECTION_BEFORE = -1, COLLECTION_INSIDE = 0, COLLECTION_AFTER = 1, }; //! @endcond /* * If the type of the last added entry is COLLECTION_IGNORE, overwrite this * entry (ignore the old entry values). Else add a new entry to the list. */ static bool collection_add_entry(struct entry_list **list, size_t i, uint8_t type) { struct entry_list *entry = *list; if (entry->type != COLLECTION_IGNORE) { entry->next = malloc(sizeof(*entry)); if (!entry->next) return false; entry = entry->next; *list = entry; } entry->index = i; entry->type = type; return true; } static struct kshark_entry_collection * kshark_data_collection_alloc(struct kshark_context *kshark_ctx, struct kshark_entry **data, ssize_t first, size_t n_rows, matching_condition_func cond, int sd, int *values, int n_val, size_t margin) { struct kshark_entry_collection *col_ptr = NULL; struct kshark_entry *last_vis_entry = NULL; struct entry_list *col_list, *temp; size_t resume_count = 0, break_count = 0; size_t i, j, last_added = 0; ssize_t end; bool good_data = false; /* Create the collection. */ col_ptr = calloc(1, sizeof(*col_ptr)); if (!col_ptr) goto fail; end = first + n_rows - margin; if (first >= end) return col_ptr; col_list = malloc(sizeof(*col_list)); if (!col_list) goto fail; temp = col_list; if (margin != 0) { /* * If this collection includes margin data, add a margin data * interval at the very beginning of the data-set. */ temp->index = first; temp->type = COLLECTION_RESUME; ++resume_count; collection_add_entry(&temp, first + margin - 1, COLLECTION_BREAK); ++break_count; } else { temp->type = COLLECTION_IGNORE; } for (i = first + margin; i < (size_t) end; ++i) { if (!cond(kshark_ctx, data[i], sd, values)) { /* * The entry is irrelevant for this collection. * Do nothing. */ continue; } /* The Matching condition is satisfed. */ if (!good_data) { /* * Resume the collection here. Add some margin data * in front of the data of interest. */ good_data = true; if (last_added == 0 || last_added < i - margin) { collection_add_entry(&temp, i - margin, COLLECTION_RESUME); ++resume_count; } else { /* * Ignore the last collection Break point. * Continue extending the previous data * interval. */ temp->type = COLLECTION_IGNORE; --break_count; } } else if (good_data && data[i]->next && !cond(kshark_ctx, data[i]->next, sd, values)) { /* * Break the collection here. Add some margin data * after the data of interest. */ good_data = false; last_vis_entry = data[i]; /* Keep adding entries until the "next" record. */ for (j = i + 1; j != (size_t) end && last_vis_entry->next != data[j]; j++); /* * If the number of added entries is smaller than the * number of margin entries requested, keep adding * until you fill the margin. */ if (i + margin >= j) { for (;j < i + margin; ++j) { if (cond(kshark_ctx, data[j], sd, values)) { /* * Good data has been found. * Continue extending the * previous data interval. */ good_data = true; break; } } } last_added = i = j; if (!good_data) { collection_add_entry(&temp, i, COLLECTION_BREAK); ++break_count; } } } if (good_data) { collection_add_entry(&temp, end - 1, COLLECTION_BREAK); ++break_count; } if (margin != 0) { /* * If this collection includes margin data, add a margin data * interval at the very end of the data-set. */ collection_add_entry(&temp, first + n_rows - margin, COLLECTION_RESUME); ++resume_count; collection_add_entry(&temp, first + n_rows - 1, COLLECTION_BREAK); ++break_count; } /* * If everything is OK, we must have pairs of COLLECTION_RESUME * and COLLECTION_BREAK points. */ assert(break_count == resume_count); col_ptr->next = NULL; col_ptr->resume_points = calloc(resume_count, sizeof(*col_ptr->resume_points)); if (!col_ptr->resume_points) goto fail; col_ptr->break_points = calloc(break_count, sizeof(*col_ptr->break_points)); if (!col_ptr->break_points) { free(col_ptr->resume_points); goto fail; } col_ptr->cond = cond; col_ptr->n_val = n_val; col_ptr->stream_id = sd; col_ptr->values = malloc(n_val * sizeof(*col_ptr->values)); memcpy(col_ptr->values, values, n_val * sizeof(*col_ptr->values)); col_ptr->size = resume_count; if (!col_ptr->size) free(col_list); for (i = 0; i < col_ptr->size; ++i) { assert(col_list->type == COLLECTION_RESUME); col_ptr->resume_points[i] = col_list->index; temp = col_list; col_list = col_list->next; free(temp); assert(col_list->type == COLLECTION_BREAK); col_ptr->break_points[i] = col_list->index; temp = col_list; col_list = col_list->next; free(temp); } return col_ptr; fail: fprintf(stderr, "Failed to allocate memory for Data collection.\n"); free(col_ptr); for (i = 0; i < resume_count + break_count; ++i) { temp = col_list; col_list = col_list->next; free(temp); } return NULL; } /* * This function provides mapping between the index inside the data-set and * the index of the collection interval. Additional output flag is used to * resolve the ambiguity of the mapping. If the value of the flag is * COLLECTION_INSIDE, the "source_index" is inside the returned interval. If * the value of the flag is COLLECTION_BEFORE, the "source_index" is inside * the gap before the returned interval. If the value of the flag is * COLLECTION_AFTER, the "source_index" is inside the gap after the returned * interval. */ static ssize_t map_collection_index_from_source(const struct kshark_entry_collection *col, size_t source_index, int *flag) { size_t l, h, mid; if (!col->size) return KS_EMPTY_BIN; l = 0; h = col->size - 1; if (source_index < col->resume_points[l]) { *flag = COLLECTION_BEFORE; return l; } if (source_index >= col->resume_points[h]) { if (source_index < col->break_points[h]) *flag = COLLECTION_INSIDE; else *flag = COLLECTION_AFTER; return h; } BSEARCH(h, l, source_index > col->resume_points[mid]); if (source_index <= col->break_points[l]) *flag = COLLECTION_INSIDE; else *flag = COLLECTION_AFTER; return l; } static ssize_t map_collection_request_init(const struct kshark_entry_collection *col, struct kshark_entry_request *req, bool front, size_t *end) { int col_index_flag; size_t col_index; size_t req_end; ssize_t ret; if (req->next || col->size == 0) { fprintf(stderr, "Unexpected input in map_collection_request_init()\n"); goto do_nothing; } req_end = front ? req->first + req->n - 1 : req->first - req->n + 1; /* * Find the first Resume Point of the collection which is equal or * greater than the first index of this request. */ ret = map_collection_index_from_source(col, req->first, &col_index_flag); if (ret == KS_EMPTY_BIN) { /* Empty collection. */ goto do_nothing; } col_index = ret; /* * The value of "col_index" is ambiguous. Use the "col_index_flag" to * deal with all possible cases. */ if (col_index_flag == COLLECTION_AFTER) { /* * This request starts after the end of interval "col_index". */ if (front && (col_index == col->size - 1 || req_end < col->resume_points[col_index + 1])) { /* * No overlap between the collection and this front * request. Do nothing. */ goto do_nothing; } else if (!front && req_end > col->break_points[col_index]) { /* * No overlap between the collection and this back * request. Do nothing. */ goto do_nothing; } /* Remember that the initial request starts in the gap between * the end of "col_index" interval and the beginning of * "col_index + 1" interval. If we process a Front request, we * have to go forwards, so the proper place for starting our * search will be the Resume point of the "col_index + 1" * interval. However, if we process a Back request, we will be * going backwards, so the proper place to start will be the * Break point of "col_index". */ req->first = front ? col->resume_points[++col_index] : col->break_points[col_index]; } if (col_index_flag == COLLECTION_BEFORE) { /* * This request starts before the beginning of interval * "col_index". */ if (!front && (col_index == 0 || req_end > col->break_points[col_index - 1])) { /* * No overlap between the collection and this back * request. Do nothing. */ goto do_nothing; } else if (front && req_end < col->resume_points[col_index]) { /* * No overlap between the collection and this front * request. Do nothing. */ goto do_nothing; } /* Remember that the initial request starts in the gap between * the end of "col_index - 1" interval and the beginning of * "col_index" interval. If we process a Front request, we have * to go forwards, so the proper place for starting our search * will be the Resume point of the "col_index" interval. * However, if we process a Back request, we will be going * backwards, so the proper place to start will be the Break * point of "col_index - 1". */ req->first = front ? col->resume_points[col_index] : col->break_points[--col_index]; } *end = req_end; return col_index; do_nothing: *end = KS_EMPTY_BIN; return KS_EMPTY_BIN; } /* * This function uses the intervals of the Data collection to transform the * inputted single data request into a list of data requests. The new list of * request will ignore the data outside of the intervals of the collection. */ static int map_collection_back_request(const struct kshark_entry_collection *col, struct kshark_entry_request *req) { size_t req_first, req_end; size_t col_index; int req_count; ssize_t ret; ret = map_collection_request_init(col, req, false, &req_end); if (ret == KS_EMPTY_BIN) return 0; col_index = ret; /* * Now loop over the intervals of the collection going backwards till * the end of the inputted request and create a separate request for * each of those interest. */ req_count = 1; while (req_end <= col->break_points[col_index]) { if (req_end >= col->resume_points[col_index]) { /* * The last entry of the original request is inside * the "col_index" collection interval. Close the * collection request here and return. */ req->n = req->first - req_end + 1; break; } /* * The last entry of the original request is outside of the * "col_index" interval. Close the collection request at the * end of this interval and move to the next one. Try to make * another request there. */ req->n = req->first - col->resume_points[col_index] + 1; --col_index; if (req_end > col->break_points[col_index]) { /* * The last entry of the original request comes before * the end of the next collection interval. Stop here. */ break; } if (col_index > 0) { /* Make a new request. */ req_first = col->break_points[col_index]; req->next = kshark_entry_request_alloc(req_first, 0, req->cond, req->sd, req->values, req->vis_only, req->vis_mask); if (!req->next) goto fail; req = req->next; ++req_count; } } return req_count; fail: fprintf(stderr, "Failed to allocate memory for Collection data request.\n"); return -ENOMEM; } /* * This function uses the intervals of the Data collection to transform the * inputted single data request into a list of data requests. The new list of * requests will ignore the data outside of the intervals of the collection. */ static int map_collection_front_request(const struct kshark_entry_collection *col, struct kshark_entry_request *req) { size_t req_first, req_end; size_t col_index; int req_count; ssize_t ret; ret = map_collection_request_init(col, req, true, &req_end); if (ret == KS_EMPTY_BIN) return 0; col_index = ret; /* * Now loop over the intervals of the collection going forwards till * the end of the inputted request and create a separate request for * each of those interest. */ req_count = 1; while (col_index < col->size && req_end >= col->resume_points[col_index]) { if (req_end <= col->break_points[col_index]) { /* * The last entry of the original request is inside * the "col_index" collection interval. * Close the collection request here and return. */ req->n = req_end - req->first + 1; break; } /* * The last entry of the original request is outside this * collection interval (col_index). Close the collection * request at the end of the interval and move to the next * interval. Try to make another request there. */ req->n = col->break_points[col_index] - req->first + 1; ++col_index; if (req_end < col->resume_points[col_index]) { /* * The last entry of the original request comes before * the beginning of next collection interval. * Stop here. */ break; } if (col_index < col->size) { /* Make a new request. */ req_first = col->resume_points[col_index]; req->next = kshark_entry_request_alloc(req_first, 0, req->cond, req->sd, req->values, req->vis_only, req->vis_mask); if (!req->next) goto fail; req = req->next; ++req_count; } } return req_count; fail: fprintf(stderr, "Failed to allocate memory for Collection data request.\n"); return -ENOMEM; } /** * @brief Search for an entry satisfying the requirements of a given Data * request. Start from the position provided by the request and go * searching in the direction of the increasing timestamps (front). * The search is performed only inside the intervals, defined by * the data collection. * * @param req: Input location for a single Data request. The imputted request * will be transformed into a list of requests. This new list of * requests will ignore the data outside of the intervals of the * collection. * @param data: Input location for the trace data. * @param col: Input location for the Data collection. * @param index: Optional output location for the index of the returned * entry inside the array. * * @returns Pointer to the first entry satisfying the matching condition on * success, or NULL on failure. * In the special case when some entries, satisfying the Matching * condition function have been found, but all these entries have * been discarded because of the visibility criteria (filtered * entries), the function returns a pointer to a special * "Dummy entry". */ const struct kshark_entry * kshark_get_collection_entry_front(struct kshark_entry_request *req, struct kshark_entry **data, const struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry = NULL; int req_count; if (index) *index = KS_EMPTY_BIN; /* * Use the intervals of the Data collection to redefine the data * request in a way which will ignore the data outside of the * intervals of the collection. */ req_count = map_collection_front_request(col, req); if (req_count <= 0) return NULL; /* * Loop over the list of redefined requests and search until you find * the first matching entry. */ while (req) { entry = kshark_get_entry_front(req, data, index); if (entry) break; req = req->next; } return entry; } /** * @brief Search for an entry satisfying the requirements of a given Data * request. Start from the position provided by the request and go * searching in the direction of the decreasing timestamps (back). * The search is performed only inside the intervals, defined by * the data collection. * * @param req: Input location for Data request. The imputed request * will be transformed into a list of requests. This new list of * requests will ignore the data outside of the intervals of the * collection. * @param data: Input location for the trace data. * @param col: Input location for the Data collection. * @param index: Optional output location for the index of the returned * entry inside the array. * * @returns Pointer to the first entry satisfying the matching condition on * success, or NULL on failure. * In the special case when some entries, satisfying the Matching * condition function have been found, but all these entries have * been discarded because of the visibility criteria (filtered * entries), the function returns a pointer to a special * "Dummy entry". */ const struct kshark_entry * kshark_get_collection_entry_back(struct kshark_entry_request *req, struct kshark_entry **data, const struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry = NULL; int req_count; if (index) *index = KS_EMPTY_BIN; /* * Use the intervals of the Data collection to redefine the data * request in a way which will ignore the data outside of the * intervals of the collection. */ req_count = map_collection_back_request(col, req); if (req_count <= 0) return NULL; /* * Loop over the list of redefined requests and search until you find * the first matching entry. */ while (req) { entry = kshark_get_entry_back(req, data, index); if (entry) break; req = req->next; } return entry; } static bool val_compare(int *val_a, int *val_b, size_t n_val) { size_t i; for (i = 0; i < n_val; ++i) if (val_a[i] != val_b[i]) return false; return true; } /** * @brief Search the list of Data collections and find the collection defined * with a given Matching condition function and value. * * @param col: Input location for the Data collection list. * @param cond: Matching condition function. * @param sd: Data stream identifier. * @param values: Array of matching condition value, used by the Matching * condition function. * @param n_val: The size of the array of Matching values. * * @returns Pointer to a Data collections on success, or NULL on failure. */ struct kshark_entry_collection * kshark_find_data_collection(struct kshark_entry_collection *col, matching_condition_func cond, int sd, int *values, size_t n_val) { while (col) { if (col->cond == cond && col->stream_id == sd && col->n_val == n_val && val_compare(col->values, values, n_val)) return col; col = col->next; } return NULL; } /** * @brief Clear all data intervals of the given Data collection. * * @param col: Input location for the Data collection. */ void kshark_reset_data_collection(struct kshark_entry_collection *col) { free(col->resume_points); col->resume_points = NULL; free(col->break_points); col->break_points = NULL; col->size = 0; } static void kshark_free_data_collection(struct kshark_entry_collection *col) { free(col->resume_points); free(col->break_points); free(col->values); free(col); } /** * @brief Allocate and process data collection, defined with a given Matching * condition function and value. Add this collection to the list of * collections used by the session. * * @param kshark_ctx: Input location for the session context pointer. * @param data: Input location for the trace data. * @param n_rows: The size of the inputted data. * @param cond: Matching condition function for the collection to be * registered. * @param sd: Data stream identifier. * @param values: Array of matching condition value, used by the Matching * condition function. * @param n_val: The size of the array of Matching values. * @param margin: The size of the additional (margin) data which do not * satisfy the matching condition, but is added at the * beginning and at the end of each interval of the collection * as well as at the beginning and at the end of data-set. If * "0", no margin data is added. * * @returns Pointer to the registered Data collections on success, or NULL * on failure. */ struct kshark_entry_collection * kshark_register_data_collection(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_rows, matching_condition_func cond, int sd, int *values, size_t n_val, size_t margin) { struct kshark_entry_collection *col; col = kshark_add_collection_to_list(kshark_ctx, &kshark_ctx->collections, data, n_rows, cond, sd, values, n_val, margin); return col; } /** * @brief Allocate and process data collection, defined with a given Matching * condition function and value. Add this collection to a given list of * collections. * * @param kshark_ctx: Input location for the session context pointer. * @param col_list: Input location for the list of collections. * @param data: Input location for the trace data. * @param n_rows: The size of the inputted data. * @param cond: Matching condition function for the collection to be * registered. * @param sd: Data stream identifier. * @param values: Array of matching condition value, used by the Matching * condition function. * @param n_val: The size of the array of Matching values. * @param margin: The size of the additional (margin) data which do not * satisfy the matching condition, but is added at the * beginning and at the end of each interval of the collection * as well as at the beginning and at the end of data-set. If * "0", no margin data is added. * * @returns Pointer to the registered Data collections on success, or NULL * on failure. */ struct kshark_entry_collection * kshark_add_collection_to_list(struct kshark_context *kshark_ctx, struct kshark_entry_collection **col_list, struct kshark_entry **data, size_t n_rows, matching_condition_func cond, int sd, int *values, size_t n_val, size_t margin) { struct kshark_entry_collection *col; if (!data || n_rows == 0) return NULL; col = kshark_data_collection_alloc(kshark_ctx, data, 0, n_rows, cond, sd, values, n_val, margin); if (col) { col->next = *col_list; *col_list = col; } return col; } /** * @brief Search the list of Data collections for a collection defined * with a given Matching condition function and value. If such a * collection exists, unregister (remove and free) this collection * from the list. * * @param col: Input location for the Data collection list. * @param cond: Matching condition function of the collection to be * unregistered. * @param sd: Data stream identifier. * @param values: Array of matching condition value, used by the Matching * condition function. * @param n_val: The size of the array of Matching values. */ void kshark_unregister_data_collection(struct kshark_entry_collection **col, matching_condition_func cond, int sd, int *values, size_t n_val) { struct kshark_entry_collection **last = col; struct kshark_entry_collection *list; for (list = *col; list; list = list->next) { if (list->cond == cond && list->stream_id == sd && list->n_val == n_val && val_compare(list->values, values, n_val)) { *last = list->next; kshark_free_data_collection(list); return; } last = &list->next; } } /** * @brief Unregister all Data collections associated with a given Data stream. * * @param col: Input location for the Data collection list. * @param sd: Data stream identifier. */ void kshark_unregister_stream_collections(struct kshark_entry_collection **col, int sd) { struct kshark_entry_collection **last = col; struct kshark_entry_collection *list; list = *col; while (list) { if (list->stream_id == sd) { *last = list->next; kshark_free_data_collection(list); list = *last; continue; } last = &list->next; list = list->next; } } /** * @brief Free all Data collections in a given list. * * @param col: Input location for the Data collection list. */ void kshark_free_collection_list(struct kshark_entry_collection *col) { struct kshark_entry_collection *last; while (col) { last = col; col = col->next; kshark_free_data_collection(last); } } kernel-shark-kernelshark-v2.4.0/src/libkshark-configio.c000066400000000000000000002010471477354127100233170ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark-configio.c * @brief Json Configuration I/O. */ // C #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif // _GNU_SOURCE #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-model.h" #include "libkshark-plugin.h" #include "libkshark-tepdata.h" static struct json_object *kshark_json_config_alloc(const char *type) { json_object *jobj, *jtype; jobj = json_object_new_object(); jtype = json_object_new_string(type); if (!jobj || !jtype) goto fail; /* Set the type of this Json document. */ json_object_object_add(jobj, "type", jtype); return jobj; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jobj); json_object_put(jtype); return NULL; } /** * @brief Allocate kshark_config_doc and set its format. * * @param format: Input location for the Configuration format identifier. * Currently only Json and String formats are supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * free() to free the object. */ struct kshark_config_doc * kshark_config_alloc(enum kshark_config_formats format) { struct kshark_config_doc *doc; switch (format) { case KS_CONFIG_AUTO: case KS_CONFIG_JSON: case KS_CONFIG_STRING: doc = malloc(sizeof(*doc)); if (!doc) goto fail; doc->format = format; doc->conf_doc = NULL; return doc; default: fprintf(stderr, "Document format %d not supported\n", format); } return NULL; fail: fprintf(stderr, "Failed to allocate memory for kshark_config_doc.\n"); return NULL; } /** * @brief Create an empty Configuration document and set its format and type. * * @param type: String describing the type of the document, * e.g. "kshark.config.record" or "kshark.config.filter". * @param format: Input location for the Configuration format identifier. * Currently only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_config_new(const char *type, enum kshark_config_formats format) { struct kshark_config_doc *doc = NULL; if (format == KS_CONFIG_AUTO) format = KS_CONFIG_JSON; switch (format) { case KS_CONFIG_JSON: doc = kshark_config_alloc(format); if (doc) { doc->conf_doc = kshark_json_config_alloc(type); if (!doc->conf_doc) { free(doc); doc = NULL; } } break; case KS_CONFIG_STRING: doc = kshark_config_alloc(format); break; default: fprintf(stderr, "Document format %d not supported\n", format); return NULL; } return doc; } /** * @brief Free the Configuration document. * * @param conf: Input location for the kshark_config_doc instance. It is safe * to pass a NULL value. */ void kshark_free_config_doc(struct kshark_config_doc *conf) { if (!conf) return; switch (conf->format) { case KS_CONFIG_JSON: json_object_put(conf->conf_doc); break; case KS_CONFIG_STRING: free(conf->conf_doc); break; } free(conf); } /** * @brief Use an existing Json document to create a new KernelShark * Configuration document. * * @param jobj: Input location for the json_object instance. * * @returns shark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc *kshark_json_to_conf(struct json_object *jobj) { struct kshark_config_doc *conf = kshark_config_alloc(KS_CONFIG_JSON); if (conf) conf->conf_doc = jobj; return conf; } /** * @brief Use an existing string to create a new KernelShark Configuration * document. * * @param val: Input location for the string. * * @returns shark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc *kshark_string_to_conf(const char* val) { struct kshark_config_doc *conf; char *str; conf = kshark_config_alloc(KS_CONFIG_STRING); if (conf) { if (asprintf(&str, "%s", val) > 0) { conf->conf_doc = str; } else { fprintf(stderr, "Failed to allocate string conf. doc.\n"); free(conf); conf = NULL; } } return conf; } /** * @brief Add a field to a KernelShark Configuration document. * * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * @param key: The name of the field. * @param val: Input location for the kshark_config_doc to be added. Currently * only Json and String formats are supported. Pass KS_CONFIG_AUTO * if you want "val" to have the same fornat as "conf". Upon * calling this function, the ownership of "val" transfers to * "conf". * * @returns True on success, otherwise False. */ bool kshark_config_doc_add(struct kshark_config_doc *conf, const char *key, struct kshark_config_doc *val) { struct json_object *jobj = NULL; if (!conf || !val) return false; if (val->format == KS_CONFIG_AUTO) val->format = conf->format; switch (conf->format) { case KS_CONFIG_JSON: switch (val->format) { case KS_CONFIG_JSON: json_object_object_add(conf->conf_doc, key, val->conf_doc); break; case KS_CONFIG_STRING: jobj = json_object_new_string(val->conf_doc); if (!jobj) goto fail; json_object_object_add(conf->conf_doc, key, jobj); break; default: fprintf(stderr, "Value format %d not supported\n", val->format); return false; } free(val); break; default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jobj); return false; } static bool get_jval(struct kshark_config_doc *conf, const char *key, void **val) { return json_object_object_get_ex(conf->conf_doc, key, (json_object **) val); } /** * @brief Get the KernelShark Configuration document associate with a given * field name. * * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * @param key: The name of the field. * @param val: Output location for the kshark_config_doc instance containing * the field. Currently only Json and String formats are supported. * * @returns True, if the key exists, otherwise False. */ bool kshark_config_doc_get(struct kshark_config_doc *conf, const char *key, struct kshark_config_doc *val) { struct kshark_config_doc *tmp; if (!conf || !val) return false; if (val->format == KS_CONFIG_AUTO) val->format = conf->format; switch (conf->format) { case KS_CONFIG_JSON: switch (val->format) { case KS_CONFIG_JSON: json_object_put(val->conf_doc); if (!get_jval(conf, key, &val->conf_doc)) goto not_found; return true; case KS_CONFIG_STRING: tmp = kshark_config_alloc(KS_CONFIG_AUTO); if (!tmp) goto fail; if (!get_jval(conf, key, &tmp->conf_doc)) goto not_found; val->conf_doc = (char *) json_object_get_string(tmp->conf_doc); free(tmp); return true; default: fprintf(stderr, "Value format %d not supported\n", val->format); return false; } break; default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } return true; fail: fprintf(stderr, "Failed to get config. document <%s>.\n", key); not_found: return false; } /** * @brief Create an empty Record Configuration document. The type description * is set to "kshark.config.record". * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_record_config_new(enum kshark_config_formats format) { return kshark_config_new("kshark.config.record", format); } /** * @brief Create an empty Data Stream Configuration document. The type * description is set to "kshark.config.stream". * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_stream_config_new(enum kshark_config_formats format) { return kshark_config_new("kshark.config.stream", format); } /** * @brief Create an empty Filter Configuration document. The type description * is set to "kshark.config.filter". * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_filter_config_new(enum kshark_config_formats format) { return kshark_config_new("kshark.config.filter", format); } /** * @brief Create an empty Session Configuration document. The type description * is set to "kshark.config.filter". * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_session_config_new(enum kshark_config_formats format) { return kshark_config_new("kshark.config.session", format); } /** * @brief Create an empty Text Configuration document. The Text Configuration * documents do not use type descriptions. * * @returns kshark_config_doc instance on success, otherwise NULL. Use free() * to free the object. */ struct kshark_config_doc *kshark_string_config_alloc(void) { return kshark_config_alloc(KS_CONFIG_STRING); } static void json_del_if_exist(struct json_object *jobj, const char *key) { struct json_object *temp; if (json_object_object_get_ex(jobj, key, &temp)) json_object_object_del(jobj, key); } static bool kshark_json_type_check(struct json_object *jobj, const char *type) { struct json_object *jtype; const char *type_str; if (!json_object_object_get_ex(jobj, "type", &jtype)) return false; type_str = json_object_get_string(jtype); if (strcmp(type_str, type) != 0) return false; return true; } /** * @brief Check the type of a Configuration document and compare with an * expected value. * * @param conf: Input location for the kshark_config_doc instance. * @param type: Input location for the expected value of the Configuration * document type, e.g. "kshark.config.record" or * "kshark.config.filter". * * @returns True, if the document has the expected type, otherwise False. */ bool kshark_type_check(struct kshark_config_doc *conf, const char *type) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_json_type_check(conf->conf_doc, type); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_trace_file_to_json(const char *file, const char *name, struct json_object *jobj) { struct json_object *jfile_name, *jbuffer_name, *jtime; char abs_path[FILENAME_MAX]; struct stat st; if (!file || !jobj) return false; if (stat(file, &st) != 0) { fprintf(stderr, "Unable to find file %s\n", file); return false; } if (!realpath(file, abs_path)) { fprintf(stderr, "Unable to get absolute pathname for %s\n", file); return false; } jfile_name = json_object_new_string(abs_path); jbuffer_name = json_object_new_string(name); jtime = json_object_new_int64(st.st_mtime); if (!jfile_name || !jtime) goto fail; json_object_object_add(jobj, "file", jfile_name); json_object_object_add(jobj, "name", jbuffer_name); json_object_object_add(jobj, "time", jtime); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jobj); json_object_put(jfile_name); json_object_put(jtime); return false; } /** * @brief Record the name of a trace data file and its timestamp into a * Configuration document. * * @param file: The name of the file. * @param name: The name of the data buffer. * @param format: Input location for the Configuration format identifier. * Currently only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_export_trace_file(const char *file, const char *name, enum kshark_config_formats format) { /* Create a new Configuration document. */ struct kshark_config_doc *conf = kshark_config_new("kshark.config.data", format); if (!conf) return NULL; switch (conf->format) { case KS_CONFIG_JSON: kshark_trace_file_to_json(file, name, conf->conf_doc); return conf; default: fprintf(stderr, "Document format %d not supported\n", conf->format); kshark_free_config_doc(conf); return NULL; } } static bool kshark_trace_file_from_json(const char **file, const char **name, const char *type, struct json_object *jobj) { struct json_object *jfile_name, *jbuffer_name, *jtime; const char *file_str, *name_str; struct stat st; char *header; int64_t time; bool type_OK = true; if (!jobj) return false; if (type) { /* Make sure that the condition document has a correct type. */ type_OK = false; if (asprintf(&header, "kshark.config.%s", type) >= 0) type_OK = kshark_json_type_check(jobj, header); } if (!type_OK || !json_object_object_get_ex(jobj, "file", &jfile_name) || !json_object_object_get_ex(jobj, "name", &jbuffer_name) || !json_object_object_get_ex(jobj, "time", &jtime)) { fprintf(stderr, "Failed to retrieve data file from json_object.\n"); return false; } file_str = json_object_get_string(jfile_name); name_str = json_object_get_string(jbuffer_name); time = json_object_get_int64(jtime); if (stat(file_str, &st) != 0) { fprintf(stderr, "Unable to find file %s\n", file_str); return false; } if (st.st_mtime != time) { fprintf(stderr, "Timestamp mismatch! (%" PRIu64 "!=%li)\nFile %s\n", time, st.st_mtime, file_str); return false; } *file = file_str; *name = name_str; return true; } /* Quiet warnings over documenting simple structures */ //! @cond Doxygen_Suppress #define TOP_BUFF_NAME "top buffer" //! @endcond /** * @brief Read the name of a trace data file and its timestamp from a * Configuration document and check if such a file exists. * If the file exists, open it. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns The Id number of the data stream associated with the loaded file on * success, otherwise -1. "conf" has the ownership over the returned * string. */ int kshark_import_trace_file(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { const char *file = NULL, *name = NULL; int sd = -1; switch (conf->format) { case KS_CONFIG_JSON: if (kshark_trace_file_from_json(&file, &name, "data", conf->conf_doc)) { if (strcmp(name, KS_UNNAMED) == 0 || strcmp(name, TOP_BUFF_NAME) == 0) { sd = kshark_open(kshark_ctx, file); } else { int sd_top; sd_top = kshark_tep_find_top_stream(kshark_ctx, file); if (sd_top < 0) { /* * The "top" steam (buffer) has to be * initialized first. */ sd_top = kshark_open(kshark_ctx, file); } if (sd_top >= 0) sd = kshark_tep_open_buffer(kshark_ctx, sd_top, name); if (sd >= 0) kshark_tep_handle_plugins(kshark_ctx, sd); } } break; default: fprintf(stderr, "Document format %d not supported\n", conf->format); break; } return sd; } static bool kshark_plugin_to_json(struct kshark_plugin_list *plugin, struct json_object *jobj) { struct json_object *jname = json_object_new_string(plugin->name); if (!kshark_trace_file_to_json(plugin->file, plugin->name, jobj) || !jname) { json_object_put(jname); return false; } json_object_object_add(jobj, "name", jname); return true; } /** * @brief Record the name of a plugin's obj file and its timestamp into a * Configuration document. * * @param plugin: The plugin to be expected. * @param format: Input location for the Configuration format identifier. * Currently only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_export_plugin_file(struct kshark_plugin_list *plugin, enum kshark_config_formats format) { /* Create a new Configuration document. */ struct kshark_config_doc *conf = kshark_config_new("kshark.config.library", format); if (!conf) return NULL; switch (conf->format) { case KS_CONFIG_JSON: kshark_plugin_to_json(plugin, conf->conf_doc); return conf; default: fprintf(stderr, "Document format %d not supported\n", conf->format); kshark_free_config_doc(conf); return NULL; } } static bool kshark_all_plugins_to_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { struct kshark_plugin_list *plugin = kshark_ctx->plugins; struct json_object *jfile, *jlist; jlist = json_object_new_array(); if (!jlist) return false; while (plugin) { jfile = json_object_new_object(); if (!kshark_trace_file_to_json(plugin->file, plugin->name, jfile)) goto fail; json_object_array_add(jlist, jfile); plugin = plugin->next; } json_object_object_add(jobj, "obj. files", jlist); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jobj); json_object_put(jlist); return false; } /** * @brief Record the current list of registered plugins into a * Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param format: Input location for the Configuration format identifier. * Currently only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_export_all_plugins(struct kshark_context *kshark_ctx, enum kshark_config_formats format) { struct kshark_config_doc *conf = kshark_config_new("kshark.config.plugins", format); if (!conf) return NULL; switch (conf->format) { case KS_CONFIG_JSON: kshark_all_plugins_to_json(kshark_ctx, conf->conf_doc); return conf; default: fprintf(stderr, "Document format %d not supported\n", conf->format); kshark_free_config_doc(conf); return NULL; } } static bool kshark_plugin_from_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { const char *file, *name; if (!kshark_trace_file_from_json(&file, &name, NULL, jobj)) { fprintf(stderr, "Failed to import plugin!\n"); return false; } return !!(long) kshark_register_plugin(kshark_ctx, name, file); } static bool kshark_all_plugins_from_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { struct json_object *jlist = NULL, *jfile = NULL; int i, n_plugins; if (!kshark_ctx || !jobj) return false; if (!kshark_json_type_check(jobj, "kshark.config.plugins") || !json_object_object_get_ex(jobj, "obj. files", &jlist) || json_object_get_type(jlist) != json_type_array) goto fail; n_plugins = json_object_array_length(jlist); for (i = 0; i < n_plugins; ++i) { jfile = json_object_array_get_idx(jlist, i); if (!jfile) goto fail; kshark_plugin_from_json(kshark_ctx, jfile); } return true; fail: json_object_put(jfile); json_object_put(jlist); return false; } /** * @brief Load the list of registered plugins from a Configuration * document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if plugins have been loaded. If the configuration * document contains no data or in a case of an error, the function * returns False. */ bool kshark_import_all_plugins(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_all_plugins_from_json(kshark_ctx, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static void kshark_stream_plugins_to_json(struct kshark_data_stream *stream, struct json_object *jobj) { struct kshark_dpi_list *plugin = stream->plugins; struct json_object *jlist, *jplg; bool active; jlist = json_object_new_array(); while (plugin) { jplg = json_object_new_array(); json_object_array_add(jplg, json_object_new_string(plugin->interface->name)); active = plugin->status & KSHARK_PLUGIN_ENABLED; json_object_array_add(jplg, json_object_new_boolean(active)); json_object_array_add(jlist, jplg); plugin = plugin->next; } json_object_object_add(jobj, "registered", jlist); } /** * @brief Record the current list of plugins registered for a given Data * stream into a Configuration document. * * @param stream: Input location for a Trace data stream pointer. * @param format: Input location for the Configuration format identifier. * Currently only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_export_stream_plugins(struct kshark_data_stream *stream, enum kshark_config_formats format) { struct kshark_config_doc *conf = kshark_config_new("kshark.config.plugins", format); if (!conf) return NULL; switch (conf->format) { case KS_CONFIG_JSON: kshark_stream_plugins_to_json(stream, conf->conf_doc); return conf; default: fprintf(stderr, "Document format %d not supported\n", conf->format); kshark_free_config_doc(conf); return NULL; } } static bool kshark_stream_plugins_from_json(struct kshark_context *kshark_ctx, struct kshark_data_stream *stream, struct json_object *jobj) { struct json_object *jlist, *jplg, *jname, *jstatus; struct kshark_plugin_list *plugin; struct kshark_dpi_list *dpi_list; struct kshark_dpi *dpi; int i, n_plugins; bool active; jlist = jplg = jname = jstatus = NULL; if (!kshark_ctx || !stream || !jobj) return false; if (!kshark_json_type_check(jobj, "kshark.config.plugins") || !json_object_object_get_ex(jobj, "registered", &jlist) || json_object_get_type(jlist) != json_type_array) goto fail; n_plugins = json_object_array_length(jlist); for (i = 0; i < n_plugins; ++i) { jplg = json_object_array_get_idx(jlist, i); if (!jplg || json_object_get_type(jplg) != json_type_array || json_object_array_length(jplg) != 2) goto fail; jname = json_object_array_get_idx(jplg, 0); jstatus = json_object_array_get_idx(jplg, 1); if (!jname || !jstatus) goto fail; plugin = kshark_find_plugin_by_name(kshark_ctx->plugins, json_object_get_string(jname)); if (plugin) { active = json_object_get_boolean(jstatus); dpi = plugin->process_interface; dpi_list = kshark_register_plugin_to_stream(stream, dpi, active); kshark_handle_dpi(stream, dpi_list, KSHARK_PLUGIN_INIT); } } return true; fail: json_object_put(jplg); json_object_put(jlist); return false; } /** * @brief Load the list of registered plugins for a given Data * stream from a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param stream: Input location for a Trace data stream pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if plugins have been loaded. If the configuration * document contains no data or in a case of an error, the function * returns False. */ bool kshark_import_stream_plugins(struct kshark_context *kshark_ctx, struct kshark_data_stream *stream, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_stream_plugins_from_json(kshark_ctx, stream, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_model_to_json(struct kshark_trace_histo *histo, struct json_object *jobj) { struct json_object *jrange, *jmin, *jmax, *jn_bins; if (!histo || !jobj) return false; jrange = json_object_new_array(); jmin = json_object_new_int64(histo->min); jmax = json_object_new_int64(histo->max); jn_bins = json_object_new_int(histo->n_bins); if (!jrange || !jmin || !jmax || !jn_bins) goto fail; json_object_array_put_idx(jrange, 0, jmin); json_object_array_put_idx(jrange, 1, jmax); json_object_object_add(jobj, "range", jrange); json_object_object_add(jobj, "bins", jn_bins); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jobj); json_object_put(jrange); json_object_put(jmin); json_object_put(jmax); json_object_put(jn_bins); return false; } /** * @brief Record the current configuration of the Vis. model into a * Configuration document. * * @param histo: Input location for the Vis. model descriptor. * @param format: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * free() to free the object. */ struct kshark_config_doc * kshark_export_model(struct kshark_trace_histo *histo, enum kshark_config_formats format) { /* Create a new Configuration document. */ struct kshark_config_doc *conf = kshark_config_new("kshark.config.model", format); if (!conf) return NULL; switch (conf->format) { case KS_CONFIG_JSON: kshark_model_to_json(histo, conf->conf_doc); return conf; default: fprintf(stderr, "Document format %d not supported\n", conf->format); kshark_free_config_doc(conf); return NULL; } } static bool kshark_model_from_json(struct kshark_trace_histo *histo, struct json_object *jobj) { struct json_object *jrange, *jmin, *jmax, *jn_bins; uint64_t min, max; int n_bins; if (!histo || !jobj) return false; if (!kshark_json_type_check(jobj, "kshark.config.model") || !json_object_object_get_ex(jobj, "range", &jrange) || !json_object_object_get_ex(jobj, "bins", &jn_bins) || json_object_get_type(jrange) != json_type_array || json_object_array_length(jrange) != 2) goto fail; jmin = json_object_array_get_idx(jrange, 0); jmax = json_object_array_get_idx(jrange, 1); if (!jmin || !jmax) goto fail; min = json_object_get_int64(jmin); max = json_object_get_int64(jmax); n_bins = json_object_get_int(jn_bins); ksmodel_set_bining(histo, n_bins, min, max); if (histo->data && histo->data_size) ksmodel_fill(histo, histo->data, histo->data_size); return true; fail: fprintf(stderr, "Failed to load event filter from json_object.\n"); return false; } /** * @brief Load the configuration of the Vis. model from a Configuration * document. * * @param histo: Input location for the Vis. model descriptor. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if the model has been loaded. If the model configuration * document contains no data or in a case of an error, the function * returns False. */ bool kshark_import_model(struct kshark_trace_histo *histo, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_model_from_json(histo, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_event_filter_to_json(struct kshark_data_stream *stream, enum kshark_filter_type filter_type, const char *filter_name, struct json_object *jobj) { json_object *jfilter_data, *jname; struct kshark_hash_id *filter; char *name_str; int *ids; size_t i; filter = kshark_get_filter(stream, filter_type); if (!filter) return false; jname = NULL; /* * If this Json document already contains a description of the filter, * delete this description. */ json_del_if_exist(jobj, filter_name); /* Get the array of Ids to be fitered. */ ids = kshark_hash_ids(filter); if (!ids) return true; /* Create a Json array and fill the Id values into it. */ jfilter_data = json_object_new_array(); if (!jfilter_data) goto fail; for (i = 0; i < filter->count; ++i) { name_str = kshark_event_from_id(stream->stream_id, ids[i]); if (name_str) { jname = json_object_new_string(name_str); if (!jname) goto fail; json_object_array_add(jfilter_data, jname); } } free(ids); /* Add the array of Ids to the filter config document. */ json_object_object_add(jobj, filter_name, jfilter_data); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jfilter_data); json_object_put(jname); free(ids); return false; } /** * @brief Record the current configuration of an Event Id filter into a * Configuration document. * * @param stream: Input location for a Trace data stream pointer. * @param filter_type: Identifier of the filter. * @param filter_name: The name of the filter to show up in the Json document. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True on success, otherwise False. */ bool kshark_export_event_filter(struct kshark_data_stream *stream, enum kshark_filter_type filter_type, const char *filter_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_event_filter_to_json(stream, filter_type, filter_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static int kshark_event_filter_from_json(struct kshark_data_stream *stream, enum kshark_filter_type filter_type, const char *filter_name, struct json_object *jobj) { int i, length, event_id, count = 0; struct kshark_hash_id *filter; json_object *jfilter, *jevent; const char *name_str; filter = kshark_get_filter(stream, filter_type); if (!filter) return 0; /* * Use the name of the filter to find the array of events associated * with this filter. Notice that the filter config document may * contain no data for this particular filter. */ if (!json_object_object_get_ex(jobj, filter_name, &jfilter)) return 0; if (!kshark_json_type_check(jobj, "kshark.config.filter") || json_object_get_type(jfilter) != json_type_array) goto fail; /* Set the filter. */ length = json_object_array_length(jfilter); for (i = 0; i < length; ++i) { jevent = json_object_array_get_idx(jfilter, i); name_str = json_object_get_string(jevent); event_id = kshark_find_event_id(stream, name_str); if (event_id < 0) continue; kshark_hash_id_add(filter, event_id); count++; } if (count != length) count = -count; return count; fail: fprintf(stderr, "Failed to load event filter from json_object.\n"); kshark_hash_id_clear(filter); return 0; } /** * @brief Load from Configuration document the configuration of an Event Id filter. * * @param stream: Input location for a Trace data stream pointer. * @param filter_type: Identifier of the filter. * @param filter_name: The name of the filter as showing up in the Config. * document. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns The total number of events added to the filter. If not all events * listed in the input configuration have been added successfully, * the returned number is negative. */ int kshark_import_event_filter(struct kshark_data_stream *stream, enum kshark_filter_type filter_type, const char *filter_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_event_filter_from_json(stream, filter_type, filter_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return 0; } } static bool kshark_filter_array_to_json(struct kshark_hash_id *filter, const char *filter_name, struct json_object *jobj) { json_object *jfilter_data, *jpid = NULL; int *ids; size_t i; /* * If this Json document already contains a description of the filter, * delete this description. */ json_del_if_exist(jobj, filter_name); /* Get the array of Ids to be filtered. */ ids = kshark_hash_ids(filter); if (!ids) return true; /* Create a Json array and fill the Id values into it. */ jfilter_data = json_object_new_array(); if (!jfilter_data) goto fail; for (i = 0; i < filter->count; ++i) { jpid = json_object_new_int(ids[i]); if (!jpid) goto fail; json_object_array_add(jfilter_data, jpid); } free(ids); /* Add the array of Ids to the filter config document. */ json_object_object_add(jobj, filter_name, jfilter_data); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jfilter_data); json_object_put(jpid); free(ids); return false; } /** * @brief Record the current configuration of a simple Id filter into a * Configuration document. * * @param filter: Input location for an Id filter. * @param filter_name: The name of the filter to show up in the Json document. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True on success, otherwise False. */ bool kshark_export_filter_array(struct kshark_hash_id *filter, const char *filter_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_filter_array_to_json(filter, filter_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_filter_array_from_json(struct kshark_hash_id *filter, const char *filter_name, struct json_object *jobj) { json_object *jfilter, *jpid; int i, length; /* * Use the name of the filter to find the array of events associated * with this filter. Notice that the filter config document may * contain no data for this particular filter. */ if (!json_object_object_get_ex(jobj, filter_name, &jfilter)) return false; if (!kshark_json_type_check(jobj, "kshark.config.filter") || json_object_get_type(jfilter) != json_type_array) goto fail; /* Set the filter. */ length = json_object_array_length(jfilter); for (i = 0; i < length; ++i) { jpid = json_object_array_get_idx(jfilter, i); if (!jpid) goto fail; kshark_hash_id_add(filter, json_object_get_int(jpid)); } return true; fail: fprintf(stderr, "Failed to load task filter from json_object.\n"); return false; } /** * @brief Load from Configuration document the configuration of a simple * Id filter. * * @param filter: Input location for an Id filter. * @param filter_name: The name of the filter as showing up in the Config. * document. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for this particular filter or in a case * of an error, the function returns False. */ bool kshark_import_filter_array(struct kshark_hash_id *filter, const char *filter_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_filter_array_from_json(filter, filter_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_adv_filters_to_json(struct kshark_data_stream *stream, struct json_object *jobj) { json_object *jfilter_data, *jevent, *jname, *jfilter; char *filter_str; int *events, i; jevent = jname = jfilter = NULL; /* * If this Json document already contains a description of the model, * delete this description. */ json_del_if_exist(jobj, KS_ADV_EVENT_FILTER_NAME); if (!kshark_tep_filter_is_set(stream)) return true; /* Create a Json array and fill the Id values into it. */ jfilter_data = json_object_new_array(); if (!jfilter_data) goto fail; events = kshark_get_all_event_ids(stream); if (!events) return false; for (i = 0; i < stream->n_events; ++i) { filter_str = kshark_tep_filter_make_string(stream, events[i]); if (!filter_str) continue; jevent = json_object_new_object(); jname = json_object_new_string(kshark_event_from_id(stream->stream_id, events[i])); jfilter = json_object_new_string(filter_str); if (!jevent || !jname || !jfilter) goto fail; json_object_object_add(jevent, "name", jname); json_object_object_add(jevent, "condition", jfilter); json_object_array_add(jfilter_data, jevent); } /* Add the array of advanced filters to the filter config document. */ json_object_object_add(jobj, KS_ADV_EVENT_FILTER_NAME, jfilter_data); return true; fail: fprintf(stderr, "Failed to allocate memory for json_object.\n"); json_object_put(jfilter_data); json_object_put(jevent); json_object_put(jname); json_object_put(jfilter); return false; } /** * @brief Record the current configuration of the advanced filter into a * Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Adv. Filter * Configuration document will be created. * * @returns True on success, otherwise False. */ bool kshark_export_adv_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc **conf) { struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return false; if (!kshark_is_tep(stream)) { /* Nothing to export. */ return true; } if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; switch ((*conf)->format) { case KS_CONFIG_JSON: return kshark_adv_filters_to_json(stream, (*conf)->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", (*conf)->format); return false; } } static bool kshark_adv_filters_from_json(struct kshark_data_stream *stream, struct json_object *jobj) { json_object *jfilter, *jname, *jcond; int i, length, n, ret = 0; char *filter_str = NULL; /* * Use the name of the filter to find the array of events associated * with this filter. Notice that the filter config document may * contain no data for this particular filter. */ if (!json_object_object_get_ex(jobj, KS_ADV_EVENT_FILTER_NAME, &jfilter)) return false; if (!kshark_json_type_check(jobj, "kshark.config.filter") || json_object_get_type(jfilter) != json_type_array) goto fail; /* Set the filter. */ length = json_object_array_length(jfilter); for (i = 0; i < length; ++i) { jfilter = json_object_array_get_idx(jfilter, i); if (!json_object_object_get_ex(jfilter, "name", &jname) || !json_object_object_get_ex(jfilter, "condition", &jcond)) goto fail; n = asprintf(&filter_str, "%s:%s", json_object_get_string(jname), json_object_get_string(jcond)); if (n <= 0) { filter_str = NULL; goto fail; } ret = kshark_tep_add_filter_str(stream, filter_str); if (ret < 0) goto fail; } return true; fail: fprintf(stderr, "Failed to laod Advanced filters.\n"); free(filter_str); return false; } /** * @brief Load from Configuration document the configuration of the advanced * filter. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for the Adv. filter or in a case of * an error, the function returns False. */ bool kshark_import_adv_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf) { struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return false; switch (conf->format) { case KS_CONFIG_JSON: return kshark_adv_filters_from_json(stream, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_user_mask_to_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { json_object *jmask; uint8_t mask; mask = kshark_ctx->filter_mask; jmask = json_object_new_int((int) mask); if (!jmask) return false; /* Add the mask to the filter config document. */ json_object_object_add(jobj, KS_USER_FILTER_MASK_NAME, jmask); return true; } /** * @brief Record the current value of the the user-specified filter mask into * a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Adv. Filter * Configuration document will be created. * * @returns True on success, otherwise False. */ bool kshark_export_user_mask(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf) { if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; switch ((*conf)->format) { case KS_CONFIG_JSON: return kshark_user_mask_to_json(kshark_ctx, (*conf)->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", (*conf)->format); return false; } } static bool kshark_user_mask_from_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { json_object *jmask; uint8_t mask; if (!kshark_json_type_check(jobj, "kshark.config.filter")) return false; /* * Use the name of the filter to find the value of the filter maks. * Notice that the filter config document may contain no data for * the mask. */ if (!json_object_object_get_ex(jobj, KS_USER_FILTER_MASK_NAME, &jmask)) return false; mask = json_object_get_int(jmask); kshark_ctx->filter_mask = mask; return true; } /** * @brief Load from Configuration document the value of the user-specified * filter mask. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a mask has been loaded. If the filter configuration * document contains no data for the mask or in a case of an error, * the function returns False. */ bool kshark_import_user_mask(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_user_mask_from_json(kshark_ctx, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_calib_array_from_json(struct kshark_context *kshark_ctx, int sd, struct json_object *jobj) { json_object *jcalib_argv, *jcalib; int64_t *calib_argv = NULL; int i, calib_length; if (!json_object_object_get_ex(jobj, "calib. array", &jcalib_argv) || json_object_get_type(jcalib_argv) != json_type_array) return false; calib_length = json_object_array_length(jcalib_argv); if (!calib_length) return false; calib_argv = calloc(calib_length, sizeof(*calib_argv)); for (i = 0; i < calib_length; ++i) { jcalib = json_object_array_get_idx(jcalib_argv, i); calib_argv[i] = json_object_get_int64(jcalib); } kshark_ctx->stream[sd]->calib = kshark_offset_calib; kshark_ctx->stream[sd]->calib_array = calib_argv; kshark_ctx->stream[sd]->calib_array_size = calib_length; return true; } /** * @brief Load from Configuration document the value of the time calibration * constants into a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Configuration * document will be created. * * @returns True on success, otherwise False. */ bool kshark_import_calib_array(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_calib_array_from_json(kshark_ctx, sd, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static bool kshark_calib_array_to_json(struct kshark_context *kshark_ctx, int sd, struct json_object *jobj) { json_object *jval = NULL, *jcalib = NULL; struct kshark_data_stream *stream; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream || !stream->calib_array_size) goto fail; jcalib = json_object_new_array(); if (!jcalib) goto fail; for (size_t i = 0; i < stream->calib_array_size; ++i) { jval = json_object_new_int64(stream->calib_array[i]); if (!jval) goto fail; json_object_array_add(jcalib, jval); } /* Add the mask to the filter config document. */ json_object_object_add(jobj, "calib. array", jcalib); return true; fail: json_object_put(jval); json_object_put(jcalib); return false; } /** * @brief Record the current values of the time calibration constants into * a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Configuration * document will be created. * * @returns True on success, otherwise False. */ bool kshark_export_calib_array(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc **conf) { if (!*conf) *conf = kshark_stream_config_new(KS_CONFIG_JSON); if (!*conf) return false; switch ((*conf)->format) { case KS_CONFIG_JSON: return kshark_calib_array_to_json(kshark_ctx, sd, (*conf)->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", (*conf)->format); return false; } } /** * @brief Record the current configuration of "show task" and "hide task" * filters into a Json document. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Filter * Configuration document will be created. * * @returns True, if a filter has been recorded. If both filters contain * no Id values or in a case of an error, the function returns False. */ bool kshark_export_all_event_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc **conf) { struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); bool ret; if (!stream) return false; if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; /* Save a filter only if it contains Id values. */ ret = true; if (kshark_this_filter_is_set(stream->show_event_filter)) ret &= kshark_export_event_filter(stream, KS_SHOW_EVENT_FILTER, KS_SHOW_EVENT_FILTER_NAME, *conf); if (kshark_this_filter_is_set(stream->hide_event_filter)) ret &= kshark_export_event_filter(stream, KS_HIDE_EVENT_FILTER, KS_HIDE_EVENT_FILTER_NAME, *conf); return ret; } /** * @brief Record the current configuration of "show task" and "hide task" * filters into a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Filter * Configuration document will be created. * * @returns True, if a filter has been recorded. If both filters contain * no Id values or in a case of an error, the function returns False. */ bool kshark_export_all_task_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc **conf) { struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); bool ret; if (!stream) return false; if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; /* Save a filter only if it contains Id values. */ ret = true; if (kshark_this_filter_is_set(stream->show_task_filter)) ret &= kshark_export_filter_array(stream->show_task_filter, KS_SHOW_TASK_FILTER_NAME, *conf); if (kshark_this_filter_is_set(stream->hide_task_filter)) ret &= kshark_export_filter_array(stream->hide_task_filter, KS_HIDE_TASK_FILTER_NAME, *conf); return ret; } /** * @brief Record the current configuration of "show cpu" and "hide cpu" * filters into a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Filter * Configuration document will be created. * * @returns True, if a filter has been recorded. If both filters contain * no Id values or in a case of an error, the function returns False. */ bool kshark_export_all_cpu_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc **conf) { struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); bool ret; if (!stream) return false; if (!*conf) *conf = kshark_filter_config_new(KS_CONFIG_JSON); if (!*conf) return false; /* Save a filter only if it contains Id values. */ ret = true; if (kshark_this_filter_is_set(stream->show_cpu_filter)) ret &= kshark_export_filter_array(stream->show_cpu_filter, KS_SHOW_CPU_FILTER_NAME, *conf); if (kshark_this_filter_is_set(stream->hide_cpu_filter)) ret &= kshark_export_filter_array(stream->hide_cpu_filter, KS_HIDE_CPU_FILTER_NAME, *conf); return ret; } /** * @brief Load from a Configuration document the configuration of "show event" * and "hide event" filters. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for any event filter or in a case * of an error, the function returns False. */ bool kshark_import_all_event_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf) { struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); bool ret = false; if (!stream) return false; ret |= kshark_import_event_filter(stream, KS_HIDE_EVENT_FILTER, KS_HIDE_EVENT_FILTER_NAME, conf); ret |= kshark_import_event_filter(stream, KS_SHOW_EVENT_FILTER, KS_SHOW_EVENT_FILTER_NAME, conf); return ret; } /** * @brief Load from Configuration document the configuration of "show task" * and "hide task" filters. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for any task filter or in a case of an * error, the function returns False. */ bool kshark_import_all_task_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf) { struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); bool ret = false; if (!stream) return false; ret |= kshark_import_filter_array(stream->hide_task_filter, KS_HIDE_TASK_FILTER_NAME, conf); ret |= kshark_import_filter_array(stream->show_task_filter, KS_SHOW_TASK_FILTER_NAME, conf); return ret; } /** * @brief Load from Configuration document the configuration of "show cpu" * and "hide cpu" filters. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for any cpu filter or in a case of an * error, the function returns False. */ bool kshark_import_all_cpu_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf) { struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); bool ret = false; if (!stream) return false; ret |= kshark_import_filter_array(stream->hide_cpu_filter, KS_HIDE_CPU_FILTER_NAME, conf); ret |= kshark_import_filter_array(stream->show_cpu_filter, KS_SHOW_CPU_FILTER_NAME, conf); return ret; } /** * @brief Create a Filter Configuration document containing the current * configuration of all filters. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param format: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_export_all_filters(struct kshark_context *kshark_ctx, int sd, enum kshark_config_formats format) { /* Create a new Configuration document. */ struct kshark_config_doc *conf = kshark_filter_config_new(format); /* Save a filter only if it contains Id values. */ if (!conf || !kshark_export_all_event_filters(kshark_ctx, sd, &conf) || !kshark_export_all_task_filters(kshark_ctx, sd, &conf) || !kshark_export_all_cpu_filters(kshark_ctx, sd, &conf) || !kshark_export_user_mask(kshark_ctx, &conf) || !kshark_export_adv_filters(kshark_ctx, sd, &conf)) { kshark_free_config_doc(conf); return NULL; } return conf; } /** * @brief Load from a Configuration document the configuration of all filters. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True, if a filter has been loaded. If the filter configuration * document contains no data for any filter or in a case of an error, * the function returns False. */ bool kshark_import_all_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf) { bool ret; ret = kshark_import_all_task_filters(kshark_ctx, sd, conf); ret |= kshark_import_all_cpu_filters(kshark_ctx, sd, conf); ret |= kshark_import_all_event_filters(kshark_ctx, sd, conf); ret |= kshark_import_user_mask(kshark_ctx, conf); ret |= kshark_import_adv_filters(kshark_ctx, sd, conf); return ret; } /** * @brief Create a Data Stream Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param sd: Data stream identifier. * @param format: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns kshark_config_doc instance on success, otherwise NULL. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc * kshark_export_dstream(struct kshark_context *kshark_ctx, int sd, enum kshark_config_formats format) { struct kshark_config_doc *file_conf, *filter_conf, *sd_conf, *plg_conf; struct kshark_config_doc *dstream_conf; struct kshark_data_stream *stream; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return NULL; /* Create new Configuration documents. */ dstream_conf = kshark_stream_config_new(format); sd_conf = kshark_config_alloc(KS_CONFIG_JSON); sd_conf->conf_doc = json_object_new_int(sd); filter_conf = kshark_export_all_filters(kshark_ctx, sd, format); if (kshark_is_tep(stream) && kshark_tep_is_top_stream(stream)) file_conf = kshark_export_trace_file(stream->file, TOP_BUFF_NAME, format); else file_conf = kshark_export_trace_file(stream->file, stream->name, format); plg_conf = kshark_export_stream_plugins(stream, format); if (!dstream_conf || !sd_conf || !filter_conf || !file_conf || !plg_conf) goto fail; kshark_config_doc_add(dstream_conf, "stream id", sd_conf); kshark_config_doc_add(dstream_conf, "data", file_conf); kshark_config_doc_add(dstream_conf, "filters", filter_conf); kshark_config_doc_add(dstream_conf, "plugins", plg_conf); if (stream->calib_array_size) kshark_export_calib_array(kshark_ctx, sd, &dstream_conf); return dstream_conf; fail: kshark_free_config_doc(dstream_conf); kshark_free_config_doc(filter_conf); kshark_free_config_doc(file_conf); kshark_free_config_doc(plg_conf); kshark_free_config_doc(sd_conf); return NULL; } /** * @brief Load Data Stream from a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns The Stream Id on the loaded Data Stream on success, otherwise a * negative error code. */ int kshark_import_dstream(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf) { struct kshark_config_doc *file_conf, *filter_conf, *plg_conf; struct kshark_data_stream *stream; bool ret = false; int sd = -EFAULT; if (!kshark_type_check(conf, "kshark.config.stream")) return sd; file_conf = kshark_config_alloc(KS_CONFIG_JSON); filter_conf = kshark_config_alloc(KS_CONFIG_JSON); plg_conf = kshark_config_alloc(KS_CONFIG_JSON); if (!file_conf || !filter_conf || !plg_conf) { fprintf(stderr, "Failed to allocate memory for Json document.\n"); goto free; } if (kshark_config_doc_get(conf, "data", file_conf) && kshark_config_doc_get(conf, "filters", filter_conf) && kshark_config_doc_get(conf, "plugins", plg_conf)) { sd = kshark_import_trace_file(kshark_ctx, file_conf); if (sd < 0) { fprintf(stderr, "Failed to import data file form Json document.\n"); goto free; } stream = kshark_ctx->stream[sd]; kshark_import_calib_array(kshark_ctx, sd, conf); ret = kshark_import_all_filters(kshark_ctx, sd, filter_conf); if (!ret) { fprintf(stderr, "Failed to import filters form Json document.\n"); kshark_close(kshark_ctx, sd); sd = -EFAULT; goto free; } ret = kshark_import_stream_plugins(kshark_ctx, stream, plg_conf); if (!ret) { fprintf(stderr, "Failed to import stream plugins form Json document.\n"); kshark_close(kshark_ctx, sd); sd = -EFAULT; goto free; } } free: /* Free only the kshark_config_doc objects. */ free(file_conf); free(filter_conf); free(plg_conf); return sd; } static bool kshark_export_all_dstreams_to_json(struct kshark_context *kshark_ctx, struct json_object *jobj) { int *stream_ids = kshark_all_streams(kshark_ctx); struct kshark_config_doc *dstream_conf; struct json_object *jall_streams; json_del_if_exist(jobj, KS_DSTREAMS_NAME); jall_streams = json_object_new_array(); for (int i = 0; i < kshark_ctx->n_streams; ++i) { dstream_conf = kshark_export_dstream(kshark_ctx, stream_ids[i], KS_CONFIG_JSON); if (!dstream_conf) goto fail; json_object_array_put_idx(jall_streams, i, dstream_conf->conf_doc); /* Free only the kshark_config_doc object. */ free(dstream_conf); } free(stream_ids); json_object_object_add(jobj, KS_DSTREAMS_NAME, jall_streams); return true; fail: json_object_put(jall_streams); free(stream_ids); return false; } /** * @brief Record the current configuration for all Data Streams into a Json * document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. If NULL, a new Configuration * document will be created. * * @returns True on success, otherwise False. */ bool kshark_export_all_dstreams(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf) { if (!*conf) *conf = kshark_session_config_new(KS_CONFIG_JSON); if (!*conf) return false; switch ((*conf)->format) { case KS_CONFIG_JSON: return kshark_export_all_dstreams_to_json(kshark_ctx, (*conf)->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", (*conf)->format); return false; } } static ssize_t kshark_import_all_dstreams_from_json(struct kshark_context *kshark_ctx, struct json_object *jobj, struct kshark_entry ***data_rows) { struct kshark_config_doc dstream_conf; json_object *jall_streams, *jstream; int sd, i, length; if (!json_object_object_get_ex(jobj, KS_DSTREAMS_NAME, &jall_streams) || json_object_get_type(jall_streams) != json_type_array) return -EFAULT; length = json_object_array_length(jall_streams); if (!length) return -EFAULT; dstream_conf.format = KS_CONFIG_JSON; for (i = 0; i < length; ++i) { jstream = json_object_array_get_idx(jall_streams, i); dstream_conf.conf_doc = jstream; sd = kshark_import_dstream(kshark_ctx, &dstream_conf); if (sd < 0) return -EFAULT; } return kshark_load_all_entries(kshark_ctx, data_rows); } /** * @brief Load all Data Streams from a Configuration document. * * @param kshark_ctx: Input location for session context pointer. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * @param data_rows: Output location for the trace data. The user is * responsible for freeing the elements of the outputted * array. * * @returns The size of the outputted data in the case of success, or a * negative error code on failure. */ ssize_t kshark_import_all_dstreams(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf, struct kshark_entry ***data_rows) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_import_all_dstreams_from_json(kshark_ctx, conf->conf_doc, data_rows); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return -EFAULT; } } static bool kshark_save_json_file(const char *file_name, struct json_object *jobj) { int flags; /* Save the file in a human-readable form. */ flags = JSON_C_TO_STRING_SPACED | JSON_C_TO_STRING_PRETTY; if (json_object_to_file_ext(file_name, jobj, flags) == 0) return true; return false; } /** * @brief Save a Configuration document into a file. * * @param file_name: The name of the file. * @param conf: Input location for the kshark_config_doc instance. Currently * only Json format is supported. * * @returns True on success, otherwise False. */ bool kshark_save_config_file(const char *file_name, struct kshark_config_doc *conf) { switch (conf->format) { case KS_CONFIG_JSON: return kshark_save_json_file(file_name, conf->conf_doc); default: fprintf(stderr, "Document format %d not supported\n", conf->format); return false; } } static struct json_object *kshark_open_json_file(const char *file_name, const char *type) { struct json_object *jobj, *var; const char *type_var; jobj = json_object_from_file(file_name); if (!jobj) return NULL; /* Get the type of the document. */ if (!json_object_object_get_ex(jobj, "type", &var)) goto fail; type_var = json_object_get_string(var); if (strcmp(type, type_var) != 0) goto fail; return jobj; fail: /* The document has a wrong type. */ fprintf(stderr, "Failed to open Json file %s.\n", file_name); fprintf(stderr, "The document has a wrong type.\n"); json_object_put(jobj); return NULL; } static const char *get_ext(const char *filename) { const char *dot = strrchr(filename, '.'); if(!dot) return "unknown"; return dot + 1; } /** * @brief Open for read a Configuration file and check if it has the * expected type. * * @param file_name: The name of the file. Currently only Json files are * supported. * @param type: String describing the expected type of the document, * e.g. "kshark.config.record" or "kshark.config.filter". * * @returns kshark_config_doc instance on success, or NULL on failure. Use * kshark_free_config_doc() to free the object. */ struct kshark_config_doc *kshark_open_config_file(const char *file_name, const char *type) { struct kshark_config_doc *conf = NULL; if (strcmp(get_ext(file_name), "json") == 0) { struct json_object *jobj = kshark_open_json_file(file_name, type); if (jobj) { conf = malloc(sizeof(*conf)); conf->conf_doc = jobj; conf->format = KS_CONFIG_JSON; } } return conf; } kernel-shark-kernelshark-v2.4.0/src/libkshark-hash.c000066400000000000000000000110361477354127100224420ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2009, Steven Rostedt * Copyright (C) 2018 VMware Inc, Steven Rostedt */ /** * @file libkshark-hash.c * @brief Hash table of integer Id numbers. */ // C #include #include #include // KernelShark #include "libkshark.h" /** * @brief: quick_hash - A quick (non secured) hash alogirthm * @param val: The value to perform the hash on * @param bits: The size in bits you need to return * * This is a quick hashing function adapted from Donald E. Knuth's 32 * bit multiplicative hash. See The Art of Computer Programming (TAOCP). * Multiplication by the Prime number, closest to the golden ratio of * 2^32. * * "bits" is used to max the result for use cases that require * a power of 2 return value that is less than 32 bits. Any value * of "bits" greater than 31 (or zero), will simply return the full hash * on "val". */ static inline uint32_t quick_hash(uint32_t val, unsigned int bits) { val *= UINT32_C(2654435761); if (!bits || bits > 31) return val; return val & ((1 << bits) - 1); } static size_t hash_size(struct kshark_hash_id *hash) { return (1 << hash->n_bits); } /** * Create new hash table of Ids. */ struct kshark_hash_id *kshark_hash_id_alloc(size_t n_bits) { struct kshark_hash_id *hash; size_t size; hash = calloc(1, sizeof(*hash)); if (!hash) goto fail; hash->n_bits = n_bits; hash->count = 0; size = hash_size(hash); hash->hash = calloc(size, sizeof(*hash->hash)); if (!hash->hash) goto fail; return hash; fail: fprintf(stderr, "Failed to allocate memory for hash table.\n"); kshark_hash_id_free(hash); return NULL; } /** Free the hash table of Ids. */ void kshark_hash_id_free(struct kshark_hash_id *hash) { if (!hash) return; if (hash->hash) { kshark_hash_id_clear(hash); free(hash->hash); } free(hash); } /** * @brief Check if an Id with a given value exists in this hash table. */ bool kshark_hash_id_find(struct kshark_hash_id *hash, int id) { uint32_t key = quick_hash(id, hash->n_bits); struct kshark_hash_id_item *item; for (item = hash->hash[key]; item; item = item->next) if (item->id == id) break; return !!(unsigned long) item; } /** * @brief Add Id to the hash table. * * @param hash: The hash table to add to. * @param id: The Id number to be added. * * @returns Zero if the Id already exists in the table, one if the Id has been * added and negative errno code on failure. */ int kshark_hash_id_add(struct kshark_hash_id *hash, int id) { uint32_t key = quick_hash(id, hash->n_bits); struct kshark_hash_id_item *item; if (kshark_hash_id_find(hash, id)) return 0; item = calloc(1, sizeof(*item)); if (!item) { fprintf(stderr, "Failed to allocate memory for hash table item.\n"); return -ENOMEM; } item->id = id; item->next = hash->hash[key]; hash->hash[key] = item; hash->count++; return 1; } /** * @brief Remove Id from the hash table. */ void kshark_hash_id_remove(struct kshark_hash_id *hash, int id) { struct kshark_hash_id_item *item, **next; int key = quick_hash(id, hash->n_bits); next = &hash->hash[key]; while (*next) { if ((*next)->id == id) break; next = &(*next)->next; } if (!*next) return; assert(hash->count); hash->count--; item = *next; *next = item->next; free(item); } /** Remove (free) all Ids (items) from this hash table. */ void kshark_hash_id_clear(struct kshark_hash_id *hash) { struct kshark_hash_id_item *item, *next; size_t i, size; if (!hash || ! hash->hash) return; size = hash_size(hash); for (i = 0; i < size; i++) { next = hash->hash[i]; if (!next) continue; hash->hash[i] = NULL; while (next) { item = next; next = item->next; free(item); } } hash->count = 0; } static int compare_ids(const void* a, const void* b) { int arg1 = *(const int*)a; int arg2 = *(const int*)b; if (arg1 < arg2) return -1; if (arg1 > arg2) return 1; return 0; } /** * @brief Get a sorted array containing all Ids of this hash table. */ int *kshark_hash_ids(struct kshark_hash_id *hash) { struct kshark_hash_id_item *item; size_t i, size = hash_size(hash); int count = 0; int *ids; if (!hash->count) return NULL; ids = calloc(hash->count, sizeof(*ids)); if (!ids) { fprintf(stderr, "Failed to allocate memory for Id array.\n"); return NULL; } for (i = 0; i < size; i++) { item = hash->hash[i]; while (item) { ids[count++] = item->id; item = item->next; } } qsort(ids, hash->count, sizeof(*ids), compare_ids); return ids; } kernel-shark-kernelshark-v2.4.0/src/libkshark-model.c000066400000000000000000001116071477354127100226240ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark-model.c * @brief Time series visualization model for tracing data. */ // C #include #include #include #include // KernelShark #include "libkshark-model.h" /** The index of the Upper Overflow bin. */ #define UOB(histo) (histo->n_bins) /** The index of the Lower Overflow bin. */ #define LOB(histo) (histo->n_bins + 1) /** For all bins. */ # define ALLB(histo) LOB(histo) /** * @brief Initialize the Visualization model. * * @param histo: Input location for the model descriptor. */ void ksmodel_init(struct kshark_trace_histo *histo) { /* * Initialize an empty histo. The histo will have no bins and will * contain no data. */ memset(histo, 0, sizeof(*histo)); } /** * @brief Clear (reset) the Visualization model. * * @param histo: Input location for the model descriptor. */ void ksmodel_clear(struct kshark_trace_histo *histo) { /* Reset the histo. It will have no bins and will contain no data. */ free(histo->map); free(histo->bin_count); ksmodel_init(histo); } static void ksmodel_reset_bins(struct kshark_trace_histo *histo, size_t first, size_t last) { /* * Reset the content of the bins. * Be careful here! Resetting the entire array of signed integers with * memset() will work only for values of "0" and "-1". Hence * KS_EMPTY_BIN is expected to be "-1". */ memset(&histo->map[first], KS_EMPTY_BIN, (last - first + 1) * sizeof(histo->map[0])); memset(&histo->bin_count[first], 0, (last - first + 1) * sizeof(histo->bin_count[0])); } static bool ksmodel_histo_alloc(struct kshark_trace_histo *histo, size_t n) { free(histo->bin_count); free(histo->map); /* Create bins. Two overflow bins are added. */ histo->map = calloc(n + 2, sizeof(*histo->map)); histo->bin_count = calloc(n + 2, sizeof(*histo->bin_count)); if (!histo->map || !histo->bin_count) { ksmodel_clear(histo); fprintf(stderr, "Failed to allocate memory for a histo.\n"); return false; } histo->n_bins = n; return true; } static void ksmodel_set_in_range_bining(struct kshark_trace_histo *histo, int n, int64_t min, int64_t max, bool force_in_range) { int64_t corrected_range, delta_range, range = max - min; struct kshark_entry *last; if (n <= 0) { histo->n_bins = histo->bin_size = 0; histo->min = min; histo->max = max; free(histo->bin_count); free(histo->map); histo->map = NULL; histo->bin_count = NULL; return; } /* The size of the bin must be >= 1, hence the range must be >= n. */ if (range < (int64_t) n) { range = n; max = min + n; } /* * If the number of bins changes, allocate memory for the descriptor of * the model. */ if (n != histo->n_bins) { if (!ksmodel_histo_alloc(histo, n)) { ksmodel_clear(histo); return; } } /* Reset the content of all bins (including overflow bins) to zero. */ ksmodel_reset_bins(histo, 0, ALLB(histo)); if (range % n == 0) { /* * The range is multiple of the number of bin and needs no * adjustment. This is very unlikely to happen but still ... */ histo->min = min; histo->max = max; histo->bin_size = range / n; } else { /* * The range needs adjustment. The new range will be slightly * bigger, compared to the requested one. */ histo->bin_size = range / n + 1; corrected_range = histo->bin_size * n; delta_range = corrected_range - range; histo->min = min - delta_range / 2; histo->max = histo->min + corrected_range; if (!force_in_range) return; /* * Make sure that the new range doesn't go outside of the time * interval of the dataset. */ last = histo->data[histo->data_size - 1]; if (histo->min < histo->data[0]->ts) { histo->min = histo->data[0]->ts; histo->max = histo->min + corrected_range; } else if (histo->max > last->ts) { histo->max = last->ts; histo->min = histo->max - corrected_range; } } } /** * @brief Prepare the bining of the Visualization model. * * @param histo: Input location for the model descriptor. * @param n: Number of bins. * @param min: Lower edge of the time-window to be visualized. * @param max: Upper edge of the time-window to be visualized. */ void ksmodel_set_bining(struct kshark_trace_histo *histo, size_t n, int64_t min, int64_t max) { ksmodel_set_in_range_bining(histo, n, min, max, false); } static size_t ksmodel_set_lower_edge(struct kshark_trace_histo *histo) { /* * Find the index of the first entry inside the range * (timestamp >= min). Note that the value of "min" is considered * inside the range. */ ssize_t row = kshark_find_entry_by_time(histo->min, histo->data, 0, histo->data_size - 1); assert(row != BSEARCH_ALL_SMALLER); if (row == BSEARCH_ALL_GREATER || row == 0) { /* Lower Overflow bin is empty. */ histo->map[LOB(histo)] = KS_EMPTY_BIN; histo->bin_count[LOB(histo)] = 0; row = 0; } else { /* * The first entry inside the range is not the first entry of * the dataset. This means that the Lower Overflow bin contains * data. */ /* Lower Overflow bin starts at "0". */ histo->map[LOB(histo)] = 0; /* * The number of entries inside the Lower Overflow bin is equal * to the index of the first entry inside the range. */ histo->bin_count[LOB(histo)] = row; } /* * Now check if the first entry inside the range falls into the first * bin. */ if (histo->data[row]->ts < histo->min + histo->bin_size) { /* * It is inside the first bin. Set the beginning * of the first bin. */ histo->map[0] = row; } else { /* The first bin is empty. */ histo->map[0] = KS_EMPTY_BIN; } return row; } static size_t ksmodel_set_upper_edge(struct kshark_trace_histo *histo) { /* * Find the index of the first entry outside the range * (timestamp > max). Note that the value of "max" is considered inside * the range. Remember that kshark_find_entry_by_time returns the first * entry which is equal or greater than the reference time. */ ssize_t row = kshark_find_entry_by_time(histo->max + 1, histo->data, 0, histo->data_size - 1); assert(row != BSEARCH_ALL_GREATER); if (row == BSEARCH_ALL_SMALLER) { /* Upper Overflow bin is empty. */ histo->map[UOB(histo)] = KS_EMPTY_BIN; histo->bin_count[UOB(histo)] = 0; } else { /* * The Upper Overflow bin contains data. Set its beginning and * the number of entries. */ histo->map[UOB(histo)] = row; histo->bin_count[UOB(histo)] = histo->data_size - row; } return row; } static void ksmodel_set_next_bin_edge(struct kshark_trace_histo *histo, int bin, size_t last_row) { int64_t time_min, time_max; int next_bin = bin + 1; ssize_t row; /* Calculate the beginning and the end of the next bin. */ time_min = histo->min + next_bin * histo->bin_size; time_max = time_min + histo->bin_size; /* * The timestamp of the very last entry of the dataset can be exactly * equal to the value of the upper edge of the range. This is very * likely to happen when we use ksmodel_set_in_range_bining(). In this * case we have to increase the size of the very last bin in order to * make sure that the last entry of the dataset will fall into it. */ if (next_bin == histo->n_bins - 1) ++time_max; /* * Find the index of the first entry inside * the next bin (timestamp > time_min). */ row = kshark_find_entry_by_time(time_min, histo->data, last_row, histo->data_size - 1); if (row < 0 || histo->data[row]->ts >= time_max) { /* The bin is empty. */ histo->map[next_bin] = KS_EMPTY_BIN; return; } /* Set the index of the first entry. */ histo->map[next_bin] = row; } /* * Fill in the bin_count array, which maps the number of entries within each * bin. */ static void ksmodel_set_bin_counts(struct kshark_trace_histo *histo) { int i = 0, prev_not_empty; ssize_t count_tmp = 0; histo->tot_count = 0; memset(&histo->bin_count[0], 0, (histo->n_bins) * sizeof(histo->bin_count[0])); /* * Find the first bin which contains data. Start by checking the Lower * Overflow bin. */ if (histo->map[LOB(histo)] != KS_EMPTY_BIN) { prev_not_empty = LOB(histo); } else { /* Loop till the first non-empty bin. */ while (histo->map[i] < 0 && i < histo->n_bins) { ++i; } prev_not_empty = i++; } /* * Starting from the first not empty bin, loop over all bins and fill * in the bin_count array to hold the number of entries in each bin. */ for (; i < histo->n_bins; ++i) { if (histo->map[i] != KS_EMPTY_BIN) { /* * The current bin is not empty, take its data row and * subtract it from the data row of the previous not * empty bin, which will give us the number of data * rows in the "prev_not_empty" bin. */ count_tmp = histo->map[i] - histo->map[prev_not_empty]; /* * We will do a sanity check. The number of data rows * in the previous not empty bin must be greater than * zero. */ assert(count_tmp > 0); histo->bin_count[prev_not_empty] = count_tmp; if (prev_not_empty != LOB(histo)) histo->tot_count += count_tmp; prev_not_empty = i; } } /* Check if the Upper Overflow bin contains data. */ if (histo->map[UOB(histo)] == KS_EMPTY_BIN) { /* * The Upper Overflow bin is empty. Use the size of the dataset * to calculate the content of the previouse not empty bin. */ count_tmp = histo->data_size - histo->map[prev_not_empty]; } else { /* * Use the index of the first entry inside the Upper Overflow * bin to calculate the content of the previouse not empty * bin. */ count_tmp = histo->map[UOB(histo)] - histo->map[prev_not_empty]; } /* * We will do a sanity check. The number of data rows in the last not * empty bin must be greater than zero. */ assert(count_tmp >= 0); histo->tot_count += histo->bin_count[prev_not_empty] = count_tmp; } /** * @brief Provide the Visualization model with data. Calculate the current * state of the model. * * @param histo: Input location for the model descriptor. * @param data: Input location for the trace data. * @param n: Number of bins. */ void ksmodel_fill(struct kshark_trace_histo *histo, struct kshark_entry **data, size_t n) { size_t last_row = 0; int bin; histo->data_size = n; histo->data = data; if (histo->n_bins == 0 || histo->bin_size == 0 || histo->data_size == 0) { /* * Something is wrong with this histo. * Most likely the binning is not set. */ ksmodel_clear(histo); fprintf(stderr, "Unable to fill the model with data.\n"); fprintf(stderr, "Try to set the bining of the model first.\n"); return; } /* Set the Lower Overflow bin */ ksmodel_set_lower_edge(histo); /* * Loop over the dataset and set the beginning of all individual bins. */ for (bin = 0; bin < histo->n_bins; ++bin) { ksmodel_set_next_bin_edge(histo, bin, last_row); if (histo->map[bin + 1] > 0) last_row = histo->map[bin + 1]; } /* Set the Upper Overflow bin. */ ksmodel_set_upper_edge(histo); /* Calculate the number of entries in each bin. */ ksmodel_set_bin_counts(histo); } /** * @brief Get the total number of entries in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * * @returns The number of entries in this bin. */ size_t ksmodel_bin_count(struct kshark_trace_histo *histo, int bin) { if (bin >= 0 && bin < histo->n_bins) return histo->bin_count[bin]; if (bin == UPPER_OVERFLOW_BIN) return histo->bin_count[UOB(histo)]; if (bin == LOWER_OVERFLOW_BIN) return histo->bin_count[LOB(histo)]; return 0; } /** * @brief Shift the time-window of the model forward. Recalculate the current * state of the model. * * @param histo: Input location for the model descriptor. * @param n: Number of bins to shift. */ void ksmodel_shift_forward(struct kshark_trace_histo *histo, int n) { size_t last_row = 0; int bin; if (!histo->data_size || histo->n_bins <= 0) return; if (histo->map[UOB(histo)] == KS_EMPTY_BIN) { /* * The Upper Overflow bin is empty. This means that we are at * the upper edge of the dataset already. Do nothing in this * case. */ return; } histo->min += n * histo->bin_size; histo->max += n * histo->bin_size; if (n >= histo->n_bins) { /* * No overlap between the new and the old ranges. Recalculate * all bins from scratch. First calculate the new range. */ ksmodel_set_bining(histo, histo->n_bins, histo->min, histo->max); ksmodel_fill(histo, histo->data, histo->data_size); return; } /* Set the new Lower Overflow bin. */ ksmodel_set_lower_edge(histo); /* * Copy the the mapping indexes of all overlaping bins starting from * bin "0" of the new histo. Note that the number of overlaping bins * is histo->n_bins - n. * We will do a sanity check. ksmodel_set_lower_edge() sets map[0] * index of the new histo. This index should then be equal to map[n] * index of the old histo. */ assert (histo->map[0] == histo->map[n]); memmove(&histo->map[0], &histo->map[n], sizeof(histo->map[0]) * (histo->n_bins - n)); /* * Calculate only the content of the new (non-overlapping) bins. * Start from the last copied bin and set the edge of each consecutive * bin. */ bin = histo->n_bins - n - 1; for (; bin < histo->n_bins - 1; ++bin) { /* * Note that this function will set the bin having index * "bin + 1". */ ksmodel_set_next_bin_edge(histo, bin, last_row); if (histo->map[bin + 1] > 0) last_row = histo->map[bin + 1]; } /* * Set the new Upper Overflow bin and calculate the number of entries * in each bin. */ ksmodel_set_upper_edge(histo); ksmodel_set_bin_counts(histo); } /** * @brief Shift the time-window of the model backward. Recalculate the current * state of the model. * * @param histo: Input location for the model descriptor. * @param n: Number of bins to shift. */ void ksmodel_shift_backward(struct kshark_trace_histo *histo, int n) { size_t last_row = 0; int bin; if (!histo->data_size || histo->n_bins <= 0) return; if (histo->map[LOB(histo)] == KS_EMPTY_BIN) { /* * The Lower Overflow bin is empty. This means that we are at * the Lower edge of the dataset already. Do nothing in this * case. */ return; } histo->min -= n * histo->bin_size; histo->max -= n * histo->bin_size; if (n >= histo->n_bins) { /* * No overlap between the new and the old range. Recalculate * all bins from scratch. First calculate the new range. */ ksmodel_set_bining(histo, histo->n_bins, histo->min, histo->max); ksmodel_fill(histo, histo->data, histo->data_size); return; } /* * Copy the mapping indexes of all overlaping bins starting from * bin "0" of the old histo. Note that the number of overlaping bins * is histo->n_bins - n. */ memmove(&histo->map[n], &histo->map[0], sizeof(histo->map[0]) * (histo->n_bins - n)); /* Set the new Lower Overflow bin. */ ksmodel_set_lower_edge(histo); /* Calculate only the content of the new (non-overlapping) bins. */ for (bin = 0; bin < n - 1; ++bin) { /* * Note that this function will set the bin having index * "bin + 1". */ ksmodel_set_next_bin_edge(histo, bin, last_row); if (histo->map[bin + 1] > 0) last_row = histo->map[bin + 1]; } /* * Set the new Upper Overflow bin and calculate the number of entries * in each bin. */ ksmodel_set_upper_edge(histo); ksmodel_set_bin_counts(histo); } /** * @brief Move the time-window of the model to a given location. Recalculate * the current state of the model. * * @param histo: Input location for the model descriptor. * @param ts: position in time to be visualized. */ void ksmodel_jump_to(struct kshark_trace_histo *histo, int64_t ts) { int64_t min, max, range_min; if (ts > histo->min && ts < histo->max) { /* * The new position is already inside the range. * Do nothing in this case. */ return; } /* * Calculate the new range without changing the size and the number * of bins. */ min = ts - histo->n_bins * histo->bin_size / 2; /* Make sure that the range does not go outside of the dataset. */ if (min < histo->data[0]->ts) { min = histo->data[0]->ts; } else { range_min = histo->data[histo->data_size - 1]->ts - histo->n_bins * histo->bin_size; if (min > range_min) min = range_min; } max = min + histo->n_bins * histo->bin_size; /* Use the new range to recalculate all bins from scratch. */ ksmodel_set_bining(histo, histo->n_bins, min, max); ksmodel_fill(histo, histo->data, histo->data_size); } static void ksmodel_zoom(struct kshark_trace_histo *histo, double r, int mark, bool zoom_in) { int64_t range, min, max, delta_min; double delta_tot; if (!histo->data_size) return; /* * If the marker is not set, assume that the focal point of the zoom * is the center of the range. */ if (mark < 0) mark = histo->n_bins / 2; range = histo->max - histo->min; /* * Avoid overzooming. If needed, adjust the Scale factor to a the value * which provides bin_size >= 5. */ if (zoom_in && (int64_t) (range * (1. - r)) < (int64_t) histo->n_bins * 5) r = 1. - (histo->n_bins * 5.) / range; /* * Now calculate the new range of the histo. Use the bin of the marker * as a focal point for the zoomout. With this the maker will stay * inside the same bin in the new histo. * * First we set delta_tot to increase by the percentage requested (r). * Then we make delta_min equal to a percentage of delta_tot based on * where the position of the mark is. After this we add / subtract the * original min by the delta_min and subtract / add the max by * delta_tot - delta_min. */ delta_tot = range * r; if (mark == (int)histo->n_bins - 1) delta_min = delta_tot; else delta_min = delta_tot * mark / histo->n_bins; min = zoom_in ? histo->min + delta_min : histo->min - delta_min; max = zoom_in ? histo->max - (size_t) delta_tot + delta_min : histo->max + (size_t) delta_tot - delta_min; /* Make sure the new range doesn't go outside of the dataset. */ if (min < histo->data[0]->ts) min = histo->data[0]->ts; if (max > histo->data[histo->data_size - 1]->ts) max = histo->data[histo->data_size - 1]->ts; /* * Use the new range to recalculate all bins from scratch. Enforce * "In Range" adjustment of the range of the model, in order to avoid * slowly drifting outside of the data-set in the case when the very * first or the very last entry is used as a focal point. */ ksmodel_set_in_range_bining(histo, histo->n_bins, min, max, true); ksmodel_fill(histo, histo->data, histo->data_size); } /** * @brief Extend the time-window of the model. Recalculate the current state * of the model. * * @param histo: Input location for the model descriptor. * @param r: Scale factor of the zoom-out. * @param mark: Focus point of the zoom-out. */ void ksmodel_zoom_out(struct kshark_trace_histo *histo, double r, int mark) { ksmodel_zoom(histo, r, mark, false); } /** * @brief Shrink the time-window of the model. Recalculate the current state * of the model. * * @param histo: Input location for the model descriptor. * @param r: Scale factor of the zoom-in. * @param mark: Focus point of the zoom-in. */ void ksmodel_zoom_in(struct kshark_trace_histo *histo, double r, int mark) { ksmodel_zoom(histo, r, mark, true); } /** * @brief Get the index of the first entry in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * * @returns Index of the first entry in this bin. If the bin is empty the * function returns negative error identifier (KS_EMPTY_BIN). */ ssize_t ksmodel_first_index_at_bin(struct kshark_trace_histo *histo, int bin) { if (bin >= 0 && bin < (int) histo->n_bins) return histo->map[bin]; if (bin == UPPER_OVERFLOW_BIN) return histo->map[UOB(histo)]; if (bin == LOWER_OVERFLOW_BIN) return histo->map[LOB(histo)]; return KS_EMPTY_BIN; } /** * @brief Get the index of the last entry in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * * @returns Index of the last entry in this bin. If the bin is empty the * function returns negative error identifier (KS_EMPTY_BIN). */ ssize_t ksmodel_last_index_at_bin(struct kshark_trace_histo *histo, int bin) { ssize_t index = ksmodel_first_index_at_bin(histo, bin); size_t count = ksmodel_bin_count(histo, bin); if (index >= 0 && count) index += count - 1; return index; } static bool ksmodel_is_visible(struct kshark_entry *e) { if ((e->visible & KS_GRAPH_VIEW_FILTER_MASK) && (e->visible & KS_EVENT_VIEW_FILTER_MASK)) return true; return false; } static struct kshark_entry_request * ksmodel_entry_front_request_alloc(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int sd, int *values) { size_t first, n; /* Get the number of entries in this bin. */ n = ksmodel_bin_count(histo, bin); if (!n) return NULL; first = ksmodel_first_index_at_bin(histo, bin); return kshark_entry_request_alloc(first, n, func, sd, values, vis_only, KS_GRAPH_VIEW_FILTER_MASK); } static struct kshark_entry_request * ksmodel_entry_back_request_alloc(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int sd, int *values) { size_t first, n; /* Get the number of entries in this bin. */ n = ksmodel_bin_count(histo, bin); if (!n) return NULL; first = ksmodel_last_index_at_bin(histo, bin); return kshark_entry_request_alloc(first, n, func, sd, values, vis_only, KS_GRAPH_VIEW_FILTER_MASK); } /** * @brief Get the index of the first entry from a given Cpu in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param cpu: Cpu Id. * * @returns Index of the first entry from a given Cpu in this bin. */ ssize_t ksmodel_first_index_at_cpu(struct kshark_trace_histo *histo, int bin, int sd, int cpu) { size_t i, n, first, not_found = KS_EMPTY_BIN; n = ksmodel_bin_count(histo, bin); if (!n) return not_found; first = ksmodel_first_index_at_bin(histo, bin); for (i = first; i < first + n; ++i) { if (histo->data[i]->cpu == cpu && histo->data[i]->stream_id == sd) { if (ksmodel_is_visible(histo->data[i])) return i; else not_found = KS_FILTERED_BIN; } } return not_found; } /** * @brief Get the index of the first entry from a given Task in a given bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param pid: Process Id of a task. * * @returns Index of the first entry from a given Task in this bin. */ ssize_t ksmodel_first_index_at_pid(struct kshark_trace_histo *histo, int bin, int sd, int pid) { size_t i, n, first, not_found = KS_EMPTY_BIN; n = ksmodel_bin_count(histo, bin); if (!n) return not_found; first = ksmodel_first_index_at_bin(histo, bin); for (i = first; i < first + n; ++i) { if (histo->data[i]->pid == pid && histo->data[i]->stream_id == sd) { if (ksmodel_is_visible(histo->data[i])) return i; else not_found = KS_FILTERED_BIN; } } return not_found; } /** * @brief In a given bin, start from the front end of the bin and go towards * the back end, searching for an entry satisfying the Matching * condition defined by a Matching condition function. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param vis_only: If true, a visible entry is requested. * @param func: Matching condition function. * @param sd: Data stream identifier. * @param values: Matching condition values, used by the Matching condition * function. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Pointer ot a kshark_entry, if an entry has been found. Else NULL. */ const struct kshark_entry * ksmodel_get_entry_front(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int sd, int *values, struct kshark_entry_collection *col, ssize_t *index) { struct kshark_entry_request *req; const struct kshark_entry *entry; if (index) *index = KS_EMPTY_BIN; /* Set the position at the beginning of the bin and go forward. */ req = ksmodel_entry_front_request_alloc(histo, bin, vis_only, func, sd, values); if (!req) return NULL; if (col && col->size) entry = kshark_get_collection_entry_front(req, histo->data, col, index); else entry = kshark_get_entry_front(req, histo->data, index); kshark_free_entry_request(req); return entry; } /** * @brief In a given bin, start from the back end of the bin and go towards * the front end, searching for an entry satisfying the Matching * condition defined by a Matching condition function. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param vis_only: If true, a visible entry is requested. * @param func: Matching condition function. * @param sd: Data stream identifier. * @param values: Matching condition values, used by the Matching condition * function. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Pointer ot a kshark_entry, if an entry has been found. Else NULL. */ const struct kshark_entry * ksmodel_get_entry_back(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int sd, int *values, struct kshark_entry_collection *col, ssize_t *index) { struct kshark_entry_request *req; const struct kshark_entry *entry; if (index) *index = KS_EMPTY_BIN; /* Set the position at the end of the bin and go backwards. */ req = ksmodel_entry_back_request_alloc(histo, bin, vis_only, func, sd, values); if (!req) return NULL; if (col && col->size) entry = kshark_get_collection_entry_back(req, histo->data, col, index); else entry = kshark_get_entry_back(req, histo->data, index); kshark_free_entry_request(req); return entry; } static int ksmodel_get_entry_pid(const struct kshark_entry *entry) { if (!entry) { /* No data has been found. */ return KS_EMPTY_BIN; } /* * Note that if some data has been found, but this data is * filtered-outa, the Dummy entry is returned. The PID of the Dummy * entry is KS_FILTERED_BIN. */ return entry->pid; } /** * @brief In a given bin, start from the front end of the bin and go towards * the back end, searching for an entry from a given CPU. Return * the Process Id of the task of the entry found. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param cpu: CPU Id. * @param vis_only: If true, a visible entry is requested. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Process Id of the task if an entry has been found. Else a negative * Identifier (KS_EMPTY_BIN or KS_FILTERED_BIN). */ int ksmodel_get_pid_front(struct kshark_trace_histo *histo, int bin, int sd, int cpu, bool vis_only, struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry; if (cpu < 0) return KS_EMPTY_BIN; entry = ksmodel_get_entry_front(histo, bin, vis_only, kshark_match_cpu, sd, &cpu, col, index); return ksmodel_get_entry_pid(entry); } /** * @brief In a given bin, start from the back end of the bin and go towards * the front end, searching for an entry from a given CPU. Return * the Process Id of the task of the entry found. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param cpu: CPU Id. * @param vis_only: If true, a visible entry is requested. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Process Id of the task if an entry has been found. Else a negative * Identifier (KS_EMPTY_BIN or KS_FILTERED_BIN). */ int ksmodel_get_pid_back(struct kshark_trace_histo *histo, int bin, int sd, int cpu, bool vis_only, struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry; if (cpu < 0) return KS_EMPTY_BIN; entry = ksmodel_get_entry_back(histo, bin, vis_only, kshark_match_cpu, sd, &cpu, col, index); return ksmodel_get_entry_pid(entry); } static int ksmodel_get_entry_cpu(const struct kshark_entry *entry) { if (!entry) { /* No data has been found. */ return KS_EMPTY_BIN; } /* * Note that if some data has been found, but this data is * filtered-outa, the Dummy entry is returned. The CPU Id of the Dummy * entry is KS_FILTERED_BIN. */ return entry->cpu; } /** * @brief In a given bin, start from the front end of the bin and go towards * the back end, searching for an entry from a given PID. Return * the CPU Id of the entry found. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param pid: Process Id. * @param vis_only: If true, a visible entry is requested. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns The CPU Id of the task if an entry has been found. Else a negative * Identifier (KS_EMPTY_BIN or KS_FILTERED_BIN). */ int ksmodel_get_cpu_front(struct kshark_trace_histo *histo, int bin, int sd, int pid, bool vis_only, struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry; if (pid < 0) return KS_EMPTY_BIN; entry = ksmodel_get_entry_front(histo, bin, vis_only, kshark_match_pid, sd, &pid, col, index); return ksmodel_get_entry_cpu(entry); } /** * @brief In a given bin, start from the back end of the bin and go towards * the front end, searching for an entry from a given PID. Return * the CPU Id of the entry found. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param pid: Process Id. * @param vis_only: If true, a visible entry is requested. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns The CPU Id of the task if an entry has been found. Else a negative * Identifier (KS_EMPTY_BIN or KS_FILTERED_BIN). */ int ksmodel_get_cpu_back(struct kshark_trace_histo *histo, int bin, int sd, int pid, bool vis_only, struct kshark_entry_collection *col, ssize_t *index) { const struct kshark_entry *entry; if (pid < 0) return KS_EMPTY_BIN; entry = ksmodel_get_entry_back(histo, bin, vis_only, kshark_match_pid, sd, &pid, col, index); return ksmodel_get_entry_cpu(entry); } /** * @brief Check if a visible trace event from a given Cpu exists in this bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param cpu: Cpu Id. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns True, if a visible entry exists in this bin. Else false. */ bool ksmodel_cpu_visible_event_exist(struct kshark_trace_histo *histo, int bin, int sd, int cpu, struct kshark_entry_collection *col, ssize_t *index) { struct kshark_entry_request *req; const struct kshark_entry *entry; if (index) *index = KS_EMPTY_BIN; /* Set the position at the beginning of the bin and go forward. */ req = ksmodel_entry_front_request_alloc(histo, bin, true, kshark_match_cpu, sd, &cpu); if (!req) return false; /* * The default visibility mask of the Model Data request is * KS_GRAPH_VIEW_FILTER_MASK. Change the mask to * KS_EVENT_VIEW_FILTER_MASK because we want to find a visible event. */ req->vis_mask = KS_EVENT_VIEW_FILTER_MASK; if (col && col->size) entry = kshark_get_collection_entry_front(req, histo->data, col, index); else entry = kshark_get_entry_front(req, histo->data, index); kshark_free_entry_request(req); if (!entry || !entry->visible) { /* No visible entry has been found. */ return false; } return true; } /** * @brief Check if a visible trace event from a given Task exists in this bin. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param pid: Process Id of the task. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns True, if a visible entry exists in this bin. Else false. */ bool ksmodel_task_visible_event_exist(struct kshark_trace_histo *histo, int bin, int sd, int pid, struct kshark_entry_collection *col, ssize_t *index) { struct kshark_entry_request *req; const struct kshark_entry *entry; if (index) *index = KS_EMPTY_BIN; /* Set the position at the beginning of the bin and go forward. */ req = ksmodel_entry_front_request_alloc(histo, bin, true, kshark_match_pid, sd, &pid); if (!req) return false; /* * The default visibility mask of the Model Data request is * KS_GRAPH_VIEW_FILTER_MASK. Change the mask to * KS_EVENT_VIEW_FILTER_MASK because we want to find a visible event. */ req->vis_mask = KS_EVENT_VIEW_FILTER_MASK; if (col && col->size) entry = kshark_get_collection_entry_front(req, histo->data, col, index); else entry = kshark_get_entry_front(req, histo->data, index); kshark_free_entry_request(req); if (!entry || !entry->visible) { /* No visible entry has been found. */ return false; } return true; } static bool match_cpu_missed_events(__attribute__ ((unused)) struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *cpu) { return e->event_id == KS_EVENT_OVERFLOW && e->cpu == *cpu && e->stream_id == sd; } static bool match_pid_missed_events(__attribute__ ((unused)) struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *pid) { return e->event_id == KS_EVENT_OVERFLOW && e->pid == *pid && e->stream_id == sd; } /** * @brief In a given CPU and bin, start from the front end of the bin and go towards * the back end, searching for a Missed Events entry. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param cpu: CPU Id. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Pointer ot a kshark_entry, if an entry has been found. Else NULL. */ const struct kshark_entry * ksmodel_get_cpu_missed_events(struct kshark_trace_histo *histo, int bin, int sd, int cpu, struct kshark_entry_collection *col, ssize_t *index) { return ksmodel_get_entry_front(histo, bin, true, match_cpu_missed_events, sd, &cpu, col, index); } /** * @brief In a given task and bin, start from the front end of the bin and go towards * the back end, searching for a Missed Events entry. * * @param histo: Input location for the model descriptor. * @param bin: Bin id. * @param sd: Data stream identifier. * @param pid: Process Id of the task. * @param col: Optional input location for Data collection. * @param index: Optional output location for the index of the requested * entry inside the array. * * @returns Pointer ot a kshark_entry, if an entry has been found. Else NULL. */ const struct kshark_entry * ksmodel_get_task_missed_events(struct kshark_trace_histo *histo, int bin, int sd, int pid, struct kshark_entry_collection *col, ssize_t *index) { return ksmodel_get_entry_front(histo, bin, true, match_pid_missed_events, sd, &pid, col, index); } /** * @brief Find the bin Id of a give entry. * * @param histo: Input location for the model descriptor. * @param entry: Input location for entry. * * @returns If the timestamp of the entry is inside the range of the model the * function returns the Id of the bin it belongs to. * If the timestamp of the entry is outside of the range of the model * the function returns UPPER_OVERFLOW_BIN or LOWER_OVERFLOW_BIN * (negative values). */ int ksmodel_get_bin(struct kshark_trace_histo *histo, const struct kshark_entry *entry) { if (entry->ts < histo->min) return UPPER_OVERFLOW_BIN; if (entry->ts > histo->max) return LOWER_OVERFLOW_BIN; if (entry->ts == histo->max) return histo->n_bins - 1; return (entry->ts - histo->min) / histo->bin_size; } kernel-shark-kernelshark-v2.4.0/src/libkshark-model.h000066400000000000000000000120451477354127100226250ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark-model.h * @brief Time series visualization model for tracing data. */ #ifndef _LIB_KSHARK_MODEL_H #define _LIB_KSHARK_MODEL_H // KernelShark #include "libkshark.h" #ifdef __cplusplus extern "C" { #endif // __cplusplus /** * Overflow Bin identifiers. The two overflow bins are used to hold the data * outside the visualized range. */ enum OverflowBin { /** * Identifier of the Upper Overflow Bin. This bin is used to hold the * data after (in time) the end of the visualized range. */ UPPER_OVERFLOW_BIN = -1, /** * Identifier of the Lower Overflow Bin. This bin is used to hold the * data before (in time) the beginning of the visualized range. */ LOWER_OVERFLOW_BIN = -2, }; /** Structure describing the current state of the visualization model. */ struct kshark_trace_histo { /** Trace data array. */ struct kshark_entry **data; /** The size of the data array. */ size_t data_size; /** The first entry (index of data array) in each bin. */ ssize_t *map; /** Number of entries in each bin. */ size_t *bin_count; /** Total number of entries in all bin except the overflow bins. */ int tot_count; /** * Lower edge of the time-window to be visualized. Only entries having * timestamp >= min will be visualized. */ int64_t min; /** * Upper edge of the time-window to be visualized. Only entries having * timestamp <= max will be visualized. */ int64_t max; /** The size in time for each bin. */ int64_t bin_size; /** Number of bins. */ int n_bins; }; void ksmodel_init(struct kshark_trace_histo *histo); void ksmodel_clear(struct kshark_trace_histo *histo); void ksmodel_set_bining(struct kshark_trace_histo *histo, size_t n, int64_t min, int64_t max); void ksmodel_fill(struct kshark_trace_histo *histo, struct kshark_entry **data, size_t n); size_t ksmodel_bin_count(struct kshark_trace_histo *histo, int bin); void ksmodel_shift_forward(struct kshark_trace_histo *histo, int n); void ksmodel_shift_backward(struct kshark_trace_histo *histo, int n); void ksmodel_jump_to(struct kshark_trace_histo *histo, int64_t ts); void ksmodel_zoom_out(struct kshark_trace_histo *histo, double r, int mark); void ksmodel_zoom_in(struct kshark_trace_histo *histo, double r, int mark); ssize_t ksmodel_first_index_at_bin(struct kshark_trace_histo *histo, int bin); ssize_t ksmodel_last_index_at_bin(struct kshark_trace_histo *histo, int bin); ssize_t ksmodel_first_index_at_cpu(struct kshark_trace_histo *histo, int bin, int sd, int cpu); ssize_t ksmodel_first_index_at_pid(struct kshark_trace_histo *histo, int bin, int sd, int pid); const struct kshark_entry * ksmodel_get_entry_front(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int sd, int *values, struct kshark_entry_collection *col, ssize_t *index); const struct kshark_entry * ksmodel_get_entry_back(struct kshark_trace_histo *histo, int bin, bool vis_only, matching_condition_func func, int sd, int *values, struct kshark_entry_collection *col, ssize_t *index); int ksmodel_get_pid_front(struct kshark_trace_histo *histo, int bin, int sd, int cpu, bool vis_only, struct kshark_entry_collection *col, ssize_t *index); int ksmodel_get_pid_back(struct kshark_trace_histo *histo, int bin, int sd, int cpu, bool vis_only, struct kshark_entry_collection *col, ssize_t *index); int ksmodel_get_cpu_front(struct kshark_trace_histo *histo, int bin, int sd, int pid, bool vis_only, struct kshark_entry_collection *col, ssize_t *index); int ksmodel_get_cpu_back(struct kshark_trace_histo *histo, int bin, int sd, int pid, bool vis_only, struct kshark_entry_collection *col, ssize_t *index); bool ksmodel_cpu_visible_event_exist(struct kshark_trace_histo *histo, int bin, int sd, int cpu, struct kshark_entry_collection *col, ssize_t *index); bool ksmodel_task_visible_event_exist(struct kshark_trace_histo *histo, int bin, int sd, int pid, struct kshark_entry_collection *col, ssize_t *index); const struct kshark_entry * ksmodel_get_cpu_missed_events(struct kshark_trace_histo *histo, int bin, int sd, int cpu, struct kshark_entry_collection *col, ssize_t *index); const struct kshark_entry * ksmodel_get_task_missed_events(struct kshark_trace_histo *histo, int bin, int sd, int pid, struct kshark_entry_collection *col, ssize_t *index); static inline int64_t ksmodel_bin_ts(struct kshark_trace_histo *histo, int bin) { return (histo->min + bin*histo->bin_size); } static inline double ksmodel_bin_time(struct kshark_trace_histo *histo, int bin) { return ksmodel_bin_ts(histo, bin) * 1e-9; } int ksmodel_get_bin(struct kshark_trace_histo *histo, const struct kshark_entry *entry); #ifdef __cplusplus } #endif // __cplusplus #endif kernel-shark-kernelshark-v2.4.0/src/libkshark-plot.c000066400000000000000000000247371477354127100225110ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark-plot.c * @brief Basic tools for OpenGL plotting. */ // C #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif // _GNU_SOURCE #include #include #include // KernelShark #include "libkshark-plot.h" /* * STB TrueType (single-file public domain library) * https://github.com/nothings/stb */ /** Generate implementation. */ #define STB_TRUETYPE_IMPLEMENTATION /** Make the implementation private. */ #define STBTT_STATIC #include "stb_truetype.h" #ifdef GLUT_FOUND #include /** * @brief Create an empty scene for drawing. * * @param width: Width of the screen window in pixels. * @param height: Height of the screen window in pixels. */ void ksplot_make_scene(int width, int height) { /* Set Display mode. */ glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); /* Prevent the program from exiting when a window is closed. */ glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); /* Set window size. */ glutInitWindowSize(width, height); /* Set window position on screen. */ glutInitWindowPosition(50, 50); /* Open the screen window. */ glutCreateWindow("KernelShark Plot"); ksplot_resize_opengl(width, height); } #endif // GLUT_FOUND /** * @brief Initialize OpenGL. * * @param dpr: Device Pixel Ratio. */ void ksplot_init_opengl(int dpr) { glDisable(GL_TEXTURE_2D); glDisable(GL_DEPTH_TEST); glDisable(GL_COLOR_MATERIAL); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_POLYGON_SMOOTH); glLineWidth(1.5 * dpr); glPointSize(2.5 * dpr); glClearColor(1, 1, 1, 1); // White } /** * @brief To be called whenever the OpenGL window has been resized. * * @param width: Width of the screen window in pixels. * @param height: Height of the screen window in pixels. */ void ksplot_resize_opengl(int width, int height) { glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); /* * Set the origin of the coordinate system to be the top left corner. * The "Y" coordinate is inverted. */ gluOrtho2D(0, width, height, 0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } /** * @brief Draw a point. * * @param p: Input location for the point object. * @param col: The color of the point. * @param size: The size of the point. */ void ksplot_draw_point(const struct ksplot_point *p, const struct ksplot_color *col, float size) { if (!p || !col || size < .5f) return; glPointSize(size); glBegin(GL_POINTS); glColor3ub(col->red, col->green, col->blue); glVertex2i(p->x, p->y); glEnd(); } /** * @brief Draw a line. * * @param a: Input location for the first finishing point of the line. * @param b: Input location for the second finishing point of the line. * @param col: The color of the line. * @param size: The size of the line. */ void ksplot_draw_line(const struct ksplot_point *a, const struct ksplot_point *b, const struct ksplot_color *col, float size) { if (!a || !b || !col || size < .5f) return; glLineWidth(size); glBegin(GL_LINES); glColor3ub(col->red, col->green, col->blue); glVertex2i(a->x, a->y); glVertex2i(b->x, b->y); glEnd(); } /** * @brief Draw the a polyline. * * @param points: Input location for the array of points defining the polyline. * @param n_points: The size of the array of points. * @param col: The color of the polyline. * @param size: The size of the polyline. */ void ksplot_draw_polyline(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size) { if (!points || !n_points || !col || size < .5f) return; /* Loop over the points of the polygon and draw connecting lines. */ for(size_t i = 1; i < n_points; ++i) ksplot_draw_line(&points[i - 1], &points[i], col, size); } /** * @brief Draw a polygon. * * @param points: Input location for the array of points defining the polygon. * @param n_points: The size of the array of points. * @param col: The color of the polygon. * @param size: The size of the polygon. */ void ksplot_draw_polygon(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size) { if (!points || !n_points || !col || size < .5f) return; if (n_points == 1) { ksplot_draw_point(points, col, size); return; } if (n_points == 2) { ksplot_draw_line(points, points + 1, col, size); return; } /* Draw a Triangle Fan. */ glBegin(GL_TRIANGLE_FAN); glColor3ub(col->red, col->green, col->blue); for (size_t i = 0; i < n_points; ++i) glVertex2i(points[i].x, points[i].y); glVertex2i(points[0].x, points[0].y); glEnd(); } /** * @brief Draw the contour of a polygon. * * @param points: Input location for the array of points defining the polygon. * @param n_points: The size of the array of points. * @param col: The color of the polygon. * @param size: The size of the polygon. */ void ksplot_draw_polygon_contour(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size) { if (!points || !n_points || !col || size < .5f) return; /* Loop over the points of the polygon and draw a polyline. */ ksplot_draw_polyline(points, n_points, col, size); /* Close the contour. */ ksplot_draw_line(&points[0], &points[n_points - 1], col, size); } /** * @brief Find a TrueType font file. * * @param font_family: The family name of the font. * @param font_name: The name of the font file without the extention. * * @returns A string containing the absolute path to the TrueType font file * on success, or NULL on failure. The user is responsible for freeing * the string. */ char *ksplot_find_font_file(const char *font_family, const char *font_name) { char buffer[1024], *end; char *cmd = NULL; int ret; FILE *f; /* * This is sorta a hack. * FIXME: Do this a bit more properly. */ ret = asprintf(&cmd, "fc-list \'%s\' |grep %s.ttf", font_family, font_name); if (ret <= 0) goto fail; f = popen(cmd, "r"); free(cmd); if (f == NULL) goto fail; end = fgets(buffer, sizeof(buffer), f); pclose(f); if (!end) goto fail; end = strchr(buffer, ':'); if (!end) goto fail; return strndup(buffer, end - buffer); fail: fprintf(stderr, "Failed to find font file.\n" ); return NULL; } /** The size of the bitmap matrix used to load the font. */ #define KS_FONT_BITMAP_SIZE 1024 /** * @brief Initialize a font. * * @param font: Output location for the font descriptor. * @param size: The size of the font. * @param file: Input location for the truetype font file. */ bool ksplot_init_font(struct ksplot_font *font, float size, const char *file) { unsigned char bitmap[KS_FONT_BITMAP_SIZE * KS_FONT_BITMAP_SIZE]; int ascent, descent, line_gap, lsb; ssize_t buff_size, ret; unsigned char *buffer; stbtt_fontinfo info; FILE *font_file; struct stat st; float scale; ret = stat(file, &st); if (ret < 0) { fprintf(stderr, "Font file %s not found.\n", file); return NULL; } font_file = fopen(file, "rb"); if (!font_file) { fprintf(stderr, "Failed to open font file!\n"); return false; } /* Get the size of the file. */ buff_size = st.st_size; buffer = malloc(buff_size); if (!buffer) { fprintf(stderr, "Failed to allocat memory for font!\n"); goto close_file; } ret = fread(buffer, buff_size, 1, font_file); fclose(font_file); if (ret == 0) { fprintf(stderr, "Failed to read from font file!\n"); goto free_buffer; } if (!stbtt_InitFont(&info, buffer, 0)) { fprintf(stderr, "Failed to init font!\n"); goto free_buffer; } /* Get the font's metrics. */ scale = stbtt_ScaleForMappingEmToPixels(&info, size); stbtt_GetFontVMetrics(&info, &ascent, &descent, &line_gap); if (line_gap == 0) line_gap = - descent; /* * Calculate the dimensions of the font. Note that the descent has * a negative value. */ font->height = (- descent + ascent + line_gap) * scale; font->base = (- descent + line_gap / 2) * scale; font->size = size; /* * The width of the 'z' character will be considered as an average * character width. */ stbtt_GetCodepointHMetrics(&info, 'z', &font->char_width, &lsb); font->char_width *= scale; ret = stbtt_BakeFontBitmap(buffer, 0, size, bitmap, KS_FONT_BITMAP_SIZE, KS_FONT_BITMAP_SIZE, KS_SPACE_CHAR, KS_N_CHAR, font->cdata); if (ret <= 0) { fprintf(stderr, "Failed to bake font bitmap!\n"); goto free_buffer; } free(buffer); glGenTextures(1, &font->texture_id); glBindTexture(GL_TEXTURE_2D, font->texture_id); glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, KS_FONT_BITMAP_SIZE, KS_FONT_BITMAP_SIZE, 0, GL_ALPHA, GL_UNSIGNED_BYTE, bitmap); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); return true; close_file: fclose(font_file); free_buffer: free(buffer); return false; } /** * @brief Print(draw) a text. * * @param font: Intput location for the font descriptor. * @param col: The color of the polygon. * @param x: Horizontal coordinate of the beginning of the text. * @param y: Verticalal coordinate of the beginning of the text. * @param text: The text to be drawn. */ void ksplot_print_text(const struct ksplot_font *font, const struct ksplot_color *col, float x, float y, const char *text) { glEnable(GL_TEXTURE_2D); /* Set the color of the text. */ if (col) glColor3ub(col->red, col->green, col->blue); else glColor3ub(0, 0, 0); // Black glBindTexture(GL_TEXTURE_2D, font->texture_id); glBegin(GL_QUADS); for (; *text; ++text) { if (*text < KS_SPACE_CHAR && *text > KS_TILDA_CHAR) continue; stbtt_aligned_quad quad; /* "x" is incremented here to a new position. */ stbtt_GetBakedQuad(font->cdata, KS_FONT_BITMAP_SIZE, KS_FONT_BITMAP_SIZE, *text - KS_SPACE_CHAR, &x, &y, &quad, 1); glTexCoord2f(quad.s0, quad.t1); glVertex2f(quad.x0, quad.y1); glTexCoord2f(quad.s1, quad.t1); glVertex2f(quad.x1, quad.y1); glTexCoord2f(quad.s1, quad.t0); glVertex2f(quad.x1, quad.y0); glTexCoord2f(quad.s0, quad.t0); glVertex2f(quad.x0, quad.y0); } glEnd(); glDisable(GL_TEXTURE_2D); } kernel-shark-kernelshark-v2.4.0/src/libkshark-plot.h000066400000000000000000000057441477354127100225130ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file libkshark-plot.h * @brief Basic tools for OpenGL plotting. */ #ifndef _LIB_KSHARK_PLOT_H #define _LIB_KSHARK_PLOT_H // C #include // OpenGL #include #include /* * STB TrueType (single-file public domain library) * https://github.com/nothings/stb */ #include "stb_truetype.h" #ifdef __cplusplus extern "C" { #endif // KernelShark #include "KsCmakeDef.hpp" /** Structure defining a RGB color. */ struct ksplot_color { /** The Red component of the color. */ uint8_t red; /** The Green component of the color. */ uint8_t green; /** The Blue component of the color. */ uint8_t blue; }; /** Structure defining a 2D point. */ struct ksplot_point { /** The horizontal coordinate of the point in pixels. */ int x; /** The vertical coordinate of the pointin in pixels. */ int y; }; #ifdef GLUT_FOUND void ksplot_make_scene(int width, int height); #endif // GLUT_FOUND void ksplot_init_opengl(int dpr); void ksplot_resize_opengl(int width, int height); void ksplot_draw_point(const struct ksplot_point *p, const struct ksplot_color *col, float size); void ksplot_draw_line(const struct ksplot_point *a, const struct ksplot_point *b, const struct ksplot_color *col, float size); void ksplot_draw_polyline(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size); void ksplot_draw_polygon(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size); void ksplot_draw_polygon_contour(const struct ksplot_point *points, size_t n_points, const struct ksplot_color *col, float size); /** The index of the "Space" character. */ #define KS_SPACE_CHAR 32 /** The index of the "Tilda" character. */ #define KS_TILDA_CHAR 126 /** Total number of characters supported for drawing. */ #define KS_N_CHAR (KS_TILDA_CHAR - KS_SPACE_CHAR + 1) /** Structure defining a font. */ struct ksplot_font { /** Identifier of the font's texture. */ GLuint texture_id; /** Font's texture baking data. */ stbtt_bakedchar cdata[KS_N_CHAR]; /** The height of a text line. */ int height; /** The vertical position of the font's baseline. */ int base; /** The size of the font. */ int size; /** * The width of the 'z' character. To be use as an average character * width. */ int char_width; }; /** Check if the texture of the font is loaded. */ static inline bool ksplot_font_is_loaded(struct ksplot_font *f) { return f->texture_id > 1; } char *ksplot_find_font_file(const char *font_family, const char *font_name); bool ksplot_init_font(struct ksplot_font *font, float size, const char *file); void ksplot_print_text(const struct ksplot_font *font, const struct ksplot_color *col, float x, float y, const char *text); #ifdef __cplusplus } #endif #endif kernel-shark-kernelshark-v2.4.0/src/libkshark-plugin.c000066400000000000000000000462231477354127100230230ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark-plugin.c * @brief KernelShark plugins. */ // C #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif // _GNU_SOURCE #include #include #include #include #include #include // KernelShark #include "libkshark-plugin.h" #include "libkshark-tepdata.h" #include "libkshark.h" static struct kshark_event_proc_handler * data_event_handler_alloc(int event_id, kshark_plugin_event_handler_func evt_func) { struct kshark_event_proc_handler *handler = malloc(sizeof(*handler)); if (!handler) { fputs("failed to allocate memory for event handler\n", stderr); return NULL; } handler->next = NULL; handler->id = event_id; handler->event_func = evt_func; return handler; } static struct kshark_draw_handler * data_draw_handler_alloc(kshark_plugin_draw_handler_func draw_func) { struct kshark_draw_handler *handler = malloc(sizeof(*handler)); if (!handler) { fputs("failed to allocate memory for draw handler\n", stderr); return NULL; } handler->next = NULL; handler->draw_func = draw_func; return handler; } /** * @brief Search the list of event handlers for a handle associated with a * given event type. * * @param handlers: Input location for the Event handler list. * @param event_id: Event Id to search for. */ struct kshark_event_proc_handler * kshark_find_event_handler(struct kshark_event_proc_handler *handlers, int event_id) { for (; handlers; handlers = handlers->next) if (handlers->id == event_id) return handlers; return NULL; } /** * @brief Add new event handler to an existing list of handlers. * * @param stream: Input location for a Trace data stream pointer. * @param event_id: Event Id. * @param evt_func: Input location for an Event action provided by the plugin. * * @returns Zero on success, or a negative error code on failure. */ int kshark_register_event_handler(struct kshark_data_stream *stream, int event_id, kshark_plugin_event_handler_func evt_func) { struct kshark_event_proc_handler *handler = data_event_handler_alloc(event_id, evt_func); if(!handler) return -ENOMEM; handler->next = stream->event_handlers; stream->event_handlers = handler; return 0; } /** * @brief Search the list for a specific plugin handle. If such a plugin handle * exists, unregister (remove and free) this handle from the list. * * @param stream: Input location for a Trace data stream pointer. * @param event_id: Event Id of the plugin handler to be unregistered. * @param evt_func: Event action function to be unregistered. */ int kshark_unregister_event_handler(struct kshark_data_stream *stream, int event_id, kshark_plugin_event_handler_func evt_func) { struct kshark_event_proc_handler **last; if (stream->stream_id < 0) return 0; for (last = &stream->event_handlers; *last; last = &(*last)->next) { if ((*last)->id == event_id && (*last)->event_func == evt_func) { struct kshark_event_proc_handler *this_handler; this_handler = *last; *last = this_handler->next; free(this_handler); return 0; } } return -EFAULT; } /** * @brief Free all Event handlers in a given list. * * @param handlers: Input location for the Event handler list. */ void kshark_free_event_handler_list(struct kshark_event_proc_handler *handlers) { struct kshark_event_proc_handler *last; while (handlers) { last = handlers; handlers = handlers->next; free(last); } } /** * @brief Add new event handler to an existing list of handlers. * * @param stream: Input location for a Trace data stream pointer. * @param draw_func: Input location for a Draw action provided by the plugin. * * @returns Zero on success, or a negative error code on failure. */ int kshark_register_draw_handler(struct kshark_data_stream *stream, kshark_plugin_draw_handler_func draw_func) { struct kshark_draw_handler *handler = data_draw_handler_alloc(draw_func); if(!handler) return -ENOMEM; handler->next = stream->draw_handlers; stream->draw_handlers = handler; return 0; } /** * @brief Search the list for a specific plugin handle. If such a plugin handle * exists, unregister (remove and free) this handle from the list. * * @param stream: Input location for a Trace data stream pointer. * @param draw_func: Draw action function to be unregistered. */ void kshark_unregister_draw_handler(struct kshark_data_stream *stream, kshark_plugin_draw_handler_func draw_func) { struct kshark_draw_handler **last; if (stream->stream_id < 0) return; for (last = &stream->draw_handlers; *last; last = &(*last)->next) { if ((*last)->draw_func == draw_func) { struct kshark_draw_handler *this_handler; this_handler = *last; *last = this_handler->next; free(this_handler); return; } } } /** * @brief Free all DRaw handlers in a given list. * * @param handlers: Input location for the Draw handler list. */ void kshark_free_draw_handler_list(struct kshark_draw_handler *handlers) { struct kshark_draw_handler *last; while (handlers) { last = handlers; handlers = handlers->next; free(last); } } /** Close and free this plugin. */ static void free_plugin(struct kshark_plugin_list *plugin) { if (plugin->handle) dlclose(plugin->handle); if (plugin->process_interface) { free(plugin->process_interface->name); free(plugin->process_interface); } if (plugin->readout_interface) { free(plugin->readout_interface->name); free(plugin->readout_interface); } free(plugin->name); free(plugin->file); free(plugin); } /** * @brief Allocate memory for a new plugin. Add this plugin to the list of * plugins. * * @param kshark_ctx: Input location for the session context pointer. * @param name: The name of the plugin to register. * @param file: The plugin object file to load. * * @returns The plugin object on success, or NULL on failure. */ struct kshark_plugin_list * kshark_register_plugin(struct kshark_context *kshark_ctx, const char *name, const char *file) { kshark_plugin_load_func init_func, close_func; kshark_check_data_func check_func; kshark_format_func format_func; struct kshark_plugin_list *plugin; struct stat st; int ret; printf("loading plugin \"%s\" from %s\n", name, file); plugin = kshark_find_plugin(kshark_ctx->plugins, file); if(plugin) { fputs("the plugin is already loaded.\n", stderr); return NULL; } ret = stat(file, &st); if (ret < 0) { fprintf(stderr, "plugin %s not found.\n", file); return NULL; } plugin = calloc(1, sizeof(struct kshark_plugin_list)); if (!plugin) { fputs("failed to allocate memory for plugin.\n", stderr); return NULL; } plugin->handle = dlopen(file, RTLD_NOW | RTLD_GLOBAL); if (!plugin->handle) { fprintf(stderr, "failed to open plugin file.\n%s\n", dlerror()); goto fail; } plugin->file = strdup(file); plugin->name = strdup(name); if (!plugin->file|| !plugin->name) goto fail; plugin->ctrl_interface = dlsym(plugin->handle, KSHARK_MENU_PLUGIN_INITIALIZER_NAME); init_func = dlsym(plugin->handle, KSHARK_PLOT_PLUGIN_INITIALIZER_NAME); close_func = dlsym(plugin->handle, KSHARK_PLOT_PLUGIN_DEINITIALIZER_NAME); if (init_func && close_func) { plugin->process_interface = calloc(1, sizeof(*plugin->process_interface)); if (!plugin->process_interface) goto fail; plugin->process_interface->name = strdup(plugin->name); if (!plugin->process_interface->name) goto fail; plugin->process_interface->init = init_func; plugin->process_interface->close = close_func; } else if (init_func || close_func) { fprintf(stderr, "incomplete draw interface found (will be ignored).\n%s\n", dlerror()); } init_func = dlsym(plugin->handle, KSHARK_INPUT_INITIALIZER_NAME); close_func = dlsym(plugin->handle, KSHARK_INPUT_DEINITIALIZER_NAME); check_func = dlsym(plugin->handle, KSHARK_INPUT_CHECK_NAME); format_func = dlsym(plugin->handle, KSHARK_INPUT_FORMAT_NAME); if (init_func && close_func && check_func && format_func) { plugin->readout_interface = calloc(1, sizeof(*plugin->readout_interface)); if (!plugin->readout_interface) goto fail; plugin->readout_interface->name = strdup(plugin->name); if (!plugin->readout_interface->name) goto fail; plugin->readout_interface->init = init_func; plugin->readout_interface->close = close_func; plugin->readout_interface->check_data = check_func; kshark_set_data_format(plugin->readout_interface->data_format, format_func()); kshark_register_input(kshark_ctx, plugin->readout_interface); } else if (init_func || close_func || check_func) { fprintf(stderr, "incomplete input interface found (will be ignored).\n%s\n", dlerror()); } if (!plugin->process_interface && !plugin->readout_interface && !plugin->ctrl_interface) { fputs("no interfaces found in this plugin.\n", stderr); goto fail; } plugin->next = kshark_ctx->plugins; kshark_ctx->plugins = plugin; kshark_ctx->n_plugins++; return plugin; fail: fprintf(stderr, "cannot load plugin '%s'\n", file); if (plugin->handle) dlclose(plugin->handle); free_plugin(plugin); return NULL; } /** * @brief Unrgister a plugin. * * @param kshark_ctx: Input location for the session context pointer. * @param name: The name of the plugin to unregister. * @param file: The plugin object file to unregister. */ void kshark_unregister_plugin(struct kshark_context *kshark_ctx, const char *name, const char *file) { struct kshark_plugin_list **last; for (last = &kshark_ctx->plugins; *last; last = &(*last)->next) { if (strcmp((*last)->process_interface->name, name) == 0 && strcmp((*last)->file, file) == 0) { struct kshark_plugin_list *this_plugin; this_plugin = *last; *last = this_plugin->next; free_plugin(this_plugin); kshark_ctx->n_plugins--; return; } } } /** * @brief Free all plugins in a given list. * * @param plugins: Input location for the plugins list. */ void kshark_free_plugin_list(struct kshark_plugin_list *plugins) { struct kshark_data_stream stream; struct kshark_plugin_list *last; stream.stream_id = KS_PLUGIN_CONTEXT_FREE; while (plugins) { last = plugins; plugins = plugins->next; if (last->process_interface) last->process_interface->close(&stream); free_plugin(last); } } /** * @brief Register a data readout interface (input). * * @param kshark_ctx: Input location for the context pointer. * @param plugin: Input location for the data readout interface (input). */ struct kshark_dri_list * kshark_register_input(struct kshark_context *kshark_ctx, struct kshark_dri *plugin) { struct kshark_dri_list *input; struct kshark_dri_list **last; const char *name_err, *format_err; if (strcmp(plugin->data_format, TEP_DATA_FORMAT_IDENTIFIER) == 0) { name_err = "built in"; format_err = TEP_DATA_FORMAT_IDENTIFIER; goto conflict; } for (last = &kshark_ctx->inputs; *last; last = &(*last)->next) if (strcmp((*last)->interface->name, plugin->name) == 0 || strcmp((*last)->interface->data_format, plugin->data_format) == 0 ) { name_err = (*last)->interface->name; format_err = (*last)->interface->data_format; goto conflict; } input = calloc(1, sizeof(*input)); if (!input) { fputs("failed to allocate memory for readout plugin.\n", stderr); return NULL; } input->interface = plugin; input->next = kshark_ctx->inputs; kshark_ctx->inputs = input; kshark_ctx->n_inputs++; return input; conflict: fprintf(stderr, "Failed to register readout plugin (name=\'%s\', data_format=\'%s\')\n", plugin->name, plugin->data_format); fprintf(stderr, "Conflict with registered readout (name=\'%s\', data_format=\'%s\')\n", name_err, format_err); return NULL; } /** * @brief Unrgister a data readout interface (input). * * @param kshark_ctx: Input location for the context pointer. * @param name: The data readout's name. */ void kshark_unregister_input(struct kshark_context *kshark_ctx, const char *name) { struct kshark_dri_list **last; for (last = &kshark_ctx->inputs; *last; last = &(*last)->next) { if (strcmp((*last)->interface->name, name) == 0) { struct kshark_dri_list *this_input; this_input = *last; *last = this_input->next; free(this_input); kshark_ctx->n_inputs--; return; } } } /** * @brief Free a list of plugin interfaces. * * @param plugins: Input location for the plugins list. */ void kshark_free_dpi_list(struct kshark_dpi_list *plugins) { struct kshark_dpi_list *last; while (plugins) { last = plugins; plugins = plugins->next; free(last); } } /** * @brief Find a plugin by its library file. * * @param plugins: A list of plugins to search in. * @param lib: The plugin object file to load. * * @returns The plugin object on success, or NULL on failure. */ struct kshark_plugin_list * kshark_find_plugin(struct kshark_plugin_list *plugins, const char *lib) { for (; plugins; plugins = plugins->next) if (strcmp(plugins->file, lib) == 0) return plugins; return NULL; } /** * @brief Find a plugin by its name. * * @param plugins: A list of plugins to search in. * @param name: The plugin object file to load. * * @returns The plugin object on success, or NULL on failure. */ struct kshark_plugin_list * kshark_find_plugin_by_name(struct kshark_plugin_list *plugins, const char *name) { for (; plugins; plugins = plugins->next) if (strcmp(plugins->name, name) == 0) return plugins; return NULL; } /** * @brief Register plugin to a given data stream without initializing it. * In order to initialize this plugin use kshark_handle_dpi() or * kshark_handle_all_dpis(). * * @param stream: Input location for a Trace data stream pointer. * @param plugin: Input location for the data processing interface. * @param active: If false, the plugin will be registered but disabled. * Otherwise the plugin will be active. * * @returns The plugin object on success, or NULL on failure. */ struct kshark_dpi_list * kshark_register_plugin_to_stream(struct kshark_data_stream *stream, struct kshark_dpi *plugin, bool active) { struct kshark_dpi_list *plugin_list = stream->plugins; /* Check if the plugin is already registered to this stream. */ while (plugin_list) { if (strcmp(plugin_list->interface->name, plugin->name) == 0 && plugin_list->interface->init == plugin->init && plugin_list->interface->close == plugin->close) { /* * The plugin has been registered already. Check if it * is initialized and if this is the case, close the * existing initialization. This way we guarantee a * clean new initialization from kshark_handle_dpi() * or kshark_handle_all_dpis(). */ if (plugin_list->status & KSHARK_PLUGIN_LOADED) kshark_handle_dpi(stream, plugin_list, KSHARK_PLUGIN_CLOSE); plugin_list->status = active ? KSHARK_PLUGIN_ENABLED : 0; return plugin_list; } plugin_list = plugin_list->next; } plugin_list = calloc(1, sizeof(*plugin_list)); plugin_list->interface = plugin; if (active) plugin_list->status = KSHARK_PLUGIN_ENABLED; plugin_list->next = stream->plugins; stream->plugins = plugin_list; stream->n_plugins++; return plugin_list; } /** * @brief Unregister plugin to a given data stream. * * @param stream: Input location for a Trace data stream pointer. * @param plugin: Input location for the data processing interface. */ void kshark_unregister_plugin_from_stream(struct kshark_data_stream *stream, struct kshark_dpi *plugin) { struct kshark_dpi_list **last; for (last = &stream->plugins; *last; last = &(*last)->next) { if ((*last)->interface->init == plugin->init && (*last)->interface->close == plugin->close && strcmp((*last)->interface->name, plugin->name) == 0) { struct kshark_dpi_list *this_plugin; this_plugin = *last; *last = this_plugin->next; this_plugin->interface->close(stream); free(this_plugin); stream->n_plugins--; return; } } } static int plugin_init(struct kshark_data_stream *stream, struct kshark_dpi_list *plugin) { int handler_count = plugin->interface->init(stream); if (handler_count > 0) { plugin->status &= ~KSHARK_PLUGIN_FAILED; plugin->status |= KSHARK_PLUGIN_LOADED; } else { if (strcmp(stream->name, KS_UNNAMED) == 0) { fprintf(stderr, "plugin \"%s\" failed to initialize on stream %s\n", plugin->interface->name, stream->file); } else { fprintf(stderr, "plugin \"%s\" failed to initialize on stream %s:%s\n", plugin->interface->name, stream->file, stream->name); } plugin->status |= KSHARK_PLUGIN_FAILED; plugin->status &= ~KSHARK_PLUGIN_LOADED; } return handler_count; } static int plugin_close(struct kshark_data_stream *stream, struct kshark_dpi_list *plugin) { int handler_count = plugin->interface->close(stream); plugin->status &= ~KSHARK_PLUGIN_LOADED; return handler_count; } /** * @brief Use this function to initialize/update/deinitialize a plugin for * a given Data stream. * * @param stream: Input location for a Trace data stream pointer. * @param plugin: The plugin to be handled. * @param task_id: Action identifier specifying the action to be executed. * * @returns The number of successful added/removed plugin handlers on success, * or a negative error code on failure. */ int kshark_handle_dpi(struct kshark_data_stream *stream, struct kshark_dpi_list *plugin, enum kshark_plugin_actions task_id) { int handler_count = 0; switch (task_id) { case KSHARK_PLUGIN_INIT: if (plugin->status & KSHARK_PLUGIN_ENABLED) handler_count += plugin_init(stream, plugin); break; case KSHARK_PLUGIN_UPDATE: if (plugin->status & KSHARK_PLUGIN_LOADED) handler_count -= plugin_close(stream, plugin); plugin->status &= ~KSHARK_PLUGIN_FAILED; if (plugin->status & KSHARK_PLUGIN_ENABLED) handler_count += plugin_init(stream, plugin); break; case KSHARK_PLUGIN_CLOSE: if (plugin->status & KSHARK_PLUGIN_LOADED) handler_count -= plugin_close(stream, plugin); plugin->status &= ~KSHARK_PLUGIN_FAILED; break; default: return -EINVAL; } return handler_count; } /** * @brief Use this function to initialize/update/deinitialize all registered * data processing plugins for a given Data stream. * * @param stream: Input location for a Trace data stream pointer. * @param task_id: Action identifier specifying the action to be executed. Can * be KSHARK_PLUGIN_INIT, KSHARK_PLUGIN_UPDATE or * KSHARK_PLUGIN_CLOSE. * * @returns The number of successful added/removed plugin handlers on success, * or a negative error code on failure. */ int kshark_handle_all_dpis(struct kshark_data_stream *stream, enum kshark_plugin_actions task_id) { struct kshark_dpi_list *plugin; int handler_count = 0; for (plugin = stream->plugins; plugin; plugin = plugin->next) handler_count += kshark_handle_dpi(stream, plugin, task_id); return handler_count; } /** * @brief Free all readout interfaces in a given list. * * @param inputs: Input location for the inputs list. */ void kshark_free_dri_list(struct kshark_dri_list *inputs) { struct kshark_dri_list *last; while (inputs) { last = inputs; inputs = inputs->next; free(last); } } kernel-shark-kernelshark-v2.4.0/src/libkshark-plugin.h000066400000000000000000000266301477354127100230300ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2016 Red Hat Inc, Steven Rostedt */ /** * @file libkshark-plugin.h * @brief KernelShark plugins. */ #ifndef _KSHARK_PLUGIN_H #define _KSHARK_PLUGIN_H #ifdef __cplusplus extern "C" { #endif // __cplusplus // C #include #include #include /* Quiet warnings over documenting simple structures */ //! @cond Doxygen_Suppress #define __hidden __attribute__((visibility ("hidden"))) #define _MAKE_STR(x) #x #define MAKE_STR(x) _MAKE_STR(x) #define KSHARK_PLOT_PLUGIN_INITIALIZER kshark_data_plugin_initializer #define KSHARK_PLOT_PLUGIN_DEINITIALIZER kshark_data_plugin_deinitializer #define KSHARK_PLOT_PLUGIN_INITIALIZER_NAME MAKE_STR(KSHARK_PLOT_PLUGIN_INITIALIZER) #define KSHARK_PLOT_PLUGIN_DEINITIALIZER_NAME MAKE_STR(KSHARK_PLOT_PLUGIN_DEINITIALIZER) #define KSHARK_MENU_PLUGIN_INITIALIZER kshark_plugin_menu_initializer #define KSHARK_MENU_PLUGIN_INITIALIZER_NAME MAKE_STR(KSHARK_MENU_PLUGIN_INITIALIZER) #define KSHARK_INPUT_INITIALIZER kshark_input_initializer #define KSHARK_INPUT_DEINITIALIZER kshark_input_deinitializer #define KSHARK_INPUT_CHECK kshark_input_check #define KSHARK_INPUT_FORMAT kshark_input_format #define KSHARK_INPUT_INITIALIZER_NAME MAKE_STR(KSHARK_INPUT_INITIALIZER) #define KSHARK_INPUT_DEINITIALIZER_NAME MAKE_STR(KSHARK_INPUT_DEINITIALIZER) #define KSHARK_INPUT_CHECK_NAME MAKE_STR(KSHARK_INPUT_CHECK) #define KSHARK_INPUT_FORMAT_NAME MAKE_STR(KSHARK_INPUT_FORMAT) struct kshark_data_stream; struct kshark_context; struct kshark_entry; //! @endcond struct kshark_trace_histo; /** * Structure representing the C arguments of the drawing function of * a plugin. */ struct kshark_cpp_argv { /** Pointer to the model descriptor object. */ struct kshark_trace_histo *histo; }; /** A function type to be used when defining plugin functions for drawing. */ typedef void (*kshark_plugin_draw_handler_func)(struct kshark_cpp_argv *argv, int sd, int val, int draw_action); /** * A function type to be used when defining plugin functions for data * manipulation. */ typedef void (*kshark_plugin_event_handler_func)(struct kshark_data_stream *stream, void *rec, struct kshark_entry *e); /** Plugin action identifier. */ enum kshark_plugin_actions { /** * Load plugins action. This action identifier is used when handling * plugins. */ KSHARK_PLUGIN_INIT, /** * Reload plugins action. This action identifier is used when handling * plugins. */ KSHARK_PLUGIN_UPDATE, /** * Unload plugins action. This action identifier is used when handling * plugins. */ KSHARK_PLUGIN_CLOSE, }; /** Plotting action identifier. */ enum kshark_plotting_actions { /** * Task draw action. This action identifier is used by the plugin draw * function. */ KSHARK_TASK_DRAW = 1 << 0, /** * CPU draw action. This action identifier is used by the plugin draw * function. */ KSHARK_CPU_DRAW = 1 << 1, /** * Draw action for the Host graph in Virtual Combos. This action * identifier is used by the plugin draw function. */ KSHARK_HOST_DRAW = 1 << 2, /** * Draw action for the Guest graph in Virtual Combos. This action * identifier is used by the plugin draw function. */ KSHARK_GUEST_DRAW = 1 << 3, }; /** Plugin's Trace event processing handler structure. */ struct kshark_event_proc_handler { /** Pointer to the next Plugin Event handler. */ struct kshark_event_proc_handler *next; /** * Event action function. This action can be used to modify the content * of all kshark_entries having Event Ids equal to "id". */ kshark_plugin_event_handler_func event_func; /** Unique Id ot the trace event type. */ int id; }; struct kshark_event_proc_handler * kshark_find_event_handler(struct kshark_event_proc_handler *handlers, int event_id); int kshark_register_event_handler(struct kshark_data_stream *stream, int event_id, kshark_plugin_event_handler_func evt_func); int kshark_unregister_event_handler(struct kshark_data_stream *stream, int event_id, kshark_plugin_event_handler_func evt_func); void kshark_free_event_handler_list(struct kshark_event_proc_handler *handlers); /** Plugin's drawing handler structure. */ struct kshark_draw_handler { /** Pointer to the next Plugin Event handler. */ struct kshark_draw_handler *next; /** * Draw action function. This action can be used to draw additional * graphical elements (shapes) for all kshark_entries having Event Ids * equal to "id". */ kshark_plugin_draw_handler_func draw_func; }; int kshark_register_draw_handler(struct kshark_data_stream *stream, kshark_plugin_draw_handler_func draw_func); void kshark_unregister_draw_handler(struct kshark_data_stream *stream, kshark_plugin_draw_handler_func draw_func); void kshark_free_draw_handler_list(struct kshark_draw_handler *handlers); /** * A function type to be used when defining load/reload/unload plugin * functions. */ typedef int (*kshark_plugin_load_func)(struct kshark_data_stream *); /** * A function type to be used when defining data check function for the plugin. */ typedef bool (*kshark_check_data_func)(const char *file_name); /** * A function type to be used when defining data format function for the plugin. */ typedef const char *(*kshark_format_func) (); /** * A function type to be used when defining plugin's configuration/control * function. */ typedef void *(*kshark_plugin_ctrl_func)(void *); /** The limit in size of the data format identifier string. */ #define KS_DATA_FORMAT_SIZE 15 /** Plugable Data Readout Interface (dri). */ struct kshark_dri { /** A short name for this data input. */ char *name; /** Data format identifier. */ char data_format[KS_DATA_FORMAT_SIZE]; /** Callback function for initialization of the data input. */ kshark_plugin_load_func init; /** Callback function for deinitialization of the data input. */ kshark_plugin_load_func close; /** * Callback function for checking if the data input is applicable for * a given data file. */ kshark_check_data_func check_data; }; /** Linked list of Data Readout Interfaces (dri). */ struct kshark_dri_list { /** Pointer to the next input interface. */ struct kshark_dri_list *next; /** Pointer to the interface of methods used by the input. */ struct kshark_dri *interface; }; /** Plugable Data Processing Interface (dpi). */ struct kshark_dpi { /** The plugin's short name. */ char *name; /** Callback function for initialization of the plugin. */ kshark_plugin_load_func init; /** Callback function for deinitialization of the plugin. */ kshark_plugin_load_func close; }; /** Linked list of data processing interfaces (dpi). */ struct kshark_dpi_list { /** Pointer to the next plugin interface. */ struct kshark_dpi_list *next; /** Pointer to the interface of methods used by the plugin. */ struct kshark_dpi *interface; /** * The status of the interface. */ int status; }; struct kshark_dri_list * kshark_register_input(struct kshark_context *kshark_ctx, struct kshark_dri *plugin); void kshark_unregister_input(struct kshark_context *kshark_ctx, const char *file); void kshark_free_dri_list(struct kshark_dri_list *inputs); /** Linked list of plugins. */ struct kshark_plugin_list { /** Pointer to the next plugin. */ struct kshark_plugin_list *next; /** The plugin's short name. */ char *name; /** The plugin object file to load. */ char *file; /** Plugin's object file handler. */ void *handle; /** * Control interface of the plugin. Can be used to configure * the plugin. */ kshark_plugin_ctrl_func ctrl_interface; /** The interface of methods used by a data processing plugin. */ struct kshark_dpi *process_interface; /** The interface of methods used by a data readout plugin. */ struct kshark_dri *readout_interface; }; /** Plugin status identifiers. */ enum kshark_plugin_status { /** The plugin is enabled. */ KSHARK_PLUGIN_ENABLED = 1 << 0, /** The plugin is successfully loaded. */ KSHARK_PLUGIN_LOADED = 1 << 1, /** The plugin failed to initialization. */ KSHARK_PLUGIN_FAILED = 1 << 2, }; struct kshark_plugin_list * kshark_register_plugin(struct kshark_context *kshark_ctx, const char *name, const char *file); void kshark_unregister_plugin(struct kshark_context *kshark_ctx, const char *name, const char *file); void kshark_free_plugin_list(struct kshark_plugin_list *plugins); void kshark_free_dpi_list(struct kshark_dpi_list *plugins); struct kshark_plugin_list * kshark_find_plugin(struct kshark_plugin_list *plugins, const char *file); struct kshark_plugin_list * kshark_find_plugin_by_name(struct kshark_plugin_list *plugins, const char *name); struct kshark_dpi_list * kshark_register_plugin_to_stream(struct kshark_data_stream *stream, struct kshark_dpi *plugin, bool active); void kshark_unregister_plugin_from_stream(struct kshark_data_stream *stream, struct kshark_dpi *plugin); int kshark_handle_dpi(struct kshark_data_stream *stream, struct kshark_dpi_list *plugin, enum kshark_plugin_actions task_id); int kshark_handle_all_dpis(struct kshark_data_stream *stream, enum kshark_plugin_actions task_id); /** General purpose macro for resizing dynamic arrays. */ #define KS_DOUBLE_SIZE(array, size) \ ({ \ ssize_t __n = size; \ bool __ok = false; \ __typeof__(array) __tmp = \ (__typeof__(array)) realloc(array, \ 2 * __n * sizeof(*__tmp)); \ if (__tmp) { \ memset(__tmp + __n, 0, __n * sizeof(*__tmp)); \ size = 2 * __n; \ array = __tmp; \ __ok = true; \ } \ __ok; \ }) \ /** Identifier used to free the plugin context. */ #define KS_PLUGIN_CONTEXT_FREE -1 /** * General purpose macro defining methods for adding plugin context. * Do not use this macro in header files. */ #define KS_DEFINE_PLUGIN_CONTEXT(type, type_free) \ static type **__context_handler; \ static ssize_t __n_streams = -1; \ __hidden type *__init(int sd) \ { \ type *obj; \ if (__n_streams < 0 && sd < KS_DEFAULT_NUM_STREAMS) { \ __context_handler = \ (type **) calloc(KS_DEFAULT_NUM_STREAMS, \ sizeof(*__context_handler)); \ if (!__context_handler) \ return NULL; \ __n_streams = KS_DEFAULT_NUM_STREAMS; \ } else if (sd >= __n_streams) { \ if (!KS_DOUBLE_SIZE(__context_handler, \ __n_streams)) \ return NULL; \ } \ assert(__context_handler[sd] == NULL); \ obj = (type *) calloc(1, sizeof(*obj)); \ __context_handler[sd] = obj; \ return obj; \ } \ __hidden type *__get_context(int sd) \ { \ if (sd < 0 || sd >= __n_streams) \ return NULL; \ return __context_handler[sd]; \ } \ __hidden void __close(int sd) \ { \ type *obj; \ if (sd == KS_PLUGIN_CONTEXT_FREE) { \ free(__context_handler); \ __n_streams = -1; \ return; \ } \ obj = __get_context(sd); \ if (obj) { \ type_free(__context_handler[sd]); \ __context_handler[sd] = NULL; \ } \ } \ /** * General purpose macro declaring the methods for adding plugin context. * To be used in header files. */ #define KS_DECLARE_PLUGIN_CONTEXT_METHODS(type) \ type *__init(int sd); \ void __close(int sd); \ type *__get_context(int sd); \ #ifdef __cplusplus } #endif // __cplusplus #endif // _KSHARK_PLUGIN_H kernel-shark-kernelshark-v2.4.0/src/libkshark-tepdata.c000066400000000000000000001347701477354127100231540ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2019 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark-tepdata.c * @brief Interface for processing of FTRACE (trace-cmd) data. */ // C #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif // _GNU_SOURCE #include #include #include // trace-cmd #include // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" #include "libkshark-tepdata.h" static __thread struct trace_seq seq; static bool init_thread_seq(void) { if (!seq.buffer) trace_seq_init(&seq); return seq.buffer != NULL; } /** Structure for handling all unique attributes of the FTRACE data. */ struct tepdata_handle { /** Page event used to parse the page. */ struct tep_handle *tep; /* MUST BE FIRST ENTRY */ /** Input handle for the trace data file. */ struct tracecmd_input *input; /** * Filter allowing sophisticated filtering based on the content of * the event. */ struct tep_event_filter *advanced_event_filter; /** The unique Id of the sched_switch_event event. */ int sched_switch_event_id; /** Pointer to the sched_switch_next_field format descriptor. */ struct tep_format_field *sched_switch_next_field; /** Pointer to the sched_switch_comm_field format descriptor. */ struct tep_format_field *sched_switch_comm_field; }; static inline int get_tepdate_handle(struct kshark_data_stream *stream, struct tepdata_handle **handle) { struct kshark_generic_stream_interface *interface; interface = stream->interface; if (!interface) return -EFAULT; *handle = interface->handle; return 0; } /** Get the Page event object used to parse the page. */ struct tep_handle *kshark_get_tep(struct kshark_data_stream *stream) { struct tepdata_handle *tep_handle; int ret; ret = get_tepdate_handle(stream, &tep_handle); if (ret < 0) return NULL; return tep_handle->tep; } /** Get the input handle for the trace data file */ struct tracecmd_input *kshark_get_tep_input(struct kshark_data_stream *stream) { struct tepdata_handle *tep_handle; int ret; ret = get_tepdate_handle(stream, &tep_handle); if (ret < 0) return NULL; return tep_handle->input; } static inline struct tep_event_filter * get_adv_filter(struct kshark_data_stream *stream) { struct tepdata_handle *tep_handle; int ret; ret = get_tepdate_handle(stream, &tep_handle); if (ret < 0) return NULL; return tep_handle->advanced_event_filter; } static int get_sched_switch_id(struct kshark_data_stream *stream) { struct tepdata_handle *tep_handle; int ret; ret = get_tepdate_handle(stream, &tep_handle); if (ret < 0) return ret; return tep_handle->sched_switch_event_id; } static struct tep_format_field *get_sched_next(struct kshark_data_stream *stream) { struct tepdata_handle *tep_handle; int ret; ret = get_tepdate_handle(stream, &tep_handle); if (ret < 0) return NULL; return tep_handle->sched_switch_next_field; } static struct tep_format_field *get_sched_comm(struct kshark_data_stream *stream) { struct tepdata_handle *tep_handle; int ret; ret = get_tepdate_handle(stream, &tep_handle); if (ret < 0) return NULL; return tep_handle->sched_switch_comm_field; } static void set_entry_values(struct kshark_data_stream *stream, struct tep_record *record, struct kshark_entry *entry) { struct tep_handle *tep = kshark_get_tep(stream); if (!tep) return; /* Offset of the record */ entry->offset = record->offset; /* CPU Id of the record */ entry->cpu = record->cpu; /* Time stamp of the record */ entry->ts = record->ts; /* Event Id of the record */ entry->event_id = tep_data_type(tep, record); /* * Is visible mask. This default value means that the entry * is visible everywhere. */ entry->visible = 0xFF; /* Process Id of the record */ entry->pid = tep_data_pid(tep, record); } /** Prior time offset of the "missed_events" entry. */ #define ME_ENTRY_TIME_SHIFT 10 static void missed_events_action(struct kshark_data_stream *stream, struct tep_record *record, struct kshark_entry *entry) { /* * Use the offset field of the entry to store the number of missed * events. */ entry->offset = record->missed_events; entry->cpu = record->cpu; /* * Position the "missed_events" entry a bit before (in time) * the original record. */ entry->ts = record->ts - ME_ENTRY_TIME_SHIFT; /* All custom entries must have negative event Identifiers. */ entry->event_id = KS_EVENT_OVERFLOW; entry->visible = 0xFF; entry->pid = tep_data_pid(kshark_get_tep(stream), record); } /** * rec_list is used to pass the data to the load functions. * The rec_list will contain the list of entries from the source, * and will be a link list of per CPU entries. */ struct rec_list { union { /* Used by kshark_load_data_records */ struct { /** next pointer, matches entry->next */ struct rec_list *next; /** pointer to the raw record data */ struct tep_record *rec; }; /** entry - Used for kshark_load_data_entries() */ struct kshark_entry entry; }; }; static int get_next_pid(struct kshark_data_stream *stream, struct tep_record *record) { unsigned long long val; int ret; ret = tep_read_number_field(get_sched_next(stream), record->data, &val); return ret ? : (int) val; } static void register_command(struct kshark_data_stream *stream, struct tep_record *record, int pid) { struct tep_format_field *comm_field = get_sched_comm(stream); const char *comm = record->data + comm_field->offset; /* * TODO: The retrieve of the name of the command above needs to be * implemented as a wrapper function in libtracevent. */ if (!tep_is_pid_registered(kshark_get_tep(stream), pid)) tep_register_comm(kshark_get_tep(stream), comm, pid); } /** * rec_type defines what type of rec_list is being used. */ enum rec_type { REC_RECORD, REC_ENTRY, }; static void free_rec_list(struct rec_list **rec_list, int n_cpus, enum rec_type type) { struct rec_list *temp_rec; int cpu; for (cpu = 0; cpu < n_cpus; ++cpu) { while (rec_list[cpu]) { temp_rec = rec_list[cpu]; rec_list[cpu] = temp_rec->next; if (type == REC_RECORD) tracecmd_free_record(temp_rec->rec); free(temp_rec); } } free(rec_list); } static ssize_t get_records(struct kshark_context *kshark_ctx, struct kshark_data_stream *stream, struct rec_list ***rec_list, enum rec_type type) { struct tep_event_filter *adv_filter = NULL; struct tracecmd_input *input; struct rec_list **temp_next; struct rec_list **cpu_list; struct rec_list *temp_rec; struct tep_record *rec; ssize_t count, total = 0; int pid, next_pid, cpu; input = kshark_get_tep_input(stream); if (!input) return -EFAULT; cpu_list = calloc(stream->n_cpus, sizeof(*cpu_list)); if (!cpu_list) return -ENOMEM; if (type == REC_ENTRY) adv_filter = get_adv_filter(stream); for (cpu = 0; cpu < stream->n_cpus; ++cpu) { count = 0; cpu_list[cpu] = NULL; temp_next = &cpu_list[cpu]; rec = tracecmd_read_cpu_first(kshark_get_tep_input(stream), cpu); while (rec) { *temp_next = temp_rec = calloc(1, sizeof(*temp_rec)); if (!temp_rec) goto fail; temp_rec->next = NULL; switch (type) { case REC_RECORD: temp_rec->rec = rec; pid = tep_data_pid(kshark_get_tep(stream), rec); break; case REC_ENTRY: { struct kshark_entry *entry; if (rec->missed_events) { /* * Insert a custom "missed_events" entry just * befor this record. */ entry = &temp_rec->entry; missed_events_action(stream, rec, entry); /* Apply time calibration. */ kshark_postprocess_entry(stream, rec, entry); entry->stream_id = stream->stream_id; temp_next = &temp_rec->next; ++count; /* Now allocate a new rec_list node and comtinue. */ *temp_next = temp_rec = calloc(1, sizeof(*temp_rec)); if (!temp_rec) goto fail; } entry = &temp_rec->entry; set_entry_values(stream, rec, entry); if (entry->event_id == get_sched_switch_id(stream)) { next_pid = get_next_pid(stream, rec); if (next_pid >= 0) register_command(stream, rec, next_pid); } entry->stream_id = stream->stream_id; /* * Post-process the content of the entry. This includes * time calibration and event-specific plugin actions. */ kshark_postprocess_entry(stream, rec, entry); pid = entry->pid; /* Apply Id filtering. */ kshark_apply_filters(kshark_ctx, stream, entry); /* Apply advanced event filtering. */ if (adv_filter && adv_filter->filters && tep_filter_match(adv_filter, rec) != FILTER_MATCH) unset_event_filter_flag(kshark_ctx, entry); tracecmd_free_record(rec); break; } /* REC_ENTRY */ } kshark_hash_id_add(stream->tasks, pid); temp_next = &temp_rec->next; ++count; rec = tracecmd_read_data(kshark_get_tep_input(stream), cpu); } if (!count) kshark_hash_id_add(stream->idle_cpus, cpu); else total += count; } *rec_list = cpu_list; return total; fail: free_rec_list(cpu_list, stream->n_cpus, type); return -ENOMEM; } static int pick_next_cpu(struct rec_list **rec_list, int n_cpus, enum rec_type type) { uint64_t ts = 0; uint64_t rec_ts; int next_cpu = -1; int cpu; for (cpu = 0; cpu < n_cpus; ++cpu) { if (!rec_list[cpu]) continue; switch (type) { case REC_RECORD: rec_ts = rec_list[cpu]->rec->ts; break; case REC_ENTRY: rec_ts = rec_list[cpu]->entry.ts; break; default: return -1; } if (!ts || rec_ts < ts) { ts = rec_ts; next_cpu = cpu; } } return next_cpu; } /** * @brief Load the content of the trace data file asociated with a given * Data stream into an array of kshark_entries. This function * provides an abstraction of the entries from the raw data * that is read, however the "latency" and the "info" fields can be * accessed only via the offset into the file. This makes the access * to these two fields much slower. * If one or more filters are set, the "visible" fields of each entry * is updated according to the criteria provided by the filters. The * field "filter_mask" of the session's context is used to control the * level of visibility/invisibility of the filtered entries. * * @param stream: Input location for the FTRACE data stream pointer. * @param kshark_ctx: Input location for context pointer. * @param data_rows: Output location for the trace data. The user is * responsible for freeing the elements of the outputted * array. * * @returns The size of the outputted data in the case of success, or a * negative error code on failure. */ ssize_t tepdata_load_entries(struct kshark_data_stream *stream, struct kshark_context *kshark_ctx, struct kshark_entry ***data_rows) { enum rec_type type = REC_ENTRY; struct kshark_entry **rows; struct rec_list **rec_list; ssize_t count, total = 0; total = get_records(kshark_ctx, stream, &rec_list, type); if (total < 0) goto fail; rows = calloc(total, sizeof(struct kshark_entry *)); if (!rows) goto fail_free; for (count = 0; count < total; count++) { int next_cpu; next_cpu = pick_next_cpu(rec_list, stream->n_cpus, type); if (next_cpu >= 0) { rows[count] = &rec_list[next_cpu]->entry; rec_list[next_cpu] = rec_list[next_cpu]->next; } } /* There should be no entries left in rec_list. */ free_rec_list(rec_list, stream->n_cpus, type); *data_rows = rows; return total; fail_free: free_rec_list(rec_list, stream->n_cpus, type); fail: fprintf(stderr, "Failed to allocate memory during data loading.\n"); return -ENOMEM; } static ssize_t tepdata_load_matrix(struct kshark_data_stream *stream, struct kshark_context *kshark_ctx, int16_t **event_array, int16_t **cpu_array, int32_t **pid_array, int64_t **offset_array, int64_t **ts_array) { enum rec_type type = REC_ENTRY; struct rec_list **rec_list; ssize_t count, total = 0; bool status; total = get_records(kshark_ctx, stream, &rec_list, type); if (total < 0) goto fail; status = kshark_data_matrix_alloc(total, event_array, cpu_array, pid_array, offset_array, ts_array); if (!status) goto fail_free; for (count = 0; count < total; count++) { int next_cpu; next_cpu = pick_next_cpu(rec_list, stream->n_cpus, type); if (next_cpu >= 0) { struct rec_list *rec = rec_list[next_cpu]; struct kshark_entry *e = &rec->entry; if (offset_array) (*offset_array)[count] = e->offset; if (cpu_array) (*cpu_array)[count] = e->cpu; if (ts_array) { kshark_calib_entry(stream, e); (*ts_array)[count] = e->ts; } if (pid_array) (*pid_array)[count] = e->pid; if (event_array) (*event_array)[count] = e->event_id; rec_list[next_cpu] = rec_list[next_cpu]->next; free(rec); } } /* There should be no entries left in rec_list. */ free_rec_list(rec_list, stream->n_cpus, type); return total; fail_free: free_rec_list(rec_list, stream->n_cpus, type); fail: fprintf(stderr, "Failed to allocate memory during data loading.\n"); return -ENOMEM; } /** * @brief Load the content of the trace data file into an array of * tep_records. Use this function only if you need fast access * to all fields of the record. * * @param kshark_ctx: Input location for the session context pointer. * @param sd: Data stream identifier. * @param data_rows: Output location for the trace data. Use tracecmd_free_record() * to free the elements of the outputted array. * * @returns The size of the outputted data in the case of success, or a * negative error code on failure. */ ssize_t kshark_load_tep_records(struct kshark_context *kshark_ctx, int sd, struct tep_record ***data_rows) { struct kshark_data_stream *stream; enum rec_type type = REC_RECORD; struct rec_list **rec_list; struct rec_list *temp_rec; struct tep_record **rows; struct tep_record *rec; ssize_t count, total = 0; if (*data_rows) free(*data_rows); stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return -EBADF; total = get_records(kshark_ctx, stream, &rec_list, type); if (total < 0) goto fail; rows = calloc(total, sizeof(struct tep_record *)); if (!rows) goto fail_free; for (count = 0; count < total; count++) { int next_cpu; next_cpu = pick_next_cpu(rec_list, stream->n_cpus, type); if (next_cpu >= 0) { rec = rec_list[next_cpu]->rec; rows[count] = rec; temp_rec = rec_list[next_cpu]; rec_list[next_cpu] = rec_list[next_cpu]->next; free(temp_rec); /* The record is still referenced in rows */ } } /* There should be no records left in rec_list. */ free_rec_list(rec_list, stream->n_cpus, type); *data_rows = rows; return total; fail_free: free_rec_list(rec_list, stream->n_cpus, type); fail: fprintf(stderr, "Failed to allocate memory during data loading.\n"); return -ENOMEM; } static int tepdata_get_event_id(struct kshark_data_stream *stream, const struct kshark_entry *entry) { int event_id = KS_EMPTY_BIN; struct tep_record *record; if (entry->visible & KS_PLUGIN_UNTOUCHED_MASK) { event_id = entry->event_id; } else { /* * The entry has been touched by a plugin callback function. * Because of this we do not trust the value of * "entry->event_id". * * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&stream->input_mutex); record = tracecmd_read_at(kshark_get_tep_input(stream), entry->offset, NULL); if (record) event_id = tep_data_type(kshark_get_tep(stream), record); tracecmd_free_record(record); pthread_mutex_unlock(&stream->input_mutex); } return (event_id == -1)? -EFAULT : event_id; } static char* missed_events_dump(__attribute__ ((unused)) struct kshark_data_stream *stream, const struct kshark_entry *entry, bool get_info) { char *buffer; int size = 0; if (get_info) size = asprintf(&buffer, "missed_events=%i", (int) entry->offset); else size = asprintf(&buffer, "missed_events"); if (size > 0) return buffer; return NULL; } static char *tepdata_get_event_name(struct kshark_data_stream *stream, const struct kshark_entry *entry) { struct kshark_generic_stream_interface *interface; struct tep_event *event; char *buffer; interface = stream->interface; if (!interface) return NULL; int event_id = interface->get_event_id(stream, entry); if (event_id == -EFAULT) return NULL; if (event_id < 0) { switch (event_id) { case KS_EVENT_OVERFLOW: return missed_events_dump(stream, entry, false); default: return NULL; } } /* * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&stream->input_mutex); event = tep_find_event(kshark_get_tep(stream), event_id); pthread_mutex_unlock(&stream->input_mutex); if (!event || asprintf(&buffer, "%s/%s", event->system, event->name) <= 0) return NULL; return buffer; } static int tepdata_get_pid(struct kshark_data_stream *stream, const struct kshark_entry *entry) { struct tep_record *record; int pid = KS_EMPTY_BIN; if (entry->visible & KS_PLUGIN_UNTOUCHED_MASK) { pid = entry->pid; } else { /* * The entry has been touched by a plugin callback function. * Because of this we do not trust the value of "entry->pid". * * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&stream->input_mutex); record = tracecmd_read_at(kshark_get_tep_input(stream), entry->offset, NULL); if (record) pid = tep_data_pid(kshark_get_tep(stream), record); tracecmd_free_record(record); pthread_mutex_unlock(&stream->input_mutex); } return pid; } static char *tepdata_get_task(struct kshark_data_stream *stream, const struct kshark_entry *entry) { struct kshark_generic_stream_interface *interface = stream->interface; const char *task; int pid; if (!interface) return NULL; pid = interface->get_pid(stream, entry); task = tep_data_comm_from_pid(kshark_get_tep(stream), pid); return task ? strdup(task) : NULL; } static char *tepdata_get_latency(struct kshark_data_stream *stream, const struct kshark_entry *entry) { struct tep_record *record; char *buffer; /* Check if this is a "Missed event" (event_id < 0). */ if (!init_thread_seq() || entry->event_id < 0) return NULL; /* * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&stream->input_mutex); record = tracecmd_read_at(kshark_get_tep_input(stream), entry->offset, NULL); if (!record) { pthread_mutex_unlock(&stream->input_mutex); return NULL; } trace_seq_reset(&seq); tep_print_event(kshark_get_tep(stream), &seq, record, "%s", TEP_PRINT_LATENCY); tracecmd_free_record(record); pthread_mutex_unlock(&stream->input_mutex); if (asprintf(&buffer, "%s", seq.buffer) <= 0) return NULL; return buffer; } static char *get_info_str(struct kshark_data_stream *stream, struct tep_record *record, struct tep_event *event) { char *buffer; if (!init_thread_seq() || !record || !event) return NULL; trace_seq_reset(&seq); tep_print_event(kshark_get_tep(stream), &seq, record, "%s", TEP_PRINT_INFO); if (!seq.len) return NULL; /* * The event info string contains a trailing newline. * Remove this newline. */ if (seq.buffer[seq.len - 1] == '\n') seq.buffer[seq.len - 1] = '\0'; if (asprintf(&buffer, "%s", seq.buffer) <= 0) return NULL; return buffer; } static char *tepdata_get_info(struct kshark_data_stream *stream, const struct kshark_entry *entry) { struct tep_record *record; struct tep_event *event; char *info = NULL; int event_id; if (entry->event_id < 0) { switch (entry->event_id) { case KS_EVENT_OVERFLOW: return missed_events_dump(stream, entry, true); default: return NULL; } } /* * Currently the data reading operations are not thread-safe. * Use a mutex to protect the access. */ pthread_mutex_lock(&stream->input_mutex); record = tracecmd_read_at(kshark_get_tep_input(stream), entry->offset, NULL); if (!record) { pthread_mutex_unlock(&stream->input_mutex); return NULL; } event_id = tep_data_type(kshark_get_tep(stream), record); event = tep_find_event(kshark_get_tep(stream), event_id); if (event) info = get_info_str(stream, record, event); tracecmd_free_record(record); pthread_mutex_unlock(&stream->input_mutex); return info; } static int *tepdata_get_event_ids(struct kshark_data_stream *stream) { struct tep_event **events; int i, *evt_ids; events = tep_list_events(kshark_get_tep(stream), TEP_EVENT_SORT_SYSTEM); if (!events) return NULL; evt_ids = calloc(stream->n_events, sizeof(*evt_ids)); if (!evt_ids) return NULL; for (i = 0; i < stream->n_events ; ++i) evt_ids[i] = events[i]->id; return evt_ids; } static int tepdata_get_field_names(struct kshark_data_stream *stream, const struct kshark_entry *entry, char ***fields_str) { struct tep_format_field *field, **fields; struct tep_event *event; int i= 0, nr_fields; char **buffer; *fields_str = NULL; event = tep_find_event(kshark_get_tep(stream), entry->event_id); if (!event) return 0; nr_fields = event->format.nr_fields + event->format.nr_common; buffer = calloc(nr_fields, sizeof(**fields_str)); if (!buffer) return -ENOMEM; /* Add all common fields. */ fields = tep_event_common_fields(event); if (!fields) goto fail; for (field = *fields; field; field = field->next) if (asprintf(&buffer[i++], "%s", field->name) <= 0) goto fail; free(fields); /* Add all unique fields. */ fields = tep_event_fields(event); if (!fields) goto fail; for (field = *fields; field; field = field->next) if (asprintf(&buffer[i++], "%s", field->name) <= 0) goto fail; free(fields); *fields_str = buffer; return nr_fields; fail: for (i = 0; i < nr_fields; ++i) free(buffer[i]); free(buffer); return -EFAULT; } /** * Custom entry info function type. To be user for dumping info for custom * KernelShark entryes. */ typedef char *(tepdata_custom_info_func)(struct kshark_data_stream *, const struct kshark_entry *, bool); static char* tepdata_dump_custom_entry(struct kshark_data_stream *stream, const struct kshark_entry *entry, tepdata_custom_info_func info_func) { char *entry_str; int size = 0; size = asprintf(&entry_str, "%" PRIu64 "; %s-%i; CPU %i; ; %s; %s; 0x%x", entry->ts, tep_data_comm_from_pid(kshark_get_tep(stream), entry->pid), entry->pid, entry->cpu, info_func(stream, entry, false), info_func(stream, entry, true), entry->visible); if (size > 0) return entry_str; return NULL; } /** * @brief Dump into a string the content of one entry. The function allocates * a null terminated string and returns a pointer to this string. * * @param stream: Input location for the FTRACE data stream pointer. * @param entry: A Kernel Shark entry to be printed. * * @returns The returned string contains a semicolon-separated list of data * fields. The user has to free the returned string. */ static char *tepdata_dump_entry(struct kshark_data_stream *stream, const struct kshark_entry *entry) { char *entry_str, *task, *latency, *event, *info; struct kshark_generic_stream_interface *interface; struct kshark_context *kshark_ctx = NULL; int n = 0; if (!kshark_instance(&kshark_ctx) || !init_thread_seq()) return NULL; interface = stream->interface; if (!interface) return NULL; if (entry->event_id >= 0) { if (kshark_get_tep(stream)) { task = interface->get_task(stream, entry); latency = interface->aux_info(stream, entry); event = interface->get_event_name(stream, entry); info = interface->get_info(stream, entry); n = asprintf(&entry_str, "%i; %" PRIu64 "; %s-%i; CPU %i; %s; %s; %s; 0x%x", entry->stream_id, entry->ts, task, interface->get_pid(stream, entry), entry->cpu, latency, event, info, entry->visible); free(task); free(latency); free(event); free(info); } else { n = asprintf(&entry_str, "%i; %" PRIu64 "; [UNKNOWN TASK]-%i; CPU %i; ; [UNKNOWN EVENT]; [NO INFO]; 0x%x", entry->stream_id, entry->ts, interface->get_pid(stream, entry), entry->cpu, entry->visible); } if (n < 1) return NULL; } else { switch (entry->event_id) { case KS_EVENT_OVERFLOW: entry_str = tepdata_dump_custom_entry(stream, entry, missed_events_dump); break; default: return NULL; } } return entry_str; } static int tepdata_find_event_id(struct kshark_data_stream *stream, const char *event_name) { struct tep_event *event; char *buffer, *system, *name; if (asprintf(&buffer, "%s", event_name) < 1) return -1; system = strtok(buffer, "/"); name = strtok(NULL, ""); if (!system || !name) return -1; event = tep_find_event_by_name(kshark_get_tep(stream), system, name); free(buffer); if (!event) return -1; return event->id; } static struct tep_format_field * get_evt_field(struct kshark_data_stream *stream, int event_id, const char *field_name) { struct tep_event *event = tep_find_event(kshark_get_tep(stream), event_id); if (!event) return NULL; return tep_find_any_field(event, field_name); } /** * @brief Get the type of a trace record field. For the moment only integer * fields are supported. * * @param stream: Input location for the FTRACE data stream pointer. * @param entry: Input location for the Kernel Shark entry asociated with thes * record. * @param field: The name of the field. * * @returns KS_INTEGER_FIELD in case the field has an integer type. Otherwise * KS_INVALID_FIELD. */ kshark_event_field_format tepdata_get_field_type(struct kshark_data_stream *stream, const struct kshark_entry *entry, const char *field) { struct tep_format_field *evt_field; int mask = ~(TEP_FIELD_IS_SIGNED | TEP_FIELD_IS_LONG | TEP_FIELD_IS_FLAG); evt_field = get_evt_field(stream, entry->event_id, field); if (!evt_field) return KS_INVALID_FIELD; if (mask & evt_field->flags) return KS_INVALID_FIELD; return KS_INTEGER_FIELD; } /** * @brief Get the value of a trace record field. * * @param stream: Input location for the FTRACE data stream pointer. * @param rec: Input location for the trace record. * @param field: The name of the field. * @param val: Output location for the field value. * * @returns Returns 0 on success, otherwise a negative error code.. */ int tepdata_read_record_field(struct kshark_data_stream *stream, void *rec, const char *field, int64_t *val) { struct tep_format_field *evt_field; struct tep_record *record = rec; int event_id, ret; if (!record) return -EFAULT; event_id = tep_data_type(kshark_get_tep(stream), record); evt_field = get_evt_field(stream, event_id, field); if (!evt_field) return -EINVAL; ret = tep_read_number_field(evt_field, record->data, (unsigned long long *) val); return ret; } /** * @brief Get the value of a trace record field. * * @param stream: Input location for the FTRACE data stream pointer. * @param entry: Input location for the Kernel Shark entry asociated with thes * record. * @param field: The name of the field. * @param val: Output location for the field value. * * @returns Returns 0 on success, otherwise a negative error code. */ int tepdata_read_event_field(struct kshark_data_stream *stream, const struct kshark_entry *entry, const char *field, int64_t *val) { struct tep_format_field *evt_field; struct tep_record *record; int ret; evt_field = get_evt_field(stream, entry->event_id, field); if (!evt_field) return -EINVAL; record = tracecmd_read_at(kshark_get_tep_input(stream), entry->offset, NULL); if (!record) return -EFAULT; ret = tep_read_number_field(evt_field, record->data, (unsigned long long *) val); tracecmd_free_record(record); return ret; } /** Initialize all methods used by a stream of FTRACE data. */ static void kshark_tep_init_methods(struct kshark_generic_stream_interface *interface) { if (!interface) return; interface->get_pid = tepdata_get_pid; interface->get_task = tepdata_get_task; interface->get_event_id = tepdata_get_event_id; interface->get_event_name = tepdata_get_event_name; interface->aux_info= tepdata_get_latency; interface->get_info = tepdata_get_info; interface->find_event_id = tepdata_find_event_id; interface->get_all_event_ids = tepdata_get_event_ids; interface->dump_entry = tepdata_dump_entry; interface->get_all_event_field_names = tepdata_get_field_names; interface->get_event_field_type = tepdata_get_field_type; interface->read_record_field_int64 = tepdata_read_record_field; interface->read_event_field_int64 = tepdata_read_event_field; interface->load_entries = tepdata_load_entries; interface->load_matrix = tepdata_load_matrix; } /** A list of built in default plugins for FTRACE (trace-cmd) data. */ const char *tep_plugin_names[] = { "sched_events", "missed_events", "kvm_combo", }; /** * Register to the data stream all default plugins for FTRACE (trace-cmd) data. */ int kshark_tep_handle_plugins(struct kshark_context *kshark_ctx, int sd) { struct kshark_plugin_list *plugin; struct kshark_data_stream *stream; int i, n_tep_plugins; n_tep_plugins = (sizeof(tep_plugin_names) / sizeof((tep_plugin_names)[0])); stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return -EEXIST; for (i = 0; i < n_tep_plugins; ++i) { plugin = kshark_find_plugin_by_name(kshark_ctx->plugins, tep_plugin_names[i]); if (plugin && plugin->process_interface) { kshark_register_plugin_to_stream(stream, plugin->process_interface, true); } else { fprintf(stderr, "Plugin \"%s\" not found.\n", tep_plugin_names[i]); } } return kshark_handle_all_dpis(stream, KSHARK_PLUGIN_INIT); } /** The Process Id of the Idle tasks is zero. */ #define LINUX_IDLE_TASK_PID 0 static int kshark_tep_stream_init(struct kshark_data_stream *stream, struct tracecmd_input *input) { struct kshark_generic_stream_interface *interface; struct tepdata_handle *tep_handle; struct tep_event *event; stream->interface = interface = calloc(1, sizeof(*interface)); if (!interface) return -ENOMEM; interface->type = KS_GENERIC_DATA_INTERFACE; tep_handle = calloc(1, sizeof(*tep_handle)); if (!tep_handle) goto fail; tep_handle->input = input; tep_handle->tep = tracecmd_get_tep(tep_handle->input); if (!tep_handle->tep) goto fail; tep_handle->sched_switch_event_id = -EINVAL; event = tep_find_event_by_name(tep_handle->tep, "sched", "sched_switch"); if (event) { tep_handle->sched_switch_event_id = event->id; tep_handle->sched_switch_next_field = tep_find_any_field(event, "next_pid"); tep_handle->sched_switch_comm_field = tep_find_field(event, "next_comm"); } stream->n_cpus = tep_get_cpus(tep_handle->tep); stream->n_events = tep_get_events_count(tep_handle->tep); stream->idle_pid = LINUX_IDLE_TASK_PID; tep_handle->advanced_event_filter = tep_filter_alloc(tep_handle->tep); kshark_tep_init_methods(interface); interface->handle = tep_handle; return 0; fail: free(tep_handle); free(interface); stream->interface = NULL; return -EFAULT; } static inline char *set_tep_format(struct kshark_data_stream *stream) { return kshark_set_data_format(stream->data_format, TEP_DATA_FORMAT_IDENTIFIER); } static struct tracecmd_input *get_top_input(struct kshark_context *kshark_ctx, int sd) { struct kshark_data_stream *top_stream; top_stream = kshark_get_data_stream(kshark_ctx, sd); if (!top_stream) return NULL; return kshark_get_tep_input(top_stream); } /** * @brief Get an array containing the names of all buffers in FTRACE data * file. * * @param kshark_ctx: Input location for context pointer. * @param sd: Data stream identifier of the top buffers in the FTRACE data * file. * @param n_buffers: Output location for the size of the outputted array, * or a negative error code on failure. * * @returns Array of strings on success, or NULL on failure. The user is * responsible for freeing the elements of the outputted array. */ char **kshark_tep_get_buffer_names(struct kshark_context *kshark_ctx, int sd, int *n_buffers) { struct tracecmd_input *top_input; char **buffer_names; int i, n; top_input = get_top_input(kshark_ctx, sd); if (!top_input) { *n_buffers = -EFAULT; return NULL; } n = tracecmd_buffer_instances(top_input); buffer_names = calloc(n, sizeof(char *)); if (!buffer_names) { *n_buffers = -ENOMEM; return NULL; } for (i = 0; i < n; ++i) { buffer_names[i] = strdup(tracecmd_buffer_instance_name(top_input, i)); if (!buffer_names[i]) goto free_all; } *n_buffers = n; return buffer_names; free_all: for (i = 0; i < n; ++i) free(buffer_names[i]); free(buffer_names); *n_buffers = -ENOMEM; return NULL; } static void set_stream_fields(struct tracecmd_input *top_input, int i, const char *file, const char *name, struct kshark_data_stream *buffer_stream, struct tracecmd_input **buffer_input) { *buffer_input = tracecmd_buffer_instance_handle(top_input, i); buffer_stream->name = strdup(name); buffer_stream->file = strdup(file); set_tep_format(buffer_stream); } /** * @brief Open a given buffers in FTRACE (trace-cmd) data file. * * @param kshark_ctx: Input location for context pointer. * @param sd: Data stream identifier of the top buffers in the FTRACE data * file. * @param buffer_name: The name of the buffer to open. * * @returns Data stream identifier of the buffer on success. Otherwise a * negative error code. */ int kshark_tep_open_buffer(struct kshark_context *kshark_ctx, int sd, const char *buffer_name) { struct kshark_data_stream *top_stream, *buffer_stream; struct tracecmd_input *top_input, *buffer_input; int i, sd_buffer, n_buffers, ret = -ENODATA; char **names; top_stream = kshark_get_data_stream(kshark_ctx, sd); if (!top_stream) return -EFAULT; top_input = kshark_get_tep_input(top_stream); if (!top_input) return -EFAULT; names = kshark_tep_get_buffer_names(kshark_ctx, sd, &n_buffers); if (!names) return n_buffers; sd_buffer = kshark_add_stream(kshark_ctx); buffer_stream = kshark_get_data_stream(kshark_ctx, sd_buffer); if (!buffer_stream) { ret = -EFAULT; goto end; } for (i = 0; i < n_buffers; ++i) { if (strcmp(buffer_name, names[i]) == 0) { set_stream_fields(top_input, i, top_stream->file, buffer_name, buffer_stream, &buffer_input); if (!buffer_stream->name || !buffer_stream->file) { free(buffer_stream->name); free(buffer_stream->file); buffer_stream->name = NULL; buffer_stream->file = NULL; ret = -ENOMEM; break; } ret = kshark_tep_stream_init(buffer_stream, buffer_input); break; } } end: for (i = 0; i < n_buffers; ++i) free(names[i]); free(names); return (ret < 0)? ret : buffer_stream->stream_id; } /** * @brief Initialize data streams for all buffers in a FTRACE (trace-cmd) data * file. * * @param kshark_ctx: Input location for context pointer. * @param sd: Data stream identifier of the top buffers in the FTRACE data * file. * * @returns The total number of data streams initialized on success. Otherwise * a negative error code. */ int kshark_tep_init_all_buffers(struct kshark_context *kshark_ctx, int sd) { struct kshark_data_stream *top_stream, *buffer_stream; struct tracecmd_input *buffer_input; struct tracecmd_input *top_input; int i, n_buffers, sd_buffer, ret; top_stream = kshark_get_data_stream(kshark_ctx, sd); if (!top_stream) return -EFAULT; top_input = kshark_get_tep_input(top_stream); if (!top_input) return -EFAULT; n_buffers = tracecmd_buffer_instances(top_input); for (i = 0; i < n_buffers; ++i) { sd_buffer = kshark_add_stream(kshark_ctx); if (sd_buffer < 0) return -EFAULT; buffer_stream = kshark_ctx->stream[sd_buffer]; set_stream_fields(top_input, i, top_stream->file, tracecmd_buffer_instance_name(top_input, i), buffer_stream, &buffer_input); if (!buffer_stream->name || !buffer_stream->file) { free(buffer_stream->name); free(buffer_stream->file); buffer_stream->name = NULL; buffer_stream->file = NULL; return -ENOMEM; } ret = kshark_tep_stream_init(buffer_stream, buffer_input); if (ret != 0) return -EFAULT; } return n_buffers; } /** Is this a stream corresponding to the "top" buffer in the file. */ bool kshark_tep_is_top_stream(struct kshark_data_stream *stream) { return strcmp(stream->name, KS_UNNAMED) == 0; } /** Check is the file contains TEP tracing data. */ bool kshark_tep_check_data(const char *file_name) { /* * TODO: This is very naive. Implement more appropriate check. Ideally * it should be part of the trace-cmd library. */ char *ext = strrchr(file_name, '.'); if (ext && strcmp(ext, ".dat") == 0) { return true; } return false; } /** Initialize the FTRACE data input (from file). */ int kshark_tep_init_input(struct kshark_data_stream *stream) { struct kshark_context *kshark_ctx = NULL; struct tracecmd_input *input; if (!kshark_instance(&kshark_ctx) || !init_thread_seq()) return -EEXIST; /* * Turn off function trace indent and turn on show parent * if possible. */ tep_plugin_add_option("ftrace:parent", "1"); tep_plugin_add_option("ftrace:indent", "0"); input = tracecmd_open_head(stream->file, 0); if (!input) return -EEXIST; /* Read the tracing data from the file. */ if (tracecmd_init_data(input) < 0) goto fail; /* Initialize the stream asociated with the main buffer. */ if (kshark_tep_stream_init(stream, input) < 0) goto fail; stream->name = strdup(KS_UNNAMED); return 0; fail: tracecmd_close(input); return -EFAULT; } /** Initialize using the locally available tracing events. */ int kshark_tep_init_local(struct kshark_data_stream *stream) { struct kshark_generic_stream_interface *interface; struct tepdata_handle *tep_handle; stream->interface = interface = calloc(1, sizeof(*interface)); if (!interface) return -ENOMEM; interface->type = KS_GENERIC_DATA_INTERFACE; tep_handle = calloc(1, sizeof(*tep_handle)); if (!tep_handle) goto fail; tep_handle->tep = tracefs_local_events(tracefs_tracing_dir()); if (!tep_handle->tep) goto fail; stream->n_events = tep_get_events_count(tep_handle->tep); stream->n_cpus = tep_get_cpus(tep_handle->tep); set_tep_format(stream); if (asprintf(&stream->file, "Local system") <= 0) goto fail; interface->handle = tep_handle; kshark_tep_init_methods(interface); return 0; fail: free(tep_handle); free(interface); stream->interface = NULL; return -EFAULT; } /** Method used to close a stream of FTRACE data. */ int kshark_tep_close_interface(struct kshark_data_stream *stream) { struct kshark_generic_stream_interface *interface = stream->interface; struct tepdata_handle *tep_handle; if (!interface) return -EFAULT; tep_handle = interface->handle; if (!tep_handle) return -EFAULT; if (seq.buffer) { trace_seq_destroy(&seq); seq.buffer = NULL; } if (tep_handle->advanced_event_filter) { tep_filter_reset(tep_handle->advanced_event_filter); tep_filter_free(tep_handle->advanced_event_filter); tep_handle->advanced_event_filter = NULL; } if (tep_handle->input) tracecmd_close(tep_handle->input); free(tep_handle); interface->handle = NULL; return 0; } /** Check if the filter any filter is set. */ bool kshark_tep_filter_is_set(struct kshark_data_stream *stream) { struct tep_event_filter *adv_filter = get_adv_filter(stream); if (adv_filter && adv_filter->filters) return true; return false; } /** * @brief Add a filter based on the content of the event. * * @param stream: Input location for the FTRACE data stream pointer. * @param filter_str: The definition of the filter. * * @returns 0 if the filter was successfully added or a negative error code. */ int kshark_tep_add_filter_str(struct kshark_data_stream *stream, const char *filter_str) { struct tep_event_filter *adv_filter = get_adv_filter(stream); int ret = tep_filter_add_filter_str(adv_filter, filter_str); if (ret < 0) { char error_str[200]; int error_status = tep_strerror(kshark_get_tep(stream), ret, error_str, sizeof(error_str)); if (error_status == 0) fprintf(stderr, "filter failed due to: %s\n", error_str); } return ret; } /** * @brief Get a string showing the filter definition. * * @param stream: Input location for the FTRACE data stream pointer. * @param event_id: The unique Id of the event type of the filter. * * @returns A string that displays the filter contents. This string must be * freed with free(str). NULL is returned if no filter is found or * allocation failed. */ char *kshark_tep_filter_make_string(struct kshark_data_stream *stream, int event_id) { struct tep_event_filter *adv_filter = get_adv_filter(stream); return tep_filter_make_string(adv_filter, event_id); } /** * @brief Remove a filter based on the content of the event. * * @param stream: Input location for the FTRACE data stream pointer. * @param event_id: The unique Id of the event type of the filter. * * @return 1: if an event was removed or 0 if the event was not found. */ int kshark_tep_filter_remove_event(struct kshark_data_stream *stream, int event_id) { struct tep_event_filter *adv_filter = get_adv_filter(stream); return tep_filter_remove_event(adv_filter, event_id); } /** Reset all filters based on the content of the event. */ void kshark_tep_filter_reset(struct kshark_data_stream *stream) { return tep_filter_reset(get_adv_filter(stream)); } /** Get an array of available tracer plugins. */ char **kshark_tracecmd_local_plugins() { return tracefs_tracers(tracefs_tracing_dir()); } void kshark_tracecmd_plugin_list_free(char **list) { tracefs_list_free(list); } /** * @brief Free an array, allocated by kshark_tracecmd_get_hostguest_mapping() API * * * @param map: Array, allocated by kshark_tracecmd_get_hostguest_mapping() API * @param count: Number of entries in the array * */ void kshark_tracecmd_free_hostguest_map(struct kshark_host_guest_map *map, int count) { int i; if (!map) return; for (i = 0; i < count; i++) { free(map[i].guest_name); free(map[i].cpu_pid); memset(&map[i], 0, sizeof(*map)); } free(map); } /** * @brief Get mapping of guest VCPU to host task, running that VCPU. * Array of mappings for each guest is allocated and returned * in map input parameter. * * * @param map: Returns allocated array of kshark_host_guest_map structures, each * one describing VCPUs mapping of one guest. * * @return The number of entries in the *map array, or a negative error code on * failure. */ int kshark_tracecmd_get_hostguest_mapping(struct kshark_host_guest_map **map) { struct kshark_host_guest_map *gmap = NULL; struct tracecmd_input *peer_handle = NULL; struct kshark_data_stream *peer_stream; struct tracecmd_input *guest_handle = NULL; struct kshark_data_stream *guest_stream; struct kshark_context *kshark_ctx = NULL; unsigned long long trace_id; const char *name; int vcpu_count; const int *cpu_pid; int *stream_ids; int i, j, k; int count = 0; int ret; if (!map || !kshark_instance(&kshark_ctx)) return -EFAULT; if (*map) return -EEXIST; stream_ids = kshark_all_streams(kshark_ctx); for (i = 0; i < kshark_ctx->n_streams; i++) { guest_stream = kshark_get_data_stream(kshark_ctx, stream_ids[i]); if (!guest_stream || !kshark_is_tep(guest_stream)) continue; guest_handle = kshark_get_tep_input(guest_stream); if (!guest_handle) continue; trace_id = tracecmd_get_traceid(guest_handle); if (!trace_id) continue; for (j = 0; j < kshark_ctx->n_streams; j++) { if (stream_ids[i] == stream_ids[j]) continue; peer_stream = kshark_get_data_stream(kshark_ctx, stream_ids[j]); if (!peer_stream || !kshark_is_tep(guest_stream)) continue; peer_handle = kshark_get_tep_input(peer_stream); if (!peer_handle) continue; ret = tracecmd_get_guest_cpumap(peer_handle, trace_id, &name, &vcpu_count, &cpu_pid); if (!ret && vcpu_count) { gmap = realloc(*map, (count + 1) * sizeof(struct kshark_host_guest_map)); if (!gmap) goto mem_error; *map = gmap; memset(&gmap[count], 0, sizeof(struct kshark_host_guest_map)); count++; gmap[count - 1].guest_id = stream_ids[i]; gmap[count - 1].host_id = stream_ids[j]; gmap[count - 1].guest_name = strdup(name); if (!gmap[count - 1].guest_name) goto mem_error; gmap[count - 1].vcpu_count = vcpu_count; gmap[count - 1].cpu_pid = malloc(sizeof(int) * vcpu_count); if (!gmap[count - 1].cpu_pid) goto mem_error; for (k = 0; k < vcpu_count; k++) gmap[count - 1].cpu_pid[k] = cpu_pid[k]; break; } } } free(stream_ids); return count; mem_error: free(stream_ids); if (*map) { kshark_tracecmd_free_hostguest_map(*map, count); *map = NULL; } return -ENOMEM; } /** * @brief Find the data stream corresponding the top buffer of a FTRACE * (trace-cmd) data file. * * @param kshark_ctx: Input location for context pointer. * @param file: The name of the file. * * @returns Data stream identifier of the top buffers in the FTRACE data * fileon success. Otherwise a negative error code. */ int kshark_tep_find_top_stream(struct kshark_context *kshark_ctx, const char *file) { struct kshark_data_stream *top_stream = NULL, *stream; int i, *stream_ids = kshark_all_streams(kshark_ctx); for (i = 0; i < kshark_ctx->n_streams; ++i) { stream = kshark_ctx->stream[stream_ids[i]]; if (strcmp(stream->file, file) == 0 && kshark_tep_is_top_stream(stream)) top_stream = stream; } free(stream_ids); if (!top_stream) return -EEXIST; return top_stream->stream_id; } static bool find_wakeup_event(struct tep_handle *tep, const char *wakeup_name, struct tep_event **waking_event_ptr) { struct tep_event *event; event = tep_find_event_by_name(tep, "sched", wakeup_name); if (event) *waking_event_ptr = event; return !!event; } /** * @brief Search the available trace events and retrieve a definition of * a waking_event. * * @param tep: Input location for the the Page event object. * @param waking_event_ptr: Output location for the the waking_event object. * * @returns True on success, otherwise False. */ bool define_wakeup_event(struct tep_handle *tep, struct tep_event **waking_event_ptr) { bool wakeup_found; wakeup_found = find_wakeup_event(tep, "sched_wakeup", waking_event_ptr); wakeup_found |= find_wakeup_event(tep, "sched_wakeup_new", waking_event_ptr); wakeup_found |= find_wakeup_event(tep, "sched_waking", waking_event_ptr); return wakeup_found; } kernel-shark-kernelshark-v2.4.0/src/libkshark-tepdata.h000066400000000000000000000060021477354127100231430ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2019 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark-tepdata.h * @brief Interface for processing of FTRACE (trace-cmd) data. */ #ifndef _KSHARK_TEPDATA_H #define _KSHARK_TEPDATA_H // KernelShark #include "libkshark.h" #ifdef __cplusplus extern "C" { #endif /** Unique identifier of the TEP tracing data format. */ #define TEP_DATA_FORMAT_IDENTIFIER "tep data" /** Check if this Data stream corresponds to a TEP tracing data. */ static inline bool kshark_is_tep(struct kshark_data_stream *stream) { return strcmp(stream->data_format, TEP_DATA_FORMAT_IDENTIFIER) == 0; } bool kshark_tep_check_data(const char *file_name); int kshark_tep_init_input(struct kshark_data_stream *stream); int kshark_tep_init_local(struct kshark_data_stream *stream); int kshark_tep_close_interface(struct kshark_data_stream *stream); bool kshark_tep_filter_is_set(struct kshark_data_stream *stream); int kshark_tep_add_filter_str(struct kshark_data_stream *stream, const char *filter_str); char *kshark_tep_filter_make_string(struct kshark_data_stream *stream, int event_id); int kshark_tep_filter_remove_event(struct kshark_data_stream *stream, int event_id); void kshark_tep_filter_reset(struct kshark_data_stream *stream); char **kshark_tracecmd_local_plugins(); void kshark_tracecmd_plugin_list_free(char **list); struct tep_handle; struct tep_handle *kshark_get_tep(struct kshark_data_stream *stream); struct tracecmd_input; struct tracecmd_input *kshark_get_tep_input(struct kshark_data_stream *stream); struct tep_record; ssize_t kshark_load_tep_records(struct kshark_context *kshark_ctx, int sd, struct tep_record ***data_rows); /** * Structure representing the mapping between the virtual CPUs and their * corresponding processes in the host. */ struct kshark_host_guest_map { /** ID of guest stream */ int guest_id; /** ID of host stream */ int host_id; /** Guest name */ char *guest_name; /** Number of guest's CPUs in *cpu_pid array */ int vcpu_count; /** Array of host task PIDs, index is the VCPU id */ int *cpu_pid; }; void kshark_tracecmd_free_hostguest_map(struct kshark_host_guest_map *map, int count); int kshark_tracecmd_get_hostguest_mapping(struct kshark_host_guest_map **map); char **kshark_tep_get_buffer_names(struct kshark_context *kshark_ctx, int sd, int *n_buffers); int kshark_tep_open_buffer(struct kshark_context *kshark_ctx, int sd, const char *buffer_name); int kshark_tep_init_all_buffers(struct kshark_context *kshark_ctx, int sd); int kshark_tep_handle_plugins(struct kshark_context *kshark_ctx, int sd); int kshark_tep_find_top_stream(struct kshark_context *kshark_ctx, const char *file); bool kshark_tep_is_top_stream(struct kshark_data_stream *stream); struct tep_event; struct tep_format_field; bool define_wakeup_event(struct tep_handle *tep, struct tep_event **wakeup_event); #ifdef __cplusplus } #endif #endif // _KSHARK_TEPDATA_H kernel-shark-kernelshark-v2.4.0/src/libkshark.c000066400000000000000000001753131477354127100215320ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark.c * @brief API for processing of tracing data. */ #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif // _GNU_SOURCE // C #include #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-tepdata.h" static struct kshark_context *kshark_context_handler = NULL; static bool kshark_default_context(struct kshark_context **context) { struct kshark_context *kshark_ctx; kshark_ctx = calloc(1, sizeof(*kshark_ctx)); if (!kshark_ctx) return false; kshark_ctx->stream = calloc(KS_DEFAULT_NUM_STREAMS, sizeof(*kshark_ctx->stream)); kshark_ctx->stream_info.array_size = KS_DEFAULT_NUM_STREAMS; kshark_ctx->stream_info.next_free_stream_id = 0; kshark_ctx->stream_info.max_stream_id = -1; /* Will free kshark_context_handler. */ kshark_free(NULL); /* Will do nothing if *context is NULL. */ kshark_free(*context); *context = kshark_context_handler = kshark_ctx; return true; } /** * @brief Initialize a kshark session. This function must be called before * calling any other kshark function. If the session has been * initialized, this function can be used to obtain the session's * context. * * @param kshark_ctx: Optional input/output location for context pointer. * If it points to a context, that context will become * the new session. If it points to NULL, it will obtain * the current (or new) session. The result is only * valid on return of true. * * @returns True on success, or false on failure. */ bool kshark_instance(struct kshark_context **kshark_ctx) { if (*kshark_ctx != NULL) { /* Will free kshark_context_handler */ kshark_free(NULL); /* Use the context provided by the user. */ kshark_context_handler = *kshark_ctx; } else { if (kshark_context_handler) { /* * No context is provided by the user, but the context * handler is already set. Use the context handler. */ *kshark_ctx = kshark_context_handler; } else { /* No kshark_context exists. Create a default one. */ if (!kshark_default_context(kshark_ctx)) return false; } } return true; } /** * @brief Open and prepare for reading a trace data file specified by "file". * * @param kshark_ctx: Input location for context pointer. * @param file: The file to load. * * @returns The Id number of the data stream associated with this file on success. * Otherwise a negative errno code. */ int kshark_open(struct kshark_context *kshark_ctx, const char *file) { int sd, rt; sd = kshark_add_stream(kshark_ctx); if (sd < 0) return sd; rt = kshark_stream_open(kshark_ctx->stream[sd], file); if (rt < 0) { kshark_remove_stream(kshark_ctx, sd); return rt; } return sd; } static void kshark_stream_free(struct kshark_data_stream *stream) { if (!stream) return; kshark_hash_id_free(stream->idle_cpus); kshark_hash_id_free(stream->show_task_filter); kshark_hash_id_free(stream->hide_task_filter); kshark_hash_id_free(stream->show_event_filter); kshark_hash_id_free(stream->hide_event_filter); kshark_hash_id_free(stream->show_cpu_filter); kshark_hash_id_free(stream->hide_cpu_filter); kshark_hash_id_free(stream->tasks); free(stream->calib_array); free(stream->file); free(stream->name); free(stream->interface); free(stream); } static struct kshark_data_stream *kshark_stream_alloc() { struct kshark_data_stream *stream; stream = calloc(1, sizeof(*stream)); if (!stream) goto fail; stream->idle_cpus = kshark_hash_id_alloc(KS_FILTER_HASH_NBITS); stream->show_task_filter = kshark_hash_id_alloc(KS_FILTER_HASH_NBITS); stream->hide_task_filter = kshark_hash_id_alloc(KS_FILTER_HASH_NBITS); stream->show_event_filter = kshark_hash_id_alloc(KS_FILTER_HASH_NBITS); stream->hide_event_filter = kshark_hash_id_alloc(KS_FILTER_HASH_NBITS); stream->show_cpu_filter = kshark_hash_id_alloc(KS_FILTER_HASH_NBITS); stream->hide_cpu_filter = kshark_hash_id_alloc(KS_FILTER_HASH_NBITS); stream->tasks = kshark_hash_id_alloc(KS_TASK_HASH_NBITS); if (!stream->show_task_filter || !stream->hide_task_filter || !stream->show_event_filter || !stream->hide_event_filter || !stream->tasks) { goto fail; } stream->filter_is_applied = false; kshark_set_data_format(stream->data_format, KS_INVALID_DATA); stream->name = strdup(KS_UNNAMED); return stream; fail: kshark_stream_free(stream); return NULL; } /** * The maximum number of Data streams that can be added simultaneously. * The limit is determined by the 16 bit integer used to store the stream Id * inside struct kshark_entry. */ #define KS_MAX_STREAM_ID INT16_MAX /** * Bit mask (0 - 15) used when converting indexes to pointers and vise-versa. */ #define INDEX_MASK UINT16_MAX /** * Bit mask (16 - 31/63) used when converting indexes to pointers and * vise-versa. */ #define INVALID_STREAM_MASK (~((unsigned long) INDEX_MASK)) static int index_from_ptr(void *ptr) { unsigned long index = (unsigned long) ptr; return (int) (index & INDEX_MASK); } static void *index_to_ptr(unsigned int index) { unsigned long p; p = INVALID_STREAM_MASK | index; return (void *) p; } static bool kshark_is_valid_stream(void *ptr) { unsigned long p = (unsigned long) ptr; bool v = !((p & ~INDEX_MASK) == INVALID_STREAM_MASK); return p && v; } /** * @brief Add new Data stream. * * @param kshark_ctx: Input location for context pointer. * * @returns Zero on success or a negative errno code on failure. */ int kshark_add_stream(struct kshark_context *kshark_ctx) { struct kshark_data_stream *stream; int new_stream; if(kshark_ctx->stream_info.next_free_stream_id > KS_MAX_STREAM_ID) return -ENODEV; if (kshark_ctx->stream_info.next_free_stream_id == kshark_ctx->stream_info.array_size) { if (!KS_DOUBLE_SIZE(kshark_ctx->stream, kshark_ctx->stream_info.array_size)) return -ENOMEM; } stream = kshark_stream_alloc(); if (!stream) return -ENOMEM; if (pthread_mutex_init(&stream->input_mutex, NULL) != 0) { kshark_stream_free(stream); return -EAGAIN; } if (kshark_ctx->stream_info.next_free_stream_id > kshark_ctx->stream_info.max_stream_id) { new_stream = ++kshark_ctx->stream_info.max_stream_id; kshark_ctx->stream_info.next_free_stream_id = new_stream + 1; kshark_ctx->stream[new_stream] = stream; stream->stream_id = new_stream; } else { new_stream = kshark_ctx->stream_info.next_free_stream_id; kshark_ctx->stream_info.next_free_stream_id = index_from_ptr(kshark_ctx->stream[new_stream]); kshark_ctx->stream[new_stream] = stream; stream->stream_id = new_stream; } kshark_ctx->n_streams++; return stream->stream_id; } /** * @brief Use an existing Trace data stream to open and prepare for reading * a trace data file specified by "file". * * @param stream: Input location for a Trace data stream pointer. * @param file: The file to load. * * @returns Zero on success or a negative error code in the case of an errno. */ int kshark_stream_open(struct kshark_data_stream *stream, const char *file) { struct kshark_context *kshark_ctx = NULL; struct kshark_dri_list *input; if (!stream || !kshark_instance(&kshark_ctx)) return -EFAULT; stream->file = strdup(file); if (!stream->file) return -ENOMEM; if (kshark_tep_check_data(file)) { kshark_set_data_format(stream->data_format, TEP_DATA_FORMAT_IDENTIFIER); return kshark_tep_init_input(stream); } for (input = kshark_ctx->inputs; input; input = input->next) if (input->interface->check_data(file)) { strcpy(stream->data_format, input->interface->data_format); return input->interface->init(stream); } return -ENODATA; } /** * @brief Remove Data stream. * * @param kshark_ctx: Input location for context pointer. * @param sd: Data stream identifier. * * @returns Zero on success or a negative errno code on failure. */ int kshark_remove_stream(struct kshark_context *kshark_ctx, int sd) { struct kshark_data_stream *stream; if (sd < 0 || sd > kshark_ctx->stream_info.max_stream_id || !kshark_is_valid_stream(kshark_ctx->stream[sd])) return -EFAULT; stream = kshark_ctx->stream[sd]; pthread_mutex_destroy(&stream->input_mutex); kshark_stream_free(stream); kshark_ctx->stream[sd] = index_to_ptr(kshark_ctx->stream_info.next_free_stream_id); kshark_ctx->stream_info.next_free_stream_id = sd; kshark_ctx->n_streams--; return 0; } /** * @brief Get the Data stream object having given Id. * * @param kshark_ctx: Input location for context pointer. * @param sd: Data stream identifier. * * @returns Pointer to a Data stream object if the sream exists. Otherwise * NULL. */ struct kshark_data_stream * kshark_get_data_stream(struct kshark_context *kshark_ctx, int sd) { if (sd >= 0 && sd <= kshark_ctx->stream_info.max_stream_id) if (kshark_ctx->stream[sd] && kshark_is_valid_stream(kshark_ctx->stream[sd]) && kshark_ctx->stream[sd]->interface) return kshark_ctx->stream[sd]; return NULL; } static struct kshark_data_stream * get_stream_object(struct kshark_context *kshark_ctx, int sd) { if (sd >= 0 && sd <= kshark_ctx->stream_info.max_stream_id) if (kshark_ctx->stream[sd] && kshark_is_valid_stream(kshark_ctx->stream[sd])) return kshark_ctx->stream[sd]; return NULL; } /** * @brief Get the Data stream object corresponding to a given entry * * @param entry: Input location for the KernelShark entry. * * @returns Pointer to a Data stream object on success. Otherwise NULL. */ struct kshark_data_stream * kshark_get_stream_from_entry(const struct kshark_entry *entry) { struct kshark_context *kshark_ctx = NULL; if (!kshark_instance(&kshark_ctx)) return NULL; return kshark_get_data_stream(kshark_ctx, entry->stream_id); } /** * @brief Get an array containing the Ids of all opened Trace data streams. * The User is responsible for freeing the array. * * @param kshark_ctx: Input location for context pointer. */ int *kshark_all_streams(struct kshark_context *kshark_ctx) { int *ids, i, count = 0; ids = calloc(kshark_ctx->n_streams, (sizeof(*ids))); if (!ids) return NULL; for (i = 0; i <= kshark_ctx->stream_info.max_stream_id; ++i) if (kshark_ctx->stream[i] && kshark_is_valid_stream(kshark_ctx->stream[i])) ids[count++] = i; return ids; } static int kshark_stream_close(struct kshark_data_stream *stream) { struct kshark_context *kshark_ctx = NULL; struct kshark_dri_list *input; if (!stream || !kshark_instance(&kshark_ctx)) return -EFAULT; /* * All filters are file specific. Make sure that all Process Ids and * Event Ids from this file are not going to be used with another file. */ kshark_hash_id_clear(stream->show_task_filter); kshark_hash_id_clear(stream->hide_task_filter); kshark_hash_id_clear(stream->show_event_filter); kshark_hash_id_clear(stream->hide_event_filter); kshark_hash_id_clear(stream->show_cpu_filter); kshark_hash_id_clear(stream->hide_cpu_filter); kshark_hash_id_clear(stream->idle_cpus); if (kshark_is_tep(stream)) return kshark_tep_close_interface(stream); for (input = kshark_ctx->inputs; input; input = input->next) if (strcmp(stream->data_format, input->interface->data_format) == 0) return input->interface->close(stream); return -ENODATA; } /** * @brief Close the trace data file and free the trace data handle. * * @param kshark_ctx: Input location for the session context pointer. * @param sd: Data stream identifier. * * @returns Zero on success or a negative errno code on failure. */ int kshark_close(struct kshark_context *kshark_ctx, int sd) { struct kshark_data_stream *stream; int ret; stream = get_stream_object(kshark_ctx, sd); if (!stream) return -EFAULT; /* * All data collections are file specific. Make sure that collections * from this file are not going to be used with another file. */ kshark_unregister_stream_collections(&kshark_ctx->collections, sd); /* Close all active plugins for this stream. */ if (stream->plugins) { kshark_handle_all_dpis(stream, KSHARK_PLUGIN_CLOSE); kshark_free_event_handler_list(stream->event_handlers); kshark_free_dpi_list(stream->plugins); } ret = kshark_stream_close(stream); kshark_remove_stream(kshark_ctx, stream->stream_id); return ret; } /** * @brief Close all currently open trace data file and free the trace data handle. * * @param kshark_ctx: Input location for the session context pointer. */ void kshark_close_all(struct kshark_context *kshark_ctx) { size_t mem_reset_size; int i; if (kshark_ctx->stream_info.max_stream_id < 0) return; for (i = 0; i <= kshark_ctx->stream_info.max_stream_id; ++i) kshark_close(kshark_ctx, i); /* Reset the array of data stream descriptors. */ mem_reset_size = (kshark_ctx->stream_info.max_stream_id + 1 ) * sizeof(*kshark_ctx->stream); memset(kshark_ctx->stream, 0, mem_reset_size); kshark_ctx->stream_info.next_free_stream_id = 0; kshark_ctx->stream_info.max_stream_id = -1; } /** * @brief Deinitialize kshark session. Should be called after closing all * open trace data files and before your application terminates. * * @param kshark_ctx: Optional input location for session context pointer. * If it points to a context of a session, that session * will be deinitialize. If it points to NULL, it will * deinitialize the current session. */ void kshark_free(struct kshark_context *kshark_ctx) { if (kshark_ctx == NULL) { if (kshark_context_handler == NULL) return; kshark_ctx = kshark_context_handler; /* kshark_ctx_handler will be set to NULL below. */ } kshark_close_all(kshark_ctx); free(kshark_ctx->stream); if (kshark_ctx->plugins) kshark_free_plugin_list(kshark_ctx->plugins); kshark_free_dri_list(kshark_ctx->inputs); if (kshark_ctx == kshark_context_handler) kshark_context_handler = NULL; free(kshark_ctx); } /** * @brief Get the name of the command/task from its Process Id. * * @param sd: Data stream identifier. * @param pid: Process Id of the command/task. */ char *kshark_comm_from_pid(int sd, int pid) { struct kshark_generic_stream_interface *interface; struct kshark_context *kshark_ctx = NULL; struct kshark_data_stream *stream; struct kshark_entry e; if (!kshark_instance(&kshark_ctx)) return NULL; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return NULL; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_task) { e.visible = KS_PLUGIN_UNTOUCHED_MASK; e.pid = pid; return interface->get_task(stream, &e); } return NULL; } /** * @brief Get the name of the event from its Id. * * @param sd: Data stream identifier. * @param event_id: The unique Id of the event type. */ char *kshark_event_from_id(int sd, int event_id) { struct kshark_generic_stream_interface *interface; struct kshark_context *kshark_ctx = NULL; struct kshark_data_stream *stream; struct kshark_entry e; if (!kshark_instance(&kshark_ctx)) return NULL; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return NULL; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_event_name) { e.visible = KS_PLUGIN_UNTOUCHED_MASK; e.event_id = event_id; return interface->get_event_name(stream, &e); } return NULL; } /** * @brief Get the original process Id of the entry. Using this function make * sense only in cases when the original value can be overwritten by * plugins. If you know that no plugins are loaded use "entry->pid" * directly. * * @param entry: Input location for an entry. */ int kshark_get_pid(const struct kshark_entry *entry) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return -EFAULT; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_pid) return interface->get_pid(stream, entry); return -EFAULT; } /** * @brief Get the original event Id of the entry. Using this function make * sense only in cases when the original value can be overwritten by * plugins. If you know that no plugins are loaded use "entry->event_id" * directly. * * @param entry: Input location for an entry. */ int kshark_get_event_id(const struct kshark_entry *entry) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return -EFAULT; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_event_id) return interface->get_event_id(stream, entry); return -EFAULT; } /** * @brief Get an array of all event Ids for a given data stream. * * @param stream: Input location for a Trace data stream pointer. * * @returns An array of event Ids. The user is responsible for freeing the * outputted array. */ int *kshark_get_all_event_ids(struct kshark_data_stream *stream) { struct kshark_generic_stream_interface *interface; if (!stream) return NULL; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_all_event_ids) return interface->get_all_event_ids(stream); return NULL; } /** * @brief Find the event Ids corresponding to a given event name. * * @param stream: Input location for a Trace data stream pointer. * @param event_name: The name of the event. * * @returns Event Ids number. */ int kshark_find_event_id(struct kshark_data_stream *stream, const char *event_name) { struct kshark_generic_stream_interface *interface; if (!stream) return -EFAULT; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->find_event_id) return interface->find_event_id(stream, event_name); return -EFAULT; } /** * @brief Find the event name corresponding to a given entry. * * @param entry: Input location for an entry. * * @returns The mane of the event on success, or NULL in case of failure. * The use is responsible for freeing the output string. */ char *kshark_get_event_name(const struct kshark_entry *entry) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return NULL; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_event_name) return interface->get_event_name(stream, entry); return NULL; } /** * @brief Find the task name corresponding to a given entry. * * @param entry: Input location for an entry. * * @returns The mane of the task on success, or NULL in case of failure. * The use is responsible for freeing the output string. */ char *kshark_get_task(const struct kshark_entry *entry) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return NULL; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_task) return interface->get_task(stream, entry); return NULL; } /** * @brief Get the basic information (text) about the entry. * * @param entry: Input location for an entry. * * @returns A the info text. The user is responsible for freeing the * outputted string. */ char *kshark_get_info(const struct kshark_entry *entry) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return NULL; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_info) return interface->get_info(stream, entry); return NULL; } /** * @brief Get the auxiliary information about the entry. In the case of * TEP (Ftrace) data, this function provides the latency info. * * @param entry: Input location for an entry. * * @returns A the auxiliary text info. The user is responsible for freeing the * outputted string. */ char *kshark_get_aux_info(const struct kshark_entry *entry) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return NULL; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->aux_info) return interface->aux_info(stream, entry); return NULL; } /** * @brief Get an array of all data field names associated with a given entry. * * @param entry: Input location for an entry. * @param fields: Output location of the array of field names. The user is * responsible for freeing the elements of the outputted array. * * @returns Total number of event fields on success, or a negative errno in * the case of a failure. */ int kshark_get_all_event_field_names(const struct kshark_entry *entry, char ***fields) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return -EFAULT; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_all_event_field_names) return interface->get_all_event_field_names(stream, entry, fields); return -EFAULT; } /** * @brief Get the value type of an event field corresponding to a given entry. * * @param entry: Input location for an entry. * @param field: The name of the data field. * * @returns The type of the data field on success, or KS_INVALID_FIELD in * the case of a failure. */ kshark_event_field_format kshark_get_event_field_type(const struct kshark_entry *entry, const char *field) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return KS_INVALID_FIELD; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->get_event_field_type) return interface->get_event_field_type(stream, entry, field); return KS_INVALID_FIELD; } /** * @brief Get the value of an event field in a given trace record. * * @param stream: Input location for a Trace data stream pointer. * @param rec: Input location for a record. * @param field: The name of the data field. * @param val: Output location for the value of the field. * * @returns Zero on success or a negative errno in the case of a failure. */ int kshark_read_record_field_int(struct kshark_data_stream *stream, void *rec, const char *field, int64_t *val) { struct kshark_generic_stream_interface *interface; if (!stream) return -EFAULT; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->read_record_field_int64) return interface->read_record_field_int64(stream, rec, field, val); return -EFAULT; } /** * @brief Get the value of an event field corresponding to a given entry. * The value is retrieved via the offset in the file of the original * record. * * @param entry: Input location for an entry. * @param field: The name of the data field. * @param val: Output location for the value of the field. * * @returns Zero on success or a negative errno in the case of a failure. */ int kshark_read_event_field_int(const struct kshark_entry *entry, const char* field, int64_t *val) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return -EFAULT; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->read_event_field_int64) return interface->read_event_field_int64(stream, entry, field, val); return -EFAULT; } /** * @brief Get a summary of the entry. * * @param entry: Input location for an entry. * * @returns A summary text info. The user is responsible for freeing the * outputted string. */ char *kshark_dump_entry(const struct kshark_entry *entry) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_stream_from_entry(entry); if (!stream) return NULL; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->dump_entry) return interface->dump_entry(stream, entry); return NULL; } /** @brief Print the entry. */ void kshark_print_entry(const struct kshark_entry *entry) { char *entry_str = kshark_dump_entry(entry); if (!entry_str) puts("(nil)"); puts(entry_str); free(entry_str); } /** * @brief Load the content of the trace data file asociated with a given * Data stream into an array of kshark_entries. * If one or more filters are set, the "visible" fields of each entry * is updated according to the criteria provided by the filters. The * field "filter_mask" of the session's context is used to control the * level of visibility/invisibility of the filtered entries. * * @param kshark_ctx: Input location for context pointer. * @param sd: Data stream identifier. * @param data_rows: Output location for the trace data. The user is * responsible for freeing the elements of the outputted * array. * * @returns The size of the outputted data in the case of success, or a * negative error code on failure. */ ssize_t kshark_load_entries(struct kshark_context *kshark_ctx, int sd, struct kshark_entry ***data_rows) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return -EFAULT; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->load_entries) return interface->load_entries(stream, kshark_ctx, data_rows); return -EFAULT; } /** * @brief Load the content of the trace data file asociated with a given * Data stream into a data matrix. The user is responsible * for freeing the outputted data. * * @param kshark_ctx: Input location for context pointer. * @param sd: Data stream identifier. * @param cpu_array: Output location for the CPU column (array) of the matrix. * @param event_array: Output location for the Event Id column (array) of the * matrix. * @param pid_array: Output location for the PID column (array) of the matrix. * @param offset_array: Output location for the offset column (array) of the * matrix. * @param ts_array: Output location for the time stamp column (array) of the * matrix. */ ssize_t kshark_load_matrix(struct kshark_context *kshark_ctx, int sd, int16_t **event_array, int16_t **cpu_array, int32_t **pid_array, int64_t **offset_array, int64_t **ts_array) { struct kshark_generic_stream_interface *interface; struct kshark_data_stream *stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return -EFAULT; interface = stream->interface; if (interface->type == KS_GENERIC_DATA_INTERFACE && interface->load_matrix) return interface->load_matrix(stream, kshark_ctx, event_array, cpu_array, pid_array, offset_array, ts_array); return -EFAULT; } /** * @brief Get an array containing the Process Ids of all tasks presented in * the loaded trace data file. * * @param kshark_ctx: Input location for context pointer. * @param sd: Data stream identifier. * @param pids: Output location for the Pids of the tasks. The user is * responsible for freeing the elements of the outputted array. * * @returns The size of the outputted array of Pids in the case of success, * or a negative error code on failure. */ ssize_t kshark_get_task_pids(struct kshark_context *kshark_ctx, int sd, int **pids) { struct kshark_data_stream *stream; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return -EBADF; *pids = kshark_hash_ids(stream->tasks); return stream->tasks->count; } static bool filter_find(struct kshark_hash_id *filter, int pid, bool test) { return !filter || !filter->count || kshark_hash_id_find(filter, pid) == test; } static bool kshark_show_task(struct kshark_data_stream *stream, int pid) { return filter_find(stream->show_task_filter, pid, true) && filter_find(stream->hide_task_filter, pid, false); } static bool kshark_show_event(struct kshark_data_stream *stream, int pid) { return filter_find(stream->show_event_filter, pid, true) && filter_find(stream->hide_event_filter, pid, false); } static bool kshark_show_cpu(struct kshark_data_stream *stream, int cpu) { return filter_find(stream->show_cpu_filter, cpu, true) && filter_find(stream->hide_cpu_filter, cpu, false); } static struct kshark_hash_id *get_filter(struct kshark_context *kshark_ctx, int sd, enum kshark_filter_type filter_id) { struct kshark_data_stream *stream; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return NULL; return kshark_get_filter(stream, filter_id); } /** * @brief Get an Id Filter. * * @param stream: Input location for a Trace data stream pointer. * @param filter_id: Identifier of the filter. */ struct kshark_hash_id * kshark_get_filter(struct kshark_data_stream *stream, enum kshark_filter_type filter_id) { switch (filter_id) { case KS_SHOW_CPU_FILTER: return stream->show_cpu_filter; case KS_HIDE_CPU_FILTER: return stream->hide_cpu_filter; case KS_SHOW_EVENT_FILTER: return stream->show_event_filter; case KS_HIDE_EVENT_FILTER: return stream->hide_event_filter; case KS_SHOW_TASK_FILTER: return stream->show_task_filter; case KS_HIDE_TASK_FILTER: return stream->hide_task_filter; default: return NULL; } } /** * @brief Add an Id value to the filter specified by "filter_id". * * @param kshark_ctx: Input location for the session context pointer. * @param sd: Data stream identifier. * @param filter_id: Identifier of the filter. * @param id: Id value to be added to the filter. */ void kshark_filter_add_id(struct kshark_context *kshark_ctx, int sd, int filter_id, int id) { struct kshark_hash_id *filter; filter = get_filter(kshark_ctx, sd, filter_id); if (filter) kshark_hash_id_add(filter, id); } /** * @brief Get an array containing all Ids associated with a given Id Filter. * * @param kshark_ctx: Input location for context pointer. * @param sd: Data stream identifier. * @param filter_id: Identifier of the filter. * @param n: Output location for the size of the returned array. * * @return The user is responsible for freeing the array. */ int *kshark_get_filter_ids(struct kshark_context *kshark_ctx, int sd, int filter_id, int *n) { struct kshark_hash_id *filter; filter = get_filter(kshark_ctx, sd, filter_id); if (filter) { if (n) *n = filter->count; return kshark_hash_ids(filter); } if (n) *n = 0; return NULL; } /** * @brief Clear (reset) the filter specified by "filter_id". * * @param kshark_ctx: Input location for the session context pointer. * @param sd: Data stream identifier. * @param filter_id: Identifier of the filter. */ void kshark_filter_clear(struct kshark_context *kshark_ctx, int sd, int filter_id) { struct kshark_hash_id *filter; filter = get_filter(kshark_ctx, sd, filter_id); if (filter) kshark_hash_id_clear(filter); } /** * @brief Check if a given Id filter is set. * * @param filter: Input location for the Id filster. * * @returns True if the Id filter is set, otherwise False. */ bool kshark_this_filter_is_set(struct kshark_hash_id *filter) { return filter && filter->count; } /** * @brief Check if an Id filter is set. * * @param kshark_ctx: Input location for the session context pointer. * @param sd: Data stream identifier. * * @returns True if at least one Id filter of the stream is set, otherwise * False. */ bool kshark_filter_is_set(struct kshark_context *kshark_ctx, int sd) { struct kshark_data_stream *stream; stream = get_stream_object(kshark_ctx, sd); if (!stream) return false; return kshark_this_filter_is_set(stream->show_task_filter) || kshark_this_filter_is_set(stream->hide_task_filter) || kshark_this_filter_is_set(stream->show_cpu_filter) || kshark_this_filter_is_set(stream->hide_cpu_filter) || kshark_this_filter_is_set(stream->show_event_filter) || kshark_this_filter_is_set(stream->hide_event_filter); } /** * @brief Apply filters to a given entry. * * @param kshark_ctx: Input location for the session context pointer. * @param stream: Input location for a Trace data stream pointer. * @param entry: Input location for entry. */ void kshark_apply_filters(struct kshark_context *kshark_ctx, struct kshark_data_stream *stream, struct kshark_entry *entry) { /* Apply event filtering. */ if (!kshark_show_event(stream, entry->event_id)) unset_event_filter_flag(kshark_ctx, entry); /* Apply CPU filtering. */ if (!kshark_show_cpu(stream, entry->cpu)) entry->visible &= ~kshark_ctx->filter_mask; /* Apply task filtering. */ if (!kshark_show_task(stream, entry->pid)) entry->visible &= ~kshark_ctx->filter_mask; } static void set_all_visible(uint16_t *v) { /* Keep the original value of the PLUGIN_UNTOUCHED bit flag. */ *v |= 0xFF & ~KS_PLUGIN_UNTOUCHED_MASK; } static void filter_entries(struct kshark_context *kshark_ctx, int sd, struct kshark_entry **data, size_t n_entries) { struct kshark_data_stream *stream = NULL; size_t i; /* Sanity checks before starting. */ if (sd >= 0) { /* We will filter particular Data stream. */ stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; if (kshark_is_tep(stream) && kshark_tep_filter_is_set(stream)) { /* The advanced filter is set. */ fprintf(stderr, "Failed to filter (sd = %i)!\n", sd); fprintf(stderr, "Reset the Advanced filter or reload the data.\n"); return; } if (!kshark_filter_is_set(kshark_ctx, sd) && !stream->filter_is_applied) { /* Nothing to be done. */ return; } } /* Apply only the Id filters. */ for (i = 0; i < n_entries; ++i) { if (sd >= 0) { /* * We only filter particular stream. Chack is the entry * belongs to this stream. */ if (data[i]->stream_id != sd) continue; } else { /* We filter all streams. */ stream = kshark_ctx->stream[data[i]->stream_id]; } /* Start with and entry which is visible everywhere. */ set_all_visible(&data[i]->visible); /* Apply Id filtering. */ kshark_apply_filters(kshark_ctx, stream, data[i]); stream->filter_is_applied = kshark_filter_is_set(kshark_ctx, sd)? true : false; } } /** * @brief This function loops over the array of entries specified by "data" * and "n_entries" and sets the "visible" fields of each entry from a * given Data stream according to the criteria provided by the filters * of the session's context. The field "filter_mask" of the session's * context is used to control the level of visibility/invisibility of * the entries which are filtered-out. * WARNING: Do not use this function if the advanced filter is set. * Applying the advanced filter requires access to prevent_record, * hence the data has to be reloaded using kshark_load_entries(). * * @param kshark_ctx: Input location for the session context pointer. * @param sd: Data stream identifier. * @param data: Input location for the trace data to be filtered. * @param n_entries: The size of the inputted data. */ void kshark_filter_stream_entries(struct kshark_context *kshark_ctx, int sd, struct kshark_entry **data, size_t n_entries) { if (sd >= 0) filter_entries(kshark_ctx, sd, data, n_entries); } /** * @brief This function loops over the array of entries specified by "data" * and "n_entries" and sets the "visible" fields of each entry from * all Data stream according to the criteria provided by the filters * of the session's context. The field "filter_mask" of the session's * context is used to control the level of visibility/invisibility of * the entries which are filtered-out. * WARNING: Do not use this function if the advanced filter is set. * Applying the advanced filter requires access to prevent_record, * hence the data has to be reloaded using kshark_load_data_entries(). * * @param kshark_ctx: Input location for the session context pointer. * @param data: Input location for the trace data to be filtered. * @param n_entries: The size of the inputted data. */ void kshark_filter_all_entries(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_entries) { filter_entries(kshark_ctx, -1, data, n_entries); } /** * @brief This function loops over the array of entries specified by "data" * and "n_entries" and resets the "visible" fields of each entry to * the default value of "0xFF" (visible everywhere). * * @param kshark_ctx: Input location for the session context pointer. * @param data: Input location for the trace data to be unfiltered. * @param n_entries: The size of the inputted data. */ void kshark_clear_all_filters(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_entries) { struct kshark_data_stream *stream; int *stream_ids, sd; size_t i; for (i = 0; i < n_entries; ++i) set_all_visible(&data[i]->visible); stream_ids = kshark_all_streams(kshark_ctx); for (sd = 0; sd < kshark_ctx->n_streams; sd++) { stream = kshark_get_data_stream(kshark_ctx, stream_ids[sd]); stream->filter_is_applied = false; } free(stream_ids); } /** * @brief Process all registered event-specific plugin actions. * * @param stream: Input location for a Trace data stream pointer. * @param record: Input location for the trace record. * @param entry: Output location for entry. */ void kshark_plugin_actions(struct kshark_data_stream *stream, void *record, struct kshark_entry *entry) { if (stream->event_handlers) { /* Execute all plugin-provided actions for this event (if any). */ struct kshark_event_proc_handler *evt_handler = stream->event_handlers; while ((evt_handler = kshark_find_event_handler(evt_handler, entry->event_id))) { evt_handler->event_func(stream, record, entry); evt_handler = evt_handler->next; entry->visible &= ~KS_PLUGIN_UNTOUCHED_MASK; } } } /** * @brief Time calibration of the timestamp of the entry. * * @param stream: Input location for a Trace data stream pointer. * @param entry: Output location for entry. */ void kshark_calib_entry(struct kshark_data_stream *stream, struct kshark_entry *entry) { if (stream->calib && stream->calib_array) { /* Calibrate the timestamp of the entry. */ stream->calib(&entry->ts, stream->calib_array); } } /** * @brief Post-process the content of the entry. This includes time calibration * and all registered event-specific plugin actions. * * @param stream: Input location for a Trace data stream pointer. * @param record: Input location for the trace record. * @param entry: Output location for entry. */ void kshark_postprocess_entry(struct kshark_data_stream *stream, void *record, struct kshark_entry *entry) { kshark_calib_entry(stream, entry); kshark_plugin_actions(stream, record, entry); } static inline void free_ptr(void *ptr) { if (ptr) free(*(void **)ptr); } /** * @brief Allocate data arrays (matrix columns) to be used to load the tracing * data into a data matrix form. * * @param n_rows: Number matrix rows to be allocated. Must be equal to the * number of trace records. * @param cpu_array: Output location for the CPU Id column. * @param pid_array: Output location for the PID column. * @param event_array: Output location for the Event Id column. * @param offset_array: Output location for the record offset column. * @param ts_array: Output location for the timestamp column. * * @returns True on success. Else false. */ bool kshark_data_matrix_alloc(size_t n_rows, int16_t **event_array, int16_t **cpu_array, int32_t **pid_array, int64_t **offset_array, int64_t **ts_array) { if (offset_array) { *offset_array = calloc(n_rows, sizeof(**offset_array)); if (!*offset_array) return false; } if (cpu_array) { *cpu_array = calloc(n_rows, sizeof(**cpu_array)); if (!*cpu_array) goto free_offset; } if (ts_array) { *ts_array = calloc(n_rows, sizeof(**ts_array)); if (!*ts_array) goto free_cpu; } if (pid_array) { *pid_array = calloc(n_rows, sizeof(**pid_array)); if (!*pid_array) goto free_ts; } if (event_array) { *event_array = calloc(n_rows, sizeof(**event_array)); if (!*event_array) goto free_pid; } return true; free_pid: free_ptr(pid_array); free_ts: free_ptr(ts_array); free_cpu: free_ptr(cpu_array); free_offset: free_ptr(offset_array); fprintf(stderr, "Failed to allocate memory during data loading.\n"); return false; } /** * @brief Convert the timestamp of the trace record (nanosecond precision) into * seconds and microseconds. * * @param time: Input location for the timestamp. * @param sec: Output location for the value of the seconds. * @param usec: Output location for the value of the microseconds. */ void kshark_convert_nano(uint64_t time, uint64_t *sec, uint64_t *usec) { uint64_t s; *sec = s = time / 1000000000ULL; *usec = (time - s * 1000000000ULL) / 1000; } /** * @brief Binary search inside a time-sorted array of kshark_entries. * * @param time: The value of time to search for. * @param data: Input location for the trace data. * @param l: Array index specifying the lower edge of the range to search in. * @param h: Array index specifying the upper edge of the range to search in. * * @returns On success, the first kshark_entry inside the range, having a * timestamp equal or bigger than "time". * If all entries inside the range have timestamps greater than "time" * the function returns BSEARCH_ALL_GREATER (negative value). * If all entries inside the range have timestamps smaller than "time" * the function returns BSEARCH_ALL_SMALLER (negative value). */ ssize_t kshark_find_entry_by_time(int64_t time, struct kshark_entry **data, size_t l, size_t h) { size_t mid; if (data[l]->ts > time) return BSEARCH_ALL_GREATER; if (data[h]->ts < time) return BSEARCH_ALL_SMALLER; /* * After executing the BSEARCH macro, "l" will be the index of the last * entry having timestamp < time and "h" will be the index of the first * entry having timestamp >= time. */ BSEARCH(h, l, data[mid]->ts < time); return h; } /** * @brief Simple Pid matching function to be user for data requests. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param sd: Data stream identifier. * @param pid: Matching condition value. * * @returns True if the Pid of the entry matches the value of "pid". * Else false. */ bool kshark_match_pid(__attribute__ ((unused)) struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *pid) { if (e->stream_id == sd && e->pid == *pid) return true; return false; } /** * @brief Simple Cpu matching function to be user for data requests. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param sd: Data stream identifier. * @param cpu: Matching condition value. * * @returns True if the Cpu of the entry matches the value of "cpu". * Else false. */ bool kshark_match_cpu(__attribute__ ((unused)) struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *cpu) { if (e->stream_id == sd && e->cpu == *cpu) return true; return false; } /** * @brief Simple event Id matching function to be user for data requests. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param sd: Data stream identifier. * @param event_id: Matching condition value. * * @returns True if the event Id of the entry matches the value of "event_id". * Else false. */ bool kshark_match_event_id(__attribute__ ((unused)) struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *event_id) { return e->stream_id == sd && e->event_id == *event_id; } /** * @brief Simple Event Id and PID matching function to be user for data requests. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param sd: Data stream identifier. * @param values: An array of matching condition value. * values[0] is the matches PID and values[1] is the matches event Id. * * @returns True if the event Id of the entry matches the values. * Else false. */ bool kshark_match_event_and_pid(__attribute__ ((unused)) struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *values) { return e->stream_id == sd && e->event_id == values[0] && e->pid == values[1]; } /** * @brief Simple Event Id and CPU matching function to be user for data requests. * * @param kshark_ctx: Input location for the session context pointer. * @param e: kshark_entry to be checked. * @param sd: Data stream identifier. * @param values: An array of matching condition value. * values[0] is the matches PID and values[1] is the matches event Id. * * @returns True if the event Id of the entry matches the values. * Else false. */ bool kshark_match_event_and_cpu(__attribute__ ((unused)) struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *values) { return e->stream_id == sd && e->event_id == values[0] && e->cpu == values[1]; } /** * @brief Create Data request. The request defines the properties of the * requested kshark_entry. * * @param first: Array index specifying the position inside the array from * where the search starts. * @param n: Number of array elements to search in. * @param cond: Matching condition function. * @param sd: Data stream identifier. * @param values: Matching condition values, used by the Matching condition * function. * @param vis_only: If true, a visible entry is requested. * @param vis_mask: If "vis_only" is true, use this mask to specify the level * of visibility of the requested entry. * * @returns Pointer to kshark_entry_request on success, or NULL on failure. * The user is responsible for freeing the returned * kshark_entry_request. */ struct kshark_entry_request * kshark_entry_request_alloc(size_t first, size_t n, matching_condition_func cond, int sd, int *values, bool vis_only, int vis_mask) { struct kshark_entry_request *req = malloc(sizeof(*req)); if (!req) { fprintf(stderr, "Failed to allocate memory for entry request.\n"); return NULL; } req->next = NULL; req->first = first; req->n = n; req->cond = cond; req->sd = sd; req->values = values; req->vis_only = vis_only; req->vis_mask = vis_mask; return req; } /** * @brief Free all Data requests in a given list. * @param req: Intput location for the Data request list. */ void kshark_free_entry_request(struct kshark_entry_request *req) { struct kshark_entry_request *last; while (req) { last = req; req = req->next; free(last); } } /** Dummy entry, used to indicate the existence of filtered entries. */ const struct kshark_entry dummy_entry = { .next = NULL, .visible = 0x00, .cpu = KS_FILTERED_BIN, .pid = KS_FILTERED_BIN, .event_id = -1, .offset = 0, .ts = 0 }; static const struct kshark_entry * get_entry(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index, ssize_t start, ssize_t end, int inc) { struct kshark_context *kshark_ctx = NULL; const struct kshark_entry *e = NULL; ssize_t i; if (index) *index = KS_EMPTY_BIN; if (!kshark_instance(&kshark_ctx)) return e; /* * We will do a sanity check in order to protect against infinite * loops. */ assert((inc > 0 && start < end) || (inc < 0 && start > end)); for (i = start; i != end; i += inc) { if (req->cond(kshark_ctx, data[i], req->sd, req->values)) { /* * Data satisfying the condition has been found. */ if (req->vis_only && !(data[i]->visible & req->vis_mask)) { /* This data entry has been filtered. */ e = &dummy_entry; } else { e = data[i]; break; } } } if (index) { if (e) *index = (e->cpu != KS_FILTERED_BIN)? i : KS_FILTERED_BIN; else *index = KS_EMPTY_BIN; } return e; } /** * @brief Search for an entry satisfying the requirements of a given Data * request. Start from the position provided by the request and go * searching in the direction of the increasing timestamps (front). * * @param req: Input location for Data request. * @param data: Input location for the trace data. * @param index: Optional output location for the index of the returned * entry inside the array. * * @returns Pointer to the first entry satisfying the matching conditionon * success, or NULL on failure. * In the special case when some entries, satisfying the Matching * condition function have been found, but all these entries have * been discarded because of the visibility criteria (filtered * entries), the function returns a pointer to a special * "Dummy entry". */ const struct kshark_entry * kshark_get_entry_front(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index) { ssize_t end = req->first + req->n; return get_entry(req, data, index, req->first, end, +1); } /** * @brief Search for an entry satisfying the requirements of a given Data * request. Start from the position provided by the request and go * searching in the direction of the decreasing timestamps (back). * * @param req: Input location for Data request. * @param data: Input location for the trace data. * @param index: Optional output location for the index of the returned * entry inside the array. * * @returns Pointer to the first entry satisfying the matching conditionon * success, or NULL on failure. * In the special case when some entries, satisfying the Matching * condition function have been found, but all these entries have * been discarded because of the visibility criteria (filtered * entries), the function returns a pointer to a special * "Dummy entry". */ const struct kshark_entry * kshark_get_entry_back(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index) { ssize_t end = req->first - req->n; if (end < 0) end = -1; return get_entry(req, data, index, req->first, end, -1); } static int compare_time(const void* a, const void* b) { const struct kshark_entry *entry_a, *entry_b; entry_a = *(const struct kshark_entry **) a; entry_b = *(const struct kshark_entry **) b; if (entry_a->ts > entry_b->ts) return 1; if (entry_a->ts < entry_b->ts) return -1; return 0; } static void kshark_data_qsort(struct kshark_entry **entries, size_t size) { qsort(entries, size, sizeof(struct kshark_entry *), compare_time); } /** * Add constant offset to the timestamp of the entry. To be used by the sream * object as a System clock calibration callback function. */ void kshark_offset_calib(int64_t *ts, int64_t *argv) { *ts += argv[0]; } /** * @brief Apply constant offset to the timestamps of all entries from a given * Data stream. * * @param kshark_ctx: Input location for the session context pointer. * @param entries: Input location for the trace data. * @param size: The size of the trace data. * @param sd: Data stream identifier. * @param offset: The constant offset to be added (in nanosecond). */ void kshark_set_clock_offset(struct kshark_context *kshark_ctx, struct kshark_entry **entries, size_t size, int sd, int64_t offset) { struct kshark_data_stream *stream; int64_t correction; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; if (!stream->calib_array) { stream->calib = kshark_offset_calib; stream->calib_array = calloc(1, sizeof(*stream->calib_array)); stream->calib_array_size = 1; } correction = offset - stream->calib_array[0]; stream->calib_array[0] = offset; for (size_t i = 0; i < size; ++i) if (entries[i]->stream_id == sd) entries[i]->ts += correction; kshark_data_qsort(entries, size); } static int first_in_time_entry(struct kshark_entry_data_set *buffer, size_t n_buffers, ssize_t *count) { int64_t t_min = INT64_MAX; int min = -1; size_t i; for (i = 0; i < n_buffers; ++i) { if (count[i] == buffer[i].n_rows) continue; if (t_min > buffer[i].data[count[i]]->ts) { t_min = buffer[i].data[count[i]]->ts; min = i; } } return min; } /** * @brief Merge trace data streams. * * @param buffers: Input location for the data-sets to be merged. * @param n_buffers: The number of the data-sets to be merged. * * @returns Merged and sorted in time trace data entries. The user is * responsible for freeing the elements of the outputted array. */ struct kshark_entry ** kshark_merge_data_entries(struct kshark_entry_data_set *buffers, size_t n_buffers) { struct kshark_entry **merged_data; ssize_t count[n_buffers]; size_t i, tot = 0; int i_first; if (n_buffers < 2) { fputs("kshark_merge_data_entries needs multipl data sets.\n", stderr); return NULL; } for (i = 0; i < n_buffers; ++i) { count[i] = 0; if (buffers[i].n_rows > 0) tot += buffers[i].n_rows; } merged_data = calloc(tot, sizeof(*merged_data)); if (!merged_data) { fputs("Failed to allocate memory for mergeing data entries.\n", stderr); return NULL; } for (i = 0; i < tot; ++i) { i_first = first_in_time_entry(buffers, n_buffers, count); assert(i_first >= 0); merged_data[i] = buffers[i_first].data[count[i_first]]; ++count[i_first]; } return merged_data; } static ssize_t load_all_entries(struct kshark_context *kshark_ctx, struct kshark_entry **loaded_rows, ssize_t n_loaded, int sd_first_new, int n_streams, struct kshark_entry ***data_rows) { int i, j = 0, n_data_sets; ssize_t data_size = 0; if (n_streams <= 0 || sd_first_new < 0) return data_size; n_data_sets = n_streams - sd_first_new; if (loaded_rows && n_loaded > 0) ++n_data_sets; struct kshark_entry_data_set buffers[n_data_sets]; memset(buffers, 0, sizeof(buffers)); if (loaded_rows && n_loaded > 0) { /* Add the data that is already loaded. */ data_size = buffers[n_data_sets - 1].n_rows = n_loaded; buffers[n_data_sets - 1].data = loaded_rows; } /* Add the data of the new streams. */ for (i = sd_first_new; i < n_streams; ++i) { buffers[j].data = NULL; buffers[j].n_rows = kshark_load_entries(kshark_ctx, i, &buffers[j].data); if (buffers[j].n_rows < 0) { /* Loading failed. */ data_size = buffers[j].n_rows; goto error; } data_size += buffers[j++].n_rows; } if (n_data_sets == 1) { *data_rows = buffers[0].data; } else { /* Merge all streams. */ *data_rows = kshark_merge_data_entries(buffers, n_data_sets); } error: for (i = 1; i < n_data_sets; ++i) free(buffers[i].data); return data_size; } /** * @brief Load the content of the all opened data file into an array of * kshark_entries. * If one or more filters are set, the "visible" fields of each entry * is updated according to the criteria provided by the filters. The * field "filter_mask" of the session's context is used to control the * level of visibility/invisibility of the filtered entries. * * @param kshark_ctx: Input location for context pointer. * @param data_rows: Output location for the trace data. The user is * responsible for freeing the elements of the outputted * array. * * @returns The size of the outputted data in the case of success, or a * negative error code on failure. */ ssize_t kshark_load_all_entries(struct kshark_context *kshark_ctx, struct kshark_entry ***data_rows) { return load_all_entries(kshark_ctx, NULL, 0, 0, kshark_ctx->n_streams, data_rows); } /** * @brief Append the content of the all opened data file into an array of * kshark_entries. * If one or more filters are set, the "visible" fields of each entry * is updated according to the criteria provided by the filters. The * field "filter_mask" of the session's context is used to control the * level of visibility/invisibility of the filtered entries. * * @param kshark_ctx: Input location for context pointer. * @param prior_data: Input location for the already loaded trace data. * @param n_prior_rows: The size of the already loaded trace data. * @param sd_first_new: Data stream identifier of the first data stream to be * appended. * @param merged_data: Output location for the trace data. The user is * responsible for freeing the elements of the outputted * array. * @returns The size of the outputted data in the case of success, or a * negative error code on failure. */ ssize_t kshark_append_all_entries(struct kshark_context *kshark_ctx, struct kshark_entry **prior_data, ssize_t n_prior_rows, int sd_first_new, struct kshark_entry ***merged_data) { return load_all_entries(kshark_ctx, prior_data, n_prior_rows, sd_first_new, kshark_ctx->n_streams, merged_data); } static int first_in_time_row(struct kshark_matrix_data_set *buffers, int n_buffers, ssize_t *count) { int64_t t_min = INT64_MAX; int i, min = -1; for (i = 0; i < n_buffers; ++i) { if (count[i] == buffers[i].n_rows) continue; if (t_min > buffers[i].ts_array[count[i]]) { t_min = buffers[i].ts_array[count[i]]; min = i; } } return min; } /** * @brief Merge trace data streams. * * @param buffers: Input location for the data-sets to be merged. * @param n_buffers: The number of the data-sets to be merged. * * @returns Merged and sorted in time trace data matrix. The user is * responsible for freeing the columns (arrays) of the outputted * matrix. */ struct kshark_matrix_data_set kshark_merge_data_matrices(struct kshark_matrix_data_set *buffers, size_t n_buffers) { struct kshark_matrix_data_set merged_data; ssize_t count[n_buffers]; size_t i, tot = 0; int i_first; bool status; merged_data.n_rows = -1; if (n_buffers < 2) { fputs("kshark_merge_data_matrices needs multipl data sets.\n", stderr); goto end; } for (i = 0; i < n_buffers; ++i) { count[i] = 0; if (buffers[i].n_rows > 0) tot += buffers[i].n_rows; } status = kshark_data_matrix_alloc(tot, &merged_data.event_array, &merged_data.cpu_array, &merged_data.pid_array, &merged_data.offset_array, &merged_data.ts_array); if (!status) { fputs("Failed to allocate memory for mergeing data matrices.\n", stderr); goto end; } merged_data.n_rows = tot; for (i = 0; i < tot; ++i) { i_first = first_in_time_row(buffers, n_buffers, count); assert(i_first >= 0); merged_data.cpu_array[i] = buffers[i_first].cpu_array[count[i_first]]; merged_data.pid_array[i] = buffers[i_first].pid_array[count[i_first]]; merged_data.event_array[i] = buffers[i_first].event_array[count[i_first]]; merged_data.offset_array[i] = buffers[i_first].offset_array[count[i_first]]; merged_data.ts_array[i] = buffers[i_first].ts_array[count[i_first]]; ++count[i_first]; } end: return merged_data; } /** @brief Allocate memory for kshark_data_container. */ struct kshark_data_container *kshark_init_data_container() { struct kshark_data_container *container; container = calloc(1, sizeof(*container)); if (!container) goto fail; container->data = calloc(KS_CONTAINER_DEFAULT_SIZE, sizeof(*container->data)); if (!container->data) goto fail; container->capacity = KS_CONTAINER_DEFAULT_SIZE; container->sorted = false; return container; fail: fprintf(stderr, "Failed to allocate memory for data container.\n"); kshark_free_data_container(container); return NULL; } /** * @brief Free the memory allocated for a kshark_data_container * @param container: Input location for the kshark_data_container object. */ void kshark_free_data_container(struct kshark_data_container *container) { if (!container) return; for (ssize_t i = 0; i < container->size; ++i) free(container->data[i]); free(container->data); free(container); } /** * @brief Append data field value to a kshark_data_container * @param container: Input location for the kshark_data_container object. * @param entry: The entry that needs addition data field value. * @param field: The value of data field to be added. * * @returns The size of the container after the addition. */ ssize_t kshark_data_container_append(struct kshark_data_container *container, struct kshark_entry *entry, int64_t field) { struct kshark_data_field_int64 *data_field; if (container->capacity == container->size) { if (!KS_DOUBLE_SIZE(container->data, container->capacity)) return -ENOMEM; } data_field = malloc(sizeof(*data_field)); data_field->entry = entry; data_field->field = field; container->data[container->size++] = data_field; return container->size; } static int compare_time_dc(const void* a, const void* b) { const struct kshark_data_field_int64 *field_a, *field_b; field_a = *(const struct kshark_data_field_int64 **) a; field_b = *(const struct kshark_data_field_int64 **) b; if (field_a->entry->ts > field_b->entry->ts) return 1; if (field_a->entry->ts < field_b->entry->ts) return -1; return 0; } /** * @brief Sort in time the records in kshark_data_container. The container is * resized in order to free the unused memory capacity. * * @param container: Input location for the kshark_data_container object. */ void kshark_data_container_sort(struct kshark_data_container *container) { struct kshark_data_field_int64 **data_tmp; qsort(container->data, container->size, sizeof(struct kshark_data_field_int64 *), compare_time_dc); container->sorted = true; data_tmp = realloc(container->data, container->size * sizeof(*container->data)); if (!data_tmp) return; container->data = data_tmp; container->capacity = container->size; } /** * @brief Binary search inside a time-sorted array of kshark_data_field_int64. * * @param time: The value of time to search for. * @param data: Input location for the data. * @param l: Array index specifying the lower edge of the range to search in. * @param h: Array index specifying the upper edge of the range to search in. * * @returns On success, the index of the first kshark_data_field_int64 inside * the range, having a timestamp equal or bigger than "time". * If all fields inside the range have timestamps greater than "time" * the function returns BSEARCH_ALL_GREATER (negative value). * If all fields inside the range have timestamps smaller than "time" * the function returns BSEARCH_ALL_SMALLER (negative value). */ ssize_t kshark_find_entry_field_by_time(int64_t time, struct kshark_data_field_int64 **data, size_t l, size_t h) { size_t mid; if (data[l]->entry->ts > time) return BSEARCH_ALL_GREATER; if (data[h]->entry->ts < time) return BSEARCH_ALL_SMALLER; /* * After executing the BSEARCH macro, "l" will be the index of the last * entry having timestamp < time and "h" will be the index of the first * entry having timestamp >= time. */ BSEARCH(h, l, data[mid]->entry->ts < time); return h; } kernel-shark-kernelshark-v2.4.0/src/libkshark.h000066400000000000000000001013201477354127100215220ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file libkshark.h * @brief API for processing of tracing data. */ #ifndef _LIB_KSHARK_H #define _LIB_KSHARK_H // C #include #include #include #include // Json-C #include #ifdef __cplusplus extern "C" { #endif // KernelShark #include "libkshark-plugin.h" /** * Kernel Shark entry contains all information from one trace record needed * in order to visualize the time-series of trace records. The part of the * data which is not directly required for the visualization (latency, record * info etc.) is available on-demand via the offset into the trace file. */ struct kshark_entry { /** Pointer to the next (in time) kshark_entry on the same CPU core. */ struct kshark_entry *next; /* MUST BE FIRST ENTRY */ /** * A bit mask controlling the visibility of the entry. A value of OxFF * would mean that the entry is visible everywhere. Use * kshark_filter_masks to check the level of visibility/invisibility * of the entry. */ uint16_t visible; /** Data stream identifier. */ int16_t stream_id; /** Unique Id of the trace event type. */ int16_t event_id; /** The CPU core of the record. */ int16_t cpu; /** The PID of the task the record was generated. */ int32_t pid; /** The offset into the trace file, used to find the record. */ int64_t offset; /** * The time of the record in nano seconds. The value is taken from * the timestamps within the trace data file, which are architecture * dependent. The time usually is the timestamp from when the system * started. */ int64_t ts; }; /** Size of the hash table of PIDs in terms of bits being used by the key. */ #define KS_TASK_HASH_NBITS 16 /** Size of the hash table of Ids in terms of bits being used by the key. */ #define KS_FILTER_HASH_NBITS 8 /** A bucket for the hash table of integer Id numbers (kshark_hash_id). */ struct kshark_hash_id_item { /** Pointer to the Id in this bucket. */ struct kshark_hash_id_item *next; /** The Id value. */ int id; }; /** * Hash table of integer Id numbers. To be used for fast filter of trace * entries. */ struct kshark_hash_id { /** Array of buckets. */ struct kshark_hash_id_item **hash; /** The number of Ids in the table. */ size_t count; /** * The number of bits used by the hashing function. * Note that the number of buckets in the table if given by * 1 << n_bits. */ size_t n_bits; }; bool kshark_hash_id_find(struct kshark_hash_id *hash, int id); int kshark_hash_id_add(struct kshark_hash_id *hash, int id); void kshark_hash_id_clear(struct kshark_hash_id *hash); struct kshark_hash_id *kshark_hash_id_alloc(size_t n_bits); void kshark_hash_id_free(struct kshark_hash_id *hash); int *kshark_hash_ids(struct kshark_hash_id *hash); /* Quiet warnings over documenting simple structures */ //! @cond Doxygen_Suppress static const char top_name[] = { 0x1b, 0x00 }; // Non printable character //! @endcond /** * Non printable character used for the name in the case when the name has to * be ignored. */ #define KS_UNNAMED (char *) &top_name /** * Timestamp calibration function type. To be user for system clock * calibration. */ typedef void (*time_calib_func) (int64_t *, int64_t *); struct kshark_data_stream; /** A function type to be used by the method interface of the data stream. */ typedef char *(*stream_get_str_func) (struct kshark_data_stream *, const struct kshark_entry *); /** A function type to be used by the method interface of the data stream. */ typedef int (*stream_get_int_func) (struct kshark_data_stream *, const struct kshark_entry *); /** A function type to be used by the method interface of the data stream. */ typedef int (*stream_find_id_func) (struct kshark_data_stream *, const char *); /** A function type to be used by the method interface of the data stream. */ typedef int *(*stream_get_ids_func) (struct kshark_data_stream *); /** A function type to be used by the method interface of the data stream. */ typedef int (*stream_get_names_func) (struct kshark_data_stream *, const struct kshark_entry *, char ***); /** Event field format identifier. */ typedef enum kshark_event_field_format { /** A field of unknown type. */ KS_INVALID_FIELD, /** Integer number */ KS_INTEGER_FIELD, /** Floating-point number */ KS_FLOAT_FIELD } kshark_event_field_format; /** A function type to be used by the method interface of the data stream. */ typedef kshark_event_field_format (*stream_event_field_type) (struct kshark_data_stream *, const struct kshark_entry *, const char *); /** A function type to be used by the method interface of the data stream. */ typedef int (*stream_read_event_field) (struct kshark_data_stream *, const struct kshark_entry *, const char *, int64_t *); /** A function type to be used by the method interface of the data stream. */ typedef int (*stream_read_record_field) (struct kshark_data_stream *, void *, const char *, int64_t *); struct kshark_context; /** A function type to be used by the method interface of the data stream. */ typedef ssize_t (*load_entries_func) (struct kshark_data_stream *, struct kshark_context *, struct kshark_entry ***); /** A function type to be used by the method interface of the data stream. */ typedef ssize_t (*load_matrix_func) (struct kshark_data_stream *, struct kshark_context *, int16_t **event_array, int16_t **cpu_array, int32_t **pid_array, int64_t **offset_array, int64_t **ts_array); /** Data interface identifier. */ typedef enum kshark_data_interface_id { /** An interface with unknown type. */ KS_INVALID_INTERFACE, /** Generic interface suitable for Ftrace data. */ KS_GENERIC_DATA_INTERFACE, } kshark_data_interface_id; /** * Structure representing the interface of methods used to operate over * the data from a given stream. */ struct kshark_generic_stream_interface { /** Interface version identifier. */ kshark_data_interface_id type; /* MUST BE FIRST ENTRY. */ /** Method used to retrieve the Process Id of the entry. */ stream_get_int_func get_pid; /** Method used to retrieve the Event Id of the entry. */ stream_get_int_func get_event_id; /** Method used to retrieve the Event name of the entry. */ stream_get_str_func get_event_name; /** Method used to retrieve the Task name of the entry. */ stream_get_str_func get_task; /** Method used to retrieve the Info string of the entry. */ stream_get_str_func get_info; /** * Method used to retrieve an unspecified auxiliary info of the trace * record. */ stream_get_str_func aux_info; /** Method used to retrieve Id of the Event from its name. */ stream_find_id_func find_event_id; /** Method used to retrieve the array of Ids of all Events. */ stream_get_ids_func get_all_event_ids; /** Method used to dump the entry's content to string. */ stream_get_str_func dump_entry; /** * Method used to retrieve the array of all field names of a given * event. */ stream_get_names_func get_all_event_field_names; /** Method used to access the type of an event's data field. */ stream_event_field_type get_event_field_type; /** Method used to access the value of an event's data field. */ stream_read_event_field read_event_field_int64; /** Method used to access the value of an event's data field. */ stream_read_record_field read_record_field_int64; /** Method used to load the data in the form of entries. */ load_entries_func load_entries; /** Method used to load the data in matrix form. */ load_matrix_func load_matrix; /** Generic data handle. */ void *handle; }; /** Data format identifier string indicating invalid data. */ #define KS_INVALID_DATA "invalid data" /** Structure representing a stream of trace data. */ struct kshark_data_stream { /** Data stream identifier. */ int16_t stream_id; /** The number of CPUs presented in this data stream. */ int n_cpus; /** Hash table of Idle CPUs. */ struct kshark_hash_id *idle_cpus; /** * The number of distinct event types presented in this data stream. */ int n_events; /** The Process Id of the Idle task. */ int idle_pid; /** Trace data file pathname. */ char *file; /** Stream name. */ char *name; /** Hash table of task PIDs. */ struct kshark_hash_id *tasks; /** A mutex, used to protect the access to the input file. */ pthread_mutex_t input_mutex; /** Hash of tasks to filter on. */ struct kshark_hash_id *show_task_filter; /** Hash of tasks to not display. */ struct kshark_hash_id *hide_task_filter; /** Hash of events to filter on. */ struct kshark_hash_id *show_event_filter; /** Hash of events to not display. */ struct kshark_hash_id *hide_event_filter; /** Hash of CPUs to filter on. */ struct kshark_hash_id *show_cpu_filter; /** Hash of CPUs to not display. */ struct kshark_hash_id *hide_cpu_filter; /** * Flag showing if some entries are filtered out (marked as invisible). */ bool filter_is_applied; /** The type of the data. */ char data_format[KS_DATA_FORMAT_SIZE]; /** List of Plugin interfaces. */ struct kshark_dpi_list *plugins; /** The number of plugins registered for this stream.*/ int n_plugins; /** System clock calibration function. */ time_calib_func calib; /** An array of time calibration constants. */ int64_t *calib_array; /** The size of the array of time calibration constants. */ size_t calib_array_size; /** List of Plugin's Event handlers. */ struct kshark_event_proc_handler *event_handlers; /** List of Plugin's Draw handlers. */ struct kshark_draw_handler *draw_handlers; /** * The interface of methods used to operate over the data from a given * stream. */ void *interface; }; static inline char *kshark_set_data_format(char *dest_format, const char *src_format) { return strncpy(dest_format, src_format, KS_DATA_FORMAT_SIZE - 1); } /** Hard-coded default number of data streams available at initialization. */ #define KS_DEFAULT_NUM_STREAMS 256 /** * Structure representing the parameters of the stream descriptor array owned * by the kshark session. */ struct kshark_stream_array_descriptor { /** The identifier of the Data stream added. */ int max_stream_id; /** The the next free Data stream identifier (index). */ int next_free_stream_id; /** The capacity of the array of stream objects (pointers). */ int array_size; }; /** Structure representing a kshark session. */ struct kshark_context { /** Array of data stream descriptors. */ struct kshark_data_stream **stream; /** The number of data streams. */ int n_streams; /** Parameters of the stream descriptor array. */ struct kshark_stream_array_descriptor stream_info; /** * Bit mask, controlling the visibility of the entries after filtering. * If given bit is set here, all entries which are filtered-out will * have this bit unset in their "visible" fields. */ uint8_t filter_mask; /** List of Data collections. */ struct kshark_entry_collection *collections; /** List of data readout interfaces. */ struct kshark_dri_list *inputs; /** The number of readout interfaces. */ int n_inputs; /** List of Plugins. */ struct kshark_plugin_list *plugins; /** The number of plugins. */ int n_plugins; }; bool kshark_instance(struct kshark_context **kshark_ctx); int kshark_open(struct kshark_context *kshark_ctx, const char *file); int kshark_stream_open(struct kshark_data_stream *stream, const char *file); int kshark_add_stream(struct kshark_context *kshark_ctx); int kshark_remove_stream(struct kshark_context *kshark_ctx, int sd); struct kshark_data_stream * kshark_get_data_stream(struct kshark_context *kshark_ctx, int sd); struct kshark_data_stream * kshark_get_stream_from_entry(const struct kshark_entry *entry); int *kshark_all_streams(struct kshark_context *kshark_ctx); ssize_t kshark_get_task_pids(struct kshark_context *kshark_ctx, int sd, int **pids); int kshark_close(struct kshark_context *kshark_ctx, int sd); void kshark_close_all(struct kshark_context *kshark_ctx); void kshark_free(struct kshark_context *kshark_ctx); char *kshark_comm_from_pid(int sd, int pid); char *kshark_event_from_id(int sd, int event_id); void kshark_convert_nano(uint64_t time, uint64_t *sec, uint64_t *usec); char* kshark_dump_entry(const struct kshark_entry *entry); void kshark_print_entry(const struct kshark_entry *entry); int kshark_get_pid(const struct kshark_entry *entry); int kshark_get_event_id(const struct kshark_entry *entry); int *kshark_get_all_event_ids(struct kshark_data_stream *stream); int kshark_find_event_id(struct kshark_data_stream *stream, const char *event_name); char *kshark_get_event_name(const struct kshark_entry *entry); char *kshark_get_task(const struct kshark_entry *entry); char *kshark_get_info(const struct kshark_entry *entry); char *kshark_get_aux_info(const struct kshark_entry *entry); kshark_event_field_format kshark_get_event_field_type(const struct kshark_entry *entry, const char *field); int kshark_get_all_event_field_names(const struct kshark_entry *entry, char ***field); int kshark_read_record_field_int(struct kshark_data_stream *stream, void *rec, const char *field, int64_t *val); int kshark_read_event_field_int(const struct kshark_entry *entry, const char* field, int64_t *val); ssize_t kshark_load_entries(struct kshark_context *kshark_ctx, int sd, struct kshark_entry ***data_rows); ssize_t kshark_load_matrix(struct kshark_context *kshark_ctx, int sd, int16_t **event_array, int16_t **cpu_array, int32_t **pid_array, int64_t **offset_array, int64_t **ts_array); /** Bit masks used to control the visibility of the entry after filtering. */ enum kshark_filter_masks { /** * Use this mask to check the visibility of the entry in the text * view. */ KS_TEXT_VIEW_FILTER_MASK = 1 << 0, /** * Use this mask to check the visibility of the entry in the graph * view. */ KS_GRAPH_VIEW_FILTER_MASK = 1 << 1, /** Special mask used whene filtering events. */ KS_EVENT_VIEW_FILTER_MASK = 1 << 2, /* The next 4 bits are reserved for more KS_X_VIEW_FILTER_MASKs. */ /** * Use this mask to check if the content of the entry has been accessed * by a plugin-defined function. */ KS_PLUGIN_UNTOUCHED_MASK = 1 << 7 }; /** Filter type identifier. */ enum kshark_filter_type { /** Dummy filter identifier reserved for future use. */ KS_NO_FILTER, /** * Identifier of the filter, used to specified the events to be shown. */ KS_SHOW_EVENT_FILTER, /** * Identifier of the filter, used to specified the events to be * filtered-out. */ KS_HIDE_EVENT_FILTER, /** * Identifier of the filter, used to specified the tasks to be shown. */ KS_SHOW_TASK_FILTER, /** * Identifier of the filter, used to specified the tasks to be * filtered-out. */ KS_HIDE_TASK_FILTER, /** * Identifier of the filter, used to specified the CPUs to be shown. */ KS_SHOW_CPU_FILTER, /** * Identifier of the filter, used to specified the CPUs to be * filtered-out. */ KS_HIDE_CPU_FILTER, }; struct kshark_hash_id * kshark_get_filter(struct kshark_data_stream *stream, enum kshark_filter_type filter_id); void kshark_filter_add_id(struct kshark_context *kshark_ctx, int sd, int filter_id, int id); int *kshark_get_filter_ids(struct kshark_context *kshark_ctx, int sd, int filter_id, int *n); void kshark_filter_clear(struct kshark_context *kshark_ctx, int sd, int filter_id); bool kshark_this_filter_is_set(struct kshark_hash_id *filter); bool kshark_filter_is_set(struct kshark_context *kshark_ctx, int sd); static inline void unset_event_filter_flag(struct kshark_context *kshark_ctx, struct kshark_entry *e) { /* * All entries, filtered-out by the event filters, will be treated * differently, when visualized. Because of this, ignore the value * of the GRAPH_VIEW flag provided by the user via * stream->filter_mask. The value of the EVENT_VIEW flag in * stream->filter_mask will be used instead. */ int event_mask = kshark_ctx->filter_mask & ~KS_GRAPH_VIEW_FILTER_MASK; e->visible &= ~event_mask; } void kshark_apply_filters(struct kshark_context *kshark_ctx, struct kshark_data_stream *stream, struct kshark_entry *entry); void kshark_filter_stream_entries(struct kshark_context *kshark_ctx, int sd, struct kshark_entry **data, size_t n_entries); void kshark_filter_all_entries(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_entries); void kshark_clear_all_filters(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_entries); void kshark_plugin_actions(struct kshark_data_stream *stream, void *record, struct kshark_entry *entry); void kshark_calib_entry(struct kshark_data_stream *stream, struct kshark_entry *entry); void kshark_postprocess_entry(struct kshark_data_stream *stream, void *record, struct kshark_entry *entry); /** Search failed identifiers. */ enum kshark_search_failed { /** All entries have greater timestamps. */ BSEARCH_ALL_GREATER = -1, /** All entries have smaller timestamps. */ BSEARCH_ALL_SMALLER = -2, }; /** General purpose Binary search macro. */ #define BSEARCH(h, l, cond) \ ({ \ while (h - l > 1) { \ mid = (l + h) / 2; \ if (cond) \ l = mid; \ else \ h = mid; \ } \ }) ssize_t kshark_find_entry_by_time(int64_t time, struct kshark_entry **data_rows, size_t l, size_t h); bool kshark_match_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *pid); bool kshark_match_cpu(struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *cpu); bool kshark_match_event_id(struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *event_id); bool kshark_match_event_and_pid(struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *values); bool kshark_match_event_and_cpu(struct kshark_context *kshark_ctx, struct kshark_entry *e, int sd, int *values); /** * Empty bin identifier. * KS_EMPTY_BIN is used to reset entire arrays to empty with memset(), thus it * must be -1 for that to work. */ #define KS_EMPTY_BIN -1 /** Filtered bin identifier. */ #define KS_FILTERED_BIN -2 /** Overflow Event identifier. */ #define KS_EVENT_OVERFLOW (-EOVERFLOW) /** Matching condition function type. To be user for data requests */ typedef bool (matching_condition_func)(struct kshark_context*, struct kshark_entry*, int, int*); /** * Data request structure, defining the properties of the required * kshark_entry. */ struct kshark_entry_request { /** Pointer to the next Data request. */ struct kshark_entry_request *next; /** * Array index specifying the position inside the array from where * the search starts. */ size_t first; /** Number of array elements to search in. */ size_t n; /** Matching condition function. */ matching_condition_func *cond; /** Data stream identifier. */ int sd; /** * Matching condition value, used by the Matching condition function. */ int *values; /** If true, a visible entry is requested. */ bool vis_only; /** * If "vis_only" is true, use this mask to specify the level of * visibility of the requested entry. */ uint8_t vis_mask; }; struct kshark_entry_request * kshark_entry_request_alloc(size_t first, size_t n, matching_condition_func cond, int sd, int *values, bool vis_only, int vis_mask); void kshark_free_entry_request(struct kshark_entry_request *req); const struct kshark_entry * kshark_get_entry_front(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index); const struct kshark_entry * kshark_get_entry_back(const struct kshark_entry_request *req, struct kshark_entry **data, ssize_t *index); /** * Data collections are used to optimize the search for an entry having an * abstract property, defined by a Matching condition function and an array of * values. When a collection is processed, the data which is relevant for the * collection is enclosed in "Data intervals", defined by pairs of "Resume" and * "Break" points. It is guaranteed that the data outside of the intervals * contains no entries satisfying the abstract matching condition. However, the * intervals may (will) contain data that do not satisfy the matching condition. * Once defined, the Data collection can be used when searching for an entry * having the same (ore related) abstract property. The collection allows to * ignore the irrelevant data, thus it eliminates the linear worst-case time * complexity of the search. */ struct kshark_entry_collection { /** Pointer to the next Data collection. */ struct kshark_entry_collection *next; /** Matching condition function, used to define the collections. */ matching_condition_func *cond; /** Data stream identifier. */ int stream_id; /** * Array of matching condition values, used by the Matching condition * finction to define the collection. */ int *values; /** The suze of the array of matching condition values. */ size_t n_val; /** * Array of indexes defining the beginning of each individual data * interval. */ size_t *resume_points; /** * Array of indexes defining the end of each individual data interval. */ size_t *break_points; /** Number of data intervals in this collection. */ size_t size; }; struct kshark_entry_collection * kshark_add_collection_to_list(struct kshark_context *kshark_ctx, struct kshark_entry_collection **col_list, struct kshark_entry **data, size_t n_rows, matching_condition_func cond, int sd, int *values, size_t n_val, size_t margin); struct kshark_entry_collection * kshark_register_data_collection(struct kshark_context *kshark_ctx, struct kshark_entry **data, size_t n_rows, matching_condition_func cond, int sd, int *values, size_t n_val, size_t margin); void kshark_unregister_data_collection(struct kshark_entry_collection **col, matching_condition_func cond, int sd, int *values, size_t n_val); struct kshark_entry_collection * kshark_find_data_collection(struct kshark_entry_collection *col, matching_condition_func cond, int sd, int *values, size_t n_val); void kshark_reset_data_collection(struct kshark_entry_collection *col); void kshark_unregister_stream_collections(struct kshark_entry_collection **col, int sd); void kshark_free_collection_list(struct kshark_entry_collection *col); const struct kshark_entry * kshark_get_collection_entry_front(struct kshark_entry_request *req, struct kshark_entry **data, const struct kshark_entry_collection *col, ssize_t *index); const struct kshark_entry * kshark_get_collection_entry_back(struct kshark_entry_request *req, struct kshark_entry **data, const struct kshark_entry_collection *col, ssize_t *index); /** Structure representing a KernelShark Configuration document. */ struct kshark_config_doc { /** Document format identifier. */ int format; /** Configuration document instance. */ void *conf_doc; }; /** Configuration format identifiers. */ enum kshark_config_formats { /** Unformatted Configuration document identifier. */ KS_CONFIG_AUTO = 0, /** * String Configuration document identifier. The String format is * meant to be used only by kshark_config_doc_add() and * kshark_config_doc_get(), when adding/getting simple string fields. */ KS_CONFIG_STRING, /** Json Configuration document identifier. */ KS_CONFIG_JSON, }; /** * Field name for the Configuration document describing the Hide Event filter. */ #define KS_HIDE_EVENT_FILTER_NAME "hide event filter" /** * Field name for the Configuration document describing the Show Event filter. */ #define KS_SHOW_EVENT_FILTER_NAME "show event filter" /** * Field name for the Configuration document describing the Hide Task filter. */ #define KS_HIDE_TASK_FILTER_NAME "hide task filter" /** * Field name for the Configuration document describing the Show Task filter. */ #define KS_SHOW_TASK_FILTER_NAME "show task filter" /** * Field name for the Configuration document describing the Hide Task filter. */ #define KS_HIDE_CPU_FILTER_NAME "hide cpu filter" /** * Field name for the Configuration document describing the Show Task filter. */ #define KS_SHOW_CPU_FILTER_NAME "show cpu filter" /** * Field name for the Configuration document describing the Advanced event * filter. */ #define KS_ADV_EVENT_FILTER_NAME "adv event filter" /** * Field name for the Configuration document describing user-specified filter * mask. */ #define KS_USER_FILTER_MASK_NAME "filter mask" /** * Field name for the Configuration document describing the state of the Vis. * model. */ #define KS_HISTO_NAME "vis. model" /** * Field name for the Configuration document describing the currently loaded * trace data file. */ #define KS_DATA_SOURCE_NAME "trace data" /** * Field name for the Configuration document describing all currently loaded * data streams. */ #define KS_DSTREAMS_NAME "data streams" struct kshark_config_doc * kshark_config_alloc(enum kshark_config_formats); struct kshark_config_doc * kshark_config_new(const char *type, enum kshark_config_formats); void kshark_free_config_doc(struct kshark_config_doc *conf); struct kshark_config_doc * kshark_record_config_new(enum kshark_config_formats); struct kshark_config_doc * kshark_stream_config_new(enum kshark_config_formats); struct kshark_config_doc * kshark_filter_config_new(enum kshark_config_formats); struct kshark_config_doc * kshark_session_config_new(enum kshark_config_formats format); struct kshark_config_doc *kshark_string_config_alloc(void); bool kshark_type_check(struct kshark_config_doc *conf, const char *type); bool kshark_config_doc_add(struct kshark_config_doc *conf, const char *key, struct kshark_config_doc *val); bool kshark_config_doc_get(struct kshark_config_doc *conf, const char *key, struct kshark_config_doc *val); struct kshark_trace_histo; struct kshark_config_doc * kshark_export_trace_file(const char *file, const char *name, enum kshark_config_formats format); int kshark_import_trace_file(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); struct kshark_config_doc * kshark_export_plugin_file(struct kshark_plugin_list *plugin, enum kshark_config_formats format); struct kshark_config_doc * kshark_export_all_plugins(struct kshark_context *kshark_ctx, enum kshark_config_formats format); bool kshark_import_all_plugins(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); struct kshark_config_doc * kshark_export_stream_plugins(struct kshark_data_stream *stream, enum kshark_config_formats format); bool kshark_import_stream_plugins(struct kshark_context *kshark_ctx, struct kshark_data_stream *stream, struct kshark_config_doc *conf); struct kshark_config_doc * kshark_export_model(struct kshark_trace_histo *histo, enum kshark_config_formats format); bool kshark_import_model(struct kshark_trace_histo *histo, struct kshark_config_doc *conf); bool kshark_export_adv_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc **conf); bool kshark_import_adv_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf); bool kshark_export_event_filter(struct kshark_data_stream *stream, enum kshark_filter_type filter_type, const char *filter_name, struct kshark_config_doc *conf); int kshark_import_event_filter(struct kshark_data_stream *stream, enum kshark_filter_type filter_type, const char *filter_name, struct kshark_config_doc *conf); bool kshark_export_user_mask(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf); bool kshark_import_user_mask(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); bool kshark_export_filter_array(struct kshark_hash_id *filter, const char *filter_name, struct kshark_config_doc *conf); bool kshark_import_filter_array(struct kshark_hash_id *filter, const char *filter_name, struct kshark_config_doc *conf); bool kshark_export_all_event_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc **conf); bool kshark_export_all_task_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc **conf); bool kshark_export_all_cpu_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc **conf); struct kshark_config_doc * kshark_export_all_filters(struct kshark_context *kshark_ctx, int sd, enum kshark_config_formats format); bool kshark_import_all_event_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf); bool kshark_import_all_task_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf); bool kshark_import_all_cpu_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf); bool kshark_import_all_filters(struct kshark_context *kshark_ctx, int sd, struct kshark_config_doc *conf); struct kshark_config_doc * kshark_export_dstream(struct kshark_context *kshark_ctx, int sd, enum kshark_config_formats format); int kshark_import_dstream(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf); bool kshark_export_all_dstreams(struct kshark_context *kshark_ctx, struct kshark_config_doc **conf); ssize_t kshark_import_all_dstreams(struct kshark_context *kshark_ctx, struct kshark_config_doc *conf, struct kshark_entry ***data_rows); bool kshark_save_config_file(const char *file_name, struct kshark_config_doc *conf); struct kshark_config_doc *kshark_open_config_file(const char *file_name, const char *type); struct kshark_config_doc *kshark_json_to_conf(struct json_object *jobj); void kshark_offset_calib(int64_t *ts, int64_t *atgv); void kshark_set_clock_offset(struct kshark_context *kshark_ctx, struct kshark_entry **entries, size_t size, int sd, int64_t offset); /** Structure representing a data set made of KernelShark entries. */ struct kshark_entry_data_set { /** Array of entries pointers. */ struct kshark_entry **data; /** The size of the data set. */ ssize_t n_rows; }; struct kshark_entry ** kshark_merge_data_entries(struct kshark_entry_data_set *buffers, size_t n_buffers); ssize_t kshark_load_all_entries(struct kshark_context *kshark_ctx, struct kshark_entry ***data_rows); ssize_t kshark_append_all_entries(struct kshark_context *kshark_ctx, struct kshark_entry **prior_data, ssize_t n_prior_rows, int first_streams, struct kshark_entry ***merged_data); bool kshark_data_matrix_alloc(size_t n_rows, int16_t **event_array, int16_t **cpu_array, int32_t **pid_array, int64_t **offset_array, int64_t **ts_array); /** Structure representing a data set made of data columns (arrays). */ struct kshark_matrix_data_set { /** Event Id column. */ int16_t *event_array; /** CPU Id column. */ int16_t *cpu_array; /** PID column. */ int32_t *pid_array; /** Record offset column. */ int64_t *offset_array; /** Timestamp column. */ int64_t *ts_array; /** The size of the data set. */ ssize_t n_rows; }; struct kshark_matrix_data_set kshark_merge_data_matrices(struct kshark_matrix_data_set *buffers, size_t n_buffers); /** * Structure used to store the data of a kshark_entry plus one additional * 64 bit integer data field. */ struct kshark_data_field_int64 { /** The entry object holding the basic data of the trace record. */ struct kshark_entry *entry; /** Additional 64 bit integer data field. */ int64_t field; }; /** The capacity of the kshark_data_container object after initialization. */ #define KS_CONTAINER_DEFAULT_SIZE 1024 /** Structure used to store an array of entries and data fields. */ struct kshark_data_container { /** An array of kshark_data_field_int64 objects. */ struct kshark_data_field_int64 **data; /** The total number of kshark_data_field_int64 objects stored. */ ssize_t size; /** The memory capacity of the container. */ ssize_t capacity; /** Is sorted in time. */ bool sorted; }; struct kshark_data_container *kshark_init_data_container(); void kshark_free_data_container(struct kshark_data_container *container); ssize_t kshark_data_container_append(struct kshark_data_container *container, struct kshark_entry *entry, int64_t field); void kshark_data_container_sort(struct kshark_data_container *container); ssize_t kshark_find_entry_field_by_time(int64_t time, struct kshark_data_field_int64 **data, size_t l, size_t h); #ifdef __cplusplus } #endif #endif // _LIB_KSHARK_H kernel-shark-kernelshark-v2.4.0/src/plugins/000077500000000000000000000000001477354127100210635ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/src/plugins/CMakeLists.txt000066400000000000000000000047011477354127100236250ustar00rootroot00000000000000message("\n src/plugins ...") function(BUILD_PLUGIN) set(options ) set(oneValueArgs NAME) set(multiValueArgs SOURCE) cmake_parse_arguments(ADD_PLUGIN "${options}" ${oneValueArgs} ${multiValueArgs} ${ARGN}) message(STATUS ${ADD_PLUGIN_NAME}) add_library(${ADD_PLUGIN_NAME} SHARED ${ADD_PLUGIN_SOURCE}) set_target_properties(${ADD_PLUGIN_NAME} PROPERTIES PREFIX "plugin-") target_link_libraries(${ADD_PLUGIN_NAME} kshark) endfunction() function(BUILD_GUI_PLUGIN) set(options) set(oneValueArgs NAME MOC) set(multiValueArgs SOURCE) cmake_parse_arguments(ADD_PLUGIN "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) message(STATUS ${ADD_PLUGIN_NAME}) QT6_WRAP_CPP(plugin_moc ${ADD_PLUGIN_MOC}) add_library(${ADD_PLUGIN_NAME} SHARED ${plugin_moc} ${ADD_PLUGIN_SOURCE}) set_target_properties(${ADD_PLUGIN_NAME} PROPERTIES PREFIX "plugin-") target_link_libraries(${ADD_PLUGIN_NAME} kshark kshark-gui) endfunction() set(PLUGIN_LIST "") if (Qt6Widgets_FOUND AND TT_FONT_FILE) BUILD_GUI_PLUGIN(NAME sched_events SOURCE sched_events.c SchedEvents.cpp) list(APPEND PLUGIN_LIST "sched_events") BUILD_GUI_PLUGIN(NAME event_field_plot MOC EventFieldDialog.hpp SOURCE event_field_plot.c EventFieldDialog.cpp EventFieldPlot.cpp) list(APPEND PLUGIN_LIST "event_field_plot") BUILD_GUI_PLUGIN(NAME latency_plot MOC LatencyPlotDialog.hpp SOURCE latency_plot.c LatencyPlot.cpp LatencyPlotDialog.cpp) list(APPEND PLUGIN_LIST "latency_plot") BUILD_GUI_PLUGIN(NAME kvm_combo MOC KVMComboDialog.hpp SOURCE kvm_combo.c KVMCombo.cpp KVMComboDialog.cpp) list(APPEND PLUGIN_LIST "kvm_combo") endif () BUILD_GUI_PLUGIN(NAME missed_events SOURCE missed_events.c MissedEvents.cpp) list(APPEND PLUGIN_LIST "missed_events") install(TARGETS ${PLUGIN_LIST} LIBRARY DESTINATION ${KS_PLUGIN_INSTALL_PREFIX} COMPONENT kernelshark) install(FILES "${KS_DIR}/src/plugins/common_sched.h" DESTINATION "${KS_INCLUDS_DESTINATION}/plugins" COMPONENT libkshark-devel) set(PLUGINS ${PLUGIN_LIST} PARENT_SCOPE) kernel-shark-kernelshark-v2.4.0/src/plugins/EventFieldDialog.cpp000066400000000000000000000106321477354127100247360ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file EventFieldDialog.cpp * @brief Dialog class used by the EventFieldPlot plugin. */ // C++ #include #include // KernelShark #include "KsMainWindow.hpp" #include "EventFieldDialog.hpp" /** The name of the menu item used to start the dialog of the plugin. */ #define DIALOG_NAME "Plot Event Field" /** Create plugin dialog widget. */ KsEFPDialog::KsEFPDialog(QWidget *parent) : QDialog(parent), _selectLabel("Show", this), _applyButton("Apply", this), _resetButton("Reset", this), _cancelButton("Cancel", this) { setWindowTitle(DIALOG_NAME); _topLayout.addWidget(&_efsWidget); _topLayout.addWidget(&_selectLabel); _setSelectCombo(); _topLayout.addWidget(&_selectComboBox); _buttonLayout.addWidget(&_applyButton); _applyButton.setAutoDefault(false); _buttonLayout.addWidget(&_resetButton); _resetButton.setAutoDefault(false); _buttonLayout.addWidget(&_cancelButton); _cancelButton.setAutoDefault(false); _buttonLayout.setAlignment(Qt::AlignLeft); _topLayout.addLayout(&_buttonLayout); connect(&_applyButton, &QPushButton::pressed, this, &KsEFPDialog::_apply); connect(&_applyButton, &QPushButton::pressed, this, &QWidget::close); connect(&_resetButton, &QPushButton::pressed, this, &KsEFPDialog::_reset); connect(&_resetButton, &QPushButton::pressed, this, &QWidget::close); connect(&_cancelButton, &QPushButton::pressed, this, &QWidget::close); setLayout(&_topLayout); } void KsEFPDialog::_setSelectCombo() { _selectComboBox.clear(); _selectComboBox.addItem("max. value", 0); _selectComboBox.addItem("min. value", 1); } /** Select the plotting criteria. */ void KsEFPDialog::selectCondition(plugin_efp_context *plugin_ctx) { /* In the combo box "max" is 0 and "min" is 1. */ plugin_ctx->show_max = !_selectComboBox.currentData().toInt(); } /** Update the dialog, using the current settings of the plugin. */ void KsEFPDialog::update() { _efsWidget.setStreamCombo(); } static KsEFPDialog *efp_dialog(nullptr); static int plugin_get_stream_id() { return efp_dialog->_efsWidget.streamId(); } /** Use the Event name selected by the user to update the plugin's context. */ __hidden void plugin_set_event_name(plugin_efp_context *plugin_ctx) { QString buff = efp_dialog->_efsWidget.eventName(); char *event; if (asprintf(&event, "%s", buff.toStdString().c_str()) >= 0) { plugin_ctx->event_name = event; return; } plugin_ctx->event_name = NULL; } /** Use the Field name selected by the user to update the plugin's context. */ __hidden void plugin_set_field_name(plugin_efp_context *plugin_ctx) { QString buff = efp_dialog->_efsWidget.fieldName(); char *field; if (asprintf(&field, "%s", buff.toStdString().c_str()) >= 0) { plugin_ctx->field_name = field; return; } plugin_ctx->field_name = NULL; } /** Use the condition selected by the user to update the plugin's context. */ __hidden void plugin_set_select_condition(plugin_efp_context *plugin_ctx) { efp_dialog->selectCondition(plugin_ctx); } void KsEFPDialog::_apply() { auto work = KsWidgetsLib::KsDataWork::UpdatePlugins; /* The plugin needs to process the data and this may take time * on large datasets. Show a "Work In Process" warning. */ _gui_ptr->wipPtr()->show(work); _gui_ptr->registerPluginToStream("event_field_plot", {plugin_get_stream_id()}); _gui_ptr->wipPtr()->hide(work); } void KsEFPDialog::_reset() { auto work = KsWidgetsLib::KsDataWork::UpdatePlugins; kshark_context *kshark_ctx(nullptr); QVector streamIds; if (!kshark_instance(&kshark_ctx)) return; streamIds = KsUtils::getStreamIdList(kshark_ctx); /* * The plugin needs to process the data and this may take time * on large datasets. Show a "Work In Process" warning. */ _gui_ptr->wipPtr()->show(work); _gui_ptr->unregisterPluginFromStream("event_field_plot", streamIds); _gui_ptr->wipPtr()->hide(work); } static void showDialog([[maybe_unused]] KsMainWindow *ks) { efp_dialog->update(); efp_dialog->show(); } /** Add the dialog of the plugin to the KernelShark menus. */ __hidden void *plugin_efp_add_menu(void *ks_ptr) { if (!efp_dialog) { efp_dialog = new KsEFPDialog(); efp_dialog->_gui_ptr = static_cast(ks_ptr); } QString menu("Tools/"); menu += DIALOG_NAME; efp_dialog->_gui_ptr->addPluginMenu(menu, showDialog); return efp_dialog; } kernel-shark-kernelshark-v2.4.0/src/plugins/EventFieldDialog.hpp000066400000000000000000000020661477354127100247450ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov */ /** * @file EventFieldDialog.hpp * @brief Dialog class used by the EventFieldPlot plugin. */ #ifndef _KS_EFP_DIALOG_H #define _KS_EFP_DIALOG_H // KernelShark #include "plugins/event_field_plot.h" #include "KsWidgetsLib.hpp" class KsMainWindow; /** * The KsEFPDialog class provides a widget for selecting Trace event field to * be visualized. */ class KsEFPDialog : public QDialog { Q_OBJECT public: explicit KsEFPDialog(QWidget *parent = nullptr); void update(); void selectCondition(plugin_efp_context *plugin_ctx); /** Widget for selecting Treace event. */ KsWidgetsLib::KsEventFieldSelectWidget _efsWidget; /** KernelShark GUI (main window) object. */ KsMainWindow *_gui_ptr; private: QVBoxLayout _topLayout; QHBoxLayout _buttonLayout; QComboBox _selectComboBox; QLabel _selectLabel; QPushButton _applyButton, _resetButton, _cancelButton; void _setSelectCombo(); void _apply(); void _reset(); }; #endif kernel-shark-kernelshark-v2.4.0/src/plugins/EventFieldPlot.cpp000066400000000000000000000051001477354127100244470ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file EventFieldPlot.cpp * @brief Plugin for visualizing a given data field of a trace event. */ // C++ #include // KernelShark #include "plugins/event_field_plot.h" #include "KsPlotTools.hpp" #include "KsPlugins.hpp" using namespace KsPlot; /** * @brief Plugin's draw function. * * @param argv_c: A C pointer to be converted to KsCppArgV (C++ struct). * @param sd: Data stream identifier. * @param val: Can be CPU Id or Process Id. * @param draw_action: Draw action identifier. */ __hidden void draw_event_field(kshark_cpp_argv *argv_c, int sd, int val, int draw_action) { KsCppArgV *argvCpp = KS_ARGV_TO_CPP(argv_c); Graph *graph = argvCpp->_graph; plugin_efp_context *plugin_ctx; IsApplicableFunc checkEntry; int binSize(0), s0, s1; int64_t norm; if (!(draw_action & KSHARK_CPU_DRAW) && !(draw_action & KSHARK_TASK_DRAW)) return; plugin_ctx = __get_context(sd); if (!plugin_ctx) return; /* Get the size of the graph's bins. */ for (int i = 0; i < graph->size(); ++i) if (graph->bin(i).mod()) { binSize = graph->bin(i)._size; break; } s0 = graph->height() / 3; s1 = graph->height() / 5; norm = plugin_ctx->field_max - plugin_ctx->field_min; /* Avoid division by zero. */ if (norm == 0) ++norm; auto lamMakeShape = [=] (std::vector graph, std::vector bin, std::vector data, Color, float) { int x, y, mod(binSize); Color c; x = graph[0]->bin(bin[0])._val.x(); y = graph[0]->bin(bin[0])._val.y() - s0; if (plugin_ctx->show_max) mod += s1 * (data[0]->field - plugin_ctx->field_min) / norm; else mod += s1 * (plugin_ctx->field_max - data[0]->field) / norm; Point p0(x, y + mod), p1(x, y - mod); Line *l = new Line(p0, p1); c.setRainbowColor(mod - 1); l->_size = binSize + 1; l->_color = c; return l; }; if (draw_action & KSHARK_CPU_DRAW) checkEntry = [=] (kshark_data_container *d, ssize_t i) { return d->data[i]->entry->cpu == val; }; else if (draw_action & KSHARK_TASK_DRAW) checkEntry = [=] (kshark_data_container *d, ssize_t i) { return d->data[i]->entry->pid == val; }; if (plugin_ctx->show_max) eventFieldPlotMax(argvCpp, plugin_ctx->data, checkEntry, lamMakeShape, {}, // Undefined color 0); // Undefined size else eventFieldPlotMin(argvCpp, plugin_ctx->data, checkEntry, lamMakeShape, {}, // Undefined color 0); // Undefined size } kernel-shark-kernelshark-v2.4.0/src/plugins/KVMCombo.cpp000066400000000000000000000016761477354127100232160ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2019 VMware Inc, Yordan Karadzhov */ /** * @file KVMCombo.cpp * @brief Plugin for visualization of KVM events. */ // KernelShark #include "plugins/kvm_combo.h" #include "VirtComboPlotTools.hpp" #include "KsPlugins.hpp" /** * @brief Plugin's draw function. * * @param argv_c: A C pointer to be converted to KsCppArgV (C++ struct). * @param sdHost: Data stream identifier of the Host. * @param pidHost: Process Id of the virtual CPU process in the Host. * @param draw_action: Draw action identifier. */ __hidden void draw_kvm_combos(kshark_cpp_argv *argv_c, int sdHost, int pidHost, int draw_action) { plugin_kvm_context *plugin_ctx = __get_context(sdHost); if (!plugin_ctx) return; drawVirtCombos(argv_c, sdHost, pidHost, plugin_ctx->vm_entry_id, plugin_ctx->vm_exit_id, draw_action); } kernel-shark-kernelshark-v2.4.0/src/plugins/KVMComboDialog.cpp000066400000000000000000000202571477354127100243320ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2021 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file KVMComboDialog.cpp * @brief Dialog class used by the KVMCombo plugin. */ // KernelShark #include "libkshark.h" #include "libkshark-tepdata.h" #include "plugins/kvm_combo.h" #include "KsMainWindow.hpp" #include "KVMComboDialog.hpp" using namespace KsWidgetsLib; static KsComboPlotDialog *combo_dialog(nullptr); static QMetaObject::Connection combo_dialogConnection; /** The name of the menu item used to start the dialog of the plugin. */ #define DIALOG_NAME "KVM Combo plots" static void showDialog(KsMainWindow *ks) { kshark_context *kshark_ctx(nullptr); if (!kshark_instance(&kshark_ctx)) return; if (kshark_ctx->n_streams < 2) { QString err("Data from one Host and at least one Guest is required."); QMessageBox msgBox; msgBox.critical(nullptr, "Error", err); return; } combo_dialog->update(); if (!combo_dialogConnection) { combo_dialogConnection = QObject::connect(combo_dialog, &KsComboPlotDialog::apply, ks->graphPtr(),&KsTraceGraph::comboReDraw); } combo_dialog->show(); } /** Add the dialog of the plugin to the KernelShark menus. */ __hidden void *plugin_kvm_add_menu(void *ks_ptr) { KsMainWindow *ks = static_cast(ks_ptr); QString menu("Plots/"); menu += DIALOG_NAME; ks->addPluginMenu(menu, showDialog); if (!combo_dialog) combo_dialog = new KsComboPlotDialog(); combo_dialog->_gui_ptr = ks; return combo_dialog; } /** * @brief Create KsCPUCheckBoxWidget. * * @param parent: The parent of this widget. */ KsVCPUCheckBoxWidget::KsVCPUCheckBoxWidget(QWidget *parent) : KsCheckBoxTreeWidget(0, "vCPUs", parent) { int height(FONT_HEIGHT * 1.5); QString style; style = QString("QTreeView::item { height: %1 ;}").arg(height); _tree.setStyleSheet(style); _initTree(); } /** * Update the widget according to the mapping between host processes and guest * virtual CPUs. */ void KsVCPUCheckBoxWidget::update(int guestId, kshark_host_guest_map *gMap, int gMapCount) { KsPlot::ColorTable colTable; QColor color; int j; for (j = 0; j < gMapCount; j++) if (gMap[j].guest_id == guestId) break; if (j == gMapCount) return; _tree.clear(); _id.resize(gMap[j].vcpu_count); _cb.resize(gMap[j].vcpu_count); colTable = KsPlot::CPUColorTable(); for (int i = 0; i < gMap[j].vcpu_count; ++i) { QString strCPU = QLatin1String("vCPU ") + QString::number(i); strCPU += (QLatin1String("\t<") + QLatin1String(gMap[j].guest_name) + QLatin1Char('>')); QTreeWidgetItem *cpuItem = new QTreeWidgetItem; cpuItem->setText(0, " "); cpuItem->setText(1, strCPU); cpuItem->setCheckState(0, Qt::Checked); color << colTable[i]; cpuItem->setBackground(0, color); _tree.addTopLevelItem(cpuItem); _id[i] = i; _cb[i] = cpuItem; } _adjustSize(); setDefault(false); } //! @cond Doxygen_Suppress #define LABEL_WIDTH (FONT_WIDTH * 50) //! @endcond /** Create default KsComboPlotDialog. */ KsComboPlotDialog::KsComboPlotDialog(QWidget *parent) : QDialog(parent), _vcpuTree(this), _hostLabel("Host:", this), _hostFileLabel("", this), _guestLabel("Guest:", this), _guestStreamComboBox(this), _applyButton("Apply", this), _cancelButton("Cancel", this), _currentGuestStream(0) { kshark_context *kshark_ctx(nullptr); int buttonWidth; auto lamAddLine = [&] { QFrame* line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); _topLayout.addWidget(line); }; setWindowTitle(DIALOG_NAME); if (!kshark_instance(&kshark_ctx)) return; _guestStreamComboBox.setMaximumWidth(LABEL_WIDTH); _streamMenuLayout.addWidget(&_hostLabel, 0, 0); _streamMenuLayout.addWidget(&_hostFileLabel, 0, 1); _streamMenuLayout.addWidget(&_guestLabel, 1, 0); _streamMenuLayout.addWidget(&_guestStreamComboBox, 1, 1); _topLayout.addLayout(&_streamMenuLayout); lamAddLine(); _topLayout.addWidget(&_vcpuTree); lamAddLine(); buttonWidth = STRING_WIDTH("--Cancel--"); _applyButton.setFixedWidth(buttonWidth); _cancelButton.setFixedWidth(buttonWidth); _buttonLayout.addWidget(&_applyButton); _applyButton.setAutoDefault(false); _buttonLayout.addWidget(&_cancelButton); _cancelButton.setAutoDefault(false); _buttonLayout.setAlignment(Qt::AlignLeft); _topLayout.addLayout(&_buttonLayout); connect(&_applyButton, &QPushButton::pressed, this, &QWidget::close); connect(&_cancelButton, &QPushButton::pressed, this, &QWidget::close); /* * Using the old Signal-Slot syntax because QComboBox::currentIndexChanged * has overloads. */ connect(&_guestStreamComboBox, &QComboBox::currentIndexChanged, this, &KsComboPlotDialog::_guestStreamChanged); setLayout(&_topLayout); _guestMapCount = 0; _guestMap = nullptr; } KsComboPlotDialog::~KsComboPlotDialog() { kshark_tracecmd_free_hostguest_map(_guestMap, _guestMapCount); } /** Update the Plugin dialog. */ void KsComboPlotDialog::update() { kshark_context *kshark_ctx(nullptr); KsPlot::ColorTable colTable; QString streamName; QColor color; int ret, sd, i; if (!kshark_instance(&kshark_ctx)) return; kshark_tracecmd_free_hostguest_map(_guestMap, _guestMapCount); _guestMap = nullptr; _guestMapCount = 0; ret = kshark_tracecmd_get_hostguest_mapping(&_guestMap); if (ret <= 0) { QString err("Cannot find host / guest tracing into the loaded streams"); QMessageBox msgBox; msgBox.critical(nullptr, "Error", err); return; } else { _guestMapCount = ret; } streamName = KsUtils::streamDescription(kshark_ctx->stream[_guestMap[0].host_id]); KsUtils::setElidedText(&_hostFileLabel, streamName, Qt::ElideLeft, LABEL_WIDTH); _guestStreamComboBox.clear(); colTable = KsPlot::streamColorTable(); for (i = 0; i < _guestMapCount; i++) { sd = _guestMap[i].guest_id; if (sd >= kshark_ctx->n_streams) continue; streamName = KsUtils::streamDescription(kshark_ctx->stream[sd]); _guestStreamComboBox.addItem(streamName, sd); color << colTable[sd]; _guestStreamComboBox.setItemData(i, QBrush(color), Qt::BackgroundRole); } if (!_applyButtonConnection) { _applyButtonConnection = connect(&_applyButton, &QPushButton::pressed, this, &KsComboPlotDialog::_applyPress); } sd = _guestStreamComboBox.currentData().toInt(); _setCurrentPlots(sd); } int KsComboPlotDialog::_findGuestPlots(int sdGuest) { for (int i = 0; i < _guestMapCount; i++) if (_guestMap[i].guest_id == sdGuest) return i; return -1; } QVector KsComboPlotDialog::_streamCombos(int sdGuest) { QVector cbVec = _vcpuTree.getCheckedIds(); int j = _findGuestPlots(sdGuest); QVector plots; KsComboPlot combo(2); if (j < 0) return {}; for (auto const &i: cbVec) { if (i >= _guestMap[j].vcpu_count) continue; combo[0]._streamId = _guestMap[j].guest_id; combo[0]._id = i; combo[0]._type = KSHARK_CPU_DRAW | KSHARK_GUEST_DRAW; combo[1]._streamId = _guestMap[j].host_id; combo[1]._id = _guestMap[j].cpu_pid[i]; combo[1]._type = KSHARK_TASK_DRAW | KSHARK_HOST_DRAW; plots.append(combo); } return plots; } void KsComboPlotDialog::_applyPress() { int guestId = _guestStreamComboBox.currentData().toInt(); QVector allCombosVec; int nPlots(0); _plotMap[guestId] = _streamCombos(guestId); for (auto it = _plotMap.cbegin(), end = _plotMap.cend(); it != end; ++it) { for (auto const &combo: it.value()) { allCombosVec.append(2); combo[0] >> allCombosVec; combo[1] >> allCombosVec; ++nPlots; } } emit apply(nPlots, allCombosVec); } void KsComboPlotDialog::_setCurrentPlots(int sdGuest) { QVector currentCombos =_plotMap[sdGuest]; int i = _findGuestPlots(sdGuest); if (i < 0 || _guestMap[i].vcpu_count <= 0) return; QVector vcpuCBs(_guestMap[i].vcpu_count, 0); for(auto const &p: currentCombos) vcpuCBs[p[0]._id] = 1; _vcpuTree.set(vcpuCBs); } void KsComboPlotDialog::_guestStreamChanged(int) { QString sdStr = _guestStreamComboBox.currentText(); if (sdStr.isEmpty()) return; int newGuestId = _guestStreamComboBox.currentData().toInt(); _plotMap[_currentGuestStream] = _streamCombos(_currentGuestStream); _vcpuTree.update(newGuestId, _guestMap, _guestMapCount); _setCurrentPlots(newGuestId); _currentGuestStream = newGuestId; } kernel-shark-kernelshark-v2.4.0/src/plugins/KVMComboDialog.hpp000066400000000000000000000033221477354127100243310ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2019 VMware Inc, Yordan Karadzhov */ /** * @file KVMComboDialog.hpp * @brief Plugin for visualization of KVM events. */ #ifndef _KS_COMBO_DIALOG_H #define _KS_COMBO_DIALOG_H #include "KsMainWindow.hpp" #include "KsWidgetsLib.hpp" /** * The KsVCPUCheckBoxWidget class provides a widget for selecting CPU plots to * show. */ struct KsVCPUCheckBoxWidget : public KsWidgetsLib::KsCheckBoxTreeWidget { explicit KsVCPUCheckBoxWidget(QWidget *parent = nullptr); void update(int GuestId, struct kshark_host_guest_map *gMap, int gMapCount); }; /** * The KsComboPlotDialog class provides a widget for selecting Combo plots to * show. */ class KsComboPlotDialog : public QDialog { Q_OBJECT public: explicit KsComboPlotDialog(QWidget *parent = nullptr); ~KsComboPlotDialog(); void update(); /** KernelShark GUI (main window) object. */ KsMainWindow *_gui_ptr; signals: /** Signal emitted when the "Apply" button is pressed. */ void apply(int sd, QVector); private: int _guestMapCount; struct kshark_host_guest_map *_guestMap; KsVCPUCheckBoxWidget _vcpuTree; QVBoxLayout _topLayout; QGridLayout _streamMenuLayout; QHBoxLayout _buttonLayout; QLabel _hostLabel, _hostFileLabel, _guestLabel; QComboBox _guestStreamComboBox; QPushButton _applyButton, _cancelButton; QMetaObject::Connection _applyButtonConnection; QMap> _plotMap; int _currentGuestStream; int _findGuestPlots(int sdGuest); QVector _streamCombos(int sdGuest); void _setCurrentPlots(int guestSd); void _applyPress(); private slots: void _guestStreamChanged(int); }; #endif kernel-shark-kernelshark-v2.4.0/src/plugins/LatencyPlot.cpp000066400000000000000000000154621477354127100240350ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file LatencyPlot.cpp * @brief Plugin for visualizing the latency between two trace events. */ // C #include // C++ #include #include #include // KernelShark #include "plugins/latency_plot.h" #include "KsPlotTools.hpp" #include "KsPlugins.hpp" /** A pair of events defining the latency. */ typedef std::pair LatencyPair; /** Hash table of latency pairs. */ typedef std::unordered_multimap LatencyHashTable; /** Hash table storing the latency pairs per CPU.*/ LatencyHashTable latencyCPUMap; /** Hash table storing the latency pairs per Task.*/ LatencyHashTable latencyTaskMap; /** * Macro used to forward the arguments and construct the pair directly into * a hash table without unnecessary copies (or moves). */ #define LATENCY_EMPLACE(map, key ,eA, eB) \ map.emplace(std::piecewise_construct, \ std::forward_as_tuple(key), \ std::forward_as_tuple(eA, eB)); \ using namespace KsPlot; /* * A second pass over the data is used to populate the hash tables of latency * pairs. */ static void secondPass(plugin_latency_context *plugin_ctx) { kshark_data_field_int64 **dataA = plugin_ctx->data[0]->data; kshark_data_field_int64 **dataB = plugin_ctx->data[1]->data; size_t nEvtAs = plugin_ctx->data[0]->size; size_t nEvtBs = plugin_ctx->data[1]->size; int64_t timeA, timeANext, valFieldA; size_t iB(0); /* * The order of the events in the container is the same as in the raw * data in the file. This means the data is not sorted in time. */ kshark_data_container_sort(plugin_ctx->data[0]); kshark_data_container_sort(plugin_ctx->data[1]); latencyCPUMap.clear(); latencyTaskMap.clear(); for (size_t iA = 0; iA < nEvtAs; ++iA) { timeA = dataA[iA]->entry->ts; valFieldA = dataA[iA]->field; /* * Find the time of the next "A event" having the same field * value. */ timeANext = INT64_MAX; for (size_t i = iA + 1; i field == valFieldA) { timeANext = dataA[i]->entry->ts; break; } } for (size_t i = iB; i < nEvtBs; ++i) { if (dataB[i]->entry->ts < timeA) { /* * We only care about the "B evenys" that are * after (in time) the current "A event". * Skip these "B events", when you search to * pair the next "A event". */ ++iB; continue; } if (dataB[i]->entry->ts > timeANext) { /* * We already bypassed in time the next * "A event" having the same field value. */ break; } if (dataB[i]->field == valFieldA) { int64_t delta = dataB[i]->entry->ts - timeA; if (delta > plugin_ctx->max_latency) plugin_ctx->max_latency = delta; /* * Store this pair of events in the hash * tables. Use the CPU Id as a key. */ LATENCY_EMPLACE(latencyCPUMap, dataB[i]->entry->cpu, dataA[iA]->entry, dataB[i]->entry) /* * Use the PID as a key. */ LATENCY_EMPLACE(latencyTaskMap, dataB[i]->entry->pid, dataA[iA]->entry, dataB[i]->entry) break; } } } } //! @cond Doxygen_Suppress #define ORANGE {255, 165, 0} //! @endcond static void liftBase(Point *point, Graph *graph) { point->setY(point->y() - graph->height() * .8); }; static Line *baseLine(Graph *graph) { Point p0, p1; Line *l; p0 = graph->bin(0)._base; liftBase(&p0, graph); p1 = graph->bin(graph->size() - 1)._base; liftBase(&p1, graph); l = new Line(p0, p1); l->_color = ORANGE; return l; } /** * This class represents the graphical element visualizing the latency between * two trace events. */ class LatencyTick : public Line { public: /** Constructor. */ LatencyTick(const Point &p0, const Point &p1, const LatencyPair &l) : Line(p0, p1), _l(l) { _color = ORANGE; } /** * @brief Distance between the click and the shape. Used to decide if * the double click action must be executed. * * @param x: X coordinate of the click. * @param y: Y coordinate of the click. * * @returns If the click is inside the box, the distance is zero. * Otherwise infinity. */ double distance(int x, int y) const override { int dx, dy; dx = pointX(0) - x; dy = pointY(0) - y; return sqrt(dx *dx + dy * dy); } private: LatencyTick() = delete; LatencyPair _l; /** On double click do. */ void _doubleClick() const override; }; void LatencyTick::_doubleClick() const { plugin_mark_entry(_l.first, 'A'); plugin_mark_entry(_l.second, 'B'); } static LatencyTick *tick(Graph *graph, int bin, int height, const LatencyPair &l) { Point p0, p1; p0 = graph->bin(bin)._base; liftBase(&p0, graph); p1 = p0; p1.setY(p1.y() - height); return new LatencyTick(p0, p1, l); } /** * @brief Plugin's draw function. * * @param argv_c: A C pointer to be converted to KsCppArgV (C++ struct). * @param sd: Data stream identifier. * @param val: Can be CPU Id or Process Id. * @param draw_action: Draw action identifier. */ __hidden void draw_latency(struct kshark_cpp_argv *argv_c, int sd, int val, int draw_action) { plugin_latency_context *plugin_ctx = __get_context(sd); struct kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; kshark_trace_histo *histo; LatencyHashTable *hash; KsCppArgV *argvCpp; PlotObjList *shapes; Graph *thisGraph; int graphHeight; if (!plugin_ctx) return; if (!plugin_ctx->second_pass_done) { /* The second pass is not done yet. */ secondPass(plugin_ctx); plugin_ctx->second_pass_done = true; } if (!kshark_instance(&kshark_ctx)) return; stream = kshark_get_data_stream(kshark_ctx, sd); if (!stream) return; /* Retrieve the arguments (C++ objects). */ argvCpp = KS_ARGV_TO_CPP(argv_c); thisGraph = argvCpp->_graph; if (thisGraph->size() == 0) return; graphHeight = thisGraph->height(); shapes = argvCpp->_shapes; histo = argvCpp->_histo; /* Start by drawing the base line of the Latency plot. */ shapes->push_front(baseLine(thisGraph)); auto lamScaledDelta = [=] (kshark_entry *eA, kshark_entry *eB) { double height; height = (eB->ts - eA->ts) / (double) plugin_ctx->max_latency; height *= graphHeight * .6; return height + 4; }; auto lamPlotLat = [=] (auto p) { kshark_entry *eA = p.second.first; kshark_entry *eB = p.second.second; int binB = ksmodel_get_bin(histo, eB); if (binB >= 0) shapes->push_front(tick(thisGraph, binB, lamScaledDelta(eA, eB), p.second)); }; /* * Use the latency hash tables to get all pairs that are relevant for * this plot. */ if (draw_action & KSHARK_CPU_DRAW) hash = &latencyCPUMap; else if (draw_action & KSHARK_TASK_DRAW) hash = &latencyTaskMap; else return; auto range = hash->equal_range(val); std::for_each(range.first, range.second, lamPlotLat); } kernel-shark-kernelshark-v2.4.0/src/plugins/LatencyPlotDialog.cpp000066400000000000000000000112011477354127100251400ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file EventFieldDialog.cpp * @brief Dialog class used by the LatencyPlot plugin. */ // C++ #include #include // KernelShark #include "KsMainWindow.hpp" #include "LatencyPlotDialog.hpp" /** The name of the menu item used to start the dialog of the plugin. */ #define DIALOG_NAME "Plot Latency" /** Create plugin dialog widget. */ LatencyPlotDialog::LatencyPlotDialog(QWidget *parent) : QDialog(parent), _evtALabel("\tEvent A", this), _evtBLabel("\tEvent B", this), _applyButton("Apply", this), _resetButton("Reset", this), _cancelButton("Cancel", this) { setWindowTitle(DIALOG_NAME); _fieldSelectLayout.addWidget(&_evtALabel, 0, 0); _fieldSelectLayout.addWidget(&_evtBLabel, 0, 1); _fieldSelectLayout.addWidget(&_efsWidgetA, 1, 0); _fieldSelectLayout.addWidget(&_efsWidgetB, 1, 1); _topLayout.addLayout(&_fieldSelectLayout); _buttonLayout.addWidget(&_applyButton); _applyButton.setAutoDefault(false); _buttonLayout.addWidget(&_resetButton); _resetButton.setAutoDefault(false); _buttonLayout.addWidget(&_cancelButton); _cancelButton.setAutoDefault(false); _buttonLayout.setAlignment(Qt::AlignLeft); _topLayout.addLayout(&_buttonLayout); connect(&_applyButton, &QPushButton::pressed, this, &LatencyPlotDialog::_apply); connect(&_applyButton, &QPushButton::pressed, this, &QWidget::close); connect(&_resetButton, &QPushButton::pressed, this, &LatencyPlotDialog::_reset); connect(&_resetButton, &QPushButton::pressed, this, &QWidget::close); connect(&_cancelButton, &QPushButton::pressed, this, &QWidget::close); setLayout(&_topLayout); } /** Update the dialog, using the current settings of the plugin. */ void LatencyPlotDialog::update() { _efsWidgetA.setStreamCombo(); _efsWidgetB.setStreamCombo(); } static LatencyPlotDialog *lp_dialog(nullptr); /** * Use the Events and Field names selected by the user to update the plugin's * context. */ __hidden void plugin_set_event_fields(struct plugin_latency_context *plugin_ctx) { std::string buff; char *name; int ret; plugin_ctx->event_name[0] = plugin_ctx->event_name[1] = NULL; buff = lp_dialog->_efsWidgetA.eventName().toStdString(); ret = asprintf(&name, "%s", buff.c_str()); if (ret > 0) plugin_ctx->event_name[0] = name; buff = lp_dialog->_efsWidgetB.eventName().toStdString(); ret = asprintf(&name, "%s", buff.c_str()); if (ret > 0) plugin_ctx->event_name[1] = name; plugin_ctx->field_name[0] = plugin_ctx->field_name[1] = NULL; buff = lp_dialog->_efsWidgetA.fieldName().toStdString(); ret = asprintf(&name, "%s", buff.c_str()); if (ret > 0) plugin_ctx->field_name[0] = name; buff = lp_dialog->_efsWidgetB.fieldName().toStdString(); ret = asprintf(&name, "%s", buff.c_str()); if (ret > 0) plugin_ctx->field_name[1] = name; } /** * @brief Mark an entry in the KernelShark GUI. * * @param e: The entry to be selected ith the marker. * @param mark: The marker to be used (A or B). */ __hidden void plugin_mark_entry(const struct kshark_entry *e, char mark) { DualMarkerState st = DualMarkerState::A; if (mark == 'B') st = DualMarkerState::B; lp_dialog->_gui_ptr->markEntry(e, st); } void LatencyPlotDialog::_apply() { auto work = KsWidgetsLib::KsDataWork::UpdatePlugins; int sdA = lp_dialog->_efsWidgetA.streamId(); int sdB = lp_dialog->_efsWidgetB.streamId(); /* * The plugin needs to process the data and this may take time * on large datasets. Show a "Work In Process" warning. */ _gui_ptr->wipPtr()->show(work); _gui_ptr->registerPluginToStream("latency_plot", {sdA, sdB}); _gui_ptr->wipPtr()->hide(work); } void LatencyPlotDialog::_reset() { auto work = KsWidgetsLib::KsDataWork::UpdatePlugins; kshark_context *kshark_ctx(nullptr); QVector streamIds; if (!kshark_instance(&kshark_ctx)) return; streamIds = KsUtils::getStreamIdList(kshark_ctx); /* * The plugin needs to process the data and this may take time * on large datasets. Show a "Work In Process" warning. */ _gui_ptr->wipPtr()->show(work); _gui_ptr->unregisterPluginFromStream("latency_plot", streamIds); _gui_ptr->wipPtr()->hide(work); } static void showDialog([[maybe_unused]] KsMainWindow *ks) { lp_dialog->update(); lp_dialog->show(); } /** Add the dialog of the plugin to the KernelShark menus. */ __hidden void *plugin_latency_add_menu(void *ks_ptr) { if (!lp_dialog) { lp_dialog = new LatencyPlotDialog(); lp_dialog->_gui_ptr = static_cast(ks_ptr); } QString menu("Tools/"); menu += DIALOG_NAME; lp_dialog->_gui_ptr->addPluginMenu(menu, showDialog); return lp_dialog; } kernel-shark-kernelshark-v2.4.0/src/plugins/LatencyPlotDialog.hpp000066400000000000000000000021531477354127100251530ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file LatencyPlotDialog.hpp * @brief Dialog class used by the LatencyPlot plugin. */ #ifndef _KS_EFP_DIALOG_H #define _KS_EFP_DIALOG_H // KernelShark #include "plugins/latency_plot.h" #include "KsWidgetsLib.hpp" class KsMainWindow; /** * The LatencyPlotDialog class provides a widget for selecting Trace event field to * be visualized. */ class LatencyPlotDialog : public QDialog { Q_OBJECT public: explicit LatencyPlotDialog(QWidget *parent = nullptr); void update(); /** Widget for selecting Treace event A. */ KsWidgetsLib::KsEventFieldSelectWidget _efsWidgetA; /** Widget for selecting Treace event B. */ KsWidgetsLib::KsEventFieldSelectWidget _efsWidgetB; /** KernelShark GUI (main window) object. */ KsMainWindow *_gui_ptr; private: QVBoxLayout _topLayout; QGridLayout _fieldSelectLayout; QHBoxLayout _buttonLayout; QLabel _evtALabel, _evtBLabel; QPushButton _applyButton, _resetButton, _cancelButton; void _apply(); void _reset(); }; #endif kernel-shark-kernelshark-v2.4.0/src/plugins/MissedEvents.cpp000066400000000000000000000063231477354127100242040ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file MissedEvents.cpp * @brief Plugin for visualization of events, missed due to overflow of the ring buffer. */ // C++ #include // KernelShark #include "libkshark.h" #include "plugins/missed_events.h" #include "KsPlotTools.hpp" #include "KsPlugins.hpp" using namespace KsPlot; /** * This class represents the graphical element of the KernelShark marker for * Missed events. */ class MissedEventsMark : public PlotObject { public: /** No default constructor. */ MissedEventsMark() = delete; /** * @brief Create and position a Missed events marker. * * @param p: Base point of the marker. * @param h: vertical size (height) of the marker. */ MissedEventsMark(const Point &p, int h) : _base(p.x(), p.y()), _height(h) {} private: /** Base point of the Mark's line. */ Point _base; /** The vertical size (height) of the Mark. */ int _height; void _draw(const Color &col, float size = 1.) const override; }; void MissedEventsMark::_draw(const Color &col, float size) const { Point p(_base.x(), _base.y() - _height); drawLine(_base, p, col, size); Rectangle rec; rec.setPoint(0, p.x(), p.y()); rec.setPoint(1, p.x() - _height / 4, p.y()); rec.setPoint(2, p.x() - _height / 4, p.y() + _height / 4); rec.setPoint(3, p.x(), p.y() + _height / 4); rec._color = col; rec.draw(); } static PlotObject *makeShape(std::vector graph, std::vector bin, std::vector, Color col, float size) { MissedEventsMark *mark = new MissedEventsMark(graph[0]->bin(bin[0])._base, graph[0]->height()); mark->_size = size; mark->_color = col; return mark; } //! @cond Doxygen_Suppress #define PLUGIN_MAX_ENTRIES 10000 //! @endcond /** * @brief Plugin's draw function. * * @param argv_c: A C pointer to be converted to KsCppArgV (C++ struct). * @param sd: Data stream identifier. * @param val: Process or CPU Id value. * @param draw_action: Draw action identifier. */ __hidden void draw_missed_events(kshark_cpp_argv *argv_c, int sd, int val, int draw_action) { KsCppArgV *argvCpp = KS_ARGV_TO_CPP(argv_c); IsApplicableFunc checkEntry; /* * Plotting the "Missed events" makes sense only in the case of a deep * zoom. Here we set a threshold based on the total number of entries * being visualized by the model. * Don't be afraid to play with different values for this threshold. */ if (argvCpp->_histo->tot_count > PLUGIN_MAX_ENTRIES) return; if (!(draw_action & KSHARK_CPU_DRAW) && !(draw_action & KSHARK_TASK_DRAW)) return; if (draw_action & KSHARK_CPU_DRAW) checkEntry = [=] (kshark_data_container *, ssize_t bin) { return !!ksmodel_get_cpu_missed_events(argvCpp->_histo, bin, sd, val, nullptr, nullptr); }; else if (draw_action & KSHARK_TASK_DRAW) checkEntry = [=] (kshark_data_container *, ssize_t bin) { return !!ksmodel_get_task_missed_events(argvCpp->_histo, bin, sd, val, nullptr, nullptr); }; eventPlot(argvCpp, checkEntry, makeShape, {0, 0, 255}, // Blue -1); // Default size } kernel-shark-kernelshark-v2.4.0/src/plugins/SchedEvents.cpp000066400000000000000000000107031477354127100240030ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file SchedEvents.cpp * @brief Defines a callback function for Sched events used to plot in green * the wake up latency of the task and in red the time the task was * preempted by another task. */ // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" #include "plugins/sched_events.h" #include "KsPlotTools.hpp" #include "KsPlugins.hpp" #include "KsMainWindow.hpp" using namespace KsPlot; static KsMainWindow *ks4sched_ptr; /** * @brief Provide the plugin with a pointer to the KsMainWindow object (the GUI * itself) such that the plugin can manipulate the GUI. */ __hidden void *plugin_set_gui_ptr(void *gui_ptr) { ks4sched_ptr = static_cast(gui_ptr); return nullptr; } /** * This child class represents the graphical element visualizing the latency * between sched_waking and sched_switch events. It is defined to re-implement * the handler for double-click. */ class SchedLatencyBox : public LatencyBox { /** On double click do. */ void _doubleClick() const override { ks4sched_ptr->markEntry(_data[1]->entry, DualMarkerState::B); ks4sched_ptr->markEntry(_data[0]->entry, DualMarkerState::A); } }; /* * Ideally, the sched_switch has to be the last trace event recorded before the * task is preempted. Because of this, when the data is loaded (the first pass), * the "pid" field of the sched_switch entries gets edited by this plugin to be * equal to the "next pid" of the sched_switch event. However, in reality the * sched_switch event may be followed by some trailing events from the same task * (printk events for example). This has the effect of extending the graph of * the task outside of the actual duration of the task. The "second pass" over * the data is used to fix this problem. It takes advantage of the "next" field * of the entry (this field is set during the first pass) to search for trailing * events after the "sched_switch". */ static void secondPass(plugin_sched_context *plugin_ctx) { kshark_data_container *cSS; kshark_entry *e; int pid_rec; cSS = plugin_ctx->ss_data; for (ssize_t i = 0; i < cSS->size; ++i) { pid_rec = plugin_sched_get_pid(cSS->data[i]->field); e = cSS->data[i]->entry; if (!e->next || e->pid == 0 || e->event_id == e->next->event_id || pid_rec != e->next->pid) continue; /* Find the very last trailing event. */ for (; e->next; e = e->next) { if (e->next->pid != plugin_sched_get_pid(cSS->data[i]->field)) { /* * This is the last trailing event. Change the * "pid" to be equal to the "next pid" of the * sched_switch event and leave a sign that you * edited this entry. */ e->pid = cSS->data[i]->entry->pid; e->visible &= ~KS_PLUGIN_UNTOUCHED_MASK; break; } } } } /** * @brief Plugin's draw function. * * @param argv_c: A C pointer to be converted to KsCppArgV (C++ struct). * @param sd: Data stream identifier. * @param pid: Process Id. * @param draw_action: Draw action identifier. */ __hidden void plugin_draw(kshark_cpp_argv *argv_c, int sd, int pid, int draw_action) { plugin_sched_context *plugin_ctx; if (!(draw_action & KSHARK_TASK_DRAW) || pid == 0) return; plugin_ctx = __get_context(sd); if (!plugin_ctx) return; KsCppArgV *argvCpp = KS_ARGV_TO_CPP(argv_c); if (!plugin_ctx->second_pass_done) { /* The second pass is not done yet. */ secondPass(plugin_ctx); plugin_ctx->second_pass_done = true; } IsApplicableFunc checkFieldSW = [=] (kshark_data_container *d, ssize_t i) { return d->data[i]->field == pid; }; IsApplicableFunc checkFieldSS = [=] (kshark_data_container *d, ssize_t i) { return !(plugin_sched_get_prev_state(d->data[i]->field) & 0x7f) && plugin_sched_get_pid(d->data[i]->field) == pid; }; IsApplicableFunc checkEntryPid = [=] (kshark_data_container *d, ssize_t i) { return d->data[i]->entry->pid == pid; }; eventFieldIntervalPlot(argvCpp, plugin_ctx->sw_data, checkFieldSW, plugin_ctx->ss_data, checkEntryPid, makeLatencyBox, {0, 255, 0}, // Green -1); // Default size eventFieldIntervalPlot(argvCpp, plugin_ctx->ss_data, checkFieldSS, plugin_ctx->ss_data, checkEntryPid, makeLatencyBox, {255, 0, 0}, // Red -1); // Default size } kernel-shark-kernelshark-v2.4.0/src/plugins/VirtComboPlotTools.hpp000066400000000000000000000075141477354127100253670ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2019 VMware Inc, Yordan Karadzhov */ /** * @file VirtComboPlotTools.hpp * @brief Tools for plotting Virt Combs. */ // C++ #include // KernelShark #include "KsPlugins.hpp" #include "KsPlotTools.hpp" static void drawVirt(kshark_trace_histo *histo, KsPlot::Graph *hostGraph, int sdHost, int pidHost, int vcpuEntryId, int vcpuExitId, KsPlot::PlotObjList *shapes) { int guestBaseY = hostGraph->bin(0)._base.y() - hostGraph->height(); int gapHeight = hostGraph->height() * .3; KsPlot::VirtBridge *bridge = new KsPlot::VirtBridge(); KsPlot::VirtGap *gap = new KsPlot::VirtGap(gapHeight); const kshark_entry *entry, *exit; ssize_t indexEntry, indexExit; int values[2] = {-1, pidHost}; bridge->_size = 2; bridge->_visible = false; bridge->setEntryHost(hostGraph->bin(0)._base.x(), guestBaseY); bridge->setEntryGuest(hostGraph->bin(0)._base.x(), guestBaseY); gap->_size = 2; gap->_visible = false; gap->_exitPoint = KsPlot::Point(hostGraph->bin(0)._base.x(), guestBaseY); auto lamStartBridg = [&] (int bin) { if (!bridge) bridge = new KsPlot::VirtBridge(); bridge->setEntryHost(hostGraph->bin(bin)._base.x(), hostGraph->bin(bin)._base.y()); bridge->setEntryGuest(hostGraph->bin(bin)._base.x(), guestBaseY); bridge->_color = hostGraph->bin(bin)._color; }; auto lamCloseBridg = [&] (int bin) { if (!bridge) return; bridge->setExitGuest(hostGraph->bin(bin)._base.x(), guestBaseY); bridge->setExitHost(hostGraph->bin(bin)._base.x(), hostGraph->bin(bin)._base.y()); bridge->_color = hostGraph->bin(bin)._color; bridge->_visible = true; bridge->_size = -1; // Default size shapes->push_front(bridge); bridge = nullptr; }; auto lamStartGap = [&] (int bin) { if (!gap) gap = new KsPlot::VirtGap(gapHeight); gap->_exitPoint = KsPlot::Point(hostGraph->bin(bin)._base.x(), guestBaseY); }; auto lamCloseGap = [&] (int bin) { if (!gap) return; gap->_entryPoint = KsPlot::Point(hostGraph->bin(bin)._base.x(), guestBaseY); gap->_visible = true; gap->_size = -1; // Default size shapes->push_front(gap); gap = nullptr; }; for (int bin = 0; bin < histo->n_bins; ++bin) { values[0] = vcpuEntryId; entry = ksmodel_get_entry_back(histo, bin, true, kshark_match_event_and_pid, sdHost, values, nullptr, &indexEntry); values[0] = vcpuExitId; exit = ksmodel_get_entry_back(histo, bin, true, kshark_match_event_and_pid, sdHost, values, nullptr, &indexExit); if (entry && !exit) { lamStartBridg(bin); lamCloseGap(bin); } if (exit && !entry) { lamCloseBridg(bin); lamStartGap(bin); } if (exit && entry) { if (bridge && bridge->_visible) lamCloseBridg(bin); if (gap && gap->_visible) lamCloseGap(bin); if (indexEntry > indexExit) { lamStartBridg(bin); } else { lamStartBridg(bin); lamCloseBridg(bin); lamStartGap(bin); } } } if (bridge && bridge->_visible) { bridge->setExitGuest(hostGraph->bin(histo->n_bins - 1)._base.x(), guestBaseY); bridge->setExitHost(hostGraph->bin(histo->n_bins - 1)._base.x(), guestBaseY); bridge->_size = -1; // Default size shapes->push_front(bridge); } } static void drawVirtCombos(kshark_cpp_argv *argv_c, int sdHost, int pidHost, int entryId, int exitId, int draw_action) { KsCppArgV *argvCpp; if (!(draw_action & KSHARK_HOST_DRAW) || pidHost == 0) return; argvCpp = KS_ARGV_TO_CPP(argv_c); try { drawVirt(argvCpp->_histo, argvCpp->_graph, sdHost, pidHost, entryId, exitId, argvCpp->_shapes); } catch (const std::exception &exc) { std::cerr << "Exception in drawVirtCombos()\n" << exc.what(); } } kernel-shark-kernelshark-v2.4.0/src/plugins/common_sched.h000066400000000000000000000030771477354127100237010ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov (VMware) * 2021 Intel Inc, Hongzhan Chen */ /** * @file common_sched.h * @brief Common definitions for sched plugins. */ #ifndef _KS_PLUGIN_COMMON_SCHED_H #define _KS_PLUGIN_COMMON_SCHED_H #ifdef __cplusplus extern "C" { #endif /** The type of the numerical data field used by the 'tep' APIs. */ typedef unsigned long long tep_num_field_t; /** The type of the data field stored in the kshark_data_container object. */ typedef int64_t ks_num_field_t; /** prev_state offset in data field */ #define PREV_STATE_SHIFT ((int) ((sizeof(ks_num_field_t) - 1) * 8)) /** Bit mask used when converting data to prev_state */ #define PREV_STATE_MASK (((ks_num_field_t) 1 << 8) - 1) /** Bit mask used when converting data to PID */ #define PID_MASK (((ks_num_field_t) 1 << PREV_STATE_SHIFT) - 1) /** * @brief Set the PID value for the data field stored in the * kshark_data_container object. * * @param field: Input pointer to data field. * @param pid: Input pid to set in data field. */ static inline void plugin_sched_set_pid(ks_num_field_t *field, tep_num_field_t pid) { *field &= ~PID_MASK; *field |= pid & PID_MASK; } /** * @brief Retrieve the PID value from the data field stored in the * kshark_data_container object. * * @param field: Input location for the data field. */ static inline int plugin_sched_get_pid(ks_num_field_t field) { return field & PID_MASK; } #ifdef __cplusplus } #endif #endif kernel-shark-kernelshark-v2.4.0/src/plugins/event_field_plot.c000066400000000000000000000055671477354127100245660ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file event_field_plot.c * @brief Plugin for visualizing a given data field of a trace event. */ // C #include #include #include // KernelShark #include "plugins/event_field_plot.h" static void efp_free_context(struct plugin_efp_context *plugin_ctx) { if (!plugin_ctx) return; free(plugin_ctx->event_name); free(plugin_ctx->field_name); kshark_free_data_container(plugin_ctx->data); } /** A general purpose macro is used to define plugin context. */ KS_DEFINE_PLUGIN_CONTEXT(struct plugin_efp_context, efp_free_context); static bool plugin_efp_init_context(struct kshark_data_stream *stream, struct plugin_efp_context *plugin_ctx) { plugin_set_event_name(plugin_ctx); plugin_set_field_name(plugin_ctx); plugin_set_select_condition(plugin_ctx); plugin_ctx->field_max = INT64_MIN; plugin_ctx->field_min = INT64_MAX; plugin_ctx->event_id = kshark_find_event_id(stream, plugin_ctx->event_name); if (plugin_ctx->event_id < 0) { fprintf(stderr, "Event %s not found in stream %s:%s\n", plugin_ctx->event_name, stream->file, stream->name); return false; } plugin_ctx->data = kshark_init_data_container(); if (!plugin_ctx->data) return false; return true; } static void plugin_get_field(struct kshark_data_stream *stream, void *rec, struct kshark_entry *entry) { struct plugin_efp_context *plugin_ctx; int64_t val; plugin_ctx = __get_context(stream->stream_id); if (!plugin_ctx) return; kshark_read_record_field_int(stream, rec, plugin_ctx->field_name, &val); kshark_data_container_append(plugin_ctx->data, entry, val); if (val > plugin_ctx->field_max) plugin_ctx->field_max = val; if (val < plugin_ctx->field_min) plugin_ctx->field_min = val; } /** Load this plugin. */ int KSHARK_PLOT_PLUGIN_INITIALIZER(struct kshark_data_stream *stream) { struct plugin_efp_context *plugin_ctx = __init(stream->stream_id); if (!plugin_ctx || !plugin_efp_init_context(stream, plugin_ctx)) { __close(stream->stream_id); return 0; } kshark_register_event_handler(stream, plugin_ctx->event_id, plugin_get_field); kshark_register_draw_handler(stream, draw_event_field); return 1; } /** Unload this plugin. */ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream) { struct plugin_efp_context *plugin_ctx = __get_context(stream->stream_id); int ret = 0; if (plugin_ctx) { kshark_unregister_event_handler(stream, plugin_ctx->event_id, plugin_get_field); kshark_unregister_draw_handler(stream, draw_event_field); ret = 1; } __close(stream->stream_id); return ret; } /** Initialize the control interface of the plugin. */ void *KSHARK_MENU_PLUGIN_INITIALIZER(void *gui_ptr) { return plugin_efp_add_menu(gui_ptr); } kernel-shark-kernelshark-v2.4.0/src/plugins/event_field_plot.h000066400000000000000000000026321477354127100245610ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file event_field_plot.h * @brief Plugin for visualizing a given data field of a trace event. */ #ifndef _KS_PLUGIN_EVENT_FIELD_H #define _KS_PLUGIN_EVENT_FIELD_H // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" #ifdef __cplusplus extern "C" { #endif /** Structure representing a plugin-specific context. */ struct plugin_efp_context { /** Trace event name. */ char *event_name; /** Event field name. */ char *field_name; /** The max value of the field in the data. */ int64_t field_max; /** The min value of the field in the data. */ int64_t field_min; /** Trace event identifier. */ int event_id; /** If true, highlight the max field value. Else highlight the min. */ bool show_max; /** Container object to store the trace event field's data. */ struct kshark_data_container *data; }; KS_DECLARE_PLUGIN_CONTEXT_METHODS(struct plugin_efp_context) void draw_event_field(struct kshark_cpp_argv *argv_c, int sd, int pid, int draw_action); void *plugin_efp_add_menu(void *gui_ptr); void plugin_set_event_name(struct plugin_efp_context *plugin_ctx); void plugin_set_field_name(struct plugin_efp_context *plugin_ctx); void plugin_set_select_condition(struct plugin_efp_context *plugin_ctx); #ifdef __cplusplus } #endif #endif kernel-shark-kernelshark-v2.4.0/src/plugins/kvm_combo.c000066400000000000000000000032511477354127100232040ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2019 VMware Inc, Yordan Karadzhov */ /** * @file kvm_combo.c * @brief Plugin for visualization of KVM events. */ // C #include #include #include // KernelShark #include "plugins/kvm_combo.h" #include "libkshark-plugin.h" #include "libkshark-tepdata.h" /** A general purpose macro is used to define plugin context. */ KS_DEFINE_PLUGIN_CONTEXT(struct plugin_kvm_context, free); static bool plugin_kvm_init_context(struct kshark_data_stream *stream, struct plugin_kvm_context *plugin_ctx) { plugin_ctx->vm_entry_id = kshark_find_event_id(stream, "kvm/kvm_entry"); plugin_ctx->vm_exit_id = kshark_find_event_id(stream, "kvm/kvm_exit"); if (plugin_ctx->vm_entry_id < 0 || plugin_ctx->vm_exit_id < 0) return false; return true; } /** Load this plugin. */ int KSHARK_PLOT_PLUGIN_INITIALIZER(struct kshark_data_stream *stream) { struct plugin_kvm_context *plugin_ctx = __init(stream->stream_id); if (!plugin_ctx || !plugin_kvm_init_context(stream, plugin_ctx)) { __close(stream->stream_id); return 0; } kshark_register_draw_handler(stream, draw_kvm_combos); return 1; } /** Unload this plugin. */ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream) { struct plugin_kvm_context *plugin_ctx = __get_context(stream->stream_id); int ret = 0; if (plugin_ctx) { kshark_unregister_draw_handler(stream, draw_kvm_combos); ret = 1; } __close(stream->stream_id); return ret; } /** Initialize the control interface of the plugin. */ void *KSHARK_MENU_PLUGIN_INITIALIZER(void *gui_ptr) { return plugin_kvm_add_menu(gui_ptr); } kernel-shark-kernelshark-v2.4.0/src/plugins/kvm_combo.h000066400000000000000000000016471477354127100232200ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2019 VMware Inc, Yordan Karadzhov */ /** * @file kvm_combo.h * @brief Plugin for visualization of KVM events. */ #ifndef _KS_PLUGIN_KVM_COMBO_H #define _KS_PLUGIN_KVM_COMBO_H // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" #ifdef __cplusplus extern "C" { #endif /** Structure representing a plugin-specific context. */ struct plugin_kvm_context { /** Input handle for the trace data file. */ struct tracecmd_input *handle; /** Page event used to parse the page. */ struct tep_handle *pevent; /** kvm_entry Id. */ int vm_entry_id; /** kvm_exit Id. */ int vm_exit_id; }; KS_DECLARE_PLUGIN_CONTEXT_METHODS(struct plugin_kvm_context) void draw_kvm_combos(struct kshark_cpp_argv *argv, int sd, int pid, int draw_action); void *plugin_kvm_add_menu(void *ks_ptr); #ifdef __cplusplus } #endif #endif kernel-shark-kernelshark-v2.4.0/src/plugins/latency_plot.c000066400000000000000000000102121477354127100237200ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file latency_plot.c * @brief Plugin for visualizing the latency between two trace events. */ // C #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif // _GNU_SOURCE #include #include // KernelShark #include "plugins/latency_plot.h" static void latency_free_context(struct plugin_latency_context *plugin_ctx) { if (!plugin_ctx) return; free(plugin_ctx->event_name[0]); free(plugin_ctx->field_name[0]); free(plugin_ctx->event_name[1]); free(plugin_ctx->field_name[1]); kshark_free_data_container(plugin_ctx->data[0]); kshark_free_data_container(plugin_ctx->data[1]); } /** A general purpose macro is used to define plugin context. */ KS_DEFINE_PLUGIN_CONTEXT(struct plugin_latency_context, latency_free_context); static bool plugin_latency_init_context(struct kshark_data_stream *stream, struct plugin_latency_context *plugin_ctx) { plugin_set_event_fields(plugin_ctx); plugin_ctx->event_id[0] = kshark_find_event_id(stream, plugin_ctx->event_name[0]); if (plugin_ctx->event_id[0] < 0) { fprintf(stderr, "Event %s not found in stream %s:%s\n", plugin_ctx->event_name[0], stream->file, stream->name); return false; } plugin_ctx->event_id[1] = kshark_find_event_id(stream, plugin_ctx->event_name[1]); if (plugin_ctx->event_id[1] < 0) { fprintf(stderr, "Event %s not found in stream %s:%s\n", plugin_ctx->event_name[1], stream->file, stream->name); return false; } plugin_ctx->second_pass_done = false; plugin_ctx->max_latency = INT64_MIN; plugin_ctx->data[0] = kshark_init_data_container(); plugin_ctx->data[1] = kshark_init_data_container(); if (!plugin_ctx->data[0] || !plugin_ctx->data[1]) return false; return true; } static void plugin_get_field(struct kshark_data_stream *stream, void *rec, struct kshark_entry *entry, char *field_name, struct kshark_data_container *data) { int64_t val; kshark_read_record_field_int(stream, rec, field_name, &val); kshark_data_container_append(data, entry, val); } static void plugin_get_field_a(struct kshark_data_stream *stream, void *rec, struct kshark_entry *entry) { struct plugin_latency_context *plugin_ctx; plugin_ctx = __get_context(stream->stream_id); if (!plugin_ctx) return; plugin_get_field(stream, rec, entry, plugin_ctx->field_name[0], plugin_ctx->data[0]); } static void plugin_get_field_b(struct kshark_data_stream *stream, void *rec, struct kshark_entry *entry) { struct plugin_latency_context *plugin_ctx; plugin_ctx = __get_context(stream->stream_id); if (!plugin_ctx) return; plugin_get_field(stream, rec, entry, plugin_ctx->field_name[1], plugin_ctx->data[1]); } /** Load this plugin. */ int KSHARK_PLOT_PLUGIN_INITIALIZER(struct kshark_data_stream *stream) { struct plugin_latency_context *plugin_ctx = __init(stream->stream_id); if (!plugin_ctx || !plugin_latency_init_context(stream, plugin_ctx)) { __close(stream->stream_id); return 0; } /* Register Event handler to be executed during data loading. */ kshark_register_event_handler(stream, plugin_ctx->event_id[0], plugin_get_field_a); kshark_register_event_handler(stream, plugin_ctx->event_id[1], plugin_get_field_b); /* Register a drawing handler to plot on top of each Graph. */ kshark_register_draw_handler(stream, draw_latency); return 1; } /** Unload this plugin. */ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream) { struct plugin_latency_context *plugin_ctx = __get_context(stream->stream_id); int ret = 0; if (plugin_ctx) { kshark_unregister_event_handler(stream, plugin_ctx->event_id[0], plugin_get_field_a); kshark_unregister_event_handler(stream, plugin_ctx->event_id[1], plugin_get_field_b); kshark_unregister_draw_handler(stream, draw_latency); ret = 1; } __close(stream->stream_id); return ret; } /** Initialize the control interface of the plugin. */ void *KSHARK_MENU_PLUGIN_INITIALIZER(void *gui_ptr) { return plugin_latency_add_menu(gui_ptr); } kernel-shark-kernelshark-v2.4.0/src/plugins/latency_plot.h000066400000000000000000000025011477354127100237270ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file latency_plot.h * @brief Plugin for visualizing the latency between two trace events. */ #ifndef _KS_PLUGIN_LATENCY_PLOT_H #define _KS_PLUGIN_LATENCY_PLOT_H // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" #ifdef __cplusplus extern "C" { #endif /** Structure representing a plugin-specific context. */ struct plugin_latency_context { /** Trace event names. */ char *event_name[2]; /** Trace event identifiers. */ int event_id[2]; /** Event field names. */ char *field_name[2]; /** True if the second pass is already done. */ bool second_pass_done; /** * The maximum value of the latency between events A and B in this * data sample. */ int64_t max_latency; /** Container objects to store the trace event field's data. */ struct kshark_data_container *data[2]; }; KS_DECLARE_PLUGIN_CONTEXT_METHODS(struct plugin_latency_context) void draw_latency(struct kshark_cpp_argv *argv_c, int sd, int pid, int draw_action); void *plugin_latency_add_menu(void *gui_ptr); void plugin_set_event_fields(struct plugin_latency_context *plugin_ctx); void plugin_mark_entry(const struct kshark_entry *e, char mark); #ifdef __cplusplus } #endif #endif kernel-shark-kernelshark-v2.4.0/src/plugins/missed_events.c000066400000000000000000000013001477354127100240710ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file missed_events.c * @brief Plugin for visualization of missed events due to overflow of the * ring buffer. */ // C #include // KernelShark #include "libkshark.h" #include "plugins/missed_events.h" /** Load this plugin. */ int KSHARK_PLOT_PLUGIN_INITIALIZER(struct kshark_data_stream *stream) { kshark_register_draw_handler(stream, draw_missed_events); return 1; } /** Unload this plugin. */ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream) { kshark_unregister_draw_handler(stream, draw_missed_events); return 1; } kernel-shark-kernelshark-v2.4.0/src/plugins/missed_events.h000066400000000000000000000010241477354127100241010ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov */ /** * @file missed_events.h * @brief Plugin for visualization of missed events due to overflow of the * ring buffer. */ #ifndef _KS_PLUGIN_M_EVTS_H #define _KS_PLUGIN_M_EVTS_H // KernelShark #include "libkshark-plugin.h" #ifdef __cplusplus extern "C" { #endif void draw_missed_events(struct kshark_cpp_argv *argv, int sd, int pid, int draw_action); #ifdef __cplusplus } #endif #endif kernel-shark-kernelshark-v2.4.0/src/plugins/sched_events.c000066400000000000000000000123111477354127100236770ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2018 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file sched_events.c * @brief */ // C #include #include // trace-cmd #include // KernelShark #include "plugins/sched_events.h" #include "libkshark-tepdata.h" /** Plugin context instance. */ /* Use the most significant byte to store the value of "prev_state". */ static void plugin_sched_set_prev_state(ks_num_field_t *field, tep_num_field_t prev_state) { tep_num_field_t mask = PREV_STATE_MASK << PREV_STATE_SHIFT; *field &= ~mask; *field |= (prev_state & PREV_STATE_MASK) << PREV_STATE_SHIFT; } /** * @brief Retrieve the "prev_state" value from the data field stored in the * kshark_data_container object. * * @param field: Input location for the data field. */ __hidden int plugin_sched_get_prev_state(ks_num_field_t field) { tep_num_field_t mask = PREV_STATE_MASK << PREV_STATE_SHIFT; return (field & mask) >> PREV_STATE_SHIFT; } static void sched_free_context(struct plugin_sched_context *plugin_ctx) { if (!plugin_ctx) return; kshark_free_data_container(plugin_ctx->ss_data); kshark_free_data_container(plugin_ctx->sw_data); } /** A general purpose macro is used to define plugin context. */ KS_DEFINE_PLUGIN_CONTEXT(struct plugin_sched_context, sched_free_context); static bool plugin_sched_init_context(struct kshark_data_stream *stream, struct plugin_sched_context *plugin_ctx) { struct tep_event *event; bool wakeup_found; if (!kshark_is_tep(stream)) return false; plugin_ctx->tep = kshark_get_tep(stream); event = tep_find_event_by_name(plugin_ctx->tep, "sched", "sched_switch"); if (!event) return false; plugin_ctx->sched_switch_event = event; plugin_ctx->sched_switch_next_field = tep_find_any_field(event, "next_pid"); plugin_ctx->sched_switch_comm_field = tep_find_field(event, "next_comm"); plugin_ctx->sched_switch_prev_state_field = tep_find_field(event, "prev_state"); wakeup_found = define_wakeup_event(plugin_ctx->tep, &plugin_ctx->sched_waking_event); if (wakeup_found) { plugin_ctx->sched_waking_pid_field = tep_find_any_field(plugin_ctx->sched_waking_event, "pid"); } plugin_ctx->second_pass_done = false; plugin_ctx->ss_data = kshark_init_data_container(); plugin_ctx->sw_data = kshark_init_data_container(); if (!plugin_ctx->ss_data || !plugin_ctx->sw_data) return false; return true; } static void plugin_sched_swith_action(struct kshark_data_stream *stream, void *rec, struct kshark_entry *entry) { struct tep_record *record = (struct tep_record *) rec; struct plugin_sched_context *plugin_ctx; unsigned long long next_pid_val, prev_state_val; ks_num_field_t ks_field = 0; int ret, pid; plugin_ctx = __get_context(stream->stream_id); if (!plugin_ctx) return; ret = tep_read_number_field(plugin_ctx->sched_switch_next_field, record->data, &next_pid_val); pid = next_pid_val; if (ret == 0 && pid >= 0) { plugin_sched_set_pid(&ks_field, entry->pid); ret = tep_read_number_field(plugin_ctx->sched_switch_prev_state_field, record->data, &prev_state_val); if (ret == 0) plugin_sched_set_prev_state(&ks_field, prev_state_val); kshark_data_container_append(plugin_ctx->ss_data, entry, ks_field); entry->pid = pid; } } static void plugin_sched_wakeup_action(struct kshark_data_stream *stream, void *rec, struct kshark_entry *entry) { struct tep_record *record = (struct tep_record *) rec; struct plugin_sched_context *plugin_ctx; unsigned long long val; int ret; plugin_ctx = __get_context(stream->stream_id); if (!plugin_ctx) return; ret = tep_read_number_field(plugin_ctx->sched_waking_pid_field, record->data, &val); if (ret == 0) kshark_data_container_append(plugin_ctx->sw_data, entry, val); } /** Load this plugin. */ int KSHARK_PLOT_PLUGIN_INITIALIZER(struct kshark_data_stream *stream) { struct plugin_sched_context *plugin_ctx; plugin_ctx = __init(stream->stream_id); if (!plugin_ctx || !plugin_sched_init_context(stream, plugin_ctx)) { __close(stream->stream_id); return 0; } kshark_register_event_handler(stream, plugin_ctx->sched_switch_event->id, plugin_sched_swith_action); if (plugin_ctx->sched_waking_event) { kshark_register_event_handler(stream, plugin_ctx->sched_waking_event->id, plugin_sched_wakeup_action); } kshark_register_draw_handler(stream, plugin_draw); return 1; } /** Unload this plugin. */ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(struct kshark_data_stream *stream) { struct plugin_sched_context *plugin_ctx = __get_context(stream->stream_id); int ret = 0; if (plugin_ctx) { kshark_unregister_event_handler(stream, plugin_ctx->sched_switch_event->id, plugin_sched_swith_action); if (plugin_ctx->sched_waking_event) { kshark_unregister_event_handler(stream, plugin_ctx->sched_waking_event->id, plugin_sched_wakeup_action); } kshark_unregister_draw_handler(stream, plugin_draw); ret = 1; } __close(stream->stream_id); return ret; } /** Initialize the control interface of the plugin. */ void *KSHARK_MENU_PLUGIN_INITIALIZER(void *gui_ptr) { return plugin_set_gui_ptr(gui_ptr); } kernel-shark-kernelshark-v2.4.0/src/plugins/sched_events.h000066400000000000000000000033441477354127100237120ustar00rootroot00000000000000/* SPDX-License-Identifier: LGPL-2.1 */ /* * Copyright (C) 2017 VMware Inc, Yordan Karadzhov (VMware) */ /** * @file sched_events.h * @brief Plugin for Sched events. */ #ifndef _KS_PLUGIN_SCHED_H #define _KS_PLUGIN_SCHED_H // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" #include "plugins/common_sched.h" #ifdef __cplusplus extern "C" { #endif /** Structure representing a plugin-specific context. */ struct plugin_sched_context { /** Page event used to parse the page. */ struct tep_handle *tep; /** Pointer to the sched_switch_event object. */ struct tep_event *sched_switch_event; /** Pointer to the sched_switch_next_field format descriptor. */ struct tep_format_field *sched_switch_next_field; /** Pointer to the sched_switch_comm_field format descriptor. */ struct tep_format_field *sched_switch_comm_field; /** Pointer to the sched_switch_prev_state_field format descriptor. */ struct tep_format_field *sched_switch_prev_state_field; /** Pointer to the sched_waking_event object. */ struct tep_event *sched_waking_event; /** Pointer to the sched_waking_pid_field format descriptor. */ struct tep_format_field *sched_waking_pid_field; /** True if the second pass is already done. */ bool second_pass_done; /** Data container for sched_switch data. */ struct kshark_data_container *ss_data; /** Data container for sched_waking data. */ struct kshark_data_container *sw_data; }; KS_DECLARE_PLUGIN_CONTEXT_METHODS(struct plugin_sched_context) int plugin_sched_get_prev_state(ks_num_field_t field); void plugin_draw(struct kshark_cpp_argv *argv, int sd, int pid, int draw_action); void *plugin_set_gui_ptr(void *gui_ptr); #ifdef __cplusplus } #endif #endif kernel-shark-kernelshark-v2.4.0/src/stb_truetype.h000066400000000000000000005760741477354127100223270ustar00rootroot00000000000000// stb_truetype.h - v1.24 - public domain // authored from 2009-2020 by Sean Barrett / RAD Game Tools // // ======================================================================= // // NO SECURITY GUARANTEE -- DO NOT USE THIS ON UNTRUSTED FONT FILES // // This library does no range checking of the offsets found in the file, // meaning an attacker can use it to read arbitrary memory. // // ======================================================================= // // This library processes TrueType files: // parse files // extract glyph metrics // extract glyph shapes // render glyphs to one-channel bitmaps with antialiasing (box filter) // render glyphs to one-channel SDF bitmaps (signed-distance field/function) // // Todo: // non-MS cmaps // crashproof on bad data // hinting? (no longer patented) // cleartype-style AA? // optimize: use simple memory allocator for intermediates // optimize: build edge-list directly from curves // optimize: rasterize directly from curves? // // ADDITIONAL CONTRIBUTORS // // Mikko Mononen: compound shape support, more cmap formats // Tor Andersson: kerning, subpixel rendering // Dougall Johnson: OpenType / Type 2 font handling // Daniel Ribeiro Maciel: basic GPOS-based kerning // // Misc other: // Ryan Gordon // Simon Glass // github:IntellectualKitty // Imanol Celaya // Daniel Ribeiro Maciel // // Bug/warning reports/fixes: // "Zer" on mollyrocket Fabian "ryg" Giesen github:NiLuJe // Cass Everitt Martins Mozeiko github:aloucks // stoiko (Haemimont Games) Cap Petschulat github:oyvindjam // Brian Hook Omar Cornut github:vassvik // Walter van Niftrik Ryan Griege // David Gow Peter LaValle // David Given Sergey Popov // Ivan-Assen Ivanov Giumo X. Clanjor // Anthony Pesch Higor Euripedes // Johan Duparc Thomas Fields // Hou Qiming Derek Vinyard // Rob Loach Cort Stratton // Kenney Phillis Jr. Brian Costabile // Ken Voskuil (kaesve) // // VERSION HISTORY // // 1.24 (2020-02-05) fix warning // 1.23 (2020-02-02) query SVG data for glyphs; query whole kerning table (but only kern not GPOS) // 1.22 (2019-08-11) minimize missing-glyph duplication; fix kerning if both 'GPOS' and 'kern' are defined // 1.21 (2019-02-25) fix warning // 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics() // 1.19 (2018-02-11) GPOS kerning, STBTT_fmod // 1.18 (2018-01-29) add missing function // 1.17 (2017-07-23) make more arguments const; doc fix // 1.16 (2017-07-12) SDF support // 1.15 (2017-03-03) make more arguments const // 1.14 (2017-01-16) num-fonts-in-TTC function // 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts // 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual // 1.11 (2016-04-02) fix unused-variable warning // 1.10 (2016-04-02) user-defined fabs(); rare memory leak; remove duplicate typedef // 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use allocation userdata properly // 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges // 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; // variant PackFontRanges to pack and render in separate phases; // fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); // fixed an assert() bug in the new rasterizer // replace assert() with STBTT_assert() in new rasterizer // // Full history can be found at the end of this file. // // LICENSE // // See end of file for license information. // // USAGE // // Include this file in whatever places need to refer to it. In ONE C/C++ // file, write: // #define STB_TRUETYPE_IMPLEMENTATION // before the #include of this file. This expands out the actual // implementation into that C/C++ file. // // To make the implementation private to the file that generates the implementation, // #define STBTT_STATIC // // Simple 3D API (don't ship this, but it's fine for tools and quick start) // stbtt_BakeFontBitmap() -- bake a font to a bitmap for use as texture // stbtt_GetBakedQuad() -- compute quad to draw for a given char // // Improved 3D API (more shippable): // #include "stb_rect_pack.h" -- optional, but you really want it // stbtt_PackBegin() // stbtt_PackSetOversampling() -- for improved quality on small fonts // stbtt_PackFontRanges() -- pack and renders // stbtt_PackEnd() // stbtt_GetPackedQuad() // // "Load" a font file from a memory buffer (you have to keep the buffer loaded) // stbtt_InitFont() // stbtt_GetFontOffsetForIndex() -- indexing for TTC font collections // stbtt_GetNumberOfFonts() -- number of fonts for TTC font collections // // Render a unicode codepoint to a bitmap // stbtt_GetCodepointBitmap() -- allocates and returns a bitmap // stbtt_MakeCodepointBitmap() -- renders into bitmap you provide // stbtt_GetCodepointBitmapBox() -- how big the bitmap must be // // Character advance/positioning // stbtt_GetCodepointHMetrics() // stbtt_GetFontVMetrics() // stbtt_GetFontVMetricsOS2() // stbtt_GetCodepointKernAdvance() // // Starting with version 1.06, the rasterizer was replaced with a new, // faster and generally-more-precise rasterizer. The new rasterizer more // accurately measures pixel coverage for anti-aliasing, except in the case // where multiple shapes overlap, in which case it overestimates the AA pixel // coverage. Thus, anti-aliasing of intersecting shapes may look wrong. If // this turns out to be a problem, you can re-enable the old rasterizer with // #define STBTT_RASTERIZER_VERSION 1 // which will incur about a 15% speed hit. // // ADDITIONAL DOCUMENTATION // // Immediately after this block comment are a series of sample programs. // // After the sample programs is the "header file" section. This section // includes documentation for each API function. // // Some important concepts to understand to use this library: // // Codepoint // Characters are defined by unicode codepoints, e.g. 65 is // uppercase A, 231 is lowercase c with a cedilla, 0x7e30 is // the hiragana for "ma". // // Glyph // A visual character shape (every codepoint is rendered as // some glyph) // // Glyph index // A font-specific integer ID representing a glyph // // Baseline // Glyph shapes are defined relative to a baseline, which is the // bottom of uppercase characters. Characters extend both above // and below the baseline. // // Current Point // As you draw text to the screen, you keep track of a "current point" // which is the origin of each character. The current point's vertical // position is the baseline. Even "baked fonts" use this model. // // Vertical Font Metrics // The vertical qualities of the font, used to vertically position // and space the characters. See docs for stbtt_GetFontVMetrics. // // Font Size in Pixels or Points // The preferred interface for specifying font sizes in stb_truetype // is to specify how tall the font's vertical extent should be in pixels. // If that sounds good enough, skip the next paragraph. // // Most font APIs instead use "points", which are a common typographic // measurement for describing font size, defined as 72 points per inch. // stb_truetype provides a point API for compatibility. However, true // "per inch" conventions don't make much sense on computer displays // since different monitors have different number of pixels per // inch. For example, Windows traditionally uses a convention that // there are 96 pixels per inch, thus making 'inch' measurements have // nothing to do with inches, and thus effectively defining a point to // be 1.333 pixels. Additionally, the TrueType font data provides // an explicit scale factor to scale a given font's glyphs to points, // but the author has observed that this scale factor is often wrong // for non-commercial fonts, thus making fonts scaled in points // according to the TrueType spec incoherently sized in practice. // // DETAILED USAGE: // // Scale: // Select how high you want the font to be, in points or pixels. // Call ScaleForPixelHeight or ScaleForMappingEmToPixels to compute // a scale factor SF that will be used by all other functions. // // Baseline: // You need to select a y-coordinate that is the baseline of where // your text will appear. Call GetFontBoundingBox to get the baseline-relative // bounding box for all characters. SF*-y0 will be the distance in pixels // that the worst-case character could extend above the baseline, so if // you want the top edge of characters to appear at the top of the // screen where y=0, then you would set the baseline to SF*-y0. // // Current point: // Set the current point where the first character will appear. The // first character could extend left of the current point; this is font // dependent. You can either choose a current point that is the leftmost // point and hope, or add some padding, or check the bounding box or // left-side-bearing of the first character to be displayed and set // the current point based on that. // // Displaying a character: // Compute the bounding box of the character. It will contain signed values // relative to . I.e. if it returns x0,y0,x1,y1, // then the character should be displayed in the rectangle from // to = 32 && *text < 128) { stbtt_aligned_quad q; stbtt_GetBakedQuad(cdata, 512,512, *text-32, &x,&y,&q,1);//1=opengl & d3d10+,0=d3d9 glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y0); glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y0); glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y1); glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y1); } ++text; } glEnd(); } #endif // // ////////////////////////////////////////////////////////////////////////////// // // Complete program (this compiles): get a single bitmap, print as ASCII art // #if 0 #include #define STB_TRUETYPE_IMPLEMENTATION // force following include to generate implementation #include "stb_truetype.h" char ttf_buffer[1<<25]; int main(int argc, char **argv) { stbtt_fontinfo font; unsigned char *bitmap; int w,h,i,j,c = (argc > 1 ? atoi(argv[1]) : 'a'), s = (argc > 2 ? atoi(argv[2]) : 20); fread(ttf_buffer, 1, 1<<25, fopen(argc > 3 ? argv[3] : "c:/windows/fonts/arialbd.ttf", "rb")); stbtt_InitFont(&font, ttf_buffer, stbtt_GetFontOffsetForIndex(ttf_buffer,0)); bitmap = stbtt_GetCodepointBitmap(&font, 0,stbtt_ScaleForPixelHeight(&font, s), c, &w, &h, 0,0); for (j=0; j < h; ++j) { for (i=0; i < w; ++i) putchar(" .:ioVM@"[bitmap[j*w+i]>>5]); putchar('\n'); } return 0; } #endif // // Output: // // .ii. // @@@@@@. // V@Mio@@o // :i. V@V // :oM@@M // :@@@MM@M // @@o o@M // :@@. M@M // @@@o@@@@ // :M@@V:@@. // ////////////////////////////////////////////////////////////////////////////// // // Complete program: print "Hello World!" banner, with bugs // #if 0 char buffer[24<<20]; unsigned char screen[20][79]; int main(int arg, char **argv) { stbtt_fontinfo font; int i,j,ascent,baseline,ch=0; float scale, xpos=2; // leave a little padding in case the character extends left char *text = "Heljo World!"; // intentionally misspelled to show 'lj' brokenness fread(buffer, 1, 1000000, fopen("c:/windows/fonts/arialbd.ttf", "rb")); stbtt_InitFont(&font, buffer, 0); scale = stbtt_ScaleForPixelHeight(&font, 15); stbtt_GetFontVMetrics(&font, &ascent,0,0); baseline = (int) (ascent*scale); while (text[ch]) { int advance,lsb,x0,y0,x1,y1; float x_shift = xpos - (float) floor(xpos); stbtt_GetCodepointHMetrics(&font, text[ch], &advance, &lsb); stbtt_GetCodepointBitmapBoxSubpixel(&font, text[ch], scale,scale,x_shift,0, &x0,&y0,&x1,&y1); stbtt_MakeCodepointBitmapSubpixel(&font, &screen[baseline + y0][(int) xpos + x0], x1-x0,y1-y0, 79, scale,scale,x_shift,0, text[ch]); // note that this stomps the old data, so where character boxes overlap (e.g. 'lj') it's wrong // because this API is really for baking character bitmaps into textures. if you want to render // a sequence of characters, you really need to render each bitmap to a temp buffer, then // "alpha blend" that into the working buffer xpos += (advance * scale); if (text[ch+1]) xpos += scale*stbtt_GetCodepointKernAdvance(&font, text[ch],text[ch+1]); ++ch; } for (j=0; j < 20; ++j) { for (i=0; i < 78; ++i) putchar(" .:ioVM@"[screen[j][i]>>5]); putchar('\n'); } return 0; } #endif ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //// //// INTEGRATION WITH YOUR CODEBASE //// //// The following sections allow you to supply alternate definitions //// of C library functions used by stb_truetype, e.g. if you don't //// link with the C runtime library. #ifdef STB_TRUETYPE_IMPLEMENTATION // #define your own (u)stbtt_int8/16/32 before including to override this #ifndef stbtt_uint8 typedef unsigned char stbtt_uint8; typedef signed char stbtt_int8; typedef unsigned short stbtt_uint16; typedef signed short stbtt_int16; typedef unsigned int stbtt_uint32; typedef signed int stbtt_int32; #endif typedef char stbtt__check_size32[sizeof(stbtt_int32)==4 ? 1 : -1]; typedef char stbtt__check_size16[sizeof(stbtt_int16)==2 ? 1 : -1]; // e.g. #define your own STBTT_ifloor/STBTT_iceil() to avoid math.h #ifndef STBTT_ifloor #include #define STBTT_ifloor(x) ((int) floor(x)) #define STBTT_iceil(x) ((int) ceil(x)) #endif #ifndef STBTT_sqrt #include #define STBTT_sqrt(x) sqrt(x) #define STBTT_pow(x,y) pow(x,y) #endif #ifndef STBTT_fmod #include #define STBTT_fmod(x,y) fmod(x,y) #endif #ifndef STBTT_cos #include #define STBTT_cos(x) cos(x) #define STBTT_acos(x) acos(x) #endif #ifndef STBTT_fabs #include #define STBTT_fabs(x) fabs(x) #endif // #define your own functions "STBTT_malloc" / "STBTT_free" to avoid malloc.h #ifndef STBTT_malloc #include #define STBTT_malloc(x,u) ((void)(u),malloc(x)) #define STBTT_free(x,u) ((void)(u),free(x)) #endif #ifndef STBTT_assert #include #define STBTT_assert(x) assert(x) #endif #ifndef STBTT_strlen #include #define STBTT_strlen(x) strlen(x) #endif #ifndef STBTT_memcpy #include #define STBTT_memcpy memcpy #define STBTT_memset memset #endif #endif /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// //// //// INTERFACE //// //// #ifndef __STB_INCLUDE_STB_TRUETYPE_H__ #define __STB_INCLUDE_STB_TRUETYPE_H__ #ifdef STBTT_STATIC #define STBTT_DEF static #else #define STBTT_DEF extern #endif #ifdef __cplusplus extern "C" { #endif // private structure typedef struct { unsigned char *data; int cursor; int size; } stbtt__buf; ////////////////////////////////////////////////////////////////////////////// // // TEXTURE BAKING API // // If you use this API, you only have to call two functions ever. // typedef struct { unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap float xoff,yoff,xadvance; } stbtt_bakedchar; STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) float pixel_height, // height of font in pixels unsigned char *pixels, int pw, int ph, // bitmap to be filled in int first_char, int num_chars, // characters to bake stbtt_bakedchar *chardata); // you allocate this, it's num_chars long // if return is positive, the first unused row of the bitmap // if return is negative, returns the negative of the number of characters that fit // if return is 0, no characters fit and no rows were used // This uses a very crappy packing. typedef struct { float x0,y0,s0,t0; // top-left float x1,y1,s1,t1; // bottom-right } stbtt_aligned_quad; STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, // same data as above int char_index, // character to display float *xpos, float *ypos, // pointers to current position in screen pixel space stbtt_aligned_quad *q, // output: quad to draw int opengl_fillrule); // true if opengl fill rule; false if DX9 or earlier // Call GetBakedQuad with char_index = 'character - first_char', and it // creates the quad you need to draw and advances the current position. // // The coordinate system used assumes y increases downwards. // // Characters will extend both above and below the current position; // see discussion of "BASELINE" above. // // It's inefficient; you might want to c&p it and optimize it. STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap); // Query the font vertical metrics without having to create a font first. ////////////////////////////////////////////////////////////////////////////// // // NEW TEXTURE BAKING API // // This provides options for packing multiple fonts into one atlas, not // perfectly but better than nothing. typedef struct { unsigned short x0,y0,x1,y1; // coordinates of bbox in bitmap float xoff,yoff,xadvance; float xoff2,yoff2; } stbtt_packedchar; typedef struct stbtt_pack_context stbtt_pack_context; typedef struct stbtt_fontinfo stbtt_fontinfo; #ifndef STB_RECT_PACK_VERSION typedef struct stbrp_rect stbrp_rect; #endif STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int width, int height, int stride_in_bytes, int padding, void *alloc_context); // Initializes a packing context stored in the passed-in stbtt_pack_context. // Future calls using this context will pack characters into the bitmap passed // in here: a 1-channel bitmap that is width * height. stride_in_bytes is // the distance from one row to the next (or 0 to mean they are packed tightly // together). "padding" is the amount of padding to leave between each // character (normally you want '1' for bitmaps you'll use as textures with // bilinear filtering). // // Returns 0 on failure, 1 on success. STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc); // Cleans up the packing context and frees all memory. #define STBTT_POINT_SIZE(x) (-(x)) STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, int first_unicode_char_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range); // Creates character bitmaps from the font_index'th font found in fontdata (use // font_index=0 if you don't know what that is). It creates num_chars_in_range // bitmaps for characters with unicode values starting at first_unicode_char_in_range // and increasing. Data for how to render them is stored in chardata_for_range; // pass these to stbtt_GetPackedQuad to get back renderable quads. // // font_size is the full height of the character from ascender to descender, // as computed by stbtt_ScaleForPixelHeight. To use a point size as computed // by stbtt_ScaleForMappingEmToPixels, wrap the point size in STBTT_POINT_SIZE() // and pass that result as 'font_size': // ..., 20 , ... // font max minus min y is 20 pixels tall // ..., STBTT_POINT_SIZE(20), ... // 'M' is 20 pixels tall typedef struct { float font_size; int first_unicode_codepoint_in_range; // if non-zero, then the chars are continuous, and this is the first codepoint int *array_of_unicode_codepoints; // if non-zero, then this is an array of unicode codepoints int num_chars; stbtt_packedchar *chardata_for_range; // output unsigned char h_oversample, v_oversample; // don't set these, they're used internally } stbtt_pack_range; STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges); // Creates character bitmaps from multiple ranges of characters stored in // ranges. This will usually create a better-packed bitmap than multiple // calls to stbtt_PackFontRange. Note that you can call this multiple // times within a single PackBegin/PackEnd. STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample); // Oversampling a font increases the quality by allowing higher-quality subpixel // positioning, and is especially valuable at smaller text sizes. // // This function sets the amount of oversampling for all following calls to // stbtt_PackFontRange(s) or stbtt_PackFontRangesGatherRects for a given // pack context. The default (no oversampling) is achieved by h_oversample=1 // and v_oversample=1. The total number of pixels required is // h_oversample*v_oversample larger than the default; for example, 2x2 // oversampling requires 4x the storage of 1x1. For best results, render // oversampled textures with bilinear filtering. Look at the readme in // stb/tests/oversample for information about oversampled fonts // // To use with PackFontRangesGather etc., you must set it before calls // call to PackFontRangesGatherRects. STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip); // If skip != 0, this tells stb_truetype to skip any codepoints for which // there is no corresponding glyph. If skip=0, which is the default, then // codepoints without a glyph recived the font's "missing character" glyph, // typically an empty box by convention. STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above int char_index, // character to display float *xpos, float *ypos, // pointers to current position in screen pixel space stbtt_aligned_quad *q, // output: quad to draw int align_to_integer); STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects); STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects); // Calling these functions in sequence is roughly equivalent to calling // stbtt_PackFontRanges(). If you more control over the packing of multiple // fonts, or if you want to pack custom data into a font texture, take a look // at the source to of stbtt_PackFontRanges() and create a custom version // using these functions, e.g. call GatherRects multiple times, // building up a single array of rects, then call PackRects once, // then call RenderIntoRects repeatedly. This may result in a // better packing than calling PackFontRanges multiple times // (or it may not). // this is an opaque structure that you shouldn't mess with which holds // all the context needed from PackBegin to PackEnd. struct stbtt_pack_context { void *user_allocator_context; void *pack_info; int width; int height; int stride_in_bytes; int padding; int skip_missing; unsigned int h_oversample, v_oversample; unsigned char *pixels; void *nodes; }; ////////////////////////////////////////////////////////////////////////////// // // FONT LOADING // // STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data); // This function will determine the number of fonts in a font file. TrueType // collection (.ttc) files may contain multiple fonts, while TrueType font // (.ttf) files only contain one font. The number of fonts can be used for // indexing with the previous function where the index is between zero and one // less than the total fonts. If an error occurs, -1 is returned. STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index); // Each .ttf/.ttc file may have more than one font. Each font has a sequential // index number starting from 0. Call this function to get the font offset for // a given index; it returns -1 if the index is out of range. A regular .ttf // file will only define one font and it always be at offset 0, so it will // return '0' for index 0, and -1 for all other indices. // The following structure is defined publicly so you can declare one on // the stack or as a global or etc, but you should treat it as opaque. struct stbtt_fontinfo { void * userdata; unsigned char * data; // pointer to .ttf file int fontstart; // offset of start of font int numGlyphs; // number of glyphs, needed for range checking int loca,head,glyf,hhea,hmtx,kern,gpos,svg; // table locations as offset from start of .ttf int index_map; // a cmap mapping for our chosen character encoding int indexToLocFormat; // format needed to map from glyph index to glyph stbtt__buf cff; // cff font data stbtt__buf charstrings; // the charstring index stbtt__buf gsubrs; // global charstring subroutines index stbtt__buf subrs; // private charstring subroutines index stbtt__buf fontdicts; // array of font dicts stbtt__buf fdselect; // map from glyph to fontdict }; STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset); // Given an offset into the file that defines a font, this function builds // the necessary cached info for the rest of the system. You must allocate // the stbtt_fontinfo yourself, and stbtt_InitFont will fill it out. You don't // need to do anything special to free it, because the contents are pure // value data with no additional data structures. Returns 0 on failure. ////////////////////////////////////////////////////////////////////////////// // // CHARACTER TO GLYPH-INDEX CONVERSIOn STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint); // If you're going to perform multiple operations on the same character // and you want a speed-up, call this function with the character you're // going to process, then use glyph-based functions instead of the // codepoint-based functions. // Returns 0 if the character codepoint is not defined in the font. ////////////////////////////////////////////////////////////////////////////// // // CHARACTER PROPERTIES // STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float pixels); // computes a scale factor to produce a font whose "height" is 'pixels' tall. // Height is measured as the distance from the highest ascender to the lowest // descender; in other words, it's equivalent to calling stbtt_GetFontVMetrics // and computing: // scale = pixels / (ascent - descent) // so if you prefer to measure height by the ascent only, use a similar calculation. STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels); // computes a scale factor to produce a font whose EM size is mapped to // 'pixels' tall. This is probably what traditional APIs compute, but // I'm not positive. STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap); // ascent is the coordinate above the baseline the font extends; descent // is the coordinate below the baseline the font extends (i.e. it is typically negative) // lineGap is the spacing between one row's descent and the next row's ascent... // so you should advance the vertical position by "*ascent - *descent + *lineGap" // these are expressed in unscaled coordinates, so you must multiply by // the scale factor for a given size STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap); // analogous to GetFontVMetrics, but returns the "typographic" values from the OS/2 // table (specific to MS/Windows TTF files). // // Returns 1 on success (table present), 0 on failure. STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1); // the bounding box around all possible characters STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing); // leftSideBearing is the offset from the current horizontal position to the left edge of the character // advanceWidth is the offset from the current horizontal position to the next horizontal position // these are expressed in unscaled coordinates STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2); // an additional amount to add to the 'advance' value between ch1 and ch2 STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1); // Gets the bounding box of the visible part of the glyph, in unscaled coordinates STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing); STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2); STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); // as above, but takes one or more glyph indices for greater efficiency typedef struct stbtt_kerningentry { int glyph1; // use stbtt_FindGlyphIndex int glyph2; int advance; } stbtt_kerningentry; STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info); STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length); // Retrieves a complete list of all of the kerning pairs provided by the font // stbtt_GetKerningTable never writes more than table_length entries and returns how many entries it did write. // The table will be sorted by (a.glyph1 == b.glyph1)?(a.glyph2 < b.glyph2):(a.glyph1 < b.glyph1) ////////////////////////////////////////////////////////////////////////////// // // GLYPH SHAPES (you probably don't need these, but they have to go before // the bitmaps for C declaration-order reasons) // #ifndef STBTT_vmove // you can predefine these to use different values (but why?) enum { STBTT_vmove=1, STBTT_vline, STBTT_vcurve, STBTT_vcubic }; #endif #ifndef stbtt_vertex // you can predefine this to use different values // (we share this with other code at RAD) #define stbtt_vertex_type short // can't use stbtt_int16 because that's not visible in the header file typedef struct { stbtt_vertex_type x,y,cx,cy,cx1,cy1; unsigned char type,padding; } stbtt_vertex; #endif STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index); // returns non-zero if nothing is drawn for this glyph STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices); STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **vertices); // returns # of vertices and fills *vertices with the pointer to them // these are expressed in "unscaled" coordinates // // The shape is a series of contours. Each one starts with // a STBTT_moveto, then consists of a series of mixed // STBTT_lineto and STBTT_curveto segments. A lineto // draws a line from previous endpoint to its x,y; a curveto // draws a quadratic bezier from previous endpoint to // its x,y, using cx,cy as the bezier control point. STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *vertices); // frees the data allocated above STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg); STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg); // fills svg with the character's SVG data. // returns data size or 0 if SVG not found. ////////////////////////////////////////////////////////////////////////////// // // BITMAP RENDERING // STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata); // frees the bitmap allocated below STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff); // allocates a large-enough single-channel 8bpp bitmap and renders the // specified character/glyph at the specified scale into it, with // antialiasing. 0 is no coverage (transparent), 255 is fully covered (opaque). // *width & *height are filled out with the width & height of the bitmap, // which is stored left-to-right, top-to-bottom. // // xoff/yoff are the offset it pixel space from the glyph origin to the top-left of the bitmap STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff); // the same as stbtt_GetCodepoitnBitmap, but you can specify a subpixel // shift for the character STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint); // the same as stbtt_GetCodepointBitmap, but you pass in storage for the bitmap // in the form of 'output', with row spacing of 'out_stride' bytes. the bitmap // is clipped to out_w/out_h bytes. Call stbtt_GetCodepointBitmapBox to get the // width and height and positioning info for it first. STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint); // same as stbtt_MakeCodepointBitmap, but you can specify a subpixel // shift for the character STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint); // same as stbtt_MakeCodepointBitmapSubpixel, but prefiltering // is performed (see stbtt_PackSetOversampling) STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); // get the bbox of the bitmap centered around the glyph origin; so the // bitmap width is ix1-ix0, height is iy1-iy0, and location to place // the bitmap top left is (leftSideBearing*scale,iy0). // (Note that the bitmap uses y-increases-down, but the shape uses // y-increases-up, so CodepointBitmapBox and CodepointBox are inverted.) STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); // same as stbtt_GetCodepointBitmapBox, but you can specify a subpixel // shift for the character // the following functions are equivalent to the above functions, but operate // on glyph indices instead of Unicode codepoints (for efficiency) STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff); STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff); STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph); STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph); STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int glyph); STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1); STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1); // @TODO: don't expose this structure typedef struct { int w,h,stride; unsigned char *pixels; } stbtt__bitmap; // rasterize a shape with quadratic beziers into a bitmap STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, // 1-channel bitmap to draw into float flatness_in_pixels, // allowable error of curve in pixels stbtt_vertex *vertices, // array of vertices defining shape int num_verts, // number of vertices in above array float scale_x, float scale_y, // scale applied to input vertices float shift_x, float shift_y, // translation applied to input vertices int x_off, int y_off, // another translation applied to input int invert, // if non-zero, vertically flip shape void *userdata); // context for to STBTT_MALLOC ////////////////////////////////////////////////////////////////////////////// // // Signed Distance Function (or Field) rendering STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata); // frees the SDF bitmap allocated below STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff); // These functions compute a discretized SDF field for a single character, suitable for storing // in a single-channel texture, sampling with bilinear filtering, and testing against // larger than some threshold to produce scalable fonts. // info -- the font // scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap // glyph/codepoint -- the character to generate the SDF for // padding -- extra "pixels" around the character which are filled with the distance to the character (not 0), // which allows effects like bit outlines // onedge_value -- value 0-255 to test the SDF against to reconstruct the character (i.e. the isocontour of the character) // pixel_dist_scale -- what value the SDF should increase by when moving one SDF "pixel" away from the edge (on the 0..255 scale) // if positive, > onedge_value is inside; if negative, < onedge_value is inside // width,height -- output height & width of the SDF bitmap (including padding) // xoff,yoff -- output origin of the character // return value -- a 2D array of bytes 0..255, width*height in size // // pixel_dist_scale & onedge_value are a scale & bias that allows you to make // optimal use of the limited 0..255 for your application, trading off precision // and special effects. SDF values outside the range 0..255 are clamped to 0..255. // // Example: // scale = stbtt_ScaleForPixelHeight(22) // padding = 5 // onedge_value = 180 // pixel_dist_scale = 180/5.0 = 36.0 // // This will create an SDF bitmap in which the character is about 22 pixels // high but the whole bitmap is about 22+5+5=32 pixels high. To produce a filled // shape, sample the SDF at each pixel and fill the pixel if the SDF value // is greater than or equal to 180/255. (You'll actually want to antialias, // which is beyond the scope of this example.) Additionally, you can compute // offset outlines (e.g. to stroke the character border inside & outside, // or only outside). For example, to fill outside the character up to 3 SDF // pixels, you would compare against (180-36.0*3)/255 = 72/255. The above // choice of variables maps a range from 5 pixels outside the shape to // 2 pixels inside the shape to 0..255; this is intended primarily for apply // outside effects only (the interior range is needed to allow proper // antialiasing of the font at *smaller* sizes) // // The function computes the SDF analytically at each SDF pixel, not by e.g. // building a higher-res bitmap and approximating it. In theory the quality // should be as high as possible for an SDF of this size & representation, but // unclear if this is true in practice (perhaps building a higher-res bitmap // and computing from that can allow drop-out prevention). // // The algorithm has not been optimized at all, so expect it to be slow // if computing lots of characters or very large sizes. ////////////////////////////////////////////////////////////////////////////// // // Finding the right font... // // You should really just solve this offline, keep your own tables // of what font is what, and don't try to get it out of the .ttf file. // That's because getting it out of the .ttf file is really hard, because // the names in the file can appear in many possible encodings, in many // possible languages, and e.g. if you need a case-insensitive comparison, // the details of that depend on the encoding & language in a complex way // (actually underspecified in truetype, but also gigantic). // // But you can use the provided functions in two possible ways: // stbtt_FindMatchingFont() will use *case-sensitive* comparisons on // unicode-encoded names to try to find the font you want; // you can run this before calling stbtt_InitFont() // // stbtt_GetFontNameString() lets you get any of the various strings // from the file yourself and do your own comparisons on them. // You have to have called stbtt_InitFont() first. STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags); // returns the offset (not index) of the font that matches, or -1 if none // if you use STBTT_MACSTYLE_DONTCARE, use a font name like "Arial Bold". // if you use any other flag, use a font name like "Arial"; this checks // the 'macStyle' header field; i don't know if fonts set this consistently #define STBTT_MACSTYLE_DONTCARE 0 #define STBTT_MACSTYLE_BOLD 1 #define STBTT_MACSTYLE_ITALIC 2 #define STBTT_MACSTYLE_UNDERSCORE 4 #define STBTT_MACSTYLE_NONE 8 // <= not same as 0, this makes us check the bitfield is 0 STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2); // returns 1/0 whether the first string interpreted as utf8 is identical to // the second string interpreted as big-endian utf16... useful for strings from next func STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID); // returns the string (which may be big-endian double byte, e.g. for unicode) // and puts the length in bytes in *length. // // some of the values for the IDs are below; for more see the truetype spec: // http://developer.apple.com/textfonts/TTRefMan/RM06/Chap6name.html // http://www.microsoft.com/typography/otspec/name.htm enum { // platformID STBTT_PLATFORM_ID_UNICODE =0, STBTT_PLATFORM_ID_MAC =1, STBTT_PLATFORM_ID_ISO =2, STBTT_PLATFORM_ID_MICROSOFT =3 }; enum { // encodingID for STBTT_PLATFORM_ID_UNICODE STBTT_UNICODE_EID_UNICODE_1_0 =0, STBTT_UNICODE_EID_UNICODE_1_1 =1, STBTT_UNICODE_EID_ISO_10646 =2, STBTT_UNICODE_EID_UNICODE_2_0_BMP=3, STBTT_UNICODE_EID_UNICODE_2_0_FULL=4 }; enum { // encodingID for STBTT_PLATFORM_ID_MICROSOFT STBTT_MS_EID_SYMBOL =0, STBTT_MS_EID_UNICODE_BMP =1, STBTT_MS_EID_SHIFTJIS =2, STBTT_MS_EID_UNICODE_FULL =10 }; enum { // encodingID for STBTT_PLATFORM_ID_MAC; same as Script Manager codes STBTT_MAC_EID_ROMAN =0, STBTT_MAC_EID_ARABIC =4, STBTT_MAC_EID_JAPANESE =1, STBTT_MAC_EID_HEBREW =5, STBTT_MAC_EID_CHINESE_TRAD =2, STBTT_MAC_EID_GREEK =6, STBTT_MAC_EID_KOREAN =3, STBTT_MAC_EID_RUSSIAN =7 }; enum { // languageID for STBTT_PLATFORM_ID_MICROSOFT; same as LCID... // problematic because there are e.g. 16 english LCIDs and 16 arabic LCIDs STBTT_MS_LANG_ENGLISH =0x0409, STBTT_MS_LANG_ITALIAN =0x0410, STBTT_MS_LANG_CHINESE =0x0804, STBTT_MS_LANG_JAPANESE =0x0411, STBTT_MS_LANG_DUTCH =0x0413, STBTT_MS_LANG_KOREAN =0x0412, STBTT_MS_LANG_FRENCH =0x040c, STBTT_MS_LANG_RUSSIAN =0x0419, STBTT_MS_LANG_GERMAN =0x0407, STBTT_MS_LANG_SPANISH =0x0409, STBTT_MS_LANG_HEBREW =0x040d, STBTT_MS_LANG_SWEDISH =0x041D }; enum { // languageID for STBTT_PLATFORM_ID_MAC STBTT_MAC_LANG_ENGLISH =0 , STBTT_MAC_LANG_JAPANESE =11, STBTT_MAC_LANG_ARABIC =12, STBTT_MAC_LANG_KOREAN =23, STBTT_MAC_LANG_DUTCH =4 , STBTT_MAC_LANG_RUSSIAN =32, STBTT_MAC_LANG_FRENCH =1 , STBTT_MAC_LANG_SPANISH =6 , STBTT_MAC_LANG_GERMAN =2 , STBTT_MAC_LANG_SWEDISH =5 , STBTT_MAC_LANG_HEBREW =10, STBTT_MAC_LANG_CHINESE_SIMPLIFIED =33, STBTT_MAC_LANG_ITALIAN =3 , STBTT_MAC_LANG_CHINESE_TRAD =19 }; #ifdef __cplusplus } #endif #endif // __STB_INCLUDE_STB_TRUETYPE_H__ /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// //// //// IMPLEMENTATION //// //// #ifdef STB_TRUETYPE_IMPLEMENTATION #ifndef STBTT_MAX_OVERSAMPLE #define STBTT_MAX_OVERSAMPLE 8 #endif #if STBTT_MAX_OVERSAMPLE > 255 #error "STBTT_MAX_OVERSAMPLE cannot be > 255" #endif typedef int stbtt__test_oversample_pow2[(STBTT_MAX_OVERSAMPLE & (STBTT_MAX_OVERSAMPLE-1)) == 0 ? 1 : -1]; #ifndef STBTT_RASTERIZER_VERSION #define STBTT_RASTERIZER_VERSION 2 #endif #ifdef _MSC_VER #define STBTT__NOTUSED(v) (void)(v) #else #define STBTT__NOTUSED(v) (void)sizeof(v) #endif ////////////////////////////////////////////////////////////////////////// // // stbtt__buf helpers to parse data from file // static stbtt_uint8 stbtt__buf_get8(stbtt__buf *b) { if (b->cursor >= b->size) return 0; return b->data[b->cursor++]; } static stbtt_uint8 stbtt__buf_peek8(stbtt__buf *b) { if (b->cursor >= b->size) return 0; return b->data[b->cursor]; } static void stbtt__buf_seek(stbtt__buf *b, int o) { STBTT_assert(!(o > b->size || o < 0)); b->cursor = (o > b->size || o < 0) ? b->size : o; } static void stbtt__buf_skip(stbtt__buf *b, int o) { stbtt__buf_seek(b, b->cursor + o); } static stbtt_uint32 stbtt__buf_get(stbtt__buf *b, int n) { stbtt_uint32 v = 0; int i; STBTT_assert(n >= 1 && n <= 4); for (i = 0; i < n; i++) v = (v << 8) | stbtt__buf_get8(b); return v; } static stbtt__buf stbtt__new_buf(const void *p, size_t size) { stbtt__buf r; STBTT_assert(size < 0x40000000); r.data = (stbtt_uint8*) p; r.size = (int) size; r.cursor = 0; return r; } #define stbtt__buf_get16(b) stbtt__buf_get((b), 2) #define stbtt__buf_get32(b) stbtt__buf_get((b), 4) static stbtt__buf stbtt__buf_range(const stbtt__buf *b, int o, int s) { stbtt__buf r = stbtt__new_buf(NULL, 0); if (o < 0 || s < 0 || o > b->size || s > b->size - o) return r; r.data = b->data + o; r.size = s; return r; } static stbtt__buf stbtt__cff_get_index(stbtt__buf *b) { int count, start, offsize; start = b->cursor; count = stbtt__buf_get16(b); if (count) { offsize = stbtt__buf_get8(b); STBTT_assert(offsize >= 1 && offsize <= 4); stbtt__buf_skip(b, offsize * count); stbtt__buf_skip(b, stbtt__buf_get(b, offsize) - 1); } return stbtt__buf_range(b, start, b->cursor - start); } static stbtt_uint32 stbtt__cff_int(stbtt__buf *b) { int b0 = stbtt__buf_get8(b); if (b0 >= 32 && b0 <= 246) return b0 - 139; else if (b0 >= 247 && b0 <= 250) return (b0 - 247)*256 + stbtt__buf_get8(b) + 108; else if (b0 >= 251 && b0 <= 254) return -(b0 - 251)*256 - stbtt__buf_get8(b) - 108; else if (b0 == 28) return stbtt__buf_get16(b); else if (b0 == 29) return stbtt__buf_get32(b); STBTT_assert(0); return 0; } static void stbtt__cff_skip_operand(stbtt__buf *b) { int v, b0 = stbtt__buf_peek8(b); STBTT_assert(b0 >= 28); if (b0 == 30) { stbtt__buf_skip(b, 1); while (b->cursor < b->size) { v = stbtt__buf_get8(b); if ((v & 0xF) == 0xF || (v >> 4) == 0xF) break; } } else { stbtt__cff_int(b); } } static stbtt__buf stbtt__dict_get(stbtt__buf *b, int key) { stbtt__buf_seek(b, 0); while (b->cursor < b->size) { int start = b->cursor, end, op; while (stbtt__buf_peek8(b) >= 28) stbtt__cff_skip_operand(b); end = b->cursor; op = stbtt__buf_get8(b); if (op == 12) op = stbtt__buf_get8(b) | 0x100; if (op == key) return stbtt__buf_range(b, start, end-start); } return stbtt__buf_range(b, 0, 0); } static void stbtt__dict_get_ints(stbtt__buf *b, int key, int outcount, stbtt_uint32 *out) { int i; stbtt__buf operands = stbtt__dict_get(b, key); for (i = 0; i < outcount && operands.cursor < operands.size; i++) out[i] = stbtt__cff_int(&operands); } static int stbtt__cff_index_count(stbtt__buf *b) { stbtt__buf_seek(b, 0); return stbtt__buf_get16(b); } static stbtt__buf stbtt__cff_index_get(stbtt__buf b, int i) { int count, offsize, start, end; stbtt__buf_seek(&b, 0); count = stbtt__buf_get16(&b); offsize = stbtt__buf_get8(&b); STBTT_assert(i >= 0 && i < count); STBTT_assert(offsize >= 1 && offsize <= 4); stbtt__buf_skip(&b, i*offsize); start = stbtt__buf_get(&b, offsize); end = stbtt__buf_get(&b, offsize); return stbtt__buf_range(&b, 2+(count+1)*offsize+start, end - start); } ////////////////////////////////////////////////////////////////////////// // // accessors to parse data from file // // on platforms that don't allow misaligned reads, if we want to allow // truetype fonts that aren't padded to alignment, define ALLOW_UNALIGNED_TRUETYPE #define ttBYTE(p) (* (stbtt_uint8 *) (p)) #define ttCHAR(p) (* (stbtt_int8 *) (p)) #define ttFixed(p) ttLONG(p) static stbtt_uint16 ttUSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } static stbtt_int16 ttSHORT(stbtt_uint8 *p) { return p[0]*256 + p[1]; } static stbtt_uint32 ttULONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } static stbtt_int32 ttLONG(stbtt_uint8 *p) { return (p[0]<<24) + (p[1]<<16) + (p[2]<<8) + p[3]; } #define stbtt_tag4(p,c0,c1,c2,c3) ((p)[0] == (c0) && (p)[1] == (c1) && (p)[2] == (c2) && (p)[3] == (c3)) #define stbtt_tag(p,str) stbtt_tag4(p,str[0],str[1],str[2],str[3]) static int stbtt__isfont(stbtt_uint8 *font) { // check the version number if (stbtt_tag4(font, '1',0,0,0)) return 1; // TrueType 1 if (stbtt_tag(font, "typ1")) return 1; // TrueType with type 1 font -- we don't support this! if (stbtt_tag(font, "OTTO")) return 1; // OpenType with CFF if (stbtt_tag4(font, 0,1,0,0)) return 1; // OpenType 1.0 if (stbtt_tag(font, "true")) return 1; // Apple specification for TrueType fonts return 0; } // @OPTIMIZE: binary search static stbtt_uint32 stbtt__find_table(stbtt_uint8 *data, stbtt_uint32 fontstart, const char *tag) { stbtt_int32 num_tables = ttUSHORT(data+fontstart+4); stbtt_uint32 tabledir = fontstart + 12; stbtt_int32 i; for (i=0; i < num_tables; ++i) { stbtt_uint32 loc = tabledir + 16*i; if (stbtt_tag(data+loc+0, tag)) return ttULONG(data+loc+8); } return 0; } static int stbtt_GetFontOffsetForIndex_internal(unsigned char *font_collection, int index) { // if it's just a font, there's only one valid index if (stbtt__isfont(font_collection)) return index == 0 ? 0 : -1; // check if it's a TTC if (stbtt_tag(font_collection, "ttcf")) { // version 1? if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { stbtt_int32 n = ttLONG(font_collection+8); if (index >= n) return -1; return ttULONG(font_collection+12+index*4); } } return -1; } static int stbtt_GetNumberOfFonts_internal(unsigned char *font_collection) { // if it's just a font, there's only one valid font if (stbtt__isfont(font_collection)) return 1; // check if it's a TTC if (stbtt_tag(font_collection, "ttcf")) { // version 1? if (ttULONG(font_collection+4) == 0x00010000 || ttULONG(font_collection+4) == 0x00020000) { return ttLONG(font_collection+8); } } return 0; } static stbtt__buf stbtt__get_subrs(stbtt__buf cff, stbtt__buf fontdict) { stbtt_uint32 subrsoff = 0, private_loc[2] = { 0, 0 }; stbtt__buf pdict; stbtt__dict_get_ints(&fontdict, 18, 2, private_loc); if (!private_loc[1] || !private_loc[0]) return stbtt__new_buf(NULL, 0); pdict = stbtt__buf_range(&cff, private_loc[1], private_loc[0]); stbtt__dict_get_ints(&pdict, 19, 1, &subrsoff); if (!subrsoff) return stbtt__new_buf(NULL, 0); stbtt__buf_seek(&cff, private_loc[1]+subrsoff); return stbtt__cff_get_index(&cff); } // since most people won't use this, find this table the first time it's needed static int stbtt__get_svg(stbtt_fontinfo *info) { stbtt_uint32 t; if (info->svg < 0) { t = stbtt__find_table(info->data, info->fontstart, "SVG "); if (t) { stbtt_uint32 offset = ttULONG(info->data + t + 2); info->svg = t + offset; } else { info->svg = 0; } } return info->svg; } static int stbtt_InitFont_internal(stbtt_fontinfo *info, unsigned char *data, int fontstart) { stbtt_uint32 cmap, t; stbtt_int32 i,numTables; info->data = data; info->fontstart = fontstart; info->cff = stbtt__new_buf(NULL, 0); cmap = stbtt__find_table(data, fontstart, "cmap"); // required info->loca = stbtt__find_table(data, fontstart, "loca"); // required info->head = stbtt__find_table(data, fontstart, "head"); // required info->glyf = stbtt__find_table(data, fontstart, "glyf"); // required info->hhea = stbtt__find_table(data, fontstart, "hhea"); // required info->hmtx = stbtt__find_table(data, fontstart, "hmtx"); // required info->kern = stbtt__find_table(data, fontstart, "kern"); // not required info->gpos = stbtt__find_table(data, fontstart, "GPOS"); // not required if (!cmap || !info->head || !info->hhea || !info->hmtx) return 0; if (info->glyf) { // required for truetype if (!info->loca) return 0; } else { // initialization for CFF / Type2 fonts (OTF) stbtt__buf b, topdict, topdictidx; stbtt_uint32 cstype = 2, charstrings = 0, fdarrayoff = 0, fdselectoff = 0; stbtt_uint32 cff; cff = stbtt__find_table(data, fontstart, "CFF "); if (!cff) return 0; info->fontdicts = stbtt__new_buf(NULL, 0); info->fdselect = stbtt__new_buf(NULL, 0); // @TODO this should use size from table (not 512MB) info->cff = stbtt__new_buf(data+cff, 512*1024*1024); b = info->cff; // read the header stbtt__buf_skip(&b, 2); stbtt__buf_seek(&b, stbtt__buf_get8(&b)); // hdrsize // @TODO the name INDEX could list multiple fonts, // but we just use the first one. stbtt__cff_get_index(&b); // name INDEX topdictidx = stbtt__cff_get_index(&b); topdict = stbtt__cff_index_get(topdictidx, 0); stbtt__cff_get_index(&b); // string INDEX info->gsubrs = stbtt__cff_get_index(&b); stbtt__dict_get_ints(&topdict, 17, 1, &charstrings); stbtt__dict_get_ints(&topdict, 0x100 | 6, 1, &cstype); stbtt__dict_get_ints(&topdict, 0x100 | 36, 1, &fdarrayoff); stbtt__dict_get_ints(&topdict, 0x100 | 37, 1, &fdselectoff); info->subrs = stbtt__get_subrs(b, topdict); // we only support Type 2 charstrings if (cstype != 2) return 0; if (charstrings == 0) return 0; if (fdarrayoff) { // looks like a CID font if (!fdselectoff) return 0; stbtt__buf_seek(&b, fdarrayoff); info->fontdicts = stbtt__cff_get_index(&b); info->fdselect = stbtt__buf_range(&b, fdselectoff, b.size-fdselectoff); } stbtt__buf_seek(&b, charstrings); info->charstrings = stbtt__cff_get_index(&b); } t = stbtt__find_table(data, fontstart, "maxp"); if (t) info->numGlyphs = ttUSHORT(data+t+4); else info->numGlyphs = 0xffff; info->svg = -1; // find a cmap encoding table we understand *now* to avoid searching // later. (todo: could make this installable) // the same regardless of glyph. numTables = ttUSHORT(data + cmap + 2); info->index_map = 0; for (i=0; i < numTables; ++i) { stbtt_uint32 encoding_record = cmap + 4 + 8 * i; // find an encoding we understand: switch(ttUSHORT(data+encoding_record)) { case STBTT_PLATFORM_ID_MICROSOFT: switch (ttUSHORT(data+encoding_record+2)) { case STBTT_MS_EID_UNICODE_BMP: case STBTT_MS_EID_UNICODE_FULL: // MS/Unicode info->index_map = cmap + ttULONG(data+encoding_record+4); break; } break; case STBTT_PLATFORM_ID_UNICODE: // Mac/iOS has these // all the encodingIDs are unicode, so we don't bother to check it info->index_map = cmap + ttULONG(data+encoding_record+4); break; } } if (info->index_map == 0) return 0; info->indexToLocFormat = ttUSHORT(data+info->head + 50); return 1; } STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codepoint) { stbtt_uint8 *data = info->data; stbtt_uint32 index_map = info->index_map; stbtt_uint16 format = ttUSHORT(data + index_map + 0); if (format == 0) { // apple byte encoding stbtt_int32 bytes = ttUSHORT(data + index_map + 2); if (unicode_codepoint < bytes-6) return ttBYTE(data + index_map + 6 + unicode_codepoint); return 0; } else if (format == 6) { stbtt_uint32 first = ttUSHORT(data + index_map + 6); stbtt_uint32 count = ttUSHORT(data + index_map + 8); if ((stbtt_uint32) unicode_codepoint >= first && (stbtt_uint32) unicode_codepoint < first+count) return ttUSHORT(data + index_map + 10 + (unicode_codepoint - first)*2); return 0; } else if (format == 2) { STBTT_assert(0); // @TODO: high-byte mapping for japanese/chinese/korean return 0; } else if (format == 4) { // standard mapping for windows fonts: binary search collection of ranges stbtt_uint16 segcount = ttUSHORT(data+index_map+6) >> 1; stbtt_uint16 searchRange = ttUSHORT(data+index_map+8) >> 1; stbtt_uint16 entrySelector = ttUSHORT(data+index_map+10); stbtt_uint16 rangeShift = ttUSHORT(data+index_map+12) >> 1; // do a binary search of the segments stbtt_uint32 endCount = index_map + 14; stbtt_uint32 search = endCount; if (unicode_codepoint > 0xffff) return 0; // they lie from endCount .. endCount + segCount // but searchRange is the nearest power of two, so... if (unicode_codepoint >= ttUSHORT(data + search + rangeShift*2)) search += rangeShift*2; // now decrement to bias correctly to find smallest search -= 2; while (entrySelector) { stbtt_uint16 end; searchRange >>= 1; end = ttUSHORT(data + search + searchRange*2); if (unicode_codepoint > end) search += searchRange*2; --entrySelector; } search += 2; { stbtt_uint16 offset, start; stbtt_uint16 item = (stbtt_uint16) ((search - endCount) >> 1); STBTT_assert(unicode_codepoint <= ttUSHORT(data + endCount + 2*item)); start = ttUSHORT(data + index_map + 14 + segcount*2 + 2 + 2*item); if (unicode_codepoint < start) return 0; offset = ttUSHORT(data + index_map + 14 + segcount*6 + 2 + 2*item); if (offset == 0) return (stbtt_uint16) (unicode_codepoint + ttSHORT(data + index_map + 14 + segcount*4 + 2 + 2*item)); return ttUSHORT(data + offset + (unicode_codepoint-start)*2 + index_map + 14 + segcount*6 + 2 + 2*item); } } else if (format == 12 || format == 13) { stbtt_uint32 ngroups = ttULONG(data+index_map+12); stbtt_int32 low,high; low = 0; high = (stbtt_int32)ngroups; // Binary search the right group. while (low < high) { stbtt_int32 mid = low + ((high-low) >> 1); // rounds down, so low <= mid < high stbtt_uint32 start_char = ttULONG(data+index_map+16+mid*12); stbtt_uint32 end_char = ttULONG(data+index_map+16+mid*12+4); if ((stbtt_uint32) unicode_codepoint < start_char) high = mid; else if ((stbtt_uint32) unicode_codepoint > end_char) low = mid+1; else { stbtt_uint32 start_glyph = ttULONG(data+index_map+16+mid*12+8); if (format == 12) return start_glyph + unicode_codepoint-start_char; else // format == 13 return start_glyph; } } return 0; // not found } // @TODO STBTT_assert(0); return 0; } STBTT_DEF int stbtt_GetCodepointShape(const stbtt_fontinfo *info, int unicode_codepoint, stbtt_vertex **vertices) { return stbtt_GetGlyphShape(info, stbtt_FindGlyphIndex(info, unicode_codepoint), vertices); } static void stbtt_setvertex(stbtt_vertex *v, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy) { v->type = type; v->x = (stbtt_int16) x; v->y = (stbtt_int16) y; v->cx = (stbtt_int16) cx; v->cy = (stbtt_int16) cy; } static int stbtt__GetGlyfOffset(const stbtt_fontinfo *info, int glyph_index) { int g1,g2; STBTT_assert(!info->cff.size); if (glyph_index >= info->numGlyphs) return -1; // glyph index out of range if (info->indexToLocFormat >= 2) return -1; // unknown index->glyph map format if (info->indexToLocFormat == 0) { g1 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2) * 2; g2 = info->glyf + ttUSHORT(info->data + info->loca + glyph_index * 2 + 2) * 2; } else { g1 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4); g2 = info->glyf + ttULONG (info->data + info->loca + glyph_index * 4 + 4); } return g1==g2 ? -1 : g1; // if length is 0, return -1 } static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1); STBTT_DEF int stbtt_GetGlyphBox(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) { if (info->cff.size) { stbtt__GetGlyphInfoT2(info, glyph_index, x0, y0, x1, y1); } else { int g = stbtt__GetGlyfOffset(info, glyph_index); if (g < 0) return 0; if (x0) *x0 = ttSHORT(info->data + g + 2); if (y0) *y0 = ttSHORT(info->data + g + 4); if (x1) *x1 = ttSHORT(info->data + g + 6); if (y1) *y1 = ttSHORT(info->data + g + 8); } return 1; } STBTT_DEF int stbtt_GetCodepointBox(const stbtt_fontinfo *info, int codepoint, int *x0, int *y0, int *x1, int *y1) { return stbtt_GetGlyphBox(info, stbtt_FindGlyphIndex(info,codepoint), x0,y0,x1,y1); } STBTT_DEF int stbtt_IsGlyphEmpty(const stbtt_fontinfo *info, int glyph_index) { stbtt_int16 numberOfContours; int g; if (info->cff.size) return stbtt__GetGlyphInfoT2(info, glyph_index, NULL, NULL, NULL, NULL) == 0; g = stbtt__GetGlyfOffset(info, glyph_index); if (g < 0) return 1; numberOfContours = ttSHORT(info->data + g); return numberOfContours == 0; } static int stbtt__close_shape(stbtt_vertex *vertices, int num_vertices, int was_off, int start_off, stbtt_int32 sx, stbtt_int32 sy, stbtt_int32 scx, stbtt_int32 scy, stbtt_int32 cx, stbtt_int32 cy) { if (start_off) { if (was_off) stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+scx)>>1, (cy+scy)>>1, cx,cy); stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, sx,sy,scx,scy); } else { if (was_off) stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve,sx,sy,cx,cy); else stbtt_setvertex(&vertices[num_vertices++], STBTT_vline,sx,sy,0,0); } return num_vertices; } static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) { stbtt_int16 numberOfContours; stbtt_uint8 *endPtsOfContours; stbtt_uint8 *data = info->data; stbtt_vertex *vertices=0; int num_vertices=0; int g = stbtt__GetGlyfOffset(info, glyph_index); *pvertices = NULL; if (g < 0) return 0; numberOfContours = ttSHORT(data + g); if (numberOfContours > 0) { stbtt_uint8 flags=0,flagcount; stbtt_int32 ins, i,j=0,m,n, next_move, was_off=0, off, start_off=0; stbtt_int32 x,y,cx,cy,sx,sy, scx,scy; stbtt_uint8 *points; endPtsOfContours = (data + g + 10); ins = ttUSHORT(data + g + 10 + numberOfContours * 2); points = data + g + 10 + numberOfContours * 2 + 2 + ins; n = 1+ttUSHORT(endPtsOfContours + numberOfContours*2-2); m = n + 2*numberOfContours; // a loose bound on how many vertices we might need vertices = (stbtt_vertex *) STBTT_malloc(m * sizeof(vertices[0]), info->userdata); if (vertices == 0) return 0; next_move = 0; flagcount=0; // in first pass, we load uninterpreted data into the allocated array // above, shifted to the end of the array so we won't overwrite it when // we create our final data starting from the front off = m - n; // starting offset for uninterpreted data, regardless of how m ends up being calculated // first load flags for (i=0; i < n; ++i) { if (flagcount == 0) { flags = *points++; if (flags & 8) flagcount = *points++; } else --flagcount; vertices[off+i].type = flags; } // now load x coordinates x=0; for (i=0; i < n; ++i) { flags = vertices[off+i].type; if (flags & 2) { stbtt_int16 dx = *points++; x += (flags & 16) ? dx : -dx; // ??? } else { if (!(flags & 16)) { x = x + (stbtt_int16) (points[0]*256 + points[1]); points += 2; } } vertices[off+i].x = (stbtt_int16) x; } // now load y coordinates y=0; for (i=0; i < n; ++i) { flags = vertices[off+i].type; if (flags & 4) { stbtt_int16 dy = *points++; y += (flags & 32) ? dy : -dy; // ??? } else { if (!(flags & 32)) { y = y + (stbtt_int16) (points[0]*256 + points[1]); points += 2; } } vertices[off+i].y = (stbtt_int16) y; } // now convert them to our format num_vertices=0; sx = sy = cx = cy = scx = scy = 0; for (i=0; i < n; ++i) { flags = vertices[off+i].type; x = (stbtt_int16) vertices[off+i].x; y = (stbtt_int16) vertices[off+i].y; if (next_move == i) { if (i != 0) num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); // now start the new one start_off = !(flags & 1); if (start_off) { // if we start off with an off-curve point, then when we need to find a point on the curve // where we can start, and we need to save some state for when we wraparound. scx = x; scy = y; if (!(vertices[off+i+1].type & 1)) { // next point is also a curve point, so interpolate an on-point curve sx = (x + (stbtt_int32) vertices[off+i+1].x) >> 1; sy = (y + (stbtt_int32) vertices[off+i+1].y) >> 1; } else { // otherwise just use the next point as our start point sx = (stbtt_int32) vertices[off+i+1].x; sy = (stbtt_int32) vertices[off+i+1].y; ++i; // we're using point i+1 as the starting point, so skip it } } else { sx = x; sy = y; } stbtt_setvertex(&vertices[num_vertices++], STBTT_vmove,sx,sy,0,0); was_off = 0; next_move = 1 + ttUSHORT(endPtsOfContours+j*2); ++j; } else { if (!(flags & 1)) { // if it's a curve if (was_off) // two off-curve control points in a row means interpolate an on-curve midpoint stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, (cx+x)>>1, (cy+y)>>1, cx, cy); cx = x; cy = y; was_off = 1; } else { if (was_off) stbtt_setvertex(&vertices[num_vertices++], STBTT_vcurve, x,y, cx, cy); else stbtt_setvertex(&vertices[num_vertices++], STBTT_vline, x,y,0,0); was_off = 0; } } } num_vertices = stbtt__close_shape(vertices, num_vertices, was_off, start_off, sx,sy,scx,scy,cx,cy); } else if (numberOfContours < 0) { // Compound shapes. int more = 1; stbtt_uint8 *comp = data + g + 10; num_vertices = 0; vertices = 0; while (more) { stbtt_uint16 flags, gidx; int comp_num_verts = 0, i; stbtt_vertex *comp_verts = 0, *tmp = 0; float mtx[6] = {1,0,0,1,0,0}, m, n; flags = ttSHORT(comp); comp+=2; gidx = ttSHORT(comp); comp+=2; if (flags & 2) { // XY values if (flags & 1) { // shorts mtx[4] = ttSHORT(comp); comp+=2; mtx[5] = ttSHORT(comp); comp+=2; } else { mtx[4] = ttCHAR(comp); comp+=1; mtx[5] = ttCHAR(comp); comp+=1; } } else { // @TODO handle matching point STBTT_assert(0); } if (flags & (1<<3)) { // WE_HAVE_A_SCALE mtx[0] = mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; mtx[1] = mtx[2] = 0; } else if (flags & (1<<6)) { // WE_HAVE_AN_X_AND_YSCALE mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; mtx[1] = mtx[2] = 0; mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; } else if (flags & (1<<7)) { // WE_HAVE_A_TWO_BY_TWO mtx[0] = ttSHORT(comp)/16384.0f; comp+=2; mtx[1] = ttSHORT(comp)/16384.0f; comp+=2; mtx[2] = ttSHORT(comp)/16384.0f; comp+=2; mtx[3] = ttSHORT(comp)/16384.0f; comp+=2; } // Find transformation scales. m = (float) STBTT_sqrt(mtx[0]*mtx[0] + mtx[1]*mtx[1]); n = (float) STBTT_sqrt(mtx[2]*mtx[2] + mtx[3]*mtx[3]); // Get indexed glyph. comp_num_verts = stbtt_GetGlyphShape(info, gidx, &comp_verts); if (comp_num_verts > 0) { // Transform vertices. for (i = 0; i < comp_num_verts; ++i) { stbtt_vertex* v = &comp_verts[i]; stbtt_vertex_type x,y; x=v->x; y=v->y; v->x = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); v->y = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); x=v->cx; y=v->cy; v->cx = (stbtt_vertex_type)(m * (mtx[0]*x + mtx[2]*y + mtx[4])); v->cy = (stbtt_vertex_type)(n * (mtx[1]*x + mtx[3]*y + mtx[5])); } // Append vertices. tmp = (stbtt_vertex*)STBTT_malloc((num_vertices+comp_num_verts)*sizeof(stbtt_vertex), info->userdata); if (!tmp) { if (vertices) STBTT_free(vertices, info->userdata); if (comp_verts) STBTT_free(comp_verts, info->userdata); return 0; } if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex)); if (vertices) STBTT_free(vertices, info->userdata); vertices = tmp; STBTT_free(comp_verts, info->userdata); num_vertices += comp_num_verts; } // More components ? more = flags & (1<<5); } } else { // numberOfCounters == 0, do nothing } *pvertices = vertices; return num_vertices; } typedef struct { int bounds; int started; float first_x, first_y; float x, y; stbtt_int32 min_x, max_x, min_y, max_y; stbtt_vertex *pvertices; int num_vertices; } stbtt__csctx; #define STBTT__CSCTX_INIT(bounds) {bounds,0, 0,0, 0,0, 0,0,0,0, NULL, 0} static void stbtt__track_vertex(stbtt__csctx *c, stbtt_int32 x, stbtt_int32 y) { if (x > c->max_x || !c->started) c->max_x = x; if (y > c->max_y || !c->started) c->max_y = y; if (x < c->min_x || !c->started) c->min_x = x; if (y < c->min_y || !c->started) c->min_y = y; c->started = 1; } static void stbtt__csctx_v(stbtt__csctx *c, stbtt_uint8 type, stbtt_int32 x, stbtt_int32 y, stbtt_int32 cx, stbtt_int32 cy, stbtt_int32 cx1, stbtt_int32 cy1) { if (c->bounds) { stbtt__track_vertex(c, x, y); if (type == STBTT_vcubic) { stbtt__track_vertex(c, cx, cy); stbtt__track_vertex(c, cx1, cy1); } } else { stbtt_setvertex(&c->pvertices[c->num_vertices], type, x, y, cx, cy); c->pvertices[c->num_vertices].cx1 = (stbtt_int16) cx1; c->pvertices[c->num_vertices].cy1 = (stbtt_int16) cy1; } c->num_vertices++; } static void stbtt__csctx_close_shape(stbtt__csctx *ctx) { if (ctx->first_x != ctx->x || ctx->first_y != ctx->y) stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->first_x, (int)ctx->first_y, 0, 0, 0, 0); } static void stbtt__csctx_rmove_to(stbtt__csctx *ctx, float dx, float dy) { stbtt__csctx_close_shape(ctx); ctx->first_x = ctx->x = ctx->x + dx; ctx->first_y = ctx->y = ctx->y + dy; stbtt__csctx_v(ctx, STBTT_vmove, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); } static void stbtt__csctx_rline_to(stbtt__csctx *ctx, float dx, float dy) { ctx->x += dx; ctx->y += dy; stbtt__csctx_v(ctx, STBTT_vline, (int)ctx->x, (int)ctx->y, 0, 0, 0, 0); } static void stbtt__csctx_rccurve_to(stbtt__csctx *ctx, float dx1, float dy1, float dx2, float dy2, float dx3, float dy3) { float cx1 = ctx->x + dx1; float cy1 = ctx->y + dy1; float cx2 = cx1 + dx2; float cy2 = cy1 + dy2; ctx->x = cx2 + dx3; ctx->y = cy2 + dy3; stbtt__csctx_v(ctx, STBTT_vcubic, (int)ctx->x, (int)ctx->y, (int)cx1, (int)cy1, (int)cx2, (int)cy2); } static stbtt__buf stbtt__get_subr(stbtt__buf idx, int n) { int count = stbtt__cff_index_count(&idx); int bias = 107; if (count >= 33900) bias = 32768; else if (count >= 1240) bias = 1131; n += bias; if (n < 0 || n >= count) return stbtt__new_buf(NULL, 0); return stbtt__cff_index_get(idx, n); } static stbtt__buf stbtt__cid_get_glyph_subrs(const stbtt_fontinfo *info, int glyph_index) { stbtt__buf fdselect = info->fdselect; int nranges, start, end, v, fmt, fdselector = -1, i; stbtt__buf_seek(&fdselect, 0); fmt = stbtt__buf_get8(&fdselect); if (fmt == 0) { // untested stbtt__buf_skip(&fdselect, glyph_index); fdselector = stbtt__buf_get8(&fdselect); } else if (fmt == 3) { nranges = stbtt__buf_get16(&fdselect); start = stbtt__buf_get16(&fdselect); for (i = 0; i < nranges; i++) { v = stbtt__buf_get8(&fdselect); end = stbtt__buf_get16(&fdselect); if (glyph_index >= start && glyph_index < end) { fdselector = v; break; } start = end; } } if (fdselector == -1) stbtt__new_buf(NULL, 0); return stbtt__get_subrs(info->cff, stbtt__cff_index_get(info->fontdicts, fdselector)); } static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, stbtt__csctx *c) { int in_header = 1, maskbits = 0, subr_stack_height = 0, sp = 0, v, i, b0; int has_subrs = 0, clear_stack; float s[48]; stbtt__buf subr_stack[10], subrs = info->subrs, b; float f; #define STBTT__CSERR(s) (0) // this currently ignores the initial width value, which isn't needed if we have hmtx b = stbtt__cff_index_get(info->charstrings, glyph_index); while (b.cursor < b.size) { i = 0; clear_stack = 1; b0 = stbtt__buf_get8(&b); switch (b0) { // @TODO implement hinting case 0x13: // hintmask case 0x14: // cntrmask if (in_header) maskbits += (sp / 2); // implicit "vstem" in_header = 0; stbtt__buf_skip(&b, (maskbits + 7) / 8); break; case 0x01: // hstem case 0x03: // vstem case 0x12: // hstemhm case 0x17: // vstemhm maskbits += (sp / 2); break; case 0x15: // rmoveto in_header = 0; if (sp < 2) return STBTT__CSERR("rmoveto stack"); stbtt__csctx_rmove_to(c, s[sp-2], s[sp-1]); break; case 0x04: // vmoveto in_header = 0; if (sp < 1) return STBTT__CSERR("vmoveto stack"); stbtt__csctx_rmove_to(c, 0, s[sp-1]); break; case 0x16: // hmoveto in_header = 0; if (sp < 1) return STBTT__CSERR("hmoveto stack"); stbtt__csctx_rmove_to(c, s[sp-1], 0); break; case 0x05: // rlineto if (sp < 2) return STBTT__CSERR("rlineto stack"); for (; i + 1 < sp; i += 2) stbtt__csctx_rline_to(c, s[i], s[i+1]); break; // hlineto/vlineto and vhcurveto/hvcurveto alternate horizontal and vertical // starting from a different place. case 0x07: // vlineto if (sp < 1) return STBTT__CSERR("vlineto stack"); goto vlineto; case 0x06: // hlineto if (sp < 1) return STBTT__CSERR("hlineto stack"); for (;;) { if (i >= sp) break; stbtt__csctx_rline_to(c, s[i], 0); i++; vlineto: if (i >= sp) break; stbtt__csctx_rline_to(c, 0, s[i]); i++; } break; case 0x1F: // hvcurveto if (sp < 4) return STBTT__CSERR("hvcurveto stack"); goto hvcurveto; case 0x1E: // vhcurveto if (sp < 4) return STBTT__CSERR("vhcurveto stack"); for (;;) { if (i + 3 >= sp) break; stbtt__csctx_rccurve_to(c, 0, s[i], s[i+1], s[i+2], s[i+3], (sp - i == 5) ? s[i + 4] : 0.0f); i += 4; hvcurveto: if (i + 3 >= sp) break; stbtt__csctx_rccurve_to(c, s[i], 0, s[i+1], s[i+2], (sp - i == 5) ? s[i+4] : 0.0f, s[i+3]); i += 4; } break; case 0x08: // rrcurveto if (sp < 6) return STBTT__CSERR("rcurveline stack"); for (; i + 5 < sp; i += 6) stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); break; case 0x18: // rcurveline if (sp < 8) return STBTT__CSERR("rcurveline stack"); for (; i + 5 < sp - 2; i += 6) stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); if (i + 1 >= sp) return STBTT__CSERR("rcurveline stack"); stbtt__csctx_rline_to(c, s[i], s[i+1]); break; case 0x19: // rlinecurve if (sp < 8) return STBTT__CSERR("rlinecurve stack"); for (; i + 1 < sp - 6; i += 2) stbtt__csctx_rline_to(c, s[i], s[i+1]); if (i + 5 >= sp) return STBTT__CSERR("rlinecurve stack"); stbtt__csctx_rccurve_to(c, s[i], s[i+1], s[i+2], s[i+3], s[i+4], s[i+5]); break; case 0x1A: // vvcurveto case 0x1B: // hhcurveto if (sp < 4) return STBTT__CSERR("(vv|hh)curveto stack"); f = 0.0; if (sp & 1) { f = s[i]; i++; } for (; i + 3 < sp; i += 4) { if (b0 == 0x1B) stbtt__csctx_rccurve_to(c, s[i], f, s[i+1], s[i+2], s[i+3], 0.0); else stbtt__csctx_rccurve_to(c, f, s[i], s[i+1], s[i+2], 0.0, s[i+3]); f = 0.0; } break; case 0x0A: // callsubr if (!has_subrs) { if (info->fdselect.size) subrs = stbtt__cid_get_glyph_subrs(info, glyph_index); has_subrs = 1; } // fallthrough case 0x1D: // callgsubr if (sp < 1) return STBTT__CSERR("call(g|)subr stack"); v = (int) s[--sp]; if (subr_stack_height >= 10) return STBTT__CSERR("recursion limit"); subr_stack[subr_stack_height++] = b; b = stbtt__get_subr(b0 == 0x0A ? subrs : info->gsubrs, v); if (b.size == 0) return STBTT__CSERR("subr not found"); b.cursor = 0; clear_stack = 0; break; case 0x0B: // return if (subr_stack_height <= 0) return STBTT__CSERR("return outside subr"); b = subr_stack[--subr_stack_height]; clear_stack = 0; break; case 0x0E: // endchar stbtt__csctx_close_shape(c); return 1; case 0x0C: { // two-byte escape float dx1, dx2, dx3, dx4, dx5, dx6, dy1, dy2, dy3, dy4, dy5, dy6; float dx, dy; int b1 = stbtt__buf_get8(&b); switch (b1) { // @TODO These "flex" implementations ignore the flex-depth and resolution, // and always draw beziers. case 0x22: // hflex if (sp < 7) return STBTT__CSERR("hflex stack"); dx1 = s[0]; dx2 = s[1]; dy2 = s[2]; dx3 = s[3]; dx4 = s[4]; dx5 = s[5]; dx6 = s[6]; stbtt__csctx_rccurve_to(c, dx1, 0, dx2, dy2, dx3, 0); stbtt__csctx_rccurve_to(c, dx4, 0, dx5, -dy2, dx6, 0); break; case 0x23: // flex if (sp < 13) return STBTT__CSERR("flex stack"); dx1 = s[0]; dy1 = s[1]; dx2 = s[2]; dy2 = s[3]; dx3 = s[4]; dy3 = s[5]; dx4 = s[6]; dy4 = s[7]; dx5 = s[8]; dy5 = s[9]; dx6 = s[10]; dy6 = s[11]; //fd is s[12] stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); break; case 0x24: // hflex1 if (sp < 9) return STBTT__CSERR("hflex1 stack"); dx1 = s[0]; dy1 = s[1]; dx2 = s[2]; dy2 = s[3]; dx3 = s[4]; dx4 = s[5]; dx5 = s[6]; dy5 = s[7]; dx6 = s[8]; stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, 0); stbtt__csctx_rccurve_to(c, dx4, 0, dx5, dy5, dx6, -(dy1+dy2+dy5)); break; case 0x25: // flex1 if (sp < 11) return STBTT__CSERR("flex1 stack"); dx1 = s[0]; dy1 = s[1]; dx2 = s[2]; dy2 = s[3]; dx3 = s[4]; dy3 = s[5]; dx4 = s[6]; dy4 = s[7]; dx5 = s[8]; dy5 = s[9]; dx6 = dy6 = s[10]; dx = dx1+dx2+dx3+dx4+dx5; dy = dy1+dy2+dy3+dy4+dy5; if (STBTT_fabs(dx) > STBTT_fabs(dy)) dy6 = -dy; else dx6 = -dx; stbtt__csctx_rccurve_to(c, dx1, dy1, dx2, dy2, dx3, dy3); stbtt__csctx_rccurve_to(c, dx4, dy4, dx5, dy5, dx6, dy6); break; default: return STBTT__CSERR("unimplemented"); } } break; default: if (b0 != 255 && b0 != 28 && (b0 < 32 || b0 > 254)) return STBTT__CSERR("reserved operator"); // push immediate if (b0 == 255) { f = (float)(stbtt_int32)stbtt__buf_get32(&b) / 0x10000; } else { stbtt__buf_skip(&b, -1); f = (float)(stbtt_int16)stbtt__cff_int(&b); } if (sp >= 48) return STBTT__CSERR("push stack overflow"); s[sp++] = f; clear_stack = 0; break; } if (clear_stack) sp = 0; } return STBTT__CSERR("no endchar"); #undef STBTT__CSERR } static int stbtt__GetGlyphShapeT2(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) { // runs the charstring twice, once to count and once to output (to avoid realloc) stbtt__csctx count_ctx = STBTT__CSCTX_INIT(1); stbtt__csctx output_ctx = STBTT__CSCTX_INIT(0); if (stbtt__run_charstring(info, glyph_index, &count_ctx)) { *pvertices = (stbtt_vertex*)STBTT_malloc(count_ctx.num_vertices*sizeof(stbtt_vertex), info->userdata); output_ctx.pvertices = *pvertices; if (stbtt__run_charstring(info, glyph_index, &output_ctx)) { STBTT_assert(output_ctx.num_vertices == count_ctx.num_vertices); return output_ctx.num_vertices; } } *pvertices = NULL; return 0; } static int stbtt__GetGlyphInfoT2(const stbtt_fontinfo *info, int glyph_index, int *x0, int *y0, int *x1, int *y1) { stbtt__csctx c = STBTT__CSCTX_INIT(1); int r = stbtt__run_charstring(info, glyph_index, &c); if (x0) *x0 = r ? c.min_x : 0; if (y0) *y0 = r ? c.min_y : 0; if (x1) *x1 = r ? c.max_x : 0; if (y1) *y1 = r ? c.max_y : 0; return r ? c.num_vertices : 0; } STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, stbtt_vertex **pvertices) { if (!info->cff.size) return stbtt__GetGlyphShapeTT(info, glyph_index, pvertices); else return stbtt__GetGlyphShapeT2(info, glyph_index, pvertices); } STBTT_DEF void stbtt_GetGlyphHMetrics(const stbtt_fontinfo *info, int glyph_index, int *advanceWidth, int *leftSideBearing) { stbtt_uint16 numOfLongHorMetrics = ttUSHORT(info->data+info->hhea + 34); if (glyph_index < numOfLongHorMetrics) { if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*glyph_index); if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*glyph_index + 2); } else { if (advanceWidth) *advanceWidth = ttSHORT(info->data + info->hmtx + 4*(numOfLongHorMetrics-1)); if (leftSideBearing) *leftSideBearing = ttSHORT(info->data + info->hmtx + 4*numOfLongHorMetrics + 2*(glyph_index - numOfLongHorMetrics)); } } STBTT_DEF int stbtt_GetKerningTableLength(const stbtt_fontinfo *info) { stbtt_uint8 *data = info->data + info->kern; // we only look at the first table. it must be 'horizontal' and format 0. if (!info->kern) return 0; if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 return 0; if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format return 0; return ttUSHORT(data+10); } STBTT_DEF int stbtt_GetKerningTable(const stbtt_fontinfo *info, stbtt_kerningentry* table, int table_length) { stbtt_uint8 *data = info->data + info->kern; int k, length; // we only look at the first table. it must be 'horizontal' and format 0. if (!info->kern) return 0; if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 return 0; if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format return 0; length = ttUSHORT(data+10); if (table_length < length) length = table_length; for (k = 0; k < length; k++) { table[k].glyph1 = ttUSHORT(data+18+(k*6)); table[k].glyph2 = ttUSHORT(data+20+(k*6)); table[k].advance = ttSHORT(data+22+(k*6)); } return length; } static int stbtt__GetGlyphKernInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) { stbtt_uint8 *data = info->data + info->kern; stbtt_uint32 needle, straw; int l, r, m; // we only look at the first table. it must be 'horizontal' and format 0. if (!info->kern) return 0; if (ttUSHORT(data+2) < 1) // number of tables, need at least 1 return 0; if (ttUSHORT(data+8) != 1) // horizontal flag must be set in format return 0; l = 0; r = ttUSHORT(data+10) - 1; needle = glyph1 << 16 | glyph2; while (l <= r) { m = (l + r) >> 1; straw = ttULONG(data+18+(m*6)); // note: unaligned read if (needle < straw) r = m - 1; else if (needle > straw) l = m + 1; else return ttSHORT(data+22+(m*6)); } return 0; } static stbtt_int32 stbtt__GetCoverageIndex(stbtt_uint8 *coverageTable, int glyph) { stbtt_uint16 coverageFormat = ttUSHORT(coverageTable); switch(coverageFormat) { case 1: { stbtt_uint16 glyphCount = ttUSHORT(coverageTable + 2); // Binary search. stbtt_int32 l=0, r=glyphCount-1, m; int straw, needle=glyph; while (l <= r) { stbtt_uint8 *glyphArray = coverageTable + 4; stbtt_uint16 glyphID; m = (l + r) >> 1; glyphID = ttUSHORT(glyphArray + 2 * m); straw = glyphID; if (needle < straw) r = m - 1; else if (needle > straw) l = m + 1; else { return m; } } } break; case 2: { stbtt_uint16 rangeCount = ttUSHORT(coverageTable + 2); stbtt_uint8 *rangeArray = coverageTable + 4; // Binary search. stbtt_int32 l=0, r=rangeCount-1, m; int strawStart, strawEnd, needle=glyph; while (l <= r) { stbtt_uint8 *rangeRecord; m = (l + r) >> 1; rangeRecord = rangeArray + 6 * m; strawStart = ttUSHORT(rangeRecord); strawEnd = ttUSHORT(rangeRecord + 2); if (needle < strawStart) r = m - 1; else if (needle > strawEnd) l = m + 1; else { stbtt_uint16 startCoverageIndex = ttUSHORT(rangeRecord + 4); return startCoverageIndex + glyph - strawStart; } } } break; default: { // There are no other cases. STBTT_assert(0); } break; } return -1; } static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph) { stbtt_uint16 classDefFormat = ttUSHORT(classDefTable); switch(classDefFormat) { case 1: { stbtt_uint16 startGlyphID = ttUSHORT(classDefTable + 2); stbtt_uint16 glyphCount = ttUSHORT(classDefTable + 4); stbtt_uint8 *classDef1ValueArray = classDefTable + 6; if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount) return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID)); classDefTable = classDef1ValueArray + 2 * glyphCount; } break; case 2: { stbtt_uint16 classRangeCount = ttUSHORT(classDefTable + 2); stbtt_uint8 *classRangeRecords = classDefTable + 4; // Binary search. stbtt_int32 l=0, r=classRangeCount-1, m; int strawStart, strawEnd, needle=glyph; while (l <= r) { stbtt_uint8 *classRangeRecord; m = (l + r) >> 1; classRangeRecord = classRangeRecords + 6 * m; strawStart = ttUSHORT(classRangeRecord); strawEnd = ttUSHORT(classRangeRecord + 2); if (needle < strawStart) r = m - 1; else if (needle > strawEnd) l = m + 1; else return (stbtt_int32)ttUSHORT(classRangeRecord + 4); } classDefTable = classRangeRecords + 6 * classRangeCount; } break; default: { // There are no other cases. STBTT_assert(0); } break; } return -1; } // Define to STBTT_assert(x) if you want to break on unimplemented formats. #define STBTT_GPOS_TODO_assert(x) static stbtt_int32 stbtt__GetGlyphGPOSInfoAdvance(const stbtt_fontinfo *info, int glyph1, int glyph2) { stbtt_uint16 lookupListOffset; stbtt_uint8 *lookupList; stbtt_uint16 lookupCount; stbtt_uint8 *data; stbtt_int32 i; if (!info->gpos) return 0; data = info->data + info->gpos; if (ttUSHORT(data+0) != 1) return 0; // Major version 1 if (ttUSHORT(data+2) != 0) return 0; // Minor version 0 lookupListOffset = ttUSHORT(data+8); lookupList = data + lookupListOffset; lookupCount = ttUSHORT(lookupList); for (i=0; i> 1; pairValue = pairValueArray + (2 + valueRecordPairSizeInBytes) * m; secondGlyph = ttUSHORT(pairValue); straw = secondGlyph; if (needle < straw) r = m - 1; else if (needle > straw) l = m + 1; else { stbtt_int16 xAdvance = ttSHORT(pairValue + 2); return xAdvance; } } } break; case 2: { stbtt_uint16 valueFormat1 = ttUSHORT(table + 4); stbtt_uint16 valueFormat2 = ttUSHORT(table + 6); stbtt_uint16 classDef1Offset = ttUSHORT(table + 8); stbtt_uint16 classDef2Offset = ttUSHORT(table + 10); int glyph1class = stbtt__GetGlyphClass(table + classDef1Offset, glyph1); int glyph2class = stbtt__GetGlyphClass(table + classDef2Offset, glyph2); stbtt_uint16 class1Count = ttUSHORT(table + 12); stbtt_uint16 class2Count = ttUSHORT(table + 14); STBTT_assert(glyph1class < class1Count); STBTT_assert(glyph2class < class2Count); // TODO: Support more formats. STBTT_GPOS_TODO_assert(valueFormat1 == 4); if (valueFormat1 != 4) return 0; STBTT_GPOS_TODO_assert(valueFormat2 == 0); if (valueFormat2 != 0) return 0; if (glyph1class >= 0 && glyph1class < class1Count && glyph2class >= 0 && glyph2class < class2Count) { stbtt_uint8 *class1Records = table + 16; stbtt_uint8 *class2Records = class1Records + 2 * (glyph1class * class2Count); stbtt_int16 xAdvance = ttSHORT(class2Records + 2 * glyph2class); return xAdvance; } } break; default: { // There are no other cases. STBTT_assert(0); break; }; } } break; }; default: // TODO: Implement other stuff. break; } } return 0; } STBTT_DEF int stbtt_GetGlyphKernAdvance(const stbtt_fontinfo *info, int g1, int g2) { int xAdvance = 0; if (info->gpos) xAdvance += stbtt__GetGlyphGPOSInfoAdvance(info, g1, g2); else if (info->kern) xAdvance += stbtt__GetGlyphKernInfoAdvance(info, g1, g2); return xAdvance; } STBTT_DEF int stbtt_GetCodepointKernAdvance(const stbtt_fontinfo *info, int ch1, int ch2) { if (!info->kern && !info->gpos) // if no kerning table, don't waste time looking up both codepoint->glyphs return 0; return stbtt_GetGlyphKernAdvance(info, stbtt_FindGlyphIndex(info,ch1), stbtt_FindGlyphIndex(info,ch2)); } STBTT_DEF void stbtt_GetCodepointHMetrics(const stbtt_fontinfo *info, int codepoint, int *advanceWidth, int *leftSideBearing) { stbtt_GetGlyphHMetrics(info, stbtt_FindGlyphIndex(info,codepoint), advanceWidth, leftSideBearing); } STBTT_DEF void stbtt_GetFontVMetrics(const stbtt_fontinfo *info, int *ascent, int *descent, int *lineGap) { if (ascent ) *ascent = ttSHORT(info->data+info->hhea + 4); if (descent) *descent = ttSHORT(info->data+info->hhea + 6); if (lineGap) *lineGap = ttSHORT(info->data+info->hhea + 8); } STBTT_DEF int stbtt_GetFontVMetricsOS2(const stbtt_fontinfo *info, int *typoAscent, int *typoDescent, int *typoLineGap) { int tab = stbtt__find_table(info->data, info->fontstart, "OS/2"); if (!tab) return 0; if (typoAscent ) *typoAscent = ttSHORT(info->data+tab + 68); if (typoDescent) *typoDescent = ttSHORT(info->data+tab + 70); if (typoLineGap) *typoLineGap = ttSHORT(info->data+tab + 72); return 1; } STBTT_DEF void stbtt_GetFontBoundingBox(const stbtt_fontinfo *info, int *x0, int *y0, int *x1, int *y1) { *x0 = ttSHORT(info->data + info->head + 36); *y0 = ttSHORT(info->data + info->head + 38); *x1 = ttSHORT(info->data + info->head + 40); *y1 = ttSHORT(info->data + info->head + 42); } STBTT_DEF float stbtt_ScaleForPixelHeight(const stbtt_fontinfo *info, float height) { int fheight = ttSHORT(info->data + info->hhea + 4) - ttSHORT(info->data + info->hhea + 6); return (float) height / fheight; } STBTT_DEF float stbtt_ScaleForMappingEmToPixels(const stbtt_fontinfo *info, float pixels) { int unitsPerEm = ttUSHORT(info->data + info->head + 18); return pixels / unitsPerEm; } STBTT_DEF void stbtt_FreeShape(const stbtt_fontinfo *info, stbtt_vertex *v) { STBTT_free(v, info->userdata); } STBTT_DEF stbtt_uint8 *stbtt_FindSVGDoc(const stbtt_fontinfo *info, int gl) { int i; stbtt_uint8 *data = info->data; stbtt_uint8 *svg_doc_list = data + stbtt__get_svg((stbtt_fontinfo *) info); int numEntries = ttUSHORT(svg_doc_list); stbtt_uint8 *svg_docs = svg_doc_list + 2; for(i=0; i= ttUSHORT(svg_doc)) && (gl <= ttUSHORT(svg_doc + 2))) return svg_doc; } return 0; } STBTT_DEF int stbtt_GetGlyphSVG(const stbtt_fontinfo *info, int gl, const char **svg) { stbtt_uint8 *data = info->data; stbtt_uint8 *svg_doc; if (info->svg == 0) return 0; svg_doc = stbtt_FindSVGDoc(info, gl); if (svg_doc != NULL) { *svg = (char *) data + info->svg + ttULONG(svg_doc + 4); return ttULONG(svg_doc + 8); } else { return 0; } } STBTT_DEF int stbtt_GetCodepointSVG(const stbtt_fontinfo *info, int unicode_codepoint, const char **svg) { return stbtt_GetGlyphSVG(info, stbtt_FindGlyphIndex(info, unicode_codepoint), svg); } ////////////////////////////////////////////////////////////////////////////// // // antialiasing software rasterizer // STBTT_DEF void stbtt_GetGlyphBitmapBoxSubpixel(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y,float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) { int x0=0,y0=0,x1,y1; // =0 suppresses compiler warning if (!stbtt_GetGlyphBox(font, glyph, &x0,&y0,&x1,&y1)) { // e.g. space character if (ix0) *ix0 = 0; if (iy0) *iy0 = 0; if (ix1) *ix1 = 0; if (iy1) *iy1 = 0; } else { // move to integral bboxes (treating pixels as little squares, what pixels get touched)? if (ix0) *ix0 = STBTT_ifloor( x0 * scale_x + shift_x); if (iy0) *iy0 = STBTT_ifloor(-y1 * scale_y + shift_y); if (ix1) *ix1 = STBTT_iceil ( x1 * scale_x + shift_x); if (iy1) *iy1 = STBTT_iceil (-y0 * scale_y + shift_y); } } STBTT_DEF void stbtt_GetGlyphBitmapBox(const stbtt_fontinfo *font, int glyph, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) { stbtt_GetGlyphBitmapBoxSubpixel(font, glyph, scale_x, scale_y,0.0f,0.0f, ix0, iy0, ix1, iy1); } STBTT_DEF void stbtt_GetCodepointBitmapBoxSubpixel(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, float shift_x, float shift_y, int *ix0, int *iy0, int *ix1, int *iy1) { stbtt_GetGlyphBitmapBoxSubpixel(font, stbtt_FindGlyphIndex(font,codepoint), scale_x, scale_y,shift_x,shift_y, ix0,iy0,ix1,iy1); } STBTT_DEF void stbtt_GetCodepointBitmapBox(const stbtt_fontinfo *font, int codepoint, float scale_x, float scale_y, int *ix0, int *iy0, int *ix1, int *iy1) { stbtt_GetCodepointBitmapBoxSubpixel(font, codepoint, scale_x, scale_y,0.0f,0.0f, ix0,iy0,ix1,iy1); } ////////////////////////////////////////////////////////////////////////////// // // Rasterizer typedef struct stbtt__hheap_chunk { struct stbtt__hheap_chunk *next; } stbtt__hheap_chunk; typedef struct stbtt__hheap { struct stbtt__hheap_chunk *head; void *first_free; int num_remaining_in_head_chunk; } stbtt__hheap; static void *stbtt__hheap_alloc(stbtt__hheap *hh, size_t size, void *userdata) { if (hh->first_free) { void *p = hh->first_free; hh->first_free = * (void **) p; return p; } else { if (hh->num_remaining_in_head_chunk == 0) { int count = (size < 32 ? 2000 : size < 128 ? 800 : 100); stbtt__hheap_chunk *c = (stbtt__hheap_chunk *) STBTT_malloc(sizeof(stbtt__hheap_chunk) + size * count, userdata); if (c == NULL) return NULL; c->next = hh->head; hh->head = c; hh->num_remaining_in_head_chunk = count; } --hh->num_remaining_in_head_chunk; return (char *) (hh->head) + sizeof(stbtt__hheap_chunk) + size * hh->num_remaining_in_head_chunk; } } static void stbtt__hheap_free(stbtt__hheap *hh, void *p) { *(void **) p = hh->first_free; hh->first_free = p; } static void stbtt__hheap_cleanup(stbtt__hheap *hh, void *userdata) { stbtt__hheap_chunk *c = hh->head; while (c) { stbtt__hheap_chunk *n = c->next; STBTT_free(c, userdata); c = n; } } typedef struct stbtt__edge { float x0,y0, x1,y1; int invert; } stbtt__edge; typedef struct stbtt__active_edge { struct stbtt__active_edge *next; #if STBTT_RASTERIZER_VERSION==1 int x,dx; float ey; int direction; #elif STBTT_RASTERIZER_VERSION==2 float fx,fdx,fdy; float direction; float sy; float ey; #else #error "Unrecognized value of STBTT_RASTERIZER_VERSION" #endif } stbtt__active_edge; #if STBTT_RASTERIZER_VERSION == 1 #define STBTT_FIXSHIFT 10 #define STBTT_FIX (1 << STBTT_FIXSHIFT) #define STBTT_FIXMASK (STBTT_FIX-1) static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) { stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); STBTT_assert(z != NULL); if (!z) return z; // round dx down to avoid overshooting if (dxdy < 0) z->dx = -STBTT_ifloor(STBTT_FIX * -dxdy); else z->dx = STBTT_ifloor(STBTT_FIX * dxdy); z->x = STBTT_ifloor(STBTT_FIX * e->x0 + z->dx * (start_point - e->y0)); // use z->dx so when we offset later it's by the same amount z->x -= off_x * STBTT_FIX; z->ey = e->y1; z->next = 0; z->direction = e->invert ? 1 : -1; return z; } #elif STBTT_RASTERIZER_VERSION == 2 static stbtt__active_edge *stbtt__new_active(stbtt__hheap *hh, stbtt__edge *e, int off_x, float start_point, void *userdata) { stbtt__active_edge *z = (stbtt__active_edge *) stbtt__hheap_alloc(hh, sizeof(*z), userdata); float dxdy = (e->x1 - e->x0) / (e->y1 - e->y0); STBTT_assert(z != NULL); //STBTT_assert(e->y0 <= start_point); if (!z) return z; z->fdx = dxdy; z->fdy = dxdy != 0.0f ? (1.0f/dxdy) : 0.0f; z->fx = e->x0 + dxdy * (start_point - e->y0); z->fx -= off_x; z->direction = e->invert ? 1.0f : -1.0f; z->sy = e->y0; z->ey = e->y1; z->next = 0; return z; } #else #error "Unrecognized value of STBTT_RASTERIZER_VERSION" #endif #if STBTT_RASTERIZER_VERSION == 1 // note: this routine clips fills that extend off the edges... ideally this // wouldn't happen, but it could happen if the truetype glyph bounding boxes // are wrong, or if the user supplies a too-small bitmap static void stbtt__fill_active_edges(unsigned char *scanline, int len, stbtt__active_edge *e, int max_weight) { // non-zero winding fill int x0=0, w=0; while (e) { if (w == 0) { // if we're currently at zero, we need to record the edge start point x0 = e->x; w += e->direction; } else { int x1 = e->x; w += e->direction; // if we went to zero, we need to draw if (w == 0) { int i = x0 >> STBTT_FIXSHIFT; int j = x1 >> STBTT_FIXSHIFT; if (i < len && j >= 0) { if (i == j) { // x0,x1 are the same pixel, so compute combined coverage scanline[i] = scanline[i] + (stbtt_uint8) ((x1 - x0) * max_weight >> STBTT_FIXSHIFT); } else { if (i >= 0) // add antialiasing for x0 scanline[i] = scanline[i] + (stbtt_uint8) (((STBTT_FIX - (x0 & STBTT_FIXMASK)) * max_weight) >> STBTT_FIXSHIFT); else i = -1; // clip if (j < len) // add antialiasing for x1 scanline[j] = scanline[j] + (stbtt_uint8) (((x1 & STBTT_FIXMASK) * max_weight) >> STBTT_FIXSHIFT); else j = len; // clip for (++i; i < j; ++i) // fill pixels between x0 and x1 scanline[i] = scanline[i] + (stbtt_uint8) max_weight; } } } } e = e->next; } } static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) { stbtt__hheap hh = { 0, 0, 0 }; stbtt__active_edge *active = NULL; int y,j=0; int max_weight = (255 / vsubsample); // weight per vertical scanline int s; // vertical subsample index unsigned char scanline_data[512], *scanline; if (result->w > 512) scanline = (unsigned char *) STBTT_malloc(result->w, userdata); else scanline = scanline_data; y = off_y * vsubsample; e[n].y0 = (off_y + result->h) * (float) vsubsample + 1; while (j < result->h) { STBTT_memset(scanline, 0, result->w); for (s=0; s < vsubsample; ++s) { // find center of pixel for this scanline float scan_y = y + 0.5f; stbtt__active_edge **step = &active; // update all active edges; // remove all active edges that terminate before the center of this scanline while (*step) { stbtt__active_edge * z = *step; if (z->ey <= scan_y) { *step = z->next; // delete from list STBTT_assert(z->direction); z->direction = 0; stbtt__hheap_free(&hh, z); } else { z->x += z->dx; // advance to position for current scanline step = &((*step)->next); // advance through list } } // resort the list if needed for(;;) { int changed=0; step = &active; while (*step && (*step)->next) { if ((*step)->x > (*step)->next->x) { stbtt__active_edge *t = *step; stbtt__active_edge *q = t->next; t->next = q->next; q->next = t; *step = q; changed = 1; } step = &(*step)->next; } if (!changed) break; } // insert all edges that start before the center of this scanline -- omit ones that also end on this scanline while (e->y0 <= scan_y) { if (e->y1 > scan_y) { stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y, userdata); if (z != NULL) { // find insertion point if (active == NULL) active = z; else if (z->x < active->x) { // insert at front z->next = active; active = z; } else { // find thing to insert AFTER stbtt__active_edge *p = active; while (p->next && p->next->x < z->x) p = p->next; // at this point, p->next->x is NOT < z->x z->next = p->next; p->next = z; } } } ++e; } // now process all active edges in XOR fashion if (active) stbtt__fill_active_edges(scanline, result->w, active, max_weight); ++y; } STBTT_memcpy(result->pixels + j * result->stride, scanline, result->w); ++j; } stbtt__hheap_cleanup(&hh, userdata); if (scanline != scanline_data) STBTT_free(scanline, userdata); } #elif STBTT_RASTERIZER_VERSION == 2 // the edge passed in here does not cross the vertical line at x or the vertical line at x+1 // (i.e. it has already been clipped to those) static void stbtt__handle_clipped_edge(float *scanline, int x, stbtt__active_edge *e, float x0, float y0, float x1, float y1) { if (y0 == y1) return; STBTT_assert(y0 < y1); STBTT_assert(e->sy <= e->ey); if (y0 > e->ey) return; if (y1 < e->sy) return; if (y0 < e->sy) { x0 += (x1-x0) * (e->sy - y0) / (y1-y0); y0 = e->sy; } if (y1 > e->ey) { x1 += (x1-x0) * (e->ey - y1) / (y1-y0); y1 = e->ey; } if (x0 == x) STBTT_assert(x1 <= x+1); else if (x0 == x+1) STBTT_assert(x1 >= x); else if (x0 <= x) STBTT_assert(x1 <= x); else if (x0 >= x+1) STBTT_assert(x1 >= x+1); else STBTT_assert(x1 >= x && x1 <= x+1); if (x0 <= x && x1 <= x) scanline[x] += e->direction * (y1-y0); else if (x0 >= x+1 && x1 >= x+1) ; else { STBTT_assert(x0 >= x && x0 <= x+1 && x1 >= x && x1 <= x+1); scanline[x] += e->direction * (y1-y0) * (1-((x0-x)+(x1-x))/2); // coverage = 1 - average x position } } static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill, int len, stbtt__active_edge *e, float y_top) { float y_bottom = y_top+1; while (e) { // brute force every pixel // compute intersection points with top & bottom STBTT_assert(e->ey >= y_top); if (e->fdx == 0) { float x0 = e->fx; if (x0 < len) { if (x0 >= 0) { stbtt__handle_clipped_edge(scanline,(int) x0,e, x0,y_top, x0,y_bottom); stbtt__handle_clipped_edge(scanline_fill-1,(int) x0+1,e, x0,y_top, x0,y_bottom); } else { stbtt__handle_clipped_edge(scanline_fill-1,0,e, x0,y_top, x0,y_bottom); } } } else { float x0 = e->fx; float dx = e->fdx; float xb = x0 + dx; float x_top, x_bottom; float sy0,sy1; float dy = e->fdy; STBTT_assert(e->sy <= y_bottom && e->ey >= y_top); // compute endpoints of line segment clipped to this scanline (if the // line segment starts on this scanline. x0 is the intersection of the // line with y_top, but that may be off the line segment. if (e->sy > y_top) { x_top = x0 + dx * (e->sy - y_top); sy0 = e->sy; } else { x_top = x0; sy0 = y_top; } if (e->ey < y_bottom) { x_bottom = x0 + dx * (e->ey - y_top); sy1 = e->ey; } else { x_bottom = xb; sy1 = y_bottom; } if (x_top >= 0 && x_bottom >= 0 && x_top < len && x_bottom < len) { // from here on, we don't have to range check x values if ((int) x_top == (int) x_bottom) { float height; // simple case, only spans one pixel int x = (int) x_top; height = sy1 - sy0; STBTT_assert(x >= 0 && x < len); scanline[x] += e->direction * (1-((x_top - x) + (x_bottom-x))/2) * height; scanline_fill[x] += e->direction * height; // everything right of this pixel is filled } else { int x,x1,x2; float y_crossing, step, sign, area; // covers 2+ pixels if (x_top > x_bottom) { // flip scanline vertically; signed area is the same float t; sy0 = y_bottom - (sy0 - y_top); sy1 = y_bottom - (sy1 - y_top); t = sy0, sy0 = sy1, sy1 = t; t = x_bottom, x_bottom = x_top, x_top = t; dx = -dx; dy = -dy; t = x0, x0 = xb, xb = t; } x1 = (int) x_top; x2 = (int) x_bottom; // compute intersection with y axis at x1+1 y_crossing = (x1+1 - x0) * dy + y_top; sign = e->direction; // area of the rectangle covered from y0..y_crossing area = sign * (y_crossing-sy0); // area of the triangle (x_top,y0), (x+1,y0), (x+1,y_crossing) scanline[x1] += area * (1-((x_top - x1)+(x1+1-x1))/2); step = sign * dy; for (x = x1+1; x < x2; ++x) { scanline[x] += area + step/2; area += step; } y_crossing += dy * (x2 - (x1+1)); STBTT_assert(STBTT_fabs(area) <= 1.01f); scanline[x2] += area + sign * (1-((x2-x2)+(x_bottom-x2))/2) * (sy1-y_crossing); scanline_fill[x2] += sign * (sy1-sy0); } } else { // if edge goes outside of box we're drawing, we require // clipping logic. since this does not match the intended use // of this library, we use a different, very slow brute // force implementation int x; for (x=0; x < len; ++x) { // cases: // // there can be up to two intersections with the pixel. any intersection // with left or right edges can be handled by splitting into two (or three) // regions. intersections with top & bottom do not necessitate case-wise logic. // // the old way of doing this found the intersections with the left & right edges, // then used some simple logic to produce up to three segments in sorted order // from top-to-bottom. however, this had a problem: if an x edge was epsilon // across the x border, then the corresponding y position might not be distinct // from the other y segment, and it might ignored as an empty segment. to avoid // that, we need to explicitly produce segments based on x positions. // rename variables to clearly-defined pairs float y0 = y_top; float x1 = (float) (x); float x2 = (float) (x+1); float x3 = xb; float y3 = y_bottom; // x = e->x + e->dx * (y-y_top) // (y-y_top) = (x - e->x) / e->dx // y = (x - e->x) / e->dx + y_top float y1 = (x - x0) / dx + y_top; float y2 = (x+1 - x0) / dx + y_top; if (x0 < x1 && x3 > x2) { // three segments descending down-right stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x2,y2); stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); } else if (x3 < x1 && x0 > x2) { // three segments descending down-left stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x1,y1); stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); } else if (x0 < x1 && x3 > x1) { // two segments across x, down-right stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); } else if (x3 < x1 && x0 > x1) { // two segments across x, down-left stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x1,y1); stbtt__handle_clipped_edge(scanline,x,e, x1,y1, x3,y3); } else if (x0 < x2 && x3 > x2) { // two segments across x+1, down-right stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); } else if (x3 < x2 && x0 > x2) { // two segments across x+1, down-left stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x2,y2); stbtt__handle_clipped_edge(scanline,x,e, x2,y2, x3,y3); } else { // one segment stbtt__handle_clipped_edge(scanline,x,e, x0,y0, x3,y3); } } } } e = e->next; } } // directly AA rasterize edges w/o supersampling static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e, int n, int vsubsample, int off_x, int off_y, void *userdata) { stbtt__hheap hh = { 0, 0, 0 }; stbtt__active_edge *active = NULL; int y,j=0, i; float scanline_data[129], *scanline, *scanline2; STBTT__NOTUSED(vsubsample); if (result->w > 64) scanline = (float *) STBTT_malloc((result->w*2+1) * sizeof(float), userdata); else scanline = scanline_data; scanline2 = scanline + result->w; y = off_y; e[n].y0 = (float) (off_y + result->h) + 1; while (j < result->h) { // find center of pixel for this scanline float scan_y_top = y + 0.0f; float scan_y_bottom = y + 1.0f; stbtt__active_edge **step = &active; STBTT_memset(scanline , 0, result->w*sizeof(scanline[0])); STBTT_memset(scanline2, 0, (result->w+1)*sizeof(scanline[0])); // update all active edges; // remove all active edges that terminate before the top of this scanline while (*step) { stbtt__active_edge * z = *step; if (z->ey <= scan_y_top) { *step = z->next; // delete from list STBTT_assert(z->direction); z->direction = 0; stbtt__hheap_free(&hh, z); } else { step = &((*step)->next); // advance through list } } // insert all edges that start before the bottom of this scanline while (e->y0 <= scan_y_bottom) { if (e->y0 != e->y1) { stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata); if (z != NULL) { if (j == 0 && off_y != 0) { if (z->ey < scan_y_top) { // this can happen due to subpixel positioning and some kind of fp rounding error i think z->ey = scan_y_top; } } STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds // insert at front z->next = active; active = z; } } ++e; } // now process all active edges if (active) stbtt__fill_active_edges_new(scanline, scanline2+1, result->w, active, scan_y_top); { float sum = 0; for (i=0; i < result->w; ++i) { float k; int m; sum += scanline2[i]; k = scanline[i] + sum; k = (float) STBTT_fabs(k)*255 + 0.5f; m = (int) k; if (m > 255) m = 255; result->pixels[j*result->stride + i] = (unsigned char) m; } } // advance all the edges step = &active; while (*step) { stbtt__active_edge *z = *step; z->fx += z->fdx; // advance to position for current scanline step = &((*step)->next); // advance through list } ++y; ++j; } stbtt__hheap_cleanup(&hh, userdata); if (scanline != scanline_data) STBTT_free(scanline, userdata); } #else #error "Unrecognized value of STBTT_RASTERIZER_VERSION" #endif #define STBTT__COMPARE(a,b) ((a)->y0 < (b)->y0) static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n) { int i,j; for (i=1; i < n; ++i) { stbtt__edge t = p[i], *a = &t; j = i; while (j > 0) { stbtt__edge *b = &p[j-1]; int c = STBTT__COMPARE(a,b); if (!c) break; p[j] = p[j-1]; --j; } if (i != j) p[j] = t; } } static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n) { /* threshold for transitioning to insertion sort */ while (n > 12) { stbtt__edge t; int c01,c12,c,m,i,j; /* compute median of three */ m = n >> 1; c01 = STBTT__COMPARE(&p[0],&p[m]); c12 = STBTT__COMPARE(&p[m],&p[n-1]); /* if 0 >= mid >= end, or 0 < mid < end, then use mid */ if (c01 != c12) { /* otherwise, we'll need to swap something else to middle */ int z; c = STBTT__COMPARE(&p[0],&p[n-1]); /* 0>mid && midn => n; 0 0 */ /* 0n: 0>n => 0; 0 n */ z = (c == c12) ? 0 : n-1; t = p[z]; p[z] = p[m]; p[m] = t; } /* now p[m] is the median-of-three */ /* swap it to the beginning so it won't move around */ t = p[0]; p[0] = p[m]; p[m] = t; /* partition loop */ i=1; j=n-1; for(;;) { /* handling of equality is crucial here */ /* for sentinels & efficiency with duplicates */ for (;;++i) { if (!STBTT__COMPARE(&p[i], &p[0])) break; } for (;;--j) { if (!STBTT__COMPARE(&p[0], &p[j])) break; } /* make sure we haven't crossed */ if (i >= j) break; t = p[i]; p[i] = p[j]; p[j] = t; ++i; --j; } /* recurse on smaller side, iterate on larger */ if (j < (n-i)) { stbtt__sort_edges_quicksort(p,j); p = p+i; n = n-i; } else { stbtt__sort_edges_quicksort(p+i, n-i); n = j; } } } static void stbtt__sort_edges(stbtt__edge *p, int n) { stbtt__sort_edges_quicksort(p, n); stbtt__sort_edges_ins_sort(p, n); } typedef struct { float x,y; } stbtt__point; static void stbtt__rasterize(stbtt__bitmap *result, stbtt__point *pts, int *wcount, int windings, float scale_x, float scale_y, float shift_x, float shift_y, int off_x, int off_y, int invert, void *userdata) { float y_scale_inv = invert ? -scale_y : scale_y; stbtt__edge *e; int n,i,j,k,m; #if STBTT_RASTERIZER_VERSION == 1 int vsubsample = result->h < 8 ? 15 : 5; #elif STBTT_RASTERIZER_VERSION == 2 int vsubsample = 1; #else #error "Unrecognized value of STBTT_RASTERIZER_VERSION" #endif // vsubsample should divide 255 evenly; otherwise we won't reach full opacity // now we have to blow out the windings into explicit edge lists n = 0; for (i=0; i < windings; ++i) n += wcount[i]; e = (stbtt__edge *) STBTT_malloc(sizeof(*e) * (n+1), userdata); // add an extra one as a sentinel if (e == 0) return; n = 0; m=0; for (i=0; i < windings; ++i) { stbtt__point *p = pts + m; m += wcount[i]; j = wcount[i]-1; for (k=0; k < wcount[i]; j=k++) { int a=k,b=j; // skip the edge if horizontal if (p[j].y == p[k].y) continue; // add edge from j to k to the list e[n].invert = 0; if (invert ? p[j].y > p[k].y : p[j].y < p[k].y) { e[n].invert = 1; a=j,b=k; } e[n].x0 = p[a].x * scale_x + shift_x; e[n].y0 = (p[a].y * y_scale_inv + shift_y) * vsubsample; e[n].x1 = p[b].x * scale_x + shift_x; e[n].y1 = (p[b].y * y_scale_inv + shift_y) * vsubsample; ++n; } } // now sort the edges by their highest point (should snap to integer, and then by x) //STBTT_sort(e, n, sizeof(e[0]), stbtt__edge_compare); stbtt__sort_edges(e, n); // now, traverse the scanlines and find the intersections on each scanline, use xor winding rule stbtt__rasterize_sorted_edges(result, e, n, vsubsample, off_x, off_y, userdata); STBTT_free(e, userdata); } static void stbtt__add_point(stbtt__point *points, int n, float x, float y) { if (!points) return; // during first pass, it's unallocated points[n].x = x; points[n].y = y; } // tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n) { // midpoint float mx = (x0 + 2*x1 + x2)/4; float my = (y0 + 2*y1 + y2)/4; // versus directly drawn line float dx = (x0+x2)/2 - mx; float dy = (y0+y2)/2 - my; if (n > 16) // 65536 segments on one curve better be enough! return 1; if (dx*dx+dy*dy > objspace_flatness_squared) { // half-pixel error allowed... need to be smaller if AA stbtt__tesselate_curve(points, num_points, x0,y0, (x0+x1)/2.0f,(y0+y1)/2.0f, mx,my, objspace_flatness_squared,n+1); stbtt__tesselate_curve(points, num_points, mx,my, (x1+x2)/2.0f,(y1+y2)/2.0f, x2,y2, objspace_flatness_squared,n+1); } else { stbtt__add_point(points, *num_points,x2,y2); *num_points = *num_points+1; } return 1; } static void stbtt__tesselate_cubic(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float x3, float y3, float objspace_flatness_squared, int n) { // @TODO this "flatness" calculation is just made-up nonsense that seems to work well enough float dx0 = x1-x0; float dy0 = y1-y0; float dx1 = x2-x1; float dy1 = y2-y1; float dx2 = x3-x2; float dy2 = y3-y2; float dx = x3-x0; float dy = y3-y0; float longlen = (float) (STBTT_sqrt(dx0*dx0+dy0*dy0)+STBTT_sqrt(dx1*dx1+dy1*dy1)+STBTT_sqrt(dx2*dx2+dy2*dy2)); float shortlen = (float) STBTT_sqrt(dx*dx+dy*dy); float flatness_squared = longlen*longlen-shortlen*shortlen; if (n > 16) // 65536 segments on one curve better be enough! return; if (flatness_squared > objspace_flatness_squared) { float x01 = (x0+x1)/2; float y01 = (y0+y1)/2; float x12 = (x1+x2)/2; float y12 = (y1+y2)/2; float x23 = (x2+x3)/2; float y23 = (y2+y3)/2; float xa = (x01+x12)/2; float ya = (y01+y12)/2; float xb = (x12+x23)/2; float yb = (y12+y23)/2; float mx = (xa+xb)/2; float my = (ya+yb)/2; stbtt__tesselate_cubic(points, num_points, x0,y0, x01,y01, xa,ya, mx,my, objspace_flatness_squared,n+1); stbtt__tesselate_cubic(points, num_points, mx,my, xb,yb, x23,y23, x3,y3, objspace_flatness_squared,n+1); } else { stbtt__add_point(points, *num_points,x3,y3); *num_points = *num_points+1; } } // returns number of contours static stbtt__point *stbtt_FlattenCurves(stbtt_vertex *vertices, int num_verts, float objspace_flatness, int **contour_lengths, int *num_contours, void *userdata) { stbtt__point *points=0; int num_points=0; float objspace_flatness_squared = objspace_flatness * objspace_flatness; int i,n=0,start=0, pass; // count how many "moves" there are to get the contour count for (i=0; i < num_verts; ++i) if (vertices[i].type == STBTT_vmove) ++n; *num_contours = n; if (n == 0) return 0; *contour_lengths = (int *) STBTT_malloc(sizeof(**contour_lengths) * n, userdata); if (*contour_lengths == 0) { *num_contours = 0; return 0; } // make two passes through the points so we don't need to realloc for (pass=0; pass < 2; ++pass) { float x=0,y=0; if (pass == 1) { points = (stbtt__point *) STBTT_malloc(num_points * sizeof(points[0]), userdata); if (points == NULL) goto error; } num_points = 0; n= -1; for (i=0; i < num_verts; ++i) { switch (vertices[i].type) { case STBTT_vmove: // start the next contour if (n >= 0) (*contour_lengths)[n] = num_points - start; ++n; start = num_points; x = vertices[i].x, y = vertices[i].y; stbtt__add_point(points, num_points++, x,y); break; case STBTT_vline: x = vertices[i].x, y = vertices[i].y; stbtt__add_point(points, num_points++, x, y); break; case STBTT_vcurve: stbtt__tesselate_curve(points, &num_points, x,y, vertices[i].cx, vertices[i].cy, vertices[i].x, vertices[i].y, objspace_flatness_squared, 0); x = vertices[i].x, y = vertices[i].y; break; case STBTT_vcubic: stbtt__tesselate_cubic(points, &num_points, x,y, vertices[i].cx, vertices[i].cy, vertices[i].cx1, vertices[i].cy1, vertices[i].x, vertices[i].y, objspace_flatness_squared, 0); x = vertices[i].x, y = vertices[i].y; break; } } (*contour_lengths)[n] = num_points - start; } return points; error: STBTT_free(points, userdata); STBTT_free(*contour_lengths, userdata); *contour_lengths = 0; *num_contours = 0; return NULL; } STBTT_DEF void stbtt_Rasterize(stbtt__bitmap *result, float flatness_in_pixels, stbtt_vertex *vertices, int num_verts, float scale_x, float scale_y, float shift_x, float shift_y, int x_off, int y_off, int invert, void *userdata) { float scale = scale_x > scale_y ? scale_y : scale_x; int winding_count = 0; int *winding_lengths = NULL; stbtt__point *windings = stbtt_FlattenCurves(vertices, num_verts, flatness_in_pixels / scale, &winding_lengths, &winding_count, userdata); if (windings) { stbtt__rasterize(result, windings, winding_lengths, winding_count, scale_x, scale_y, shift_x, shift_y, x_off, y_off, invert, userdata); STBTT_free(winding_lengths, userdata); STBTT_free(windings, userdata); } } STBTT_DEF void stbtt_FreeBitmap(unsigned char *bitmap, void *userdata) { STBTT_free(bitmap, userdata); } STBTT_DEF unsigned char *stbtt_GetGlyphBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int glyph, int *width, int *height, int *xoff, int *yoff) { int ix0,iy0,ix1,iy1; stbtt__bitmap gbm; stbtt_vertex *vertices; int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); if (scale_x == 0) scale_x = scale_y; if (scale_y == 0) { if (scale_x == 0) { STBTT_free(vertices, info->userdata); return NULL; } scale_y = scale_x; } stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,&ix1,&iy1); // now we get the size gbm.w = (ix1 - ix0); gbm.h = (iy1 - iy0); gbm.pixels = NULL; // in case we error if (width ) *width = gbm.w; if (height) *height = gbm.h; if (xoff ) *xoff = ix0; if (yoff ) *yoff = iy0; if (gbm.w && gbm.h) { gbm.pixels = (unsigned char *) STBTT_malloc(gbm.w * gbm.h, info->userdata); if (gbm.pixels) { gbm.stride = gbm.w; stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0, iy0, 1, info->userdata); } } STBTT_free(vertices, info->userdata); return gbm.pixels; } STBTT_DEF unsigned char *stbtt_GetGlyphBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int glyph, int *width, int *height, int *xoff, int *yoff) { return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y, 0.0f, 0.0f, glyph, width, height, xoff, yoff); } STBTT_DEF void stbtt_MakeGlyphBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int glyph) { int ix0,iy0; stbtt_vertex *vertices; int num_verts = stbtt_GetGlyphShape(info, glyph, &vertices); stbtt__bitmap gbm; stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale_x, scale_y, shift_x, shift_y, &ix0,&iy0,0,0); gbm.pixels = output; gbm.w = out_w; gbm.h = out_h; gbm.stride = out_stride; if (gbm.w && gbm.h) stbtt_Rasterize(&gbm, 0.35f, vertices, num_verts, scale_x, scale_y, shift_x, shift_y, ix0,iy0, 1, info->userdata); STBTT_free(vertices, info->userdata); } STBTT_DEF void stbtt_MakeGlyphBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int glyph) { stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, glyph); } STBTT_DEF unsigned char *stbtt_GetCodepointBitmapSubpixel(const stbtt_fontinfo *info, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint, int *width, int *height, int *xoff, int *yoff) { return stbtt_GetGlyphBitmapSubpixel(info, scale_x, scale_y,shift_x,shift_y, stbtt_FindGlyphIndex(info,codepoint), width,height,xoff,yoff); } STBTT_DEF void stbtt_MakeCodepointBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int oversample_x, int oversample_y, float *sub_x, float *sub_y, int codepoint) { stbtt_MakeGlyphBitmapSubpixelPrefilter(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, oversample_x, oversample_y, sub_x, sub_y, stbtt_FindGlyphIndex(info,codepoint)); } STBTT_DEF void stbtt_MakeCodepointBitmapSubpixel(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int codepoint) { stbtt_MakeGlyphBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, shift_x, shift_y, stbtt_FindGlyphIndex(info,codepoint)); } STBTT_DEF unsigned char *stbtt_GetCodepointBitmap(const stbtt_fontinfo *info, float scale_x, float scale_y, int codepoint, int *width, int *height, int *xoff, int *yoff) { return stbtt_GetCodepointBitmapSubpixel(info, scale_x, scale_y, 0.0f,0.0f, codepoint, width,height,xoff,yoff); } STBTT_DEF void stbtt_MakeCodepointBitmap(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, int codepoint) { stbtt_MakeCodepointBitmapSubpixel(info, output, out_w, out_h, out_stride, scale_x, scale_y, 0.0f,0.0f, codepoint); } ////////////////////////////////////////////////////////////////////////////// // // bitmap baking // // This is SUPER-CRAPPY packing to keep source code small static int stbtt_BakeFontBitmap_internal(unsigned char *data, int offset, // font location (use offset=0 for plain .ttf) float pixel_height, // height of font in pixels unsigned char *pixels, int pw, int ph, // bitmap to be filled in int first_char, int num_chars, // characters to bake stbtt_bakedchar *chardata) { float scale; int x,y,bottom_y, i; stbtt_fontinfo f; f.userdata = NULL; if (!stbtt_InitFont(&f, data, offset)) return -1; STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels x=y=1; bottom_y = 1; scale = stbtt_ScaleForPixelHeight(&f, pixel_height); for (i=0; i < num_chars; ++i) { int advance, lsb, x0,y0,x1,y1,gw,gh; int g = stbtt_FindGlyphIndex(&f, first_char + i); stbtt_GetGlyphHMetrics(&f, g, &advance, &lsb); stbtt_GetGlyphBitmapBox(&f, g, scale,scale, &x0,&y0,&x1,&y1); gw = x1-x0; gh = y1-y0; if (x + gw + 1 >= pw) y = bottom_y, x = 1; // advance to next row if (y + gh + 1 >= ph) // check if it fits vertically AFTER potentially moving to next row return -i; STBTT_assert(x+gw < pw); STBTT_assert(y+gh < ph); stbtt_MakeGlyphBitmap(&f, pixels+x+y*pw, gw,gh,pw, scale,scale, g); chardata[i].x0 = (stbtt_int16) x; chardata[i].y0 = (stbtt_int16) y; chardata[i].x1 = (stbtt_int16) (x + gw); chardata[i].y1 = (stbtt_int16) (y + gh); chardata[i].xadvance = scale * advance; chardata[i].xoff = (float) x0; chardata[i].yoff = (float) y0; x = x + gw + 1; if (y+gh+1 > bottom_y) bottom_y = y+gh+1; } return bottom_y; } STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int opengl_fillrule) { float d3d_bias = opengl_fillrule ? 0 : -0.5f; float ipw = 1.0f / pw, iph = 1.0f / ph; const stbtt_bakedchar *b = chardata + char_index; int round_x = STBTT_ifloor((*xpos + b->xoff) + 0.5f); int round_y = STBTT_ifloor((*ypos + b->yoff) + 0.5f); q->x0 = round_x + d3d_bias; q->y0 = round_y + d3d_bias; q->x1 = round_x + b->x1 - b->x0 + d3d_bias; q->y1 = round_y + b->y1 - b->y0 + d3d_bias; q->s0 = b->x0 * ipw; q->t0 = b->y0 * iph; q->s1 = b->x1 * ipw; q->t1 = b->y1 * iph; *xpos += b->xadvance; } ////////////////////////////////////////////////////////////////////////////// // // rectangle packing replacement routines if you don't have stb_rect_pack.h // #ifndef STB_RECT_PACK_VERSION typedef int stbrp_coord; //////////////////////////////////////////////////////////////////////////////////// // // // // // COMPILER WARNING ?!?!? // // // // // // if you get a compile warning due to these symbols being defined more than // // once, move #include "stb_rect_pack.h" before #include "stb_truetype.h" // // // //////////////////////////////////////////////////////////////////////////////////// typedef struct { int width,height; int x,y,bottom_y; } stbrp_context; typedef struct { unsigned char x; } stbrp_node; struct stbrp_rect { stbrp_coord x,y; int id,w,h,was_packed; }; static void stbrp_init_target(stbrp_context *con, int pw, int ph, stbrp_node *nodes, int num_nodes) { con->width = pw; con->height = ph; con->x = 0; con->y = 0; con->bottom_y = 0; STBTT__NOTUSED(nodes); STBTT__NOTUSED(num_nodes); } static void stbrp_pack_rects(stbrp_context *con, stbrp_rect *rects, int num_rects) { int i; for (i=0; i < num_rects; ++i) { if (con->x + rects[i].w > con->width) { con->x = 0; con->y = con->bottom_y; } if (con->y + rects[i].h > con->height) break; rects[i].x = con->x; rects[i].y = con->y; rects[i].was_packed = 1; con->x += rects[i].w; if (con->y + rects[i].h > con->bottom_y) con->bottom_y = con->y + rects[i].h; } for ( ; i < num_rects; ++i) rects[i].was_packed = 0; } #endif ////////////////////////////////////////////////////////////////////////////// // // bitmap baking // // This is SUPER-AWESOME (tm Ryan Gordon) packing using stb_rect_pack.h. If // stb_rect_pack.h isn't available, it uses the BakeFontBitmap strategy. STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, int pw, int ph, int stride_in_bytes, int padding, void *alloc_context) { stbrp_context *context = (stbrp_context *) STBTT_malloc(sizeof(*context) ,alloc_context); int num_nodes = pw - padding; stbrp_node *nodes = (stbrp_node *) STBTT_malloc(sizeof(*nodes ) * num_nodes,alloc_context); if (context == NULL || nodes == NULL) { if (context != NULL) STBTT_free(context, alloc_context); if (nodes != NULL) STBTT_free(nodes , alloc_context); return 0; } spc->user_allocator_context = alloc_context; spc->width = pw; spc->height = ph; spc->pixels = pixels; spc->pack_info = context; spc->nodes = nodes; spc->padding = padding; spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw; spc->h_oversample = 1; spc->v_oversample = 1; spc->skip_missing = 0; stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes); if (pixels) STBTT_memset(pixels, 0, pw*ph); // background of 0 around pixels return 1; } STBTT_DEF void stbtt_PackEnd (stbtt_pack_context *spc) { STBTT_free(spc->nodes , spc->user_allocator_context); STBTT_free(spc->pack_info, spc->user_allocator_context); } STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h_oversample, unsigned int v_oversample) { STBTT_assert(h_oversample <= STBTT_MAX_OVERSAMPLE); STBTT_assert(v_oversample <= STBTT_MAX_OVERSAMPLE); if (h_oversample <= STBTT_MAX_OVERSAMPLE) spc->h_oversample = h_oversample; if (v_oversample <= STBTT_MAX_OVERSAMPLE) spc->v_oversample = v_oversample; } STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip) { spc->skip_missing = skip; } #define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1) static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) { unsigned char buffer[STBTT_MAX_OVERSAMPLE]; int safe_w = w - kernel_width; int j; STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze for (j=0; j < h; ++j) { int i; unsigned int total; STBTT_memset(buffer, 0, kernel_width); total = 0; // make kernel_width a constant in common cases so compiler can optimize out the divide switch (kernel_width) { case 2: for (i=0; i <= safe_w; ++i) { total += pixels[i] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; pixels[i] = (unsigned char) (total / 2); } break; case 3: for (i=0; i <= safe_w; ++i) { total += pixels[i] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; pixels[i] = (unsigned char) (total / 3); } break; case 4: for (i=0; i <= safe_w; ++i) { total += pixels[i] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; pixels[i] = (unsigned char) (total / 4); } break; case 5: for (i=0; i <= safe_w; ++i) { total += pixels[i] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; pixels[i] = (unsigned char) (total / 5); } break; default: for (i=0; i <= safe_w; ++i) { total += pixels[i] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i]; pixels[i] = (unsigned char) (total / kernel_width); } break; } for (; i < w; ++i) { STBTT_assert(pixels[i] == 0); total -= buffer[i & STBTT__OVER_MASK]; pixels[i] = (unsigned char) (total / kernel_width); } pixels += stride_in_bytes; } } static void stbtt__v_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width) { unsigned char buffer[STBTT_MAX_OVERSAMPLE]; int safe_h = h - kernel_width; int j; STBTT_memset(buffer, 0, STBTT_MAX_OVERSAMPLE); // suppress bogus warning from VS2013 -analyze for (j=0; j < w; ++j) { int i; unsigned int total; STBTT_memset(buffer, 0, kernel_width); total = 0; // make kernel_width a constant in common cases so compiler can optimize out the divide switch (kernel_width) { case 2: for (i=0; i <= safe_h; ++i) { total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; pixels[i*stride_in_bytes] = (unsigned char) (total / 2); } break; case 3: for (i=0; i <= safe_h; ++i) { total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; pixels[i*stride_in_bytes] = (unsigned char) (total / 3); } break; case 4: for (i=0; i <= safe_h; ++i) { total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; pixels[i*stride_in_bytes] = (unsigned char) (total / 4); } break; case 5: for (i=0; i <= safe_h; ++i) { total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; pixels[i*stride_in_bytes] = (unsigned char) (total / 5); } break; default: for (i=0; i <= safe_h; ++i) { total += pixels[i*stride_in_bytes] - buffer[i & STBTT__OVER_MASK]; buffer[(i+kernel_width) & STBTT__OVER_MASK] = pixels[i*stride_in_bytes]; pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); } break; } for (; i < h; ++i) { STBTT_assert(pixels[i*stride_in_bytes] == 0); total -= buffer[i & STBTT__OVER_MASK]; pixels[i*stride_in_bytes] = (unsigned char) (total / kernel_width); } pixels += 1; } } static float stbtt__oversample_shift(int oversample) { if (!oversample) return 0.0f; // The prefilter is a box filter of width "oversample", // which shifts phase by (oversample - 1)/2 pixels in // oversampled space. We want to shift in the opposite // direction to counter this. return (float)-(oversample - 1) / (2.0f * (float)oversample); } // rects array must be big enough to accommodate all characters in the given ranges STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) { int i,j,k; int missing_glyph_added = 0; k=0; for (i=0; i < num_ranges; ++i) { float fh = ranges[i].font_size; float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); ranges[i].h_oversample = (unsigned char) spc->h_oversample; ranges[i].v_oversample = (unsigned char) spc->v_oversample; for (j=0; j < ranges[i].num_chars; ++j) { int x0,y0,x1,y1; int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; int glyph = stbtt_FindGlyphIndex(info, codepoint); if (glyph == 0 && (spc->skip_missing || missing_glyph_added)) { rects[k].w = rects[k].h = 0; } else { stbtt_GetGlyphBitmapBoxSubpixel(info,glyph, scale * spc->h_oversample, scale * spc->v_oversample, 0,0, &x0,&y0,&x1,&y1); rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1); rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1); if (glyph == 0) missing_glyph_added = 1; } ++k; } } return k; } STBTT_DEF void stbtt_MakeGlyphBitmapSubpixelPrefilter(const stbtt_fontinfo *info, unsigned char *output, int out_w, int out_h, int out_stride, float scale_x, float scale_y, float shift_x, float shift_y, int prefilter_x, int prefilter_y, float *sub_x, float *sub_y, int glyph) { stbtt_MakeGlyphBitmapSubpixel(info, output, out_w - (prefilter_x - 1), out_h - (prefilter_y - 1), out_stride, scale_x, scale_y, shift_x, shift_y, glyph); if (prefilter_x > 1) stbtt__h_prefilter(output, out_w, out_h, out_stride, prefilter_x); if (prefilter_y > 1) stbtt__v_prefilter(output, out_w, out_h, out_stride, prefilter_y); *sub_x = stbtt__oversample_shift(prefilter_x); *sub_y = stbtt__oversample_shift(prefilter_y); } // rects array must be big enough to accommodate all characters in the given ranges STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const stbtt_fontinfo *info, stbtt_pack_range *ranges, int num_ranges, stbrp_rect *rects) { int i,j,k, missing_glyph = -1, return_value = 1; // save current values int old_h_over = spc->h_oversample; int old_v_over = spc->v_oversample; k = 0; for (i=0; i < num_ranges; ++i) { float fh = ranges[i].font_size; float scale = fh > 0 ? stbtt_ScaleForPixelHeight(info, fh) : stbtt_ScaleForMappingEmToPixels(info, -fh); float recip_h,recip_v,sub_x,sub_y; spc->h_oversample = ranges[i].h_oversample; spc->v_oversample = ranges[i].v_oversample; recip_h = 1.0f / spc->h_oversample; recip_v = 1.0f / spc->v_oversample; sub_x = stbtt__oversample_shift(spc->h_oversample); sub_y = stbtt__oversample_shift(spc->v_oversample); for (j=0; j < ranges[i].num_chars; ++j) { stbrp_rect *r = &rects[k]; if (r->was_packed && r->w != 0 && r->h != 0) { stbtt_packedchar *bc = &ranges[i].chardata_for_range[j]; int advance, lsb, x0,y0,x1,y1; int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j]; int glyph = stbtt_FindGlyphIndex(info, codepoint); stbrp_coord pad = (stbrp_coord) spc->padding; // pad on left and top r->x += pad; r->y += pad; r->w -= pad; r->h -= pad; stbtt_GetGlyphHMetrics(info, glyph, &advance, &lsb); stbtt_GetGlyphBitmapBox(info, glyph, scale * spc->h_oversample, scale * spc->v_oversample, &x0,&y0,&x1,&y1); stbtt_MakeGlyphBitmapSubpixel(info, spc->pixels + r->x + r->y*spc->stride_in_bytes, r->w - spc->h_oversample+1, r->h - spc->v_oversample+1, spc->stride_in_bytes, scale * spc->h_oversample, scale * spc->v_oversample, 0,0, glyph); if (spc->h_oversample > 1) stbtt__h_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, r->w, r->h, spc->stride_in_bytes, spc->h_oversample); if (spc->v_oversample > 1) stbtt__v_prefilter(spc->pixels + r->x + r->y*spc->stride_in_bytes, r->w, r->h, spc->stride_in_bytes, spc->v_oversample); bc->x0 = (stbtt_int16) r->x; bc->y0 = (stbtt_int16) r->y; bc->x1 = (stbtt_int16) (r->x + r->w); bc->y1 = (stbtt_int16) (r->y + r->h); bc->xadvance = scale * advance; bc->xoff = (float) x0 * recip_h + sub_x; bc->yoff = (float) y0 * recip_v + sub_y; bc->xoff2 = (x0 + r->w) * recip_h + sub_x; bc->yoff2 = (y0 + r->h) * recip_v + sub_y; if (glyph == 0) missing_glyph = j; } else if (spc->skip_missing) { return_value = 0; } else if (r->was_packed && r->w == 0 && r->h == 0 && missing_glyph >= 0) { ranges[i].chardata_for_range[j] = ranges[i].chardata_for_range[missing_glyph]; } else { return_value = 0; // if any fail, report failure } ++k; } } // restore original values spc->h_oversample = old_h_over; spc->v_oversample = old_v_over; return return_value; } STBTT_DEF void stbtt_PackFontRangesPackRects(stbtt_pack_context *spc, stbrp_rect *rects, int num_rects) { stbrp_pack_rects((stbrp_context *) spc->pack_info, rects, num_rects); } STBTT_DEF int stbtt_PackFontRanges(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, stbtt_pack_range *ranges, int num_ranges) { stbtt_fontinfo info; int i,j,n, return_value = 1; //stbrp_context *context = (stbrp_context *) spc->pack_info; stbrp_rect *rects; // flag all characters as NOT packed for (i=0; i < num_ranges; ++i) for (j=0; j < ranges[i].num_chars; ++j) ranges[i].chardata_for_range[j].x0 = ranges[i].chardata_for_range[j].y0 = ranges[i].chardata_for_range[j].x1 = ranges[i].chardata_for_range[j].y1 = 0; n = 0; for (i=0; i < num_ranges; ++i) n += ranges[i].num_chars; rects = (stbrp_rect *) STBTT_malloc(sizeof(*rects) * n, spc->user_allocator_context); if (rects == NULL) return 0; info.userdata = spc->user_allocator_context; stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata,font_index)); n = stbtt_PackFontRangesGatherRects(spc, &info, ranges, num_ranges, rects); stbtt_PackFontRangesPackRects(spc, rects, n); return_value = stbtt_PackFontRangesRenderIntoRects(spc, &info, ranges, num_ranges, rects); STBTT_free(rects, spc->user_allocator_context); return return_value; } STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *fontdata, int font_index, float font_size, int first_unicode_codepoint_in_range, int num_chars_in_range, stbtt_packedchar *chardata_for_range) { stbtt_pack_range range; range.first_unicode_codepoint_in_range = first_unicode_codepoint_in_range; range.array_of_unicode_codepoints = NULL; range.num_chars = num_chars_in_range; range.chardata_for_range = chardata_for_range; range.font_size = font_size; return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1); } STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap) { int i_ascent, i_descent, i_lineGap; float scale; stbtt_fontinfo info; stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index)); scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size); stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap); *ascent = (float) i_ascent * scale; *descent = (float) i_descent * scale; *lineGap = (float) i_lineGap * scale; } STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer) { float ipw = 1.0f / pw, iph = 1.0f / ph; const stbtt_packedchar *b = chardata + char_index; if (align_to_integer) { float x = (float) STBTT_ifloor((*xpos + b->xoff) + 0.5f); float y = (float) STBTT_ifloor((*ypos + b->yoff) + 0.5f); q->x0 = x; q->y0 = y; q->x1 = x + b->xoff2 - b->xoff; q->y1 = y + b->yoff2 - b->yoff; } else { q->x0 = *xpos + b->xoff; q->y0 = *ypos + b->yoff; q->x1 = *xpos + b->xoff2; q->y1 = *ypos + b->yoff2; } q->s0 = b->x0 * ipw; q->t0 = b->y0 * iph; q->s1 = b->x1 * ipw; q->t1 = b->y1 * iph; *xpos += b->xadvance; } ////////////////////////////////////////////////////////////////////////////// // // sdf computation // #define STBTT_min(a,b) ((a) < (b) ? (a) : (b)) #define STBTT_max(a,b) ((a) < (b) ? (b) : (a)) static int stbtt__ray_intersect_bezier(float orig[2], float ray[2], float q0[2], float q1[2], float q2[2], float hits[2][2]) { float q0perp = q0[1]*ray[0] - q0[0]*ray[1]; float q1perp = q1[1]*ray[0] - q1[0]*ray[1]; float q2perp = q2[1]*ray[0] - q2[0]*ray[1]; float roperp = orig[1]*ray[0] - orig[0]*ray[1]; float a = q0perp - 2*q1perp + q2perp; float b = q1perp - q0perp; float c = q0perp - roperp; float s0 = 0., s1 = 0.; int num_s = 0; if (a != 0.0) { float discr = b*b - a*c; if (discr > 0.0) { float rcpna = -1 / a; float d = (float) STBTT_sqrt(discr); s0 = (b+d) * rcpna; s1 = (b-d) * rcpna; if (s0 >= 0.0 && s0 <= 1.0) num_s = 1; if (d > 0.0 && s1 >= 0.0 && s1 <= 1.0) { if (num_s == 0) s0 = s1; ++num_s; } } } else { // 2*b*s + c = 0 // s = -c / (2*b) s0 = c / (-2 * b); if (s0 >= 0.0 && s0 <= 1.0) num_s = 1; } if (num_s == 0) return 0; else { float rcp_len2 = 1 / (ray[0]*ray[0] + ray[1]*ray[1]); float rayn_x = ray[0] * rcp_len2, rayn_y = ray[1] * rcp_len2; float q0d = q0[0]*rayn_x + q0[1]*rayn_y; float q1d = q1[0]*rayn_x + q1[1]*rayn_y; float q2d = q2[0]*rayn_x + q2[1]*rayn_y; float rod = orig[0]*rayn_x + orig[1]*rayn_y; float q10d = q1d - q0d; float q20d = q2d - q0d; float q0rd = q0d - rod; hits[0][0] = q0rd + s0*(2.0f - 2.0f*s0)*q10d + s0*s0*q20d; hits[0][1] = a*s0+b; if (num_s > 1) { hits[1][0] = q0rd + s1*(2.0f - 2.0f*s1)*q10d + s1*s1*q20d; hits[1][1] = a*s1+b; return 2; } else { return 1; } } } static int equal(float *a, float *b) { return (a[0] == b[0] && a[1] == b[1]); } static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex *verts) { int i; float orig[2], ray[2] = { 1, 0 }; float y_frac; int winding = 0; orig[0] = x; orig[1] = y; // make sure y never passes through a vertex of the shape y_frac = (float) STBTT_fmod(y, 1.0f); if (y_frac < 0.01f) y += 0.01f; else if (y_frac > 0.99f) y -= 0.01f; orig[1] = y; // test a ray from (-infinity,y) to (x,y) for (i=0; i < nverts; ++i) { if (verts[i].type == STBTT_vline) { int x0 = (int) verts[i-1].x, y0 = (int) verts[i-1].y; int x1 = (int) verts[i ].x, y1 = (int) verts[i ].y; if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; if (x_inter < x) winding += (y0 < y1) ? 1 : -1; } } if (verts[i].type == STBTT_vcurve) { int x0 = (int) verts[i-1].x , y0 = (int) verts[i-1].y ; int x1 = (int) verts[i ].cx, y1 = (int) verts[i ].cy; int x2 = (int) verts[i ].x , y2 = (int) verts[i ].y ; int ax = STBTT_min(x0,STBTT_min(x1,x2)), ay = STBTT_min(y0,STBTT_min(y1,y2)); int by = STBTT_max(y0,STBTT_max(y1,y2)); if (y > ay && y < by && x > ax) { float q0[2],q1[2],q2[2]; float hits[2][2]; q0[0] = (float)x0; q0[1] = (float)y0; q1[0] = (float)x1; q1[1] = (float)y1; q2[0] = (float)x2; q2[1] = (float)y2; if (equal(q0,q1) || equal(q1,q2)) { x0 = (int)verts[i-1].x; y0 = (int)verts[i-1].y; x1 = (int)verts[i ].x; y1 = (int)verts[i ].y; if (y > STBTT_min(y0,y1) && y < STBTT_max(y0,y1) && x > STBTT_min(x0,x1)) { float x_inter = (y - y0) / (y1 - y0) * (x1-x0) + x0; if (x_inter < x) winding += (y0 < y1) ? 1 : -1; } } else { int num_hits = stbtt__ray_intersect_bezier(orig, ray, q0, q1, q2, hits); if (num_hits >= 1) if (hits[0][0] < 0) winding += (hits[0][1] < 0 ? -1 : 1); if (num_hits >= 2) if (hits[1][0] < 0) winding += (hits[1][1] < 0 ? -1 : 1); } } } } return winding; } static float stbtt__cuberoot( float x ) { if (x<0) return -(float) STBTT_pow(-x,1.0f/3.0f); else return (float) STBTT_pow( x,1.0f/3.0f); } // x^3 + c*x^2 + b*x + a = 0 static int stbtt__solve_cubic(float a, float b, float c, float* r) { float s = -a / 3; float p = b - a*a / 3; float q = a * (2*a*a - 9*b) / 27 + c; float p3 = p*p*p; float d = q*q + 4*p3 / 27; if (d >= 0) { float z = (float) STBTT_sqrt(d); float u = (-q + z) / 2; float v = (-q - z) / 2; u = stbtt__cuberoot(u); v = stbtt__cuberoot(v); r[0] = s + u + v; return 1; } else { float u = (float) STBTT_sqrt(-p/3); float v = (float) STBTT_acos(-STBTT_sqrt(-27/p3) * q / 2) / 3; // p3 must be negative, since d is negative float m = (float) STBTT_cos(v); float n = (float) STBTT_cos(v-3.141592/2)*1.732050808f; r[0] = s + u * 2 * m; r[1] = s - u * (m + n); r[2] = s - u * (m - n); //STBTT_assert( STBTT_fabs(((r[0]+a)*r[0]+b)*r[0]+c) < 0.05f); // these asserts may not be safe at all scales, though they're in bezier t parameter units so maybe? //STBTT_assert( STBTT_fabs(((r[1]+a)*r[1]+b)*r[1]+c) < 0.05f); //STBTT_assert( STBTT_fabs(((r[2]+a)*r[2]+b)*r[2]+c) < 0.05f); return 3; } } STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float scale, int glyph, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) { float scale_x = scale, scale_y = scale; int ix0,iy0,ix1,iy1; int w,h; unsigned char *data; if (scale == 0) return NULL; stbtt_GetGlyphBitmapBoxSubpixel(info, glyph, scale, scale, 0.0f,0.0f, &ix0,&iy0,&ix1,&iy1); // if empty, return NULL if (ix0 == ix1 || iy0 == iy1) return NULL; ix0 -= padding; iy0 -= padding; ix1 += padding; iy1 += padding; w = (ix1 - ix0); h = (iy1 - iy0); if (width ) *width = w; if (height) *height = h; if (xoff ) *xoff = ix0; if (yoff ) *yoff = iy0; // invert for y-downwards bitmaps scale_y = -scale_y; { int x,y,i,j; float *precompute; stbtt_vertex *verts; int num_verts = stbtt_GetGlyphShape(info, glyph, &verts); data = (unsigned char *) STBTT_malloc(w * h, info->userdata); precompute = (float *) STBTT_malloc(num_verts * sizeof(float), info->userdata); for (i=0,j=num_verts-1; i < num_verts; j=i++) { if (verts[i].type == STBTT_vline) { float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; float x1 = verts[j].x*scale_x, y1 = verts[j].y*scale_y; float dist = (float) STBTT_sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0)); precompute[i] = (dist == 0) ? 0.0f : 1.0f / dist; } else if (verts[i].type == STBTT_vcurve) { float x2 = verts[j].x *scale_x, y2 = verts[j].y *scale_y; float x1 = verts[i].cx*scale_x, y1 = verts[i].cy*scale_y; float x0 = verts[i].x *scale_x, y0 = verts[i].y *scale_y; float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; float len2 = bx*bx + by*by; if (len2 != 0.0f) precompute[i] = 1.0f / (bx*bx + by*by); else precompute[i] = 0.0f; } else precompute[i] = 0.0f; } for (y=iy0; y < iy1; ++y) { for (x=ix0; x < ix1; ++x) { float val; float min_dist = 999999.0f; float sx = (float) x + 0.5f; float sy = (float) y + 0.5f; float x_gspace = (sx / scale_x); float y_gspace = (sy / scale_y); int winding = stbtt__compute_crossings_x(x_gspace, y_gspace, num_verts, verts); // @OPTIMIZE: this could just be a rasterization, but needs to be line vs. non-tesselated curves so a new path for (i=0; i < num_verts; ++i) { float x0 = verts[i].x*scale_x, y0 = verts[i].y*scale_y; // check against every point here rather than inside line/curve primitives -- @TODO: wrong if multiple 'moves' in a row produce a garbage point, and given culling, probably more efficient to do within line/curve float dist2 = (x0-sx)*(x0-sx) + (y0-sy)*(y0-sy); if (dist2 < min_dist*min_dist) min_dist = (float) STBTT_sqrt(dist2); if (verts[i].type == STBTT_vline) { float x1 = verts[i-1].x*scale_x, y1 = verts[i-1].y*scale_y; // coarse culling against bbox //if (sx > STBTT_min(x0,x1)-min_dist && sx < STBTT_max(x0,x1)+min_dist && // sy > STBTT_min(y0,y1)-min_dist && sy < STBTT_max(y0,y1)+min_dist) float dist = (float) STBTT_fabs((x1-x0)*(y0-sy) - (y1-y0)*(x0-sx)) * precompute[i]; STBTT_assert(i != 0); if (dist < min_dist) { // check position along line // x' = x0 + t*(x1-x0), y' = y0 + t*(y1-y0) // minimize (x'-sx)*(x'-sx)+(y'-sy)*(y'-sy) float dx = x1-x0, dy = y1-y0; float px = x0-sx, py = y0-sy; // minimize (px+t*dx)^2 + (py+t*dy)^2 = px*px + 2*px*dx*t + t^2*dx*dx + py*py + 2*py*dy*t + t^2*dy*dy // derivative: 2*px*dx + 2*py*dy + (2*dx*dx+2*dy*dy)*t, set to 0 and solve float t = -(px*dx + py*dy) / (dx*dx + dy*dy); if (t >= 0.0f && t <= 1.0f) min_dist = dist; } } else if (verts[i].type == STBTT_vcurve) { float x2 = verts[i-1].x *scale_x, y2 = verts[i-1].y *scale_y; float x1 = verts[i ].cx*scale_x, y1 = verts[i ].cy*scale_y; float box_x0 = STBTT_min(STBTT_min(x0,x1),x2); float box_y0 = STBTT_min(STBTT_min(y0,y1),y2); float box_x1 = STBTT_max(STBTT_max(x0,x1),x2); float box_y1 = STBTT_max(STBTT_max(y0,y1),y2); // coarse culling against bbox to avoid computing cubic unnecessarily if (sx > box_x0-min_dist && sx < box_x1+min_dist && sy > box_y0-min_dist && sy < box_y1+min_dist) { int num=0; float ax = x1-x0, ay = y1-y0; float bx = x0 - 2*x1 + x2, by = y0 - 2*y1 + y2; float mx = x0 - sx, my = y0 - sy; float res[3],px,py,t,it; float a_inv = precompute[i]; if (a_inv == 0.0) { // if a_inv is 0, it's 2nd degree so use quadratic formula float a = 3*(ax*bx + ay*by); float b = 2*(ax*ax + ay*ay) + (mx*bx+my*by); float c = mx*ax+my*ay; if (a == 0.0) { // if a is 0, it's linear if (b != 0.0) { res[num++] = -c/b; } } else { float discriminant = b*b - 4*a*c; if (discriminant < 0) num = 0; else { float root = (float) STBTT_sqrt(discriminant); res[0] = (-b - root)/(2*a); res[1] = (-b + root)/(2*a); num = 2; // don't bother distinguishing 1-solution case, as code below will still work } } } else { float b = 3*(ax*bx + ay*by) * a_inv; // could precompute this as it doesn't depend on sample point float c = (2*(ax*ax + ay*ay) + (mx*bx+my*by)) * a_inv; float d = (mx*ax+my*ay) * a_inv; num = stbtt__solve_cubic(b, c, d, res); } if (num >= 1 && res[0] >= 0.0f && res[0] <= 1.0f) { t = res[0], it = 1.0f - t; px = it*it*x0 + 2*t*it*x1 + t*t*x2; py = it*it*y0 + 2*t*it*y1 + t*t*y2; dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); if (dist2 < min_dist * min_dist) min_dist = (float) STBTT_sqrt(dist2); } if (num >= 2 && res[1] >= 0.0f && res[1] <= 1.0f) { t = res[1], it = 1.0f - t; px = it*it*x0 + 2*t*it*x1 + t*t*x2; py = it*it*y0 + 2*t*it*y1 + t*t*y2; dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); if (dist2 < min_dist * min_dist) min_dist = (float) STBTT_sqrt(dist2); } if (num >= 3 && res[2] >= 0.0f && res[2] <= 1.0f) { t = res[2], it = 1.0f - t; px = it*it*x0 + 2*t*it*x1 + t*t*x2; py = it*it*y0 + 2*t*it*y1 + t*t*y2; dist2 = (px-sx)*(px-sx) + (py-sy)*(py-sy); if (dist2 < min_dist * min_dist) min_dist = (float) STBTT_sqrt(dist2); } } } } if (winding == 0) min_dist = -min_dist; // if outside the shape, value is negative val = onedge_value + pixel_dist_scale * min_dist; if (val < 0) val = 0; else if (val > 255) val = 255; data[(y-iy0)*w+(x-ix0)] = (unsigned char) val; } } STBTT_free(precompute, info->userdata); STBTT_free(verts, info->userdata); } return data; } STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff) { return stbtt_GetGlyphSDF(info, scale, stbtt_FindGlyphIndex(info, codepoint), padding, onedge_value, pixel_dist_scale, width, height, xoff, yoff); } STBTT_DEF void stbtt_FreeSDF(unsigned char *bitmap, void *userdata) { STBTT_free(bitmap, userdata); } ////////////////////////////////////////////////////////////////////////////// // // font name matching -- recommended not to use this // // check if a utf8 string contains a prefix which is the utf16 string; if so return length of matching utf8 string static stbtt_int32 stbtt__CompareUTF8toUTF16_bigendian_prefix(stbtt_uint8 *s1, stbtt_int32 len1, stbtt_uint8 *s2, stbtt_int32 len2) { stbtt_int32 i=0; // convert utf16 to utf8 and compare the results while converting while (len2) { stbtt_uint16 ch = s2[0]*256 + s2[1]; if (ch < 0x80) { if (i >= len1) return -1; if (s1[i++] != ch) return -1; } else if (ch < 0x800) { if (i+1 >= len1) return -1; if (s1[i++] != 0xc0 + (ch >> 6)) return -1; if (s1[i++] != 0x80 + (ch & 0x3f)) return -1; } else if (ch >= 0xd800 && ch < 0xdc00) { stbtt_uint32 c; stbtt_uint16 ch2 = s2[2]*256 + s2[3]; if (i+3 >= len1) return -1; c = ((ch - 0xd800) << 10) + (ch2 - 0xdc00) + 0x10000; if (s1[i++] != 0xf0 + (c >> 18)) return -1; if (s1[i++] != 0x80 + ((c >> 12) & 0x3f)) return -1; if (s1[i++] != 0x80 + ((c >> 6) & 0x3f)) return -1; if (s1[i++] != 0x80 + ((c ) & 0x3f)) return -1; s2 += 2; // plus another 2 below len2 -= 2; } else if (ch >= 0xdc00 && ch < 0xe000) { return -1; } else { if (i+2 >= len1) return -1; if (s1[i++] != 0xe0 + (ch >> 12)) return -1; if (s1[i++] != 0x80 + ((ch >> 6) & 0x3f)) return -1; if (s1[i++] != 0x80 + ((ch ) & 0x3f)) return -1; } s2 += 2; len2 -= 2; } return i; } static int stbtt_CompareUTF8toUTF16_bigendian_internal(char *s1, int len1, char *s2, int len2) { return len1 == stbtt__CompareUTF8toUTF16_bigendian_prefix((stbtt_uint8*) s1, len1, (stbtt_uint8*) s2, len2); } // returns results in whatever encoding you request... but note that 2-byte encodings // will be BIG-ENDIAN... use stbtt_CompareUTF8toUTF16_bigendian() to compare STBTT_DEF const char *stbtt_GetFontNameString(const stbtt_fontinfo *font, int *length, int platformID, int encodingID, int languageID, int nameID) { stbtt_int32 i,count,stringOffset; stbtt_uint8 *fc = font->data; stbtt_uint32 offset = font->fontstart; stbtt_uint32 nm = stbtt__find_table(fc, offset, "name"); if (!nm) return NULL; count = ttUSHORT(fc+nm+2); stringOffset = nm + ttUSHORT(fc+nm+4); for (i=0; i < count; ++i) { stbtt_uint32 loc = nm + 6 + 12 * i; if (platformID == ttUSHORT(fc+loc+0) && encodingID == ttUSHORT(fc+loc+2) && languageID == ttUSHORT(fc+loc+4) && nameID == ttUSHORT(fc+loc+6)) { *length = ttUSHORT(fc+loc+8); return (const char *) (fc+stringOffset+ttUSHORT(fc+loc+10)); } } return NULL; } static int stbtt__matchpair(stbtt_uint8 *fc, stbtt_uint32 nm, stbtt_uint8 *name, stbtt_int32 nlen, stbtt_int32 target_id, stbtt_int32 next_id) { stbtt_int32 i; stbtt_int32 count = ttUSHORT(fc+nm+2); stbtt_int32 stringOffset = nm + ttUSHORT(fc+nm+4); for (i=0; i < count; ++i) { stbtt_uint32 loc = nm + 6 + 12 * i; stbtt_int32 id = ttUSHORT(fc+loc+6); if (id == target_id) { // find the encoding stbtt_int32 platform = ttUSHORT(fc+loc+0), encoding = ttUSHORT(fc+loc+2), language = ttUSHORT(fc+loc+4); // is this a Unicode encoding? if (platform == 0 || (platform == 3 && encoding == 1) || (platform == 3 && encoding == 10)) { stbtt_int32 slen = ttUSHORT(fc+loc+8); stbtt_int32 off = ttUSHORT(fc+loc+10); // check if there's a prefix match stbtt_int32 matchlen = stbtt__CompareUTF8toUTF16_bigendian_prefix(name, nlen, fc+stringOffset+off,slen); if (matchlen >= 0) { // check for target_id+1 immediately following, with same encoding & language if (i+1 < count && ttUSHORT(fc+loc+12+6) == next_id && ttUSHORT(fc+loc+12) == platform && ttUSHORT(fc+loc+12+2) == encoding && ttUSHORT(fc+loc+12+4) == language) { slen = ttUSHORT(fc+loc+12+8); off = ttUSHORT(fc+loc+12+10); if (slen == 0) { if (matchlen == nlen) return 1; } else if (matchlen < nlen && name[matchlen] == ' ') { ++matchlen; if (stbtt_CompareUTF8toUTF16_bigendian_internal((char*) (name+matchlen), nlen-matchlen, (char*)(fc+stringOffset+off),slen)) return 1; } } else { // if nothing immediately following if (matchlen == nlen) return 1; } } } // @TODO handle other encodings } } return 0; } static int stbtt__matches(stbtt_uint8 *fc, stbtt_uint32 offset, stbtt_uint8 *name, stbtt_int32 flags) { stbtt_int32 nlen = (stbtt_int32) STBTT_strlen((char *) name); stbtt_uint32 nm,hd; if (!stbtt__isfont(fc+offset)) return 0; // check italics/bold/underline flags in macStyle... if (flags) { hd = stbtt__find_table(fc, offset, "head"); if ((ttUSHORT(fc+hd+44) & 7) != (flags & 7)) return 0; } nm = stbtt__find_table(fc, offset, "name"); if (!nm) return 0; if (flags) { // if we checked the macStyle flags, then just check the family and ignore the subfamily if (stbtt__matchpair(fc, nm, name, nlen, 16, -1)) return 1; if (stbtt__matchpair(fc, nm, name, nlen, 1, -1)) return 1; if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; } else { if (stbtt__matchpair(fc, nm, name, nlen, 16, 17)) return 1; if (stbtt__matchpair(fc, nm, name, nlen, 1, 2)) return 1; if (stbtt__matchpair(fc, nm, name, nlen, 3, -1)) return 1; } return 0; } static int stbtt_FindMatchingFont_internal(unsigned char *font_collection, char *name_utf8, stbtt_int32 flags) { stbtt_int32 i; for (i=0;;++i) { stbtt_int32 off = stbtt_GetFontOffsetForIndex(font_collection, i); if (off < 0) return off; if (stbtt__matches((stbtt_uint8 *) font_collection, off, (stbtt_uint8*) name_utf8, flags)) return off; } } #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-qual" #endif STBTT_DEF int stbtt_BakeFontBitmap(const unsigned char *data, int offset, float pixel_height, unsigned char *pixels, int pw, int ph, int first_char, int num_chars, stbtt_bakedchar *chardata) { return stbtt_BakeFontBitmap_internal((unsigned char *) data, offset, pixel_height, pixels, pw, ph, first_char, num_chars, chardata); } STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index) { return stbtt_GetFontOffsetForIndex_internal((unsigned char *) data, index); } STBTT_DEF int stbtt_GetNumberOfFonts(const unsigned char *data) { return stbtt_GetNumberOfFonts_internal((unsigned char *) data); } STBTT_DEF int stbtt_InitFont(stbtt_fontinfo *info, const unsigned char *data, int offset) { return stbtt_InitFont_internal(info, (unsigned char *) data, offset); } STBTT_DEF int stbtt_FindMatchingFont(const unsigned char *fontdata, const char *name, int flags) { return stbtt_FindMatchingFont_internal((unsigned char *) fontdata, (char *) name, flags); } STBTT_DEF int stbtt_CompareUTF8toUTF16_bigendian(const char *s1, int len1, const char *s2, int len2) { return stbtt_CompareUTF8toUTF16_bigendian_internal((char *) s1, len1, (char *) s2, len2); } #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop #endif #endif // STB_TRUETYPE_IMPLEMENTATION // FULL VERSION HISTORY // // 1.19 (2018-02-11) OpenType GPOS kerning (horizontal only), STBTT_fmod // 1.18 (2018-01-29) add missing function // 1.17 (2017-07-23) make more arguments const; doc fix // 1.16 (2017-07-12) SDF support // 1.15 (2017-03-03) make more arguments const // 1.14 (2017-01-16) num-fonts-in-TTC function // 1.13 (2017-01-02) support OpenType fonts, certain Apple fonts // 1.12 (2016-10-25) suppress warnings about casting away const with -Wcast-qual // 1.11 (2016-04-02) fix unused-variable warning // 1.10 (2016-04-02) allow user-defined fabs() replacement // fix memory leak if fontsize=0.0 // fix warning from duplicate typedef // 1.09 (2016-01-16) warning fix; avoid crash on outofmem; use alloc userdata for PackFontRanges // 1.08 (2015-09-13) document stbtt_Rasterize(); fixes for vertical & horizontal edges // 1.07 (2015-08-01) allow PackFontRanges to accept arrays of sparse codepoints; // allow PackFontRanges to pack and render in separate phases; // fix stbtt_GetFontOFfsetForIndex (never worked for non-0 input?); // fixed an assert() bug in the new rasterizer // replace assert() with STBTT_assert() in new rasterizer // 1.06 (2015-07-14) performance improvements (~35% faster on x86 and x64 on test machine) // also more precise AA rasterizer, except if shapes overlap // remove need for STBTT_sort // 1.05 (2015-04-15) fix misplaced definitions for STBTT_STATIC // 1.04 (2015-04-15) typo in example // 1.03 (2015-04-12) STBTT_STATIC, fix memory leak in new packing, various fixes // 1.02 (2014-12-10) fix various warnings & compile issues w/ stb_rect_pack, C++ // 1.01 (2014-12-08) fix subpixel position when oversampling to exactly match // non-oversampled; STBTT_POINT_SIZE for packed case only // 1.00 (2014-12-06) add new PackBegin etc. API, w/ support for oversampling // 0.99 (2014-09-18) fix multiple bugs with subpixel rendering (ryg) // 0.9 (2014-08-07) support certain mac/iOS fonts without an MS platformID // 0.8b (2014-07-07) fix a warning // 0.8 (2014-05-25) fix a few more warnings // 0.7 (2013-09-25) bugfix: subpixel glyph bug fixed in 0.5 had come back // 0.6c (2012-07-24) improve documentation // 0.6b (2012-07-20) fix a few more warnings // 0.6 (2012-07-17) fix warnings; added stbtt_ScaleForMappingEmToPixels, // stbtt_GetFontBoundingBox, stbtt_IsGlyphEmpty // 0.5 (2011-12-09) bugfixes: // subpixel glyph renderer computed wrong bounding box // first vertex of shape can be off-curve (FreeSans) // 0.4b (2011-12-03) fixed an error in the font baking example // 0.4 (2011-12-01) kerning, subpixel rendering (tor) // bugfixes for: // codepoint-to-glyph conversion using table fmt=12 // codepoint-to-glyph conversion using table fmt=4 // stbtt_GetBakedQuad with non-square texture (Zer) // updated Hello World! sample to use kerning and subpixel // fixed some warnings // 0.3 (2009-06-24) cmap fmt=12, compound shapes (MM) // userdata, malloc-from-userdata, non-zero fill (stb) // 0.2 (2009-03-11) Fix unsigned/signed char warnings // 0.1 (2009-03-09) First public release // /* ------------------------------------------------------------------------------ This software is available under 2 licenses -- choose whichever you prefer. ------------------------------------------------------------------------------ ALTERNATIVE A - MIT License Copyright (c) 2017 Sean Barrett Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------ ALTERNATIVE B - Public Domain (www.unlicense.org) This is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ------------------------------------------------------------------------------ */ kernel-shark-kernelshark-v2.4.0/tests/000077500000000000000000000000001477354127100177555ustar00rootroot00000000000000kernel-shark-kernelshark-v2.4.0/tests/CMakeLists.txt000066400000000000000000000044051477354127100225200ustar00rootroot00000000000000message("\n tests ...") set(EXECUTABLE_OUTPUT_PATH ${KS_TEST_DIR}) set(LIBRARY_OUTPUT_PATH ${KS_TEST_DIR}) add_executable(kshark-tests libkshark-tests.cpp) target_include_directories(kshark-tests PRIVATE ${Boost_INCLUDE_DIRS}) target_compile_definitions(kshark-tests PRIVATE "BOOST_TEST_DYN_LINK=1") target_link_libraries(kshark-tests kshark ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) add_test(NAME "get_test_data" COMMAND ${KS_TEST_DIR}/get_test_data.sh WORKING_DIRECTORY ${KS_TEST_DIR}) add_library(dummy_dpi SHARED test-plugin_dpi.c) set_target_properties(dummy_dpi PROPERTIES PREFIX "plugin-") target_link_libraries(dummy_dpi kshark) add_library(dummy_dpi_ctrl SHARED test-plugin_dpi_ctrl.c) set_target_properties(dummy_dpi_ctrl PROPERTIES PREFIX "plugin-") target_link_libraries(dummy_dpi_ctrl kshark) add_library(dummy_dpi_err SHARED test-plugin_dpi_err.c) set_target_properties(dummy_dpi_err PROPERTIES PREFIX "plugin-") target_link_libraries(dummy_dpi_err kshark) add_library(dummy_input SHARED test-input.c) set_target_properties(dummy_input PROPERTIES PREFIX "input-") target_link_libraries(dummy_input kshark) add_library(dummy_input_ctrl SHARED test-input_ctrl.c) set_target_properties(dummy_input_ctrl PROPERTIES PREFIX "input-") target_link_libraries(dummy_input_ctrl kshark) message(STATUS "libkshark-tests") add_test(NAME "libkshark_tests" COMMAND ${KS_TEST_DIR}/kshark-tests --log_format=HRF WORKING_DIRECTORY ${KS_TEST_DIR}) if (Qt6Widgets_FOUND AND TT_FONT_FILE) add_executable(kshark-gui-tests libkshark-gui-tests.cpp) target_include_directories(kshark-gui-tests PRIVATE ${Boost_INCLUDE_DIRS}) target_compile_definitions(kshark-gui-tests PRIVATE "BOOST_TEST_DYN_LINK=1") target_link_libraries(kshark-gui-tests kshark-gui ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) message(STATUS "libkshark-gui_tests") add_test(NAME "libkshark-gui_tests" COMMAND ${KS_TEST_DIR}/kshark-gui-tests --log_format=HRF WORKING_DIRECTORY ${KS_TEST_DIR}) endif () kernel-shark-kernelshark-v2.4.0/tests/get_test_data.sh000077500000000000000000000006371477354127100231310ustar00rootroot00000000000000#!/bin/bash TEST_DIR=`dirname $0` TEST_DATA_DIR=kernel-shark_testdata TEST_DATA_REPO=https://github.com/yordan-karadzhov/${TEST_DATA_DIR}.git rm -fv ${TEST_DIR}/*.dat if [ -d "${TEST_DATA_DIR}" ]; then rm -rf ${TEST_DATA_DIR} fi git clone ${TEST_DATA_REPO} if [ ! -d "${TEST_DATA_DIR}" ]; then exit false fi rm -f ${TEST_DATA_DIR}/LICENSE cp -v ${TEST_DATA_DIR}/* ${TEST_DIR}/ rm -rf ${TEST_DATA_DIR} kernel-shark-kernelshark-v2.4.0/tests/libkshark-gui-tests.cpp000066400000000000000000000217061477354127100243630ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ // Boost #define BOOST_TEST_MODULE KernelSharkTests #include // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" #include "KsUtils.hpp" #include "KsModels.hpp" using namespace KsUtils; #define N_RECORDS_TEST1 1530 BOOST_AUTO_TEST_CASE(KsUtils_datatest) { kshark_context *kshark_ctx{nullptr}; kshark_entry **data{nullptr}; std::string file(KS_TEST_DIR); ssize_t n_rows; int sd, ss_id; BOOST_REQUIRE(kshark_instance(&kshark_ctx)); file += "/trace_test1.dat"; sd = kshark_open(kshark_ctx, file.c_str()); BOOST_CHECK_EQUAL(sd, 0); n_rows = kshark_load_entries(kshark_ctx, sd, &data); BOOST_CHECK_EQUAL(n_rows, N_RECORDS_TEST1); auto cpus = getCPUList(sd); BOOST_CHECK_EQUAL(cpus.size(), 8); for (int i = 0; i < cpus.size(); ++i) BOOST_CHECK_EQUAL(cpus[i], i); auto pids = getPidList(sd); BOOST_CHECK_EQUAL(pids.size(), 46); BOOST_CHECK_EQUAL(pids[0], 0); for (int i = 1; i < pids.size(); ++i) BOOST_CHECK(pids[i] > pids[i - 1]); auto evts = getEventIdList(sd); BOOST_CHECK_EQUAL(evts.size(), 40); BOOST_CHECK_EQUAL(evts[34], 323); ss_id = getEventId(sd, "sched/sched_switch"); BOOST_CHECK_EQUAL(ss_id, 323); QString name = getEventName(sd, 323); BOOST_CHECK(name == QString("sched/sched_switch")); name = getEventName(sd, 999); BOOST_CHECK(name == QString("Unknown")); auto fields = getEventFieldsList(sd, ss_id); BOOST_CHECK_EQUAL(fields.size(), 11); BOOST_CHECK(fields[10] == QString("next_prio")); BOOST_CHECK_EQUAL(getEventFieldType(sd, ss_id, "next_prio"), KS_INTEGER_FIELD); BOOST_CHECK_EQUAL(getEventFieldType(sd, ss_id, "next_comm"), KS_INVALID_FIELD); for (ssize_t r = 0; r < n_rows; ++r) free(data[r]); free(data); kshark_close(kshark_ctx, sd); kshark_free(kshark_ctx); } BOOST_AUTO_TEST_CASE(KsUtils_setFilterSync) { struct kshark_context *kshark_ctx{nullptr}; BOOST_REQUIRE(kshark_instance(&kshark_ctx)); kshark_ctx->filter_mask = KS_TEXT_VIEW_FILTER_MASK | KS_GRAPH_VIEW_FILTER_MASK | KS_EVENT_VIEW_FILTER_MASK; BOOST_CHECK_EQUAL(kshark_ctx->filter_mask, 0x7); listFilterSync(false); BOOST_CHECK_EQUAL(kshark_ctx->filter_mask & KS_TEXT_VIEW_FILTER_MASK, 0); BOOST_CHECK_EQUAL(kshark_ctx->filter_mask & KS_GRAPH_VIEW_FILTER_MASK, KS_GRAPH_VIEW_FILTER_MASK); BOOST_CHECK_EQUAL(kshark_ctx->filter_mask & KS_EVENT_VIEW_FILTER_MASK, KS_EVENT_VIEW_FILTER_MASK); listFilterSync(true); BOOST_CHECK_EQUAL(kshark_ctx->filter_mask, 0x7); graphFilterSync(false); BOOST_CHECK_EQUAL(kshark_ctx->filter_mask & KS_TEXT_VIEW_FILTER_MASK, KS_TEXT_VIEW_FILTER_MASK); BOOST_CHECK_EQUAL(kshark_ctx->filter_mask & KS_GRAPH_VIEW_FILTER_MASK, 0); BOOST_CHECK_EQUAL(kshark_ctx->filter_mask & KS_EVENT_VIEW_FILTER_MASK, 0); graphFilterSync(true); BOOST_CHECK_EQUAL(kshark_ctx->filter_mask, 0x7); kshark_free(kshark_ctx); } BOOST_AUTO_TEST_CASE(KsUtils_parseIds) { QVector ids_test = parseIdList("1,33,4-6,3,55-57"); QVector ids = {1, 33, 4, 5, 6, 3, 55, 56, 57}; BOOST_CHECK(ids == ids_test); } #define N_RECORDS_TEST2 73945 BOOST_AUTO_TEST_CASE(KsUtils_KsDataStore) { int64_t ts_last(0); KsDataStore data; int sd; BOOST_CHECK_EQUAL(data.size(), 0); BOOST_CHECK_EQUAL(data.rows(), nullptr); sd = data.loadDataFile(QString(KS_TEST_DIR) + "/trace_test1.dat", {}); BOOST_CHECK_EQUAL(sd, 0); BOOST_CHECK_EQUAL(data.size(), N_RECORDS_TEST1); BOOST_CHECK(data.rows() != nullptr); sd = data.appendDataFile(QString(KS_TEST_DIR) + "/trace_test2.dat", {}); BOOST_CHECK_EQUAL(sd, 1); BOOST_CHECK_EQUAL(data.size(), N_RECORDS_TEST1 + N_RECORDS_TEST2); kshark_entry **rows = data.rows(); for (ssize_t i = 0; i < data.size(); ++i) { BOOST_CHECK(rows[i]->ts >= ts_last); ts_last = rows[i]->ts; } data.clear(); BOOST_CHECK_EQUAL(data.size(), 0); BOOST_CHECK_EQUAL(data.rows(), nullptr); } BOOST_AUTO_TEST_CASE(KsUtils_getPluginList) { QStringList plugins{"sched_events", "event_field_plot", "latency_plot", "kvm_combo", "missed_events" }; BOOST_CHECK(getPluginList() == plugins); } #define PLUGIN_1_LIB "/plugin-dummy_dpi.so" #define PLUGIN_2_LIB "/plugin-dummy_dpi_ctrl.so" #define INPUT_A_LIB "/input-dummy_input.so" QString path(KS_TEST_DIR); BOOST_AUTO_TEST_CASE(KsUtils_KsPluginManager) { struct kshark_context *kshark_ctx = NULL; int sd, argc{0}; QCoreApplication a(argc, nullptr); KsPluginManager pm; pm.registerPlugins(path + INPUT_A_LIB); kshark_instance(&kshark_ctx); BOOST_CHECK_EQUAL(kshark_ctx->n_inputs, 1); BOOST_CHECK(kshark_ctx->inputs != nullptr); sd = kshark_add_stream(kshark_ctx); BOOST_CHECK_EQUAL(sd, 0); kshark_ctx->stream[sd]->interface = malloc(1); sd = kshark_add_stream(kshark_ctx); BOOST_CHECK_EQUAL(sd, 1); kshark_ctx->stream[sd]->interface = malloc(1); pm.registerPluginToStream("sched_events", getStreamIdList(kshark_ctx)); QStringList list = pm.getStreamPluginList(sd); BOOST_CHECK_EQUAL(list.count(), 1); BOOST_CHECK(list[0] == "sched_events"); QString testPlugins = path + PLUGIN_1_LIB + ","; testPlugins += path + PLUGIN_2_LIB; pm.registerPlugins(testPlugins); auto listTest = pm.getUserPlugins(); BOOST_CHECK_EQUAL(listTest.count(), 3); list = pm.getStreamPluginList(sd); for (auto const &p: listTest) pm.registerPluginToStream(p->name, {sd}); list = pm.getStreamPluginList(sd); BOOST_CHECK_EQUAL(list.count(), 3); BOOST_CHECK(list == QStringList({"dummy_dpi_ctrl", "dummy_dpi", "sched_events"})); auto active = pm.getActivePlugins(sd); BOOST_CHECK(pm.getActivePlugins(sd) == QVector({1, 1, 1})); auto enabled = pm.getPluginsByStatus(sd, KSHARK_PLUGIN_ENABLED); BOOST_CHECK(enabled == QVector({0, 1, 2})); auto loaded = pm.getPluginsByStatus(sd, KSHARK_PLUGIN_LOADED); BOOST_CHECK(loaded == QVector({0, 1})); auto failed = pm.getPluginsByStatus(sd, KSHARK_PLUGIN_FAILED); BOOST_CHECK(failed == QVector({2})); active[1] = 0; pm.updatePlugins(sd, active); BOOST_CHECK(active == pm.getActivePlugins(sd)); enabled = pm.getPluginsByStatus(sd, KSHARK_PLUGIN_ENABLED); BOOST_CHECK(enabled == QVector({0, 2})); loaded = pm.getPluginsByStatus(sd, KSHARK_PLUGIN_LOADED); BOOST_CHECK(loaded == QVector({0})); failed = pm.getPluginsByStatus(sd, KSHARK_PLUGIN_FAILED); BOOST_CHECK(failed == QVector({2})); kshark_free(kshark_ctx); a.exit(); } BOOST_AUTO_TEST_CASE(ViewModel) { QStringList header{"#", "CPU", "Time Stamp", "Task", "PID", "Latency", "Event", "Info"}; struct kshark_context *kshark_ctx(nullptr); KsViewModel model; KsDataStore data; data.loadDataFile(QString(KS_TEST_DIR) + "/trace_test1.dat", {}); model.fill(&data); BOOST_CHECK_EQUAL(model.rowCount({}), N_RECORDS_TEST1); BOOST_CHECK_EQUAL(model.columnCount({}), 8); BOOST_CHECK_EQUAL(model.singleStream(), true); BOOST_CHECK(model.header() == header); data.appendDataFile(QString(KS_TEST_DIR) + "/trace_test2.dat", {}); BOOST_REQUIRE(kshark_instance(&kshark_ctx)); BOOST_CHECK(getStreamIdList(kshark_ctx) == QVector({0, 1})); model.update(&data); header = QStringList{" >> "} + header; BOOST_CHECK_EQUAL(model.rowCount({}), N_RECORDS_TEST1 + N_RECORDS_TEST2); BOOST_CHECK_EQUAL(model.columnCount({}), 9); BOOST_CHECK_EQUAL(model.singleStream(), false); BOOST_CHECK(model.header() == header); BOOST_CHECK(model.getValueStr(0, 0) == "1"); BOOST_CHECK(model.getValueStr(4, 1) == "trace-cmd"); BOOST_CHECK(model.getValueStr(5, 2) == "29474"); BOOST_CHECK(model.getValueStr(7, 2) == "sched/sched_switch"); BOOST_CHECK(model.getValueStr(0, N_RECORDS_TEST1 + N_RECORDS_TEST2 - 1) == "0"); BOOST_CHECK(model.getValueStr(4, N_RECORDS_TEST1 + N_RECORDS_TEST2 - 1) == ""); model.reset(); BOOST_CHECK_EQUAL(model.rowCount({}), 0); } BOOST_AUTO_TEST_CASE(GraphModel) { struct kshark_context *kshark_ctx(nullptr); KsGraphModel model; KsDataStore data; data.loadDataFile(QString(KS_TEST_DIR) + "/trace_test1.dat", {}); BOOST_REQUIRE(kshark_instance(&kshark_ctx)); BOOST_CHECK(getStreamIdList(kshark_ctx) == QVector({0})); model.fill(&data); BOOST_CHECK_EQUAL(model.rowCount({}), KS_DEFAULT_NBUNS); BOOST_CHECK(abs(model.histo()->min - data.rows()[0]->ts) < model.histo()->bin_size); BOOST_CHECK(abs(model.histo()->max - data.rows()[N_RECORDS_TEST1 - 1]->ts) < model.histo()->bin_size); model.reset(); BOOST_CHECK_EQUAL(model.rowCount({}), 0); } BOOST_AUTO_TEST_CASE(KsUtils_parseTasks) { QVector pids{28121, 28137, 28141, 28199, 28201, 205666, 267481}; kshark_context *kshark_ctx{nullptr}; kshark_entry **data{nullptr}; std::string file(KS_TEST_DIR); ssize_t n_rows; int sd; kshark_instance(&kshark_ctx); file += "/trace_test1.dat"; sd = kshark_open(kshark_ctx, file.c_str()); n_rows = kshark_load_entries(kshark_ctx, sd, &data); auto pids_test = parseTaskList("zoom,sleep"); BOOST_CHECK(pids == pids_test[0]); for (ssize_t r = 0; r < n_rows; ++r) free(data[r]); free(data); kshark_close(kshark_ctx, sd); kshark_free(kshark_ctx); } kernel-shark-kernelshark-v2.4.0/tests/libkshark-tests.cpp000066400000000000000000000312441477354127100235770ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2020 VMware Inc, Yordan Karadzhov (VMware) */ // Boost #define BOOST_TEST_MODULE KernelSharkTests #include // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" #include "KsCmakeDef.hpp" #define N_TEST_STREAMS 1000 BOOST_AUTO_TEST_CASE(add_remove_streams) { struct kshark_context *kshark_ctx = NULL; int sd, free = 0, i; BOOST_REQUIRE(kshark_instance(&kshark_ctx)); for (i = 0; i < N_TEST_STREAMS; ++i) { sd = kshark_add_stream(kshark_ctx); BOOST_CHECK_EQUAL(sd, free); kshark_add_stream(kshark_ctx); free = i / 2; kshark_remove_stream(kshark_ctx, free); sd = kshark_add_stream(kshark_ctx); BOOST_CHECK_EQUAL(sd, free); free = i / 2 + 1; kshark_remove_stream(kshark_ctx, free); } BOOST_CHECK_EQUAL(kshark_ctx->n_streams, N_TEST_STREAMS); while (sd > 0) sd = kshark_add_stream(kshark_ctx); BOOST_CHECK_EQUAL(kshark_ctx->n_streams, INT16_MAX + 1); BOOST_CHECK_EQUAL(kshark_ctx->stream_info.array_size, INT16_MAX + 1); BOOST_CHECK_EQUAL(sd, -ENODEV); kshark_free(kshark_ctx); } BOOST_AUTO_TEST_CASE(get_stream) { kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; int sd; BOOST_REQUIRE(kshark_instance(&kshark_ctx)); sd = kshark_add_stream(kshark_ctx); stream = kshark_get_data_stream(kshark_ctx, sd); BOOST_CHECK_EQUAL(stream, nullptr); kshark_ctx->stream[sd]->interface = malloc(1); stream = kshark_get_data_stream(kshark_ctx, sd); BOOST_CHECK(stream != nullptr); kshark_free(kshark_ctx); } BOOST_AUTO_TEST_CASE(close_all) { struct kshark_context *kshark_ctx(nullptr); int sd, i; BOOST_REQUIRE(kshark_instance(&kshark_ctx)); for (i = 0; i < N_TEST_STREAMS; ++i) { sd = kshark_add_stream(kshark_ctx); BOOST_CHECK_EQUAL(sd, i); } kshark_close_all(kshark_ctx); BOOST_CHECK_EQUAL(kshark_ctx->n_streams, 0); BOOST_CHECK_EQUAL(kshark_ctx->stream_info.next_free_stream_id, 0); BOOST_CHECK_EQUAL(kshark_ctx->stream_info.max_stream_id, -1); for (i = 0; i < kshark_ctx->stream_info.array_size; ++i) BOOST_CHECK_EQUAL(kshark_ctx->stream[i], nullptr); } #define ARRAY_DEFAULT_SIZE 1000 BOOST_AUTO_TEST_CASE(doule_size_macro) { int i, n = ARRAY_DEFAULT_SIZE; int *arr = (int *) malloc(n * sizeof(*arr)); bool ok; for (i = 0; i < n; ++i) arr[i] = i; ok = KS_DOUBLE_SIZE(arr, n); BOOST_CHECK_EQUAL(ok, true); BOOST_CHECK_EQUAL(n, ARRAY_DEFAULT_SIZE * 2); for (i = 0; i < ARRAY_DEFAULT_SIZE; ++i) BOOST_CHECK_EQUAL(arr[i], i); for (; i < n; ++i) BOOST_CHECK_EQUAL(arr[i], 0); } #define N_VALUES 2 * KS_CONTAINER_DEFAULT_SIZE + 1 #define MAX_TS 100000 BOOST_AUTO_TEST_CASE(fill_data_container) { struct kshark_data_container *data = kshark_init_data_container(); struct kshark_entry entries[N_VALUES]; int64_t i, ts_last(0); BOOST_CHECK_EQUAL(data->capacity, KS_CONTAINER_DEFAULT_SIZE); for (i = 0; i < N_VALUES; ++i) { entries[i].ts = rand() % MAX_TS; kshark_data_container_append(data, &entries[i], 10 - entries[i].ts); } BOOST_CHECK_EQUAL(data->size, N_VALUES); BOOST_CHECK_EQUAL(data->capacity, 4 * KS_CONTAINER_DEFAULT_SIZE); kshark_data_container_sort(data); BOOST_CHECK_EQUAL(data->capacity, N_VALUES); for (i = 0; i < N_VALUES; ++i) { BOOST_CHECK(data->data[i]->entry->ts >= ts_last); BOOST_CHECK_EQUAL(data->data[i]->entry->ts, 10 - data->data[i]->field); ts_last = data->data[i]->entry->ts; } i = kshark_find_entry_field_by_time(MAX_TS / 2, data->data, 0, N_VALUES - 1); BOOST_CHECK(data->data[i - 1]->entry->ts < MAX_TS / 2); BOOST_CHECK(data->data[i]->entry->ts >= MAX_TS / 2); kshark_free_data_container(data); } struct test_context { int a; char b; }; KS_DEFINE_PLUGIN_CONTEXT(struct test_context, free); BOOST_AUTO_TEST_CASE(init_close_plugin) { struct test_context *ctx; int i; for (i = 0; i < N_TEST_STREAMS; ++i) { ctx = __init(i); ctx->a = i * 10; ctx->b = 'z'; } for (i = 0; i < N_TEST_STREAMS; ++i) { ctx = __get_context(i); BOOST_REQUIRE(ctx != NULL); BOOST_CHECK_EQUAL(ctx->a, i * 10); BOOST_CHECK_EQUAL(ctx->b, 'z'); __close(i); BOOST_REQUIRE(__get_context(i) == NULL); } __close(-1); } #define PLUGIN_1_LIB "/plugin-dummy_dpi.so" #define PLUGIN_1_NAME "dummy_dpi" #define PLUGIN_2_LIB "/plugin-dummy_dpi_ctrl.so" #define PLUGIN_2_NAME "dummy_dpi_ctrl" #define INPUT_A_LIB "/input-dummy_input.so" #define INPUT_A_NAME "dummy_input" #define INPUT_B_LIB "/input-dummy_input_ctrl.so" #define INPUT_B_NAME "dummy_input_ctrl" std::string path(KS_TEST_DIR); BOOST_AUTO_TEST_CASE(register_plugin) { kshark_plugin_list *p1, *p2, *i1, *i2, *x1, *x2; kshark_generic_stream_interface *interface; kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; std::string plugin; int sd; BOOST_REQUIRE(kshark_instance(&kshark_ctx)); BOOST_REQUIRE(kshark_ctx->plugins == nullptr); BOOST_REQUIRE(kshark_ctx->inputs == nullptr); BOOST_CHECK_EQUAL(kshark_ctx->n_plugins, 0); plugin = path + PLUGIN_1_LIB; p1 = kshark_register_plugin(kshark_ctx, PLUGIN_1_NAME, plugin.c_str()); BOOST_CHECK_EQUAL(kshark_ctx->n_plugins, 1); BOOST_CHECK(kshark_ctx->plugins != nullptr); BOOST_CHECK_EQUAL(kshark_ctx->plugins->next, nullptr); BOOST_CHECK_EQUAL(kshark_ctx->plugins, p1); BOOST_CHECK(p1 != nullptr); BOOST_CHECK(p1->process_interface != nullptr); BOOST_CHECK(p1->handle != nullptr); BOOST_CHECK_EQUAL(strcmp(p1->file, plugin.c_str()), 0); BOOST_CHECK_EQUAL(strcmp(p1->name, PLUGIN_1_NAME), 0); BOOST_CHECK_EQUAL(p1->ctrl_interface, nullptr); BOOST_CHECK_EQUAL(p1->readout_interface, nullptr); plugin = path + PLUGIN_2_LIB; p2 = kshark_register_plugin(kshark_ctx, PLUGIN_2_NAME, plugin.c_str()); BOOST_CHECK_EQUAL(kshark_ctx->n_plugins, 2); BOOST_CHECK_EQUAL(kshark_ctx->plugins, p2); BOOST_CHECK_EQUAL(kshark_ctx->plugins->next, p1); BOOST_CHECK(p2 != nullptr); BOOST_CHECK(p2->process_interface != nullptr); BOOST_CHECK(p2->handle != nullptr); BOOST_CHECK_EQUAL(strcmp(p2->file, plugin.c_str()), 0); BOOST_CHECK_EQUAL(strcmp(p2->name, PLUGIN_2_NAME), 0); BOOST_CHECK(p2->ctrl_interface != nullptr); BOOST_CHECK_EQUAL(p2->readout_interface, nullptr); plugin = path + INPUT_A_LIB; i1 = kshark_register_plugin(kshark_ctx, INPUT_A_NAME, plugin.c_str()); BOOST_CHECK(i1 != nullptr); BOOST_CHECK_EQUAL(kshark_ctx->n_plugins, 3); BOOST_CHECK_EQUAL(kshark_ctx->n_inputs, 1); BOOST_CHECK(kshark_ctx->inputs != nullptr); BOOST_CHECK(i1->readout_interface != nullptr); BOOST_CHECK(i1->handle != nullptr); BOOST_CHECK_EQUAL(strcmp(i1->file, plugin.c_str()), 0); BOOST_CHECK_EQUAL(strcmp(i1->name, INPUT_A_NAME), 0); BOOST_CHECK_EQUAL(i1->ctrl_interface, nullptr); BOOST_CHECK_EQUAL(i1->process_interface, nullptr); plugin = path + INPUT_B_LIB; i2 = kshark_register_plugin(kshark_ctx, INPUT_B_NAME, plugin.c_str()); BOOST_CHECK(i2 != nullptr); BOOST_CHECK_EQUAL(kshark_ctx->n_plugins, 4); BOOST_CHECK_EQUAL(kshark_ctx->n_inputs, 2); BOOST_CHECK(i2->readout_interface != nullptr); BOOST_CHECK(i2->handle != nullptr); BOOST_CHECK(strcmp(i2->file, plugin.c_str()) == 0); BOOST_CHECK(strcmp(i2->name, INPUT_B_NAME) == 0); BOOST_CHECK(i2->ctrl_interface != nullptr); BOOST_CHECK_EQUAL(i2->process_interface, nullptr); x1 = kshark_find_plugin_by_name(kshark_ctx->plugins, PLUGIN_2_NAME); BOOST_CHECK_EQUAL(x1, p2); plugin = path + PLUGIN_2_LIB; x2 = kshark_find_plugin(kshark_ctx->plugins, plugin.c_str()); BOOST_CHECK_EQUAL(x2, p2); sd = kshark_add_stream(kshark_ctx); interface = (kshark_generic_stream_interface *) malloc(sizeof(*interface)); kshark_ctx->stream[sd]->interface = interface; BOOST_CHECK_EQUAL(sd, 0); stream = kshark_get_data_stream(kshark_ctx, sd); BOOST_CHECK(stream != nullptr); BOOST_CHECK_EQUAL(stream->plugins, nullptr); kshark_register_plugin_to_stream(stream, p1->process_interface, true); BOOST_CHECK_EQUAL(stream->n_plugins, 1); BOOST_CHECK_EQUAL(stream->plugins->interface, p1->process_interface); BOOST_CHECK_EQUAL(stream->plugins->next, nullptr); kshark_register_plugin_to_stream(stream, p2->process_interface, true); BOOST_CHECK_EQUAL(stream->n_plugins, 2); BOOST_CHECK_EQUAL(stream->plugins->interface, p2->process_interface); BOOST_CHECK_EQUAL(stream->plugins->next->interface, p1->process_interface); kshark_unregister_plugin_from_stream(stream, p1->process_interface); BOOST_CHECK_EQUAL(stream->n_plugins, 1); BOOST_CHECK_EQUAL(stream->plugins->interface, p2->process_interface); BOOST_CHECK_EQUAL(stream->plugins->next, nullptr); kshark_free(kshark_ctx); } #define PLUGIN_ERR_LIB "/plugin-dummy_dpi_err.so" #define PLUGIN_ERR_NAME "dummy_dpi_err" BOOST_AUTO_TEST_CASE(handle_plugin) { kshark_dpi_list *dpi1, *dpi2, *dpi_err; kshark_plugin_list *p1, *p2, *p_err; kshark_context *kshark_ctx(nullptr); kshark_data_stream *stream; std::string plugin; int sd, ret; BOOST_REQUIRE(kshark_instance(&kshark_ctx)); BOOST_CHECK_EQUAL(kshark_ctx->plugins, nullptr); BOOST_CHECK_EQUAL(kshark_ctx->n_plugins, 0); plugin = path + PLUGIN_1_LIB; p1 = kshark_register_plugin(kshark_ctx, PLUGIN_1_NAME, plugin.c_str()); plugin = path + PLUGIN_2_LIB; p2 = kshark_register_plugin(kshark_ctx, PLUGIN_2_NAME, plugin.c_str()); BOOST_CHECK(kshark_ctx->plugins != nullptr); BOOST_CHECK_EQUAL(kshark_ctx->n_plugins, 2); sd = kshark_add_stream(kshark_ctx); kshark_ctx->stream[sd]->interface = malloc(1); stream = kshark_get_data_stream(kshark_ctx, sd); BOOST_CHECK(stream != nullptr); dpi1 = kshark_register_plugin_to_stream(stream, p1->process_interface, true); BOOST_CHECK_EQUAL(dpi1->status, KSHARK_PLUGIN_ENABLED); dpi2 = kshark_register_plugin_to_stream(stream, p2->process_interface, false); BOOST_CHECK_EQUAL(dpi2->status, 0); ret = kshark_handle_dpi(stream, dpi1, KSHARK_PLUGIN_INIT); BOOST_CHECK_EQUAL(ret, 1); BOOST_CHECK_EQUAL(dpi1->status, KSHARK_PLUGIN_LOADED | KSHARK_PLUGIN_ENABLED); ret = kshark_handle_dpi(stream, dpi2, KSHARK_PLUGIN_INIT); BOOST_CHECK_EQUAL(ret, 0); BOOST_CHECK_EQUAL(dpi2->status, 0); dpi2->status |= KSHARK_PLUGIN_ENABLED; ret = kshark_handle_dpi(stream, dpi2, KSHARK_PLUGIN_INIT); BOOST_CHECK_EQUAL(ret, 2); BOOST_CHECK_EQUAL(dpi1->status, KSHARK_PLUGIN_LOADED | KSHARK_PLUGIN_ENABLED); ret = kshark_handle_all_dpis(stream, KSHARK_PLUGIN_UPDATE); BOOST_CHECK_EQUAL(ret, 0); BOOST_CHECK_EQUAL(dpi1->status, KSHARK_PLUGIN_LOADED | KSHARK_PLUGIN_ENABLED); BOOST_CHECK_EQUAL(dpi2->status, KSHARK_PLUGIN_LOADED | KSHARK_PLUGIN_ENABLED); plugin = path + PLUGIN_ERR_LIB; p_err = kshark_register_plugin(kshark_ctx, PLUGIN_ERR_NAME, plugin.c_str()); BOOST_CHECK_EQUAL(kshark_ctx->n_plugins, 3); dpi_err = kshark_register_plugin_to_stream(stream, p_err->process_interface, true); BOOST_CHECK_EQUAL(ret, 0); ret = kshark_handle_dpi(stream, dpi_err, KSHARK_PLUGIN_INIT); BOOST_CHECK_EQUAL(dpi_err->status, KSHARK_PLUGIN_FAILED | KSHARK_PLUGIN_ENABLED); BOOST_CHECK_EQUAL(ret, 0); ret = kshark_handle_dpi(stream, dpi_err, KSHARK_PLUGIN_CLOSE); BOOST_CHECK_EQUAL(ret, 0); BOOST_CHECK_EQUAL(dpi_err->status, KSHARK_PLUGIN_ENABLED); ret = kshark_handle_all_dpis(stream, KSHARK_PLUGIN_CLOSE); BOOST_CHECK_EQUAL(ret, -3); kshark_free(kshark_ctx); } #define FAKE_DATA_FILE_A "test.ta" #define FAKE_DATA_A_SIZE 200 #define FAKE_DATA_FILE_B "test.tb" #define FAKE_DATA_B_SIZE 100 BOOST_AUTO_TEST_CASE(readout_plugins) { kshark_context *kshark_ctx(nullptr); kshark_entry **entries{nullptr}; kshark_data_stream *stream; std::string plugin, data; int sd, i, n_entries; int64_t ts_last(0); BOOST_REQUIRE(kshark_instance(&kshark_ctx)); plugin = path + INPUT_A_LIB; kshark_register_plugin(kshark_ctx, INPUT_A_NAME, plugin.c_str()); plugin = path + INPUT_B_LIB; kshark_register_plugin(kshark_ctx, INPUT_B_NAME, plugin.c_str()); data = FAKE_DATA_FILE_A; sd = kshark_open(kshark_ctx, data.c_str()); BOOST_CHECK_EQUAL(sd, 0); stream = kshark_get_data_stream(kshark_ctx, sd); BOOST_CHECK(stream != nullptr); BOOST_CHECK(stream->interface != nullptr); BOOST_CHECK_EQUAL(strcmp(stream->data_format, "format_a"), 0); data = FAKE_DATA_FILE_B; sd = kshark_open(kshark_ctx, data.c_str()); BOOST_CHECK_EQUAL(sd, 1); stream = kshark_get_data_stream(kshark_ctx, sd); BOOST_CHECK(stream != nullptr); BOOST_CHECK(stream->interface != nullptr); BOOST_CHECK_EQUAL(strcmp(stream->data_format, "format_b"), 0); n_entries = kshark_load_all_entries(kshark_ctx, &entries); BOOST_CHECK_EQUAL(n_entries, FAKE_DATA_A_SIZE + FAKE_DATA_B_SIZE); for (i = 0; i < n_entries; ++i) { BOOST_CHECK(ts_last <= entries[i]->ts); ts_last = entries[i]->ts; } for (i = 0; i < n_entries; ++i) free(entries[i]); free(entries); kshark_free(kshark_ctx); } BOOST_AUTO_TEST_CASE(check_font_found) { #ifdef TT_FONT_FILE BOOST_REQUIRE(true); #else BOOST_REQUIRE(false); #endif } kernel-shark-kernelshark-v2.4.0/tests/test-input.c000066400000000000000000000054661477354127100222500ustar00rootroot00000000000000 // C #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif // _GNU_SOURCE #include #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" static ssize_t load_entries(struct kshark_data_stream *stream, __attribute__ ((unused)) struct kshark_context *kshark_ctx, struct kshark_entry ***data_rows) { struct kshark_entry **rows; ssize_t total = 200, i; rows = calloc(total, sizeof(struct kshark_entry *)); for (i = 0; i < total; ++i) { rows[i] = calloc(1, sizeof(struct kshark_entry)); rows[i]->ts = 1000000 + i * 10000; rows[i]->stream_id = stream->stream_id; rows[i]->event_id = i % 5; rows[i]->pid = 10 + i % 2; rows[i]->cpu = i % 2; rows[i]->visible = 0xff; } *data_rows = rows; return total; } static char *dump_entry(__attribute__ ((unused)) struct kshark_data_stream *stream, const struct kshark_entry *entry) { char *entry_str; int ret; ret = asprintf(&entry_str, "e: time=%li evt=%i s_id=%i", entry->ts, entry->event_id, entry->stream_id); if (ret <= 0) return NULL; return entry_str; } static const char *format_name = "format_a"; const char *KSHARK_INPUT_FORMAT() { return format_name; } bool KSHARK_INPUT_CHECK(const char *file, __attribute__ ((unused)) char **format) { char *ext = strrchr(file, '.'); if (ext && strcmp(ext, ".ta") == 0) return true; return false; } static int get_pid(__attribute__ ((unused)) struct kshark_data_stream *stream, const struct kshark_entry *entry) { return entry->pid; } static char *get_task(__attribute__ ((unused)) struct kshark_data_stream *stream, __attribute__ ((unused)) const struct kshark_entry *entry) { char *entry_str; int ret; ret = asprintf(&entry_str, "test_a/test"); if (ret <= 0) return NULL; return entry_str; } static char *get_event_name(__attribute__ ((unused)) struct kshark_data_stream *stream, const struct kshark_entry *entry) { char *evt_str; int ret; ret = asprintf(&evt_str, "test_a/event-%i", entry->event_id); if (ret <= 0) return NULL; return evt_str; } int KSHARK_INPUT_INITIALIZER(struct kshark_data_stream *stream) { struct kshark_generic_stream_interface *interface; stream->interface = interface = calloc(1, sizeof(*interface)); if (!interface) return -ENOMEM; interface->type = KS_GENERIC_DATA_INTERFACE; stream->n_cpus = 2; stream->n_events = 5; stream->idle_pid = 0; kshark_hash_id_add(stream->tasks, 10); kshark_hash_id_add(stream->tasks, 11); interface->get_pid = get_pid; interface->get_task = get_task; interface->get_event_name = get_event_name; interface->dump_entry = dump_entry; interface->load_entries = load_entries; return 0; } void KSHARK_INPUT_DEINITIALIZER(__attribute__ ((unused)) struct kshark_data_stream *stream) {} kernel-shark-kernelshark-v2.4.0/tests/test-input_ctrl.c000066400000000000000000000057031477354127100232660ustar00rootroot00000000000000 // C #ifndef _GNU_SOURCE /** Use GNU C Library. */ #define _GNU_SOURCE #endif // _GNU_SOURCE #include #include #include #include // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" static ssize_t load_entries(struct kshark_data_stream *stream, __attribute__ ((unused)) struct kshark_context *kshark_ctx, struct kshark_entry ***data_rows) { struct kshark_entry **rows; ssize_t total = 100, i; rows = calloc(total, sizeof(struct kshark_entry *)); for (i = 0; i < total; ++i) { rows[i] = calloc(1, sizeof(struct kshark_entry)); rows[i]->ts = 1000 + i * 15000; rows[i]->stream_id = stream->stream_id; rows[i]->event_id = i % 3; rows[i]->pid = 20; rows[i]->visible = 0xff; } rows[i-1]->pid = 0; *data_rows = rows; return total; } static char *dump_entry(__attribute__ ((unused)) struct kshark_data_stream *stream, const struct kshark_entry *entry) { char *entry_str; int ret; ret = asprintf(&entry_str, "e: time=%li evt=%i s_id=%i", entry->ts, entry->event_id, entry->stream_id); if (ret <= 0) return NULL; return entry_str; } static const char *format_name = "format_b"; // static const char *format_name = "tep data"; const char *KSHARK_INPUT_FORMAT() { return format_name; } bool KSHARK_INPUT_CHECK(const char *file, __attribute__ ((unused)) char **format) { char *ext = strrchr(file, '.'); if (ext && strcmp(ext, ".tb") == 0) return true; return false; } static int get_pid(__attribute__ ((unused)) struct kshark_data_stream *stream, const struct kshark_entry *entry) { return entry->pid; } static char *get_task(__attribute__ ((unused)) struct kshark_data_stream *stream, __attribute__ ((unused)) const struct kshark_entry *entry) { char *entry_str; int ret; ret = asprintf(&entry_str, "test_b/test"); if (ret <= 0) return NULL; return entry_str; } static char *get_event_name(__attribute__ ((unused)) struct kshark_data_stream *stream, const struct kshark_entry *entry) { char *evt_str; int ret; ret = asprintf(&evt_str, "test_b/event-%i", entry->event_id); if (ret <= 0) return NULL; return evt_str; } int KSHARK_INPUT_INITIALIZER(struct kshark_data_stream *stream) { struct kshark_generic_stream_interface *interface; stream->interface = interface = calloc(1, sizeof(*interface)); if (!interface) return -ENOMEM; interface->type = KS_GENERIC_DATA_INTERFACE; stream->n_cpus = 1; stream->n_events = 3; stream->idle_pid = 0; kshark_hash_id_add(stream->tasks, 20); interface->get_pid = get_pid; interface->get_task = get_task; interface->get_event_name = get_event_name; interface->dump_entry = dump_entry; interface->load_entries = load_entries; return 0; } void KSHARK_INPUT_DEINITIALIZER(__attribute__ ((unused)) struct kshark_data_stream *stream) {} /** Initialize the control interface of the plugin. */ void *KSHARK_MENU_PLUGIN_INITIALIZER(__attribute__ ((unused)) void *ptr) { return NULL; } kernel-shark-kernelshark-v2.4.0/tests/test-plugin_dpi.c000066400000000000000000000010361477354127100232300ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2021 VMware Inc, Yordan Karadzhov */ // C #include // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" /** Load this plugin. */ int KSHARK_PLOT_PLUGIN_INITIALIZER(__attribute__ ((unused)) struct kshark_data_stream *stream) { printf("--> plugin1\n"); return 1; } /** Unload this plugin. */ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(__attribute__ ((unused)) struct kshark_data_stream *stream) { printf("<-- plugin1\n"); return 1; } kernel-shark-kernelshark-v2.4.0/tests/test-plugin_dpi_ctrl.c000066400000000000000000000012611477354127100242540ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2021 VMware Inc, Yordan Karadzhov */ // C #include // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" /** Load this plugin. */ int KSHARK_PLOT_PLUGIN_INITIALIZER(__attribute__ ((unused)) struct kshark_data_stream *stream) { printf("--> plugin2\n"); return 2; } /** Unload this plugin. */ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(__attribute__ ((unused)) struct kshark_data_stream *stream) { printf("<-- plugin2\n"); return 2; } /** Initialize the control interface of the plugin. */ void *KSHARK_MENU_PLUGIN_INITIALIZER(__attribute__ ((unused)) void *ptr) { return NULL; } kernel-shark-kernelshark-v2.4.0/tests/test-plugin_dpi_err.c000066400000000000000000000010441477354127100240770ustar00rootroot00000000000000// SPDX-License-Identifier: LGPL-2.1 /* * Copyright (C) 2021 VMware Inc, Yordan Karadzhov */ // C #include // KernelShark #include "libkshark.h" #include "libkshark-plugin.h" /** Load this plugin. */ int KSHARK_PLOT_PLUGIN_INITIALIZER(__attribute__ ((unused)) struct kshark_data_stream *stream) { printf("--> plugin_err\n"); return 0; } /** Unload this plugin. */ int KSHARK_PLOT_PLUGIN_DEINITIALIZER(__attribute__ ((unused)) struct kshark_data_stream *stream) { printf("<-- plugin_err\n"); return 0; }

  • ݠq(.1רS32 XHSplʳpW2J4a1,Ma̕i5(es }m02I8QbXAprkVTt1g!ۥ Lth4gvb:&`hXqVi=r#CMFCyT+J=uj61*IMNqg*OH>ocDTiAbّU{dpDYauD5&OEQRP[]{KFM~4)9ZinLH³M2Z9DB;=RKcVvN31**cH 4iשtf ԬQzI pΨi)M+&CiiS9xRđPE2d+7EP։ȅ q PdM=L4-d3K'm"2`N}a6D.pX2;H˃ +F>GPJO{sq%.^mQxy1IDAT ^x:sss~[2%ܚ r FaHazep.+S*d,%gHCb+Kn-aB%%nyX\YlMYy(N٘-`ڿItʱWnD0n^9rJ;U@ 9W ,kP:R ʞAB^ɉtՠ-C ,D96v>IabI,J,eP2(**ڶ4] T/aJNP)[镊1W%KU(,R)q²eW~:vYM w)lH5dB))W oÖA`s>na RHV~,[5UKZ 㖨:q+nQpdNyP qƕCXC*R^[͠9G s|k3oi9KS8\K*1#;XN낣7LJ‘s)/)o^QS>YN;)yS!-4e_Cz6v]A٬eVؼnJl?`H'82(L4hCyD:Z :΍ .ZvUNerxfejhj|-8>twnYL#֙{w^r+-uc8W2 RYs5iNy~ʊQb()[R",eiTΗN- ᴧ d9˂iVZhxm\췕%%ҹLĬquPE=(9涜53 AqtT;rC;%nr,%%@<%RXا!MNך2TI!-zzC\[X빭@9tvnQXΚ'jvQ[Kea9Kyk;) ob77˲9T-UN[,dAGGyWrw}y睴m{F3g;y{wI>򑏰'> fggÇ>|Ç>W÷|#Gpȑ?{ ]}ヘ Mx{{ @ aJ C5 ;НotHpGGCCB}fCE>O@C"!5t!ХDBGnK\] د!#4Z RCG &AH{,#/!kkH۬"]B"&@!֛&֐R Єp~J{NC &$:~ GR"5a&9J!їhHtІ-}mɪKgd_WI]֏m@ o!Ε(MӜ4&+v,$BGJ Κf'5$IJt!c92aHJa:•Gi'or%:R!cHGG%eVҵpt'5lI)tssN,es-!m7)n tIt'mۺ> A@رlQ[;,DӄMS9U݋s5ڎl p|s(:jc5NNLM{< vLӼk 'Ie5nމp̞a58N]R 8W}7G_㨭Kkl[+ׄ;OG? 4't O:BNn<Bߪ;-|9>Z1i_⊐9 4ח_j4[n tesC}QݛpZsƴ9jsn,k/x%-5BNخBޘұp!_㬔ptQ n>$ʴr毴s5a 4g>n&<{ۼyoBs }(ٺ 8e–CwR.AJ)[gH;Ҽc]}\C1>vvfBR"u{M8KoCRk7g9tǐYk Ov~vvBsSsCv]]͉@wt&8Keq8J7vA,r_9N,S M {}&SLU>㚳.H;1t򼽾<ݵwׄmmGu/kH';ƍNvb2C?+i^.1pgyս嬅lJNPغquQHmk:ʍv Y:q Mi^sm uU'_y@G~=鎿 g- }m(GC: wul~:A 9~#R_Jta4kP !M{E]*GNGf͞~ ݹ?M9&/PR4I4|mJ_/BBs׫ĻOc6 K;8g*/&H;H duo7t,C#Kq*n\2Ɣ[2#t(2VKQ)^.\mSkRcV[Z ㈊dyfyYݠFlBCi|cJ@\VkQ^m]jyzR_ªjWר aYgzv#Kkd۬P~z\g)ʽjmv3vשm<ʗE34c4 F&ĥ2 4S 6&U (J14ҊDyn;^KV'3\R#:F M1vnj_"+#\ܳ]݊f]fM-=sft,_Oz]vyeCԚNʫ9vGѠ/Q{i2ul+ΕX k}ƚ%5bSW(Q375.^<^Rq'X.ZX,^%Hm&+:q((m-xX"t"S}{)J{EHYhE$E9w%LӴHWI{3 0{T^E~=D%37Zsuj5 F3HBtE6;v[{.WI7 !dEX>CVtT?Hu/Q)z4{%KXe+jVSPnt P4.]/m,GPG.ZB? \ G'R(P U̒A!WUzETV;i>zD#QA6ZLPX׉E R7ȵ ی7Md3k|)Pt-\CR+$e!/)l4XWla\$46u|n7GeYަ{$W U u~ߦN_0bSUG{^+i%a6:Y2@`]^nPh|3M:Ǎ.1:iFV[E5hD:CLuK29BSNg;syN~r !(J0>>??xs93v_ևgni 5JJ{]9npo{ѓrzz}RXN_ୟ=^Od3c9}ŃGXN)GXη,C}N/r{~wv군Gsy-0t=mPz4K!e鋳 .5<@ w=^ۯmPz^Ov߰0?+۱ wl[g+8{nHU=>տ%&ǹAmw9(̝ӏ9x<pTa,,]Po\v=rŻՃsCٶ A_9{< {B*|J6jh8Czsi-4A)|o{ 9zu'~Iל6rC&-R::pV=v9dS˹o(gIO>•cp.o,>I{d"P}=a}n׮QGR=Nlqu$Jc`- ~7?wK抗Wܞd/?=C0XhC=|҉?vCORy?#}[A\+إʐCyΕa5'CN'8xz7+>_.rcnPqzsW<*NI^~thכ:WG»҆pWAhKvsPVκi`_˶d(=CMR7!qbr(-ܘKoWrGuۓm9=Ba}ùfЃ>oܾϠwV^ lwɋJgIa UGb0|Ow>-ǰ9ѹqn}p󄴜5GnyN>u筋=bر0m*;/X #n yyU y԰#04gy>Np -zұѭ.-VCL٪G/2XI~4.?5r-˥lY zo6/qqXM{SHw.$ʋ8ی²9z߭5Jjqihm R1n|Ç>|Çoc|KYÇ>|Ç>|ߠÇ>|Ç7>|Ç>|Ƿ >|Ç>|mÇ>|Ç>||ߠÇ>|Ç7>|Ç>|Ƿ >|Ç>|mÇ>|Ç>||ߠÇ>|Ç7>|Ç>|Ƿ >|Ç>|mÇ>|Ç>||@I˪m)J!69u<6HF`[M"M`̘yCEV H&Hj{E26RcօH1*{ s+tZDa6ó,$aN-iHʄDn@9F$\J&V ,'Q-@-eh ¢>DXpttrZ8I&XfR:B`in~mjrӸI-˘YCZ$ENteRQcppFO([LYETz^ԤU'-X!:Kt2E7(BDjaV`fR1eؓEn2^VwhENh$y0I3ȉ#e$9z!0k#͓d9zpfTt$wىLsXfե0DAYcVaCTGDԃa&T)&WfjAzH$A:ͅ&9c}M#V]gDDqct Z!&t=9C# b4Cd-J=zCɫ,c-b>F7JzB" 7QׂQ# K' ƪ=zXnITo :f.(jlkS;Iw^qx}3D%lR7G &FL.QeqPAo  4H.`11Z2BȘ,aNJx=VGN.GHƘlC7Hӥ]'ҶHEmF3ILJ5bߤ]@LGv0%ƃTd~}fmXCќmO1Ow' ] 6 bTƈJ4 :*(f?LcV SX4 i`h:7eSM;un61N D%4 K̏ܤ&H^ f#*598~ EVgbܡ?H.g*b*6zG AcTJ0Z5nC:IyV趓kA=h(G:=5(I.S* KJJӊ b 8^Mӌ.uk,cEsf̫=4C4IFfH{" zR .5.EcբNh~n^?ޱ>F?ʤ2%(MC'Yx)HWE(f3ݤ\DH1w1EуD} I+*)ϚȞDI4G)F75 Јmpi uEVZw#ykd;Kcej1jPj#R qT+B=τ}&SBjo@}VC <$jE#9j1,uJ%D3̸ޝ86%mѴƊ[E8Z^v?ID)%X^zKiUhZlvfV%Qb:FsĢ`#LD:qY9E3*QE=`]4h1G)fTv @5m)PAgB]6cqXڴvI)&2@IJ4\KX1YGJDM~$j1إP:JRTa31NKŰ' qͅcU`KV=Rq.K$u+pB}D)AT(#{`͛dCXԘ2KTbA1 evu@,I*[{ؘs Zڂr|ՎR] F)hYsN9wJG@vfF BLR?ZXwl2F8K$ZF%#.JIf=xsL| s#Ck'X:]&zOXWx<!D1 Iq ?CϲY;F_#aĿ/`Uzw~u>9ʿ_b$ӋY;dtlݜ3G;ϿkYvnQ.)*k{ o~gX::x_e~/6:(1{Ϳen|f?8W(Fj*dۇ4[I~oA]Q .O3K{-S}&χK"ү~Xo|CwSu~_ͳk-;,8w8;һyRW/xdzg)/_!=^<_k||_R~;M~Rzd}ű_ߐ}wǎA~ϋKǘ89&+_,dzuhm`_;ļcqYu?JNJ;/Zz׮->8kO#|׾O=½:<7XE2Wpc_<}s(7cD~i-*ЇtlOX͌x+G;.sUg3ej|CM L}7zc;?M?B9W wC+h|;= # .Sxx_e2̒8}zߧ68}\nV7I>l^Caf&&//,l?/h9Z871}-I94K :_<4˟x_8L|l;rMQ~nvl] )ZFs\s|_~bdfqzXŏұwrgc:{m_:YV~`d*uu;apϵHX؄?A_${f_#g-'Ozȩw8hŏ.)">%^;%zMFlN1ѭ?+/s_/d"S)N~е%{TI ) =6N~v+bq>(9[orGO󯼓fdwW#o9~E^z'O5XWG9b_a|]27$<{O~NSzJ|"p'~|78]b6?FZ+n~?=«sݜꮱRzk̿)jO|'1K99*C|85w,}Lpv.WC ƿ%+W-п$|c7y_4~k{W8xA[n^̗V0=.#;i* cWw (,oYmMo5ҟ{+ѣl5O0%sw\z/gx$O?HǪ/w-NO _3ҹo`)‘Be$?Gyc:}vOGe6~s?Ovjlg{LoвS̉4~%?Wsi|bg {w49yE맗aKWt(?ғW])zPaѻs UNM~J<<2meyj~.^~j7?Ǜf_w?|Ϝ8_H/Vw-W\vPv; \9Dw߿Jcz|V"D9.,?y/u?GXQ>?߯7X4wTԍ1~|y/Kg(IT5d8Fo?3~k] קfW;S+7N2~hݞ`W|W_* =c˟"'Fqg=sїümk7|H9eGޯs16^|MyM:^)M==ו{wm5 SXJy*EKᾦ ]{ `C*;+{u>n}b ҳ77onq{:wM|7$@}EGğ!`[e~n[f/w24}x+syΐsV R >7~ɷ-^v[\˻;!+\d[ֲu|w[6[b`7knN=Zx[si,}5!bۭimcY5d}1lʆ7>}:(^yKí9s`}:M;F7]f8smTεr2ƭiW[~ Ψ[d[号C^;ש?wZ7ʛ[ɼ~V Ƿ[bg;_cH'ClX-rCv^þ2gW[9Cv!׿n=NM ~n{y^ 5ľ3lq `/<1e^c %ǰaVΥp޿_k[sp֜o5q'oe}ξ_?=>|Ç>|Ƿ >|Ç>|moĽN1 iϣ²,$V^(id,y4M˞>|Ç>|moitmJ,--y9z(J)1MO}S9s7nvW._//1==Vam{ʹ3  >w4!@: a_U@I``>Jsfv-u'ɁP]x*qpanT1& l i!,̈́(ܨkK"e @\ h`؍rl?B =azq '^(M9;pC}u B r㠝;mqÑYWRrQynh(ōyr۷osK{ӫ@ב MiOQZ[zm‰r9o!5\ݐѡ&S\WsؾʞYڱёA?Зrbp7D8#@*ӻ[>{rJT¶5pudjL0oIV6 s?Y*g^9kJay{,km U*pC:Qbtr{Ԑ8TtŷT~Uq~G~|(8z({ܤ\.t:X,'?I1M[7F0HG9 !d,;ء ځ;hD%BcF4kR2B/D&%Z*J"X1A_YҟkВ5ZIE{8a%\BU{H$q*kwҭF#TwNuڋu0X=V;zNMHJ(*$2[ABq(O+.չ1&M*ZgZG-[hGs{lTFӻ̆7֟@t/lrB=X "s`Tqƴ"k#5ZJkXQ6%nqaYg ,T@7@&k-J$q2*;Ңݜ@Aޝ'5_s}]"b-zN{8wMHPf DG[41JㄚP1l>D(Qҝv3QSny.ӏYAdw4i4Gl=@=P!2N"G5zaF <;vX)%_?EtQi?wnNrḬ̀8sp[$w.OZz=Ξ< Pߺ,L2ѫ*,0ΐ(> ?NJ;tTDu&).n0c!۬]7wY4fgNHut1v戉Yj4ese:źq +dQ9@F OtᓼDf2cܽ7C'a4'{SwR?Re<(`ƜӸ6jG+IBR^By,9wNmN&dL^0P)"7gNNJi.6޶K3@,R[ *o@ $uH`UF(׃lnc?8!V~>ӹ-EwSș\3dfth ];I \t0#yB$:f)F#tOC'T\pz\gT9`<܌"w_ќf WB'3$C.>Bۊg,RQD2|jsO5%"Evwڨ@iqμcS> dk 1+5>hr9 &&S&Fal4kGI^"6C"2YCØ ^=*es*ɉ9ΟEٮ }d,C=u3MfT{Dkf*$DœWؙv.N z` 4FxQ:X}3Mj #:2z*cJIpUx{֦"@fcxKG~B`یe2ژg2 ݅ ZyT 6F+FJC W>LO׈:?`Z 2ueaPY p64HseiR5Eܡ_bvUA6736hG,inΏ3ED4곬N3۬Q{?P6iq ݡq&rlQ#=1 $ #F%w:;L,b zΑ{n&W,VoGDKשU؝Ьβ2=Fy\# 8 uZt{>x.LƺՌќQ9~*LeR3荷c, ;5Fn^C Qfo,ƫAL[n~Vb͑4S1S&sH wƸRL,'"WM>p.#LxgF QaZ!ë1|r3aܨP=QBK1J&8 9N3&urtHG3 R2,IiL2ڣVyƽ$fM{5$ΝBIsq~%Qƛ-:aA;tK/g+<˛']M.N/b!)q ='OX#@ύ,/|G(ז<+,7I5I# 13i;K@IFJDjy KBH^f&c$9 Hs,m&)4dF8vIXMp#rma;fwIНgUlO211mR1(FA0ڷF(D٠ &)1a; ]4X>9P#d^Q7;~6 Fphhv)qB&4qªC^'t` B}EXb$#aycDQija:aIzY{'h7=٣tdo٠Aѡw0G;4"ѣ2ߣ>TIPLzH$&=6=fcVъP#_AuFsf1[:ɨ^w,Crm@Vu6`ԗ~4Qg~A^h}1fQE`Jm T@ ^_$u)S%cX)ZJ3'w'IɃvO P5j:59ZN&fypSV鏶11z2@3uPL;ED"H͠3:@qZ0D8w4h P D.UMV#N=O٠G8EtQ].wy` Ml'1r鋄; ٓtfWƻ:e1S2{r;}Mf`AR`~VaHd<'hzMLeR5 mLrh R#}۬]7:bVgnHu41 !Z&f~#g05Cɘ$,3-6Ad&VqAga*·1^ڛ3bY4v~ʮuPj. &6F혻A?K ; ڲH'Fdb3K z`>M q҉QvͅS ēYʵEbPp0T+右ٸk\"J'.5N$CܶF`ѬO1u<#3cy|GSckdz0 f~Aޖ'L{8È";A'iioЋa'{+HuF!{ޠ?2d=Jw$atvaH:A68F-3&o0P#ɍAr!)fUY T:#MArI)g.#: a Mig>bijZ'5U**5CCtlM2eX1g^.2lbK?C4j19FiWgTS#Lܩ1z`24v3}\\hUPTLx s.=awA.N v` loD7rڳMj '>sdU13ǔZ Vq}fqz(L99ؠ/'9X8zk\b\"`FݠmұCFl$r{m,?pf$o]U\`s6Ιs7S%RㆽA/Yb!:w b2gq$8FT6 N)6:VA' Lt\&<*fuwըH4Gɹ5z9ՙ4?x~;f{'TsL䠻X@+4Ief&يhGqQa,U4"A2 JPn o_iP,'8?z~\,E o'Qj15}=K`v{x)@~A2H`TAnΏ1y3FCS!GIisNM0ӬQ}?P6aPx#zmQI}lx;\|In$0&N٠[LA Ǜ^X;mԪ4+3ΌSdEˌ]#Id"&L^}̱>/G:ݱՌќ蓏9~*Le Mҋ'c,$:bS7%7CHz;;jGklL0Q21f)&\ Rq\ 1#A8utbvg=5l8flʉrD Bd'9{8 'h%7 fm;F\=<ݩ,h9B41Pѿy$enwnҹBޠ_XCI039}V^{^KٌƟ,&gaUcXy}ǃAh&z.XhpA?Lĵq^i}C{ɍ#d4Cs\[#Mȟy9E>ɣlE6?~o6ao"aR1`+&ݼ}ܒū0`+T,ɕ$dHSp8~Bs'OSqfag!=nƖ#XIXcIM){q69d♙9P-RL:7Jݣ'{fR?ՠRYM#IIM*ĈOn3/gaI2bD*>یC,!9īw1db]{~PНgctZIl7{0X;bUaStT)6Sۤٶj*,p.q <6.nܤV9{*輣M=#DpG{nu|2q$C2Y77Ǐfy͛z=z!~'~wͱ.ׯ_gnn;_)E\VQ.+x NI0^I G\5T b0se nI@Bʿe> @ ׈xCy(v栮ړlŠ֭q=:eN Р -qw F"5P["l)\US0┹xuq2\vmrԆԊX\.ߕjVJOr'[ϒ#.ruմp2A5TBc)gn4)0a)*Jܝ>Dz+y eNP -<-yK3_DI!W+2o*JJ8)5(WC%n9dP+2q1O( E!%qk4+TXJڥ.l++*w}p_cqZ_ lr[z9e8d ˓{ݫ{P>ѓ{ ދ3)剸-)Jyt[ rp-箏l@%x!SA3ŠWsn0()ߥ[~ԼWr7xkA;R>\7HC:HnK -C\_,M%nB]3ݮwwpʗ_fi[5P D*|nq]v 8>/;1S2k9E|oP`a)1!s#I5.ۣ.rG!nCkG7 |+5ɽO{n[sj@O[V*P-)ƛ 嚓soayG3kqr%8u7#};}&Ǝ!JK}r,L!< Kx5\YfC~|o9|V u{ᔼ+8甌oSBX,-!jO}-6G-onml^;fBX^uiY^)ƒ5ȭB9m<\^(%S.|Ç>|_]^?p8??}sk߱m?HA𲶍DM"t5&@H$: K!5&%:ЅDMhRK&5t)(#ф@44!ѤD#&H+SɡstwItM8וhBG&ѤB >GMe)$ H߅-@μ$Rc;ꮼց&t[r]8坧 I@:AH 4&$H!>ПRt$mbIACHݱemg)j2XҶ.$ GľԤ-=j dБB)5W2`[$}.ݱ=I:BJ&1uoMBxzѤ:RЅfCsǷiGhѵ{ᕔH] un[9\N e!E),4!8sդx.4>͑_4oMj_J/ܹj/)\q&B:7{qum]W 3 t!4l [94#%5qYGs#/KMN\_nR$^pRI m+;V> (w|!nhݱG4Px1F8vg@H3_/^J~Wmpr㔰m{a_'㎩!1t76NlׅYҧ4W:z|䖀9gL!,Sw:uw}A\$%RwpBN:BlNC҄vם\m[FI۟Д@ ~h^ε3]HtE%5vҎB +3i^\Ԅq=hH;v֍3A!vܔBs Sw+&쵉siԅ$s͙pEw45+7Κ咫;!u'鎾= <mb]tµv\9q( 9?ۧyM=] r9kzN?k$msM'v1&a9~*[s Mi]9YᬆYQH 7qf3=]Kmo)rn\VH Om9_og]QpɽrΕ!uij}^W꠻ؙ&A4Gz묕RjH}k]Ƴ׊-þrBy-;8Vnn|}2 5XHWgBOqRBx:Ѱm$5:aI\gtgOcpRګc/'8~Ne;gH7 k+) _qbBr»Ru#om(<;{w!Mtv5uhHiWA7 ʌZ&x5eLPX\&ֱnʬ) ,v_/-si'^MӍ-@c&kt zUbZ\RUeEvEKh7Zx_IlrZU\;LSh4Ҥo7רS rMһ:R2&&;^zb"l߬I&11[)>[ byZK&[D*uTX5޽u&a [D[wLn.9F^N4Boe~JfXꦆYh;Tf[%g,/t[=6/@X_AYO"i"{E+DNu hie8VɴL,!EY#ExJsiӢ͒_R-=4C0Y]\C{3CteI[z\yךezkhWdTnJ6_)rd[ވp#Q$N%ZW=Kmj:[jJ:.-H^`S[Ǫu[=VG4Kl˼!R+=Lv*7YMߤE*Xr=NUب/ٮǨn&ՆI5ѩ +Xf(q)SAQ&;ޡB"$k5j"Ϯ׸VcWC6^*bE1[ nsHfq݂dFBnhmw06 /2ٗi}nR~fuJ.غF׻$KAv%,W^M8Wжd#`"4PME%3 BATgZ<˨NW371.)+\mP}N &fJ"FJK4rgT-%f.mSUx>-1Y#׭^SK?IJr +Wk)2l5&5+gX"Wy lM˰U~usp&˯tK˘z%L]ed.gif.ͽ]&WhW4UBʵ;M5IdH0`F%8stiFV["{)T%ٶr9.MR~5mf>ŋ\f5I`FH;C0Niu7S].s*wEAh.vF{ MDi1cy*L Qm*U%kS$ӵ<%.UVW)nlKK?u;!6+)FԾVkAkuFS'UBWv)dj&N-w;\nJ! nShӔԺOlZt~mҹ>XņrilF'ݐ4^Vȵ,Yi0ȶuoTȮ]!Z'mUM5/P_'kFt;+y6W)R(kD15 fxQqf+yMj7sg)k ^nHe^T`j\M+ {g4:~bS5P(vil 1Φ)aۋмT6 _W\_ZQjH4.eyUبo߽IRla6tu6.ȲIPԍW0Z1 i-^hHK8+Y6 ~CM05@,cm%iF)CY.j{vaq3TVCA5SGheLvYGSbm,m4PX΅rˋ)Ita>DPY[F;B *Go]C}ZƋnXj/u9 4+A2&MCRC+$3e|T} 3%Z"Qk龰Lz^mJ+U͗hF3N?L{Bu|N“2fJBuiBT ZRE:;U\e*K;dLI:r XujXVv|Nev(TzV(~[䴳V4=MuoPo.ț%d 9U"%=7VZ1Fhwv\=FbZ s,F92Wxbj:,[giأEgQOgEJz=ܣTcArj9A:69Bk(fwoBHԴȯdlQgLfo+̄LtWMgb&EAL".7kmpxc.-z,K1*`Q.RA@(a2W*>|Ç>|gA)E<@ /JTUݣ$Y/31->|Ç>|o :WJpsOo}Ç>|m/>|Ç>| >|Ç>|mÇ>|e$;_ܗ7[;@ Y=a2uw/m5/p,#qʗY3(kl+U(CD|o2d|"_ A^e}H RhnJ*=*ĤڰFƶ)A1[’ - ("nc,H&$-b+s FWFRCkE%6댊K>t%IMJ/ Af\GV3Qn$E5|+I%kloÍ &5yD3XLyMT ɳb٢*Th2LOPGUgH4([ Æz !%Bljk5{mfF,Z4&%D7&5΀,:IjҨo hXCc%|3ŲC x ECVHaTU ] 1RCRF)g]%%f:j$ňYlj +Q:vJƘPkekIg 3H+ΰW!S4DZXAt>N_g̬LDhz)k#Fq)d!5 $-F4FʷHx.aAj-B9 fK| )md6r,ǰ$)alŧ21Tu(LZ | ĉA j5g4"H!I.aGettçbZ^+# : H.aABo`hq4/٢ADM.>X1d&ZSJ$HM@T\N_w)ȸM)%ら3-I5o9R!@JKU|&ChVX$1o@`H'&,FpJhPz+߲(3hQWF ZV&}&}~"ELdja4dIPOdtH |i`hz)@B]fLk` DF&m[-OY&XfJ6Bh>X1wjzOsbbvf`b-A:Q6PCzR-˛56EXшQ Q]J>daGH*F2-9nsI R6B8G0Kt\I,TXH Sʼn-"Å>\+MQ"Րb6A]*i8}QnjkT,k44'D,#UI+IaDSHI5 d*ãGnǏ#y[sQS$i1([+e,?7VC aiLb)k`DMl'M)Zxx)KsEvhD5VfHkY ULsR:NZg@H,emf߉_">s1SgSuZd52.PZ 5%jPKH|@$C!!$j:XD5oKsC4~ G3h1OOc4$#5 g-2ɒp87jt4uL#iFbdjQ"k:XII5k -\k:#I(nH։6"$5?A Iil[p kE`SF+bWDu~*ZIB60ӒMy + ZЏUd8BF)& 8U""n#8T 3bO%GoFIx.NTF]K" QHdiSmLnS475qYfRMG/ MD, 3.HL=Bt4GThF#6Ɩqk1p -I>$0qdC+qtC>!#W'4~dDqb)\C#" L5Bn HT Gm' pceYIx h$hϏ2VpE*N6hz*-|>!My8R#nKb$ҍEl (Cb 'Sm'.;:aӪ7ZXv="`44 GqD(;< Տ%bzV7 )M|!,QO2Mf,"mVhR0CА&RT)Z ÓhR<XbIa12aiĢu(I?-taU`T[FE-VMZ5fur3غA:N:H-",hՒOֈڄ}@zV!ܬCHh tX%ʶjj mT0c: ]㻮yD 4HM vxˏT]'h4o}eG~F~ON1F'?ɎOyp,֯~{y3v=7ϬP7Oڏ͔]y ?8 rXED\5ÙWɿ0f}OBGvt*f޻YyjG/9>0]mktVy: JY>0LC3'nD9Ɨ~vsޯ1}'#loX2UE??|A~OOMSx՟P=v Y(Fמɝ9zQ9{G=09?~__% C: c/y}Oy密ogN}q#3ɻczg_u‘{~gw8ι=DSQ}~~c:hyZnƒ}/'7/1o44W{ǹI `(;.4=57Y^]~2dK+%<PEpt=痯%7q,6»+ ;"k_a7>:™1>?So7=In3y)?gvd$@q+9>#?sКqb0!xdDi-o92"$8,;>O]}3_;(_ﺁ|bOp=ճ|r>p̅ ՇFyc?9q~ zヌ.F5 ]8ѳ_nDp?_j]`792?w2Ͳ_ݟϘV߬G1s;<w~6/'dR_|HPJ `N bSJ.yaG}x} !?ˣqo8{|~vj7M͖W?͞qCŶx8"v?;9z?# Gy| };hr/,m74?3;jIn _K~io/r3gӿI>4ɡoĨ7xV|:wi[<_y|ȓ|=˕?l_d?5|~#7qtx/n}3Uܾs㜟S+H#qNaz|ՏܼXrg9y]~m2'Ծ~?sẀlj䓷M_9 @uy7oCO;*f1?a)[_l>oy#;? )80FA!|#/GS;hI==f?|[wQSz懞^ࣷN,(sEVQeZ^@Z#՜|jW-r tmvU8Ql^>'9#3hGx) $}eѾ$M><>}O}'\qyqa5IYڦtVrC1$?z8oy_}?HnJg,y\v&~u<ף?{-|pE|YI,[#oC%x|SF܃@"Fl],n_'~e&Ȏ]Lj[qX9T3d _?Üx/hgyz+WĜ͟cM_GKiy.9fJu:hƢnv?*x^ƍez>IDAT7;\,̗&o $\'sk^ؾm_cd*Ş-Os&o,vEc <>ض}=ǯ4>O`Go==}<ܛO󃋇Y3x4W~{&F6Qz^}_&u"~: -G;:F'HXw]$M'W>ͣwqyeO?Ci4lwї̳g%sj\q^es-%/-0=I_ľqs?:TfG~F*w=ͅ$OwR}??br{y/n09x?۸ak{y.rS?oe$\ /e&cX-GJqql:y>"!-l ?ppm p4/\tZ`Ȗ8HnI, NieHm$,+ky^mf\%Z`:Qvp1Y4e!6nǎHóm,KB3],ߧeAM <02 p ",6czN w0s]t1h@D.M,3=iKl۽K p- ZXF&AE-Vo<q"[ec4]C65=l~ö}H'gz8vߖMl\[t=qlC|it|$-Geq 1=)0- }\+IZ8N^qѷXy8V@4cвBtib>MDZ=ZnkmHs]<',z29xM6gYng<\Bso8xMạ6w\DF`B\d`a9 O|mZOӑخkx4]iJZn-ݰn,W#0mhz'- vx]Sl,:c1i& qpl[ 0Z >a=rq]n pyZOڲm~;8x/\B#CM0B"[!`6ϲ Zn3¶7hY-W_bY -m׷0CrZێ+Ahr}ku-,,ųB &Xa.N c01=00&[AtCО]|um\ 1}`-.Z+,i$> 0vHl>-/Z+vǰٲxV@0Z:qu kj8CXG gp,lƲ[^=$,Tsņū37|'6Bl׏ m%+h\m{Rꡞ۟k!2L"%Hіq] 2,m  @h~A" Hv-ڟ!{RQvlgiMU%Z@׎i_mBI;ٓG,_|:U }~:1Zx]u/ku>=*Xݮ,8%ڪSHĵnr_)e @qѤmggub5%ÿCc wX֓ 8"$Wx^ʶ#MکmjzH;znC@ BB`AN!iDf:vzfB{ ZumkXeE кѧm3혧uc|sZa؛l7|bn ~߉zߖk'i]!B?i,v[n5^I ed^Cti#۱U=6/v!t:uEb]8);3hGNo[v^te"ԯkljрdzz~k m{B" cmu耦=79{vAbc[!:EPǚA߭KD "_vbv?z ;ꔻӑoeAzA^v{׎Zِjډ tcja'jG'aY׵' c1"Ѻvcld_ډ+B}enRfi/uҤb=v4Z֖atY:6A;nۈ= \ۂ:]ޘۭ`=u)E?:F:d7Nim{ĺmsUw-}G?X޷]O2:c :c=.[vqw>o;>I;wl 9qoGL(X)@hH e -<;hǫ@.%a2E~Ԏ0uc]a0J }%v_K6NLvGm^z?V`Ewlks[Jq ??m݆i8pw]=zVE\wA:ѣ- (%LBߐ XdLd$~!fH$32Tb;5%tqMnXZ""⮇ch[7 63Cd,wb<>Gn8غDJ#'8ku"Xjn'-#Jֈ,1(H * .UFܠud<d?J2( ghlIJ2j#LLjJfk*zc֞eN};aU}fxlF /Z$0,JVI 1>CY#6h /\41,VSʓg SQJ&Hn9m7l ZL+`NٿqvyoL\PzBi7ž*Gh&86涒GWh)v.5⯐K 0ZFYs/qř1 •O%vSf-:vkP@?-c8<6{-p>~AC;r(##SfLCs [DHޣ2BY] pZ 3ȏ[+$D} b4v}HNYK¸]bIl‘QZAk'{Jx- faF[Zdf7Qb.F"Y%#H3F" o 4Y-lҌDƊ &Alopzdt`M xu W c&`zH><2Vi߯Q F6.%Br0|b-K5a$$ irn`D2=4Le6so_f }p1=b3I֩cɺ`*͖EjV#'y1f*yat-kMѼ$Y81$[E ɚA>|,i.4(9cQL3l8'Pۇ!<*0O"^%lfOsV`!>"&4e-*SbQEXEk$3w)Yx)oe0ʹ12Հ пbpC<77jhI~![ Vc}$|T x4A|+71dYL c ŖJ38G*-L)#2=<@a=4OPdiQMTabu#ceMOLAflv^(Z I52F eLz XD:RE>d5g'A+ )uW55f\#kku*]ff`Ȳ7W"E'038~~H5Ȥ_M2bWqk(fy fQ_wiTۨ' Ҥdk wN0Xs%8Vt3ruYZ)ov864KcF#b?x`gEl݅i=Q h0{N MrjWpٝ+Xڠ^# J. hqƭ r-r@{N::+Ock ܁)ŐL362.ހ]biHI%c(ؾ@VpmF2η,- s㌍FCu}Yyx6^X},frUWaشM>>FcW`oƸ .Cbh0yxUgQ“k#-Z*ЉąIen8IfMw}og֢QL!n8P$&%+},sĢqa?ׯb_c('$\<ɳlsGX.bKޤ 6]c_o/&e(~k j)ny'Agk‚1ɦŅ~FDy+uajp}eVQl/Ɏs}'wɞjL>IR93:˸;6Cak @8m3̬Ԯ{ %d-6\q?GSf'&8y&{1M~v L"b~J_ydžv8"6Ì?c0Rtn~76i{X9PVk kU8m{u[Nbj,$9ıܛڕd!9eb,hB5tvLybZ 7#wM SGOvs`gljTSuD-MPg:=Adfx)Ny[gY>a6`u[=eY3P6F=ÜȣwǛm穁834or?r*O' سR&4'طJN59EJ=8@_h&8e~Sc:Bdrk6=Ù;.R,9FbK ?/"1Xs)l =B>n3aыR}k4r ]h3kynjsȎq"6Q'Wf%ՇqYq7;1ƧH7$8+} Xrlo#wŘHD 9ZJnq5Ήkxq`/59Īj*˫o, ̊6tGw /0?3gF&Xl [3)8cycD+JRt&ē1oRդ6`K QĞ)29} l;LjB!&ӻ8ʐShb?5-̱̈́.iFo ]J#v!.,xnkOY,[D iG2lX+>h{ <7p Ǹ8e 8o2^t(ݐ'{K 8c1eIse;[kd*6-n%AĜdcJwbm6R~ʯ > ###,--Qיapp{~0 nV)'a7 Mݔ)tA)7)B+\NotYy<ٓ\n7. L1?ҎYTB=nE(ܘ֕ Ng KS!}=i=eXO-\;';5n%)rqikayt{zYGQaՕ-%PׅI%M:iW,zTI?ꭷu;YA.N ٺgwD'vo{Ҥu.\)%18-vSc-c'W˰^c~ܝM\ziVp W0M 豷,)Cv$kiv]K բ{})c=\uR vBdﵮ!\=3i=fu?37NkXOWb^}KYmHuX/Ft MYo]v'd./Muo\_d,7ۣ;Il_KL2;tӁm{w^ғ>=Wu)!:ݛʿ~ϮvmkR5+M%Z,{qr]NlĞ;S.3nۓ~zpov؏ꑩOnTu=obZN[O퉙rciC)oKs{ʳqrʺ oj_W8ѱƺ%7{tT ֽWGLY/}HI;'n@;k\?XδA|:68))/ΆiЍ^KC=;5Sr +,Jv^;h}6&{lӯT~HģN_cD;n鵝{Y-/p~Iҫ]v#`_=cccR)t=q72;;Ny衇E/h4[ؼy)BP( BP([|KtMӸ;RD.;&u1 cCmBm+ h:&@` 4 kh&4@54.Xg:Bh"&tik!|ExiKk_OڿZX6[OmѺeл6=Gёv?hz[{_sHq&,݅ei۵oftAkvB9|˪}+ue_>;g {^(skl5B[zܱ2 dܰ{M]ok7Z]?m}wKZק v߆cg8Las-Qݸ۱@ }CepaG> vLo>ѕwqO]w{[9GO=me(ctbۺ540qꍎʠw߉ZOiA=CB[oi۱'-#w7u|U¿N[uyݶZŸ0IGOk/N{a]k_ks]v~ׄK!tM3 vԾ?tOАm{k^&~]f0Fk ޭ'w{蛴c=uܱN?-vlj0DM2z7n>X]]wuvl]yRۨnM[o{:j't \o:z{:ؕC4}DCݮpM1B v_ ~ua`;6ϮN:?$}N z"lO:-AO}tDc;CҾVص;ю'w)m\j7>XsuwxڶiԵN}wlF{3u:-=tg}Os u: ۷z8D޷Hx=݇7n\2.mNY⾡ثvcznw|J Ci!o̹*eZ,K_e5;AX|s](WM!|s+I^)'8a4$YSDkƉ"DJƫUl@e6t~=Jq$Њs4VR Ӕ/^]<M 2䉶fUj3z3 aXVZŤq4p|Q` <3qZ4u kv2guNF-u_@ɚk .̲fcLSgX.Z9VK p"U.\rĨ4.%vlSUJsrijr$WЃIVr|A],ڗFSIܒE`jX?FSo2U={?1tN ^TT,8)UhjHĢ6u|e m#īX\NbTZr(^,2r\\.r1M3c!X;0lfguG<72혬פMbiiN TK)^Xcs+"ϊu1R"|՗̞, TJpkTruh>x3 *3eL*,8[hiE]h2]:X|gQk\Z('k,&i4`WsL- YP>ꒋʳ\]9+*1#XBBS`Ng I.+hɢ[XcRt}\klAm%dIZ̪3"iή.иpRcɟc6!.S/ՙ2gfE%^昩_`gʳbjUNa.Y ?tӅu^М9r PȽ\9bTkM6S)CaY*%4 5?Bq( szdH\em9ͬ>KtsbU.bL\XhT`5 e8E+isZs9i Vr|ruOj"I̚q<ʪ ^"LVSŬGN0MrEVz~ͬQR]=z%.N/bYʭvLǨ.24j&ESn%ZW.X,qjB2pZΟ\MR(Jhk *1femb8։9b^>B^&`(l/;EJ #ϓJY㹪hh"kћ /WXXxӨ)q<ˬԉZ}TV+ȖEq5fш=y\OT5Kc(W9Xd-w]Z+S yV/rRLa%E.*^V)Uz MZ=8_)B}sr9/h 3\YٵYTXXiB17ё\t U֎ "2ay5 dfY)S 6MrE2De9`9ɩ"3(w=lc4h?J4ԵU$~Db8t8Q yiN,i1^Րy鞦a[u<[8᳉ c @>%Å4} z{-]$2ߐ': l涧D}|2j@:Bx"T_×̚۝en ᇛ`A`S%|\f9\U'H W3G"|/4 ,'6CzH=,K|>H#5t_ D>D \c W;>xӲvx:~c=6t$Zг k4 ]sÉ>Í6 "\Z!K8 uh^{nZS! "j&BCm}6l2;iAD?I>!}߀zR  4ၯ{}|CbA{{9@H<"I W{^CP2n+4 #~8_Am/m[\-e0>hahG\]k+Xvl"c0p@ uߙ'[H#B[փБ2ԡ>j:vtB?5gA{09Nf,лb[V$0ˆ`̞ }͖YR Zwk& ߖ )[މ0 Elǭ 0#"v۝íl&z'Z{P/ C^82p ֡ _B|#l5QGD n[" IXHi[H՜l۴!vYg!ANHv[ehQ $8Z# Duͣ8{VO#mH 6̋_ n/Pz 4 _k@+Bۖ2 ژk9ދH? º2!RG:22=l3]]B_zV Z 4d'۪~CD¹RA DoH"Ai&-B]F}@k\bO'n{ ^NGxa[ H#H^,T/lEIKO2׳ֆh椆¾G÷u1 mOL-:ȈI#<)|=lv޹!=\@aȰm{OYhlCxHE¾,a,H7 ^v6l!}}v?YG.zzBÐaZډX{xB7D 0C@)\a} c8nݨ66%2+k"}] BEnOD%_a۠lUxFSA <~OӺm,!"}4c/&!@:D: OrMxBGa@}h d@`[{F5 ;xA$.\ v&Pp2LM$y }<]v6|EjDUץ_KO߽רT*etO݇ WV< 2y;2}hBP(W^sZ ϱcرcajK*)BP.kEn !N'RJ}Kh[Cz}o=q"N<ɖ-[|ͺN{w~Mi ;AtefT*˲bRJlڌy|3}zy*{tVE4 t]=۶l61 d2Z8D 0Md2ٵFA,#`&if0: FGG7PI$Z-$eh40 t:-K!kkk,..rKKK=zonPTfu횝BP( %گƫ}|{gϒJ,," l.h p۶uhZH)>l0޷O6I<01jt]^wĝ`6RO|l޼yÀUJIT"7 0gggG>ŋyٽ{7aj4kԉ3mmۤ@wP8O<wyg\!j/~رx<2o^xN"4V;wb=Ǹ馛d2lݺ]'>#Grݻwk!211A<'3} q(ɟ gϞEuưmN\ĂN܎D"s5l4k)e76:u'Npi$l7ͼ ,..Ny׻şF<{ǏST`mmgϒH$x׻ũSD"|3att˲A9<[nmo{wt^og!ϣiW_}5]w'zud|k_cǎR*xG( r=/}n_~{OH$x;Ͱ Z-x{Or W_ /io&ᦛnOOy;S{vӟtח:r.t _r7+Dz,vW_M$a~~'NtL'$8'N0 of۶mwd$bH)?=Z ]9|0_׸X?̙3g8z(㌍yf'>a=!NS*x饗X\\qp͂3g裏pS,d2}\.vW. BP(yռH$ȏ0;;>1^z%}QJJw޽{yWꪫ9x ܹ_~>]f۶m<DQ^~e=Jբ=&;餦_)E|jj]o>.Ǚ_:"y7Iܹqشir{EjeVM8}4[y,@J8J%::'җDVcxxml޼]vQ*xVlٲ~'OR(~7fE 9tsOfttw9rbC|>xr/f m۶9+ BP.x o'|9::ʃ>K/ę3gH$ur'u]<#1<o~9u躎aq122BXdddzI۶sާ `O4d2 v㎦idYsc6M7݄Wǫ'adڵkCeYc;-wq㰸=/fffg3O311>IFGG/1n6|xG7 111>K4СCr94Mcdd!_)J躎i@ߙ$`ppl6K,Gѹ7Н>Ыιvɓcܹz>OS.tBP(t)%O==b{oVVV`ddBa sN\eϞ=pI^z%RRJoޝ9qv N300O>DZmns/s-sN_=?u9tig:}}} RV#e<Dz,$wb:tW_}5w߆9(A@Rv7ə3gػw/RJq)ڵ uR{ny kƵ^lڴFjb18w$KKKl۶kVBP({^s p]MӺʆalXӱRvI.};Y+L{$o|;@;ot]v;PuջpZoMX\\dttJcGJ,@7ݼbLB!tT)e8ۑ WP( 54;tt]0tӻ sWҷ%NgsmSiچؗv;Ί^X a}Λ)t/]wP[Ͻ=};n:CŷǕVsXIU(Blݗ{馛qwJ̕}({ǥ7+ BP(7߫Z?{y{PI$@ *Rl겪8{dv7{l6s7̻3L$&N-ǖeٲ^IEb'{^?<8dGb  S~ϯ|Y^^ro+Wwy~?׬l6h{oT*{<煨9\YY'kؿYx: Tr~?7<Aw?b}߯|X?|to{q/*'"""""""""05EDDDDDDDDDDDDD&DבCh<ܐXz"""""""""""""""wtz6U,}j/^5oezAPK&χ|~r x7iIV RNFVP+Nտv;VR$00a`ee\AAA>%BCCXpۍl&,,쁜_F<+++tI *H8sS7߲%\Szx ~L&:*6dw˯|OaI Y\|>^Tl6_˗IHH **~|@#Jك˔Baa!'..^|>j5JE222P 0;;KBBFχ\.ٳ'?!55F÷-^y|M~nDnrl6#JIKKcpp͆BrqE*++immG}`fffPTdddP(ceegiifIHHT Mff& >O׿_fff{/o[&&&8|0,//ׇ$11R?`N?4D.cINN&<< jT*N'iii"ˉBcpp͛7}vJ%J8:;; EӃBdxx\D"!99Çsq?;vVE6.G}aV@JJ Ν__|477cHMME"""""""""mwxhjj"<<zii)CCC͡hX\\'^㮮.^~e&tfϞ=8N|M-~w]v7 ~P\\__yfO~BNN`2׿N||>?)MGGaaa< obӦM_)Jco[M[[HMM??HOOg۶mdddzyW;oWUZh.\@CC?gS[[8N̿˿~:::7333\t,T*h,{]TWW//Z.FFFHOONRSSq\ϠP(XZZ"--?OJbb0ۻXxv;7|OlH$BBB&// mFFѰ}vt:4222H^/T*_*YYYX&!J &!!x gDFFCHNNFPFnn.B1/ݧ>)vލ`@#ٿ?deeQPP@AAdffHtt46mY]]Mpp0|ŧ>)J-oF``  T*!!!<ƒNQQdeeT* la u8@^^6 ^Ojj*+Wdddvq8VD.&&&tx Vt GFCNN7o?33]WA9ٴiİi&Z-999Knn.ŨT*Z-_WIMM\DDDDDDD}b'G"m㬭P(p\/t7 to'L@{^[[C"]"h|ZzXֿ4+^WX"""""""""l6Z@ %33vjbZ՟c~~JEPP}mf~~Z} 2V{`0aၜ_Fn7sssVFz0օ_y^vÒm~8NI[znnZqDFFO}}=+++DDD暚|h4FFFC*Fkk+uuuLLL`0>"p,.. s˅BV %<<[jBM& 555X,X[[nj5!!!Hhh\v Vᠢ.^/ڊD"A mx<҂JBR\׮]cyy(穩v _tvvjH$TUUaaaj<00@?r ͤb0fbb,..k.`^VVFyy9Vnprv;.\@ӡRtMMM۷9L&KKK\|-[000ѣG1 $&&p~PPP2YYYDDD immfq)rrrr._Lxx8̱cxGDPUUZF.sIٱc\xRIee%7ofyyU^{5An}gffI{{P`̿0fzzzᴶxBBB`xxN'?L7[ZZ0TTToΝCp%YYYaeeǏS\\+D" TNcuuFٻw/ t~L&dggq\\x*;Yo{^zzz U1DEEQSSL&c``D"""\pׯsV+Zq< 3>>NC*Eww7^"""JL&QVWW 7?ffFGG pN?͡YYY9$ v222hkk6޾777Gss3V0djj0^xejj&&&}Ar-o7GFFLRd2Jbppd2'N$n7BʏkkkhZ!"_~~^r <쳄`0fnn'N{ϝj1:t.پ}`/ j\q8Nw8ݻ??Y^^&,,C*Op8tb4?o{{{1L|>vMsspA(..RL&Z-)))|gaa&!peN'###ǓOϑ,|ܹs SPPfҥKh4~_r!Zd"&&h$ %%%tuuJgg'7# /TUUqAN8Aff&fya,V+կػw/2f>ro<(-[kQ\\Lkk+F6vٳgguuUjW^!::WgO<ŋھm6m>9j0T*=uO֠]s].N",,{r)f3vl6}o|QVVƾ}wKBB:W^ /~!:^u(..~HԩS|^kJ?~B"$&&k2GСC }p\ܹ;wr AcZY]]mصkVGbXz*[la7x'#=='xev;&">!!! VNVV vYXXx%n7gΜ! 2==-[{^UUUl߾0:īJss0iӦGBB'HKKr}>aaa|fΝ߳~QXXȇ?aRSSYZZbnn5$>>LℶAAA۷FGGiiia׮]<ǖ-[ a2HNNӟ4I8tLMMm8wFFB$L&0t:FGG`llPF#LLL0??/b''':Μ9CLL̆wuuuaXlttt022###G?"((RdttAL& l޼TLOOIoo/ƏcP&غu+磳S𪮭rHLLDRld2100"Z-۷o'::A(,,>OܐJ(JR)>'TVVD"A.#J~:xP*,//300@vv6:l:4 gΜ!99Ul6VWWqcX 99 "##ٽ{7fH^^M☟q|>555,.."ˑd<44z?SSSioo1 t:!:ݴvhp\477c2z}ygffBA[[x^ʕ+H$!_V8B{d22 Gpp0!!!TTT܌xnn.ddd}hfUXX999DDD{nasKpp0LNN Brr2Ǐg۶mw<'( Μ9ömۄc D?6JKKl$ ?6q~iBBBH$X,f&nppѻEDDDDDDDD<N~~>yyydddP\\Lrr2F Ojj*STTY\\(q#++|!u}?'-ɴ˩`@"000hDV q:3::D"ARKaa޺u+R^R)Gm!!!XVbccaXd<.gee0۷EfggbG?Q$%%mo; FCLL ZшNCӑ``ӦMl6YYY#::HTT. IOOGRa6ٻw/nEF{ĻAG EEEnxLjf*Λf||;w i > ! zGjj*f^Odd$c0݉-IDATlS cbbbuu;MLL 111)J"##IHH 44y233h4CHHBZ4 Eؼy3AAA,,,cNh4LLL̆MEdǎzbcc && ?554l۶ @~~>nyVIJJbjj Kbb"QQQBdeeJ%xr`~3yע7@"IRR!˙%<<z~=y@ tnpۇC"t_ J|dÅwNaa0jy[qֵ}Gs"""""""""C"lt@NS00ߋnZcԄ[59fA7 |>v6vGwNϭR|_\.l|>VVVr2'"""""""""/$ v%{`|>[!R.Jo9 qzDFF>PT*ש;WiDDDDDDDDDުUu!rOˇk<;F*|w 3|X,N}z<۾[sp85ba{oݮwS$Z+ܭyr\|ޟ`6( U?/Áb| r"""""""w;VqjL&v իzꨪbdd&''|2&`d2/^Ntt48q[ajJ6jjjX]]h4DYYDGGc6JVj„Vr°\x6a illvillJZ$TF#p8 \~VT*&L&z RroAoo/2aVKpp0===TWW d2 =zTbv+++9rMu;oWTTjRX~{D__nX_|;Wq7p7oի] fQUUFaxxxȑ#ml뫸 100 fimmh4T*iooٌ`Ƹa}|>*++ iPss3dff7Ayy9QQQtvv2==^c٨$((Httt(0 Q%gΜҥK4uuu`۩/HJJҥK bѣp%fff6(k>~iD^/̩0QQQ˜Z,ikktt fgg1 LLLPYYQQQ3$v;eee455ՅN#$$ǟ'شi\zF#\FFF 2׮]CV̱chhh聥JKKy VWW)//ʕ+f())ڵkfzzz()) 9JJJhnn񰸸(o83<D}}=faffNgg'}}} 1??OCCkkkº,455199bazzv;555g%Ξ=$=zv]P#y7inn6r8wc~~Çxr9:u P2""FÙ3gy{l6SRRB{{;r8}4k\.{9v;EEEw5 CDDDDDȻ#ۇ墫 T"---޽BA?Oӌ200@dd$x^RSS fDxx8j_!99<|1w\J*r!QQQ8p7x'BwuuގD"a ̰e|>AAA(JJݻ'xYjjj{<JKKqݘL&IJJСCTUUP(hZDv%l̠ٺu+OfiiBjkkͽv)))a߾}s477ÇO~BWW$''#[rr2\zyAcyTVVAbb"DrF#ϟ'//CvvE_YY`_===DEEp8@R111A__wmqwtt`XPtttv6mmuJRzzzx7(,,dtt_|^vڅlѣe||±cWoAbb"X, ߰i ߷oyyDŽkB ҥKyfn7333ԧ8O,/2111tttWf3j|d2Gq! $$O|RWWGMM zBH$ӧ dӦM׿N{{;z^"22˗/LFGG߿'O@`` ׾5PT߿Dɓ'fQWWǓO>Ɂ455!H`rrSOEkk+ Pq8PXXeP|>BBBxGiiijDVVse[n133L&D>O2yOR믿``Ϟ=\<'s6W_}L߯ ܹs| _…z?~4'|'OUUUl۶!sƲg#..$iii7V?Ozz:LLLxx饗8z(VLFFF033 x<XYY,.\@jj* bccIKKAb9~8I|OOHRjkk200 hh$$$O@\Ύ;eyyر@h4־fW^!##-[˅ H$tww6|>FK]][nܹs\.'55/i&Y\\$11ǃ^'..AEcꫯrǦM7AHH픖022!޺-..rid2###LNNя~Tܑd6#H!55TRRRjT*III!%%  "lphZr .ORZf׮]DGG FX~~755nJJJ`zzhhmm!Oz=x^$55۷/~T*^/ jz4tttDJ<#T*, 6 ˗fee(vڵ!lvIJJbnnz377իW] TJff&sssƹs稯fP(H$|>EՒΝ;1 TUUrCA1Ebb"AAA455DWW̠R BFee%d2a=~_kEjqEtww:488Hkk+<3455队GՒ)x^m??+? b޽ד񐑑Akk+ 9vklldhhm۶ kkkrjjjCղw^v.z d߾}x^, V0T*lh?W#GPTTNp8P!qW^A&@& 牋7duupFGGٱcBMM /_&..Z-C*}Ajkkٺu+:4vލRD.t:$==*yh6r _4662455111P(p8x!VӧO sssBȈ2::,EEE?gFd%i^C*@\""""""w,f#**J䐕EVV[l!>>x8p`,--}vX,LMMχ>!!\O.SO jl60xKB5Ӊ`@*233CRR!!!n( Mnn.dggSTTB`|| z)j5RT{poZ?Rdppj5ddd033Cff&wfeeJll,^(<䓨T*n7iiioR^'>>8"##1 ¸P('55%, qqqhZBBBh4T*r9Kއ?abcc0FƒB~~_^'&&xaD )DDDMxx{Z"qAAA$''CNNEEEd2&'' 橧"!!L(,,$55jvINNt",, DB ,,]ĭ199Ivv6v"++Ed2)))!Ylڴ%$ dggDbb"7o0n 4 >(4a ""$z=kkkܹRl&..xF#"qjAѐ2ݎB`۶mT*1 \.'22R0>>NJJ >p{mڴ%55*D IRڧ "33ShwZZJV֭[%,,lCL&#**;v^46mDNNpT\.:t^Ott4͛q:رCPMLL VUvt:r@턇$00Pjx<3dvvTy\.P,'11|½a=i pP(:$$,"##Z|&44r9b8HdiiIpYvmWr~-tMݟn:v^z;wL_:SSS¦σr w¹sb]7of˖-inbSS8p` c@@N5l6{~+\.n[}r/!""""""DFGG'Y]]ETސ{"qgC~n zw,Hp:HR!~Kӟ4JTz~џrl@n"Hسg[' }KsNjj*[MY_J?{YMx"فn yuN28sݎ!ۿPޏc#H_tbX:~J$!_ڬ ȢW$ g˿f$|sY _%""vnK$dD"!W?7Az%}NE-l NCZfot}[H?Hl6X9&x^˹E8·2BJσvu;Vq2fgg1( \.%%%qgg)k0ʕ+ (OҥK,,,T*PnSVVFKK  __ͼraqqsαD||<+++L`` :ׯ rY'Npu<:*jkkx|͛7s%AFoLFSS파`Zv &IDnlld``Ccc#& ^O[[o"$$k׮Mxx={i{/7PTbY\\իpilB`` ^gϲuV^z%bccikknJ`` LOO{n@k_~ׯ/Hܵ~7ЗHVVV(//gjj DBUUv5 SSSTTT0??hdnnJZvjjjdnnZZZr!P*1<< Rq:0>>`_… $$$P(_3>NKKM캻ٱcO>$SSS,//`HR'hwލRa49t OQQ†@ww7lٲGHH*J0Z4 $++v)//giiVQٳG(@xx8l6BCCe֭B1%Z-YYYb6jzo0F<ӟի9sʉ'0L455qU_gxx^xJ%x᧧9~8JP"""8u+>墪J=`vv*ګaϞ=V{2###jM={Rldee beee,.. k/j+WƑ#GX^^RQQA]]HR?1;;˙3gx9|0/,--W6mB"PXXHtt0~/f.]Dii) DEEQSSd_F&QRRիW7?^' .^Hpp0Ǐ/z)--eddF?<555`4y' fttThѣGY[[cnnEee%\.=JYYh4o068\.^~etv>J._$B"wf킾ȟ1v;*޽'O277$&iE&WWxQ\\T*p'** \lW^\jDGGfyyoNDDɓR|<<\|Yh#>>[ m۶ )dddp!l6fH||<šV9tN'O N:vر!izzuVP*L&b`8pEEE7<׆G!55BAff&[lv |l fNL&<|>o٘СCܹSHl6P(HLL$))FfggoͷZLOO t:IOO_hpRae;Fjj*;vxЗC)//' oN^^sf_duujjjx"sssŋimm%66\Z-ϟG"ܴj{AAƒ;44;/~Ass3RYf3A__?яcSxLj^())nYZZjJuu5###<#P[[KBBSWW@Ph^줧\N\\J={\."d2\.߰)̤3g0??sv˴QTTV%..m۶ R\+ŋj&&&P*d2^/nDBOO^Z-FQ!QVV^˗/377BR6.x@TUUaP(SXXZ&33[˕+Whjji!+L&2vJTΟ?Oii)VU, =ɡ 022¶m !))iCX=@PPEU( 665g>ɓ'ofӦMsILLԩS- \2W.oYyD"=%% N:e2,H$BjhD׳uV>,H̙3477!lHQRRBkk+>D\.Ҏr9./---½xv޽{ڵkm~N8ʢ7|FN֭G"Jt:pdee  11grUrrr6̱vN:E]] k&==)Μ9Cgg'n&N8#;;Nyy9µoY\\䥗^rZ&112p8 ۷@TTA4 B*LHHܹs\rUfgg9{,Mcc#B귿-UUU( e+"""""P YZZ%`fggox0F2 ===/ƒ%]ѐJbhhA2kn6, S:??J[T*p\ ^/"m2ڊT*%//R)3??OHHB(͛/--hزe L&!saaVn7$$$ @~~> 100@DD6mB&1??ZFR100@\\HRBCC 88Add$ LLLwVVVHIIbՅT*'$x{{{YZZ"55UXe֚z!e222evv5a200@BBiii|>aDB?rRSS ::Z+ z/\.0 LLLk(77*))),//QQQ8NۑH$z1L( t:qt:nllLHXYY! K`` ---BT׾5f3qqq200 DEEqu„F!"G"Յb!11aJ%ZZMWW!!!lڴ)DRmbnؕ륧I222 R͛GP$))) 阝%!!d2Z1n)622"0'>>!z=$&&8|@WWN@әdbb|&&&'::,$ 333<3޽HrrrGc@Tb0n:nzVVV5j7GDD066L&#::'Fedd餵N~~?8B4@ll,^)evvwƳX,455P(GV3;;j%11qgWWWikkCR BWxx8KKKRUU?,lJRgcgg'}}}BLL @rr; /* !) @6oތj "## `B{{;>4~ӟr!t:yyyl6hZRSSoh磾^ شiӆꬽUJ~ tG~qtMoߊ'OdqqB׸_:~A b̙3wc``V+Їξ.//syVWWH$lݺ9Äĉ'>ӧ?Pg'&&(--_>߉k׮Q__Rd߾}455 Rx<|uu56G}A7 H$F{1!jr/GDDDDD]3-Mw͆n',,쎋I$@V?E~ _x_PI$ gGq}?GnhݬouŕJPxlx<ÆnR޳x}Ynzx l6V&''PzihhLNNsa_'00ׯsEFGGvsEjkkQ*jJJJMGG'ODRA{{;NڵkLOOD"bBi(*Ͽsq/YXXרa&&&ޱj7e0444j c{^V]wVwl޼]s%nnNp춶6Ν;>rJKKQ*8qB+WfqIt:===TTTЁN>Ο?Occ#AAAT*?… LOOoN[?gϞettxJJJ&99xkm?k׮!n:Nccc={n"##oxx<;Foo/UWabbB]?Wkttt\n^|EtnEmm-rʚ""""""^M߹2)w5ljIZZ׮]t:y8wIII={(󉎎1vM\\jFjڵk͸\. đ#GHNNfppPPԕJ% |M YXX h^|EBBB0訐^5<<{ qݨT*V+8jjj0L\."##ꢴB[[ǎ#""\Nc~~9ommd2 ݎlfqqxKnaa4]]]$''!.hmmtr5f3 Dtt4===LMMIkk+q5z a~HDD֢V6N'555moȪjjjj`ddn)++rׯ_'**J,8'""""N w qߺu۷B:( p%fggrqeQդž={n3Ŏ; E"sN $88Nǖ-[OsTT<:J%$'' WGGVbZ-SWWGHHw&66V!<UUU,//Dww7*m۶# Y]]Ec47x6V+**]]]7p300BܹssիWp###d29Bww7.\ !!^ʕ+W W^a~~9|Mhll^lضm;w$((Vcpp֭[! wBqq1+** Lss3aaa vލ` ((p0ի;v .PRRBGGGESSSCmm-gϞeii89r`h={ȉ'0LJoo/ ;wN^//2mmm477t:tKpe7󴷷z9z(/~ f3\pFëʵkx7HLLD؈dbmm .T*!992dB9u_`0PQQAkk+` --k: RQQkƹs(--ĿgffHHHl6sQfff.--oV %44xbcc9}4 DEEq477sI&''IKKCIjjpk8p8FFFXZZg?ϟGբIJJ"66∌$99H(Jbcc\.>d_f~~ya3oaa6ah4 &&K[[oTj%** JEcc#Bhh(/2ٳq:>pZ-SWWGwwM|aaɅ 53;;+W\ɓ9sR&''oѮh4Ο?/\333={1;FPPϟ5Ν;xzҨ j5?Ohh(gΜa~~^D"*^~eJKKɓ'7ߤǏ Q}/MADDDDDnG%33;vp)&''Á k/EPPUUŮ]ώ;8)HX\\lٲ $ ׮]cϞ=={fff(,,GaaaN^^)))H$jkkIII!22ZT*H__d2\Q<h4ؼyq?l;vGOOM6a6X, r)/o_#|>222nz|5TWWba``H<w&))QZ-[l`0^]va6jܹS= ^XXjh׋e~~ao-|?88HBBB0L322$DDD066Vej7yHV+HDEE{nZZZ4"##蠯O DacN9""Ӊdh4bٽ{7iii̖-[0LOOۅ{F q51F(,,`0>::ʶm%66N?rǃv@^^Ft` >>^OBB l6ikki> ^xJ('Oܹsay駅P*++b߾}tttPVV&Dee%. q8( fffvttt H C"p ތ nwll,_8qDGG3;;ݻ&'',&۷{nCnn.aaa8Nv1 t:݆9_߷hVVV'$$NTT jJum6N8Aff&AAA]P oz>NhhMJdff"ikkn !h<JVe,//ߏV%++EM~UggЇ#!o~~^#**Jd,--.j2vݬ DGGc2X^^&55 !200< --hŽ}>SSSF /7>>``nnNwEnGoo"^XXOUD bccA׳4.]СCdff )zXXX֥;RHNNfee>J%?00 |_&P( Rc#<<4fgg"**8z{{9p8ddd0::,F8n7%H1(sͧ[Mp½l.v$")dRb)#'4frwd.?%NۑbI`A# @@4w.؊?O"JDR> py>< 8Z-<ÿ4ƈ&::Goo/6}6r(CXR q:LLLPTT$Ν; fR)@( N8HKKc~~TJTT~ڋܾ}[xx^zzzp:b0r s233hdllLhhwW?IKK#++ n[xۣh())"BEEEB!zzzg|.338z||d~?r G||>&79! ]u\ϓx<n7YYYLLLQTB!RPo@R177GZZ>bULMM ZLbzzFCbb"BqdƄC$|݋fCPa>@_rmr6пi:aI{<^+4菋TuɩS((( ]#Hh4ٳDžܹsX,Bl޼7EDln޼IKK P(^|G[G^TT?5nܸ B X""""""M|ixE"zя+HXXX@TVRDjdù_$«[BاV(T }ACzy& \.b _BT*?*_~ =6|]H$LOO#J?.ЅE~$ tW7pA;ߏ}yH$_h}ᢈO=~sc? 'A ωo?ˣv}e엧EDDDDDʄmq{ KIqB p'U$}! >džDqNDDDDDDDDDv>LX/Űlb%Gj>pA*\.!}`9^ۿ?H$\.~9{,###T*YZZP(DRR׮]̙3,--a49s ܹsl9x DEE8<ոnӅp}oo/'OSKe ;w)2220L;N*++r ȹsFRP(oMVV#o;vKKK_~q._̍7A᪽-YXZZB"Rhii̙3 444 JjTVVR[[#--v>Z&))v=J}}=XD@^O]]󤧧SWWG(b'AnPQhmmO+Wq/o?>>N__P`0z}ݍbyBz'Np5"""ɓ\pɓBuRaG+A"""7ǃL&CVf x#⣏>gt/]Dzz:ׯ'99zfggyb``ϳ{n=JII Z.j >lܸ3BPbťKP*FFGGgr!J=z 6 %!!,gϞ5kt:^ 77Tiii>|8=qof͚5V?͛7#HͶmhkk --Nؼy3/_RN(CC׬YCVV2C.366Fll,7otasssɓLLLJ(ٳܸqx.]B=ի/ HXniiiDDD^\.u_^:T* 1g@ FGGCuu5555DFF~z!: |455@KK`YFVT$$$P[[<$$$PTT$LC&jdzzVj~\.::K.Hyy9ׯ_TUU1??OLL P\t&bbb8pioog``bƈRH$ RWd/,y())!77DBBBSWW'l_^Ьh4dff#DAzg׮]ugg'MMM iiip%d2RARR###~룥+Vp p\?~\daaONNPAnn.gΜOCCuuu=zt ^6XXXʕ+~d2MMMϑ#GBrY!>>ӧOC^^TWWt:)((˂qT|d2QSSсVZY~=$&&b z="''.^J}}JEEOǦMzZMNN}}}>TJii) 1ͼkBu:Va֬Yn3M\\< l6z{{9w'|Xww72133Cjj*eeeFr?Ooo0 lܸLV+.Xz5 c6 BűctoF"PVVFFF "6n܈Zfbb1L&CYY+WD*"J*@@1f3V088b˔J%VÁB ..xz=VL>R|_6eeeRUUŚ5kbp8HIIarr4V\IJJ QQQ$%%!J _4Z5kZV/L[[o:_5`7o"Hxϝ;w2҈"""""""""wP׿5׮]l6300={سgDGGrJ$ o&>lطo333r Ǖ+W(**"&&T29gΜx<:;;c`ܺuiDZZ\p.}6륫 ō7y&LOOlܸXСC;v\<Oba``Jmm-CCC޽(**" qEz{{t@hq:DEE155ŕ+Wv"""| Bj(bŊP(h_ӌfgaxx"ʨX(kh?immeǎ( '""\gtt"jkky뭷tvvb۩`~~_Wb2~b7 ,,,O||<!4 &f'---466288@KK 6lx`XzQQfg299L&C.Ȗ-[G*P(ZZZhooRD"aݨjt:yyy,,,Rp:t:bbb O*&'''b RSS藈qG J\N^^]9Αڵ L^'77R)H3#+z*¿mذ˗/ -$$$Gss3֭c˖-ǣT*gƍrAIHH90d2 %K?泥Ξ=˾}dggSWW|KuEDDDDDDDHVJH$f(**b``BB^bA*bxX,$&&b4cll VKNNb6III!99O8&&&>fggfj5P>ٌJ"p8yu\B\.tRSSkdb||\`vvxFGGY\\$ H>+ Z$ Abb"CCCl6222P jAA ABB Pi955fCP"B!IOOf ER#T|>, IIIl6|>|>p:ddd`0Et8>>0 <[222B(Bӡq8$$$0==4111w#Vx_EGmT*_9y<{Ar/z_ q͟O"vc0jTx^qNDDDDDDDDDU|>ӱ.DPϽcZq:O+uL&<} d_N ivA}9KKK/Ʉ~C""""""""""T!+IHH HOOGVrx BP[[ɓ'deeq1N>M?999twwNTTZӧOs%$ p}WWGr\DDDK8s dee177$L&;F]]PT9x B蹹9~mRSSq8[\xE233jXjHZ-ǎ"J% `ۍV}kDIIɧ~ʕ+tuuW&ÇЀD"!>>rΟ?0999 rQnݺ%h͋<^ ,xd)<@w:܌墰:N8Arr2K/QYYIZZdffeRRRhhhbϓKss37odϞ=3gp%֬Y墱^z|rss9|0pQܹ#hDk4.]bH$y^x;w055͛x"lٲGÙ3gxW9w$'' H$444ύ7X, H %%fT*311A||<&YN>ͭ[HJJb``*L&111>}B \|uq-A+W }l`p8͛,,,Hoo/[nĉIVVV͛7J\(  @pW^۔p)ٰa$%%ddd|aC}ٳgB*rۉgvvSNGFF}}}>}D ܼyJfgg1p9x^|>PVR)ìYjjkk $''ux1::ӧ%))vv; CCC<b؈#22/騮J^˗/ Tfgg`rrHmm-׮]tP(0L,,,FCll,ǏgڵTTTPRR뉋C*Rhoogzz=\""""""""_{@hʕ+' ر\Y(**bzzÇ3<ǃcii Rɫ__Mkk+֭ٱc]R]Jzvsxs3338p]vbŊ B444pM~TVV2::J{{;ׯ_'>>7ޠEzzz>~t:;w6ׯ_ /Dbarr{}}ضm999\~JEQQ{x V+7r-RRRx/dGG/_?]kqR)s9f$V\IJJPq׮] 288@BBk֬!==d2gbbyr9FݻwKee%]]]HRHNNFPPXXHII j1LF @"JrB~_XXVa]-?%z3??F!--$N'`T$ r\^k׮ebbsQVVlfaaEnn.fdrrr'22ApժU`2dDEE!JdRP(D}}=o_G}B./kFooXi^DDDDDDD+CCс`@PRRBff&fvŭ[~:@;wR[[K]]ڵ*++,0L}vR]!'OäJ8[.4 >L{{` ?`TNEE44īJEE:qmIHH`qqٴiB."Z<QF.^Ȯ]hii᭷"%%EH;w~_# {C|MFVRp H0?FR 59qdeeǙ3g())+4?Rhkkcffv6o7n$22JyذacccDDDG(X>66aժUH$jbZl6fl6F_\\Lss3ׯ (JJJgppPʢ1l6+V`ffg}i4 III FvDD>Add$455^bt:`ii222~Зk4hiiψfffVKZZEEE455188H @p5p8155Ů] P(`"@RSSHHH`iiDΝ;GCCV;wŋiooKãKVJH$fXr%l6 iiiaT*Eӱ IDAT$ &''YXX ..$wH(btt@ pW.nXf-..Yƒl6Vh4 t: BB0`^gbbBfd2 aB1%Bdd$@qR)FD^LFVVNJFall /xh,\.hZ:11!=..Q`bbNzz`Ęf4 jł^gqqQ8p80;;KRRR <B4D8]P q:211e26~w zRRRX,055n' &?yz1aS8T x^ YYYl6!<;r077`j(bzzZGɄ@PnR&''ILLp+~R#|X, z~?\.RRR΢IMMr1>>F!&&Fj3LDGG%""^Fabb@(|rd2a2r9r\5ONNfiih|>. LF! 266FJJo]d2 fcqqtB333GBB9jt%H8ŋ9<ܹsÇKvv6]]]8p*ܹÚ5k\wV{ט$%%'55/e>'NH]]wbF?AN:EBB`^RSS9I||'V+SUU_h d *_2kfffIvonn>: |ᇜ?a7f)""""""""xfǡCr * 0?`deeqrrrظq#'OrMvMzz:nݢ^{?tϟ?D"Çww(= ٬Z{ׯyf ikk# T*ٺu+.?իWGmm-333X˥K׬V+Hnn.RR֯_/~ V\)eJg} .Iaa!\.v >2+WR__=999O{?T8~`ZVv͡C(..^cpp?P(đ#GxihhܹspaWR"xl6sɓ'h4ˏyivΟ?dg܌^w~wA}˗/300fҥKܹFcaa@ ݻt={Fii)匏sNN'N&''Ynyyy:u RJ⥗^555(JكvsI!_d||r Z;w2Cܸqxvɕ+WXz5deev>`aa|;_aJ]]dddpy֭[ǵkװX,lڴ.^eeeTWW399T*%L||\ercŊ$$$033Cii֭[,,,ťK%--"z9)V\Iii)N;&H(,,D& ,!o8::f3DFFb4K/DGG>O.YYYׇ[j*j\|; BSXXHzz:999HRIJJ"33S0JRSSIOO&E* L&6 LƪU̘֚L&φ (++ 233jrq-lقZ_gzzal;::$;;{,..ONN B!|>@@82w}X,RRRC˗/&I0hR OP(N#;;Dv;tFRB@"H\\YYYd2N')))Ft:}Rk;w$;;ӧO'111deel&AzzG sssv$<999$&&ND"!""R^R5k055ٳgYn6 ݎ磸N\\R &!!"##)((@zIʥ%~?`/244}4 Z*"""""""""_]tuuT*h4_v;)))ڵ۷oHDD;vҥK\t ݻ1477smrssyhkkhvڅ\.+]RQ]]ͭ[(++asr9R֭[t:a0p\FZ[[9}4&\6nHVV333]ǏBnn.YYY?qAJJ ׮]#`4z*lj'E"XV֭[ȑ#^̖-[(.. RSSٳgJRL&֭[377R$99;waڵ6mbzz72884%6oLkk+<, r\0j,Aկ~Ekk+jZ`9j5[lBكT*a w0 TVVRVVFffpÁNCp e444+Vrt:} HG*2<HMM}mp8`6)((Ν;_ t:zWr-!JEPP\\rt222TRvq\j233;(JL&LMM1::h/I8]V3<<͛7?SbbbF&իiii@ `|>׮]cnn1rrr$22203::ʏcbccl$''sjkkq:ٳGeObbWr|xtjja+WdzzI0$!!|l=N9jL&v;XB& Mrr2 EILL½]..8Bsssyf  LNN jt:(JRRRZBybbY\\\DVrRRqAxSSSq( j5333~JBꈈRSSx<΢hHLLt2;;K(Bc0F"L&cnnIRR0~fYt/,,cUTp8  "b||.~z=~9X,^/X,N'#{Np8A1 rHHH@ RH< BVN'lP(4IIIHRP(vZ-KKKDFFH$a(>"A"xuJ%Z`0L&!Jx<7UT r͆fCP!22@ E ;|_DLL `N'Dk.8 v`04Ch4DFFp8n/ccc\r"vM0D077'C* ajT,28\.aI.~L&Ptp8HLL$ 1??9NczzZxv̠j蓊عn ( RRR0Tp8t"^ o<ccc^111wE>@,7п o OfqN'[n o}Xn?.5П蟕!녓s_Q@ Rd׮]]]]466b0سgsn7.]d2 (**bƍOt~5EDDDDDDDD|)zg4X% KKKx^YW"UT p\DFFF>B'i!RQiy_g0mG9""">~_x8Q =*a)/b ˉmC. ǿx<$cpȸBxt\'d✈R\yu  3PH(w? ?54|kA]]?q,}=|Oj|*C& B '6I>v> ~vy. zT*)))/>޺u_.ve;͛71,--R__`0ci6ϧ7|RIFFׯ_TVVǺuH$}yo~bbb(//gbbB?Ndd䗞\fmyV+gϞ%33ݎd1*}ll,`ufԩSdff2??⢠ uu^.677gnnXΝ;GffOV}TK@"pHHHߖ/ rbccZG(ۋ\.… dee kj9 """""""MQdjd2֯_ύ7X/rRSSQ(>}?ZZZfPQQAGG[lFVK}}=7o^ Wfʖ-[> ,7#""ظq#uuud2ztuu}vBiiideeq!6nH\\$$$㡢7ofhkk6+WDPG!??X46m"''G0ٴiR>W_}۷oPPP@ii)###GNqq1GhRk׮ICCb4APpQ^Njo>%>>!f3^cǎF||<?~JLL .\`ƍT*p֭Z-ׯڵk~&XnKRAbr^דի9tW&99R)+W$>>u1>>Zf͚5/--q1\BOO֭.JKK###C8Xnߺu277ԩStttT*iii!++FA,Lww7rIl6 ;7??% P(x._"""zT*<իWI?۷o399IvvSKYnǟɟ(o&`ZMEE׮]#::EgϞ4a8|0F_ɓ'"==s-ۉ壏>T&''9q0555}TJFFC )4W~H$!٨T*RSS@דt:W\k׮HTTkF__6&~@TTn`0H\\[n[===wH$L&Hnn.of~~?2֭[Vb`zhZ]FCCo:~|>N'ZJ%׮][ !)))x< v;jp8 ֮]T*%77T*"""(**BV322ٳgOjm355ٶmܼy~2==lʕ+P޸טy&z^0t:&%%h!gevvnAF0|GA&-'&&b0~N}'~yFA*>0aBUUfshN8z;,Jϟٟ˗/3::RDJss3@FFzJR@DBJJ ݎ^'==% l6(}Zw]8q\|RFGGZN GFFMjj0"""""""""CC_C0DѰuVV^h4sO]]:;vpyΟ?n^ 33&:;;Yj+VB^~)Μ9Cdd$'64d2_&''x<裏}2V‚Jfgge0??φ >|VZEzz:J(nFSS@cÆ dgg }177G__lܸK.qU UVLSS//DFF>::(/S[[=֭[[8N'Vbhh[bXXXXiBٸn"##INN&/&$$p9yws@Nj |^׿8Z!11Nƈ#55r1r)1$$$PUU3]0lܸ)ʈݻw mmmx>͆ 66V0ӉR$0??T*r-brayX:>><* fp B m S(fAfpVqd2d2Fn'**J|h4{j|h!y~~6كf ׈p"nP(DLLc[XX@"뙟r F1??111d2, >LF|| Fh4BP(4IIIHRv;KKKDDDJjZ`t:n7%r|>, IIIBZ& 2??vphܓP(t\.zP(L&Kt k=\ aۍnG!PTXV^/B! .NEd2,kOtt6 LBpFC a჋`0b!O b5-N'G(B. RX,B! gj`0RkY E4 ^DZrp: {G#J@"xq""""""""cccwY[fCP05П$ /rrI _菋{ r299ɕ+W|H$vAZZSiבȣYV׋l~{(vǃ~ڄu~TN'|/'l6?5p8>>U* `3@@X""""""""""NBsk}XJ_Ju_,םoj%\qpqp1>}*~9RT$ ?06i耐Ep\ToKBV}/<9PHKz8]AZ8'"""""""""dn' .qM~߇OEr9RT(6nD"! dB1½)JP~sPHOذBe=DB   "j[ ;@\\.'?k#܆,/8.R.uonc_0Ν;?7}ll F\{}Buy}suX\#HI ,T_N;AR)VE]^~քe1;;'55|5y>Ir9BoXp8w| "W(A?}Yɓa4baaڽǎɓLMMQPP{ٳg"77WǮS]] 77W'зrAAwHR-s>y$O\/~k׮tlp|Mcddd$''E[n 96ϝ;ǩSq`ŋ9vׯ_'==o~\f#&&Cq(,,(JxYn߾ƍH$8Z0@X(+WVKtt2k Gx^?bĉdeerXXX1| "܎ZXXѣdee j\g\|9 ˬ//ttt000@^^*J8[ZYj{(|q茶<4WF +\xМLNN E"w~Tʍ7hiik7""""""""JX,22RP vT}hزe v8}}}gtt08|0%%%f=JQQ w755NMM VNB\x\Nyy9W^EVcZywcnn8z{{X,\.=Jkk+111tvvrav;jnh4\puQ__O||^Br;(_{ufV+o6===˕+W֭[$''zjV+Z ͛"<A9|0QQQ~?1 ݴRWWGbbpeΜ94>8s 444ZTTT044DRR͜={ݎD"ʕ+111Aaa{.""""""pT*dA!8 xh? *--M-..͛0XRSSbuV$ ^n7ccc;v JEBBof NHH ""i0$ fBDDD 8t:^O||>lZ-===]J%555<+Vxb"55U^DFFFHIInoo/c0w8aiimvX߸qT* Bdzi&Ο?p/Y|>ַp%%% gnnL& BڵkwappPмbnn{Bjj*)))撙Iee%*R~w~(ϟ'11o}[>}iv;/2o߾M_$ n7ĉX,fggyW:^y222R|2?яHMMݻwNee%DGGcIKKc˖-<쳔P(j8q\jjjطoc6l||ގ^gŊzikk:tRTT/吝lݺ^w]:;;*"""""""y>88ȁسgyyy477KMM uuumvEt:< :IIIѺn:^|EDZZ;v^{zY, |l߾;wm;ƫhq fff?#>|իWihh@kꫯ222fk׮ojq8Aشi=B}8d2166Ə~#bvv͛7SZZJTTsssxt"^¡T*]ƞ={8u|>P(hLp,--(dee!H'??ž}0 Kr233Q*S^^/LNN[###|Gܹ"nܸA~~>?я`nn/~C[[111Z!**Xt:.uVV+nB"t:i/2 j5>^Odd?lw >Ή\.PAP Jy͌p9n7V@ L&"9^;T*}rxOP(DQQo{EPDll,jݎ\.'..􇥥%Z-ZVqtx<d2DGGzJB͊^gi,;wÞ={̤v֯_L&㭷BRa2%""ӧOsd2nsuPoL~3fffX\\$66Ͼ}CղoRl6ŵkרbzzvիq8l޼ǡChiiT~ӟ 鴴 ϧ>y222(//%V\"\.l˗innhllL~ӟ 0LF"## qW^("""祗^~R]]Mgg'[l!..MQQccclݺݎbqIbb"ռ 455qQT*6${2<8iiiB7nxWp^~ظq#&5k֐Hcc#vz_8}y `BJ%/_j*6|\͛ c6ٹs'####::B!7t@T*hZ^/[nebb>4 j2jkku6l !!ƪUcŊtǶ$C穫cbbQq8Zr6FFFΦh]Fkks%&''ٳg.K֭Κ5kra4%==իWG^^ rF#@&P*<3͡P(ظq# 뽡\v"##|Oaa!QQQO{JDDDDDDDD*w\~wjj,v%B:NrX*lXl6Z-JRNdd 7p8zp !r'`0J\/zfZMdd$x^BzT"qRk?:R |lEDD lHRz=PݎC"`0rN0$** Dj;zzT˅& )n[lB.\.l6hh4,--P(y WW*nj5RݎP*.µ%. V+aXehgI_ݎRDT *"""""""RIѺx<bbbt}$Yn$OOx,7Ogejjk׮ 2~<#K{r]DDDDDDDDDQ D% z\ϊD"nvq:OOpp8O9OuN'DXKP(d2=59@ \رC9 żDs">= !ˉzlνH$n7RT( j4'MXG^VV1~8uiCO>OcW}mrEDDDDDDDD"/e2PI΁@T>?m 7H"|RZ{Z7}J~"""krC ߏ|N%p88N!G9|p1pr) [ |=*>Oon[9 $ '\-L( nݎ@'!,ex"Lxmx<54v]]]BGapp@ vv$y w,U-̥n FwwPl{aaYLC?Ν} ~f#zz`0Aϰv errgm! KKKB;_~Z,ܹY>NSH 稹)xVB!۹rʧ>.\`pp !|p{M&ӗ26.]  Eo{ns(#>p&N|^_#?mqžuy|zܹsLOׯl&Y;{,`bHR2228x gΜattBy%77Wnhh=zZYbYkiiZ-)))C?~Jd2^֯_$B~~>.\%)))BACZZZjt:Ǒ#GذaJcǎ mLOOGHBB w}K.t:IOOٳ\x.PTBCt/7a@ ɓ' dffJx޻>6ʥR)NbddSWW@ff&Kٳg9s dff>V*N:ESS8Ny]l&66r._EEE\vg(Jikkȑ#9sn6o,TgjH$>}ǻ8pNGLL̗2k\bxg!Ν;GYYP;|?A:::hjjbw zgϞe~~4{G}``06%%LF[[---255%l=¡B2LN O~+=B|FFx.? waT*iii^ᴏp_+|Hoo/%%%ž^޶ߕ\rNjkkd2QPP D455q\^ r#f||8"""TUU1??O~~}l7ls=;Ckk+԰fc``^of~~Llق`࣏>bhh;v^g۶mS__K/tKaa!PVVC"m6ÿΝ;ٽ{7555Ayװg?c˖-tttrlN[uƍ^ZK/\.ĄryqV+7o&%%Z͋/O~<nsKYYeee?~Fz9?O)++c˖-H$Μ9î]X%==y 8|0*h_xˎ;P;vLzk׮e۶m |JJ r{~m+B(yXv-XV֭[ڵkyi +//t˷-V+lٲ/Yhoo ^z%~:GSSj^}Uv0Lyy9P 6pUh4LOOK||<>,/^dnn (//gjj\?Q*LNN266\.gӦMܺujz= ?.x322dժUl۶ f3YYY>*`X8vN۷ E.+000@[[IIIv4 xwhdll-[vZ:::c&""d2.G,[lOOhkk, V>t< zشi,,,PXXHjj*ǏgŊ>|뭷DPw^ 0<<̞={G(MAAd?f||N0 \vGLOO}v}Y:;;ݻ;woodddsv Ν;GQQ@<@۰a$$$VYv-UUU8ʰlXVvd?֭[\~^~eR)===i@ii)0o6 T*6occcx<^}U~߰w^{9۱lwARIff&67|S0w:(((`޽ddd 8y$EEESYYIff&uuuX]ܸqLΟ?OLL III$$$pi 377Gss38NJ%oܸqRw~?B[∉lٲBZ-7ndΝW͛:)--( V+߳zj6oLGGsi&''ٶm RQQ;(((@XVax^.^^gaaj*V\\.8q顲͛7cn޼)DpV+۷ |2Ѽddd$O>zsq^/:LFNNC -^۷o 8~B QQQ_IKK )4׮]#>>,<)))ڵ>~m~?tuu,O QN:B"webbTlLMMuVHII!99Fo!4R7RRRB__MMMLNNR[["sy&''xR\\̧~NCp9fgg駟fllxRSSQ*tvvR^^N#++ VK\\8NyH LYY {@dd$E||<AD瑑v@[?TlbbbصkBm266Iee%?y饗h4DDD(,4233+WxW())y`#g6J~~>< 6l 55"gKks'Tcz1??h$;;={@ff&c߾}$۷ogݺukAee%0obbⱍQ*?'++s3PRR… ">>C+ܜ0>p8N{9n޼)\ }wPTܹDZ1Y]]hllΝ;fp A ݲl n|eee_ _(߾}G3ϐAgg'\z V"aaaK/()))O233#N_xfff,m@l*:u_~Y΁\.~)k(5n[nA]]uuu3SO1552^j񐜜LYYL$}&q~󟓗ǭ[weϞ=hdvv˅^ Mr9* Ndd$:7oSOqrss"dnJ@t:E[x<طo2Tk^^˼sAr9qqq(Jzzz8~8/շ 1"77v˿K&''O?#= xJIb0h47rǎv:::dXVVWWZ߸F}Νر"_:JLL$..Zcb zÄT^yܹ#f̙3"~n`6zx>. ł%$$ .KAɌjINN&66Dd_SPpa"""]Hu RPTo)))3>>V$,,$HHH **J'r]޽ijP(ܹsJ^jݻ 144Ԕ0oii'? Z9«Jww7f?LƋ/(L=ZJKK Dr9j.^2X!X\5fҿTIJJ"&&N'|=lڴED%{ʭ[عs(W`[__177'ޟ^1P$"##k|j}|ƍܽ{Jo.R$$$ݎbr!IHH <<\.9Dbt:Jii)eee§?HOODEEa4⋤͛g쟉v~f#&&FI}Dii){err^Ovv6B2;;李;vjjj!\͛71155+Brr2N!Ç<̔J%锗aԮ*xz=={}vΞ=KGG $HǃB@c0/AaqqNٺu+!!!g$99ݻwsE.\3%ȠvIXXG,Q*k|/^HMMҍ b+ 9L&111x<>#޽VvT*%330deeq!6n܈fΝn=Jkk+;v !!7| iii 7' %%G %%%8q\ݻWKeeeܺuzlBvv6Ǐ Nǁtkm4yo8r]]]KQ]]Mww7#** M~~0s:ϳi&FGGYZZ"-- ߏ` ::j>LSSΝC.cZIJJx=P㿵I000}6$&&oe[^.^$$$$PWWۅ/- |У}6fn݊l$طoDEE>载P(ؽ{7aaaTTT0>>N\\6FFF())!..a7n$44zIHHXc0;;ˍ7 $( <6mBT @1IIId2yyy^eee455 w , yyy8Nr9֭cdd'xF#ZvM@Xhll`0NEE<ӬFtt4lذA֚fJJJ0 㙞f֭~zJKK)**"22i8lbE__*޽͛7 duȠ]vaX%44TyyyTTT}voKHHF jjjR__/9322df._,4h4e͑ƍˣ 6n|F҈1n ǎCTb2Ƞ7n`2AT >iaaOnn.jfǑDII deerhii!** RIxx8ZF#KZZ###EVVRZZJ^^:aٷorA>sFFFֶRSSٶmܸqBZ&))IOOOfrrxa"Ncll K/ٸq# #4Xfffx/(( 99aN'kfÆ dgg˨jǧ~$JGGwܡcl߾*++!==Ba׮]l߾y^JDDdii;wpa4 lڴ ömx'(//'<<<+Wp\<ЀNW_'Ol&##/؈dD*++3>>۷ٴi[, rvJ%6md2Þ={` jʙS 2"T^y館HD<|h5FL&6VRh44WlFneebbbDsIt#ϣjEp^R |\^r6ZV4F*L&JI:ve"e4 -ɢYSyt::N둴 BʻnE ,!]'iVWWQTk)2Lw^<.K @I#"Tz4. dt:E[JWz~ؔd VWWVRVVq(JeFD/CBBD[KORpUHHHvEB҆gzzZ9GFF*L&UR$a5 jpFҴIiʤҁԞώHcUFNE$4uRTfim\YYA.w<-T_)[w\IKx/iIcWZGt:ݚ{z^Ѯ. Z-"KR7nw^OkO *zQϙ3g/~Z^S>χDTT*8 $05>4Z(s8^va`?I][}*~Kk'A<ߤ-k:NIAhXZZb۶mrHĤqICC88W;8mwL&cKԟ5F`Gw jN|jQT"bVW."Qq,}GzF!$$DXޒL/uROCS%)]Z$ݎL&[-[q,(---\.v $H;٥%T*QQQk;H@ @q,@۬w](P[[+ZA"""رc"7yRIJ*A $H oD@_XX`qqEږpݸ}Uhxf>g$)~{H@E/ X|of1H A 䏝jWLg%pJAj0> }j\dB)<~[ ?D2?C }G  A $H kWI+E}HQv_ [}$|/vdj;H~*;3qؿo"(` $H AHY _(]n&g{pki)Y$@p`Zlr.--}>6MDד궴&%J cZE.Xomp[-..vEzy^EUל85ey>6l6n~@KKK,//?gR?<*߷4~ӚI}%,..!daa;ӣuttX0tvv~rprH,wi65!Yu8X[}>#u~eeE|arY'].'k2gΜΝ;~sv_Ғk333|̈9Nf3߉ ]]]_e+zI'#͖D>,/}xM}h28yXۗŻvJǫhllZd $H _JҥKя~DVVsss8r>`bb^uz-HOOW^rq1N'ڵ $/綴p N'Z~?gΜݻd2^u\.o6/,..kիW9w-[ x7IMMe˖-pIfffg?ɓR\)±)_ծM\[[KNNIIIn1h8uZAٱcǗ.]O~ǖ n<*G}8s &8~ȱcx9r055E\\<`.P\r_|8KQђˈB`zzW#"rKѧ%mv300@ooA8 ,crr 1Hj+WpaZʝ;w{.yyyna E\$0Z4F#/_&//OdW"k4V\8!!!={ErssyׄkLEE===|>~z9v2^{Ms\hZ=pp)P)\r\ή]HOOԩS,,,`;Ν; piJ%Q9t7o<ӄq9L&+++x<ֲe˖GFV$H A||aXCOO+++pFGGIII/%׮]#"">ؾ};iii8q!#<ٳbBCCd۶m>}<xwZlذ\IMM۷T*9s ?FRev4,--rq֯_08H\.l477ŋ|466"X\\lNGGӴa0?JCCfΝ شiW\!!!tvM{{;>om@AaܹsGh8|0UUUܹ6mɓ'Y~=̠P((**"));v011AJJ^m6,--{ʭ[ػwo66&4ʽB0LLLLtI/_L}]ZZZp:X,1pܽ{$ #sN]Ftt4V!)))!##SNg*++tdgg{nz{{YYYt޽{f߾}Q\\ɓ'ٶmYYYLLL󱱱رDxx86meUcϞ=Egg'wFՒdž 8y$999WRWW LOO͛7? x7DVJUU|>>cJ%:uFfggINNˤͮ]z*qqq Ozz:|P1сnrg׮]l߾۷os  6{4޽Kii)ܺu NG^^IIIdff ˅zmۆN("##jyfѣ$%%a0 )yb{`͖DHHZMhh(jz$%%H͉'8~8RN~~ʯ~+,--2FٶmG?b``yF#hZ~aٰl,..OS\\Ljj*\v F͛yioodeeq ٸqX+;;; %77jkkGnVvEll, bhh08u}!Ƞ5Fkk $H A|ɱcxgIII^ʍ7P*X,fggϡCejj4 ضmf~FFF|2LNN>I~߲qƇ _FΞ=/L||<؈x<|_|QK)\.tttPWWG}}=r{gL&˜={n~jYXXvFaa!eeexX]]L&&''/~A^^nbxxw}'|Rl&''ʕ+ܼy-m Cȑ#G8{,yyyl||H#Rrrr8x 2LzsX,~ߐ޽{d r9mmm|g⋏5}_OO1G!33N˿K&&&ɓJ%19HLL$))gd2BBBP(Tu~~˅d1 M۷w^._Lkk뚾J rr6n(̯Jɼ꫌矓KUU7oݻ|>E~l׋A&2HfqqqDEE=O OTT. J^^MMMp8!99YKK$~t:jy^:JO?MRRDFF299B !!j^kFTT* V >~^ϐOyIMM~344$4&W^yE0?O1 dddi1n;hW_%** RߚCҰ0… ( L%#?OTT8vׯ_?!3k۷z?'ZMXXRZZJqqxg(.. -{__G $H AiG}& ^)//GQXXȮ]LvɥKxHfdd&>ݻ#!!rr+WЀbee/]![P;m'0>>Zr d2F,eff,>̖-[ڵ ѣGb޽{z$==~?%%%<$$$駟ۋfKCC^'xw͛}6 OgIZ^Sy^|Ez{{j^ ==Zz{{9x QQQb677Ǯ]L&n0 KnܸÇiiiRKJJڵkNjD&Ilv-M܏=0fZMAAPTTDBB}~)222ʕ+FaDyy{&hnyf8FQh MhnnFѰo>`bbDN'LNNR\\LRRwc0:::L&IIIk|gggnSRRBAAOYn{M*/2 Z-ar\D]YJt:Q*"HTQm囟GӡD}'I*mJeC+܋2/mP^/*JmnnAE4a9*J\{%i},.."_3~>^*wY"H$+F# ʹTo%o2* $$$zqݢ~!!!5 R;H{<∉Y3Ǘ4kZg`M1z<L&kַa!p,HK\.rJ%Drr2)))]HZ',)G &]+~I} w-HOOhؼX"\ww7B|t1@ %9n߾Ϳ^/"Һ:~$ /n[たkޝS\\LLL .KxD̑F $H A>rp8?LR?n!V ڵܜhKܜR=m6FVj囚0͏po\K̼^/׮]G曖XXX+W]2??g}ƍ7~ژt:]]]_fVWW{<jkkbzioo‚x288{?H A #Ӭq]Fmm-033ÿwR)ܸq۷oSXX[oECC&,, "LOOz%&Ν;Gmm-ru} IƔJ%Oz233Y\\W===رI>3*~_$ݿJ%aaa|gIQQZ=44|@?ѣG9z(j>Cill$)).^Hmm-[o,_sKKKdggT*E>Ch4B{XB!$KnRDhÁrDyPFʥp8ߎ?$555bx"ׯ_ƍhi֮\Bee%7n >>e~(|KII  !77n:ݻw#D5)f2'N ==8Y,>3¨K022±cصk.K\x?ȃY Bnfn$ennZ˿aؕIIHH~ii %֭%wPK*!IUӧO`7Rƀ8uFBbyyYDCw:8-D⣏>byy$N皶+ l۶""""e֭;woc(,,$//H֭[Gss3۷o'$$/ϊ۶mc׮]Fl_}RPP뉏&\755NUU|>9<~Ǐڊaqqv3??`4ϟFCgg'| NGss3< vBSSSCYY/_&)),vMGG&P@gϞ= Bd2~jkkٽ{76l`ƍ>}R1L( HJJb팍EAApObw֭[tuuo߾(_|z0sMX:ٰaFX*++)**իJMM VP\4---k_V|M%==ׯSSSÝ;w̙3gdjjގV ѧ477۷kcW|X,1^/!!!={z^'N0>>NJJ UUU\rVϸy&]]]~BCCz*322VԩS8NYYYannՊNO?EPpQFFF^Z[[大2455144DJJ ?gill$--P1$$$IMM %b72??999rAqyz=r ~~, $$$011ӧ!11W255E}}=III@JEQQ? p5Ӊr A _h۷Y^^fx(,,duuBxx8pyܼyI4 >p^yN'oy <===<_A"""D&a5!Ihh([n`0FOO.M6=  c0O?%66F"QTh459FGGٶmۚd2:::PT9Ilx 3j?5g˖-l߾w8f2jl6IMMEPßٟyudžf#**'022BJJ ܼy˿Kbcc1͜8qVB KZ-Zfhh'O2>>Fy`=xZZO=W\auu0^B`ݺuhZ0L|>֭[ MMMR]]۶m'Yi z=~RRRĸlx^L&KKK8N@&~9B{{p?猏388套^' g}bHMM1, QQQ$''#9<>|Xhq:磺MCCfZd"##={k.jjjx?sbcch41_\\`0訨(bbb"އA $H_(777gsϑCCC\zZ4 f "--MF&++ba*~znCSE[o -ץ/K/ -vrl|>~ia~p8 sM^/7ndӦMby ܹ/J>dfflt:q8N癚7 ''x8p1>>0nrrrؾ}; 5ut 8rΝ#//Fʊ0U(DGG S۴4fffX^^F SO=LB;woIff&۷oj7oӼ =ѣGyꩧHKK|x &''1=zi~P(z%aԇNVWWIhtb4YYYbS2u|>~0 L#zט:Fy2339z(FH jzM| G2WX,\.fgg9w:ND{zd2gp{6mę3g}6tuuŭ[CדVVcIs[բR瞣X^^fÆ ߿7n܌BJBRVeuueunݢO<_*GѰ B(5cQ. 3gΠqd2~jyq8TTTPQQAXXO=bCyz=Ǐݻw~|Ыioo999_BBO>aqqIbbbx<?~_yE~?deeqM#33#Gm6T*wvsqzzz8x ;v twwPZZ͛7橧"..Ǐ344fcÆ ( ߿z9Ė-[{.ݻuqIjkkaϞ=j^`hhHl||I&''ygȠ~>,01ܹرcw>*pBCCôSWW*$''s [ aaak:?gbbɄZ>ɓ'|LLLIoo/ 7l%QVVFkk+QQQtttԔho@wZ-` ==*ٳ>Khhra),,dvvBd2\.rssc``uQPP*͑LMikkcjjl˙Ve4߷lŽ;`nnu166ƭ[b6mĖ-[ؼy3)))^5cinz=iii$%%166|FTJ^Op,~_Ka^H%}_TR}KH:)O '}?NRu::nMY%Mvg5Hu4ˁedL&FFFؼy~(5 |ַ ̃+}&_T' ߏh$!!aM) d2R}SH $~`=N h700A.), #\\.`?lY!11jy׌ M}>nbzzV~nݺ5Lu苐@&;pI,zi龏 Ku}}S`*]'kt}XGGg2_>111’BJg2ļ $H Aq0>>.J"**jJҦ~:OQ9M"ܯr߹Jw=V?]XW@fCy]hL[~mq֗nguuUdߓWAIQQ֭[ӦD.?я5ݿ]kWXƇ=?꾏zfh {5IC&( $H |ThX,lqvY]]E^턄;>U@'ɗh|՘A $H Axb;}=..efggx# )>v؁Jwޡ7oG?׮]ƍ J%`||"Ν;GUUH'4:ѣT*q"JfCTp8P*"F9WVV$$$d]ٌ@MFFce( p8Ÿv~;FNp&RnhZ, Of۶mx<q+E- ##XzLLLPQQAqq1.RPP@kk+TWWLhh(&ITtvvrQzzzX,seٺu+uuu\xߧ3H A  詩ڵ><?%ztvv770z2339v呟N RSSРİcoߦK7$J;wNGYY{nz=6l ++ .c%.. f38JJJ蠤)((`ӦM\xBoc"77233iiia턄PYY$<sA]ZZ◿%r\񷴴.r9nѣt:g׮]hZ)++ҥKΝ;DP|@=99]v144 *9Css3{s96l@aa! (J IHH`֭ SPP@nn.pO d2;000@GGOwETRYY3:::s_k_륱9VQJKKה.oKXX466b2HJJ8*++Y~=| Z[[ %%E(LIIaӦMܾ}[2>>Ncc#[n088 /ׯ_Ol6_k^J\\ׯh4BII 6Jꈊ G}ā(//GVcZٵk| o===ܽ{׳o>Ξ=˶m۾LA $Ho#]^Ν;~:,VV%44K/ĦMˆѣJNNgϞexxjZ&''СC_A (Jh~T*˗/g"##QՄ .Dtt4vt~zo~BRQQQA~~H#i,d|D30ՒZԩSFh4ܹs x "44FhdaaijjZۡr9333{ٳ͛73==Mss3!!!\v BASS;v?)bs /hxw̙3ܴFII `ddDXXXÇ޽{ Eڊa˖-mBzX,ڵ ZO&** VBҥKlܸ$a -{gg' 99; ͛7YZZbtt.bccq\>nݺcccX,6l@^^[nknCC999FRRFx'x饗jKb0XZZBӑQz466R\\L__ϟgzzUزeItt4KKKl6 v!$H A ?z(L&TWWsMz=w2??OLL QQQj%''TҰ$$$κuܹsz[+WQQ+Wx 압V+o& }q8l6aHOOv$77͆f㣏>bddg}R+++dggHrr26 ׋fXXX`ff??!33۷os-}/6ϣr#++T v}M~? zzzPTÇp @kbNcÆ <3d2ȯ~+rss)--;wg}KܼyǏs!'''??ajj {<<Z*7n'vqd-E, DEEK__111dee122 `Zbzz\  /I||<&I~ܹ0#ʕLXX.[l@:t8N癚BRFxx8Gak{ 1 B&Dgg';wpi<Xz=+++l6Q9Fh4&v9nyy7r4 ׯ',, F#eeehZ4 Jrr2ܹsō$H A2<=66ϳh`0pAvILL lݺY~=[lڵkTUUÑ#GǡCزe vپ}>ܾ}[=_EHL Of111A\\SNaXPTd2E෬,l6n:9¶m޽UN:ŝ;w8r?#ٰammmɓ'nSZZ*LU*qf3~[299IKK O>$[lAPUUEtt4ZヮT*lUUUOOuu5~_|%Ο?/嬬PSSæMسgaaaTUUs=Gss3@?V9 rزe Vٳg)))p8ܳw\|>rssrcq@d2jBqqq<p lBii)UUU\~pz) h4/Lll,###DEEQZZB ::ׯ?Off&sϑ] A $!_]fXMOt i mI['D{`tI U"ϣjF$}hd,3oj'gtKzT^QϾayTgÆ ;35 ?_/E/ENHHXӇ3* Be 墻[Xc[Ga?"+$ݿ?̼&~7)JE:X:~9Eeyn A $7PB*J/xh@a |J}a7h_0!KQ?ُ]s|Em_ƣEttBÞe{Aj/,H A $IF ex@@r~U=66%SLdzL&b Ɉ%7>>v1͏}y4` $H Ao)E=nC. ?G+)+:vзݖ]B ;Y; $H Aa"˿(qqqX,&&&X]]E ;Yi_^^f||RFavvq EP`6nf҆WfRXXX`rr׋^t211A׳& FCHHZjE=4j(333" FQd2155%OOO`@.cvc0D{:NQyEVWWb\.dTVV)$n޼%FՊN[KݿM(LLL{9gffh4( F#T*j5j5 2??ꪸ4vrUzMOO377'ƌdll .ƞ"'Np4kuu%Z-LNNLR:9ZHzz7"TFqfffEV,//>Y\\fqɯP( riT*UUUXViiiArY pq8i#uLVsPravv%z=|:httTÕFGGų^xo͑&&&3"##q8h4XYYy dSS+++ܹsV-jjj"h*"]իWIOO k NGp8x8X]]ի~-..2>>Gӱusff$!x.1<HY955bs ccchZql,,,0555RY0k333t:8ϭVH(N8!))Y A|(_(_r6_Ntt4 oEՒΛoI__~VWWdrri4 j7nʙ3gطoZvJMM 8Nrrrt#p\vTٳI._LWWݔR__??$r;JJJ0=^W䙾pQ\\,Gb2 Esi>cv܉J⭷bppz{. ԠhP*׿f``AihhjZ8~8MA&JbyyX,bbXX^^Z9vT*333,//q8fO0L,8N~?W^*O"P@ׯbgrrn֭[466aկ~R$??!{kEL&.\ ++Kd"6 m6nLw ǧ~Jgg'vu֭]ƭ[ؿ?łFѰB񰲲Fz"׷/v`ZngzzχV]#xffggEy<F8@T"P(XZZ`zzZIee%T*1|188HssHM$5}200G}}}}p ZZZG} Frrrhiitttyob/KBBBʕ+ܹs|\ o\@_nŅ p$%%xoohhh@311AHH999deeq1XndddPZZnu5z\\l6ؾ}nIPUdeem6Z[[ eƍDFF200ݻgTTTsN #66 L&UUUx^tttEnn.~z\Bqq&>>,Z[[پ};jׯk.aΝl߾][,~?ogΜAgNbb"YYY>$$\Ncc#JZ~?ׯ__%;;v9{,X,l6/#iiiAT200r-;Fdd$ [n@:qF.^Hjj*l߾.T*W:p iii344B133öm۸uO<7oK.qFX,(J gƍ QZZJvv6pO@~1y'Cٳg`hhBnAO&11L!(|>._8lƥKcbbJKKE?rp\\x?dtt'N煖(55U`&6ܸq%!!!---DFF2==Mee%QQQPOP0::J[[֭_i q<߸Ν;|Fn߾ZbPVVF?|dgg@nn.a6'!!466ӧΦ~:;;Ÿsmmm-mmm= $׮]CPSSVd2111Axx8mmmdddXO>^OGG8f֭#;;q&&&W_QUUEdd$H^^׮]Bvv6[nERĞ={ϑd,--Dvv6\.ۿ[n߾bΝ;VO|V~v+++Eoo/XVn޼ɍ7HIIarrp:::`hhׯs8{8̈>`ddu:BIHH'|R?UUUܸq4.\`ppYz=ܼy,7o$##BBBz}yQ*\r&''"$$۷oܳ"ihhDee%o*.&&&g"__Q]]㡽b022Boo/ <>˿ܹs__344j}uV.^r_BWW_+1NxIMMƍfӧT*ٽ{H3ZTTĹs0l۶ A :J5 \.vMee^,//NkO<7d2Kjj*GeeeUرcCV{.#ϦM0Lkj{n^u1ddd3ϠVyHMM .P(P(455p8(++c߾}DXX3ΡC CVS__m\㷵޽{LMMqU„ٳl۶5$gܺu($q88qVpzq z{{׌bv!4?Φ ݎB[ /$DFFrmjjjψv ]d2300[hii_W_7r!~?^tinn&++ NGdd$.&ٽ{7TTTR|444s=s=;ͮ.EEE|$eeeر`6OjRh4a2x"JR Czz:|  T*ZNhh(200@KK ?яя~DTTuuul޼pJJJسg2֯_ٳgDբhFNDDNSst:r祗^bllel68۲e8lDDD0==Moo% ]vhO~ݻw **;wPSSJ7 ##Î;LJ}AѰ{n~_Ν;)))aǎk&~?|>n޼IJJ l߾*^WT{9t:ġfhhJh4]RkZ,<sss<3ܺu8~3==aaa?%22R|Fl6f_jn݊f ]I8stvvBLL nv;SSS߿L&6&6KZzd?!iii ʇ~Ⱦ}&99a:;;qExx8* ۽~p hiiAPF[[ҥK|g eee 277G\\lڴg}vO &//q@x|2/^СCԮ>L khdzzzK~"m|麴gyy6aajj[dΝ;w_~"""HKK#<<R)桄!ɰZ255Edd$jY~?zRITTᤦ+jebbBl@>L||<'NXsΜ9C\\0jb2z8Nazٴi---ܾ}R.\28 VELL رlfaaG%$''W^y 8 aqqirssV`~~Q戎FP033(n5L||>^e\.AEFaa!/8pX,`ttT^^֯_$~_Kn]E-_]}׋abb~gLNN2==``˖-444044Ć X^^^3$ךT*nHOOZ-ۋlorr2tttMNNtuur(**r٤)066ƭ[XYYMOO###EOOptvv"|jjtq`f $H|<=66k׮h$44'|]vƍ)++S__ϦMشiuuu֒́dxxAz)RSS%++ Q@6FGGŦI2[2H J\.zx"+++ϭUfffVtgp\gv:ns  EQ(Q$R#MΌUXom]k5*{x4F#JERLsnts )HATH}<9pm۶jyG|LMM W%++qd2[lEyZ-N7oL\\h4q0WDBMM &.8 S[[Kjj*_.|:tɄ\.'558vڅflذAX>zJ%ٸ\.oߎNd2{n&''YXX ##X x<{tvvDcc#Z=Ar EKdrr~vMRR077G^^CCCttt`ۅ v؁Vd%&&(񔗗OBBCCCj~ͦO6Ľ|q^G(),,d׮]r<#:&A詧`0ՅV"D6l 33J]]],,,yfƘg֭ T$fHee%4440;;ƍq8LLLVTUU!JYZZ"&&|6o~]v ”yyyՅn'//<}``Lz)ؾ}; {nQTՑOzz:<#x<4 jl6' D¦Mψ@EEeee p8D"Aѐ.hdffذa~4Z{QիdggOSYY+lF V@ll,nJ399b!114jH^[پ};R! [nv388H\\[lajj D"lY,Ξ=+xeMqMTTj|X\\djj @nn :Kee%X,l vlQ*䐓<$%% Q' ޽QJ N~~ 699cIII!99ZN';wdeev%!v$::ZHicuu{l cۙr!RSS1yfYXXtc|B4c=FVV DGGsaajjg}R<MMMܹS#))'x\碰Phc$=&&:6l>Jvv6===F=JQQׯ Qnj:rssyʢdz>Kaa! p!6mڄL&;v)hZD6a4 """"rwbX#9XGѼWDBξd"&&E1L hЃ@$n܅aHIIo%~?fjnOOOׇD"ATRYYI|| " r//jWFF6mz`Н0xu ###|_-_""x 222ػw/@NF#)))TTT EDDDDLOO NO=EeHHB" 9ӰHxUjtL_Gퟻd-K$EpN=!I$!$n~QBXy$nD)_ ̡/ÝI" /T*oLDn#H8p Bxh4!_VwȝMnO{f3厼@_'Է2?,>NZZψ_n2vG8fzz!>җ+++h41eFGGlOe Uq<>k=TTZwӉI444uO3gΠT*HPquut: ͣ`0l&&&!۾X,$'' טdiixfq5=裏 ( jWߊY˻wDkk+@`]'wKҥKőZ&++_LOODii)oB*$` ~~_p8r DGG3Я_Nkk+MMMl6p'-7vYpiii^u:::xG Ɩ-[hii_&55UX</,r󌌌pe6m$,_.|CR'o{nx饗XXXV4!ɐJ;333R\\LGGüTVV@7,//p8B΢Rl,& χ\.h4b6 B,,,Bll,}}}J!//O)S577'^/SSSl6bbb| 0SLOOvJ&<,.. :"VU(vfcyyΥK@TxιT*j*|>n7f2!} QT,,,`4{)oo ޴`@*fT`vvV؜eqqRRn333Ccc#8~8ØfJJJcllcǎFWVXZZbR4B 77?Qjkk/ 011!TXhnnf۶mXVfff}jjJiwDthxMvv6OT_r2 4cccMRR۶m#G q:244ZL^ٽ{7G 6mmm,// yyQ*)kׄ:ڿկ8x jUΟ?OffpӴT*INNFqI>`@Px|h?, DoBDr9333z9r'N &&U{9_ vbpp,._LRRn۷ '**A,'""""" s(r9B!Ù3gzVVVp8DGG#ˉ_gZ, of[rFEE"8FV :lrQ(|[ߢ42;;nNuu5/"J׋`ȑ#! hnn&))-[}v._%**^YW.ЀDss3jZZjjjHLL%~UTTbwn"PTTwl6$%%3ϐ& QUUѣG@SUUŞ={Ĝ@VV[ne֭d2ϖ-[pOOG @ @VVw`6я~DEE^wݵ999?D*ra6mȈ൵lٵk;vnkm۶233cpff!Ӊȑ#dggrȠm۶qeN'JN  ٸq#O<qqqHj=z&''Q BLL rn_ٲe˺|h4j5PHn~wťKl(JY]]'xBXGڔ pcɓܹSSH$ J 0>>Fa||k׮!x裏QT:tjp\~R)O>$ʁ8z(QQQ_"""""""sW}~!{A.#Jݍ^bގh$99χR̛6mBe2rQN'Fvtt_*^{qUكL&#baeeȿ˿V)--% bZ1L,--aۉazz^X]]E&T* 8N~_ĶmBbZٴi_ZZbuueV+~T&&&hhh7`ݨT*`0Hjj*LMMu֛EB@V#B†^gvvavECC333dggxpӕjTTTpް;wǏgDGG3==MVVfqq4KKKTVVg***0 TVVRZZ*I tۋ㡯 宷3399INY[?8 vL&п ( V++++rbbbX\\… dddP(JDGG344G(yT*hBA(bxx+Rhd2ӧO#J5F;wz{k׮qF\.Fu:PBfbR^x~AȆe @T"ovNNw1L455+h̰ ]VV455a0֕l6f3hZJJJ8z(*HVg?uuoNII ~!˄B!deeo"HNNȑ#`Xddd L&#** LF8F1>>(Cz9艉477 yyٳ;vIUU( Z[[پ};B^^#779xꩧؼy3nB&Ar yyy_AGLFcc#Py \|Y2+ ØL&r=yضmIII޽`0ŋY^^g!..vA-++Yr9`6Ϟ;w˅를Z[[߿!a+ɨp000SO=ENN& NǦMEZqƍY^^&))7044DWWݻlA$"++ bppdHKKcpp$ksǙtcdAGRR f(((x7[Ah4b ;;^pFee%a2!::lT*YYYx^6nHBBLOOqF6lذ111deeG"HVV޸q#))) ݻB^WZ3EsNͥP(D~~iT^^hdee{bX&11Z999FC8,6呑A0dddRIii)nKvv6۶mCۋVeӦM$&&7<X,=Nnlb_X,LMM Fs||A7X, n ?_ft:BÀD"paD~y|Q@s~l޷ȃ`0(S8B!TWM$<96rx׾s|1"Z{[DDDDD䛊D"aee/AktrHLLRdj?, DhDRVvߪV+ZzRRR2ͤ>Ț=E__yN|r~|^>a||6w.L$v0QhLFall~rfff@*###ڬUq_YYٌN-ڵj jJat:<LMM )?=7jV tvv211A(<::\.0ĉ FP0<<zL \.t:&~l6:T*F!::% 㶶ҭYRx<ƻ{7X⾸H?CPsa||\3b||\P|t:9?77G?p8*w O]]XV|ȭYnCzY^^&쬠t sv|>CCCLNN S@@xƢT*w׈<܉赵LNNrEj5 Fѐ/~ VVVW_}ɄZ&++a|M7p\466yf]]]ֆh-E*˹|2333?dFmv}Qv\vJ:::oKjj*444+`@բT*evvsαi&AA>råKx7yGpPWWG\\ Q__/6+X,_N^^/2~ .`XZAQB^gbbE^/QQQͱD8fzze7 h4Ḹ8r{Zq\Btt4fw}KCC7nddd)z-8~8 hp\#ln>ΦM]۷s 3R)>,pbPVVѣGdddGGLNN_  YٴiPBL&cuuaxn X>}#,66o}[ j4<#ٳwf999?C.M9 @!##%t:JNGNN333vΞ=`??W!z"!!2E__d"8pTK/dj- %:DKK +++zk>c뉉a~~ݜŋtttP^^N8_'N@T288H~~>px]~*t,//s^JLL sssΑ#GwS@ ŋ*n @RR?0|'dddt:p{릑H$?Lƞ={8}@_^^#ey~??yիvٺu+o6yyy^yf-e2|Zp?@MM͍Ր#68qg}V_|V% DNNO6n{{;w ^`0nB}] 2L0}>^NzVVV8x \.op8F瞣yp:.OJJ O?4z`0$$$PVVFUUnR)|Y/D˗۷ ( A رcAKK >JVV;wguu3zf^ŋQ]]Mbb"v͜1:::dXVL&=6l ;;C||<6l`޽w7P(Dqq1\rEx槦8<7wSDBzz:7nbcZ9qO>$j޽{Q(|+DDDDDDDDDn5Џ?'|֭[ B ehh$, L&O{0D.SQQ!* xHLLT0h̯k˿7ߤB>)F#KKK,..h4Feuu$L&###nv#q\?d2QZZJ ```͛8J%PiL&333l6v;>( r%z-jjjH$1::ʕ+W{L%#˅phRIII% F!ɰNg} />#N8!<#Fn7fl܈(//'11[R^^Rduu($gyׯc۹~:.V+===LT===ܹ{$ٶm BDG@zz:>|<ٳgF!`rrkAdYZZb~~^8>3??Аg휲X,?yyyjʰx<1\DDDDDDDkg'&&'jܹ[KUUî](--n6nȞ={aeeE~it:mmm\.{9!vmE8&'' 7hm.vOOr%RRR455T*Q(B000d"ݻ!##;w v6g}FQQQF233Y^^FTefggq8<3jjkk6m"--NRRRطoSSS~l6QQQTUU੧ZMww7yyyٳBNO*R$11J%YYYz*++YZZbffUߏV%++ V* JKKzL&*sss$''?1h41LNNo> X,a^?޽,VWWСCrcccxKѸ鄈h[D9atV#"j")9| p8d27`0sR>^nsM& p8xmO6]M p8Ltt=t:n1]l^G6wG$B qy]zU_GP/ ri~TH);;>S=)))p8 R)`><ׯ_G&,,,,mmmr֝7&&FWq7(OIDATttt^gV|lln<N{{ Frfll JZfbb^bccE=KWW~&G?BDB Gtt4J^ILLD&$2 ,-- L}}}h4T*tttz¸EEE}n_1::*(G\XXԿ^>33Cgg'6 @8!T*fEviooH$LNNVnk4fUq[~jkkh4RduVnPvkUFGGEV$  ddd;Qq\ ȥKP*dgg300Gzz:/\r7rdffbZYZZYrrro~C0͛7T*}}} ~YYeXYYٳ$&&"9uݻW0r k"wؼy3V7xC(YEKK ?X(=P__LLL :JECCo6<2H$QT0;;˵k1|>׿5ќ?t׵{jjJD JJztP(`~~P((t:y饗%66afggjQ@oiiaiiW"1|r._LYY ,--;P]]{gᠵhN'o X!|A2n7b!..ٌfl6pFd`0JbjjJxxCR$55Uw2r14 \.1͂QK/t:IOOrӃC~c"裣k~]FII h4JoRYY^gvv>7_DDDDDDDDV@'||;$&&t:q8477S]]\.ghhRɟٟ [\\Ʉ易'|x8)P[SS}XL*3 / ==gyBA8&##_|{ I0d޽l޼Y8ccclٲp8B@.3;;DoÇ| ٙ3gF^/GL(B&P(PՂk.^|E233q8B??bHttp̧@7|388Hss3hh4믳ʉ'r 4eqw[o166˗~Ǜobl(WVVxiiiҥK7p ~Áh^cdd~}w?3l6|ᇼk?~TʡCNfgg_{QDDDDDDDDPӧOã>ʇ~"3??B.#HdA??crrW7B=N'%%%4&&&xq~'NFMMpיĉ⡗H$Br0$==!X,H$r92VVVV6SVWW^OYY|{9u6mbZ1 cXzJEElڴDo͛ LOOR傑+H477chjjt ]oNcLNN200;8~8)))$%%QVVFRR/^ %''Mjj*O>$\z'|R$H^w|TTtww~^JAA O{B0QQQ)--PPP8gΜA"hhnnȑ#bۙbnnQf3.\ ++ FM|fzbb"SSSDGGNJ ({졸aFGG)//gbbbh4x'<9a^/RFg6{rrZʊPV+$rN'ٌvddffm6*++eǎtvvxgh4,--j%33UbbbؼyORhii6.JKKfppL!/>r?l޼L"^EEEڵ \N/TT`0%;;D!~aaU8@bb" ^_yy97nD"`XxGq,-- ߃)J%68q:,,,prssdgg pvvQma28|0X^/KKK$&& ``ee"6}yyٱc466rQz====~ueHMMIIIH$=Fr#fjjug:*++ILLd֭h40 ( arr\JJJ$ {۵!T'&&P(駟FVÑ#Gh4> ד;AX,!U"`2x<ܳru/Zd2RnR3gΰDVVַe܋:pz >bhrql6l tH$a~F h4uEDDDDDDDDПfP(P:Q(O qdDB0KeD"jwĻc0ߘCd>ݭ6aaݏ|tDam;0;vkcDBEE>w[y8\jM3@`0xOߝ"""""""""&vD~{,lNo0p8|/$ 6~WJw37rXYYoq`ӉlwQQQ DGG a4psBRAa^RDDDDDDg'%%1::JKK VDd2@vBLMMԄD"AIss3099ICC8Nz=팏*Z⾰@SS$$$%khkkrjڵk8q:288J"66!ۉ&z\z~BZNJz^ ===tvvCLL 팎\.gnnFVWWIJJbvv&F#III~!33p8L__]]]$&& ƑvJ!08ddd|t:LOOk׃ZqYYY!11p8L{{;}}}T*$ uuu211!(_v BrrP^H)h4-}dzz@ Gf|֪f_NRR.i W\all LNl¼KIIY7%11&FFFP7}(봵188(_yTbd'$$|f(/^dӦMI\\JN:;; B ׮]cppCJJ 466p8HHH࣏>É'$&&  ގ#!!OKK cccBY\\ڵkx<nP(Dww7===hڛt0vP*v~x RRR>{i`` 顧xJ%mmmtww ߗfwFtt4qqq;n7066V @Vyظ5Я_rrss?1:~_ŋ)**⭷ ==t\.NF{={FZ}xx%zzzb_֖Ykkkrt:*޽{1 aZ9w555[o"޺t?Oj{qFx8u%%%¢ʕ+?` &&ׯ{nd2?ψRbԄ ##:>#z)B k=22KKK|>zzzE* î.&''l(J& 100Ԕ^zLbccerr^['zgg':F'|B\\Νcl6V+ǎz TJ{{;2 oN#>>~]@w8\~ir9FV2V%pèioo/̃%z=կ&;;P(D[[p[_<(5лk6l@0ԩSa.^HFF|[lD¹shiia߾}BD(ޣZ SSS\r;w f3>H(666?jgVVV~:> 2??Oll,QQQQQQ<+++8qv;nz=6 Emm-6L~_M||<^_d۷OhpWW^? _Nkk++++p8x饗H$֒ĉ466R]]|tuu133?d2qI$fGG@f~VVVJ୷bppZZZhjjܹsӟQ~ӟbZx<]\v~{{5{#GC JDEEΝ;IJJٻw/ 477sU癛 ۃtnbɓꫯZwdW_eyycǎͯkǹz*---k111 hll䭷ޢL&B"PSSõk0LBrn CNIIh4u?Z^'!!A8H$ syǎ]HHHt[ XE__EEE?`uuBAAccc8N :ppp 6{n} &yB\N0DTޤR8t$&&EGGO>$GkY\\r/RXXHwwMcNee%/"7d26oLyy9)))TUU">>={jٱcшf7`bbw}ptvvRYYwq311FP`4;pyV+Ӭp8Ztwwsqy71Ll6oNff&䐙hj@DDDDDD\s)t:>('Onrv +DB8G?wF#W^`xxKqqpnDp8L}}=sss),,dƍ*EZ@( hhh`t:8בH$x^JKK9rOb.\Wj YF #[VV__1MMMJff&EEEvPbb`2XXXY~iۇJ" "Jț`0HRRW#d2 HR qddd}fN'yyylٲ 6PVVv4 ;Cyy9eeeVk> Dnŵk%!!lJKK1 x<Z[[ٹs'pɄlfbbIfggygطo2p8z`LOB,LNNٱcwɓfY]]FFFpBD@]]DEE믿jRPP@BB ,//f?b }}}l6!-[C o)te~ߐ/K/Dss3vn7LMM1>>?QTr|>;00lfd2F#+++bvhhxn7?, :E{{; lݺEFFFHHH#mw:jr)}]6l*>~fgg'0::pD2 TBlz{{l6 -TJGGBhBj266FII z7{x裏fx#++ N `ddIyy9yyyݻ+FJmm-zf3MMM,..vİeaǎ:utz=yyy$''а."%55|xذa.aШT*qݔ騩gr@('`ll H8?.~X||<F Ʉ^vimme׮]=D`xCt:QQQv3N[_?EEEl6&66LFJJ twwٴi]]]>}VK8ʕ+tvv255ᠶbcc Bl߾eFFFHJJF^^P,rssIKK'##)`nnNVߏ9艉fZ-. @EES]]M^^iiiϳw^6l4sssTUU}vQUUEtt4~>P(dee.}ee!vDbG<Q8D8)))j!W<::GVV333HRT*TVVR^^Naa![nE&1<>^䐚ʦM|Ux III!99@ FB[greK 栛L&TJ +++<dffxر*222J8>N$.66VHHLLduud!Gp*YnZm۶RhiiC1::J8'XKff&sssd2rssINN&==FCrr2EEEX,!7k#|VtBAJJ PPP HMM%))4M$(JH$HRX\\$==1$ <>ٲeشir\(i0zlذ4J% v)++cӦM,//c0PoJf駟F 9{e˖-$%%p8oxX ::^gaaN#--x222lR^^T*aلd***pDGGOjRINNsssPVVF{{;{*%%Rg! 222BEEt"Ɉ&%%^d *YRRBii)%%%,--͛)++CPv9|0ZqVWWy)++#11ƍٸq#\.R)O=~⨨`˖-$&&277J"++Kn򗖖v ;AX,!N"`2x<ӛ9nbᣏ>h4RXXO?}o+^A_XX %%偫8vn<.3gΰD"aӦMTWWߗ&7 E~ ?rׁ`0(hr|Q"e>p8,V7>%**꾽DDDDDDDi il6 ^.5햫`0x[us |>~K]W"d]}sRɾ}|{=wÍtr0#^{=Bum&h!To?[Wg2wi""ߔ[˃^[^DDDDDa@"NAY' 1y*vQ45Zug^$nx<'~ qݷ|Ne2^&k1BWH$@SD) qQ*Bn qJe{$oaW!PAJ9l";☈ }ۍl""vHuU("i $҉(UcxnG8Ք͆iEDDDDDDDnTqOJJ_(\.'P__O(B122Bmm-477SWW:|%\L||< ROZY^Q3W(tuuq5l6X,.]*vt:Prqet:3g-AKK mmma@ @kk+mmmB@.311!;KIIajjZAQ[[8B!:;;iii!99YP-U|:*CCC׳Lrr2PF:::A&q:::"99Ε+W0L\dNB?84} q_~7#|)tttP(okUܭV+p.H8s uDžaz{{vJR(OE._j%55KmmPAPZM||<\|#˗/3==MJJ :::jh4罽׳"|WiӦ엞~mnzF.]$TtDJ+"sssۋFydOYY"H0 Q__b*eeffs999f\ \v?V˱cǰ˜UL&*?}}}\v BqĥKX,cxxXESS]?nᘡ!{&!jV 8N\$)))8A>?ĝׇD"ʕ+H$'? zd^~eRRR8w{%"ޕ6L&p88s vB.3q8 266Feeez{{={8hhhݻ ӧOSSS<ǎ#99Y([s9~_RYY*'O4R)H$>JJJMS[[Kff&DGG388ٽ{72g"/^6, 999qn.QyINNٳ099I||bcc"!!A{gL&cX,bccAǗ_~LFGGQQQx<BE7?F#ӧOs!bccJ?~Rr9 ,//D0az{{)((w)))={B^P@Vhcqq$0@ :;;ٺu+oXJ+"kiiСC7j9yhZ,..b0 066Fll, [#x<0n%%%Vvo?p8ET; (((W^OZZ---vDRo)((`zzTʉ'(**̙3,,,0??=#"""""rsCG*BWWw&**Qx,l6233B&~y)..͛7saRSSJ8pG}ZD"!99}P(½lڴ DD"a۶mfyyj0* BA{{;hZz)jjj֕ \xj8@BBp(Z-FQXpA pxߏVG!77!@7LLLpY}9~8r50Wbll_~@ tG*Z棏>)y0oGyjH$BFJRYYFf3F]]󌏏3;;@ ?&r9cǎa69u---yp\8q~a4immYa^}UF#uuus1_.<_pc󴷷//sIx f._B@ѠP(8v pԩݥ_(bccq:x<2>>.|vhhty 333477gϲjѣlٲvxy'b^x|>]]]A^x hkkcllz{>_Nuu5Gl6Fll,/ F[5oO0n&l68z(۶me^~e^}UV\Z&..rɡ ͆D"._LKK f$<$$$066F~~>FF.^HBB;v O`6illl6388EPjQ*h4dCDEE1;;kߦcǎzimmg Ǐ'** JZiD"o,..b6͛|<3ʆ x 466y6}˳> ǬrAo.ԛ駟ߑR>ɓ'YYYaeeQnp8D"OO+uuu (,,n,H/^[za0.]d2o}vywٸq#UUU>}_|Q> q1BOsIV+&~Ç CGe|G4`1ͨT*Y]]࣏>B"SOtkpa9p6m\H$yfX,A!A_l~N8Ve HP|> l߾VˡC8qBJGEEw8<y?Rbcc$**<>C, {a͌311A(fhhHP Æ 0M6RM7TڵlOR)>}-[ىn'33\R) J[[V@ z 7Bn(J:DEE555];"[n壏>b˖-f]O"_GG>y7̧i"?>fnnB!9t,,,`h222ذa999=zsVUU1::㡼b"''WR^^Ntt4LOOc4bxxGy'xBO_3&&??'d~~4fafggOll,'墿L';;"$O>$<v}Yz=Bh}("֭[ٵkFFC~~>6l`ǎDڵϓEffZn5>}ܭ>cZy뭷8pM|K.a0X^^>ł餽Q?1Jǃ~Յdb׮]hZv;n9hoo`0xjE&p8hnnfvv;v099Igg'a_.KnAq\&r8vǎ#55ш륣I:::3::*?nw$X*"-B6lsa6EN'yyyBj200@EE: 6gϞ/Ts~'h$ Mll,nP(0^WȡMII!''$֭[q8466b0Y@ZBą \tI4vJ$1LLLL}vN>MVVqqq$&&=oa0عs'yyyMQQرyPT\qqqLLLƏV;w~p`0(466244$ -..faa{P(^ҥK?< 8qNٴi/^̙3Q]]0.l޼B{555'p%ʨ|$&&RSSwb˥K|2Bйs{J rVWW)((@PPWW'x#aوx8~8---l޼˗/ 󬵵B!R۷ox Ess3+++t:yX,dggsU\B__pVT*†jcc#6l >>Thhhf 1Txxׅ ZMVVΝX<}fBj5 ;^"pqqQnZ;JKKwK>}|;LMMaIIIwޡ-[i&.]ĩS(((`֭ ;v@.{111AYY%%%\|SN֭[j?fii(~?%%%|\p;CDDDDDA3sx< R6nHII deeje߾}`4X,l߾*KyfJ%^F#F栻ndT*RSSpb{^RSSyyy HdddFAӑΦM())j!PVORo`0$==P(FP(Z( &&&BRQXXHQQsN~G||O<,mY8+ |I^HGp8,x{療O}8fϞ=BHn$˒Mrr2}Sn9&"""""""""5V' nʩ]"eztmwĻt:U_oz 9lTxޛ~'Ʉ_s6la5PgÇ7pXc|U! qH$_8̽ q4Oz$S UDDDDDDDDDDnm{8p|>C|XC(t޳sn#W/D|"WHo>N|//"""""""➔DWW/_fiiTtʅ B z{{pPR/211Aff&CCC9svV+ \|6d2mZ>99#11T#j V^ 鬬pi, YYYr%_Ntt4z\Dn'`0pݜ8qׯ %v@!@ccݾ|2]]].\`ii4Ƹp3338wCCC hiiNPp_[)F`bb:*7=Uqŋ,,,J0^tt42ӧOBOOiiiX,Ξ=H$۹r pXȵv8B%Zd2166FRR(V}~~ۊ\v{oV(jfڊRdjjJx.>Kww7N())Rm8s Fl{ŋtww$WWWinnFV399)T"AΝ;GQ[[Kcc#>OP_V@_N# RWW^q9s}n\6lXsG]]---hڇRQDDDDD^r'*kVgw 8{,8q^OII H$j5XVlXV>Cv؁R\gepp/ kˬٳgh4$$$pu:::ػw/VN:֭[YYY?$99Y(et^}U*++l9s]vT*ennFƍO>& HJJ"&&)N:Ů]Jf$ r\NGGF 6y'XXXĉ s26zzzrԄFA. MAF#*V 288HBBݼK$''KccPjn5ƈ lذSNQSS#5ٺu+otwwXYYɓlذ$y 9Z[[RTh48:::"&&N^}U/ZԩS?~n333Css3`$F#W\avv"&&Vp\$%%1>>NCCu)fq\2::JFF\|yRRR ٘fNPB0300T*׋fd21440`\N__oDooPovvx$ 333?pPeuuUMMM8---( bccihh( `0(((?dddLF{{;555@fcpp7x$t:p:NKK $$$b?ݙf^/ǎbXB!~Bff& ^J~~>KKK<66.FFFXXX -- ̕+Wv  SYYISS]]]šhD^xINNF"@}}= \rj]N uڵ۷Vayy>#,Z-&!! ҘRRR(..&~j5Z.j5J떕o> Jٻw/ĠT*IHH`( 0>Fp8300@kk+ vyGV KKKT*BSRRfiÇSOh DVeH$KLL 6M9Fcc#sss 088DR"""(**{Z---ܾ}w"H(,,枨A4cbb(,,dbb(aݟ?^Xw.(V+nbll .իW󄄄ٳH$^uL&ʹx YnjiinݺECCÖD"۷o;P^^Nee%|>( z=*gΜayy>!kRrvd2Q(\xI}]J%CCC\v Tӧ1LBΞ=+7$$-&⃃=z_~i!f ZN#..rY]]… PRRBLL7ʹs r9R@__RRpjx^(,,drr7n؈Rq}r9MMMqEN'픔lLF}}=wqiڸr z^{oo/[{g^|EV+6q/ŋrQJJJXZZͩ|>2_5~۷oDrdggh4,TTTƟ~ƭs9ٻw/g@͛7yׄV3>"666o|{ߣ</^2'O/RYY) l6L&ʕ+j!#H  66~۷q8B* v3d{FT18J%~ݻw+hYXX`aa666HJJ?@ff&[t:DEE1444sss,,,`۩c[+((( !!q9q|:0::ݻ9uVnF#ǎ###@ @}}=111ڵKV&gEDDDDD<>V@Omm-JY ؽ{t{ﱶFJJ wܡ$666rAJ%SSSsuVC5ׯ_&""B:|ZikkC" 0\.d2t:立ﳴ?h4TUUQ[[K||M[[eee-t*DķZtuuo>a{!!]ד;Cee%!!!̠T*J|>^/A~ j#66'NpaVVV`0h͸D"aee )//guu7nDMM 333@v._%11QoV~?L&Z[["LOO-XVIII!44FCBB%%%444&QpQQQT*imm}@ jU׾磫p ~_x/X^{999d2<111DEE#GX,B|H"Ԅy׮]$&&͑#Gp8LOO\.TWW׷E8޳guuu\tÅ>~up% $$$p5'JٱcmmmL(?!+++ܸqC製{ŋIHHxO^DDDDDD>zLFJJ r^OVVYYYر}@FF'O:.zݻw߽W^yE.=`4QhOgs4\NJJ Rxr9l߾H1 DGGT*IHHjG||B`qql"##`sN<(yд\ղBnn.aaa$&& Az=j!!!$$$`0h4ERRL&c}}U^z%222&11t:G ÄxHLL|"7w}ХR))))( t:w&<<@ / wo߾]-lllpqrss'::B/(hׅbbbH$F*EHH>cccx<m3ф#ؽ{0dm6pݨT*RRRHKKh4 w@zz:8#55U|5 DGGD\\:vA  33{NRRj8D&w]a޽ő^'$$$tj$򈌌$$${N:z4ٷoN'X5ĠVy """"""".YYYٌdǎ_j忨˼⋏."z1L[L(ioo'44cǎ,:yѺ?-CCC444P(˟(2eIww7 x<)""""""fuuU"}ZN'NSYT'2"O _$ 0͂VqzKIw9yLhy! ܑ^/.@ Xzq:(JT*RDDDDDDH$!H>.XAA/N۽eYqߔMvA/s~T@x<9xVUQIr0tl.sD |8]πD">Լx@@(G8&AJ FOluF&})&j=@K_"c"""""""""|*Rt!Xp:?j|E EDDDDDDDDDD-=66*++%11R墴Oll,mmmvILL͛TVV2::JJJ }}}ԄdrWUU1??Orr25׮]c``O F3W*ܹs7ohbpeL&,//SQQ{P*z߿ϵk׈Sp88w---|>^^4{v:TWWsm4  DPMyy9$%%144Dyy9ccc$$$x(--۷t:u [9zG111䤐BWWקq9{{{;B^/ܽ{RBFZ[[1L&ʘh4"HsUUUBs {XXc3qQz{.tuu%DyQܧ)--%55Ux%j~?;v젽:ZZZ8{,}}}s%RSSz*ccc†~ΝjF#Ǐp011D"axxz<222Z~@sss/MHHwfVcllL[nQXX,k.RRRxrss룺III̙3|><(䅷$$$000@MM ߧ-闞$իW@ ===455qYv`` .p]v; XVݻLHHQQQa#GJ",,h8B DZcDŽJ;w.hq:߿¨޽{sQ zilljB?jC)Uc޽(JZ-aaaB~aߏVرc$&&htP*288( V9<@XXSTTFr_z `I·~Q*DDDmmmDGGjIOOpgbbb`0 Hꢩyz{{"<=)088H||< J~:CCC\r>}Vˍ7dqq_+d22`0ʎyH$?~nfggH$BTnYgZ޲|>? .pCBBFCtt4b۶mEDDDDDDDD|n9w999>|˅#kQ*\ζmۨIzzz0RZZ;gnfٳ\ CCCtuu?EEE|'..N`+JN:ŷ-x-]z)СC8N<2aLu:@T%Q  CCC,//v' .\@jj*'N`ppVK^^xhnnȑ#hZS__(aaarAWW]]]466 !44)^INNt,//fq~izzz|kkk^0WX,\.r9ΝD(444044DCC-+++aٶ[":Lǎp,˖MNNvIJJB&h+CN#??ϓoRUUall Vb JQ( J>HϦj|7LDXX xK$v2l6ׯ_gaa-.uL&:DMM T*~?LNNnصk*"""_0cccd2A[WW֯C~uVVVJdjkk[Vn߾M__wr\s:-x"/^b կ~EOOv"""""""""ʊH$fN'۷o@VV,--!Jaaa1RSS1 DBB&&&bkX__ Ya||I 2ͨjBCCioogmm@ ; χ` &&|>;w2== R۷ Zęx<[:\NWW. RI^^VFCDDnoߎRUصk6"""ضmccc#HHII`0Յn'""LLB] l6 & l6Rph4nhoogffv~_Nrr2aDpdff266f#%%E' *Yd2!l6222cyy -LNNb4INN&0<< 999{<\.fggIHH`nn$fggd2 _4ł``qqQZ-l6 r$22Rd2+++VINNfyyTQT8NbccYYYajj\l#zL& Dpt:,//c1 C^^' A?COOHR}]#"""""""djjJaVWWQ*DGGoH}ǎ_j7 蟇M˃?ItJqq1+++p]/"( ǚ=(jOdKv;BsСR#t"?4emmKtV]D= f_ !?T*6*KGvQ rҬy^NC^@.cs='L&ڌr}*""""""""D"r}jaS}x^|>s >׋R8O:nAO׋D"\#x 8ؼ^>`ο|oAs @@PM?kZ >i>יM].QQQTzx^qLDDDDDDDDDQ#]<QED> l6nW D˝;wv$%% Q/\`0Dii)$''SVV&==n._L]]KKK{q]Mll짊p8P((Jjkk)//gnnL&Νcaam۶a6)))L`Ν;\|^/h, O&>>uy|t:˩2v h4h4JKK}6999(JZZZ(--"sUHLLvSTTD{{;wpP^^NMM C_ #fjjO}bBrrc348N$ !!!ܿRFGG1x<aR)!!!\t:IIIannb&&&6r ~w넅=>lllziii!<omm2x<F&''),,dttd1缈W͆rd[2?#fRRRsNln߾ٳg1 hZN>O?Myy9F*F#$..0Gyy9?uuu7 ::FCUUDGG?6 fdZ[[Y]]jŁr Gh4hСC>|V+&7ow^}y]F? ~gffDƍXVt:oF҂T*e}}?? jb BAyy9, ,,,dnndbL&{3FMM \ztڈΝ; ˉ\Ν;GZZ333L&rsswDDDDDDDDD>E@X={L&#..i&&&x駑LMM8|0z233"##l6yZ-q͇feesNOD"a$%%P(tDDDk.r9@^ρt:BBBh4 WGG~{N֭[Ԡh8p|pp=V+ߧ!!!R[[2 dggM  66PvލF G>|VZ牋իP^^NFF$$$z)**"""4rss)..fqqϹs(w&33DBll,,//S[[+Xf$&&b6ٳgz׋ZvKss3tww444099Izzp033Í7;LMMq9⨩appufBBBhllL~~륺&.\@ss3ݣ.cqqȞ={p\9s^۷iooH'##cǎ!˱lLMM;sABCCx =z022į//m6gϞeۍRG?MXX>ҩjRSS_Ikk+KKKvs `69{,ǎ#//@pܻw焄 F/))aaaAh`_^{5ZrUſz~?jSNoF!wqQ \.Ο?OBB