libpdb-redo-3.3.0/0000755000175000017500000000000014773016616013553 5ustar maartenmaartenlibpdb-redo-3.3.0/.github/0000755000175000017500000000000014773016616015113 5ustar maartenmaartenlibpdb-redo-3.3.0/.github/workflows/0000755000175000017500000000000014773016616017150 5ustar maartenmaartenlibpdb-redo-3.3.0/.github/workflows/cmake-multi-platform.yml0000644000175000017500000000226414773016616023731 0ustar maartenmaartenname: multi platform test on: push: branches: [ "trunk", "develop" ] pull_request: branches: [ "trunk" ] jobs: build: runs-on: ubuntu-latest strategy: fail-fast: false steps: - uses: actions/checkout@v3 - name: Set reusable strings id: strings shell: bash run: echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT" - name: Install dependencies Ubuntu run: > sudo apt-get update && sudo apt-get install catch2 libeigen3-dev libccp4-dev libclipper-dev libgsl-dev - name: Configure CMake run: > cmake -B ${{ steps.strings.outputs.build-output-dir }} -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=ON -DBUILD_MINIMIZER=OFF -S ${{ github.workspace }} - name: Build run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config Release - name: Test working-directory: ${{ steps.strings.outputs.build-output-dir }} run: ctest --build-config Release --output-on-failure -R 'pdb-redo-unit-test|restr2ccd-test' env: LIBCIFPP_DATA_DIR: ${{ steps.strings.outputs.build-output-dir }}/_deps/cifpp-src/rsrc libpdb-redo-3.3.0/.gitignore0000644000175000017500000000016214773016616015542 0ustar maartenmaarten.vscode/ .gdb_history data/ .gitignore **/build/ src/revision.hpp Testing/ docs/api/ include/pdb-redo/exports.hpp libpdb-redo-3.3.0/.gitmodules0000644000175000017500000000012714773016616015730 0ustar maartenmaarten[submodule "newuoa-cpp"] path = newuoa url = https://github.com/elsid/newuoa-cpp.git libpdb-redo-3.3.0/CMakeLists.txt0000644000175000017500000002147614773016616016325 0ustar maartenmaarten# SPDX-License-Identifier: BSD-2-Clause # Copyright (c) 2021 NKI/AVL, Netherlands Cancer Institute # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. cmake_minimum_required(VERSION 3.16) # set the project name project(libpdb-redo VERSION 3.3.0 LANGUAGES CXX C) list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") include(GNUInstallDirs) include(CheckFunctionExists) include(CheckIncludeFiles) include(CheckLibraryExists) include(CMakePackageConfigHelpers) include(CheckCXXSourceCompiles) include(FindOrFetch) include(GenerateExportHeader) include(CTest) set(CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-parameter -Wno-missing-field-initializers") elseif(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") endif() # Building shared libraries? option(BUILD_SHARED_LIBS "Build a shared library instead of a static one" OFF) # We do not want to write an export file for all our symbols... set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) # Optionally build a version to be installed inside CCP4 option(BUILD_FOR_CCP4 "Build a version to be installed in CCP4" OFF) # Optionally leave out the minimizer option(BUILD_MINIMIZER "Build the minimizer code" ON) if(BUILD_FOR_CCP4) if("$ENV{CCP4}" STREQUAL "" OR NOT EXISTS $ENV{CCP4}) message(FATAL_ERROR "A CCP4 built was requested but CCP4 was not sourced") else() list(APPEND CMAKE_MODULE_PATH "$ENV{CCP4}") list(APPEND CMAKE_PREFIX_PATH "$ENV{CCP4}") set(CMAKE_INSTALL_PREFIX "$ENV{CCP4}") # This is the only option: if(WIN32) set(BUILD_SHARED_LIBS ON) endif() endif("$ENV{CCP4}" STREQUAL "" OR NOT EXISTS $ENV{CCP4}) endif() # Check if CCP4 is available if(EXISTS "$ENV{CCP4}") set(CCP4 $ENV{CCP4}) set(CLIBD ${CCP4}/lib/data) endif() if(CCP4 AND NOT CLIBD) set(CLIBD ${CCP4}/lib/data) endif() if(MSVC) # make msvc standards compliant... add_compile_options(/permissive-) add_link_options(/NODEFAULTLIB:library) macro(get_WIN32_WINNT version) if(WIN32 AND CMAKE_SYSTEM_VERSION) set(ver ${CMAKE_SYSTEM_VERSION}) string(REPLACE "." "" ver ${ver}) string(REGEX REPLACE "([0-9])" "0\\1" ver ${ver}) set(${version} "0x${ver}") endif() endmacro() get_WIN32_WINNT(ver) add_definitions(-D_WIN32_WINNT=${ver}) endif() # Libraries find_package(Eigen3 REQUIRED) find_package(CCP4 REQUIRED ccp4c clipper-core clipper-ccp4 clipper-contrib) find_package(GSL REQUIRED) if(NOT (cifpp_FOUND OR TARGET cifpp)) find_or_fetch_package(cifpp VERSION 7.0.9 GIT_REPOSITORY https://github.com/PDB-REDO/libcifpp.git GIT_TAG v7.0.9 VARIABLES "CIFPP_SHARE_DIR") endif() # Create a revision file, containing the current git version info include(VersionString) write_version_header("${PROJECT_SOURCE_DIR}/src" LIB_NAME "LibPDBREDO") # Sources list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/AtomShape.cpp ${PROJECT_SOURCE_DIR}/src/BondMap.cpp ${PROJECT_SOURCE_DIR}/src/ClipperWrapper.cpp ${PROJECT_SOURCE_DIR}/src/Compound.cpp ${PROJECT_SOURCE_DIR}/src/DistanceMap.cpp ${PROJECT_SOURCE_DIR}/src/MapMaker.cpp ${PROJECT_SOURCE_DIR}/src/Ramachandran.cpp ${PROJECT_SOURCE_DIR}/src/ResolutionCalculator.cpp ${PROJECT_SOURCE_DIR}/src/SkipList.cpp ${PROJECT_SOURCE_DIR}/src/Statistics.cpp ${PROJECT_SOURCE_DIR}/src/TLS.cpp ${PROJECT_SOURCE_DIR}/src/Version.cpp ) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/include/pdb-redo/AtomShape.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/BondMap.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/ClipperWrapper.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/Compound.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/DistanceMap.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/MapMaker.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/Ramachandran.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/ResolutionCalculator.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/SkipList.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/Statistics.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/TLS.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/Version.hpp ) if(BUILD_MINIMIZER) list(APPEND project_sources ${PROJECT_SOURCE_DIR}/src/Minimizer.cpp ${PROJECT_SOURCE_DIR}/src/Restraints.cpp ) list(APPEND project_headers ${PROJECT_SOURCE_DIR}/include/pdb-redo/Minimizer.hpp ${PROJECT_SOURCE_DIR}/include/pdb-redo/Restraints.hpp ) endif() add_library(pdb-redo ${project_sources} ${project_headers}) add_library(pdb-redo::pdb-redo ALIAS pdb-redo) set_target_properties(pdb-redo PROPERTIES POSITION_INDEPENDENT_CODE ON) generate_export_header(pdb-redo EXPORT_FILE_NAME ${PROJECT_SOURCE_DIR}/include/pdb-redo/exports.hpp) target_include_directories(pdb-redo PUBLIC "$" "$" ${CCP4_INCLUDE_DIRS}) target_link_libraries(pdb-redo PUBLIC cifpp::cifpp GSL::gsl ${CCP4_LIBRARIES}) target_include_directories(pdb-redo PRIVATE ${EIGEN3_INCLUDE_DIR}) if(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") target_link_options(pdb-redo PRIVATE -undefined dynamic_lookup) endif(CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}) set(LIBRARY_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}) # Install rules install(TARGETS pdb-redo EXPORT pdb-redoTargets ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) install(EXPORT pdb-redoTargets FILE "pdb-redoTargets.cmake" NAMESPACE pdb-redo:: DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pdb-redo ) install( DIRECTORY include/pdb-redo DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT Devel ) configure_package_config_file(${PROJECT_SOURCE_DIR}/cmake/pdb-redoConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/pdb-redo/pdb-redoConfig.cmake INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pdb-redo PATH_VARS INCLUDE_INSTALL_DIR LIBRARY_INSTALL_DIR ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pdb-redo/pdb-redoConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/pdb-redo/pdb-redoConfigVersion.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/pdb-redo COMPONENT Devel ) set_target_properties(pdb-redo PROPERTIES VERSION ${PROJECT_VERSION} SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" INTERFACE_pdb-redo_MAJOR_VERSION ${PROJECT_VERSION_MAJOR}) set_property(TARGET pdb-redo APPEND PROPERTY COMPATIBLE_INTERFACE_STRING pdb-redo_MAJOR_VERSION ) write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/pdb-redo/pdb-redoConfigVersion.cmake" VERSION ${PROJECT_VERSION} COMPATIBILITY AnyNewerVersion ) # pkgconfig support set(prefix ${CMAKE_INSTALL_PREFIX}) set(exec_prefix ${CMAKE_INSTALL_PREFIX}) set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}) set(includedir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}) configure_file(${PROJECT_SOURCE_DIR}/cmake/libpdb-redo.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libpdb-redo.pc.in @ONLY) file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/libpdb-redo.pc INPUT ${CMAKE_CURRENT_BINARY_DIR}/libpdb-redo.pc.in) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libpdb-redo.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) if(BUILD_TESTING AND NOT MSVC AND PROJECT_IS_TOP_LEVEL) add_subdirectory(test) endif() # Tarball generation set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE") set(CPACK_SOURCE_TGZ ON) set(CPACK_SOURCE_TBZ2 OFF) set(CPACK_SOURCE_TXZ OFF) set(CPACK_SOURCE_TZ OFF) set(CPACK_SOURCE_IGNORE_FILES "/data/components.cif;/build;/.vscode;/.git;/regex/doc;/regex/example;/regex/meta;/regex/performance;/regex/test") set(CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}") set(CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_FILE_NAME}) include(CPack) libpdb-redo-3.3.0/LICENSE0000644000175000017500000000247714773016616014572 0ustar maartenmaartenBSD-2-Clause License Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. libpdb-redo-3.3.0/README.md0000644000175000017500000000165214773016616015036 0ustar maartenmaartenlibpdb-redo =========== This is the README file for libpdb-redo. This library contains code shared by the various tools we develop at the NKI for the [PDB-REDO](https://pdb-redo.eu/) project. Requirements ------------ The code for this library was written in C++17. You therefore need a recent compiler to build it. For the development gcc with version 9.4.0 and up and clang 9.0 have been used. On MS Windows you'll need at least the 2019 version of MSVC. Other requirements are: - The clipper library, either the latest from CCP4 or version 2020-11-09 - [libcifpp](https://github.com/PDB-REDO/libcifpp.git), a library containing code to read and manipulate macro molecular models in mmCIF and PDB format. - [gsl](https://www.gnu.org/software/gsl/), the GNU Scientific Library. Usually you can install this using a package manager on your OS. In Debian/Ubuntu the required package is libgsl-dev. - [cmake](https://cmake.org) libpdb-redo-3.3.0/changelog0000644000175000017500000000303014773016616015421 0ustar maartenmaartenVersion 3.2.1 - Fix bondmap to use the correct compound factory Version 3.2.0 - New way of loading dictionaries, passing data to cifpp if not known. Version 3.1.5 - Fix usage specification of Eigen3 Version 3.1.4 - Fix example code Version 3.1.3 - Removed some compiler warnings - Updated libcifpp dependency Version 3.1.2 - Changes required to build on Windows Version 3.1.1 - Fix masking of maps in MapMaker Version 3.1.0 - Added TLS code (moved from libcifpp) Version 3.0.7 - New version string code Version 3.0.6 - Fix in calculating symmetry atom locations Version 3.0.5 - Refinement work - Fix regression in bondmap voor sugars Version 3.0.4 - Changes for packaging Version 3.0.3 - Based on new libcifpp Version 3.0.2 - Fix error in statistics calculation for atoms with an occupancy lower than 1. Version 3.0.1 - Fix error in sampling rate when recalculating maps Version 3.0.0 - Real space refinement update - Fix reading from maps instead of mtz Version 2.0.4 - Better real space refinement engine - bug fixes Version 2.0.3 - Fix version number, sorry. Version 2.0.2 - Changed more signatures to use std::filesystem::path instead of std::string. To ease compilation on MSVC Version 2.0.1 - Fix math problem, on some system combinations abs(x) would first truncate x to an integer. Replacing with std::abs(x) restores normal behaviour. Version 2.0.0 - Updated build configuration - removed bzip2 support Version 1.1.0 - Now with cmake instead of GNU configure Version 1.0.0 - First public release as a split-out library libpdb-redo-3.3.0/cmake/0000755000175000017500000000000014773016616014633 5ustar maartenmaartenlibpdb-redo-3.3.0/cmake/FindOrFetch.cmake0000644000175000017500000000232414773016616017771 0ustar maartenmaarten# CMake module to find a package, or fetch it in case it is not found locally cmake_minimum_required(VERSION 3.25) function(find_or_fetch_package _package) set(flags VERBOSE) set(options VERSION GIT_REPOSITORY GIT_TAG) set(variables VARIABLES) cmake_parse_arguments(FOF_OPTIONS "${flags}" "${options}" "${variables}" ${ARGN}) if(NOT _package) message(FATAL_ERROR "TARGET option is missing") endif() if(TARGET "${_package}" OR ${_package}_FOUND) return(PROPAGATE ${FOF_OPTIONS_VARIABLES}) endif() find_package("${_package}" ${FOF_OPTIONS_VERSION} QUIET) if(${FOF_OPTIONS_VARIABLES}) message(NOTICE "fof cifpp data dir: ${CIFPP_SHARE_DIR}") endif() if(${_package}_FOUND) return(PROPAGATE ${FOF_OPTIONS_VARIABLES}) endif() include(FetchContent) if(NOT FOF_OPTIONS_GIT_REPOSITORY) message("Package ${_package} not found and GIT_REPOSITORY option is missing") endif() if(NOT FOF_OPTIONS_GIT_TAG) message("Package ${_package} not found and GIT_TAG option is missing") endif() FetchContent_Declare( "${_package}" GIT_REPOSITORY ${FOF_OPTIONS_GIT_REPOSITORY} GIT_TAG ${FOF_OPTIONS_GIT_TAG}) FetchContent_MakeAvailable("${_package}") return(PROPAGATE ${FOF_OPTIONS_VARIABLES}) endfunction()libpdb-redo-3.3.0/cmake/VersionString.cmake0000644000175000017500000002314514773016616020456 0ustar maartenmaarten# SPDX-License-Identifier: BSD-2-Clause # Copyright (c) 2021-2023 Maarten L. Hekkelman # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # This cmake extension writes out a revision.hpp file in a specified directory. # The file will contain a C++ inline function that can be used to write out # version information. cmake_minimum_required(VERSION 3.15) # We want the revision.hpp file to be updated whenever the status of the # git repository changes. Use the same technique as in GetGitRevisionDescription.cmake # from https://github.com/rpavlik/cmake-modules #[=======================================================================[.rst: .. command:: write_version_header Write a file named revision.hpp containing version info:: write_version_header( [FILE_NAME ] [LIB_NAME ] ) This command will generate the code to write a file name revision.hpp in the directory ````. ``FILE_NAME`` Specify the name of the file to create, default is ``revision.hpp``. ``LIB_NAME`` Specify the library name which will be used as a prefix part for the variables contained in the revision file. #]=======================================================================] # Record the location of this module now, not at the time the CMakeLists.txt # is being processed get_filename_component(_current_cmake_module_dir ${CMAKE_CURRENT_LIST_FILE} PATH) # First locate a .git file or directory. function(_get_git_dir _start_dir _variable) set(cur_dir "${_start_dir}") set(git_dir "${_start_dir}/.git") while(NOT EXISTS "${git_dir}") # .git dir not found, search parent directories set(prev_dir "${cur_dir}") get_filename_component(cur_dir "${cur_dir}" DIRECTORY) if(cur_dir STREQUAL prev_dir OR cur_dir STREQUAL ${_start_dir}) # we are not in git since we either hit root or # the ${_start_dir} which should be the top set(${_variable} "" PARENT_SCOPE) return() endif() set(git_dir "${cur_dir}/.git") endwhile() set(${_variable} "${git_dir}" PARENT_SCOPE) endfunction() # Locate the git refspec hash and load the hash # This code locates the file containing the git refspec/hash # and loads it. Doing it this way assures that each time the git # repository changes the revision.hpp file gets out of date. function(_get_git_hash _data_dir _variable) # Be pessimistic set(_variable "" PARENT_SCOPE) # Load git package if needed if(NOT GIT_FOUND) find_package(Git QUIET) endif() # And fail if not found if(NOT GIT_FOUND) return() endif() # Locate the nearest .git file or directory _get_git_dir(${CMAKE_CURRENT_SOURCE_DIR} GIT_DIR) # And fail if not found if("${GIT_DIR}" STREQUAL "") return() endif() # Check if the current source dir is a git submodule or a worktree. # In both cases .git is a file instead of a directory. # if(IS_DIRECTORY ${GIT_DIR}) set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD") else() # The following git command will return a non empty string that # points to the super project working tree if the current # source dir is inside a git submodule. # Otherwise the command will return an empty string. # execute_process( COMMAND "${GIT_EXECUTABLE}" rev-parse --show-superproject-working-tree WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" OUTPUT_VARIABLE out ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(NOT "${out}" STREQUAL "") # If out is not empty, GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a submodule file(READ ${GIT_DIR} submodule) string(REGEX REPLACE "gitdir: (.*)$" "\\1" GIT_DIR_RELATIVE ${submodule}) string(STRIP ${GIT_DIR_RELATIVE} GIT_DIR_RELATIVE) get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH) get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE) set(HEAD_SOURCE_FILE "${GIT_DIR}/HEAD") else() # GIT_DIR/CMAKE_CURRENT_SOURCE_DIR is in a worktree file(READ ${GIT_DIR} worktree_ref) # The .git directory contains a path to the worktree information directory # inside the parent git repo of the worktree. # string(REGEX REPLACE "gitdir: (.*)$" "\\1" git_worktree_dir ${worktree_ref}) string(STRIP ${git_worktree_dir} git_worktree_dir) _get_git_dir("${git_worktree_dir}" GIT_DIR) set(HEAD_SOURCE_FILE "${git_worktree_dir}/HEAD") endif() endif() # Fail if the 'head' file was not found if(NOT EXISTS "${HEAD_SOURCE_FILE}") return() endif() # Make a copy of the head file set(HEAD_FILE "${_data_dir}/HEAD") configure_file("${HEAD_SOURCE_FILE}" "${HEAD_FILE}" COPYONLY) # Now we create a cmake file that will read the contents of this # head file in the appropriate way file(WRITE "${_data_dir}/grab-ref.cmake.in" [[ set(HEAD_HASH) file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024) string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS) if(HEAD_CONTENTS MATCHES "ref") # named branch string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}") if(EXISTS "@GIT_DIR@/${HEAD_REF}") configure_file("@GIT_DIR@/${HEAD_REF}" "@VERSION_STRING_DATA@/head-ref" COPYONLY) else() configure_file("@GIT_DIR@/packed-refs" "@VERSION_STRING_DATA@/packed-refs" COPYONLY) file(READ "@VERSION_STRING_DATA@/packed-refs" PACKED_REFS) if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}") set(HEAD_HASH "${CMAKE_MATCH_1}") endif() endif() else() # detached HEAD configure_file("@GIT_DIR@/HEAD" "@VERSION_STRING_DATA@/head-ref" COPYONLY) endif() if(NOT HEAD_HASH) file(READ "@VERSION_STRING_DATA@/head-ref" HEAD_HASH LIMIT 1024) string(STRIP "${HEAD_HASH}" HEAD_HASH) endif() ]]) configure_file("${VERSION_STRING_DATA}/grab-ref.cmake.in" "${VERSION_STRING_DATA}/grab-ref.cmake" @ONLY) # Include the aforementioned file, this will define # the HEAD_HASH variable we're looking for include("${VERSION_STRING_DATA}/grab-ref.cmake") set(${_variable} "${HEAD_HASH}" PARENT_SCOPE) endfunction() # Create a revision file, containing the current git version info, if any function(write_version_header dir) set(flags ) set(options LIB_NAME FILE_NAME) set(sources ) cmake_parse_arguments(VERSION_STRING_OPTION "${flags}" "${options}" "${sources}" ${ARGN}) # parameter check if(NOT IS_DIRECTORY ${dir}) message(FATAL_ERROR "First parameter to write_version_header should be a directory where the final revision.hpp file will be placed") endif() if(VERSION_STRING_OPTION_FILE_NAME) set(file_name "${VERSION_STRING_OPTION_FILE_NAME}") else() set(file_name "revision.hpp") endif() # Where to store intermediate files set(VERSION_STRING_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/VersionString") if(NOT EXISTS "${VERSION_STRING_DATA}") file(MAKE_DIRECTORY "${VERSION_STRING_DATA}") endif() # Load the git hash using the wizzard-like code above. _get_git_hash("${VERSION_STRING_DATA}" GIT_HASH) # If git was found, fetch the git description string if(GIT_HASH) execute_process( COMMAND "${GIT_EXECUTABLE}" describe --dirty --match=build WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" RESULT_VARIABLE res OUTPUT_VARIABLE out ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE) if(res EQUAL 0) set(REVISION_STRING "${out}") else() message(STATUS "Git hash not found, does this project has a 'build' tag?") endif() else() message(STATUS "Git hash not found") endif() # Check the revision string, if it matches we fill in the required info if(REVISION_STRING MATCHES "build-([0-9]+)-g([0-9a-f]+)(-dirty)?") set(BUILD_NUMBER ${CMAKE_MATCH_1}) if(CMAKE_MATCH_3) set(REVISION_GIT_TAGREF "${CMAKE_MATCH_2}*") else() set(REVISION_GIT_TAGREF "${CMAKE_MATCH_2}") endif() string(TIMESTAMP REVISION_DATE_TIME "%Y-%m-%dT%H:%M:%SZ" UTC) else() set(REVISION_GIT_TAGREF "") set(BUILD_NUMBER 0) set(REVISION_DATE_TIME "") endif() if(VERSION_STRING_OPTION_LIB_NAME) set(VAR_PREFIX "${VERSION_STRING_OPTION_LIB_NAME}") set(IDENT_PREFIX "${VERSION_STRING_OPTION_LIB_NAME}_") set(BOOL_IS_MAIN "false") else() set(VAR_PREFIX "") set(IDENT_PREFIX "") set(BOOL_IS_MAIN "true") endif() configure_file("${_current_cmake_module_dir}/revision.hpp.in" "${dir}/${file_name}" @ONLY) endfunction() libpdb-redo-3.3.0/cmake/libpdb-redo.pc.in0000644000175000017500000000055314773016616017752 0ustar maartenmaartenprefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: @PROJECT_NAME@ Description: Library containing shared code for the various programs in the PDB-REDO project Version: @PROJECT_VERSION@ Libs: -L${libdir} -lpdb-redo -lgsl Cflags: -I${includedir} Requires: @AX_PACKAGE_REQUIRES@ Requires.private: @AX_PACKAGE_REQUIRES_PRIVATE@libpdb-redo-3.3.0/cmake/pdb-redoConfig.cmake.in0000644000175000017500000000072014773016616021063 0ustar maartenmaarten@PACKAGE_INIT@ include(CMakeFindDependencyMacro) find_dependency(GSL REQUIRED) find_dependency(cifpp 5.0.4 REQUIRED) find_dependency(Eigen3 REQUIRED) find_dependency(CCP4 REQUIRED ccp4c clipper-core clipper-ccp4 clipper-contrib) INCLUDE("${CMAKE_CURRENT_LIST_DIR}/pdb-redoTargets.cmake") set_and_check(PDB-REDO_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@") set_and_check(PDB-REDO_LIBRARY_DIR "@PACKAGE_LIBRARY_INSTALL_DIR@") check_required_components(pdb-redo) libpdb-redo-3.3.0/cmake/revision.hpp.in0000644000175000017500000000563314773016616017616 0ustar maartenmaarten// This file was generated by VersionString.cmake #pragma once #include constexpr const char k@VAR_PREFIX@ProjectName[] = "@PROJECT_NAME@"; constexpr const char k@VAR_PREFIX@VersionNumber[] = "@PROJECT_VERSION@"; constexpr int k@VAR_PREFIX@BuildNumber = @BUILD_NUMBER@; constexpr const char k@VAR_PREFIX@RevisionGitTag[] = "@REVISION_GIT_TAGREF@"; constexpr const char k@VAR_PREFIX@RevisionDate[] = "@REVISION_DATE_TIME@"; #ifndef VERSION_INFO_DEFINED #define VERSION_INFO_DEFINED 1 namespace version_info_v1_1 { class version_info_base { public: static void write_version_string(std::ostream &os, bool verbose) { auto s_main = registered_main(); if (s_main != nullptr) s_main->write(os, verbose); if (verbose) { for (auto lib = registered_libraries(); lib != nullptr; lib = lib->m_next) { os << "-\n"; lib->write(os, verbose); } } } protected: version_info_base(const char *name, const char *version, int build_number, const char *git_tag, const char *revision_date, bool is_main) : m_name(name) , m_version(version) , m_build_number(build_number) , m_git_tag(git_tag) , m_revision_date(revision_date) { if (is_main) registered_main() = this; else { auto &s_head = registered_libraries(); m_next = s_head; s_head = this; } } void write(std::ostream &os, bool verbose) { os << m_name << " version " << m_version << '\n'; if (verbose) { if (m_build_number != 0) { os << "build: " << m_build_number << ' ' << m_revision_date << '\n'; if (m_git_tag[0] != 0) os << "git tag: " << m_git_tag << '\n'; } } } using version_info_ptr = version_info_base *; static version_info_ptr ®istered_main() { static version_info_ptr s_main = nullptr; return s_main; } static version_info_ptr ®istered_libraries() { static version_info_ptr s_head = nullptr; return s_head; } const char *m_name; const char *m_version; int m_build_number; const char *m_git_tag; const char *m_revision_date; version_info_base *m_next = nullptr; }; template class version_info : public version_info_base { public: using implementation_type = T; version_info(const char *name, const char *version, int build_number, const char *git_tag, const char *revision_date, bool is_main) : version_info_base(name, version, build_number, git_tag, revision_date, is_main) { } }; } // namespace version_info_v1_1 inline void write_version_string(std::ostream &os, bool verbose) { version_info_v1_1::version_info_base::write_version_string(os, verbose); } #endif const class version_info_@IDENT_PREFIX@impl : public version_info_v1_1::version_info { public: version_info_@IDENT_PREFIX@impl() : version_info(k@VAR_PREFIX@ProjectName, k@VAR_PREFIX@VersionNumber, k@VAR_PREFIX@BuildNumber, k@VAR_PREFIX@RevisionGitTag, k@VAR_PREFIX@RevisionDate, @BOOL_IS_MAIN@) { } } s_version_info_@IDENT_PREFIX@instance; libpdb-redo-3.3.0/examples/0000755000175000017500000000000014773016616015371 5ustar maartenmaartenlibpdb-redo-3.3.0/examples/1cbs.cif.gz0000644000175000017500000011047314773016616017331 0ustar maartenmaarten_1cbs.cif\s⸲Py`O్:@9@&@2ske|$[m<띙RZV-ޚi(UaP7O%`aqko${~3OP?=;2Èl}xK[HզoX8xh[ JO藸4㛤Kdž"˲SUX)_Mt-'*(S/c}j}l ۵Ct-=xBBD {Iߤ&Q iʾy.e:+"mQٜHB;t(_чf s釨s`ST5}S{k#_eyG6bj5|~Ʊ5J@.G%?MI{E}` > F,8Gzv=pXz.;R ȔLv CO;qZoA+MpV+5~o_EgnIxQC¦n&I}ˊZ4n S'DzG-a8hriڀȽnsȸ C`I7<./Txm S +sLC:SyeO #`:|=Gth0N6t? *FQ!B@+0/&vrlwǭ<$]ݘmBfW~]0/dsê<[껎5(\4A +{WT(XQUFUv3QU'8BTã4A}vMb*s%3QmØ$FUg&(VED>Ex{j0j#u) 6L]W e2}cr7^߾N֫eF}xLe|\4F p{x|Mxw!_wt~\h|y}YN >Ht2cّ.iXfs;,;#CpZg"('\b!gLy F:$݋ItdĺF7]zn D"Ut9ts w"˻Fځyo4۩lpd=DMw!F&<ȋ>oTTx'$\ H8Y7ip iLot. d:TNZM8nbh(h=NoZUd} c$X&5*h5x,|MsZFU^]^]%B* qvp1n[υ)qxe( (B_osk];\}^\p'6u0P8x Qfր'ASՀ `(O7EnsENDE z(ro ӎN1#DE Nt8 N1zb&(8EۀN1kb: KN1u(INg#Sn)èSXSNhP)r5]KEοS\ XT쇛 F}Hw&nU5qRu$:@m;Cbp9BTs Rvcy{> 1 F`{oUʣ˚i??s2Z74խj"uv/ApOGagŻ*M˫PgM6y@0 y!X9P:9]pgoKV;o?73j@3,R6fd.C*vz },~^yALR\&mlXcmZ6Sj+:&ɝrmquEx =5aXIh~ƴԓ+IԷFa$m % qۛV%JFa7Zc@uȳQpGKT &^7vt;.sKOxg|oef8{uCqR[PO{\ qJy?g7ObURC-O$3$G@gނjLmPHT|;Y7) oc%t[3vϒEt;+c\B8^Dk yr<| 84} Km-a ϤwjLR tio|NqHx}LS &w֠^ *nM:շ[5ɕ]rҸl?RCX&+'r+qaN{'LVcTY zoo̢ sņx A8)Ml,^}t#%Tqn/EPlŰf*s` *$,OkVo;5 gfn*$̯ 17xMӵ, b8rjXf@q-ճ$ڬ$@8pL9M$[>'ӹ\.GҐ/Ŭg+cSԉˣzh܋0MɚnCYJdj2`cbFp&`>0,cimv/À,(k17][2pȧ}>e)jvo0 0(&!E!Y Ր4.j %bk$ )$-8mF/Cˡ%ZW$|RhNZ͉|tkOV{v54ZjX5+W\^.b.5^ ~W[N/DWDDWug4rBnIun +Ȕ1~Lg:'l'>]}6k|ʿ:Y<׎[3{Q~Z(Wu"d\/o `!{j4{@-̎ '*LE>[v! A]y 'j,%c|; kE OuS ϜA`x N`_ `F߬<0\QK: Tl/Dt'?ѨMRAzoGgGsÌ'KuxK<ҰӅ< <!W45"ZXuSnBjx՝]]1@a0mOf Sg:j=d/Ҵ m?rcGJxEwYiZ vn&fە[Pfޓq'CZła^(mq.EǾ#)-,];r^{ooLD-S7اOhǡUAyhr  (g] By֙*VS1YiڋɊӟ:dy_+&w6D+60~iwI]u$=Ҡ9@P[:mJ۞_?V$SןvUUd e&y<>cw97y>>A,V,HZX!I>|)TOE1˟rC7|IOY!y;o'|)'?d,L> H.lǟrI7D}x7ǟ?bcW9ߕ2FؗO &CRO1>$dt L>tRZPB6+O-g?i%_ߗ/{̟{|9~qYe W{O?mD_9QWNueD_7QMue=>$O=̫OԎ>iI 3>$O~>̴O;N>P?5Svzl E>$f}v,#2~wfYn˾?.Aן߶:ϾoO*].&~?йm9mZYer?fO_׃?`t~l.m׍+W$}m=~u侈dòщ~76_ye~ؾoVop׍ΚaN l'+xi.aԖ%?>|aV4"{|w9=wwEh^ӟw_p$/ZܯQ,;T y+wyvބ]K?MOY Bouk ɀ~7w~o_qea{\R_-cT~7fT:3`/+M_|O_~M jH}cz.ScSyӠO&uP4[ Jj+DBђj=׼)P{ϻ%Rhn/S%Uz WrSm\f{[Uzj늢.D!iQ\T驭+zI B4YuEa 謧f蛃 5=bS_`4%iI+ޠ^?7}L"%i^9K@s1\MTiuܖ]7ĽLm)]RPLP$9;2A}PLߗzo~zÕRhP%)2]@{uAԙi~=3 ЦiI2 ~t#c#]*JMe}%@`j%οdx5̵hw~hϑ@4L{3^-T*Eo%o+^ ^~1ٟWT;M޻}A=t^Q(4s}}p ׿]t^Q (~'y_yCqTIeiw TWm u//;4-AKV/%J{x>Cm3:uJ%Iz1V:;c3cLoI(S(m0)HJ{,td_ oZV=q 4ܦ=:7K:<ԧIOPЀvwߗit 4Oz^[ߖ[t2zQ_u-*= פ 0-AMɘ(>p-JOC]Q6MrsKZ- Ь>{$1[Wz }P(b(~ ЬG1mVA/YvlBӴ~$+ I+͠JzF}|Sե%I"c%iv) K(p׾㘶>R.i@ٰp{r7]yBTzfڥ6PypͰOWP-vړ=׍#TRMj8@isXK=h~ڥ6΋q47]*{ܠ}El1UXWԛh1-{Uޯ4oh>?F;\XS-Y멺SW~~h}kRǿmm_&נ7LW$:8T+}}>U7( ˺一*I[@ͽm~A6]I׷KǍ-'I3;=P~\R핿&wGРgTj+g?ROCUx%hOS[QICh^͉)9s?;j%Xp~FJ~׷0KoT $F\LP~ɱ@堧]Ҁ<<Tiz:@1QNn>Un<YK4H긡d;(Af{ h \ }COYh1zAOA e)7>'=Y7(p1 G&v\4IO7P05b[RBWtiP9Nz&z{/jq;1 4MzFO㡧WP q t<yׁcE[*ߕIɘ^`ˆܟ@1Qɘ@Ᾰuҭ 2& 63g/Z1Q +nr `Tޣ>6'xo.Ғ~B?kF=.FeZfj%}W+TK:{&eݦ i6\2gt=:oIKOZ$!N8.Vt:pORj;$-qq1|]@]|\H}v i EOZz9M-OjwRot p'@/7hFBӸ.'@-cH\t p_am7tx&}]$]f?Mz( IʼnC*ieؤfݤv,Ik ʁOB@*\2 3r!+ABBʍEVvUQsH*6'5mڳ;D$xkLkՒ=c(?q^́xs=Q`K J:xrD[][$Džv~lY.ԙ-DeJ YJd|=RᢤYi]s[*Oƈ7QE%YljuwQP\@2u`Kj9dufQ붟Z8el)TlC["3-8!̣T($MlTz; 늊Om6ܝT42'/O4e#Ș"gĠ@A"(e`ՒzsP~MFIx} (o o.R[.I$V~ʟ2o|G.J9z)ʟ+Y& ڥApPʤg?7 YVV~ʟڿlOe[|ߙUE}o*h*=g?vaJJ@nt"#j]kE⦫񌊒lCURNqUby0ͯL>rLZzoOF&J6dNamo,Pc%{UzAOKS'du6p%-zAOEf%)G.zAOK{fxCjE|f1UKɊl堧nQܑC^FK4^=-uF0]4=f9(n^EEOACr9x0R툎zV=-{J-6"HDHty(eFq F=BpD9 _qT_#n_y^$ Nꅬ% o8qQKs j&'jj9'\_誧=jE0҉)\{Le)S͑[m)bK EO9'>{HPrZ8N='R-ARt eL;']$Gv_*^[8N?' 4#ݞ"4tcIT蕴Rzx8NZߋ\H I(83*O/\3Z%CDRl S[( q2PIpzۻImRxM> JgWf-#)Ԡ/qS.qa* t6|}[GwLXFK׷UuHm5-‘ TWל ]^iźW+yF=Q:njpow$2n368:njxZ%!m*is֜M7WeX:@W=͇E$2NS0F^ t`_鞖摈q)EOuz)b%lȤt7I 1;F`j5gBo}m T<Bzi^lsӅYЕX.g_9EX@o̺FIObd z<(އlIttL,%AL y? tU3"E U.U tQ3$e_P& 9Egg/>OT"(*<[w~Ly&< hdJ%pQ;MQ&L j7ܢY ^aR k@'uPlaKCDZwuIqFI>3,` 7 q8臈p8A-^s*sCDx5Pq^E̘(ABtv|yIA]s&/{)'qFuyH9g4K.h q{Lx}ʹH9s?XQ13@=s&P\K%9j!Hj" ;fFllF˹H9J~(Vj=s&/ariԠZO眉 Թ1hP ; ɈH?gRz?ui/^% 5@WEL" jɃl}nf %z^n֑17;!A陰-ц+ĶLT/!-]ut8GedrTG0vt|ZQM҄o؆TLT>VP$!g'*5|=I'*ݥR p!>$ϝIUAᏋEew)jVT\ͥ*~DD@I"N1ܖtiEmḨgBο<$-tWP9CQ.`mLC'JeϸG.<"YGc4R<MR4M&:9.<MR# L]trL}h\sE>IdT~9y&rrVyQ6S42'τz5XCB2jD9y&:(nn{} j՞rL1E n-əT{&tFƇndr аǮ;^k:LRkS,#~.tFmbi`߇$$+ZO_x}# >oإ% ?ML>&MmD To5gԱs hcZgU uw栥Lr-z5-I=M嬰˝`1w:aPh|~T:)9({Hq ( Hf eEDΓA+(>E9!M$eP-O띰 aV3JyF5V`f e}}NVn:T[(A"BQQX2 [=RWUmw0c͑*nJfR.y@M{# T^]Gy^^ ҊGftk]$\@8G05M]?y^R^QZC>)0=, }OMm/_y;n5GOAל mׯyURկ(4IcykT)3j#}j*%S\0Qv$ɧis(tzhIP7LlcW{Cܞ t4쥡 ۿ6hHm/g_gC%SyF0E:O"ю gYξ4, Ӏ\#"[AQ F"ڐniЋGa|M L|h$3J͙u|""^ dAv$Uf^?<:ooAT9gOni4 ݖrB[w=s&6,9x7yjr$颧5kvP#}yor%W3$lH%ճ\=oj铆GƣS.9Ӡt0̒<^*E=@#xK"=^ܬJJϩitQ05QWrTTvPC t ZA֗Aȴljr#xX?NTem{HLTР_&OS~0Y.rt9e@Q\,8,#[k{[@3[|X!@CCGb]$E4VQ5L˔)I nrvwTc,3q$e_p&PLKt"},^ADi噐 v9\T4k}޵L9HZؘi>812j>ekě؞+nH#:ZR; (&#eJڍ(Z%/3Ҧc+R7]gPdO/J{) [@ 3osuKk4(6Rp7Pp.itIVl҇wHKk1͒;_mLyՒW2B:|={34`WV7շ~!ؤ]Y@sEEX~w/&P/= ZI<8'uB*) tF-((1 :Q.zj3j~R1Qw~.{>HnC j#ٓ 픅FR+v7@rSؐy( IS_@4 IUpnB^ +Pq3Ljrn"E7_*IR/􋆈Rdž"qCq__-iYsqj4:__he7|-<7S2>l(뒢: gWuPac׏i$2__Ęv7]&jPA0'IAZu@ şΨV DOjGFwRtF5МT߈Er3*Ut`a–} [Z@IOgT-rۨe?Q@zz6$*'IJ莼dF?ևwtQժP$3f-RyOJ@EB:^S C-0I/v#w|Na: njIٓ+'& Hgpm(e]T*LgQlm9ZԻi>'_3D4cF)IV3aO [@7_4ܛF0|(Rd4˹ (ҁԳIa;hNjk;a|]$POFaKNƣRS^j&}H  Ͻ9PCN!P4"HZzs@/f pW'1Ț3fed͵`xR)}9@T\t3.Ӭ>+1IR}~g4a-beƄZdSV:beLA2s&qFV/Q=Fјs&vP˵9htYsE/)5|z%]3^H;?l}x]3>xBaӨ;1z&m)'שіO?ݘ{ fJ.)רb$;Twɷ"⹣J%PHb?T D6T a'ZER Z-ZΤU ~@)wg:`]r$.gIK{ :u ]@sE1~Z9e'Џ4htP8p7L֮:6Ԝ F: ҕ8QiJp=W2:IBDbҠ֫l1s%5y&u;&wr<,@*τ (ut{sS!6iw8Y]re3YQ\qܡP@=YrXJCšG0$_o|8Da8PHrKڛC*($e%Wi>Nj΄KGWwiNAJ P|ؕ_lbӀ#](p1 s0FE}ڕ_@=<S+iSYE'EҼ+Et/ax_vPVtNy$](y7\LI[)u'P/t}Rΐ%&u'-Zkoz$͟p4l ӘjnW&%!PNYUӻ{ٱK'BA@#{b !N6ral4&EҴ;(F:fP@;4ϬvB 4%]NW&zw@cL('B΍-eN3a7P%硒UZ5*=vw"h!,3 bPjěY"ʨ TKw'B%h #g=KH#&P}3ʊJQs˴劉a3f\@鹒, tYtF:Q1݅Q(C0e'׌S/*eU_!$FkT/t:lFµ.f6īÐNgT}TQÐNg$gŊ81+*Ψ*iFPՉRjnPfDbw-n' =x3τeL{G7CtQgʥ:WX?_&EtP~ה?0Ł0S{a]$MB΍3̧)C_@ٞ J?T-=V|G=A9(^ łMG_$< MxZ@g.&b|(5dG^FO;#qRFNjq:-Wg~)٤9/̽9O:5B9iPO9""JSLQZܛc%=cVf-IH-\y.VssoM\~#݉-7I{ :e!-Y:|A<@t;I RxMYHDUTgk~xHD՛3!WKi`N@D3__T9VP>P)AW:uP/9h|C3__T96X-a61e.*zsN'Ptחd*e$ tՠi__ESا*A0ʇ́x4$]lUzj9R"#mc7.T[!rG)P=>pOԥ@=5@1Lf"mN[XѠiuЫ`)`zJ8h,Ra8D)އ8X@/!"Rw cV eL(m®5I*8@qq$E h.c:@ᥴHq`D oT7#Y6c͙xs~}賂=hcJѠq/^Iz YaPaaIdaTaL򰡧BX4VQ!Ag'䒔aP@ܩ#[tl"Wi#z.: hbv Ji) tБ"=Ŏ3TtYБJ;`hfhI2ulmp53pC=?4^Б)=~^ ^sjTQ.y'˔%;8LhH#n $77@W_ wotU[_2IPjRs h tt-V)L|G;haxCsLGCiv\!  SfԞ:? (Xeu[]fźPb\#SGOz]$=5Pc==S:v1udZ)Wut"zQ2v&)A6nm?O Ś(lI9)T.@Ӕx:QKrTabni Cx6ix\JҌNTP1L-+( -yA 240@s zeIj-R ?{]$[4h`8$LLk򇉹E|ԋkzԜgUKJpF5IRa7ȓN|%j^Da@ٟVII[C!*َpՒƩ>jfVO8U0o.( ICT^I8GiPO|PgLݱI>J.& OQs&Рf~Pe9ח7N2qzmVi8`9gBfQ~x\1EO眉URja t{.wF[^)6kUOZ)M HL Z[Z;jOoaOatTT:Y}FE~FTJS )?nj,ȍ^z%Rd P`0&O³]$=Y}YrzZ%>,\tQtb=Mqd䕯[FJ()s<1lxM C$@֗NV_VnDS0VӇZNV_[Sl9IzdE+- ~{s_'SbAMmݔY͡A3myi27Mn A{so9C6iݥ"׷&mH@x@soq&Ye UZT-b ͱJZlPl`>FZv3s͡AIOS'*n[^IOTmҕg.ia3c6W?N.A?Q qͱHjSnY+Ng;PlnP&P@k'3%*>kI+AREl*m ?Xy0jI 齡"M@y{F &P-L\;]:QpFqș %c9d6P#b@Odr9dX 1c]s x~dza4pȘs`,L\0<>3% .Cl( IگYG)$M C ruMvg@_kCle&aa`Vm.$4Oc6t2eskA$mlwZ/!if>_3i͡Aʶ0T3Iso1_8Pkdš@I1@4Bn~+rc&ͽ9vIo<7fpmtQrp̴1R29L5gNOv$s```>oOAÊ*l*%~ -`]f*'%(4a C![2v6 =fp;pX}Pd:{t;z9$ճob]RYϾg e]f.6^X|">s`+ϙ/2}?5To}.AAW̎i2vU[)sSAbVƦfKƦJ3kSSw ,⅍YjoP~|tQ~;Ex7P QP[BH(sE S.-NlsBg.o"P08PߩJԒjSwM4K26 ߆2bmp%vBkemꯏtIӒ#YRvl]Hr1/vckd3C0{BF/Նy&;{5(bG_ Xo"!plͅTA 'F~\x%<ԱJ[ԝfEO=_A(iTi͙x}2-fcY@&]s&Ab('L \HD}ϠdF&=\N9͟w t)YΙX@TEx^m04sz}<"S&)yFuѽ+U?]Ι@9?3Zgm$+cFi;G!S}5p5UVYm pʄ5oJCKe#;(P, 5%iͱj 3=o&b3 E4e=td*'H4e* ``Rk(jI{shD*eRkbYHZ-$Fߊ:ZbAacOJ;vURgœ@ي `YE}LcLqB+ش%̌ao,Ӝv);}LSJ~Q1]4m_ΟiG²0KY,@I__eҕVśISU5O/E5yGiPþ҃!kPyGiPD2* LAwITMVQ"eTϏq$D ~^r~O-J׳(1@9U4&Ibu3B=@=J:qG0M@" t4jy4K"d*Z+y.ʟ{l(vBIE' RJXX\Z51_&vl!L/rǿ닳kjl4p!g,jy&}ѿ/Vtx3τ&IyX3f?I1]tXA܃?NJrE]j]$ %c +Ǽm}BР<2AI&;;$zZҮ~wMRtu 袧yZBD-zZv=mrjNTGI|3& -uFxeZe(s'c"_f7&(XT9ggGz/]RxVnR- !AInLI"=I\)ZwcI+|0O^ݘhc$`Z)A &Џ4h܍Z f?>o֠i7&ژ Km[;Ԏ wc2UfwLz-5VP-%VZl실H_5_#gPi(e<E!3_#5(y{IL@I|ԯD%EwrW9~)CC+I=6';Qb h"%0:h:]l(nRknqj"HwKM (uL~+Im$,cdNWy&&Ib z~GZ6PbAa0.=@b/Aa )}K~Su5ϕgB*a %7|ck VQ3:M+.hXCn9Q(ZUđb'6o,zqI.99E2oVq7XCY*QتfP@^9V8Ds-iګ8 'Ff%34Uc&Bb(ṟFE!BJ.w,:=:=4f!;ٿGX t٥9=Գ:CIhER{0{4ص3K+(9S.PGh@(IzJ`׿@$$_I`(rEPʓ3!^$fOY+-H.+>5кNL9,7BWAWY7;ʤ.iI4GVW,_]^]T*,uFRkn+Z$*gu5[\H=KT|yL,V+=(V_Z%Ț3*"H8|<% DFI52E@w53vIكԌ?~;104eFÉi,!iUpݔlkߞ#);@SBc]%Aep(32[=G$!SV@q)&ײ8iT(LڷcXRZkВeZ4K鋉lPj T/rȔf֪xBGS i9dvP{/x6j>T)A}OڝV6 Ry(.-ʴ.U/gs<\3J{5dAL?3@/"-UjШAI!~!)=l Ь@kJJ~FHBHTRIkйW8oI&Џ4=tP\qӠ~zSH Pu9+7CP+Ꮄbl=VI<@X!%}ApS-y^fԒV4?quJ,j=-3t`oU"i:ut8I.A]4&齇@00>Ӕh3avPO F@HH8nHby^%]K0}E{Hs0md:e4?ܩ~>jyg#-Q:\ET"ok@1jxנS}Xpx);)83Gm."ҁq4k2jh#j=&PU U_AttKIؖR{s.)<]eF-OJOLTw}V( $ڹO"AO< 41YhIЉX@1ʕl]$U< XFLts tS3H\xEzkz%zy&P12z(}$&PgBFyP)k=qo%vBl7j8nUzj!uZhdIP~HcrKra^l4qMb=j Av'v/crKq!FUJVO~K6Uǻiqt7mފ9Ts"Ԏ(tSNw,gTjZE_ "?M'YrKp'Z]4 WIwt7ͲK19nZj#(jCj}[V8֠t7./I. KQx7-gbTayfIB=-}UNw"*sLmḺLnZ9MK5bNNFwl-{{VPd^ww]lY@InZ_e$LX?GOJ^VI@6%mK Pc=x}/. #-'Q~N>I[w y_3:誧'__%D4H&骧'__{}ܾxe&@Z@='__r6H4|}ѧ=k^Z2fOgkIP+ cU*|}鉺rw4wARƓ϶IfLǢSԞ}}kH ҁҠƓO@##5?SB.6.|}otlhFj]^ӓI l)%qY$]khɢ̮!Og yV|H4ݣgAS24Jc7sw+iG-a"?r%I܃vG{j 8yAb\@I{~1)*tQ4ݣ1 ?hfo(}sG{H*BnCL- zCJWAs<yJr;頚Ԝ7PrU&,T4p>l}>5>9) ٥f*Zf<9) I@seJVH HzBnWE*.|$颧$')#A!̑OYH  0z9תxOC#iƋ$c T|}!̑,eq\#gs;JYHH75QLMRsE6HdzjE9 iT+>& vEʜi C9JZ9->XNi8qOmeLEţfPп "Ip#i[X*샟xm:j!TERw"y}Qڎ7gWQs/*_Sdjcїt(Ae@Nl+y}t[)# w-+h}_%-[Z;P/53P)e[1K) *}3u KtS]O+h[4'82:425aS<#! JjzZAiJhIjz4."w{phhP7?iwQOZs6@?Z@AO<Z~X3f+=5X׻`VhRh! k j5h(u~‰b W .YJ+ wMOK Kr9<9RvP$>gF>R5]O7P;'d-颧r hd5NٲGZ>[66j2REQAf6S4?uV)*U/8R%JٮR;}ֱI7J*KM'kdrtS|P:>~TT t[]<*UYȏpN:QJlD FSq~biAmW6 L7iU*FGEײ'kw to,4Kn]UʆR  CZxla!R=4 (*"M3jϖԦK^6|LYsAW/FB`Q~'wmZZ..LIE[~ѡUҼ[VqvPuMRz@\R8mkDbH,pd2,3Kò}3u\ߤ}\AJ;َ_%5E:%& >Q5i~N~gU1ASyedgm~)ߒ:RcBf6 y(v|,aRBvoJ8uLxϙiF5Gl4CUR7Pd`L )r!eTY]3R6]6ZWP+QRJ?w[$:U7i7Z i`vԣ[H:ΨMR3fH\ͶӴ.gmzԱ\HDgC 3AFQP 7xL4Pt&Xh]~TڹI4tJxHTDA6$'#K 8Iphe7I%\n'YzHph2-m.̝0P""Q+dBgoÔMSG฼I{~ZIicwE"EVr!W$GYOza{l'le;{C.KD u%e8..<Y2Ip-Qo* WpcQ׿U 5cjt,14Ы0W|?7'KD #n2_d+D5bvchKDF3rsa0jͥi g~@4Vc߿A?~_3`L͇//C蚜n8f^ +@/oޗ[Q#@厠`9mR0@3d PJ#½dM~ GI2 7]crK+*' d%T?kjиrEp2g{k=M'дGIAh֨sfr4.O]#lhY@y=w:);+AeEhNYut]QFrE{(W[DSPA;JK+G PA?;ilPAc$I*\SتR8vgPf)7bBJ<4jP@{Xsʄ)oY0fP{Yv)l{ᔉvO-L+MRqٳ_D e+3-RZy+0u:Sջԧ=QF8 =hܗN&P{ǟ~|@Mva6qhRtw6@hPx_tf_nZ 4>IjysD>Pa!$gs(h~r4嬌s@˓bB +@D-㸤ⰵ*H'h|5ϠE&ؾ6MO 4\ ;`) }PoIxt%} Aӊ DҘ`ouO+ S#H˚NP/m3HiE%!bm=Q.2Ɩ3O+^laY"Iv*Ϗ2Ч4$d5 }ZQqEa_c&EHuO+ ޞ{e$lwGIЧW4t5ԙVT$ ڢ΅;<@VKC5%r{l=>QAʬSNn|! <9m=>(x{-cLKD@3I:9iH7@VuIQ6iE3* aa{"oGk}ZQqE]dcsh2u.y}ZQqERoyxqI}j@Vg\Q uڧVT&! ^خ<6RpiE[H"O+?QۢJzhM"Ƅ{ZQiE7u[sO+?( p%RiESh%vA@rO+?(v+k@VT$eOt$%*AVTx0^\Q)n3oʹϨ[30L`Yx:QO+*(+9y%{")neƯx%ZQ/R (ʼnI8΅( =UV Hy}ZQL6YpQlGYq"oO-9O!F'piE[Hg ki fgg/\ycjЧ+T3$ia͸8iEupǜ(_}kׅWTbݨVZe~ZQCfhnA8tiE"!+\&WT^VT _HKLečJh1> Ϩ&$o4eVTz\QG>FӊB:B4Ҵ˘>x&vIϓFӊʏV!  ЋQAЧW$xZ2QO+*?(0,rI(!F,gDӊ?ᙈRBUAO:=d!sR6Fmӊ构6ZIiE{Ť;yILT9>>Qdm~l 4?xFE{ R[;NW.=b 覻ӊ*O+ } aE5nӊ*O+*I\Ivk?RO+t(#͔D .?Ykg"O+<<)q!yJ|(]c<ʋǴ0=>Oӊ*g*Ax. -tτ>()\kޞ,r{xK<?4?({=z&Xi]ש6VT~XQ0\H`ِ?&E[_~XQH~~F"Gqmb|)iyXQzj&JnJF!qaE'(a&Sm ~yXQz<.hUې| /+^O+ [=p;#l_)+ MKo8uLF2cHe8fn$@-E/O+<(VYn'ăZvS<(3d@m}ErzF},;VpC,.+꿼|W/|o޾|Ż^??o۟oW_yz˿_Ӳ,?ۯ~wş3y߽,탟o{g'|;{G?~L݇*}ZG[}* mM*?KؽD탟|탟?(#|{ؑ afgK|~"{lq+s};9( gϦ"9 #t>2sSx}VnÛ~탟;$[u9StD'ۇmtS0wg5G%(簩 X|~zwCJ|axAq>Wn!+>'TX5w2sؑesG9=VusзXusXOc|aÏ4w 9L30wP}ËX'd: w#|1#o9i9Uszւ9l5 6}i9 /}[M9B9İpT}9a탟 9x_}{'`s}v|FJ|axs}|I$|龐Eq>EBoZ^>^elnPꨓô~Nw'` j2͵~K~bRi9i9,Rm"|MsV\\+y =_E:$NQśBs]9׃~W ~x?QW*"5DV*"pS?,\ۅ}N[5_~NS_;}IT⩟w6Rn9M}m>G֝9ioZo>G4fB9[m&9HA&nÕ}NPə>DŽp[6U|ʶ9lAenHepwLe"cQe6ڨ%~h([>?/oVGy{]W^8W^Oq)X]ʇgG24/5R'7 w .nЁ|^=5^=@~^=@5x^O=` +6nN׹j90{o0akBYyI{Qj2kdo0p:V-<$ܺd2#FMt$^?.`$l>$ؘ0p٢`$(0pӢަ`$AphFYt#I,rH%LQ3z$IHa$zj5I𳸇a$h{I^ƥ@`$Z=Fқ^?СzF{#*z.F# w)[Hsϗy-}WcH2a$۞_?V0({F=FOb|T˭H1<$ܜ%#{{$LJS9-x#I #-wsw0# %i[N/rϏ`?D0pO"`$h:=$\ m?$ATI4O# #r"[^܍ol9I^凑y-p#y?0H# "rZ~F2?ig~'K=n#:0p"`$0$HH5< ?jy]?*0S-wjA JivUN_|oׯD3OO/}~{ۯO߼ }߿w~!ʟwVOſU8~xݷ?xD]&_67߾J</xoI u?V?<7_??WW/M;~u~o,7z_?7B????=N/'sq}ׯ{u_n{}/?W_} ?onn)o?{C׿AvڕwYw|J3nއRm;?;_' Oc|{Yow?~w /xs|?}jϨQӽ7c97-X c Ic̚~C7&7eB6t]tlj%V`IP߶JxA/Yjah;@MкC{R ґD:7@i'W]JîeDrh 0_rޯɖ.K{ VqX6Gu  K֞y2bY yp+,\)XKgt& u|J{>ٓUCE+' FmťM)eɧ?}5~G`=Smp5 g&=u0EqDW8;?) tP OeHXޚ+mL{AWAY?)c,g<|ĥ|JX8A 43J4v~ Tjo}&/.2J,81+o̩LSЖ!o! mWsA PPAu.r˒οAv2MO%Qy^ja*8:M40A}`i<"v1FD..| wUi4M*b!va9()9MZkF\` .F o΃n)a,01U@(VWTQ*L@θ$Ҵ@5H6#N܁AпޙH)^TQu FG>|/8/PHi4}DD9'Ұ Dyѵ ;W'<7I($`[[^(U/qʁ)D?-ə:Z1'stIvڃy +TLHr! `'m$G5FR8d%knw7UEql{]~=EVVQZkȫA\V_ e|G|Ʉ+clLU ;=k DbvP4jc3#ޯ,tD8DRnrr_BʮR$/U0Qu?JDMSQy!\ zQNy_fuYvOAzv6ۓ=-k$W,UpfS'--foq?ka2Q:%; N6nV(b>*]ͤ-&Fh)odaT%!̽%) I]Pp_|2ar~?ar& 1#VZA#drEOB; #vA,?뺲,!f@Ca$;IZ7*HbMCk gܻ-i ov藳1a'oONs,@CMr~tݏn'&Ph1aS {gzMC#c'}Wz :^r 1LDä}'4/L)Y8H3ךt 3\QI(V /o0ͩ1G 2A5 qęSLqZ ^Z4[Jd,Vu J '824TA898/9㭑M³oBInjp fiLEfM#/a4v] 1FĪ.2E2pC(f,zj59uzlԢrUI.Xꗶ.W6a KU8W²y+kL͠|ߝ@zJnh`Uu#/kJ.E%k}RG֖6rV ~#Ѵ\[h0wo9m$b>@UZGո ]S6TjWn@gMJV1 8w'ls.l:> ^*~_ֲl!׮&NruBY@ZB` a%un!,ϋ;l\>PǷjbݤȞf28ZY>ڣigjoԐoAa}YӺF ,&sE۾(mM96paFrpG o (`]n04W>oݚEx)y%#E,rdj}csh^"PfP8Dgj -L3v dGZ{e&>-oT=UE0] 5ghյG}۫Z y%#Ԭ@U0H$*„ |P.aoGyԌ󓌄2VC7+   4qo(yw1^G~=&Ƚ~!- 8fg2,~G n:δ#vƨh &&+Blۙ̚ V~U1~ ql[dpruHj801Pq_q]aTC^d9/ڡ^Jhq-hL51SAx ܼiP58~yH[P16q8jk=hy%, OlI#3n2^UsV˗A &D__ڗQkmS&e( ?hԾd OD8%hNu)zGeWљ_IH|Z$j͈{4*1?9Rl*Bf&'?|(}*]l(L6k|8 Yc ?7%?Y<؉*#cIڴы\U[N?O;F@lYr#f7#o7NPiJƋ,'6D^ƕI tނ|ZgKԫ 7S.;os l@ "ƒ@){Bh'rTYN,/Zkvi7hgFc?:u- sa7jE"JubfZ"1)a_7O0)+_ZvQM0L0\MK®QY ulңp\We+q4I%1ZJf`Q%pܞ*>q\!́X=YȍƍʈLJbv4[lOI;N%xʁ*ўW;~)cCr.8庙Un? /{Mq|+bU 6 l VjxL:zR9sl`zh}G|{EƙA 'uG R.0*MZfZKh*73~*l8r:26zU sN1' ^N< q_!㠮b6yf#2fWA'yamrt Xϟ-~cձw_Յ<lS݉ݔ@7sJR>kq(c|d{ A8+Fw@zϯݟótY Hϓc!$,i>qo0$Tmg0{)-oRL\'yv} ]xIUu 4PguV⛹"#62) %E/4>`Tn'‘3a"]|b{Ohkhg2ӫ1%@mH-d4Z<5\TLz>^wlbs7rnuQb0fVnB.'Vq6GB3$},ՎB&q;aHߤ |t_=7"OQOog Ta60I_Ȉgu!AʡD/}|ܕk/QLq15vlRPRg.E F89Gc[h"MKRU0&XPE L$^f<5@O'p .(A,襊X!ʏ"=aG95.8;PKw&!e"p42@=MDB =Sʡ|\8sJ?}RDOl3If*b4l0WFLa-|rPƝI H.:VE#MާƈipS .@_vj\1__O"5۟!%Kdfv¬Z'' ul< -PG7thzԣ qbݵ/{]JSAzwq?)n'~$1bӛcS5*X.C桎 |:wd*8}.V2" Ql\o7lо- ~Z{ڮR~F?kjY;;/'J-͢j37'&.s`etTcD),W G3~'p=5IKWs[Xn]H~qдiN\Dzy/7Xp ,u `~&ЅִFG$h7/P M:8q59irc9,,2_^jk. 1WwO?mHA#X3l2s4[,;#giW ޜ|Bacmnp"=AtCف/4Ǘ B7O&z36( Ӿy+yIX;OA5 JRP3ޠԵAj'ee* H6[I?D 7G#n _w-SEj#%#[x McT ].B׮1|\5)ϖ`t6_s2s:9#DV5Nͥìy?&!wľѫP?lje]BZL#>/v^@{#l-L;%=ƥq:g73fP%[di WLAfk򿖶[t% %ux\w߹cȲ7}Rg`쎺U!k J $>O '3iwD*],4X쀔\ 攱&Zǝɔǔ~g%Av^y1C[H^.: / 'PSO7.-ΰ.l_.qīn!aw#3K $#8cwf~:woŝ=Gp$pE1}*u2<P.|&Ds6]fܘ.q֖Nk2ojQVW^pVh@_ G*[82>oμ.) v֪l:m"ByC+I.%*مqFiiY;)o}Ӏoc]EPC/V2iigQ:qf!п5 T!Y/Ivӳeux N;Ic32oQFXa[=1j?F :g>δ9 we퀾߯> Wk%t2~=9V椠sq B |6wWo-X? eMnyp߭v$Mp @fzҋλg]:K)ոj;+u ,\V@i~ P[75&.ӆΕ8sO'vUCZ,ܪ;R>E#yML7TnH՚~U!pߪRlO*N+[yH'R5wFgP憟xW,u ("-c;BL_a)tlIWK&-bVr6l%H" IoF汜H6#Vȝ@ gcX&z3äC:mPrɓ ݟL"1kƯgjyK[@~TUT™iiiscLbAk 4GNx,iZ6Jrm|ZD % H!'Ih!5;RB 6Ɨgb Ft6ДhCN e5XPC'Bdb:h8x9?&XX/;o+"JhOqՐ;@]vߙO'/O> :a/%ި5>$R\86w=/ +{0vr =gn 3a`i n"s</Ad(6r?}W$jzն "c s.~!q}x'EuK^"K9AъW p!!U5륋rD1 mGG w>Bh8/N,7VG]>ٵme.ڄ8O^5v;S<2u#7HE iKq$*ZD%có1#H1)m!o?Γdmnh{/ݵ<,䝻йY8y1 JN'JG̉d)\Xu=z U2=^n$$I{ -_jhy-q][.IE{0 $ddٮ j7Fm)۩\341teqn'7eYU%8Jy<{n%n1_|9?A,Jp("LN ł$rlU$>])Cnځ0fYwZihZq"9ݖ2Onո)Ob:'FR zm-:܌5E->ym~ cgߞ,ZO]kbsҵ~(`3RbA ȩJ㯵{hˊ-5 p<ޜ6jxa.P.,`{+kO*Ծ; = >FC~M4i?b:d,{v#&8;T}`\Ȯ'B(!# b=[Ph37@%Ѕ* #>V-VAV,ࢳjkԜ#5i#7R>dm¨x= ^\K子cIlsP+,o! YsDY8p DKEV \W8cKLNbMz{q{9/2a5|(@O/ẍ́|c0]d^Uf@g//?diʁupŒY̍S8.W%rȷf#?(6QeB{R!؇!&l :yOlƥDڞx]F7{ 0# Kj==OP\'lڀW`EwVWfpI njF 9=]fXB"9`J`k<"eOܛXE-|`Ag:S>t$Z\<fEMhWi悞8GhWD'ITB ʻ+raQZwPYy?4%#9FܻAY3Wu+LJ~-FYb:0%Z&_h)- G}[3X6h|^HL8+J-JQ&d̬*}=\*ҹ+t5fu#k(|U f8}nj52|[P Rr ETsH3y:6?LҐ6 XGɩ W=le ,NDZ?<20<z68?GKű!xhbg!~߽ط(Ѥ uRJӋવt@k%* oLi=QaZAkekdINF$-Br㻗L2RT` ,݋f䅋0yBb,4,mG$Ƨ1:)9SJ2IEZZA-5VL5d5|$UwH7G\?Y 8-unb-x/X 2!\vbSzghvJG,T Kh.:ְw\f<Q3ۡ}6/lJ$Ϻ?Y>5nF'Nlgx q#P:| z@W-ʓաjZ<5 Wz-v>9Hvգm)8jl V|e:>CK%Ұ)ݬG o{moבČH%MxBmu &Kq Ҋbp@ExdXCd XJa M3P-^3}>3lӣ@l!Lt5z&8J5};Csvx̛sB!@} #곧p)%U[&Y|l,˜~2w{ak82PZJ~{&D2&&k /9(A+TټImjȿEޫw!ҫ?Ap gsf/?"?z.Eme`MPD;RCUJ g=@"/#Rr(_o\gE'u/n Ob\Ś:BoJ *G]}Q"c mz<^N4X&Ið\j-(T\k-wt7lQw!HLflhXe\B;%ݏ/{ԇϲvGܯPc?5t4#ۭa-FqzQn9KצTޜW$򞪡TA MA?q?Acex@g wMMRβh)=I[~,l2nPEMRH>G*)gWT]߱;Od~:,X>:?_uֳ*#MdCg+"@Hŕo~td_M@CZY3a)oHN IIo\I5 dRʿ_ b6kk(xBrgZxp9"YZqc°5uQLr -]aY6j)8@f$~mQzRu*_7`fʇtق97^wkޚM}h>r3qȪ<5H)Zj_.ތScA? , w*Z 2إe cu=<ɶIjRT ?k`NK7^N-5;G Ϣ% C" m;ZgD$2<5`@߁G.̤3M%? }ZbE }`dAY k/)I"揅w@91 O,2tb 6:=ppm4̀: `zFɏ1←欞mΑ}*I\_u{),'=fļ#Z+̹0"WtdcH؋B", :Y#:s0,Je]֯^(pv]:}&&sg 琦8B_l~PG%҃a4oSW6 .͑As[~_duiٱUJ@Udp@a2s"o8`5J,gYMorEaȗ2)f\&诲Y =#w> TZb‚C:[,,FSGl TudѪuel^>ZW QN Gu-gM{ + 6PL2 H- _CId4E%aT3_ǡ 0J+Dou3%dħnkf ^,7€-?p[br!٪%uwkI=U2xZ i1PHbit.Ky+Ӛ@\{|>yW[-Rwv[HOUsܚc(F&5s: 3fWȊ4UiBwWk\߹!x5Z]qHQc X!ytd#25O5Bye7A^IobTk=MV`z K, ]`qW-.Xdz,P#44d4o(D ]K*|I:8q~pd`tuuV9}#pPLȬ|r]fLD&9nǤь’m+b\;vƏVnݜmM@|힀;쀻u#;b.4Z]K( @?\.G~`uC[wC;˲U^$mM $goΣoɁ3y[Z=C@:քl Jz_N/vTWDɲ0O'*≚l .Y)+e57$KʧhE园m突D~,t"1[__p%0|A  \r(QMSm;j);OāUCg!ֹ]qڒz]!GMU;nnXublú7Ka3#>L]yŠ ê6m\O^i@u ~rw `d">:*1!VʨvR!Obrf.i fNԩUu80+F% ~f>Vֶ:2$OPjuv:m% q sec鵒ὕقf9%QnjKXb2>`p=X],UAჭU}h1GC\j3 3uG,(ewXdjaLoQ(m9.ϯ?.Udlj-TzC.m8$ok3+nPJz]]ሂE'}1>&&n\܋?lBq%lxw&/~@]8 a%#V0"lKN&ghmAD&ʾ$Y!XxByTmYۋ~?Π"].gftJNl$/ɍ"rNZdy^Ұ-٢5R3:U;xY/YxxR+A"3OwrZ?GQ'lCv=c\V”e6l|%D嵺-r\[ynijF w`7~=6 Q#PiUQCDkU*"gKW "[;smy1:r4 ZQ"*_ K| Xwt]\3p#ťGֹ}"BE&2{뚴ݑ bݪvLsj >P2Él߬͟=ҵ|7GxhéȶA3Kܠգ9‰);S!jwZM^b £28"E_<q?,@Zܓ6^-x{cL^:wdv*fQB2$`e5VI`IQBP(z}hPzd]`Ml%2g2Gn=ݩ9Hb7<&rn{ ?bʘJOia~;)zt6 / yIJ<t²,wb@EӰo&szMơ>}6ԛxQuL۷Sq ]$23<Nv TGϔ@Y_!1T%2UKE];~ o;L&/0‚pib{hK1@f|qR>=>iibN=5ǚ%#F؝oCQo}Q]+|̈, 9nѷu= KPDK;l0ɽ 8hڶ.RpD=;<ك=*l%k8~ysu"=^ma֌q Sl;-X23ҮٿFc'^ӸR ^dfhƸ+=3CjdHR_M :(gbL񊡌$Y&ƓLm̭*)s4M+W聭5+tX$ϬC _}=_V.f9pgI~ ևp͑@(B[AaŜ|]kwq9nUIxfݕHDnw]µ'Qq6F%IfXT}'T}3i *O1o1,tp,%WPY9TN0 j7`NmI7(.Q;{~ܫ J҈*]ޭD>c>S#ⱳԖdƏƆCjYA..$R}OcӼ䙢򃭆m]ovghvb F9HeO|HKN|g+ W.{Wy)>?Lߡi_~_T?$/`.Abp-4I16C-e^n kmKY _aʇ̵iF<s~QIm5m@)sz!)F =;"L+s`iUWX=BBwqVED'Õ?5 Q ʀՋ_, ~+|b>㈺$x1H.g%>\?Z`BKN~ŭ~Erϑ c%10[IX,ll9֧?9,\}rY_8 f>]D&Uq |gN[EM0@G ( 6AN_p B^=2wqw;B[Dvs=L,|8LՈIQČnw@ݟALHZ!+MEb`hrp/s?Y;ؼx5;\,)(" m$bRf"|:zDpSpCΨ{]b'^* Zqxe% ,UN oQںWsڌΑ97EI|hy=||/p7Cb[Hqi!z&N'|rc1Daf׬]w_!v1Ő/o0}9vh ibӌxVr}#1n]EӀX6IL† S-굨긥&Rt`N ˤOD>ke'y')`%g` Rg T}+5*vD<绑]l_|֤KʒKrbGI;IO0h{\]$v98M~G f7ʢz ur+O={Tf=$kvf2<4s] /4߅j)ac`vo}+@(16m hrliI8YxdKFw#-5<[#Pz*in#tP]pG\? #5뗢vR*J!tߠ/*_׶#in비HRjKmd*[j!yF8dCGM0}DBaRݼ/,.6[nmre7NI[fA829 O1KB9$!eT79jR}naVo ,J-}O5O|Sw\2ZSh 04wyZwb]{(ދ钜$F☑Y4|ggIUot x3I~͔.%Wx[ϑ~zt! -+XMʖaJ <>$3R⣿kZ*\9d KE!_~qV5%"[9~㝃GTon΄G74v,o;Dv M hlK4kfXq( 0RМGzgaduL;'5` l8'!>^dG!L#ҤbNM|KJ Ex2&dRnJm6Ё JP8k{+[)_1kRC[[yL.W1Fr#QChꆵlH!#OQ@grB!Dl}#`_UzPY>;; ד0nk 674/ ?z_B" קlzM'd/bU\6cv1tC?A'@liapj0oh!2@9n Wms ZmƳ#.ȜopW#5LD ɣnx:tRfv/8rLHyC Al!X]BN,22%1?zowPhkm]GJ({ T$avR#l&#}ľa^Ѓu6er.\zKZ<\A8 и^MZ6HAҬO T>^:8LC'|5c~ڝ=/u8CM-MƇ^BlZP'6VÓ廚{sW}~\+!@(1@mY+3m3v3!жr|`,LOXe,/>'r,XEvu SXM,[W_|^ L>N{}ͼQTm,i4rj@{֩O+&+50V5^l"_,p{f:`b'󫟸4vi!E 'ΰAy3vO@mȇXT8Ru ٗF~zfk ;D,5dB]t 3fotA$[tCM,9]<0W0Hs߾% *4r R &0PK&.$,/✺Cϻh{0)U:H )ZU-ς v+eG~t_z Ǜ1Wȓ"q0,ޣ?̋4 I%RK}Ȃ6sM{[dʦF= m B^^MD:\ _ ̢(4R/0gpZq -3uϳr=c 1ȃQg)) H%Uz؄8h|iQuޡGd3sNu%K?8z6̙lcڟC @,&n+:wuZٻ %pʛ|+ u~! l%ާH5{>z@- * *9FiFVL vaS"nZF1{3 JFhEɲ VR #+W y?$e@l+83BOطVMAX-qnk{3YȘδnK0q>B_E;7Y}!D*Z6>hme ;2}wV|gNDNǿ)1@CVvy O;3HG}h>e #ZX?7pF '<\d F9־O>{ހ+_n?pї@8p2.za'&V8HMk%r\J`& 1W3Qt(+~tw.Q9SM.hnp=7JT&ZnE ,Ȕou=H5[ s&^fXILpP^sF>#2,CY)\hQMi@k!Cls$y\π*2LI1ߠ+LfaH/R`$=>dZC$`O?(R}#.I"4+2hjU_gYZlibpdb-redo-3.3.0/examples/1cbs_map.mtz0000644000175000017500000362436014773016616017630 0ustar maartenmaartenMTZ DA@?G/C@ϊB"Cz5hǩB}5a5C4C4?C6A?5fC~@C4CRyC4C:C4C/C4C?C4C A?ԾUDPAC!ODEDCeDCCC?JDC@A?XA_ZA {B4CQ A 4C @3#9mA3#9MG7J@)7ߙ=A4CA?B|A5C#6 0C#68MoB#6B4C?.S7C,,"6A? APZAB4CWB4CCB"Ȼ74C"Ȼ76 ?EB4CA?늚AlWA A3CA3CLTACq BCi>A3C@??{WA@@3C#B4C²B̞79C̞79y> >B4C@?mB#@UBBdAB30BBZBB&?4ABA??: -BP@ZACPGB4Ct AY]8!nB]]8ʃ>/ fB4CA??<̵C߼}@TCB_CBf9CBPiBB?CB A??9DϏ@j;D?63D6@D6YB6?8j7DWW60A??CnM@LCCCCTDCoBC?CC@A??92 B}AAB4C!eB4CVAm+7Bm+7i>B4CPA??3CL@ =BB2BB$օCB01CB~?*BB`A??`CDG@C4C}wC4CIC4CpIB4C?fC4CpA??:_C{@arCCnjCCTCC`AB?;XsCCA??ICX@vC4CwqC4CN"C4CB7?GDwC4CA??T2AAiBBcBBtLBCBC>>jBBA?}KBF@AZ:BC7BC;+BC@M=@4Cz^?7BCA?? C@HƶBBy˭BBCCB=BB?޶BBA??l/BbcAƗB3CtB3C*A3C`|BCv?/B3CA?? B;O@tBBBB>nBB@B?WBBA??oC@EC+:7w FC֒:7$B֒:7 B4C?\EC:7A??8A.A̠BBBB1AClBC f?BBA??TBڄALB3CKCB3CB3CBcB3C?G|LB3CA??!BA BBABe!BBPVABa? BB@@?EC6`@CCbMCC>CC@6?'< Dw6PA@?3B @j>BC BCBCpaAC?BC`A@?+C#@e4}CA6*wCb63Cc6Ag6?GvC= 5pA@?{CƢ@ߧ6CCx/CCYCC:CC?o3CCA@?CbK@jB4C6B4CC4C j>A4C?G6B4CA@?;EBf BAABABAB6@C9>ABA@?mrB@sHB4CDB4CBB4CA4Cgr?PB4CA@?JCE@;CBe2CBmbCB >BB?'=CBA@?kBxAB4CB4Ct@A4C;^B:*7?`B4CA@?ԌBAMCBCB ACV.CC?c-CBA@?8BwA` A4C*A4CJ9 A4CaA 7;>9A4CA@?iCI@BCBCs)CCt'BC?&BCA@?o/B5AXCB4CB4C` @4C'OB%7?B4CA@B~@_{BB܈BBjBBAB?tBB@@@?HC _@ BByCB{CBBB?'CB@@@?[C<@F$ CoC6Z*B4CeDLC4C!C4C]?rB4C@@@?Bq@uCBuCBBCrMCC#D;>F;!9;4Cn>4C@;A@3CA@@?%B @6BBbzBBLYBBP0BB{?BBA@@?AKA^B3CI]B3C,CBC+BC&K6?B3CA@@?pQB2@##BCA$BC CCaBC\y?A!BCA@@?.C)@1Co651C6RB60TfB4C?s1C覭6A@@^'BA6F,BBm'BB&ABdACG?m8,BBA@@?A=ABC'ACbP4A3C*B3CT?lBCA@@?M$B@VBCVBCBClAC?<BC@@?9B@_BBcBCbyBCy@C??MBC@@h>B&f@)Bf6ꗫB4CtAس$8B׳$88?uOB4C@@?Ba@@?ͯBCBCvLBCt@C>tACA@?OvC`@|WC6iC75ڔC7|A7?EC7A@?C@ zCBCB`SCB :BC?CB A@?BT@jtCߍ6C6}B4CnC4C?2C60A@?,ZB1c@BB/BBSCB8١AB?BB@A@?Bu?@!lB4CnB4C޳B4C B=*7]l?1B4CPA@?SA3CpA@?Ň4CU|@Sn=CBπ2CB6CB@@B?7CBA@?VC2D@qC^5kC5mAC5(B4C?oC$5A@?AVfA YBCTBCHWABf{BBP/?)\bBCA@?X$C3@\C4C#C4C}iC4CX.BD&7?$C4CA@?>C)@rBCBC?>CC֎BC?L)BCA@?`BLA&B4C@B4C \-B4C踧A#7Bu?B4CA@?AA AC?ACȾ3@BABQ>]ACA@GsB=As@Cp@COgACK+ACG>K@CA@?BP AK]BCUBC?BCؙKBC|?]BCA@?B9-A<B4CA4CB4C B4C0?AB4C@@?C@YCCY8{CCqCCUBC?ʈCC@@?EC@CCXFCCDCCAC?CC@@?"C@i7C 6KSC6TB6B4C?`C-6@@?C@BCBCB䯾CB0BB?WCBA@?C2@%bBCDBCx$CC䬗BC|?HBCA@?E3C2o@zcCBCBCBPiCB?'CB A@?^B}Z@ HB4CA4CޯB4CeB4Cm?B4C0A@?B/@CBCvDBCG:BCP ACp?K$BC@A@ Dy@ C7D\7D\7?BW7?RCZ7PA@?FHC9@ BFBC_2BCMBCC4CC z?)9BC`A@?B!C@1*B4C4 B4C?9B4C|Ba<7x+~?yB4CpA@? LA2BA BB9BBreBCCC!>kBBA@?\Be@dBh7xBh7(Ch7l/Bh7Q&?B5g7A@?∨B@O?BCٚBCٵBCXAC ?]%BCA@? QAӠ3A=C4C< C4CBb%7vCa%7R?ҊC4CA@?hAgA BCEBC ?BIBBT?BCA@?)BP@smBP>7AjBG>7 %CG>7BH>7?JkB7A@?p $B4oA͎ABgAB\5eAB?CC,>ABA@?ˍB믋Ad_ACAC4aACNA3C/?ACA@?SPC@JCB8IAB@@?7.C ;@rhtC4CmC4CHGB4CPBӜ7?Œ|C4C@@?=hAf@'BB@?6B^?Cx1@Cp;`@C@@?SgCN@+rC4CxC4CVC4C@KBPS7?C4C@@?cBO@wBC]BCxCCoBCe?ܐBCA@?yӧC~@HgChb68C%d6C%d6@tA%d6?TCc6A@?C-W@-CBCBؗCB=AC?vCB A@?BCnn@ouCY6@nC+f5dC+f5HC+f5?]pC%60A@7:BCABt=k?%@BCA@?P\C*@08C6=3C6{C6 ?B4C?b4C5A@?A ^A`qBB-lBBԥACBCZ/5?+ eBBA@?ALAT@4ChX@4Ck@X8AY8j=ث@4CA@?yBABCvBCUBC;BC f?.# BCA@C3О@C3CQC3C#C3CwA3C? C3CA@?hϝB]\@oBB BBjUBB`[LBC?0BBA@[pAKZAqA4CA4Cv2AB%7<}#B@%7>wA4CA@?eNBHȃA%BBBBORBBJABHhe?&BBA@KoArA=BgH4U.BB4A4CzB4CUw?xdB?4?@?4byBo?ACeBBúABi/BC9?BB@@?uCJ@YC4C33C4C C4CC4C?;C4C@@@?xBeI@КBBBBݮCB§BBt?BB@@?B?fC"71C؝*7Aڝ*7C4C?R,HHBC A@?ICq`t@ C6ҿRC-6@C-6ݎA4C?kn>C%60A@?CB@moCC[+CC/CCVBC?iCC@A@?dB}@yBX6By6,A6jB4CO? B5.6PA@?Y#BNKFA;BC=fBCX=AB BB92?.BC`A@?CX@ACACj!YCCk9CC,W?>BCpA@?PC7@sCBmCBNCB0{BB?VEzCBA@?C@hCr6b/cC_r6<'B`r6C4C?gCv6A@?7װANAuBC/ӒBC)BB BB93?ݖBCA@?o=B@Bʦ6B.N6pa~A0N6xB4Ci?LB@6A@?.B]@FBBBBOBB@C? BBA@IkAw&Ap@3W8+@D6W8/u@4C-RA4C"k=b@f a8A@?:Bx}AoVAC^ACjACjAB?oA,8A@?"C֫@BCBCUCCBC?'BCA@pB A9 BCBC CC0BC? BCA?.B{?awyB3C-B3CDAC*lBC@>B3C?A? DgA!)DCDC3CCСBB?DC@A?HCo@fC,r 6XRC6dC6@B6?[Cߓ6@@A?佧B?dCBBCBChABZs?dBC@A?MB v@I>BCErVBC;A3C HB3C>XBC@A?q=vAA CB޲BBAC%}BCY =nBB@A?jBy'@$B\a7C_ɾ6#B^ɾ6B4CV~?UEBd6@A?%DԄ@=3DCaw"DCe)DCAC?(DCAA?+ D @ D4C D4CO D4CA@4C?i D4CAA?8CN5@]7KCCMCCpZBC7CB?JCC AA?ٸC@C4CI0C4CiAC4C$bA4C?HC4C0AA?9Be(@BCBC`C4CBe7?CC4CpAA?A1AbABABaACNAC=xABAA?kݣBĿ@1tfB4CaB4CB4C،FB4C}?wB4CAA?7:Bzn.A;BCvBCT*ACLE0BBe?6BCAA Cg%@ B0:6͐Bˣ6,Cˣ6 UqBˣ6?GB>6AA?S C_@"CC> CC BCa"BB?"CCAA?PBxmAYjp?4Cm? 4Clx> 4C/?h9<_&?,4CAA?B#@BCzBCPCCܚBC~?햅BCAA?'0BL?A.BB@A?SCAL@C4C!C4CC4C0XB7?FC4C@A?_ǂCCz@RCBc%CBPCB BC?"0CB@A?x.CP@UC+7[C7sC7tC7?C7@AbBws@BC`BCBCPAB 2?BCAA?^8B@a{B5lAC@>3CWA3C>;#BCAA?Cq@=)CCا7CCrCC W}BC0AA?fC @|CBzCBݖDBwCB?>CB@AAA.A[A4CA4C3AP8nEBP8x>䡷A4CPAA?A){ZA/̩A4CͥA4Cp??*7QA;*7D>A4CAA?MQzAUL*As'BB(BBĹACBC4>F #BBAA?݇Bd@fBP7 BP7T{'CP7ݞBP7?|B;OM7AA?/CO.@bCCCChCC51AB?ƝCCAA?RCn@vC4CrC4CC4CB4C?C4CAA?!0 BIA~ BC BCRəBz 7@ A?gK D`@ѥDBAxDBDB͂BC?DB@ A<CA8@k C}7H-CL7|=CL70CB4C?ȩC_7@ A?82Cg@ACBCBXCBeBC?CBA A?eC.@8C4CQC4C^NDC4C`B(!7?քC4CA A?Cy@CBCB7DBW CB?CB A A?RBrN@y3A3Cr~A3CB3Cf$B3C?NA3C0A A?A`EEAhBBeBBH!BCBC>vBB@A A?C (A#C9!6;Cʊ 6!Cʊ 60Bˊ 6?([C6PA A?YC?D@CB`A A?LBF@gB4C"ÚB4CV#C4C}B4C?KB4CpA A?-C*C@S_BCr)BC:CC\dBC?BCA A?v:CL@,Cl5gCl5UaCl5Bl5?uCz5A A? sBJ@BBbBBIBBAB?7BBA A?]Cы@CB@ C`\A?CA A??AOAngBCiBC?BB„BB?2gBCA A?AӧA[BwBCywBC%A3C\B3CZP?ʁvBCA AzBdO@AkCCGzCC`@CxBB?lCCA A?AyAY&A3C@A3C=@3CدACm?7A3CA A?B*ABBBBBBpAB?zBB?0A?Ca@ QCBuKCB4CBbAC?CB@0A?uB|?uB4CB3CC3C 8B3CPj?#B3C@@0A?CLk@gCBCBfCB1BC?|CB@0A?49B@( C3CB3CxpfBC^CC6?@B3C@0A?mDQAvDB;DBϜDB@j-BC?4DB@0A?/CO@x4C3Cy C3C-UC3C4TB3C?&C3C@0A?~C}k@NCC\CC꘏CC0xBC?9UCCA0A?B8e@)3BC3nBCBCQuBCfjS?LWBCA0A?4kB?p@"CC^Y CC7AC~r CB ?mCC A0A?EPB@aOA3CREA3C A3Ck@CsN>2A3C0A0A?DB>@qBBiBBCB$BB0[x?BB@A0A?[C@qC4CC4C*C4C@3A4C? C4CPA0A?MjB&@DBCBCF+>Cp[BBjk|?PBC`A0A?BZV@E:BC+-6BC^BC%BCWr?#(:BCpA0A?.B @BBHBB8BBLAB(?iBBA0A.tCt@@0C6&C<64C<6"C<6?9/C6A0AJCH%@ CCCC0CCA$BC?CCA0A?dC@b'CD7(C 7֣B7䑔B4C?&Cr7A0A?4C@u9CB:CB/CB@"0AC?9CBA0A?=AfuABC4tBCB3CdB3C:o?iBCA0AB AԹiBCw`BCX@C,`FBBW?M[iBCA0A?_كB[AOmB4C_[B4CB4C A4C?nB4C@@A?Cyy@UCC?\C\ 4PcC\ 4 B\ 4?WCC@@@A?BM@0 dBB2AB2yACBC->Ѵ BB@@A?iIB0@C4C6B4C~C4CfņB4CJ?jB4C@@A?5CWO@,CCk֝CC%CC($CC?CC@@A?DR AzbCW6 Db6Cb6B4C?ED^6@@A?QBv@MBB^BB@BBC,>9VBBA@A?0QC@5= AB4ABXS?B@C>AB A@A?BPCa@ȭC4CۀC4CħC4CछB4C?YC4C0A@A?\-B!A IBCCBC؏@C/BBW?gFBC@A@A?; MC \@ʸ[CJ5UCI5dlDCI5p=A4C?mZC~5PA@A? 0B)A [ABiABLriABr"@Ct>[vAB`A@A?"&C*@"C4CHC4C,C4C?[A4C?-$C4CpA@A?X5Ct@ CBgCBVCBʆBB?-CBA@A?mBx@B3CB3CC3Ct7B3C?B3CA@A?C@pSCCQCCBC`BB??SCCA@A?XRB JAB6>B6 A!6n}B4C:]~?B56A@A0vA-oAhABBBBBb4ACtUBC ?*jCBBA@A?B4A^BCBC@;BC`B3C?qBCA@AgB@_A]mBCBCS@CNbBB?qiBCA@A?5~A<6uA^l%A8sAx8ޖ@{8@4C/>|e&AΕ8?PA?Dd'AICB2CB DB@"CB?CB@PA?&D A֮ D6j D'j6xa@D'j68MC'j6? DML6@@PA?j6C^l@zBC!BC%CCV9ZCCC~?$BC@PA?ԟCq&@AZCxܝ58YCH 6 BH 6dB4C?WC5@PA?zCu@uwCBm{CBzCBl>C?9xCB@PA?`C0x@@C4CC4CC4CpB4C?^C4C@PA?qBD}@EBBt4BB\`BBFBC|? BBAPA?C= {@ C7 C^7r+C_7plA`7?Cz6APA?QCe#@N=BC,BCq8CCBCU|?әBC APA?{{B%-@mA37}A 7FBB`APA?[|'C"@iBC4C:C4CdC4C0B7?wEC4CpAPA?DMC;@$CC]CC|CCBC?%CCAPA?'_C@eC)6`C)6Q{]C)62V@4C?i,fC6APA?\B.AHBCRIBC-ABC?Be?FBCAPA?[C@B4C B4C1ZC4C6+B4C?B4CAPA?A%7A1ñAC+ACJABR6 BB>76ACAPA?A~wAU @C@Chy>C@3Ck>=Z@CAPA?TUBj@BBBBBB>C? BB@`A?qC?O@hCC*ECP40NBP4RC4C?(͂CC@@`A\{B= @SBBflBBA BBAC;?_jBB@`A?@aCvn@CCd CX?3CX?3ڸ'CW?3?CH4@`A?slC@2vCC _uCCdCCɊAB?|CC@`A? }0BLp@03A9ͬ7hAu`7Q@r`7 A4C >ȽAG7@`A͸BR3k@RBCխRBC8BCgBC./b?.suBCA`A?cpCN@ivAC4COCB?RSCBApA?> CVP@xhB4CB4C-C4CB4C?"$B4CApA?KrC@^CBCBZHCBHBC?KCB ApA:B@gBCץBC CC$gBC?(lBC0ApA? C*@y8CB4CBkBBBC?.9CB@ApA?XNC>@6CCS6H;C [6=bC [6(B[6?ACů6PApAmC$p@ W7CB/&/CB CB BC?}8CB`ApA?>Cy˲@B4C5yB4CyC4C C4C?mB4CpApA?7dCڻ@ͩ)CB9)CBCBoBB?)CBApA?SBu AHAL72KAL7 OAN7@4C>A7ApA?v*BHA:BBY;BBzMAB8iACS?|ңAtK5ApA?픀BcIAoBB BByBBg@C?ȁBBApA?SB$Aԍ{B>6S_B6:qB6Ž#B6S?:{BGJ6@A?ŠCbLA[C4CHXC4CB3C4CkB4C?5C4C@A?aTAC̝@fz:C3Cb4C3C`NC3CoA3C?V6C3C@A? CIAR,CCY)CChCCw-CC?;'CC@A?_^C_@/sC4CwmC4CGOC4C}A'7?ZyC4C@A?YrCq@ѩCC`CCCC`BC?v^CCAA?B6@B4CJB4CtB4CA4C[?B4CAA?C@6CBpCBpWCB;BB?ֆCB AA?B-@B3CB3C0B3CBCP?JB3C0AA?}B@f9BB01BBDaBBNAB^?7FBB BB~?UkBBAA?BAUB3C/B3Cm$B3CqBC?B3CAA?SB@BC}BC)kBCHbBB?۳BCAA?]BA, B3CwB3CCtB3C A3CHZ? B3CAA?LA‡A+AB-AB^2OABQ@CE?ABAA_qAv/AyA3CA3C".ACj9BCA?A3C@@A?@P@LAC ACoAB'XABN<_@C@A?KA.@\BCLUBCGB3CG4B3C;<>\BC@A?oEBܖ@BBBBBBpAB?BB@A?VTAA~KBCMFBC#B3CMB3CE>>yMBC@A?Br@_CBCB BB8AC?RCBAA?4QC@?9C4Ct5C4CnC4CVbB4C?:C4CAA?ҨAF DABBBB:BC.BCP'?BB AA?/C@CqN7C˃L7{+C˃L7AʃL7?/CK70AA?x3*B/%A7BBBBABe+AC'D?bBB@AA?B@6B4C٦B4CB4C5!A4C2?٩B4CPAA?BLZ@"BBJBBfBB@@C?BB`AA?B@B4C+B4CޚC4C uB4Cn?B4CpAA?"C/@ 9CBY9CBCBaBC?B8CBAA?YBAzA]}7dXAg}7Ai}7eA4CD?bAǪ7AA?ѡANoVAoy9BB?2BBV&ACBC ? :BBAA.B!ABs6B]s6hMA\s6NQB4C?zݦB:6AA}A\AACAC3>C;3ABrJ>WAC@A?VoCN AC>&7JCϞ&7bCϞ&7AҞ&7?׿C%7@A?lJcBKU@=BB`BBP*BBgAC5{?-BB@A?hC@Z`C/r7;ZCGs7,CGs7t\@C0AA?)BD@SuBCBrBCƿBCJ BC;}?8uBC@AA?qNCǻ@XtCT7uCn7Fa'Cn7B4C?tCH7PAA?TB@e&ABKABD۽BBBB{`K?AB`AAsB@PB;6mB;6zwB;6dB4C?4eB0;6pAA?AAnAPXBB*ACAA?l]BjeA^}BBoBB JBBAC?ш|BBAA?BC\AAC㐻ACAC@Hq@C\5?AC@@A?w&A?@oACHACOABBBY=AC@AAq6@6B4CB4CA)78B)7i0?B4C@A?oC\<AXCBuCBOCBCB?WCB@A\B@ `B3CwSB3C\d@ACȁBC"?^B3C@A?UCS@/)BCBC6CCL>BC?ĵBCAA?A6AP B4CB4C43EA+P8`8B+P82>+ B4CAA?l"A2AowACAC}Z@BlAB8>6AC AAZxBPO@a|B4C1}B4Cse^B4Cc@8u?Z#{B4C0AA?YBO @nBBBB`lBBAC~?BB@AA?{C1@%Be@.6B9}-6-C:}-6H_B9}-6?B_-6PAA?3Y9C@X,CB ,CB]FCBAB? R,CB`AA?AI_A*A4CJA4C`?%7@B%7]?A4CpAA?2BANBB~BBFABSBCeu?ɏBBAA?^B APB3C_mEB3CXB3CR*B3C?ԷPB3CAA?}A=ZrA$2BC:BC@3@CBBZT?"3BC@A?JCb'AfDC4CUO;ACAA?B~@ C4Ct C4CP TB4C@BN*7?Cl C4CAA?h.Cx@sLCCMCCpCCzBB?OLCC AA?Bʔ@YXBC)BCBCm2@Cw?=@BC0AA?ˇAC8AABKABaAC.BCg>AB@AA?ϋB̩@ojBF7(jB#F7ȘB#F7 B#F7٨?kjB\HG7PAA?eBzmAABCJ(BCAA?m,(Cɨ@RC4CC4CIOC4CrB4C?yC4CAA?6B5@.BB>BB<& BBŘ@ChQ?BB AA?HrA% A5տA4CQA4C+A8!B8">A4C0AA?BWAkWAB8ABbfABZ@C>*AB@AA?B@[BCBC BCFNB3C?ҾBCPAA?y*aBYLAѕABa-ABd͇BBHBBOC?w7AB`AA? BewAC4C,C4C%B4CPCB%7?<C4CpAA?"EAWjAOdBCOBCeX?C4LBB/u?-eBC@A?mtC@۾BCǓBCCCDTQBC?*TBC@AUB|К@BCBCaBCxACUa?sBCAA?9XBM7@tf`BCW`BCxmBC jAC?~?]cbBCAA? zA"A?B/?B?%C$,@%Cgt< ?B AA?ǛB@B4CB4CZB4C`#B4C?B4C@AA?)yB~*AtBgn6bByn6_B|n6LA4C?xSBo6PAA?B"@BCpBC:@B@AA?AK,AӃA4C`"oA4C.V@s%7VAr%7Ll>nA4C@A?\lAd> AB4CmA4C;A*7THB*7`>A4CAA?IBa@Bf6B6(B6.@6?BM6AA?AE9AqZBB,@BBPAC*BCtD?U [BB AA? C=@liCCBCXCCBC?/XCC@A?ApA@3C@3CD?C"-@C=@3C@A?ׁB7@`)BCBCDXBC< BB?BC@??߬C. AdCBCBt#CBPAB?ȈCB@??b9CX{@@8^CCd1CCqBC{BB?~9CCA??AVBP@ \u@CBB@@B"BCxb??JBBA??ީ:C]@CCZCCCCBB?PCC A??Dy@9V DBv2CBDBCB?CB0A??AD!@}CC$YCCPDCTCC?CC@A?b^C%k@ 9CB:GCBۊuCB?9BB??CBPA?BB@)FCC CCBC`jBB0~?xOCC`A??a܌C@)CCCC?ÒCCۼAC?9CCpA??MB@zCBYCB?^BB6BCm?#CBA??EB-@]BC8BC@BChABA?XBCA?W BAìBCѧBCABBBMK?JBCA?C@1CBX.CBDwCB3BC?*5CBA?A}RAd@AB4F@AB@CAC6=WABA??iBY~A^vBCloBC@@ChVBB_?gvBCA?? "B!@vAB(?ABnBB&LBBb>:ABA??VACA??;D C3@5BB47BBl'CBEqBB?zBBA??{B`@yBCBCBC@!@C?tBCA??AAWABABfAB k=ACu2? AB@???C@)CT[0CBC 8C[C 8CȂB8C}?SC}9C@??פQB@S(CCJA:BY@:B4yAC>)AABA???yMC@R.C(BtGCDBRHCDBa ?DBGBA???8uCr@C$KCϿC8ΑChC8ΑC C8ΑC2x?[C͎C A???C9@}CdrC C^qCVFC^qCB^qC/{? C#C0A???zCv@kC}CC$CgD$C/ C$CC~?1oCC@A???HC+@CBC BcC BB B~?ۭC̰BPA??;D@CECyC/C'D/C{C/C~?C%C`A???B@0ASCAzC3FBzCaAzC ?` B`CpA???T4CK@h:B B;TBBezCBGCB r?hUBpBA???WC9@!#CLC8 CC6ՃCCBC1{?$CwCA???BoX@IBϓBpBbГB2BBcГBlA2}C_?rB/BA???)B~@B\BZyBnBMgCoBBoBiw? B7BA???faB@B}B}oBI9Bv@I9B%BRNCd?B\BA??? C@B%CB%CGhC%CA%C.z?B)CA??ϧBDŽ@lcBCdBC_gBCx?Ce\?1dBCA???dB_@BYBYBxYBW BxYB BxYBB o?k@B `YBA???&4BJ+AyBcCzuBhC8yAgC 6BB(Z?XEzB0CA???B@BޔC|BܔCGiBܔC0BܔCsy?6BCA???hqBoAO;BBE(BB.oBB,AB}l?;BB@@?GC&@QC;uAC?'Ac*C?'AKARCG~?ClYB@@??I C<?VCWnA*CA%BAp=B09=Cs?!0CZ AA@??zB@C"CBeÇCخ? BvB B[?B!·CA@?fCm@`CCTCCm oCCFACY7z?sFCC A@??zCƏ@QCCztCtLCCtLCfBtLCX}?CqC0A@??$D?@\D"RC#DIOC? DHOCBFA}? DTPC@A@??o %D)@ DB DL$B;DM$B 7CO$B;g? DBPA@??kC{@(DCCZC~MCX}C~MC3pBMCy?OCVC`A@??C?5@GݍC|BsFCN(B3ǁCN(BAJC!B}?}CSBpA@?? Br@PGBpCB#:pCwIB$:pCjA$:pCk?̉BnCA@??G/B@qBAzBYA8B[Am?BYAne?sBOAA@?]Bw@CC]CC\VBC+BC]w?RCCA@??&ڌB(@(ߡBY5BtB,5B~JB.5BAK͘Cl?mB6BA@??dPB*A4?B CP5B CN@ߞCi:UBߞCJ ?g?B CA@??TeCh@ޙMCn@?HCn@ ~Cn@;YBn@`}?LCr@A@??JB_s@B ABiB AB7VB AB9SA ABt?gB^HBA@??B@B߅B5CB8CC8C~B8Cxr?B:CA@??@C,5P@/CPbC+CPbC[RCPbCDBObCyd}?]s/CdCA@??A-3AnBNHCncBJHCLAH:A7BM:A Q?oBZzHCA@??B>Y@%B6JBB6JB[C6JB]DA6JB|?KPBJB@@@??iC U@ DBcC=BC?B$B?B~?~C?C@@@??CpG@sC7ZCx3C iC7C iCpB WBI~?$C0kC@@@??CVJ@jCBȂCB:4CBBBe|?wCBA@@??[BX?@VBBlmB/Bۆ@ CսB Cz;?BBA@@??,C"O@CY CCtCgCtCBRC{}?uiC C A@@??-Cna@C_AC#A1C#AnNB`dOC|?CHA0A@@?? D;s@jDC\DCDC4'BBS ?DOzC@A@@??tBC{@CkC:C<(CփC<(CA=(C? CqCPA@@??4BD@-C=sC{?C8lCˆA8lC^c.C`Bgpo?7C#TnC`A@@?? C%OS@XQC+TC.C1SCC1SCGB1SCS}?0v~CRCpA@@??31Cc@}C:4C_1uC3CB3C]CVCz?CI|3CA@@??Bh@e]!C4SCq]CrSCzBrSC?BCU|x?!C`@CA@@??SCn@־CܾRCiCƾRCCƾRCCƾRC3{?`C0mRCA@@??L*Cn@.}#CVpCRCapCV0CapCA`pC"{?6'CCA@@??gk#CI@r%C*+BCT7B_"CT7B@]7BNVz?&C(=BA@@?1qCu@WCAC RCAC7CACNiBAC}? XCACA@@??fB"@UB"CBCZBCVA]Bwv?d6BCA@@??`BD@YNB C|NB>CB B>C2͋B>CKk?[MBbCA@@?MyB@C*CC'C1'ABl CBKjs?dCTCA@@??'sBVAItuBChB C[aB C?vCxq?OuBCA@@??XDWBs+Ay_zBd[CcBg[Cz/Bg[COAͶ Cp?zB(dC@@??h'C a@l2C*C֜CC賭CC+BC}? CRC@@??JC\JG@Cy9CCy9C^@-O@j~?)C>}9CA@??( CX? OC+FB<CC?mBCBBJiCNr?g%C? CA@??CYwT@C58xB CoxBCoxB;:BmxB}?!C]&xB A@?IGC?99CΪB&C[BQC[B))B\Bq?5-C;B0A@??ɗC}@C2CAC7CuC7C5?z0B,CA@??\B׍@BJCB JCB JCd@ JC\w?uNBJCA@??BEABxsCgBxsC2AxsC;#A/}B%S?"BSsC@@??کvC=@UC틲CAzmCͰCMuCͰCAͰC$z?ClC@@??B0?y=Bk@A #CgB #CXVB #C>pA7 'C@@??|CQ"@C[C[CxcCK{CxcCB#=B}?;C'dC@@?? C}|{@7CYCʸC|6CҳD|6C]7C|6C^0~?RCCA@??.`CTz?OmCaBFC$BEnC$B}B$Bmvy?_HSCSBA@??AkG@Q'B\'C;BgCB[CլB[C6>U_BoC A@??-( C*@5 C}B"$C"A$B"Ab B]$SCn?CB0A@?iC,^@~C1CCC#/A7CA@??̺B@ƏBoA9B\A;B\AAKCPl?gB>AA@??jB? AhB}Tu@_BWu@e!9BWu@jA`7C"_?hB@A@??!AA s2A ABA B(@ BAC?PAo~B?@??}B???B_B$A;hCZA;hCAv C >fA6C@@??l!C;E&@YB؋CB'CSCC'CB'CAm?-B(C@@@??!hCdz@LhC UBC"B!C"Bm8BVzC^~?5lC B@@??-B?B8x_C+ZBwC^BwCAwC b?BxC@@??CJ@IC AoCvB.KCvB}BxB"|?xCT\B@@??lB?OKC4C-C5C=A5Cw!CjDCzo?4C^C@@?? C|F@FC eC0^COCfjCOC y@?By}?ʴCCA@??sC @~C*=C"C_=CC_=C#8B_=CD7{?^CN=CA@??hBY])@mC.wCOBeCڿAeC7YB>GB1?wBhUmC A@??(OCk@/Cf*CCa+B'9 ARA CKAP CAP C\@Q Ck>PA CA@??E~B*@M\BqIfC ]B{IfC0KB{IfC{@%IBjU?\BqfCA@??pB}@BCdڌB¦CTϑB¦C@¦Cl?BCA@??A&AhdA}CّA}Ce9@{ CGA{ C{>렑A`CA@??0C&@2B6CB6C1C6C@B6Cz?8B)CA@??Au#AAΰBw=ΰB:WAB?@???B}@S#C$OC@B ClB C(BC6i?%CC@@??vC_@sC;B0Co%BqCo%B; Cn%B9:}?ȱCD#B@@@??ugC8@͗C:BoCk9AUCm9AA-QC z?v zCaA@@??O_rC$0@M"?CǖBLCBJCBUˀB B[z?0M[C*B@@??drCs@!C!C3C8CgC8CI9B9C}?2C2C@@?jB@BL5B!B%B`[?%BB}s]C?T?IBj)B@@?C @Q;C~CvCSԆCDSԆC5BSԆC~?CpCA@??U0DI@DУC6DiCHDiCP1KCiC~?DHCA@?=?D@rD}C->DlCm#DlCXA-B?D,ڎC A@?[C#{@,CdJCCLC DLChkBLCv~?uCZKC0A@?? ۤCzlu@qXCRBHEC7B?C7BD¢@zC}?ȻCB@A@??RB XF@3Bs BBٓBBC/tBCSB33Cq?oBCA@??!B}@BbCjBZC$ؽBZCQWj@ZC=Bt?-BCA@??Q2CyV@K:CX)Bdž;CX)BG$CX)BgA4V^C|?7:C{o)BA@??KfB @\B'CzԜB CtB C]@@ .Co?uBCA@??M(Bɣ@B1C@B1CxB1CACy?ߡBI1CA@??FOA&4A!.BwA&BA-̆@LC\7BLC2?-.BgAA@??IdABAjA2CoQA2Cw9A2C^?YCb>iA2C?A??}CEv@BVCUC*]LCECCECBEC%z?VCDC@A??LXC$K`@&C'5C&OC:CsC:ClB@|?Cjg:C@@A??w~B~?9CbB;B>BC>BB>B8?*BvKEB@A?CQ?̺CgBJBAQCA}CAeg?檐BaB@A??sWB,@P+BBfCBSCAABA @?gB7XC@A??[qC@j@WCFGGCWRsCHCpcCHCmuA?=Amy?qnC RHC@A??0$C?4{CZrCA]CUjCBUjCJCVYBtq?gClCAA?PB)$@A$C:C%CFCAACnA.B2yAo 1C2yAIB2yAt?BܑA`AA??љCC@!CTCC~ C&B~ CzMmBCw?ɻ'C&CpAA??sB#iw@˧B>BB!>BᳵB!>B?A>BRh?-BL4BAA??ecB A+UB[C5PB[C@[Ck7BtB5=?TB[]CAA??BK,t@B0ΧABЧA揸BЧAt0@HCr?}BAAA??އ%C{e@Bd BBBPJCB٣BBxz?}BBAA??6DBd<@vBޏ@jsB@!6A@Y&B8C-Q?)uB .@AA???BC k@(C@;{C^n*CE;{CVCE;{C0BD;{C'}?{)Cz;{CAA??ֽC @BHCuBHCCHCGAHCÐz?fBHCAA??B@B]BBtBFxBuB?WqCx?~BBAA?7B@HtBg\Ct,gBV\CBV\CxAV\C#t?9NtBy\CAA??OBE)AADB02Bܠ3B02BKJB02BW@02Bk?VdEB2BA??}Cj@ 9CBCB CBAC?CB?A???C@WC~ CNCcSC@A??SC/A@iC]UB̶ZC\BC\B*C]BA{?.+`CB@A??J&C?CU6BC7AC7A~@7An?BCB@A??jC>@JC`B8҂C8AbC8A:"C@AA??C,@fQCh_CC_C5weC_CB}G.B}?CEb`CPAA??OB@红BR\CB߬C @YC{BYCp#:?{DB/GC`AA??[Co@yCgByWsCgBД=CgB WBTC}?%7wCBpAA??v{B@x]BB?UBB ^ABxB |Cj?CdBRBAA??wBex@hBABkA BhAUuAdA$o?%B\AAA???bBn@;"-BgCJ%B CŭB CT@ZC47?90BӬCAA??Bf@>%CamC C^mCZB^mCBwfB5M{?x%CЧmCAA??q7B0@B{.C|Bq.C.Bq.CB\0Cve?ftBA CAA??lB@WBGCFBGCrAGC>EBʀA"g?.ɛB GCAA??7Bd;Av_7BB/6BBABC݌AjCpM?Kf6B.BAA?rB"NAA.BCs'BCjvBCQACEZ?.B3CAA??DAm-A,N?{A?(}AJ;?(}Ab?ICb8={u?A A??gfC?C@gC5ꌑC5nC50hRB4C?j,C75? A??CARCCC6?}?;hC CA A??>BNj*@dBrdC8BCJBCAKFCr`?B"sC A A??ȖC (@a5CBAdC4/:A|C1/:ACB?C!}?ϕCu8A0A A??CIȯ@緤CCwC4C#C4CXC5Ckq~? CC@A A??Q[B?@BķC*B܍C5@܍CpBIrB2j/?0ГBϊCPA A?TCF1@ 1BHC'wB HC>8C HCVyB HCw?B73JC`A A?? C]E@ CހoC.CoCCoCY#?nBpw? CdpCpA A??Bm@*BP~C݊&B~CދB~CBeA~C )T?f^#B ~CA A??MB%נ@B,CuB+Cl.B+C}C;BW"Ck?iBC5CA A??#?Cz@?C/C6C)C CC)COA)C1|?>CCA A??ǒCr*@cBA<B(ASBECA A??/\?BA]wYBm5CŸTBa5CLAa5CuAC9U?YBCA A??HKA@A0SA]CA]C~v)A]C@@cj'B>S.AM]CA A??B*GAqBW$CAW$CNAW$C<@+CyA?eB%$C0A??V%C.L@#GBC!BCTCCBCt|?m1BC?0A??\H7Ck?ANC_*BC{B5C{BA{Bn?jR/CB@0A??,B׵? C2CBwQCAwQCBBAN?bB"rFC@@0A??QB< ?1BDA%B wAsB wA)TJA.ICQ^?%BA@0A??>\Cs*@9mCCzUNCନCv^CନCBAନC%x?ZC/C@0A?"PCs @3[C3CиkCnr@M,Cmr@|B9CBVz?!cCt@@0A??'kC䓠@}C4ABC&BC&B|B]C~?KCL#B@0A??Cj@YnC1C1CvC|SCvCSvAvC ~?CꠦCA0A?OB@ CBBq&BbBq&BpvwBD]C+d?QCBA0A??uCҍ@lCBqCݲBCݲBQPCݲBg|?rCB A0A?`kC E@"BqCڙBpC):BpC @pCPs?jbB%_C0A0A??FC͵@ CE.CCY.C3CY.C#O{BY.C~?;Cl^/C@A0A??B/@B[cB4C?@A??JCj@|59BsBIBRGB_5CRGBElCRGBh?dBpB@@A??:wCy@CnBQCpoB#ȯCpoBBpoBSg}?C-oB@@@A??='C>@+CC%E C ,CC6CCkAqTC'w?&2CPr C@@A??1B@DzB`BLߓBBOBB3A8?B[?BB@@A??c4=Cy/@/B露C-BCnCCBCCu?HBC@@A?? CO@KCc$C2B(CFC(CWڻ@(Cl?VB&C@@A??[C#@5C .CPC .CC .C,@ .C{?kC%.CA@A??OCF&@!>CRHCCCICRCICpAICz? GCN,JCA@A??ACE@VCĭBCB"CB{ABvRw?N C)B A@A??h-CK@*B-C"B/C^cC/CsB/CBBr?+BMZ2C0A@A?=a\B. @BhCBXC+wAXC6bBOCB+K?=ދBC@A@A??Be@LPC# BC B ևB BJ*wBC.Cs?KkC BPA@A??2>CMg@#Cw CCf CWCf C^Be CY{?%C C`A@A??IB!Hb@҉B?CdB?CZ$B?C&0ABfx?:BCpA@A??i]C`@*7C2HUBQE.CUBBCUBBUB|? 6CnVBA@A??kC5P@" CpӋBr CBQCB@B}I{?GCYBA@A??EB֤@aZBCIB뿨CA뿨CY9!AC1? BcCA@A??"B.A3B?C\2B?C=A؟CB؟CSI`?ˮBCA@A??AH)A;BUjC/A_jC@x%ZBBz%ZBĎ>vAjCA@A??_+WB5"AйBFwC ؂B9wCA9wCV9BܵB;%b?0BFCA@A??oB{AqawBOC}lB!OCL OB!OC@ A!m?/xBOCA@A??pAc%?AIBH+Crw2BH+C?G+C+BCqI?HB+CPA??A8@*CBBeȚBB< BC BC"?BB?PA?ޟCݑ6A֊C}7nCCJklC2CJklC5YCBaB}?zCBmC@PA??CXd@R8CCޠ'CaCBaC^QBtC70u?*CC@@PA??$C@wC#CC@C)C@C@BX}?*UC C@PA??6[CX@#C*Cu"0CCjvCCBCںv?^>)C C@PA??^C?sC&CB&C]B&C @TCEk?E B&C@PA?.C=4@|CCAvC AGlC AGӊBOC}?hCZA@PA??;[C޼m@RCmߕC( NC!C|9aC!CʘA C`{?#NCCAPA??B3@B3aBBB`A/YCnQIB/YC>2BBAPA??p B@kBBGBBYBCtBC?bBTB APA??+C';@[+CBվ'C=BE'C=B?:>⯓C z?{.CB0APA??!Bv@MB CuJB C 13B CA^CZ?͘BsC@APA??BZ@wBƗyC$ByCkByCAyC;t?BxCPAPA??&XBs@pB[CkBSCBSC=HBSCȹk?:qBC`APA??I/Ck@Cr4C CI)CMCH)CQBH)C[z?CCpAPA??"GRB!@`BOA<\BEuA4AAuAEBJC@]?.BgAAPA??jDBЏ@B7gC1ֽB7gCIB7gC߾ALB_nr?BHgCAPA??D1rB3@ ;B6XCY}BC=m?#BC?`A?,!B}5@tBmC7BinCxBinC!AinCHT?aB1nC@`A??$ODCĎ@PCC@SĆC)ĆC7M'B@Cx?"RC)kC@@`A??I>B7@3B_K)C`>B,(C\?CABC>ڞ>B (C@`A?? \qC@|C3BuCmBgeCmB;;|A6CH|?sC?B@`A??_Cb@ BɋCBӃCӋ7CӃC(BӃCht?CۍC@`A?8:AN@BqV @B @fB*6CC*6C3?*|B>?@`A?C@Q|CaZB[?rCYBCYB^BYB^|?'xChSBA`A??[CX@%C0~AC(DCsAC~CsACZ5BsACt}?CACA`A??UCy^@ˀCJcCI}CcCP*CcCB BCA`A??dBd0ADjBuC^BvClFBvC|6@>"C#k?äjB$CA`A?+A,AI6AàCAàC8?z C SAz CZ>XTACԠCpA??B62=@&BBZBBPBBdZ|BCw?BB?pA??g!CE@gCy`CcCAaC"CAaCXBAaC|?ھgCbC@pA??uACnj@CXCCC]CCiBC7y?V`"C`C@@pA??lC@SC^9B Cp_9BCo_9BBk_9B|~?C'q9B@pA??'C@/CsCדCVsC`CVsCZaBUB}?MC3tC@pA??JCF&@|BLBZѻBB~CBXjBB^l?BfB@pA??,B4@N CeB~+CBquAC5CCad?j C7B@pA??G`fBy@eByC@o`CڦACIA`gCGAERBNC}?&CTAApA??QWCZ@i6CvB 1CvBMcvCvBBvBc{?n4CgB ApA??%Ap@V0BaBv,BfBAdC8ߒBdCA>&*B䳹B0ApA??IBpt@BB>kBBSshBBSƠA Ckl?BnB@ApA??Og:C2^@#C1C۬C /CQC /CTB /C{?s$CCPApA??s"BP@ BFCB8CTvC8CB8Co?DBC`ApA??=Ai!A B_9C_JB^9C J#A=ݫ@1B>ݫ@>; B6CpApA??nB<@}kBCkBC!BC0AuXCU?lBCApA??/ܝB@:B&PC B%PCCB%PCcA%PCk?CmBOCApA??)B@B< BۛB BhB BAVCin?uB BApA??; BMA-?B)ZC1B.@%+"CdVBCB]BBBC|Cv?CB@A??kC@$CB΄CBCB9ABW~?ˊCB@A??gCa@Cr;C7Cn;CԛCn;Cw!sBn;CU~? NCr;C@A??A]@dB 5A ^B\5ADlBf^?C;Bf^?C>oBr@AA??ĘC@`/ECBCk@C\C>B\CBo]B`{?HCCAA??SB60F@PA*#NBA?!NB`B?!NBwB?!NBivV?*AQFB AA??kB@MBNC`B+NCUHB+NCAUCUi?J1B)C0AA??{OCUS@^_jCAJ_CUA9CUAiBkMC<}?ޗjCIA@AA??(C1@ȕC`zCd&CZsCrCZsC6BYsC8~?CgCPAA??B)y@{BB9 CB CB CdlA CWs?۩B욝C`AA??¥CTq@r'COCK;CNCdCNCWBNCD~?|C˨CpAA?? C@,B̿pB)BpBLCpBTApB9y?BqBAA?GrB@,B,CXB,CQA,Cŋ{Br Cl?B,CAA??ģBY@BkB3BzB=w|ByBA>wCu? oB7BAA??aSBM/AeB"jC]BjC3BjCA CU]?fB8CAA??GB@~cB9BBABUBDBPAAaYCSC|?zBf?BԕB@@A??3B+@BgCnBlCBlC/A/CAn?vBC@A??kC@9CB3CBPRCBBB:{??B7!B6~?KCB@A?? wCm w@#oCC<jCC{0CCMAC~?7pC=CAA??AQ@>B VC4 B VCDA2B`=B2B> BQUCAA??tC@@BQCBQC CQCFAQCv?B0C AA??N^CIY@FC*Bf QBFvB@AA?? BD@WBEkCVB>kC *B>kC8@B#2r?KBOCPAA??B۽c@nQB(&C6B+&CPvB+&ChhA+&C=?r?+ZB2C`AA??5CT\S@z1CC3CC<3CC)L?C }?2C켨CpAA??vB1@VBICHBbIC< BbIC)B A_j?BICAA??2bB!ABOBu/3B*MBT/3BE@BT/3BY@`CbGa?)MB߯2BAA??>B,AB^AnCUAVnC8AVnC}qAVnC6>^AɌCAA??ꁧB[@HBVCednAZLC`AA??2C Fo@AC-CCCCCJAC"z?xC.CpAA?? B.@׆BC؅BC8BCĂ@C"p?-JBCAA??:3BA:wB{gC emB{gCwrA{gC+-BMBhW?HwBmgCAA??eBɢ@?)Bv"|Cc]By"|Ce.By"|CWBy"|C z?&HBo-|CAA?pJB9@TB&CvB&CruB&C">Bs?B~%C@@A??B@菄BեCBCtBCDUBC #l?wBxUC@A??TBn e@-CIvB&CO{BBP{BB}Cyy?/Ch&B@A??ӌBS@n.BSCnpBRCVHYBRC 1AAMc?qwBRC@A???AL@=BͯB5B=ڮBeACdoBCL?$ABe[B@A??1A@gRAKlCLA]VC>'C3WOA/C_V>7^A#CAA??MB7@CmCcBmCBmCXAkgBy?C^mCAA??eB7@%BQ|>C5B3|>C-B3|>C@A 'At?B=>C AA??oB*?@ }B4B]B.B B.BrBL9Co?]BNB0AA?#B?@aBTCkBTC,pBTCUBBHrw?zB֟TC@AA?? "BF_@*8B.ڧC[BCCOBCCACHq?(+BCPAA??L'B6@*|BPC|BPCo^BPC! BPCeo?[|Bi3C`AA??C@&C[ĮC_$C]ĮC\C]ĮCmB)C_|?Y&CʮCpAA?{B @qYBKCQBQC!BQC?BQCWj?jYBLÏCAA??0BUi?ACBiCBiCAiC@"CChT?KBCAA??_|B6ABCbACKBC?CI?uBsC@@A??&BHA@B BM=BӨB^BӨB߮AըB^9E?^B~bB@A??BƄ @kB`BjbBŭB,BŭBu BŭB%h?lB2JB@A??JC5ݥ@%JC _TBM(DC_TB*eLC_TBA^TB}?LKC+TB@A??BH"@፹BNBϴBNBVBNB<2$ANBXt?BMB@A?C1w@Q}CJBQyCJBCJBAJB;~?}CKBAA?BRE@B 8CKB8C{B8C|iA8Ce,i?WďBj8CAA??B$T@ЦB%C%BCB~B@A??j&B:@\BxcBNq^B}cBmu>A~cB.BC޷O?#^ByBAA?? Bx@^BEC?BCjM@C B1C#?:B#CAA??BY@ C~$C Cױ$CࠍBױ$CFBXCHy?( CD$C AA???Bm@r B&lC&EB&lCB&lCHAК`B0iu?=ϹBlKlC0AA??WB}@xBCdBC8=C`BBp?B4C@AA??Bq@{B)BSBu)BBu)Bw@})Bv?B)BPAA??tA8!AA鄪B'ABB&ABz PAECoH?A\$B`AA??F4B+AsBWuCQBWuC@WuC׳B;B>p?BguCpAA??#B @B~BC|B~BuB~B*A~BHw?BdB@A??%B8D@F.AfYCnA.YC:B.YCCXB2>CyeC2>CZA2>Cb}?7BM>CPAA?B@еBׯCyBگCIBگCvRAgB.w?صBNC@A?? CA@AIBСAByA+C-B+CC>|AmB@A??PB]4@bB&Cv,B&C\C&CPVB&C%w?B/&CAA??[B@RyBMOCKoBDOCbBDOCѹA=B`?uxBk/CAA??0A& A-)B|AV"BrA[ZA/RChmBB/RCS>(?(BGjA AA?uvBy@aB$?BUB7?BXB7?B%A4?Bs?bB@B0AA??AeYAALCAZLCM@YLC]ZAA>0ALC@AA??rACAhBxCdBxCwб@xCTA5BXZB?BkyC@A??IB U@8BCa0BC-ACA2+Cl#F?7BdC@A??zBU4x@Apl CA~l CA~l C@~l C ?쎒A C@A??B@n޼B{AzڳB{AuB{A'5B{Az?pBlAAA??&'Cϊ@CC B`4C BC BNAqWC~?^BC[ BAA??lB `D@q+BRC_bBRCUfCRCPBRCXz?b%Bh\C AA??3QB>@BCXsBCBCSACw? 8B{uC@A??00Bj@e]B؋BP_GB݋BB݋B8A݋Bt+s?]B֚BAA??4Be@ FzBՆCeB ՆCA ՆC^$B!TBq?*JzBۆC@@BM (@B4CcB4C B4CA4Cs|?B4C@@?C@`+C4C0uB4C.C4Cp$iB4Ck?5B4CA@~NCYLZ@ܻXC3C3C3C.;iC3CUB3C?6:C3CA@?ct C.@B4CC4CC4CAiA4C?VC4C A@?qB!98@PGC4CeZC4Ch A4CjFCc87E?%nC4C0A@?9OC5@ݣBcBCCC=jCC~?HBC@A@?67Cdmf@|CClCCׯCC\B3C?oCCPA@?D@j!D3C>D3CʜD3C@W>C?nD3C`A@?ïAԼZA$B3C,#B3C\ACZqBC>#B3CpA@?A`A/C(CCtB4C.C4CYXg?+CCA@?BC@%C!CCcCC1ACA@?8B~%A5A3C%úA3CA3Cz2@3Cd ?vA3CA@?5/BA B4CTB4CLA4CA%7D#? B4CA@?)Cf@.CCCOCCd9AC?CCA@?AzӄAB~69 B~6<A~6.A4CM?ZB6@?@?B@\BV!NCBB BBۨd?B5?BBA?@?yC`;@[DC΁BvC-HmBpCC/HmBB RoCM5|?_C}rB A?@?CX@ Cʲ@aߙCMXyA>CKXyAzBIXyA!{?CNA0A?@? B *Y@-B"CbwB7VCS B7VC-?>VCo>A̙xC@A?@?oC ]@`C BCU BPCU B7[BVwVCX|?CBPA?@?/D_@e$DIC'DtC26DtCyrBtC C?$DeRC`A?@?Ch@CBИCۓB$DۓBpBՓB?5zCŶBpA?@?kףB+@/BBнB"BEB"B5BȐC̈a?EBBA?@GB t@GBCuDB CC CVڪB C^?YBעCA?@?"uC[@ CC8CCT=aCC& BB}? XCqCA?@?J6CR@ad'CęC $CșCCCșC/pAșC|?I'CCA?@?A}APMBC@BJC$AoC BoC+>GBCA?@?PBɋ@yCHC0 CKCC_BKCB)CŚy?qqCCA?@??B@CpqAgoCgqAuBcqAB.nHCx?BCLAA?@?.B@)BĨCLB̨C#~B̨C@;AܙC/>r?VBШCA?@? Bn@BnC/BnC{CnCBnCVx?BukCA?@?CBAA0)-B&C%B&CA&C5AMC] N?[-BlsAB@@@?nCm@CC tCfFCPCDÅCPCCBQC y?pFC:C@@@?bCذ'@CzC{BC# CC# C C" C-ow?G#C(CA@@?ocCb@[CS.gCƪC|Cm.C|CBB{?aČCN|CA@@hC?lv Cߜ(C:Bk?C!Ck?CdZBk?Cm?PB@.8C A@@?ZCwk@C?!C`6C/CC/C;B0C{?;C C0A@@̩B}@ rB݁B!cB$6B7A8aC ıB8aCS>&hfBNWB@A@@h5C>C@aRCCr9CCbCCA'C}? uCtCPA@@?sC;y#@ICfgCwC(CfdC(CdzAQCy?){cCC`A@@1C4.@bB%CBCQWWCCBC$Cv?YCTCpA@@?ĵCp/H@^CC;C0CGB0CAlBu? CBڑCA@@?fOCd@h%CIC"C C,uC CSݥB C{?&CCA@@?TdTCY@UCC PCᴪCHSCᴪCN@䴪Cʷ|?UCuCA@@? `B+@sCϱBCFB0BGBGTB$vCy w?%C~BA@@?k۷B˳@\B&BB5B]YB5BV"A@CCzo?BOFBA@@?xBz@B6ۭCɠBRۭC2cBRۭCྼA'C'n?xB=DCA@@&Cw@BӎC#tBӎC9AHCӎCPBӎCAz?BCA@@?Bъ@VBXRBB&LRBB&LRBP B hCx?dBBRBA@@?KB&!AB{B)cBrB*@rB BCGi?TB{BA@@?'@+BA?AuBZCOiBZC1AZCQ!Bq.C d?uB|sCA@@BS@3B~Cy)qB~CB~CXB~CSx?!BhpC@@@@?B1@eh~CMKC&C/8CҜBe@j0SCe@%D7?6Cִ4C@@@@?sCob@@C3?C'CCFCC" CCx?6C#TC@@@@?gB @(CmCo'BކCAކC!B{B+`?q3BfqCA@@@?Q,Dg@;DrTBj0DRNB&DRNBBgCk?6DGOBA@@@?MC>O@:jYCA5{BCw'DAKCw'DAA{'DAw?IFJC3nA A@@@?MC@3(CCC^CǯgC^CoB^Cn?_CkC0A@@@?TC @p$C^:BGCjBTCjB^AjBux?6C{UWB@A@@@?uCM@CTCjC/9CC/9C:C^r,C~?C]ZCPA@@@?ưCx@nBCB,Cx7C,CI1B,Czk?RBuC`A@@@?`աBT4@줐Bd:AsB#A>B#AS@P<>C6MX?qB@pA@@@?n CGW@\BgBB-BC-B@!B-Bo?]BSBA@@@?r`Clwa@}qC֩BDmCA֩BOCA֩BmoAuC(}?,oCUBA@@@?ѺB҆@NӠBlCԜB0CB0CA1CIm?eFA>DCA@@@?WBw@bBBBBMBBZ 0>BMo?BBA@@@?uAq#AEAgAAAAA@@@?Bʴ@T\BABTB?BLB=B2?4VC;u?/lBBA@@@?A/AMBɞCBΞCE>ƞC)B:{B7?F B괙CA@@@?J0BFAA&CAC.BC{sACpQ?AC@@@?BCe@|FCk^BPCBsCB،Bg xCB}?CX"B@@@?S+RC@`CFC,0CECfCEC^ XBECZ/x?y7CEC@@@?{B+?vCfBC_vBA_vBUBqCi:j?uC@tBA@@?Bd@^uB8n@t_B?CÞB?CWB?CiII?wmBoCA@@?*lC<@ gC,A*yC^ATyC^A#Cz=C}?PmCSA A@@?B Ta@ABC]fA",C&@",CIAB%>@'AWC0A@@?CBV@ EC+BCBnCB́ABm"~?Cds#B@A@@? DϢ@DRBD@B D@B8A@B'? DGBPA@@?V,0C&@'*C}Bu,Cg9rBUz&Cg9rBg@[pCAv?+C:vB`A@@?~RCB@aMCB]HCBUBBBCt[y?HCjBpA@@?>BP@^B`CRBCLBC4ACqi?3B CA@@?XB-h@!C1CCCuBC%BgC{w?&CCA@@?2 Cy@yB!(B^`B )B,&C )BB )BWw?BBA@@?c26Cme@C]C,C]CaC]C\B]C{?C ^CA@@?D C)t@84C)ơCC͡CC͡Cvh@eCh6z?5CաCA@@?BĐ@3GBAJChPDBCHCs=CZCǎCZCzBjB4Lv?N;C:CPA@@?: Dxɏ@(3 DmT@? D~O@DO@i{AO@@?z DQN@`A@@?3B+AB䜧C޹B#CsAEC;BFC;F?-BCCpA@@?+>B{@^B6C B@CACRCiB[Axgz?VC TC@@@?p BH?"CzBnB=Am@PCsBPCW?a*BA@@@BFi?<:CkB#B(CNB(C'BNH3CQg?C^ֱC@@@?\C:<@CCdBńCCńC_-CńCu? CC@@@?\C(6@CC^VC-C|?C}C|?C#4B|?Cx?92C]vECA@@?QSC*@x6Cl@rCуCJ{CуCYBуCy?)_CCA@@?ClG @oCBGrCB@CBBBx?o}C[B A@@DBv&@BNCPBѪCBѪC8A!C%k?B9C0A@@?VD'@ D ChDW7CCW7CΒCnBE?D0|C@A@@?3/Cf;@CCCvCΗxCvCav:BvC{? C 5CPA@@?Ȍ CvC@BCB}B C}B A}B;r?BtB`A@@?b2B<AbAۑC~ACc?C6AҋBRGb>9ACpA@@?Bm@(%ChrC\!CrCٷBrCB{Bw?KCtCA@@?m(C{e@>oCt$ChCm$C5Bm$C jC7pC |?3hqC]$CA@@?A]BkD@ BՖBךBՖBAՖBr_BjCtd?nB6ԓBA@@?2C@KьCCMC8C:C8C~@7C&~?CaCA@@?GYBm@FhBvkAaBrkA BrkAލA*BCwb_?=[cBm[AA@@?]BF@eBBC,BBChFBBC'@ziA&t?+BBCA@@?Cq@;BoBB/BeK-C/B#~7B/Bz?]BBA@@7Cv}q@4C7#sCL\3C6#sCC6#sC8FBԌ|BQ}?4CsCA@@?tBAB>tCB6tC B6tCr5BjBo?\ǥBktCA@@?΅A(C>CUC ?CA2C ?C@0A.J|?g-C?CA@@?UCM@sCZCCN CgCN CHAb'C~?jC C A@@?CPR9@hC;CyjCjCÔCjC9|BjC]|?ynC!xC0A@@?iB֋@[mBcC7iBԵNCAԵNCAAM?ܓdB,}VC@A@@?G CVt!@=Cx CTCᕍCQBᕍCAWB s?xC&CPA@@?L CR@GB#BTB#B C#B>B#BKp?sB$B`A@@?)CC#h@-CCfJ&C C!C Cɮ@6Bpw?J,ClICpA@@?@B@fBIBWBB~mBBBB|C"X?aBiBA@@?!>CCA\@ &CY5Cj#CDY5CB]CDY5CdjBDY5CV5|?Hb&C6CA@@?!BF@2B$C֧Bb$CKxBb$CwAH&Cn?B[CA@@B%@6BCBCCŢBCACq?5B( CA@@?ĊpB@NBxCBgCfBgCAgCy??Bz]CA@@?ZcBA!rB2g?蒦BlAg?AqAg?ẃBB4Cd?vئBu?A@@?BC}{@PC8րC@CԀC/CԀCk@ԀC2z?BӀCA@@*Bx@zBȍC6BɍCBɍCX1AɍCAy?BCA@@?A6A%B=BQB=B4@?tC#BtC&2?%BI>BA@@?!8B?ABwBAwB2BwBdAwB.P?R BB?A@?RCu}@CCxCWZC~CWZC8[A+C5|?8ȏCC@A@?ԋCW@C?BzCABCABBAB{?RCcBGC@A@? B@*tB-6C BCMB~^CB~^CDP>B $CAA@?8D,@k.D!cC,DbC#CDbCܸBbCE?rQ-D,CAA@?74C^@lCBLCװB%CװBRACװB{?ΦVCjjB AA@?7CGb@ ]C}+B@C!6BSC!6BeBaC}?{C#3B0AA@?\Bⱝ@TBSBdBYB'@aCYBaC[#?*GB}B@AA@?U4CJ'@CiCCܩC[bBܩCUBCev? 8&CIrCPAA@?'+C5I@CцC&C=ݱCߟC=ݱCϕA=ݱCfs?CC`AA@?U2 C]@BCUBwCsCwCM BwCdKu?+BxQCpAA@?4Cn@`CR/iAi!A0#BABAiBHC^BHC"?BP.AAA@?K`C`@OCZCPC]CalC]CqA]C\}?7NCoCAA@hGBO@ BMC~BMC/g{BMCA Cs?αBACAA@?OC8@CCx[ CC-M+CCBC%{?=C)CAA@?]B%A B&A0}BA#BAL+AcPCTq?]BߑAAA@?IuB@$BۃB uB܃B}B܃BVB܃BCwx?"B؈B?A@?#CpO@(C1UBC/Ca6CU/CCU/C !WBC:x?HAQCAA@?ZB AUB$CTB$C<+B$C%AICl a?}hUB+CAA@;B0ACǟB0CVB3C(@f,!CdBf,!C2_?!BKCAA@? {B\A6BtpC BrpCgBppC(BppCXd?'*BpC A@?qEC7ACICұCB4C?C? A@?-xC(?ACCwwCp}CxCp}C8Bp}C-|?Ct C@ A@?CXe@C>cCC)]CC)]C`{AQ$B[}?CP^C@@ A@?EC$@zB* CCm(CWWCm(C=lBm(Cxp?|CC"C@ A@?8yCyme@uC;,C̞C Cz(C CCq(CZy?]C IC@ A@?)B?GB.CB\CC.B\CC:vA\CCQG?(B9C@ A@Dې@C=C{CCk DCuBCж~?1%C7ѡC@ A@?&MC"D@vCCvCCn;CCОCC|?+FtCaCA A@?`}C?%4@CC>ЫCCCC:C9C5}? CCA A@LC"@-C2CyDC7CDFC7C?7Cv?9CPC A A@?`I Cے'@HCsAxFCBdAOkB?dABNBC}w?FC`A0A A@?iFC%[@߫^CeC$XC֞eCAl-C֞eC,BT{FBn{?3UCEcC@A A@?sCӔ@7CzLCeCMCCMC|BMCr}?UC+tOCPA A@?tCmF@+~B VlC\BVlCح!CVlC +BVlCdw?BnC`A A@?EECOR@3&C*Bs!CI*BlhaCI*BBI*BV{?C"CW BpA A@?OC@qϘCV&CYCW&CCW&Cy@W&C~?vC:&CA A@?д>B@.(2A=C)*ANCnCFANC(?NCw>1AbCA A@?^B$ARBbCZ\BICvjAVCIBVCB,@uBNP3Ag vBJI4AIBHI4A$A@I4Ai?tB6AA A@?yLBM@*BLCJ&BNC̯BNC.8BNCZ_?8'+BCA A@?Cr@%BsCBsCI: CsCzYBsCC|?]BsCA A@RBzHAjAT@ܷAQ@_AQ@@";C;?A [@0A@?BC-@gBC CCPQNAC6CBju?CC?0A@?ݰC@RNCWCD~CYCCYCl;C[B4|?Cs9YC@0A@?ǜCZĥ@C@LCyԍ@]Cyԍ@$Cn8C{?ͶC@@@0A@?C8٥@CɲB-CBbCB:AB{?ЎCB@0A@? `Ch@ CѐCCҒCCҒCC HBz?CC@0A@?mC@@㭼CzBGCBjCFY#BBa?ԴBȉC0A0A@?`C<:@FCC CчC(CчC+BGB#|?oЎCXC@A0A@?-C-W@oCBtjCcʦB&CcʦB/BbʦBy}?HlCӥBPA0A@?XB~@`QB^EC]KB#DCZA#DCaA"C#1?6LBjB`A0A@?WrC^`@,\CC1{CCfCC0A C+~?AC֞CpA0A@?)CnE@rL6CZBʿ0CB CBA:XC+|?63CBA0A@?i1BD@n{BwCÀBCsBC*3AcCe?oBf=CA0A@?tYB%@pBT C3AjB3 C}B2 Cj[ACe^?/rB CA0A@?AOC \@\jC GClC GCC-C GCeyB^A\K}?VjCFCA0A@?$[ Cv@εCCXCCCkXC>BjXCBB>|?@~CCCXCA0A@?u5B\'A9B.ϚB5B3ϚB8E@2ϚB׊BͳCPc?BBA0A@?A,3'Au#/B[C6L(B[CA0CVnB0Cϑ?5/B7CA0A@!B4A=ABABBB'oABH;?AfeB@A@;DQ:A Dc|5vDʲ6.Dʲ6R@A4C?. D5?@A@? C@CJ*CBJ(CCJ(Cx{BK(Czh?ABu)C@@A@??C8@:C@BWC$BnC$BfBɊCcy?|kCtB@@@A@? Ca@C[0CCCjDCp7BC~?dCC@@A@?aCc@;(CiC)6C6CB6Cl sBm"Cxx?0.CC@@A@?eC"N@kCNYCyC1YC C1YCDCB/|?C'YC@@A@?`9Cr@MB[ACRAD*CRAH\ARAn?B"yA@@A@?dfB҅@BSBջB.B+@1BIBLC[N"?L B&BA@A@?ҠC-]@ C=A2ƊC A{ϳC A)%B A}?7UC qAA@A@?¢C?Q|@b=CH@\dC]K@HfpC]K@1B:/7Ci}?ySCxi@ A@A@?fVC!/m@SFCB=C oBeC oB`"B oBz?>BCIB0A@A@?4'Cp@(ѽCgBFCU/BCU/BkBT/Bt~?CB@A@A@?mCH3@6(Cc5AvC4A[ C4AE0e@o4AIv?CAPA@A@?/ԕB#y@BCsB CB C1r@ CTf?7BC`A@A@?&WCuD@YCr[CWTCS[CUCS[C;?_[C%}?uZC CpA@A@?CO@B,Cq B4Cl3C4CΖB4C w?IBECA@A@5BB@>…B(^{B"B{BZB{BTB{Bo?BovBA@A@?_QCtQ@#BCBCCC$BCLow?Rj?BbEBPA@?S:C@BCBCVCC8 CC?[BC?PA@?6CYAcXCC|ǯCC[CCkoo@C}?3.CnC@PA@?WCƸ@wtC<_B2CBCBn!BBT|?X2|C)/B@@PA@?oC?-@B;CB^C%C^C0 B^Co?B)C@PA@?A#@A)D)C[BEIC_?B3.A4 .B^DAC@PA@?,Cg@g BAB^AWC^AB^A]n?B @A@PA@?u ]C-[@ACBܤCXB+CXB1B+֙C{?C˂B@PA@?I vCn-@?CCpCCCpOCCCBC|?AC CAPA@?:eB@ ߆BDACЂB7ACtA7ACg2BzSA@?RBav:CAPA@?C@inCtXB cCmbUB CmbUBBmbUBs|?nCΩPB APA@?Q2C7A@>BCByC]kCyCByCw?BC0APA@?Cn!C3Cn!C .ABCI{?EC{HC@APA@?zsB@N BBK(B״BA״BNIB6-CRd?IBBPAPA@9C5@}BGACBAz=CAIBAkz?OBTA`APA@?c/B,@Bg&^CBwH^C1#BxH^C6B!)B5d?áB_CpAPA@?lBu@7Be-ECJ8BD$ECBD$EC,B"A&r?BECAPA@? MB,@ACuACBC^@ၢCE'?+ACAPA@?B}u@dB`CgB`C C`C-BB`CAt?,BCAPA@?bB"@s^BC]BdܲCiBdܲCGAdܲC5c?]BkٲCAPA@?P+C@F9CDC}8CFC'pCFCAB}?8C﵏CAPA@? A@A$fBCBi BCB;@átCTsBtC} ?_TBE$BAPA@?jBJJAn֖Av&C,6A&C؍A&C^@&C ?Q)AfC`A@?%C`#AC4CtiC4COC4C(RB4C?pC4C@`A@?C@π]CTCaYCCXܳCCVCCh{?XCKC@@`A@?TB@@rB~a@O2B6)CڧB6)CBlR2Czm?]B߲C@`A@?b'CZ`!@37C(Cen>C5Ar>C>ABA`A@?B.b@"|B0$!BtBB B9ńBB B@: B-L?yɀBa`BA`A@?JC.K@@CBgCB.!CBH6AB6Wx?wCB A`A@?Bey_@BB'BBBBABq?BB0A`A@?/B-@BeC7BAC$B@CA?Cu?4~B fC@A`A@?B8Z@PCѴCzCCCBCBpZC1x?CCPA`A@?uB̥@BփA CA`A@?&*vB A;eByC \BoCKBoCN@9C6\?beBCA`A@?AzRBA9AS@/AS@@S@@@uN7C>!7A9@A`A@TBB7&@GBCqBC'$CCݝBCz?BōCpA@?lBLb@o*CB'CB8KDBC&XCC ?LK(CB?pA@?CE@w~CkC{CCVCCACw|?C!C@pA@?C@\ C)PB~?5CgC@pA@?.C @ȌCC݄C CC CB C}?XCACApA@?MCB}@ BCC:>CC)WCCAC5{?jACȢCApA@;BT0>@[BhQ2BBQ2BBQ2B(90Bv`Czr?nB3B ApA@?eA2AcBCBsC?B8C#C8CGD=?mB`ΨC0ApA@?AA2AKC A2KCX}(@}A AAi>AVAOIC@ApA@?maLBQ`@B4CHBC1ACF(BLBuZ?BoCPApA@?EC:\@ C%BC BzC BAB7zy?B C7B`ApA@?mBA8?DBpzC6?BzCmU@zC)1B,B 4?-GBCpApA@)C&F@CCBC?hBC?A@?CZu@ CGAC)AlB)AA2PCq?C\A@A@?!C\LAݥ C* CkCR8CF-CR8CBR8Cs?[ CC@@A@.C@j,,Cz-C&CC*CCU"@C,x? X.CkC@A@?)X&C>@aUC̹iCOCiCrVBiCϼBWBz?;zTCLkC@A@?jdCrg@^aCSɀBq]CȀBfCȀBAȀBC}?bCQ~B@A@?bCW@pCTCێC4C C4CAid%C}?mC;C@A@?(WC"_@tC,BJmC=B0~;C;BQ1GBC|?vCBAA@?kBkr@k]BҜCBCΏ.BsBְCsB]?*~B&CAA@?C`3Cf7@yS(C:mC$CUmC$A@A@?SkCK"dA}CXYCG(wCXYCoZCXYC&ABcB|?2l|C='YC@@A@?tCN@7CC/2CC˃CCЈBC#!|?B8C QC@A@?3Bǘ4@LBDC8B&EC?B*BB'9?sB&C@A@?џCѧ@CcCѓCdCpCdC ACB~?hCτC@A@B @+wBBqBB#CBVBBm?vB!sB@A@?R{CK4@CQCVBPC6*CPCɱ0BPCnTz?CCAA@?mB˵J@xuB8ħCoByħCSByħC;ByħC9k?nBèCAA@?TBL"@HC "CC "CCB "C[3BNC0y?a(C"C AA@]C/FQ@7MCoC'BCoCfsCoCABoC|?0MCoC0AA@?29B>*E@NBWBB#BC#B$A$B\y?{BtB@AA@?M C5@4B.NCBNC1CNC BNCw?#BCPAA@?BBK@ۼB=E}CLǽB:E}CC C:E}CԀ1B;E}Caht?aB<}C`AA@BW@CECAuCECLBEC;?BԬAy?iCECpAA@AB ABbB BB[pABYB?Cw^?BBAA@?Bw@BCNBC'BCUACs?YBئCAA@?zB@=zBCmqBCH? CCBCr?]ZzBBCAA@?_/B}HA>~B+CcnnB+C?.V C*uB$V C<\`?5B(CAA@?QIBFABb\C BP\CAP\CV@A#BS?,_B\C?A@?DB|8@2BCB/C^B/C `YB/C`o?䖔B;C@A@?~ CF.@XBTC?AXB AA@?5!B@pA}DBAzCBjAzCB AߐC`?AuB0AA@? B>Q@̈́BIkC*BIkCKBIkC>YBIkCBm?BJ`jC@AA@?>Bt@cCB A+LBA=BAJAAwp?唤BdAPAA@?gnWAC`AA@?B=և@BB'BBBB~FABKSt?BcBpAA@B4@9BvKBUB}KBAʐBG>A飿BH>AdAJ>AKq?mB5@AAA@?`AYAmpA MCAMC?AAqAAy?AVNCAA@B @OByC-ByCByC݇@>ECy?ݼBC?A@?{mBE@mB|;B4B3;BB3;Be@/;B3t?NB62B@A@?B*@IB @3CqB 4CqBSBqBaBFpCo?{?{2CqB0AA@?OBW܇@BSB|BBvBBXBtCs?qB֢B@AA@yB8@]BjGCBSCPLASClMB)Ct?BTCPAA@?%*B$8 AUBBI7BB׭ABu A!C40? B:B`AA@7BAKB͢CSB͢CKB͢Ch;Ct8?BFҢCpAA@?wB@<B-RB BGRB-BHRB>BIRBsR?B9SBAA@?ŀB |@;B@C£B@C7B@Cn@@CEz?raBtCAA@?d3B;3ACBOCeBOC'BOC7Y AOC`]V?8tB^C@A@?qM5Cm6l@:BoCbBHApCqCHApCUCHApC ;y?i B;pC@@A@?C^@tCrfCBBe*fCCe*fCDAe*fCy?CRKfC@A@NFC@;CC4CCSCCfsACu!}?;;CC@A@?HBy"@rBҒC#{BђCpBђCC-@tGBέj?ԁB?C@A@?K C5@B㜟CBۜCF3CۜCI'BۜCOy?fyBLC@A@?c5B~@vB9n@@sBn@QAn@K>B7CO?$yBj@AA@?C'@eBͱC!BձCU,CձCIDBձC"x?ͼB`ϲCAA@?vBTU@BCBCP CLB>C'B>CAjCZt?B7CAA@?:FB%7ATB>zCB>BBzC`ABzC}JAB_?SBCzC@@A@*C@5CtB2CBJCBšA⬋C|?G6CB@A@?, >A@ $BA}C9$B}CpBCTBC"j>N#B?C@A@?B(L@*B{CKB{CKC{CLB{C%t?BC@A@?jB-@b2BKʼnAfBpƉABpƉA,dApƉAIo?BEAAA@?  B@G3BCi4B(CN?(CM.BB-?j3BCAA@BGX@`C!C}CoCtflBoCBB0x?C8C AA@?MBkx@§ByCBC*AC-BACk?B#C0AA@?TB@BxBBxB4MOBxB[B^Cv? B#B@AA@?wB@OBQt@CBSt@CATt@CVۗB%EGAq?CB{@CPAA@mƋAA6AvC~A vCf@BGAB%>#AĻvC`AA@?عA/A BkUC{AkUC @BɆBB!? BbUCpAA@?GB@˿BkC@IB.C4xB,CB,CyLAW#C[w?BCAA@?BlP@yjB~ALCjBABAgcBAp?&iBAAA@?vBhSH@6CWMB CcMB BcMBlhxBZӓC6{?M*CB AA@?KEAQ@ BȰCBȰCVPx<~ȰC:B-Cz ?Q{ B ͰC0AA@?tB8A@wcBIBZBGB sfBGBO:@EBj??cBB@AA@?CD|@hKC?6 B?C?`@ݝ?}?BCľ?PAA@?ՆBf@PB>Bu+B:B)=rB9B gAZuC}2u?ܻBWB@A@?8B5_@ӜB*C4 B*CePB*CtIBU,Cu?IB FC@A@?z C@* C\r/C C]r/CC]r/C@.C{?5 Cv/C@A@?+z=BƁ@33BA1BA&BA7A4SCX?]3B A@A@?jBrJ@vBFCxoBFC0BFCzAŗAyc?*wB2GCAA@?vB!\@B-CUB-C@>B-C*ZAܖCg?,BGCAA@-B#A@B8CVB8CZC8CZTB8Cy?xB@C AA@?A@AC NA|CuA|CA&2C3?0AC0AA@㛢BO~@BpBoB8dBJBoB?4BHBoBFY&BGBoBt?BnB@AA@?wlBmy@BRطAbBqطA~CA>CJ%@4 A:A5 An">A(e>CAA@?3Ch#8@eCC6CCICCAC}?hCC AA@?]B.t@B*C`B*C#VB*CQ>@*Cx?`{Bo$C@A@?!B`@BxCfBsCT:eAB*BB.g?AB%BBBCuICCs>sBB@@@?CJ@iYCB_CBCBtCB?CBA@@?#CX@3FCBBCBPnCBhBC?]ڳCBA@@?ܶC~@CBCBrCB BC?CB A@@C@cCBĉCBCBXBC?tCB0A@@?8'Cn.@`@ CC%CC*CC@@C?WCC@A@@DYRAyDBDB&DBCB?DBPA@@?GB@scBC8)BCRCCBC8 9?=BC`A@@?CR@J_4CCWK5CCtRCCY9CC?7CCpA@@?2B@BBcBBBB3@B?_BBA@@?;CB9ABC`aBC@CCBBLm?GBCA@@?pC@@OCBAnCBFNCBx&BC?CBA@@?CbB7A,=@Cn9@Co@C@C=?@CA@@ AiC;AqBCRyBC8BBWBB+>BCA@@IBwR@JBCBChCC0hjBC3?BCA@@?}Cɵ@.ECBnFCB|CBBB?tECBA@@?QAnfmA,}ABWAB<@C$ACm^>X ABA@@?A)AGBBBB@C*BC?BBA@@?lBA.BCBCSBCAAB?eiBCA@@? AB5AVBCWoBC:oACJ3BB~{?BC@?@@?bB5T@5חB|),CCC@A?@@?)бCv^@N΁CRZCZpC7]C)C7]CY^C7]C%f}?HsC \CPA?@@6eC&@'CmBaC:BA!C:BBC~z?C.wB`A?@@?9C|=@dBGABxB@?B(yNC??BB@?Bdp?o BB?BpA?@@?Cy@ӱB#UHC_B8GC C8GCB8GCk?QBFCA?@@? Bd@"9HCΘC&DC ИCR@ИC=C4@Bߒx?U(MCCA?@@?A՛AâAtCAAC(BAdBBdBr>2AGCA?@@?ٽAA颩A%>B Aa>B5BA0vC-A1vC>A$BA?@@?C,b@uC mC!;ClC1BlCAiDcBux?ClCA?@@?^B@0BC/BчCσLBчCr)BC;q?eB3 CA?@@?4C?u@CCCWM CCCCC BC{?zC֗CA?@@?BH@ͱBĔC BɔCZ CɔCAɔCaNx?B˔CA?@@?B@tBCҋBCWBC`^AChy?BCA?@@?[0BZ1B%C0A@@@?!B@B8CABoCy,AoCңBBT.?EBlݐC@A@@@?@C/+(@oEC=C3CBcDCB‡AB1y?6C'lCPA@@@?Cº@8ÇFCCDCiDDC BDC*1~?ڣCjEC`A@@@?nB6@p\BuCfCYC'@XCcZBF#CGi?Y CҫCpA@@@nCa@tCBliC߯B~kC߯B?߯B{?lCBA@@@?CD`@jICC2CECW2CJCW2CQBW2C,}?3FC2CA@@@?Bt@OB3ťBBĥB!qBĥB] )B2qCbIt?B&3BA@@@?r0B@%B C҈B CJB C@B Cn?PBrCA@@@?ǁ8C 5w@_C:CC |CCgUC |C͂B|Cz?җCmCA@@@?" Bu@vBeՃCBZՃCBZՃCZj@ZՃC x?:B=CA@@@?pCj@CzCCzCCzC1AMBkz?\C\zCA@@@?jB2@/BC$!B?C]B?CABx?rB CA@@@?%cB^+A BC BCNBClACA?g BICA@@@?ֿB@ BPːCЮBPːCoBPːCJAPːC!z? BɐCA@@@?PSB0ARBֲCwBֲC݁BֲCB61Cq?jBղC@@@@@?ďaC@(&Cz|Cp݀CC 8CCZBBz?%zCC@@@@@?֤BC9D@>"CC0CC,GCCiAC`w?D=C'C@@@@@?x;B̖BuC?㋮BB0A@@@@?JB=8@kJC4-C CCOACCB$l?CBC;C@A@@@@?HC5@KC\^C@kCwaC,CwaC#CwaC|?qz]C`CPA@@@@?jBH@,B`jCHMBA C@ CֽB!Cu3?B C`A@@@@?CAy@wGC4CXCu5C!Cu5CAu5C7\~?$C6CpA@@@@?E_CkE@+CL[CC[CC[C1QC[CMx?=C$[CA@@@@?,B6@SַBCBC9BCc^A C#k?>BCA@@@@?;C/rX@EpBBQBC䒫CΝC^xM@C[xM@B57C|?MCF@@@@@"Cl2@HeCD4C*Cc?Cr Cc?CA8Au?{0C֮@C@@@@?TC)@馝CDCEC73CQ C73C9CٳCJ{?xݏCPU3CA@@@?_C @]CCIECCpBC8DCB |?'C HCA@@@Cn@{/C?]CеC#ZCv C#ZC^B!ZC&}?CF[C A@@@?C HH@MC,HVCWnC[5^CC[5^CC[5^Cz?hTCZC0A@@@?wCJ$@n>KC_A1'JCACCAZBA {?>GC eA@A@@@?^lC¾5@]vCXoCqCwoCp6BCwoCYB\mBK{?.dCloCPA@@@?9 C35@C_eACJAFCJA7AJA|?nCOLA`A@@@?wCJx@]^CwќCYCɶC孇CɶCh?WBʶCW|?1_CcCpA@@@?PC{J@WTC(YBLC5sB9KC6sB(?ZClpz?WCDBA@@@ORSCZ@KC1`CgwFCQ`CYCP`CAN`CE|? xNCP;aCA@@@?e Cg@(Bq#CEBq#CCq#C2Bq#CFy?۽BT"CA@@@?Bc@`BCYC'YBYC:UBYCBYCLb?GaBt[CA@@@?B-K|@+;BosCBsCiCsCfLBsCu?5BڳsCA@@@?1Cۊ^@/6CjC3CjC*CjC4AbB^|?!7C{CA@@@?16C~@pBxCVBCW&CCJBCNz?&BCA@@@?B֍@8ϜBBWBBCB2ΎBBxgv?]BBA@@@?,CmA@> CC C CkC C!FA CBz? C=CA@@@?BABG@Q:BtF@8BvF@;LB4:Caw?B@@@@@@?Cw(AcC~grCc6CɾNCCɾNCiBIA3}?#CXKC@@@@?8C{1@.B CByBpC yBVbC yBi p?;vB B@@@@? cCV @dC2iBA4C CgTC CB Cx?/FCC@@@@?` 8CL@V?CwCEjCJ}CmBJ}CBBxy?dsC}C@@@@?Cg@XC7CrCCiCC*BCR}?CCåCA@@@?HB3$e@wC6CB"C BgCkh CgC7? B~ )CA@@@?zKC:@|8BRCzHCh'C iCh'C+Bh'C"m? C'C A@@@? MrC>"@CIBC>BC?Bͩ"C%Cp{?[CHVB0A@@@?C" Q@c C)CYC3CMC3C!Ab^C{*~?{C֛C@A@@@?nܼCOR@$CACACAPBAk}?^CYvAPA@@@?zBk@.BIB$ BEBBEB+(ZBEB+?BB`A@@@?ːgB@V(BhC9B{C@6C#B6CxY?B?CpA@@@?\CI@0HC/CuBC-CnC-C0B-C4q{?RHCk#CA@@@?Bf@ BCB4C'aB4C&BЬBRi?0BSzCA@@@?#VB d@SCu$B0CE$B@vBE$BCAəCu@y?+CkBA@@@?C@C*Bv,CBպCB A~C~?_CBA@@@?,By͎@+jB%B aBXBBWBwq`BUB- l?&hBAA@@@? BUd@ ƴBx{C墳Bo{CEAn{C'IqBܴB(i?TB({CA@@@?܇B@1BDCBe4C@YBe4CcBBTo?z2B:CA@@@?JtOBAyTBcCTBnCBnCAC3\?aTB+CA@@@? AQ-A7 AvsB'AsBuA眇Cq B眇Cx>aABA@@@? B=A,UIBpB35BgB^ԑBgBoAfB;l?"HBB?@@@?=CnJ@jWCRQBni\C27BC27BBMCx?xLwCѣB@@@@?CC@R CmoCߎC|CP^C|C{)B;Bu|?pC4}C@@@@@?BQ?Bc$Cd' BBFABOAFrwC)>b7BBWR[B@@@@?-2C/@FCKB@XnC>BdB>B%COC-y?xCB@@@@?ToB-T@CCqoBe@"|Ae@80BP7CV!? kBN@@@@@C2CU6@CtB:C2pB>LC2pBEsB2pBRt? CIB@@@@?4. DFB@#D~`CkkD/_CC/_C^TBg,B?blDW_CA@@@ˬC:N@o{CC*CCCCAC|?.C촣CA@@@?\jCI1@*CCħC7jCC7jCt6@TZB.l?8C2vC A@@@?JwD!@bCBFCM8B)DM8BjCK8B~?BCB0A@@@?_C&-@yCd_C"CCD#CCJB֨C |?JCCC@A@@@?PưCe@@|CiCC$CaBC$C C$C|?\C CPA@@@?tBB@ATڊAA3׿A[ A2׿AD,AKCޯ>=A B`A@@@?VBa@ BhaAJBK_AjAQ_AfBeAC`?YBD[ApA@@@?x?CB@z{cCVA¾_CUACUAKBHC؝|?aCJAA@@@?+B1 AAlxCNAxC}AxC!A#C>ֆA CA@@@?{aCY@NrC(CD&mC(C6qQC(CoAmC ~?rC(CA@@@?BZ@kLB3C^BB[ 4CK"B[ 4C8x B[ 4CEX?7LB)5CA@@@?)!CR@0fCCCCF-CCB"AC.|?CcCA@@@?ۚ9B%ABݞBuBٞB@nuCgBmuCV?BŽBA@@@?+*CG|i@.'Cf@Cc'C@C(C@C.?@CT|??'C,@CA@@@?dBi~@B\AGB\AM$C\ASB\A)x?XBUAA@@@?MBIA@B C.B CVyA C0B꿞Cfu?1B CA@@@lB>lAhB›C MBÛC( gBÛC@Ck?hBC@@@?C)AiCBFCBpCB@AC?`\CB?@@@?mC]AM DrYC C*VC C*VCEJABp}?㣼CUC@@@@?B8?C>vC6BZBf|AYBBW{C{_?CqB@@@@@?cBu?BBAC!+AC;1AC˛>;Ae}C@@@@?B+?VXBCv`sBpCbBpC,ApCE?B#~C@@@@?LCP@XCCCBgCBJBqCUz?ޅCMB@@@@S*Ch? CCè)C٤CUFC٤C&6A CJ&v?P$C'[C@@@@?%C=n@%Dڠ?& D}e@nmCe@zB;7C݁~??jD_;@A@@@?>CC@x CŗC CCވ_CCI`BC~bm??wCCA@@@CE@ލBHC)ύBCj0CCBC\]?.BўC A@@@?$Bd*@ؚBY C6 BCBCڋBC42?RABѝC0A@@@?CL@(C-RCCv@3sC0o?"uBNvCA@@@?t/=Bl8A(A$C/A$COEB$Co$A$CaH?4A[($CA@@?PAʏ@G-B?6*BC B3CC3C~>`ǧBC?A@@?vB?z6B低BB4sB B4sB/@pCd?_BQqB@A@@?C9@&C̏BhCFBVCFB-pBRlC~?CB@@A@@?0hBV?YPkBfrC0ApBApB@2\Cc>RAB@A@@?8Cw@DrC5CbuCCbuCbAbuC~?sC)MuC@A@@?aC @興CC~CD#CN",CD#C[IBCM{?L/C"C@A@@iC!ߔ@CB1CwBnCwBkWA wBφ}?C5}B@A@@? D@a DDBDsBlDsBgBsBrU~?\ DBAA@@?Y%B%(@9kBiBWB9BZB:BcACUCU?JZBd0BAA@@?ZClO<@[^C3AW8CdrA8ChrAhB}rANp}?BC ZA AA@@?]N C @DBCAzCmMSCCBC BECYw?JC.C0AA@@?nC@C3GC`CGC8mICGC BAR3{?ՄCGC@AA@@?}7C>@VMC(fUC :NCd+UCCd+UCYUBB8z?%WC?TCPAA@@?*SB½@dBEӂC \BJCxE(AJCN1Ba+B|?B9dBIC`AA@@?Cc@p1CZCCCYC BYC TACuv?a CHCpAA@@?e7Cj@KC+LC*C9LC# C9LCB9LCtC~?*՗C CAA@@?|Bc@8 B=BBe=BCe=Bv$ Be=Bbv?B-@BAA@@? CXd@B:CGEBCų#CCDpBCv?BE CAA@@?CB @N:BeCĎB[CܫB[CcBoB4x?yC92CAA@@?B`@UB)BWB)BQB)B|jA)Bh?LJBq)BAA@@?ŊB@6IBC@;B C` hB C~X1A 3Bj?F!BؖCAA@@?BW@ADP#BņC#BņC}LAņC2A:B-b1?C$BCAA@@B @tB@0CA BA0CGBA0C{MBA0CGKxAm~CAA@@?ΪBdKA+B{C3B{CB{C/@{Cx?BxC?A@@?CU@`K%C6 CC C C CqAsCt?>CC@A@@?CCs@srCFCݸCZCÌCZC&BZC22~?jC׊C@@A@@?־-B @ODBlfCTX_Br[C^AȝBBƝB> Bb_C@A@@?21Cv@3C5BجCQW%BdCQW%B BU]CO|?tĆ"B@A@@?B@D@EDCM0DC5ODCBC!?7DܞC@A@@ tCQ@CPBZC9B7B*C`AA@@?)CX?@QCBuChB3ChBAgBry?!CBpAA@@?}B7@/B~/BB:~/B0B8~/BA_Cqa?_B,BAA@@?B @BTWABLWA2BLWAmf;BLWAQ?1Bn;AAA@@?[CJO@zO C&GCCHCDžBHCcnB1@][B`CZBSvC ȖAGB? A@@?uC&@CCxC&CsfC&CcABwy?ԃCtC@ A@@?C3@Cq!BXC#BřC#BNgAyC, z?孊COB@@ A@@?OCA@+C$h,CyC&CC&C CbC<}?ljC@C@ B9o6C(;}?zCKk?@ A@@?Cܣ@C}CCyCR3DyC pBByC1~?C*){C@ A@@?!UC5@ꢂCTC3PqC cCL/C cCϟB'Bz?xC+юC@ A@@?ݰC@kC(C/CF&ChCF&C9bB C)9~?PC'CA A@@?lC@CCGCeCZCeCϥB鲥Cdx~?MCCA A@@?#C@NCK3CUSCy7CTlBy7CTpB]d@2u?OC|6C A A@@?SC X@CCCwCBwC/CC,d|?\CxC0A A@@?CO2@ΛB"ABыB BB$CBBeBBBzo?"BLRB@A A@@?]C)C@ޠCܓCCBC`CBCABTt?fCCPA A@@?Bvo@b-BLҢBĶBԢB* BԢB)JAԢBo?>BB`A A@@?cCC @V CBC B3C B*oAB~?#CBpA A@@?CJ@ CߋBHCߋBOCߋB3AyCAg{?pCWBA A@@?{B@KBo݊C-}yBCBCJ_@@C=\a?㪁B>CA A@@?֝Bf@ϰBƤCrBӤCKQ6BӤCiBCr?BCA A@@?;IC!]@Sz C!LCA A@@?o PBA[B&U3CA0B,U3C@,U3C%֬BC@s?Bl3CA A@@?C@JC[C B[CvC[CA[Ci}?C_C0A@@?v\MD|A_DBQDB]HDB BC?9WDB?0A@@?kC?-@`C2BsJCB OBBBƊ~CyAq?ŭRCuB@0A@@?qCw0@Ca.-@ C+iBQ CjBCjBv@\aC\w?^ICxBPA0A@@?PC \@5?C 'C=9C'Cݛ`C'C~B'Cv{?ACLk'C`A0A@@?%ZBK@S6BҺC7BC47BCkHBCp?f B[CpA0A@@?B@ BpC2NBnpCXA5sBmB5sB*BU?AB޿oCA0A@@?aCc@WCuC;DLCNC`KqCNCBNCN|?YXC=CA0A@@?ACA@jCݤBXCwݤB)BwݤBp@\7C'z?C BA0A@@?B@B8BB8BLPB8B8~B,NCs?aBcBA0A@@?.B6@omBQ}BoBBgBB"aABf?nB!CA0A@@?w*BI@C^RB3CHRBLBIRBD BhCSy?UCYRBA0A@@?Al.A!-7A<Cs 0A<Cg><C4*AZCJ>2A9CA0A@@?9_AAf=AuC;AuC8c @B%B8AD%BT>SA:uC?@A@@?[ C)^@eiBChAp33CZ$AUBU$ALBdICMt?7CA@@A@@?EPC E@vlCzNCdC%RC 3C%RC޶GB/Avz?eC"PC@@@A@@ beCN@iC~C23iC[C YC[C%azA C{?UfC@hC@@A@@BBCЫ@אC+LBCMB2CMBR?BMB}?}CMB@@A@@?Cд@CCaKCCVCBeDVC˝BVCS~?-C$֔C@@A@@?BC.-@CyC)CCʦCCAoBp?Cn}C@@A@@?B'@8B&C~B/"CB/"C@/"Cfi?fB"CA@A@@?sCT@O@C&EeC|hACfC~CfCݷBfCj{?DCgCA@A@@?n Cj7@'rCX=2C}kC*B2Cx!B*B2CCC!C]4z?srCB2C A@A@@?9Cs,@.>BL]BG.BJXBCKXBANXBam?B [PB0A@A@@?AC-L@C–@0 Cϖ@ToCϖ@jGBϖ@y?Ee Cc@@A@A@@?XtCH@g|C/C9uCHCmCHC[A@)Ct}? {CcCPA@A@@?YC"7B)>C8SBBnap?DBN2CA@A@@?BjAIBh8C*B8C٫OA8CMA~@?B9CA@A@@? CyJ@#OBӰC|tBӰCԚCӰC[BӰCx?BoCA@A@@:Be}@.BBBB"BBq{iAFąC_wv?2B5ۮBA@A@@?"Bw@/BYBͅBBBB\Ay?C`v?BWBA@A@@?[Ba;@uBB~oBBK4BBjAC)`?vB:BA@A@@?sBW6ArBSC;AVCTAVCAfC5?uKBCA@A@@?qBAHB^RBcI2B^RB*B^RBA^RB:Rl?7=HBo&RBPA@@?0C2@H՞CC:CCL4`CCPBB?5CC?PA@@%ZC8V!AisC_B2CYCOB)QCOBآAԧuC5z? _CB@PA@@?akB@; C C^C˅C"B˅CB\,Bbp?hCN|C@@PA@@?˪C @rC C;C)-#CC)-#CACK}?Cc@"C@PA@@?7D]@/hDjCqDkC:CkC@_Bp~?CkC@PA@@?HC @@C8C0ChDCpChDC0AΈ2Ch~?CcBC@PA@@?},C($@ͶSCB7UCBBBRjB>Cty?TVCB@PA@@?CA@wC46B.CY5BCX5B>CY5Bz?bC53BAPA@@?>MGCBD@$8C Cv2CC@RCC'BC%.z?|:CCAPA@@? $CH@@B#BCHBNECDNCNECBNECp?#B0JC APA@@?yLBC-9B@?C[C r;CZCBCZCc~@ZC¬{?ACfJC0APA@@?VC=@3'CsBE\"CLBBKB3BXCx?#C*B@APA@@?#qBa@BgC`BlC[BlCP 4BBu?BCPAPA@@?NgBF)@(\B4C{B4CS@4CA^aCA`A@@?BK@B=B~BBBB:(ABM u?BUB A`A@@?(= C<@ #C*BC?*B!B?*B.BʌCkx?Y!C-B0A`A@@ɔBq@|BXCBcXC?BYBcXC-Aİ&Cl?BC@A`A@@?CU?I@C BUC BT*C B\-B Bz?\CZBPA`A@@?C\@BnC0BsCO]JCsCBsC0x?1B|C`A`A@@?Cӝ6@CNCaSBWOC5CWOCDYBWOCz?C&OCpA`A@@39Bzr@/֮B:/CªB:/CB:/C8A CMp?B/CA`A@@?Av)A[!BE_BY"B˿_BC,AkCMBkC>#B]BA`A@@?B@̀@rBw CBUl CBTl CI]@Dl CO^w?+B2g CA`A@@? Ad\A&=ACCK=A%CR@J)CrAJ)C<>QAAxCA`A@@?UrBiD@BPiC ەBPiCoBPiCQAPiCp?WFBKiCA`A@@?fsBPA8B pCkn@0RCpA@@?}MBE@IBB$BB[9BBYAC:{?[BB?pA@@?CAEiCTB/CJBեCJB_mAJBA~?'C喲B@pA@@?tCGlA็CdBC葖BC鑖BeTBꑖB'}?WCB@@pA@@?s3B@A^CAXCڛ@bBRQ BbB>AsC@pA@@?]9hCڰ@5JcCB[CgBmCgBvAgBO{?M"`C(B@pA@@? C@ZCACÐCBCCBCn ABC }?zCBC@pA@@?B5@@4BCiB#CAC@@A@@?"FCҩ@K<'Ct#C{"C.$Cr_C.$CsB.$C_Ry?[*C%C@A@@? C=t@s:BWCvBSoCy0*CSoC.BSoCr?/BC@A@@?~Cx@CꧺBWHCBPECBnB"C~?CB@A@@?jZC@CE!BC2CrE!BS;CsE!B9 =U!B}?9CzK B@A@@?s HCHT@CC IC=CICeKCICVAIC{?%ICN_CAA@@? >Bb/@PNCBICA CBICzBBICB5Ax?GC#HCAA@@?}C@@aBCBC)kCCC["BCx?BC AA@@?B69@oB'NCB|'NCB|'NC@@'NCOu?i[BMC0AA@@?@B@.|BBǡoB BuA Be[2ByCH?2zBB@AA@@?C:@R3B-yCUBj;yCTCj;yC NAj;yCx?B\yCPAA@@?B@ztB'KWCgnBVKWCVBVKWC @F- Bib?;rB4WC`AA@@NB+@ IBNoAlmJBoAۿBoAJ5BoA^?EBLrApAA@@[B%_@BROCoBKOCl|AKOCB^Ar?B/:OCAA@@?xd/BjAA.nB!AnB)AnB߷@oC*&?A oBAA@@?8ΗB!@oIBGCtIBGC BGC?Ap?bBGCAA@@?^B{@j{HBQC@BQCDBQC͂?QC_?HB'CAA@@cAX:AipqBC[BCxhAOBBPBvN?qBCA@@?hC*A{ZCC_CCCC>CC?ӇCC?A@@?BNAN@B C CC CG|A Cw?( C C@@A@@? CbNk@=B}1Cp?B|1CHC|1CIA|1C!u?DB0C@A@@?9OB2@z C914CXC414CDB414CהBD> w?C4C@A@@?r]Ar@M\Bk=CsWBk=C4BABA>UB >C@A@@?oxzCt@aCCYhCG?CXhCCXhCsxBXhCu}?ϡDCdC@A@@?J6C.d@ICC҆CC%|CCNAB;|~?CƙCAA@@? 7B0@#BwB?yBABBAB&CPBl?&Cj>Bl?&CBC%v?JRB@&CpAA@@ AmA* BC BCs)BCZBCW/?|ϏBbCAA@@?BB@ BLcC@QBLcC{BLcCvBLcC.rs?BA;cCAA@@?5AVAlB(BcCbcBBcCMA|=BīB{=B$?rlB!cCAA@@?A9'A'BC|BCN@Cre(BC8=?g&BݙCAA@@?;IAB/A8BI!CEBJ!CAJ!CK$BCɺo?l'B!CA@@?Cxf@?B3CB3CF2C3CLB3C? B3C?A@@?VCٷ@0qCBژkCBɌCB7B B}?rCHB@A@@?gɉBq@RֵBhBϱBB-BB5rIB'Cl?BخB@@A@@?CUA7=Cf@Bn9C?BݢC?B˚ C?B;}?#==CIB@A@@? Bܙ@GB1SCȭB2SC 9B2SCBאAdm?BSC@A@@?6CT,@(Ca(AC{%Ca(ACQCCa(ACɡAa(AC-|?s-)C$(AC@A@@?_LBW;@^/sBϮCkBϮCAϮCUB)C%U? wBleC@A@@?&BF.@qBgTCBTC`fCTCF}BTCFs?UBb'TCAA@@?6B2@B`8C@BC{CCm_ BC(s?B}؏CAA@@?$B,5@:B䛨C̮BCBCRAx3C# u?BÔC AA@@?BF@:BSC֓BSC?!BSC/OAHBpAA@@?_Bƚ@B5,CB6,CB6,CE 8BmX&CFSy?PB2CAA@@?NJB@nBvCqeBC)BCHf:AC_i?[oBتCAA@@?zC'*@fC6B}o C6BOC6BfÁCI}?NC9FBAA@@?OBA?qBeCXB}eCGB}eC9A}eCs?$^qBH[CA@@B @ĄBBBBj/CBBB?FɁBB?A@@?UBX@̍wB BKpBU B iBU BdlBU Bk?/<|BB@A@@?Ao@TBOߠCMB9ߠCjAq C=Bq CΪ?HSBC@A@@?BY@#BCB*C}B+C6JA+Ci?I8BCC@A@@?C7@JBgB:nBD2Bbn9CD2BnBD2B3x?MRBB@A@@?IgSB<3@rB} BeBBABA~[C J?5yrBIeB@A@@?BI<@MBZpC!ݴBpC%BpCYf?pCHs??BNpCAA@@?_B@LBR(CBe(C @e(CBP"C*?tBVpCAA@@?2)CI@#C,CkC,C"3C,CA,C1{?ܳCNC AA@@?rCb@/ CAC C>CnC>C AlBwz?v CC0AA@@?gBb@DALKC榟AKKCHBKKCZAKKCx?3A)JC@AA@@?B9@2B珞CeNBCeBCusA3 CGj?/MBCPAA@@?Y;CRg@)FCCFCCBy-CCArܪB}?FCC`AA@@?xl CJ|@B7C]A:4C]Aw>B]AϥBHCB|?7CjApAA@@[Cq@BTCBTC^7CTCp%BTCJ{?B6TCAA@@?̊BA@BђCDBђC6&rBђCF)OADB"0w?.Bm’CAA@@?ڠB@BA9BAݵBArAA_Vw? BeGAA@@?v&Br@h)B4C!B4CDA@+7T-B+7a ?*B4C?A@@?Bw@B!qCxBrqCLjCrqC?'BrqC q?0B(qC@A@@?F&Cc*A)C0BYC9B C9B[lB9B;~?nACB@@A@@n^C A /CUC'C&ĊC&C?wB&Ct|?/C!C@A@@?XC5ٔ@oIC LBC1Bl%C1BA1BY{?CB@A@@?KCU?q@l{BioCBoC3CoCBoC1Nz?BC@A@@?YOgB}*X@ZBiJAw^BiKA3GAjKAUdBnIGCh?FB#A@A@@?rB'ª@B/BIBw/BV?b_CB__C| ?|B=s5BAA@@ICHA@ Bx+CwܶBx+C; Cx+CښBx+Ct?.B+CAA@@?B\{B@{gB3QC2UiB?QCOB?QCk#B?QCj?"gB,~C AA@@?wLB{I@BIkCtBhCNBhCY@hCw?B0gC0AA@@UBa@.^|B0ClT}B{CvA{CBBa?c}BpC@AA@@?VYB@SBBiRBB-BBABĻj?SSB2ZBPAA@@?-Bi@{.BT"CJBT"CqjCT"CV3BT"Cu?B;N"C`AA@@?`Be?&AfB)9CeB'9CEYAd@Bd@`?RB9CpAA@@?jB@ BCBC@#vBC4A{BZy?BCAA@@?QZC@g_C/BQC/B C/B @/BI}?9OC3B?A@@?Bg@$B^@BB?@BiB?@BTWAЕC|w?B4B@@A@@?lBN@+uBBsqBB'BBA ~C\?JwBƓB@A@@?ަB]0@ BB֨BBreBBACdPl?BtB@A@@E>B.@-uB+τ@QBn̄@3@d&8CBBd&8C?]?ŮB0t@@A@@?B}@[B4KC"]BKC/@KC$RBC׼??ىYBgC@A@@?NCLG@uBFCC7BiDCCiDCN@iDCz?#BucCAA@@?݁BZ]@fBCdBvC3@vC)BhعBr?B,qCAA@@? &B,C@B8CBCbPBC{&BCRr?KB{C AA@@Bj@BBBBi7AB.ACq7?0 BJ(B0AA@@r+B@WBoLC SBtLC8AtLC\%B;CDP?WBaC@AA@@?5YBv@RBܤ+ChBͤ+C] Bͤ+CAgүCl\c?6Bk+CPAA@@?]@Bz{@BxCB~C_B~CzAC{? BC`AA@@?TBi@CVBsCsBsC\8BsCXcBsC|w?ćBxCpAA@@?9BV@0B)7CnB+7C@lB+7CꛭA` d@ y?B>7C@A@@?BuE@B5ZARBA6OBAqB1ZBAA@@yx1B.ʃ@D.+BOyC*BFyCwAFyC_RABYP?+BUCAA@@?mfAF@!A8WAfAVAp%AۊMCAۊMCq>AA AA@@?95Co@CABA2CA +AA z?CA0AA@@OAB:@)zB;łCıpB6łCA6łC&BB Uh?zB6C@AA@@?BՋ@.B߃C:B߃CB߃C¨+B߃Cz? BTCPAA@@?OBN@mBAQBBDQBPBDQB#FARTC2w?9xBcB@@A@@?B#@G\B,<C_B:C^B:C+|-AUC#w?PB)C@A@@?eB{@B3*CD/B/*CmB/*Cm@pCNw?"B*C@A@@?V: Cg-@CRʸBsBbʸBECbʸB݇AbʸB.x{?C" B@A@@?KB#@B4dlC<BVdlCu&@VdlCtAXaBA?0kBlCAA@@?͙dB@y<~BqCzQtBqC$BqCgAƩBBU#C iBZ#CBZ#C@X#C>(z?*DB#C@A@@?HB@BCCBCCBCC|@XBUz{?BlDC@A@@?g1BAiAiBشABlABBABRL?Av BAA@@? 5B(ͳ@B$CۯB$C(B$ChA$CT|?qҾB $C@@?pC@(C4CBC4CIC4CC4C?\BC4C@@?[DG"A";ED!6MDCiDCxA3C? DCA@?lD0C<9@gC4CiCC4CC4C$By6!7?qKC4CA@?.AjLA;@BBvB4C2C4C_ ?hB A@??:.CR+@,C3C`C3CPAC3CB3C~? C3C0A@?C@6DDCC9CC6A3C?CC@A@?{D9 A@,DC+DCDCP-B4C?k)DCPA@?C:@\! C3CsB3C2C3ChZA3CD>~?B3C`A@?<&BzmA`A4CxfA4C?-T 7_B$T 73> B4CpA@?e7Cr?@%C4C|yC4C C4CA4C?CC4CA@?B@hƯBeBC&CC~BC?~֮BCA@HAAHAvCA`W0@4C3hA4CC>\Af:5A@?BW@BKQK6BPK6z CPK6APK6?јBH6A@?zA_-A-AC }&ACtA3CA3C='1ACA@?X?B@ԿB 5BN 5|BM 5AG 5r?[B:5A@?B0AV;B6KBwA&BB>HB*'Aeq?'BA@?BEKAfgB3CrQB3CB3CTp,B3C?ShB3C@?@?A@BCT6fBbCO.B CBB C.>T%bBC@?@?gCp@VC[C"\CbCQ"iCbCIAbCdz?jC|CA?@?Cnm@wC0ӝCmC!ʚC-C!ʚC?nB!ʚC^}?WCCA?@?XJC@Cf,CgCE2C"CE2CE؉B"Cy?ɝrCƖ0C A?@?8ACE@ CwC]CxCCxCeBBAs?`oC C0A?@?.C1@rBՏCIB2rC(C2rC+B2rC+tn?BLkC@A?@?"_C!@gjCQ7CcC7CZ8SC7CFAk~F@{?bCF7CPA?@?(7DҶ@/D굆Ce0DkCAAAC3AC (AC A|VCUY.?AC@@@?ObC@|DVtCuC5XCw~C5XCAA5XC}?ҦCSTC@@@?Cby@xCU4BCTfBCTfBĺ0ATfB|?CCaB@@@?DC;@] CC7sC"CxgC"C@A B.r?|C4CA@@8C @D%CC݊CC݊CdA݊C~?B$CCA@@?CdIa@cCaB\C,B8C,BqӚB,B8A|?Cd߾B A@@?MACGFg@=CB趑CBCBBBz?ȎC B0A@@?U?C"@)CYC,CCCCCp8ACsov?k*CzqC@A@@C,U@DCBCMhBCKhBB>hBl~?KCpBPA@@?ߍBf@>BdC qBwC:AwCBtC\?<B~C`A@@?}3CC@{yCϏC9qCꉏClhBꉏC C'B.{?LmCCpA@@?2ZBv<@9/B Cg(&B C#8fA C4ANРCD<?c(BCA@@MC9W@OCϝCKCCN(JCCn?vBb|?2QCjCA@@?%ZBRAh@DBK-CJBK-C[OCK-CڧBK-Ct??*Bn,CA@@?Cv@-Ci5BZzC4BC4BA4BP~?-~CBA@@?UB @;BGCϸBFCKAFCK@ŖA"F ?YBrFCA@@?"C ^@q#C!ZC0C!ZCe C!ZC4Y?!ZC{?P*$CuYCA@@BEA ;BlBՈ^BRG*C@@@@?KD AD`C$BDDCmODDCJjBDC< ?CDBC@@@@?ǒCs@ϳC6C:CpCXCpC|\@oCLH|?|?C °CA@@@?bBMc@+BtAZBCG)@U.C=BU.C{;?fBN>A@@@\C@Ck1CC*C9C*CBM`C~?-C֌,C A@@@NB@C C53BɜC2BeNCXWCeNC]?@BC0A@@@?X{BB-B/A&HB.CGJB.C|A.C9& B~VCD?FB.CA@@@nC@a@+CcPC^C$PCFC$PCΗB)A*~?<CPCA@@@?Ba@C>nCB>nCDB>nC<~AjBy?lCnCA@@@g Af+AAC|BCAC|BC%@D|BC A/gAZ>A}BC@@@?CpK @5 C\B)͡BBCBBBya?BB@@@?VC G@{CGCՊKC5CWC5C^7A5C4y?,SC{C@@@?mvC 7@CFBG#CUB`CUB yCUBLx?&C)B@@@?:nC@ACtCECCKCC}}sBZC{?8C^CA@@?9oFC*-@C-C[C&CKTC&C &B\KCmz?ɂCp(CA@@?ȀCȏ@<C1CpCM/CWDM/C~ CM/C%}?VCN0C A@@?Cg@JUCkB7CzBՋCzB *AtBfW}?iYCB0A@@?Cf@eeCdBƲCurBCurB]yAfurB`A~?5C~7mB@A@@?C=@cCAC~CWDA*7CWDAuUBTDAk|?EqC APA@@?FpC@y{COrC2jCDClCDC@[CvL{?9NiCC`A@@?~ CJ@sBk`CBpCK[CpCCBpCr?KNBBCpA@@?QİB׍@-B5#BRB^"Bo݋B_"BeA\CV_?YӸBB4R8C[B4R8CߌAfF@csw?BQ8CA@@?YGC%ACG|?jFCCA@@?B`&BAޤ2BLBm+BvBZNAvB^AC+?14BðBA@@?FB/'ABVY?djB\?;A5CB5CGd?gBi4?A@@?, B}f9AȚCBxLBB{?BBA@@?BB'FAxAsCͷAsC @sCz7A9C>ACQCA@@?@B4h4AhPBB"@BBBiBBAD$C;f?OB[B@@@? C9@6zCwCC=CMC=C8ؐBCoAb}?JC?C@@@@?ǰC8@bC9qBմC6uBHhC6uBܬ@6uBe}?w)CuB@@@?>CV)@D`C&qBCBpBB}CC {?׫CCB@@@?~CSA@+2CXCC[QC>C\QCB*A0[|?CBQC@@@? D#a@9C&sCVC/wCD/wC?B/wC~? DeuwC@@@?;Cs@lCݧCȑCCCCAC%}?"MCCA@@?YMCp(@&!CTtC(B.oCHC.oC}C.oCp?>BqCA@@?Cd~@+CV BS/CZBSCZB-CiC}?^CB A@@?*D@C;C :CACWDACCACh~?YC?C0A@@?yC@0@CHCCC;fCC;fCv@m C=~?{#CC@A@@? C5Q@o/C&XCCWCCWCBbHB2o|?<7CWCPA@@?LSBlB@%oBC{BC/C CC⨚BC_?‚BKC`A@@AAٜlBCcB<CAAxBiBxB$a>9eB{CpA@@?jBO@.BݫRCSBSCSEBSCTQB)tA2Gc?ڧBUCA@@?uBFm@BgBjBhBBhBACq?>B2BA@@?B"A:6BBf2B@Bdo>@AB&BPC'?e$BBA@@?hBJf@0ݓBr)CͿBa)CCa)CBa)Co?dB(CA@@?.C.@wCE6A8\CUACUAsBUA1?z?BP+BA@@?iA/AY7zBCG>`BC?A#!C4B$!CM?=zBC?@@?ICAGAC6CCJVCCJVCBJVC?~?C|EXC@@@^Ct@CcBC%qB C%qBdACBnCBApC#p|?nCpBA@@?CG”@CBCB2CBSABZr}?C!B A@@9$(C&G@c2C?BCMA %CMAm)@MAu?!C)B0A@@? Dw@;CYZA-PCqAz,+DqApCqA ~?A$CA@A@@?C3u@KCiPCڵCCuCCdBC}?!CyCPA@@?{&CW>@EC0@FC%@,1C%@36B%@?iw?ѸC@`A@@?BFtR@BTA-BNhDAoBNhDA%AF@CŤm?B"ApA@@?M:C}Z@TCzCϹPCyzCMCyzCXEBB/|?VCևCA@@?qBc@B:LCB^LCFC^LCB^LC\n?FB"ޢCA@@?sB@CELCCQLCQBQLC:BCfw?0C_wCA@@?*B^@9BqݝBRB؄BB؄B0@6aCřu?_BBA@@?hB4{@nB͐0BNcB0B%B0BNqA&$`CSy?+FB/BA@@?jC_@fCx"C[1Cx"CHCx"C@x"CXz??C"CA@@?}LB}6#A|BC }C8H}Bx}C~Ax}CyK!B0BJX?gG}B}CA@@?TC\@Bg~CU#B_~C*C_~CcB^~C0N{?fB_CA@@?3՝B,@YoBTBfBUB߬BUBKBUBqo?oBĉBA@@?]B3>A!BCBC*BC_B#CNx?GzBC?@@? Cz\@Y^C!CWCr#CBr#C^BFCw?_CΙC@@@?zC@CdtDCCC2CpC2CWB2Cе}?yCm0C@@@@?4iB$?pB6C Bf*C{Bf*CAf*Ckf?BBϣ)C@@@?TC8@qCCגCQCJCMCJC*y@C=y?YCC@@@?YC3M@QC3[3CRCm;CECm;C4B@}??DC*9C@@@?C@6CaCOC)CnB)CbBB_2w?U=CnC@@@?-DWn@D&C CC'CDC'CDBC'CS~?C*'CA@@?cdC'@C\XC#)CTCKCTCBTC(s?Ġ%C_VCA@@?!C@ CClC~CC~C=@~C\?|?ېC˒C A@@hC_@]rC,AACBKCBPB>TCw|?wwCA0A@@?&1Du@.;DQA QD(FADD(FAG"C(FA4?Db_JA@A@@?sC@p=C[AY4C^dAC^dABYdA]z?:2ChAPA@@?BxZ@g>B}%B B@BkB@BAcCp?B8hB`A@@?,JB&@ B)'AB6A /9B6AAa?CG/T?BbYApA@@?ZBk@B bBzBbB@1xCmB1xC^_?UBBA@@?%Bm@<CKC>QCJCn>BJCkB|C w?CCA@@? CK@l$CŸB[LC+BEC+B@hCn{?#C-BA@@?awCiie@`CU1CCh1CJBh1C"9~A4C+sx?CF1CA@@?[B0@$^B0L`BBFM`B=BFM`B)AFM`B*r?B`wdBA@@?[B!A]DACEAHCdAHC?_XAHC>FGAKCA@@?շ}B@:AriCAߥC BߥCgAߥC1> Ad'CA@@? Bd4GArAZB_AZB@ZBAC>>eABA@@?XA@AnBSB|?KC'XC@A@?Ba?#/CBGBLBJBKBmwB>Cj?'+ C1B@A@C0@C;CWC>C D>CjC>Cv~?_Ca=C@A@?@߬C9R@šCAxCACACA ?{?L CLA@A@?LCTU@*CxCHo[CByCCByC.CByCx?CpC( yCAA@?5CP @6qC:uC3PEC|CLC|C 0B*MBv?OWCnYyCAA@?nC>@=C%A78"C;APC;AKi C;Ay?q)CxA AA@?MCu6@VC߸A9QCA?CAAvLCy?PCA0AA@?9Cݡ]@uCCBC̿C폸C̿C:A̿C}?C8ƲC@AA@?~2Br@B4pCB;pCaB;pCn@rB%\?iB)qCPAA@?JCؚ\@PSCJC(KCIC?|@CIC7A׮A=z?oVCtIC`AA@'B?^@DCTȓC: CɓCѝBɓCB&Bdv?CmCCpAA@?^C R@jIC˾MCCC̾MCB̾MCBWAyz?GCMCAA@BqB@B,CYBCۣAC>pBhBIi?;٬B+dCAA@?<CF@@xB؋CBiЋCփ&CiЋCp0BhЋCx?dCCAA@?FB@BC)CBDܮCIBDܮC<5>)C܁B?3BBCAA@??%Cj@ CHCCHC;CHCJBHCǂz?c CnICAA@?A2A-B]C9e-BCք@0-C >B0-C ?~)BlCAA@?JC@mPBCCBC4KCCMCBC z?TBCAA@?n>A_@AAkCAkCk?^BϱA^B6>! AjCAA@?-B%JAfABŪAB"ABC>rxCC?GA#BA@?-CA}CCOCCCC(BB?CC?A@?kCp @ObCxC-C*CaB*C~BjCxs?;C'C@A@?"C#@ːC`DCRC3{@>C3{@㰷B2{@ZK}?0CJ @@@A@?C @ TCeCYCǁC^RCǁCZ-A)B}?SCO2C@A@?CLm@95CiB?C.BC.B,CKC*;}?SsCXB@A@?C@hPCVCyMCICCICRnTCICix?1OC#MC@A@#Du@DTB,%DABBr?DBBB_CBBB~?DiB@A@?Cߗ@~CCI#CCCCX$A C~?CWCAA@?xqB+a@ MB=Cұ;BRC٨ARC˺AKB?o=BʐCAA@?B;7@BhCGsBBC^'BCw?BCa@gC ߊCˆCߊC <4CߊCWBߊCx?G*CCpAA@?9B`@VA~nC QAtnC"BtnC̲BtnC?qAnvpCAA@hB A[BCBC)?oBBoB>f B㢘CAA@?p A Ab ByBQB{CARC&[BRC>wCB@CAA@?/ BOx Ay!|BdC'uBdClANCBOCbB?hfzBTCAA@?>VB Lr@UYBoC%[BoC #(CoC߀B ?@߀B@otC0I!>K@|BAA@B@B(CB(CN{B(CABQCvx?7gBrCAA@?AH%AAG)CVAG)C@@ˣC_mAˣC~ ?A6P)C A@?~IDtARKD4C"@D4CQD4CB4C?rED4C? A@?kCWu@eCy-CWC5Cc#'C5CB1?qy?זCQq3C@ A@?'>Dɶ@oDB] DB{*DB8BB~?DB@@ A@"&C?xCcojCBsCDfCaBDfC*CIBO0s?u/xCf^gC@ A@?bbC@+CAMC0;@,C0;@B4;@l|? Cв@@ A@?֤CW@CjC1KCVCCVC_lBUqBO~?CnC@ A@?xB+@@ߵBzuC'BoCû>lBBlBaG?%BqC@ A@?{Ci@*iCC꟡C'QCC'QC!$BN&C}?mCCA A@?B:@BRdC:BduCE`7BFɂB. CFɂB#r!?uBoCA A@?hDTͩ@ D4TBE DaBRDaB zBFuC,?3DB A A@?J[B+N@ C"CTC@עCZBAעC)BCo?ڪC nC0A A@?zBо@c CCg CSC=nAzC[CzCi?VCOͩC@A A@?,C1@ACvB 19CB)CBk BpCXx?AC?BPA A@?]Ba@-BuCBuCÛBuCdA'Bn?HB sC`A A@?PCF_@BgCfBCUCCBCGu?rlBUCpA A@?U5B$s@35 CCcCCBCB!aCEw?OCCA A@?^_Cm@!,CFuAC`A1C`A%C`Ap{?CՇAA A@? B@Q#C00CC30C˷A30CHCC)y?O4#CA0CA A@?̢B@%BKBBKBH(BKB:ACTn?[BҶBA A@?sD4CΘJ@ VCIECKXCECn CECBA}?UVCFCA A@?~DCWJ@?:C$C:C$C;JC$C3w|A$C}?|r:C$CA A@?B;AAnBΝAnBÌO@nB6AC>YABA A@?}C@CzBPCuB2 CuB!S7AuBG}?xCBA A@?2[B@.B_tBcB_tBbȭB_tB|A_tB\zx?ȜBtB?0A@?U#C5L7@BdC'BoB4CpBBqBh?"BB@0A@?JCO@<DߍC=CC52DCACd[~?CqC@@0A@?ʑBm?BB&BA0BAuBYNC#d?)5BA@0A@??B?BB:٨CwB\CRkB\CB\C~dH?~[BlġC@0A@? p,C(@OB@CK/C|EHC<C|EHCxA+Aw?"C FC@0A@?4iA8C A0A@?zCX@rCwCCaxCGCaxC]*@bxCK~?C>C0A0A@}B{@^ B"nCʪBroCBroCNaAqlBl?BpC@A0A@?@BW@!‘BBTBB CBVaBBo]l?uדBBPA0A@?B^@H C=\ZC=HjB=PB4CFs?;C?`A0A@?A([Cm@dVCQ@QCA@k`CA@iAD@ }?SC9@pA0A@?Bߑz@B-WC^BEWC٘BDWC 'B Bu?BXCA0A@?}BS@CeCCeCn}BeC9&BkFB6u?CeCA0A@?,CNR@Bf;BBRf;BNiCQf;BCQf;BOZz?B~9BA0A@?GB@BчCrBчCCчCJAчCv?xBׇCA0A@?BCv]@? 0C䈓C/CCPCCBC|?/C⊓CA0A@?T Ct@ C\EA$3 CFEABFEA*7BHNC$|?- !CTAA0A@?A?=ABHrnCiMBQrnC?iBzH?C}BnCA0A@?A;A*A^BmgAGBCeAFBLAUC)?YAB@A@:B|@1AzXBX؄@4CkiB4C/T ?By$B?@A@?bOC >J@lnC"CCC5CC]By%Cv{?JxC<"C@@A@?:BCPA@A@?cB@s@6y#C3CC3C/A3CCgCw?A%CdC`A@A@?B@}B؄KC=BUKC.BUKCx@A*A-l?*B[MCpA@A@?{Bv:@HB԰B1BB BB[)rBz>Ch?}BD$BA@A@?0hCq\@~CMC`CMC7CMC>eA_A~?CEMCA@A@? kB@BB͢BϑB+AϑBjBtdC2c? B7BA@A@?.0CIE@9C C3;C㛢C"C㛢C]VA7C}?9CQCA@A@?QbmB Z@fBCBރBÞC;#BÞCA* Cf?B֞CA@A@?sB/z@/BCBCzAC}BCBq?"=B) CA@A@?BT^=A=BhC/4BoC$AoC:ABT?>BCA@A@?2B8@ƬBfaC쒚BfaCsBfaCbRAI5B>7w?*B4jaC?PA@?M D3A."D Cq_D C.D CnB C.? Dq C@PA@aC9@9C5C6CpC:CpCBpCx?=5CC@@PA@?]lCSk@cC6C;~CY5C:QCY5C4Bث?`Rz?_qC5C@PA@6[Cf/@AC9yCNC qxChZC qxCc\9A qxCWLx?AHCxC@PA@?~CH@k?CFCFCuJCCuJCBuJC|Zz?e2ECJC@PA@?-3C9@̖C@RxCPC2yC澺B2yC,&CbxB%L{?%CzC@PA@*7LCp@aCpC]]CcC04CcCؚ#B2CDŽ{?|_C9CAPA@?zC׌@iC0'Cd4aC0'CVC0'C-B0'C0|?:dCn'CAPA@?N.C?@CߊC5CCR>CCt4BCdv?;C"C APA@?'C@]C@N1 CSCC\SC +C\SCgXA[SC-{z? CTC0APA@?%C9=f@ CCѺC=CʺCCʺC^YB%BYz?aBCC@APA@?A1 A B ABB.ABAz@LC /BLC? BBPAPA@?#CK@RC)BC)Bj(C)BWA)B[{?|CB`APA@?%7CjW@y+C&BgXB&Bw?hUB%BAPA@?nXCGQ@@LSCnCOCnC]CnC[AnCt}?|2TCZ(nCAPA@?ƙBx@BBp2BBKnBBJFB蟐Cρt?TBNBAPA@?Dx~BWP@ VBL*PC,[BXPC8qBXPCETBAk?-#BiPCAPA@?ABA<\At=CAt=C&Bt=C:At=CB۾C'>BS΅A'>B }?@CB@`A@?4C@]yCOC{CCRBC C*BhDz?y{CC@@`A@?7D @;DBDBDBC6@B$+?DgB@`A@?U C*G@ˠB\+_CYB\Cnb.C\C kB\Ci{m?WBYC@`A@HܶC@ۥCT8{CPD`AׯC`A`A@? C\R[@EICI>CvAC?C.B?C5B01A{?^KCR?CpA`A@? B/@$BbAīAcAإBcA}BcAtM?jB}AA`A@?dB@ĘBg0$CBQ0$C%BQ0$C1}@T0$Cl?B #CA`A@?C,w@xCB]%CɛB zCɛB*@Cz?C~BA`A@?:Cf@6 B+BfB+B!C+B lB+B5z?B,BA`A@?!qBk@BCBCBC g@kC w?B,CA`A@Bx@ЁB/TCB/TC>B/TC?/TCqsz?+B?)TCA`A@?=BECAB@B@?LB鹗B@pA@?3BUY@ KBa^CvB]CnB]C1XB.Cq?6BECApA@+A+@.BECTBCA6B6dYB6B>ZBCApA@?<5CWNF@CCp[CCp[CHCp[CJ4B p[Cz?I#CZC ApA@?TbB=@+B"B<B7"B4CB7"B!A7"BRE?BB0ApA@?ݣC@{@C5"CєC("CC("CSSB("C<~?h+Cʗ"C@ApA@?C5@=kACh B19CFAB.BEABx4BSWC{:{? DCzcBPApA@? Cb3@C CJB CoC C&RA Cy?'C[ C`ApA@?B A{xB@rB@ǯ[Aw8CsДBw8C=:?XuBLE@pApA@?B͕@B@CB@Cô4B@Cu`B<Cn? BvCApA@?B,@ńBNCB{ CB{ C2A| C l?P}BCApA@?PA AOA:C%zALC@F/C=BF/C,>McACApA@?ɨB@BCsBC#BCc1AC&tp?PBO CApA@?PZBAi B@BB%BaB%BfA%B3z^?U!BKBApA@?G^BbA{B>aBrB>aBF-B>aBAOlC!o?*aB`BA@ fB^@BdA,4NKB,48ܨA,4d?FA5?A@?3naCQ@CbDCZC DCC DC-CDCx?"CPEC@@A@?'bCl@O=C [C?7C [CUC [CQ#B [CQ{?CاB?CLA?CXw?Y}B nC AA@?C)@/C(CmC(CC(C4ƶA SC2z?|;C))C0AA@?Bm@{B^CB^CjB^C^A+B]n?3BH-_C@AA@?BtH@IB7C&^B2GCz"C2GCB2GCt?B-CPAA@?B_V@B|!BB{!BB{!B?B^\Cu?BX B`AA@?nCNF@M4CQz;C=CTz;CCSz;CHQ?J@Vx?rC҆;CpAA@?$B!CE ?PBFZBAA@HWB@,B^B BڋB؅BڋBkhAۋBJm?ނBxBAA@;BiX1AԋB *YCaB*YCs9XAdBiBgB\P?IB#YCAA@?ºA&AA%ANAAa@rNCaArNC>AAAA@?TuB@B^CМB^CbC^CxB^Cz?B^CA@?abKB@BC6BC(ACt-qBBsi?sBC?A@?.CQ@1 C +NCwC*NCkYKC*NCÅB*NCy?'T CLC@A@?gB@,߀B_CzB_C_җB_CaRA_C[?PB4C@@A@?mBzE@HB֫C[ BBC~BCoACF?Y >B۪C@A@?#C/@D\C:B%VCBBBcB{~CQ{?\CB@A@?JcC@BMCBHCBt#yCBDBB|?MCgB@A@?CTr@C0?9CC ?9C/#C ?9C6A ?9C z?C9C@A@2tC$7@C-C2C-CJaC-C)8 BC%Q~?C-CAA@?ŰBB/@WBCVBCBCw^A.Cu?:BCAA@?]HChD@fRCrC$ICʥCe BCʥCط@(B|?SCC AA@?NB gD@ @ CMC)C,MC B,MCFBWAu?CMC0AA@?%[CC@tTMC2CΞFC2Cc_lC2CTB2C!~?[EMC6bC@AA@?YBM@CF-Cf]CA-CBA-C-nNBͰCdy?dC܇-CPAA@?*RB @SBCR'UBC1ACrAiCsK?VBC`AA@?aAAwB/AB'/AX A|>C-lB|>C[>tkB.ApAA@? CBg@BiBBiB CiBҺBiB6@z?'GBhBAA@?B@5BBhB.BWB.B#~B ZC]w?mBBAA@?ZGcB@MB͟BB͟BoB͟BLAoCg?B˟BAA@?FvAD*A˛:BqBR,BpBE@=C/6B?CiG?k:BCBAA@?B7Aj85BbAAA@?_WB0Hn@Bz*1ALBA5AK@]?C!B]?CFc?B8AAA@? CO4@l CCJ CCÖCCXACuz? CVC AA@?"wBA{@RuBbC6BPC5}APC[נBCm%o?BBC0AA@??Cc@vW9C:A~C7C:A~CsAC:A~C:A:A~C>}|?9CB~C@AA@?B__L@ CBCBKBB B6Cpz?yCkiBPAA@?ٞB3@BI,C*ИB,Cx@B,C"@Y Cn?`BF-C`AA@?JCzg@{GuAK%fBAA@?`Bz@B6BB6Bv8,B6B%ByaCq?ɯB7BAA@?QB>ABqYCÍBhYC,AgYC3(BBs?6vB8XCAA@?BG@C=ܰCBC>ܰCB>ܰC A|-C}?zCC?A@? C|@BTCBhCCgC3< BgCx?BC@A@?Cx@isC1FCkC1FCC1FCaB1FC~?MrC̛FC@@A@?U WCͩAWCCC>OCCCYCCC0)ACC|?m3XCCC@A@?Ccc@:C饌Cɤ1C5C1gB4C`BҰBz?ϛ8CɌC@A@?2C@$"CByCmBP(DCmB^[&BnBz?d#CB@A@?B&@G\B/!C)B!; CȡB"; C{2A"; CGRn?^BC@A@?7Bro@?A~AsAArAAs@A%?|AAAA@?Q/CW@T{BC$BCtCCqCC[z?fBˑCAA@?)B;a@bATCKA"TCfΌA#TCYAB?AaUC AA@?JCXMI@48CcCl(9CcCQZWCcC%AcCT|?y#8CyC0AA@?Bf@2B1CdB1CVB1CͻIBCt?)2B1C@AA@?'C+^@iGBC BB/CXC/CHAB/C\z?YBaCPAA@?Bj@B~C B~CB~CBBzBx?&BsC`AA@?Bm>@BBS0C^űBAS0C CAS0COBAS0Ctw?DB:P0CpAA@?[;B ABcbC!OBfbCPAfbCBB:B>1d?1ىBbCAA@SrAQACB"gC5B"gC@ LB}PB LBJ?(DB!gCAA@?*)Bz@]B;CGB;C&2B;CA;Cxq??]B!CA@?Bp@ZB4C`3B4CX C4C@dB4C?m@BC濟B"CB"Cۮ BBMi?dBC@A@?MBD<@LBDBMB^BuB_B2A_BSa?KBz BAA@?4jB (@vB@ CmBl C Cl C`Bl C x?pXB CAA@?aDBt@!-TB ȕBUB˕B,A˕Bf A~CW?u]UB0ҕB AA@؝AaA7A-AZA?.A8]A>C{,B>C>A0?A0AA@?:B6p@fyBKB[ΨBKB{~BKBAAXCr?B+B@AA@?w!Ck,]@lCKBCKB*CKB>AKBd|?C%&LBPAA@?EaB@,BCV$BC^~uBChOACh?,BC`AA@?IZB N@$oB)B7B)B$6A)B]'Be Cr?^BCBpAA@?B8AtBB'_BBABB"Cl?juBgBA@?B~q@ѻB4C'?B4CB4C0@g%7? B4C?A@QC%@9CĒCb;CĒCٿBĒC'BB$|?.:CĒC@A@??BdAC@A@?۶AHV A>:4AQC3A$C4S?H,C+AAG,C:>)3A5C@A@?B@ȖB<1B4By2B,?By2B&(AE`C%k? BQ2B@A@?CWa@ C@C. C?@Cf.!C?@CA>@C{?? C@CAA@?7B<@ 7 CcA: CAƻBA/BsOCC{?rs CAAA@?M?hړBbB AA@Q#CЛX@+qC)%@*C(%@N5@C(%@*|B(%@b{?I6C~"@0AA@?ػB뗘@tByC4ĢByCByC-/AzCVw?B_C@AA@?gBڛ@BS"AVBX"AVBX"Ac@`"AIu?rB@1APAA@{_BuAB5qBudB[qBfvA[qB[L&BypCh?>BberB@A@?YBy(@B'CB'C9[B'C 2BCJx?4B'C@@A@kA$x@? BD{CR_BD{C"ABpsBB> B{C@A@?mB@ܓ4B~B4B~B&VA~BAjsCRG?86B5O~B@A@?B@ mB?AWlB7AiFB6AyOA/Aӛl?lBA@A@?%B|@QvBlCrBuC"(AuCIHBcC\?lvBoC@A@? B=M@toBCgB{C2B{C#A{Ce?1pByCAA@?wB܈@"Bn^dCPBo^dC²qAo^dCyByABAr?OB2gdCAA@?hnB@m&BJ:qC7BJ:qC߬BJ:qCCAJ:qCcf?&B!>qC AA@?%B C@qDBQ@BG7BF@BsBG@BmBG@Brt?:DB?B0AA@?#Bx@f'BmCdBmCBmCL3BmCgj?+(BfmC@AA@?,B @[B+CB.CvB.C/)AwC |?uPB\C@@A@?JwCtaw?ױB~C@A@XTOBkS[@BpSC|BoSCI+zBB A@?N\B@T%BBABT*ABx&@C0)>cAB0A@?C5@CBCB؁CBa@B?CB@A@jD@/aCCLCC_DCEBC?VCCPA@?C@QCC(CC CC@C?tCC`A@?yC6@hCBccCB_CBo-BB?j~bCBpA@? BC@nYBC8BCmBC-AB?BCA@?B@|BBwBBB CBBBB~?~BBA@?C#@RBB BB&RCBsCB?QBBA@?w+BֲnA`§ACACAACz@ Bы>rACA@?AXABBcBBsBCCC5?@,BBA@?CB8N|A* BB BB8qABAC7X ?/ BBA@BuB AyBB{BBپBB8TAB!~?wBBA@?Ɯ/BxA8BCGBCAC Q@BH-?zBBCA@?n"AEiAFnAC_̾ACAB4BB>8ACA@A:A"ACbAC AB2WBB1>*ACA@?APAeBCkBC @B~BB3AIC0i=)@ƫC`A?@?kB43@`BeTCNYBXtQCkBXtQC\AAmMW?(vBߡLCpA?@?{ECT@Uc C-BNC*xBBC*xB)[A*xBs?: C>BA?@?0Cf@!CCCcCCcC9j@ƮBy?^C}CA?@?3Bk@.Bs:CABs:CYBs:CA y@eq?,B:CA?@?B)@fpABCAU%B}H@B>%BAvCu?-BWFBA@@?h&BZAH!Bn%C'B?n%Co?!Bv%C@@@@?FCz@?qDAiCةCM7{CCM7{C!BN7{C<}?l,C}C@@@@? ۄCh@C;mACICP#C]CP#CB_C@|?C C@@@@?Cq@@Cd[C]dC,CaC,CʸB,Cz{?ShC`mC@@@@?D@DV{QCDJC DJCˮBJC5 ?k DgJCA@@@?*%C7@C~.CCU:CCU:CkB*@,O}?߲C7CA@@@?<[C 2@m\C@cC;CtCCtCv8CtC!Hx?.DCoC A@@@eC<@CZAyCСA}7CСA1B:HCx?bC,A0A@@@? C>^@FCB;C BEC Bi BŽC}?TDCB@A@@@?RnC3=@^C8Bs#Cp@'BʝCz BCCBCCFrBCCcM?kB4CA@@@?FɥB@t'BZ"B$B"BEB"BplB"BmbZ?%BҊBA@@@?C@&CNC,CNCCNC:A'C{?EyCMCA@@@?B.@jC'CC'CuB'C1BCy?$C'CA@@@?-#C~p@!CLBWCZB%CZB~ 'AZBa{?!CPBA@@@?k7B>@ΐB CB CB C7B CVx?֐B C@@@?2DqA%C /B$CBL, DBBB/~?qD4B@@@?>CI@ÛCTiBfC_B8B_B\B8CCxz?j7C7B@@@?َ[CP@33CUdCD`C>dC"C>dC^m?A|Bz=CA@@?mC?]@;?1CCuq-CcCnBcCsB?C3X{?0CwCA@@?BDBo@JBBT-BBzBBfACt?HBBBA@@?;C:J@&Ca$CCSc$CP [CSc$C[BRc$C:|?FPCg$CA@@?jB/@uB BpxB B@SA B@CB,CCa?µBD\BA@@?dBg[@9B={C B8{CB8{CLA5pB:y?B+{CA@@?B @?Ba CA:Bo C|Bo CwA8̞Cp?BT CA@@~B@BwCCBzC8ABzC+@CNy?oBCA@@?0BX@)^BvrBZlBvrB)BvrB-BvrB!v?3B rB?@@?B@uCbALBBéBB BB(z4?mvB>cB@@@?[C\@uC%CBϓCg1CϓCBϓC=n?MC\C@@@@?%C1@NB#CQBQCr/CQC 'eBQC Xo?\CƿTC@@@?qC?@RHCCbCCaC:CaCIC2Cz|?"ٰCsaC@@@?eC9u]@WCR=C}C{?C~=C{?C0Bw9As?{?Cm?C@@@?C@jClC|C˂CFD˂CqC˂C~?alCǂC@@@?pD@DDLCe DNC!DNCBNC$?s]DvMCA@@?C @C CEBZCBZC3@ZC׊g?CCA@@?kBD>A58DC&/D]CNTD]CC]C?q]3DC B4BCB1CBBBZy?-#?C[B0A@@? [Cܯ @"C"BGC]B,PfC^BA`BI{?8CiqB@A@@?dCM:@{C8ARƃC2AֵC1A|OB)Ad{?GeCAPA@@?}gCA@FCgBJCBECBrB5Cl|?JCB`A@@?oW8Ch@NC`BC1BMC1BnwWB1Bix?DaC\xBpA@@?B^!@6(BϒC~BʒC"aBʒCB(B49Z? ˞BfCA@@?dVPCR@7C*CnA2C_*C:gC_*CSB_*C {?* 6CCA@@?jBj@C NRB<CMRBDBMRBw!BshCy?CRQBA@@?6.BʁA,BC30#BC_VAC0A!CF?8$BnժCA@@CB9@-BX*CBW*C¹BV*CGA,CCx?rB!CA@@?Mf:CR@k!CHC7k!CHCSMCHCl.BHCQ{?| CwCA@@?*hCPJV@qG\C C7\CCoCCAC~?G\CbCA@@?rB@yB*BzhB*BͭB*B]jA CWy?3BʰBA@@?@bB,@H;B?CdBdž?Cd Cdž?CįBdž?Cs?iB%?CA@@?>B3@@CLҚB8BRҚBBSҚB@cҚBh|?.ZCB?@@?JC3sACųCuCZAC ZA1C ZA}?CqA@@@?a6B, ?_BC)AC AC?@C>ATC@@@@?pC\L@mYCvA dC9@A$C9@Cϑ9C|?VaC@@@@?7B?}7CC=B7=C A7=CBnz.CZ?hB˲C@@@?Ϊ:B[@B1CʮBwCQQAC٢BC?:BvC@@@?WBJ@C,BTB BDB B@DCye?BOB@@@CB@dBa-BB xBݛ/C xB;B xB;+b?2CBhBA@@?C@BCXA2|%CB\}BB{B;2TC+g?\/C>AA@@% CH;@dqCZi^CrChCpChCBhC+z?ƉqC8UdC A@@?GCHR[@UCɢC過CaCzCaCwBaCh8}?ΓC#C0A@@?;CM@kC< DC CyFCgCzFCJkAFC}?rCUEC@A@@?SCI0@=CBCURCܳBURCCURC܇BURCSv?䟸B]SCA@@?mBI@ƅ`BʭCۧSBإCvNBإC?K CzO?6^B[CA@@?IB@#HBߔC#BߔCvBߔCm4A~BB?p?BėCA@@vBo@'lBΉCKnBCIhBC0ո?}C@]? kB'MCA@@?RNBxAKBwBB{B>uA{B>BC d?q}B BA@@?t;Bp,AlBWCjBWC.AWCAB3B\? mByWCA@@?AխqBmIB%B\C*q?'+CDB@@@?R`CWm@C,C~!C=CC=CrpC=Cy?B6C[A@@@@@?p2C f@_CWACA_FCA]BAt? CB@@@?(~CY`@CaAJCArCA(?pA~?EClgA@@@?=Dվ@< DkIClDKC@DKCM|AKC~?uD[KC@@@?;CĔ@ʥCFB3CBbCB0AZC W}?׭C BtAPA@@?CZh@tCP)CꤻC,C19C,C᮹BBS~?iCKC`A@@?C CSd@Ĥ,CʐC`&CtCaBtC9zB C?w?};*C(CpA@@?,cBm@tBWBBB CBueBBi?nBBA@@?>B@rB>CֱB>CB>C|q A>Ct?BP@CA@@[CR@(glC\BdCvBWBvB..CyCJQ|?ˢlC?BA@@JCn'E@BtCcBIC$r1CICBICXw?/BCA@@FB@ĈBA:BPARBQAѵ BQLC2s?+BUAA@@?qo CfPm@B3BB.3BHC.3B)B.3By?7BԨBA@@?ԈB4AeBjbB"fBEbB߹2@EbBZBnlC!G?CieB7aBA@@?Am=A^B CB CL5@^C?"B_Cf?BB CA@@?R Câ@~B!~@TB ~@c(C~@wB~@|?sBC,@A@@?3B>4@oBCI YBCʓCCBCx?pBzC?A@?lB/?<C|BfByCwAyC BӚCcY?B2C@A@?jBF? |B͕C\BՏC"@uWB4{BuWBH?!BRC@@A@?KCB-@XC\LCjuvC$9@C%9@Bʙ8C{hz?}C~?@A@?KC5:P@=C{CˣC~:sCpC~:sCPA|:sC}z}?FǦCAuC@A@?<0C M@C] C]vC}CodC}CB}C@ {?CC@A@?5Q?CG6@3C@GPCB}CB UBfUC&s?;C A@A@?C|B@CıBZCܲBݣCܲBC1C?}?WCQBAA@?CO@-+[CIC#Ci/C=Bi/Cͽ&B㴱C_s?5C"Csr@Q]C3C@Ce.CCe.C%@BQe}?9C`.C@AA@?CjD[@ C=CqC?CyB?CA:0A=lt?p CzCCPAA@?*0CV@YԃCp+@Aٔ|CKGA8BJGAx C|@C_sz?C2TA`AA@?B"ڟ@ C#A8C CA8Cͳ@A8C] C @4Rr?|Cz7CpAA@?LWCO}@#FB CBCay&CC6BCrp?9dBCAA@?C\@*ECBl*ACūB=BūB&BjC |?5DC HBAA@?BX@@BވCeB݈CB݈C(A8vB­u?BBڈCAA@?ʈABjACACU)H>NAN{BAA@?ȅB @Bb=CBb=C]Bb=CeA-Au?MBB=C?A@?C@CC0C$CxC$CzBHC2}?:nC:-C@A@#C@"CB%CM Cr.DM CBM C{~?'@C҂C@@A@?C2'@ KCE`CC:iC=C:iCyi@4iC}?bȹCyfC@A@?C~l@;CX BdC6ۓB)C6ۓB4A}C>}?4{CB@A@tC'@@"CGsBЕCiBDiB-' CiB@7}?CkB@A@?C@݇B0AmAkCAA@?LDK"@&DƻCDlC-DlC:BlC0?1 DC AA@?*Cj,@wC8eDCΞpCJGCCJGC69BJGCw{?.pCFC0AA@?˄BZ@ѹBBB|Bs0BBt0BpaA9tCvk? Bk{B@AA@?)C]]@'JC>kBEC滽BB滽BBnC'tx?bTC BPAA@ CP@,B/CBC CC^BCQr?BeC`AA@?C^@v*C@CY%C@CC@CzAC9y?o-CCpAA@}CD#P@CCKn C?CRn C ӛCRn CCBRn CJ}?ڼCC CAA@?3AB-ApB-A\A>CT~j?HyB*AAA@?SXBKAڲoBl#CiBH#Cp@G#CZB%׫CG?hipB'#CAA@?hB2ABCCBDCHABzeBBb:?BHCAA@?Z%Cr@BэCBǍC\_-CǍCE+nBǍCUy?cBWōCAA@?XHCn@΋[Cx^nCYCx^nCgH4Cx^nC1ByiBQ~?r[C\nCAA@?JB$@A 6BŹ:C˝ Bѹ:CL=Aѹ:CJA:@2?MtB :CAA@j%[B !A+BЂqC`BЂqC2B΂qCqy8A> vBk?oBx}qC A@?|(8C]@oC3CB3C C3C~vC3C#}?ghB3C? A@?@Ca@CB㇐CBzCBACQz?=CbWB@ A@?kC^@C3+B!C+B7C+B^B+B r?q!C뙴B@@ A@?avCPܙ@?-CCCoC YCJC YCcO#C YC{?=C䲫C@ A@?]C$@;ClCʹNC҅[CW[C҅[CMAׅ[C v?aC{jbC@ A@?=C@}@/C3 CC@CC@CAB>C{?jC{7C@ A@?v&C6@1CᣏC4CC6 CCVB5Bv?1CVۏC@ A@?B$@Q$CaBd5CHBAHBϘC>Cq? C!BA A@?5-C@:.CVuCL[C~C,C~C);C~CO}?BJCp,{CA A@?}C-@OHC2cKCMCvHCCvHCʊBvHCy?JCvIC A A@?iCWI@QyCbAsCoAXCoAABC`>|?yrC,{A0A A@?$qCc@8jWC,C-PCCCCCCnBCC!{?LYMCeC@A A@? BhA횥A CA^&C@/CzA/C#<>pAL"BPA A@w_GC =\@[CBMVCB12CByBH{CQ|?XCchB`A A@?ljAC;@|/C8,C*C,C2RC,C'^B,C{?#0CV-CpA A@?fBU@ B~|CMQB*|C@+B*|C3SB*|CY?Bt}CA A@?eBW@)zBTB&^BǬB BǬBsAǬBys?OBBA A@?xCdO@/5Cm AU.C AC AxC A}?)B5C] AA A@?B@P.B*A3BL*ABK*AbjKAH*Ag?B|AA A@?B9}@oɖBBBdžBZ BdžBvNBdžBrs?ݖB]BA A@?aBw.@BJBBB=BP)B=B_JBPsC:q?XBmBA A@?/B5@#>BIC37BMCFBMCAMCJY?/=BCA A@Bn@ApABABABc@w}C=?}A/BA A@?IBMC9ABIBB6BB7BB3>Bh?CIBB0A@?&p*AS@ƭ_BC,+AB$ACAC+3C ǧCG*2CnCG*2Cy85BG*2C^}?:nC6W2CA0A@$@$C^6@/OC!WCCTC&CTCK|ATC>Jw?CRC A0A@NC1}@!eC[@C^CN@Cy7CN@CNB7DAԪ{?ǑkCD?C0A0A@?cBwV@B+NBC]BDACcBDAC@m0CDSC,C+SCB+SCBAB)CC{?2CCpA0A@?Bs@$BWA\CpB#A\CB"A\CHA"A\Cap?RBz~[CA0A@?rBL@BC BC;AC}nBCNl?B> CA0A@?B*@BVBX=BlVBkClVBBlVBq?WBBA0A@?RC3bF@,#C_C5$CdC |CdC?ׯBdC|?+#C>CA0A@?1A0AsBÜhCZB4hC;BDRBBDRB1?!DB;hCA0A@?A.AxDBB*CBBo!@C#MBCMkAߐC@A@?C9@^C66^]Ce_5nЃCg_59@_5?|sC_5?@A@?gDsA DJCCNCTDNCANCU?@CMC@@A@?2?C9\@CJC%C C+CC C4)B C^}?C C@@@A@?nC۶@ENCCC8CC8CWB8C~?Z|CWC@@A@?%7D)@C@C0C[CD[C%B[C8?iCC@@A@?C@gCgB,uC^)BOC^)BtAf)BI~?ٔCǯB@@A@?C;@u,C&CiC>CGϽC>CזB>C'|?2!CC@@A@?jSCGD@xvSCJBvUCBɗGCB cACEz?1UCɫBA@A@?B1@aBqA)BdACdA9GBdA2n?B;PAA@A@?+Byw@WeBƿ@ǂB@tA@4B\L8Ca?{Bc@ A@A@?79B U@,^BPB[B Bz@FC_lBFC73 ? pBםB0A@A@?"CPC@ N@CBC =CBCGoCBC gjB0^kA;{?IBéC5BéC"ACu?ñBݩCA@A@?zyBb@eBZBBZB]BZB\AZBu?B ZBA@A@? B@ZBeCvBeCaBeC3յAeCWr?VBnfCA@A@?2B}@fp C6.C C?.CB?.CB gCz?c? C.CA@A@?GA|)AژACACez@FCAFCtF>HACA@A@? Cl7@C8C&B8C}C8CۯA8CY}?65C8CA@A@?@B-:AkA(kC4TA(kCyLB(kCYA(kCI?AlCPA@N#CzJ@qdBBRABX$CBCBЯ?bAB?PA@?C.@~(C^CʵCLaCCLaCA=05B,}?SïCW`C@PA@?ALD].AwE DABXDbCBc#DcCB낊BhCBm?DBB@@PA@?B @eBo CBACWBACʬABNf?B|C@PA@?D$@D(U5CLDw5CDw5C(Bw5C?wDn5C@PA@?ЬC7@OvC>(CCK7)C]CK7)C2BK7)Ci}?C`@)C@PA@3m2BTɋ@=BWC&BsYCcA˝BӿB˝B}B?(B8[C@PA@?'^Cn@BUۧB"BWJB|CWJBh)jCWJBdv?̸BBAPA@?pB2@B=AC=xBECCBECC>`AECC `d?B(BICAPA@?MKBث@XBuCeEB1;vCv >;vC)BavB6?9VBvC APA@?sC:]@C^ArC.CArCUCArC*q)CArC~?wCrC0APA@?Ba[@3C BBBtiBB`B:C:q?CfB@APA@?/AA\BAH BAŜPAqNCy2PBqNC1>%BAPAPA@?0"Cx;@sACFC}cBB`A@?uCsIJAOC(6+qCA6CA6A4C?C7+6?`A@?:C@ CBBCUB8RCUBvBUBkv?<C@|B@`A@?: DkADFDADKAe)DKAwBJA+?DA@@`A@?ZB@<+ CqC P CTC˄BTC6*BP͟B[Hs?YC]BC@`A@?2B@WBKLB UB:BXOB:BlA0bC7?w\BB@`A@?B@C@8:C9dB{6CMncB/BCMncBCANncB)Xz?C9C\B@`A@;Ct@n$CBC6BqjMC6By7B4Bx?q'CB@`A@?$B&O@BA@)hB#;B@B%;B@A6;B@kj?BB@A`A@? Ay@ƱB^FDBSBCB!:B}dCKC|dC&(?гBB@-R?B^;@A`A@??B舥@u0B,@C2BMCgJBMCIBMCL_?2BCA`A@?aBh@@BqCBqCNBqCRAqCTp?RB]CA`A@?B@2 BBrAjNCApA@?;aB@8¿BWABWABWA%A~ACx?ԿBXAApA@?wBkAeB)CK KB$CB$CȯA$Cp?\dBUCA@V*Cx@ 2Crc5],C5~O(C5ρ@4C?}>4C5?A@?aC@(^CNCFWCNCcCNCSKMANCnA{?aC͵NC@@A@? CC@6gB,CBCCC&RBCn4s?B0xC@A@?gC7'@ C5e"CCe"C&/Ce"CB2C}?E;Cv"C@A@?15CuM@u-CC)CCR9CC2!xACz?+CC@A@?@fCӛ@âC90CDC/0C+C/0ClA^`C}?C C@A@?uB@3@BΊCtBΊCpBΊC An;Bn?&BCAA@?PJC@]fC CaCC /CCyJBxB҉}?fC CAA@?T.BD@kBMCQ}BzC*AzC.YB塦BT?yBYC AA@?BZ@e CŐ_CE8C_CbB_C %BzB.Bv?C_C0AA@?` B)@9{BGMB-%qBDB3]A?ZC]LB?ZCLd+?qBB@AA@?C)@>BVAB6A{C6AB6Aby?)TB9DAPAA@B$=@l CECΔCSC,BTC%A*QCny?V CC`AA@?ꏰAAKlBwֽBnB\ֽBoqBuCFBuC?znB{oBpAA@?]B@sB'CuBp'CjBp'CQA9Ckw?LB'CAA@?BB(t@B.BYBBjBBpAB v?SۺB[BAA@?`fA$AMAxCQAoCy?BBABG>Ai]CAA@?dB)@H]BC)ܶBC2rCCv BCy?*-BCAA@?O"B$A[BB:BBAB6\BBCGh?B䮖BA@?#B@}wBCÐqBC>CBopBBέ=?luBC?A@?xCݔ@aCP͓CCs͓CWuCs͓C A5B}?٘C;RC@A@V1B|!@XAOBATLBATLB1AӒC>AB@@A@?:1Cel@_pCAC CAC݄MCAC@BACxx?CzAC@A@?4bB.A@B}rC?B}rC)ŐA}rCpByBY?`B {rC@A@?)C\lY@bC4B7CB&BB C}Ch|}?ECVB@A@?dUCiC@CQB0CnBpCnB`BnBЖ|?C@%B@A@?U?C@)ECկCI ACկCY9CկC@(+C>#}?ȳDCxCAA@?OB$@ Bs6BB-7B4B-7BU@͔Cx :?%"BBAA@?!QB̭@8ӍBCBwCAwC@BCdU?nBMQC AA@?BS@իB gC$_BfCABR?NB XCpAA@?VgBoX@lBCBȫCCȫC23BȫCx?jB CAA@?PB,M@B CB Ch B C`xBA,C=r?,]B0CAA@?OBת@8BQCr1BQC7LBQC%+BQCg?S8B=CAA@BM1AANBNANBANB"w?;NB`B?AenOBAA@?AR1AB`=BC ,BC6?6Z)C94B6Z)C!O? ٌA޾BAA@QCn@X;CTCe4CtAbBpAA@?B=sc@CMA8 CfAqBgA.BmGCz?QCcAAA@?5AYd#AZAǠuBlnAhuB@hqC,AhqC~>A7tBAA@?7BhKAB]9C:lBY9CyؿAY9CM BdB,2h?!]B+CAA@?jBGANMBҭCh:BҭC2}BҭCBAҭCJp?l&MBԭCA@?nBy@ghBC`BC,CCkBC?tBC?A@ˮB?K@[BW;C웴BW;CDBW;C@9@A7B@A@?B C@rBCrBB"B*gSB"BA'CAA@?pA"AQB9C@B9Cg@둿@֌QB葿@bP?zQB:CAA@?f|B@pB+iC&fYB*iCyB*iCA+iC( MAOCAA@? C[)@4z CBClB:-ClBFAnB{?l C B AA@??C2F_@ CsC4 CC`YCCEbBC|?? CVC0AA@/BWW@WBH) CBS$ CյBS$ CiNA)CNDw?RsB% C@AA@?AB. A!tA< CrAW C'2?@C}A@C֭>knACPAA@?oA A9AsCc1AC?CAmBJL>н8AޙC`AA@??B$AA%AšCtAšC@šC@(@/C&Ǎ>%AКCpAA@?BAAuA}%nB:gC@A@?HB<@TB,aC%B)aC6CB)aCDkAR0CYg?z?dnB]CAA@?BB>?>B LC@AA@?RBt@uRB CB C5B C;B,Bs?BCPAA@?B(c@jlBC]BChBC-AC{?BC`AA@?NA_Aڮ.BCBC^AoC CNQBoC Co!?F/BmCpAA@?B0@]BVCZ^BVCBVCJ>VC|?zBLCA@?4 B AB3C%B3ClACBCLu?B3C?A@? ?C+@J.&CRCX'C[C RC[C)B[C6|?B|CB|Caj C|C2\B|Cby{?8B|CPAA@;Bf]@A')CuA')C+IB')C B')C2?RA)CA@?B[@#CBU$CBTةBBV.BC?j#CB?A@?`B+A@SBCFSB`CB`CB`Cl?hSBkC@A@+BXs@B1UCB TCB TCE~A Cw?5BTAC@@A@+yB愈@tSCBwCBoBBsBh#Cty?$CB@A@?ơBp@AMB:/C B;/CxB;/CO&BCaw?9BQ/C@A@?;B^jz@ B .AB.AB.AHA>Cw?B^-A@A@?eBb!@:ƓBϭC1ѐBϭCNMBϭCU B'C j?"BC@A@?;B[:@4'BEZC BEZCdBEZC0BBYv?TB&ZCAA@?lB.!\@/2B,;C^#+B1;CpB1;C1A1;C!L^?43Bh%;CAA@?B:g@܀B'+$CuB+$CB+$CB+$C44u?؀B $C AA@?BPrR@ B~BpB~Br^B~BA~B=z?mBB0AA@?%AǍ ABF0@UA.1@J0@1@LA:CQ#?xBW@@AA@?B@{BdӋCBbӋC CbӋC92BbӋCP}?Bz͋C?A@?MBxr@BK֡COBG֡CBH֡CM"AI֡Cu?BɡC@A@?=BJR@AlCAA_CaA_C$n@_C?}AqC@@A@? Br@)d;BX)B3BY)Bp@Y)Be$BWʈC3?;BK.B@A@?gBz@BAw"BHAAIAmMBiKCo?BA@A@?B;@ChB$C+:^B$ClB$CjcA#C;Mp?KhB1C@A@?Z6AZb@ A_S C?|ApS C@CQACk> $ Af CAA@?<A@)CBy7C 0By7CdTWAg^@eBg^@Ah@DAא@{Aw@RAx@HA@|;C3?!A\!@@A@?B@uPBFJB=BFJBcAFJB lAfCd?rPBJB@A@?B3@xZBA@BAйA}A-AKCMc?%[BnA@A@j.^B7@+nB[CBXCAYCTfBqCT>v?orBC@A@?AR+@*0B˓CG B˓C6hAy/BPLZBy/B 4C>@](8 =8%@CA@?ڔDPA~ D4CРD4CD4C@^B4C?tD4C A@?v CAp@sAö6A@?NB5XArFBB4BJB4Ct?BJBA@?AjAiCB4CA4CІ?%7@B%7D4?NB4C@?@?V/CG@)C05B(CFBVCFBB FBX|?C!HB@?@?mPBI@(Bu6CoXANC"@NC/A,AU>lGA8UC@?@?gB:@CxWBCBBBBWCn?'*C BA?@?{B(+@ĉB-CFB sAC[B sACQA sAC8S?Boe=CA?@?C@QC=(BGCp BϮCp BBp Bd}?͹CB A?@?~C C@]&CduCìC5C'C5C&4C5C:Es?+C:C0A?@~ʷBZp@Bq_BA?@?٥ C-_@BBB͢B!wC͢B>4B͢B\w?=BxBA?@? CCh@28CnCBnC.CnCcL@BnC?Dz?ՅCCA?@?-Cfi@B#CB"CFC"C7B"Cy?WBߘCA?@?}Bc@BVB EBB2BBABLw?eB>BA?@?B0@eB.)AsB(ArB(A AICjm?bBAA?@? A-@A]tAC˽fACAGtAǾCA?@?,B ϐAACAC BC@C8? AC@@@?OB@bCBCBBBfBzC//k? CB@@@?vECNa@5C XCaMCdC|2CdC AxBBx?TCheC@@@?ҒC5P@C؀ACSCs9CxCs9CERAt9C|?òC Y9CA@@?C@LBh/CB 9$CS;C 9$C%B 9$CTj?BJ&CA@@?)CfN@UTCC:CC CCRB=ҮBsr?ScCCC A@@?CBq[@C7CCq_CfCq_C#CC{?˲CwC0A@@?`C?@0C뉏Cn?CgCVlvCgC[BgCy?0CUC@A@@?C>@K=CgC?+C?v?%:CRCPA@@?CB@CqCfC?CC?C޳A|bCzs?CѨC`A@@?O׋C@>$kCtPXC6dCXC&CXC.BXC|?e_CZCpA@@?>CQ!l@$BB%BBi CB=CBBpj?BBA@@?PB@ZfBc3Cy`B/3CA/3C WBC{Cu&@ir9CLBGC DB(CDB AB&eCAx?@CPqGBPA@@@?oC}L@!CǖC!CC&CCUCCO/y? CwC`A@@@?|{C@1CFCyCLCwCLC?ۙC`|?,Cx CpA@@@?q CJGj@ V7C B0C9:BC9:B*BNCx?7C BA@@@?C= h@>yB'ArB0A/C0A9B0Ai?\BrFAA@@@ݿBĮ@CBN8\BFVBA@@@?:rB@$B ­CUB­C;B­CSB­C;Lb?Z&$B CA@@@?4Bx^DAFXBCBGBCYACUBB\?WXB׀C@@@@CA C_B^CQADQAx+BQA̓~?`CslA@@@?BK@WB#B"EBxdAʃ'BxdA@GBC?TIB/'A@@@?+C]@CoQB_C6zBulC6zBA/zB~?KCwB@@@?/CJ@2CmWAC`AeC`A.%C BC1}?;C?`A@@@?t fCZ*@q^CLBrKC3BuC3B)B3BEz?rKCBA@@?M#DYADBDҹBJ%DҹB쫤AҹB .?a DSBA@@?6cCM/@e*pCCzkCVC;JCVCBXBDv?pCL|C A@@?~C}E@8CC뉤Co C`Co CB1BL|?l3ClC0A@@?%C=@8BQT9CbB%%CDTC%%CiB%%CNr?B",C@A@@?-C=@B%@10B(C&C(C=B(CQl?BCPA@@?#wC9@iCcBC]BlC]BBaאCE}?|NC3+B`A@@bBMb@BbBB3B C3B{HB3B;d?$B_BpA@@?rBh@o3zBCʕtBKCeBKCu50BKC\?~[Bf"CA@@?8C\@9C\'@((4C!'@j5C '@G?'@-z?=BCJw?B:lBA@@?xB&@3BVCۍBYCVBYCAXC q?BCA@@?KBjB8A/B)BB(BODB(BAA(BE _?/BB?@@?E CF~@,QC*lCf[3C bbC1B bbC>B,9BKs?m?C`aC@@@CCH7@8YC;C4C8BjC8B3B7B |?BCB@@@@?!Cd@_Ch C42{CxDCO8CxDC|BxDC+{?ꟇCC@@@?2B@ECoByC؅B{vB؅BA~Cqm?CB@@@?Cs\@sCC"C_\CU)C:BU)C CRC1w?oC4C@@@Ch@C*@C`6AdC^6A? Cgl?C~}?Cj-A@@@?\C&@XBLPC0Ch?C{Ch?CT̖Bi?C׬x?- C BCA@@?6 D@QDB(B< D (B D (B5o@(Bΐ~?Dp(BA@@?X|CXK@VjCTBTrC#BʼwC#B@#Bx?$qC$EB A@@?C@[CB2C'"BsB'"B/?BzC=t?AC/B0A@@?CRk@vD@ߒC`DZCCZCB^jB.?9De1C@A@@楋B~@VcB̺CxzRBV:C>AV:CAWB'?`B`eCPA@@jC\@CjCZCFCIJCFC?LlBLB|?W;CC`A@@?fB@CEBDC-B5A+BBwCA4m?CBpA@@?泃B@ާbBmNB5^Bj[B% PBj[Bb@ܖCQ?DBuBA@@RCjU@}cC~Cs-]C~CCC~C7ADB|?y^C&DCA@@?˜A- AYA/C<^Am0Cٝ;ABBB$c>lA6CA@@?QAB$AA B辁AZCE@z-CAz-CVB>9ACA@@?WBMo@C<C9NB<C6%B<C AvCy?B bCA@@?Q2CF@u+;CcB=;CcB&#C cBAlC|?v3;C0dBA@@?iYBAa!BF5Ca!BC -BC:@CD?L!BCA@@?'B@R!Bea&C2&Bpa&CBpa&C2(?0Cty?wBъ&CA@@UAB+AŜBm$BŖBm$B@Am$BZ}Bt]Cg?B@$BA@@?rKBwg?@,C C@@@?xfC@֝CCAlCvCCvC&&kA, C)}?CqC@@@@?UTCg@v.CH+BۍC6BC C6B/C C<{?gC{B@@@?,QC]T@VkCMBC#BC#BiC#Bu?jCCB@@@?C$C@b#CqBr C'C-C'C B'Cs?w C-C@@@vZ%DI@D"Bu`D)B`7D(BC&ByC?ɶDIB@@@?91B\4@LBZAA@@?ZC@ܵC+KCTcCliC@?CliCPBB[u?\oCܖCA@@zBM_(@ B,AC cA_B"cA͖B;BCF5j?hCA A@@? Cx@CZB?C:sBD:sBYB8sB{?SCB0A@@??1CX#@JC?wxBCPA@@?S:Crh@=}CBCFBZCFBsBFBx?VC(B`A@@?"ZB@dBs+CpBv-CAv-CHB;C$?"`B>N0CpA@@?Co@mB,]CBG]C`(CG]CޣBG]Cr?jBáCA@@?H C]@_/C}"C`+CJ"Cw&CJ"CA&CA{?./CcCA@@?lLB|j@w CʌCmCʌCXBʌCB*BKLv?  C+CA@@?wJ C5T@9BCCBѐCCѐCAѐC.w?xBCA@@?JC@LBB1B%BfC&B؍5B&B{x? DBQbBA@@?(Bo"@mB:B[B:BB:BBiA:Bq?bB;BA@@?2˓Bv8@cOBƚ[CAOB-~[CB-~[CsaA-~[C'c?NBo[CA@@?Bj@EB|]C↥B|]C/LB|]C6A|]Cu?zB+]CA@@sB4 AůA8 DO"A8C?@@?ޜCA+Cq:CC΢C޲C΢CgBEC[A}?CC@@@?MCY@C7:CC93CSkC93CXBڳC{?jCq:3C@@@@?BCA @UCCHCbCL2CbC女A Cx?QCD\C@@@rQC/@TdxCêCejCLC>.CLCrB2C_Lz?+rCC@@@?rDKZ@l>3DzCD@zC D@zCMB8B+-?DEzC@@@?C'@CBϢCªBrDªB{\CªBr}?gƬCB@@@?PC@?HC;iCBCԋ[CICӋ[Ce@̋[C.s?@EC+_CA@@?Cb~@SC7VC;pC~.WCC~.WCAC~.WC '{?D˂CVCA@@?CKY@=v{CyC CUkCyCUkC6;AXkC,T|?؀C0C A@@?C!@@mCbBCX&]B[7CX&]B?&]Bb|?FWwC^B0A@@?eCvN@_CBeCLBNlfCLBUBSC|?nCB@A@@?S}C(7/@MC̱CJKCлCCлC;BлC>{?]MCņCPA@@?>-Ci4@vCIGCOmCf;CBf;CCBz? qC"C`A@@?C?@QC&CC`&C'C`&CB`&Cªv?rC$CpA@@?>Ae$AHA4CA4C\A?8A~?X!>lA;CA@@?/B@>I C띱CvQCĝC BĝCSB;/C2ix?cC CA@@?;C j@uCf~@ C]@ keC[@BY@9{?GC @A@@?b{Bz@R:BWCoBٚCLBٚCBCe?{ęBCA@@T[BAUxBCߟtBC|AC9ACuEW??xBCA@@?AC@@A@?xeC`s@l,B]{vC%CzhC\CzhCo34CzhC/v?jLC1akC@A@?MCsQ@MCmAcCܪA*oCܪA#Γ@[IC[`}?kOC>A@A@?яD<@]DpC8EC@NyCC?NyCBKB>NyC|?o_C>uCAA@?CS@ pC"BuCbB]CbBBؘCI~?(CCNBEBOB6s?aCOB0AA@?Cr@]C:yBCB(CB-9CC~?CC}B@AA@?DB?A_CkCBCw{CGBC DCCjQ?qC C5 CPAA@?iCu@S0C NC!{CMCY'CMCG:BMC:m|?yCvMC`AA@? CjNk@BFPU?HgBwGCAA@?sCFT@:2BV.CM"BH.C¹1CH.CndBH.CMz?_B@.CAA@?/wC6P@NC,CCa:CbCa:CBtCS}?郊CPCAA@?vo#CY@إ*C!k\CV%C'k\CbC'k\C@!B|?*{+C\CAA@?YCx?|~C+B@A@?NC@1C]>CCJCCODJCCBJCCN2~?GCD BC@@A@? yC(@c_CClCBxCB2AB5Jy?/cCB@A@?C0>l@#Co?BCŮBuCŮBE AkCB{?CCB@A@?e6HD0As[GDCEJDCDDCiA B9?AKDxׂC@A@?pCc@CCCI>CCI>CoB|Cx1~?&CC@A@?CҭJ@.^C/CbCCuACCɔIBC#{?~^C66CAA@?KC'@CBBC|B) D|B+C|B~?kCBAA@?C@@.CB)CBPCBzlAB!3|?,CCB AA@?t Cd$@TCC` BkFC 1BUbB 1B}:CnC`CKu?XEC0B0AA@?BR@hC BڙCܩB3 BܩBA'wC9s?YuC*B@AA@?.2BOA'B]՟COBC)A C޴B CH>?BBSCPAA@?C`$T@BC!BC;O CCQACIs?vNB7C`AA@?NRCpKP@t8CJ/CG2Cr/C&jCr/C]Br/CG{?d4C0CpAA@?OACCQ@5YC/-PCuC$-PCgyC$-PCFB$-PC{?[COCAA@?$?CNP@|Bא!ABo!A56+Cp!AkBp!A!u?VBtnAAA@?}CM=@L(CnB7C6ǚBkC6ǚB9B DB>Bط BPCPl?BSABAA@?-!GC5ha@G)Cp/C0|*Cs/C/^Cs/CPBs/C)|?m)Cw;CAA@?(C8U@Q(CC(Co{CX$Cp{C]U@C|?í'CqCAA@?ZBuA^BAfCC&7C¼CAy'C#Cy'CjV?10C8C@ A@?a'C,@^CaC:CLC^BLCNsB.BŁn?FCC@@ A@?!C6K@dCb~ICsnCDPC!CDPC<@A@z?`@C6{NC@ A@D5@D@D@* A D>* A49B3* A~?0D@@ A@?YwCE@CEBq)CBkSCB@DwC%{?CqUB@ A@?B@BC B CkB CB C?^?BBC@ A@?E;B`i@߱BDBXBaB7 BaBBlC]i?BGBA A@?!C!j@)C`oC%CPC)CPC|ABBw|?vCCA A@?BY'@C&ARCPA_BPAدBjKCl?CLA A A@?K]Cu]6@K C-C>2 C-CC-CеA-CMv?mFC.C0A A@?1IBABvC,BvC\ B%UBB%UB׼?,BzC@A A@?i6CXN@-C>yCiC9+C5C9+Ct>ArVCu?Cy7CPA A@?nB3@HBVCBVC6>BVCjBVCpg?BYC`A A@?HBV-C\BqC3\y?Cc-CA A@?_|B@lBpͯCy[BdͯCKBdͯC!Bƚ+Cic?JBCA A@?fC%j@vOBZu@܎B4@) C5@A:@&py?%Ba@A A@?AyAvBӢC#BԢCp8ACZiaBCNW?>B CA A@?%B)8AABTAB=pABlACv>ABA A@?23B1AV>B2eBU3B7eBg B6eBAumCyd? =BeBA A@?FB/@BzBB}B{B}Bg8`@C5v?]B?B0A@xC9ARCB_CBȠDB2>CB?XQCB?0A@?C?:VC|C܃jClȫCBlȫC+*Cא#C1u?h`Co֨C@0A@?0Cc@jqCg&CumCCΙCCXBCz?xCC@@0A@?'B?Bn\CCMCYFBMCDB]AQh?!BtRC@0A@?+YA)@GA A+ BK(CίA%C[B%Ct>RtA`C@0A@?UC72@N!C8B&C$B8B$BX/"B C2w?"C_B@0A@?qC+4@x2CC գCW}CCW}CxAZ}C0}?r+C?C@0A@?Dkm@5VC NBYC`QBs D`QBTB_QB~?C PBA0A@?C^@CD?'C³C9C³CaB³C%~?_CȳCA0A@?BƼ*@ CB CDBBDBaB~}C1s?CB A0A@?CO@C'CsB e"CsBCsBAP#BA0A@?_Bo@AfCA3fCwFB3fC6ۜB3fCO?\A.gCA0A@?DAAH-AA AA#A @:BAzPAA0A@?۪B G@^B2CB2CÅB2CT@e.Cou?B<,CA0A@?ՑAA BueCUBfeC>wA]DBJFB]DB>W BAdCA0A@?-B3AfAwPC8AwPC}BwPCÄAwPCLB+?APC@A@?XCs@QBC4C*C4C|C4C.B4C?0C4C?@A@?Cl@CۯBC "BC "BL!B\Ct~?0C B@@A@NCjĮ@fCA+CӋC˘-C|EVC˘-CTBf̰C?}?oC,C@@@A@?rC9X@ C=CGBHCGB2AӽC3}?9CˠB@@A@?fC dF@5CNcCC CC C=2C Cw?lCcC@@A@?5Coj@nCE.C[CEE+CJHCDE+C$ABE+C_}? Cg,C@@A@? ՌCY@=]CC TCڠCVCڠCBڠCz?@UCC@@A@?]lCZ4@tCBx9qCBR_CB/AC{?pCBA@A@iuCN@:CyCMCCPCC~mBr! C|?7CΟCA@A@?z^C7I@+CC CtCi0CtCbBѩBK|?։CfC A@A@?cA BARB(AFB@Aj2TBB@0A@A@?BҧL@,C(C)C(C4#B(C#CQ"CYw?)x*C C@A@A@?TCO@|v4C2EBF/C 4EBxB 4EB)|BMeCTy?N0C6IBPA@A@?CjY@sBnCոB nC&C nCRB nC\w?BoC`A@A@? HB]@@BרB56:BبBAبBpA16CC?{FBKBpA@A@?LCeH@tBC&+CjC+C}C+CiC+CDz?C*+CA@A@?jBU`@~*C2A@ OCBOC>ſ>/"A-|AA@A@?~%JBAB4%BM1BA%B #BA%B*?V%B'hK?vB%BA@A@?3B7|5AgB?AvB?A??C{B?C|F?nkBB?AA@A@?5JB(G AnLBdCABcC8 0BcCrԍ@fCi?MBeCA@A@?BC>B?B>B#Y{?v:lCEB@PA@?]@CpnAC;BEoCDB]CDBd@B6C^}? CB@@PA@?)C%v@BvxCJT$CjrCq&C`Cq&C,Bq&Cj{?WrC%&C@PA@?J)B׸k@P(BC/BCP{#AݢCqABݢC>|BuC@PA@?Cc@fCy|BsPCBCB5BB4+~?CPC^C=PClDC=PC:BC%C0A`A@?eFCu@#CA$@uK CL$@%gCL$@ BL$@|?\ CmK@@A`A@?̓Bu@_BUBlBUBr BUBrNBuiCCj?dBUBPA`A@?Cs,CCs,CCs,C@v,CG|?C; ,CA`A@?^B?@eM{B7B19jB7BLC7Bs{B7B2Yy?y{B]+7BA`A@?@ BJ@}BRA*BAAB@Aw[B?Abz?GBApA@?[C@TCCNCC`hCCAC?RCC?pA@?OCn^@SC~$C8B*$CȏB*$C?*$C>Es?B%C@pA@cC@kCPrCxCPtCCPtCiBPtC|?XC:C@@pA@?cȚC>@dԆC1B7C3BC4BB4B/}?C-B@pA@?>Cw@~y=CA6CA7;CABƢ@$ACdC>-mC>6AY>o|?-mC\CApA@?8BLh@.OBTHCK7JB*HCB*HC EB*HCj`?KBC ApA@?[B>=@u^Bi6CYBvi6C$Cvi6CBvi6Czn?]B$ 5C0ApA@?KyC_@QC*:C=C:C B:CY0B<@ z?LCB9C@ApA@?BDw@HBBBڸB1VB׸BNPB7YCtr?NB̂BPApA@?F%Cye@;"CKe@ CPe@{AI7C0q{?=%Cl@pApA@?jB}@#CB&CeDBCX;BC` @BCQ?L?B]CApA@?ArB8A^iBlCeChBlC Q@0$CauB0$CJ@?,gBCApA@?PAB(AD9>B,BE>B,B;wA'CeB'C*?>BBApA@?B@B4mC|B4mCB4mCQ,@sdBx?OBKmCApA@?HAf1ABVCy+BVCK@VC B B;?KB(VCApA@?v]BABdCH8BdC4BdCABq?1BYCA@?;BJ@.B4C¨B4CVB4C3A7Ct?BB4C?A@?#xvC@geC [BL_C*VYB(C(VYBJBVYB2|?iCZSB@A@?PCGQ@-dC~VB]CH>WB]=CG>WBijBiC6{?bCZB@@A@?B P@rBBB۞BCڞBaBڞBjq?BB@A@?GB`6!@B`*BPB-*B%+B/*B A˴^CW8]?cB>O=B@A@?0KC]@,C%9C`}(C%9CiQfC%9C%PwB%9C:{?0,C'9C@A@?A.@GZ?A'B 9A+B@CSAoJB@A@? #C'ō@{mC}AXgC1~AóB1~A(w CƯRC?,|?^mC!A@A@eBb@BC:|A8C0AA@?s(CUC@C%uCUB#uCNC#uC]B#uC{?C$uC@AA@?AAA(^hA3BeA#BA C=iA CL>cArBPAA@?A?]AtlB*WCCnB*WChwB BUKB B ?vmBMWC`AA@? BF@BmjC{BijC1CijCXAijCWx?BhjCpAA@?v8Cb@PCqC(CsCLXCsC7BrC|?"CCAA@? 'Bk AAUBCͿBC]>BC+WBBC\?zBeCAA@?BAr@CnrCCnrCBnrC>B{B5{?jCcrCAA@?B@"@BCjCBC|BCqJA 3C&sw?솭B?CAA@?;BhziAkBCWBCBCv<0BCr?:}kB.CA@?1B@51B6~BĹ6aCĹ6zbBù6Y?3OBݱ6?A@?*n|CF@T_CDLCNJCDLCqXBDLCQ}?XcCL9C@A@?`Br@w6XB8CàSBC BCOe)BCd?TBC@@A@?!Buk@NB0|C&B{C׀A{CX&A.C]7?BC@A@?C+}@ңCABCBUCBAB;{?nCB@A@?(6Cs@&C)&A!C&A-]FC&A,B&AR(|?E%CA@A@?$)CI7@\dCɱC [CɱC@BɱC#BI/Cٟ|?*eC䬱C@A@?Cwdž@qCc>C4eCPCCPC!BPC}?|qCpCAA@?{=$CQ@ CB1 CBV%B'O@#t?B‡C9BA‡CBA‡CBA‡CwTj?@?BuC AA@?-$Ca6@m Ca CgCa C;Ca C-UBa C`{?) C= C0AA@?EB M@B_BS(B_BB_BtA_B,iv?BB@AA@?B@ JB CYKBCqBCBAC24a?IBCPAA@?B$b@mBPynB*B9pBOOB;pB&A pC= v?'BpB`AA@?͟A A`!B2ZB!BYB^oA,yCtB,yC>I!BHBpAA@?-GB@DoBMhiCiBNhiCBNhiC)ANhiCg?boBniCAA@?cBF@"BRC BRCOBRC{9BDB@y?BCAA@?:BA6B "BjB"B# A"BGB<\Ce?܀B!BAA@Al0A;AK#CDA@#CA@#Co?A#C|>:ACA@?BjY@WBBOBBbCBٺBB}?1TBB?A@?-MB3@Bm0C:Bm0C*Bm0C;:@m0CJv?WB0C@A@?6C>sAaCХ&CiXCf&CGCf&C$bCf&CB}?ZbCz&C@@A@??BDܩ@nIB>/CjBn/C:Cn/C4,Bn/CSs?oBM.C@A@?6|lBjm@Bl C|BC>HAC UbBB`?BʦBC@A@BCW$CCBC&AhQcBAA@?sB0'AwUBPCABPC@PC.)BAW?UB=PCAA@? AAas"A"w`CA"w`C ?"w`C@1B!>H"Ax`CA@WCJ@ŸB$50B5HC5yC5?EPBC5?A@?BRbB!k@jRBVC.KBTVCj,BUVC*@L B>T?eWB}WC@A@?sBC(S6AP8C@`0C @NC @A @A|?7C.U@@@A@?0@B@3C"A Cu\ABu\AAKC׶z?CWRA@A@?&CtV@ CC8BCCCtQ@Cҵz?CC@A@?/Bb@1rC~BkC~BKB~BACzy?`C7B@A@?/rBW@ikBwBnsgBwBy9BwB7AzCZ\?YgBB@A@?L2Cn@xCGBPCGB3S@CGBBGBJp{?"^C{GBAA@BAO@yCМBWCќBA>BќBwBBH4CBx?KCbBAA@?DPCHrZ@ԩUCtnC$WCnCECnC[A+kBz}?)dUCZnC AA@?\B< AAeCDIA$VeCB@#VeCfAXEB ?*AIeC0AA@?lB G@MB\CLB\C%B\CNABr B5w?d-B'\C@AA@?RBg@~BByBB7-BB@B\t?oBBPAA@?>B~@ZBI#pBWBR#pB?~BP#pBpVBpCw? BXEpB`AA@?CB@qB4ǢCzfB8ǢC̨~B8ǢC@;ǢCp?:qBӢCpAA@?AA:B7lC;A>lCqm@ 6CtB 6CG?BCAA@?aB@vBd@nBaBW@nBBY@nBk!BY@nB^x?TvB7nBA@?!%CbS@6wBCBC7WCC&sBC?[BC?A@?;LoBc@ PB%IfBMBHfB&ABHfB=K@4mCmU?,OB.eB@A@?^=B!u@B1B,B)B2?CBC4_?ۨBPuB@@A@?B@]9sBC&#rB2CKuB3Cw;@3C`?rBƇC@A@?ȅB0@z:B#BB#BC#BUnA#Bku?y)B!B@A@? C@8CH BCs BR Cs Bw*Au B=Ny?]DCB@A@?iAAue0B\C1B٪\C_A_"B(B_"BO>0B]C@A@?#;BK@7KBh1CKBٱ1CnAٱ1CAزCP?!1JB2CAA@?B2N@8-B-?C/BACBBACm9BAC_?O/BBCAA@?Ca._@H2C3|C|2C{C/^B{CxB2Cu|?v2CiwC AA@?%CbD@!C5CC5C#7C5CB5C|?sC5C0AA@?kB!I@>B)C B)CvB)C˒A)Cq/w?BdC@AA@?WBf@zB+CB+CȤB+C`@C:v?B,CPAA@?9Bc@sBaRBfBkRBAkRBKACo?&.tBwB`AA@?\B5@\B9;CPDB6;CTB6;CAf@ y?Bo;CA@?FCP)TARKC4CgMC4Cw@C4CNA&7?tKC4C?A@?C׵@BH+"CB2,"C/C2,"C?B1,"C%,{?B6"C@A@?cA'@&TA(CAېCCAAoBtAAoBp>tA8C@@A@?B@TB%iB9-BiBBiBrL@iBu?B:iB@A@? 8BAY} B=3Cue B3C]A3C@ԳC*? B3C@A@?~qBaE@FaBzBlaBB DBB @oC_?VmaBB@A@gABZ=@B8CB.lB/B*A/BBKCd?BB@A@m B@Y\BgcC \B_cC.J5A_cC/B|BT?\BECAA@?oB@^BÞC~BʞCFBB AA@?:B0T@B aCBaC_CaChAaC^z?%BaC0AA@?BM@+ CNfBCOfBNBPfB NBC"}?ZC>jB@AA@?BB@B CUB C)}B C~@CWu?B CPAA@?O5B,@v BCBmC'4BmC AmCd?+ B!CA@?B@BCABCB-BCBB?zBC?A@?KBq@%9B@C㳃B?CL(A?CS%BB/c?6BC@A@?ƒB%]@BBlBBBLBByA{C l?BB@@A@?kaB@H2B.CS2B.C:QB.C @.C[?2B.C@A@?gB@ƂB7HCB2HCfB2HCA`BQy?B2C@A@?%B!Ai<`BB>^BB^AB?&B9CɰV?S`BB@A@?8AM@A\C,A\CnAJ BM?BJ BcQ>cAc0\C@A@?]B3@HUBۛBdMBۛBBۛBXBۛB_h? VBpBAA@?.B!o@EB(HCBHCTBHCbLB$CeTw?BtCAA@?U8hB*@&B(CgoA$C*IB$CB$C8c?B% C AA@އBx@ %B/BB/BqB/BvbA C߆z?oEBFB0AA@?1,AB'A}s$BȜCBǜClAǜCZ%ACO?$B-CA@?眷B{@BIBuBشB4C?+B?A@?RqBm@9uBCrBCV)BC9BcBg+u?BC@A@?_C@qCrC(dCrCI~BrC"(ACBy?CoC@@A@BA|@HBٷCE@BᷬCžAo%C-Bo%CJ-?.IBdԬC@A@?&BA@}BH DABG DA]BH DA@Z DAcs?~|B DA@A@WhBP=@BwA֧BYAZ{BYAQKBGCsny?KBAA@A@?xTB͜@AjCoAsCTC@L>TCAL>TCݚAL>TC;> AuSC?A@?B:@6BTmC4BXmCbBXmCgA`Bw?綖B~C@A@?MCRb@6Cg%C Cg%C#mCg%C9Ag%CL~?|C>a%C@@A@?&BCC?UCC0A@?|BHCzxb@v CBRCBBBPeCC?jCB@A@?OBb.A(.BBQAB@B(JzAC9t>*ABPA@?PC/@,BCzBC\CCPCCw?@}BC`A@? C@vCB pCB֥CBԯBB?vCBpA@?C@TՠCC:fCCCCBC?cCCA@?^C @[FCC#ACCK|CCXkBC?zGCCA@?{B0@nrBBmBBJBBpBBF~?S`rBBA@?B"mAvACLGACX@C6ABd?BCA@?:oBn(AjfkBB_BB˅BBp/ABdr?6djBBA@?A٣]AXf@ Cc@ C?3Bh@3BR#=ľh@ CA@?˪3Bp^zABC'BCp=@CPBBgfy?/BCA@?+Bx"@BC]CCBC\AB?|BCA@? 6HB|ݔAABNAB9BBм@B0e?dABA@?7XA:SA˞)BB!BB\&ACGBCLA?5)BB@?@?/̇CVh@CJtCxCCHCC0BCZ{? |CiC@?@?CVM @ B.``Cr B-C-C-CyQB-C0\?ܣB'C@?@?iscC/@ECyCl[CK~C&aCK~CuL@K~C=z?^ eC3~C@?@?/6LC%@E[CזCQ=CMCnOCMCZAMCmx?DC|9CA?@?C@gKCN5dBCMNB|CLNBACNB|? C_SBA?@?=Ce@CBCBCB?Bo}?[CB A?@?6CԳU@CPCʹoCCp4CC[BC$ y?wCC0A?@?bC&@ݔCl$BMFC(B*}C(BEBJ$CL|?3͔C$B@A?@?`C?<@MJC!C-hCCOCC]A5Cz?ZCCPA?@?ezC4@;!CGq6CI.C7CJ C7CJ C7C,y?q,C7C`A?@?CK@"CXCTCjCCjC*3CjCK ~?{CdשCpA?@?ՉB@RB9BKBD8Bu)BD8B A7bC]-?:VB5BA?@?YCb@C[CCw[C~ܟCw[C膽AֹB~?ڱC~[CA?@?BXp{@'BBbBBCBmDBB[s?BBA?@?2B>@|'BTBmpBrTB{BpTB6BSA,$`BR+yCQPBX+yC|BX+yC eAVBe?j_BCyC@@@?LC @CqCHC6 CDC6 C_Â@ICLvx?4SC C@@@?ܳB@ 1CكLB^B(yB{B(yB@)yBg?¸BǪB@@@?CN@>CqLB5C@LB2C?LB%&B:LBB}?CCKB@@@?N1CN@CiB+CGB`6CGBlCGB}?ՃC!BA@@?B@BBzaCCعvCABعvC.!BsBjn?ɇBQsCA@@?tC7ц@ŢC>A)CӬxAɌaC׬xAڌB͊CCr{?kqC(jA A@@?C,@C GCoC5IC)C5ICs"C5IC |?TXCfHC0A@@?0B |?Cx}C@@@@?&B@h(CNB*NC.9Bi\B,9BEB bbCg?CF%B@@@@?uCf|@CDB}Cp~@wB9aCBC|BCF2BPCZ?WBCPA@@@?WC@C6LCgCKCKDKC9 CKC~?iCۍKC`A@@@?[]B\@; C{C*Cj_ChBj_C!B}Bbo?.UCCCpA@@@?kύBUz@B/+CB9bCޯA9bCBC_?HB6CA@@@?CP@`B1CCB 1CH2C 1CFkaB 1Cv?BCA@@@?7C9]@5CAv1CiA7ChAA@dA|?1CXAA@@@?i]B[@B@Ck9BCX%AC`~BudCb?7B]CA@@@?-B@aBC4BOC^67BOC3BCbl?|jB/CA@@@?~Cx@BCzBCKCCBCut?:?BҀCA@@@?tfOBA-oB[A qBM_AZ5AM_ATBAC)Y?VoB%ddAA@@@?ҧBz}@Bڴ]CT Bش]CaCش]C~Bش]Cx?B]CA@@@?SA$@ASs@BWmCR8BWmC/@&^eBLVB(^eB$?E@B mCA@@@?״Ax&AÆ BB%ABRK[@zCBG BzC[?{ BB?@@?C ACTB CCBJCCBBCB|?ЗCB@@@? C]@CĜ}CCCaCC\BC|? C8C@@@@?Cl@C>FCaCXCZCXCnlBXC{|?AECwZC@@@?:BC0I@C`݄BB%Ct_BORCt_BZ34Bs_Bav?W&C.YB@@@?NC߆@=C@qXC>XjHC>F"C_4C>}?0%CNC_>@@@?p[KCC@xpC֠CAC'CHIC'CcA'CMx?DIC,C@@@?iiC8 q@COCPC{XCTEC{XCG{B8Bk\{?sCUVCA@@?n}C/4@L}CABiC*XBaC*XB4B CQz?WDCQBA@@?G%C@D}CKCCCVCCBC0}?CC C A@@?[DC|i'@bMC~BCBhebCBBBܝu?,CwB0A@@?CT@#C;@uCAJ@"C@J@[.AT 9C~?DCZx@@A@@?bnBz@dBd٦CjB?C/sJB?CIB~xC߼T?uXBvCPA@@sFCC@7Cy>@o7CD.@gBE.@ױBs:Cw?9C>M@`A@@?0RC9w@W CMZCQ|CQZC5!CQZC7BGEB{?fC[CpA@@?oCw@= qCQAC rkCACnCAC`@AC}?=nC=CA@@?`J9CLmG@<CiC ChCc]ChCb¢BhC^y?CCA@@?KBX5s@BCUBC`BCPHACDx?xBCA@@?BК@0&B7JlCH-yBkC>BkC4FBkC}h?eWBiCA@@?SB<@BB}BBʏBB?"BCw?B|BA@@TwB&p@UbBJCWbBJC9BJC i!AE%C U?2eBCA@@$!Ctg@D"CaȨAV$"C A9CAN@HC|?yp!CAA@@?JB !(A?B/CB/C,B/CA/CVB?OBA~/CA@@?F$C@HeBPYCBMYCZCMYC2'$BLYCCz?(BՐYCA@@?%B^DABW?CBX?C|A5AcB5Awl?>Bb?C?@@'C=A/C0@ vCC(PCCYBCv{?LCC@@@<ñBLL@m>CViCdBlC7͐BlC^sAlCy:?GBmC@@@@?JCsN)@:C{)C\,CTCہ[CTCT Bn? A@@?sBv5@BIBCBئBBH>B~C.r?i CKB0A@@?B_@[OcBH@+Bj{?JfBj{?Bh{?"?"Bi@@A@@?oCaI@>C89tCQCpsCHU=CpsCBBaBɉ{?n1CsCPA@@?<`C];@&CދCC1֋C *1C1֋C,XBXBI|?߆C`C`A@@?ACJ|@h`5CC0CCHCC8ACx?:p=CCpA@@?ژB}@ZBCBC3>ACSBC2n?̰BqCA@@? B$@B2B1B72BB72BZ@22B3i?לBBA@@?_B;w@NuBCLB\CWB\C A\CDu?sBd CA@@?Bjm@ByBgBcSBBcSBh @ԍCNZq?B+BA@@?B|@BUCbBsUCIBsUCr@uUCXx?qBCA@@?B\@S]CeC CeCBeC (B2CmQw?ޘC {CA@@?Lb%BOX;A9 B$CKBFC㦈?ڍ2CnBڍ2CO?GBICA@@?fCEۊ@9 B^B÷&AhB@Bk@=Ah@btUB=:Cm?B@A@@QA"UCA;AѹBAѹB#\ AѹBJAGtC?fA-̹B?@@?C_@~C CN?CCW@BC\BoBku?H~NCC@@@?W<C:@VCM~SC 5ClCBlCBB%bB/u?f;CZNoC@@@@?fC ^@TPCSC _3CCdžCC`BC$y?>ChC@@@?WC,@{(DzCC`C`D`C A`C~?ٟD?%C@@@?$9DAdWDȖCp4DPC >DPC[BPCv?=D&C@@@?~sC2v@ C̍CGCvC`CvC4BvC)z?52CC˭C@@@?y~jD%Aor_DNcC^D hC\uD hC3B!hCy?XaD fgCA@@?CkB@Ck_CCjC}bCjCBjC}?CfCA@@?[xC21@VC_?ȦCe?Ce?C1C4CK|?TC7? A@@?1C-@ CǦ CiCCQCCCH=BCw?;C9C0A@@?qsCc@]CJmC3VCmC-CmC*;BmC+Qy?!VC)mC@A@@?}Br@bBCW[BSC;BSC}ACo{d?:lB&CPA@@?cBP@y.BB)B-BF}B-BᝦA-BS5?f:B4B`A@@?ȏ'Cя\@(C^)Cا#CB)C CB)C5@ͮCw?+C,*CpA@@?ZLB @B{+CEBi+C2ABCB=oa?>BCA@@?@JBVAB8CB8C[Aa@^Ba@O?BBj8CA@@?ӤB-@}4B&C.BŶ&CBŶ&CW BŶ&C__? +8Bt%CA@@GA`'A!B%NC$BQMCǍA/@B͌A>\"B4LCA@@?|B@sBBCqBKCL-AKCWC}BB}BRy?BBA@@?(B5@ABCBC{@CBXdCh?BCA@@?rBR@ݺBMpCXBTpCBTpC@TpC{?ZBL qC?@@FCȍ?ZC CC~CokC~CឯB~CPtv?uCd+C@@@?C%AGCۂCFCzCCzC' BzC|?C.zC@@@@?oB?o\jB;oCBwB&]?!BCyB@@@?mjC @CoBP CS;BCT;Be )AuCu}?CB@@@?)GlCA@UhC!XC3CB\C$CA\CCI Bx?JCeZCA@@?5CEV@̮C{BC BC BK2@pB.}?ѮC_BA@@?Bq@SB#CB!CHA!CpBCsa?Btt"C A@@?C3Q@CCCC"tCCC$'$C}?_#CIC0A@@?P]B_T@ C,CoCߜCqBߜCBDCxm?^CXC@A@@?2CC@.8C&bC~4CDbCiBDbCqWB 8Bʹx?s4CԿ`CPA@@??C@e[@Pd_C&QCVC'QC C'QCռYB:Aadz?Q_CGQC`A@@?2C'K@[HUCؿAkPCApeBAe5BҕLCz?\SC]ApA@@?CEK@B?AjBcA+CeA\VBcAp?UBAA@@?B @BH`CbUB[H`C*nB[H`C c@aH`Ctu?B*qaCA@@?5XKCc@j58CwCj0C$yC `C$yC@B%yCj|?7CʼnCA@@?0Z/CoJ@?)C9C.#CG9C6CG9CAG9Cz|?5)C:CA@@?HvCLD@3CyCp1CyCCyCfCyC>}?3CuCA@@57AAiAQC AŋCAB\ABU R>"AvCA@@B*c@B 0CB0CwC0CZB0CRx?B06CA@@{AT7A@BcCBxBcCAT?B[BS?BQ(-?B5dCA@@?ØoB ABsCBrCGArCǣBBw?B`C@A@zCQ@ bCYC3CםdC=8CvCi0CCi0CVB4C~?Y;C2C@A@?=DUξ@LCʂCSCzC%TDzCBzCD~?CbC@A@tCQ@QTC(VBfC"VBC"VBotSC"VBy?7jcCTVB@A@C' @CCdlC'CeC'CBLZ%C}?CCAA@?ۃ-C6@= C߲aC/CB^C/5CB^CSAB^Cu?.6C_CAA@?ACSd@`CCR C크C*CCZCCu?C1C0AA@?C1–@YCCCCxCCmsAa/C}?C; C@AA@?B{@tBrf@Ba3@?Be3@B9Cm?B2@PAA@?֞IBxBj|?{`ICBpAA@?rC@~ACȇnCC‡nC :YC‡nCL;BjB ~?CqnCAA@?OCF@)NCLCvICLC!QCLC=ALCg}?PCkLCAA@?lBak@CCq^BC@J4CBe5CB4lCB`t]BB|?4CBAA@?EB4b@B?C B>Cx|B>C'(BpCzu?'B>CAA@?KBN@,dBkC3dcBkCZpBkC@BkC85q?cBVVCAA@?BU@4BfCBfCf4(BfCKBRKBOo?uBgCAA@?8@B p+ABbC{yBbCԖAbCB|R8B`k?=)BbC?A@?D93A6*C$'C/wCCtDCBC~?CC@A@?:!C/%@݇B24C~ C8C?C8Cn2A8Czn?B*7C@@A@?>CP.@CYBC-B C-BR;Aq C{??CnjB@A@?!D@@-DO4BG~D/B$D/B!A/B~?)#D@1B@A@?oϯCj@NxCC C~CC~CP-C~C{?C C@A@? D(#@K^C BsCBDBjBBӬ~?CVB@A@?D @D _Cm^ D`Z\C}0D`Z\CzC`Z\CI@? cD"[]CAA@?|C ,@-s*C08bBCܝRB#BڝRBf}BxhC҈t?:CXBAA@?\5Cv@CeCgCCCC .?CA|?CC AA@?BC@HBLqC糘B\/uCGC\/uCۍB\/uCRed?+BuC0AA@?{ Bv ACBCxBycB6ZCKC6ZC|K?CB@AA@?AAǍBQhC}B@CWOBfB(BfB<3>qBCPAA@?]bB@>B@>c@@>^Pw?@BCAA@?%zB@ zBOCzB;OCNCB;OCE\AՉAd?zB(OCAA@?:B%AAٛBABABGABM ?fİA@ыBAA@?xBAUBGCSLBGCO}BGCgBAGC`k?VB@GCAA@?+B͚KANnBrCUBgCAgC#A4ϣCc? oBvC? A@?1hBnV@$'BB2B77AeA}s?C6B}s?C ?>bBGۙA@ A@?fD AeDcCcDʙaC%DʙaC?aC~?>D*4bC@@ A@?Bb#B3P@ϑB2BnWBP{BArCaBrC >vdB"B@ A@?#C[@]CUkBCx cBCy cBBlCe|?C5gB@ A@?Ce@GCݳ[CC]UC>zC]UCp&CUtBu}?@C XC@ A@?DDf@2C"CCTCCDCNCC~?wCYC@ A@?~?LCC@0A@?uXBW @gC?CC^CqB^CsfB C7ip?"CS$C@0A@?C$@[C^lCY<~?CZlCA0A@?BkVAAR}BBCAPB,A:hCDB9hCv^>z"ARBA0A@?hLC]@!B-sC}jBCrCQCCrCb8CCrCVv?B?oC A0A@?IC @$C CC C &C CccC=ۮ C}?OCb C0A0A@?B1E@,4BݭCXuBgC2BgClR@$(Ctq?BYC@A0A@?@lBa@3B}ZBB{ZB B{ZB'AjCMt?hBUBPA0A@?BBH@sCA-C]AB\AôMBHC`x?bCzA`A0A@?B@FdB6AX_BA)CA+MBAo?~ mBApA0A@?s8C8@o)BgCB`CĦC`CC`Cx?B]CA0A@?5Ca `@@CdCx 9CdCT-CdC=5A C|?eBCeCA0A@?*;Chb@ּ CQ^Cr CY^Cx#CX^C3AW^CYz?|e CzCA0A@?DZB@BqCףBqC_qAqC[;BWwBif?TBaqCA0A@?w+ChX@6C~Co7CyC*ByCbBJB|?K7CXuCA0A@?wsBE܎@B,NASB-,NAB/,NAkAH,NAJx?~*BiLAA0A@?(3Bo%A 3Bl-BU+Bs-BAs-B=A] CS?Kb4BGBA0A@?6AiA0B\'QC+BW'QC<`A:AMSB:A#?^1BzQC@A@?C:AbCg9-6}C)5C)50B)5?3CL 6?@A@?=B$^@}B|ɩCBC: ]BC`A%CDV?IBܫC@@A@?-;B* @BXCBX܃CxSA[qBB\qB4I?NBjC@@@A@?CK@CwCRBzC%;7CzC#BzC6r?gB#XC@@A@?C ?@C BVCyBCzBEtABtb}?C+6B@@A@?6BM@sBĥC=7B֝CAA;'CB;'CЅ>pUKBMC@@A@?|)B5@;/TBCtBAАAbkXaoB@@@A@?pD*B@D)#CuDg#CMDg#Cn@g#C7?Dd#CA@A@?3WB[@]BrtC̛BچsCN]@܆sCvBc~B{I?T'BoCA@A@?JB4cM@YBMICqBܟICBܟIC BAÎg?B|HC A@A@?Bi@BڦBRBB|yBBABŜ!?KzB?B0A@A@?u~C`z@ݫvCBqC܌BGXC܌BBAڌBh}??#yCiB@A@A@?hPC$F@>:CdCo5C dCdC dCۙ@DC,CZ=C-Cx 8C-C#H@ B&|?ECJCpA@A@?oBaZH@fB4BBB2CBAK[BBs?B BA@A@?kA@SB'CFMB?'CWBɭCBɭCW>RBT(CA@A@?\Bu@BruCm8BguCVBguCBC#v?QBJCA@A@?mB^@VWBeTCWB:TC  C:TCVB:TCl?AWBPTCA@A@? Cv@ѵB ~BB~B\&C~BmB~B.y?B`ǯBA@A@?OB@BlYCBrYC7BsYCiMAB]w?ѬBYCA@A@?3B9@(BLxC2߆BLxC[DBLxCRJ>LxC v?#BoxCA@A@?BAo8ALA;4CA;4CA:A;4CP>Ao>#?3A94CPA@?BBXN@RBCB]qCCBAC[qTCC?ACB?PA@?IC)(A CCCCգC)YCգCשA5CY~?^hCcIC@PA@?a-CZh@!ACB?6OCAףBAȠBOCv? HC}A@@PA@?CCy@CZ4A,C]A7KC[A AJAwv?`%Ct.A@PA@?RnCܵ@^CKC;8CCѮCCvsAAtCp~? CC@PA@O#B@`B]BFIBCBBCBzACBpgm? BTޫB@PA@?:JC@[CٽB VCߌBRCߌB3ŸBߌBa|?VC{-B@PA@?aCd@tC3bCzC-bCAC-bC·dB:Bb|?$CaCAPA@ABr04@/C>tC (CkCNzBkCBC*s?.C=]CAPA@?߿iCҿd@GCSBFBChPBChPB&BhPB{?k?FClB APA@?/nB弜@sA=9CHNA9CA9C(A9C#>:A^JC0APA@?SwBi@BCE{BC=BC\B CTo?BwiC@APA@?pƭBR@BȆCbEB䆓CDB䆓C]/A䆓C o?$BTCPAPA@?@BAA>CzA >C:w? >CAP+A> FAf@C`APA@?.B4ABmCYBL^nCTx'??yiB;<B0yiBx>BnCpAPA@?nC/:r@zCICCICFCICrBIC~?CVCAPA@?-gB@pB+CдB +CRA +CwBV Cce?B1CAPA@?tA!AAsQB(AY&RBA@hCBhCI>AIUBAPA@?B@$BZ2CĦB}2C(B}2C @Bu?B2CAPA@?pA%ABC2BCDXAbBURBbB?B1CAPA@?AxA9 B\:C"BJ:C@(B7"B(Bq? BCAPA@?6 Bc:AATmCA`mChA`mCɛ@zB"?AC?`A@?fCS@C.CBCCW*CCCr+BCCt?ABrQC@`A@CCx@qXC|GCrVCYGCNCYGC,+DCYGC|?WCdHC@@`A@?fC}@Y1CBסC@%B{C?%BBwC5I}?ߏC&5B@`A@?}$CY0@pC9COCL9CzCL9CAL9C'}?C|9C@`A@?ɀC@sCADkCA7CAGBAÏ|?woCaxA@`A@?ACEY@lBC7 BسC2 CسCHCسCOjt?B C@`A@?B$@W:B_> 8BXvC=BXvC7BXvCL?IB˱CA`A@??C@C'CCVCCUC*BUCO? C= CA`A@?6ECj@+CVi^C@&CHi^Cj\CHi^CA9VBIi^Cz?d-C3^C A`A@UBC1@jn CWtC CFXtCBFXtCRPBBpyw? CuC0A`A@ C;!8@My)CC%CCBCmB.CW{?+CC@A`A@?.Bo@BmBA B3nB,B3nB.$@3nBVt?]BHBPA`A@?ܧBsc@Aq&B*AA&BkBA&BQgBA&B?ÓA&B`A`A@?B_@̊B3BBABFBAB"KBmCt?1BBpA`A@?}nC@wCЃ CdptCԃ C eCԃ CrmAAC}?wC` CA`A@VC4r@^CzÇCzC BzCvB C{?2CCA`A@?*@B#S@.BZBBqBbDAz܅CvBz܅Ch?%B}BA`A@?CB@?B`"CB`"CB`"ClA1[Cry?B^"CA`A@?xABFԣ@BtC9BtCBtC$A*$Bx?B>tCA`A@?ȸB,@mBABA`BA|{BaQCr{?!BzAA`A@?sB+{ AB^BH {BxBByBA~Bv?BeBpA@?:yC(@2CBBCB$SCBWBC?)kCB?pA@?bEBE?ٯBMC"BKMCBKMCPBXA{W?VBϜJC@pA@?okC^@0gC?jB_C0B1pC1BA4B{?1"iC(B@@pA@?uB:@uBC)iBCTCCBC]DX?FGlB4C@pA@?Cv@CaCC5C[C5CB5CM~?)CC@pA@?m C/@.C_OA(CmWABmWAT BvAC8w?/C?pA@pA@?պBB@ԣB72CΠB22CB22C--A22C\3k?MB'91C@pA@?d&kC@`aICcCrDCKcCߩCKcCBKcCr|?JC$dCApA@?CL"@aCn?C|CI?CcBI?CB#B(w?qQCCApA@?B*@AݍCACayBC!BC=!?>1AڛC ApA@?_ C.?@'FBQC5BCyCCACty?)BC0ApA@?(&C!@@ C%C;C C%B CQAzBx? CC@ApA@?0bC@YC{"CNC"CwqC"CqB"CZ|?DYCS"CPApA@?S {BW@ 1BbC,B bCӂB bCA bC+]?*4BƝC`ApA@?bhC@^@CZmCb@>CZmCgCZmCBZmCQ}?K@CcmCpApA@?BC^C@|%CƏC'CC*BCKB?Bx{?+%C7CApA@?,Bs@BB!DBB ؏BBkBB2*Q?MDB]BApA@?RA/A|AHC9AHCwBE>#B{ēAk#B2>'A~CApA@?VBT@,w^BCUB|CZB|CACW?!^B}ߝCApA@?(WC<w@xOC7CDC9C`iC9CWB8C?OCCApA@?_4AAA!OBPAOBb?OB8tAgCV>ANB@A@?[fBc@9B$DCB'CB'C֜(AOCHXk?SBC@@A@nOC@?39CC 6CCjbCC)1BC|??CC@A@? Cܱv@(C`BeT%C)BiB)B8~jB@Ck,y?O,C4B@A@?ֿCzW@C2RCEC RCߠC RCBB RC}?.CQC@A@?Bt4@DgBC8B»C%BûCòAûC%n?oBN¦C@A@FboCb@SYiC?kBRcC^kBIvC^kBǖAakB9}?MjCBAA@?B[ w@ǿpB(Q>kBkQ>sBkQ>?`kQ>b?]5uBCAA@?>NfB-Ն@BR(CB0(CA}A0(C?U}BaP0Cg?JBC AA@?HwOC!@5CIA-CzA"kCxA uBvAW|?. 6C+{A0AA@?B.Z@cB BB; B1&B9 BBVCsr?B) B@AA@?GCD6@BgA0(BgAx5CgAɘBgA.z?`B([APAA@?DBg@NB2BKBBNBBAB[?*JBB`AA@?%Bv0F@gBʘCB ʘCFB ʘC)AʘCRx?BfCpAA@?&UB,q@Z;BL`C9B\`C +B\`C'A[`Cx]4?E!B7`CAA@?vBxX@BpBBpBBBpBApBBUV?1BtBAA@B{n ABe.AHBe.AݥAZ>CBZ>C5J?xBD-AAA@?Bп@ENBpWCXEBmWCBmWC#{JBmWCq?MBVMCAA@? BZ@U^BdBDBmB[BmBG BmB"p?^^B1BA@?Cۇ@Db.CC(CCfBC((BB?_3CC?A@?#fC:@iCCuaCC>dCC#@C|?0hCVΘC@A@?TC@CBC gCXCCXCAZC}?ƑCؐC@@A@?sBb2@AEBeABFUBBAB)Z?^?A0ʷB@A@?GB7@QB ABVAGƈBWA B=C_q?`B:3A@A@?.B\@C$BAC0BCzRCCCACxw?8BC@A@?CtO@s?CbCO;CbC~BbCKoBB1Cn|?r?C`C@A@?wBV@buBDBmBB%BByAfC? e?[B4BAA@?qBu9@ђBFuCBuC CuCqpBuCAp?YBsCAA@?BA$>@Bn8BBjBBjBAjBs?BB AA@?=AQ#AABCB0AA@?CBQ@B?C4B?CGB?C@X1AESx?>B?C@AA@?5CnC@ֺCCCCsBCOBh`C*y?kCaCPAA@?޳B];w@|Bp1fC-BW1fCBW1fCNkfAW1fC@p?٘BeC`AA@?Z]BBj@v|B2:C;B-:C3@%@eB%@Bm?B:CpAA@?,(B AzA?Ac?&Af?{{@5C$Y'?A@AA@?tB@jB$AԘcB$AW, C$AEB$A`co?jBYAAA@?uB'K@ bBNƒC$XBJƒC6dlBJƒCH@JƒC l?bB.CAA@?NB~'AC'B}CB}C$A}C&%Ae BP?t'B%}CA@?8rB@eB*6jB)6B)6@)6D?B6?A@?CF@+C>pC'C!pCdC"pCA~rB|{?U,C.@pC@A@?@bC޿@PzCIC uCJCaLCJC1"B(B~?yCC@@A@?A.A$BaCL BaC;8A6B[=B6BL>BaC@A@?CCd@YCe>ǎCx>tqCx>j0B_&4C ~?C_>@A@?FB x@QBMzC KB`zCjA`zCACJ?TB¤C@A@?q%Cb@YCdCBdCFCdC3,BdCuy?pBcC@A@?wBŤ+@BB>CQwB.C߸B.CF,AIB˜r?JBCAA@?]Cφ@CUpC}CbpC?ϤCbpC BbpC$b~?[CqCAA@?B}-@EBB!?BB CBPBBAl?6DBB AA@?}AIA,%A ]C+A\C@ѹ,ChBѹ,C>vAA%ԯC0AA@?~BT@oQB[:CQB[:C5B[:CL^A[:Co?]Ba:C@AA@?%qB!Ə@3BktB>BtBAtBqOB01qCk?;BWptBPAA@?+B>@CKCCäCqBäC9ACy?RyCĤC`AA@?9Bp@ B/`BB1`BsB1`B[AsA CDv?BkBpAA@?KB]M@:BABQAuCRA BRA ku?ǡBAAA@?Bc@+B)>Be>#MBd>On@c4Cw?BS>AA@yB@QB$,C&_B",CҢB",C3A",C$w?lB,CAA@?Br=AuI4BNmCqx%BNmCANmC ZA7IdB?a? 4BmC?A@?B5I@QBsB BABoBAB A@Bn?BaB@A@?7By@vBbtB_8BtBt CtBaWBtB s?BR8ADB#t?άBFeC`AA@?tB2@(B5XCB5XC'TB5XCO,Am C\re?LB6ZCpAA@??Bف@B(9CpB(9CB(9C57A@+z?B.9CAA@?n Bnɑ@@BJ6C}BJ6C4BJ6C1]AJ6Cry?B=I6CAA@?51BM@\BP\#CUAH\#CBG\#CR|BG\#C.m?B>#CA@?9oBAF}B4CxB4CP?@4C.\BZ7Oe?cB4C?A@?CX@!BQCBaSC92CaSC"BaSCMv?B[C@A@?31C@+CiB CɲBkECɲB1BɲBq|?C B@@A@?BA>B&pC݅B&pCv@pBBBpB/U?[B pC@A@?(Clr@k$Ce. CC{. C27Cz. C Bz. C"-|?C C@A@?DB1@d>BC9BCYNAC\pBbm'Ci_? BC@A@?CZ@/LCAEICґA+uBӑA_)B;KC|?yLC&ѽA@A@? C8(D@uBYBA6]BAA{CAA}c7BAAVPw?BAAA@?91C'@w)@C_CAC_CvC_CwB|B|?@CsCAA@?Bl@{BZB4:BBB BBCv?4BB AA@?ݤBG@ $BpWC@BAЈCPAA@?DBeAXA4A5A4AE@4A`AFIC)>AMѪA`AA@?WlBм@BCŋBCh+BCEA_Bs?[BLCpAA@?tSBd"@߮B{C}B{CC/B{CBBu?BCA@?A0EAyACAC?BaAB> AC?A@?{C@ŀ!C>"C" CK"CCK"Cp5A%CC{? !Ct"C@A@?Bӣ@9"AC+@AC @C3oAB]>\A C@@A@?tCA/njCC%jCCoxCC4fAC$}?3SkCuC@A@?B+A'B2C'B2Cʨ@{^CEB{^C2i?'B2C@A@?Bj@B4B!BLBBMBMANBGfq?*ݞBYB@A@)-Ae~7AA9_CA6 _C@4,BB4,B=!>A~_C@A@? tB/!Q@%-BįCթBЯC4BЯC@IAB3+CR!v?;Bw֯CAA@?ˬBC@XfB˂CմBJ΂C SBJ΂C;A&9Bs?BςCAA@?IiB@BrCՏBrC BrC}BSCM4j?OBvnC AA@?(zA|A@AclBAclB?oCAoCH>AlB0AA@?SC3@CK CBQ C4CR CI@V Cyy? C C@AA@??Bo\@B:kBBo:kBԃCo:kB':Bm:kB?z?kBBKă@))B}Ń@bA|Ń@EA-8CW?h>B@A@?eBAdAd7B7}B7jA7|T?7B7?A@>(CqS@ CĀB~ CBgg=CB>BB{?4 CB@A@?,%C@|CB+C@BXZ=C@BXB@B_{{?uCAwB@@A@?-B H@9BBUBѓBqݲBғBdPBғBV?BB@A@?&uB/@jBCBCAC5{ZB#Bdi?BC@A@?BΤH@r:B)9B8Bw9BϱB w9BA]bCx?=B9q9B@A@AAڑA A*OABA@)PC͸A)PC?>AA@A@?L BHx@BCBCYBCA"CCx?B9CAA@?S >B`|@ܴBxC᭲B|C?jCMBjCl?rBbǦCAA@?.zxBMr@B({CEљB({C]B({CD"B QB[i?BF0{C AA@Bie@NBYCaBYC-BYC ?YC s?&ZB TC0AA@? C Q@zB%BB%BvC%B B%B&'}?B4B@AA@?B @?BPB}BiPBBjPB BjPB$.{?HB$OBPAA@dkB@=MB AjBu ALEBu A@A؜B\ B@@A@?LJBW@XBiCBiCBiCHAiCw?BhC@A@?3DB@ARCOAۿRC&AۿRCyAۿRC7>ATC@A@?"8 C6@YCByCBBB4B-ƒC|? QCB@A@?C=@+Cc4BYCb4BBb4B?BAaCNz?hC4B@A@?B@[ BB2OBB)SBBA5Cho?BbBAA@?fA"@,AՇNC,ANCE=@=AԻA=AB> ANCAA@?C/@@ C[NCC[NC2 C[NCQ@[NC}? CPC AA@?B@A=jACRACOACämAC?3lAӄC0AA@?B< l@#gBqB[ڤBqB~BqBmAqBz?qBqB?A@?9BJ$W@gB@zC/ןB@zCcB@zC|@@zC@Xq?XȦB9zC@A@?ZuNB@/A fCAfCn)BfCAfC&?A7*gC@@A@? B?9@FC+gCC+gCL^B+gC%BtNB y?2CvgC@A@%oB=@BvZC篖BmZCBmZCBB:Kn?ȜBcZC@A@?4AAA8BJA8BD@*ΊC[A*ΊC >AB@A@?ڊ4B׀@BBCBCAC+BG^Bo?BC@A@zBh@bBCBCŒBC:RAr>B?{?4BCAA@?+VBmā@ tkB]>ACOBx>A>Bz>A 4@G?Cm? lB>AAA@?:ZUBu @ݮbBvCLBvCEBvC?|Cq?lbBQCA@?֏3AMN@ҊAC>ACdAC?A@?B[@VBBSB4B~BѲB}B0B|Bs?HBB]B@@A@? Bt@CBBBB CBEBBd{?)BB@A@?.B{$Aտ,BHWRBBYWRB{BWWRBn@ڕhCZ?#,BRB@A@?! BN3AӗB>C,B>C@>C}B}CXl?B^ED4C]QD4C]#D4C7C 7?LD4C0AA?E C;@9 D3C }D3CrC3CۏCC?p~D3C@AA?HCf@IC%CCkCCn@4C?CCPAA?C@ ʦCْ.6OC]\%6JLlC]\%6dB4C?FC $6`AAXCՠ@~B7$6BN$6!1CN$6IfBP$6?Ba6pAAnB'?AJ7B4C[B4C+@4C/B!c7Ju?bB4CAA? nDC@NC`hU6HCShU6?CRhU6A4C?NC8U6AA?ʵKCڈ@C4CT C4C ŅC4CQB4C?? C4CAA?'BOdAB4CڤB4Ci@$7B$7l?XƯB4CAA?BA}4Cq>4C=p7?n7P;0d?4CAA?MB@B|x5EBFx5BFx5pEA4C?\B҉w5AA?kAdA^A4CΰA4ChmAa%73Bb%7dT> A4CAA?iBhAEA]6ACdBC3BC 3?ACAABy!ABR5mBR5BR5!?R5?Bv5@?A?C@C'CC޲C\C޲CSBnYC|?WYCM C@?A?_[B͈@4BȚB}pmBR,CeBR,CAR,C\@?B 1C@?A) B#@-B,sAB AaWPBʠBaWPBJMBaWPBζ ?JA1?pB@?A?@#~C=CnB+9zCbB{3zCsGC{3zCB{3zCmp?pB8=yCpA?A?B壥@BCBZCMA[CeB-C_h?*BCA?A?+B}@TBWBE]B@YBnC@YBB@YBen? BBA?A?HC]@ B`PCBdPC.CdPC"CdPCf9{?B-PCA?A?!;AW$)A*AXC8A XCF@`BIA`Bt>w6A)CA?A?<CL@BC BxCJCxC%MBxC=y?HBW˲CA?A?yEBAϊA^@pAZ@AZ@,d@Z@k>pAIf@A?A?AA@6A,:BBE;BB̼@cCFRBcCE$?9BBA?A?xGC ]@cBCH-CZBCF-C}ICF-C=@F-C}?{BC`#CA?A? B6@jB}VCăaB}VCmB}VC[A}VCVd?&kBm^VCA?A?A#A1A ʋCj!AʋC;?ʋCA(B}>]/AQmC@@@A?6B,@sCcCzC/C8B/CTB_CMg?CxC@@A?ơB'@ C2 CBCIBCA2C vG?B1ϰC@@A?jCݵ@ACrAݏC%VA/uC%VA&B^bAC@|?zCKA@@A?%&D@RFD텱Cy(D~C"D~C mA,1C]?.D⬲C@@A?feCDQ@D CPConCNCSCNC@A̗B#z?'zCCCA@A?]NDKAkBDSCdNDXCֻMDXCF@BC ?MDCA@A)WC&@ GCJCcCACBACc B?B _j?C7C A@A?МBsr@BBڳBeBBgBBC4?pfBceB0A@A?nCV@VCnCZC*mC{C*mCmAgB}?jCQNnC@A@A?'DCu@&OyC>CCNCBNC)CCy?zC9CPA@A?$dBI@ɀB.HC^BKCR=sCqBCCM?PeB9C`A@AoC$@9%C C_ CWC CWC0rAZݿB2w?4(CCpA@A?A*A&AA?CA@A??C"5X@jC iCCHiC4dCHiC&BGiCy?CѧjCA@A?B1m@,BxCBkxCCjxC8AjxCv?ByCA@A?o!CYpQ@ǧBQBwBމB@CCމB3 BBYy?uBB@@@A?C"iA CPMCŷCC(CGICC(C3CC(C%}?KC:%C@@@@A?K8C@R@qHC"C8>C~'C&$C~'CAwC;Kw?ȈMCb<)C@@@A?gB@%TB+C7pBEECcBEEC*BEECI?׻rBrWIC@@@A?yCަ@nCB- oC8BϱC8BB8B|?A|C B@@@A?igC$"@<`C[CؔUC׼CoC׼CsA׼Cbz?^CŊC@@@A?CB&@BF5CB]PCB]PCBQ@_PC'dk?BnKCA@@A?@C@,q1Ci`CA,C cCB cCGB 7D2OCG,D2OC쏐BA?d3DDDOC A@@A4BAJ@ C\BBzBBzB (BrCc?&BaB0A@@A?CDh@TC{ CkEC CEC CPC C|?+GCbj C@A@@A?UGCD1@C)C]pC*C|C*CA*CG:~?ZCR*CPA@@A? >B0@BMC BߒC%BߒC B=~Bj?ZCC`A@@A?\Bb@#SB@o@ Ba@4Ba@ Bˆ7CxV?~Be$@pA@@A?}wBX@HCBCB 4BBBstCGq?| C\BA@@A?C@CjɦC!-zCZɦCNCZɦCBZɦC@}?܁CCA@@A?B@8BDCjBaCi{BaCkkB1C8v?$BlCA@@A?"B(@}BUCFBWC]BWC4B_B#o?rBU`CA@@A?ZCʥn@KB BSB B894C BaB Bu?vB6 BA@@A?Cp^@VQBCBCmMCCF-BCְv?B^̔CA@@A?MlCy@:CiPBCB5 CBZ@/|XCE {?CBA@@A?$B)@EBX-C5(BX-C*BX-C/@AX-C x?zBD-CA@@A?A?ADiA gC2AgCBu?gCLjALB>mA\fCA@@A?j#B%PAB~B,\A~BA~B@~Bu;?aB}B@@A۶C8@EW7CR`iCKC[zCGBZzCrCBt?+s]CS{C@@@A?C@LDžC%CnCzC}CzCxc-BzCPE{?!CB@@A?3C@u*DSCA'D@TCBC@TCYBBM~?g DFTC@@A?yBJ@#C/CJApB BpB5BpB?v B+B@@A?07DAK]DQB Y;DW0B%H2DW0BB`Cz?eCD3B@@A?C:@OYC"CT,C$ CZB$ C1BiCiq?N %CjCA@A?DN DR@!DBp#DKsB~qDKsB(BpC~?&%DxBA@A?~CxW@nCRCCICF?CCF?CBF?Cnw?Z;Ci@C A@A?x$Bk=@CCC8dpCbB8dpC7BؐqB m?[CBwC0A@A?OjCd^@3C7>AC"A9C"AtHBANCs*|?CKA@A@A?j2 C7@/B乂@K C@g]$C@A@q?C>@PA@A?B-Yd@(L?C=B$?=CB ABC,CQAv?@CfyB`A@A?pGB^jC?B|ZBfo?a"CGhC@@@A?Ah@"B6B8BoCKA7CWB7CJ>Bl(C@@A?W/B U@[C6%}C?B{CPA)BB)B(?ﭰBzC@@A?wB 0@p B *CyBDC$BDC[ADCI?pBzC@@A?kD@w D2BHfCLBDLBÅBLB|~?QD2B@@A?NC @C7pC6C+xCD+xC{C+xC}?CTbvCA@A?jDe@ DLA}DA,kDABœHC4~?DXAA@A?ļBH@C#,BhBXdB^rBXdB\rB,2uCT?-gBXB A@A?Cڒ@9TCguAݲCACAnAA6~?ℴCֿA0A@A?6CI@%CFכC4C;Ci+C;CA)wCv?8-C,ɚC@A@A?TBk|@PrBSBuBURBBURB%@URB5b?sBELRBPA@A?oC9o@iұBC̬BCAL,CA@AvBE@sBC<-BFCۈBFC|nAFC r?<B.CA@A?OA0AXABAB_?*>CėA*>CS>hABA@A?BrBA AŒpC@pC\?UmA$pCA@A?PB̪@ B(@J B(@B(@w@6C\x?DBu)@@@A?|LJC^@^ˎCB juCGBTCGB=,BCB:{?xCB@@@A?UDQ@SCA@B;COTBPDOTB COTB~?p0CUB@@A?Ck>@CPC'CNCCNC*CNC9~?CNC@@A?_CC>_CC>_CDz?;#~CbCA@A?LC[@/CuBΪC΢B'0C΢B*BТB0}?CBA@A?>C=@zCjfCxCkC^CkCBkCzu??g C:iC A@A?AsAM9BmBB[BĎAC VBC$L>u5BB0A@A?15Cb@4C{MA8CASO$CAzCHCs.CGC)B C|?րCC`A@A?" A$%AA5CA9C Af@}Bc@e_>MAOPCpA@A?_CЊk@@nB,A)B,AHB,A[zxB#HCz?ЩBAA@A?Bp@:B^CaBú^CɦBú^Cz?;Aú^Cx?uB^C@@A?tgCl/@&cC$B1]6C^3BBC^3BMB^3BXy?EC1B@@@A?}oAC@B߁BQ_LB4B7B=aCwB=aC/>qB_&JB@@A?OB <@'CB=BiBh»A4~C'.B4~CA?;BߣB@@A?o$Ckv"@C'DžCiC2C*B2C#ziCʤBq>x?CC@@A?O?B4@%Z@B.wCBԷOCWQAA3:BAzY>}AiC@@A?uCH@C MCC=*UCC=*UC߿/B?*UC{?ԠC;RCA@A?C[L@2CbCyCC0[CCC,40C|?ڶC|װCA@A?gClm@$ZC'fC+ZCC_C!CC_CzAC_C|?WrCaC A@A?m%CWE@gBBBA;CA`BAo?BA0A@A?PC7Me@DC^B+C%BhC%BNuB%BYWx? *C=%B@A@A?ӍCRu@cOCo`BLC,OBdC,OBJC+OBc|?/WC BPA@A?]B\@B}'CdBq'CttBq'ChEA۸CW?ڤBۛ&C`A@A?.A~AA BLABtAuC`0BuC b>nABpA@A?wNB4c@BMCBBaCOeCaCBaC/s?BdhCA@A?϶B4@"BǽZC3BZC BZCQiABu?sB"[CA@A?*Q B- A B ,CBY+Cp@X+CA¯CO?? B)CA@A?.5CZ;@:aC1bCYC1bC# C1bCBz8B}?_C9bCA@A?Bࠎ@jB-B6B)BB)BmA wCfq?0gBBA@A?ATCPg@|C`QC7CaQC8+CaQCBaQC75{?1C+cQCA@A?nA$ #A BRKQC B_KQCIAZAL=BZAT>) BҁQCA@A?DdBe @^BPC٣BBCGBBCyB"ǩC4rn?+B]CA@A?}@B6@RBeӬC.BeӬCrѯBeӬC.A˦%CK{?EB֬C?AA?C^@oC6Cw~CKCǟCKC/BKC0|?xCC@AA? CIW@NcMBcC[B.GMCrC.GMCYB.GMCnmj?XBPC@@AA?lC1mh@C|@[CvCM.MCLJCN.MCH@R.MC_}?ȂCHPC@AA?C@pCCC"C=>Cy'C=>C5B;>C~?C?C@AA?Cب@^CSґAƃCoAX2CoAt5BoAa|?oָC}A@AA?B72@CBdCʫBCyBCȻAw C.B?l߳BC@AA?DlBd8@CC\CC˟]C_A˟]CB'&Buc?Cr\CAAA?CZ@&C9C~C4CqcD4C0@C4C~?sC]6CAAA?CK~@JoC tC }C/As_C0AAA?c_C{@CmCa\C>mC+C>mCBfBs|?oC$fnC@AAA?%B>Ge@&C9C C|]CuB|]CWצBC2r?}C+CPAAA?iBRm@oB7CIBjCb CjC.BjCtn?7B{(C`AAA?aV*C_X@WC[B0QC[BB[BԼBۭ|CG{? lWC|BpAAA?{$EB@A˃CAC˃C AC˃Cx@C˃C?jAiCAAA?CnV@BBBBǤ,CBKvBBx?BBAAA?Bi@BABWB)BSA)B:BHJYC|n?pBBAAA?CyX@`CĢBCĢB CĢBFkAĢBz?SC%BAAA?.B}@%>Bi1B ?Bh1BJBh1B8Bh1B]?2BW};C@AAA?[#C$D@ C]yB7GCBP4CB&@BB^t? C7 BPAAA?tZCFh@gB9TC0B:TCGC:TCu2C6C>?:%@x? Cd6CAAA?埚B@ɥB4CB4C"AB4Cl;?)F?*l?B=5CAAA?YCɗ3@CC<ƄCAC:ƄCelC:ƄC-B;ƄCF1}?CC.CAAA?wCc@ CjB CjB{CjB@jBY{?z CӌBAAA?B핌@5B*BB(BB(BYyA(B9x?BO!BAAA?:!B7AlB_ CeBl C @k CMB6WCI?YlB CAAA?4yB:@LBEB+4BEBJ^BEB@EB:cy?"ߴBDBAAA?.BMJABhv Cf|Bmv C4Bmv C@lv C.Q?+=B_ C? AA? JCJ@DCpCiCmC3CmCӛBfBv?fsCnC@ AA?CAu"DReYBDbniBcCdniBwB[nC5~?)D!cB@@ AA?onB(!@po!CBBB~בBA~בB,B|CT?CCFB@ AA?xCf@CCqCPCbPCPC C̡,Cc|?3CvC@ AA?8Cs@ѽCCzjC.Cd\C.CnpCdB8}?l:CPōC@ AA?$3Br2@U%CρB w CQBqAQBECCr?CB@ AA?YbC27@19CPC^BCqWCwCqWCRBqWC"my?mbRB:C0A AA?_Cc@)CKCytCJC擸CJC*BJC|?+C4IC@A AA?[jA7@B:BByBB|CCC|C?PB?BPA AA?)~B)x@+B430CB30CA30CHBCX?2Bָ1C`A AA?fCai@.nCB|CiC/|C[aC/|Cp@>C}?nnC 5CpA AA?e2C?@/C@0CCZ0CNCZ0CvBZ0CW{?gC|0CA AA?fv1ClK@ɊXCd*A-MC(A6C(AsB>Cr|?RYC1&AA AA?]Bi0@pBBiBBc`BBv¨A1C{ ]?foBBA AA?&B@UBwBj|BXBfBXBHAC/%l?wBBA AA?PIBAR}BdKCtBKC/AKC 'BDAY?QBKCA AA?mB>Z@ .B\BΥB!\B/B!\B‚A!\B(v?/pBYBA AA?ѥB&@4"BrsoCɤBgsoCʯBgsoC˺JBgsoC+^? #B8HoCA AA?PB@_.hBCETBC қBCACݓr?hBC?0AA?})CO4@b6C BCחBKY?CחBuBחB-r?>CB@0AA?CgB@0AA?UCK!@6|5CjCok/CqeCƑCqeCf3BGB+x?.C4gC@0AA?sC@.D.IB^DkEBDCjEBB`eC~?DFB@0AA?C@@CҽmC$CƖoCNCƖoC BƖoC|?CnC@0AA?C+U@AC&CC(CC(C7B(C{?CU'CA0AA?pC擜@4CB*C(B}C(B|(AKC|?7džCcBA0AA?^@C@JC}BLFC~B 2C~BۥAqCz?MQCSB A0AA?BL@/BICR\BՎCBՎC-?WB>>o?B6C0A0AA?+Bno@_BBb7BBBBߙABo?UBDB@A0AA?QCF@u rC?ykCۿ?ik2Cٿ?9dB5C|?^pC~?PA0AA?7CW/@uC@OC(@)C&@B%@I~?cCR@`A0AA?u(CF@2CޒC.CޒC CޒCCAAezB^|?)2CђCpA0AA?=B؊@B C|wB@ CkTB@ C(A? Cd?Bt CA0AA?GzB@B[CInB[C{"B[C`xBBs?Bx[CA0AA?;3BBAACkACƳACK A!B?AuACA0AA?IAB`AfC@AA?1D6^AC3C,C3C D3C:B3C?jkC3C?@AA?5"C@TX@BCrCviMC~C?B~CmCmB4Ww?FC~C@@AA?{B,@BCqBcCFBcCViA2ƣCh?bBC@@@AA?ەB|SA@}CMCeBN C BN Cb-AC*Ok?y&B؛C@@AA?R/C`;_@'CՠC43CQCrCQCA2Crt?-CC@@AAhjB@΂BALCmBNUCD CNUC BNUCM?qBRC@@AA?d/Cu'@@5BA9BA}aCABAGr?mXBhA@@AA?BOH@9C5`C4C]/_Cp̯A^/_C1Cq,B^t?"2Cf]CA@AA?6C@z@GnC5A!gC`A}B`A8BlLCna{?JBsChAA@AA?huBf@CBBMB4B6joA4BB8 C F?ƤBKB A@AA?C#j@PeCACADCAFj@%;OCGx?mCNA0A@AA?;C@DžC{eCW?|CpeC0CpeCBpeC}?(ЀC7C@A@AA?:C~@ʒCrBgC;rB}C;rBXB9rB6~?fCJpBPA@AAbBJ@tBђCChBCCV CCCEBCCs?BYCC`A@AA?eLB@+/BB&>Ck(B`">CA`">Cޭ.A%"AF7?V1B=CpA@AA?9QC.Bk@xOC7CGFCCNXCCC AC%}?PCrCA@AA?iAoAA吇CAKCuϒA*EB6B*EB>^ACA@AA?"CF_@ LCBpQMCB9BBBCm|?LKCDBA@AA?UCe@ExBf1"BZBt"B2Ct"B@@t"By?Bv"BA@AA?7_BAfBԱC#BӱChAұCĕBآCn?BnCA@AA?zsBABqC0BΚqCvBΚqCAΚqCFM??YBKqCA@AA?Ba$CAdBB B3B BA Bu]A{CΞW?jkBBaBA@AA8B;AR@FB?AC5B=ACB=ACP;A3ZASO\?pEB.ACPAA?Ca4ACCCCCCУ>BC?CC?PAAmB@z^B,CkBMC=B&CB'C1>pv:B CAPAA?Bg@1B!C[B"CkMB"C9@"Cr?vB_8C APAA?]CM@+CjC=5'CCC CC'AٺBy?/C/C0APAA?2a CH@kBBwBeB*/CdBBdBu?QBeB@APAA?B~@4BBVBQBBQBqB$C3.s?lBGBPAPAA? Cq@B6CcBLCCLC!BLC"mu?BC`APAA?9Bŀ@:BK@CnB?C*B?ClvB?Cg?9B+{?CpAPAA?ArA\)BTCo%BUCy AS)B4HBS)Bj?m &B䌋CAPAA?t$Ced@.HCw,CҫHC{,C)B{,C.BXC{?GC=CAPAA?sBw@9,EBcCi.C@`AA?)hCi@tCbA÷CWmACWmA*OBNCG~?#WC`aA@`AA?)CMU@eCyC CCpCC،BbCw}?MC>C@`AA?B(Ce6@MBA7HCPA`AA?Cg8@CkAn^C̖AT"B̖A5BFCx?CMA`A`AA?tBm@+B/CꟸB/CB/C]AЗCțt?/BCpA`AA?frC^p@yCl3BhxC*l3BhC*l3BA `C'}?ezC3BA`AA?qqBF}@EC[)bAhUC$bAHߗB$bAˆBI"BCfz?nCuaAA`AA8BA@AB'5B?B,BՅUB-BUSB xCWw?B|BA`AA?*1BLAEBEB.B EBQAEB@peC@?_BLGBA`AA?OB@BAC~BACAAC)wB^Bf?fB*CA`AA?'sB5@?˄BX_C~oBM_C o]BM_Cې@5M/Bnq?B_CpAA?%ɉAkAAAC$@ACA Bt+B B=dKAC?pAA?NCbO@mCj CeCnC/CnC XB#C-{?ZsC=C@pAA?h+CBG@BĔ}AeBVwA~B&xCCRC&xCC#qO?{vBkiA@@pAA?^C$@9sC.CC`lCfC`lC/B"C|?7COC@pAA?C<@b*CV|C"C{}|C_ۧB|}|ChBBK+u?1&C|C@pAAJECd*r@v=CC8CCzEJCCͦAC{?p EADBPApAA?5Buj@B%eC•B6eC곋B6eCQB$FBVx?U)B eC`ApAAp0BF@BBdC-BPCb!CPCBPCo?BqCpApAA?RBrR@1eBVC#¤BVChBVCt@VCr? B3CApAA?YxB@2BUC$BCՆBCd$BħC{i?_IBCApAA?`B@T,BɏCBɏCBɏCBV$B3k?B}CApAA?sB ~@B۱AlgBwS?PHSBRnBAAA?|iB+\@JBPC~BC-BC$>!B4jBYl?F+B CAAA?LCy^@=1C@5dC2+C5dCxhC5dCsB5dC|?,3C[{eC AAA?~!CG@Q2CCX*CʆCCʆCAA*B {?G_2CC0AAA?B5K@l CCBCpCBoCEABx?5# CC@AAA?CCF|? `Ch#A`AAA?/_C1N@AC8C[C 8C C 8C,A 8Cp {?jC8CpAAA?*AlABL(CdBZ(C)AV-CBV-CwE?YBf(CAAA?;CP~r@C|C9CC'=aCCBC#}?ICCAAA?EBV@7BӠCBӠCpBӠCQA Cqt?ydB߶CAAA?z,BABeBY BeBUBeBX(@eBU?BBAAA?_By@?AB]wC}+B]wC,B]wCB]wCr?.UABIwCAA? C@CBxCBpCB|)BC?CB?AA?CiAC]5CC]5CgC]5C@??1~?fSC 5C@AA?0CW=@iC0CzcCC CC5BCLx}?SjC^EC@@AA?C@@C hCSC hCMC hC>BPB-~?C8hC@AA?hBK;'@*Bc%BJxA"B|C"BB"BW?JKAIB@AA?8C+@bC TBպ]C4TBC2TBB1TB0~?{cC$UB@AAQyC@`BUCBNUC:CNUCɁrBNUCw?B|C@AA?CO&@"C@/A,C/AC/A4@RCj{?v"CdAAAA?C6@CCoCCX CCACz?CGCAAA?ArAl'7B{C 0/BCACBBCB>xK:BܗC AAA?>BV@!Bm CrGB o C⨠B o C@o CLHp?nB!x C0AAA?xBQ@|GBClBC"BC6&BB`k?DB C@AAA?a#B8f@wBBwB^BwB>(CwBBwBPo?8B-BPAAA?BF@ȅBsBBBV)BB@Bݯl?BvB`AAA?B>l@BPZC VB;ZCB;ZCT9B Bv?B?ZCpAAA9&B5@uBPCWBPC#BPC1APC| w?]B3kPCAAA?ԗB@}@BArBABA@A`j?ȹBvaAAAA?ACqc@B CB CN7C CB C|?BtCAAA?B@BYlCBWlC}BWlC(ATcBv?BjlCAA?CAC4C3@C4CC4C WjB%7?C4C?AA?AAgB!CcB!CB]CCƴB]CC@ ?zBC@AA?sCzC@2C^CjCC@xCCV@C{?CzC@@AA?C@[CeC=CeCCeCANGB%?gCeC@AA?/ZCH@.CNB)C&BC&B_wB&B|?5-CB@AA?]Ce@>CNC_7CFCȒBFCBB-z?I@CǕC@AA?6B,@BWBDBDBBDBe,ZA*WCs?OB B@AA?$ABO@BCiBHC&eA$C*%B$C$B_?AB+CAAA?5 CQ@B+B#BCqB"BC/C"BC#}B"BC˔y?BBCAAA?PB@9CRBCp~LB#Ck@#Cd-BE@CH$E?5SBAC AAA?$B1@xB"B.B"B#KB"B9BHCm?<ҳBB0AAA?lo-C޾H@vACǹ,B$BC,BC,B}9B{._CW|?oIACsM-B@AAA?vWBg@ rBdCVsB$dC)B$dCnB$dCh o?rBJdCPAAAb8CU@z5C=BA?5CBV7CB@׭B}?4CB`AAA?PB6,@FARC%ARCS/HBRC9ARCwA CAAA?&B[8AV:AC1A#CyTA#CP @"Ca¯>9`CďB?`CA!B?`CB?`C\j?BJ@`C@AA?WBlX@BCHB&fCB'fCJA'fCxs?ƼBC@AA?W\1C N[@O#CP_zBVCizB @CizBBizB|?%C9={B@AA?BY@BxC9B+C @/CBW Cb?ӣB툡C@AAA?B`@v}Bq2C~BW2C/CW2CBW2Cot?~B2CPAAA?XC:@B{bA?AArC6X@%?B]ABUACUA~MBUAy? &BCA@AA?/B@ BECkBECBECe5BFAw?ªBd^EC@@AA?˥}C|@.LC'CVFC"CC"CjB"C~?5LCC@AA>s@;zBa7CzPF?gxB{@@AA?^=Ctf@;YCېCkZCېCCېCzBlBu|?_XCOǐCAAA?CPCA|@SC;CuUC;CpGC;C&U`Aw,C!}?RC-GCAAA?Be@TBC,BHCSBIC`A5BNr?YlBC AAA?BU -@)B?C1BC]~BC=@,$ CfFw?;CB-C0AAA?\?Ch@ >C#ECt=C#ECP=C#EC;F>A}?E>CEC@AAA?EBw@2BCU.BC&zBCC`AAAUA'A`A=l_CAMl_C?6-BlFA2-B?"?A˧_CpAAA?HBJ@pcBN4CFIBP4C&BP4CU A(CQj?_cB9CAA?$C@ȑCBCBGCBBB?BfCB?AA?ܓBZj@BQ`@CBS`@C KBS`@C5B*FAj?Bh@C@AA? CAB RC`BRC)CRC_ARCgw?$BRC@@AA?2:By@n/AxFC5AFCAFC@=A > AHC@AA?HLBB@A5uB/YAuB [BuB„BuBՒF?#$A\yqB@AA?~BC`@OCCEQCC/CCBDCy}? OCSC@AA?hb`B<'@)BC_*BCݍEBC3r@CVQ?{)BşC@AAIB(`[@BQBMB>B7B=B]hAvC,r?BBAAAyB@B CB|CذB|C.BC9k?؝B4CAAAC5:a@N7BC3BCBCD?C {?`BC AAA?B^@BC7B@k^BC:GBC]+BCrAAIrBk?^B2CAA? C@B :B2"C2.B2?Bj2?AA?@2Bʬa@nl{B&zC|BdzC4BdzCsy@dzC5i?|B6zC@AA?+[B@͟@ArjBAZjB'>BZjBg:A\jB'9?Az2kB@@AA?iB@ B[C+&BCnOBC"AAC]I?BC@AA?>BX!@ϏBh\CBPoC'CPoCwBPoCRt?hBctC@AA?A]/@:fA6BhA5BK"@daCAdaC2o>!kA3B@AA?BƟ@BYkBcBfYkB'޻BdYkB+lA^nCLFx?ZfBjB@AA?k]BBÑ@KBP'rCKBT'rCMBT'rCALxB1^?JKBt6rCAAA?AAGWA7LCzACLCD@AAAI>ȾA*LCAAA?B8ZV@JBtCBB~Cv B~C CgB~C}g?~JBC AAA?C@6C݉C@ C݉CpC݉CQuA݉C5|?CC0AAA?AT/ ABCYABC%>C-BCЅ0?^BC@AAA? Bĥc@RBx`C&By`CNBy`CyHBB}z?OB)dCPAAA?@J-BHU AjhBA"TBAAA,AOCn?chB0AAA?)xB-%AABVAB8AB?C>AB?AA?C5M@=q CDC ^ CAC=5.CACx\BAC@|? CeћC@AA?)[C@BBrBB)YAC@AA?Bx@aS*B3(CC&B3(C]A3(CACW){ZCp?B*CAAA?AF@n`DBCܓ8B!C~@!C(BxB~[?,DBh*C AAA?IAAAWAuC=AuC|?uC+,A΃B2>,XAH vC0AAA? |A?A|BSC16nBSC@ArBAe?AB SCAA?4~B!@勎BBC HhBC&A4C~?DBC?AA?AoAANC\ANCV A;BA;B6A>sRAHC@AA?Bh@;}B*$C sB*$CTnB*$CV?QCi?~}B/$C@@AAB@BCBCn`CCMGBCDx?}ܳBVC@AA?ZHBM2A_A0}CVA#}C3"#A"}C=EAE`BQ?A~}C@AA?TA@B+[B4B*OB4B@;aCŁfB;aCg]?}ZB4B@AA?phAs@CAC>Cc@7$A~9A7$A>vIA*F>CAAA? yhB^@k5/B^.BxBD.BzfBD.BAE.Byj?N.B-BAAA?pACNYk?U>2BB?AA?yA@ACZA Cʽ? C~A/B?6A+C@AA?IBN@6BC %BCiIBC3ACGh?S7B'C@@AA?!6BKh@FWBHtBBPtBtHBPtBٝAPtBw?;BB@AA?XAWA+B|CB|CZ?3B! B 3Bf/?sHB|C@AA?c!B{@ !B\B]B \BA \B%AזC(d?!BMB@@A?!lC|:AnCBLCB9CBDMBB?3ZCB@A?ׅC%@CC`CCwCCX!BB?\ CC@A?( D5A0DCCCHDCBC?7FDC@A?NCR@%CCCCCfZCCFAC?ЎNCC@A?8DHg2AGCBmTCB:&DB܁CB?CBAA?"CWACBFCB2CBBB?r[CBAAfC @RBBzCBĜCB%CBG? CB AAC@FCB:CB4BBlBC?M>CB0AA? B!vAÁ`BC?BC0VABK=JBBȯ>x,BC@AA?0AWAY6BBABRחAC+BC]=ABPAA?[CR@CC CC< CCD@C?גCC`AA?ciCKO@7BCBCܬCCA`CC?iBCpAA?~A7AB9BCS2BCBBBBPt>,BCAA?<[BkA4BC/BCACLAB.?MBCAA?gBfAACS}AC@CAB)>툉ACAA?'pB%ABBBB#?BXBCj?UBBAA?$ B@%CBl CB>BB5BC?CBAA?cSB[VAVABKABAB AB%>jۡABAA?R|B]EANRABEBH)AcCc BcCsE>Aɞ6BA?A?׽B E@uBT CuB CliB C$A Cq? B CA?A?UB}+@BZ=CB\=C B\=CAz,Cu?MBHDCA?ATB=8 AACAC'BCBJAC$+?lA>CA?A?!A$8AA?JA5??,?1wA5C,>!A~?A?A?LB@>CՑCdBՑCBՑCAWBz?}CđCA?A?=Bdդ@$B2\ClB2\C.WC2\CB2\Cc{?\B\]C@@A?R8{C#@XCՐ8CxWChBC6ChBCmBhBCC>@§C BCCB(CC(C[A(CĬn?BBAC@@A?}CR@&DC8CCCCBCg~?CC@@A?ΟDu@#DfRCD@zCI%D@zC%eB@zC1?&D>j{CA@A?![C~8g@:C]>CC-+-ABCA@A?%0BA' DB-,CI>B,C@,Cc%BHGC=?@5B*CA@ACɦb@yCCCCCpCClACOz?>CdCA@A?lB~-A lBcBvBB|HBAC쭓BC0?IB((BA@A?"Bן@fCJO&B,eBSO&B\;BQO&BB֓]CAx?FBr&BA@A?'B!&ApBi+CmqBi+CA봯CBB봯CM?{B>+CA@A?JXB3 AyB߱C[IBӱCѱ0BӱCC@ӱC??3BαCA@A?gB;A*Bщ^C橭B։^CDAS'*BBV'*B_?B^CA@A?EBdI,A B#BB B"!B B @ Bw@?CB=BA@A?,&BT`UAC BCKAC=ACP^?C>?BC@@@A?CE@N, D>{BCCCCɬBC~?hCC@@@@A?o]C=6@ѾB#BgCcBCcB9CcBGu?wCˮB@@@A?WB2$d@޾BMABgDdB&i@eDdBAmC}>0BB@@@A?D@< D8ICDQ/KCDP/KCHAO/KCH?. DMKC@@@A?W }Cm@tCrjC~,CvCoCvCaCvCy?lx:C!ЀC@@@A?HAD3ApD0\VCP]oDYCˆDYC&CYC9?yrDXCA@@A?,C,%@CBuC_BC`B5C`Bf|?(ϲCw"BA@@A?C3@CCX,C""CϦ3C""C"CoC${?YCbC A@@A? иC7@CC,C+~CEC+~CAB~?ٹCAC0A@@AuC8G@CEC6C( CB( CE-BFCs?O C6 C@A@@A?B)D@CQB]C4BaD4B0B7BP~?̉COBPA@@A?C @?3C!BCBdCB[KAC~?Ce=B`A@@A?B@젒BrUCBlCBlC%4@b1CiU?BcCpA@@A?J#Cm@F-C)gCCgCb#CgC@gCJz? C ugCA@@AX C4-a@Y B"[CjwB=[C2C=[CuB=[C12r?KBnCA@@A?[CG0b@C1Y9C;CCY9CʯCCY9CuACY9C0z?C#9CA@@A?9sB!Ij@ȂBX'CwBCG*CC/QBCm?:gBCA@@A?BM@*BGnYC)BLnYC?ĸBLnYCV@2BZv?BpYCA@@A?4 Ce@: C}$C- C$CGVB$CSA(Bx?o\ CVCA@@A?âC@B BB+B C+B"2B+B=wx?ՙBB/BA@@ADB1+ABBBB抡@BBkC_j?*BƫBA@@AaBgA3B'@ƩB@!A@OBaG6CΉm?sBf@A@@A?l BBA B=(CtB=(CA=(CpAC:?FBT(C@@A?Cn@uCA C?@C?@ A6CDt?e&Cu>@@@A?4%Cf@QCkB.ChBbChBkBC:u? 7CHB@@A?C@yDFCDvCoCvC`BC~?$ DC@@A?=9CR@CBiCGYBGCGYB[ARVC{~?/CYB@@A?ϜCw@ CҸBCBCBd)~AB< }?$C eB@@A?D,@CC D蛙Cq D蛙C_&B蛙Cɿ~?pDCA@A?BbDp A| DALBqUD-BQD-BBu˒C\~?AjD8BA@A?2C@MCP[CFC2C'̟C2C*A2C7|?CC A@A?~rB@yBBЧCiVB&CA&CXAM$C"?HLBC0A@A?C&@C/7C CzCCzC#B zC^~?JCC@A@A?U|AB A}AC_BCAIlBqBIlB>BCPA@A?WCj@pCCfCLCډCLCxwNAJC4}?CC`A@A?C:|Z@1AC>C:C"CB"CBE Cv?DCCpA@A?CGr@YCYQCWCZQC2BZQC1BAw?C;RCA@A?\HC|@ϏCO$C~@CW$C]BW$CΫ#CPCը}?؏C$CA@A?ծBy@S_ABYABXmBB4BB6o?v?AOBA@A?(MCx@lKCC6ACðCTSCðCACf|?YJLC CA@A? Bѡ-ATBe@B>e@A 7C[B 7CW?Bb@A@A?iB'@XB-CB-CwB-C=AC̰CPw?VoBł-CA@A?oB@@C daCCZUaC/iBZUaCBcU5By?{CQaCA@A?Am!AAwCAjwC@dBgAdBw>icAvCA@A?A-AƂBgCzBgCAmBBmB3J?*ՂBkCA@A?GqBbABH-BjA}_C6r?B-B@@A? rCa @2C8\B2C=X CWC>X C%:B,Cs{?C\y C@@@A?k^SCL@UC'CplCC>{CC&BCzw?!C߳C@@A?C3O@fC"CdC/!C5C/!CXBªC }?IC|!C@@A?ǚB\^@"Bn2rC BvC:AvCdB5BMX?+kBZvC@@A?4Ci@ JC*CPBjKCgCjKCBjKCq?BbC@@A; D@@Va,D~tCV-D~CgD~C|'ByB?u.D|CA@A?]8,Dt=AQDuNBV?DZBLDZB_"CjC1?FDXVBA@A?DC@|CZCUEC-[C$VC-[C A-[CH~?ϘC8[C A@A?SC}q@J2CST3CCG2CCG2CBG2C~?޲C2C0A@A&JC@TCCРC$CluC$C*UB%CL|?5CpQC@A@A?`GC(T@B=4BB-=BC-=B9C.=B(bv?B lABPA@A?ĨC @-CB^CqBSCqBWBqBX}?CB`A@A?+C0n@0CCVG*CꔃC]#CꔃCIH@SBċx?w/CbCpA@A;4Ck@sC CǫlC CB CB+B|?"pCH)CA@ABAf@CmBk CIBBBIB'q.BCOy?7CVBA@A?B|@tBϏBBϏBCϏBKIBϏBr?BBA@A&rAGE&AvB;1C㱱Bk1C0)B6߲C;C6߲CTA?᜻B1CA@A?(M1BjA=BCN9BvCXAAvCBAB=;?9=B鞆CA@AbB@C=ވC>C;ވCo-B;ވC(BxBy?QCDֈCA@AB@BC4BCS+AC_,BCpu?PJBߥCA@A? B@rB[BLlBzBd^BzBRAyBj?&rBOBA@A?7NAJ A! B`QBy BjQB@[CB[C? B7xBA@A?pahBAO+?BǎC/H,BǎCٿBǎCTAǎCk?$?BηC@@A?.B5@C IC\BkCqBkCBkCO?BWoC@@@A?4FB@VkBUBBBKGBB,B宖CY?FBB@@A?pC]<@5DGCC4C{uC4C2C h*C~?DC@@A?n Bڱ@[wBb(CBC*l?X:BBA@A?LB@WBMCdB_CݸB_CA_C%!n?܏BCA@A?TCU@UCEC:CGCdCGCΧA(C-hz?JCCA@A?PЊB@BZe0CYBHe0CU BHe0Cp]sB2C p?Bd0CA@A?bBAs_A~JBCATDgCAWB禳A_Xy?Ы?CuA@@@A?C@5CtCC}qC C}qC2BvB]=~?oLC=frC@@A?(0pC.@[CBCvB/CvB1B8C:{?GC*B@@A?'6DEo@84DCL2DC8DCAC0?4DRC@@A?C @*BBfs?BaCA@A?B8^@B.+CݦB.+C4WC.+COOB.+Ct?|B+CA@A?AX A?B BX6B%B*@B[BA@A?AB@@OB C:HB CB C0A Cc?xNBQE CA@A&Bk@B[BSB[BPZ{B[B=MWBCLs?BqqBA@A?B@7}B5AS~BAAmBAz@{CC>{CQiC>{CA>{C5z?w C^{CAAA?Ы}B @ZBkCNBkC-AkC\RB0C>]i?8B\CAAA?#4CzNX@LCBiC7\C>iCږ_C>iCFuB>iCo{?"C^ BM$?Y{AuyCAAA?B@uuBzCBwC'BwC&6AB1y?BzC?AA? CZ@ CٮCKvC3CC3CXB3CH]z?cC>7C@AA?^C@0C;>CCC$CCBCz?C[C@@AA?gDVA`uDE':CjDR8C dDR8CAQ@g?pNpDX8C@AA?FAC@sBBNMBVABeMBAjgCOBjgCa ?NBBhC$]@QWCZC']CRUC iCRUC$FAUUC/'z?ZC{CA AA?C@OjCj\B$gC^BC^BB^B|?iC!_B A AA?8C`@[dBqCEBlqCDClqCBmqCn?rǧBdGsC0A AA?/TBZ@zPBTBBuUB@rUBsB^C 7)? BB@A AA?˗B@g)BSA&BSAUBSABSAu?I?6;%B9APA AA?"ǐCߍ@ChhBnChBRChBA"C,~?CڶB`A AA? tC ^@~DC_jB@C}jBDB}jB~BZC3|?FC۽BpA AA? _By߷@{BÜC@B9ÜC_I@uC)BqCsi?́B(CA AA?DpBR@VGBz_lC B=_?nwB:}C@A0AA?sC|}@wSC'CC,CRPC,C -BlB[}?eCHCPA0AA?CП@݉C/CنCC7hCCudBC~?DCC`A0AA?TTCB@/C)֧CC0֧C]DC0֧CAaC[~?CCuCpA0AA?-CU/X@הByCjB4C29C4CSB4C q?[4BCA0AA?qB4S@BACBACs|BAC@ACVz?BCA0AA?B;W@BP CBP CȼBP C~FFAP Cun?dBCA0AAݏB}@mڰB.C|CBC|7BC{-BX{Bkp?iʱB&CA0AA?Ee8CU@5*C-C*CA-CVACA-CJA@-Cw1}?K)C.CA0AA?V}CX@C}}AiBy}ACy}A<Bx}A0z?*'C!lAA0AA?1BL@ByC*{ByC?BByCi5AyCs?BByCA0AA?~Aa6A4An4B4AZ4B;AZ4Bc<8A.tC`?A#B?@AA?p;B䁞@BM(CxBg)yCzARBTBRB?B~C@@AA?CW;AuCAICACA=@%HC=~?\WCA@@@AAuBigE@p[BBC2uB9B2uBtBM]C)Id?MBBB@@AA?? D8A;C`C4.CaC0DaCBaC9~?RCBaC@@AA?FC>@hCcB!CoBF]CoBv&pBoBv?ClnB@@AA3Cý@3TBiCBC4CCv BCp?,B2C@@AA?8iC`C@uCiCy\CCHHCCoBݡC|?|C _CA@AA?!C@bC EC\C=ECˆC=EC$[@=EC}?]1CECA@AA?&C3@*pCJomCˆdCmCՏBmC@C{dBA CpA@AA?ˬBX͍@ElBuBdcB7BB7BϓA7Blf?3pBvJBA@AA?JBՐ@6BBNB%ԥB5BNBB4BNBAgCm?QBLBA@AA? ]BXt@BX@.B"\@9B \@A9C[i?B@A@AA? Cy~g@)C2IC_.*CBBt>7BCCYBCi>egB B@PAA?_C|@i`C2@C/`C5CA/XC5C͝@CD{?bkCC@PAA?fRCa@ĽCjCz"C/jC;C/jCyBp[B}?wCGlC@PAA?Y`C@d{CC..rC$CFC$C4-B0I C {?~CqCAPAA?2BV@C\CC\C%>2A="B CF"BTk?C> \CAPAA?Ś"C_@G2C C/C CC CNBCz?E8C C APAA?=CM@2Cֶ2Cci-C׶2C;C׶2C-Bl[C*vy?_8Cн2C0APAA?vvBZ@ʛB+CQB|+CFB|+CHB|+Cq?ZBU-C@APAA? CϨ@CWCCWCwCWCHBWC^~?CօCPAPAA?B) w@ xBаCyBΰCsBΰC.k#B-C6p?BC`APAA?ΉfB I@B慰C(B3ѰCA3ѰC͘wBe-Ce?lB'DCpAPAA?B* A<&JB=@pEB=@@=@|v&B6C`O:?'+KB+9@APAA?ֿB{z@BǶ2CơBö2CBö2CAö2Co?]_B2CAPAA?:A ACcBaCcB৐CB6CbB6CB6C,[A@s?Y9B"6CAPAA?jM*B2Aj-BNBc]$BRBARB#BA×Cg[?,B/BAPAA?A9A_~ALC" dALC0kALCA>LCZ>~AC`AA?zAo_Ap Cе6LC6@,BFB'B|FBk~B|FB䧧B|FByd?z,BmBpA`AA?XB`@=BC@B墜CMԈA墜CZ|kBEC.[?MB3]CA`AA?Bs@CxCCRxC:BRxCiAB z?CxCA`AA?&A*AԼHBICF$IBC' (AZCP,sBYC+?GB&CA`AA?@nB@BYC~B[CKB[C A[Cn?lBCA`AABw7@حB{ZCڦBvZCeCvZCBvZC;sy?2BEZCA`AA?ɐBӻ@k.BXCQfBXC=BXCQAXC#s?e1BTCpAA?WB-j@[BCBCF^tBCRBB}?;BC?pAA?5B@ AtBͻAB?B~AsCY>cAB@pAA?oC#A_gC|C^Cֺ{C{#xCֺ{CcAԺ{CQ{?iC~;{C@@pAA?6CCy@&CCTCC\CCWuBC x?$CC@pAA?֣wC@2gCTC)bC"4UC-C#4UCSB$4UC|?BmC=VC@pAA?8хCp@MC/uC'ICuC7ΣCuCBuC7}?&ICܘtC@pAA?NGC]@YC{BnTC4Bq3C4B cB !C8|?h9XCJuB@pAA?8(C<@*Cz Cڸ%Cz C$Cz C#?F=Cuy?w/C$ CApAA?ګBl@BBMBB[BBPB5C_q?BmBApAA?=hRC!K@s>C>C:CJCʧeCJC,BJC?}?AC-C ApAA?}NC5@CI[BgCC[B^ CC[BpsAI[BG{?bC[B0ApAA?B.{@RC'C5QB%+C6A%+CvCBBq?C4C@ApAA?Brl@l C%BC.BCpA/BABL.C/u?7 CBPApAA?^C)?@B3C֜B3CC3CA{B3Cw?B"C`ApAA?B,R@xBBmdBHBeCHB3BGBrCu?7 BrBpApAA?pBp@qBWC8BZWCBZWCFBC y?`BeUCApAA??%CQ?@dC_bCC/bCV7C/bCAz B0bC{?ChbCApAA?AD*AU˂APBݻA?PBaPU@rAoSBApAA?A"AF:B,BC0?BBApAA?iagB AbSB,CCB,CjB,CR,A,C&m?TB/CApAA?n B@ʞBTzBưBQzBFBQzBvB^CCy?aBqBAA?@B3$@$A@IA72DABA7,IBBA73 BBA7i;>"A\(,7?AA?++CD<@BC}iBҊC/TCҊCyBҊC-x?BC@AA?frCHC@Ct@~C C?~Ct%C?~C/A?~C?x?-CDX|C@@AA?^BR>@=SB0CBCڪAC@B6+Ck?sB C@AA?A%B5C@aBCBBC4BBCA*C-@s?wBC@AAC@oC BӝC B]C BKlB B.~?FCB@AA?;VC@!NCCICrC^Y^CrC۩ArC\}?KCC@AA?C"@EFCCBBCʍCCʍCtBʍC}?ZHCɰCAAA?|Cac@GC]CBC]CB]CB,CYq|?cGCMCAAA?wQCm@~YCnCQCnC9MCnC̹@oC*8}?dXCC AAA?yBr@6CXBO4 CBːBB윅BCv?%CB0AAA?C{8@=CãCCC;BCiٹA{BXz?CC@AAA?ABK@jBaCȀBaCYOfAaCm[B[B=.]?ЏBCPAAA?gB(s@k_BQռBifBNռB CNռBBOռBz?YB̼BAAA?*(C?5`@CBBCB&6CB BB;Y|?COBAAA?`B(@GeB7^BYB,^B9JNB+^BI6@kCynq?Y2fB^BAAA?$AABCBC^@&2CB&2Cx+?B2CAA?tbC|@fCB *CBܚCB@BB?cCB?AA?,*C.g<@zCC^tCC+BCCEB|?"wCΔC@AA?_\BN@Br^GCB^GCB^GC ?^GCe?ĐBqTIC@@AA?~;C+@W6+CjpCcJ'C8pCcJC8pC B8pC&|? /CoC@AA?C@:CO'CCz'C9UCz'C3BCs~?C;'C@AA?eA-@ݲB0#]CaB#]CAK$BMBK$B:[CUAz$VCTA,CTA^&BKCLo}?j]C/A@AA?"-B@L@ÊB߄CTׅB˄CP]B̄CUz9A)B\$d?B;CAAA?^C@^@5CÊCF-CCBHCCBC\~|?36C^CAAA?/BS@]0B\BԀBBBBWEABe?5B}B AAA?ǧBQJ@IBFOuC BNuCo#BNuCIBNuCs`?*BsC0AAA?/BN@HBC6NDBC@%CCf#BC[&j?6GBC@AAA?Bex@uB<[;ChBG[;CYpBG[;Cw(Bh@ap?BN;CPAAA?Csz5@B(-*BB >*Bf 4C >*B:xB >*B%z?eBn*B`AAA?fFCP@C1`C:C`CxC`CB`C|?C`CpAAA?BU@XBCWBC CCBCq?VXB4CAAA?9Bz@#BSC\BSCo1BSCV5BSCs?\(B{CAAA?pB@m>B2Cl5B2C]B2CuA2Cdo?>BT3CAAA?A'AABzaA.Bu@.B;AC>(AOBAA?B;o@PB<6B.?6B1?6cAA?6?ؗBG6?AA?$W0CH,@C;C Ad7CqA$CrA=APC|?6CA@AA?5B?pvBAܦ@xBԦ@BԦ@0B69C9r?A;Bb@@@AAB|#@?*BjBBfBBfBp]_BeBinp?PBB@AA?sCߣ@dC;Cb\C;C!C;Cy&&B;C}?YkdC@C@4C/@C0@\B8C{?E=Cx7@AAA| C@BSCB#SC=C$SC"qCW?0hBB AAA?sB@AЦ:BܩCK9BܩC-@ܩC{.BCa%?RBAAA?oBv@BNCC,>CC,>CDXA,>CCs~?كCh5CAAA?WB<@e}BB[{BdB9PBdBwDKBdBj?~BPHBAAA?,C 2@B#B+:B#BLfC#B_B#B~@y?UBl $B AAA{AAkBTC!YALB{BLB?fr?BWC0AAA? CN@.CCCCCCfjA^BY{?yCyC@AAA?BB86k@?BC3BC)[ZBC' 0BYCt?@BCPAAAlB,m@JB C-B CM"B C>AB CDr? B, C`AAANATAlAr}CvcAr}C@B5wABPI>#pA3}CpAAA?lABs@%BưB؂B°B C°BfB°By?GBBAAA?nfEB0,A BqC+BqClEHBqC.AqC>X?BdCAA?gTC-@gC[Y6ǢCX6JCX6@\A4C?Ck6?AA?9C@C,uCB"uCL&C"uCB#uC@!{?~CtC@AA?B!@B& |CxB< |CB< |C(A> |Clx?BYp|C@@AA?|B\@VBfrC;*|BrCsHBrC!NA:zB#ge?BUsC@AA{Bw@BBBBBBo@>+Cu?lBGB@AA?-@NC4@jC.TCC-TCs}C,TC-0B,TC](|? CSC@AA?C_X@CC6CCpCC@Cy?>nC C@AACE'@B'FClB'FCS C'FCA'FC1x?sBFCAAA?;C|@C@J.C4CY/C4CDC4CǥA4CC!}?-C%4CAAA?P@B2K@+6B_Ch6B_CwA_CYAvP/BPH?|q6B_C AAA?7Az@֡ BBP B۲B%A궆Cb`B궆C̝>* B/B0AAA?eB H@gBcCf'BcCBcC\AcCz?B4cC@AAA?PB-@mB('C8eB!'CB!'C[2A!'Ch? mB}'CPAAA?CF@ǔBBSBBY1CByƈBB/{?8xBB`AAA?KCCO@$BpsBB~sBFC~sBlAsB`}?*BsBpAAA?ӜB@8BTCBTCSBTCaATCOx?mBYCAA?ɾAHA6BABBABfɼ@CACż>sNAB?AA?F Cz@B\CKB\CC\CeA\CCx?sBCbC@AA?xCؘ@9"%C0C4%C,CC,CqԙAC{?$CC@@AA?;C* AxC#4C C#4CbfC#4CGB#4Cs{?PvCy4C@AA?*Cn@A(C)C)CC0&CC#,@CF|?T(CC@AA?:B#q@WBXCGBC18BCGB.!C4r?gB~C@AA?B}@wBaBNxBB ?C~BCv=M?8xBB@AA\jB)Y@KAiB(CVviB|(CWB|(C>rA|(Cg?RiB(CAAA?=(B$T@A%CAQ"CJAQ"C,"@D2C{?A CAAA?Z{B'D@ǾAHC(AHCB HC2,B HCP?A[8IC AAA? C,+@`CC5C}C>8C}CONUB}C5{?4CЩC0AAA?7C(,F@B .CB .Cx$C .CB .Cww?+B1/.C@AAA?NBi@*B_}n?ItB}n?/B}n?A~4CŻ{?:B6o?PAAA?"B\@B/_BB(_B4B(_BJ@(_Bz?EBGB`AAA?-.BhAMyXBcB DBzBAzB~ACfj?HXBhOBAA?`!C@BCBCxMCC_BC?/BC?AA?2B-@XBN(CB-CB-C,;Bp[C_l?4B!/C@AA?K,C@1 C6z CH Cs C3Cs ClAs Ccz?|7 Cs C@@AA?r!C8@'"CAV"CrA C rA@GnEC{?B"CA@AA?_SB@ʍB:UC鼎BRCeARCD@BWKBe?"BPC@AA?YNB @ BbCL BCJACsA,Cw/?7 BsC@AA?aC1@B[WCB[WCTC[WCp3B[WC~z?hBqWC@AA? Bߨ@BBBrBB7sBBA-nC s?JBBAAA?3Bd[@BCaABaA^XBaAúAaAq?鮗B7ϦAAAA?/B@kA7BaA7BA7Bu@7B>kAB AAA?.XAAYB-EC8RPB+ECS^ABBB)&D?UhYB=C0AAA?=3B1>@BgIBCgcBdIBC)BdIBC@@dAݖz?yB?BC@AAA?NB`@BtCφB"tCA"tCBBBr?#B'tCAAE,B@4(]BC\BCUBC0BC7]?o[BC?AA?%B"C;aC#EB;aC z?B=LaC@AA?aOA<AA}CӄA}C]@}CAm,C>A_C@@AA?nAQ A`BΘ#CXBƘ#C1&Ad̫CπBd̫CqF?4@`B#C@AA?M Bu@"B'4BJ?B'4BB'4BP?'4Bq?eKBV4B@AA?0bBS@MB+XA:AXAڷBXA!BXAWc?ZBiVA@AA?_Bҷp@`cBŭC8RBȭCBȭC BǭC^u?JcBVC@AA?SRrBn@By^C{B|^CBrB|^C҄%ByB+Pu?dBbgCAAA?7AE A]UBphCd?BphCACQB_BAQBO?UBwhCAAA?uB"@sxBgCcBgCBgCVAgC/x?A)xBpCAA?BO@1BCBC2BC8wAB@AA?A>AzA¤A[vAA̵AA%A4MC'6?@hAd0A@AA?3B8@VBVhCIEBVhC)AVhCiASXQBo?q-WBq5hC@ A?TB!5A,uLC4C:BCa@C+B3Cp>BC@@ A?#sB3C@ AB F@(VCCChBCp<8B3C`?cCCA A? D%JA2D4CD4CD4CZB4C?AD4CA AC@LUC4CC4CC4CA4C?qB~70A A C|@CC-zcC64C64gB34?FCC@A AWB@C3CM(C3C B3CCCZ?$C3CPA A?4+C̟@Fr'C,CM*C ?4C?Y6C`A A?$ B@ BC BCaCC0AC#z?QBCpA A?B?<AǢB4CB4C9kB4CϩA7 {?dB4CA A?.-C'ա@fC4CG`C4C\+B4CcBW%7?BjC4CA A?aeC\@BfnBCCC\SCC?BCA AAkA4-GB4Cթ>B4CP]sA27){B27n] ?AJB4CA A?GqAfABQA4CJA4C@;)7%opA>)7sP><;A4CA A?Bb@(\C4CC4Ct}B4CHXA%7?OC4CA AA\56A /BR§6I?/B §6zA4C\B4C3>.B6A A?C@vCkuCCbFCCBC?uCCA A?rAMiABR6BQ6{B4CB4C(Q?LB]6A A?C@ R,CVP4sCVP4fCVP4UAVP4?P[,CP4@? A?݆C&OvAJ\CwC^NC/bCC/bC bqC/bCt){?tZYCVC@@? A?2qC@@CogCFClcCClcC@=B{?yC9bC@? A?ӡB@2CɢACnBAٔBA4iAA0[?}mB`A@? A?{Cx@CRCIpCCrCC8BC"i|?wCaC@? A?CV@DCrC,1C>C,1C A%1C~?D`WC@? A?sDD.;AMLD7C 2>D#˦CNID#˦CKDC˖CDC5CDCADC|?sC CA? A? Bi/A5FBRC~=B44Cn@B XBBR?GBCA? APAkA&BiC BjCEGAC=BC>fL BCA? A?"BІ@B'2CB 2Cvn C 2C\BB 2CɁs?BH2CA? A?B|@xB.vBUBgBm9BgBh=AŁC]j?O*A@=A@@ A?g`Cil@$ D` B:CXBCXBn A[C~? FCDB@@@ A,C|@ڧCXjCKC'C5dC'CÜBǓCv|?]C= C@@ A?ەGCe@CC 4CkCMCkCnAkCw? 5CC@@ A?|C@.CRC1CCCC1mA.X%C~?C#C@@ A?\RCI@ACgAMCBNCBd?CBy?ѐPCB@@ A?&C:lj@Cfd,CCE(CmؤCE(CaAWC֖}?2C)CA@ A?BDAX@"D1CWh D3C2 D3CQB3Ce~?U Do&3CA@ A?Cё@ԖCCQCKCyCKC mB/Bs{?sCC A@ A?%MC&0@0CBHB DA`A@@ A?r1C5@v CpA)CW A}CW AbUASC~?CApA@@ A?_ǟBZA•CA@@ A?UB=@YDBBՋEBBBBBB e?ABiBA@@ A?rAA.B.CD-BӕC>AYNBWBYNBn>w-BʕCA@@ A?eBF$AIDBv BABv BJBv B] @v Bt%]?.EB~M BA@@ A?Bs@pBC{DBCrBC"A* C@x?BCA@@ A?o߆B/A-BiCqrBiCBBiCT@iCr?YBqC@@ A?Ae@-C۴#CܪoBC^BԩC݄BԩCR>ZB C@@@ A?bCP@'fC!CC~{C66C~{CAB}?+ICZC@@ A?C@W>CdA?CACA|A4PJCU~?JC߭A@@ A? C@CXBtCpB9CpB CpB~|?CB@@ A?{iC(@ICbDC6LCӑCyY{CӑC ):BӑC,z?^^NC1C@@ A?zCǏr@kͬCz7CCBC.|CBC&CBC{?3CX?CA@ A? D@&D&B&D BD BꌤA Bޙ~?`D»BA@ AC*@;CzCCMDC"CMDCAC*~?ҮCfC A@ A?@pB @+B CB C @ CSSBvC W? B C0A@ ALCg_@\yCTCoYC[QC' CZQCk%BAy?}CRC@A@ A?MBwX@4B|CӇBCўBC[AC&m?HB׭CPA@ AޯB}>@B݆B ҍBwrBBwrBy_.AxrBM^?w0BB`A@ A?mC/z@B_CB_Cl?C_C;B_Cq?BkCpA@ A?v Ch@],C,)B=(C+)BNB+)B,B{Cx?.C%BA@ A?qB¹@z-B C;B CaxB CB{Cq?B CA@ A?@8Bӑ@NAǫCAǫCaBǫC}BǫC?AyCA@ A?ICS a@CQC8BRC)CRC.ARCx?@CaRCA@ A?o?HCje@<3'C94B}v#C84BgC84BB84B|?'CX2BA@ A? IC{@ƬCQCCQCBU*CQCI"BQCyz?I!CoCA@ A?IBQ,@ `BtBEBlB-GBlBq XB[Cs?BhBA@ A?s!B n7AqAn[C^AAm[CAn[CJA-C4t?~ApWCA@ AͣB`@)BJC>BJCxBJCrJ@ C"w?MBKCA@ A?#BDAA NBZAMBŤAMB%ڣ@C/?{AdB@@ A?1.CJ@ECChC_~C^6C_~CA^~CqMu?iCUC@@@ A?dEC̾@C,_BFȲC۪BC۪Bj?BުB}?C B@@ A?DyA)'DQCDK=CDK=C.B"B(?9DC@@ A?HD|Ak?D:A~@DFEAkPDFEAvBFEAf?%BDUA@@ A?C 6@%NC9uCTɣCThsCGCCThsC`CL}B"z?uCBtCA@ ADK@CAc@ C> @ZD> @#C> @~?0C9-@ A@ A?=f@Ca@>CγCJFCݔ@0Cݔ@A8Cy?I@C?@0A@ A?AA=BPB1@B BcVBBZCcBBZCw{>BG*B@A@ A?CN@ECޛ+C,C+CC+CfmB+Cm}?9Ca(,CPA@ A?-xCn@F]C0lCcUC*lCC*lC?zB)lCd{?C[CnkC`A@ A? KB"@-*B#SCk$B@SCA@SCAAXr?3"BSCpA@ A۸0CW@HCA2BC2ABC1A*BJCz?EDECQLAA@ A?~ZB@6^jBC beBCª BCnACW?wB1 CA@ A?B@2ؾAxBuA|B2B|BƲB|B1?tA3-BA@ A?'B|L@OCTCsB\C A\CjBG.Cir?*CmCA@ A?]BB@hsBeF CoB~F CB}F CA}F C Jf?sBp CA@ A?wCPz@:+C:C,C:CؿB:CB@|?ic+C-:CA@ A?OBb5AFJBĩCBC>9ACA7zC?YBCA@ A?kGB)ALACF{EA CA C,A C׽>0JA6CA@ A?'A %A0AݝC'A睄C?杄CAwB)> [2ACA@ A?B}@ǪBB$BBBBAB|^{?BB@@ AC2@"DB/CBCBHƌBrC ~?<DB@@@ A?QD3AADMTACA DA{/BA~?=HD&A@@ A?/C~@U2C` C'CJHCCJHCèB&$C}~?Cc C@@ A?C?JC;KCQ.C?C+B?C);Bv:Avr?L 7CBCC@@ A?9eC@8.>CAC@-CdACdAƵBdAqs?(2CuA@@ A??D@uD@CCNDCDC^ ACd~?DCA@ A?9C@CכּA9CכּABuKC~?eCRAA@ A? BM8m@"B8'B%@r_pBvXAr_pBϋAq_pB0>A8B A@ A?ՎC@DZBv DH}BCH}B >CpsC ~?D-B0A@ A>Cѵ@wCxCJCxCFCxC{BxCC~?CC8BװC8B(qEC8BO|?CBpA@ A?4gCM܍@CCޮ.B=C .BxC'g/BA@ A?Bv@BHBBHBLBHBw[AqfCx?KBFBA@ A?T0BAlA|BgC|BgC}@`NB+BhNB0O?GbBۭgCA@ A?Br@+[B\ zCB zCC zCA zCy?tBczCA@ A?B@?BgCahBIC?BIC7^AICΗo?qBCA@ A?B+@Y6OBC PBC'CC)BC: o?NB-CA@ A?~BR@BBBBBBJ@Bn?}tBHBA@ A?mAA BjGCBGC[AMA PBMA.> BiHCA@ A?wBtF A8B B BBBB B{ABřCt?*B B?@ A?l+C#@2bBI4C< BVNCNCVNC˳BVNCq?BޑC@@ A?$!C]@CBuCCCC3i@[C~?C CC@@@ A?C$A D,C;CCUCCB@JwC~?E>DkC@@ A?t Cx@ CdsRCCc(PCCc(PCWBCA.|?CePC@@ A?E`Cs@ՁC6NBrCp͔B=Co͔BSBf~CHv?zCwB@@ A?"Dz@DB~DB5,DBzBB*~?DvB@@ A?DDWA@?D-G&BBDʊ'BFDˊ'BQNA'B[o?@D.'BA@ A?vCg=?@DCTzC)CtC|ZdCtCA.BM"|??CjvCA@ A?vB_@`&CΎCCzHCy>|BzHCƖB!BEq?^CpC A@ A?rCo@ CwCCRyCCRyC4>BRyC"~?mC8xC0A@ A?$CY@LCBPBԘBɖ8CҘB-}BҘBt?BB@A@ A?A_"AB `CzBf7`C B0B*B0B8V>EBCaCPA@ A?iB@q\BB]AB~>W"WA_[CA@ A?zKA7Aym1B4 B*B4 BW@* WC?B* WC\[(?.1Bi] BA@ A?M]B%@B`BB`B C`BoA`B*|?/NBQB@A A?TZDiPAUD^ALNDAq%eDA#BA\h?3SD,[A@@A A?BTf@BdBBB}#@XC*BXCH?V/B-B@A A?wClv@CjC^ȘCŲCqCŲCŋAŲC z?jCJC@A A?3Clo@|dCemCWvCF_CѐCF_CmkAF_Cʐz?ɀCcC@A A?hCO@C&CiĘC՝CgC՝C&A՝Cq|?CC C@A A?Co@C@SCC*CnC*CbB*C]~?CCAA A?yCr@u#CFCC.4C?C.4C.0C[h C~?CBC AA A?dCL@SCWC[CS~CjUCS~C :CS~C[p}?qC2,C0AA A?CT2@C#BCBRܤCB,BB!a}?C~B@AA A?9*Co`@ӣBwK;COB:GC{AϡAk?BhGCAA A?ˡA%AH}NBέJCEB&JCB/)AAWB/)AN>MBƛICAA A?X8Ccyg@BBBrBwCrBCrB"z?BBAA A?B(ABACC1CCoBCK~?GCs݀CAA A?={CM@$C7=C~6Cw7Cy+Cw7C`Bw7Cx?g-C9CAA A?pCx@&BiHC_PB"_MCC"_MC>C"_MCCAA A?s"B}}@BByBBCB&ABk'z?B̞BAA A?䴞B @BBygrA@ A A?cv'CY9@DDC֏C-\OCŢCBƢC BE!C(w?IC-C@@ A A?p Cb%@w0B-CgBejCg1CejCBejCDY?IBtC@ A A?\s)DADZCGDϚC9DϚCoCϚCa?GDhC@ A A?OCT@֐CbCCl[CICk[C5@Bi[Cy}?%CA^C@ A A?nCTBifCB$CBBCz? 2oCB@A A A?eCz3|@&:CBM6C BC BhB BP/|?f9CBPA A A?CS@ɯB CCZ_C^CZ_CBZ_C`w?CCBC@0A A?CΔ@CPXCCUCVCUCX@UC|?CVC@0A A?B'J)@-B|@`TBM?BM?P0?NL?<D?mӫB(@@0A A?=2C71a@ԎC6 CmC!CC!C B!Ch|?cC?!C@0A A?g7Ch=@BB4еB.Bk)B*gCk)B%bBk)B@u? MBBA0A A?BqJ@BC^BrCnrBrCQO"B-Ch?BBCA0A A?ҲC A(CIC(CqΓCZCqΓC1?bΓCE~?lCeC A0A A BY?@t ChCChCBhC- B4oPBzr?CfC0A0A A?eqC:j@ }C,CwC,CmeC,C?A~CSn}?9~C+-C@A0A A?mCYt@TCoMCNCMCŃCMC0eBMCX|?RC/MCPA0A A?g(Ci@6CCK{C~n?CZ{C CZ{CJBfBY|?AC{C`A0A A?pCVr@.ZCAC7SCMCs"CMC94\BNCz}?N[C"CpA0A A?LB@{ @hBc@ЍBY@(@эBr?ӍB;=x@pBA0A A?G+APjAŀBE,CقB`,C4B0C'B0CP-?M)BCA0A A?4Bv~@B \CB \C&B \CDB \Co?CB[CA0A A?_Bo'0ALtBCtBC5T@[hB BZhBwF?}sB&CA0A A?B6MAAO}CĕAH}CI@H}CxdhAB>?A`CA0A A?>7B@&B,B+B5BuB5BPB5Bq?*B]ɿBA0A A?gAAAdAҐC AҐC#oAҐCc(@JB?DA4CA0A A?AM3AiAJC_ZAJC]@JC/A+B> AAgC?@A A/cC@8iCNËBeCyBCyBHByBz?cCL{B@@A A?*aCy@TBd(C[2BB$C=CB$CM;CB$Ctr?ǠB*=&C@@@A A?yfEC@1CYtC,БC'vCsEB(vCECLBy?+1CuC@@A A?3BJ@B:|aCsBfC_BfC9wBJBxV?BeC@@A A?C6Q@~CPCtQCCCCp3AoC}?˨CO!C@@A A?C@>C CLC( CmC( CYB( C}?ǕCC@@A A?lBCJ@"Cߗ@B{C6@BJ\C5@B&muB3@By?=#COHBA@A A?wC@C4A[tC6A\ C6AGA6AMU|?]uC=AA@A A?I C%U@3#BcC@PB{bCJ+TC{bCUB{bCq?銺B7`C A@A A?|Bc@_B5CB5C$B5CA5C q?*BE6C0A@A A?B{@_B*܇C2B܇CUB܇C~@8BpB}k?IBNC@A@A A\Cd@t9CWeA2CWeA4!BWeAaV+BUBCmz?mwCʧfAPA@A A?WbC\ZG@8CưBB3CưBކCưBBưB8}?;CB`A@A A?yBi@PίB7xdCpצBXdCAXdC,`BpbABf)c?YB5dCpA@A ABa@ZBT?C}BT?C BT?C~_(AJ5Aw?B?CA@A A?pfB2@B/ CjB9 CG*?&C(Bp&Cj?BL/CA@A A?>B>$A}AסCAC00@C5SAkB>zACA@A A?o B -AXAPB=A [BƲ@ [B,dA֖CF>oACO8BCO8BBO8Ba~?CW8BAPA A?tsC$e@+j8C$C3Cf&CǕCf&CBe&C${?6C0CAPA A?#RC>A@UMCbSBHCSBf5UCSB_EARB7|?MC*B APA A<*BMkW@B C-B= C"B7O|?8S4CnZCPAPA A?CN@CuC 'wCB!0wCC!0wC@0wCw?BCAwC`APA A?vCd@VC|C,CxC+yCxC BBʰ~?-oCeCpAPA A?pAv!AE B7BUm BB4iACUCuCBCUCO>] B#MBAPA A?d7C@]@C`CYCaCCaCDzAIBd0{?3CCAPA Aw[BAZfBCnehBCΪ BC>uABXX?`ehBCAPA A?IC/I@'+C?C2A+C:CdC:C4eB:C}?`+CCAPA AVCR@C4BB4Bˤ%C4Bu*B4BBz?&C5BAPA A?Bg=B|-ABBuBBAB{B/C[r?{BB`A AmʼnBi@@^YBBCtQBCA4Cjq?vmBC?`A A?CIH@B@B- BMBDZCMB7CMB/W?h BTB@`A A?|CD2A+EC@,B+?C*B+rB*B,6BCTCx?ICoA@@`A A?EhCD@Ё%CwBTI C`RB2C`RBC`RBKz? &CMB@`A A5 Cp!}@<B9C B_6CvAǙC@A`A A?Cxd@CCaC CQaC9BQaC:BF56B~xz?KCaCA`A A?B@IB2Cp^B2C_B2CB2Ct?1BCA`A A?cMBA?BwC6BzC[6BzC.Ԣ=UBc?nF?B CA`A A?90BC4A+ެBCBC@CЃBPC %m?BCpA A?์AA30RBCU5BC;BBHBBR>BC?pA ACB@%YC-CQCSb-CCSb-CBSb-C{?e\CF-C@pA A?yB=@ͻBІCBdCUBdC BdCj?OQBZ{C@@pA A? VBTz@>BKB3EB BIA BD\Bu}CK??BpMB@pA A?; C@լ*CZxA7'C_IA-gB]IA,XB=Ca1y?$+CdA@pA A?B%@PBcC4B'cCB&cC\ B&cC(Ok?0B_C@pA A?BG6.@Q]BfFBBFBCFBwbAFBs?BB@pA A? 8CXպ@FC%A*C#AVC#A B@CC)?PC!lxAApA A?0CY@HC:CtC:CkBC:C;(B:C{?CCApA A?,Ct{7@ C@C"C(CC(C@ lA'Cz?> C0C ApA A?C j@C|](C~Cm](CYkCm](C Am](CT~? C#(C0ApA A?<BAhB'x@!Am@v>@A<`;C'>Aa@@ApA A?N!C:@=`CBPCBV!-CB8ABJ{?C7BPApA AĨ~COQ]@kCfCfCfCpCfCR0BfC+~?ClC\C`ApA A?QCgI@*CE_COCE_CK{CE_CAB_Cz?OpC}`CpApA A?ECrM@BUGCBGCxACGC(vBGCpz?zBGCApA A?AldABPCBƤCcA(C]{B'C>DBL,CApA A?MBt@!BaLBcBSLBlZBSLBQ BSLB>W?B@BApA A?A'ABC*CȽB C*Cd@A!C B!CY?@B{-*CApA A/1A5ARBB=BBW>YC?BYCTN?9SBBA AA%AA0AC`F4A4CA4Cql=$mAC?A A?B @CwBCBBB7BCt?CB@A A BJ?F@ Bl)@5@B2*@B2*@A2*@h?B͗@@@A A?Ay@cBC\BC6AʋC͞BʋC@?apB7C@A A?&GC Z@xCCQCC]vCCBC:-z?UCC@A A?C^@CnVYC8CWVYCţCWVYCwhLBWVYCE~? .CNXC@A ASCC>L@k0CѪJB,CgJBXUChJB"BhJB\|?=2CLB@A A?SCݓ@C@G~CDCDG~CPCDG~CCBDG~C[|?FCW~CAA A?SC M@BxCTBxCr5CxC}'BxCOVy?jBCAA A+CW3@k]C{{C4tB{C7,QC{C;B{Cz?=Cf{C AA A?xٔB@BC%zB/CB/C=s@.CM^?#BC0AA A?oA,AAƨA?A8AK@(ICSA(IC>R AA@AA A?n!C^&D@[C.BcC!B)C!B> A!BG{?^CaBPAA AϞ=B<@HB;BB;B@;B6BNCT?DٍBB`AA A?+C7@CvKCsCJC7CJC.AJCqN|?CICpAA A?KBG@ZrB;uCVqsBCuC޷BCuCABuCl?6sBuuCAA A?Bi@eB4͑CB5͑C qB6͑C%OA4Bo? BԑCAA A?DCx@ CʯCZWCʯChCʯCֽ@d+C{?lo C֯CAA A?CNv@۶C CV C CB C[AC}?ICCAA A?΄B@/B]|C9`B`|CB`|C@_|Cx?BjCA A?pA[nA>BCxBCBB}9CB!?ѴBC?A AoUCl@,C 8CJC7CxUC7C+@Bx?(C@EC@A A?wPB\@qAC,?ACޏBCACe(?_AQIC@@A A?koB@BLfCԸBLfCBLfC%&B2IBd?꣕BeC@A A߆IC~@*C~C8'Cp~CfCp~CV~Bp~Cȹ|?),C~C@A A?6.CS@ #CB+CGB$8CGBGAFBE|?_"CB@A A?Bb 6@}/ Cvg(CsCGg(C@Eg(C;B3C\Xt? C9'C@A A?B*@@, Bk^C?Bx^CI%yBx^Cg}A)Bi?zBɩ_CAA A?2C@,CXC#CC0;CC AC4{?j,CoCAA A?.Ca-@*ClC`w#CrC /3CrCz{ArC |?) +C~C AA A?+BCׁA@ȎC4UB^CVUBHBUUBPW@iiClz?RAC9&VB0AA A?CR@AnCQLClCZLCyCZLC{BZLC6~?nCuMC@AA A?JdCO@N)TC1B|UCP1B@oCQ1B A^1B}?.STC-1BPAA A?B^@B C_B CB Ci BdC w?3B0C`AA A!pBiAAA A?"B@?>B>.BEB@.BgxB@.Bs4AKCy?ۈBK4BA A?BHN5@X;B4C6B4CT/C4C3fC4Cɰ~?JB4C?A A?BAN?͒BqOB͆BOBZBOB#NAOBbm?BB@A A?PB~C@5BʪCBʪC`CʪCۯgBʪCt?$B4C@@A A?W*Co@9C2yCB 9B0OC 9B"B9BSp?VPBpB@A A?0BS@:RBtPCBPCEBPCJ%BAaj?C.BFPC@A A?B@B[BluBpBk BpBfBoBl?ׅBusBAA A?Au@*A)CBA *C{@ *CrA'B>A:CAA A`BT@1BUC ;BC >BCF7ACaF>?DB앞C AA A?NBV@_BwCWBwC5BwCAKBp?JnB8wC0AA A?ZeBF:n@*r]B`AG_BdaAѻBdaAP\BcaA )i?f\BOA@AA A?ޔBA@2@BCUBCxBC`BzkCMw?oUBCPAA A?`CTI@ $tCTjCtCVjCwICVjC&>,BQBl~?wtC rC`AA A?'%B:&A0BC0HBC<@CҜAQBC$?B%OCpAA A?~KBd@@nBl1Ca~Bq1CiBq1C@C2j?SB1CAA A?!CQD\@B?BB?BAC?BJNA?Bd}?^B9BAA AഛATA ,rA4CXA 4C_?<<}lA<pA3CA A?EqC@ҲCBΟCBcCBxAC?MCB?A A?룸A_+@iBPCg BvPCAAWBAp>B'JPC@A A?B @Bij@AA A?Bv/@vC#CkC#C\WB#CLBFCw?C >CAA A?Cԓp@,raCS$B cCE$BCE$BVcBH$B~?aC$B AA A?SGBA@4dBgC4eB'CpA'CAC4Y?eBB0AA A?HBU@~{B2*C\e|B"*CuRAMC}BMCD?:b|B*C@AA A?Bx@BCpjBC*BCACv?룮B~CPAA A?^9CeM@C?C>C?CC?C+VA?C {?}CZ?C`AA A?rAG AjAŝC(AyŝCt@C²AC#>yACSC:C"SCW_B#SC)C)Ce{?G?C_kC@@A A?+Bڑ1@ك[BCVBCXCCVFBCx}k?[BDC@A A?B{<0@OBʰLC5BͰLC6BBͰLC%AiAlt?EBƿLC@A A?cCB(i@BCB C>C CB Cv?OBUC@A A?WB !V@uB ECBDCBDC(@"Cw?v~BC@A A?wYBt9@ MBOCS{OBOCuBOCDA8A W?OBOCAA A?3_CA@)CRS CB*CV CJCV CBV Cn}?)CZ CAA A?CB}-@BJ̽A&B{A0C{Ap B{As?B5A AA A?&B+"@gBBABB,BB?IABex?BVB0AA AWBW@BCsBC)BC@CDx?BC@AA A?шBWt@(BBH=Cy:B<=CB<=C"UB<=C!c?vABOCPAA A?B7@>B|B86B|BB|BA|Bi?=B%B`AA A?P"`Ba@[-BBJBBziyBBE=ABh?FN-B$CpAA A?.A-A%%A}AA}AZA}A$ACC.? 9A˸{AA A?EA2A@)BC*BCèBBj3BB|:r>%BC?A A?CH@CTCqCTCECTCb!A^Bw(z?7C!TC@A A?CzAk CfCiT CfC/CfCv@fCy?Z C!fC@@A A?CL`@?8C&eBb9C6eB+9B6eBRBNCq{?7C%B@A A#BHw@hB#~lBؤBL~lBKBL~lBUBJ~lBt?ۢB?"mB@A A?'rCG4q@CrAeC_A,C_ArB_Ai{?CJA@A A?BLP@BpCBBCVBCA|8Bat?OBC@A A?_BV@+BL,3CͷB>3CV]B>3CiAXC6Rh?~jBO3CAA A?$C8<@DCC^BC|BYP*C|B{A|B|?ENCL@BAA A?懇Bm@BB)BBuBBg@~CMo?BBz˕B AA A$BGh@HBȜA 1{B^ɜA B]ɜAKA[ɜAGj?B_A0AA A?dCCl@)CVCCYCoCYCiLBYCY}?CċC@AA A? BY@׽bB>C0 WB>CՎB>CA>Cs?cbBw>CPAA A?*OB@ByC1fByCByC<A$[Bl?B2yC`AA A?VBu@;_BALBAIBAd?OCةr?:_BZAA A?,CUACGCCPCC.BC?CC?A A;CB-A+%B{C$BGCg@nĔBmB]BNB5<CNBBNBgu? 8BeBAA AQB`_@{BыA rBxыAByыA&}BzыAjn?}B2yAAA A?"BM@XBfaAĨzB?faABAfaAeSAPfaAn??тBFbA AA A?q`BDj@vVBTA&LB/A]B0A)A0Aq?[IWB́A0AA A?ڣBi@$BiCBiCTBiCmMAbTBdy?-B-hC@AA A?`Bt^@Bd|CRAd|CIBd|Cbj Bd|Cd?>BZ&|CA A?B\p*A BC3BCBC8AC?k[BC?A A?gHC@[2CfCP1CfCx[CfC'BfC;}?G2C^C@A A?B@~BF CBJ C4BJ CxAJ C.y?BC@@A A?;B@BCBC@КBCbaAyBnv?IB^C@A A?:Bk@r;BŬ_C-5BӬ_C CӬ_CDBҬ_Cֈi?,@BMBKBMBEBMB(AqSC}?B;BA A?YBA]fB]BCG7QBC4K@4Cr}??dBC?A A?e cB֪@ylB'aB cBaB.:BaBvc'A0~C Oi?!mB7B@A A?g)B:ڶ@:1BtBAu*BtBAtB;^A2ݙC W?n1BB@@A A?R.C@CzC?CzCnjGCzCEPBzC4}?Cn{C@A A?fA A8B9GC` B9GC AA\2BAi?z=BGC@A A?eB$@8B\AB:AB;A| Bh KCd{?sBA@A A?uB AnBCuBC,BC~YWACs?vB>xC@A A?TBi@7BBBBBBABv?n5BBAA A?dAcfA 4A0ECA A?^AACAB,AB@CiƄACbc4>XHAB?A A?YpAZ AÆA=@tA<@v&@<@EA:C>&A^v@@A A?SB@y1|Bm+B^Ba+BkBb+BSAb+B1Tt?{BPB@@A A?ALAIgB!C NB!Cn*AɪC5xBɪCNhQ?%gBߓ!C@A AQ'A^%A{"B yFBB-yFB[&@LeCBLeC39?"BFB@A A`PB<@"RB9BVW@B9B2GB9Bg?9B*Hp?RB9B@0A?REC݋@;CBNBBCBCBZ?TBB@@0A?OCG@`|ACCCC>CCJAC?CC@0A?ZB@UpAB<vAB@Br ACB>AB@0A?c'JC֪@,CBMECBXBBnXCC?aCB@0A?CE AʩCCCC3CCf@B?`xCC@0A?ADwA68DBp=DBDDBAB?j%>DBA0A?!FDnA/ڭBBpA0A?yNAf2eADžBC:dBCw)BB BB.L&?˥BCA0A?zB31A׼AC fACBC,aAC`L>}ACA0A?XBE@}BBBBBB @C?(hBBA0A?8A^HA,N^ACaAC/!ABmlAB=zACA0A?C@XCB?RRCBCB4BB?VCBA0A?BAQBB BBVBBD3%BC9?VBBA0ABA'nAC@?0A?UBj@sZCwPB CBACC'CCC_^?_CNB@@?0A?\B[@mB6gB`TB CAujCWBujCC?;B C@?0A?C:^@]CԪIC7+CQ?CeCQ?CCHB5A"u?z*C=C@?0A?CA@hCq BkC2CB>C@C>CYB>Cw?BuCA?0A? CC_f@SBoCJBoCCoCjBoCYw?*mB4oCA?0A?%B&AAPAvA+A4As%AA?0A?JBY @ȶPBNBEBBZBBӂAB*vS?QBBA?0A?Bz@+BvB#BB;iBB}B:C"AE"C"A'!4C"AB"A {?vCcHAA?0A?RKCE]@b)CA)CwAmiCsA(#BpA}?<)CAA?0A?_}B@SB(bCjXQB(bC_C(bC:B(bC!o?ZTB1bCA?0A?Bk@CCJBCBCkzaAKB{?C(CA?0A?NjBF7AߣBHC ڑBHCXBHC BAڱq?ڣBHC@@@0A?yKCrM@C2KB-mCNB@ CNBٙBCz?׌xC!yB@@0A?Bg?{A,CB:CPCЙ@CXBЙ@C$BIAi??CH2AC@@0A?[Bͱ+@BoCfB#CE/B#CyBB~c?^BَC@@0A?CB@+bCoCʝCsC CsCZBsC`}? CbrC@@0ACV=@DC@oBG<CA~dAu)C)An)C?n)CAC>\5A~ CA@0A?Bd@kmBBcBB7:BBAB_p?emBBA@0A?B@|&B8CB8C &B8CB8C[n?&Bs*C@@@0AZaC@CCcC摱CrCȴBrC_CB_|?CޕC@@@@0A? Cc@pCCT CCCCnAC*'r?C`sC@@@0A? 0CWK<@.vuC٪C vUCE A&CE ANBQkKCe?OBC`A@@0A?6x3Cq{@V(CB"CBĈ9CB AB@]x?I(C-BpA@@0A?Cf@dTCXvCCXvCf%CXvC&AXvCx?*CvCA@@0A?7/C L@CMCvBCMCza@CMC| BMC{?CxCA@@0A?xBAWӏBvkCFBՁC t2C>ՁCPGB?ՁCJz?BсCA@@0A?JvB A|ABTABBB~X?BB^]?3}AyBA@@0A?6B\z@ᒢB+BjPB+B쩍B+B@wCƓw?B}B7B@@0A?BCH@C,lCCPmC.CPmCH=APmC״|?WCP[mC@@@0A?C/@CqGCĨC^mLCԽC^mLC/>BjAc~?pNCpLC@@0A5CP;b@XgCرBoC9B%C9B_QA9B{?QvCֵB@@0ArCxm@C}ZCPCcCzCcCS{BcC}?C*aC@@0A?Cf@JCtgB)C҆BiC҆B֚A҆B\|?ߙC B@@0A?CZ@>C A0C>A=C>A 7A>MCV{?> C]AA@0A? DFo@#CEbB?DUB*xDUB^ϴBUB~?8DBA@0A?:aC C@RCuCbcCmDCkVCmDC5mOA݈C=z?ZC^WC A@0A?Cl@ɵC^>C ?ֱC ?޴@C5C>-~?lC8?0A@0A?<C̤@mC A]C^A2C^ARBy^A}?_C mA@A@0A?IBm@2 C8"C^ C<"CB<"C! BRCs? C@"CPA@0A?)C~i@,C͊^C}C^C:C^CB^CA}?YCs_C`A@0A?Y8Co@%0CwCP,C|wC+B|wCBPBXx?ׂ6CWwCpA@0A?jBF@"C B:|B B 4B B@wBk2WCp?wC?BA@0A?ڊBE@tBx9BoB{ 9B@B| 9BT~B{ 9Bl?`B^@BA@0A?.ǣB<@wgBIB^BBܲBBBBb?}cBU#BA@0A?Bv@jBCBPCBPC@N'Clt?nBۭCA@0A?(C c@oCpoB8JCoBFCoB BoB3z?f@CUpBA@0A?B0@EB=CYB=CS+B=CAPBAw?B[ CA@0A?&u)Cs@QC|AoCA2CA&AAE|?tlCnAA@0A?BŞ@BCBCBC#@wsCf v?BCA@0A?JBk@ӴB@CB@C?C@CA@C|?iB?CA@0A?tB@^CC(CB@(CWB@(Ce?<(Cs}?vC(C@@0A?}CuXA͌C1C/C5CC5C'msA5C'~?C C@@0A?qCQj@)CЈA8C)[AC)[AJғAAC |?CHfA@@0A?rD>AC@CC-C VCY7C_DY7C BY7C~?emC+"5C@@0A?D)@DT^CDi_C^Di_CBj_C3j~?Dx_CA@0A?xC{@7C RCEC[ECC[ECpB[ECRy?=CAJCA@0A?HCbu@sCŒCWCVCX1CVCg?(VCs}?z3ChC A@0A?DC@L@|CLBnCACAkB{OCy?8pCFA0A@0A?9WkB܎@BkbCZBgbC"@gbCXB;Bb/?RBbC@A@0A?xBy@~1CC*.CCBC CJB*"u?3C}CPA@0A?MCC1@N4CB,CBXOCBɎ BBx?Oh1ChB`A@0ANRCp3v@'CB|$CBzCB%BB{?A*CGBpA@0A?٥C@nlCqCeCxCˣCxCBwCt|}?HkCCA@0A?z2C˓H@ CBCBVCBmНBB{?, C"BA@0A?lB@{ZBQ4BB&M4B;B'M4BAJaCr?B*64BA@0A?<C Z@4g C"BcYC>B$C@BqA@Bf{?" CtBA@0A?ۡCS@7CLXA5C XAC XAHOB+HC{?"7C%bAA@0AZB&@FBcBBgB%BgBAYCBs?6yBmBA@0A?B>8@]B8 C9B; C|B< C+rApC:z?CB6 CA@0A?C|@E)CxC}"C xC}B xCPfaBB{?n)CxCA@0A?qnB A AsB(AsB@eBsBlMBsB`Z]?AIB@@0A?nC6l@CŝC.eCCѾCCN~CC|?]fCi+C@@@0A?xAA%@.C4rC7 CyCCmBCmBC>7C>{C@@0A D:@DYCx DXCok DXC@XC~?YDYC@@0A?C@(CC:fCg.CCg.Ce%C\C}?C?C@@0A?DGp@DqjCUD uC6D uC!A uC~?nDfrC@@0A? oC}z@bCP_CY3CgCJLCgC?cB1~?-CȃCA@0A?=Cꏛ@C)BC/B@C/BlA/BL~?@C1BA@0A?C>@FCCCzҡCCzҡCCHBC~?aCC A@0A?+C1=@`CCCXCMCXCd*BXC |?0ŊCC0A@0A?EB &@DBfzCBOCBOCĹQAOC#i?ĹB$C@A@0A? }C<@C\C}NCWCNCCNCŌBNCf|?jC@LCPA@0A?[C@;AC.*CYMC*CuC*CbB*C~?r"CS*C`A@0A?xOCy@8ICxYCDCQYCSCQYC7vASYC|?NHCXCpA@0A?[BAn@B#BʤB#B C#B\B#B?Sr?ƥB|-BA@0A79C9@^7CxB[C[xBۤC[xB㈃B\xBP~?aCmwBA@0A?>C-^@ CTAdCbA"CbA/IcAbA0lx? CGAA@0A??B@45KBbrCSEBrCE BrC`BrCsk?APBsCA@0A? B,ː@ B>CB>C]wB>Cs%B>C#k?VrB7CA@0A?4?BIA@Bu/CéB$Cm >ZBcBbBfsb?B!CA@0A?B@ABUeA;BA@0A?BB@n@D%C[yC7GCJyCUm_BJyCB%By?A%C8CA@0A?Bc@ .B3BhıBCBsBCB @ЊC(To?ڹBSBA@0A?ӑB@/BH-CJήBH-CBH-C AH-C(t??ɳB,I-CA@0A?XmA3A B^AC(CigC(C:ARCF}?胳CC@A0A?%VC*.@YCdbXCnC;[CVC;[CBB;[Cw?C ZC@A0A?5CA@nCICC C D Cȼ4C C~?ACCAA0A?>&BZ@Be[CBBXOeCtBXOeC;CB_=EBf?BaCAA0A?^C @,bC%C*sCW#CCW#CtBW#C{?;nC#C AA0A?C؝c@MBCtRCD!CCCCHCCDo7CCi9|?}FC.C0AA0A?B+_x@LCMBnqECPBC!&&C>C< C>CXPA)A{?(CG!?CAA0A?*FBw]@#BئBdBk BQBk BE Bj Br?ʌBBAA0A?nФB@q#BVTyB%B'yBIB'yB$A'yB<o?E,B{wBAA0A?IfC]@JCJCE}HC}JCcC}JC{0]B}JCTW}?O&JC7CAA0A?Cل@CBCBBB͎)A2C>z?(CBAA0A?A[,AsB.BtB-BԫA~_C\PB~_C.?tB-BAA0A?B@@B B)-B B>+B BBoBC&t?43BBAA0A?!JB)AN:BoAM21BJA2;BLA @nAf?R;BQ[AAA0A?ڒB Aj#(B C5'B C,B C#+B Cl?!(BC@A0A?kC2X@9TCC +CDCsCCCBCC[u?:CvxC@@A0A?C5@CC! ClCcCWCcC* B1C2~?4FC C@A0A?mdC<@1CC*CLCoCLCBLC-9x?3+CC@A0A?}C.F@%C^CC:\CC:\ClA8\C*}?]CoZ]C@A0ACU@ﱛC CCCt_CCѸB諿B}?ÚC~C@A0A?C@sCTBSCeBZCdBB!C|?( CJcBAA0A?B=m@BџCtBxC*~BxC}ACQO?aBcCAA0A?xCem@TdCvCmCwC|CwCӑpAwCL|?RuCKwC AA0A?4C=n@gJ$CNCCNCK@CNCjBNCAy?PCLC0AA0A?Bdq@BQCpBQsQC6 CQsQCXiBQsQC_d?3BPC@AA0A?[dC,C@HLBCnC>CnC CnC3BnC$|?ڜFCemCPAA0A Cޖ9@hCVFB8 aCFB6TBFBj+CeCz?gCECB`AA0A?Bqd@ptB0pCeXBߝpCBߝpCpa?pCx?B&ooCpAA0A?-¨B J@%!C<Ac8 CqAZAyABObNCwu?fCAAA0A?.CjQ>@!-CC+$C'C2C'CjA'CJ#{?r-C:CAA0A?BAdAWB=OAVB_@VBAՔC"!?TABAA0A?gB%@vBJC BJCZBJCRA&ŻB8ps?sIBICAA0A?o_BB@vvB2B68wB&BB&B B&B.k?wB BAA0A?3cB0AN_8BC7BC,KBC#/@CY?}8BCAA0A?bC+@DB}BB}BJC}B9B}B|y?BY}BAA0A?B!|@>BcCZBcC]BcCd-BBux?/B:dC? A0A?@D_ADDeBCDWBC@CCC& CX7C& C>/B& C}?%C:;C A A0A?h:C%9@MCCB<CBBB|)CByC[4{?čCB0A A0A1C R@CBH%C^B IC^BGfB^By? CB@A A0A?CY@DCܨB>C BB B>BHjC8z?pFCBPA A0A?۲8CYa@;CAN CA6]CACB Am{?C"A`A A0A?"C55R@rCwC0aC}CtC}CA}CRpz?CϮCpA A0A?LC7@CJ@[B@C@an@@w?^C@v@A A0A?wAA)A/CAI/CmVA%ױC'B%ױCM>A0CA A0A?BN@!BYBM B&Bf=B&BB&B\? !BBA A0A?B='@iB1AkB~4A6C}4AB|4A2.p?DjB=AA A0A?TB@7BUC|BCWCBCWCQBCWC]Mn?BZCA A0A?{DC#w]@ֳ>C'BCN:C'BC$JC'BCPA'BC.}?6>CBCA A0A?fB*@ӟBBBBBB̖A_C"w?BWBA A0A?s8Bɴ1ABgB qBgBAgBjBCDi?ȇBB?0A0A?vC7@wrCC޼aCJCDCJCY3BJC{?cCN)C@0A0A?aDCɣ@@CBUC QCɧC.CɧC BܓCz?#IC1C@@0A0A?Cg<@ K2Cv"B~ 7C%B_B%BjiB t]CHJv?& 3Cl$B@0A0A?5C[@CCC8C3mC8C@8Cy|? C-jC@0A0A?iC齫@CCE+ClD,CiC,C\;B Cޭ~?C++C@0A0A?WC@ Cp>Cb}XC0A0A0A?ڃ4C"W@HCl:CC:CzHC:CAB:C]y? GC:C@A0A0A?BW@C&B6ICޙBBܙBKE7BxC4v?(CBPA0A0A?}BA0vBRCqBRCBA]KB7B]KB:?qwBÔC`A0A0A?fBؚ@BzśCiBțC4AțCiBCKn?B|MCpA0A0A?^gCg@VS3CjC*CĶC4CĶCjBĶCq|?K2CCA0A0A?2CN[@z8CͬC?4CȬC{BȬCyBY C]{??8CICA0A0A?BFX@&BCBC HBCfAaiC8g?u֍BCA0A0A?bB0@:ubB+BgcBBGBBAZCZ?|bBBA0A0A?^B>K@B\C\B\ClB\C ^@+#BTw?2Bs\CA0A0A?#6Bk'AXB|BBBtA!C+C!C+i?BBA0A0A?ϯvB:!@BcTCBhTC2AhTC:B5Cwx?BAiCA0A0A?]BOAhBŒ6CTBŒ6C3FBŒ6Cc@J0#@am?ViBэ6C?@A0A?$CYAm@9ClCHCtvBYxBtvBKBCt?3ACeB@@A0A?mBCN~@U CE:PBC7UB|MZC7UBȷB7UBɇt?JSCSB@@@A0A?Ӑ\CyG@f+C;B_.Ci[B|Ci[B_@Bg[Bx?i,CUB@@A0A?xC@C?1CoC]NCJ C]NC(uB]NC"}?0CiC@@A0ANC|@/C&-C!3(C .CiC .C7B .C7y?7$CD0C@@A0A?*C I@tB6LCBULCPCULCBULCv?BwKC@@A0A? 1Cq@C C\BCC)lFCC5TBCw?uCXCA@A0A?t[C y@odC N6Cb[C 6CRC 6C!A"@z?efC6CA@A0A?%0BN!@zA?)AcA9ApA7AARC > AA A@A0A?C^@;B)FC維B)FCJ)CC)FCB)FCr?6\BFC0A@A0A?8B?@[B$B6BTB ҃A)C*B)Cj\?C&B©B@A@A0A?%C8CP@ߗ$C\A*!C\A#C\A @\AE{?$C@<[APA@A0A)CñJ@6C-rC^/CqCCqCZMA8C{?@5CDC`A@A0A?ԤBUA1 BBgBIBL&@C"BC3Y>!BBpA@A0A?iBW@BB!B>B!C>B麼B>BSt?OB(BA@A0A?YBb@AUC!A2C~B2CߥB2C+o!?ܟA%CA@A0A?bBnܭ@oCaCy CKC,ۀAKC'B) B-v?ԵCrCA@A0A?;CDZ@ BvuC܆BiuCACiuClBiuCwx?'BuCA@A0A??C!jj@8C5CC5CB5Ca@j?z?C4CA@A0A? B:ARB CB CLaA CAC{3;?oBܜCA@A0A?B@yBvC\BvC!BvCٴAvCNr?kyBm}C?PA0A?z=CqAGC pC2CJpCCJpCLCJpC~?׷CpC@PA0A?-C9EAbŠC~w-C"C.C C.CByCBd&COBd&COA1CdAo?B&+C@PA0A? (Cb@ ;C#A:4CSA CSArBB9e=Cx?=C*@@PA0A?qCC!ACS_CACG_CCH_C^BI_C~?JCѳ_CAPA0A?gCz@pjCkCfCkCq CkC^BkCR}?GiC]CAPA0A&B[@^BG C,fB CSB CJAICm?B3;C APA0A?[cBU@~B&A^BABA0A^LCp?BA0APA0A?#Bri@z+C0C (C0C8KqA0CWCZC$y?n.CMC@APA0A?ECPS~@#&CeC CCJcCCBC+:|?mn)CCPAPA0A?K0NC!m@|jC*KC*^C]KC"59C]KCBຼA|?gnjCqKC`APA0A?"IB+h@B|2BʜBn2BnvBp2BX#Bt2B@u?Bu6BpAPA0A?F0C:[@ MCd:CJCa:C\Ca:CigB @|?TmLC:CAPA0A?!CB4m@MB_CB_C8B_COMA_C"x?LBOCAPA0A?JB@ӼlAAlAD AA^BD A_"BD A2?άlAAAPA0A?Cs@1}BCnC=BCnC|CCCnCroBCnC{?+BZnCAPA0A?PBI@NTBB>BBBBWABN3x?gBqBAPA0A?WBNAB8ByB8BB8B*6A'NXC@p?WBpBAPA0A?ǿSB>AQjBECVBICz4BICkGA%Cn?:iB3C`A0A?BФ@C CCoCCpGEBC;B4C? CC?`A0A?XAɳAےBðCBCBfCBfC?"BC@`A0A?epBeL@B: CB C֢B Cf0B C&*/? BC@@`A0A?#C @C8B{CB8(CB㝸AB$v?pCIB@`A0A?&C}@ C0CC/Cz%!C/C A/CRs?CI.C@`A0AHCWn@tBBZBBĂCB\CBWYw?ζ CSB@`A0A?=\BkΧ@%AŔCAMC㖪AMCǗ@MC>- AC@`A0A?!BK@M*B|BKB(B\B(B3OAĀCs_?ϑBBA`A0A?5CO~@CYCPCYC)gwCYCAkB }?CZyYCA`A0A?3sCQ @2C1?R-C1?C1?)C1?#+}?|0C˳C A`A0A?:B5;k@<^BC)BC}BCbAC{k?uYBs[C0A`A0A?!.ZBk@4wB2?_$B? A?oCFBl5C]?nBY?@A`A0A?sKB@iBP;Bk[]BBzABB+C`\A7=C@pA0A?B]j@¯B*)5CZB)5C9^B)5C~wA&Ô?hh?YB|6C@pA0A?1mC@CC\fCCCC2ZACes}?u8CC@pA0A?`%CTH@/1BR@nB.=@+^C/=@ B/=@w?'BLC?ApA0A&BIF@CAB*BBB/tBBBAЉC(vx?C|{BApA0A?tCmPE@߰*CvC&CC@'CCAFeC {??,CC ApA0ACK@2)%CbeCxCaeCuBaeCnBEBy?c'C*eC0ApA0A?5PCzoV@GCB6=C/B5]C/BA/B)P|?CApA0A?\B@HBqB@=BjB%_BjB$A6~zCo? BpBApA0A?Bɪ@6BGBgBFBNBFB׉AFB|{?23BBApA0A?ANx*A!B9hBdB8hBIΧ@9hBAړCg56?"BbBA0A?B5@^B4CWB4C5B4C@{@4Cݕ? B4C?A0A?l3BJ;@I]UBC/_OB|CC|CB|C`?1emBwC@A0A?gC=$@CzMA#CMA0CMAzÐBMA}?ԆCj VA@@A0AfBLG@8֐BC=BC^lBCDCBC9h?jBmC@A0A?(XC^@sDC sC.?CsCj kCsCE/BsC:q|?|DCosC@A0A?SQBrF@ CAEBg| CEBoBEB|ABѕC y?r C\B@A0A? BD;@ǴB CC(bC>CsSB>Cb(|?{6C%^C AA0A?*CՐm@$C8BBjCBdCB""AB`b~?&C B0AA0A?<Cp-@%CXC4CXCBXCژAxcB"z?d!CeC@AA0A?uB^|z@جC}AmB}A B }A}BCCXv?CkvAPAA0A?AH2CbC@FC8[CFlGC<[CC=[C:BB|?S3FC-[C`AA0A?ȂB@_BCC:B$1C|iB$1CHBFbCAt?B*CpAA0A? tB@JAICȤA^CtqB^CxB^C)?wAזCAA0A?9 BA3AAA*AA+A5-Af=KC?,A""AAA0ABē@r;BVo'CpBWo'CBWo'CAVo'C!w?&ABp'CAA0A?NB @C/hC"C/hCUB/hC9B)PB}?C7hCAA0A?p BKA@䰴B4=&CDŭB*=&CB*=&C>=&Cmv?YB-&CAA0A?\(@C C>(@C\yB>(@Cs?ֶB.1@C`AA0A?zfB@BGCƵBGCS_AGC(BŜAs?ֽBҔGCpAA0A?AMX)A5AA B;?qACBJACB(@bCy>DAHBAA0AqSB[@BC $BCoBCvACx?ƜBCA0A?U*Cu@̞C]5qCY5ő:CY5PBY5?ȽCx5?A0A?sYBG?}9BFBy5BBJ*BB2@C?N?75:BB@A0A?/^A3@C@vyB?Y@wB+@ZC,AZCD=Ý@]KB@@A0A?B6|@bBd"CגBU"CٳBU"Cn ARB/s?ŅB"C@A0A?mCT/G@N$CwC#CwCBwCv)BBz?g%CwC@A0A?x`1CR8K@QC tB%CtBVCtBD BtBEz?0CB@A0A? AM@pBBrBBbAyC(&ByC!?ppB&B@A0A?B@zBz B0#}B>Bw?&BsvBBEBp;BtBnCtBjZBtBBOB AA0A?qB?C@B~CB~CB~C?~C u?ZBC0AA0A?I%A AAVC/AVC1G@C-AC>XAٜC@AA0AAABAXpCT#AXpC2XAXpC;(@cqB?1A]OpCPAA0A?7A@3A("Y?A Y?k0A!4CcB!4C?hAeT?A0A?B+@h#BCBCJaBCBCNi?~BC?A0A? ]B8@J6wBޱC(wBC? BC{Ar'C0L`?++wB˭C@A0A?UBf@52BB12B9BB9B/TB9Bb?f3BB@@A0A?SQB/@ذBcC_B]C/B]C@Cs?B[FC@A0A?BY@BAAxBAABAA4XA;SCx?SBA@A0A?{A#@/xB?:ChwB7:CAntC!BmtCKC?xBC@A0A?sB@ qB{ BBb BB` BmBVCx?Bg B@A0A?JBue@`TFB"B@BBCBBB;Jm?ݍFBBAA0A?mBY@4BHQABmQAsBoQA[3ApQAn?!B NAAA0A?IBeo@LfUBALB?AJB?A9A?A5l?0TB^A AA0A?BtA69BL7C̱/BH7CXAH7CAQf@]?mt:BD7C0AA0A?2B)@ B.@C)~B6@CB6@CDFA_s@A1w?B"@C@AA0A?KZBsn`@B{B)B{BB{B{A{B;[|?BoBA0A?&CA=BBaBBZNCBRBB?>BB?A0A?BHT@qBUBCWmB^BCMzB^BCkC@^BCƟi?$sB}BC@A0A? CJ@J 4C'7C0C$7CZ B$7C'Bk@]|?3CƤ7C@@A0A?sAA:~AECEvAHCHc@ BA!B n>iqAC@A0A?cCiP,@=CCCCBCɱABz?"CC@A0A?6Bali@BLB6BLBBLB^B-SCr?:B*DB@A0A?B @CBC<ѳBCJBCB`Bt?vBԜC@A0A?++C^@HB7CVB7C^C7CB7CY}?BA7CAA0A?Bq[ABjC)BjCBAjCy5ACڨC?= B=jCAA0A?޷AA=*bA{'C{FA'C?'CE,AOCW>dAI6(C AA0A?0B 5@CɷC*BʷCH3BʷC?o'Cq}?CﻭCA0A?/Bs@+B5 !B)5>B)5A4C?@9B5?A0A?PHBAkANrC/QA`rC9A`rCh@brCJ72?*ADsC@A0A?jBʗ@JB#UCʐB UCB UCA!UC!w?7BGC@@A0AA=6AGAs%C=A]%CE@^%C"t@ܬCA>|HJAk%C@A0A̕NACAA0A?g[Bs@nBJBYCBMBYCbBMBYCUA2 BTv?;BKLYCA0A?iB@_LBB5BBҺBBAB3?gLBB?A0A?rAB@B\͔C㍌B[͔CEfoB[͔C&Aj5BJv?BǔC@A0A??B@K.BD1B:BD1BBD1BtA0Q`CF$|?dB|1B@@A0A?{4B͵ A\V@BCG@B3ABn9ABٯ>@bAB@A0A?A4Av1B6LB́!BC4Cw*D4C8cCC4C?C4C@@A?ojC o@[?lC4Cg]C4CxwC4C`A4C? eC4C@@A?_C@WCbCC\CCAC?CC@@A?>C9l@B!78/C(i7P`C(i70DB(i7X?"C Y7A@A?6EDyAD6D6DA4C?FhDA@A?C@^C6 CY6CY6@b]AY6?[Cd6 A@A?͵ C-@$݀BC_BC\CC$CCׁ{?gBC0A@A?C-Ҳ@yBl77C 7C 7v@ 7.?8C#X7@A@A?CAAmlA7A,@C?@3Ct!@3CdB4C C4CPA4C7?B4CpA@A?x3lCe@>CW"6͎C{#6VI?C|#6B4C?vC{6A@A?v|Ck@]CBO5+XCO5ӐCO5BO5? ZC"C5A@A?B,@B4C[B4CUB4C`P@ &7?B4CA@A?5B}@5B3Cc)B3C`uB3CgB3CGi?0B3CA@A? sB[ALC`6B^6&,B^6lB4C}?D CW6A@A? AlABݸV6BV6EA4C6B4C>-#BR6A@A?LBgAB4CLJB4CorB4CT B4C?)OB4CA@A?ߺAiAA3C A3Cu`@CEAC]=\A3CA@A?Cи@rB&5)?B&5p&C&5l9B&5?vB5A@A?A6ZA-B4C]A4CxbQ@}%7VB%7%?jB4C@?@A?u*Cߥ@;&;CK²C C͛Cc|C$BB$B X\CICg{v? |CB@A?@A;CR@UYC6B[C B5C BɏBCUCnz?\Cg`BPA?@A?CB۲@C`_BvCCB/{CCBA吀CDc}?CħB`A?@A?zcC.@|XCĭB\CRCBkCBABf{?;]CBpA?@A?tC^@0 BCOVB8AޚCA?@A?±A~8ABuCqBuCLi@B?$BBΏ?BuCA?@A?N}WBIAjBSXC^BSXCT,BSXC޸HANBok?`jBdXCA?@A?$rC]@C)CC)CZC)CA)C}?C)})C@@@@A?aCp@(C>*$C%NCr%C&kCr%C Ar%CWy?TC'%C@@@A?$2Cc@f,Ce}CL5Cw }C"Cw }CuABWw?;C}C@@@A?{CSw@nsCNC Cf,]CCQCC"MBCz?leC|!C@@@A?~m2DTt;AX.D C!DCOBDC CC/H?&DfC@@@A=DԊA^DCQKDzC/DzCB=LC<?RDO CA@@A?oC%hD@BCCRClC3X2ClCq8C7C!{?oCCA@@A?C#@XCϐBc{C BC BCP|C3~?sC5B A@@A?p|rC9@YlCnʁC:cC4gC9zC4gCA4gC@&|?bCC0A@@A?C4`@CtCCLCCLC_"BLC#(}?CŒC@A@@A?F+uCU@+CjC+CCLCCCCz?,CuCPA@@A? cC@,BrBBnrBCnrB3BnrBp?BmB`A@@A?BH1AxfAB{C:B{C=A/WBނB/WB>^J>BzCpA@@A?UCP`@-C~B (CBBB7BfCWx?I-CwBA@@A?#B@B(C>B'CRөB'CZAO CEt?]SB CA@@A?MB@C7CB7CKB7Cs>=Ag@2x?\Cd8CA@@A?ŎBi@BB[BB+BBaBpCn?{tBBA@@A^$CuJ@BBEB0BKVC/B;B/By?3BzCBA@@A?BBݙ@CCKCC-BCPZB{Bby?!C镃CA@@A? C')q@B–C|BC CC-AC5_z?}BCA@@A?i5B|9Aǭ ALC# A\C|;A\CUVG@\Che>A.ACA@@A?C@BpCBpC!CpCbBpCO|?71BpCA@@A?w^BR!Av8BcCK'BcCpBcCБAcCBj?g69BdC@@@@A?"B@fC,BeCFTBBETB6B$uCGq?G%CvyB@@@@@A?Cl@BC'VAGC+AJ C*A1`AAR}~?9CëA@@@@A?[kC^=@6WC?B>CBDΆCB˝BBy?FCB@@@@A?BC9@'CsCC&TCC&TCG4hB*C}?)ʾCDC@@@@A?C>@ChaA]CՃ@ (CՃ@ *BՃ@)X}?C/@@@@@A?dY(C)]@)CpICCXC{#CXCAXCدi?C4SCA@@@A?pcCaF@wC +C,C%CɫC%CٟA%CY{?웑Cz'CA@@@A?C+Z@OC﫯CDTCjCUCjCB&C|?YCYC A@@@ACy@C@@'C("Z@FC%"Z@_TA!Z@r}?-ۗCۊQ@0A@@@A?`BSl@+CVX,Ch C@1CLB@1C4B!ϲC!m? "C0C@A@@@A?HC?ۣ@BC BC CCCCy?8BmCPA@@@A?VDCDY@*C6A.&CAXCA#GBA6y?1C@A`A@@@A?CF~@ABX#LC^BILC:CILCGAILCrt?^BTMCpA@@@A?;C̀@!3C]BÍ-C#]BqkAC#]BnA"]Bz?\5CߔBA@@@A?^BrD@sBsCanBHtC\ BHtC xA$:C3Z?pB CA@@@A?wBO@͸ CAUCWCUCBUC>BndBzw?CTCA@@@A&Ce[@CFC@BCrFCCT1BCبz?$$CGCA@@@A?6CErj@nC_Bd[C_BYWC_BB_Bv{?gC;BA@@@A?J,Cp@CÃAC)CACpCAC4AAC^{?!CTACA@@@A?[B+AATz,B4yC-B/yC#A/yC6B]\B2?,ByCA@@@A?ȠAA AKG*C(AOG*C[UA#CB#C}>|OAS*CA@@@A?IB2A#}BOCoBOC#BOC AOCM t?L|BBCA@@@A?BZ AB8(C'~B8(CB8(CmA8(Czw?ʋB(C@@@A?CF@ CA9CBurCBBfZCq}?#CB@@@@Agr}CdD@RCBC-DC B@@@A?, D9@ DMDBDhx B$] Dhx B/AVC~?DFB@@@A?*C4t@C8CCuC7CvC`AzC|?CCA@@A?WBVrq@$CKCpCvCAwCh4BChh?C!CA@@A?}93C/@w)CnCNC CIrRCPA@@A?wEBl@ CYByBjUBbB`CbB BbBwjV?0jBWC`A@@A?eCCy@-CBr*CBUCBDj-BB~{?M(CO)BpA@@A?6dBp@5BiBBiBfBiB˅ZBfڑC~o?BwBA@@A?2nB:@C,BC,BoB,BB#KCw??CBA@@A?WVB@JvB>C}B3>C5B4>CeA4>C^m?1B?CA@@A?ʢBN@B4 CBCwBCxAJBr?u9B[CA@@A?C@,BB BBh.%CBNBBs?LBdBA@@A?>1CT^@BC\BCوkCCBC&{?B:CA@@A?gB-A1N$BRטB$BUטBWZBUטBXAUטBS?W#BgBA@@A?FCV@[BiZCBiZCsCiZC)VBiZCXw?H?B|ZCA@@A?A8AK/BfC֐#BpCzp?kCB8LCNE?#0BԼC@@@A? B1v@_C)dBaCBBBDfwBC1j?DCB@@@@A?B{1@dCKC1 CVSCAVSC5vCAXn?1CQC@@@A?C@Ch]CCӄOC8CӄOCB&A9"~?C+SC@@@A??C@dC\#CC9!C~TD9!C1B9!C,~?C8"C@@@A? C+.@֓CBӁB BC BA BV?BHB@@@ACE@4oC:BČCB.CB0IT?B${?1CBA@@A?̿HCmM@o=C?BC4C"KB3?VC!KBBKB.|?=CZBA@@A?_xBth@*fDB1߉Cs>BU߉CoBU߉C[EAU߉CX]?+?B$kCA@@A?4C9r@CCҁCCwCCBCa~?9ŁCCA@@A?B \@RBt=>B-9=T!B-9=TuA 4Cx?dBGb<A@@A? B-:AA=CoA=CA=Cs@{ C]?A鬠CA@@A?ִB@VB a@̡Ba@ҶBa@/(Aa@s?B*@A@@A?P'B#HA26A&?B$A8AB@@@A?CEQ@BI(CbBL@J1CL@3BM@n?BWC@@@@A?WC@^gCITfB7C4sB"C4sBuB,pC|?ԟCUoB@@@A?xBR@@BBBNiB @LiB ACnC2> B6ZB@@@A?IEC(@iCtB-[CV8BCV8BxBNCcs?aC`B@@@A?)!D-@.DUC(/D?1CD?1C)BCe?$/DC@@@A? B@C؁CPKByCh8@yCgB͋By\?Bd_~CA@@A?ᏛC@<\C7.CɧC"%C|C"%CXBȬC{}?Cј(CA@@A?CF@ۖCC CCCCn9BC!|?(C GC A@@A?"܍AxA@zB] CpBCΊRBACuBACh[>pBC0A@@A?6eB;@A CJB C+8B B>8B ?/ΘBM\C A@@A? CM@0Ct5_CL,CaCCaCB>86B6w?ε*CxbC0A@@A?CKA C+ŮC-CCyӞCC]B)C(R~?CwC@A@@A?Cx@\7CC-C~?C.C~?CB~?C;~?C(CPA@@AB0@~B_ BB^ BkB] BfBVC dm?$ByB`A@@A?~yB@eKB^qFC2BqFC1@qFCOBČAQf?KBLGCpA@@A?xB9n@h-C䁄C*CいCQBいCDBB`qz?t1C|CA@@A?ϘBE^@9BxCԞBxCHB CxC `oBxC'q?BAxCA@@A?eBz@; BGCAB>CB>CeMB=Cq?^BCA@@A?s C y@ C^B C~B-C~B@Cy?ܫ C(\BA@@A?<#C_@PTC\ѦBC_ѦBo8C_ѦB1?B^ѦB٨{?CڦBA@@A?B3@PBqCIBmC<CmC]BmCx?]FB`CA@@A{C(@~ CCOCCBC*WBC{?R C*CA@@A?ڛB@B,oJCB,oJCZB-oJC-!fA.oJCT!|?}B}pJCA@@A?.Bg@~BB.BB]BB‹?Bv?BֻB@A@AƳ|B&Y@BUeFCCW7C@KBUn@kECUn@B?=C;C@@A@A?}BX@KCCCC?CCNCCsS?C C@A@A?CK4q@xkC؞B{Cj2B Ci2BBf2Bz?EtC-B@A@A?8BG@ACkCPoC[C7B[CBBn?d]+CzcC@A@A?}Cُ@ϘC$CCC[ףCC%ACUo}?5C'+C@A@A?CC@C4~CCCnmC+CnmC6CnmC]}?ZCCAA@A?XB6R@UtBAB@BBBBu@PC]?B2ҪBAA@A?BZ@v'BcB2BLB_6BLBuA:ZCng?Bx"B AA@A?{}C{Ħ@xZCͧB MXC2BBC2B*B2B$@|?`CB0AA@A?uB@ϣBPC]BblPCBblPCT)BblPC %e?˛BOC@AA@A?C}@C7LA-CcAaBbAAALCt?CAPAA@A?sB=½@IB?C:BC!AC>%)BVgBS?WBEC`AA@A?6C @tCBwoCBϢCBNBBKN~?tCBpAA@A?hB}@HcBC=]B-CS"iB-CH>@-CD)^?]8gByCAA@A?H`Bȑ@H\B5BPPQBB;Y BB)A2C G?\B:BAA@A?pB}@$Bm?B?B?A?0u?IBCAA@A?YB1c@jC@yC@~B@ BР:Cw?CF@AA@A?H,B.A,@˶CJY(@~C:@~C >~C_=Y$@xCAA@A?.B#Aȣ&BC­&BCACA#C'CC?)%B+CAA@A?RB@|BynC?B&ynCX B%ynCHSA%ynCjZs? BHnCAA@A?BB@BB]BB]BQbB]BdB.~Cx?IQBGBAA@A?DqBO-A_*NBLDC AA@A?B{@IBCBBIC -BIC R@'Bc0?ξBB@C0AA@A?^C)sW@ CbVC\ CdIWC'BdIWCFA% B}s?nC2YC@AA@A?C~@#CF?iTBHC@ A@A?*C@@CG@tHCQA/CRACgBkGCy?KBCAvA@@ A@A?!D zBAzUCxчBjDl;BR Dl;BAl;B6?CB@ A@A?C#@ŲCJAUCACAkAA}?bCA@ A@A?T9CBv@v C6oC)CdCUPCdC%k}BdCt? CGhC@ A@AxgC4@ŹB_CVBRCCRC>BRCTc?(BixC@ A@A?nwC ɉ@ iXCgB]CyB=.CyB))ByBZ{?)^CBA A@A?N"Cͪ@yC>CC>C7C>CPL^B>Cu?C+U=CA A@A'C@WkC2@~/dC@+C@PB@M|?gC@ A A@A?u>CYRA_BC BbXCCbXC;CbXCZp?ԮBC0A A@A?yC7@ nC-C[iC`CC`C 6B`C}?spCƾC@A A@A?4ZB}X@yBƚC!A&BA A@A? C _@CtCPCzC%CzCuRAzC{?CLCA A@A?|B›@wBXBABBhBB^A"sCu?VB߮BA A@A?x'B3\-A;MBh;CA0A@A?ZB @8XBSC7QB'CeaB'CA'CqD?DYBSCA0A@A?2zB[@B? B~BBABT B-XC7?BB A0A@A?#kC|@XCărCUCvrC0{CvrCPBvrC7}?YC.qC0A0A@A?,CV@EClQC> ClQCFCClQCת]BlQCx?|C8PPC@A0A@A?B>BGu@=BAy9B5 A[3B9 AB= AZ?H8BZAPA0A@A?zKB<@iieBq$BK`B$B&A$BpAJ{C\T?͸`BB`A0A@A?Bd@B=uCBfuCvPBfuCJbAfuCq?hBTuCpA0A@A?bQC${@ːC wC(CwC`CwCAwC~?ÐC|%wCA0A@A?LB_@]mBC?LB+CNC*C?FB*Cu?BfCCA0A@A?׍.CQ@'C~+Bp(C}+Ba/C}+Bl@}+B^|?c'C#+BA0A@A?GJ C跀@OBuB[B?eB"C?eB.bB?eBVy?BY_BA0A@A?Capm@kCPC?CNCWCNCQbAOCB|?fBCQxCA0A@AaB5 AV19BA2BAG\PBAb@A [?:BoAA0A@A?ABU-ACBBBB >_xCdB_xCer?TB,B?@A@A?5B @T8CsC K3C hC&@AC:C?Cmm?2CݘC@@A@A? C{@:!C3C!!CCBC`~wBGBs?\!C^C@@@A@A?t)CGא@8CC_EC_C<C_CH`B]Chx?FFCC@@A@A?gBV@B{CVB{$C4A{$C#^B=C;A?=|B-'C@@A@A?D AD#BnDUB- DUB;BVB4>?WdDB@@A@A?Bc[@BB-BC5BVBC5BR| BD5B`?!BB@@A@A?7C@MfCbCCrCʐCrC*@b9CR}?68CCA@A@A?(C=@B9CjBSdCBSdCߘ@RdC q?jBۙCA@A@A?B[@B@BR@;AL@B9Cl?BBף@ A@A@A?}CR@,C45AM C+4AC,4Ai(BC=C5~?cCQMA0A@A@A?dWWCq@1-C:3JCg=)C2JCC2JCB2JCl|?|.CHC@A@A@A?R3CH;G@ۭ/CջB*,CIB:5CIBiADB|?K/CuBPA@A@A?шB@dwB)ZsABA@A@A?yBvd@BlPC"B7PC9B7PCAC s?>B̓CA@A@A?eB@taiB?1CFjB<1CM[|B<1C@<1CJWd?iBP1CA@A@A?Bq@ԮB]C)B]CnB]CFA]Cv?BMhCA@A@A?jB1ʳ@HBCBC.BC~AC@&o?BCA@A@A?A1ATA8CnA8C.A8CxAzCD%*?A='CA@A@A?t!Bn-@B2hsC6`B2hsC{B2hsCdӆ?9hsCJx?B"fsC?PA@A?}CA)CPICCCuHC9 CuHC'aBuHC}?5WCFC@PA@A?*CPb@sB2.AB0U AԁC0U A B0U Auk?PŸBh!A@@PA@A?=:BKsp@B6BbxBFB)CFBkAFB0p?BuB@PA@A?rC1A4C~BC|BC|B%C|BO~?[CeB@PA@A?"OCPn@(Cyy;BY"C=BC=BkR BbcCFv?+CCB@PA@A?<C AP%C_C?CpCUCpCXBpCVk~?ȴCpC@PA@A?UC`@8BC BCtCC(FCC51x?#qBVCAPA@A?/*CQ@.BB8 B^B3PC^B[B]B]x?xB BBAPA@A?ԑAu@uAEBYA4EBnANVC2dZBNVC^R>BB APA@A?GA*AAC ~A:C@ѡCA BѡC6>4B>C0APA@A?ؘ6Cs7l@JlCECvgC6C"C6CB״B׋}?joCҵC@APA@A?^&C[&G@&C/ C*C, C&C, Cq@, C7{?='Cb CPAPA@ABk@cB BHB BtB BB Bq?BZ B`APA@A?;C?@>_CxBYCxB8CxBsB8rC}? _CFxBpAPA@A?C@@b C`?C3 CM?C*CM?CC@M?C[qy? Ct`?CAPA@A? 4AA{AcC|AC(KW>CyA|C݊>EwALCAPA@A?;{B@)ҢA'CUAm-CMqBm-C Bm-C$?A;CAPA@A?ZBʫ@+B5CB۵5CZB۵5C?۵5Ct?|B5CAPA@A?B8@иB6IBıB6IB;B6IB[A6IB x?kB5C@`A@AzCC@r"CXBCjBaCjBBjBY"~?QCwvB@`A@A?9CA@=w2CC8-CgC`QBgCQBկBNy?z 0CwC@`A@AcCb@mC]@hC@YC@{A^8CW}?nC@@`A@A?4CŌ@CXC.C\XCqC\XCzqB\XC}}?C]CA`A@A?:BJ@ B'JC7BJCDCJCQBJCq?BjLCA`A@A?}kgCV\U@CaC|CaCNCaC6B`6By~?C.faC A`A@A?zCz܅@$;CC6CCCCCCa}?]9C'C0A`A@A?VBv@NBpCFBnoCrBnoCX)BnoCQ|]?LMBbC@A`A@A7B @niBdUC ?XB _CB _C/A _CMX?_BfCPA`A@AƒCM@V CZyBʗC~yBxC~yBj-A~yBq{?, CB`A`A@A?AV}B@N{B CuB C&A CW\BzC&g?ɫB CpA`A@A?+BIߢ@ BΒCBΒC@BΒCqj?:Bk?DBrCA`A@A? Bki@BFBGCByGBXCyGBmAyGB,Gx?BdGBA`A@A?pB@WBJCBDCp;BDCA Co?ԖBCA`A@A?Cl@x %C.)CÛC0)C C0)CACcI|?$C )CA`A@A?BJCA+BC!BCEKAC A C;O?2,BlCA`A@A?- Bk@Ə-BQpUCn1BZpUCBZpUCCB[pUCs p?;E-BOUC?pA@A?MCLAC&CC'CC'C?'C~?TC.BC@pA@A?mBd,H@B>C&BlCBlCRAnCyu?B DC@@pA@A?XC|@TwCBrC.BC.BB.B}?OtC_B@pA@A˙C@ŊC@ScC@ԩC@cƉB @A~?-C@@pA@A?BRG(A.ݑBEB jB2B0tB1BA,CHZ?CC>CwC>C(B|*C}?ޔC<C@A@AiC1E@'RCpJwC+LCPJwCπCPJwCUBPJwC|?,SCvC@@A@A^B@B!7BێBi#7BCi#7B$Bh#7Bm?B)B~x?׍Bx?vCx?)Bx?x?lB@@A@A?;C$A%C,bC#C-bC5C-bCMfB -bC#?;CqbC@A@A?ѫCR@rCBmC,BPC,B|C,B~?x4tCB@A@AAAuA=CnA=Cc@AݳAA/>A9>CAA@A?pB@\+BdB$n$BQ eB@K eB*BCmC(?!.B?hBAA@ABg@ĥ.BtCZS'BԁCgɹ@1C>B1C?X2BC AA@A?/CI@'TCN{UCKCVxUCOqCWxUC%uBTB&}?GUClUC0AA@A?$ CbB@vBC>BC6%CCWBCy?uB~C@AA@A? QCZ_>@C AC9C ACC AC@!AC$z?#aCbACPAA@A?=B(Nc@vBL!BQxBH!BdRCI!B"SBI!Bcp?wBB`AA@A?< CUN@FCWPMBbCLBd!CLBALBb{?UC+LBpAA@A?\(C,N@Z-CCD?-CC%CCfaA ЦB;}?-CδCAA@A?LA92A B }$BB}$BI@B]CBC]C> Bqw$BAA@A?'߯Bڜ@j#BCEMBC}BC*BrCy?JBCAA@A?XBb@BbA@B bAB bAA)BbApv?BJbAA@A?SkC@@CBAC@A@A?cBz@Y3BҫC(.B,ӫC(>B,ӫCt@,ӫCM?0BfC@A@A?.B-h%@ KCB' CLBkBLBpBCw? CoZB@A@A?BZ@pB'B}BB7BB^A|C8u?B'B@A@A1gCHD@CB|CkB5FMCkB>B[lYC}?vCBAA@A?x#B֦@}:BC\2BpC1>ApC$BZC0?hK;BeCAA@A?VC!c@HgCCP`CCICCA%C"~?+gC C AA@A?BQ@pBDC~BDCYBDCbB@CjBk?MqBڨB@AA@A?hBu@1UBdC WBycCIN>BycCK@ލB^?VBL_CPAA@A?9C@BcB71BLdB,CLdBBLdB v?3BpdB`AA@AB[@,gBC/BCp!CCBCx?;լByCpAA@A?yBι@oBxCaZCJAo@W5C¶CB-C,CaC,CB,Cc|?P3C>șC@A@A?=cCR@# \C7;UAXRCVA.pCVAAVA4}?[C`A@@A@A?B㽃@vCۅCuBp΅CXBp΅CA9B w?CcC@A@A?BSB@KBCvBˠCBˠCF:@ Ct?]BC@A@A?Cu@-C?C,CCxCC!S@C-z?CC@A@A?SB2@ B̚CBBbӚChvAŦCܲBŦCn1M?BC@A@A?ۖC@8(CxCӶCxC$CxCAxC~? CRCAA@A?4BL@ C;ACI,CCCQ,CBQ,Ct9PB(Cz?iCb,C@AA@A?#APAA[{CxAVCŒ@uCvBuCQ>A!CPAA@A?uAA\A߸2CA׸2C@׸2C{Al\C ?A$2C`AA@A?fÄB@A,BA,BB,B &B,B=?AtBpAA@A?(BY@̊B_ C؄B_ C`B_ CaB_ Cv?}BsAB: ?@AtCAA@A?Bݫ@ BTCBTCAwBTCxATC{,|?\B;CA@A?1hAA1ACACsZAB[7AB>HAC?A@A?Bp@B:!CA B!CHB!CB!Cxu?EBQ} C@A@A?z8B@-@B-CtBfC BfC;5?" CtKy?BC@@A@A?6Bs=@mCCBC A?i C}Bn Cru?jCC@A@A0#Bq @AO6$CɄA'6$CA'6$Cg@C#?1_A#C@A@A($BU@HBCBGCBBqBBBBb?aGB B@A@A?_Bu5@xBʄC*B(ʄCBMC(ʄCaB(ʄC(r?#BC@A@A?Bޟ@BDnCBnCBnC BnClj?rBUmCAA@A?LB.@KB XC;B XCB XCA7Bcs?BlXCAA@A?wIBV-@ RBM>CRUBF>C'BF>Cf5BF>CPr?(B4>C AA@A?B7f@؊2BDCw2BDCyBDC=BDCjId?Z2BDC0AA@A?BTh^@ BCcBC`_BCAC҅v?BC@AA@A?d4BW@TsB[CpBXCCXCaBXC&s?vsBӊCPAA@A?hcmBsq@~B[CtB [CjB [CAA [C!M?PB [C`AA@A91gB@4BbCpW,BbC'wBbCmAbCh?s55B}bCpAA@A?JݶB1{@kgBN9BVBD9BzBE9BۼARCɵz?@BBAA@AdAp,A B]BCmBaBCAaBCлA„"CE? BPCA@ABCHA-B4CWB4CYC4C,~B4CP?6B4C?A@A?`B@&B1C䌳B1C~B1ClȃA1C(s?BKC@A@Ã,BjjZ@5ۇBbjBiBjBzQ@jBWBC10Q?FqBB@@A@A?.AP¸@h[B#CZBަ#CSApӫCϡBpӫCk?v]BFX$C@A@A?GA%@nBXCM;oB XCA"BB!Bm\ ?FpB-TYC@A@A?ǨB!O'@]BC*xBCFBCAOBo?B|C@A@A? QCs@B>Z"B>1 C>A>y?B}7>@A@A?%C m@DBeC!BjzCJCjzC BjzC!{?JBLCAA@A?ByT@׀BgtCހBQtCiTBQtCO5ArB#e?Q̀BXNtCAA@ALChU@FC٩@C2GCӪ@CMCӪ@Cׯ@Ϊ@CJ}?~FC@C AA@A?B.@!Cv]Cl Ct]C6Bt]CBuBQN|? CUC0AA@A?^%3B@MBT4C,YGBT4COϯAT4CAm'>%>M?[NBc4C@AA@A?"B^@wѻACACACSP@C ?{TACPAA@A?$AB%AwACaA Cq"@ CA3B??-tAC`AA@A?=Bm@ BS1CBS1CBS1C@穲C{?jBMQ1CA@A?zRALaAʵAC|^AC?BAB>AC?A@AB?:BCԛBCBCȜ@Cw?BC@A@A?ICJ E@/mC1^?J(oCǛ?Cƛ?kB8 5C ~?mCy?@@A@A?f BmYe@B큩CBuC@2IACBCT?nčB^C@A@A?)CZ@C=Bx"Cdh=BCgh=BBā?YcCQiz?8C,G=B@A@A?KB@8@BWBDpBBgBBxoB'Cp? VBޖB@A@A?yUB@ #BCw#BC1BCT ^@C".M?F"B&C@A@A?mC$JZ@tB/C!B/CWmEC/CB/C[y?B)/CAA@A?XBI,c@GBBSBgBBgBnBgB<0]?ӞB,BAA@A?EAnA> 0BehC=#+BRhC@OSB[ 5BGSBY.$?50BhC AA@A?A[@RA.uA#"AsALQ@sA9A@B5eC,B5eCxlwA5eCLw?BeCA@A?B7bABQBRBC܌MACB4CyY?OBC?A@A?BABfB2jB+Bct@+BRAJUCV?l'BB@A@A?rB1@B=GC#BTGC>BTGC\@A&x?LBGC@@A@A?KxB5B@N$B>C BDCBDC߹@rChy?t BѥC@A@A?AE@B=TCBTTCKI@UTCcAMIBP?BSnTC@A@A?%%B6s@B\CC)B37>B37>FB37>!Ce?0B@CAA@AAAB~[CB[CA#nB5B#nBa&?bB2C AA@A?"B-@BmBqAɊmBBˊmBI?@ϊmB@Y?B_(nB0AA@A?ءBT@HBYҊBR2B@ҊBtB?ҊBԖDB?ҊBwq?CIBzB@AA@A$nB馺@BCʇBCr=BCsFAI+Cw? BGCA@A?QU$BgQA\LBBTFBBPABX6ACv[?6nLBB?A@A?A´AAMCpAMC@4BuA4B>bACC@A@A?mB&@cZ C$?C?"B?7B4Cy? Cҩ ?@@A@A?@B#AB#C ͢B#C?B#CgZ(BCj?=B1C@A@A? Be@x-B CdB/'B9CdBv@IpA@bA(u*C]A7u*CįIA:C"B:C?:A*CAA@A0C B3CC?B3CA@A?=AqB JAxB4CB4CNB4CR>B4C}?B4C?A@A?=HB1@PZBƳCsOBƳC BƳC@A3Cj?XBճC@A@A?%fBf@,CB0=CB BB"ACC'1}?\CtB@@A@A?lB@B#a~Cq؈B"a~C)B"a~C]DA"a~Cnx? B[~C@A@A?JBP@Be_C8Ae_CQ Be_Cb@e_CO? BV_C@A@A?#A@4ARC.yARC@RCAAf(?*ARC@A@A?SAB{@+B~C9^B|CIB|CA?Cl|?BCA@A?-kBFA:BCiBC&}qBC:AB?D BC?A@A !B>Ai AC@CAC>AC>& A]C@A@A?:&BAھAUA짬A,VA-B-VA7gA-VAOlG?ADA@@A@A?LB@CRC#BRCEBRCxAǥ$Cc}?*CUC@A@A?Ae5A2BBw$BB@BB/CR? 3B[B@PA?BnA#BC6BCAAB}BBBK)>BC@@PA?[AC+@8CCZCC8'CC(;LBB?GdCC@PA?`ʷCo@԰CB;CBCB( BB? CB@PA?5CZ@fCBCBs؎CBHBC?CB@PA?27C?Dm@<8CC)>CCx:0CC^AB.?>CC@PA?h+QB(@$AC*BCjABeBBa>ưBCAPA?<&C|\@6CCB1sICBxCBBC?'GCBAPA?CC APA?&CbT@CC,CC&S.CCLVCB?CC0APA?;4CE@zCCl-eCCCChBB?EiCC@APA?x|BzAP}BBUhBBAC XBCAPAC>@'BB樫BBkKCBBB?PBBAPA?B@/CBCBBBP~MBC?GUCBAPA?ѹA]2AW|BBr}BBٝAC/BCxjJ?|BBAPA?pCO@:CC3CCBC$qBB?:CCAPA?8BA"8dBBXBBbBBTBB?^cBBAPA?BZ&AضBC BC8CCīGBC?BC@?PA?9B<%@-BBC‘BC6HBCACu*H?8'BkC@@?PA?(C@.CrʏC8$COCCOC^sBOCKL~?jC]C@?PA?DCN^@C' CC B C B)zB B}?CB@?PA?D_AF D(ATDACAbxB#FC?ADA@?PA?6CV5@CG >AJB@@PA?C}@CCֺ@CeCQC,CQCCQC5~?@ECkLC@@PA?C @($C3tBNCBCB`AB{?"CƹB@@PA?.C@CC bCCPCCALzCw}? CDACA@PA? D@C)BQDoBC{DoBgBoB;~?5)D3BA@PA?B/@k[C:AbKClABΠJCqCΠJCq?^NCQ9A A@PA?mB@i|$BBC?U7C& @U7C>V7C'Cd|C{Ci|CCi|CQB@i|Cy{?>C>|CA@PA?F/B+AԳ"B-C(#B-CHA-C(?AѰCI>?%u$BE-CA@PA?--B>0A!ACAC[]AC AeCh}?jA:CA@PA?A4A`B'DCB 'DCvn@ 'DCAW8A8?RBKDCA@PA?ҙBiABB;BBŇ@BBTBf"CQx?-BրB@@@PA?V'C@DUC*CCCCRBC~?BCTtC@@@@PA?]Cj@qCC%fDC&&C&C&&C/SC&&CS{?|OCcC@@@PA?g{RCw@C pCcdC)gCz6C)gCB6BILBz?uCiC@@@PA?wmCb@&CCCCtCCALAY>AxAgDC ?qB(DAA@@PA?iBJ@B,C׈B6)CA6)CBפB}Z?BCA@@PA?C`h[@ACt{B/C~B^C~BA~BW~?ŊCƴBA@@PA?xCKE@r]CrqBv\C~rqB=C~rqBANBrqBɵ}?%\CpBA@@PA?E]Bw AJBBYC"Bp9YCO,Ap9YCT/yBBg?SݠB,YCA@@PA?9CEbm@|=C0B=C0B z2C0BM2A$C}?==CTBA@@PA?0B@}B#ܥCB!ܥCzB!ܥC=B!ܥCnp?P*BԥCA@@PA?V՝B@SBCBCBCAA1'C<y?BC@@PA?9@Cp@v \CC;CCsH:CC_7?|B{-x?FDC C@@@PA?8 DX6ADCwDCmDCVwBC^??DC@@PA?_CM@DTƥC CC DCc1BCݪ~?>CNC@@PA?+C~7@?C^tC'AC C C CLrB@C0s?XC^?C@@PA?Ch@ŋCWt2CӅC7CC7C.dBGz@{|?MLCZ6C@@PA?T DZ@TD`dCBY D gC; D gC@@*LB ~?ADeCA@PA?Ce@CBÍCpB'DpB@CpB~?x[CBA@PAYB AVB%C.ljBCyABtBBT ?XaBC A@PA?LBzy@BĆ@)B>@4KQB>@3B8C R?%Bq@0A@PA? CT@ACi!C(CVC5CVCrr?]C Tv?CgC@A@PA?vCʆ@'',ChCޮ'CCOBCLBʁ-CCx?+CPCPA@PA?C @C BlApA@PA?C{@AԴB_COBcC-CcCNêBcCit?sBcCA@PA?ӮBş@ЊBCeBCV_BC BB=ep?BnCA@PA?1C'7A@CS) C}C* C8BC* CD%B* Cz?S"C, CA@PA?*nBʁ@?CBCκB BκBOB.CĂz?WC cBA@PA?'XCm@ tCAtCA$7CAwkvB]}RC}}?uCAA@PA?cB@=A,B.A B,B BB BLC? ADBA@PA? B)-@1 Cy?BDŽ C@@PA? `C:AyӕCCvC-CXC-C.1CX.C{?XCOC@@@PA?DyCVn@5 _C;Cxa^CCcCC<+BC z?i`CC@@PA?f7Cr8@ FC+HBYKC9UB$!BbC^BA_B?x?2CUBA@PAkC,@BA B\\AHC\\A2C[\Ae?O~B AA@PA? C18@BRC3CU:Cs;CU:C ?W:C.p?BC A@PA?<6:C)M@l^ Cu6BrC4QBUJC3QB BB3QBt?C%JB0A@PA?8C-@_C CԺC,C^C,CͩKBXCL\~?C#C@A@PA?`BW@ CClC'C!B'CEn)BBr?$CkCPA@PA?qB@B~C>BlmC8BlmCQAkmCõn?B-C`A@PA?zCw@CC(CC7 CCWBbBy~?oCCpA@PA?5A:)AJ B~C}BmCKA$C7oOB$C">+BVCA@PA?Ch@'}OC"C6?IC7CC7CC8Ch}?N-QC1 CA@PA?MB@BkBgkCr~\BgkCCgkCVfBgkCe?phBAkCA@PA?6B?@{BBB7BBRBB0AB~u?LBRBA@PA?VB=@ʴBfBYپBfB;BfBAfBt?ƁB2fBA@PA?6B@ߍBiCBhCaUBhCA@BpzSBw?BhCA@PA?A{Q%AkAӔCAӔC@OB H BOB>#A CA@PA?Q%B:=@1C:e|C8C8e|C\ hB8e|CkBnʐB${?C_|CA@PA?OB@B!CB!C%B!CA!Csx?BC@@PA?C_p@CgBѦCECB,CECBb;AC/|? ChAB@@@PA?EzHC^@+CChCCECC}BBIv?P rCpC@@PA?P1C1P1@XCETC4C\(C2C\(CA\(C1k?K C#C@@PA?KC̽@;C]@e C `@іC `@kB37Ci}?@C(@@@PA?p>Bm@OACy B^CN(@+B#B+B>W;ApC@@PA[CŅ@ژCrBCZpBwCZpBOB\pB7~?aCRqBA@PA?fC-@CCHC 1CCC 1C(0Bb Cr}?+CCA@PA`C=@CC)C CDD C?CB!CW?~?CC A@PA? B_@ƛBroC BK٦C(|BK٦C(XACдY?*BĦC0A@PA?ZC@jCg@B.pCTUBNBTUB:AVUCv?PC(õB@A@PA?C@3OBCBC,%CCEBCUe?S[BCPA@PA?C@ˊCЬCdCҬCRCҬCBҬCC~?CIBA@PA?"C@ CtC@xCsC"BsCh@Cg|? CCA@PA?DBG5A?PBB9BBw%BBj@Cx)e?OPBB@@PA?C\8A"XCC C>*C2C>*C[B=*C(\}?KC~;C@@@PA?гC;O@=CACAT{CAg3 @LCB|?KtCEA@@PA?NDfEA DJBUCHBDHBcɔBHBk~?D B@@PA?ݑCqh@\CmACAjCABHCO|?CA@@PA?AC.@B\CCO\CcKBD\CcKBU{BC-y?ȍYC`B@@PA?qBd@ByBQBkBǟ[@COBClv]?jBȐBA@PA?C&@kCNB nC;BC;BgC;BҺ{?jCBA@PA?BCCa(@qLCBC^EC/C.C/CABCNz?JC^C@A@PA?C|O@)5C3CZC'CꏊC'C @'CN+}?-CCPA@PA?CS@ydC"uC){_C"uCТC"uCKB"uCZ}?fC. uC`A@PA?NsC,&@LtsC"mCmCmCCmCBmC ~?`oCmCpA@PA?%C.<^@"CKmC LCKmCpCKmCIN@KmCNy?'CtFmCA@PA?]BbnT@|B{1CfBȰ1CvmBȰ1C:AȰ1Cv?eiBϿ1CA@PA?C|l@CqBBqB6CqBAqBQ{?C[BA@PA;'CS@3C>AoCA?6CA'@BAz?jCpAA@PA?CΓr@HBTOC;BDACSCDACCDACw?B#CA@PA?LC @ЅCpBCtBgCuB >AGXC`Q|?uC1BA@PA?7B(@|BBˤB"B4B"BdBɳCk?{B* BA@PA?>A.3AN#BoapBB+apB?QpC!BLpC\>?t#BgoBA@PA?56Bn@eBAC^BAC*BACδA\Az?nBAC@APA?C٫NA2C!sBC[BAC[Bu$B[BV/~?^yCjB@@APA?rC@SCB CBCBBB~?,?CLB@APA?橋CWɑ@}CBܿwC[BĖC[Bf'WB[B{?t|CB@APA?ղC.ܣ@BC{BCC눗CC눗CYhA눗C~?^BCC@APA?ԩ*CR0@ };CډC6~/CCVCC AAbBqx?30CC@APA(:C^'@5CC >CyC)CyC6AܼC-w?i9CrCAAPA?GRYCCB"RBqC{?QC)B0AAPA?~+Cp@KCcA@AAPA?B5@vBnlC@pBnlCxBnlCe@RaBO_?zBYjCPAAPA?B@~B+B롾BBoBBjBjCnf?+BhB`AAPAXBCfK@fJB2BǠBk2B^aCk2BCj2BLw?`B0 .BpAAPA?04B*#t@+Ce֥B%CեBbBեB?BnuC:y?tZ+CB*v@B՝ClB֝C B֝C*MBC2l?|B=CAAPA*XB @6CBãA B@ãACBãAeBCãAn?ׇBAAAPA?{Bp@O1BvSB2B%TBhB&TB]_B&TB`?W2B!TBAAPA?Bb8A-ACACKaACA'B?AقCAAPA?Bk/@B)C,ӛB$CB$Cn AJFCq?!BCAAPA?%Bn3A BCBC:>]BC,CA7Cts?}ŔBC?APA?hmKC@CWCdL)C4oC_C4oClmZB4oCiw?JC gC@APA?ϕ^D7ApUDECSD C|iD CcͳB C?k0RDC@@APA?PBk@+BhBApB2BB2BfƚA ŘCi\?ѨBWB@APA?C AhCֶ#B=CxQBDxQB6UCxQBM~?CBB@APA?Dw@C\QA;CJRA' DMRANBPRAL~?"COURA@APA CT@bCLCCCC!CCBCJ~?;C@C@APA? P_C>@ChOCgCNLCCNLCB1tAwz?CCLCAAPA? Ct@CXBVQCǖBCǖBBcC7S~? C: BAAPA?XCl@B|\C{ BT\C1BT\CA?m\Cas?6B `C AAPA?w C m@GBNCЯBMC17CMC!BMCg?gBVJC0AAPA?^ICfNR@xPC< CJCA1 CsACA1 CQLAC{?cKC C@AAPA?8?C*_@ CXBC깍BHB깍BBzC;w?)CBPAAPA?kCS@:PC_sbCœC^sbCrC^sbC5A\sbCz~?CobC`AAPA?&Bف@:BױC9BBC?١BCBXC]w?*BCpAAPA?lBc@BC*B.C8 C.CF-B.Cn?BnCAAPA?{v CH]@]B5JC̰B`]oA঳BAAPA?/CzU@4B/CRB /COC /CdGA /Cy?VB(N0CAAPA?B@'BBCYB6B,*B6B B{Cm? B؟BAAPA?AuBi?,B[ UCAAPA?WAo>AAZ)CA@)CJ@@)CɝA C?,}A(CAAPA?WSBǑAPB1]C A1]CkB1]CA1]C[?WBA]C@ APA?_>C]@CV\CpbCZCDCZCuBB9~?Co[C@@ APA?JB&@(BB.B)'C4A)'CbBC?_?BjB@ APA?C߮@v&C3&BICpBDCqB1CqBݠ|?C.Q"B@ APA?LC@_CDC{C"CC"CB"C8k}?CC@ APACP@{1C@C:CDCCDCq!WARCt?-CrC@ APA? CČ@öCBICǝBزCɝB|8.Aj'CTe~?֫CeBA APA?"CC@M@i*C4C&CC5 CCABBqx?$CCA APA?CiV@CZ BCB^CBkAUCZu?ClB A APA?gCK~@/ECC>CCZCCbBC/}{?C~?ZC^B`A APA?a|BCfj@y!C]C>C]CucC]CzmB]CC{?j CC\CpA APA`PB@BwABy:A׾Bx:AׇAQNCq?1Bk5AA APA?_ C a@ BABALCAt-BAy?uB(AA APA?:bCPV@ uC dC6wvCdC ICdCZ1BzBBй}?ttCƫdCA APA?B^v@BC?BXCrCXCB-@BFdzCABCLBC\B~k3CY?S=BkC@0APA?'Bl@YB>ͱC{B?CB?C^4A|1C6q?BIJC@0APA?̛C=]@BCTCC\CΧC\C\WB\C}?CjC@0APA?BH@+B\B$CVB7 CCfB7 C0B7 CdtS?VB1CA0APA -Bg ABAĜCBUeC6BCACC0"E?BꛛCA0APA?uaCN@BnC BcC!CdC]`BdCo?BJC A0APA?Ai(A.Bbو@Bˈ@JA`F8CQHB`F8C>L$B<(@0A0APA?5+C[Q@-\CBΉCKCQΉC%:CQΉC2BQΉCy?a C;C@A0APA?AB\@yB<C8[B<C|A<CG@RCN1?|BCPA0APA?puB2r@BBLLCnk A\CA0APA?]A:Ai B~hC BhCw @hCKA)RSBơ%? BiCA0APA?BB`@C[BWCߣBWC1BWCjAWC(y?OB`cC?@APA? NCߛ@0YCNCTCCnL>CC1kAӡClZz?SCZeC@@APA?hB?@Ia6B\$CJ.Bn#Ci?MBn#C@o#C5(?l+Bd:#C@@@APA?RC[@*C%B)چC\BխC\B BWC'|?dCrB@@APA?giB?@:~B'CJ}B X%CA X%CC!BC=?Bq C@@APA?\BLq@ BCuBC2xBCxwAJBo?BC@@APA?CEAHXCЂB OC&mB^-C&mBPIC&mB~|?INCd$B@@APA?B;=@әB',BbBķ'BBBŷ'B:@ӷ'Bk?B BA@APA?nC?[@CAeB5CBBߞCBB'CBB{?DC;BA@APA?@_CC~@?>QCeACELC!ACC lC!ACm2A!ACUt|?2NCbs~C A@APA?B5AACełA2C+,@2CZAcB{>=AvC0A@APA?AA~BxC$BxCAGBPYBGB~>BXxC@A@APA?׮'BB@~BhCwBhC3@hCBcB9CnL?BCCPA@APA?B@B'$B0BaB&zBaB:PA|Cf?BfB`A@APA?1C*R@DCC}=CC!CCeAV%Cw}?eECޣCpA@APA?Bb@BBkBrWBWkBBWkB]AnCBx?BkBA@APA?7B8ABB`BcB`BAClC_BClCSR?ڢBaBA@APA?1B@}CC3WC C8B C\ BQ3BS+z?QC'CA@APA?gBy@ƙBbC_BbCFCbCgBbCMv?1B]CA@APA?B#A#BA\C[BD\C`KAD\CA qBm,?<_$BWgCA@APA?YB~DAt*BbCU BbC5ۭAbCΒA;BWU? +BbCA@APA?uAΟ9A0 BC%AC$_ACAbBx@?BC?PAPA?PC)OAB*CƭC*&CƭCpCƭCÏBƭCy?)CĭC@PAPA?l$BADBBK?BB@/C6QB/C '?>BWB@@PAPA?N6C_@QC\BJCBUCBCBivUC;Iz?zMCB@PAPA?RՕBU@]q CgC<CC0?CRCkCwGh?>, CşC@PAPA? C &AC B!C BzxC} B~C!HVC=}?MBCB@PAPA?>A"VAj$AsCAC[A33/CdTB33/CM>z8 BC@PAPA?bCȬ@ܠC{B2C{BImC{B3B垀CG~?kC_BAPAPABa@9.CBC *CBCBBC?UC Bv? 1CwCAPAPA= CGh@C*xCC"xCuB"xC`яAE.Cx?C\C APAPA?;kB@EBnfCBpABLfCkO~BMfC|sANfC Z? ABXjC0APAPA?Cr7@ǸCC CCR%CC6ACz?iCyC@APAPA?B<@s`BC BC3OBCYAQC{'i?1Bi*BPAPAPA?. BuxS@qB*C^BCBCA Cv?BvC`APAPA?@Br@BDB)BDB=]ADB_kBCr?BoBpAPAPA?ˆCn2L@*CpCCpCtZ CpC9AáBz?,FCegCAPAPA?BT@BgBBA{B`APA?ڈC%AC5`C5+C5D,C5?LC35?`APA? C@JbCSC|YC|C%TB|Cr$CV#Cuw?dCC@`APA?Br@B'AXBAG?BAFA NC9X?BA@@`APA?QC8@ܗCC-CC1CCPA;B2}?~CBC@`APA?yiC}@Ɨ9CHYyCI:4CVyCCVyCBVyCe{?>P2CDyC@`APA?.aC'Ӽ@QD`CoC1\CoCL`CoC@oCJ|?eCJRC@`APA?'B$@5'CD8C[#C=8CaB=8CB@ w?q(%Cŕ8C@`APA?'CP/@Yd!C^ZCC^ZC*C^ZCu^A^ZCuy?P_%C^YCA`APA?TAA BTIC9BHC@r$CLPBr$C>; BMCA`APA? C/@eCſBj CBBBkAC!'z?aCmB A`APA?C) (@ *B DiC5BCiCkI:CCiC\BCiCzy?BھhC0A`APA?nJC%L@5C#SBC7CfBC:BfBCBofA\Uy? C9BC@A`APA?[B@!@BbyBۍBBi.AB͟4BEvCa?uBBPA`APAF[Bs@YxB-C׾B|-C @|-CmBBgj?BC`A`APA?FBQ@YBKABJA+BJA>@=C,)e?"B.ApA`APA?AAxBXByBB+B#BuCzBuC?ՙwB*BA`APAԵ COGe@AB= C̽B C.C C̟B C/x?~lB CA`APA?B@BguABhuAGBhuAXcBVCCe:r? eByAA`APABǥ@MWB`iCCBjiCXBjiCBTAliC4u?BXjCA`APA?BU@}&BפCwBդCBդCbAԤCzt?fBbCA`APA?jB)+AEBCZx5BCBCL5ACpo?WEBCpAPA?FBH2@%BC BCϿBCAC?UBC?pAPA"Bˁ@B;BB;BB;B1&AbC:Vo?BX3B@pAPA?Eb C|@( CC{CCCC Ű@bBR`w?CCC@@pAPA?>l9BLApB ܮCb|B(ܮC۔d@(ܮCnBP)C8? BRC@pAPA?ZC՘@5VnCA gC^A)C]AeB\AM.}?YnCv@@pAPA?Cu@CayCLCVyCCVyC=BVyC~?CѭyC@pAPA?߹BX@BCBC\3_BCOwBWCt?B%C@pAPA?$BCAPA?:BVuG@, Ca b3Csa3rBsa3x8A4C? CC?APA?4=HC|@TCSbC9NCfbCNCnB>NCH0HC>NC!B>NCy?|BNC0AAPA?mB@BB띵BBr(ABӒBCϦi?_BŨB@AAPA?_BB@vB;xBBxBoACBC[id?'BBPAAPA?B)k@BڞB烉BBw6BBeBBp?QBB`AAPA?.Bj@ CHTCO CDC{BBDC`IBB JB^?HBxC@AAPA?CHW@BD>4AC5AvC5A-@5A>z?rC>7APAAPA?sBEy@,BA|tBDACCAhBAAsv?kϨBؙA`AAPA?ECY@z:CѻC9CлCKMCлC AлC;}?b;CCpAAPA?$Bmh@BCCҬBCCCCCBCCa1u?BCCAAPA?Br@B0tRC䚥B/tRC+B/tRCB{AIZv?έBqRCAAPA?EB"@" BU)BPl B/)BB0)BB0)Bm?% B)BAPA?^)@4@8BCxACA4CvB4CGX=jBC?APA?]0C(@PC 0iCFCA,A@b@BzW@B=@CJBACm=@B?APA?4/C|>@BVCBfVCVdCfVCBeVC{?gBVC@APA?"C4@;PC=5CIC=5C\BB=5C'B6?&}?JOC35C@@APA?G$C|@Ct%CCq%Cr-Cq%CQAp%C|?<C7%C@APA?4iBҤ@WBECBECK@澏AB辏AdDp?BEC@APA7B>@PB#CxGB#C#B#COB#C\Up?YBC@APA?dB[r@ܡB{CB{C(A{C~nB=Cb?tȡBpC@APA?p:BҰ@vBB>BBL,BBhAC9hb?BdBAAPA?BDB@B7BB@7B'B@7BT@D7Bo?lGB8BAAPA?3C1@,XCjgCCygC/FCygC-BygC[|?DCgC AAPA?DB>@B OBB9B鮆B9BhB|Ca>x?XB B0AAPA?-^C~C@ p)Ce]B^:)Ce]BBe]BǞBlYkCzl|?)C7]B@AAPA?O&CE@H CτCxSC̈́C+C̈́C[wĀC,|?y C~CPAAPA?t Bk@wB!CDnB!CfmB!Ca_=CBSRj?[dxBh%C`AAPA?q WB8@^6BhKCS,BaKC$`BaKCGOAaKCl?m7B1CpAAPA?VAMA"B$CB%$C@XC''BXC/,?#B)$CAPA?:Ah@B3CB3Cy@C~*BC' ?/ B3C?APA?B$@BAHCBAHC#BAHCA) Am?BIHC@APA?2 Bd#@B3sBBrB)iCrB"ArBv?baBB@@APA?dBke@B CɋB) C#,B) CgA) Cv,?B C@APA?$FCIr@QCB`RCBh4CB7A*qC}?;nQCB@APA?BY@[HBB*BB4ABBh{Ct?*BB@APA?A|iAJBC BCF#AC4QBC>P BRC@APA?A AwAܛC!;ACACBCݙ>bAcCAAPA?Y9BP@ BFCCeBaHC8:BbHC}A!Bty?YB(NCAAPA?C6@MB@CB@C%l6C@C֙B@Cz?+B@C AAPA?]CtLU@2hC(B_ZeC/Bi8RC/BA̺Cz~?%hCB0AAPA?K|BJ@B;BXB;Bl^B;BAC n?GBB@AAPA?K B{AxkgB̟C9]B˟C/@̟CRB CW?(gBDCPAAPA?w"Bއ@J:BCdBCۀiBC AyCx?qBC`AAPA? BzAxBfC/AcC2AcC>@BG?BCAPAB@IBCq˔BCZCClBC{?[BC?APA?GC,@ CU`C+ C?^`C,C?^`CB?^`C {?G Cl`C@APA?AB@< BLCBNLCދBNLCIOAlzAu?CBLC@@APA?ӉA>\@֊BːCyXB⠐COFBB!cBB?BC@APA?C/@~BzgCkBWDgC CWDgC .AYDgCdy?JBmGgC@APA?A,@BW*CUB*CkADC baBDC>T3Bx*C@APA?*B[@D^B+B"BkB( CkB AjBy?BHgB@APA?MBn@B2CWB0CXbB0CVB^81C{u?"qB{CAAPA?BL@aB"B3B"BsB"BB"Bv?B BAAPA?`B(8@BZ,CBY,C>BY,CϊAY,Cs?ݲBt,C AAPA.B^|@$ABAB)BBJABD?zAyB0AAPA?eB̞@xBE&CG BD&CdhBD&C BD&Ci? BA#C@AAPA?"n BȒ@AC_A"ClB"C)A"CeD?!AJ CPAAPA??A) AXA-CA$CA$C <@̿B??ﭔA0щCAPA?B7|AB3C B3CB3C@` A3C?g B3C?APA?fBo@JBICzBICBIC*0AIC y?!Bd0C@APA?3B@>>BWB*MB^B#C^B B^Bv?ATBB@@APA?4B @sBB_BB BBJABb?y?@BǬB@APA?>AQ@[*BCE)BCr@CK BB 8?K)BC@APA?cA A@AdCPAmCr̽?mC+AB;A?VA5)C@APA?_BV@PBbC6BbCCbCBbCvx?aBlCAAPA?G+BvU@ CCc+CC_DBC:PAlB|?4 C6CAAPA?YBL@;#B` C;B!` CUB!` C7\B!` Cns?W"B| C AAPA?@A BA9=0?B> HCAPA? @B3N@7B4Cu-B4CB4CB4C?3%7B4C?APA?*B'T@CYCCB~YCCrB~YCCvAAuAO#}?MCOCC@APA?AAGACSAkC;AjCAC?AC@@APA?؁B A(AnC_AoCmAoCl0@nC*G?ANC@APA?WzBL@)BEB姚BEBBEBWaAEB= y?B YB@APA@B@"BMCL BMC'AMCkAA]M?tBMC@APA?>BS @C&sB VBMZB VBfB VBLBVBu?sBBLB@APA?x[Bck@;BCBC}BCjè@C{? B@C?APA?tAqAA1CA1CќYA1CWA~C ;?sCA#0C@APA?DAdG Ah\AOoCmA[oC@[oCLAlBw? `A4C@@?`A?'CZM@5BɕTC C6[CC6[C1?A6[Ccr?Z CQ=ZC@?`A?8C8@:@CƬxCCCCC̶BRB~?HpCx~C@?`A?tC@RսCC-CeCtKC#CtKCBtKC*|?^ѭCC@?`A?VCC@C\iC0yCroC)CroCg(BroC~y?MCOmCA?`A?3C8m@yCgC'@1C@BW C CB6B CBBPCq?CB`A?`A?B.V@BdvyCBBvyCABvyCSBBDn?gBxCpA?`A?B}@B\B+FB\BC\BB\Bul?k!ByqBA?`A?QbBP@XB C4zB C32C CKB CPp?pyB' CA?`A? ,C Q@ ,CJAW$C)A 4.C-ALAgAC{?+CAA?`A?,B@fJBm3C^SBl3CBl3CBl3CHv?&B2CA?`ASBt)@쮁B)C2eB)CBB)C=AaC9^?B)CA?`A? OA)AĊ|Bd֬C~BC9%B%CoB%C1?Z~BCA?`ARB1y@ BL@)BN@iBN@8Bx:Ct?{zB-@A?`A?uhAu+A>^BS%C͋UBi%CUA5CN[B5C~?d]BU%CA?`A?3C2@ZBA^BA ;CA޺BA#}?s#BiA@@`A?.BQ@ICNC!]BKCAKCIDBAg=?SB LC@@@`A?Cճ@?C쯅C ٝCsCn#iCsCBMB|?^ C:C@@`A?MCJh@yC'I CcnC!CE#C!CΈBCy?XsC+C@@`A?&C@|C;AtC@f;C@'C@7|?g CF@@@`A?UC&3@65C0،B GCBtCB&BBo?$CB@@`A?^nCYJ@@~BMiC_xBɎCK)CɎCgXCɎCp?BbCA@`A?9 C-;@kC C( CC.CC8_AqC0t?C[CA@`A?wC@sCuB2ڬCBCB CBݔ~?.C,B A@`AC[[N@:@CQ@CC@kAC@kA}/B@kA y?_?C!A0A@`A?dnCO@&C)uCCuCfTCuC,B9B8|?xCuC@A@`A?BŨ@z OCy!C5zJC8 CzLB9 C)Cp(Cw?^UCYCPA@`A?&;CI@B~C:uBhqC8=ChqC)pAhqC}o?&BC`A@`A?NCt@qeCHBW`CB7CBo&BsCk|?GacC=}BpA@`A?ՉC0@KBCCCFN=CQCC#CQCC&CQCCS}?$SBCiCCA@`A?kB.k@"BBCtBCXVBC^AC)K?"B-(CA@`A?l(B}AB֐C&:AC=)ACKAM\B>|ACA@`A?)'C?zf@2C %CPA@@`A?C@CdC,YCCk@CCsACx}?sCC`A@@`A?A+AkB] CoBK\ CR|A&.C\QB&.Cnv>Bӂ CpA@@`ACrb@N'DC@B|?C@BfB@BB=dCA{?,EC?BA@@`A?B:@pByBHBBBB0fuAB;4q?CB̦BA@@`A?_dBF<@mNB3C[nBBn4CBn4C|#Ah0CqB?KB5CA@@`A?yB9@eBTB֋B_B}!B_B0@CBCpo?JBBA@@`A?HJ"B&-AFBGKCCGBNKCCxcp@PKCC]7BܴtA?(? FB-hCCA@@`A?̠B@B$C61B%C3B%CZBK$Ct?B%CA@@`A=A4AK\AeͨC[AmͨC~8@mͨC]-AښC>6[AjCA@@`A?AB/AFqB^,CDgB_,C{?bB}C@@`A?COUAC3CpCl@CNCl@Cl2BNA3~?;FC0=C@@@`A?SQCy@C?CuNCBQCcB׆nCbB#:BٻCQE{?TCVB@@`A?~wB TD@z:CCCC7AtܚB+CuܚB_Q?_$CĀC@@`A?nCϔ@sDBCIȞCA} C3B} Cwj>gXBC`A@`A?o|3Ck@C_A5C^A| CC^AOB^Ay?CsպApA@`A?xOkB@B`2C(~B2CVQLB2CLCA2C-C?}RBH3CA@`A?5*C=a@/C1QC~'*C QC)&C!QCh@A'|? /CPCA@`A?IcB@BNCߗBWpNCMBWpNC'BAsh?B>NCA@`A?`&CjR@'SCx?\oCႊ?-Cႊ?ۛA䂊?R|?`Ck.?A@`A?tC5c@dC}@XeCm@OCl@Aa@}?OdCs@A@`A?ͣB@,BS|CBZg|CpBZg|C{CAYg|CBk?͑Bj|CA@`A?Ck@hC:jBbCEjBCCjB@.jB}|?uCjBA@`A?}B@ @v:BN@lB @=qB[B>B9vAUC#u?/ChAA@`AB@;E?CRXCOCBUCRBC^CCEj?s;GCC A@`A?ACȱ@~BC]|C6YC"CkC"C~BE&C}?CC0A@`A PC@ CZCxC CB C [/A8Cu?g CC@A@`A?OBCr?@2{CG CxRqC] C C] C&BϞC_z?w_|C CPA@`A?B!0@CdSC} CCaSC5BBaSCB AX=w?CSC`A@`A?B@ĴB`ޚChB`ޚCB`ޚC@aޚCk?EBښCpA@`A?21BAApC}AWoCW|AWoC="Cʶ>1$ACA@`A?l9#Cp@) Ci4CtCi4CF:Ci4C]UBi4CV8z?% C3CA@`A?; Cih@C>AJC3A C3A$5A3A:y?fC!AA@`A?B1A\GBKCA@`A?ƥC#׃@hҼCC7CCHCCػBBB}?CCA@`A?~C>@BBpB%CX>C%Ch?B%Cl?TB!B A@`A?w˳Cp@ 'C"B7CB=CBBB8}?ّCjB0A@`A?K@C@Cc8CD"CWCͰ_CWCBWC6x?~CC@A@`A?<]QB@uB CB C>8@ C6B^Cr2?%hB CPA@`A)Cq@BC}BCx)CC)ACgu?nBTC`A@`A?B@FBCBCzBCfAB6_r?BzCpA@`A?Cj@@!}C;C xC;CfC;Cm+B;Cq~?{CjCA@`ACnX@ʡB@~Bl@^YCl@ͻBl@v?/lB@A@`A?kKCԛ?@7QCv1C lJCs1C FHCs1C @زC}?SQCG1CA@`A?fC i@BoCBoC;CoCu@oC]DA*y@A@`A1Aic0AlBgOBzBOB@OBHASC_0?BkBA@`A?"0B(6ABGECsBGEC8AGECK7!B>Al?BOEC@@`A?C9@iBBBb|BBVsCBBB-Z?B%B@@@`A?t.DY0A;DHCmg/D#{CCW-D#{CCAwA,?4DTEC@@`A?SdBq@ OBXC( BߛCr@ߛCAC>H~BFC@@`A?,HBr@ BCC"ʡBxCQFA"C^B#CI.?ʗBC@@`A?:C@cJCkCBDBHBBHB9AGBB9V?ˋEBBA@`A?B@!B} LCBLC}3BLC9BwA}o?%BwLCA@`A?OnBHA BCTBCvBCAC.U?BCA@`A?/(CsP@1CIC*CIC:+"CIC AC|?i1CtBJBAJB AfC|PT?4xB LBAA`A?,-C8K@w,C”qC1%CxqC/CxqC,AxqC&|?,CL6qCAA`A?1C3M@CCsBCzCC`ACy?C˥CAA`A?hBxx@KBCOBCCCϞBCq?BCAA`A?B/@ )B};CٲBa;CLZCa;CE_Ba;Cv?9B;CAA`ABԞ@gBbCYBbC?BbC6AbCv?ԫB6]CAA`A?DB@3VBvCMBvC6BvCAvC_l?NzUBvCAA`A?LLB &A BkC(BkC]RBkCiC8CC8CgB8C}?tC~ C@A`A?×CSQ@ґCCC$CC$C<|@$C6}?iC:,CAA`A?Bא^@uCC=0-BC)B^A)BxB;A^C4%o?=HC!BAA`A?C|ACGCl?C$C,C$CKB#CR~? /C"C AA`AJXB@1BBiB~BtܙB~BÓ#ABC;C>C1vABw~?3dCiC@AA`A?HCtv@?BnaBhB(aBPCSC'aB7B&aBks?RBdBPAA`AfBL(@BBBBBB@Bogs?;¶B\B`AA`A?@2CAA`A6Cq@C yAn6CyA$#ByAqBB"ECt{?JCxAAA`AC]Z@YkBcBZB#cB;fC#cBcA#cBw?B1BAA`AUZB1;@CBmCDBmCBmCb8A:gB6p?HġBmCAA`A? BB_@bBVǽBFݳB+ǽBҕB+ǽBTpAqCott?B8BAA`A?=r&Bk B5B@ A`A?`;C`}@\CߒTC\Cz]CCz]CvښB'BRIw?oYC͂ZC@ A`A?C:@؂CӫC5qCC^CCRB1CC|? CŌC@ A`A?TB}@TB NCݨBfSC~$BfSC@B6AW?yB$VC@ A`A?׬B^h@}`C34/C \C.CZkUA.C*NCjC>x??I^C -CA A`A?-B@&#BSAB$njAz8B$njA#+@"njA@!?-BxAA A`A/Ct@0LC2OCHCUOC~VCTOC0&BAg}?ѲCNC A A`A?C@lCL@BgC2B C2BViB2B}}?slCM0B0A A`A?q?B^@ B ^C$yB ^CTB ^CH@*(Bvq?B`C@A A`A?,aIC,|@QCC\B3MCi\B"ACh\BoAAkC+}?OC\BPA A`A? CM@ CzpC> CYpCCZpC4q@JpBnpz?ACoC`A A`A?Cx@zCKOB:C`OBeɴC`OBPB`OB9~?COBpA A`A?2mC)j@3BCdёC9;CΑCCΑCcrBΑC}?tLCC‘CA A`A?- CP@YB8@C=B8@C )C8@C*B8@Cw? BH"@CA A`A?7AAA;)?bA?A4C,AB4C >AM=A A`A?4Ca@pfCBCzUB TCzUBAUB(z?CcBA A`A?v&C+V_@ CCN& CCA=CC8kDBC|? CCA A`A?~B\%.ASB/KB<B$KBOACBCD]?]B "BA A`A?B @f|BCFBCBJcBCMA Cu?BC?0A`A? |C@ `CQ^CCdC(CdCBdCX{?TC3cC@0A`A?&CC@>CiBlzCoBBoB1C[Cx?J{CB@@0A`A?YCEL@KLCaHBTPCEB$;YCEB AEBy?AOCEB@0A`A?VCy}@R?%Cj~CA C}CHC}CB}Coiy?TC}C@0A`A?/B@K0 CECCVߘC܀BWߘCBV}B6m?1B ęC@0A`A?jC쪃@}xWCu-CmRC,C{C,Ci$B,C |?n\C(,C@0A`A?|BYT@BbB`CBACBAC A!ΜCo?CyCA0A`A?nOBs@ĊBECBDCC?~A]B1~An8?YBACA0A`A? 9B@BZCɬBUC lBUC&'YB*Cc?1B]C A0A`A?[gB`@xCsACBsACBsAC:2Bb8WA4s?Bi@C0A0A`A?$Cm#g@j@BsCEBsCQCsCBsCx?{IB%C@A0A`AM[CeF@mtCh@CoCh@CMCCh@CX2BiFA~?TuC@CPA0A`A?C"P@-CHaiCC4aiC/C4aiCkA4aiCQz?CiC`A0A`A?LeC*2@ye\CfeAoQC2fAuC4fA! B?fADI}?/]CIgApA0A`A??w!(BCA0A`A?CT@tB&C_B.C<9C.C@B.CHx?GBAR\7Cs?؊BA7CA0A`A?.Bu@q^AI!BAb!BwBb!BWԤBb!B(Y?Az}BA0A`A?B}3@iBγ`CBԳ`CG{BԳ`CLAԳ`CLu?ЏBg`CA0A`A?dQBLc@SBFCwBFC;CFC!{BFCOx?f%BFCA0A`A,Bo;Am{yACP^A.CeuB.C!A.CG ?xAC?@A`A?{C,A1CcoB,CvBCvBB^Cw?^)CB@@A`A?T-Ck2AOCaBl8C&9BD'9BB'9B~?׍C#B@@@A`A[Cz8@&CK C$CC$CC dBC7Bz?'CC@@A`A?`CcA6C[͓C«C{ɓC*C{ɓC]AzɓC1T~?ƯC@lC@@A`A?i&CX@{5C))C!0C *ChC *CACx?9C*C@@A`A?1B3}_@XC!C CCBCzB\Bm?CHC@@A`A?cCeRw@fC1.CA@A`A?nzCrb@фCWC]CWC~lCWCALB¶}?qC^6XCA@A`A?JB @6BW ẢB[ AA[ A BCvo,C>CB>C/HBk*Akz?6Cq>C`A@A`A?uyBm@:BCnBz'BvnB&BvnB@xnBGw?Bb2BpA@A`A?]C{ X@C CCCȐCCBC?~?pCCA@A`AmBEE@"GBCg8BCpBC}@BBDx?>BׁCA@A`A?BE@sqB/B~qBBtoBB_?ayCe?pB3)BA@A`A?KB/@1CTC CTCoDBTCKBRBz?˧C4JCA@A`A?B;AMB<C0EB=C>TCKEBTCc=?MBCA@A`AlBZ©@B̂CB̂CB̂C_(ÂC'z?4޸BقC?PA`A?dCA@V7C8\B)C\cBpfC\cB1BؕC }?CB@PA`A?BCpAPA`A?OWIC\N@JCvBDKCvBEBCvB AlyCP}?ƻJCBAPA`A?.Bgc@uмBCUCBaUCFBaUC4@aUCt?uBaUCAPA`AEwB@B&@hB@n9CB@rA8C o?Bυ@APA`A?øA--$A2AذCWhAذC+.@-C3A-Cz>6AðCAPA`A?7 B2:A-AiC}#AaCjA`C^A`C׏?:AuCAPA`A?&B)AM4B1UCB3UC'j!B3UCE(BTBv?%B[C?`A`A?4hC@C>C8!CCBC B+1C2u?CtC@`A`A\/C@dC&mC`CC0mCDC0mCVB0mCPx?HCdmC@@`A`A?KC{@^CNCBCCCS$ACv?TB"C@`A`A?lNClW@1+CO-CJp(CO-CM`BO-CGBͧC=y?/Cd,C@`A`A?r|C@j_CECe,ZCCfCCzBC|?\CێC@`A`A?_ B@1OCA*ICA{AA%3C]A*>B;]AS)Bԥ=Cv?CA@A`A`A?nBM@,qBuB?BB+wBBe ABy?SBABPA`A`A!(C>M@,C%CL7)C%C!C%C:@B6{?(,C.C`A`A`A?B%}@NB#C#{B#C$B#C"BCSHv?gBjCpA`A`A?Bfo@^!By&C[Bm&CGBm&C@m&C`Lq? Bi&CA`A`A?CIj@6B$BBư$BCư$BAİ$Bz?BBH$BA`A`A?kBZZ@s'BrC)#B}CM`B}ChtA}CAR? 1)BCA`A`A?BƉ(A\BTCSBTCmATCuBKB:2Z? T\BoSCA`A`AFA&1A"[Aq _C!AA| _C4&A| _Ci?),B >fZA61_CpA`A?Bݕ@]ABAB0CBx@CBtD?UAB?pA`A?1Cx@2?CWC$:CWC!CWCVABz?>CnWC@pA`A?CS@CCCCipCCAh%$Cnv}?CC@@pA`A?#;C\@zCMCuCLMC*CMMC?6AY~?}CNC@pA`A?ʴC@C3I2C*UC(I2CtC(I2CA(I2C1~?TC!2C@pA`A?YBYh@ B(CB&CPB&C^GA&CIt?&BجC@pA`A?]>BcJV@!Cƫ-CJeC -CA -C-ICְC)w?UC.C@pA`A? Bdh@tBU|BfB?V|BB?V|BAsCt?BL&~BApA`A?Q C#@GC=CAC=CB=CӣBC#|?IC(CApA`A?ЦC젊@@CCCC!CC BC͂~?6CC ApA`A?hB7@BiKC!B^KCB^KC gA^KC7t?֢BUKC0ApA`A?;CmM@;C"SBCNSB&DCNSBPANSB7|?nCTB@ApA`A?Bħl@BBPBBnBBACw?BBPApA`A?$B/@ӷB(CB"CqxB"CeA8Bp?BC`ApA`A?GBL<@dBLC=dBh CBh C5Bh C]j?bB#CpApA`A?Bs0@C&CdC&CD B&CwB#LCdx?C"&CApA`A?4Cm@_0C2SB-C SBćC!SB<.BhC|?0CbSBApA`A?9OBT@UBC&BCcCC%AC{?׃B_CApA`A?BE@sBFC,"BFC/BFC6AFC){?)3BYCApA`A?bC$@BC IBCVCC4AC̼}?آBCA`A?^B8@sA3C&qA3CVHB3CCJ5Cj_>C|eCj_>CBj_>CS{?C>C0AA`A?As A݂&BRB.%BrB~&AݢC5B~BݢC>!)(B}B@AA`A?pnBh@IBǪBBȪBAȪBsmBCMk?HMBV/BPAA`A?&A~A >Bw @>B@K|A?6CB?6C$?6>B7@`AA`ABf@UsCAC|C CUWB CA@d1C\z?CCpAA`A?܎Bq@BrTBBeTBBeTB?qTBx?@.B%BAA`A?݅Bg@B CB C&dRB CA0B\n?8vBvCAA`A%gB{@<BN)C?A:)CŐB:)C$B:)C1ue?vB)CAA`A?.BcI@BUvB8߮B\vB>B\vBEAqCjz?5BTvBA`A?zIA7QA/ACZAC*۾ABBRSBBxP>OAC?A`A?Ct|@B΍CjB΍Cr>C΍Cz B΍Cy?B C@A`A33B@ϠB MCB%MC͘??C8FBICZ?BbC@@A`A?6B1p@BPTC!B%TCAdBA%BdBC?BovSC@A`A? Bލ@o&9BEC51BWCߢsBWCTAAWCM?/BҮC@A`A?LC@ B5A!BHACHA<@AHA>w?LBxA@A`A?:C@u~+CJَCH"CC{JLCC(BCR*{?+C8C@A`A?}Bn@CУCCУCBУC$AC y?iC:УCAA`A?S>C67@yaC{*C/ZC{*C2C{*CvnB=C}?aC*CAA`A?Q CN@? CTCOCTCu CTCń@TC z? C|TC AA`A?AKXA |7B8C7B^CAwCABwC4>G8BC0AA`A??3BP@,PBFBQB-BA-BBCdN? PB(B@AA`A?jMBQ_g@&ڲB)AvBYA.B\AM?AkA!s?mͱBAPAA`AV3BqAǂAECAEC AECW@EC!?wAhC`AA`A?0By@1AB"pC=B"pCB"pCB"pC=k?2ABoCpAA`A*B/b|@"BPLC|QBPLCpվBPLC?AUw?nkB3:LCAA`A?Bz@B(CB%CjC%Cx`B%Cs|?BCAA`A?i[Bޱ@Cw;CBw;CBw;C=X@@|?=CSb;CA`A?B[@6BlBC;BC@C:v?[BC?A`A?4B.@ںBZKCѰB7KCSB6KCZA6KCx\o?BKC@A`A?7vBak@\`BApBA`BBAyjAA+?WB$A@@A`A?(B@L1B3B)(BB CBܲBB 4_?t1BB@A`A?.8B@`|BKCbQrBCpAC6B CgQ?~BԪC@A`A?FCC@E9C@_BC2C=_BRVC=_Bf B=_B}?68C^B@A`A?B!Cx@~B3CbB3CjKC3CWsB3Cz?zBC@A`A?8C*m@.KC&fC_GC"fC%C"fCB|KBZ|?VYKC@fCAA`A?Bω.@DBF5CB;5C}B;5C$B;5C j?ƒBKCAA`A?\C@2@ CFBP CFBS-CFB l BFBz?a+ C+DB AA`A?'-C:Y@>WC/.BXCBBB۪BAECc}?WCB0AA`A?=rB]@iaCB}RB-5CB=BB=B&hB=B=Ch?ABB1B@AA`A?\B͌@)BkBBtBTBtBAuBcs?BϨBPAA`A?;6Ce;@MCqCNCqCcNLCqC"DBqCK|?NC]yC`AA`A?A*A0A(CA(Cq?`CKA`CT>=A(CpAA`A?gBA!BCBC^AC0iA CW?H!BgCAA`A?;B*@{HBSyBld3BYyBBXyB|AXyB7Ao?׽HB'BA`A?B,'V@J7BBJ`2BB#CBBB)?7BB?A`A?&AjD@AϖCAC9?CH}AT-C>E!AR C@A`A?=SCKy@/CBCB8BBL. A C%z?cUCMrB@@A`AZGB@KC BC B]B B AHVC8.y?pCID B@A`A?BÚ@hAcCAcC#tsBcC! BcC2+?AeC@A`AdC# @PqC)BOoCBGCBzfBB 5~?SqCHB@A`A?yBuY@6IB¬CJBC"٪BCu BC[?3JB C@A`A?JaB KA*B(SB,,BȏSB&Ɯ@hC?BhC ?S7,BRBAA`A?uBW@ BҤCnB|C+2zB|CbA?PCn?}BCAA`A?ixC$fw@sICC6}HCC ՑCCYBC}?]HCHC AA`A?zvB@BfCBgCkBgC>BB Chm?EBC0AA`A?2B2@SBCpAA`A?)B8@7BʍCBʍCBʍCA9(B/!{?o?BǍCA`A?_ԅB*K@&B4CDB4C~B4Cc=@Q%7Dy?QB4C?A`A?AʠA߆@7 ByC ByCuAy CfdBz Cag>l B/0C@A`A?}BDV@B BYB BoB B_AiBC`Gq? BqB@@A`A?-)Ci@CwD&BhCxD&Bg6B]CH|?)=C%B@A`A?BS@x3B*CنB)C/!B)CO/BPC m?M@BC@A`A?B-h@nzBUC3-BTCŸBTCDATC.m?B|PC@A`A?5C:@;m8C+C8CC.CC0&Al#!C|?Uo8C듪C@A`A?BF@{BCBCy$BCh?Cbv?/BLCAA`A?XA A3B;BntB;B*y AbC#AHCm'AHCA$C!+?B C`AA`A?\AABHCo8BHC@!Av!B#A;?~&B(vHCA`A?ANA[UACRAC29ABAB >3QAC?A`A?B+rJ@?BC+B*CyB*C̶ACw?wPBC@A`A?AwB@BEFlCٰB[lCNB[lCAnaBu?xB ]lC@@A`A? (HCߓ@>2CC!^2C(C=YC)C}B+C|?B2C7C@A`A?T$C@5C,aBCnaBN@CmaB7&xBjaBn{?%C~aB@A`A?^B@4pBd CpBoCaBoCiήABb?x/pB_׌C@A`A?%Cg_@#C|A8C|AxN0C|A@B|A{?BA@A`Ap \BO@ˉBGC9BGCJBGC)B\Ak?mB.GCAA`A+؄B @BusCξBusC3DAgA@@A`A?!XB6.@V|BB\{B~BzB~BA`ƌCj?{BӻB@A`A?E:B0@2B\@8B[@#B[@MyB:CWs?eTB@@A`A?&fA<@ƧA@BeAY@B%@CAC>GAB@A`A?Br?c@RBRBe?vBaC@A`A?: Bg@@oAEOB?XASOBtmASOBTw@C[?AB@@A`A? CN@`C6A/BACAfA A|?h[CzA@A`A?`*{Bp@xBCؐBCRZ9BCaAC1CQr?_BaC@A`A?BH@BC^BCBfBC CBCqz?\ BC@A`A?AB0-@ABABI3_BBKABa?AB@A`A?B?@IB8=BB3=BWB3=BcANϐC{?B*B@@A`A?MAM@ A&BOA?BF@?BSAkC[_?KAB@A`A? lsB!%@oBCSBC1vBC& ACA;q?loBѭC@A`A?;BoH:@'BrAGBAP}BAz*BpDC{?&BÄA@A`A?|A7@Z)BmCGBmCAK8dB_\BL8dB5?)BmC@@pA?2JDCЫ@u.CB BBĈCBCB?wCB@pA?FBZ@&BB9BBrACBC>>qBB@pA;AIACBpBB2BC^CC v>rCB@pA?DBĐ@*BC$BC_CC4ABCt?6BCApA?~C^k@O2CCM_CC`_BC CB?ELCCApA?$CF@OCBpCBCBBB?CB ApA?\UAVAEBBZUBBBCCCB>1BB0ApA?;"Cɠ@ոBBzBBqiCB4CBr?-BB@ApA?-ѰC9AcCClCCCCl+BC?)CCPApA?aB7@uxBCjBCJBCACd?qdBC`ApA?jCl@BC3BC"CCXBC+?BCpApA?DCfK@N|CCBC~9CC)jBC?{BCApA?{xEC@CC|CCr:CCCC?DCCApA?4B'@7CCjSCCACBB?aTCCApA>Ci$@=CC8CCJ>ECCKAC?WP3B?YC@?pA?ԑB|@IhC`CvC1CͪAXBG CXBR?LCǙC@?pA?!B2e@O`BCACfAChm@CAZ>BC@?pA?^}.C )#@~WC6ICP7IC@9LCD9C@9LCBA`fr?OOC3KC@?pA?]C[B@}CLhBlWCxBFVCxB@o7BCt BCBC&AFCp?5BpC`A?pA?T$Ba 1AyBFzBBsB*xBn@ CnB CH)?nBBpA?pA?dC\@jBCnBC_7CCBCx?UBCA?pA?zthC[ӓ@y7hC}C~aCC"-kCC?AC-}?gCCA?pA?B!Z@BgA'BTA{ATABSCn?B'AA?pA?-Co@:BGCEBHCӘCICBHCccy?EBCA?pA?Bv@)BWmC BWmCBWmCV>B^eBd?bBlCA?pA?C.@Bh9qCBXAqC.CXAqC+AXAqC y?aBAqCA?pA'Co@WCSC?TCNC?nCNC? ANC? |?C<3?A?pA?6C{@t6C)C./C+C :C+C#O/A+C\}?06Cz CA?pA?&0B88Aq:9B*CK,$B)CB)CtZ@RC*$Y?59BC@@@pA?*}CAQC CFC[CzC[CYB[CS!~?C<4C@@pA?Щ>BAA@pA?]Bz@B"C-6B"CB"C,M:A"Cbw?q#BĜ"CA@pA?TB#AB=CWzB*=CuykA)=CQ|BCb^?BCA@pA^&C2:M@}OCMBOCMB,fCMBBMB~?OCMBA@pA?bv C}@ COFUBS C^FUB)6C^FUB'AQiC@|?x CUBA@pA?oB>z@fBi4BBi4B1Bi4BiAj4Bow?B3BA@pA?Bv@sB&C:B&C B&C,mB&Cw?B&C@@@@pA?|NB@LhBnC1˱BRCjA3KB B3KB֜?|xB\C@@@pA?TDA)D%CCgC DgCbBgCD~?*DʦC@@@pA?C5@Ch!"BCBCB BB+z?- Cs B@@@pA?vC@RmCHCXC8HKC}D8HKC FC8HKC@R}?CZJC@@@pA?sKC3@K2CBC+aBEwC+aB]B,aBv?VCxBA@@pA?ʍB f@)Bl>TB@qRB@P:A@{g?Bƈ@A@@pA?WCA@eCsA{RCeܰA"PCfܰA4V@JCtx?>WC8A A@@pA? 2WC[I@-CC1CCCC2BC?fw?CC0A@@pA?;CX@QC>̓CMLC Ch$#C C$B0B-z?FKCC@A@@pA?Cr$@PClBA ;C A}C A]B#HC~?;wC⣮APA@@pA?_lC @We-CkCCq)CwCC;CwCCBwCC{?LR0ChCC`A@@pA?a.C&@,NCY@~HC(N@A` C'N@ylBr;Cz?kKCn,@pA@@pA?C:\~@)CUbB%CTVbBoCTVbB| BlC`{?1`+CSpdBA@@pA?Cb@4CJC&CUCCUC@SB9z?CӆCA@@pA?KB@hBcC4B>yC5pB=yCABu?6UBCA@@pA?OAA\@Cؿ@CQ@ɦCAɦC~="@<CA@@pA?c>Cu`@wC˗BeCB[>\CBՂBB)|?CcBA@@pA?ހ-B4AqBfzBpԃB0zBA@1zB`qB̠rC&R?ɃBzBA@@pA?]C@:BDȐCBEȐCz)CFȐC8BFȐCO{?BΐCA@@pA?'Co@DBwCHnBwCECgC5CCCCAnBfs?<":C&C@@@pA?=C̈@=C>GC9˙C CAMC CKBCnz?ݥC^C@@pA?C o@C7kCUCC!wCCACKx?MC C@@pA?qpCb@OC~B]LCUw^B8CUw^B$BUw^B;w?3NCUiB@@pA? B[@Ÿ6C@O{.CCնA< CVEC< CTh?-ClC@@pA?XB2&@]ІBlC8BB_C-A_CB/BjP ?B[BeCA@pA?!πC@5@TCE{A{cCA4CAgNBA{?-ZCcAA@pA?B7Q@lBn_CBJ#C@BJ#C~UA(B=d?aBC A@pA?KC(@CМBPCNBwCNB BNB<~?CB0A@pA?mJCL@2xC@BiTrC3B3C3B5K8B2B|?lrC엛B@A@pA?C@ zC(CnCr(C[Cr(CwBr(C7|?!wC^2(CPA@pAfC&X@xPCpC>MC{pCqzC{pCЁ3B{pC|?WCJBC`A@pA?7CQ9@:;B1UAV`BL.UA#.CN.UA6BP.UAg?t?B~HApA@pA?~B @; CaCC^aCLB^aC 4BwBx? C"fCA@pA?QB~@ qBCBChBC&=SACEv?IBACA@pA?ιBt@BEMABNA3BNAe18ANARo? BFQAA@pA?)Bw@/sB DCEBDC9BDCaPnAAyt?۪BjDCA@pA?CS@BBBBCBABx?CB[BA@pA?EC`S@[LCpCMC lC5 ;C lCAC}?eLCeCA@pA?B3A73BABCABtABCV{?qABCyB2dANS?+BxBCA@pA? Cz@ Cuٮ>:HC߮>i C߮>A߮>|?& CF>A@pA?JB_Y@j֠BFBHBCBBCB7?&Bv?QB4B@@pA?tC@?dCF_C£]CCxCCVACfv?*/bC1zC@@@pA?”C:n@+/TC"׋C}TC CC CC Cñw? MUC,C@@pA?I6Cי@ΙCSBܢCAvBYHCBvBB]YCz?L)CB@@pAaC@#CDCCJCe{CJCR oA.A"b~?CRHC@@pA?CC W@焏CBCNFCCCC٫AnCn|?{CC@@pA?B9)O@BCUɽBCBC$=ACP k?$B_CA@pA?*CT @BV#CCCCk+CCyAC |t?CCA@pA?C>Ci@X*CNC C^7OC֯2C^7OC?*+CAd|?dC$OC A@pA?"CY@CE=C^KC9CC9Ch>9Cw?fC6C0A@pA?BWU@vbBCABYCp BYCBaBKNe?BC@A@pA?B8C @c{EC̭C>CҦCm%(CҦCAACSxy?HCQ!CPA@pA?YB?@ BCs~B CACCC{f?)LB`ŤC`A@pA?%ZB-@0BAŔ+BA.BAdBA/N?*+BaApA@pA? B9ܬ@,B˴Co6BC/~BCH@CL q?BaCA@pA?~)TBYv@%BB֠B,~B .A+~BBCR\? JBN&BA@pA?#nC.T@#yCyECqCECiCECb@Ap~?yCECA@pA? &Cv@̡/C1CF.C1CuPC1CFAtB{?0CICA@pA?2BT@.BuNBBIBBIB&TAqҒCQt?κBq6BA@pA'#B 1ABoC, B;CXA;CAv.C,?BCA@pA?BV@QBHDBغIBTDBBTDB;BTDB4 d?UQBsBA@pAzBF#@BfBC`BfBCNBfBCKs]BmfAw?ҹBLBCA@pA?BSA7A9C%A9CA9C@P@J?RA8C@@pA?(OD-@D"C9DCDCsyACÿ~?D׳C@@@pA? kClţ@XdXCXCGxCYCAPCYC#BlCx?pmCy@C@@pA?!Cff@ `CFChC'@CC'@CB'@C|?P}CBC@@pA?C:xCc;@sC*OBJCR0BdVeCR0B}A`CT{?C`(B@@pA?rA}0AByC3gBܱC0B/CK9C/C\)?hB[C@@pA;$C+t@QClCCMmChbCMmC2B7eB[}?yClCA@pA?D܏@v1DQC@D7C=C7C.=BB~?4DDACA@pA?nCD?@ CBBCIʍBBCIʍBAIʍBs?M C|B A@pA? 2BÖ@#BoBhBB^BBYA$!Cl?BB0A@pA?4C8@~ECcB=CB4"CBzAC!y?*DCj:B@A@pA?3C@CCBC B'צC B BzBZC~?CRBPA@pA?OʙB)@UBXCB&XCE;B&XC0BBA~e?(JBCWC`A@pA?BSx@% C fCC fC6B fCbBo4HBx? CtfCpA@pA?}Cf@CZjC C:jC%C:jCA:jCz?nCiCA@pA?B!@!C'C CC>BC}BRCt?%CCA@pA? qB |@ \B?CȾB?C{B?CmA?CoIw?uB0CA@pA?/.C~m@7@CiC@CiCCiC+B4CK|? r@CTCA@pA?ZCw@}BȗC:lBC(6CCBCkps?s BRCA@pA?; C@`²BcC7BuC w5CuCNBuCjy?ƲBCA@pA; CZ@SCYA?QC YAH0(C YAHAYAA |?]CZAA@pA?PB\I(Al B)CB)CfB)C A)C)]?SB)C@@pA? XBsq@ӲC;1CʒBo$CNBo$CA7C(h?C *C@@@pA?CUyz@Z;CCDbCFCCFCBFC*{?KC C@@pA?TrC^@EC[B-CB.6CB,WB@iCA<|?LCB@@pA?ChAroD?C$ DEC CECBB_/?D0C@@pA?B-@B t9Bb9 C` sBx@U sB%CpCg?BbB@@pA?a3CB@GWC92C/uPCO4C6CO4CB>pv?0QCo3CA@pA?ECH@2KC CCF CfCF C AF C?q~?uCQ CA@pA?\BJ@ĿCcCkCĦbCh~AbC.C:B7q?%CtaC A@pA?v8C@,LCfCIFCTfC(CTfCCTfCS*|?=KCgC0A@pA?݃"CyP@=C;"AC'AE!C'AQA'A~v?C0A@A@pA?GB@ϴFBK&CBBG&C9]BG&C7@G&C G?PBA&CPA@pA?G9Cw@A8CFCH/3CܱFC8CݱFC @FC:l{?G;9Cc&GC`A@pA?61C}ʏBL)C Bo @ B+$C{CBhCCiBC41CC$ѱBCӪr?B+C@AApANBK,"AMAeŦC;AƦC)?C ACHњ>ACPAApA?ZCǃ@LCvC$HCvC+hCvC BvCg}?JCgC`AApA?/C }@6B"^B}uB^BIJC^BB^By?^B`SBpAApA{Bg3}@ZCiCmCiC֏BiCܛBWB v? CjCAApA?+OB(@BvBq~CnBq~C!YrBq~CPe?q~Cʸh?&yB$~CAApA?.BȖ@%)B?"CFB\"CNzB\"CATCo?B?#CAApA?OBW$AX6BۅC8B̅C ]@̅C"!B3B3?8BwCAApA?%Cn@ˈC!C\C̆!C7C̆!C-y"B̆!C'|? Cȕ!CAApA?8~>C `@0CRB͹+CTB MCTBPBTB,}?KB0CBAApA?JB @VJB,'CQAB,'CmaB,'C#]B,'C gq?`KB;'CAApA?BqBA1B56CɑB16CtmA16CAجBP?0B'C@ApA?bC:AoCĦCġCʤCԤDʤC' CCʤC:~?եCC@@ApA?#DC/kCC/kCB\B~? C&(kCAApA?%?Ce@K9Cy CPe?ޓBDCPAApAЄCꕩ@C>3C˂CG3Cg9CG3Cc@G3Cr~?;C[3C`AApA?ICLlZ@#ICB@CBMCB^KABp|?2HCBpAApA?tBh@BtCB,aC B,aC5\hAX&C m?.BJCAApA$CZ@cBY:BخB\:BWC[:BBZ:By?B;BAApA?bC2_@CDCҪ CDCCDCȔABLz?"@ CLCAApAmB@&BCB7CB7Csx @7Cx?zB;CAApA?mu?C|@CC9hCCIhCC]ëBC{-}?1CFCAApA?BQ@ C7uBBAuBBAuB2\APC\y?[CBAApA?EA.A,BCpAC:@CAA{/C"(?,LB±CAApAB[AwBQC2bBQCBQCCAQCMt?PswBTC? ApA?B&@B':dC B]CXXB]C|:BG$B?OV?B_C@ ApA?C4#8AC0}CCq=|C}Cq=|C vBq=|C*|?D8CF|C@@ ApA?L\Cg@jDCmC*UGCl;oC eCl;oCAl;oC3Nx?pDC.nC@ ApA??ZC5@~^CJB"_C-BwKC-BU ACz?{U^C B@ ApA?3C@FXCeRB7EC-/TBfC+/TBz*B/TBE~?/CTB@ ApA?N8Cb]@@08CXgC3CLfC3CLfC>KfCŲy?]2CsdC@ ApA?vBg@sB CB CMxB C'xBYCo?˿C CA ApAVGCX@{CH@CqCԐ?C*CԐ?C':B< 9At {?}C>CA ApA?iirC@:+bC+DB[CDEBE CDEBBDEBIJ|?{jcCѱFB A ApA?rBj@B B6HB BdlB B!B B\yBV]CzB[%BRkh?B\C@0ApA?7CuN@)WCAA0ApA?AB/@BCAyB\ AS AͥB(B^RRB: CnDz?Q7CX)B A@ApA?:CCBBI>CvBI>CXAnT!Ax?:B>CA@ApA?,B@BG BLB B4 C B8ZAB BYw?նBFBA@ApA?Ђ5CJp@7CdOCX&CeOCNCeOCfVBdOCj}? COCA@ApA?[B࿗@=B^BU_B^BB^BN|A^B!z?BQK^B?PApA? UBGh@kB#bCDB*cC5B*cCwBh"C{@YCx(KC4C.KC!C.KC@.KC]y?g}CNKC@PApA? *CL@+C!CA C!C&@C5BdwuCPAPApA?* B_@oyC2CC$CB$C3AEhCz?"LC}C`APApA?Bs@dLBṢC3B㹢CO>B㹢C%$AsCr?B(CpAPApA?ϫAAmA0CpA?Cl*@uBgAvB(-I>osAGCAPApA?LzB@=BB͟CBşC-AşCGB CBAPApA?)PBBAb1HBu?B(6Bq?B#LBp?Bد@o?Bfl?D]HB1B?`ApA?*PB3@ Cv4B: C4B"B4BSBaC'au?kCk+4B@`ApA? <:C@b C>"B C"BNbC"BIB"B(z?C (B@@`ApA?#OCA@5CPdECC1CcECuleCcEC|NBcEC{?-0CUBC@`ApA?{6Cy@BCgBCtCC'CCw?7BC@`ApA?ثBe@wlBGCeBHCPQgBHC^ ?HCN?Z`BEC@`ApA?oBj@BcB?B-cBB.cBRAlCڪt?vBaB@`ApA?ˁAXAhTAk- CA- CX2AC] AC]F>ŒA CA`ApA?B:@\ Bb8C\BO8CŹBO8CAʼn@v?_BZ8CA`ApA?JdB=o@SCZFA ]CGASߕBGA]Bz$S{AA/C@A`ApA]/ C=@E0 C0qCC0qCNB0qC"BFtBN{? CR+qCPA`ApA?vLC@@(C2C'C)C NkC)C B)CX|?A(C6C`A`ApA?Bn@>BB'BB[BBtY@ACw?_B2BpA`ApA?OX9C]@4CvAǢ4CA=9CA@A|??t4CAA`ApA0MA^C?pApA?SBEͣ@0BS|vBuB|vBP#C|vB@B|vBt p?3BNwB@pApA?bkC;@qCC,jCCVhCC?ZC}??pCC@@pApA?,C!7y@$BF=BBF=BCF=BBF=Bs?Be?B@pApA?.C>v@>BbBB:bB.^C:bBB:bBiy?@BB@pApA?fB @+BBikB B|q> CABC_l?2BVTB@pApA?Bl@?'CCu#CC\BC DB\ C6z? )C$ C@pApA?Ce@uvCB|oCBHCB*BB}4~?^tCaBApApA? XCJe@}LCA CACAHCA|?MCAApApA?"BF\@BE CBv Cq~Cv CBv CJs?BM C ApApA?}CQ@9C22C'C)CӌC)C @)C$~?юC C0ApApA!_xB9Ǔ@ ,B(BZxB(BmfB(BFBw=^Ch?BG)B@ApApA?6A!A=B9@BCPApApA?Az$AmjA,Bl\lA-B^@dˊCAdˊC]>cAqB`ApApA?C;@CC1C C C CJA Cz?CCpApApA?P CdP@BLC BPCCPC(7BPC9A{?)BĊCApApA?z Cz`@CC CCCC@ BRz?CCApApA?BjN@BCSBCgBCzNAB/s?ǓBCApApA?BH@B)6CXB'6CB'6C?J:@\{?AB6CApA?SLtB_@B4CQB4CPQA4CB^%7?U{B4C?ApA?&UBo@KBBhBBBBABVAl?$BMB@ApA?CN@HCC#CCBCCunA7ZBLz?~C%kC@@ApA?B@$ B5B B5BXB5B i?5Bt?fBB@ApA+CgÖ@mB^2CfBa2CUCa2C& Ba2C4z?2BS=C@ApA?)NB@LB=3.BqB0.BN B0.B'@0.B (? B%B@ApALB$w@BaHCBo[HCrCn[HCBn[HCԻu?BGC@ApA?jCBK@8B8C|B{rC: A|rCyBBjNQ?|ߖBXCAApA? B٭@@B\BX BB?BcB+$C?;BBAApA?BF@u CCOCCBC[BBy? CVC AApA?dB5@fCC),Cj?C3,CAOC@AApA? CS@TBBWBB_4CBrh^BBD.{?kvBO5BPAApA?YϙAI4 A}KAPCLEAǏCf@B@ABo6 >DAtC`AApA?srB@WԍB^A͍B^Ah#B^AeAMCk?|BApAApA?Bm@ BjeC~ӄBjeCBjeCvbBjeC?q?*B$eCAApA?[_B@tB@ڧjB@_.B@U qA9;Cgj?1tB@AApA?B7A].EBzC1BzC'YAzC\ACV?8EBmCAApA?`B*%@ByC!mBtCݐBtCPAuCv?uBCApA?PB#@KABAB"BB5BB 5?AB?ApA??Cf@9CS?C3C=?CjB=?CRBz~2Ca{?17CC@ApA¹BY@EBB=BB73BBAB:T?bFBJB@@ApA?xC}&A&BjCiHC._CHC-CHCZ1BHCp}?hCHC@ApA?UBO@蓾B2ZBBBoxBBBdAB[q?@B'B@ApA?;Bp@?vBTCyBTCrBTC5Z@W Br?8B `TC@ApA? 4Bq@fBZCZBZCBZCbBZCaNh?aBA"[C@ApA?؏B?k'AkBƦC:]cBƦCבBƦCAƦCf?RcgBCAApA?Bks*@ BE5BkEB5BEC5B=[B5B5ew?1"BBAApA?CF@1'CC6]&C CB CNBB/Cz?5(CbC AApA? B9^@B/&B!>B8&BoNB8&BԃgBICr?BIB0AApA?Q)_BF@8B}0C9BQC.9B QC*=C!U?8B~C@AApA?(Au: A&B+C&BA,CűA CDeB Cy>&B,CPAApADcB@АCBB{;CBB;\JBB?B_?DBB`AApA?B}@ZBՂCaBՂCBՂC@aVBm?7B0тCpAApA?C5S@uBglCxBflC3HCflCBflCMj|?ghBVlCAApA?[B0@SCGB)CFBBFBAdCC}?[CBAApA?&ԖB@uB>ZC^BB9 C+ B9 C}wAɜC jBɜC:?XB{ CAApA?PC<@^tCNG~B~vC1G~BC/G~B&hA%G~BX~?tC"}B AApA?BMx8@ByCXBCPBC]CACv?'BC0AApA?޳Al_AD6AޮC덶AeݮC8 Aʺ)Cf*Aʺ)C>A׮C@AApA?{BkL@<[B-C̭B-CC-CltB-C2u?Bw9CPAApA?3%]B@e.BM@x'B@x6B@7q@@J?.B/@`AApA?3BA OB 3?LFB3?A3?[A44CMp_?UOB ?pAApA?Y-oB@(4B^BA#BMB{fBMBANBk? :4B=BAApA?6B`v@AB+FC=B+FCC+FCB+FCi}?B,FCApA?BQ@CCwCCBC?BB?CC?ApAB/@CAڮCJ:C=ڮCˆB=ڮCBz)Cy?yCm̮C@ApAAA{PASC"LASSCg@bAAbAM>\ZAARC@@ApA?CU@CVW@ CXC: CXCGpCXC2BXCVu{?> CC@ApA?d,UBl@}-AtC{,A8tCA8tCA8tC7>Ӿ+AvC@ApA?W2C6@[| CC0C C70CϦRC70C)B70CIz?9 C>C@ApA?CiI@HBVgA=BqgA>CqgAPڥBqgAWx?BA@ApA?κA Ah`A]5C}aA55Cw@?VA?E7O>e`Az3CAApA? C5@DBEbECB@7CJC6w7CHCCHCmAZCj}?7C̥C0AApA?IBV=b@;BcuCٓBcuCGBcuC$'"BǂBw?B\uC@AApA?|jBTW@5rBBzBB[BBEɕAkCy?2PBBPAApA?o{iA @xAxC!AxCSJA%uBߗB%uB]>mA$xC`AApA?2AA6FBoYC[0BlYCB4C?ApA?zBI<@B=CgB=CRB=CyBA'x?^BA>C@ApA?vB.#@B}CB}CA}C>aBOBk?""BXC@@ApA?ABLv@6B_C*&B_CB_C$B_CvQo?eBC@ApA?dOB因@$A?KCAgC?,BgC8aAgC 1?oAmͳC@ApA?`B4Z@yBC־BC'CCBBC_t?#ِB8C@ApA?BÊ@nBBfBB2wBBS0BCt?J-BB@ApA?xB_@,5B{CY5BHqCxUBHqC++AHqC)'^?S5B)UCAApA?a5C^@&-CPB-C^BbI9C^B7A^Beg}?-CBAApA?NB#j@-B CcB C3|B CB CVRt?_B C AApA?AMB>@WBIhBB]IhBB_IhBaAVnCv?BdgB0AApA? AAA(T%BeCB_C4LQA/CESB0CE?$B<C@AApA?_6SB,u@u3B0zCDŽB/zCN B/zCusB^Bt?܌BXzCPAApA?3CB @BB YBBqBBmέA>Cw?BB`AApA?PBGGA.DBB۞BBߴBB="ABHTy?3BBApA?/B]@yBBzyBBBB sz@B|?7yBB?ApA? BW@@16B %8C%Br7CˋAox@Blx@bW?kGB<7C@ApA?K1C /@3CBCB[DCBQ,BBL|? CB@@ApA? B@sBYCBMjYC}A0BZB0BIT?WB;YC@ApA?dMCp@GCoCŔHCpCWNCpCP@pC}?9HCzC@ApA?]ݑBZ@@*CAApA?Q\B@sBB"BB)BB5Al+Cw?|BB AApA?i3Ck2s@iCOy%C CRy%CCRy%C\AQy%C }?Cr%C0AApA?VPB=:@CA5XBL`A:XBsB:XBLB9XBX?A=XB@AApA?bA.AzAjS"C!ݬAoS"C*AoS"CÇ@)CT%?ѿAg"CApA? B @©B4ClB4C@B4C@s%7e?B4C?ApAVBՐ@ABBŀC@B ŀChA ŀCB-BrR?sBBXۀC@ApA΢BM$@ԆB (CB (CB (CoACu?cB'C@@ApA? Bq7@B7 CYB7 CC7 C^B7 Cw?}B@ C@ApA?JB~\@BVBkBVBsLBVBzBVBzT? BB@ApA?>B@GA4C1AXC:BXC@XC9?%BAVC@ApA?ٸB ^@]BdB\ BdBFӭBdB`@(C_mv?zB#aB@ApA?B*b@uBB2 BBBB??BAx?B%BAApA?z?BN@`B~BCvB|BCEA|BC9B Bxq?TB9CAApA?*B9@BxTCȻBwTCB_QC AApA? Bܮ@BnCBoC1BoC(cAoCrCx?ݚBCApA?arBB@b]BCTBCBChACq;?]BC?ApA?IgKBMI.@ŊBcCzBcClAcC> BC%k? B)aC@ApA?QB%@nCw-C0Cw-CyyBw-C$BǻC{?HCs-C@@ApA?B_Q@ǒBLC:̔BNCfBNCZLANCv?6BfC@ApA?B)@O%BgCBgCqBgCK?NB=y?\B{gC@ApA?>B@jcB86CUB@6C@?6C?B3@g?0dB6C@ApA#ABˇ@yPBvCAH#C7AM#C@AM#C@'ޫC?A#C@ApA?묦B\ @uB8)CB5)CײB5)CA5)CSw?ɓB)C@@ApA?=B=?B+BB+BkB+BHA^Cwx?Bj+B@ApA?k*Bj0@B]pCEwB]pCCB]pC%A]pCzv?BbpC@ApA?bA¼A೹AޫBAϫBՏ?ΫBA*Cm ?%A=xB@@A?-(D%?8AQ>D!16I5Dv 6iDw 6@B4C?o9D 6@A?t D_AD4C D4Cd D4C@4C?WD4C@A?3B<|@BtB4CB4CB4CD?4C>2B4C@A?@C{@ԩB3CB3C.C3CB3CJg?B3C@A?JD @mD3C D3C(!D3C`B3C? D3CAA?+Ce @]C85GC5C5`A5?C95AACu@@C4CaOC4CC4CA7?C4C AAeCi @v\CCdgCC0CCBC?fCC0AA?^C/ AC4C]C4CD4CB4C?C4C@AA?B^@ BBC"1+BC_B4Cbv?BCPAA?y\C#@ZC=5dUC5N*dC5ZlA5?(YC@5`AA?2NCT@BC4CA4CAA?UBGWAvBˋ6mB6o>q6>gkB4CH?CuB46AA4:6Chs@Ħ5C4C5H-C4C3,?C4CA4C?sO6C4CAA?|C @BBy,CgB?BAA?C-@y:CMiCvC]nCr{CmCr{CdBr{Cz?KkC$yC@?Ap7C@NĖCBmCgBBgB1CZC9z?*ʋCBA?A?B=e@DC7C.CӓCAӓC>CyNBTp?C!CA?A?v*CP2@rt9Cp2CU8Cu7C Cu7C)Bi@t?U6CF5C A?A?)lCG@tCSC.CkSCTDCkSCBOcA({?VC~SC0A?A?$zCx@tC;TCnCTCkCTC0߇ATC͘|?oCFSC@A?A?kuB@j Bc?B`BZIB(AZIB2A{C>iH B4BPA?A$:B@}ߐAB~eABDBBUJBBm? FAvB`A?A?HcYCv@CrCی CrCލCrCN/CrCviz?9ClrCpA?A?ћ)Cs@>Z%CV,9C!C,9Cu,C,9C=#A,9C|?.&Ck8CA?A?.fB@v>B.BIP7B.By.B.B!k @ C]G??BBA?A?ECd%[@^xCC[mCCDCC.BPޢCf}?3zC4CA?A?N Cw@yBCBCTOCCax`AC/x? 9BCA?A?[9iCf`@hCbCnjCbCwdCbC6@0v8B ~?\hCFbCA?A? CZq@CzCCzCW !CzCZAzCz? CVzCA?AAIB@ɦB4\C'DB3\C6B3\CͶAB B s?/B\CA?A?D]B!@vBFCSBFC腑BFC~=f@FC @s?sBZLCA?A;B@PBC2BC_BCgbACCW@9C ,BGC;>DB!C:>DB4BeCq?UEC3e>B@@A?EC0@dCZCCC'CmC'C9BO Cz?+COnC@@A?FAA,BCIB VCBCk9CC|>FBDC@@A?D@D>CD C!D CB CT?OD06 CA@A?C @C@'pClCDnCgCDnCӈBBnC~?AӔCA@A?)B]@Z3Cy@GC@B@Be9Csx?" CA@A@A?7BǢ@ӏB CBD CBE CMAE C<1q?][B6 CA@A?ApC3j@5UC+.BPC.B.\C.BcpB.BrC~?$UCM[.BA@A?vB9A\qPB,CGB,C7}B,C[A,Cj?jPB,CA@A?ʀBA1)BP[BlBV[BinBV[BRp)BV[Bj?92*B6qB@@@@A?rCdj@{C'C3iC_CUjC_C>ECw?'qCxC@@@A?ɆCYd@= C& 4AtCJwACJwA&|3BtCC }?*CcA@@@A?zCf7@IuCSCCmxCFICJuCFICBFICmz?yvCQMC@@@A?eDn@C[NXCvjCR^Cpi1DR^CTCR^CV?/Cg \C@@@A?OCe@0.CC|+8CR C]CR C^BR Cy?Q1C{ȌCA@@A??BVG@C[A%Bl[B)BzUB(BA [Cm?8CY5!BA@@A? iC W@~C,CBjxCCNCCD&B0Bz?5wCCC A@@A?˦C@C]CCy^CUCy^C0Bz^CK}?>Ck_C0A@@A?1Bus@!BGC{B)CB)CA)CYm?BzC@A@@A?aC|@8TCTCICCہoCChBCz?NPC0CPA@@A?SC֓@WC"4CˏSC4CMC4CSֶ@8BU|?1VCC`A@@A?BJ@CsCCsCBsC[[A繦Ckv?z CCpA@@A?B|@@bB%C]B7%C HB7%CbB7%CDg?_Bǁ$CA@@A?CSS@)CCGCCcCCOIAC1~?/CCA@@A?, C T@[B-?BsB B<9C B sB BCw?x:B]BA@@A?7fB@1dBByBB1BBA Cav?BXBA@@A?66$C\@Cw,CCa,C I&Ca,C A^,Cb|?C[$CA@@A?}B@,B 'VCpB *VCB *VC?B`t?LB5VCA@@A?DdeC`W@eCRC;_CRC?hCRC<ARC\(~?eCDCA@@A?}A;A8`!B_CB_C[@_CAB-z?? BQCA@@A?͛B@.}B CͫcB CHB CB Cٽu?}B^ C@@@A?CI@6C CbCRB%CRBAS#C%|?OCKB@@A? B/@BYCX CbVCxbBbVCBT Bb?|7CdWC@@A?w Du@;iCCCt Cϛ(Dt C`9]Ct C~?CGC@@A?OrfA@᧝B}{BPBCBzقBCe CCtv>BBB@@A?Cl@Ξ C°CҀ4C C̲C CG1C C{?VS+C ^CA@A?mPdCOC@qCcCC,eCC,eCCCFB3{?aCmeCA@A?2Co@:CCCρCCρCi_B;B)}?֫CBC A@A?J[DB4@1ʖAY/)AkA]ZCA@^ZCA CA5@C>hAq_A0A@A?hCÆA^CݬBo#CfB DfBaBfB?CDB@A@A?C]@CFҦC}C"C C"CMAECdv?hC~CPA@A?B@)&B2BCQ0"BBC BBCڃBBCM?gB:=C`A@A?BT@BܠRCBRCXHBRC^tARCss?_.BESCpA@A?(AA)AS)Bu(?%B" )? @ 4C8B 4ChT?P%B?:@A@A? eJCZ@eeC]RCZCgRC&5CfRCGB?+A|?fC{RCA@A?Ć@#CcCǑCcCCcC+BcCy~?|چCCcCA@A?S~B@ oB̷CYBַCIBַChBBVBe?wBG܌CA@AB@WBe!Cy:B!C%zB!C^A!Ctq?B!CA@A?1aC*j@-TOCٞAOCA]@oCAAA'~?'OC!(AA@A?6BwAAtSC-AjSCBBjSCm*BjSC .?NOA 1CA@A?1B3AB{CA{C?T(B{C$'A{C|U?4BXzCA@A?$uBAfBlCQBlCJk|BlC W+AlC;q?fBC@@@A?DC@@A?7LCr@CCCLCCLCq:ByC@|?%C_AC@@A?bC@*C9AC"C%MCɇB%MCx:B-Awt?&CdHC@@A?QC=".@b-CB~CBBB. &C!)C_G|?MCzB@@A? r?C@;0@_m^C6C[C3CEC3C넁BuC y?%YCkCA@A?:D@OrDRC_ND[CcD[C}@o2C ?D!CA@A?mfChn@FB/UCBCbTC;CbTC\2CaTCx?CKOTC A@A?MCNY@`C#Cg\C\$C (8C\$CkB.C{?9`Cr%C0A@A?0 jB~@C*sCCHsCjA#}BsC#}B+J]?@CXqC@A@A?Cl?@=uC)BoCBdCBBB}?6gtCbBPA@A?wB@lBvoCikBHwoCBHwoC:u{?JBqC@@AIBC" @qC~WCqC߼mCC߼mCBBwfB7x?0mCdC@@@AՓB@pB C$XB7B6\B7Bx!kAMCӱ!?o|BC@@A?=C}@CAC)CfCuqCfC,CB}?CtfC@@A%C:AD]BɯD0!B8:C0!BhBL\C?jDLB@@A'C1(@6qCLB^EC<CЃ@ܴCg CCECmCEC BEC|w?j C@C0A@A?Bm@Bp"BBӭB}BӭB3AӭBLTn?@iB;B@A@A?B.[@BBgBBfvBB6ŋAlZC m?GBBPA@A?SC@L'dCLC]CLCaDCLCE$A^ Cy|?AcCaC`A@A?MBF׵@SB?B2?@B3?[A4C_j?B~ҳCpA@A?hBA7@dBs8VBCB!8VB % C!8VBBB!8VB0t?̞BTBA@A?&A< A?AВBEA2B vA}CB}C8B`>e=AڔBA@AD Br&APWB4ƃB̌RBŃB@uC_gBuCVN0?(VBUBA@A?|OBi~@]}B|:C B|:C )C|:C0cB|:Cp?(4B,:CA@A? C+@W CAY0 C"A C$Ac?gA z?X CAA@A?A0C[@~*B ݀CB݀C'`C݀CT|B݀Cr|?`B\CA@A?)Cm@BxBbBxB>[CxBBxBS'|?+BBA@A?uhA;AACACz8AC@GB?AӍC@@A?Bodl@[SCucCͯB@kCgB@kC]ŠB@^Bi? CgC@@@A?rZCz@#C&C~CC.CCwUBB{?.|CC@@A?FCCg@eZC]LCHCJCΞBJCgBAIqx?}KC4KC@@A?sC@qfCCjCCtCCAC7{?eC%uC@@A?ΟCڋ]@;@CsCEC3C%՗B3CBe*!Cs?4ACȪC@@A?nC~]@֔Cy+CC9C&C9C]CC*{?5CPCA@A?u,C_^@&`CTC aCC1cBC$)CgBJy?dC-CA@A?}qmC@7Cj;BtDCѱB&ϦCѱBYLCѱBՇy? CB A@A?{nCs@7JCKC$BCKCCKCyBKCyz?-JCLC0A@A?~:CӍ@l3NC A$WAA@A?t* Ctd@J>CX36C Cj36CPCj36Cq>Av @y?FCyy6CA@A?9B`AAA\vCAuvCHAuvCN@uvC" ?+AyCA@A?B@BBQzCdCB{C_B{CbZB{C%Qd?eBB~CA@A?ZCǕa@W#*C)CI&CȪ)C߄CȪ)CBȪ)C}?*C)CA@A?BO@26BǥC.BǥCBǥCvBǥCNm?W46BpCA@A?[CB%A?BH}Cf*BH}C؉/BH}C;.?H}Cb?K@B^|C@@AA'CnAqCKBxCB4=CBYBC^~?)CcB@AA?W9C@@ C Bth"CD$ABCD$AެBI$A6v?RC+B@AA?CC@eCB5CBrCB CB-qC-~?C~B@AA?EC"9@&C?cCC!C,B!CKCZC CS6z?`CC@AA?C~b@ϸCכCCC~CCBiC~?дCCAAA?퇰C@C!BҰC&BC&B4@BZ~?'/C(BAAA?QCG#@>CF4C#C#CC#CB̏Bf{?8C2C AAAOCs_~@}CB&؀CB/CB ĦBB B}?OCB0AAA3-B؎@KfkBsC@AA?uсCg@/%CBaC)MBrC)MBA{C@%{?C;YB@AA?12C5΍@ CE(BtCR9Bm:CR9B`AV9B v?ACKB@AA?ߤBfM@CBhC3CjCAjCB@[Bj?nCmlC@AA?:DC @KC@_C0FCy^C4h:Cy^CEA+BFz?[JC:^CAAA?JBg@8!CZ(6CwC86CڊA86C C @o? C 5CAAA?c1CI{c@\C~BSC~BW+BC~B>^7B~B0#w?+C9E|B AAA?B{@bB$AqBA CABAct?SBvA0AAA?B@ CȴhCtChCuBhCARBu?K CnTiC@AAA?B @B|C BCBCBCp?oB؍CPAAA??WB%@kdBtËC#BiËC@hËC|B Bg?B\C`AAA?>~C]@ECBrlC!BʮC!BA!B[)y?CiYBpAAA?5Bgn@CAD BCA}kkBEAjBICqw?sC$AAAA?TA,)ABފCJB抄C\@A+Ba^B+B4?BlCAAA?[X}Bb@CJBC~(LBCOgBC@C"[?KBCAAA?.BZ*AAcCͿAT3cC,AT3cCz@NAHuCAAA?3A1(A=ABBчAB%@}CdžA}C>UAjBAAA?FBW@"B`BB`BGB`B6B`B)i?+#B;B@ AA?/o4CzW@CA;$CA.5CAψAA=u?"CxA@@ AA?SC%@ҩCh[BCB&CBDBB}?CB@ AACށp@BhCƖmBA AA?|C˖@rNC)!CRѓC!C(4C!CZ,A!C.Y~?CKC A AA?n`Cw@zC9C%0sC?CHC?C)BC"|?~CPC0A AA?CJd@GHCP]B CCP]BBP]BtB!TkC{?ICs\B@A AA?yC˨@CHCŝCCCUCCCgBBC~?h^CDCPA AA?1C_H{@zCCB1C[C1CMB1C]z?9rCGC`A AA?B@GBmBBQBYFBdCe?0`B}CA0AA?NhC@iCxCAeCoCgCoC?kC1}?agCCA0AA 5C q@ưCsC@A0AA?LCWj@nBGB=B}GB DC}GB B}GBov?nBBPA0AA?B=@muC _C. C dC*B dCB@.Cu?%CfC`A0AA?mC8d@!Z&C#CyATuCA0AA?|o8Cz@CBCxBVZ^CxBBxBp5}?@CBA0AA?ofBgAT BwCBwCjBwC,AwC8L? BƧCA0AA?e=By;ABAx1@A1@EB1@3A1@0S?qQAх$@A0AA?%BArBlBYx_BlBIrBlBo@lB2i?rB B?@AA?` C;@BwCBC5+*CCtBCto?pB#C@@AAL|CNhAИCbA%yCA9LCArBGC|?VC A@@@AA?C6@ƵCK!C:~C>!CFC>!CwA"Cz~?Cp C@@AA-B@B箉CBCBCBBf?CljC@@AA?R0C;@yB)EBBLmFB CNmFBbJBOmFBl?1ӸBGB@@AA?gj"C͏C>"Ce"B="CĜ|?\ BpCA@AAyB͵@ B1NC/B}1NC[B}1NCA}1NC(y{?B&NC?PAA7C]@tCO,BwCWx*BdBWx*B2C^C2{?"C *&B@PAA?zBV@:BCBCſCCBC_(h?zBC@@PAA?fzC@zC.CCCVCCB?"CQ]}?CʪC@PAA?;CA—C6BC1BΗC1B{ج@1B>~?wRC HB@PAA?JC]@B2BsB1B@C1B4ϠB1B w?IB]B@PAA?: Cr,@~9CB4CBBB jB:C2y?<4C-B@PAA?qB@hBi-CBT-CuBT-CL,ACb?3B-CAPAA?kCVn@X{CCuCCc#CCYBC X~?|yC CAPAA?2C>@B$CB CB4aCBAxC{?'CYB APAA?gnCn:@&C+ WA C!WAv/B!WA)ArACy?.C<\A0APAA?>BP@BQB~BBBKAC8ȻAs^CAPAA?B̯@BT&CB&C4΢B&C~@&Cq?{͘B&CAPAA?EB73@BB:BB7sBB!LAzCOn?QnBHBAPAA?NBv3A80A߻B?`AA?BCɆ@b-,CK $B2R(C $BLUC $Bj<5B $Bc"{?)C$B@`AA?AN AnBC&hBRC0B*PCB)PC(>BC@@`AA?p~oC@k C#CC#C4C#CsC#Cd{?0 CAoC@`AA?B9/AڛB LC]BֳLC GAA oBAx4?%ݔBkKC@`AA?wЩBG@VB~BB笪BBBZBBBfmAYCj?iBB@`AA?T&Cuˠ@tCQ8BCS8B³DCS8BBS8Bz?QC2>B@`AA?YF;B4@sBBXBBQ@BABC^^?9BYBA`AA?QC+4@2tB 7CXB7CC7C7@7C)y?vqB7CA`AA?2A-AP#&B5C[BC;AַB%BַB۹>g(B؇C A`AA?Bj@7BAvBimABjmA4AkmA^b?ӁB0;A0A`AA?[B5@B*hCBhCj&BhCIB8 PBq?ʳBgC@A`AA? Bq@, FB.RBABVRB'imBVRB-A[RBW?GBWBPA`AA?xjB4@lgB7{BnhBa{BfBa{BArCeT?geBm|B`A`AA?%CN@rCF,CCL,CPBL,C{_Bz&C%z?fCX,CpA`AA?+BA AALacAuAj`AAj`A.?=b`A?A![AA`AA?B&AQBψCOBψC=>ψCMB(?B=F?RBCA`AA?6"Bd@yCAbpCA*BAe:AMCz?!CxAA`AA? jB]@ߖBFnCBEnCBEnCBFnCXoy?B"}nCA`AA?+ʘA-A A]LABOAB~1@~C&AC]?ABpAA$ܤBڞ@hBB bBBKBBo=BBy?#`BB?pAA?C@BC}BCu!CC=BC%w? B=C@pAA?QC2@2NmCƛC͉gCƛC4C7CƛCdABCW}?soCx@C@@pAA?C}@hCbBT^CB*ABB@)Cxy?W C B@pAA?pXUCI@bC]C'=]Cr]C~ICr]C)A'BB}?`Cx]C@pAA?=¶Bs@_B~CCB~CC#B~CC/BwA*u?|BDC@pAA??Ca @ CQB+O CQBR CQBIR@QB[z?n CFQB@pAA?sCz@w:Co`C%3Cv`CgCv`C"Bv`CU3}?=CtxCApAA?k,Czf@;*Ct:A"CA_/CAjGA A!{?,C>AApAA?_ȈB4@@B4„C7BrCJBrC6ArC2R?AB5C ApAA?YB(@VBvCOBvCF'BvC#A C4\?CTBC0ApAA?AdA]A3=A~C+9A~Cϖ@V;B AV;B-&>9A ~C@ApAAD C)P@B.C3JB.C C.C WA.C;x?\BP#/CPApAA?A-A6BGۇC7BԇCt@RB4TBRBHY!? 7BƇC`ApAA?_fB@0B}CKDBBtC:ABtC9 B"Cs g?BhCpApAA?B|@M|BPuC[BLuCcBLuC;BLuC? RB A@AA?[{CCل@^CBUCOBĊ,CMB$BfC|?4^CB@AA?\BK@z\BsCWQBdsCBdsCA|BjH?C¼CSsFB¼C{? *CCAAA;B|@BBw BBȅBB^ACty?qBBAAA?{A0AdAV CHAG C&AG CԃA͞C]!?:Ag CAA?8ZAYABClԁBC"WBB}BBc>݄BC?AAOBw@WoB>C\ndB?C7B?CA?C]a?RoB~EC@AA?eCu@#CMtC4C C)C CB CΝy?EOC C@@AA?6Bi@ӵBC,BUߤC/BUߤCAUߤC>t?vB^ؤC@AA?CU@CEC B6FCޢC6FCA6FC w?CWFC@AA?ط|B@BEB]B?B8.A?BuBϓC/m?*?B5B@AA?B@8pbBHgBZBhgBrBjgB@AjgBŽi?gBZkB@AA?Za=C?=}@C|B&C|B0fC|BB|B:V|?!CS[BAAA?B @_Bx*C9B{*CcqB{*C:ATCj?aB#4CAAA?gAC;@ CB'BkB'B%%B'BCj??BwnB`AAA?hBo@+BGbB5BGbBb{BFbBAlCvr?VBbBpAAA? +A,q4ADAOC"xAOC9 AOC@gAz>NAgOCAAA?B@9B^CU{B^CTB^CB^Cx?AB^CAA?44B,@BƧ 6"B: 6SB: 6 @0 6=?R Bd 6?AA?MBxi@ B]CnBCBCMB C*x?B4SC@AA?B@2AB}_CB^_C`B]_C@Z_Cl??B`C@@AAv8|B@AdBC,]BuCXdBuCe?tCd?֩dB|eC@AA?tB狄@?aBw1BdՁBM1Bq CM1B BM1Bq? BDB@AA?XBՐ@HB8"CW#Bn8"CCo8"C2sBo8"C q?X}B!C@AA?fB|@BqB{ϪB*qBh6B*qBD?NsCo?ABB@AA?ïB._]@B#0CB#0C׫B#0C$&BCev?Bs0CAAA? C:`@ШB=B2uBByWCB~sBB$y?BBAAAnC W@4C}CUCC,CCBC7_{?sCUC AAA?;C W@1BCPCNBCLCm81CLCgA.CG}?UACJC0AAA?3B@9;0BmB+ũC`AAA?=2A/AߺGBoC =BoC @oCKM,BCnBU?,wGBoCpAAA?Bs@FBB~rBBBB^aUBB`v?엉BɣBAAAB?AA?ARC@ј4Cv!CӢ2Cz!CDmCz!CelBz!CP|?3C3C@AA?DB\@BVWC%BWWCBWWC0AVWC/t?lBWC@@AA?^IBt@tBRC$tBRCAARC"B A+O? wBJgRC@AA?B$@\B6!7CjPBN!7CtBN!7CcAN!7CRs?B 7C@AA?H B0 AKBYBz^LBYB%L@l֔C YBl֔C<-?`GB͎B@AAaC!@BCBC7(CCB1BCz?QB~C@AA?EBx@)[BZBEw]B9YBڊB9YB`A:YB:Hd?o]BYBAAA?4B@B=3CqrB{?3CĢA{?3CC B܋>CV? B*APAAA?ЫB2"A3BQCBQCAQCsA\A+W?BmQC`AAA?:;B`AvB=CZB>CXA>CXɽA{'Cdoj?vBCAA?_C57^@_ C4 C_C2A?e C?AA?eBvi@BXCl!BXCBXC/nAXCX?K!ByXC@AA?ɅBJ@C}5BCBB6B5OB琉B5OB7A3OB^?(6BB@@AAB @"B,3ABP4A;&BP4AI@ E?CYgy?,B6A@AA?F2Cܹ@BVQC!5C QC]C QCyB QCg{?{B'+QC@AA?SAwA.ACAi)CXa@Bv BB\>hyAC@AA?vB;h@ŃBBMB@iBB@iBB@iBZo?BB@AA? ]C@cCC>C CC C$ C Ci}?JCCAAA?itB~@JtBY APrBArBAVAAwn?sB,AAAA?Co@#C, B3C+ B݀ C+ B@, BPz?C B AAA?FCc}@2BԳ`C(OB˳`C GC̳`C8B̳`CFz?;#B `C0AAA?3Bi@+B.2CB12CB12CCҚ@12Cw?桡B2C@AAA;HB@_B!C;oB!C|B!CAC2CMo?]B#CPAAA?]/DB@==BA*BǹAtC@AA? BB6@6B)BBMBwBMBh^8@=Bu?BB@@AA?eBC@^jB`ƪCBeƪCBeƪC?AɌ!CVw?B٪C@AA?;A AѢ BC BC7AC9-,BC9?>s BC@AA?0B.sG@DB YBCA⋩CZi?ApC@AABJ@ڎBBBB7cBBBz |Cv?B܏BAAA?vAA 4AFVBA@VBB@CjACW>,ABBAAA?srBԗ@BBfBB:BB\_BeCdx?EB@B AAA?B @rBC BCVBCk<B+Cuy? B!C0AAA?DB1z@cB.BB3B %B3BA3B{?D BB@AAA?.Bc@GSBOBmABOB@BOB*AOB5u?nBSBQBAA?xCPAT6C|CC{CC"A4C?2CC?AA?BD;@CvCCpCBoC\A9՜Clz?C$C@AA?YB@,BBn'BʼB{?ʼBR B3oCE*?{,BJB@@AA? C`@HB.BB[B`,C\B1B[Bex?rKBUB@AA?…B,d@CEBU@A B@AA?B@ _A&CA&C0B&C!TA&CaB0?'Au &C@AA?DB}@3MB:Bj BB CR?alA C@@AA?zB8'@^Ay]CXSAq]CoBq]C2-~Br]CIf?AAC@AA?yAQ@AC7@C?C.@uB Ws>A$C@@A?CTAc~CCuCCLCCAC?CC@A?Ce@9.CB1BB|?CBňBB~?l CB@A?pAhdJAZCBBCB*CC նCCo?pLCB@A?C%S@]BCE!CC%CCAB?~CC@A?sC@̇CCOCCCC%CC?7NCCAA?C@eCBCBǘCBBC?CBAA?)~D$@CCCCbDC̡ CC?MCC AA?7GCo@1pCBw{CBCBDBC?{CB0AA?Cvſ@[;CBE5CBRCB`yCB?פ7CB@AA?Rn(C@5CCE/CC!CCZAB?7CCPAA?E$C@ CC9 CCQB>CC`hMBC?F)CC`AA?ARC@(XCCRCCRCC<B?FWCCpAA?1CQ@%CC5"CC̚ACC-AC?)CCAA?Bs@BCmvBC BCABF?wBCAA?&EB>AVABAOAB,@B@C'<>^ABAA?NC7@-CBE,CB+ZqCB(BB?,CBAA/DC@V CC CCdoCCxBC?OCCAA?BAwBBBBhBBAB1?eؚBBAA?bBiuAY7BBz1BBVcBBIAB~d?;7BBAA?R[C@MCB:CB4CB.CB?CBAA?B&Ai~BBeBB9BB@BB?~BB@?A? _C{@&&C oBCBCBABBRy?CaB@?A?Cd~@u DVA~ D}A2C|A =CqFC͚~?~ DA@?A D58@r"C>RC@ D@q,C@)~?Cϕ?@?A?$+C-@?CCCYFCDYFCFBYFCI~?DCCA?A?[Cp@wC-CפCCCCBC@}?"C,CA?A?:C_@.^B#5C?1B8C~.C8ĊB8CZk?BQ7C A?A?pИC!݇@rCeC/C CC CA CK}?CC?C0A?A?C @䁍Cj{qB$CnpBCnpBAwpB j}? CjB@A?A?4C%\@flC鞪C.dCCSBC BYo!Ctz?nCLCPA?A?]C/@<ވC=CӅC6C)C6CߢBBUQ}?pCC`A?A?5C@_cCC^CC?CC*ByC|?cCCpA?A?B@YBtCЬButCxButCGAutC>t?c±BsCA?A?nzHB5'ATCBXB,B{[BIE@r[BUB֙CY?"`B@CA?A?7)Cےv@w[CrC-, CCLACC PBCF8|?V CdCA?A?bBw!@hB EB_BEBZAEBHBAeCj?dBFBA?A?IGCMb@"C-EC#CfBCfCfBC^GBfBC}?I"C7CA?A?cB@BSCZBSC7aBSCgA%GAvw?(B5aSCA?A?>C+Qp@CBCCBџ`CB|BBz|?C`BA?A?vBh@/^B2CB2CB2CP@eCcv?B;@WWCpzC~cCbxCuCbxC+jAbxC z?]CHyC@@A?_C``2@f*C4CyC圚CKC圚CB朚CI}?ߊC&C@@A7CxL@ wCWCMVC9CKC9Ck}B9Cj|?z\CCA@A?LBJ~@BPAnfC1hA A0hAIBGCNd?6CurAA@A?cC4@C}BC"BC"B2YBC}?CB A@A?<PC*Mu@tTCnB3SCݳBq1ECݳBj"`AhC0{?WC᮰B0A@A?C@ e0C>B +C^BB^BvVJBגCw?43CB@A@A?Bų@0BBѥBQABQAdAQAa2e?˯B'APA@A?pLCR~@CnmaC ؀CmaCӨCmaCB|5B|?aCC*bC`A@A?[CП@gC)/C!C)/C C)/CWA)/C-~?mCۃ/CpA@A?YfB0@keBjCm`BjC$)BjC"]ABOZ?3jbB+CA@A?4B@A9?6B \qCp,BWqC=xAWqCAo_uBe%? 3B,PqCA@A?X|VB3 ABBBB;IABBUxC2k?FuB'BA@A?̎EC;[@C BlC BK~C BB B%5{?6CBA@A?B>@(BzCEBotC]1BotC A8:Cs y?]BgCA@A?œB@CYdC:CUdCKBUdCx"ACOz?CTUCA@A? C@B޴nBfB״nBV$C״nBwqB״nB&x?BnBA@A?naC))@NGSC!CHC CVzC CMHB C ?(@SCCA@AlWiBA'BxB;6BxBEIBxBAxB5k?R9'BwB@@@@A?)vD":A!D C'DrClCrC1BāB~??D"+C@@@A?_`CRp@VCPC CJC=5CJCBذA~y?KFCLC@@@A?#&C@CCRh4C,C C,CB&B XCu?#CuC@@@A?xB6@U C(C3C4C(NB4C?B 1?$s?C m0C@@@A?D@C5DBD"=BD"=BiAA#=B#?D`BA@@A_ D #@}D&FCzDtECWDtECQBtECu~?]DECA@@A?`C5H@BLC9C=GC8CMC8CrB8Cz?GC+8C A@@A?.C;a@C6mC CmCDBmC(C$fBVj{?ՁCKnC0A@@A?WCTHz@Z$C`C% CMoC&CMoCgACv?j+CC@A@@A?S9C~<@FC&s}CCÃ}CCÃ}CAB ~?C\}CPA@@ABA|@fB4CٸBqCFCqC6ԑBqCo?XBC`A@@A? B@ZBѩfAJBfAϲ>BfAęB*kBC{i?cwBYkApA@@A?HgBGK@Q A'ޟCAޟC2EBޟCjyAޟC[,?9AbѡCA@@A?iB2@Cw.@Cu*@oHAw*@B{6Cvp?%C@Y&@A@@A?IDeB@AGC>ƚACCBCqAC"?A6CA@@A?B8@~BKCIBKC.8CKC$BKCt?'BDCA@@A?QC`@ )CC*C&CeC&C>lAaBTO|?>)C .CA@@A+\CW@ALBw?S?CJBA@A? xCs@OCB QCBZCBUBB{?fRC8B A@A?;C5@KCBCBCB#F-AB_?KC8B0A@A?) C"@C,CCSC ECSC}@LBFY}?CRϐC@A@A?D5@CF@GBC+BT>CDB;CDBh1@yC{?-?C<*BPA@A?B݊@ZB(B iB3)BSB3)Bq]+BMʈCbC}?BEfC6bCA@AMAS2AkA7jAAΤAza?@™HC=BÙHC>*A9AA@A?*B @2BJyAYB0JyAB.JyA͗BCCɆw?:ByAA@A?B4@'rBlC8hBlCa$ClCRBlCu?"sBGmCA@A'.Bi:FABDiC#tBCiCExACiC1B B+e?BdC@@@A?PC.@QCCCW C4CW CBXC~?xC C@@A?]C(@ÝCC%cCC}CCAC!}?C=C@@A?9CIi@ CC%CvC DvCOBvC~?3C3׉C@@A?cCQ:$@߇BMsBjBUSBj CUSB4\BUSB^?7B]B@@A?Ba_@CaCvwCibCj{QBibC71B 8BP]l?CaCA@A? 0?CC@"RCJCRCjCrY#CjCC >BKBz?3TC{CA@A?C_@cCKBClBQClBޣuAsB}?aCB A@A?C@U3CRW@],Cͼ|@͛B˼|@B7CeXu?4CA@0A@A?'B#@]9BCk6BVCVBVCvAVCGB?OHBmr C@A@A?BIy@ Q$C!B_CBcBBSB;tTCw?$$CAPA@A?=Bܸ@(AtdCAdC)rAdC.@cBb?)|BVC`A@A?B(@1BQMABA@A?9Ci@ۜBBCBpmCBBB |?BBA@A?7B@ܲB^vCB^vCPߴB^vC$?^vC5u?lB.hvCA@A?CǼ@2BXB9BXBBACXB BXB|?fBNnBA@A?hBb@9JBC3BC^BC UBCo?JJBC@@@A??XC@6DCC5`cCKCGCKCsA&VCb{?Q"VCC@@A?C@1C>C2Cy8CW By8CmBV;@s?`/C:C@@A?Dz6AmD wCDEDouC!CouCCB:~?u[DhFvC@@A?A(AB>6CBxJCSPB)Bw*B)B>KBC@@A?Cn@bBJZB B0YB1C0YBfB0YB/ek?BɦXBA@A?X C[4U@jB9vBnBB"CBfBBr?BǵBA@ABT@C@c@*CmB:+CP[BKCP[BBO[BX|?+CKBA@A?B@ BKC3=BKC~BKC|BKCbv?BLMCA@A?rZCEz@B*\CdѯB*\Ca+C*\CB*\Cw?B[CA@A? B@zCa[B \Bi[BcBi[BYAքC|?-iCzBA@A?6B@#B@~ECB@~ECeBB@~ECeDB@~EC/2p?#BEC@AA?yC@mۑCxC΋C4C C4C0A4Cfr|?C8C@@AA?2DX_'AbVDU2C*D2CDD2Cl!C2CD?6`Dl+2C@AA?߇ D,@D| ?D CD CoB Cd~?DC@AA? *CҸ@<-CˏCy(C!CC!C$.AxBPu?-(CmC@AA?B/AoBCBFCDZbB]#C~$%C^#C6?BC@AA? Ct<@6C42Cq3CnChBnCzBmB-w?Z)7CzCAAA?DCAC'OCwCOCSCOC4yAcA v~?CqiPCAAA?^C@ ?CA=:CPAKCPAXCOAz?j5HCA AAA?C\@B{B^B/B *C/BB/Bp?9BfB0AAA?ΤB@+9BaBOgBaB$EKBaBAFlCr`?xBheB@AAACL@,C4B (CYBCBYB/&B׀C6{?,C BPAAA?BJRCe>BOCe>Bv`?rBSBAAA?QjgC@9Cj;CC5C;%CڈC;%C0B;%C{?ACTuC AAA?BFq@BBߚBBCBaBBvl??BիB0AAA?BЈ@BfCVtBfC p}BfCAEKB$i?/BhC@AAA?qC V@ǘ CBCBCBVABz?E CnBPAAA?WBZ`@gBA1CFBx1C[Bx1Cd^AݲC+r?B2C`AAAL7Bj@/B]ACBW3CԸBW3CI=AW3C8u?rB-CpAAA?m3CXL@KB=A*ÙBA+CA9BA8v?QBlAAAA?*pB<@!wOB'QC6OB'QC+7B'QCY@JACAAA?Ar'AAtCAuC\ 2? B]AB0 ?YAVCAAA? BNAlAkuC\4AkuCԡAkuC~@ւBF"&?AduC@ AARB*@*C >C$C :BΔC>:B>bC}?CI7B@ AA?B1@BCǺBt1ClmBt1CKBt1CIk?}BC@ AA*Cc@C1C CыCCыCМ@C/Bs?CYCA AA?gC[k@MCB!HC8B C8BYB8B|?3KCݔ BA AA?zPB_@C;ÜCsA COÜC4doBOÜCРBCt?Ca C A AA??C @cSCB@9MCB>CBʅBB}?^TCkB0A AA?9%C=`@5'jC&=C%eC&=CB&=CeCrjA}?jC =C@A AA?cCa@'BCCBNC,CNC.JBNCy?DBCPA AA?RB@˸QBHhCHBdShC8BdShCIAfShC#U?(UBbhC`A AA?LB\!ABC?C6B?C~A?CAI8A@??BJACpA AA? B @BOC%BOCQBOCSB(Cvu? BmCA AA?epB.@UӧB%1CB1CO'A1CdvpBCg?ABCA AA?Bs@!B@C)BCCCBC&s?+BCA AA?yB@CUΊC{CPΊC6BPΊC3GNB?9B{?%CCA AA?QB)@'AoNCA}NCםB}NC0EB}NCzJ?υANCA AA>ZA/AZtB&BpdB&B5YA CsB CW?CNtB BA AA?UHBA݉BCzBCu5ACBAMC[q?C҉BC@0AANChm=AaCqC[CC:CCx^BRכCY{?0dC70C@@0AA?օC˯@3CΟBi.C BR]B BBxYC6_w?h7C%B@0AA?A8"Cf@]5C'B\)/CWTB!E CVTBBCnx?D5CB@0AA?UBؓ@BhCgB C3B C >{ Cmk?BtC@0AA?^CƵ@CjC\C~CC~ChlA,Chv?4CC@0AA?ArA5BiCIpBƙCXBLC-CLCKE?lB?CA0AA?Uq]Cމ@nCeAgC:eAkMCBAaLB BCB#BKaAHC:gBHC~?LBWOB`A0AA?eC2X@ܶB+CCB+CKeC+CP B+Cx?)BCpA0AA?N Bg#A]BgC C^BpC CE<@ C5^BC81?^Be CA0AA?B<@B'CB'C0yB'C"A'C`u?TB&CA0AA?hC'n@>CA)T?CAICAM?CA7~?"?C}AA0AA?$Bs@Cp#CWCp#CsBp#CP1BCz?wC%CA0AA?kB YIB(C A@AA?pGC@[CHClUCHCs6CHCAХA!k}?}ZCHC0A@AA?Cxj@hB'BBB1CBBBZ5v??BnB@A@AA?fWCm@uCNGCe;jC)\GCP@C)\GC<'B>Amx}?vCjGCPA@AA? CTz@^6BCBCZ.CCBCx?i'BcC`A@AAC|PR@>C)`C|C%`C:C%`CA3B[z?)-C`CpA@AA?SCUJ@" [CC]CCECCJ\A| C~?ZC}CA@AA?B>@BACkBXACBXACAl[As?KBACA@AA?/Y@B Aa|AC$ACv%BC4AC=?ACA@AAJlCۺq@;,%C@C\C@CC@C9-AfBݍ|?$C:ACA@AA?CYx@;Bc߶BBc߶B1Cc߶BjBc߶Bsh}?BsBA@AA?{TB ABSMCmBZMCqBYMCp AYMCz(h?C|BߝMC?PAA?t)CY@CxC2 CwCQYCwCA( C~?cҳC6hC@PAA? dC6>@C$C~C*CUC*CGB*C~?vҁCC@@PAAHB@eBf)B=yBf)BBf)BD@Y^Cr?lBt(B@PAA?GC|@'BCzBxCB=CxCoBxCJr?pB!߭C@PAA?VB@0C*?CTB>C}TA}2CC}2C̿c?ƇB2C@PAA?zC#:@FCe CYACd C"Cd CeBd C|?}ECٟC@PAA?վBQ@BwBBkwB\BkwBUBqCt?gBisBAPAA?B8Z@QBhB2BBABBb@Beu?B@BAPAA?DBs`h@BCBC>/BCpB[B'v? B*C APAA?7B@`P7BҎC’-BĎC4AĎCQ=AyB,? 0BC0APAA?C6>@oC TwCC7wC}C7wCA7wCz?CTwC@APAA?CN@9hC蘇B? CB6 CBJAB{?-CBPAPAA?NBa{@6B֣CB֣C5mB֣CϝBgCрt?B'ԣC`APAA?BFAtrB*hCXtBhCɂ@ HRBYBHRBUoE?boBhCpAPAA?DB @BB!HCeB HCqC HCk)A HC y?BICAPAA?$5B"%A>MB ِC)B ِC^A ِCVJB+dB]?B(ҐCAPAA?BA$A BECBEC]ElACuBBC > B%CAPAA?cA)AEBF]7Ca6B?HC@`AA?6IB@= A܀`C A`CrA`C!A`C>يA[CA`AA?#Baw@3BeA|}BABAШ@USCPh?GBa9AA`AA?Ct@CrACACA´AAy?p`CA A`AA? MB@%|BVCȺqB]C|A]C BriB(U?6}BcC0A`AA?'CAM@_CdCnCdCFCdC-݄BdC{?CC@A`AA?B 2Z@BC$C`A`AA?QB& A#Bp%@BlKX@ ;AtKX@A.a7C!?dB)`@pA`AA? BE@&BIzBBJzB'BJzB #BrCy?cBOozBA`AA?|ßBh@evBcB:oBcB7BcBAcBk?uwBcBA`AA?,BM+ADA?dCɚA?dC0DA?dCj@i@B>;A>dCA`AA?|"BGI!AB(C5B)CdB)Cu?BO?{BOC?pAA?uyA ABͫB B`ΫB>MAC1BC_> BB@pAA?dVPB1@WdB,A`B,A[A,AAN>CT?MfB}A@@pAA?zGBY@dѨB%5CBB&5C@&5C{B?8b?_Bb6C@pAA?QYB\@@'0CB0,CBABCzxCy?1Cv$B@pAA?Be@~tB'CpWnBT'CCT'C]BT'CCn?ItB&C@pAA?<AC.@;CN(CB{4CN(C[pHCN(CǨAN(C+|??2B APApAA?ZB?+@ wB`4CwB}3C٣B}3CyA}3Ci?v_wB3C`ApAA?P B@}lB. CԔB. CeHB. CQ@XCdWp?DB CpApAA?p=B7+AW@B&AiAApAA?lBM@>BtCBtCAtC\PBBxo?_BtCApAA?5_A)A6OBrTLCAqTLC @pTLC(AA1)?éB{PLCApAA?N(Bl#A'BgaC_BhaC~BhaCvE@C`?AEbB@AA?/ZB0 'ABV@CvB@CA@Cw4BB!Z?,BC@@AA?]C@NCAwFCAlzpCA (BA=}?LCA@AA?kBH@eiB쓦C^BCCCBChk?cB˦C@AA?>BO@eC^CB^CLߎA^CPB/*BVq?u6CR^C@AA?-C* @ @VCj AMRJCm AlCl ACk Ad}?~UC3A@AA?DB@\gBM'Cp._B'C烌B'CqegA'Cb?jB@'CAAA?QhB AEPB^CJBCFACX*BCB?}JBsCAAA?V9C_X@gICjZBECTZByM)CTZBvyA,-}CS|?wHCB AAA?fBc@l8B+C\B.C:/B.C]?֌Bw? BC0AAA?BAAcCABcC=%zABcC1A1CO ?AB@AAA?PB7O@CfvsCJC{sC>B{sCVB}By?FC{sCPAAA?AAp6AxCoAxC'F@)BA(B >'nA\xC`AAA?ӯBX̌@ BoC#9BoCBoCk|AoB9u?ڻBoCpAAA?~B(i@Z B*C,iB*CijB*C AU CAz?B$CAAA?mnB<@JVB҂CoQHBقCU4wBقC;A؂Cp?XUB^CAAA?8\BAIiBGb-B.QBb-BJeKBb-BU?|X_CwSo?eiB`,BAA?IBnc@pAC2KAC ABCBCM>DAC?AA?,BJd@UBj7BbBB$BB"A౎Cn? BXB@AA{C@C ACiACiAbIBjA~? CA@@AA?-B#@^hBWC1\B9CgB9C2~1@9CX?8hB0!C@AA?C@]Bl#CUBYCXCYCp#CYC+p?bB/˅C@AA? C<@;c&CDCٴ CCDCKCCDCQ@1A|?%C։DC@AA?S"Cg@P8ICuBCCuBBuBB:vC|?`JCB@AA?CG@%8CCg5CCBCxBB{?ZT:C{XCAAA?oBT@BXC;BgCBgCO@Blv?B,,CAAA?4B,@-YBBBBBB@zCp?XBҍB AAABaAM"B%ۆC"BцCL@цC+BGB'? !BÆC0AAA?AB@BR.CiB#CleB#CbAB8k?ɎBC@AAA?]Bpu@8B-;CB.;C,B.;CWA%@u?HB;CPAAA?kEB@i&BaB}"BNB5BNBl BNB[?&BB`AAA?@3BmA/BW@C(BT@CQAT@Cs?ANBjN?0B5CpAAA?LB`1@ʡAǸ C.A CosB CWE2B CA?OA4 CAAA?cPBA}QBHC;BHC?AHC$Au B Z`?PBGCAA? QCv@L UC4CCNC4CQTC4C@4C?T0UC4C?AA?,Cy|@gHC[BqBC{BĨC{BCBAC1}?/ICS~B@AA?\B#@VBA B(BeB BBeB B_BPWCMt?BUB@@AA? C$v|@AcC|C"C|C5C|C31A|Cdbz? CC@AA?%B&(@TBACAACBACBAC:/A?aBDC@AA?#Bf@c+BjVwC TBrVwCvBrVwCSbA⬆Bhq?ׇBTuwC@AA?xCo@cKBB?’B{B9[CzBCzBls?ĐBcB@AA?&C2@41CCq2CCeCC;A;"CU)|?1C<#CAAA?B&E@\BO(BHBX(BѨBV(B(BʖCgx?3Bv(BAAA?Bb@BECHBbCCBbCC@ C x?9BbCC AAA?}BuL@{Bn\COb|Bh\CBh\C[{Bh\Cmq?{BA\C0AAA?BE@SدBWZC B[ZCV C[ZC!FWB\ZC\x?BiC@AAA?D CQL@BԢmCBТmC3!CТmCx{]BТmCy?eBmCPAAA?#Bkۧ@BFCB#FCB#FC?B"FCo.]?NB;FC`AAA?TB M@kۘBYAƍB?AGB=A>A=Ax?ޘBApAAA?,B9@A_C&A_Cz:B_CrtB_Cb?uAS_CAA?P6Cx@)CCQCC;NSCCgBC?CC?AA?B8@[лBB7BBBB&@o)Crq?B>wB@AA?3SBC@kBIA&BABA BA=m?sB-uA@@AA?R+!C$@jBB{B Bf[C Bu$C B~w?BB@AAB_`@79B}0AB8~0AxB9~0AKؒ@W~0As?%B1A@AA?^vB@ˍBxBBBlBB A.nC_j?B}B@AA?BnF@|nB\=BJlB@Bj-B@B> B@BVMn?V?BCB@AAXm C0@jB-HBoBBCBBB0y?BۈBAAA'B @KBDVCKBVC2BVC;BVCf?J-KBdWCAAA?wB੣@$NIBBHBBiqBBI$ABd? IBxB AAA?Bak@CvBtwCqBpwCYhBpwCUBpwC 1p?vBjC0AAA]wAAl/B?C(B?C?B*BBo&?/B& Cܺ[B>& C-ACx?L,B! CAA]BJ AɭA/=5S8A85nA85X@4C>A 25?AA?VB.@GnB,{CA8C@AA?AAB(iCzՋBiCBl@TBKBl@TB#H?B)hC@AABIA=1BYBX.BYBY@YB BBVC12?V[3BaB@AA?@BeAU@BBCBCBCQAC1o?BIC@AA?VBnq@]Bb3Ct"UBd3CBd3CFXA̳C:^?]B3CAAA?AAɳB`@B@B 8C AAA?RtBOu@>B2BgFB2BB2B1B2Bxz?x)B'2B0AAA?\aA_AjABpAB ABj A~Cں/?AyBAA?-A,)A=;B4C3B4CrAF&7PBE&7mw?^=B4C?AA?@B7@$EC /C/&B/C\B/CJA{BKy?@C,C@AA? #B1A@gdB,MC[B,MC).A,MC10B7gA'N?fBrMC@@AA?5gvBn٢@zBlC<3qBjCJBkCAV'CUf? zBIC@AA?BRw@pTB6.KCDLB$.KC B$.KCQ%OB$.KCcm?SBJC@AA?xBD@0 BB3CwBB>3CB>3CeA>3Cy?Bp"C@AA?BX\@5BbCMBcCmBcCEABx?BoC@AA?AQ B{ AQBMA۫BRMAƦ@@CGB@Cdi?HBnKAAAA?|?B`@`BCBCZBCa˩@Cu?jB{CAAA?Lf9B@ ;zBB#taBB:ABAECn?zBBAA?~AA?^ABDRAB,@C'sAC>`AB?AA?dB/@2@BƏA;$BďAgBďA(Ǜ@=CPz?BA@AA?B@Bfo"C(e|Bdo"C@do"CcB7Cd8n?Bh"C@@AA?ģBG!@HNTBqCƭCBqCLIBqClBqCӄu?(TBhqC@AA?B<@BCqfBCգBC`ACu?5(BC@AA?BYU@(BzWB*BzWBAzWBz@iCgX?Z;(Bn0WB@AA?afB?@DZBNC TBWCLAVCr:AB,PCһv?PB6C@AA?0B,j@XBn%ByBn%BCn%BPBn%B{?vB%BAA?Bp!g@u8B4CkB4C)B4Cu@4C?&B4C?AA?3SB?^@XB CB CMB Cy!A C73j? B: C@AA?!A@cBCNBCޡAuߧBfBuߧBV?cBC@@AA?2B>@ڨEBABw5BABkBABY@jC~o?CmEBYB@@A?EC+AƴC4CC4C B4CC>7?,C4C@A?C AZ0GC4CLC4CeC4CxaC4C?IC4C@A?"CW~@CcU%6qC#5oC&5<-C4C?C*6@A?B@~B4.¦B]7Av+C]7T*B\7n~?6۸Bo6@A?9BAY4B4ChinB4CPA<57>)B?57 ?QWB4CAAAM^A1B3CB3CBCD;CC>B3CAA?{Bo@#8B4C))B4CB4CB4C.9?o|%B4C AA?C&Cf@K>C4C9C4CC4C@[B>7?7:C4C0AA?҅B`@kC4CG C4C`B4C.Bi57ׯ?E C4C@AA?A2Ad\ACACA3CaB3C9>wBCPAAV8JC%@)C4C$C4CoC4CB4C?*C4C`AA?-MA- =AcBdB0B4CƊB4C?~BpAA?%A^A'A4CAA? jXCYWC OCtLC2CtLC~A1B!z?lVC4C@A?A?kCY@eC>gC`C/gCpC/gCA,gC|?+dC(gCPA?A?&Cfq@CwB C9B.d8C8B:B7B=x? C$B`A?A?xC@C@Cj/CBGBkHBR%Ck?ݒB9BA@A?PBN@ᝥBCCLBCCBCC ٬ACCl?֦BeCCA@A?ɠ"Cz@ CE2.CC32.C6C32.C6B32.Cz{?V C(-CA@A?]B@' CJBOCJBZVBJB"BfCov?^ChJBA@A?uQC.f@~'CC'CCIvCCBC= }?'CCA@A?TCw@XdBGoC־BGoCqCGoCH4BGoCz?!*BxoCA@A?B@B#CB&CB&C֙aA&CUIw?BY"CA@A?uAM9ALAJpCA7pC_c|A8pCr9AsBU.-?2WApC@@@@A?̒C چ@ C]BĩCR]BeFpCR]BwBTkC|?ZC]B@@@A?e"Cg@78C]C *C^C C^CTxAw*B}u?0/C]]C@@@A?ԴCKX@C B^zC=BC=Bw:AP`C4~?)CrB@@@A?,aB@-C[IAB!AWE B"A)BDPCi?BddCA@@A?~C;Y@CȈCTCCkCC%BflB)x|?<C4CA@@A?jCO@C`BуC[`BGC[`B BlC:|?C-`B A@@A?4CA*[@䢔BoC`B}Cz*FC}CZB}CmAl?czBAC0A@@ABlo@Q$BC`BaQCBaQC>=BaQCs]?!BC@A@@A?5d6C|@=CC):CdCN,CdC{]A2C{?;CCPA@@A?B @9B"h*CFBg*C7Bg*C*B3Cgl?`B)C`A@@A?y;ZCC@v=WCdC϶RCdC]CdC0AdC }?GwYCȢCpA@@A?NVgB @rBĎCHBĎCBAyB5MCyB{l?8BCA@@A?Ba}@KB9pC(BpC4BpC9BpCRm?"BoCA@@AvGB0@|>BCq:BsC;BsCBsCD^f?m7*ACx??BCA@@A?pCi@lCm9C j~Cm9Cd.aCm9C(A @}~?C9CA@@A?[B@ܶB)C?үB.C C.CLGKB.C5Tx?xBCA@@A?~BAcBC=SLBCՖBCTACEo?cBN6C@@@A?EC1@ӔC̍BCeC6BeCECěCz?C/B@@AvCHT@FC'RUCCsSCTCrSCCrSCY~?_C;TC@@A?DfA޷CqCnHC˃C~3D˃Cm_C˃C(=?C\C@@A?rCF8@CC#4CC,CC ALC6x?ǹ3CCA@A?ĺC@FC' BjCWyBCWyBOBVyB?CC>B A@A?SCu@Bua^CZB^CC+C^CZߎB^Cmp?TBb_C0A@A?4C5@B0CDv{B8C+C-o{B4C-o{B:ADo{By?2CZ{B@A@A?#C(@r2CLC~.CLCsCLC[AAsez?M1C;MCPA@AGB&r@B=BռB>=BB?=B\De@N=B9r?B;7B`A@AC,f@ CC,CڼCCڼC΍AڼC z?= C+CpA@A?BBV7@ÑBhC#ZB½C5BýC@ĽCϳv?2Bo|CA@A?QPBMAlnB rC3dB<sC2A<sC'HA|BR?nB:IsCA@A?B=@B!BuBBKBB FAC w?iBBA@A?B0AA%jCA!jC.@!jCAA*C?MZAWCA@A?{Bx@-BuCBhCe*BhCAjBNg?1B_CA@A?%UBA*UBy6CyBy6C|Ay6C\*B!{@f?ߛBn86CA@A?"RB@RBCFBCGBC2A<Cy?BۇCA@AגB0@pBjBSBwB)BxBBxBq?pBB@@@A?¡Ca@RC(A)fCZA0ewCZA!gC0AC~?xUCErA@@A? CADCkHC0C!CMC!CO6A4CC ?CC@@A?IB oA;B?%yB!VA@ĊSCBŊSCB?qvxB A@@A?D@ODs'C[D2%C#zD2%CAC?D%C@@A?B@BˑCUBr9C4Br9C?!Ar9C ?QBDCA@A??CDw?@6C^B;C;B;C;B1)?<B&y? 7@CNBA@A?iC@T&GCmBFBiAC( FBX܄C& FBzB# FBa{?YBCAB A@A?HBֵ@УC{A CgAs}AgAԸBlHC"k?EzC 0A0A@A?>|C\@fC@CC@CO@WC@CBxMA}?CkBC@A@A?RXCX$u@cDC+iB>CiBkCiBO4BiB{?HC|BPA@A?BF&Ce@WCC\=CwCjA0CwCw AwCV{?KCրC`A@A?@BϾ@x!yB+B#sBhBBhB\An@BA@A?r"CE@ CLCDyCLC 1Cg@tkCC]CVC]BWC2{CXABy?exCC@@A?6BT@;vBCu$BzB=BxBV`AvB.ZX?5֡B B@@A? y&Cʞ@@'wCLB|C B@B B" 4C&HCzz?:,CBA@A?:³C~@PCXBzC}ƵBɖC}ƵBoB}ƵBA~?,ƢCsBA@AaBZ@RB6xByyBwBMBwBAqC f?IBvB A@A?BnAdB$eBi_BUhBAxnCBxnC] >+1oBl;oB0A@A?-Ci@CxtVCBLtVCiRCLtVCBLtVC&y?6CUC@A@A CC@CZ.NB C/NBC/NBZ|@gC,w?CPBPA@A?ꑃBol@BB QCwbBAQCBAQCJcBA?Hl?0BQC`A@A?AA96A6>BÙCr8BÙCGABWijBB?EB{CpA@A? Bg8ABGC`BACyAYB>BYB(?;ɈB+?CA@A?B@ŌBaV2CHB\V2CGB\V2CB\V2C+p?BhB2CA@A?UBl@^hBHA'BHANCHAJBHAUt?!BGPAA@A?TBv0AąACACGACRmABp3?KACA@A?8Bz@HB CB CTC COB Cuy?}Bi CA@A?8Bڬ@װBèCҩBèClBèC!A~èC3s?qB㳨CA@A?A;Ax5B_ C|+B{_ CzX?_ C(BC6[I?0$6BQI CA@A?CA#AqdBpBNBpBrA&\CB&\C@P?P,eB~B@@A?^C#.AsC@rC@3ҾC@ C@E|?@oCh@@@@A? E&C-T@fCC$C0C*C0C\A0Cr?ľCxC@@A?9C/k@r9C?CDCpCCpC6B9^C.u?D>CLC@@A?PCՆ@]C M5CCͬ5C}Cͬ5CxBe?a|?/C5C@@A?aB=@0CK?C92CCCIBCC8CԁqAѲt?3CsDC@@A0C`7AŗCCx!CCDCBBCr~?\CYCA@A?-uC9^@ٛC CiVCpCCpC\BoC~?CCA@A?Cʋ@r]CC-QC%CgC%CsB%C+o{?VCb8C A@A?GCa}@QCjjC#MCjC ĂAnTBpA@A?WfC[b@Cg)CCV!C>RCV!CpWAUBT~?/CCA@A?QB9x@d[BECBECpoBEC4A8A)\t?-BECA@A?B6&A| A/uB ApuB0(Q@puBM@\GqC'> AnBA@A?J#Ce@Cv/CC 0C@C 0CB 0C {? C0CA@A8B:AZIA BaA B, B B'@ B.?X@AGABA@A?ZC$@fB~C>4B~Csj6C~CB~Cz?BCA@A?A?A'BNBBkB@ @kB&A۠CȴC?m(BhBA@A?ABvAeAB"uSABAB4@ BE>$bdAB@AA?C4 @.:CC@AA?`C A1C C˹C"] CvC"] CX B.Cb}?RCK` C@AA?|B٨@B Co)xBVC?BVCfAVCST?hB+wC@AA?MhCPL@7wC/"C buC#C4тC#CA#CN|?|C:#C@AA?|GC@;CBts6CҏBPCҏBAҏByz?@CBBAAA?!uCȡ@HCEBBC|BI%C|BUBzBz?MCqBAAA??CθF@7$CBC&BVC&BXXB'BҾy?}(%CB AAA?ĈC:@bmCtCYhCtCCtCBtCv}?qCtC0AAA?X3Bq]t@"kA|uCp8eAuCBuCIBuC?oƆA/C@AAA?zC#@CSA#C[SA gCYSABlJPC[~?CAPAAA?B=@X9B7yC]BDyC^BDyCzFcAEyCu?B)C`AAA?C?@ 7Cd3 CgCM COBM CA&CBZx?jC~_ CpAAA?Iy CEs`@mCCMCCCC8fA?C{?MCFCAAA?W+B0|@"* C =dCp C=dCB=dC7Bf@B-x? i CsdCAAATBY.AJBJCKBCګ@Cg@6BNA CU=?'/JBhӞCAAA?KCXb@:LCO@ZMC@FC@@-/9C[}?܇LC٤@AAA?̚BH@0B⻵BOBBQ~BB AnCq?B>BAAAJB,@U|BΎC BΎCqtBΎCAW:BEz?ZBȎCAAA?B7A$B"1C{B"1CvBA!1C$jwABNG?H#BX0C@AA?-B&@xBvC BC+{BCB xC`?9BrC@@AA?~AMYC@AA?B@nSB6BUEB4Bc`B4B@4Brn1?CBjBAAA?}C]|@KBLCk"BCCClCCy?BsBAAA?9mCP\@^CWCZZC?CxzC?CB?C|?aCC AAA?pB%AX`BHCDٓBGCdVA&B.B&B-?BAC0AAA?DB=@BftC BtC&ޖAtC/UB#5Bn?hB^tC@AAA?C6@}CBwCBF5CB @BB~~? ~C(BPAAA?A;AlBר7CaB7C$B5p@XB5p@`>vjB8C`AAA?ChFm@$U;CKgCq3CfCBfCNBBc |?;CbCpAAA?8BAȃBl~CBX~C6q>X~CB`Bj\?f;B4CAAA?C[Co@GB0CB*C`uC*CS'NB*C` w?YBCAAA?BCKk@cK CdyB9 CnB#CnBYAnBz?N ClBAAA?X Ct-@ CB0 CB=CBJ@)C{? CBAAA?Bv2@]BPCIBPCBPCKLAPC5j? BICAAA?℟B߶@B3By1B)B%B)Bt:@.Bx?B BAAA?}BdzNA BmRC"AmRCUAmRCy@hAF? BcRC@ AA?YyC@|C\CvCk\CЇuCk\C?ߥ#Bϛ|?R7wC]C@@ AA?@@C9@,CۊCICCYoCC~ABCx?CXC@ AA?WB@K]BwQCBސCCߐC BߐCl?#B2C@ AA?"C6l@bΉBkCJBӭjC-CҭjC3BҭjCHWb?WB(iC@ AA?B-=@A:B1ÃCBCmKCCx BC p?բBmCA AA?,MAq A4yB BƀtB B2BCBCn>B_BA AA?BY@BigCwBgCI\CgCAgCq?"BC A AAC}_@ C$C:C$Cl!C$CˠB$C y?C#C0A AA?iBLO@0]BעCBCBCgAVE'Cs{b?vBC@A AA?9B@tBVBB(VBBB)VB@*VB*q?BQBPA AA?T2Cb@_8C⪳C/CdzC/CdzCO=dzC{?9C ڳC`A AA?GB@BGABGAͪBGA/HA|@CKu?mBW,AApA AA?ߎBy@(BL]CJBL]CBL]C"/=;%Bgw?rBM]CA AA?E.C'Y@-CZSUCSd.C5VUCT)C4VUC_@XB}|?2-CQkUCA AA? (Bw@ZBDGB [BOBBOBJ$8AOB6d?[BG^BA AA?IBź@~B)+C B'+C_VB'+C/BCDx?B+CA AA?+iBʒ@0{B:BCB :B&B:BaAuC=Zk??BBA AA? #B-"@QB)B; qBBBBRAByt?dBhB?0AA?I+CMF@ 7CECCǘCrCǘCŠAB*u?GCi@C@0AA?Aϭ A,AEgBpA|BgA`mClJB`mC{> A4B@@0AA?KC@0AA? B@ыBC tBCSBCIcAC0b?7 BCA0AA?N Cۨ5@C9CC9CW.C9C)2B9Cw?Cd CA0AA?fC`@ ujC qCa4eC qCdC qCC>Y-tBJ}?,jCApC A0AA?}0CUL@1قCAC1CAC#BACg"CB}? C4@C0A0AA?ƖB@TB$CMB$CsB$C A$C']?eKB %C@A0AA?DAUOABBRClA,nPC$|AYqAT=BYqA>BNCPA0AA?PB.@'ABPCx;BCPC#BCPC89@ *AA[W?T@B?OC`A0AA?@{B.b@ȯBGvCBGvC¦CGvCˉBGvCWr?,BvvCpA0AA?%CfL]@7q7CCB8C$BC%B+Bs[Ce|?7CtZBA0AA?tBq @MBBC'uLB(BCGC(BCEB(BC:j?csLBxBCA0AA?(`+Co@wE CZɽA CRɽAE2CPɽAOYA=ɽA}?{ CڦAA0AA?Ba@I;BgC?AgC"BgCA*BCHBCACABzO?.+BXC@@AA?#CXyAP@CvݳCB(;CVc>CVc>G6aB84C(x?CCC?@@@AA?5HC@C uCCɀuCaBɀuCjAB2t?rC MxC@@AA?# Ct@R!C犏CChCChCT{@)BE*z?%'CjbC@@AA?OBE@lBYCBPYCM8@*C˱B*CDZ?B&C@@AA?6;C =@_-CSFB*{(CTFB;ECTFB ATFBdz?+CJB@@AA?DBGO@aBHwCx[BwCm,CwCBwCi?qByCA@AA?g-Ct^@pC%MA>'C+PAipBC+PA$=B+PA {?lC&AA@AA?Z CD@BbtCB'tC'C'tC mB&tC[/y?rBC A@AA?ҐB0k@=B PAB=PAӟBB@A@AA?h*C8[@|`C8BC1CBCM$@CBCp@BBC2|?CBCPA@AA?C@#CBnCB wCB0BCt~?ґC#@B`A@AA?'B<{@$PBv^CݝBv^C}Bv^Co?v^C|v?NBي^CpA@AA?aB9@H/B`XC-0B/XCB/XCK $B0XC&X^?*/BYCA@AA?߸B؃@BW?NBX?(>BX?ۄ B4CNo?B (?A@AA?}B@ ABAB BB+"BBB?ABA@AA? C@%C/C?C/CB/C5B#^Ck}?o%CZ-CA@AA?(B *A2AfcCl|AscCZ"BscC!AtcC@?+AّC@PAA? B^@A{7B.@\3Bë@b-i@^9CAB^9Ce?~8B@C@@PAA?VC+ӭ@6}ClCvCpC 1CpC7BJCT|?.}CuC@PAA?OAc(+A9bBkC9[BLkCBCbBC>]BRC@PAA?t|CJ9@WCB}CB ѹCB&BB"~?aiCB@PAA?K"BVs@>#BhyC4BPyC-kBQyCuzACj?"B!C@PAA?5 C]@ BCB,BB- CBABy?SC>BAPAA?(8SCIBY@s=CґC8CˑCriCˑCo7ABˑC6}?=CxCAPAA?hBEe@ڎBB BBWBBœhBBHm?RBVMB APAA?Ce@"Cu6CC޽6CB޽6CAAGw/@uy?%"CO6C0APAA?(CL@ܾ CjCCCi1CCACao|?k Cg5C@APAA!\C;@QcC?B%Cm^C8B%CUC8B%C2"AC}?bC*%CPAPAA?MkBd@BBBBYkBB ACo?B/B`APAA?rBA-@;QB- $CAQB($C\B($CI B($Cf?>CNBx$CpAPAA?LCW@)lCC*C CC CJnC C͔|?EC3CAPAA?O CO<|@aCxCuC|C|C|C0XA|CR |? CCAPAA?78BAB:?BڎB:?BA:?BvBcCua?B>BAPAA?YBU@IxBBF1hBB1BB2BBv?YwB lBAPAA? BZ@B$CB$CB$CL>FIC{?B"C?`AA?aBTy@uBLCKoBﴢCBﴢC&BﴢCf?v~Bx_C@`AA?O_C@LaC kC[C kCV^C kC&@$ kC@&}?-^CkC@@`AA?#Cc@C HCC(HC.C(HCNA)HClz?!"CHC@`AA?oC0@C tCC tCRC tCp_@ Bw {?C#C@`AA?RCۅ@3B}aCBaC CaC#BaC0y?BaC@`AA? Btu@ :eBAwC>`BwCPCwC"BwCn?PiBhC@`AA?WB_@B-vCaևB].vC^C].vCB].vCq?,BwCA`AA?ŽB3c@6Br/CBφ.CJBφ.C2 Bφ.CmF?" #BK,CA`AA?1Co@lZCCOC,CC,CAsBlBL|?\[CC A`AA?>Bx@x$BBBB]jBBz@rCK?)'BB0A`AA@Bjɓ@cBPCWBGC?aBGCBx+Ckp?KB=C@A`AA?FYBV%AKBFB{BB֚@{CS)B|C>rBBPA`AA?BSe@BCBCb)CCBCu?89BXC`A`AAB@f:qBu3CJqBf3CCf3CMBf3CXo?pB3CpA`AA?1 BV@B/%CmgB%%CֻB%%CwA%%C8q?B|%CA`AA?=Bo*@\]BGpBTB>pB!æB=pB QA;pBe?^B@KBA`AA?^A+ABAґCf܏AґC|?AґCAx@LHBw/>AǑCA`AA?B!BAG8B@BE B@B!A@B~&AdC-H?W}Bҩ?B?pAA?6C@IC]XCDCXC~7$CXCBBM|?zHCSYC@pAA?/tC<@cC\UCCUCUBUC.A ZB%z?C1VC@@pAA CN@WB C-B C+C CWB Cy?GWBJC@pAA?BK@D'FB柯C@BCiBC;BC5^?dOB3C@pAA?BZ@BBPB BKAB B*6BaCCtA@pAA?5Cq @nUC\'C5JCN'CxZCN'C1*CN'C(}?AVCF'CApAA?"Cq@PB؄A-`B.}AF2C,}AfZnB)}Any?5BAApAA?MBկ@#B27C!B27C??27C(/BfL@j?'B6C ApAA?8IB@Q`B 3C@\B 3CZB 3CQA 3Ci%b?K`B63C0ApAA?BQ@2XA{BzAB:naBBHAB4'?D#AB@ApAA?=WBLJA!A sCAsC@?sCϿAf|BA?\|A=sCPApAA?Cy@&6B5+CB+C#C+Cy!B+Cz?(B+C`ApAA?=By@(B7yCB7yC[B7yC]APoB'bx?B5yCpApAA+C^@B;B-{B;B(C;Br7B;B0x?BU;BApAA? A)\Al*BDC"BDCF#DAaCdSBaC%??*B1CApAA?Bw/@MTB=KC;BAKC}BAKCpAAKCfm?TBKC?AA?%B@_bBC4vB-CiC-CWB-Cl?;vBbC@AA? B@.B͐CBCCSA BB BA?zBK-C@@AA?CU@AB6 CaB C%C C9]7B C}u?eBl C@AA?XO1CX@+CcC#CuCi 8CuCZAuC{??a-CdC@AA Cj@zv6CC;,-CGC LBGCk BɛB z?6CހC@AA?^2CU@/CBe(C~ŗBB~ŗB?eBC|x{?.C>B@AA?ՃBѪ@qZB=͒CSBV͒CBV͒C<6AV͒Cc?`B*CAAA? YC5@pPC0vBNKC/vB^ bC/vBA/vB}?RQCsBAAA?BS@\B'CIHB'CB'CzB'C:o?ߘBF6(C AAA?mBB@1B5B"3B/6B~B/6B~]B/6B4yW?UBUB0AAA?J"8B9G@tqAdnC^A.mC2A.mCl@.mCZ?LA`lC@AAA?_B?b@BCBXC?BXC阃AYCKw?DAb?JBT4CAAA?Ap.At@ŚB@Bv@B?C1>8P@0BAAYAHHApBBcBBčLACFB5APAAA?7~BAGBPC=r>BLC|!YALC)B/B0NZ?HBأC`AAAo BXU@BCe~BC9BCBC~v?3BCpAAA?\8B A>[AECWA8CWB8C`B8CgQ?AsxCAA?vB@6DBBw{EBBBBaBBoz?FBB?AA?Cf.@}BOoC*BOoCCOoCaAOoCȶy?+BkoC@AA? GB@$AViCeAViCRBViCu^@ViC@?A&xiC@@AA?VB@VeBggCgBsgCBsgC~xAOBZ?|fBL#hC@AA?OBfv@BCp@[JBP{B}B*{BٱB,{BEYArCPv?:BP{B0AAA?:BtU@ \B}RC]BtRCtBtRC[AtRCv?B՗RC@AAA?àB@:BQ-C@U-Cky? B -CPAAA/)Bq) AAȻBA໼BB໼B4A໼BvH?A`B`AAA?<]B]J@>BQӲA BӲA٤BӲAwBӲAbn?NBBαAAA?XAG1A9qA3C5XA3C/ACJ)BC>yA3C?AA?h׃Bv@MABC=BH C18BH CA%BǷi?|JBC@AAmFBWA`BkYC_BvZCg3AvZCY@B.?wB/ZC@@AA?XB;@fB%|BMTBe2|BEBe2|B@n2|Bw?>B!>|B@AABn@]BVB)m^BBlBBk$BBhj?*^B!:B@AA?KB5@OܝB>bC2 B>bCGB>bCA>bCls?eEBCbC@AA?&tB%@4`B0C`B0C^gYB0Ck(?Cvg?`Bk/C@AA?_^Ba AB<~CtB3~CWA3~CVBf(Cshj?0B\CAAA?(B@Bf#BBN#B莐BN#B#ACI`s?B`BAAAB(@B%C7B%C'B%C#A%Cft? МBޙ%C AAA?BH@IeBdCmBdC ;3BdCˠBB Cu?SB_C0AAA?1 BAlB=C3VBBC@BC8BB?a?5mBC@AAA? BS@=3Be|BtBb|BBb|B ˆ>sC {?TB{BAA#B)*@]BC\BCBCAC0? ^BC?AA?)BB6-@BxCBsCNgCsC~ͦBsCw?|\BeC@AA?!B+@q\BmCBmC+BmCҍBdB` z?&B lC@@AA?4B>@B0C[B6C2=B5C˹c@BCx?LB|C@AAAAExBCerBCAW ClcBW C7?cxB^C@AA?@BS@,\AMůBďAįB>AįB`=AįB>וAbB@AA?9B~@4BBTBBBBj=ABtDu?"̴BcB@AA?eB4CcX+?QB?AA?2B3-h@BWBW B֒WB B֒WBjBiCr?zBu}XB@AA?CK@C'CCC"CCC!CC>CC:x|?CJBC@@AA?WB>@fBgB{BwB5"BwB]ԭ@^!Cy?bBBB@AA?B.@WBZABHAe:BHA)AOAa{?F{BڷA@AA?вAA'AaKCݝAaKCЬi>aKC> AA<>OYAQKC@AA?UBӅ@iB^[CۖB^[CbbB^[C\?{Bpw?QB a[C@AA?^B@Cv4CbBv4CfBv4CgAt9?Kn|?jCq4CAAA?pVB)R@B)CiB)C(rB)CtB)C&k?7bB)CAAA?B7u@OC$CB$CB$CE+BGmCr}?CCL$CAA?JAśAM6q?CP\?C`>>B}?>Bu<&?C?AA?BH@yB C2WB CBB CH@*BRL{?B4C@AA?CܪBB@B=CpB:C%iB:CB @9C [y?BC@@AA?ΫBpD@5B4AX?}B3AoB3AoB3Av?DBA@AA?UBtApAI>CqAI>CAI>C@@$Am0?*Aˎ>C@AA?^2B|@,BCrB쁍C:\@CBBs?)B^}C@AA?_^HBs@TByC2ZBByC7ByCr 4@B q?"UBƶyCAA?١Bɰ@GB?BCBCXA4C?BC@@A?Co@LCB8sCB5gCBCC?"CB@A?CS@BFBC[ACBCjBC>33AC@A?C]sA7.CBCB›CB@1BC?CB@A?B5 AgBBUaBBKwBB@B>E?oBB@A?D@XDC DCKCC)BB? DCAA'C@MCBCBlCB?B?eCBAA?J@BH@POCB*OCB{ACcCC(?_VCB AA?њBA9BCPBCKIBCHUMBBN{?BC0AA?AeBnB@j CBpCB$BBBC>?.k*CB@AA?HAAxA" BB BBDAC:BC”>DBBPAA?C"@BB,BBB2CBXLBB?NBB`AA?B)E@BC3BCCCBC+?fABCpAA? B؝@fBCDBC:CC}BC ?/oBCAA?B@CCCCAC*CB?CCAA?DCv@_X.CC*CCCC5AB?$-CCAA?+!hCr@[TCCUCC[zCC0BC?UCCAA? BA@Bo@B2@Be!@C*>@BAA?PBu@8BB 7BBCBXBB?6BBAA? ݧB{AIBCBC8QBCd}BB?CBCAA?EANA4BB\BBĜ)ABVACDzQ?S5BB@@?A?C%@+ C8ڱAK̘CX3AQtCZ3AeAk3A}?;CkA@?ACS@oCM3C,.CM-C%BM-CgvBܦCS$v?{%Co/C@?A?}C<@ȭCCJ@C.cCدC.cCv|B.cCɩ~?C,C@?A [Cm@%ZCYCMbCWCJCWCKAp_B\gz?\CC@?A?VC^@O$CiC4CdrdCsCdrdC/BcrdCT|?BK8Cd5BCBCjBC"NK?1BQC0A?A?`JCFR@uRC.CJC.CAC.C3ALICz?tOCw.C@A?A?/!5Cf@ICaWC}ECWC,CWCB1&BГ{?NClXCPA?Af4B3BuAA?AWB K@pB;C lB ;CHB ;CA ;C{d?rB;CA?A?OlC0 `@kCF C9CF CߞCF Cą(CF C|?CP CA?A?BE@BuVCBVCчBVC~<B B u?ǯBVCA?A?kB&@BBKBB'BB?)BBGXw?)`BBA?A?A=A$B%7CrB%7Cq7>sI@Q- BsI@K^)? $B$6CA?AB@B=CBBACBx4BACB APC=y?]BQRB@@@A?B .ABChB^ͮCA)CB)CK>CmBpC@@A?/Cڢ@DZCoC*CCaCC BC$~?C)C@@A?8iC@lCC`B>ăC#pBDC#pBBpCF|?ڂCkB@@A?C]+@yCJTB CfBoCfBBdBsg}?`C'B@@A?|eB̨@iBCN_B恅CYABCBA@A@A?\TB@4RB՚CBԚC*ABԚC@ԚC)d?\LBWޙCPA@Aq|YC}{@oTCu ?G~C8?d0C8?űBr45C@}?_rC?`A@A?hBb@&>AKKC4AKCU CKCBKC4qZ?ADNCpA@A?&_"C]{@5B)C@BCJCCBC1x?BCA@A?@-Bv@WB=BeBBB{CB!kBBbs?2BQBA@A?aB@>:BB~?7B/B]C/BܥB/BM`d?y>Br>BA@A?SCup@SBB, BB!;CB9BBy?B-BA@A?COք@ CB C^B!C^BzA^BS{?Am CBA@A?LrBR@A&YBRCUBKC)YBKC[EM?@Cc?YBCA@A? BCۃ@#CBrCB|dCBJBB_}?<"CBA@A?(4B;AiSBA.A`A@@A?ͲB@WvBN[CpB[CDB[CT/B[Cp4k?lBCpA@@A?B܍@CpCmBC$IBCۚB'CxUt?C_ԭCA@@A?tQB\ʳ@CЁCgĆCԢÁCsCb7Bx?^CCA@@AWBzy@?BCBnCBnCi[@pCu?B>.CA@@A? .B=;A(+BcC,BcC$AcCACSL:?.Bv+CA@@A? B@ABgB}B`1BB`1B''4A[1B]w?eBtYBA@@A?նBD@nB"CB+C+B+C돣A?Cu?%B!CA@@A?lB@bBPAxB9A,}B:A.B:At?NB\AA@@A?ŋBA$MBBnC#6BGnCuBGnCPKBGnCn?MBEC@@@A?;DA0CDߡB5@D|B4D|Beb:B>vC?{>D3B@@A?zB)@2sBBCSBhCSBhC ,BhCJ?[5BOC@@A?r7]C@F{Ch4B rC@Bޑ>C@BeMB?CQz?NLrCJB@@As>C@CJCPC%8CHC%8Cuyg?PCz?a~CC@@A?;%'CC(2@T9CB3CzBlCzB3BސCv?53CtBA@A?CfH@CBBVC@BG C@BA7;dC?Sv?UCc>BA@A?Bӄ@BEB@BBKBB{ۤBB^5ACRt?B`BA@A B@9AB~B8BB7BBGABE{?B?BA@A?B2@5YB"dVCIB dVCB dVC/A dVC=z?!BU]VC@@@A?0C"@+Bs]CA@A?6Ch@ C6B:CB>CBGABkt?|O CB A@A? DCO`@ɛ&C~ÁC$"CC\CC{iBC$Xy?-CC0A@A?C@VCA䡔CWACWA r@LA=~?7řC|A@A@A?6pCԁu@OCr CJCs C@Cs CBs C5|?NC CPA@A?nCo{@I5CB&2CBBB`Bp8C{?4C3B`A@A?g'C/j_@/C;B)C@BHC@BCA$C[{?O/C뤤BpA@A?9C^@uRCC~[@GCXpS@%Z&CYpS@oBM7CD|?eRC)tN@A@A8)B}DA%BвCM!BɲCRAɲC諺AeCOk-?`)BCA@AKB|@B'BB&B(lC&B#/A'Bv?լBBA@A?'AOA|A DC>|A,CwACT[AC>>ozAvCA@A?GB&@r%BoXC.BoXC\BoXC AoXCx?yBVXCA@A?kA@A*/BFC(BFCп@tA@BqAX?D/Bj GCA@A?_B@/B`,yCaˏB^,yCRWB^,yC&AXBv?2^B&yCA@A?B9>A/s BCfBC. AC?n{C AP?# BHC@@A?4C@CcCmC(oCUC(oCPB(oCs?[CjC@@@A?C@ݣCsCgaBC(CC ACjn?uCsC@@A? /C@C\օCȟCۛCCۛCNBۛC|?@uCtC@@A?NC`@ICJA:;CAܛCANBAPy?0=CA@@A?"ƳC@|C*B"CoPBCoPBABpPB}?\C.\B@@A?Cӆ@jC~ qCCrC$7 CrCuN]@rC_u?=QCuCA@A?IC5@xC ]C1BqC*TC(C*TC{?B)TCU|?DzCCCA@A?C>@ZOC%CBC+CݯC+CHC+C>{?DCC A@A?6Bq@]BB%BQBARBCBDuC h?fBvB0A@AACW@-C{CD CvCBBA@A?K}B™@fcBCHeBCBC1BCPj?;dB-.CA@A?zpBX@ɜJB0CJB:C>3MB:CWH?;C+X?IB_CA@A?BW@BlpvABovA(BovA[AfCCw?BsAA@A?aB @fBAIۑBA0{BAASCUBo?BrAA@A?gB;4A-6BCn_&BCJSACmA~CBP?t6BC@@@A?)C@.CcCR,CNbC^CNbCjA4:B_t? ,CWcC@@A?A$A=B0C<BCcBX@CBۡBCgR? BBA@A?ܛOC᧏@-#C")BdC*-BBuC*-BB*-Bx?1'Cw4BA@A?A,AEBTC(ޜBfTCeBB CBN><BTC A@A?{9JC%@< (CCK$C ChC C nB C){?(CC0A@A?#q CX@ B3;BiOB:B*C:B^ؚB:B@s?SBB@A@A?fB_@0EBK]C,SABGM]CDBGM]C4kBFM]C3d?KB,?bCPA@A?iBQ@/B0CxB0CQ]A0CVBFCUh?hB1C`A@A?(=B@8ݠCB<ݠCB<ݠC5A<ݠCl y?BנCA@A?AB@ pBCcBC{CCoBC@BB@AA?NC@uC! ClC= C\$C= CQB= Ct|?5xCj CAAA?Q-qCHu@sCxcAkCcAboCcA\@cA D|?uCrcAAAA?X+C!%]@_+C+C(C!C&C!C?QCz?-'CZ|C AAA?A!Bij\@\BCBCaCCNACMq?BBd"C0AAA DCΚX@YhCTCCcCLCC CLCCVZB, BHt}?jC$C@AAA?VB$@'BCCBCCBCCACC4ov?B5BCPAAA? ?C{h@!sBC&BлC(&CлCߗBлC> u?غBC`AAABI@CB/CB99CaB99CDA99Cq?6BjGCpAAA?(Bw@6BPEB2B7EBȈB7EBAMCPHw?{BBAAA?Bܨ|@]EBcBxBJBCJB&IAJBUv?B$BAAA?xB @lBTRC B0SCB0SCA0SCCSv?N=BYOSCAAA?`g]Bd AxtBϻ CtB» CB» CAݞCUac?tBË CAAA?B @fC3CC2C^B2C&Bc8Cx?CCAAAiBAyBCB_BCx-BCAfCƓr?BCAAA?ʍB@k=mB C^@ECЖBAC'B|B'BjBCx?HCڵB@AA?|JB ABB B,B&4A,BALCD>*B^B@AA?zKC+7Aw/C?C(Ct?CSbCt?CTeBt?Cx?2C>C@AA?0KC@{C AC AfuC A?A8~?"C֩AAAA?4vBw@<7BYB@BZBNT/BZBBYCmn?ŹB BAAA?jCʌ@;CkC-YClC=NqClCu=B: C}?C7C AAA?ˆC>@N(bC5VC\C,VCC,VCAIC@AAA?7AALB_gBBBUgBǹTA֙CpFB֙C^>B&DBPAAA?ՉB9V@ oB/,CycdB!C}qjB!Cs?!C`V?rBC`AAAUAzCYi@$CBCBRmCBUA:C~?߆C1BpAAA?ZZ-C xf@(C#&Cm'C#&CmZ-C#&C@#&Co{?"(Cp_&CAAA? A>0AcBPCTVB;PCA؉ABډAM?ɞBPCAAA?9B>@FB:CLBIC 1BICdA&BiWj?2BXTCAAAB@B.C B.C3eB.C&rA.C>s?\B5CAAAkCF@BB{BBqCBэ'BB^Dz? BwBAAA?KB @ԼB-}`C.B2}`CB1}`C=]?}`Cy?B<`C@ AA?,]Cf@fCY"Cn#`CWCTCWC+AA+ C{{?gCC@@ AA?k"C@@=RB "C/HBzClnCzCBRB@ AAcFB~P@SB_ACMB8BC}=B8BC|/A8BC8l?BDC@ AA?eCGV@CAOCɑC,OC5C-OC.B[A |?CMC@ AA?WBi@=4 CC_C0vC~A0vC BCkdo?C6C@ AA?x*'C@l*EC{\BPAC]BC]BfiBuCB{?UICM]BA AA?;B`@" BפCBפCXCפC BפCx:k?ȔB̥CA AA?eCx@[C @|pVCl @RpCk @RAf @H}?[C@ A AA?F[Be@BD`C BID`C;RBID`CA1BWu?VnB _C0A AA?B?"@Ù CBBE CBB'`,BBBZBPCv?w C'=B@A AA?ܴcBUB@R+B.XkCl"B>>lC"B>>lCX=`B5m6?)BmCPA AA? "C8A@*E&C ߛCCFCs CFCl?\C|?&CKC`A AA?'#CAWs@0CaGKCw-CaGKCC`GKC.A;A|?0CoFKCpA AA?!;B,,AA26CfA36C? @A @`a>@A6CA AA?mABw@BoCBCCCC+3BCDw??B0CA AA?Z>C5BK@AGCBeGCB2CB|A"DCg}?ԩGC8BA AA?AǦ*AC!BgCBgC>AC^?BC0M?E!B2pCA AA:CY@"CCCCf{WCCqBC5~?"CCA AA?XB@AB{cvB:4BcvB;BcvB @cvBy?{iByvB@0AA?BCUIAn&CIBp{C`IBmC`IB'A_IB |?cCB@@0AA?iaZBh&ABܥC@0AA?vIC @C(CC"CC"C_A"CU}?͚CC@0AA Bz2AgBICcBIC]ADAbBDA?xQBCC@0AA?KԴB@C;*4Ck?C*4CaA*4C~Be*>4r?rC͛5C@0AA?\gC@w4C~sB/CsBCsBBsB{?2CFBA0AA?^DCq@(9CBM5CSBkOCRB]AOB4p|?V9C.QBA0AA?_C㝃@h]CHCXCHC9cCHC1'AHC}?4_C!IC A0AA?GB$@DB C(B| CRB{ C sBC5t?.[B[ C0A0AA?BaI@B4C$+B4C C4CB4Cou?zB~/4C@A0AA?}fB`@wBNAmB£ABţA]AxQChY?{B!APA0AA?BE@xBCC=BCCBCCBCC7mq?]DBC`A0AA? 4B ђ@p{B䷙C}BⷙC2"BᷙC&BBZs?ˋB`CpA0AA?+C=_@_WC#oBhC2oBsK@C2oB_7B2oB64|?HC{oBA0AA?kNCT@O|6C~C;7C~CaC~C-R(B~C|}?6C\~CA0AALB@BuC`BuCBuCpBuC]?mBuCA0AA? C'p@@ C`Ba C`BhTC`B@A,lC{?.+C``BA0AA?);BF1AmkB?#C=XB ?#C|A ?#C BCc?kB`#CA0AAB1A7>B)BY).B)Bs+A)B?'AjʎCb?4>BEB?@AA?BO@;C-\B̥C[B2B[BfB:jCVw?3CTB@@AA? B@gTAo CEAl C0hBl CZ Bl C?%AC@@@AA?O*Cu6x@\nSC Co7OC| CDiB| CB$Cn{?PCԎC@@AA?WmBN@"BzC^BPzCBPzCK@QzC l?NBxC@@AA?\q|C8@3C3C%.C:CaC:CC:C{?e3CMC@@AA?q{B@XCzEdCp8BCEdC.BCEdCBAB/r? BrcC@@AA?;Bz3@LB^`B%4BP]`BlvBQ]`B\WATlCPj?BJ*ZBA@AA?PZRCbM@YCTB RUCETB4KCETBA6iC[}?n"[CqVBA@AAs*Bք@B]C BCgo[BCWBD[C5Ks?yBRC A@AA?H EBjt@YBC'RAHCAHC@@wC< ?BF(C0A@AA?ISB@]B&C| TBT C AT C4Aw*C\L?n_BL!C@A@AA?B\@Z{B$CrtB$CWB$CxrA$Cui?d~B CPA@AA?csB@7ACB~A|B_kB|B?B|By8?AsB`A@AA?OdCFl@5;CyBLo=C$yB5C$yB:.B$yBq}?e;CBpA@AA?bCs@v>eCC+eC٪CnC٪CcB٪Clw~?eCCA@AA?ͿB@(KB.CB.ClB.C}?.Cv?IlB&CA@AAZBv@dB?e5CCB>e5C ГB>e5Cl2$B螲?v?(Bb5CA@AA?Q_B:LAC`B{fCB{fC|zA{fC$BIB3u?BfCA@AA?(IB+@inBM?C2B M?Cq C M?CyB M?Cz?Bef?C?PAA?kB@HBՌBB5ՌBC5ՌBaA5ՌBq?FBkB@PAA?13B΀-ABˇCBˇCtA/BB/BP?BXC@@PAA?,AJ2APByCBxyC(BBBBe?'BxC@PAA?4Cџ@C*C! C?CVC?C+B>C+tz?#CIC@PAA?}AvABMCB MC`Ba0AEC`0A31?BKC@PAA?WC@ CBCB+CB}C BBz? CTRB@PAA?C @xBC+BC.CC"~BCy?˦BCAPAAbC N@k&CCO CC9BCzBCV5z?6'CCAPAA?Bo@4~BCxHBïCaBïC QBc+Cs?BϯC APAA?4@C%H@C ưCr CڰCpCڰCBBڰC{?CC0APAA?wMB@ßBBv_BBhABD|BdDCZe?BB@APAA?:3B/*@i|B#Cx3BCACnACF(?B~CPAPAA?B;@B"B>\BkB*?\BFA+?\BţBkC^q?JBP4]B`APAA Cbf@C@ C 3@C3@2`m@2@n:z?UC@pAPAA7lBF@IBs&A܋B|&ArB|&AZA{&Ags?:BIAAPAA|BB@ʠBBCpBBCLBBC̺@oAzp?FBCCAPAA?aB-ƭ@/BCBC_7BCW"DAC\Du?{BhCAPAA?B+@hBvCO`PBvCJߐBvCAvCp?>uhBCAPAA?TB)sA{wB*J4C B,J4CAgA,J4C@V>P?1BR4C?`AA?Bީ@@B\CזB#C6'B#C@BCWg?췖BC@`AA??C$ߌ@bCBc]CBfCB7B'o[C([}?t)aC{B@@`AA?eÚCf@CtC~CtCS5CtCQBtCP~?1xCqC@`AA?[vCK@ iC-BFdCa-BCa-BBb-B~?NjCB@`AA?eB|@ B`CMQB`CB`CA2Bv?Bb~aC@`AA?B@ MB'CȝB'CgB'CXA ­C3j? Bp)C@`AAgC@EDBC0kBC@CC*BCUw?B-CA`AA?Bl@RCICEBJCZgBJC0}B,Az s?B1JCA`AA?n[Cc@3CXB^,C|BaC|BAB|BM]}?˻3C B A`AA?>cBN@ CrC=P CrC A#{B&C#{Br?v CsC0A`AA?"B פ@խBQܧCάB`ܧC(WB`ܧCE;BCi?KBCC@A`AA?9Bh@B`CɨB`CGB`CKMBb2B1j?B؏`CPA`AABw@*0eBlCdBMCqjBMC$*BMC:i?cBC`A`AA7CA#A ߩBByBBYBCiBCgQ?NBBpA`AA?oiB%@ߥBXB7BXB=AXBZB3ֈCGm?&B_BA`AA?B:~@B&-YBdB-YB%B-YB A-YBy?[@BYBA`AA?0A/EA"BCiAC"0?ACёA%TCJ2?TBњCA`AA?GBA?dJB%>?HB9@HB!@HB=Ǿ? PB?pAA?EB6<@[~B|B?xBY|B̃BY|Bu@M|BHEe?kB|B@pAA?Cni@$C3BC6BC5BOACW{?&CB@@pAA?0Bv@ΗCl-Cd~B-CB-CAC7w?<C+.C@pAA?B@ BABABAeХAAm?KB,[A@pAA?C`{@D_(C▕C\ CݫCBܫCfBqBy?$(CC@pAA?C@_CBfBB26CBbBBx?NCB@pAA?'FB<@FBOoC1B0CAy=C ApAA?b*C^@)CVBd)CVB[%CVB@ՈC{{?+*CjFB0ApAA?ՕB@)BqCBqC BqCBOwB[_r?BqC@ApAA??Bt@VBA.BABAI`AZ`RC/w?VB 2APApAA?ƑB-@1B?FQCrBHFQCۑBHFQC\AC2A?v?cBMQC`ApAA?+/Cl@gC|A(C|A?C|AlB|A}?`CNApApAA?7B@BBBBaBB@s>C,q?AğB BApAA?.B(A BՍCBՍC&BՍCE AՍCmE\?z BCApAA?\|B@=B깇C{B깇C4B깇CABWv?_ BBC?AA?*#B8@)IBCd?BCBC~ACR?JJBC@AA?EECz@hCXbBa]CfB'CfB9VBYC|?ȹiCjB@@AA?yCǁ@BCѠBAC0CAC^BACYr?/BϬC@AA?*C@CVHCCC:CCBC2z?xPC|B@AA?WCՐ@d|CdCsCgCCgC[BgC~?}CIrC@AA?[ȇBZ@BBuCB%uC|AB%uCtA:C)m? ABC@AA?CU^@,Bp1BoGB8q1B7C8q1BB8q1BYCʝB ?YC A?YCiB#B9b??ABYC@@AA?;wBs@SBBmBBXABBCq?MBqB@AA?<C@B3C(eB3C#!C3CsB3Ch w?*B 4C@AA?`͸Bd@B{C\AV8BYF\AoBXF\ApްAUF\An?PBG6gA@AA?bWC V@.BZBBVB~YCVB<AUBw?BB@AA?kC˽@IJ@CUCaACUCeCUCښBUC+}?AC=DCAAA?TBH=@eyBVlB5{BkB~gBkB@TCf?wB![BAAA?\ Br@ίBhCF|BvhCK BvhCpAthC|7q?-B'Cq@Cf[ACAw~)CA8A(Ad|?ClaA0AAA?-dBړ@p٥B B좥BB CB%hBBuw?EBSB@AAA7 CRo@cC&A)7C&AWC&ApA&Ab{?ZC APAAA?HB5np@DB>BDB/B|4B0B |XA[Czoy?BqB`AAA?A,Ab(B̶qABTqA@vCC)BvCCD?d'BsApAAA?OB?@FBQ{BB0Bp{Bn@HBp{B8@l{B#h?J%GB|BAA?x%^Bx@A4CWA4C(?B4CA4C׉4?1A4C?AA?AA|A%|C/A|CՅA BY#B BT>\AC@AA? BABCBC+iAc CABc C8?@BC@@AA?BUB\@oAlqCAbqCBbqC8TBbqC6?!hAIC@AA?VB-@?xBCBC0BC$ @^C6s?Bz5C@AA?aoC7@zC4ڨA­|CڨA~^CڨAwADIC~?{C SA@AA?B/@PB!AoBA4%BAWB?LCGq?mB?"A@AA?B̜@B&AB>A1~B>A6AICJl?sBîAAAARBZ@BC^B=CMB=C3xB@B/r?=BCAAA?Bc@CBC{BjB{Bqc|BCy??wC?qB AAA?~=Bt@MB.+uCB0+uCvB0+uCX>UBZz?B2uC0AAA?Y&AA@AA?PfBȲ@-JBCmKBƺC@BƺC).@B@[?aSKB}C@AA? B@^B9BBBCB/+BBN_y?B7BAAA?!^Bq@:B^UC B[UC۷B\UCAcBz?HB#UCAAAqB׹@l BգCGB{գCvBzգCBzգCM?lBʔC AAA? JjB@BC!BC%AC0GBCNl?7BHjC0AAA?B<@ڝB}CBCmBC1ABt?BC@AAA?]Ai@3BxBXAxB8A4ދCW(B4ދCם ?B BPAAA?4zB@u9BC%O'BC韖BCBC_o?9B@CAA?T C~ s@dBo3B<=3d!C==3X0B>=3?ABge3?AA?Cd@ƒACNC73BCoCBoCB8ʦC|?rBCC@AA?ʲC@BF"BWBBk(CB~BB y?-eBeB@@AA?Bژ@JB٠CXB٠C_B٠C27B٠Cq?"B\C@AA?[BW@(AmCAmCd)BmC^EBmC@?&A\$nC@AA?BB#*@BD"B0ͻBD"B{BD"BA\Cu?Bz"B@AA?7BU@BC{eBC2BC0?LBwt?ZBpC@AA?F@B@oBZhC:fBXhCAXhC^ BCV?oB]CAAA? BG֥@;B,>B'B>BB>B!׏B>B!b?B۵BAAA?GBc@ABB܋BBfBBuDAC7s?)B#B AAA?B@!BnC߱BnC-BnC@ق+C/z?BC0AAA?AXAQiA1!C}A#AHC@AAA?[B@aBhBlBŤhBBähB.6@<)nC$z?vBhBAA?xB6@ &tBCĒoBCL~BCk@C(O~?mgtBC?AA?B Q'@B(*CqB&*CޝB&*CACآw?B )C@AA?APAvDBw@B-?Bչ@Bύ-Av.dCjBv.dCK&?VDBBB@@AA?`BC@BSC|BSCIfBSC0@x|Ayf?⍂BSC@AA:BJ@BB BnBBnBf@ٺCu?݅BB@AA?_B Ŕ@.B C@NB CB C7@Cx?BfC@AA?Q%B)t@-BS3B*BH3BlBI3BکA`Cz{?vB3B@AAB-@kBOPCԪBHPCs7BHPCX6B$Cv?~B4CAAA?Bh@B+CaB+C4B+CK:@+Cy?B>#CAAA?vB@NVBN tC- AȽCAA?A@ AV4 At4pA4CB4CK07>A4?AA?2׍Bz@BBBBmBBA=Cxt?BB@AA?OB]_@@jU-A5HC@AA?pNB.q@n;JBCm:BC[ACA Cc?{KBC@AA?vQMB?@BICsBIC BIC+A#ЮA+ n?1BIC@AA?BP@PҐBpB/BpBǻBpB˽ApB"_w?BpBAAA?B@$)BBBBBB"4BBBמAD!|C|?^;BtAC@AA?LBH@B!CiB CC CHB Cs}|?B4C@AA?uBQ@3Ad.NC|AW.NC AV.NCAV.NC:>?ANC@@A D|w*Co@-C4Cb?SC4C@A?PC0@*CC|3C|3B4C?Cq3AA?C@BC#BC2,CCBBC6B?BCAA?oաAPAB4C]B4CB*"7D0C+"7?1B4C AA?ùBA@8BBBA҈t?3B0AA?EB=@s-B4CfB4C,B4C A4C?B4C@AA?NqC\@TTfCV4C_C̩4C˩4ZBЩ4?eC34PAA?^B@2B&BCBC"AC?BC`AA?A5qARB4CB4Ct{Bf%7N0Ce%7l?#B4CpAA?~A0A5@4C9ݷ@4CK@7B:#A7z%=*@4CAA1~ BvABB4CSB4C%A[%7]B]%7еy?GKB4CAA?T>C?Ӟ@fB4C>B4Ca],C4CpXB4C?>xB4CAA?ʴBu@3pBNqBC%BCnBC?4pBCAA?8FA-dABK5B v5wA4CEXB4C2?!B5AA?B@"åB4C.ҠB4C<"B4CB4C?oB4CAA? ASAW'?4C$?4C=J37w?F37rA<">4CAA?QuA&CAA3CրA3CBh@CߝAC>{A3C@@?A?!!C=@hD}CDחCtCחCA^B$?IDC@?A?C=@nCΓCCC|ȦCC"BBr~?CC@?A?jC/w@1XCUBhCB̦aCB)@>gCBz?d_C~B@?A?CR@Ck&CdCL$CCL$CAL$Cj|?ȗC>%C@?AC @W:Cc>C%AC>C]D>CB>C~?{C>CA?A?PCUL@CpCjLCԂCJCԂCAԂCr~?[CGCA?A?~C6z@_zC\sCsC mClB mCB8C$Bz?zCC A?A?|C;?@F)C [JC7CyKC=ieCyKCB۸A9@|?QCa"LC0A?A?LBg@;BUC8BCC|BCC"xbBCCAV?":BC@A?A?wCh!@ɚC BCBCBtWBBc~?3C BPA?A?B1@BB{BB|3BBުABl?rBOQB`A?A?B蒰@QB]BgB]BuuA]BnʴBekCr?BQ\BpA?A?~B@~BCZBYCotBYCFEBcBϗq?BɆCA?A?+A%;1Ah BI@? BM@r@p;C$Bp;C>?5UBAA?A? ,Bsw)AΘ BC BCaACKYA\C? B5CA?A?B@BmC&BjCBjC@DBI5Cx?qB6bCA?A?B@B8ڈCӵBڈCBڈCSpAGjBt?BuB$CA?A?m BCBc y?B`BA@A?XC@BzCCzCK6CzC4YBzC{?2BzCA@A?޸BMAjBФC@,kBФCEcBФC"?Ce?kBɲCA@A?@B@B'7{CVɸB,7{CtB,7{C7q@,7{C{st?BK{CA@AT*B3A7%BNlCFBllC߁ BjlC? `B$uT?QJBnlCA@A?eB@kBsRBBsRBPBsRBYNBuRBy?9PBRB@@@@A?]C@ÓC}CCbCCbCBbCR}?dCC@@@A?`!AC@-CzCJCYC[cCYC$BYCu?CДC@@@AnVCs@[C$CVC=@+BIC=@e[A6CNx?4"VC>@@@A?΋%C. N@)CC6C?hCC?hCd:BBu?P2C懈C@@@A?Ck@CACC߹@CU(C߹@CAKA<}? C}@CA@@A?86CBx@oC2A+kCtACtAKCtA*}}??hoC@AA@@A?C @CnV}C긼C "}C)%C "}COB?DBF=~?[tC H|C A@@A?zBCՙ@eRCaB[IC]aBR2C]aBDAklCfz?BNC`B0A@@A?"Cڏ@J0C BF,CB۔CBnBCB'|?-CB@A@@A?pprB@cAB/ABG BB7QABa>BAReBPA@@A?&CP@^ CNCg C-CZf>C-CPSB-CA{? CY%C`A@@AZAOBk=@+*BTJCy$B'TJC"uB'TJC@:A]":?-B2 HCpA@@A??B;@QשBl@`BGE@BGE@~s@GE@wuk?B0@A@@A?/B9@,BC-B΋CrB΋CmA΋C=yu?BʧCA@@A?MįB3R@B?6CyȷB=6CbȏB=6C\A7 @n?ǶBy6CA@@A?OaB73@TB34CRBP^4CA{BP^4CAP^4CSv?KB@4CA@@A?-BS@MBD`CKkBD`CBD`CAD`Cs?-B"`CA@@A?CRۄ@BuCBuCUCuCpZBuCvgy?mBtCA@@A?%B|LA3A%'C*A#'Ci1A#'CSpA#'CV >|3Ac CA@@A?'BG@]BZBC#:B[BCOB[BCVdACx?gBGC@@@A?5C@C7G;BC8BCA@A?3CW@,ECB=CBCBACx?GECB A@A?B @0BnDC“B;3C$& C;3C}B;3C//i?BՊC0A@A?u!Cm@^CZBfCZB!& CZB3@ZB3]y?5!CYB@A@A?*ECy@YQCBDgC,LC3DgC8C3DgCAMBC|?BPCy gCPA@A?*LC.@CCDUC ?CDUCTCDUC\ADUC[G}?6CCUC`A@A?;B' A:úB&6C"B\6CA@RB@D]?O3BɄ4CpA@A?nCCG@LrCKCfCC]rCCM:BACr}?qCCA@A 1B?9ABxAC-0BqACWB[AC[AGg?BڥACA@A?C| i@> CaC CaC CaCQUAaCz? CaCA@A?Cۆ@WCCTIC(CC(C@CCC{?[CޡCA@A?ϞsBxAB+_B>BK_BsBK_BBK_BO?"B܈BA@A?zB:A"4BrC-BbCBbCAbCZ?d4BӋCA@A7LB3A BwC&BwCӯUBwCZAwCy_??BoCA@A?̕BALYB =C#FB =CB =C0B =C;Qu?mYB =C@@@AB3}@B_C BrCWPArC}BjxBJ]?BکkC@@AC%گ@wCC9CCL-~CC_AaE Cz?pCC@@A?^WC@'eCm@QCi@}Bi@bKCP:C{?yCH(@@@A?pCp@ACy_Bh=Cb|_BNBb|_BgBkCx??\gAHC@A@A?KBv@BK C!òBr CE5?r CLB-B%?e?ƺBCPA@A?jC@w@KCvCyCvCOCvC@ .C~?’CCC`A@A?lC@7wCCsiCCCC;BC}?vCCpA@A?BCr@CO5C CD5C"BD5C"BBBz?P=C CA@A?HC4iv@C`pCCnpCCnpCS?csB#Qz?C"qCA@A?[SB4r A BWκA3BQºAi*BRºA`^c@ZºAE?ЬBtAA@A?9B|Q@nvBrDChwBDC`BDC@ALf?wBDCA@A?cBtAG~BaPC!BaPC0 BaPCB"Af?[B1OPCA@A?Ѷ8Bb'IAAށC;AށCAށC|(AށCiA޼CA@A?B%@BCF BCBC[BC/h?>B޷C@@@A+:DHA'C#&CWmC.%CD%D.%CbC-%C~?yC E%C@@A? pC@Q1CCsJ.CvCCvCBvCfz?#.CC@@A?$:CO@k/CB9,C:YB">C:YBFHA6YBՃy?^u.C,B@@A?{CAA'CB"CqB>)BqB{B]+TC]v?&CgA@@A?LA2C@΁CCBzCCBC4iCBz?n)C(՗CA@A?gB=A!hB6BsaBv6BVAaCO9BaCz> oB|5BA@A?gC>|@ӺBۀB^B~B C~B}B~Bvs?Ba~B A@A?WBom@iEBǂC BCċ CC BC2g?3BoC0A@A?SAF^$AWOBͭCBCIB|BŒ7AC`A@A?CK@E27CAj/C{AC{At*BcNCh{?58C ApA@A??ΦB>@B`rBeB!arBaBarBI5BHpC s?BsBA@A?DB/A4B XC5B/ XC?(B 5=B(B ?12B1HXCA@A?e.B)AB?AB؅AvVA؅A92ADC?B AA@A?ZB A4BwiC4B`iC?;B`iC?niCW?l5B[hCA@A?uB`6@f»BN CfBP CMCP C8_BP CYv?VBCA@A?ANK1A BBضBBhU@B$ACV1?: BoΛBA@A?2BS.A.BzCdYAzCs/BzCaAzC3GR?gBBuC@AA?_A ABVCKBK=VC@B,BF:UC,B?mBUC@@AA?5CxAJYCXCsUCxC CyC}ِB1Bzz?d;XC&C@AA?~BR@BC;B8CA8CgniBBnU?;BϒC@AA?4B@5B)Z CB= C~B= CAK'A= Cd?6BB@& C@AA?C\ @OCCCC(CC'"BCs?CCB>@AA?`]/Bћ@lr=BW}C9BzCAp@VBBBXB>?JBtCAAA?;OCC@g}+C%C (C?&COoC?&CB@&C{?/C"JCAAAʙ^C{@imCz^CxfC^CZPC^C`-A>"CG|?nCC AAA?yBۃ@JBiC~B(iC7W,A&iCB,VBvi?kBZfC0AAA?҂eC-^@ҕC]ڢBڽCڢBh:BܛCZCfCܛCvLBܛCx?"CBCAAA? CxÖ@gC B®C5BqC5B`XA4B{N~?sCnB AAA?v(BSc@r؉BwCBrwCCrwCs#BrwCqp?nBxwC0AAA?JCP@KmPC)CJC)CoDC)Cj@CCK}?TTCl)C@AAA?B8@ඣBRCXBzCBzC@=AL C2i?-lB^CPAAA?[mCuZ@/_CBwUC#BC#B1.B#B}?^C;gB`AAAWCzK@vC>+CsB>+CQ3C>+C_pYB>+Cϙz?JC+CpAAA?`JCOla@)CC*CC.AeCC"jBC<|?õ)CUCAAA?ko Cm@.CACAApCBAH@_LC̲z?zCAAAA?0=Cj@,yFCsC!GCsC/CsC~A9C}?(FC\CAAA?!CV@BlaCBjaCh1CjaCBjaCt?cBmVCAAA?NB@o1BciCSB^iCACB^iCJBCu?cBYCAAA?Hl>B4,A)AqAAXAJ6BYAAZA7H-?eAxA@@ AAjAA/kB/C"B,CIBB!CB>6ϿB̖C@ AA?veC@`CnvA,C+A>X$C)A\A'A$v? C!A@ AA?SAIAwB6B+pBB`EB9C B9C>PBsB@ AAߒC 'AhyC\F9BrtC}G9B+C}G9BBG9BY}?TzC5=B@ AA? CEN@B{C[B{C C{CMB{C\Qt?BCA AA?66YCAP@]wC{GC1qC{GCr+C C A AA?I7CC_@XBȀC~B̀C=oC̀CvB̀C {?B]C0A AA?,CHY@3UCzA$LCNQAexBNQAB*QC{?FTCyA@A AA?Bǖ@x+BBI;!BJB̴BJB ^HBJBlP?c(BGBPA AA?2ܓB/@BN CB" C B" Ce'@" COk?"ЉB eC`A AA?{By.AxB`B1NwBB~ArYC\BrYC^/?wBۂBpA AA?8cCc}@W0CC1CCՈCC&BC}?GV0CCA AA?+C@`@FBq(@BU-@O%CT-@WDBN-@z?OB0@A AA?u0B!RA$hB9CfB9CA9CzBXB8\?gB3CA AA?+B@-cBxbCOB}bC0B~bC,B=;B-lp?BbCA AAa*BS@XB2CݭB2CB2C4A2Cl{?ŹBBCA AA)ޚBH @XօBCyrBCBC.ACYw?B C@0AA? C@vH-C CuO'CCgBCm|B@Cx?o"CC@@0AA?*Cr@yKCRAYHCq,ApCq,ABICR{?*NC3*A@0AA?#B'@B"fC&BbfC?XBbfCPAKB^?͏B=kC@0AA?sB@Cm3A4CPAiC_3?IBCA0AA?$!BH@BPCOBPCBPCo#BPC w?uBRC@@AA?F,B!@uB:CL̊B^C@"%CB"%C C@EHCCpBCCBCDBtB^z?DCC@@AA~C@R$CȮCyuCЮCqBЮCB?Bǣx?O=!CωC@@AACgl@XCECJCEC-CECBECtB3x3C@@AA B;54ABjyC+BxC9*@xCAjClo ?B(BCA@AA?6zCצ@\C BVC/ B׌C- B(B- Bt}?|_C BA@AA?tWCy@u)CF&A?"CA1TBAS BbKCyz?)C7A A@AA??C>@p_CQA ESC9A&C9A?2B(zNCu|?3a_C} A0A@AA?B^@BOABD}ABD}A}BD}A^?Br@@A@AA?/AY A[B7CB7C~B*B@E-C *B@PR?CVB7CPA@AA]BCmz@NOCjCNuPCjC/0CjCmB,C|?&OC,oC`A@AA?CT@)BB7BBAZFCBLBB̮y? BYBpA@AA?0\B"@]_B Ct`B,+CB,+C9B,+Cbk?_BLCA@AA?Cn@^C Z[C+CZ[CCZ[C >Z[C|?rCWh[CA@AA?qBaE@B ښBoB ښB;B ښBBCUw?By֚BA@AA5B@5'AREWBv-BmGGBs-B]As-B1AwC7f?`8WB#BA@AA%KB @̋BC}BCBCfBC{ly?ӋBWC?PAA?qC@=BxC@BC5CC܇BC.v?BC@PAA?-B@BCBĹCx"BĹC BBq?B*C@@PAAC@CB(]C<5B"]CՌ@A$BFB?$B?=B]CAPAA?L6B֓@v?BᰄC ÖB C6LB C'A0Be? BC APAA?)CJC@B ՕCBՕC9 TCՕCZ-BՕC{?Y!BC0APAA?C7U@ BCBCLCCA2BCh?2BC?xABCA`AAj"BA9BPA1BPAAPA¢AJSCpW?H%:BAA`AA?ZB2@B@AeApApAA?B>@BC BCBCx@E(B ty?RBHCApAA?A?!AS BCAC?CA )C&? BCApAA?hB@vBNBN`BNB>4BNB-{#BNB]w?vBNBAA?RAAEA A4C A4C bAe76YBe7'>A4C?AA?;C@y$C[BC BbTC B:9]B B t{?^%CB@AA?A AeLBϚCBBCACvBCt??JBMC@@AA?%,CzV@ClACL A@ؚBÅC[BȅCGpBȅC!A 3CLWi?BڗCAAA?JBm@:iBYBjBlZBFBlZBv7BlZBf?CjB BAAA?[CtB@ǂCCHCC%YCCtBC~?pCC AAA?MBQb@BC Bt C7#Ct CIdBs Ct?B C0AAA?DJB_OAAL CA C87A Ce@|ɟCu>~A C@AAA?uB z@B7B?CcB?CB?CrA?COty?=B@CPAAA?$Ck@ICn C@Ct ClCt CWv@w C~,z?mC C`AAA?&۔B躢@B CgBC$BCvBlBsw? B]CpAAA?fB @TбBC]JBCOBCAvCIw?BCAAA?A/A/A ACACm&sAC\&A!X1C-0?jACAA?>iB%@BC BCBBC`@BB?ߡBC?AA?s1B@*;BCP97BCdACAcCpAAA?sByɦ@ 8BC C-'BC CLBC C#BC Ct?8B, CAAqBS7@xK_BCd`BCBC,BCy?^BC?AA?zIB@.+BWC@,BHCnAHCP?gA}B`6?п+B#dC@AA? wC}c@pCCzqCCwxCCV@C{}?,/oCVC@@AA?9B@BA{BկB{B!-~B{BAޏC}o?ѮB7B@AA?׾B) @J*$BKWC!|%B[WC޿C[WCB[WCR6f?b#BҗC@AA?C@K,C(C-CDCBDCzYBeB2A|?,CH C@AA?NBn(@6NCgC1CכC9\BכCcBC=y?`CћC@AA?Aeb-AEWBJ=CWB=C}AVA[;BXA4'?VB=CAAA?EB?@jNBC]OBGĊBGCAGCnjd??OBYCAAA?J&BU6@PsBi?CRBp?C_u?(B6?C AAA?BAB%ECB&ECsB&ECD" BB't?B$HC0AAA?@B@ߢB9/CB9/CB9/Cݧ@CDr?~Bbd/C@AAA?KeB\@GB hCUB hCB hC8B:$PBr?IBR hCPAAA?\Bda@ݬBC6BCBC@C Mx?gìB C`AAA?A3'A@nNC)@UNC@UNCZ~>SNC?>h*@&/NCAA?BZ@BB BBbBBAAC?{BB?AA?;qC@CHCCMCg[CMCM"B͛C]~?ĔCPC@AABn@B~rC:B|Bl:B{Bm A{BˏArCG?(:B{B@AA?єB,@b=B2B%>BBBBBBc?f=BB@AAo@A$AA"xC7׼A)xCg@BABp&>9ZAC@AA?oB@U4B6Ck3B6CYrB6C#{A6Cpa?D6B5CAAA?M2C@c5CXxC.1CUxCj0CUxC-?C|?6CnCAAA?Bε@ Bg+CzBw+CgBw+C $ACdj?B>+C AAAB@9QB#CҝB#CQB#C9A#Cr?^B#C0AAA?dBsl@@B{ CkB{ C]VB{ CU)B{ Czx?BQ C@AAA*Bz&Y@Bę-CQBș-C5Bș-ClA̰C |?B-CPAAA?~NCT@ Bj\CYBj\COC!Cj\CpBj\C}?Bi\CAA?=CS@Z.CN.CC&LCCAC?A.CC?AA?ZCRj@:SC[CiC[CC[CA[C{?ȢC`PC@AA?pBXA:B7A6:B7ANlA7A`A,x?CG?*:B3BA@@AA?BbFA{BvXCBmXC~AmXCABǷ>?BXC@AA?%0Cf@1C`9ACC`9ACDC`9AC,(B`9ACyB}?*C8AC@AA1bB@'ACWACK^BC @AC_=? AC@AA? Bݸ@-BB~BBBBD_MUA1C0AAA?ęB@BECGBDCpBDCABJz?,BnCAA?5AeBj C?:4@r5Cl?]BV C@AA?Om BAB"C B"CA"C?aAkdCK?XB6"C@AA|9SBO@ EBC=BCdAC8BʯBv+s?BhC@AA?2@BA+B $B B $BL>B $Bh A $Bf?I+Br$BAA?jA>AACCAC[)ABxBBP?AC?AArBΫ@BBU2C.BU2C0AU2C}A*C]!g?ABA2C@AA?2٣BU@èBC_BCSBC@C0z?z B뺋C@@AA-gBN@nB aCYBaCr`BaC ?aC]s?LmBaC@AA?FTBւ@GBQ.ACKBS.ACBS.AC2BB@A?kC S@k9CBJ.LCBCBvBB?ĂKCB@A?c;[CCC@qW)CB&CB܇CB BB?6'CBAA?B>@EBCBCqBC8BACn? BCAA?!B^@2BBjBBfBBABtV?BB AA?ؒC^@OCCyCC1 CC}AB?#$CC0AA?B @:\BC"VBCL CC3BC?x?hZ\BC@AA?aC@PCC(KCCxCC`1BC?,PCCPAA?&AByAĦBB*|BBABX#kBCZu?fPBB`AA?PBP5A0BBBB͜BB @B}X;?*[ BBpAA?ՃB|@^BCvBC~BC4 $BB?elBCAA?CN@D=CBzBBp CB4BB?BBAA?9B@4BBYoBBQ BB AC?;BBAA?HBjAXBCVBC1BCNABj^e?#UBCAA?Q}BpA.UBC+TBC BCJTBCZ~?ȔSBCAA?LB#n"ABCm2BC?CC BC?vBCAA?YATbAۗABˊAB0lo@BYAC*>zAB@@?A?^DAȏCCDvCkCvCBC~?iDGC@?A?rCa/[@׍CiCv?CCCCCAvޯB +|?ԐC}C@?A?pB7AݎBCŌ8B(CA(CAQ Cу?TBnaC@?A?uC@YcCC CCԎCC BCi}?jCC@?A?W}Cqv@چC 7BC3Bl2jC3B.B`C|?7)Ch.BA?A?RC|@CsBCUsBCUsByT@OsB"w?aCԓBA?A?B8d@8B٪.CӞBx-C}Bx-C"HB\dC0A?A?C t@cBсBBсB,CсBlBсBkCu?>BIB@A?A C}q@VBCXBC5(CCŐBC@u?LB CPA?AVCd@JCNHBrFCHBPbCHBAHBg}?MC>JB`A?A? B0 &AA1B[AeBA ?UCHAUC!q>A-xApA?A?B>@⺓BwCBrCBrCؒ|@rB~g?cB(CA?A?]CX@}~C:CxC:Ci_?C:Ct8eB@)~?~Cwz:CA?A?ܐ4B-AS)B>C*B>CA>CnqAB*??%B CA?A?'B@B,JGCBB(GChB(GC'AuFApg?TB%GCA?A?5ԔB@B*'@>ƂC@@@A?h/DFAsD2,>C"DZ A > ǃBb4Cka瞞AߎB`A@A?KmB@TB;\C'B9\C8(@d BjBd Bͷk?BB_T\CpA@A?g}Bv@G0BcGCI&B~C(0nB~CA~CL?3x+Bl~CA@A?FC@?BCJBCcCC*BBCx?IB3CA@A?B@BB9C`"BB3B~~?ŞC;gBpA@A?B"C@3LBbA#FBmABoAfBmA1j? KBPAA@A7Cf@MCiȐBKCtȐBBsȐBt1C;d|C{?3NCBA@A?זBm7ABOCBOCc-?OCBC:$?jsBDCA@A?B @BѤwA*"BdwA(m@(sCsfdA(sC@(sCU> A"7C@@@A?wCIJ@C@ C<C$"C~C%"C A&"Ct?h) Cb#C@@A?PC?@BCnqBĥCNf/CĥC^zBĥC&s?Y%B٥C@@A?`C@ TBmBBBg0CBٙBB?q?Bn"B@@A?tB0j@~8BCCB4ܫCCB4ܫCOAf#CQ^?B/CA@A?bC,@PfC޿AZ`CAiCABA)|?POmC[AA@A?C&ǃ@u&C9B"CBVCB0SAi1Cay?:?&C;B A@A?ĺAA7B.kCV]2BkCFA,CZB,CA>GGBC0A@A?JBb@5yBqCBqCvBqC.?qCC0BP>CBP>C@|Cy?B25CA@A?B@ lBB+iUBBq,BBsߍAB,s? mBB@@A?"B'AB~BBbBڤ@XC,BXCE>`BRB@@@A?6C@sC>L@nC/@B2@B;C&{?lqCwb@@@A?BC@bmC\BhCLD]BCKD]Bt~BID]Bl|?elCe!aB@@A? `BL\@lBC}BCwyBCBCkh?G?BC@@A?k ~Cj@WRCGC%FC>CC>CB>C'{?@HChC@@A?tCn@7CؘBd/CBBB>^BWCow?0C BA@A?jCCQ@%;C6\BϠC8\BD C8\BUAkC'y?OLC`BA@A?u9CX~@B`C1BlC}CkCCkC&w?BC A@A?]B'`@B;CrB;C#NB;CA;Cjs?xB6C0A@A?e-B\@Y+#CAChAABhAKBDC{gz?̼#CyA@A@A?ڂC@^CNIC|CNICtCNIC7AuAW~?C ICPA@A?w)NCUS@hLCHkCTACDkCUCDkCGڛAGkCo|? LCkC`A@AB,#A@IBNCY7CBNCx@NC)B:B@?tLBԶCpA@A?B{@TBƯA-3}BABAApRBAzk?#BrcAA@A?KB&pAaB\ CCBj CAj CRBB^?BWCA@A?B0@AvVCs1Al9CιBl9Cq-Bl9CTA?A*CA@A?AGAA`4CS(AD4C^g@D4C@BןS>AHʘCA@A?FdBABB|B-B3B-B@?ApCe?HBBA@A[BB5AX.BcUBCBcUBC'AcUBC0lA"VeAV?*.B$UBCA@A?֣MBCAB#XC|B"XCB"XC[A`B3p?0B(TC@AAUCg@POC fCZyJCCoYCCItAC j{?RCC@@AA3BC(BV3CL]AV3CÔBVBX?:B#C@AA?C*BNx@e?BuB87BƆbB BdžbBbzBȆbBA?2BBtAB@AA?6B-Ժ@i C=B CB h BB9AP^B AAA?>Bdu@xBC@BCFBC &BC.kp?`BC0AAA? =B{@B#߈CB3߈CbB3߈C@2߈Cu?JBC@AAA?,B{@BwuDB?BsEB4BsEB0@\eCu?BHBPAAA?F+B.@ lB-B>aB hB B hBtB hBe?m]kBB`AAA?4LB?@BBBB @B2B;DCGg?BdBpAAA?*lOC@z=CmCx>ClC7ZClCC:AlC|?AC8C0VCD^9CWCD^9CAȫ@Id}?ާCu5:C@AA?jB͏@ "C#C~C#CkB#CBBCs?$C#C@AA?#C@'CBCy8CvCW%CvCQAwC=x? CC@AAN'Ci@RCSB CNB"/CNBbAPBz?C B@AA?!C홪@ CxCRCxCCxC @xCy?0CeCAAA?2C@pC=BbbiC&BC%Bn#B$BGl}?6nC˚BAAA?Cm@fCmCpC mCC mCu B"mC}~?ΉC!nC AAA?QB\@fB"JCB'JCB'JCVA'JCqs?+B[C0AAA?4 Bج@N@B1'sC1BF'sC؁BF'sCB|Bq?EvBwsC@AAA?Bf@綅BXCzBJCCJCtBJCU)l?/kB$CPAAA?vC#@B[CBTC2BYC3B~B5B*\~?\C#B`AAA? C\@KBxCOPB|xC.3(C|xC B|xCZw?hLB.CpAAAbB@BYCԉB[CtB\C AiMBv?EBCAAA[BҠ@.BVB B}B:B}B]X B}Bo?쏉BBAAA?Ba@- CC:Cȼ CD:CbsBD:C[ $B By{?. C+A6CA AA? B,AH7GACGAsC@sC@CY7>7|DAf3CA AA?_4Cv@{B2?B2?iC2?}B2?C{?B#?A AA?8NB ADBfjC^=BfjCw*BfjC7ߐ@B'_?DB$jCA AA?)B|(3A{#B.$CHB/$CA/$CLAClO?#BS$C@0AA? FC@B,{C{BL{C.CL{C}CL{CL-y?BgC@@0AA?+B!@!7C:,@C92C+@C8B+@C}CrBAw?E4Cr>C@0AA?BTћ@bsABrA%B?tC%BB%B5?AB@0AA?mCA@3FvCɺC<2oCCսeCCqFA]uC(}?'vCOC@0AA?#!C<@~CDC CDCQ0CDC7BDC1;z?A C4CC@0AA? EC7@CsԯC?C=ԯC?kC=ԯC~B=ԯCIG|?C CA0AA?]BcĻ@dYBB5KBߚBH&AߚBF,BfCb?%BBA0AA?M C?@`joB CfB CIOC CWC C(p?iBdC A0AA?;xBR@C C CS> CY B*CF ;C*Cp?2 C.m C0A0AA?vCT@CiyCrByCeCyC.ByC=z?!CyC@A0AA? CX@B]CUB]Ch&C]Cz B]CSv?BtCPA0AA?nBy_@BB)BFCB)B7B)BK?<@{CJ?ZBBB`A0AA?PeC̑~@3CvPC4C|PC4͈C|PC ]B|PC}?.3CPCpA0AA?\PCu@%MCNJoB˱MCoB9POCoBM7?oBj}?nMCoBA0AA?C0@BяBBB-CBDBB-B{?zPBBA0AA?N^QB݂@MBCo BC-2BC ACDA?B@CA0AA?fBa A7lBBG`BBA/RBBa@C]4q?lBBA0AA?י%B{3AuA},C\A},CFB},C{A},C?tAZ,C@@AA?Kx?C@A:CR^C}5CR^C*,BCR^C*IAR^CS5{?3z:C]C@@@AA?[B7r@&B`CWBCXeBC/BjCdn?BDC@@AA?C A%CCr"CC(7BCwBC ^z?+i%Ca+C@@AA?,C@w}CjCZ CjCSFCjCcBjC]{? C\kC@@AA?rUC;@NBC{BC!C=H@ACP[C8CcC>CcC @cC{?NCCjC A@AA?k,WB巶@BsC~+B;oC^@;oC B뼵Bi?>gB_C0A@AA?/QCχG@iC@%A C%AH{C%A&C%A |?tC(A@A@AA?[HBh@WBCFBCp?C==BCm_?^ȯB CPA@AA?RPBЀ@!BBBB/cBB3yAB/w?pqBB`A@AA?) CtXM@cB@]CiB]C#C]CklB]CBx?oB]CpA@AA?Bz@F>BMB'BcBBcBUAdB]-y?Bx*BA@AA?NB}@uCC CC-dBC(B&Cx?QCCA@AAKaA;tAbkA6A]aA5Av@PCLAPCPp>gA@AA@AAB1@ZB/CݷB/CͽB/CA/Cz?YB/C@PAA?ڐC@CC CʆC)BʆCA Cuz?H]CC@@PAA?`Bt7@B;BBBIBB;BpCr*q?RBB@PAA? Cձ@JCC_ CCBCA<"C-z?GC'C@PAA?"CHj@[zC`CPC`C$C`CA`C{?, C'CC@PAAC@/ C4CCCCCoBCCM{AX}Axx?4C?qCC@PAA?OkB@/7B8!CQlB!ChB!C AB*k?B"CAPAA?( B!$O@cBNwUBd>VBP;UB8CO;UB>BN;UBIh?SaBUBAPAA?hTC`~@XCYC#QCYCTCYCd@YCq}?XCYC APAA?pBߙ(A|KB kCB'kC8xAM(CnBM(CܳK?BYЮC0APAA??B(d@ggBLC+BLCBLC5BLC o?|kB?AbC@`AA?C=ݱ@L>,CSI.A@'CnF.ABnF.ANBg>C; {?,C_#A@@`AA?,B}!AxT2BvC2,BvCԀcAvCFAU]Bh*?lMBkC>BmgA>B{? CxqBpA`AA?eBaY@~BD{CuBH{C+(BH{CwיAB f?(~B|CA`AA?VBU@u3BABBABUBABEAAB6y?{B=BA`AA?<A+AA}CAé}C!aAé}C@SB>r?޼Ak}C?pAA? Ct@C=CW!ClC#ClCRAkC>1y?AXCC@pAA?B@B畩C;B\CB\CW۬A\CV)r?QBٖC@@pAA?/Că@aBRBrBuBCuB}NBsBSu?HtBB@pAA?/NBΙ@pBWOBCnB}BC«B}BCRA}BCEj?MBBC@pAA?B&֑@| CC'C6ЂCFB5ЂC5B@By?? C>C@pAA?wCA5}C&NCduC&NCl1uC&NC?1Ac~?}C NC@pAA?AABYCRBYCL/IBbBBbBr'?B]YCApAA?AEOCsA,A)B?`'BNC0ApAA?)CQR@XClB1CD[kB"CD[kB@;[kBC{?$CIOkB@ApAA?C;Q@IC6H~C6C:H~C C:H~CiY@EH~C%|?}C`S~CPApAA?׊dBu@iB3EC@B'ECn] B'ECz$B1A j?;BDC`ApAApBx&ABr,iCҮBl,iCATB8BTBiN^?UBiCpApAA?By@BrdCzBudCևBudCX/AґBT{?yBoCApAA?3qEB A@BשC*BԩC5BԩC*@ԩCsd?xAABC?AA?XB&B A4BG|C*]BR|C"?BГBBT\?>ܖB'|C@AA?1C:@:CtB/4CsBm+CsBDAC\Z}?;CB@@AA?BZBAzuYBnCsRBCe#BC3;>A' Ck [?ӈ]BጪC@AA?C/h@t,CRCx(CRCtCRC BTAT|?Y,CRC@AA?z C/2l@o%CTC%"CTCBTC\JB@SBW{?%C60C@AA?-B$A)CB?\LBKB[LBa=@gCBgC?+]BIB@AA?5bC@7,CB]-CBUC‚BD,BĂB|?,CBAAA?NC@q'C>YCv(C8YCUnC8YCB8YC|?&CYCAAA?|:Bz@(LBPC_֋BRZCBRZC @QZCl?=BjbC AAA?fDB[@QB`CC(#BbCC_BbCC'gB)vAu?lBcCC0AAA?sB@WZtB{?CWtB{?C4KB{?C~A{?Co?WtBj?C@AAA?(CEt@BBbBBX2RCBNBBs{?yBшBPAAA?D{B=@Z.B1PnCUk?nBSiBAAA?Cy@DBr7CB7CC7C)A7C_z?B}7C AAA?^B @l GBryCEFBzryC}ICBzryCb??B:b?ϸGBTyC0AAA?Bx@B0C#B0CޕB0C7AaC}Jv?MB=C@AAA?|Bh,@BC\BCBCNACSv?SBCPAAASJB@x^B'CoB'C"B'C@5B'C,y?B-C`AAA? CK5n@CCBC CCR;BC}?GCCAA?eP C:M@CC3CC3CC3Cp˺A3C?C3C?AA?kaC+@;ĊC;=ĊCĊCḂC}?;CC@AA?zCR@CBSC⽐B,B⽐B%B^|C4z?LoC!B@@AAOC%N@C6CC|6C:C|6CB|6CV|?CG6C@AA?#Ci@C"% CnCN5 Cu2CN5 C BO5 C{?BpCJ C@AA?B7@B.CgBC CCBCr?}B C@AA?vaPB@}BYB}B%BkA%BB|C̪]?Mp}B2B@AA?AV$AMNB&bCBbC_A;B0AB;Bך?BbCAAA?B@B+B̡B*BB*BoSA*Bbw?ڋBRBAAALA}B@YB0{A1rB0AAA? B:@B`CBbCꓹBbCm{@lCrx?$hBC@AAA?(AWAA8CPAB37bCq|}?8C3bC@@AANB@B B$B@B$B?BA?B.v?BB@AA?9BW@>Bx7N@B6N@XB6N@%A87Cl6w?9&B֙M@@AA?S$BAaB#C Br#C@r#CeiB9CHY?L4B"C@AA?QdBAHdBjzBbLcBSzBn76BRzBS4AC"e?dB$B@AA?C@ЭBTuCBYuC RECXuC4οBXuC6z?3BuCAAA?RBk@OB{,CB{,C.B{,C ?{,CAfi?B@,CAAA?{AoyANBE8CNFB=8CA@B@&.?2NB8C AAA?b:BCsAA l@ڀAl@MABl@Al@T?RAd@0AAA?_Bb@lB,BSB,B;CLB,B?1_Cjm?}lB,B@AAA?0B Q@]WBBLHBBAɲBB\ABxy?J(BBAA?B=@0B4CzXB4C|B4C `@4CS?2B4C?AA?YB@C,BC+BCN%MBCACe|]?E+BC@AA?yFCP@7OCC!MCCfh@uB+AeCH?UAB0AAA?,B-@GB筰C208B㭰CB㭰CB㭰C!hx?GBCAA?]BABBeBB>CBCkt?IۏBB?AA?~B$M@[Ck>XCP Cl>XC`Bl>XCeBB{?CDGXC@AA?C;BA(VXBʗCPBʗC+vAʗCřA(_B[?iXBC@@AA?)B @/C怬CbB逬Cj6B逬CL-B%C3y?v+CC@AA?=BV@vACAkACp!BCW|AC?^uA`C@AA?BS@_BC|BCBC ACF{?BJC@AA?g'Bsg@WirBC]`BCBCὺACG:t?~rBC@AA?~=B2`AlBHC6QBHCBHC\AG#Bzg?KmB)PCAAA?BĘ@BFCb!BIC]BICAHC|?BCAAA?{AhAABnABĴ@+9CA+9C ?aA3BAA?i]A7AaB4C(!B4C:JA%7EFNB%7wU?B4C?AA?.A@A8,AEA[,A @Y,AA=C%?AXA@AA?AW*A"1A>ġCX^A>ġCA>ġCA}C\?@AǡC@@AA?@ֵAAjACHPACo/?CZ.:AB,>{jA&בC@AA?5eBWAO~BzoCL`ByoCKByoCü@mBn?~BIioC@AA? \B@?6B\\;B%BB\;BBD\;BA@A?bCdjAXB4CB4C C4CuA4C?B4CAA?ӔC-bAhCCv3Cv3PBv3?YC=i4AA?8ŢB@|B4C8QB4CB4C@A4Cr?;B4C AA?B4@o C8 CB_#B4C?* C0AA?bzAxw.A>lB7=7eBf=7jPvBo/7@AA?8AfhAKAc7/AAY7*?4CSA4C>AYQ6PAAdB*@X\BKBB@4C{?[͡B`AAcҢBYv@hB⸅5 B&5ǑB'5 A4CZ?YBH5pAA?C2Y@iH$C5Cෞ5?Cෞ50[A4C?$C}ڝ5AA?B@~@BBʋCdA?BAA?AH6AB4CB4CXA%7v7~B%7ڿ>QB4CAA?.AZAڞ%A4C ,A4CĒ@7OpuA7>;3A4CAA?zFC@aCfb5]Cb5gCb5hBb5?܉aC5AA?l5AqRAhBNABXknA4C$LB4C ?BAA?sA-A3+@4Cb@4CA?$7]@$7>,=3@4C@@?A??wCwAYCV4CCM7CyeCM7CaBM7Cf~?ZC<6C@?A?ِCy@!6C6llCC+jCC+jC@AZBm|?CjC@?A?,ߛCX@CC_YB=Ck/BCk/BI Bl/B-c}?XCB@?A?5D?AJCC*CjޔCDjޔCpeBkޔC?;C5C@?A?iLBhAB,4CB[5CA,?C,?+\?B8CA?A?E~tC@ {%CbCzC?bCTC?bC. C?bCy?v#CJV`CA?A?}>B @gB[KCBƹJCХAƹJC*A,εA><BҶFC A?A?hA_+A>A3C*A3C~dRARݳC5!BRݳC>#A:*C0A?A?d>BIw~@ @BCCBCBCACs?BPC@A?A?6BA eBybC5`BbCAbCB:CbK?F_eBCPA?A?,BW{@|BoqA #BSqABQqA@4qAlv?DNBiA`A?A?C>C[P@[CwCG$CbhCSCbhCr:AB~?epCYCpA?A?.DB]AXACfAC7BCG AC.1?AXSCA?A?B@IUB ChCwQBChC^BChC]B! QB$u?)Bt;hCA?A?vBl@B C+B Cǜ C C B C+r?BHCA?A?G$Cu@^*CJlB**CcaBGCcaBgAYCW|?w*CYQBA?A?QLB"(AgBB=\BBAB@B-Cd?+ȌBBA?A?zCC@hBMC~BMC9CMC)BMCH{?\B>CA?A?7B}@BOWCBLWC4CLWCĚUBKWC{?BWC@@@A?tC~@C^z/BC4$Bd:C5$B9A9$B{?jC'B@@A?3xCq͵@WCBCقB^CقB ׏B 7CA@A C{|@B BTBxnBuCxnB BxnBؙs?!kBFVB A@A?b&Cf@zYCCLCC<CCZ~AC4w?C C0A@A? BUu@|ˬB4Cw B4CB4Cm&B4Czo?HB 5C@A@A?B@^{BGBbuB,BB,B@]B,Bl?4rB1iBPA@A?nCz@'dCr.B߹\Cq.B}}Cq.BvfBq.B}?cC-B`A@AhFC`Y@vCB'@CBqCBrBB{?#CBpA@A?B@@:bBxCC[BCCČBCCcDACCZf?nbB DCA@A?~xB@ Bh+B4B~+BUB~+BJA}+B0r?:̳BBA@A?Xj>B'AYB;GNC޼BkONC< AP{AJBR{Af?BPNCA@A?~BB`"'AAABPAA BA B. A Bǭ>6AAuBA@A?B Q@|}Bh C]xBf CBf C?f Cii?-}B CA@ABv(AϘiBImA,_BmABmA AmAm?iB@]pAA@A?BB@eA$B A@@A?WC@ ?CEB :CEBnCEBRBEBk{?40@CNB0A@@A?2CW@@C 9B,&;C8B$C8BYA8NC{{?t?CؘB@A@@A?H+B.AŶPBGCjgLB GCPA GC`BZA1??XB?ECPA@@A?"B I@PMBCЊCɕB:ЊC&B:ЊC};A@BQo?+BC`A@@A?B/@BC5B C7B CaqmBC\k?-B@LCpA@@A?䝇Cnd@[C̍BF+C̍BC̍Bxh@zC~?&C1BA@@A? CTo@kC>CfC>C\iB>CŲAC?y?rCCA@@AQ C#@jB(B0ѼBB~ ,CBIBB`x? &BiBA@@A?IB@BBxyB BS֙B BY%>(CWp?ယB{BA@@AvBQCAHACCACݛACW5@oC 9>HADCA@@A?B)TABA@@A?]A&A+WAUCAiC>jCLA4@C9?{AkC@@A?mCV@!\CᢊCjC CVC CɭB C~?6՞CMC@@A?C mmA; CjeC9pCMfC'CMfCKBE HB~?CMfC@@A?R C@CABdASCdA@dA*t?CvA@@A?DJCO@CD(CEwC CKC CA7B C|?ցC*CA@A?ZBw@o~BoCrBqoCiBpoC ApoCgdf?-BޮCA@A?CӨd@M*C|B'C6|BFL C8|BTA"sC]z?6)C~B A@A?}By@BB "C_B"CZ9C"C.'B"C"`q?CB} C0A@A?B٘@ԣ_B?BZBB@BBB@BA@@BOb?EdB_B@A@A?AHAACB\6CK.Bz6CDBٜBm BٜBӊ;?BeCPA@A?Br@ BCSBCBCiAC{kq?PBzC`A@A?^B}@}B`BSrBB(wuBB;dBc|CA@ABz@y_xBAC!lBBCwBBC;@BCq?ѩxBCA@A?C5BN:AF(B{ CiBv CcBv C@?w C[?YT)B0C@@@A?wlC @T1C1BQ2CBCBD{BB-z?f5C,$B@@A?S3Cj@2~ICCCQsC@@A?aC@ eECCM>C,C){C,CmuB,CLz?-&ECC@@A?~Cl@HCEBC~YC) CrDYC) CBR@C8}?C CA@A?5B-@b%CC_ C6CC0A@A?fBk@ -C2>C+;*CG>C KbBG>CPBBNz?-C؏C@A@A?*CQn}@)C C$C Cu/*C C3@ C{?,'CI CPA@A?Bŷ@tBiCBCA]BC8PBC\p?DBs`C`A@A?jhCR`@{CAw5qCϑAf\CϑAtA9FC9~? nzCpApA@A?Bjԝ@ B*dB|&BM+dBͨBM+dBE AP+dB_o?֬B0fBA@A~ Clj@B AơBy AC{ A!A Aqy?BAA@A?DB@ެBFCmɬB~ClC~CbeB~Cu??ɬByCA@A?~B͍A՜BaCwGBaCq$:BaCA 7Bޒl?:B^aCA@A?XC @ACtC CtC!`CtCBAߌtCRr{?fCtCA@A?zy"Bt2AkxBB߷1B6B1B_A1BU9Am`CNa?BB1BA@AIAA B'BA'B@i]C6*Bi]C'?P Bz'B@@@A?FPB,#A4BڍCBj9BBBjB"dC #B"dCG'?B @B@@A?>C}@rCCo|C]C9C]C xB\ChG}?ĂC`C@@A?iC@BHCxBcܰCpRCcܰCCcܰCl?`BC@@A?aCb@9CKCRȳCPCFCPCAPC$~?JC$C@@A?1 C`R@*7B0lC8BtlCWCtlCUAtlCs?-BtkCA@A?,B5AW2BC9/B冘C @冘CBBfZ?x>BrcCA@A?B@$BCB]CHB]CAsB3'V?BJC A@A?q-C}@Cl A` C ApFC A?dB Az?CO@0A@A?dB_IABC?BAC}8@ABǐBABb,O?%BC@A@A?UB@(AC`A@A?ICYl@ O8C@C'2C@C]C@C )B@C}?B7Cw<CpA@A?rnB@GB\CpEB\Cč:B\C2@CBN?\HBK`CA@AtBdԑ@B"C1B"C7 B"CyOA"Cu?µB3#CA@A?_8B*A]BC E^BCACMB@CCO?7^BCA@A?azC@yCޙC3PCޙCeCޙCB{B$~?CIۙCA@A?zBÛ@sBSCBSCR,1BSCYBA t?!&AnCA@A?KtBAB>JCB>JCS B>JCd)BVAw5k?PBQJC@@A?a6C@CaQCCwALCLCeCLCJ|JB.UBz?3VCpC@@@A?bB.AC3ΥCAC C'B CB C}er?CC@@A?#B@)B!CaFBвC[AвCЦB1CEmX?JBC@@A?wEC@LCiCgEC>iC;C>iCATBy?PC<|hC@@AB›@BC?BںC-BںCBu'C=g?BԬC@@A?JC@@6ICSC֟FCSC~ICSC7@SC2K|?[ECQSCA@A?9BM@]Bu͛CBf͛CWBf͛C^cB˚C)-n?nB CA@A?DB֐@DCEHCICBHC,BBHC4QB!B:s?LCBm@ BuCYBeCCeCE_BeCs?=BUCA@A?SB@A8dB^RCB^RCjA^RCOKBAb?U#B~RCA@A?7Cˍ@B_CcB_CZC_CBA_C4z?zBzCA@A?B@_B^CB^CV"B^CCA^C]x?ABr^CA@A?PީB@BmcCnBqcC>BqcCȈAscC x?ѯBdC@@AA?zC7AQC$CvECxC8CxC>BxCz?HCC@AA?A+(AȩAuCѰA~BCyTA?!CD B?!C >WA4"C@AA?(BM@nBU C`Bl C Bl C!Al CX!X?NBEC@AA?Sy.C>@o8CQC5CQCk!CQCKA4/A N{?4;C-CQC@AA?,\Cɞ@)AC+?&@CBI|?ewCYМCCyМCCxМC-t?Cz?C2HC@AAA,XC}U@kC0CCCjKCCBCz{?CPCPAAAKBwMA]JBPCBPCV%BPCY@ PCRD?BFPC`AAA?ACeSAC=@mBAmBHh>uAiCAAAJB@ϲmBDvCmB-vCAeBAAA?GxB@5lB~B_B~BMwB~B@~Br??lBzBAAA?`B@ABu{B|CebB~C+A~CABBc?{B:C@@AA?Y*CG@m CHBCCtB(CtB BtB$lv?~ CzB@AA?B.@CrCD~B~C5B~C|`A*$Cu?q:Cr#C@AA?SnBb@?BvBc] ByB&ByB@yBܥ#?[B sC@AA0ORC2@:ClNB͙5C#NBgC#NBGB"NBCq{?#7C74B@AA?B6@ԃBLBBMBrBMB5AMBxr?0BTBAAA?Bh@W~B-B#hxB:-BB:-B&B:-BWj?΅BͷBAAA C3+@0?BOBBõB"5CµBFBµBw?`BnB AAA?AjBK@W8A>CA9>CKAB9>CA9>C]+? A@C0AAA?BBJ@'_BABSUBC^BhBC^B~BC^B]?@aB4 B@AAA?Bх@Bu"C'B,CAB,CA Y0Cnjt?BVCPAAA?B<@0 CC#CCtIBCcBBw?8 CC`AAA??8B Aw6BB&CB7CBCB>ACBvB!wC@6?lEBqBpAAA?&B@8(cBUCcB1UC$ C1UC!B2UCn?aBFUCAAA?H2Ci@D CIe$C| Cf$CQCf$C13D1AkC@ AA?.C@JCZCsCfZCvBfZC_bAiB9y?Mj!C,DC@@ AA?!CՋ@BZC3B0[C5 C0[CbA0[Cv?!(BC@ AA?B@BleCynBeC-CeCBeCAo?MeBnbC@ AA?!C:%@lFCmf\C@Ce\CBuBe\C*B_!BRz?0 IC;ZC@ AA?GB AB:YCBXYCfuBXYCAXYCd9?ΦB4 ZC@ AA?7!Co@7C~CC~C--C~C8A~C {?kCCA AA? Cf@+E0CpCn,CpCKBpCB.CP{?g/C[CA AA,.LCrt@CBb@JZC0CVC0C"C0C*2PB]CK}?rYC?1C@0AA?2CAAzB{PQC3uBPQCFBAC|FCC|FCZB|FC>}?DC+FCA0AA?BB:@:CCjC١BQC9BQCAEBBeB͘v?CCC A0AA?QBk@NBBBaBBaBm@ƓCt?iB-B0A0AA?aB,@BG[ABiH[APBmH[A)jAuH[AJ?5B\A@A0AA?GeXB@\RBPA.BQAGASABE=Cwa?bBAPA0AA&BbD[@TB C4lBCE "CCUBCx`t?l™BC`A0AA?B@\B rC ^BrCBrCyBrC?k?^BrCpA0AA?sB@_BJC*BlJC̓BlJCn BlJCSY?BJCA0AA?BvQ@BABOA$BOAڡALC x?TBgAA0AA?qW)Bt2AD,BC10&BuC CAvC:|A,BK?+Bs~CA0AA?% B3AA0CtØA9C$ıA9CH@8C2?N1AߕCA0AA?kBA@;B$AыB#A,B#AA#Az?OBA?@AAC9F@BtCBtCԣBtCO?tC x?qBC@@AA?MmC{AJCůC FCůC$ׇCůCiFBůC\^}?!!KCC@@@AA?M MC`@CjBhCwC,BhC9wC,BhCB,BhCr|? CVgC@@AA?%:CV@CoBC~BXC~B׬ACPA@AA?Ba@6B]C ъB\CzB\Cc\@w#B֠j?uBh\C`A@AA?_A AS> ByCz Bd|C?ACMaBC>Ď BL[CpA@AA?A10ABt BcGCS( BRGCp@SGCsABAZ?)7 BGCA@AA?FBCâ@B pCeB pCB pC tA pCתu?|̴BpCA@AA? h'BR+AABMAB+BB ABUR?cA4^BA@AA?{>A:A>wBUB~]BUB^t@viClBviC[?vB]UB@PAA?FCL@՛ C' C C' CB' CTlA䓞C z? C C@@PAA?CxA^C\CwNB\C1$C\CB\C$y?B\C@PAA?>Bz@ϐBVیCfB~یCpB*C~یC{B~یCr?̏BVuC@PAA?BƐ@X7B31C,0B21Ct,/C21C+C21Cg?e8B0C@PAA?~BƉ@!CmRCZCVRCxBVRC1AGA}w?=C*RC@PAA?V`Cx@RC2|CaDGC?|CֵtC?|C5B?|C|?HRC|CAPAA?=CK@d]Cz\BTC\BD#C\BEB1kC}?TV]Ca{\BAPAA?bC RG@/ChC_ChCD7ChC_UBhC3{? CrC APAA?C)Y@ǻCCNCACJCBJC֦BC7{?ߎCCC0APAA?BSm@BvmC!B}mCB}mCAfBvs?mBnmC@APAA3Bqi@B:ICϏB>DC2C>DChԌB>DCIt?gB=CPAPAA?hy-CiE@|Cq@CPn@GCPn@laBPn@)|?7C}i@`APAA?C{@sC# C|C# C,B# Cp!AC{?+C! CpAPAA?*&B*|&Aн&B:0Bp( B:0BA:0BO>A`Cd/?C'BW.BAPAA?LB;O@$BCBCBC:[@FBs7w?B] CAPAA?Bɉ@AAAvAgARuAASuA3T?ECۡ?&AA?`AA?<Cѭ@@BKtCBsCI8CsCaBsC-x?BPC@`AA?4`C@;C%C3C C΁C CB C|?;CC@@`AA?CB @C}B9wCßBpBßB|BgCu?$CeB@`AA?BB] A܉B1OB:B(xOB<5A(xOBeYB gCJ?R5B$OB@`AA?)B AB[B B^!BLmAXȓC1CXȓC,[?sB,B@`AA?B@(BmүC>ȦBQۯC֕BQۯC`6AQۯCr?'BC@`AAC#B(p@Bw/CBw/CBw/C?AлC^^y?9sBSG/CA`AA?\?FC@VCtC^XRCtC5CtCuA:CC}?VC3CA`AAi8Cр@TC"7}CYTC'7}C8C'7}CpBMnB|?!TCK}C A`AA?B@WEB?cCǩ,C>}B>"XcB@4C}?}4C&K>A`AA?,A"ATFBRB2BUBqAdCTBdC??_FBBA`AA?RӒAW ArӲAnoCAhoC?BvABR?A[C?pAA?k]Cr@VC%C[LC%CchC%CA%CJ}?WC#&C@pAA?Bx q@[CmC*C,mC.B,mCilBfBx? 4CܪmC@@pAA?dCC@CDC C4DCynC3DCGA/DCʜz?C^DC@pAA?b)C@N 3CC,CCG!CC/:A)C|?cA3CnߤC@pAA?)C @,CѭBKPCB7PJCBBB{? KCNLB@pAAOpCӹ@{pCBkCBvqCB|@B/~?pCB@pAA?OBBqABXCBύXCC=0BB;7B1\?}?BmYCApAA?RB@[HBӣCBӣCBӣCSc@ǧC-?ZBF3CApAA?54C қ@.CBpCBOCBGqBB6K|?~CЭB ApAA?8.C@BV@ǻB1K@QuC3K@bC3K@y?[B-@0ApAA?~B5@DB8B BdB$AeBf@B=C q?2 BB@ApAA? B@?CӔA~eCAqBAxBRPCbt{?IC@APApAA?.BhT@߫BC(BCQ CC)BCw? BbC`ApAAiB4(@DyBAB oBGBRABGBx BGB|r?,yBBpApAA??A2&&AƐbBl2CnNBl2CA@6ICjB6ICR?bB+2CApAAA#BASA<_CQSA0_CB0_C[_IA0_C O?eA_CAA?C% AmzC4CΫC4CC4C}B%7?NIC4C?AA?$C^@(CثCCثC#*CثCAثCt |?CC@AA?ߘB@BCBCC!CCBCj1v?˷B[bC@@AA?C*@KCBerCBvCB BB~~?DCqB@AA?>JB`@ȁB_.CBY.CBY.C¤yBY.C-am?TB{.C@AA?}B @B#nBGBmBA,_C AAA?t`BP @ooBXlBpBXlBBXlB8A<oCUc?nBhlB0AAA?JQICZw@S ChNAo7CNACNA_BNA P}?} C A@AAA?CB@ BBίBB8BBy&B8Co?B5BPAAA?dB@eQBc?THB$?VB$?+e@$?Kh?QB7 l?`AAA?EB6=@93BWCѻBWCBWCsAWCz?=@BDCpAAA? VA A~A8BA'Bj,/A'BfdA C~)?:"AsB?AA?,B A3A>CCA^>C=IB^>C8WA^>Cg?OA@0@C@AA?NjBP@0B$BĜB)$BDB)$BcA)$B@ME?BIB@@AA? ZC@IhCȜCiCȜCeGCȜC3 BC}?hCM̜C@AA?7B@`VBzB B}BHB}BsC TB@AA?MB@B~ڪCBӪCаBӪC#ߚA?!Cv?@|BΪC@AA?uBǯ@"VB4"C6B ?C8C ?C!xB ?CBu?B@DCAAA?.BW@ǡBQBcLBr6B[Br6B=Ar6BJt?BBAAA?]{BY@GBAB)A 5B'A_AF\FCl?᠍BŐA AAA?iB@YBBQBB0CB̌EBBu?ϨB]B0AAA?UB@BTCBTC1BTCl@>BTy?IBTC@AAA?B@jB u{CEBu{CBu{CA#B5y?B{CPAAA?:HCy@ţBIAKCA4CvA4C@]?Q7BcAQ7{>jA4C?AA?_Bᣢ@KByA<BeA8CAAA?Bu@@oBCeBCgBC D=BCtj?BoBC AAA?B@JBCBCxBC6bAC?v?KBPC0AAA?Ao&AB*Cg B'*CF @(*C@BMTCR9?LB^C@AAA?ݬBs@BCCBCC8BCC?CCxz? BECCPAAA?Bv!AN,ADCADCgvADCUADC$>W*ACCAA?TB@ACguACNxWBC6{ACm>?r2AC?AAB@=@BE$C}7BC$CBC$C-A!CaMs?=B#C@AA?P B)ABCJBCZyAtCvBtCyX?`BC@@AA? dB@i'CMB>'C.QB>'C A>'C3u?wBf'CAAA? FB##A^B~gC ?VBtgC%BtgC̳A΁NBe]?]BygCAAA?W B3PA1BqB=(BBABAⱙC`R?0BB AAA?8ByA BFTBUBTTB-BUTB@UTBa[?{BDžB0AAA?A/AxB#C!B#C?#CACY-?jLB_CAA?'B`AN6B4C1B4CUA4CÛA%7;S?o6B4C?AA?-Bp@BQ/B@aBa/BB^/BK BY/B?XٳAwEB@@AA%C:@7~C}BtC}BC}B B}B+R~?\~CH}B@AA?JTA8ыC@AA?lCC@2wBB CBF C(NCF C ?BF C:'z?Bo C@AA?kB5@CIC)CIC5mBIC0MB&B;{?RCQJC@AA? 2BOr"AKqBnsZC(eBpsZCZ%ApsZCBBi?pB{ZCAAA?臁Bwo@B_KsBGBIKsBv@_BIKsB+jUAB?AA-)Bi@.uBBsBBABBe@ mXC^U?* BaB@AASB:AmBC] CbBD] C*@D] CDB.C_?SemB_ C@@AA?xB{@.B|CB|C^&A|CBCx?"*BUC@AA?]mB@[B^iCB^iCA$B^iCwB{UBv?arBKiC@AA?B@gưBCBC)BCBіBNv?뤰BSC@AA?]B@dB̸B̿ B۸BB۸B#rCB۸Bw+h?BB@AA?AquAA'gGC͊A&gGC;@'gGC:uA*9AO >ԚAdGCAAAtBS@?jB ^C*B ^CB ^C}@ ^C67x?B(^CAA?`uB(@IBCC,BCdVBCwA4C?HBC?AA?*0XB@@BW?C2BW?CBW?CAC#q?BP?C@AA?oHB ҇@7KB!Bc4B,BB,B\.A,Bܧo?mwKBèB@@AA?BskA"B6C~B6CsC6C:DB6C{?qgB6C@AA@BmY&AɍBƃqC<8BƃqC@ȃqCmiBvBj?ՍBqC@AA?BM@@BBMzyBBDC@B?~-DC@A?OCы@ZBCkBC:5CCnzBClf?BC@A?DSVBȢ`ABC[BC`h@B/BBo?BC@A?tCn(A/CCS&CCCC^CC? )&CCAA?~BdAAB$AB ACBCLj> ABAA?ɥC@]ڊCBTCBCBGAB?v؊CB AA?BG CW@sBC̐BCKCC/`CC٥?7BC0AA?ACpoA 9BCBCX9BB$ CB5Y?YBC@AA?%B@BCBCBC@B?BCPAA?-B@mBB{BBCB @VBB;?FBB`AA?{Bf(@ BBnqBBCB͸BBs?zBBpAA? 0C9 @BCHBCqCCCC?BCAA? IC@"o?CCu@CCQCC |AC??CCAA?xEBbA+BC*BCnBC/@B7U?)BCAA?m7;C+@l8CCٝ8CC=CCe@C?78CCAA?HwBZABC BC ԉBCBC9V?BCAA?A6yAS@B҉H@B?B?CC=iC@BAA?B\ Ar2BCBC`$pBCBB?^BC@@?A?o@CԎ@PCRn BqUCk BJ"Ck B|MBVC_z?8VCC B@?A?!Cex@fCܜA Cfy,AW!Cfy,AA@?A?LtC&@>C +C.;Cs+C#Bs+C9B֯C y?U=C+C@?A?9Ck@$BCCB]Ch,C]CoSB]Ct?BV{C@?A3ƕBu]@{B1B9C̙B9CPˋB9C2@s@k?QݠB;9CpA?A?[sB@B5CzB5C*`B5Cƕ+BָBf?tBECA?A?C@}CV2C CO2CCO2C@SAO2C1y?CΈ2CA?A?B@gMB3CaB3C1C3C̝B3Cs?B{CA?A?%B@7B BB] BC] B QB] BMu?RBBA?A?!BFA5#Bn\C2Bn\C?]?b!B"Bd!B??#Bk\CA?A?D~B@LZB5B5C@@A?ʗCA AisC],CjCYC㇤CYChBYC|?֎C>CA@A?Bs@B0dACgB1AC~B1AC~@SA;s?Cs@CA@A?Bj@BCsNBCBC0@Ct?#BԬC A@A?BY!ABRB֚B_RBuAԇCDBԇCL2?ěBPB0A@A?C9!Cg@zCBCsB; %CrBC2WAoBDc{?[YCSB@A@A? BB@BY&BO,BH&BBH&B%fAH&B~q?`DBX!BPA@A?,gB@igBC]]BՉCBՉCAWBN?iBC`A@A?GFB@BCUB^C!@_CVBxIB!a?#جB@CpA@A?Fo.CL@zCΰCa=C˰CAC˰C2B˰CM{?CCA@A?B@wBWPCBWPCtBWPC@WPCkh?]BŘPCA@A?Bw@B1B,YBJBjBJBBCzw?BοA^sCA@A?>VBP@ʃdB؞Cz{[B؞C:#B؞C++A؞C4&b?bB˞CA@A?z.BGAgQB) CgFB" C7A" CAPC@c?ۅQB CA@A?BH?AjBYBsBYBAYBrAGjCgcC?BDYB@@@@A?ܞCن@.!C CK"C!lCB!lCⲕBC]u?%CC@@@A??C3AJCCMBCaLBrCaLBA2gCL~?CKB@@@A?މCU@B\L+CB8^+CAC8^+CB8^+C t?C,C@@@A?B>n@=B(VCBUCP CUCGBUCvd?zRBzwQC@@@A?qYC%s@CvfBcCBY(CBrB&jCG{? 'CBA@@A?"Bb(A('BC BCCASAC*\BC.?RBW#CA@@A? xC@hCuCcCCyCC]BC }?jhCǣC A@@A?73BAH|B%C>MB%Cwi@(BB(BXF?NBz΀C0A@@A?dB@~g>B;BxO:BBVF8BBvH?C>O?7BxB@A@@A? B@[}BnBCCvBBC͚CBCBBC˅m?B[CPA@@A?wBU@BBA/B A_A AzBOCtvd?B$A`A@@A?C׻y@C٘A?{C*ߘAh$C)ߘAOV2BߘAA~?2-CApA@@A?lB5@`9BC6BxCcBxC۩,BxCEp\?t7BCA@@A?0Bn@)BC'BCuBCalA#wCRl?wUBOCA@@A?B@QBECUۮCAUۮC}?rCCA@A?yB@;0\BCUBC̅_BC@C6J?5_BĈC A@A?GA&A AAgB?PAhBQA&C^B&C>A½B0A@A?_QaCOZz@_LCbAR HCbAOvCbA'8BbA}?"NC)A@A@A?*CU^@7CJAC7z1CJAC0CJACKA4XA|?9CACPA@A? B@ŭBCӻB6CahB6C.@iC5o?BC`A@A?PC/d@CDBCBRCBCAB`I|?$Cd?BpA@A?(y C0T@06CC<4C#CC#CB7B B{?A6CCA@A?9B@/BCGBwCLBwCvACf?B˞CA@A?Bt@+LBBoBBy/BB ^ABOq?5BդBA@A? BBS@}B"CB(C}iB(C8pA Bt?RBӘCA@A?B@BMD@BD@tCD@֎BD@py?ʿB@A@A?}C#@}B(BUB(B yC(B{gB(B~|?@Bn"BA@A?BMo A7XBCFBCABC< BC@t?w%YB;C@@@A?!ghCPKjAECʟC*@CğCB΃CğCCBğC@{?5A)C0A@A?C@$CB{CBI?CBJBBEv~?̀CA@A@A/B)`@:B8CBL8CWBL8CBq@t?BI,9CPA@AA A'A!tChXAxtCVABZBB:>%AtC`A@AlBܾ@{B[=CuBp=COBp=C5Ap=C,Hk?Id{BTCpA@A?Caa@BqCzBuC CuCvfAvCu%x?jBCA@ABъ@ymBCCqoB.Cg#C.COB.Cq?lB%CA@A?A8AAwCAuCV?C儨ACIc>cAnCA@A?EBt8AhBA!BbAV\A]AEARC,?BaAA@A?*AB.AJB3B2BB3BXACxBC31?JBBA@A?.A7AΗB[CAB[CAŭ@[CAA5@C-?kLBWCA@@@A?sBw@]DC A1=C:Ag~A:Ad$C_DCyu??C<~A@@A?XPRC@nrBqEC#B=DCzeC=DCbBC=DCu?B"AC@@A?mCh@ӌCBCBvCB@—B /u?HC5B@@A?!B܍@BDOA,Bu&A5Bu&A:'@i&A+bl?Bl_A@@A?-B @Cث3CfCW3C%^BW3CvB,ֳCA8+C A@A?|+C^g@ ^C4BC3B$<:C3Bx B3BF{?CB0A@A?$NCbR@GCLCACLCVCLCALC%}?GC\C@A@A?p{B~@BACb@B#FC-1A#FCBECvf?cB$MCPA@A?3CN@ACVC:CCk(CC9A #C|?DCC`A@A?OYB@+C/gCg7(C/gC&3B/gCB:BZM}@CNBC2?A?B)BA@A?=B\@B}RBBQBgBQB.v@whC-v?bBQBA@A0YBCAA|NCULAp|NC9(Aq|NC/AyAL?-$AANCA@A?B@EBB+B!B@@A?ط.Cɼ@"CCC CɥB C/C&C{?*"CC@@A?FdC.@$0CQC k-CCut CCd BrC^sz?3CC@@A?^SBNAuBQB BZ$QB,/AZ$QBVvBIhCS)J?*\B)eBA@A?d1 B2AvBz)CҀBz)C/@vCeBvC<4?0BO)CA@A?JBH AHA@ABC A@A?^BJ_@3XB~C0}BR~C!!=BR~CǏfAR~C8?BC0A@A?(# C?@cBCBC*(CCڈBCv?WBhC@A@A?DCOQ@4$XC BaMCQB5CQBKAvC|?YCDwBPA@A?ZB@FBECΚBEC#BsC0AAA? BK(A42BO>C0M*BrCD@CCBCD?D4BmC@AAA?BAUA\B?AZB[@ZB`AC"> ADeBPAAA?C]@@bBCQBCC7CC66BCy?BAC`AAA?B]@zSB%C TB%CJZB%CSt?{%C.T?tSB0CpAAA?|B$ʙ@B>FA֪BFABFA)BFAPu?BJEAAAA?B?>@Bez/CBkq/CuBkq/CBkq/CUt?紞BN>/CAAA?fșB@Bl; CWBa; CLBb; C@c; CMn?6ҊBy CAAA?8C<ބ@:CB2CB9CBB@B}?q9CBAAA?qݶB^@A)~B5A)~Bb4 C)~B4B)~Bak?A~BAAA?nZBABB0BBABN̉BaXClm?؟BB@AA?C|T@B:vIC(BwICeCCwICB&іCO?R7BgC@ AA?ԋC@S[B`ECB[EC%C[EC3W/B[ECy?@BEC@ AA?i>CX6@IjC|lCfeC|lCMC|lC4ΣBaB}?JjClCA AA?A@C'n@MCXCGCXC4CXC1AcBu|?cPCW\CA AA?2Ct=p@OQCCGC3C&C3C>BfCD|?QCâC A AA?@kvBܿ@a BBݯBBAB=BbCe?hBB0A AA?\`AP*A/:B;Cr5Bd;C @vCNBvCm%?<5BKyC@A AA?CD]R@}C-YBNC,YBB,YB|TBzC2z?C XBPA AA?CuW@Bh6CuBh6CmU#Ch6CiBh6CRy? B&26C`A AA?uBv@6eB•C!BCFCC6BCt??BCpA AA?B)jAB{ @q-B @钨@ @BH36C?BO7@A AA?E\B}<@BۮDB0.BDBBDBY?B+eCx?nxB(DBA AA?vB%%@BA0BAABAAzxOCu?v۳B'AA AA? BEiEA:5 B?BBTBavATB`2ACp@?p8 B BA AA?B2@NB~BB~BB~BA~BNX|?}Bs~B@@0AA?D8CX@!C ՗C?CԗCfhLCԗC8BԗC{?$CKC@0AA?Cu@Q$CMA CWMA~ CUMA1AJCs{?o"C A@0AA?%C E@-)CFBp&C'BC'BO@C|?-<*CcB@0AA?C1@6cCjbC]C|bC/C|bCB|bC~?bCC@0AA?X=C@sBbB B:BzC:BC:Byez?BBBA0AA? C@CCh#;C$!;C(M;CqNB(M;CB@'z?|EC;CA0AA?oBt|@'nB^CHB^CB^C n@^Co?yBF^C A0AA?Bg@%B&C B&CB&C@&Cgiw?ZBs&C0A0AA?$OA,AaAA3B!A4Bu~@ }CB }C>)A/B@A0AA?A (AX1BxCBCiA'*C-B@CPA0AA? B׏@صAB8zNC&CBNC CNC'BNC-k?BBNC`A0AA?5QB @=CBF|?D@C|4C@@@AA?MB\А@IvB>CQqB>CdB>CKA>Ci?vB8C@@AA?XBX@B( 0CbB 0C#B 0CL~BCy>u?B/C@@AA?gCR@|yCCqCÑC>CÑC[BÑC(~?Y~C렳C@@AA?krCH@pC9CeCܿCF {CܿCAݿCӪ}?voCάC@@AA?#Cג@$C|1IC*C+ICu.$C+IC9A+ICoz?l%C&ICA@AA?D C@=C>CCCJCC?/Cy?)CձCA@AA?5By@T|B>NCqB>NCB>NCmqAAOwt?4BFNC A@AA?szC0M@BSQA[B UQAjC UQAB UQAx?BUA0A@AA?B@BFCBFC_BFCo@:A's?BCZFC@A@AA?j^B@aƎB~vA\'B3uACB1uAPxA/uAo?wBhAPA@AA?4|B@B\BBPBCPB_kAPB1x?!BLB`A@AA?BV @RBCBCfBCPIBfCw?B3CpA@AAYA*%A_B$Bm!XB BfnA}CB}C\f+?U^BBA@AA?z&tBFA\6B(Bm./B,BB.BA0B.e?6BBA@AA?tB@ OABjC+-BeCrBfC'mBfC\p?(@BcCA@AA?6Av7ARA}o-CkAAxo-ChLAxo-CO)?zo-C+>TA`-C?PAA?BG@}BCzHBC\BC9w(BCRp?BuC@PAA? B0ApBŗVC gBkVC?A] B%͋B] B/?XgB:UC@@PAA?|B"@B&|CB%|C|lA%|C BKBj?ԢB{C@PAA?cBK@t/A3GB+A B!B!B#DA!Bo?OPA3B@PAA?LBG@ BCB;#CB;#CBCs?)BJC@PAA?KxB.; A'aA lB A lBFB lBޛA lB$?bAlB@PAA?`C37@CCCCiCC DBC/~?^CCAPAA?l^Cts@C2CN yCt2C@Ct2C5bB:C0~?sC8CAPAA?C\*Cʝi@]CҥCfaCҥCo>CҥC% >BҥC'{?CC APAA?zB@bB [CB[C_ C[CFB[CX/t?ضB[C0APAA?]Cis@mB^CBy^C{"KCy^CHBy^CWy?1@B%_C@APAA?AA?A5B.ARnB4mAۂC"BۂCny>]AJBPAPAA_B?!A;B{1C,Bq1ClQCAq1CAbCa?B C`APAA?@B-۸@5UB JCBJC:BJCfA=(Br?Q|B]CpAPAA?>A)'AQzA$ѰC\AqAѰCzG?ѰCmXA"-C֙>3byACAPAA?]A,ANB.BzB.BY@.B^A CoB?.B>ηBAPAAfB0@A@aA@ B@XB@\?j*A@?`AA?`8 A$B@`AA?Bq@ BA FBTA\CTAA"TADv?1BuA@`AA?B@VʗB;jCcBjCmBjC^MBjC %s?ʺBjC@`AA?;B@&}B;,CB;,C"$B;,CZaB^CKr?W@B:,C@`AA?c`nBA.BOCQ+BOCMBOC6 AOCfJ? 2BgNCA`AA?FNCA@L&C[CQC?CYC?C*C?CvK{?C 7CA`AA?\rB@:A'.C@A>.CXMB>.C_qA>.C&?>A.C A`AA?Byw@CB&CʶBcBʶBBCrQz?CB0A`AA?] CO@sAC/%:C_Cn):CJCn):C8A-@e{??C*:C@A`AA?BaZf@+C C'CC_BCGAMC {?4|CCPA`AA?kB2c@ʚB}CȍB}C.xB}Cc-B CIk?əBC`A`AA?gB@`AϸB.H}AϸB~IBϸB, BϸBİ?ʅAPBpA`AA?_GBAITB C|XIB C&B Cy AFCk?ƒUB2CA`AA?D@B72AרAA;CcAB;C.AB;Cm@B;C>2A;C?pAA?YBfl@%C*rCdvBpC BpCQB2Cgy?cCRIC@pAA{CMm@!1CB+CoBBpBQkB\dC}|? 1CeNB@@pAA?`EB:k@BuI$CbBI$C+&BI$C٨A$CEx?9B$C@pAA?eC@B?"CB8"CxvBC8"C^[B7"Cf2y?dBCC@pAA?=ClɈ@ CʥCm CʥCER#CʥCF%AʥCz?px CC@pAA?n]B@NAAIAAASBA@AA ?ALA@pAA?;B@OBB@pB|BNB}B9IB CuIo?B7{BApAA? B[A rBτ@tB.@"~B.@'@'@re? pB@ApAA?PCAqB CFBr C7$Cr C_EBr C$Yy?;fBa C ApAA[B:I@By/CB/CS-B/C[B{Cq?ixBg/C0ApAA?9CR@rC`CNC`CB`C7$vB܂B|?Ci^C@ApAA_A'ASJB[]C EBf]ChA̺,C>B̺,C8!?iJB;CPApAA? B@BbCBdC9BdC1BdCor?A‰BC`ApAAB2@BGэCÖBFэCOjCFэCBFэCD{?RB5̍CpApAA?Xc`BN@B;CB9CGA:C2Br*Cs8s?UBCAA?n BFAC5X6CW6SB4CEC4C'P{?GC^6?AA?3C@9CCCޤCICޤCOBޤCn{?C5C@AA?B1@vBֲC-BC8.-BC-7BtYCwhk?ܲB+C@@AA? GBƼ@7ByB͂BB&WBB?yC$m?dBYB@AA?9EBʧ@F%4BC4B~CGB~CA~CP?c%6BxC@AA?lC[@ePC>?"B"C AAA?C;@s CfCG CdCPBdCZYBB q|? C2C0AAA1AP/A\A,CiA4CbAg4+CgBg4+CA> rAiC@AAAB٣@}uBS C wBU C{BU C;e@U C4jm?B&CPAAA?!Bu@ϠBŊC;BŊC?CŊCQBŊC]{?ɠBĊC`AAA?BAc LB 8?84B= 8?[A= 8?A 4C\?yLB2,?AA?Bq&-AQBCWBC*BC8ACY?"BC?AA첵B@ BݲC%B.ݲCB.ݲCKB.ݲChn?BNC@AA?1Cԉ@C@C~CLAC~CC~C!BB }?@C\fC@@AA?WC&@XCCvC߈C5C߈C7AC{?̤CC@AA?LBlإ@kCjgCCgCI>@^OB C^OBfu?C gC@AA?mC{@/BCsBC 5CC(jBC?x?BC@AA?BT@&,B;BX CBB9CAAA?B@|BO|~C>B |~CB |~Ca*B |~C _?`B{}CAAA?fxjB@[BCWBCFBC@ABTb?ՆZBC AAA?%\BM@AMC7AMCܜBMC]BMCo6?N AmMC0AAA?зB b@&hBWCB^BWCBWC{BWC-p?|vgBWC@AAA?"BOA(-BBJe5?ёBYe5?AA?#.CG@%C3BECҢBMCҢBumBҢB:{?@CB@AA?ZqB ٢@5B-sA!Bm5tA.CBq5tAQBWCCC̎v?{BxtA@@AA?HsC̒@z fCjCJfCEjC}CEjCAFjC A~?eC@jC@AA?ԱB@gBCӂBXC1BYCXBYCo?BC@AA?:`B@BBj)B殤B)xB殤BXA+CJf?~DBB@AA? PBxAʂB|CNB|C&A|CqB74B)=f?ꚂB/|C@AA?Y0.BT)ȀOBiCKBiC.AiCAp0C O?wPB^CAAA?ABB@BKCBLCBLCSJA0Cfx?AB CAAA?yB"@o֔BEXCBFXC+1BFXC%ABAm?UB&XC AAA?E C @BCWBCr%CCG_BC|?B=C0AAA?AAm;BVB()BPBo%AT!CRBT!C9?*;BnB@AAA?<BGAACOAC~AC@C 3?&A!CAA?0YB6@\AB\ABB9BBBB% ?aAB?AA?BO@u?BxsZCBksZCgBlsZCu@nsZCt?ɡBCZC@AA?ݎdBQ@:TB̥CQB̥CFLB̥C,AҙCk?ˉBХC@@AA?iC-B8%A%B#CbD$B#C'A#CfAG"CH?;%BC@AA?AvD A@,B}C:)B$}CnAHB;BHB>-B 6~C@AA?B:AMAuBAuBv&AuBp_An݅C%Z?,AB@AAB@8BH CBH C&`]BH CvB1B"[q?UB] C@AA?!A2Ao#B&BwBs&B@k&B;`B[C*?"B;BAAA?B]@ Bφ:CBˆ:CBˆ:CAʆ:Cz?aBx:CAAA?UB&@B;B_2B:BB:B B:Bx?7)BB AAA?7UB&@C?AA?sB@ȋB@CmB@Cu/B@C=B@Cj?, BAC@AA?PkBq@$4BC5BCABC}BBeBl%w?ABC@@AA?DB=@,B9C3pB>CB>CA>CXu? BܗC@AA?bB{@{yC"B>{yC@{B\y?DקA3C?AA?:YBb@D΂B أClB!أC0B!أCpAACas?jB(ۣC@AA?*=B@'B"B?B.BxCB.B3?@3BB|?nB݈B@@AA?XB}@BSBBӓSBڄBӓSB4BѓSBkk?DB(SB@@A? C>FA/C4C*C4CiC4C B4C?6B4C@A?U1C=J@HC4CA*C4CSC4CB4C?eC4CAA?̙CC ABCGBCCC8CC?BCAAL6Cx@Z%C4C C4C`MC4Cu3B4C?!C4C AA?yA(A4BCBCmԃB4C C4CI ?BC0AA? AE\AhA@67dnA67@4C*A4C7>޷AZP7@AA?GB+x@CBrH5ծB H5 C H5BH5?B45PAA?f'C@pC4CC4CK%C4C0EA4C?""C4C`AA?lB@QAACBC$BC,R?XACpAAϓBAIVB;UB[BBΰv?ZBAA?)HC@V(CC)CCVfCC@DrBC?,)CCAA?׍AvAtB4C׌B4C(Az7Bz7BS?ŒB4CAA?iqB A4B4C7B4CB4C2@|%7?sB4CAAb C͂@C3COC3CC3CYAC?C3CAA?_B@B4CSB4C5C4C.`B4C?B4CAA?AƉAc}@4CUi@4Cm@4C&?4C>ͮw@4C@@?A?QCK@"aCuB\CEB??CEB2AƕCC{?^C_CA?A?{CJ@}CHC1CHC̀BHCA(C0x?f!CkIC A?A? C&@jpC +BB!+B"C +BdA+B~x?BB0A?AƖB@3B3;CB3;C0B3;CVBP}@fp?-B;C@A?A?s7C%S@%6C5C/C 5C:C 5Cg4A 5C:|?خ7C6CPA?A?hBF@"BBJBʣBoBʣB^@(C6k?-8B)hB`A?A?9BJ&AAE}C~A}CNďA}C_v7A SB(?A|~CpA?A??BZAXIB] B-BBABIGACX%?YMBc:BA?A?BC@~BƴBBBJBB*UBBqo?u3}BEBA?A?hAo1A B?,TBOA̿UB@oiCBoiC>/A WBA?A?BA:+ABMCMBMCE@ABA?y8B MCA?A?YB@؄A,CA,CJӯB,CIuB,CgN?qA,CA?A?4Cw̔@3 CFB&BFB(6CFBPgBFB}?- C$GB@@@A?C:v@mB1CBCMCCJBC p?MlBC@@A?]:C@@T/CmCBgC"CgCd} BgCu?%CC@@AhC]@74CyBF-C6zBTB6zB}ֆBrCAv?2C=|B@@A?ڣC:@iCTB0C^VBC^VBjlA^VBɅ}?cYCxXB@@A?sC0@O<)CMC%CMCnBMCB]AWw?,C3NCA@A CYt@+CtRsCCRsCCRsC?RsCMy?C;tCA@A?1CL@XCgB A@A?Cs@zC$BWGCkBCkB{+AmBz?#CB0A@A?TCCPm@i%ICzC0EC~C>C~CKE@B4F}?3YKC)΋C@A@A?qBu@BzC~BzCyBzC@zCs?daBzCPA@A?~B4P@B-CBLCi/sALC_B3Bg?B]C`A@A?B@A9B!=CZ4B=CPB=C}#B=C&h?x:B;CpA@A?"Cr@2C4C2C4C C4C,BH=6{?nL2C/M4CA@A>B )A;$BB%B2 BA2 BOv2A CQ@?H$BBA@A?v SB_AqB_ArBoAAnA!ADC_]?iqBkAA@A?B@>!Ba@XB_@-]B_@A:Cn?8B5@A@ARIBd@/BYC@)BYC YBYCqKBYCUf?/BYCA@A?&A);AB7A8B>6A@96AHIAfIC;0?~BYA@@@@A?|VC1@–AYB>A8BRCu? CtAA@@A?6C(@Q9C6tCc4C(tC2C(tC%@C {?gw8Ca<C A@@A?L]*Cq_@5BCԸBCnCCfRCCx?8B C0A@@A?6BF^@BiB+BiBYBiBo*Ax`nC"x?`BiB@A@@A?Bo#Ae+BC$BCy?C2%BC?lR.B͝CPA@@A?/B%@NBCBNgCg BNgCC3B4B7d?'BFC`A@@A?k9C! Z@#KCn?CECn?CV*)Cn?C A6AR}?ȚKCg.?CpA@@A?OyCg@h`CoPCJaCtPCCtPC-2BtPCj}?)xaCAeCA@@A?r(Bj@B 0?y@BZwCA@@A?B^@VBB*nBB-BBS H@gCx?(GB oBA@@A?AWd4AtBH'C_BL'C]|?M'CtACy(?f$B'C@@@A?]B@±BhrB;BtBCtB2CBtBk?B͂B@@A?<C @vbC9C3yZCUC BUCB2CMy?1eCgC@@A?B)@BbCsB?CwA?C|fBB2[?BC@@A?ڔbBwAF=B$C6B#CzA#CAثC? 8B C@@A|B,@}uB CEBCt?bBwBbBDl?|BBېCA@A?OAb$A\BQCVBQCPoAFAWBFASQ>~aBLOCA@A?!BAemBVBeلBcWB l@ՍC&`BՍC;?JBl=B A@A?䒎AAlAkCNYAC&5AIC:BBICZ>0B C0A@A?\Be@!C%B,1C%BB%BKIB y]Cy?C[%B@A@A??LCG^@ɻ-CZC~E%C\CرB\C0Bo]BLy?,C CPA@A?jŪB3@{BH5BBJ6B[}BI6B BTaCr?aB g6B`A@A?e;Bi1AB .BiCl *BYCG@XCW5 BbUB"?,,BUCpA@A?UfC`@IC:IBC#IBC#IBgx?ICGz?C[BA@A?a]9Bu(A10B CB9uCk@;uC,B:CKz]?ݔB ]CA@A?jBI'@# Cob\C Cxb\Cp8^Bxb\CêB߉!Bǽy? C\CA@A?B @DBiCYBiCUTBiCϧ}?iCy?mBZ_CA@A?QBh@BABA)BA#3 BA{y?웶BԙAA@A?'A~dBAeޯA׭CcA׭C&A׭C"A'CO>AC@@@A?CA;AB0BJ}C L(B]{C A܏B B܏B>+BxC@@A?Ҡ=C@:vC#ClC UCC UCpB%TBlRz?yCvC@@A?_^C(A7CɒCC7ܒC 7C7ܒCB CpBaY}?CrC@@A-B@B+[B}B[B9wB[B?A[BHn?{B!hB@@A?܍C>AmÔC'CPC'C*C'C]AB}?CSA^CKB^C=>BCpA@A?d,Cjd@CjCCjC =CjCNtBjCӟ{?yCjCA@A? B @_6BГC 6BC wBC'ACt[?5BCA@AA-AAʯC A̯C@/BA-B>uACA@A?AAA}AC{wACc 5ARB~BRBϕ>z1A'CA@A?~B0@BbCIBdCBdCqA}B{?yB(CA@A?ܑ B>AAw3C?QA{3Cc6A{3Cok@fC8?AAC@@@A?e>mCA2l_C]jCWCpVjC`:yCpVjCaBrVjCGz?dCjC@@A? CK A2CqC-CqCCqCCBqCb}?0CtqC@@A?\aBj<@+ɠBr(CB(C*tB(CAXpCd?6qB'C@@A?S%\C@LCܒC0HC˒CiC˒CBʒCm|?4LCIPC@@A?Bv@FCt@CJlC3t@CA3t@CtBCGAdq?!C@CA@AXBC@[BCSBCBSBCED?C'u?nYBj CA@A?C 2@.BBԙBBt0CBGBBsAhCA@A?BL@BvCVBvCBvC9BvCEt?BCA@A?a=BF8AdDB/CBhCՇx?+;C.C@@A?jBb@IBCBCBC AC j?ذBC@@A?{ B6 A<%tBwCяmBQwCoBQwCAQwC#]?fmBUhCA@A?lB@)BxC?SBxCBxC?ՔABw?6C^CA@A? B44A1dBߚA_BܚA_B@[GCmuB[GC7?!YBA A@A?ZBq@u7yBnBpBBKcBB8M@C^?W~BUB0A@A? Byk@RBBsB~BB~BlA~Bll?JB{B@A@A?HCuFy@DC3&C<=C:&CzB:&CABNC|?CCk&CPA@A?vC/k@bdRCCNCCGBCB>BU|?]RCC`A@A?}Cɝ{@CEeCZCWeC)CWeCk BVeCy?C',fCpA@A?A)B@sB̑BB"BcLB"BwBHC"r?PFBBA@A?BY-@JBCB焍CaC焍CB焍Cx?BqCA@A?w;B2/@B"^CB"^CB"^CwA(Bv?WFB_P^CA@A?"B@'BcA`BBRAvBRA!ҐASAҕw?/3B©AA@A?@B@b,Bx CRqBx Cf Bx CAx C7r?"Bt#C@AA?_CU@ KC[CHC[CqC[CF&B[CP|?JCL[C@@AA? rC AI4B9pC[BApCĥCApCA@pC$u?BC@AA?[wCg@CKCtBKCBKC?*KCu?BqCSLC@AA?YAC"@C{COC{CsښC{CJ]1A{CG ~?lChC@AA?ATC[GEAVICPdCCC0QdC6]C/QdCA/QdC|? NCeC@AA?~(%B7AxBLCkBnC P@%CW~B%C?K?/BhCAAA?ʌC`5@OCC MCC͇CCAFC~?ChCAAA?UAAASC]AC^&ACACZ>Av C AAA?ORB |@YBJB/BBz CBP+BB`Bt?BB0AAA?B@B*CB>3CB>3CA>3Cmo?.מB5?C@AAA?}Cb@OXCi#ARC#AB#A#BB=>C* }?XCB"APAAA?Bd @HBWhBBWhB:BWhBWAnC^?OB hB`AAA?e C.yM@BCBC&CCjBC[y?BփCpAAA?]IB@ 8oBZKC!nBtgC CtgCBtgClBLqC">BLqCnBLqCȺBLqCng??BVpCAAA?Ȣ9B bA_t?BC"CC"CzB"C}?@CC!C@AA?CE@3C_C0Ct_CBt_C5B .Bq{?4C_CAAA? !C@6oCSIC|CSIC_'CRIC AQICq#{?4CICAAA?VBՃ@qCn@COCR=CFBR=CCBzCXv?dC1C AAA?JBMv@@B́cC]BcCHBcC6.BD>Bi?bB)cC0AAA?BAAA?JnB|@VBCڹDBCY"BC֊!BCÑr?VBVCAAA?eB2AL_BRm6CߗKBVm6Cq7cBVm6C@Vm6CGp?_Bi|6C@ AA?$ZBp@B,gC(C'CUC'CC'C|?-Ca(CA AA?QC@`1CC)CHCIvsCHCBHCB|?2CCA AA?7B @ZB?ICqBICU,AICJB'AB?[}BbIC A AA?L0CHN@CHCMCHCA5CA AA? C*@B7ZCB4ZC*&C5ZCǜ^B5ZC|?B|ZCA AA?Bl@A6BxCJBvC BvC7=?8Cu?BC@0AA? Bo@A}B-C]B-C WzB-CҐAܶBYg?sBfC@@0AA?s B)AjB$N BA P B >@ P B6C~@UJCC&[?C8C('C8CoAC*|?HCCA0AA?HBl[@ٷB$CjBC$CR/@@$CBIC0t?1B)|$C A0AAaACx@5@IBpZBDzBDZBBEZBSBYC6n?lBQBPA0AA?$Br@P-B'CBV1C)BV1C•AV1Cw?!B1C`A0AA? B@ByNCbB}NCuB}NCAACvy?BNCpA0AA?OB @ mBǔFCfB͔FCgA̔FCAaA\?4.mBFCA0AA?PyBr@fTBb}CLLBZ}CQLxBZ}C0A[}CI]h?TBg}CA0AAB[f@ٺBAC&=BACO CACUBACS/{?WԺBZ4CA0AA?Bmz@ޑBs&6CաB}&6C[B}&6CsB}&6CPz?7B]H6C?@AAzŪAAFBL C%AB C~A\XCRB\XC>IBB"C@@AA?Q7BjATdBOӃBC@@AA?6 CR@ڷBCwBCuCC BCx?FBPCA@AAC@aC nC*CnCOCnC)BnC\?.kCEPCA@AA?uB_$ABЛC޽BЛCj BЛCSB=Cd?EBpћC A@AA?_xC@CCBWNCBySgCBIA?C|}?R C%B0A@AA?4B{@BГCJBΓCBΓC}AΓCc~w?B6C@A@AA?C;c@C} Cߝ@BL.RBBQBJCQBCBQB%y?.B2vQB@PAA?CC@~MC LCuFC LC!l=C LCAEpA }?MCyMC@PAA?BǛ@T֧BaAZvBAEBAAAr?_YB#AAPAA?=C@B[CbkB[Cf9C[C@nB[Cz?B/\CAPAA?}xB0`AB BgUB BuCA BdBVCJc?BiBS B APAA?Z)Ć@C$C#C$CSc2C$CA$CD|?C$C0APAA?\@Bŗ@R;B$VC=B-VC>C-VCAB-VCi?=B/VC@APAA?A|,BAB`cCP=BaC·AaCAC7,?IBLCPAPAA?B|@BCBC_BCt+B_ .CUz?MBSC`APAA?u$UBÒAʠB ;}CyB";}C#A";}COjBDvBf?BC}CpAPAA?B"I@ηB,C B,Cq?cB,CAYCw?`BDCAPAAr A4(ACBz\CԐ+Bs\C:$?} BY1B} BݾA?BB\C@`AA?BX@YBٱ=CB=CB=Cl@=C9u?G=B9>C@@`AA?9C0@z:C܏qCR3CqC9B@KBqB%BqBDlBqB|PAqBv?!-BXqB`A`AA?keB@krBݝB:gBݝBMBBݝBKAjwCpm?JsBԚBpA`AA?afXB@M}%B NOC*BNOCnBNOC´ANOCмd?i%BJOCA`AA?UB A/-OBf*C'=Be*C+RBe*Cf«@e*Cko?OB'C?pAA?PB|@BC\BCVACIPAz- C\&?jBC0 BAA0 B5|?m(CRB@AA? B@GB(kA2B^TAB]TA_L@QTAq?sBAAAA?Bl@ŅBB'BB8xBBX@C#i?2BtBAAA?zBYi@2B]ΤC|BXΤCBXΤC>ACms?1BC AAA?Bc@| B8Cc|B:CB:C{4DAqtCx?wBC0AAAoB@ BBG`C:B?`C B?`CMB@`Cf?BBw`C@AAARuB=@l Bn8(C=Bm8(CnUAm8(C(B7Cw?&B.1(CPAAA?9B8 AAICmAAC8BACk AAC[L?~AVѮC`AAA?TB%@{>B3CiB3C2OC3CMA3C |?ʆB3C?AA?1k=C&v@P;CR8C}?;CU8C@AA?)(B AlAKSC=AևCZ?~AՇClc?ÝCۉ>†AŲC@@AA?:Bj@aBŇC;BC_BC)BCu?ôBC@AA?.J(CӚ@0CHC0CHCCCHCt&AuALu|?0C HC@AA?#sC-@BEf5@B /@m=C /@6YB /@y?]Bl(@@AA? B@lB(]C$B(]CSB(]CbA(]C1x?Bf]C@AA?Bנ@B~QfCByQfCByQfC+ A|QfCMv?СB;fCAAA?עBl@`ƷALu$B̴A(t$BB(t$BoB(t$BܪJ?/A BAAA?q:B"@U8BCbBChBC ACDm?B,C AAABi@fY|BCrBC6BCjY4ACkn?|BC0AAA?/BaB05@6ԮB\TCPBcTC3BcTC,AbTCG{?JBUCAA?B<@ B6TBCZ!CC`BC?oBC?AA?*-B:A5> BBC* BܼCAܼCvBZC*}?CC AAA?iB|@nB{LCΔB{LCDB{LCPlA9Adx?a}B{LC0AAA? h7B/AہB4C'gB4C9{A4CxiBBci?3BFC@AAA?nB<@sBOCqBOCBOC3@,C{?M|BꗤCAA?GB@JBBBB_8BBG@B?BB?AA?IBaA,BdCV(BdCDVAdCAǓBL9?@+BLC@AAC r@{CbCj?BbCcBbC?BOz?vCC@@AA?賺B @BBDBBBBABp?/BB@AA?B@'sBAiBAXBAS8BAck?&sBzA@AABO%A/OBC`ACw@CA/pCk ?CB$C@AA?ȔB@r`BUC~BUCWs CUC]EBUCay?PBUC@AA?yB_w@M^BJCSBJCqS~BJC*AJCYo?^B JCAAA?ƑBTl@+JBNC$BLC(]BLCJAPCx?UyBCAAA?sAvxAJBB2BBA2}CηuB2}Cz2?JBB AAA?B69AlAC`=ACAC*@C^?șA=CAA?B@ BBCBCPAC?ƋBC?AA?gB)/@BNCoBQCBQCAAQCvt?sƋBC@AA?B8@B ߦBOBߦBBߦBz@ǷCrz?{BQB@@AAz+B@s#rB?nC#gBKnCBKnCAJnC[Ap? rBÙC@AA?u3B=@ҀB@aCB@aCB@aCBd5Bz?3vBL:aC@AA?&$BܾAYnBqCҌ^BqC51AqC8B C,;j?nBkuC@AA?3Bh@3B͒/CBɒ/C@sBɒ/CP@AeɱC5u?#B/C@AA?BA4ABABAB?pqvCACNA{C(?ACAA?gޏB"@ABABzBBBBx?AB?AA?AN@"BBCBBC9'VAhBn~FBhBX?<#BVC@AA?LdBz@BHCeBHC/sBHC5AHCoCz?7BHC@@AA?1AF%AAICS6AuICQ9>xICmEAˬAMI?A[IC@AA?hpB^@3BnԆCBqԆC7)DBqԆCAQBs?*zB܆C@AA?(:B =@B>0CzB>0CT$B>0C6yA>0C}?B=0C@@A?kFC@OCB_CB#uCBBB?CB@A?{Cz@dX7CBS81CBjCBCB?D:CB@A?BWA=BBѓBBtAC@BC'?9NBBAA?[vByABBb&BBAB)BCtw?bBBAA?B7J@@BBBAC>dڱABAA?_vhBaJABCC=BCx"HBCAB?'BCAA?BA6CB'WBBCBC4"CC?2CB@@?A?BC@fClC'ԚC CbC Cy%B!C}?筠C|4C@?A? B@LB?ϔBZs?BZs?PAZs?3O?C~B?@?A?̱CB@B CBC#pCCBCҀn? BfӏC@?A?UC7@`CSCZCCICCt(AB C|?U`C"C@?A?Cዖ@.CĉCPCFCCFC?6Cx?TC}CA?A?zC@C,C*C,CB,CVB YCv?C[%CA?A?QA[AȦB_.=CB*.=C'gHBANhCA'?,BdBc?A vAL()CAk()C wCAk()C@6C>A+)CA?A?CACaCAC)kBAC|?;C5ACA@ASC@73bC{C6[Cp{ClDCp{C)PAC"|?b`CCA@A?|B@" CBpCBBB BTC,4x?5 CB A@A?AAoAA'C}ACK@ ChPA CU>n AC0A@A?Bli@ƬBA2BA4BAAAq?rBnmA@A@A?VBY@_ BGBIBBBBd@B0t?=BOBPA@A?eC}@>(CTC~'wCOC}QCOCB'C\~?߀C!C`A@A9}lCld@e\CCIlXCCts|CCBCN}?[CCpA@A?6/CU"a@3C$ 1CC& 1C7GC& 1CU[B& 1Ca{?JC1CA@A? B@3 CvC1CC0BCbtwBJCx?CCA@A?9tBI@LBC=UBCNBC3PA5BCu? ԹBCA@A?zG)B%AEo#:ABECA@A?yAm)A7.BRC0%BRC[AEJB,FBFJB5?܂.B=CA@A?JreB0iAB ~CyB~Cr-B~CA Br?%ߑB~C@@@@A?#aBYA1B~kC zB0fkC,A.fkCXOB]Bb&?BjC@@@A?АBl AuBGCHnfBӇCP5BӇCCBAMB666?]iB\C@@@A?1Ca@p CCC,CAB,CABvt?ICIC@@@A?{qB@ìBlCBޢCAޢC€B9CJ_?vwBC@@@A݌C\+\A[CCaCCЇCC rAQvBdz}?CCA@@A?!ؠCG-A\sCQBOlC:BPC:B$C:B}?zqCBA@@A?AKC:@C6:C C6:C!C6:CaYB6:C|?-C:C A@@A?$BhT@R[BA B{AsA|A'BOCVr?BA0A@@A?B @n1C1C*C1CB1CCDC5y?0CJ1C@A@@A?OCX@*CkaCB!CAaC ޳BAaCfB5By?*Ci*aCPA@@A?.+B@B݆ALBAq܂BAAJCr?B'A`A@@A?B@BBzC)ǕBAzC~֔BAzCy>B1k?(B~zCpA@@A&B@B=CWEBDC¢BDC AC-bu?BbCA@@A?wB`@!B+ C"Bf ChBf C'.Bf CvW?Q"Bc CA@@A?èB@@CufCCufCHBufCEmBIBE{?WCͅfCA@@A?B/@MB5@`B^5@B[5@VAT5@0t?pB$4@A@@A1B=@ĀBB+:tBBBBABlFv?BB BA@@A? jA8AVAr-C|_Ar-CɎAr-CV@Cr?A-C@@@A?~VC!@KCBaPC'BC'B [A+B.}?֙CB@@A?ZA-AuBoCB}2CNBB%*CB@?[BȑC@@A?`B} ABkC BDCĩADC^7BqBAH?#{BKC@@A[ BG@B2VC>BB2VCaB2VCB9B Bp?!B-UC@@A?q9CԠ@BC9B6C9C6C"A6Cu?QB CA@A?.dwCu{?R"CC0A@A?XB@RϲBfCBBeCa CeC[BeCs?ڣB]C@A@AچC'X@BҜC5BC3kCC`BBC6x?ɎB:CPA@A?SBPAB&CB"&C)U^=%CĘBC[pR?M?BwKC`A@A?'@Bw A$B}GA#BGA+ AGCQBGC_?JlBTApA@A?=B@-BQCIByQC:ByQC/WBEBs?oBCA@A?NBε?AB:B6BI:B AfbCbBebCU? B:BA@A?eBDTAgBd@+B2e@A2e@Y6B*8CJl?UrB~`@A@A?bBS1A[BfB_RBrB%@^~CZB]~CN=?[B )BA@A?wB뻽@aB}CނB}CB}CXӴA}Cw?嵋B[iCA@A? NA[7A BBCOBBC@BC]wAy Bb7? BCC@@@A?fCGf0A7:CTsC[4CsCCsC+_CsC{?;CFtC@@A?pB@8NCKRwCaICCwCACwC_",CˇBx?dbOCvC@@A?-=B^=ABB0eBBVA턔C:BC'?ZgB%B@@A?ECք@-LCBCGCBC$=CBCy(A nA{?EwNC|CC@@A?GC$ܟ@UCħAC{C{AC%C{AC h B|ACw?rC @CA@A?A`tB"|?-C{CPA@A?B7@B8AB8Aѥ&B8AJpBEC?q?DB A`A@A?|=BrAуSBQWhB_TBWhBw@AWhB?BnCz=?RBjBpA@ACu@;BcC~qB-cCEC,cC4B+cCKy?BDcCA@A?B>6A wBBBB#FFABoA2€C(?bBqBA@A?FBܓ@(BC-BCX CC_BC u?¡B7CA@A?.Bŵ(ArB-MBdiB-MBhA-MB0(BzKgC9Z?+!sBMBA@A?SAS/A8)BPC9BKCz\?2B{ B,B.9?49)BvCA@A?>KB@;9B`CB `CL@B `CTiB~43B'{?i6B}`C@@@A?w4C$f&Az^CjZjBZCfjB9CfjBBnCc{?cC6kB@@A?HTBFF AR$BǂC[}BǂC7AǂCSX-BBDI?zBmC@@A?܉C@ ~CeCo݋CCRCCKAC }?ҏCiXC@@A?롮Bo{@BBC轉BBCϔBBC>vABCf`?BC@@A?rC@wCR7ACqC$7ACυC$7AChA%7AC}?tC6@CA@AdBϔ@ BϑBBHBuBHBCAdCr?BB`BA@A?(CC@Sj4C=Cq20C=CMQC=CjB=C|?H@6CWC A@A?B8)@-БBSCϋBC) ^BC>RfA,C'd?UB.C0A@A?%sBi@XdB7=C;Bi=C+SBi=CL~?BAm?1OBC~=C@A@A?BDZn@B3CGB3C+C3C{NC3Cj?BYCPA@A?+BF@BLICBKICBLICIBQA]t?BIC`A@A?/LCGs@&TC#aCVCaC>CaCZA<CV}?UC QCpA@A?vA@ABz1 CEBz C(\B= CC= C??oٲB CA@A?]Ba@lB{BPmB{BfxB{BB{Bcup?w`kBXBA@A?~Bh8Av9B\5C BM5C˨AN5C{AC0?BCA@AB @[BC3EBCzRBCثAΛC)r?MB&CA@A?Bd9A[BCfBCP1ACe:BB`?kBC@@@A?BO@B;BLBfBECfBBgBBh?mB!B@@A? ZC@CjCDCHHdCDCxCDCSBDCh}?*jCaC@@A?bBAuhBBõBCBqADB`mB8ZCR? BOB@@A??\C,a@CC?C Cf]B C)@>2Cw?CAAC@@A? wB @KCB6 C BB B YBĢCx?ECJBA@A?H|C;^@MC&CHC&CC&CB&C}?KCCA@A? ?B@SYBl C tBq C8Ap CbBC[U?B C A@A? CD@?;C'LCWO2CO{LC BN{LCBnAmz?d;CJjLC0A@A?)'CA@8YCm2AoOC3AB3AZB 8?C|?XC5A@A@A?PsGCVI@1C,CY-CC]CC>BCl}?G1CީCPA@AxJC?k@jKgCBIfCB))CBHuBzC>}?fC(B`A@A?B#@B8AB5vABBgvAqBfvA#HBcvABd?@B&@ApA@A?;B@j CsC CCBCdnB懡Cy? CCA@A?Bt-AeFB2ΰBVBFΰBoAFΰB`A3C0?BBA@A?/ Bz3ATBd/CjLBd/C`?BKNBB{#7?6/UBJ.CA@A?1B9@CPBB BBBB@B(v?ZBoBA@A? B@]SBԉBNBԉBBԉBA˚AԉB)z?DBB@AA?ؠBjc@-B2"CB"Ct:B"CpTBNB>Ki?JBC@@AA?SAa#AHLBSCFfDB$C@AA?Cٍ@xCvCmCGC"CmC(C"CmC!B"CmC| x?CkC@AA?)DC<=@CC7BCB\lCBBzC~?~CT_B@AAsC?|@5C&r1C_C-r1ChdC-r1CACs.~?DԃCz1C@AA?GNCMi@QC,BbMC,BZC,BP!C,BO.~?OCBAAA?[7Bѩ@BbCײBmbCBnbC9fA:BFp?7B`CAAA?A3AjHAC?ALCl+AC`BCm>AmC AAA?YW C@[CBC@ĥB{@C?ĥB @qCx? CB0AAA?k`tCCQ@!qbCLvCA[CRvC CRvC{l:BRvC@Z~?cChC@AAA?N3BAA~+7C A+7CQA+7CM@J@?A27CPAAA?FBAK@%"BZC7-#BZCAZC-ABW6? B.C`AAA?bBl[@B(@CB@C( A@CgB:NA+Dk?ǻB"@CpAAA?B@?BC[B CC C΁B Cxu? BCAAA? B @xA,BPA,BcB,BlρB,B\`T?A3BAAA?CQ n@*CVB-+$CSB ? CRBaA=C %}?*CWBAAA?BByϮ@kBBL B%B}B%BʡA$By?(BBAAA6B51A.B@*B@j%B@'?@d?P/B.@@AA?CQ@JCv@DCu@kBu@IB9C%R{?OKC|@@@AArC0AC)AGCACAp CA"n~?@DCzA@AA? Bܢ@C;CkCo;C)ZBo;CƇB-@z~w? C<=C@AA?HBS@;)C.CƩ%C.C_mB.C\oB\)CJ?z?b(CቮC@AA? B˞@ڕBtCْBCLBC-k@ %CFl?~B C@AA?/C(%AbC7*A6jzCg*ACg*ABi*A8~?dC߳AAAA?C@CkC$TC(CC(C[A)C8y?!9 CyCAAA?,B8w@v_B CʇB CjڌB C!@ Cbfc?ZsB]` C AAA?WCy@OC2VCɣHCVC3bCVCPAVC}?MOCXVC0AAA?Cgj@6ChnCZBbnCBC/1:BC-pBCP^ACwZ?(,BH}C@@ AA?MPCv@b{C@B5rC@BE*C@B!B6dCɉ}?H?}C@B@ AA?)C,I@2:B°VCwB VCC VCA VCv?BVCA AA?1wBG@kmBCjaBC2BCP=A,C_vQ?0oBsCA AA?mC@PB$A5BAp&CA׿;BA z? _B%HA A AA?HCC@g-CCs)CC1QYCC:ABCB|?`q+CcC0A AA?.PB@.Z@ӳC@oC>!AoCYo@oC ~!>@\)C@A AA?CTNV@bBѱBBбB;#CбBDy7BбBy?RBBPA AA?^BS@9RA[CA,x[CE;B,x[CyA,x[CW2?1aAp[C`A AA?oB&@9]BwCBwCYBwCXp@wCsAq?BwCpA AA?OA,3A;OWBxnCyRBnCA"jBB"jBt(?~WBnCA AA?d4Cы@}BsCrBsC<]kCsCGBsC |?)BgCA AA?GB$AeB] AAw A YBx At9Ax AV?}BgAA AA?lB]c@TPBASBA2KBA@Aܫx?NBA@0AA?hB'@F(CkABkABkAabABCSx?mCۺrA@@0AA?e.CV\@[ C]`CWEC{`CPC{`CcB{`C-+{? CiaC@0AA?BE@BC`BޠCaCݠCcBݠCv"q?tBC@0AA?C@0#CYC4CaCCaCACXz?g#CC@0AA?*BqkA2BLCBMC.A2AuB2AqN?KBCMC@0AA?S-C$@hMC @g*DC @1C @ڜHBW46CW2|?NCC @A0AA?\C,@%SBZB BB+CB)CBBy?*B-BA0AA?2?"C\@C DC#0C DC.C DCA DCt{?.C>C A0AA?U[C)<@ƷB8C B8CbNC8CB8Cv?Bx8C0A0AA?mBo@_7BpCmBpCmVBpCAC¯m?/BYC@A0AA?4 ClV@UpB\CvB\CgC\C`9A\Chy?B\CPA0AA?LBPz@ⶄBC BݕCBݕCv% BݕCo?plBɕC`A0AA?Q,A!-Az ACtAуC@уC@1Cq=>A=1CpA0AA?| B["AdA%vC_A+vCrA,vCABk?ACA0AA?B5"AmBCaB'C6A'CX4B Cid?AomB8CA0AA?B@hBNBBNB;BNB4AC{?bBi[B@@AA@AC Ä́BcC~BCM#Bg-CZBg-Cm?BaC@@@AA??BH@ +BZC|BCzCCdkACv?iBzC@@AA?B @FB?UB/BanVBbBanVBcBanVB"r?}B]~WB@@AA?%gBA B4CT)B3C?A3CͲBCV?׋B3C@@AA?YZBi@ԥB}CfBD}C/AD}CKOBtB8`?B|C@@AA?r6C@"B BB6 BjcoC6 BB6 B{?1BBA@AAA BV.AKB`BuM Ba_BU<@h_BBZC ? B+KBA@AA?*طC@C0BQWC0B C0B@0BI?-Ce!1B A@AAqC|@(C BCC BCeC BCh? BCxz?^CAC0A@AA?BN݋@gCfCPCaC BaCQABy?wC^C@A@AA?Bt@B,n&B+B f&BC f&B-IB f&Bt?ēBX&BPA@AA?pMB@WB BVB BB BA B~j?WB=B`A@AA?BcP@%BLBH BUB64BUBGAUBHG?B}BpA@AA?0iB>@ Cc׬CdBd׬CEBd׬C1AǮ%C'{?Cy۬CA@AAB u@B/CB/CpB/Cw`@/C"3u?B['CA@AA?^/B@%A)A7AEA8AkB8A64A8Ak?Ѷ*AvZA?PAA?8Bl@WNBC2FBCV5BCBC_?RBҨC@PAAB A N B QCiBRQC_ )@ A/} B A>[RBQC@@PAA?:>BA IBoFVBMg@BSB)ASBq8AhCr??IB'NB@PAA?Bt@ʼnBQB6B^B;$C^B?B^Bvs?B@B@PAA?^B@B ؽA'ҝBؽAӱBؽA AؽA)r?B-A@PAA?6#C@CCCȖCL=CȖCiBǖC{?iCOC@PAA?6C|@Bl9CBl9C(Cl9CHSAl9Cx?[Btd9CAPAA?~}BAA#MCtAϒMCI1JBϒMChAϒMCh ?^A,WLCAPAA?i,B`RAo\qB C NsB Ca@ CZVBe&BJ?qB=C APAA?g·B<A2rB2^CtBbC=nBbCc?ECc?QjtB(dC0APAA? Cӭ@zgB&vCBʀCU 1CʀC_BʀCݓx?VB9C@APAA?mCh*o@ lBE C&BH C3#CH Ci*{BH CFz?B2+CPAPAA?B@(BYC)BYC" BYCbzAB@+v?B YC`APAA?L3B4$*AB!CƉB$C:YA$CRBBc?ˉBCpAPAA?$OB-@@By@4B@iB@BA@/b?'B?APAA?;rB3@Cy̖CBy̖C*By̖CA1Bc|?C͖C?`AA?}"BANBcBBcB@BC@Cp?9ߵB}+C@`AA)YC@8+ICoۦCЂJCpۦCeAcCpۦCAqۦCO}?IC.ަCA`AA?nBI@d/BkC/0B,lCB,lC‚B,lCzd?v+BlCA`AA? B@*_BmRCiBpSC'2BpSCaB}Aiq?WBaSC A`AA?@Bw@AXwCWA&rwCB&rwCA5B&rwC4U?(QAwC0A`AA?mBwp%AoB}VAڗBVADOAӊECxұBҊEC]?2BЎA@A`AAB.ABixC-B_xC @`xC> B&Cv.?pBSCPA`AA?TzB@BCBCmEBCAC"w?˫B+zC`A`AA?9:CAz@\oCbFBuP CybFBeCxbFB$BwbFBt~?#XCHFBpA`AA?vAANAAɻAA8?KCTAKC7>cA#A?pAA>C@XC,6C=0 C$6CϿB$6CAذB1y?_CvC@pAA?Bͫ@HB@>C{B9>CtB9>CN?$@:>CJv?wB$C@@pAA?B?@rBCB{CB{C>B>LCt?|9BC@pAA?sBؖ@B'B3B-B2B-BA.BeWs?UBEB@pAA?B˰@BfCBjCvBjCVRBBYHw?|@BC@pAA?|BY@=+tBf|?V%CѥC@AA?"FCo@2CthC{2ChC*WChCBhC2b}?92CDhC@AA?3AC@oBCC֘BCC=CCuɘ@ISC1}?ACC@AA?3B*=A4B^BeB^B@A^BgVBC }^?UB?\B@AA?YA AE{vBJCHqBwJCXAkABkAp-?LuBtWJCAAA?:0B@@Bs1CA1CtB1Cz{8B1C?G?#2BCAAA?CA:A"BL'CoBK'CpXACRBC_a?#B&'C AAA??'B=h#ABa@AI@MBJ@@P@ M?BT,#@0AAA"HAi2A#AԚAA"ԚA/@ԚAKAAZGC>AaA@AAA?ѪB؝@BGBBGBcBGB9yAGBf^y?B!pBAA?nAE9AjLA'653KA)65@4C^tA4CN>w RA\>5?AA?#VBY AB8BSB8BA8BsB*Ck?,BB@AA?4B]@B9VBB9VB=7A9VB=BpiC]v?xDBD'VB@@AAC@2BgCGBgC[u&CgCAFKBgC{?B1JC@AA?H^C@^&C CZ^#C CLC ChuB C}?ˀ&C C@AA?2BE@BCBCBC9A? B;s?BzC@AA?BBf@ ɎB"C,B#CfB#CFB"CQq?yBkC@AA?{gBzAg*BclCBclC1AclCT5BCwm?2BiCAAA?+WrBSAɱNB CEB ChyB CDQA Ck?_OBS CAAA?B@ BQ COBQ CBQ CP)@Q C[{?BW C AAA?u;Bs@UB($C B($CC($C>B($Cy?MB>$C0AAA?/B0FA=B"B,BB^ BBAcCec?,=BNSBAA?#B6ABCtBCTUAC?BBzi?OBC?AA?B@BN-C[BI-C&ޮBI-C2]BI-C#P?}BfC@AA?o%B;QAGB"4B^?BD4BoBC4BHۉAB4BY?HFGBB@@AA?7C~@ C"nC7C,nCeC,nCB,nCُ|?Q C ;nC@AA?]NB;2@BFCBDC\BDCcR+BX!COv?ջB㤪C@AA?\EBB@wB9wjB~ilB3wjBOB5wjBs@;wjBo?QMwBejB@AA? eBV@[B|COBC3YBCj@mBt|?~B 'C@AA?.Bk@2BU+CBU+C&BU+CO[@⪯C|?fLBP+CAAA?YA=AAVCRAVC:@VBAUB >ACAAA?Ba@mB1CMVB1CCB1C@B1Cy?RfB1CAA?Bc@s>B4C4B4CB4C}B4C?3BdRo?qYB>TC@@AA?&uBц@UBN#B ȢBN#B CN#B{^BN#BFU{?B#B@AA?VxBJ8@AnAAACӦBA&qBAZ?)A A@AA?+B3A|0BӃC:mAӃC۳AӃC@F@NB"4?+$B*C@AA?}Bw"4AjB&PCJQBPCoD@PCTUEB(CZ?ZujB4C@AA? ;ZBFHDA0’BTBSBYB-rBYBlACkq?ΒBBAA?-BBJVAK@Ci@CUACIAC >0@C?AA?JB@:mBDCTBDCp$BDC>AA n?ǢlB)EC@AA?B@#B@RB@}B @@x8C"Dv?pB*\@@@AA?zBU AwBuBBxBϬ`BxBӦA CK>x?BOB@AA?BM@OJ[BˎBWHBΎB׬BΎBBΎB>FAA4CPAA?7/B~MADA4CUcA4CS-A4CO@4CU?GZA4C`AA?a2&BnŅAB4CR=B4CIFA4CUA%7HY?B4CpAA? BcAA4ĆA4CA4C~A*'7 >AA4CAA?AT:AP*~B4CN~B4CJ,BQ7BQ7X?}B4CAA?ƧBА@|B4Cj({B4CB4C(B4Cp?}B4CAA?Bd#AB4CB4CTB4C`HA4C?7רB4CAA?BNDeABC㬕BC@CCjA4C@@?A?M4C @}3CHC +C=ZICu1C=ZIC@CZICU[x?fk1CÚJC@?A?)KB*QC@?A?Bx:@YBJtC(BBtCBBtCه/BCtCe?oBXCA?A?'gB&ABn2Cj[B2C3uA2C;~BCt`?9B CA?A?ըB@B mC!BmCAPBO)?C BS)?CӈAS)?C]A'2AE?Br6?CA?A?¬ B^IA~B"SC BSCJASCvyWAԨAN?nsBNSC@@@A? /B@rBǬBBBBBA&BgC`U?BL$B@@A$C@~;C?BV7CVB5_ CVB4BճCy?hACXB@@A- A1b7A5ACQB 2AOQBZ@ShCFAShCC=bA;tB@@A?^>C+H@ÀCBI){CBUCB@B=n}?@CEB@@A?Bi@`9CaQCBaQCtBaQC1AAMxt?fC#RCA@AoC_@B}iC< B}iC;6C}iC;ZB}iCU`w?BBhCA@A?d.C @C_A+C_AtBC_Af[7B_A{?CA A@A?%›Bh@WLVBXCOBWCRBWCBWCca?YXBޛC0A@A?T+Bc@Y]CzgCUeCkC-BkCsADBw?[ CtC@A@A?@Bր@W3B#AGBAPѴBA]SAq|?nBPiCA@A? B Y>AoAϏCAϏCoBϏCB$AϏCBB}>B*A|>BiBOCu? B&BA@@A?"BC3An/BCBCpACht-AiSCEV?Oi/BC@@@A? QCH@hQZCeAUCeAOFCeAvA PBCiL|?(ZCWA@@A?KC<@;CC[8CC~BCpfBǷBjz?T9C֒C@@A?c B1@=BC쀓BC"'BCmAB([?IBC@@A? C@BsCڻB6sC&C6sCjB6sC5r?4;BTqC@@A?S`Bg(#B@ CA@A?;#C[@gCXCCXC,*CXCBAXC9y{?<CzXCA@A By@=BWNCQBeNCBeNCO@hNCApu?B]NC A@A? B:@Bb rCeB` rCWmlB` rC6A5xBe?,B rC0A@A?UB>@QBCC5gBCCBCCb1@CC;l?ӯBCC@A@A?9A UA:ADC@ACA;BB;B>A:ݍCPA@A?9B_f@ߖB=*CrBO*C$BO*Cm@O*Cl?B4+C`A@A?xCx@`CDEC(ObCBECCBEC?$BDEC}?.`CECpA@A?V0Bc*A@AzC/Am,CNZAm,ChCAB> A mCA@A?c`BAVBDCOWBDC.BDC<:!AeA^?WBDCA@A?&B4An\BCnVBC@םC^lBםCM7?xF]BCA@A?_Bc{ AZgBw@K]Ba@7:Ba@2Q A|9Ci?DgB@A@A?B:A='B!ۖCyFB%ۖCA%ۖC4AlByF?'BC@@@A?5C@iQCN/CVMCE/CP[BE/CC^&C^z?}UC~ C@@A?D.CӜADCL[YA?CkZYApCkZYA(BACz?V;CUA@@A?eC=@(kC:JCdC:JC aC:JC_: @ױAU|?QgCJC@@A?DOB!JAA޽(AgA&(ALA'(Ao@>Cu> A!lA@@A?7UBz@b C}%CT@ C%CB%C=gB>KCx? C뫥CA@A?{tBDͣ@B#CgBo#C9Cp#CTBp#C1s?B`"CA@A?xfA ABCBCD_B;BC;BC?yRB2~C0A@A?C0?@pdB ?CB?CPC?CoC?CIu?^Bt?C@A@A?2C܇I@CN/UCWC:/UCjB:/UCFdBBBD{? C)TCPA@A?kCC-?B%AA@A?B@BTCQBTC}HBTCFJAmCj?:BLCA@A?5B2A3A;V]B$AeV]BAeV]Bܻ@hV]Bn&?q4AR]BA@A?nA7-A]BCMACf=@C͎A>B!"?B3C@@@AvB}5ArC@C[Q CgC/+3BfC BBpr?CC@@A?R,B@l:BxCK4BxC~BxCAxCfC?53BwC@@A?*nBA C0C,C0CAWBe!CWB(k?C6C@@A?By@[ՋBBӜBB.BBDAB"j?gB/B@@A?ɭA19ACB CBC0gA1CB1C*?B CA@A?c͆C1@dCtB}^CrBYCrB-BrB:%~?גeCBA@A?B^@>8BiV5CYBdV5Cl݋BdV5CB1?-r?B@5C A@A? BPAAıBVFCsB C4`BꄢCG#CꄢC K?BC0A@A?VC\@+C_gC$CbgCBbgCjBMB|?F*C_ugC@A@A?Cg@*CӅCq]&C΅CC΅CABC{?Su*ClvCPA@A?jC^@pCCJWCDCEWCCEWCDBFWC|}?CCvVC`A@A?Bev@}g'CBF(CBnBBBSzCJ{?'CiBpA@A?0 Bo-A~PB<CBV*CA+CJB+CZW?BCA@A?HB+A_t)B~Cyh(B~C"B~C?wBOS?x)Be|CA@A? GB&@B@B@(B#@$lB:CyCs?3hB!@A@A?X.B3:-AbBC`ACm%BC'ACYT?_ BCA@AKFB#AsA$rC$A*rCV`B(rCA(rC Y?ArC@@@A?|B@0DBAt>BA%CAF=BAcnC?,AhBhB`A@A?KB>@BKAB̈́BgABsBhABDAldC|u?+BABpA@A?Bg@cBʦC-BʦCnBʦC.AʦCv?BߦCA@A? CV@ #B@?BP@(CQ@ևBP@yy?S:BԘ@A@A?A*ACB)`/C )ACXr? WB!C@AA?B @CECCECsFBECb{BVnACx?@CGEC@@AA?CK@OHCBCCKC_CJCkBIC~?oCC@AA?*BC@8CC4CCɢJCCAC|?ٿ8CC@AA?EC{@PC1TCLC1TCB1TCBB|?5RCO8TC@AA?VB_#@.BY$BOB$BF6B$B屓B= ]Cu?Bڻ&B@AA?$Ct@*CM.A;$CO.AsCO.A@>CJ{?*C5AAAA?CM@ GBBB̟B&C̟B>B̟Bh4x?DBsBAAA?eNC@Cp6A l CZACZAEBZA5{?C$B>C:)C>C^rB>Cxy?rWBRjC0AAA?MC/+f@hEC2CeAC2CvUC2CA2Cg1}? EC'C@AAA?0LCu@AlCNCjmCRC&CRCϦBFyB~B}? lC",CPAAA?UXCZi@B}CTBCK3CCBVBCy?TBC`AAA?#B]@wB_4CwBD4CBD4CY{BD4CC+C{?CE+C@AA?5BʾA6(A4BQAB7ABs@;Cl?`VAwB@AA?GFC@8B_CBY*`CCCY*`CBY*`C w?nB`CAAA?B@pCNɱC=!C&C]B&C."C@1CB@1CB*B C*Ba#B*Bv?bB+eBPA AAU"*B9AtBɓCiBɓChB>=AEB>=A@>=Ar?BBA@@0AA?3Ck AUVCiC0MCiC’CiCwfBB6=|?rWCdC@0AA[B@B3C|B93C$B93CoBC7a?rB72C@0AA?zB@)BCB6CB6CA6Cq?BOC@0AA?JB@M9BiC%1BCBC_LBC\?N`:B+'C@0AA?$X*C_&@C:8C&C:8C;7C:8C A:8C|?/CV8CA0AA?|BF:@aBȽCAB̽CTB̽CTA1Bw?BЈCA0AA?yAԆAҌBLC\BKC1B%CB%C?BqC A0AA?C@RyCcCVCcCLP$CcC AcC"z?CC0A0AA?j^BSe@B0CE\BCCԡ*CCCdBCCju?BbC@A0AA?B7\@BSjCVcB 4jCB 4jC}iA 4jC"?p?GBjCPA0AA? ANA{AsB-AB @B>_iACu3>AB`A0AA?B-@BNCB NC0B NCą A>Au?JBPNCpA0AA?'BA^B`RCXUB`RC^A`RC BEA%\?&_^B0RCA0AA?h~"B7A+dBpCGOBpChApCEB"rBFa?dBnpCA0AA?A0Am(sBkC΄]BkC[_=dkC]B^BNb?CsBkC@@AA?ZB@+BʰCڢBjCBjC@jCqr?|BC@@@AA?#CZ@*=C4}C (3Cݚ}CCݚ}CB5B{?c;CPk}C@@AA?z0AADB˹BZBB;JBdpCwOBdpCK,?ݖB+B@@AA?sIC@k5CD&CO/C]&C_C]&CxBB]&CN}?@5CjR'C@@AA?Bt8@FMBɚCkHBɚC8BɚC{ AɚCo`?iOBIC@@AA?KB57AmAC'JA&C0xB&C B&C` ?XuACA@AA?|Cl@B*FC%:HC%g?(CBHHC@PAA?'B[ A{A$SCXA3SCPA3SC@AT%?/aB1TC@@PAA?WAbA@BOCWX;B,C{AB$|BB?Z:BC@PAA?goBL@iB{cChBcCVBcC^@cCSj?BcC@PAA?qC/@#C\}BQ C\}BB\}BeB8WsCz?4a#C(8~B@PAA?>,#CϜ@C,mCǭC'mCV.C'mC{A(mCƪz?CWC@PAA?dC @fFC7CC7C|# C7C'_AG{@fsz?RC 8CAPAA?茧By@Bi"C徕Ba"C ӢBa"CgB@a"Cn??BCAPAA?uDC@RBeC=BpSC CpSCdoAqSC;y?BFC APAA?+BMAAτ=BAPVAJ;B0APAA?CZ@tFB'#C),B'#Cr0C'#C.B'#C%1y?GB^#C@APAA?BJ@ BC0BCLBC\?FCr?оBCPAPAAcAI2/ACAiB|;AiBп?iB'A:|nCLf>aAAj1iB`APAA?C3|@7jC*ChB*C C*C(A*C}?C*CpAPAA?/LC0@,CrC0CrCCrC@tRzB}?p7,CVrC?`AA?Y@B*C@B$BB1B=B2B;AwCr?3 BDB@`AA?ZB@0CBCB:BB_B5YC@y?{CLB@@`AA? &BFA5BuF,C3BWF,CAWF,C5B,#C%?`4B+C@`AA?\ B,A~BFC ~BFCdA.A[ɛB.A64?}B+FC@`AA?B{@u'-B ޑA@.BDߑAxBEߑABDߑARQ?-BȯA@`AA?,NNCc3@A>CcC4@CcCXCcCAcCH}?>C~cC@`AA?8Cі@ C'C5 CC&^CC٠BCZA|?W CCA`AA?UBQ>ArTBdCzTBC҈BCjACFPO?\TBCA`AA?m C3@SJBgWCBWC::CWCBWC>x?ռBXC A`AA?GB@QB]"CPB]"CB]"C#~A]"C[f?PB*"C0A`AA?(AyAA$Cd ACw6@ . CA8A . C>7 A˩C@A`AA?^yBo@NXBCOBC~ BC+LAC?,f?XB>CPA`AA?QBo+;A!BABA9NTBAejAA@_?k$"B=A`A`AA@BRB @AFiBX AiB qBiB BiBF?0ABpA`AA?A#A׻A CFhA CxA C;@'Bۭ-?ͼA"C?pAA?RB@JBu&CBt&CBt&C)AJCw?B@&C@pAA?O B@h%B_ʶAtbBʶȂ BʶA3oBTJCm?'B4ɷA@@pAA?B @; BC1BC;BCݠAa/Cri?BVkC@pAA?=,B0NAyA8C1SA9C3)A9Cbs{ACl>bAC@pAA?B3@!BBABjBMeCjBBjBw?BB@pAA?BӉ@BCPJBCoBC䑖@C|w?6BC@pAA?MBA0oAxCA.CEB.CcA.Ce)?"ACApAA?t^BwFNBAAxFNBw?"B2NB0ApAA?Ct@lCrBCjBCjBA[C C|?CgкB@ApAA?A'8AFXBBC%LBBCf?BCFB#ChX?`XBGHCPApAA?}cB*۟@g]B CB CB C;B Cx?4B C`ApAA?Bk@]Be}CiBe}Cl'B1tAABnA-1BB AZ#AAnZB=C3? BBA@AA?A$AdQBH`CQBiTCRxWA5*CуB5*C#YBB?AA?B !AрB#ACGBAC8@өXA BXAQ?@lB-TCpB-TCjC-TCdB-TCߛy?B{oTC@AA?хBH"@3Ba$CuɆB\$CcB\$C$)A.QCm?ćB$C@AA?gBz@$BB%BBSsBB#2B&8Cw?+B_B@AA?C @ COȖB(C<ȖBB<ȖBAdCLz?Ӓ CB@AAGWC@bB[Cc2B[CkAC[CrB[CIw?B6BGCAAA?;`B)A B BTƶBB\ABBBDC p?BBAAA?'(B4AH؀B㈲B.uB䈲BdA䈲Ba;B9Cp\f?܀B芲B AAA?cBi*@yBB#BByBBNBTCw?A*CAA?B#AvB)-BCBCiAC?ڵBC?AA?mB@BACB@C6.B@CͅBDBu?B C@AA?>y4Ce\@I*C"B%CB >CBfrAB|?+^*CנB@@AA?X\B{C@ACAC&P4BCAC{!?A@C@AA?͂^Ct@DCCCCCCICCa|?CC@AA?B_@̘B{B5ߒBkB(!BkBAkBr?BkB@AA?Bn@ěBfr@Bs@/Cs@sBs@bfw?B(@@AA?eB4Ag BCBCĂBCulBC\?7 BQCAAA?¹AB"ANxA[cCJeA[cCS6@[cC7An=Bx>OevA3cCAAA?&BXN@C5y?!B;C@AA?C'@zCyjC8 CyjC]ByjCA_AE[Be}?8pCjCAAA_*AC@A?BAVBC`BCNBCp_-AC {?.BC@A?ӿ4CAC@nCBJhCB4CB\+BC?zrCB@A? UBYAۦBBBBAB ~BCVl?ЦBB@A?#BPMAnACXAC?m?B¯AB˸>4ACAA?Cm@CBCB CB@C?CBAA?A@lABBBB(BC6@CCc?}BB AA?'Cf@HCCWCCCBDBC?b&CB`AA?U$BARBBwmTBBBB@BB{?WBBpAA?Z?C@UBC$BC<%CCBC?[BCAA?yA,zAACAC@z>C,/ABZ>*̧ACAA?MRBALBB8wBBbBBCBB'h?>BBAA?jA֑A)1BCƌ)BC @CB7BBO?81BCAA?tB;FABB5BBuAByACL?'RBB@@?A?gkC @'XCH'CbTC'C5}C'CI%B'C }?eUC,{&C@?ARC@V8C#L AUW4CB A4jCB A~XBB Ai{?59C.@@?A?OCA@<CM0BC10B2.B20B25B `CLw?:C0B@?A?1kBXE@muCsuBUCtuBèBtuBA+]qCNu?ICbGxB@?A?wB@?kBC fBVCBVC,!BVChe?`fBM0~CA?A?mBֶ@B8XCB@{BbBBBB@IBWB=Chn?βBBA?A?!B@;CRCC"RCB"RCAqA{?%CRCA?A?_BB@B{BJ*BȵBU*BBU*BzjAV*Bt?¼BSBA?A?zBU@$BpBBlBsClB\ӃAlBV|?BBA?A?9BnAB y:B(Bx:BȡAx:B 4B?bC l?BVG:B@@@A?9޷B8g@BrECuB|EC!B}ECPACm?BkC@@A?spB#@GAFB7AFBzMBFBzAFBf ?WBT"B@@A?-SBC@ȋB̐BYBːBBːBfBe|Cڴe?BB@@A?tiB,M@ KBպrCfFB$rC*;B$rC[|B$rC4N\? DBsC@@A?cAy>ArAvAAwAJ?FCAFC'>UAwAA@A?B1C2@C@xBC]xB_HC^xBHB^xB%{?wCBA@A?C+@UCayC>OC>yC4C>yCeAB=yCw|z?b CLyC A@A0dC@5DCkCL;C;kCՃC;kCB;kC_|?CCTkC0A@A?~C r@lpC6=CeC=CC=C;B=CV}?[pC"=C@A@A?^BdU@w!CvCC^vCނB^vC-:BڅB?{?o% CgvCPA@A?#Ba@BƯCq$BƯCP CƯC`BƯCu?kB¯C`A@A?߿BT@/LBCB&CB&CB Bv?7B CpA@A?Ĝ-CVq@uCCCCf%?CC!BC{?CfCA@A?uqB@qBEIAxJBSIAx63BUIAFA*ICi?QB_AA@A?B@ BWBBWBjBWB@WBUpw?SBXBA@A?B@iBQkB]BGkBABGkBXRAEkB"p?hBHBA@A_B2@$KBBBBBB@&C!Qv?qBB@@@@A?ȱCr@CcBwC(cB3 C(cB @lC4Wx?CzeB@@@A?ZfNCb@p$C{C C{CtC{C"B{CHz?$ "C{C@@@A?3B"4AeC|CCC|CҺ@|C CBo?CC@@@A?A`rA0AJxCTAxC@5B[A5BOj=@/wC@@@A?cCd@FCyC ACyClCyCB|ByC q}?EC CA@@ABs!@fC(;*CB;*C̏B;*CMWBCkw?C")CA@@A?2A b9AwBA B#A'c AyDFCJ0ByDFC)>9BWA A@@A?s0B%@4BBmڦBBBB–IBbYCd?BKB0A@@A? BqĔ@)$BrCBqCBqCdBqCk\?&(B qC@A@@A?uX9C4uV@7.CƺC)CC7aDCC1AC |?].CCPA@@A?&2CXI@p*C2WPC*C>WPCr5C>WPC6A;WPC{?X*CPC`A@@A?6B@kLBMC;0BMCSBMC9AcCw?9BQ;CpA@@A?,A0AWA(C3"AGQCF@CmACv>^A`CA@@A?HˤAAAAkAA{@7"GCYA7"GC>ꇟA]AA@@A?Bå@ CjI@=CiI@C BiI@8B%7C޼z?, CE@A@@A?AhB& AD%B C5BCjBC?ACƗh?#&BqCA@@A?X)B]EA Bx*BlBox*B! Bmx*Bt?Ax*BP?BB :*B@@@A?:C@CRC~BfCvT0CeCNCBeCyw?CwRC@@A?,Bi@G:BC8BNC`XBNCAX#C7j[?9BOC@@Ac|CQ@ˤ|C_^C#uC_^C)~C_^CA_^C }?Cc^C@@A?"B8AV;B2rC7B2rC@2rCBGxBy(?|N7BoC@@A?xBDV@إB⫫BڹBBg CB0BB0p?uBm.BA@A?Bh@B,?C͆B3?CIC3?CűB3?Cq?4BVCA@A? "/AC3^A%B^AB LC "C LCf?ZC A A@ABrU@ CB CvДBBvДB%AA1CꖡCX3CꖡCd@斡Cz?7CyLC@@A?hhC@^AHTC`A@A?lCv@#(CY Cn(C4j CC4j C!BCA |?Y(Czt CpA@A?p Cy@$B{ CBz CN!Cz C{^Bz Coy?+BA"BA@A?jB@@BCB퇌C;B퇌CxA쇌Cz?3,B}CA@AgBI@|B;>׊B;>ʥB;>hWA;>Oy?pB S=@@@A??B @B@mCrBXmC9rBXmCTBXdBhq?aB>WmC@@A?B@hB!WC>BVCCVC,AVCJv?|B6lC@@ACR;@CBCCtB.CtBpyGA{BBn~?CB@@AP CP@ClCClC ClCARAlCz?xC0|C@@A??ԩB@8B6GA[&B2GAOB2GAGvA2GAk?uB6AA@A?B]@׌B17C!nBW7C㳍BW7CAq@Jp?B8CA@A? B0@CNCּ CΊCBΊCl*B :Bw?r>CC A@A?CZ[6@QBBkB$B+C$BOB$B;z?BB0A@A?'B@3/C 1B*C̳1BAl`C8CCC@@A?CZC@ C BhC BB BACN{?!ClB@@A?73C9@WzCK|!BCC|!BHC|!B.6B|!Bz|?ޙCKg#B@@A?m1Cޙ@ CBCCBCӈTCBC~ZBBC V{?ct CgBC@@A?yCٝ@,BlBB9EBBBu:CBB˥BBBEx?KBpCBA@A?i@BA BCBVC{(AVC A/ACu?K BCA@A?FBm@ }BB-sBBCBjBBn?̚BB A@A?zi C0@" CCCCCCc_>|Cm6{? CC0A@A? }B l@?BlB(֎@ҖxC:+BTsC:+BB:+BLC^C%|?xC^+B@@AA??Cc@rC_BbC_BjfC_BVB_B&|?Cg?B@AA?fC~A6JCrBCYBCYBBXB?CC|sB@AA%Bх@n?BGéCB?éC^B?éCt@>éCav?/BC@AA?bB ¥@R B5C9B5C(VB5CYAB?rp?BwD6C@AA?=C@ $BA,fBA'CAsBAt?/B$AAAA?C\@CqC CۂCCۂCdAۂCly?COCAAA?;C @=MKCbCDCbC$/CbCh̤A;BZ}?CKCbC AAA?BCBA@ CUZC*CUZC)CUZCBUZCz?A CCZC0AAA?.B@8sBɏA[sBABAMXJBAig?>qB$A@AAA?C,;@G:C SC2{{?4C+B@AA?B3@7}B~B tBk~BBk~BrlAk~Bd?vB$‚B@AA?cC@SCjBJCpBgvCpBĥ.BpB)}?n8UCB@AA? QB @}BBnBjBDBjBh A zCfo?JBKB@AA?UC`*@Z6CC,CCBCVZB&#Cjz?4C|hCAAA?KC٫@Bp&BěBTh&BD6CTh&BhBSh&Bz?[B)%BAAA?8C@ٱ.CC*CC~BCCAC|?5-C˸C AAA?B @۲BXnC~BJnCvAJnCKBUhB,ho?B"mC0AAA?EAp7(AF}AkB٬AʀB@3CW.A3C4e>LAB@AAA?xB@nB6CC=KB.CCB.CCA.CCQp?5BCCPAAA? BGABBB.BznATC\BTC`?Bz0B`AAA?%R&C@+CоCB5C;C+C;C]iAʾCz:}?nbCCpAAA?B]@%-C CcC C֥B C&BCuz?$HC] CAAA?3B$A$BCBC |ACOBR~C m?cB8CAAA?*Bc@+BCZBCBCk-BCyMx?BpC@@ AA?aCJF@,LC B2ACCPByCQBYBRB2|?LC,B@ AA*Cy@B RB]"BDB8 CDB:ADBsv?B&.B@ AA?YC/@;CTBCTnBCTnB`$qACx? eCHJB@ AA?v+BT)AtbrBsB^dB \B@ \B-FBW[C[A?jB2qB@ AA?uC@OC CaC C|C Ch|AoCeC?9C CA AA?^>C[@H.CCk/*CzC0^NCzCBzCD|?j.C ѓCA AA?EUBZA1B|C"BtCdTKAtCBΕBj]?OßBÍC A AA?B@/BBaBB5XCB_BB\?BPB0A AA?V!CR@lBWқByBDBQcCDBe?CDBx?BoB@A AA?om CLG@XBABACA(AAzz? jBAPA AA?F0C@l@C BeCBg=CBAB1}?3% C@B`A AA?AF!AuBCmBC*NA~ECIB~EC:?tB1CpA AA?hAmAiBtPC`BtPCAABAx9?ziBtPCA AA?AIB&A%bB*cCNB*cC>!B)cC0A?Bj?abBcCA AA?sBAP~BGd CVgBId ChBId C-8>#d Ct?[}Bi C@0AA?)C%@ (CCl C6CdC6Cfd@TB{?J9CC@@AA?b:hB* AJYZB>CbBTB>CM9B>C@Bh[?yZBh?C@@AA?XBx@x=CzjBBjBBjB3oA.nCx?CkB@@AA?J5Cf@;&%CA#C[AZ!BC\AA_Aa{?,$CA@@AA3B1-A bB?eBmKBA@AA?7CuK@BoC–B|oCNMC|oCqC|oCu?ΔBoCA@AA?Z$BGAˢBsC:BsC?A5BлB2B$Z?gB^ tC A@AA?XB$AlBCTӍBCBC@Ck?ɍB'C0A@AA?иBԲ@y6BpCMnBpCsBpC3)?Bn?DBzXC@A@AA?CYo@C2|B7C%|B"'C%|B!B%|B |?C*MBPA@AA?Ba1@@QB ۝CbB۝CB۝CA۝CEn?QBfԝC`A@AAq'pB@BΊBstBΊB_AΊB9B|gyCou?HlB*̊BpA@AA?IA_$AlBeB32PBeBVX@CmC]BCmCR?kB_eBA@AA? B@v͘B1wBRB/wBAB/wBfo B.wBz? B͂wB@PAA? B AQ~BCxBC BC: BCgi?O{BC@@PAA?JXBlA=BCB9CA9CGBTC^?)Bw C@PAA?$GC2@iEC/CCC/CpFC/Cj?@/C|? EC>C@PAA?~%CIq@CԔBpCԔB;CԔBOBԔB/z?SC%B@PAA??C}@(C6CB5CJ A5CA^?xt?B{5C APAA?,B\FA;:BlxCPB|xCľ@~xCptB"BY?UBcxC0APAA?w4Be9AOkBUGC2@hBUGC՟AUGCHp B'AvW?QjB.GC@APAA?!5B3A8SBCmUKBCvACeA81C~\J?yTBղCPAPAA?C@lBMBTB^B6C]BcA\B|? B,.B`APAA?BƉ@0BFC .BECBEC ADC{?BCpAPAA?>BM`4A $BdB,#B\BAA\B-V AChZ?m$B?B?`AA?ʲB5@bcBBB(BSU B)BǤB XC q?,BHB@`AA?pCZ_@kBAgBACAe.LBAu?BA@@`AA?cB|@\B@&B@!A@Bp6C=J[?CB@@`AA?kBs@BaC!1BaC BaC껋AaC1w?BsC@`AAE)"Cvҝ@TCcC+CICs.CIC:AICK{?9CfC@`AA?B(@H+BiiC0,Bm*C_Bm*CAm*C/Y? ,BqC@`AA?C@?i CBR CBeCBA\{C+mz? CBA`AA?$C\L@SB!= C|LC; CPCC; C$B; C5{?_B2 CA`AA?/C@!CDk{Ci!CHk{C8CHk{CAFk{C+(}?X^!Cy{C A`AAʰBFA6RB!C1cB!C)6B!CKA!Cm?uB/ !C0A`AA?rB A6ޒBGgCt!BFgCBGgCAOBCg?B?gC@A`AA?G C;Ա@C{A9 C_A# C_AU:@lA}?MCAPA`AA?HBJ@YBL,C EBI,CBH,C9PBH,C-s?|ZB C`A`AA?A'AYpBq%FBg*YBo%FBj@[eCqB\eC Z\?BpBwFB?pAA?Z:BOA,^B}CB^}CPA^}C;@|BX.?!RB%~C@pAA?XBڹ@eIBnCBC㬍BCS6}@!ԳB|tn?BC@@pAA?YB_@JPB?pRBS?-aBS?RAX5CAW?QB̕?@pAA?XB(v@B\ABR^ABP^A \AACWw?qB=^A@pAA?,cBO@k#}B_C.|Bq_CXFBq_CJ?s_C/g?{B!_C@pAA?A*BABg:CXBFb:CQ@H@er#BH@?BO9C@pAA?cQCʬ@ CJAC`JA)[C`JA AaJA\W{?-CAApAA?M6C9@EC"CC"CåC"CAKCBKCn:>?3yBmAC@AA?B(@B j{BTB{BD~B{B BrCtv?:Bm|B@@AA?BBr@BLBXCBmC:BmCsBB)p?BVyC@AA?9i Ca @TCCD@CC %CC\ACc|?iC! C@AA??8C/'@+CnC!CkC.vQCkC68ZBkCu"}?C,C@AA?UB@C}BBCN{B=CB=C\XB=Cs?g|BC@AA?BLԥ@>$B`BTB`BB`B̋>`B w?B%aBAAA?B@BgEZC-%BgEZCCgEZC%BfEZCw?4BDZCAAA?޽Bʞ@BhC(BhCBhCp@RBU{?nrBhC AAA?FBx@yBR^ClBR^C( CR^C7cwBR^C_I{?xB E^C0AAA?`B@B¬CB¬C B¬Cf?¬Ct?њB5ŬC@AAA?vA?A BC'xBCt4AqB"BpBa?aBCAA?[B“@BwBCBCrACWBBu?3BC?AA? BF?@B C(B CB C֮@ CL{?{bB윬C@AA?B(@7BB5BBBBBBsk?=6B뢃B@@AA?$KB@6 CWCs CWC!BWC8B>C.{? Ca\C@AA?B@BӈCUTBӈCCӈCɔBӈCu?=$BֈC@AA?B>AwA5*BnA)B5@)Be AvCWz>PxAͼB@AA?B@B3jB BjBGBjB+BjBcS?{B B@AA?7 BJo@yBkCFBfCBfC AgC v?BCAAA?LBv,Ag AbWAtAjWA'`AmWA@qWA(S>/A%EAAAA?RBf@snbBTCNBTCەBTClATCq?bBKbC AAA?ɂB1 AB CjlB!CB!Cpx@!C r?5܄BC0AAA?RBX׽@NCA]BABAvıA@=CZo}?]C,A@AA?i`BG@B'B&PCD!BPCOBPC9APC}R?'BdPC@@AA?i5C폁@ZC6xC5- C7xC\C7xCjB7xC,|?ACd}C@AA?IBq@kB8UmB&UB,UmBA*UmBBLUoCbh?BX%mB@AA? BL?5Aq B@ܛCCB<ܛCA<ܛCxAwCo 8?. BKΛC@AA?lB@BTq>B4k>`_B8k>@AA?tBd@BBB<{C y1B>{CΗB>{C?FA>{C:m?BBЂCAAA SB-AJDBqA.BTA9LBTAY@XA^e?cDBa2AAAA?#/A=AXAA!BDA*!Bw7A*!Bu@yC>VAЉBAA?A#!MA:yBB BBM@Ca1&BC$E1?BB?AA?TAAB(OCB'OC }A'OCA8AbZD?FBXOC@AA?1BIA3BHY(B)BAY(BFA?Y(BAQ^C|S?Z3B=(B@@AA?e&B AuBB&'BBsBB4@Bq(Z?BR4B@AApTBaA"tA_B(Al_BtBl_B/Bk_BGTASpB@A?,CXU@CX C*PCA4C?C@A?ϊB5AQiB4CrB4CaB4CAa&7y"?3B4C@A?kfQB$fATBC{BCY BCJA4CRo?)BC@AjCA]xC/}5'Cw5Cw5wA4C?aC׍5AA?B?@2C-CC{BCB4C?!/CCAA??1CAP[C4CRC4CC4CDžB@T7?#r]C4C AAB@A CCSCC^BCdaB4C9?CC0AA?B2C}@8 C6>6C^>6i_C]>6B\>6?CK36@AA?B`AmAT A A_A4Cs>ѵAPAA?i`BAB4C*}B4CA%7tB%7Qc?sMB4C`AA?_B0%ABBC?C{B4C? BCpAAeBlA_BCTBC@ACɭA+OC@?A?XB<_@uzCٔCpnB۔CB۔C 2AjSBv?CCTC@?A?Ad'ApBrCMB\CGB. Cn C. Cl@?2B!BC@?A?:WCۦ@eX[C'CVC8CISC8C|I@r C:}?OGZCĠCA?A?@J=B`+A:B]lCSB&lCS@&lC BlbBqZ?ګBkCA?A?gB}@C?JCH CpLC\BpLCiB1Bx?iC1YC A?A?'C@ C%X?C?V?'c0C?V?}A?V?~Uz? C0U?0A?A?BG@=$BCPȟBCHCC]BCv?oPBϠC@A?A?McC@CwCtlCwC ˜CwCjYAwC~?-C`CPA?A?z5/B}.A)BgC*BbgC }eAbgC#AUNB&?[#.BgC`A?A?B^@+B6חC,BCJBCOBCZ\?NE,BCpA?A?&B^E@oTB w%CBm^%C Cm^%CMBm^%C t?B$CA?A?EA3.A1 BCBBC}2b@/CeB/C ?BCA?AmB`@0BJC2ʟBJCBJCEgA)eB~r?6*BCA?ABxKABՃByBB_ABbAWC;?6B* BA?A?RA BV?AQ)qA]CP[A]CA]C3Y@]C?qA]C@@@A?C/BUaA bBB[BBk?:.UCaB:.UC:?QgB B@@A?d ZC~+@CC\lCCj.CCBB;}?SCC@@A?sBѶ@lZBTbC3BTbCBTbCMoATbC\s? B bC@@A?-HC@~C8BCyC#8BC$8BgB ZCt}?CB@@A1g)C @<#CGaC8CYaC-CYaCu=\AYaC}|?ݼ!C)CA@A?C+@pC!CkC!C=C!C2AAZ˪C{z?CD!CA@A? A *A B'CB(CjA Co?B C+o>jB(C A@A?gCvנ@)0CCSqC CKC CA CP}?]z~C-C0A@A?(ZB?.A8BBJ3BB@BzgBSxCQ*4?S;BڅB@A@A?B@@|B0BBBBBP#AB{h?NBkBPA@A?AAAnwC^A^wC A,B$B,B~>AvC`A@A?ίB'@lByMC9BuMCBuMCd@Atw?dBsMCpA@AB֊@I%B/BDBB[BB/kKBBt?vٗBBA@A?#CBR5CNA?i?B5CA@A?HB@%RBϷC@BɷCVHBɷCLBɷCr?]QBCA@A?B@ B5԰CB6԰C omB6԰CsݜAl-Cg1y?ҬBٰC@@@@A?!C)@O:C1#C4CB#CCB#CFlCB#Cs|?7C#C@@@AA ARB]&Cu2MB&C:AwCBwC^>ZBX"C@@@A?WC@CB#C8BC5C8BlZSB8BqUz?$CӺB@@@A?qB}@QB<~BB~B(BB~B BCt?BkB@@@A?qC@m@HBEfCqBhfCGChfCBhfCu?6oBCA@@A?\j C&@C-AB.AC0AŭA@Ax?CAA@@A?{B@BIA"BHHJAQ@BDHJAbB@Cڳh?eB[JA A@@A?,Cf@*CAB#C|BG0C|BRA|B˾{? +CcB0A@@A?8Bz@BA[BsA|BsA AuAj;u?yByNA@A@@A?. C6X@JC9ԓBC:ԓBB4B:ԓBA}C(y?CؓBPA@@A?HBE8AAp C`\AK C@K C{ACA>wA|C`A@@A?Br@@|CC(C4C 9B4C uAkCy?LC;CpA@@A?۴9BM AIASB]A$SB B%SB@&SBg""?ABA@@AGB0@BtC BxCP}BxC{s B݁Bw?=BѯCA@@A?~pB̖@4XB^Cd PB^C\jeB^C@^CTh?YB[CA@@A?B@brBBYBBrBBABr?m|rBBA@@A?ƧB_=@mPB'8BT֤B!8B xB"8B<>bC={?ABr7B@@@A?BN@B,T2ByBdT2B_BcT2BA`T2Bd,q?nB$3B@@AqADAq@%B5@B)@=CE7 A=Cf=@B@@A?R4A2$0AQ BBBBB.=CeB.=C(?-B}nB@@A?0 BMa9AbaB/ C\B C@ CHB_Ca??VB C@@A?EB(#AA.c>\A>A>D?>Y?5A CA@A?~yB@*CCrC CC6ՍBCnB5g)C8Tv?CCA@A?FB=ABUB$qB>|BA>|BhC0BCE?m|BLB A@A?CCsel@ CICjCC UBCf##BʋB(z?cCexC0A@A?B@Bl]CBw]C ٺBw]Cvs?Aw]C~q?/BJC@A@A?jA"AAUBArVB AUC,>!BUCFD>}pAHBPA@A?#C!R@bCCCC(#CCp@C:|?])C%C`A@A?RZBGD@gBLC܁BLCƭBLCzALC k?āBLCpA@A?6eBI@BA(BAAACRB5DCY|l?}#BAA@A?;B7@;B䞲C75B۞C,B۞Cs,$B۞CK_?9;B}CA@A?~BD&@XBBC8$BBC%BBC6dBB}.y? 2BDCA@A?<B@e.A+AzCAC.yACAB-?/AC@@@A?6qAk@ BCpB.CLACۖqBCG> BC@@A? C@*CgEBC/'CQEBC BREBC,nB UdA/{?+C{AC@@A?T:C@aCC\CCCCIɑBեCY}? bC`C@@A?dA|+AB䪲C}BલCUAU1CBU1C(?B\C@@A? $C@-C(Bw&C|B C|B~A_oC,{?_.CmBA@A?KeC#@YCΈ\COCei\CxuCei\C<~Bgi\C }?PhZC $\CA@A/Byԡ@yBCbBCYBCg@Cft?SBC0A@A?:jC@CQ'CB-$CBF7CBeAC,g{?z.'C_B@A@A?wLnB1A .BP&C/B&CW ;B&Cc6@&CB?\,B{CPA@A?Bd%ABOBSRBXB0A CTB CW?BB`A@A?Bv@OBp5BjBq5BBr5BA\`aCt?$B5BpA@A?#B`@BPB\2BPBRBPB׳APBv?TbBPPBA@A"C̏@}CABuCAEBA~L.B!=C`K{?CYAA@A?.AARuABC>8A,Cc>@TCATC>A:AVCA@A-B@BrHCGzBjHCBjHC@oHCs?B~+C@@@A?)A?+AXBc3CnB}3C\B?CB?C4 ?MBM4C@@A "Ct*@ CCC@C5C@CQ6B@C{?x CiC@@A?C"@@CXCFFCC BCOBJ~Cz?C6C@@ACG@9/C\BA/y)C^BAB^BAgSBB%@CA{?2.CٌIA@@A?șDC׃@"CbCvCIvbCgCIvbCXFBJvbC{? l"CbCA@A?CRq@C!ZC C}[C\&C}[CHA|[CIy?1rCD\CA@A?]C@YC7dBPQCadBzfCadBOAadB}?uZCcB A@A?cBۣ@ip-B݀C(BԀCwBԀCBԀC[?p=+B[C0A@A? Cz0Z@wB1C#B1C$^2C1CB1C cv?غB1C@A@A?w]B_lA@B C2ABp Cc"Bp Cw@9mCt5N?sBB CPA@A?ׇB)_@ލB$CyVB3C C3ChnA3C`ow?B9C`A@A?Bt@BWc Cb'B|c C`B|c CQA|c Ct?IBf CpA@A?)B"A<0B @ -B @؎A @>Aa9CF?1Be@A@A?B &AvB9B@mBLBˑ@OB\BCXS?vB=OBA@A?!BOU@B8LGCy>B:LGC`C;LGCiAzAC A@A?@BAqBWVCmBPVCAPVC=p$BCٽN?rtB9C0A@A?$CM@C39BCl9BFCl9BA[WC)z?KCB@A@A?hBc@_c&B :Cl'B6CpB6C(A6C2Y?I$BCPA@A?)Bݠ@VّB;_CBYC+BYCNAYCRp?ByWC`A@A?BbBdAE[BABA,ANCS?ob]B.A@@AA?fBʴw@B:$C$&B<$CᳱB<$CkAwHCSt?B,C@AA-RB~P@75BDCBDCZI]BDC"B0Cr>m?:BC@AA?9C[@-ZBzCAB{C*,[ACAAA?C)2@&CoCdCmC!!CmCAmC r{?>SCCAAA?RB"@2B(G B+BgG BBfG BSAQWC^u?q!B9B AAA?_>C)ː@`AC!BAC!Bgq6C!BS)AnC}x|?AC/CB0AAA? FCJiS@!C{B\ CtBhCtBWBtB|?o>CkB@AAA?$:"CG@BYCB ZCESC ZCB ZCcy?wBsZCPAAA?jB鴱@zHBabCx8IBbCŒBbC(AbC[c?MIBa^C`AAA?)B@bBDByB3B+YC3BAA3By?BBpAAA?'>BBA}RB $CoJB $CeA $C A-BBS?RB+CAAABH@BB)BB2BB>jABy?aBBAAA?B@B`cCYB`cCeB`cC/@`cCLv?*BncC@AA?- C4@5CI@rCU@n%CU@9AU@cz?C8@@@AA?~dC@c`CJJC{BOKJC-*8COKJC+gBOKJCO`y?CLJC@AA?`Cԩ@pC9AJeC~9AWC}9AcAɛ?C'P}?rCލ:A@AA?*IeBq@B>CGBu,CͽAu,CFBX C{X?c BR$C@AA?/CYs@jCUAP CL"ABL"A,JAJQCWy?C A@AA)C#@,C CD&C C^C CA3B#|?--CCCAAA?B}\@\B7CGB7CtB7CRAv@scq?dB28CAAA? )Be@BvHCBHCBHC%BA?s?HdBnHC AAAC׻@%%WCDCLXCDC&{CDCaCDC~?WCFyDC0AAA?vcBhA@r}BՈC~BăCÝBăCErAăCj?}B|C@AAA?-A"#AmAMBOANB@-gCB-gCR3>A2OBPAAA?ܺCr@B3CC2B3C99C3C/B3C?lz?ѣBBJC`AAA?ivB@BABAoO!BAA5`OC g?1BDApAAA?+B"AA%aC A4aCB4aCyɴ@4aC5?mA:CAAA?3 B,A]$BNAbBNA?@CB@C e?6B<#OAAAAKbB9ABMA[BMA BMAVBIMC^8v?¢BpA@@ AAB>CW@0C1uC}'C_CN OC_CFsB_C {??1C0SC@ AA?B@xC~uCIBpCƾBpCT A Bvw?!CiC@ AA?E>CM~@OCCHC C1C CŲAHB}?OCx#C@ AA?B+@GB| BUJBE| BBD| BTJ5?| By?- BB@ AA?B`@ CԇC:CԇCۨBԇCZANB;PBx? CvڇCA AA?hC@C_ALB$ߊC&B @aoB$ACB$A C$A ؁B$Am?oBA!A A AA?By @BPChB"PCIMB"PC 5$BAl!q?PB$JPC0A AA?Bx @.BBߓBB\BBA$Ckk?BB@A AA?= C0l@BvֲC`BwֲCpCwֲCgBwֲCz?=FBزCPA AA?BKB A>BBT4BBn|%BBVm@:Ch?u>Bi|BA AA?"~Bd_@CːB$ B:BA BbBA B@VCs?sBn B@0AACS@rBCuChBC9>CC(CCar?nBC@@0AA?KB@BSB+q~BSBrBSBsASB3n? B{UB@0AA?FC@\CC#BxCG6CxCL]BxC[J{?ClC@0AA?ݨC @gC̨?C=C?CpC?C-@?CCy?HC?C@0AA?CF@C C|C CC CfA" C&z?9CC@0AA?CC@WCoBDzWCoB]*CoB4BuC|?UXC9oBA0AA?Z'C_@B: C3B7 CreRC7 CB6 CDz?̴BCA0AA?(B8AB=CfB =CB =C0BA0s?sB/G>C A0AA?BAo{BZ@J|BC@7BC@_@C@Gf?G|B[?@0A0AA?BR@²B-= C)7B>= CyB>= CA>= CB¥CBC.>'CCOBC>}?eB C@PAA? (BR`AA#P;BAFQ;B@FQ;B4ARbC>ޕA?B@@PAA?zPYC@r=C,CY~>C.C|nC.C?B/Cg|?m6=CC@PAA?oMC{@zwCsSCFCsSC.(CsSC BsSCz?a$CB|SC@PAA?B4c@\"B3 CyB1 C>ޣB1 Cu6B4B>w?B<C@PAA?GBx@T(BӠCBѠCBѠC6BѠC{t?wBʠC@PAA?B @DBOCB`OCCNiB`OCBA<[r?B`mOCAPAA?"ABq@Z8BFC09BOC;BOCpRBOCc? 8BJYCAPAA? A(A@AgE@YAwTE@@R7CC*AT? APAA? C@m$CCl"CCxBCKBƣC-\|?$CC0APAA?A%'AsB@m;Cp~B5TAC@`AA?%B|ˣ@(BC)BCtBCǰ?Cq?BC@@`AA?sB@FBh-CE9B>-ClC>-C@7B>-Cv?oB.C@`AA?C_@C)rCC1rC`6C1rCe^SB1rC{?C:rC@`AA? dC@[C*C:[C*C`hC*Cr"RA*C}?H[C*C@`AA? B@B7CBCHވBC}@B.m?ƗBC@`AA?IB޿@CBDCBLBB=pB81UCZz?^ CBA`AA?FB{@BkZCBpZC+LBpZCNnA BHx?BZCA`AA?B@xB1CjsB1CυB1CaB1C#o?8zB1C A`AA?# Cq@B.C|B.CC.CB.C z? 4B.C0A`AA?B1AB1|kCB5|kC_B6|kCZ@]Br?x^BNkC@A`AA?jBR@BACQBAC1dBAC?`+AACYu?}BACPA`AA?A=3(A\[Bk˜CUDBp˜CkLAߖCwBߖC:G?[BܜC?pAA?VCƮ@:͠BRAƠBGA-CGA区BHAHu?UƠBRA@pAA?U9B|A4BeKC%BJC'AJCP,qBETALaY?'܊BJC@@pAA?fC;A0BRkCRBkCE CkCtAkCly?}BDkC@pAA?Bp;A Bc;"CB+"C6BCGCC]a?2mB"C@pAA?B@ABB)CB9)CgB9)C#{ BC?t?4B٧)C@pAA?`cB@B C`yB C !B CUaAC)Dy?IB0 C@pAA?\B@C-OC C,OC4B,OCBWC{?JCKCApAA?xB4Ȩ@ C%CB#CB#C@J C-y? CxCApAA? A/AlBC^ACx4?CA@B, ?hxB:C ApAA?Cd@PCPCBCPCB CPCB4N9@7dCJ}?CrCB0ApAA?B^bA=yBB 8BuQ1B 8B~QA 8BAbCN?8BB8B@ApAA?S=Bs6ARBƒC2;BƒCbBƒC@?ABd? RB¯C?AA? "C@vBB=BB{?CBBB{?WB*B@AA?GBY@B;CdٸB;C4B;C|@;Cv?ZBF;C@@AA? jB O@XBBBB BBABBkv?BB@AA?ƙB@B_TCBnTC݄BmTCЍXABs?`BUC@AA?QC a@As&A2A[CwɦA[C(c@IC.AHC>AYC@AA?mB:S@rB+DByѣB'DBB'DBѯA'DBt?eB5BAAA?x~C@sBU@CbBU@CCU@CLA%BU@CŌ{?tB|h@CAAA?M6B55@Bp1C[Bp1CkrBp1C3n@p1Ce}?&Bi1C AAA?B_@Bl8CXBl8CCl8CAl8C- |?BX8C0AAA?1BE<;A AIsCANsC0BNsC'ANsC??IACAA?e8AlA`@B,Z@Bh3@C@CF<c@B?AA?b C@ű CEwCCDwCoBDwCBB ~{? CwwC@AA?aC&@B/_CB/_C.BC/_CnB/_Cf y?.UBI_C@@AA?WHBA8RBijCIBijCCqAijCXAjYB{M?$RBjC@AA?̃Ba@AB.H*CSB*H*CLB*H*CA$CQj?JB.9*C@AA?B\k@UB;Cr[B?C5yB?CAPBt?kBf$C@AA? BV@&BZ&CBZ&C;*BZ&C!'BZ&C5w? BU&C@AA?`Bw5@>B£CⱚBƣC3BƣCsMAGC !x?C$BȲCAAA?Af&AJcAnCiA|C5@|CnA!Cf>A2CAAA?IB:AfB*C4MB*C#B*CǬ%A|CkBj?[fB+C AAA?A!QcA6B@5B B#5BI9A#5Bk)AGaC?D?Bڹ4B?AA?E B. RAޘB5lC{B2lC%@ΔbBBƔbB-`?+BlC@AA?CȾ@B8CܬB8C?@&C8CdB8Cz?FAԇC@AA? BGAA+BȲA+B9tA+BXA犀C@!?-ArBAAA?&4Ai:AW B'CeA CrQA!C,A@C @?FE BeCAA?dA{A@BBd,BBACSBC'?--@BB?AA?B A&zByAf`BxA*@xA!DXB=C_?/AzB A@AA?OB*uAmBZ5SCtRBb5SC Ac5SC0B A!S?snB1QSC@@AA?B2)A[B5B֙ABP5B@AN5BI!BoaCWfV?[B5B@AA?ܕB@yBn$C3Br$CܑBr$C7?s$Cv?;B2C@AA?DA?@AlB@XvCwATXvCHATXvC^NAB;?4BvC@AA?;A3AP&AYCA\CęA[C$AC(=?E{ACAABd@ERBKBdžB ,3A4C?zB?AAHB@rQBBfC/2B`C'DB`C@`C[p?7.BBC@A?THC@ ~CBvxCBhCBBC?CB@A?mB/9A1*BB&BBИ|BBABa?1BB@A?8BAUBCBC|CCBC?BC@A?ZBҀAmIACACDϱ@CABc>ӧACAA?aC0 Am?>CCg5CCBC0BB?c>CCAA?l]B@r[BCOBCCCkBCӉ{?`[BC AA?BEC AHCB# CBCBBB?ACB0AA?E}B]1AsBCnBC/BCfBC~?qBC@AAhAuAnBCBCӈABuTFBB%B>BCPAA? B "pAAC]AC AC+AB>}AC`AA?B@BBXEBBӕCB!BB?BBpAA?B@pBCBCa CC,(BC??BCAA? B|@uBCúBCNBC.@BW?tBCAA?ꟅB(ABB3ABFBByBB|?DQBBAA?ABQA ABAB[AB +j@B{0?AB@@?A?CΎ%AC0tBxCtBǁCtBIQAtB~?CWB@?A?;Bd@YBB2UBB3AB4yBNFtCI?XBzB@?A?B@B VC WBVCAVCB3Cqo?BBBC@?A? kC@L#CHq\CCPq\CBPq\C|] B=!BsT{?!C!\C@?A?BZg@-CC'CCBCQB,CNz?,C֥CA?AC@ sCz~VCyhCVCCVCRBVC,}?sCBVCA?A?޹B~@nB%BbBfB BfB2OBdBzc?8oBqB A?A?&hCV@UC՗C}NCD՗C|~CD՗C?BD՗C*~?&zUCUC0A?A?ZC@΁C9qC1~C9qCܚC9qC@9qCJ~?hC$qC@A?ABʹ@7C3C=C3CVeB3C+pBҳC*v?/C 3CPA?A?éCe@3*C)}!Ctv+C_~!C C_~!CA0Cy|?)CL!C`A?A?₟BÄ@B30CIBS0CIBS0CB*TCeNu?BF0CpA?A?Bag@sBמC&BמCưBמC4BמCg?BÞCA?A? A/ABoUCq<BoUCBL @>B5!B;B ?TBUCA?A?0BY^7A)tB3CiB3C7A3CO;B۳Cdb?uB63CA?A?6a>BIAUBBjBBLAB/:BhǖCm?o[BB@@@A?(C@u CC|CFCeCCFCtBFCתz?[ CEC@@A?MCs@2#lCALBFgCLB0CLBYBr(gC}?mC{NB@@A?~m&BD)A+Bi}CyBi}Cd@i}CMzkBӒBK?*B1}C@@A?FBy-@*#C9CNC|9Cr˪A|9C Cmo@x?K"C8C@@A?B[8@[Be`CB\`C$B]`C|Ȧ@`1BΏw?bB~_`CA@A?B:A!CTCCPTCՕBQTCB?B x?+#C(TCA@A?|C@@B LLCH BLLC!.BLLCOB`Ayt?BuLCPA@A? B,AABbĴA^B@@^BphrAWC>aAŽB`A@A?B@=rBBBKUBBKUBտAKUBt?LBE;BpA@A?B*@kB)CB)CB)C`ACy?:B *CA@A?KBrlA:@B$CA8BC`BC'A CTM??BCA@A?yBB=BBxtCPHv?!CxBA@@A=B:@0B`(CZNB&C(B&CB-IA2BXk?]B#C A@@A?>B@9H"CO/2BC/2BB/2BFBȋ`CN{?A_!Cn?践BA@@A?NC@b+C)qC)C(qC!C(qCA(qC??CqkC@@A?[3B(AGBCbBC#&@ɣCCLBɣCU?ɢBQC@@A?:C.k@CICȤBICW5x?ZVBCPA@A?|A#A*BKuWC]!,B)WCA3AB-YBB?1,BWC`A@A?B}|$AA:CJA:C%A:C'MAu"C >AB3CpA@A?dBѣ@bBn[C%Bs[C+Bs[C +Bs[C`q?B[CA@A?Be@B:CB:CB:C"@:C)q?ǕB:CA@A? 6B@O~BAB9aBoABN%gBnABH:AgdCKw? NB ABA@A?/BN@BbC kBbC+BbCFK1BbCw?-BgC@@@A?JbBP@OBJCBJCaJAJCB"Cun?BfC@@A?5C1e@S1CCgV?C>CtV?Cx7(CtV?CaA4g5A/|?NCC?C@@A?BZ@{[BZC'BqC BqC%BqCzsk?โBbC@@A?~BV@#BDCSB@FBfCZ BBfCwBAfCM$BKB2w?!qBzgC0A@A7; C/b@lB*CKB*CW0C*Ce]B*Cu?{BV+C@A@A?A55A Bt.B'Bq .BB]_CB\_CTP?(rB-BPA@A%+C(P@hsCnjCyC8bC^7C8bC,A8bC0&|?C`C`A@A?hA#A5pB7B"pB6BEHA C+0B CmIE?d-qBBpA@A?|C^<@?wCۃCC܃C$C܃C?C"{?B{C&CA@A?(BD@WBCNBCV}BC,6BCĒo?CWBCA@A?-k-C<B>-CyABDg?5fB>CA@A?BGAHA C̒A! CNA" Cj A" C#?LA C@@@A?OYC@IC}CCC}CiC}CN$B}CC}?JC}C@@A?C@C˘AK Cq˘AACp˘AʰAg˘ARz?CWlA@@A?$B@&Bd B"Bx B5Bx B A/\Cp?BK$B@@A?B@NlBCUbB3C3}B3CZ@3CZY??nB,_C@@A?B5R@BWJCBC0BCqACm?TBiCA@A?B0A~AA[ AƠA_X@ȠA APC>ANAA@AYEB9`@;bB_;CaBg;C]Bg;CBBg;CQ8o?.B;C A@A?m C|*@BRTC-BRTCx(CRTCÏBRTCPv?BKYTC0A@A?7;CW@GCdA`HCA(*CA Av?QC|?vGC8A@A@A?4B6@gBeBB:BB:BACy?u@BiTCơBPTCCPTCOiBPTCas?B9SC@@AXC~@^CC{ԄCʒCxwCʒCA%Cm}?ACꍢC@@A?GTCS@RCJKCzC KCAB KChB fAz?IC7KCA@A?sC@áCpC C'pC8 C'pC9>Q(C'{?}CݓCA@A?z?Ct@ȽCC'gC{@CgC9CgC=@8C|?GDCGC A@A? A0A."BqcB"BPcBpA1CrB1CN>5 BB0A@A?ՠRCR@Rt:C-AB@zB;ARB; A1~B; AA=CUr?2BA@AAA?(Az$A|fBv-A99gB\-A@A>C,B>CE,?:fB)-APAAA?NB%A$aBvB+`BvB BvB%ABCv`?cBioB`AAA?ZBɇw@B'C&ΕBy'C/~#Cy'C9.By'Ct?lB^'CpAAA?NBÄ@BoCQBoC'AoCYCB.Bn?B qCAAA?B=A-eBvbC0&MBibCk'AhbC'#Bq8B@Z?ifBaCAAA?PBG@BJBf|BMB}3BMB$@IBcw?BB@AA?*C~@B*BBBUCBbBBqx?JQBB@@AA?jFBu3@BB@mA!X@A!X@;@a7C?5hAk@@AA?«B@!BĽ-AB'3A+C'3AǗB'3A`?OB[=A@AA?GMC}Q@X AC!Ag:C)A_\C)AB)A}?@C˿A@AA?a8Cї@6C, @D B @]e> B37C@ AA?BJ@ДBv$CBo$CU9Bn$C͚AdCW]?VB$CA AA?wB@BxC?QBxCaAxCܸBOB˪i?ձB.%CB CbBCC?B$C@A AA?8`AQ4AByBZByBJ@HކCVBHކCv?BBPA AA?o\B @QBuBHBԤuBy-BԤuB@4iqCXY?*oPBCuB`A AA?. B|LAɅBjBL~BjB[@C:ZBC;]?eB6BpA AA2BArBCBCOkAC SB\ƧBk?tBtCA AA?8A_?0A0jBvB5WBvBH?vB:OBqC(c?jBڕvB@0AA?ΝA2A3+BCqBC4AFCMmBFC.>2BC@@0AA02C+@l7C ;Cq3C;C,C;C@A@|?8C;;C@0AA?1JC|@wCZB]CZB}CZB]{BZBL{?uC[B@0AA?!fCᙜ@.1C/1CS0CO1CCO1CBO1C|?Rc1CY2C@0AA?A2A!-BVXC A0AA?C1BT.A\kBo2ClBq2CkAp2C$1B8Cn U? zjBo8C0A0AA?|[BFAVBNdCBLdCbLBLdCfALdCL?BZC@A0AA?RtBA߄A0C4A6C \A6C_{AЯB3 ?XWA CPA0AA?q2B=A$ BCCB@CtB@Cr@BkL?BC`A0AA?~B9@ɮB*CKRB*Cz)B*Cr@)C{?BCpA0AA?+B+@@2BְCwcBװCh2BװC!@\BXy?LBC@@AA?x~B MA]B_Cp\B_Cvj>A.BB]B6B.B\0?~`cBx_C@@@AA?& CU@CBCB CB@By?NCwB@@AA? C2@qBYBfBYB7CYBGBYB\u?yBJB@@AA?XB@vBB\xBB˖BBTAB=g?=wB^B@@AA?zCK@BBBB$BBaU5C"BB=VBBB}>{?4SBaCB@@AA?ZBw@ CxC C̬xCOB̬xC\ BYBy?T\ CxCA@AA?(C_@CCbCCcH1CCAC)|?ACm CA@AA?SB6 @PB)BB)BC)BQ.B)Buw?Bjg)B A@AA?BRdz@lBާC#BާCBާC0[AާC^x?PB5ާC0A@AA?QB<@щB>CB>CeB>C.?IA\-AEp?ЕB>C@A@AA?1C@ C;BC;BB;B0BbC||?ϡCNZ]AVUC@PAA?CM@BMCCBC_KCCҾBCz?BڋC@PAA?(Bq@[7BZ|CB |C/B |CA |CZw?B~|C@PAA?~B@#BBrB)BB)BQA'BYv?27BBAPAA? C@@tܵBpBB׿BmBB0ClBB@BmBBx?\B6BAPAA?v4B"A~13BU6Bz0Bj6B=1Ai6BmAaC=5L?nx3B7B APAA?B-3AB[CuBZC9h=0C vB0CsTH?v+BKC0APAA?,B@jC5B)C5BB5B-A/vaC{?^C5B@APAA?nByӮ@BBsBB\BB|BB{?B̅BPAPAA?z3%B2Aڏ6BuiB!B\iBA]iB&AXڄCFZ?H6BdB`APAA?peB.@B %BB %BB %B@B]Ce}?B %B@`AA?By@BxBBbBBbB7@C@x?%B]B@@`AA?$BaF@BCuB~C5A~C1BMB:s?B,C@`AA?/iCl@]*CB i*CB CB*AoCH|?p*CƬB@`AA?~A/AlSnB,?fCnBFfC BIB1BIB?+nB^fC@`AA?IAB#A=]A,C~ACBC-wJACp ?AQB@`AA?0KC@9VBnB(9BnBCnB BnBz?wBQBA`AA?;BAτAcWEAPnAVEAAVEA~ AVEA>`A/CAA`AA?{B%@kBbdCعBbdCABbdC92BABq? wBldC A`AA?B@BC_BCנBC=A⎝Cw{?vBk C0A`AA? XB/.A\Bx+CqB+C"B+C0ACo?B+C@A`AA?gB@_B̶BB˶BC˶B"B˶B[{?B^BPA`AA?0BaAPAxlAAlA.BlA'AlAXL?[ABjA?pAA?B( @QBBBBٍCB6j&BBv?<;BׁB@pAA?B%@*B^ o(B?K?B$)B@pAA?3Ab(AAzKCoAKC0/?KClA+;AK ?*QAVLC@pAA?^Br@OBlB4ZBlB EBlBMA)oCvo?>JBxFlB@pAA:BBa@$B2B>BY2B]BZ2B |@V`CUr?BLK2B@pAA?GAe$AAGC-AGCT@;%ABA=%A/>AFCApAA?LB@BbCBaC>BaCoAB֘v?TB*CApAAD Bf@bBk>CABj>Cp?Bj>CBgA|Cz?@QB8C ApAA?qBn@ }ABA=01BABAAAl?vABrtA0ApAAGLB4A5cQB-B]~:B-B8B-BT?iC*h?]{QBK)B@ApAA?|JBe(A@ZB?A!IB?AA2B?A@'DCro?ZB>A?AA?,.B)A)B\C5BXC!r@XCރB] B_7`?2BtC@AA?!B+@B~C*B~CB~CRA.C2q?ɠBC@@AA?xB@)B%A[B%A:A%A6BPC8!s?BCA@AA?~B8@yB=yBpB6yBB6yBB6yBGj?[zBWxB@AA?*%BT@kB@9BB89BB89B?NCĮt?B!B@AA?BE2AeAAiٲAA;;AAx@TIC_?AXA@AA?fB AMB1AxDB2A]mB2A'brB2Ap?&MB֔AAAA?+B$@=hB7uC B6uC6B6uCA:C3{?BpCAAA?B@uBCBCyBC5B0BZ؝C#>z?YBC AAA?=An@?B> @2A @IB @4B @[(l? BC?AAA? /By9A$BC_AqB ChA CBB/Cmm?)BwC?AA?cAj,AdBCE6WBC`@CGBpBCY?eBC@AA?2B9NJ@#CC*BCYBCXAMCK$}?|C̍C@@AA?*B @)BȢBBȢBfBȢB&BȢB#x?BBhB@AA?tB@BBѩBBdABB[dAwC&x?QB6B@AA?LAb AJB?XCp?CXC: = BS? Bu<]?yfWC@AA?_MBY!AA"C͔A,CɬkB,CA,CX?AbC@AA?B:@.+B"CvB"CB"COB"C;u?*BCAA?}\A)ABAC[AC'%ABFAB>RAC?AA?=BjkA]BXCBXC6AXCzEAcBK?BQC@AA?B=ABݪC=BݪC6A!ClB!Cfo?B֪C@@AA?B~@AaA~C ]ACQAC uACC?bA֤C@AA?@AWAxaiAoC;VAoCYD@oC,3@B>`AjAC@@A?YBAB4CB4C!A4CAZ%7"?VB4C@A?DBA"B{zB/fB/A/j~?كB/rp4@A?2B@B4C7B4CB4C`@4C/?VB4C@A?FAa2AB|B tB4CA C4CQ?1B@A?!AAFB4Ci*̶A4CAA?B=E@BC1zBCCCBC?BCAA?s,BAкB+k]58B(k]5 B(k]5'?4C?(B_]5AAkhA%AbAeB4C*QB4C6A%7cB%7K3[?BdB4C@@?A?=CM@pCiB ChBlBhBFAH4}Crz?ICPB@?AYBr @CCBC?KA"CC"CSo?TCC@?A?9zBZ@BĠC(eBàC,pBàCPA C i?p~BC@?A_oA$.AB:kCBGkCx8B^B%C^BD3? BkC@?A(ChC?ChC[ͮChC=A~zRBP?qC}hC A?A?B@WNB C A>CBB>C )B>CtB?B?C0A?A?Bw@CcCCcCBcCTA1Cw?CC@A?A?KB@ BCMYBCBC&@Cr6n?c;B CPA?A?½CQ@*BEAEBxDA+CxDAtBxDAvy?B^DA`A?A?Y B,ABQB'BJB({AS4CBS4CZ?(BBpA?A?9E Cy]@z$CQCCXC1BXC7BC;{?Lh$CCA?A?\BHZ@CBB.BBlDCGAd?CjC;CjC%ICjC7ZAjC|?K>CC@@A?sA@8B`9C؏4B29C*_BBwBB]ɹ>#>BbC@@A?4A ,A~B*ȤCqvBFȤCACBCk?T̃B2C@@A?4Bښ@CGOBCONB8BPNBB(zC u? CcCB@@A?_cBi@SGB_B~9B`BvB`B+ACx>?X?B3`BA@A? C@yBQ@;B\@=%C\@B\@x?CcB>CR}fA>CB-A cc?DBO>C@A@A?rB|@&DBxyB"^FB~tBuB~tBdlB~tBBPBBPBrVBqCA@@A?ؾ+C@@h2CQC5i-CQCR%CQCg@lFB|?1C/C A@@A?Bj@tBCMBCqLBCBFBqu? BƈC0A@@A?wGB!/}@ěB/yCMB0yCB0yCx*A0yC m?ByC@A@@A?h/Bw@BHsCBZUsC +BZUsC BfU}Bjk?ךB,xsCPA@@A?ĔCy@C彮CQCZCe*CZCOPBZCJ{?{C,®C`A@@A?SBͣ@FBRGC1BeGCĬBfGCKAfGCYq?h(BGCpA@@A"B@a&BCha BC~ȑBC/BCnACA@A?ɟ%B:ABBqCBC^~ACA*NBUA?A BKC A@A?noB@UBA:C7TB4:CF@B4:COAb@ws?1Bb\:C0A@A??AB;ē@॰B̓Cx߱B̓CzC̓CB̓Cst?B[BC@A@A?g\Cr@C0BCMHBN CMHBT:ARCft{?C_ZBPA@A?sCy6^BsC*AtCdWB̙BKS?Y^BȸC`A@A?B&[@pBbC[BbCjBbC@D;Bltw?4BbCpA@A?vB2@:B%ZdB3BgZdBmBhZdBLgAiZdBX?{W;BLeBA@A?dB듬@:wBqA]BqABqAAqAx?ݎBGAA@A?ɰBj`@2BŲ{CPB²{CB²{CyB²{Cq?2B̦{C@@@A?0B忑@E=CLB CLBTBLB 3B,SCv?C,QB@@A?VC 7AF4B@@A:BR@3B/kBBqkB,BqkB~P)AqkBݨk?EBlBA@A? Chy@uCAC>A C A@A?7ZC)@TCBXTCB[ZCB@B}?iTCzB0A@A?=TCz@5CNBh7CNB|lCNBSBNBSy}? 6C:ENB@A@A?B@ A|-CGAy-CƅBy-C0By-C+?OAy-CPA@A?Ct@۸CjA CKA/CJA@;A{]|?CA`A@A?=BXļ@FBԂVCPB݂VCnB݂VCAi Bem?BVCpA@A?Bb@n.QB@IBN@qBP@AR@g?x{QB'Z@A@A?|B7)AhmBuzlC6_BkzlC#MAjzlC+BaBEkf?lB^UlCA@A?u{Bm@BDC_BBC-jOBBCACWw?ܲBVyC@@@A?KJC_N@0CKgC&)C6gC5eC6gC=pB6gC|?1CXfC@@A?`#Cz@p5C[,,C+CY+CCY+CAC.{?T4C,x+C@@A?mB@; BR5CBCƕtBCyAC0?W BC@@A?Bp@xC2|BjB |B3B |B@%sCMx?tCC}B@@A?A>'AfuABBABk.ABhC BBhCoZ>hA+DCA@A?#8C@t CvB_1CҕBUbCѕB)BѕB{? CBA@A?oF\C4@ZAhBA@A?9B.JA1BWNC!BbNC.AbNC`A A"S?(2BLNCA@A?B'0@%BCBCBCnBC:p?h%BC@@@A?1)C@?}@CB1J7C6 BÆC6 B BCC{?ACKB@@A?VB,)AG C`jBC nBhA!nBB[Co? CUpB@@AސC˔@(C{CNC{C6C{C#kB{Cx~?SC{C@@A?kB^n@+BB[BBgNBBJBL{Cx?B?B@@A?#ŝA=AYiB~CcB~C;N B BeyB B ?thB}CA@AVC@őiCסoCfCӡoCBCӡoC*BJnB˕}?FiC8oCA@A?Bߦ@TBxCSBxCCxCAxCt?BRC A@A?sB9A=:B=C)V@hB@eB!@~B!@DA@x?&B @PA@A?B @B%A{BABAIAANz?B;NA`A@A?c\B@ xFBby]C>B_y]CNU5B_y]Cm@z%B;W? GBj]CpA@A?D)B((AD^B]C6B]C8}@]CόB.CQl?߸B#qCA@A?fBUO@BVdEC BFdECǮBFdEC.YBFdECg?.B,EC@AA CД@CQ5CƅC5CaTC5ClB5Cy:~?-Cv5C@@AA?ᚐBz@jB1CWBFCBC@AA?wBA@:A\C AAA?iV CAVC^CCF^CD8CF^CpYBF^Cz?SCy]C0AAA? oBWAmAz A,ABA-eBBATABA^;?HAA@AAA?יBLw@5nBW CDBW CCW C#DBW CRw?TB, CPAAA?vsB+u@IBevB]CB5vBB6vBA$AkAEPC06?@ByAAAA?B$ȥ@lBqBzBcB CcBY%BcBw?7!BgBAAA?9-C^I@CA|C+ A3B/ ApBOCR{?M7C/iA AAA?@NA>JAB{jB\BYB@.|CYz(B.|C?BB0AAA?^B/@UBPnCԥBPnC BPnCZ\~A^BiBU\r??B/1nC@AAA?xA ABՙCBՙCANVBb]BNVB9>B$CPAAAKAA(AA%A=B`AAA?LOUBN-HA#B C&B CEVB C)iA Cd^?F$B CpAAA?VB˸@L*B:CB:CmfB:CKA:Cb??*B>:CAAA?C @7C87CIB87Ct"C87C<B87CDX~?3C7C@@ AA?TB8@K"CCC!CśB!C BB*Cz?&"CΜC@ AA?sB>@$B4CB4C CB4C*A??d?:Bwr4C@ AA?oBO՚@ƳB@!BX@O&BX@=AZ@prr?/Bq@@ AA?XiB@B/CB/C9B/C#A/C37?B//C@ AA?@C4@+B}B|B|BY'C|BD7B|BBv?rB BA AA?BW˽@B]B/BiBCiB:(BiBRu?BxBA AA?C,@‡BxsCBvsC 1CvsCBvsC5Ty?^BZvsC A AAtA$3A7BB=CHBB=Cl@zC&BzC?EBF>C0A AA?C@0AA? C @BCB䒚CMC䒚C CB䒚C@w?BXC@@0AA?3MA9Z4A>Ac,CRJA~,C4AXCV"BXCU>eAіC@0AA?^1C @\CdB+CzdB1?C{dB B{dB>@{?C}.B@0AA?09B'A[B@0AA?”1Cx@ZC^By^\C^^BQrC^^BQرBCy}?PZCZB@0AAC@8C`CCz[C?q0Cz[C*Bz[C){?gCYCA0AA?C@JB?CMBACCCACBAC] y?BCCA0AA?B|@BBBBBBVACpw?BB A0AA?As!&A rAȅrCArC@zB׎BzBI>6A[rC0A0AA?lA!A*BC,,CIBK,,C]%B&C3A A6B_BKg8B_BAWCkBWC^>Uj8BB@@AA?(Cog@YCM>CC?CEC?C\wB?C{?QCLC@@AA?UnA>6AnACFA9ՀCA?TBwOATB>AC@@AAMCܾ@CȞCCɞCCɞCKAp C{?@CɞC@@AA?-B8@!B03C.B/&3C(B/&3Cӗn4C>@C(CcC'CcCF>CcCAcC9v}?(CHcC A@AA?2A/Ae.BVB^'BVBjA՗C,uB՗C>.BmB0A@AA?;BS@WBfCBfCBfC0z;@fCx?{B]C@A@AA?BE@;BB_B_B`B C`BH B`B|?_B-tBPA@AA?,8Bd@B̥Cj>uBΥCBΥCcBΥCv?6MBC`A@AA?IH-BM5A" BڱBUB߱BVT!B߱B@ڱB a?jB•B@PAA?CW0z?,BbiC@APAA?煈B@hB>Bo>bBq>>cBs>nFf?87BA>PAPAA?8BB5ɫ@{BCRBCPBCDACض|?LB{C@`AA?v8Bv@BHBgBAB;BABun@ABDy?BS,B@@`AAB @C=BC=BsB=B($B@mcCy?CCA#>CS@Cb]AC >qAhC@`AA?VzC @lBtCjBtCACtC7BtC x?yvBxCA`AA?2QBo@A AU|CyjAI|C3AH|CJ+A"Bi>AANCA`AA?!Bf/AOGB%CVC]-C4"A]-C$~?.C1h-C0A`AA? AA58BCC|"BCCC]ABYBBS[*?'8B7C@A`AA?HB}MAjEBC BCACڦRAɅC@pAA?:vB@1TYBydC QBydCIBydCYzBydC:c?YBtdC@pAA?Brb@"uBz:CkBz:CjBz:C.>^@z2f?tB<:C@pAA?BI@B՞AzBԞAiLBԞAGAGCfr?kB%wAApAA?`BA}RBG@HBG@UBG@9o[@G@k?mQBbq@ApAA?TuwBI3"A庆Bg`CؓuBj`CE\Bj`Cq@2Bp?B!`C ApAA?ABF\@BA BABAAqECglx?vB|A0ApAA? B>@.laBWCNBWCBWC>PBWCDw?aBaC?AA?C]BkA%B#\BB\BPA\BB wCba?*B*B@@AA?{BJ@ JB@CBBB@CB@C:B@C%k?JB$AC@AA?B@0 C毊CC毊CB毊Cu}BBܳz?5 CC@AA3JBAB!OCAPB$OCAB$OC~EA$OC AU?7Bv&OC@AA?B@ĖBgC:'BeCޡBeC%AdCw?pBC@AA?cB u@"BBBBBBn'BBv7{?bBBAAA?`B7A/(A;B @uB}oAuBH?vBw> ATBAAA?͙BX@AB BIB$ B&B$ BKKB$ B}z?B2B?AA?iB@2\BMBRB1BC1BӖB1B/9t?[BDB@AA?0Bƍ@[BBT{C2֣BT{CuBT{CAT{Coz?BB0L{C@@AA?IBs@FI=BSޢBZ3BOޢB BOޢBBOޢBAp?=BѢB@AA?8BK'AYBYCBBYCA BB BEt?;BjYC@AA?҈B2@ByBByBKByBj0?yB+^t?"B aB@AA?C%B_Ay-BZ1C.B\1CpA\1C@bB-9W?-BB6C@AA?+BO1A^@&IC@ICAICTNOAICb`> @bICAAA?j+AAA&B˿FB;BFB@AFBAeCS?C&B'FB?AA?B<@]ԯBaJABxaJA+BzaJAAaJA%x?`~BaIA@AA?oR'B_;AA&B/A &BwB &B:|MA&B})?Aԍ&B@@AA? B@lyBBIBBVBBBBBwx?_B@B@AA?.'AA93BsB;!BZBAAC];GBC;?3Bk=B@AA?|BA@BJ[BBg[B]Bg[B]3An[BRx?B\B@@A?5A arA4@B@BJ?C@CxJ=@B@A?B@N[BBXuRBBrrCB8BB8}?{TBB@AEGAbAP\ACIAC5@BіAB>>BC@A?6JCeAJ-&CB&CBUEuCBH=BB?&CBAA?B@BBBB3BB AB?BBAA?&Cc@R!BB<+BB"]CBEBB?BB AA~BD@pWBBzBBqBBAB>?DBB0AA?B DAؐBCBCBCbAC[?ƱBC@AA?&BlAdsBC uBCABvBBN?@tBCPAA?BH)+ACBC.BC'BCAB=??BC`AA?+sA*AaA B]A B0SACcACx >f`A BpAA?kC4S@"CCJBC&CC0"BC?kCCAA?\By'A8vBChBC BCP9BC?uvBCAA?⌠AiTAABB|AB@CBC# ?BB@@?A?oBtAB,B Bx+BvTGBx+BAx+B7I0?1BT)B@?A?fBio@BOuCCͿBKOuC CKOuCL4BLOuC+u?.BXuC@?A~B+A3dBMB1B8B?(ΐCB'ΐCIR>[B)B@?A?|ltB@3Bw4FB+BCDBC!Bm!+C!BA!Bh;z?sCMB@A?A?8B]@>BgC{IBqC CqChAqCx?BrCPA?AxAo2AfGBB3HBB0aAC)BCS&?`JIB+B`A?ANBL@'BC2BCCCڞBC5u?āB1hCpA?A?sAI AɼA :ByA :BJc@.bCA.bCG>!A:BA?A?vAI@A4)0BAH/&BA7AA`BX7MCQO?0BTAA?A? VkBy@&B$fB]eB(fBkVB(fBg@ٕCq?TBqB@@@A?&Biw@+BqC|AlqC:BlqC"{BlqCF?[A>oC@@A?0COK@WC_GCcNCGCX C GCBAw|?*`YCCGC@@A?zEB* A@BSTC-wBBSTCwwABSTC"P9BMB'H?7BRTC@@A?tbB] @ކB3CB 3C:jpB 3C#݄@CK^?-4B 3C@@A?B@O&B CB&C9B&C@JCk?VBCA@A?[B-y@U*B$mX@mBivX@GrBjvX@a@a7C1xh?mBJz@A@A?!B^SAXƀA$C;C}A<%Cp@<%C@AwJ C>sA"C A@A?m4B'@`B %CC B %CKB %C&@ %CNe?౉B$C0A@A?h"Cȭ@'d(C BQ)C BC BiAyWC^|? (CB@A@A?ƨBC@@;B}4BzA|CdWv?ȕBBA@A?.oBe@0BCBCdBC@ACl?o0BC@@@@A?FBe{@B~CB ~C=C ~C($B ~Ce t?ʾB<C@@@A?iB0@BxCBC3BC=3BC O?A캚BCBC#JA$ BAB$ BNH?B C A@@A?gkBT@B\/0CdB^/0C9 A^/0C\BCr?B[90C0A@@A|xB!@PBu2C%B'CL@'CBCQp?BC@A@@A?B~@B 4CB#4C&B#4CXnA#4CuQp?^YB:4CPA@@A8BK8AWǫACHAuC@uC oAmBC]>LAcC`A@@A?)BFo'ADBQCP?BLC/ALCqA,BuC?ZEB ΎCpA@@A?JA.$A6A4TC7ӘA3TC^B@3TC|AB>uASCA@@AwA(AARzCH~ARzCܭOARzCE=@IBlX>EAzCA@@AB@&RB1yBB1yBB1yBT@1yB#z?-B%yB@@@A?C'Cܜ@pC}gB#CsgB->CsgB(p[BsgB? z?iC0.fB@@A?|bB@7|BxCZioBjCbBjCA]B<-P?x{BZC@@A?EC@ \ CC8CCu~CCyBCz?D C C@@A?Z1CÍ@MCOC+EC4C1|C4Cq2BiC|?MC!C@@A?OCoY@̒BBOBB8V6CB"BBv?oBBA@A?bB6@NnBpBiBBdBB_ABg?qnB1BA@A?NB@MBoCUBjCaBjCBCQr?=BѡC A@A?XCR\@Zy.C+YC/C+YC|C+YCeB+YC|?c.CSYC0A@A?7B~@0 BC+B'CӉUB'CGBΨCWqs?BC@A@A?бBТ@O^BB S_BiB)BhBHOBhBak?^BPBPA@A?Bg@ԪBMBBMBh CMB^AMB$z?VBNB`A@A?ؽ B0AvdB\CM[BhC%\@hCCB4ћCNB?reBXCpA@A?HB{AGAICLAIC4FBICAIC[:?0AICA@A?XQBV@BBMCBMCo=BMCLBMC;y?YBMCA@A?AY&Af(B/0C4B.0CGA.0CNEAkCR?(B0C@@@A?teC^@õCSCCC CC@BC~?LC C@@AtcCr@1C5ݣC89(CnCCnCBnCE|?~)2CC@@A?B@4C%YCC>KxCC>JfAC>S}?XCF> A@A?]CI^@Ƽ/CCp=1CC]ECCBCy}?/CC0A@A?ziBT ABP B B7JB:B;QB:BB[B@A@A?BB@]dBtqC[2eBYwqCBYwqC BYwqCQll?!&eBqCPA@A?Q6BKAFMBCKBCAC8A+CY?MBC`A@A?gBAAJBUԃCG|BPԃCͩBPԃCb/$APԃCTi?5gB+ƒCpA@A?Y[ZB`@bAmiA߀AniAwBniAJ7BniA)6?QAwnAA@A?CFA)2ABC@BCPACBBCBqB[?BnC@@@A?\BO@_C B~~CU B˦BW B*AjVC@w?+ Cu B@@A?i1BBA1#B|>CLB+X>CA+X>CA%AL6+?-#B>C@@A?\ BX?)A/BKGB(B!GB؝@!GBBGeC 6-?_,BCB@@A?B!@w$sBBxlBB>BBTAB 7i? tBB@@A?G`B @#B?=4B?YB?ɁA5Cg[?{?B9Ʒ?A@A?CXҝ@`CllB0`ColBQColB|iBplB}?J`CvBA@A?'KC~J@TCu1?VC0?BBbB@AACw@J0 CᔜCoCޔC/CޔCAݔCs{?< CڈC@AA?ĭBr@dBYAL?BAINBA/@SCEABAAA?8C@UC*~ C:Cs CiWCs C?Bs CLF|?BC$m CAAA?o#Cl@ECCtC~C;*C~CA~C{?sC~C AAA?mBF:AK BwRC BpRCy@mRC>B3AD%?!B~RC0AAA?xBZ!A^CBI@CX~BE@Ch\CBF@C3nANOAg?"B@C@AAA?X Bp@2BBUMBBBBtBBtY?HBABPAAA?>cByKA=B'C+?5Bz'C ZB{'C_A{'C87a?X=BC`AAA?i@B0AZB9?hB?Aɀ4CLBɀ4CQe?]B>pAAAȷA_A\1BCʔ!BC˫*A8C?LB8C>?1BC@ AA?UC~A VCrCNUCrCPCrC@B|?rTCiC@@ AA$BNASCAIB@ AA?QBvB@l/C C' 0C CA CTCHC[x?,0C; C@ AA?fBFF@QBw;BhB};BB};B|A{;B̒BRB@ AA?B-@B}\C"Bv\C+Bv\CJ,AX!B&x?'BL\C@ AA?[C: @B [5CBY5CJ'CY5C-KBY5C2y?BX5CA AAꞝB@ֈBCBC61 BC!B Cٲt? @BOCA AA?oVBA 2BCZ2BqC2BqCP= CDU?R1B֝C A AA?r0B \AꫂAJܡAfAݡA2AݡAڒ@ݡA3>eAפA0A AA?tBs Ac&BMICBLICЧeBLICALICK?3%BIC@A AA?BU8@ dBxOB [BxOBBxOBAxOBm?VdBOBPA AA?B;ӵ@\B.uCpB4uCyB4uCiA4uCuu?B1C`A AA?ȟBnFA\B#B̑B#BXB$BA`UCd*s?YBB@0AA?B@*B0oC+BNoCBNoC$RANoC U?y)B\oC@@0AA? C~@/C&gC:1CgCeܤBgC瘽B`NB.{?K0CgC@0AA?JBY@*BpB>BBǎBBUBC4v?{B!B@0AA?1C@/>CbLCaR?CEC2 CECdA.C] }?>CE?C@0AA?mB\!AeOBCOB|C k?B|Cͬ@B|W?OB |C@0AA?1Cٌ@&CC1Y'C]CC\CADCg|?c&C\CA0AA?%C@dSBCmuBC&QXCC,BC9{?BfCA0AA??C@C+C@C)CMB)CSBRC|?ǒCҚC A0AA?B@ͬ^BۮB$VBЮBnBЮBbAЮBYa? I_BB0A0AA?Bv@B7CĩB7C'B7C+B,BJAr?BQ1C@A0AA?!A3DAI`B=ChNTB=Cع?=CNBCܷ[?`BCPA0AAȱBWU@FBCBCCBCў@CWy?lBC`A0AA?GGB}/A3vB"C#bB"CB"CAC p?{vB "C?@AA?:C@@|'CoB(CnBüBnBBoC{?((CČnB@@AA?xBrA}>B|C?BΒCvdBΒCAΒC-X?n?B C@@@AAе0B&A:B1?CU;B?CA?C^AX;Ai>?D:Br?C@@AA?Bc@BBBB(BB~A<0C/u?BB@@AAB@|\BkCB$kCB$kC@4kCw?BkC@@AA?MB;I@B>A&B>AvB>A ?JCt?ϱB3A@@AA?Cź@/1C5'C'C5'C3ZB5'C5BӚCu|? CS'CA@AA?ACi@CxCsCxCPCxC^@C0`|?CCA@AA?p/B}@ݤBBTBsBzBsBJBqBr?BpB A@AA?ƕB0+@eBsCEQB}C`B}CA?]CVm?щBnC0A@AALB@MFB=BB=B-B=BA=B}z?fB,>B@A@AA?7 A2A4B#ADBAgUAMC-TBMCe&?25BWzAPA@AA?zB+iA-B#CňB#CB#CF@#CFw?hBR)C@PAA? Cˇ@ CICu. CqICؿ CqIC@A;{? C IC@@PAA?t^B@XWB zBWBRcBCRcBv(BRcBn?VBB@PAA?"JB@lBjC3BdCpBdC7,@MBUm?BB |C@PAA?]C@!B龮CgB뾮C#B뾮C?龮C{?pBŮC@PAA?AD-ABء0CpBϡ0CAPC2=BPC?BB~0C@PAA?zB\ABFCYBFCCFC(ؐBFCs?B8CAPAA?3?_B%A6AB͏B xB͏B B͏B(A{C8y^?,B#BAPAA?;(Bz@BXA(B_AB_A@NSCPu?aBcA APAA?_B@d%BtC+BtCBtC6ׄAہB|?S5BtC0APAA?A!A2OBėC6BėC#KAB}iBB":??&OBC@APAA?!B`A0;BjnC)BjnC@AjnC~AiBZ?R;BknC@`AA?qmB2I@KBTMCeJBGMC]BFMC)@EMCd?.KB;MC@@`AA?} C<@,C_GBCiGBCgGB2AYGB{?8CHB@`AA?OWB6@VBHASBHA#BHA?A)RC^_?5WBA@`AA?B%>@9 BHC@1B7CB7CKB7Cb? BiC@`AA? 7A;A :BsC-3BsCOABgBB?9BXvC@`AA?B@;UBCK\BC~BCΘACv?kBSCA`AA?&BD5@'B-'/C?B2'/CZVB2'/C(ACz?Bn7/CA`AA?3LBAuBӂ C?=Bւ CkgAԂ CFYBkCh?LB C A`AA?Bא@Y`B|,CAB|,CȗC|,CB|,CO?y? RBd,C0A`AA?{BAnBCBCAC&sB]ئCx?BC?pAA?kBu&*AߝB%=CB%=CB%=C.9dA&=C"o?@B=C@@pAA?'B@FnBӟC\dBӟC~BӟC BӟCRm?HnBΟC@pAA?B @BBmDB8~BWDB["CWDBQ(BWDBr?3BB@pAA?>B:A$ߍB8@qB8@zA8@NB%6CEc?|B5@@pAA?;CB"A5ڦAr}CeAd}CW8Bd}CfIAd}C-?gA}C@pAA?cB@ȀB3DC|sB?DC%B>DC A>DCwv?BECApAA?B@"SB.GaC2B3GaCӣB3GaC{A5BRuz?mBUWaCApAA?hA HABzCnBzC+ACBCZO?B4C ApAA?BPAEGB sB6B sBB sB,AB sB0s?GBVsB?AA?B$*A|FA5-C>AG-Cs AG-CQ?ݰC兤>XHA[-C@AA?EB@B'AUB\A^C\AB^AGy?BȅA@@AA?=B@BzE CYB|E C%B|E C@"Cas?>xBL C@AA?uDjB A&B3KBB$KB#B$KBXA$KB+h?fq&BB@AA?1CB{ AсBdzCھqBezCAezCܑA܍B0 o?BzC@AA?NA*AiA%CQACb@CJ@ WCn8>|hAsuC@AA?jSB&͹@0BwCBwC)BwC @B|?BtCAAA?UFBL4AB\BhB\Bn?\B aBp=kC e? 8BqL\B?AA?jBKAaBABA"BA+n@$MCv?#DBA@AA?T;BDd A|AQțCe)AGțCDBGțCvAFțCȑL?FAC@@AA?ߵB1@HBUBBSB!BSBc@XBz?B[B@AA?aB9@}sBC:WBCBCOACp?sBC@AA?SBÔ@IBCCFBCCXBCCcACNz?P`BB=C@AA?yBAqBC BCBC6BC`k?BC?AA?Az`"Af\:A*;RC.)A:RCſ@:RCo@A?>Ol9ApQC@AA?6mB|AGB @u 6Bʏ@Bˏ@ߢA͏@uep?E HBs@@@AA?8HCA@CC6BCCC#,AC)~?CC@@B?RlBtQ@QC3CABXBV@>CCdBVB4C?|CAB+BAC6'Ch6Bg6L,B4C?OC6 AB?B%A"hB3CnjB3C'B3C0h[B3C! ?qiB3C0AB?[B3u^A^A6`A6 /B6@A6?۴A6@AB?*Ci@BёBCJfvCCaCC?BCPAB Ao]AV.BK65-BK6Ȣ@4Cn HB4C^4?/BRqK6pAB? AЄLA"A4CA4C@:*7^A9*7>ӭA4CAB?y4Bư@B4C2B4C6B4C%A4C?B4C@@?B?SBky@B ȊBgB5jB 7A5yCB5yC$d?1Ba B@?Bü1CtE@lBJCBTC?tCTCCTCw?[BYC@?B?C-@uB+UCՀB4CC4C,jB4CMy? BtC@?B?C@eBaC BjaC CjaCJlXBiaC)y?#BFaC@?B?>+.C[{@ҜDCC ?CCCCB CO}?!xDCCA?B?-AICpA?B?m^B AB#C:B#CA#C)B؎BKq?5BCA?B?[2B'AqBB+C/BB+CwBB+C@B+C)O?B$+C@@@B?3dC+=@#dCвCG;XC2ƲC@lC2ƲC-A2ƲC}? dCᾲC@@B?|CR@3B~Ci`Bn~C "Cm~C[9Bl~C~w?B~C@@B?AB.&Ac- B{C%B:éC4@tCF!BtC[>& B:C@@B?]BNT@CVBx(BVBdBVBTHAUC5z?bC\B@@B?aBq AvMBDC BxCBxCBC>_?ۅBCA@B?.B8A"BHRC=xB RC* @uASB^A9?B0QCA@B?3B@aB/cC"TB4cC!z8B4cCB̌Bht?O BVsC A@B?&B@ XBM+BKZB'BB'BONA'Bmd?YB8B0A@B?(B AA5BB5BfBuBfBbBfB`[?35B5B@A@B?YBp[@JB4CfB>CB>Ce: A\Bx?ViB;CPA@B?CCh@zCBCB?%CBw BB!{?C.'B`A@B?yBlW@kBGCBHCyBHC!AHC.r?"ћB0XCpA@B?WAkAb}AneCפAjeC C@ieCuAAFB#>AqeCA@B?\}_B\A $nB$xCdRB"xCJB"xCz?J2B˙l?mBxC@@@@B?l`B2%@BCB~CB~C6B~CSN?B }C@@@B?BGS@'~BC:BbCBbCOAbCg?BC@@@B?.BAq@VB]B B~BpB}BK@xBp?BwKB@@@B?/B*A==B_Bom8B_BoA_BjACqC?o=ByB@@@B7BBR@|B}uBIwB}uBB}uB)B}uB}j?:BrBA@@B?Br@BـC>BـCăBـC[rAngBm?BƳCA@@B?aBgA]B.CDBͿ.C/BͿ.C@Ϳ.C6? B.C A@@BBq@LϖBݲBLɗBYײBBYײB|BYײBhr?ǃBòB0A@@B?+B^;@]iC/ϣCpCCBCXxAZCy?CFC@A@@B?mBd@\MBB+xBBޫBBABao?@BPRBPA@@B?rB|7@vBCBCBCBC iY?BbC`A@@B#|AB7A+BB^oBB7AC+BC@L?_BBpA@@B?}kBT@&B`(AB`(A.B`(A B`(ASj?B((AA@@B?iB @iBLлAwBUлA'BUлAA zKC`x?rBwA@@@B?XB@yBC:BC,UBCϒAC: r?eBtC@@B?BRE@>BAթCBZҩClBZҩCç@C{if?BfȩC@@B?B@CMWCgC]WCyixB]WCBC-Fy?CٓC@@B?R`B2P@'B {CHiB${C=A${C(BFB~]j?_Bn{C@@B?ЬAC@@@B?C;d@q$C C@CC'CC?֪ABZ{?#C6ŎC@@B?Cgr@ CyCXCyCCyC?yCL{? C/_C@@B?xB>@$ CC(CƣCBƣCgˋBBy?  CC@@B?BA@eC*vC2C(vCMvB(vC>BNvB w?nCvC@@B?\B@^BFbCBQbCICQbCakBQbC?s?BLCA@B?B@@hBC@A@B?{~BT@WbB;2CzB52C%'B52C BYCbo?.B2CPA@B?pBK@>BChBCyBC6IBCko?"BC`A@B?+BkS3AdVB#&BrvMB&&B鮳A&&B=ATC[?&dVB+2BpA@B?BDj@NB%B:B(B5B(BٍHB(BMr?WNBBA@B?LB(A!eB$B(^PB$B-B$B A#!]Co?dBj$B@@@B?wvC}@ C C[g C CM4C C* A CI{?9C C@@B?-/Ce@/CC C51C C CC Cqf3B CA|?LCc C@@B?%By6@BCC/BCCLBCC-tAM$Cu?FBKC@@B?B@CCCC;BCB;:Bw?nCC@@B?5C@(CfAaCfA)\CfAiBfA7z?%%CAA@B? C@]'BnC5BnCCCnCBnC(t?B;CA@B?)BD@:B{?C@`tC@@@B?R:Cn}@:CíCD5CǭCF:CǭCR@ͭC?|?6;C{C@@B?Y-xB1@MB,B IBB[TBBD-@B{U?!$LBqHB@@B?HBqB@hBAB@Ab.BAAiB<=Cko?I%BqA@@B?J"C@CdCFYCWC9CWC]BWCAy?C?C@@B& Cq@BB#B(BC(B$A'BExy?KBbBA@B?ECwv@HCS?EJC@?C@?B@?/~?guIC?A@BfBs @&60BQB31BSBcC~SBfB~SBee?71B?&SB A@B?$BϥANCiG?BtC@AB?C@gUBCCbQBCC$CCC1BCC?>y?fBCC@@AB?CZC@XC9CC|CVC9CC[C9CC܆@9CC_}? XCCC@AB?r>B@TBm(CXQTBcm(CVBcm(CTIiBcm(CDNc?UB'C@AB?A4Cd@CCCCJBCCP BC>`{?CC@AB?֗B@aB*C)B*CdB*C!aB|Clt?RB0C@ABlcCT@> C+ǻB4"CoBLCoBbA\C(|?8a!C BAAB?=Ce6@uB¬C@B>C3~C>CLC>CJ{?pPB CAAB?ӢB@BBnB4B@B4B&@+B˅x?BB AABOBABABtA45BpA^@PCq?BUA0AABaAS9A_AޚC2AʚC?A@ʚCOWAe͡C*>.d~BNO?1B/sCPAAB?A(AJ=B C B C2A COʺA۞CV>?B C`AAB?/A.AŧAѸHCAŸHC] ? ƥAhA"ƥAK >ߨAޏHCpAAB?;.B/+A>ZoBdAK[B8dAw+A8dAkAKBC7l?5oBFScA@AB?:C*ȵ@.C<CdC8C)VC8C_R}B8CG>{?C C@@AB?8%C(h@!BDCZBPC)&CPC1BOCx?MBC@AB?t BNAϨBsCǭB{C@ABBBL? BC@AB?@B7AuB.iCdwB.iCA@/TBn5AHC0AAB?H/BD@ϠBHB BYBLBYBp?gB%Ak?yBFSB@AAB? C@`BZſBVBWſBmCWſB ?BWſB{?BBPAAB? B*>A4iB _C둂B _C @ ,BґB,B b?ЧBj_C`AAB?~UdB[k@BHCwBHCZBHCUB`Cu?"̝B<C@ AB?GB@nB<6SBB5SBtB5SBAAzhC]j?,BQB@@ AB?CDR@,&CC'CCACCzAB%<|?%CC@ AB?QCl@ CeCCveC;6/CveC49BveC%{?C8eC@ AB?>CǍ@ 2C}B3C}BCC}BA}B}?D3C}B@ AB?EB2@!B:XBBCYBy2eBDYB&fJAPljCh?yBYB@ AB?,BUEAaBYBјBQB@CBCe[?B-BA AB?F"B:^A-BR6 BB/6 BA06 B5 A \C.?ʦBBA AB? XC@CHjC#CHjC͹B HjC4@[ YBIw{?CTjC A AB?42B0)A£BgCCFBWCC=w@5{AQBg{AA\?BCC0A AB?RB@Bf)CBf)CyCf)CʘfBf)Cy?B+C@A ABB@BB"ҚBB BB)BBz?[֤BBPA AB?(:BSGAeBCmKBC6AC#ArCb?eB[C`A AB?@(AF1A*BWXCqBMXC$@NXC_B2)B:T?+BXC@0AB?BxA[ACv`A?C6A?C RAC->AC@@0AB?b5B@]vBnC+*B CBC>١C?Nu?BC@0AB?>9C1@ C݌(Co CH(CcCH(C\BH(C{?] CI(C@0AB?vBA@:DBՈCdCBCҒBClBCi?AB@C@0AB?CbBu>A28BC8BCCBC-@CW?97B.AaCA0AB?;C"Ø@ B[ͭCBYͭC7CYͭCBZͭCX{?;B`ȭCA0AB?B@ zB$xCpB xCB!xCA"xCЈh?zBixC A0AB?]ҚBJ@/nB?Bu?\Bx? xB#5CQu?QB?0A0AB?&l|BKALB^CB^CtWB^CIA^Ct?cBvC@A0AB?Bd@UB6CB6CB6C@hc=@|bz?J[B`6CPA0AB?raBWA݋B0]B B0]BIA0]B-GALkC%M?VBN\]B?@AB?JB@eBBtBeBLBeBEQ6AeىC6Mp?BvB@@AB?1C@BCBC@0CCBCy?iBC@@@AB?rBL`A[PB;CB CvB CԽ8B%,Bv?4BC@@AB?\BR,@KB&(C*LB(C|ٵB(CΙB(C gh?t"KBFC@@AB?Bk@>B buBBauB BauBeFAXqCy?L'BuB@@ABlB*@cB wBBwB xBwB @ݖCz?pBewC!q?< BB@PAB?KB@CoKCChKCuBhKC2*mB8A^t{? CXKC@PAB?)BA,:B` C5BL C AL CAC(C?\:B s C@PAB?h|eBd AeHBACr@BFC9BFC?BR?v HBϗC@PAB?ӋB@BC8 BCBC1DBCkY?mBњCAPAB?&C@F9C C. CCCC@ACC}?#CCAPAB?%B$dDANB^xBABxBYAxBArCa?OOBxB APAB?C ABl7C*Bl7Cx7Cl7C֜Bl7C+|??B67C0APAB?B@BLCDBLC^RBLC4@BAx?sBLC@`AB?~BjA@3JBݭC(DBޭCCVuBޭCrCAޭCM]?JBmC@@`AB?ToVCL.@4C0ݧCI-C0ݧCTzC0ݧC%#B1ݧCB&}?4C{ާC@`AB?T}BAjB˅CaB˅CD]B˅Cv?:,Ba?jBbʅC@`AB?I"B!1AsBiuBrjBXuBe AWuBGBzC7T?-'tB6B@`AB?B@BMBmBMBXBMBػAyӒCs?B43B@`AB?LyBB?@5UB CTrJB C/C C4 B Cv?eUBs CA`AB B>A`(BCiBCWACLJAOCvR?'BCA`AB?DJBpoAFBqn>B&0Bn>B6:Bn>B!@n>B7Pe?FB>B A`AB?gB` A^B{MB`ByMBL-ByMBA@_SCŏy?BkBB?pAB?BiCAȶCBi;BB*vBB`&BC'x?C/B@pABB9F@B CjBC%BC-kAC :z?NB)C@@pAB?J)B2@`mB%CcB&CB%C6{B%C/B<:AΉB<:Aho?OBm6A@@AB?g Bo@NAZB]ZA= BZAhAZAGAQkHCBD?BA@AB?A&AAx C Ax CB{@x C4AhCW3?A C@AB?q!B/5ALBBDD5BB׿ABA셃C'6[?LBm&B@AB?NAA"PA&C`A'&C7?C8AC>ҕAL&C@AB?; B*AA]EB+%QC[5B+%QClhA+%QCiZAQ)A^?]FB%QCAB?=B@LBCvBCBCAC?kBC?ABrB6ABaC%BaCgJBaC_A6B^r?dUB'aC@AB?MBA{"goBC@B?B{AoABjAB*@BACЊ>RGAB@B? aCA@/CB?r.CBӉCBiBB?6.CBAB?>C@j(CB)CBBB(7BC?X)CBAB?6'BF@b'CC(CCPBCCB?hP'CC AB?&BAErQBBRBB6ABlBCȷR?QBB0AB?A(8OA3rACTsACt ABd4AB4>"vAC@AB?ȢBA&j;BC8r:BC8BCBC?Jg9BCPAB?-zA3AACsACAB )BBd>AC`AB?MBz@օBCj&BC6kBC`&bAC?BCpAB?BI@qCBBCL)}?=HJCn`A@?BFB'R@]BC>ACȪBCE@Cw1?_BPC@?B?ڀCt@9-{C!.C vC!.CC!.CɝA!.C47~?q{C:.C@?B? Cc@7=B&BWaB'Ba=C'BlbB'Bs?rB?BA?B?mP C@C~CİC~CfC~CSm@~Cx?&CnCA?B?6 C|@CwgXC.&CeXCBeXCJDBBy{?!CFXC A?BJ`AaA|WC@@@BhTB@;B CzB CBB CA COm? B)3 C@@B?zCCSGN@qB=f|CbB=f|C!?C=f|CMB=BABAAAv?BcAA@B?ЩBAmBKC!B0tKC=XB0tKCDA0tKCMN?B+KC A@B?|C:@^yC,B+CBRrCB /@B Z{?^C^B0A@B?PB."AWB"YB WBfYB: BeYB'AZGjC Y?0VBb)ZB@A@B?m B TZA t @&B,,B>BP,B/BP,BAU,Bu?B-B`A@BmA2*A.B B@&B B-@‘C1B‘C8?.B BpA@BA N(AĔ;B܉wC'BۉwCڝ@BA,;BBŁB|bC̛BubCŊLBtbCGAԙ:Bo?MDBbCPA@@B?ĉBE@WQB@,@îBn+@YSBo+@YA\:C%rj?B-@`A@@B٢Bz@aBSCBZCBZCAZC~z?1B֏CpA@@BBK3A:ACACuACi5AB &?A#CA@@B?%B 3A}B[BOqNCIBZqNCzsAZqNCN B̊Avf?N[BNC@@@B?}5B [CA +BJC)&BJCAJCA"*ByK9?0BC@@B?uB @yB'Z\CB Z\CtAZ\CڵdB h!B}j?tB [C@@B?HGB^ABCrrBC~@oAC[BB،Y?̎BT2C@@B?wPB'5AaAnC-.AoCε@oCtAɷC >AC@@B?_XBc<AEC_CC_C>T?_CC/Br?CL_CA@B?8fkC@MCCBPDCBCBBB}? CCBA@B? B*L@BrY#CUBG#Cv9BG#C|#A裫C[r?ٹB?#C A@B?'qB~ A#qBA|rBaAq)6BcA+,rA cQCea?rBA0A@B?krA&?AVA_(CRVAj(C\ @j(C;#3AP,C'>(WAnRC@A@B?ˇBGCAW3B@B@FVB!@ A;C|j?yB2@PA@B?10BDOA"BjCBӳjC@AӳjC1PAIZBCEZBFAEZBy|?)*CBA@B?9Cy@`RCI%C TCB+%CvCC+%C|_BC4}? RCGV%CA@B?t!C+@]CC{CCKCC? ?C0{?fCYC A@B?fC7a@ /CP(B/C;U(B C;U(BBO^C|?R/Cn(B0A@B?8BD1AUBTC)sTBTCn6ATCAHCsX?QUBGC@A@B??B@kBABA2̬BAABECv?"Bd2APA@B?$Bz:A?MAWCx{EAXCAEAXC@XCz >7MAC`A@B?GsB@bBCBzNBOB)BPBoBCVu?FBp6BpA@B? B>A֣B>C'B>C@?>CB\B l?ףBp>C@@@B?ģ8CyG@)BC?=C$C8=CWC8=CB8=C{?C{=C@@B?BS@iBKCjBKC]BKCVAKCvt?9By-C@@B?!B58AE,A'7C,AT(7CO@T(7C AJ@;K0>eA9C@@B?B@"B]Cc:B]CvB]CۗDB&B?v?"\B{]C@@B?/CX@CC:YCIEC:YCJC:YCK-C:YCM~?+DC9YCA@B?AKA&Bg\CC$BCCo@NxAB*BNxA ? BCCA@BqB@aBXܵABMABNA5M?ŁAii?g/BrA A@B?"C1b@MB>CTC $4C>CnB>Cc{?oB >C0A@B?/BF@BC BC\CCᯚBCvv?iBC@A@B?;YBkWA4cnAщ8BeA݉8BA݉8BH~A݉8B+>/ynAI8BPA@B?DC J@ZBVC2BVCCVC}WA VCu|?EB-VC`A@B?qB @sMBC՜7BC?BCUġACY3m?MBACpA@B?~3BhYAiBeC6BeC5AeC3sB_GBWn?BeC@@B?UB@ C„CCC6BCAv Cx?eCjC@@@B?iBwAB7³BTáB³BB&C³BbMB³BYp?BB@@B?ӴB[@T2CnwACAwADB@wAdBHC5x?SCeťA@@B?BJ@JnjBoCBfCbBfCcA!Czg?g]B֪C@@B?2Bz@BB]CXBx]C5Bx]C&q@t]Cw?'B]C@@B?s CG$@QBCBkC#CkC~BkC!@x?ObBCA@B?ԌC˾@gnCA%oCAfCAhOBAx~?nCNAA@B?*/Cv@C"EVC\UCEVC3@CEVC\sB EVC#|? C58VC A@B?IqCJ@ NCCLCC9CCBCY~?%ONCC0A@B?sCa@J)C$B#C$BC$B>A?ICx{?)C B@A@B?gC@qRJC&]CBC#]C:C#]C B"]Cb~?BJCOCPA@B? BDZ@{BCDBCPCCSsRBCT{?ڮBC`A@B?>DBd@QB$B}:BBR*BBW@yC3h?QBsB@AB?GlB@BYCB^CUA^C8BaC{_?BC@@AB?ڀB@BBAJBAZAATBNCo?hBA@AB?^!C @CACC8Cķ6C8CѓCB8C,{?-CC@AB?gCڕ@I7ChCS=9C$hCvC"hC1B!hC}?W7ChC@AB?ⳭB9@yBBBBBB B~CTs?BB@AB?#C!@ShCBvCBB9CBBKBBBE{?gC BAAB?cCCh@ 2CCJd3CC\NPCCPACk}?3CCAAB?(C@BC8ByC%HCyCByCv{?BkC AAB?O+BL/ABC BC^@C"BaBwY?nB^C0AAB?BA0hBjCz_BjCɠBjC0AjC-kh?hBCC@AAB?rB@?SB^zC@AB?QC@Ǵ_CTC`CTC8 @CTCB=2C ~?`CVCAAB?!Cw@!CbCR!CbC pCbC}8@-0Co}?R"C6`CAAB?e9BMA(BCTBBCTB|ACTB@iCv;?B9SB AAB?.Bq1ABrCwBpCȷ@pCyBZ CW?qIBsC0AAB?C@ BfCBfCh=CfC8~BfC`|?BgC@AAB?xA=AJA3CoA3C*@g,C./ Bg,C?xAAVCPAAB?EbA.AhٱABAjB@eBQ}AZCS>I}AB@ AB?LBS@QBCBCxBCk BC,_u??BC@@ AB?Bm@3[BBEBoBdBpBU?BgXCs?BB@ ABBq@\Bc$C)B'CB'CAA'C u?B(C@ AB?#Cʃ@Z Cɓ4C YCu4CBu4C϶ABt?sM{?C!Z4C@ AB?΄BrZ@)HBABFAXBFA'sBGA[?BdڱA@ AB<=AAfBmCeBmC/ApfBBpfB&? AKyCBKyC.>NA\ɊB A ABwBa.4AesB0CiB 0CoYB 0CȀ@ICi? rB0C0A AB?mB^H@BB\BB BBjBCx?QB.B@A AB@%B>`AbyB^1sC6\B\1sC1A\1sC@zBp|B]?o.yB5/sCPA AB?B^zAYB$BnB$B{B$B@0ICMw?JBB@@0AB?_B!AdBoCZB5rC2zB5rCA6rCj?巀B2}C@0AB?XC+@sBCDC@BCDCmkCDC5"BDCZ}?BCVEC@0AB?S;B8,A(_BrC^BxC?wCbXB#C YK?_BڤC@0AB?P1A2AcG(BC&BC@fB?D?BfBK$?5(B*C@0AB?!Co@&MBCS>BCJCCeBCx?BCA0AB?A;KA> B'CBECr74@ÚC\BÚC?W BCA0AB?%B,@ddB*CC[B2CB2Ce1B2CLp?VdBC A0AB?:5BY'AlTB8pB+IB pBeB pBhA $pCh?TB6pB0A0AB?]B0!5A)KBK{C2 BN{Cߪ BN{CoB4B^n?VB {C@A0AB?DA=AC@@@AB?HBAB"BC~B"BC1nB"BC\B"BCQr?{}BAC@@AB?FB V8A$BUCWBUC;ּAUC9T!Bj6Bwa?܁BUC@@AB?p~A9(AAC`AC|%AC\BCn>AmC@@AB?T B\AJ#A6PByA6PB`@6PBAA hC2t> A*NB@@AB?l6B.mHACB_B;BBBABPA):YC J?CBBA@AB?TXB@ՓBCzBCExBCMBC4v?&BCA@AB?:BI@BCBCBCACz?<BC A@ABB@CC[CCVpBC(XB Ce|?CC0A@AB?V*BOIAuBcC^BeCAeCBFCg?vBC?PAB?KA< AiABCABC*o.AanA>BanAEY>bA CC@PAB?eB^@ sBC]0mBCY&BCAvpC`? uB!C@@PAB?ZB@ BBC=GBC%̖BCANJCQq?B}C@PAB?4^B@E3|B,C?rB,C䶏B,C4A,C~g?|B*C@PAB?eBZ@|BރBmBރBBރB7qAރBq?BB@PAB?_BAK;BC3BCXBC$FBC i?x:BŎC@PAB?1B+@B9sCB9sC;B9sC-. A9sC{?JB?sCAPAB?$B^A=Bi4@8.Bn4@:Aj4@*< B6CK?Y>B)E@APAB?^Af,AaA%fCA%fC:@%fCAHB-R ?AxZfC APAB?XB/J6AyAlCTAlCAlC@@Bh;?`AlC?`AB?B;@GB8-CשB8-C:B8-CGA8-C,x?B!J-C@`AB?|B?@BACBBACQBACAJ[YAhty?BAC@@`AB?/B@nB5tArB6tAvB 6tAF^AaCCC t?BuA@`AB?BJ@BotCYBltC'BltCq>AjtCz?BDtC@`AB}B@;mB ?JBZ?[BX?DAQ?;w?^;Bf!@?@`AB?OAN?AnA|*CA*CJA*C'AU$C?mA^JC@`AB?B'PA8BCNzBC}ִAC=<8A֚CA?BCA`AB?FB;A0B;d%C#B3d%C:Q=B3d%Cm@3d%C_?G"1BH%CA`AB?+B;1A#BiBBiBBiBt?iBb?#Bg/B?pAB?jHBkA56B"ZC!4-B&ZC1!A'ZCBpB)J?h6BîZC@pAB?gC͏@qC+B=lB+B" C+B6A+B}?C-B@@pAB?B&A;BS(C4ΎBU(CaWBU(C lAQBwu?Bk/C@pAB?B^@2BҳCBγCxwBγC膩AγC #y?uRBC@pAB?aBI:A8BEiCֶBEiCrCmBEiCiBUBv?2BZ>iC@pAB?\A[X5A1!B1›C<B.›CMA.›CA\CԟA?(!BC@pABFBK@,BCTHBC+BC AC9{?&BfC?AB?~8Bx AJBIBC AIBCj9BIBC[AIBCjsP?B+BC@AB?,5B\A1@mBAuRBAAACAPC9a?lBA@@AB?!B*5AxBCs^BCgAC?BGBe?kmyBC@AB?;A'$At3BπCM"BπC67@πCA:B>B7L?Jz3BUӀC@AB?3FB2AHXB4B EBFB\(BFB@R>Cl?kXB7BAB?TB^MAAB?ݿABdBBCABac?E#AB@@B?b>Av=AR:B4C 6B4CBGA#7USB#7>n?B4C@BmCI@@C\CCMCCBC?6CC@B?"C@AzC3CBC3C S'C3C`A3C?C3C@Bu-ByǔAَA4CA4CA4CH A%7->xA4C@B.(C@c3"C6.6a#C2.6RݹB2.6B4C?rG"C.6AB?BA* B4C9c B4CA4C.A"7;(?\ B4CABk#C@z-C-CI1CI1 IA4C?-CsX1 AB?B$A{BoNBpCrB?QB0AB?6AٔSA?cAK 7\AJ 7 A4C B4C"ɸ>RAr7PAB?ҡA~AOLA4C+A4C`?4CeA%75>xA4C`AB?ũApLAp\B4CsKB4CcYA%7LB%7`?\B4CpAB?hAYBAzAAC̏AC@}?4C?"AC@@?B?tBy@=B5A:B7A'C7A B7AVr?7BEA@?B?2B0_@B CBCCC}BCWav?3BeC@?B?C"@ˎBCeBC9CC BCt?ϭBPC@?B?1+BH@& B˰CX B˰CB˰CU~B˰CJ?BC@?B?^DBz(A3..BoBQ{/BoBAoB2jAC>?yC0B:BA?B?~&C@IC%B CB)CBABJ|?HCBA?B?ԧB@B CBDKCi0BDKCBDKCD?BPC A?B?B/@ CC)C CC)CׂBC)C/=BΡCy?] C\])C@A?B?JEB@(BiuC BpuCBpuC0ABp?ƱBduCPA?B?2B>BApBCgB Cp? CJ_BuCT?pBC`A?B?tWBr@6Bp{COBs{CBs{CkBs{Cn?EBSCpA?B?` B'=A&BN. BsB\. BAZ. Bpz*AVC}I?YmB^ B@@@B?HB@B܆AbB܆AB܆A!BDC w?BA@@B?CuW@RBCBCU5CC/BCpw?:BwC@@B?vB}@BBb*C¹Brb*C9Crb*CBrb*Ceq?÷B %*C@@B?B7@qC!ԻBLC:ԻBNA:ԻBCCBw?C8B@@B?lB @VLBCBC; CCpBCw?BᴋCA@B?F"B@DCQCcCA9CM:B@9CkBrCCv?@Ct7C A@B? B3AgBeCզBhCـARC BRCI^?BOC0A@B? 0B.@XBUCBUC 8BUC:@L.Caz?BRC@A@B?#x B&AhBPA@B?&B?SABn,BWBn,B!z@n,BitB_C Ca?BY,B`A@BB ?u@Bz`tC:B|`tCmB|`tCgAz`tC+|?BctCpA@B?BAB{BB{BkGB{BAVC)v? BveB@@@@B?!B?@ CBo CB:MBBG[dBC}qx?h CbB@@@B?cܞAbSA3B\CȌB\CċB_C&C_CV-?1B jC@@@B?YܤB\9@&BNJCBC3BDC?[CDCaBDC2{?QBJC A@@B? Bg@|=B7tBb=BC7tBpBD7tBt4BD7tBXg?>BosB0A@@B?A%-ABTfqC<BOfqCA6uBD8B:uB ?BQqC@A@@B?9NB @PBrCgBrCVBrCḨA$zBt2v?\BrCPA@@B?JB3 Am:vBCjBCWBCpACGr?rvB!C`A@@B?R0BA,ÆAb(BqA^(B\B^(BA_(Bs?ABpA@@B?СB:@rBdCBdC]MBdCaB?LBB&{?BdC@@@B?>B@B'mBBA(mBB?(mB&BJoCr?B1nB@@B?>2[B@ iB7sBBBh6sBBh6sBƦ@j6sBf&?BvnB@@B?VBDA%gBCjhB CTA CA CLN?fhBC@@B?nB@B)CϺB)CjB)C@B®C|Zx?B)C@@B?BBm/=AD(BC뾚BC/HABPBBHL?.Bm܎CA@BFBe1A-AI|CjA\C]@]CiyA.gC/>FaACA@B?K.Bj:AAbCUAnCdAnC7@C ?qAՓC A@B]BI@ C\B< C\BB\B^A*C{?- CMB0A@BBq@BwC#BqCXABqC(BÙBw?B莗C@A@BBNx@fBTuAGBuA.CuA CuAj?-BKAPA@B?BQ#AwBF3!C2BG3!CqBH3!C?P3!Cu?4BY8!C`A@B?ds?BoA`>Br X'Bmt'Blg>)}&`?n>B [CpA@B?Ab(AqݒAB׆AB(>AB=@ljC_ ?LڒAB@@@B?QBT@aBPC-BPCs]BPCr`BqpADOr?OBPC@@BB@uBqB"BqBBqBkAqBFJe?~BZB@@B?#UC@xMCPCOCTC\IXCSCl)ANCRy}? vMC[C@@B7.C"@,C͝CC^̝C[AkΫCP|?0CԷ#C@@B?CBAʹ@ݣ%BqۘB'BZטB$BZטB BZטBe?$B!B@@B?V vBpALABK.A&B̋VB&BtB&B5Q?3AB@@B?BA7B C7B C B CA CV[?ͪ7B CA@B?C?;@ C,B CPByBPB}AC9z?W CBA@BKTB}AAA^B۷A_B??B_B5A_B *?C;AB A@BPBS AFB ;CMBB ;CbB ;CݥA ;C`?YFBe;C0A@B?9B'ANB /;CFB/;CC,A/;CۆA6@M?}NB ;C@A@B?BK@#BC%BCBCEN!BCw?F B"פCPA@B?t"BuIA#+A=eCKA=eCB=eC @:eCv=?5AeC`A@B}iB@`{B: CrcB< CWB< C;@ Cs?{Bu C@@B? !B7J0AAAYMBAMB(KAMB^RA&yC\>A.B@@@B?C@"CTNCC$CSNCgBSNCBA {?"CNC@@B?VB1A|?BB:5ABB ABB.bCN ;?h?BȸB@@BB9@sBJCBC9κBCW@CZvs?_BC@@B? BQ@.BhA9,BxABxA*BxA[?+BpA@@B?B@RBCXBhCBhCqA]BEv?BCA@B?C큦@GB/B NB /B" 4C/BwB/B1{?BBA@B?b;MC=@hC<LJCfC;LJC1C;LJCQBBS~?hCJ‡C A@B?CR@EMCIo3A}Cn3Af1Cn3AW#cCsy?JB=BPA@BYBA~חB֬C,B֬CB֬Cg|@֬C_~t?I"BѩC`A@B?s6B.ABW^B{BX^BжAX^B7 B,xCp?EB`B@AB?q^B@MBBjCpBC)BC% -BC%s?bBC@AB?FBAVqB~CZBD>C73BD>CAABG f?B+C@AB?(wC7p@BC>CqDC >CQ0C >C2B >C^{?C>C@AB?Bt@TB DCEBDCdBDCxADCw?{BECAAB?B13@!bB*HC`B0HCB/HC[A/HC/l?bBv_CAAB?tB"@jBCߦBC? BCx-BjCSl?ʫBC AAB?mJB_]APBd=^CHBX=^CBX=^CGAb(BQ?SOB^C0AAB?jBtApBH%CBG%C'AG%CݛsBCNt?@ٵB%C@AAB?x7B~IcA`CB/)C[80B/)C B/)C A˗CY?SCB)CPAAB?FA0 BCBCBC?@Bp?kBCAAB?BǺA\BbJC'TBdJCBdJC:AeJC6d?\B5JC AAB? C3@U#C“}CڷC}Ch#"C}Cq@“}C}?#C}C0AAB?Bs,SA:ByC3,ByC7AyC*ABFO?c:BC@AAB?7FBl+A B_ C@B_ C_A_ CEB/Cdq?BYP C@ AB?qNC=@HC$B>ICq$B)PCp$B<]@_$B}?fHC$B@@ AB?Cp@,C&CͼC!CC!CFq?62,CX|?3CC@ AB?ݬBE@MBVCըB VCKB VC A VCt?EB:VC@ AB?B@YA$CɟA:C`B:CB:COC?XAKC@ AB?VB&g@IBCy)BCBC'4AãC:y?,B`C@ AB?J CQ@B5BB-Be#C-Bi-B.BBxy?BڀBA AB?.B@B/C>B/CPB/CzA/CERBQ*CA0AB?!C슨@CĜCBĜCgACĜCACB!BR>B%BT#?-B:;B~C0?CDBB@@@AB?QBAB_CQBaCBaC,AaC0o?r BHC@@AB?=AH?AtAZ=C`A[=CUa@A|BAX>*B=C@@AB?C+@iBdCTBXC'CXC';BWC~y? BQC@@AB6C@͸ CfCCfCBfCiA/KB|? CfC@@AB?ϿBp@T'BOABPAkNBPAG[BPAsy?BJAA@AB?BA@oBBćBBSBB BBFx?sBQBA@ABg4B9ABPC BPCKUBPCFR@PCQ?p}BFC A@AB?,BAA1A9BaXA9Bs8'B9B 1VA9BWP?H8AcjB?PAB?@B@BR@BQ@[BQ@EAQ@5q?B@@PAB?b?BKA}BdCTBdC,AdC!B C f?BhC@@PAB?4B_@s BaB;B}aBDBB~aBB_XC1s?Bq/B@PAB?Bl Az4>B-CE6B-CuB-CJB-Ck?=BC@PAB? *NB4ANBkCBvkCZNBvkCjAxkC[?DBAjC@PAB?N\B+ArAWCcAFCAFC#AFCE?ؐqA^C@PAB?B@SB>C0qB>C-CC>CW*:B>C"A|?B >CAPAB? A.AL%AiCؾAiC@iCj&A4CÔ?!AZ`CAPAB?fAq*AA?*C%GA:*C?@:*C=7AAC(?A`o*C?`AB?#Bma@ BCC.BC BC2@HBe|?]BxC@`AB?]nOB4@byeBo.CYBo.C\(Bo.CsEA7C}^n?dB..C@@`AB?CBy@BhB&BWB궱BWBAC%{? B5bB@`AB?AS-Am>BÕCi/BÕCgG@BM;BByG?>BҕC@`AB?B~9A{#BxHC,BxHCAxHC<kA8Ak8J?\#B>HC@`AB?ysA҆#AVAb 6CmAs 6Cs?c@s]Al@>)AB6C@`AB?YAoAASBWrC:BWrCn @WrCxA_yBUY:?V+BrerC?pAB㐁BvAȥBFCBFC;BFCDANCm??BLC@pAB?6SBd@׸BMBBMBBMBxAMBox?B``B@@pAB? Ag"A AVCkuoAdC0`@dC_NAƂ CJ>~AdC@pAB?iסB#V@5֞B^,?CdSB`,?C[B`,?CABlKCGBlKCyAlKCBr?TBKCAB?{u(B[`A"B4C:ـB4CdA4CB2B%7?B4C?AB?~AdA;_BCLBCAXCjJBXCkP?m1_B,C@AB?4B>A9B(C A(Ce=B(C&A(CY?AB\*)C@@ B?(Cs@!CCN!CCX/CCYAC?F!CC@ B 1Cl@ CBCBisSCB|eBB? #CB@ B?AiQAAC!rACLcABB !BB>ƾAC@ B?RfEC>0@CCCCC?EBC`A B?sB# A:^ABW@BHNABث@B>1AB@@? B??Cqv@xCBCBaBBACy?{ CrjB@? B?떸Bu@BToCB[oCbB[oC4AjBp?NBC@? B??B,@BCBCCBC=B9 Cw?yB C@? B?(BD@5CBp2CҳDBXCI+BXCOBXCYC~?yC-A A? B?mAuABBxI!C@BI!CZACBC] ?nABm!C@A? B?{(Bz@BtaB yBtaB;/BtaBhSBtaBor?NBaBPA? B?gB;m.A~Bd$C Bf$CuAf$CLBKCKau?WB$C`A? B?kB{OA%ׯAACAAC4AACJ+*@ ]A2 ?A$ BC@@@ B B@ƵB^CxB^CA^C!yBN(BPh?FB1^C@@ B?31BY@sBKAGuBEALBFAAHAvf?=rBU A@@ B?FBg@}BC4XBC\CC ACw?$1BUC@@ B?)CY؂@ CYRC!C)RC+C)RC-%A*RCo|?X CRC@@ B?^nByPAByߡAKBAVAATƦBPHCNk?EBjAA@ B?By˪@BsB|BBvBBA-"Cx?dBBA@ B?qB~ݮ@ BC<5BCuBCa2ACkiy?B/ԢC A@ B?[B:@B*zCzB*zCB*zC;A*zCx?FBAzC0A@ B?Aû-A閧A- BAE BԠ@QVC.AQVC>%vAVp B@A@ B?8B,AB$CiB$Cqe3B$C^A8I C= q?BpCPA@ B?Aͱ=A44B'B&B'B0tA'BdB䉁C۾L?LL4BBC4z? C|6C@@ B?ƉBy@*BqCyBwCcBwCBwCrs?hBC@@ B+zB/MA%B)B=B BA BuB$HCj?BB@@ B?eBQ0ABA&BbA@CBbAeAbAi5?6_BݔA@@ B?9C稂@aBBB̀BenC̀BÀBy?EBcBA@ BndC/@IICuCVJCuC{CuCOBBuC~?ICouCA@ B?InCy?ɻB"hBPA@ B?BLAe6CBziA%-BiAQF.AiA}B8FC5K?CBZIA`A@ B?nB1EA"BBxtBB5@TC8}BTCd?4BcOB@@@ B?oB@ \BM]B^B\BCDB\B m@CYCY_?\BB@@ B?FCi@N#B4C:[B~C;C~CB~Cv?BjC@@ B?B&ɋ@)LB$GCBGCBGCh[AGC|v?&BGC@@ B?ФB@CB CBBB$Ao,UC B|Bf?2B,sB@A@ B?:BvM@^B]'CB['CB['C?*Cxy?ԭB'CPA@ B?X3B`:AzBtA`~BtA?>tABBACCn?mB@vtA`A@ B? BAAYfBCBCˠBCwfACD|?IB*"C@@ B? B2AB+vCBuC @uC>A}B ?VBϐuC@@ B? C"@@BBbB/BuOC/ByA/BJx?JB@B@@ BFkB@F"CbGC(#C]GCNB]GCSBA"{?"CUGC@@ B?s-CVl@ q CӗC CӗC.MCӗCBӗCEv|?3_ CCA@ B?{CƜ@UC%C,<C%C$C%CNA%Cl|?C1%CA@ B?BA4BWCBZC1`BZCRcACNp?xгB C A@ BɓCxI@KB%޲BB)޲BC)޲B LB)޲B z?B\B0A@ B?w1CaW@Cn*COKC3"COKC =COKCwAOKC~?f*CRKC@A@ B?)yAW"AAB(A?B!T??BA Cg>_}AqBPA@ B?&A(AWAC(AC?CAzk#C ?ALC@@ B?b B@B(BOC&vBOCWBOCj3B% Cpr?BOC@@@ B?TC,@ǢC(-C/CONCqCONCT&APNCpnz?*CPC@@ B?}C@ABk BMRBB4{DCBBBx?+BB@@ B?7 kC^@RCC>SCYCYCZCSi0BZC~?GRCC@@ B?A7-A6gB#oCgB#oC[A4lBOB2lBhA@ CZ@"C7@"Cj>!Cu>@hC@A@ B?T BIAGBBY BBF*ABkACpB]BK>B, BK>BǰBcCv?$BS>B@A BjKCH@BCΪBC1CC6BCz?$ByC@A B? CD@͑B$CSB$CC$C0B$C{?mjB$C@A B?E"9B'8A)A>B+]A>BRuB>Bk@>B@,?ElA BAA B?މB@aB]CøB]CA(B]C_`B.Cn?JBCAA B?TB#@wBpUC,'BoUCa֮BoUC @Bxv?٨BvUC AA B?7B2v/A ^B2-kCA*-kCc.B*-kCJ7FA*-kCq*Q?=6BkC0AA B?9qsB?AIB@CLP5B@CɰB@C"A@CYj?JB@C@AA B?6BO&;A@B@@A B:p CV@5>CqB>C`BB_B*BC+|?>CqB@A B? B=94A(TB؏BJB ُB>ُBTo~B{C1C{? .C?C@A B? B'<@O CrBtCrBWBrB ģBC}x?d: CrB@A B?(>B"KOAfzBrXC*BrXCArXC[9@GB'|"?C BEXCAA B?CBwQAA9B0A9BA9Bp@pbC$>A@:BAA B?BL@B(CRB(CgB(CURA(C{?~B(C AA B?7B@A]^ACJKAC?ACAC>@^ACC0AA B?ǜBm@.Bf-C Bf-CWBf-CBf-C,n?&Bq-C@ A B?z:wBucAz&B B%BB BJɁBC B ȻAD B+\?r$&Be B@@ A B?DB$9Aw#BB%Cp_@B;Cž?CUFBCe:?BBsC@ A B?~IC˦@z:C(3C6C)3CWC)3CB)3CӢ}?̱:C6C@ A B?BU@κBBBBBB߰ABd7u? 4BzB@ A B? ~JB3m6AU$WB"U(CNB$U(CA$U(CA*CLQ?VB_(C@ A B?C@Ew$C]B[-C]B_B]BAeC|?ׂ$CKBA A B?% wBAdUPBCeFBCdBCqAC)l?OBĆCA A B?A:AI(B=A6BCAi(A@A9AiLCH?_)BA A A B?Gv_B*(AW'}BBV`BB|+A-C@@A B?T_BdASBT8BOΛBD8B6BB8BBS3bC7n?B8B@@@A B?wB@YiB)Co`B)C9dB)Cr?)CQi?~hBz)C@@A B?PdzB@B$CXB$CB$CB$C/a?rBC@@A B?mLB]@BπCcB̀CoBˀCAʀC]y?[BkuC@@A B?o+CI@bC=BWC=B5C=BFA=B}?PC?=B@@A Bg0BMAD5BB ?"BBBBH@襐C-\?5B_BA@A B? B~aKA'WB]C,/B]CJB]Cv\A]Cv?EB]CA@A B?BT@,BiXCBiXCPBiXC ?AiXCGy?BeXC?PA B?-BR@CB9AB9AxB9A|@?C"Ru?B:A@PA B`%B.ABAVBADBAFg@;PCDU?NBA@@PA B?5AAFAsC3AsCҪ@1~BA1~B%?:ANsC@PA B?A'A{n*BABAx@AA3QGCCJ?*B-A@PA B Bm1A=ACC)ACCHACCACCQ>AA4vDC@PA B?qovB(@VB$CfGBCp?!BC[OBqCu?qBC@PA BB}@PWBjCȇBlCBlCMذAkCbxx?b|BqC?`A B?`A$U'AfB㊜C\lNB䊜C'ACsBC; N?fBݍC@`A B?ķ CɎ@BdRaC BaRaC%CaRaCX YB`RaC1|?BIaC@@`A B?B4˖@\cB;BϋB!;BC!;BjB";B y?JBU8L܁AfB@`A B?XxGBAUA:KC/vA&KCKypB&KCk2B&KCpA?AJC?pA B?%dBKA/NNBʑCS;BʑC-AʑC A(B!W?$MBɑC@pA B?Q Cڪ@HB>C+KB>C)C>Cp}B>C}?ĞB:>C@@pA B?Ba2A"WB&CE FB"C+A"CAC,(C!f?$WB C@@B?SAAyACtTACA3C!9B3Cd>7rAC@B?ΟAViA&A3CA3C>3CACq*>TA3C@B?L7BAA4CoA4CoA4C`7?7BQ?A4C@B?>BO@YV_B3C_B3CG!C3C,B3C?6\B3CAB?*C@Cv4nCt41Bt4 ?B4C?s[Cbm4AB?bA"A@C@C0@3C"A3Cv=n@C AB?.Bev3AaB4CYB4CB4CA4CN{?}aB4C0AB?B@\B6.7B6&*C6oB6?B6@AB?RA^^AV?B4C$3B4CDA%74dB%7LP??B4CPABp BAփ@CY @C%AClWP@Cw~>a@C@@?B?Cf@QCkz?BPBA?B?PBjsrCo?4VBerC@A?B?%vBEA>{BBGBBBhAB,A#CF?ŤBXBPA?B?#B-4:AӪA CA CDB C^A C"?gA5C@@@B?m C@GC'c@|pC3b@h$C4b@OA>b@|?pCo_@@@B?B@QBBRBkB2.BkB BkB7Df?QBB@@B?MBlv@")B"_C(B_CB_CmB_Cc?'B^_C@@B?rCZ@EC'C$DC<'CbTB<'CgnBݭC{?-C׬'C@@B?["C@@ C-B CVBT2CVBBVBu|? CBA@B?-B2s@7BoCőBoC롘BoC[@oCxq?uAB~oCA@B?B)@jBիA}BثAH BثAPQT@At?ڒBVA A@B?A+}?TC,B@@@B?WB@UBCB)BC-BCRABpu?\BC@@@B?AW8A̷A4 B A4x B@^VCqA^VC>Amb B@@@B?eC`x@C]e`CCx`CCx`Cs6Ax`C{?C7`C@@@B?B@0dBH@-B@@E0sBA@ 8Bro8Ckx?C{@A@@B?~C@Z@BO9CO&BL9CCL9CK$BL9CKz?غBw9CA@@B?gB7@BKCyuBKCBKCmAm8A76w?BKC A@@B?B@OB;B2CB7B2CxB7B2CA!Cw?B42C0A@@B?OB7AbAe.jCӫAj.jC7sAj.jCp}qAXB/?\A2AjC@A@@B?OB!@BC!jBC*BCBCv?賀B$CPA@@B?sB;!A˒BzClBzC8]BzC&l@ȳBuq?kBzC@@@B?AR#A6A>C_AGj>Ca]?Fj>CtA\&Ar>:هA>C@@B?0;C܆V@Y CA CMAgCKA1BGA"{? CȥA@@B?\dC֔@2VCfChC{CC{C0B|C~?a#C޾C@@B?9Cl@)CBnBCBsnBB@snBBќoC+{?gCmB@@B?VC@f\CFC\CFCSNCFCXA<=A=~?(Z\C?FCA@B?CNJ@HBCX3BCmCCACz?BCA@B?Bٷ@BjC BjCBjC:0Aj5Cjs?&BmdC A@B?Bz@2(B(CB0CC0CxB/C}x?j=BC0A@B? XBJAyQBB0C-GB10C@B10CDJ?ZCg?`PBu0C@A@B?4Bv^.ATBSCASC¿(BSCMASCYJ?¢BBCPA@B?aBj5An|FBzC:4BzC)kBzCr[AzC}k?EAFB C@@@B?GB!@Ba?ABAABAAAAAO?zBBA@@B?NWC#b@BsXAiBީA\CީAeCAީAdz?7BA@@B B y@BC-BĆCBĆCI>ՆCyk?8BxC@@B?v Crk@CFBe!CFBDCFB6AFB{??FCyFB@@B?(Bk@+BCaBC,BC*Sf?q3C(z?>BpCA@B?j3BJ13A BCcBܼCAܼCz(:AB98BGtB.8B dB.8B u@ NC*q? BB@@B?Bhn@KtB>CuB>CKB>CIA>C=Il?BtB>C@@@B?wc C뱧@B BaB BLC BUB BDz?B+B@@B?-+C@J C7JC C|7JCEC|7JCkfB|7JC|? C JC@@B? B@bީB^FC)BXFCNBXFCAXFC=w?&B5.C@@B?6B|P-AB{AT/BAAA }BDCd`?aBDA@@B?շBN@:UBjCMBjCKBjCe1AjC/a? vTBsjCA@B?t0BASB+KC.AKC[AKC5@3(C}-?%rB CA@B?A9A@`BC'qBC@cB})BcB+%?BvC A@B? B0Q@uB9sC0B9sC{B9sCA|Bbz?xBT6sC0A@B?+BH&@FBC2͖BCz}BC>@Al+!Chv?54BC@A@B?vJBQA^BdBKBdB'BdB6AyCk?z^B~B@AB?X BJRA!B`wCZ!BPwCtAPwCϽAB85?u B׺wC@@AB?&ިB @UBRCCwBRCC4BRCCB)uAvv?BVCC@AB?hC@UaBCBC9CC~uBC@|?BJC@AB?e[Ba@B*}uAB}uAVC}uAS$SB}uAWv?ҦBywA@AB?~cC Z@(C8&C"C8&CxC8&CB8&C-}?)C_&C@AB?؄B0AI'B7A B5A*1B5AlB5A^QZ?&BS2AAAB?*hC1@ B*6CB%6CEC%6CB%6C|?4BH6CAAB?IMA,6A+A~C2lA ~CoGA ~Ch3AC g!?}!AeC AAB?BV@xCB/BBBB8OBvC{?~eCB0AAB?Bl@BBxBBTfBBVsA C,w?BB@AB?BI@^BDmCdBEmCUCEmCBEmC'x?BmC@@AB?(B1m7AXlAqCAٔqC@ٔqCԝA`SvBn>.AqC@AB?=yBq@wBCдBCșCCTBCw?.BC@AB?BD@]BMCBOC7ބBOC9A.Cמn?&B7C@AB?^Bd@@+bBClYB C*/B C )AP'Cca?dbBC@AB?d-A8AgnACdAC@CA'C;>mAnCAAB?Bt@B@A AB?A 0A<Br5 APB3CH#FB3C[B3CMA}Bg?PB"C@0AB?9B AB :B B* :BX5B( :BY!A" :B/$^?k&Bk[:B@0AB׬B@B~@CB}@CO&B}@CIA@Ay? B^?CA0AB?.B@ĢBσCqBσCӅdBσCA}A?>B:kv?B\σCA0AB?hBAACACTBCI}BCS?AʹC@@AB?BDJ@̔B)B B)BhB)Bg@FCz?%BFDB@@@AB?{BV@@ BWqCBBSqC CTqCTSBTqC|?mB qC@@AB?[Bj@}BiBqtBiB5CiB?AiBu|?XBmwB@@AB?2Bk@BCuÉBC @sBCxACt?QBC@@AB?::BR*A/7pB8GCr;UB8GCqFA8GCs0AA2g?`pBGC@@AB?BU@JB5CB5CjB5C!? 5C|?^B4C?PAB?mAر=A@BMtCD,BJtCJ@JtCBCcJ??BtkC@PAB?C1@$C'CEC9V?4BBxC?`AB CR@\8CfBCfB4CfB%@0BfB(~?/C@B@`AB?UʗB1@J=Bc`C,Be`CծBd`CjBd`Ct?&>B`C@@`AB?Av)AQDBCs3BCf@C(]%Bn}CLZ?qDBC@@B?B@{BC/2BC%BC?C?+BC@BK0B;@4yBCzBClBCۘAC9~?G[zBC@B?ëB|_@BBBBM2CBG|BB|?BB@B?C@CCBxAB0AB?ۿBACC;BC^hBCuBB?LCC@AB?^BQ@m[BC:BCACC BC?DBC@@?B?C=@/*CbCC)C}[C1cB}[C&5BC{?)CYC@?B?$A AB-B B3HB2AzC]bBzC>yBcB@?B?fC @2CBZCB<CBm4@rxC+Q|?CƱB@?B?Cm@oBXC^UBYCH4.CYC2BYCPy?7˵B0C@?B?NeB&@=wBȄBuBȄBc+BȄBHFAdvCh?snxB[ڄBA?B? )C3@XC(HCC"HC;C"HCS,B"HC |?/CĐHCA?B?-kC@BRLC5BOLCCOLC%93BNLCP+z?ZaBLC A?B?MBAcBBYBBvBBAvC>f?cB.B0A?B?!Bz@uB^C@B_C4-fB_CT BCky?CBC@A?B㎤B4}@8BGC BGCblBGC:C)BןAz?m!Br HC@@@B?y4BEAIBBBBiAB'6[ACv)?vBXB@@BC'V@$yCfCCfCi CfCT6Ae@KB{?ulC,fC@@B?'B .5AV0B+C0B+CA+C?AkC/'??^1B*C@@B?fCz@ʵwC1CBwC1C~-TC1C8U Bc"C~?xwCW*C@@B? C|S~@#CuBU3!CBBB7BC|? #CeڛBA@B?H?NC?@HCC5BCC\VCCRACz}?|HCŞCA@B?B>@vBxBBxB%BxBnBxBDw?B_ZB A@B?3B"@&BC'BCLICCAC@|?2BC0A@B?(dAw0AEkBHCfWBDCIJAşBBşBP}P?ԬkBC@A@B?xB@˃BHXCkBNXCRBNXC>@PXC:s?B4 YC@@@@B?)B@=BC|*BCxBCqACq?B#C@@@B?BH\@ȒCɪCAC9ǪCB9ǪC:Ar!C /z?qC0C@@@B?h}CB@t@Cq B4ACq BLCq BBq BF~?@CT} B@@@B?ɼBvɣ@ˠB0 C+B0 CB0 CçA0 C$u?B. C@@@B?Y}6C@CS C CV C=YCV C{`BV C۶|?jCjCA@@B?_B%B+A]BCUBCx@C}AB`oC>?'^BtCA@@BCBC+.?FB#)A@@B?B7@nC4zCTB2zC=B2zC.KBcBx?`C(zCA@B? vB AB;"~C>A("~CԡB("~C%B("~C%X?Bt}CA@B?fA0A}OpBRBcB#RBt@wCktBwC^?wpBḟB A@B?B@xB8CB8CC8CTB8C=9|?(-BL8C0A@B?@B@ABZABZA)BZA4#Ae=C z?_FB~A@@@B{BiABB B#B)=B#BAJ7C>j?hBVTB@@B?qB6!@jB' C~B' CLB' C'A擞C8Zn?6B C@@B?Cbf@.CiCLBlC5q%ClC+BmCC{z?5CC@@B?B@k'B_COB`CBaC3@C2v?B;C@@B?kB@B/CCB2CzB2Ch8@2C2u?̡BRCA@B?XBr@ocBӾOC XBξOCaBξOC|BξOCu?/dBOCA@B?WB"@B CwB CIB CN>A C|?B9C A@B?B*@BOA3CwBNA3CPBNA3CޝAC!Y{?B}=3C0A@B?ړBvk@RB)C3B)CzB)C͔AtҮCHz?'BÜ)C@AB?BY@B*;ZBB;ZBOB;ZB/oBƎjC'u?dBYB@@ABgB1AAxB>qC|B9qC<@B BBJFP?AAB`C@AB?^B5@.TB1BB/BB/B;;@1B֯v?B,B@AB?_Cz@"8C6B0C6B覅C6BsӴB6B}?7C5*B@AB?>BT@RCdC!rCdCBdC-AB4{CBbB|?YlCdC@AB?^XBO@:BBB*B$B*BJ8}v?B}>4CAAB?bjBR@ B7CM B7CyB7CB7CGz? B1C AAB?JBBA} A/CA*CNA*Cs@+C>x AC@@AB$B^@wBCd6BCnwBC9pBCzx? BC@ABxB@?B C"B CB CA Cv?%IB C@AB?@CEM@zC\:C C^:CB^:ClAtB|?CUCC@AB?Bs@RBWǪC2GBVǪCCVǪCKBVǪC=v?RBŪC@AB?AqAh8BHyC)B8yCk OAnhB]BnhBL8?8BcxyCAAB?A?i AwE_BAμDBAc-A?OCB?OC5?S_BAAAB?KSBCABBK BB߿eBB(ABq`?BB@ AB?ESBԝ@bB.CB-CB-C0>@.C{?.B#C@@ AB,C=@MCC CCHKCCԺBC}?9C~C@ AB?ٖBG@B̜CMB̜C>]B̜C@A̜C*y?BFɜC@ AB?+B2AtA⾯Cd3eAѾCGBѾCvAѾC?asANC@ AB?A+AASCܚASCg@SCrhANB}>ЫA[C@ AB?:BgM@rBjcCVB^cC~B^cCT^B^cCt?ZrBcCA AB? CJ]@KUB;z BBEz B$CFz BBQBGz B{}?=Bq B@0AB?Bl@wBSGCiBcGCwBcGC BcGCx?$wBGC@@0AB?SB@1BöCՠBĶC`yBĶC^AĶCy?C(BC@0AB?QAAA9BBA9BS@bbCBbbC?*A|9B@0AB?7B@/dBAB/AB/A9@3Az?BÄA@0AB?#B7!AÖ7A5PB#A&PBtA&PBA&PB5>/t5AB@0AB?2Bӵ A)B@BĒB6BB6B\@C.w?~BYB@@AB?_vB"Aj.B'B9B BٖB B B Bd?y.BzB@@@AB?ܮB?[@BW^BBW^BBW^B:!BkCZz?Bi:^B@@AB?ɏB :@B-CعB-CC-C/,B-C{?BB-C@@AB?c|B{@^BxAզBxA)CxApBxA]/|?BA@@ABBAzBQ<C?KBL<C`BL<CApBL<C z?wB+C@PAB>jBM@B]CTB]Cc*B]CV@]Cߦ{?Bd]C@@PAB?SBe@%B>ACB>AC_B>AC8 A>ACx?5B<9AC@B?@C`@_B3C&QB3C!Y6C3CaB3C?mB3C@B?3MBAUB4C B4CLB4Ci?%7?֌B4C@B?$Cѻ@C4C1C4C 0B4CA%7?mC4C@B?}B{A?1gB4C^B4C B4CdA4C}|?, fB4CAB?B!B&A9=B65Bg6~KAh6ΥA4CW?5d>B6AB? BsA*BBC.AC{A4C\?:BC AB?B`@RB4C@bB4C"C4C&gB4C?sB4C0AB?DBA3B4C B4CNcVB4C!WA4CBt?ɣ4B4C@?B?`B@^AB,)CQ@B,)CRlGB,)C?,)C_?ABa)C@?B?xRB;,@zWBߟGCfB֟GCiIC֟GCdB֟GCx?[B{GC@?B?IRC|@' ;CEBC6CDBCA\kCDBCbUBDBC}?K;CV@C@?B?9>C@eBCEC:CECW=CECR&@JCeA}?3BCCA?B?B^TAL7BŒBH0B0ŒBA1ŒBF BazC*;?6B BA?B?PB@KBCBC^BCr}AC'v?ːBC A?B?PZB@)A,1B%uAh!B%uA`dB%uA̼A%uALd? 1BuA0A?B;Bü@vBo* C Bn* CSBn* C-Ao* C_z?VB' C@@@B?YC@^EC8gCEC2gCukC2gCB1gC~?oECgC@@B?tZBC@ AcAC$AHACd\BHACIAHACH?Ae8AC@@B?ʝBr@BCcBCBCBCU\?EBC@@B?؆DB &AvBCȚCxZB@ȚCְ@?ȚCMBCU/c?4BC@@B?qB#,@JwBWCEmBWCBWCsBWCnl? wBWCA@B?}B@jBL??qB:?kC:?@rB:?y?jB?A@B?MtBѢ@VBfaECBjaECBjaEC AjaEC|?+BqEC A@BA:AxAɣBzA:ʣBFA:ʣBdACP?kALB0A@B?GuBL ARBrpCBspC~NBspCr[ABs?B-sC@@@@B?;%BT4A BݰBe BݰBAݰB_8Ai7C4D4? BB@@@B?9*BB{ACeA:CA C$B CmA C.?`AHC@@@B?VBst@gxB,ٜB,AB ٜB]B ٜB AH6CD=v?BB@@@B?"xC_@iCvGwC`CzGwCCzGwCi}1BzGwC#~?qiCSwC@@@B?z6%C=@)CצA;#CצA#CצA>JHCi|?)C,AA@@B?kBs@zBrCB$rC bB"rC]bBxBdv?B rCA@@B?OAޏ0A}B KC6AKCdv?KC"AܷA(?cALJC A@@B?,B4)A:)A$C0A@@B?,B:A]A2jCyVHA&jC1A&jCS@&jCXw>\A)jC@@@B?B>)@"B$B8ٜB{$BoB{$Bo6B{$Bev? BB@@B?BF@4B5B=}B5BB5BC[Af C/x?B:B@@B?VBPApBBl?iBB9"*@CsBC0p@?;YpBjB@@B?cC@MC CuC C8@OC CiB]vCC~?C C@@B?a Cݗ@RB%vBB%vB' C%vBA%vBF%{?BvBA@B?,B{^ AFZ BI2CB%I2CB%I2C`@%I2CM? Bƒ2CA@B?pBABlBBgB~ 4AiBO%B4CHw?BB A@B*3B-A6B'XCRB+XCMC!B+XC'@+XCnR?YB XC0A@B?-A5A B#dCщA#dC7A#dC4wA@BsG?u9 B dC@@@B?OBEW@[BN)C(BN)CO BN)C=?N)CA8tC@@B?CjJ@ CtUC6pCrUCG,*CrUCC BrUCo'{?7 CMC@@B?H&C @J C;BC;BvAC;BzoB;BF|?* CqC r?XӜB?wB A@B?Bg@g+CхCxBхC9EBхC AFB|?CԅC@@@B?UNB2!A~afBVCS^BYCAYCAbB;T?fBC@@B?fAA_= B"H CBH CR9A CUlB C>!B$ C@@B?B1@lB=!LCcBF!LCzBF!LC@@D!LCVg?lmBICLC@@BKB@ЯC C.B CB C }ADCj{?#~C C@@B?NXBE@ŵB{jC9ެB|jCHB|jCBHA}jCߊz?BtpCA@B?kA!AB6CWB6C$0@`@dB`@s*?74BF6CA@B?t,Bv:AwAwBBЦABB,BBB{ABB3g*?ջA_CB A@B?]TB A&QB C@B CsA CBCFt?4IBC@@@BIBAʍ*B C#B CCB C:@SVCoH?AF*B> C@@B?jBھ@&B2C/HB2CC2CJB2C[ty?3yB2C@@B?9B&*A=GB2*NC|4?B9*NCA9*NC6AQA(JZ?{FBANC@@BGBȰ@BtSCKBvSC CvSCAvSCm!|?K0BXC@@B?UB !y?. CYYiC@@AB?A5AAAK=BC2AV=BC;FCAVcABVcA,3>AdBC@AB?7^A_Ax]A~C䣨A~CyV@BsABu>lYAC@AB?C`ɼ@w$C8B3C8BRBC8Bhp?HyC~?&$CTB@AB?B@R0pBC@^BCRBCsUBCv?]pBlC@AB?㑽A),AQ@BMC*BMCȠ A6B*MB6B6?F@B=CAAB?EA*AaAoCHtAoCL@oC*CAC>@ACAAB?RB2At)B A&B A"cB A\+A A$i?')B*A@@AB?ϭBd@[BScCMPBZcCBZcCwBZcC޶t?(&[B4cC@AB?pB@B݊BiB݊B׺B݊BAnyC@|?BB@AB?n)~B1$@^BAܧuBAlBA~@wbFCr?͆BA@AB?)SBGrCAG BvCAvC\^BvCAvCP? B:vC@AB?RkB?PALBCkBC~PBC\@ Cq?WB܋CAAB?6BBR,?BOCPy?B*A@?B?uC"l@Bjm@Bjm@8Cjm@6Bjm@o,y?Ba`n@@?B?!CxɁ@3CC]dCC#0CCBC#{?WqCæC@?B?_EC6@=eCuBq\CuBCuB"BuB̵~?z`eCWtB@?B?dڙB%b@%BC.BC'BCAeȻBv?$BCA?B?B$A*BòC BòCKAòC8A1CF]?sw*BIJCA?B?ѻB#4@-BYvCeBYvCӸBYvCBYvC m?l-BvC A?B?$!B@tBvBBvBBvBAvBE|?ugBiB@@@B?YkBz A',BB&BrBTWBrBfCAsB P?,B[B@@B? SBA5B5CB%B5BB75BBEAB߰i?^>BqBA@B?B:wAC A@B?AAA"PCRAPC*!@ CwACx`>aA6C@@@@B?1ЯB_@{CC(mCC#BCB_Cv?^CC@@@B?\Bn@Cq@C@B@ʶBI7C2z?C@@@@BDB0A?C6>KAfeB@@@B?C3@'BҖC=BҖCc?CҖC BҖCy?BӖC@@@B?='B @By4CBr4CBr4Cr`7Ar4C5x?B4CA@@B?B,@ДBpC(BoC9iBoC;?eBLu?ʔBCA@@B?"B@OB*CB+C7lB+CACMw?IB6C A@@BO`A1)3Aѕ3B8B#B8BtHA8B+A%CW?4s3B2B@@@BOB(@(YBTRCPBTRC 8 BTRCɊAAzV?UXBSRC@@B?kBuu@nB>h,CͼBCh,CBCh,Ck@Hh,Cv?B{,C@@B?B骞@KBBBB1BBJ@B9z?-BB@@B?C@BVCB]C1C]C!xB]C|?B>C@@B?SK$BRA\OB?1B?YLA5CB5Cjo?xB:?A@B?oA;,AfAA"AA_%AAqA=C?2AAA@B?KB@oBeCuBeC;BeC@BeC(w?L_BC@@@BJWC9A1CYCo*C]CaC]CB]Cv}?1C#C@@B?yBK@BBJBBVoBB]&!B ZC)p?ȣB$B@@B?BDF@kBPABPANBPAP@QA6x?BCA@@B?zA2AAC3rAC ACB@muCL> A¼C@@B?C{AC@)DC/mAoT4C mAښLC mA\3AmA}~?DC^mAA@B?OBO2;A{!B5ICB6IC_A6IC6AA@?;2!BEICA@BA8AFATCATCN0ATC,GARB?ACC@@@B?\B #AA/BvA4BcB4BdA4B>?AB@@BCA@1Cy;CF] Cy;C6-By;CV5A3@|?C;C@@B?UBx`7Ax ACBACBDACB5|:?dC=3?%ADB@@B?BT@BM'Bp͞BK'BDBK'B!@ɑCx?<ɫB' B@@B?cBm%ARB6jCfB4jCF=B4jC@$A[Bl?9BjCA@B?.A>+AJAlCɜAlC&AlCn&AFPcB?G}A( mCA@B?9A:ABACBAC?~AACgiAB{N?qBGC@@B?Bv@CBCBCBC A- Cz?SBC@@@B? BoIA.B߻C&B滆CdA滆CABK?l/BrՆC@@B)dB.@/B]B(\zB]B7B]BxArDkC/s?Bo]B@@B?ĞB1@~BHCBHC 3BHCOl@HCy|?BHC@@B?KB@BiɯAg"A[]CA@B?V&B6mAx]CF@x]C$3?IAeC@0AB?!Bv@AnAՋCAՋC3rBՋC]AՋCmXM?AC@@ B?B2@H8B4Cq1B4CB4C`oB4CI~?L8B4C@ B׻4Cl@C4ChC4CVC4CKB4C?C4C@ B?iAkOAP(BC#BCIB4C0C4C{z?*BC@ B?EAIA B}Z5B7Z5@@4C:aB4C2?+ BS5@ B?cB1AB8<6B:<6B:<6`n@4C?'BL<6A B?gBA B6A~, C~,B~,{?U B1A B?HBB[ AZB4BO,.CO,)BO,?B1@@? B?=B@B[CB[C*B[C7A>[CN? BMC@? B?ECP@*C.^Cs#C-^CC-^CfAY Cp}?*CaZC@? B?6hB@.BA BABA]AAy?wB&A@? BB<@KB CB CxB C;? Cx?aBC@? B?B@BCCBC^BCUڗ?C8|?>BCA? B?`$B{@BQCjjBQC +CQC BQCJw?҃BQCA? B?bA AOJ4BC$BC7 A CHB C(E?d4BC@@@ B?4Bx@3BCrbBC BCAnoCz?_BC@@ B??C@CC CCX]jCCcBC}?MCC@@ B?sC _@YMCBKCLfCCCKCiCCKCںBCKC?CmMCKC@@ B?^Bz@CeB~BeB BeByB?"~mC^}?CeB@@ B?B->@B+&C/8B+&CB+&C@Cw?YB*&CA@ B?b?PBAӍB-VCg}B+VCB+VCНA Bho?BmVCA@ B?7wA:#*AAwBAPB:.AOBtA$CJ3?AB@@@@ B?ByIh@nFBC|BCqBCjAC?U{?-BC@@@ B?'BA@nBCdBCCCʵ1BCz?컹BC@@@ B?!B-NA%OBC EBC>ŨACRAC_?9PBC@@@ B?L A7A8'B"GC B3GCpAAGBA?fBUGC@@@ B?|AP%AI}@\Aa@mAڽ>vA@~LC,+>c@/AA@@ B?>B@&BJ$BBQ$BzBQ$B@əCty?BAC@@ B?5A(A #B4CB 4CV A 4CAhCxI?A#BuaGAC@@ B?͸A"AeBeĪCAfĪCg=Aˈ!ChQ&Bˈ!C!?LBLǪC@@ B?Bʢ@XBC#&BCBC掠@Cw{??B7 C@@ B?ʄ(Bd0A2LB3wAJ7B%3wAAA(3wAS^A2sCCzcb?"KBRuAA@ B?ÂB.%\A!r*BCBCAC ?A->B}Z?"4*BЕC@@@ B?*AU:ACBYxC4BZxCՏ@ZxC iBBQ?vCBxC@@ B?1B7@BhCN+BfCNBfC3A9B7y?JBC@@ B?©Aa(ABBA B BA@ BAA @C*7?)B>A@@ B?B.@BB~BBU CBBBCU|?&B=B@@ B?Aw0-APB6CϨ>B6Cש@6Cm)B6mC]?NPB?C@@ B?\BAB{CKB{CB{CNBB{Ce?xBeC@@ B?MBc6@CJCqBICͬBICBAԧC {?CͥC@@ B?B'm@BBC{BBCCBCuBBC|?EB.BC@@ BeA{)1AbdB/A+BAn@AAGC=?BKA@@A B?־>BUn.Aa/uAVC [AIC,BICAIC+?rA:]C@A B?|A/AYAsC AsC1iAsCVA:f|B?A&sC@A B?&8BO&A9B耍C(A」C=GB」CRA」C3 ]?BrC@A B?MBSAoBCꄉBC0AC<.BBr?qvBC@@A B?B'@BƒJC1 BJCLCJC_!BJCEPs?BnJC@@$B?I`BV@)BB"|BBBB=1BB? BB@$B?AhTA,@eB@eBPo>C-@Cn=2@aB@$B?wA1,A${jBBPBBZACmBC@??5iBB@$BVB zABBb BB|BBF?Bf?.BB@$B?WB&AˈBCeH BC VACuBAB3\?5BC@@?$B?6MCL@j$CkC@CjC% ~CjCBjC~?$CC@?$B?B(:@ډBzCD|BzC>BzC@AzCPu?㊉B~C@?$B?Cф@3CECCECCEC @:B ~?,3C4JC@?$B?aBO@wBGCiQBGCVBGCz @Av?B+GC@?$B?^B|AiF]BxCHBxCWBxCU=p@xCxo?g]BJxC@@@$B?BK)C|u@oBiCf]r?9>,BbC@@@$B?&A A+[B죢CAB룢C2AGC[BGC $4?[B͞C@@$B?qB@[CvQCCvQCgBvQC}=BEB|?MOCQC@@$B?&MB AlBΚCUBΚCE)BΚC&/A8C%On?_lBPښC@@$B?ODBoGAPBCSBCNBCGACb?2B}C@@$B?g\BM@%B$@Bg@XBh@P B66Cz?.9Bl@@@@$B?uBfכ@vB͝C/B̝CB̝C A͝C |?vB0ɝC@@$BBB&%A5BkC(%BkCGlAkC[8{B^Br?i'BykC@@$B?mBQ@BDCBDCmsBDCђ>ABX"y?BGC@@$B?Bز@BBWBB%BB[1@B[y?ʭBsB@@@$BA=A5^B4'CA3'C<}.@3'CACj-?B/ 'C@@$B? BzK@9BCBCHBCd@oCz?YMB-C@@(BJB@'ZBw6JPBB62B6B6?~BB@hBB]BB@{XBB4y?D}B B@@@(B?Bv@MBeCBeCCeC/+nBeC |?dBDaC@@(B?B@e\BWլBGBYլB&BYլBBYլB?w?\Bk߬B@@(B?nBv}@cBq6CڊBq6ClBq6C#@q6Cy?MB{6C@@@@(B?A B+y WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) libpdb-redo-3.3.0/examples/example.cpp0000644000175000017500000000160514773016616017532 0ustar maartenmaarten// Simple example showing the use of libpdb-redo to calculate density statistics #include #include #include #include namespace fs = std::filesystem; int main() { // a sample structure file, lets use 1CBS const fs::path example("1cbs.cif.gz"); // load the mmCIF cif::file file(example); // and load this into a structure (note, structure caches data from the file, so order is important) cif::mm::structure structure(file); // now create the maps based on the MTZ file pdb_redo::MapMaker mm; float samplingRate = 0.75; mm.loadMTZ("1cbs_map.mtz", samplingRate); // and finally collect the statistics pdb_redo::EDIAStatsCollector collector(mm, structure, false); auto r = collector.collect(); for (auto& ri: r) { // and do something with the data std::cout << ri.EDIAm << '\n'; } return 0; } libpdb-redo-3.3.0/include/0000755000175000017500000000000014773016616015176 5ustar maartenmaartenlibpdb-redo-3.3.0/include/pdb-redo/0000755000175000017500000000000014773016616016672 5ustar maartenmaartenlibpdb-redo-3.3.0/include/pdb-redo/AtomShape.hpp0000644000175000017500000000445014773016616021267 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // AtomShape, analogue to the similarly named code in clipper #pragma once #include namespace pdb_redo { // -------------------------------------------------------------------- // Class used in calculating radii class AtomShape { public: AtomShape(cif::row_handle atom, cif::row_handle atom_aniso, float resHigh, float resLow, bool electronScattering, std::optional bFactor = {}); AtomShape(const cif::mm::atom &atom, float resHigh, float resLow, bool electronScattering, std::optional bFactor = {}) : AtomShape(atom.get_row(), atom.get_row_aniso(), resHigh, resLow, electronScattering, bFactor) { } ~AtomShape(); AtomShape(const AtomShape &) = delete; AtomShape &operator=(const AtomShape &) = delete; float radius() const; float calculatedDensity(float r) const; float calculatedDensity(cif::point p) const; private: struct AtomShapeImpl *mImpl; }; } // namespace pdb_redo libpdb-redo-3.3.0/include/pdb-redo/BondMap.hpp0000644000175000017500000000724314773016616020731 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include #include #include #include #include namespace pdb_redo { class BondMapException : public std::runtime_error { public: BondMapException(const std::string &msg) : runtime_error(msg) { } }; class BondMap { public: BondMap(const cif::mm::structure &structure, std::optional> around = {}) : BondMap(structure.get_datablock(), around, structure.get_model_nr()) { } BondMap(const cif::datablock &db, std::optional> around = {}, std::size_t model_nr = 1); BondMap(const BondMap &) = delete; BondMap &operator=(const BondMap &) = delete; BondMap(BondMap &&); BondMap &operator=(BondMap &&); bool operator()(const std::string &atom_1, const std::string &atom_2) const { auto aix1 = index.find(atom_1); auto aix2 = index.find(atom_2); return aix1 != index.end() and aix2 != index.end() and isBonded(aix1->second, aix2->second); } bool operator()(const cif::mm::atom &atom_1, const cif::mm::atom &atom_2) const { return operator()(atom_1.id(), atom_2.id()); } bool is1_4(const std::string &atom_1, const std::string &atom_2) const { uint32_t ixa = index.at(atom_1); uint32_t ixb = index.at(atom_2); return bond_1_4.count(key(ixa, ixb)); } bool is1_4(const cif::mm::atom &atom_1, const cif::mm::atom &atom_2) const { return is1_4(atom_1.id(), atom_2.id()); } // links coming from the struct_conn records: std::vector linked(const std::string &atom) const; // This list of atomID's is comming from either CCD or the CCP4 dictionaries loaded static std::vector atomIDsForCompound(const std::string &compoundID); private: bool isBonded(uint32_t ai, uint32_t bi) const { return bond.count(key(ai, bi)) != 0; } uint64_t key(uint32_t a, uint32_t b) const { if (a > b) std::swap(a, b); return static_cast(a) | (static_cast(b) << 32); } std::tuple dekey(uint64_t k) const { return std::make_tuple( static_cast(k >> 32), static_cast(k)); } uint32_t dim; std::unordered_map index; std::set bond, bond_1_4; std::map> link; }; } // namespace pdbx libpdb-redo-3.3.0/include/pdb-redo/ClipperWrapper.hpp0000644000175000017500000000377014773016616022351 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include namespace pdb_redo { clipper::Atom toClipper(const cif::mm::atom &atom); clipper::Atom toClipper(cif::row_handle atom, cif::row_handle aniso_row); // -------------------------------------------------------------------- clipper::Spacegroup getSpacegroup(const cif::datablock &db); clipper::Cell getCell(const cif::datablock &db); // -------------------------------------------------------------------- cif::symop_data GetSymOpDataForRTop_frac(const clipper::RTop_frac &rt); int getSpacegroupNumber(const clipper::Spacegroup &sg); } // namespace pdb_redolibpdb-redo-3.3.0/include/pdb-redo/Compound.hpp0000644000175000017500000002264114773016616021174 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include #include #include #include "cif++.hpp" namespace pdb_redo { // -------------------------------------------------------------------- // The chemical composition of the structure in an mmCIF file is // defined in the class composition. A compositon consists of // entities. Each Entity can be either a polymer, a non-polymer // a macrolide or a water molecule. // Entities themselves are made up of compounds. And compounds // contain CompoundAtom records for each atom. class Compound; class Link; struct CompoundAtom; enum BondType { singleBond, doubleBond, tripleBond, aromaticBond, delocalizedBond }; // -------------------------------------------------------------------- // struct containing information about an atom in a chemical compound // This information comes from the CCP4 monomer library. struct CompoundAtom { std::string id; cif::atom_type typeSymbol; std::string typeEnergy; float partialCharge; }; // -------------------------------------------------------------------- // struct containing information about the bonds // This information comes from the CCP4 monomer library. struct CompoundBond { std::string atomID[2]; BondType type; bool aromatic; float distance; float esd; }; // -------------------------------------------------------------------- // struct containing information about the bond-angles // This information comes from the CCP4 monomer library. struct CompoundAngle { std::string atomID[3]; float angle; float esd; }; // -------------------------------------------------------------------- // struct containing information about the bond-angles // This information comes from the CCP4 monomer library. struct CompoundTorsion { std::string atomID[4]; float angle; float esd; int period; }; // -------------------------------------------------------------------- // struct containing information about the bond-angles // This information comes from the CCP4 monomer library. struct CompoundPlane { std::string id; std::vector atomID; float esd; }; // -------------------------------------------------------------------- // struct containing information about a chiral centre // This information comes from the CCP4 monomer library. enum ChiralVolumeSign { negativ, positiv, both }; struct CompoundChiralCentre { std::string id; std::string atomIDCentre; std::string atomID[3]; ChiralVolumeSign volumeSign; }; // -------------------------------------------------------------------- // a class that contains information about a chemical compound. // This information is derived from the ccp4 monomer library by default. // To create compounds, you'd best use the factory method. class Compound { public: Compound(const cif::datablock &db, const std::string &id, const std::string &name, const std::string &group); // accessors std::string id() const { return mID; } std::string name() const { return mName; } std::string type() const; std::string group() const { return mGroup; } std::vector atoms() const { return mAtoms; } std::vector bonds() const { return mBonds; } std::vector angles() const { return mAngles; } std::vector chiralCentres() const { return mChiralCentres; } std::vector planes() const { return mPlanes; } std::vector torsions() const { return mTorsions; } CompoundAtom get_atom_by_atom_id(const std::string &atomID) const; bool atomsBonded(const std::string &atomId_1, const std::string &atomId_2) const; float atomBondValue(const std::string &atomId_1, const std::string &atomId_2) const; float bondAngle(const std::string &atomId_1, const std::string &atomId_2, const std::string &atomId_3) const; float chiralVolume(const std::string ¢reID) const; std::string formula() const; float formulaWeight() const; int charge() const; bool isWater() const; bool isSugar() const; // std::vector isomers() const; // bool isIsomerOf(const Compound &c) const; // std::vector> mapToIsomer(const Compound &c) const; /// @brief Return the content of this restraint compound in a CCD format /// @return Datablock containing the CCD information for this compound cif::datablock generateCCDCompound() const; private: cif::datablock mCF; std::string mID; std::string mName; std::string mGroup; std::vector mAtoms; std::vector mBonds; std::vector mAngles; std::vector mTorsions; std::vector mChiralCentres; std::vector mPlanes; }; // -------------------------------------------------------------------- // struct containing information about the bonds // This information comes from the CCP4 monomer library. struct LinkAtom { int compID; std::string atomID; bool operator==(const LinkAtom &rhs) const { return compID == rhs.compID and atomID == rhs.atomID; } }; struct LinkBond { LinkAtom atom[2]; BondType type; float distance; float esd; }; // -------------------------------------------------------------------- // struct containing information about the bond-angles // This information comes from the CCP4 monomer library. struct LinkAngle { LinkAtom atom[3]; float angle; float esd; }; // -------------------------------------------------------------------- // struct containing information about the bond-torsions // This information comes from the CCP4 monomer library. struct LinkTorsion { LinkAtom atom[4]; float angle; float esd; int period; }; // -------------------------------------------------------------------- // struct containing information about the bond-angles // This information comes from the CCP4 monomer library. struct LinkPlane { std::string id; std::vector atoms; float esd; }; // -------------------------------------------------------------------- // struct containing information about a chiral centre // This information comes from the CCP4 monomer library. struct LinkChiralCentre { std::string id; LinkAtom atomCentre; LinkAtom atom[3]; ChiralVolumeSign volumeSign; }; // -------------------------------------------------------------------- // a class that contains information about a chemical link between compounds. // This information is derived from the ccp4 monomer library by default. class Link { public: Link(cif::datablock &db); // accessors std::string id() const { return mID; } std::vector bonds() const { return mBonds; } std::vector angles() const { return mAngles; } std::vector chiralCentres() const { return mChiralCentres; } std::vector planes() const { return mPlanes; } std::vector torsions() const { return mTorsions; } float atomBondValue(const LinkAtom &atomId_1, const LinkAtom &atomId_2) const; float bondAngle(const LinkAtom &atomId_1, const LinkAtom &atomId_2, const LinkAtom &atomId_3) const; /// \brief Calculate the target chiral volume for \a id for the link between \a compound_id_1 and \a compound_id_2 /// The compound id's are required to calculate standard bond lengths in case these are not recorded in the link record float chiralVolume(const std::string &id, const std::string &compound_id_1, const std::string &compound_id_2) const; private: std::string mID; std::vector mBonds; std::vector mAngles; std::vector mTorsions; std::vector mChiralCentres; std::vector mPlanes; }; // -------------------------------------------------------------------- // Factory class for Compound and Link objects class CompoundFactory { public: static CompoundFactory &instance(); const Compound *get(std::string id); const Compound *create(std::string id); const Link *getLink(std::string id); const Link *createLink(std::string id); ~CompoundFactory(); void pushDictionary(const std::filesystem::path &inDictFile); void pushDictionary(std::istream &inDictionary); void popDictionary(); private: CompoundFactory(); class CompoundFactoryImpl *mImpl; }; } // namespace pdb_redolibpdb-redo-3.3.0/include/pdb-redo/DistanceMap.hpp0000644000175000017500000000562514773016616021603 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include #ifdef near #undef near #endif namespace pdb_redo { class DistanceMap { public: DistanceMap(const cif::mm::structure &p, const cif::crystal &crystal, float maxDistance); DistanceMap(const cif::mm::structure &p, float maxDistance) : DistanceMap(p, cif::crystal(p.get_datablock()), maxDistance) { } DistanceMap(const DistanceMap &) = delete; DistanceMap &operator=(const DistanceMap &) = delete; float operator()(const std::string &a, const std::string &b) const; std::vector near(const cif::mm::atom &atom, float maxDistance = 3.5f) const; private: using DistKeyType = std::tuple; using DistValueType = std::tuple; using DistMap = std::map; void AddDistancesForAtoms(const std::vector> &a, const std::vector> &b, DistMap &dm); void AddDistancesForAtoms(const std::vector> &a, const std::vector> &b, DistMap &dm, cif::sym_op symop); cif::point offsetToOrigin(const cif::point &p) const; const cif::mm::structure &mStructure; cif::crystal crystal; std::size_t dim; std::unordered_map index; std::map rIndex; float mMaxDistance, mMaxDistanceSQ; std::vector> mA; std::vector mIA, mJA; }; } // namespace pdb_redo libpdb-redo-3.3.0/include/pdb-redo/MapMaker.hpp0000644000175000017500000001410414773016616021100 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include // My apologies, but this code is emitting way too many warnings... #if defined(_MSC_VER) #pragma warning(disable : 4244) // possible loss of data (in conversion to smaller type) #endif namespace pdb_redo { using cif::kPI; template class Map { public: typedef FTYPE ftype; typedef typename clipper::Xmap Xmap; Map(); Map(const Map &rhs) = default; ~Map(); Map& operator=(const Map &rhs) = default; void calculateStats(); double rmsDensity() const { return mRMSDensity; } double meanDensity() const { return mMeanDensity; } operator Xmap &() { return mMap; } operator const Xmap &() const { return mMap; } Xmap &get() { return mMap; } const Xmap &get() const { return mMap; } // These routines work with CCP4 map files void read(const std::filesystem::path &f); void write(const std::filesystem::path &f); void write_masked(std::ostream &os, clipper::Grid_range range); void write_masked(const std::filesystem::path &f, clipper::Grid_range range); clipper::Spacegroup spacegroup() const { return mMap.spacegroup(); } clipper::Cell cell() const { return mMap.cell(); } /// \brief Create a masked map blotting out the density for all \a atom_ids in the structure contained in \a db Map masked(const cif::mm::structure &structure, const std::vector &atom_ids) const; /// \brief Return the z-weighted density sum for the atoms \a atom_ids in the structure contained in \a db float z_weighted_density(const cif::mm::structure &structure, const std::vector &atom_ids) const; private: Xmap mMap; double mMinDensity, mMaxDensity; double mRMSDensity, mMeanDensity; }; using clipper::HKL_data; using clipper::HKL_info; using clipper::data32::F_phi; using clipper::data32::F_sigF; using clipper::data32::Flag; using clipper::data32::Phi_fom; using clipper::Cell; using clipper::Grid_sampling; using clipper::Spacegroup; // -------------------------------------------------------------------- bool IsMTZFile(const std::string &p); // -------------------------------------------------------------------- template class MapMaker { public: typedef Map MapType; typedef typename MapType::Xmap Xmap; enum AnisoScalingFlag { as_None, as_Observed, as_Calculated }; MapMaker(); ~MapMaker(); MapMaker(const MapMaker &) = delete; MapMaker &operator=(const MapMaker &) = delete; void loadMTZ(const std::filesystem::path &mtzFile, float samplingRate, std::initializer_list fbLabels = {"FWT", "PHWT"}, std::initializer_list fdLabels = {"DELFWT", "PHDELWT"}, std::initializer_list foLabels = {"FP", "SIGFP"}, std::initializer_list fcLabels = {"FC_ALL", "PHIC_ALL"}, std::initializer_list faLabels = {"FAN", "PHAN"}); void loadMaps( const std::filesystem::path &fbMapFile, const std::filesystem::path &fdMapFile, float reshi, float reslo); // following works on both mtz files and structure factor files in CIF format void calculate(const std::filesystem::path &hklin, const cif::mm::structure &structure, bool noBulk, AnisoScalingFlag anisoScaling, float samplingRate, bool electronScattering = false, std::initializer_list foLabels = {"FP", "SIGFP"}, std::initializer_list freeLabels = {"FREE"}); void recalc(const cif::mm::structure &structure, bool noBulk, AnisoScalingFlag anisoScaling, float samplingRate, bool electronScattering = false); void printStats(); void writeMTZ(const std::filesystem::path &file, const std::string &project, const std::string &crystal); MapType &fb() { return mFb; } MapType &fd() { return mFd; } MapType &fa() { return mFa; } const MapType &fb() const { return mFb; } const MapType &fd() const { return mFd; } const MapType &fa() const { return mFa; } double resLow() const { return mResLow; } double resHigh() const { return mResHigh; } const Spacegroup &spacegroup() const { return mHKLInfo.spacegroup(); } const Cell &cell() const { return mHKLInfo.cell(); } const Grid_sampling &gridSampling() const { return mGrid; } private: void loadFoFreeFromReflectionsFile(const std::filesystem::path &hklin); void loadFoFreeFromMTZFile(const std::filesystem::path &hklin, std::initializer_list foLabels, std::initializer_list freeLabels); void fixMTZ(); MapType mFb, mFd, mFa; Grid_sampling mGrid; double mResLow, mResHigh; int mNumRefln = 1000, mNumParam = 20; // Cached raw data HKL_info mHKLInfo; HKL_data mFoData; HKL_data mFreeData; HKL_data mFcData, mFbData, mFdData, mFaData; HKL_data mPhiFomData; }; } // namespace pdb_redo libpdb-redo-3.3.0/include/pdb-redo/Minimizer.hpp0000644000175000017500000001547514773016616021362 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Created by: Maarten L. Hekkelman Date: dinsdag 22 mei, 2018 */ #pragma once #include #include #include "pdb-redo/BondMap.hpp" #include "pdb-redo/Compound.hpp" #include "pdb-redo/MapMaker.hpp" #include "pdb-redo/Restraints.hpp" // -------------------------------------------------------------------- namespace pdb_redo { class AtomLocationProvider { public: AtomLocationProvider(const AtomLocationProvider &) = delete; AtomLocationProvider &operator=(const AtomLocationProvider &) = delete; AtomLocationProvider(std::vector &atoms) : mAtoms(atoms) { } virtual ~AtomLocationProvider() {} virtual DPoint operator[](AtomRef atomID) const; virtual std::string atom(AtomRef atomID) const; protected: std::vector &mAtoms; }; // -------------------------------------------------------------------- class DFCollector { public: DFCollector(const DFCollector &) = delete; DFCollector &operator=(const DFCollector &) = delete; DFCollector() {} virtual ~DFCollector() {} virtual void add(AtomRef atom, double dx, double dy, double dz) = 0; void add(AtomRef atom, DPoint &&d) { add(atom, d.m_x, d.m_y, d.m_z); } }; // -------------------------------------------------------------------- class Minimizer { public: typedef clipper::Xmap XMap; Minimizer(const Minimizer &) = delete; Minimizer &operator=(const Minimizer &) = delete; virtual ~Minimizer() {} // factory method: static Minimizer *create(const cif::crystal &crystal, const cif::mm::polymer &poly, int first, int last, const XMap &xMap); static Minimizer *create(const cif::crystal &crystal, cif::mm::structure &structure, const std::vector &atoms, const XMap &xMap) { return create(crystal, structure, atoms, &xMap); } // factory method for minimizer without density: static Minimizer *create(const cif::crystal &crystal, cif::mm::structure &structure, const std::vector &atoms) { return create(crystal, structure, atoms, nullptr); } // Drop all torsion restraints void dropTorsionRestraints(); // Filter based on result of callback // Signature of callback should be: bool (*filter)(cif::mm::atom a1, cif::mm::atom a2, cif::mm::atom a3, cif::mm::atom a4) template void filterTorsionRestraints(F &&cb) { auto e = std::remove_if(mTorsionRestraints.begin(), mTorsionRestraints.end(), [this, cb = std::move(cb)](TorsionRestraint &r) { return r.mA >= mAtoms.size() or r.mB >= mAtoms.size() or r.mC >= mAtoms.size() or r.mD >= mAtoms.size() or cb(mAtoms[r.mA], mAtoms[r.mB], mAtoms[r.mC], mAtoms[r.mD]); }); for (auto i = e; i != mTorsionRestraints.end(); ++i) mRestraints.erase(std::remove(mRestraints.begin(), mRestraints.end(), &*i), mRestraints.end()); mTorsionRestraints.erase(e, mTorsionRestraints.end()); } // Set the map weight, default is 60 void setMapWeight(float mapWeight); // Set the chiral volume ESD, default is 0.2 void setChiralVolumeESD(float chiralityESD); // Set the planarity ESD, default is 0.11 void setPlanarityESD(float planarityESD); void printStats(); virtual double refine(bool storeAtoms) = 0; double score(); virtual std::vector> getAtoms() const = 0; virtual void storeAtomLocations() = 0; protected: Minimizer(const cif::mm::structure &structure); static Minimizer *create(const cif::crystal &crystal, cif::mm::structure &structure, const std::vector &atoms, const XMap *xMap); virtual void addResidue(const cif::mm::residue &res); virtual void addPolySection(const cif::mm::polymer &poly, int first, int last); virtual void addDensityMap(const XMap &xMap, float mapWeight); virtual void Finish(const cif::crystal &crystal); double score(const AtomLocationProvider &loc); void addLinkRestraints(const cif::mm::residue &a, const cif::mm::residue &b, const std::string &atom_id_a, const std::string &atom_id_b, const std::string &linkName) { auto link = CompoundFactory::instance().createLink(linkName); if (not link) throw std::runtime_error("Failed to load link data for " + linkName); addLinkRestraints(a, b, atom_id_a, atom_id_b, *link); } void addLinkRestraints(const cif::mm::residue &a, const cif::mm::residue &b, const std::string &atom_id_a, const std::string &atom_id_b, const Link &link); template double rmsz(const AtomLocationProvider &atoms, const std::vector &a) const { double result = 0; if (not a.empty()) { double sumZ = accumulate(a.begin(), a.end(), 0.0, [&atoms](double sum, const R &r) { double z = r.f(atoms); return sum + z; }); result = std::sqrt(sumZ / a.size()); } return result; } AtomRef ref(const cif::mm::atom &atom); BondMap createBondMap(); bool mElectronScattering = false; // TODO: use! const cif::mm::structure &mStructure; std::vector mAtoms, mReferencedAtoms; std::vector mRef2AtomIndex; std::map mRefIndex; std::vector mBondRestraints; std::vector mAngleRestraints; std::vector mTorsionRestraints; std::vector mTransPeptideRestraints; std::vector mChiralVolumeRestraints; std::vector mPlanarityRestraints; std::vector mNonBondedContactRestraints; std::unique_ptr mDensityRestraint; std::vector mRestraints; }; } // namespace pdb_redolibpdb-redo-3.3.0/include/pdb-redo/Ramachandran.hpp0000644000175000017500000000342614773016616021767 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Created by: Maarten L. Hekkelman Date: dinsdag 19 juni, 2018 */ #pragma once namespace pdb_redo { float calculateRamachandranZScore(const std::string &aa, bool prePro, float phi, float psi); enum RamachandranScore { rsNotAllowed, rsAllowed, rsFavoured }; RamachandranScore calculateRamachandranScore(const std::string &aa, bool prePro, float phi, float psi); } // namespace pdb_redo libpdb-redo-3.3.0/include/pdb-redo/ResolutionCalculator.hpp0000644000175000017500000000377314773016616023572 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include namespace pdb_redo { // -------------------------------------------------------------------- class ResolutionCalculator { public: ResolutionCalculator(double a, double b, double c, double alpha, double beta, double gamma); ResolutionCalculator(const clipper::Cell& cell); double operator()(int h, int k, int l) const { double tmpres = h * h * mCoefs[0] + h * k * mCoefs[1] + h * l * mCoefs[2] + k * k * mCoefs[3] + k * l * mCoefs[4] + l * l * mCoefs[5]; return 1.0 / std::sqrt(tmpres); } private: double mCoefs[6]; }; } libpdb-redo-3.3.0/include/pdb-redo/Restraints.hpp0000644000175000017500000001373314773016616021550 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Created by: Maarten L. Hekkelman Date: dinsdag 22 mei, 2018 */ #pragma once #include #include #include namespace pdb_redo { using DPoint = cif::point_type; // -------------------------------------------------------------------- class AtomLocationProvider; class DFCollector; // -------------------------------------------------------------------- typedef std::size_t AtomRef; typedef typename Map::Xmap Xmap; // -------------------------------------------------------------------- struct Restraint { virtual ~Restraint() {} virtual double f(const AtomLocationProvider &atoms) const = 0; virtual void df(const AtomLocationProvider &atoms, DFCollector &d) const = 0; virtual void print(const AtomLocationProvider &atoms) const = 0; }; struct BondRestraint : public Restraint { BondRestraint(AtomRef a, AtomRef b, double distance, double esd) : mA(a) , mB(b) , mDist(distance) , mDistESD(esd) { } virtual double f(const AtomLocationProvider &atoms) const; virtual void df(const AtomLocationProvider &atoms, DFCollector &d) const; virtual void print(const AtomLocationProvider &atoms) const; AtomRef mA, mB; double mDist, mDistESD; }; struct AngleRestraint : public Restraint { AngleRestraint(AtomRef a, AtomRef b, AtomRef c, double angle, double esd) : mA(a) , mB(b) , mC(c) , mAngle(angle) , mESD(esd) { } virtual double f(const AtomLocationProvider &atoms) const; virtual void df(const AtomLocationProvider &atoms, DFCollector &d) const; virtual void print(const AtomLocationProvider &atoms) const; AtomRef mA, mB, mC; double mAngle, mESD; }; struct TorsionRestraint : public Restraint { TorsionRestraint(AtomRef a, AtomRef b, AtomRef c, AtomRef d, double target, double esd, int periodicity) : mA(a) , mB(b) , mC(c) , mD(d) , mPeriodicity(periodicity) , mTarget(target) , mESD(esd) { } virtual double f(const AtomLocationProvider &atoms) const; virtual void df(const AtomLocationProvider &atoms, DFCollector &d) const; virtual void print(const AtomLocationProvider &atoms) const; AtomRef mA, mB, mC, mD; int mPeriodicity; double mTarget, mESD; private: std::tuple CalculateTorsionGradients(float theta, DPoint p[4]) const; }; struct TransPeptideRestraint : public TorsionRestraint { TransPeptideRestraint(AtomRef a, AtomRef b, AtomRef c, AtomRef d, double esd = 2.0) : TorsionRestraint(a, b, c, d, 180.0, esd, 2) { } }; const double kChiralVolumeESD = 0.2; // according to coot that's a reasonable value... struct ChiralVolumeRestraint : public Restraint { ChiralVolumeRestraint(AtomRef c, AtomRef a1, AtomRef a2, AtomRef a3, double volume) : mCentre(c) , mA1(a1) , mA2(a2) , mA3(a3) , mVolume(volume) { } virtual double f(const AtomLocationProvider &atoms) const; virtual void df(const AtomLocationProvider &atoms, DFCollector &d) const; virtual void print(const AtomLocationProvider &atoms) const; AtomRef mCentre, mA1, mA2, mA3; double mVolume, mESD = kChiralVolumeESD; }; struct PlanarityRestraint : public Restraint { PlanarityRestraint(std::vector &&atoms, double esd) : mAtoms(std::move(atoms)) , mESD(esd) { if (mAtoms.size() < 3) throw std::runtime_error("Insufficient number of atoms in planar restraint"); } virtual double f(const AtomLocationProvider &atoms) const; virtual void df(const AtomLocationProvider &atoms, DFCollector &d) const; virtual void print(const AtomLocationProvider &atoms) const; void calculatePlaneFunction(const AtomLocationProvider &atoms, double abcd[4]) const; std::vector mAtoms; double mESD; }; struct NonBondedContactRestraint : public Restraint { NonBondedContactRestraint(AtomRef a, AtomRef b, double minDist, double esd) : mA(a) , mB(b) , mMinDist(minDist) , mMinDistSq(minDist * minDist) , mDistESD(esd) { } virtual double f(const AtomLocationProvider &atoms) const; virtual void df(const AtomLocationProvider &atoms, DFCollector &d) const; virtual void print(const AtomLocationProvider &atoms) const; AtomRef mA, mB; double mMinDist, mMinDistSq, mDistESD; }; struct DensityRestraint : public Restraint { DensityRestraint(std::vector> &&atoms, const Xmap &xMap, double mapWeight = 60); virtual double f(const AtomLocationProvider &atoms) const; virtual void df(const AtomLocationProvider &atoms, DFCollector &d) const; virtual void print(const AtomLocationProvider &atoms) const; std::vector> mAtoms; const Xmap &mXMap; double mMapWeight; bool mElectronScattering = false; }; } // namespace pdb_redolibpdb-redo-3.3.0/include/pdb-redo/SkipList.hpp0000644000175000017500000001071214773016616021146 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Created by: Maarten L. Hekkelman Date: maandag 07 januari, 2019 Skip list for e.g. pepflip */ #pragma once #include #include #if __has_include() #include using std::experimental::optional; #else #include using std::optional; #endif namespace pdb_redo { struct ResidueSpec { std::string auth_asym_id; std::string auth_comp_id; std::string auth_seq_id; optional pdbx_PDB_ins_code; std::string label_asym_id; std::string label_comp_id; int label_seq_id; ResidueSpec() {} ResidueSpec(const std::string &auth_asym_id, const std::string &auth_comp_id, const std::string &auth_seq_id, const std::string &pdbx_PDB_ins_code, const std::string &label_asym_id, const std::string &label_comp_id, int label_seq_id) : auth_asym_id(auth_asym_id) , auth_comp_id(auth_comp_id) , auth_seq_id(auth_seq_id) #if __has_include() , pdbx_PDB_ins_code(pdbx_PDB_ins_code.empty() ? optional{} : std::experimental::make_optional(pdbx_PDB_ins_code.c_str()[0])) #else , pdbx_PDB_ins_code(pdbx_PDB_ins_code.empty() ? optional{} : std::make_optional(pdbx_PDB_ins_code.c_str()[0])) #endif , label_asym_id(label_asym_id) , label_comp_id(label_comp_id) , label_seq_id(label_seq_id) { } ResidueSpec(const ResidueSpec &rhs) = default; ResidueSpec &operator=(const ResidueSpec &rhs) = default; ResidueSpec(const cif::mm::residue &res) : auth_asym_id(res.get_auth_asym_id()) , auth_comp_id(res.get_compound_id()) , auth_seq_id(res.get_auth_seq_id()) , label_asym_id(res.get_asym_id()) , label_comp_id(res.get_compound_id()) , label_seq_id(res.get_seq_id()) { char ins_code = res.get_pdb_ins_code().c_str()[0]; if (ins_code != 0 and ins_code != ' ') pdbx_PDB_ins_code = ins_code; } ResidueSpec(const cif::mm::atom &atom) : auth_asym_id(atom.get_auth_asym_id()) , auth_comp_id(atom.get_label_comp_id()) , auth_seq_id(atom.get_auth_seq_id()) , label_asym_id(atom.get_label_asym_id()) , label_comp_id(atom.get_label_comp_id()) , label_seq_id(atom.get_label_seq_id()) { char ins_code = atom.get_pdb_ins_code().c_str()[0]; if (ins_code != 0 and ins_code != ' ') pdbx_PDB_ins_code = ins_code; } bool operator==(const ResidueSpec &rhs) const { return auth_asym_id == rhs.auth_asym_id and auth_comp_id == rhs.auth_comp_id and auth_seq_id == rhs.auth_seq_id and pdbx_PDB_ins_code == rhs.pdbx_PDB_ins_code and label_asym_id == rhs.label_asym_id and label_comp_id == rhs.label_comp_id and label_seq_id == rhs.label_seq_id; } }; using SkipList = std::vector; enum class SkipListFormat { OLD, CIF }; // -------------------------------------------------------------------- SkipList readSkipList(const std::filesystem::path &file); SkipList readSkipList(std::istream &is); void writeSkipList(std::ostream &os, const SkipList &list, SkipListFormat format); void writeSkipList(const std::filesystem::path &file, const SkipList &list, SkipListFormat format); } // namespace pdb_redolibpdb-redo-3.3.0/include/pdb-redo/Statistics.hpp0000644000175000017500000001240714773016616021541 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include "pdb-redo/MapMaker.hpp" namespace pdb_redo { // -------------------------------------------------------------------- struct AtomData; class BoundingBox; struct ResidueStatistics { std::string asymID; int seqID; std::string compID; std::string authSeqID; double RSR, SRSR, RSCCS, EDIAm, OPIA; int ngrid; }; std::ostream &operator<<(std::ostream &os, const ResidueStatistics &st); // -------------------------------------------------------------------- template void iterateGrid(const clipper::Coord_orth &p, float r, const clipper::Xmap &m, F &&func) { using namespace clipper; Coord_frac fp = p.coord_frac(m.cell()); Coord_frac o = Coord_orth(r, r, r).coord_frac(m.cell()); o[0] = std::abs(o[0]); o[1] = std::abs(o[1]); o[2] = std::abs(o[2]); Coord_frac fMin = fp - o, fMax = fp + o; Coord_map mMin = fMin.coord_map(m.grid_sampling()), mMax = fMax.coord_map(m.grid_sampling()); Coord_grid gMin = mMin.floor(), gMax = mMax.ceil(); auto i0 = Xmap_base::Map_reference_coord(m, gMin); for (auto iu = i0; iu.coord().u() <= gMax[0]; iu.next_u()) for (auto iv = iu; iv.coord().v() <= gMax[1]; iv.next_v()) for (auto iw = iv; iw.coord().w() <= gMax[2]; iw.next_w()) func(iw); } // -------------------------------------------------------------------- class StatsCollector { public: StatsCollector(const StatsCollector &) = delete; StatsCollector &operator=(const StatsCollector &) = delete; StatsCollector(const MapMaker &mm, cif::mm::structure &structure, bool electronScattering); virtual std::vector collect() const; virtual std::vector collect(const std::string &asymID) const; virtual std::vector collect(const std::string &asymID, int resFirst, int resLast, bool authNameSpace = false) const; virtual ResidueStatistics collect(std::initializer_list residues) const; virtual ResidueStatistics collect(std::initializer_list atoms) const; virtual ResidueStatistics collect(const std::vector &atoms) const; protected: using residue_list = std::vector>; // asym-seqid-compid std::vector collect(const residue_list &residues, BoundingBox &bbox, bool addWaters) const; void initialize(); virtual void calculate(std::vector &atomData) const; struct cmpGPt { bool operator()(const clipper::Coord_grid &a, const clipper::Coord_grid &b) const { int d = a.u() - b.u(); if (d == 0) d = a.v() - b.v(); if (d == 0) d = a.w() - b.w(); return d < 0; } }; typedef std::map GridPtDataMap; cif::mm::structure &mStructure; const MapMaker &mMapMaker; clipper::Spacegroup mSpacegroup; clipper::Cell mCell; clipper::Grid_sampling mGrid; float mResHigh, mResLow; bool mElectronScattering; std::map> mRmsScaled; void collectSums(std::vector &atomData, GridPtDataMap &gridPointDensity) const; void sumDensity(std::vector &atomData, GridPtDataMap &gridPointDensity, std::map> &zScoresPerAsym) const; // Other variables we cache double mMeanDensityFb, mRMSDensityFb, mRMSDensityFd; double mSZ; // average electron density in cell double mVF; // degrees of freedom double mVC; // cell volume? }; // -------------------------------------------------------------------- class EDIAStatsCollector : public StatsCollector { public: EDIAStatsCollector(const MapMaker &mm, cif::mm::structure &structure, bool electronScattering); protected: virtual void calculate(std::vector &atomData) const; BondMap createBondMap(std::vector &atomData) const; std::map mRadii; }; } // namespace pdb_redo libpdb-redo-3.3.0/include/pdb-redo/TLS.hpp0000644000175000017500000000376514773016616020060 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #pragma once #include #include #include #include namespace pdb_redo { struct tls_selection; struct tls_residue; struct tls_selection { virtual ~tls_selection() {} virtual void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel = 0) const = 0; std::vector> get_ranges(cif::datablock &db, bool pdbNamespace) const; }; // Low level: get the selections std::unique_ptr parse_tls_selection_details(const std::string &program, const std::string &selection); } // namespace cif libpdb-redo-3.3.0/include/pdb-redo/Version.hpp0000644000175000017500000000321614773016616021032 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "pdb-redo/exports.hpp" #include namespace pdb_redo { // To force link the version code in pdb-redo, assign a value // to the following global variable somewhere in your code. extern PDB_REDO_EXPORT int force_link; std::string get_version(); }libpdb-redo-3.3.0/src/0000755000175000017500000000000014773016616014342 5ustar maartenmaartenlibpdb-redo-3.3.0/src/AtomShape.cpp0000644000175000017500000004352014773016616016733 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "pdb-redo/AtomShape.hpp" #include "pdb-redo/ClipperWrapper.hpp" #include #include // for debugging norm of gradient #include #include #include namespace pdb_redo { using cif::atom_type; using cif::atom_type_traits; using cif::point; using cif::kPI; // -------------------------------------------------------------------- // sine integration function based on the description in // GalSim: The modular galaxy image simulation toolkit // B.T.P. Rowe et. al. // DOI: 10.1016/j.ascom.2015.02.002 double sineIntegration(double x) { struct P { double n, d; }; double result = 0; if (x <= 4) { const P kP[] = { { 1, 1, }, { -4.54393409816329991e-2, 1.01162145739225565e-2 }, { 1.15457225751016682e-3, 4.99175116169755106e-5 }, { -1.41018536821330254e-5, 1.55654986308745614e-7 }, { 9.43280809438713025e-8, 3.28067571055789734e-10 }, { -3.53201978997168357e-10, 4.5049097575386581e-13 }, { 7.08240282274875911e-13, 3.21107051193712168e-16 }, { -6.05338212010422477e-16, 0 } }; double xs = x * x; double xi = 1; double sn = 0, sd = 0; for (auto p : kP) { sn += xi * p.n; sd += xi * p.d; xi *= xs; } result = x * (sn / sd); } else { const P kF[] = { { 1, 1, }, { 7.44437068161936700618e2, 7.46437068161927678031e2, }, { 1.96396372895146869801e5, 1.97865247031583951450e5, }, { 2.37750310125431834034e7, 2.41535670165126845144e7, }, { 1.43073403821274636888e9, 1.47478952192985464958e9, }, { 4.33736238870432522765e10, 4.58595115847765779830e10, }, { 6.40533830574022022911e11, 7.08501308149515401563e11, }, { 4.20968180571076940208e12, 5.06084464593475076774e12, }, { 1.00795182980368574617e13, 1.43468549171581016479e13, }, { 4.94816688199951963482e12, 1.11535493509914254097e13, }, { -4.94701168645415959931e11, 0 } }, kG[] = { { 1, 1, }, { 8.1359520115168615e2, 8.19595201151451564e2, }, { 2.35239181626478200e5, 2.40036752835578777e5, }, { 3.12557570795778731e7, 3.26026661647090822e7, }, { 2.06297595146763354e9, 2.23355543278099360e9, }, { 6.83052205423625007e10, 7.87465017341829930e10, }, { 1.09049528450362786e12, 1.39866710696414565e12, }, { 7.57664583257834349e12, 1.17164723371736605e13, }, { 1.81004487464664575e13, 4.01839087307656620e13, }, { 6.43291613143049485e12, 3.99653257887490811e13, }, { -1.36517137670871689e12, 0 } }; double xs = std::pow(x, -2); double xi = 1; double sn = 0, sd = 0; for (auto p : kF) { sn += xi * p.n; sd += xi * p.d; xi *= xs; } double fx = (sn / sd) / x; sn = 0; sd = 0; xi = 1; for (auto p : kG) { sn += xi * p.n; sd += xi * p.d; xi *= xs; } double gx = (sn / sd) / (x * x); result = cif::kPI / 2 - fx * std::cos(x) - gx * std::sin(x); } return result; } // -------------------------------------------------------------------- // Internal class to cache some common data class DensityIntegration { public: DensityIntegration(float resolutionLow, float resolutionHigh); static DensityIntegration &instance(float resolutionLow, float resolutionHigh); double integrateRadius(float perc, float occupancy, double yi, const std::vector &fst) const; double integrateDensity(double r, int ks, const std::vector &fst) const; float a() const { return mA; } float b() const { return mB; } const std::vector &st() const { return mST; } const std::vector &sts() const { return mSTS; } const std::vector &wa() const { return mWA; } private: float mA, mB; int mM; struct CallbackParams { const DensityIntegration *self; const std::vector &fst; }; double findMinGlobal(DensityIntegration::CallbackParams ¶ms) const; static double integrateDensityCallback(const gsl_vector *v, void *param) { CallbackParams *params = reinterpret_cast(param); return params->self->integrateDensity(gsl_vector_get(v, 0), -1, params->fst); } // Gauss-Legendre quadrature weights and abscissae std::vector mWA, mST, mSTS; static std::list sInstances; }; std::list DensityIntegration::sInstances; DensityIntegration &DensityIntegration::instance(float resolutionLow, float resolutionHigh) { static std::mutex m; std::lock_guard lock(m); float a = 0.5f / resolutionLow, b = 0.5f / resolutionHigh; auto i = find_if(sInstances.begin(), sInstances.end(), [=](const DensityIntegration &di) { return di.mA == a and di.mB == b; }); if (i == sInstances.end()) { sInstances.emplace_back(resolutionLow, resolutionHigh); i = prev(sInstances.end()); } return *i; } DensityIntegration::DensityIntegration(float resolutionLow, float resolutionHigh) { mA = 0.5f / resolutionLow; mB = 0.5f / resolutionHigh; mM = static_cast(12.0 * std::sqrt(1.2 * mB) + 1); if (mM < 3) mM = 3; int N = 2 * mM; // int J = N; double xr = mB - mA; double xh = .5 * xr; double xm = 0.5 * (mB + mA); mWA = std::vector(N, 0); mST = std::vector(N, 0); mSTS = std::vector(N, 0); for (int i = 1, j = N; i <= mM; ++i, --j) { double z, zo, dp; z = std::cos(cif::kPI * (i - 0.25) / (N + 0.5)); do { double p1 = 1; double p2 = 0; for (int k = 1; k <= N; ++k) { double p3 = p2; p2 = p1; p1 = ((2 * k - 1) * z * p2 - (k - 1) * p3) / k; } dp = N * (z * p1 - p2) / (z * z - 1); zo = z; z = z - p1 / dp; } while (std::abs(z - zo) > 3e-14); mWA[i - 1] = xr / ((1 - z * z) * dp * dp); mWA[j - 1] = mWA[i - 1]; mST[i - 1] = xm - xh * z; mST[j - 1] = xm + xh * z; } transform(mST.begin(), mST.end(), mSTS.begin(), [](double s) { return s * s; }); } // -------------------------------------------------------------------- // Calculate Radius integral over r of calculated density // code inspired by radint.f in edstats double DensityIntegration::integrateDensity(double r, int ks, const std::vector &fst) const { double y = 0; double rt = r; if (rt < 0) rt = 0; if (rt > 1e-10) { double t = 4 * cif::kPI * rt; y = 0; for (std::size_t i = 0; i < mST.size(); ++i) y += fst[i] * sineIntegration(t * mST[i]); if (r < 0) y = y - ks * r; } return ks * y; } double DensityIntegration::findMinGlobal(DensityIntegration::CallbackParams ¶ms) const { // int status; // int iter = 0, max_iter = 100; // double m = 2.0, m_expected = 0; // double a = 0.0, b = 1e3; // gsl_function F{ .function = &DensityIntegration::integrateDensityCallback, .params = ¶ms }; // const gsl_min_fminimizer_type *T = gsl_min_fminimizer_brent; // gsl_min_fminimizer *s = gsl_min_fminimizer_alloc(T); // gsl_min_fminimizer_set(s, &F, m, a, b); // printf("using %s method\n", // gsl_min_fminimizer_name(s)); // printf("%5s [%9s, %9s] %9s %10s %9s\n", // "iter", "lower", "upper", "min", // "err", "err(est)"); // printf("%5d [%.7f, %.7f] %.7f %+.7f %.7f\n", // iter, a, b, // m, m - m_expected, b - a); // do // { // iter++; // status = gsl_min_fminimizer_iterate(s); // m = gsl_min_fminimizer_x_minimum(s); // a = gsl_min_fminimizer_x_lower(s); // b = gsl_min_fminimizer_x_upper(s); // status = gsl_min_test_interval(a, b, 0.001, 0.0); // if (status == GSL_SUCCESS) // printf("Converged:\n"); // printf("%5d [%.7f, %.7f] " // "%.7f %+.7f %.7f\n", // iter, a, b, // m, m - m_expected, b - a); // } while (status == GSL_CONTINUE && iter < max_iter); // gsl_min_fminimizer_free(s); // return m; const gsl_multimin_fminimizer_type *T = gsl_multimin_fminimizer_nmsimplex2; gsl_multimin_fminimizer *s = NULL; gsl_vector *ss, *x; gsl_multimin_function minex_func; size_t iter = 0; int status; double size; /* Starting point */ x = gsl_vector_alloc(2); gsl_vector_set(x, 0, 0.25); gsl_vector_set(x, 1, 0); /* Set initial step sizes to 1 */ ss = gsl_vector_alloc(2); gsl_vector_set_all(ss, 1); /* Initialize method and iterate */ minex_func.n = 2; minex_func.f = &DensityIntegration::integrateDensityCallback; minex_func.params = ¶ms; s = gsl_multimin_fminimizer_alloc(T, 2); gsl_multimin_fminimizer_set(s, &minex_func, x, ss); do { iter++; status = gsl_multimin_fminimizer_iterate(s); if (status) break; size = gsl_multimin_fminimizer_size(s); status = gsl_multimin_test_size(size, 1e-2); // if (status == GSL_SUCCESS) // { // printf("converged to minimum at\n"); // } // printf("%5d %10.3e f() = %7.3f size = %.3f\n", // iter, // gsl_vector_get(s->x, 0), // s->fval, size); } while (status == GSL_CONTINUE && iter < 100); double result = gsl_vector_get(s->x, 0); gsl_vector_free(x); gsl_vector_free(ss); gsl_multimin_fminimizer_free(s); return result; } double DensityIntegration::integrateRadius(float perc, float occupancy, double yi, const std::vector &fst) const { double yt = perc * 0.25 * cif::kPI * occupancy * yi; CallbackParams params{ this, fst }; auto r = findMinGlobal(params); // auto r = dlib::find_min_global(function, { 1e-3 }, { 1e3 }, { false }, dlib::max_function_calls(10)); double result = r; // r.x(0); double x1 = 0; double x2 = result; double y1 = 0; double y2 = integrateDensity(x2, 1, fst); const double kRE = 5e-5; if (y2 > yt) { for (int it = 0; it < 100; ++it) { double x = 0.5 * (x1 + x2); double y = integrateDensity(x, 1, fst); if (std::abs(y - yt) < kRE * std::abs(yt)) { result = x; break; } if ((y1 < yt and y < yt) or (y1 > yt and y > yt)) { x1 = x; y1 = y; } else { x2 = x; y2 = y; } } } else result = x2; return result; } // -------------------------------------------------------------------- struct AtomShapeImpl { virtual ~AtomShapeImpl() = default; AtomShapeImpl(point location, atom_type symbol, int charge, float uIso, float occupancy, float resHigh, float resLow, bool electronScattering) : mSymbol(symbol) , mCharge(charge) , mUIso(uIso) , mOccupancy(occupancy) , mResHigh(resHigh) , mResLow(resLow) , mElectronScattering(electronScattering) , mLocation(location) , mIntegrator(DensityIntegration::instance(resLow, resHigh)) { auto st = mIntegrator.st(); auto sts = mIntegrator.sts(); auto wa = mIntegrator.wa(); mYi = 0; mFst = std::vector(st.size(), 0); auto D = mElectronScattering ? atom_type_traits(symbol).elsf() : atom_type_traits(symbol).wksf(charge); auto bIso = clipper::Util::u2b(uIso); if (bIso == 0 and cif::VERBOSE >= 0) std::cerr << "Zero b-factor?\n"; float as = mIntegrator.a() * mIntegrator.a(); float bs = mIntegrator.b() * mIntegrator.b(); for (int i = 0; i < 6; ++i) { double bi = D.b[i] + bIso; mYi += D.a[i] * (std::exp(-bi * as) - std::exp(-bi * bs)) / bi; } for (std::size_t i = 0; i < st.size(); ++i) { double t = 0; for (int j = 0; j < 6; ++j) { double bj = D.b[j] + bIso; t += D.a[j] * std::exp(-bj * sts[i]); } mFst[i] = occupancy * wa[i] * t * st[i]; } for (std::size_t i = 0; i < 6; ++i) { mBW[i] = static_cast(-4 * kPI * kPI / (D.b[i] + bIso)); mAW[i] = static_cast(D.a[i] * std::pow(-mBW[i] / kPI, 1.5)); } } atom_type mSymbol; int mCharge; float mUIso, mOccupancy; float mResHigh, mResLow; bool mElectronScattering; point mLocation; const DensityIntegration &mIntegrator; double mYi; std::vector mFst; float mAW[6], mBW[6]; virtual float integratedRadius(float perc) const { float result = static_cast(mIntegrator.integrateRadius(perc, mOccupancy, mYi, mFst)); assert(not std::isnan(result)); return result; } virtual float calculatedDensity(float r) const { float rsq = r * r; return mOccupancy * (mAW[0] * std::exp(mBW[0] * rsq) + mAW[1] * std::exp(mBW[1] * rsq) + mAW[2] * std::exp(mBW[2] * rsq) + mAW[3] * std::exp(mBW[3] * rsq) + mAW[4] * std::exp(mBW[4] * rsq) + mAW[5] * std::exp(mBW[5] * rsq)); } virtual float calculatedDensity(point p) const { return calculatedDensity(distance(mLocation, p)); } }; struct AtomShapeAnisoImpl : public AtomShapeImpl { AtomShapeAnisoImpl(point location, atom_type symbol, int charge, clipper::U_aniso_orth &anisou, float occupancy, float resHigh, float resLow, bool electronScattering) : AtomShapeImpl(location, symbol, charge, static_cast(anisou.u_iso()), occupancy, resHigh, resLow, electronScattering) , mAnisoU(anisou) { auto D = mElectronScattering ? atom_type_traits(symbol).elsf() : atom_type_traits(symbol).wksf(charge); const float fourpi2 = static_cast(4 * kPI * kPI); const float pi3 = static_cast(kPI * kPI * kPI); for (int i = 0; i < 6; ++i) { mAnisoInv[i] = clipper::Mat33sym<>( -2 * mAnisoU.mat00() - D.b[i] / fourpi2, -2 * mAnisoU.mat11() - D.b[i] / fourpi2, -2 * mAnisoU.mat22() - D.b[i] / fourpi2, -2 * mAnisoU.mat01(), -2 * mAnisoU.mat02(), -2 * mAnisoU.mat12()) .inverse(); double det = -mAnisoInv[i].det(); mAW[i] = static_cast(D.a[i] * std::sqrt(det / pi3)); mBW[i] = static_cast(-std::pow(det, 1.0f / 3)); } } float calculatedDensity(point p) const override { const point l = p - mLocation; const clipper::Coord_orth dxyz(l.m_x, l.m_y, l.m_z); return mOccupancy * static_cast( mAW[0] * std::exp(mAnisoInv[0].quad_form(dxyz)) + mAW[1] * std::exp(mAnisoInv[1].quad_form(dxyz)) + mAW[2] * std::exp(mAnisoInv[2].quad_form(dxyz)) + mAW[3] * std::exp(mAnisoInv[3].quad_form(dxyz)) + mAW[4] * std::exp(mAnisoInv[4].quad_form(dxyz)) + mAW[5] * std::exp(mAnisoInv[5].quad_form(dxyz))); } clipper::U_aniso_orth mAnisoU; std::array, 6> mAnisoInv; }; // -------------------------------------------------------------------- AtomShape::AtomShape(cif::row_handle atom, cif::row_handle atom_aniso, float resHigh, float resLow, bool electronScattering, std::optional bFactor) : mImpl(nullptr) { const auto &[x, y, z, charge, type_symbol, occupancy, compound_id] = atom.get, std::string, float, std::string>( "Cartn_x", "Cartn_y", "Cartn_z", "pdbx_formal_charge", "type_symbol", "occupancy", "label_comp_id"); atom_type type = type_symbol == "X" ? cif::Nn : atom_type_traits(type_symbol).type(); int formal_charge = charge.value_or(0); if (not charge.has_value()) { auto compound = cif::compound_factory::instance().create(compound_id); if (compound != nullptr and compound->atoms().size() == 1) formal_charge = compound->atoms().front().charge; } if (bFactor.has_value() and *bFactor != 0) mImpl = new AtomShapeImpl({ x, y, z }, type, formal_charge, static_cast(clipper::Util::b2u(*bFactor)), 1.0, resHigh, resLow, electronScattering); else if (not atom_aniso.empty()) { const auto &[u11, u12, u13, u22, u23, u33] = atom_aniso.get("U[1][1]", "U[1][2]", "U[1][3]", "U[2][2]", "U[2][3]", "U[3][3]"); clipper::U_aniso_orth u(u11, u22, u33, u12, u13, u23); while (u.det() < 1.0e-20) u = u + clipper::U_aniso_orth(0.01, 0.01, 0.01, 0, 0, 0); mImpl = new AtomShapeAnisoImpl({ x, y, z }, type, formal_charge, u, occupancy, resHigh, resLow, electronScattering); } else { const auto &[u_iso, b_iso] = atom.get, std::optional>("U_iso_or_equiv", "B_iso_or_equiv"); float iso = 0; if (u_iso.has_value()) iso = *u_iso; else if (b_iso.has_value()) iso = *b_iso / static_cast(8 * kPI * kPI); if (iso == 0) iso = 2.0f / static_cast(8 * kPI * kPI); ; mImpl = new AtomShapeImpl({ x, y, z }, type, formal_charge, iso, occupancy, resHigh, resLow, electronScattering); } } // AtomShape::AtomShape(const cif::mm::atom &atom, float resHigh, float resLow, bool electronScattering, float bFactor) // : mImpl(new AtomShapeImpl(atom.get_location(), atom.type(), atom.charge(), static_cast(clipper::Util::b2u(bFactor)), // 1.0, resHigh, resLow, electronScattering)) // { // } AtomShape::~AtomShape() { delete mImpl; } float AtomShape::radius() const { return mImpl->integratedRadius(0.95f); } float AtomShape::calculatedDensity(float r) const { return mImpl->calculatedDensity(r); } float AtomShape::calculatedDensity(point p) const { return mImpl->calculatedDensity(p); } } // namespace pdb_redo libpdb-redo-3.3.0/src/BondMap.cpp0000644000175000017500000002720714773016616016376 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include namespace pdb_redo { // -------------------------------------------------------------------- struct CompoundBondInfo { std::string mID; std::set> mBonded; bool bonded(uint32_t a1, uint32_t a2) const { return mBonded.count({a1, a2}) > 0; } }; // -------------------------------------------------------------------- class CompoundBondMap { public: static CompoundBondMap &instance() { static std::unique_ptr s_instance(new CompoundBondMap); return *s_instance; } bool bonded(const std::string &compoundID, const std::string &atomID1, const std::string &atomID2); private: CompoundBondMap() {} uint32_t getAtomID(const std::string &atomID) { std::string id(atomID); uint32_t result; auto i = mAtomIDIndex.find(id); if (i == mAtomIDIndex.end()) { result = uint32_t(mAtomIDIndex.size()); mAtomIDIndex[id] = result; } else result = i->second; return result; } std::map mAtomIDIndex; std::vector mCompounds; std::mutex mMutex; }; bool CompoundBondMap::bonded(const std::string &compoundID, const std::string &atomID1, const std::string &atomID2) { std::lock_guard lock(mMutex); using namespace std::literals; std::string id(compoundID); uint32_t a1 = getAtomID(atomID1); uint32_t a2 = getAtomID(atomID2); if (a1 > a2) std::swap(a1, a2); for (auto &bi : mCompounds) { if (bi.mID != id) continue; return bi.bonded(a1, a2); } bool result = false; // not found in our cache, calculate CompoundBondInfo bondInfo{id}; auto compound = cif::compound_factory::instance().create(compoundID); if (not compound) { if (cif::VERBOSE >= 0) std::cerr << "Missing compound bond info for " << compoundID << '\n'; } else { for (auto &atom : compound->bonds()) { uint32_t ca1 = getAtomID(atom.atom_id[0]); uint32_t ca2 = getAtomID(atom.atom_id[1]); if (ca1 > ca2) std::swap(ca1, ca2); bondInfo.mBonded.insert({ca1, ca2}); result = result or (a1 == ca1 and a2 == ca2); } } mCompounds.push_back(bondInfo); return result; } // -------------------------------------------------------------------- BondMap::BondMap(BondMap &&bm) : dim(bm.dim) , index(std::move(bm.index)) , bond(std::move(bm.bond)) , bond_1_4(std::move(bm.bond_1_4)) , link(std::move(bm.link)) { } BondMap &BondMap::operator=(BondMap &&bm) { dim = bm.dim; index.swap(bm.index); bond.swap(bm.bond); bond_1_4.swap(bm.bond_1_4); link.swap(bm.link); return *this; } BondMap::BondMap(const cif::datablock &db, std::optional> around, std::size_t model_nr) { using namespace cif::literals; auto &compoundBondInfo = CompoundBondMap::instance(); // First collect the atoms from the datablock std::vector atoms; cif::crystal crystal(db); for (auto rh : db["atom_site"].find("pdbx_PDB_model_num"_key == model_nr or "pdbx_PDB_model_num"_key == cif::null)) { if (around) { const auto &[p, r] = *around; const auto &[x, y, z] = rh.get("Cartn_x", "Cartn_y", "Cartn_z"); const auto &[d, pt, op] = crystal.closest_symmetry_copy(p, {x, y, z}); if (d <= r) atoms.push_back(rh); } else atoms.push_back(rh); } dim = uint32_t(atoms.size()); for (auto &atom : atoms) index[atom["id"].as()] = uint32_t(index.size()); auto bindAtoms = [this](const std::string &a, const std::string &b) { uint32_t ixa = index[a]; uint32_t ixb = index[b]; bond.insert(key(ixa, ixb)); }; auto linkAtoms = [this, &bindAtoms](const std::string &a, const std::string &b) { bindAtoms(a, b); link[a].insert(b); link[b].insert(a); }; // collect all compounds first std::set compounds; for (const auto &comp_id : db["chem_comp"].rows("id")) compounds.insert(comp_id); // make sure we also have all residues in the polyseq for (const auto &mon_id : db["entity_poly_seq"].rows("mon_id")) { if (compounds.count(mon_id)) continue; if (cif::VERBOSE > 1) std::cerr << "Warning: mon_id " << mon_id << " is missing in the chem_comp category\n"; compounds.insert(mon_id); } cif::progress_bar progress_bar(compounds.size(), "Creating bond map"); // some helper indices to speed things up a bit using atom_map_key_type = std::tuple; std::map atomMapByAsymSeqAndAtom; for (auto a : atoms) { atom_map_key_type key = a.get("label_asym_id", "label_seq_id", "label_atom_id", "auth_seq_id"); atomMapByAsymSeqAndAtom[key] = a.get("id"); } // first link all residues in a polyseq std::string lastAsymID, lastAuthSeqID; int lastSeqID = 0; for (const auto &[asymID, seqID, authSeqID] : db["pdbx_poly_seq_scheme"].rows("asym_id", "seq_id", "pdb_seq_num")) { if (asymID != lastAsymID) // first in a new sequece { lastAsymID = asymID; lastSeqID = seqID; lastAuthSeqID = authSeqID; continue; } auto kc = make_tuple(asymID, lastSeqID, "C", lastAuthSeqID); auto kn = make_tuple(asymID, seqID, "N", authSeqID); if (atomMapByAsymSeqAndAtom.count(kc) and atomMapByAsymSeqAndAtom.count(kn)) { auto c = atomMapByAsymSeqAndAtom.at(kc); auto n = atomMapByAsymSeqAndAtom.at(kn); bindAtoms(c, n); } // if (not(c.empty() or n.empty())) lastSeqID = seqID; lastAuthSeqID = authSeqID; } for (auto l : db["struct_conn"]) { atom_map_key_type ka = l.get("ptnr1_label_asym_id", "ptnr1_label_seq_id", "ptnr1_label_atom_id", "ptnr1_auth_seq_id"); atom_map_key_type kb = l.get("ptnr2_label_asym_id", "ptnr2_label_seq_id", "ptnr2_label_atom_id", "ptnr2_auth_seq_id"); if (atomMapByAsymSeqAndAtom.count(ka) and atomMapByAsymSeqAndAtom.count(kb)) { auto a = atomMapByAsymSeqAndAtom.at(ka); auto b = atomMapByAsymSeqAndAtom.at(kb); linkAtoms(a, b); } } // then link all atoms in the compounds for (auto c : compounds) { progress_bar.consumed(1); if (c == "HOH" or c == "H2O" or c == "WAT") { if (cif::VERBOSE > 1) std::cerr << "skipping water in bond map calculation\n"; continue; } auto bonded = [c, &compoundBondInfo](cif::row_handle a, cif::row_handle b) { auto label_a = a.get("label_atom_id"); auto label_b = b.get("label_atom_id"); return compoundBondInfo.bonded(c, label_a, label_b); }; // loop over poly_seq_scheme for (const auto &[asymID, seqID] : db["pdbx_poly_seq_scheme"].find(cif::key("mon_id") == c, "asym_id", "seq_id")) { std::vector rAtoms; copy_if(atoms.begin(), atoms.end(), back_inserter(rAtoms), [asymID=asymID,seqID=seqID](cif::row_handle a) { return a["label_asym_id"] == asymID and a["label_seq_id"] == seqID; }); for (uint32_t i = 0; i + 1 < rAtoms.size(); ++i) { for (uint32_t j = i + 1; j < rAtoms.size(); ++j) { if (bonded(rAtoms[i], rAtoms[j])) bindAtoms(rAtoms[i].get("id"), rAtoms[j].get("id")); } } } // loop over pdbx_nonpoly_scheme for (auto r : db["pdbx_nonpoly_scheme"].find(cif::key("mon_id") == c)) { std::string asymID; cif::tie(asymID) = r.get("asym_id"); std::vector rAtoms; copy_if(atoms.begin(), atoms.end(), back_inserter(rAtoms), [&](cif::row_handle a) { return a["label_asym_id"] == asymID; }); for (uint32_t i = 0; i + 1 < rAtoms.size(); ++i) { for (uint32_t j = i + 1; j < rAtoms.size(); ++j) { if (bonded(rAtoms[i], rAtoms[j])) { uint32_t ixa = index[rAtoms[i].get("id")]; uint32_t ixb = index[rAtoms[j].get("id")]; bond.insert(key(ixa, ixb)); } } } } // loop over pdbx_branch_scheme for (const auto &[asym_id, pdb_seq_num] : db["pdbx_branch_scheme"].find(cif::key("mon_id") == c, "asym_id", "pdb_seq_num")) { std::vector rAtoms; copy_if(atoms.begin(), atoms.end(), back_inserter(rAtoms), [id = asym_id, nr = pdb_seq_num](cif::row_handle a) { return a["label_asym_id"] == id and a["auth_seq_id"] == nr; }); for (uint32_t i = 0; i + 1 < rAtoms.size(); ++i) { for (uint32_t j = i + 1; j < rAtoms.size(); ++j) { if (bonded(rAtoms[i], rAtoms[j])) { uint32_t ixa = index[rAtoms[i].get("id")]; uint32_t ixb = index[rAtoms[j].get("id")]; bond.insert(key(ixa, ixb)); } } } } } // start by creating an index for single bonds std::multimap b1_2; for (auto &bk : bond) { uint32_t a, b; std::tie(a, b) = dekey(bk); b1_2.insert({a, b}); b1_2.insert({b, a}); } std::multimap b1_3; for (uint32_t i = 0; i < dim; ++i) { auto a = b1_2.equal_range(i); std::vector s; for (auto j = a.first; j != a.second; ++j) s.push_back(j->second); for (std::size_t si1 = 0; si1 + 1 < s.size(); ++si1) { for (std::size_t si2 = si1 + 1; si2 < s.size(); ++si2) { uint32_t x = s[si1]; uint32_t y = s[si2]; if (isBonded(x, y)) continue; b1_3.insert({x, y}); b1_3.insert({y, x}); } } } for (uint32_t i = 0; i < dim; ++i) { auto a1 = b1_2.equal_range(i); auto a2 = b1_3.equal_range(i); for (auto ai1 = a1.first; ai1 != a1.second; ++ai1) { for (auto ai2 = a2.first; ai2 != a2.second; ++ai2) { uint32_t b1 = ai1->second; uint32_t b2 = ai2->second; if (isBonded(b1, b2)) continue; bond_1_4.insert(key(b1, b2)); } } } } std::vector BondMap::linked(const std::string &atom_id) const { auto i = link.find(atom_id); std::vector result; if (i != link.end()) result = std::vector(i->second.begin(), i->second.end()); return result; } std::vector BondMap::atomIDsForCompound(const std::string &compoundID) { std::vector result; auto *compound = cif::compound_factory::instance().create(compoundID); if (compound == nullptr) throw BondMapException("Missing bond information for compound " + compoundID); for (auto &compAtom : compound->atoms()) result.push_back(compAtom.id); return result; } } // namespace pdbx libpdb-redo-3.3.0/src/ClipperWrapper.cpp0000644000175000017500000001504314773016616020010 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "pdb-redo/ClipperWrapper.hpp" namespace pdb_redo { // -------------------------------------------------------------------- clipper::Atom toClipper(cif::row_handle atom, cif::row_handle aniso_row) { const double kPI = cif::kPI; clipper::Atom result; cif::point location = atom.get("Cartn_x", "Cartn_y", "Cartn_z"); result.set_coord_orth({ location.m_x, location.m_y, location.m_z }); if (atom["occupancy"].empty()) result.set_occupancy(1.0); else result.set_occupancy(atom["occupancy"].as()); std::string element = atom["type_symbol"].as(); if (not atom["pdbx_formal_charge"].empty()) { int charge = atom["pdbx_formal_charge"].as(); if (cif::atom_type_traits(element).has_sf(charge) and charge != 0) { element += std::to_string(std::abs(charge)); if (charge < 0) element += '-'; else element += '+'; } } result.set_element(element); if (not atom["U_iso_or_equiv"].empty()) result.set_u_iso(atom["U_iso_or_equiv"].as()); else if (not atom["B_iso_or_equiv"].empty()) result.set_u_iso(atom["B_iso_or_equiv"].as() / (8 * kPI * kPI)); else throw std::runtime_error("Missing B_iso or U_iso"); if (aniso_row.empty()) result.set_u_aniso_orth(clipper::U_aniso_orth(nan("0"), 0, 0, 0, 0, 0)); else { const auto &[u11, u12, u13, u22, u23, u33] = aniso_row.get("U[1][1]", "U[1][2]", "U[1][3]", "U[2][2]", "U[2][3]", "U[3][3]"); result.set_u_aniso_orth(clipper::U_aniso_orth(u11, u22, u33, u12, u13, u23)); } return result; } clipper::Atom toClipper(const cif::mm::atom &atom) { return toClipper(atom.get_row(), atom.get_row_aniso()); } // -------------------------------------------------------------------- clipper::Spacegroup getSpacegroup(const cif::datablock &db) { std::string spacegroup = db["symmetry"].find_first(cif::key("entry_id") == db.name(), "space_group_name_H-M"); if (spacegroup == "P 1-") spacegroup = "P -1"; else if (spacegroup == "P 21 21 2 A") spacegroup = "P 21 21 2 (a)"; else if (spacegroup.empty()) throw std::runtime_error("No spacegroup, cannot continue"); try { return clipper::Spacegroup{ clipper::Spgr_descr(cif::get_space_group_number(spacegroup)) }; } catch (const clipper::Message_fatal &m) { // std::cout << m.text() << '\n'; } try { return clipper::Spacegroup{ clipper::Spgr_descr(spacegroup) }; } catch (const clipper::Message_fatal &e) { std::cerr << e.text() << '\n'; } throw std::runtime_error("Unsupported spacegroup: " + spacegroup); } clipper::Cell getCell(const cif::datablock &db) { const auto &[a, b, c, alpha, beta, gamma] = db["cell"].find1(cif::key("entry_id") == db.name(), "length_a", "length_b", "length_c", "angle_alpha", "angle_beta", "angle_gamma"); return clipper::Cell{ clipper::Cell_descr(a, b, c, alpha, beta, gamma) }; } // -------------------------------------------------------------------- cif::symop_data GetSymOpDataForRTop_frac(const clipper::RTop_frac &rt) { auto &rot = rt.rot(); auto &trn = rt.trn(); auto rte = [&rot](int i, int j) { return static_cast(lrint(rot(i, j))); }; std::array krt{ rte(0, 0), rte(0, 1), rte(0, 2), rte(1, 0), rte(1, 1), rte(1, 2), rte(2, 0), rte(2, 1), rte(2, 2)}; for (int i = 0; i < 3; ++i) { int n = lrint(trn[i] * 24); int d = 24; if (n == 0 or std::abs(n) == 24) continue; // is 0, 0 in our table for (int j = 5; j > 1; --j) if (n % j == 0 and d % j == 0) { n /= j; d /= j; } n = (n + d) % d; switch (i) { case 0: krt[9] = n; krt[10] = d; break; case 1: krt[11] = n; krt[12] = d; break; case 2: krt[13] = n; krt[14] = d; break; } } return cif::symop_data{ krt }; } // -------------------------------------------------------------------- // std::ostream &operator<<(std::ostream &os, const cif::symop_data &s) // { // os << '['; // bool first = true; // for (auto i : s.data()) // { // if (not std::exchange(first, false)) // os << ", "; // os << i; // } // os << ']'; // return os; // } int getSpacegroupNumber(const clipper::Spacegroup &sg) { std::set sg_ops; for (int i = 0; i < sg.num_symops(); ++i) { const auto &symop = sg.symop(i); for (int u : {-1, 0, 1}) for (int v : {-1, 0, 1}) for (int w : {-1, 0, 1}) { if (i == 0 and u == 0 and v == 0 and w == 0) continue; auto rtop = clipper::RTop_frac( symop.rot(), symop.trn() + clipper::Vec3<>(u, v, w)); sg_ops.insert(GetSymOpDataForRTop_frac(rtop)); } } auto s = cif::kSymopNrTable, e = s + cif::kSymopNrTableSize; int result = 0; while (s != e) { auto t = s + 1; while (t->spacegroup() == s->spacegroup()) ++t; if (static_cast(t - s) != sg_ops.size()) { s = t; continue; } std::size_t seen = 0; for (auto &k : sg_ops) { if (std::find_if(s, t, [&k](const cif::symop_datablock &b) { return b.symop() == k; }) != t) ++seen; } if (seen != sg_ops.size()) { s = t; continue; } result = s->spacegroup(); break; } return result; } } // namespace pdb_redolibpdb-redo-3.3.0/src/Compound.cpp0000644000175000017500000007423514773016616016645 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "pdb-redo/Compound.hpp" namespace fs = std::filesystem; namespace pdb_redo { using cif::atom_type_traits; using cif::kPI; // -------------------------------------------------------------------- // Compound helper classes struct CompoundAtomLess { bool operator()(const CompoundAtom &a, const CompoundAtom &b) const { int d = a.id.compare(b.id); if (d == 0) d = a.typeSymbol - b.typeSymbol; return d < 0; } }; struct CompoundBondLess { bool operator()(const CompoundBond &a, const CompoundBond &b) const { int d = a.atomID[0].compare(b.atomID[0]); if (d == 0) d = a.atomID[1].compare(b.atomID[1]); if (d == 0) d = a.type - b.type; return d < 0; } }; // -------------------------------------------------------------------- // Compound Compound::Compound(const cif::datablock &db, const std::string &id, const std::string &name, const std::string &group) : mCF(db) , mID(id) , mName(name) , mGroup(group) { try { auto &compoundAtoms = db["chem_comp_atom"]; for (auto row : compoundAtoms) { std::string atom_id, symbol, energy; float charge; cif::tie(atom_id, symbol, energy, charge) = row.get("atom_id", "type_symbol", "type_energy", "partial_charge"); mAtoms.push_back({ atom_id, atom_type_traits(symbol).type(), energy, charge }); } sort(mAtoms.begin(), mAtoms.end(), CompoundAtomLess()); auto &compBonds = db["chem_comp_bond"]; for (auto row : compBonds) { CompoundBond b; std::optional valueOrder, aromatic; cif::tie(b.atomID[0], b.atomID[1], valueOrder, aromatic, b.distance, b.esd) = row.get("atom_id_1", "atom_id_2", "value_order", "pdbx_aromatic_flag", "value_dist", "value_dist_esd"); // Such a briliant idea, to rename columns in an CIF file... if (not valueOrder) cif::tie(valueOrder) = row.get("type"); if (not aromatic) cif::tie(aromatic) = row.get("aromatic"); b.aromatic = cif::iequals(aromatic.value_or("N"), "Y"); // ... and not only once, but even multiple times if (not aromatic) cif::tie(aromatic) = row.get("aromat"); using cif::iequals; if (not valueOrder) { if (cif::VERBOSE > 0) std::cerr << "Missing value_order in chem_comp_bond for " << mID << '\n'; b.type = singleBond; } else if (iequals(*valueOrder, "single")) b.type = singleBond; else if (iequals(*valueOrder, "double")) b.type = doubleBond; else if (iequals(*valueOrder, "triple")) b.type = tripleBond; else if (b.aromatic) b.type = aromaticBond; else if (iequals(*valueOrder, "deloc")) b.type = delocalizedBond; else { if (cif::VERBOSE > 0) std::cerr << "Unimplemented chem_comp_bond.value_order " << *valueOrder << " in " << mID << '\n'; b.type = singleBond; } if (b.atomID[0] > b.atomID[1]) swap(b.atomID[0], b.atomID[1]); mBonds.push_back(b); } sort(mBonds.begin(), mBonds.end(), CompoundBondLess()); for (auto row : db["chem_comp_angle"]) { CompoundAngle a; cif::tie(a.atomID[0], a.atomID[1], a.atomID[2], a.angle, a.esd) = row.get("atom_id_1", "atom_id_2", "atom_id_3", "value_angle", "value_angle_esd"); mAngles.push_back(a); } for (auto row : db["chem_comp_tor"]) { CompoundTorsion a; cif::tie(a.atomID[0], a.atomID[1], a.atomID[2], a.atomID[3], a.angle, a.esd, a.period) = row.get("atom_id_1", "atom_id_2", "atom_id_3", "atom_id_4", "value_angle", "value_angle_esd", "period"); mTorsions.push_back(a); } for (auto row : db["chem_comp_chir"]) { CompoundChiralCentre cc; std::string volumeSign; cif::tie(cc.id, cc.atomIDCentre, cc.atomID[0], cc.atomID[1], cc.atomID[2], volumeSign) = row.get("id", "atom_id_centre", "atom_id_1", "atom_id_2", "atom_id_3", "volume_sign"); if (volumeSign == "negativ" or volumeSign == "negative") cc.volumeSign = negativ; else if (volumeSign == "positiv" or volumeSign == "positive") cc.volumeSign = positiv; else if (volumeSign == "both") cc.volumeSign = both; else { if (cif::VERBOSE > 0) std::cerr << "Unimplemented chem_comp_chir.volume_sign " << volumeSign << " in " << id << '\n'; continue; } mChiralCentres.push_back(cc); } auto &compPlanes = db["chem_comp_plane_atom"]; for (auto row : compPlanes) { std::string atom_id, plane_id; float esd; cif::tie(atom_id, plane_id, esd) = row.get("atom_id", "plane_id", "dist_esd"); auto i = find_if(mPlanes.begin(), mPlanes.end(), [&](auto &p) { return p.id == plane_id; }); if (i == mPlanes.end()) mPlanes.emplace_back(CompoundPlane{ plane_id, { atom_id }, esd }); else i->atomID.push_back(atom_id); } } catch (const std::exception &ex) { std::cerr << "Error loading ccp4 data for " << id << '\n'; throw; } } std::string Compound::formula() const { std::string result; std::map atoms; float chargeSum = 0; for (auto r : mAtoms) { atoms[atom_type_traits(r.typeSymbol).symbol()] += 1; chargeSum += r.partialCharge; } auto c = atoms.find("C"); if (c != atoms.end()) { result = "C"; if (c->second > 1) result += std::to_string(c->second); atoms.erase(c); auto h = atoms.find("H"); if (h != atoms.end()) { result += " H"; if (h->second > 1) result += std::to_string(h->second); atoms.erase(h); } } for (auto a : atoms) { if (not result.empty()) result += ' '; result += a.first; if (a.second > 1) result += std::to_string(a.second); } int charge = lrint(chargeSum); if (charge != 0) result += ' ' + std::to_string(charge); return result; } float Compound::formulaWeight() const { float result = 0; for (auto r : mAtoms) result += atom_type_traits(r.typeSymbol).weight(); return result; } int Compound::charge() const { float result = 0; for (auto r : mAtoms) result += r.partialCharge; return lrint(result); } std::string Compound::type() const { std::string result; // known groups are (counted from ccp4 monomer dictionary) // D-pyranose // DNA // L-PEPTIDE LINKING // L-SACCHARIDE // L-peptide // L-pyranose // M-peptide // NON-POLYMER // P-peptide // RNA // furanose // non-polymer // non_polymer // peptide // pyranose // saccharide if (cif::iequals(mID, "gly")) result = "peptide linking"; else if (cif::iequals(mGroup, "l-peptide") or cif::iequals(mGroup, "L-peptide linking") or cif::iequals(mGroup, "peptide")) result = "L-peptide linking"; else if (cif::iequals(mGroup, "DNA")) result = "DNA linking"; else if (cif::iequals(mGroup, "RNA")) result = "RNA linking"; // else // result = mGroup; return result; } bool Compound::isWater() const { return mID == "HOH" or mID == "H2O"; } bool Compound::isSugar() const { return cif::iequals(mGroup, "furanose") or cif::iequals(mGroup, "pyranose"); } CompoundAtom Compound::get_atom_by_atom_id(const std::string &atomID) const { CompoundAtom result = {}; for (auto &a : mAtoms) { if (a.id == atomID) { result = a; break; } } if (result.id != atomID) throw std::out_of_range("No atom " + atomID + " in Compound " + mID); return result; } bool Compound::atomsBonded(const std::string &atomId_1, const std::string &atomId_2) const { auto i = find_if(mBonds.begin(), mBonds.end(), [&](const CompoundBond &b) { return (b.atomID[0] == atomId_1 and b.atomID[1] == atomId_2) or (b.atomID[0] == atomId_2 and b.atomID[1] == atomId_1); }); return i != mBonds.end(); } float Compound::atomBondValue(const std::string &atomId_1, const std::string &atomId_2) const { auto i = find_if(mBonds.begin(), mBonds.end(), [&](const CompoundBond &b) { return (b.atomID[0] == atomId_1 and b.atomID[1] == atomId_2) or (b.atomID[0] == atomId_2 and b.atomID[1] == atomId_1); }); return i != mBonds.end() ? i->distance : 0; } // bool Compound::isIsomerOf(const Compound &c) const // { // bool result = false; // for (;;) // { // // easy tests first // if (mID == c.mID) // { // result = true; // break; // } // if (mAtoms.size() != c.mAtoms.size()) // break; // if (mBonds.size() != c.mBonds.size()) // break; // if (mChiralCentres.size() != c.mChiralCentres.size()) // break; // // same number of atoms of each type? // std::map aTypeCount, bTypeCount; // bool sameAtomNames = true; // for (std::size_t i = 0; i < mAtoms.size(); ++i) // { // auto &a = mAtoms[i]; // auto &b = c.mAtoms[i]; // aTypeCount[a.typeSymbol] += 1; // bTypeCount[b.typeSymbol] += 1; // if (a.id != b.id or a.typeSymbol != b.typeSymbol) // sameAtomNames = false; // } // if (not sameAtomNames and aTypeCount != bTypeCount) // break; // bool sameBonds = sameAtomNames; // for (std::size_t i = 0; sameBonds and i < mBonds.size(); ++i) // { // sameBonds = // mBonds[i].atomID[0] == c.mBonds[i].atomID[0] and // mBonds[i].atomID[1] == c.mBonds[i].atomID[1] and // mBonds[i].type == c.mBonds[i].type; // } // if (sameBonds) // { // result = true; // break; // } // // implement rest of tests // std::vector> mapping; // result = StructuresAreIsomeric(mAtoms, mBonds, c.mAtoms, c.mBonds, mapping); // if (cif::VERBOSE and result) // { // for (auto &m : mapping) // std::cerr << " " << std::get<0>(m) << " => " << std::get<1>(m) << '\n'; // } // break; // } // return result; // } // std::vector> Compound::mapToIsomer(const Compound &c) const // { // std::vector> result; // bool check = StructuresAreIsomeric(mAtoms, mBonds, c.mAtoms, c.mBonds, result); // if (not check) // throw std::runtime_error("Compounds " + id() + " and " + c.id() + " are not isomers in call to mapToIsomer"); // return result; // } // std::vector Compound::isomers() const // { // std::vector result; // auto &db = IsomerDB::instance(); // if (db.count(mID)) // { // result = db[mID]; // auto i = find(result.begin(), result.end(), mID); // assert(i != result.end()); // result.erase(i); // } // return result; // } float Compound::bondAngle(const std::string &atomId_1, const std::string &atomId_2, const std::string &atomId_3) const { float result = nanf("1"); for (auto &a : mAngles) { if (not(a.atomID[1] == atomId_2 and ((a.atomID[0] == atomId_1 and a.atomID[2] == atomId_3) or (a.atomID[2] == atomId_1 and a.atomID[0] == atomId_3)))) continue; result = a.angle; break; } return result; } // static float calcC(float a, float b, float alpha) //{ // float f = b * std::sin(alpha * kPI / 180); // float d = std::sqrt(b * b - f * f); // float e = a - d; // float c = std::sqrt(f * f + e * e); // // return c; // } float Compound::chiralVolume(const std::string ¢reID) const { float result = 0; for (auto &cv : mChiralCentres) { if (cv.id != centreID) continue; // calculate the expected chiral volume // the edges float a = atomBondValue(cv.atomIDCentre, cv.atomID[0]); float b = atomBondValue(cv.atomIDCentre, cv.atomID[1]); float c = atomBondValue(cv.atomIDCentre, cv.atomID[2]); // the angles for the top of the tetrahedron float alpha = bondAngle(cv.atomID[0], cv.atomIDCentre, cv.atomID[1]); float beta = bondAngle(cv.atomID[1], cv.atomIDCentre, cv.atomID[2]); float gamma = bondAngle(cv.atomID[2], cv.atomIDCentre, cv.atomID[0]); float cosa = static_cast(std::cos(alpha * kPI / 180)); float cosb = static_cast(std::cos(beta * kPI / 180)); float cosc = static_cast(std::cos(gamma * kPI / 180)); result = (a * b * c * std::sqrt(1 + 2 * cosa * cosb * cosc - (cosa * cosa) - (cosb * cosb) - (cosc * cosc))) / 6; if (cv.volumeSign == negativ) result = -result; break; } return result; } // -------------------------------------------------------------------- Link::Link(cif::datablock &db) { mID = db.name(); if (cif::starts_with(mID, "link_")) mID.erase(mID.begin(), mID.begin() + 5); auto &linkBonds = db["chem_link_bond"]; for (auto row : linkBonds) { LinkBond b; std::string type, aromatic; cif::tie(b.atom[0].compID, b.atom[0].atomID, b.atom[1].compID, b.atom[1].atomID, type, b.distance, b.esd) = row.get("atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "value_order", "value_dist", "value_dist_esd"); using cif::iequals; if (iequals(type, "single") or iequals(type, "sing")) b.type = singleBond; else if (iequals(type, "double") or iequals(type, "doub")) b.type = doubleBond; else if (iequals(type, "triple") or iequals(type, "trip")) b.type = tripleBond; else if (iequals(type, "deloc") or iequals(type, "aromat") or iequals(type, "aromatic")) b.type = delocalizedBond; else { if (cif::VERBOSE > 0) std::cerr << "Unimplemented chem_link_bond.type " << type << " in " << mID << '\n'; b.type = singleBond; } // if (b.atom[0] > b.atom[1]) // swap(b.atom[0], b.atom[1]); mBonds.push_back(b); } // sort(mBonds.begin(), mBonds.end(), LinkBondLess()); auto &linkAngles = db["chem_link_angle"]; for (auto row : linkAngles) { LinkAngle a; cif::tie(a.atom[0].compID, a.atom[0].atomID, a.atom[1].compID, a.atom[1].atomID, a.atom[2].compID, a.atom[2].atomID, a.angle, a.esd) = row.get("atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", "value_angle", "value_angle_esd"); mAngles.push_back(a); } for (auto row : db["chem_link_tor"]) { LinkTorsion a; cif::tie(a.atom[0].compID, a.atom[0].atomID, a.atom[1].compID, a.atom[1].atomID, a.atom[2].compID, a.atom[2].atomID, a.atom[3].compID, a.atom[3].atomID, a.angle, a.esd, a.period) = row.get("atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", "atom_4_comp_id", "atom_id_4", "value_angle", "value_angle_esd", "period"); mTorsions.push_back(a); } auto &linkChir = db["chem_link_chir"]; for (auto row : linkChir) { LinkChiralCentre cc; std::string volumeSign; cif::tie(cc.id, cc.atomCentre.compID, cc.atomCentre.atomID, cc.atom[0].compID, cc.atom[0].atomID, cc.atom[1].compID, cc.atom[1].atomID, cc.atom[2].compID, cc.atom[2].atomID, volumeSign) = row.get("id", "atom_centre_comp_id", "atom_id_centre", "atom_1_comp_id", "atom_id_1", "atom_2_comp_id", "atom_id_2", "atom_3_comp_id", "atom_id_3", "volume_sign"); if (volumeSign == "negativ" or volumeSign == "negative") cc.volumeSign = negativ; else if (volumeSign == "positiv" or volumeSign == "positive") cc.volumeSign = positiv; else if (volumeSign == "both") cc.volumeSign = both; else { if (cif::VERBOSE > 0) std::cerr << "Unimplemented chem_link_chir.volume_sign " << volumeSign << " in " << mID << '\n'; continue; } mChiralCentres.push_back(cc); } auto &linkPlanes = db["chem_link_plane"]; for (auto row : linkPlanes) { int compID; std::string atomID, planeID; float esd; cif::tie(planeID, compID, atomID, esd) = row.get("plane_id", "atom_comp_id", "atom_id", "dist_esd"); auto i = find_if(mPlanes.begin(), mPlanes.end(), [&](auto &p) { return p.id == planeID; }); if (i == mPlanes.end()) { std::vector atoms{ LinkAtom{ compID, atomID } }; mPlanes.emplace_back(LinkPlane{ planeID, std::move(atoms), esd }); } else i->atoms.push_back({ compID, atomID }); } } float Link::atomBondValue(const LinkAtom &atom1, const LinkAtom &atom2) const { auto i = find_if(mBonds.begin(), mBonds.end(), [&](auto &b) { return (b.atom[0] == atom1 and b.atom[1] == atom2) or (b.atom[0] == atom2 and b.atom[1] == atom1); }); return i != mBonds.end() ? i->distance : 0; } float Link::bondAngle(const LinkAtom &atom1, const LinkAtom &atom2, const LinkAtom &atom3) const { float result = nanf("1"); for (auto &a : mAngles) { if (not(a.atom[1] == atom2 and ((a.atom[0] == atom1 and a.atom[2] == atom3) or (a.atom[2] == atom1 and a.atom[0] == atom3)))) continue; result = a.angle; break; } return result; } float Link::chiralVolume(const std::string ¢reID, const std::string &compound_id_1, const std::string &compound_id_2) const { float result = 0; auto bondValue = [&](const LinkAtom &a, const LinkAtom &b) -> float { float result = atomBondValue(a, b); if (result == 0) { if (a.compID != b.compID) throw std::runtime_error("cannot calculate chiral volume since bond lengths are missing"); auto cmp = CompoundFactory::instance().create(a.compID == 1 ? compound_id_1 : compound_id_2); if (cmp == nullptr) throw std::runtime_error("cannot calculate chiral volume since compound is not known"); result = cmp->atomBondValue(a.atomID, b.atomID); } return result; }; auto angle = [&](const LinkAtom &a, const LinkAtom &b, const LinkAtom &c) -> float { float result = bondAngle(a, b, c); if (std::isnan(result)) { if (a.compID != b.compID or a.compID != c.compID) throw std::runtime_error("cannot calculate chiral volume since bond lengths are missing"); auto cmp = CompoundFactory::instance().create(a.compID == 1 ? compound_id_1 : compound_id_2); if (cmp == nullptr) throw std::runtime_error("cannot calculate chiral volume since compound is not known"); result = cmp->bondAngle(a.atomID, b.atomID, c.atomID); } return result; }; for (auto &cv : mChiralCentres) { if (cv.id != centreID) continue; // calculate the expected chiral volume // the edges float a = bondValue(cv.atomCentre, cv.atom[0]); float b = bondValue(cv.atomCentre, cv.atom[1]); float c = bondValue(cv.atomCentre, cv.atom[2]); // the angles for the top of the tetrahedron float alpha = angle(cv.atom[0], cv.atomCentre, cv.atom[1]); float beta = angle(cv.atom[1], cv.atomCentre, cv.atom[2]); float gamma = angle(cv.atom[2], cv.atomCentre, cv.atom[0]); float cosa = static_cast(std::cos(alpha * kPI / 180)); float cosb = static_cast(std::cos(beta * kPI / 180)); float cosc = static_cast(std::cos(gamma * kPI / 180)); result = (a * b * c * std::sqrt(1 + 2 * cosa * cosb * cosc - (cosa * cosa) - (cosb * cosb) - (cosc * cosc))) / 6; if (cv.volumeSign == negativ) result = -result; break; } return result; } // -------------------------------------------------------------------- class CompoundFactoryImpl { public: CompoundFactoryImpl(CompoundFactoryImpl *inNext = nullptr) : mNext(inNext) { } CompoundFactoryImpl(std::istream &inData, CompoundFactoryImpl *inNext = nullptr) : CompoundFactoryImpl(inNext) { mFile.load(inData); } virtual ~CompoundFactoryImpl() { delete mNext; } const Compound *create(std::string id); virtual const Compound *createSelf(std::string id) = 0; const Link *createLink(std::string id); CompoundFactoryImpl *pop() { auto result = mNext; mNext = nullptr; delete this; return result; } protected: CompoundFactoryImpl *mNext = nullptr; std::mutex mMutex; cif::file mFile; std::vector> mCompounds; std::vector> mLinks; }; const Compound *CompoundFactoryImpl::create(std::string id) { std::unique_lock lock(mMutex); cif::to_upper(id); const Compound *result = nullptr; for (auto &cmp : mCompounds) { if (cif::iequals(cmp->id(), id)) { result = cmp.get(); break; } } if (result == nullptr) { try { result = createSelf(id); } catch (...) { } } if (result == nullptr and mNext != nullptr) result = mNext->create(id); return result; } const Link *CompoundFactoryImpl::createLink(std::string id) { std::unique_lock lock(mMutex); cif::to_upper(id); const Link *result = nullptr; for (auto &link : mLinks) { if (cif::iequals(link->id(), id)) { result = link.get(); break; } } if (result == nullptr and mFile.contains("link_" + id)) result = mLinks.emplace_back(std::make_unique(mFile["link_" + id])).get(); if (result == nullptr and mNext != nullptr) result = mNext->createLink(id); return result; } // -------------------------------------------------------------------- class RestraintCompoundFactoryImpl : public CompoundFactoryImpl { public: RestraintCompoundFactoryImpl(std::istream &inData, CompoundFactoryImpl *inNext) : CompoundFactoryImpl(inData, inNext) { cif::file cf; for (auto &&id : mFile["comp_list"]["chem_comp"].rows("id")) { auto c = createSelf(id); // Only forward compounds that are not known yet if (cif::compound_factory::instance().create(id) != nullptr) continue; cf.emplace_back(c->generateCCDCompound()); } cif::compound_factory::instance().push_dictionary(cf); } ~RestraintCompoundFactoryImpl() { cif::compound_factory::instance().pop_dictionary(); } const Compound *createSelf(std::string id) override; }; const Compound *RestraintCompoundFactoryImpl::createSelf(std::string id) { const Compound *result = nullptr; if (not mFile.empty()) { auto &cat = mFile["comp_list"]["chem_comp"]; auto rs = cat.find(cif::key("three_letter_code") == id); if (not rs.empty()) { auto row = rs.front(); std::string name, group; uint32_t numberAtomsAll, numberAtomsNh; cif::tie(name, group, numberAtomsAll, numberAtomsNh) = row.get("name", "group", "number_atoms_all", "number_atoms_nh"); cif::trim(name); cif::trim(group); if (mFile.contains("comp_" + id)) { mCompounds.emplace_back(new Compound(mFile["comp_" + id], id, name, group)); result = mCompounds.back().get(); } } } return result; } // -------------------------------------------------------------------- class CLibdMonCompoundFactoryImpl : public CompoundFactoryImpl { public: CLibdMonCompoundFactoryImpl() { } CLibdMonCompoundFactoryImpl(std::istream &inData, CompoundFactoryImpl *inNext) : CompoundFactoryImpl(inData, inNext) { } const Compound *createSelf(std::string id) override; private: std::set mMissing; }; const Compound *CLibdMonCompoundFactoryImpl::createSelf(std::string id) { const Compound *result = nullptr; if (not mFile.empty() and not mMissing.contains(id)) { auto clibd_mon = fs::path(getenv("CLIBD_MON")); fs::path resFile = clibd_mon / cif::to_lower_copy(id.substr(0, 1)) / (id + ".cif"); cif::file cifFile(resFile); auto &cat = cifFile["comp_list"]["chem_comp"]; auto rs = cat.find(cif::key("three_letter_code") == id); if (not rs.empty()) { auto row = rs.front(); std::string name, group; uint32_t numberAtomsAll, numberAtomsNh; cif::tie(name, group, numberAtomsAll, numberAtomsNh) = row.get("name", "group", "number_atoms_all", "number_atoms_nh"); cif::trim(name); cif::trim(group); if (cifFile.contains("comp_" + id)) { mCompounds.emplace_back(new Compound(cifFile["comp_" + id], id, name, group)); result = mCompounds.back().get(); } } } return result; } // -------------------------------------------------------------------- struct TypeMapping { std::string restr_type, ccd_type; }; const TypeMapping kTypeMap[] = { {"DNA", "DNA linking" }, {"furanose", "saccharide" }, {"ketopyranose", "saccharide" }, {"M-peptide", "peptide linking" }, {"NON-POLYMER", "non-polymer" }, {"peptide", "peptide linking" }, {"P-peptide", "peptide linking" }, {"pyranose", "saccharide" }, {"RNA", "RNA linking" } }; cif::datablock Compound::generateCCDCompound() const { using namespace cif::literals; cif::datablock result{ mID }; auto &chemCompCCD = result["chem_comp"]; auto &chemCompAtomCCD = result["chem_comp_atom"]; auto &chemCompBondCCD = result["chem_comp_bond"]; std::string compType; for (auto &[restrType, ccdType] : kTypeMap) { if (cif::iequals(restrType, mGroup)) { compType = ccdType; break; } } if (compType.empty()) throw std::runtime_error("Unknown type in restraint file: " + mGroup); std::optional unknown; std::optional oneLetterCode; if (auto i = cif::compound_factory::kAAMap.find(mID); i != cif::compound_factory::kAAMap.end()) oneLetterCode = { i->second }; std::optional threeLetterCode; if (mID.length() == 3) threeLetterCode = mID; bool pdbx_ideal_coordinates_missing_flag = true; // -------------------------------------------------------------------- int formalCharge = 0; auto &chemCompAtom = mCF["chem_comp_atom"]; for (int nr = 1; auto row : chemCompAtom) { std::string atom_id, type_symbol; std::optional atom_charge; float atom_x, atom_y, atom_z; cif::tie(atom_id, type_symbol, atom_charge, atom_x, atom_y, atom_z) = row.get("atom_id", "type_symbol", "charge", "x", "y", "z"); chemCompAtomCCD.emplace({ { "comp_id", mID }, { "atom_id", atom_id }, { "alt_atom_id", atom_id }, { "type_symbol", type_symbol }, { "charge", atom_charge }, { "pdbx_align", unknown }, { "pdbx_aromatic_flag", unknown }, { "pdbx_leaving_atom_flag", unknown }, { "pdbx_stereo_config", unknown }, { "pdbx_backbone_atom_flag", unknown }, { "pdbx_n_terminal_atom_flag", unknown }, { "pdbx_c_terminal_atom_flag", unknown }, { "model_Cartn_x", atom_x }, { "model_Cartn_y", atom_y }, { "model_Cartn_z", atom_z }, { "pdbx_model_Cartn_x_ideal", unknown }, { "pdbx_model_Cartn_y_ideal", unknown }, { "pdbx_model_Cartn_z_ideal", unknown }, { "pdbx_component_atom_id", unknown }, { "pdbx_component_comp_id", unknown }, { "pdbx_ordinal", nr++ } }); if (atom_charge) formalCharge += *atom_charge; } for (int nr = 1; auto bond : mBonds) { std::string valueOrder; switch (bond.type) { case singleBond: valueOrder = "SING"; break; case doubleBond: valueOrder = "DOUB"; break; case tripleBond: valueOrder = "TRIP"; break; case aromaticBond: valueOrder = "AROM"; break; case delocalizedBond: valueOrder = "DELO"; break; } chemCompBondCCD.emplace({ { "comp_id", mID }, { "atom_id_1", bond.atomID[0] }, { "atom_id_2", bond.atomID[1] }, { "value_order", valueOrder }, { "pdbx_aromatic_flag", bond.aromatic }, { "pdbx_stereo_config", unknown }, { "pdbx_ordinal", nr++ } }); } // -------------------------------------------------------------------- chemCompCCD.emplace({ // clang-format off { "id", mID }, { "name", mName }, { "type", compType }, { "pdbx_type", unknown }, { "formula", formula() }, { "mon_nstd_parent_comp_id", unknown }, { "pdbx_synonyms", unknown }, { "pdbx_formal_charge", formalCharge }, { "pdbx_initial_date", unknown }, { "pdbx_modified_date", unknown }, { "pdbx_ambiguous_flag", unknown }, { "pdbx_release_status", unknown }, { "pdbx_replaced_by", unknown }, { "pdbx_replaces", unknown }, { "formula_weight", formulaWeight() }, { "one_letter_code", oneLetterCode }, { "three_letter_code", threeLetterCode }, { "pdbx_model_coordinates_details", unknown }, { "pdbx_model_coordinates_missing_flag", false }, { "pdbx_ideal_coordinates_details", unknown }, { "pdbx_ideal_coordinates_missing_flag", pdbx_ideal_coordinates_missing_flag }, { "pdbx_model_coordinates_db_code", unknown }, { "pdbx_subcomponent_list", unknown }, { "pdbx_processing_site", unknown }, { "pdbx_pcm", unknown }, // clang-format on }); return result; } // -------------------------------------------------------------------- CompoundFactory::CompoundFactory() : mImpl(nullptr) { fs::path mon_lib_list; if (const char *clibdMon = getenv("CLIBD_MON")) mon_lib_list = fs::path(clibdMon) / "list" / "mon_lib_list.cif"; std::ifstream file(mon_lib_list); if (mon_lib_list.empty() or not fs::exists(mon_lib_list) or not file.is_open()) { if (cif::VERBOSE > 0) std::cerr << cif::coloured("Could not load the mon_lib_list.cif file from CCP4, please make sure you have installed CCP4 and sourced the environment.", cif::colour::white, cif::colour::red) << '\n'; mImpl = new CLibdMonCompoundFactoryImpl(); } else mImpl = new CLibdMonCompoundFactoryImpl(file, nullptr); } CompoundFactory::~CompoundFactory() { delete mImpl; } CompoundFactory &CompoundFactory::instance() { static CompoundFactory sInstance; return sInstance; } void CompoundFactory::pushDictionary(const fs::path &inDictFile) { if (not fs::exists(inDictFile)) throw std::runtime_error("file not found: " + inDictFile.string()); try { std::ifstream file(inDictFile); if (not file.is_open()) throw std::system_error(errno, std::generic_category(), inDictFile.string()); mImpl = new RestraintCompoundFactoryImpl(file, mImpl); } catch (const std::exception &ex) { std::cerr << "Error loading dictionary " << inDictFile << '\n'; throw; } } void CompoundFactory::pushDictionary(std::istream &is) { mImpl = new RestraintCompoundFactoryImpl(is, mImpl); } void CompoundFactory::popDictionary() { assert(mImpl != nullptr); if (mImpl != nullptr) mImpl = mImpl->pop(); // should not pop the last one! assert(mImpl != nullptr); } // id is the three letter code const Compound *CompoundFactory::create(std::string id) { return mImpl->create(id); } const Link *CompoundFactory::createLink(std::string id) { return mImpl->createLink(id); } } // namespace pdb_redolibpdb-redo-3.3.0/src/DistanceMap.cpp0000644000175000017500000002403014773016616017235 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "pdb-redo/DistanceMap.hpp" #include #include #include namespace pdb_redo { using cif::point; // -------------------------------------------------------------------- std::tuple calculateCenterAndRadius(const std::vector> &atoms) { std::vector pts; for (const auto &[ix, pt] : atoms) pts.emplace_back(pt); auto center = centroid(pts); float radius = 0; for (auto &pt : pts) { float d = static_cast(distance(pt, center)); if (radius < d) radius = d; } return std::make_tuple(center, radius); } // -------------------------------------------------------------------- DistanceMap::DistanceMap(const cif::mm::structure &p, const cif::crystal &crystal, float maxDistance) : mStructure(p) , crystal(crystal) , dim(0) , mMaxDistance(maxDistance) , mMaxDistanceSQ(maxDistance * maxDistance) { using namespace cif::literals; // First collect the atoms from the datablock std::vector atoms; auto &db = p.get_datablock(); for (auto a : p.atoms()) atoms.push_back(a.get_row()); dim = uint32_t(atoms.size()); std::vector locations(dim); // bounding box point pMin(std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()), pMax(std::numeric_limits::min(), std::numeric_limits::min(), std::numeric_limits::min()); for (auto &atom : atoms) { const auto &[id, x, y, z] = atom.get("id", "Cartn_x", "Cartn_y", "Cartn_z"); std::size_t ix = index.size(); index[id] = ix; rIndex[ix] = id; cif::point pt{ x, y, z }; locations[ix] = pt; if (pMin.m_x > pt.m_x) pMin.m_x = pt.m_x; if (pMin.m_y > pt.m_y) pMin.m_y = pt.m_y; if (pMin.m_z > pt.m_z) pMin.m_z = pt.m_z; if (pMax.m_x < pt.m_x) pMax.m_x = pt.m_x; if (pMax.m_y < pt.m_y) pMax.m_y = pt.m_y; if (pMax.m_z < pt.m_z) pMax.m_z = pt.m_z; }; pMin -= mMaxDistance; // extend bounding box pMax += mMaxDistance; DistMap dist; std::vector>>> residues; // loop over poly_seq_scheme for (const auto &[asymID, seqID] : db["pdbx_poly_seq_scheme"].rows("asym_id", "seq_id")) { std::vector> rAtoms; for (std::size_t i = 0; i < dim; ++i) { if (atoms[i]["label_asym_id"] == asymID and atoms[i]["label_seq_id"] == seqID) rAtoms.emplace_back(i, locations[i]); } AddDistancesForAtoms(rAtoms, rAtoms, dist); auto &&[center, radius] = calculateCenterAndRadius(rAtoms); residues.emplace_back(center, radius, std::move(rAtoms)); } // treat waters special auto water_entity_id = db["entity"].find1>("type"_key == "water", "id"); if (water_entity_id.has_value()) { for (std::size_t i = 0; i < dim; ++i) { if (atoms[i]["label_entity_id"] == *water_entity_id) { auto pt = locations[i]; residues.emplace_back(pt, 0.f, std::vector>{ { i, pt } }); } } } // loop over pdbx_nonpoly_scheme for (const auto &[asymID, entityID] : db["pdbx_nonpoly_scheme"].rows("asym_id", "entity_id")) { if (water_entity_id.has_value() and entityID == *water_entity_id) continue; std::vector> rAtoms; for (std::size_t i = 0; i < dim; ++i) { if (atoms[i]["label_asym_id"] == asymID) rAtoms.emplace_back(i, locations[i]); } AddDistancesForAtoms(rAtoms, rAtoms, dist); auto &&[center, radius] = calculateCenterAndRadius(rAtoms); residues.emplace_back(center, radius, std::move(rAtoms)); } // loop over pdbx_branch_scheme for (const auto &[asym_id, pdb_seq_num] : db["pdbx_branch_scheme"].rows("asym_id", "num")) { std::vector> rAtoms; for (std::size_t i = 0; i < dim; ++i) { if (atoms[i]["label_asym_id"] == asym_id and atoms[i]["auth_seq_id"] == pdb_seq_num) rAtoms.emplace_back(i, locations[i]); } AddDistancesForAtoms(rAtoms, rAtoms, dist); auto &&[center, radius] = calculateCenterAndRadius(rAtoms); residues.emplace_back(center, radius, std::move(rAtoms)); } cif::progress_bar progress_bar((residues.size() * (residues.size() - 1)) / 2, "Creating distance map"); for (std::size_t i = 0; i + 1 < residues.size(); ++i) { const auto &[centerI, radiusI, atomsI] = residues[i]; for (std::size_t j = i + 1; j < residues.size(); ++j) { progress_bar.consumed(1); const auto &[centerJ, radiusJ, atomsJ] = residues[j]; // first case, no symmetry operations auto d = distance(centerI, centerJ) - radiusI - radiusJ; if (d < mMaxDistance) { AddDistancesForAtoms(atomsI, atomsJ, dist); continue; } const auto &[ds, p, symop] = crystal.closest_symmetry_copy(centerI, centerJ); if (ds - radiusI - radiusJ < mMaxDistance) AddDistancesForAtoms(atomsI, atomsJ, dist, symop); } } // Store as a sparse CSR compressed matrix std::size_t nnz = dist.size(); mA.reserve(nnz); mIA.reserve(dim + 1); mJA.reserve(nnz); std::size_t lastR = 0; mIA.push_back(0); for (const auto &[key, value] : dist) { std::size_t col, row; std::tie(row, col) = key; if (row != lastR) // new row { for (std::size_t ri = lastR; ri < row; ++ri) mIA.push_back(mA.size()); lastR = row; } mA.push_back(value); mJA.push_back(col); } for (std::size_t ri = lastR; ri < dim; ++ri) mIA.push_back(mA.size()); } // -------------------------------------------------------------------- void DistanceMap::AddDistancesForAtoms(const std::vector> &a, const std::vector> &b, DistMap &dm) { for (const auto &[ixa, loc_a] : a) { for (const auto &[ixb, loc_b] : b) { if (ixa == ixb) continue; float d = cif::distance_squared(loc_a, loc_b); if (d > mMaxDistanceSQ) continue; d = std::sqrt(d); dm[std::make_tuple(ixa, ixb)] = std::make_tuple(d, cif::sym_op{}, false); dm[std::make_tuple(ixb, ixa)] = std::make_tuple(d, cif::sym_op{}, false); } } } void DistanceMap::AddDistancesForAtoms(const std::vector> &a, const std::vector> &b, DistMap &dm, cif::sym_op symop) { for (const auto &[ixa, loc_a] : a) { for (const auto &[ixb, loc_b] : b) { if (ixa == ixb) continue; float d = cif::distance_squared(loc_a, crystal.symmetry_copy(loc_b, symop)); if (d > mMaxDistanceSQ) continue; d = std::sqrt(d); dm[std::make_tuple(ixa, ixb)] = std::make_tuple(d, symop, false); dm[std::make_tuple(ixb, ixa)] = std::make_tuple(d, symop, true); } } } float DistanceMap::operator()(const std::string &a, const std::string &b) const { std::size_t ixa, ixb; try { ixa = index.at(a); } catch (const std::out_of_range &ex) { throw std::out_of_range("atom " + a + " not found in distance map"); } try { ixb = index.at(b); } catch (const std::out_of_range &ex) { throw std::out_of_range("atom " + b + " not found in distance map"); } // if (ixb < ixa) // std::swap(ixa, ixb); std::size_t L = mIA[ixa]; std::size_t R = mIA[ixa + 1] - 1; while (L <= R) { std::size_t i = (L + R) / 2; if (mJA[i] == ixb) return std::get<0>(mA[i]); if (mJA[i] < ixb) L = i + 1; else R = i - 1; } return 100.f; } std::vector DistanceMap::near(const cif::mm::atom &atom, float maxDistance) const { using namespace cif::literals; assert(maxDistance <= mMaxDistance); if (maxDistance > mMaxDistance) throw std::runtime_error("Invalid max distance in DistanceMap::near"); std::string a_id = atom.id(); std::string alta = atom.get_label_alt_id(); std::size_t ixa; try { ixa = index.at(a_id); } catch (const std::out_of_range &ex) { throw std::runtime_error("atom " + a_id + " not found in distance map"); } std::vector result; auto rh = atom.get_row(); auto &atom_site = rh.get_category(); for (std::size_t i = mIA[ixa]; i < mIA[ixa + 1]; ++i) { const auto &[d, symop, inverse] = mA[i]; if (d > maxDistance) continue; std::size_t ixb = mJA[i]; std::string b_id = rIndex.at(ixb); auto altb = atom_site.find_first("id"_key == b_id, "label_alt_id"); if (altb != alta and not altb.empty() and not alta.empty()) continue; auto atom_b = mStructure.get_atom_by_id(b_id); if (symop) { cif::point p = atom_b.get_location(); if (inverse) p = crystal.inverse_symmetry_copy(p, symop); else p = crystal.symmetry_copy(p, symop); result.emplace_back(atom_b, p, symop.string()); } else result.emplace_back(atom_b); } return result; } } // namespace pdb_redo libpdb-redo-3.3.0/src/MapMaker.cpp0000644000175000017500000010212314773016616016542 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include "pdb-redo/ClipperWrapper.hpp" #include "pdb-redo/MapMaker.hpp" #include "pdb-redo/ResolutionCalculator.hpp" #include "pdb-redo/Statistics.hpp" #ifdef _MSC_VER #include #define mkstemp _mktemp #endif namespace fs = std::filesystem; namespace pdb_redo { // -------------------------------------------------------------------- // a private ccp4 map file implementation // 1 NC # of Columns (fastest changing in map) // 2 NR # of Rows // 3 NS # of Sections (slowest changing in map) // 4 MODE Data type // 0 = envelope stored as signed bytes (from // -128 lowest to 127 highest) // 1 = Image stored as Integer*2 // 2 = Image stored as Reals // 3 = Transform stored as Complex Integer*2 // 4 = Transform stored as Complex Reals // 5 == 0 // Note: Mode 2 is the normal mode used in // the CCP4 programs. Other modes than 2 and 0 // may NOT WORK // 5 NCSTART Number of first COLUMN in map // 6 NRSTART Number of first ROW in map // 7 NSSTART Number of first SECTION in map // 8 NX Number of intervals along X // 9 NY Number of intervals along Y // 10 NZ Number of intervals along Z // 11 X length Cell Dimensions (Angstroms) // 12 Y length " // 13 Z length " // 14 Alpha Cell Angles (Degrees) // 15 Beta " // 16 Gamma " // 17 MAPC Which axis corresponds to Cols. (1,2,3 for X,Y,Z) // 18 MAPR Which axis corresponds to Rows (1,2,3 for X,Y,Z) // 19 MAPS Which axis corresponds to Sects. (1,2,3 for X,Y,Z) // 20 AMIN Minimum density value // 21 AMAX Maximum density value // 22 AMEAN Mean density value (Average) // 23 ISPG Space group number // 24 NSYMBT Number of bytes used for storing symmetry operators // 25 LSKFLG Flag for skew transformation, =0 none, =1 if foll // 26-34 SKWMAT Skew matrix S (in order S11, S12, S13, S21 etc) if // LSKFLG .ne. 0. // 35-37 SKWTRN Skew translation t if LSKFLG .ne. 0. // Skew transformation is from standard orthogonal // coordinate frame (as used for atoms) to orthogonal // map frame, as // Xo(map) = S * (Xo(atoms) - t) // 38 future use (some of these are used by the MSUBSX routines // . " in MAPBRICK, MAPCONT and FRODO) // . " (all set to zero by default) // . " // 52 " // 53 MAP Character string 'MAP ' to identify file type // 54 MACHST Machine stamp indicating the machine type // which wrote file // 55 ARMS Rms deviation of map from mean density // 56 NLABL Number of labels being used // 57-256 LABEL(20,10) 10 80 character text labels (ie. A4 format) enum CCP4MapFileMode : uint32_t { AS_REALS = 2 // do not support anything else for now... }; struct CCP4MapFileHeader { uint32_t NC, NR, NS; CCP4MapFileMode MODE; int32_t NCSTART, NRSTART, NSSTART; uint32_t NX, NY, NZ; float cellLengths[3]; float cellAngles[3]; uint32_t MAPC, MAPR, MAPS; float AMIN, AMAX, AMEAN; uint32_t ISPG; uint32_t NSYMBT; uint32_t LSKFLG; float SKWMAT[9]; float SKWTRN[3]; uint32_t UNUSED[15]; char MAP[4] = {'M', 'A', 'P', ' '}; uint32_t MACHST = 0x00004144; float ARMS; uint32_t NLABL = 1; char LABEL[200 * 4]; }; template std::tuple CalculateMapStatistics(const clipper::Xmap &xmap, clipper::Grid_range r) { FTYPE amin = std::numeric_limits::max(), amax = std::numeric_limits::min(); long double asum = 0, asum2 = 0; std::size_t n = 0; clipper::Xmap_base::Map_reference_coord c(xmap); for (int g0 = r.min()[0]; g0 <= r.max()[0]; ++g0) for (int g1 = r.min()[1]; g1 <= r.max()[1]; ++g1) for (int g2 = r.min()[2]; g2 <= r.max()[2]; ++g2) { c.set_coord({g0, g1, g2}); FTYPE v = xmap[c]; asum += v; asum2 += v * v; if (amin > v) amin = v; if (amax < v) amax = v; ++n; } FTYPE mean = static_cast(asum / n); FTYPE rmsd = static_cast(std::sqrt((asum2 / n) - (mean * mean))); return std::make_tuple(amin, amax, mean, rmsd); } template void writeCCP4MapFile(std::ostream &os, clipper::Xmap &xmap, clipper::Grid_range range) { static_assert(sizeof(CCP4MapFileHeader) == 256 * 4, "Map header is of incorrect size"); // static_assert(__BYTE_ORDER == __LITTLE_ENDIAN, "Code for big endian systems is not implemented yet"); auto &spacegroup = xmap.spacegroup(); int spaceGroupNumber = spacegroup.descr().spacegroup_number(); int orderFMS[3] = {3, 1, 2}; switch (spaceGroupNumber) { case 1: case 2: case 3: case 4: case 10: case 16: case 17: case 18: case 20: case 21: case 23: orderFMS[0] = 2; orderFMS[2] = 3; break; } int orderXYZ[3]; for (int i = 0; i < 3; ++i) orderXYZ[orderFMS[i] - 1] = i; int grid[3], gridFMSMin[3], gridFMSMax[3], dim[3]; for (int i = 0; i < 3; ++i) { grid[i] = xmap.grid_sampling()[i]; gridFMSMin[orderXYZ[i]] = range.min()[i]; gridFMSMax[orderXYZ[i]] = range.max()[i]; } for (std::size_t i = 0; i < 3; ++i) dim[i] = gridFMSMax[i] - gridFMSMin[i] + 1; auto cellDescription = xmap.cell().descr(); CCP4MapFileHeader h = {}; int r = snprintf(h.LABEL, sizeof(h.LABEL), "%s", "Map created with map-maker from the PDB-REDO suite of applications"); for (std::size_t i = r; i < sizeof(h.LABEL); ++i) h.LABEL[i] = ' '; h.NC = dim[0]; h.NR = dim[1]; h.NS = dim[2]; h.MODE = AS_REALS; h.NCSTART = gridFMSMin[0]; h.NRSTART = gridFMSMin[1]; h.NSSTART = gridFMSMin[2]; h.NX = grid[0]; h.NY = grid[1]; h.NZ = grid[2]; h.cellLengths[0] = cellDescription.a(); h.cellLengths[1] = cellDescription.b(); h.cellLengths[2] = cellDescription.c(); h.cellAngles[0] = cellDescription.alpha_deg(); h.cellAngles[1] = cellDescription.beta_deg(); h.cellAngles[2] = cellDescription.gamma_deg(); h.MAPC = orderFMS[0]; h.MAPR = orderFMS[1]; h.MAPS = orderFMS[2]; h.ISPG = spaceGroupNumber; h.NSYMBT = spacegroup.num_symops() * 80; std::tie(h.AMIN, h.AMAX, h.AMEAN, h.ARMS) = CalculateMapStatistics(xmap, range); os.write(reinterpret_cast(&h), sizeof(h)); const std::string kSpaces(80, ' '); for (int si = 0; si < spacegroup.num_symops(); ++si) { std::string symop = spacegroup.symop(si).format(); os.write(symop.c_str(), symop.length()); os.write(kSpaces.c_str(), 80 - symop.length()); } clipper::Xmap_base::Map_reference_coord c(xmap); const uint32_t kSectionLength = dim[0] * dim[1]; std::vector section(kSectionLength); int g[3]; for (g[2] = gridFMSMin[2]; g[2] <= gridFMSMax[2]; ++g[2]) { auto si = section.begin(); for (g[1] = gridFMSMin[1]; g[1] <= gridFMSMax[1]; ++g[1]) for (g[0] = gridFMSMin[0]; g[0] <= gridFMSMax[0]; ++g[0]) { c.set_coord({g[orderXYZ[0]], g[orderXYZ[1]], g[orderXYZ[2]]}); *si++ = static_cast(xmap[c]); } assert(si == section.end()); os.write(reinterpret_cast(section.data()), kSectionLength * sizeof(float)); } } // -------------------------------------------------------------------- bool IsMTZFile(const fs::path &p) { bool result = false; std::ifstream f(p); if (f.is_open()) { char sig[5] = {}; f.read(sig, 4); result = sig == std::string("MTZ "); } return result; } // -------------------------------------------------------------------- template Map::Map() { } template Map::~Map() { } template void Map::calculateStats() { double sum = 0, sum2 = 0; int count = 0; mMinDensity = std::numeric_limits::max(); mMaxDensity = std::numeric_limits::min(); for (auto ix = mMap.first(); not ix.last(); ix.next()) { auto v = mMap[ix]; if (std::isnan(v)) throw std::runtime_error("map contains NaN values"); if (mMinDensity > v) mMinDensity = v; if (mMaxDensity < v) mMaxDensity = v; ++count; sum += v; sum2 += v * v; } mMeanDensity = sum / count; mRMSDensity = std::sqrt((sum2 / count) - (mMeanDensity * mMeanDensity)); } template void Map::read(const std::filesystem::path &f) { fs::path mapFile(f); fs::path dataFile = mapFile; if (cif::VERBOSE > 0) std::cout << "Reading map from " << mapFile << '\n'; if (mapFile.extension() == ".gz") { // file is compressed fs::path p = mapFile.parent_path(); std::string s = mapFile.filename().string(); cif::gzio::ifstream in(mapFile); char tmpFileName[] = "/tmp/map-tmp-XXXXXX"; if (mkstemp(tmpFileName) < 0) throw std::runtime_error(std::string("Could not create temp file for map: ") + strerror(errno)); dataFile = fs::path(tmpFileName); std::ofstream out(dataFile); if (not in.is_open() or not out.is_open()) throw std::runtime_error("Could not handle compressed map file"); out << in.rdbuf(); } if (not fs::exists(dataFile)) throw std::runtime_error("Could not open map file " + mapFile.string()); using namespace clipper; CCP4MAPfile mapin; mapin.open_read(dataFile.string()); mapin.import_xmap(mMap); mapin.close_read(); if (dataFile != mapFile) fs::remove(dataFile); calculateStats(); } template void Map::write(const std::filesystem::path &f) { write_masked(f, mMap.grid_asu()); } template void Map::write_masked(std::ostream &os, clipper::Grid_range r) { writeCCP4MapFile(os, mMap, r); } template void Map::write_masked(const std::filesystem::path &f, clipper::Grid_range r) { std::ofstream file(f, std::ios_base::binary); if (not file.is_open()) throw std::runtime_error("Could not open map file for writing: " + f.string()); write_masked(file, r); } // -------------------------------------------------------------------- template Map Map::masked(const cif::mm::structure &structure, const std::vector &atoms) const { using clipper::Coord_frac; using clipper::Coord_orth; using clipper::Coord_map; using clipper::Coord_grid; Map result(*this); for (auto &atom : atoms) { float radius = cif::atom_type_traits(atom.get_type()).radius(cif::radius_type::van_der_waals); if (std::isnan(radius)) radius = cif::atom_type_traits(atom.get_type()).radius(cif::radius_type::calculated); if (std::isnan(radius)) // TODO: now what? { std::cerr << "Could not define radius for atom " << atom << '\n'; continue; } float radiusSq = radius * radius; auto o = Coord_orth(radius, radius, radius).coord_frac(mMap.cell()); o[0] = std::abs(o[0]); o[1] = std::abs(o[1]); o[2] = std::abs(o[2]); auto pp = atom.get_location(); Coord_orth cloc = pp; Coord_frac fp = cloc.coord_frac(mMap.cell()); Coord_frac fMin = fp - o, fMax = fp + o; Coord_map mMin = fMin.coord_map(mMap.grid_sampling()), mMax = fMax.coord_map(mMap.grid_sampling()); Coord_grid gMin = mMin.floor(), gMax = mMax.ceil(); auto i0 = clipper::Xmap_base::Map_reference_coord(mMap, gMin); for (auto iu = i0; iu.coord().u() <= gMax[0]; iu.next_u()) for (auto iv = iu; iv.coord().v() <= gMax[1]; iv.next_v()) for (auto iw = iv; iw.coord().w() <= gMax[2]; iw.next_w()) { cif::point gp = iw.coord_orth(); if (distance_squared(gp, pp) < radiusSq) result.mMap[iw] = -10; } } return result; } template float Map::z_weighted_density(const cif::mm::structure &structure, const std::vector &atoms) const { FTYPE result = 0; for (auto &atom : atoms) { clipper::Coord_orth co = atom.get_location(); auto a_cf = co.coord_frac(mMap.cell()); auto a_cm = a_cf.coord_map(mMap.grid_sampling()); FTYPE dv; clipper::Interp_nearest::interp(mMap, a_cm, dv); result += dv * static_cast(atom.get_type() == cif::atom_type::D ? cif::atom_type::H : atom.get_type()); } return result; } // -------------------------------------------------------------------- template class Map; template class Map; // -------------------------------------------------------------------- template MapMaker::MapMaker() { } template MapMaker::~MapMaker() { } template void MapMaker::loadMTZ(const fs::path &f, float samplingRate, std::initializer_list fbLabels, std::initializer_list fdLabels, std::initializer_list foLabels, std::initializer_list fcLabels, std::initializer_list faLabels) { fs::path hklin(f); if (cif::VERBOSE > 0) std::cerr << "Reading map from " << hklin << '\n' << " with labels: FB: " << cif::join(fbLabels, ",") << '\n' << " with labels: FD: " << cif::join(fdLabels, ",") << '\n' << " with labels: FA: " << cif::join(faLabels, ",") << '\n' << " with labels: FO: " << cif::join(foLabels, ",") << '\n' << " with labels: FC: " << cif::join(fcLabels, ",") << '\n'; fs::path dataFile = hklin; if (hklin.extension() == ".gz") { // file is compressed fs::path p = hklin.parent_path(); std::string s = hklin.filename().string(); cif::gzio::ifstream in(hklin); char tmpFileName[] = "/tmp/mtz-tmp-XXXXXX"; if (mkstemp(tmpFileName) < 0) throw std::runtime_error(std::string("Could not create temp file for mtz: ") + strerror(errno)); dataFile = fs::path(tmpFileName); std::ofstream out(dataFile); out << in.rdbuf(); } if (not fs::exists(dataFile)) throw std::runtime_error("Could not open mtz file " + hklin.string()); const std::string kBasePath("/%s/%s/[%s]"); using clipper::CCP4MTZfile; CCP4MTZfile mtzin; mtzin.open_read(dataFile.string()); mtzin.import_hkl_info(mHKLInfo); bool hasFAN = false, hasFREE = false; const std::regex rx(R"(^/[^/]+/[^/]+/(.+) \S$)"); for (auto &label : mtzin.column_labels()) { std::smatch m; if (not std::regex_match(label, m, rx)) continue; if (m[1] == "FAN") { hasFAN = true; continue; } if (m[1] == "FREE") { hasFREE = true; continue; } } mtzin.import_hkl_data(mFbData, cif::format(kBasePath, "*", "*", cif::join(fbLabels, ",")).str()); mtzin.import_hkl_data(mFdData, cif::format(kBasePath, "*", "*", cif::join(fdLabels, ",")).str()); if (hasFAN) mtzin.import_hkl_data(mFaData, cif::format(kBasePath, "*", "*", cif::join(faLabels, ",")).str()); mtzin.import_hkl_data(mFoData, cif::format(kBasePath, "*", "*", cif::join(foLabels, ",")).str()); mtzin.import_hkl_data(mFcData, cif::format(kBasePath, "*", "*", cif::join(fcLabels, ",")).str()); if (hasFREE) mtzin.import_hkl_data(mFreeData, cif::format(kBasePath, "*", "*", "FREE").str()); mtzin.import_hkl_data(mPhiFomData, cif::format(kBasePath, "*", "*", "PHWT,FOM").str()); mtzin.close_read(); if (dataFile != hklin) fs::remove(dataFile); Cell cell = mHKLInfo.cell(); Spacegroup spacegroup = mHKLInfo.spacegroup(); ResolutionCalculator rc(cell); mResHigh = 99; mResLow = 0; for (auto hi = mFoData.first_data(); not hi.last(); hi = mFoData.next_data(hi)) { auto res = rc(hi.hkl().h(), hi.hkl().k(), hi.hkl().l()); if (mResHigh > res) mResHigh = res; if (mResLow < res) mResLow = res; } if (mResLow == 0 and mResHigh == 99) throw std::runtime_error("Empty Fo map"); // fixMTZ(); mGrid.init(spacegroup, cell, mHKLInfo.resolution(), samplingRate); // define grid clipper::Xmap &fbMap = mFb; clipper::Xmap &fdMap = mFd; clipper::Xmap &faMap = mFa; fbMap.init(spacegroup, cell, mGrid); // define map fbMap.fft_from(mFbData); // generate map fdMap.init(spacegroup, cell, mGrid); // define map fdMap.fft_from(mFdData); // generate map if (not mFaData.is_null()) { faMap.init(spacegroup, cell, mGrid); faMap.fft_from(mFaData); } if (cif::VERBOSE > 0) { std::cerr << "Read Xmaps with sampling rate: " << samplingRate << '\n' << " stored resolution: " << mHKLInfo.resolution().limit() << '\n' << " calculated reshi = " << mResHigh << " reslo = " << mResLow << '\n' << " spacegroup: " << spacegroup.symbol_hm() << '\n' << " cell: " << cell.format() << '\n' << " grid: " << mGrid.format() << '\n'; printStats(); } mFb.calculateStats(); mFd.calculateStats(); } // -------------------------------------------------------------------- template void MapMaker::loadMaps(const fs::path &fbMapFile, const fs::path &fdMapFile, float reshi, float reslo) { mResHigh = reshi; mResLow = reslo; mFb.read(fbMapFile); mFd.read(fdMapFile); if (not mFb.cell().equals(mFd.cell())) throw std::runtime_error("Fb and Fd map do not contain the same cell"); clipper::Resolution reso(reshi); mHKLInfo.init(mFb.spacegroup(), mFb.cell(), reso, true); mGrid = mFb.get().grid_sampling(); } // -------------------------------------------------------------------- std::ostream &operator<<(std::ostream &os, const clipper::HKL &hkl) { os << "h: " << hkl.h() << ", " << "k: " << hkl.k() << ", " << "l: " << hkl.l(); return os; }; // -------------------------------------------------------------------- template void MapMaker::calculate(const fs::path &hklin, const cif::mm::structure &structure, bool noBulk, AnisoScalingFlag anisoScaling, float samplingRate, bool electronScattering, std::initializer_list foLabels, std::initializer_list freeLabels) { if (IsMTZFile(hklin)) loadFoFreeFromMTZFile(hklin, foLabels, freeLabels); else loadFoFreeFromReflectionsFile(hklin); recalc(structure, noBulk, anisoScaling, samplingRate, electronScattering); } // -------------------------------------------------------------------- template void MapMaker::loadFoFreeFromReflectionsFile(const fs::path &hklin) { using clipper::HKL; cif::file reflnsFile(hklin); auto &reflns = reflnsFile.front(); // m_xname = reflns["exptl_crystal"].front()["id"].as(); // m_pname = reflns["entry"].front()["id"].as(); float a, b, c, alpha, beta, gamma; cif::tie(a, b, c, alpha, beta, gamma) = reflns["cell"].front().get( "length_a", "length_b", "length_c", "angle_alpha", "angle_beta", "angle_gamma"); using clipper::Cell_descr; Cell cell = Cell(Cell_descr{a, b, c, alpha, beta, gamma}); // if (not cell2.equals(m_cell)) // throw std::runtime_error("Reflections file and coordinates file do not agree upon the cell parameters"); // -------------------------------------------------------------------- // Read reflections file to calculate resolution low and high ResolutionCalculator rc(a, b, c, alpha, beta, gamma); double hires = 99; for (auto r : reflns["refln"]) { int h, k, l; cif::tie(h, k, l) = r.get("index_h", "index_k", "index_l"); double res = rc(h, k, l); if (hires > res) hires = res; } std::string spacegroupDescr = reflns["symmetry"].front()["space_group_name_H-M"].as(); auto spacegroup = Spacegroup(clipper::Spgr_descr{spacegroupDescr}); mHKLInfo = HKL_info(spacegroup, cell, clipper::Resolution{hires}, true); // m_crystal = MTZcrystal(m_xname, m_pname, m_cell); mFoData.init(mHKLInfo, mHKLInfo.cell()); mFreeData.init(mHKLInfo, mHKLInfo.cell()); for (auto ih = mFreeData.first(); not ih.last(); ih.next()) mFreeData[ih].set_null(); // -------------------------------------------------------------------- enum FreeRConvention { frXPLO, frCCP4 } freeRConvention = frXPLO; int freeRefl = 1, workRefl = 0; if (false /*m_statusXPLO*/) { freeRConvention = frCCP4; freeRefl = 0; workRefl = 1; } bool first = false; for (auto r : reflns["refln"]) { int h, k, l; char flag; float F, sigF; cif::tie(h, k, l, flag, F, sigF) = r.get("index_h", "index_k", "index_l", "status", "F_meas_au", "F_meas_sigma_au"); int ix = mHKLInfo.index_of(HKL{h, k, l}); if (ix < 0) { if (cif::VERBOSE > 0) std::cerr << "Ignoring hkl(" << h << ", " << k << ", " << l << ")\n"; continue; } if (first and (flag == freeRefl or flag == workRefl)) { std::cerr << "Non-standard _refln.status column detected\n" << "Assuming " << (freeRConvention == frXPLO ? "XPLOR" : "CCP4") << " convention for free R flag\n"; first = false; } mFoData[ix] = F_sigF(F, sigF); switch (flag) { case 'o': case 'h': case 'l': mFreeData[ix] = Flag(1); break; case 'f': mFreeData[ix] = Flag(0); break; case '0': case '1': mFreeData[ix] = Flag(workRefl == flag ? 1 : 0); break; default: if (cif::VERBOSE > 1) std::cerr << "Unexpected value in status: '" << flag << "' for hkl(" << h << ", " << k << ", " << l << ")\n"; break; } } } // -------------------------------------------------------------------- template void MapMaker::loadFoFreeFromMTZFile(const fs::path &hklin, std::initializer_list foLabels, std::initializer_list freeLabels) { if (cif::VERBOSE > 0) std::cerr << "Recalculating maps from " << hklin << '\n'; const std::string kBasePath("/%s/%s/[%s]"); using clipper::CCP4MTZfile; CCP4MTZfile mtzin; mtzin.open_read(hklin.string()); mtzin.import_hkl_info(mHKLInfo); mtzin.import_hkl_data(mFoData, cif::format(kBasePath, "*", "*", cif::join(foLabels, ",")).str()); mtzin.import_hkl_data(mFreeData, cif::format(kBasePath, "*", "*", cif::join(freeLabels, ",")).str()); mtzin.close_read(); } // -------------------------------------------------------------------- template void MapMaker::recalc(const cif::mm::structure &structure, bool noBulk, AnisoScalingFlag anisoScaling, float samplingRate, bool electronScattering) { Cell cell = mHKLInfo.cell(); Spacegroup spacegroup = mHKLInfo.spacegroup(); // The calculation work std::vector atoms; for (auto a : structure.atoms()) atoms.push_back(toClipper(a)); mFcData.init(mHKLInfo, cell); if (not electronScattering) { auto &exptl = structure.get_category("exptl"); electronScattering = not exptl.empty() and exptl.front()["method"] == "ELECTRON CRYSTALLOGRAPHY"; } clipper::ScatteringFactors::selectScattteringFactorsType( electronScattering ? clipper::SF_ELECTRON : clipper::SF_WAASMAIER_KIRFEL); if (noBulk) { clipper::SFcalc_aniso_fft sfc; sfc(mFcData, atoms); } else { clipper::SFcalc_obs_bulk sfcb; sfcb(mFcData, mFoData, atoms); if (cif::VERBOSE > 0) std::cerr << "Bulk correction volume: " << sfcb.bulk_frac() << '\n' << "Bulk correction factor: " << sfcb.bulk_scale() << '\n'; } if (anisoScaling != as_None) { clipper::SFscale_aniso::TYPE F = clipper::SFscale_aniso::F; clipper::SFscale_aniso sfscl; if (anisoScaling == as_Observed) sfscl(mFoData, mFcData); // scale Fobs else sfscl(mFcData, mFoData); // scale Fcal if (cif::VERBOSE > 0) std::cerr << "Anisotropic scaling:\n" << sfscl.u_aniso_orth(F).format() << '\n'; } // now do sigmaa calc mFbData.init(mHKLInfo, cell); mFdData.init(mHKLInfo, cell); mPhiFomData.init(mHKLInfo, cell); HKL_data flag(mHKLInfo, cell); const int freeflag = 0; for (auto ih = mFreeData.first(); not ih.last(); ih.next()) { if (not mFoData[ih].missing() and (mFreeData[ih].missing() or mFreeData[ih].flag() == freeflag)) flag[ih].flag() = clipper::SFweight_spline::BOTH; else flag[ih].flag() = clipper::SFweight_spline::NONE; } // do sigmaa calc clipper::SFweight_spline sfw(mNumRefln, mNumParam); sfw(mFbData, mFdData, mPhiFomData, mFoData, mFcData, flag); // mFbData now contains 2mFo - DFc // mFdData now contains mFo - DFc fixMTZ(); ResolutionCalculator rc(cell); mResHigh = 99; mResLow = 0; for (auto hi = mFoData.first_data(); not hi.last(); hi = mFoData.next_data(hi)) { auto res = rc(hi.hkl().h(), hi.hkl().k(), hi.hkl().l()); if (mResHigh > res) mResHigh = res; if (mResLow < res) mResLow = res; } if (cif::VERBOSE > 1) std::cerr << "calculated reshi = " << mResHigh << " reslo = " << mResLow << '\n'; // samplingRate /= 2; mGrid.init(spacegroup, cell, mHKLInfo.resolution(), samplingRate); // define grid clipper::Xmap &fbMap = mFb; clipper::Xmap &fdMap = mFd; fbMap.init(spacegroup, cell, mGrid); // define map fbMap.fft_from(mFbData); // generate map fdMap.init(spacegroup, cell, mGrid); // define map fdMap.fft_from(mFdData); // generate map if (cif::VERBOSE > 0) { std::cerr << "Read Xmaps with sampling rate: " << samplingRate << '\n' << " resolution: " << mResHigh << '\n' << " cell: " << cell.format() << '\n' << " grid: " << mGrid.format() << '\n'; printStats(); } mFb.calculateStats(); mFd.calculateStats(); } template void MapMaker::fixMTZ() { Spacegroup spacegroup = mHKLInfo.spacegroup(); enum { A1, // A1: FC = 2mFo - FM A2, // A2: FC >= 2mFo - FM A3, // A3: FD = FM - mFo A4, // A4: FD = 2(FM - mFo) C5, // C5: FC = 2mFo - FM C6, // C6: FM = mFo C7, // C7: FD = mFo - FC C8, // C8: FD = 2(mFo - FC) C9, // C9: FD <= mFo - FC T10, // 10: FM = FC (unobserved only) T11, // 11: FD = 0 (unobserved only) TestCount }; std::vector tests(TestCount, true); // first run the tests to see if we need to fix anything if (cif::VERBOSE > 0) std::cerr << "Testing MTZ file\n"; for (auto ih = mFbData.first(); not ih.last(); ih.next()) { clipper::HKL_class cls(spacegroup, ih.hkl()); auto W = mPhiFomData[ih].fom(); auto FM = mFbData[ih].f(); auto PM = mFbData[ih].phi() * 180 / kPI; auto FD = mFdData[ih].f(); auto PD = mFdData[ih].phi() * 180 / kPI; auto FO = mFoData[ih].f(); auto FC = mFcData[ih].f(); auto PC = mFcData[ih].phi() * 180 / kPI; auto WFO = W * FO; if (std::abs(std::fmod(std::abs(PM - PC) + 180, 360) - 180) > 90) FM = -FM; if (std::abs(std::fmod(std::abs(PD - PC) + 180, 360) - 180) > 90) FD = -FD; if (mFoData[ih].missing() or W == 0) { if (tests[T10] and std::abs(FM - FC) > 0.05) { tests[T10] = false; if (cif::VERBOSE > 0) std::cerr << "Test 10 failed at " << ih.hkl() << '\n'; } if (tests[T11] and std::abs(FD) > 0.05) { tests[T11] = false; if (cif::VERBOSE > 0) std::cerr << "Test 11 failed at " << ih.hkl() << '\n'; } } else if (cls.centric()) { if (tests[C5] and std::abs(FC + FM - 2 * WFO) > 0.05) { tests[C5] = false; if (cif::VERBOSE > 0) std::cerr << "Test C5 failed at " << ih.hkl() << '\n'; } if (tests[C6] and std::abs(FM - WFO) > 0.05) { tests[C6] = false; if (cif::VERBOSE > 0) std::cerr << "Test C6 failed at " << ih.hkl() << '\n'; } if (tests[C7] and std::abs(FC + FD - WFO) > 0.05) { tests[C7] = false; if (cif::VERBOSE > 0) std::cerr << "Test C7 failed at " << ih.hkl() << '\n'; } if (tests[C8] and std::abs(FC + 0.5 * FD - WFO) > 0.05) { tests[C8] = false; if (cif::VERBOSE > 0) std::cerr << "Test C8 failed at " << ih.hkl() << '\n'; } if (tests[C9] and (1.01 * FC + FD - WFO) < -0.05) { tests[C9] = false; if (cif::VERBOSE > 0) std::cerr << "Test C9 failed at " << ih.hkl() << '\n'; } } else { if (tests[A1] and std::abs(FC + FM - 2 * WFO) > 0.05) { tests[A1] = false; if (cif::VERBOSE > 0) std::cerr << "Test A1 failed at " << ih.hkl() << '\n'; } if (tests[A2] and 1.01 * FC + FM - 2 * WFO < -0.05) { tests[A2] = false; if (cif::VERBOSE > 0) std::cerr << "Test A2 failed at " << ih.hkl() << '\n'; } if (tests[A3] and std::abs(FM - FD - WFO) > 0.05) { tests[A3] = false; if (cif::VERBOSE > 0) std::cerr << "Test A3 failed at " << ih.hkl() << '\n'; } if (tests[A4] and std::abs(FM - 0.5 * FD - WFO) > 0.05) { tests[A4] = false; if (cif::VERBOSE > 0) std::cerr << "Test A4 failed at " << ih.hkl() << '\n'; } } } using clipper::HKL_class; using clipper::data32::F_phi; const F_phi fzero(0, 0); // mtzfix... for (auto ih = mFbData.first(); not ih.last(); ih.next()) { if (mFbData[ih].missing() or mFdData[ih].missing()) continue; auto PM = mFbData[ih].phi() * 180 / kPI; auto PD = mFdData[ih].phi() * 180 / kPI; auto PC = mFcData[ih].phi() * 180 / kPI; if (std::abs(std::fmod(std::abs(PM - PC) + 180, 360) - 180) > 90) { mFbData[ih].f() = -mFbData[ih].f(); mFbData[ih].phi() = mFcData[ih].phi(); } if (std::abs(std::fmod(std::abs(PD - PC) + 180, 360) - 180) > 90) { mFdData[ih].f() = -mFdData[ih].f(); mFdData[ih].phi() = mFcData[ih].phi(); } auto mFo = mFbData[ih] - mFdData[ih]; HKL_class cls(spacegroup, ih.hkl()); if (not mFoData[ih].missing() and mPhiFomData[ih].fom() > 0) { if (cls.centric()) { if (not tests[C6]) mFbData[ih] = mFo; if (not tests[C7] and tests[C8]) mFdData[ih].f() = mFdData[ih].f() / 2; } else { if (tests[A3] and not tests[A4]) mFdData[ih] = mFdData[ih] + mFdData[ih]; } } else { if (not tests[T10]) { if ((not cls.centric() and tests[A1]) or (cls.centric() and (tests[C5] or tests[C7] or tests[C8]))) { mFbData[ih] = mFcData[ih]; } } if (not tests[T11]) mFdData[ih] = fzero; } } } template void MapMaker::printStats() { // calc R and R-free std::vector params(mNumParam, 1.0); clipper::BasisFn_spline basisfn(mFoData, mNumParam, 1.0); clipper::TargetFn_scaleF1F2 targetfn(mFcData, mFoData); clipper::ResolutionFn rfn(mHKLInfo, basisfn, targetfn, params); double r1w = 0, f1w = 0, r1f = 0, f1f = 0; const int freeflag = 0; for (auto ih = mFoData.first_data(); not ih.last(); ih = mFoData.next_data(ih)) { if (mFcData[ih].missing()) continue; // throw std::runtime_error("missing Fc"); double Fo = mFoData[ih].f(); double Fc = std::sqrt(rfn.f(ih)) * mFcData[ih].f(); if (mFreeData[ih].flag() == freeflag) { r1f += fabs(Fo - Fc); f1f += Fo; } else { r1w += fabs(Fo - Fc); f1w += Fo; } } if (f1f < 0.1) f1f = 0.1; r1f /= f1f; if (f1w < 0.1) f1w = 0.1; r1w /= f1w; std::cerr << "R-factor : " << r1w << '\n' << "Free R-factor : " << r1f << '\n'; } template void MapMaker::writeMTZ(const fs::path &file, const std::string &pname, const std::string &cname) { if (mHKLInfo.is_null()) throw std::runtime_error("HKL info not initialized"); clipper::CCP4MTZfile mtz; clipper::MTZdataset dataset(pname, 0); clipper::MTZcrystal crystal(cname, pname, mHKLInfo.cell()); const std::string col = "/" + pname + "/" + cname + "/"; mtz.open_write(file.string()); mtz.export_hkl_info(mHKLInfo); mtz.export_crystal(crystal, col); mtz.export_dataset(dataset, col); if (not mFreeData.is_null()) mtz.export_hkl_data(mFreeData, col + "[FREE]"); if (not mFoData.is_null()) mtz.export_hkl_data(mFoData, col + "[FP,SIGFP]"); if (not mFcData.is_null()) mtz.export_hkl_data(mFcData, col + "[FC_ALL,PHIC_ALL]"); if (not mFbData.is_null()) mtz.export_hkl_data(mFbData, col + "[FWT,PHWT]"); if (not mFdData.is_null()) mtz.export_hkl_data(mFdData, col + "[DELFWT,PHDELWT]"); if (not mPhiFomData.is_null()) mtz.export_hkl_data(mPhiFomData, col + "[PHI,FOM]"); mtz.close_write(); } template class MapMaker; template class MapMaker; } // namespace pdb_redo libpdb-redo-3.3.0/src/Minimizer.cpp0000644000175000017500000011412314773016616017013 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Created by: Maarten L. Hekkelman Date: dinsdag 22 mei, 2018 */ #include #include #include #include #include "pdb-redo/Minimizer.hpp" namespace fs = std::filesystem; namespace pdb_redo { // -------------------------------------------------------------------- const uint32_t kRefSentinel = std::numeric_limits::max(); const double kMaxNonBondedContactDistance = 10.0, kMaxPeptideBondLength = 3.5, kMaxPeptideBondLengthSq = kMaxPeptideBondLength * kMaxPeptideBondLength; const double kDefaultMapWeight = 60, kDefaultPlane5ESD = 0.11, kDefaultChiralVolumeESD = 0.2; // -------------------------------------------------------------------- struct lessAtom { bool operator()(const cif::mm::atom &a, const cif::mm::atom &b) const { return a.id().compare(b.id()) < 0; } }; typedef std::set AtomSet; // -------------------------------------------------------------------- DPoint AtomLocationProvider::operator[](AtomRef atomID) const { if (atomID >= mAtoms.size()) throw std::range_error("Unknown atom " + std::to_string(atomID)); return mAtoms[atomID].get_location(); } std::string AtomLocationProvider::atom(AtomRef atomID) const { if (atomID >= mAtoms.size()) throw std::range_error("Unknown atom " + std::to_string(atomID)); auto &a = mAtoms[atomID]; auto seq_id = a.get_label_seq_id(); std::string symmetry; if (a.symmetry() != "1_555") symmetry = " " + a.symmetry(); return a.get_label_asym_id() + (seq_id ? std::to_string(seq_id) : a.get_auth_seq_id()) + ' ' + a.get_label_atom_id() + symmetry; } // -------------------------------------------------------------------- Minimizer::Minimizer(const cif::mm::structure &structure) : mStructure(structure) { } void Minimizer::addResidue(const cif::mm::residue &res) { auto compound = CompoundFactory::instance().create(res.get_compound_id()); // r.get_compound(); if (not compound) throw std::runtime_error("Missing compound information for " + res.get_compound_id()); for (auto a : res.atoms()) { (void)ref(a); mAtoms.push_back(a); } for (auto &b : compound->bonds()) { try { if (compound->get_atom_by_atom_id(b.atomID[0]).typeSymbol == cif::H or compound->get_atom_by_atom_id(b.atomID[1]).typeSymbol == cif::H) { continue; } cif::mm::atom a1 = res.get_atom_by_atom_id(b.atomID[0]); cif::mm::atom a2 = res.get_atom_by_atom_id(b.atomID[1]); if (not(a1 and a2)) continue; mBondRestraints.emplace_back(ref(a1), ref(a2), b.distance, b.esd); } catch (const std::exception &ex) { if (cif::VERBOSE > 1) std::cerr << "While processing bond restraints: " << ex.what() << '\n'; continue; } } for (auto &a : compound->angles()) { try { if (compound->get_atom_by_atom_id(a.atomID[0]).typeSymbol == cif::H or compound->get_atom_by_atom_id(a.atomID[1]).typeSymbol == cif::H or compound->get_atom_by_atom_id(a.atomID[2]).typeSymbol == cif::H) { continue; } cif::mm::atom a1 = res.get_atom_by_atom_id(a.atomID[0]); cif::mm::atom a2 = res.get_atom_by_atom_id(a.atomID[1]); cif::mm::atom a3 = res.get_atom_by_atom_id(a.atomID[2]); if (not(a1 and a2 and a3)) continue; mAngleRestraints.emplace_back( ref(a1), ref(a2), ref(a3), a.angle, a.esd); } catch (const std::exception &ex) { if (cif::VERBOSE > 1) std::cerr << "While processing angle restraints: " << ex.what() << '\n'; continue; } } for (auto &a : compound->torsions()) { if (a.esd == 0) continue; try { if (compound->get_atom_by_atom_id(a.atomID[0]).typeSymbol == cif::H or compound->get_atom_by_atom_id(a.atomID[1]).typeSymbol == cif::H or compound->get_atom_by_atom_id(a.atomID[2]).typeSymbol == cif::H or compound->get_atom_by_atom_id(a.atomID[3]).typeSymbol == cif::H) { continue; } cif::mm::atom a1 = res.get_atom_by_atom_id(a.atomID[0]); cif::mm::atom a2 = res.get_atom_by_atom_id(a.atomID[1]); cif::mm::atom a3 = res.get_atom_by_atom_id(a.atomID[2]); cif::mm::atom a4 = res.get_atom_by_atom_id(a.atomID[3]); if (a1 and a2 and a3 and a4) mTorsionRestraints.emplace_back(ref(a1), ref(a2), ref(a3), ref(a4), a.angle, a.esd, a.period); } catch (const std::exception &ex) { if (cif::VERBOSE > 1) std::cerr << "While processing torsion restraints: " << ex.what() << '\n'; continue; } } for (auto &cv : compound->chiralCentres()) { try { if (compound->get_atom_by_atom_id(cv.atomID[0]).typeSymbol == cif::H or compound->get_atom_by_atom_id(cv.atomID[1]).typeSymbol == cif::H or compound->get_atom_by_atom_id(cv.atomID[2]).typeSymbol == cif::H) { continue; } cif::mm::atom cc = res.get_atom_by_atom_id(cv.atomIDCentre); cif::mm::atom a1 = res.get_atom_by_atom_id(cv.atomID[0]); cif::mm::atom a2 = res.get_atom_by_atom_id(cv.atomID[1]); cif::mm::atom a3 = res.get_atom_by_atom_id(cv.atomID[2]); if (not(cc and a1 and a2 and a3)) continue; auto volume = compound->chiralVolume(cv.id); mChiralVolumeRestraints.emplace_back(ref(cc), ref(a1), ref(a2), ref(a3), volume * 6); } catch (const std::exception &ex) { if (cif::VERBOSE > 1) std::cerr << "While processing chiral volume restraints: " << ex.what() << '\n'; continue; } } for (auto &p : compound->planes()) { try { std::vector atoms; for (auto a : p.atomID) { if (compound->get_atom_by_atom_id(a).typeSymbol == cif::H) continue; auto a1 = res.get_atom_by_atom_id(a); if (not a1) continue; atoms.push_back(ref(a1)); } if (atoms.size() > 3) mPlanarityRestraints.emplace_back(std::move(atoms), p.esd); } catch (const std::exception &ex) { if (cif::VERBOSE > 1) std::cerr << "While processing planarity restraints: " << ex.what() << '\n'; continue; } } } void Minimizer::addPolySection(const cif::mm::polymer &poly, int first, int last) { const cif::mm::monomer *prev = nullptr; // used to link residues for (auto &r : poly) { if (r.get_seq_id() < first) { prev = &r; continue; } if (r.get_seq_id() <= last) addResidue(r); if (prev != nullptr) try { cif::mm::atom c = prev->get_atom_by_atom_id("C"), n = r.get_atom_by_atom_id("N"); if (c and n and distance_squared(c, n) < kMaxPeptideBondLengthSq) { bool trans = not cif::mm::monomer::is_cis(*prev, r); if (trans) addLinkRestraints(*prev, r, "C", "N", r.get_compound_id() == "PRO" ? "PTRANS" : "TRANS"); else addLinkRestraints(*prev, r, "C", "N", r.get_compound_id() == "PRO" ? "PCIS" : "CIS"); if (trans) { cif::mm::atom ca1 = prev->get_atom_by_atom_id("CA"); cif::mm::atom ca2 = r.get_atom_by_atom_id("CA"); mTransPeptideRestraints.emplace_back(TransPeptideRestraint{ ref(ca1), ref(c), ref(n), ref(ca2) }); } // add planar restraints std::vector atoms = { ref(prev->get_atom_by_atom_id("CA")), ref(c), ref(prev->get_atom_by_atom_id("O")), ref(n), ref(r.get_atom_by_atom_id("CA")) }; mPlanarityRestraints.emplace_back(PlanarityRestraint{ std::move(atoms), kDefaultPlane5ESD }); } } catch (const std::exception &ex) { if (cif::VERBOSE > 1) std::cerr << "While processing plane-5-atoms restraints: " << ex.what() << '\n'; // continue; } if (r.get_seq_id() > last) break; prev = &r; } // Add link BondRestraints // for (auto& a1: mAtoms) // { // // TODO: implement based on struct_conn information and radii from ener_lib? // } } void Minimizer::addDensityMap(const XMap &xMap, float mapWeight) { std::vector> densityAtoms; densityAtoms.reserve(mAtoms.size()); transform(mAtoms.begin(), mAtoms.end(), back_inserter(densityAtoms), [this](const cif::mm::atom &a) { double z = static_cast(a.get_type()); double weight = 1; double occupancy = a.get_occupancy(); if (occupancy > 1) occupancy = 1; // TODO: cryo_em support return std::make_pair(ref(a), z * weight * occupancy); }); mDensityRestraint.reset(new DensityRestraint(std::move(densityAtoms), xMap, mapWeight)); } void Minimizer::Finish(const cif::crystal &crystal) { if (mAtoms.empty()) throw std::runtime_error("No atoms to refine"); fs::path enerLibFilePath(getenv("CLIBD_MON")); enerLibFilePath /= "ener_lib.cif"; cif::file enerLibFile(enerLibFilePath); auto &db = enerLibFile["energy"]; auto &libAtom = db["lib_atom"]; std::set> nbc; BondMap bm = createBondMap(); // const BondMap &bm = mBonds; auto add_nbc = [this, &nbc, &libAtom, &bm](const cif::mm::atom &a1, const cif::mm::atom &a2) { AtomRef ra1 = ref(a1); AtomRef ra2 = ref(a2); if (nbc.count(std::make_tuple(ra1, ra2))) return; if (find_if(mAngleRestraints.begin(), mAngleRestraints.end(), [&](auto &ar) { return (ar.mA == ra1 and ar.mC == ra2) or (ar.mA == ra2 and ar.mC == ra1); }) != mAngleRestraints.end()) return; if ((a1.get_label_comp_id() == "PRO" or a1.get_label_comp_id() == "HYP") and a1.get_label_seq_id() == a2.get_label_seq_id() + 1 and a1.get_label_atom_id() == "CD") { return; } if ((a2.get_label_comp_id() == "PRO" or a2.get_label_comp_id() == "HYP") and a2.get_label_seq_id() == a1.get_label_seq_id() + 1 and a2.get_label_atom_id() == "CD") { return; } if ((a1.get_label_comp_id() == "ASN" or a2.get_label_comp_id() == "NAG") and a1.get_label_atom_id() == "OD1" and a2.get_label_atom_id() == "C1") { return; } if ((a1.get_label_comp_id() == "NAG" or a2.get_label_comp_id() == "ASN") and a1.get_label_atom_id() == "C1" and a2.get_label_atom_id() == "OD1") { return; } double minDist = 2.8; if (bm.is1_4(a1, a2)) { if (cif::VERBOSE > 1) std::cerr << "1_4 for " << a1 << " and " << a2 << '\n'; minDist = 2.64; } else if ((a1.get_label_seq_id() + 1 == a2.get_label_seq_id() and a1.get_label_atom_id() == "O" and a2.get_label_atom_id() == "C") or (a2.get_label_seq_id() + 1 == a1.get_label_seq_id() and a2.get_label_atom_id() == "O" and a1.get_label_atom_id() == "C")) { minDist = 2.84; } else { try { auto c1 = CompoundFactory::instance().create(a1.get_label_comp_id()); auto c2 = CompoundFactory::instance().create(a2.get_label_comp_id()); std::string et1 = c1->get_atom_by_atom_id(a1.get_label_atom_id()).typeEnergy; std::string et2 = c2->get_atom_by_atom_id(a2.get_label_atom_id()).typeEnergy; if (not(et1.empty() or et2.empty())) { auto r1 = libAtom.find(cif::key("type") == et1); auto r2 = libAtom.find(cif::key("type") == et2); if (not(r1.empty() or r2.empty())) { if (cif::atom_type_traits(a1.get_type()).is_metal()) minDist = r1.front()["ion_radius"].as(); else minDist = r1.front()["vdw_radius"].as(); if (cif::atom_type_traits(a2.get_type()).is_metal()) minDist += r2.front()["ion_radius"].as(); else minDist += r2.front()["vdw_radius"].as(); // OK, now that we're here, see if the atoms are in the same residue... if (a1.get_label_asym_id() == a2.get_label_asym_id() and a1.get_label_seq_id() == a2.get_label_seq_id()) minDist *= 0.84; std::string hbType1 = r1.front()["hb_type"].as(), hbType2 = r2.front()["hb_type"].as(); static const std::regex donorRx("B|D|H"), acceptorRx("B|A|H"); if (regex_match(hbType1, donorRx) and regex_match(hbType2, acceptorRx)) { minDist -= 0.5; if (hbType1 == "H") minDist -= 0.3; } if (regex_match(hbType2, donorRx) and regex_match(hbType1, acceptorRx)) { minDist -= 0.5; if (hbType2 == "H") minDist -= 0.3; } } } // so-called strange exceptions in coot code if (find(mAtoms.begin(), mAtoms.end(), a2) == mAtoms.end()) { switch (std::abs(a1.get_label_seq_id() - a2.get_label_seq_id())) { case 1: if ((a1.get_label_atom_id() == "O" and a2.get_label_atom_id() == "CA") or (a1.get_label_atom_id() == "CA" and a2.get_label_atom_id() == "O") or (a1.get_label_atom_id() == "N" and a2.get_label_atom_id() == "CB") or (a1.get_label_atom_id() == "CB" and a2.get_label_atom_id() == "N") or (a1.get_label_atom_id() == "C" and a2.get_label_atom_id() == "CB") or (a1.get_label_atom_id() == "CB" and a2.get_label_atom_id() == "C")) { minDist = 2.7; } break; case 2: if ((a1.get_label_atom_id() == "C" and a2.get_label_atom_id() == "N") or (a1.get_label_atom_id() == "N" and a2.get_label_atom_id() == "C")) { minDist = 2.7; } break; } } } catch (const std::exception &ex) { if (cif::VERBOSE > 0) std::cerr << "err calculating nbc distance: " << ex.what() << '\n'; minDist = 2.8; } } mNonBondedContactRestraints.emplace_back(ra1, ra2, minDist, 0.02); nbc.insert(std::make_tuple(ra1, ra2)); nbc.insert(std::make_tuple(ra2, ra1)); }; // now add the non-bonded restraints for (auto &a1 : mAtoms) { for (auto a2 : mStructure.atoms()) { if (a1 == a2) continue; if (distance_squared(a1, a2) < kMaxNonBondedContactDistance * kMaxNonBondedContactDistance) { if (not bm(a1, a2)) add_nbc(a1, a2); // there used to be a continue here, but that's wrong of course } const auto &[d, p, symop] = crystal.closest_symmetry_copy(a1.get_location(), a2.get_location()); if (symop != cif::sym_op() and d < kMaxNonBondedContactDistance) { cif::mm::atom a2s(a2, p, symop.string()); add_nbc(a1, a2s); } } } // create reverse index (for dfcollector) mRef2AtomIndex = std::vector(mReferencedAtoms.size(), kRefSentinel); for (std::size_t i = 0; i < mAtoms.size(); ++i) { AtomRef ar = ref(mAtoms[i]); assert(ar < mRef2AtomIndex.size()); mRef2AtomIndex[ar] = i; } // collect the restraints for (auto &r : mBondRestraints) mRestraints.push_back(&r); for (auto &r : mAngleRestraints) mRestraints.push_back(&r); for (auto &r : mTransPeptideRestraints) mRestraints.push_back(&r); for (auto &r : mTorsionRestraints) mRestraints.push_back(&r); for (auto &r : mPlanarityRestraints) mRestraints.push_back(&r); for (auto &r : mChiralVolumeRestraints) mRestraints.push_back(&r); for (auto &r : mNonBondedContactRestraints) mRestraints.push_back(&r); if (mDensityRestraint) mRestraints.push_back(mDensityRestraint.get()); // report if (cif::VERBOSE > 1) std::cout << "created " << mBondRestraints.size() << " bond restraints\n" << "created " << mAngleRestraints.size() << " angle restraints\n" << "created " << mTorsionRestraints.size() << " torsion restraints\n" << "created " << mPlanarityRestraints.size() << " plane restraints\n" << "created " << mTransPeptideRestraints.size() << " trans peptide restraints\n" << "created " << mChiralVolumeRestraints.size() << " chiral vol restraints\n" << "created " << mNonBondedContactRestraints.size() << " non-bonded-contact restraints\n" << '\n'; AtomLocationProvider loc(mReferencedAtoms); if (cif::VERBOSE > 2) for (auto r : mRestraints) r->print(loc); } void Minimizer::dropTorsionRestraints() { for (auto &r : mTorsionRestraints) mRestraints.erase(std::remove(mRestraints.begin(), mRestraints.end(), &r), mRestraints.end()); mTorsionRestraints.clear(); } void Minimizer::setMapWeight(float mapWeight) { mDensityRestraint->mMapWeight = mapWeight; } void Minimizer::setChiralVolumeESD(float chiralityESD) { for (auto &r : mChiralVolumeRestraints) r.mESD = chiralityESD; } void Minimizer::setPlanarityESD(float planarityESD) { for (auto &r : mPlanarityRestraints) r.mESD = planarityESD; } AtomRef Minimizer::ref(const cif::mm::atom &atom) { std::string atomID = atom.id(); if (atom.is_symmetry_copy()) atomID += ':' + atom.symmetry(); AtomRef result; auto k = mRefIndex.find(atomID); if (k != mRefIndex.end()) result = k->second; else { result = static_cast(mReferencedAtoms.size()); mReferencedAtoms.push_back(atom); mRefIndex[atomID] = result; } return result; } void Minimizer::addLinkRestraints(const cif::mm::residue &a, const cif::mm::residue &b, const std::string &atom_id_a, const std::string &atom_id_b, const Link &link) { auto c1 = cif::compound_factory::instance().create(a.get_compound_id()); auto c2 = cif::compound_factory::instance().create(b.get_compound_id()); assert(link.bonds().size() == 1); bool a_is_1 = link.bonds().front().atom[0].compID == 1 ? link.bonds().front().atom[0].atomID == atom_id_a : link.bonds().front().atom[1].atomID == atom_id_a; auto getCompoundAtom = [&](const LinkAtom &la) { if (la.compID == 1) return a_is_1 ? c1->get_atom_by_atom_id(la.atomID) : c2->get_atom_by_atom_id(la.atomID); else return a_is_1 ? c2->get_atom_by_atom_id(la.atomID) : c1->get_atom_by_atom_id(la.atomID); }; auto getAtom = [&](const LinkAtom &la) { if (la.compID == 1) return a_is_1 ? a.get_atom_by_atom_id(la.atomID) : b.get_atom_by_atom_id(la.atomID); else return a_is_1 ? b.get_atom_by_atom_id(la.atomID) : a.get_atom_by_atom_id(la.atomID); }; for (auto &bond : link.bonds()) { try { if (getCompoundAtom(bond.atom[0]).type_symbol == cif::H or getCompoundAtom(bond.atom[1]).type_symbol == cif::H) { continue; } cif::mm::atom a1 = getAtom(bond.atom[0]); cif::mm::atom a2 = getAtom(bond.atom[1]); mBondRestraints.emplace_back(ref(a1), ref(a2), bond.distance, bond.esd); } catch (const std::exception &ex) { if (cif::VERBOSE > 0) std::cerr << "While processing bond restraints: " << ex.what() << '\n'; continue; } } for (auto &angle : link.angles()) { try { if (getCompoundAtom(angle.atom[0]).type_symbol == cif::H or getCompoundAtom(angle.atom[1]).type_symbol == cif::H or getCompoundAtom(angle.atom[2]).type_symbol == cif::H) { continue; } cif::mm::atom a1 = getAtom(angle.atom[0]); cif::mm::atom a2 = getAtom(angle.atom[1]); cif::mm::atom a3 = getAtom(angle.atom[2]); mAngleRestraints.emplace_back(ref(a1), ref(a2), ref(a3), angle.angle, angle.esd); } catch (const std::exception &ex) { if (cif::VERBOSE > 1) std::cerr << "While processing angle restraints: " << ex.what() << '\n'; continue; } } for (auto &torsion : link.torsions()) { if (torsion.esd == 0) continue; try { if (getCompoundAtom(torsion.atom[0]).type_symbol == cif::H or getCompoundAtom(torsion.atom[1]).type_symbol == cif::H or getCompoundAtom(torsion.atom[2]).type_symbol == cif::H or getCompoundAtom(torsion.atom[3]).type_symbol == cif::H) { continue; } cif::mm::atom a1 = getAtom(torsion.atom[0]); cif::mm::atom a2 = getAtom(torsion.atom[1]); cif::mm::atom a3 = getAtom(torsion.atom[2]); cif::mm::atom a4 = getAtom(torsion.atom[3]); mTorsionRestraints.emplace_back(ref(a1), ref(a2), ref(a3), ref(a4), torsion.angle, torsion.esd, torsion.period); } catch (const std::exception &ex) { if (cif::VERBOSE > 0) std::cerr << "While processing torsion restraints: " << ex.what() << '\n'; continue; } } for (auto ¢er : link.chiralCentres()) { try { if (getCompoundAtom(center.atom[0]).type_symbol == cif::H or getCompoundAtom(center.atom[1]).type_symbol == cif::H or getCompoundAtom(center.atom[2]).type_symbol == cif::H) { continue; } cif::mm::atom cc = getAtom(center.atomCentre); cif::mm::atom a1 = getAtom(center.atom[0]); cif::mm::atom a2 = getAtom(center.atom[1]); cif::mm::atom a3 = getAtom(center.atom[2]); auto volume = a_is_1 ? link.chiralVolume(center.id, a.get_compound_id(), b.get_compound_id()) : link.chiralVolume(center.id, b.get_compound_id(), a.get_compound_id()); if (std::isnan(volume)) { if (cif::VERBOSE > 0) std::cerr << "While processing chiral volume restraints: NaN volume\n"; continue; } mChiralVolumeRestraints.emplace_back(ref(cc), ref(a1), ref(a2), ref(a3), volume); } catch (const std::exception &ex) { if (cif::VERBOSE > 0) std::cerr << "While processing chiral volume restraints: " << ex.what() << '\n'; continue; } } for (auto &plane : link.planes()) { try { std::vector atoms; for (auto atom : plane.atoms) { if (getCompoundAtom(atom).type_symbol == cif::H) continue; atoms.push_back(ref(getAtom(atom))); } if (atoms.size() > 3) mPlanarityRestraints.emplace_back(PlanarityRestraint{ std::move(atoms), plane.esd }); } catch (const std::exception &ex) { if (cif::VERBOSE > 0) std::cerr << "While processing planarity restraints: " << ex.what() << '\n'; continue; } } } void Minimizer::printStats() { AtomLocationProvider loc(mReferencedAtoms); // for (auto &r : mBondRestraints) // std::cout << mReferencedAtoms[r.mA] << " -> " << mReferencedAtoms[r.mB] << " = " << r.f(loc) << '\n'; double bondScore = rmsz(loc, mBondRestraints); double angleScore = rmsz(loc, mAngleRestraints); double torsionScore = rmsz(loc, mTorsionRestraints); double chiralityVolumeScore = rmsz(loc, mChiralVolumeRestraints); double planarityScore = rmsz(loc, mPlanarityRestraints); double transpeptideScore = rmsz(loc, mTransPeptideRestraints); double nbcScore = rmsz(loc, mNonBondedContactRestraints); double densityScore = mDensityRestraint ? mDensityRestraint->f(loc) : 0; std::cerr << " Bonds: " << bondScore << '\n' << " Angles: " << angleScore << '\n' << " Torsion: " << torsionScore << '\n' << " Chirality: " << chiralityVolumeScore << '\n' << " Planarity: " << planarityScore << '\n' << " Transpeptide: " << transpeptideScore << '\n' << " Non-Bonded-Contact: " << nbcScore << '\n' << " Density: " << densityScore << '\n'; } double Minimizer::score() { AtomLocationProvider loc(mReferencedAtoms); return score(loc); } double Minimizer::score(const AtomLocationProvider &loc) { double result = 0; for (auto r : mRestraints) { if (cif::VERBOSE > 2) r->print(loc); result += r->f(loc); } if (cif::VERBOSE > 3) std::cout << "score: " << result << '\n'; return result; } // -------------------------------------------------------------------- #include // for debugging norm of gradient #include class GSLAtomLocation : public AtomLocationProvider { public: GSLAtomLocation(std::vector &atoms, const std::vector &fixedAtoms, const std::vector &index, const gsl_vector *v) : AtomLocationProvider(atoms) , mFixedLocations(fixedAtoms) , mIndex(index) , mV(v) { assert(mIndex.size() == mFixedLocations.size()); if (cif::VERBOSE > 2) { for (std::size_t i = 0; i < mIndex.size(); ++i) { std::size_t ri = mIndex[i]; if (ri == kRefSentinel) continue; DPoint p = { gsl_vector_get(mV, ri * 3), gsl_vector_get(mV, ri * 3 + 1), gsl_vector_get(mV, ri * 3 + 2) }; std::cout << mAtoms[i] << p << '\n'; } } } virtual DPoint operator[](AtomRef atom) const; void storeLocations(); private: const std::vector &mFixedLocations; const std::vector &mIndex; const gsl_vector *mV; }; DPoint GSLAtomLocation::operator[](AtomRef atomID) const { assert(atomID < mIndex.size()); std::size_t ix = mIndex.at(atomID); if (ix == kRefSentinel) return mFixedLocations.at(atomID); return DPoint( gsl_vector_get(mV, ix * 3 + 0), gsl_vector_get(mV, ix * 3 + 1), gsl_vector_get(mV, ix * 3 + 2)); } void GSLAtomLocation::storeLocations() { for (std::size_t i = 0; i < mIndex.size(); ++i) { std::size_t ri = mIndex[i]; if (ri == kRefSentinel) continue; DPoint p = { gsl_vector_get(mV, ri * 3), gsl_vector_get(mV, ri * 3 + 1), gsl_vector_get(mV, ri * 3 + 2) }; mAtoms[i].set_location(p); } } // -------------------------------------------------------------------- class GSLDFCollector : public DFCollector { public: GSLDFCollector(const std::vector &atoms, const std::vector &index, gsl_vector *df) : mAtoms(atoms) , mIndex(index) , mDF(df) { for (std::size_t ix : mIndex) { if (ix == kRefSentinel) continue; gsl_vector_set(mDF, ix * 3 + 0, 0.0); gsl_vector_set(mDF, ix * 3 + 1, 0.0); gsl_vector_set(mDF, ix * 3 + 2, 0.0); } } ~GSLDFCollector(); virtual void add(AtomRef atom, double dx, double dy, double dz); private: // for debugging std::string label(AtomRef atom) const { std::string atomName = " " + mAtoms[atom].get_label_atom_id(); atomName += std::string(5 - atomName.length(), ' '); return std::to_string(mAtoms[atom].get_label_seq_id()) + atomName; } const std::vector &mAtoms; const std::vector &mIndex; gsl_vector *mDF; }; GSLDFCollector::~GSLDFCollector() { if (cif::VERBOSE > 2) { std::cerr << std::string(19, '-') << '\n' << "Collected gradient: \n"; for (std::size_t i = 0; i < mAtoms.size(); ++i) { std::size_t ix = mIndex[i]; if (ix == kRefSentinel) continue; double dx = gsl_vector_get(mDF, ix * 3 + 0); double dy = gsl_vector_get(mDF, ix * 3 + 1); double dz = gsl_vector_get(mDF, ix * 3 + 2); std::cerr << "atom: " << label(i) << " d: " << std::setprecision(10) << dx << " " << dy << " " << dz << '\n'; } std::cerr << std::string(19, '-') << '\n'; } } void GSLDFCollector::add(AtomRef atom, double dx, double dy, double dz) { assert(atom < mIndex.size()); std::size_t ix = mIndex[atom]; if (ix != kRefSentinel) { gsl_vector_set(mDF, ix * 3 + 0, gsl_vector_get(mDF, ix * 3 + 0) + dx); gsl_vector_set(mDF, ix * 3 + 1, gsl_vector_get(mDF, ix * 3 + 1) + dy); gsl_vector_set(mDF, ix * 3 + 2, gsl_vector_get(mDF, ix * 3 + 2) + dz); if (cif::VERBOSE > 4) std::cerr << "atom: " << label(atom) << " d: " << std::setprecision(10) << dx << ", " << dy << ", " << dz << '\n'; } } // -------------------------------------------------------------------- class GSLMinimizer : public Minimizer { public: GSLMinimizer(const cif::mm::structure &structure) : Minimizer(structure) { } virtual void Finish(const cif::crystal &crystal) { Minimizer::Finish(crystal); for (auto &a : mReferencedAtoms) mFixedLocations.push_back(a.get_location()); } ~GSLMinimizer() { if (m_s != nullptr) gsl_multimin_fdfminimizer_free(m_s); } virtual double refine(bool storeAtoms); virtual std::vector> getAtoms() const; virtual void storeAtomLocations(); private: static double F(const gsl_vector *v, void *params); static void Df(const gsl_vector *v, void *params, gsl_vector *df); static void Fdf(const gsl_vector *x, void *params, double *f, gsl_vector *df); double F(const gsl_vector *v); void Df(const gsl_vector *v, gsl_vector *df); void Fdf(const gsl_vector *x, double *f, gsl_vector *df); std::vector mFixedLocations; gsl_multimin_fdfminimizer *m_s = nullptr; }; double GSLMinimizer::refine(bool storeAtoms) { const std::size_t iterations = 4000; gsl_multimin_function_fdf fdf = {}; fdf.f = &GSLMinimizer::F; fdf.df = &GSLMinimizer::Df; fdf.fdf = &GSLMinimizer::Fdf; fdf.n = mAtoms.size() * 3; fdf.params = this; // auto T = gsl_multimin_fdfminimizer_conjugate_pr; auto T = gsl_multimin_fdfminimizer_vector_bfgs2; auto x = gsl_vector_alloc(3 * mAtoms.size()); std::size_t ix = 0; for (auto &a : mAtoms) { auto l = a.get_location(); gsl_vector_set(x, ix++, l.m_x); gsl_vector_set(x, ix++, l.m_y); gsl_vector_set(x, ix++, l.m_z); } m_s = gsl_multimin_fdfminimizer_alloc(T, 3 * mAtoms.size()); // float tolerance = 0.06f; // double stepSize = 0.25 * gsl_blas_dnrm2(x); float tolerance = 0.1f; double stepSize = 0.25; gsl_multimin_fdfminimizer_set(m_s, &fdf, x, stepSize, tolerance); double gradLim = std::sqrt(mRestraints.size()) * 0.15; if (gradLim < 0.3) gradLim = 0.3; for (std::size_t i = 0; i < iterations; ++i) { int status = gsl_multimin_fdfminimizer_iterate(m_s); if (cif::VERBOSE > 2) { ix = 0; for (auto &a : mAtoms) { auto l = a.get_location(); cif::point p{ static_cast(gsl_vector_get(m_s->x, ix + 0)), static_cast(gsl_vector_get(m_s->x, ix + 1)), static_cast(gsl_vector_get(m_s->x, ix + 2)) }; ix += 3; std::cerr << a << " l: " << l << " => p: " << p << " d = " << (p - l) << '\n'; } } if (status != 0) { if (status != GSL_ENOPROG) std::cerr << "Unexpected result from gsl_multimin_fdfminimizer_iterate: " << status << '\n'; else if (cif::VERBOSE > 1) std::cerr << "Minimizer stopped at iteration " << i << " at " << m_s->f << '\n'; break; } status = gsl_multimin_test_gradient(m_s->gradient, gradLim); if (cif::VERBOSE > 1) { double norm = gsl_blas_dnrm2(m_s->gradient); std::cout << "iteration number " << i << " with f: " << m_s->f << " status from gsl_multimin_test_gradient() " << status << " for norm " << norm << '\n'; } if (status == GSL_SUCCESS) { if (cif::VERBOSE > 1) std::cerr << "Minimum found at iteration " << i << " at " << m_s->f << '\n'; break; } if (status != GSL_CONTINUE) break; } gsl_vector_free(x); if (storeAtoms) storeAtomLocations(); return m_s->f; } std::vector> GSLMinimizer::getAtoms() const { std::vector> result; for (std::size_t i = 0; i < mRef2AtomIndex.size(); ++i) { std::size_t ri = mRef2AtomIndex[i]; if (ri == kRefSentinel) continue; DPoint p = { gsl_vector_get(m_s->x, ri * 3), gsl_vector_get(m_s->x, ri * 3 + 1), gsl_vector_get(m_s->x, ri * 3 + 2) }; result.emplace_back(mReferencedAtoms[i].id(), p); } return result; } void GSLMinimizer::storeAtomLocations() { GSLAtomLocation loc(mReferencedAtoms, mFixedLocations, mRef2AtomIndex, m_s->x); loc.storeLocations(); } double GSLMinimizer::F(const gsl_vector *v, void *params) { GSLMinimizer *self = reinterpret_cast(params); return self->F(v); } void GSLMinimizer::Df(const gsl_vector *v, void *params, gsl_vector *df) { GSLMinimizer *self = reinterpret_cast(params); self->Df(v, df); } void GSLMinimizer::Fdf(const gsl_vector *v, void *params, double *f, gsl_vector *df) { GSLMinimizer *self = reinterpret_cast(params); self->Fdf(v, f, df); if (cif::VERBOSE > 2) std::cout << "FDF => " << std::setprecision(10) << *f << '\n'; } double GSLMinimizer::F(const gsl_vector *v) { GSLAtomLocation loc(mReferencedAtoms, mFixedLocations, mRef2AtomIndex, v); // return score(loc); auto F = score(loc); if (cif::VERBOSE > 2) std::cout << "F => " << std::setprecision(10) << F << '\n'; return F; } void GSLMinimizer::Df(const gsl_vector *v, gsl_vector *df) { GSLAtomLocation loc(mReferencedAtoms, mFixedLocations, mRef2AtomIndex, v); GSLDFCollector c(mReferencedAtoms, mRef2AtomIndex, df); for (auto r : mRestraints) r->df(loc, c); } void GSLMinimizer::Fdf(const gsl_vector *x, double *f, gsl_vector *df) { GSLAtomLocation loc(mReferencedAtoms, mFixedLocations, mRef2AtomIndex, x); *f = score(loc); GSLDFCollector c(mReferencedAtoms, mRef2AtomIndex, df); for (auto r : mRestraints) r->df(loc, c); } // -------------------------------------------------------------------- Minimizer *Minimizer::create(const cif::crystal &crystal, const cif::mm::polymer &poly, int first, int last, const XMap &xMap) { std::unique_ptr result(new GSLMinimizer(*poly.get_structure())); result->addPolySection(poly, first, last); result->addDensityMap(xMap, kDefaultMapWeight); result->Finish(crystal); return result.release(); } Minimizer *Minimizer::create(const cif::crystal &crystal, cif::mm::structure &structure, const std::vector &atoms, const XMap *xMap) { std::unique_ptr result(new GSLMinimizer(structure)); std::vector residues; for (auto atom : atoms) { auto &res = structure.get_residue(atom); auto ri = std::find_if(residues.begin(), residues.end(), [rp = &res](const cif::mm::residue *r) { return r == rp; }); if (ri != residues.end()) continue; residues.emplace_back(&res); } // sort by asym, seq_id sort(residues.begin(), residues.end(), [](const cif::mm::residue *a, const cif::mm::residue *b) { int d = a->get_asym_id().compare(b->get_asym_id()); if (d == 0) d = a->get_seq_id() - b->get_seq_id(); return d < 0; }); auto &polymers = structure.polymers(); for (auto ri = residues.begin(); ri != residues.end(); ++ri) { auto res = *ri; auto monomer = dynamic_cast(res); if (monomer == nullptr) { result->addResidue(*res); continue; } int startSeqID = monomer->get_seq_id(); int endSeqID = startSeqID; while (ri != residues.end()) { if ((*ri)->get_seq_id() != endSeqID + 1 or (*ri)->get_asym_id() != monomer->get_asym_id()) break; ++endSeqID; ++ri; } auto pi = find_if(polymers.begin(), polymers.end(), [id = monomer->get_asym_id()](cif::mm::polymer &poly) { return poly.get_asym_id() == id; }); if (pi == polymers.end()) throw std::runtime_error("cif::mm::polymer not found for asym ID " + monomer->get_asym_id()); result->addPolySection(*pi, startSeqID, endSeqID); } // Add any residue that might be bonded to our list of residues via a struct_conn record auto &db = structure.get_datablock(); auto &struct_conn = db["struct_conn"]; std::vector> linked; for (auto r : struct_conn) { const auto &[ptnr1_label_asym_id, ptnr1_label_seq_id, ptnr1_auth_seq_id] = r.get("ptnr1_label_asym_id", "ptnr1_label_seq_id", "ptnr1_auth_seq_id"); const auto &[ptnr2_label_asym_id, ptnr2_label_seq_id, ptnr2_auth_seq_id] = r.get("ptnr2_label_asym_id", "ptnr2_label_seq_id", "ptnr2_auth_seq_id"); auto ai = find_if(residues.begin(), residues.end(), [asym_id = ptnr1_label_asym_id, seq_id = ptnr1_label_seq_id, auth_seq_id = ptnr1_auth_seq_id](const cif::mm::residue *res) { return res->get_asym_id() == asym_id and res->get_seq_id() == seq_id and res->get_auth_seq_id() == auth_seq_id; }); auto bi = find_if(residues.begin(), residues.end(), [asym_id = ptnr2_label_asym_id, seq_id = ptnr2_label_seq_id, auth_seq_id = ptnr2_auth_seq_id](const cif::mm::residue *res) { return res->get_asym_id() == asym_id and res->get_seq_id() == seq_id and res->get_auth_seq_id() == auth_seq_id; }); if (ai == residues.end() and bi == residues.end()) continue; const cif::mm::residue *ra = *ai; const cif::mm::residue *rb = *bi; const auto &[ptnr1_label_atom_id, ptnr2_label_atom_id, link_id] = r.get("ptnr1_label_atom_id", "ptnr2_label_atom_id", "ccp4_link_id"); if (ai != residues.end() and bi != residues.end()) { linked.emplace_back(ra, rb, ptnr1_label_atom_id, ptnr2_label_atom_id, link_id); continue; } if (ai != residues.end()) { residues.emplace_back(&structure.get_residue(ptnr2_label_asym_id, ptnr2_label_seq_id, ptnr2_auth_seq_id)); linked.emplace_back(ra, residues.back(), ptnr1_label_atom_id, ptnr2_label_atom_id, link_id); } else { residues.emplace_back(&structure.get_residue(ptnr1_label_asym_id, ptnr1_label_seq_id, ptnr1_auth_seq_id)); linked.emplace_back(residues.back(), rb, ptnr1_label_atom_id, ptnr2_label_atom_id, link_id); } } // The struct conn records for (const auto &[a, b, atom_a, atom_b, link_id] : linked) { if (not link_id.empty()) { result->addLinkRestraints(*a, *b, atom_a, atom_b, link_id); continue; } try { result->addLinkRestraints(*a, *b, atom_a, atom_b, a->get_compound_id() + "-" + b->get_compound_id()); continue; } catch (...) {} try { result->addLinkRestraints(*b, *a, atom_b, atom_a, b->get_compound_id() + "-" + a->get_compound_id()); continue; } catch (...) {} // Last resort, if link is NAG-ASN, try pyr-ASN instead: if (a->get_compound_id() == "NAG" and b->get_compound_id() == "ASN") result->addLinkRestraints(*b, *a, atom_b, atom_a, "pyr-ASN"); else if (b->get_compound_id() == "NAG" and a->get_compound_id() == "ASN") result->addLinkRestraints(*a, *b, atom_a, atom_b, "pyr-ASN"); else throw std::runtime_error("Missing link information for " + a->get_compound_id() + " and " + b->get_compound_id()); } if (xMap != nullptr) result->addDensityMap(*xMap, kDefaultMapWeight); result->Finish(crystal); return result.release(); } BondMap Minimizer::createBondMap() { std::vector pts; for (auto a : mReferencedAtoms) pts.emplace_back(a.get_location()); cif::point center = cif::centroid(pts); float radius = 0; for (auto pt : pts) { auto d = distance(pt, center); if (radius < d) radius = d; } return { mStructure.get_datablock(), std::make_tuple(center, radius + kMaxNonBondedContactDistance) }; } } // namespace pdb_redo libpdb-redo-3.3.0/src/Ramachandran.cpp0000644000175000017500000000663614773016616017440 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Created by: Maarten L. Hekkelman Date: dinsdag 19 juni, 2018 */ #define _USE_MATH_DEFINES #include #include #include #include #include #include "pdb-redo/Ramachandran.hpp" namespace pdb_redo { const double kPI = M_PI; // -------------------------------------------------------------------- class RamachandranTables { public: static RamachandranTables &instance() { std::lock_guard lock(sMutex); static RamachandranTables sInstance; return sInstance; } clipper::Ramachandran &table(const std::string &aa, bool prePro) { std::lock_guard lock(sMutex); auto i = mTables.find(std::make_tuple(aa, prePro)); if (i == mTables.end()) { clipper::Ramachandran::TYPE type; if (aa == "GLY") type = clipper::Ramachandran::Gly2; else if (aa == "PRO") type = clipper::Ramachandran::Pro2; else if (aa == "ILE" or aa == "VAL") type = clipper::Ramachandran::IleVal2; else if (prePro) type = clipper::Ramachandran::PrePro2; else type = clipper::Ramachandran::NoGPIVpreP2; i = mTables.emplace(make_pair(std::make_tuple(aa, prePro), clipper::Ramachandran(type))).first; } return i->second; } private: std::map, clipper::Ramachandran> mTables; static std::mutex sMutex; }; std::mutex RamachandranTables::sMutex; float calculateRamachandranZScore(const std::string &aa, bool prePro, float phi, float psi) { auto &table = RamachandranTables::instance().table(aa, prePro); return static_cast(table.probability(phi * kPI / 180, psi * kPI / 180)); } RamachandranScore calculateRamachandranScore(const std::string &aa, bool prePro, float phi, float psi) { auto &table = RamachandranTables::instance().table(aa, prePro); phi *= static_cast(kPI / 180); psi *= static_cast(kPI / 180); RamachandranScore result; if (table.favored(phi, psi)) result = rsFavoured; else if (table.allowed(phi, psi)) result = rsAllowed; else result = rsNotAllowed; return result; } } // namespace pdb_redolibpdb-redo-3.3.0/src/ResolutionCalculator.cpp0000644000175000017500000000526114773016616021227 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define _USE_MATH_DEFINES #include #include "pdb-redo/ResolutionCalculator.hpp" namespace pdb_redo { const double kPI = M_PI; ResolutionCalculator::ResolutionCalculator(const clipper::Cell &cell) : ResolutionCalculator(cell.a(), cell.b(), cell.c(), 180 * cell.alpha() / kPI, 180 * cell.beta() / kPI, 180 * cell.gamma() / kPI) { } ResolutionCalculator::ResolutionCalculator(double a, double b, double c, double alpha, double beta, double gamma) { double deg2rad = std::atan(1.0) / 45.0; double ca = std::cos(deg2rad * alpha); double sa = std::sin(deg2rad * alpha); double cb = std::cos(deg2rad * beta); double sb = std::sin(deg2rad * beta); double cg = std::cos(deg2rad * gamma); double sg = std::sin(deg2rad * gamma); double cast = (cb * cg - ca) / (sb * sg); double cbst = (cg * ca - cb) / (sg * sa); double cgst = (ca * cb - cg) / (sa * sb); double sast = std::sqrt(1 - cast * cast); double sbst = std::sqrt(1 - cbst * cbst); double sgst = std::sqrt(1 - cgst * cgst); double ast = 1 / (a * sb * sgst); double bst = 1 / (b * sg * sast); double cst = 1 / (c * sa * sbst); mCoefs[0] = ast * ast; mCoefs[1] = 2 * ast * bst * cgst; mCoefs[2] = 2 * ast * cst * cbst; mCoefs[3] = bst * bst; mCoefs[4] = 2 * bst * cst * cast; mCoefs[5] = cst * cst; } } // namespace pdb_redo libpdb-redo-3.3.0/src/Restraints.cpp0000644000175000017500000004113614773016616017211 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Created by: Maarten L. Hekkelman Date: dinsdag 22 mei, 2018 */ #include "pdb-redo/Minimizer.hpp" #include "pdb-redo/Restraints.hpp" #include #include #include namespace pdb_redo { double BondRestraint::f(const AtomLocationProvider &atoms) const { double d = mDist - distance(atoms[mA], atoms[mB]); double result = (d * d) / (mDistESD * mDistESD); if (cif::VERBOSE > 2) std::cerr << "bond::f() = " << atoms.atom(mA) << " <> " << atoms.atom(mB) << " " << atoms[mA] << " <> " << atoms[mB] << " => " << result << '\n'; return result; } void BondRestraint::df(const AtomLocationProvider &atoms, DFCollector &df) const { auto a1 = atoms[mA], a2 = atoms[mB]; auto bi = distance(a1, a2); if (bi < 0.1) bi = 0.1; auto c = 2 * (1 - mDist / bi) / (mDistESD * mDistESD); if (cif::VERBOSE > 2) std::cerr << "bond::df(): " << atoms.atom(mA) << " <> " << atoms.atom(mB) << ' ' << bi << ' ' << mDist << ' ' << mDistESD << '\n'; df.add(mA, (a1 - a2) * c); df.add(mB, (a2 - a1) * c); } void BondRestraint::print(const AtomLocationProvider &atoms) const { std::cout << "bond " << atoms.atom(mA) << " to " << atoms.atom(mB) << " => " << mDist << " / " << mDistESD << '\n'; } // -------------------------------------------------------------------- double AngleRestraint::f(const AtomLocationProvider &atoms) const { DPoint p[3] = {atoms[mA], atoms[mB], atoms[mC]}; double c = cosinus_angle(p[1], p[0], p[1], p[2]); double angle = std::atan2(std::sqrt(1 - c * c), c) * 180 / cif::kPI; double d = mAngle - angle; double result = (d * d) / (mESD * mESD); if (cif::VERBOSE > 2) std::cerr << "angle::f() " << atoms.atom(mA) << "/" << atoms.atom(mB) << "/" << atoms.atom(mC) << ' ' << " = " << result << '\n'; return result; } void AngleRestraint::df(const AtomLocationProvider &atoms, DFCollector &df) const { const double kRadToDegree = 180.0 / cif::kPI, kDegreeToRad = 1 / kRadToDegree; if (cif::VERBOSE > 2) std::cerr << "angle::df() " << atoms.atom(mA) << "/" << atoms.atom(mB) << "/" << atoms.atom(mC) << ' ' << ": \n"; DPoint k = atoms[mA], l = atoms[mB], m = atoms[mC]; auto aVec = (k - l); auto bVec = (m - l); auto a = distance(k, l); if (a < 0.01) { a = 0.01; aVec = DPoint{0.01, 0.01, 0.01}; }; auto b = distance(m, l); if (b < 0.01) { b = 0.01; bVec = DPoint{0.01, 0.01, 0.01}; }; auto cosTheta = dot_product(aVec, bVec) / (a * b); if (cosTheta > 1.0) cosTheta = 1.0; if (cosTheta < -1.0) cosTheta = -1.0; auto theta = std::acos(cosTheta); if (theta < 0.001) theta = 0.001; auto target = mAngle * kDegreeToRad; auto wf = 2 * (theta - target) * kRadToDegree * kRadToDegree / (mESD * mESD); auto prem = -wf / std::sin(theta); df.add(mA, prem * (cosTheta * (l - k) / (a * a) + (m - l) / (a * b))); df.add(mC, prem * (cosTheta * (l - m) / (b * b) + (k - l) / (a * b))); auto term1 = (l - k) * -cosTheta / (a * a) + (l - m) * -cosTheta / (b * b); auto term2 = ((l - k) + (l - m)) / (a * b); df.add(mB, prem * (term1 + term2)); } void AngleRestraint::print(const AtomLocationProvider &atoms) const { std::cout << "angle " << atoms.atom(mA) << " ; " << atoms.atom(mB) << " ; " << atoms.atom(mC) << " => " << mAngle << " / " << mESD << '\n'; } // -------------------------------------------------------------------- std::tuple TorsionRestraint::CalculateTorsionGradients(float theta, DPoint p[4]) const { auto a = p[1] - p[0], b = p[2] - p[1], c = p[3] - p[2]; auto blensq = b.length_sq(); auto blen = std::sqrt(blensq); if (blen < 0.01) { blen = 0.01; blensq = 0.0001; } auto H = -dot_product(a, c), J = dot_product(a, b), K = dot_product(b, c), L = 1 / blensq; auto E = dot_product(a, cross_product(b, c)) / blen; auto G = H + J * K * L; auto F = 1 / G; if (G == 0) F = 999999999.9; DPoint dH[4] = {c, -c, a, -a}; DPoint dK[4] = {{}, -c, c - b, b}; DPoint dJ[4] = {-b, b - a, a, {}}; DPoint dL[4] = {{}, 2.0 * (p[2] - p[1]) * L * L, -2.0 * (p[2] - p[1]) * L * L, {}}; DPoint dM[4] = { {-(b.m_y * c.m_z - b.m_z * c.m_y), -(b.m_z * c.m_x - b.m_x * c.m_z), -(b.m_x * c.m_y - b.m_y * c.m_x)}, {(b.m_y * c.m_z - b.m_z * c.m_y) + (a.m_y * c.m_z - a.m_z * c.m_y), (b.m_z * c.m_x - b.m_x * c.m_z) + (a.m_z * c.m_x - a.m_x * c.m_z), (b.m_x * c.m_y - b.m_y * c.m_x) + (a.m_x * c.m_y - a.m_y * c.m_x)}, {(b.m_y * a.m_z - b.m_z * a.m_y) - (a.m_y * c.m_z - a.m_z * c.m_y), -(a.m_z * c.m_x - a.m_x * c.m_z) + (b.m_z * a.m_x - b.m_x * a.m_z), -(a.m_x * c.m_y - a.m_y * c.m_x) + (a.m_y * b.m_x - a.m_x * b.m_y)}, {-(b.m_y * a.m_z - b.m_z * a.m_y), -(b.m_z * a.m_x - b.m_x * a.m_z), -(a.m_y * b.m_x - a.m_x * b.m_y)}}; DPoint dE[4]{ dM[0] / blen, dM[1] / blen + E * (p[2] - p[1]) * L, dM[2] / blen - E * (p[2] - p[1]) * L, dM[3] / blen}; auto eff = E * F * F; auto jl = J * L; auto kl = K * L; auto jk = J * K; return std::make_tuple( F * dE[0] - eff * (dH[0] + jl * dK[0] + kl * dJ[0] + jk * dL[0]), F * dE[1] - eff * (dH[1] + jl * dK[1] + kl * dJ[1] + jk * dL[1]), F * dE[2] - eff * (dH[2] + jl * dK[2] + kl * dJ[2] + jk * dL[2]), F * dE[3] - eff * (dH[3] + jl * dK[3] + kl * dJ[3] + jk * dL[3])); } double TorsionRestraint::f(const AtomLocationProvider &atoms) const { double result = 0; double cos_a1 = cosinus_angle(atoms[mB], atoms[mA], atoms[mC], atoms[mB]); double cos_a2 = cosinus_angle(atoms[mC], atoms[mB], atoms[mD], atoms[mC]); if (cos_a1 <= 0.9 and cos_a2 <= 0.9) { double period = 360.0; if (mPeriodicity > 0) period /= mPeriodicity; double theta = dihedral_angle(atoms[mA], atoms[mB], atoms[mC], atoms[mD]); double diff = std::fmod(std::abs(theta - mTarget) + period / 2, period) - period / 2; if (not std::isnan(diff)) result = (diff * diff) / (mESD * mESD); if (cif::VERBOSE > 2) std::cerr << "torsion::f() = " << result << " for theta " << theta << " diff: " << diff << " target: " << mTarget << " sigma: " << mESD << " atoms: " << atoms.atom(mA) << ", " << atoms.atom(mB) << ", " << atoms.atom(mC) << ", " << atoms.atom(mD) << '\n'; } return result; } void TorsionRestraint::df(const AtomLocationProvider &atoms, DFCollector &df) const { if (cif::VERBOSE > 2) std::cerr << "torsion::df() " << atoms.atom(mA) << "/" << atoms.atom(mB) << "/" << atoms.atom(mC) << "/" << atoms.atom(mD) << ' ' << ": \n"; double cos_a1 = cosinus_angle(atoms[mB], atoms[mA], atoms[mC], atoms[mB]); double cos_a2 = cosinus_angle(atoms[mC], atoms[mB], atoms[mD], atoms[mC]); if (cos_a1 <= 0.9 and cos_a2 <= 0.9) { double period = 360.0; if (mPeriodicity > 0) period /= mPeriodicity; double theta = dihedral_angle(atoms[mA], atoms[mB], atoms[mC], atoms[mD]); double diff = std::fmod(std::abs(theta - mTarget) + period / 2, period) - period / 2; if (not std::isnan(diff)) { auto tt = std::tan(cif::kPI * theta / 180); double scale = 180.0 / ((1 + tt * tt) * cif::kPI); auto w = 1 / (mESD * mESD); DPoint p[4] = {atoms[mA], atoms[mB], atoms[mC], atoms[mD]}; DPoint d[4]; std::tie(d[0], d[1], d[2], d[3]) = CalculateTorsionGradients(theta, p); df.add(mA, 2.0 * diff * d[0] * scale * w); df.add(mB, 2.0 * diff * d[1] * scale * w); df.add(mC, 2.0 * diff * d[2] * scale * w); df.add(mD, 2.0 * diff * d[3] * scale * w); } } } void TorsionRestraint::print(const AtomLocationProvider &atoms) const { std::cout << "torsion " << atoms.atom(mA) << " ; " << atoms.atom(mB) << " ; " << atoms.atom(mC) << " ; " << atoms.atom(mD) << " => " << mPeriodicity << " / " << mESD << '\n'; } // -------------------------------------------------------------------- double ChiralVolumeRestraint::f(const AtomLocationProvider &atoms) const { auto chiralVolume = dot_product(atoms[mA1] - atoms[mCentre], cross_product(atoms[mA2] - atoms[mCentre], atoms[mA3] - atoms[mCentre])); double d = mVolume - chiralVolume; double result = (d * d) / (mESD * mESD); if (cif::VERBOSE > 2) std::cerr << "chiral::f() = " << result << '\n'; return result; } void ChiralVolumeRestraint::df(const AtomLocationProvider &atoms, DFCollector &df) const { if (cif::VERBOSE > 2) std::cerr << "chiral::df(): \n"; DPoint centre = atoms[mCentre]; DPoint a = atoms[mA1] - centre; DPoint b = atoms[mA2] - centre; DPoint c = atoms[mA3] - centre; auto chiralVolume = dot_product(a, cross_product(b, c)); auto d = chiralVolume - mVolume; auto s = 2 * d / (mESD * mESD); df.add(mCentre, s * DPoint{ -(b.m_y * c.m_z - b.m_z * c.m_y) - (a.m_z * c.m_y - a.m_y * c.m_z) - (a.m_y * b.m_z - a.m_z * b.m_y), -(b.m_z * c.m_x - b.m_x * c.m_z) - (a.m_x * c.m_z - a.m_z * c.m_x) - (a.m_z * b.m_x - a.m_x * b.m_z), -(b.m_x * c.m_y - b.m_y * c.m_x) - (a.m_y * c.m_x - a.m_x * c.m_y) - (a.m_x * b.m_y - a.m_y * b.m_x)}); df.add(mA1, s * DPoint{b.m_y * c.m_z - b.m_z * c.m_y, b.m_z * c.m_x - b.m_x * c.m_z, b.m_x * c.m_y - b.m_y * c.m_x}); df.add(mA2, s * DPoint{a.m_z * c.m_y - a.m_y * c.m_z, a.m_x * c.m_z - a.m_z * c.m_x, a.m_y * c.m_x - a.m_x * c.m_y}); df.add(mA3, s * DPoint{a.m_y * b.m_z - a.m_z * b.m_y, a.m_z * b.m_x - a.m_x * b.m_z, a.m_x * b.m_y - a.m_y * b.m_x}); } void ChiralVolumeRestraint::print(const AtomLocationProvider &atoms) const { std::cout << "chiral volume " << atoms.atom(mA1) << " ; " << atoms.atom(mA2) << " ; " << atoms.atom(mA3) << " => " << mVolume << " / " << mESD << '\n'; } // -------------------------------------------------------------------- void PlanarityRestraint::calculatePlaneFunction(const AtomLocationProvider &atoms, double abcd[4]) const { DPoint center; for (auto &a : mAtoms) center += atoms[a]; center /= mAtoms.size(); double Cxx = 0, Cyy = 0, Czz = 0, Cxy = 0, Cxz = 0, Cyz = 0; for (auto &a : mAtoms) { Cxx += (atoms[a].m_x - center.m_x) * (atoms[a].m_x - center.m_x); Cyy += (atoms[a].m_y - center.m_y) * (atoms[a].m_y - center.m_y); Czz += (atoms[a].m_z - center.m_z) * (atoms[a].m_z - center.m_z); Cxy += (atoms[a].m_x - center.m_x) * (atoms[a].m_y - center.m_y); Cxz += (atoms[a].m_x - center.m_x) * (atoms[a].m_z - center.m_z); Cyz += (atoms[a].m_y - center.m_y) * (atoms[a].m_z - center.m_z); } Eigen::Matrix3d mat; mat << Cxx, Cxy, Cxz, Cxy, Cyy, Cyz, Cxz, Cyz, Czz; Eigen::EigenSolver es(mat); auto ev = es.eigenvalues(); float b_ev = std::numeric_limits::max(); for (std::size_t i = 0; i < 3; ++i) { if (ev[i].real() > b_ev) continue; b_ev = ev[i].real(); auto col = es.eigenvectors().col(i); abcd[0] = col(0).real(); abcd[1] = col(1).real(); abcd[2] = col(2).real(); } double sumSq = 1e-20 + abcd[0] * abcd[0] + abcd[1] * abcd[1] + abcd[2] * abcd[2]; abcd[0] /= sumSq; abcd[1] /= sumSq; abcd[2] /= sumSq; abcd[3] = abcd[0] * center.m_x + abcd[1] * center.m_y + abcd[2] * center.m_z; } double PlanarityRestraint::f(const AtomLocationProvider &atoms) const { double abcd[4]; calculatePlaneFunction(atoms, abcd); double result = accumulate(mAtoms.begin(), mAtoms.end(), 0., [&atoms, &abcd, esd = mESD](double sum, AtomRef a) { double v = abcd[0] * atoms[a].m_x + abcd[1] * atoms[a].m_y + abcd[2] * atoms[a].m_z - abcd[3]; double r = v / esd; return sum + r * r; }); if (cif::VERBOSE > 2) { std::vector as; transform(mAtoms.begin(), mAtoms.end(), back_inserter(as), [](auto &a) { std::stringstream s; s << a; return s.str(); }); std::cerr << "plane::f() = " << result << " for " << mAtoms.size() << " atoms " << cif::join(as, ", ") << '\n'; } return result; } void PlanarityRestraint::df(const AtomLocationProvider &atoms, DFCollector &df) const { if (cif::VERBOSE > 2) { std::vector as; transform(mAtoms.begin(), mAtoms.end(), back_inserter(as), [](auto &a) { std::stringstream s; s << a; return s.str(); }); std::cerr << "plane::df() for " << mAtoms.size() << " atoms " << cif::join(as, ", ") << '\n'; } double abcd[4]; calculatePlaneFunction(atoms, abcd); for (auto &a : mAtoms) { auto l = atoms[a]; auto deviLen = l.m_x * abcd[0] + l.m_y * abcd[1] + l.m_z * abcd[2] - abcd[3]; df.add(a, 2 * deviLen * DPoint{abcd[0], abcd[1], abcd[2]} / (mESD * mESD)); } } void PlanarityRestraint::print(const AtomLocationProvider &atoms) const { std::cout << "plane "; for (auto &a : mAtoms) std::cout << atoms.atom(a) << ' '; std::cout << "=> " << 0 << " / " << mESD << '\n'; } // -------------------------------------------------------------------- double NonBondedContactRestraint::f(const AtomLocationProvider &atoms) const { double result = 0; double distance = distance_squared(atoms[mA], atoms[mB]); if (distance < mMinDistSq) { double d = mMinDist - std::sqrt(distance); result = (d * d) / (mDistESD * mDistESD); if (cif::VERBOSE > 2) std::cerr << "non-bonded-contact::f() = " << result << " min-dist is " << mMinDist << " and dist is " << std::sqrt(distance) << " a1: " << atoms.atom(mA) << " a2: " << atoms.atom(mB) << '\n' << " a1: " << atoms[mA] << " a2: " << atoms[mB] << '\n'; } return result; } void NonBondedContactRestraint::df(const AtomLocationProvider &atoms, DFCollector &df) const { auto a1 = atoms[mA], a2 = atoms[mB]; auto bi = distance_squared(a1, a2); if (bi < mMinDistSq) { bi = std::sqrt(bi); if (bi < 0.1) bi = 0.1; if (cif::VERBOSE > 2) std::cerr << "non-bonded::df(): " << atoms.atom(mA) << " and " << atoms.atom(mB) << " " << "distance: " << bi << " " << "target: " << mMinDist << '\n'; double c = 2 * (1 - mMinDist / bi) / (mDistESD * mDistESD); df.add(mA, (a1 - a2) * c); df.add(mB, (a2 - a1) * c); } } void NonBondedContactRestraint::print(const AtomLocationProvider &atoms) const { std::cout << "nbc " << atoms.atom(mA) << " " << atoms.atom(mB) << " => " << distance(atoms[mA], atoms[mB]) << ' ' << mMinDist << " / " << mDistESD << '\n'; } // -------------------------------------------------------------------- DensityRestraint::DensityRestraint(std::vector> &&atoms, const Xmap &xMap, double mapWeight) : mAtoms(std::move(atoms)) , mXMap(xMap) , mMapWeight(mapWeight) { } double DensityRestraint::f(const AtomLocationProvider &atoms) const { double result = 0; for (auto &a : mAtoms) { clipper::Coord_orth p{atoms[a.first].m_x, atoms[a.first].m_y, atoms[a.first].m_z }; clipper::Coord_frac pf = p.coord_frac(mXMap.cell()); result += a.second * mXMap.interp(pf); } if (cif::VERBOSE > 2) std::cerr << "density::f() = " << -result << '\n'; return mMapWeight * -result; } void DensityRestraint::df(const AtomLocationProvider &atoms, DFCollector &df) const { if (cif::VERBOSE > 2) std::cerr << "density::df(): \n"; for (auto &a : mAtoms) { clipper::Coord_orth p{atoms[a.first].m_x, atoms[a.first].m_y, atoms[a.first].m_z }; clipper::Coord_frac pf = p.coord_frac(mXMap.cell()); auto pm = pf.coord_map(mXMap.grid_sampling()); clipper::Grad_map grad; double dv; clipper::Interp_cubic::interp_grad(mXMap, pm, dv, grad); auto gradFrac = grad.grad_frac(mXMap.grid_sampling()); auto gradOrth = gradFrac.grad_orth(mXMap.cell()); df.add(a.first, DPoint{gradOrth.dx(), gradOrth.dy(), gradOrth.dz()} * mMapWeight * -a.second); } } void DensityRestraint::print(const AtomLocationProvider &atoms) const { std::cout << "density \n"; } } // namespace pdb_redolibpdb-redo-3.3.0/src/SkipList.cpp0000644000175000017500000001147514773016616016620 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* Created by: Maarten L. Hekkelman Date: maandag 07 januari, 2019 */ #include #include #include "pdb-redo/SkipList.hpp" namespace fs = std::filesystem; namespace pdb_redo { // -------------------------------------------------------------------- void writeOLDSkipList(std::ostream &os, const SkipList &list) { os << ':'; for (auto &res : list) os << res.auth_asym_id << res.auth_seq_id << (res.pdbx_PDB_ins_code and *res.pdbx_PDB_ins_code ? *res.pdbx_PDB_ins_code : ' ') << ':'; } void writeCIFSkipList(std::ostream &os, const SkipList &list) { cif::file file; auto &db = file.emplace_back("skip"); auto &&[cat, ignore] = db.emplace("skip_list"); for (auto &res : list) cat->emplace({{"auth_asym_id", res.auth_asym_id}, {"auth_comp_id", res.auth_comp_id}, {"auth_seq_id", res.auth_seq_id}, {"pdbx_PDB_ins_code", std::string{res.pdbx_PDB_ins_code and *res.pdbx_PDB_ins_code ? *res.pdbx_PDB_ins_code : '?'}}, {"label_asym_id", res.label_asym_id}, {"label_comp_id", res.label_comp_id}, {"label_seq_id", res.label_seq_id}}); file.save(os); } // -------------------------------------------------------------------- void writeSkipList(std::ostream &os, const SkipList &list, SkipListFormat format) { switch (format) { case SkipListFormat::OLD: writeOLDSkipList(os, list); break; case SkipListFormat::CIF: writeCIFSkipList(os, list); break; default: break; } } void writeSkipList(const fs::path &file, const SkipList &list, SkipListFormat format) { std::ofstream os(file, std::ios::binary); writeSkipList(os, list, format); } // -------------------------------------------------------------------- SkipList readOLDSkipList(std::istream &is) { SkipList result; char separator = 0; if (is.rdbuf()->in_avail() > 0) is.read(&separator, 1); if (separator != ':') throw std::runtime_error("Not an old format skip list"); while (not is.eof()) { ResidueSpec spec{}; char chain = 0; is.read(&chain, 1); int seq_nr; is >> seq_nr; char ins_code = 0; is.read(&ins_code, 1); if (is.rdbuf()->in_avail() > 0) is.read(&separator, 1); if (chain == 0) break; if (separator != ':' and separator != 0) throw std::runtime_error("Invalid old format skiplist"); spec.auth_asym_id.push_back(chain); spec.auth_seq_id = std::to_string(seq_nr); if (ins_code != ' ' and ins_code != 0) spec.pdbx_PDB_ins_code = ins_code; result.push_back(spec); } return result; } SkipList readCIFSkipList(std::istream &is) { SkipList result; cif::file file; file.load(is); auto &db = file["skip"]; auto &cat = db["skip_list"]; for (const auto &[auth_asym_id, auth_comp_id, auth_seq_id, pdbx_PDB_ins_code, label_asym_id, label_comp_id, label_seq_id] : cat.rows("auth_asym_id", "auth_comp_id", "auth_seq_id", "pdbx_PDB_ins_code", "label_asym_id", "label_comp_id", "label_seq_id")) { result.emplace_back(auth_asym_id, auth_comp_id, auth_seq_id, pdbx_PDB_ins_code, label_asym_id, label_comp_id, label_seq_id); } return result; } SkipList readSkipList(std::istream &is) { try { return readCIFSkipList(is); } catch (const std::exception &e) { if (cif::VERBOSE > 0) std::cerr << e.what() << '\n'; is.rdbuf()->pubseekpos(0); } return readOLDSkipList(is); } SkipList readSkipList(std::filesystem::path &file) { std::ifstream is(file); return readSkipList(is); } } // namespace pdb_redolibpdb-redo-3.3.0/src/Statistics.cpp0000644000175000017500000007545714773016616017222 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include "pdb-redo/AtomShape.hpp" #include "pdb-redo/BondMap.hpp" #include "pdb-redo/ClipperWrapper.hpp" #include "pdb-redo/DistanceMap.hpp" #include "pdb-redo/Statistics.hpp" // -------------------------------------------------------------------- namespace pdb_redo { using cif::atom_type_traits; // -------------------------------------------------------------------- std::ostream &operator<<(std::ostream &os, const ResidueStatistics &st) { if (st.compID == "HOH") os << st.asymID << '_' << st.authSeqID << '_' << st.compID << '\t'; else os << st.asymID << '_' << st.seqID << '_' << st.compID << '\t'; os << st.RSR << '\t' << st.SRSR << '\t' << st.RSCCS << '\t' << st.ngrid << '\t' << st.EDIAm << '\t' << st.OPIA; return os; } // -------------------------------------------------------------------- double anorm(double x) { return 0.5 * erfc(-x * std::sqrt(0.5)); } double phinvs(double p) { // // ALGORITHM AS241 APPL. STATIST. (1988) VOL. 37, NO. 3. // // Produces the normal deviate Z corresponding to a given lower tail // area of P; Z is accurate to about 1 part in 10**16. // Coefficients for P close to 0.5 const double A[8] = { 3.3871328727963666080, 1.3314166789178437745e+2, 1.9715909503065514427e+3, 1.3731693765509461125e+4, 4.5921953931549871457e+4, 6.7265770927008700853e+4, 3.3430575583588128105e+4, 2.5090809287301226727e+3}, B[8] = {0, 4.2313330701600911252e+1, 6.8718700749205790830e+2, 5.3941960214247511077e+3, 2.1213794301586595867e+4, 3.9307895800092710610e+4, 2.8729085735721942674e+4, 5.2264952788528545610e+3}; // Coefficients for P not close to 0, 0.5 or 1. const double C[8] = { 1.42343711074968357734e0, 4.63033784615654529590e0, 5.76949722146069140550e0, 3.64784832476320460504e0, 1.27045825245236838258e0, 2.41780725177450611770e-1, 2.27238449892691845833e-2, 7.74545014278341407640e-4, }, D[8] = {0, 2.05319162663775882187e0, 1.67638483018380384940e0, 6.89767334985100004550e-1, 1.48103976427480074590e-1, 1.51986665636164571966e-2, 5.47593808499534494600e-4, 1.05075007164441684324e-9}; // Coefficients for P near 0 or 1. const double E[8] = { 6.65790464350110377720e0, 5.46378491116411436990e0, 1.78482653991729133580e0, 2.96560571828504891230e-1, 2.65321895265761230930e-2, 1.24266094738807843860e-3, 2.71155556874348757815e-5, 2.01033439929228813265e-7, }, F[8] = {0, 5.99832206555887937690e-1, 1.36929880922735805310e-1, 1.48753612908506148525e-2, 7.86869131145613259100e-4, 1.84631831751005468180e-5, 1.42151175831644588870e-7, 2.04426310338993978564e-15}; if (p < 0 or p > 1) throw std::runtime_error("P should be >=0 and <=1"); double q = p - 0.5; double result; if (std::abs(q) < 0.425) { double r = 0.180625e0 - q * q; result = q * (((((((A[7] * r + A[6]) * r + A[5]) * r + A[4]) * r + A[3]) * r + A[2]) * r + A[1]) * r + A[0]) / (((((((B[7] * r + B[6]) * r + B[5]) * r + B[4]) * r + B[3]) * r + B[2]) * r + B[1]) * r + 1); } else { double r; if (q < 0) r = p; else r = 1 - p; r = std::sqrt(-std::log(r)); if (r <= 5) { r -= 1.6; result = (((((((C[7] * r + C[6]) * r + C[5]) * r + C[4]) * r + C[3]) * r + C[2]) * r + C[1]) * r + C[0]) / (((((((D[7] * r + D[6]) * r + D[5]) * r + D[4]) * r + D[3]) * r + D[2]) * r + D[1]) * r + 1); } else { r -= 0.5; result = (((((((E[7] * r + E[6]) * r + E[5]) * r + E[4]) * r + E[3]) * r + E[2]) * r + E[1]) * r + E[0]) / (((((((F[7] * r + F[6]) * r + F[5]) * r + F[4]) * r + F[3]) * r + F[2]) * r + F[1]) * r + 1); } if (q < 0) result = -result; } return result; } double errsol(double a) { auto c = std::sqrt(2.0 / kPI); auto b = std::abs(a); double result = 0; if (b > 3 / c) { auto x = std::abs(std::pow(b, 1 / 3.0) - 2 * std::pow(kPI / b, 2)); if (a < 0) x = -x; for (;;) { auto xx = x * x; auto y = c * std::exp(-0.5 * xx); auto d = (b * (2 * anorm(x) - 1 - x * y) / xx - x) / (b * y - 3); x -= d; if (std::abs(d) <= 1e-4) break; } result = x; } return result; } // -------------------------------------------------------------------- class PointWeightFunction { public: PointWeightFunction(cif::point center, float atomRadius) : m_Center(center) , m_Radius(atomRadius) { m_P[0] = P{-1.0f, 0, 1.0f, 1.0822f}; m_P[1] = P{5.1177f, 1.29366f, -0.4f, 1.4043f}; m_P[2] = P{-0.9507f, 2, 0, 2}; } float operator()(cif::point p) const { float d = distance(m_Center, p); d /= m_Radius; float result = 0; for (auto &pi : m_P) { if (d > pi.x) continue; result = pi.m * (d - pi.c) * (d - pi.c) + pi.b; // assert(result != 0); if (result == 0) result = std::numeric_limits::epsilon(); break; } return result; } private: struct P { float m, c, b, x; }; cif::point m_Center; float m_Radius; P m_P[3]; }; // -------------------------------------------------------------------- struct AtomGridData { AtomGridData(const clipper::Coord_grid &gp, double density) : p(gp) , density(density) { } clipper::Coord_grid p; double density; }; struct AtomDataSums { std::size_t ngrid = 0; double rfSums[2] = {}; // sums for R-Factor double edSums[2] = {}; // Sums for ED1 and ED3 double ccSums[3] = {}; // Sums for CC calculation double rgSums[2] = {}; double swSums[3] = {}; // Sums used for sample CC calculation AtomDataSums &operator+=(const AtomDataSums &rhs) { ngrid += rhs.ngrid; rfSums[0] += rhs.rfSums[0]; rfSums[1] += rhs.rfSums[1]; edSums[0] += rhs.edSums[0]; edSums[1] += rhs.edSums[1]; ccSums[0] += rhs.ccSums[0]; ccSums[1] += rhs.ccSums[1]; ccSums[2] += rhs.ccSums[2]; rgSums[0] += rhs.rgSums[0]; rgSums[1] += rhs.rgSums[1]; swSums[0] += rhs.swSums[0]; swSums[1] += rhs.swSums[1]; swSums[2] += rhs.swSums[2]; return *this; } double cc() const { double s = (ccSums[1] - (edSums[0] * edSums[0]) / ngrid) * (ccSums[2] - (edSums[1] * edSums[1]) / ngrid); return (ccSums[0] - edSums[0] * edSums[1] / ngrid) / std::sqrt(s); } double srg() const { double rgsq = rgSums[0] / rgSums[1]; double rg = std::sqrt(rgsq); return std::sqrt(swSums[0] - rgsq * swSums[1] + 0.5 * rgsq * rgsq * swSums[2]) / (rg * rgSums[1]); } }; struct AtomData { AtomData(cif::mm::atom atom, float radius) : atom(atom) , asymID(atom.get_label_asym_id()) , seqID(atom.get_label_seq_id()) , authSeqID(atom.get_auth_seq_id()) , radius(radius) , occupancy(atom.get_occupancy()) { } cif::mm::atom atom; std::string asymID; int seqID; std::string authSeqID; // required for waters float radius; float occupancy; std::vector points; double averageDensity = 0; double edia = 0; AtomDataSums sums; }; // -------------------------------------------------------------------- std::tuple CalculateMapStatistics(const clipper::Xmap &f) { double sum = 0, sum2 = 0; int count = 0; for (auto ix = f.first(); not ix.last(); ix.next()) { auto v = f[ix]; if (std::isnan(v)) throw std::runtime_error("map contains NaN values"); ++count; sum += v; sum2 += v * v; } float meanDensity = static_cast(sum / count); float rmsDensity = static_cast(std::sqrt((sum2 / count) - (meanDensity * meanDensity))); return std::make_tuple(meanDensity, rmsDensity); } // -------------------------------------------------------------------- class BoundingBox { public: template BoundingBox(const cif::mm::structure &structure, List atoms, float margin) { mXMin = mYMin = mZMin = std::numeric_limits::max(); mXMax = mYMax = mZMax = std::numeric_limits::min(); for (auto &atom : atoms) { auto l = atom.get_location(); if (mXMin > l.m_x) mXMin = l.m_x; if (mXMax < l.m_x) mXMax = l.m_x; if (mYMin > l.m_y) mYMin = l.m_y; if (mYMax < l.m_y) mYMax = l.m_y; if (mZMin > l.m_z) mZMin = l.m_z; if (mZMax < l.m_z) mZMax = l.m_z; } mXMin -= margin; mXMax += margin; mYMin -= margin; mYMax += margin; mZMin -= margin; mZMax += margin; } bool contains(const cif::point &p) const { return p.m_x >= mXMin and p.m_x <= mXMax and p.m_y >= mYMin and p.m_y <= mYMax and p.m_z >= mZMin and p.m_z <= mZMax; } private: float mXMin, mXMax, mYMin, mYMax, mZMin, mZMax; }; // -------------------------------------------------------------------- StatsCollector::StatsCollector(const MapMaker &mm, cif::mm::structure &structure, bool electronScattering) : mStructure(structure) , mMapMaker(mm) , mElectronScattering(electronScattering) { mSpacegroup = mm.spacegroup(); mCell = mm.cell(); mGrid = mm.gridSampling(); mResHigh = static_cast(mm.resHigh()); mResLow = static_cast(mm.resLow()); initialize(); } void StatsCollector::initialize() { // easiest way to prime this map: for (auto &asym_id : mStructure.get_datablock()["struct_asym"].rows("id")) mRmsScaled[asym_id] = { 1, 1 }; mMeanDensityFb = mMapMaker.fb().meanDensity(); mRMSDensityFb = mMapMaker.fb().rmsDensity(); mRMSDensityFd = mMapMaker.fd().rmsDensity(); // calculate degrees of freedom auto omcd = mCell.matrix_orth(); mVF = 1; mVC = 1; for (int i = 0; i < 3; ++i) { mVC *= omcd(i, i); mVF *= omcd(i, i) / mGrid[i]; } mVF *= std::pow(2 / mResHigh, 3); mSZ = 0; // double so = 0; // const double C = std::sqrt(2.0 / kPI); for (auto &a : mStructure.atoms()) { auto t = a.get_type(); if (t <= cif::atom_type::He) continue; float w = a.get_occupancy() * static_cast(t); if (w <= 0) continue; mSZ += w; // float bIso = Util::u2b(a.uIso()); // if (bIso < 4) // bIso = 4; // float x = std::sqrt(bIso) / mResHigh; // x = w * (2 * anorm(x) - 1 - C * x * std::exp(-0.5 * std::pow(x, 2))) / std::pow(x, 3); // // so += x; } // auto bo = mSZ; mSZ = mSZ * mSpacegroup.num_symops() / mVC; // mMeanBIso = std::pow(mResHigh * errsol(bo / so), 2); // Calculate overall rms data std::vector atomData; for (auto atom : mStructure.atoms()) { AtomShape shape(atom, mResHigh, mResLow, mElectronScattering); float radius = shape.radius(); if (cif::VERBOSE > 2) std::cerr << (atomData.size() + 1) << '\t' << atom_type_traits(atom.get_type()).symbol() << '\t' << radius << '\n'; atomData.emplace_back(atom, radius); } GridPtDataMap gridPointDensity; std::map> zScoresPerAsym; sumDensity(atomData, gridPointDensity, zScoresPerAsym); // Now that we have the density data, we can calculate the correction/rescale factors for (auto zsc : zScoresPerAsym) { // collect array of z-scores std::vector &zdca0 = zsc.second; auto &z = zdca0; auto vf = mVF; sort(z.begin(), z.end()); double qa = 0, qb = 1; std::size_t nd = z.size(); std::size_t n = static_cast(round(vf * nd)); if (n > 100) { std::size_t i1 = static_cast((n + 1) * anorm(-1.5)) + 1; std::size_t i2 = static_cast((n + 1) * anorm(1.5)); std::size_t ns = i2 - i1 + 1; double vr = (nd - 1) / (n - 1.0); double sw = 0, swx = 0, swxs = 0, swy = 0, swxy = 0, swys = 0; for (auto i = i1; i <= i2; ++i) { double qx = phinvs(static_cast(i) / (n + 1)); double x = vr * i; std::size_t j = static_cast(x); x -= j; // assert(j < z.size()); if (j < 1 or j >= z.size()) continue; auto qyd = (1.0 - x) * z[j - 1] + x * z[j] - qx; auto wx = std::exp(-0.5 * qx * qx); sw += wx; swx += wx * qx; swxs += wx * qx * qx; swy += wx * qyd; swxy += wx * qx * qyd; swys += wx * qyd * qyd; } double dd = 1.0 / (sw * swxs - swx * swx); qa = dd * (swxs * swy - swx * swxy); qb = dd * (sw * swxy - swx * swy); if (cif::VERBOSE > 1) { swys = dd * (swys - (qa * swy + qb * swxy)) / (ns - 2); std::cerr << '\n' << "Intercept & gradient before LS: " << qa << " (" << std::sqrt(swys * swxs) << ") " << qb << " (" << std::sqrt(swys * sw) << ')' << '\n'; } qb += 1.0; if (cif::VERBOSE > 1) { std::cerr << '\n' << "Rescale SD(delta-rho) using Q-Q plot for asym " << zsc.first << ':' << '\n' << std::string(54, '=') << '\n' << "Input & updated SD(delta-rho): " << mRMSDensityFd << " ; " << qb * mRMSDensityFd << '\n' << '\n'; } } mRmsScaled[zsc.first] = std::make_pair(qa * mRMSDensityFd, qb * mRMSDensityFd); } } std::vector StatsCollector::collect() const { residue_list residues; std::vector atoms; for (auto atom : mStructure.atoms()) { if (atom.is_water()) continue; auto k = std::make_tuple(atom.get_label_asym_id(), atom.get_label_seq_id(), atom.get_auth_seq_id()); if (residues.empty() or residues.back() != k) { residues.emplace_back(std::move(k)); atoms.emplace_back(std::move(atom)); } } BoundingBox bbox(mStructure, atoms, 5.0f); return collect(residues, bbox, true); } std::vector StatsCollector::collect(const std::string &asymID) const { residue_list residues; std::vector atoms; for (auto atom_id : mStructure.get_datablock()["atom_site"].find(cif::key("label_asym_id") == asymID, "id")) { auto &atom = atoms.emplace_back(mStructure.get_atom_by_id(atom_id)); auto k = std::make_tuple(atom.get_label_asym_id(), atom.get_label_seq_id(), atom.get_auth_seq_id()); if (residues.empty() or residues.back() != k) { residues.emplace_back(std::move(k)); atoms.emplace_back(std::move(atom)); } } BoundingBox bbox(mStructure, atoms, 5.0f); return collect(residues, bbox, false); } std::vector StatsCollector::collect(const std::string &asymID, int resFirst, int resLast, bool authNameSpace) const { residue_list residues; std::vector atoms; // for (auto atom : mStructure.atoms()) // { // if (atom.is_water()) // continue; // if (authNameSpace) // { // int auth_seq_id = stoi(atom.get_auth_seq_id()); // if (atom.get_auth_asym_id() != asymID or auth_seq_id < resFirst or auth_seq_id > resLast) // continue; // } // else // { // if (atom.get_label_asym_id() != asymID or atom.get_label_seq_id() < resFirst or atom.get_label_seq_id() > resLast) // continue; // } // auto k = std::make_tuple(atom.get_label_asym_id(), atom.get_label_seq_id(), atom.get_auth_seq_id()); // if (residues.empty() or residues.back() != k) // { // residues.emplace_back(move(k)); // atoms.emplace_back(std::move(atom)); // } // } for (auto atom : mStructure.atoms()) { if (atom.is_water()) continue; if (authNameSpace) { int auth_seq_id = stoi(atom.get_auth_seq_id()); if (atom.get_auth_asym_id() != asymID or auth_seq_id < resFirst or auth_seq_id > resLast) continue; } else { if (atom.get_label_asym_id() != asymID or atom.get_label_seq_id() < resFirst or atom.get_label_seq_id() > resLast) continue; } auto k = std::make_tuple(atom.get_label_asym_id(), atom.get_label_seq_id(), atom.get_auth_seq_id()); if (residues.empty() or residues.back() != k) residues.emplace_back(std::move(k)); } for (const auto &[asymID, seqID, authSeqID] : residues) { auto &res = mStructure.get_residue(asymID, seqID, authSeqID); for (auto atom : res.unique_atoms()) atoms.push_back(atom); } BoundingBox bbox(mStructure, atoms, 5.0f); return collect(residues, bbox, false); } std::vector StatsCollector::collect(const residue_list &residues, BoundingBox &bbox, bool addWaters) const { std::vector atomData; // BoundingBox bb(mStructure, residues, 5.0f); for (auto atom : mStructure.atoms()) { if (atom.is_water()) { if (not addWaters) continue; } else if (not bbox.contains(atom.get_location())) continue; AtomShape shape(atom, mResHigh, mResLow, mElectronScattering); float radius = shape.radius(); if (cif::VERBOSE > 2) std::cerr << (atomData.size() + 1) << '\t' << atom_type_traits(atom.get_type()).symbol() << '\t' << radius << '\n'; atomData.emplace_back(atom, radius); } calculate(atomData); std::set missing; std::vector result; // And now collect the per residue information for (const auto &[asymID, seqID, authSeqID] : residues) { // TODO: Need to do something with hetero residues (alternate compound types) auto &res = mStructure.get_residue(asymID, seqID, authSeqID); auto compID = res.get_compound_id(); AtomDataSums sums; std::vector resAtomData; for (const auto &d : atomData) { if (d.asymID == asymID and d.seqID == seqID and d.authSeqID == authSeqID) resAtomData.push_back(&d); } std::vector atomIDs; try { if (not missing.count(compID)) { atomIDs = BondMap::atomIDsForCompound(compID); for (auto &compAtom : atomIDs) { if (compAtom == "OXT") continue; for (auto d : resAtomData) { if (d->atom.get_label_atom_id() != compAtom) continue; // We used to factor in the occupancy here, but that seems to be incorrect // since occupancy was already used. // sums += d->sums * d->occupancy; sums += d->sums; break; } resAtomData.erase( std::remove_if(resAtomData.begin(), resAtomData.end(), [id = compAtom](const AtomData *d) { return d->atom.get_label_atom_id() == id; }), resAtomData.end()); } } } catch (const BondMapException &ex) { std::cerr << "Missing information for compound '" << compID << '\'' << '\n' << ex.what() << '\n'; missing.insert(compID); } // atoms that were present but not part of the Compound for (auto d : resAtomData) sums += d->sums; // EDIA std::set alts; if (not missing.count(compID)) alts = res.get_alternate_ids(); if (alts.empty()) alts.insert(""); double EDIAm = 0, OPIA = 0, OCC = 0; for (auto alt : alts) { double ediaSum = 0, occSum = 0; std::size_t n = 0, m = 0; for (const auto &d : atomData) { if (d.asymID != asymID or d.seqID != seqID or d.authSeqID != authSeqID) continue; if (alt.empty()) { resAtomData.push_back(&d); continue; } auto altd = d.atom.get_label_alt_id(); if (altd.empty() or altd == alt) resAtomData.push_back(&d); } if (atomIDs.empty()) { for (const auto &d : resAtomData) { occSum += d->occupancy; ediaSum += std::pow(d->edia + 0.1, -2); ++n; if (d->edia >= 0.8) ++m; } } else { for (auto &compAtom : atomIDs) { if (compAtom == "OXT") continue; for (auto d : resAtomData) { if (d->atom.get_label_atom_id() != compAtom) continue; occSum += d->occupancy; ediaSum += std::pow(d->edia + 0.1, -2); ++n; if (d->edia >= 0.8) ++m; } } } if (n == 0) // I'm paranoid continue; OCC += occSum; EDIAm += occSum * (1 / std::sqrt(ediaSum / n) - 0.1); OPIA += occSum * (100. * m / n); } if (atomIDs.empty()) { EDIAm = std::nan("0"); OPIA = std::nan("0"); } else { EDIAm /= OCC; OPIA /= OCC; } result.emplace_back(ResidueStatistics{asymID, seqID, compID, authSeqID, (sums.rfSums[0] / sums.rfSums[1]), // rsr sums.srg(), // srsr sums.cc(), // rsccs EDIAm, // ediam OPIA, // opia static_cast(round(mVF * sums.ngrid))}); // ngrid } if (addWaters) { for (const auto &d : atomData) { const cif::mm::atom &atom = d.atom; if (not atom.is_water()) continue; result.emplace_back(ResidueStatistics{d.asymID, d.seqID, "HOH", d.authSeqID, (d.sums.rfSums[0] / d.sums.rfSums[1]), // rsr d.sums.srg(), // srsr d.sums.cc(), // rsccs d.edia, // ediam (d.edia > 0.8 ? 100. : 0.), // opia static_cast(round(mVF * d.sums.ngrid))}); // ngrid } } return result; } ResidueStatistics StatsCollector::collect(std::initializer_list residues) const { std::vector atoms; for (auto &r : residues) for (auto a : r->atoms()) atoms.push_back(a); return collect(atoms); } ResidueStatistics StatsCollector::collect(std::initializer_list atoms) const { std::vector v(atoms); return collect(v); } ResidueStatistics StatsCollector::collect(const std::vector &atoms) const { std::vector atomData; BoundingBox bb(mStructure, atoms, 4.f); for (auto atom : mStructure.atoms()) { if (not bb.contains(atom.get_location())) continue; AtomShape shape(atom, mResHigh, mResLow, mElectronScattering); float radius = shape.radius(); if (cif::VERBOSE > 2) std::cerr << (atomData.size() + 1) << '\t' << atom_type_traits(atom.get_type()).symbol() << '\t' << radius << '\n'; atomData.emplace_back(atom, radius); } calculate(atomData); AtomDataSums sums; std::size_t n = 0, m = 0; double ediaSum = 0; for (auto &atom : atoms) { ++n; auto ci = find_if(atomData.begin(), atomData.end(), [=](auto &d) { return d.asymID == atom.get_label_asym_id() and d.seqID == atom.get_label_seq_id() and d.atom.get_label_atom_id() == atom.get_label_atom_id(); }); if (ci == atomData.end()) continue; sums += ci->sums; ediaSum += std::pow(ci->edia + 0.1, -2); if (ci->edia >= 0.8) ++m; } ResidueStatistics result{ "", 0, "", "", (sums.rfSums[0] / sums.rfSums[1]), // rsr sums.srg(), // srsr sums.cc(), // rsccs 1 / std::sqrt(ediaSum / n) - 0.1, // ediam 100. * m / n, // opia static_cast(round(mVF * sums.ngrid)) // ngrid }; return result; } void StatsCollector::sumDensity(std::vector &atomData, GridPtDataMap &gridPointDensity, std::map> &zScoresPerAsym) const { using namespace clipper; const Xmap &Fb = mMapMaker.fb(); const Xmap &Fd = mMapMaker.fd(); // First step, iterate over atoms, then over grid points covered by this atom // collecting per gridpoint statistics for (auto &data : atomData) { auto &atom = data.atom; if (atom.get_occupancy() == 0) continue; AtomShape shape(atom, mResHigh, mResLow, mElectronScattering); std::string asymID = data.asymID; if (atom.is_water()) asymID = "0"; auto radius = data.radius; double sumDensity = 0; iterateGrid(atom.get_location(), radius, Fb, [&, radius_sq = radius * radius](Xmap_base::Map_reference_coord &iw) { cif::point p = iw.coord_orth(); double d = distance_squared(p, atom.get_location()); if (d <= radius_sq) { double density = shape.calculatedDensity(p); if (std::isnan(density)) return; gridPointDensity[iw.coord()] += density; data.points.emplace_back(iw.coord(), density); sumDensity += density; zScoresPerAsym[data.asymID].push_back(Fd[iw] / (Fd.multiplicity(iw.coord()) * mRMSDensityFd)); } }); data.averageDensity = sumDensity / data.points.size(); } } void StatsCollector::collectSums(std::vector &atomData, GridPtDataMap &gridPointDensity) const { using namespace clipper; const Xmap &Fb = mMapMaker.fb(); const Xmap &Fd = mMapMaker.fd(); cif::progress_bar progress_bar(atomData.size(), "Stats calculation"); // Iterate over the atom data to collect the sums for (auto &d : atomData) { auto rmsi = mRmsScaled.find(d.asymID); if (rmsi == mRmsScaled.end()) continue; auto rmsScaledF = rmsi->second; for (auto gp : d.points) { ++d.sums.ngrid; auto gpd = gridPointDensity[gp.p]; if (gpd == 0) continue; double e = gp.density / gpd; double t = e * mSZ / rmsScaledF.second; clipper::Xmap_base::Map_reference_coord ix(Fb, gp.p); double fb = Fb[ix]; double fd = Fd[ix]; double ed1 = e * (fb - rmsScaledF.first) / rmsScaledF.second + t; double ed2 = e * (fd - rmsScaledF.first) / rmsScaledF.second; double ed3 = ed1 - ed2; d.sums.rfSums[0] += std::abs(ed2); d.sums.rfSums[1] += std::abs(ed1 + ed3); double w = gp.density / d.averageDensity; if (w < 0) w = 0; if (w > 1) w = 1; d.sums.rgSums[0] += w * ed2 * ed2; d.sums.rgSums[1] += w * ed1 * ed1; d.sums.swSums[0] += (w * ed2) * (w * ed2); d.sums.swSums[1] += (w * ed1) * (w * ed2); d.sums.swSums[2] += (w * ed1) * (w * ed1); ed1 -= t; ed3 -= t; d.sums.ccSums[0] += ed1 * ed3; d.sums.ccSums[1] += ed1 * ed1; d.sums.ccSums[2] += ed3 * ed3; d.sums.edSums[0] += ed1; d.sums.edSums[1] += ed3; } progress_bar.consumed(1); } } void StatsCollector::calculate(std::vector &atomData) const { GridPtDataMap gridPointDensity; std::map> zScoresPerAsym; sumDensity(atomData, gridPointDensity, zScoresPerAsym); collectSums(atomData, gridPointDensity); } // -------------------------------------------------------------------- EDIAStatsCollector::EDIAStatsCollector(const MapMaker &mm, cif::mm::structure &structure, bool electronScattering) : StatsCollector(mm, structure, electronScattering) { // create a atom radius map, for EDIA const double kResolutions[] = { 0.5, 1.0, 1.5, 2.0, 2.5}; // The following numbers were harvested with the application collect-b-factors const double kAverageBFactors[] = { 6.31912, // 0.5 14.4939, // 1.0 20.8827, // 1.5 27.7075, // 2.0 55.6378 // 2.5 }; const int kAverageBFactorCount = sizeof(kAverageBFactors) / sizeof(double); int i = static_cast(floor(mResHigh / 0.5)) - 1; if (i > kAverageBFactorCount - 1) i = kAverageBFactorCount - 1; if (i < 0) i = 0; float ediaBFactor; if (i < kAverageBFactorCount - 1) ediaBFactor = kAverageBFactors[i] + ((kAverageBFactors[i + 1] - kAverageBFactors[i]) * (mResHigh - kResolutions[i]) / (kResolutions[i + 1] - kResolutions[i])); else ediaBFactor = kAverageBFactors[i]; if (cif::VERBOSE > 1) std::cerr << "Calculating radii with B Factor " << ediaBFactor << '\n'; for (auto atom : mStructure.atoms()) { if (mRadii.count(atom.get_type())) continue; AtomShape shape(atom, mResHigh, mResLow, mElectronScattering, ediaBFactor); mRadii[atom.get_type()] = shape.radius(); if (cif::VERBOSE > 1) std::cerr << "Radius for atom with type " << atom_type_traits(atom.get_type()).symbol() << " is " << mRadii[atom.get_type()] << '\n'; } } void EDIAStatsCollector::calculate(std::vector &atomData) const { StatsCollector::calculate(atomData); const clipper::Xmap &Fb = mMapMaker.fb(); // Xmap& fd = mMapMaker.fd(); struct lessAtom { bool operator()(const cif::mm::atom &a, const cif::mm::atom &b) const { return a.id().compare(b.id()) < 0; } }; typedef std::set atomSet; // Calculate EDIA scores DistanceMap dm(mStructure, 3.5f); BondMap bm = createBondMap(atomData); cif::progress_bar progress_bar(atomData.size(), "EDIA calculation"); for (auto &data : atomData) { auto &atom = data.atom; float radius = mRadii.at(atom.get_type()); PointWeightFunction w(atom.get_location(), radius); std::vector atomsNearBy = dm.near(atom, 3.5f); std::vector wn; for (auto a : atomsNearBy) wn.emplace_back(a.get_location(), mRadii.at(a.get_type())); float ediaSum[2] = {}; iterateGrid(atom.get_location(), radius, Fb, [&](auto iw) { cif::point p = iw.coord_orth(); // EDIA calculations auto fb = Fb[iw]; float z = 0; if (fb >= mMeanDensityFb + mRMSDensityFb) z = static_cast((fb - mMeanDensityFb) / mRMSDensityFb); if (z > 1.2) z = 1.2f; float wp = w(p); // And divide the ownership atomSet S, D, I; if (wp != 0) { if (wp < 0) D.insert(atom); else { S.insert(atom); I.insert(atom); } } for (std::size_t i = 0; i < atomsNearBy.size(); ++i) { float wpi = wn[i](p); if (wpi == 0) continue; if (wpi < 0) D.insert(atomsNearBy[i]); else if (wpi > 0) { S.insert(atomsNearBy[i]); if (not bm(atomsNearBy[i], atom)) I.insert(atomsNearBy[i]); } } float o = 0; if (wp > 0) { if (I.size() == 1) o = 1; else { float sumpb = accumulate(I.begin(), I.end(), 0.f, [p](float s, const cif::mm::atom& b) -> float { return s + distance(p, b.get_location()); }); o = 1 - distance(atom.get_location(), p) / sumpb; } } else if (D.count(atom) and S.empty()) { if (D.size() == 1) o = 1; else { float sumpb = accumulate(D.begin(), D.end(), 0.f, [p](float s, const cif::mm::atom& b) -> float { return s + distance(p, b.get_location()); }); o = 1 - distance(atom.get_location(), p) / sumpb; } } ediaSum[0] += z * wp * o; if (wp > 0) ediaSum[1] += wp; }); data.edia = ediaSum[0] / ediaSum[1]; if (data.edia < 0) data.edia = 0; progress_bar.consumed(1); } } BondMap EDIAStatsCollector::createBondMap(std::vector &atomData) const { std::vector pts; for (auto a : atomData) pts.emplace_back(a.atom.get_location()); cif::point center = cif::centroid(pts); float radius = 0; for (auto pt : pts) { auto d = distance(pt, center); if (radius < d) radius = d; } return { mStructure.get_datablock(), std::make_tuple(center, radius + 3.5f) }; } } // namespace pdb_redo libpdb-redo-3.3.0/src/TLS.cpp0000644000175000017500000012452714773016616015523 0ustar maartenmaarten/* Created by: Maarten L. Hekkelman Date: dinsdag 07 november, 2017 Copyright 2017 NKI AVL Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "pdb-redo/TLS.hpp" #include #include #include namespace pdb_redo { const int kResidueNrWildcard = std::numeric_limits::min(), kNoSeqNum = std::numeric_limits::max() - 1; // -------------------------------------------------------------------- // We parse selection statements and create a selection expression tree // which is then interpreted by setting the selected flag for the // residues. After that, the selected ranges are collected and printed. struct tls_residue { std::string chainID; int seqNr = 0; char iCode; std::string name; bool selected; std::string asymID; int seqID = 0; bool operator==(const tls_residue &rhs) const { return chainID == rhs.chainID and seqNr == rhs.seqNr and iCode == rhs.iCode and cif::iequals(name, rhs.name) and selected == rhs.selected; } }; void dump_selection(const std::vector &selected, std::size_t indentLevel) { std::string indent(indentLevel * 2, ' '); auto i = selected.begin(); bool first = true; // First print in PDB space while (i != selected.end()) { auto b = find_if(i, selected.end(), [](auto s) -> bool { return s.selected; }); if (b == selected.end()) break; if (first) std::cout << indent << "PDB:\n"; first = false; auto e = find_if(b, selected.end(), [b](auto s) -> bool { return s.chainID != b->chainID or not s.selected; }); std::cout << indent << " >> " << b->chainID << ' ' << b->seqNr << ':' << (e - 1)->seqNr << '\n'; i = e; } // Then in mmCIF space if (not first) std::cout << indent << "mmCIF:\n"; i = selected.begin(); while (i != selected.end()) { auto b = find_if(i, selected.end(), [](auto s) -> bool { return s.selected; }); if (b == selected.end()) break; auto e = find_if(b, selected.end(), [b](auto s) -> bool { return s.asymID != b->asymID or not s.selected; }); std::string asymID = b->asymID; int from = b->seqID, to = from; for (auto j = b + 1; j != e; ++j) { if (j->seqID == to + 1) to = j->seqID; else if (j->seqID != to) // probably an insertion code { if (from == kNoSeqNum or to == kNoSeqNum) std::cout << indent << " >> " << asymID << '\n'; else std::cout << indent << " >> " << asymID << ' ' << from << ':' << to << '\n'; asymID = b->asymID; from = to = b->seqID; } } if (from == kNoSeqNum or to == kNoSeqNum) std::cout << indent << " >> " << asymID << '\n'; else std::cout << indent << " >> " << asymID << ' ' << from << ':' << to << '\n'; i = e; } if (first) { using namespace cif::colour; std::cout << indent << cif::coloured("Empty selection", white, red, bold) << '\n'; } } std::vector> tls_selection::get_ranges(cif::datablock &db, bool pdbNamespace) const { std::vector selected; // Collect the residues from poly seq scheme... for (auto r : db["pdbx_poly_seq_scheme"]) { std::string chain, seqNr, iCode, name; std::string asymID; int seqID = 0; if (pdbNamespace) cif::tie(chain, seqNr, iCode, name, asymID, seqID) = r.get("pdb_strand_id", "pdb_seq_num", "pdb_ins_code", "pdb_mon_id", "asym_id", "seq_id"); else { cif::tie(chain, seqNr, name) = r.get("asym_id", "seq_id", "mon_id"); asymID = chain; seqID = stoi(seqNr); } if (seqNr.empty()) continue; if (iCode.length() > 1) throw std::runtime_error("invalid iCode"); selected.push_back({ chain, stoi(seqNr), iCode[0], name, false, asymID, seqID }); } // ... those from the nonpoly scheme for (auto r : db["pdbx_nonpoly_scheme"]) { std::string chain, seqNr, iCode, name, asymID; if (pdbNamespace) { cif::tie(chain, seqNr, iCode, name, asymID) = r.get("pdb_strand_id", "pdb_seq_num", "pdb_ins_code", "pdb_mon_id", "asym_id"); if (seqNr.empty()) continue; } else { cif::tie(chain, name) = r.get("asym_id", "mon_id"); asymID = chain; seqNr = "0"; } if (cif::iequals(name, "HOH") or cif::iequals(name, "H2O")) continue; if (iCode.length() > 1) throw std::runtime_error("invalid iCode"); selected.push_back({ chain, stoi(seqNr), iCode[0], name, false, asymID, kNoSeqNum }); } // ... those from the nonpoly scheme for (auto r : db["pdbx_branch_scheme"]) { std::string chain, seqNr, iCode, name, asymID; if (pdbNamespace) { cif::tie(chain, seqNr, iCode, name, asymID) = r.get("auth_asym_id", "pdb_seq_num", "pdb_ins_code", "pdb_mon_id", "asym_id"); if (seqNr.empty()) continue; } else { cif::tie(chain, name) = r.get("asym_id", "mon_id"); asymID = chain; seqNr = "0"; } if (iCode.length() > 1) throw std::runtime_error("invalid iCode"); selected.push_back({ chain, stoi(seqNr), iCode[0], name, false, asymID, kNoSeqNum }); } // selected might consist of multiple ranges // output per chain stable_sort(selected.begin(), selected.end(), [](auto &a, auto &b) -> bool { int d = a.chainID.compare(b.chainID); if (d == 0) d = a.seqNr - b.seqNr; return d < 0; }); collect_residues(db, selected); std::vector> result; if (pdbNamespace) { auto i = selected.begin(); while (i != selected.end()) { auto b = find_if(i, selected.end(), [](auto s) -> bool { return s.selected; }); if (b == selected.end()) break; auto e = find_if(b, selected.end(), [b](auto s) -> bool { return s.chainID != b->chainID or not s.selected; }); // return ranges with strict increasing sequence numbers. // So when there's a gap in the sequence we split the range. // Beware of iCodes though result.push_back(std::make_tuple(b->chainID, b->seqNr, b->seqNr)); for (auto j = b + 1; j != e; ++j) { if (j->seqNr == std::get<2>(result.back()) + 1) std::get<2>(result.back()) = j->seqNr; else if (j->seqNr != std::get<2>(result.back())) // probably an insertion code result.push_back(std::make_tuple(b->chainID, j->seqNr, j->seqNr)); } i = e; } } else { auto i = selected.begin(); while (i != selected.end()) { auto b = find_if(i, selected.end(), [](auto s) -> bool { return s.selected; }); if (b == selected.end()) break; auto e = find_if(b, selected.end(), [b](auto s) -> bool { return s.asymID != b->asymID or not s.selected; }); // return ranges with strict increasing sequence numbers. // So when there's a gap in the sequence we split the range. // Beware of iCodes though result.push_back(std::make_tuple(b->asymID, b->seqID, b->seqID)); for (auto j = b + 1; j != e; ++j) { if (j->seqID == std::get<2>(result.back()) + 1) std::get<2>(result.back()) = j->seqID; else if (j->seqID != std::get<2>(result.back())) // probably an insertion code result.push_back(std::make_tuple(b->asymID, j->seqID, j->seqID)); } i = e; } } for (auto &&[name, i1, i2] : result) { if (i1 == kNoSeqNum) i1 = 0; if (i2 == kNoSeqNum) i2 = 0; } return result; } struct tls_selection_not : public tls_selection { tls_selection_not(std::unique_ptr selection) : selection(selection.release()) { } void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { selection->collect_residues(db, residues, indentLevel + 1); for (auto &r : residues) r.selected = not r.selected; if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "NOT\n"; dump_selection(residues, indentLevel); } } std::unique_ptr selection; }; struct tls_selection_all : public tls_selection { tls_selection_all() {} void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { for (auto &r : residues) r.selected = true; if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "ALL\n"; dump_selection(residues, indentLevel); } } }; struct tls_selection_chain : public tls_selection_all { tls_selection_chain(const std::string &chainID) : m_chain(chainID) { } void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { bool allChains = m_chain == "*"; for (auto &r : residues) r.selected = allChains or r.chainID == m_chain; if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "CHAIN " << m_chain << '\n'; dump_selection(residues, indentLevel); } } std::string m_chain; }; struct tls_selection_res_id : public tls_selection_all { tls_selection_res_id(int seqNr, char iCode) : m_seq_nr(seqNr) , m_icode(iCode) { } void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { for (auto &r : residues) r.selected = r.seqNr == m_seq_nr and r.iCode == m_icode; if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "ResID " << m_seq_nr << (m_icode ? std::string{ m_icode } : "") << '\n'; dump_selection(residues, indentLevel); } } int m_seq_nr; char m_icode; }; struct tls_selection_range_seq : public tls_selection_all { tls_selection_range_seq(int first, int last) : m_first(first) , m_last(last) { } void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { for (auto &r : residues) { r.selected = ((r.seqNr >= m_first or m_first == kResidueNrWildcard) and (r.seqNr <= m_last or m_last == kResidueNrWildcard)); } if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "Range " << m_first << ':' << m_last << '\n'; dump_selection(residues, indentLevel); } } int m_first, m_last; }; struct tls_selection_range_id : public tls_selection_all { tls_selection_range_id(int first, int last, char icodeFirst = 0, char icodeLast = 0) : m_first(first) , m_last(last) , m_icode_first(icodeFirst) , m_icode_last(icodeLast) { } void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { // need to do this per chain std::set chains; for (auto &r : residues) chains.insert(r.chainID); for (std::string chain : chains) { auto f = find_if(residues.begin(), residues.end(), [this,chain](auto r) -> bool { return r.chainID == chain and r.seqNr == m_first and r.iCode == m_icode_first; }); auto l = find_if(residues.begin(), residues.end(), [this,chain](auto r) -> bool { return r.chainID == chain and r.seqNr == m_last and r.iCode == m_icode_last; }); if (f != residues.end() and l != residues.end() and f <= l) { ++l; for (; f != l; ++f) f->selected = true; } } if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "Through " << m_first << ':' << m_last << '\n'; dump_selection(residues, indentLevel); } } int m_first, m_last; char m_icode_first, m_icode_last; }; struct tls_selection_union : public tls_selection { tls_selection_union(std::unique_ptr &lhs, std::unique_ptr &rhs) : lhs(lhs.release()) , rhs(rhs.release()) { } tls_selection_union(std::unique_ptr &lhs, std::unique_ptr &&rhs) : lhs(lhs.release()) , rhs(rhs.release()) { } void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { auto a = residues; for_each(a.begin(), a.end(), [](auto &r) { r.selected = false; }); auto b = residues; for_each(b.begin(), b.end(), [](auto &r) { r.selected = false; }); lhs->collect_residues(db, a, indentLevel + 1); rhs->collect_residues(db, b, indentLevel + 1); for (auto ai = a.begin(), bi = b.begin(), ri = residues.begin(); ri != residues.end(); ++ai, ++bi, ++ri) ri->selected = ai->selected or bi->selected; if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "Union\n"; dump_selection(residues, indentLevel); } } std::unique_ptr lhs; std::unique_ptr rhs; }; struct tls_selection_intersection : public tls_selection { tls_selection_intersection(std::unique_ptr &lhs, std::unique_ptr &rhs) : lhs(lhs.release()) , rhs(rhs.release()) { } tls_selection_intersection(std::unique_ptr &lhs, std::unique_ptr &&rhs) : lhs(lhs.release()) , rhs(rhs.release()) { } void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { auto a = residues; for_each(a.begin(), a.end(), [](auto &r) { r.selected = false; }); auto b = residues; for_each(b.begin(), b.end(), [](auto &r) { r.selected = false; }); lhs->collect_residues(db, a, indentLevel + 1); rhs->collect_residues(db, b, indentLevel + 1); for (auto ai = a.begin(), bi = b.begin(), ri = residues.begin(); ri != residues.end(); ++ai, ++bi, ++ri) ri->selected = ai->selected and bi->selected; if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "Intersection\n"; dump_selection(residues, indentLevel); } } std::unique_ptr lhs; std::unique_ptr rhs; }; struct tls_selection_by_name : public tls_selection_all { public: tls_selection_by_name(const std::string &resname) : m_name(resname) { } void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { for (auto &r : residues) r.selected = r.name == m_name; if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "Name " << m_name << '\n'; dump_selection(residues, indentLevel); } } std::string m_name; }; struct tls_selection_by_element : public tls_selection_all { public: tls_selection_by_element(const std::string &element) : m_element(element) { } void collect_residues(cif::datablock &db, std::vector &residues, std::size_t indentLevel) const override { // rationale... We want to select residues only. So we select // residues that have just a single atom of type m_element. // And we assume these have as residue name... m_element. // ... Right? for (auto &r : residues) r.selected = cif::iequals(r.name, m_element); if (cif::VERBOSE > 0) { std::cout << std::string(indentLevel * 2, ' ') << "Element " << m_element << '\n'; dump_selection(residues, indentLevel); } } std::string m_element; }; // -------------------------------------------------------------------- class tls_selection_parser_impl { public: tls_selection_parser_impl(const std::string &selection) : m_selection(selection) , m_p(m_selection.begin()) , m_end(m_selection.end()) { } virtual std::unique_ptr Parse() = 0; protected: virtual int get_next_token() = 0; virtual void match(int token); virtual std::string to_string(int token) = 0; std::string m_selection; std::string::iterator m_p, m_end; int m_lookahead; std::string m_token; }; void tls_selection_parser_impl::match(int token) { if (m_lookahead == token) m_lookahead = get_next_token(); else { std::string expected; if (token >= 256) expected = to_string(token); else expected = { char(token) }; std::string found; if (m_lookahead >= 256) found = to_string(m_lookahead) + " (" + m_token + ')'; else found = { char(m_lookahead) }; throw std::runtime_error("Expected " + expected + " but found " + found); } } // -------------------------------------------------------------------- class TLSSelectionParserImplPhenix : public tls_selection_parser_impl { public: TLSSelectionParserImplPhenix(const std::string &selection) : tls_selection_parser_impl(selection) { m_lookahead = get_next_token(); } virtual std::unique_ptr Parse(); private: std::unique_ptr ParseAtomSelection(); std::unique_ptr ParseTerm(); std::unique_ptr ParseFactor(); enum TOKEN { pt_NONE = 0, pt_IDENT = 256, pt_STRING, pt_NUMBER, pt_RESID, pt_EOLN, pt_KW_ALL, pt_KW_CHAIN, pt_KW_RESSEQ, pt_KW_RESID, pt_KW_ICODE, pt_KW_RESNAME, pt_KW_ELEMENT, pt_KW_AND, pt_KW_OR, pt_KW_NOT, pt_KW_PDB, pt_KW_ENTRY, pt_KW_THROUGH }; virtual int get_next_token(); virtual std::string to_string(int token); int m_value_i; std::string m_value_s; char m_icode; }; int TLSSelectionParserImplPhenix::get_next_token() { int result = pt_NONE; enum STATE { st_START, st_RESID = 200, st_NUM = 300, st_IDENT = 400, st_QUOTED = 500, st_DQUOTED = 550, st_OTHER = 600 }; int state = st_START; m_value_i = 0; m_icode = 0; m_value_s.clear(); auto s = m_p; auto start = state; m_token.clear(); auto restart = [&]() { switch (start) { case st_START: state = start = st_RESID; break; case st_RESID: state = start = st_NUM; break; case st_NUM: state = start = st_IDENT; break; case st_IDENT: state = start = st_QUOTED; break; case st_QUOTED: state = start = st_DQUOTED; break; case st_DQUOTED: state = start = st_OTHER; break; } m_token.clear(); m_p = s; }; auto retract = [&]() { --m_p; m_token.pop_back(); }; while (result == pt_NONE) { char ch = *m_p++; if (m_p > m_end) ch = 0; else m_token += ch; switch (state) { // start block case st_START: if (ch == 0) result = pt_EOLN; else if (isspace(ch)) { m_token.clear(); ++s; } else restart(); break; // RESID block case st_RESID: if (ch == '-') state = st_RESID + 1; else if (isdigit(ch)) { m_value_i = (ch - '0'); state = st_RESID + 2; } else restart(); break; case st_RESID + 1: if (isdigit(ch)) { m_value_i = -(ch - '0'); state = st_RESID + 2; } else restart(); break; case st_RESID + 2: if (isdigit(ch)) m_value_i = 10 * m_value_i + (m_value_i < 0 ? -1 : 1) * (ch - '0'); else if (isalpha(ch)) { m_icode = ch; state = st_RESID + 3; } else restart(); break; case st_RESID + 3: if (isalnum(ch)) restart(); else { retract(); result = pt_RESID; } break; // NUM block case st_NUM: if (ch == '-') state = st_NUM + 1; else if (isdigit(ch)) { m_value_i = ch - '0'; state = st_NUM + 2; } else restart(); break; case st_NUM + 1: if (isdigit(ch)) { m_value_i = -(ch - '0'); state = st_NUM + 2; } else restart(); break; case st_NUM + 2: if (isdigit(ch)) m_value_i = 10 * m_value_i + (m_value_i < 0 ? -1 : 1) * (ch - '0'); else if (not isalpha(ch)) { result = pt_NUMBER; retract(); } else restart(); break; // IDENT block case st_IDENT: if (isalnum(ch)) { m_value_s = { ch }; state = st_IDENT + 1; } else restart(); break; case st_IDENT + 1: if (isalnum(ch) or ch == '\'') m_value_s += ch; else { --m_p; result = pt_IDENT; } break; // QUOTED block case st_QUOTED: if (ch == '\'') { m_value_s.clear(); state = st_QUOTED + 1; } else restart(); break; case st_QUOTED + 1: if (ch == '\'') result = pt_STRING; else if (ch == 0) throw std::runtime_error("Unexpected end of selection, missing quote character?"); else m_value_s += ch; break; // QUOTED block case st_DQUOTED: if (ch == '\"') { m_value_s.clear(); state = st_DQUOTED + 1; } else restart(); break; case st_DQUOTED + 1: if (ch == '\"') result = pt_STRING; else if (ch == 0) throw std::runtime_error("Unexpected end of selection, missing quote character?"); else m_value_s += ch; break; // OTHER block case st_OTHER: result = ch; break; } } if (result == pt_IDENT) { if (cif::iequals(m_value_s, "CHAIN")) result = pt_KW_CHAIN; else if (cif::iequals(m_value_s, "ALL")) result = pt_KW_ALL; else if (cif::iequals(m_value_s, "AND")) result = pt_KW_AND; else if (cif::iequals(m_value_s, "OR")) result = pt_KW_OR; else if (cif::iequals(m_value_s, "NOT")) result = pt_KW_NOT; else if (cif::iequals(m_value_s, "RESSEQ")) result = pt_KW_RESSEQ; else if (cif::iequals(m_value_s, "RESID") or cif::iequals(m_value_s, "RESI")) result = pt_KW_RESID; else if (cif::iequals(m_value_s, "RESNAME")) result = pt_KW_RESNAME; else if (cif::iequals(m_value_s, "ELEMENT")) result = pt_KW_ELEMENT; else if (cif::iequals(m_value_s, "PDB")) result = pt_KW_PDB; else if (cif::iequals(m_value_s, "ENTRY")) result = pt_KW_ENTRY; else if (cif::iequals(m_value_s, "THROUGH")) result = pt_KW_THROUGH; } return result; } std::string TLSSelectionParserImplPhenix::to_string(int token) { switch (token) { case pt_IDENT: return "identifier"; case pt_STRING: return "std::string"; case pt_NUMBER: return "number"; case pt_RESID: return "resid"; case pt_EOLN: return "end of line"; case pt_KW_ALL: return "ALL"; case pt_KW_CHAIN: return "CHAIN"; case pt_KW_RESSEQ: return "RESSEQ"; case pt_KW_RESID: return "RESID"; case pt_KW_RESNAME: return "RESNAME"; case pt_KW_ELEMENT: return "ELEMENT"; case pt_KW_AND: return "AND"; case pt_KW_OR: return "OR"; case pt_KW_NOT: return "NOT"; case pt_KW_PDB: return "PDB"; case pt_KW_ENTRY: return "ENTRY"; case pt_KW_THROUGH: return "THROUGH"; default: return "character"; } } std::unique_ptr TLSSelectionParserImplPhenix::Parse() { if (m_lookahead == pt_KW_PDB) { match(pt_KW_PDB); // Match(pt_KW_ENTRY); throw std::runtime_error("Unimplemented PDB ENTRY specification"); } std::unique_ptr result = ParseAtomSelection(); bool extraParenthesis = false; if (m_lookahead == ')') { extraParenthesis = true; m_lookahead = get_next_token(); } match(pt_EOLN); if (extraParenthesis) std::cerr << "WARNING: too many closing parenthesis in TLS selection statement\n"; return result; } std::unique_ptr TLSSelectionParserImplPhenix::ParseAtomSelection() { std::unique_ptr result = ParseTerm(); while (m_lookahead == pt_KW_OR) { match(pt_KW_OR); result.reset(new tls_selection_union(result, ParseTerm())); } return result; } std::unique_ptr TLSSelectionParserImplPhenix::ParseTerm() { std::unique_ptr result = ParseFactor(); while (m_lookahead == pt_KW_AND) { match(pt_KW_AND); result.reset(new tls_selection_intersection(result, ParseFactor())); } return result; } std::unique_ptr TLSSelectionParserImplPhenix::ParseFactor() { std::unique_ptr result; switch (m_lookahead) { case '(': match('('); result = ParseAtomSelection(); if (m_lookahead == pt_EOLN) std::cerr << "WARNING: missing closing parenthesis in TLS selection statement\n"; else match(')'); break; case pt_KW_NOT: match(pt_KW_NOT); result.reset(new tls_selection_not(ParseAtomSelection())); break; case pt_KW_CHAIN: { match(pt_KW_CHAIN); std::string chainID = m_value_s; if (m_lookahead == pt_NUMBER) // sigh { chainID = to_string(m_value_i); match(pt_NUMBER); } else match(m_lookahead == pt_STRING ? pt_STRING : pt_IDENT); result.reset(new tls_selection_chain(chainID)); break; } case pt_KW_RESNAME: { match(pt_KW_RESNAME); std::string name = m_value_s; match(pt_IDENT); result.reset(new tls_selection_by_name(name)); break; } case pt_KW_ELEMENT: { match(pt_KW_ELEMENT); std::string element = m_value_s; match(pt_IDENT); result.reset(new tls_selection_by_element(element)); break; } case pt_KW_RESSEQ: { match(pt_KW_RESSEQ); int from = m_value_i; match(pt_NUMBER); int to = from; if (m_lookahead == ':') { match(':'); to = m_value_i; match(pt_NUMBER); } result.reset(new tls_selection_range_seq(from, to)); break; } case pt_KW_RESID: { match(pt_KW_RESID); int from, to; char icode_from = 0, icode_to = 0; bool through = false; from = to = m_value_i; if (m_lookahead == pt_NUMBER) match(pt_NUMBER); else { icode_from = m_icode; match(pt_RESID); } if (m_lookahead == ':' or m_lookahead == pt_KW_THROUGH or m_lookahead == '-') { through = m_lookahead == pt_KW_THROUGH; match(m_lookahead); to = m_value_i; if (m_lookahead == pt_NUMBER) match(pt_NUMBER); else { icode_to = m_icode; match(pt_RESID); } if (through) result.reset(new tls_selection_range_id(from, to, icode_from, icode_to)); else { if (cif::VERBOSE and (icode_from or icode_to)) std::cerr << "Warning, ignoring insertion codes\n"; result.reset(new tls_selection_range_seq(from, to)); } } else result.reset(new tls_selection_res_id(from, icode_from)); break; } case pt_KW_ALL: match(pt_KW_ALL); result.reset(new tls_selection_all()); break; default: throw std::runtime_error("Unexpected token " + to_string(m_lookahead) + " (" + m_token + ')'); } return result; } // -------------------------------------------------------------------- class TLSSelectionParserImplBuster : public tls_selection_parser_impl { public: TLSSelectionParserImplBuster(const std::string &selection); virtual std::unique_ptr Parse(); protected: enum TOKEN { bt_NONE = 0, bt_IDENT = 256, bt_NUMBER, bt_EOLN, }; virtual int get_next_token(); virtual std::string to_string(int token); std::unique_ptr ParseGroup(); std::tuple ParseAtom(); std::unique_ptr ParseOldGroup(); int m_value_i; std::string m_value_s; bool m_parsing_old_style = false; }; TLSSelectionParserImplBuster::TLSSelectionParserImplBuster(const std::string &selection) : tls_selection_parser_impl(selection) { m_lookahead = get_next_token(); } int TLSSelectionParserImplBuster::get_next_token() { int result = bt_NONE; enum STATE { st_START, st_NEGATE, st_NUM, st_IDENT } state = st_START; m_value_i = 0; m_value_s.clear(); bool negative = false; while (result == bt_NONE) { char ch = *m_p++; if (m_p > m_end) ch = 0; switch (state) { case st_START: if (ch == 0) result = bt_EOLN; else if (isspace(ch)) continue; else if (isdigit(ch)) { m_value_i = ch - '0'; state = st_NUM; } else if (isalpha(ch)) { m_value_s = { ch }; state = st_IDENT; } else if (ch == '-') { state = st_NEGATE; } else result = ch; break; case st_NEGATE: if (isdigit(ch)) { m_value_i = ch - '0'; state = st_NUM; negative = true; } else { --m_p; result = '-'; } break; case st_NUM: if (isdigit(ch)) m_value_i = 10 * m_value_i + (ch - '0'); else { if (negative) m_value_i = -m_value_i; result = bt_NUMBER; --m_p; } break; case st_IDENT: if (isalnum(ch)) m_value_s += ch; else { --m_p; result = bt_IDENT; } break; } } return result; } std::string TLSSelectionParserImplBuster::to_string(int token) { switch (token) { case bt_IDENT: return "identifier (" + m_value_s + ')'; case bt_NUMBER: return "number (" + to_string(m_value_i) + ')'; case bt_EOLN: return "end of line"; default: assert(false); return "unknown token"; } } std::unique_ptr TLSSelectionParserImplBuster::ParseGroup() { std::unique_ptr result; auto add = [&result](const std::string &chainID, int from, int to) { std::unique_ptr sc(new tls_selection_chain(chainID)); std::unique_ptr sr(new tls_selection_range_seq(from, to)); std::unique_ptr s(new tls_selection_intersection(sc, sr)); if (result == nullptr) result.reset(s.release()); else result.reset(new tls_selection_union{ result, s }); }; match('{'); do { std::string chain1; int seqNr1; std::tie(chain1, seqNr1) = ParseAtom(); if (m_lookahead == '-') { std::string chain2; int seqNr2 = seqNr1; match('-'); if (m_lookahead == bt_NUMBER) { seqNr2 = m_value_i; match(bt_NUMBER); } else { std::tie(chain2, seqNr2) = ParseAtom(); if (chain1 != chain2) { std::cerr << "Warning, ranges over multiple chains detected\n"; std::unique_ptr sc1(new tls_selection_chain(chain1)); std::unique_ptr sr1(new tls_selection_range_seq(seqNr1, kResidueNrWildcard)); std::unique_ptr s1(new tls_selection_intersection(sc1, sr1)); std::unique_ptr sc2(new tls_selection_chain(chain2)); std::unique_ptr sr2(new tls_selection_range_seq(kResidueNrWildcard, seqNr2)); std::unique_ptr s2(new tls_selection_intersection(sc2, sr2)); std::unique_ptr s(new tls_selection_union(s1, s2)); if (result == nullptr) result.reset(s.release()); else result.reset(new tls_selection_union{ result, s }); chain1.clear(); } } if (not chain1.empty()) add(chain1, seqNr1, seqNr2); } else add(chain1, seqNr1, seqNr1); } while (m_lookahead != '}'); match('}'); return result; } std::tuple TLSSelectionParserImplBuster::ParseAtom() { std::string chain = m_value_s; int seqNr = kResidueNrWildcard; if (m_lookahead == '*') match('*'); else match(bt_IDENT); match('|'); if (m_lookahead == '*') match('*'); else { seqNr = m_value_i; match(bt_NUMBER); if (m_lookahead == ':') { match(':'); std::string atom = m_value_s; if (cif::VERBOSE > 0) std::cerr << "Warning: ignoring atom ID '" << atom << "' in TLS selection\n"; match(bt_IDENT); } } return std::make_tuple(chain, seqNr); } std::unique_ptr TLSSelectionParserImplBuster::Parse() { std::unique_ptr result = ParseGroup(); match(bt_EOLN); return result; } // -------------------------------------------------------------------- class TLSSelectionParserImplBusterOld : public tls_selection_parser_impl { public: TLSSelectionParserImplBusterOld(const std::string &selection) : tls_selection_parser_impl(selection) { m_lookahead = get_next_token(); } virtual std::unique_ptr Parse(); private: std::unique_ptr ParseAtomSelection(); std::unique_ptr ParseTerm(); std::unique_ptr ParseFactor(); std::unique_ptr ParseResid(); std::unique_ptr ParseChainResid(); enum TOKEN { pt_NONE = 0, pt_IDENT = 256, pt_CHAINRESID, pt_STRING, pt_NUMBER, pt_RANGE, pt_EOLN, pt_KW_ALL, pt_KW_CHAIN, pt_KW_RESSEQ, pt_KW_RESID, pt_KW_RESNAME, pt_KW_ELEMENT, pt_KW_AND, pt_KW_OR, pt_KW_NOT, pt_KW_PDB, pt_KW_ENTRY, pt_KW_THROUGH }; virtual int get_next_token(); virtual std::string to_string(int token); int m_value_i; std::string m_value_s; int m_value_r[2]; }; int TLSSelectionParserImplBusterOld::get_next_token() { int result = pt_NONE; enum STATE { st_START, st_NEGATE, st_NUM, st_RANGE, st_IDENT_1, st_IDENT, st_CHAINRESID, st_QUOTED_1, st_QUOTED_2 } state = st_START; m_value_i = 0; m_value_s.clear(); bool negative = false; while (result == pt_NONE) { char ch = *m_p++; if (m_p > m_end) ch = 0; switch (state) { case st_START: if (ch == 0) result = pt_EOLN; else if (isspace(ch)) continue; else if (isdigit(ch)) { m_value_i = ch - '0'; state = st_NUM; } else if (isalpha(ch)) { m_value_s = { ch }; state = st_IDENT_1; } else if (ch == '-') { state = st_NEGATE; } else if (ch == '\'') { state = st_QUOTED_1; } else result = ch; break; case st_NEGATE: if (isdigit(ch)) { m_value_i = ch - '0'; state = st_NUM; negative = true; } else { --m_p; result = '-'; } break; case st_NUM: if (isdigit(ch)) m_value_i = 10 * m_value_i + (ch - '0'); else if (ch == '-' or ch == ':') { if (negative) m_value_i = -m_value_i; m_value_r[0] = m_value_i; m_value_r[1] = 0; state = st_RANGE; } else { if (negative) m_value_i = -m_value_i; result = pt_NUMBER; --m_p; } break; case st_RANGE: // TODO: question, is "-2--1" a valid range? We do not support that, yet if (isdigit(ch)) m_value_r[1] = 10 * m_value_r[1] + (ch - '0'); else if (m_value_r[1] != 0) { result = pt_RANGE; --m_p; } else { --m_p; --m_p; result = pt_NUMBER; } break; case st_IDENT_1: if (isalpha(ch)) { m_value_s += ch; state = st_IDENT; } else if (isdigit(ch)) { m_value_i = (ch - '0'); state = st_CHAINRESID; } else { --m_p; result = pt_IDENT; } break; case st_CHAINRESID: if (isalpha(ch)) { m_value_s += to_string(m_value_i); m_value_s += ch; state = st_IDENT; } else if (isdigit(ch)) m_value_i = 10 * m_value_i + (ch - '0'); else { --m_p; result = pt_CHAINRESID; } break; case st_IDENT: if (isalnum(ch)) m_value_s += ch; else { --m_p; result = pt_IDENT; } break; case st_QUOTED_1: if (ch == '\'') { --m_p; result = '\''; } else { m_value_s = { ch }; state = st_QUOTED_2; } break; case st_QUOTED_2: if (ch == '\'') result = pt_STRING; else if (ch == 0) throw std::runtime_error("Unexpected end of selection, missing quote character?"); else m_value_s += ch; break; } } if (result == pt_IDENT) { if (cif::iequals(m_value_s, "CHAIN")) result = pt_KW_CHAIN; else if (cif::iequals(m_value_s, "ALL")) result = pt_KW_ALL; else if (cif::iequals(m_value_s, "AND")) result = pt_KW_AND; else if (cif::iequals(m_value_s, "OR")) result = pt_KW_OR; else if (cif::iequals(m_value_s, "NOT")) result = pt_KW_NOT; else if (cif::iequals(m_value_s, "RESSEQ")) result = pt_KW_RESSEQ; else if (cif::iequals(m_value_s, "RESID") or cif::iequals(m_value_s, "RESI") or cif::iequals(m_value_s, "RESIDUES")) result = pt_KW_RESID; else if (cif::iequals(m_value_s, "RESNAME")) result = pt_KW_RESNAME; else if (cif::iequals(m_value_s, "PDB")) result = pt_KW_PDB; else if (cif::iequals(m_value_s, "ENTRY")) result = pt_KW_ENTRY; else if (cif::iequals(m_value_s, "THROUGH")) result = pt_KW_THROUGH; } return result; } std::string TLSSelectionParserImplBusterOld::to_string(int token) { switch (token) { case pt_IDENT: return "identifier (" + m_value_s + ')'; case pt_STRING: return "std::string (" + m_value_s + ')'; case pt_NUMBER: return "number (" + to_string(m_value_i) + ')'; case pt_RANGE: return "range (" + to_string(m_value_r[0]) + ':' + to_string(m_value_r[1]) + ')'; case pt_EOLN: return "end of line"; case pt_KW_ALL: return "ALL"; case pt_KW_CHAIN: return "CHAIN"; case pt_KW_RESSEQ: return "RESSEQ"; case pt_KW_RESID: return "RESID"; case pt_KW_RESNAME: return "RESNAME"; case pt_KW_ELEMENT: return "ELEMENT"; case pt_KW_AND: return "AND"; case pt_KW_OR: return "OR"; case pt_KW_NOT: return "NOT"; case pt_KW_PDB: return "PDB"; case pt_KW_ENTRY: return "ENTRY"; case pt_KW_THROUGH: return "THROUGH"; default: assert(false); return "unknown token"; } } std::unique_ptr TLSSelectionParserImplBusterOld::Parse() { if (m_lookahead == pt_KW_PDB) { match(pt_KW_PDB); // Match(pt_KW_ENTRY); throw std::runtime_error("Unimplemented PDB ENTRY specification"); } std::unique_ptr result = ParseAtomSelection(); match(pt_EOLN); return result; } std::unique_ptr TLSSelectionParserImplBusterOld::ParseAtomSelection() { std::unique_ptr result = ParseTerm(); while (m_lookahead == pt_KW_OR) { match(pt_KW_OR); result.reset(new tls_selection_union(result, ParseTerm())); } return result; } std::unique_ptr TLSSelectionParserImplBusterOld::ParseTerm() { std::unique_ptr result = ParseFactor(); while (m_lookahead == pt_KW_AND) { match(pt_KW_AND); result.reset(new tls_selection_intersection(result, ParseFactor())); } return result; } std::unique_ptr TLSSelectionParserImplBusterOld::ParseFactor() { std::unique_ptr result; switch (m_lookahead) { case '(': match('('); result = ParseAtomSelection(); match(')'); break; case pt_KW_NOT: match(pt_KW_NOT); result.reset(new tls_selection_not(ParseAtomSelection())); break; case pt_KW_CHAIN: { match(pt_KW_CHAIN); std::string chainID = m_value_s; if (m_lookahead == pt_NUMBER) // sigh { chainID = to_string(m_value_i); match(pt_NUMBER); } else match(m_lookahead == pt_STRING ? pt_STRING : pt_IDENT); result.reset(new tls_selection_chain(chainID)); break; } case pt_KW_RESNAME: { match(pt_KW_RESNAME); std::string name = m_value_s; match(pt_IDENT); result.reset(new tls_selection_by_name(name)); break; } case pt_KW_RESSEQ: match(pt_KW_RESSEQ); result = ParseResid(); break; case pt_KW_RESID: match(pt_KW_RESID); result = ParseResid(); break; case pt_KW_ALL: match(pt_KW_ALL); result.reset(new tls_selection_all()); break; case pt_CHAINRESID: result = ParseChainResid(); break; default: throw std::runtime_error("Unexpected token " + to_string(m_lookahead)); } return result; } std::unique_ptr TLSSelectionParserImplBusterOld::ParseResid() { std::unique_ptr result; for (;;) { int from, to; if (m_lookahead == pt_RANGE) { from = m_value_r[0]; to = m_value_r[1]; match(pt_RANGE); } else { from = m_value_i; match(pt_NUMBER); to = from; if (m_lookahead == ':' or m_lookahead == '-' or m_lookahead == pt_KW_THROUGH) { match(m_lookahead); to = m_value_i; match(pt_NUMBER); } } std::unique_ptr range(new tls_selection_range_seq(from, to)); if (result) result.reset(new tls_selection_union(result, range)); else result.reset(range.release()); if (m_lookahead == ',') { match(','); continue; } break; } return result; } std::unique_ptr TLSSelectionParserImplBusterOld::ParseChainResid() { std::unique_ptr result; for (;;) { int from, to; from = to = m_value_i; std::string chainID = m_value_s; match(pt_CHAINRESID); if (m_lookahead == '-') { match(m_lookahead); to = m_value_i; if (m_value_s != chainID) throw std::runtime_error("Cannot have two different chainIDs in a range selection"); match(pt_CHAINRESID); } std::unique_ptr sc(new tls_selection_chain(chainID)); std::unique_ptr sr(new tls_selection_range_seq(from, to)); std::unique_ptr range(new tls_selection_intersection(sc, sr)); if (result) result.reset(new tls_selection_union(result, range)); else result.reset(range.release()); if (m_lookahead == ',') { match(','); continue; } break; } return result; } // -------------------------------------------------------------------- class TLSSelectionParserBase { public: virtual std::unique_ptr Parse(const std::string &selection) const = 0; virtual ~TLSSelectionParserBase() {} }; template class TLSSelectionParser { public: virtual std::unique_ptr Parse(const std::string &selection) const { std::unique_ptr result; try { IMPL p(selection); result = p.Parse(); } catch (const std::exception &ex) { std::cerr << "ParseError: " << ex.what() << '\n'; } return result; } }; // -------------------------------------------------------------------- std::unique_ptr parse_tls_selection_details(const std::string &program, const std::string &selection) { TLSSelectionParser phenix; TLSSelectionParser buster; TLSSelectionParser busterOld; std::unique_ptr result; if (cif::icontains(program, "buster")) { result = buster.Parse(selection); if (not result) { if (cif::VERBOSE > 0) std::cerr << "Falling back to old BUSTER\n"; result = busterOld.Parse(selection); } if (not result) { if (cif::VERBOSE > 0) std::cerr << "Falling back to PHENIX\n"; result = phenix.Parse(selection); } } else if (cif::icontains(program, "phenix")) { result = phenix.Parse(selection); if (not result) { if (cif::VERBOSE > 0) std::cerr << "Falling back to BUSTER\n"; result = buster.Parse(selection); } if (not result) { if (cif::VERBOSE > 0) std::cerr << "Falling back to old BUSTER\n"; result = busterOld.Parse(selection); } } else { if (cif::VERBOSE > 0) std::cerr << "No known program specified, trying PHENIX\n"; result = phenix.Parse(selection); if (not result) { if (cif::VERBOSE > 0) std::cerr << "Falling back to BUSTER\n"; result = buster.Parse(selection); } if (not result) { if (cif::VERBOSE > 0) std::cerr << "Falling back to old BUSTER\n"; result = busterOld.Parse(selection); } } return result; } } // namespace cif libpdb-redo-3.3.0/src/Version.cpp0000644000175000017500000000337114773016616016477 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // The only reason for this source file is to make sure the version info for // libpdb-redo is available in client software. #include "pdb-redo/Version.hpp" #include "revision.hpp" #include namespace pdb_redo { PDB_REDO_EXPORT int force_link = 1; std::string get_version() { std::ostringstream os; write_version_string(os, false); return os.str(); } } libpdb-redo-3.3.0/test/0000755000175000017500000000000014773016616014532 5ustar maartenmaartenlibpdb-redo-3.3.0/test/1cbs-test.eds0000644000175000017500000002333614773016616017043 0ustar maartenmaartenRESIDUE RSR SRSR RSCCS NGRID EDIAm OPIA PRO_A_1 0.100 0.019 0.890 48 0.125 42.9 ASN_A_2 0.090 0.013 0.889 48 0.700 87.5 PHE_A_3 0.041 0.008 0.957 53 1.053 100.0 SER_A_4 0.060 0.012 0.937 29 1.060 100.0 GLY_A_5 0.049 0.014 0.947 19 1.079 100.0 ASN_A_6 0.064 0.011 0.915 40 1.036 100.0 TRP_A_7 0.035 0.007 0.967 62 1.088 100.0 LYS_A_8 0.082 0.012 0.933 49 0.668 66.7 ILE_A_9 0.041 0.009 0.960 37 1.052 100.0 ILE_A_10 0.048 0.010 0.956 38 0.996 100.0 ARG_A_11 0.045 0.009 0.958 53 1.048 100.0 SER_A_12 0.048 0.011 0.942 27 1.056 100.0 GLU_A_13 0.046 0.009 0.964 43 1.035 100.0 ASN_A_14 0.043 0.009 0.965 35 1.045 100.0 PHE_A_15 0.040 0.009 0.961 53 1.089 100.0 GLU_A_16 0.063 0.011 0.927 51 0.945 88.9 GLU_A_17 0.100 0.013 0.842 52 0.846 77.8 LEU_A_18 0.044 0.010 0.958 37 1.059 100.0 LEU_A_19 0.039 0.009 0.972 40 1.011 100.0 LYS_A_20 0.126 0.015 0.882 60 0.204 55.6 VAL_A_21 0.059 0.013 0.938 37 0.834 85.7 LEU_A_22 0.051 0.011 0.926 42 1.005 100.0 GLY_A_23 0.071 0.017 0.883 21 1.015 100.0 VAL_A_24 0.040 0.010 0.955 34 1.087 100.0 ASN_A_25 0.074 0.013 0.908 46 0.955 100.0 VAL_A_26 0.075 0.014 0.899 41 0.870 71.4 MET_A_27 0.075 0.012 0.902 52 0.916 75.0 LEU_A_28 0.056 0.011 0.930 44 1.024 100.0 ARG_A_29 0.097 0.010 0.855 68 0.713 63.6 LYS_A_30 0.128 0.018 0.844 62 0.091 44.4 ILE_A_31 0.063 0.011 0.903 44 1.006 100.0 ALA_A_32 0.055 0.012 0.967 22 0.970 80.0 VAL_A_33 0.049 0.012 0.954 36 1.027 100.0 ALA_A_34 0.051 0.015 0.950 26 1.070 100.0 ALA_A_35 0.049 0.013 0.953 25 1.043 100.0 ALA_A_36 0.038 0.013 0.966 23 1.092 100.0 SER_A_37 0.050 0.013 0.939 32 1.001 100.0 LYS_A_38 0.148 0.014 0.867 61 0.103 44.4 PRO_A_39 0.047 0.011 0.949 33 1.023 100.0 ALA_A_40 0.053 0.013 0.955 23 0.989 100.0 VAL_A_41 0.047 0.010 0.937 33 1.007 100.0 GLU_A_42 0.079 0.011 0.936 52 0.866 77.8 ILE_A_43 0.033 0.009 0.976 39 0.958 87.5 LYS_A_44 0.090 0.012 0.934 55 0.135 66.7 GLN_A_45 0.060 0.010 0.923 47 0.968 100.0 GLU_A_46 0.160 0.015 0.849 66 0.074 44.4 GLY_A_47 0.042 0.015 0.962 22 0.999 100.0 ASP_A_48 0.067 0.011 0.949 46 0.969 87.5 THR_A_49 0.053 0.012 0.943 36 0.958 85.7 PHE_A_50 0.046 0.009 0.949 51 1.031 100.0 TYR_A_51 0.050 0.009 0.961 60 1.020 100.0 ILE_A_52 0.043 0.009 0.951 38 1.057 100.0 LYS_A_53 0.069 0.010 0.947 48 0.236 77.8 THR_A_54 0.038 0.009 0.963 31 1.083 100.0 SER_A_55 0.064 0.012 0.935 28 1.001 83.3 THR_A_56 0.038 0.009 0.975 34 1.084 100.0 THR_A_57 0.039 0.011 0.976 31 1.014 100.0 VAL_A_58 0.039 0.010 0.965 31 1.094 100.0 ARG_A_59 0.068 0.010 0.942 59 0.896 90.9 THR_A_60 0.045 0.010 0.965 32 1.003 100.0 THR_A_61 0.044 0.010 0.962 34 1.055 100.0 GLU_A_62 0.098 0.012 0.881 53 0.709 66.7 ILE_A_63 0.041 0.010 0.969 38 1.014 100.0 ASN_A_64 0.058 0.011 0.941 46 0.973 87.5 PHE_A_65 0.048 0.009 0.946 53 1.015 100.0 LYS_A_66 0.116 0.012 0.847 54 0.410 55.6 VAL_A_67 0.040 0.011 0.974 32 1.009 100.0 GLY_A_68 0.046 0.014 0.965 18 1.060 100.0 GLU_A_69 0.069 0.010 0.879 49 1.084 100.0 GLU_A_70 0.096 0.012 0.909 57 0.727 55.6 PHE_A_71 0.043 0.009 0.956 53 1.042 100.0 GLU_A_72 0.090 0.013 0.891 58 0.610 44.4 GLU_A_73 0.045 0.010 0.964 46 1.045 100.0 GLN_A_74 0.067 0.011 0.945 50 0.885 77.8 THR_A_75 0.037 0.011 0.978 33 1.055 100.0 VAL_A_76 0.075 0.013 0.932 37 0.718 71.4 ASP_A_77 0.049 0.010 0.949 41 1.048 100.0 GLY_A_78 0.059 0.017 0.912 22 1.050 100.0 ARG_A_79 0.078 0.012 0.911 74 0.874 72.7 PRO_A_80 0.053 0.012 0.944 36 0.963 100.0 CYS_A_81 0.033 0.009 0.989 29 0.989 100.0 LYS_A_82 0.103 0.012 0.934 56 0.312 55.6 SER_A_83 0.043 0.011 0.954 30 1.089 100.0 LEU_A_84 0.046 0.011 0.968 40 0.935 87.5 VAL_A_85 0.042 0.010 0.957 32 1.098 100.0 LYS_A_86 0.072 0.012 0.937 49 0.851 66.7 TRP_A_87 0.041 0.008 0.959 63 1.051 100.0 GLU_A_88 0.079 0.011 0.898 49 1.001 100.0 SER_A_89 0.047 0.011 0.963 29 1.005 100.0 GLU_A_90 0.054 0.010 0.940 46 0.988 88.9 ASN_A_91 0.047 0.010 0.958 40 1.035 100.0 LYS_A_92 0.044 0.009 0.958 43 1.031 100.0 MET_A_93 0.046 0.008 0.970 37 0.951 87.5 VAL_A_94 0.055 0.010 0.940 33 1.024 100.0 CYS_A_95 0.036 0.009 0.987 29 1.034 100.0 GLU_A_96 0.127 0.012 0.924 59 0.144 55.6 GLN_A_97 0.049 0.010 0.960 45 1.020 100.0 LYS_A_98 0.146 0.014 0.893 63 0.063 55.6 LEU_A_99 0.062 0.012 0.903 49 0.894 87.5 LEU_A_100 0.091 0.014 0.862 58 0.697 75.0 LYS_A_101 0.152 0.019 0.788 81 0.055 22.2 GLY_A_102 0.073 0.022 0.880 32 0.761 75.0 GLU_A_103 0.159 0.022 0.818 81 0.040 33.3 GLY_A_104 0.046 0.020 0.969 26 0.896 75.0 PRO_A_105 0.041 0.011 0.970 39 0.957 85.7 LYS_A_106 0.159 0.014 0.819 58 0.108 55.6 THR_A_107 0.036 0.010 0.968 34 1.077 100.0 SER_A_108 0.054 0.011 0.939 28 1.022 100.0 TRP_A_109 0.040 0.007 0.961 65 1.075 100.0 THR_A_110 0.043 0.010 0.958 30 1.098 100.0 ARG_A_111 0.040 0.008 0.960 50 1.088 100.0 GLU_A_112 0.084 0.010 0.912 47 0.867 77.8 LEU_A_113 0.063 0.010 0.942 41 0.747 75.0 THR_A_114 0.049 0.010 0.949 34 1.058 100.0 ASN_A_115 0.115 0.013 0.915 47 0.308 62.5 ASP_A_116 0.067 0.011 0.915 40 0.975 100.0 GLY_A_117 0.035 0.012 0.976 17 1.012 100.0 GLU_A_118 0.042 0.008 0.960 43 1.096 100.0 LEU_A_119 0.052 0.010 0.958 37 0.997 87.5 ILE_A_120 0.044 0.008 0.960 34 1.087 100.0 LEU_A_121 0.041 0.009 0.968 35 1.096 100.0 THR_A_122 0.036 0.010 0.977 31 1.078 100.0 MET_A_123 0.043 0.008 0.974 36 0.925 75.0 THR_A_124 0.052 0.010 0.961 34 1.076 100.0 ALA_A_125 0.052 0.011 0.933 24 1.073 100.0 ASP_A_126 0.066 0.012 0.913 45 1.008 100.0 ASP_A_127 0.159 0.018 0.764 54 0.169 37.5 VAL_A_128 0.048 0.010 0.961 35 0.977 85.7 VAL_A_129 0.044 0.009 0.963 32 1.078 100.0 CYS_A_130 0.024 0.008 0.994 25 0.995 100.0 THR_A_131 0.043 0.008 0.971 28 1.058 100.0 ARG_A_132 0.055 0.008 0.930 51 0.829 81.8 VAL_A_133 0.036 0.009 0.974 30 1.072 100.0 TYR_A_134 0.052 0.008 0.953 55 1.043 100.0 VAL_A_135 0.024 0.009 0.985 31 1.057 100.0 ARG_A_136 0.056 0.010 0.945 57 0.962 90.9 GLU_A_137 0.101 0.012 0.878 64 0.716 55.6 REA_B_0 0.043 0.006 0.949 109 0.992 100.0 HOH_C_300 0.041 0.022 0.945 6 1.146 100.0 HOH_C_301 0.056 0.032 0.972 5 1.130 100.0 HOH_C_302 0.049 0.031 0.977 6 1.050 100.0 HOH_C_303 0.037 0.026 0.947 5 1.019 100.0 HOH_C_304 0.035 0.031 0.962 5 1.087 100.0 HOH_C_305 0.025 0.026 0.983 5 1.084 100.0 HOH_C_306 0.016 0.022 0.989 4 1.164 100.0 HOH_C_307 0.034 0.026 0.959 5 1.095 100.0 HOH_C_308 0.084 0.032 0.813 9 0.842 100.0 HOH_C_309 0.034 0.027 0.974 5 1.033 100.0 HOH_C_310 0.036 0.025 0.950 5 1.045 100.0 HOH_C_311 0.040 0.036 0.917 6 1.083 100.0 HOH_C_312 0.051 0.024 0.988 4 1.092 100.0 HOH_C_313 0.100 0.037 0.804 7 0.714 0.0 HOH_C_314 0.085 0.035 0.926 7 0.877 100.0 HOH_C_315 0.037 0.031 0.943 6 1.174 100.0 HOH_C_316 0.026 0.020 0.961 4 1.032 100.0 HOH_C_317 0.050 0.033 0.954 5 0.988 100.0 HOH_C_318 0.033 0.025 0.962 4 1.138 100.0 HOH_C_319 0.088 0.034 0.866 6 0.820 100.0 HOH_C_320 0.048 0.030 0.959 5 1.117 100.0 HOH_C_321 0.031 0.027 0.975 4 1.151 100.0 HOH_C_322 0.032 0.022 0.962 4 1.144 100.0 HOH_C_323 0.032 0.030 0.970 4 1.085 100.0 HOH_C_324 0.047 0.031 0.953 6 0.765 0.0 HOH_C_325 0.082 0.029 0.810 6 0.775 0.0 HOH_C_326 0.035 0.020 0.972 5 1.008 100.0 HOH_C_327 0.190 0.045 0.742 8 0.611 0.0 HOH_C_328 0.086 0.036 0.807 7 0.849 100.0 HOH_C_329 0.095 0.059 0.875 9 0.294 0.0 HOH_C_330 0.075 0.032 0.878 8 1.089 100.0 HOH_C_331 0.110 0.041 0.769 8 0.546 0.0 HOH_C_332 0.121 0.037 0.534 8 0.842 100.0 HOH_C_333 0.048 0.037 0.948 7 0.981 100.0 HOH_C_334 0.127 0.044 0.639 8 0.636 0.0 HOH_C_335 0.082 0.036 0.804 7 1.121 100.0 HOH_C_336 0.105 0.052 0.847 8 0.250 0.0 HOH_C_337 0.041 0.035 0.956 6 0.951 100.0 HOH_C_338 0.056 0.033 0.889 5 0.998 100.0 HOH_C_339 0.051 0.036 0.944 7 0.864 100.0 HOH_C_340 0.058 0.034 0.934 6 1.026 100.0 HOH_C_341 0.085 0.041 0.756 9 0.462 0.0 HOH_C_342 0.075 0.032 0.916 6 1.000 100.0 HOH_C_343 0.072 0.029 0.867 5 1.038 100.0 HOH_C_344 0.071 0.040 0.896 10 0.770 0.0 HOH_C_345 0.048 0.032 0.952 6 1.064 100.0 HOH_C_346 0.097 0.032 0.753 7 0.896 100.0 HOH_C_347 0.069 0.037 0.857 7 1.108 100.0 HOH_C_348 0.137 0.040 0.698 10 0.571 0.0 HOH_C_349 0.109 0.039 0.634 10 0.630 0.0 HOH_C_350 0.052 0.037 0.974 6 0.924 100.0 HOH_C_351 0.044 0.028 0.885 6 1.046 100.0 HOH_C_352 0.039 0.035 0.969 8 0.902 100.0 HOH_C_353 0.092 0.045 0.877 8 0.855 100.0 HOH_C_354 0.080 0.034 0.865 8 0.908 100.0 HOH_C_355 0.106 0.061 0.694 9 0.000 0.0 HOH_C_356 0.089 0.061 0.934 8 0.376 0.0 HOH_C_357 0.077 0.036 0.808 6 0.799 0.0 HOH_C_358 0.148 0.038 0.823 10 0.826 100.0 HOH_C_359 0.091 0.051 0.898 6 0.844 100.0 HOH_C_360 0.050 0.028 0.891 6 1.105 100.0 HOH_C_361 0.090 0.045 0.925 6 0.897 100.0 HOH_C_362 0.073 0.040 0.847 6 0.878 100.0 HOH_C_363 0.046 0.041 0.945 7 0.899 100.0 HOH_C_364 0.107 0.040 0.764 9 0.726 0.0 HOH_C_365 0.055 0.036 0.903 7 0.969 100.0 HOH_C_366 0.077 0.041 0.908 6 1.118 100.0 HOH_C_367 0.036 0.030 0.963 6 0.973 100.0 HOH_C_368 0.033 0.034 0.961 8 0.891 100.0 HOH_C_369 0.089 0.040 0.761 8 0.890 100.0 HOH_C_370 0.090 0.041 0.694 9 0.691 0.0 HOH_C_371 0.074 0.054 0.887 9 0.271 0.0 HOH_C_372 0.099 0.045 0.909 10 0.573 0.0 HOH_C_373 0.072 0.041 0.906 9 0.609 0.0 HOH_C_374 0.075 0.048 0.880 7 0.689 0.0 HOH_C_375 0.046 0.033 0.932 6 1.084 100.0 HOH_C_376 0.036 0.030 0.954 5 1.013 100.0 HOH_C_377 0.072 0.041 0.916 7 0.920 100.0 HOH_C_378 0.115 0.037 0.414 9 0.398 0.0 HOH_C_379 0.186 0.046 0.822 11 0.398 0.0 HOH_C_380 0.082 0.038 0.813 8 0.314 0.0 HOH_C_381 0.126 0.039 0.703 11 0.155 0.0 HOH_C_382 0.084 0.043 0.839 10 0.454 0.0 HOH_C_383 0.124 0.043 0.518 8 0.829 100.0 HOH_C_384 0.075 0.046 0.954 8 0.730 0.0 HOH_C_385 0.086 0.037 0.924 7 0.789 0.0 HOH_C_386 0.116 0.028 0.685 7 0.801 100.0 HOH_C_387 0.103 0.042 0.795 7 0.836 100.0 HOH_C_388 0.066 0.042 0.964 7 0.729 0.0 HOH_C_389 0.107 0.038 0.824 8 0.840 100.0 HOH_C_390 0.073 0.038 0.821 7 0.963 100.0 HOH_C_391 0.055 0.033 0.897 6 0.879 100.0 HOH_C_392 0.088 0.041 0.810 7 0.731 0.0 HOH_C_393 0.045 0.031 0.967 6 1.128 100.0 HOH_C_394 0.095 0.046 0.800 9 0.787 0.0 HOH_C_395 0.082 0.037 0.860 8 0.743 0.0 HOH_C_396 0.068 0.027 0.936 8 0.845 100.0 HOH_C_397 0.081 0.038 0.699 7 0.748 0.0 HOH_C_398 0.065 0.035 0.906 9 0.902 100.0 HOH_C_399 0.075 0.037 0.946 7 0.733 0.0 libpdb-redo-3.3.0/test/1mdn.mtz0000644000175000017500000002533014773016616016130 0ustar maartenmaartenMTZ DA@@0A,KD`A0?A?C@0@@AC@0?@@CY@ @A6DffFA @A C33@ ??@YGD33A ?@@PASC9@ ?@@C33@ @@AC33@?AAA@@AffA@@@LRC@?@`ADff@?@ACff@?@@@ffC33@@?`D33@@@@3sCff@@`A33B333@@AffC@@PAB @??PAf&C33@?@@YC@?@@ffC@@@ALC@@@AC̬@@@?A =DA?@ٖC33@@@@@@C@@@͌C̜@@ACff@?@A C33??@ AA,@?@@LC@@?`AB?@@@0AC@@@@Cy@@@@A̱Cff@@AJCy@@@A$C@@@ AC333@A@3DA??@L'C @?@@A3sC33S@?@AQCff&@?@pAfC@@@0Af&C33@@@?C@@@ A3\C,@@@?@@ffC@@@@@AfČ@?AZZZZ@@A١C̼@@@?C`@@@A3D!A?@0Aͬ D@?@ALC@?@AC33@?A`AB?@?Af&D@@@@@33ZCff&@@@`A33JCff&@@@AC`@@@@AfDff@@@@@3DA@@ZZZZ@?DC`@@ AB?AAf&Cff@??@ZZZZ?@@@cC333@?@@AB??@A͌D@@@A̹Č@@@ACff@@@0A B̌?@@?@3DIA@@@@AfD@@@@@gC333@@?AZZZZ@@@PAZZZZ@@Af DlA@@AYC@@?@AZZZZ@?@PACfff@@?@ Af&C̬@@?AAYCff@@@?`AffB?@@@@@AXC333@@@@@3Cy@@@@A3CffF@@@@@A33XC333@@@@@@Dff@@@@@AfD A@@?A`#D33A@@@ZZZZ@AZZZZ@`AپC@A`AC33A??@ZZZZ?@@AZZZZ?@pA C@?@ALbC333@@@@ͬDA@@`A Cff@@@@33AC33@@@?AfDffA@@@@@@!DA@@@@A D33@@@Af Dff@?`AZZZZ@@@ZZZZ@ADCy@@?ٙC̬@APAC@?@PAZZZZ?@?ZZZZ?@ Aff3C @?A@@;DffA@?AZZZZ@@@@33CCff&@@@AfC33@@@A͌C@@@@?tB̌?@@@?3C33@@@@AC@@?pADff&B@AZZZZ@AZZZZ@@fDAAA@"Dff.A??AZZZZ?@@0AZZZZ?@ AfD@?@PA`GDA@@ZZZZ@@fC@@@AC?@@ABff?@A@ܳD33A@@?pA-C33@@@@@A)D33cA@@@AC@@`Af&vD33A@@AaC9@??@ZZZZ?@@AZZZZ?@@3Cff@?@fDA?AA3sĎA??AZZZZ??@@ZZZZ??@@dB̌???@@YC33@??A@͌C@?@? AZZZZ?@@@Aff^C,@?@@A@C̬@?@@@C@?@@A3C33s@?@@@ffB??@@@Af&C̬@?@@@A͌+DA?@?ADB@ AZZZZ@@AZZZZ@@AZZZZ@@@3FCfff@@A@B33@@??AZZZZ@?@@@ZZZZ@?@A Cl@@?@A3C@@@Af"DA@@@@ D@@@@0AC̜@@@@A8C33@@@@?@fDA@@@@@@,&D@@@@@A` D@@@@Cfff@@@@ALD33@@@?PAZZZZ@@@@0AZZZZ@@@@ D33+A@@@PAB@@@?AZZZZ@@?@AZZZZ@@?@ Cl@@@?@pAC̜@@@?A@nCffF@@@@?@@33B?@@@@@A8C33@@@@@AvB?@@@@A8C@@@@@AfFD@@@@@@PACfff@@@@@@ A3 Dff@@@@?pAD@@AZZZZ@@AZZZZ@@AىC@@@pA.BffF@@A?ͬ DA@??`AZZZZ@?@@AfuCL@@?@AB?@?@Af&C@@@AL'Cff@@@@?3Cff@@@@ A3C@@@@@L C@@@@?`AyxD9A@@@@@@ALC̬@@@@@@\B?@??ZZZZ@@@AC@@@0AC,@@@AD A@?AZZZZ@?@AD33@@?@@Bff?@?@A3sD@@@?ALC33@@@@@ِCl@@@@AffRC,@@@@AC33@@@@@@D33@@@@@ADff@@ZZZZ@@A33=C33s@@@A,B33@@@A33sC33@@??@A(C @@?@@AC@@?@ALC@@?@Af&C̼@@@A3s -- ${PROJECT_SOURCE_DIR}/test) add_test(NAME ${PDB_REDO_TEST} COMMAND $ --data-dir ${PROJECT_SOURCE_DIR}/test) endforeach() libpdb-redo-3.3.0/test/UN_.cif0000644000175000017500000001452714773016616015707 0ustar maartenmaarten# data_comp_list loop_ _chem_comp.id _chem_comp.three_letter_code _chem_comp.name _chem_comp.group _chem_comp.number_atoms_all _chem_comp.number_atoms_nh _chem_comp.desc_level UN_ UN_ UN_NINE L-peptide 13 6 . # data_comp_UN_ # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.type_symbol _chem_comp_atom.type_energy _chem_comp_atom.charge _chem_comp_atom.x _chem_comp_atom.y _chem_comp_atom.z UN_ N N NT3 1 0.227 -1.259 0.452 UN_ H H H 0 0.069 -1.019 1.421 UN_ H2 H H 0 1.104 -1.640 0.356 UN_ H3 H H 0 -0.424 -1.909 0.174 UN_ CA C CH1 0 0.103 -0.030 -0.392 UN_ HA H H 0 0.160 -0.299 -1.339 UN_ CB C CH3 0 -1.244 0.625 -0.159 UN_ HB3 H H 0 -1.857 -0.018 0.234 UN_ HB2 H H 0 -1.605 0.932 -1.008 UN_ HB1 H H 0 -1.150 1.385 0.442 UN_ C C C 0 1.270 0.922 -0.094 UN_ O O O 0 2.008 1.323 -0.994 UN_ OXT O OC -1 1.498 1.305 1.054 loop_ _chem_comp_tree.comp_id _chem_comp_tree.atom_id _chem_comp_tree.atom_back _chem_comp_tree.atom_forward _chem_comp_tree.connect_type UN_ N n/a CA START UN_ H N . . UN_ H2 N . . UN_ H3 N . . UN_ CA N C . UN_ HA CA . . UN_ CB CA HB3 . UN_ HB1 CB . . UN_ HB2 CB . . UN_ HB3 CB . . UN_ C CA . END UN_ O C . . UN_ OXT C . . loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.type _chem_comp_bond.aromatic _chem_comp_bond.value_dist _chem_comp_bond.value_dist_esd UN_ CB CA SINGLE n 1.509 0.014 UN_ CA C SINGLE n 1.533 0.011 UN_ C O DOUBLE n 1.247 0.019 UN_ C OXT SINGLE n 1.247 0.019 UN_ CA N SINGLE n 1.482 0.010 UN_ CB HB3 SINGLE n 0.972 0.015 UN_ CB HB2 SINGLE n 0.972 0.015 UN_ CB HB1 SINGLE n 0.972 0.015 UN_ CA HA SINGLE n 0.986 0.020 UN_ N H SINGLE n 0.911 0.020 UN_ N H2 SINGLE n 0.911 0.020 UN_ N H3 SINGLE n 0.911 0.020 loop_ _chem_comp_angle.comp_id _chem_comp_angle.atom_id_1 _chem_comp_angle.atom_id_2 _chem_comp_angle.atom_id_3 _chem_comp_angle.value_angle _chem_comp_angle.value_angle_esd UN_ CA CB HB3 109.546 1.50 UN_ CA CB HB2 109.546 1.50 UN_ CA CB HB1 109.546 1.50 UN_ HB3 CB HB2 109.386 1.50 UN_ HB3 CB HB1 109.386 1.50 UN_ HB2 CB HB1 109.386 1.50 UN_ CB CA C 111.490 1.50 UN_ CB CA N 109.912 1.50 UN_ CB CA HA 108.878 1.50 UN_ C CA N 109.627 1.50 UN_ C CA HA 108.541 1.50 UN_ N CA HA 108.529 1.50 UN_ CA C O 117.159 1.57 UN_ CA C OXT 117.159 1.57 UN_ O C OXT 125.683 1.50 UN_ CA N H 109.643 1.50 UN_ CA N H2 109.643 1.50 UN_ CA N H3 109.643 1.50 UN_ H N H2 109.028 2.41 UN_ H N H3 109.028 2.41 UN_ H2 N H3 109.028 2.41 loop_ _chem_comp_tor.comp_id _chem_comp_tor.id _chem_comp_tor.atom_id_1 _chem_comp_tor.atom_id_2 _chem_comp_tor.atom_id_3 _chem_comp_tor.atom_id_4 _chem_comp_tor.value_angle _chem_comp_tor.value_angle_esd _chem_comp_tor.period UN_ hh1 N CA CB HB3 60.000 15.000 3 UN_ sp2_sp3_1 O C CA CB 0.000 10.00 6 UN_ sp3_sp3_10 CB CA N H 180.000 10.00 3 loop_ _chem_comp_chir.comp_id _chem_comp_chir.id _chem_comp_chir.atom_id_centre _chem_comp_chir.atom_id_1 _chem_comp_chir.atom_id_2 _chem_comp_chir.atom_id_3 _chem_comp_chir.volume_sign UN_ chir_1 CA N C CB positive loop_ _chem_comp_plane_atom.comp_id _chem_comp_plane_atom.plane_id _chem_comp_plane_atom.atom_id _chem_comp_plane_atom.dist_esd UN_ plan-1 C 0.020 UN_ plan-1 CA 0.020 UN_ plan-1 O 0.020 UN_ plan-1 OXT 0.020 loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor UN_ SMILES ACDLabs 10.04 "O=C(O)C(N)C" UN_ SMILES_CANONICAL CACTVS 3.341 "C[C@H](N)C(O)=O" UN_ SMILES CACTVS 3.341 "C[CH](N)C(O)=O" UN_ SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C[C@@H](C(=O)O)N" UN_ SMILES "OpenEye OEToolkits" 1.5.0 "CC(C(=O)O)N" UN_ InChI InChI 1.03 "InChI=1S/C3H7NO2/c1-2(4)3(5)6/h2H,4H2,1H3,(H,5,6)/t2-/m0/s1" UN_ InChIKey InChI 1.03 QNAYBMKLOCPYGJ-REOHCLBHSA-N UN_ ? acedrg 195 "dictionary generator" UN_ ? acedrg_database 11 "data source" UN_ ? rdkit 2017.03.2 "Chemoinformatics tool" UN_ ? refmac5 5.8.0189 "optimization tool" libpdb-redo-3.3.0/test/minimal-components.cif0000644000175000017500000036435614773016616021047 0ustar maartenmaarten# This file contains only a subset of the Components.cif file from CCD # It is here to enable testing the software without having the full CCD # installed. # The original components.cif file can be found at: # http://www.wwpdb.org/data/ccd # and the data herein is available under the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication. data_ALA # _chem_comp.id ALA _chem_comp.name ALANINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C3 H7 N O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 89.093 _chem_comp.one_letter_code A _chem_comp.three_letter_code ALA _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal ALA N N N 0 1 N N N 2.281 26.213 12.804 -0.966 0.493 1.500 N ALA 1 ALA CA CA C 0 1 N N S 1.169 26.942 13.411 0.257 0.418 0.692 CA ALA 2 ALA C C C 0 1 N N N 1.539 28.344 13.874 -0.094 0.017 -0.716 C ALA 3 ALA O O O 0 1 N N N 2.709 28.647 14.114 -1.056 -0.682 -0.923 O ALA 4 ALA CB CB C 0 1 N N N 0.601 26.143 14.574 1.204 -0.620 1.296 CB ALA 5 ALA OXT OXT O 0 1 N Y N 0.523 29.194 13.997 0.661 0.439 -1.742 OXT ALA 6 ALA H H H 0 1 N N N 2.033 25.273 12.493 -1.383 -0.425 1.482 H ALA 7 ALA H2 HN2 H 0 1 N Y N 3.080 26.184 13.436 -0.676 0.661 2.452 H2 ALA 8 ALA HA HA H 0 1 N N N 0.399 27.067 12.613 0.746 1.392 0.682 HA ALA 9 ALA HB1 1HB H 0 1 N N N -0.247 26.699 15.037 1.459 -0.330 2.316 HB1 ALA 10 ALA HB2 2HB H 0 1 N N N 0.308 25.110 14.270 0.715 -1.594 1.307 HB2 ALA 11 ALA HB3 3HB H 0 1 N N N 1.384 25.876 15.321 2.113 -0.676 0.697 HB3 ALA 12 ALA HXT HXT H 0 1 N Y N 0.753 30.069 14.286 0.435 0.182 -2.647 HXT ALA 13 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal ALA N CA SING N N 1 ALA N H SING N N 2 ALA N H2 SING N N 3 ALA CA C SING N N 4 ALA CA CB SING N N 5 ALA CA HA SING N N 6 ALA C O DOUB N N 7 ALA C OXT SING N N 8 ALA CB HB1 SING N N 9 ALA CB HB2 SING N N 10 ALA CB HB3 SING N N 11 ALA OXT HXT SING N N 12 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor ALA SMILES ACDLabs 10.04 "O=C(O)C(N)C" ALA SMILES_CANONICAL CACTVS 3.341 "C[C@H](N)C(O)=O" ALA SMILES CACTVS 3.341 "C[CH](N)C(O)=O" ALA SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C[C@@H](C(=O)O)N" ALA SMILES "OpenEye OEToolkits" 1.5.0 "CC(C(=O)O)N" ALA InChI InChI 1.03 "InChI=1S/C3H7NO2/c1-2(4)3(5)6/h2H,4H2,1H3,(H,5,6)/t2-/m0/s1" ALA InChIKey InChI 1.03 QNAYBMKLOCPYGJ-REOHCLBHSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier ALA "SYSTEMATIC NAME" ACDLabs 10.04 L-alanine ALA "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-2-aminopropanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site ALA "Create component" 1999-07-08 RCSB ALA "Modify descriptor" 2011-06-04 RCSB # data_ARG # _chem_comp.id ARG _chem_comp.name ARGININE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C6 H15 N4 O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 1 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 175.209 _chem_comp.one_letter_code R _chem_comp.three_letter_code ARG _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details "OpenEye/OEToolkits V1.4.2" _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal ARG N N N 0 1 N N N 69.812 14.685 89.810 -0.469 1.110 -0.993 N ARG 1 ARG CA CA C 0 1 N N S 70.052 14.573 91.280 0.004 2.294 -1.708 CA ARG 2 ARG C C C 0 1 N N N 71.542 14.389 91.604 -0.907 2.521 -2.901 C ARG 3 ARG O O O 0 1 N N N 72.354 14.342 90.659 -1.827 1.789 -3.242 O ARG 4 ARG CB CB C 0 1 N N N 69.227 13.419 91.854 1.475 2.150 -2.127 CB ARG 5 ARG CG CG C 0 1 N N N 67.722 13.607 91.686 1.745 1.017 -3.130 CG ARG 6 ARG CD CD C 0 1 N N N 66.952 12.344 92.045 3.210 0.954 -3.557 CD ARG 7 ARG NE NE N 0 1 N N N 67.307 11.224 91.178 4.071 0.726 -2.421 NE ARG 8 ARG CZ CZ C 0 1 N N N 66.932 9.966 91.380 5.469 0.624 -2.528 CZ ARG 9 ARG NH1 NH1 N 0 1 N N N 66.176 9.651 92.421 6.259 0.404 -1.405 NH1 ARG 10 ARG NH2 NH2 N 1 1 N N N 67.344 9.015 90.554 6.078 0.744 -3.773 NH2 ARG 11 ARG OXT OXT O 0 1 N Y N 71.901 14.320 92.798 -0.588 3.659 -3.574 OXT ARG 12 ARG H H H 0 1 N N N 68.822 14.807 89.594 -0.058 0.903 -0.109 H ARG 13 ARG H2 HN2 H 0 1 N Y N 70.205 13.888 89.308 -1.024 0.452 -1.494 H2 ARG 14 ARG HA HA H 0 1 N N N 69.728 15.528 91.756 -0.103 3.152 -1.034 HA ARG 15 ARG HB2 1HB H 0 1 N N N 69.554 12.445 91.420 2.086 1.988 -1.230 HB2 ARG 16 ARG HB3 2HB H 0 1 N N N 69.486 13.241 92.923 1.814 3.099 -2.563 HB3 ARG 17 ARG HG2 1HG H 0 1 N N N 67.355 14.485 92.266 1.136 1.170 -4.029 HG2 ARG 18 ARG HG3 2HG H 0 1 N N N 67.468 13.958 90.658 1.447 0.054 -2.698 HG3 ARG 19 ARG HD2 1HD H 0 1 N N N 67.083 12.081 93.120 3.348 0.133 -4.269 HD2 ARG 20 ARG HD3 2HD H 0 1 N N N 65.851 12.525 92.042 3.505 1.880 -4.062 HD3 ARG 21 ARG HE HE H 0 1 N N N 68.324 11.220 91.100 3.674 0.627 -1.479 HE ARG 22 ARG HH11 1HH1 H 0 0 N N N 65.888 8.684 92.576 7.271 0.331 -1.484 HH11 ARG 23 ARG HH12 2HH1 H 0 0 N N N 65.339 10.234 92.397 5.858 0.307 -0.476 HH12 ARG 24 ARG HH21 1HH2 H 0 0 N N N 67.926 9.257 89.752 5.530 0.906 -4.614 HH21 ARG 25 ARG HH22 2HH2 H 0 0 N N N 67.056 8.048 90.709 7.088 0.675 -3.874 HH22 ARG 26 ARG HXT HXT H 0 1 N Y N 72.822 14.206 92.998 -1.149 3.855 -4.355 HXT ARG 27 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal ARG N CA SING N N 1 ARG N H SING N N 2 ARG N H2 SING N N 3 ARG CA C SING N N 4 ARG CA CB SING N N 5 ARG CA HA SING N N 6 ARG C O DOUB N N 7 ARG C OXT SING N N 8 ARG CB CG SING N N 9 ARG CB HB2 SING N N 10 ARG CB HB3 SING N N 11 ARG CG CD SING N N 12 ARG CG HG2 SING N N 13 ARG CG HG3 SING N N 14 ARG CD NE SING N N 15 ARG CD HD2 SING N N 16 ARG CD HD3 SING N N 17 ARG NE CZ SING N N 18 ARG NE HE SING N N 19 ARG CZ NH1 SING N N 20 ARG CZ NH2 DOUB N N 21 ARG NH1 HH11 SING N N 22 ARG NH1 HH12 SING N N 23 ARG NH2 HH21 SING N N 24 ARG NH2 HH22 SING N N 25 ARG OXT HXT SING N N 26 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor ARG SMILES ACDLabs 10.04 "O=C(O)C(N)CCCN\C(=[NH2+])N" ARG SMILES_CANONICAL CACTVS 3.341 "N[C@@H](CCCNC(N)=[NH2+])C(O)=O" ARG SMILES CACTVS 3.341 "N[CH](CCCNC(N)=[NH2+])C(O)=O" ARG SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C(C[C@@H](C(=O)O)N)CNC(=[NH2+])N" ARG SMILES "OpenEye OEToolkits" 1.5.0 "C(CC(C(=O)O)N)CNC(=[NH2+])N" ARG InChI InChI 1.03 "InChI=1S/C6H14N4O2/c7-4(5(11)12)2-1-3-10-6(8)9/h4H,1-3,7H2,(H,11,12)(H4,8,9,10)/p+1/t4-/m0/s1" ARG InChIKey InChI 1.03 ODKSFYDXXFIFQN-BYPYZUCNSA-O # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier ARG "SYSTEMATIC NAME" ACDLabs 10.04 "amino{[(4S)-4-amino-4-carboxybutyl]amino}methaniminium" ARG "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "[amino-[[(4S)-4-amino-5-hydroxy-5-oxo-pentyl]amino]methylidene]azanium" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site ARG "Create component" 1999-07-08 RCSB ARG "Modify descriptor" 2011-06-04 RCSB # data_ASN # _chem_comp.id ASN _chem_comp.name ASPARAGINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C4 H8 N2 O3" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2014-11-11 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 132.118 _chem_comp.one_letter_code N _chem_comp.three_letter_code ASN _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details Corina _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal ASN N N N 0 1 N N N 15.295 16.641 19.776 -0.293 1.686 0.094 N ASN 1 ASN CA CA C 0 1 N N S 15.702 17.913 20.397 -0.448 0.292 -0.340 CA ASN 2 ASN C C C 0 1 N N N 14.630 18.500 21.234 -1.846 -0.179 -0.031 C ASN 3 ASN O O O 0 1 N N N 14.949 19.152 22.234 -2.510 0.402 0.794 O ASN 4 ASN CB CB C 0 1 N N N 16.088 18.882 19.297 0.562 -0.588 0.401 CB ASN 5 ASN CG CG C 0 1 N N N 17.262 18.512 18.462 1.960 -0.197 -0.002 CG ASN 6 ASN OD1 OD1 O 0 1 N N N 18.123 17.705 18.780 2.132 0.697 -0.804 OD1 ASN 7 ASN ND2 ND2 N 0 1 N N N 17.281 19.172 17.284 3.019 -0.841 0.527 ND2 ASN 8 ASN OXT OXT O 0 1 N Y N 13.386 18.353 20.865 -2.353 -1.243 -0.673 OXT ASN 9 ASN H H H 0 1 N N N 16.048 16.284 19.223 -0.904 2.297 -0.427 H ASN 10 ASN H2 HN2 H 0 1 N Y N 15.064 15.980 20.490 -0.453 1.776 1.086 H2 ASN 11 ASN HA HA H 0 1 N N N 16.555 17.716 21.063 -0.270 0.223 -1.413 HA ASN 12 ASN HB2 1HB H 0 1 N N N 15.224 18.966 18.622 0.442 -0.451 1.476 HB2 ASN 13 ASN HB3 2HB H 0 1 N N N 16.323 19.842 19.779 0.389 -1.633 0.146 HB3 ASN 14 ASN HD21 1HD2 H 0 0 N N N 18.021 19.008 16.631 2.881 -1.556 1.168 HD21 ASN 15 ASN HD22 2HD2 H 0 0 N N N 16.555 19.824 17.065 3.919 -0.590 0.268 HD22 ASN 16 ASN HXT HXT H 0 1 N Y N 12.819 18.813 21.473 -3.254 -1.508 -0.441 HXT ASN 17 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal ASN N CA SING N N 1 ASN N H SING N N 2 ASN N H2 SING N N 3 ASN CA C SING N N 4 ASN CA CB SING N N 5 ASN CA HA SING N N 6 ASN C O DOUB N N 7 ASN C OXT SING N N 8 ASN CB CG SING N N 9 ASN CB HB2 SING N N 10 ASN CB HB3 SING N N 11 ASN CG OD1 DOUB N N 12 ASN CG ND2 SING N N 13 ASN ND2 HD21 SING N N 14 ASN ND2 HD22 SING N N 15 ASN OXT HXT SING N N 16 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor ASN SMILES ACDLabs 12.01 "O=C(N)CC(N)C(=O)O" ASN InChI InChI 1.03 "InChI=1S/C4H8N2O3/c5-2(4(8)9)1-3(6)7/h2H,1,5H2,(H2,6,7)(H,8,9)/t2-/m0/s1" ASN InChIKey InChI 1.03 DCXYFEDJOCDNAF-REOHCLBHSA-N ASN SMILES_CANONICAL CACTVS 3.370 "N[C@@H](CC(N)=O)C(O)=O" ASN SMILES CACTVS 3.370 "N[CH](CC(N)=O)C(O)=O" ASN SMILES_CANONICAL "OpenEye OEToolkits" 1.7.2 "C([C@@H](C(=O)O)N)C(=O)N" ASN SMILES "OpenEye OEToolkits" 1.7.2 "C(C(C(=O)O)N)C(=O)N" # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier ASN "SYSTEMATIC NAME" ACDLabs 12.01 L-asparagine ASN "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.7.2 "(2S)-2,4-bis(azanyl)-4-oxidanylidene-butanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site ASN "Create component" 1999-07-08 EBI ASN "Modify leaving atom flag" 2010-12-17 RCSB ASN "Modify descriptor" 2011-06-04 RCSB ASN "Modify leaving atom flag" 2011-08-05 RCSB ASN "Other modification" 2014-11-11 RCSB # data_ASP # _chem_comp.id ASP _chem_comp.name "ASPARTIC ACID" _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C4 H7 N O4" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 133.103 _chem_comp.one_letter_code D _chem_comp.three_letter_code ASP _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details Corina _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal ASP N N N 0 1 N N N 33.487 17.736 39.094 -0.317 1.688 0.066 N ASP 1 ASP CA CA C 0 1 N N S 34.909 17.506 38.709 -0.470 0.286 -0.344 CA ASP 2 ASP C C C 0 1 N N N 34.993 16.527 37.537 -1.868 -0.180 -0.029 C ASP 3 ASP O O O 0 1 N N N 36.106 16.031 37.261 -2.534 0.415 0.786 O ASP 4 ASP CB CB C 0 1 N N N 35.682 16.954 39.915 0.539 -0.580 0.413 CB ASP 5 ASP CG CG C 0 1 N N N 35.231 15.544 40.306 1.938 -0.195 0.004 CG ASP 6 ASP OD1 OD1 O 0 1 N N N 35.793 14.986 41.279 2.109 0.681 -0.810 OD1 ASP 7 ASP OD2 OD2 O 0 1 N N N 34.327 14.999 39.631 2.992 -0.826 0.543 OD2 ASP 8 ASP OXT OXT O 0 1 N Y N 33.935 16.265 36.913 -2.374 -1.256 -0.652 OXT ASP 9 ASP H H H 0 1 N N N 33.448 18.377 39.860 -0.928 2.289 -0.467 H ASP 10 ASP H2 HN2 H 0 1 N Y N 32.988 18.117 38.315 -0.478 1.795 1.056 H2 ASP 11 ASP HA HA H 0 1 N N N 35.356 18.461 38.395 -0.292 0.199 -1.416 HA ASP 12 ASP HB2 HB1 H 0 1 N N N 36.751 16.919 39.657 0.419 -0.425 1.485 HB2 ASP 13 ASP HB3 HB2 H 0 1 N N N 35.515 17.623 40.772 0.367 -1.630 0.176 HB3 ASP 14 ASP HD2 HD2 H 0 1 N N N 34.155 14.130 39.974 3.869 -0.545 0.250 HD2 ASP 15 ASP HXT HXT H 0 1 N Y N 34.122 15.645 36.218 -3.275 -1.517 -0.416 HXT ASP 16 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal ASP N CA SING N N 1 ASP N H SING N N 2 ASP N H2 SING N N 3 ASP CA C SING N N 4 ASP CA CB SING N N 5 ASP CA HA SING N N 6 ASP C O DOUB N N 7 ASP C OXT SING N N 8 ASP CB CG SING N N 9 ASP CB HB2 SING N N 10 ASP CB HB3 SING N N 11 ASP CG OD1 DOUB N N 12 ASP CG OD2 SING N N 13 ASP OD2 HD2 SING N N 14 ASP OXT HXT SING N N 15 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor ASP SMILES ACDLabs 12.01 "O=C(O)CC(N)C(=O)O" ASP SMILES_CANONICAL CACTVS 3.370 "N[C@@H](CC(O)=O)C(O)=O" ASP SMILES CACTVS 3.370 "N[CH](CC(O)=O)C(O)=O" ASP SMILES_CANONICAL "OpenEye OEToolkits" 1.7.0 "C([C@@H](C(=O)O)N)C(=O)O" ASP SMILES "OpenEye OEToolkits" 1.7.0 "C(C(C(=O)O)N)C(=O)O" ASP InChI InChI 1.03 "InChI=1S/C4H7NO4/c5-2(4(8)9)1-3(6)7/h2H,1,5H2,(H,6,7)(H,8,9)/t2-/m0/s1" ASP InChIKey InChI 1.03 CKLJMWTZIZZHCS-REOHCLBHSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier ASP "SYSTEMATIC NAME" ACDLabs 12.01 "L-aspartic acid" ASP "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.7.0 "(2S)-2-azanylbutanedioic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site ASP "Create component" 1999-07-08 EBI ASP "Modify leaving atom flag" 2011-01-28 RCSB ASP "Modify descriptor" 2011-06-04 RCSB # data_CYS # _chem_comp.id CYS _chem_comp.name CYSTEINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C3 H7 N O2 S" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces BTC _chem_comp.formula_weight 121.158 _chem_comp.one_letter_code C _chem_comp.three_letter_code CYS _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal CYS N N N 0 1 N N N 22.585 13.716 37.715 1.585 0.483 -0.081 N CYS 1 CYS CA CA C 0 1 N N R 22.372 13.468 39.168 0.141 0.450 0.186 CA CYS 2 CYS C C C 0 1 N N N 21.806 14.686 39.893 -0.095 0.006 1.606 C CYS 3 CYS O O O 0 1 N N N 22.614 15.553 40.277 0.685 -0.742 2.143 O CYS 4 CYS CB CB C 0 1 N N N 23.683 13.019 39.828 -0.533 -0.530 -0.774 CB CYS 5 CYS SG SG S 0 1 N N N 25.202 13.440 38.921 -0.247 0.004 -2.484 SG CYS 6 CYS OXT OXT O 0 1 N Y N 20.565 14.747 40.076 -1.174 0.443 2.275 OXT CYS 7 CYS H H H 0 1 N N N 22.963 12.902 37.230 1.928 -0.454 0.063 H CYS 8 CYS H2 HN2 H 0 1 N Y N 23.171 14.537 37.565 1.693 0.682 -1.065 H2 CYS 9 CYS HA HA H 0 1 N N N 21.614 12.654 39.253 -0.277 1.446 0.042 HA CYS 10 CYS HB2 1HB H 0 1 N N N 23.739 13.412 40.869 -0.114 -1.526 -0.630 HB2 CYS 11 CYS HB3 2HB H 0 1 N N N 23.651 11.923 40.031 -1.604 -0.554 -0.575 HB3 CYS 12 CYS HG HG H 0 1 N N N 26.013 13.162 39.329 -0.904 -0.965 -3.145 HG CYS 13 CYS HXT HXT H 0 1 N Y N 20.212 15.505 40.527 -1.326 0.158 3.186 HXT CYS 14 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal CYS N CA SING N N 1 CYS N H SING N N 2 CYS N H2 SING N N 3 CYS CA C SING N N 4 CYS CA CB SING N N 5 CYS CA HA SING N N 6 CYS C O DOUB N N 7 CYS C OXT SING N N 8 CYS CB SG SING N N 9 CYS CB HB2 SING N N 10 CYS CB HB3 SING N N 11 CYS SG HG SING N N 12 CYS OXT HXT SING N N 13 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor CYS SMILES ACDLabs 10.04 "O=C(O)C(N)CS" CYS SMILES_CANONICAL CACTVS 3.341 "N[C@@H](CS)C(O)=O" CYS SMILES CACTVS 3.341 "N[CH](CS)C(O)=O" CYS SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C([C@@H](C(=O)O)N)S" CYS SMILES "OpenEye OEToolkits" 1.5.0 "C(C(C(=O)O)N)S" CYS InChI InChI 1.03 "InChI=1S/C3H7NO2S/c4-2(1-7)3(5)6/h2,7H,1,4H2,(H,5,6)/t2-/m0/s1" CYS InChIKey InChI 1.03 XUJNEKJLAYXESH-REOHCLBHSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier CYS "SYSTEMATIC NAME" ACDLabs 10.04 L-cysteine CYS "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2R)-2-amino-3-sulfanyl-propanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site CYS "Create component" 1999-07-08 RCSB CYS "Modify descriptor" 2011-06-04 RCSB # data_GLN # _chem_comp.id GLN _chem_comp.name GLUTAMINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C5 H10 N2 O3" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 146.144 _chem_comp.one_letter_code Q _chem_comp.three_letter_code GLN _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal GLN N N N 0 1 N N N -12.869 34.883 120.983 1.858 -0.148 1.125 N GLN 1 GLN CA CA C 0 1 N N S -12.048 35.305 119.985 0.517 0.451 1.112 CA GLN 2 GLN C C C 0 1 N N N -10.724 35.797 120.549 -0.236 0.022 2.344 C GLN 3 GLN O O O 0 1 N N N -9.691 35.852 119.806 -0.005 -1.049 2.851 O GLN 4 GLN CB CB C 0 1 N N N -12.660 36.476 119.161 -0.236 -0.013 -0.135 CB GLN 5 GLN CG CG C 0 1 N N N -13.110 37.658 120.071 0.529 0.421 -1.385 CG GLN 6 GLN CD CD C 0 1 N N N -13.701 38.830 119.321 -0.213 -0.036 -2.614 CD GLN 7 GLN OE1 OE1 O 0 1 N N N -14.715 38.686 118.658 -1.252 -0.650 -2.500 OE1 GLN 8 GLN NE2 NE2 N 0 1 N N N -13.069 39.999 119.445 0.277 0.236 -3.839 NE2 GLN 9 GLN OXT OXT O 0 1 N Y N -10.665 36.169 121.753 -1.165 0.831 2.878 OXT GLN 10 GLN H H H 0 1 N N N -13.756 34.553 120.604 1.729 -1.148 1.137 H GLN 11 GLN H2 HN2 H 0 1 N Y N -13.004 35.604 121.691 2.286 0.078 0.240 H2 GLN 12 GLN HA HA H 0 1 N N N -11.902 34.421 119.320 0.605 1.537 1.099 HA GLN 13 GLN HB2 1HB H 0 1 N N N -11.958 36.821 118.366 -0.324 -1.100 -0.122 HB2 GLN 14 GLN HB3 2HB H 0 1 N N N -13.496 36.121 118.514 -1.231 0.431 -0.144 HB3 GLN 15 GLN HG2 1HG H 0 1 N N N -13.818 37.299 120.853 0.617 1.508 -1.398 HG2 GLN 16 GLN HG3 2HG H 0 1 N N N -12.266 37.994 120.717 1.524 -0.023 -1.375 HG3 GLN 17 GLN HE21 1HE2 H 0 0 N N N -12.221 40.119 119.999 -0.200 -0.058 -4.630 HE21 GLN 18 GLN HE22 2HE2 H 0 0 N N N -13.467 40.789 118.939 1.109 0.727 -3.930 HE22 GLN 19 GLN HXT HXT H 0 1 N Y N -9.838 36.476 122.105 -1.649 0.556 3.669 HXT GLN 20 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal GLN N CA SING N N 1 GLN N H SING N N 2 GLN N H2 SING N N 3 GLN CA C SING N N 4 GLN CA CB SING N N 5 GLN CA HA SING N N 6 GLN C O DOUB N N 7 GLN C OXT SING N N 8 GLN CB CG SING N N 9 GLN CB HB2 SING N N 10 GLN CB HB3 SING N N 11 GLN CG CD SING N N 12 GLN CG HG2 SING N N 13 GLN CG HG3 SING N N 14 GLN CD OE1 DOUB N N 15 GLN CD NE2 SING N N 16 GLN NE2 HE21 SING N N 17 GLN NE2 HE22 SING N N 18 GLN OXT HXT SING N N 19 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor GLN SMILES ACDLabs 10.04 "O=C(N)CCC(N)C(=O)O" GLN SMILES_CANONICAL CACTVS 3.341 "N[C@@H](CCC(N)=O)C(O)=O" GLN SMILES CACTVS 3.341 "N[CH](CCC(N)=O)C(O)=O" GLN SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C(CC(=O)N)[C@@H](C(=O)O)N" GLN SMILES "OpenEye OEToolkits" 1.5.0 "C(CC(=O)N)C(C(=O)O)N" GLN InChI InChI 1.03 "InChI=1S/C5H10N2O3/c6-3(5(9)10)1-2-4(7)8/h3H,1-2,6H2,(H2,7,8)(H,9,10)/t3-/m0/s1" GLN InChIKey InChI 1.03 ZDXPYRJPNDTMRX-VKHMYHEASA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier GLN "SYSTEMATIC NAME" ACDLabs 10.04 L-glutamine GLN "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-2,5-diamino-5-oxo-pentanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site GLN "Create component" 1999-07-08 EBI GLN "Modify descriptor" 2011-06-04 RCSB # data_GLU # _chem_comp.id GLU _chem_comp.name "GLUTAMIC ACID" _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C5 H9 N O4" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 147.129 _chem_comp.one_letter_code E _chem_comp.three_letter_code GLU _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details Corina _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal GLU N N N 0 1 N N N 88.261 -7.660 -9.990 1.199 1.867 -0.117 N GLU 1 GLU CA CA C 0 1 N N S 87.744 -7.276 -11.334 1.138 0.515 0.453 CA GLU 2 GLU C C C 0 1 N N N 88.474 -6.030 -11.811 2.364 -0.260 0.041 C GLU 3 GLU O O O 0 1 N N N 88.969 -5.292 -10.943 3.010 0.096 -0.916 O GLU 4 GLU CB CB C 0 1 N N N 86.234 -7.012 -11.267 -0.113 -0.200 -0.062 CB GLU 5 GLU CG CG C 0 1 N N N 85.437 -8.194 -10.746 -1.360 0.517 0.461 CG GLU 6 GLU CD CD C 0 1 N N N 83.937 -7.944 -10.707 -2.593 -0.187 -0.046 CD GLU 7 GLU OE1 OE1 O 0 1 N N N 83.425 -7.140 -11.520 -2.485 -1.161 -0.753 OE1 GLU 8 GLU OE2 OE2 O 0 1 N N N 83.260 -8.567 -9.862 -3.811 0.269 0.287 OE2 GLU 9 GLU OXT OXT O 0 1 N Y N 88.543 -5.801 -13.033 2.737 -1.345 0.737 OXT GLU 10 GLU H H H 0 1 N N N 87.785 -8.479 -9.671 1.237 1.834 -1.125 H GLU 11 GLU H2 HN2 H 0 1 N Y N 89.241 -7.847 -10.051 0.421 2.427 0.197 H2 GLU 12 GLU HA HA H 0 1 N N N 87.920 -8.099 -12.043 1.098 0.580 1.540 HA GLU 13 GLU HB2 HB1 H 0 1 N N N 86.064 -6.160 -10.592 -0.117 -0.187 -1.152 HB2 GLU 14 GLU HB3 HB2 H 0 1 N N N 85.881 -6.781 -12.283 -0.113 -1.231 0.289 HB3 GLU 15 GLU HG2 HG1 H 0 1 N N N 85.624 -9.052 -11.408 -1.357 0.504 1.551 HG2 GLU 16 GLU HG3 HG2 H 0 1 N N N 85.775 -8.411 -9.722 -1.360 1.548 0.109 HG3 GLU 17 GLU HE2 HE2 H 0 1 N N N 82.345 -8.328 -9.951 -4.571 -0.215 -0.062 HE2 GLU 18 GLU HXT HXT H 0 1 N Y N 89.022 -4.994 -13.178 3.530 -1.809 0.435 HXT GLU 19 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal GLU N CA SING N N 1 GLU N H SING N N 2 GLU N H2 SING N N 3 GLU CA C SING N N 4 GLU CA CB SING N N 5 GLU CA HA SING N N 6 GLU C O DOUB N N 7 GLU C OXT SING N N 8 GLU CB CG SING N N 9 GLU CB HB2 SING N N 10 GLU CB HB3 SING N N 11 GLU CG CD SING N N 12 GLU CG HG2 SING N N 13 GLU CG HG3 SING N N 14 GLU CD OE1 DOUB N N 15 GLU CD OE2 SING N N 16 GLU OE2 HE2 SING N N 17 GLU OXT HXT SING N N 18 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor GLU SMILES ACDLabs 12.01 "O=C(O)C(N)CCC(=O)O" GLU SMILES_CANONICAL CACTVS 3.370 "N[C@@H](CCC(O)=O)C(O)=O" GLU SMILES CACTVS 3.370 "N[CH](CCC(O)=O)C(O)=O" GLU SMILES_CANONICAL "OpenEye OEToolkits" 1.7.0 "C(CC(=O)O)[C@@H](C(=O)O)N" GLU SMILES "OpenEye OEToolkits" 1.7.0 "C(CC(=O)O)C(C(=O)O)N" GLU InChI InChI 1.03 "InChI=1S/C5H9NO4/c6-3(5(9)10)1-2-4(7)8/h3H,1-2,6H2,(H,7,8)(H,9,10)/t3-/m0/s1" GLU InChIKey InChI 1.03 WHUUTDBJXJRKMK-VKHMYHEASA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier GLU "SYSTEMATIC NAME" ACDLabs 12.01 "L-glutamic acid" GLU "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.7.0 "(2S)-2-azanylpentanedioic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site GLU "Create component" 1999-07-08 EBI GLU "Modify leaving atom flag" 2011-01-28 RCSB GLU "Other modification" 2011-02-09 RCSB GLU "Modify descriptor" 2011-06-04 RCSB # data_GLY # _chem_comp.id GLY _chem_comp.name GLYCINE _chem_comp.type "PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C2 H5 N O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 75.067 _chem_comp.one_letter_code G _chem_comp.three_letter_code GLY _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details Corina _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal GLY N N N 0 1 N N N 25.463 35.609 47.047 1.931 0.090 -0.034 N GLY 1 GLY CA CA C 0 1 N N N 25.329 37.024 46.850 0.761 -0.799 -0.008 CA GLY 2 GLY C C C 0 1 N N N 26.081 37.335 45.572 -0.498 0.029 -0.005 C GLY 3 GLY O O O 0 1 N N N 27.024 36.627 45.222 -0.429 1.235 -0.023 O GLY 4 GLY OXT OXT O 0 1 N Y N 25.702 38.256 44.874 -1.697 -0.574 0.018 OXT GLY 5 GLY H H H 0 1 N N N 25.494 35.150 46.159 1.910 0.738 0.738 H GLY 6 GLY H2 HN2 H 0 1 N Y N 26.307 35.421 47.549 2.788 -0.442 -0.037 H2 GLY 7 GLY HA2 HA1 H 0 1 N N N 24.270 37.305 46.757 0.772 -1.440 -0.889 HA2 GLY 8 GLY HA3 HA2 H 0 1 N N N 25.731 37.590 47.703 0.793 -1.415 0.891 HA3 GLY 9 GLY HXT HXT H 0 1 N Y N 26.236 38.300 44.090 -2.477 -0.002 0.019 HXT GLY 10 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal GLY N CA SING N N 1 GLY N H SING N N 2 GLY N H2 SING N N 3 GLY CA C SING N N 4 GLY CA HA2 SING N N 5 GLY CA HA3 SING N N 6 GLY C O DOUB N N 7 GLY C OXT SING N N 8 GLY OXT HXT SING N N 9 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor GLY SMILES ACDLabs 10.04 "O=C(O)CN" GLY SMILES_CANONICAL CACTVS 3.341 "NCC(O)=O" GLY SMILES CACTVS 3.341 "NCC(O)=O" GLY SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C(C(=O)O)N" GLY SMILES "OpenEye OEToolkits" 1.5.0 "C(C(=O)O)N" GLY InChI InChI 1.03 "InChI=1S/C2H5NO2/c3-1-2(4)5/h1,3H2,(H,4,5)" GLY InChIKey InChI 1.03 DHMQDGOQFOQNFH-UHFFFAOYSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier GLY "SYSTEMATIC NAME" ACDLabs 10.04 glycine GLY "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "2-aminoethanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site GLY "Create component" 1999-07-08 RCSB GLY "Modify descriptor" 2011-06-04 RCSB # data_ILE # _chem_comp.id ILE _chem_comp.name ISOLEUCINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C6 H13 N O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 131.173 _chem_comp.one_letter_code I _chem_comp.three_letter_code ILE _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal ILE N N N 0 1 N N N 52.625 76.235 68.049 -1.944 0.335 -0.343 N ILE 1 ILE CA CA C 0 1 N N S 52.964 77.620 67.705 -0.487 0.519 -0.369 CA ILE 2 ILE C C C 0 1 N N N 51.910 78.234 66.791 0.066 -0.032 -1.657 C ILE 3 ILE O O O 0 1 N N N 51.409 77.508 65.911 -0.484 -0.958 -2.203 O ILE 4 ILE CB CB C 0 1 N N S 54.346 77.727 66.970 0.140 -0.219 0.814 CB ILE 5 ILE CG1 CG1 C 0 1 N N N 54.852 79.179 66.992 -0.421 0.341 2.122 CG1 ILE 6 ILE CG2 CG2 C 0 1 N N N 54.218 77.237 65.524 1.658 -0.027 0.788 CG2 ILE 7 ILE CD1 CD1 C 0 1 N N N 56.126 79.382 66.170 0.206 -0.397 3.305 CD1 ILE 8 ILE OXT OXT O 0 1 N Y N 51.631 79.444 66.958 1.171 0.504 -2.197 OXT ILE 9 ILE H H H 0 1 N N N 53.330 75.824 68.660 -2.112 -0.656 -0.410 H ILE 10 ILE H2 HN2 H 0 1 N Y N 52.475 75.667 67.215 -2.256 0.622 0.572 H2 ILE 11 ILE HA HA H 0 1 N N N 53.012 78.169 68.673 -0.253 1.582 -0.299 HA ILE 12 ILE HB HB H 0 1 N N N 55.082 77.082 67.504 -0.092 -1.281 0.744 HB ILE 13 ILE HG12 1HG1 H 0 0 N N N 54.051 79.883 66.666 -1.502 0.204 2.141 HG12 ILE 14 ILE HG13 2HG1 H 0 0 N N N 54.993 79.535 68.039 -0.188 1.403 2.192 HG13 ILE 15 ILE HG21 1HG2 H 0 0 N N N 55.200 77.313 65.001 1.891 1.034 0.857 HG21 ILE 16 ILE HG22 2HG2 H 0 0 N N N 53.796 76.206 65.469 2.105 -0.554 1.631 HG22 ILE 17 ILE HG23 3HG2 H 0 0 N N N 53.411 77.773 64.972 2.059 -0.427 -0.143 HG23 ILE 18 ILE HD11 1HD1 H 0 0 N N N 56.492 80.434 66.185 -0.193 0.001 4.237 HD11 ILE 19 ILE HD12 2HD1 H 0 0 N N N 56.926 78.677 66.496 -0.026 -1.460 3.235 HD12 ILE 20 ILE HD13 3HD1 H 0 0 N N N 55.984 79.026 65.122 1.287 -0.261 3.286 HD13 ILE 21 ILE HXT HXT H 0 1 N Y N 50.974 79.826 66.388 1.527 0.150 -3.024 HXT ILE 22 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal ILE N CA SING N N 1 ILE N H SING N N 2 ILE N H2 SING N N 3 ILE CA C SING N N 4 ILE CA CB SING N N 5 ILE CA HA SING N N 6 ILE C O DOUB N N 7 ILE C OXT SING N N 8 ILE CB CG1 SING N N 9 ILE CB CG2 SING N N 10 ILE CB HB SING N N 11 ILE CG1 CD1 SING N N 12 ILE CG1 HG12 SING N N 13 ILE CG1 HG13 SING N N 14 ILE CG2 HG21 SING N N 15 ILE CG2 HG22 SING N N 16 ILE CG2 HG23 SING N N 17 ILE CD1 HD11 SING N N 18 ILE CD1 HD12 SING N N 19 ILE CD1 HD13 SING N N 20 ILE OXT HXT SING N N 21 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor ILE SMILES ACDLabs 10.04 "O=C(O)C(N)C(C)CC" ILE SMILES_CANONICAL CACTVS 3.341 "CC[C@H](C)[C@H](N)C(O)=O" ILE SMILES CACTVS 3.341 "CC[CH](C)[CH](N)C(O)=O" ILE SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "CC[C@H](C)[C@@H](C(=O)O)N" ILE SMILES "OpenEye OEToolkits" 1.5.0 "CCC(C)C(C(=O)O)N" ILE InChI InChI 1.03 "InChI=1S/C6H13NO2/c1-3-4(2)5(7)6(8)9/h4-5H,3,7H2,1-2H3,(H,8,9)/t4-,5-/m0/s1" ILE InChIKey InChI 1.03 AGPKZVBTJJNPAG-WHFBIAKZSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier ILE "SYSTEMATIC NAME" ACDLabs 10.04 L-isoleucine ILE "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S,3S)-2-amino-3-methyl-pentanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site ILE "Create component" 1999-07-08 RCSB ILE "Modify descriptor" 2011-06-04 RCSB # data_LEU # _chem_comp.id LEU _chem_comp.name LEUCINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C6 H13 N O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 131.173 _chem_comp.one_letter_code L _chem_comp.three_letter_code LEU _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal LEU N N N 0 1 N N N 16.293 15.907 52.123 -1.661 0.627 -0.406 N LEU 1 LEU CA CA C 0 1 N N S 15.121 16.772 51.804 -0.205 0.441 -0.467 CA LEU 2 LEU C C C 0 1 N N N 13.865 15.975 51.517 0.180 -0.055 -1.836 C LEU 3 LEU O O O 0 1 N N N 12.808 16.576 51.643 -0.591 -0.731 -2.474 O LEU 4 LEU CB CB C 0 1 N N N 15.395 17.657 50.575 0.221 -0.583 0.585 CB LEU 5 LEU CG CG C 0 1 N N N 16.407 18.798 50.632 -0.170 -0.079 1.976 CG LEU 6 LEU CD1 CD1 C 0 1 N N N 16.398 19.395 52.065 0.256 -1.104 3.029 CD1 LEU 7 LEU CD2 CD2 C 0 1 N N N 17.792 18.247 50.210 0.526 1.254 2.250 CD2 LEU 8 LEU OXT OXT O 0 1 N Y N 13.877 14.786 51.211 1.382 0.254 -2.348 OXT LEU 9 LEU H H H 0 1 N N N 17.138 16.443 52.316 -2.077 -0.272 -0.592 H LEU 10 LEU H2 HN2 H 0 1 N Y N 16.454 15.223 51.383 -1.884 0.858 0.550 H2 LEU 11 LEU HA HA H 0 1 N N N 14.962 17.396 52.714 0.291 1.391 -0.271 HA LEU 12 LEU HB2 1HB H 0 1 N N N 15.673 16.990 49.725 1.301 -0.722 0.540 HB2 LEU 13 LEU HB3 2HB H 0 1 N N N 14.421 18.076 50.228 -0.275 -1.534 0.390 HB3 LEU 14 LEU HG HG H 0 1 N N N 16.148 19.623 49.927 -1.250 0.058 2.021 HG LEU 15 LEU HD11 1HD1 H 0 0 N N N 17.137 20.228 52.106 -0.022 -0.745 4.019 HD11 LEU 16 LEU HD12 2HD1 H 0 0 N N N 15.379 19.710 52.390 -0.240 -2.055 2.833 HD12 LEU 17 LEU HD13 3HD1 H 0 0 N N N 16.577 18.624 52.850 1.336 -1.243 2.984 HD13 LEU 18 LEU HD21 1HD2 H 0 0 N N N 18.531 19.080 50.251 1.606 1.115 2.205 HD21 LEU 19 LEU HD22 2HD2 H 0 0 N N N 18.105 17.366 50.817 0.222 1.984 1.500 HD22 LEU 20 LEU HD23 3HD2 H 0 0 N N N 17.768 17.745 49.214 0.247 1.613 3.241 HD23 LEU 21 LEU HXT HXT H 0 1 N Y N 13.089 14.286 51.031 1.630 -0.064 -3.226 HXT LEU 22 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal LEU N CA SING N N 1 LEU N H SING N N 2 LEU N H2 SING N N 3 LEU CA C SING N N 4 LEU CA CB SING N N 5 LEU CA HA SING N N 6 LEU C O DOUB N N 7 LEU C OXT SING N N 8 LEU CB CG SING N N 9 LEU CB HB2 SING N N 10 LEU CB HB3 SING N N 11 LEU CG CD1 SING N N 12 LEU CG CD2 SING N N 13 LEU CG HG SING N N 14 LEU CD1 HD11 SING N N 15 LEU CD1 HD12 SING N N 16 LEU CD1 HD13 SING N N 17 LEU CD2 HD21 SING N N 18 LEU CD2 HD22 SING N N 19 LEU CD2 HD23 SING N N 20 LEU OXT HXT SING N N 21 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor LEU SMILES ACDLabs 10.04 "O=C(O)C(N)CC(C)C" LEU SMILES_CANONICAL CACTVS 3.341 "CC(C)C[C@H](N)C(O)=O" LEU SMILES CACTVS 3.341 "CC(C)C[CH](N)C(O)=O" LEU SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "CC(C)C[C@@H](C(=O)O)N" LEU SMILES "OpenEye OEToolkits" 1.5.0 "CC(C)CC(C(=O)O)N" LEU InChI InChI 1.03 "InChI=1S/C6H13NO2/c1-4(2)3-5(7)6(8)9/h4-5H,3,7H2,1-2H3,(H,8,9)/t5-/m0/s1" LEU InChIKey InChI 1.03 ROHFNLRQFUQHCH-YFKPBYRVSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier LEU "SYSTEMATIC NAME" ACDLabs 10.04 L-leucine LEU "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-2-amino-4-methyl-pentanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site LEU "Create component" 1999-07-08 EBI LEU "Modify descriptor" 2011-06-04 RCSB # data_LYS # _chem_comp.id LYS _chem_comp.name LYSINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C6 H15 N2 O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 1 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 147.195 _chem_comp.one_letter_code K _chem_comp.three_letter_code LYS _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal LYS N N N 0 1 N N N 37.577 40.385 -3.968 1.422 1.796 0.198 N LYS 1 LYS CA CA C 0 1 N N S 38.631 39.459 -4.356 1.394 0.355 0.484 CA LYS 2 LYS C C C 0 1 N N N 38.094 38.304 -5.212 2.657 -0.284 -0.032 C LYS 3 LYS O O O 0 1 N N N 36.873 38.235 -5.490 3.316 0.275 -0.876 O LYS 4 LYS CB CB C 0 1 N N N 39.374 38.919 -3.139 0.184 -0.278 -0.206 CB LYS 5 LYS CG CG C 0 1 N N N 38.523 38.111 -2.181 -1.102 0.282 0.407 CG LYS 6 LYS CD CD C 0 1 N N N 39.164 36.749 -1.903 -2.313 -0.351 -0.283 CD LYS 7 LYS CE CE C 0 1 N N N 38.106 35.761 -1.382 -3.598 0.208 0.329 CE LYS 8 LYS NZ NZ N 1 1 N N N 37.176 36.546 -0.539 -4.761 -0.400 -0.332 NZ LYS 9 LYS OXT OXT O 0 1 N Y N 38.961 37.678 -5.886 3.050 -1.476 0.446 OXT LYS 10 LYS H H H 0 1 N N N 37.933 41.152 -3.399 1.489 1.891 -0.804 H LYS 11 LYS H2 HN2 H 0 1 N Y N 36.812 39.900 -3.498 0.521 2.162 0.464 H2 LYS 12 LYS HA HA H 0 1 N N N 39.352 40.037 -4.979 1.322 0.200 1.560 HA LYS 13 LYS HB2 1HB H 0 1 N N N 40.262 38.326 -3.460 0.210 -0.047 -1.270 HB2 LYS 14 LYS HB3 2HB H 0 1 N N N 39.882 39.750 -2.596 0.211 -1.359 -0.068 HB3 LYS 15 LYS HG2 1HG H 0 1 N N N 38.317 38.670 -1.238 -1.128 0.050 1.471 HG2 LYS 16 LYS HG3 2HG H 0 1 N N N 37.474 38.007 -2.546 -1.130 1.363 0.269 HG3 LYS 17 LYS HD2 1HD H 0 1 N N N 39.701 36.351 -2.795 -2.287 -0.120 -1.348 HD2 LYS 18 LYS HD3 2HD H 0 1 N N N 40.034 36.831 -1.210 -2.285 -1.432 -0.145 HD3 LYS 19 LYS HE2 1HE H 0 1 N N N 37.593 35.194 -2.194 -3.625 -0.023 1.394 HE2 LYS 20 LYS HE3 2HE H 0 1 N N N 38.544 34.882 -0.854 -3.626 1.289 0.192 HE3 LYS 21 LYS HZ1 1HZ H 0 1 N N N 36.474 35.891 -0.193 -4.736 -0.185 -1.318 HZ1 LYS 22 LYS HZ2 2HZ H 0 1 N N N 37.644 37.064 0.203 -4.735 -1.400 -0.205 HZ2 LYS 23 LYS HZ3 3HZ H 0 1 N N N 36.774 37.350 -1.021 -5.609 -0.031 0.071 HZ3 LYS 24 LYS HXT HXT H 0 1 N Y N 38.628 36.963 -6.415 3.861 -1.886 0.115 HXT LYS 25 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal LYS N CA SING N N 1 LYS N H SING N N 2 LYS N H2 SING N N 3 LYS CA C SING N N 4 LYS CA CB SING N N 5 LYS CA HA SING N N 6 LYS C O DOUB N N 7 LYS C OXT SING N N 8 LYS CB CG SING N N 9 LYS CB HB2 SING N N 10 LYS CB HB3 SING N N 11 LYS CG CD SING N N 12 LYS CG HG2 SING N N 13 LYS CG HG3 SING N N 14 LYS CD CE SING N N 15 LYS CD HD2 SING N N 16 LYS CD HD3 SING N N 17 LYS CE NZ SING N N 18 LYS CE HE2 SING N N 19 LYS CE HE3 SING N N 20 LYS NZ HZ1 SING N N 21 LYS NZ HZ2 SING N N 22 LYS NZ HZ3 SING N N 23 LYS OXT HXT SING N N 24 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor LYS SMILES ACDLabs 10.04 "O=C(O)C(N)CCCC[NH3+]" LYS SMILES_CANONICAL CACTVS 3.341 "N[C@@H](CCCC[NH3+])C(O)=O" LYS SMILES CACTVS 3.341 "N[CH](CCCC[NH3+])C(O)=O" LYS SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C(CC[NH3+])C[C@@H](C(=O)O)N" LYS SMILES "OpenEye OEToolkits" 1.5.0 "C(CC[NH3+])CC(C(=O)O)N" LYS InChI InChI 1.03 "InChI=1S/C6H14N2O2/c7-4-2-1-3-5(8)6(9)10/h5H,1-4,7-8H2,(H,9,10)/p+1/t5-/m0/s1" LYS InChIKey InChI 1.03 KDXKERNSBIXSRK-YFKPBYRVSA-O # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier LYS "SYSTEMATIC NAME" ACDLabs 10.04 6-ammonio-L-norleucine LYS "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "[(5S)-5-amino-6-hydroxy-6-oxo-hexyl]azanium" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site LYS "Create component" 1999-07-08 RCSB LYS "Modify descriptor" 2011-06-04 RCSB # data_MET # _chem_comp.id MET _chem_comp.name METHIONINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C5 H11 N O2 S" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 149.211 _chem_comp.one_letter_code M _chem_comp.three_letter_code MET _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal MET N N N 0 1 N N N 16.161 15.756 51.903 -1.816 0.142 -1.166 N MET 1 MET CA CA C 0 1 N N S 15.084 16.739 51.596 -0.392 0.499 -1.214 CA MET 2 MET C C C 0 1 N N N 13.846 15.930 51.367 0.206 0.002 -2.504 C MET 3 MET O O O 0 1 N N N 12.795 16.510 51.424 -0.236 -0.989 -3.033 O MET 4 MET CB CB C 0 1 N N N 15.401 17.530 50.317 0.334 -0.145 -0.032 CB MET 5 MET CG CG C 0 1 N N N 16.183 18.846 50.502 -0.273 0.359 1.277 CG MET 6 MET SD SD S 0 1 N N N 17.852 18.653 51.063 0.589 -0.405 2.678 SD MET 7 MET CE CE C 0 1 N N N 18.614 17.814 49.556 -0.314 0.353 4.056 CE MET 8 MET OXT OXT O 0 1 N Y N 13.865 14.721 51.154 1.232 0.661 -3.066 OXT MET 9 MET H H H 0 1 N N N 17.004 16.307 52.059 -1.865 -0.864 -1.220 H MET 10 MET H2 HN2 H 0 1 N Y N 16.270 15.035 51.189 -2.149 0.399 -0.248 H2 MET 11 MET HA HA H 0 1 N N N 14.975 17.472 52.429 -0.287 1.582 -1.158 HA MET 12 MET HB2 1HB H 0 1 N N N 15.935 16.873 49.591 1.391 0.119 -0.068 HB2 MET 13 MET HB3 2HB H 0 1 N N N 14.459 17.728 49.754 0.229 -1.229 -0.088 HB3 MET 14 MET HG2 1HG H 0 1 N N N 16.160 19.442 49.560 -1.330 0.094 1.313 HG2 MET 15 MET HG3 2HG H 0 1 N N N 15.625 19.532 51.181 -0.168 1.442 1.333 HG3 MET 16 MET HE1 1HE H 0 1 N N N 19.664 17.692 49.909 0.090 -0.010 5.000 HE1 MET 17 MET HE2 2HE H 0 1 N N N 18.107 16.882 49.211 -0.207 1.436 4.008 HE2 MET 18 MET HE3 3HE H 0 1 N N N 18.487 18.349 48.586 -1.369 0.088 3.988 HE3 MET 19 MET HXT HXT H 0 1 N Y N 13.079 14.207 51.008 1.616 0.342 -3.894 HXT MET 20 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal MET N CA SING N N 1 MET N H SING N N 2 MET N H2 SING N N 3 MET CA C SING N N 4 MET CA CB SING N N 5 MET CA HA SING N N 6 MET C O DOUB N N 7 MET C OXT SING N N 8 MET CB CG SING N N 9 MET CB HB2 SING N N 10 MET CB HB3 SING N N 11 MET CG SD SING N N 12 MET CG HG2 SING N N 13 MET CG HG3 SING N N 14 MET SD CE SING N N 15 MET CE HE1 SING N N 16 MET CE HE2 SING N N 17 MET CE HE3 SING N N 18 MET OXT HXT SING N N 19 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor MET SMILES ACDLabs 10.04 "O=C(O)C(N)CCSC" MET SMILES_CANONICAL CACTVS 3.341 "CSCC[C@H](N)C(O)=O" MET SMILES CACTVS 3.341 "CSCC[CH](N)C(O)=O" MET SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "CSCC[C@@H](C(=O)O)N" MET SMILES "OpenEye OEToolkits" 1.5.0 "CSCCC(C(=O)O)N" MET InChI InChI 1.03 "InChI=1S/C5H11NO2S/c1-9-3-2-4(6)5(7)8/h4H,2-3,6H2,1H3,(H,7,8)/t4-/m0/s1" MET InChIKey InChI 1.03 FFEARJCKVFRZRR-BYPYZUCNSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier MET "SYSTEMATIC NAME" ACDLabs 10.04 L-methionine MET "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-2-amino-4-methylsulfanyl-butanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site MET "Create component" 1999-07-08 EBI MET "Modify descriptor" 2011-06-04 RCSB # data_PHE # _chem_comp.id PHE _chem_comp.name PHENYLALANINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C9 H11 N O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 165.189 _chem_comp.one_letter_code F _chem_comp.three_letter_code PHE _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal PHE N N N 0 1 N N N 3.260 22.302 6.000 1.317 0.962 1.014 N PHE 1 PHE CA CA C 0 1 N N S 4.252 21.272 5.710 -0.020 0.426 1.300 CA PHE 2 PHE C C C 0 1 N N N 5.559 21.899 5.229 -0.109 0.047 2.756 C PHE 3 PHE O O O 0 1 N N N 5.836 21.838 4.012 0.879 -0.317 3.346 O PHE 4 PHE CB CB C 0 1 N N N 3.708 20.298 4.656 -0.270 -0.809 0.434 CB PHE 5 PHE CG CG C 0 1 Y N N 4.596 19.106 4.406 -0.181 -0.430 -1.020 CG PHE 6 PHE CD1 CD1 C 0 1 Y N N 5.077 18.339 5.467 1.031 -0.498 -1.680 CD1 PHE 7 PHE CD2 CD2 C 0 1 Y N N 4.927 18.732 3.109 -1.314 -0.018 -1.698 CD2 PHE 8 PHE CE1 CE1 C 0 1 Y N N 5.874 17.219 5.237 1.112 -0.150 -3.015 CE1 PHE 9 PHE CE2 CE2 C 0 1 Y N N 5.718 17.618 2.867 -1.231 0.333 -3.032 CE2 PHE 10 PHE CZ CZ C 0 1 Y N N 6.193 16.860 3.932 -0.018 0.265 -3.691 CZ PHE 11 PHE OXT OXT O 0 1 N Y N 6.283 22.460 6.079 -1.286 0.113 3.396 OXT PHE 12 PHE H H H 0 1 N N N 2.387 21.883 6.321 1.975 0.230 1.235 H PHE 13 PHE H2 HN2 H 0 1 N Y N 3.111 22.918 5.201 1.365 1.104 0.017 H2 PHE 14 PHE HA HA H 0 1 N N N 4.460 20.708 6.649 -0.770 1.184 1.076 HA PHE 15 PHE HB2 1HB H 0 1 N N N 2.676 19.968 4.922 0.480 -1.568 0.659 HB2 PHE 16 PHE HB3 2HB H 0 1 N N N 3.493 20.833 3.701 -1.262 -1.207 0.646 HB3 PHE 17 PHE HD1 HD1 H 0 1 N N N 4.823 18.622 6.502 1.915 -0.824 -1.152 HD1 PHE 18 PHE HD2 HD2 H 0 1 N N N 4.556 19.328 2.258 -2.262 0.034 -1.183 HD2 PHE 19 PHE HE1 HE1 H 0 1 N N N 6.250 16.619 6.083 2.060 -0.203 -3.530 HE1 PHE 20 PHE HE2 HE2 H 0 1 N N N 5.968 17.335 1.830 -2.116 0.659 -3.560 HE2 PHE 21 PHE HZ HZ H 0 1 N N N 6.822 15.974 3.741 0.045 0.538 -4.734 HZ PHE 22 PHE HXT HXT H 0 1 N Y N 7.096 22.850 5.779 -1.343 -0.130 4.330 HXT PHE 23 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal PHE N CA SING N N 1 PHE N H SING N N 2 PHE N H2 SING N N 3 PHE CA C SING N N 4 PHE CA CB SING N N 5 PHE CA HA SING N N 6 PHE C O DOUB N N 7 PHE C OXT SING N N 8 PHE CB CG SING N N 9 PHE CB HB2 SING N N 10 PHE CB HB3 SING N N 11 PHE CG CD1 DOUB Y N 12 PHE CG CD2 SING Y N 13 PHE CD1 CE1 SING Y N 14 PHE CD1 HD1 SING N N 15 PHE CD2 CE2 DOUB Y N 16 PHE CD2 HD2 SING N N 17 PHE CE1 CZ DOUB Y N 18 PHE CE1 HE1 SING N N 19 PHE CE2 CZ SING Y N 20 PHE CE2 HE2 SING N N 21 PHE CZ HZ SING N N 22 PHE OXT HXT SING N N 23 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor PHE SMILES ACDLabs 10.04 "O=C(O)C(N)Cc1ccccc1" PHE SMILES_CANONICAL CACTVS 3.341 "N[C@@H](Cc1ccccc1)C(O)=O" PHE SMILES CACTVS 3.341 "N[CH](Cc1ccccc1)C(O)=O" PHE SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "c1ccc(cc1)C[C@@H](C(=O)O)N" PHE SMILES "OpenEye OEToolkits" 1.5.0 "c1ccc(cc1)CC(C(=O)O)N" PHE InChI InChI 1.03 "InChI=1S/C9H11NO2/c10-8(9(11)12)6-7-4-2-1-3-5-7/h1-5,8H,6,10H2,(H,11,12)/t8-/m0/s1" PHE InChIKey InChI 1.03 COLNVLDHVKWLRT-QMMMGPOBSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier PHE "SYSTEMATIC NAME" ACDLabs 10.04 L-phenylalanine PHE "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-2-amino-3-phenyl-propanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site PHE "Create component" 1999-07-08 EBI PHE "Modify descriptor" 2011-06-04 RCSB # data_PRO # _chem_comp.id PRO _chem_comp.name PROLINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C5 H9 N O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 115.130 _chem_comp.one_letter_code P _chem_comp.three_letter_code PRO _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal PRO N N N 0 1 N N N 39.165 37.768 82.966 -0.816 1.108 0.254 N PRO 1 PRO CA CA C 0 1 N N S 38.579 38.700 82.008 0.001 -0.107 0.509 CA PRO 2 PRO C C C 0 1 N N N 37.217 39.126 82.515 1.408 0.091 0.005 C PRO 3 PRO O O O 0 1 N N N 36.256 38.332 82.370 1.650 0.980 -0.777 O PRO 4 PRO CB CB C 0 1 N N N 38.491 37.874 80.720 -0.703 -1.227 -0.286 CB PRO 5 PRO CG CG C 0 1 N N N 38.311 36.445 81.200 -2.163 -0.753 -0.439 CG PRO 6 PRO CD CD C 0 1 N N N 38.958 36.358 82.579 -2.218 0.614 0.276 CD PRO 7 PRO OXT OXT O 0 1 N Y N 37.131 40.263 83.047 2.391 -0.721 0.424 OXT PRO 8 PRO H HT1 H 0 1 N Y N 40.152 37.928 82.959 -0.707 1.708 1.057 H PRO 9 PRO HA HA H 0 1 N N N 39.160 39.638 81.850 0.009 -0.343 1.573 HA PRO 10 PRO HB2 1HB H 0 1 N N N 37.703 38.219 80.010 -0.240 -1.345 -1.266 HB2 PRO 11 PRO HB3 2HB H 0 1 N N N 39.352 38.017 80.027 -0.666 -2.165 0.267 HB3 PRO 12 PRO HG2 1HG H 0 1 N N N 37.247 36.109 81.191 -2.416 -0.638 -1.493 HG2 PRO 13 PRO HG3 2HG H 0 1 N N N 38.703 35.687 80.482 -2.843 -1.458 0.040 HG3 PRO 14 PRO HD2 1HD H 0 1 N N N 38.378 35.759 83.320 -2.872 1.300 -0.263 HD2 PRO 15 PRO HD3 2HD H 0 1 N N N 39.880 35.732 82.614 -2.559 0.492 1.304 HD3 PRO 16 PRO HXT HXT H 0 1 N Y N 36.276 40.530 83.365 3.293 -0.594 0.101 HXT PRO 17 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal PRO N CA SING N N 1 PRO N CD SING N N 2 PRO N H SING N N 3 PRO CA C SING N N 4 PRO CA CB SING N N 5 PRO CA HA SING N N 6 PRO C O DOUB N N 7 PRO C OXT SING N N 8 PRO CB CG SING N N 9 PRO CB HB2 SING N N 10 PRO CB HB3 SING N N 11 PRO CG CD SING N N 12 PRO CG HG2 SING N N 13 PRO CG HG3 SING N N 14 PRO CD HD2 SING N N 15 PRO CD HD3 SING N N 16 PRO OXT HXT SING N N 17 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor PRO SMILES ACDLabs 10.04 "O=C(O)C1NCCC1" PRO SMILES_CANONICAL CACTVS 3.341 "OC(=O)[C@@H]1CCCN1" PRO SMILES CACTVS 3.341 "OC(=O)[CH]1CCCN1" PRO SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C1C[C@H](NC1)C(=O)O" PRO SMILES "OpenEye OEToolkits" 1.5.0 "C1CC(NC1)C(=O)O" PRO InChI InChI 1.03 "InChI=1S/C5H9NO2/c7-5(8)4-2-1-3-6-4/h4,6H,1-3H2,(H,7,8)/t4-/m0/s1" PRO InChIKey InChI 1.03 ONIBWKKTOPOVIA-BYPYZUCNSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier PRO "SYSTEMATIC NAME" ACDLabs 10.04 L-proline PRO "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-pyrrolidine-2-carboxylic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site PRO "Create component" 1999-07-08 RCSB PRO "Modify descriptor" 2011-06-04 RCSB # data_REA # _chem_comp.id REA _chem_comp.name "RETINOIC ACID" _chem_comp.type NON-POLYMER _chem_comp.pdbx_type HETAIN _chem_comp.formula "C20 H28 O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2016-10-18 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces 3KV _chem_comp.formula_weight 300.435 _chem_comp.one_letter_code ? _chem_comp.three_letter_code REA _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details Corina _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code 1CBS _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal REA C1 C1 C 0 1 N N N 21.972 29.831 16.739 -4.684 0.932 -0.497 C1 REA 1 REA C2 C2 C 0 1 N N N 20.921 30.524 15.841 -5.837 0.190 -1.176 C2 REA 2 REA C3 C3 C 0 1 N N N 20.245 29.635 14.848 -6.441 -0.798 -0.171 C3 REA 3 REA C4 C4 C 0 1 N N N 19.555 28.479 15.488 -5.418 -1.903 0.100 C4 REA 4 REA C5 C5 C 0 1 N N N 20.389 27.812 16.587 -4.082 -1.301 0.429 C5 REA 5 REA C6 C6 C 0 1 N N N 21.425 28.446 17.218 -3.756 -0.048 0.161 C6 REA 6 REA C7 C7 C 0 1 N N N 22.242 27.851 18.297 -2.457 0.396 0.516 C7 REA 7 REA C8 C8 C 0 1 N N N 21.868 26.977 19.240 -1.363 -0.229 0.007 C8 REA 8 REA C9 C9 C 0 1 N N N 22.705 26.434 20.286 -0.076 0.257 0.298 C9 REA 9 REA C10 C10 C 0 1 N N N 22.159 25.536 21.131 1.022 -0.370 -0.213 C10 REA 10 REA C11 C11 C 0 1 N N N 22.875 24.924 22.234 2.306 0.115 0.077 C11 REA 11 REA C12 C12 C 0 1 N N N 22.237 24.026 22.990 3.405 -0.513 -0.435 C12 REA 12 REA C13 C13 C 0 1 N N N 22.856 23.377 24.125 4.689 -0.028 -0.144 C13 REA 13 REA C14 C14 C 0 1 N N N 22.135 22.473 24.834 5.787 -0.655 -0.656 C14 REA 14 REA C15 C15 C 0 1 N N N 22.563 21.710 26.016 7.077 -0.265 -0.244 C15 REA 15 REA C16 C16 C 0 1 N N N 22.238 30.737 17.948 -5.246 1.886 0.559 C16 REA 16 REA C17 C17 C 0 1 N N N 23.292 29.620 15.948 -3.911 1.737 -1.544 C17 REA 17 REA C18 C18 C 0 1 N N N 19.791 26.449 16.947 -3.056 -2.175 1.103 C18 REA 18 REA C19 C19 C 0 1 N N N 24.181 26.841 20.385 0.090 1.471 1.175 C19 REA 19 REA C20 C20 C 0 1 N N N 24.303 23.747 24.489 4.855 1.186 0.733 C20 REA 20 REA O1 O1 O 0 1 N N N 23.640 21.075 25.978 7.210 0.553 0.648 O1 REA 21 REA O2 O2 O 0 1 N N N 21.840 21.712 27.037 8.166 -0.798 -0.840 O2 REA 22 REA H21 H21 H 0 1 N N N 20.147 30.955 16.494 -6.598 0.905 -1.490 H21 REA 23 REA H22 H22 H 0 1 N N N 21.425 31.330 15.288 -5.462 -0.353 -2.044 H22 REA 24 REA H31 H31 H 0 1 N N N 19.501 30.227 14.295 -6.673 -0.278 0.759 H31 REA 25 REA H32 H32 H 0 1 N N N 21.001 29.250 14.148 -7.349 -1.234 -0.586 H32 REA 26 REA H41 H41 H 0 1 N N N 18.613 28.835 15.931 -5.756 -2.511 0.938 H41 REA 27 REA H42 H42 H 0 1 N N N 19.335 27.730 14.713 -5.322 -2.531 -0.786 H42 REA 28 REA H7 H7 H 0 1 N N N 23.276 28.162 18.329 -2.337 1.230 1.191 H7 REA 29 REA H8 H8 H 0 1 N N N 20.840 26.645 19.217 -1.482 -1.100 -0.622 H8 REA 30 REA H10 H10 H 0 1 N N N 21.127 25.256 20.977 0.903 -1.241 -0.842 H10 REA 31 REA H11 H11 H 0 1 N N N 23.902 25.189 22.440 2.425 0.985 0.706 H11 REA 32 REA H12 H12 H 0 1 N N N 21.216 23.774 22.743 3.286 -1.383 -1.063 H12 REA 33 REA H14 H14 H 0 1 N N N 21.127 22.292 24.490 5.667 -1.451 -1.376 H14 REA 34 REA H161 H161 H 0 0 N N N 22.984 30.265 18.604 -5.802 1.316 1.303 H161 REA 35 REA H162 H162 H 0 0 N N N 22.618 31.709 17.601 -4.426 2.415 1.044 H162 REA 36 REA H163 H163 H 0 0 N N N 21.302 30.887 18.506 -5.911 2.605 0.081 H163 REA 37 REA H171 H171 H 0 0 N N N 24.033 29.127 16.595 -4.598 2.394 -2.077 H171 REA 38 REA H172 H172 H 0 0 N N N 23.095 28.989 15.069 -3.146 2.335 -1.050 H172 REA 39 REA H173 H173 H 0 0 N N N 23.683 30.595 15.620 -3.439 1.054 -2.251 H173 REA 40 REA H181 H181 H 0 0 N N N 20.397 25.979 17.736 -3.448 -3.187 1.201 H181 REA 41 REA H182 H182 H 0 0 N N N 18.761 26.584 17.308 -2.145 -2.194 0.503 H182 REA 42 REA H183 H183 H 0 0 N N N 19.786 25.804 16.056 -2.831 -1.775 2.092 H183 REA 43 REA H191 H191 H 0 0 N N N 24.647 26.327 21.238 0.171 1.159 2.216 H191 REA 44 REA H192 H192 H 0 0 N N N 24.702 26.559 19.458 0.993 2.008 0.885 H192 REA 45 REA H193 H193 H 0 0 N N N 24.252 27.929 20.529 -0.774 2.125 1.058 H193 REA 46 REA H201 H201 H 0 0 N N N 24.620 23.168 25.369 5.026 0.871 1.762 H201 REA 47 REA H202 H202 H 0 0 N N N 24.965 23.516 23.641 5.707 1.771 0.386 H202 REA 48 REA H203 H203 H 0 0 N N N 24.360 24.822 24.717 3.952 1.795 0.685 H203 REA 49 REA HO2 HO2 H 0 1 N N N 22.244 21.180 27.713 9.006 -0.469 -0.490 HO2 REA 50 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal REA C1 C2 SING N N 1 REA C1 C6 SING N N 2 REA C1 C16 SING N N 3 REA C1 C17 SING N N 4 REA C2 C3 SING N N 5 REA C2 H21 SING N N 6 REA C2 H22 SING N N 7 REA C3 C4 SING N N 8 REA C3 H31 SING N N 9 REA C3 H32 SING N N 10 REA C4 C5 SING N N 11 REA C4 H41 SING N N 12 REA C4 H42 SING N N 13 REA C5 C6 DOUB N N 14 REA C5 C18 SING N N 15 REA C6 C7 SING N N 16 REA C7 C8 DOUB N E 17 REA C7 H7 SING N N 18 REA C8 C9 SING N N 19 REA C8 H8 SING N N 20 REA C9 C10 DOUB N E 21 REA C9 C19 SING N N 22 REA C10 C11 SING N N 23 REA C10 H10 SING N N 24 REA C11 C12 DOUB N E 25 REA C11 H11 SING N N 26 REA C12 C13 SING N N 27 REA C12 H12 SING N N 28 REA C13 C14 DOUB N E 29 REA C13 C20 SING N N 30 REA C14 C15 SING N N 31 REA C14 H14 SING N N 32 REA C15 O1 DOUB N N 33 REA C15 O2 SING N N 34 REA C16 H161 SING N N 35 REA C16 H162 SING N N 36 REA C16 H163 SING N N 37 REA C17 H171 SING N N 38 REA C17 H172 SING N N 39 REA C17 H173 SING N N 40 REA C18 H181 SING N N 41 REA C18 H182 SING N N 42 REA C18 H183 SING N N 43 REA C19 H191 SING N N 44 REA C19 H192 SING N N 45 REA C19 H193 SING N N 46 REA C20 H201 SING N N 47 REA C20 H202 SING N N 48 REA C20 H203 SING N N 49 REA O2 HO2 SING N N 50 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor REA SMILES ACDLabs 12.01 "C1(CCCC(=C1\C=C\C(=C\C=C\C(=C\C(=O)O)C)C)C)(C)C" REA InChI InChI 1.03 "InChI=1S/C20H28O2/c1-15(8-6-9-16(2)14-19(21)22)11-12-18-17(3)10-7-13-20(18,4)5/h6,8-9,11-12,14H,7,10,13H2,1-5H3,(H,21,22)/b9-6+,12-11+,15-8+,16-14+" REA InChIKey InChI 1.03 SHGAZHPCJJPHSC-YCNIQYBTSA-N REA SMILES_CANONICAL CACTVS 3.385 "CC1=C(\C=C\C(C)=C\C=C\C(C)=C\C(O)=O)C(C)(C)CCC1" REA SMILES CACTVS 3.385 "CC1=C(C=CC(C)=CC=CC(C)=CC(O)=O)C(C)(C)CCC1" REA SMILES_CANONICAL "OpenEye OEToolkits" 1.7.6 "CC1=C(C(CCC1)(C)C)/C=C/C(=C/C=C/C(=C/C(=O)O)/C)/C" REA SMILES "OpenEye OEToolkits" 1.7.6 "CC1=C(C(CCC1)(C)C)C=CC(=CC=CC(=CC(=O)O)C)C" # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier REA "SYSTEMATIC NAME" ACDLabs 12.01 "retinoic acid" REA "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.7.6 "(2E,4E,6E,8E)-3,7-dimethyl-9-(2,6,6-trimethylcyclohexen-1-yl)nona-2,4,6,8-tetraenoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site REA "Create component" 1999-07-08 RCSB REA "Modify descriptor" 2011-06-04 RCSB REA "Other modification" 2016-10-18 RCSB # data_SER # _chem_comp.id SER _chem_comp.name SERINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C3 H7 N O3" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces SEG _chem_comp.formula_weight 105.093 _chem_comp.one_letter_code S _chem_comp.three_letter_code SER _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal SER N N N 0 1 N N N 88.198 -7.658 -9.979 1.525 0.493 -0.608 N SER 1 SER CA CA C 0 1 N N S 87.782 -7.276 -11.358 0.100 0.469 -0.252 CA SER 2 SER C C C 0 1 N N N 88.571 -6.062 -11.818 -0.053 0.004 1.173 C SER 3 SER O O O 0 1 N N N 89.008 -5.296 -10.944 0.751 -0.760 1.649 O SER 4 SER CB CB C 0 1 N N N 86.286 -6.966 -11.391 -0.642 -0.489 -1.184 CB SER 5 SER OG OG O 0 1 N N N 85.543 -8.096 -10.989 -0.496 -0.049 -2.535 OG SER 6 SER OXT OXT O 0 1 N Y N 88.737 -5.884 -13.035 -1.084 0.440 1.913 OXT SER 7 SER H H H 0 1 N N N 87.668 -8.473 -9.670 1.867 -0.449 -0.499 H SER 8 SER H2 HN2 H 0 1 N Y N 88.118 -6.879 -9.325 1.574 0.707 -1.593 H2 SER 9 SER HA HA H 0 1 N N N 87.988 -8.129 -12.045 -0.316 1.471 -0.354 HA SER 10 SER HB2 1HB H 0 1 N N N 86.034 -6.065 -10.783 -0.225 -1.491 -1.081 HB2 SER 11 SER HB3 2HB H 0 1 N N N 85.961 -6.588 -12.388 -1.699 -0.507 -0.920 HB3 SER 12 SER HG HG H 0 1 N N N 84.613 -7.903 -11.009 -0.978 -0.679 -3.088 HG SER 13 SER HXT HXT H 0 1 N Y N 89.230 -5.124 -13.322 -1.183 0.142 2.828 HXT SER 14 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal SER N CA SING N N 1 SER N H SING N N 2 SER N H2 SING N N 3 SER CA C SING N N 4 SER CA CB SING N N 5 SER CA HA SING N N 6 SER C O DOUB N N 7 SER C OXT SING N N 8 SER CB OG SING N N 9 SER CB HB2 SING N N 10 SER CB HB3 SING N N 11 SER OG HG SING N N 12 SER OXT HXT SING N N 13 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor SER SMILES ACDLabs 10.04 "O=C(O)C(N)CO" SER SMILES_CANONICAL CACTVS 3.341 "N[C@@H](CO)C(O)=O" SER SMILES CACTVS 3.341 "N[CH](CO)C(O)=O" SER SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C([C@@H](C(=O)O)N)O" SER SMILES "OpenEye OEToolkits" 1.5.0 "C(C(C(=O)O)N)O" SER InChI InChI 1.03 "InChI=1S/C3H7NO3/c4-2(1-5)3(6)7/h2,5H,1,4H2,(H,6,7)/t2-/m0/s1" SER InChIKey InChI 1.03 MTCFGRXMJLQNBG-REOHCLBHSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier SER "SYSTEMATIC NAME" ACDLabs 10.04 L-serine SER "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-2-amino-3-hydroxy-propanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site SER "Create component" 1999-07-08 RCSB SER "Modify descriptor" 2011-06-04 RCSB # data_THR # _chem_comp.id THR _chem_comp.name THREONINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C4 H9 N O3" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 119.119 _chem_comp.one_letter_code T _chem_comp.three_letter_code THR _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal THR N N N 0 1 N N N 36.241 32.034 31.861 1.543 -0.702 0.430 N THR 1 THR CA CA C 0 1 N N S 35.010 31.223 31.876 0.122 -0.706 0.056 CA THR 2 THR C C C 0 1 N N N 35.213 30.209 30.769 -0.038 -0.090 -1.309 C THR 3 THR O O O 0 1 N N N 35.564 30.621 29.635 0.732 0.761 -1.683 O THR 4 THR CB CB C 0 1 N N R 33.755 32.073 31.570 -0.675 0.104 1.079 CB THR 5 THR OG1 OG1 O 0 1 N N N 33.730 33.235 32.412 -0.193 1.448 1.103 OG1 THR 6 THR CG2 CG2 C 0 1 N N N 32.482 31.262 31.863 -0.511 -0.521 2.466 CG2 THR 7 THR OXT OXT O 0 1 N Y N 35.042 29.014 31.057 -1.039 -0.488 -2.110 OXT THR 8 THR H H H 0 1 N N N 36.104 32.716 32.606 1.839 0.261 0.434 H THR 9 THR H2 HN2 H 0 1 N Y N 36.457 32.445 30.953 1.593 -1.025 1.385 H2 THR 10 THR HA HA H 0 1 N N N 34.842 30.763 32.878 -0.245 -1.732 0.038 HA THR 11 THR HB HB H 0 1 N N N 33.792 32.367 30.495 -1.729 0.101 0.802 HB THR 12 THR HG1 HG1 H 0 1 N N N 32.959 33.757 32.224 0.740 1.406 1.352 HG1 THR 13 THR HG21 1HG2 H 0 0 N N N 31.577 31.874 31.642 -1.080 0.056 3.194 HG21 THR 14 THR HG22 2HG2 H 0 0 N N N 32.471 30.290 31.315 -0.879 -1.547 2.448 HG22 THR 15 THR HG23 3HG2 H 0 0 N N N 32.471 30.863 32.904 0.542 -0.518 2.743 HG23 THR 16 THR HXT HXT H 0 1 N Y N 35.169 28.378 30.362 -1.143 -0.092 -2.986 HXT THR 17 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal THR N CA SING N N 1 THR N H SING N N 2 THR N H2 SING N N 3 THR CA C SING N N 4 THR CA CB SING N N 5 THR CA HA SING N N 6 THR C O DOUB N N 7 THR C OXT SING N N 8 THR CB OG1 SING N N 9 THR CB CG2 SING N N 10 THR CB HB SING N N 11 THR OG1 HG1 SING N N 12 THR CG2 HG21 SING N N 13 THR CG2 HG22 SING N N 14 THR CG2 HG23 SING N N 15 THR OXT HXT SING N N 16 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor THR SMILES ACDLabs 10.04 "O=C(O)C(N)C(O)C" THR SMILES_CANONICAL CACTVS 3.341 "C[C@@H](O)[C@H](N)C(O)=O" THR SMILES CACTVS 3.341 "C[CH](O)[CH](N)C(O)=O" THR SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "C[C@H]([C@@H](C(=O)O)N)O" THR SMILES "OpenEye OEToolkits" 1.5.0 "CC(C(C(=O)O)N)O" THR InChI InChI 1.03 "InChI=1S/C4H9NO3/c1-2(6)3(5)4(7)8/h2-3,6H,5H2,1H3,(H,7,8)/t2-,3+/m1/s1" THR InChIKey InChI 1.03 AYFVYJQAPQTCCC-GBXIJSLDSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier THR "SYSTEMATIC NAME" ACDLabs 10.04 L-threonine THR "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S,3R)-2-amino-3-hydroxy-butanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site THR "Create component" 1999-07-08 EBI THR "Modify descriptor" 2011-06-04 RCSB # data_TRP # _chem_comp.id TRP _chem_comp.name TRYPTOPHAN _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C11 H12 N2 O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces LTR _chem_comp.formula_weight 204.225 _chem_comp.one_letter_code W _chem_comp.three_letter_code TRP _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal TRP N N N 0 1 N N N 74.708 60.512 32.843 1.278 1.121 2.059 N TRP 1 TRP CA CA C 0 1 N N S 74.400 61.735 32.114 -0.008 0.417 1.970 CA TRP 2 TRP C C C 0 1 N N N 73.588 61.411 30.840 -0.490 0.076 3.357 C TRP 3 TRP O O O 0 1 N N N 72.939 62.292 30.277 0.308 -0.130 4.240 O TRP 4 TRP CB CB C 0 1 N N N 75.684 62.473 31.706 0.168 -0.868 1.161 CB TRP 5 TRP CG CG C 0 1 Y N N 76.675 62.727 32.832 0.650 -0.526 -0.225 CG TRP 6 TRP CD1 CD1 C 0 1 Y N N 77.753 61.964 33.157 1.928 -0.418 -0.622 CD1 TRP 7 TRP CD2 CD2 C 0 1 Y N N 76.646 63.805 33.777 -0.186 -0.256 -1.396 CD2 TRP 8 TRP NE1 NE1 N 0 1 Y N N 78.403 62.494 34.247 1.978 -0.095 -1.951 NE1 TRP 9 TRP CE2 CE2 C 0 1 Y N N 77.741 63.625 34.650 0.701 0.014 -2.454 CE2 TRP 10 TRP CE3 CE3 C 0 1 Y N N 75.796 64.902 33.974 -1.564 -0.210 -1.615 CE3 TRP 11 TRP CZ2 CZ2 C 0 1 Y N N 78.014 64.499 35.709 0.190 0.314 -3.712 CZ2 TRP 12 TRP CZ3 CZ3 C 0 1 Y N N 76.065 65.776 35.031 -2.044 0.086 -2.859 CZ3 TRP 13 TRP CH2 CH2 C 0 1 Y N N 77.168 65.565 35.884 -1.173 0.348 -3.907 CH2 TRP 14 TRP OXT OXT O 0 1 N Y N 73.495 60.470 30.438 -1.806 0.001 3.610 OXT TRP 15 TRP H H H 0 1 N N N 75.244 60.725 33.684 1.921 0.493 2.518 H TRP 16 TRP H2 HN2 H 0 1 N Y N 75.182 59.827 32.253 1.611 1.237 1.113 H2 TRP 17 TRP HA HA H 0 1 N N N 73.801 62.387 32.790 -0.740 1.058 1.479 HA TRP 18 TRP HB2 1HB H 0 1 N N N 76.185 61.933 30.869 0.900 -1.509 1.652 HB2 TRP 19 TRP HB3 2HB H 0 1 N N N 75.429 63.431 31.197 -0.786 -1.390 1.095 HB3 TRP 20 TRP HD1 HD1 H 0 1 N N N 78.055 61.051 32.616 2.789 -0.564 0.012 HD1 TRP 21 TRP HE1 HE1 H 0 1 N N N 79.240 62.110 34.685 2.791 0.036 -2.462 HE1 TRP 22 TRP HE3 HE3 H 0 1 N N N 74.932 65.074 33.310 -2.248 -0.413 -0.804 HE3 TRP 23 TRP HZ2 HZ2 H 0 1 N N N 78.871 64.351 36.386 0.860 0.521 -4.534 HZ2 TRP 24 TRP HZ3 HZ3 H 0 1 N N N 75.400 66.641 35.193 -3.110 0.116 -3.029 HZ3 TRP 25 TRP HH2 HH2 H 0 1 N N N 77.376 66.257 36.716 -1.567 0.582 -4.885 HH2 TRP 26 TRP HXT HXT H 0 1 N Y N 72.995 60.270 29.654 -2.115 -0.217 4.500 HXT TRP 27 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal TRP N CA SING N N 1 TRP N H SING N N 2 TRP N H2 SING N N 3 TRP CA C SING N N 4 TRP CA CB SING N N 5 TRP CA HA SING N N 6 TRP C O DOUB N N 7 TRP C OXT SING N N 8 TRP CB CG SING N N 9 TRP CB HB2 SING N N 10 TRP CB HB3 SING N N 11 TRP CG CD1 DOUB Y N 12 TRP CG CD2 SING Y N 13 TRP CD1 NE1 SING Y N 14 TRP CD1 HD1 SING N N 15 TRP CD2 CE2 DOUB Y N 16 TRP CD2 CE3 SING Y N 17 TRP NE1 CE2 SING Y N 18 TRP NE1 HE1 SING N N 19 TRP CE2 CZ2 SING Y N 20 TRP CE3 CZ3 DOUB Y N 21 TRP CE3 HE3 SING N N 22 TRP CZ2 CH2 DOUB Y N 23 TRP CZ2 HZ2 SING N N 24 TRP CZ3 CH2 SING Y N 25 TRP CZ3 HZ3 SING N N 26 TRP CH2 HH2 SING N N 27 TRP OXT HXT SING N N 28 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor TRP SMILES ACDLabs 10.04 "O=C(O)C(N)Cc2c1ccccc1nc2" TRP SMILES_CANONICAL CACTVS 3.341 "N[C@@H](Cc1c[nH]c2ccccc12)C(O)=O" TRP SMILES CACTVS 3.341 "N[CH](Cc1c[nH]c2ccccc12)C(O)=O" TRP SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "c1ccc2c(c1)c(c[nH]2)C[C@@H](C(=O)O)N" TRP SMILES "OpenEye OEToolkits" 1.5.0 "c1ccc2c(c1)c(c[nH]2)CC(C(=O)O)N" TRP InChI InChI 1.03 "InChI=1S/C11H12N2O2/c12-9(11(14)15)5-7-6-13-10-4-2-1-3-8(7)10/h1-4,6,9,13H,5,12H2,(H,14,15)/t9-/m0/s1" TRP InChIKey InChI 1.03 QIVBCDIJIAJPQS-VIFPVBQESA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier TRP "SYSTEMATIC NAME" ACDLabs 10.04 L-tryptophan TRP "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-2-amino-3-(1H-indol-3-yl)propanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site TRP "Create component" 1999-07-08 EBI TRP "Modify descriptor" 2011-06-04 RCSB # data_TYR # _chem_comp.id TYR _chem_comp.name TYROSINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C9 H11 N O3" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 181.189 _chem_comp.one_letter_code Y _chem_comp.three_letter_code TYR _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site EBI # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal TYR N N N 0 1 N N N 5.005 5.256 15.563 1.320 0.952 1.428 N TYR 1 TYR CA CA C 0 1 N N S 5.326 6.328 16.507 -0.018 0.429 1.734 CA TYR 2 TYR C C C 0 1 N N N 4.742 7.680 16.116 -0.103 0.094 3.201 C TYR 3 TYR O O O 0 1 N N N 4.185 8.411 16.947 0.886 -0.254 3.799 O TYR 4 TYR CB CB C 0 1 N N N 6.836 6.389 16.756 -0.274 -0.831 0.907 CB TYR 5 TYR CG CG C 0 1 Y N N 7.377 5.438 17.795 -0.189 -0.496 -0.559 CG TYR 6 TYR CD1 CD1 C 0 1 Y N N 6.826 5.370 19.075 1.022 -0.589 -1.219 CD1 TYR 7 TYR CD2 CD2 C 0 1 Y N N 8.493 4.624 17.565 -1.324 -0.102 -1.244 CD2 TYR 8 TYR CE1 CE1 C 0 1 Y N N 7.308 4.536 20.061 1.103 -0.282 -2.563 CE1 TYR 9 TYR CE2 CE2 C 0 1 Y N N 9.029 3.816 18.552 -1.247 0.210 -2.587 CE2 TYR 10 TYR CZ CZ C 0 1 Y N N 8.439 3.756 19.805 -0.032 0.118 -3.252 CZ TYR 11 TYR OH OH O 0 1 N N N 8.954 2.936 20.781 0.044 0.420 -4.574 OH TYR 12 TYR OXT OXT O 0 1 N Y N 4.840 8.051 14.829 -1.279 0.184 3.842 OXT TYR 13 TYR H H H 0 1 N N N 5.621 4.925 15.064 1.977 0.225 1.669 H TYR 14 TYR H2 HN2 H 0 1 N Y N 5.288 5.511 14.617 1.365 1.063 0.426 H2 TYR 15 TYR HA HA H 0 1 N N N 4.913 6.081 17.361 -0.767 1.183 1.489 HA TYR 16 TYR HB2 1HB H 0 1 N N N 7.289 6.213 15.916 0.473 -1.585 1.152 HB2 TYR 17 TYR HB3 2HB H 0 1 N N N 7.063 7.294 17.023 -1.268 -1.219 1.134 HB3 TYR 18 TYR HD1 HD1 H 0 1 N N N 6.097 5.913 19.272 1.905 -0.902 -0.683 HD1 TYR 19 TYR HD2 HD2 H 0 1 N N N 8.887 4.627 16.723 -2.269 -0.031 -0.727 HD2 TYR 20 TYR HE1 HE1 H 0 1 N N N 6.886 4.493 20.888 2.049 -0.354 -3.078 HE1 TYR 21 TYR HE2 HE2 H 0 1 N N N 9.788 3.310 18.373 -2.132 0.523 -3.121 HE2 TYR 22 TYR HH HH H 0 1 N N N 8.500 3.001 21.460 -0.123 -0.399 -5.059 HH TYR 23 TYR HXT HXT H 0 1 N Y N 4.475 8.893 14.585 -1.333 -0.030 4.784 HXT TYR 24 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal TYR N CA SING N N 1 TYR N H SING N N 2 TYR N H2 SING N N 3 TYR CA C SING N N 4 TYR CA CB SING N N 5 TYR CA HA SING N N 6 TYR C O DOUB N N 7 TYR C OXT SING N N 8 TYR CB CG SING N N 9 TYR CB HB2 SING N N 10 TYR CB HB3 SING N N 11 TYR CG CD1 DOUB Y N 12 TYR CG CD2 SING Y N 13 TYR CD1 CE1 SING Y N 14 TYR CD1 HD1 SING N N 15 TYR CD2 CE2 DOUB Y N 16 TYR CD2 HD2 SING N N 17 TYR CE1 CZ DOUB Y N 18 TYR CE1 HE1 SING N N 19 TYR CE2 CZ SING Y N 20 TYR CE2 HE2 SING N N 21 TYR CZ OH SING N N 22 TYR OH HH SING N N 23 TYR OXT HXT SING N N 24 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor TYR SMILES ACDLabs 10.04 "O=C(O)C(N)Cc1ccc(O)cc1" TYR SMILES_CANONICAL CACTVS 3.341 "N[C@@H](Cc1ccc(O)cc1)C(O)=O" TYR SMILES CACTVS 3.341 "N[CH](Cc1ccc(O)cc1)C(O)=O" TYR SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "c1cc(ccc1C[C@@H](C(=O)O)N)O" TYR SMILES "OpenEye OEToolkits" 1.5.0 "c1cc(ccc1CC(C(=O)O)N)O" TYR InChI InChI 1.03 "InChI=1S/C9H11NO3/c10-8(9(12)13)5-6-1-3-7(11)4-2-6/h1-4,8,11H,5,10H2,(H,12,13)/t8-/m0/s1" TYR InChIKey InChI 1.03 OUYCCCASQSFEME-QMMMGPOBSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier TYR "SYSTEMATIC NAME" ACDLabs 10.04 L-tyrosine TYR "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-2-amino-3-(4-hydroxyphenyl)propanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site TYR "Create component" 1999-07-08 EBI TYR "Modify descriptor" 2011-06-04 RCSB # data_VAL # _chem_comp.id VAL _chem_comp.name VALINE _chem_comp.type "L-PEPTIDE LINKING" _chem_comp.pdbx_type ATOMP _chem_comp.formula "C5 H11 N O2" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces ? _chem_comp.formula_weight 117.146 _chem_comp.one_letter_code V _chem_comp.three_letter_code VAL _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code ? _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal VAL N N N 0 1 N N N 11.009 2.661 48.464 1.564 -0.642 0.454 N VAL 1 VAL CA CA C 0 1 N N S 10.415 3.985 48.550 0.145 -0.698 0.079 CA VAL 2 VAL C C C 0 1 N N N 10.002 4.429 49.975 -0.037 -0.093 -1.288 C VAL 3 VAL O O O 0 1 N N N 9.312 3.707 50.680 0.703 0.784 -1.664 O VAL 4 VAL CB CB C 0 1 N N N 9.230 4.107 47.566 -0.682 0.086 1.098 CB VAL 5 VAL CG1 CG1 C 0 1 N N N 8.585 5.457 47.708 -0.497 -0.528 2.487 CG1 VAL 6 VAL CG2 CG2 C 0 1 N N N 9.689 3.877 46.132 -0.218 1.543 1.119 CG2 VAL 7 VAL OXT OXT O 0 1 N Y N 10.377 5.639 50.362 -1.022 -0.529 -2.089 OXT VAL 8 VAL H H H 0 1 N N N 11.281 2.368 47.525 1.825 0.332 0.455 H VAL 9 VAL H2 HN2 H 0 1 N Y N 10.386 1.968 48.881 1.624 -0.959 1.410 H2 VAL 10 VAL HA HA H 0 1 N N N 11.226 4.692 48.259 -0.186 -1.736 0.064 HA VAL 11 VAL HB HB H 0 1 N N N 8.478 3.321 47.813 -1.736 0.044 0.820 HB VAL 12 VAL HG11 1HG1 H 0 0 N N N 7.729 5.545 46.997 -1.087 0.031 3.214 HG11 VAL 13 VAL HG12 2HG1 H 0 0 N N N 8.279 5.666 48.759 -0.828 -1.566 2.472 HG12 VAL 14 VAL HG13 3HG1 H 0 0 N N N 9.319 6.287 47.584 0.555 -0.486 2.765 HG13 VAL 15 VAL HG21 1HG2 H 0 0 N N N 8.833 3.965 45.421 0.835 1.585 1.397 HG21 VAL 16 VAL HG22 2HG2 H 0 0 N N N 10.527 4.557 45.853 -0.350 1.981 0.130 HG22 VAL 17 VAL HG23 3HG2 H 0 0 N N N 10.218 2.902 46.020 -0.808 2.103 1.845 HG23 VAL 18 VAL HXT HXT H 0 1 N Y N 10.123 5.911 51.236 -1.139 -0.140 -2.967 HXT VAL 19 # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal VAL N CA SING N N 1 VAL N H SING N N 2 VAL N H2 SING N N 3 VAL CA C SING N N 4 VAL CA CB SING N N 5 VAL CA HA SING N N 6 VAL C O DOUB N N 7 VAL C OXT SING N N 8 VAL CB CG1 SING N N 9 VAL CB CG2 SING N N 10 VAL CB HB SING N N 11 VAL CG1 HG11 SING N N 12 VAL CG1 HG12 SING N N 13 VAL CG1 HG13 SING N N 14 VAL CG2 HG21 SING N N 15 VAL CG2 HG22 SING N N 16 VAL CG2 HG23 SING N N 17 VAL OXT HXT SING N N 18 # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor VAL SMILES ACDLabs 10.04 "O=C(O)C(N)C(C)C" VAL SMILES_CANONICAL CACTVS 3.341 "CC(C)[C@H](N)C(O)=O" VAL SMILES CACTVS 3.341 "CC(C)[CH](N)C(O)=O" VAL SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 "CC(C)[C@@H](C(=O)O)N" VAL SMILES "OpenEye OEToolkits" 1.5.0 "CC(C)C(C(=O)O)N" VAL InChI InChI 1.03 "InChI=1S/C5H11NO2/c1-3(2)4(6)5(7)8/h3-4H,6H2,1-2H3,(H,7,8)/t4-/m0/s1" VAL InChIKey InChI 1.03 KZSNJWFQEVHDMF-BYPYZUCNSA-N # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier VAL "SYSTEMATIC NAME" ACDLabs 10.04 L-valine VAL "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 "(2S)-2-amino-3-methyl-butanoic acid" # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site VAL "Create component" 1999-07-08 RCSB VAL "Modify descriptor" 2011-06-04 RCSB # data_HOH # _chem_comp.id HOH _chem_comp.name WATER _chem_comp.type NON-POLYMER _chem_comp.pdbx_type HETAS _chem_comp.formula "H2 O" _chem_comp.mon_nstd_parent_comp_id ? _chem_comp.pdbx_synonyms ? _chem_comp.pdbx_formal_charge 0 _chem_comp.pdbx_initial_date 1999-07-08 _chem_comp.pdbx_modified_date 2011-06-04 _chem_comp.pdbx_ambiguous_flag N _chem_comp.pdbx_release_status REL _chem_comp.pdbx_replaced_by ? _chem_comp.pdbx_replaces MTO _chem_comp.formula_weight 18.015 _chem_comp.one_letter_code ? _chem_comp.three_letter_code HOH _chem_comp.pdbx_model_coordinates_details ? _chem_comp.pdbx_model_coordinates_missing_flag N _chem_comp.pdbx_ideal_coordinates_details ? _chem_comp.pdbx_ideal_coordinates_missing_flag N _chem_comp.pdbx_model_coordinates_db_code 1NHE _chem_comp.pdbx_subcomponent_list ? _chem_comp.pdbx_processing_site RCSB # # loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.alt_atom_id _chem_comp_atom.type_symbol _chem_comp_atom.charge _chem_comp_atom.pdbx_align _chem_comp_atom.pdbx_aromatic_flag _chem_comp_atom.pdbx_leaving_atom_flag _chem_comp_atom.pdbx_stereo_config _chem_comp_atom.model_Cartn_x _chem_comp_atom.model_Cartn_y _chem_comp_atom.model_Cartn_z _chem_comp_atom.pdbx_model_Cartn_x_ideal _chem_comp_atom.pdbx_model_Cartn_y_ideal _chem_comp_atom.pdbx_model_Cartn_z_ideal _chem_comp_atom.pdbx_component_atom_id _chem_comp_atom.pdbx_component_comp_id _chem_comp_atom.pdbx_ordinal HOH O O O 0 1 N N N -23.107 18.401 -21.626 -0.064 0.000 0.000 O HOH 1 HOH H1 1H H 0 1 N N N -22.157 18.401 -21.626 0.512 0.000 -0.776 H1 HOH 2 HOH H2 2H H 0 1 N N N -23.424 18.401 -20.730 0.512 0.000 0.776 H2 HOH 3 # # loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.value_order _chem_comp_bond.pdbx_aromatic_flag _chem_comp_bond.pdbx_stereo_config _chem_comp_bond.pdbx_ordinal HOH O H1 SING N N 1 HOH O H2 SING N N 2 # # loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor HOH SMILES ACDLabs 10.04 O HOH SMILES_CANONICAL CACTVS 3.341 O HOH SMILES CACTVS 3.341 O HOH SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 O HOH SMILES "OpenEye OEToolkits" 1.5.0 O HOH InChI InChI 1.03 InChI=1S/H2O/h1H2 HOH InChIKey InChI 1.03 XLYOFNOQVPJJNP-UHFFFAOYSA-N # # loop_ _pdbx_chem_comp_identifier.comp_id _pdbx_chem_comp_identifier.type _pdbx_chem_comp_identifier.program _pdbx_chem_comp_identifier.program_version _pdbx_chem_comp_identifier.identifier HOH "SYSTEMATIC NAME" ACDLabs 10.04 water HOH "SYSTEMATIC NAME" "OpenEye OEToolkits" 1.5.0 oxidane # # loop_ _pdbx_chem_comp_audit.comp_id _pdbx_chem_comp_audit.action_type _pdbx_chem_comp_audit.date _pdbx_chem_comp_audit.processing_site HOH "Create component" 1999-07-08 RCSB HOH "Modify descriptor" 2011-06-04 RCSB ## libpdb-redo-3.3.0/test/pdb-redo-unit-test.cpp0000644000175000017500000003202614773016616020667 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2020 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define CATCH_CONFIG_RUNNER #include #include #include "pdb-redo/AtomShape.hpp" #include "pdb-redo/ClipperWrapper.hpp" #include "pdb-redo/DistanceMap.hpp" #include "pdb-redo/MapMaker.hpp" #include "pdb-redo/Statistics.hpp" #include "pdb-redo/SkipList.hpp" #include #include #include #include #include #include namespace fs = std::filesystem; using namespace pdb_redo; // -------------------------------------------------------------------- // -------------------------------------------------------------------- std::filesystem::path gTestDir = std::filesystem::current_path(); int main(int argc, char *argv[]) { Catch::Session session; // There must be exactly one instance // Build a new parser on top of Catch2's using namespace Catch::Clara; auto cli = session.cli() // Get Catch2's command line parser | Opt(gTestDir, "data-dir") // bind variable to a new option, with a hint string ["-D"]["--data-dir"] // the option names it will respond to ("The directory containing the data files"); // description string for the help output // Now pass the new composite back to Catch2 so it uses that session.cli(cli); // Let Catch2 (using Clara) parse the command line int returnCode = session.applyCommandLine(argc, argv); if (returnCode != 0) // Indicates a command line error return returnCode; if (fs::exists(gTestDir / "minimal-components.cif")) cif::compound_factory::instance().push_dictionary(gTestDir / "minimal-components.cif"); return session.run(); } // -------------------------------------------------------------------- // skip list test TEST_CASE("skip_1") { const fs::path example(gTestDir / ".." / "examples" / "1cbs.cif.gz"); cif::file file(example.string()); cif::mm::structure structure(file); auto& chain = structure.polymers().front(); SkipList skiplist; int n = 10; for (auto& res: chain) { skiplist.emplace_back(res); if (--n == 0) break; } for (const auto fmt: { SkipListFormat::OLD, SkipListFormat::CIF }) { std::stringstream ss; writeSkipList(ss, skiplist, fmt); CHECK(skiplist.size() == 10); // std::cout << ss.str() << '\n'; SkipList list2 = readSkipList(ss); CHECK(list2.size() == skiplist.size()); if (list2.size() != skiplist.size()) continue; for (std::size_t i = 0; i < skiplist.size(); ++i) { CHECK(skiplist[i].auth_asym_id == list2[i].auth_asym_id); CHECK(skiplist[i].auth_seq_id == list2[i].auth_seq_id); CHECK(skiplist[i].pdbx_PDB_ins_code == list2[i].pdbx_PDB_ins_code); } } } // -------------------------------------------------------------------- // atom radii calculated with AtomShape and a minimizer from GSL struct TestRadius { std::string type; float radius; } kTestRadii[] = { { "N", 1.073270559310913086f }, { "C", 1.077472805976867676f }, { "C", 1.060930848121643066f }, { "O", 1.037933468818664551f }, { "C", 1.080411434173583984f }, { "C", 1.080696582794189453f }, { "C", 1.090956211090087891f }, { "N", 1.02884829044342041f }, { "C", 1.017064213752746582f }, { "C", 0.985809326171875f }, { "O", 0.9498787522315979004f }, { "C", 1.032562017440795898f }, { "C", 1.043723225593566895f }, { "O", 1.000524282455444336f }, { "N", 1.057830214500427246f }, { "N", 0.9573949575424194336f }, { "C", 0.9534692764282226562f }, { "C", 0.9520707130432128906f }, { "O", 0.9262598156929016113f }, { "C", 0.938775181770324707f }, { "C", 0.9474387764930725098f }, { "C", 0.9400410056114196777f }, { "C", 0.9585416316986083984f }, { "C", 0.9261589646339416504f }, { "C", 0.9467949271202087402f }, { "C", 0.935360252857208252f }, { "N", 0.930846095085144043f }, { "C", 0.9431300163269042969f }, { "C", 0.9361689090728759766f }, { "O", 0.9119053483009338379f }, { "C", 0.9605298042297363281f }, { "O", 0.9615512490272521973f }, { "N", 0.9203097224235534668f }, { "C", 0.9396781325340270996f }, { "C", 0.9424930214881896973f }, { "O", 0.9095469117164611816f }, { "N", 0.9243852496147155762f }, { "C", 0.9413107037544250488f }, { "C", 0.9356296658515930176f }, { "O", 0.9198570847511291504f }, { "C", 0.9559983015060424805f }, { "C", 0.9961333274841308594f }, { "O", 0.9828038811683654785f }, { "N", 1.007446646690368652f }, { "N", 0.9110313653945922852f }, { "C", 0.9231967926025390625f }, { "C", 0.9301134943962097168f }, { "O", 0.9059692621231079102f }, { "C", 0.917514503002166748f }, { "C", 0.9176003932952880859f } }; TEST_CASE("atom_shape_1") { const fs::path example(gTestDir / ".." / "examples" / "1cbs.cif.gz"); cif::file file(example.string()); cif::mm::structure structure(file); const float kResHi = 1.80009, kResLo = 7.99918; const std::size_t N = sizeof(kTestRadii) / sizeof(TestRadius); std::size_t i = 0; for (auto& atom: structure.atoms()) { if (i >= N) break; pdb_redo::AtomShape shape(atom, kResHi, kResLo, false); CHECK(cif::atom_type_traits(atom.get_type()).symbol() == kTestRadii[i].type); float radius = shape.radius(); float test = kTestRadii[i].radius; CHECK_THAT(radius, Catch::Matchers::WithinAbs(test, 0.001f)); ++i; } } // -------------------------------------------------------------------- cif::file operator""_cf(const char* text, std::size_t length) { struct membuf : public std::streambuf { membuf(char* text, std::size_t length) { this->setg(text, text, text + length); } } buffer(const_cast(text), length); std::istream is(&buffer); return cif::file(is); } // -------------------------------------------------------------------- TEST_CASE("map_maker_1") { pdb_redo::MapMaker mm; float samplingRate = 0.75; mm.loadMTZ(gTestDir / ".." / "examples" / "1cbs_map.mtz", samplingRate); CHECK_THAT(mm.resHigh(), Catch::Matchers::WithinAbs(1.8, 0.01)); CHECK_THAT(mm.resLow(), Catch::Matchers::WithinAbs(8.0, 0.01)); } TEST_CASE("map_maker_2") { const fs::path example(gTestDir / ".." / "examples" / "1cbs.cif.gz"); cif::file file(example.string()); cif::mm::structure structure(file); MapMaker mm; float samplingRate = 0.75; auto aniso = MapMaker::as_None; // if (vm.count("aniso-scaling")) // { // if (vm["aniso-scaling"].as() == "observed") // aniso = MapMaker::as_Observed; // else if (vm["aniso-scaling"].as() == "calculated") // aniso = MapMaker::as_Calculated; // } mm.calculate(gTestDir / ".." / "examples" / "1cbs_map.mtz", structure, false, aniso, samplingRate, false); CHECK_THAT(mm.resHigh(), Catch::Matchers::WithinAbs(1.8, 0.01)); CHECK_THAT(mm.resLow(), Catch::Matchers::WithinAbs(8.0, 0.01)); } // -------------------------------------------------------------------- // First residues from 1cbs struct TestResidue { std::string compID; std::string asymID; int seqID; double RSR, SRSR, RSCCS; int NGRID; double EDIAm, OPIA; }; TEST_CASE("stats_1") { cif::VERBOSE = 2; // read test data first (output from previous stats version) std::vector test; std::ifstream testFile(gTestDir / "1cbs-test.eds"); REQUIRE(testFile.is_open()); std::string line; std::getline(testFile, line); REQUIRE(line.substr(0, 7) == "RESIDUE"); while (std::getline(testFile, line)) { auto items = cif::split(line, "\t"); REQUIRE(items.size() == 7); auto id = cif::split(items[0], "_"); REQUIRE(id.size() == 3); test.push_back({ id[0], id[1], std::stoi(id[2]), std::stod(items[1]), std::stod(items[2]), std::stod(items[3]), std::stoi(items[4]), std::stod(items[5]), std::stod(items[6]) }); } const fs::path example(gTestDir / ".." / "examples" / "1cbs.cif.gz"); cif::file file(example.string()); cif::mm::structure structure(file); MapMaker mm; float samplingRate = 1.5; mm.loadMTZ(gTestDir / ".." / "examples" / "1cbs_map.mtz", samplingRate); pdb_redo::EDIAStatsCollector collector(mm, structure, false); auto r = collector.collect(); auto ti = test.begin(); for (auto& ri: r) { REQUIRE(ti != test.end()); auto t = *ti++; if (std::isnan(t.RSCCS)) continue; CHECK(ri.asymID == t.asymID); CHECK(ri.compID == t.compID); CHECK_THAT(std::abs(ri.RSR - t.RSR), Catch::Matchers::WithinAbs(0.01, 0.01)); CHECK_THAT(std::abs(ri.SRSR - t.SRSR), Catch::Matchers::WithinAbs(0.01, 0.01)); if (not (std::isnan(ri.RSCCS) and std::isnan(t.RSCCS))) CHECK_THAT(std::abs(ri.RSCCS - t.RSCCS), Catch::Matchers::WithinAbs(0.1, 0.1)); else CHECK(std::isnan(ri.RSCCS) == std::isnan(t.RSCCS)); if (not (std::isnan(ri.EDIAm) or std::isnan(t.EDIAm))) { CHECK_THAT(std::abs(ri.EDIAm - t.EDIAm), Catch::Matchers::WithinAbs(0.1, 0.1)); if (std::abs(ri.EDIAm - t.EDIAm) > 0.1) std::cerr << ri << '\n'; CHECK_THAT(std::abs(ri.OPIA - t.OPIA), Catch::Matchers::WithinAbs(0.1, 0.1)); } else { CHECK(std::isnan(ri.EDIAm) == std::isnan(t.EDIAm)); } CHECK(ri.ngrid == t.NGRID); } } // -------------------------------------------------------------------- // test stats on a file with an unkown residue, should give nan's for EDIA TEST_CASE("stats_2") { const fs::path example(gTestDir / ".." / "examples" / "1cbs.cif.gz"); cif::file file = cif::pdb::read(example.string()); CHECK(file.is_valid()); auto &db = file.front(); // Rename a compound to an unknown ID for (auto r: db["chem_comp"].find(cif::key("id") == "ALA")) { r["id"] = "U_K"; break; } for (auto r: db["pdbx_poly_seq_scheme"].find(cif::key("mon_id") == "ALA")) r["mon_id"] = "U_K"; file.save("/tmp/1cbs-test.cif"); // and load this into a structure (note, structure caches data from the file, so order is important) cif::mm::structure structure(file); MapMaker mm; float samplingRate = 0.75; mm.loadMTZ(gTestDir / ".." / "examples" / "1cbs_map.mtz", samplingRate); pdb_redo::EDIAStatsCollector collector(mm, structure, false); auto r = collector.collect(); for (auto& ri: r) { CHECK(ri.compID != "ALA"); if (ri.compID != "U_K") continue; CHECK(not std::isnan(ri.RSR)); CHECK(not std::isnan(ri.SRSR)); CHECK(not std::isnan(ri.RSCCS)); CHECK(std::isnan(ri.EDIAm)); CHECK(std::isnan(ri.OPIA)); } } // -------------------------------------------------------------------- TEST_CASE("bond_map_1") { const fs::path example(gTestDir / ".." / "examples" / "1cbs.cif.gz"); cif::file file = cif::pdb::read(example.string()); CHECK(file.is_valid()); auto &db = file.front(); auto &atom_site = db["atom_site"]; std::vector atom_ids; std::vector atom_locs; for (const auto &[id, x, y, z] : atom_site.rows("id", "cartn_x", "cartn_y", "cartn_z")) { atom_ids.emplace_back(id); atom_locs.emplace_back(x, y, z); } BondMap bm(db); using key_type = std::tuple; std::map bonded; for (std::size_t i = 0; i + 1 < atom_ids.size(); ++i) { auto a = atom_ids[i]; for (std::size_t j = i + 1; j < atom_ids.size(); ++j) { auto b = atom_ids[j]; bonded.emplace(std::make_tuple(a, b), bm(a, b)); } } cif::point c = atom_locs.front(); BondMap bm2(db, std::make_tuple(c, 6.0f)); for (std::size_t i = 0; i + 1 < atom_ids.size(); ++i) { auto a = atom_ids[i]; auto pa = atom_locs[i]; for (std::size_t j = i + 1; j < atom_ids.size(); ++j) { auto b = atom_ids[j]; auto pb = atom_locs[j]; if (distance(pa, c) < 6 and distance(pb, c) < 6) CHECK(bm2(a, b) == bonded[std::make_tuple(a, b)]); else // CHECK_THROW(bm2(a, b), std::out_of_range); CHECK(bm2(a, b) == false); } } }libpdb-redo-3.3.0/test/restr2ccd-test.cpp0000644000175000017500000000732014773016616020110 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2024 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define CATCH_CONFIG_RUNNER #include #include #include #include #include #include "pdb-redo/AtomShape.hpp" #include "pdb-redo/MapMaker.hpp" #include "pdb-redo/Statistics.hpp" #include "pdb-redo/DistanceMap.hpp" #include "pdb-redo/Minimizer.hpp" namespace fs = std::filesystem; // -------------------------------------------------------------------- std::filesystem::path gTestDir = std::filesystem::current_path(); int main(int argc, char *argv[]) { cif::VERBOSE = 1; Catch::Session session; // There must be exactly one instance // Build a new parser on top of Catch2's #if CATCH22 using namespace Catch::clara; #else // Build a new parser on top of Catch2's using namespace Catch::Clara; #endif auto cli = session.cli() // Get Catch2's command line parser | Opt(gTestDir, "data-dir") // bind variable to a new option, with a hint string ["-D"]["--data-dir"] // the option names it will respond to ("The directory containing the data files"); // description string for the help output // Now pass the new composite back to Catch2 so it uses that session.cli(cli); // Let Catch2 (using Clara) parse the command line int returnCode = session.applyCommandLine(argc, argv); if (returnCode != 0) // Indicates a command line error return returnCode; if (fs::exists(gTestDir / "minimal-components.cif")) cif::compound_factory::instance().push_dictionary(gTestDir / "minimal-components.cif"); return session.run(); } // -------------------------------------------------------------------- TEST_CASE("een") { auto &cf = pdb_redo::CompoundFactory::instance(); for (fs::directory_iterator i(gTestDir / "restr2ccd"); i != fs::directory_iterator(); ++i) { auto fn = i->path().filename().string(); if (not fn.ends_with(".cif")) continue; auto comp_id = i->path().filename().stem().string(); cf.pushDictionary(i->path()); auto compound = cf.create(comp_id); REQUIRE(compound != nullptr); CHECK(cif::iequals(compound->id(), comp_id)); auto ccompound = cif::compound_factory::instance().create(comp_id); REQUIRE(ccompound != nullptr); CHECK(ccompound->id() == comp_id); cf.popDictionary(); } }libpdb-redo-3.3.0/test/restr2ccd/0000755000175000017500000000000014773016616016425 5ustar maartenmaartenlibpdb-redo-3.3.0/test/restr2ccd/ALA.cif0000644000175000017500000001046414773016616017512 0ustar maartenmaartendata_comp_list loop_ _chem_comp.id _chem_comp.three_letter_code _chem_comp.name _chem_comp.group _chem_comp.number_atoms_all _chem_comp.number_atoms_nh _chem_comp.desc_level ALA ALA ALANINE peptide 13 6 . data_comp_ALA loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.type_symbol _chem_comp_atom.type_energy _chem_comp_atom.charge _chem_comp_atom.x _chem_comp_atom.y _chem_comp_atom.z ALA N N NT3 1 2.468 26.274 12.957 ALA CA C CH1 0 1.178 26.922 13.361 ALA C C C 0 1.439 28.343 13.878 ALA O O O 0 2.486 28.630 14.460 ALA CB C CH3 0 0.480 26.082 14.404 ALA OXT O OC -1 0.604 29.234 13.722 ALA H H H 0 2.921 25.868 13.764 ALA H2 H H 0 3.058 26.917 12.554 ALA H3 H H 0 2.282 25.582 12.318 ALA HA H H 0 0.598 26.983 12.566 ALA HB3 H H 0 1.017 26.056 15.214 ALA HB2 H H 0 0.361 25.178 14.067 ALA HB1 H H 0 -0.389 26.468 14.605 loop_ _chem_comp_tree.comp_id _chem_comp_tree.atom_id _chem_comp_tree.atom_back _chem_comp_tree.atom_forward _chem_comp_tree.connect_type ALA N n/a CA START ALA H N . . ALA H2 N . . ALA H3 N . . ALA CA N C . ALA HA CA . . ALA CB CA HB3 . ALA HB1 CB . . ALA HB2 CB . . ALA HB3 CB . . ALA C CA . END ALA O C . . ALA OXT C . . loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.type _chem_comp_bond.aromatic _chem_comp_bond.value_dist_nucleus _chem_comp_bond.value_dist_nucleus_esd _chem_comp_bond.value_dist _chem_comp_bond.value_dist_esd ALA N CA SINGLE n 1.459 0.020 1.459 0.020 ALA CA C SINGLE n 1.525 0.026 1.525 0.026 ALA CA CB SINGLE n 1.520 0.021 1.520 0.021 ALA C O DOUBLE n 1.229 0.019 1.229 0.019 ALA C OXT SINGLE n 1.229 0.019 1.229 0.019 ALA N H SINGLE n 1.036 0.0160 0.911 0.0200 ALA N H2 SINGLE n 1.036 0.0160 0.911 0.0200 ALA N H3 SINGLE n 1.036 0.0160 0.911 0.0200 ALA CA HA SINGLE n 1.089 0.0100 0.986 0.0200 ALA CB HB3 SINGLE n 1.089 0.0100 0.972 0.0152 ALA CB HB2 SINGLE n 1.089 0.0100 0.972 0.0152 ALA CB HB1 SINGLE n 1.089 0.0100 0.972 0.0152 loop_ _chem_comp_angle.comp_id _chem_comp_angle.atom_id_1 _chem_comp_angle.atom_id_2 _chem_comp_angle.atom_id_3 _chem_comp_angle.value_angle _chem_comp_angle.value_angle_esd ALA CA N H 109.643 1.50 ALA CA N H2 109.643 1.50 ALA CA N H3 109.643 1.50 ALA H N H2 109.028 2.41 ALA H N H3 109.028 2.41 ALA H2 N H3 109.028 2.41 ALA N CA C 111.000 2.700 ALA N CA CB 110.400 1.500 ALA N CA HA 108.529 1.50 ALA C CA CB 110.500 1.500 ALA C CA HA 108.541 1.50 ALA CB CA HA 108.878 1.50 ALA CA C O 120.100 2.100 ALA CA C OXT 120.100 2.100 ALA O C OXT 119.8 1.50 ALA CA CB HB3 109.546 1.50 ALA CA CB HB2 109.546 1.50 ALA CA CB HB1 109.546 1.50 ALA HB3 CB HB2 109.386 1.50 ALA HB3 CB HB1 109.386 1.50 ALA HB2 CB HB1 109.386 1.50 loop_ _chem_comp_tor.comp_id _chem_comp_tor.id _chem_comp_tor.atom_id_1 _chem_comp_tor.atom_id_2 _chem_comp_tor.atom_id_3 _chem_comp_tor.atom_id_4 _chem_comp_tor.value_angle _chem_comp_tor.value_angle_esd _chem_comp_tor.period ALA hh1 N CA CB HB3 60.000 10.0 3 ALA sp3_sp3_1 C CA N H 180.000 10.0 3 ALA sp2_sp3_1 O C CA N 0.000 10.0 6 loop_ _chem_comp_chir.comp_id _chem_comp_chir.id _chem_comp_chir.atom_id_centre _chem_comp_chir.atom_id_1 _chem_comp_chir.atom_id_2 _chem_comp_chir.atom_id_3 _chem_comp_chir.volume_sign ALA chir_1 CA N C CB positive loop_ _chem_comp_plane_atom.comp_id _chem_comp_plane_atom.plane_id _chem_comp_plane_atom.atom_id _chem_comp_plane_atom.dist_esd ALA plan-1 C 0.020 ALA plan-1 CA 0.020 ALA plan-1 O 0.020 ALA plan-1 OXT 0.020 loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor ALA SMILES ACDLabs 10.04 O=C(O)C(N)C ALA SMILES_CANONICAL CACTVS 3.341 C[C@H](N)C(O)=O ALA SMILES CACTVS 3.341 C[CH](N)C(O)=O ALA SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 C[C@@H](C(=O)O)N ALA SMILES "OpenEye OEToolkits" 1.5.0 CC(C(=O)O)N ALA InChI InChI 1.03 InChI=1S/C3H7NO2/c1-2(4)3(5)6/h2H,4H2,1H3,(H,5,6)/t2-/m0/s1 ALA InChIKey InChI 1.03 QNAYBMKLOCPYGJ-REOHCLBHSA-N loop_ _pdbx_chem_comp_description_generator.comp_id _pdbx_chem_comp_description_generator.program_name _pdbx_chem_comp_description_generator.program_version _pdbx_chem_comp_description_generator.descriptor ALA acedrg 243 "dictionary generator" ALA acedrg_database 11 "data source" ALA rdkit 2017.03.2 "Chemoinformatics tool" ALA refmac5 5.8.0238 "optimization tool" libpdb-redo-3.3.0/test/restr2ccd/U8U.cif0000644000175000017500000002644214773016616017541 0ustar maartenmaartendata_comp_list loop_ _chem_comp.id _chem_comp.three_letter_code _chem_comp.name _chem_comp.group _chem_comp.number_atoms_all _chem_comp.number_atoms_nh _chem_comp.desc_level U8U U8U "5-METHYLAMINOMETHYL-2-THIOURIDINE-5'-MONOPHOSPHATE" RNA 40 24 . data_comp_U8U loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.type_symbol _chem_comp_atom.type_energy _chem_comp_atom.charge _chem_comp_atom.x _chem_comp_atom.y _chem_comp_atom.z U8U N1 N NR6 0 0.456 2.604 0.086 U8U C2 C CR6 0 -0.243 3.482 0.893 U8U S2 S S1 0 -0.585 3.147 2.492 U8U N3 N NR16 0 -0.702 4.628 0.326 U8U C4 C CR6 0 -1.010 4.692 -1.034 U8U O4 O O 0 -1.713 5.625 -1.431 U8U C5 C CR6 0 -0.489 3.685 -1.852 U8U C6 C CR16 0 0.217 2.651 -1.267 U8U C C CH2 0 -0.704 3.683 -3.351 U8U N N NT1 0 -1.872 2.910 -3.775 U8U CA C CH3 0 -2.017 2.849 -5.229 U8U "C1'" C CH1 0 1.434 1.622 0.664 U8U "O2'" O OH1 0 0.295 0.217 2.288 U8U "C2'" C CH1 0 0.783 0.271 0.955 U8U "O3'" O OH1 0 2.734 -0.969 1.833 U8U "C3'" C CH1 0 1.909 -0.731 0.698 U8U "C4'" C CH1 0 2.694 -0.043 -0.428 U8U "O4'" O O2 0 2.469 1.381 -0.260 U8U "C5'" C CH2 0 2.312 -0.443 -1.832 U8U "O5'" O O2 0 3.116 0.299 -2.782 U8U P P P 0 2.851 0.085 -4.360 U8U OP1 O O 0 3.891 0.929 -5.073 U8U OP2 O OP -1 1.433 0.562 -4.609 U8U OP3 O OP -1 3.026 -1.401 -4.611 U8U HN3 H H 0 -0.808 5.342 0.817 U8U H6 H H 0 0.529 1.955 -1.816 U8U HC1 H H 0 0.092 3.310 -3.781 U8U HC2 H H 0 -0.805 4.606 -3.662 U8U HN1 H H 0 -1.779 2.078 -3.472 U8U HA1 H H 0 -2.746 2.241 -5.461 U8U HA2 H H 0 -1.187 2.524 -5.629 U8U HA3 H H 0 -2.216 3.740 -5.577 U8U "H1'" H H 0 1.825 1.991 1.490 U8U "HO2'" H H 0 -0.142 -0.503 2.395 U8U "H2'" H H 0 0.043 0.108 0.320 U8U "HO3'" H H 0 3.048 -0.233 2.117 U8U "H3'" H H 0 1.529 -1.586 0.368 U8U "H4'" H H 0 3.651 -0.223 -0.310 U8U "H5'" H H 0 1.353 -0.254 -1.982 U8U "H5''" H H 0 2.461 -1.413 -1.952 loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.type _chem_comp_bond.aromatic _chem_comp_bond.value_dist_nucleus _chem_comp_bond.value_dist_nucleus_esd _chem_comp_bond.value_dist _chem_comp_bond.value_dist_esd U8U N1 C2 SINGLE n 1.371 0.0118 1.371 0.0118 U8U N1 C6 SINGLE n 1.367 0.0104 1.367 0.0104 U8U N1 "C1'" SINGLE n 1.492 0.0124 1.492 0.0124 U8U C2 S2 DOUBLE n 1.663 0.0164 1.663 0.0164 U8U C2 N3 SINGLE n 1.356 0.0100 1.356 0.0100 U8U N3 C4 SINGLE n 1.390 0.0129 1.390 0.0129 U8U C4 O4 DOUBLE n 1.232 0.0120 1.232 0.0120 U8U C4 C5 SINGLE n 1.388 0.0157 1.388 0.0157 U8U C5 C6 DOUBLE n 1.379 0.0100 1.379 0.0100 U8U C5 C SINGLE n 1.512 0.0119 1.512 0.0119 U8U C N SINGLE n 1.463 0.0131 1.463 0.0131 U8U N CA SINGLE n 1.463 0.0141 1.463 0.0141 U8U "C1'" "C2'" SINGLE n 1.527 0.0119 1.527 0.0119 U8U "C1'" "O4'" SINGLE n 1.406 0.0103 1.406 0.0103 U8U "O2'" "C2'" SINGLE n 1.420 0.0122 1.420 0.0122 U8U "C2'" "C3'" SINGLE n 1.530 0.0134 1.530 0.0134 U8U "O3'" "C3'" SINGLE n 1.422 0.0100 1.422 0.0100 U8U "C3'" "C4'" SINGLE n 1.535 0.0100 1.535 0.0100 U8U "C4'" "O4'" SINGLE n 1.449 0.0100 1.449 0.0100 U8U "C4'" "C5'" SINGLE n 1.509 0.0100 1.509 0.0100 U8U "C5'" "O5'" SINGLE n 1.450 0.0166 1.450 0.0166 U8U "O5'" P SINGLE n 1.614 0.0178 1.614 0.0178 U8U P OP1 DOUBLE n 1.517 0.0192 1.517 0.0192 U8U P OP2 SINGLE n 1.517 0.0192 1.517 0.0192 U8U P OP3 SINGLE n 1.517 0.0192 1.517 0.0192 U8U N3 HN3 SINGLE n 1.016 0.0100 0.873 0.0200 U8U C6 H6 SINGLE n 1.082 0.0130 0.940 0.0112 U8U C HC1 SINGLE n 1.089 0.0100 0.979 0.0148 U8U C HC2 SINGLE n 1.089 0.0100 0.979 0.0148 U8U N HN1 SINGLE n 1.036 0.0160 0.890 0.0200 U8U CA HA1 SINGLE n 1.089 0.0100 0.977 0.0113 U8U CA HA2 SINGLE n 1.089 0.0100 0.977 0.0113 U8U CA HA3 SINGLE n 1.089 0.0100 0.977 0.0113 U8U "C1'" "H1'" SINGLE n 1.089 0.0100 0.986 0.0200 U8U "O2'" "HO2'" SINGLE n 0.970 0.0120 0.849 0.0200 U8U "C2'" "H2'" SINGLE n 1.089 0.0100 0.988 0.0200 U8U "O3'" "HO3'" SINGLE n 0.970 0.0120 0.849 0.0200 U8U "C3'" "H3'" SINGLE n 1.089 0.0100 0.992 0.0200 U8U "C4'" "H4'" SINGLE n 1.089 0.0100 0.981 0.0200 U8U "C5'" "H5'" SINGLE n 1.089 0.0100 0.989 0.0200 U8U "C5'" "H5''" SINGLE n 1.089 0.0100 0.989 0.0200 loop_ _chem_comp_angle.comp_id _chem_comp_angle.atom_id_1 _chem_comp_angle.atom_id_2 _chem_comp_angle.atom_id_3 _chem_comp_angle.value_angle _chem_comp_angle.value_angle_esd U8U C2 N1 C6 120.521 1.80 U8U C2 N1 "C1'" 118.374 3.00 U8U C6 N1 "C1'" 121.105 1.78 U8U N1 C2 S2 120.641 1.58 U8U N1 C2 N3 118.551 1.50 U8U S2 C2 N3 120.808 1.50 U8U C2 N3 C4 121.850 1.81 U8U C2 N3 HN3 119.601 1.52 U8U C4 N3 HN3 118.549 2.42 U8U N3 C4 O4 118.399 1.50 U8U N3 C4 C5 117.583 1.50 U8U O4 C4 C5 124.018 1.64 U8U C4 C5 C6 119.418 1.50 U8U C4 C5 C 120.689 1.80 U8U C6 C5 C 119.893 1.50 U8U N1 C6 C5 122.076 2.78 U8U N1 C6 H6 119.173 1.52 U8U C5 C6 H6 118.751 1.50 U8U C5 C N 113.751 2.91 U8U C5 C HC1 108.858 1.50 U8U C5 C HC2 108.858 1.50 U8U N C HC1 108.790 1.50 U8U N C HC2 108.790 1.50 U8U HC1 C HC2 107.826 1.50 U8U C N CA 112.615 2.70 U8U C N HN1 108.101 1.98 U8U CA N HN1 108.144 3.00 U8U N CA HA1 109.627 1.50 U8U N CA HA2 109.627 1.50 U8U N CA HA3 109.627 1.50 U8U HA1 CA HA2 109.279 1.79 U8U HA1 CA HA3 109.279 1.79 U8U HA2 CA HA3 109.279 1.79 U8U N1 "C1'" "C2'" 112.110 1.66 U8U N1 "C1'" "O4'" 108.278 1.50 U8U N1 "C1'" "H1'" 109.209 1.50 U8U "C2'" "C1'" "O4'" 106.204 2.50 U8U "C2'" "C1'" "H1'" 109.914 1.68 U8U "O4'" "C1'" "H1'" 109.395 1.50 U8U "C2'" "O2'" "HO2'" 109.104 3.00 U8U "C1'" "C2'" "O2'" 111.164 2.38 U8U "C1'" "C2'" "C3'" 104.443 2.26 U8U "C1'" "C2'" "H2'" 110.518 1.74 U8U "O2'" "C2'" "C3'" 112.463 2.73 U8U "O2'" "C2'" "H2'" 110.259 1.63 U8U "C3'" "C2'" "H2'" 110.255 2.04 U8U "C3'" "O3'" "HO3'" 108.744 3.00 U8U "C2'" "C3'" "O3'" 112.463 2.73 U8U "C2'" "C3'" "C4'" 102.352 1.50 U8U "C2'" "C3'" "H3'" 110.255 2.04 U8U "O3'" "C3'" "C4'" 111.281 2.46 U8U "O3'" "C3'" "H3'" 110.380 1.67 U8U "C4'" "C3'" "H3'" 110.452 2.54 U8U "C3'" "C4'" "O4'" 105.508 1.50 U8U "C3'" "C4'" "C5'" 116.008 1.52 U8U "C3'" "C4'" "H4'" 109.363 1.86 U8U "O4'" "C4'" "C5'" 109.123 1.50 U8U "O4'" "C4'" "H4'" 108.642 1.50 U8U "C5'" "C4'" "H4'" 108.268 1.50 U8U "C1'" "O4'" "C4'" 109.926 1.50 U8U "C4'" "C5'" "O5'" 109.342 1.50 U8U "C4'" "C5'" "H5'" 109.624 1.50 U8U "C4'" "C5'" "H5''" 109.624 1.50 U8U "O5'" "C5'" "H5'" 109.845 1.50 U8U "O5'" "C5'" "H5''" 109.845 1.50 U8U "H5'" "C5'" "H5''" 108.472 1.50 U8U "C5'" "O5'" P 118.783 1.50 U8U "O5'" P OP1 105.808 2.07 U8U "O5'" P OP2 105.808 2.07 U8U "O5'" P OP3 105.808 2.07 U8U OP1 P OP2 112.864 1.69 U8U OP1 P OP3 112.864 1.69 U8U OP2 P OP3 112.864 1.69 loop_ _chem_comp_tor.comp_id _chem_comp_tor.id _chem_comp_tor.atom_id_1 _chem_comp_tor.atom_id_2 _chem_comp_tor.atom_id_3 _chem_comp_tor.atom_id_4 _chem_comp_tor.value_angle _chem_comp_tor.value_angle_esd _chem_comp_tor.period U8U C2e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 U8U C2e-nyu0 "C4'" "O4'" "C1'" "C2" 340.700 6.300 1 U8U C2e-nyu1 "O4'" "C1'" "C2'" "C3'" 32.800 4.900 1 U8U C2e-nyu2 "C1'" "C2'" "C3'" "C4'" 326.9 3.600 1 U8U C2e-nyu3 "C2'" "C3'" "C4'" "O4'" 22.600 4.500 1 U8U C2e-nyu4 "C3'" "C4'" "O4'" "C1'" 357.700 6.100 1 U8U C3e-chi "O4'" "C1'" N1 C2 210.000 10.000 6 U8U C3e-nyu0 "C4'" "O4'" "C1'" "C2'" 2.8 6.100 1 U8U C3e-nyu1 "O4'" "C1'" "C2'" "C3'" 335.00 4.900 1 U8U C3e-nyu2 "C1'" "C2'" "C3'" "C4'" 35.9 2.800 1 U8U C3e-nyu3 "C2'" "C3'" "C4'" "O4'" 324.700 3.100 1 U8U C3e-nyu4 "C3'" "C4'" "O4'" "C1'" 20.500 5.100 1 U8U alpha "C5'" "O5'" P OP3 -60.000 10.00 3 U8U beta P "O5'" "C5'" "C4'" 180.000 10.00 3 U8U epsi "C4'" "C3'" "O3'" "HO3'" 180.000 10.00 3 U8U gamma "O5'" "C5'" "C4'" "C3'" 180.000 10.00 3 U8U sp2_sp2_3 S2 C2 N1 C6 180.000 5.0 2 U8U sp2_sp2_21 C5 C6 N1 C2 0.000 5.0 2 U8U sp3_sp3_46 "C1'" "C2'" "O2'" "HO2'" 180.000 10.0 3 U8U sp2_sp2_7 S2 C2 N3 C4 180.000 5.0 2 U8U sp2_sp2_11 O4 C4 N3 C2 180.000 5.0 2 U8U sp2_sp2_16 O4 C4 C5 C 0.000 5.0 2 U8U sp2_sp2_19 C C5 C6 N1 180.000 5.0 2 U8U sp2_sp3_8 C4 C5 C N -90.000 10.0 6 U8U sp3_sp3_32 C5 C N CA -60.000 10.0 3 U8U sp3_sp3_37 HA1 CA N C 180.000 10.0 3 loop_ _chem_comp_chir.comp_id _chem_comp_chir.id _chem_comp_chir.atom_id_centre _chem_comp_chir.atom_id_1 _chem_comp_chir.atom_id_2 _chem_comp_chir.atom_id_3 _chem_comp_chir.volume_sign U8U chir_1 "C1'" "O4'" N1 "C2'" negative U8U chir_2 "C2'" "O2'" "C1'" "C3'" negative U8U chir_3 "C3'" "O3'" "C4'" "C2'" positive U8U chir_4 "C4'" "O4'" "C3'" "C5'" negative U8U chir_5 P "O5'" OP2 OP3 both U8U chir_6 N C CA HN1 both loop_ _chem_comp_plane_atom.comp_id _chem_comp_plane_atom.plane_id _chem_comp_plane_atom.atom_id _chem_comp_plane_atom.dist_esd U8U plan-1 "C1'" 0.020 U8U plan-1 C2 0.020 U8U plan-1 C6 0.020 U8U plan-1 N1 0.020 U8U plan-2 C2 0.020 U8U plan-2 N1 0.020 U8U plan-2 N3 0.020 U8U plan-2 S2 0.020 U8U plan-3 C2 0.020 U8U plan-3 C4 0.020 U8U plan-3 HN3 0.020 U8U plan-3 N3 0.020 U8U plan-4 C4 0.020 U8U plan-4 C5 0.020 U8U plan-4 N3 0.020 U8U plan-4 O4 0.020 U8U plan-5 C 0.020 U8U plan-5 C4 0.020 U8U plan-5 C5 0.020 U8U plan-5 C6 0.020 U8U plan-6 C5 0.020 U8U plan-6 C6 0.020 U8U plan-6 H6 0.020 U8U plan-6 N1 0.020 loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor U8U SMILES ACDLabs 10.04 O=C1NC(=S)N(C=C1CNC)C2OC(C(O)C2O)COP(=O)(O)O U8U SMILES_CANONICAL CACTVS 3.341 CNCC1=CN([C@@H]2O[C@H](CO[P](O)(O)=O)[C@@H](O)[C@H]2O)C(=S)NC1=O U8U SMILES CACTVS 3.341 CNCC1=CN([CH]2O[CH](CO[P](O)(O)=O)[CH](O)[CH]2O)C(=S)NC1=O U8U SMILES_CANONICAL "OpenEye OEToolkits" 1.5.0 CNCC1=CN(C(=S)NC1=O)[C@H]2[C@@H]([C@@H]([C@H](O2)COP(=O)(O)O)O)O U8U SMILES "OpenEye OEToolkits" 1.5.0 CNCC1=CN(C(=S)NC1=O)C2C(C(C(O2)COP(=O)(O)O)O)O U8U InChI InChI 1.03 InChI=1S/C11H18N3O8PS/c1-12-2-5-3-14(11(24)13-9(5)17)10-8(16)7(15)6(22-10)4-21-23(18,19)20/h3,6-8,10,12,15-16H,2,4H2,1H3,(H,13,17,24)(H2,18,19,20)/t6-,7-,8-,10-/m1/s1 U8U InChIKey InChI 1.03 LVNQROXSHGRCLA-FDDDBJFASA-N loop_ _pdbx_chem_comp_description_generator.comp_id _pdbx_chem_comp_description_generator.program_name _pdbx_chem_comp_description_generator.program_version _pdbx_chem_comp_description_generator.descriptor U8U acedrg 243 "dictionary generator" U8U acedrg_database 11 "data source" U8U rdkit 2017.03.2 "Chemoinformatics tool" U8U refmac5 5.8.0238 "optimization tool" libpdb-redo-3.3.0/test/restr2ccd/Z57-a.cif0000644000175000017500000002460414773016616017721 0ustar maartenmaartendata_comp_list loop_ _chem_comp.id _chem_comp.three_letter_code _chem_comp.name _chem_comp.group _chem_comp.number_atoms_all _chem_comp.number_atoms_nh _chem_comp.desc_level Z57-a Z57-a (1S)-1,5-anhydro-1-(4-bromo-2,5-dihydroxyphenyl)-D-glucitol pyranose 35 20 . data_comp_Z57-a loop_ _chem_comp_atom.comp_id _chem_comp_atom.atom_id _chem_comp_atom.type_symbol _chem_comp_atom.type_energy _chem_comp_atom.charge _chem_comp_atom.x _chem_comp_atom.y _chem_comp_atom.z Z57-a C1A C CR6 0 33.838 24.351 30.085 Z57-a O1 O OH1 0 32.566 24.871 30.160 Z57-a C2A C CR6 0 34.186 23.353 29.159 Z57-a C3A C CR16 0 35.501 22.883 29.146 Z57-a C4A C CR6 0 36.451 23.378 30.032 Z57-a O4A O OH1 0 37.739 22.898 30.004 Z57-a C5A C CR6 0 36.075 24.366 30.943 Z57-a BR5 BR BR 0 37.352 25.057 32.160 Z57-a C6A C CR16 0 34.777 24.855 30.975 Z57-a C1 C CH1 0 33.179 22.794 28.177 Z57-a C2 C CH1 0 33.413 23.314 26.757 Z57-a O2 O OH1 0 33.214 24.731 26.730 Z57-a C3 C CH1 0 32.456 22.641 25.774 Z57-a O3 O OH1 0 32.782 23.029 24.440 Z57-a C4 C CH1 0 32.517 21.124 25.904 Z57-a O4 O OH1 0 31.521 20.523 25.078 Z57-a C5 C CH1 0 32.292 20.710 27.364 Z57-a O5 O O2 0 33.266 21.360 28.205 Z57-a C6 C CH2 0 32.431 19.221 27.595 Z57-a O6 O OH1 0 33.736 18.751 27.258 Z57-a HO1 H H 0 32.450 25.724 30.173 Z57-a H3A H H 0 35.746 22.218 28.529 Z57-a HO4A H H 0 37.899 22.105 29.710 Z57-a H6 H H 0 34.535 25.520 31.592 Z57-a H1 H H 0 32.269 23.054 28.462 Z57-a H2 H H 0 34.344 23.119 26.488 Z57-a HO2 H H 0 33.475 25.032 25.989 Z57-a H3 H H 0 31.532 22.936 25.971 Z57-a HO3 H H 0 32.159 22.791 23.927 Z57-a H4 H H 0 33.406 20.816 25.612 Z57-a HO4 H H 0 30.752 20.771 25.318 Z57-a H5 H H 0 31.388 20.997 27.641 Z57-a H61 H H 0 31.767 18.744 27.056 Z57-a H62 H H 0 32.254 19.024 28.539 Z57-a HO6 H H 0 34.309 19.120 27.763 loop_ _chem_comp_bond.comp_id _chem_comp_bond.atom_id_1 _chem_comp_bond.atom_id_2 _chem_comp_bond.type _chem_comp_bond.aromatic _chem_comp_bond.value_dist_nucleus _chem_comp_bond.value_dist_nucleus_esd _chem_comp_bond.value_dist _chem_comp_bond.value_dist_esd Z57-a C1A C2A DOUBLE y 1.398 0.0100 1.398 0.0100 Z57-a C1A O1 SINGLE n 1.374 0.0155 1.374 0.0155 Z57-a C1A C6A SINGLE y 1.384 0.0109 1.384 0.0109 Z57-a C2A C1 SINGLE n 1.510 0.0100 1.510 0.0100 Z57-a C2A C3A SINGLE y 1.390 0.0100 1.390 0.0100 Z57-a C3A C4A DOUBLE y 1.386 0.0100 1.386 0.0100 Z57-a C4A O4A SINGLE n 1.374 0.0155 1.374 0.0155 Z57-a C4A C5A SINGLE y 1.393 0.0117 1.393 0.0117 Z57-a C5A C6A DOUBLE y 1.385 0.0100 1.385 0.0100 Z57-a C5A BR5 SINGLE n 1.894 0.0100 1.894 0.0100 Z57-a C1 C2 SINGLE n 1.528 0.0100 1.528 0.0100 Z57-a C1 O5 SINGLE n 1.432 0.0124 1.432 0.0124 Z57-a C2 C3 SINGLE n 1.527 0.0100 1.527 0.0100 Z57-a C2 O2 SINGLE n 1.431 0.0107 1.431 0.0107 Z57-a C3 O3 SINGLE n 1.427 0.0125 1.427 0.0125 Z57-a C3 C4 SINGLE n 1.520 0.0154 1.520 0.0154 Z57-a C4 O4 SINGLE n 1.425 0.0176 1.425 0.0176 Z57-a C4 C5 SINGLE n 1.524 0.0200 1.524 0.0200 Z57-a C5 C6 SINGLE n 1.511 0.0136 1.511 0.0136 Z57-a C5 O5 SINGLE n 1.439 0.0100 1.439 0.0100 Z57-a C6 O6 SINGLE n 1.426 0.0200 1.426 0.0200 Z57-a O1 HO1 SINGLE n 0.966 0.0059 0.861 0.0200 Z57-a C3A H3A SINGLE n 1.082 0.0130 0.940 0.0137 Z57-a O4A HO4A SINGLE n 0.966 0.0059 0.861 0.0200 Z57-a C6A H6 SINGLE n 1.082 0.0130 0.939 0.0104 Z57-a C1 H1 SINGLE n 1.089 0.0100 0.989 0.0100 Z57-a C2 H2 SINGLE n 1.089 0.0100 0.988 0.0151 Z57-a O2 HO2 SINGLE n 0.970 0.0120 0.841 0.0200 Z57-a C3 H3 SINGLE n 1.089 0.0100 0.990 0.0140 Z57-a O3 HO3 SINGLE n 0.970 0.0120 0.841 0.0200 Z57-a C4 H4 SINGLE n 1.089 0.0100 0.986 0.0131 Z57-a O4 HO4 SINGLE n 0.970 0.0120 0.841 0.0200 Z57-a C5 H5 SINGLE n 1.089 0.0100 0.988 0.0182 Z57-a C6 H61 SINGLE n 1.089 0.0100 0.980 0.0184 Z57-a C6 H62 SINGLE n 1.089 0.0100 0.980 0.0184 Z57-a O6 HO6 SINGLE n 0.970 0.0120 0.848 0.0200 loop_ _chem_comp_angle.comp_id _chem_comp_angle.atom_id_1 _chem_comp_angle.atom_id_2 _chem_comp_angle.atom_id_3 _chem_comp_angle.value_angle _chem_comp_angle.value_angle_esd Z57-a C2A C1A O1 119.729 3.00 Z57-a C2A C1A C6A 120.542 1.50 Z57-a O1 C1A C6A 119.729 3.00 Z57-a C1A O1 HO1 120.000 3.00 Z57-a C1A C2A C1 120.931 2.27 Z57-a C1A C2A C3A 118.667 1.50 Z57-a C1 C2A C3A 120.402 1.50 Z57-a C2A C3A C4A 120.515 1.50 Z57-a C2A C3A H3A 119.485 1.50 Z57-a C4A C3A H3A 119.998 1.50 Z57-a C3A C4A O4A 120.374 3.00 Z57-a C3A C4A C5A 119.253 1.50 Z57-a O4A C4A C5A 120.374 3.00 Z57-a C4A O4A HO4A 120.000 3.00 Z57-a C4A C5A C6A 121.650 1.50 Z57-a C4A C5A BR5 119.319 1.50 Z57-a C6A C5A BR5 119.032 1.50 Z57-a C1A C6A C5A 119.376 1.50 Z57-a C1A C6A H6 120.234 1.50 Z57-a C5A C6A H6 120.390 1.50 Z57-a C2A C1 C2 112.164 2.36 Z57-a C2A C1 O5 107.987 1.50 Z57-a C2A C1 H1 108.577 1.50 Z57-a C2 C1 O5 110.064 1.62 Z57-a C2 C1 H1 108.791 1.50 Z57-a O5 C1 H1 108.606 1.50 Z57-a C1 C2 C3 110.123 3.00 Z57-a C1 C2 O2 109.334 1.86 Z57-a C1 C2 H2 109.340 1.50 Z57-a C3 C2 O2 110.081 2.02 Z57-a C3 C2 H2 109.166 1.50 Z57-a O2 C2 H2 108.790 1.50 Z57-a C2 O2 HO2 109.099 3.00 Z57-a C2 C3 O3 110.081 2.02 Z57-a C2 C3 C4 110.796 1.54 Z57-a C2 C3 H3 109.166 1.50 Z57-a O3 C3 C4 110.243 1.88 Z57-a O3 C3 H3 108.767 1.50 Z57-a C4 C3 H3 108.653 1.50 Z57-a C3 O3 HO3 108.895 2.41 Z57-a C3 C4 O4 110.101 1.97 Z57-a C3 C4 C5 110.272 1.76 Z57-a C3 C4 H4 109.032 1.50 Z57-a O4 C4 C5 109.072 2.07 Z57-a O4 C4 H4 109.194 1.50 Z57-a C5 C4 H4 109.223 1.50 Z57-a C4 O4 HO4 109.564 3.00 Z57-a C4 C5 C6 112.996 1.59 Z57-a C4 C5 O5 109.378 1.54 Z57-a C4 C5 H5 108.960 1.50 Z57-a C6 C5 O5 107.094 1.51 Z57-a C6 C5 H5 109.269 1.50 Z57-a O5 C5 H5 108.995 1.50 Z57-a C1 O5 C5 112.489 1.50 Z57-a C5 C6 O6 111.299 2.09 Z57-a C5 C6 H61 109.363 1.50 Z57-a C5 C6 H62 109.363 1.50 Z57-a O6 C6 H61 109.265 1.50 Z57-a O6 C6 H62 109.265 1.50 Z57-a H61 C6 H62 108.155 1.50 Z57-a C6 O6 HO6 109.472 2.41 loop_ _chem_comp_tor.comp_id _chem_comp_tor.id _chem_comp_tor.atom_id_1 _chem_comp_tor.atom_id_2 _chem_comp_tor.atom_id_3 _chem_comp_tor.atom_id_4 _chem_comp_tor.value_angle _chem_comp_tor.value_angle_esd _chem_comp_tor.period Z57-a nu0 C1 O5 C5 C4 64.556 10.0 3 Z57-a nu1 O5 C5 C4 C3 -57.107 10.0 3 Z57-a nu2 C5 C4 C3 C2 51.141 10.0 3 Z57-a nu3 C4 C3 C2 C1 -51.182 10.0 3 Z57-a nu4 C3 C2 C1 O5 57.407 10.0 3 Z57-a nu5 C2 C1 O5 C5 -64.832 10.0 3 Z57-a const_sp2_sp2_1 C6A C1A C2A C3A 0.000 5.0 2 Z57-a const_sp2_sp2_2 C6A C1A C2A C1 180.000 5.0 2 Z57-a const_sp2_sp2_3 O1 C1A C2A C3A 180.000 5.0 2 Z57-a const_sp2_sp2_4 O1 C1A C2A C1 0.000 5.0 2 Z57-a const_sp2_sp2_5 C1A C2A C3A C4A 0.000 5.0 2 Z57-a const_sp2_sp2_6 C1A C2A C3A H3A 180.000 5.0 2 Z57-a const_sp2_sp2_7 C1 C2A C3A C4A 180.000 5.0 2 Z57-a const_sp2_sp2_8 C1 C2A C3A H3A 0.000 5.0 2 Z57-a const_sp2_sp2_9 C2A C3A C4A C5A 0.000 5.0 2 Z57-a const_10 C2A C3A C4A O4A 180.000 10.0 2 Z57-a const_11 H3A C3A C4A C5A 180.000 10.0 2 Z57-a const_12 H3A C3A C4A O4A 0.000 10.0 2 Z57-a const_13 C3A C4A C5A C6A 0.000 10.0 2 Z57-a const_14 C3A C4A C5A BR5 180.000 10.0 2 Z57-a const_15 O4A C4A C5A C6A 180.000 10.0 2 Z57-a const_16 O4A C4A C5A BR5 0.000 10.0 2 Z57-a const_17 C4A C5A C6A C1A 0.000 10.0 2 Z57-a const_18 C4A C5A C6A H6 180.000 10.0 2 Z57-a const_19 BR5 C5A C6A C1A 180.000 10.0 2 Z57-a const_20 BR5 C5A C6A H6 0.000 10.0 2 Z57-a sp2_sp2_1 C2A C1A O1 HO1 180.000 5.0 2 Z57-a sp2_sp2_2 C6A C1A O1 HO1 0.000 5.0 2 Z57-a const_21 C2A C1A C6A C5A 0.000 10.0 2 Z57-a const_22 C2A C1A C6A H6 180.000 10.0 2 Z57-a const_23 O1 C1A C6A C5A 180.000 10.0 2 Z57-a const_24 O1 C1A C6A H6 0.000 10.0 2 Z57-a sp2_sp3_1 C1A C2A C1 C2 150.000 10.0 6 Z57-a sp2_sp3_2 C1A C2A C1 O5 -90.000 10.0 6 Z57-a sp2_sp3_3 C1A C2A C1 H1 30.000 10.0 6 Z57-a sp2_sp3_4 C3A C2A C1 C2 -30.000 10.0 6 Z57-a sp2_sp3_5 C3A C2A C1 O5 90.000 10.0 6 Z57-a sp2_sp3_6 C3A C2A C1 H1 -150.000 10.0 6 Z57-a sp2_sp2_3 C3A C4A O4A HO4A 180.000 5.0 2 Z57-a sp2_sp2_4 C5A C4A O4A HO4A 0.000 5.0 2 Z57-a sp3_sp3_43 C1 C2 O2 HO2 180.000 10.0 3 Z57-a sp3_sp3_44 C3 C2 O2 HO2 60.000 10.0 3 Z57-a sp3_sp3_45 H2 C2 O2 HO2 -60.000 10.0 3 Z57-a sp3_sp3_46 C2 C3 O3 HO3 180.000 10.0 3 Z57-a sp3_sp3_47 C4 C3 O3 HO3 60.000 10.0 3 Z57-a sp3_sp3_48 H3 C3 O3 HO3 -60.000 10.0 3 Z57-a sp3_sp3_49 C3 C4 O4 HO4 180.000 10.0 3 Z57-a sp3_sp3_50 C5 C4 O4 HO4 60.000 10.0 3 Z57-a sp3_sp3_51 H4 C4 O4 HO4 -60.000 10.0 3 Z57-a sp3_sp3_52 C4 C5 C6 O6 180.000 10.0 3 Z57-a sp3_sp3_53 C4 C5 C6 H61 -60.000 10.0 3 Z57-a sp3_sp3_54 C4 C5 C6 H62 60.000 10.0 3 Z57-a sp3_sp3_55 O5 C5 C6 O6 60.000 10.0 3 Z57-a sp3_sp3_56 O5 C5 C6 H61 180.000 10.0 3 Z57-a sp3_sp3_57 O5 C5 C6 H62 -60.000 10.0 3 Z57-a sp3_sp3_58 H5 C5 C6 O6 -60.000 10.0 3 Z57-a sp3_sp3_59 H5 C5 C6 H61 60.000 10.0 3 Z57-a sp3_sp3_60 H5 C5 C6 H62 180.000 10.0 3 Z57-a sp3_sp3_61 C5 C6 O6 HO6 180.000 10.0 3 Z57-a sp3_sp3_62 H61 C6 O6 HO6 60.000 10.0 3 Z57-a sp3_sp3_63 H62 C6 O6 HO6 -60.000 10.0 3 loop_ _chem_comp_chir.comp_id _chem_comp_chir.id _chem_comp_chir.atom_id_centre _chem_comp_chir.atom_id_1 _chem_comp_chir.atom_id_2 _chem_comp_chir.atom_id_3 _chem_comp_chir.volume_sign Z57-a chir_1 C1 O5 C2 C2A positive Z57-a chir_2 C2 O2 C1 C3 negative Z57-a chir_3 C3 O3 C4 C2 negative Z57-a chir_4 C4 O4 C5 C3 positive Z57-a chir_5 C5 O5 C4 C6 negative loop_ _chem_comp_plane_atom.comp_id _chem_comp_plane_atom.plane_id _chem_comp_plane_atom.atom_id _chem_comp_plane_atom.dist_esd Z57-a plan-1 BR5 0.020 Z57-a plan-1 C1 0.020 Z57-a plan-1 C1A 0.020 Z57-a plan-1 C2A 0.020 Z57-a plan-1 C3A 0.020 Z57-a plan-1 C4A 0.020 Z57-a plan-1 C5A 0.020 Z57-a plan-1 C6A 0.020 Z57-a plan-1 H3A 0.020 Z57-a plan-1 H6 0.020 Z57-a plan-1 O1 0.020 Z57-a plan-1 O4A 0.020 loop_ _pdbx_chem_comp_descriptor.comp_id _pdbx_chem_comp_descriptor.type _pdbx_chem_comp_descriptor.program _pdbx_chem_comp_descriptor.program_version _pdbx_chem_comp_descriptor.descriptor Z57-a SMILES ACDLabs 12.01 Brc1c(O)cc(c(O)c1)C2OC(CO)C(O)C(O)C2O Z57-a SMILES_CANONICAL CACTVS 3.370 OC[C@H]1O[C@H]([C@H](O)[C@@H](O)[C@@H]1O)c2cc(O)c(Br)cc2O Z57-a SMILES CACTVS 3.370 OC[CH]1O[CH]([CH](O)[CH](O)[CH]1O)c2cc(O)c(Br)cc2O Z57-a SMILES_CANONICAL "OpenEye OEToolkits" 1.7.0 c1c(c(cc(c1O)Br)O)[C@H]2[C@@H]([C@H]([C@@H]([C@H](O2)CO)O)O)O Z57-a SMILES "OpenEye OEToolkits" 1.7.0 c1c(c(cc(c1O)Br)O)C2C(C(C(C(O2)CO)O)O)O Z57-a InChI InChI 1.03 InChI=1S/C12H15BrO7/c13-5-2-6(15)4(1-7(5)16)12-11(19)10(18)9(17)8(3-14)20-12/h1-2,8-12,14-19H,3H2/t8-,9-,10+,11-,12+/m1/s1 Z57-a InChIKey InChI 1.03 UXXJNKKJRCGMAK-ZIQFBCGOSA-N loop_ _pdbx_chem_comp_description_generator.comp_id _pdbx_chem_comp_description_generator.program_name _pdbx_chem_comp_description_generator.program_version _pdbx_chem_comp_description_generator.descriptor Z57-a acedrg 243 "dictionary generator" Z57-a acedrg_database 11 "data source" Z57-a rdkit 2017.03.2 "Chemoinformatics tool" Z57-a refmac5 5.8.0238 "optimization tool" libpdb-redo-3.3.0/test/rsr-test.cpp0000644000175000017500000002153514773016616017027 0ustar maartenmaarten/*- * SPDX-License-Identifier: BSD-2-Clause * * Copyright (c) 2024 NKI/AVL, Netherlands Cancer Institute * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #define CATCH_CONFIG_RUNNER #include #include #include #include #include #include "pdb-redo/AtomShape.hpp" #include "pdb-redo/MapMaker.hpp" #include "pdb-redo/Statistics.hpp" #include "pdb-redo/DistanceMap.hpp" #include "pdb-redo/Minimizer.hpp" namespace fs = std::filesystem; // -------------------------------------------------------------------- std::filesystem::path gTestDir = std::filesystem::current_path(); int main(int argc, char *argv[]) { Catch::Session session; // There must be exactly one instance // Build a new parser on top of Catch2's #if CATCH22 using namespace Catch::clara; #else // Build a new parser on top of Catch2's using namespace Catch::Clara; #endif auto cli = session.cli() // Get Catch2's command line parser | Opt(gTestDir, "data-dir") // bind variable to a new option, with a hint string ["-D"]["--data-dir"] // the option names it will respond to ("The directory containing the data files"); // description string for the help output // Now pass the new composite back to Catch2 so it uses that session.cli(cli); // Let Catch2 (using Clara) parse the command line int returnCode = session.applyCommandLine(argc, argv); if (returnCode != 0) // Indicates a command line error return returnCode; if (fs::exists(gTestDir / "minimal-components.cif")) cif::compound_factory::instance().push_dictionary(gTestDir / "minimal-components.cif"); return session.run(); } // -------------------------------------------------------------------- TEST_CASE("refine_0") { const fs::path example(gTestDir / ".." / "examples" / "1cbs.cif.gz"); cif::file file(example.string()); cif::mm::structure structure(file); cif::crystal crystal(structure.get_datablock()); auto &chain = structure.polymers().front(); pdb_redo::MapMaker mm; float samplingRate = 0.75; mm.loadMTZ(gTestDir / ".." / "examples" / "1cbs_map.mtz", samplingRate); auto minimizer = pdb_redo::Minimizer::create(crystal, chain, 3, 3, mm.fb()); minimizer->printStats(); auto score = minimizer->refine(true); std::cout << "minimizer score: " << score << '\n'; minimizer->printStats(); std::cout << std::string(cif::get_terminal_width(), '-') << '\n'; cif::file refFile(example.string()); cif::mm::structure reference(refFile); auto &refChain = reference.polymers().front(); auto &atoms3 = chain.at(2).atoms(); auto &refAtoms3 = refChain.at(2).atoms(); CHECK(atoms3.size() == refAtoms3.size()); double d_sum = 0; for (std::size_t i = 0; i < atoms3.size(); ++i) { auto a1 = atoms3.at(i); auto a2 = refAtoms3.at(i); auto d = distance(a1, a2); d_sum += d * d; std::cout << a1 << ": " << a1.get_location() << " => " << a2.get_location() << " distance: " << d << '\n'; } auto rmsd = std::sqrt(d_sum / atoms3.size()); std::cout << "RMSd: " << rmsd << '\n'; CHECK_THAT(rmsd, Catch::Matchers::WithinAbs(0.125, 0.125)); std::cout << std::string(cif::get_terminal_width(), '=') << '\n'; } TEST_CASE("refine_1") { const fs::path example(gTestDir / ".." / "examples" / "1cbs.cif.gz"); cif::file file(example.string()); cif::mm::structure structure(file); cif::crystal crystal(structure.get_datablock()); pdb_redo::MapMaker mm; float samplingRate = 0.75; mm.loadMTZ(gTestDir / ".." / "examples" / "1cbs_map.mtz", samplingRate); auto &chain = structure.polymers().front(); auto &atoms3 = chain.at(2).atoms(); auto minimizer = pdb_redo::Minimizer::create(crystal, chain, 3, 3, mm.fb()); minimizer->printStats(); // nudge the atoms of the third residue auto &res3 = chain.at(2); for (auto a : res3.atoms()) structure.move_atom(a, cif::nudge(a.get_location(), 0.5f)); cif::file refFile(example.string()); cif::mm::structure reference(refFile); auto &refChain = reference.polymers().front(); auto &refAtoms3 = refChain.at(2).atoms(); CHECK(atoms3.size() == refAtoms3.size()); for (std::size_t i = 0; i < atoms3.size(); ++i) { auto a1 = atoms3.at(i); auto a2 = refAtoms3.at(i); std::cout << a1 << ": " << a1.get_location() << " => " << a2.get_location() << " distance: " << distance(a1, a2) << '\n'; } std::cout << std::string(cif::get_terminal_width(), '-') << '\n'; minimizer->printStats(); auto score = minimizer->refine(true); std::cout << "minimizer score: " << score << '\n'; minimizer->printStats(); double d_sum = 0; std::cout << std::string(cif::get_terminal_width(), '-') << '\n'; for (std::size_t i = 0; i < atoms3.size(); ++i) { auto a1 = atoms3.at(i); auto a2 = refAtoms3.at(i); auto d = distance(a1, a2); d_sum += d * d; std::cout << a1 << ": " << a1.get_location() << " => " << a2.get_location() << " distance: " << d << '\n'; } auto rmsd = std::sqrt(d_sum / atoms3.size()); std::cout << "RMSd: " << rmsd << '\n'; CHECK_THAT(rmsd, Catch::Matchers::WithinAbs(0.27 / 2, 0.27 / 2)); std::cout << std::string(cif::get_terminal_width(), '=') << '\n'; } TEST_CASE("refine_2") { const fs::path example(gTestDir / ".." / "examples" / "1cbs.cif.gz"); cif::file file(example.string()); cif::mm::structure structure(file); const float kNearBy = 3; pdb_redo::DistanceMap dm(structure, kNearBy); // Move the REA residue somewhat auto &rea = structure.get_residue("B"); std::vector atoms; for (auto a : rea.atoms()) { for (auto b : dm.near(a, kNearBy)) { if (find(atoms.begin(), atoms.end(), b) != atoms.end()) continue; atoms.push_back(b); } } // // translate by { 0.1, 0.1, 0.1 } and then // // rotate around 1, 0, 0 for 5 degrees // const float angle = 5 * (cif::kPI / 180); // cif::quaternion q( // std::cos(angle / 2), std::sin(angle / 2), 0, 0 // ); // for (auto a : rea.atoms()) // a.translate_and_rotate({ 0.1, 0.1, 0.1 }, q); for (auto a : rea.atoms()) { auto l = a.get_location(); l = nudge(l, 0.5); a.set_location(l); } cif::file refFile(example.string()); cif::mm::structure reference(refFile); auto &atomsRea = rea.atoms(); auto &refAtomsRea = reference.get_residue("B").atoms(); CHECK(atomsRea.size() == refAtomsRea.size()); for (std::size_t i = 0; i < atomsRea.size(); ++i) { auto a1 = atomsRea.at(i); auto a2 = refAtomsRea.at(i); std::cout << a1 << ": " << a1.get_location() << " => " << a2.get_location() << " distance: " << distance(a1, a2) << '\n'; } std::cout << std::string(cif::get_terminal_width(), '-') << '\n'; pdb_redo::MapMaker mm; float samplingRate = 0.75; mm.loadMTZ(gTestDir / ".." / "examples" / "1cbs_map.mtz", samplingRate); cif::crystal crystal(structure.get_datablock()); auto minimizer = pdb_redo::Minimizer::create(crystal, structure, atoms, mm.fb()); minimizer->printStats(); auto score = minimizer->refine(true); std::cout << "minimizer score: " << score << '\n'; minimizer->printStats(); std::cout << std::string(cif::get_terminal_width(), '-') << '\n'; double d_sum = 0; for (std::size_t i = 0; i < atomsRea.size(); ++i) { auto a1 = atomsRea.at(i); auto a2 = refAtomsRea.at(i); auto d = distance(a1, a2); d_sum += d * d; std::cout << a1 << ": " << a1.get_location() << " => " << a2.get_location() << " distance: " << d << '\n'; } file.save("/tmp/rsr-test-3.cif"); auto rmsd = std::sqrt(d_sum / atomsRea.size()); std::cout << "RMSd: " << rmsd << '\n'; CHECK_THAT(rmsd, Catch::Matchers::WithinAbs(0.35 / 2, 0.35 / 2)); std::cout << std::string(cif::get_terminal_width(), '-') << '\n'; }