pax_global_header00006660000000000000000000000064131564550120014514gustar00rootroot0000000000000052 comment=f330012e2aa8f44d7d1bfbcd51ef2a347ae1aa76 camp-0.8.1/000077500000000000000000000000001315645501200124425ustar00rootroot00000000000000camp-0.8.1/.gitignore000066400000000000000000000005051315645501200144320ustar00rootroot00000000000000Thumbs.db # Text editors temporary files *~ .~* ~* *.swp # IDE temporary files *.ncb *.pdb *.suo *.obj *.lnk *.user qtc-gdbmacros/ # LaTeX temporary files *.aux *.log *.out *.toc *.lof *.blg *.bbl # Temporary build files *.o *.a moc_* *.cmake CMakeFiles/ CMakeScripts/ # Auto-generated documentation files doc/api/*/* camp-0.8.1/CMakeLists.txt000066400000000000000000000171111315645501200152030ustar00rootroot00000000000000############################################################################### ## ## Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ## Contact: Tegesoft Information (contact@tegesoft.com) ## ## This file is part of the CAMP library. ## ## The MIT License (MIT) ## ## Copyright (c) 2009-2014 TEGESO/TEGESOFT ## ## 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. ## ############################################################################### cmake_minimum_required(VERSION 2.8.8) # set project's name project(CAMP) # require C++11 standard by default set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) # include project configuration include(${CMAKE_SOURCE_DIR}/cmake/Config.cmake) include(${CMAKE_SOURCE_DIR}/cmake/PackageFilename.cmake) # all source files set(CAMP_SRCS include/camp/userproperty.hpp src/userproperty.cpp include/camp/userobject.hpp include/camp/userobject.inl src/userobject.cpp include/camp/tagholder.hpp src/tagholder.cpp include/camp/simpleproperty.hpp src/simpleproperty.cpp include/camp/property.hpp src/property.cpp include/camp/observer.hpp src/observer.cpp include/camp/errors.hpp src/errors.cpp include/camp/function.hpp src/function.cpp include/camp/error.hpp src/error.cpp include/camp/enumproperty.hpp src/enumproperty.cpp include/camp/enumobject.hpp include/camp/enumobject.inl src/enumobject.cpp include/camp/enumbuilder.hpp src/enumbuilder.cpp include/camp/enum.hpp include/camp/enum.inl src/enum.cpp include/camp/classvisitor.hpp src/classvisitor.cpp include/camp/class.hpp include/camp/class.inl src/class.cpp include/camp/arrayproperty.hpp src/arrayproperty.cpp include/camp/args.hpp src/args.cpp include/camp/value.hpp include/camp/value.inl src/value.cpp include/camp/detail/classmanager.hpp src/classmanager.cpp include/camp/detail/enummanager.hpp src/enummanager.cpp include/camp/detail/observernotifier.hpp src/observernotifier.cpp include/camp/camptype.hpp src/camptype.cpp include/camp/classcast.hpp src/classcast.cpp include/camp/type.hpp include/camp/enumget.hpp include/camp/enumget.inl include/camp/constructor.hpp include/camp/config.hpp include/camp/classget.hpp include/camp/classget.inl include/camp/classbuilder.hpp include/camp/classbuilder.inl include/camp/arraymapper.hpp include/camp/valuemapper.hpp include/camp/valuevisitor.hpp include/camp/detail/valueimpl.hpp include/camp/detail/userpropertyimpl.hpp include/camp/detail/userpropertyimpl.inl include/camp/detail/typeid.hpp include/camp/detail/simplepropertyimpl.hpp include/camp/detail/simplepropertyimpl.inl include/camp/detail/returntype.hpp include/camp/detail/rawtype.hpp include/camp/detail/propertyfactory.hpp include/camp/detail/objecttraits.hpp include/camp/detail/issmartpointer.hpp include/camp/detail/getter.hpp include/camp/detail/getter.inl include/camp/detail/functiontraits.hpp include/camp/detail/functionimpl.hpp include/camp/detail/enumpropertyimpl.hpp include/camp/detail/enumpropertyimpl.inl include/camp/detail/constructorimpl.hpp include/camp/detail/callhelper.hpp include/camp/detail/arraypropertyimpl.hpp include/camp/detail/arraypropertyimpl.inl include/camp/detail/yesnotype.hpp include/camp/detail/objectholder.hpp include/camp/detail/objectholder.inl include/camp/detail/valueprovider.hpp include/camp/qt/qthelper.hpp include/camp/qt/qtsimpleproperty.hpp include/camp/qt/qtmapper.hpp include/camp/qt/qt.hpp include/camp/qt/qstring.hpp include/camp/qt/qlist.hpp include/camp/qt/qvector.hpp include/camp/qt/qtfunction.hpp ) # find Boost find_package(Boost 1.38.0 REQUIRED) # include files search paths include_directories( ${CAMP_SOURCE_DIR}/include ${Boost_INCLUDE_DIRS} ) # generate version.hpp message("Generate version.hpp") configure_file(${CMAKE_SOURCE_DIR}/version.in ${CMAKE_BINARY_DIR}/version.hpp @ONLY) # instruct CMake to build a shared library from all of the source files add_library(camp ${CAMP_SRCS}) # define the export macro if(BUILD_SHARED_LIBS) set_target_properties(camp PROPERTIES DEFINE_SYMBOL CAMP_EXPORTS SOVERSION "${VERSION_MAJOR}.${VERSION_MINOR}" VERSION "${VERSION_STR}") else() add_definitions(-DCAMP_STATIC) endif() # define d suffix on windows if(WIN32) set_target_properties(camp PROPERTIES DEBUG_POSTFIX d) endif() # gcc 4.x on Windows requires the -static-libgcc linker option to get rid of an extra DLL if (WIN32 AND CMAKE_COMPILER_IS_GNUCXX) if(${GCC_VERSION} MATCHES "4\\..*") set_target_properties(camp PROPERTIES LINK_FLAGS -static-libgcc) endif() endif() # add the test subdirectory, but do not build it by default if(BUILD_TEST) enable_testing() add_subdirectory(test) endif() ############################### # doc ############################### add_subdirectory(doc) ############################### # support files ############################### # pkg-config configure_file(cmake/camp.pc.in ${CMAKE_BINARY_DIR}/camp.pc @ONLY) # cmake include(CMakePackageConfigHelpers) configure_package_config_file(cmake/CAMPConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/CAMPConfig.cmake INSTALL_DESTINATION lib/camp/cmake ) write_basic_package_version_file( ${CMAKE_CURRENT_BINARY_DIR}/CAMPConfigVersion.cmake VERSION ${VERSION_STR} COMPATIBILITY AnyNewerVersion ) ############################### # installing ############################### install(DIRECTORY include DESTINATION . COMPONENT devel ) install(FILES ${CMAKE_BINARY_DIR}/version.hpp DESTINATION include/camp COMPONENT devel ) install(TARGETS camp EXPORT CAMPTargets RUNTIME DESTINATION bin COMPONENT bin LIBRARY DESTINATION lib COMPONENT bin ARCHIVE DESTINATION lib COMPONENT devel ) install(FILES ${CMAKE_BINARY_DIR}/camp.pc DESTINATION lib/pkgconfig COMPONENT devel ) install(EXPORT CAMPTargets NAMESPACE camp:: DESTINATION lib/camp/cmake COMPONENT devel ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/CAMPConfig.cmake ${CMAKE_CURRENT_BINARY_DIR}/CAMPConfigVersion.cmake DESTINATION lib/camp/cmake COMPONENT devel ) install(FILES README.txt COPYING.txt DESTINATION ${INSTALL_MISC_DIR} ) install(DIRECTORY cmake DESTINATION ${INSTALL_MISC_DIR} COMPONENT utils ) ############################### # packaging ############################### include(${CAMP_SOURCE_DIR}/cmake/Packaging.cmake OPTIONAL) camp-0.8.1/COPYING.txt000066400000000000000000000024441315645501200143170ustar00rootroot00000000000000Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. Contact: Tegesoft Information (contact@tegesoft.com) This file is part of the CAMP library. The MIT License (MIT) Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. 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.camp-0.8.1/INSTALL.txt000066400000000000000000000027761315645501200143250ustar00rootroot00000000000000 Building CAMP ------------- The build system used for CAMP is CMake (http://cmake.org/). Moreover, the CAMP library depends on Boost (http://www.boost.org/). CMake will find Boost automatically if it is properly installed. If not, the BOOST_ROOT CMake variable can be defined to locate it. Once you have generated the project files / makefiles for your favorite compiler (please refer to http://cmake.org/ if you do not know how to do it), you can use them to compile the CAMP binaries. The following targets are defined: (empty) builds everything camp builds the CAMP library camptest builds the CAMP unit tests doc generates the API documentation in HTML format; on Windows, if the HTML Help Workshop program is available, the CHM documentation is generated as well; requires doxygen to be installed install installs all the generated components to the standard path Installing CAMP --------------- There are three ways to install CAMP: - Running the installer (on Windows and Mac OS X) and following the instructions - Uncompressing the binary archive to a standard path (C:\Program Files, /usr/local/, ...) - Using CMake and calling the "install" target (see above) This will create the following directories: - /bin contains the CAMP binary files - /doc contains the API documentation - /include contains the CAMP header files - /lib contains the CAMP library files - /utils contains various utilities related to CAMP camp-0.8.1/README.txt000066400000000000000000000025031315645501200141400ustar00rootroot00000000000000*Ponder* : https://github.com/billyquith/ponder is a new project carried by Billy Quith, that brings CAMP to a new life and a new level. Please prefer Ponder to Camp, you'll get rid of Boost, you'll benefit from C++11 and you'll get good support from Billy. -- the former Camp team -- *** CAMP is a multi-purpose reflection library developped by Technogerma Systems France and then by Tegesoft (where the dev team has moved) (http://www.tegesoft.com). It provides an abstraction for most of the high-level concepts of C++: - Classes - Enumerations - Properties - Functions - Objects - Variables By wrapping all these concepts into abstract structures, CAMP provides an extra layer of flexibility to programs, and allow them to fully expose their data structures at runtime. Many applications can take advantage of CAMP, in order to automate tasks which would otherwise require a huge amount of work. For example, CAMP can be used to expose and edit objects' attributes into a graphical user interface. It can also be used to do automatic binding of C++ classes to script languages such as Python or Lua. Another possible application would be the serialization of objects to XML, text or binary formats. Or you can even combine all these examples to provide a powerful and consistent interface for manipulating your objects outside C++ code. camp-0.8.1/cmake/000077500000000000000000000000001315645501200135225ustar00rootroot00000000000000camp-0.8.1/cmake/CAMPConfig.cmake.in000066400000000000000000000005001315645501200167720ustar00rootroot00000000000000set(CAMP_VERSION "@VERSION_STR@") @PACKAGE_INIT@ set_and_check(CAMP_INCLUDE_DIR "${PACKAGE_PREFIX_DIR}/include") include("${CMAKE_CURRENT_LIST_DIR}/CAMPTargets.cmake") # Convenience variables following find_package conventions for modules set(CAMP_INCLUDE_DIRS "${CAMP_INCLUDE_DIR}") set(CAMP_LIBRARIES camp::camp) camp-0.8.1/cmake/Config.cmake000066400000000000000000000025421315645501200157340ustar00rootroot00000000000000 # setup version numbers set(VERSION_MAJOR 0) set(VERSION_MINOR 8) set(VERSION_PATCH 1) set(VERSION_STR "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}") message("Project version: ${VERSION_STR}") # Set the default build type to release with debug info if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." ) endif() # Add an option for choosing the build type (shared or static) if(NOT BUILD_SHARED_LIBS) set(BUILD_SHARED_LIBS TRUE CACHE BOOL "TRUE to build CAMP as a shared library, FALSE to build it as a static library." ) endif() # Set the default test build option to false if(NOT BUILD_TEST) set(BUILD_TEST FALSE CACHE BOOL "TRUE to build the unit tests (requires the Boost Test Library), FALSE otherwise." ) endif() # Set the default test build option to false if(NOT BUILD_TEST_QT) set(BUILD_TEST_QT FALSE CACHE BOOL "TRUE to build the Qt-specific unit tests (requires the Boost Test Library and Qt 4.5), FALSE otherwise." ) endif() # define install directory for miscelleneous files if(WIN32 AND NOT UNIX) set(INSTALL_MISC_DIR .) elseif(UNIX) set(INSTALL_MISC_DIR share/camp) endif() # setup MacOSX build environment if necessary include(${CMAKE_SOURCE_DIR}/cmake/MacOSX.cmake) camp-0.8.1/cmake/MacOSX.cmake000066400000000000000000000071631315645501200156250ustar00rootroot00000000000000############################################################################### ## ## Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ## Contact: Tegesoft Information (contact@tegesoft.com) ## ## This file is part of the CAMP library. ## ## The MIT License (MIT) ## ## Copyright (c) 2009-2014 TEGESO/TEGESOFT ## ## 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. ## ############################################################################### # Apple MacOS X # Configure to build universal binaries. # Build intel 32-bit on 10.4 and intel 32/64-bit on >= 10.5 if(APPLE AND NOT NON_NATIVE_TARGET) if(NOT OSX_CONFIG_HAS_BEEN_RUN_BEFORE) # Make sure the version of CMake is compatible with this script if(${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4 AND ${CMAKE_PATCH_VERSION} LESS 7) message(STATUS "Warning: A critical CMake bug exists in 2.4.6 and below. " "Trying to build Universal Binaries will result in a compile " "error that seems unrelated. Either avoid building Universal " "Binaries by changing the CMAKE_OSX_ARCHITECTURES field to list " "only your architecture, or upgrade to a newer version of CMake.") endif() # Determine the correct SDK if(NOT FORCE_32BIT AND (EXISTS /Developer/SDKs/10.5.sdk OR EXISTS /Developer/SDKs/MacOSX10.6.sdk)) set(CMAKE_OSX_ARCHITECTURES "i386;x86_64" CACHE STRING "Build architectures for OSX" FORCE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.5" CACHE STRING "Flags used by the compiler during all build types." FORCE) else() if(EXISTS /Developer/SDKs/MacOSX10.4u.sdk OR FORCE_32BIT) set(CMAKE_OSX_ARCHITECTURES "i386" CACHE STRING "Build architectures for OSX" FORCE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.4 -m32" CACHE STRING "Flags used by the compiler during all build types." FORCE) else() # No Universal Binary support endif() endif() set(OSX_CONFIG_HAS_BEEN_RUN_BEFORE TRUE) endif(NOT OSX_CONFIG_HAS_BEEN_RUN_BEFORE) endif(APPLE AND NOT NON_NATIVE_TARGET) if(OSX_ARCHITECTURES_OVERRIDE) set(CMAKE_OSX_ARCHITECTURES ${OSX_ARCHITECTURES_OVERRIDE}) endif() if(APPLE) message(STATUS "Compiling for Mac OS X architecture(s): " ${CMAKE_OSX_ARCHITECTURES}) endif() camp-0.8.1/cmake/Modules/000077500000000000000000000000001315645501200151325ustar00rootroot00000000000000camp-0.8.1/cmake/Modules/FindCAMP.cmake000066400000000000000000000020601315645501200174530ustar00rootroot00000000000000# Locate CAMP library # This module defines # CAMP_FOUND, if false, do not try to link to CAMP # CAMP_LIBRARIES # CAMP_INCLUDE_DIR, where to find camp/version.hpp FIND_PATH(CAMP_INCLUDE_DIR camp/version.hpp HINTS $ENV{CAMP_DIR} PATH_SUFFIXES include PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\Tegesoft\\CAMP] ~/Library/Frameworks /Library/Frameworks /usr/local /usr /sw # Fink /opt/local # DarwinPorts /opt/csw # Blastwave /opt ) FIND_LIBRARY(CAMP_LIBRARY NAMES camp HINTS $ENV{CAMP_DIR} PATH_SUFFIXES lib64 lib PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\Tegesoft\\CAMP] ~/Library/Frameworks /Library/Frameworks /usr/local /usr /sw /opt/local /opt/csw /opt ) SET(CAMP_LIBRARIES "${CAMP_LIBRARY}" CACHE STRING "CAMP Libraries") INCLUDE(FindPackageHandleStandardArgs) # handle the QUIETLY and REQUIRED arguments and set CAMP_FOUND to TRUE if # all listed variables are TRUE FIND_PACKAGE_HANDLE_STANDARD_ARGS(CAMP DEFAULT_MSG CAMP_LIBRARIES CAMP_INCLUDE_DIR) MARK_AS_ADVANCED(CAMP_INCLUDE_DIR CAMP_LIBRARIES CAMP_LIBRARY) camp-0.8.1/cmake/PackageFilename.cmake000066400000000000000000000057671315645501200175370ustar00rootroot00000000000000############################################################################### ## ## Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ## Contact: Tegesoft Information (contact@tegesoft.com) ## ## This file is part of the CAMP library. ## ## The MIT License (MIT) ## ## Copyright (c) 2009-2014 TEGESO/TEGESOFT ## ## 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. ## ############################################################################### ############################### # generate package filename # setup CPACK_PACKAGE_FILE_NAME and CPACK_SOURCE_PACKAGE_FILE_NAME according to # the current build architecture, system and compiler # Note that CPACK_PACKAGE_NAME and VERSION_STR must be defined ############################### # detect architecture include(CheckTypeSize) check_type_size(void* SIZEOF_VOID_PTR) if(${SIZEOF_VOID_PTR} MATCHES "^8$") set(NATIVE_ARCH 64) else() set(NATIVE_ARCH 32) endif() # detect system if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") set(PACKAGE_SYSTEM_NAME "linux${NATIVE_ARCH}") elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") set(PACKAGE_SYSTEM_NAME "win${NATIVE_ARCH}") elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(PACKAGE_SYSTEM_NAME "osx") else() message(WARNING "Unsupported system for package generation") return() endif() #detect compiler if(CMAKE_COMPILER_IS_GNUCXX) set(PACKAGE_COMPILER_NAME "gcc") if(WIN32) execute_process(COMMAND "${CMAKE_CXX_COMPILER}" "-dumpversion" OUTPUT_VARIABLE GCC_VERSION_OUTPUT) string(REGEX REPLACE "([0-9]+\\.[0-9]+).*" "\\1" GCC_VERSION "${GCC_VERSION_OUTPUT}") set(PACKAGE_COMPILER_NAME ${PACKAGE_COMPILER_NAME}${GCC_VERSION}) endif() elseif(MSVC_VERSION EQUAL 1400) set(PACKAGE_COMPILER_NAME "vc2005") elseif(MSVC_VERSION EQUAL 1500) set(PACKAGE_COMPILER_NAME "vc2008") elseif(MSVC_VERSION EQUAL 1600) set(PACKAGE_COMPILER_NAME "vc2010") else() message(WARNING "Unsupported compiler for package generation") return() endif() camp-0.8.1/cmake/Packaging.cmake000066400000000000000000000113221315645501200164070ustar00rootroot00000000000000############################################################################### ## ## Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ## Contact: Tegesoft Information (contact@tegesoft.com) ## ## This file is part of the CAMP library. ## ## The MIT License (MIT) ## ## Copyright (c) 2009-2014 TEGESO/TEGESOFT ## ## 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. ## ############################################################################### ############################### # packaging ############################### # Components setup set(CPACK_COMPONENTS_ALL bin devel apidoc utils) set(CPACK_ALL_INSTALL_TYPES Runtime Development) set(CPACK_COMPONENT_BIN_DISPLAY_NAME "CAMP library") set(CPACK_COMPONENT_BIN_DESCRIPTION "The CAMP library binaries") set(CPACK_COMPONENT_BIN_INSTALL_TYPES Runtime Development) set(CPACK_COMPONENT_DEVEL_DISPLAY_NAME "CAMP development files") set(CPACK_COMPONENT_DEVEL_DESCRIPTION "C++ header files, import library") set(CPACK_COMPONENT_DEVEL_DEPENDS bin) set(CPACK_COMPONENT_DEVEL_GROUP "Development") set(CPACK_COMPONENT_DEVEL_INSTALL_TYPES Development) set(CPACK_COMPONENT_APIDOC_DISPLAY_NAME "CAMP API documentation") set(CPACK_COMPONENT_APIDOC_DESCRIPTION "Documentation for developers") set(CPACK_COMPONENT_APIDOC_GROUP "Development") set(CPACK_COMPONENT_APIDOC_INSTALL_TYPES Development) set(CPACK_COMPONENT_UTILS_DISPLAY_NAME "CAMP utilities") set(CPACK_COMPONENT_UTILS_DESCRIPTION "Provides a FindCAMP.cmake file to be used with project based on CMake" ) set(CPACK_COMPONENT_UTILS_GROUP "Development") set(CPACK_COMPONENT_UTILS_DISABLED TRUE) set(CPACK_COMPONENT_GROUP_DEVELOPMENT_DESCRIPTION "Components related to software development based on CAMP") set(CPACK_COMPONENT_GROUP_DEVELOPMENT_EXPANDED TRUE) # Package setup set(CPACK_PACKAGE_NAME CAMP) set(CPACK_PACKAGE_VENDOR Tegesoft) set(CPACK_PACKAGE_VERSION_MAJOR ${VERSION_MAJOR}) set(CPACK_PACKAGE_VERSION_MINOR ${VERSION_MINOR}) set(CPACK_PACKAGE_VERSION_PATCH ${VERSION_PATCH}) set(CPACK_PACKAGE_DESCRIPTION_FILE ${CAMP_SOURCE_DIR}/README.txt) set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "CAMP is a multi-purpose C++ reflection library") set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_VENDOR}\\\\camp) set(CPACK_RESOURCE_FILE_LICENSE ${CAMP_SOURCE_DIR}/COPYING.txt) set(CPACK_RESOURCE_FILE_README ${CAMP_SOURCE_DIR}/README.txt) set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY CAMP) # Package filename setup include(${CMAKE_SOURCE_DIR}/cmake/PackageFilename.cmake) # set package file name string(TOLOWER ${CPACK_PACKAGE_NAME} LOWER_PACKAGE_NAME) set(CPACK_PACKAGE_FILE_NAME ${LOWER_PACKAGE_NAME}-${VERSION_STR}-${PACKAGE_SYSTEM_NAME}-${PACKAGE_COMPILER_NAME}) set(CPACK_SOURCE_PACKAGE_FILE_NAME ${LOWER_PACKAGE_NAME}-${VERSION_STR}-src) if(WIN32 AND NOT UNIX) set(CPACK_GENERATOR ZIP;NSIS) elseif(UNIX AND NOT APPLE) set(CPACK_GENERATOR TGZ;TBZ2) elseif(APPLE) set(CPACK_GENERATOR TGZ;TBZ2;PackageMaker) endif() set(CPACK_SOURCE_GENERATOR TGZ;ZIP) file(GLOB IGNORED_DOT_FILES ".*") set(CPACK_SOURCE_IGNORE_FILES ${IGNORED_DOT_FILES} ) # NSIS setup #set(CPACK_NSIS_MUI_ICON ${CAMP_SOURCE_DIR}/doc/images\\\\logo.ico) #set(CPACK_NSIS_MUI_UNIICON ${CAMP_SOURCE_DIR}/doc/images\\\\logo.ico) set(CPACK_PACKAGE_ICON ${CAMP_SOURCE_DIR}/doc/images\\\\logo_package.bmp) #set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS) #set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS) #set(CPACK_NSIS_COMPRESSOR) #set(CPACK_NSIS_MODIFY_PATH) set(CPACK_NSIS_DISPLAY_NAME CAMP) #set(CPACK_NSIS_INSTALLED_ICON_NAME) set(CPACK_NSIS_HELP_LINK "http://dev.tegesoft.com") set(CPACK_NSIS_URL_INFO_ABOUT "http://dev.tegesoft.com") set(CPACK_NSIS_CONTACT "contact@tegesoft.com") #set(CPACK_NSIS_CREATE_ICONS_EXTRA) #set(CPACK_NSIS_DELETE_ICONS_EXTRA) include(CPack) camp-0.8.1/cmake/camp.pc.in000066400000000000000000000003441315645501200153740ustar00rootroot00000000000000prefix=@CMAKE_INSTALL_PREFIX@ includedir=${prefix}/include libdir=${prefix}/lib Name: camp Description: CAMP is a multi-purpose reflection library for C++ Version: @VERSION_STR@ CFlags: -I${includedir} Libs: -L${libdir} -lcamp camp-0.8.1/doc/000077500000000000000000000000001315645501200132075ustar00rootroot00000000000000camp-0.8.1/doc/CMakeLists.txt000066400000000000000000000065151315645501200157560ustar00rootroot00000000000000############################################################################### ## ## Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ## Contact: Tegesoft Information (contact@tegesoft.com) ## ## This file is part of the CAMP library. ## ## The MIT License (MIT) ## ## Copyright (c) 2009-2014 TEGESO/TEGESOFT ## ## 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. ## ############################################################################### ############################### # doc ############################### find_package(Doxygen) if(DOXYGEN_FOUND) # setup variables to be replaced in the source Doxyfile set(DOXYGEN_INPUT_DIR ${CMAKE_SOURCE_DIR}) ################################### # local documentation ################################### set(DOXYGEN_OUTPUT_TYPE html) set(DOXYGEN_CONFIGURED_INPUT ${CMAKE_BINARY_DIR}/doc/campapi.doxy) set(DOXYGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/doc/api) if(WIN32) set(DOXYGEN_GENERATE_MAN NO) find_program(HHC_PROGRAM NAMES hhc.exe PATHS "c:/Program Files/HTML Help Workshop" DOC "HTML Help Compiler program") if(HHC_PROGRAM) set(DOXYGEN_GENERATE_HTMLHELP YES) else() set(DOXYGEN_GENERATE_HTMLHELP NO) endif() else() set(DOXYGEN_GENERATE_MAN NO) set(DOXYGEN_GENERATE_HTMLHELP NO) set(HHC_PROGRAM) endif() # configure the source Doxyfile by copying it and replacing all @variables@ configure_file(${DOXYGEN_INPUT_DIR}/doc/api/Doxyfile.in ${DOXYGEN_CONFIGURED_INPUT} @ONLY) # copy necessary doc files file(GLOB image_files ${DOXYGEN_INPUT_DIR}/doc/api/images/*) foreach(file ${image_files}) get_filename_component(filename ${file} NAME) configure_file(${file} ${DOXYGEN_OUTPUT_DIR}/${DOXYGEN_OUTPUT_TYPE}/${filename} COPYONLY) endforeach() # target setup add_custom_target(doc COMMAND ${CMAKE_COMMAND} -E echo_append "Building API Documentation..." COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_CONFIGURED_INPUT} COMMAND ${CMAKE_COMMAND} -E echo "Done." WORKING_DIRECTORY ${DOXYGEN_INPUT_DIR} ) # install install(DIRECTORY ${DOXYGEN_OUTPUT_DIR} DESTINATION ${INSTALL_MISC_DIR}/doc COMPONENT apidoc ) endif() camp-0.8.1/doc/api/000077500000000000000000000000001315645501200137605ustar00rootroot00000000000000camp-0.8.1/doc/api/Doxyfile.in000066400000000000000000001772451315645501200161130ustar00rootroot00000000000000# Doxyfile 1.5.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project # # All text after a hash (#) is considered a comment and will be ignored # The format is: # TAG = value [value, ...] # For lists items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (" ") #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the config file # that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # http://www.gnu.org/software/libiconv for the list of possible encodings. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded # by quotes) that should identify the project. PROJECT_NAME = CAMP # The PROJECT_NUMBER tag can be used to enter a project or revision number. # This could be handy for archiving the generated documentation or # if some version control system is used. PROJECT_NUMBER = @VERSION_MAJOR@.@VERSION_MINOR@ # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. OUTPUT_DIRECTORY = "@DOXYGEN_OUTPUT_DIR@" # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create # 4096 sub-directories (in 2 levels) under the output directory of each output # format and will distribute the generated files over these directories. # Enabling this option can be useful when feeding doxygen a huge amount of # source files, where putting all generated files in the same directory would # otherwise cause performance problems for the file system. CREATE_SUBDIRS = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # The default language is English, other supported languages are: # Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, # Croatian, Czech, Danish, Dutch, Farsi, Finnish, French, German, Greek, # Hungarian, Italian, Japanese, Japanese-en (Japanese with English messages), # Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, Polish, # Portuguese, Romanian, Russian, Serbian, Serbian-Cyrilic, Slovak, Slovene, # Spanish, Swedish, and Ukrainian. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will # include brief member descriptions after the members that are listed in # the file and class documentation (similar to JavaDoc). # Set to NO to disable this. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend # the brief description of a member or function before the detailed description. # Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator # that is used to form the text in various listings. Each string # in this list, if found as the leading text of the brief description, will be # stripped from the text and the result after processing the whole list, is # used as the annotated text. Otherwise, the brief description is used as-is. # If left blank, the following values are used ("$name" is automatically # replaced with the name of the entity): "The $name class" "The $name widget" # "The $name file" "is" "provides" "specifies" "contains" # "represents" "a" "an" "the" ABBREVIATE_BRIEF = "The $name class" \ "The $name widget" \ "The $name file" \ is \ provides \ specifies \ contains \ represents \ a \ an \ the # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # Doxygen will generate a detailed section even if there is only a brief # description. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. INLINE_INHERITED_MEMB = YES # If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full # path before files name in the file list and in the header files. If set # to NO the shortest path that makes the file name unique will be used. FULL_PATH_NAMES = NO # If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag # can be used to strip a user-defined part of the path. Stripping is # only done if one of the specified strings matches the left-hand part of # the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the # path to strip. STRIP_FROM_PATH = # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of # the path mentioned in the documentation of a class, which tells # the reader which header file to include in order to use a class. # If left blank only the name of the header file containing the class # definition is used. Otherwise one should specify the include paths that # are normally passed to the compiler using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter # (but less readable) file names. This can be useful is your file systems # doesn't support long names like on DOS, Mac, or CD-ROM. SHORT_NAMES = YES # If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen # will interpret the first line (until the first dot) of a JavaDoc-style # comment as the brief description. If set to NO, the JavaDoc # comments will behave just like regular Qt-style comments # (thus requiring an explicit @brief command for a brief description.) JAVADOC_AUTOBRIEF = NO # If the QT_AUTOBRIEF tag is set to YES then Doxygen will # interpret the first line (until the first dot) of a Qt-style # comment as the brief description. If set to NO, the comments # will behave just like regular Qt-style comments (thus requiring # an explicit \brief command for a brief description.) QT_AUTOBRIEF = NO # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen # treat a multi-line C++ special comment block (i.e. a block of //! or /// # comments) as a brief description. This used to be the default behaviour. # The new default is to treat a multi-line C++ comment block as a detailed # description. Set this tag to YES if you prefer the old behaviour instead. MULTILINE_CPP_IS_BRIEF = NO # If the INHERIT_DOCS tag is set to YES (the default) then an undocumented # member inherits the documentation from any documented member that it # re-implements. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce # a new page for each member. If set to NO, the documentation of a member will # be part of the file/class/namespace that contains it. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. # Doxygen uses this value to replace tabs by spaces in code fragments. TAB_SIZE = 4 # This tag can be used to specify a number of aliases that acts # as commands in the documentation. An alias has the form "name=value". # For example adding "sideeffect=\par Side Effects:\n" will allow you to # put the command \sideeffect (or @sideeffect) in the documentation, which # will result in a user-defined paragraph with heading "Side Effects:". # You can put \n's in the value part of an alias to insert newlines. ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C # sources only. Doxygen will then generate output that is more tailored for C. # For instance, some of the names that are used will be different. The list # of all members will be omitted, etc. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java # sources only. Doxygen will then generate output that is more tailored for # Java. For instance, namespaces will be presented as packages, qualified # scopes will look different, etc. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources only. Doxygen will then generate output that is more tailored for # Fortran. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for # VHDL. OPTIMIZE_OUTPUT_VHDL = NO # Doxygen selects the parser to use depending on the extension of the files it parses. # With this tag you can assign which parser to use for a given extension. # Doxygen has a built-in mapping, but you can override or extend it using this tag. # The format is ext=language, where ext is a file extension, and language is one of # the parsers supported by doxygen: IDL, Java, Javascript, C#, C, C++, D, PHP, # Objective-C, Python, Fortran, VHDL, C, C++. For instance to make doxygen treat # .inc files as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C EXTENSION_MAPPING = # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should # set this tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); v.s. # func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. # Doxygen will parse them like normal C++ but will assume all classes use public # instead of private inheritance when no explicit protection keyword is present. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate getter # and setter methods for a property. Setting this option to YES (the default) # will make doxygen to replace the get and set methods by a property in the # documentation. This will only work if the methods are indeed getting or # setting a simple type. If this is not the case, or you want to show the # methods anyway, you should set this option to NO. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES, then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. DISTRIBUTE_GROUP_DOC = NO # Set the SUBGROUPING tag to YES (the default) to allow class member groups of # the same type (for instance a group of public functions) to be put as a # subgroup of that type (e.g. under the Public Functions section). Set it to # NO to prevent subgrouping. Alternatively, this can be done per class using # the \nosubgrouping command. SUBGROUPING = YES # When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum # is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically # be useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. TYPEDEF_HIDES_STRUCT = NO # The SYMBOL_CACHE_SIZE determines the size of the internal cache use to # determine which symbols to keep in memory and which to flush to disk. # When the cache is full, less often used symbols will be written to disk. # For small to medium size projects (<1000 input files) the default value is # probably good enough. For larger projects a too small cache size can cause # doxygen to be busy swapping symbols to and from disk most of the time # causing a significant performance penality. # If the system has enough physical memory increasing the cache will improve the # performance by keeping more symbols in memory. Note that the value works on # a logarithmic scale so increasing the size by one will rougly double the # memory usage. The cache size is given by this formula: # 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, # corresponding to a cache size of 2^16 = 65536 symbols SYMBOL_CACHE_SIZE = 0 #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in # documentation are documented, even if no documentation was available. # Private class members and static file members will be hidden unless # the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES EXTRACT_ALL = NO # If the EXTRACT_PRIVATE tag is set to YES all private members of a class # will be included in the documentation. EXTRACT_PRIVATE = NO # If the EXTRACT_STATIC tag is set to YES all static members of a file # will be included in the documentation. EXTRACT_STATIC = NO # If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) # defined locally in source files will be included in the documentation. # If set to NO only classes defined in header files are included. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. When set to YES local # methods, which are defined in the implementation section but not in # the interface are included in the documentation. # If set to NO (the default) only methods in the interface are included. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base # name of the file that contains the anonymous namespace. By default # anonymous namespace are hidden. EXTRACT_ANON_NSPACES = NO # If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all # undocumented members of documented classes, files or namespaces. # If set to NO (the default) these members will be included in the # various overviews, but no documentation section is generated. # This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_MEMBERS = YES # If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. # If set to NO (the default) these classes will be included in the various # overviews. This option has no effect if EXTRACT_ALL is enabled. HIDE_UNDOC_CLASSES = YES # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all # friend (class|struct|union) declarations. # If set to NO (the default) these declarations will be included in the # documentation. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any # documentation blocks found inside the body of a function. # If set to NO (the default) these blocks will be appended to the # function's detailed documentation block. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation # that is typed after a \internal command is included. If the tag is set # to NO (the default) then the documentation will be excluded. # Set it to YES to include the internal documentation. INTERNAL_DOCS = NO # If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate # file names in lower-case letters. If set to YES upper-case letters are also # allowed. This is useful if you have classes or files whose names only differ # in case and if your file system supports case sensitive file names. Windows # and Mac users are advised to set this option to NO. CASE_SENSE_NAMES = NO # If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen # will show members with their full class and namespace scopes in the # documentation. If set to YES the scope will be hidden. HIDE_SCOPE_NAMES = NO # If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen # will put a list of the files that are included by a file in the documentation # of that file. SHOW_INCLUDE_FILES = YES # If the INLINE_INFO tag is set to YES (the default) then a tag [inline] # is inserted in the documentation for inline members. INLINE_INFO = NO # If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen # will sort the (detailed) documentation of file and class members # alphabetically by member name. If set to NO the members will appear in # declaration order. SORT_MEMBER_DOCS = YES # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the # brief documentation of file, namespace and class members alphabetically # by member name. If set to NO (the default) the members will appear in # declaration order. SORT_BRIEF_DOCS = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the # hierarchy of group names into alphabetical order. If set to NO (the default) # the group names will appear in their defined order. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be # sorted by fully-qualified names, including namespaces. If set to # NO (the default), the class list will be sorted only by class name, # not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the # alphabetical list. SORT_BY_SCOPE_NAME = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or # disable (NO) the todo list. This list is created by putting \todo # commands in the documentation. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or # disable (NO) the test list. This list is created by putting \test # commands in the documentation. GENERATE_TESTLIST = NO # The GENERATE_BUGLIST tag can be used to enable (YES) or # disable (NO) the bug list. This list is created by putting \bug # commands in the documentation. GENERATE_BUGLIST = NO # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or # disable (NO) the deprecated list. This list is created by putting # \deprecated commands in the documentation. GENERATE_DEPRECATEDLIST= NO # The ENABLED_SECTIONS tag can be used to enable conditional # documentation sections, marked by \if sectionname ... \endif. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines # the initial value of a variable or define consists of for it to appear in # the documentation. If the initializer consists of more lines than specified # here it will be hidden. Use a value of 0 to hide initializers completely. # The appearance of the initializer of individual variables and defines in the # documentation can be controlled using \showinitializer or \hideinitializer # command in the documentation regardless of this setting. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated # at the bottom of the documentation of classes and structs. If set to YES the # list will mention the files that were used to generate the documentation. SHOW_USED_FILES = YES # If the sources in your project are distributed over multiple directories # then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy # in the documentation. The default is NO. SHOW_DIRECTORIES = NO # Set the SHOW_FILES tag to NO to disable the generation of the Files page. # This will remove the Files entry from the Quick Index and from the # Folder Tree View (if specified). The default is YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the # Namespaces page. This will remove the Namespaces entry from the Quick Index # and from the Folder Tree View (if specified). The default is YES. SHOW_NAMESPACES = YES # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command , where is the value of # the FILE_VERSION_FILTER tag, and is the name of an input file # provided by doxygen. Whatever the program writes to standard output # is used as the file version. See the manual for examples. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed by # doxygen. The layout file controls the global structure of the generated output files # in an output format independent way. The create the layout file that represents # doxygen's defaults, run doxygen with the -l option. You can optionally specify a # file name after the option, if omitted DoxygenLayout.xml will be used as the name # of the layout file. LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated # by doxygen. Possible values are YES and NO. If left blank NO is used. QUIET = NO # The WARNINGS tag can be used to turn on/off the warning messages that are # generated by doxygen. Possible values are YES and NO. If left blank # NO is used. WARNINGS = YES # If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings # for undocumented members. If EXTRACT_ALL is set to YES then this flag will # automatically be disabled. WARN_IF_UNDOCUMENTED = YES # If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as not documenting some # parameters in a documented function, or documenting parameters that # don't exist or using markup commands wrongly. WARN_IF_DOC_ERROR = YES # This WARN_NO_PARAMDOC option can be abled to get warnings for # functions that are documented, but have no documentation for their parameters # or return value. If set to NO (the default) doxygen will only warn about # wrong or incomplete parameter documentation, but not about the absence of # documentation. WARN_NO_PARAMDOC = YES # The WARN_FORMAT tag determines the format of the warning messages that # doxygen can produce. The string should contain the $file, $line, and $text # tags, which will be replaced by the file and line number from which the # warning originated and the warning text. Optionally the format may contain # $version, which will be replaced by the version of the file (if it could # be obtained via FILE_VERSION_FILTER) WARN_FORMAT = "$file:$line: $text" # The WARN_LOGFILE tag can be used to specify a file to which warning # and error messages should be written. If left blank the output is written # to stderr. WARN_LOGFILE = #--------------------------------------------------------------------------- # configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag can be used to specify the files and/or directories that contain # documented source files. You may enter file names like "myfile.cpp" or # directories like "/usr/src/myproject". Separate the files or directories # with spaces. INPUT = "@DOXYGEN_INPUT_DIR@/include/camp" \ "@DOXYGEN_INPUT_DIR@/doc/api/mainpage.hpp" # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is # also the default input encoding. Doxygen uses libiconv (or the iconv built # into libc) for the transcoding. See http://www.gnu.org/software/libiconv for # the list of possible encodings. INPUT_ENCODING = UTF-8 # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank the following patterns are tested: # *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx # *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py *.f90 FILE_PATTERNS = *.c \ *.cc \ *.cxx \ *.cpp \ *.c++ \ *.d \ *.java \ *.ii \ *.ixx \ *.ipp \ *.i++ \ *.inl \ *.h \ *.hh \ *.hxx \ *.hpp \ *.h++ \ *.idl \ *.odl \ *.cs \ *.php \ *.php3 \ *.inc \ *.m \ *.mm \ *.dox \ *.py \ *.f90 \ *.f \ *.vhd \ *.vhdl # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. # If left blank NO is used. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. EXCLUDE = detail # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded # from the input. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. Note that the wildcards are matched # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # AClass::ANamespace, ANamespace::*Test EXCLUDE_SYMBOLS = detail # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see # the \include command). EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp # and *.h) to filter out the source-files in the directories. If left # blank all files are included. EXAMPLE_PATTERNS = * # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude # commands irrespective of the value of the RECURSIVE tag. # Possible values are YES and NO. If left blank NO is used. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or # directories that contain image that are included in the documentation (see # the \image command). IMAGE_PATH = "@DOXYGEN_INPUT_DIR@/doc/api/images" # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command , where # is the value of the INPUT_FILTER tag, and is the name of an # input file. Doxygen will then use the output that the filter program writes # to standard output. If FILTER_PATTERNS is specified, this tag will be # ignored. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: # pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further # info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER # is applied to all files. FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will be used to filter the input files when producing source # files to browse (i.e. when SOURCE_BROWSER is set to YES). FILTER_SOURCE_FILES = NO #--------------------------------------------------------------------------- # configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will # be generated. Documented entities will be cross-referenced with these sources. # Note: To get rid of all source code in the generated output, make sure also # VERBATIM_HEADERS is set to NO. SOURCE_BROWSER = NO # Setting the INLINE_SOURCES tag to YES will include the body # of functions and classes directly in the documentation. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct # doxygen to hide any special comment blocks from generated source code # fragments. Normal C and C++ comments will always remain visible. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES # then for each documented function all documented # functions referencing it will be listed. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES # then for each documented function all documented entities # called/used by that function will be listed. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES (the default) # and SOURCE_BROWSER tag is set to YES, then the hyperlinks from # functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will # link to the source code. Otherwise they will link to the documentation. REFERENCES_LINK_SOURCE = YES # If the USE_HTAGS tag is set to YES then the references to source code # will point to the HTML generated by the htags(1) tool instead of doxygen # built-in source browser. The htags tool is part of GNU's global source # tagging system (see http://www.gnu.org/software/global/global.html). You # will need version 4.8.6 or higher. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen # will generate a verbatim copy of the header file for each class for # which an include is specified. Set to NO to disable this. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index # of all compounds will be generated. Enable this if the project # contains a lot of classes, structs, unions or interfaces. ALPHABETICAL_INDEX = NO # If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then # the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns # in which this list will be split (can be a number in the range [1..20]) COLS_IN_ALPHA_INDEX = 5 # In case all classes in a project start with a common prefix, all # classes will be put under the same header in the alphabetical index. # The IGNORE_PREFIX tag can be used to specify one or more prefixes that # should be ignored while generating the index headers. IGNORE_PREFIX = #--------------------------------------------------------------------------- # configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES (the default) Doxygen will # generate HTML output. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `html' will be used as the default path. HTML_OUTPUT = @DOXYGEN_OUTPUT_TYPE@ # The HTML_FILE_EXTENSION tag can be used to specify the file extension for # each generated HTML page (for example: .htm,.php,.asp). If it is left blank # doxygen will generate files with .html extension. HTML_FILE_EXTENSION = .@DOXYGEN_OUTPUT_TYPE@ # The HTML_HEADER tag can be used to specify a personal HTML header for # each generated HTML page. If it is left blank doxygen will generate a # standard header. HTML_HEADER = "@DOXYGEN_INPUT_DIR@/doc/api/header.@DOXYGEN_OUTPUT_TYPE@" # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. HTML_FOOTER = "@DOXYGEN_INPUT_DIR@/doc/api/footer.@DOXYGEN_OUTPUT_TYPE@" # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet. Note that doxygen will try to copy # the style sheet file to the HTML output directory, so don't put your own # stylesheet in the HTML output directory as well, or it will be erased! HTML_STYLESHEET = # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to # NO a bullet list will be used. HTML_ALIGN_MEMBERS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. For this to work a browser that supports # JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox # Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). HTML_DYNAMIC_SECTIONS = NO # If the GENERATE_DOCSET tag is set to YES, additional index files # will be generated that can be used as input for Apple's Xcode 3 # integrated development environment, introduced with OSX 10.5 (Leopard). # To create a documentation set, doxygen will generate a Makefile in the # HTML output directory. Running make will produce the docset in that # directory and running "make install" will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find # it at startup. # See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html for more information. GENERATE_DOCSET = NO # When GENERATE_DOCSET tag is set to YES, this tag determines the name of the # feed. A documentation feed provides an umbrella under which multiple # documentation sets from a single provider (such as a company or product suite) # can be grouped. DOCSET_FEEDNAME = "Doxygen generated docs" # When GENERATE_DOCSET tag is set to YES, this tag specifies a string that # should uniquely identify the documentation set bundle. This should be a # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. DOCSET_BUNDLE_ID = org.doxygen.Project # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the # Microsoft HTML help workshop to generate a compiled HTML help file (.chm) # of the generated HTML documentation. GENERATE_HTMLHELP = @DOXYGEN_GENERATE_HTMLHELP@ # If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can # be used to specify the file name of the resulting .chm file. You # can add a path in front of the file if the result should not be # written to the html output directory. CHM_FILE = ../camp.chm # If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can # be used to specify the location (absolute path including file name) of # the HTML help compiler (hhc.exe). If non-empty doxygen will try to run # the HTML help compiler on the generated index.hhp. HHC_LOCATION = "@HHC_PROGRAM@" # If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag # controls if a separate .chi index file is generated (YES) or that # it should be included in the master .chm file (NO). GENERATE_CHI = NO # If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING # is used to encode HtmlHelp index (hhk), content (hhc) and project file # content. CHM_INDEX_ENCODING = # If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag # controls whether a binary table of contents is generated (YES) or a # normal table of contents (NO) in the .chm file. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members # to the contents of the HTML help documentation and to the tree view. TOC_EXPAND = NO # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and QHP_VIRTUAL_FOLDER # are set, an additional index file will be generated that can be used as input for # Qt's qhelpgenerator to generate a Qt Compressed Help (.qch) of the generated # HTML documentation. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can # be used to specify the file name of the resulting .qch file. # The path specified is relative to the HTML output folder. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#namespace QHP_NAMESPACE = camp # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating # Qt Help Project output. For more information please see # http://doc.trolltech.com/qthelpproject.html#virtual-folders QHP_VIRTUAL_FOLDER = camp # If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to add. # For more information please see # http://doc.trolltech.com/qthelpproject.html#custom-filters QHP_CUST_FILTER_NAME = # The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the custom filter to add.For more information please see # Qt Help Project / Custom Filters. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this project's # filter section matches. # Qt Help Project / Filter Attributes. QHP_SECT_FILTER_ATTRS = # If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can # be used to specify the location of Qt's qhelpgenerator. # If non-empty doxygen will try to run qhelpgenerator on the generated # .qhp file. QHG_LOCATION = # The DISABLE_INDEX tag can be used to turn on/off the condensed index at # top of each HTML page. The value NO (the default) enables the index and # the value YES disables it. DISABLE_INDEX = NO # This tag can be used to set the number of enum values (range [1..20]) # that doxygen will group on one line in the generated HTML documentation. ENUM_VALUES_PER_LINE = 1 # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. # If the tag value is set to FRAME, a side panel will be generated # containing a tree-like index structure (just like the one that # is generated for HTML Help). For this to work a browser that supports # JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, # Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are # probably better off using the HTML help feature. Other possible values # for this tag are: HIERARCHIES, which will generate the Groups, Directories, # and Class Hierarchy pages using a tree view instead of an ordered list; # ALL, which combines the behavior of FRAME and HIERARCHIES; and NONE, which # disables this behavior completely. For backwards compatibility with previous # releases of Doxygen, the values YES and NO are equivalent to FRAME and NONE # respectively. GENERATE_TREEVIEW = NONE # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be # used to set the initial width (in pixels) of the frame in which the tree # is shown. TREEVIEW_WIDTH = 250 # Use this tag to change the font size of Latex formulas included # as images in the HTML documentation. The default is 10. Note that # when you change the font size after a successful doxygen run you need # to manually remove any form_*.png images from the HTML output directory # to force them to be regenerated. FORMULA_FONTSIZE = 10 #--------------------------------------------------------------------------- # configuration options related to the LaTeX output #--------------------------------------------------------------------------- # If the GENERATE_LATEX tag is set to YES (the default) Doxygen will # generate Latex output. GENERATE_LATEX = NO # The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `latex' will be used as the default path. LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. If left blank `latex' will be used as the default command name. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to # generate index for LaTeX. If left blank `makeindex' will be used as the # default command name. MAKEINDEX_CMD_NAME = makeindex # If the COMPACT_LATEX tag is set to YES Doxygen generates more compact # LaTeX documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_LATEX = NO # The PAPER_TYPE tag can be used to set the paper type that is used # by the printer. Possible values are: a4, a4wide, letter, legal and # executive. If left blank a4wide will be used. PAPER_TYPE = a4wide # The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX # packages that should be included in the LaTeX output. EXTRA_PACKAGES = # The LATEX_HEADER tag can be used to specify a personal LaTeX header for # the generated latex document. The header should contain everything until # the first chapter. If it is left blank doxygen will generate a # standard header. Notice: only use this tag if you know what you are doing! LATEX_HEADER = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated # is prepared for conversion to pdf (using ps2pdf). The pdf file will # contain links (just like the HTML output) instead of page references # This makes the output suitable for online browsing using a pdf viewer. PDF_HYPERLINKS = YES # If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of # plain latex in the generated Makefile. Set this option to YES to get a # higher quality PDF documentation. USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. # command to the generated LaTeX files. This will instruct LaTeX to keep # running if errors occur, instead of asking the user for help. # This option is also used when generating formulas in HTML. LATEX_BATCHMODE = NO # If LATEX_HIDE_INDICES is set to YES then doxygen will not # include the index chapters (such as File Index, Compound Index, etc.) # in the output. LATEX_HIDE_INDICES = NO #--------------------------------------------------------------------------- # configuration options related to the RTF output #--------------------------------------------------------------------------- # If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output # The RTF output is optimized for Word 97 and may not look very pretty with # other RTF readers or editors. GENERATE_RTF = NO # The RTF_OUTPUT tag is used to specify where the RTF docs will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `rtf' will be used as the default path. RTF_OUTPUT = rtf # If the COMPACT_RTF tag is set to YES Doxygen generates more compact # RTF documents. This may be useful for small projects and may help to # save some trees in general. COMPACT_RTF = NO # If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated # will contain hyperlink fields. The RTF file will # contain links (just like the HTML output) instead of page references. # This makes the output suitable for online browsing using WORD or other # programs which support those fields. # Note: wordpad (write) and others do not support links. RTF_HYPERLINKS = NO # Load stylesheet definitions from file. Syntax is similar to doxygen's # config file, i.e. a series of assignments. You only have to provide # replacements, missing definitions are set to their default value. RTF_STYLESHEET_FILE = # Set optional variables used in the generation of an rtf document. # Syntax is similar to doxygen's config file. RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # configuration options related to the man page output #--------------------------------------------------------------------------- # If the GENERATE_MAN tag is set to YES (the default) Doxygen will # generate man pages GENERATE_MAN = @DOXYGEN_GENERATE_MAN@ # The MAN_OUTPUT tag is used to specify where the man pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `man' will be used as the default path. MAN_OUTPUT = man # The MAN_EXTENSION tag determines the extension that is added to # the generated man pages (default is the subroutine's section .3) MAN_EXTENSION = .3 # If the MAN_LINKS tag is set to YES and Doxygen generates man output, # then it will generate one additional man file for each entity # documented in the real man page(s). These additional files # only source the real man page, but without them the man command # would be unable to find the correct page. The default is NO. MAN_LINKS = NO #--------------------------------------------------------------------------- # configuration options related to the XML output #--------------------------------------------------------------------------- # If the GENERATE_XML tag is set to YES Doxygen will # generate an XML file that captures the structure of # the code including all documentation. GENERATE_XML = NO # The XML_OUTPUT tag is used to specify where the XML pages will be put. # If a relative path is entered the value of OUTPUT_DIRECTORY will be # put in front of it. If left blank `xml' will be used as the default path. XML_OUTPUT = xml # The XML_SCHEMA tag can be used to specify an XML schema, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_SCHEMA = # The XML_DTD tag can be used to specify an XML DTD, # which can be used by a validating XML parser to check the # syntax of the XML files. XML_DTD = # If the XML_PROGRAMLISTING tag is set to YES Doxygen will # dump the program listings (including syntax highlighting # and cross-referencing information) to the XML output. Note that # enabling this will significantly increase the size of the XML output. XML_PROGRAMLISTING = YES #--------------------------------------------------------------------------- # configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- # If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will # generate an AutoGen Definitions (see autogen.sf.net) file # that captures the structure of the code including all # documentation. Note that this feature is still experimental # and incomplete at the moment. GENERATE_AUTOGEN_DEF = NO #--------------------------------------------------------------------------- # configuration options related to the Perl module output #--------------------------------------------------------------------------- # If the GENERATE_PERLMOD tag is set to YES Doxygen will # generate a Perl module file that captures the structure of # the code including all documentation. Note that this # feature is still experimental and incomplete at the # moment. GENERATE_PERLMOD = NO # If the PERLMOD_LATEX tag is set to YES Doxygen will generate # the necessary Makefile rules, Perl scripts and LaTeX code to be able # to generate PDF and DVI output from the Perl module output. PERLMOD_LATEX = NO # If the PERLMOD_PRETTY tag is set to YES the Perl module output will be # nicely formatted so it can be parsed by a human reader. This is useful # if you want to understand what is going on. On the other hand, if this # tag is set to NO the size of the Perl module output will be much smaller # and Perl will parse it just the same. PERLMOD_PRETTY = YES # The names of the make variables in the generated doxyrules.make file # are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. # This is useful so different doxyrules.make files included by the same # Makefile don't overwrite each other's variables. PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor #--------------------------------------------------------------------------- # If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will # evaluate all C-preprocessor directives found in the sources and include # files. ENABLE_PREPROCESSING = YES # If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro # names in the source code. If set to NO (the default) only conditional # compilation will be performed. Macro expansion can be done in a controlled # way by setting EXPAND_ONLY_PREDEF to YES. MACRO_EXPANSION = YES # If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES # then the macro expansion is limited to the macros specified with the # PREDEFINED and EXPAND_AS_DEFINED tags. EXPAND_ONLY_PREDEF = YES # If the SEARCH_INCLUDES tag is set to YES (the default) the includes files # in the INCLUDE_PATH (see below) will be search if a #include is found. SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by # the preprocessor. INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the # directories. If left blank, the patterns specified with FILE_PATTERNS will # be used. INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that # are defined before the preprocessor is started (similar to the -D option of # gcc). The argument of the tag is a list of macros of the form: name # or name=definition (no spaces). If the definition and the = are # omitted =1 is assumed. To prevent a macro definition from being # undefined via #undef or recursively expanded use the := operator # instead of the = operator. PREDEFINED = CAMP_API= # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then # this tag can be used to specify a list of macro names that should be expanded. # The macro definition that is found in the sources will be used. # Use the PREDEFINED tag if you want to use a different macro definition. EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then # doxygen's preprocessor will remove all function-like macros that are alone # on a line, have an all uppercase name, and do not end with a semicolon. Such # function macros are typically used for boiler-plate code, and will confuse # the parser if not removed. SKIP_FUNCTION_MACROS = YES #--------------------------------------------------------------------------- # Configuration::additions related to external references #--------------------------------------------------------------------------- # The TAGFILES option can be used to specify one or more tagfiles. # Optionally an initial location of the external documentation # can be added for each tagfile. The format of a tag file without # this location is as follows: # TAGFILES = file1 file2 ... # Adding location for the tag files is done as follows: # TAGFILES = file1=loc1 "file2 = loc2" ... # where "loc1" and "loc2" can be relative or absolute paths or # URLs. If a location is present for each tag, the installdox tool # does not have to be run to correct the links. # Note that each tag file must have a unique name # (where the name does NOT include the path) # If a tag file is not located in the directory in which doxygen # is run, you must also specify the path to the tagfile here. TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create # a tag file that is based on the input files it reads. GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES all external classes will be listed # in the class index. If set to NO only the inherited external classes # will be listed. ALLEXTERNALS = NO # If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed # in the modules index. If set to NO, only the current project's groups will # be listed. EXTERNAL_GROUPS = YES # The PERL_PATH should be the absolute path and name of the perl script # interpreter (i.e. the result of `which perl'). PERL_PATH = /usr/bin/perl #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- # If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will # generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base # or super classes. Setting the tag to NO turns the diagrams off. Note that # this option is superseded by the HAVE_DOT option below. This is only a # fallback. It is recommended to install and use dot, since it yields more # powerful graphs. CLASS_DIAGRAMS = YES # You can define message sequence charts within doxygen comments using the \msc # command. Doxygen will then run the mscgen tool (see # http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the # documentation. The MSCGEN_PATH tag allows you to specify the directory where # the mscgen tool resides. If left empty the tool is assumed to be found in the # default search path. MSCGEN_PATH = # If set to YES, the inheritance and collaboration graphs will hide # inheritance and usage relations if the target is undocumented # or is not a class. HIDE_UNDOC_RELATIONS = YES # If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is # available from the path. This tool is part of Graphviz, a graph visualization # toolkit from AT&T and Lucent Bell Labs. The other options in this section # have no effect if this option is set to NO (the default) HAVE_DOT = NO # By default doxygen will write a font called FreeSans.ttf to the output # directory and reference it in all dot files that doxygen generates. This # font does not include all possible unicode characters however, so when you need # these (or just want a differently looking font) you can specify the font name # using DOT_FONTNAME. You need need to make sure dot is able to find the font, # which can be done by putting it in a standard location or by setting the # DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory # containing the font. DOT_FONTNAME = FreeSans # The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. # The default size is 10pt. DOT_FONTSIZE = 10 # By default doxygen will tell dot to use the output directory to look for the # FreeSans.ttf font (which doxygen will put there itself). If you specify a # different font using DOT_FONTNAME you can set the path where dot # can find it using this tag. DOT_FONTPATH = # If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect inheritance relations. Setting this tag to YES will force the # the CLASS_DIAGRAMS tag to NO. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen # will generate a graph for each documented class showing the direct and # indirect implementation dependencies (inheritance, containment, and # class references variables) of the class with other documented classes. COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen # will generate a graph for groups, showing the direct groups dependencies GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. UML_LOOK = NO # If set to YES, the inheritance and collaboration graphs will show the # relations between templates and their instances. TEMPLATE_RELATIONS = NO # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT # tags are set to YES then doxygen will generate a graph for each documented # file showing the direct and indirect include dependencies of the file with # other documented files. INCLUDE_GRAPH = YES # If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and # HAVE_DOT tags are set to YES then doxygen will generate a graph for each # documented header file showing the documented files that directly or # indirectly include this file. INCLUDED_BY_GRAPH = YES # If the CALL_GRAPH and HAVE_DOT options are set to YES then # doxygen will generate a call dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable call graphs # for selected functions only using the \callgraph command. CALL_GRAPH = NO # If the CALLER_GRAPH and HAVE_DOT tags are set to YES then # doxygen will generate a caller dependency graph for every global function # or class method. Note that enabling this option will significantly increase # the time of a run. So in most cases it will be better to enable caller # graphs for selected functions only using the \callergraph command. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen # will graphical hierarchy of all classes instead of a textual one. GRAPHICAL_HIERARCHY = YES # If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES # then doxygen will show the dependencies a directory has on other directories # in a graphical way. The dependency relations are determined by the #include # relations between the files in the directories. DIRECTORY_GRAPH = YES # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. Possible values are png, jpg, or gif # If left blank png will be used. DOT_IMAGE_FORMAT = png # The tag DOT_PATH can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the # \dotfile command). DOTFILE_DIRS = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of # nodes that will be shown in the graph. If the number of nodes in a graph # becomes larger than this value, doxygen will truncate the graph, which is # visualized by representing a node as a red box. Note that doxygen if the # number of direct children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note # that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the # graphs generated by dot. A depth value of 3 means that only nodes reachable # from the root by following a path via at most 3 edges will be shown. Nodes # that lay further from the root node will be omitted. Note that setting this # option to 1 or 2 may greatly reduce the computation time needed for large # code bases. Also note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_TRANSPARENT tag to YES to generate images with a transparent # background. This is disabled by default, because dot on Windows does not # seem to support this out of the box. Warning: Depending on the platform used, # enabling this option may lead to badly anti-aliased labels on the edges of # a graph (i.e. they become hard to read). DOT_TRANSPARENT = NO # Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) # support this, this feature is disabled by default. DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will # generate a legend page explaining the meaning of the various boxes and # arrows in the dot generated graphs. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES (the default) Doxygen will # remove the intermediate dot files that are used to generate # the various graphs. DOT_CLEANUP = YES #--------------------------------------------------------------------------- # Options related to the search engine #--------------------------------------------------------------------------- # The SEARCHENGINE tag specifies whether or not a search engine should be # used. If set to NO the values of all tags below this one will be ignored. SEARCHENGINE = NO camp-0.8.1/doc/api/footer.html000066400000000000000000000003351315645501200161450ustar00rootroot00000000000000

 ::  Copyright © 2009-2014 Tegesoft, all rights reserved  :: 

camp-0.8.1/doc/api/header.html000066400000000000000000000012361315645501200161000ustar00rootroot00000000000000 CAMP reference documentation
camp-0.8.1/doc/api/images/000077500000000000000000000000001315645501200152255ustar00rootroot00000000000000camp-0.8.1/doc/api/images/logo_camp.png000066400000000000000000000222571315645501200177030ustar00rootroot00000000000000PNG  IHDRZtEXtCreation Time 3ckytIME 7H. pHYs  ~$-IDATx] pՙ~=I6e0YH(Lr. UXD jM@P0%9rT5@ `;KƇ$[蘻}yC힣{4_:D`O'>} ,O`>f1|1B׵i5NgcD'*>gNM]Ϝ`U}>|D_H75M$F5-CT]%NZ.is)( 9u:l{M}.(YȡJܰNJSrrbIfS2O\si֓.hNTbZC\f"&aZ̀jFa0rJ|j35P۰iT> SMXbT hdT\6U7CaFh1=IOkŒkUc)#0%xjT6 S$%.8S\Xą,&WgS/uSiZB|SA᦬jfIZ3X&#iJNXJ bbv?dJQ]cΨ,)2{I=WOMU]EQ T+tĒFA. n6k$IJɬMPS&1LiFjJjRJN^Һ +6[fqmy'}(7*F`ˮ?:Ak*hKU6#T$2$(yIwf85 P%U qX u[0³`zfyp>ʉCoe M2S9MX8yvr%?~)-9h0;*W3%@čdɂw]y?雾_cx<>F#2_6Mr"=B(:3Lj?eT¥זxOatkI000k3 C/t:ObcaJ^#ʌ T*&('AZ)uw+iDyꁠL8SE_2c(2cjF8I%ɢ\s~pǬG o7H%S)j2StNi1 椇rI*C~$:#E8PÈPFss>H S9 FnpU'Y8m;<7B u,CuӜP%0]U`iTUyHkGrfR)]͈́tuJM9cvXrR7ߥ@*&A2N %}o|% q3 pBY$y:J^{>jxyCtCQ JR^v !&(yǩ եK<3D0V!ʌ %lUXQQؔ.xQƿ܏r3k@4 9{᪮cE+|N(L1]%12Jt5I:3rf{X d0_WImXJ䂙ߛ2K-y2|Okym>|xEQFڑ&b>/VHByٜ>"͢9K`ҲlY>)ŝ4I~eO"G9>_;G&CMDrCle0"C.VF$%~6rx5_@@N nAq) @'BZ*;MrW^ VNx<"L6ؽ0cGe#{XMSL O!dcpFF^;8bD{ m߈R3c]cwNj|{ճ3!2 ۷/yK/ڶm[>_~yϵ^۵z˗w<'|m9#4)Juuu=L&d||q*nR&ϢF!qXgQkc/Py]~/țFyf3s7svy>ryp|?҄اmY1hH0PZvݴ?D7h#nnkÆ +Vh/dVWWX_߿3,@ |'8Õ$1K5em ?ZS,YddϞ=s]ڵk&3ϔ57o^u}+|-[n}7MkSS]-'w۴iSk DzH: L$f6z.yPY "c5q[c&t=K)ڧ*?׷w}ȋ0Ԡ jeΝ?; Ι3{g ,wH$l0]ϒDZ^ y/ZyXBOVӴlud)&49>S^%s=)gX( ynw&ݤ]o@ ccWa ֠0NqJ`6GYNRڷ&XGY02 _>g[E!Ij̹=[N`?h״R爀I*ċb!)b;꓆{IJ}W<z&;(w-D\#ܟo qmqȯ9ve_C6z$LgrF&0E+ |Ks|sy"_]ݯT@^ m>ӞV(7nl]^!16P4F~aK> YtNn`8ob43SUWl$ WA+}rE]G+fJeo5Qz,a)THܛ?[pKRo}[7)R4ݚN*Nc˭>`6;7)H`a˺߫PzͶ fE˥P_7&rr#C^Z<.HRl0L5+51J 6vHE 5~o>[#>xn$-=o]u.#bl_6eH{n 5JI\]"^Zf Kݨ/088Xg9E8^/D"4 M U4k Lh.Tg;l#o3{Я+ ΑL܁N@uCc %wn Y_Kq Rt/bI7 >|rK/<N#PZ41:c;λ$YA3\n{̽"+^JfMdrP r: ]O,n;*QX 㶚nL9xVd*_(yEm2ThTЕN3g":3^~#~M |뭷vV=`퓮5B(ZJkQŨ$>&dX+l <8QFIMY!_Q0aI 2iA~xOq,tm_4H8` p' {'2K* f <y{kbnL5JPs(c|RY2Q`<-NxUa襱qZ77!tm |x/Mٔz*1. ;ow[rf:^ 7H Thz9=X@nQFY9ٌvYbEg/j~vwX5TL0˚Zvm˩vKo-#nzMnnB kQS+ajl|g>I#b3($mȡ`xm&lv1ܨ`JcJC)T+0J*Et)H {i7?c=veϯ:`[1,kC… wr=8~[S_NW7s=)߾e˖fkbѰnLLh'h 3u$P( S$/VQlaB._v;K`B% f. =An fB.ZϝT`VOOO+ 7fΧnKt?M7ݠ <?X0Zߎ)O A,v龡ʘĕhRv@kӊ믿`5j vu;ߗM V%A1:z/unCd:bY^x17\Ƣvф|jC(gF4?LXJpP $//i5Hv8e|FyER]m8aOA W|v2ޱgnCSѮvm!uZ|Qn*V}7n 󩶹gT}i+`]Ç[AeZobj;Uc\e{dMhLrJ&3s|U2FHnuO2J'VcˍhS_;!r˗^do]b97LE@< N\+qՋ`1A1G%J] 7 zC߳ 8Nƌ*IP|[mӅhʦ{RGRVey YquBz҈|t"0`~qfMkA"p@Z01 x:$ƺ`tB;ƊvⰛkx՝6vMZ0"fTXT`lVS9%@ Ho~]%T3Zc`h̼`D!z"+ƿbW&5VA(*Ik/le-D1|cD'\QsMS8q:I%H,2SThs>1)8{&X>;|CRϱ c f:g(?^M9tl}žPSMZp^sRˣⵤrbᤶ^S^J^AdR'J >SsD>1u|텢 XYxEs@gnNr؁`6sFeة]1(b(rskNIC-%(ĎyI#SA)sUm,)#kJFM), RLPu21h,醺r/ȅF^pÅbAE8-ya>:D]Zܜ*,q uKF'w^pVW4QlXJ*d@-u^P85&V#ȑ㔼hmlψZXl>ҒHH<ΗD>B)PVC}RU]$I8'dN7rImɫK]F520!GR$&w%Ww}Θ ||og$ǁ*TcIu U*%;ZB j$Z)|m 4&)dtT#irXMrPUj+p|lVkC_J$4d-"':K }lw8nJ0I\ 1 ?M>K\:>y}$*06?Bqkj6@jk }LjT VA4W-T.:n}|ۘ_)MLlΐ LDƼAښi9y ?mK juBj)kDf5H.zݘovy&z6ʜQi$:Ci2TQ:>LFA ԖǛUAPcJd|]SD qL䜔q Zf(nwA^P卦X\ͩqcÑ|@AjJT1'sM55@@9.l"@I+,HrH(FF)y<ː* Z@/Ƿ(M>|TEX`<>hỉȬ'5#0 ?5Sb1/Hȩ(RJ7#ȦLT3UUMa4M'bs8>q}rL`USF?찛R8QQ p3BRe(i>2M(1s I4f T8LBhO?,p>|D2kykϟ&9吊bV>c%=e>1Aoq_8miE1QH+z~cлl,xBbc}nHo^.\ٸhIXQl7  uk! JnBC|?7r7uS|ӟi\뤹'QdL9B]< ֌#3>|pFCc؇Y >|bc'>}.8IENDB`camp-0.8.1/doc/api/images/tegesoft-bg.png000066400000000000000000000003341315645501200201410ustar00rootroot00000000000000PNG  IHDR4tEXtCreation Time ҴtIME 62YJ pHYs B4ZIDATxmQ0CFe63Vǂ3IG) ˺agQ$JUktsZ匜g[ZtV A׫TRe"IENDB`camp-0.8.1/doc/api/images/tegesoft.png000066400000000000000000000402501315645501200175540ustar00rootroot00000000000000PNG  IHDR4T~J DiCCPICC ProfilexwTl/]"e齷.H& KYe7D"V$(bh(+X "J F;'Nw>}w(!a@P"f'0D6p(h@_63u_ -Z[3C+K;?r!YLD)c#c1 ʪ2N|bO h{yIHD.VV>RV:|{ [RF ”"MF1L1[Te'Jx%C%_%RJ#4GcӸu:(G73%Ie%e{SC add1T4UT*TTTUzUUUoScemUkS{Q7UPWߣ~A}b}9Հ5L5"5iјi<9Ъ:5MvhWh~Tfz1U.椎NTgNΌ|ݵͺHz,T NI}mPw ,tӆF -5j4oL50^l\k|g24mr6u0M713fͱBZA EEŰ%2res+}VV(٬Ԗk[c{Îjgʮ=~mCNNb&q'}d]N,:+Uʺuv^|o]5˟[7wM׍mȝ}CǃQSϓY9eu빷ػ{^>*}7l6 8`k`f 7!p2)hEPW0%8*:Qi8# z<ἶ0-AQ#p5#m"GvGѢG.7xt~g|LbLCtOlyPU܊|BLB}&:$%Zh`EꋲJO$O&&N~ rRSvLrgIsKۖ6^>!` /22fLge̜͊j&d'g* 3]9Z99"3Qhh'\(wanLHyy5yoc( z.ٴdloaqu.Yf WB+SVv[UjtCkHk2zmWbuj.Y￾HH\4uލ6W|ĺ})76T}39usocٞ---zl=TX|d[ fEqūI/WWA!1TRվS疝ӫox4صin={j-n`[k k+x\S-ۆzEjpjh8qn6Ik:8w7ޜw[nn?uݼ3V/~ڟM~nr:53(ѽȳ_ry?ZrL{퓓~מ.x:LlfW_w=7~oLM˃_uNO=|zfڛCoYož_CgggI) pHYs   IDATxy^G}[}Yݶlmņ{3;@D@,CxYlleSuK%[>^IRv#fRzYYYYYYY>ܡ0Dxj-w ?]ﶾѯaXw=8 9`/@]ڞwl4okZب}@ w_gatA險0я 3,JSԌe ZQHSMøK q|iЃ(SW0 43^GБnGBs4tË2DXA06 } ݿRc4(xgAk^kvZ.6gZ2RQ02QV@b-e}]C+JinH2┥)bZ- _s|?Ti8t]U-)ɲ9GqFQ?CiUG#V.5Qhhf{?eYZwY{k&_̷}gSc}_,>p^LTMvuWƁY.m{X "/v}L]=:[n^w CvGmuY|6^x3{wZNI^"ֽҿLU^~jpUc{٦Wps+o~]ť+ƣ3q}V,]ӷܮnyJh4:~zk[ץi89:̛wZs^Ǭol},k;y2%_/+S5(kR6wP JA=w&=?61SK6wX=e(P#4(c?t^ugn}ÃwJ׺T^jWFct=3Rkaiq^i6XlÜHҊ Up~0MR(%MSඳ È%zry$oY[MW8*28(Jk+:XdZQ$eCr~l \bC  Ri X! tv&vl>E347M|͘3El{Kk𳺳eĸb"A!!tMƑa, B BC58vc%h!;҈Q]4:XS 5 mF 2!$(8&G/-zʴ]Wl  D؜ 5zkoG>ּJ>pȶz^o qzZjdQ-~%6N7wwe);g,&h 9Y Py +e,HQpP =J#FuxEA ^CשD{&HCF P%@mℌ0 Hꑍ! UX .wǴ q@"4 LðmGW CRRNlޥUTahjL/.kLLlHc"Y2"Ȑ}OnQ%iy]0,Eu2x?R (aV53К!yr$Ioj!K 14AbgR>ʵ5:zfW>zq֮? '8v2{]k虓J9b۱biZ& 5xA0֠o#QRqlč y tA(e 9(P00hş4ieBV\r<`Fcbt-UXRM_zrWX&!zsJgº:Fjz4pbZm d(kh:~REI+HbVˤ!"gw> bI1b,6 Izi0ppX G QQT 1T ,Z=#Ph3B:롧7p>luo%< n֋Q:Z[dؓsb]gQ>`(G搃j=9m3TuyE+*o,oXx\F.L2dՓat^Ӣ 65LX@#(@.&M(' G؍yNjEKl|Hu|a`p̊2&DCm-MJ[BP30鈆(6&Ve;Fa4C(}t,z+Рj >=N*|,6[{6;?WF'F.=tT>μw8;gy6ݡ/XjJlQ&R ìWspbP{u-)WO+DH*&w߹lٲ3ç'&&ժeYHL. l6;gΜ]vmٲn^|9WGNbaE« $ҤF`N/ly6nёhK/6fubG=y┮YvkkkBRXC-1ZxߘUkhGgǂE gX5wfbV9v{R9K9"/t0/Ym ̟;P0pohOooo^Czn7l) 0,3sD9eݻw_lY:=xz' mBU #y1b3fFFNxU7>flnҎ qZԛνGfX=(Djt`xwb$(L>{w*Œ#KsNutkVe8{ݽCǂ|c >r~C$`2=|a%oGly[n~䑇+ $Yvݨ^.& - +,^|՛|CLctѾpn aK}mzzz-j2{ᚍW޴,GڡkZի(z:J8m׮e8mRJa=/d2,͜xm^udȑ=oG a*v߃no UZu虞AJX~XSbѩ.gwo[u> aY ţԝٽ<>#(jDF9q ֱٳg2Jډ'RTkk+nooǀ:iׅ-A@Z, VUJ%T `+|~3'&vl}SNe;ݭXk Mfvt`lt9vZ)Sk}`ؘ4&D>r0۴jUo9Jҽhᬥ gΜ9oɢ٧k1Q[6tM5g#G :f\2k;Zl =-c&#f%eY(^}OaRB6ۮ gs)VRկFݳ2,QŮjS[=W<MYavS*{{RG4ٖ͆5Xe#;2J5GrWnvT{e)?s~JNmxxx`` j}70wcɒ:(*ַ>tvvvuu&0/|G?"V\O۾w#D0~MwI-&YtRVTB맞E 4$:SszVG{|a턘K$4=׿~x>_2Q0,z ߽νG 0ނ-z4uF;ˎb~F]1 顑iڮZs7:vi`:%;"&YyޱG>̺A&{?S  'JPevب1>x+UcmT/<\#Ϸ/ȵͷr`Qe/UҒʪzϰϲ]+P%S2&mKwLLG$tO4cQsk5wj\eu'\7O̳@`!F xg ^؝1Y!a]W}׹y_/%R ge1" ACC CrkVb۱cSO=K+t l;p"|7`L#>WȠr$} ҭ3gns.^Eܸ)}TqZbżE يw=޾vN@B?Wpejt/zZPbߤ({&>]bzroˢl0$IFRr5 .~#N*ύۻQo+DCNR6ATꜫ6o1 ~Kb+Ni 47}#86Q TlOBh@UTSRL? Jn,R_!G<8P%ʤDȞI,@l|+GFlf̘ KC &8@|@\` h{d|/}K2$lo^M'R8}?84Nub ,3{y饗gh Κ#m;( ^4|_xknk2&̜'aMUM<k8bOЅ 94%儁sB[)ns4q1 pW^),q8IH%Q́'-0q)xE+8f(Я5wChvX'x0YVjy\(WJ(6-\ra 3Ɵ?,Yxj_YԪqV|3C;䓴3gW]F@CQAq`ypbaI殌ԉ3r{hu2ب/uأlq,.ӱ#21ੑR~SJjS;5 Ht\jae)l V} 3$'h!e4hB4~SPO/FW'ބ\bcB:mGzхx\3q=sF4sWVōD\FŠ h8ص7ߪP؁c#i%Dt H lEKIڃPS٦7Tُ 0LLzlB`aGkĦlXb`M1Wft ;@&.ScP),HP(H2 Hï9rWԠ=ǥ '}4`CcC! $tA` N`]vxsl|c[GF"QqͤPT6-:>>N^*OSzEKH͞7*ٰƥ+V!#<{9HFʋrh 9p15wX4#),Ul.]hSSD{X} p5$DVutk͹sVj/ƛbSŪ[aDKcr珖ȠLY8MbwdQsAuh$'?y V2IDAT7$*B8?s N'Q@{@E[`K؟-U?`Z/\b4ュ#j3O̫3i}V҅V.pMS.sܱs̢+= ;x׿\\b켁OxHR(˹TS6yE|Hs:\ľOڊnjoՌ5v _+r{ ն" g-ot&eL[};i+틋P$ y}kDf$$^Q:!Ac6\gN.}6b o~?p%Sr0$IH.CTPby⮅|\yD[:g^x=Qg?GM}%z{[۞v7{o.tÍNmla-ڶt?qǙS~ݳgȃr+%q5$[.aD Ӗtd9N /4+M]3.8vb's}|.'9JN7?0cbU=WW 4m2%I=dM2 pC/6 ^xKs;N5V=588ŋ]~jnُ;z]~ ;@gy u5;Rj?ݷzukKsX*cHsL HDr R=q ^o3FĮ u?wܵG>ݙrWlvt!r͑f*g_xn˓?!TUM𓰅WF1 4>ޖCbDoQ25wL9"l<9YP_ MV8q|dtXZqcn(pɇ+_\`{6v/ z鋉0VZʇL}ȑ4!ipǨ~_>dqYa7YV03䴥^pPӸ"R3 %o"[ly뭷x{o޼Eݻ\R×^>IM%F q򵫷l_wUW۴ifwWsy\koܿ\gcC|/٥;go܃^q=XNeϾGϹm(y&=jOPJRGɱ9a/Q+;^~qqV45e*Sn(tұ]Og;nye;(_LjD[IU*1KS:  WB@BAb-j$rʲ4 iN.D@ .L-+_;)&Ņv)c' e׮/r1C0#N. Y$I[PPll7^x57Y.As16M榸|e;.=Ofx~e !`jf!~ H[|eŒKĨPc, %D.5z"q~xzYi0!xE 'G] h1r@ Q#;[B#xF hi@'ܟ(V&F,BS_4G9'&W"B_Ԑf طMgttdL )OS8[9k&jXd'GzNNiq4ga)9JujҳrmmgQSqOxȉ9ctmBKjzh+:F$FRư 0d&d>TJiIQvF40 VH91$$bFYGWxH !4V]]fFbefzZ-*4V/^"q0{iD OD7[9JU+((hò "°x~ϵ1_pMy< x[شwLl&>CTlMb%ל;P|M~%|$&GѬt:k|rO3'Yoø\<60bL[v[ʱ73! ܞ"CbA>R#JΌ-1(-S9 @j H UCuP꥙AS)$f " 5O0鈕#,Q $-RTƩT % @ЫM0 A$jE}HBDqaXdp"O>T_3J[X`M`'i?RcE}=囲+fge-v[Y/ Xp!N|//qYSQyJwnB'ַ?*SX8-$:OIjR'<9 H JƑ3iH=v]9JG}l 0M+Җu $$/9i+q0HRS%<=9TJ2/Lhii˧3Q_Fp9@u$ 3i,sAZՊS+[ga|2 4PJ(aQ(%ICP;9d4ocr=H\@50N{?5ʢ ٕj:3᱑Xq%Jcxq3~߮r.,:h uNphVJ^% $U1%R@J3 8050JGj$ [Yh,IXza#R#O%H- #4AqZ>k2 Չ"Tsix~͍k ,bn ajni jDtc!V2" Xl.uzNVBx U9 rk 5iQ;IEqxrsK;L>S6;={YӬKoT9-Ə1CNbO/*c1:16 {$$K/hԃK KYI. Ur ~I`& #k$0\s'BT} @($~#AKitG ]/oeB'Q1B^2!X† 0Jd_Gú)AQZ$ثB<j vNd>u4$LҞĺ B|P֔l$C]0Z%oDR$TKo#N°Ips:lȷVSh[q'4IW?]7K -QZJ*ctΉrKc0|=qL\yW,hS>JQɣxd!61j5$D"spV<+|%BU RE6i(ccZir]SZHR Ig[>$NIJ.Z%zjI$@SO$ J-N bڞ"IUO]5 N|b%{ߴd5?e<MX9))#mskϷ|ʇ1-z޶sq JH@2M"j:%g)mHKY>JK| H 0Z}e͔4(L[D.1S)k(P/ DC$HBh94 FހIIRRHV ֳjN*!Od&|הGq4u&5&JMA+ԣ:b$gct}Ό/>"12Ț8mₖ8`a|FqoL0n20'43dDې 5Sef3AIR j$N$$y}QC)4` =7 OݱÄ)')1]'Xtf.C q&{43ƒGj)rI%Yq[a5 w;̧Z<!lIENDB`camp-0.8.1/doc/api/mainpage.hpp000066400000000000000000000110221315645501200162460ustar00rootroot00000000000000/*! \mainpage CAMP C++ library documentation * * \htmlonly * * \endhtmlonly * * \section overview Overview * * CAMP is a C++ library which provides runtime reflection for types. * It provides an abstraction for most of the high-level concepts of C++: * * \li Classes * \li Enumerations * \li Properties * \li Functions * \li Objects * \li Variables * * By wrapping all these concepts into abstract structures, CAMP provides an extra layer of * flexibility to programs, and allow them to fully expose their data structures at runtime. * * Many applications can take advantage of CAMP, in order to automate tasks which would * otherwise require a huge amount of work. For example, CAMP can be used to expose and edit * objects' attributes into a graphical user interface. It can also be used to do * automatic binding of C++ classes to script languages such as Python or Lua. * Another possible application would be the serialization of objects to XML, text or * binary formats. Or you can even combine all these examples to provide a powerful * and consistent interface for manipulating your objects outside C++ code. * * \section example Quick example * * Here is a simple example of how to use CAMP: * * \code * #include * #include * #include * #include * * // Let's define a class for handling persons * class Person * { * public: * * // Construct a person from its name * Person(const std::string& name) : m_name(name), m_age(0) * { * } * * // Retrieve the name of a person * std::string name() const * { * return m_name; * } * * // Retrieve the age of a person * unsigned int age() const * { * return m_age; * } * * // Set the age of a person * void setAge(unsigned int age) * { * m_age = age; * } * * // Make a person speak (tell about its name and age) * void speak() * { * std::cout << "Hi! My name is " << m_name << " and I'm " << m_age << " years old." << std::endl; * } * * private: * * std::string m_name; * unsigned int m_age; * }; * * // Make the Person type available to CAMP * CAMP_TYPE(Person) * * * int main() * { * // Bind our Person class to CAMP * camp::Class::declare("Person") * .constructor1() * .property("name", &Person::name) * .property("age", &Person::age, &Person::setAge) * .function("speak", &Person::speak); * * // Retrieve the metaclass by its name * const camp::Class& metaclass = camp::classByName("Person"); * * // Use the metaclass to construct a new person named John * camp::UserObject john = metaclass.construct(camp::Args("John")); * * // Print its name * std::cout << "John's name is: " << john.get("name") << std::endl; * * // Set its age to 24 * john.set("age", 24); * * // Make John say something * john.call("speak"); * * // Kill John * metaclass.destroy(john); * * return 0; * } * \endcode * * \section license License * * CAMP is distributed under the terms of the MIT license. * * \verbatim * The MIT License (MIT) * * Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. * Contact: Tegesoft Information (contact@tegesoft.com) * * 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. * \endverbatim * */ camp-0.8.1/doc/images/000077500000000000000000000000001315645501200144545ustar00rootroot00000000000000camp-0.8.1/doc/images/logo_camp.ai000066400000000000000000015145131315645501200167410ustar00rootroot00000000000000%PDF-1.5 % 1 0 obj <>/OCGs[5 0 R 6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream 2009-07-09T14:37:09+02:00 2009-07-09T14:37:09+02:00 Adobe Illustrator CS4 2009-07-09T14:37:09+02:00 256 84 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAVAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXEgCp2A6nFUsvd aihqsVGI6ufs/R45TPKAgljuoeY61EkxI7rWg+4ZhZdUB1YGSU/p7i5MExjY90YqfwzE/NjoWPEm mn+d7mFgt4PrMP8AOKCQD9TfT9+X49eR9W4SMjL7DULO/txPayCRD1p1U+DDsc2ePLGYuJbAbRGW JdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVaZlVSzGijck+GKs e1nXF4sqNxhH0Fv7MxM2cBgZMJ1bzC7EpEaDNHqtd0DUZJDLcyytV2JzVTyylzYWphiOhysFCvHd SLsTUZdDOQm0y0vXb3TbgXNnJxO3qRndHA7MMzMWrlA8USyEqen6Dr1lrNmLi3PGRaCeAn4kbwPs ex750ul1Uc0bj8R3N8ZWmWZLJ2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2Ksf1/VlXlAhoif3h8WHb6MxM+atmEiwDWtXeVyiHbOf1mrvYNMpInyn5Sk1t3uLlnisUqpd aBnfwWoI275HQaA5yZS2imELTLUPyxvEq1hdJMP5JQUb7xyB/DMrL2JIfRK/eyOLuSK48neZYGo1 hI/vHSQH/gSc18+zs8f4T97AwKHl8ua7DA88tjNHDGCXdlIoB1JrlctHmAsxNBHCUvViMxwaQjtG 1y70bUEvLf4l+zNEejoeoP8ADMnS6mWGfEEiVF7Hp9/bahZQ3lq3OCZeSHv7g+4Oxzs8WQTiJDkX JBtEZNLsVdirzbzj/wA5B/lp5XmktZL5tTv4qh7XTlExVhtRpCUiBr1HOo8MVed3f/OY9kslLTyr LNH/ADS3qxN/wKwS/rxTSN0j/nMDyzPIi6toN3Yqxoz28sd0F9/iFuSPHFaeyeUPO/lnzhph1Ly/ ereWytwl+FkeN6V4OjhWB3/pihPMVYv+Y35gaV5E8tPruoxvOgljghtoiA8kkh6KW22UM30Yqln5 W/m9oP5iRag2m281nNpzoJLe4Kc2jkB4yDgSKVUj/bxVneKuxVgPn/8AOvyb5F1eDStcF0bq4t1u o/q8SyL6bO8YrV1INYz2xVlvl3X9O8w6FY63prl7HUIVnhLUDAMN1YAmjKfhYV64qmOKuxVhX5h/ m75Q8hTWMGuNO01+sjwx2yLIypGQCzgslAS1B40OKp15M836T5v8uW3mDSRILG7MqxrMFWQGGVoj yVWcCpSo36UxVI/zM/N3y3+Xf6N/TVteXH6U9b6v9SSJ+P1f0+fP1ZYaV9YUpXFWD/8AQ3X5bf8A Vt1n/kRa/wDZTimlW2/5y0/LKaTjJaarbr/PJBAR/wAk53P4YrT0byb+YvkzzlC8nl7U47x4gGnt yGjmjBNKtFIFele9Ke+KE31i9+qWTODSR/gj+Z7/AEDKss+GNoJec67qTBSgO565odZqKDTIpd5e 0O51zU1gWqwr8VxN2VP6noM12k00tRkrp1LGMbL1SS70bQ7W2tpZUtINooEPf/Pux+nOrOTFgiIk iI5BvsBMAQRUbg9DmSydirTKrqUYBlYEMp3BB7YCLV5F5t8uvo2okICbKer2z+A7oT4r+rOP7Q0Z wz2+k8v1ONONFImFQRmAGDLfyu19odQm0OZv3c4M1qD2kUfGo+aiv0Z0fZGf+A/BtxS6PTs3re7F XzD/AM5H/nXftqNz5J8u3DW9tbfu9ZvImo8kv7VujDdVTo9OpqvQbqQGEfkR+T3+PtYmu9TLxeXN NKi6KEq08rbrAjdtt3I3Ap/NUKkvsTQ/Lmg6DZpZaNp8Gn2yCgjgRUr7sRux8Sd8UMc/MH8o/Jnn exlj1GzSDUSD6GrW6qlwj9izCnqL4q9fah3xVCfkj+X195F8mNpGoGJ7+W8nuJ5ITyRgSI4yCQDv HGp36Yqz/FXyX/zlf51OpebbTyxbyVtdFj9S5CnY3VwA1CB/JHx/4I4pDEvyA85/4X/MnT3mk4af qn+4+8qaKBOR6bn/AFZQpr4VxUvuHFDsVfF//OUGoi7/ADbvYAa/ULW1t/vj9f8A5nYpD0H/AJxK 8++pBfeSbx/ih5X2lk/yMQJ4voYhx828MVL6PxQ1JIkaNJIwREBZ3Y0AA3JJOKvgn83PPEnnTz3q OsBibJW+raav8trCSE/4MkufdsWQfSn/ADinf/WfytMFa/UtQuIKeHJY5v8AmbigsO/5zK/6ZD/t 4/8AYrioYX/zi1Z2d3+ZcsV3BHcRfo2dvTlRXWokioaMCMVL1T/nJH8qvLc/ku58z6XYQ2OraUUk me2RYhPA7hHEioAGZeXIMd6CmKh8yeTvNOpeVvMlhrmnytHNZyq7qhp6kVR6kTeKutQRil9x+b77 /SUgBFIkq3+s39gGa7WZN6apFgU8dzqGopa26mSWRuCIO5Oc7n4smQRjzaDuXp2m2On+V9BZpWH7 tfUuZh1d/AfqUZ0uHFDS4t+nM9/46N4AiGHSW767rFlLqpZH1Mt9WgU0MNsitxbf+ZunjQnvmmMD nyROT+PkO6P7WurO7IvLl7eaVff4c1R+VBy025PSRP5N+47fd4ZsdHllin4GT/NPeGcTWxZVm2bH Yqg9W0mz1Sye0ulrG26sPtKw6Mp8RlOowRywMZIIt5Fr2hXejXxtrj4lPxQzD7Lr4j38RnHarSyw z4ZfBxpRpIDqEularaajF9u1lSWg7gH4l+kbZdo8nDIHuYXRt9DRSxyxJLGwaORQyMOhUioOdiDb mpd5p1hdE8s6trDUpp1nPdAN0JhjZwPpIpir87rm5nuriW5uHMk87tJLI3Vnc8mY/MnFk+4vyC0C HRfyp0NEXjLfxHULhqULNcnmpPyj4L8hixehYq7FXYqlvmXXrLy/oGoa3emlrp8ElxIK0LcFqEHu x+Ee+Kvk78mfIUv5n+ZvM+ua78cbQXBaY1oL6/DiNl9ogWYDt8OKS8ivrO707ULiyuVMV3ZzPDMl d1kiYqwr7MMUvvD8pPOI83eQNJ1h3D3hi9C/8Rcw/BIT/rU5/I4sWYYq+IPPGi6n51/NHz1Npg9W TSzd3jJQkyQWEiW7caV347r49O+KWG+UPM1/5X8zadr1if8ASLCZZeFaB06SRn2dCVPzxS/QPQ9Z sNb0ey1fT39Syv4UngfvxcVofAjoR44sXlf/ADkz+YQ8ueSzodnLx1bXw0A4ndLQf37+3MH0x8z4 YqHy3528lah5SuNLtNQBW7v9Oh1GSIinp+uzgJ81CUb3riyfQP8Azh3fB9C8x2Fd7e6t56f8Z42T w/4o8cUFAf8AOZX/AEyH/bx/7FcVDEf+cT//ACaEv/bMuP8Ak5Fipe0f85K+c9N0X8ur3SGmT9K6 2Ft7W2qC/pcw0shX+UKpWviRigPkryZ5ZvfM/mjTdCs42eS9nSNyv7EVf3kh8AiVY4sn2P5mumk1 G8Y7ESMm3gnwD/iOaLVz9RceZTzyN5b+qQnVLpf9LuR+6U9Y4z/Fv1fTl/Zmj4B4kvql9gZY41up 3j/4m1w2gamh6WeV09aLLKP2a+A/r4jIZD+ay8P+Shz8yp9R8mO2mqnUvPdtdJ8MPrCO3UbARKCq inuN81uPP4urEul7e5rBuTPvMWiJq1jwU+neQn1LOcbFJBuNx2NN86DWaYZYVykNwfNulG1nlvWX 1G0aO5X09RtG9K8hPUONuVPBsGj1JyRqW047ELGVpvmYydiqB1nRrLV7JrW6XbrHIPtI38y5j6nT RzR4ZIlG3h/nbQb3SJ2t7ldjvFKPsuviP4jOZOmlhnwy/tcScaeu/l7ftfeS9InY1YQCEnxMDGL/ AI0zp9NK8Y9zkwNxCC/N6OWT8r/NKxfaGm3LHavwrGWb/hQcvZvgTFk/QD8q545vyz8qPGaqNJsk J/yo7dEb/hlOLFlOKuxV2Kvn/wD5y186Gz0HT/Kds9JtUf63fAH/AI94DSNT7PLv/sMUhf8Akf8A mD+U3k38vrHT7vX7eLVboteakvCYkTS0ohIQj4I1VfmMVeMfnxd+UtS/MC51nyvfx31jqkaT3HpB 19O5A4SAh1U/FxD18ScVDPv+cSPOX1XW9S8pXD0i1FPrlkD/AL/hFJVHu8W/+wxUvqOeaOCGSaQ8 Y4lLu3gqipOKHzJ/zieran5y82a3MgLyQqJK70N3O0pFad/SxSXl/wCdXkNvJnn6/wBPij4aZdE3 mlkCi+hKSeA/4xtVPoxSHsP/ADip+Y0P6L1Dyjqc4jWwV7/TpJDQCCtbhKnsjHn9LeGKCx3y8k35 yfnzJq0yl/LmkMsyow+H6pbPS3jIPeeT4mHgW8MVVf8AnMGyCea9Bvqbz2LwFvH0Zi1P+S2Khv8A 5w+vwnmjX7Cu9xYxzgf8YJgn/M/FSmv/ADmV/wBMh/28f+xXFQ8h/KHyx5q8yea30/yxrD6HqQtZ JTepLNATErIGTnB8e5YbdNsUl69F/wA4la7qF99b8w+bfXkehmkSKSeZ/b1JpF+8g4ot7B+Xf5Re TfIcLnR7dpdQlXjPqdyQ9wy/yggKqLX9lQK964oY3dX9Lk3ckazfvDK0bV4sa8qGnbOay5aPERfV xyVS88/eY70GCIxwCX4OMKfEeW2xYsa/LKMna2eewoX3KchLIfMJt/LXlJNMtT+/uqxl+hYkfvX+ 7b6Rmy1labT8EecvwSzl6Y0wzys3HzFpx/4vQfeaZpNCazQ97VDm9mztXKY35jtp9NvI/MVinJoQ E1GFf92QfzfNf8+mazWQOOQzw6fUO8fsYS23TH/E2gfV0na/gVJFDKC68qEV3WvLMn87hq+IfNPE EsuvzB0GNvTtRLeynZViQgE/7PifuGYs+18I2jcj5BicgSbWvPnmG3VOOnfUFmB9JpwzOQOpAPAd /DMLU9q5o/wcF97GWQsC82a5qup24N9ctMFJKoaBQT4KoAzXx1OTLL1m2mciXoH5K3DS+R41PSG5 nRfkW5/rfOn0f92G/D9LN7y0gvLSe0uF529zG0UyHoyOpVh9IOZTa/Pzz75O1Hyf5qv9BvlPK2kJ t5iKCWBjWKVf9ZfuNR2xZPpb/nFfz7a6n5RbypcyganozO1vGx3ktJWLhl8fTdip8BxxQXuWKHYq ppc27+rwlRvQYpNRgeDABiG8DQg74q+PIY0/OL8/XE3KTRHmYkKxWmn2a0UAjdfVoOnd8UvdP+hZ fyg/6tU3/SXcf814othn5vf848+SdJ8ganq/liylg1PTVW6YtPLKGgjP74UdmGyEvX2xTb5y8qeY bvy55k03XLQ/v9PuEnCj9pVPxofZ1qp+eKX3F588zWg/KjWfMFjIHt7jSZZrKUHr9YhpEdvdxixe U/8AOHdoq6L5lvKfFNc20JPtFG7D/k7ikss/5yU/L/8AxN5FfVLSLnqugcrqLiKs9uR/pEf/AAID j/V98UB8bW9zcW7s9vK8TsjxMyEqSkqlHU07MjFSO4xZPtT/AJx28hnyr+X9vPdRenqutEXt5UfE qMP3EZ/1UNadixxYsE/5zGsg2neWL2m8U13CTt0lWJt+/wDurFIedf8AOMGorafm1ZQluP1+1ubY V7kR+tTp/wAU4qWef85lf9Mh/wBvH/sVxUMR/wCcT/8AyaEv/bMuP+TkWKl9hYodirxS/lMU09rJ /eQu0b/NSQf1ZxmfJRMT02cUqGnXn1O+gu/TEpgcSKjVoSu4rT3zGw5OCYlV0gGiitd1+91q6W4u gq8F4RxxghQK17k7nvluq1c88rkmUrWaBPDb63YzzOEijmRnc9AA1ScGkmI5Yk8gVjzetReY9Al+ xqNvXwMqqd/YkZ18dZhPKcfm5HEESl7p9wpVJ4pVYUIDqwIO3jloyQl1BTbFL/TPy90iRmulV5gS Rbh3kYb9OANB/ss1GXBo8J9XPusn7P1tZEQkt3599FWh0OxhsIjt6vBS59+IHEfTXMLJ2rW2KIgP x+OrE5O5jN7f3t9L613O88nZnJNB4Dw+jNXkzSmbkbLWSSxvzTqMVrZ/EcydHiMpMJF6r+REc3/K voLiQUW7ubiaIH+QP6f60OdZpo1ByMH0vQsvbmEfmj+U3l38wdLWC+ra6nbg/UdUjUGSOu/Fhtzj J6qT8iMVfMWsfkp+cHkPWE1PSbWe7Noxe11TSeUrAdKmNR6q/CfiBWnzGKbZto//ADlB+YmnxLba /wCVPr9xHs8iLNZyN7spjlUH5KB7Yq3qX5w/n150jNh5U8sz6VFMArXcEMjSANT/AI+pgkMdQetA e4OKssPljzv5M/IW60W0s59S84a3LML36pzuHR7tiJJGkWtStugXlX7XQ4oQ3/OLv5b615di1vWd e0+bT9QuGjs7WK4Qxv6KASyMAf2XZlFf8nFJe9YoUrq1gu7Wa1uEEkE6NFKh6Mjgqw+kHFXwrqv5 L/mRa6vf2Vr5e1C6t7S4lgiukt5OEqIxCyI1KMrLuCMU29St4fzIm/5x81DyXc+XtUGr215b2ltG bWYF7KST6yCrcaMqNGyNvQAqD1xVnX/OL3ljXdA8l6rBrVhcadeS6m5W3uomiYxrbw0deQHJSSRU bbYqXsTojoyOoZGBDKRUEHYgg4ofKVr/AM46aov5zfo57CVvJUVz9cF6VPotbAeqtsWI3blSI/Sc U2+rgAAABQDYAYoeNf8AOUfljW9e8m6THo2n3GpXkWppygtYXmdY3glBduAPFAwUEnbcYpDxL8sf IH5j+XvzD8u6td+WtSitIb6FLib6tKwSKU+nI7cQaKqOSTir1T/nKvyn5n8wyeVU0LSrrU2g+v8A rm1heUR8/q3HmygheXE0r1pioYx/zjb5E86aB+Y73WtaJe6fatp06LcTwOkfMyRELzI48jQ0FcVL 6lxQ7FXl/wCZ3k++heXzBpMZljPx6haoKsp7yoB1H8/h16Vpptd2eCTOPx/W0ZYdQ8+0/XIZgFY0 OaPLpiOTQCmiSI4qprmKRTJfgVrFW8Vdiq0sF3JpjSpPrPmWy0+Mlmq3QAdcy8GklNjKVJR5S8pa 9+Y+ur8L2+hW7j65d9Ao6lErUNIR0Hbqc6DS6URFBhCByHyfUOlaXY6Vp1vp1hEILO1QRQRL2Vf1 nxObQChTsAKFIrCl2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvOvOv5Na TrMkl/o0w0nU2+Jgq1tpG3+0goUJPVl/4EnMXLpYyaZ4QeTybWfLP5leV2Y3umSXVqhP+mWdbiIg bcjxHJB/rqM1+Xs8dzjShOPRKIfzAKHjKhDDYgjcHMKXZw6MfERSfmFZ03H4HKz2aV8QOb8w7IdF /A4B2aV8UIS4/MXtFET+GWx7NHVByrbGXz95nkEei6bcTqxA9SND6Yr05SnjGv0nMvFoIjkLUccu Qeg+Uf8AnHa8nnS+85XnJQQ36OtmLMf8mSbovuEr/rDNjj01c2+Gm6ye3abpun6ZYxWOn26WtnAv GKCJQqqPkPHue+ZQFcnKApE4UuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2Ksf8w/8AKv8A1T/iL9E+rQV/SH1blTt/fb5CXD1pjLh6sCvf+hb6t636N6b+j61Ke3pd /llR8NpPheSGt/8AoWj4vT+p+/qfW/w9T+GD93+LQPC8mXaH/wAqY5D9EfoL1a/Dw+rerX/ZfHlg 4PJsjwdKZunDgvCnCg406U7Uplra3irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVf//Z application/pdf logo_camp uuid:3dbdbe8b-bf1e-4dff-871e-1be14201f344 xmp.did:A75B6832856CDE11819AEBADE2D71138 uuid:77d8ee78-6a30-11de-ae5b-0014513219d8 proof:pdf uuid:d3c8b5db-b334-47b7-bfe5-94bbb74fa14a xmp.did:0BD1F0892A6ADE11A971ABF2B6B780D9 uuid:77d8ee78-6a30-11de-ae5b-0014513219d8 proof:pdf saved xmp.iid:0AD1F0892A6ADE11A971ABF2B6B780D9 2009-07-06T15:57:48+02:00 Adobe Illustrator CS4 / saved xmp.iid:0BD1F0892A6ADE11A971ABF2B6B780D9 2009-07-06T16:00:35+02:00 Adobe Illustrator CS4 / saved xmp.iid:A75B6832856CDE11819AEBADE2D71138 2009-07-09T14:36:59+02:00 Adobe Illustrator CS4 / 1 False False 209.999929 296.999959 Millimeters Cyan Magenta Yellow Black Default Swatch Group 0 Blanc CMYK PROCESS 0.000000 0.000000 0.000000 0.000000 Noir CMYK PROCESS 0.000000 0.000000 0.000000 100.000000 Magenta CMYK PROCESS 0.000000 100.000000 0.000000 0.000000 Rouge CMYK PROCESS 0.000000 100.000000 100.000000 0.000000 Cramoisi CMYK PROCESS 26.999998 94.000000 94.000000 25.999999 Orange CMYK PROCESS 0.000000 50.000000 100.000000 0.000000 Pche CMYK PROCESS 2.999997 25.999999 81.000000 4.000002 Crme anglaise CMYK PROCESS 0.000000 13.000000 63.000000 0.000000 Jaune CMYK PROCESS 0.000000 0.000000 100.000000 0.000000 Citron vert CMYK PROCESS 32.999998 0.000000 72.999996 0.000000 Sauge sŽchŽe CMYK PROCESS 36.000001 10.000002 47.000003 1.999998 Vert CMYK PROCESS 80.000001 0.000000 100.000000 0.000000 Fort CMYK PROCESS 90.000004 30.000001 90.000004 17.000002 MŽditerranŽen CMYK PROCESS 100.000000 0.000000 30.000001 5.000001 Bleu intense CMYK PROCESS 45.999998 0.000000 0.000000 0.000000 Cyan pur CMYK PROCESS 100.000000 0.000000 0.000000 0.000000 Bleu nuit CMYK PROCESS 100.000000 50.000000 0.000000 0.000000 Ardoise CMYK PROCESS 30.000001 0.000000 0.000000 42.999995 Petite pervenche CMYK PROCESS 42.999995 27.999997 0.000000 0.000000 Prune CMYK PROCESS 50.000000 90.000004 0.000000 0.000000 Lavande CMYK PROCESS 18.000001 45.999998 0.000000 0.000000 Rose bonbon CMYK PROCESS 0.000000 25.000000 0.000000 0.000000 Bisque CMYK PROCESS 6.999999 24.000001 37.000000 1.999998 CafŽ au lait CMYK PROCESS 25.000000 41.999996 48.000002 11.000001 Malt CMYK PROCESS 32.999998 44.000000 53.999996 19.000000 Moka CMYK PROCESS 42.999995 51.999998 80.000001 38.000000 Pigeon CMYK PROCESS 0.000000 0.000000 0.000000 30.000001 CuirassŽ CMYK PROCESS 0.000000 0.000000 0.000000 69.999999 Noir global PROCESS 100.000000 CMYK 0.000000 0.000000 0.000000 100.000000 Rouge global PROCESS 100.000000 CMYK 0.000000 100.000000 100.000000 0.000000 Orange global PROCESS 100.000000 CMYK 0.000000 50.000000 100.000000 0.000000 Jaune global PROCESS 100.000000 CMYK 0.000000 0.000000 100.000000 0.000000 Citron vert global PROCESS 100.000000 CMYK 32.999998 0.000000 72.999996 0.000000 Vert global PROCESS 100.000000 CMYK 80.000001 0.000000 100.000000 0.000000 Bleu global PROCESS 100.000000 CMYK 45.999998 0.000000 0.000000 0.000000 Nuit global PROCESS 100.000000 CMYK 100.000000 50.000000 0.000000 0.000000 Petite pervenche global PROCESS 100.000000 CMYK 42.999998 28.000000 0.000000 0.000000 Prune global PROCESS 100.000000 CMYK 50.000000 90.000004 0.000000 0.000000 Rose gobal PROCESS 100.000000 CMYK 0.000000 25.000000 0.000000 0.000000 Malt global PROCESS 100.000000 CMYK 32.549998 44.309998 53.729999 19.610000 Document Adobe PDF library 9.00 endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ProcSet[/PDF/ImageC]/Properties<>/XObject<>>>/Thumb 13 0 R/TrimBox[0.0 0.0 595.275 841.89]/Type/Page>> endobj 9 0 obj <>stream Hˊ%E .|:`2 Yn9:Y?zy}o><˗%R+k)ݕ\X4w5zkIՍ>w /,J\KL 4"Kay c5oWX(UTRokӵIN‹-$bnzopWFOn9+^Iy]-D"{<]y /V\4;yGҪ@K]5{4z!W~c:`# nfʛްv4R q7﫽l?eװ[<ŷuk.nTtei!s?%ızj;%+5}!R*EOf$θ*,HM{TЃMP+sԻh ]&Dؼݐ:m8Q-h1ԯ}>%\"9Jy&gw=Ə!Z1^ *l_,9pնd %nrK'd54OTvK#HrVEB2TpfRlV\_ MnI':Kg 7Tpi ɬ Ú.BrP ҹ rTJӡȝa \( Uפ~ K_O8Ϫ۩< ] @dVlǿ =]pa[Dy]ŝ, !C+8Qx,5ƺݬ`@iM LIOI]ϓXK@yj6 ق#kk=r{1O Toغ2]^2 I9Dd["#ٖMH><ǨWKvШg*ÞCvz;RA~Eݳ;!-ݝJLzKFAWiT oldM zd̆uFGC) 8}P%tXm5^PD@i3<fRO:%Wk~yo5/#ti;2N`&j%C0Xu#AoÕh$Ohb[o\F3WPM7 !P Ix7^Ԯ\N2-n}Yp")Ni)=]gAzZ*F mhby6p>stream 8;Z][Yn;UB%#&+!P>7D+nM%,a0S(^sBV!6(iekpu`9%#=1,O=OYWDgb!:ZK<=;A3r F'B6`a#'i:MMeu;][(Ma%gl0+@p(t4Eca)%o3^$h0tWBWY10+m;'41sbah?h7.d*@ 0CtKdV3fX-[hSR8X]i%d\TXs*'fc6ozpu4F:Yj3rZ~> endstream endobj 14 0 obj [/Indexed/DeviceRGB 255 15 0 R] endobj 15 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 12 0 obj <>/Filter/FlateDecode/Height 154/Intent/RelativeColorimetric/Length 19097/Name/X/Subtype/Image/Type/XObject/Width 156>>stream HTǟ_}KMtHb Q$mJjifl?ZjٴIWglmG܎>y\ĭ]9s?~_0"s9 ` }O2F(`EK%,E`)f+*ص, O0s0jDņOLA'Chcl\6DKE/fcuL`s815lM4٤FheV;K5g)?/2}`~52аd#^L4FI"v20mrYCmmi Za.!2YbS,ZM^ʆ$:2Xp#Nq L;f-ALYd hҶ x 4Ɂ,;u\] кɍ@~Y,fPs/LK{e uM{(6=9:t =t5繬9>-4km[2Vh̋&>]ίwnYXp,/,J?BLcG%Yi!UkUՠi C̖Cuu"k$5^n޾mn>S{MŅcMgi4kb4j=8Ke.gYh/hf4kj;u',7oy\msx%r>[>s ]pl{`HӴkAβ;DQ= z }s2 Wr5vV?on6MVbD~ãm[yMmvmY{xE 0j`JfY:iZi^F<2p -r|9z-s"V_nD˗\- elqd.>x!%巈 kGA"݌e-ޏzd44&pF=K/ٙ,ȗ͕-/_1OPb }tT*>_>ʫ>^-/72p7=DӼ] QΉ}Z1f.cr7jl,m!*%D=Yi4kKQېr?Z=k9fpΗ8鞎wt"lj$lE1B蔨]V<Ѭ<3 םR_5k~mӼ#|.?;l_i!ikZ7G`-:DLl\ !~IzlQ&4 {*q;\!Ze'mRIɽnl6zrZIY }P>I(b /hi{^;/YFb,;r.YȺ=v#3 AcA^Kszy׫}= gz/ʧHjOzxջ<> [Eڶfѷ 9{dw0J3kтީ3Zm6 ͬ@3vвndE1Y@gv/ų]2_:kUoż6kS1e+1V[N ֨~} Xr13iމޙ,JlfflY =lqqJZ>g\:TgT7WrKlzR#Nu Zcؿ!_cJslVljF9ϑ7fv֨y4k䥘=<1T%+c>ibõzSi\v $z'f4蛓`>ӜNa&<z:"_: :b>$~:է-y gZox ϟvA~o LƵhk͞}6y);r)ϣwZkGI0pz~~C]9_ӃΩwqDC2=3 u@N nY k'({&PFwxfy߱/}eo9}k'{9jrüv#/%}{7yxyʘ?rIpkdMYfH'HF(: \ʛy4~дPól >C󣐌F>dv֩{g6ȵiyY]CߍVWDe^񆚽Lě:I#{nVHxDŒg:g?Ǜ DHnϖRNs $L`8Ιa&3s;Xe)e,3 "}mMUcc5MK,5JфVc4` sνݹ<79y޻ν9֋s 5MwN+3et̆,:ͷ_*Id7a5.L}>5o:ۣxb8ZuT[P]?Yn' sbuϩ{.p1L] sZxJ4Զl}4!g]ޓΐǞUvShVIMTv>;GY;G[ e.fVSV\X9V瓜Q'@\$DFwO'\?׳閛}嫦 c93)C/R alswzd OOH\[נ9PapɆKDasL흝*ֆC/V쉐fB`mPVugq9-caU4:蝘Ϩǂ!ޤZ=wʛ 7>Y<-ܐCd&;հ^Ǟ؋C`/˔cd ;i}|_5o^x--zޮ2^-YkawkCJײbA|xcFƽz:A6,8zlRgcp}U3+j])CudxXCb*S(plH[u5_QW9NuUC^6YrеI| `MuPU`(+fhtޑk 2J2WWF*NtS*1g eKjc3b@3`?ӿl1ZQ:>!rπνW3\r[Zc_ ZݔIMtnUeF2І汆sQckq\s߷uPUkG]3NhGd;O]C֤r`on x歶Y} ƹ-nMuV+6^f54'$kˀ8yfmb-CX&A]Ӷl/<FS$s9VC wx ,k`Z0g57p {[ckS=udtMLf+s]QzczZEY_I]6n?)?zms_/PQG5xCn75]_)mșd {]d5 (Y"EW3t Yìg.r]˜ c/_ܤs8{0:|3ӡkC%u ۦ;eu`?`KIVfOٳ@kpg#6A=JhF^ zh4f7sxqAdM^E;'K~ѷ-$oZ]ϛ~nAfnV9 փz(L6@t& ܃| Q3Z0E86%q~_j2:.k8龀v7i++&9M+.Z/k2=糁%PX>1/k/?@ޑ*.T5#̫'6&ׇypuaEy~er'yB{U69Pߤs²Oyd6:Y=V{AAͥSuGe@%^5_ѢTwMX ֬i5 !kHW>g<_X;_>Ӭ\iӸ42[ ӨΏ4I9\wIdzjZypo |`U0AΈ5{2d{1uёb3/uWk@?t͜lQk;q$N2_Zf17v ZRMp;TG'd=X@v;ꢃJ. (9_(^.=*ݓkg|ah6_zE1^$S3D/E5zśctOEOΠ mmW샱Kd%Գq̞cvе컪S?%Jw`ڠ0f$} 8j&d%gfUue:mS3ܮ6Kk`Hz k e63eDl ti5ࣵ|x~ |8 A{tcްWf$J'2wc zdkG]?ָ:xeQ߀:p3ԍ>nRjZi=A` lb&)~p=yɚې0 Ӡl ٬o6iqIuZ< aNmj HT~Ӽf]OP_u )^^5~CJWaF࣏@f - ܃Ff{Xsyqewaq~׈l8]Կ|ypuXW=ܩSiW;Y3iSkEu?T;Z^>:/eu]q D41g 9đq090`D@QD*T4FPF JVi"Rڰk ;;;>c3>>K\Cgσ.qWċKƚCtYm9,&j|yX;/~,}i"sN~f^^+g6rʘDfys>!k闌5~|7_kXDKcs8!o;i]_m\;O g5<#k2_>DsWR G?}f qfq9 :2t1AqtQbVGe5G+nmk˝d!]d%ȇ̱|&[ёY:փBvZvVZpsٛ![G{UsuUWŰmk(9Sΰ 2y3~7O7dXھ:?( ]ᬖ/@.]}srt'JLD暗|}5G+^孇j]Ԟ=/˦5exT$Tww]Vxf?kAߎ5gdsD~YmV{t38FCE֊[Its۳ԙUܶ:·,G#219ϛ(s}ELr, n=}wAGM;~~ };!_ܓ2:C?CඝX0l}VaܶGEUejf}&z:+{AE?۩Ad=Û;agn7QڼaWEOܡ Z !dlklf&9sLzmdJ#$M>*>xTY>{A[ī=(;{Fqț;<>ޚ KOogF&}Fݠ(s%{ cc"669!KJ:۬m<-ڻ:Qs'e8 >蜠oR7gs;C-pvGEގB_@ې'53-+>Cΰ`](vqt㶃d&C/EW?۾0ʭo IR]CwÙ{q#/Uy&UvA0;2vgݳ3o]e`?T]zft⡳p2sTy*6@٬}tms[-y&}p'dWc@6tB"\$-wys. 2v 9{XFcsE}wbkrhsL`n;="dEC } ^1$yC5ދ,x|@"XZsx3T@gIK'訝49Bܤ,EƘikmDsd^2&ғ.d1 X"'XmY}ޯȕ": tL:,t>Npΰ g83O|q"SnSԞCBO9qX-570926X7!Gc^OP9Cg8@s*>q#tt?e{VzoLP [)S?o)[~dtWrxsFdL3Y{[duz!K?T6Rq'I"t9F}Ev~p&r!פjzNu0)9zxBqŒDo:uH !cvkUpviS~ <6dUR Y1*I%G}wTa{*EOƆNP݇^#b`c :j:v<9Ĉ;& c2.M<I +y^֪l%Ѓ'xu]t9Uq,Dz][vZ6vx3㭇͛Q3Dƾ㭠*'cg6Vbm۰'̤'RjgiEַvO`Yo9Yb류W>!eS>DfcTqzչ!Utᰣoȅxko1OoO/B?<.DBzd a/`- sIt@fv2¸eknW<քm6c0!1T$!i I!)`l1@̾ *Q)U#JM4-[z㻍˛wg}{ףe>x#KW\ͽw/dzϪ3}W[ѾE:*>e}~,38xF;Dy~ o/f6()l-,!),nbFs,/]OWU<@o'`F6Y_G#dkꞇ컶g9{C:%b7yY79yYTWf 3ܞ̆}CAFoʊ~) "$꣜%ȣTۦ4c+Ӷ\L/-"yS|!RutTUxlf4bBF-݈tsܓ"ciMYۂVN0g^Z/k ^•l-^t12>tYTQQj+[C= 33GmK +Go~ cS|Ů Gܖ?/-/ݏClv[/[_@۾AɏV. Hu\ӫ_8Q1t{B䕪{Nt}^`[geQw oHCb`r a7+/Mt;;-yr'q|hMa̤KsX.-$uh ^ ܷ sm^C:~νLkdle[Ϫއ /^ TQu `gV67Sۋ&oEz.쿲 7")Gkfi[ xiP>dv{Ӛ~ʫJtIWty*e=(\껎{eT+3lxݯ!~/F-SXup6>uԵ-hQü\@9|-9sQ_2-u8uAϜv&\[:?2*2­)oؐP1,t66x^y]L׶4Ѷ\\^Z բ 6{0=|ݚ{Nmt4 :cMcDkU:'noTZQ}ь Fào,?v>wp_'kƙQ2];],'a37B|0=-s~yNݽ~_g}CUƈZ>>̨v1y+x` 7зC!?ORm{ ȥ0gL`v·s~P:k~mlRif-r^4Uo0:.ZA>5n%PLTT|e ]E}Ȧox p'T$LE+*vELUiV.>UψfTmf[@o(oNyʼ:;8֮U|\&kG}Lf[-U|fM@V Jx]OљA=ZrE}:\ڦoI3y3ض鐆#btFvR,=\6rB5oA 5r-) z^z.7U?s|HWiJEuRb^\Ey-жlpC{7OmgR}6':&tI9f[vRꥅͲʔ-~/w]\b\G?dL:ڧ^Efdga-=ܚ[eEAyx}np4?L2 屋h6؞̬PL~oV6 hJGĆLTz26D++Z!x?Odk>-jn7jfvuVhm}1v1e Ӷ||$:>';)_G-]霃gd穣*e^ѭLEj[=Ʃo5pୂi顕Go0h hV6իy8]G U^^C-KL|:z9Sy=oQק:_马H:m&dS1%dB7|1*J<xah!> :Zy%GlbLGOD{+j<ut zA:ϕ՜׋ҚM&oN}~jv1'[QnO4Vw2M3,fFsiqe"r- @߾fS64AWnWDUΖw^/{οU}:ۺΖy~xq)'ԟvs~pԮ7'5,Ћ6ǠՀ8f7.1ޖooǾU;ƛ[ T=۷usz.-el՞E}ØNEիQZO7v4ml$ܴHϋۜUEu̼kk΢,A?ooߣٔwG@QMDL鬯{.2xtCş{Oo'Eꀷ{]x 4ޢcgԲ|`]\ZH춄\GK] зף3WUd^Eu(zO^]ECU\l ZOqQ޲{_ 1“(WTֵc\ZHΘkC?'VwzWUq< ! 焐 DބD3PBXT( $CDA1:8NvS99~{ι~}r_Q1&Z*XaePo,O^Q~#x?`h}h#>^ 8_AG=mN^º ۃ S[XLtdT4GӰDׄi6) hHa3cUKOE vQ1:~es7w|))N{Lxt4?tӭ kUqtceUYۉb:Mv9=cMf[gX0þeε ,~`anUNbYK{:;St_;͘`;[~[^(y{pNSކْh"]7V t[ 6㋏Ikm˔y<ػ*oM-nT0խS:fu{i6>@Vdx[6\ ֕ӱ#CI#IM/@o:)))`u)'B67s=޸rdb2u$:VLd\"lZQ}mhGy5-k3dho oݡO'O~U14stTQ/ui 3oZAY~sc#Xb=Gc}>>`k4}%̻u1ONu:a]}> uJ'i74|2?8o8pVzIK|ZЮŒSD;L9\_&M4O5W{tاkK9knuOrCI3#F 54`ֳE:)uӒzτew1%Dţ̻0i]"^FvDb*=%c֔QU|Y{Sw]H-34=WͻLk6/g7sWzٱk0^t,8\ȣ|Ir7QX,DU3ѼP XmϢuXݔNx8uqd(iqv{h፩0/>n$M+XEEsvg {0z ̉,=qb1ɾf:`5t|FƦ^X{C棴HS"o> G8oS*)[k72ZomH}Myi*9p=9l/0Vt.:U||Q>6/%-1E<֎)軃HQn #]?)wD>F~V$ߧrP?oL>&w %^7jB6bu`X\Oh h;`k_1WXUW]Ԇ:Vi#>Su1%P}"g m1A1iu4X= 9oP>A& .F|lb_ϋǸsZeZ;:Y_:16WiI17)eld9qS?\8k˩Nk_erCЃIAij3@e^&GA?vt I{$ wt nN9l},h-YQ#Z'Sع,6&zcO%jNrA!fXL fOOǢu]*HȖ8kShc޷8 ר$΍{le(iZeː*=P鈎!od>q#^WjVmZ j@[rCIH^]*hY&όv;M& 8€k{{Oĸ5^CxOAn5zX=?t{ċU&1Ƙadm⿑iZV?WTj[i,AO 懇槞tAz}[+6K5Y\p5$DK@? dzG}<t{l~"X#0t~'j)&q)SKwQV5QӼ:m?6o=!'0sf_ 0 $@Rʝ$piJK3ijÀbTPkGp A,[g?p~;ge>; ̚sݗg >۴"3%2j,8:>py߄l A}=Q3sxfz ?Ⱦ!2`waLqIW!rْ{&e:X!Ya伳4r=weUY\kqWfEygE[ܫꂶ@z7Uْg^gF_\̌0Ӵ +IsLp'Yӣ뀶;a槆O榺\aO5൰h{R#kKأ$(쭷[g٣Zgy+3Q0-Ҹ _A [kX+}hd22#zM gAo~ -ѯmkG<楊EgF~059Y{;  {{<3C<0U7f=|ǯw\j56-ir v g0cAO8&r|uH+jv̛o:l0&u~dٞm<9²0\x0j/hT'{ۡ*ȟ\GOu{Pz>>#gx.'ݑOWO0=`È>$cEӰ?r#SOYxn#@/%g[)Ԛi9 ri›:Pj}&aLzj޴+3__xdZƨ=MQ2橍*VM::ֽ8O~[ٴ"3;^<3k滒r'އ/j k:Ⱥ9: }`ъf 5,3ƮքeuUԽU{[y0?L/f~bvw/LG+[=az'וkҥ&pYƛɧ3F#a)Zi0r\koat6X?<3-r>fQj |"x*fq]{7΂s{yG GX<= PA|X8d`Q֏9< HÁeT99|{-X܋>Pg{#<)m+{yid̝:{t,{\>g jUA<FCEXOKE+GbKIW0g's:溒={瘒:$$ncUzȸ^ٽY1wȔ{g5e8OpdCɄ"멾ZpI_s݌a~sGr;ap]<{+Sa);Q-sX-5nuK۵ZE!͊0YQ{Y38`^y/~m ͥQ$Kyi6'_t׵,Q֣aVFB!IV@R&7KK}Jͨ]kw~K/|X=7QknAMHik^HoQݞsL0=^Ѱʰ$>U(ߴ qXv6nØ;5;T֩a= ]Rl''9?]Ǻ1~1֮#`}֔.‡Ջ WK}3iyV>[߯d$N)L>'wM܃{VݫL_`n endstream endobj 5 0 obj <> endobj 6 0 obj <> endobj 18 0 obj [/View/Design] endobj 19 0 obj <>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <>>> endobj 11 0 obj <> endobj 10 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 14.0 %%AI8_CreatorVersion: 14.0.0 %%For: (Laurent) () %%Title: (logo_camp_gics.ai) %%CreationDate: 7/9/2009 2:37 PM %%Canvassize: 16383 %%BoundingBox: 211 483 447 559 %%HiResBoundingBox: 211.959 483.9697 446.2236 558.5903 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 10.0 %AI12_BuildNumber: 367 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 0.46 0 0 0 (Bleu global) %%+ 0.33 0 0.73 0 (Citron vert global) %%+ 0 0 1 0 (Jaune global) %%+ 0.3255 0.4431 0.5373 0.1961 (Malt global) %%+ 0 0 0 1 (Noir global) %%+ 1 0.5 0 0 (Nuit global) %%+ 0 0.5 1 0 (Orange global) %%+ 0.43 0.28 0 0 (Petite pervenche global) %%+ 0.5 0.9 0 0 (Prune global) %%+ 0 0.25 0 0 (Rose gobal) %%+ 0 1 1 0 (Rouge global) %%+ 0.8 0 1 0 (Vert global) %%+ 1 1 1 1 ([RepŽrage]) %AI3_Cropmarks: 0 0 595.2754 841.8896 %AI3_TemplateBox: 298.5 420.3896 298.5 420.3896 %AI3_TileBox: 0.142578 -0.045898 595.1328 841.9346 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 1 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: -69 687.8896 2 1627 895 18 0 0 44 116 0 0 0 1 1 0 1 1 0 %AI5_OpenViewLayers: 77 %%PageOrigin:0 0 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 22 0 obj <>stream %%BoundingBox: 211 483 447 559 %%HiResBoundingBox: 211.959 483.9697 446.2236 558.5903 %AI7_Thumbnail: 128 44 8 %%BeginData: 7175 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD13FFA8CFA7CFA8FD78FFA8AEA7A8A7A883A782AEAEFD72FFCFFF %A8AEA7AEA7A783A7A7A782A7A7FD70FFA8A8A7AEA7A782A782827C838283 %7C8282CFFD6DFFAECFA8CFA7A782A6818281FD0482A7828282FD6CFFA8AE %A8A782A681817B817B817B817B827B8282827BAEFD69FFA8AEA7AE83827B %8281817B8281827B82818281A682827BCFFD67FFA8AEA7A77C827B815781 %7B8157817B8157817B817B827B8257AEFD65FFA8CFA8A782A681827B8281 %82818281828182818281828182818281CFFD63FFA8A8A7A782827B817B82 %7B8157817B817B817B817B817B817B827B817BFD62FFAECFA8A782828181 %57A7FFCFA7A68181578281817B8281827B8281827B8282FD13FFA8A8FD05 %7DA8FD0CFFA8A8A8FD27FFA8FFFFFFA8FD0BFFA8A7A7828257815782AEFD %04FFCFA7A7828281828282578157817B81578183FD10FF7E5227F827F827 %F827F82752A8FD08FFA827F852FD0BFF7D27277DFD0DFF275227FD05FFFD %0427F827F827275252A8FD07FFA7AEA7A681828182AEFD0DFFA782818281 %8281827B82AEFD0DFFA85220272727527D7D7DFD042752FD08FF7D272720 %A8FD0AFF7D272727FD0CFF7D272727A8FD04FF2727272027525220272727 %207EFD05FFA7A883A67B815781A7FD0FFF82817B817B817B815783FD0CFF %7D27F827F8527EFD05FF7D27F87DFD08FF2727F82752FD0AFF53F827F87D %FD0BFF52F827F8A8FD04FF2727F82752FFFFA82727F827F8A8FFFFFFA8AE %A7A78182818182FD10FFCF81817B8281827B8257CFFD0AFFA827F8272752 %A8FD07FF7D27A8FD07FF7D27F8272727A8FD09FF5227F82728FD0AFFA827 %27F8277DFD04FF27F827277DFFFFFFA8F8FD0427FFFFA8A783A77C815781 %81FFFFFFA8CFFD0DFFA7578157817B8157577CFD09FFA852F827F827A8FD %09FF7DFD08FF52F827F827F87DFD08FFA827F827F8277DFD09FF2E27F827 %F87DFD04FF2727F82752FD04FF27F827F827FFFFCFA7AE8282818281FD04 %FF8281FD0EFFA67B82818281825782FD09FFA82727202752FD13FF272720 %27272752FD09FF272720272752FD08FFA827272720277DFD04FF27202727 %7DFD04FF5227272720FFFFA7A782827B8157AEFFFFFFA67B817BFD0DFFAE %8157817B81578157A7FD08FF2727F827F8A8FD12FF52272752F827F827A8 %FD07FFA827F827F827F8A8FD07FF52F827F827F87DFD04FF2727F82752FD %04FF52F827F827FFA8ADA7A7828281A7FFFFFFA77BADA78182FD0DFFAE82 %7B82818157587CFD07FFA827F8272752FD13FF52F87DA827F827277DFD07 %FFA8F8272727F82752FD07FFFD062752FD04FF272727F87DFD04FF2727F8 %2727FFAE82A782815782AEFFFFCF57A77CFFA881A7FD0DFFA88157817B81 %577CCFFD06FF7DF827F82752FD12FFA8F8277DFF2727F82727FD07FF7D27 %5252F827F827A8FD05FF5227527DF827F852A8FFFFFF2027F82752FFFFFF %7D27F827F87DFFA7ADA7A78182AEFFFFFF81A7A882CFFFA782CFFD0DFFA7 %8281827B8257CFFD06FF7D272027277DFD12FF522727FFFF7D20272727A8 %FD06FF7D20A8A8272027277DFD04FFA82727FF7DFD0427FD04FF27272720 %7DFFFFA85227272027A8FFA782A7828182FFFFFF8281FFA657CFFFFF8282 %FD0EFFA7817B81575783FD06FF7DF827F8277DFD11FFA827F87DFFFFA827 %F827F852FD06FF52277DFF2727F827F8A8FFFFFF53F852FF7DF827F827A8 %FFFFFF2727F827277D5227F827F8277DFFFFA7A7828282FFFFFFAE81A8FF %8181A8FFFFFF7BADFD0EFFA78281825783FD06FF52272727F87DFD11FF7D %F827A8FFFFFF2827F82727FD06FF5227A8FF7D2727F82752FFFFFF27277D %FF7D27F82727A8FFFFFF27F8272727F8FD04277DA8FFFFA7A7828257CFFF %FFFF8282FF82817BAEFFFFFFAE57CFFD0EFF8381575757FD06FF52F827F8 %2752FD11FF272752FD04FF7DF827F8277DFD05FFF827A8FFA827F827F827 %A8FF522727FFFFA8F827F8277DFFFFFF2727F827277D7DA8A8FD05FFCF83 %A782AEFFFFFFAD81FFFF828182A8FD04FFAD82FD0FFFA782577CFD06FF59 %272727207DFD10FFA82720FD06522720272752FD04FFA82727FFFFFF7D27 %2027277DA82727A8FFFFA8272027277DFFFFFF272027277DFD09FFA7A782 %A7FFFFFFCF57AEFFA757817BAEFD05FF82A7FD0FFF7B572DFD06FF84F827 %F82727FD10FF52F827F827F827F827F827F827F8A8FFFFFFA8F827FD04FF %2727F8272752F852FD04FF2727F82752FFFFFF2727F82752FD09FFA882A7 %A7FFA7AD81A6FFFF82817B82A8FD05FFA882CFFD09FFCFCFA7A67B825757 %A8FD05FFAF27F8272727A8FD0FFFF82752A87DFD04A87D2727F8277DFFFF %FF7D2727FD04FF7D2727F82727277DFD04FF522727F87DFFFFFF272727F8 %7DFD09FF82837C827B815781A8FFA7817B8157AEFD06FF8282FD06FFA8AD %82815781578157572DA8FD06FF5227F827F87DFD0EFF7D27F8A8FD06FFA8 %27F827F827A8FFFF7DF852FD04FFA827F827F82727FD05FF2727F82727FF %FFFF2027F82752FD09FFA782A78182818282FFFFAD81828182A7FD07FF81 %ADCFCFA7A7818281A68282818281825757A7FD07FFFD042720FD0EFF5220 %52FD08FF5227202727A8FFFF522752FD05FF52272027277DFD05FF522727 %2052FFFFFF272727207DFD09FF82837C827B8157A7FFCF57817B8157AEFD %07FFCF5781578181A7A7FFFFAE7B817B8157572DA8FD07FFA8F827F82727 %FD09FF527DFFA8F8277DFD08FFA8F827F82752FFFF52F87DFD05FFA8F827 %F827A8FD05FF5227F827F8FFFFFF2727F82752FD09FFA782A681828181A8 %FF82817B828181A7FD08FFAEA7AEA8FFFFFFA7A681817B828182575783FD %08FF84F8FD0427A8FD05FFA82727A8FF522727AFFD08FFA8272727F827A8 %FF272752FD06FF52272752FD06FF7DF8272727A8FFFF27F827277DFD09FF %7C827C8157817B827B817B81578157AEFD0CFFA7A77B8157817B81578157 %572DA8FD09FFA82727F827F82752535227F82720FFA827F852FD0AFF2727 %F827F87DA827F87DFD06FF7D27F8A8FD06FF5227F827F87DFFFFF827F827 %52FD09FFAD8182818281827B82818281828182A7FFCFFD08FFAE82828182 %81828182818281582D2DA8FD0BFF7D52FD04272027272752AFFFA827527D %FD0AFFA827522E5252A827277DFD07FF527DFD07FF7D275252277DFFFF52 %2752277DFD09FF83817B8157817B8157817B817B817B817B827B8281A682 %A78282578157817B817B817B8157812D2D2DFD0FFF7EA87D7D7DA8A9FD19 %FFA8FD28FF57827B827B8281827B8281827B8281817B828181578281817B %8281817B8281827B828182512D2DA8FD58FFA85157577B57817B8157817B %8157817B8157817B8157817B8157817B8157817B81577B2D2D047DFD5AFF %A8575857827B828182818281828182818281828182818281828182818281 %82577C2D2D0B7DFD5CFFA82D57517B578157817B817B817B817B817B817B %817B817B817B81578157572D2D057DFD5EFFCF582D2D58577C57827B827B %82818281828182818281827B82575851572D2D2DA8FD61FF7C2D052D2D57 %2DFD04577B577B5781577B577B57572D512D2D042D52FD64FFAE83512D0B %2D2D572D585157515851572D58FD042D0B2D2D7DA8FD68FF7D7C2D2D0B2D %052D052D052D052D042D052D2D587DFD6EFFA8A87D7D527C5258517C587D %7CA8A8FDE3FFFF %%EndData endstream endobj 23 0 obj <>stream %AI12_CompressedDatax%u&?|(0m7#bUS\@R&F!,e3ꬬҨbHz9w/#Ƞ*dY~vY8^O>ݽx}O8ՙEʮO߽N?}Ow>O ';97z_}wYyrQO?ijg硜旼^%߻jˏo.????Νb,g)5|_E-5\xr+ru>>d6|^^7>>~gW/_#߼>ݻw7{.~}N3_]~׿? ]B.<S;y<_SYY~$eyg^w;RoCwO?p:9;xO ?\svZvg?w;~o?}%_ן^-"~W7w~;wxf~:doۏɷ/o?~S?O2}$ן#tKg5Z[~wu6YgYjX&$TdT[司 Ï=?W?ҽwb&߿w~18kvw#n߽FԲ+~7weK~|g2:~EǫrmG~݇{r;˵fg^8/gɺusyoǓ {'߼嫿yV8g+C'l_.tWo>|}=;;}G|'iͧ/~կ~{o>}_|Ǘ/~,^+~ رw'Wp㷋3?|}1ͻ^:ٯ ߼bOןI݇OՏ'cy߽x#ݧ?O 쫙>=1?2./W߽{ͧ7{~=ސ{jB퇯r w[ƕ+禯s.9~0t•?{"~Q@>x_mtoíuM7&ߤxnoo//u.:]p-]OWW7WWWWWW^|UWjl\t/åt^|.Ebj]v.ZkQS-4\m^ Q)j-5TEkթܖr]e(RJ./L6|/EnsN9}vyJ&]tEeR)$\m*^Ƌb%昢hGpnu "4J!Bw .Lk/oO>w~r]+w.\s]r'v&Ic|1 Y&$6_r\|<ybyCLOy*g?l8.8.!OW'O<=8½G!OGzµ垣>p9VeaMXȥka)~͈i&,i‚.] K '/* ¸0 s,ZmyauQX^W^+x#ßEzaQXfY^3z#$^aMXkaͷ ,; .›KaoeUGabzh" E,\˒m /"#"B )W"Zn$Ƌȉ"z*BҕIwѕDeMDڥkYW;/b/" W"on'^gEV"^eL"r("8(o!7\ӎ0rδUcaO?bώC"{ȶb[|y<$'>rũ=>,;<ĈY'kzK=/l/ڳ^kzKjsMK[7mIZh_eOİG/{V&=zS/˞u^V6CiFF.>w1ċCuq12y}qϟl9vc/_bby*N{'Cbv>홐#'}s?u1ѿ ﺘgB».&3!]ᙐ𮋉LHx{:BYmi*QY&\ W\{䴸ε.ĩ#9ey.'jT"a3eq.'*=l 2"c#Tw.[=+ h.߽:C|kˏ0݊\x?zr$zrQN.IN.b&=b]gmtR>`.#g}eڮïpa{g~\?.) ie~?|,M=lXYnqVG( #/8vXОF.i!^ukoBF|1g(q :Ƒ{ۖYyM{keCH/sBr/_|}tJcΊΗΣΰ<׊"j 0xbp }o7 /jQg4B&C<q6f sig/"PVt=q\bm(Hvqq3O&'OcVq5q\WB##cn?rNyD$":V3fv̮ `fDxƞgۏco(|PEnCI4/rcjLb~Pcܘ+G1 .#w]qBUV6=HhKf/-ZA5Ŷ"Wާ,)g0,ڲf\g ^;F'Woޝ}}wO]kn ҭQ||XY{LA[vղǕխLMDX lq^x8 e`´-C L`asF0cd13$#1C2s1VBfkG^af tCz뉰Ǎ#!q=٣N5=2^(wm\S~bPl&c}~eLvCv{vOoڸeϕ={06<>ɢ}=a8ؖXD-f^ֹYguƹ̈ gxEg.ucv0?!״L9jW\mXoXqXsXu\yX{X}+k0qb%FY^VqwU_Ҏ ;8(ۑ:΋;B6.g[_v^J ˟:0h|5{9Lt%g|^ˋb:_޷gA[ZBT;_]q<S;4}_<ڇ)y[` ~ϟξ / =WC^TlacQغlghbfo̔wfG&d3^ F>Lh&t1|eZǍ]yY[4qhaGMqiDž͎jŸpt+ztݲe(CՐC%ow|$DnvM$[H7ljؕf#H%l), .3 5!zJs ?^@_bO`!!\iʹ0~ KvAvƯ>~ݻwwg ~7v P%0XI^.=/`A#UeZ߀z?0_MŒuXCK0sd an0s0f>:g|!lyyryĽ ZʼnTSu\"N&P=2uobH\{/se,@bg:빞o5mčVy8ed=zpcJG&Ppfx]ҎqjGAj5%'G 9ߘA7!YBҎq:`f&5Ù}vY{! fNc7;v'mi"){RVeS㠀^)*{U{MF{մ߫(/^ b.;ݚ =hք(a-N79قՏZGZ\jHcjJRYi)ʒOVUN+o݋ͥrC V%8,-+˯Y}a^}MkvIk3ikcyvgW1NDܓ2+~ :*~vrXJjG%۶ K^z4rfNlQ(xVmKnL$|?,PU> Kz$2yt.4 `Wzc ٧t]=]n~K]Ű|}vx%_9 P'>[ zPnA}.Cu(2pbfmbK96KYuifL6i[Xqݐ벍m7?ň4Yw=RzÜPL0:hd`Rp/ &-, BEœБ,MR#B#L+s/m _M?ҾHR0'6x}J vZ".^|Xݣ9XcR8ʎ/-Qٲ%;s)Z,[ѳJ} *E+QM%m-m5E=e[81"O|Z܃vOxA){҂<|YJ *U^, .,CU/=C'{7a~)i/MEϣxgtA%Du\MNt9{~X6b@0O_YXX@N -ltWVQ,8v m3 -|cnPb|c|n7}:֙G*Cɗe |'vxrxjG)(D)Lox eClgJſV~[ Ulʕ*ںvf^B_Wk;!KmkanXZ s 'ʀ4:q጗/6pF2z}BS F0./\Vq3ء?K$xM>d7j::j@ 5[[17 !EFꆍT:/Mi_4mE6c's@yA1mGCcAay#0zsCA:Qf 9'C.Rh:%r9߲^ǜ{T\n^i`I4Fb?3&E`E@lEeYIY&֬; ʫDe˲w:q() Pa`Yg+kq+F3P({(A2K3AO|YO=̿RU1d<.:[ygN2sk~3!DžuRLIV@2o*zgpZ­,r צ\Zن ,mb-{2[8wh9rAXu2: 8`mha1Px<,:.RE:.]Ǝ/DImӅjYß;GxYV"XœǧUΣeo(ts2-'d~,vǃwZY^F~ٵnN3TWLaLxP8Ygc]Zc]|c`)qJ0hOכr$_XywpNuU\zF̍rsr-5K/)ݪ)†6Kz,FiDeC[m00[fea3{V7-'J16/ ٳ6QfQO,пӨ+>!s{ E,I`8ťBE)Kv{<>hr\a5Z[lGHSMFۛ۫K쮬ŝXc'vfGǴ=~ܳF>~ܳ>~ܳ>~ܳRl[+u}`7d-KYY8gfmΞMYdڣe~̹[ϲ1~kI-?YsMQ>firgy%^cYzMN1YeĚ,OæBv:Kցʚu2vvZԴĝYU^8o),-[]/=Յrx4G%A[$5=1`+-/YAPIm zJjKnRM1uKL)m [r^O/sP{Rg9r~.eW~:NAnau$|C XO_\p-?ߤ_ jY'[%WԎZhy9O1EsG P9կ>~ͧ>~F߼|o]~O~~ӫן>ۿ~wow3=8ep58!'_}BhCYn>9ǩk#ܟ~鷽:.W|e ZFie!-IA}7Z޼:-|oꤏs$ O_KlDM,<$@sjY4'bR L9X%'?e;k6>,hb7{՞U'xV:sW{OQԋ&v*tZMpBa &瓋YOubGb&y0QFk}X2]B,}AXR><)L4 SJVB?S˚p NL, |+$rئ$ųaH?CM^cPJ!LpJ\S:J~:0?JV#j;&eDB=Qߨ@9pH:a֔ȲVr!aROS .0qwb <ۉşR Ģ1qFeV܉rp$WEtFL%eN^qe|\/BEQAR+5"V(_dxw,Mٮ]Ѫ^Vl"/ O˔=J@h":IHi?d:B7./[s}UA5!ƳۆtV$T&Wp J'Cl]KQ0Y]g0rӪ5) Ey*9YB*8UlT ZIB㤬1<׼ \ mi΄!L{ pjpYH!kN v+JR"['mLg˟lU@ɩuhRtTOFj)q ]"SLvxSڋ4OqK'tjt" 8L=XpWROTЂE"uN*QֺsDo i rj~|Vj Bċ B|VV.1bӟNDp.Y o$L[ Y8`QO֩XӰ\vWzb,|7+SvV\e*UAG\XsUjS/jlϑVYpj-Y)1jiZ!B8R}5'l76c_YTOpHѭ8AvbUg۹~ u"((Y@,.3raEQ N,_r/jC5/?ei춻knYۖ]aJ#[9p<'2%CY?]9Zn.e ꪨʳZn3Ha,VM6'6:*.fO nyj mRdj`(5rƾxE,M󪃖^fK-Sim"68I09gBJXO *4nb7}jt0U@wLMNnAnb롮Q_egʈ6!+L+|e]$BZ&05* +.'i"jFuA= 8ATL~rBKDB, (tBNmQlN(RDE(rPjN`pl FӼ[,Ap AlPD95L:̗paP#0I'  xI N;7Ope+5hMEE5)/MM_݉AOL"") $ U jhYvo2vT') @NL A'AVD*t="zF% Gș5 `*3Jv:"$] $!v0l X1H3԰) nvVo _HJ@ZATT(5PhbIK c84^C' u]*D$>&%z9; [GJ\1 $>9ʓ&Q/iҺD,TEQʼnV Jj 7.Q YP䶢.7M)M:ޤ[k.~${8`j?7ʤ@ |#V_IJT>fcB62IU^I,5I%8) GM="nL> kbQzXWT#ua)Mw҈ʍS[W$\4.;> rG[!%@BA-jDentQuq >+\!WA'FR K_(B΀@UEpBTucMjg$D1ѤTH*8na`go Fm",s4ټ Iɉ$Qq[ PSxgۦPy" [!A?¡X-Wxd`BLFB$M(jEUܭ}FQ5s:E ŏnIaK ]^@" F}WƮ,zP79Xݐ-mRu_oC5Eh 6^[rSRjDN-RLȓ*vT+hZZf}AdwR$%+TO!e|Ts!+5C*YZ| U!Bu2p7I93ć\"$@~O3Lm[zvD'!4@=PjH_8pY:8*Fo("2"htj ?6{١*-c QyJY\W5AoAċ6@+&gqъ8jc3 *9ƍΆ &Z ;.ȿh`뼺Rh\t@2_'.좉( |`^PK|Z:qe#av5y-/Auǩn+pe9lM< i6Gn2E'|R1A2h(=(32$2YWC+[f.@@v0}`6374+Π|AT,i`.Nyp'*4u5xg@ͪE)/F9Vqq"1 QB'WeQ$s|م( `'TpS7o37Xb; rb(#VC[Q 5&4ľ'd XsH9BŚga쉶+ "klR }%% `Qn2H77O ## 5 \aB"af,^_Ѹd'B:Z3s{kK7J֘ efZC'}b4ƄOq~ }yݡVW?QSa+Gr` ԉE!\ =9+VӐPy(lL9v:3[S(P!a) ?L$m{2(`n+ x53Cx y@d äQ}nYzXL)BL|&z &,V3r$'M]#}J0]ff *MHCPkQeȯq5%J !e+>!t8j}3( QevْyPOQc u$N(ɜ:3I]#dr)؀rBĄAmsFQasCr8yGq!`b ; 0Jqͦ1ˌ<`ݵBB.x1Ehæ@`RʷT1cRT>x(G näK4Qi{|*0bL!ɩ'6HLp J3G 9"lfǚMK<^#+Be8|b&T:ȭ>kcL[-+}I$¬m'E\~oMU}Ws0NbGީ- HM 0t1XԌ&i'(:cú'&&%] oqR+L Ʈ_tm`9*#~dEUQbHzՇmCقZ}%M8jnsƦ75+SÉLfKXB a^Ej2p; jߩ VjBUcT )ݴL\~5Q XsѴTQ(Xpr~O35D?yUUBS3iјBY禪QƹA&%;*+zۜ,Ge*`tYF"$ ':Ie_rjؕE|Om72A56S#k$iKJlӹay#r+R? 5W(]_`Jŗa*v01>@U!#ЍvRK]Ow?Ij0gI}jguzq[NJu H`{+1+^|?tp1 R"YzYR/ gUz0bޥ'4X\ ̤~̙!kq_qq@U![Zg@A:)rĭ7@#*#i1sg?W=;oS}=u3Jp?c `by\l=W-zj=t|HLp#ؔ3gŬ 18r'zMMѾ,}z?@Y8EnT|O.AISG\^*M$o,ݡdi vmn S:͗`D^hRw;ɱw ɝ̙'wQeCyUNS=QXX4Gݷ|>v),Ic'^F܇F szjLGh)kBq&{M6m]A™NiL?bc X zgT]te`2b4zGVI`w> P5|ڪgםyz==Ւ8zXqgcD-G]PFlư#*mSZ cYMjMXLE2uR_=1Wmth@ըADNg=wk]X[YL21$`#spK:}rCC|2LՔ1n%7( h\ҘڡKt8= &e;[.ަ|J9HG60(ʮN )1j,'wUIbEq8hU C>~XY ?Šv@FPxQ?W#{kV?s8m 1huưzSPA-tTG#pG.Ȋ)&gz3޳Ql7[`5G@%l'Pt|CaX>"x_PO̰oy RSl)-԰݌?)4Ư)5&wiQA(t1ӷzzU,pU#~XxMUVʰlE[)PWԂam vϼ`:O faEG#saq2Oy+c iHt$=:n4cU?rXsĻB` + D`sq#NWUi 3::h+d:FNAՑb)cHAz5.o jA Z)NyTӂt){U e&T$ Á7[C*/zdUgUGao6CHQZES`7VX.FAۤ3($\O΄@8V2j=݁Ge֠L̕:h-dFYc׀Ҟ Np{n͚,ubçʠ%1>?27GM#5DתT`_xc|UQZDalfV"@MBۃZ>}M,LImt0tRW5-(\!ر}ז Q+ʃdfH׳eD܉(X"L&jc?bW^%\~'Èpl&Z@$}I' 8҈wյ~RN:K`Hi{ qN,EifR/"ćkM͌FԬm xUa)h1PRM% 3Q-rPba2X fUĘiSĒUţR~Ni+/IhjR&$""\M R6PO4,wIPb댢c(IXE\PT1Caә0sdۖ7mTBWmq[gm"ahfEۡXLk܍y6#{@TvC1k5ĉb7+T5ߨͶq؆j#wm $6KKэ6H2N #?t-9s:A [ r*`6|em'O):N˭ɤ 1 ZlvB@eaÊaՄNܠS_u/iό !F+@Tި!6@`S2H͹ߕuwZI$= $X(;}z4F2Ol>.&fN@#^ uh.<S"Ff&pY4ʴɄԻ}pEqs=j}\Pce4 V& vP׉*>=Oniv|I"hf{BnIj9\40&X(]w<=,p4o4Ao,)iܶPcx1t9Q378|9ZrȮ̪0Dc`A3kk?'%D!϶;!%xiHJǟ‡ @beP~7R- iW͝f2Uk5By':Bu&!?#ttmp5w9zI@0ƼNopvB0Mh.0? q]M>$05:֍֬#Snځ=&E[@OdD+m>?Vwv>IϬEMFYmjvbP;M[PVk&`': cҪzznq 01duh֢ZũCd^D_ N:jz jEV+RoIlłgƁ3 &.+rKbD"&ZthK„3bLCb*t9 >y+LO)mנEn8hJ3CK65}$mEke10 (Ԍ LroU+g <锥]U|u: ,ك5#si3gqkH.whf/mC룂1DuԾ!9^;kfju9dY-YY.21ipōľ'm8A67,IѬ-clKSSC d(%]x: ԣ6z*j;oшyiYnm(PYvt:IПkAۑ۲g?:BźOz͢a,-k묅 ]GCUeЋE F;lhʂF]jP'ŴJR!3eaj+?hSzH~^4MT;Tyu^z}=Un[Ed;cJ,ZÇ GUT TF+=QeeQ4"#,Y~tZ+ӌQT)DG W>HZ^FhVZlh%|ض7 4|1 jF`hmz Ir NÉi7hS0w^ɲAQl;РMG៩n̚! $:d-zIE6jRz6Q}6H"^ :͏z8V;%V'n} n3v;ԣpY`̭)IUZ*kO+!(B[;y5\,b`16zk`2U'P=S%%WY~K2kJTY-Ʒ> K;8[-UgY,FD &cY,Q>3Kc0UEm`(6YEcP?,8-_GF4'@9C"X 뜾)bВ6~ĀLTZi2}<@%*Yqf]ip3bGv #iHJfˠv??z5BoYA%˩b~Gt\iHGL r[@U?#h-ެ 8z -[db 0+* :$5V3"Q34\PgQ~(`paCZwT+=AslJc`֔J \\`(~ ĪIk{3pBT%ڝX}OBzyA5 *MN}@%FBA!ST5mن9jԇ U"F,^{Of' e蓇[4BĬyQ\,nVK} ƼUZ,h\`ڻEV ~e?F '?FJEHÓ|lƨwpf ,ZGlosGC1>o$z Xaa[l~v*A?;&jˣY]4>8` GĪdhb2iT -j=Ūqo4ޢiMD'塭M6Q .T8x[,vRE+N z+(5 {h*39Ѩe=;79F Ƣ0\j2j+F sLId!h6,O;aWH/3+>ٖ' rh[e*h)/r;z.&{ 5:R,WjV6p["4ˈ֌  P=Et79TK mlM:N\HE%+!AX@ Vx|.WB_=a7Bl~s@Ib&>T`&㡦Ѵ=a8m\ZHXz8Ǹifj}Y;XE8SZbb6]Ɇ]o pR*+Փ^"QVl'19%n&Mlanvfr|#7f `Z㵨N<OW"sC:]M* FUQ,KjAd*X3'v1t.0U5,5h(뵟uwGfQe sâzv]b dea)ªnFMHV%Y0i2jH5زNaEy~@2ʇ6Q}! JM-gĭG݈v.ftdle=櫌MUet= E/Ŋ -~`} #%Y{l!g[*%g 5- za7w:sZ]>3* g` #ь%h.ձ($C8}LږYkK ܚV9*#%`&dV|ʚD[k+u?Ɉf.jgaC!ߺY,{pIQ bs:Ȯj} `^EWTY~;UA%ؒis$hyvSĚwŋAwhˠo?w"SڸRtRAN]"j퍛7hY:BE>ʎiflOBGT Az߫/Mb@DWMq _hHUhSF;:ImJ7Uka@I9QEUJctx4_QxwZTӘ&C&t3ڐ|u!d09j*nʪw+-WӸ_,s%Jp6 ^-x. )Nd֥'51UbHf`)hxH A[[R6KVŪS^4U7[{V3R5WFB8Gu:M?JS_c5kz8Cw# E#5Vg%XPh\d `50˱1 aՠ:mT^jޛXټG$`q2dDt-0E",]+v*kPGD@}q L U0ϝԇ5U+ǠUa[ed" fke" .n%ip\Оm0B$v0ی RՖ-c,3 v%A5R:ՓfV@D5("J:>v Sm.E v͏%6AEv " /nl=ĚN1k>Z6lҺ`WFWHm$[A(τ Lym?+*"㢬-@xAObTa.cmO;T /t<{:yi˨p0W_;5W> ZL}- X>J6tPmFڞȴn\dꑦ@ɰ'4fpAR'@ȣMDLG=kƤxXA.BZMP9!r֤IzV&:X,[>C\4:WzC\+?Zjfʸha< f1nDutb،eӬ6uk]`b9l*ߴ%&d h %-`Phf h٠Q `mR ,E&{pW|ЪVR"jD?P, (ث&/e H*6׀ѫATT4BU߄ 4'?FuiI#'R E|@*V`_τ_7j;YpV-M.*W55;T[ukRUʩswB8}j;cUQZy#9zKG6hEQ;-03%벵3}Ŵf]@%Tnw%k"A1ϋh @"=$ (9UG}wazhE Y :YchLjU%lT(JBqrLzДCJZ$'+,{,:BTbC?j%-7bZ,ZKVnPՒW,񬝩g")MzIs7+E D2"J Üm亁s'  $NXà~78Ot<Қ@9vdl0$h.KZ4'lhHXQ&yΓfsj' 1-h5O5tŋf 3hw&TeE2[vg]{isàŴN`ܕUDf'j pF6[ r/*Q)`팦uXJ,ެ$hZ&ASfr3]P=#"5, ~n3֚u@*݌x}Db9mRd ͹a6׵vy ]bY-p'NZy5ikbUK e:o 1o[e5@;6,bQITnO`UuB0lGTZc3 a7ނ;XjE)j1g3Xh+BfG~Fy2[b&@mǢ0VG`'@o'2jGKOMKdߋ7`KuSDCL_KgBReK6ظjD ZtejRg]YMTְ rn2,WT ܩPrM>@د~B>i:Χy(wkL(ee_VSFɊ\)875zCN!*V#>5 qEZXx<^J[k޼ۗPq?k-U-EL+/@D-: hiU5h  g ܢsjĆ9lV[Ij;`x2]AU6]w&Ծ:%HvD*Y[Ġ8֦g90*TIh~$ ]va0$_ OHVZW5AB3T)D )E uf9>9 ccFGТpp K1q"`&tbl zyWhELEM)+z7An▮#( j` #P& rpCާ`EH\QD :1N{tPԸyn9tЂR|j -ttQrQ|`?ez)qXy5=VmsF>4Srσ5A!0ޖ7{+]M'mzV:uI0-#['ꓚ"9פSPü6#$"Awr6"4 &ON+"瑈̬5+ VLIGÆN`IM:t,ڬ8U%ST4˱G_V[Q:&҂Ѹr1;`-w ͣ聅`L`'SaeWA! >*iky=c7CP"l;)|(3icw_lؗFs$z[exZ8PgU`"Yo1ȓ vOފ^WgBP9a:X 4Y oD4l0YH6u9iƍXm5\1H=CKl|4OHYSK1=,#yjiL(,c"@Y,iJ0jJ f];\gi؀?rZTNgs=`<0h\aE:!C-Zu@J˻=kb`sC7 ?kokٲ] ) Ê:=9lY2/ xHQ6-&Eӷ%ޣoLuv֌jcqP;N^x&~FM%*C<E9@aIX`\Baf‘)>P% o0`,&PRr(|v9fIf<ΤؙC I,- #R+<ƙ#簃ϯ3Iu PF*^•(ǹZu ;m B0xD|?ݼ ް;ƙ!sD9fa7_OiyyGOTkȩ}$QA`S&A $P5XcƦ c FEvZAi*/b-i;&Nʕi-`dnccP;;]V{wNfk\e2ut˚Iǰ>Ej6 6@} h?lGSjj3W1ݏw Mdr^&]͚r(F-<ͪ)7% Jϋ-(W6;Y38P1nak;]jw*%"66W3ھ{U`"^X/6+pVJrrEpdݤN"ûMc$ЗH9ëFw -u_ !30 TkY  bo"郳𱡸 A2JT;vp:;8ӷG8H O11؄ꠊ 6K9'^cmb_4C8h⏐1R9LaN'r 2<gjpD/6 ȑ˜aIƓxp]TUӥe\Y V,g9N CdcCg]݀;^cέZMF$bSWxG%a2̖XHs=(C\b^RST͏lׁq6N O[C$ _kS v(XVHu1`$1T> [B ]L,{؃ ^' 6b"kgY!0L}EX&w!Zn`^Y$O 6\1k˳_Y&TQ";~[%#45cIBxM,; ̢V|_+Q֨D;6~RRG.ڬ. 4.X|" $(2@APf6CL}5Y@B,Ę:u=\rN+(aś_"̎Od)IfEPk뱛'k:vHha^//Z+, *ޔ]!@ 3d7JT݌ #IY3(KCVЙGÂ7|S-WCZ>BjS0ѥ*ěp *ei^f_WTU$slXHY>+:XBH1 _n7RK^dɽwhq EX׆\ EJ66xnws6XI|?1z4ZMD>0OT@/2ܴ0}VYxg" $^Tm{MbhC?l#L oQ",xi|:G#K, njY2LBP{5)pxz4,rJi(x'r5 $nb-6 Mޑ-^D*iD9,ϩcwn+twGh.4lvǺl1alrdmSKi e?N,,a`'H!|؛~Glַ݊ ^yΝ`,-Dž+3 1q3~&||,N2O\YǭP65M8]L'vEZ("P 1@? K1C,D-~SR% ^ɤNb YZEDi`(54=O{3H`K8֭ `jC)pJ%mz0_F $*:"n|d{ACrewJ-XPʊP-vJ"y[>N#A7>B")*dڒT|:e8s,a& y_bG]AQy) ZDVCQh,Ba\zp[mIplLY"W%:%vHϴL!`&n0K!`a&I!QYْĔGzʐMVZcwqWj]zq\EٞOxA!qn }dݞW^5C̐ĸ)&xZ_E=$ސ.Y8R >vfˡ,Ln8gw#$Y|'I< ТgYPR pLM=+Ώ<ѕ<(Ty4 :AO:lS8Bt*M.$Uuw+B_eam`+_^c |8Gf7 )A׌PR%sS G+<{5 P Mb@6. D aX5m_'b RΊY?DSW7v(4t,~yjfyo#T(i;#M. WpѰ㤄Dž (&MBq)bgx ViDsZȓR!" C6ѴwTWFDJ_&"0k-󕹀8]A ?bUmT|1)x+CŲ+ǐ5P,wJ n^o*#T*~# ERNoݜ65,Psh VJ)Yd2b|S FFd),2 \EmTZ$C|l@!(3y-͢QyY 8E>_'?9m1(ƅ̏X}it3Ҷ8-] CXSVӶ SÉȦpfNɌIIӤ4cxyQ9R N-X۞c`}N;c L졇K BeSHHژa&[m@12JZ,`T9 CE_&|e$rgk% {sVKVHb(FgYie!VlG =ݰfr!e(p'8X "W}&~0m*C^ K4ϒ_baB竸 48RZ N%0yfzR}N=(l  $`D᳇b@1$]I~Դ|zV|36xp+6W0{yŹEOck-}Kڬwr9gKQƦ= :絟7I$ͺ9ƽ%~OsVNTpţҒ\_;n%O G,ΌQi8A"->܄:beF$#MKy*` 30ЦCњLC qNTR  B5Є}7WOu8\i؂pha#3M^v b9ҠD08F'ئ`y62W[4S6ݭF#15@Q,rG|I:OCFDAH xhw9 ڈ[:@\AUEcIꀝts l5=*}],C͚$N 'ʖQ'!Pjz*·^6X26;/SUc2aՁ?n{D%Adpq}x8<'j0ҸWKb !f%BߋF`qA0|ڛDtm uOXY@׆!tWáAխۜyݟ'rV~ECű} h\7ګUKd '%P#0s(Fcw4.1Q΃;Ƣk[$'U) L5xtezU0NMD]ˎ~&!Sn*dZ=q:~;٠k6O1\Vf vaA&z)1f T}-8 `;"xHz zU7oӂ1vwך2`Oa;T \l,҇%sjͥ$a SK%Vҵ,qe׉f8ݟ0U -?,y4=6MM{68R0\pc٪5.{#r=JZyt(eYKxYOK@nݤ;x(˺V(9+n+̫0O$"l8a|n"31FT-{?VfAļ (t$P_5[k -qf5%;Yi'ۗu#Tc,~(DF n YHo(խ>8[p(κ:[0M׈xx8t~rEc7'/*H\|Lel< P+Ӂb'FʏfyYp22p9p0!Onព6EU!TۙV4Q62/E:$jB~_Vr [v=zkI *12v~O4Eɤo-:{8K64Py%B8ӬX{hbsc FM Й`{)Ne9X|- h/#tX&D(H W Ekլc?0wXwk#Snp 嚲$ G(3{yf\d}X(]^Ҿz(@=wT:^62`0}q~4SRp|M'C Ē*N&KŢ΀祍8/ Ab*CA0~m)SLJV^!x~"SլſAW%1塉5%J زQY)pYAms!h%ʀScoN;Pt LP{E3~4S(Us!&lV KtIT0x."VtC-`L@kg#]]Df W`/J.Ꮁ$BB:Ck(zsa )A(]"J]r DV(| JOA+$R||Z2W4=)("!Eh4'6WLCo)N;d`ns[7>'R:Ed߼bNκGܘߑ;9]SV3ea$m "Bm3I)dY(0*e j<@<S:I2w !bL(FU*Q. صE-PC$_#Nv(:mMZp$M\FA\VԬ$ ALdUK ]xXL / s3T6W4BYηHdK۱@)9db!mk~D2{Tr2gg\\=" S4uR2| 80LkCH`@՚h<UDW0|;vn_xCYj:z(+YEp,Ȧ9/&UUnu 7L)bY~j[#| Z(bv78;|!8:E,R$6:&X@O?r?A~T&ѪTTĕ|NGљdܢizT#>-m|YL' U<}5y(Y/GL'M39tSJd8L_TާD?)EN $3*x _s:iff9ŒSyVZW3 њSX GODN#NZ:L̊g}sNڌضYW֝S4_=ΤKg3+ #t7LXȊ VS9wYj(*9ͷM*HX;삘LWeLr(eySTx(o@IPNwу]>/rRDWn*5-Q"f)N%/do`))ǔ -fM&U*y4i¼)oə_W .R(=0ݰQ>KՃ󫺯ˌ I,On,g#`7lPk<+el&hvAM7 peQIxK16b1|[5;)Ys ɟUomWL*&[jUHUK:=}&tiٹHXuHfe$!?6z6"=l#G5".kntLELeȺJL+߼< *K<#Ipaseg'i g8ԕ ][CMkGZR}:$a]Ҷ xlോ h@@3Z\.cK-aQ&$ {_Fř13R@(j4=H:> \U<i_&U$Fv|(%MUû# >Vcs 9oRμ Chz ~{`r=!UEK%g&waI&*q\2! ;a8B 8HG7–LF?y.Ȩ;5$D.WBP,k$ROtQѣ-}&D6Eu\ {deyiZꦋfHALkҳ1ytf6J ]^%>aAo}ҞR\cӧ N0]b-^XgaIBI N<)#! kQ]Lrލq=ypt"8&(6m~M(LjB0VZzR b4l8Р nś"u~a&IpywI`$r Q55< sPqFK@tOTɪpz/9~R)%c"yІ0)dF: ܅_O,byY>!6ͼ+3ّJ$J-uM[O;jZIW?Bsu$eiS'xT75A^2YS>wPhAŋ:f6 ߷\)N-ÇN,৹ 2q"G( 2{.Ŵʪ'Nw4/w3ćkD,uD"wrJ$ O%gB S3Y3Sz\5Ea_vi\/Gq3E h.S,V@ qQ%F9ir4 .ZxFRFp-ͨߦ"O2(b] }BJG|d[6d0"#r3{x7sJ7ʩ >x#C<~LEckՐH258S1Ploɗ9΢|Ǯ-Jx2 ZJ!>RKCuuQh,bncsD!!Jcm a"9Nc>`{a4uV~mmI,Ȑ#mY4>GE,a/B΄_m{! [Dk#41UU.v T>:M6mWoxv 8Nj- T<>X۰31L6f }0R|ػYz7j1䧓1%AUp߁C c)9Vb19[poۧA$}S+'$'\Zi*/],eSU+YTeeSI+F8>2]z57f)Wd'PJpڠ9 ~l " ۠8f߶+W07_RU@< ʌ*Υ@O$v4м<:XDу]i /;ݪ썗JhRMq~Tx@c_6.ɹ(xg)f&|ե9if:[ 4 _JSi 8|y&WM6m&=kya7sه6/Ҫ@]I|7XY&yp>%Q=xȓ&Bɜ뉟߂5 9:$>.hCoXي & 'dxPM yˇCNRHj6J۳_qayM, %-w gVJ0c* Si3ɃCNYPeT .reYl`| xlY;5C4Rg;De+@iJիN~tz1^sm+a۹{nb[)7*/㢗Zm UJr4m.ReJ:zyDQW|޺6)5SYsܚK(arƎtW y =} _)CZ?OR&#Pmp=%/W0\/}Fy62.Pn/ēJ@4=s룏{b&%1yPRO\|EuOj@E% sšqi?(i՚'i>Tpgn301Bl [Ӣ>ﻺX k]a{wfVgIY]:@hvw@(.J˲jQ7.ǭMsȖ͢[N*Bb^,|/}E')Έj$;zᢠ #ToiV *ShrX.wM7Cy!"Ig=\|RZqr;O$9#{צ齙=sYdtJtMi^dϹdžp>!k,gןwv#*C|zUE?#ϯ~>{mD H?DqDS;4rXo\]*fzuK,u(I|) #;LSY v̖K_7~czKLH_ !"=j( b$%J9-N#5pk$nAL3/めØlIdUdӭAC2Yx+/MSÃ8|MG!ܘɭϟ @!x\s;˘wVrbo vW+&\/wŧUyt|yECMOjX:7Xm:(//tK(g#S-t\|y4i՘SPg(SLQ'9GL1 )5U{{F/Ϭ5I%=a~|{EÙ]^"af篫gOǹ )Hu'B}ԒO !q?HK,>6jOB[O6V,A~Ʉ$n?e]eĠ?tFJTlKCƅ5=Y)'j;r$}YA"m3 2|iæ~rl$V$nOFF޴0e̪ #@*_ ɦ P!Oy45p#yf^&\k"^_2ge%;'3*$&( 0)DPq DАIjG|:N]-ٙIW%F7;.+OiЊ&hɼn *|ؙt(%#A _&},K R`C$EAsrI0EXEH `]ئ੩n}bKbg&,7__PmZ*:|YgV'j,qEZ̙1 *\iFڮ(JvW5.ozީ}AYq<2Btş&i Xb˩ju 4IBjʼnH9Xu FƲ@fpQ Qz4 V:)2`V{Leᇅn EsCd턻Ŗdy o֏"Lf,?or@m-Xʼ&=c.ᐻ\{=ZI$Dž  o5knE5Vٱ[P/ޯ#n |WC6-yŊ$la$ ~esWCng"~nlK5J: 1(ˈw~ʨUnsK2D y ,dxuѭ(>}Wƌ_Z}_G2G-o a BPJNF׉Q#B/k'#;|oq? a3bƅgUt3x,-ߐ|">&kY\̹Z*S nGe"܈_Di;Mz Żu_\\7c^38*NqPUz3I||Lk&$ps2wC"'0$7z%djmr%zd<5KC{j#Q%cMjJpΓ ~'άޠ=1_NkEЏu}F.7w]Ä]CMG2G5sX~Qڦ1>c ;"IG G< ZڇtNtmH:>ks \vǾS̭"wN]*η|! ZK-.os9M0y嗿ڱK SBgXD Mjo5v'G2`? a@}67 RoF}R=ƞ>Gƹ'|u&qH̘(}JܖYc="m :my][|lcq1n?f؁Wت+n{eonc Yvz]6\lϘf{ϊ-<.}Mx|=.UcvqsNg7swHPqxp\eC{^8okc-ۃCq_run;Cxut<ܿ274ݼV?c@Ou\ηg͝5_\<`yXn.e`Ə.MYRN32BГt@N%Os-^M:!f~쑢yy_a6"MK4yWbw6IaEA!m!0޸G14AF;"ގ:b׌ǴtL$#guzKD[j"fK$=pK$hvbSdi#yo4s+qdLڷ;,!K[Bպ~;fg1D gz c3<_U Er5\eN+R97 ȅ"i>@l-s kE&1"33LRG3y y;q'f|dyH1>=kVRTݹ?ҧ^o'ycDc~^h,̍ (M a7_J6di%NUYRaD& 2.pή'(~Գg@ĕ84w+tžΫ7 T~ />ɲ!q>qt-.m_|._20ojDo/W{G잎h`HZjg*tG *1/z֌ۻϋДJqfː>eM $v2` l$Gg@Űno,`C vdZdʆ7[,PjԮFyeKwTi P${c.Ɠ8!S` *&bnbD\-SЁuI!"(Q . ߠʒ~6|Aښb*!2$RDx|qyP^*aHTfr̟)9l8nZ=(vn -hܪ@Sk퐪~2TiX6>Xܠ,P97 1v 2DH1s2ܴ,Y>sqC;0 266)5l^h"0yZmD5OL1pڵ> A`C~Qʌp}4vW8vdv@"k) lI-Ԩ}Md@](fWX R p9CAJHb0PVy>*a/X>]L $7[l:Ĺ%bJ(ר33 fG,bð[1HUeOэթ̣1 > N.((cqVQ6'mzl~1ʫ_g:l^:;>ՆREݯ*Y2Tܥ&,I/P"ۧ"p 'Vxf%,NW|Z0Gg1HN%Wmڢ8|vw[̆HI);A􎳡ubWcۊA8tU7"hI͞ogW|sƥn[tL:p=5ժ-6L zXATdBlĝ/M6cuI>t^Klѯۉ1AeT1}ا]::~a|Cj_*kԳRA1y{ht ѵWÇ:\ A Bi!?r؜:Gr)>S]E}fYh+:Z10KCOd.@.Xnˮ&}M$<19Aq ? ?7Ǐ1ncT#qR3+ָ D-.<'$%"N>r| rv,GߛB2ۘb MГ:,l|o?d ӇJLGa ?e˂1Їơ{h*,0-g`cm L)qsD?M\45K%e- %K09>:`9LFc˪qH5/wT{IMyFEc$qo r~;>{pp<΃}vv]yT>s+YWǻ/w7|AK#">x>Ic۩?֏?+,TL\.ˏ_oo6N=>u|C\>Szr4EARr3&Âxo;nSqJ+AVø>W!X?Q Շ濡}_o)>$0n_}oC]x|^YbwY׆T<~?}y_~~K]8Gv_|>˗>p{}j?I{{h4w+usSHM%[y%bW5blIj :@] D\eEJDZ }BoA/@+#[w;!Nxgۅd/n=0HA 7HI6Jaw4)<\SL `})dq%?{ӎ1"34A^Dqa+d+-a-^ XS5 |9ЦCŽq$hB^"OZjw $)NXoG $6 57; )Jzi&g۷AZ#7,ls|0Zi*eTdۼa>w [Jj*u-%23a Ϋs6[;xL) Ư~.NF`ۋ9$yB57bͻ?ۿO7Kz0*{IT4 qBO3z̟ q _|',ǿ˿_1KIU"hق [(Q'&z1=z;?_~C#Q#_2EJxc3&E72ng84_ąW|hy(V{'vJ=T].%U2W4. u^C'3`~E"]9CV2a T;zwuT"kZIRI_%]WEzKK=D]%ƒ;绰Hwj rl#_1HA,+e@Nts0.9D>!YMnVn$/I8(ǧ+:ԱnKg<U7f֮3ȖPJP83!ܹ_UQ-zev!ŜY MWpFKL&hHPCxX)QAa }zB _8Rt<9l6 +ȄEi@s3!e5̓j!K$f뎂7[T[|39zyJ沒ҧ5e \r|$J9S u3(u]zr#5k~oRD_[4 izJxG71 : 8Xd(KTL׎`xMmE WqsPx I_%uEN!z9PZU #E|l]; KG֩;V NNn37 u %aLPD^CkVg">*^maˀ[(x_#ةR5,w.Qe6C+j%P|ml{M`(goO1V(Iy.|+%<\_XjZ}t_䄓$QNZkCiĆL3=Is瑴R9Xf+6,F_$ h 8Mϩx1wK1@5-~!N|vÎpi!Z%?e{KO  /ΉnF26D5Ln=/wqۗ xl;}iwIT,[~͘Ts i8>TJK>R ,XS%m+ @ƢVׯs=GsG%i n;.>ŧ؇VkQE1=ɀ$XOA8*/^Ur4x 8ӣV׵ᵦ= 4Ш"RP+,UDJcqo  6A?9{*ͽ̙ N'8WXnX"\<ZfX`*AM@v=d}+%HHg#ɥؑm. < _脻 P `:䊊*x$HS%*HoH ѭ -S( 9jOLFOxmz[ƒB*:Kr ثcrn:~cc-;@(B"QW=VE1K]5*3/TXBmu+eCieVV~-NteKzX,rXiˣݨKI8,Wtnr[u;ϚZ%{Pl|-eA]/RK92L 8ΣE]pA%T_3vpegoD4I}\6QB?qQb(҇]VfJcͮČ=LF3:6?<\bMO=Л[ Rb0:PLJS-}$.HI);Į0+J2ԀNjgR8芺e a ʜ;BMe ӧ ng^I_*t~'X#wR-w_$Qr&)phFn+I[-^]5N@-C$rvŁt}WB4)Es2i(-NF9~[2 Aײ<";xS3 Y(nf֗ ~sjE k8+&#XrOpMYp;"{#0;BOȻ_R R |=(sP ww@ BmGb!0xb"] mnPQxGqD_7/ X< G\BNŻ)2[Oz2L}2ڋ s5c+'€d=N*s9rKη)e\r(ul\ig:tbc#邵HRHn.6#QAi"ٕ{쀄H`۠H&2/Uo*Ơ ~DvY(x4$FXcMC?RZ j I`86XJt>l~?o1he|?f͞q_WӅX^h#T$Bfu{s7wT˗bP߮$5/u 8|E԰⇖!eRx1az.ƌ+_7^bPpAThf׽B/b x_X^%=3Ý/ER}Rɷ3}i ƬO/)#D/X Y 8+~{hJ|\?kƀf4KGEi< aWa$#^bbS:{((׆Jsm2wN>\/u:D I| иZ~c=}꾛%\P',iAhjxCdz X5cNzO;w@ 6E?/dAP eћ3|o?7n6.#;<ɖM<&˻'*眪/Z17}oo?PFDt*ˏ|O8[ެolpMIC`#&#MP 뻡^bŗ汷7=7#tWK8䊷}}Z`gmco2M;UlgCsuu+i` KbʼnBw c<ч~aAՠp#xlti^@sdۚ=DE8ߚ8<飵Ou _V38L(<ӷ}k"bRB!"2*=@HzXr~#~סkJJz=4}3ha3Y:>ڞɑËm&錁]:emuG f6ۅ$ C/X+ʏw+/5+ d4CJ$|#nFܼ.? 5l w,eiXLo7> nP<u=o7=f_?-pq=>FavUDɲֻo৳~qY~qG!MvqH{꾡=9?,wYlcjvt6u u-o\ ~;2ɀ$V 8>P:MZ3ݛPE>*'QY$Pr돞ڄqzᚕwYfvb8}yZ11,暡Ozoon7I}{ֺf❖osﴵu޻UWcCn%Q>܏9fz?ys#(PEpnqwi?]vn߮V kƆ~P҇Z8aLjs?VI]a?uaNXG5Uc+}owcGuX}QnQRԇ 8~k=wt>nǍ5O0}.MɼK񹊞R|oݷIpKY(v}n2ۚ;׻ݍpg#R[luA:HF@..՘oJӉ׷~_؞00xRtA #$(:8%ٲ)e|7V^&Qa-uɵVFm >d Nܱ@;FdUm]}16Ȩ1ƵQt#L.x󣈬+ROl{|~F>_ݜZ,FLRhaK4pIog}Pg\3!:pg\;^p.:LjBwW.鷦}>;?oמpGJH>33Hk=^om>`cs&Q DC9~7 y;BӔob;+JL-=z˵pɄgmFy3ϛ}Dg!9o3| hLy8y(q];!va|FX~[1%R\$a"EĮn av :?ޮז]{_JU7g AoFu6V'0O~jA$\{o?hSVDRE >)XY/NZsWOk[ H҇[VI/:$ 7+wZ֤}w-mq*e&,D9ݼ1<[FԛXyB*HpgDOװ5a c3|^CxrGZ@;QjϞ>;L[8WT{ AfținC26a)Hߺ5e~c(qLaM5=qyob/ )gyOA rջrZ.`q0ŋObCVPBE ,}4£G1ӊ/xO[O*[jeHJ\\N> ˶d'+cuΟ)L؄3m=}lⰫ?X&D4B1n_eVK<>4>JdN{^}ڟ>:E9WgRT(:?)V91pċ|+xY$"Yjlچ˽u{~cxCΆ_NIzy*7 G?2+]%$mQ+G7RΪu9d—{-q(:éNzj[l60ݨln3zSd Gi1 }{ҿm|*ȅHg4sJ;Wib&/4WtKZ$.4D-(jGO6yyh5̬ި[IO _<q-1&xC>0&QCHy84Zrр mLOen %(:CB  4/o:m^hNZzM)u =򚏞fyb̘0cMguJzf=/II`‚UUNˌLeԘD}Jhi26jP`˄rTCy8&Z^8|3ly/9PMK:~ϚiQ[<ɬp[t+ZG=ov]BDBJx(nЃpzKI? nTiV~p<+1~ߒCnh5AM?1&JƪuX0,4Ϥkf\mǼ7ZSeL]3-&Fޣs{|+Z+fBHb\b3^$AR2k9uT7+6΋q c\C̘DM_c~n>v]gM=6w)'4m73尖qb?OD"?O<O$Z:agg :Ls7ҹu_Y"uvH/yyfo0[-NeQAV{w@CѽښYsnBلKjL|>0} |cYa=TڋU'5fh Sv̓K};&-خnx9ڬYf7{e#Ѭ5AO8QS˵҇8 DEBhK8.^&cXVY 1\O|Ǯ>>xXDi<Ґ޵^WsXf: c:h,QR̡PyźX99YT1ϢrX'`x2n8Ao܃`orLۙk)aFib~|į0Ӡ>gs_S}sM{}7NOK = G/ҹp,.܏^l'@Ȋt7^spv.; ,%KI2'3bE%,w{cU͒OXS={N|-N8}jYi?}.zVM6uaE{rcOs#ׯ]",=)ؒ4 5rE즤t'`CwMmlٸXg$L(W-{GIaǦ ^*hVQ:ixG}}wgRi} .QJ Oqex4H 4@7V=MQ%ts=d'$=v`zbXl l{k'̣/اkZl=!˗ Yk 䝁+ |.Q\fqZʜ'ɸ^2Pi6hI%,dY&fY ?8?C4Kj$ы aߧK囜Kyv䛪W^D_YקKvvs |n7z;g)p~f4vKk:iieG|-uB1Oz{y{ Y/a4g>z-ۯ>~vϚ$z*Y3O5 f>WiTuLktSFS\:2{`{3 W=SeE\3@cp l-ZZ:$e"Oh{|xL&p}H5W%=+ؖ>4Ox1yPޠ_:2Gq>׉s FrW?dzAG^lٹA}9y,,{\ `MJ5*+ GCEcM+1)Έm{ω&Gp:v^ǗKmЦLЦ[&]欓e 1+ޘJcd"({XWJ^5!,S*ȗ[wGro@K>;/~뿓~gqߞ^@1d_NbĞpQCy|l)ۮ,EШznvK%s!/Ży6Ҽݖ&j:x"]<e ^n7ЋЋlY$B<$j\.dhjndl2Kn/YB8g})md#|Ǜ3+Xr(=~r0-z?J~eX"~$+^8UXnYʮӴ4J<>X XnIn _tkUh4Y&KԼ~=^lԅ\ 6G5S?lVu"uImx&l]%:YM5OϼqDxPj rfVFK5Y-v-{'sْ}0[T$dlYu4`]v1rFKYʆJhr'l1`Xl1`05]Covi8Z\bو}}.Vw_0ڟk~A–ՎNL,Ű;ش kFzE?/ș9`aJ7?|&1xxjW: >##f6=XԼmAAhӮj-\N{f?†t2VP? |˽߲돫*]%Tޭ`<@-@4z|"񇩹Q{>bg*9? A>o }n(>* yjBgktn{0vRYB|C驼{ϊ 6~z\m=Wxk}̟}n_(YjX{\sfI6CZ?̅4vlG/ŶsZ42-[42Cpi3,w{8Fy|jt?f.[yv}Yݭۖ )L?v3a殱vyk&i9fK.^Ж4TQ~lce+Ӭ QǢ17sg lD(A4?b*~})zI5g5ݵn5׶&aUgm6ctN^~1d+btWͦ^չ:< N{oښj7ghQ&[[K rsMMsvx$7݆~[f5Zc63|=n4u; QC{ʜwگ 'ԼO y).MF 5vݬlfe @++譅6ϸaV"~]zfEڼ?8y=3]:[~jκeY g)]JB/Mjڬ}բwpY>ib!dɲc,mԧ@dNJe5*;'uXP…Z:ndKsYR\G~&G}~n6}]9ےt zCcTA5q5^`jk LkPuB܋A;}m|3`$@޽Tnݨ3~$ b c=¼Zv͞{h?{k{'{A3ܙ03fs &>6|t-f6Om.k~+kނ]mKpXcFsqH'p ydw՛~נsjunUήٕdY2VcͲ\3S;ԦW=:Übgp'xy>yy.k:ܖ vVRHgX{YbmFtjEuԧ}o=q$N3[oȳ 4JV:oǷ+uWjǿE_P`|fF͌\uլӞjCl5v`yZwڶx=K)=sע?nziG'7 Rh& 0G FdmVD[ $~pj /u'޲fkYTtt?4{zt>/pA>|9qz<#oq:/xNJd&5 V:+ydGv)_ޭ -pbJB}ؾg?nEN:.=Y֬f"{Bn-)f!~e+oqDݴ sfbjxњ=FhKCݰ>\4,@Gϖl†KpغV-]FQ"f׽Dk`>r6{'W;㮿ϵZ5{ޞZĜ&,n.,m9XQuN2)yʚx+O\xɫ}cBgpAJ.a@7I]k4I5hϲ5^~k5iu)k1@h^d$~ =_$_Ɩ5/]rK9{KξN^:'Vַ?L 5B5S=T;n=wDZVh_x7ofFk59쬆=[&m(6k޵ =t$8$ؿ=9X֘6.[mljwrޔ4i%fR>h=g~cKF=B}|L|{׳,ٻ ͒}yؗ7{ԌtseXR\]mߴ\׌Py-unRI/MdFVz8ul|,J4C-,~dC$d-ȎەXIgn9YjC<B=üa=->Io{7e7JqCϾ>"[SNk-rYu=σnn޸R7<ҘtRܳi#_lqI-p,8/'̣dyŞCӠǿ"nUΒk9Pa|c{1֮4//6w&CS@/QC~7qf܇XVO>mt@g<:ktI_Xޗ#_y';u-)vf `/+L,[ƿAg}yxn5\ӚqNɟf$,%s큵CXn_KlqiSpe = gMg|9P]Is/;Sؘ ;ØAYzi&|ir#쬇*Ny XOs4xj&KҧޚyO4+Y-0ʷkc~YaO|Ags53 0YUYЫiŏaYP 66 W(㶆'Ҹ뙯MFwUI&۝&胞Fƫd7h-wG]9c ccRxozn<g l-gkV 㻀?/3reA\fqZ\mQL7ϔcr?\/=mcz&6a+2uk;Opжマv-2BGXޥN휽tYoY1l=+ƕ L|py- oݹzXrkIn/g<[Ӗ2źf8V|=N])Ak?7ROuO.׶-ۛm0en'|q0txR-gm>[`;OcsB.wΤ&Tz}(R8rL-3 )X׼6@"@_c+hhg,`Oz Ћ;zy_Oo{ Ȓ}il^spP/dqTq#}`N{dF%>8gxK.X0umQWo_- { YEI@_TUg^W4Cڽߍ .;Men{G[?Oft*bws{P>H)R<$WQdgr=>:ɍ-Loby&=Z9z]sOQ3N=t\LTvH/סY-}W>m2L3e hZE,~#~],oguMW3 r>۩}|ve]eU6[ʷ;eQ d5&.9\6 }#*;n(k!;}ajas`k6rol@ 'uӄCkw8PF%l8Irfvӊ-?Tyqc8j~lyqj.l bc:`0|?]Sf 3<^B;f8>Ȫ+4f#K~ܛ鯱VŞ擦m$;j}F]d2, e;p@`3ǩO{3l?xc'ϽqͶYN>æ?mӬ̖̿2o?Kk.5Š.an9Ի"u:3W1>vg~&ylC>YW41mK[I>~jMwoa=N/!/_K{_̧m yMC4 F ܷD8(YZ{->辧a|i/6~&5/h W+ҊD鍐R߈qȉBGs.7-Ȑ ~|/kz/ܮ:9A̘aVk]:_[Eq a# z?t5v]o??6~/O633wvԴo5~o} a7~~]6;lw| QW/[ xޥ8 򤽊`۵?mO]oVɔ'Ar-Z.#OϳM1h6$?wשy? ,-neHXH3߹݃ O J;KTIw7~7w'S?xHz T@ݠqѳVYh, t3fOwgWOQ~g!;q`c=3N_CK@GT~{~XLU;ai;z֓=Eo=y).>4p}^2ȉojۃq'&ߥݓly'5=ҷ&#?L'S?hz=9~{#Ԗ Go F"ʖvJvŤA ԝX= n?yIi0` <'Yz{#yG{M>6w]Gy.s5:|~矗d- u]ƪrϗ-7ѣrf=ݽ"msCނLP*֧ J7ٓHḿɕm0Ť'4Rl򩟼觔ఢDeXQ2Nt稶0[JĂpiD%e?W DSHvqE(lN⎎v׻ ҟeߝVyƤ0ՠ.QQ !$ YGg'R "#&$#:h|4Q0<&cg7뒆 E>+Ȥ̰ȅ7k/FP!'a{uYy\ንވRl$I~V g0 :gu= x A1W2"0tAX툱ߢe/:g/vsq/C ~N%ctV\ c~w> sȅRf1ĠJ !Ġ8{f^bpI9ZX\8z+p/)` y8pNvԳGb/aWR.~GN I˾P)3r@ nZ~A(Qۊ +iY7% N( 2a]&Q6m_b,┻j6!FJ]ઙT:`ϊf:2[Eki@U.P*7 L  yDA ;DAH, x{è <Ě.1s<2P/<ݜ*Oٷf.h*$ŃdfR?J8AU o'jV^JNՆڵ.A8PH K׻A[̈́aT iC@aBU E!XB'(#>l3 8}"ڋA^nH^ab%8C a y;Qqx&sރ螅_-&5Gfѳ0֦|XW˄۳ΐsO\Ht^lBuq- ~e.ew,bro I"]Ʈ'fÿ) M3b7UJ쇲qITQ+ yD'*" W3ܗ"FoU΍o> E%JUsk|\" bex=֡UARi'@Zxͅ )$Gƙ_8GWqa K"bM5L:3NT Cy8r?oX.8i{{oPQp:eRan爗E,L<6(h: Nw^V< Ks&4@B9hϙkM)! 7]B3jVvuT_ I @d?B;Y)N uqkJQXSrٱM.5ѱqM~,OrR$Y&ٸd3ȰK&af4\0Ԛj j,e)'io]2B>C-jmJ š͓C7Νlf[$aIACaJR daF%ۿEtBP\dZ)H$.A:1 8O@ x>;}9?ts z8B|{0kRV9<5G6pCM+T{2uׯPrhj$On!J09_;mEk^kO݊{0mU;҉#kObOƞZ"gW?O L )%Aa ɧj;!/-4Jvj=Dn>W}>%{}$$r^IAo.Odוd+>W]ǽ}<%;n=[d{c\XI~t]=-e%S{5ffi|vܷd7tt^dI8?;wRs:w.y/ňؓŽAP(`> ׹*FH_?'ͅCd0"6Iuo'-~ko?+IP%3!82jDYk{^%!\@}k,[j@NjuE;y&Nn{?.ݰ/Il~ye7)DڽMoFIC\kj(h+i&gNh39k64ԼeuBnGi?MaFn䰵ړ=o"w<٩d'2FAt]bB<<}톐myPq' ¸&-v+ǝ^I\!>_DPC@ !h#6oh*w7'h!ЦD,@;DUWT'W"NlonyM "y:_~3rno@p; fbI Q@$C1`WçA3ڰxD%2S#ny {΅/tϟrǃ Kr+cO={a)-O8!5#׿Lg G@ Lc dq "p|N"nAdULG@'~%r6R/DE.(6eam?X::5u8 ɱÄђA0ȧxY?+2ԁAA*\6-j}=@CJc ^Rx @ *iPpX>ӍB{aM{ Tb; T5Y\yKC`*z N\:uj#'bLAGs qYq sH)2K#.&,"ヌĤ?b Je +/<#@ID4\ H`.(HIiU8(l p4+-вꖔȃ?C ƚ$z"88ϧS'7sFp"|;RAwp9ÀCqfw[T8AN3>?›!6.묥O:dpJBq  M v>~l:"PPx픲bNi܄dTc _~˃ ᡴUOșdN1@ (pdc/M t1'_M6,O7i~n-RǛ2/-&(WZy\!H l15qsK2`&vlB.'-aS0~Z|hE%jF5! ]= 5Ε37eUd lX+AB@E*&~I2"1PCѭ3Mx)7* z$P]YDkwN]ӟrR{Pz&^4kJLGA@vZ"UnNvJ.N1[c҃e~)fӑWx%mG2&Ai iE)HAx'|-#q Ӝ}(vgЕP{{Bmn4ʩYG/pysju]䡢=W0ݍLN⯸[Q"a6w9{ʳ=tmZ-w? %Pf^>lwC@ t'3wPPwJ;2E"Edp:~DV &%MBޚ7^[.gbAw`~Q ZuQ*: * MW r2HwahIhnubq^cW2̩"ʻ4sI\I|(q:~32 "$N-8 EV5`]u=tM |Pf}xn`$^vʱ$I@(1ZڳDav({kn%"͊uxB5DϞ7&HpFTH P&ΈEH5ْAwZc(@uwj{ d ̇T~uT7m`CllXB.>h 8SZU{EԪmCI?;TLnSegp'swrU4 CEGZ?DZ Ms,ijGK 1JPl )J"nbqw}upV #~<_oVf8^,lDwf<@扢e*pn[+/݉4i ?l!T| 'c7p_օ+#IWFd嬢 H̆s Lg$}:\) l%ѯ68`:,5AIi1 lYf1q䫅N`Ųpͬx 8a[ų)Dq39nGLBpNpzZx"GL)3lOƄ]1CO|4zGWͫk2$`NdʋӻrnӎR!@CȕoK=9`9$j~LH&H3w{`{CWpK ӛ3k/y'3ʩx: 6`]:85.A<ޑSe0 ofa6P{%^Jh^ R.U+XV8&9W|\fh4o!U% GyV7Zna-awe:cjrgR1?ǙS=c ^=Z P Af>u:@ .k{Uҡ M@4 R¨żjj:a0BN 6\B$t?o8=H@v7vKy ?ݖN5x8Tۀ0(JdNe!+O] ߨ)ŗ]Z2>.頦qVPbxc*#mt8Ԫ:nbko1X moZm,eT):,/ JQ85Z'gA+ T&%WrGOyTò'ÓZMwV2(\p-B+=Xe PG s?t=CaJ۠>pG]ivxn`-֊Z,*5Q7&®+n䨧=ziJu"<:tIyIW{b1 @!&t\//cܣsvWY!F^e=-bt4~Rr~bW8?;}Q `5Nݹ<*Tlۆu[V '(Bu7 ,b\j 0cj5pp`3s7^+̏,ͯPZZT :yXJcBpeSjMUt-D7 7\1чȵ>ۃh@Ss K#YˍJ| W=q Tz~}nH kr.0q4'oфa8`5;e=HI܉(@D kyuB /T1Z 8p&]?Q5}BKtUdR ;dT1r39uATJx.wq*7I$Yݥ;uj Jw^$h`ž/ il:2,TZ^OPgW (~k!FjX[?b'!WEb%LI] p}82r3&NŊ>,PLXe0VHv̉.< 2Xd,!)s] ")iV=h;* _(!Dٽ $\Be ﴅy\Bh@2Λe<,~Р Y:>iXM;'Xm+^""PeML27lTѱ n4p[J(< %EJPf0Ӈ2-hЭ]]u08ٙEf9 )`I3NнD%+kEG=vb&ho;w( ;6Ϊ Y]TIAn6uQ6ƃ\V۶Z[]V^PT+ت1C=;Iy}TDI:#<ͪbRR.+Zd9(hh ph[K)9 B|(;w a@#dGl^]@uMJ f/v6ఉJ}`S`e~8D n(V [[ix+|Qa]&V!΂T,]Iyǃ`. L6>] *v>K 3bl6O46DKB (49!rQkױˤdy>պlN,ⱥA!2W  l:pa>:,᱐ue.$\!eDxY?߭ 6PҝH]*X`|wu-zૉdY5_'(`LX (Osɠw"UF^)-.CϪRBvUųM8hE齁2* E&,~Q[us`C(CV2Q`>ڑTʖa<$1USfG4Ł%6 E8AGV+0T"#Wd"ާއ‹qsAɈьd \ѯdJ9> K %`DNr]7oފbi7Zz$F͑N gϐ`4{QنD~asxiЗ=ɇbKU\ {iVeHK6J[}LQ2:X̠ydKxmL/0&Gm<*[0]BAvGE (uQ4ߟc#,Ϙ5kƱ4i905P@J0R59ؕb&.wc1Ur(j^>Kpū$aʞ!IXclCPt=N "Biݪ.$Olczszouj %ߍTRóu8-R-SB> ւFTD5 ~W4t?̱ݛӆO7Zl:0B}0ѡ0vb0ΈHȗ$[aP&?y-08e9GizSx%;OyC^̱ E VoP YqE,ٙEyYۉ0[l&T=u+y (27}n]fk‡|VF gVh ۹ :I ^! 4 &sZĝ [{:N),{JoS+ Ҡ+7k+P?;4X펁7Hk&*XͪZUVMExeWfٵR65HVJuJЁE_}TwxiM-GlGfbӚ"~;73/25Mp p%F;spt֡4veVW[0AGFcaD]~l!pStL*-R]r?~~0AK]Qek5nVH!: vc]ghpzR\;튅C e0QMSN 3:YM_)NTg ֋9!R{X(2AJ=5T`tP ʸezĮ\W-֪Xx[7v0'+v]O46z-V&]"o̚i?!!Xmfxe8Xao'y&d /f3?nVc ,wWC:x wf b$1w}5dU&7=Y˻J() [ muoiRhK|݊Kчjv9OT$odks Y82\0tG(O~IcMΪ.1N>`A/ޘ'2NJpI辕 03{<ф9Q%ٿLFMy]_W4G@:;Ix;kmdA*w5 LC~ ۜ\IB8 eNAPYbY7Ao2ڬSI^M][MrژvAx$:ljX.ì22Jڄ[JRTTxx~P^T>?YI&W-"!)Nd Q,1 l^R۸Z:l U4ć yRm.aSYȵ ;d*T4m4N0;G0B5,v e~>wNQTL #gӱꌋ=~<a*C8C @dAB!:2*kZ$|i)_-V7p5!a?ܚ6a|㽽ν:vs+hesb嗓~چ@֔aOlMMcL>T~ E[\]]O}zDY79.pskj2AQl]v=z/gxs6Lh`Ϳ a:MB YCRUY&Y Ӫ2M kҦNJRJZ X{~o*F-Nu`y1(VVH)GPnR]`aJ];Ihuweb-86a0_ VJ NPfǴ☰0EXL"^y6,OdXmH#xA5"HuN蜒|If'bJ0Bd}ǯSY 1rF8xlHD($rKOhݎ|>eR5L?"숣ڕe \Ö >Zwc{we+#MDxvm^OG{ݘǾA!ݭU:rh0ȎH'I9Dy\=g*Z.p;@T{B"v;5AԫȼwD$mFGb4p/(1OՃCC3w`3~0~_QnQj8 5 `&TnWgkoA!.,`aXׇ݈Ȼܦ7e*bF s,GI̶{ ug"z$Gi~+ѯk aQqV凈/( XPF4 24Ja2>nZmD{+ɔvvJ=FOޤڊ@*=]F@8c27Dv E8tR+~F@M?nvȉL"* JTz:}E{x( /$nE׀ҝytul۱_QH=2N1(02Z t9zt9(y򶃪CN5zrO", p>7ez !D`ȰnեKd(q?hE*J@7T!QJQ*Gk3:A{R>{A7%/6 1kiut}Z)BÖak7Oq"4y dSy(^ݚfpf & g면x~ggͧnAU`|A 4ӣ- Τ!AjlyR_3H*tO']i)fD-:(vp| 2e%>ٯ& Ȩ XJsQ(S5-{mߥ9@/8DҍV C}7 9<$m`JlOլIEAZ ךr;buh IMETa?@~|@b{MM-Sl4hY:Z`|(@, ~H_]v4M{&;f65U:O$o\߬]kؘl;|EFV_4R ֈϒPFjA+~iɡVm#D|2Fj+-)I5 %uu R&*M<%CT ~(oe`*3=Я1w(M6`ܙæ㝱bU#Fk&}ڈg 2s1r*^q찞/ܒhJ'2Y HmȬn-BH2phy86o Tw|O.}y*3쪆A3RV2Q$Z#]7A l kesMdM#Ɩ; Ռ-kH|D' ^H-ɽJnjpj9씸->IR*}m<;a=!t|fkSe|xm  1ck08u 0 %]1!lغxlئu.6`󽲥FnllP ͚-Ga^8n]V/s  6 |UQ=E =<4ӓ] QA j0֚1 ~,x($o 0﬌ ^e5lQ;?3!rV]UyǾ6OS|vé܇` &[TxE[vjǖV2t묟D.[ /[,yY|Pb_[kR,]Ř.8U^NC 3ɛسz%c\R&;l=hZlR28Ј=w̺eCXFuԪ̌/*2wHCod ".*@]n9¸Ú:n)?~/p}Gg8"TokZgcV BjXRr5x3ь/fdJ1w /0A b,BkX)n_?UQo̓<;Tvi $|Ѱ2VS ΦAg>yѫapŘ ipc-e ǽsxŪYZ,(PZm Vk;xJ5]+y}Jݓg=la٪VRbLdH&?}{BGAN{JiZ#Jg0.{Z*& w`o.4du1M,v{^loң=?yB K:7]\fgA$!0'%j5lV=*O;$F7k3Y! P܃b';S璯 LdbC(oױxz[>ڿ.ZLwhhzeY474=;}pʞܦ'2 k\E_TzOA4 5<apYӏGz'Q辁C#Oc9jlKeVc*zr߭j6J寇Drɕ^gO9j<M z*޽^a/eA{>%ц^J%{g??S{rxWmJR`s/ϧ i,OZsɊ6OSƓa,l Zϝ]1tƪ6u09zͥs[ϦQ +:G 0B\{ RJ,%] N4xn ȹu|gc?Hoit( `wݓCK[]Z8 z&ߓ.o! N3IR3Zŵ]?+{Ds؉ Clt-q.yȽ=.`.!{/(~ tn|Xj1#u04|w+/o&.?ٍ?74ٺu8ڔn'*Yw+{{R4^6M)Z6ٿ3'7{g7y/4RVͯ'}]Mkʋ{sza=9w5D#| _ K(ΞE5` w^mVk˃,0&L,wX<}.&}P0eduZsM` 9Wnѳ6+anq?yCg v[Lh}$tLGFO ЮcMЇv#z'൑rx eN}O?mz@MKb% }޻ZGg3\R8 nFDnwX݆ZF;-"VO!jSN~0n4NEmNx;UX]b< aЌbD&ڨu-cBչM +m0jh?=d>O;?ذ{ &R߻_8da}9C8;] Nq"5>,y2CcS-ixpދ~1.[Zkr~*@<59xAZ5RB fJw`;16_[$* &ÉjDtK/9ҕͻT 9^LKH)mm`AvVhj(okTWoVbǀ94;ٴᘹtMN"eN >)!£N$\-Ҙ{Dڐ5>`_ x-}[ol DSL* ­!TVcut%\MPp! *J^JO6\Ur [t cX<:MX0H`LZbkT2{5W 9A섛$(QuێeK>@y@f/LRAl1!P¨9?c/-GK|1F(4y*Xl*mv.>J;zUӌM bBurGѬrXXHX0:6lm+6:?i`K6^Xg`p\mJ$XbSv bP"9W>rzdsӏ 2R|E508,%dىw|pi_׹cبl\|?F~fG1G!Y< _,)n?4Sğ؞p ԠQiH'ѡ^V+xii[~ɉvb30?wXx? 1.'? k뺳CT&W񧝫q_F558o|6f!jVFB18gW= #?jV묓n,KА,Y|*@tiѴ#̺q>We@ӝ|tt/wߟ9=>3ҿ133eu4?{1ע O1tTbJ{'I BT'mdϝQe`7!MW1-VuU'_Eja2w#9푯ygSBS#$E~@JVEDoW9LMɖ3uiV?|0? kIW bpDk*og O~Sl1NLWI3&Or3ssw~>yj.(#7+@W>mW:`2 &H]$?`v{'P\W{{]vcfPfs緖^ϟ}-+ |/8sަ?ɼ#M;U-~{po\!no֊oQ]{Y|A!,t,=ؓ7#"?6'Yٻ:SS?=YY۟T}d+ܺꧽh5}Qabx ZNAMUxk~>C募x"/㚊8l}ZydYdsƥ~fi&ES7J:o43ɑF 5󣟿OhDbA֏TNQPڍР6ӻ˺G2\B*MBWʝxྮǑtc͡dը|W.q5Jb]}/ rGv LPDPxxy"jٙ[ q/o>}hu>TZ\d=Q)^2oD yŢ6Ț,5Ο(ڊQa#Dvx owA! M項sgr9I_+R܍dr$hnfw{rRm~wˋƟ^CRЌKOtn`pysਸj\!ŵ>hLU6w(ZbĻ-&8jcEWh(Ds`뼼.f2Gt_LIJ3#IԘh)f-3v@s(+3~%{c3 8XXlPh/uzGsOQv113\YY$XCt'y݋;CZtd hޭڛouľlIޮǙj{"BҞ}ҙAuڗKHk0>j -I]V>p}6^ө3 yǓOd9͌6' lw]tܙ ݫOf?]_Y١{v4+|xi[a_Cp+;\<q=59kʧEzi]ٵ/`]vF CPH.z cjXc/By~# B]u~vhOCBm{~A; Z.{ݿ~OTk9?xET](m3/K[Z;Vt`{9'ASc]\Jv N͟3YJtZW"^:N OՔs<9li[? eF. B?ƁyvnGZ1ׯ<Ȕva*WxJmyZV*/.ٽH ZyR'x{v ]-Owf[}2һ1{Z9/}iUꊍ39E{Nc|HC~y^Tg?8&S|C5b _g>_M|Qpp]Bͽ\_OW[|Xv(D<\W#2gGS)Iֳv}_Xƺx-)~~>LmI-˂6_FIӕ2@'GC^+m=<^FmS'3s9Z{pD4pÇ)d ؙJo:ӴȀ{V_ <Ɍ"J h_*܁iXIşu{Ӊ)jXHF;jBzpmӯhr.˛5F6G3|nȻ2pfïYb-u ?}V`ap`Km<4R w~PBvȾ ُ*NQ>{8cyU8?t*t2ɆLA7Y=:skvѽӁqVrR#..G@ i_lM[ U͊㣦37aD.BC5) l5Bic?pJ*8>%aIDN8j‚xw+ 3`>`SsWkZX=Ealf@mLOSHV}lҶzq4@i16hn(ņt*eV+ f}/WiX zSu?_^ijA65vĠë5V$aX3LLjyۆ^q-F#0R&kqiO<;ht"vHŋ\6NơIa\ ժtZi>p>׽ eeˈ8:((ٝh|#xkқv q91t#܎kt1_.G3ȼ踜Y^هs.1J41O*P& ai7_piiJLA fo/`g zrj0>o͕q A:DzAd2"OYlTxW7M:Y(; " UAU^q`ΜU`cca`z' 2&)-oө]_'XHг%-F A}\iƇ 9 <܍);"| ֌V|ܩFzlwԯ+,Yh XVHіO!RCoWŮ ϯ[s!RwfKz ,˨ pOtjalWO,^I;cHRLVy@Xrep"6nN_|Ŀ-&&K Ҷߨ?t.l`G-^qw{*?aghٓG)c+80R@lVKXS{Q3|hv܀fi&ǵg V p !b{ݩkmb9~3mFnj+򛮾ޕ]\e0NY ^"{ttJӳ:Ɵo[ :*=& ^c⧘Hx ⤻ֹdŕ׹¨a g9Ru_dGix8Q)۟8,l.@x@nUޮ&~a|hnX6(@p];LwCǂ+,(\/ 3N_f8 2̤ 2]c"gEKbTqbU@;: syrY7_jh 0_P=X6)0-;G0V3WH``XrSz5 BUoW_0mjX ),L1^V.Kl/߮˫`”%{BY"aᨃ84I DV|;Z%nҟV3)#˅̂,YlWc/2+wÙ=_nG2sHV/4%u\dU]˝Hԝf LҺpd;zL4MH۽*%RaZvGI?s"̀Y"8UvU+fpI3i$暮-aYpᾃn-twJ\vd KnLet!ʺcAX{`_2id;HNVll NyC 醶̘NX3X>̾i) \Nng 2 ^ i iq%HAś$U`PRE!b|g>ȍhfn4:F=brgū*q96X5K$ͭ$ ޭWOH'AkD' aF=۔_Y= 8 F:y4ORt/;,]xYnpf"3 5xә 4!,y)-~Y_e?; o.)ֈbˁLNIqaj_ٞO$ߖTlu iAw TA`L,귧\&j$Koj'>3ugpn;薚#`E .Xd,WifŸVJy"LU28t\[8{nyV64UcOnf&|+Xtm-e!϶Kvl6ez@w݇5"{ G3ِ@od5hqOiG?r'yks e> * ~r),\hhyItzg3ƀ;nIwIסb"Ìp|v  ..lxdyqҏHy[Uv aTpgX{l-ټH$$D2{ũ}PPɥXW6,N$ƱF]xy{hS}GVDZouljZ "$[aV[u\~B煖I7Ax8;kD-\җ^@9 b߇+<[P"ɗ$9/CjI/C !PEVzP٪Uc_[xQ*}Rsqt:/dNq/Y#nNPPGck8u`Bw`|6AvRMwAK `c3˵h27m–5dN7NVXQwvjQ׊p64~mfDz#x~*VX h.0rd7 k#<COES"ņȼ BQ.}$'wOz+5y?p}[qG 37SSc$m&J@"y*F8]pS~hMJ\-JF^l18}9-IF,3T>b ݭ{~kKƞIыwC!qǔՌ,|QaI׸hG5Xvn޷Ӫ -3̈́玼|܏qO؎kn0Xӻ# ||/֫S <~~)gW#~d|0lI,~~JBNQsPV` A([b {3N4ԆK_hxM/ *4l/H|iRn[躷+(d{0PHaUK@{\@B4&)st}_&bt-4z+O#9 @B<= ȏ9cC8ގ5 ^IOA24]"Ұ5+g0":1\%PlFRwS7 ٩P+~LQ>456M /NjXen^c4!?>i  7Vd&P /"c#&$@Z& !vwcL <=iQp#U?Pa@ "8e&e@~f[oFZw*#Hjy ɤg2 Nf1Ɛ cԶ@b6-̄3Ƹx1ð221,}9 # 0l6;fccc^J: vV tDmhӗA<k4 K ;^°vEǃXzPMP=CpcUE !P:q=zQg&Y 9mPuntqy~2G{4&?3`Ҍ4 wJX`3C2X؈.OYoN9XN*nIQ0ZQkm\h>+ [Agh)"#y |m0,0T(G@w-pGH) _O%\`5608=v:o 2H#{BDӅFeψ(:=hH嘯tȾR+Y )+H'|)dX.n06@zgZ.?ޱ'k3ƶ\!ТF@U 7ңy|&\Jь%u'Si_jOs_3a*1&1ESVF47vs34C߸4$sX.2afFdU0hǠxeX1 DTLQU*$yP[h:zgZkψg(BHMĈV+O2SlZ9 f9ڈj`y[J. =KB $aWOr1>1v%6{apˍv~^Bx\ޣ(宎NOۯҸ(Y::-~|a(^ߑr}p_ZHѡl‘Byv@LӠf\Χ֣k65~Kb ͗,hM &೭߃ƍ}@G-%+}c]; SC=|ҝ:XX"tbZ)ƴejW?'c'Ϲ;z){lɗ/H\n7eDXvMQ<_Pt"ɐ,1 @VI FY@h_`6n&vz<^ޤ`zf u0(Ejw[%< $u%驕onSFJ>S{O^L+OS'"0_9%G֋v,\[3P Շ3J-"eƳ79(j^G<^#ٶz1ߤlLϔ3V&p5\~O<8Ð0[m038'q&yKfЖB:~U.fq8F=? 3Gwnv^1BW'xC': (#T S".Gca}XyҚOFYG8 osl$s*ƻ20*2U:wvDÓ/%-M! x("^cu"~wjlC\0LʾʌHZy|_OZht0eC(D$+Bsk'̙iDkex?r5={Mw,/,=;Hs^CX7wRW}{>A(T蕜^ܝXR$ |F(HOga|87fזbZ6AAYL?LZRyaiu'04?D”A L50$Դ#GFX[!{M9|O'KObr6R)RU&LAΊX:{+s7 XUf+OQJOrG30 GR==[QZ oRٖ{vV4v`u¨p_٭;>OQc2.(xϵkL%W5N^&鄅|r6<`m\KzVK=r4fϘ}dxVC1t8"f'H6N0^w8Uәt-He;tڱ0ci1xB(mYw1վ,_@L{7- %c]x\#ѧU0/YU6IJ4jcYFeHj˥.&6Z (^ң::E@lq> ݞ++ьOE~6oa[hB&s_,zC^5j!u+Ț05[O#{|OܨСWlt+jƧa,?Ɔy[|zkq/L!?|o_m?ɿqߥ_w~ww_J}K/ѿ7/@`f*uT!~{ow Oo;#ے^ 5=?ag>lږ |'FC{!O-y-Bwy<sxm\qBXp: sΙ/Ktn|pY,<vk|(x`*J:,]fP߁.MBy N]ޭ/PE]EX]Ζa3\f x{y{3*Zvaνk_І.|\\aI# sʅ5=MԵJ^lc xtHWoyC>!ŭq0( Ǟܥ{qܧ0 Y UՄieo\lONx?\RCa N\%o_[Ȉqk fϯN@Pke )ta#^WlqqŎ,ʧfrt`JTX}҃Iꦷ ?;Ÿ'+.r!E]GؽF'2iEC>P'Y2X+qM=i}SF ! ʇw[T=8?cgCm@x q_m9}YyTnBh853[|*N>Y0AO2#b6?yG(8PWR0.|gmӢ@N[n|Tw-s 6-9ֈyC\3AYyˊw-4Eva˪x$"emmBѪR0vb9=^Z9jA턛@1RPg[MӅ_j'( >iAZ_LP==ѲEcf7ԣ{VW5F RXnwuX KAurc`sA@_إ›L%xy&Atn`lTvv?-2pv=+ZS#[[0<=9 =\fl)9,,L9ֆ_ѻn! B:εXR2``;R |F:qЌЅU*"ue,S?]9wqMySF功A+M)\nm7ɷi*|6F-Q !Nѷm9o,YsKkRxm|Ac6dr (-{L'vW0pi)  %l؏!ɶ,!`:03arbj!"|Fc!zy;= r,Bݔn׋yoa k\>`6oVrp&'mO0'-8ʖ4s|np&-3"MMFlNd%MsEZt{h]^ 7٤$>L/QTfマmǙrgđ}GX{%cM9Syь(Tw]Ԛ)3N‡p B+'EPwMK憫V]Q>ɍЂ~?:VV`%wrV ï5tAZ(e=ܱv,7٣&Ί=oᶖ"p Qfb-.PX*j@L|:B)wak,j߆ %hQJzW#7y&^|ȹWExWTA/ YU>~)sYש\HrnW>|c0-o]ddlx%ƹԕV.'2*NpndU%Bo=0Oy̳I3q3/TX&`i WW :/U'ollRZ7 T)8]rh95ώHNwo!Ȱ.mabR!`N`VwMDH.+f{G|x)U]{w!mA=~Dt\o|,/^v>_x=?/B~_=gD|y 4,>DMz$!C օVq}uZXH9n5KogEƵ%{З{jU|1"No55NC V&* (VvFGs:'z H,&ueܝ܍BKco3si=WUtY8F|VN-5`IqT܃SqSp!B*qKݘC]ZrnR֌mwۺPnuX-P&ٽ&akRXݥrW4e[~/(mfL\,>!<鏹ba"oZ9Odɒe|e,Byc^sn8ώnt,v^} l-^3}0n*Juco\н޵z, (ns,)^;?ȱ]XysA8LiGT d$3tNVg,Z:&NT7&C4bWxأG%wyTnL9S(GJgP(=ŗH?RAnT".9|4{l Zޮ =5NE>cT||r!>]Ը ų4^ZpNрe`śo?ĵg/5ezH @!5L@X1=[ݹ#x$jY}3./zi2gzxW֭ Q<1jT #LRKqe{4k \P8 ]e;Ṫ%Ќxt7ˏx}iiϛ=2qnX~Fc":X1TW屌'~V7žǡnYcF1^@1^Њ[jW @& a:zk`9WޛJnr?_?o?AOX)ö??Oo۷?-x4r TNWᙛj2xV7{+uw\plKq5 /$熉K8ՙ7vڇ_o]ͮ>q|礇mHcIc/-̥<) ! s б<^Lc m!m9YaaEb<)_0m~|k_d>> ӍB_%arƘwŕILXltJn[҄%q_t_ٶ-r0: sudB!~{wI#)6~FMв5-< A qCeAeO).Qɤ|UmuJp%dReL(G"pr^>{G[N iK s~hW /2#x5LޥB mQ[S%8u2}iZ/,(7"6v4Z׭@#3%"GE&H9..{X$g%g,K=VKk Emި,J%ʟB'ۢg`9A7`DrK2<" d +ۧ)Cvdahacڠ;gXs|B_y !\ŧ{vuR#v>2yt5a%ߘ=#aOfXʷ"@ (kʭ.۬Pˍ0c[(ú[h>1%&;rfE+S$݃>^$ț,TQb !t hEVNj!ǘQ^S|Rkz{䄶obdÍ=h|oѮ7BbOVYԤ;HT- wh>u&"7b/A27e fbz/Ip>RÛ,GN Jɥ! 7gxWaVy HP~[E'X!mn %i0(҇|ZXBcIFFū{%Jedea[68 ipVʌ`!kRP6xV!|\f`8؄Yb8T,9yrG[ >뼊O6J=_B܈쮧w5!X+rŭ4({?&q ~;=|ZGJn䘰^X%cTݜX\q,.3dRBQԅ-|"5&vw)' .$gVqP2G$ D_1=?8n; 7 *YX h^!J59H~"<1gtQH6,T"q|H%FQ a2*-Lͪ@Snh@y\@.'ݛ{>!ty[Ϛm&pUg{=xBp!0wX,.wS9h` {DSCҢoʚ]t4[MIt?Ch -Y9/ 9?ɇ\<yd.h>>Ȉ7B M0\5a֛*oFb nVsaVW&A-fq1ͽp@$ץ+0Z/x6ebc%_<Ʈb`~y lbwg#|7&be$~\|xB X@%-r-} o O7z C_ᖘ;0EHZj 5:Sd/Zm{ ,i,%ʠJc$Н@v|vyǥtv|Ds2Ex7 O_6OIGAGQTsdygfGa:ҽwOK?><ط|3+лL7hזW3E y)uEYo>AzKFk(M@2R #R!L&Fx91LOdf`u2va*gXV>pNtj̰6N0 ~d>U@#Zx )BB+ t.$ "O΍H[$.g._^~ sׂgyZ?Ts-H)+]?·eX5K1>#UͰH1j'n cp"'% "1rpqyi#D_\բR(&7 c6C|q+!s?@%֒9,c~R=oec!GfLIԞAv!unȖD|1{ys6YA1u7ZLxJucDeI Tw-'ϊehQY|EDe8 8z>-'EJV ٺz#I]i̫`J,yVF|dbd2Kf844ƥ9^Kum-_iVo9Y=Kr ~r &y`vaq#Li-ĿmH5f\=V;(OTVHg*Y'Srn ~5}xق;?IЬo8WasҏHG_-ʂfA()(aF_(YdsB$Vg#SyAЁJpm@ؤέGz%|aSʬ4b 0-'RN:*&طc6%Kco<qk8Scow*'V:!u p]gyXkӁZT+) @b_RJ6Խf;άj!$}Z1sUVs \v_-$%EA j9im`٦RuC81:{Vؑs;oCM+1c%\gq:WQƦO'*YbP^7&@MU͎*VfH[&S5Je! (m?DөiGvد%HC+,6uX' JqZ7GmMaE /`xB24Y Ze\JL?O[h=6cCrgʋe{˜R <قR; EVDQmV-_l _]UL]*}Ҿt&I _}6ے@T/~rW'XA_d}B̭ aP&&hؙn䅧: Hw x4;0BRVrjaY/=?š©cB̟K!Y!Qa-!әo1dQ!*HP,! ҡ/*QVLog5IL>5*X]Agk0_"G(50Q7}]hP,CzÈf{4.QJY1 Th͗ЊT @9\#,/$a/k@crJ@DSs\ KQ$m Or%u $)%CUkA!OvC!oMv%Pd= &t2lN>ˇ}8S (&7)zccxԡvA` acok2uݼݹwZ)cgNWMJf;y~>>N-7'}eBy͓]3LGm(GrX B+3a^ LJH.O;J*=ڍXЂaq[BI.>67"g//AToQ»ݾ W~(d`Kܢx0_qRPv l8Q SQ͛㸂eޙt^'gS{ &Qtb#8}vg`4-mD߶xCIoϏ-ъyXJuv"ueܛC̹Շ66 rˉԸc1Q Cp+Pr߿I8n .7V/@ɖ\[/F}r򸂉49!`/>^#B4>&Y XKnGA*OSʵULAq[NŠnGR#5_k=m!tdy䐸[}57R] gK <ñwvo77| ~E!Ό_p"zyםyQ)7EX`;~ޮ!k_?o9?:< ikQ)O|1:,5/$jrk@Q M%=Ի><-tӦ#A\(jwx"7@]nP%?\T=|Wc-%'Eݷd cB MњE v!:_T4(YS}1tZ Kmo9  Y)az^'D[ٝ_ˠҿk|FpK4xn>j{^tj-V%I=wܬ+ec uîIQI&\#UfGY\QY!)Yg !c,Rán(%rzrVz! . QNމ"&fZ5^.Wv/EqQMd JSQll\}2PgA߲gxF}EboĚ٨kzxʝmGw%-ij`$I9JPg'!sMp{BФ(|߮/_p,`asjA9NF6LU}8v/y)X݈A\o<ɍ#, "&@#&R fh`LкPTXcX U 0D5z]"- ȴCI ,>ɭ1B/ŇmQzRQL4KKX{~ P8DL .6"7;{[ˤ] eÖ-ʌ'l iv[M-ĻO2 qUCREo)>m5,eͤ BQU\pXP< υ;'M2wXˑ+ڲU#N80N,?!R-\ߟ:şZ7q87SF :q#w DH3AoƟ4#.rč||L(8؊YPu ̺p]{ R# @)6ƟK6\Sv p hh]^w-+ns^UNϩ޼sҝ!4UW<~d)Zءz2 nX.d5L.[9;8-+Ȗ cߤ*[ZWȮ6b&] De9eJ,w̧CVu?p'l#] ݴoQ(CZTW'ps1N7"ѥDTe!Lke2xΓ ̞Ȧ5s,pdz+β\u;s 8! e=MENqXgRFZ"9z_\3O*a/;s.BbF˻fs̞~c)`4K|9{` `9&\IwRK͌LCAhTv(q)߉ml:7v(=ic1&r9wvqKpC_Fɜ8<'"@Wpu\ҁ$گ;=뷞b+4ē|eioJmBs-MIhO] X 5*6aͬЮt.OϠi疐.SN g6KH}LH\vMNC BM:,<ւ*Z'БM,(̤;v*?r߭bgxxL6՞(RCդw,rGŁQ"eSDTr'  %x:zPGchv#kL0&) #Gve,=L 8xU#[;لT SOO KGf;ȄE5 hA66k# l\/ȉ<P .Ʒܑp,p[#zwLXz嬑挹ljfJ"M-(W$,CM0dB {F$,MEv .tZNb!--Aڼ[d=,;/1%F.LH`(AU<%fݩ#BhQ9"|U9X=M _:' k$W9ߥdΣ^r[:M?s]qa90&?R#K-ħqU7]Q~^z. IoN1N3t *x|:@H,Fŭ;y5ř `jU/wokKs1Ok{a~NjH_Bإ1Z lђ6ha=.,*hg~YB(&I ;@JZkSC>Nv*+_"!fȒ*B=ǩWUBa.f~.N]1ea*N?SЦmhWu'v?9P` *:=6u٥k?\~vȓJA7j{Y ҃,7kƎzvwGCta';ꮌVi"Q}ӗLKןWB%mS#ZZ{mj˷g 'R hS&[z,1T3Vġk*| yh4ܑ8f"Hvp氀S -3Q[L*]pHsdt|T6rmR!MgM YR Y=rSD"o0*%Ȏ|Yyၚ24ůőf~my)[u`-k⁓}7C³I2fȯ|U)Z/E7jp %(ZP+= I\vWKMSZՔn]ܥ\~WC^KVMݪLƍ!cApK,KMQtPk܀- ;!v##:Z 8gO0V#}EA0"[Bgr>Zo: )@zG)B9cjt=N' C1|FY6MCO0F^WFHiтFS SHaC )D{=YiSڥ6=Y\ȏY'bQ(ȍR-0 ̲0A]{0}Qzo=GLj9\bX}K0_\}n.S_G ~QpxZZ M5L"{KsJ,{;VMAn#b"z_`4~]U[׃*uw / 1-8v[=8= ʜ*sĪ"Ԇ`8id Z C}1ѰK!,Nasϋ808"b|c ).T^Ba5xɲ1'>i,.ltz+Տg(N3{;,Pyѽ7}g,;A.lzU?%O#k`3U> N*i >Sjr'W@\WU,7u:,,ٝ|l8]M ;j!b67)U}2H.\d%M$^ /o0k׾*D^$J)OxA6)<XYv_϶g^ Ԝz<ŷUgV2Zȁ&R818WR6J0h5CRqiOHߑۜv(w^4Wũ8!)3EM-5<Ha8-ߪ" ̅ ǻ[=^IB5퍥 Pa{c$&-\y^6x0GGtm*MYu0`bk3n,ۼA֌::>cj7!>CԊ7 CqlS> 7(,^fN3z\[̭[OtTRIiF)}`͛B(1q_M~=l#-mЯBɭ߱w 3vB0=>vs ~ x&0F1֝bTmKX./L~ }eҮN`9j*\5|!nqf;'}N<H%NO}\8*{C. %|BȺbElS׋`ZAV"8yT3 k1HY"M1PL{ zTN=̂H&#J<+V`)THWEKcn/p**CFo?cI9L;18p/d<#cR@*^ۥ -Lj'#H 'XndwbЄyf@QBӯ+dAY ,Fg}Mwzj-I /?/rfeTFR 1.>}ŗgW9gˋN*9" z]OTЗz+Yb# k|N;]YsaTL}\8tKDŽҰ^ޕoKӭރESLg`r2˨]eJqSX8?9+QP|).׽lWP1c뢄G|(]Tmx\˾ԙ}AN2M!RU-y'k9pK#QɑBힷ_-ȺCoSz Ne 13 ʒn6~XQ /V-F RƖ'F- );x{-=y+abKr,՛D)MΉ3Y-*]ܻtaֲ4VrD?E`YWFe<,U.Χ)y9>Mv?gXǯ-_y:'Ѕկ>FN5{v&c %tha` 35#\Jvkb\#kjA#qb8d '3C""-4ɃNu BL09!xbk LpumrK&"\.QJ~GߨAO͆S$tJҷG27o5y}CGAa#,&y_OZ*/Zʪ~ պ?-F.W ְ֔ ˘’f-!Z{5 ~.ČJ«n"]>rjaJ|fQ _%|~%BE9bcfdX`׉*O]x׼pFX.*hPR\ߕ_C\(~FĠ Sċ`d7]82L|qʔm.x w=9J|SMq>)< !cGzHOe42jMxuU>~hҜ$0A_گ#7ƾ22]-4=&&D4FN BYl ji_ٍWTqu8hV}QvȵEKQa< K9J9?M1uT4mq{Aw~IMj ٧r]QdqVp?V| oT Uu\{j\R.$l ׂ EHQ%!nZ|{KPfhF^[-<.} J-t A1l^7ə<=CtK:2-oB (z`Fn${04Yb~a*'AM5vu% UP~eh,=@0s"_*Lj9) γ;Jnᨶv,`#~4=wޮג%;{p_[z"~ц I@4I0Bп"VCCa3s]>"bq=2q4P3984eKXTP؎G1oh5[A)"!wF2D"/ri̷&;19(!xkY""Vֵ-]*&?8q 0)W\`Uf`㶆AUYY5@.%x]8B3̯*זo8ky >RW(0(@jS" ɲcFxO5[M ,U_GҨIyŧKn)C&Gm{C 5%nu&6kWtjpc< ]?j0zpU_)qċK"ł$> /޺v-.mDB$v^ҥu]Lh܎0X!s~-'Vgl>^FX5VAɜ1Иh pr8zvZY5$]hK[3oKݛoD`Ʀٌ0F]aKbX8Ю z [hXaBjo|ўqm? ra8kow4Q3‚vKТ "b5R<]U4\:4Q $+4Nۺ-yi)nDǍBwP\,} lx0Çk]<3BvnQ R]kZrmxn`V$F&5m :ZȤ#l{DzU?A=o5|K7V+[f{\LLpԴ{7/0O!شSI{ښ 6U$kuPHI' …e߃GuPYsS !HV/DIKgQBLGmڭ^er?r7H_[ cN PVGA3 :(!"uo 5r>ilɝw}~ϭEB0.jZCwDnT3Y.;"BֶfsWedk$=W*R6(`ޞ x "p&BvĻb3ɧ*oNEb AA]bصixWW=GSZmJ!sFoY$<.Փ`@KiK,-{ڋzPq*cn!b˖oEz݊j;ۋ:rjvpk2jj"~^$iى5/h =sM~rs?=0nvQ;ߍ8llS8-!"&A=7_zS$zt8BBIsGo'Dh#u5 edLCc.)ӮIL=f=E߬M]|i}&=byMq TʖURlmݗh0fZƸ-rvXcx; Oo#V&dQkPCOAG:IZ`!8qơkpG<="IOGUM[O[DMu4Gk"5k1Q/u1׫51VV4{-^=mӇ[QX&{VyVk nl4߈8E&W<^.\y6pȘhs[w @6MȬ9l|ۆK<2Qm09WזyY#>a濩8&2>̀hFxUzh ܝa^BZgGF@LRm Ƹ뺷I1 ?<<5#oA6}L %ǴJ?6lcׇ}ZE)faF9:W41ުusAhbkJb_F`'\R:D~xZ;FZnnmg@"'$!3Jh繥F_1yQ#TcofWy%w~]i|W5 7vkoj@^7s3bHk#N0cS7#wf]#\_2SX"9F dPi3 {nT+wxS=΍8rA0_#t'ÿVs\/&e!d]Z _JZM)d/3vEfϦ~78%EW RhPCĂ*9ͳ~VJPT9"ЩꙑYaYmY sMcEGۥF7'*>Sb_h5\WU 85"&K&/T̻SYtvqK2uS?vj/JfE2%: 2G6ѵOBPV};q1E䲶 -8.d֠0 k+x!L.עuU%8xXB_cZA5`{ %)b ~)Q.lSƆL 1BVF7Fn՘~u9\Q يF eteucW]@MNYk#.LNY;ĵQH"ڽΆ5[Oy)0 fX w'jbFz])vыؓp6=@{vW+G -e5a$h8XQ' N- G]lg >c@WikS') ilBj|Sdڍ]z2;4VŠPl߶F#]Mnkaed /jjpݽ lk[nŰ1B \?ksiң1 n۰B _^; U#x&eAi.DY2#tzA87u8;n@tbdӡ4z|tϽ^s5|pZzϯelt4ټwz;/+BahIv}I[-Ϩ`|E.v3k۽PK;6Rjyu嵩gPظh_GoŭnxK\{y*5kWI{d򛅐+ZbOCќOt;Zš .W[N,Uǭ3aA,kuUɜ4}x`\7QJ{-8UI$rž|DaIIKV{sy=|VČDf]#j `-9ע.{J[h0Y;bm'%5ihP 5[| Wx|GB6 BgʑKVCEa, EN넣nd2vEԵ0pcg7F[gO9~io1Jv_4QޟSWoes>{&XZAж,>>^2ö&JR԰YgVh+):`S/EPPK tE} a#pUdtM 01+о1ƕr鴰(c\S\"f{ʽl dl{H oFu<+{ٔ.^_kuٌ%ﴏBc =d!榕U4:+p"0a*RJY(/S֍d_kA%pӸǻxw/~nHn}ʹp>zo],kciwHA=*͜)4"()tƨ5tj5ټOPK?ԛnjOJKzMwl5g-¾[|{?^N<4uA6~gC2|9XG="(Kq&O=|(~eVK06Ȝ kױ8r !e~Q @5".=`wu Ztqz1ְ־m7-cq@[5Iw qDxܟ1a̝^Pp#b-po*o ˯U.0A/-6!0[f G{6=~Gg&ݺ<yIQLXhY9@OK>ۯI6VyU.=OSXĺs7ߖV#Tb|^2yۥvb:9|>K`ϵ5da )E*ED,dB| J&^y_C~=xhY[|{7a[oʶw@ g5pT7{XkPei߮okM]0ηH&:+ގKY *EShl5gTłn Ҧ\]W4y"XNz{}"7<+CH!nۯ{o2>N~J4֗=]3v`~fZuʷc 8QU ?Ihj%) _{8^[zmf`!*ǍBgPryMF'AHN3!"Gy5FN>|J([>ct>O+Y~],,ȷ{gx#B<?yxLd:j =BbD `@/$$~gw‘H6e=BQlF_!ī m95xo7 ڶeܤ8ioOhDTlav"^Fr 'Ō=a#'=5UdVfWFÎHTT)MP 4PpM [<%jEDHN4,,[)XPs5.1.Pѝw!G!aJn!n'y "oS9=@=6{LrosHTÃwMʭtIZf0F7hG*+<@6ƽw(aza7\ 2:"Էeso"802mݨ^U ^$*ه"k3znk5OTGVrvq0Ea{;`XčX{xF^?#dv^ Jކ"*%ؗ ~/RF3cEts⾛ X J}#q!do(0xw4m:FmE{]aLV?$Qׇ[n>>Q%a{6 q'~*~B_e]@x<7ށ23z#|zoG {$}.Rlflsԍ$1xCo#O޴\&ӕ/< ,}_Y3A+iq(\`(!O ffjTwvgggV a\#YwmP\ ^ǼG|j GFl=X{~_B'ң;ookFgMVʻXSS C.!7CG;AzWԄ>xy5>3PÕDj;9(ga* Oސj0R`^!)B ]D~ ^fz<v.ka-; cX/;y#?I4Zik0φ'<׫uw=m&кڎ2.\-kR0=leMծU_Fl]bW{n7׏?{`/:74Khn3pAjQbWiFGWSݖR)Fcȵ9/Ѝ=3ÆڕN}σI_ge\Y ydR.6&ٶkSZ y=_ɿWOi?o~K_~_wK?~s0dɿGK?ϯ^K_Go_i:vM0+p.bCm'>oy?dbUF}=+ WP٭vSZRf0aYe5 jƟD"lla36kjf|)3_~?aS^H_o/߿ǿϿ\g?^HC|Ȟ˱p18D,%Qpz"#n7J&Gu]GiĆpz?4˛mMe_o$h%U؎r3Zoj7lu^a_$-ϰLZ^nD "_w PG/]ůQiiOA=Xk^4c^ۛC#~i޾ ϕmcV|ퟌOwPc’ }fa=d-=rx+:m΅sm=ZpO"> XkAjK#<5lZ ]>e΂Kgfܫk˼ش`hYX3*262U@,RxCF,ɽA`{kϚ ٺo7KUqHivXݫ۽ew06Qwx/{q°t:|7ƹ1$8ctG!:grs~i;8gA [,u؍KxMi̩wy;Wpxk~r~Xfkz:_.)Ĝm/; e~ځ?9h쐨AcFttayr,ȑ]ޘG8u%跣b{hg>yͫvPM3^e[0%*è _k1"Hrm} {ZSӐW:g.vfT<`\IU(rѡGkjVbR8{mJUz)xH-yS╶DG4V,%GĖZf}%JZɾ1~e Ş24GݷC+VIf+wg;$#2}qPbr8 k b9KB]'eyR >+Dkyv*j~8pN#@2#X5F+ѸDX:Afفˁ#mKҽc|1PS_5{sԇv`/cVͿ3\`& 漏.}vo0gV2eӭ{c^Fyd3PvcJw{^C[C.2cMk6f4_ƸƗm6CMe4t*Y-+lkm]C3/Qth*CN єv5%3뇹1绺q^p$hԇT*ݴj^ۙGt>!hP7R45Ћ?gvOQuc[@w(AhGvo#T7j[aư@xH~ 6){9d`Z yڃףseB~٭ %[}M3ڌmyә/+쯭(͖˶ u^l ValFK2ᛔ\r4ʉ=V!0#[|\ug&Kõg_y͏󰑭y$Ư<=PW:!÷!{qf =M>lm?OGy:ޏxJtR-]'c97Гׄr3WTύm&bcـ:gL5Xc 3ֈa/QMSѣ9b?ٚq:átB=g<~8pt-Ncy]_o}~2^qa<;.Χ|\S <6Oq!h:Wϱ)n;x`8Çxǐ>sT~ Sf!pH8>stream TPR/ bƹ*pjϕZ>7] que۸jo>.I ڑh`e+GhN5^ir3v#ų[Yw* zrK^/Hk20X{! | zʷތXi^c}]?7Die]vЂ'&N΋ v Tc#?4~SS }#=lxRX'`ܐhy,cLhl+v3lO15.UւAD1'x4n@h%YL}x^{C]Tg#[A3 ~H1B6 /* Hfiu^lJ*ia<1qh}= &rOM4{e12\ew )=^YbK(i6jN׶-ރ eua W0m?\Wӏu:=4 A^nΛ Bkdmpc *V"P򿴗{,3:Jnjma}8 8M;.h,=Xyhbl J_%GC)ѳ&cn/΍=F(if\LP0OGFCHqL0XYCyoMf\}a ~9'hyy{f:i6Tr|ũdIy]O<hK2οoޙſѹ_NLÚX'G |[[B }⸇0ڃt]dӚ~kG#Qa }*~4wGxI n$EHq(k*NNVLl̖) |z%/C|Cv/okv`LJ]pB)^rZzvJh nlD\!pxzϊfڹ=Ѷس5vþ=ņIѫ>};:Y%_S.o!UJM!:&[a8#h,_^?d|Mn8WEALXcj`_'AAށžNkdsX㌍ Xzs eÛAe33MoQfz@bEfΦB36F#N.VnF$|@*(q.>M!~W]_tV|_N:#pj(T")#Mqm`䏛P[q %*I8h7?bst_ mMC0abQ4U`8]/!Cl'*LB^(?GE󵊦)L5Ts0M&j.Fȗګ`*S%/rKViQ+ Dq(^fkLJE*}9bnN!M܄@3HsHjVݳ0*~iG@CoHicy_֕q-]7!FdO7 '׽>O#Uo#Go,?is-wݠX,%la̗DH;E#*pn?Mm`gё‰.CpY#xXk夘Cʇe-0-M#G\ ČMqhr 0v9h =D'"pͦnZIh+Fbw#@\|D 偝oq}= 0?lW̍`ZJRÛa챱X9lD֛J$GFEtߜk~ DhtFY W"lYAUTiw >kۻc3Ts C"gp ,"F<ʃn:4D4̌;Y6$ۣ8~HerXi?bl9${PXY-z`Bu{c;zS t @2 Lۖ!ԔKRR4:! 9+Crf ?#Bl:`%G^FJ7j7C`7av?){`$%F_9-s#y3(L/u) #S0ndnYcW(C8|On1zPy(cLyo#O@y&HnVm|+~&c- t/(88{BFWQ OfEZB~d*ތᱡ1 x1;Us껎IF\S`'^˺\{8~kue| \6; 9w:\z6 } 4%sYu`GpœH7<#G`_m;K\! R&` p@%Y 9FYxc Br!yOä30%~(S)a5x!9&&\gۢAW`Ǿ/~Az2h#.OSR2轗Iq! |YW2mYkҸf\0gp`ܭ?ׇ蛦Gj<Ť;BNBLb}([By⭅ݨL&:@/NFCjbl~{cpĹ9I_`r$` 0ěBKbjT95h8ItD<.?d3h_z[>'2͉um{II ȯY޵bNS'䋿r4=t=vd''|fVy5cM>^UEB)755>OKq:exAݠDȨ9lz+unݍF:ڬYȠV pդM}tͭ{WF"#/oOMn= `n* j|9Z> ߕre dH'41 T1tW'e2Io#5ޚD,[ؓܬ/.(qVJ޾R&~s ~Y [qӖF:9$ܪDZa>Oձf6LCWOQX ozO_B܌^NM3iDBHcf5hucSWټEZҽhzl:Ce@$Ӕ'=y̙g_XӥjjWgޚQT㳻|L/' eO͡-'t`GEQՉ nsbđ!m~^38eE$7qc=XOKZAFw@J< b2T&_65PvpgAW,u7<،΅YS 1É_cu䵔 @SMg7"5جHvze s܁{ V _!:qIW,qu|Ej>ë`W^ Ҍ ZҚ"u'>%& Jpq$C}i`"#W*,ѴrNx;dׂ 2FԫMڢr+9̘Iwo V:$RF燀%읃h!4ɹ``moaO]j{"=4pzf$#̝<-'y>qH#5z$O\#H}ȿG3H@>Px$][}$b(O3H GH?矸Gb?e5Rg݃HALYw(ps8k?"gY( qxx9 %FH%G'Mʃʓ.A( s9Q(t:J==ď:IGQҳVA uzzҫ:[DZG'ͮQ I7(2v#{.; %ӎbkgY QIE(9wҦ{ұ;ޝ~w; ="ϊGPᓪA,IYxk|v< A%#%bg'ẠtYgAyV<ʂCF¤G 'ӳ6ꛆQ( {=ΞjROGܣI({ > ?iO:)=WtkIP~,[/nIM%Pwd`r7 g[v8) ,G/@9Pmh93 :Rd33Hc:QTw?D:Ӿ8bgBّzS;ڎ'ܑXwb=}G1xOąodLS|.HOgD>2\#- ?s͟g~yG=?jG=Y&ᨩpR_xjxu8(@ OGģ(ヂQ, yHS/;]/}8{}Q 0$Gz.=%QOJGY֣A("(8{=؞oOڸG ݣQIQM(#9|'>?OJgDQI(}~> U%OG쳬➒ZGwS0rpK#Hn0^lxѫ G䎑LrF42Ft<+y9LoG1i!=#F +4c5j/5%Ԭ)p37}NU>lU}G0PӠтT+UgM.!R/y?3-]-0Ч4`$\E65qHBaIx}bX)Bkt{ĔYxwu5yv\=EF#eF%3rI{ƫ؈d` ֞6GW*-3(|Vs_|*<:Zvk[Mڇkg^oRlaCP,X/oˊgbj8:.!.v/.#`]}c,e[8f[EIE#Sb,!AIq-æS6\W B*{n Gȁ`n y&enQk6^jL!Z =r?Q;:b3:b\RydG=NG }/;ug`z*խ;ˆ6&"|}X?e mP,|bK[pc i4h'nRLu?/$x5:hЧsܨU@y~_FB=pn[HU o ܖ4, n |ozinQ}0"KguV]ōi&~$ l6aTÝCÊG9U~-&%2ޥS,-/6 ⸴X^Zw0ȕ~(Q,#__am [ X}tVq%XM+7]5[ UE= b0H=U/Dvf3tם9|n$J30JW^/|uc ;eh0]@&h)7[ӛu$7T^T0<_39+:*QݺNFe}U]UI>jLy\d7_\x%xYƬRt"^V\EBqZbu m ,(&JܵOXIH{X~S^]Xt=Q.-Ĉ1E0B19GksKɱ(/| md3x=PGln7sxj{}HHU.On;p)b R?ZQ4w 06 rJ H ߧv=vU,ʲu=_#P""W;QVݍe~BW7 ރqEjc=n/s0ؖX.!%(3a$aZU?>BLRA>dץ BRغq:ô-N3XK]Fb#\A#Zj7թE)=N#591Z*8\~1 #3 M%+ËQō ]r0悲k#dbjS]*ٍQFrxZ!Ʉiy:JFf9%3AL(`JҰpzQk|F w\ , b]F EUYh|b9{w t؛W֤C !ͦêN0PQXL%9MXGI!Ba2B1u `f~,N_̨nY1dUp&)X_ UJiJ50 Lv+a\7ӓ1>uIs^#Hc"cƪ&Ì/XxJ"YvcD$.vo1oKoXoׯUʰD Է^W;6|EZx۪cM b7ZK|J4JnEnE ]%#Ks]!Kɾoܸ*ƉEЖa&J܄:_o4l !XYW.pnkQۇ2B%;ߏ*dK<oѢX<9$T/Oz$wҼ2Gq೒Qv(Pf }|I~RT>/DOGG]Ik}>e?ik?q%qvc LQ[&A+a~ VSIF'ٚ.hLk=,Ī @STV^9Rf/U*ԆNxŪҸAzѽ5%iI^3 e4naR*"Gj~mxؕ wqO/Y6;P2T#qNńK#`ϓ9SmCFFKɼ>aao1uobmc]<5Kid60–Wlt SŻZE5 ?&ٺc^) xsyc!ȳ{*rb/#=ᾈ դJ*@@;UG MbAq“mapܹtN(F nS%D4?.Igtx5هOo"Ӯr ۔R|mFNFlƐN62fωB`/<XF&t7R@t[6wB;?Ŭ.qpW2 \x^Y:;WDq,H~OIfm1źyى@$5b{6zQ~*d늉/hN f^6s)(؄&/-:6 }B<ƩBz,%~'W#h)c76!y"#LY7`XXLKXĉÁ!A1н T2=2p~Fy# nQCTԆ:^-PB`2d[?5i,췂kXH~eUxF%D-Zza^(k#yD'=ZҚx8aܛȁ6PbPoK[7~P[5Ǔ'o'E;:sOߛxt&Ov4J!T>, .W-RmXLW"Y#gG# Wh^cǏq'x6ƶV*( &J^vqcJ4N xz>uW[ooJg5qۂq[_@Q(zxՇCP}j xn>9%+s,ƨ'XL [_^hY&_W` )! {pE#5yL|yX Hh|gORKGaiQ同Hx`oi~G䂰X(8y3p @V˜wBx(ik32MxgOMr$6K@ߏLykh_UsFr|[~NL3`Ę7FNYX86iaH>k!uMVv ,rU=(8NN|> >r[˕Q"TY&w $!7np0)6 L"Rx8WG\>UxD/)^y na{trʙ;|,U-jv!=}8~v0y zv鎹y\]l[Oz6&F@''vvO|THMFhYa*@))x`٧B0uuy/xxi24~ڜ?Dhj/ScFǖ{3S; S"6U=$lGbNf=;O/b0(Cr0LTp"AF{!ef%gk[{9_He},cEkz{D96gvVƫH|̉]lVI.J`4xz9\rtE:pޱ)TH&~:W2aKq n Gs^%:}.32}c+ׇ6SG_æ3y{A'y-Qa.83;Rz PE0|T"wwr5ߡ1m'1=PxLTZPiUTI.prg+O3Zd邑ߍcd|וpi}cq#)<4I0N 8.I _LM 6@>3`%w,M5&G(vKE (Ӱh^gWGށД|OeVCu(PR"<=PBD[s5~MuB|џf_qܯG8xj*$]>6MF(yh:)U+i ȟĠu;7==OYb6)>qb>.u;|O?"pw zMK rУs lh۝qnlCDp~ylAInxɉ ZLKZÎXd.*H-mdofw~GI.*XBh|س(zv4;C+OWQ@0'#ܽj[#zjKQ,HnW" 5U6:5x64f9&#jcAJ!wD/1399d+U j/W%߅Xp,!D`A' ktE?Gh=oO cr a $V<0ScAxqrDdG؏ZG%jQ$vT;ˑˎ:ghg*O$ގpO2r'͹6ݣ݃QIJw{;ڃGIãA)IVA$xԁ<*F%ZG'˳Q7,yT }UAGѣ2AA$zTg}q}|M# wQC:>CPPFN'F"X9mq wkڒEzl-5G%=k͛4?52>21̥Vy`m=7-)-:S ^.&&K=D $P<.7!H4#` %F#yF)x %pEZC:XiSh:"ş2;z]3M-DI6 @ =KiPTLy30O1-']89r}JBjnChV0RwW(-{6 V{ VlS/(|Cu p_bҁ1n?sS".֌z 9€'tozCaSOJߺ-n1t#cf-ؒܠ̊pOy$ǽem =bsU.V̒\+$U[7yM+OQd =HBž膻"-mYx9v){ͤkANz#nӦcZxP67fFTC9 c ؼ}αα+s Vq]һuI}ifB Út~EAEۂʀfɸLjb _L4~Ќ53}Y*e=Nx1>?0gG ċX fSq$epN`h ?h&){WyE6!ʽ^yII 8MK3m`>$u;cRÌ @Tʟc(مD7s[O\\nWtZqgP۩8$LFL앖$fa Q{(>jհhc`~6\-QCLzIt̩-tӺsN)wVT | pO.Qˬ,FQijF?EBO,mȯ4t-m`1T>l^,JaPV5S"`[m|[ώQ>DY6oXeB2KgNYc24u`q9sKY02Ưˏ臜kC6!odȿ?&UX+50K0`^`4°zAua R{e'UsR@| NMYGIBSP#M"I?VlU[VYh&+ 3OMX@Ej hhDƽ-m7#l F*Ke\J)+A0ТX,7s{Oev-feѨj {-1ԩ]_'cL^ORZ3;C!{wU{Y`4Y溔 냳Xq1Eie_Mj}мW6K9x^FP˧!zyA|- fJ\hp~b+>ܵ=9n NP *B) O~:Bj?" `20H.XDXI[73!I䊵LaZ6}x%Ռ%(0q47є{B8, uf Q4(X Eq#;M`1\5iD>);Kкf^'2}q[ʚF"D\*`?j5L唭$ Sym$lqb0 oۧEhT67؅N3%q2ѧ.kG囈PjױB4q:f̳Q2l s-M[=O!Yᙲ5U9%*l <$z+YQ@n(;y3{ju5Xp୶ǖt,C_fyC !*It1w NSVp 蔜X|k˙j@s ,v{2yI;/m7jYYX [meێrlߕq0xdV&aHХdD܍Ŕe}&)RgU&{H rf b2O^2\Y19(bg*D d%e2"R yDӅVZurZ pf'/'+Z&@lM}1,n wN7$uzN:$]Їh5h?D̯Xj ⿖0JXK1 8yΆT_Mn}VgK X-q02LW")&M@28 >>%ÉFb^dѸɜ܃ԁ*?猚)'ܹ._-6{sMFS \mx#ԥzq͗?Kv'~-EUaĭ~"Fi w c|DMe+ZuTܯ"C|8lx Fpa~@l^iG8yo4HGyao$F#(1zIR& ɃhyQJn tj8v&Q$_pc`dlBTܙ`!4pణ/LGZ/5Vrq}Hq"\@C !nR" i;eͯRJl$ =V.XrLqywfqڨy;:W^ToLK4L'`ҡ%J-/w W(]ojQS He6r4d&LFoY$(oh7D {`2p!\ЉC:q!9R~x9נCQ?bU5 ^v]0#pxC>y ⬇!~{^C0}b_H~ ?Q#:l<[M E FaJWikyk$a:'rvÔa0-p%pn8LL\bejlm+Aqs ].Q(__O!3`_ eMI,qt(4q AeN1^  zirxb)dZcdY+;xsMKxy[gmiE{GGZPO?=PvFB^˄T[+URlXm\0w;N4JpTdEQ@Nh>,փE  7{V/)!3g`}LsK$~Ơ▅lwv,g0E9 +WgQOFrHyσX+ۤOZ4 ;hO-g!Q2\TIB`)*60eOڨh_Y{Vsq4Fy7p4}F +Њr h2K/J CؽW =*h:V)GIL&Cړ!G ʘzeӲ2YgŐ$cHϽ~aa㵚RkuO6}nTWۥDoKGe?esd]!@iEO{D4 ,.US(Q^m aMgn#_EdҲ;뉰QQj8K <6-$Gپʐ9 Nw:ŵbc.Jͳ6TLxАeȤF2h|Eу9A5R2**gB`haIM6܎;+"aM~ o$AZ֠EqЮwB'5|Cf! G4b[-fC9ֈ,I+|JkKJ 3u׼qہoyKyB;[i"WRgVVtUƦdmZc4'M)4U(hj0w8CՐjjXj f3dYQ 1qQz0ŐRp׊/H#Klpg2BrRLSi5j Ʌ}]R|VNdf EzpFB7L Gs z>Q^' 8̦n`:?bfAGe=XXrXk* U"d"M509>84쬂 +Pʙp*dQQӵwpL Mvե<F1LQ X;g7`PJL&.ز[m|^E)TV(*901Z2Xv|C!'@x6<%^0.] rjWtQZ*R,)HENe ۛX-j!Әԛ$B.+y%!8dvui4ϐFiQ8^”YDiݴ4W"g9DBdHɝ0[[$&m6¦(`nX9a-+iFNcxI#"P?=Ʌ\kTwbVz`E8}0dɟ\S|C,Nt,=Ruj( :섅CM 6U() qJTM-h٘G3[*S8Tuז|Ftsg3Y)<,a̚5#Vhmjsce$J"`T'tDG&73 e.J!,ICӵZ裢+և؇eJKy82QmbNɰ8d F6v'{Ѭ{g$ELx &` Hp(V P* &5dQDHeϓ6JϊFPD)PХBrU3!$A"1Z'Dg`B&O JOQEnyRu9Ѩ<3 ; ~a77}}3@߱srbVۇ|#/@rZ سYfzM1A a9,,ڮϸgsSے-; %-&,n-TҜbIV %FBHNt,-s🭄e8&mƙ ШigKp+h65I#SYH)(3,hf%4xV:Ȭ0ÒT7cp5}`fW'%``~ϠJYBÂCDkuf^)be4r2htJ>zU)xnw|XV†ʐ k + 뫭cVnx[+773w8)b*8:VbQ$^tJN H&`$h)fɧYi gc<YArepŽFH#j;E9:kC* .VC|Tqax_0U:Djdp Nw^Zv#pGXw4tC37F ZeL?xw"py0݋ھ/O?7>\߿֟^nۻwoNDOLQ?'/ON~/,0t{&/ƩniI_Mݭ~ىf٣Yi@{ߞoh|Q'N)՗$,Ei= S`B)ϕ '>4N3!:Ʌ{d Qh&5ʅ@%KPe%: ʚ\oyfv@piQK d8HISJjIۢFAR Ēp2<}r)d𑂾T Ԙڑ.E{ Tꖹ={5Y3Ӹ`8eF6LhyB?Q/Dơv{0Y7U$F6C1ͺc'YqQ{\ʽWh%;O/ff+D17p~^{9* R4-t"^Q~r&s=Q6T(@<,ҳé&;x}\HE{hi˄A]"Uj "n-LdHU*H2|RYG-[h\-K{b1N=z)^zI,Eѭ|v|Ҥ; BJjgY:)ZL'v^Ufq]n?*gB.rKI=zPJ腶_ZۋFDPd;>vqU(4*# QOpgxB]iJz@jN8d=0 =qNN} ZB_ؖͰs2K;pV$e%"ymNEqCLy3hkTq$lK" נӯ"*9{d5}CM%4JzS%]pn+˳(0mYT-r~xWTdv1eXyпřyKnӓ΅=2VLEk'}ڛDw?nY`9Zls-Tv$c'ϵ.جt:h 9.v6Ē3ŋ=mUcTʔ9j, <8IR[8L'%ˬ&Tiqv=8AȲ-@UZئ+SKʝƘżr2QO$>A<10.mE,q-S>$x)y[U,֗ЪS*͉v68/ibPz-ylj{-N>')(0(ÌUR6zzuIm8݅"XʪL^fD?&;BV)O#n(+=I0O{X?&rQ~QAApSеe%Vӎ/%*d04YhΠQKJ׉5GtӖ;^BgVGJQZT6%t+"H -F;Yv8Hn- TQ $~qNbz2قxHl-yPXcX08.[YxzdVҸQt8|ڪI! ڮ^0+4.ÔZČlJ=ZORN̴, s2b85Bh\̐K`n$.{>k]PU=iDs =4DKLAզvd=TJŜkrt/-ɑ͒z5j=q> 0txpZ7xIWIƵ8/&[7a`4/LύѸIpٍ0G=VI/]]EowگZ ZRgsY.J[]8 #m"!`1âlOf6k; |A)P ޡD3P6ߪdAnO%p1nTVѐ7UIazЏM:d:X4?Q? tK_z B#J^DU,%čJg5 E<]h{0(ksvj͋1XV60uLrd[&̍rr;g -NШ:@!muU?; I:yw"ES13J?ye={"RQKLhA~>}NA/fqdNSҎd9ou$k4:EH&Q*ߡ.P- ZJvB? ȶTz.Z$D{qtbWN"UvE4ԅ|^&rYP. 6k8L QT6aC)4S^KnF{j((_TsVif&t!TDZXXD&,ȒZΨ$v)V:fk5Zcs1,Xb*!wxx#e뼰x6v>r"9OzwSxS,P,2>ODXu&ʁPg^]sKJlE߽hQ}wDODsjŻ + 7!FS  !\%ɂP-iuJ6=u!9ܹ_)8;RM^Qь_S{ #F1e0)pKrX%~ pka9gMPKE;Qjj@r? %ietgl̐3@~fs]mI9s+Tnڑe]GC;,*hqQ!n gw'wH)frc2W2i,B'^mk6ԚUI#2 ;xbTT PP}̧Z7( b,x45kIzX'.NWL4[DzbZW,Aق #1,f#CRҩrj7>HKk\ 11zi,zhM0[ZbajWȂ g0+룄Nh" fiEbth*sWy <3z&ubPӓz4ڗI׽V"@,(ޗNATwڸ_M 紦]]]¤d=#btCXnjY-/s&Dž]5+ /\=۸TG;'Ud]hƹ5jFChLdc{fv tF z)ہWxhĢ(F\8fkC G>eGaϙ-lǓF[I.Vn[*ܮ2CAkd,MXGxArVV́A >QC+(kS| DKr6.K!=$;DC);YAd8ώr6Ez)lOWYl*0bAȥyJLzdɵ"yKDD$f0N^؃ϑx'oY*67 EXUM!LʵxuJ<&&ϬŒ4Xx3ZmE5a،6p"h!6F?mjN0+sY;%HE`.\/kQo$=M&$3zP/p++tAEGMkiK h5kX$ Qp]&U;:7[{̸VF[C즢S8}kY!p]xփbޤHE*~ѣș?Z6f`̄MmbuoVuEvEBY ?J,-i҃}e.YA3JI}bBC&0/u&y1ݳs"-݂R҃8jb!.sAR>lup) *ba^P>-4Y͙~;|s}b8Q,Z?IKӉт4v?ayQy^$F2k5NVk7NNL` zb[THtLs !ד颵 ;h- ^T'x5M Îc\\j;d{-^%XIF9 {` ȴάQ>!2qbW:h~ήf̺NcSrVEC9JmT%2rlh)FKNvt[R{ЩׇY߂=ѩwAfXfT¦Uߤ]zТ4vI- 'WDЊ 85ycc/=NuHD q oY(7I~H3-ժťPuBaf#ѯBf d.qŖ'D~S2'PfyB΋Zz(M/b/> ^RTI_<BYn.,@(xhOkJ!Bgoӓ͛:Ts%U%ْ߲ 8IU#b͖ }0fɺL=0LQMg j{~2N>[:2vfPUkTSkje5`.C 8촴ҖEd Jy1-i mګJ<٩گ)XZÕ%PxϙBpifU-MR{NVj=p;Ey O%ռUAYLHs_|MVi**l0GO_A2ClgԂ]pu5uȹ} pߘc/c1Uz]A6* b~դn]p޽WW a/̜m`$ sucԤdiABp m( }<6N.Re-(Ր@1r-Sp-h8mnR#*&ay0XR9UGt *$J(ى %˜Q_.ՁjMg LYh/:?vʭ]ERAH g:Zjv&J VAݹe|rWzXҀŎhT\&uJ /2`VeYQ)UTTC8u,%Hs:䡉qCtݶXbIAf$0* P ;νKdN4@ \ed&EX-ZL_X&S9whU(+eXj͖JѶ-G)K}TngX2[ -R"5,Z-/] 'C1`Z_{YhOh:3UǴ wzqh`J+{ԊEf Y Ω, Sr1A3;c+p M^fZ"sq*h}Q~ 'yF҃h+EqOEM阨kjsUq4(lV=1Y%]nQ9wfǬn2 P! ^&Uq!;RL&I/!j2mX\I,-<'hL2IjLv1Z_*zD׿{wnTډbWѿ߼]`?ݛkn>ܽ3㓿wO zO/^s7 x#''ok'?^˷ڛ7+׀\.~L a 9!|a?ܴey {0^F>p>7=z}C|xa;WhPM&~xo|s9쐬gл~p&=ἧss ~T>6 m~X|.-G܃7 OB_?˺Ww8`wnmyo>_]w\mѦ=xV_w7 ]7m/|gߜŘrє;rGShMWf}sYuy4^1$~Wі;xw9rG[n-z_/ [uuk0k26}a ;V  cx16qԛ_AY{1y!x!>˻ᄑ{{ jAx&((6n^/Gz-w$o_oX9[7 w1"p/0a'#ylu|ghxMg/bh^{wo<~!\۰_]ݢu|wo/o}w/"^Vo_~ 8݆t__??`A/|fw~.߶즃oї#6  7?%gۣ|?lpp}s6פ}~4o|Ӗ]\zwnː>~D@ugP57/n`pem0vs j鿙>W4MZӆz$ȅx#?_~a8py+kHqp|∠mL-An9Wg,.n:]~廟ݲѸykBl6D9ͽi-~MH-9}D,$T~P#3ڡ?:NׄE2?EXE`()^V&,ʖ~XwĢ(W e0/4/Si>Bj<1/R~oBy9⋾sk1Hzgkc4}\3[̯i(+Qe mQe/GU U+ʵvkkG(^\;kGIG]kW|m rFญ6 ;Fzw!q%%zM8U5U4c*\z?/ m8`͟nm\fV_j|/F}3 7[t7ϨغB+s;wwoNi4Wn8mߖ=69"wSN͗@1q3gx�|sW"V_!7yM7|Bb6뛣:1=Ʒ 9v>Q={-j݆v/x&i@[50 _M'Ɠ6Pc\6zkY} mq}!t!Q{F뫏o/qKht] }*˳o٢oOnyJQ':Dt~Jx^QQ;:GT_ 6lۛY,_-Ee:nP}g?[ư3pЖ鿯]3wa 3x8-ʃ? (dzx6Me򡟍[pgsx6%z"~(=}٤_FIx9㋾ŋ\ق~/Qw<=}rj.#^sS^}MEΜ9Z>?Z)>e+.92{}9Ƴ ׯ95pLnо$Q^@2x`")vDtu-5߽2˷Wtxv>נ>'<Olah&L{\Sp|7[b\|ճO'.N'\^q >ݧ`b4sͻMDtMYw74_X-c ^P>_xt&p2qEɂU^08r}f$GΣ#ёi}hg#1{>{5T:~cw{cq ={WFs{\]|ݟ??[wsnkYߝxTFQwgӹ7KZGCFu٦#&;ɾA_ݏrwonx?ܽ7?|=ώZKs}f7nܸqs!z\er/mTi00Ypr_Ng`x9:^x9:^nv/GlDƏ/[1x^鵥?ʕtt&1Qn/Msr͇\ެ^x[H`b`b IƑ`x8~ ʋ9K/p_#[K׿P~p~)S@|W60}ۢcy.{_rm/3PiCw$a[_pǾ6W޽ݻ]ǟ޼ׯd0<(rby |fh_;|{ nn&C_ dc^oy_7[t7Ϩc%#vc c.gFr;s6ۇv>:|L=[?_*P> ɿ7W:=4ۿxf(x1{xhx>eNоᾜr4^4N]6 1+#|d3PU3 ttf|tfʯe GgƁGgơ3xA z |V5JLɏi0G?kc|RY->ev$KV%o^ Wt0d_J7=2iϙM;AwbmGk0pm0Gkh5w,~ hmќ;sGsnwGsp̹~ 7}OޘYGmM_oj/Dw*?ͻ_~_}woa_=*]0ln>΢[R#K' DOm|˓7?/?sgqԕOnB)ɩg9?]:sNCDK>sSŝ2s̕_^)z g9k)̞_-2Sv PGxԱ<ϑO)RO!Et3՟E-gi;9KA',,vx砇)% }So g1^-&6ypK;/ZBs:w%YWO4r\|>Thcޖyw>C_m N~#vΙgKjYxѕ@WI=ls[I+!`eI 3]X Y]3?_yugy*qZbDve }CZ~=B#h] 77}_Jϐ&<:cϺb i?O3_7FŒVu]ѝK, F$u1EdN dJuwZקHD^p.[B<}T:J^wjw3oYs "[.hYU:d]u)ygeBZ-`:Y+ *njYɟ#7!Ԇz7ʢ/߾ OHK$@=-,hCqu|&ddx  ׋BT >e nG9"^kh»I[ŗ4y\I*X.vk@Ir6'~n)>B9YжOY 'XYH<\ꂞԧaW]{M:Tgh.I#ʞecv|rQGJ$}ݕuP b>gܺLzΝ,3:0%]G{9;aL:~ +9aJ+ p섅o|?ŕon:X%N 70cWuIzK$vmڭ]hI3/<֙I863|}\H}zr/ <afM_F,KPo $Ú4l2y^btzTOV'!N)}g9:$]S<-;Ox?nXQ* KMYp&VHY w}*ÉBqb%Nupo W~ $=rԧ;t$i\_fyP0JėUƟ'H3F,1h`EYoҵJv-zdL~a|

ͭ]=QaG'II"ʇ ) y§g Un*,jiU2T"VS+)SU Wq@MF} ekP:օ4.3/#(̰"t+ȓ][ZW]Yv%ay62?̢G;wD[cUuS8LP}2Lhyia"RVр jggKqB~ i;tlM$}6UӜI!4>w+ڰsXhP)AZ`QC@)aJqS'Fé5y#Αxj6 O38[\XMZ!MZ@ GCDV*C--Pl{P`(mc:F?In!exg*9 Kxaw@]=8GS4;du.s=B#5v .3sY,x)t7vfBRH E\uYjQ gi`:914\>BzT/E=ipEn&n9BEY.XsT5C}2?Gv:5M Rp^5;*@耪^p&D7IgvV9y=3{E-R7Iޝ@J$K"E yY 7HZa&r`NrH7BK dF1fq^Rwm tBm]߸j= #D5p%{/EUDzḆ h,c4l6̘*rbpe?l"5x|f6S"tςZ9  "e:I#iEb Jo@^'0&:ft"C't+,6侏lԆzV{WCҚ0zkXU!l#Vxm̞ft#bgN]5H3py \Ho#_<ľ:o3l`1 D,$IuJ*aك B`o}x!3 ٷiB_,Ҟ-bdÓ~ ϰNA"]W_-7?1]o}b}N_wR>+Po}"Z૯(>^e¦~4߸a= @x@aTiq~Zdox$x,nۂ&3d<4D| 9}'뀟(= Yכ' i]["_}x @O۶ ;= n@h|<̑nij?"3׻.NhSfCOB"M$,B}P[G=@3LBzL<Poz,2.c ȼG&x BUc{Jp t!j듰 U%y Z "?X/MP 'y*r 'aL^ lk< [aOD1`>c`l7?@ԣ mO@4i=Հ[kDdn} O7ට pS0 sހte:pgG;?=;E=qx#Gd~$n >9N^d Hg20G#^f`R: Ȉs=ACt늏G|!QOb$MGIԋ>HX:GKCx NH-Ǣ&L=7AKȉd cR}~b3DQ'(| ~էa)H? M!1DTp08D\n} o4l|o|4=a) ] qx{ #x =o!C~v>O]y S) c0>}< Wq H x,S"q=d!< 2` <!ErwoI'qr.ޜۻ7 o.?|޼o~:!\#X|ݷwD a$!\"rp<&QDUGgs1ZG(JN optBy'`q!V@HSNY|BoHb=||^u $V uOC Ve_!3q((tAy.Ƚ*bb{MtHw$%ѳsNJ eTJJ1( ?@4D÷"# 6asGBA[* ^1Ud,xqQ2FJN NK)A.z"xsS-%z14<\4 Nlzjmŋߘ#YN%lCV!z1ZqJ/{y/Iq\lLx* (_ g̀| M "8Bi)-I'Q7g%\$|s8#wЄbq_8pA͡!^O+i8 !2B0&R+9Ύ@0^tZ# zbu!@vdB>#'5CE"..8ye$ *pI]zЛ&9mKBc0kIZȟOh i!1(3 anacORI'G~jHiޗ.HebUzFd9lB@#H OV ÷33Ii4,U@ȃ'H $@ҕN bZ`DŽPW #Qd!;unڮh!?V:ꪢpu|aՋ'a9Yd0KZr`c'# !ѱf`u ={8 Qr,Fu95qA&YnLsbY`eHdSfZKQ4¶G,jf 2ŋHe)rys.7!i0}-$0,_E :zZ002`m|flT7E* /T$1!PڙPFaYBj T=?e,ܽ6 9]4-.F7k\(Ao!3kzbMyE} ]F/aAow?2qԲDk'J]ˮWJh-W2qIxGuvZzpNxlY o⃾րzʷyZxW̃x l2o Lڅd\*L.)P)(?W8 Xȵ2ܷy6wJ2WěFu l2%q% "q|.p>;PTs<ٷJ\)umFg]-Dޞ..7sũɕk^HX)7Ÿ\L,38J QMM{h|`DUg~ _Sy-^/S-gzzqhNt]!vq:` =mpBS{"'!ȝGHD 'h߉_ko@ÁH2 '6YBꄱ~?@^ \8IIzg4'VҚ>gE̷%br1}̝9]?%KJDIRĩ% ȩk?B2⻄p } fV*4EPOf&Rhg[ e8K ;]b9n]|Kp e {FIqBK&I {sInekwy8vג̻XCDZd29cXq**ԈjAUN yw,MmI2oz!+k1``VXоȌQJ"{XH0,?5W%dGo<í`c6Rx5.$ I فgQ\] Z}h`R0A.DN~gT9ADD֊nX3ek$F?w,WȤ_Dݚu 0%Ԃ'" DRw?+q%.= [TIv7gN2ͤNQ#|%ɪ9>q"Z4zVFx"WS>``Fz}|2̗nk(趉+. T,!)#V48!#qoSz\R8\?]JoLb ;H'pjj+pO;1G"r ~7Cz; " sn/I#5D)\ ġ*+׶ &PevnV\b6M00WaٙBr?5[gmyl!lm;p څAf)qB&ܵ*h#TY{TP;Ka|C JB MLd~ǻ@DהtE#W$dZ EN/'΢[:PqH-.ZO?!:v߸C5 !Ύ,Zڨ: )}>=0ɼ+j$6r P\UBXHx!7xOVWMMA#3]ݎa'X$[HY1DCP*veCv CyuF]"ۯ5% .Cװ>ǰUt'V*j= ơ]6s9j Yh//s~=Ykt*RϖjOk_'S/"}Z/2cYhLX-/{NaJ%6!kƐ{&S 6aW@gt#bΗI qWUM'K{8r/}z/ݾ h@chYįAulH'5u_zd- H5 ~xa$v+tw'PQԡvP Љ^tgȡRg'B?A9$[XD]E@bM84n 5)1) 5T%) (1ʄ XB䰯EoHEJp?FJo>% {2ϔ(A78M\֤ "HI+(l\*R^"kPϗIzl CJb݋Xk6 Y {=q7`8k הRA^$(H (6 #8ghkK!:L5ZRtٽJjOQJwy73j)5> ?m>"fb'ņqd.5(I@31s66c-}Wy3Y^OWKk*z/Ԩl6K0jOW,m U_lBֵ5zKʩlV692sײd f[P룐{Ȝ4:01_ճڳe ҝ7@ǚ5{@!h6ڇ]+߳-Ĵd%S !Y -m>‚q ˽JqޮY71ܤKětn"NS3:5]öpד?2P ʨiFR) _:CVe 4 ބG>J%f7Am,\K@JTwKGxKWF5hY): TbIUܭP6Bl(blcүrtq@9Ք"̬b%N.BMkV`2I+\)ym+V'6#)ii&ؖ϶| yn7AʮRQn#APxu!$`<[Hʮk>*&*%DĜlrg%z29~HѰ'В8e꒍Gh^^3 p, tY { w,l7{5 s9R?f:-mHV/eS=ƻ_7P 14A.6"odEp+ o'l웉dp- -J'{h$ƚ|Cm7JgF/]>!Z8/tTAV6آrP@`HU,EG J-Ͽ܊7]',>j25faĬq,Ƣ'5 <ڡ.OdRGNe磂B!qҊf4U"oG=ۿ"Dz 9s"ٌd*T_"ފx‹$ŹaLYOM`UP뭐qD@:Z֡BLd/$ސUaB;׌' -AeAwQVHÓv%12K(hG$^8[u*M19~fr:3 F1vpwYCw*$F6p}Tjb YEњ1?>,fLX<H{dz&{;?/q(YYMp"fcH56A=1jwL FO6g7o] 퀒_ n Г$Iq`'Hg▸D&AQ9i=DWqc:EQ/W)~2EG9cBYͨh-74/-T> A;v֢]$4I="vL E١YP?jf#i+LQru+\m׭\^<6$~ qIpkQ$wmx44;W;d6y{N@]8VgkHml"gL*3vVˀM43qzM;9'$N.D? z݂}4ARQ޾Dˏ /׺T:( P3~AģTQ͜pt9_f-_nq4Iי1@Ls,%weN/Xp,IbNZq 7މg0D;[穬&mVI:pn$fZÉsc˛wBRgQ{F$ [Z`><:3ygIP[yb` ']% !g\J}ܿz>l7֦4U /*6=d@VQW> XhZ+%Ұ)_3Ǚ:(.E& ^X@wuyNڢ#ϊ$w?!KGIO2M*"˼yHGVz2smWQ3= RTj PKu0O]&Iz`Rusf6%X8ȇ34&x˫RUQ:>TIR[ćPpL0,mfꎾL]!ɋMYoUArG:9XwJ?vbkTM+.U;9DJ);߿p T0VBp0׈j%& οtDCc }6elrnja*?j*Ӧ@Mse_ a;S72ҐcPbxLpRUCx\0>%C+`N~,_Z{/'v#1_6W/MVҲJH) %YV/њg!@[,^ws\b0KtWePiٶ*J{Y7g_ckGL, ߔ϶cJ;7!(!R9سש/8!2=]u eVk#Ys53߉:>sb0/%ZYwse #O۪dلU S:RnxfTB:KBeHX6vZτ #bᅼua.j_D>Z 8fx8|bbXD'zfo۔~L=4n CÁC*e_a~.sTѭYy)hI5Mio%#c/gJxfMA= s&H=C23Q[Ay)z"TƊFhE"at9Awf!ܤf&aCώkC^rレHzei#HsǓ~0yb ZXklf4;2Ue'hfEt0V+eU -W%OjUzgn=Rl !N:PƐVʢ4Y8.:tkެ #,u=x$ Izyr*p,~7VKfcV{ Tm^t늉ˏQ*qv&p[PkW Mrl0`H&JfoYD7۷BR|F^>rQp*Ii51-͊(@@Z:0:*H3P&>Hλ!Awr'h#UYj4 8 i{_4.ݮF8\=lSoOҢoТ56i(|)(-@_Pw6W x~~ `[/t>FM:&ˬ:jL,uVz[z62/:̷I6 .>;<\WdfBTayDT0#jzag]d棃S#CC\yp_x'/]Cx]4b'7յ =b6=&pFR}lIqS=EJPB:>]/:zo%5#};x {pj TnXT, ~,kQ7ez11rI 1|YW3evvݞU2hrO:RHxNK0Qf"ѥ猈pkQʨ ˲JAC(Z<@/T͵VLqu4eBB?ܘ}w " fpw˙~Z*?agI[-Ig2JG) ]J|񽖒7^>QxBViX/%Zx>YsO;# w-)BpΉ}*k{pYbhhCyB8Jl_:Ul7E~ qWdOuNJ)pNkVD3qBn{p1ح=c]t:_R;%a;HP$k!gc "|CFL0. xg~%[M"[CLc6ORJDo3~F-Q Iji- so|дނΐVGb$?G.+d9|O^5mjfE'޴ <{sS{i&Ρ9cENeib;-v[wPMv IGU^*3i(7 ezw!%#|;zCJ^B+2ܾ?9k C.R9Cg*&3ؠ3V\?tnBQ"+5o'c@ 3x(,K9B.YΊg gXMNпʁ_i51N|t[sRV ̋"ʜxmedt %}-ZZNth =Bt3eϢ*6j PȈj=,7nJ!5aN7Lzt-t b'+撖N暧*OnYDI)jxQޥYl}'FИ$8kq\4 s%!ҧFTa Re%Fx1<)B  UQ va7#bIs((nրA!C#Zݫ{מ q1#M +KYQ(YG|x`ՍawĠy>]jDIw&ͼ>E)t57+oXsb t?|,A N09o'saI78[wΜMeT\iIh3¬s(\=mj=vkmeWNp4ʽ݌%N}\cRޜMPb2yXmyL Q QES殺2m->yү|kme}P$ՋI+?c-#mwb,fYbzV`+siN;J@:Y;Ʀ@wɎSE﹖\5YiQOtwQʳ_PU9 K΍WEiEOs7cV=uz+D{ *k#C7 lϡ+8>bB<< IdtXհ՚HW@\n&Z tsKk1ywsq0)rhen7]Dy֞yHp-Nj>u\B4ʬUzk{L$NڤY7> eoT% 3U?ID#O1{Hg| ݖgcj7]3gj%Xjb5ZbB#pu\X >OH؍nf$alIgw|JVO\ t!2MEM]ibxEt&"fkm]~ +_+$D0sp4B(XsdD=.->v餯s]I>ì"&Yg*FPr'# d_LJF1lfZej9B4RKB\s#qնc2ϣPb2q8N˹u7.|p|8%.nʯy}_>ĨYJ]!21ʪ w%DŅ&{!^9<QDattf3g]/2WwFT-J*I,jdC j"{@Q d!9pڸlk5t/sT1^r˅Y6jC 8-13dXyB%NmGJe,$MVl\Ƀi*m4۸Tu9Vi`\03wߞSq2y`i:))~GC6'S@y3Y*V[PtYG'2z{OоIk%߾IPm՜T2t`wD&05&* AT)IFagZ T3-–!γ@$350ahW: ,d!:KqaP19|) ZA^DSS{8a임{ƖT?o+KB''4숢r& /z~n#ۆ]z| ] W Y wQJ (t|:(UXHcT.m*~IyGS.|x23#*%\$;WIcp0fΑ*H~qo(Ӛof>iU '|F~}dGٚ@|&_~p+s/Jbl.rFJ$*8g>h~9]p%ttaUd jQG;Z׳D6Hq1M]m;ڑ4±~&m7QjCTl07}][?/vRb;L ]x~ĈLGgF?E4QfI}vlia,yx:;JUjWtKMe;0mFߡ%m*nμt"8SGOAj(q(7}ߪʧ,t$̧T옠Ƿ0AkfmKt8,&`CeJ0M!!}\p3[߆7APs-V'rg߁;SA1ہM,Eݍ4; =X=6-2P|f{g¨ؐCS`gyN3B98 bߤɣv'p̓̍ŋƞVt @=gyByS*XBv2~#FV9%ǶkI2EKڄ©2aeʎҜXε~(v Gymyg"3xF$lqҐCID桱+,Q=uޥ ~ͱo}fJiCGjQ :< 5f>RMB(  |.*g8:Ӥgel$:yi@l'XXu t FD.h3ݼOlpZj{|\Jy씶\Xp8c+<uKMyua>_rٙJ-HyoZ;GXw8cmIm-uHtؚI%ȊA\Q C6`}c4Njڤ]^ޕ"Er2ѾME3k/rP0])]GswFzOP |gr$dX}ȱ(W…b%6o$tPx'^!Szc 6ڄ !|t ħRV:Y!܈/NeO"2ޱUnwƥ5C7;_YqþTxg|DFֵϳR:u+!:BVXN=P;[:0)PǷ:5qWydD ^BX$|‰6<>N=6 *DGws\IM'3E[5cN~R@ߊkʐ%(|5A_جZ?t8PЌ'vj~Mڋ *Ãk 8=pShs[N~NqSl̍>S04pU?A?]3V9rZ{=_[")rZnP6;fõy5+%ᕌI~*~ǁP7rf؀_GpQHBya~S }jˋ /7?rSrBb ,_%aFHB+{1/+o sgc rPu;mV;.8QG^Q"i)BO*9¾(ʦĴa**ǒivn gL06Ev cJHJ**v1"b㦲`U~OGK /C mV"s (A:LUeWCNTQ53r爈#CNۆ!R Ae5e""udg 17'+K$JnU1 bC7DOVTiL@]{`2 ߲!?8{ղd3 \$yA.x8CA d$!0;֊OVL%)&9ҁ艫3)U 9B A8͊'cQZhΊXWŕRa&=GkM̷@ۤd`jp@LHg1u5O\eo%̀|ʻоTT ؕWqbq;x>'"*`+8r"[=Ԋ$:hey)LYshmb 34Kv YQ#y(jd:0,WԇP@N,6E=>2Q5ݟ/H^;v*0=[;d{5h?,STTЇbaAA|""E YB1ZȐ:N \ioRnM$JoH>1leץ:޻`SS yk^# 4drj:Hݎpz[zW .%Η5l/f<%'RWxOTKdi6^w qa*%\A2G0h~,@ׅJāNMKjV azaHVL䶆1..v(  (͵v-ob ,={82Y,l*DٱdZ -}'{]8m>OS U5)C?Yϡ*bZ_ URyٟ pwV[㔩ږڹnuAC P֭wV Np-Zs dbfa78 'r˗bX [>P"CW=+ꍼT@gfGD!t9cCq!p]Y.azNۧI˦ b'gW) Ugl`V >m iM%ҟjCGT.YU&-O6 9s)0AMg{7 U)YʺU\4`pVX"7`EV{տ"oa6u"p=iT9}Tz;N/v z! _"#oRv ,gAQ|t ,vPllWԼݴ ?h !:P0 ؂]AF8d\Ldr$o a{af@?D7< a\$ED.ȥ fRHR 8+Ŀ&~?EXb&oHJ.1F> d( KT AYqXVw--)r٧f/CLF*גHuoR)@\KV@y8Wª.*a/M‰ 'g'q,VL`%Lyi(@%&Ⱦ҂f>f mbdq 3I4.ce@8D30Ò|tÚD'ApZpg~  1i 6;qŀA6 `VU1^$XVZ$X!`xp-ܱ;P=\}>cYk Z~]apWP>+s:LA6a$M)+s kL3@WptێRg\AlsL.` ~Hz:ua9o._•du+H! Qߊ`p$ a!0b r(_M1.+Q{*>6@;9ނ#Olk0s0B%!~t(S^~Iee *Cܳ9 ,fuV3jn 28 NAтP8LZ|pۂ ;h#7=튠ˠzmhécN4/諢seTdH o,&Wk]Ib'֚fXL/̢U)|VY놋>+bu7og9>=k}Bh R8wUJam,{YK]N;Rgv%},ppS@ֶ$GuOi[G'StB$Vp"ͨyeSaSSޒunvHqb0vQ*: a6w,ɪ8Se.p^۱t;,شq980^^H0XnM~t U܈͑2W qlA̖䳺g6d7\D7#[^NYsyD@8Aƿ} endstream endobj 26 0 obj <>stream 4ӟLi1xգW^*" AH!=OGQ>\nzeFGqoq37G Fi)=ZoRkk qZ<*^!WeTsE`g%s æ2)rjDroh`g_ S7B+ DpdOTޭa|\T\fESEx ɁisO L~P%E)7v=(DDO ͼ+%jWb!+.s#3a\To|T&hU wmo,Bi| =0 'tJ?DD4"9%7p^4MD% Z)E7yj٧+RC,;X70%: -) |2TѠ%B72b!toem1)>TQhentrJTK'0{b2Ue.;VaQ.Ve\pi<6}0|DYN%Ez .CgJz23a5 k. J,+,"Ž=<+AumGC ynW"#Z VqF5AՍMBn.6 8״=4 KU>ۚCEt3[@@')rb2I8!5H0zp{pѡxe#>ں0 \pZBH~ͽ>s/}Gʼn< ro(mTQHbC!'a"m|x4熊ŏ|^1!gɄ;mGo4UC2vmQFA^/>6%M'{ dLvu$S_#INݳ(HRLx82gpBPg:a@c3p 83US9L՜_ߐsADOM@Hf\mx#Ɇx.>r:ez2L |WJyw!{m jY1t0/||.eSo.SaԖz bO$uC,\/{^4&hfz#d?"{i6հnt|jBTq;Vnd8Q594<눃kPhK"u/ax6dRE=)e1!hjYxBLK>8#OI TQyU84lUރan1G;_ȱx|qkz`w֕*>Tlg1^b{S1~ΦZ)I mF^=:tĘқ.Iۮ*IUY6D9'mq0VgF4&"~Lx qs|Wp ~,9-eνm7R;XGkbtd T֐״F_1b[X<7 o4Q5"ߦƇ9uuEn}]S}?Z~ێf$\r{~"rvቸz#]tu8H4NJ";;R~kbqK# DS7FMWLD]mH r#MB~xSR]m*x~juBB}SCGNkXZl>2i/DsadjKVmT׷yk=ip/w0+&B;mGNNI#Cr{H慯!jmlR/nVgO$̓yDMSf㗛M5drĽ45^=ѧWΒ_u<6>U/Q?.-7nm$X:.ͦbm؅ ^J%nÎOi|Eo>P:R.nn%Q[=@Ih_]hMsЙ"YI&n .ɹLJ,ΝZӧ'a"2G4. _ V3sVZP8TGK"$5yC#j +P0E ;L %Ϫ U <"geP=+n޳H :xYIn戥pݕ];b5 ܾQL`ȳMA[ᎅ\a%7; 1.luxMj cGFEo ZӵݼwO7nbu W XC՟!^ b6hA ?qgWYz ,oE~4`Xf32zz1d<w6L}xuHmd=%3dDJ^?gd{  WXI5o1Waiݱp{js6{ ÒҬ}!%6%sI3k٪7 Us7e`qJdhG% #dphs?@gҴ{45:w@@3_ a߹@{ f5~w+e{F^C(CK!+ؤ~2VUHPFs(YR`mKrɇ̳%l{ jElOZ(َ~)guȋz/IMOwfIJ3 PK;q-?Kh!fga}=a@W(N$)@SlƵ^CdUXjx#7 v{-?w`Z}a5r\/yD:n&<"Ju%739uP-˽͡Ӝ[y" 31ja b M;"vm7XC--ݒm=(g Wbj^R{t78nQ)R ɥs Lܚi%DgMEW4Ѕz XK<|kGbOv`ȗ=c旒_/@ߎ* y{{Dw_q.''X8DRI'YglN{hYyug~ZZ|z-oY=$Z])MhC@ɹjU;FN~3hD⵮0#)kaӏV@6LGU6&*@FIqUyiL~*/>v iS1φd- j2s[0x^_7\8  FƸ뤐j+!h{:=ɯ!M :) a̡/`lԲ{[ m[_T՗jExu5bV5+΄Ê&n8s~s^d1ǞZ]9v7LUY. e:3{E9cQSa~&jFu)|ygL7bNfUѨ%O_ə-l1K~J[mjm/gߛ~kFA/L{)}P:ze!᛹$c (_@R`s j1HL&Oi17f6$Įۇ]l`Z~xܤa`ƜoփdηH|6bslP.ִծޫ˳!M{#|->coؠxh١mbL :-)P`n U^,wE0Y hFCN_Ds#Zps:݇a͡47Z/tFD }{vG_zmÃ6ѕ/mxVNg0 {+d@K7<]Nzn<. 61;8]nY 3ȳ7l g8Z97s>ϵRfހT7*_ .g=:zgؙ/߽8U3QVM=5I^.$',*7jQsUB0%#C׺쥖L1)DR\BT4 5)eӾS6W^K! viR )a[UրԧeԮx^pC|2-֥T6y)&kfXK[-cywVӊHRFC4+Q^WP풛B[6CV@*dޘB[PB߽C9_k+d<|CG- پcnQȏhweXS39ʹi8ҍez)4֗gW)40 3O aj.smitclk[gUؙ5nhW($-Ձ:Zul c:'az1ҕ:),f3^W\RjBk2IYXKlFRMZ>reV=w͇e/dGy5ܒ/7V4z5hrj"ϒ1PRʟ(J7γ GSۦ3߂ME㊩~ 0SPl nZAA:JaY u%xI譆l93j$_<6tӷʰ Li s4y0LvD[!r9WNzӰڭ峆w}4̀qǐ*P0_Wwcڞ}?{ ǧzZ*su: !7!oks%uL-evtl!<6K꒯@N*B̟Bs-3}3NbTxFB)vf/BLݧKP)q;f9 vҏ6f[4ǸD*x٤}ȫۇZ-JN-z/'YZQ!92KrTj3㜭vՙ΅5#@"5C! cXV km׿%h~Ӽ^ -ۚPBY}|A4&wu4K߮\Z cPY7/]CnhooЏ^ȀnMF1-Y >{s"-kipGF0i<9N^@{]]s(9'}5 >q b55Z޸0I7jƍ~[DZ]%?NJ-24OUHw1BgV5 ¬nK@q{BR5@W*MO;~3#}]Boū= "ygiWU FJʬK(/] wMV+Qyc6Aw=mu4ʯѳrz{zP~Ւ(*<ݠz'IT2ųCɳ2}x4M/dMw`_џ:$P`2 8鹍fSTc o GгX(n&MsEUQFlk4 tMcN_˞ ߀<HjYrȇ[bF:TA VJȏl?u4OBA  ,,px >I9)2 1^k$o3 QyER:SNr0X_~1sw#}&xQjO}喒W [1NSHс~y=4lw*"hfcTָCiP}i8.If:eat{u% yF]]zb'Vܠ(kĤUHX53=+yCGU|6~ik/29~F:&TQrFCa7b2 ,ϗ.TkjƐLHb* B~D'Ǐ`8n̻$ ܑbfMϼy&rNki#ҴCa\W\^'X5!1{Ed PTe,O^,3u! z 6dcyǭ?;C_vC+L`_:'`M#2ʑRϓ9tkZJfy*)_pA[d. ,^\uyǃb]ҽn:xX,+!ؙp\)721_V>kn*Y"'}23i* !AP YL0Yi e5j!YJyjh3-yؑg%D'b(YLC]1[;BbW eT{-TW( pPrB =Zut{@6t#U;TQw2O~PL`qHyTiQkاT˴{NK T!LheːҺJX7$19`v$+&4Ϸ'2cʽN %w<_1hNXH8y8(y }_)'j,2sp ;%OҰL;tϟ2ovCGۭ[! rf6DIY-t )r:` =`=09S^~-uGDSﲰ./>oo)ܤli&,qiLSP]lMgϦޞQ`fE-Kϗ8?uu=eTl p޽JET eೈ5@c$[5@L5$TV3k$@U(@oOS-屩19X-PrBQɚ^Rh2U7.J*$f)gsp?ںоLUI jn~3VEſNs *4KN9cݬncӕiԫVxv%$sFקAcN8y=4ki?7Oi 6P}J@6eonz(>kVaߐROȱm"[@2|\A$Y/|[Dz2R;Ԏ|@ J_R*/s U&m`lrS8lUC ~)7< w@{7]f<g;Tް= T= LɅKM=-_VQ25v)aD#vǾ![r KDèf1g}9, ?Ż4Ιqfj)=iWW?}kJ_gxbaCw}T?*ٶڞB㌴ ڡA{՟)9ޮJ'u2&>nE s(V?VlSS үzϗΏ  ̑ow|BfE2f>>3E\2˜wu(X~m6|<OGwmw>r6g,]4P2z+=|`RIVL6(¹g,uhc}\M67Gyra%ƲDO$C~IЬ$7'  aֺ:ŷ[w%2mn6u*M>zwtA6tA A&ul$t7? bʛ%&|Gfق9=Qv(v}k"{]ңJ.]iDU*,擋|Lo>zvTCzwyͰ[(%OQ- OMX.{zl.\>W8LO laSi{t|{L~4X/.41~`:iL3|In~9 T>Ra>q<7Tk\5wSӗD ԙ;{8wej\wڅ?O [8W+?S*W|!'$MZ6*JXv*;7 JGn8W,oZ5@hun*9EdtAyO,䆛'އq92V')x[剿zJnZN.&V'_?œ]:q #)ŞIc /ꩉ']OfJ>(#Vtw)yj}>It_b 3`_>%G m~Qw Kzwio9M{GKoOOUa4Ѯ0M"iN~ ~>:~{G}z]]2^iog#BBKz:"m?㷶'`/jHoupe'[F|uFE~J{@(Or_(1IH3F]+@cJu%~NSLyRM|?R)xS܀H=gzBx~۞j_?_`)]j;&vȔ\s r[|LnCW:Ӽ땮T:}帮4QIutD\2Wu 54֡ n1^"{ 7mn8%-vOx.[UMb4g"3mebdO"2-IĆ5VpgIiAHd IE.n$TwNj(NbHF] CE&ؕ}<Eei:0=kV:^d8ࡗV`AD$~oᯖ}wY2l"yTh$hN~6f/\uͲA,h<NRD#JtM6^d؋Y}-D(b@#"!8B}%R_THGPt}Cӧ8BOܟ Lѽcu~3 r#E>ˊlƽw;YE%A[Iܸb1ȶƭ^a_kvƭkY6OmDKZu.h,} N}4`z8iX]yϚ{z~C;L5V^sqkۗgA8cVL+:Ș,`w}>> }<8nBm>pfcԼUBQQ>_]pzJ}tQ`VZE6ce:w;thZDz`dm8d62NLCb%kJS So-%*z6ѲܾL,wB:Olk955#0~ ,xF4ߚGvCf1ZC$[쇤F9tɢ3>6PWY0pS'sk ='QY]:m)ˏ+{aZ8Mɶ麳.5 9tce=Mڇ>.2u:]O.88ǯo??|ӟ7?/'\lͥmӂ !+UujG < r_>P 8c5X,#ծH] I IV-mӂ~3I]9B[kos ! Czl%]1gc[pD!?tm>7ES;%-p؀"9@9y*$C|&tͣM{ nCj ڳ+Ԏe6.,x fP~`u\m] cowYDq-X}ui(HL z튾`onSQq7[FA)$E>|f=l/ 3hzz5~dډjfӱDڢ`WEvP腂R;VvbeCoz>HخK.J;:gi{}c@AZ$ ^A̵ B6 Scv/tnfN1W SMB{;硊ñ]Q]sZyZβiGNT۴͊CThFִ f"* `oY8lJ5^ts]*ٱ<;; dk&74Ii\Pde&&b1Yv!K0(!:,`,0jo׌*Լkn~#K,קXր/(,;C m%2x@͘2n{VG3]ۋ}LW2x@PCdj6`]v"d#7b  /cb].v#'7>df|@CլEb4eX%㔪 co rv[K6cc@L%iR`MԮ&4^4핤1p^0֦}>>ec@wv1csIOAG)F_} 钫tMhBS%3QW\.YXT5dt}2k#d㵗yk6kwJ{=K/rvǴf; r"jHfu=<>gt`-q?6{KYrydO.HZX$ɪU (wn.'źP|boQ$i*wU)u~mTquN<ݮ5%8[ot8EBͫoC5Fd"DfH;mH]yGj?DZZ¤C"D=DMmŚqBS^liF_7g1 _^uePKvS0.,JbL6r|5*.íԬ pRcܜ!x7]E5 IFr|fי$y,W2$˕f"`f)R"?CÈONc[ⲑ`Mͳ/޵LQ2~Au"6yHht]Ɯ̲K >vJsZj>M8x5vjR}-S'H:!rv6Z=W\F6_qPCPw"IɰT" I.&acv#V+s`QMLOxeI_`X)Ojze2a^3m7}Ĭye߼ty!E+# )^YK1^PʔzeS=Mi(%e֥xd];YvY>|kmCWtV3J\';yFdEψ*uz og]kze۽2{#+ ,ؚPN!_DU :bD<)&:؂Zl%؃%m \EIyl;M&4)Yby%iQWk#T qtb%*(b/4Ho c`%uH^lbܙp9 ,|pc4CO ]a#XBjw!] F_ Cvw70GS~M$u`O?=oױ>1u^hˌ7Óq St`C |K󡦥>"0Z& |8aġ#6VW(ƌjHPlkGRY;zБ%r!/w`V}ү@WʀaVޱ8FB&y-YU,!.YmPƫKum'z]S/{ GZȔ,&mYTsDtd*B3۫WG\K>o9WzPx0W#ÆNBN҃Ƭ1N18wJy:UH/%UR2j=@{<7x<ύW[oC X;UH c'C麗Ӆ~Yڶyt*yG"97U^o5K͢j+[F 6Wx6(X 8G/Un+#3e) 2C OY\&"7E"ػj\į&f=baGUǶCMkqTe@s0q1ԛl΂ęrA[ް~WW*+Ka.`I ٽ`.= .ZH *~o$ˌ`lVA{D%F$7--;Hdq_Mj8rJDKi\ X 6MCQo&$*\-/*~VD-Vp[0@ֻ |@#[ЁIا|Eq$B7- n "neD o>?5wJTPnMT"F9Y(pe /,#ZKx|q'gfQ?{⯴gOHĂ )X Tפve Zgu2{#܏qT"D`wx;m Uh;C#,9EFaw)Uv4n]%(~w۪m$xQ?RŃhFz7ڸ"lr`A4 }QՇ10l\z2^ Ә%hV@8) UXͧ [şTM9.*!o\؄EvkI6.l.B[n3w557qmEHo蕢7}%M6Y+ceb@3SH^sPLzoa~$B!Hgۼ;OrqSc 2IY& joM94Isha^׆)=֒c'ָdwN}9"Zs&8+^>8U㘦aE"Qx#b>\%Ϳ1NpJ*Fk[HX]<#9c֞n鷘#afV$f*zͺDj RҳUA"Ȅ;;Q y?6 Ļ+R" ZEQ\&@ @*=B '~ϩw6nӭLv2F̀"OUZ;g;`!lwbVM\roa%Oڔ7#xv|H0K٨@q9>0, Itk(YI"`|MBFV]j2 ὅa+ԅ {(鬧l(NhKe+3q@ ;@53E?2ƕlj⚎pB))sb24 Pg$$mlд* XEƸ o<6ޕHb\_5ju#uT.Nnda,rY0 ' TPߤrύv)D'8N&DfEC`E۳S[",4ADNj#=?k!;7N$٥;U(Lg(8= ^}%vTzkloALkÂ}gӃɒ=LI2~+P=߲_]cq"nXqWh}sEt$>%6xxz`yL([5 0ȀY,xG&16>%gzRSd'SA[\mXKBnswZYJ7"%ҋdhzq2˼g[`g A,υKH=(txZe`^ j!YEvA( 3<0"NaQLe%6 .Hts~֥HH "J'f@ƺD!(4`d! -OME滔ucnY7Y='??o> &ҫfV "rU'5roɒ|H#R6CG.%R:a7nf6tH̞oN܆Y@ie5yue3W!PļX+էt,G.Ѣb|HK=S4;SU4I֍z&`ܪy OP+??o~{ze;߿~~?|w??ӱ8o?$|E/?~ӟ~_͂pyC_ ʊ?O_SxߞwyW64c9@fb Wx˙E?B[z\~GO~WfzzMCpb$X|a!U>%BX蓉 >vگ>v|>^}{<~~doo믿~[\|Nj̮_bIJOc]:v}uTkuΣyLtGae;=|<߾}?n_a]l2?R%ǭT} J& \x <ۯ9-m8FvoD% u(i(M,R=oέ_gbbHzD骢СDM(&"J;&0o*]asdEJ2 Rp4{ŀF~o'g_Vdv;3fǥ7tffDM 0 Ϸt̰A{Y.)iJV$:gbmCYUMu唒ygZ5tcWBBFO(#vU:ح,&}H6]W3tEՊ'Ъޛ;LJ욌ӹ}K N/M`dB_ټYBEVUTVA*TMk,کEdBEB'#i 5Gu5U :`|;1JгbL؜r!<%`4,N>EV#]sEZeU'TSUKl%SBELSfqeT& tRDҺ~42gGd@68ss]lLU#UDӓQTb[ Dd!Lbw_2M"YXz2(eQ-y廅[r »oˣնA~c欜.lyޙ":7_` ~:ԾXfŇ3f{aeJ@ThѰ=ՙ>zJR9sT)h)Ǭ}CAX@x534HU`3eK'^q-r!`~]`];QMK?O[Uvwu3=ܴg>ԭ)oK#*oD\UuQ4 Q*Z:c+7 gξ 6"cAi}&>$jN,CѲ|ސuHĘ_PNQ9ĺyLU'23Fff>4%ڸ6_BPQK0#iYE -چ<"9Cۆ'‡G7Kubu<_Vҷ8*cVG@ӷLG(*1tY}x6* U|33D}ՆGǧ e{.<˸>mɜ:.\^Ukhs!'|$%K4F i!b6*ExC!)PmV؏tB#25JaX(]'6229M5^iqP2]ZP EiUÐu1YXZN嗤XI='7UsP(䩙f,,X+7ixЄ9Ү1s>R-dP'困.۬Kq$~ʮݛIVzVD'aqpq9X&̀#&zgS)myL ɪ]i'6[ib!'ba|2 d..49e âlcT 0ao+ n5vc/L],cv .΃c'싸]G>q;Fnf3e_\2F3t¬4KW]#MOZXnO)*&4Nѷa+H@׻PDo{Q9'y2 0X`&f̾g$E&m^O]l&Hqdhu隞ۢ#x'/,F],آI$;OmjĘݭ=Go] uI|?m?߷Ӗx>y[ƞ>].qoGZji:kܽޙR6QHcwA3:<b{vO q(*9-1<47SOҎN\Fċ)dkr/ }"!JN OU*=L ռ+liA2 9x\%eخ5àu] 'ˆylO=h}"Z 7V5w|=V°HFP`y}Ec\.0Δy0IZT7,i:eI*$EQ& ~t,mU9-#]Fې7ӫ_@m}_TD i"K4@Ӯ:^.Bai߸S!x0L6SV I +nҭ_›zV$dA_7c4v woE޾ӣhc3!psN[\o1=gS;̧`i@-)tz evsEɩg2uw?MĢC y+I6u<{?;I| oj9l׫jhSOsew óu2&7ڬp,3eF8xvΣE 'Aá)?s=vgGG@N;h/tsǣry*y)QƒVD<ʝ$*.Muk<#uكZ{{ w+l=a`<[γuz^Yg3l'? l_ `\Q' o)Ȍ1'@#kd81&bL)4@m<(~!%'Mc_>k'ί޷et:f0u|xkvc$UMLdoM-u>_Cs^r'^5ƚOE˃]:ޅ)TmZT(d+ȝ4Uz Q>B.q.,Z-K/#>:CU`{3VV> %RЖ0vX e=Ex`1HV7>5{ tH^X|{ʵx5C ,c&b<[U;Jg4 E]ӥv`WxOrq HQ <@&gz8-RPñHY6b Vm9!S8}D )N2v|@>MJioRB 6A\=ч!z#T+'huTԎ)DI2%P}ZbKrnNozZ+WuoӃ7 &z+VFN*)~PN=-vcT4 45=Ec5K?+@+jrTo.#}Ytv ntf $KUa{ec͓)PExXJi,OͫMج4 Du? *LM ±}5Sꑨ6YN-%r̘X0c P_E?A,FCFFѥE";C_1 W!ah)`ΈYúcŠfu;9Co@p@x z[ݧC_!0;AWP9ûCZU1;I6Ԏ2-(GQK" iQTAMFrJlZLM*g%,65-}ag)}eyF{xb<gV43S+sG#8@[NeIVMx#ݵGLH r^ƔKw/K]衤sm3-fu<+ެikmg$IKTN#TzmS'*yՠ#Bc1vMx-٢`{'L_tZ8^ӵPwbmGYj)cMR),ȝ)6;mrʥhlo~3&2)zoUMiQ0[[g,s%J]Ro$V㛬fbWn#+j#k U|kRųUdtFNADZ^ ԭ~{82L| ufQMʈ?G"sVed57&b(lEaC43 dм|svb&E,K"[Riۆ+8B2VyVl8T?2v7=v2GOރk`1|f* 3P"3:p诸<)J0g+wp>DC9=9:`X݌m/ ;cfߐ7=n7Wk?+>.ţvQ7nmr;OёKB8]+voNHr!]٦/ZK4U#1@ݗ f.:o#˥Fp}7=F~>p~x6T2Mcm`Gytg'w׿"c2N]<^J@=+ХkHG"?ĆMa0'0_[Ɵ g"X8M"9&|v0vد-,S8E}:vxʨU|?FR/Q!3ёrl4-xHêtc_]/bp4E+4Qa|suڳ'D\IdP= UL֣awV&v Ms kJfjֲZ0 ة+ \@0 KF*58L*@vPVquP_Hh"Nƞt)]1Yzj:sހ'\ FTH*]629qQHm6#C#C?y !,*͜!M6<@&}8_d\U`e&O]CQKvЂ}e(gZR %Y:C)ʜ͛鐎³ՄE0 šۑ@q( H am癷*겭 Qh{X+PUlNr'7m;{9Kk4sYszd" |ޡk0FVNJвX;9r w͎46JxԽC1E?= mYUU Q \j骂A'L NJQz#B4aF= %3G;%.N \>c$UWjVΪ5i c( ̤΢XCKՂz͢Ĩ `M!Е=p*-t{G~zf,`hng2z-qڢet>h+;0fesHV8̷`|n*nHo%sg(SYUErP%/A@"p|żU2UV|ey!W%X>+׉EZ 쐑x\>^9cH@nL;C UlvQ=E䯐kqL#.Qf CLZ} *TM +cw#J, %b U_}zс,! w׉*02G# ȓV u.|#p{;:q{i?Hd2C?*n3bӎBiVYAK:K{zr2 5)C@]A-㱕YVӛ+GYB1Thn)ПqBv1jC'.J D )| qxțJSSU1WҐs9x߸yŻ0^&+GGJU p7\Q˗ /M ɯAwklZ:pj{PRфZS}u-vՠv=}ݲf`v-?epVE/r6U.qǤ:w; mVBҶF1%f#B|*#Y#檊{'g A<GD.doO3 Tǹc(³6BLBxe-G7@"Pņq\Bdo]EzG/\2 QðO"Ro">B6L_|:P{ZuFV K`_:LS FJ~ٕ@_z]oڜDJ *Fd:4V kMgpח^ўp ԃNr~UCwrg,Hbp5T rK^lqCU_ QfJ/Y*u#²(aOGޅƻ8*dfe6`!\! I̎9XvDg1Zr L-"țYzc%=" ~ͲA(mSs`I sbd $,X$6!{$'$ "5PKliVosZll )@n&c~kM|n` * PW&Psy H^}0 U֋Z`=Q";p}lkVk# \̲cKDjeUE-vfY^,D^@dv+2^ŘjbEsx&L^@ CE(=",uNz!S7#o7å_8ao]Z3OekC&"ޢdag3E}T򜷨M&jS6zƲTտB . iYǖAJ7.8݅"[E5MZ|.Bw!D[2f7}?xhBe]DFְE~Y"f09x>X3}jZ*B X"1-OZf{R^|yU7%7_S OyTGLV`*[kCpEmRb 3{&7*&ݓ~ˮarX Q f|Ӑ1= 'g3[)p\񴬶.lY*'+ok>g*g3d̓rJ"kDr8-܂6QYՆa:u&(\JrPYA_|I:)6Cxj;%b/ `7B1M6 L-ܧ:~9zŖjvF^}uP&qfR7rIZ ߆JA{nѫIߋTAOx8 1YJPa.4Lk' ')8,E龫qxJiOJVxCL .+t#Ï&O=dJ!ϋ!lZ0py%w Xg46%Gd&U]tWz&*v"s^&k A0[&p/G Fv E$s *uNB3MQ_"|ѥ~OpQdPƆ? 2x!9"@Rf1 # ZɏYl>ZA14򂀴W_ce~ERh$ ٞqVw!,(v(P낍_Oe;W`_}B{jz 4!"0:xO]ԩ/I3}EQ~aRH]@L OX6.q"CbV(Vu B?*RTM6Lg]B  $Gg[TiZBCb&'v)+zW>3 &oL̨"=Xce){X=VCy[܌kޭmD3A_ɤri&Ute d@,q |8یb;CG1 Tڬst0HVx"`Og<!PUIUPo[ ~!UX"zyfnI|πO,RBw}E(MS Mva 2WZЊ%Y6l '"B1]B_AzK4/|r bJ,Cw؃SR3?B@4M6w=>f?t3[f~(-LIBuX5y.ƬXiߣE5*N(R7l¤J. twŘv㓏o"ćS 5Uf~Df ޙmjgGEHM`}#iKG0[*Fad#;ibmBTPT/?Rª&ob]\&6RB/}!/S`He A-whUB7]k)~RNWj)#W%n n}oچý{m^=ow==8B/~gy>yΌÌ~}8/G΃GrH{x`=M76NvpS;T߆-w~oS}z.:߽{^nmOӌIEfDwߌy9"E^g=,y2"3~3K|zoE>h-{Yh}FݗL|g|0@Ʈ%>7-{ |49_f7G-ӗx/SBO5qH_7k~H/[3+K<_}ekcf\ﵨ?w<_}ȇ7_՘N..\'w I;5|^/uuzK6| v/t(u~eo_CmNǟӟ.ޜw( YyaVyì9wJ 1*]Ť[ߌHuI,Dmam q)ܲF-T#(Z JIIwhB>Y"ۧ% s3LڟŪMf{6/qyY'm;w`LMKxL,ry񹋗P`M@’\p|*IV T>-X-l|Mꁄ-DZ~;cj#f >*dLq/!R^OK/\[x j2tXi#~?T΃m<@em-I v&Hꯅg?#="]Le4#7:mW;SϠTW}6U]˕6M.C裩>>DˌsnVA"Ejbav ǸT++5FIy4SH@(ۡJ,NXtiF Yn3rzX*) n!%D`s0z%*xGI`VⱤ,UA?hsddzޭ;|6ř"j M}Zd6K6)7%}&OQ6qi&k->EδczυpP;ݥ QD1HI0 RF )BL"[Aha֒g[sjnyԁ3#/1]NV61i"򊈴2Q(Lv,l{D%ivf SWxL.cTLs;ԩg[;^t=6X]d۞H&.[g@obY:8 .L$%NjߦZh45ѝ"W-4e H㉀O6~PSa Cgl&b~{,ۓ\:@FB,SBxt+Lq:Xg` 0UwusJ`,(Ίe,.P?n*ݤLľ ph?ߴmv*-hICpߏvl~YHV;kgcYI:&@HE(E9,bBDZB(R>y |U@'n pqp߁-t:A55ZqD"gb7:3,8M\(`vJmUBVM!$&^wm2Qg"coQlhXo\Z JG-v+ݮ FWlO07 uv/73, Zb B 3 һd87 kʞF543th=[odfnEG⟄ɂAWeևgil2Mv4pgm~YHBCN[ɇpl,n]zYc3OWLZ=Pj DwgҭIϭsX3K;|7Y|"y&4j VθH=|KSĸI}3+>yY8(wdD#2 uv-nQ >>,=7y)nѱ.D5uQ{w&֨3 U.YY:ⱣN5pUp)d=+ J`{ ^v*Mņ(XT2OyBa7qK*_G)Et(N=fvE@+j/$xjA>l@x"P[pv/xbܖF;Ft{DWG3M"YQ99xf!C7%5sAI)Ƒ3aNb.U¤KaN$\8Thl7nȳ4Cw#eYQNO~7E'šLfXa>7Q跽?>:Q<4 ˼V7+.haQ+NI#fxU h!+xZ7u5qMxR^{Xvss pRTGC| IIB v#"nOVq$ 끗6ix H~n8Os_Uj>eòUENP]`<5 ;3m57 k%UG,؋$qK+41 :PXNAV YfO5 XЪNn$y<[hHEBRhfՌߏ|oMe|ãQ8tf͛ d.ɌAk=}% Ys[%6X 1C1j@Ĥ-8J)Bn~3r^Fz'.Yn]KFQb?ZU-VEXHooɌ 0z]QlIJdOt0tPh з81}ٱEcUf- |q~ 3h.҆Rd\2ܫz фoTKD>& \{ESHJRU7/ҼY'y&?% xRZ)F i$n!ZtBM"n(}Z(g/Q6?nLՌ@=fc>KZSEzO K,K*3?Po7 #XᘛjM]#duxY!">MpC}A2rPT%IR,A꓀/b51rŒVZ뙍՟x TܙOl,TMefbBOx@\[z*q\cc5X>,ɱ'k{" d V\F!lVJy =:є\XbfPyوw >IzAJ_n*X[=(e2XCCO2@#D0+j*!#)ǂ١wRe%f1LBY@{/WM 8LgAb0-3Ag[hC*y^2G#xDheBczsR*TmWM BfVMh-`ʝa=Q*bwqbSrR3\oi+SKlNJ&j+,Eu+JlV_(2Z'%&19.[ V5P[}kdg}CRie uqY NILbYX6DbKeGH!䖒©/*ErS\T1fDbt%j69,t4+M#LLΉYj$WiL*k'X\b>wSH'*"XB"8PuZ`X!+d y8TF&k*G% Bu¾(m,1n]?M]0bW:'X()'.` BZEM"0j'{1&-B< 9nfU;b- N@vKK#[TJR ~HPA~bY# ],YΨM,Ϛ [[*\Dc2iꛭ[(h0'3a1v:BhXB:[PE7"V쵩lAJPI )pBƖeY6W5ЖExG/񡤽fIr K FI2۰u7fs &=P"Q4OK3,S}GN2rUh5q gl3 vKIܚV 3n/48X ,ea .7WԲ4} V|R -JdQn@p#]Z}˒UC4fQLԪd>:M] A%MMҘ3}s.إo7׆ŕL bT# !a-BYH{ 6=qEEo,S72E#0Y=7e8?t:x#MV'zUcg*Zaɕy_)c?OħMa<{&Eƨob*3h`C'W(v`MB6㶍8 fܭJ!q@`Rۼ(/]XaʽPZ '*ArX0JTg N$.=͒\Z[?V!v]d?w~1d8tzH:rMSѫ)Iۢ?I$!2j%8 SK,lό}ż#ᢢOxhثл\}aza*[gfD//ü ZtREUo. S ''=*]b}$R*Ml5N⠲I,\lMZWXC&+YUdF|0UBmT}H*K~Yzf'z2EmqXDY,@لOQv`SDPUVCEm@eQ\@P%]\Zs@G k uTr-~<Xմwz*Nk\T&|(CClY%$P;Wؔɓ,=4tI47qJnM,'+];M%jЈUeр ĹD*kL WnlNP:ye<;NsҭKc4ﭭnm\, U46*+cnWDᤛ&MWQu1W@5+D0Jo}( BҩaO ׊H@ a@|HT|ŮIG4Ca*[xȌ%C\K5RbMĆ7~eWel'͋ͻd\#9DJH S)fxdž.+2Iz"#yZi;/Urb+pMLN {ؚc/l;a$tC;aejp٧!R_F0b- &(5&TlL2WYz'tFN/B HI/AIwFښBG 1MSL) -'a.j(˻GZz MtF̢5Cc(=:hP, y;ގ>1mؾI0dV,LdYƱ \r)@))r3 6CL8uͥ}")FX*H(&;('T#\*d U@ ejP#vB^j_;B+`߰dxD̫S,ޑҢeKAzƙ}y "L+@-bL;`YpwEK9om%0vʢ,cDJՁBm.|o{I)F=s//-_H6iyLx(73٩/R'M IH+13 qIq$H F"p4' M,u~x"ɕ.IMm7(F[b) Kqb; xqHM8e(T?l*“RF" Y$1Wo^ϫ.|WmQd#$/-?ȭJ žC!ɂcC)C29zpʑ ,*eΑT8 eq;m:im} cٙi)]]sq ˚mns #-B5;tT 3^"`K=]sك)MŞjff_b9.vy1T\3m!#^GݩHj̥qk9>ScOlZ2K]9VLv2waJK Љ>GcROHRVt02RwLim)UJݬeH'.|[@+N AѕJg22+Uؖe?⠊OwYqWV9%_SqzUosL?nM=LP\RB'=sUsܤ HUheUKv*`bb/kXIb$IҨ)WD`TRA]I@#ӇG`cG1Rʠ)) (e]ND&MBLc  vT?c[eqY Ėz`W(|VJ,.QgAܽE/s:}&`Y吀.yJin1qf @,0YtQr@fyOI;UeVn惣\O6LV:J&9z }&!e3z RЃAmQ\7\̑ؓXt>E\{QE9 L͆= (RfCaHHEDR\ ky[B\ *f8_A^k&a](ZrLmpbYô4"aV?&)b[5J: hl7W*JC'W*FKaDLto`25FkP = &R &n0]rl`HedI #!ЁGB#Rc UȅѨ:F` '!2@.]L?rL,(xiGaos&` rZ!U E>EASu.8va§B$!lW ^i!bM% D姸kQv J,1'}%K1Ȳ-gc c!/+x>0D+a !IP#Qo+HHQs n#XsD=KG|)sqXK‰O6!}\jBźO(2& )`~n"+tK$EYO-mv tS:dMpD,p)O%S>t1:Z[-ωi@&+EBi$pI׶ ͭbFc:d$8y.ٞ) h7 2qyij ` ύXlsI 7"BmZmSU"'%x_\U!V Aؚ,{R( i=%2"aO,q&'#Ylp$9 7Uؿ&TGe0Jg+CSP4Ћt@h#cs "W*baZ$mdRdx' J#y7YV8ݼx=Ô&ѹ"[[3 ly[ig8ov)RܜY{P@ Qx.fjf&@3",K,Fsh/6 YjVCF}H ͪn:q5ybDI(0cG)K\c5!R)qRCi*SEl*I`D[{v"1A̺>q ͔u1 vj HFW=k/ 2os*2Sv9.Iv.N`` !P6$;aE`VUe/ ^KXC#dBF*.q%F)0D)B:mr-(?&RR4Qs BF*AN c\+ HODjJi̘3Yl,if?7ʅF G.>MQqNS^x=}T#%REO FB)dƹB*6NK\'=aoK(S~a*ZSa#ӤP>:iaA:"Ñ'j5veU蹰9k1oQ }3xY&ԮHw'(0}zH"z,Ɇq +Ibzb,1,ђ AOoҋd4{ʒ@іEg:|,luMk͕ T򐺮wp^|L]C;`c#DX[b^Gf m*aL[ "y)fU3lme!@^ LK8RO^\l gYb@=!X5uPkM,"l86 A׍a0Ӯ]l7vr^ KCee%x'xXq`P2F*UN[R=B^,lk*ž%)"!2Y^7ր`xD/l$NO/ّ}41;h`" \: `^hvs1Oܑ͓#ڎ|έ]`fdt[ו: Țʯˏö 2W\VBq( $k/TW$' 'dM~̙YHb€yF PX|DB'@2Ƕ"10JM0O2|Ehk֜)DP ]V4x[㉑kKI촓bݾlez>s0,P2P. Ht=ari)H!#/e7j1'PKJ.#YjNb[WTuΡBRh* h0|qba~lc}n%VnHpC-i!VVp`$w1 1@1(@0_7Y'%Ci{oͭObN1'i%Q[yj:"U"Qj^dOwRȎF幔߲hj 4d@`u >7jHT)H$dz~j#J _9aGBr`зGp $ VU|5@l`?0 e9_k 4Hd-!iWV<ȟOerSYɒqfj[a@ L pDTsO^A$P]7ꂒ6g |}ԖK=Gΐ IPKvO QrSC8p,#! BbR,ivn娀ldDPZ K/@hlO yLH4 #"tpOJ sK-O!\d:<"*rĄ#y͊mB~X~7hZR^h aFV=; pAYc%DFm.U|ƐgC銒I3iRU2QqeR)'Z#hf\d)2-[oس76,()nӴ@@V u!rw@f+M>Nvľ"IeBE1?JM3POtAS*yF(}dz:7%%HZZZ ؠ#4DaaG_1Ĝ?΂f2iR j[ZJ5j)KIe4xTe\NaA pC nE+Lk[1s7em~E&\tq!D錠"R:(j ?WD4`CÖ ]nBcv4fiJI,$wPR"HN3!0Дsv}6HRT@𪻿ˀsS T<`D"afkKR*%V2YĬZy_6 Ua?؈ȌMS^U41R~.n¶SL.Z|2$l8? ]LoA9 ;K~+; Y{`TKRSl/` +fd#ۉ8TK2 QSl_)%G>D Q2G;%Nn㓻X3"߲ DiGŐt5B<0OTkN&1U)IKHS1]W y\2!bnjAu~3yx,|qd)7t8H~nfSMA,ǥQ<(A %]M9* F:B䕙bٙ 9`}$ECxUna!İ&2fKZ΍}5bfJkOҴp0$h6,,"yɴVR ?KCR6L ^QK{(yQ }CmC7u!{LUaKuU"qр9T+, 2Q;7̆pj*UHCeNW셰^˞&REXDæd{JX՞/F쭶*RSJ6/bi^B΋\F^쁫sEX=!V9.X)1/-fIŝKjs-%S:\ጤ1DfWpe*.~FUI10  EC=rJ[j!Ji!ɦx2T4mRa;yKPr>IQS8Pq@e2mDBgy]L>"Lpq 9o K̀$\B9/7tSdRHjOq($mD95XmH>1UeTʴl *J;QyC& \.'$) ,}0}ME-Cf$ &:*!Qn SЕ9v#%RFTE}'ϙKצ()3 zeHu2\UD 0iJWiv$ D,U@cFC}EHբ_)0x ںaG/, F}߼`E# '2)LKӰ%Q2BHT1v$k^"D 9&\(F"T$2tA0ęWt9XwSas1-YP%3뾛_̤#5<PSGebILKsߛP\d5> i!Slo  DB_&iA)|;.e@jq, ֋ e@1* $y/ٷF@ ݸ뀏YZ*Dj7P9&@bAcw` _L&HVfT|4o۰yHUL|j & ypɶZd̢>!^L_F"ywR:/ l !S4 w@~;`M>)" :*\ED(*W"P*S#uKb88{BMOޥ-[XD͡|nT`:MS@biY]nִwBfB3nzfb4o+$%kJzc|ףGxAعlNvL"-۬ ʕ=YSԵ$k `G,駲6i2ޒJ :&#$dS A;J 1wbƨ ;NJF)@RSpgA'nxѹF^+fXiaC; "bLrM @~>dJVW{ uZ0(scbN,y+%>CBH0dX:nHhLA^ :Crح "0MV6Æ W~oѕy hT7 Ѯ;x 0ޒݼ]6s FC(+ $U%-Du%p#DB)7lԠy$a‡DvBjMaOF'U9Tp}`*Y/qZQMx;ԓ\m.2aliaE5E'$xe Tf<B8" N% ik E*I.<LOQ,#V1t (龜PR;ٲ,$ Pi*) /6Fঘfm1ej>ITF'y[H1Ot~|Q5jA/){!Up5pFAw_ݝif_gy*O*fYZU5MІ5PeƠ?T"IVJOCp3ŶBrfٌSf{ꋔm\#M|GfvM24ݬ?5R.6%&|>󻔁1=.k'0REzV["!  43 1=T9sJPXLeFC&f t(~TOl}9GF]0s}y  h6D$9'tȄWIi4& _vي=p%e96)Y$@aeL!ZρRb$sfjtwnrc$A:)T ):W>T[{K40@'ln& ͔8ȇd q+Å4D5 2* $'KrYrp5u-L4at1dšŠ#3C1.FE:s&ZhzCHe3$MT6 pKhGG(jؠ= Nm6dX5 {Ȩ8zаZVEԧbhޗܧ*NN_ow=lX!>lA}[!GR|MRGϳ8Yl޷߀Ai}+F2ラ؁Vy?K埶:J~IuIRvEWѮEVE%8t%87Ւׄ:C* Pj$ ͞G#hP9 m"F7M}gMLTUYpXE!J9raX$ܟJ[/+%X%l՗r36+`2J \NSi"h|ǮfIC2.@IDj vX,NyIgȊ1S6'P1 7*fb(mP+ T2_:E57sͶ{Zlu=P'B$68`&Xd}e%^9r'J >= $CR L4% `3exRS*i9WV h==W̩GlЊrVHIށ$&`R]NP1eH8vup2oZG'zy*aw$"s)hK[Lf C0UvSZHm*-*U! 5=,c`26¾e$",YAz9ܳ6": c*tiły+ǗO @{!P5FfQ؄̇㲴-N)R&Hy ҂ 2Tix!.S°!YVa}M6 쏉^*eqWmP-/|Qׯ$Ytף;Puڕ\kƷL7ɆFTIS@EsEh.}R"XvJIu{)'I+ NRVDU|m>H)PunEY2`4'ҪVY/"A HA!2 ̾(b/EʤNR^1,8T{Q S4h=P̹ dM Tgda@e DX'%, N,"6ӌ#1rHhn# *C\oKbƒ'R!"^Dh(u`t'--||K4H3SC"_Q6$ڦP$5n3Dy4€0ī!K5N)R|ŰdTo pFΥ0 Dt}@ >rmZ>d+~S3K *е匤> N[edRGr9(mm' g v2T/l(B CC=֔ ~4fGC+UC 4SĠUB ĪLD#/ ROtnbGip gP?"h䭅`.{(TA2ZFGlNdEcd &%¡$sY_1NۚxE(EH#ΐ}#iAj;mԜLG+YK21BV8;.Ӯ%Ta 2'oɦ-n-bՖM,n hCw>͵JofRv!X(As'!%Fv:[vJ~ ƮrAc蠸+Sj )aG>aڠy=|zQ]e42B㠸E2C.R S@NF5ui4GRDwKLǷ5M8N]FdX/3=? :/"$R!&U^]K/^nL|*,UM,+aA|^Hw&TG AXQvVF LEϠ$ BG:] "m*(- a HFn1VXnl2̓'f@ DJ]A[GcW2%x S=['&+Su͉Ld2~|.pbQ3TT9C.b(ʽ:Ԙg#;=6H.b|%/{DJ!*TD6E%$*9}Bgo,:&P sM~L'y֜$)Fb5S |w^L@E>˜cr9#,`KY6h+Z(O4k>.}7Y_A^O޸iAzSoH>&f;D]Ħ~0a [!N26!XjNEbԼi^!NT~[3xH9O-[_}{l{ؐ#i!U7kJ߫<3QbA|qߞZ=8l=M(1|)oBK5!0ZVz4N۱'1- {Z 6R>yVjo;b@MߤmFUt%xR5FDBNHL2;I*sQ ݦ;Wtr(m '!=7ޡ ^EaOK&d0_rooo~o4mRU?H&NU'6ҽCom=[ۨ.5Co ;y?-3cδ]~~7<'uy5ݶ!m~WuBa3o}oBEcq+_2e/gϺY#д9wu g8[pj1Nt7ZNݯ>{€o;ɝO>7Z?V^3qtojx=fd/kRv=o Y loHkڦW^3Z$}F{hWX/OcJiK'[ukd*-;(pAV ϾU9gkO NjսW_6t?mաq?>K~ݛW4tſGإCuseoih?/SUN];O_~`lg_d.&{)4?_i=Uُۯ-?C~ݦo֥_77?ڹ}~=}ۢ/Cm*9L{rӞwz~' as.ׯ@]<0ӉrM8#guնgۻa{͓.iUi@m `pg?:{Oͭ)_9Iu۴捩s_1wyaQԵbV?ǃf-wѴ w=? 6tnZIRUݾ L- y RӋ&,Ziya Y譃|;qxFͻ_ݱ;g^}YbT}k}Izz팻|4 u'£٘WmذqwOK;5e?V[Zͯ[n/.Z_=e]k?M^+=LӮco]Cw} qg7Kꩬ'ߟԵ{'[=|#7hvVz{ϑû7srFVX'k`kvXݾZ֝yՖre/].W%~{dؿŗSo9/;77aJ˶?lrRޠk9wq6?=w~~ת;s3`•onyfwH?jzJ~ NuG?}uuqQ+[vmk^S \?>9~wrǫٜ'Yg6Q2s?m~xJW-YUMONgy*7.<7&=jZ-w.!}gL],;3*@7뙭[e`sx̓o9zt窛;^cV~ξ8{[1|z|陛sQ mJާv/?Ju]F ~R|/v5w}ڄK;gnF;])O~wOu~ԻQ^~ƨhwS;w߃}մ[Iy$eN?~xZk:PĶE>}խabٛ}եkP9?-ȎUffN]aCz-:Xu{^63Uۏ?\>%OLi5;daGl/;陰=Uw`̼8YZOZ0νzmMR'_|0~dY>ᡒn.lRhsSx|ƖϸA}ϯ*z1Ǖ]78߻v!zru{GL6JO@y.F׺h}agMۿEֶN[?И,m?Cif<*lN0h̵#{7Ϸ?k5pu{^-c0T3MJ&poւ]o>:IzKN0c\9x¹O7U3KLzb"Mn?XZ盗Om]h>QҢZbe3oqU"5vv] K*T;K+S[001l'_K#f̟;_&NwF<{d|&k| -3;K:ܲPh?c8c=WCt3/ 05fXyÛ}Lwco~R\͏Ov5]q<9"LC~ o-҉]?oQYo*?褉~g8w ƈ9~..niƩ~~d3p~7,|e޼VN?V:$>}Q0qL[l͹GڈՏpȧo/\uӊ {5n[/澘o-ٰY̟Է|)VD_qW_t7ক>Mٖo1/+67)wMw%o[+ܝa֊Q7w0}iFN;glO6.8:E >}]B8{' @ဉs_ҝc y7uMK /9pv_lQ}rD\ р3&_֦`yc~ϓ^Э؅O{}џJ* zl[:{|+ؑ9p:'NlKn^wqWߋG߿0֕SΒMff>eTξ':iޥS߰vm [vsx,9zK :lg4>t5_«N’l^.>۟C{7"=ES۔[[GкE{=T܌#4L^|MߪV (3޼6ʞp|asm[5Yd9zI5ˮ2%+|hGd\'/;ԞQZתt-Zp}<š [?=Pyٱ8 yzmG%͸gۆ׬Yw^f{a| 2wqͤ?߻{:9#^~ w]~W|?JOk͌<ۯ*ǵ軟=89w=O=|ȳU>>|{48ɚŽg׬Yy"pطhqW_{__} -rKkٽ[}+;}޷{G~u"{}9~κ_c/,:vs\)z}o,0_ٓw9K7.w =Жn莗|9Mzu{߼oXqoϋrz۬uՎy,]k<(;MosޫMؑ-<Ts[lf}G//unOicxdڥ/ʼR۟W9~z鴚(sW?F*;gsw]{S&*;UKg^Z7zM[}_s?Y[=ƃnY]YT>g{vɍWt*MZ{W;r`7_ן! |vо܃עUv8oxm7pMZW6|{gs5BT7=gEw#GܿoΏg-}l?< k~->ɧ>?xȑzC>Kj`k_~ewsiдe+ܴx#W< $;JsǎǎwֽG5֤їK+irzN;asn^N s<٤4˒mP]qj J\r*$T!j2w&uYovKR˔.l~- }=9ǒ|,pe$ 2!]g_ jABIa07 $ 0 (\-d[B #- !յUe%hAac^#;)&7(k$I#TYPK4=$ OT~ vJLx+';*H(6`vSbsD!8I \hmORYl0P w$|E#@oAHK 'ؐV̶>!(Ý GB&pݴ\D Op! WDnv?xP*F 8ՙ{caJXA%"_E .j"wDU1s; ؁|0<4& lPV:@z̪ɡz Slrs\Q(3F[F <_% $_Tx{HS7al\QD@UA(\dFPs&B\UpLX<)pr˴{LXJ,-]!;Ɔtq" d|{ǁ" ޗؙB5 .D-ȬQ)etl&σ?2'bzl>1=ec/,?2_`O} | a1\K6UÄ:V ZVYcaVJhDV1ΥUBa9N עF DžCBlq:wYV(L5ltT#e& OOJI ӏ ͖Fv:{@~E–%MhQ6G%+1NYxdrUġ éI0'DTYAXQ~uBJa#eSeapD ,p.BE/ŧA4F?о|L4Q$ <vu*.JZ)-P$߁_x(G_8?>]^ Z8s;g f-]_QGاN{O]}^uEᢙsg~qoωWדWEG1#Z |Wt-Xwys :Irت уOȹ*Ni(EssI(h#繇v@]J_>r`ά)i+ P|jL:;Cs͓wj}v \w>?}ɳ,Y:KO{ >橫ߧ Y.f5ӒM;V+ m 4y Z{7Nkկ4C7CO޺&3wU er;PW].X~Ew]uuizFc:]1nuߺNWOW]O,noo]DtK꿇z9߆u;pa#˗klwg6 Z2Pb?`}y\({n{X44ym&Yh'^VeŁOCkFɿN<)}0koݡU쬫[:f#2cwg%u X{ H9%rR!~:vݞ?z<.Ľˤ}I$ſoVw[G.Ъ{ruΜpjg=s%M>d2ϼƅsȵ8݇>¤oһ.sSa^/}|kv xoF{M~I;_9wK(3ۺs̮.v7W;it7Wm\Cn"^;zCҫFv+zȄ%S?uֺݯM=qZam}_˃+wHvW\05Y4>¬pygݘ?*U{l73%ᢛ<^Rwts?f} *xL ^uAݞ%:̓*>\8c.w77c75lW\:Hi|uj$W([*>Kt]lf/'j.ZR:6p|| 6F2?{>U}}#"͌.X\K:I71XrAqO [Jc0TJ6&B"bH5R+" RZqlT"~)E$BZZHId[)WQPtDHo$_L)`Ryy#Od YE'd2DPBLR&vBXЛU6X*aYԚ 18%VS=1sP\4쉥=0f~ F(8|c)( m qZ wpUTTFemxG?iPm-JkȀ 5*tT,Dx8pT垱7.Ps踈`ۧ!4 AuI ħ4ՠʇ6T@QIÜB^DP'|NSㄬW.0Ȋ'g|L*Cm4i*AJՐ[>Qwf&]*9 CwUQoǂέa"NUj*B9SuXe@ߥ$4Dd`:"IL@BwO}( J@1&glTHm՛,}a:9Znt0Ǡw锼4KDM2|X?BG)F,ϣ $WRG*9SzДeSVHh5BHƘL2c(/AUʿ5FImbkڃ!žBc9R|ǴJo3-E>G (/.8!CߒHDJRT0\1Um@+IAMli""4fh  hPY0 rAds &y ဗ߀H9m%*(2dBImԹH'FX"=E A*.z hӄ7FNDU@7QB2K)p *~JI> @HO49#0 -^%mIJwhM4dޒ4% endstream endobj 27 0 obj <>stream GHWPKJLTʤgBS h\Ub7e %}OY$Dc2?ڔ&Wrh@ KwL@ .$ȭ!RE0LsFdhh*@4"BdJT`Zԓ+Nr@}#v/iy_W-դGX5ރtKNbATC5m<ˆTlYE*J+,LQԐ I/3PEC.;D8AP|]Ē\ Ўl)""7MƋ^hPm(J~.nSENKsPWr3Rb"$mrI&Nr(&?!Y^R zhzJ0G&6]D=Ni,92(.Ss)dQ)*|n˜<M_n"RaMRlAT RI.[l|9e_ueHī{#itM/prs_ AO&09~g*U)T`qq3^X!VH%LUT H}G>Y_ q|R*dBU5( o2_9@-ph(XC"vWk^"+BYݰ|z"3@\DTO6='(ϳ_H1hL&SbWbq[p @1ĮnJ).LvM"*WA0#ڋΧ+ҙ2v9uOQltk,edm\>M1śfU*bʺ > /॑ALI*͍ NY ]} sjj\%~h M!At;F/OKQZNgz]@e}z:1`:O@_TfiLx,Qdυ9 6;lDѽ p5XĹO3qCE"W.+yU*z:H`*.A.a aYcWGTGSPŔ`CKw7t%Si~X7:*Nuߋ37Qː6oۢ|bE0-R&;AM4dJ,Lu_Тc PY]G&~!)Ҧ.b_=.)^!#+\my ]AMh 6Ҷ wL*3V*,|o2)+#邾OGnBoɗdd oqQ7ϴOd(@֨ȘzBU!pv'&ڑ\VD38g$Eq'<2 7L8y>ꢋ1C{r[Eu+crdmrGmL\/!"bB4k|XC:,baʡvVi)7"pؕkv \'9Y7IHC 3b$'9iG7 sXb{@n';SE~`qm:9T]_ش/@}b-_~zΖ oc ۾ _(2Ǘ&)>i5)<~X~W_o=ե-ZkQ.ǑG`7]q{?P(.yˎe*NH:YW_B~yjJMǏ~I]6?s%;Nh$UPև)5䟸IsAG% ?U/'κ}c&}' 'O' tȟrjAՓ G\^ /-o9b\ǼjBGW( >ϟ;' &͟'4kHΧLY|6E8.E'MξgV`ڪ—ݼT{{%*."ɄStg~֔澖ZGz[~={c?4FwS'ƞd.;_^Āy G'cj&}Ӆ-/}cF q;>3;&ҋgk.Y.|pcxjWeb.d7kuR3+;=Kp6j.um/tkժ;h' ,eڵd3rKcd9mO,t ~M%0ZAcRAxVOL'ݸ5w/}Ѻ/ȷy]N/Lxyn;)\ Acab莺C?>9p}rUоo.\3b~4ٷݝ8KnXTWo=yF%=nuwY,'_IB/?zj[{&ӥw~jư^^%%࿏sf{>OtQK|Γ7%y~ p~GsxwI;}x `#?{&Ʒ3\Wuy`Wr-jW}nƂt&D6߯ߤC[~p_¢cB&0C{Í/<鷾QyÍb<}Gg/ϿN;?l%eMq'6^t?#<ܽG߱d͙SKϑ]AėNܸ,s>sm.-r3J#7ΙK|65a,~4^|l}rfBeIQeb]m8.:+F"9.3/j |Fс]o=:~ջxП_Xsd׽ȼAytW>0mkgUCz}Q|>c?kk׭[oyǾ9|`χ;\oV.1r9kys/zV<0ܷeF>)8'G&M]ũ Ii/|`A}:ֿӨ4mY[KE$eP4_( qrYDU tI-YاkKbW g2VE@5 Q(Tk&ll F)011!&pw E b@^( mB 30n K_2Y* ^`@-H )'1 5D5#h&QC i0谏(uk"1J/b;0qmq]Jkƀ:\ʢǁVT"ķ_'MBg :2IfrgUmY9A<Վ͋dcs@ژ:iAfYFN1/39,_M!X9c%^ԋYsk`C#3ڠ<Gw_xݣoh?"Ho|;p\n룃c_ʓf&v֯qɭfu3 $ DILB.t)hfёVɑ<ŖGZKȋ鹀rKz@8e%Zq;zJ.AB䲶G!gBk21d i5-/BEiXuĄɉ\νuZ'~.ź<. N͝2i,{`1Dp$u;dH|;nȹjK/`Rr`+g܃dݠ-P_jke2nb h=T`= ]mYm?#l!C%I 8v8D5\OW-i3'o&Z粵Rn5Hc9wҚ;YLբG'F0-ch=[Z5vymIt2T[pis?6k!A@e?0>M{4Nh_+an߿O ]}'ï\K~ֿ+Įu5 ?nUnsy?{iwpfWcŽ wc&}?^ g=17(_7m4q<685??ox` z/zG>x]O6܌O~NVG.x!_]7MϺ;oKkޝ{*^ܗ'Ooi'z.q 弇Hj=%'8#a&g?_xݟwx o5O;t)dGoG=/ o=)x{m#d717-/#gN矏w/o /`M~;+1[=o}K9wqٳo{9Vm陿jޙa <[{ٻo~澚Yte%>EϾtx<k_xwҔSqǧW~@bi>7//t3xٛ^y+zIsٟwz_v^I[䅛 N>~7^}ʷ>tkmwlw 1}3z֝YwX?}߼os9K5/z[qB?}Nzߟ9w\?]uWij9*Iv͒_Sw}M}O,^7u2kѿ \܏kɟǫ{x >/˔G_~sxҫ}xyg\7>,h^g=+𽫾> Ş+7p?}['?E~Sr~ԫ_ݗC{>7Sru/r~-UZ/יOk[p*/}=O㌼_* ѿ7=w') wgS_{}}s>* u{M⪫g+Oi#oK=5_>xkp%y2OϿ kK nrM/=?׽5x̟>4 T5pQ{Yκ/.[h[:ѿǞȯCw?~%o{5o7?.8rˇzW;HxڟOGB|}[O/x'^u5|o>W_a剏< /~ ܗ>oG?/쓟ʷ_첗=Dw뽳=G#yc~|տYg?/qft5Jle;ua$KD Qz1͔ ~ EHJhQ\}/۩J0&Z2]bMJ$)Ԧt(Y!3K ŔdFBҚ}T5z U;\ zft(ﺩCHھ Ѧ"ikB5Q. bG Ey.gF)Tdg@UP-ͼc(+@ZrEujg]fe&q(ʰ2Җ!k]ٮ~u,H(P?+C |U{xH].U2b8lf%p iw'P@.eiƊ kﲕNT(Y=w5(<СܷJMh\PLTairh"v yX\*VaR:Y<󉚤k ٭NriPMg<, W܊ѠvfЂ~I˩aU9Y&(qvQ8r1wA Zo~aub@ GLY5Xs b?UMNVQ ;TR_SĤNZ{*rT`&Β^+ HI4K,qbitܲR%Kc#I+;7:\3K7ɣѱ0 e>1zIw ʣxjE.–zV&x} +Bs s#\IceKcj7'RZQ%HSw(˻Q<8Z~G,A\F|zِ6\cݗԨ/^S &pWW}=[(Bj?͢/{m%EIw]*NgO\]\qsk[oxMfiu>OԦuo:~gnnO}&?Kqk+ ;lOj?8D/h(Tw?{~7{9jOg4VnWھ '_=^7o w޻ t+\?ioݖ#$F'wzw]~f7T4x_x7}%wF7kG}}kF8l~Iy/:Ƿ薛?n/t${=Tٺ=R7ۃx%^X]Ig<p՜[O~ٗ^{ɏo\O~ysuw{7oG=n=_KΗ__wx*cg>>zo?x( pgҧH]0!z ~ƅ/|ڃv~t^Nj.~ ]եٺß'>u^9; Wo?x8_>@?7֌vыOݧsC@ǯ~e_պ%ǛW,_zc7g &>cSպ~?8٦S.N%|g;T=?|/?6[w͵|pC_?^ޏO]m.~/>q?}˟xϫp<}oZ{6_ڕ{^3OxN~S_7\cgnu{_Waqj`e7v{F:Ȩ@R?Q*BFh_v(]-v{ub;ce؁ß?-O۷;#8~OV}[4| j63ϗI~D Z(:1*Mh{0c\G-+c_8¨,_ﲿfόu֚octo᷎/H_g9 )r0BłC=p+Urjk`oFo ۵cSe-n B$<vc忡B(YUKxxθ}M@-U8rm\͆qa4;9IošRaiu?U -EYWO1f#,ƾ4871-軁j@^.;!@כZ9tcjNodxa+}84=Cv\-%X*W4GRܾBA9{b{m`}n1d{3BQ1H$N|q{U#ifY:Patnay`*tMC^*(ōg [Mxs:)l~ $f`zﺞn4)vp4mh;\Ոg>}#叞( ic{yc|Iܟdֱȅ֬+\GA>ӧvX2ЩiU$ J,?3`K臙.KE48, :*'坢 0'ҽguٗNs&jdZGH#\P9\*u_% -~vl͉U5IhU'R!HKK)OuiiBd4pF^zgQ}2ʱѿ@ $U&\x&(&In_[&8GP=PMpM@;GG/dHKKAnX/0DmBRfyՀ΅[g@y(Ӓ%k:Sz90HA%bK4|Pdi C {l%I)&AACLuK11YГxv p)ص{vY_jyU-ʹ=IXiK>Zx;Ivb]:vxd 9A0wnEkKQI n+}3#"@HX!}ҸzW-,uc\9B X-׾3Z:a['].{Fls{B\CYut"F}6Ps̥ qw[AζDfdp777^!GNk VFhro!7JlZ\ݴtB^Gmd-_58z{Rʞ{jlJJ#XQX&}։8Х ާ!OhH) nd1d{Lmʦ%Yy /!;]j$)v~^˚sQm?UգecYIxéЖOX]K7ZbBk{ȹ Kn{Gzyy9>xKN;~{rz]:~<㿳X&wy?L TqcF8٧E/N>g?=rn'9B-yX34ޱ"{bQh@ۇl0G^b;>夞ѲQQ#ewQʂLo$FɆpTW9M(ʘײ6p%.I`D`3G<` NĿ˽.*'Bĺ #U`Y;>wTDl 6&w3{&vYYY rfko}`r3^2blktUV!Nd6@X^qhBBy|SlE{lï*FuPLi,ddi=MLlD̃-,z2TќB ee FHB9ucz+( ` =Kweb,o+Gm 5fy,.6k9*"B EH5v<0;-]^ƛJbBGK~o9 P=ZL"3*$Ok {{΁sOlD8 ?8bCYYwfee~f~2 &MewWIcU5Sκ|`@>2?V%ggD#; *{o=4*j&,ObJ v.T5"(R#i QXyؓE!%yGg3UFP~0Cyªt`pui ϱtG#ZĬ==OdoDiɴ ̳bsѕpD,5MIV'1Ð@c Y1FwL X~֭yR㢍 Pkhda\\8aǀvѡT/2A_!ZK2z!Ȩ H"T9?wϢ8}7FzGbÝA ?:E6')@jaTUDĄEg dZ/QbϏ2#lBgko@Y%Q<1j]*Q RfbuC63ds|ld $U,ߜn3': 7=Bcv.2of! (ڙG2%e'yu dXB"kV'4SmIA"K"êM.:+q0\IV5G:v {u%t`[ 0 RuJ 'b6E_+6 WQwiWv %0./Gv!t9n8ohʢ+'=Bɀ2p ZrX91͞4Q$^O!,GeGOV LtK^el}pFMBžBJUTbخ63&l9M,Fv1y 3XɁF5X,['`3xJEB&fj 돳 Ltܣi`f&! "c(F`pcp^\ +,0W]d2cU42]F\.6*xMe42 Y;slx-&r*,ECT99FƲp0,chgF7$yGrIv8pAy98{vHUbk#i/:y}MɞOA k5j@ņ!))5YL-Z$E#hUkbV-:tl`'OO"(RPEf\Ȏ[Gr@AkjB"0=#:$4%ܻ`D: iuރl7^TЛEr+Q.чqv(Blc l!Q0/NBs̞ bUFv &g4KH )"jgw:nV՛8Gpk*`0s2Zآ澶Z;ӓDRPm{Nٶ\vQw:]!hDۘ][X3 )E)[9k3}Z$֊q)ty{3ZLgزd>u(.SjE[`w:x_&V&&*j0^Gn؏I)gaX('waZUJTL6A5LKх@Cܢ(R=pds^\H,Mzn@#7"[(H5~荕h#6 CR]=#ط[O%:i}R,$aqOׄ%kyFӒU_8̗H[i@ʼIn/KUw뉈*dHMu4~Clsq.5>sJD&d1 :_aILs$kYE0v^!n*H#qWM @A+‰TNl~c! oCN9VRbKn("?E,m"fihX@NqZ8LSݓ*1g SuȱgNqhܲl"\s)Π G!j䵁# w&tZfXR٣:su%O|'pW9J~(#((7u6,r "Kέ-UehVOeQe' dA։&eDXr!\swa3o2$_CTQםiE/Nj@d %i+OAa`H޶YWa}A +^ᰰfh\EUU}qUPC[18DJzН s}P2xOZ4hT s!JLԐs 3d'AvjRN}g($$./O o  &B5fGZY(T]À-Rr r31-t15ԅN򺁄&kX,]5Qqk> ^P-g>ή:C̆>.2ݱ ԅzpW5BWCUkblH`[U@j)%)S$<5T*f|7u2Nj0uV\OX9)KKh,ΦNK $QzbExhNt3Hj&,}CJHEBPbiD0tO:7zj|yxg!3(&(ae qm2:8A%v;Lr %"6CE!0wƎ `IH6C<22ìj d`" F3xGw`^ޠپy Di.)%1]RG2E+=ʇ 'CJe}i•Lal1o/aprpDٸPD@7a&+6֍7_8)y,aQ tXV"ITdH$:`tNeTg}$5P P8F>^[42֛㌁F[ @Is)iB@i4ր[FcX M FJ- e69nS29p@^=U^cDfI4TJo߀"+էl2{J j!u#\R42I\Oz w S!`R@͌d|Oq6b䞑`һ*7d%d(S]Bt{#FH OV:=BqRXg/bQ 9=+\D&-G$=T砩G{eY"ɤ8ܫ\0p KH:1[,X9zNcD "ѥ:8F<yH+eBG=&;3h| E]/Řt49IM8fxংO*BWX%/` ZK**K*} 5y{Z?4sh&f{s`(LBrz&N=F9Ru=Vpms iZeX JuGV#j5Ն)cb3;ڻ*, dgMO,IfQ D0wT{]77[!0H9c8%yb$Y{fϿ8WF"J P33#ZTn{awuV$ÀS 0VP(7V+th.)VhzW"cx`T͔77Θ IJ!V.Ht#lafS/kC!e\h* 3W 0wq802CU즘6ʀ\)D$trYj}$FҜ%@h7ͻ!vNXqHk"˛(1EPوTN*&l9F|'˼uҀ~t0QoQhQH*PB Fo2g.7QpwQ]0/v,$FDm|r;:$S 9-ov_N@̆%!P5z  tF})# tGW(@0 0GbNG}$Da*YE< bIlŢ f1Rz l74,l 9 ,'Q aCUf(tU \ LrQ<"!1=!7s$,"6>D #QLXYluPZP >BIjzHzE$~+0Jef4<ba+#$~E"`A$kQm8cE?.6]WǨ~`_Kߪw_+3I$ UwI.Yj3.ЊD:Ǧ"Ӈ$-A9{d"ʺEPJ\+~"u3&c䓟jC؇<{a- ţuǠ+XV SQ-H7F}@r؁?O#7nKiŝCC9SM;s,dð#= M hh,4cG7+BWzsEsSR3gOk|1"@Q+(E 'ECFWֵ>k9Wj.rQjl(bJfRձQqx6{Z?X J3\,8dv~"%K|gK\fX hwOB us""EQ=zCt7$N`&1Ϯ L&"#L 9A %LQRTﴎɌ޺F նfck;艹cH9]ZAd Z9RU3±,T.;(S7npiP^%of DĮ *} mNc0CFFCw-[lv BL,WQ9;R86`6ΫB謮.$)Tט!8yY]Q+qADJ_Xi$KEqHF!7q(Q1ʣ]e庬Z;Yx"<*,l%iԲCv>8!*g٠ H<0Ot4#yqLw#ƭ{,Q1s8 t'(,hY: Sih,*iwS z"VͲ`+ ]q ZA ."dXrN6)|86!҂3O vFpCs7#"I%,B:C++%ٸ?Daho囨rJ|m6h Q@Ѥ&IAt=r\3 F/lGb f1Di7;^UK$6CF#64&!qh plipbiS+>R5a= |!' M*6֞%&=Ji7oH^=N /7mܳ;%{k l7mn<Q)ڬ5ޕQ+as<]-H|e-ЍU0+ zaD-lG $9nT4lhʛ3de~6 "/O"∑,` KW?Q*T$ЭKF%''əp6e\e#*{ZrdwI>PWFΞ䰇& 3^$EAwbFJHv, D&k d 1"SKgP-4yct䦠,I lO7,5׫wabo"t`/ѵ~At#o+c':>HyS=b4F먑`Rrː:lK\adG=ti .(;C^0ѳVÓ:ESHٿ^uD͏"o=ĥш87_ӒؐJ+r ^/%jbj8VDOM 9hE+RɑÂ|աT+wn uqM= Ӛn≶д=k](o3۔|璽iN!5ZN:՜q!3˹ %kyHh\'ѩ2jC85 vVt0Q\}3"Q>+oBH"7w!48٢84{@ZI_IS7]V .s3|EHnBo*"f&WkrK-Q?{Ϩ \#Lo-)JQmCP +C,4 Yt7,EuAfבBsXH:<~wrwAi:H[zrC(ݏ*;bC8ӫ99 |z:%A.J9h !AzFz{"4KoRPuSa/cAH<*AXI8̱'sЎ+qV1CX࣍pyDJ7 6/b pZ~2M +9Vq-|0C r)8ݻcts*4voNJBOk`.öAeF݉򔷙Xwk?Cb./F~dl*&EqGagP5GA T܏p[eŴ e<AH 2Wk(!Yo `3.:]msSVm WrS*̂Z=SG9f׼;m> C9iAJ(q<7[s-Rj[MƪZ29yVDqM\ :iV7h0C ]dҐY GT Wtib9ʱIӒ٦ u@hQ?[ 6)OP'_fma21 mIIТSO(ld!גV{BIwdA] 8m199k@[cm{J1nFkO*sp3 x5JX}:r{ܵl ԉMW=X ܧeT@2XFJM@0}6| *b*W }T-KM=\*/<7Q_F0&0ZƲ S _; _ LoUKU{ 5^#O_ S0IR3V D $-Ww?uz(O0i?˼B@h?Dqݛ:3Y~[թS2yNlChWVu1:2 3aĎFWa/SW#\&]Vˤ=А7RGxd' !'hl=AAlOc2ﳭL!lA긩I!@,v@=Y r9PL`i eh`u;F/44CyzbI UqH D,Tc.O49PS^0TV KP1PqF$omVׁb'4@#M@}wRӋI ,HC$GsyWaZ3dfuz$,hѨ%30 j.AHXm%c F&IJqgiM{/-d0Ab6=*&Ur$.:&%hoZ*ն՛6C ~7bYuvj P\m=P4> @K[,® &ֹf'08IFiAH]i45qU7\hN[m\Чeu(&*tx#B1I ڎU mSg)bhu7!)Qy(8/(va2qzFYoel1320#u znvAF޻7qDOEv{`?wf8"͜t4elp JTZI(ն*D'+4A֣$JdoZٙm'*1O= ԛ!:i@. >ck% V=Yp Fxɚ(c#.e';ؿ,ԻtW2"98 _Io.#JJV/NV =;YbJr]#/Xpo)fXέeKd}09+5 rl  `(5 p,CC(;CGA%l>2aiZP5ۀcec,h<0f1?^7r5j{Ϩĥ9%f,hc )o~? 4yQ =\F<OI{O-ƣ p"8]@Ap ^,(ݎrL~EQi>I)v3Oҗ4SN됧 :Al>g6o~>KYV|̇u &\"bPCjXɿ)ß^ǢRzMޣO'ew_3z=|,C"=|$vYO۽:t aht-hӭm0;ww ܖ2{F=͛\%ŚýfPD.6zɌQÿvd~FiB=@HBҿgf^=q(ӫq"=;.ӾGmg#AFr:IX 1D;d=PI2 х5͞ -47Ząg kX.Q] paV ʒ8Sl R?0v{I*{TeQp0Cq<¼g1 Z3papj$Gm^ Ny=V>cIШwF6 jyVY$G-"0-3=agD!+b61<8tjCn-&ұBxhIϤ9цE9$w1+>x$X+zVhs^JPP [cuuJЩ<>,5;fQ$^VKgdOXRxL"7K) oWv2.-3PD3@im>=!ąO+l]!aCdC31wQդo$6H[:XͦII 5\;Qq@NܾF,+!X²NXZa`ssU0 `ۓe^V_~A,a|zf':R6޹!L=R{,([ O)nTCO(r.))I(Mds5=MRDkʤuo~D7Ԧͱ|Osl8 IRnl6&( ΁tX*ڊ4Ag9D/+gl@cP`i>0.6>,`$(mߘY-V[xUq+AQt+{+x6Tl<>}x;̸&߯m`wW3@P@3]`Ϣ&q3Ai&9U&Mk$t`` ݡ<*uh; W3ܙ%ާ)ږ.7(^IFIv4  Ef3x,8N;F;AA2ta沣E橞̢1Op3ى.bo_O)*Տ~9'q BQ:5C WZ',x (8li7+l,+ l$ FV/x ]u c#sb:h 6 uLl@?T`Cӱk{MR3blcgX這,ػ3v~Tɍ6)N.Ѭ̿ybrX SAlA9rBj6Fgι̤2#62h99ɰuN gp= hbBw4}` A%!ǚ- k]l.9X@8 ; ]Q8FP%ȸk)GbWZy rfYT|[^pBwAW]>^ jcN:Xz;RDAaJ_DHR4U>KbdDl$ `Ʈ8,n8CYYS&4ĩBog xn80 ^(3n״‘v}7DP]Chtݲ4!yN(f8YYV̴'U{#Ih+p\+ѱEFU 4 8tqN:ph?n!-IX +rJ ̤e+Z"Yk 2\uGD@(i܉Wgu|+"B%:`!"p G! Yfl;ᐉS$gqVY.hTH堇*TSVHHPa2U&L\)pP*pQ& 8Pn8ѫW GAhDidUIH ;5e1~d3&>roD>޺RfYI@%q:&$̶>zZP.Ȩ&4;;%N')bl\Ö́jnA>l(xQ5N:0ױ߳!J},r&IoجJh!˻y4v[ViSNZ9 Wp+nWR?fIGV$.B(𢭩2ddJXe8-V KjMXݦFn@M!D8:c/f}if*sl vvVE0[>4kBSH0drLo@L\h:#艹;uщ`|h6)1iT(Lgv&38C5Y3z 3wq-3ޛ;:/5X<x^#ti2&:wKsԛe:t.uQx%צ >0sFBJL|_Bl˷Ʀ8 -5b$ epZ*q](B|77 PknJ` ! `dOQp0b i$),~%P5SF>IC[j,dH y]++˽Z8>F)#l1R`HZJ`J_9)1e 6{ ՠ3R97|Ww$Uo1,cj͠?LtqBaL ;b /ƎUXy!URՍh}bfۮ׋tN-ra3 ~7T)^ ?c3#9Kk$EP>u<&HV2#Q`IVE-"~PD$L"?qNUa7x"YެFf !'aG8%f .6O -Ж0!U%gI?*GMY)mtD\,Z+lf0$5/xs _.5{C`"ڦ $Fv]`bP2Ln097ӐrWXǩ^͛O(ٳC<+d*>k Kv i5ϊZ5! 6Z ( HZ"J!dF2P;tZVS tAAd%Mty[BB3zBxf e0eMbP@lw2q9] u .,Gqi-oKCYc [[8t8%OC&sAd)(zuV01gL"E<5 >H ̒䮣;,] 16fqFR˞2\vF{V _B:Dvj?+6,8 AJ0Dz븁\ׇDL[G 0! ^K"@7 cA@ti ,F"> \@q,FGZb8i#?Ux :YqW.#*tX7ptѓz1Fz𦋂#w~.̓25iZD3&5[iju] "8J1dV[ WlBw0Yu䣫ðZ$sFqR*"nu$ɷucO?d5si7v.( /4G2CP4 #^.eg f.MZQKMxPU3NQ楈u--=2&IUfHlN.}\eosiJ:-lW]A5f9-uktuܨ5$BY98s)T| 4lxўt=ҌoFɎ?+aj .S3e`m:'{xReӌW%˳vNXZl92vfgH,XN=K'M R~+G7(}B|А՛%HѬYRS ^Y\UO )t-&542k6-& {vLޗ .0"N;sb!7+)31vLh2$_ ’o`,%AI~k ydA)6-+V^Ce%Iru_Y*h2 ^7P(i7l+qY9"?mWp>TBkz5,WT1b5pfV$iv++4:zt~$ӊ/JR8ԧm$NzZ[~\ B4MJ u?YRSr~!`?*ds\Hk ;԰e!Q "­{(jop"x/P@>Y80WU )q"6+nkޝ|P[%$H2Idp@@q*w$3Ч}] T)qҖsFNo*lٜ0piIBU#Dwu)~ZLQx(0.IxξHj,gx6oc?&(mk/I` z<2q 5b$0tuKoDUz@4O;j eM*Yʱ ߸Oq{g)6v ǂP=90oOf8o+I YFT$\4[ωebO*.iL LD_Ԭh7ܮ#]T{ ) {5U7S R #ZO%.ОKB W$#8JXR p3񡳔Gf7@, 4C 9}:p1_,(A`i`]޽IwT SMS&~0%RKR3u!ΧT!P#oai7- z/>^A K$AvVmѩ2]| {&~59L:%enXšSߋgҶ(QJ` u% $ xK%ǔİtnO EkAWDFJ/+P,(YT֌g'dT0lGt`fVH)560` -Af.R)EDL5wK\); "ߐHUi-8הB~/RnjđNՀ3-:) J=d*~uESrP4<]0s'Rʰtb@t(0zCūhTUX17)),HAp)0!X@R% 02bv! .%+H=팋%Vsd YO B;bx+RnRRC%^0DUѥ :Za\Pr6 4L6Zap᫲!PI^@#l@)V8I%EZJ|F29DKd[y9zGǪ%rESKsGR4IL)WJ8m Bf:9kU*Dk``ZR~=Ysnڢ ffvq" lZGVM48 S-oRY,#7@lzȶT1YE\*cbdtt5KRTʆ gAt\A- 6c c%gWcfz5Sրm5}Dgq)0uWSH?M 'i#I@M˶-20kEj k5:iNeJzXmM#P'=fGa\4fG-RA[&`IToSAgTNhkTE|bA5:!m]&J~Rcx[= KQfG/KG2"$m(6="YC;VDF!T)@a)Ȉlk@\,DyǓa!e 8 ˆ`c!QD(1T):D4UJ,F%E֧IIBqL7E`G0fJoF8R|A+`Cm$奓!%3xV2fb |MM}-W[0=(Y" "$"NvI5`l v] $J{V͢ jR(eC9YeMAJ`Nk[MYཅ\侌rr@g2`8"`3 '$Md쀐#f##V~d$Cɬ18E]kqy{8Bvz`m 1BSa3>b#LSʗ ݔd"SҷDilWB*tT4teӭ| "e2oP!'v'0U7CYQ|A\Ѯ)mRq# بpjV3a 8=0)dq)[wZ&sDdɈ@|r1fvP1ΪcQbd :ЊƐ@3U\҉pQL6; sF[z"mK˸AnĬ BYGv! 4*&}{&X^T"uc61L♳-*bb+EJ>+zĉ8@It46z-oT$k4D8#\# $R#aCe}͟"|,1Ho HADJ3KXY Ht- %VB|RJ0\59{'m;1j 1sB \{75 #͈Ql F8$ "]7'Eăh0/)oY x4^.hm`F!V|q[SBH ;fcY_?- Ҫp f/Y]h9/"bhF][Sd%ap7K1f[k#uA* &4AV-[CAp5`65 %)d0|1j1ŶJ9adUܦӮУ%0Zp&UQڶ/O/d(D])X;WIX-ho2L'SN@+ 花̈́tJBHϒ) 1*'81SZdW*+)(W$V*TfgbfMA+, /%F@f2WZ7DXcxgs<ERǵoA-Y-gh F[Ģ& DmKUIߥ2e(R*33gŬ_|R@C$-&]i7^tВc̑ElW`kKMI~4ٙKF7q_uMU3 `"H6dD< .8[,)~k"os&/5""EJ*ΐD-m/|W{I]Fp0`A @%1f+ŦaOx ecS3 G&^|(ٙr(DvK* -U}`=VWڦ")Gͱ2PڄڐSQ ^hfXK!ؠI9LahCg(1n;i0ONΌNFrXPQ qh |*Tfuސ;YХ +,X%R#:WViATb mȅ :-N8i8e<Ɠ$l깡%B̈́a)h_l-_q|p)ufbL*QR1r eDBK°H,"x=J U{Iy -eVƓMґ8v҉3AeKvYY*LTC`Z$!R6ALg5*r1~p\10"ji,%BFfG2))gJK_YEORHqG  Ky##)޸ &G%ͭ >q24:DU1baqʲibkwKs/u%8m{Y b1JoVΰp˹aYscaTlVoM["_Pܠ䬃MHOΥLiF' R:!$--a6ӘQEfMy}CpD 1`@5>r&KEKbĢb[DTD1adF.e4YGrGuep^C tU-{=B \-A߸`+[BB\eTH*cCHFyyz$\}jGcb6 m\L!7[=p_ ը)KJKW 1NB3QOl|QJD5!z)h4@,*|ۚPE\sT d:`o03ȈҰz߀T_ Ê k;q&FW20I y,SYU.JMɉXw`$Bax̵pċtABN]ZqA G9C|RRI$"PYŔxI>W,$;#t9| =[^ =+52ǂ)B>cPq\Tp醣A){`a ( Sn M@8"` &E}Cr9ꮨ gFEucoK å~< TEIv LYC9Z{4!%e˂fÝpiZ֩8 "G)Dj'ԨRͣp;I= @UapT9l ZLɀ<fl@ɲKm .4mK+V(CVL['h3Wܚh|ǘ mT{22m*2 @>ʨ\5<:QdG=]Jw2n.w"WE @+Vl#TK/[X`OLH,sb63qxv Lj}OզJOr% +J!&'BCdbSx32XDFL4?Gϣp?GT:N2gfP!TUyގa9hyp11RꉋTdP/_o߸Br .)CvEIH1q ǂEʓȩK}X CiA&$~cQw(SX2-JZԢ߂6Kt]{%7K]0nTm-zO*Ăo\dlZJᗂ4鹿dVG*X!.mŖ!>J3% &+UYJ֎  W@y_Y!4 }FW VK{V NhjWK:"/!2"\HJ8u0@ϯ љc hjL %8s}[X/CFo MwE`e)iN2 H^"z_n0Lb 벥dXYC&0.b͐rzkhmVZ8V$Ed ٻh9P\(cW+V,>!Sf.ȁDä8`.:b(JFQV-10RP%0kUPIAZIQiOL"a%KI`/+sV$2R1 Pk/C^Δ0S|6b QXl踚kh=r(kQ߫7 旐l=a2uur*6a3=aa kZ]"kedp،@zx %!a7ǴZ{~͂- PYr+5t\QԤm) -rBRǼd:NfxVi{%&Ah/ ;1E@ٸOK'ױ$4+`|KиK໴$H ٭|\m5oK1? .@˭$oYv󊗩o'4];)#Om1hG<^k'7V!aIw O*=,tA Is;wr_WV*ؑ ThW^a E gw$Wa>cf Y mO#4KlzB(uSX`BG>jB+}f +o : H:]geSI,WxJhiM bFKkE+^2Rr ]4s3vZN',g8߅ &fPs9:ad?h:} a呔b Cv(E /DKir9DJ3GK21'ۮfe(E'ȶC7TH5( UȾLW)m'ti)G*}a)i~hj,8.k+S5<]|_a!'C_\s mܚGݻkw=VBf^3-pdbkV16WEmNԹ@(ĺJJ$2P˒ 9,rҶf"?[ 抪gFIWX~T O s;Odw~m-Nnb-m횢\][ Wj4,ۘ}@N \vJ*^l⋇S$ݕ@"<$IKB WC۟d0% F!,[$Fz,pR[~r뻭_VyXxnJW𩈷̀ v//9AyR(}"YI$%GⵔM<]SdUc}S]o@)umPl2!Q؜i\`AvJ2,vlSMF2VN '$On"ayE-d[JK b.n P)(/j7ޤX?t0AAB0lTÎdNF^) - ȭ o.>̳e&#X&j\Xo[W65={vnd7J[$5m,[,cDкYx!CP%պ!^pj6P7Rl+kʫfW4ZTkϫSqu̍G<;9T-A r@ v_U]}qtKap0ɀ99ө:t1:HuJNВaf&~Q,`+ (U8𚂰%aD&WLQ{,!p02NԤ Ӕ6l,-[Q 76V{C2yUe-M7H*N$$j̔r)j&(H % "HQɰ)j!qj@Ϗ*!@`CATð'wYѻ$' *Hu*P@-vܝ3!nZu"~5uEm9wkZ-)JԘ%UH NJ/`1X- 2ٖxVu j?*#0"?tjkMm  *g^N ńH;;Qmv\Q^S !j~n y"|P Ƞݵe:7J]# [j/ 4H=P)d0[C^'C! F 2xӋago3%+ =|n"`(AHJeHw1xM@5Sݦ.đ=Q,e36: KYB*[PͶ)k1-b+`P*09*T{)3kSQ[6Rw P$)YeW_R[( gBUga#?c")uDY`, %O߰oa6W1[tC*- 陡fI;⚥)̃H߇Ƅ"HOW jP1 "[t#r$Ƭ%[瑪Ă~RgszݕN VO]F!B&7τR4"J!nRj8@e )J`(|EFs0+*YQ 82Ue3\Ǥ'Eu{4ȤR >k#_D\;E̠#1(@ݢߎllt2Y\9l7e/J4MMe$ W'Yd#Njp!$KIUЂk K䑘|ӄy)PdT2=RQT{ZUe (+U;N4lvY*݂B];Tc* ь" Ev"S";^ߑt Qj.^i=ˣ2 0T9:n~a,%A:p1Kw4[$Ś,pukkѤ()-AV '}+%\Њlς79AN=d%,'] vW #o@m#Zuo-iXa# rAIrOJ@L=sZ @>hX.1:GIҪ=j0֘pcn#i&X ‡:AROQ٥ "3g)|IHvBp/~GH0ӻY՘]CP눘ؗxs%U@g`RhYp * lΤ{d t -˝&C@6ͯ=*3bvROhB^t=}VefvkL5OJ2 )O(  S sJVF0"A9 ;s}aJ"7Eő֘Ejp`3,:J5+Q1( a~Q@'0ːn*)kWnwDDRt[jN&p-3(ےS2h@ Ib2 "jaG3kҜ1!pTNzyuŎTS4%krd%-('"4FՊjZBr׊Srom}9\S0F^ ٖw/)vpVŶNBĒ 3p2dO&(VeGXhA?q,@v hǥ`JR ̓ҙ,saVR-Ugɏ01x~h%P!x͈b+QLXHրhJ` 1}#KdJ!DEl(+h!ہ|pC Y0\} DJ26&Ęߕ:Rs5fSW z^ $.P%bcS|'0ǜrxNM7 '-&,wF3sdnf [N,RHZDr{Ȭ"VOco"힁)Z63֐:ݠ0O }n ;|@~ՒuGںlZ%x$܊% lcA-QjȦ+Y{EL*j7x-@YKߛR/0"VLY~f"Իa+Qa  `ze"a'{D kɳ+Hu= M,6X)iɖW9wB]fȹ\!a|^=F6BmZG݅$I^oj8 2EB@Sgd~ WԐ% ʀ!Z 0[Tx𬄙HQ,.~v@Uсh»?kߨMl֪gZZrt5[0^`lz>%s S>1 ,z뷵c_ Jc;zuہ\"i66bYLO`<R!Xg׭9D׹C~d-a=KǙ+`bU];H@ $"ӢaAF5vA—m27I .]QS*=XؾTGRBXmiH>ʟY 3<_5p5}҂ _HR5s/Cʫ\XIn yF!2]0Q "W#"UE!Xu\IR*dG,5U,oJ8%mCѽӔ룲0d]{R.i9 U 3z$76)}F*0Q0h+=4.u ~IBq ՛Yܦ,iӖ3ͥ [(HS0 Eb^AEvD..x$FyW RETv DVraFAizJ$Ŗ. a cVByp#uPB W+ 7S^muڲX$WxyYA /q96J/R`Xk񊂒 ԅM!`\ZB 8ˀm 4~yz x ]DG5?;>#"rV "(f}l+&-%do@&IAa[mN;Adծ`8Wj9ZK*99Sc&^/;zX Y4-Dig*ށdi6TL"!TjH](Γg|tKq:k61c<T֖iAV.EC)d1#Ã~oXUU[kuET..Ȋӕ,4e y8*Tړ3.rHH!/K\kK'#gQ!! 9Qҝ H@L[{.{q{ +7D">RGBS%)c5%+Ps/HS4hS V 2RNiEBHKH%`uF(¯˥!RcdJiUҐ[ca]); L6R) J mm'/vKc~}$&,Rƭ s9ݱѦ@zx='\19\r#$xz:9̍s4=2wnONӓh2>9 gN]Ǔ;ώc6WFot?;lNy:~x~nY߾iھg|thvۈǎGdI3'$n=X̘:eZ d-NU\.l,dߴYL'BKw<@vLeJrN(WN){ ^R+ D 0"=6PqQ58 R+Aڂoթ.c/)@ڼKl0&}DGv3 Cj r\G$*w!  4b7 kϡzO:M3?\PX- ,Ŏj"OBu2wǡ m6к~ݟd,h5@F`EVXkPS QڶOQ]Sb Ks hFL(1=+z[-t>F7e̪ 85T 80 ZDbmҁSՈAeF ,6C`Xd53Si!\XZ^I=Y#p ^L`"UӟfE$;ɸHnlMMWĔ*ml3V]$63JfFYR$B۔-OXkSMc.t_,l,DAt&PG<Î [t 7gon2l+KL~Yve=,,A6:BFA؛Hg \($&BUeTFm)sD!dEZ} , 2BBXa8b(Tힹ?f< (t,2դ Ȯi"(Z̴CqE'B HdRY>0dTbcn@ EAEp2{4*?Z1hIPy^h.Ә6B|XM.+McR[(T!']݄<Хihڞd*ho2ՠ`"QT I>3PG mQCQ"Ab1ZU|VKp!n`^m:WW y|6}w;Zj+jEuːc7 HU+if{R-˺nn@tiB~:ZZ|XC~ -+DYŒh|-o+#qw WHW6bK;@pftm')`Aŧ` P!j<&AQ$lKS#H zkӸZɥ?J4@~ހY/:8K IKPZ)l!(Q#B۠qSV0tm2z\j :?׹y.EN.gjQl2 8H@M;^t"q6A%VZg"j { u#5I #gQ'&* e oJb h| Rh@BJŃ\4@A^OyK+G DԠZ>U__wgf/zٓ $Ϩ T1WlڃֱTqQ)I5vm`@ 3_}S:>~B Hwlق<1oG[>̹u4s{ ަ978<.a9.K{k!IKk(ec՞wAljq|ɮfwE]lkQjP87o/C%08_jr&t7n& E}DG1Z.Э%vėO;# 0 :yq5y~ߋ=ev^W~^<A$%{?]wʗ_iVB0CpWYB>p6&ag?:M!#OjP)ؙپ^8Z4*RT}nG{>dlYu]vjslk ɻS$mK$}Peכ6νqQp`C FA h=,P-91fy,=`װiH >ziƺvR*R.B%f3#c:hep<VN7"N)>o{w4 6zT6\^jZI-Ta`B0 U?%ѩ[ҟ sA@E(@Ұx(=`qYn6ҥ}` Xm]*ݍ:A,]D*>}!\IvnP d&V6ǀfqY3გԦg PЖJ(kP* pƒە23EޢUoƙj+W)A/Q螖Rxq%tKyV}A9-g Fr0J~trk64F~vly>?*̓ofr8=vN;'GY찹_{xh?~<t|siNlR476ng kL~oi6i6S|u;4d_'<>^d/ msy|.).m'Qɗxtۇ|GJO\~'/?~˻zx'o/]5볿ejawsE* 1.w?6h;E?rUoZ{1ZSTf!ưOWُ0lϿ-Uq,w]>ښknɳp\dXtuzp͝yJc>.d^4ha6>ZH|t0IINr? V0>>)Ri|sC{3 ӓ1cWvht#$1׆;wΥSkwsVv!{͊::?=s CxK_̇?Nn0‹^,6f(+`=Fy38*qCg%7 Ҧ?G׻]2\=7Cy?  o2yG4ȧwUq>[Yo>:ca!Bw<_7oga)ηpm6=y?~{;XzkX9߮o"sg3gs[t.@L&xhL=g|0KX-3 |َy3hy؟=y[[Ƨj<J/n}=ʻ43@4|)6^sLӥ1>z/ͽ2ro^Cl_ [=^.ؤ_7BoOE|ޜ zY|c<>4t7p|>='}`V#sv.sGEŦi?EW' &_^&~1M쾶^[m/jpcٳPߡ*]d/%n%z |K`v^K+zu~0{mGGGBىt%BB/tnK8e:"C]7s O(È=1,#rğpD̓ 9Ac` &gAz :s /Z0gA΃/s `EÚ9?uRF} "Z>(mA9 DŽ8rTBA:o+%'r!M~ܵ`ei]^0hCB4-؅=짋l51pc2y鞗ɳq!q2iʚ;vzc{ܳ m[1wOÈ)ZOV9ˈ""XeDU)EF{ rە/k'`|̴O?\jY|b {TtkQ7~ͦP\`_rtbx'n4GO^Ѕl5.ct`Q[⍚`=s`,W1+ z¼ S@&Ϧq}sm^o?/"YM^5G[KŰ^O^o@/(?7+S_ンGy46fp4j^*dEXJx!)wt~Hn!l6Cq!|PtB~%"KN^^zV3::/l|m'SVct~{ʍǓ+\xܚ|>ܚ5&]_6ŭi>nͭGBΥ߳6.?+ռYiХϧY5z^ZBӛ͜^\7/t u@G[åXTc՜GaW:Y\`ѣ$t}vX'cKyjJOR ht}c'9?>5k@3'ibچfn '퓆?'O,c'͆xLjFOPp8]AU{[Ó;Y'/=w-w0W`?mV嗙.nt>L'Ì ˸:ti-D+k0wif؋vj,bꗴq5z4\ܰ;fBf{Y+=&ag8.'4kNgx4:ٶs~tڟvw|Qygz|2jg8Jgs,mG;lUUSvJxzWnx목f㈕uDQ͍cV#˖[n<ޖCZ_1˭ĥ-h9K, agش3hdl9ls&GSml_K >3եh& ]nIn]]ᾰ嗭7c;ɊG 3Cfk|ӑ}17GX-czuh}pL. '͌ ,6l:MO/nbgh`:S0ICنGd:j6S uvь 1qw2q6+hxxxj%sOΆV0g{:b͘?XA]Sm[cG|>e34+xxi]N&OM`\ *?:~sGIӡۼD1A~Ӽ,k6qcO˹gCү'߾Ti|?hՙ꧛0ÝFݟOC+~﻽wzXʚ].>ֳ+XiǪ [h߶?^eOx8zdp3`zr2=><9=ϸys/}3= W-R?{lo?PM.d,)Ýɻ˥Ѥ]3w'ivx?7j4ƨ{Ow_19f{:Eߛ-koۨ7w;b?t4߭~Ϳ|<<5>>[[V~|t0<;A^NNm-PɊֵֵ9;KG ʟN֩?|:oΎ-t>xtN3&Gͽ_tTU8s@[mOuy th Aóug8C8AlK|y8 qmanvyv_ŋ–`o`iڼ_WX|H8O82:>hެd<}- sCv4Ӄ+ ˦d: ft>:Y GGK>v뼽{3A}R=}RW>噏\/㔿2WcvDL(N j||ι{6]Fq]ͮqhlv^-6jxw»\3;ܛ=ޥKz7۳]y^s vLzxant޼{өY؇u49prw8^};[;SŸ-vxiz?g2|_5h?4)_Z~ lo I>n<[ {s1=L/1?otVs |֌dۦɤ5̷@yrǴ맹0L R0wnƞ#@{ƅ[׮?@R߸Y"o=&λ,F❜(o#r3ݓN; 13o_|c2hfm_mڡM'cw˧X|L+6wRF䏣/[X?&܀Wf'NgO/H=׳ڡg>yn[ q/g4w7ӧӟ ;ԑyi;>Nk]?,y6G;5KbS·k'{6=7PYvW͙<#+A\NsIcwNv3B|ܬ\秃v{7&XW4+Dcw;'ұ6F.긞 ަ{kK%4;ם?;a^rދ<;n܄3lK\0JիϺwgˋsw6;fmq~ceM8o3&vyť[ze棑m%pagZ[77 nϱm[ιKIcG9<7~ˣا?}|zt0mn;ܬ[?bŬ?oo@|wsrK"{cF%9g,7;ϚM}Լ+k, ơtzйlYP.6x^ςS[_,bil뿼4Տf=~^Ż~*ś}'~_GAyI2͵G&=4czGb>=8<ڸoWk|}5ۓ|XyzZ՗W2&l=ۯayO땻{g_u{__|kuz'`=W=sX ~/y罿=۴_ڍڭՕ;7'eo.3xRq|W~;~'ow>~~9w_O?Oge}ѕ7G/Gݨ,/fWf'k5#WfX~%zKRqypz7>xˏ߭s4v/ś_KpVH}^_/?Ml> zp? _ٵ~}yf)YХLr?{lF3JÏMt/|7ݼe^W?mo-Kmm/^{n7+w}εjqş[o}ŕ=3GGewp@\{WWWn^͗zo?..X_{k~6NGW~zrpk42Oun?(\GfwN뿭]~28}~x~qYO?Ӏy{@ɖe[m^ueBjI/˥Y6}fy.3KnB$@  10 ;a.0e@b85qoވi#us_e`+[ 87IK#gWQx4ʨxE`5Vy'\#yx.{Vyʝ-h oͦ=ѴDOG h*1|j^(\v-tȆKS82k0E]C=ȤS=grӞ.nkMyyb2>wԎu*\ݗLg5>spdC?Dl~ 놔=8=L)~~ȮGx͍E:m5{K)oi5q]e1@R{g|RQ%xZaئfn&=kI'.PD|.0ӅyL,'NS1r8Zlu7靹usq=5:lUz@2cQj4I/F]Cn1lD::%[VOh ; lbw[`UC?$ $V0 d)#r RZ.~Dz8ը p5<ʠ¿N6Ap) ʬgw4/R \7JjuсMMz·85j{LiuȐvMHjte8eOn&jTՠ4T!ϩqiøjF0z#2-\3G 4_bn8ZŊ*5pcϤ Hw//;˪%wTa{Jޭ{X٫֝PUl*Q<ؔ╯a\ldhuh+_3ϻ}S}|i*Mm%~_`(k/ T-ݠ^ҌLIp8d*{ڱd~5}7\;ؼ5J4^wwu~O: Eus.\$tUKS_{F 'PAk]J =ug[&}q舞G#=c#T|>Atc$hkOer8u02%[.Wza)'/l1ݺG0#uTi5b+왤Nh 7QALAa7[9Oj$2_TKt*>pl &‡SMt#]W.=3ʐ] s`$7{|"v؄KDrR;N6Bn{S! =֫Tvt--drCJQA*WnNcW)D"ݝ{bnkEi0S-fG㡌qjHo)?/FVTm5zO{39eO⣋jdVa瓃b}?m)[H- D|a7Syr1"'ks&2ъ;Ʈv5n⑝Cjɏ#lG``4^K*xvmvZUjt47 AǧV׀H2\xڗ'NNYgbd0ZEʾ*֨V(4.#IhΡU0 z;'3h@ǖts*O2ˁxpiiuD2\j3hEB3޶$뇙P_Zt>(Q14=I޶Ĩ żb{f;GR4/6Jǫ4ޝ[ON֏ gCYFl[r$~s^g3%E?!퉟awqh75֟] f~h|"'ȁ=(vN( R;hgӻޅ6.oJ+mbLp`I+HY+497 ùxi(h~C9kKg ƃ 2I/DxR#? 4roOLE!|GhZ.}FU/.=̵(]_^jɒ$W1Q1,惜zU5cmRDL$bۊ %sHk%T`jewxZ|n+5jk"^ .4sb/wukȯvj{չ"^!N{|/+s ZVΛIӒgdӭ3ַ6Fsxxϴ%Œ-ۑqN#fs'<}}Z!<UVg=._}~rU|{gЛt15bgzv+rzH\.Y\db9TӀ$mm5[\ٕbawqhҩ*# "d2'B$Η۝Ü:]n.uR@8|Τvۧ)w?O ~d-LWFT$ZQ'46\>stream ">=NX|_ qBl:zzYd:W/R.lPv;0ֆz|.{u]qDT!޽i݈LsѠ{/^T2YM)h Z2uk  u"];t¸: :c@#rHLm#. LvUӻ;=tIߝvoJ>܀j^'bמe|?6$z.#I>.^tfǮ԰.kgt!9> yWi'=n.Q{spGŸ<.uVnkX8n' vmMJ6.KӨuGo@!9p|6AeAɎu,] ?TnL+\1:fOmyPp ̄k VnWսju2V{](WB}׏qkЗEHt~>qv-pn[E 31oߛV2 1ow9G?J 9,H NX!}ޥoT:_^ >Dn\Ykg(͊d7[;c̷׹+,q74k{Dt z h$U|8Ŭ{:xgպ_.ΫhMNxf0YjͅSZ[X_^u7niY3c5ֶ2ѭ 'oyŗI' 5siM昵j:qwC{l6l<@rn,tY2^) F;wwک]ͯVG)Bb׼ǨVTM~*7V5ُk ͏iڶZYŜWKaTkQ*ryWG_}ؖF l[}k]mTh2nkG=w HE'%i]/l YF\{&s݌b?c|w\LOwrZpotx`Q}øޜ ،::z0۳1ydb]w)+Y pjzP4 n¹؞?N0ܛܚzW7hɀ#0Ia3b]:9x&ί/=/Oruһ 22m{)0_['֏l'íAX[['~lNcv;*H ON'ᮞa&y^RW+JG3͵`RD49XK=PhVwjf^ؘsj_u)w&nJ\;5gNP.nFml6Y~mnRbɨݨN4ÁAcf=Da5j{)şܸ%GCR d?^sСTu2NjSڂ05JxlKK\iy^mjF_zsSʢʈF/T(kPϥBN;#izUavS /6Y-ϒaRVi[kAWeqt0එU9bO[k3NX-oo3{C2&+8*Blk. ;vjyzkF.klz+,= Ge.}ɮK3^};K,iva3#ABN;&IE\ L, H$[ v븟Y5Pڰk,$V#Ƹu'oZN#WxNT5 |>ϥT( Q{Mʩ̥IjZ[ʦ䁄A3MBLPwzMmqOEզx9$jcMdjd=хz+K_TSCGٶe5L%iLUS 1M4-u+LKv%Zrv  !T0^9QDNW<XINϮ u0I=H\3,I9:%X]`u#D\ ԵDRIcHKRܒdXNy :TF˳KTw/K{gԐ=U,c,[1$5Co&ٽiV-HhdFlCeo%ƠY"S0/CY-WLR͈ e.ZW3^p."^tc#/,#08:ec1|RT, f!wD/+#Ts !IuSW`$:Nu]=eti|^)[ GCf`6fAQpcۡEhN҆gVՋ٬(*ovF1_R}Q-_B+ZQ=WdQ({ZnIb|G.ia%- 繤jT4r>)9, P Dt]ڠԯٲ GEP~qȈҼ" 30іRh(W-I!ݫ@Ϝ89iJ|dPK[6 􌐒piZGcY UUI'ڌ~ܠ(-2@{9^#%Y, &-jnyn9mjFe [ԐiT\qV8e{q+[PZjԇPy&D櫦nDU-hRjm2o1~q+I#Ќ@;o}>]B,1RKlđ?ŌUKalEu?R!4ϧ: J:ZƋ+k)WY䁅4T'؜.i҂DDDƴ 25\Ҵv/[%X3ڈ9fьj,)MH4ЀBzmEpno[[FAzdkҿQ)Mtʯ\P%1i|QnsTjTFP1\,)`j kZ4L t YSXFE:w{Bޘlt>~.6|\>I:?Oo*O5iRH5iS+O5S+Mjjkҥ.V|^e:6壭hvޕfg'# DۤSyX@QNLuįa FC5UN:sl1PCOF-a:}4WYCU@iPS@Ihڄ@ޠ${dУdfi- VbP3tG-,OiaheV3.D'2>8p[{όcvM DyfᝮCVFC֤;;@ժME+z:#qiwp#Oklw1keF:B-N&/=̮5;ݶ¨S1ysM[޸@bZe!8TKKI^i|.8v.&IH=N.0 \+xĈBJD f"*:^ϠMrF~-6j2TZ/;XzfOa|hdYOWx$MCP$SJ U'lJ3F}F=5Lc&UYObҵJ3bUf}TW"O;$O]fbI.$T36B+3?@:kbeቹC6D4]PMdB%rԹ^{DWB(ո O!cKJtOr#';#C3r Qє&j78ycS)MS碜̷ys]!WPٚZ͖Lh+\dGFM}R$ݓSP-L]R)FT7 åag327ҒD?MQѓ(f͓}'4չM^6 iU% ;3j{^\oĘڈp)B Ng8}9Ud!U`$Usf6k͢PJY)bɜ%)Mk6KGUpYGs is=V|_> c$_T22VqWmrW.AsoŒC@4apپۭR'3wuGĶUmqTAp ldG)Jj 0ښyA8TjbK z\z=*r>McR1Fs3ϘQlr*ff{CQH֩4_ &R4Hz\`$FhSIC%dDbLvQ-f5e0}9;bn'ar2ћwBEuxmK`MIPH :1fypv`))/vMW(&Uvd71PNwOC-87ԳZ,ϥVX<A$]d; W2/86PE鎦:[5뷮[C8;EJ۝dv9;Fj oXhy2siF65UM6[mSkjM*(R9r<ȡ>F"b#]}皍)SC˫,s&9=.s97g]\k}^>tS'VZ#9͹ZKxإ& {5xOb:s  ܜŵ/nj"yљ:/ˈO3ĆmLa ]W&}jVY!6/T4)9zZӔ$M`*/pg %DB[$r1ZF QP9JUYfG0ۤsE@yX&q!1ҢRUHK.KHײ)>1ҵ 6j-ӑX5 ZP֪mj{xw5He{Zc#f@i7&RI.e'pOnZnjIlM ̭|nT:DQO]ʹ:x MDB|g!ҤvY^B[RJQe%nb(/,_ceT[1tt&RMDN+3/QKErKiTU!^;HK3td' ,0M}X%>騒A 1K+bfR>ߔXZ%FPn^& S% zSFIv3OC5l,"@U{<Ƨ4΁eW|!Cp2V;eFdkqavDeW9PQŁ\37xh`-Zx?PWFVu!WTZ၇ٮ2<4t{!ѫO%<"JRz`ʅqhoU\PTu!#]zaCR,̘x]6mAQr)z4>BZuK1Ս<,B}Q%Uq!&N"fYVOӄ< ?Ҫ;P0m)Jx*Et M3Vjs!bgLbv".sxh$hZm<&&*fh xU遇e:+=𐟿dfWyi(r>5U478uPLdcz@&9aі13hh:OX'F]lu;;;#}gmkvx tU4UkiOX †+Sh {u/d V3jkdRVǙ" 2dMS=C=Z<y#1oa/;ҋt~8>^/G)@bٕ&P7]J;n2?۟<ܿH^G}ޥSO`3y= C~iph {~dfzrhbc D{Wo n.߿t6b1k|nwp7; 7{]>ꆧ}H1}gZ\ d7v{UJ{S\x,iyd#᨜.n8 Mn$( ϻqygO 8½u)_l#:6b}vJ(GuʮNGEz y\UVwÃx4x8VfW˱B|tqqK[qw*â[@*7b"{ 2' ;-;ߚfu@ڱ) vCݤ͕҅fgHǿݼ r,)[ h;Q\酥fG ͐RYWR( qИIT(<&S!DqGR7SC*;X%b{D[G0pKfHW@ѯ*]_"v|*>}q>iTlZصDp2:H;+HXȓ?O|瑱15 y8h:-zE7=! "ojfu8k`׍B`HyV]>o6$&$ K$&4hl@xՍ= =@c4F"Ő|!Sg%u/5o%L_$͓2t㴮 W}(oL=Te ]kP[3peBr3jnxV.NI)!y}~4)7"2E[/l13x,O!p8% "Uv {ؔ.9Wyw:~[귝RMhyEgRx!tϜ6 . J֚%-FNr7p$ EcdPP5 uCآs w R,=;uJԘҖZ[83ф73Oɐ>*[Mxo;\@@-þ>*5Fj;nǨ27etU81hr M [|Fzf,>s~vMx>n.wigѤ9jEoJvGWQ7Jڇ)&>-S$ 9ko&0֣N"b`NtZS +҉ ~]X% ŮaW{ 9!D.iǬ҂NbAo Iv7b4hcw S`{_zkZ?1/ :=U#@ipILv쐨vJF>E{rɭ*"zq:"\Y( zMٖ'nҮuVՒ}Nduv 5h55 ]чuib%ФaUiu Z=kVT4͊=fmOE&##_Ճ4dqoZݛ{sqE%]zwVTH4.-ٜGf,$45mRSuG탼Ӟ@^ 2?$ya\1WnlHJqv~VYRɩ{PrD'װP@kݘÅ+8S % 5'%rDcۭS^(ȍjnGGdSA)hoTC9b1clQUIy;{/ltDYv]FAT(jERW(re3.1Fm.57`% 9?gm2)Mmg`Dw:YwƆ*aH;pMvP~eH3}:`g~{m ؆U{& Ư;poA#7LʠBDv3&D ZSPj#{aqM$ҖZwᙠ8Ydذ+Dbi6dAgY(ho-[Hs#^GõU@<vupn29^ioR;J]<^ IQ>en֋#0͏֮V2٥Iea#. 5HJo`9~~~-$\!.PqhPah7(A4N !`l=@_o#ݛ㋱'р>"wC]c;M d||qg Mo<_L//O-ޑcGmgl܄&n65ῥ755 `}RO§};;wV}wн^73ۅ"t"M wˣw&VBH(!~W8t#;wat~GQ7rJ { nvj{'wK ^~Wmy{q_WܾN$ tPZ xhC]oD<55!!mKZO60i~W#֏Y]o:{7ayU +e5no'0րG%6ECM&<ᡒ6vSֲ[>k|WAD{n˯*_7 =WkCZcM@VspkBל0™V/8{4$=tpVdm{ i;SkFx|@m2ަ-W?B2+=l/|(SwBXSq_Gt;ݍ9=|гu1"|BgCod53?߆p,e-Fr{1F-hwO5/aSo_jyn/WzCc@gaLZ%NN3{cF"XkoPigTpI$ B.%L$\ɼt/1?%q5ӖOb^J k_Tg,W=ڻ=/<24Z[蜠oQ层I?`K•bz5w+Xz@W33iRx)6۪߰b=Ȓw{_2Mq&2Dynq&L"_C1tJ]`!XDx!Gs^R5{kh`Z>WnM/oY~<oi)ѴvY@|qa-uήF-΢gRoX& Ø^l0Au+?\IW?iJg1Z|F[?erwc>~Ӹucmm[~ѻՃMn tW?ئ;iF;)]83G1o~rv {DOYFb,> 2adAB⹇9B s;-_?;o"@ח.[@ugug-_;_u-~{y h?DEfm= X77mhۊ}w{Z)_=hSu޹}Ѧ gOb8ݘ9@th?j/g-]U]-_M߯տ_%.|]T_h떿j!8#8 d  yztLjF} a/ =M˿lYF3OXS ߣ34~?16UBI$'aO}0/EZ~7a]6CY-XxeUYFf8$&7B vb]:1W.68Wcp'F } ai'0z Lh=!a~C嫨B/_ t0i~~\XW L=`(x#\C?^/V²Zgg } rzw"] ay>l'# O R!|3ƈJ`(0{/+,[T|<$;7% DOG5sn_X_/ڝzKtOٯ=4BNql;A;%@2e_3 _s2L-px 9x-_hMLjFx ^rЫW)46@9clA4wGw2ܜ[떿i DqF_Oݳ n, z,w~ ;.g;==ĺXW2] w{:_/9T|wq#8Nt=~T׏4~v,&`"·S&g>ŠUf{{o,?#+Lフzё;~RL3֥5x{/sݞ֗ F6v?NЈCuq>I}А>s̰ΉyW42y->bh}c̪VtZybOy]YsI>aQ~O4台p xCz,+x^|-9>u Ile@N[mAi>@8-6Oz&GY=epX'meHc}ovN!KO8%/ZR}=oi#>NaO:hYՈ?Oۀ -dY$6CEt˧t81Wi e;/r0:f*{,_$xk!x$[5–z,w/VB-B:j07yY4XSsT^엂nbX/F"آ@^V|Fy™g^=uXPsDl'D9<Q]{Fon0@H,$ٟ{juPE:h5^q^@l_cZy t+2Ac=TLd%}j,uW-Y+M,^ʒכ~NC݆ŋjQ?S 8o#iy ^`ֲ,%X:' Cf6:INИ+?'^rLޗ)c/y_A݆GM_s?o@ Ww@^5w@CB\C\A[~O|YKm^ X {(=9ݔ*%ݴ|]%o06;l{o7 MD{7ͱv!HhZcN99RkW8>0šv5LxkfKzɺhZWTlun:{,k\+')~W>WVt7`?5BMRsTa:ࡥXS08vHtD9mA_W6L]є؇F+%`laMiEbToo}s,"n㥚cpftP2, fu7X|%2n( zȣm"^gSq-z˾rZR̕3<y۸I4:*@h?%{W{=@{?v_bp@'=im @?*g-= Ų}е>*5F4k,Rʭo*n8bºj *W߀Ǟ}㞓G{`gf낷hCߍ}T8Fr CySe$slg#GtPlNS6a:D}{ǣoz7y^Lp5~%)C 7J!~SЖR<aAOfk3(z'_0cdNqx{';|r4!W6=&krLчqRO)PQA >`Tl*0UFEˑxYzjX/O:#GwzX.Vx3{U=DU/5Y*>wޫ?K8#{Ej^'O"i9<+J +[3e,auh?:~SɿVxZSx$}{7W[_|t=0nO=pDw. CGrB8עy(O6=k7< f2em~J{ktTI_{W۶ 7w k]c쭀uQ`]`XC' >fox=_, ŻX1K0I9\כ(ASbAo Ͼ:|{Xgc+ @i9C~{~@W$@?)WF3Of8`F֊Fsi9E,ýMQA{kǼ; KS {I8IX&)Es?tU/sw=s?;;3}re3xCfk~ ن*ﷀUB, [dsPV:x'=VrƄu\uGWQ?x $}:C/\u<$ta6+WWI'y7"L(nYͬL$7So`">~_--ܩip1z_n ~~a4.<8QlxLvxtČ6h/Ō֎ztob $@T&]4v4ޘ{9ڍk|N1y|XG H7:U9|@3.&82'f1]fVcfk@_gO}y,[^Q|[ S&7!}tt=s?֔7g΃*'ْ.̈>Į7u$@<i~A9r3|=OΠ7}鑆W on43Jg7obخ6lg}V}QTٌlt^Ħ˚;3hDKT_y{,:ÓQY}㓰1Տ֮oogn2CODW}E+nnv\37е#LHl| _(u"}go9d 3GFHbfcS.cMcXgx{e߾E>zS}U =?oag]жK5ua쳒Wl]ѹcIؗk#WnX,|&f25 w#}M|=Lq8CBΦ=> B>68 m_?B $okϘro,ekeDeMf}7Z;FkLfkJyFýK~oHGY`}Aۧo~U8C O|!X#g!5ɴ PvrިqQߍN0_3c&PUu:$Vf8d$1} >9@W@OP7Zm\ocQc{B:BN`?e)i>(X͕2KAcgW YN:JGIK#/b컠nvA a>f|66yFmWx/ݯ(qmoj7f~rV97gp7\Jԯ |~I68lC7mC` b܀@7]l@$4?>rHa6Ø*#mfCt+ wF^^beVZz.%qUg@xOA~oX~W4wohm\@ֈ>D-ix/Go`?)>,g|Y%鮑$ve2Fa+Y[:Yx=&ۏ𪵶wS 8CH-sE 3HN@H,ab[9kCf7}"v} 3?l%GXaa7fdu~TQOJx >'K9X{R@Uֈ] $ĶA,%9S8 m y)w6Ə%h(2QDL~E{zJ&})NJ Ý`o?«>=£2x [$G`o# }> Rپt=g;5,B\=0?b~k/` ?ށi,ù >⿥L b3 A|情3Q^Ƣcf4áY֯HK$@)E ~TKs?O /gR/<ǘx{mg7CQBhleOjl@}/'FWxx-lYee[VyFhoXI}4(6oO>x|iq*>:1m=ln࿒:g$|I)}weFDhLVY "_V =4Qd.%T~Tlbg//g/nXx4mc?<\چ} ôm TΆ$$A=ɽLW=C5k,־Y9"4_Ȩ<뇙MP_KD W1h TۇzJ0Mb8 RRYW,BcxŢYbV=8T1aIoA}!6IއGS˾pkz[`Uwb> r@ g8ݾ*yto3 ]k+͞-fc]fqfi03~-|}bƛ/|6.G|%{b7Y tQZD'^:ެp~787/:<(y"fs˛WΌG(p/T9GU}x~ xK ee {"t=8ж`ᥟ{вm1ÆOG>ϊ-\w_^].6_ g%=_*Č26K-ߋ^ 91 |X9n<|Dsi,=,^6evUl"r.>7}nz^/Lޫm.Ka#؃d7ȝ'v՜M`(tw]'xd9NtmWJ屒yxDd?o4yuދm@ V=bA4"y d/3xxȚH"coTёjIO.l nّp2X^)~F?'fi6Ga)N"kNxبLlDR |cxo8訐'4B>O } rLɹWW3)&ƛ3fEh^l,0¯fu(:*;帤g>7l7~i9ǯL?T}` h1m8^n~g%a*:7fFP?9vT kYN"d-ڣu6ߏHy #"(}g=M7z{0&qIOG9njj F_==g7gcqb+޺3'3aެ^OJq"*ވ|2ހ̳]Gp63NOHX/^ v77o?_0%ZSf~9GaEK> 7f}eM=6ś ,o%>go^!_|kz}u;u=&wUD׭6DPoD34ݨ`2i 6M8V %N8P$h4ZeR#FEQ TL*ߒTLRC^wom18]} {_5yԖ.߭}֏?5Ϸa>|pbd Cz_s:vx{[ۧr x=xӃcZԎjLmAƦ_͛I2$ŌC3[Cc^t%V>>wk?i-mޓ7KD Nkm-jG;?śnkg^"; YTcp{ lY1a)(Yc2t~Kf_uphc7)oۄ$6o/߶gpv??{:EyXgm71|":'[;>` /(Bk{}}2E}MNS̀7߰o-|=}[8uWv*{WgG߭F\uX5H<=]?iL3$obpʼn!X.҇~g5.9nHoS[o{-[8|5Ps gI@w+ܮxXfT ñzmbq|w.=X %! +7ͳxk-?y=;R<k˻vkYt/y]C>;>540㒉 S1׏Bkc:~;bx+į1:aS7݃ Nw({^b;R}\iS;|)u~y۹.۷{.q[o!=ݳkBgHBkCw o9ǧob3k> W$xœq)sn쏹d]ݞw m#ad|W 3åk]bQaO|}Tv#5{ΞWꯜdpqy?m3\oG]ϸF]/|\Y1]tW?cY7~+Vṱ';̬ !K.筞 VOW_;;q4V`~Wm2a7^1<##>ׇ8l>08 Ů(Cv\|go_`mL\.{2"|5.e^g7+hGV|E-T<7;=ߌiY}۾^d-kaHGCc?¤7C'&Ca>s _<,r ekM?"BLjFy!o5|yEa. Mm{gQΆu1ꏗ}A}tgk55O\X-jfU Bs(.j~b`[҃x*s scRQpf]ϸP1sx}Zأz~Jk_|ANMMcru:, =dHCrpkg \$8n['L}lQ:N8{ڕYno~I={~5=c !]agOdB>b雫Ck}쨾C7tq9^փ;>loy~Xر1t8v(n[>8 y:sy<߯xͼ쩿6#s,0X3x+?ktkkRluqOS̻F ąGW>5![-Q1=1js7m5XǶ뙟gÎ2OوlٸrP+o uルsЯp{7ٟ b֢9dCb8wE¥1l1r)Yϳdo 63]wk_|o3?u鳢_b5uɭZ/W =: 0׷C+͐L}ra`7 aז<!|z–Zޣ~ ŨxfߎM`;'3 soiۍ`s>Yv|/q w.|bvV_ϧ?PTIGgꎳLr>qe~F~`&.R½o4w]g׹ebt9LJL[l_qf_1jk3kl=sϘˆx{Sx+#]NP`ghp;0gnȾK%g[_Co!vq~8S}y7 {;sǶXͬ`iN k$^m~4+X#^!./_oG!gݟ\M~v0ik\kl^xxo!셸5}N9t2fFY~Ov;~ѹOqk~,}p#o`L³[ll썇hL;:0P s¹: ٟи97F!,tdz^ctå#qհUri>}"xоϷ15[ijn%7:aGwo`c1me'6?듥 g15vCt01}izmlyn{Xk.k'O{$q˜p"X3{-mK`T;'6ء8o#|x ٻ>b7fC|?|xivg=C寞8r_p)1S׀l15>wco6~gG=ŝ?6SϲwԼax^ݐn=ǹbE0p+a(џoga[ .=CJC96`7Ӽyj;eƖg~gj}l ϒ`M?gGN ; =8C)6M]NqwCf1ŐoW~)-pWC/|4n|G10nힿ{X+^ѡ5Y[X1w}q2e-跴}H\ywjg_z+݆y[벳gqc+cEa? 1G9mu[N2kX??3w=mH3^f}1ƿ{{Cyv<2۸n(+@??/䟹5s-yڽopvs!3oymלCa@>=}bcYbCֱ< grxBcZr^coۺry.<<~ S@^fCg_gfpy{ ^[)ޣ`p2ւww9-|}_cx3e srh~c/X'iω<<_''c8gC]cyݺ_2àY/eP׊k׬UָZ/Y|㵽o)~GtKnm[괝>g]4M껩4l!z"\w䲃?'t >svW|)Y4,#Ʒ912<8]Ǻ'?[ؿ&ʛ#[jn iN~0XiF;mK%}j3oDŽÈI3d>gJfxIW\{ؚkO|ØEx;á{ )9$5S&ϧ6ؚӵ0g\ad|Zg8紈O'ݚ?S9µ3x>`+Y3ElkX.WBy5=>=}yՓߴ=$h }فoh@Mir$P|[gYݱאk麭u5b oC >&md^` ?'_P[c]1PoBՓ6Xorό-<&m?058:)`ks/ z`0Hx^|ZF?/}haOy)8+kB2u 6; XX1y=&5'}FIKÓ| 3OgnO¹:z]=g;<l4"kGW |Ǜz&l |&\ˆk\ׁhFl].&cGvy.6.&SƇ5r}kO^ew'a,vW4YgLc~p-Kv.Ҿl=7b?Ӂ=G_~( =|җEڄ"zW;>dӡqsBLV.>]|EVvwS!fQc>m5*e?<7X-Oy#e~`>_o?CLF}|k7ccj.V[lz}O /ژd]x~A!Ι^S ^~S1uQ\~w,Gm>Hjq]W.=}im66ˏi:OFy,F/*We]^,u5kJ >giKkXZی4.c\$dzvS6m|y>Lb4Ÿ*4YȉM3E>I[&c9<t6%HQff\Wd帑i=>ͩdɸԙhiތ3=l󤲩'V6$b:¾|Ռs=nD]'۬RS\iڟy-bʓSrIiI槜hj Ic^R&g% d\5U# $F/&SmtT*,i<'"&KGt2mR*d` e9KDҤzDz, F.0)BE2H 'ed\u2~@R5c_9ʲtdI˪De6AdܯJFԤ"SmAYWԊE&֞(C2*-ABB\*j4m)is.JwD"iY(}H>L:,/%=WD& 5xRSemAKA'8 Bb&sR=L4Gk$I iDOSÉ#g (,mpACtDWm%0RL0)jWX #1 0氼H :TvLaVꝥlKxX!$fK+Q\T:i=<-x¤ wR#\n/wZF̉FɥVaUZ#k5:WrhzBeĬB:ڹfڴP(7DZS9oS\`F:hL8%l0 dڒ$naEѴIوf054s ֭%ŤTnI& ,M;WgcH0e1jTɤ5%~Ah\F ΫR Q\'jZFUKE^4mԏ(ԈOZS)wRh;l> 1YJ`Ja$wq nTFuF.boiy%+5Tr¶dDDli3)F v,omջ<]^vVmn#?eR]觞Mm=a󕻷^seW\ʫGkgl;ԭGݡ'|j2HMc9W7WxԳv\+w\bxU;^k˯ؽcʟF^W\kt x54=ᨣNySEp endstream endobj 7 0 obj [6 0 R 5 0 R] endobj 29 0 obj <> endobj xref 0 30 0000000000 65535 f 0000000016 00000 n 0000000156 00000 n 0000038957 00000 n 0000000000 00000 f 0000061346 00000 n 0000061413 00000 n 0000431500 00000 n 0000039008 00000 n 0000039406 00000 n 0000061825 00000 n 0000061712 00000 n 0000041997 00000 n 0000041117 00000 n 0000041435 00000 n 0000041483 00000 n 0000061596 00000 n 0000061627 00000 n 0000061480 00000 n 0000061511 00000 n 0000061899 00000 n 0000062183 00000 n 0000063645 00000 n 0000071026 00000 n 0000136615 00000 n 0000202204 00000 n 0000267793 00000 n 0000333382 00000 n 0000398971 00000 n 0000431529 00000 n trailer <<3A254DDB04EC5841BDABC0217DC87556>]>> startxref 431702 %%EOF camp-0.8.1/doc/images/logo_camp.svg000066400000000000000000000154041315645501200171410ustar00rootroot00000000000000 camp-0.8.1/doc/images/logo_package.bmp000066400000000000000000000623321315645501200175750ustar00rootroot00000000000000BMd6(9d . .մƴwuwuwuwuwuȶՙ\Z8g5/a-0b/0b00c21d31d31d31c10b//a./`,/`,/`,i?q@w@}@@@??@@@@}?w?o=d9V5qD1d3/`,/`,][:{Q:Wj6wJ0c1/`,pnd=i?r@??????????????????????????@z;]2g6/`,nlsAwA}?????????????????????????????@=f3j;/`,zx???>??????????????NœYƢdʨwг[ƣ?????????>@m7uJii436 # # #('+WVYwvyrrtLKN$#' #*),! $ #XWZ # # #! $||~ #*)- #/.2 # # # # # # # #ͲqƨiĤI??KI????zѵӸE????@u:Wip~} # # ##"&~rrt"!%QQT #??B$$' # # #SSV #*)-TSV # # # # # # # # # #϶yȬoƦK???????eʩ\ǤVš@@RÞԹC???Ay;]kx # # # # # # # # # # #! $ # # #547 # # #! $ # # # #Ѻ~ʯrƩM???ּF???h˪tϱK?Nœ????Az<`l{ # # # #ttv548 #XWZ # # #104$#' #UTW # # # # # # #-,0 # # # #˱vȪӹrΰPÝ?PÝջ???Nœl̬E??A{B # # #*)-˕н˲[Ÿ@QÞJJXƢ@???@so # # # #&%) # # # #! $ #669"!% # # #zy| #ONQ # # #! $ # # # #zz| # # #&%)ۜθjťD?sϱxгi˫ֽؽGB???@?qʶ # # # #ggi #VVYUUX # # #MLO215"!%cbe # # #'&*669 # # # #"!% # # # #=A?p+*. # # #PPS ###&#"& # # #OOR #! $ # # #wvy #%$( # # #::= # # # #{{} # # #104̠ÉͶcĢB?CH?ֽE?????A}bsru # # #$#'A@C #0/3 # # #-,/onq # # # #%$(326 # # # #TSV # # # # # # # #ǙҿyɭN??SğTğ??????B{('+ # # #ooq # # # # #utw # # # #sru # # # #mlo # # # #|{} # # # #ͧƎϸeģE??qΰ{ҵ?????>@P # # #! $HHK'&* # # # # # # #"!%326 # # # # # # #@?C # # #:9=̣Ā˰XB????????>@ӿ! $ # #%%(GFI #ooq # # #JIL # # #ggi # # # # # # # # # # #Գ͚ҿtǪP@?ANœ????@?>X0/2 # # #DCFaac&%) # #}} # # # # #! $,+/ # # # # # #MLO]\_DCG # # # #edgҰˑϺlŦJ??IЃԺh˪fʪfʪqΰbɧ????A@?@쑑CBF # # # # # # #326zz|JIL #,+/HGJIILeegGFJ@@C77:77:77:77:77:77:77:77:CBFmloӭɌθgģI??XŢߌ׿Rß??????????@CE@?ֿ廻޿ӬɊͶfģJ@??????????????@FKF?pˬܿӪȉͶhĤL@????????????AHQOC[ƢծʏϹoƧQA??????????CNXZžO]ǥִ͙Ҿzɭ\ G@??????AIWbácâ\ŸhɩغѣĈ͵nƧUF@??BIVdâlťlťfãеղ̞ͶuȫfĤ_á_áfģoƧwȪyȬwǪqƧԴͦƛмιηͶ̴ʰ϶ؾӵͫȢĚϻѽظ϶Ͻcamp-0.8.1/include/000077500000000000000000000000001315645501200140655ustar00rootroot00000000000000camp-0.8.1/include/camp-xml/000077500000000000000000000000001315645501200156035ustar00rootroot00000000000000camp-0.8.1/include/camp-xml/common.hpp000066400000000000000000000061311315645501200176050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_XML_COMMON_HPP #define CAMP_XML_COMMON_HPP #include #include #include #include namespace camp { namespace xml { namespace detail { /** * \brief Serialize a CAMP object into XML elements * * This function uses a proxy class that defines a unified * interface for creating and populating XML nodes. To * provide support for a particular XML library, you just * have to provide a specialized Proxy which maps the * unified interface to the library's API, and call this * function. * * \param object Object to serialize * \param node Parent for the generated XML nodes * \param exclude Tag to exclude from the serialization process */ template void serialize(const UserObject& object, typename Proxy::NodeType node, const Value& exclude); /** * \brief Deserialize a CAMP object from XML elements * * This function uses a proxy class that defines a unified * interface for reading and iterating over XML nodes. To * provide support for a particular XML library, you just * have to provide a specialized Proxy which maps the * unified interface to the library's API, and call this * function. * * \param object Object to serialize * \param node XML node to parse * \param exclude Tag to exclude from the deserialization process */ template void deserialize(const UserObject& object, typename Proxy::NodeType node, const Value& exclude); } // namespace detail } // namespace xml } // namespace camp #include #endif // CAMP_XML_COMMON_HPP camp-0.8.1/include/camp-xml/common.inl000066400000000000000000000152361315645501200176060ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ namespace camp { namespace xml { namespace detail { //------------------------------------------------------------------------------------------------- template void serialize(const UserObject& object, typename Proxy::NodeType node, const Value& exclude) { // Iterate over the object's properties using its metaclass const Class& metaclass = object.getClass(); for (std::size_t i = 0; i < metaclass.propertyCount(); ++i) { const Property& property = metaclass.property(i); // If the property has the exclude tag, ignore it if ((exclude != Value::nothing) && property.hasTag(exclude)) continue; // Create a child node for the new property typename Proxy::NodeType child = Proxy::addChild(node, property.name()); if (!Proxy::isValid(child)) continue; if (property.type() == userType) { // The current property is a composed type: serialize it recursively serialize(property.get(object).to(), child, exclude); } else if (property.type() == arrayType) { // The current property is an array const ArrayProperty& arrayProperty = static_cast(property); // Iterate over the array elements std::size_t count = arrayProperty.size(object); for (std::size_t j = 0; j < count; ++j) { // Add a new XML node for each array element typename Proxy::NodeType item = Proxy::addChild(child, "item"); if (Proxy::isValid(item)) { if (arrayProperty.elementType() == userType) { // The array elements are composed objects: serialize them recursively serialize(arrayProperty.get(object, j).to(), item, exclude); } else { // The array elements are simple properties: write them as the text of their XML node Proxy::setText(item, arrayProperty.get(object, j)); } } } } else { // The current property is a simple property: write its value as the node's text Proxy::setText(child, property.get(object)); } } } //------------------------------------------------------------------------------------------------- template void deserialize(const UserObject& object, typename Proxy::NodeType node, const Value& exclude) { // Iterate over the object's properties using its metaclass const Class& metaclass = object.getClass(); for (std::size_t i = 0; i < metaclass.propertyCount(); ++i) { const Property& property = metaclass.property(i); // If the property has the exclude tag, ignore it if ((exclude != Value::nothing) && property.hasTag(exclude)) continue; // Find the child node corresponding to the new property typename Proxy::NodeType child = Proxy::findFirstChild(node, property.name()); if (!Proxy::isValid(child)) continue; if (property.type() == userType) { // The current property is a composed type: deserialize it recursively deserialize(property.get(object).to(), child, exclude); } else if (property.type() == arrayType) { // The current property is an array const ArrayProperty& arrayProperty = static_cast(property); // Iterate over the child XML node and extract all the array elements std::size_t index = 0; for (typename Proxy::NodeType item = Proxy::findFirstChild(child, "item") ; Proxy::isValid(item) ; item = Proxy::findNextSibling(item, "item")) { // Make sure that there are enough elements in the array std::size_t count = arrayProperty.size(object); if (index >= count) { if (arrayProperty.dynamic()) arrayProperty.resize(object, index + 1); else break; } if (arrayProperty.elementType() == userType) { // The array elements are composed objects: deserialize them recursively deserialize(arrayProperty.get(object, index).to(), item, exclude); } else { // The array elements are simple properties: read their value from the text of their XML node arrayProperty.set(object, index, Proxy::getText(item)); } index++; } } else { // The current property is a simple property: read its value from the node's text property.set(object, Proxy::getText(child)); } } } } // namespace detail } // namespace xml } // namespace camp camp-0.8.1/include/camp-xml/libxml.hpp000066400000000000000000000121771315645501200176130ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_XML_LIBXML_HPP #define CAMP_XML_LIBXML_HPP #include #include namespace camp { namespace xml { namespace detail { /** * \brief Proxy that adapts the camp::xml functions to the libxml library */ struct LibXml { typedef xmlNodePtr NodeType; static NodeType addChild(NodeType node, const std::string& name) { return xmlAddChild(node, xmlNewNode(0, reinterpret_cast(name.c_str()))); } static void setText(NodeType node, const std::string& text) { xmlNodeSetContent(node, reinterpret_cast(text.c_str())); } static NodeType findFirstChild(NodeType node, const std::string& name) { const xmlChar* convertedName = reinterpret_cast(name.c_str()); NodeType child = xmlFirstElementChild(node); while (child) { if (xmlStrcmp(child->name, convertedName) == 0) break; else child = xmlNextElementSibling(child); } return child; } static NodeType findNextSibling(NodeType node, const std::string& name) { const xmlChar* convertedName = reinterpret_cast(name.c_str()); NodeType sibling = xmlNextElementSibling(node); while (sibling) { if (xmlStrcmp(sibling->name, convertedName) == 0) break; else node = xmlNextElementSibling(sibling); } return sibling; } static std::string getText(NodeType node) { return reinterpret_cast(xmlNodeGetContent(node)); } static bool isValid(NodeType node) { return node != 0; } }; } // namespace detail /** * \brief Serialize a CAMP object into a libxml xmlNodePtr * * This function iterates over all the object's properties * and transforms them into valid XML nodes. Composed sub-objects * are serialized recursively. * * \a node is the parent node to which the generated child nodes * will be appended. * * You have the possibility to exclude some properties from the * generated output with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the serialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to serialize * \param node Parent for the generated XML nodes * \param exclude Tag to exclude from the serialization process */ inline void serialize(const UserObject& object, xmlNodePtr node, const Value& exclude = Value::nothing) { detail::serialize(object, node, exclude); } /** * \brief Deserialize a CAMP object from a libxml xmlNodePtr * * This function iterates over all the object's properties * and read their value from XML nodes. Composed sub-objects * are deserialized recursively. * * You have the possibility to exclude some properties from * being read with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the deserialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to fill with deserialized information * \param node XML node to parse * \param exclude Tag to exclude from the deserialization process */ inline void deserialize(const UserObject& object, xmlNodePtr node, const Value& exclude = Value::nothing) { detail::deserialize(object, node, exclude); } } // namespace xml } // namespace camp #endif // CAMP_XML_LIBXML_HPP camp-0.8.1/include/camp-xml/qtxml.hpp000066400000000000000000000110541315645501200174620ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_XML_QTXML_HPP #define CAMP_XML_QTXML_HPP #include #include #include namespace camp { namespace xml { namespace detail { /** * \brief Proxy that adapts the camp::xml functions to the QtXml library */ struct QtXml { typedef QDomElement NodeType; static NodeType addChild(NodeType node, const std::string& name) { QDomElement child = node.ownerDocument().createElement(name.c_str()); node.appendChild(child); return child; } static void setText(NodeType node, const std::string& text) { node.appendChild(node.ownerDocument().createTextNode(text.c_str())); } static NodeType findFirstChild(NodeType node, const std::string& name) { return node.firstChildElement(name.c_str()); } static NodeType findNextSibling(NodeType node, const std::string& name) { return node.nextSiblingElement(name.c_str()); } static std::string getText(NodeType node) { return node.text().toStdString(); } static bool isValid(NodeType node) { return !node.isNull(); } }; } // namespace detail /** * \brief Serialize a CAMP object into a QtXml QDomElement * * This function iterates over all the object's properties * and transforms them into valid XML nodes. Composed sub-objects * are serialized recursively. * * \a node is the parent node to which the generated child nodes * will be appended. * * You have the possibility to exclude some properties from the * generated output with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the serialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to serialize * \param node Parent for the generated XML nodes * \param exclude Tag to exclude from the serialization process */ inline void serialize(const UserObject& object, QDomElement node, const Value& exclude = Value::nothing) { detail::serialize(object, node, exclude); } /** * \brief Deserialize a CAMP object from a QtXml QDomElement * * This function iterates over all the object's properties * and read their value from XML nodes. Composed sub-objects * are deserialized recursively. * * You have the possibility to exclude some properties from * being read with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the deserialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to fill with deserialized information * \param node XML node to parse * \param exclude Tag to exclude from the deserialization process */ inline void deserialize(const UserObject& object, QDomElement node, const Value& exclude = Value::nothing) { detail::deserialize(object, node, exclude); } } // namespace xml } // namespace camp #endif // CAMP_XML_QTXML_HPP camp-0.8.1/include/camp-xml/rapidxml.hpp000066400000000000000000000112231315645501200201330ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_XML_RAPIDXML_HPP #define CAMP_XML_RAPIDXML_HPP #include #include namespace camp { namespace xml { namespace detail { /** * \brief Proxy that adapts the camp::xml functions to the rapidxml library */ struct RapidXml { typedef rapidxml::xml_node<>* NodeType; static NodeType addChild(NodeType node, const std::string& name) { const char* allocatedName = node->document()->allocate_string(name.c_str()); NodeType child = node->document()->allocate_node(rapidxml::node_element, allocatedName); node->append_node(child); return child; } static void setText(NodeType node, const std::string& text) { node->value(node->document()->allocate_string(text.c_str())); } static NodeType findFirstChild(NodeType node, const std::string& name) { return node->first_node(name.c_str()); } static NodeType findNextSibling(NodeType node, const std::string& name) { return node->next_sibling(name.c_str()); } static std::string getText(NodeType node) { return node->value(); } static bool isValid(NodeType node) { return node != 0; } }; } // namespace detail /** * \brief Serialize a CAMP object into a rapidxml xml_node<> * * This function iterates over all the object's properties * and transforms them into valid XML nodes. Composed sub-objects * are serialized recursively. * * \a node is the parent node to which the generated child nodes * will be appended. * * You have the possibility to exclude some properties from the * generated output with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the serialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to serialize * \param node Parent for the generated XML nodes * \param exclude Tag to exclude from the serialization process */ inline void serialize(const UserObject& object, rapidxml::xml_node<>* node, const Value& exclude = Value::nothing) { detail::serialize(object, node, exclude); } /** * \brief Deserialize a CAMP object from a TinyXml TiXmlElement * * This function iterates over all the object's properties * and read their value from XML nodes. Composed sub-objects * are deserialized recursively. * * You have the possibility to exclude some properties from * being read with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the deserialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to fill with deserialized information * \param node XML node to parse * \param exclude Tag to exclude from the deserialization process */ inline void deserialize(const UserObject& object, rapidxml::xml_node<>* node, const Value& exclude = Value::nothing) { detail::deserialize(object, node, exclude); } } // namespace xml } // namespace camp #endif // CAMP_XML_RAPIDXML_HPP camp-0.8.1/include/camp-xml/tinyxml.hpp000066400000000000000000000107341315645501200200250ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_XML_TINYXML_HPP #define CAMP_XML_TINYXML_HPP #include #include namespace camp { namespace xml { namespace detail { /** * \brief Proxy that adapts the camp::xml functions to the TinyXml library */ struct TinyXml { typedef TiXmlElement* NodeType; static NodeType addChild(NodeType node, const std::string& name) { return static_cast(node->InsertEndChild(TiXmlElement(name.c_str()))); } static void setText(NodeType node, const std::string& text) { node->InsertEndChild(TiXmlText(text.c_str())); } static NodeType findFirstChild(NodeType node, const std::string& name) { return node->FirstChildElement(name.c_str()); } static NodeType findNextSibling(NodeType node, const std::string& name) { return node->NextSiblingElement(name.c_str()); } static std::string getText(NodeType node) { return node->GetText(); } static bool isValid(NodeType node) { return node != 0; } }; } // namespace detail /** * \brief Serialize a CAMP object into a TinyXml TiXmlElement * * This function iterates over all the object's properties * and transforms them into valid XML nodes. Composed sub-objects * are serialized recursively. * * \a node is the parent node to which the generated child nodes * will be appended. * * You have the possibility to exclude some properties from the * generated output with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the serialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to serialize * \param node Parent for the generated XML nodes * \param exclude Tag to exclude from the serialization process */ inline void serialize(const UserObject& object, TiXmlElement* node, const Value& exclude = Value::nothing) { detail::serialize(object, node, exclude); } /** * \brief Deserialize a CAMP object from a TinyXml TiXmlElement * * This function iterates over all the object's properties * and read their value from XML nodes. Composed sub-objects * are deserialized recursively. * * You have the possibility to exclude some properties from * being read with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the deserialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to fill with deserialized information * \param node XML node to parse * \param exclude Tag to exclude from the deserialization process */ inline void deserialize(const UserObject& object, TiXmlElement* node, const Value& exclude = Value::nothing) { detail::deserialize(object, node, exclude); } } // namespace xml } // namespace camp #endif // CAMP_XML_TINYXML_HPP camp-0.8.1/include/camp-xml/xerces.hpp000066400000000000000000000132271315645501200176120ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_XML_XERCES_HPP #define CAMP_XML_XERCES_HPP #include #include #include #include namespace camp { namespace xml { namespace detail { /** * \brief Proxy that adapts the camp::xml functions to the Xerces library */ struct Xerces { typedef xercesc::DOMElement* NodeType; static NodeType addChild(NodeType node, const std::string& name) { XMLCh buffer[256]; xercesc::XMLString::transcode(name.c_str(), buffer, sizeof(buffer)); NodeType child = node->getOwnerDocument()->createElement(buffer); node->appendChild(child); return child; } static void setText(NodeType node, const std::string& text) { XMLCh buffer[256]; xercesc::XMLString::transcode(text.c_str(), buffer, sizeof(buffer)); node->setTextContent(buffer); } static NodeType findFirstChild(NodeType node, const std::string& name) { XMLCh buffer[256]; xercesc::XMLString::transcode(name.c_str(), buffer, sizeof(buffer)); xercesc::DOMNodeList* children = node->getElementsByTagName(buffer); if (children && (children->getLength() > 0)) return static_cast(children->item(0)); else return 0; } static NodeType findNextSibling(NodeType node, const std::string& name) { XMLCh buffer[256]; xercesc::XMLString::transcode(name.c_str(), buffer, sizeof(buffer)); xercesc::DOMNode* sibling = node->getNextSibling(); while (sibling) { bool same = xercesc::XMLString::compareString(sibling->getNodeName(), buffer) == 0; if ((sibling->getNodeType() == xercesc::DOMNode::ELEMENT_NODE) && same) return static_cast(sibling); sibling = sibling->getNextSibling(); } return 0; } static std::string getText(NodeType node) { const XMLCh* text = node->getTextContent(); char buffer[256]; xercesc::XMLString::transcode(text, buffer, sizeof(buffer) - 1); return buffer; } static bool isValid(NodeType node) { return node != 0; } }; } // namespace detail /** * \brief Serialize a CAMP object into a Xerces DOMElement * * This function iterates over all the object's properties * and transforms them into valid XML nodes. Composed sub-objects * are serialized recursively. * * \a node is the parent node to which the generated child nodes * will be appended. * * You have the possibility to exclude some properties from the * generated output with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the serialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to serialize * \param node Parent for the generated XML nodes * \param exclude Tag to exclude from the serialization process */ inline void serialize(const UserObject& object, xercesc::DOMElement* node, const Value& exclude = Value::nothing) { detail::serialize(object, node, exclude); } /** * \brief Deserialize a CAMP object from a Xerces DOMElement * * This function iterates over all the object's properties * and read their value from XML nodes. Composed sub-objects * are deserialized recursively. * * You have the possibility to exclude some properties from * being read with the last (optional) parameter, \a exclude. * If it is defined, any property containing this value as a tag * will be excluded from the deserialization process. It is empty * by default, which means that no property will be excluded. * * \param object Object to fill with deserialized information * \param node XML node to parse * \param exclude Tag to exclude from the deserialization process */ inline void deserialize(const UserObject& object, xercesc::DOMElement* node, const Value& exclude = Value::nothing) { detail::deserialize(object, node, exclude); } } // namespace xml } // namespace camp #endif // CAMP_XML_TINYXML_HPP camp-0.8.1/include/camp/000077500000000000000000000000001315645501200150055ustar00rootroot00000000000000camp-0.8.1/include/camp/args.hpp000066400000000000000000000116471315645501200164630ustar00rootroot00000000000000/**************************************************************************** ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** 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. ** ****************************************************************************/ #ifndef CAMP_ARGS_HPP #define CAMP_ARGS_HPP #include #include namespace camp { class Value; /** * \brief Wrapper for packing an arbitrary number of arguments into a single object * * camp::Args is defined as a list of arguments of any type (wrapped in camp::Value instances), * which can conveniently be passed to all the CAMP entities which may need an arbitrary number of arguments * in a uniform way. * * Arguments lists can be constructed on the fly using one of the constructors (accept up to 5 arguments): * * \code * camp::Args args(1, true, "hello", 5.24, myObject); * \endcode * * ... or appended one by one using the + and += operators: * * \code * camp::Args args; * args += 1; * args += true; * args += "hello"; * args += 5.24; * args = args + myObject; * \endcode * */ class CAMP_API Args { public: /** * \brief Default constructor (empty list of argument) */ Args(); /** * \brief Construct the list with 1 argument * * \param a0 Argument to put in the list */ Args(const Value& a0); /** * \brief Construct the list with 2 arguments * * \param a0 First argument to put in the list * \param a1 Second argument to put in the list */ Args(const Value& a0, const Value& a1); /** * \brief Construct the list with 3 arguments * * \param a0 First argument to put in the list * \param a1 Second argument to put in the list * \param a2 Third argument to put in the list */ Args(const Value& a0, const Value& a1, const Value& a2); /** * \brief Construct the list with 4 arguments * * \param a0 First argument to put in the list * \param a1 Second argument to put in the list * \param a2 Third argument to put in the list * \param a3 Fourth argument to put in the list */ Args(const Value& a0, const Value& a1, const Value& a2, const Value& a3); /** * \brief Construct the list with 5 arguments * * \param a0 First argument to put in the list * \param a1 Second argument to put in the list * \param a2 Third argument to put in the list * \param a3 Fourth argument to put in the list * \param a4 Fifth argument to put in the list */ Args(const Value& a0, const Value& a1, const Value& a2, const Value& a3, const Value& a4); /** * \brief Return the number of arguments contained in the list * * \return Size of the arguments list */ std::size_t count() const; /** * \brief Overload of operator [] to access an argument from its index * * \param index Index of the argument to get * * \return Value of the index-th argument * * \throw OutOfRange index is out of range */ const Value& operator[](std::size_t index) const; /** * \brief Overload of operator + to concatenate a list and a new argument * * \param arg Argument to concatenate to the list * * \return New list */ Args operator+(const Value& arg) const; /** * \brief Overload of operator += to append a new argument to the list * * \param arg Argument to append to the list * * \return Reference to this */ Args& operator+=(const Value& arg); public: /** * \brief Special instance representing an empty set of arguments */ static const Args empty; private: std::vector m_values; ///< List of the values }; } // namespace camp #endif // CAMP_ARGS_HPP camp-0.8.1/include/camp/arraymapper.hpp000066400000000000000000000202261315645501200200430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_ARRAYMAPPER_HPP #define CAMP_ARRAYMAPPER_HPP #include #include #include #include #include namespace camp_ext { /** * \class ArrayMapper * * \brief Template providing a mapping between C++ arrays and CAMP ArrayProperty * * ArrayMapper must define the following members in order to make T fully compliant with the system: * * \li \c ElementType: type of the elements stored in the array * \li \c dynamic(): tells if the array is dynamic (i.e. supports insert and remove) * \li \c size(): retrieve the size of the array * \li \c get(): get the value of an element * \li \c set(): set the value of an element * \li \c insert(): insert a new element * \li \c remove(): remove an element * * ValueMapper is specialized for every supported type, and can be specialized * for any of your own array types in order to extend the system. * * By default, ValueMapper supports the following types of array: * * \li T[] * \li boost::array * \li std::vector * \li std::list * * Here is an example of mapping for the std::vector class: * * \code * namespace camp_ext * { * template * struct ArrayMapper > * { * typedef T ElementType; * * static bool dynamic() * { * return true; * } * * static std::size_t size(const std::vector& arr) * { * return arr.size(); * } * * static const T& get(const std::vector& arr, std::size_t index) * { * return arr[index]; * } * * static void set(std::vector& arr, std::size_t index, const T& value) * { * arr[index] = value; * } * * static void insert(std::vector& arr, std::size_t before, const T& value) * { * arr.insert(arr.begin() + before, value); * } * * static void remove(std::vector& arr, std::size_t index) * { * arr.erase(arr.begin() + index); * } * }; * } * \endcode */ /* * Generic version -- doesn't define anything */ template struct ArrayMapper { }; /* * Specialization of ArrayMapper for built-in static arrays */ template struct ArrayMapper { typedef T ElementType; static bool dynamic() { return false; } static std::size_t size(T (&)[N]) { return N; } static const T& get(T (& arr)[N], std::size_t index) { return arr[index]; } static void set(T (& arr)[N], std::size_t index, const T& value) { arr[index] = value; } static void insert(T (&)[N], std::size_t, const T&) { } static void remove(T (&)[N], std::size_t) { } }; /* * Specialization of ArrayMapper for boost::array */ template struct ArrayMapper > { typedef T ElementType; static bool dynamic() { return false; } static std::size_t size(const boost::array&) { return N; } static const T& get(const boost::array& arr, std::size_t index) { return arr[index]; } static void set(boost::array& arr, std::size_t index, const T& value) { arr[index] = value; } static void insert(boost::array&, std::size_t, const T&) { } static void remove(boost::array&, std::size_t) { } }; /* * Specialization of ArrayMapper for std::array */ template struct ArrayMapper > { typedef T ElementType; static bool dynamic() { return false; } static std::size_t size(const std::array&) { return N; } static const T& get(const std::array& arr, std::size_t index) { return arr[index]; } static void set(std::array& arr, std::size_t index, const T& value) { arr[index] = value; } static void insert(std::array&, std::size_t, const T&) { } static void remove(std::array&, std::size_t) { } }; /* * Specialization of ArrayMapper for std::vector */ template struct ArrayMapper > { typedef T ElementType; static bool dynamic() { return true; } static std::size_t size(const std::vector& arr) { return arr.size(); } static const T& get(const std::vector& arr, std::size_t index) { return arr[index]; } static void set(std::vector& arr, std::size_t index, const T& value) { arr[index] = value; } static void insert(std::vector& arr, std::size_t before, const T& value) { arr.insert(arr.begin() + before, value); } static void remove(std::vector& arr, std::size_t index) { arr.erase(arr.begin() + index); } }; /* * Specialization of ArrayMapper for std::list */ template struct ArrayMapper > { typedef T ElementType; static bool dynamic() { return true; } static std::size_t size(const std::list& arr) { return arr.size(); } static const T& get(const std::list& arr, std::size_t index) { typename std::list::const_iterator it = arr.begin(); std::advance(it, index); return *it; } static void set(std::list& arr, std::size_t index, const T& value) { typename std::list::iterator it = arr.begin(); std::advance(it, index); *it = value; } static void insert(std::list& arr, std::size_t before, const T& value) { typename std::list::iterator it = arr.begin(); std::advance(it, before); arr.insert(it, value); } static void remove(std::list& arr, std::size_t index) { typename std::list::iterator it = arr.begin(); std::advance(it, index); arr.erase(it); } }; } // namespace camp_ext namespace camp { namespace detail { /** * \brief Helper structure to check at compile time if a type is an array * * This structure check if the specialization of ArrayMapper for the * template parameter T exists (i.e. the ElementType member is properly defined). */ template struct IsArray { template static TypeYes check(typename U::ElementType*); template static TypeNo check(...); enum {value = sizeof(check >(0)) == sizeof(TypeYes)}; }; } // namespace detail } // namespace camp #endif // CAMP_ARRAYMAPPER_HPP camp-0.8.1/include/camp/arrayproperty.hpp000066400000000000000000000177541315645501200204570ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_ARRAYPROPERTY_HPP #define CAMP_ARRAYPROPERTY_HPP #include namespace camp { /** * \brief Specialized type of property for arrays * */ class CAMP_API ArrayProperty : public Property { public: /** * \brief Construct the property from its description * * \param name Name of the property * \param elementType Type of the property * \param dynamic Tells if the array is dynamic or not */ ArrayProperty(const std::string& name, Type elementType, bool dynamic); /** * \brief Destructor */ virtual ~ArrayProperty(); /** * \brief Get the type of the array elements * * \return Type of elements */ Type elementType() const; /** * \brief Check if the array is dynamic * * If the array is not dynamic, the insert and remove functions * are disabled. * * \return True if the array is dynamic, false otherwise */ bool dynamic() const; /** * \brief Get the current size of the array * * \param object Object * * \return Number of elements in the array * * \throw NullObject object is invalid * \throw ForbiddenRead property is not readable */ std::size_t size(const UserObject& object) const; /** * \brief Resize the array * * If \a size is lesser than the current size of the array, * the last elements will be removed; if \a size is greater * than the current size of the array, default-constructed * elements will be added at the end. * * This function will throw an error if the array is not dynamic * * \param object Object * \param newSize New size of the array * * \throw InvalidObject object has an invalid value * \throw InvalidAccess array is not writable or not dynamic * \throw InvalidIndex index is out of range */ void resize(const UserObject& object, std::size_t newSize) const; /** * \brief Get an element of the array for a given object * * \param object Object * \param index Index of the element to get * * \return Value of the index-th element * * \throw NullObject object is invalid * \throw ForbiddenRead property is not readable * \throw OutOfRange index is out of range */ Value get(const UserObject& object, std::size_t index) const; /** * \brief Set an element of the array for a given object * * \param object Object * \param index Index of the element to get * \param value New value to assign to the element * * \throw NullObject object is invalid * \throw ForbiddenWrite property is not writable * \throw BadType \a value can't be converted to the property's type * \throw OutOfRange index is out of range */ void set(const UserObject& object, std::size_t index, const Value& value) const; /** * \brief Insert a new element into the array * * This function will throw an error if the array is not dynamic * * \param object Object * \param before Index before which the new element will be inserted * \param value Value of the element to insert * * \throw NullObject object is invalid * \throw ForbiddenWrite array is not writable or not dynamic * \throw BadType \a value can't be converted to the property's type * \throw OutOfRange index is out of range */ void insert(const UserObject& object, std::size_t before, const Value& value) const; /** * \brief Remove an element from the array * * This function will throw an error if the array is not dynamic * * \param object Object * \param index Index of the element to remove * * \throw NullObject object is invalid * \throw ForbiddenWrite array is not writable or not dynamic * \throw OutOfRange index is out of range */ void remove(const UserObject& object, std::size_t index) const; /** * \brief Accept the visitation of a ClassVisitor * * \param visitor Visitor to accept */ virtual void accept(ClassVisitor& visitor) const; protected: /** * \see Property::getValue */ virtual Value getValue(const UserObject& object) const; /** * \see Property::setValue */ virtual void setValue(const UserObject& object, const Value& value) const; /** * \brief Do the actual retrieval of the size * * \param object Object * * \return Size of the array */ virtual std::size_t getSize(const UserObject& object) const = 0; /** * \brief Do the actual resize of the array * * \param object Object * \param size New size of the array */ virtual void setSize(const UserObject& object, std::size_t size) const = 0; /** * \brief Do the actual reading of an element * * This function is a pure virtual which has to be implemented in derived classes * * \param object Object * \param index Index of the element to get * * \return Value of the index-th element */ virtual Value getElement(const UserObject& object, std::size_t index) const = 0; /** * \brief Do the actual writing of an element * * This function is a pure virtual which has to be implemented in derived classes * * \param object Object * \param index Index of the element to get * \param value New value to assign to the element */ virtual void setElement(const UserObject& object, std::size_t index, const Value& value) const = 0; /** * \brief Do the actual insertion of an element * * This function is a pure virtual which has to be implemented in derived classes * * \param object Object * \param before Index before which the new element will be inserted * \param value Value of the element to insert */ virtual void insertElement(const UserObject& object, std::size_t before, const Value& value) const = 0; /** * \brief Do the actual removal of an element * * This function is a pure virtual which has to be implemented in derived classes * * \param object Object * \param index Index of the element to remove */ virtual void removeElement(const UserObject& object, std::size_t index) const = 0; private: Type m_elementType; ///< Type of the individual elements of the array bool m_dynamic; ///< Is the array dynamic? }; } // namespace camp #endif // CAMP_ARRAYPROPERTY_HPP camp-0.8.1/include/camp/camptype.hpp000066400000000000000000000156171315645501200173520ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_CAMPTYPE_HPP #define CAMP_CAMPTYPE_HPP #include namespace camp { namespace detail { template struct StaticTypeId; template const char* staticTypeId(const T&); CAMP_API void ensureTypeRegistered(const char* id, void (*registerFunc)()); } /** * \brief Macro used to register a C++ type to CAMP * * Every type manipulated by CAMP must be registered with CAMP_TYPE, CAMP_AUTO_TYPE or their NONCOPYABLE versions. * * Example: * * \code * class MyClass * { * class MyNestedClass * { * }; * }; * CAMP_TYPE(MyClass) * CAMP_TYPE(MyClass::MyNestedClass) * \endcode */ #define CAMP_TYPE(type) \ namespace camp \ { \ namespace detail \ { \ template <> struct StaticTypeId \ { \ static const char* get(bool = true) {return #type;} \ enum {defined = true, copyable = true}; \ }; \ } \ } /** * \brief Macro used to register a C++ type to CAMP with automatic metaclass creation * * Using this macro rather than CAMP_TYPE will make CAMP automatically call * the provided registration function the first time the metaclass is requested. * This is useful when you don't want to have to manually call an "init" function to * create your metaclass. * * Every type manipulated by CAMP must be registered with CAMP_TYPE, CAMP_AUTO_TYPE or their NONCOPYABLE versions. * * Example: * * \code * class MyClass * { * public: * * static void registerMetaClass(); * }; * CAMP_AUTO_TYPE(MyClass, &MyClass::registerMetaClass) * * void MyClass::registerMetaClass() * { * camp::Class::declare("MyClass") * ...; * } * \endcode * * \sa CAMP_TYPE */ #define CAMP_AUTO_TYPE(type, registerFunc) \ namespace camp \ { \ namespace detail \ { \ template <> struct StaticTypeId \ { \ static const char* get(bool checkRegister = true) \ { \ if (checkRegister) \ detail::ensureTypeRegistered(#type, registerFunc); \ return #type; \ } \ enum {defined = true, copyable = true}; \ }; \ } \ } /** * \brief Macro used to register a non-copyable C++ type to CAMP * * Disabled copy and assignment cannot be detected at compile-time, thus users have to explicitely tell CAMP * when a type is not copyable/assignable. Objects of a non-copyable class can be modified through their metaproperties, * but they can't be written with a single call to replace to whole object. * * Every type manipulated by CAMP must be registered with CAMP_TYPE, CAMP_AUTO_TYPE or their NONCOPYABLE versions. * * Example: * * \code * class NonCopyable : boost::noncopyable * { * int x; * }; * CAMP_TYPE_NONCOPYABLE(NonCopyable) * * class MyClass * { * NonCopyable* nc; * }; * CAMP_TYPE(MyClass) * * MyClass c; * const camp::Class& m1 = camp::classByObject(c); * const camp::Class& m2 = camp::classByObject(c.nc); * const camp::Property& p1 = m1.property("nc"); * const camp::Property& p2 = m2.property("x"); * p1.set(c, NonCopyable()); // ERROR * p2.set(p1.get(c).to(), 10); // OK * \endcode * * \sa CAMP_TYPE */ #define CAMP_TYPE_NONCOPYABLE(type) \ namespace camp \ { \ namespace detail \ { \ template <> struct StaticTypeId \ { \ static const char* get(bool = true) {return #type;} \ enum {defined = true, copyable = false}; \ }; \ } \ } /** * \brief Macro used to register a non-copyable C++ type to CAMP with automatic metaclass creation * * Using this macro rather than CAMP_TYPE_NONCOPYABLE will make CAMP automatically call * the provided registration function the first time the metaclass is requested. * This is useful when you don't want to have to manually call an "init" function to * create your metaclass. * * Every type manipulated by CAMP must be registered with CAMP_TYPE, CAMP_AUTO_TYPE or their NONCOPYABLE versions. * * \sa CAMP_AUTO_TYPE, CAMP_TYPE_NONCOPYABLE */ #define CAMP_AUTO_TYPE_NONCOPYABLE(type, registerFunc) \ namespace camp \ { \ namespace detail \ { \ template <> struct StaticTypeId \ { \ static const char* get(bool checkRegister = true) \ { \ if (checkRegister) \ detail::ensureTypeRegistered(#type, registerFunc); \ return #type; \ } \ enum {defined = true, copyable = false}; \ }; \ } \ } /** * \brief Macro used to activate the CAMP RTTI system into a hierarchy of classes * * This macro must be inserted in both base and derived classes if you want CAMP * to be able to retrieve the dynamic type of polymorphic objects. * * Example: * * \code * class MyBase * { * CAMP_RTTI() * }; * * class MyDerived : public MyBase * { * CAMP_RTTI() * }; * * MyBase* b = new MyDerived; * const camp::Class& mc = camp::classByObject(b); * // mc == metaclass of MyDerived * \endcode */ #define CAMP_RTTI() \ public: virtual const char* campClassId() const {return camp::detail::staticTypeId(this);} \ private: } // namespace camp #endif // CAMP_CAMPTYPE_HPP camp-0.8.1/include/camp/class.hpp000066400000000000000000000267741315645501200166430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_CLASS_HPP #define CAMP_CLASS_HPP #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include namespace bm = boost::multi_index; namespace camp { template class ClassBuilder; class Constructor; class Value; class ClassVisitor; /** * \brief camp::Class represents a metaclass composed of properties and functions * * camp::Class is the main class of the CAMP API. It defines a metaclass, which * is an abstract representation of a C++ class with its own properties, * functions, constructors, base classes, etc. * * Classes are declared, bound to a C++ type and filled with the \c declare * template function. * * \code * class MyClass * { * public: * * MyClass(); * int getProp() const; * void setProp(int); * std::string func(); * }; * * camp::Class::declare("MyClass") * .tag("help", "this is my class") * .constructor0() * .property("prop", &MyClass::getProp, &MyClass::setProp) * .function("func", &MyClass::func); * \endcode * * It then provides a set of accessors to retrieve its member functions and properties. * * \code * const camp::Class& metaclass = camp::classByType(); * * const camp::Property& prop = metaclass.property("prop"); * const camp::Function& func = metaclass.function("func"); * \endcode * * Another way to inspect a class, which is more type-safe, is to use a ClassVisitor. * * \code * MyVisitor visitor; * metaclass.visit(visitor); * \endcode * * It also allows to create and destroy instances of the bound C++ class. * * \code * MyClass* obj = metaclass.construct(); * metaclass.destroy(obj); * \endcode * * \remark All function and property names are unique within the metaclass. * * \sa Enum, TagHolder, ClassBuilder, Function, Property */ class CAMP_API Class : public TagHolder, boost::noncopyable { public: /** * \brief Declare a new metaclass * * This is the function to call to create a new metaclass. The template * parameter T is the C++ class that will be bound to the metaclass. * * \param name Name of the metaclass in CAMP. This name identifies * the metaclass and thus has to be unique * * \return A ClassBuilder object that will provide functions * to fill the new metaclass with properties, functions, etc. */ template static ClassBuilder declare(const std::string& name); public: /** * \brief Return the name of the metaclass * * \return String containing the name of the metaclass */ const std::string& name() const; /** * \brief Return the total number of base metaclasses of this metaclass * * \return Number of base metaclasses */ std::size_t baseCount() const; /** * \brief Return a base metaclass from its index * * \param index Index of the base to get * * \return Reference to the index-th base metaclass of this metaclass * * \throw OutOfRange index is out of range */ const Class& base(std::size_t index) const; /** * \brief Return the total number of functions of this metaclass * * \return Number of functions */ std::size_t functionCount() const; /** * \brief Check if this metaclass contains the given function * * \param name Name of the function to check * * \return True if the function is in the metaclass, false otherwise */ bool hasFunction(const std::string& name) const; /** * \brief Get a function from its index in this metaclass * * \param index Index of the function to get * * \return Reference to the function * * \throw OutOfRange index is out of range */ const Function& function(std::size_t index) const; /** * \brief Get a function from its name * * \param name Name of the function to get (case sensitive) * * \return Reference to the function * * \throw FunctionNotFound \a name is not a function of the metaclass */ const Function& function(const std::string& name) const; /** * \brief Return the total number of properties of this metaclass * * \return Number of properties */ std::size_t propertyCount() const; /** * \brief Check if this metaclass contains the given property * * \param name Name of the property to check * * \return True if the property is in the metaclass, false otherwise */ bool hasProperty(const std::string& name) const; /** * \brief Get a property from its index in this metaclass * * \param index Index of the property to get * * \return Reference to the property * * \throw OutOfRange index is out of range */ const Property& property(std::size_t index) const; /** * \brief Get a property from its name * * \param name Name of the property to get (case sensitive) * * \return Reference to the property * * \throw PropertyNotFound \a name is not a property of the metaclass */ const Property& property(const std::string& name) const; /** * \brief Construct a new instance of the C++ class bound to the metaclass * * If no constructor can match the provided arguments, UserObject::nothing * is returned. * The new instance is wrapped into a UserObject. It must be destroyed * with the Class::destroy function. * * \param args Arguments to pass to the constructor (empty by default) * * \return New instance wrapped into a UserObject, or UserObject::nothing if it failed */ UserObject construct(const Args& args = Args::empty) const; /** * \brief Destroy an instance of the C++ class bound to the metaclass * * This function must be called to destroy every instance created with * Class::construct. * * \param object Object to be destroyed */ void destroy(const UserObject& object) const; /** * \brief Start visitation of a class * * \param visitor Visitor to use for visitation */ void visit(ClassVisitor& visitor) const; /** * \brief Convert a pointer to an object to be compatible with a base or derived metaclass * * The target metaclass may be a base or a derived of this, both cases are properly handled. * * \param pointer Pointer to convert * \param target Target metaclass to convert to * * \return Converted pointer * * \throw ClassUnrelated \a target is not a base nor a derived class of this */ void* applyOffset(void* pointer, const Class& target) const; /** * \brief Operator == to check equality between two metaclasses * * Two metaclasses are equal if their name is the same. * * \param other Metaclass to compare with this * * \return True if both metaclasses are the same, false otherwise */ bool operator==(const Class& other) const; /** * \brief Operator != to check inequality between two metaclasses * * \param other Metaclass to compare with this * * \return True if metaclasses are different, false if they are equal */ bool operator!=(const Class& other) const; private: template friend class ClassBuilder; friend class detail::ClassManager; /** * \brief Construct the metaclass from its name * * \param name Name of the metaclass */ Class(const std::string& name); /** * \brief Get the offset of a base metaclass * * \param base Base metaclass to check * * \return offset between this and base, or -1 if both classes are unrelated */ int baseOffset(const Class& base) const; private: /** * \brief Structure holding informations about a base metaclass */ struct BaseInfo { const Class* base; int offset; }; typedef std::shared_ptr PropertyPtr; typedef std::shared_ptr FunctionPtr; typedef std::shared_ptr ConstructorPtr; typedef std::vector ConstructorList; typedef std::vector BaseList; struct Id; struct Name; typedef boost::multi_index_container >, bm::ordered_unique, bm::const_mem_fun > > > PropertyTable; typedef boost::multi_index_container >, bm::ordered_unique, bm::const_mem_fun > > > FunctionTable; typedef PropertyTable::index::type PropertyNameIndex; typedef FunctionTable::index::type FunctionNameIndex; typedef void (*Destructor)(const UserObject&); std::string m_name; ///< Name of the metaclass FunctionTable m_functions; ///< Table of metafunctions indexed by name PropertyTable m_properties; ///< Table of metaproperties indexed by name BaseList m_bases; ///< List of base metaclasses ConstructorList m_constructors; ///< List of metaconstructors Destructor m_destructor; ///< Destructor (function that is able to delete an abstract object) }; } // namespace camp // Must be included here because of mutual dependance between Class and ClassBuilder #include #include #endif // CAMP_CLASS_HPP camp-0.8.1/include/camp/class.inl000066400000000000000000000040741315645501200166230ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ namespace camp { namespace detail { template void destroy(const UserObject& object) { //delete object.get(); } } //------------------------------------------------------------------------------------------------- template ClassBuilder Class::declare(const std::string& name) { Class& newClass = detail::ClassManager::instance().addClass(name, detail::StaticTypeId::get(false)); newClass.m_destructor = &detail::destroy; return ClassBuilder(newClass); } } // namespace camp camp-0.8.1/include/camp/classbuilder.hpp000066400000000000000000000410301315645501200201700ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** Contact: Tegesoft Information (contact@tegesoft.com) ** ** This file is part of the CAMP library. ** ** The MIT License (MIT) ** ** Copyright (C) 2009-2014 TEGESO/TEGESOFT and/or its subsidiary(-ies) and mother company. ** ** 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. ** ****************************************************************************/ #ifndef CAMP_CLASSBUILDER_HPP #define CAMP_CLASSBUILDER_HPP #include #include #include #include #include #include #include #include #include #include #include namespace camp { /** * \brief Proxy class which fills a metaclass with its members * * This class is returned by Class::declare in order construct a * new metaclass. It contains functions to declare and bind metaproperties, * metafunctions, base metaclasses, metaconstructors, etc. with many overloads * in order to accept as many types of binds as possible. * * ClassBuilder also contains functions to set attributes of metafunctions * and metaproperties. * * This class should never be explicitely instanciated, unless you * need to split the metaclass creation in multiple parts. */ template class ClassBuilder { public: /** * \brief Construct the builder with a target metaclass to fill * * \param target Metaclass to build */ ClassBuilder(Class& target); /** * \brief Declare a base metaclass * * The template parameter U is the C++ base class of T. * * This function makes the target metaclass inherit of all the metaproperties and * metafunctions of the given base metaclass. * * \return Reference to this, in order to chain other calls * * \throw ClassNotFound no metaclass is bound to U */ template ClassBuilder& base(); /** * \brief Declare a new property from a single accessor * * The accessor argument can be a getter of any valid type, or a direct * pointer-to-member (which is considered both a getter and a setter) * * Example: * * \code * struct Point * { * float x; * float y; * * float length() const; * }; * * camp::Class::declare("Point") * .property("x", &Point::x); // getter + setter * .property("y", &Point::y); // getter + setter * .property("length", &Point::length); // getter only * \endcode * \param name Name of the property (must be unique within the metaclass) * \param accessor Accessor to the C++ implementation of the property * * \return Reference to this, in order to chain other calls */ template ClassBuilder& property(const std::string& name, F accessor); /** * \brief Declare a new property from a pair of accessors * * The accessor1 and accessor2 arguments can be a pair of getter/setter, or * two getters which must be composed to form a single getter. * If F1 is a direct pointer-to-member, it is considered both a getter and a setter. * * Having two getters allows to expose a property which requires an extra level of indirection to be accessed * (for example, a property of a member of the class instead of a property of the class itself). * * Example: * * \code * struct Point {float x, y;}; * * class Entity * { * public: * * Point p; * }; * * camp::Class::declare("Entity") * .property("x", &Point::x, &Entity::p); // will internally resolve to e.p.x * .property("y", &Point::y, &Entity::p); // will internally resolve to e.p.y * \endcode * * \param name Name of the property (must be unique within the metaclass) * \param accessor1 First accessor to the C++ implementation of the property (getter) * \param accessor2 Second accessor to the C++ implementation of the property (setter or getter to compose) * * \return Reference to this, in order to chain other calls */ template ClassBuilder& property(const std::string& name, F1 accessor1, F2 accessor2); /** * \brief Declare a new property from three accessors * * The accessor1 and accessor2 arguments are a pair of getter/setter, accessor3 is * an accessor to compose to accessor1 and accessor2 to get the final accessors. * * This allows to expose a property which requires an extra level of indirection to be accessed * (for example, a property of a member of the class instead of a property of the class itself). * * Example: * * \code * struct Point * { * float getX() const; * void setX(float); * * float getY() const; * void setY(float); * }; * * class Entity * { * public: * * Point p; * }; * * camp::Class::declare("Entity") * .property("x", &Point::getX, &Point::setX, &Entity::p); // will internally resolve to e.p.get/setX() * .property("y", &Point::getY, &Point::setY, &Entity::p); // will internally resolve to e.p.get/setY() * \endcode * * \param name Name of the property (must be unique within the metaclass) * \param accessor1 First accessor (getter) * \param accessor2 Second accessor (setter) * \param accessor3 Third accessor (getter) * * \return Reference to this, in order to chain other calls */ template ClassBuilder& property(const std::string& name, F1 accessor1, F2 accessor2, F3 accessor3); /** * \brief Declare a new function from any bindable type * * The function argument can be any valid type: a non-member function, * a member function, const, non-const, etc. * * \param name Name of the function (must be unique within the metaclass) * \param function C++ callable entity to bind to the function * * \return Reference to this, in order to chain other calls */ template ClassBuilder& function(const std::string& name, F function); /** * \brief Declare a new function from a boost::function * * Overload handling functions of type boost::function. * * \param name Name of the function (must be unique within the metaclass) * \param function Instance of boost::function to bind to the function * * \return Reference to this, in order to chain other calls */ template ClassBuilder& function(const std::string& name, boost::function function); /** * \brief Declare a new function from two functions to compose * * This allows to expose a function which requires an extra level of indirection to be accessed * (for example, a function of a member of the class instead of a function of the class itself). * * Example: * * \code * struct Point * { * void move(float x, float y); * }; * * class Entity * { * public: * * Point p; * }; * * camp::Class::declare("Entity") * .function("move", &Point::move, &Entity::p); // will internally resolve to e.p.move() * \endcode * * \param name Name of the function (must be unique within the metaclass) * \param function1 C++ callable entity to bind to the function * \param function2 Accessor returning the member to apply to function1 * * \return Reference to this, in order to chain other calls */ template ClassBuilder& function(const std::string& name, F1 function1, F2 function2); /** * \brief Declare a new static tag * * \param id Identifier of the new tag (must be unique within the metaclass) * * \return Reference to this, in order to chain other calls */ ClassBuilder& tag(const Value& id); /** * \brief Declare a new tag with value * * \param id Identifier of the new tag (must be unique within the metaclass) * \param value Value associated to the tag. It can be a static value, or a function * which will be evaluated each time the tag will be requested * * \return Reference to this, in order to chain other calls */ template ClassBuilder& tag(const Value& id, const U& value); /** * \brief Set the readable state of the current property with a static value * * \param value True to set the current property as readable, false otherwise * * \return Reference to this, in order to chain other calls */ ClassBuilder& readable(bool value); /** * \brief Set the readable state of the current property with a dynamic value * * function can be any C++ callable type, and will be called to return the * readable state of the property each time it is requested. This way, the readable * state of a property can depend on metaclass instances. * * \param function Function to call to get the readable state of the property * * \return Reference to this, in order to chain other calls */ template ClassBuilder& readable(F function); /** * \brief Set the writable state of the current property with a static value * * \param value True to set the current property as writable, false otherwise * * \return Reference to this, in order to chain other calls */ ClassBuilder& writable(bool value); /** * \brief Set the writable state of the current property with a dynamic value * * function can be any C++ callable type, and will be called to return the * writable state of the property each time it is requested. This way, the writable * state of a property can depend on metaclass instances. * * \param function Function to call to get the writable state of the property * * \return Reference to this, in order to chain other calls */ template ClassBuilder& writable(F function); /** * \brief Set the callable state of the current function with a static value * * \param value True to set the current function as callable, false otherwise * * \return Reference to this, in order to chain other calls */ ClassBuilder& callable(bool value); /** * \brief Set the callable state of the current function with a dynamic value * * function can be any C++ callable type, and will be called to return the * callable state of the function each time it is requested. This way, the callable * state of a function can depend on metaclass instances. * * \param function Function to call to get the callable state of the function * * \return Reference to this, in order to chain other calls */ template ClassBuilder& callable(F function); /** * \brief Declare a default constructor for the metaclass * * \return Reference to this, in order to chain other calls */ ClassBuilder& constructor0(); /** * \brief Declare a constructor with 1 parameter for the metaclass * * A0 is the type of the parameter * * \return Reference to this, in order to chain other calls */ template ClassBuilder& constructor1(); /** * \brief Declare a constructor with 2 parameters for the metaclass * * A0 is the type of the first parameter. * A1 is the type of the second parameter. * * \return Reference to this, in order to chain other calls */ template ClassBuilder& constructor2(); /** * \brief Declare a constructor with 3 parameters for the metaclass * * A0 is the type of the first parameter. * A1 is the type of the second parameter. * A2 is the type of the third parameter. * * \return Reference to this, in order to chain other calls */ template ClassBuilder& constructor3(); /** * \brief Declare a constructor with 4 parameters for the metaclass * * A0 is the type of the first parameter. * A1 is the type of the second parameter. * A2 is the type of the third parameter. * A3 is the type of the fourth parameter. * * \return Reference to this, in order to chain other calls */ template ClassBuilder& constructor4(); /** * \brief Declare a constructor with 5 parameters for the metaclass * * A0 is the type of the first parameter. * A1 is the type of the second parameter. * A2 is the type of the third parameter. * A3 is the type of the fourth parameter. * A4 is the type of the fifth parameter. * * \return Reference to this, in order to chain other calls */ template ClassBuilder& constructor5(); /** * \brief Add properties and/or functions from an external source * * The purpose of this function is to allow the binding of classes * that already use a similar system of metaproperties and metafunctions, * with a direct mapping from external attributes to CAMP ones. * * The mapping process must be done in a specific mapper class (see below), thus avoiding * to manually write the mapping for every class. * * The mapper class must accept a template parameter (which is the target C++ class) * and be compatible with the following interface: * * \code * template * class MyClassMapper * { * public: * * MyClassMapper(); * * size_t propertyCount(); * camp::Property* property(size_t index); * * size_t functionCount(); * camp::Function* function(size_t index); * }; * \endcode * * Example of usage: * * \code * camp::Class::declare("MyClass") * .external() * ... * \endcode * * \return Reference to this, in order to chain other calls */ template