ceres-solver-1.13.0/0000755000232200023220000000000013163052327014555 5ustar debalancedebalanceceres-solver-1.13.0/README.md0000644000232200023220000000174713140546177016053 0ustar debalancedebalanceCeres Solver ============ Ceres Solver is an open source C++ library for modeling and solving large, complicated optimization problems. It is a feature rich, mature and performant library which has been used in production at Google since 2010. Ceres Solver can solve two kinds of problems. 1. Non-linear Least Squares problems with bounds constraints. 2. General unconstrained optimization problems. Please see [ceres-solver.org](http://ceres-solver.org/) for more information. WARNING - Do not make GitHub pull requests! ------------------------------------------- Ceres development happens on [Gerrit](https://ceres-solver.googlesource.com/), including both repository hosting and code reviews. The GitHub Repository is a continuously updated mirror which is primarily meant for issue tracking. Please see our [Contributing to Ceres Guide](http://ceres-solver.org/contributing.html) for more details. The upstream Gerrit repository is https://ceres-solver.googlesource.com/ceres-solver ceres-solver-1.13.0/CMakeLists.txt0000644000232200023220000012057513140546177017335 0ustar debalancedebalance# Ceres Solver - A fast non-linear least squares minimizer # Copyright 2015 Google Inc. All rights reserved. # http://ceres-solver.org/ # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * 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. # * Neither the name of Google Inc. nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission. # # 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. # # Authors: keir@google.com (Keir Mierle) # alexs.mac@gmail.com (Alex Stewart) cmake_minimum_required(VERSION 2.8.0) cmake_policy(VERSION 2.8) cmake_policy(SET CMP0003 NEW) if (POLICY CMP0042) cmake_policy(SET CMP0042 NEW) endif() project(Ceres C CXX) # NOTE: The 'generic' CMake variables CMAKE_[SOURCE/BINARY]_DIR should not be # used. Always use the project-specific variants (generated by CMake): # _[SOURCE/BINARY]_DIR, e.g. # Ceres_SOURCE_DIR (note, *not* CERES_SOURCE_DIR) instead, as these will # always point to the correct directories for the Ceres project, even if # it is nested inside another source tree, whereas the 'generic' # CMake variables refer to the *first* project() declaration, i.e. the # top-level project, not Ceres, if Ceres is nested. # Make CMake aware of the cmake folder for local FindXXX scripts, # append rather than set in case the user has passed their own # additional paths via -D. list(APPEND CMAKE_MODULE_PATH "${Ceres_SOURCE_DIR}/cmake") include(UpdateCacheVariable) # Set up the git hook to make Gerrit Change-Id: lines in commit messages. include(AddGerritCommitHook) add_gerrit_commit_hook(${Ceres_SOURCE_DIR} ${Ceres_BINARY_DIR}) # On OS X, add the Homebrew prefix to the set of prefixes searched by # CMake in find_path & find_library. This should ensure that we can # still build Ceres even if Homebrew is installed in a non-standard # location (not /usr/local). if (CMAKE_SYSTEM_NAME MATCHES "Darwin") find_program(HOMEBREW_EXECUTABLE brew) mark_as_advanced(FORCE HOMEBREW_EXECUTABLE) if (HOMEBREW_EXECUTABLE) # Detected a Homebrew install, query for its install prefix. execute_process(COMMAND ${HOMEBREW_EXECUTABLE} --prefix OUTPUT_VARIABLE HOMEBREW_INSTALL_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE) message(STATUS "Detected Homebrew with install prefix: " "${HOMEBREW_INSTALL_PREFIX}, adding to CMake search paths.") list(APPEND CMAKE_PREFIX_PATH "${HOMEBREW_INSTALL_PREFIX}") endif() endif() set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${Ceres_BINARY_DIR}/bin) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${Ceres_BINARY_DIR}/lib) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${Ceres_BINARY_DIR}/lib) # Set postfixes for generated libraries based on buildtype. set(CMAKE_RELEASE_POSTFIX "") set(CMAKE_DEBUG_POSTFIX "-debug") # Read the Ceres version from the source, such that we only ever have a single # definition of the Ceres version. include(ReadCeresVersionFromSource) read_ceres_version_from_source(${Ceres_SOURCE_DIR}) enable_testing() option(MINIGLOG "Use a stripped down version of glog." OFF) option(GFLAGS "Enable Google Flags." ON) option(SUITESPARSE "Enable SuiteSparse." ON) option(CXSPARSE "Enable CXSparse." ON) option(LAPACK "Enable use of LAPACK." ON) # Template specializations for the Schur complement based solvers. If # compile time, binary size or compiler performance is an issue, you # may consider disabling this. option(SCHUR_SPECIALIZATIONS "Enable fixed-size schur specializations." ON) option(CUSTOM_BLAS "Use handcoded BLAS routines (usually faster) instead of Eigen." ON) # Multithreading using OpenMP option(OPENMP "Enable threaded solving in Ceres (requires OpenMP)" ON) # Enable the use of Eigen as a sparse linear algebra library for # solving the nonlinear least squares problems. Enabling this # option will result in an LGPL licensed version of Ceres Solver # as the Simplicial Cholesky factorization in Eigen is licensed under the LGPL. # This does not affect the covariance estimation algorithm, as it # depends on the sparse QR factorization algorithm, which is licensed # under the MPL. OPTION(EIGENSPARSE "Enable Eigen as a sparse linear algebra library, WARNING: results in an LGPL licensed Ceres." OFF) if (NOT MSVC) # Ceres does not use C++11 internally, however it does use shared_ptr # (required) and unordered_map (if available), both of which were present in # previous iterations of what became C++11. GCC & Clang can have both TR1 & # C++11 versions of both shared_ptr & unordered_map and by default on Linux, # we will detect the TR1 versions if they exist, as they do NOT require # -std=c++11 to be passed when compiling Ceres, and any client code that uses # Ceres. This will result in conflicts if the client code uses C++11. # Enabling this option forces the use of the C++11 versions (& -std=c++11) if # available. # # This option is not available on Windows when using MSVC, as there, any new # (C++11 etc) features available are on by default and there is no analogue to # -std=c++11. It will however be available for MinGW & CygWin, which can # support -std=c++11. option(CXX11 "Enable use of C++11 headers if available (requires client code use C++11)." OFF) endif(NOT MSVC) option(EXPORT_BUILD_DIR "Export build directory using CMake (enables external use without install)." OFF) option(BUILD_TESTING "Enable tests" ON) option(BUILD_DOCUMENTATION "Build User's Guide (html)" OFF) option(BUILD_EXAMPLES "Build examples" ON) option(BUILD_SHARED_LIBS "Build Ceres as a shared library." OFF) if (MSVC) option(MSVC_USE_STATIC_CRT "MS Visual Studio: Use static C-Run Time Library in place of shared." OFF) if (BUILD_TESTING AND BUILD_SHARED_LIBS) message( "-- Disabling tests. The flags BUILD_TESTING and BUILD_SHARED_LIBS" " are incompatible with MSVC.") update_cache_variable(BUILD_TESTING OFF) endif (BUILD_TESTING AND BUILD_SHARED_LIBS) endif (MSVC) # Allow user to specify a suffix for the library install directory, the only # really sensible option (other than "") being "64", such that: # ${CMAKE_INSTALL_PREFIX}/lib -> ${CMAKE_INSTALL_PREFIX}/lib64. # # Heuristic for determining LIB_SUFFIX. FHS recommends that 64-bit systems # install native libraries to lib64 rather than lib. Most distros seem to # follow this convention with a couple notable exceptions (Debian-based and # Arch-based distros) which we try to detect here. if (CMAKE_SYSTEM_NAME MATCHES "Linux" AND NOT DEFINED LIB_SUFFIX AND NOT CMAKE_CROSSCOMPILING AND CMAKE_SIZEOF_VOID_P EQUAL "8" AND NOT EXISTS "/etc/debian_version" AND NOT EXISTS "/etc/arch-release") message("-- Detected non-Debian/Arch-based 64-bit Linux distribution. " "Defaulting to library install directory: lib${LIB_SUFFIX}. You can " "override this by specifying LIB_SUFFIX.") set(LIB_SUFFIX "64") endif () # Only create the cache variable (for the CMake GUI) after attempting to detect # the suffix *if not specified by the user* (NOT DEFINED LIB_SUFFIX in if()) # s/t the user could override our autodetected suffix with "" if desired. set(LIB_SUFFIX "${LIB_SUFFIX}" CACHE STRING "Suffix of library install directory (to support lib/lib64)." FORCE) # IOS is defined iff using the iOS.cmake CMake toolchain to build a static # library for iOS. if (IOS) message(STATUS "Building Ceres for iOS platform: ${IOS_PLATFORM}") # Ceres requires at least iOS 7.0+. if (IOS_DEPLOYMENT_TARGET VERSION_LESS 7.0) message(FATAL_ERROR "Unsupported iOS version: ${IOS_DEPLOYMENT_TARGET}, Ceres " "requires at least iOS version 7.0") endif() update_cache_variable(MINIGLOG ON) message(STATUS "Building for iOS: Forcing use of miniglog instead of glog.") update_cache_variable(SUITESPARSE OFF) update_cache_variable(CXSPARSE OFF) update_cache_variable(GFLAGS OFF) update_cache_variable(OPENMP OFF) # Apple claims that the BLAS call dsyrk_ is a private API, and will not allow # you to submit to the Apple Store if the symbol is present. update_cache_variable(LAPACK OFF) message(STATUS "Building for iOS: SuiteSparse, CXSparse, LAPACK, gflags, " "and OpenMP are not available.") update_cache_variable(BUILD_EXAMPLES OFF) message(STATUS "Building for iOS: Will not build examples.") endif (IOS) unset(CERES_COMPILE_OPTIONS) # Eigen. find_package(Eigen REQUIRED) if (EIGEN_FOUND) if (EIGEN_VERSION VERSION_LESS 3.1.0) message(FATAL_ERROR "-- Ceres requires Eigen version >= 3.1.0 in order " "that Eigen/SparseCore be available, detected version of Eigen is: " "${EIGEN_VERSION}") endif (EIGEN_VERSION VERSION_LESS 3.1.0) message("-- Found Eigen version ${EIGEN_VERSION}: ${EIGEN_INCLUDE_DIRS}") # Ensure that only MPL2 licensed code is part of the default build. message("") message(" ===============================================================") if (EIGENSPARSE) list(APPEND CERES_COMPILE_OPTIONS CERES_USE_EIGEN_SPARSE) message(" Enabling the use of Eigen as a sparse linear algebra library ") message(" for solving the nonlinear least squares problems. Enabling ") message(" this option results in an LGPL licensed version of ") message(" Ceres Solver as the Simplicial Cholesky factorization in Eigen") message(" is licensed under the LGPL. ") if (EIGEN_VERSION VERSION_LESS 3.2.2) message(" WARNING:") message("") message(" Your version of Eigen is older than version 3.2.2.") message(" The performance of SPARSE_NORMAL_CHOLESKY and SPARSE_SCHUR") message(" linear solvers will suffer. ") endif (EIGEN_VERSION VERSION_LESS 3.2.2) else (EIGENSPARSE) message(" Disabling the use of Eigen as a sparse linear algebra library.") message(" This does not affect the covariance estimation algorithm ") message(" which can still use the EIGEN_SPARSE_QR algorithm.") add_definitions(-DEIGEN_MPL2_ONLY) endif (EIGENSPARSE) message(" ===============================================================") message("") endif (EIGEN_FOUND) # LAPACK (& BLAS). if (LAPACK) find_package(LAPACK QUIET) if (LAPACK_FOUND) message("-- Found LAPACK library: ${LAPACK_LIBRARIES}") else (LAPACK_FOUND) message("-- Did not find LAPACK library, disabling LAPACK support.") endif (LAPACK_FOUND) find_package(BLAS QUIET) if (BLAS_FOUND) message("-- Found BLAS library: ${BLAS_LIBRARIES}") else (BLAS_FOUND) message("-- Did not find BLAS library, disabling LAPACK support.") endif (BLAS_FOUND) if (NOT (LAPACK_FOUND AND BLAS_FOUND)) update_cache_variable(LAPACK OFF) list(APPEND CERES_COMPILE_OPTIONS CERES_NO_LAPACK) endif (NOT (LAPACK_FOUND AND BLAS_FOUND)) else (LAPACK) message("-- Building without LAPACK.") list(APPEND CERES_COMPILE_OPTIONS CERES_NO_LAPACK) endif (LAPACK) # SuiteSparse. if (SUITESPARSE AND NOT LAPACK) # If user has disabled LAPACK, but left SUITESPARSE ON, turn it OFF, # LAPACK controls whether Ceres will be linked, directly or indirectly # via SuiteSparse to LAPACK. message("-- Disabling SuiteSparse as use of LAPACK has been disabled, " "turn ON LAPACK to enable (optional) building with SuiteSparse.") update_cache_variable(SUITESPARSE OFF) endif (SUITESPARSE AND NOT LAPACK) if (SUITESPARSE) # By default, if SuiteSparse and all dependencies are found, Ceres is # built with SuiteSparse support. # Check for SuiteSparse and dependencies. find_package(SuiteSparse) if (SUITESPARSE_FOUND) # On Ubuntu the system install of SuiteSparse (v3.4.0) up to at least # Ubuntu 13.10 cannot be used to link shared libraries. if (BUILD_SHARED_LIBS AND SUITESPARSE_IS_BROKEN_SHARED_LINKING_UBUNTU_SYSTEM_VERSION) message(FATAL_ERROR "You are attempting to build Ceres as a shared " "library on Ubuntu using a system package install of SuiteSparse " "3.4.0. This package is broken and does not support the " "construction of shared libraries (you can still build Ceres as " "a static library). If you wish to build a shared version of Ceres " "you should uninstall the system install of SuiteSparse " "(libsuitesparse-dev) and perform a source install of SuiteSparse " "(we recommend that you use the latest version), " "see http://ceres-solver.org/building.html for more information.") endif (BUILD_SHARED_LIBS AND SUITESPARSE_IS_BROKEN_SHARED_LINKING_UBUNTU_SYSTEM_VERSION) # By default, if all of SuiteSparse's dependencies are found, Ceres is # built with SuiteSparse support. message("-- Found SuiteSparse ${SUITESPARSE_VERSION}, " "building with SuiteSparse.") else (SUITESPARSE_FOUND) # Disable use of SuiteSparse if it cannot be found and continue. message("-- Did not find all SuiteSparse dependencies, disabling " "SuiteSparse support.") update_cache_variable(SUITESPARSE OFF) list(APPEND CERES_COMPILE_OPTIONS CERES_NO_SUITESPARSE) endif (SUITESPARSE_FOUND) else (SUITESPARSE) message("-- Building without SuiteSparse.") list(APPEND CERES_COMPILE_OPTIONS CERES_NO_SUITESPARSE) endif (SUITESPARSE) # CXSparse. if (CXSPARSE) # Don't search with REQUIRED as we can continue without CXSparse. find_package(CXSparse) if (CXSPARSE_FOUND) # By default, if CXSparse and all dependencies are found, Ceres is # built with CXSparse support. message("-- Found CXSparse version: ${CXSPARSE_VERSION}, " "building with CXSparse.") else (CXSPARSE_FOUND) # Disable use of CXSparse if it cannot be found and continue. message("-- Did not find CXSparse, Building without CXSparse.") update_cache_variable(CXSPARSE OFF) list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CXSPARSE) endif (CXSPARSE_FOUND) else (CXSPARSE) message("-- Building without CXSparse.") list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CXSPARSE) # Mark as advanced (remove from default GUI view) the CXSparse search # variables in case user enabled CXSPARSE, FindCXSparse did not find it, so # made search variables visible in GUI for user to set, but then user disables # CXSPARSE instead of setting them. mark_as_advanced(FORCE CXSPARSE_INCLUDE_DIR CXSPARSE_LIBRARY) endif (CXSPARSE) # Ensure that the user understands they have disabled all sparse libraries. if (NOT SUITESPARSE AND NOT CXSPARSE AND NOT EIGENSPARSE) message(" ===============================================================") message(" Compiling without any sparse library: SuiteSparse, CXSparse ") message(" & Eigen (Sparse) are all disabled or unavailable. No sparse ") message(" linear solvers (SPARSE_NORMAL_CHOLESKY & SPARSE_SCHUR)") message(" will be available when Ceres is used.") message(" ===============================================================") endif(NOT SUITESPARSE AND NOT CXSPARSE AND NOT EIGENSPARSE) # GFlags. if (GFLAGS) # Don't search with REQUIRED as we can continue without gflags. find_package(Gflags) if (GFLAGS_FOUND) message("-- Found Google Flags header in: ${GFLAGS_INCLUDE_DIRS}, " "in namespace: ${GFLAGS_NAMESPACE}") add_definitions(-DCERES_GFLAGS_NAMESPACE=${GFLAGS_NAMESPACE}) else (GFLAGS_FOUND) message("-- Did not find Google Flags (gflags), Building without gflags " "- no tests or tools will be built!") update_cache_variable(GFLAGS OFF) endif (GFLAGS_FOUND) else (GFLAGS) message("-- Google Flags disabled; no tests or tools will be built!") # Mark as advanced (remove from default GUI view) the gflags search # variables in case user enabled GFLAGS, FindGflags did not find it, so # made search variables visible in GUI for user to set, but then user disables # GFLAGS instead of setting them. mark_as_advanced(FORCE GFLAGS_INCLUDE_DIR GFLAGS_LIBRARY GFLAGS_NAMESPACE) endif (GFLAGS) # MiniGLog. if (MINIGLOG) message("-- Compiling minimal glog substitute into Ceres.") set(GLOG_INCLUDE_DIRS internal/ceres/miniglog) set(MINIGLOG_MAX_LOG_LEVEL 2 CACHE STRING "The maximum message severity level to be logged") add_definitions("-DMAX_LOG_LEVEL=${MINIGLOG_MAX_LOG_LEVEL}") message("-- Using minimal glog substitute (include): ${GLOG_INCLUDE_DIRS}") message("-- Max log level for minimal glog substitute: ${MINIGLOG_MAX_LOG_LEVEL}") # Mark as advanced (remove from default GUI view) the glog search # variables in case user disables MINIGLOG, FindGlog did not find it, so # made search variables visible in GUI for user to set, but then user enables # MINIGLOG instead of setting them. mark_as_advanced(FORCE GLOG_INCLUDE_DIR GLOG_LIBRARY) else (MINIGLOG) unset(MINIGLOG_MAX_LOG_LEVEL CACHE) # Don't search with REQUIRED so that configuration continues if not found and # we can output an error messages explaining MINIGLOG option. find_package(Glog) if (NOT GLOG_FOUND) message(FATAL_ERROR "Can't find Google Log (glog). Please set either: " "glog_DIR (newer CMake built versions of glog) or GLOG_INCLUDE_DIR & " "GLOG_LIBRARY or enable MINIGLOG option to use minimal glog " "implementation.") endif(NOT GLOG_FOUND) # By default, assume gflags was found, updating the message if it was not. set(GLOG_GFLAGS_DEPENDENCY_MESSAGE " Assuming glog was built with gflags support as gflags was found. " "This will make gflags a public dependency of Ceres.") if (NOT GFLAGS_FOUND) set(GLOG_GFLAGS_DEPENDENCY_MESSAGE " Assuming glog was NOT built with gflags support as gflags was " "not found. If glog was built with gflags, please set the " "gflags search locations such that it can be found by Ceres. " "Otherwise, Ceres may fail to link due to missing gflags symbols.") endif(NOT GFLAGS_FOUND) message("-- Found Google Log (glog)." ${GLOG_GFLAGS_DEPENDENCY_MESSAGE}) endif (MINIGLOG) if (NOT SCHUR_SPECIALIZATIONS) list(APPEND CERES_COMPILE_OPTIONS CERES_RESTRICT_SCHUR_SPECIALIZATION) message("-- Disabling Schur specializations (faster compiles)") endif (NOT SCHUR_SPECIALIZATIONS) if (NOT CUSTOM_BLAS) list(APPEND CERES_COMPILE_OPTIONS CERES_NO_CUSTOM_BLAS) message("-- Disabling custom blas") endif (NOT CUSTOM_BLAS) if (OPENMP) # Find quietly, as we can continue without OpenMP if it is not found. find_package(OpenMP QUIET) if (OPENMP_FOUND) message("-- Building with OpenMP.") list(APPEND CERES_COMPILE_OPTIONS CERES_USE_OPENMP) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") if (UNIX) # At least on Linux, we need pthreads to be enabled for mutex to # compile. This may not work on Windows or Android. find_package(Threads REQUIRED) list(APPEND CERES_COMPILE_OPTIONS CERES_HAVE_PTHREAD) list(APPEND CERES_COMPILE_OPTIONS CERES_HAVE_RWLOCK) endif (UNIX) else (OPENMP_FOUND) message("-- Failed to find OpenMP, disabling. This is expected on " "Clang < 3.8, and at least Xcode <= 7.") update_cache_variable(OPENMP OFF) list(APPEND CERES_COMPILE_OPTIONS CERES_NO_THREADS) endif (OPENMP_FOUND) else (OPENMP) message("-- Building without OpenMP (disabling multithreading).") list(APPEND CERES_COMPILE_OPTIONS CERES_NO_THREADS) endif (OPENMP) # Initialise CMAKE_REQUIRED_FLAGS used by CheckCXXSourceCompiles with the # contents of CMAKE_CXX_FLAGS such that if the user has passed extra flags # they are used when discovering shared_ptr/unordered_map. set(CMAKE_REQUIRED_FLAGS ${CMAKE_CXX_FLAGS}) include(CheckCXXCompilerFlag) check_cxx_compiler_flag("-std=c++11" COMPILER_HAS_CXX11_FLAG) if (CXX11 AND COMPILER_HAS_CXX11_FLAG) # Update CMAKE_REQUIRED_FLAGS used by CheckCXXSourceCompiles to include # -std=c++11 s/t we will detect the C++11 versions of unordered_map & # shared_ptr if they exist. set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11") endif (CXX11 AND COMPILER_HAS_CXX11_FLAG) # Set the Ceres compile definitions for the unordered_map configuration. include(FindUnorderedMap) find_unordered_map() if (UNORDERED_MAP_FOUND) if (HAVE_UNORDERED_MAP_IN_STD_NAMESPACE) list(APPEND CERES_COMPILE_OPTIONS CERES_STD_UNORDERED_MAP) endif(HAVE_UNORDERED_MAP_IN_STD_NAMESPACE) if (HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE) list(APPEND CERES_COMPILE_OPTIONS CERES_STD_UNORDERED_MAP_IN_TR1_NAMESPACE) endif(HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE) if (HAVE_TR1_UNORDERED_MAP_IN_TR1_NAMESPACE) list(APPEND CERES_COMPILE_OPTIONS CERES_TR1_UNORDERED_MAP) endif(HAVE_TR1_UNORDERED_MAP_IN_TR1_NAMESPACE) else (UNORDERED_MAP_FOUND) message("-- Replacing unordered_map/set with map/set (warning: slower!), " "try enabling CXX11 option if you expect C++11 to be available.") list(APPEND CERES_COMPILE_OPTIONS CERES_NO_UNORDERED_MAP) endif() # Set the Ceres compile definitions for the shared_ptr configuration. include(FindSharedPtr) find_shared_ptr() if (SHARED_PTR_FOUND) if (SHARED_PTR_TR1_MEMORY_HEADER) list(APPEND CERES_COMPILE_OPTIONS CERES_TR1_MEMORY_HEADER) endif (SHARED_PTR_TR1_MEMORY_HEADER) if (SHARED_PTR_TR1_NAMESPACE) list(APPEND CERES_COMPILE_OPTIONS CERES_TR1_SHARED_PTR) endif (SHARED_PTR_TR1_NAMESPACE) else (SHARED_PTR_FOUND) message(FATAL_ERROR "Unable to find shared_ptr, try enabling CXX11 option " "if you expect C++11 to be available.") endif (SHARED_PTR_FOUND) # To ensure that CXX11 accurately reflects whether we are using C++11, # check if it is required given where the potentially C++11 features Ceres # uses were found, and disable it if C++11 is not being used. if (CXX11) if (NOT HAVE_SHARED_PTR_IN_STD_NAMESPACE AND NOT HAVE_UNORDERED_MAP_IN_STD_NAMESPACE) message("-- Failed to find C++11 components in C++11 locations & " "namespaces, disabling CXX11.") update_cache_variable(CXX11 OFF) else() message(" ==============================================================") message(" Compiling Ceres using C++11. This will result in a version ") message(" of Ceres that will require the use of C++11 in client code.") message(" ==============================================================") list(APPEND CERES_COMPILE_OPTIONS CERES_USE_CXX11) if (COMPILER_HAS_CXX11_FLAG AND CMAKE_VERSION VERSION_LESS "2.8.12") # For CMake versions > 2.8.12, the C++11 dependency is rolled into the # Ceres target, and all dependent targets, but for older versions of CMake # the flag must be specified explicitly both for Ceres and the # examples/tests. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() endif() endif(CXX11) include_directories( include internal internal/ceres ${GLOG_INCLUDE_DIRS}) # Eigen SparseQR generates various compiler warnings related to unused and # uninitialised local variables. To avoid having to individually suppress these # warnings around the #include statments for Eigen headers across all GCC/Clang # versions, we tell CMake to treat Eigen headers as system headers. This # results in all compiler warnings from them being suppressed. # # Note that this is *not* propagated to clients, ie CERES_INCLUDE_DIRS # used by clients after find_package(Ceres) does not identify Eigen as # as system headers. include_directories(SYSTEM ${EIGEN_INCLUDE_DIRS}) if (SUITESPARSE) include_directories(${SUITESPARSE_INCLUDE_DIRS}) endif (SUITESPARSE) if (CXSPARSE) include_directories(${CXSPARSE_INCLUDE_DIRS}) endif (CXSPARSE) if (GFLAGS) include_directories(${GFLAGS_INCLUDE_DIRS}) endif (GFLAGS) if (BUILD_SHARED_LIBS) message("-- Building Ceres as a shared library.") # The CERES_BUILDING_SHARED_LIBRARY compile definition is NOT stored in # CERES_COMPILE_OPTIONS as it must only be defined when Ceres is compiled # not when it is used as it controls the CERES_EXPORT macro which provides # dllimport/export support in MSVC. add_definitions(-DCERES_BUILDING_SHARED_LIBRARY) list(APPEND CERES_COMPILE_OPTIONS CERES_USING_SHARED_LIBRARY) else (BUILD_SHARED_LIBS) message("-- Building Ceres as a static library.") endif (BUILD_SHARED_LIBS) # Change the default build type from Debug to Release, while still # supporting overriding the build type. # # The CACHE STRING logic here and elsewhere is needed to force CMake # to pay attention to the value of these variables. if (NOT CMAKE_BUILD_TYPE) message("-- No build type specified; defaulting to CMAKE_BUILD_TYPE=Release.") set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE) else (NOT CMAKE_BUILD_TYPE) if (CMAKE_BUILD_TYPE STREQUAL "Debug") message("\n=================================================================================") message("\n-- Build type: Debug. Performance will be terrible!") message("-- Add -DCMAKE_BUILD_TYPE=Release to the CMake command line to get an optimized build.") message("\n=================================================================================") endif (CMAKE_BUILD_TYPE STREQUAL "Debug") endif (NOT CMAKE_BUILD_TYPE) # Set the default Ceres flags to an empty string. set (CERES_CXX_FLAGS) if (CMAKE_BUILD_TYPE STREQUAL "Release") if (CMAKE_COMPILER_IS_GNUCXX) # Linux if (CMAKE_SYSTEM_NAME MATCHES "Linux") if (NOT GCC_VERSION VERSION_LESS 4.2) set (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -march=native -mtune=native") endif (NOT GCC_VERSION VERSION_LESS 4.2) endif (CMAKE_SYSTEM_NAME MATCHES "Linux") # Mac OS X if (CMAKE_SYSTEM_NAME MATCHES "Darwin") set (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -msse3") # Use of -fast only applicable for Apple's GCC # Assume this is being used if GCC version < 4.3 on OSX execute_process(COMMAND ${CMAKE_C_COMPILER} ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) if (GCC_VERSION VERSION_LESS 4.3) set (CERES_CXX_FLAGS "${CERES_CXX_FLAGS} -fast") endif (GCC_VERSION VERSION_LESS 4.3) endif (CMAKE_SYSTEM_NAME MATCHES "Darwin") endif (CMAKE_COMPILER_IS_GNUCXX) endif (CMAKE_BUILD_TYPE STREQUAL "Release") set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${CERES_CXX_FLAGS}") if (MINGW) # MinGW produces code that segfaults when performing matrix multiplications # in Eigen when compiled with -O3 (see [1]), as such force the use of -O2 # which works. # # [1] http://eigen.tuxfamily.org/bz/show_bug.cgi?id=556 message("-- MinGW detected, forcing -O2 instead of -O3 in Release for Eigen due " "to a MinGW bug: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=556") string(REPLACE "-O3" "-O2" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") update_cache_variable(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") endif (MINGW) # After the tweaks for the compile settings, disable some warnings on MSVC. if (MSVC) # On MSVC, math constants are not included in or unless # _USE_MATH_DEFINES is defined [1]. As we use M_PI in the examples, ensure # that _USE_MATH_DEFINES is defined before the first inclusion of . # # [1] https://msdn.microsoft.com/en-us/library/4hwaceh6.aspx add_definitions("-D_USE_MATH_DEFINES") # Disable signed/unsigned int conversion warnings. add_definitions("/wd4018") # Disable warning about using struct/class for the same symobl. add_definitions("/wd4099") # Disable warning about the insecurity of using "std::copy". add_definitions("/wd4996") # Disable performance warning about int-to-bool conversion. add_definitions("/wd4800") # Disable performance warning about fopen insecurity. add_definitions("/wd4996") # Disable warning about int64 to int32 conversion. Disabling # this warning may not be correct; needs investigation. # TODO(keir): Investigate these warnings in more detail. add_definitions("/wd4244") # It's not possible to use STL types in DLL interfaces in a portable and # reliable way. However, that's what happens with Google Log and Google Flags # on Windows. MSVC gets upset about this and throws warnings that we can't do # much about. The real solution is to link static versions of Google Log and # Google Test, but that seems tricky on Windows. So, disable the warning. add_definitions("/wd4251") # Google Flags doesn't have their DLL import/export stuff set up correctly, # which results in linker warnings. This is irrelevant for Ceres, so ignore # the warnings. set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /ignore:4049") # Update the C/CXX flags for MSVC to use either the static or shared # C-Run Time (CRT) library based on the user option: MSVC_USE_STATIC_CRT. list(APPEND C_CXX_FLAGS CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO) foreach(FLAG_VAR ${C_CXX_FLAGS}) if (MSVC_USE_STATIC_CRT) # Use static CRT. if (${FLAG_VAR} MATCHES "/MD") string(REGEX REPLACE "/MD" "/MT" ${FLAG_VAR} "${${FLAG_VAR}}") endif (${FLAG_VAR} MATCHES "/MD") else (MSVC_USE_STATIC_CRT) # Use shared, not static, CRT. if (${FLAG_VAR} MATCHES "/MT") string(REGEX REPLACE "/MT" "/MD" ${FLAG_VAR} "${${FLAG_VAR}}") endif (${FLAG_VAR} MATCHES "/MT") endif (MSVC_USE_STATIC_CRT) endforeach() # Tuple sizes of 10 are used by Gtest. add_definitions("-D_VARIADIC_MAX=10") include(CheckIfUnderscorePrefixedBesselFunctionsExist) check_if_underscore_prefixed_bessel_functions_exist( HAVE_UNDERSCORE_PREFIXED_BESSEL_FUNCTIONS) if (HAVE_UNDERSCORE_PREFIXED_BESSEL_FUNCTIONS) list(APPEND CERES_COMPILE_OPTIONS CERES_MSVC_USE_UNDERSCORE_PREFIXED_BESSEL_FUNCTIONS) endif() endif (MSVC) if (UNIX) # GCC is not strict enough by default, so enable most of the warnings. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unknown-pragmas -Wno-sign-compare -Wno-unused-parameter -Wno-missing-field-initializers") endif (UNIX) # Use a larger inlining threshold for Clang, since it hobbles Eigen, # resulting in an unreasonably slow version of the blas routines. The # -Qunused-arguments is needed because CMake passes the inline # threshold to the linker and clang complains about it and dies. if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Qunused-arguments -mllvm -inline-threshold=600") # Older versions of Clang (<= 2.9) do not support the 'return-type-c-linkage' # option, so check for its presence before adding it to the default flags set. include(CheckCXXCompilerFlag) check_cxx_compiler_flag("-Wno-return-type-c-linkage" HAVE_RETURN_TYPE_C_LINKAGE) if (HAVE_RETURN_TYPE_C_LINKAGE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type-c-linkage") endif(HAVE_RETURN_TYPE_C_LINKAGE) endif () # Xcode 4.5.x used Clang 4.1 (Apple version), this has a bug that prevents # compilation of Ceres. if (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") execute_process(COMMAND ${CMAKE_CXX_COMPILER} ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion OUTPUT_VARIABLE CLANG_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) # Use version > 4.0 & < 4.2 to catch all 4.1(.x) versions. if (CLANG_VERSION VERSION_GREATER 4.0 AND CLANG_VERSION VERSION_LESS 4.2) message(FATAL_ERROR "You are attempting to build Ceres on OS X using Xcode " "4.5.x (Clang version: ${CLANG_VERSION}). This version of Clang has a " "bug that prevents compilation of Ceres, please update to " "Xcode >= 4.6.3.") endif (CLANG_VERSION VERSION_GREATER 4.0 AND CLANG_VERSION VERSION_LESS 4.2) endif (APPLE AND CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # Configure the Ceres config.h compile options header using the current # compile options and put the configured header into the Ceres build # directory. Note that the ceres/internal subdir in /config where # the configured config.h is placed is important, because Ceres will be # built against this configured header, it needs to have the same relative # include path as it would if it were in the source tree (or installed). list(REMOVE_DUPLICATES CERES_COMPILE_OPTIONS) include(CreateCeresConfig) create_ceres_config("${CERES_COMPILE_OPTIONS}" ${Ceres_BINARY_DIR}/config/ceres/internal) # Force the location containing the configured config.h to the front of the # include_directories list (by default it is appended to the back) to ensure # that if the user has an installed version of Ceres in the same location as one # of the dependencies (e.g. /usr/local) that we find the config.h we just # configured, not the (older) installed config.h. include_directories(BEFORE ${Ceres_BINARY_DIR}/config) add_subdirectory(internal/ceres) if (BUILD_DOCUMENTATION) set(CERES_DOCS_INSTALL_DIR "share/doc/ceres" CACHE STRING "Ceres docs install path relative to CMAKE_INSTALL_PREFIX") find_package(Sphinx QUIET) if (NOT SPHINX_FOUND) message("-- Failed to find Sphinx, disabling build of documentation.") update_cache_variable(BUILD_DOCUMENTATION OFF) else() # Generate the User's Guide (html). # The corresponding target is ceres_docs, but is included in ALL. message("-- Build the HTML documentation.") add_subdirectory(docs) endif() endif (BUILD_DOCUMENTATION) if (BUILD_EXAMPLES) message("-- Build the examples.") add_subdirectory(examples) else (BUILD_EXAMPLES) message("-- Do not build any example.") endif (BUILD_EXAMPLES) # Setup installation of Ceres public headers. file(GLOB CERES_HDRS ${Ceres_SOURCE_DIR}/include/ceres/*.h) install(FILES ${CERES_HDRS} DESTINATION include/ceres) file(GLOB CERES_PUBLIC_INTERNAL_HDRS ${Ceres_SOURCE_DIR}/include/ceres/internal/*.h) install(FILES ${CERES_PUBLIC_INTERNAL_HDRS} DESTINATION include/ceres/internal) # Also setup installation of Ceres config.h configured with the current # build options into the installed headers directory. install(FILES ${Ceres_BINARY_DIR}/config/ceres/internal/config.h DESTINATION include/ceres/internal) if (MINIGLOG) # Install miniglog header if being used as logging #includes appear in # installed public Ceres headers. install(FILES ${Ceres_SOURCE_DIR}/internal/ceres/miniglog/glog/logging.h DESTINATION include/ceres/internal/miniglog/glog) endif (MINIGLOG) # Ceres supports two mechanisms by which it can be detected & imported into # client code which uses CMake via find_package(Ceres): # # 1) Installation (e.g. to /usr/local), using CMake's install() function. # # 2) (Optional) Export of the current build directory into the local CMake # package registry, using CMake's export() function. This allows use of # Ceres from other projects without requiring installation. # # In both cases, we need to generate a configured CeresConfig.cmake which # includes additional autogenerated files which in concert create an imported # target for Ceres in a client project when find_package(Ceres) is invoked. # The key distinctions are where this file is located, and whether client code # references installed copies of the compiled Ceres headers/libraries, # (option #1: installation), or the originals in the source/build directories # (option #2: export of build directory). # # NOTE: If Ceres is both exported and installed, provided that the installation # path is present in CMAKE_MODULE_PATH when find_package(Ceres) is called, # the installed version is preferred. # Build the list of Ceres components for CeresConfig.cmake from the current set # of compile options. include(CeresCompileOptionsToComponents) ceres_compile_options_to_components("${CERES_COMPILE_OPTIONS}" CERES_COMPILED_COMPONENTS) # Create a CeresConfigVersion.cmake file containing the version information, # used by both export() & install(). configure_file("${Ceres_SOURCE_DIR}/cmake/CeresConfigVersion.cmake.in" "${Ceres_BINARY_DIR}/CeresConfigVersion.cmake" @ONLY) # Install method #1: Put Ceres in CMAKE_INSTALL_PREFIX: /usr/local or equivalent. # Set the install path for the installed CeresConfig.cmake configuration file # relative to CMAKE_INSTALL_PREFIX. if (WIN32) set(RELATIVE_CMAKECONFIG_INSTALL_DIR CMake) else () set(RELATIVE_CMAKECONFIG_INSTALL_DIR lib${LIB_SUFFIX}/cmake/Ceres) endif () # This "exports" for installation all targets which have been put into the # export set "CeresExport". This generates a CeresTargets.cmake file which, # when read in by a client project as part of find_package(Ceres) creates # imported library targets for Ceres (with dependency relations) which can be # used in target_link_libraries() calls in the client project to use Ceres. install(EXPORT CeresExport DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR} FILE CeresTargets.cmake) # Save the relative path from the installed CeresConfig.cmake file to the # install prefix. We do not save an absolute path in case the installed package # is subsequently relocated after installation (on Windows). file(RELATIVE_PATH INSTALL_ROOT_REL_CONFIG_INSTALL_DIR ${CMAKE_INSTALL_PREFIX}/${RELATIVE_CMAKECONFIG_INSTALL_DIR} ${CMAKE_INSTALL_PREFIX}) # Configure a CeresConfig.cmake file for an installed version of Ceres from the # template, reflecting the current build options. # # NOTE: The -install suffix is necessary to distinguish the install version from # the exported version, which must be named CeresConfig.cmake in # Ceres_BINARY_DIR to be detected. The suffix is removed when # it is installed. set(SETUP_CERES_CONFIG_FOR_INSTALLATION TRUE) configure_file("${Ceres_SOURCE_DIR}/cmake/CeresConfig.cmake.in" "${Ceres_BINARY_DIR}/CeresConfig-install.cmake" @ONLY) # Install the configuration files into the same directory as the autogenerated # CeresTargets.cmake file. We include the find_package() scripts for libraries # whose headers are included in the public API of Ceres and should thus be # present in CERES_INCLUDE_DIRS. install(FILES "${Ceres_BINARY_DIR}/CeresConfig-install.cmake" RENAME CeresConfig.cmake DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR}) install(FILES "${Ceres_BINARY_DIR}/CeresConfigVersion.cmake" "${Ceres_SOURCE_DIR}/cmake/FindEigen.cmake" "${Ceres_SOURCE_DIR}/cmake/FindGlog.cmake" "${Ceres_SOURCE_DIR}/cmake/FindGflags.cmake" DESTINATION ${RELATIVE_CMAKECONFIG_INSTALL_DIR}) # Create an uninstall target to remove all installed files. configure_file("${Ceres_SOURCE_DIR}/cmake/uninstall.cmake.in" "${Ceres_BINARY_DIR}/cmake/uninstall.cmake" @ONLY) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${Ceres_BINARY_DIR}/cmake/uninstall.cmake) # Install method #2: Put Ceres build into local CMake registry. # # Optionally export the Ceres build directory into the local CMake package # registry (~/.cmake/packages on *nix & OS X). This allows the detection & # use of Ceres without requiring that it be installed. if (EXPORT_BUILD_DIR) message("-- Export Ceres build directory to local CMake package registry.") # Save the relative path from the build directory to the source directory. file(RELATIVE_PATH INSTALL_ROOT_REL_CONFIG_INSTALL_DIR ${Ceres_BINARY_DIR} ${Ceres_SOURCE_DIR}) # Analogously to install(EXPORT ...), export the Ceres target from the build # directory as a package called Ceres into the local CMake package registry. export(TARGETS ceres FILE ${Ceres_BINARY_DIR}/CeresTargets.cmake) export(PACKAGE ${CMAKE_PROJECT_NAME}) # Configure a CeresConfig.cmake file for the export of the Ceres build # directory from the template, reflecting the current build options. set(SETUP_CERES_CONFIG_FOR_INSTALLATION FALSE) configure_file("${Ceres_SOURCE_DIR}/cmake/CeresConfig.cmake.in" "${Ceres_BINARY_DIR}/CeresConfig.cmake" @ONLY) endif (EXPORT_BUILD_DIR) ceres-solver-1.13.0/docs/0000755000232200023220000000000013163052133015500 5ustar debalancedebalanceceres-solver-1.13.0/docs/CMakeLists.txt0000644000232200023220000000313713140546177020257 0ustar debalancedebalance# Ceres Solver - A fast non-linear least squares minimizer # Copyright 2015 Google Inc. All rights reserved. # http://ceres-solver.org/ # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * 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. # * Neither the name of Google Inc. nor the names of its contributors may be # used to endorse or promote products derived from this software without # specific prior written permission. # # 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. add_subdirectory(source) ceres-solver-1.13.0/docs/source/0000755000232200023220000000000013140546177017013 5ustar debalancedebalanceceres-solver-1.13.0/docs/source/users.rst0000644000232200023220000000662213140546177020714 0ustar debalancedebalance.. _chapter-users: ===== Users ===== * At `Google `_, Ceres is used to: * Estimate the pose of `Street View`_ cars, aircrafts, and satellites. * Build 3D models for `PhotoTours`_. * Estimate satellite image sensor characteristics. * Stitch `panoramas`_ on Android and iOS. * Apply `Lens Blur`_ on Android. * Solve `bundle adjustment`_ and `SLAM`_ problems in `Project Tango`_. * `Willow Garage`_ uses Ceres to solve `SLAM`_ problems. * `Southwest Research Institute `_ uses Ceres for `calibrating robot-camera systems`_. * `Blender `_ uses Ceres for `planar tracking`_ and `bundle adjustment`_. * `OpenMVG `_ an open source multi-view geometry library uses Ceres for `bundle adjustment`_. * `Microsoft Research `_ uses Ceres for nonlinear optimization of objectives involving subdivision surfaces under `skinned control meshes`_. * `Matterport `_, uses Ceres for global alignment of 3D point clouds and for pose graph optimization. * `Obvious Engineering `_ uses Ceres for bundle adjustment for their 3D photography app `Seene `_. * The `Autonomous Systems Lab `_ at ETH Zurich uses Ceres for * Camera and Camera/IMU Calibration. * Large scale optimization of visual, inertial, gps and wheel-odometry data for long term autonomy. * `OpenPTrack `_ uses Ceres for camera calibration. * The `Intelligent Autonomous System Lab `_ at University of Padova, Italy, uses Ceres for * Camera/depth sensors network calibration. * Depth sensor distortion map estimation. * `Theia `_ is an open source Structure from Motion library that uses Ceres for `bundle adjustment`_ and camera pose estimation. * The `Applied Research Laboratory `_ at Pennsylvania State University uses in their synthetic aperture Sonar beamforming engine, called ASASIN , for estimating platform kinematics. * `Colmap `_ is a an open source structure from motion library that makes heavy use of Ceres for bundle adjustment with support for many camera models and for other non-linear least-squares problems (relative, absolute pose refinement, etc.). .. _bundle adjustment: http://en.wikipedia.org/wiki/Structure_from_motion .. _Street View: http://youtu.be/z00ORu4bU-A .. _PhotoTours: http://google-latlong.blogspot.com/2012/04/visit-global-landmarks-with-photo-tours.html .. _panoramas: http://www.google.com/maps/about/contribute/photosphere/ .. _Project Tango: https://www.google.com/atap/projecttango/ .. _planar tracking: http://mango.blender.org/development/planar-tracking-preview/ .. _Willow Garage: https://www.willowgarage.com/blog/2013/08/09/enabling-robots-see-better-through-improved-camera-calibration .. _Lens Blur: http://googleresearch.blogspot.com/2014/04/lens-blur-in-new-google-camera-app.html .. _SLAM: http://en.wikipedia.org/wiki/Simultaneous_localization_and_mapping .. _calibrating robot-camera systems: http://rosindustrial.org/news/2014/9/24/industrial-calibration-library-update-and-presentation .. _skinned control meshes: http://research.microsoft.com/en-us/projects/handmodelingfrommonoculardepth/ ceres-solver-1.13.0/docs/source/loss.png0000644000232200023220000026445613140546177020522 0ustar debalancedebalancePNG  IHDRJ/iCCPICC Profilec``2ptqre``+) rwRR` ``\\yy | 2 U +'300%@q9@HR6. r!+ v.z H}:b'A2 vIj^ʢ#ǔTbϼĒZ@! A!ahii "q(v!( cd2f` G1G)I/15C}}sïPoW pHYsgR@IDATx \Tם? 0d?7PWhlSI[MMw@R`lF`HSh@T7mR/W C4JXhd" qg0Ó }νs9;sLb7 P(@ P(@ L)?oO P(@ P(@U"P(@ P(@ xU P(@ P(@(@ P(@ P<1(@ P(@ P T;@ P(@ P( Tyc`#(@ P(@ Pw(@ P(@ P#FP(@ P(@ 0P(@ P(@ PG0P(@ P(@ P` P(@ P(@`#A P(@ P(@(@ P(@ P!@G<6(@ P(@ P*~(@ P(@ PK P(@ P4`b=Q7u/_.N,RPg"BLG_ vf=`K. buM=(@ P(@ P`^&Vy"/ö,o )W} P/8=/iDXטH P(@ P"UcQ2}RK q5ϲꡍ|m FqSUί1(@ P(@ Q# uX~]H p4ykCWCgK)8҉m+,gu:_kq訅(@ P(@ P`bֿں?J)+Tz$gmF&w0Hp(@ P(@ P/@_;i8ecA]K>lv(@ P(@ Lר|~E񛐝mDΛ%uqyۄAu'Tm@#{9xER>VFY :(@ P(@ LרVEwS. #Fk? jWh tޖ tT P(@ P&csа7OB3[eG/%;و?tZܽNC P(@ Pߌ KXVٱZ$M ͗%83l@M;c--ꭈr 2qΪpTl? ;RGi&⋣/ܹs1gNhtL&]wfegB؇-`mo=)}6F/-3~Tl܈~k,7ou4'iQDc(L]_y }hkB~,B?#Js5{A{{;x1üyId݂R 0҂vOވ%ߏ`tvvBr.dݛR@.pUʓ>6}Z@U޿qڵn3O`H(buqn'WFHٕi^ ȴ90yGw\ ]!榀 y7{h, NyN=T-~=Y0̛ TΎ=C$Fmŀ-Hen6o3VLhŔ7@cS2H#/=00`n7]|3T* l%(@ P(@(`/qQ׈Vd p1̍Mgd^z!HeDU*m.\{qe-<(@ P(@ #pq1/O1;i< Tr-:ʵFs!^=d}iv?# (@ P(@@O~/?T/\k|1d5[9fBp锣#Dyqϑmls_RR8VneI P(@ PQ$E|a[,%g( 8o} pt 5p$e⭁g{˱|, (@ P(0[>￯~SOaצRqsɄcWlSz>ZN}gW"c""w5 (@ P(@ NN?Vt~^L rQdɬ`jV=Qt7Q19GxdJ P(@ PCL& 0O R`ʬԿYy P(@ P [ܔ߿{EO(`` P(@ P&E_bnnE`vEO(``.O P(@ P&T?ŗ:^xsnA K(@ P(@ GOL ޫH  T5xL P(@ P wnܨ\@g㮛lof?_S&ь7>Mz X=ݭ꼫qא4bw3t4g>}Zu?B\)I t2(@ Pf@OEQtfhEO(0X"<&D,heuid)h+):2bjdw-:TOjm]ǥ@9k?(@ P(0ĚTsr  i<3Ns´* mf |BuYM҆-U 0ERaE*#`5t4g.zѐf,X^^^s?Q 6ڥKfVsWO|||{d T XS: PmDRc%ԩSI OMx \'z:݉ x~Ξ=;7(0J::5uEǒ%K'| pD,|2N@/kL P(@ L˗aزEQ܅ B'# a #)@e5ؑ4[ ce  CP{-T*?(*,?`[I P(@Q t܉/gE[JK170P 'U(0!%P*>&tޑX }K2Ş>:!!bϫl OjGc  Gdd$C畀{b8֣{EeCC*@"c^*,ޢw{T  WairZ'׬(@ P`v;Ϟ}VY{{S# 0P5S8*iAZ! H n] P`bwZ)wԡ/NˣV%{7\P?qf@齑ȑ#n*K.b?VYP,RxKFٞ}ط)5XJ6*ާ4.*>qʒ\hO\fWCdyH P(@'_*gdoF #@;JC LHՔW6L<8 Y UJ1؁uIIXu&Ⱥ^״΍mi㚹n-֮KŎ:)s\kUel~V uǮX+yEYzR=<(@ P_vu͊so ~Z +0 m)Q_; O)BŪ[_ U2bߜ+Qqn?H&FcU5U OK9|pk5%1eˆ7d僨D%K=q7~a0$ߍ%* Ã[7!&ӒV=to[٤;:ZGL]=0w*"[&Q(@cA0QTT͓Y @,x"㥋tz|--0zzTɓ5 S,/kre (@ x_ͻAōk*xBph_H/CFC0@ aZ:z'ݳ5Ԉ0o d,ǡMh3FZ }mPߺ2^"k5〷Z-` (@ P.̣; {sn Aw(d '@{NE L@J貥ui(<4W/*BycÕ~+s+Q$UY:d"qUƒᕐCM`_P*Iƶ#]E!2OD\d8U^^6.> (@ P |s8sFgΝ QpF!bdf&>W~(Ȭb.3 ?ow"5XX!]f}XJn܆OLk()P*Z{,v .haM 0 {}8Žo}6w}(@ P::]U߸[&M7c{)0cpaD5z> >ߍՔTγT<)e1(dz/a؟5v x GM>,q7( 0tFVA/Q,j 7Q7?9(@ PBjܹzxyyIi<8op,F _;, e)sV#nmuG9:4}kYM4l tFj,\Ԅ4v[z6oCuq7@65PfoclkFl3 z#($ +aۮjA4ZŒ%(@ P.sy'Fc)0jFMD f<\[fǁ=a5wC6tNXjR/-__ᲂ^ O"2ꫡC\ hVAeI'Jʤz/Wܛ KY *O8Y[صh5t^T= G(@ PQT97ߌ۷+xB0P5=&@ zkE8PEv #)Qd5FsIeFus}"3ׇvKGCRk 7P`P_^$J}^0қ/''DcwjmS;A. ;a\!c(@ P(BO:]@}nPLKP,\)z5%H}E7lGѣ–d/ȴA6|F=FHBxS~#컛a4oܛMVqع:ZQ[eyrd[\}'ptYȫ:6Fc7ZP4iVEYZ"Fe7}Oá6QΈnCjˑGITŲ'(@ PuuTZy7 L+HME Y !)R-vC.Y:i-|h]O_r}u*#qz t!{/)%:*%iYkV<]nhmHԸ,Wa-rS(@ V//]Bgj*`29n**C%U%z(@J-O}1xl&/ X_>tås>bLe3UT R~+ß ]}H6G|yysY)T弒^'&7_$z Jg.FI%5(@ Pf-)0aŊ4P`"LbX*ctvvxkXc;Zq|q*ͻwܹ! 5Mo㽖O9YxXA#r-}O>]+W|ph|eYB򐜲}8A >>'{\T-S߆د .*DS(@ Pl܌sw_:(u愎JOOǒ%Kflf{M L""6Aci/Bb-hK vG[)@ PfsH, լG&BS<(@ P(@ P,`|UE[}$S`BPNVF P(@ P_vu͊x_W-@D> P(@ P4R%,nyyoF`j2uY7(@ P(@ P` | /h ɸU!@dN P(@ P4tϹ&(xB`jdY/(@ P(@ P` tff6O Q%=Y^ Ps -x띏pܤងؼ4׽33^žKa5Kd^anL}x3Xv.?˟,˜*y.1NVa7e67 (79 6{Do_v#. bUg-[m6þ=Mw+6VFeuEe'[Y\<7z,(@ PW ;Enqڵ4Pz {nG Ln7M>qۖRr?|ywk:ք~l!%M6 + wg BmmrjF:R7bU->?]P"T>%b{<(He XrI?Ydh/dsrKBVi0N9]])He? 8d14*U~tuzid=A QZ=8kDu0 oÖ2r=HwiѼ@ P(0|!^6nHLTS%US%R`pՍX/BrX[) 55)MC\׼l@a5é}.㼬H'hjPያD<~Wy%<\J%ΆY nsH"] ]pu5"6Fو*+:Z,"w}"V}u#,HA}RߺXQ%Z-v@o²0ՓQ:1;(@ P0 OIbo>krfMSFObVM7qNdB8m5\$-$oLRt;\}HJՇ+c]bWʭX%pWsY>u0-|a##e|9:$pNI,$F P&BK)pU裘H R)0=Sq mxcJĪGX R iIΝ(ak]/^Cyi/V_!֨!ֽLk(),S{,v .(/o8k`q P(@҂;U΋D Lר'S` 8.3rt ynn"fg^ ^m.tus.-k0Yp[텯g^}:ϒG%"*av8N:=%H㱗w ºpԏ8ۃi.[ħn}Zn TM'RjDʨWt:$OIe/؛ KY *O8 @y6idaj(@ P4%22={mW xU$ L3/🰎:P( $G7up##?︳mx!0I_> s@Ql^o? 9X@_F-!eKpmh0e/ yk,#ԋ[gie$$.hlrB.QVM"P{4%"axDZX~<4wLF(@ P`.lތO>Qs㍊4PS'vP`Z ,A +a;jE]m${aEfGqzh# GpyX ޤق(ٲMۂlYu+QZtPvBW mMGVOY`T~~adym{a0UyX^'IEwWum#n4Ov!5Jᨕ(@ PUX,˿E^+xBO2.b~tgg'Yx{vLvw̹ Ưw3s1B2`D}WE=K!Lϝی#yQaS0e6kc?ށ1K4R-'sq+r-W!Dک'>h}(oCtW"](@ P@xjhٯmv#==K,Av|m.6ěj P`f Dko]{+ !Q}}BR-(@ PN$*T^j5_|q 7;;{M P(@ P3Pg 9O!O`ʓF P(@ PpS~iEnepy7 LɃb3)@ P(@ P :O^)ܹ*+/m'Q(@ PFye+r7+*Px\LH/000n޼}>P(@ PS?{Lp,4 P'P͚Fhx7/^EN M| 盈 QOnP[Q}u'Vq?vH;whƛo&޸$w\Ck[V^5tOA46J Q(@ P`<& v钢97ܠH '~8Y.ѰV΅=?V$?a9@Q ]lG2:r6Whr[Nς6dӔU-E͠{O.9"5>+ NHM^9Hbޅ(@ P`6 \*)2O Q5&r}J4HF3-4mGKN9ϔA*sRUT컛O*-Ȓ.q#P_rҮ!y al%(@ P S\W;, AŊ4P`: 0P59-(XhOnawd:M1] 1|<(7:{jRp˓uײ&btӋ~1$dGoW;)#j[&y(@ P3NOdc_o/93`j*@YҸj_@hܵ!Qz%`>jpψnn[~ufŕt 0X1x2竼с p;9`VC|nT6g(@ PS.`r>\hcgqU)PHEa\Jx9t8,dѪXꥂ`0Bd### ?l{A6#joAFƿ M۲eK2ǫy|zѢtCݹk\*KtiY8* ҇dя g$,O-h2 |&`[OЦң}:Zņ/w#4bkx{ݭػ=^*ʅT K3PU7Qe{yF P(0yp7i޷ުH x%7 L3Ko<_ߖڟ;`nT}[.-fZt]C*DבRXW5K&!5=YcʁZk+c\zu__$*7 PfG?'(H  1M8{InSƈ{|Jiϑ!ϣS1/#N:*SN+i<q&x)˖a?),>*eS\iGY2t>uI9r\=.+%;l?'踨EL}^t^cR6ų6_|?}w1SsH)ϟpw##}O[|J\Q(0+> T??'$]6#<8oF< Q`,akp=2NYc}M!֯-8![ЌClz`dWȖM:Rx$)U:麔sG>`I7y=ٺ #|/C,}sHExb},0d JS(}vP1FG8Z ㋔7z%}suToOL<^Zà5}c1C:݁(@ PS+pGQ4bM7! ^^^tP` LS`j$. h?1>ll@:dkL Nۦ} w-t?I;4?7:{ֈc6"{c5ϼ/zdqu{=[e>{M P}1t:ڼA1O+."e9'El*}VGWZOĪ.Ctb0hŖ7M\YQ%fN"8, jcn(@ P-3cE#ooVq"' + c(p|A1ˑ$֕Bu '۽HVjhllp1xCnQY+Y֤) If21+Rj?Cd;|IDbu\p'<ߕ(W.סм[ʭX8Pys,Bw^P0GIq}w}rE\Uݬ.?Sf>@Ν UH fgJ L uQ9EPD,R#t4ob!.J5qΝ8 %k|هXp7YvV,KT KR,|4#[%=Uzak]/^Cyiu/GH3h`r@IDATnIxE9CG *,{ر&Qx[S(@Y/ B~}*⋳ކ3WkTg˞M@D#:Zhuc`wHKál)#zϔ0ĶO(Q<#l,=G}bcv璍rf5!QrU]uN.O77KosVdEy#SRxi]-KxfEk|n.7$ ;E̬ B5(@ P \*-ŕ}rr0oEO(0IO}.smݲSLyg mq+ rt uF{# P4Uh? <9| rԩS8sڍnDemvp,wMMhkk5Zh)+n6TGO{# 2VM1ZOۚ`)l[DA!QXvUx؋4uϸQ(@ xՖ\S4FR3MDٟI a"V_ 9?iVe_&zuWh4ऒ#z9_$>R"Wn4n*G\,L_M'x{ W (MF\\e/+QڌXڴ,%eR3/zFM`'V#vm.*/3:/MBNj(@ P0 |J LmM/#[q9 T͜gɞ\/%HInZ()U~ԍC;ӠMo[tguԐZ[pmhe/ qk hU~oMC7(S"㶠6 h rqK/EM֓QcUkd>o<64Zq>_7Y8 8'5ADoԞ9 r;8a<4.޶訜(@ PE{\ilTl}"' Tħ>M/>}X Uddl/݋MZGjQs S#kS6~b_Hfo]!1<;7`@Gk3j_xoc}?`؍%#.MzVY_"F7}Oá6QΈnCjˑGITxƺgv(@ FOKJI`P:)0L(0<)++k[1w51P&atlYƤ;=|L+kHNJԯ):ȧ/Krݝ~ WޔNqYuTbNL/NGhm 9Q߆;qג( ?cl~^{S맸*ϻ1w;[[|r-}O>+W|ph|eYBԮf_wN|ЂωW!:+ ,ተ(@ PM hi;_8978ӱDLqkqq T *d#(@ P(@i)`v 7|;z@L}ތ%(@ P(@ P& Rzh& fcd'(@ P(@ P`: \\|)Eӽ-B4^EP` T)@ P(@ P!` k+3 KQwZ{`jz=/(@ Pfg%%[R &ׯM +(0- dݼ}'ӂ(@ PΡMy11X}"'mQ5۞8Ki%`DZܲ KR϶U`V}r}h_*Ts8Q(@ x?/6)/y4Q` pD,|2@w~inaӐ}6&hR?ߝzsq; 2!(@ P \o|"'Q5:Lۉ@A*F5_ڜ\I>Ce?'(@ PomŅSama4P` 0P5[َ~?]gQUOLBm)PxB P(1& ?LhS/cn@"' T'~S#PhYz1؆E񄢌Ei3+n1}pFw썈}x2 #}{/S(@ PF'~SR? 4PGT[@ x{0'zFXL,b-{"d8 U< @ۇl(!X#k7DHVAhGa]DJ.@II-Ȫhycl6dw>Z8~S#URjtG(@ Pc&N7lڤ(>[p~H (`P>E PS$SM`x:RfGE%l GmԱĸ5aRquz9RCVGD +ґu&d8٤I/k=u(xjc_= #H(٦RV/YX{m}hm8Hu(n_,m+ (@$Й?V4;1wEO(@&HM P8#Y FH˒G}hĻPLt)He; iE"PcIYف[){P" RY/ANzmtqʘXCMg Ěߢ'@MX*H B+}yĮOYDM#N)%o4G+" 0P5Z5(@ x^{*r%ԩ4PI<Ppṫj|F9rLz|ϼQWN9ЂCD%e[tjw?$%/ cA*[p ́ (^t{*;Q9V# P(@q \ӟ`^@]͹f,|xyyɓyL &ZyH P`%jlyEFY9{@D,VFX vEtŹ3XX]M=\1@V a`su6Ht buJPa)}8YdYl\ɧL(@ P0 0Q+mPK <0P5 T+r r5Ǝ6tZ'!Wvt/zd=lK9WD/tu'Qz+ jXy*;࠘c-Zn5E@n}.20mndF PvXa Z^{նte& 33mR˿ֶ]{TTOԈQrVMQ̤mݕfekNu5uclś־54#O]$kE%lZrf ^Jy  Ǘ,9㕿H+qkv P'$ /D7%I\;QZg1jGzn$Hd-ҕGu>YmH(Ԭh 4GWP|-Ww]oŎK=qWP*ة ǩRlT~^-?߿OD%tNfL#7nnpfИty0eA~)QrD@:Zwn?uRp1:o`.ILxB{uIxxZ_7x(wqD' wKb%xyڑT#G{rVû+Kg$#oc&E W`i ht @ѣ7'X>?psm M:U\r2lHh0 #B`+aаzB ~GOGtE' 9KfNUÚKb3?u%B!It $Pg*|!c].T~؈QA _˼h~b~O p6 @;=땿5kd-q Z?>*x7.o%ƺ{ ̪i-϶@@@(^<|revyF SOmEht?LmWQbwUB_vO@@@(yXޘBSԤIF {*fiH^_&RN+@@C"7WfL&$:Zq+W1* q][TezTK NS>?:Txi{k֬ƍ[%K4nܸVC   <ܢ*k*#vr܈/s6re2͟?e: HT䲺'ݥeNl#C%eޡEGE^1 U:&k뤻*?y۷o@@VB7 ?^7hĨ4.Pw/-Λ7i$xul[W6fZMWblå{<[5F qŵ{eyy @@@V S^FJ={TOkѷ'w (ٵLRAMwҿyfwq]?b@W   OΪ*O,gi{6WV?tw{޵dn>u+l³&dTuyZ뚬?s݅"rf]5Un>M @@cw5F;XU!wJIi#{f\GZTSnG}w43.KS@@@@/N٣3nmE{b#F:^ oWBuw NN鼫 rUS7T*%]z]'4.BTOZ#    8+*7iW\GHWB""\!  9$:ǽZ;{n5_kOM25&/S/e]銋qaҜ}lC@@|^to3sLE|F tu{;աS-XBn$Rޭy[ G e@@U#PV < gNwՌNhEFkO|V_])$%DG\  $PYPK+>3S!3xnD :RCGjս”8A3X@@@QɓUkyAه 3bT@sxs;   @; lؠ޸K|G?/@׀   @Uq}{hB׮f3T@HTu0@@@v(PCF?nĨ ߵc   @T9ʟ2EtϹKgfֵ;F ZD_/G@@CT`&%1* ${=   'xCǞ|Ҙgd#F_D!3@@@V"7Wy&INk6]kQ@ Q,@@@pZQ?^Uz?$&1* $c   p˱}1ii5s#@*p֒   #P?h"c>a*nj#FKDU`'A@@^Iz/ګϏ @$    @'>*¸sŋeW<U@@[S-Yb?V #FSDU`+B@@NDC=]|N ZDU@//C@@G T19s⋍\U @@+VĆ x^v5bT@ HT2;@@@N}u1ΐhW6k <$g)   sU'O~ a-n`Ĩ @ 5f   j/UV130h?UgK   g(ug]GU@@ʢ"|tdMK@ 5g   @ Oq^P].ȈQA Q\l@@@N(zIܲGDJzΘaĨ @ 5g   @ 8vџ̸h\׭f3T@ HTߚ3c@@@S:|Ry!!5I~1J $v8   бvƾT?};>+@g!  #pWu嗍 E|[~#F[DUp?G@@]"?_OSy!{+~zBC=Ô@ HT  Jy'JVyO?-$s   nEؗM jJ8   @wc\5u]u4%@)   ^ ܺU/6ڇ]x<MDt8   Ь@n.]W Q@ Q՜@@@ޗ:rhS$}p#FhNDUsBG@@hRhѢ3םw6y '@HT5%C@@@rrTCF}ވQA Q@@@\UnY*/w6(gOw U-)   @@ѳg>bDDUKh   ׉u .^@$Z*F{@@@ ʶo9s [Tn([.F  RU-=   :<~TY Q_Z]1J 9 :G8.C@@M odUӎY@ݯƈQAUDչq   DūW7f;QܹF  UZ@@@ *.c)~Zl6#Nhq-   Nk?'qcq=X#Fh r=   a}fuZe@MHT #   'p7Th1g#Fh+Um%I?   @ TX_˛4Ir:ݳ Wߗ_Vh^%@ HT!&]!   P/U~c:}/_5bT@ QՖ  @: rͦ{Zzed@kN@@@?ʬӋyDR.8xPqW5*Z.  @#:F@@:@UjyFEϚtN_  U7MHP/iĨ  @V1    Pqp{ܪU ˈQA|AD/c@@@XYY}&G3k=C@ Q3K@@@@(?_ۍ#R}~ #F%U@@h?AE< .PW^-,3L)U> @@h@E~nIr:u颾/Иw $|pQ   p.Ϊ*[Iʼ<>>b*_\Ƅ  @}7+]wz͜iĨ *@WWq!  -(ٰ}B -腦 @ \  Z|~zOxZɫ>}85@HT04@@@9iz-y41r*__!Ƈ  Eҥ*{-EԏӦ1* ?Ub   @#:rƙ'@_HTJ1N@@@Cz_IͦWH%@HTb1T@@@ZytMQ$m(#F'UZ@@sNiXtOKS̃1* c   '^{Mǭ/y+~Z٬W8@ Qϫ@@@ ʿB?1g[D R*T@_HT1n@@*izބ **23zF  $u7  @r1+[@HT1v@@ +W4v[ˆQA]D G@@(۾]wi̱f_Meĩ .@W#  @ 8CcJ^xAaÌ@ HT*2@@8gecns(@ PHTJ2@@(ŋu9u:<@ZM  !pjn>1D]NgPApL@@]PnA:}=PſB"#1J @ :nJrX?np   *~q?Pž}FG~ՈQAQJ VQt@geoۡ윜3NJJeR͔o#Gh@6@@@}|859Y|ЈQAUD+[gV^j(U^AϲU}f/ˬZ>GJ܃"  XMnXvۼYaq* @ 5ituڵiq6ISH7\/T\tǫPIQ>Wi̚>L`gκ3!Y<_AK@@ *)QGs>bD0uFȪ^y;I[wC7C($UugaNАњpeھqRhe客FJ@@Q tkL׽*2=݈QAADUcܵyt۾Wմtoc5r mv)Jz7,VcC!  +P:~1A嗫…F  ,,obC&[OBMn92j}<".D@@8::s)W/[+[U뼕 ЙADՁ6i45J&iUj8lRQ~O#g !  -8)*!!%QBL H53_vVfjn?Gc=R  \qzUY=V QFN (*zoG*Es{LgԘ&  #*?3LjQAQ (uyd^u)lzr_4!DphdM\9Z;yHr♏h_>x 9AЬуhA@@8|Nfe^0bT@`DCY.IU] SZNdJUO?%%%5>]9   p@E~pl[FaQB\a&8 k97vThZffiwJ\i—UF qVYHD@@-O/0u]>f@Pnk=s֞ןԚZ.u_ GEZOwN1i'I/8@@|X;_گB}ԈQA2Q;rΩ{-k&B?!,QK?XW_3I)dxl.]+VhA7w蟻j+ΛKh  M {iW7-4 * %U]oVJK2uy=?ı*l_8GWn-qMȍ;i]fWͷ ;Qyu Fk󚇔y[EF)v݁  ^{:rFGocĩ  izv 5AOUgR$kmD?jWYK4~tUc컖oYoL)7sedggiբJ]72RC@@ {xxuyz/kS-oo@ :?gg=뿿9HoX_\6k2]Zo%}ۑj%,uRUbdUs2e_`T}Coylٚ:vgt:yd]~ydk@@8Gө[nQm5?^ x뭷~VnǎKZ34?Ax2gQ溩zs5nڽI%vG|g?P>Y;KuS7o-GW\U3WjM;mĴ?z岧  @g=NZ{Py#!@[]O> &z2~>Cx]f9tUXC&'[/ZG-YS݌t+K~~_ehOGFxV?ڡqjǿUm2C*##M@@:K*~!ֿ_NP#N@H^ei8kmg\AտsY1{d~U/-r"&-֖M4*jJY4!&u.k0h4LR%L)u)   vVޤI밒S}7lPB@ QմgGkP[zMStT}т;Um(IU3 k3 O@@nʣGu(5U' >O]oa~˲q* - QWX+Iefa \@S@@ukU 0CbcwSh^F  @أ}jԴeum*سMw5۶F@@@X޽*W[JT]'8@Z/@;jVmOn# U-6TqԒϗ%@@dNKyį^-!  Q^ҤZ15LٺrpFMMok_nM3U8oY8)t:}d/[c8#F@uQՈ_Xtܦm)YctHRjeԯoOٻZ>vH_|2yJKhH E@@uytrc]gR#F@$b0l~XYyc+6GY5+WBT{p~0rn3  @+G~YY ͈SAhf 2z6;oց+{Vm~wʲjHIM132 f@@@N}L1G~6)|@3N @MHTyh׀!#5gBU8JTbmX\Z^Cxx7ED);^@@_ވSAhU^~$URRr`IR{IL3@@:M/tߗN6saĨ Y/m?{W˔Z>f%FJ   ~*PppZ*^E1* +@žZ4%"b9.@@@ Nթ]u3F}ԈQAhqS$T  -p쩧Tv1/ײ%  K侗m\"!  :byآof A$NXVjՔ,)kou+ǫ{pݽWuaeu %@@:YA"c$1 1* +@K]5:I:4sgu(N_4C@@ T>Ciir:bcWu .@Ku'ڇZ)\)    ІUee5Iʃ^{Θn2bT@|SDJ=e}<#U̪8uD"@@@:{D> $\KNki}ڴ@xOsS/Sf] 4C@@s(6]xn([X{wQA<=1]YS,n=29cG˃H%ч[iIVǤ:%@@hsc>3 QoP7 zttKFdi[(D@@@ ~[G~U]6T@|_WZFa C}c2R2E V@ $  Zuߗ}l_V_QB2)Tc@yRT‹U P@@TPj U _ SitيuKAJb{Es>]4hD1   Z[n>0vYQA/UWɿ4+]}.i?!}I]1g=Pچ   @/[Q]^v71` ~&?l.  ,ptg?3BzR,X[rp OT5~h:n y"\2^;w$<<ڬ­Fp(OS5  9 &L[OP[ORubw jt"ljXr  "pz^z9~yDnj1bT@WW\;Ǟj}6txf(~3A@@/lW'kMStT@NDKV^9kJiSNҩҊZs@@p::kĨ 5SQN늲G*ޟU2KÓӔzASֶIj)I}Aܴg@@8@5uQuq* /@5,;wU`*'KY(3~F-Gw @@8i~h݌8@ Q:F%IRTK99)+V<;I?ʘ fZr@@m߮I$?~V*K_r( 3,Q ?tja]5|UKmI)9  J?Cg|ϓO*+Z7#*/'W4'#Ce1#4(ˋh  -(scnj뢦OW;4bT@ODk0R YӺ$w_54E:k>9 Q4^ @@Zʢ$UIn @ pBwj0\;JQJQ)/qeMRcHRLP-{}9   p6gU&LP'#G*~zBCPii5qQlKfHj   UƩ.eBv#N@ pHTyEtՂuojˏz\IЊ9X{vJ@@8r=q&o_%X^8@ Q`[]$X&ҀhDJִ7kA]lh  @ ؼYwaN<<\}7mRyqj /@%>ye.ѽzc'ZR{&@@zwQRea쳊׍@ Q:r7p(E(*S@@@@>H^NЈ~@ QZe}EڜuF  XU'NpZ ]NU@ HTyS2G.FkާUE]ߺBy˓/4C@@ 8 n]{힚ˍ@ )یݬSkܪ5劋4EIJz +:ًe@,Քs!W!  K]k̬krkBC8@ Q5ϴtff_U9373 J@@`8k*O쩾6($"ˆSAN^kɺ ЌNݱQIM\mW) a&# @o+ok*c걫V)|@#F@ xx~PX=y(XRxyʻŨl@=T.A@XSG_yE;o& rr*-2о sJx]?LKN#  _|ѣUu1isF  $3]1=wKo#eh  pVrИ1 @*/~$URRrO= $OO$  @ 8OҡT#cVo|/"T@<ȢxjٻΦd7+1W\(@@pZ6Nwln_rm٢;=ڀ  Q𶐮OS"rނ@@  S'_}՘uhBnUh46` !FJNOj҉  -P*^@ٳ&I/q* 4 QPzKמZ6ш0  A,PK*7Uە@HT5'Tw>4M)h˔[4C@@ ￯5ݐT7 Q@@lv6s:UdIY3?|E_9?^ݻK5": S,{E](! @En}{?ϣϲe1vg2 g QuVɒ]5:I:4sgu(p @KxK3zu 'ە h4D@iwUAMһvU͛uP;C}2(^Q4{|/[uMd%ا-B @@_:t5WV7ku@Z+ {$T]3]  87^}7f{9~ R.r4LegXƒdZ7I)Dw  )pz^ZOR5LRuw{"4BKU-X6{d"v J6J3ڦ=2m:hh  o T+;QUA1nV⪟?[h @kHTFkߥTq#  Ί 7N1ЈRW_D@ QՖ}R+F@@?ddȱ}1Ç2D Ԭ+/z*R\7  ~$P:ƈ P^!=zq* @X[u8r/T.9p=ięʩk2t`3A@@J֭{1FhP_u8#N@ QfǛ4^o6o@@|^W7ytj)e6 @;_;v;Qv:F@@MNX_˛8Q6Q٦i@@qR3Ta\7k> HU簬G]sK@@Dger(TzKaqqF  %@Ꜥ#]WY_q   Wӧ5/$­ tΒ  t@W2b͚"IePAU-@@ =0nmP_u<؈SA@3HTu:D@@Nlެn3_Z_nƩ! I$: "  Q''7O3ꑚ @ jks 8  ܺUƎN6=oz6|hA@[WDe5SAI+HVw)PE@Ə?#I5mz/X!c& DJ3Z9(jQS5f`LS'kKwkưȳ$  m-Pyp7VF  "MDIkju\  T'rmAUdٌ8@|E']n$%Ej6  *)QUWΝF_]=y\YS _OgT[o*>fUeq;  @~ IeCӧ\Ϟ߀ AǗw5|ۑomЙGUo[<;/>*;J\3<@@?Yx# !U{ -@P<ٲzW;M+juV@0$Ν{Dmu4C@J_2X &T"!DAlOA w$-X~FvV};JI̤jgt&0#  Sɬ|{L @I ܷ|G0GY|xaf/[.  @!9SWUQB@D Ty}ݱ.LW'*z}[;Sz53R){Uv >   5*t$K_A @ ʛ?>ֶ|en+٫ KKɟUV֩n-y,==U2 @@RfRO~<߆TU~&n @Ty}W;sɵSss.2A?iqE)Um&u0t<8m SLL1Er@@ ?3VR Ԕ*@(@Pu/auez!7Fj†z0*&k~`S8aΌ\|S]wFe:y">C˨icU(|9S5KܞS  @ !URrR׆*?t@@OʷvoeH'$(r <{Iȝr}Gײ :A4-FeaMժ hr~%\A@@!թSAFT^: %Q:WO&O?ߪ)RR9uuonkX,B݉z)ڶadʯ.>3kܫ{UnջգjHG~;Cf(>#@@"+*ׯEt|= Cr_?Ϗ.'ޜ_:zQmiW*2%+FNӋC{40A_9jS9,# %iSt#Z'ץG@D P2^w7sլJKTvy<^utu.㫮iz-֫o7[ooׯnv m/f}8G<ݞ   k%=B)S.Q@(U֓M0ysqj|M˧깿9劯v9/Qp УOȾazX=7'麬gZaf-ͥ75gHU%G@@LSR. $쎤"@FT~ i\֩頓ki-Z[l9'v魑MϷ|E;"L|?kB)NX-/  PlH}{]fNc$U ; XFTy98{#PL 7ѷgj~sas(TyXv#ڑw}"C 'ڰa;軮d;RA@ L *ys՚>]QF> Q}>ʼno{5tsyPH|QeGOsj7:K?r uFS!6[%ƴ@@"\ p쩴ۃzJH  $υ>cV󻩿oޝ딾7uU/ܤP}j=~nMﮟ  @I R׭ b(u팤 a@K T]'l[hYs4i[ϾW8Q~MOn-횾_ By+u!YԜջ?_pTkdEpjb?£ @($ꌙw],\tQ @>t@zWoFUeYvYhՂgT'k7 ~)Ru~,GSSO=V#r0x<" @^!jU^@uso@"NUJѷ?Ӯ D|<[#iԦNx =U(5V'jܗTY'saR{+ s꥜#lHUwR6n\@( UWoh_oLgNԮ֮ҜD=qw' e_QۛJ\\Q5}f~ڼr>@@&8 3˖u=; 9ڪt꺡aCPTV eOg\\cb.ӫwtԜhdƆ:G+^v@(N SԩAJH W$^sӮ\dJ:X3Fgiz~muPUЭ7UxB Ds'$Ԝ:8]DN@õoV[_a<.  PHn%S*hQ3{AA@ |3@@(a3ggJ9uO+]Z5'NTNJE@pQU8@@ B w_~f߹mTY3YX􉐞 @^UEx@@b*`WOϛ TshjR T]!w@@@[8#(LxWKR]g@ H /M;|F@;pz|Θ@֤T@ 3s=٢4>V|p@@ !UVҬWs$i|F@ 3M;H[cC@(9NZّTATOW.] +@PU!w8  @1mMfļ]ݯty$@"K%Y9]Ҧ  @p22R&LzPRQ8=@ U*h0@@@??WUg"  @ /wG@(yNV-Sw@<u!  @^!L7*׵k7 # ! @^!J՞7OeZ n DAUĽR:  p)ߍ  pMQRn:ukRq\sG(9k|a`DU|/<  @ d>:R'AV =ѢE=pjHںޖ#DU"  @@)%=v:U,\&M P86ZѴi͚ȑٽ? >^ *N# /M:smnHs=L`A X 9Ѻu/w4iR@ΕՎn#@PUb^5E@J@w)LKNGpҥ6#@ ^GS/GW; Vts7E TE+  @!핾sgPժ#XAZ Ξ>Ԣԧz!-"^*_1D@J@^!UtnHUK=E Q9G9?> z-}0^=V!C*  )WHULdk ώ @1KGӧb>sJ_׮>Ny @@ vBjRّTTajyx("N͜ԩWs)}{TT#@IDATZt@(glQRػ7*@ _;oݺ,Z-޶OÇէT4$@P剉F  M׳Ǐ=!U; @64iRfݩϳYЉ:u~ѧV|YSA@\AUr@@k-pf*w$sTWRq)}6 h۶ӹt>;rC|v($@PUH@@pN-X(gHUm[՞3GQ*sW@ mڔ9o4G~x zʬ9EAtOd4* 6  /ptpH)==Z&t@$ .u4qb@s8:v̛BݺrYsLFNyUA T&B@(4oTrGWL/>7Fb/?7lpdGM٩}9֘6 k7&Lk~ͨ"@@++0tj.!Օr-ƌ * kזk@t "}@@  *ת7N@R'N8;т[h׮KEE1z*9ZAUQ  =dt*/*{ws-^hstyOÆԯ_uLySUQ T@@BlO?cr* 6m)ިzS ~5jD8?%t@/R%NNȃRp"Hȑ̂|hҤֹzdFNCD&F,@PUφ 0'AR y?A(+6@ t4y-hZ'¦v56VnS>~חQ*ό D@ 5U֩Y{ftUܰaCT )-\(==؂СUȴhUxf@@ 2}z)u*ӧ\ϞCLGggZ[AtNnSBuW!@Pux\  piw+[7m|33iT*!@ lh֬;N;q"/[V.?sT;r̙3Zzf̘o7JAU@(:oў핱gOC+URٳU] ]`^G&4vl@[z{r夾}}8ЯΝ}*U*réd͜9TΝsيl*~ @@DW_ioǎ!!UJ ۸q<_\ fhTG]^Az| N<S'NԊ+Bw^VlT3  pR?PI>/o4QRE׭{a>#Jq2W9Qbb@[j}~S\\S6mrGN٩}}Ξ={w0~lɒ!@PU23D@%Kwo9O=Swҥ2@(vm@SdJJvF[~isժ_ǛicsNO@ѺQV7|khU~  Pܐʬ礦=WGJŋ TA ucܺS&ټ_?F{}"p;mâE~z-5O>A3vҥX^#GT%C'HoDPo! D G?C!!UY_-STo†@Z?txڶٌ%>g—.e˖eStS^CÆ SUL/Ѧ TN@@k-pGxB25H.cg~!E%pcF9z@ oOb:u{|̑S~Tbb&OYfȑ#Tm۶jٲ*V:lFP?G@ U>:!S3Cs@ [bѣ={8um~w-Df0e߯U יegOf͚JHH0Gy枮 T]g@@pΝӁGQY<|T9iGBZo/nGN dGN"tƍӪU Qu;9޾}{S^uo#]ސ + B8.C@[ `GgT[NUsf(c͙ckNk)MJwlmp_ (5bi-ZpGN 4Hkέ"+b"@@2S71tkL!]6@0lͩ3-\(--oڴ}&Vȝ_jҤI;vvܙ?v*fڶ]^z!#@Pu9ZE@@)dR*TPm:TYs ( +-ެ4|_=ݻmٲ+S72שS'5nu4BjFk@@??hҶo>f?Dժ:|;: phbߚ5NvGZ_BBdDO3Ȗ,YbV2Kj޽pb=zлwXO *(I `~$}N׭X \޽ _旣2KnKKݻ/)SÆ9֜ڰa&Of!Ckc\jժ;zwުTh@aT*D@Ji_+Ǭum]b># ؂g;& QBY.ؚS4l_T|dSv f͚eFM?iQN0S7֞bCT7s  a(pܹ/e1GE׭t@78Z1Lf8EA r'ʪsu-[LOpTxSkڶm+zM@9s?!!$*Ӿj͞ä'<&-[2MЎޞd/'sZAUZd/gϞ LMEm6jݺǕ][n#PUE x@@ JO/?hj#_RAAؽرy >nsق:Զm|+Wԇ~`<5jSCՍ7ޘG+#P<{@@b)`k<_܏F1$D SgGMMvm8S2N&M1&׿.};rYfqƹ  @PogD@@Y=j:4qۄT!2@+8ZۺSB=WԾOzճgdDmk*~zcRҥ;rYu֟bC "-@@lHcGoߨK/lpjTG3ft7> `|nt_nSSL1+N!go2С[ Es 0{t@(h}dTU_U4S@,wYG/{ժ~t=N:uJ֭37 %%%]z_~n@ժU+U^u4B \  58}wW]Auu=}Jht(y>Ѽyu.w" c4۬:m4-YDvRJf%>1bڴiôj/hyt@(XSY1*phЍ4P+sAA#p挣 2~ըwp ZjL7uv+Q}n1޽{NyRU$  %\ ͬݴ)X„T5}Wq&bC*>aB]ܹ>~I舡T~UyUX~ƏoFЁBar9R~}7Csʕ+K+!@~U q@`T3u%8|8JMSw)ˆ#m#;jjSN]o6ZUn &2 6Ι3G˗/ך5kk׮KÜ?[JGÆ S6mdWcC :?F@V ԵǏWjϜtO;M0}qze=OCM}%#/9sY}bK,1w c5jԐ5ewxU 𿨫&  @ 4Grr f2!Ŭa+p#;odG6y ʔ nHUlS;bjŊqn0իW/S4?=+ B8.C@QPuW1S =V[72?..)@ vrȠSDԣgD4ȯ"/Ncj֭:w-StM7c Ol3  PܕUʴi!U|!8W`fǬHp}SGT6>wOժE^87hn8aO0e|G[Nkݺ6m:!@ T'wC@@ѣgHO5ˬ~cUr°@1kGc4iR@&U.S;sT>EEEV8Bv-u(3CnV7۷lXņE+@PU|;  PifKRJ۾=JRCqoCb'U}TG}Tr24d߄1NٗyfwZ߄ gOnP۶m_nS<6(6UU   @ %,gP՞5Ke;v : G+V8ZQbb2ޞf.;ԯ_dD?y8MsuAO06ӧ~a3屍|Q FAU(@\D0YuUǬvKY@ dSvԬY%'{{ eV󻿚7Ӛ?;rʮgl5kt 5vj;Fy6 PUEz@@ܕyF^}5֥4qC 9([}ʔƍ h>oP ;/éMe dnQtTMA)VD+AUq{#<  p6J9R'y'.eLZfUTŊ!8NqRcfݑ^ݮg۩}i^fHـ4x`51a<AUx?@!q㲏e}`5J>S@ ӎ &yz˧/ gdd?իeoܸѓILLz{W֭u7zF UxJ@@velΊ&曪c P>7XZI6JH Ư "T pM<ᚥ#Gx6E;[UVt@   @)S!  jOr={g OǬFU͜СC޾DOHkPn-);r?vـjϞ=Pl1x@۷wGPNyba/@P  @I8:_Jfś|y2 ,gdž+Y }2L|7; gOYoԸqdS'jԤIakbpjkNmV~u4B wIO@@ uum*e~gC1eX w35;oVJ l]/c!.:߽NڵDAU[z *थ[H˛Q5}W~3  VDǎ hBo}{ipJN}嗚={YpV\9j޼~awTz Eq7k~}<< 4{߄Qׇt/3τ\'p*֝ZґeJwߝZ߀~կYԎ;S_v>mf7p@~^/0. i3bA8x0U'U6@1<9-[b+s䔝9ԹsqF֭7gĸEЇڵkի{6 PJG@8{:8r2eT7lXqv@q4~| O]kék~uS2N ˖-Ӝ9s4a;v :wNݻ*U:!YUY S# /<]YMm,@ oudIfA˝gz?7|*W.r)[?tkN㎄/Sl(ձcGuԉp*ן"W*RC@cFO|1 ={رbB ƍb߁jy\2ժ]/ 8qBӧO7&cܩ}ifSN]VZw>/rNDHR@@GuԥʹUziU}Ü2#MvJcvʽMΣ5kʌ+!m}7N͝;-xb={6g7oެ8.9ʅ Ӵm۶ܺr̎jڴYMF PU˽@@#?S-3w{(Y.361Ӽ[!C4ȯn`֗+]VvJ-e5vʕ+2 "@PU(@.0 SfLέYE֔)V-)(Ԅ &N (97ˌ~3b(r)r`jsŽ:t'Nu5eGO:Tl @q *og@@+=~qA3?)_LL9 P9Z&+ޝ"t*_Æt]/ v%uwN%%%yzzftf~Bwʗ/:!RZj]  Eg((c߾F]կ~|=J@Jci}(vΝ}nA^|R%rFN;vLgvM-]xx+^vm3qI6@-[ K*%JDn: E؛o LM7ժ5}ʶoa>#P"Ξ,>iR@ 8JM-}f [f@UNS[lѢEܺS揋?/rd6j۶:t`Foo!a"@P&/D@>oJ1drn ΂*<>+pd}Gz몭9eWÆNUN;vx04i֛lx㍞! Py@@ b̬GiSHv&(ʌbC ,>~|@}e/SFӧv|f_ᔝ'hŊ7nnݚks16+촾[Rl @TEK   PR7o~S8}׮5t*7 #sp'C@ԌScՎU:]o_Y.2);oJ}SJJJEҥ={R ݓ@   v'}WrrWfE>xؽqW#-N:tiPzR ֚:t ׯ=zuF8IF Uxv@(ٳJtwB3AzTL @x l0#2GO}Js);z^l5qD7裏Lqxom8տ攝dž$+ \3d%9g7n ݧZ3f(Fs@ 1aL@&}I}4|_SRN>|Xfr)R_zzz ~3nS6mC@(@PU:}F@B8nH7!S'Ta!8+;7:5?6+T׮>FFԠ;w[NN Sv}ziDCL@@ eۿQWj)ķ!P@9Z֬qq#ժ15hPfͩҥ##+M:9M.tn26;i}͟7xcn8h< cz)㍐[Fׯ:fRY1I FhLGǎy{@f2~~{dSOֺuU}֭0ʖ-k8qGN{ェXhT7 @zRիCk !~}E׬rGNm`kN9>=u uky4͛7O&M|6۰f)R_BB0z}6@oUޜh *pzb2DS<=VG?RMҥsbb%hy]jU~pD_[ }͚5f49rӻjذY:t"F#@ D*  @vNG^xA .`Tq&bC ֝[7kNUlkrJeddjwu Z}0,ߎUB@8kG3{w L9s{)Rs@촾ŋMpGPy-nk7uj()i&0EǏׁ<D@j mQv# @ T-7F@H/ஙQU_yE!PD{:Z1#=M7Iz5b_M8eᇚ={5]vQ,~`Mm ի:!\Ar@p9yE}ULx2eFhi|F ;9oGk:2ebbn|){jN}iӴh"+/_ ; ! P q@@x ۱CMsvI[{US]N3"pmNp4wnfAt;D+%$4h_ի8tɒ%ZtIPC?Žԩ 캩L2 @ T-wF@0H1ӅΉ!=)C9z|J)m Zqy h3}ϯH(kܸqnͩ-yoلt 2dn喼q@E@-p᧞R)3W /3ϰW~t{8& "mk׮>B׭ȩ@ /B˗/wM^ZX~-޴iS~#AU  P 2̒hJ1J4#8bl@RcNunSOÆեOJw8B[ׯرcT=z{ ;wSzR*U<]G#@ *w  @18l '`W-abÁ-Zh̘VNP*!TqqNmذ-nWSluL8NzSvT%; @   Pv1F6TT > ` }Ӧ93'ݻݴ^=)>ޯ}&)éܹs5ԅ[b> †QtM٢v @x T@@*st`Lr'Ŋ;*߿9 p5[p*֝[ow쨩3N{(cGJ-3gΜŋ =,YhnkgjouUȆ 1U* \@rfMȥewWSu놜W"嗎&M DϜw_sj֭iӦFvGN]W5 a"@P&/D@8nFJzI9))7R^R_iD2]ٳ1丵/wqv䔝g ?@SM <,N0q*}Wƍ=@ @ 3J~14|*QL'bCJGY.`jN92uc™rY42mӿ_t]\ۄCi?LcǎyzUcM@۬Xt@"W*r,u^{l5_D>0F@ xfZ0]@ 2cf*gC:K'N8MܹH*[NxkDn05`_q 6hժU`vqq7\\9s=ܹ B1<8 p)Ks8MT=B@@0E fzRgy$)K;6-`G~;b*Ӎ7J͔6n5|é3f5  >PZZ 75p@3?/<@ O/I4%Dܼ3 FI$ a-j(7ӿ6\c({aC:hD[ 1S <XGYΧn{Z_JJlif ;elvT.]ܚSveZh @AUG KpPG9?'K~в {Hmn^> @qp#P3uq*7h`UݎZ qɍĖV 򹣧*WߑS;wt͚5K6m23cCfРAz||S)q @  B1RKk5`|pǖ/Q<ho{>!@ڮ]oÐYS5'NTَCqlb lDo9eWק~w]Rfg/o&{weA@0nvZ'wǮgV y\化?<Lҿo>[1o&ըū @z}0L][֭Uy `);jjԀ)UH}dkS9rʆS+V0}*;r*99@TTڷo@߯osru9{*uGAU+ɯV*k@ՖWŸt/*TG\'M7̏]U/gϺ_45#ze; @ 8fґϜꗳPL*?󌪘~>؂S4zt@[zw2rGM 7}fJ[xSv G}djnMɓ=SJrGM`ʎ^~rhYr/r~A ]\9>|azr ԣڽΜNSnU *]SFeֱ9 =K)C/ h Pn٢#F'8rjMXS8dQC3z{At3Mݻgӧ3:tf̘֜Zv}^6FLiTelZdžȑ#ըQ#=E$|}Q DE@| VD~*zmsK /pW.=r=F_|9D@ h*;or .|`X< ol1t;NcC@8 TǷRdϔnV~_m11( X %?Nb!WORϐS?1#2?6NWB{86zScƌ1<2뮻LAU@+pHW2Djfu2׿2kNٺS_}Yч im>|>oVg͈9sh/پzn85,2p7zF '6ͳ)SmrS -2Μqrc™i}7{]֚kAt[ }ٲefJ4͜9SGe˺ bvj_ʗ*4B@H8}y2RD=o=ҵ*{w^PC&Z8), C =)IMͩTP-ʤ5}Wx )P #ѢEƍ huѝWesk1@L*^Xa>nӛ;Ozz@K=ԆY0 @89u?0+ʛz;UZS쇑/YQvJ_B_7ݕȩիW+xzs5ktW2dZj! U 홫f}QK+#t)U>DrdOujЛ}|SMAu8|19Z< zzҠA~3z*< ; 6hY 11Q|F/oW(`4t)[cC@ " _v*!gs%;g=>s4iI. @H1CM(h3ͩeU fv̊u8W3FE3>nS>3g=SBM_b-Z0W=ұ! PJ ҕuk4D@Y{7`>j*U<-`c3GN֢OÇL%W`vĉ;w 妺5N>qqq)[oO>"F#@ K@(~G&6G69j}ΆS=zܕxek-_h̘1׿ڵkk߾}}탭7լY3ǻ7n[3! @ " @mz 9!_kV49vJv[9->kV派e˜<-޾OgWBxS Ti7o;GRi֭A(.]Sz*Ug@ ߈  pifų?Θ>![R StX|cj/ܺS^W3Rm!~|˗/ך5kL07K仨Z{su٭;eO! T]W" @>)f#F(phH;T 3*)Q!6EqO3/DoO`ˈW~>7*S&FN0jĉ4i6n(;fWkӦ?e˖@@` Ƒ  E2N㏫s ->iR^ ho__QSvZ>!M ЪU4{l]V~=u߯ᦆ <@ l2.@@K NLHv42Ӥj*׭[9@j 8f?6( 5Ln޼Y3f0'hmu}iݻ֭:! T]W# y:_[o̡ q)?hsQ+@ dddRSwxԹߌ"j}GTә3gSrJٰfo^[6SF Tre DiS(#(#))rTVő#Cqpl+>b_@޾aC;ϮW3>իb w>T2eL:t[=:{i #%.W @㊋@IDAT0Ũ3?1OF^1Sjb4q݂#6ovH"GSsoK>Sb/رcMͳqn8es=*k6! @ *@@ RԪDf>|R2ivUW_UşӅjO ƏuN&jΧm}ٿKAӧOku髯ʿætY]tr- \{ko7" ؀qAHۺU-[*reUS~yv Fi582ٍ|JHi i}ǏwW8q8[cccճgOuUqqqh E+@PU|; a%:0dҶoynժCq촾eé&Mdj/տ_ O8ljM<ٝ5lyvl1&4eC@ " P$v^G_]JOyr{+E׬rW&]0>}8Я0<© ڵkgyj!&<l͛{6LIiRA:b!HP,{wz]{z-^W{*=(wHt3dB& iS~~Ιs̼Đ܆˪u64n)ٶmQ}֬Y8{%2]oС9r$뇸8Xz-/(@ P{RE= 宅ZLbr9dIᴾ˝HCF#0_cӦM8w%PqS7:^D P 0P}=(@ Ժ@L:/~VPb^|ђeeӈ [t>-^Ղ={ڤM5v N/TcٲeζըQ# <AuF P K߿!(@ P@ɓHG̙ e^`4~ pCsIK`'Mg++?al\dI2. `{~pjݺu㏍)})))Ʃ 8P %w Sx(@ P Tjp(RO|IUI!Rb^z eNKR$)EDNӂ!!_rJlذAk-ӧ-r)-SM4:^D P`<(@ @ѣ?!c\# (rn;0oS0Yz.5z<>H3Iٳg+9T}X d>یb NYU(@ X`ʚ(@ x@ʻH˛A/` _=w8 S_|…N$%Y~ǎl";ƍ#.γtD7o6V̩zWcС2qFJQ(@`6T(@z=|$d۞ jy8۝;׉>s)kւZsGfNHrΝꫯb?AUqqq8q1u֖_ )@ P@u_K P0IJ:Xz^^eV_ie:_Ҝ[8ZjAφ[o.\0}"EWX!te܍:**Țbw}7:w(@ PUjoN P;qpJ|)c_$ed8dIapj2'+pwo-nzLv4oٙS:/i qXtEhh(F ?(@ P@} 0PUl P@ HMO"C]Vbkh( iZ믝cbg-86ݻ0~ͨ9պ233vZYp,X{Z^{1oիH26 P() Tyʝ`?(@ PUpʔiӐn[H~/*]~;z 7-vxd*_~iҧv׍;b={2^C PEzaR'?! ohxJ+M}ٳN̟'8uҰ*׿ W]RSɖذaCr-FN鋈:^D P[| P@Gw߹}=:Mg@#ݞ;1o(nG npJߨQ6DEyfp*??(tRZ ?c+]vFѣG[n*l(@ PR 8%(|IF&+ U+Br:ؾpZʕ$Siӂ}v(tJ֭[1k, zhO>2ƾ;1h \ъ(@ P{{ŞR dY =rvp+6x0bxݻ=w.,>w'OZEӦN8ІѣԂΝ3͛7(me)"ࡇ½ދXk0(@ xU^rM P?gqAg̙v[;ѨQn{Ԝ9cmZ~iH]ώm2iV?7⫯ FAA6kLn1XZwe˖^Nj(@ P7 0Pw}(@pHvM$Нiie*s"|(noԨy/;/NY!SؽZV8}q6x^p*==(bf--&w"իt>6 P( T])@ P+4&clU?s 7#Lyku YѣFru0 h7Ty^p*M/9X|9rrr, NS7xQ ]]}Ֆ^Nj(@ P.kfɦ%uKeʦMrekrݰC\ T(@ PrdZɓe^ۥQ"~ؼp57 m씬)'>¥>h@f| *}֭j$pdرc̩H)@ P-v eȖ-6=.׀<󕵘!C O3P'7ä(@(pIS"?+YN2m~_{ *ujřoh3p[nyJv{\۷ҧ:t~[o5N59l(@ZП04xdf0iIkft55A)"G(P; TՎ+ߕ(PSHdCHMu{meXͯ[7=`Z68hSDdcmxajNv%XL}7HLLԽ`Æ 3S:(p<(IJ:NZ40Fo`[I P>#!5.<Op; )7Pk5xA3kNiԂNdi!Jơa8 sgHp N?~| -Z$+7kO Kd5‘e (@ P.DҠf.iI4NZNt2I>!t)]&D7mmG6 0Pů P@ :#.I=#wGdxrwJp wH))@ϞJTR ^ ۍSmzV`J o߾]26`…"´ZiiCSVx (@ $ "ipIT: :Eext oPy (R1 50(@ Ԕ@ŋ%u-TҋMX=),~\鎖њS&:wi&,YX/=]ڶm{WơO>YKHx(@p-n4OfpIZ\M%ր6 i IJz\K 4xPke"@UM)@ PnAR}Iphʑ6xpaݜCɅA/,\hFvU6cjwIv-`ˍzSAeXn1Swu4PF P!NLfI3tdr̈́ƀ4MiIHzL@ kt@>QS;~QW d1CsqHDo"\2Wi0*᷿m=HpժUF`JY-<`ԛٳ'W6 P `2Ws` 6 0&s^pnMFdf/5d :g[ˁQ@}3.w4ۏ:TO?^݃lgg;WN||c-8&ƌeK Ni0/իe\_YNvtE!>>XO3(@ Pp2L$lsMBQ3v$*' 3&m|r5e\W1w(@ PW.E; /VIQ P]}e'}YS_Į]N,5s:nѱg4kj͚5X~Zv-^z+M8-(@  wS~f?W)E$(('@bo1|qqN̛琀7:L*i!6dȑ6DDxFp*55K`Pj}.\d$%{aԚTvJNp hI3t33v9NNf-'po3Jv-70Q?_Lj 8̚A(=&A` m{0} P@ do݊D-ei~'#WZN33$0l@\T|(@ P d^Cʻʟ͉G6x04'jُ?֜3ǁ}&yeäIv6&`Ο?/ ~#b]?;vhL/꯿zw(@+0י&}# 0s4d{2 [HbW_ӠcҦ4N^)v2_#ljMZS 8ӑiܯ' :44@U]'jr`>k!{Xlȷ{n$$$`ػwU{0fmڴZ^H P@JfI6if`҂fɜgfD)m:NMff>i`4Фp6 PQ@}8"/AdkhDψzI$pR-')FN,Z0c^`p F`J[(ZllA&fn2 qzOm/gfIOwo=c/k.(@4(@ Ԕ$=_z yͣTO SS]}/;|RRkx!;ߎ뮫vȑ#={:8ȚrX. endN lky(ݤA%ps.Iy='OlXJH}6gQk#GDWdZdN f?SѬHgfFik!q3d\M4(4ɜ'l(PK)@ P4k)S:V,wp +ԃu.] … 8jd!|Ў58UϜ9M6.]*_ӿd:t048Sjb!tkr .iIkGl2=Q{jB|ҦA%l2Lh4zjOڳ;S doۆGΝ2G4&ujed8`S9NYb?`3 oG׮R$~]v3m߾:RzezC;ѤI{QW `NӀf5s Di~ҀfC9eۖ\UMM%j'~P9̂Cl(A Ty`W(@ P% )pRʶ.]Gf`Y}AubA\\a֝jѢfRvĕILL4KZ}~ykPד*45n8{={4OG(@p] BgPfF~;rݰ{dtjn]\NN@d256 P> @D*ȕ.>,.-^\Z!˨EejSXRWs`585n N$vQ4m/^@|Æ c!xUЌ&s5;3+k&3IZN: < ˇQ@ 0PUo` P < $I)OemA:!D jsi;e•lqB=PmƌK`dž׳ ]V%.EF]2U Y{hٲ՗: f2iɜJWYӰ\_,)x(w;P\!{F PIzeh Xl2U-&]i3 ϝa^?NSZ{lhԨ~SomذA>WEO:c1cT,NU^g4f54 ʬdfBYg ^df8A'^iJq Q@ \O5 (@ PfAԠJ1Ll iQ"&OF@TT ,*\o̪D>L4N`͘5kQk… F[xIFЫW/qFͩmZ~-//hs44d fZgN_Yu (@`?;GM P~IKS4*jD?kYNY΁Uؾ݉l `!ClV]^/~7|lٲZnAaL)rΛhGgfW([}5 skIMf>zN'1(F PN(V 9cwށȑM@Eۿud'3fp`~kƌašSu96mdLUȹ޽{cԨQ21hӦ՗: x4I*5@4Ӗ_m4~2LA( FiJ((C TP(@ NKzϜ)feAAAL*\48uJR j}QsJW/0glݺYY b]uU|ƍ3_WQ>z 2ivr >13IvkiJӚOf!qs e>j@Y5( T])@ @ή]F ?/w?)E=4->p8gqcapjjk)T)}?lȑu[֭rJ8p@Vk]:ޥK<Ѯ]; PY tɤ_鵕$o]it@0mf>')y,6.@l(@*0PU,^J P'o.<,2e*[M2"[ϰ2ozLsJ&dֶ-BÆЧ QQu7OTBB֮]TK}֋bccqwKb_(P7Z5IiIט4k<.4IL+ߙ'}ԍOF PEjoM P0HIpC5'NDIСՂs8dWxiɘ`̩uak7n4V[~= ڄ#͆8#05rH#JQ+5I]O j_nof:5G >>06 P@= zx Pp/%S|.,?@S_#iSoNĂԽڠ54{ '&&J?`FA3gΔ[yt#Zd h (r@|23\krkNZhdN`kI34K!ZA`(@ xU^rM P 540ټ!4kȧB#@#J5 N-[VX}R'2l }{o_ kNͯ۶mB֚ھ}$s7oYiV֭馛$(P9'נT}fAi]N\RZJz5(C TP(@ x3?Z]7ry9MGa}צѵ;$#zpIFTuJJJ2V[z56l؀_~u(7hwyLE!Cy^ϓ'MdfCt_[_R.%֓8 6A(=%F P 0P())H>)ヒ 56)S hܸZV3^]w =z~) Lm M2Q77N:I0mݻ#$$ yO h'3ͯ(}Vɬfy4 4<9Ys(@ P/U H7@Y6m װRwSVsbJN|ѻM=6eCϞ:t萱2ٳj*FQF }#F}qZ})R0t|]OcEr2M_95<4[(@ TW (`Y A3G] F1c`(Sja֧Ee`MS7&hҤviԎ;tR|"+:u>^бcG6 r Be%C6Яv3E# J=iI7s;kP(@ ԕUu%ϡ(Yk"אW|}l)`&kJ^5df@ir j(=f>]6 P(5 TyͭbG)@ xCR2f2cF H{?V['o0OQb>֛Z̩;wbŲjlٲE2,vI?[h~I)A/ˡt|2RX~`ZٙYOh#@(@ PU|r\XqR: Ο/(4_5WJǶA:ĵp=6we`U:… 48uرrr ݎΝ;~ack4A(ZPA) BY L+V@iyz(@ U|9v P5 )R?Ш?,[t!oaX zŹ*uZ_LL.Im֭شi6nhԚV[tt4jB뮻Q: :#E4 eN Td-yOw'33JWϫ&ka`|K P(P T!6?8 zn,7l(wX?fhklǎMP0@}0p #Fj} V\iΧYSK]l6hs JZZwJ3j^@Ø44kCra 6u|2$Q(@ TSjI!S3f wۡCW|q:lNd]\t5i{Ca*hUveNi͛7S,X'N۷zXoCX"-4JOf ʜe=hs]NO1-`F P(P Tվ1? dKAӑpILAt)<_ɼ+-o#1lX4kdz-[̘ҧE3+xwm7p@tKܢր:'N3晏yߣf>'}1'N(@ P0P7](Ndz_ʛo"{͚R],_`& 1\W|yOf k`FPjoӧFAAA馛зo_cۡ*d3t$(=^IR~ӕʦw >>rJ^(@ P+i~(@/?s3gTyZipj)Ƿ׳d֜[m2mV"59۱45`L0AVaaNOQ*̠9=ϵL42F̩yff-7Qk(@ P_*ᅦ(@ȖN)ヒsd6- cDT<\c۶h);uUxmUN9rV\>j)MxcΝ;C{3D(sZVDYrs j5d Q(@?`n2H P<$0z"qlb'cn5N Î<` %&&u*ڵkqy =)K.F~A~<`?+[l꓋+i<׀b6T%ŌiyYRA(~2OfV%(@ P3Gv@#]2g.G:b)~U/SŬˆWJII |Z]ѣGC3BBBzVt Ӳ){U\Í:QOfUF P(@o`ʛN 1O+>ڨ7,D0{m۪gNآEYS;VU vtȖ0`1iӦy/`9]lf Jjvy_3efDTi wK^F P(@/`KnI P@2/Ǯ?dZho-h{Iq; U+\ڵ -f#{*))EGGc>|84kyzԩxZ'J5CJQZܼF4Lg)wG.f(@ P 0PC7C|S A%p NM4P'F5F!,zٳo1w\1;j0x`ce>]SN٬V" F=(3 (jhce@4efHiar(@ PL*?.(a;k.<.џNY.4@eCDD!gԦMCU JիN鋈L6Qgd3PfPQK]i,(((#+l(@ P/(PŴi$f0J =Be/33JRf̌T݌P(@ P+NR*P yXK/½$< c }a@T9u)[Ψ1qFݻЯzce>ҧ֭[[\+/Ҍ$4Clf@Jt5#JQ:m/H66 P(@ P}c~(@R J| G-7a:r,YR<ɓ`Idd^1cFTTYFW3iJ3r, 5D˳ylQ(@ P(Po?v,'[sw>'uU3YD|Mm޼LZ 5U־}{T߾}Ǯ]J0L;k)i0JS56)5u%=s>j3(@ P,@vn<, ,=t#Ҝ, _:uܾF3zj4h ;1zh#sys \yY7̔JcWR@u4 [k&l(@ P@ 0PU@ P{{x/KIiT:vb LxtQS~~>{ڵkUb֢RZcJw*n4 R_}5 !4:m(a(@ P 0Pc7á^ 4MCp*NJ+ 84NڠmSgΜŋ1o}d%T~U&͎U4YQ2j:;J1t%=A)]e/X66 P(@ P*@(@ Xس(N?UB\䢏W:qU09pMFvԎ;oºuRS5\T֬Y3#S|7txٖ).vJ630u彚l beӠfD%/`(@ PV*8(`E@S sW{t>ƤCDUgΛXozSyyyqwuaРA8pj׮]ksfH锽Ӳ+LjilRhd(@ P 0PuEl|(9X.̟GT*NK)Ɛ.\\ ٨-W3p+⊌Ĉ#0n8cU>-M4jli{\d,͊-Fd3QZW(@ P@M 0PUӢ|? P$0?ˎވtg7KcDniAv|iޜ [6mJZ]O7I]ۍdtu= Ld3ifnʞfK> (@ P(Pg T5?Zt>Eb{zgZKkl;J@X}H8M{vaBtWNԉ'Pf*iZKK.FPߝwF NtuͲ+F4Ai\e/L(@ P(@ xUp Ptg%?u)sgVYۏpr^8q(j(,cgHUTVȖ){k-El1F P(@ PS;~Q¿EYz)f]+xO-n~D6]o7A}.T@V)CCպ5:>܃۶EX\rxDצEuN k*sڞt](@ P(@3^yi Prl 6|ywcHvv2穲h d˒%{BBJjH5d|hڹ3i訤:1]PMRZ\3;J(@ P(@`ʧn'C8<4F'iIDAT`ѮfYI?ڒSizM:t@޽RSͮ%A* (99oU"d׸t=6 P(@ P @?e>"X1$֭aɖ9jYS/6َv@6͜:#[AL x1mLkۧ-Ѽ9lESug4Yt4JU˾(@ P(@ US~NWvcAv@V7vQml:}olio65#];DK-)#[J]%ry'Snb(@ P(@ Tw:Xv-.\PȏT[NaDZqM6le\D:fI [lnGdBŴicLk۷-eJ_]g|2F锽t OiQv6 x~+ 0>#{1Va}ނ/( HVf lذ/^Ĕ)S}(5& _^}Á ka_xk7رd;s$E8.3ei|ȦAF͚IFԍjJTn݌:R1^@`~{jT:eO{RҞjkKDCܧW ?z? /4d23>>P/B(Pѓ@92~\}r\5ru[v˶PMi֏jhrF(!jir!tʞ>׭r(@ P(@ TKj;󇒰ĚY8v*?FPv;Z\ԽdԔ博4Aצ8:R-ղ%j0]5)-j4XF P(@ P#@US)SaiKj|4[jldNv aFVyw$IM''rD:yI54D6͎\ec(@ P(@`ʳ{CÆOc C0] d@M aԍCkEEz1m={uh E?k4#JP>o g(@ P(@`;{I:TmcsN"pV3BH0*Wuu=ɊjgZx0֊Z\t=g0J(@ P(@ U>p9 TG@Rwz%98w]^*ϗ̨hQMjn9 :E˦A(]]OS10(@ P(@ Pw{[##F> ǯ179 }q oO#}Fo~Hs]0Z7ˊz;U&P5tz0ͬP!%l(@ PP?9{~3W\T<㸣VbT̔lx kڍq\.8Ѩ{b:$C*1iNmo@ɐ*η0`i Jtu= P Q(@ P@)Gw $cƤ<:lR3-j~\~&+>-Rpd> DY2MO EImЩ@cEȌ n7R`(A*6 P(@ PUJufTj⫳h\06,|/M/L>!}.V[yyX6,{ƥF68#0DS4no_߃{"S5[^: 1jF駙Skaj`퍄L P(@ P,@'ߝ[5az>px>w2-<1f#pJƶU{pYr)i! CUh2 #zX[EfdF"J>j H5G-dР*S(@ PD+Q$nZ0cs1(He#b }#˳ 'e`q $fq!φTY4!-< GDP0D>si;ގ#/Y'N":Ȏ%PRao zw(@ P(PU 6vA=:oSX|;Rغ0rs -SN$BA>ÃQ | !2d@i&ɛ6 [(V-BI) @\ըb$J3bd;, P(@ P@"r^;~cBp`p'+G)Ur1<ͳU2}mY|ksqy$g2e%@8Lo iIA D^ JnEMV-'-Y.J * 4k6MZM$JKhL76 P(@ P 0P7R-~RjY% >%ϫ7䲒.woR)(__~ez΁|d_ r4,׶E\竍B"$(@ P(@ PG%c!yqnof 3t2gp ah8m75b!5B$̦Cn"M\rr0R|/Fd:t/A~M;w_Ӿbuʯg۾?5 ˷Z­*,?yK?Ȕy[mu_oU>pkd0"^J'Ȼ%l¡GХU*^N|L;ptSUe&[l@ E40jo@RnXu (@ P(@ P. T`nQǩLJU!c~ *hPIs[5P*jvy_#kn)@ P(@ PG 3aSṭαQ(@ PSgS(@ P(@  p_1w(@ P(@ PSgS(@ P(@  0PUL P(@ P(@`>(@ P(@ P TSp(@ P(@ P>O}~6(@ P(@ P@Uܡ(@ P(@ POSM P(@ P(P,X ԋ@>hl~((@ NG^hN<\P;{iM ;]_#^(@ x3&Og3l'Mk_AW*`sJu3 ^:B .) x@J Uҿi;nSeg®eϸ_ad{)ٓb0afŝ<ݤx*}`6®Pܻi;Tܡ $?3W!J<]OcFOVT5Hf-[MŐn'f*᎗ރwzpd8 dcӥTSk1kU:N.o?ۂ@/ot$.fT3H\M2H*_OؖÐP4kB;KE_SƋw/H߃g"⊳RB=o/tLjWڅײ?ʗrKiЛiE"* ֶ@"j / RGw %dپߟȻL/ (PG&~TJb(>{]'븇8 TA ,v?]T6]0%*!/g 2A*!{C.QxA\wfb,?<@zr|m*RM{W}=KNq)ֺ7>xuM>S'zd7) T*plˢkzl[Ӳs{ܡg ĵov܋q H"m4$|X>^#;]k4~u%`N@yC& #mpUq,}2͟4؎C\&1fVX@ܡG L@T:Fo͊>q( Y?CPDLމ^.n6"g $ myw;OM$*{Erp\QCy,24"=X0P;G{ODhC lr(}oxŷҙJ~iȷμW;h**ޯhS*9 P#}z'^-cKʔ6#kCa>v]kQ #?yY8{ n{7 U"?ߺt̪j'kEPHۇ<?ߤڷ|'7#Y_rTw׺V往'(@ PN| m=W|~a":5 `;CѦ8Դ(9]%{0ӌRV|6?42Ń~|op`~Pf]pǣBѦX+'fY<7Ǐ*A#GE2^|\ˢ/A Pww~X:H5y1&}g hm@Ѥ\fXwWW\j^>3f ݈\=F l@rMr~#u%PΗE]}ӿi#鲟/ܻv?NZmۮݟ{/.dr𜹴Ԑhif06[v*@3].Kp Է+b3xv@I^?=Z2[:>g>/@bO5xGGxr'{;^*ǥ=/O ΒE.6.LJAjyեsrj`|>y@ῒ, 3ELyĵ Gz 5?]KД'*ѳ&WR5G saK%{!{ss7ۻ"ZRO^+ep7Wq{\ڜҪ6| XʗcXqD⤞Ig՝y@Q|tXT70{GC  , 2/'_@ j>-qe#<]gi;T=} $QMtQ6'}.G}t\ b XD5W5Tlx+J掄G.~`'T 9Uz˦rSU{@ 7^z9-SgmF֧ R^#RӈCo1w<>(@ x@LtGSH9>2a&gxwܡ(@ P.~9> Pw)@ Ppg(@huۣfʭ R( T])@ P8cJ+#H(@ U~t9T P @GPu8 @@}t7/?uUڕkm @ӿtR @`ZOt[˩f'k߷'y @A'в  @aFwFEiϹsd{?= @ `Cn$@!p$3عƤ~M_y @ ӿ]H @(!U%j @ /`؅ @ @5 I @0TwB @ @@ CU$@ @ ;v! @ @DMB @ @ U @ PBPU&!  @ @]H @(!`*Q @ @|CU~.$@ @0TIH @ @@*c @ @JJ$$ @ @ _P߱  @ @% U%j @ /`؅ @ @5 I @0TwB @ @@ CU$@ @ ;v! @ @DMB @ @ U @ PBPU&!  @ @]H @(!`*Q @ @|CU~.$@ @0TIH @ @@*c @ @JJ$$ @ @ _P߱  @ @% U%j @ /`؅ @ @5 I @0TwB @ @@ CU$@ @ ;v! @ @DMB @ @ U @ PBPU&!  @ @]H @(! M_IENDB`ceres-solver-1.13.0/docs/source/gradient_tutorial.rst0000644000232200023220000001532713140546177023275 0ustar debalancedebalance.. highlight:: c++ .. default-domain:: cpp .. _chapter-gradient_tutorial: ================================== General Unconstrained Minimization ================================== While much of Ceres Solver is devoted to solving non-linear least squares problems, internally it contains a solver that can solve general unconstrained optimization problems using just their objective function value and gradients. The ``GradientProblem`` and ``GradientProblemSolver`` objects give the user access to this solver. So without much further ado, let us look at how one goes about using them. Rosenbrock's Function ===================== We consider the minimization of the famous `Rosenbrock's function `_ [#f1]_. We begin by defining an instance of the ``FirstOrderFunction`` interface. This is the object that is responsible for computing the objective function value and the gradient (if required). This is the analog of the :class:`CostFunction` when defining non-linear least squares problems in Ceres. .. code:: class Rosenbrock : public ceres::FirstOrderFunction { public: virtual bool Evaluate(const double* parameters, double* cost, double* gradient) const { const double x = parameters[0]; const double y = parameters[1]; cost[0] = (1.0 - x) * (1.0 - x) + 100.0 * (y - x * x) * (y - x * x); if (gradient != NULL) { gradient[0] = -2.0 * (1.0 - x) - 200.0 * (y - x * x) * 2.0 * x; gradient[1] = 200.0 * (y - x * x); } return true; } virtual int NumParameters() const { return 2; } }; Minimizing it then is a straightforward matter of constructing a :class:`GradientProblem` object and calling :func:`Solve` on it. .. code:: double parameters[2] = {-1.2, 1.0}; ceres::GradientProblem problem(new Rosenbrock()); ceres::GradientProblemSolver::Options options; options.minimizer_progress_to_stdout = true; ceres::GradientProblemSolver::Summary summary; ceres::Solve(options, problem, parameters, &summary); std::cout << summary.FullReport() << "\n"; Executing this code results, solve the problem using limited memory `BFGS `_ algorithm. .. code-block:: bash 0: f: 2.420000e+01 d: 0.00e+00 g: 2.16e+02 h: 0.00e+00 s: 0.00e+00 e: 0 it: 2.00e-05 tt: 2.00e-05 1: f: 4.280493e+00 d: 1.99e+01 g: 1.52e+01 h: 2.01e-01 s: 8.62e-04 e: 2 it: 7.32e-05 tt: 2.19e-04 2: f: 3.571154e+00 d: 7.09e-01 g: 1.35e+01 h: 3.78e-01 s: 1.34e-01 e: 3 it: 2.50e-05 tt: 2.68e-04 3: f: 3.440869e+00 d: 1.30e-01 g: 1.73e+01 h: 1.36e-01 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 2.92e-04 4: f: 3.213597e+00 d: 2.27e-01 g: 1.55e+01 h: 1.06e-01 s: 4.59e-01 e: 1 it: 2.86e-06 tt: 3.14e-04 5: f: 2.839723e+00 d: 3.74e-01 g: 1.05e+01 h: 1.34e-01 s: 5.24e-01 e: 1 it: 2.86e-06 tt: 3.36e-04 6: f: 2.448490e+00 d: 3.91e-01 g: 1.29e+01 h: 3.04e-01 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 3.58e-04 7: f: 1.943019e+00 d: 5.05e-01 g: 4.00e+00 h: 8.81e-02 s: 7.43e-01 e: 1 it: 4.05e-06 tt: 3.79e-04 8: f: 1.731469e+00 d: 2.12e-01 g: 7.36e+00 h: 1.71e-01 s: 4.60e-01 e: 2 it: 9.06e-06 tt: 4.06e-04 9: f: 1.503267e+00 d: 2.28e-01 g: 6.47e+00 h: 8.66e-02 s: 1.00e+00 e: 1 it: 3.81e-06 tt: 4.33e-04 10: f: 1.228331e+00 d: 2.75e-01 g: 2.00e+00 h: 7.70e-02 s: 7.90e-01 e: 1 it: 3.81e-06 tt: 4.54e-04 11: f: 1.016523e+00 d: 2.12e-01 g: 5.15e+00 h: 1.39e-01 s: 3.76e-01 e: 2 it: 1.00e-05 tt: 4.82e-04 12: f: 9.145773e-01 d: 1.02e-01 g: 6.74e+00 h: 7.98e-02 s: 1.00e+00 e: 1 it: 3.10e-06 tt: 5.03e-04 13: f: 7.508302e-01 d: 1.64e-01 g: 3.88e+00 h: 5.76e-02 s: 4.93e-01 e: 1 it: 2.86e-06 tt: 5.25e-04 14: f: 5.832378e-01 d: 1.68e-01 g: 5.56e+00 h: 1.42e-01 s: 1.00e+00 e: 1 it: 3.81e-06 tt: 5.47e-04 15: f: 3.969581e-01 d: 1.86e-01 g: 1.64e+00 h: 1.17e-01 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 5.68e-04 16: f: 3.171557e-01 d: 7.98e-02 g: 3.84e+00 h: 1.18e-01 s: 3.97e-01 e: 2 it: 9.06e-06 tt: 5.94e-04 17: f: 2.641257e-01 d: 5.30e-02 g: 3.27e+00 h: 6.14e-02 s: 1.00e+00 e: 1 it: 3.10e-06 tt: 6.16e-04 18: f: 1.909730e-01 d: 7.32e-02 g: 5.29e-01 h: 8.55e-02 s: 6.82e-01 e: 1 it: 4.05e-06 tt: 6.42e-04 19: f: 1.472012e-01 d: 4.38e-02 g: 3.11e+00 h: 1.20e-01 s: 3.47e-01 e: 2 it: 1.00e-05 tt: 6.69e-04 20: f: 1.093558e-01 d: 3.78e-02 g: 2.97e+00 h: 8.43e-02 s: 1.00e+00 e: 1 it: 3.81e-06 tt: 6.91e-04 21: f: 6.710346e-02 d: 4.23e-02 g: 1.42e+00 h: 9.64e-02 s: 8.85e-01 e: 1 it: 3.81e-06 tt: 7.12e-04 22: f: 3.993377e-02 d: 2.72e-02 g: 2.30e+00 h: 1.29e-01 s: 4.63e-01 e: 2 it: 9.06e-06 tt: 7.39e-04 23: f: 2.911794e-02 d: 1.08e-02 g: 2.55e+00 h: 6.55e-02 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 7.62e-04 24: f: 1.457683e-02 d: 1.45e-02 g: 2.77e-01 h: 6.37e-02 s: 6.14e-01 e: 1 it: 3.81e-06 tt: 7.84e-04 25: f: 8.577515e-03 d: 6.00e-03 g: 2.86e+00 h: 1.40e-01 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 8.05e-04 26: f: 3.486574e-03 d: 5.09e-03 g: 1.76e-01 h: 1.23e-02 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 8.27e-04 27: f: 1.257570e-03 d: 2.23e-03 g: 1.39e-01 h: 5.08e-02 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 8.48e-04 28: f: 2.783568e-04 d: 9.79e-04 g: 6.20e-01 h: 6.47e-02 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 8.69e-04 29: f: 2.533399e-05 d: 2.53e-04 g: 1.68e-02 h: 1.98e-03 s: 1.00e+00 e: 1 it: 3.81e-06 tt: 8.91e-04 30: f: 7.591572e-07 d: 2.46e-05 g: 5.40e-03 h: 9.27e-03 s: 1.00e+00 e: 1 it: 3.81e-06 tt: 9.12e-04 31: f: 1.902460e-09 d: 7.57e-07 g: 1.62e-03 h: 1.89e-03 s: 1.00e+00 e: 1 it: 2.86e-06 tt: 9.33e-04 32: f: 1.003030e-12 d: 1.90e-09 g: 3.50e-05 h: 3.52e-05 s: 1.00e+00 e: 1 it: 3.10e-06 tt: 9.54e-04 33: f: 4.835994e-17 d: 1.00e-12 g: 1.05e-07 h: 1.13e-06 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 9.81e-04 34: f: 1.885250e-22 d: 4.84e-17 g: 2.69e-10 h: 1.45e-08 s: 1.00e+00 e: 1 it: 4.05e-06 tt: 1.00e-03 Solver Summary (v 1.12.0-lapack-suitesparse-cxsparse-no_openmp) Parameters 2 Line search direction LBFGS (20) Line search type CUBIC WOLFE Cost: Initial 2.420000e+01 Final 1.885250e-22 Change 2.420000e+01 Minimizer iterations 35 Time (in seconds): Cost evaluation 0.000 Gradient evaluation 0.000 Total 0.003 Termination: CONVERGENCE (Gradient tolerance reached. Gradient max norm: 9.032775e-13 <= 1.000000e-10) .. rubric:: Footnotes .. [#f1] `examples/rosenbrock.cc `_ ceres-solver-1.13.0/docs/source/forward_central_ridders_error.png0000644000232200023220000022347313140546177025635 0ustar debalancedebalancePNG  IHDRL 9sBIT|d pHYsaa?i IDATxy|T}&+YHB؉eEĺ/Z[뵽mjkn{*mZ, aIBϾ &^ǃ#9g>̼w1L4K iL!0HC` @4&iL!0HC` @4&iL!0HC` @4&iL!0HC` @4&iL!0HC` @4&iL!0HC` @4&iL!0HC` @4&iL!0HC` @4&iL!0HC` @4&iL!0HC` @[ @zz3]9L>!\gg?WVV&02]10HC` @4&iL!0HC` @4&iL!0HC` @4&iL!0ŷU7g LGY!V3]Q&UE2Ζ=~{9޽[yyy+4tLYd[x#^z%͛~Z`0eAjZ Km,s@$QUU̙#ͦ#FDUUU. @aҲ͇"^ؐj̣KNDj*֪V`P^{&Lp̶XLK.զM URRsjذaGm,áԺ}@M|IRqQS'e" ha-_\MMM*--a'g[oqiX,Zp{vHDNuNSHK@0e3\޲H3Xy&=LNN}ݚ7oL>''Gi+<_]7tnww{vstE^y IR__$q3y2Y\wE[]ĒqUQY39x2Yq&Tiivޭp8|5552 Cs|qUsOʈF$I"yFݩzVʐ!r5uhX yX 2e=G[І=I=ѥ͋p8ʀA_{ѣG+HhuXL7nT:O@yE G2S"K8e1}".f&OZåmW_pdZ`&OQVlw)a&պRq"#FKܵha[NPHSNT5f*((ƍޮk6wX) ;,R FfP[Kcg,!0V^vIaTee$iܸq.8]w.]M6) DzڻJLޛnK&l[241q7:Ƀ"ZZ@ax\zg]wpn[Vҡi&/9܉Ela@C`}ݧfӼy4o޼.gO+}55*oOONr[ (3 G]z}n-8 $tkj<#m%I1$di@v*"ui$֖f>,Gmw^ILJ]b7sڸ>87ҕZײXv3&0 VL&u} g͗$Y[㲴]avB0k$ɐUl-.^6Q4TۖdP jJ*IRtH̬LH&y~ӊH}qYZ04mNy֭ԓog)! SZ^uueղ(9$G`^+nSHdy68jԔv>=6iuxy 췹֮&UTѸ]%I G!, ^Α++I6֧qY_4UgBU } W,.~%M㒔j=~xT&LO7ަXI$ (o eKmsE"c* PInLzVp43R>Х6q#78;wq3eg[-+$Y!>P XT}}4Or&hU9]F8Ҫ΃K I)^7mLheF}y^q;Lp0.yE%IF$勔ݷuMԶ/65Hňj߯On;ܢ%1}zO$ɷhi^mK]x3āW ʔcG>#> T@@`VDnTTdpIMvoomQeR, >ӧ`1C/n0,zóANcF.Ή>ݗ_]Ó$ T|N&ap`>U}K&Y~kۤ 4W,]ooR肙Ҙa_X#oȢ=6ۡ)C"~ťɯ{9΄OӶGrPOLsGihasơLPV(ء%*(oz]9֗gYKM>^&]ZK$?6jmÒr7|Wu~(8&sNvaSZKzaGɏ7zayQDKNekR?W,^zhtAh$LpNEThȰԲۡ~XEdRa՛;o,c͋{r+8 ++I2Pc-XM-JPK5>BToӲ9~g0HGtsQ_pw}zϻ#kJʇr%IA>&'dJ 09V&7T\k>xN$iuէFd ]VS:n MkIxP|X;ʏJ=6_* "`@B`sy#U,$ݑP`66?~y1IZV-t4M~k &’~> o*f=9ЙLʖe*:<>9PhyxhnH@oD`sŰoxSȠ$]7ƖfIשn~S}948/iRMKM6jԝsp~zzZcJ>*~L䰙sujXg紹屸$IZ6= C˴&, ]2p`텲%$IoM.Ct]v6,iu*8D1=gб=~jhz̷43WHk\%IBKed"09cu鲢 $IQ3W=Si$#PGsVJ|\vQ# OI@6vu,wA=Q"frp"{;v}uѮ܌h}?sxxq3B`sΔE7V4| ^0S\\Kk[5|>I N:Xa ˻ p6k`_UMQdEזүܣicSV7R?޵Lp{n8W,1hGj쑸ͪ_LGHQkŋRŭ)>S#_N6 6tYlme}j݈zhtg:S#15٭ ަh$)8}L{ &b+;OD7cΡLwp񘡗6y>LհuWtm8ajtGKrβt/iH4۔07Ftl$ i]|H&1C4].IїL:$IVY͝YׯjJHv71ǻ`K׫53@oWۣm{H_OߌO8׸# $ ̾T0xJ=rM)풤G9ZNrDBE+_?Hmҥ&/%եˋJbf\/X-dbf\ ^ӷ~&Iɩx?t]Ō"S! ug+ࠋLP-;U}/K %"s"ujBVP刬娯kAff<@rA=r*KnlF`dQ-Ks &遑_RvKm|.ڡ¬$æU;Gȑ &H4='^4MԸZ_vj$%g2U|Zǩn:b:avǟDAa +l8w\T0!rȐarTU;oؚ,%LCw:5oL>וҲ Vj~4YO疖h~yT,7ܢYXE%%I= N3KI|sNa(0gLkkZ4"54]s"û k|N$iIڷv{yVnҗ쨰zhg$v%[;{b~L&zs p}:YK_ӌ!%SրU+?8zJf~~~y '7H-G^q8z,x*SH&ԩ5* /qx}ڱMWf1%IovKkR tHwҷ@mW>%-ScF~Ƣ[՚Z<-l !0ΔͮRTj]s^얙OdQLkXѭ fB ^wVd8uu(ϖZV,H"0>֛:$ԵٴqgLT[$iM7wv͑vݷ26&{ ]Rx) >λJyR(evJL0s`]'G]>6dY[p nʾ3%I GjC{A)Im.A%Ώijjv8<8 R3R"BSfH:<젂ƖG$I%]P<]NKɢu_4\܌O/wA1$О n.DV ɹug OR; LW<7_d߷G[5wdH.[2\Оd+G /$Qz .s Ҧ{~/M;?w~13s4YH LlS LD`|69be!ykΫ݊%6%ʢd7T4b]V}m-Iʢ;?*Hsl&{]}f#IPqNE`|Dѡ)2խmj{`$fX;CoWgr[-IZle/Iv&Tu&@'9Wל>{JyU7UY%V&6,:D1ns䏇$I=0K2 K׳zhKN(.zJF`tД #I2Q.֖z|VBQ1*sI6z?Ю@mFnҷ~Jg}ekm/ǖ$I SSR&@g2 }\2I]Z_آ]]n58si۬B;65z}{mʲMSuIhEvL fWKfꛔʖ$9隖e&G8ٰǡmV]Rtrɾ+Z6)vC sf\Լdrg~6+ZP<˺bQ%{d-}4j9K8D LyIO=.#S՚=y˔W7t̸('P\ /.;XfѨqؑ^(3@gkv] ŷ+>A7cuu}Ѩ<+.Uu3<%@EJe$ 轏}_nwشaC/g)fƵٷKx#N9pؑ IDAT窏讁wOw-Tk+Iʢp*Jq}35pt`E%@KЅ"#(xLI͌O[%[$4eߧ’B{~<]: N:Ks\Jd?r2Tݔ LVSn8bem> O+36n@(ppJtEEE  'ٚueͳZ1\ím?'ܽ,L>O^{c䏇Ɉd3]yFg@~17\znwF&Ͳ$sl\dOmCwkGꛔp{SťlIi48J{ΨmSp*,ɶmw{Xbx#;_%Cq$i]&|AŢ54SjNI5M)x-yZݩwk>5.99/Ն.?A8{/< *<Ш5%oTFjr^.ؑH$[{*Jd>\A^oxV[qæ5;iJ!!CސEސEXP>CxI]Ժˋb?ɞ]Z_'{%IݮRm)a&u Ln;AFf,גK0 =N 0%H솲c,/jhatHQL9 uӀ=޺J]_t eJ_p,%ru׷&@#02 0RY[u%ژ3A-nK.SYr\r 8Mq%XTd&{5L HhpQL(9. u=Ux~";3.`esz%Ib&N9CA&@W#02bGtGZV0[S!e.(e*` 2x`|> Ѓ#ÆV4=%gOj+Ģ-umsHY~.>Y#TYvlO?VwY+I'% $amC-ry~\)&@.WB}>YTr];^ef1 +Pm=Y2O|ն:=J-'4gxcjJ,2t{doٳb,$);ïw0g7xRS-~o垧SaɈzh=&,Q,%^,9jDB}˞Pi^[KU&@O`)t4EOyYU쯏_VY"ǚT$t٘FE$IDr$ÁHzimj݂/ȑʎZ-hYc'M]U-Asbz饗k.B!k0`wF1=Y ̽\˳ 9wH,u5}qE*F(p\% NxS誾75czʩoU7'橺ɮpГ~:-={;@%IæݠK29eqXZ^JdFr㌧R}ttDB;ujڴi_H$p"Y*<ޱJyO ʶg\kԗ7u?&Ѯt,fYPD,,yCܶiz~SaI_G=0=.,iʳ5)w#|%0-LCgN-;VUVqbACd`ƫ2 7s&]6..լ].1)Mz4lߘ^8Eul5j Z,}jOnD CԚͩurG!*9ɞaQ%GNIR";G鳎]y=&[Az,}r_Jn_A?jBu7][jFU9:_?: ;N=Ow=;RfLԗ(ՑN4yfFTJ9.^Z3ۨUXXxL7' /馛n:i݆x7Y{ 俄C\ٲ J)/*mIkުߪ>ܜ}}C*>?}s-=;,غIIR<@t{<$ۙP_D ^)''9992MS^iÆ zRo6 8KE5`f$6>?шLPmKv~mX/U{>9"WޢnR -M@wx=(j&ͷe߆~ZcrfS3yVZϽ\X{P(I"hTMa;6p|?8>}ﴺ kdggw]2_W_a_R;$0TV&9\Q}mn.֏[hWᨩffoBC B҅l?wW'<~,fDL?޳8+ߓ1cJ$*64IHs,+KǏMcX&^ ۚ2dnT`獐$?XjZ5ywcኰn|CۺDMζ"3-#{i}TَӰ p~ܱ+~力{Tc.^#I2NW4ꮮ7th|HWy\k+Lzv91N=it2|.ss$ѷT$Ï6Ku*azj!)[ZG#x)L}\OE=8>;,fq3Lk67NnŁi^ C +*OC<Z ̜ 4_=)kNeee|@OC`ҋj G ZSS#0TZZEVݷe_+kKoPx3]6&Pж'L-biS֦E*ɶ;|wBf2 q'd8پjoNTk JG)6M}tϦ&UnvA1i8${ђur*C><{O"U$0dA"}s|^2XnB:::$IUUUN*өk̘1z7UPP7]^{m&Y"^VrVm%k*g]zj gO+N}gTjTcU[hx241~eO)7Ρ}4!ܢ|Luו d5G3MexrФ {-:+̐dśrWҥK~zJ-]TK.U0xxd뮻NӦMӦM+(H[oej`tseɵmYZOk>\h+9%ФivkIn59[ͥ^tmH%.S9S+{_X"QUՒxNfH&@¤Ok;ͦyi޼y]\U<&M2qy\"ߕ7־BZ~V OiυC.G3}8̮:-C7,c(g2gMZAwPPRˁKw<&@1Sf(ɒ$9>fiǞ`&w%q>Ք)UmRn)}V6w lu5r$ɴ;s#Z|Q9 Yd/=3^x$rl|} WO=.gE,zxSvICU~D[fMyR/m۝(3v6}j$y,.72Y^%g˩2s|&FUȜ^@Xuijѳjpsk}5$vB5*wK"-Y8#*Znՠ-/32yC̛(a&E#CsmX'[IRoPihg' 0pBACR!Ir9(e$IrK{ף8]u8AhZNOwgio$0 n1038Kd1Riʽz_~NF<9k|:nCf<ȯWh\NlGL 0mZz@aK$զGmQ}Ot}}sZ۾Udg-нC?#Օ:iʳU/)Ї;r&@00J)<~\ߑʳz]%E"~y9vT qHmnPzn(XxD;e?UY|ƶ|Kta\y41w.3^csvΰ}=I.Vr&peA;%Il_>Ir^-2BъxGv)eP7 LɊ9j]<@C>qPHRrMuDCY;*Y;|J'Wcc7*$,UgȭrYsYk$ɴ{@Jwt`B  LMٗ*Ql%Ϫrtpk7H:b~p #y@[|X͒\[y][2KG zDBY_ѡ NDnG>QI I&N[tyIˮOt;帱~?Y.yEEq-LmjL5^Tܯ<)4{<нf\ԼP8$UxQ_Ӹ W5\-ہIRB|c) e;d 36\18EY%[lɽw^C$!B 7!! IH'7!77ҹI @(6ݒ%˒,wmߝI+yxvflvg|9ԳoyQ:ㆄ:TQFJ $I!bYڼc[j;8BtϒXMM{>^![߸?Fc4kUe.˜mpd}DUq EgfGMNSm' RDX! !DLRͺEp9&4;7sSeLB!D?""Ú¯ƒGg UŽ5:h PSz'L%a"D"hN퟼(0 /?ASWWT3;&,jj^+}RV!ĀRI!FǪ@4־kNVMF.~̕1u5ڸ)]ŞJ^Ba`+_^o|;:vu|~VE Ff>/qAs?Y77ÿ3K}!i~?(yp'YT~5,JjptZV T߼}r^I$a"|B2kO.˺D!|17튎]3h!?u -:NAc会u]_]6ܰ"HDѯ бhV*+vZE_ʻMsQv BCey!J)V=3|>JWrsf]r(Jï _%EBI&B~'<4koDumRNb;[Oةl~&**?=[B}B@4^K~K[ [: &]QU_l7gjrJ^$a""r,_~;o㜭o25@+<-5MBąS𻪗PLNcp`=}4?ef{DZ k$a"B# -͍, bXz΀W:PĢưka75aK>[!0-|Q66}b"u IRLm8o@>,&3B!biT&?*]Jmi76M28e--V^ r㛷cͧJ`BI!=%9vF$u2@o5jz=_~wȰwെ}Bqq~5_+Tcn'ߙcpt1,imtӻhar!b$L^$# >w`TTIꃮ 3I{M?}Bn|ln6{ ?-.#}1yx GI$LE0B 9 L[c.aY[qz&re<ZNX !8~;=I&w,7 \\h+ŗbZn DY+D,wT!Ā&8 %VWNEpA]o]{&'U8A_V?ea#ة_Sd$X}b\n|f*m[XT';Iϒxͬ=`=Bw,@E ^!ĀUh;ፖѱrAi`d֊s'ϳl%R4t4}|"vID1Bu%G1`1ê)>l=Kr䌍C]! MGfR:g=y,Sq6=⛳k9ѤC&B+_@hPՕ[9@`T@iRf;-m!{9^kD5< E1/!@0:w'\;XmNm"~_eF&yB gz0:6+y,~=.6cXg ?eS~n$Lmr5.%$8wI`v_Ll5èAaF Q}jpJIH1c'#0 j: & ¯yT񨝨J e 8ҕ *!T%HAD P(_ X5*B!z#J]t솜\T|V;@SB4Mٚ gɒ\GM%=Vr ۩ xl΀7B 3LApDG` p߂@k `,.`a-Vf=W,$BpD@XU^>Rcxa;Wde#_By3h=2;?-Jzzt۳R 蝺-IVcO!D,B9 ?ؿhv~pKUxH*F%PpM*VM"p-o:I -r;uf\<,ß n͗.7'W+6{+!m0y5BB# 蝺%L~N&BI'Oǹ-H7.>vc;~%X$9iNd 0#VDZY 8zqde0,=ʉLʴ9Yθ}BvD5f$18r4{Ь6/58 >D&B:I!D `?rh(M58&_@`tBt[l,Kh,vlGb?rs[+ǁ=8!E`$36)%T?V܁B8j*n3Ћ{9Â48~$wBw%j--&4,"ID!hNspmیi$"m?n'8nIPS.jbY9Ku%8oiDzeo{P1z0,# -%*dAxB!z7Sgg؜ܑ+a=oaij M`t#0Z &)*D̓SUUG/^̂ G2Ǿ], gd4`}&(sgKb;r :s竤™OcV˪x5ff~(wsoٓ# 7kH[ejmM4El%bsFf}yqd9@&i]!Cj7g m u8:M&<$g0)qއcیQ %4)Ik/>«x9B^V(;^l'w ɣ 4\D& 2(]y DY#D<grssF"DL Lf2aIJ~Hjz˰:I zK& 1 @C ,͘Ak!pTM噚 bɒ%\<^;wr-f͚x)BBp }s߱ &bPda,KD:nBy">,;oK>l70Kpm9. lblj0&Bă\7x^lBcc#﹮_dΝL8/7*++/z72g)2&D ŪW3Uqȥػjn]/xUzu7dCV7J9nYD. I#ѡ뮻;X|9v7ӧOs-[˙6m7|3)))[۾/xWSKB|Hjjl ѱ& i$>1hT|wy!}iGauT- f'^,]{ ǡ}h6+ TZf+&]$`fwQL&Sbaʔ)lܸv~'NdĉvISS?~LKK W_}u"!G=JyK=a2)/5-CvCeLHr~Zu?kg]}̜Ce'%뷭7~ _k_1E7K~:X{lMީ_cv#5M#h0ɚ4޿ >jh*9NBI J${p8xo싶B]A!kvD7U`3Yixu&<2vQ !DTT \+p_&Ǚ!H}D9ˉbsBk@a) rbIHHHಛc=F]xe?)4Ȇ#ovRV|VfA$R7K~JHcg؂6Za;I^Jts B F4% 6O7TNN!aX'Φ@ m(BvvA !zCh 2| ޮ9Y1SL T(Yq4YbB WrRX|s&фF28&B\i),DI;v,gϞX8fk!D| Q/nW4v_+pYkޢWק !D w U^5?G}Uȷ>Tq͆g #Z&8!G"Krbo什ϳfn˸qذa4O[[ۻqB/ ?T3G{<՚'3kQQSBMog\Ȅ<οA4#p^n{-FKz[ K!$Lbikk@Q?8q"v~kaӦMӄ8R( 8>&RX" pw, ˗/g" FQp$&Fmwl42< n[TQCBT޲?Sh^ɭB&}DdZ4El%đg$a"D!Dr&,IYz|WbMýa "9>f:d$G"3L" wCW׊qb?G}~gk6Pᯥ{Ǚ<-q +p #n&˞j`dv֪Sh)76UiBI!D KK6,TXln椌Po5YEٓ_} [ Q\oln{^3 +rw0B81tltv|`k=KPpZc|||j'S'&ܼυ7 ׅ[7=́}v_z v-6W\ol(K(u,jH!$L"N KG.s`;q?ǎR?nppEM;F}WtL{!Rlz%}s^IT~݁wr#y:两CH&B'E85{t|Waw Ica:x5OR&ޠyi_P|!bCDz%E<4% 78:aVG7},Fs'P%9B?I!Dp4 `-ZDT=1cxd煋(9iraOε>Zcwo&pNf!'~KoFVd B-8ކU^K`#fHD$ !#ݖ8 }_U9V.qT30ҕKބ3EOx&NZ2DJ(Op۰k$LM8vm@3.] tلICjB$(BGy\/Z*`lv31k#|ɨv+Zp}K$95%U395)s?BOw氋xjm# 3"#\ !zƦ=?}6L&q_0B8ƤhBk$SԈǔY8ݢݧ#LIkƵq+{Qޥgf2,1gG({9;Cq>=l 2rX"`X#11IchZXOdIwơ:*/ov%8qv*"ɩf]bpD%RU% !#v Dn`Ϣ͜ /DM.TC/yEUr oǞn̊Ylvϡ8i,U$4M:ByF+ACeDfa4Fxf 'fEV !.5 ;OF.˘͗%8qBzp!YzXo_"D 0Bg1R*`RQ|s\p -^}9^ՆolEc1cnӋȚ[[0`nkaN3#HFzM6R;jY"+xa92J<)l?w7*;nŞI}7CY? !z O(?Czkbypi,#kzL;[`xFQ:,"~ID!̰0: Zs}-A9a[w}ĩf]m㨦ZpjǧkrOKHavE.VLpbqfU1q| gpBYfK3H ")4\JvyEi=B#vh?u+I&71:aRqvޅ I!I!Dl҈z[Q|%L5yˏ6m{ TYwbԴHQМ.c/'UY<_>9ڸsgJ8 ؎ 2Fd3~X;9mMƒ32HOs=3~<%[ᄵzWEƸ೤Y L|` kK\ng(h8%a"DBgfM ȵhb+9 /KlLXf:@u7OdyEˣOլCTBt+9[:R_KS#jfZ(Oz岙(&\\^)!D%,J$lj26JB wB~)WW؄=FRe Nܲڇ4T|3QߑB0B8d6A^Z V:,Iԥ䓒ʾ˩<(IwGse?uxsɎbU r@k݈`yIXc.Y ۿ#N;ɧJK_+G;ˣcWd j7xx:qn,, $Lg$G!r-:dө~=.?-"PNjyh$ӖOF~o )DvӭGo;UF=J͎=ڎ7 Y#@Rc&K,ۇ}/F%qεe ق 3Lw0B8u~¤ -]iCŒ%.p}nc&ʚϣcbzni t~t\ITw90єĿvUuF]|, 16w?FSWtk2]Ue082QYOa/֓ÉwR#{gi),D+S!STLEcKzԤ"$Fi1"nĩѱEeN)9D9B[!5c7bK)욽&X(kÚwR4[R1ɷ-!wB8eR`hz:+й+Cd'-EQQPh ϑY1_ @;.4 ǡ}o0v<,LδZ_ic갞" ͡v~YTDǮ̜>%s盘[%8vBXj),K{B8vIcak5Ywd IM#;`Ì9d:4=Fa㝧dUpGu:t$K sc=ozޚZRXD&B=a2sx$gij4Mzv[ )U JX!5 ;^4W4}i׿ ienr$a"DܓBı$~A沩08'=ߜ,hFN'êc56N6ȪQ!YH HO{*쯴^*|[g:#>jqNKD !: z ^ԤBz%,uzkpZi (vx(EiB0BSY g`'A@QU1k8lL9OK'⏎;AT?-|Q66] (mn{,Ǻp|]rY$D?" !1EQt2Qt9.ФiJ)~ {]zT_$`+!pwțC|qHDvr籇)V0ٸ{giTܛ֢'L!<$b!lDџȧBs~l6E][ֳG~*47P_k_-Ī)^:O+\۷` 8lG=jȒ!I!Iwr8sxpG`g' *#FDS繂$| xdk?/=j%Sh͗#DL8Ю+9z%̵g f]rR/ɉ'B4)q$nێ]z,E뺈wC<8S~r,5bM/ו4iǩ4Mu[cϐz%UŽa5͞jpP+aⲩ8.^$a""&YMfM3Hgy15-iTX[a-Bk~IXU^ Փ&k[~Zze jʟ_EE2<=i+R_ @8=YGa _d9;<2}LɤB: ^Ytt~]EcY߇eWYW]]]um,)BMI'gH&ܯu9>'3s<#B$LBY;~_Wk}8e1}"[2k,M mD h}8hӤK&"48߼XQwG@6U'< ˚m^D $aҀZ^zg}?\`$+:Ѿt;Ꙧvdz<-fHN˭lD_c63ZM>?$c8*揻Lڗ[GwA{>føaRDX.Dqhwfv“$A2!M-׳~~O3zh@QYZ:#'^?8?Pz" ̨r{*Zd +)+MĜI$P*{$MD=*s }+P$Lkvc8% { GTT!G j$a|>V\ɨQ >>^&Bzw㎁מie_laxaXˊ/X#|Xw~/"6Ll:dH"yߒx&i,=UvV_+ywDVWb[N–. LA5P#-Lm`й\.V^9~8vѣGӱc x<,][bۉgdd\8lqرkb6ѣ;wzBQj?~۱h?hw ؎-)¸G2CV=w(+qW`Gl[,O^ vS7}m KŨDU,Й.8w$h ˚eh*pgມupϫa-5L90 2ˉ"!!C]r/AΔ)SZ8q7|;v;v0tPz@xYh`٭[hIү_?t:k׎}IDQ/tj#KʀFod-bܽÎij}Mo%7ɩ Mw͂7 -dP'Ygw8t[hkMmDꭵx|qr93 tI6nj{i*]pĥ|-x}EF5˟08B&IVjΝ;h4t)0Oӑ.Q IDATŒ%K(//'$333B?Ֆ7؄Ֆư/Ŕgf'|QݞIMc49DQUp(I?r?}OӪ4M{Ӧ |_uhb5vf O'p Q>ڐ7F_K'qYף;uOlA~*VU&B"' hԨFg&?e0hӦ +WdذasNƎ[q !DMhbcx r+%5K'M}8:uüa ׋yRn(aV0{ȈS,YPDnl1p)sU2TlUׯu'$}&QѥG; yzv/;unFc)2nnIcY+O]^I1̘ Cߛ>|aV7z!KI&^{ xx>}%_:uUZj"9sϿ7 \ԓ Nwڬ.^r)9t{lF=MTܟ~Eh\NBSO-ci-r?j`PU:vqWưk9:A>eZљL O בY bt/Tݎk;HHKbDW.n^' j$aROX֋v9;bujReeen_!j2p8=KiIJǃfhV,AUf:=nl|`y_/۴xu'jrSL9U[ŠRV{E|vf9*l[oTk8xp~ĐBؒ(nJqwg]Fnиlrs"㗞N>uDWS^O_ k_*TDlNRzW%u\ ( [#A2D6m|lڴ)0񐛛K&M.9BB4TQ$1֠TU?ƺj m('K.զ=e~'! òj s?B~A"C۴Brhس5+ )ŜW2釿%IƼjw?Ky,b_DdPC RDAZׯpP^o&{ݺuh4ҤIڶmKNNUUUĐKYYGfBQ'ylӶQ\."g@wj3l㍿'hhރy L֠#UGθ!&ڃ<NjQ}e8|.^=)+JrDALGף;OzqdBCq!%a"DK:`͚5t*B^^yyydffWbҥlݺN||sl:žѫyjsn^8!^rϬ12-t o]'k8:NU,rfDEg.xt'\.9I$a""9tUlr[7aY;]Hć`?gf'nO+oѺ!4c$>K8O"'UU2fdc,OgKĎ2R&=0:W GZ(J$LY&O!DhS\-nѪ+ ](k"FY^a91*+uJn^';8%]#bI˲UC`Ps5L>\%o!xQ~D:Y,Ǽa cp2"3G`E+4꒭yw%ڙW/Ecʸ QԘ*)#$a"B$ۀa¯gXV/#{_%Mqx*q*|Ղ* 78x4v`ј1_' ѝ8ifT[ Gzd!FB!jKwlUK˞O$/uT=''M UUßC@S/DAN{^/G1T|^_"DHBQK7֫`z䪽c;Ů+{R갇:sggݣbI419: L~@Wt O\Ύ]Qh*9SKN&B!D-rt텭t 0~FԸrl"옣)yt; 㒆T{hMANMi u+PA#juWK7!jB!j[ol0@#XZLR6YpHؐt'zB´&i>;JQ3T% PʝY7O rPLDQ0K*Qdgg裏vMFVVVo7[Z!=bpױ35KȏCl eqoHPS}|t{_&ՔKKd G'BaN ֣_# ] ev-TɇF r@"L0F~ ^~Fm-_FCyyyMyIzI!׉G_]{qKHbeF?IPϪR|(0Wt&oIALaDz̖= FڜpR8RZ( )))|8|LjjUoKUUEA0$LBEQ{1?)C%Fw)j=R:b?c^e}N4(ܛ<'aJ2L,%hlUĝqC# msOf)*j^VV)))̝;70oܹT*=͚5bÇ0`hj-S|>O<5"11iӦUѣr-wAaaaef̘ABB7p $a"B\OWF&_nE}4*XAvs󶙩r^PdS^?RI 'ddSe\G1m@5B_ $LDS';;w}Z<̞=7|;w2ydƏʕ+III $OK~~>J`ݙ3gbZY~=?< ~-PZZʕ+Yx1; '0m4f̘ƍILL_4J!m!Zw8[_}az. 0N`G+W|Z$0/ݜH0/0^,&m=Z#Pp~ Hia"jɸqx'9rf̙ҥKp\}:/֍(TH !"aT__%:q/ 0gWgW<ۨ*<6jɒ1Y޺L„B 434'_ZS &;2wjfRc*h[]tvgϤU  5Qq 5b?@U<>2M'N䡇BQ TVV0o޼j ʵz}iEQ bwgB!W )Z>OrRuo. 4]vL{Sq XQ_ $K"ua-}̅U%,g?SWq A8I0hذa\.n7CTOԦMF#Yf~0-{jӦ Gy;w6m'֭OC0B!!:T`n{-m^L [î|ܴJ<)r$Ź ]u KF 4^{e&-X]1hܧz9EqnQѺpO[kz# ؑ@g0R59RDA&B!DjN{T[֕Hɶ3q0#n(UrsL_%9bw9 NHB正_3bvRyx"hP<r&ZÃPTf!hhBQGMxpBw^cJP=flv&w%{YR;Ox޿%K5γ7V%2m\OBQT~^Dj0HD!#Z5厄ݑ'ͺ0 .x#tK=P`毶)vXE1>6i+MIPA#@#Pn?&B4 /B!㒇1.yz~Uc-dV| v3Mc*.-gK FFҸn•yI swA:II!BQG2pe(Ӊw4,iz$zEePd'zUS{]-Y'h$KDPvmC0ވHݥ&Q0aӨ/BI!u@3J,0d]!I!uQ,Y(n2#fl S >dީ5'zƫzy|^!Fdq]!jeE q7rD íH!I!uG_|#d"5ʥa%:\+'OYnmy#4kDC;zέFl9"Q8<%B40B!8[/ lba/w0]sR@Nn1u{xd?Qy-or̸D3/0ij b@/ia"O3a I!x#=Dt^^_݌"]sLt^+ؽpU}|t{e*#y僌']pDЙ7A[R ;1gf G$\]'OdҤIddd`2HMMeԨQ,Yͣ>Zc e0B![Iˊ;h~k457#*kLJݕ޷0*9"Zrɴ78!MiLQU6hR]n8?a) QK>LNXl/۷ogdggC]xg4o.^Zqڵ4B!BE+IMП8 kוVpxv0:MxOL\|-Xƈ n2OS^^¸aܖ"ϏDG9so %:I0SO-'tZLygjٰa&ӹ֭[sPVVc=_o䥗^"3_}ڴi|^8A Y /7cHD[k퍌ޭw#;IIZk/x=s .\C=T-YrVDD~;EEE,\͛7өS' Diii`W_1o<;/_Ό3xWѣ<'O$??M}ꩧƮ]̤#Gdrss>|8Fرc?zjIMMl}B4 ބdq1vn2bu͙! zw&Bs'c:h(>8܊D鬼aڇg9*!QlUXVm^ĈOc5iICUUZlyeV^ƍO"##H>r2sLZnM^?~<991 , U5}tHzz:QQQdffЦM2226m͚5믿Q Ix7)..v(B!DF{՚r7-+fD=ЯBª=J6?_|#::C~eeetԉZ-)))׼/py8{ IDAT#Y &8:t]߄DU}/s`)B[IŠ$Ey ⿨|}rw$Ds˓+ 5ßrqS̚5k:u*7o?paU~j-_Ν˖-[زe w}E U!$555!!םM& N+,k64027[W5a5&ؘ:hU^;ICin7"_dU#Og܋YkZB\_S6@h4$W'Uoa" Z^ؼy3_2e ҹsgx ϟG>N:EBB}%>>3e&L@6mp8HLLR.9W;r?g toAo*  Evx5V.^UUUuEYUJFs7Ʃ w$D{2듫.n.6=ǃ;Μj {Uʋ?īɫScx+&%A"vkUzIѐD ^z}V{Nff&~;_dAR!F8;to?ѡ3Pt:Ffڱ(*?`9 %ulˊ6c@k4(thANtj`W(Tc>:=㒇]so]uXCSݍV B"XV,FlOjz#&f ݻy%Kj3B!DFĸw-Н8J[!v7_¡a0FuLNF< WQ*a]>ϰ$?}c:̷hMoq!s r!,Qm۱/)wWt<ޠv Rt`doP#Wbw+x|,I.Bģˎ}!""".BQTUjCt m ;b.6-^,ݚ}No,5D1(޻^nF,9}x&Lt#N8N_? L?+5.g ˙j^]w~H_"D #Gꫯ_ڜ9sx׸曃Bq) N5oLc,o[5ɝ]3(uv51q7Ajo5+W*sASq6]kuB\+UhJp'j!!C ѰD3fn:n{1Zh޽{)((UV̘1#Q !ׇqewM$lwlkhG;nLuV-3n>m TGr$$ßhڝ2$OEh[X?MG~ Ӆ6@h4)Q?HD-$ZƲi&^z%ڷoɓ')((}`ӦM4n8a !׏@Ր~ %znTVo^~1-lc%gY&nvfeśwHM81Ex*x$BbY<v_\sKRD_YnvELL < myK^au&' ^gal;w &5bw9W^se{IwU[߁AH\/TKRD\'FX?rxᇉl6ӧO6nXoh4,X@.]0L|wt:~r111ukٳIII L?䓴lْ0222xg%^MFVVo6͚5d?ls=\/$z^F#~a6-( 'ORB!D bxkW`Zֻ͠QͺFNW*Wn{}ܘc U\ADyx'2,^љW\uer,;׊4FICب Z%$PvaY 0i;l b@Z_Uꗄ>ǭnc刷kt?8_|f"%%o :uSO= /@f͈"++e˖֭[h4l޼͆baŊ?~DD>l۶xLXf߾}̝;/0eV\7|Cll,O=6m"++F xo}7$LBh4{4ت&zl2oG>V|,'7  K̬gS.i.ŒʚoGCb9{U6)v5FnK-q}1i 5tuЖnM G$Ź%i%­zpj/7Goϐ!CˢExyO>ϵh۷/˖-c,[CsNV^YlO>d`~:{JJ =s̩vv5k111TUU;/3gΤI&~"ꈐHX~Μ9߿J<նH߿M׮]󢣣iٲe ɖ-[HKK#3M|BQ/21 l6sIIm wqRl?ǧ*x} ?5Q# &iV'8d=cBySh6EQg;ƻǾckžjuj˽#hbgC_#l<37:E7 rPZIaaay=y uTU`^XXX>}PQQMXr%3f 66ۓLFHu7nӧOgȐ!DFFG]P8 źb``̘1Y&ء!/2?Eg4itKwbОKe浜p>Zoa1=N4jvagZ.ʬ xLJdI˰f ̘ QmFWpoL#]z9"KTka" D͛7G׳jժ<ƍiӦe׍}kzZhA~ؼy3~m%k֬!--'|N:C*>NǺuJJJسg?:޷0Q-Zp`"Bkg&4q0~Sʀz6w' ,}SQ8tZϡzjTǹiY$ScM5Z 1d2C)mJeUUG_j7h'L"%a"bMӦMyw}ζ~k1vX]UV̙3߁Zh#G3g7x#~-_~ '&&XN([&/Lݻw;!^iKIteMz}+yo=;zS+00^͉`63>jMFzA%^ [=D'Gx\a Qו)jЩW52̘1n{.]pjE.ٿ|>فy|j-Lnf&O̤Ibݺu<3WwèQ2d}J}JC#?0999ٳ_rXW^y%HTT\x,j_bb"rDpMYi 7:ǡZ/_xUUD'cs]l&HHl:E&3\W{'&$_*U/Shl@C](IlѠD^ sez¤B, }SNK!Dul܏mIq`%M$G{:vг]Ѐ#42icǪs]\X,L dIAѐDw{ sҢE z)Ǝ˂ BEDb#Q&M.=bȈ03X7\֥M/}Ee^mE9t\9"Qʤ~I++++]vi]ll$LB\FD??irAm܌ƤtNzPUoq7`ڼUjp3+Q+tm רvOѣM6 +,,$&&O*o۶/ \O.իWsq?ngte=K.e֭v0`@`ڵ+[l_~8q24iR$"DES1fF[^O|:1Wir1ʠNj/Q\ei!m#l<3{㋊rP;dHa!D=na_+WHLLdŊ,uVMv=ûj6˗si.[T/`ݺudff2|p4 |G~7oΖ-[_;Z5y(B!B/"1ε4)'M1UE3U):fsa#O82nلd>F8:wrD&ɐB-L.6O}'<<)S`Z9qoE;v;v`С:믳h"[no 332zhZjEaa!g&..?H!!l$hJ$M>@UQv^w qw;ӁDe763q q%JE9ӶA+xB5L WM V{U-=v܉F6N#++%KP^^NDDOdff;~8֭[OӦM9|$LB,x?HD5o_,vuʡ# v^ Q–}h'& *PVQ3mFa4ONN~)5v{n_^B!B/<1FFFQx4@rr3C㄁|y#.|0콳 gkT4r$D%W$Dee% GUU**.=Zdb̘1,Zsb6ٳ'͚5͐B0_xccYg6,&~~wu%CGv$ʂfDWb)D]rbY00i?!˟%8B4l:aqFL&(ªU(--܆ ^rh/7@ngdd\h:B!R#~˵kѱ MP^_1.cwk̘.6U)5+ОRە m RDQ&==j%η|r)-- l3g? 7$//\m]tˍ>Sz^=O_j|mԩ2NYV9A$?_m ԛFڑ ][(VO9TKϖRFg Ξ߱#s1rdtՃ>3|oBV^zU~~~nnkmNw B=z|Z , ۿ΅:mS^X5+0'2]O H'jc'A(i<ҲexI$lݺ4я~a}e*ʬvhK/Z~0ksB*++_+++1 ~mn9#G$ ?z{0}C6njF0wlb_QRR8>nVZŏ~Vk_%Ge…駟eҥ\uU/;w2zh~eBɓO>믿oͣ>#<7 VZE(b̘1|/~0lMƆ غu+W^y%d>#\&""ҧy}D໫_q3n6`Wr,y`뗵h`,Ov"0pLV:t+ }O? 60nܸmUGŸe-i&q˗2|9M>@n5_m k0*tʒ%KX IDAT'B?Oxc6l?-NH$bɴ_~y<}lݺn˗&}v{8"ޕt-:]X%CY4y2kܜ ip>N:T,qR/ _A.ۆ \?_̚5!9i D{v2NUʏ$ %}C些a4/ ScVXq^&=Ge޽G("""2 "W-l6 4 &=ɒxgEH,oFSzZ|Vѐ$>ڜӒٳs,s B-׌3̞=zG-?|_dټ[%Bn&V\ɪU+Xp!t&^~̚5ŋv}/00yΝ\s5XYjVbɒ%Sb4g~_8\1(9P(?GmS ˈϜɿO2휰}q^ %Dz&־1r4?: Hr頗wvG%{#GѰ"]5 *L}Q ޽{կ~Ź9[ou(:0 5$q-Lm^<^;|R6d?\3&w{?*>.|y&"2 ]{jkkϻD&"""9K؋h -dNEn`sSmS6$Ũ!iF5$MЧ,tm) >r m\ҫDD eYyɓ'|\9>sgk9tpOc)ç<>VYԘD(G =x j1E9Iz_}capDdܹ|_?T*?ς rtEzx)Kg f,FW.;KsbI8~ͱ:Ϻ8vE8rq]Ԥ.e g㲹cv#~x7a\x0jjZ1պCd |;vmlۦg}E8J hs#$ynjsÀMQ ԑNBIJTXջR NX ~׉*|mv{,Y?ȹD+_ wuVb߾}XĉYt)ODDD :j|;c>FX,aPZhQZh$0 ',oFSz$zN|R 9"r0m0,_<ለH7#tk /K*-8|E_r;q URJl9Hr @a@ U»}G&ׯu("""b[؀ӻړ]:Nia:uM8`ذpS$V]Vz ɢEW-ZDEErt MކwpPfA5&70RI?Glt\aR&"YFYr%//Oرc{ٳstQl<nƌ߃1e;qP3Ԁnp0 ̰s_e`^8ᢦ^ ̳o7CD\ۀOaR a$L+V`Ŋa^y^x~ӟɓ'{\)"""]]p5wxH"ѡCD '|# Vd11k_|F$}ES $bIι _җw?o߾\%"""!~҅C0C v(YbH /%]8QcmAmx@֯ ;˳&4%I_`Ps᫈4pH$+oǙ4i_r\ Ȓ"ea{9u2MIh JJ͹"I_Rb@$Lx\""""}o8 AS3ңs0>3zH%&"l@$Lx\ """aP  v1&^p1N̹GqD״X&"Ҩ_&L֮] EZl_H"""2x g'E(;{kHqn9=XyAW-m@'iI_&L/^aDQ^of-mcto$n"rF$=& oȵ7`9 Hi$GD2azj^om )-l$.\aTP@b<)sUM=L &MHFL\{neX4l,o$F:v]ۆmp%I.dzש6`\ܩ12xSK:0 .fW%Kxۼ,Y#r&5RRR;fdoD`q//n w xkz[e=Ƕ{579zUXCէFZ%"Җ0Yf m_SSûۋH_ִ,2\J1|;ws=}~!o$aa^|/M4T||x>0I_e@$Lv߿^FDDD҂>&}#V],U4kY|=Sqe%'\;}7籣CR/ x]eХǚ/4RXD< rT.߆<4o'Tָສר&>6Oy:㜆:)6S˒`L'][Kg3.IWm0r"Ҭ&L"'Ol744`E0 ==Xo("""}Tvɱ!2_lm|]ͻ~ }ErMq]̧U>R׸$ 2^e{s*pCv Yt}# {INH~0yy?~a%kO9^X%Q]Rm8+}9qoSEP4y.3?؀i#ˉ_6;I$ۏE' I*++9ryDDDD4M1+^3>y a 0lF q'U19s3i6}l Jr۬Hfs!Zl6M"7,sb"`YP8HKD&a_ɓ'3dƎ#"""Ҥ$ɰ؜y, 11"fj_e閟X{}Vuggg=mhp{lo`+6w>9JP_)," &MǶmoWW1k,~_:LCFdUT׻Ϙ F$ܱ6oiFtFOic}=~]w{aS?ҡ7ǻKo78ڮ6yM ~S3Vc(yklG[ I/e%LUD1 &oq>I$gg<9ODDDI -͹㭐Lw<.6e9G۪0jϸK99R&~(R՘@ISHN㈤HaiπHJ9ѣG3pĉ\'"""}TI6 XE$LEǚO4u^h$׹&`VMd՛2Ѳlc?%G$Q]?P9D.㏛Oh,X/~ 8z(%\EDD/*jZ$:b/ߺq#1+Z/%6J׹H[ؘ W$~岆O3Ufyoٌ\y-vAaJ=LD="ar}駟~]`ܸqٳ7, 3.z`*n HykT g.IUe0DdӦM|>*v۷s뭷8Jk+LjOb|>R= FGO2uIfzh'ɴSj8.7os@J4U- Ms ߺ&Lf>,gZD&5Ɏ >U1*Ig.`[*lPXa(^\y|l[72=Ce9Gtrep"o .-aDҟŒO9Y/(/"""a@i'Lq#sGvNV2E]OqXWZ&&G᳜eݭTpH;;ٟ#1mFEV˄i\Nql1\rLSc=߿rfƧ^F|-ݿdLW5JSB&M*ϸ.(&՗0C $G!%]SPWi]"ئIqT2GDDZ/䈈t4|^`s6MBޅUPx1F4_/F$"""I N6T: _mawG:Y}L[voõI'ȢHI,2h iÀH̝;W_}R?< ,DDDGG|͟պzCw#`$Ӊ7N(n-0 wx ~a>Sy뭷馛صkW(EDD2 g9 @8nwsc70w{QU&$IS'z m|\g,R7ܪ&c}Z#" e˖O /d>n&mƳ>ˢEreMr'ɅpX(^j6cm>#p^Բg>&M='t۟@$+aSnW]wŪUطoe1qD.]JAAA>.;ar^^sEj_R%e41H\'{ܚH`!0l  I-<x-6e9֐=2IѠW&"Һ0,_lnulZ>&Kzc98T&H3i͞m|ww8Hs=aaTqLWgO|eТW-&9nb=H#-KrړH$xꩧ2eJC>lxa8N';09Ә=5۔dO/ûwzE ౓ܼ9 y"H[FlWbƝ*Ĥ)]s'%p&6UHu$H,ם^CxH&2>ixyklF v }l&Z#"&8t>(+W?9|k_nc̘1^7rw%,^iӦw߫JAAwnF^|EhF6'H_Sy1Կ$%-L`gn6;x^v5ƌU#F*w|9bUT73KS`zpI$OiK"EJ _E=dժU֐n;HG iG*tR:i(!)r)]K/qFfΜɲe0M{#Gt>_u>D"c D>;LI9 1QEi=8z=r>:ybN:M`j ^w\gCyL3c|# .e;ˌ%q8澝9!_@􊫺"L=LD=l۶-]WW8KR rsزo|;SO=~رKpBf͚œO>ɪUWw\3grm^xȾ&x{/MDDd@1 g&I$nUSu @yq/i24aض'Cfq0wˆpל൑gwz~} |)pV7&"U5׃E$&Z#"m |?-m0 /p\_p;wbfĎfΜ9;g̜93gv F"h/iEIA4Pݿdhn/[p<&P^wÙ}ldӜ{ `dQKF\8SQ Ç\]߶3$GWr~zސ$H~0\N8a[>3z}HeYt˲,T*ix^Nʚ5kXl)SFd5~w1nx+ MP6s0!'%#nL|sS|DzQ${IH;md J&\矘?I&mxb/^}`/@Woa`cc09vƍDyK 6#RsS?g;O͕:|\ӄRvs7MOqܕGڎ8]a i&}iJ*ߓo"=#??_-7CT9rQ: |n1#h,y/d烕\:9gxm[h‰ .L\e I8ݗ7Qg1mXѡۖEi$reeܗ Ɵ'x: 0|d[D%LV4r r"""AڂC”e [e@cIY~+rR à 捋;8KBW|Hq_µg֑ڰجaxo~>UeNIxdP:.>[k\S¤)++_+++1 }&5ihh`#G$ ?8>#r i : .|k: (s:I8q*>)|b^;X MM$ ~B˿chwl7,T8ܹrl=Owih_?mHUf^x-ӦMò,nݚ-JGQ^^>-6.U׻HNlSF4Ul9#^<.&ǻtLÀqÝיg΄=?;cŌ;=SS/#5zLS`r4RXD.@&db1سgO(//gۄa裏c _DDdP)-h}RNˋ;6m\R3'". Ki|9i 7 o[NwsjN۾ %r͒VëMs0.}'=,5!'ϫLO ^a0 ݻw{nfΜYswzjoN4eĈ{TTT,voXĒ&5Y ͧNcXȢ4>Pac`|תK4U0F*-]s;lv6yߤsH;A7;<ӹ+"Qt&[Vsxx=0iP$0xl6V6 ֧ӆHHs+']䐽Ͱ`ڰcu.\=@5$.ݽϱJCͽ~xK4ٜpeItp<+a"r*|iE>&&g"&s4zhO^_R\Q跘[6UضA8^&f$L`;&{;Y|\+M|-n;qEfwD. {IN׷"(a""""ҊsTn3o/i28ͤ$~ŲQ*${YZ7k`7.oلe lZvƴ&&L&9nb^\ 6KrTa""H+JԻ8z&Iq_4a" L(+S8O=#"j3mv\6W|~vэ`N\֊q9KrDD.@ V /Hg5 ̄i3oVFq^󩐋P 6*,O_;` vPuNA'$)+jRsc2Ӵ )9"rJsAutImK2nXe9?@t5ܧjHVaٰa˦(+t_]IUHh0q6^(a""""҆Ư\W}LN9WsI-n_t z=8٦apNzH70 l>ظYD%LDDDDP}IO=$lcRv.k,p ¶Mkq)Jʱn>e<ң,kH(a""""҆MF mCt9LNL_:в7'$Ȩ!)k>Fpzth+LDD.D 6d&o"mmYA|oucuC YkzuI飒8tñ2gV\&""""h2m ÀU& '3*O8rک.)Rlwٲ$Qňd/Q%LDDDD1B.ya jI;g%<Ncv` Nɾj5:ebIH跏H;n7>qTE}Lי<(`1}T%M.'QDU&Z,Qt&""""aCl4<"N% &qusyU{ U.NE&"ra#""""2$mTndɞj$g1<ѩ`*CU&rњ 0PDDDDD:#Jp݅a7s&2cwp&ҁ("m'K<&&JHH:?r&lS]X̮\uIskUe"]dKrԿDD:J <͈ByɉzWa6o|sJ/QHS2<&H(a"""""66Sebpʤ>jIS]s\>6ʣ;!s 6xPU&y-&t&""""i- j.!tȇe;_>6s5o\˹P\U&9-&hIt&""""ic0 Pcp#^<.yֻ\y>9}PRC2 dzG kIt&""""i^7u81|KO1 qq\smy"Ҟ%9y0RDDDDDdlִ'&kIҙ Q`B< had? P%9#"tɨ4ƑM#[ fA7W4) dI)tL8$G&"AJH&-NQI‰q pK"upΒ0RDDDDD,{Y,3%M-rLIw{dɾj7Vt;MSrnDܹ@DDDD %) ll .dX~ggqm小=ʏL,I|NΤH㒜?Ԝd T-HߖLC"|GD:C (F%Yri s$OmN+G?"Y4Dgr:.;"^DDDD+&$zR,'vᄂSfI̭U! βϾꬫ۞S_${BH'(a"""""Փ/1xk.ȧU~6m7'Kn!J D&1Ⱦj54Ta""][_cVy6xi[Gj^Yxmݔ,1 6-1v3!(evk5Ia),"]k7ψrH'i ^Xʜu$E_\86o|ڽ^s,7_Z#"{ϊ2$ @"mywtd՗\dI hd~?} >#$O&" JȀ2ι*2;6d܊8+zL41 Xri.J/ٚG"uQ/GzHW)a"""""0#lE8$Mmg>ZK8p.-2o|;Dplq.=%')9" JȀsE(w&EM~Eɒ?ԑ)tEIw|jC:Υ۴ht'൹g~yNtDtgɘ4_YT2AJ=Wz}mi&""""2 l4?LAcŋIz&YdxW(-p5Ѥl }N,f&Z#" XE/]&qlY7Ͼcɒ&~//1nK%eüv{H$ h>᫈t&""""2 ˷'W&K=ya9R{DҦANRDDDDD+/{2Ye͗E{ O)xo dz&x$GD:G[ȠP>4=WXdh'K6WMgVCȮ0St&""""2hMyOHĔ&2{vF `{C$ktP=LD0a.lOZ+Dz\8$GSrD0HQ>ԙs:#G4Ua""A ^`pU&%s QJQCL 0y )9a(a""H/Z<5t.?8l2M&AݫM~Ed`PDDDDDls -5{TelIPqD 0e ' x-{:qDO,i`N$ϫ 9"yJ2lˏ"nU&"J1 Tq; ,),"K 0Mnj{9 h '/u|Z#"HL*M1vX ێxs XJaQ_G4!>橇t&"""""9TVd1ctXd~_#"KH(a"""""cN6*y9i kJ\$@>mFuu5-bR)^}Ufp:lr&rX>O QZ8ᬑj*"]I/p\_p;wb&sv3g>$3gd̙m^z% ;^s1~΍>>p6bڮTnmI cvF HwВ>ĉ 6켥2G˲H&XeYR),4P+V$HDDDDrbwI2mPr,q6%iH`B[fDÂZun}HHwpU׈HQI (((8lۦǯ]5kd"֭;`ܸql۶ O~w"DDDD[,$nc&.fhРEq`<Mk-W*wdDਸ਼'DDH >$LrλvgoŋYxqoo=:drE0AP\ln-tV]\l=]ҪVR EM( Bcfr%3ɓu$o?4yG?Q}$$$PQ{Q+W95HG/jAj9ݥFk%y$ICр ZB`҉\.y Ax>{*4fpD)],$!Jl56)L:Fk˗7y)Ah Pyy9 }`/oRE鍏%I+ė)ƾkp_R:L] m3`؊E_;T]pA555AO>-˲jSUJ5m=cs_.9.Q4D L:,|>ݻ7p񨠠@iii-ֲ,i*O?:֩/_fmGA٣jJ<yҤIrJKKѣyfUTTO>*((PII͛ggЅ]k4uD4VX}rEu듪.9ڎܹS%%%$˲t8p@--I?UXX*g_eZ}K%QPn2~V*6 IDATv1wgKaa 0 K.muQQQ1cf̘-@OⰤYW 2#n]7N}״8a` HӤZIgiDZ2,S'5LAn^ޱ ԗQ*< 0!&@rJw ؠi,]]k9Ko}cs"Whh;jŸ§gٹsM:_Ǫcc"Eqa &@u:$%Um?OqXF1.mG`P%9JQh)_Ļ-tOCa-k$IF6j]r \&@71Fɉ^IR?msڦΒ1#Lh 0z8C*IQReכRɂ"j|z$kig]o A&$ISGT>.rk2!G⣙ <&$IntCXq-:W0c 0qh_m3hܠp&a L&FcSS]gǜ+K02)F;9斷d0A&MiDGT^]6u*V@h`Ұut)9.|&>F4UZr>;esg& L4ꦐQ&YWLD F]ߣ ^IҩQ:}isVQsM\tY@F`Q%ݔ5FT^C#LD &e S?b(](_!*R@uO;BS0~=Ǣ#_V8T\W+丙 |&5vH6E:r.Jږw$ٶSF`Y1.iܐZIgiȌ29WgaG8k H#0Т CkAć'ܪ|Ֆ~AjS۾FJ%0-J13NTSmeR~7N#.!ASra Lʤ+s-or#Yz%b|W OSrF.?Bh~>]?ʤڡOθ9EG{c}Z>;wOaB`nvy{G2W1KZղ捫T^#gp]ຫ IL9&Z--ɫ+~Q rS~U+fXxr(],oHLe5eҒ0>}5!fYzﰷm RrD 2<ţ>@ą(}~UV+j,x|5euv]u݇=?r)}|R$UֶT^Z.9"@KQP;K;>*c+zMF~8[ {}>.r+G1%@hX4vgihҩ?ﻼ}5v]xՏ06m~=E` ,Wn1,I7R0mjcawH 0|e7&T(ZvYk3?aU%FCb}=R}Ґ>m;aў#0o5vp]k*v8rD#L-:Jn@]I$J>s CB`S,)'-O7\WF$V֠ZE9AE.ya&"@F^޶_+Y@;!0Щ bZΩi95WLa D`Sǫ8\tE_a rLtj%\𕋿^c"09&:ʲȾ}5~JN\o7"^Bѵ=j1G+H#0%/Z<>`–"@QW;>sehvY&Cj1vuαCH#0ed<-sqa LtIqFCzw3%@dRreR&"- r}}:{Lל:uJotmiʔ)H L#R HcI7\eee5zM6iРA2 rҘAuAǘ LQFiȑi޽{~upI ϔƔP[[;vHEEEҼy4vz<竰PUUUJIIѴiӔV*++{n?򗿄\)-ɣUna*++;JMMeYM^~z޽[ٺ뮻p8'OՆ-[hM>y*;Z W#L:@bb~(!!A~_6zӧ~qDC7pCXTTƍ-[TzI['NЅ OKt:uE͝; )..V߾}vjS\\Lzxp84~x3&pƍ}]I'R^^eQYYY߶mnX#e;wƎ+r)::LhI'RWW'QQQUnnn3o޼F?n1?яZ5#!!ۈۋۏ>`'Nr68xR^^nkGc#IHHhtMZ|yZ1`SP{Q0`Ml尻,55U.\PMMhOeYJMMe,&HVV|>8xTPPfwÔgUWWTtϓ&MVZZF͛7B}QAAJJJ\DIٹsJJJ$Ie:p$);;[n[4|竰PUUUJII߯!CvztV]3fhƌ"0A`  @&!LB 0A`  @&!LB 0A`  @&!LB 0A`  @&!LB 0A`  @&!LB 0A`  @&!LB 0A`  @&!LB 0ew?$-_L^^~􁽨t0A`  @&!,cI @?ٳg5e'? N3gɓ;[s}ϫH0YzzxZ=5W7|ST]]ziӦiȑ5j͝C8w6lؠbKw}jwz k/⾋aILLTnnܿۿ~.++~3]wuټ>,Ks_oCz?yd͚5KNSEEEZv.]XZ=5W!^֭[nI .ԱcV=wk/⾋5LQFiȑiB #y^ >uDc_D}tUv}tdns:=@1¤;C+55Ue5y{negg뮻P^^N<={V.\PVVVD }0c -YD˖-ӰaK/6*:C%C==6:Kѯ_?h׮]z:|?c>sz}9=ۜ;S sŊ+n"riĉ2eﯽ{jԨQJMM ڴifΜSj־}t)p k _Z۷oWIIF8w!EGG7Ν;v{Qg^ztphȐ!vv gYm6Ĩo߾;TFRFFvڥ~[4hztS>t߁xmNg'] Sr)өOp8>4n8mٲEի$);;[Wcۧٳg_:K\ɲ33/l㻒X#%%E- _>S}ԓͱ=@1%+..V߾}v4(p9>Ouuu||x<|Gӵ^w:r<^vڥ*{ڳSmm|>߯Ǐ+==KWԞA-}>pٳx<>B+>p}7<aÕ+11DcTVVmۦ[Bn߾]s ,"UXX믿^\Sګ͛7r:JMM7 tU뮻N{Ն $I}т  3'4n|G*((1Fַ^M­}7\poY0+"0ꂶ_8ߜ\6y~a'h>x衇n_wמ_paڳ-}>p;ԝw.m ­}7\A||<0S}7Lr68xѾ{Q{Q΅}`/o/4D`%$$4:XcY􁽨B؋ۏ>"0RSSu?},bgEE;^~􁽨?I%ϧ{y<(---u}`/o/߹EEX۳gUZZ*I:x`I&v+--MG͛UQQ>}@%%%7o{Q{Q΅}`/o/e1v7gQIII,Y޽{K'*,,TUURRR4m4effvds%^^Կs?EG؋ۋmC`5LBI8qBC?O;u.\}͞phժUv7 dr8vڶJRtttG7#LyyyJJJw߭ (//y :TqqqΟ={V-j޼y:yduW֘1cAiMn-Ywޑh0ͥ~kJ-ZիWKp8t:c3h̘1Ujj~a]tbI:r&L@KMM ,K+V/Ԃ Էo_j„ z7__5\|;kk+W_Ϧ\ӝwީ޽{+>>^ڹsgmm:/ (**Jw{9ݻWǏop/r-^XoM>]Srr${ѧ~VzzΝ;zK'OԐ!C$I+VЪU4sL=:xV^>@;v 7Bf~X~m5Ciڵw%Kرcڼy4hРFINNs=~XsIRvv$i[\oy_ܹsoJJJʕ+u!=:yCkT_z饠cuuuZlYH-[h֬Y?iӦwՍ7Wv˲̖-[l-[tǍeY&>>ޜ9s&p|Ϟ=Ʋ,//c.]d,2O?t_m뮠>q8^[puVp8;h^|ŋon,2֭ :׿Xe^y&n1o0nL6<w5>/˲ʕ+<رcM]]]oٌ92 /`,2'N4'p2üi1ɶ{G #̬Y6Æ 3wqGmmǔY^^RSS8o~S֭kt M0a&M?ϒXEGGk֭MNyUWWKDmذ!iջwoM>].\7nZh"/mݦ;v'ԭުÇk׮]-ŋ{W%%%Am9s>3g=桇 #t^mvZSO=)SH taw}ALӧO}w 3ڑӫnMGՑ#GtM8Qڼys\{ 1B'N_8??qFhԩzꩧt׎1"y\. 8^>K.JNN߿***tܹcƌڸq.]m۶t ͞=[ϟo}1Z|y'''kŊ˲=>>^ hUiFy=ZdIÇ%I>`:YF-Iچ5LhG[lљ3gn:+A,R^^n't$ʒ%K4gڴix 󕓓1M_z[>O)))zmKZ,oY7|UViƍK~q^X0jؖ^tIwQFWUйO+'''$$\U BqIDAT@Ў^z%h |kZ~{9QW:|ӃeddhٲeZl9=Zv*ɿKLϒQcǎiƌM9))IƘ}?ڦ•Lm޼Y_ׂ[nFcizaÆI򏨙6mZkÇ5u _zD*--U~~bbbgffJ[>@0%vR]]kٚ?~`'?/Vii?=7}Ϟ=z4k,IRUUjjjo].K?σ[fJKK t:zE||$47 y<-~ylٲ6leY9r$)..N;46M旿<OիWn[b [Zn]`w+?^/UTT}` 4gΜFtMJNNV^^kVryWIҡC4}t}PVVܹs$I?UV;Ԝ9stĉ4^z{ -z7r>~xcc;7MM2E*((̙3rt!6;w2224{leffBo?iҤI={$,1b4f=Z>nV]aÆٳڵkGfmmm[[aڶOjԩ*..V^^^x@ei͚55kFEiРA***R~~h}lٛ`Μ9&>>TUU5y͢E6_~9~q8?~fMll5 <… 3YYY&11$%%ɓ'^{^deem `/^lJJJYp6lXбϛ{$$$}G}|'pm+z͒%KLJJq: ^f0a7\s1?)..nvM||3cƌ1O<)//vf„ &&&8m{;f.\hhn,\rdfff9n޼yrmɜ9s|?8qʕ܇WQR$ (v;فk׮k( O?doӦr,믿 ?W_}% ,%KʓO>iB^EHQq-Zɗ/T\'@m۶>I&}'^{\yF $ҥKK˖-wҹsgV9Ry_~Gʑ#GLnuyQRl2ٺu&}lٲRR%Ͼ6*@N*;v| y Eqo]:v(+V0ArUWWQR0lضW*CcO%mܸQ6mjܮGyDݻ=)qgŦرci&W>ojVFq !} W^}U ̪Yi|饗dƌ|> }5)?k,T|rQ^ڬ^zf_c(õ(\u]RjUYhQ/~RHsl:u"KpeV_KU wϼ 7H1[}O0f?AْMSTRXK+B~iEq^r믗{DJ7$ޞ/ZNYsAHI5ݺu3vvZnm2=k;wnm z帋/X p>y双Y-5yo,_~"@H+-kT3eʔ,?ǵ @/X>3y=5'@֪)d~Pl//g @| ~zG=:V˾}B ÷oE0hѢ9ԩZvYbRAȾʷ'%/=ְ@3 wңG޽ ֖/_^{9ڵ+seɴig(>O8+qg"D%/=NXb~7ߔ뮻ΈSgPxg&ȫj Ü_݈ nI߾}M/m`M ^^j ei7|{Tl?W \)=&m2?ؿl Kp)>[O6.Y0KcO'<ިfhPDCjd/A2n4 _;^g~9.a)x}eTXK[.. HpeX{{NF, K3O,(^i) >[X) 5.bF>7xXT"Ϟ=ugЌ]d!V 1b9? b{U(Vvq\yTG 3, 6ƾ >v{i/ N sq & Kp&,lO35銸İT%F{陮2O2`DFI]cMGmFOQdxYMf*@!Eanqƞyi>1F.:oL7^>|JQa,gKPJƌ!(${b cB1 *li2JZbƞyµJTɉF'0](ඪ)iN  @(U~2cE6xq.](pa)IE\0+;`*_O}NZ!ϑ^KR!/֧ pշ,_!(!.,:Y hʥ8pP jkSR}HWaTٱ`m)΁18 %oG"’qܯ]|!;T[;lD ppLw,3J TT{I^nlzМV ő*@$Vcߡ;UT4T0+譹~]ڤ2(Lf}xu$ CIdU|N( 7*@&V}`G*?OcZSWGr9xZA ٛ'SY4xC3*M^j*{ę3烬W6{xXA+E$Oxu$CfF23Sz뭰[;X Ňx\fYA 6w[ J*@.y'e…OK\+ܹs#"MP^qr <PW`VPNK1Ɖւ>/M8Q= D8đ .>}bq劶6\8#m. Iw:k+Ds'L9 Oͥdüx0j ^ɡ?4h <@QODF~-U ixv+(tJ#X|nk!,3W_} *=BcsM!+]<#RxqȀl2 ހPPOwn崹ǃEn' 08(ɓGo2|O|DjС2l0ׯ|ջwo9sffv Cs"L9|4<1x#f*vu sert /RyX=n\G\AÜqD FPiFbAnzL%K#RDTb aP䵔+HW_}7dʖ-[QF2m4G>'an/u[{% Њ+&"QBZNc(Y{nj3fLKaoڵ0Ŋ P`ғ 0Vq,ŋٍ8tZ7N:ww_뮻8aۦE[nA󫯾.,.}Pm5zq0BΝ\`)[lG3#G3ӧccm\sM1֯__n:ujܟS\7_-21233/^ENF݌uEٳg`K/T#w}̝;LNѣG? H4@D٫WbŊ ӟd&I P PY h\۸_qļ1g8q|nӬy%1xvin3A`Tw"VènǎUwݺuqְ.7E t=81a}5_99em9x9۷K墋.2"$p#98z!?p9sm&_~f[oUZnmniÕW^<"@yfRN2H:W>wX͓u9,Ɣx$9ph"˴Lap`A ^YNs'4@a~PVlY9ռdN:%_l۶M&OlFbBd0< L<^|g MThbr9w =l ?~_)b>>;q[ Hvࢉmw۷'@\H,kfB9uք=P#9LX0z^5ko,9"תU+c!H_||9s) L5,Eyy1`E%a4^O^w}\pҔ+W\qeͣk׮?-U C(٠YkN8.ؽkc}55̒"]99^pw_qrҰaCັ /P+&5k֌k=PLD 7cY/Rc,jFc lx7n4ώBq M'G}v2Ab$|X͚53^xw ;Լ^uc '(3!>ĴMD}:vHۛP Z{^3ffd9Jr39X X>n,&ȇQ?'L +|?>liL}^;Bqh<+& 8vjJ<\DuZ) T')!=aèpiq@)a1V2ItDBYHFpBAމ*VD3y@ n$Ye|fm/"q&L˛ښ5k$yG:C(q2mq| 5:߄?\dfaéV#D =LayVT|F%Sb'mwV ð2[(ٙ`WVw8~řD2MFsoʜJ>|a rRA4We H-S9fAt1'fĢ("p8\ M:oHL Pa?+eovQLCX*Ӯa4q\ SBկĈYU0Bk NWɡt qd~caaeR\"Ye9v$ 'x/'g&&@llDC0q #,OX%fyujϿReHVJ*qxL O "q)٠ҍqa=d%ޞo5IXTJrIP6'?NK"V P#,e%PX"YL5֐?烕Ɵp3<-@`ߓB FX*1=G~C IqMg3XHw'y%qE Ћ":>i7C~! I%.֏2Ω%d!MPDI{)^p5UR*!A` >39 껔2h+!Hm gI6*X"Z+̋[F(@0+譹pIc+΁T҄W@j\Fk6):(+.>|U|G^Ϛլ P\mai}УgdIYv}E]xi$Gl fȺ2WQK/Lx-+Gg++cDu|@Lw̥ MCzVPuxi$GTX?#^qTBXh\XɅbu m{%^xuAN-is!%oG~xe$G᪆ͥކœ6$s=>DtŻ 8,jEWf)1a+r9MInGH/ wdtL  %&j G- $rׇKl TN *cސl6o ]|%RRr+}lkN72 \ E|X5[H %50Kr]DƬ B\2YMi]H %Gkh8 f!ŲK+(eZ3U>QBHI[HZm >U,Z/6Bt Gv#9TaoMD>;Im¹\W_Tjf1/lqfYL EK5q΅]3"qyGr)9y,KT%*so62ovB imH-zq-k嶓MA *,X Ç;vs̑O>Dn^X ݁a$HѺ\AG/Em+*@io&;w?PfϞ-%J ʨQgEyYrr+U(th fΜ)z~$##|_F Zw;vʕ+?.*TK̙n r.Miiٮ EtoL*@iİaLTqdȑP{5 `Pv`d.@3.WeUyG4Yfk.#.e˖5?ߴi4iD:sIťErA9qC."ٽ{k").WvgN(۷mV}]#:[vIo[&%Hpڵ94㧟~end//g_h).WuκzﰾTO@Ui~+ 7a„<&رc}u֥T V 9Q%$5%@rso_7U,p͛W6m*s5?)J[Oɀ۳>+\rΝGΛ7O֭+/Nc *oΑZmrD"c,Ѫdf` l۶M^y)Y+WN DZ|riٲ)8q(P/cggժU^ Wm-hOkrjecB\JP(q^/ɓK`R-Pp!;t`jLcFЖaM `1-1Eܸ 5n8l- jX:5k"@\si9q-b1- -ѲRX\6TdzzjiԨlܸ?֭\JyꩧcŊr޽{/47)EHq4}TXž}VZ&3}re'x"q̅^(wu;CꋜBTǂUX1i޼~}An={v~aSM0Z(ZS 1%@I *@c!HrJM)gT^]:b}f.]Z}Q߹s9ٳA*UJ_8D#$F'^H)\zWYG {/}PcE TLjMLx72DK.jӈ sϸ N:rM7INLu7%ĄԠx%KP LxD(f\cJk%+*@  EQR ()CHQRYfɐ!Cd˖-gl%L EI2PhI7lIa%.E}QR$$#FJ)ƒvҪUDۍ7QR$ð7k,ÇʹLs &>]v|T()tUR(.]j(J (9U}ݦMoY=_ߖG5!=:TE9$bGDQ#o5 1ߓ#deͼ $ƅ0hwfjժ! P[tݸ\<7 JvDDHQ ̲ed֭?`bA۷o;ح*&UƐy{G|IO*@PCK_|L2E.r?~l޼QHQ\ž={Lƌ@WPRpq+J>fDHQ(JPR%e)2TEI*@  EQR ()CHQ(JPR%e)2TEI*@  EQR IENDB`ceres-solver-1.13.0/docs/source/index.rst0000644000232200023220000000407213140546177020657 0ustar debalancedebalance============ Ceres Solver ============ Ceres Solver [#f1]_ is an open source C++ library for modeling and solving large, complicated optimization problems. It can be used to solve `Non-linear Least Squares`_ problems with bounds constraints and general unconstrained optimization problems. It is a mature, feature rich, and performant library that has been used in production at Google since 2010. For more, see :doc:`features`. `ceres-solver@googlegroups.com `_ is the place for discussions and questions about Ceres Solver. We use the `GitHub Issue Tracker `_ to manage bug reports and feature requests. .. toctree:: :maxdepth: 1 :hidden: features installation tutorial derivatives nnls_modeling nnls_solving nnls_covariance gradient_solver faqs users contributing version_history bibliography license .. _Non-linear Least Squares: http://en.wikipedia.org/wiki/Non-linear_least_squares Cite Us ======= If you use Ceres Solver for a publication, please cite it as:: @misc{ceres-solver, author = "Sameer Agarwal and Keir Mierle and Others", title = "Ceres Solver", howpublished = "\url{http://ceres-solver.org}", } .. rubric:: Footnotes .. [#f1] While there is some debate as to who invented the method of Least Squares [Stigler]_, there is no questioning the fact that it was `Carl Friedrich Gauss `_ who brought it to the attention of the world. Using just 22 observations of the newly discovered asteroid `Ceres `_, Gauss used the method of least squares to correctly predict when and where the asteroid will emerge from behind the Sun [TenenbaumDirector]_. We named our solver after Ceres to celebrate this seminal event in the history of astronomy, statistics and optimization. ceres-solver-1.13.0/docs/source/pose_graph_3d_ex.png0000644000232200023220000031631413140546177022742 0ustar debalancedebalancePNG  IHDR:{%sBIT|d pHYsaa?i IDATxyU]M0,, FET@\0蛟1FM5A4. "@UPaYgzzG5U3==NwuխsSUUAAAD w   AAA%    J:AAA$t  (9HAAQr!   CAADAB   AAA%    J:AAA$t  (9HAAQr!   CAADAB   AAA%    J:AAA$t  (9HAAQr!   CAADAB   AAA%    J:AAA$t  (9HAAQr!   CAADAB   AAA%    J:AAA$t  (9HAAQr!   CAADAB   AAA%    J:AAA$t  (9HAAQr!   CAADAB   AAA%    J:AAA$t  (9HAAQr!   CAADAB   AAA%    J: lݺsaЧOy`0h\O?4x_לryy׵ݻ ;PsٴiMZTWWc֬Y8t_AtK(t \rIcMO?*Ər'? mۆ3<˖-[/cƌ0|c~G}7nUW]S_G'Ў9s&^ys9ŰtR<O'xJAq–~g:u*:,tMXb~b͚5Xl8-܂~}̙aHo79î]0qDuYxb<8r>csᅬp-2=_ٳO>$zN: ܌o}[8p.21~)Νe˖a(++lذ'ND<UW]c…3%G% [y^=vXc_|E8kQUUUwڥr\.?O9R9S~aUUU5 }Q/B;YݻqF{}ĉ*j[[rJ8vk׮ՎkkkS飖HDUUUr?L$IqT۷ôi,?3 #RUUUTԛoY{M${qOk_{*qg}f*q-ܢڪ8uƌ)jllTyWѨc$Q'LnuŊSLQ].tҔ}Q8g ._\{- rq:{'RB@*++[SS q)d[oCoưaô g;qDqϕ83Fg< Ϻ\.}Ç[&AD6or?i\lQUU#G@u\0aTUESSG?WZd N.(xSOۇ>_|1. w}o !FW^8r(@cY\u޽S^g1`bfO:,"TUU>`\s5$ ׯ۱sNlذ+WȲlAp–7PG޽qƜv1hР8`}>e⡇1sLz,СCn{駟N?ٙ;CB Đ!Cpal߾=%V܌[H&YvP̒toq0U]wV~:FT Gq–0~/i\,ƌ|-^wy'ƌ'|2VڵkvZscǎi;aa;_QPA+ꫯf=_/}4 TpƂ p 7 ߏC7ĸqA-5VduJmۆxW;8sE1'2N>dTWW8=:Q f͚ <#hnnN{ܢEc8l_}̻op#,}ѯ_?͛7A8Ԭ}ܜhVhmm_H$wؕc0o?H$7n8u9:v(VHD߿V /Ė-[:h"̚5 >&LiӦy+wr|&]k?1m4\}ըG}5k /˩A--///~ ,[ #G;#?f”)SXq8q=k.oz<￿CaI&aĉx'pg+ķm5 ۷oǛoo>裏⬳qW`x; Q!scxG|r^^7o:8^1c wpWs3Rf>oZSL/z=|>&N>0~x,Y3gδ|?AVǖ1s.{2d׿⦛nJ9'? >^[ls֚.fww ܜReMy1qD 6 ֭ߏŋc߿?f͚C >7x`]w}7.]X, /s5IR@=Atk M =SoKꪫ`tA] 84 A=!.@QDQB!qHs81hР8s Ye֚yAT8 bE!Q`(t :UU!2$IB"@"(ZX . .Rل o|O?4vލo|D"x7܌w) zB$S%RBPUDBK0$ ,k(PU>`ӟ`455b̘1~ X`%ǃcժUH$p\ev C E(P<#H CUUmB5NF$Kz<[;>A= cIQa͹ǥfs}z$|BB (& mFڤ)rJx:D4c>nA ̱$"&pEI)l)Lb1( Yv|{AB D&bYYx&b&?&|FEͻΧ(&nHѓ0"DQG"l.<Ozyyy07aN( :QdYF,C0&IQ,// 2>L>ޜA= EQH$ ǃp8 EQzt671C‡]ѵ!{eYF{{;A$Ix<ǎ*"Y1֜&bvpݚMAfXZ0$Ip\(//B켱X ,k; ‡1K‡ :*/Ml@R0b0o! ]3P q&n $^ot 1<&I^/riL(aGEX57`-n%C G8qDQ[䘡`c#|88ӄ~LJA,W$B!F pzz[ t u&|(TUՊ#PAHDy0^&(eBKijW0!7]fh4X,A/&$ac_J ><$t"G2yYx<%c&| HhqBIљ9B$IC0쒱酏`sMD"{!g!C6Q,//b BڤiO$| qXePQQCLhs#h ҅!g!C60zYhGL< %\$$ ALqAdɪE"q-;4dkZͫ4>hTkdJ‡ 2CB ,"2B3GQ_ &絜a #i#CD0gJ$zMmSv*ׂ2t6+eǵ| !!,=Ew(aMOB?i CJh4 QYY #զ>*G_ʚ!C0O&<^ ApÎO6ᣟIaVph޽qs4&V Ph'BB L{Y(ɣXl B.MP7$)*; A ,eY֒~ f?^oMS+5ȀYh4 Q~=U6*|$IB,ӒlUHDibV2ijjSɱ#}xJܵ$Ix<0"CZ#fq0TUEyy9$I'[1c{ Db@2!!SoA ,ўjr-(#fgwQ!d( @ - {d n>1}`Yo}eVɒL*|pQE;(%H=lEOA2 6FQPVAtc@kL8G:~(BEK>Dѣч\.7vfM2=^04#+ >~p"b8jq25]v"X$-ג<0â|>_Jdզ;(vH=}{(BEEQ-bv(DB3ݰ ISP7'H  $ؒ!A_ɲ~!J3>| "t*++6v6\0CIK̲EEP(%8 DOǬ7>|999aX N1faXXr6Aˋt$ID"BHv C$<1]3y<%^r7임7Þ/ bǬ2`z5}U5WdO.'oA;iD.!J+BV^^tVK^w"ܩ{v.@ɕB݌G? !Jlw,|>mYXegJT3ǓKAc^%5&BB(d5c(۶YU5˥%vlYibKu\ES [ȱv17(gL,tVecU5ǣ]یΥegIX @/Ά{V@QK Q TPH%L&֥9Bqrcvm8vbiLDQB(63lq rp|1]?R[7kqfj fCՌNl{fʦ.ITU3e*g3Uqm2 F$tn73\,diQC hTʚl;ž=[EQRQC.g8!n7 l>ǑX:k<1TaqNÜdj]d /N7W p8=>=:DŬ۶~{jXCZwLtEm!3c܌*<#ymH;>D1w,H&p8+heϒ5t-@j$[-y>!"f [i+TE Xp82q N' D"[v%Vw{D(m}7J39 [aG]QQ]jHdɣXL9:.6k PI鼋H'|Mfύ\b(bʔ)뮻|{$325]) B\PRfxJE. ^74չdD/|$I#nHln7; " ,yH)`0QP^^RI( B"&n-Tї|(++qEhphT+o]I'p=ƒYX,p8&WJO`̘1СCq-nn߾SNE^лwoG?B[[[g*э`%VH6]D"zN0AޮwB^@ D"]b`k칕!AmDqѣi9vt&SmGPr=}F>IŶpʻ|fw} IDAT ǡCpEOӟs]w݅o\pv؁_Wؼy3~m .sϡ~;كK:r?Dlr(Pljmmmds-`aY |')Vc"/曘4i͛2:D¼zP+eEz͎O3;nvl%IB/zΙ^{/0bp شi( x̙3>jkk1}t[Nt?3)S>MH`8Z8j4E,Xj(x3TU5EFMp|‹ Փ%3`'|ٳg7n'ۍ C%$m0c25K&KwId˺;Ib!!n۬h!հ + @>' "BJe#c-SJYgLVω}UZf z!\q5jPYYr(~*YvFe&f%VOt6ùri]HX % iwT#[!n@R1v EEUoc Gb\R߼%=efXm©/e]Iğ|L8V^K/'t|ɔk&0a] f 3ǒF *{c-Wi6jh<#4Avx!Ct)zqv&% j 1K5V/lש+C ]%&2='c{x>q1$8ጻ9/" #GҥKѫW/0 Q{{; TG8<ϣ+vBט=TURPs8I70]~dVv8gWp8Q-nH]Yp8 YI$nےȱۧ-s\C (EsC ɣ=tIW1ɖ=NKי}nܹ/'_***!&\e޽W]uUn7@t;25]f;v]4 }s(DBsan=;oVʚEF0Ď˵at18dlLv!Ct:ٺmWVVj޵\6)&N;\<UU5ϤP&|Ge$[QvwƺYqw`ƌ?sEaܹ8|0z xގ.SNt-8,9_UU;VfsU<OJIy`]S#ߐ8}ga|Ʋfy+̉ҝwL Q }uXӅ!:G@RvwPaVUqϑ:<[\j(A\t6N%C\KK n444ছn'|Fp xG0yd{8|0nvL2gq#B'JfM 8cVU-;}_@A~2xv6CF.{:"HCv@B4Ds8#ft/xp.K+X[O>dkvolǸXq\zfeN/^X,&s9)qz fʕ+~TTT`ƌ7o^^@7 j^vZA'c #f^zǒq;&uR$vFxX:m醡Xw3 :D{قY@ B҉'f%-YPgmb%WY~)ƚ[ɖO8$uY-suٓO>˖-u={d)gb,|wt6wo,ǒVdY~fNbȇlcu/(MrQ } C8l];JgsEߌN{gMpƉ% il]zOWʚ0oq>I@n2D,XбC/rXqX,v-6]Nb. c&ʁ=$ `$~_K$'a#~_}ݱXFxteAvCYxg_駟;x  2&^,k!>V^^ٹr8 ] !*8%W)qR e'k9]M*e+{JY0v¤IpWBUU,\0׬Y. '|2^y\s5뮻 8h4 htB)3:α$|R;c-Ǯh5:~?n7ED4>DE^$qYgO?tgCv85ƂRxM`bXej$IB{{{uIfϲXdp݈D"ZH!A@$̙3q饗fp`xg]t|Ag?a9bVɒ}E)hefӅqḺ$bJT3xuZM"Њ++`cX8 2EIzU f hUJչT]]8 "-<0mv#hݐ+WU*ؽ|xN/wxѩS6DhΝbƄ9̮r\˹35 h {̜>lصHDf'RoWX -hd˩Nydx:8dؿX"dw:DFE"=$L1kBD?V-zg$se2^<\ V"e/-<2we2 e%t `e FN:BGol26y^,>߂ sEӱ&m݋c1|ڍ{ DI*U -ݟ")+C]Zk1b zz[1vK!]噵YCΝ;S^g?5@NAUUPM}ȫhY;RVV6[ HlG䘑.Xڅd+ߩel$)i[ҍi8sm68|>y蛖ڭY 5 "-'oj(-01{@zGUUh 6Q) YQD}M=P).ޅ;7 pq.y7TbBDD *E+qF[.-ц7]LzT Q;U@Irt.[Rχs=/2nV ~kq*hh01T-L:*w,bsa"-4lF ;&w~6lHJ1Fg;3M [:dw:DZضtvt̄gɶcd>Z(j} Rri2 vƖ[UWe1Gz~0 0U&-%H܅mGaU*ؽ pqb剖NNe W2 (Ԣyلk2wߍ /ӧOٳf̛7s-H_(9AX8P5vwr w,C6wn6/F"6f6VkR:-:>qΓQްŪflZY+$tɵla|B6ӇfCNP 6ބGv7z"6!xx{%R[lVl^ENG o%| mzU8kYhj(qn{ X̑k8Zq1i$˸{1m4 8-bDqOtjfrNK12:1{sz1M/Î1.|arx445a٤o~O S FW:dw:DFL춰E+îaO{,4A?<+wsy\ԕa_>ißc1ucp΀s ah`(6Ů]X۲ǨޣpɐKJA"B-:;Dl4+pWtL8].`s>P}x981\ڵ*ab"S1'.Xi2|Ye>,#jC=NJI=dw:DbKe @Ă6%t,.[yjEUןo^믅JhAN9F6ڈ6~pп?EЪh(oc۰yZpŰ+pb.Ƙ>cq)&Z!]ȅ>^.vwt$S}Pe):WT5J(rHɧٚ5.^=8.UԨ8z4G--ҙ>}TX5+۹|\TS(p/Sa"&`2?VE[YUš7 ss sw#akbi:~g*lMx<ٔ VK +\hFǒUU͘քg7>kI;\ m MENqx"!.kE&7bw&4~^V9R} n2 ;t!@ΞOgvt&YUH$0J0kY:ml뿳̛B`_r8|89!C45`AE(d9֪e@+jo?r f T ͙d.񆀛nQYivs&N6VMRlf9BD':D^Y)lftF3: 5 8Sȡ^;g:_ƒ@3q܈+%SUЁq. (Jo%Z-89 PSIh҉/;L{=ހ _oe.w Bjf`- ҅\qQd ZU5IcHE^H_ػx){ag{$8PAss;sgw&I=NšC_QN s{d8+ &ViָTSi|lIBB I7[|ʣq!ї eȊd̓g~)n]<e j5^3ZF1)}}ݶێlHW 8y%܂׎ -*hnĦC2þ>,j1N=1daq]Q ܉s{g-7.50Fe5:iH.6PVVwxe{?Lr|< /YS_?[$f":aGp)"').O8AcES?QۯVaFHR֙M^!2bZi Ռ.fRYz^\A<ޝ|}h EI~*+UDjn>F0l$N|lxAs;\Qt0|o֎CL,w,غUw,>Ӭi6CEl?;ai5V&;gyL˞nGlXd Bjkkqy'@߾};c̙裏p}aĈxwӟGw Xf .2\}իW㮻(; ~Dzfl%'H׃UrK9 1n>Kڣ`C[[ٷqص+9j N=U(K PU)i++U_'?HBɟE$Qmeeȑ2؎cf?'24cVZ_mɒJ;&[ߊ,TvtΦGbŊطojkkqgǤI:lnqé/4B4DtjFۓ 2PQQA,5;v~6TUűcR ;nh4X*i@2!#-c_lk1yd_SclWNXĝwމV1>^{ 6`„ X`M7݄g}`p k׮Վ; .DQz8ᰶlJXGkk+<~ư8F((=z xz;E$I}^,S9SJJVQ;zñcᤨk\.seHzur\(tJrL|eZ 7$O {&6 ZA|$ X̱Q!8.|X|9nVy)ǐ-~hG 0Fe^+Smx˷v~ Sbxq;߂jU_~($IJ)5 O({þ'`8MKuiAп?jhb58sg V^ha鮥w,&51v^^tnDBIϞı1L7{vvm6/ڿ(xa v>g쓠>vs cE뮻2w .HymذaB8t*++j*w})\y啘;w.V^ɓ'DQۡjvbaqc)SsL/4[YG6d2B|Ix^ƦM{]9λ9445 8zT&ǥ(@~*WvvZ`Ö-<~TDʕϣ^Fu9R*x Fv["cN%)rG?s9sG6!Cd$a1<9C쌁Ys Pi;nUͫrJJ]oΫ?`~d;kOǁ<#H$^46 q˱u7^ ZB-)aP?FTp0N}2.7./V6D]YË[^Ԏzx+Z0ĩW_;H-j i'M7#jG!Hx}?5^wž}ؗZ=ֳgϗO<<ϛFu7Eo߾֭[!"N:餔c;vI wH$L3R.zkپ 9I{!n46*ض-y;ܨ0z[y( .Q{crAR--ZZR~3siw|QY"Hϵp)@U|ǂSWb wr<^/Ҋ>OD1Tl*VR.6flnCB>-z4d (X~֫,\Q,ٹ[wQ3Ыmxe+H( |oPـEryoINͱ뺿jUXsa8ކ[bdx`T1#^Wr|9j&8x1֗¶S~ p" EU0sLޫ&NT0|hԅ[]ضr{¤&Z!@UU2x^E< oۿΝi9Cq]2\M`K[[=J6CB,˚@CX"?ԍ["`m>ۻ7f 6܄v0m4˰`l:I;q^;;C,b|pk0g7=~~ *P .k;^CRl: CQ%C.A9}5P5\'?wEC.ҎB@8ƫ;^cGۏnǰae'VʛY{V^7|r 6К[\xϚyut~avmoҵgDqav")Vdp8kX[,6X\ 'سA "# ҬԲsfUTTh 19/my _2ePՀF^{+qjS1q*TXu! iXIDCGn\62x"R>x¸ s2V^M6_rnՍ݇wQ9 Wh `\qƛ꽫i߃WxD@2gڹƐ5+NA瑕 e X -q_|ӧOz(??OkUUU@Ot=fU߳tK@ e$0˳"rƿr%u:~eY& E<#6&*TU߯K%pз Yf . `páC>5$\EC!CT :i_ 5)B8$rDddEI6mmM-^l<7d Ay 췣(ډ'#j]<?If}4vr* I.%χ뮻O>dc/$tdjd#: s3:;dqR7-+2n]"r>O’/`݁uX? :*T,ز[6kQz/^؎v1Z-dA:52 GG:i'#v@{c&Hë UUkE[޽@ 9 7!v<0SYD"% "#D`0mP!ϘMpٚ95;nIu[Q%'$v6h:߯QP`pž= gʜ=+Z^oOeFgLde 0P Gbp e2Iz:\0x5q\EZnB ĵdg,_gIQ=Ϧ&> h2T&JsțE9VGIa\ȲLFFƔ\pXbtcyI1;Ih˛ǣ3s4s"FΙ3kGeV%ȵ~a h9``ӳ37w.[r "K2/9yCj" ti6IY) i>vLC̯6t.*|TMT)'͚9[q/VmEq8Z-^9uǴv zgȉ? lcU`$-T ݌Ζ-[ظq#6l;lXb6_|uss!^~eOF |N%~"C'ֱ$z9b4:ǯCa㧣C0~̡CbgH[31wqU~kMM2ckh)X,PW'SW'są :\.A2`̘!m-!z$!pȐTp:e9Uŋ2WwR (/ݻ-UHOW"wFk1r.8ujSHO oSdj*͹y"ua7@1ۤ[)C'1ad:lDXLԃ~"zsʨ++4 5a뇬,^]ewa--lٴZFa.jkO2{Iغu+[n;&I TTTpi&SOQVV/wy )$ 8ܘc dX$;O/dcuP( zeZ W)\"q]WjQ4MDGzH#7W\su̧*46*Zm4xF?"{,:ZADŽi[rs /)/Q耣G,<YYPTNfQy) DQ;vX??#!QMeKcm4ɤ{qK9ևd00 p8힐ț읝K0UU7233#ۆaK:44b_G/r7N) fE_@Bbhx_%CᡸM×}_6]Nv䣫_WW~U+rw??s;OyQcn?;}MP<&rC!A-@3B/}Zg?ܹ|Pڎ1`wƋGeg~/PQ8˔LNxr$Xc3POYdr8ISAEEOfƌ/?=Ba000@zzzj꺮388HFFFh|&=.\9q"*g45hZΓ"'05y-bg`"5e9g_*֭[քJB*”`2i|L1Xm)z bt[66݀=n޽.ngYv'NdȪ@$jk̮$Ö")cG:%cG[p*g{̴(V%NPpAԿ"# + Ӆd jE1Ա HK31apxP_/sGAӤQQPH"G0h2t}JqA{x}m3~:kք8v m6lH`|:dγcj*oVN 6RN 7xcCxq\uӼvO;O|ag>-І(qkݸ i2]ew`U:ܴ\z_a';vI'TfW2;g6d[Gp`1ɰfrp ȲY^|;\a喝={8}/cV#0a=$623 BSJxFDS&iSZ(2(XPU-@8B5}q~ rrեA,yvh+RO/TuطOUO>΄ADo > TU-cEk5L',Ydٲ99(ttS]m"yt,()18p@hwީ EDkHe֮dk*=1RΥ? x Dbt&]4C0ⶪÿ́矛7Ӗpa>_yJti˧ qY\mG6l^_otHxBbդ3 #)v'"+(•+\I)6,dY22]`z}lNMװ9O K2fZݭ|ǽFA~ mzbX0 jn+ҴR4|[Ȫ0xGd=~?)=?f1nXxcKiiic(xH=yho;dz{%z{aZJ?vij_)\\cD,[#I@c̞= gC!).u gq:50D 1X,36-XR'/OfvN8!z*HiDg;:u|=ʜ9:?Qt ,, 1VC`c9@ktMe@I0VDzbtFo&ƑI-í_~u]q7;w`aƽANv0gʟ4WN{p{# "["-z~?oռ뙝3;nl=ȉ:l{6m4"+WqW#IhjyOǦK"喝͉nTwW_)HoD(5MceJ>hynsb-KROdZ zSŸ62BLYtk`rsbKYYYdР Fq (.eرCf<: ]B'OZ>?h#l:/ٸΎvWQ ?_2c,,49SԠD'3s%ODߡ!a u j!~B!HȲl3gΜQ0 ǔEE A}=JAT 5hoG ;vXn /{deHG,~_UrS u6MYH6-灔”`0Nf2ɢ6ǢE"3lGe"f!i,.&sues $b>X&^Dy*P(̫zGƴَPY)$9rD&bEe,\"yt]BU ֬QFL8l7Kl\*ݝ\].[P,4f28"m-3S.Ks8 \.2!X* (ϧY"nqI+G%[JX$9uEQJs g¸hH4'F7Yzԑy^:lŴ|ˊa}C}۱bpG<:Q4MÏs=(,aZƴHI4PfG#UWQuER".*1m{4g299QR"h;މK?Nn+,[^A {]yvp͠s=jzԛ_gZ4>0y0>XvDg^"{70՘jiraxw{> +Vvxb^^{c;v_ŋo~LᏇXRzz:v=a!KA:w0ĉq9Sق !O>ijx.5ho6Sp8VLoo: QT#A k3g,eO-| ~ǥNBX Fۨ}>ՙ ,ѩ LQhmxQok^(qm=*JUUA?3V퓐eٳ ,1زE:׬|2,zucoB^z%|I֮];)5ޚH:)0t*a"~k?FmmkY,a.+*E4y;l6E9EW8vk#}Yueuj4]NC8,亮S( ےM'eUūȲg {Qͭat{1.t_},w_tC烺"Fzx;]G f>D+W8y"hQMxϋEtz:iD]((a H36zrOO_d˖-lذa|;ߡy=;t6l_"ؿ?Ot]q3/-$ cL,LC$~&%OعӅ>:-CԠMwk4k̝kpL[ ˜8! >Q\sH:gy I!RgҢE:g 5+ʴ?""40xUA ]WPhʚaDϥ"M$V#¾64$1<,qLu YIqJK4XEf~evȲLN+\dGU5ϞYe YVIOhj! Mws\n?xپ};?;~򓟌yԜ{k"ep0c":ef~w=VIJe>%\{uH@) /-/+1i+*#mZb#ϑG"gVJM{ Pʙ3| X(N/YA] -r( i/0>(#r/j 9y8b naKX?J&ۑP`(NObs&S^͌lMg<Л QL^Z$f͚Œ%Kp>ǎcҥc>wIjbŊB?$K/) ?sOڱ4وqCun7q,ޫn ^uf0OvٵK~{|KlݪRZdkEH𰨕 s>JK5$kBN9^y Ϗ︳D$$Ϻ()DEMPS(wG իNH͹.RN 7 3@ MhhhLrĦE/oFEѬEDYiڃbafE_G]tt6gܵ [Ӆ(5Rl/vusaXV#̇6ZE8Dް IbaqX1.]bٴe_y?v.qmBPGv,#Dev%$9$cӑƒ5DnGUUMx cZY37~7X0d޽^y|)L-oUUu`Mp8OF=o[q$f4x-S01XHGihPu|>v%%aEdy˗e=NƌI3=&4 7hJAAY $$$EgϞeΪUm324{G}ž=rOw_#i*LsɄɸ( mjν2tRc1d&/seqI qX.dIμyZp8̞=ɟ3 ncv,zpTȰe9|"9FIaRͧ6M0)ͅ=++kR?hQ\^~;;@l]݇al6/9G3Vي/-t:0NwMIF UU{:?ۋo|0XuA/^z6OKp[/oEfُmϦž\wب%1u((UWYR$&*$5zbTLwq"7|3"֭[͛ٺu+.\Fy𚘈ge"OH] Lǒ̟9p}D0222&O20k8m J&˿}{:~(,X`P\lk/&jd\.r +~H@PM44gCQ`jrBx*Q[+sāVFE{n.i*REHYov*Rv(,q[s$NRx1,ט?_0YŏSP`p)?2m-Ҵ\.U4vdr]Q`sK-,0:o/5 e0ad LBHHFm#QҬ҈h6|qj%%onn((3bQQâEײܷ݈˒C3bE Ik~~]k!7"sy<"Yhv7n!=4jYV=m{"E v Ke1-ciS__ ?:׻ݑ?mY9(IV5. #57Jjp+PUw^ۗ=ҥK7/Lyyyv]4JX2'*Ιl?gp8DyK34&KRGG}}}|+_Ix<5 e0!$3^D'Vq;33M<7xq45\sQUYi`X4{*USYJHu2E"Zݭd ]˿Vыd;8{,WU_Y6k:sm"/B}9I@ 0-m.+R/IVĿ1''YYQ'ٰtk:z~|yOI4dI YtV+K/t6< .k_Z(Yߤ(JPOA4OTHg Mpt6!Uo}f:S UU#ߵt|h+{xBg: ?dt^SOżfΜ9;vHlݪm=_";[o).6HOQUbA@HY,rs - 1sL^5B" IDc+g̺MQMFQYג 3/,(-)/2 5jjd>؂oUΒ%ӧtwKWVk,\y+WĚ|Fib`ŋ)O6c)AFf~lYik糳Yb'OnԜ¸0M$%b9G"6=Tܖe9N.Y*#bNAzsrv0b$XяDEVhnY/싐egҰZ s P?T[K\iO1 f6WoY_Jv%˞mŷlYZ[pdTE!9ō[$V rS0ϭ)[`o^Z[hVJ9qlan\m*/瞊{Ӽ@R`QR{0*77`Ϟ=Z EQ2^* z Mlzȑ%:a":浘8#Ͽukn˖/+=u,egüyCCAt]j <񄏕+-H g(h j4~f&!qBviblaH8`@@gh^#nkh?Ȁ4!r^SM\ ǎ8V̛H\"jjY֭S q6oZ%"<{X8}ͧc92=SQl6(]hO{3N^wܺԜ¸0=(m02=TܾhFuW5%Ewch'7-oKX*V2˨ jA-0]C]tVI~z>55t!۾Źsnڍ7Ip [:3K}%yX7}}j=D#;R c`XPUϕ~'(L+$Ӟ㡶CA5 "go{#{* %@fM#͒_755]tw,&Jjp3 &7B'7 6rJ2w\k׮eӦM?cKNNVиR9DG IDAT0D%H,9YQD,v^쌿vT?146* /htuIl(Psu֯"I[lQӠU{4]7pXUVz[h"* Z>NadeANLI Ȳq0H($/jmbu{LQLX1pa`oѡ<üy:[[k58aE/ˬ[QQs:3aD(:Ls5Mulsd 9O)C'qa 9NHh<.f:!/zN%2k3l GY,ӊi 5̙hFP b{p\47x1K}8~ l{6{Γ'a[6e;;wُiˌ;op3;vqY\`o^.^╬[ɖ-hF ݣG͝tt 2 es=⌜tkzAtt!/޸qng=Ζ-qct [F Sn}O%5 lYtW]eZˋ;/n:{9y:/ROa`$r,M# v#6.==z!#S%ʄ&d7aE$bpHM0Prs4 L] lAaqoPTdP\"7r~ = ii]]"mxďzQ"(j((bg|>aa !GU9bʕ@3?6 Gի5Vlo.X*{¦Mbn`1ZM\*|yfKMu3mF7B/=RsRN "##:fJd{nwuw5E"]tft:G9rE~ݴnM`=b,kFK6@ZZ:OA,,XH}O=C!*s+/፳owyjSr^=*fcaBa/vsp`U*ffԂj;đ#ދ,{xr^:Rxa l.TUmpT`mEq7:ֳy+VaV,\%ǑM9yiB Y|4blzKn/I ^ U(J8lP%0\. ˜ʒȐQZE4C]9%rr{ OBE UU:^4Jgv +Vqi L, 7ZX<̜kF{b B&sK^:9CIa\ܱOt5c*{[V222ta}2+{ ^Lff&]h늢| A~Z>m*vSU8~M:48r]XY%ӖpU YYUK9}w.32|i(H/r}I31 L[&Z$R.ܴ\e fdIf(8ė~7G)}\J@U¦s0Oy2fcd' E n`2F7u-O䓷ƽNa4saHޱt#TlmQ2pG7eN#wa/_^!/B?UA)h?4$ Ge ``jkNhmrZ16ddښrSd4 i @@"YnlLPH#R <0--2[=Ls|@QGΝilOVV.'7Zii|Pe_yDGW $g_( >O 7#]8Rs”`2ijmZp#pp8L39s$-#tC'pXTdVk/B?{f´iȃ2].]|,_obfD Ȯ`V,],/l5yOq{D/'~jv4D)2Kˣqqp K p,Vvڜ|Kdٳ׼G#hau?2nG4f孎Afk qFN,#Y4mU731U0E7`F'fx0@ amQ,ƺM}aW$֖$ fŋ t}W©S8wܡ3wAI 47 ˗-lhշt%* 2}}n "ղMV`iSp8*tJH0>A^#!եM5њ&(23g &?ߠSI$< Ac;(("Iѭ`Ze[]o{{% 7Jj0dQn= nMJV{ {ȰfeiR$IťKv&=r5"[{0‚YUFUA5=5H\!W]=E+x5l@=`j_|yїXɘ7qBB¼6FVwk\bg1zWxq#vΝ%wr`5e'uŷ}d2Fdٳ.>M6PUåK~~wisJWRW%wp4^X Sm8b27!O-0U$/r,Md fWӴ Rj<;|ҥӧxm;?X3l""kzHڠ[DSyt,))Qvmg($::$dۥhHR$1Vf2m_g`H Qp8d22 rs{H̘tδi(ioC6|!No9#0|"]USSΦ7ta2jΒd#:)zH:)d3(1Y$i^ f=`@vŎ ڄ}q4z'E!==jd4C o!!/wկ_Yď3fNNvP롄n'uGO{bc XYۋoeL66TaW.jzk̮$ݚNsT?]y`Ǚ֥PUIa(O`]D4 ʳʹ{1l ͚F^ZtwE7ŷ1-BkP15#! x,)ms%Kj6 b19V3U;&zE#H{Fr|Y8Qzի5t]CC.FUABnm륈a8:ޫRZj0m"fF3*"p83ⴐeџaZFQDmG:ic+"Ao%TJoo jj$ΟrrFϊ*˖NO2˜8ĴUY6&sO]kyPs+Tbh`DSPPpאg #N99UI1Fj{"ÞA {/ȬGNWƦhHӼO=M4>~z~tx:"F'ᛷ}L{f,˞,ޮyߜ ٕRCϦamKzp?KeӖl l6=PWދgܧ00⌜g W3|Hk׿iDf9&닾Ϋ5I"-].#s>y.b[^/ӎa| 10PpER!jn3/w+.G4vzGUU  =0؁Yq8vF͢8 OeI_% f"Jmp$}v} WCw{D]Ј7 a햰Z!?_'=]GQtcǠ`< Ubdk]ZT7Fc̘`ݻ*1K#q=RB~?iRTD)C'vIm$[G:FYV$qBU~U E~l2D ~oP׋,<2lY.\ĦҢ/q"ۏGޓ9tk:uuOttz}Jyf9uu|i\$idgN*s*ڒEʎ`A 8~ERX?g=iӧkK dGlw{㎭-D5(FXѸ_Em8/WfIew17w.ssR%w+feʛN|#j#=4c=&^ojOI]XȘc)1$vOẋY6 mms/h%ɬMO qgEUM鄬,%B~`Dl*-JMUuq|*a艾d^O?D'- _P:>igP[+ȉyyYuuajjl&ڔeͦQVH9X_>5GCcY2{y1?b=XqK`pcP.UUrdqsʹ iWOZZIwt~}M"Og܎,? rY`,Q͛7ӟ>cڳN< ?8uuuկ~ C䡇{ޟvp1fѹk>kLfk1=3 $Զ%|Sσ8Nn}/E䣧Gٔ$EU**b$%EkV@4j7":l6VVnUyNF4`0D8,( J=u8c*QW'23ZfND44z{GV+,XRV)=/hcN|yK.{y J[\ru1{K/xbe(y\6V[+{rג}ֶ7&L`zzN*FtF㌔1&ߝ.JKh^9gas6T{*+Wɷa~|v(鬞\w.,m]i6ය '~Lb^V76QQI3M[D"cLKFDG'2:'Q?'N*CU!ϕԹMK`6j*͸-M[xWy3f8Ywr/W]wdBQd˩pB֯_m݆f??:׿5g:я~D(g?UUUtMs=g?cǎ?@UU_{ŸPK"v-3>'Fbh+M<0\0A-|C)df 5?(وb,X+WD}469uGY xfMxi@ZLo5C!pAkINp$N [D`$fM#)I=s]N8 |NWG5747?#U5Z(-UYP@'>P_/S_/SUeb۶dd4>F,fjUQ68CC ii&Ĺ#MFueYN5Y_;w_o7xc?$zXPAnN3m}LMM@?IIIXsM xG0hŏX{d-v;*œ侹z?vx^ެHwߑHZ"JoćmefLX+" yK~i\{QV)6-g_>CO-ՈntPy[l.f`ʹ RK;ҹ> VuҪ~cA';PU@ n?̬6,X]زe -/O8?#?BEM'CVk+F__P5 E|N9)I QTcpJsܼ<3HK4" `%2'$;:$:;%& F'$/-'FV7لܴ$A, OlUrsE)]tʒ%1;SO9P׿$n!qUQTGٌhOSq1JJĦօ'(p ##i/?xG75~10љ§Fv8\۟zϙa7kgqUaaB5m# 0qjXw^t'~W B IDATmn#fdl[fނdeztKP=[VH4rl9,]JO/Y,f% p/׼lgZ4CBAc/Q?POQrλ:'9#qI%4{ yx6ggWۙh­3n,_<$ I.dkq;7 X E"Og<\]x5վrNYwZubkg.P^SQQAeز7oo}+p۷8oG};vpW_gI\K1444BJ,lȲM7XH 3^Ln.<g^]Z"*B(!&_lN6Jˣ-]]Jlۖ8wDGDK&aC"b 4gHIHIj٢f'#C*)34$qٹΝћbŋOWD`>8tHW>'V%6o1kY6a9) 3f5KAUF<z| pqw":SPHY:sF &k2C'!J,F^±0y<@x0 ]mMwzv,謁>œ A#@׼n\pa.ͽd{2r'&룿6M;VH3fVfvl#nyr}Գc11XL~wwFEybCcV,f<掊;FFN+fކ桦okMx/0MӰ )gf$MͣeypX}ٽ;MU%b1Q4p:[4 D4 MM2R"8p`x,)Qvym3--[z{%G`K h$ےںu@ݨж6@Զ\3Q%$Cv/(kM-VU6(ÅnY Q\L3׮O @4YwP?Pf!x/qeᕘdC!֝X7rfATR?Pm3ov<yVfNYT~N#ەM3}fbsԑ8}9 QUu\bd\mM}}}DQ1MOOXիW|'lڴyVv ({w4?74M# )zw0S샨)DBD-]cRx=z(v{?ii^b@fo44@8,L=ļy2 baF--}r4/W(,RzghBo. f4G83x nj)фHKa@@6:b keW Vwͼw6/V"Cbe?s&%,k/h44X(.VX{olTrLB e Ig l޼w8":S8o oX&Ql`ݣFDo$I#//F~XFpLwĶm&22dEb@gK%r#A "-z-ѹ?b U\.!ptFij~hM itmmgK(tt yg<Çe6n4'q% ˖)Ve<!vii$ا^W ͓l<Ըљy!qvu3D(Fʘ A^oGeizI$QYNmw-UX1]ni±c>v*2*(I.ۛ5fL;PArd.`_>4UF}5K/!՞ʟD]q\|lsaʹ f`,0QmyrffdcFY^. _uBZST~磮ʯ±Z~J22,2ta <ڣkE_Q5M6Q.av`1 9ھZjk(".`AMΜ=J0b3dDvtR>qw 7ܐ^˓O> \>Xr\Fdp2UUDQhP+bո\.T50a&eÇ%>S(ڍwA9N4EcO~ﷸmnyn!J̤Lbj>7n.9a<\{aB:-eNQ) +) +٣ϲ}W\5ӮoIHiX(9fgyYҗTy1".8JJJ;F';[{UL ۶i?( ab 48tHO2(:%Il/9Y#8pā"+-M'IBRmDdдfӰDZ8-WU!f/",$tAيW+(XH!/O#'G%hhy}3UU"5j:4Ms*P[WX,niU^{-qt?N7K*mIw":Std'[:^DB$1mmH4܅BڜPl]o8spZDgȨ`Q"={ b 귱ZGlg6kˮ'9RZjkTz蒻fA1.䊂+0I&vƏL\¬>Û bw G j^8wNsu8v5p_5~vY\XL\y!|QVW rI',]lgvlv d[2?>IPRƞ=XBZ$IX,q :c B.kg×e$I_eoAEE0]^{q̺uHMMeѢEc5=1u|;g,"i<ƕv 6[% 3fh44i*f, 2~E|+BŢr EThk+ yfE ++jnlim@@-[F-Ʀ^_ۣ/OIшDT 18¬T EjزL0M&d;om3"fs|_R)YH}{6noeyhgi:ΙV65~10Et0!Dѳ:_32mbddQ"Xd fa 3cogztdYfF N 0X5mq@zEyȨ WG D"JżyY&Oz:OY,^9 s2`1Y8s_G-+4?0ұF"ۙSvl'  3fseѕ$8uOZ?! 3'cK!Mosj(Gwd~ÉJn Su%KrdB rfa30b7dawn:8-Nu lMY, y_yk]LLo Rه : 8>~G|`0xΈδi7ɣ>baҥlܸ^x_W?!W]uwy'_WGLpPUd7vjMl4nsω-<)$MXFGgUjj_VJ{U>N [p +V(DF2 GtDp3T-cCCᰄ04%Q+PH_l葳x1Sbt"A235%B$$N9p?R3'Ngg-({SbA={{ (,]cV|>2ᱰp)#=pe4B2p~y}=u/&P(t^ ?zBƓ!:6 FEz;DaARM6چژ2Qc0! '7pwL66ncd%'zNztKr.9Q#U&+_0z6o`r\9]q7i444׬Er'e_D##]GD8FPu ˥_iq}/U\u_Πo[98nʯ%>i؁Xv#70?{>RGceʳz u3?{>ވfo37͸ ̤L̲o ս6}7} 8=t[?fA67ykP\,&ؾ]f^bxGb ?rM ==l46A4*%JIxHBh"1%P;B{\ vسľ}s.taSSDg ¹qDF&l&bլ\^p9{y J8<6[ M̤LSS C 5S= i?XVJMo͸},,[D+8{MxX?5Ӯ!CCF2 Q_$I$c ~;+'^E-+Xmۨauj:xQר̨dI]KQjE"mzD(}>u;gIT6/IX̪4ڕ$8˥_6f@''qhޣhj/A|}|'^ $:9:d1_FrgUUAhl8R Nlm|9uJX&`2Z*M&p:kQ*c Wb399pL`2iD"--vEDE&E,RA0b1Q3Q%b#QX2kJRR C!99Jj/iBC2e 8"$I1dJRiBl(S]m5ܭUy c.l]hOF?S]m/)0 )3 :ngM4pY\x^TU%))Ue2i>M3nbp(vv;wT;ﰯ} jO/(nx1\Q=ف>٬.]5o$캍,9Ҍ=`/kypamuё'ٞ㸬qy`x8|zVyB'}| gqYYYSdIy;O}ӶxJUNHDA;n MSe6o SS3܇|իRRbH ӧG D26hkL!M)u_Gr--2Oˤ "x<&22T4-ʡCVE&x4n9Fa0Pmjش+Xܛ,NFMJ/a /rs 8fODHl#F0L)\Lf5XsZO GeU!Hwp}t%|)xN>BFrtu8EQl /I\eӦ. ~{^P 27<޽VC LUQ뇉,E̘!pI 6rr4OdDb2HIDKlEƂ.=htfSdsurá *'ݢQ*v̌1T5٬fӧŸ{1.T鄭[#TU98rDzFop۹(/HzT٢=m0љX23BMEQa2֟\Ϝ9TfT/|g'S.+V Fz!o˾D4"Ct:x=ڼmc,hd_:Zݹ{“E=`,dV,f'NU$NʦS8.)M-S̶mH7h jGi3NkhW^Z'5O'՞dBUUu?^u뱚)_A"JM6ʣm3oa$dy1445_wg9>hO0DUUQ4A?1%8w4$dBФ @uX,Аȩ(s!--1*߶(TU$!֦nda,Vtv*c&;7',Y` indf:ѨA*d v4=#HN0(uM`0$~HUk^b""bXKU͙ؾtF m8*s() km壏$b12+q ˖)J<_`-x (PR}oFk(u1dFf6Lm.uaL361V=΅ jpZX+3+4 58uxdIuXE܋^-v_G(&nX22t*3=3jf3~X -L\aH n[ YIY͜K+#GzxLK¥ PY鳸F$Iⱝ:YwW$I\}1"!J'Kx%=7od2wǻ*._)gNXܧӘ> EUҸ\W.>w?s1!pIv0ihF(" bXp:XrcD!Ia!P(!llV_~khn6a+GI|!4F iFoo'54A^^F4s"{hH]"LB,~/4#U HJkc %!)ڰX,x<(4NDQEY1QZK|ee;vc:,"G:fT9yrMCgI,u=3RH&>>Et0EtpA0^l2ݱgj(tk9YsH&‘S}]y7U? jjM 9ዌ \?zX{d-PRɕEWR㯡 oDD#ݑ,x^VY&k&MAQM!ɒD-lFTղ}רT.٬(Ym{QQ e70/%dIQm-_A3ZN;f1D dY&ǝCvR6f̄a:Ǝss3,N;\_v= sk㝆w {Mx)wHN=ͳ9|rJJJOXt鸢`G2g~ӟrʄ}]~R]]Mff&=.ȽMlQ67v{z#Z0r8Z#PT_TVjXrĎSU%ak/X, >jjd>*`5bE'3,m:FmF3)Zǔ SD08: NIOXLa,QkiB[56II.*6f +B^JS~A(]]&֭3esUH3F#FDYX,餺Yfw":SΧF'>mb,Uq."OD({V/G(cρ,i4:lC "3)z^<:ZY$nx[pHOPŐ*фp(6D5&3)1LDz`,, EUZtG:W\M9ƶmTbQ"Vd_>;^BmfӒIr.κo;&ƂoG` K U7\װ\j7PSM'=sdU*jjxe-5N*#}41|W^ykG?0*ofϞOg}x.q:"u3UU&NJ"x4<CGOw8NAa)*IL'I%ֵ|BM<!W!>6#CB@`GZ44QW'~ rrT4zz$::F#JQ+TU9ص˅\|q3̎V~ !ŭ(ʙqibZ] ?GOf^s 7k2{lJJJ8zSY$WNҡcAIMM5~&SzD_#---Ar)j]8@<vdcF`sf1IF d$e fkVdaiRl&5]5V-TbXCWe3X^& 0$  Q#Fl%ݑNYJiD([_g?ekVYU2ު{C'Y)N*wݥȨHPjK$q_}d$e$( ZvA?~屠( &."IҸ5z$FυkȲ4zx<\{D"46yUZF,l*"=lnё >`hlbF]]9i^c2 ]#ShmػıcyKP!-M%=23e\xxAzaΤNT43)!t*McKwwKtu 5UA6:-:ы/&yy--+SB7Q#aMVظlg~^~k1gd@_MN׾&Uv}BZVLw8t:꘩q.wsb H5lg6v'$:N%՞ʝwrHnRX6m[&sYej5 a3NWfVh}(?qx40\4HK w4M#D|J$JV\6 \. M-U 4}@`}Whuis ԡc)6?{>/~aߜx }oic*3+)t0w!v+ IH`DT!;㥴M:u|(**}EQpǹ+L&<}}*}v~'{裏c&p^Hꚪ1q&BFGijHu8(6YF]JAxO??Q&-M& OݗB:{͆URa4(NFwiؿߞE߯^s.hT2"VHMsTa$2E4lhj02m4KUrrTn9xP!"ק.IӄIQ:B `'A*&ѣ&~4f̜ (xcUpewիYzL_ L)LUzIXicOA(ɨ$IϚ΃,+ZÒsz4gpMX,fvզNrfΜͲe4cx놼3G>>1V2?k>~7Fn;+$ǙC$ABMSxI:N&ݖNw[uYwb=./;08Ks/eaBkz/Ş+կz b7<|wlIX seᕀ(O xB4Mc 2@L= JlFz^Z-z Ǽ瓒κ 7df͚SO=@$aƌ 疕P[[;5~B!:lL{85Y'b̴ZX|s)$xCYCQ$rr$,).(abv!xMb1i2L4ޮ٩)gtD=`璌DdzFv10&АPIbQjt*|Çej|rA{ľ}ee GK,xf,apIM;,6g=ԸљAdirrQPH9QX$9:x}XRx1 ߝ7CB@W+d{QWdThY,!0LM_ vEtfEUw]..ɹ+pXcS)`5F͉b3bAI?>DDPV΍3o$ ʉW,2lyA}ͼi4>:)1smu},">{:}=TVQQI}kb!tᒬKH%pEE$YdzѲè )!Md2p8@C}ѱ:[M7":@os#''g}kŋ'?a͚5 xzeا2^=Χ.:3zc=.+UnM4T(*z]Ln}y|8q$)ĢEaL&KNI!|U ΦI:1qӊc3fUxTdQF @@"*idF$0 cTlѫ>! iURMOFPHhmhjim7O%i~L,&Q224ʓONrHy$ugp:F!Y_ͅ"|>2E)E|uWRJs3'N4hA,â D`A:j.8&Xzo‹ϋ /P!7ngU*hwn6qni@8d3^89-9>r\9,[]~%P( ) t„_Z5W]q7}:W\a>s=2ﰚI|0uc1o #Np6K`"K`4fF"2g$zz [9uM*+!1/Kl26vq8¥,Yb xv:;%uR3@X }ЮKd320Ѹ>?p<}m,_ZYxu-[$l:A3o^`kx( o-9бN0s1j"HsGGORUwygԾHH/NpSIdJ2:D@'mS/Ə9fm׈2ќ9ȬڷL'窲h6nhXjfqIY&=5ˊ/ Q5oKO_}ti>"r뙕=*Ek]G-J#(x}r;c06S A/w, "_e^>1)(ggN.)d}[ZurJۂ IDATm5;N+GՆ8cQcl:Y-!tG:A5HP uj'i[L7rOuu5yyydkbʕ<ձ`$I.nsΝ$@l`5f`l>Sn@E,3qm/Nc̹:on]ۑyqβe6|Sԩ2PAڪ&;[`p:Ez{%vٺUElȲ*aNK)/3t23 ,0X~W烁ʨHDC"i$"H6WTh̘QQa,nE>DAá10;p@c /(ndY&?_'#ZZ!{sQz+~':p|i4qKǬ8K[~qtt0biLMx03d5VT)ި~;gމ,(X>FUWU]UH٨ځZ]- EQfUQC$QBDwF5vOrZL )w̎z$l?ȵײi;uuq<ͳה]C- 6 I^dY&ǑCH42.Fwח_ 'ZtG:~F_Tj܊2¡0N7mw03sq2b-t,2g5ܜrKxeErsu.Xei u"Ű+9\9vO#4Qmݱ_$$&hL VD"Љ vL(n:~S/N6b]י9'G=ܜ\=jBk]k'?f-KvQR?G5jv_{$I₂ p). ݖN=YQŪXF?~w.ŅM)9ZNdKt]'Ǚ$Hu@\cpF_G33,YsǞ&kʮ媗~f;.Ų)r]שfF Y߶))S(J)S5- F)̚щΣ,]@_hdv*v6u6b=>lp t:_:/yG)**bӦM<|$/Ϛ5k۸{ٹs'?8=ؤI|HX2qNÁqI |"VXBcg8aloy 3gJTUi#Z-ә7h?uJf4nڹ. qQ,DeE p̸ߒAU";@/5b~((,k,]:"۷Kl,y3jtv)St֯yt|, ܰ ó=f[,{8$ǻjKeY2v43Y✜`0H8ncaM$2DW-2,QGmw q ioAh`ZU$,6Ƒ#p6 xyr*`/~ ;`e}f͍+a\`SS]S^|1Y,ηQ5D&ݑN@+2 LqO8dh` Y'.zm=t 77~[~=ׯ?_KS(Ǚ(t]OIA0|=Y3IA5^sMM}d…*ǏBhFrsuVVil8|XdY>G$S plCZ1nwEWD W 4X?6 q:!=݆ vfhlk.ۭCWUUiz#Gr JAJ$";[_Ik;Wc2)Stv8zT䭷df8sƸF sÇE~;lnmѝμY3 oܱ;ьYƙ2zb $1nڋ3ٌZ!eeGu癎̄Nl2ǕCOn9$1 iI6Ͼ},[kݲ?6rruѷICO4tEQp8hFT" 03/ͽ4{ǻ[< SYƖ-Ȣ &8u sc%pyx^;5$I,[Dek%Y,ݔJ״H$Š蚎DuO53#2u=usDE{Vih$(L)ĖVpa!YKsD&]wҵ$rat@&1efSE@ _^rI<4٧PUΈ~JY/K;X8l̜ب[^6NgSOBXvu-R7O#3ZZ$ju0!zhȅ ho7%E%3S4 a ]7O6$FYY"Ahl?pXxv}}|"1gƕWTWީ{'PU^ŬYl+UM@ bl͙KwZR9wli|>4MrُQ#<;'߱>%4(r!k.(ڒkqN$EŚt;݁"*o($IKFSqt4M)S|2e~ΜٳFs( :p˖{DG@Qك zk6oٰAZ3-[]4AŸgN7Ϸo>$$+kѨ=^Uftݙ`&2#h[D"KH0KhyuhYHpq; oԼa Kv~ dgC4M!8(N)fF CdQFwMO ğ~HD#5D]$kKkdYf㙍t{k ܜ8dpӌt `L",~M; Y_a[6 \w=$ј\e䠮Q)(V_+0__$EE$04JRRt餥!`in8tH@eڴaM0w׋> ;2gNhm$(== n+|̙*KC__ #P_jqgjkj2̽ |~CUU:A?ϻ'ߵ첝= xj:jh`c8˳!ӑIo(ꂯբO8kfaaBKXUE4@LOY%UkaB.-:>8`4? f_>VfJ:;ɰeMobC#˲-98}L%h$ӛ>iȱcHDTRVBO[ m6c̹ -鳡;͊Ѳ=f1 6$q>k8sp94$:7ᥗ'BNN&(32$\{Jeȫחs-Qrs5^xAI## ">l.c h0(QQi:4X#.FDQB%@ v6pbC4ˆbTU:; 2w%ewCmȋ/UTDD|>8tHl* K튊>dCmlg". >)D0qV~}dhx1"ޠz73nEaJ)=b/P2nufS!*X $gq*2+?rdo11?w>^LAJ^=. ʯcI*VE2v |eWxL{ﱧmVQQΦR{D^<"~zv;CDו_(tiFQȞͶm\\|1\  oN~J>]v,4_Tz"#{t܊tԣ|֞FMVkkjjH::\Kvqxp}bO|*?4`UڥXض6L{Jjj3l;&p挎c7'G窫TRSuEvi̚(a4QUӎ/84˧4MC#rJKNqҵ>hjR T-)/ho7(Eʾ].C8uARRteQx shή]"!={Fmm|%=cљ,̲bsN=ħD@'|m:G:)bKKOՆ._M3LjΡu[ 2,:^-[ =s!9hh`AD߉Q21?wEOmGMOՌ`EfVbK!顶-[d>́8Nh;/M/ywTC-iN#c~_e?Ŗ/&%\mFYMw ""^br* E;=̧tohda^&|w~H\kN_fԩ̘1k2mڴ7l:9q?s6?#;v0t֯' =}Na"aj~ljXř}uKecFj͙SUe,c *nL"<Nԩ!GÇE$:oՉ>?VMӈD4ȊiPZdd ! d~_Q4DQ$7W@ ;2%Lm-tuٶMf۶gedfj;TujkxCw4kW^FF f#%~*qDiFgMXcg'??dڵ,]4N/N &p8K31hdCVyC-'-ܔ\슝6~3$V= ECDްg❲,SZȾ}iwhٟkFԒbK.lYSLg&j;D}O\./SWPSў([A'-{ח\O8D Y705w y5:G-%a9qڑ$3gZÊEQ|QZ\Yt;Y:e)mN(iqy&Z4aiyFl8c9fs(?| l޼;3vɺu;я~i˿ }}}\uU /w]Μ9^9OlxD@'kscˏk[l0* Q8vlQUe,@ t*+r| P_oV ++Joás=&'#(C T :;st-7(_7~汮tdaCO'ĭML,X ' * xuVTQU3yfhI':Ѩ1|*s|A꒞z{u4MDyキ@@? yG)))?)>(۶mcJcL/&NDNM-؉+d0Z(ѶzטX1qq+n"}B!VⲲ,FN'~vUu꺌Vuz6 IDAT܊ŹRu┝1= Q_O(:ĥcg]2  Y@LX5m5~ܵ.d]scfL# !oּ ' ̦1=h4"%%\Xt!A\`ޣmt_njkdjTjkȳqqFcOee~7&*6wc(2g78~8zя~?Nzz^,Y{kH$¿ۿCay'СCdggP\\ڵkٱc]vy$>=8AF%"{3Kd# D"vK/trsFoS A DxiYעTV|k|*/d8:2.[rlg[`dgk/It] 3(ԩ0{@QxQTjjdZZ$jjTdYe<(.>]%9|xh)):8.He*zK駍fNnwCE4МMlNa+~8.]KQPP@EE-OvbIGIcrXLtTE e_鎡4,M Ou`U*-瓖O|z3f&wq(k0L4KčLG"䨌Cp %|{(3?w>qN,,)\ES."ו˯ju߷>' ?<,+\̬vb~Yܳ R 6lEDv4;w,▙pA¦ysli۽|\1G;,]HDDXNN$.Y>m9ˊY17Zd&!0h:n8%i%P?8Yd(ypj>]s"m8Zp˦,cO\x<(EqNN-BTny t2ԦfLeZ4E@rpc\1'ݲ2Nxvi#c¤:źuq8<#9up3g}^QQ@MM k֬ĉqqHĴiӨXt0c?h4Sp(J+Wj)ק뺕qػ7*뿎RVc\Pc(6ȃi45 @DO8+,HiHv߯ʙ3ᬗ>D"Q).֘5Kn֩uiӂ̞e<͛>,qY%k%7ߔپ] 9C~7ֳ7vd̾-s^Md(6ĸq6c+5ZDgh ҙgqr] 3-/ TM@lE -{߳߀N7XU /}lɉ8dmk9wdTR¢E,,\6?93KFI³wQQ{'ߣ8Fgp;lPc#׿ϲeLϜL͞]["FU(I-"a5ot]geJL؅SsR$I+ePdžey y{r Q4DQ$͖FiJ)&5lB~ 6}vi5iAAk֬|~>>}8zjx G?! {JJM_ a\.N$ ,"--m\"A435rV wd-6{>\#Ν" UU"LKUQϏР['NVɱ47;l:)) C8<$\jdrF#I:s̘!7׋&9~\g.&&XXL8vLf;wL%5ŋ5.LFf62KAQDL34<{n>7YV9̴yw>R"{ny6/IG' 1==}BFl(t Ve<> ͳn]C1ztq[\YE˙3oK_▊[8vK i'5=5Q-j1\0's34ޑptc#_.k |m3}Y[ٴK)I+dIE.vw?㕪W(I+iWu/vN3:%̡+ nûiC$B- =":|Sӧ2#sW]hNMϘn* :ٱjKe9npܧމN.3]׭HߕW^ɚ5kzk$19jeD8;K: I8#ˬvx8vߢ" W_}U"ijy!}9*W\$S[+}N IR.G" m\ã(rá!I[g *+5ŴQAgd̟ɓ2EQy%Q"FP4#?.ZNBE7H03%b b3;㜍g\lݺ5isBtt8'˄g 'lo]-U'I 6DQdIDQO#]y-8 UU\_q=N%1ܜ:AuOuBRBӯgN"AcBw:$  < k9_r? ~aޅ?>C5*eSWIW|M66JK/c2$Qb <`͘0K2Kwrͬ4BeK%qϾ?OϠ^Snm3/g%*Ո9TTal˞g `Mg3YEKKK@u˗ObŊqǤ)>==}6v%%%#>OY0 g˞lpjj aDF4l6ZL$ v295Un,::+|JMHϠ˖s*sH}D0\Cii.RX hjԤ |fdfFHK  J;9W\S[+}}S}}:(dex<}^>@mme{!8 M(S=DPƙٞXrz"44p66&##y6󍤣Ĥq>&ı&DtAi k⌿,\[~-55ᔜTWP. Nd828y&ny;;vǒ%ֹTM;M&o:}bZ{`ʩ~+jn:z֚drYq'}}7A8wڸͳnfN|TuU:Ao[gJyu7kޤ/W|b/#dy}/}K:gbmIl#;N<τF챌>6,=B#L3DsY3e; r7%f-/۳G2\(PU% ~'g~GRy(26P9\Sę38Jh]C:?_ ?_ 3S]GM"HpOUNYnNcp54<8xOUTNP}ݮ|"=="6q:5!Lsj@6X.ʂu(Տkޗ%n&K6 1s~ 'O~tt7bO"3B~>(yk*x]GCF%`\–-,[텷s4zOqe rfiZ(I+a[6a/ eeϝO@ Zqqn>$b;vV_+7y'vY*nbQ"t]/\|>jkEIuq8QS˗|"sE|ĎD:V,V1؈n'3-A7pCPMuEUūwi(I 8q(.˝S.@%glE x89 ﳹR| +WꫯCY+dffl2?}"' ظq#^kfcME"6X\a Na=qR'0icC)˲{t8ۿf5F̙F#?ƍC6曣2RD"lZQTQCJDQ$#Cnhn6ʸZ[UZ[ʽ g4ewrr ncTX6$/JdrB6ISXϸF6WG5K@ UcB!ɬbḌYr>d]6󍤣ĄiIOOp X S#55d'ߝ5ܑF(ŅS^Ɂd9Ȯ+x t]g~|8u|"QioL(dPYTdV8ޖ\UvBv=VVS>ο5vY& 獓oՌ^3|xC^i|I{q4:iJW9?`dt #_SRP.OBAwltZԜ8(d2i6<,shE9Bjb4 EQ8g[gVUP(~saLFg.}֬YmƽΝ;yyǬ<rW#w]֮]_ rP4NpxȮ:>N"K<)o#%lJy9k +44l˗mQQDbAU v>=B `8= mn2mloOl_O"Bӹ BVIEEgc(Z-s.`A+r;[u4lawϏvl ^(5Ωwqxqn6o@qNN@+o׽\RtɈ{"^"WW\M~FxHX [ךz(}K);hͨ]&jFEyf9uuqN$I\11v4F!ٙBfd &7'Q-˴j*^}UynfywcmÇ~ȷm򕯐?>1&#xFdZ`Zd fY÷7!JMMt|Mt:ż$ &2@Cп/֬FJ)-IIhk3lҥ*Nuu߻"h $::$+PW'PWX|bw4zcؼYIsهB`6 t=qIyOW l7k39hpFh0 6fGdKh0Z'eѓ6ĸi~Ld&]ĮŒ؛fmȚKfo3ǺSYgn&Y-%˞KqfO#7%"ӳz^^z明Y(4TUTPֆk%6pJ4 oe, t23Uf9t( #FF>?D$*4龎E3h4jͥXvyφg'Jh0ٲICIbܐ$6яXU 7&uӉn˺@# /".7]?ඹQ6c:|YWRw)v=To]-^>2 nuu 8B|Q߈Z0WN:\W|.ĉhh;Z[ {Z-^:33/wHzB=yM2:$9ްk^Dny Lh6]u6l`n\ ݲK.msʱi;ցV7n X4yLItQ tHh4"+,_:b4N&`>XD~;RO&=b1MG$razgffro8~k!~;֡~ޡc+Ewa8bl٠40J :7۝|HL\8/Nia23s>jÇX''dQ ?'/O3wOKTTN'6@7|쒝v_;l2Me=.mmZ~+nmt("eI!:US6n]$ӑI8P_;fd$-@ a hD DJUꮵVZU۪mV[JQ`e `BB '3?ss3LR~Gf2sν3sy;&]su|-zlZ- L͝ 60MJvSQWKHr|q yq8RbS8t^^,f9Ix@vJ6Pר7RmqQx{Kk}4",W G@(G2!_, W_s!r^A].WPBdDi\Y-ðDʗw7ᆱkUV,ǎ9W \7-;ݺjoss]tf.-V㦺ZKmm:ߡ^l9⤲IR!C\;fJOS={fU IDATa])-u|EENn)'٢M飁enyi1yTP)VÃJtTj?,]H+`7dtњߞ㚜k8z(3(Ej-ĦPn*v2y ~cFvW0Ή\IIu _zkY$u'P*.v)c{EaZ;֖%&&c6WH'1'g CLL AvTWΡw73k,lp>a]hH$;%ǩn10c |Cu_SIi F9taդ$pmK5 lOBGO "&N43*~x,ѱl=Wo `fIYpHlns~~7< H如wsps.aO'ZANr( nl6 zvn٫ 7[]\Nݮ%/ύB23ݔKKNFFH,DO\\$B޻( '9ri_%nJAv>7T"FE"ԍFcᐄO=wao> ՘/Sowޔ7cHnaNǎ˘1$Xuit4OҜj* %ckNnP!Y%9w_&c[C x]jXp#ii^KfCGE{%ҺyRv `DÎ3;3>r5~:l)B^햼rj84Ftr&H%!߀x477,WQH+hn*A0DG L(_c(_քhY!qqqcv>@-JMy9}<šC-KD56IOwKHH81r%%ZBssP=7R PVZ2UYY.nI8g_TU<\a*׾x?A_v"e4G_*Q5)7E% cxSV3 .+JI`\8VZAfb&z6mRͰHȠ@jl*͎f56ٚXzx)Np8U IJl 2K!ŇSo9x.S1 L3Oe}%OTJ~L=W|Rkֈi~JN^B@Fʹs-fV_EYfA^bm8OmNr/'fFES2I}^:fkKq>FOddd%gRZoJ&߀R "9'6]@DGE4` YyMBBB+B9h^ժG1RLd'N$ʛ jZL& njBP]IrL& &~>sF٬EãOPyנ|^~eJKKdʔ)x|Aoߎ^o}*2:2#G뮯u]n5(}EPFx(3b%"EFoٻ7mےRzˈ߬8l$sc܃x=l 5}zVWkh53myϞ=]րZMC$棜)N~W2 MNA$ JreYtw v;'++k*Qux@#)u`0RVf`0(Wk{_W^\s5䓲Ohb8\.f%&NJl 5M54d怙niy^{QZWYs . ]y74Wό3LʔާTë9c:ða5N"@_Y=̄LS.Xw, 4o^f3:Fr݃fE vYxc?1tq[[ 1- 4ٛWޅthd2CEV+m"M[9qiii;_~M6ӟ+);w.=<W]uGlذ:*Xx1<#:uGt*p{t佊D]wepռeU1VKBBBap3&c|}<}z^=i&n8^G{Ǐor"$r0@СV.ӁD1o%%nDX@F*"# ȠfCyb(={r8SRRBAA_|1?8]ע?\DGEm͌ i2v%pA)GlB YZv;q8s=CKyx\"'w=2M>F[#yiuzZ=F ӉRgctM̂Ş7vjm7 }sdzEtNLl?X*mdg23{&]⻀(7]:JZ\r:洺vFicúA"ZZ_``pR/2lmfӉMR þ}>5Gh4>:kGK^ogөM-D ѐ\AA U'yhV},eSu E;:xb]tL&ӟxHII".?u]<3\y啤q׳g̫J]]#-+++'}vFѽU񿅲WQN"]sepy0htk"WY3 WФIN _mUB&[UTd! _$+t@G:aogцl6KH"m*PKPZ-Fɒ%Kc…[XuͽQ<(϶2 E1H28^ Ćr'&&FFdfrpk߿FVAg`dHN֝$ɐ>Ǯ0Uh"4n 3 .6g`K}d#bRjs5{}KO͟J-wgЉœBg'.6ΫC!ejL35 ΠU=BYS<jp|4s;yz'kabDΒ%=Wnp3aٵ30s _ҺRFt/tF X& D}q_Б#G0w}w}7`޼y?cL7̌3<ӧǏg_ѣGK.q0]Vt@h4ҁMm!))+6oC~P UPjb=2$Õ-Vg- \! H$)=r/EJД!H0G.;\Y`B"@h<_sV lɁgϞE3}tf͚k Q2` 造77"Z)\%9^DLdͱ5?/3 霨9%].ꜫYzh)9FwjG륤ĦA?C~:wSL2+zA>#Z;Ⱦ}Yi.ܓge\M僣 Lt&m||cd X1kz{nyҺRNVjE"%N>:==loCI$eIKog呕8\-QyHD o$G a_ =GrA۷p 7e.}RRR+VPPPÇ9st:rrr8z߹~A^H͔{=_D/% cަn c»[cB#9Xܤ4o86 -{UW1Nl̗2,ۛ7aDrPZs1?uC%:*hlT~Q@KRRR؆tp>;!_o Fa`l/ߎ&V˻G%^OʚJ:ufDlv+g2:%vBr0K.grOvȼZ؍h0RV_Ɓ'=WoHߴ9ʁs8p@~|BE!!!A2Tm}:>Hbz@UW+XZrSsg >okk\n#5G.:zu@.]ڣl: ΅A[շC_6LY}t7zjK5كfgD0$G o}Âqux477j*Μ9s=Ǵi9r$/s\}|;vgeԩz)*GRRF\g[@ 6#WhjB9<ނ u;>X:XLwy^<#+/qb1ce`hEÆ!\O%!9<45b4nyuͽQXx|8ɣ6?Ɂ/9`&^D\L9:XZ1jl9adFϘP^Zx {ʞ=AhJlK1sf|S GjCQ^y!EVO՟r9;(;WFjBAmլ>Ʈ\:N(.in_s)/&?-=5 yMϞJY"ETB|?xv{Ȳ(kC?o;wo8[Xp! .`ر\}!u֭L<<^|;8\nFc@)P$.}y ނ Fv@dG$5n\p萆u봘L-'|UA 1y=,,tЯ5tr DþPJBChY4o$Gux+뮼gF}&PRf_{!A%:*Q.RE/Z-z}X,Do8\'XϔN&~K ;X1ʛyq\{-{ӻCoN7pa B)=Ldsfc֏8YstZ"9r?d)#Pv% à5f?G0$f6 SVbss.]MZ|^*uӡwq,]]knLzo?tRSKk\.7D&.$O%Ero*Di"ocٓ={0qD~p}EqquUEjZ<$7˚XWΉo:e1=SzU_ƓK&af[6.r9XV_I^Z_ǚckh5qAnyD7 Hr !x^^&߀?ΤIBrΝ˜9s3f VjÓߪ.trIM* _kjY<Zs) '*Z(P 2lJTURB~nwws%S`j=oRjۣND@*1_߃"9aX,̜9x.]1Q/T""(EQHp80Lh4ip\V o ~ysؼABLSpYe?ᦜ䈃2t.7SXAZ|]PQ Ą YC:k~@Us{wʌ3XhksRUUEzz:6ld2q5D4Rt@`6CVFt(>>*u yFB"@P:&$EKf[@P#R]+~dMN"0`f3v`~v@]sP͐N8 _E!wݖ+_PF_lHOH'=!] o*R`0qx)awѡ-Zb܅Dbbb0;l(@vJ6'N00c $ryf'?t̓n2Ardd3;1 XV)$?]y(wيjoz3hNNց**xCeS%K,!#6)]Ce|x?>Gk2%oߒ7n`Er ]~ʕ+7 {><dggs{n{Mzz:w}7/ƍ'Gy'r饗=+HlllX%`$$?&W=o v R +p!H hl CrHky"_2y׿5O=s(P?T"$EEnH,-bC;n{ Pv9=+r07ԝ=$R823c.tTN⏬U6U:ΘpiKcO55Få]/c`qX$"eYTcuǸ\7{jl*8X 4XX1tocx ߦZ~ӱOPP~={bnh$BO:['6`FUU<_|1k֬@>1׮]bQF7|nt6oϬY0̘1{.U/DD ȡ\v;R\&݋2{"??#Ts T%'Rg#Gm2DB\A$JqpE\]]СCyٸq#[l(uaBǭQŏ.(&)))A餾ш^(S8j 9"U6JI6ϪsН?0VMo"=%՝ЊHٜ6_! rWi6PQU]d5:URK<6`ºu9Ȭ|gӍe0û'5|3f_-46ފƥ2422ºbnp" IDATwn!iOEE&L/ hjj(㕯3"蔚N $ e5_P NJP A9GDQ8^%Y HI:@@[%"cUp2rpJvgΜaݺu^U\P3:*BheHnFGm -G ūDMPMuQ91&)KeduuyqǪmx@OVԼ,ܿ=gP\G>1`Gbrdl:u}wro;*vvEvldHbM\.1114[|ގAg`l\ r $`6HINee%L8Q%9*B Y} $. ,Y2}8! -"M :X.%"ȑCY-{"(Ik`bUMZ[!&)q:}ݔaȠftTMI:~%Z-~_,oP3)DOo3!X̾R4hv6W^O!rPk%&&L6eՑUl&Nvj~&KGYC'M'qniNKWj/'w'75.G8nGpUUU2zh^z% pМY:Ih@D%h ^K_Pܢ=ypLLL+hdewd-3%Z{frC^(ϰ/ɁظqcgԌ тu;(@(#ʚ@eMmٜ1;4541.kJ[dfg8rtRzT"9Zb|vJfB&(511T5VW$:4c(".6.j1W6#t:#0ydF!AYE"kx(@F,P/ejaJC@&FNo)5H'\9_$N3MLH]$lU5?|k*BA^:tw+ H궛p\QSVSFۖtPp͎fo1#it\"Ff$9ֳXŗ_F.cr02k${ˆ l;S y0"!&|S[I4$2bu:^MÈ#:jbt7vyX(kf / 8`a$)S… ۤFŅ .:m Up8͞ o B6n/Ec(\i<C\.saƍl޼Ν;G}*~8PRnédChm9g&-WY^ rp(_~% 2 7u<μ=H7b/}y^;75)}hH8,Ԙk2WQXs1R#~MJ`I5Arx#iJYL&SNG,^M8*.|#:QxbijjCD[5W Z/﵌$[Ob=lޢPPHErh4E($rOyfu.ٝ{7S*En&6-WMcRmob4YψŲ` *A\×gd=4[NfxHъ=CK** 2 '8w{j5Z-4]v焬Ĝ\㒐7uoҦޖ% 7`yatԉ%K* eY10M4Xcwq]8]N hp %U%tĜt)*Y.oQRyM[[@xjb6͌3t:Ǐ[oUQhHHHz&:-MTZSp -e+66U /Fo&\^O|||IRB(C=… q\\|L6nN:E}*~XPx:n `D|mh!Nݶ/kC Ԝjxr#+ptvJ1 ˁ@ZvCAF9I98Vvc;8pjԙi!R}c_>u IEyDSiT"X,̘1Fźu먮~_osIz=#=_RRƒ>-hs^?\_'$e5Nͳ碏%C,o nLmeI/)hs]#N_O Cr|xw={69ׯdgg|Ν;3gv")) &׿%Quͽ0!#-mAX, ; "#'ІjC{M\;ΉiM2$Fz|:u#1&ѫodI˰;ťˠAT5WQYyAtKF!zk=UU=f"1&aoǠ7!HHe46HkЭV+?Oq\S([os>زe O?4s׿5uuu~;***xGKX~}ש⇅Pᠱ1`?9*Qm&VKntNL.ĦWilXVԘk8m:i#FC7c7zwM^Zm4ۭ;NEfUo -!9w̧KB* 96u_QP7HIfo>~DJ5 V˧~*=6sL>sN8gy$ԏ>'uVF\Ua0466Ą&zR-D&f" IIzJRq'XShW_}O>}+ʶmۤk[r%?| ^ Pԩ]#!9`E=wIO7?ʦJJjJ(7s,M&)$ܽu:RbSJ΢grO$uo&kq8)3jlmNrB\GJrv;gϦ5kH`qŇ~(=vxb;v, ]VztұcG^y晐SB S__FpHjI{M G-ZgQrߠhDSW^9IIIm'%}:_e 9 ,37n VWWɿ/f͚o5u"RY k3QF Fnc6Q@zn[>_aJT,31L Z0  F7+oטhĘhk٤ Mlm&jyJιsXn]$ছn7 o6&MbΝ_b>|3gzFӑѣGCO z].nCY-s_2JMr0$=e^6'o$V$fRj$j!r^<(>HH[o3<ؿ?n f͚|^zTuͽQ0, ׆Cx>̍7(=6a^x%buIII4445>Dvj($? 4ߘ5h칯o )2NC9ohJu% 6䟷l[)jf<_.(9;w[n'j*9œ9s8~ԣT"*+a84ze$BujK?`%/-<߁&܀ŦC)yt:{9r?8"%[o{ 6}iӦrJU^Are5OYp1okڊ@eQ ȠhpEY HD8emu-b+677Kc X.][!C5/:pW̙3^]sXP\jXVnwhEQ<&@Rf)@$}?bHPpk˺m_TE DKMZ}MMSDR %%%T|F oUt:9y$ӦMh|?,lVjA#AaO[&>>^D53Z}?~lO[@N؂{UIޟږWV[2WVVFnؼy3կXz5#Fh>BZ^ Hxuͽa`0Hb[o'p@ _eߏDHF*yC4jЃ%m&)#*!`ѤrxC^z|۷5\ܹs"== 6`2k"?oװhcA#m  3'x5 ARph+Ek S~'\.d$Go bη~;`0pӻwԿYd /W^ 5*/"dvjkk pbp8$M]2>բP6@վ$lD]<'*% r5!1PC8hX\B`ɒ%477_t:9}4ݺu ]w{Tz3gw^ W^y%W\qO?4&LwߥJ]s/DGEhll1lm_111R}yH7By؀C{ 퓋/k|}{mPR~'"5I橧b|'tޝcǎqƌuowڕ~sY/Oۣn_6-h/l޼={Z}[E Ԫ!e5qtaRnAz}`{߈̉VvvE ZW6=ᨿyjeŁpKArl¬YXhQ+р`P^^NAAIIIzVT"dTUUIJ""_ԕRpHO{x\.,ᖋC4jeem+r$ϥ@@%y 9=o7o&777ת*&)# ۊrWz%[&R(#bHW4d!v>*}ӖwH $/l۶m̘17|ĉIMM%66-[Hk*"d< 0ܹSZvSdrIJJ"))Xfl6__8v8$&&jJ HzV+L&, N3Aȅ }{l4[cɄ`0Y0h$''K&s766JL~Ar^|E,XƍC"9};99ȍ7H]]&//u %V\INNz+| 6MP+)) (3fL&?(<OnԄd#a8 {lX=BI'5 $''}ArvɌ3?~$gݻ_~w@]s|PUT c-[-܂`ʔ)qe< aQ{ʳJO,5hK/o n~B[*#)eVfa٢V-Fv5?ON8$g޼yKl޼Y# ha֬Y\z,[;qQ\\̄ ꅒa%Q,eG|r){e[8\MZVPz) wTiˤTx EB wʹiӘ7oӦM … رc5G:QF1j(^x -[/~ }0g}QJKKY|9wUW]EQQ'N$99Cn^ڨ(VQ@pZi2!?{3K@)r eR~b %ȸw^N / 7vi-BaaOY>uͽ0~*"VeK0=H@)>q!LSO=-}_|9UUUtҥs111<#Ͱ}vƌĉyYn+V &P\\̸q"rUCu(o-XTļ8Z6,/`aț}xڵ+ ׯK.ʼrssڵ+۶m{׹ٻw/WfܹJ֭>K/4*P@SS -Z_͊+غu+Çɓ'өSR=rBPA D/cV{h43 ?СCyx'/~>r䈤)_~|@.]X`Ƞmɛoscǎl2VX7|TS7K>gX.CY,"ikQP#b^js̙3$%%1yd.FTm,_QF |ϫYz5˗/g 2"ڵkH`zX؇BzCZ#XfhCI $$$DCo`Hb8q7|3CrWp 7pm}y)--%33)S?Q*.))dzinn>fuA%:*gpRSʕ+ٿ?W^yeZ_ ':frʰxN/܂8 m7vzjn^xXjwy'wuWPovSWWLJ~4hSL=z]s!H/STTT{`9N8 ={6]veժUtR;w.=<W]uG/fÆ k~;***xG56ؠ nN:Ŋ+XbwfرQXXHEZx&fh$qHB>DGf^$G iV}9h5kpwrJƎ\0狀ovc2Xf ˗/gS\\LQQ}nE|K>|e~۰8TPUF&iZ{?` N<ɵ^c=&ߚrHKKg?/e˸ٵk6lP\^;nΞ=ʕ+Y|9;wdȑӷo_}Q͛G߾}F>mfH AsssX#|ŵ3Z8h4(Gz뭼{\}!Tmݺu,_kגMqq1Ǐ7pSNWږjd>!0o}rr(ȇ(#k / s)&LM7?z|If̘#O~y͛*BU]SFk׮{_ݻi&"n)"]z^rh4X,VkPP '4#D Vk`ȇrξ ?h7r뭷dɒIp>x >sf̙*iӦ1m4f3ׯfܹhZ)((_~Q=Y nh(IA$J7^Deڲ QH@$̙32s̐H@JJ [=b 4 ꚫ'T{ FCN :YfvZ?FT JGlTm82Snf"x& \s5GJq߶l7̢E0aBȯ}[Ņx.Rz!RSS3g_}^{-iii1uT1Qu:]+Sh@ZҤr$h9h;4MKùsYK)'\SQQI(..駟c}Y߿ A;g}8'|2Z_&/'Zvc$YmA5E+R !'jÁll6KȀ3ζmۘ5ko&!Tm?U_-kז-[X|9$&&Jg!}Cc{q ${sJ&MĄ `غu+'O&//_P\?t҅ҿ5 :tog?GS'M2&ϚbJ/ SqĜfHi3SyZB=4|g̘1STT\oI\Ahow=qUhOt:y \s \s /2۶mcٲe̜9^/ wlnx Id(%"7HXJTFzCl6i·KYUUɓ;v,/BT;0{lIMMP\>௩62Gפ=|! x2̓!H72)ewhصkSNe޼y̘1#^q|>'ٸq#))) 1{|*op:رe˖p8$3bĈV0Gec!,eo,h/LeY`:WSSCaa!Æ ^\Ν˜9s3f VsF*B%:*.hf6leXf ]veʔ)L:\z)N:wp4Tx#=n$'qBi/#*Dݻ)S /p7F>dX,L&&IH$'Ҍ*&$$LBB:NSSԤd/RBrĜz=Fbbb>|8;wziӦy~|a 4H^x#77;5kxD !Mhl~L&ɔ48x?^qYrJJJ %V~n襌h4b48p UUUݻ+W2f8|ۂ, eee5.Loȑ]V]sUJtTD z+[oyTUQ03'4BsPDp&:+)8DR*'JSsbqE%uL[OE :rZlw+W|LJJ F {{{`ʔ)㏱jժgz?{?ĶmPPPOOOcѢE]D[y[ujܸ1LMMG__P(jIOuo%G/`ddTHɤG(PU'''YYY)d64Mr;wÒ%KO>U6; Y0bwƘ1c?ƠA_!""Fzz:n޼^8~8l޼Y.YNT[ )իꫯp1\v ?:v숕+WӦMCll\RSXkll,Ș000(hJDަ>^^q ܹsV7IOES-rrrP(PXX6.T\m### 8??¤GI۷1|pL>G&M>}m$Iҥ RSS|akk[/ät5JgΜ/bǎøqk.dddOM*fff6hJz6-Y'9ޔ jcPHr1yd@TTV4-olJAttt[ht>>> B||<`<~`aazU̺-P-޽;V\~ Xlݻ'''9s}ADDVFK)^d5U&UܪO5-t\777L6 -RRRfsxI0;y}S$Ih۶t}޽{#++ wŏ?BɂjXF^UT?U>U1WUtj$9:u*cccߣ< {KTZZЯ<  aٲeU.膑] ۷oWw1#55͛7ӱxb Pszzzpppg|033åK*/rO?~~~򿃗M'O ..QQQ@n0j(5 m۶v̭؋s+SK_S^^$I?GŘ9s&n߾rVMDaÆA$|j<kkk022B~vLdd$6m={mȀ7֮]+Է,:u*3EMEthETV Y&9硫JiFK`WOzz:F'''_^kINxx8/^#!!A-qty[BB⢕s ʋs-,,$GE$XZZbʔ)1w\\p={Dn:ܸqҘiEˊ) PڳJrJGT XɪU+1gرcudE-QUDjgFHH зo_:twƆ ?cڴiHIIAhh(BBBa=gteFT*5Sբw}pss|+**癙i|QGȝj~yQGU7g䔾.P #/@vttĆ >>ٳq*f̘/F@@WWWK+ATI xzzbĉѣGkpwwGǎ8T*&&&000s++ 100Ku fwؿ?kkkܼyhڴi&[0! C6m`a֭ի̙hĠYf8q"ZhpvvFLL <rUҋj(,\{ƨQcGnj|eS-TTꊦʛgooݻw_ů4|eFw=z //wA߾}˜1uT:u ǤI`nn & 44T' $ ;v,Ǝ\$$$ 22 +"7']l&L{ֱ)ħԤt{E۶mGBT| Fѹdee!((xlmm1c ̘1Cˍ5w}k߀i$IXp!.\X1?JU=z={`Ϟ=Vrpp6mڔ>RE$h? _sΡM68}47oW^yE7n 䠨zzz(**BVVڨcM*򔧦eSKơC[oѣCll,5~/jOOOZ XjVXKVZ{{{?~\$&ܚ166!11~- IЭ[7/ڵ֮dңj薓S6b6ɓ'T\|1115z'ܹs DNpI̛77TP5D ^u ͘1b !T*9ΚTeʂ^}Uk׮شiScУGuOQ$IFnp5t .ĹsoܐTs1n:WHr F [[[l߾;w.k4jjO2waddիW#??ppp?.\PJj)((@^^ u5ViFT*x8q;vĄ w2re=z[l3䄠 _BHH|2&:TDGG<ƍݻo```^,'N۱`ʕ+cKTh۶-FSNaƌjj/^Ѣڊ\lkbb"/U/711L9 IDATLLԒBqgm=;v,Zl]vQ=o =暛o߾8}4Νpغu+ {{{,Z-*PEƍ595b6!V\X$&&UVGi׿0h m:tBGHBDZr%߅9r$z聀tfff4hrss"h"lݺCCC\|ݻwǁ0fٳgo2O<ٳgc/^M6!--홖MjjQ#G*\T[{hضrUSHrrrr0n8XXXZ~ {{{DGG]ޞ+++lذ3gά5+..FJJ "9ӧO^T7n ##jETOj $'888ulll4~߿?TgFGG2 `eeUYE@RRՎ3f BBB\o UwQ^27š$9-VիtϛI6SܹINNN+ܯ*xQںu된> 2&:TwcprryxxueؼysFGGEh޼9RSSTԒ[TCJNzv|;v QTKz5Mr1i$H(j[>==={FHH._Hƈ#0j( 07Ftt4SSSָ@GdSh:MK?_~%N:;;j.-- SNp$:}|}}{aΜ9Wqj{n*-'' j#""xHFFFpss piDEE&&&hڴ)_K.i[y=oGUOʦZSNE~~>`llUda5ы1jzzz޽;w+W⧟~Bdd$q=tغu+&N{ޔ,W @Nزe :eSUJ%,XL4 |OQT-:"""#11)))>MN:aHNNFQQQ> 033򘛛 FFFrLdgg@m$?8edd~!**Jm{dd$6m={5dsulݺ~)lmm1eDEEAPԪUP*r6CCC\얗,( UB`ΝXbѥKmGll,m̸LuUHU5ssscϣW^HJJB߾} ZFv yRTkQmE]59%+ n_5qܸq u>MԩSpvvƘ1cիVBHH4\S1W[nۮ^Æ ENr*{2/cj@~1">>ݻwW!669r$,YR&sttDƍn"6qD'> 8pӧ6???ѬY3'ob͚5jǞ;wNH${HqqpXxС|";;ŸLq}CP(*=OVVȑ# ~mgKN.]7 RvѣGEEƍhԨ֭?) 1jJRܹsG_^WWWWeVK x(* czjaff&vډKZ]Sffh׮4h H$;wĈnݺ CCCe N]#}aĈիΞ=SPPi??~<=e˖!44K.U+z*5DEWב֭[ÇtViu5===yx7&MO<:4mTEATKzi1z$IB۶m1|$%%~+ۇ:;vGԞ~JHרLV`llP 87oӧkuM>>>{n@JJ {L:$IXbJ%Ѷm[xwww\ryyywETWN*Fj3"$Ij $Ibu~MϒR׮]˗/I&b„ bϞ=ɓO>ڵk?)Dg^ɟ^tIH$"##նϚ5K˿^zh"ann.rss5\"Q*"<<\ccc$ĕ+WDELLOrJ>ٳgRL6Mmc.=o|C:kΝ(...wlMFD-֭agg+`ii kkk|5z-$| ._,/ °aÐI&J%,YӧOh޼OUfVSU5*GRRFv̘1cP(\%[Vܕ$ -Z7;wb8|0郋/ҥKxA 9r3f@tt:(uȀ7֮] KKK}T0! Y0bwƘ1c<-1h _@pp01~:H: >ī OOOl߾۷'݋'OTyV*O'Ne˖>?U7ڒ uu mow%I5ƍl4jz*x 8;;?ǝ;wsΜ9ܹ3˜c.CTM5T*zjL>]^/2p@XYYax"c\rVVV֭[gΜ;SWV}իvڅf͚aٲe?;v`Μ90`FÇRmζ+Vq)jժAttt_FD/Vѕ-Z`ٳ'Ç+W^;FۗY'///ٳXYZucnLL <|.c. mQTjA%=~X̛7Om$Ib߾}bذajXtv/(Jq=a$ƍ۷BFܺu{֭r~ʼ&,,LI&Μ9S|ҕIňJR( q1qDaaa!D@@tP(ȑ#RU}sK/$بḁOt4ggg?^jA%5iaaaeGGGC$tTۯ[[x_$+5kfΜ4"** .D˖-T}U CTׯɓcy_mѳW qW$bر;v,rssH 4x!v 77joubرcaoo///?B^ϘKδm?s044GBahh(-[VwyG 2<)J#1k,qȑ:|!$I ,(?77W4jHmW(YmVynnnq^bPIDRRc. |C!www1b:vm۶Pu* gE6ly0̝;~###QQQj]###ѴiSٳNϏj1x⮑/\#GD=;2Rа'50{akk'NUš4iR>u=jSԺFD;"1Q{000aff1D腱f'4|w6բJw׮]B$akk+oZzqqq⫯M6...ڻzDۍ H7Ee-_b*<1!zl"$I'Ne 333#yۑ#G$Iٳ{DӦME6mnV"==]vQ!ItUVffh׮;z޽011ڵӹD/Bݾ}ҥ022666b墸X\j($!j^h߾=^~eڵ jU:wVZ! oCUޮ!N>[n 9rD>͚5ٳ ɇ~|ky{JJ  OOOL4 XjtxDUqF̝;:t(RRR|r,XVK δtݶm)TMڹsBk׮ gggabb"Zh!O. EW__~Y_666^zI̛7kĸquBXZZ"zꥶmѢE\>$z.⮮\B!ŢEԶ/\P[ԐQ{ (JbL:`ooǏ#;;<͛ajjZ{޹s ,MЬY2@XX-[ƘK &<< B]˗ŋC˖-YYYpqq)󞾾pttDllǍ7~<~W\upuuř3g;ht 666P*3vXKmU5^___,=&OJ <۸[>|!C << c.5<ϥiU @=͛7o񆈉וn'BOOODDDTÆ SۦjtR]H 5,$rssEFDhhkϝ;'$I}jsqwƍB$q5$~1>c$$_ƩS`mmI&&L}ʼիBy4i,,,`nn)SSSS,>ׇm->pѲeK1.\#Я_?DEE622M6EϞ=܈V ϸ;l0HoVmamm_1N]#۷o/MU6*=+bccK,7ϺtcmRggg?ӦMCJJ BCCCC:97"z&3b Caذat1&:D/@=_`ii OO*oriksB@@<<<кuk͉wЦM#88vvvغu+cs!aCS-o* 5)mn*w;ݟyF}$a…Xpa1RC5:D/:xBqS;wlNHG0=Lt^p;w ٣~IIIHOOWU:ǸKlHBTt^TTƏq_?CΝ;UV@zz:oСC]DF`` ^ +++L4 +V󑒒sssxxx 44̉&]DtaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD:&:DDDDDsaCDDDDD: NIENDB`ceres-solver-1.13.0/docs/source/tutorial.rst0000644000232200023220000000016713140546177021414 0ustar debalancedebalance.. _chapter-tutorial: ======== Tutorial ======== .. toctree:: :maxdepth: 3 nnls_tutorial gradient_tutorial ceres-solver-1.13.0/docs/source/forward_central_error.png0000644000232200023220000016066013140546177024117 0ustar debalancedebalancePNG  IHDRL 9sBIT|d pHYsaa?i IDATxyx\g}*Zlyw88vv!l/R)@XJJ( }y[Iɞ8qv8qdKdY$k-;XҌr]>g9q>{ 4M ɒ2 @ &)LR 0HA`  @ &)LR 0HA`  @ &)LR 0HA`  @ &)LR 0HA`  @ &)LR 0HA`  @ &)LR 0HA`  @ &)LR 0HA`  @ &)LR 0HA`  @ &)LR 0HA`  @ &)LR 0HaKwnnw*++xӄ?ӏO/>OJ2a @ &)LR 0HA`  @ &)LR 0HA`  @ &)LR 0HA`  `K_̞t `צ =t doٓ2 ׫{LWAAz͘1#e02t3LƉ'|Ryyy{vZ=#. @qֿ@`2B!566+fӜ9sT^^t X:d$ XaB^{5M~_֭ŋODa\WVuuqr8O+++SWWװljKW aa|>6nܨUTT0ӎ}Ge뮓b? t:s: BB%I&ei.H/ [wy֮]+4O9UZf֮]e˖ p8  r8>.=}Cv" L2jUnnY544bhҥs6MK,QkkKJJ RYY`:q9NfQ+2(ѡL4)1CsK/p8FuuuiΜ9#Z3dxd?"I(2yZz 2(xw<)=_/ۭx@=nVeggT}^=al!# 4V:C/E``Q*jtf%?QNN>򑏜i{iPɧ/N^Ϧ,;[tх~@Unn8?ӏO/>i*^Ǻ'\q KZ LF)ݮ)f^D"C n;/b^:ݿ--IMב%%~?լv` 0rssOZv#)y|aN> ӭcQiw(VPxNb1mQSW*SYY)3?Ӌ?;H/>O/>uSCyeee2(UQQ+ j*0TQQg-pH4YuIha!ЧOzQ'i$)p*4sn 2M_G+i۶msHD۷oWUU@ITMV,)yk~[R%9쒑3_h o(h``@ؘ^(ө*^Uqqo߮~[.*#ïe dkoS:s6]9Tvv)n) w,Jc%@aIڴi6lؠm۶0 ޽[6lІ n\Ruuuztkʔ)i~xD+CyXho8aYғ흊iHm$IRE+&" 0$y4fiڵZv0W5pGezdR|DfMn'@oWg07хi<ΆgԞ x *R QEW{HSY&wH@Ƌl!I2 Cy \yL0Ċ/$Y(d9z䤱 4)p[DdķO)3'7RP~T@yHA,1h2IWlL0j5pJ,yH֞A㮘P\UrO#^+) O&IR,ۥiL&xPHo7'n/RȰɲIdkr^|FY[7)b,>^hR߯_lU#$qCUUZ^THP Ɲ܉Unym6==a>yHV@28VQ:CUUrZ hs_ߠ^>8gVTUgA`q $=2F7,IPr#=H)S8pQSC b}}E+s坼&1.MuT[!=˯V?䩒$#SΆ$/CgvX$4Ow$<ޡ S f^N=Օ.1]H<=_W00`ܲn8aIG$)'`qZjF+kWM+Òaw52糶mW=Vߠ{zϿ}r5SY7WV&{p̳@ލp,GZt:ߟ}gwS2,qYiӇ%wqX)="0$ӌ$߾SƛhY%ݵQ_ܷ[۶s9K=: [[n}nJ[VX,յ岜I8$׫H~ 9qVHo"ȳꚩSb1lxN:7.MWI"::rXL9ԪlP{ >i3ksg85"'@hLE֚HD',haA+.Q4@d?O=z*eMtv*O~}eg~ڦXv)/3eYdZ,]f+> nSӦ*f%Dž58nɱ9B3^ԥtܑ6t})4tGPS^/i,sozuHIprŊKd``Sc Ϙj9VʿjwJmo,9[_(mIΓYYsVf澫kYܽSʖCZ+018W!L4szuYzV$Ia00L0 `~C[,\D;Lƺ]΁l'W5T<^{IF$,I .ZXIy_q&{+,R`Œέ5rZwuHYQC꛻5hZyj1ka9$I1g+W5 F`͏7: GSiml$)鹮#'Խ #.+,jj~~мi%WkH"0·.ߕ'6]7VV$=ީp,6`l=rDwnGd5 }|}ujѴKíhQ ٵG`Y ͘%)6gS]S $IGa;bu`xc1&yKp&8v9yy+I:k{U O_۩=$fԴg,lCzFx(g"_rE8?}Ʈ7We#ۯJʝN}w|XY!cB צ2!IRpEK' #0P` έ$r q+T$?}ޓ zK`׵vQ$)teZLdA @rp0fp^u;I송LgT0,I2M6ױy+ Wt D` =]nU,'~~r^xsVO(U^+ ~;bO4/-ѵö{sm)xaA͓[dD#rֿHiK/HqZLV4潚rt-Wg)_Ѝ[?Z_(v']RRUPHl5l# `D+&{}1I(<:9 =z]T[]A}f!q;=:qe5 }b0J~OY#X /DdrzTWYqޯLg6u Gv%Ò]ߪ7ल(kۖxMea`1f/[Miß-Iɺl)a)--/$dosrT}7я[#skL#Wi*gdb+.@` ;ÐڛK֣}}Qod0 M>+嶜|7:'G-^^/Ճ{y]=8&U$E }},F!M*oj?O3 C1]&G9zo^O%V6wn2y#ǾH@ 0bbY۷ʹnͦ/̚F~y_`<Fc׽-LSR| (-5eo(Kb9vhLKxG`Hy.yzS-\}tH(t:}^뻺./wO[_8ka9&I2v:-u 0F\hb$r,?#}ZZX IG潊%`}GtwNx}$Ţ9C9c)照ule姧&@:.[$K Ygf1 j%?G>ZƒiჇ&yVfe5r„&[W$)R2!y @z`s-Kly^-u׬]_ln<a}kW~v"}aXdx=~mcwu՚Ɗibfe}KpcooU]矐y!‚٤I45 E^Wwة}|}y,l'zY354,0L4smJ IY;QLY*麷MyyPH?"~&`ZեWw0?fպ2FxS'zIR,+[U\HȤg[ubl#kF IDAT} ɌkZ CwͪVnn}GLgא±~wu>7fZXP"L2ӻ<@ l6T'REd&tX=nE痲Oek=.Yt3yCZ6@ =uѵeV|:ӳedm">IRr "ǤFD$ѓO>M0A\s&Ofmd&1]9VEz95K,[C ͜#ߪՊ.(. zSa[e?% \xp%W߯50 }ft.K.8,G($Iaf!q&D,Saa>O)??_;wo~yr8.)b%MTy6IQ= ,^>_v::)D{s$צ Oh{o4M=v]:xH49g,Ikm'1M^zVF4PtByp"qp/O/X@>z{{UYYp&e`|mgdyeb~u9_JEvq8_cժO/P~MϔMԲ>]!Irm\/mn|~E[$-),]3g*Ϟy؛طW͓\Tc Bz֦6~[N~1hÆ WyyV^w*.>HbdN77+eD#y9Y14u@[T&IzpvX-yXV9v)4gpaq$:inmܸQO;GݻrJkzO|BSL9 UVəA p_¥~%9w80jUBTzGXLߘP.i*-FMqs"ժ;gUkEQQ+;-qKBf(//OivG[o%ݮx y;8';VhUi$zT?4 8wOhFԋ]} 'fh왚zw2BGp8,)_hi[XXgsZ6ᑛ;k}q_S;JI\jp'7v7駗]99Vc: 3O?ҋ?úC˾c /PYvv+$xq UHi$}}}C|yNW /USZ3R?N?;H/>OJm>ԪonGG3톡1MkzLs$UL.BA(2%iu߆q***۫`pV4U 4{"־9wu:y  龆] _@2MSۢܖ KJ}{|);}LfYz$I .\zg&Ŵm۶H$۷;ge^6yYv,4ʎ*toCɡi%%J0ӏ)h0?_߯]Yh_MdW]w2 Kr2o@ ^򍍍?_xr:RMM^xy^k׺uY>ƈh$̗AOYo&eWyBvH&ߚ?_eYN>rm$)4sճ\ɜN/@ƈ~{U$_4*I kM3][o-IU(xy+p>F\7.2uBgʱY[Y۶(rIyyynU *tkmG{ɵZu׬ZZTʆ}n9$rr;y>ыYWcYA91[ٛ_KR|ک5 .Y!],Uˊb nM[ KvIܝ@@큀_L*ʇm!5MϡVp4K̙14scHNg+0TLRUr^|,t{- O~׍ʿbmyE7t5;mW߯Gh=EwcMւfpPӬ`kuN_@ fVٺ;%I2HsE w%\=[Eeh|.RvŎ-r4z3][%I&UIcx0]sD^aeYN}i,Y?o{^R^Ww6'$f./Kse#$Sd$fWR0En&2RD /$OJISӦ&Eψ X׏( 47//Ս7e/CLP`iH 0/Rd$թܧN2- IGw{s$?4Ssז1cqȵoRb,@Z]{ĺhǞ{R(8ha47/W 끦= bF 8&GwTx̘͘>.ȵYڥLJsEFj`ԉVN[e&W#gXt*Idޕ;%B]߮5_ ͍rm$\9_re+0Ldr#9$I4aW̖#v}WMeė$U+4{^+0L H,^~lmlBnX)IIFpOzK0vuwN5&vf }z4Yc$ɴ[} `_Z 1Eえ%P~-{˞A>2e&7꯷鷇ZFGf2izSґDRC]P+'LHsui)照d$%W^XAY`,"00.  O.I29c{fҟOD`,imƭp,ӿO+Y.PunNK/u{EJXzA+.&F'Cu)8{$0M>mIY,B?]H7T'B jr{P< N{_e> _1~6m$|W]'Y- @Vy_S_P+/J'ɳEZVx|Jmǣ{v0n4 ;J;gVL*xarmxVFbyRv"\t8/!W+k˒77ʻfu]ٺwuM6'VjJ9cLӝ&n*Lp:wsfkF^s}oh1W\ 0XJfK!Y_'[$K U[:6y"MǦL֪N`Lb-b%8⬙KpAlx.yjYYi,@&`I1#h<7_fbeIcozA}mgàJ%'pm(-I MVh4W S³ɽC2Ir&':SזΑ(!@_۩fo_Ţ/̚OLBX;˹}$ɴ[}@&ƠȔiŲ]${[cM;GU)1IC.!ch?4@$"I*w: kUiI0r?c+(<ssό9g>|m6=?z%d3Ţ`xAAhkb"3f`s赫vUnw PS} Q4Mim5+ V^e9O:y/ۭ HDF%%LDd ^iϾN3|9/$Po/i8pjL+YcZFp/&߅XVJȸϝLd|l ^m].W\34ȵh_Pc=S2Ҝ #|_ 2H\kQK +`<1.ac~D8^O*f U<|'J<6⏋^ۚqk:zD20 !Ir F,wkOR{-1MߵZx|s~+sT R6=5$22- IDF7%LDd._t>r[OUo%/ljD)""Vxǧ+Yɷϣاz%W>MLh2#N 0L_ %0 ]SSy_ { EΆB[uӁ ^ϗ򁩪Wr=͸t: >5PZD&& zi]/[RzMsnsvm4910=C}\>[:."2a-!8)41+'es XKbh8RDD&8t>Dr5cMn@,?79er==2uOt#K2q PDd ^:?gYV&UOCp}8:M#hXoa mwԏAx|p:a1}tGˋg۹'?iR?ɛM !Άef839i8tkFJ &\x_5n赉b&nng >_VJ0ױN5HM#px""J 9D+qWٷWaxxOTͿ&o X], X0e 3\CSH"mg7/g8^X,N-fTa`B^}rٿnp-HD:}3kp|Тei\p9j?q_w%sv{+Ax"%ep es31'|tD^<-O\Ppj)z%Ļk+HI)YeG$"c&""@"-¥xňN`;/Z~ϡp`/M"p Jx!#\   ^;Ol|[$[1'M8|=;p6e ^rQHY9rl}jpW;X9ϡr'X@dN/N-_Nӧyb^@1 W-gWgvWrkv5nadg^M'pxs~n:֬Ycu8"Nh2<^hXd ;k߹a+Fhuw>VP犑H=B¥|pZ1MUFggz:""24]1!`pHCCJ Vn{v`;7Ε"2L0@L_PDF/5l~~pf#1 ^w:,1?)óg)Y2;b *#ZRjqD"2xIMM\jnVX ~K/G>UUU<TVVdy;1/HD["+|m8۰uw!)L ,HD+%L,fIMMz555l6/^ls8,Z-[Gz|󕕕TVV&۳g|;  aW$"7"2G{086;tm7϶#}H2T +aK?K_U FKq-+ ͧqT53s7+E>ZzǫHw9y|2M84M 3>;n[,ND;%LI<K{lt:G7cZUTRða b^#zSqKn::9 Ӛ閆+"2M?QOJ (yut8^IhZ{S\Dza7o c=vv؏[Ī?x: =/(L>GSxVg9ISo= Z99<<O3M756t mݖL؀M+ӳKPƻc3`9Dgζ8"(0#I$߿?8x EEE!GDƦhIQH$.zS v7=F.=\M@Wpߔ NvS9r.#DCrF} .xn`~9x -*"c^6FbS'rxw~~F8̲xEDƃi4d[IZ*5MLf,N.VLU= y0vMoo/aP[[Kmm-݃'x[RUUE0$//zbb)+U W]E wٳtFϐvLEDƬX?~=ɶD #/o8@, G$"&>Zpa6l0h9ĈEq%n`ܼn珊 ;+sXy1E=FP8|l"~?QkÛlݝķi6UK:""Ed-x-ͥ45&LӼ5:;ypu2Yp9AX4Ib/'>)Dd"RQ,RV1mWqHjj1fe K""]4y~ҚlseLv^\G\#]Sދ0l6"s01\ džue""Y_4Gk]MLRqQnݝ W.8"%LDDƄr\<,{LIzw糇90،i|DJF[W'Ww`l"%"""c@lJ4Obú0x(TSzȘG$d8||UdT1MR6?ZxdX`D&N !ee&{4e""cR4z"CJfHWUS4LfqD"")a""2F2/Gk]k[IƼrrUd1~|7'ˆDD.O<3 zcɫe""cDÇPuAϘ_e%h۾[(@#""ca${x2z\?RùpL<+p= @!v&""cHx {,ʤ$%e{D#"rɏN'+)MWRfqtrY)O.WLI0 KSDDd IL"64{[1 &qYLDdFjM-\Pɓrr. #+ۅ "Yȥ)a""2D.e⪫c,k7zl=^&"2*|_8R͹`,+rWd#+2MR6?14|*V⹓,JDV ""&E, ڱuvɽ ޽;qWq$i>-_Tpd #,ϛL<# \."7W,OٶCpRSll4&l>@<#G$"0e8ZkQ4g^FvU#͇h;ˆ HRgf\LdNUwnUs v^]ݰE*D|qO~Wd>:}Fo=pZȕ)a""2EJjXsE"Al'M[cۍ{O7nI@/uHIcG$tc q!z0ȼlD߶MDzNMaͤ#"ӉYw!8c3k۶ [8@xW64M<8N7=@!N#:JQrMr$LvlNOn3u$s|X4Y'~N6'd?o 1bQ|7㪭ƿ'Yk;Rl &zz$ԝ^D$HӍwdۜT)U1'%e  zJ"`%\j4tox%KE=AW,a|`jQrM$LhI)qB &"6#vn/H V* %/"SO$Wjj/Jܓ7Ud ݉wpjhT" ,HDꩇez}Dg:UgxrFxV6눖]uaKY99vXw7 |V"Q\C ?(a<;ʖsͲ{#Dd8>Tz%1;UdLw`p57t.ٔ0"eN:QlORzy nEEM1Y؆.|<}}I81O 3{^7̂ 6D}]LS.WtRJR-Li\2ZDVآ))ô?`:,'VpXe 'ORCɒx8U=Z!n#p"e6ffXUQd&S<ii>sK2\LdlR׉Z\qr#vui#2cw0 | Odqdr|^;X+l!"2:)u/""W^&PV&%o0SHC`D p`/"æ|&,q9FE%T=/5-HD\E,`o/}>>Q2٩o_1ZRFo4;z'qx60d7ⱋv4/mOHl2]N #aBr1f=/€DDn&""rM sJi (yz!^0M<'&]p$uE"|qjmCӊq^ɸݳ{_Ѣb"G$"rctvk٘⻮k$M^$L@ SDF~:L8 O3+Y2N;n,T"2 %""7=al}.ټoh_~Ǫ}^WW2~&)H$-[I";DDn&""r\]0"nD?ɿ4$64xEz߮Ǭ+=]:fY8"&""b0㣺h4NM"c]W$7sl|wiS5g1ܚ\}3Xf#p} a9bqP"r +y#Y2 zL>2c%oK"5ĦN8"ᣳX&Y˯4c0"^iBY\s^$WTdCEdl&$dy|r%)G'#"b`zL€DD&""b)apNߏ=G%"W3K5lj??9d8F&#C=S;DD&""b[&~rGdl~ˆDj#J>5O0,NF {0vEdR k\eFP"\ &DL䅳۩ćLrx)3%l~cea"""sl,:-{wg~cqd"fD?OJ&K*3yJLq!t%LDDdTX|=7]u5V$"o#5l9w^}|yUd3ښ\uXK de&k/j?k u}}<|'CJl6>3^Ʉ%HмĊ-HDd$V IDATd)a"""B4ΚP[:XI3`o4y0yܖ{epuGG$"20Qcyvv -ש_*, k^I 2 f^br1vka@""7&""2j,L>7\،ܥ6p^IG)|qϖVւkv;}.DdSDDDFʌt|Cw_&~ACW_hH>GSX;)t:Is="b94]K+_^I7W"'dTH$H%` Nh8Il"Ipty0>J4%z%K23y^ q|G{I,8")a"""ڂ ˁ)|n"٢ >>sUv!t &M &0_>9%Md8 vtW)|~N))W"Cl}vownڠDDF)';wo>B999ٟ.DD.kE~ f#ӧ%!A/W.\ %\!sy(-ga>T%$rO004cWJ4G.f1T@;\ؔ"dطo| _?v9Q.das'*wPdr87#u'x{4POL-|hm2YR%8Oj8@—Bp:#=0;v]z3F)a""cªɓtvc&)^ ŀ'k۾:Ns) *i rQ:Ñ"7I(oWRq"äl}1.̡ıhH"vf ? .|˺X[RUUE0$//;=F__hj^y^/+V`ɒ%#DD͊IZuwxl;s(:U A?N܇^>?<-5汚)MMm}ΆB @eee'ڵkq81oipNpYjl }Y{#iXQ1&a(OK<=42>0Mߵ Lxx>(H9HW!iiH""&9};555l6/^ls8,Z-[חORYYIeeerH$CS<;^гɓxoᔋ ^D-F<ૄ+̺cNrꢦ~Z.蹒mk$Ͳ##('/2xiV&U)myq,I -DDF'MLj6rrrp⻰0 7s\c-"2 ^ds%|| aLgZ﫻1q;绯sLze4q"WSߟL0/ئ995VJSSj*-LJzz o}G\&ciiioiOKK4Mv7'|G*\a2ZBA|\w!l?G 7!V8cv\5U޽;q6vaUNG/H)c<{"PO/>~"9efgp +1M|[^E/XB@O""F/9 CmnxxG$6m1#% + XCmD>tU ݸc\bjbGk3Ȝy:,bYПP<α|ܺ+7RJ <>_6[SUquTn6 QN 1t|ls >}K_UZBzu9Gbm-]~a3"c+!|:^/uwa:/]"aRVyfw=^奦fb1<8Z8<)پ*?.]Beatx 훒ˮw?HFtu/"c&cDjj%ݼv:iMSf{qGD-%r,ضoͦIb*+ݵ'?[lؿz|2C~7u*/55Ӻcl< 6̯T&@:D}sϜĈDD,N @bg* L 1"??SN/*Ԅa1{>:)22 oֺ?i3qn!}3[V >Hફƻ{&a*jA,wRLʖ0N_[2g,+W{y$wMw:?`3v;_*CCo/W׏7^>f_}o͝$gcYAA!XJƈrOb1?()D-a {MsEaEގiOܝLx<<9B]lz.Y:b- KC+dطoPnuuu˗/vSTTDEE7o2|Q);xD \NtLn'wwYOϫ1gI2%uKR! Ie sIvtv&ۖdf%8t&s`c-ZfqD""cκݻiPYYuVCiz`X#(Y˟B`:bӯov; a` H_Zma{ 9;us `Y{db: DqN^h =y>7rl=x_ ;$"rՔ0>O]z 6aÆHDd|0SR ._o9VNtVUM5|%H9FO̒d#H@,B$l* BUԪUkҪJ.uVVZD6ewa'$H$Ü3'9B;r~?_B!^ۺl$KlN'%KgM,]ڟp~DQnn.L4)nҤIdddTy'iӦ ;v0p@5jjR xhܸ1iiiQsMsUg7nbcS5_81mZk#Ծu@0!^Ԗn0RRRiӪ$6HS۫~bPcbqFQ=H;pCkBҒ3:Ɩ{g啟Pˉ-=r?\I ߴm,SebΌ,{^vi( |>~!CΊձcG;vM6U+zT ǎٹs'uk׮;'-rODDDPsq\Z8#N{\X4NfL߷29N0vbҞuxA6Yqn#.v,,ex/耿u[#dXX~=p|5G\\ƍ# r饗RXXȂ HLLdѴj 0>|8. ksr- ~~1`,=cǎn[n\r%L05k֐U7d0z%SQbX=[$_U&?u5$Kz4jij9,Svv%!OMHDG\\ ?G}z;2l0MF֭h IDAT޼9=> s=g|O?Fѯ_? B۶m"oyxwή]o{~/2?#rFFIIItͥo?L`s7Hђ?uD`Bߴ@a0:%W֩qz S @79 @+^ԭ_|iiiu"M&"""@y &$`ߵgt ?2d^xI0fo L=|*zeg07(7 Ke݅3LHDDlfP ,z233q\U1 ϤEDDO(>=q}#"vlJݐμ Sexj3ܶx82ykd2TY"um6Vr8 sESҸq"߿'G &eX=O)17`۽@V<&Jf8HI0Ez-E\ʂAް OeK'suZQD{ŲvǙXT$Lmfv"""+&%9sgRtdDVae+*8tmV 5x:Ƶx֣G7oS#'VNH4u!lc_@̺U:4))>p`{ es?bCq M:N_PE_qY&G%RK lP:xi""uQ֭{EEcJKK6m**ӦMDDDjłbwFh){ (=s0늊yu6n_G֮+\RrׄՅEcgdyl,Lt0_`BwMqAH]o>p:jՊٳgW5 j;_4 ^z~pd}||/lEWj?♍(WT\p$\t0hih5{ϟacƌjdNgd};(,,gʔ)x^.byrr*>c|'<#9raÆvsm1w\͛b۶mc۶m 0iӦzj+Zh-ZDii):t'dРAs긨ӷo_͛Ǎ7HNN999x̝;.{0EDDjD(1ދ`O)4u:d^ʃA8ucr^XJtILdl6ݽ+ө#DLܵ^kN6V JmMI܈N켙Xxw"Ъ40 5u #G_rwWI_ϡC/Y|9]ve=z4-[O6m9s婧_wy۷{Ҳeȱ=O?4֭#''Fٳ6lW_}5w~_ۢdÆ <',Z5"""s\ ۞] Prs}*@8Ԃx},:|P}۸cפ 6iLrLLdje\v6v!=dqqry'w_0x 9ێ8֯ t74GHCyf0ڵ;> ,`ҥ߿{3<ɓ T{w`̚5Ǔ@LL ;iUG"+PQ2i$LojyuYTT$&&}n߾}{$#'""lvJGA[+>OIڕ'<KeyVIvf^<әUI)1ѭ2"y {ʫ՝ԶR^ݲ-6dŹk"g%=Ȣ粁c*"4NQb INN&>>>}vl/333,HKKc0 uVe]ii)ƍcǎ4jԈx֯_Ν;Or&#Fॗ^[ntMUM8_~[nŤDDDjaJy >A /?ûs;$Z\8~)MOz攔P\\|K_b9|O07t q`b7lWMSܴi]O|}dޟ‹LHDl `ݺu\}'ܧ͛3w*@E%1TYAգ'vWM̚5{,\.]w>gQ0yꩧXhr ?lڴڷo%""MRxm|c Va+CɈLi7Xz((=mعj5emmuOU(7o֙~`=E-JiԨC{/.BvJAAVbbbϬ… կ~I└rtG!9))),[Ν;o> ܹ3/˖-I&f)""R{1aWTX"±b)蓩DnlE,9e<܃"EۇY~ec?EjL8L/0*?-d=fflV]+ ѣ&Mbͬ_ӇӫW/FɌ3رc .fg|L[vC"*?ZʗI&b VX-rU0[dƎرcIDDDYsMƶ#=K;SzNOrZƺmq3omIvG0qw>PQmNUa[1D0)Hv.֖L/_O:˾m3k9]x29"9[ T q8deeqדy\Wa0LPDD'PRY]LnLF&3VPvXxs'Zƞl0f{nNkӛsUZ*N>P߀Ƶ-[Q|-F|a" ]TT+"""g'њ~EGa-.z O49_Ú5ccq s<~,?Z;;v, i֔["5z`e[dH=U&^+VINNለ;$G& X H\w pMU `L!6o0 Ύ**r\Fݪ%XƄBgNè,.q F&""uSoèQXp١[$`B"@E?.*;VtA6U%>v¦͌[J87O\؁_d+U˱*wmrD""r>}0 9x١k'Jw(.:͑g&m"ü"]Ж:]HDŽjHm1Jq}Y.4l[DA ?`Æ f"""R4i>ۻo`TOŋ1*yuq6g.9\Ҹ J @y09"9_Q^htԉtZ_|ѤEDDcIc=MC~h翱e ,?ZH&.9n}/}&b6 䊥A&G$"b?ov(,*N^~f:> =aRPP.k׮f%""uԱFI Ga=rڒ&VYm)R|ΞYSwDvm;Ayalڴ6mi N T&M";;znӧR(!NJ$MkxH4p-Ϗ?5gÆ w^Zn}N窍@_LQQa"WXXHNHKK#%%ҤI#hLwbyXVkH}g_sbVzi> (Tװ[,̹s:przǸq8q"EEEtޝ^xݻ0w\ ixYz5~!^{-K,!77d:t 0aٹs'> 'Ofݤr-__X+g{Oy'عs'@]wɓIHH?_ۄɇ~H޽iٲedINNqЫVb<裵i|>,X@~~>1rHtrܾ@9srJh֬$++gGX~g iѢEM$6I(u+M!iF)i" X({4ʲ^JjdrP"r:P&5#'O###~Ce"=C<쳴iӆ$rss#77+WbXX|9X͛G#'$$ƪU;IHH`ܸq}6o̤Iː!Ch߾=o.7|ǏgРAnݚFѷo_cСo>RaW%a?={#\{qEѩS'JKKy뭷x߿?^x!NTŨ&ǚn]]ϸq㈋cϞ='oݬYCһwo."^yf̘wwʕL: 1rHڷo0aM6%--_DcI'`-kve}gѣ֭3 nݪߟ_@Ű+MGNؼy3?qD^z%lBII @*lժɑ-[ѣGd]Fh׮]5sۄIZgTvZ,Kml6̞="$INNNd|bbbС͚5e˖رC 9+I^$i|دg㻠aWl5F)Ry_a}w%4G}\}7!vWY(..fٲe̟?zy:wLzzzâE[?~ DY>% k"La߲TX7e09"vm۶n_G.]JǎOylRR;w_nM~X|9SNR]pB233yڵ+YYYl߾l,Z(ȑ#lܸ_l z).>NQF1c &MO>[DDY(>QzG"%tU~:Y0JHzU`K)A8>W$r|^bgYw[D k3?4jԈ-[3PVVd-*/ 7T i߾='NW_엝Ν;8q"_|1SNO>9m|n;?$''?i[ҥKq:c_5Gߒ%KZ3MGDDL(v͹@y-q-H]8kIŇT6.8'"Rtf{ꩧݻW_U/r!1;P7`VZU䪫{2b}Q׿6orWOQ94cp} X2kgF{뉦~WEW]uq ~O>sTrX,)KBwoNHnbvX"5.Rz[a2gCUqqq'vsl݉T=4L^a͛ifC9^(#;4 z>mǥC Ajj*۷oVi{n 55#t[qq)HIKKD$7_ .o`)`Y.lziBuaߛ@IS.8O3jJCYrꉎ; XlYd] ￧E)EDDe=.,ȉ%vaa3hX""mI4Yx1呦86l|߳gO-Z /d֬YOaa!#G43|sXپZdS0*{shDD(aR,\BY~=999!8?Ϙ3g+Wf͚q7Jl6z%̡_ ɂW`ٰPK&Jh?__^._~!{vc߶lÒ%GC ;&$""M=LDDD| >#yӷ$v\(< u&G$""M mhV1#~b*B6k/ lp4 IDAT@Q0ٹs'wuڵ#99ypA^;#S2 <,΅`мxa pϚƱH`BI$""戊ڵkeĉnݚBM4믿_69J9@Fk-[`-&$ ~VAi"a2o<ƌCJJ ƗfddoBd"""ri.RZ&G$ B8L :Eݰdd**&Pؓn?p#Q֧EKD? l @Gُ鈈H ]矟p[ >W^`:tR^s"#edH] zӧ3fV^ }9s&C aݺu<&G)"""gw_–G%&G$*va/_ۛ Q06lo6'Ndz 2˗ҷo_JL9ǵxI4 NODDTѣGs2c 6mD("++Covx"""rz^cJǪwI(!$ZBgNXzO_~HDT$L0av9rለH5 (Ͻג oQ:*Ò(n14<H]Cr;v, ,0;f{lnCLHy""RM]o߾[ۗ ƍǒ%KKDDDA颼{op؅s$a O)Fz)&vtoSMJDDꚨPVVԩS8q"*/Z⦛nnK.f)""" HDDꤨH\.FŨQ(--eʔ)L8^x~l֯_ov"""r.vz]{1a{LER;S lT8[;r逡pUQ1$n7?yF\\6m2;,9Nc=r茒%!W,&M8̃cU.ׂ<,%doDD c<SL?dx^ڶm 7`vh"""r>V<7#PN(.;q'|{w*w{Hp.bXae8V, l0T""rRQ0)//?gĉL6 Cff&{/7x#,"" r c7Vwz0gpc1e}JH45$ۢ"ay7ogϞf%"""5~Gʻľ{Υ0i@/v`09""a_nK/PDDDnK ٍmn[0(2u(4,QODDQTSJ~Bu.[db0R[y_a+{sLK79"eɼy۷o94\-)žy %%l@(M% HDDz0߿?aPVVFLLLdd0a k1Jl6s/&vA\-A̎JjG/#~ ;]&$""IL̙3*""""g›~?5+)ݗp찤Fk|.49"Oe¤_~\9ӅS.c8V,F8 @jtg5 HT4}8p f:9s0pZHDDD=W\ ~#j;sF8 @YK5R9;Q0c߾}'ݾ~Ν[H]JHwAG,ekVVE|^CR;þ7`dʻ69""a͛hDDD>2o!s[ Iz$h[Nv^Bwwywy'oѣGYr%ÇDDD6K2Xu#~?q}$:K⽨ziԠع3xvLeHUo&DX殻GEDD(8.:I8{4l 6~s$fzJ\I(1#DZ܆cjB'LHDDz03f cƌuּ\}&G%"""?3@l`ߛmn[˿)kW\PI pϚY,l=Lmۦdèd7|*ێώ, `Z:A(f 6Qo\ZDDɏ{nvyܗȉw"e##G|S{)}'9]#U8_t΃!\KX 9oQ0yW&))VZѺuDDDDNjPguV쪨6 .]tv/q}=Ke%m;mMHDDIT$L $$$ˮ]")((0+<'B uR^c튓k9|rlM%n{n>II`Ϲ3ƹ;J19"6Q0ԩ+V@ӫW/^}Uٵk? LPDDDn";-P} o9S>¨hfw>}c&+VX:F@Y_D=}O01 FQ0[Yz5^{u֑Aff&6l79JMSgT̮g-<}ƪ;B4t7m"[֯z`_;J}~MDD$EEnoQ`K.a͚5<⋬\#FzFw-ʬ5om3!GUQUͯcU0j+""RiӆcǚCVm4i~l{M %p-^@0(3BI5sAq17`=`JV}aݛO/#˥ljbD""͔)èRe\ :OA*6*(_&G%""Ѭ^&L, Vl-kw!xbn"i;Q1X{!|,*)$XJwAHYG}JyΟ c=4ˇW_S01.鏵ŵh>%W]_׭kbž;ׂjrT""e!H휋ۯ#bM^mZ!Եs4^&1Vn a⫮'\9HMCrDDDDjC<-JF\K(>v7s pϜY J0-ĈDD!Ν;뮻h׮5b޼y*՗? 0%o.**J/Cgcwo\$*&k׮%77'ҺukT6i҄_~(EDD^Xh0[2 SEpE9&*&ӟHJJbƍL0p8\e#??,DDD$5*¹wl 䊭htEDEEd޼y3ΞA~~ TRebߴג +M#""B$LB'~G-F$"""RrqS(x&ТHC ]矟p[ >W^H5;k^)c+po E"""fC=3f W`߾}̜9!Cn:|A9]źټ>:Laӧ`=z@JSJPW1UT$L oĉ8p z+C a(EDDDAV89\y=&G%"" ]Դ=z4^{-3f`ӦMB!:t(f'"""Rm9,)TǶ=q.[?=oٷn<@𑄒EDDN&j&n#Gp[8> :""""Ne{ ʤ\ Eq.Yy&M ddV_'a9zO9VvIY5~]3CrNӮ];C6ޜeb9|ƵxF8Y;o&B ø׶?j$""bz0||<Ӽٳ'3ϐ]web""""5|z8_Job_Pb!W1v`1VUk?a-]Q2*5y:ٳgg˖-+?q\L2nfѣ/^{׼%K|rG߾}߿d[ii)| ۷o'11ÇӦMv.Lb3}kd]01%W\b11WQR3`8:"""V/a۶mObԩK+-[2g-Zu] ӿ:vxܶ?xx.r>#LRDDDYV7'7$K/FwlFE+|m+1[JKp-Fv-^_[눈z[a2c n6|ȺTFň#OXm>蜴oM6UYذacǎfѮ];5kƆ ҥH59*wW8֬ ź)zqMV=ľuF(s";Ox-G\-aO˫"""թ&LG^;|שdc瓟OYY#GYlb+\6fʊTz0yGxG[r80 埵jw֮]bرl2{l"jrrr97nWHq/a})bȲ7+K9=g?c=zzv7Km_!T7n|!P(D0$  X,bbbh߾=yyy 6[~ڵkWGDDDjOL邃|V+?#bϦu[QRkq >aèF`(""[M4;jWRRB||q y摗2|tOxgHHH`ԨQ\y"""boN.+?iN O$&v>ގO0vı~ !>?.ZIbOg%Dפǟt?|F}XfH\\4zZKU˱]3 B?xprkHmݦbN_D̤Iwa7֝hNm)))1"""bb[#p>u&MO{e7XNmNY3Hb "fS¤IMMex*_wލaO41ŧ"5#-wUgs rJ/h  Eێ֩;.]ssl;)tlJ^QŢLd4P./$VJ>sy1g72.\۷o!Cʕ+c˖-1k֬Bu%%sGDaKƫȶ QZLDD$%bzT lٲزeKDDd2Xzu^:""jjj̞=;ꢾ>28 V;@DNgGƆ(޴1=_;'vRauG4H]̙3gc\Ďc8űFӵ~.J^_DɧT,0`T;=!"";G<;ߎÖ.vFDQQO]B`ikבun;GS&+AC"""웛_GDDRT;:k5O:3JlsSmm\mA \!t#Lxגt7mh:/ Ut 횓u6cMSQү@@p`bU};Ckpv>.ObYDd2. 'obNHLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR ]]駟gy&6lSLڈhii|0^zhnnaÆyGuTa ^J`rXjU\. k6o{9sD~ T-^N9;6N8(++k3ޯ_:uj 80""&LEEEyB #LzΝ;'룩)f͚'xb---QWW1mڴ3fLճyhjj!Cts&=`ǎcŦM*2^.X zꩨ . lRP IDAT??^{.e׮]qg]pqI~Q^^z|us=w^L<9""&N͋Gy$/~555qﳎя~CSv;CEyy>=fOΏI'-uHjjjfkH$,XL&fϞ!NEbСN1bD~{Gr\ڵ+r\rhii\.<@l۶-O aҫl۶-***ڍWTTD$udɒXxq>Yti̜939xg$_5?#H}]& 0EvEEEƋ;R[[{6w}n_=Aaaa?PH^$Z[[ۍʶm @ax+&HyyO=V7|^mݺu=۶m³7|B墯HUUUl޼9~6֭L&UUU I/2nܸrbŊXKKK\2Srzˣ9#"b͚5'MQ]]Ǐ cȐ!rزeK̚5@"0!˖--[DDD&իWի#"&JKK#"bQWWqW/ I3g~+..ӧӻ"`o\ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HO?`444㢋.c9eg[XeˡH`BTTTDmmmZݶuW}{{>5d21sxW?y (֯_w}w̙3'_JMmtָ{3Έ:^~g7Cw ~w ~Ck)cǎN8!:W__GuT 4*;κ^#Ϲ\.{C^G'͛9N?d21z訪w.O-±-,]E09Dܹ3xX~}_>b֬Yq'uuuQ__MMMQYYӦM1ctY=1iҤ.{AoY~8~ᨪ3fDeee`[Ƴ>qq>X$I.{B>nGzr ~#=}28Gv=Xlڴ)"u ⩧ "^Z6l7oqu,zL>=nƸ馛b?v٩>-=GqDœO>vxWgNGzw;SkЗ߁}2s-tt8cʔ)qGƊ+bرQUUf޺u3fԩS=yOĪU}||'.][l?>^~~˖-8qbި7(l}3Deee <dbdɒ(++Cv-zS;Wz;6FO>d<#FGC_v֠/w;ӿ}qۑ޴OSrQEEEQ^^y?|d6qI'ŢE1555QSSH$VZ\rɻ{޲.s{cs\<LzcZʸk?;߱fѳ}yۑB}&nG }28q 1t(--m3>bĈrصkWrr\.^\.{l5hnn_|1ZZZ5|hjjn{/UbΝ瞋W^y%Fm`ԝA|ήdž %|$>߅?~:vNw]#Gq۶mv$Ilݺ/Y$/^?rҥ1sE}{_d58b…iӦ(**G>n'uWƊ+!C_׾;?D{]g}6V\IĘ1cCPwzHl#w;3kjI&F>n׮]mn[qqq~{GjkkvgϞݩ\뮻꺳W_}ug;ugD{]???n/l#w;3k0`NLKKKw;.~JJJxKKK~;.֣Aaa?'0xx=Gײ(,/ǷXbEr)u]m۶9==XjU 6,"".~#G7#<Z}1wܸ[cƌO:֬Y͋7O 7:_}裏quwo_~9?#V\9rd,\0֯_#FaÆŷ..,""jjj""瞋:+s\ 0 ~ƬY3gyn!rK o|#^{Sfl׮]qM79eѢEqƩŴiSO=u_x[7I2LhѢQGtMm+I&I ˗'L&$I䭷J2Lr5?$\fFf;3?vW'Fx$&=뮻c7pCf۽ҥKL&{m'd2=ܳړ$I&l6)--MM|_L$˵iӦ$$rK8sO<1ٵkW3<39?yI&IN?%?~m%l6y$IZn6? /ͼdyamsJtGUUU>ƽ޻kp̞=ͩvZL4)~_FDD_~x⽞2裏Ʈ]bΜ9m?ODEEE<]?q 4(=ؼys뤓N}q5į~8s'/qgqO>>_7ߌ+b˖-mj1cF]6x6O}*}Zwfvm1eʔXre]6>y[ns=wCQ./9x饗__|1N?hhh {̱n㏏W_}5"޹p˿C=1uԸbÆ m$F]֮]oVy1lذבG۷o79O=P[dɒxWK.M6u$IonÆ sFD!ɴbիN0O}*ꪸk׮}cxwΝ;yM tEo{os=me2?~DK/'v1{~Ikk~?G.~Zv_eřggyfqq뭷C=G;|~qyqΞwފ˿cٶ}~1q=>] tQYYkO~X`A|[ߊ ڵkcȑmF7tStM/ĉo;9昈x.1x碢/rL>}5<8$iw+n•1c… //ڼ:S#I4{{ѣGG;GL6mϛ$I]6N۾}{444_%uhll(++k}̘1QQQ_:Nn ,K.$fϞn!?y?_=׿u\xovnj5****$wwDccc!ȑ#1͛.0`@DD466>---mn[kk>O#Yh|d2q 'DDa.6lXECCCi2%y󢵵5ֺ's΍Gy$ݍ)cƌ۷#Lg?[ƥ^gqF 6,ϟW\qE~c:+>Oo+OѣcÆ Ogm;wuw>}a/1uhhh~UWE&;#.?~|\s51bĈX~}?:8@7^zi2`is暤4+I6M$_W#G&OjkkUVy3L2nܸ"|xr 7$[li3ꫯNFflӦMW\'CM>O'?|fV5ʤ-NK ~ĉ}sICCC+29$vX2a„_bm۶6szNKʒl6涽/rrW'y{䨣J.Ϲ;l6,]4듡C&L>%ofuZlr뭷&I7or'Æ KʒQF%Ї}Ltp+>O?'|rz 0H}n4 @JGIDAT&)0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&) @ E`"0HLR&JnIENDB`ceres-solver-1.13.0/docs/source/CMakeLists.txt0000644000232200023220000000120113140546177021545 0ustar debalancedebalancefind_package(Sphinx REQUIRED) # HTML output directory set(SPHINX_HTML_DIR "${Ceres_BINARY_DIR}/docs/html") # Install documentation install(DIRECTORY ${SPHINX_HTML_DIR} DESTINATION "${CERES_DOCS_INSTALL_DIR}" COMPONENT Doc PATTERN "${SPHINX_HTML_DIR}/*") # Building using 'make_docs.py' python script add_custom_target(ceres_docs ALL python "${Ceres_SOURCE_DIR}/scripts/make_docs.py" "${Ceres_SOURCE_DIR}" "${Ceres_BINARY_DIR}/docs" "${SPHINX_EXECUTABLE}" COMMENT "Building HTML documentation with Sphinx") ceres-solver-1.13.0/docs/source/robust_least_squares_fit.png0000644000232200023220000015131713140546177024644 0ustar debalancedebalancePNG  IHDR; pHYs&?tEXtSoftwareGPL Ghostscript 9.02m, IDATxvaϘXX84X*\hG8FJ$<:+H;yziybKZ, r7'.p;S@]5YF󳻧߯V[JgVVV= """"""""""""""""""""""""""""""""""""""""""""""""""""""""9QeY6(0,b0B%0 =τEQxEydB0 fI%22!s+++쇢(1ϲ$Iχz^MC !YaeY4vIlzС~ZAUoj:θk"_Lp]}_] `RƴfԡqWw0Ξ=||/c}g9u?sgyСCǎ;rmBZ@3(Rտ>F*s30M$X:"q{|߷m;c36v#ezw\ 0„Ʉ q$IXH 0 GCN$/N̿SYu:,{yquRSD?R@ pL8pA 4毬NQM(̘-{Nn)ݙe#^δm4D V(YVږ]l8Z'*˲.i1fLEѦв,ukbL5ip庮eYXƛ: eYVRZ9czq\[A0 =;(BzDQ`VZO4"0 `"ӥhDQi&ET5htqjS4JJG,2wYHLZV/t'}?,g1i64M}?61Yƽv^v|w]הhN!jle| {%qz* 4|Q꼴T(g1rPVki.-- \Z\'ϥSjnrFǏ?yd *"Mrֆ|ݲ,3e8( qvq͉lZ[\\b&$IbU)?]^^m,bYmeS6laiiZƲreUkeBZY|Vw[=;٪5_fݮ]SwnqqѲ,qwk+MC^;z/`&˵ Iեxfd]Y?a_݃aXJ׫Vj[0{Cvk_V+F?s锚[N(Of!-c (-{f* =8βܕ~3feYEQޭ&˕ӮXs3A6ar)E n`\:TfffffffffԡqW+ u:ʲ-fs|¤ 4M ˲oe0SY0T+VZ-e]YX+1([VQ[ݛy{Tѥi:77j]Ej=]0??񸫶=<|Z\:w* IIv{W^Oiyq̶m[,˲i8 eY}?(1&ՈUmZQٶl6MsSQ5n;连( ,m;۶"ygտQ{#z[e,;gRPi9cՊ|_]j=f5nk+xӓZ](Uޕ4PRayF)k w \\7CB@2tC1Z]ԦUu]w+Yeyy^.XnJau78hǵ%(F9azH0= vٜChЌy-g7Jg`$^(6x.Rܪ`!湶:}5 |lՅe\-SrȬ;K#ԎbͧKKK o% $9VnU\ ]׭څu+FFAeRlt+iU^^76lp,˪0ʍ:/-- ңڄtJͭ ]'O,r7;a*ȲL#<8.qCyIn~՝NzmUYXBogYVQwygYVX\Xq|7$)(vӓƵR^U]-աjv>47۶M2KpAIsbRQBQC0LO}[l"L"Ƹk((!(!(!(!(!( V+˲Iex qYA +}F4ݻSyަ'Ow5Ia::3IQ$˲]1mdYf۶m۾di4շV+I6Mض`V}]49Kwh iiĄ[YYw}Ǐ?yd m+J$IbYV5 W^yӧ:Ya*$Av[L;᭷ZKmiPҧuF̲hzU[V ̄sOL׳.|~AKV@`M&ԑtUxdI֡CO0 F F[n1ۿwo|<,$IHO;ݧ8*c,YC}Z[\o]t#9 p?ay%Ƶ7EA&XBk6JFeԿnIWgk_ۥaO7oAo]vݡqWDhZC`f},%[j}D !Ij6i#G #}+]zh]SSuXa86ZcF  Ie%Ib2a5 ku~i]yFb!0}zT?y [ꜢW^u 02a[#_o4()Ut>19nw+G !0Y{ ̮;|3ϵqF42:`?~-w` ZfAsgn]Ȓ* u:t$ק?oKRv{<ϥSB`dФAIK^u@v[Z ~~Gr9(!/HF E)]h}|-ٶl{_YA Eol`׷[Xc fAI2}4?13@?HR< {,ޡ4>!偽C X/{ty8:;6<kMgtӺls%,BÇ%x!{`w1[yر:a^-cK}TΞU(c(f-JSuuV= V bej4k]tdu*+ԷZz}@B DT*duvvu::zTssS#:.Vt:gY3a)"LFK8_._…I-)?0H0lZg,Npahž~LXRͭؾǏy#tU5ϟ?_裏n{T`m2 Jӧ?K^ eJ >+IunkEljO!Nժ-3a5 Jw$Y*l媥AIOKEzVK7pCV;'f XewuW}z?Vɬ>/e{uA&= ,vx 1XqLw־+(JYuښƍQ)?hyo圢L.p@F gu8ѣܜ*N=yӛYX}kYV$ekX շ# fg<]0Zjw^W޶~-%zk7ooO%k#׶nWo K]Fp w!yN%/iE1~Oޮ^kpY%j6eYz׊r]|"`a0p,uG_~.iIMɗT]}CV;cZ^֛߬fs+I`!t+ <6\q7PqĻ>{+[KX_쇟:}_4bB)VA-_[/ڊeB[/J<}(Ւ>v:qxB)Vd$I$Vc,XNQdRGr$[ usKT\?w;gS,P"XM7$ٵ F_OqlFR(]NAU#}܍ƃ@֟ QP[JTcbGI"q7SZ:"`g`Ʉ~LV^qb1  Ƌ.iB]Z%W_9cZ)E Aeه>g}]z 7rwMEIa֙pgPvU88ַg񵷖$W9_)K0sx@8" â(zEv_yP=kGJ-I:|XǏ-o! b0p"qDZEQiY5ռ-[?+YoP4(,}_|X3‰`"_EQU-&L؆@_bݸAǡ@8ܾ0Qqء(9V;^?qI9$euM?h7AC 2aQ9<1;E C5嗁Pқ'W9ֿC l 0Zk[{*w[bMu,U֦)}Ō @c͵#Fot䪗ekÇ$t\ny-W[b E6Wjh(iPuX*ym$=y$~jWKA !-3X4y9'ԑb&q(~ IEy^$AF !&TE ŠWBc֠YmzSԦf|`s+++'O,r7aE-SN$F,KsٶTrCEY (FnIsb р IDAT!&N#Ο7oI_W/s˻LhIƲ$i5%ɺ}~,o8iܥ3]F0qyNH]=_ɗ?,hQ L%%kg]iF cRk^2# YH8VQt"`d xԔ{;%֑@<(kJyB ]t{~,ӿ:fG٢ԒZvBQ`VKFcFz7[Y'(C !mt* y:a8uNJZbG{A$Y{ `Gy՞V"(ԱDdlʲ% ;AQ4k_')d=Kn<@8,S_)߯D `{/qMK䓒?ytgT,/q=z t҅]@QrNQS?vN tt `_xn= պD&Wkb]y{@}fUzU*oko cF |348GT`V/l{m tC~8JD%fu)"!/C.u$LZa˪'_C.t}nOH+ OHҥJ" @ݓZXܺ_,{BoDO֙3;b+u `De뽷EQ(Z=~BqJBXQPn4 _HxfW˞R*WR}UWruc_ٻ8^9-_u]w0{wUB"MMhX%˲Qo\.K#=сŋ1kI w^ N^W @\rMQz7"!$a= }4M# v,^v<d0}$Qd&9H4dh21bi0qGg6tDlz$E. scQh2P6}ݵinəIJaiPQ={7\2J4q0Mu3aܨA >㷨WPiL(p]ޟ~"_ DDDDG [[[k/VDRh r B )AE, c """":uHR8zti,,,؀]( H8CHDDD4y5E9R{)ыbA硣瞃?~4R}34dOe/w+YJ"B"""I=(:::lv|[*@˂AQi=`Sv~> 'OT,L(ʯ~+EQ?._<1gǡCRС_2}75OhnnJqx4UСC￿&2\ڠ8CHDDD4IL&S`8O&2~ԓ$M`K7:$uݞ`|9k ' 66&"" -(SzHEJscG4ZB/^#P=4FpEh-^+1XJ.mP #""aB\|VՃikk~&Iұ f8@( Ha!v^xӟn}Q 5k-e¥K2 %B""")'| `Y_?lC^}啉4(IҚ5k$2!;M DDDDSK3 6@zC/O[[5KAuD(7?cǎh1M!9]@.eM ]dO'jw'5Ek{`?px/ "m DDDDS,__|Tx Sy6qM gz/kֵ`(k 4g°D" *aÆ3!јi7@DDDDcjΝUsֆ^ju*ӁkFmF>˲j[Y; 5M+#Q66{!""qӕSUEIAU+>3[zj9護zw:!BAħ&UgjDƟKM%WuχiжJaǛ/ j@" }-1"Z9pI ` Q"""q*NJY`ۈf|(q8(rlh|s`y y`s\>}I!T"L)Hxv䈿womx&|E) ]e$K DDDDSW& kEig缹?Uxw]񹷖,U.KOD4 phBh~+iZeeq㍈w,( YHҁ9*W+ 3 Mv!$"""4&Ei0swT -m߇mC6_-@>WpE(d@HDDD0LOs_\څS2ʳ~ʝ˖ B2D40MPض}u%Ҡ$I/|S҅ ' Q%jZ}yڊu Qz"ܦJ~4|~7&!D]4 GkIԦMKj0Nnͼ7؁BSA (_9!PB"""dfbPXN?󄉫K5heӨj۹} BeZ`$bFim a[hQb%d}߇=^H;\JD` $""")Ȅad ~${{{ωs MCKlh6}93NDĪ0Am >õ@J}Qlg σ1HD !H1 qW\j" 'VԦ۶)>"Dו]4rD41Lk׮{L2zΜgYem_z[oQYD Dm'M@QA!DGGGޝ9'@(5w#{K\__V8<݋CşKgFa֭K 655mڴiH[%If2@0?%Ն# vQU 7E1 Qh'O*IOp]2 P g DDD4E !4MKv;}M4MLo2^#KB^ =ѐ0TAȄaBD~iʧsp4dhr"h*2M3Li !t:=l iUKrg,*CDDDSQ&g&EQS$eW3xezya(?nx0LU dA"5 DDD4)n"H亮2-qe hCpw$ !<&0n>9+}[o D4J~4|)DDDC2a\ kBst3l/qGy^hbϥ {h z;@:]N@4rmGʺi5L^2}vohhJS>=Cѭ:AKǵWO6]7cw]]ĺS"@HDDDS_NJN}u$`P(P*,Mx ܋wq0\2JD'<`JLbOsymPp̙fXJD4"hM{ `iB e*VֆUv8 B"""jӠ$IO=SO=`̈́^>+}  B"""Ih$韘oAiHs2-m+e0nēA" DDD4e٨XKD"<^D`0co?VN$ jƍO:y5kBB"""au F0ÐiUᠢ@KwW-5},®ʹ۶m:2eBMӘ hM+Jh:;;S~7*9dYɠ1`6L|EWaz,`EkmfĶ{GU?6( i&$*gω<^E؟~}⺮89CfBjAq(DՖ8!71~?'RӤAd9?޼9~ U@F!<۶tݞL&sw{DAfˡM'BӞ}RPL( g2m ky=Qh0jj{m s} E֓B@I>'Gl4p(eoF+#"ƵDD4J#Q橭O.Yd{B'ͫ: -n>[<( k- Phϥ 3DDD4EILj{~vvu͈iuםZTӸo梨 BuOpߛh 0]$Ҡaay4L֮;Sƒ%848|T*?˷HD4| DDD4j3aOOO4ÑD&g&<[/៎HkCD iMNaYkAâ) Ca)0N\a+:$rqɄCmBY{Q` $""ђfx≃>l6b3?4y۷_R H((uD_>+ ~쯼-"p(h" 8x`&1MT*_ @*\.QHfT JVD^t*:!5B"""y&{{}t|eAAݲDXhM-fsFw$f Qy~O&A"j8 DDD4A0^xᅺ LhvoooQ{ugި 硩 ER \\Qf <{s-O:\)Je,$ Ģ2DDD4AGšWw4!wUiQёQ*$W,s M>JxM""j,` L۶U$RUt3knn,Ye!+=`S啻w'Q .mPCHDDD&RXR4 30 W@OOGz{+O|_^ Wi&%B"""O|^pWaR ЇO5=Rx`B2 b2Dϥ EehR?Tsm3'~NT0g MV 8eifY&"" `ss8rշ@Q~/~CsVt(( "p48O[NgF<iLIb&)?6(N8a*p'AP(M7ۆe/՗IΝ>sx0 `Fue~09ˉ _ i@7!5NhaAB71DD4Ưw4`\|=p߃~566ʠK !4MK7 }0>8fQD .mP2:!c^IOhddP*TBhFa~w2 ;篾(PJ]n0 Q#b  W,n\{Ebٲ}a"o"FoF&Wuvs 5( !qQpnDDDSE<* U% t8lT+S*%JX,Up{L4HDpB$)AN(q8q"9]䖡;D ,#)Z({Qca $""K$D&-j0{ve$*1~eql7!.HowHtHd|>ϭDX#2W;a(&|ژ=6pC#AN@ډ+5y?=EA>?Ԏj;x m 3.XB"""0^z{} @e*MB  ،^K. Oh*b $""q'iVZJlRy֭\AItF /p7m/m{'FghPjӠ(/5fl_`ĉ*c /J>л岋Q(/ M붷]kWՋ?˃um[φ婿}87zс G\VODD#NOxxD/ ZiرU-`,YRTIO>/qaׯ$AQ,((a $""A1 #̄U,'Ixu9|()5g{.R+:Q,PA"â2DDD4XaHjm0ڶ\_lk?^` @@}dGɪys:hp@I2|`t_{`q<f2\JD48CHDDDCgYʩ@U($<"ʇBnd|>ٕ! 4 ނm@U-><($`>>N$ .%""AmhZ2 xE!Wx [`ŊͫilÊ#hlLDD3DDD4hAPUx[Wٹs[WWGd+5%gh 1R Tj„~kDg+4aN`L={Ⱥc扈.%""A>g΄?^x"q!6kτ/݊cvoY(4HD48CHDDD8UXfD`F D*U.~}jTYV8yhY4U@:.w MtJxM" %Z jF0I亮,˧]Z!#iMQ(=Wn~m{}cDPsi !Ѩxg`4 `1QOɶg =s2#h1 qȇB˲©ºp ja6_/w/qp6m‘#җ\^/E{^>R0 Q#` ""QfMᱢ(BEQ I/^h)[-&e.ׇ5<B""QE+.^8Le|kkض=@W:v4|ݼ@`5_J,ß.vшXLv'"F@HDD43{NƻqzfTSnQyz(yU&rJ'#ar/zy5=;[-P(pbhB""Q4:D0F=[}Z_%IS.}{fۆmˀ[}cyow錂DD !hM,^8^J4 }߯-eB0- e]9,Z&~U={0si?8s~v""j DDDn Ȝy晵( *IRXڧwxpcaDk+%,32.cSs3QhzADD{BhFfv׍w5E{θ2/iQHDD3DDD"|$a< 3p0B2os5{松Sx0Krˍ: Mb DDD%ym'`(̄ ? Qn'AJ%<(Ì;xxe#nrR6jMJxZ&Q-!D:fueڶ]D'r9,[k .| r9 >_P+pH@9)HDCƟKd&4sC\XeCӐaqӄeA{W5ς $=B""4q()rH+EӪKa!UWaر^,X7I_Au1DDS!MZAbLX N}~Z_maB:LM+ -Ao:'&B""jk{;L0A%ʇz.x+V$/*^~ >22 MQ DD4̈́w}w0 p'Qa;|իu+Kӟ}ǿ]X%"ḧ́q g"hc& zﻪ9\3*[nB""LҒommm4 _ZG>%<rXCs_9B@HD4e1=M ! I1 $ ELXq^AxZx/:p7V=y0FK "@HDD_]%9i$V@OO^yϟ].!~V5@ͽM|AqhQu=OBQp]={nD@U5?Wn.6 j㪭 i=bB""QX/Zo_Pu H *`'n˼yqR9<{k׮ݹsg|,2Q +4HD4 !$"".y64!-Mx/ dIͩTtA:4h?\;u6 瞦o/_4HD4 DDDC'L3¶JAnܸ1:Du]/YRIY`5k֜?>O6roh0QRm&4pm|WePը :U p`~Ph>NFN?' 5.%": øӧO/ ӄi"Gեeqiyi9ۜw '}@ѶQFB$/ З!aƍNxS)D m׮:7rhՅ /|!>P?AX0iZLhvGGGc}EDD4H DD4@ '4WWNymVU&7=\_.>E6ڪ00_ +""V*=uvvvwwGn{W[ZZ7fƱcp`e!\ 9w.gA'p;8F|>nȜj(Qkc( \ڠ8CHDD@m۶hy¨DWFw7n ]G/N|h3j'AkӠauCğR$)yº1ȲY`fm 4M-´u޽{70 MV DDT j@ k' Gp5`o/LlAPN远Lwc,W6RS IDATvc[ PU0(1VM \2JDDFi꒦U-"<\}uzN(&&+ф(9pO>˃>XuHގ //j4+(V? ""1Đ.(Uᅀ{ #{DQ04oWilv "":-.%"!@>_US PhsDQ><fwA""` $"1NjZòIX SëX- P40 n$""! ~&B4с?|4RZmξZ>dQ\~ԃ~ jp-u,#%L+Jh:;;S~7h,_:iVׅ/`=Z=wwwO~<-D4ҜYed2\ JD4sibQ""0 !|τaD$a^iA ^df*`&0ϕAX-EI]hh8t[ZZ:vF>4HDD4d DD4lڴiƌш+H,ׅ:$""B"">EQ~vg_rTol@iiqz g C\܌N~;{'wNB];B"".!`YmmW_QG*\~9l) dc[]oۀ}*lShd0Ѱ4 A`6_9p 4WqcՈؼ9:Wz Bvs,3HDD4q4iGeAC::>}Ӂ!)r.22uGBqMM DD4,O0 Es?[`rs9+qHp6E/jjOVvwLӼ;鴦i0쁑N%O(hm;J՝RBR!ħ 0}?q(| 6}? %Q] DDSmۦi' S^XVG.Ws+IRxIלg| ߃d"~l$i۶τk֬پ}{t)E`(EDD4U-[M":|> EQ:^:tPb5f>/J%-IR H~(JX,XCb3K@ǻqwGbcǎ'tMʄbӍݴJ@K!m,qxE_BtrCn^9іYP֕4Es8ŋ:n,+3E ~~Z8ڶ7YҎ;{~hӦ|c,]W>(ɐ$/VǻoO{ I)6YzI/ I*HLG;v숤A˲_?EmؠΓd& r_u4|z_ZEJT$VU,0L&ӭDb[AB A Q;#5FҠi^Tjٲf= :^zm7?k$}Zߗ RPU%e`JRl)˗G/_OP !˲j 6mjfp1w?˴$r-]=^ ^,ԦɆe(EAcW@PWo߾}/5B!>p睝ٶ뺪TQttrŝG IH>Rs1mj/+E&`JBǷ>X^{,5>W\lMck|`ڲE=$˒7#֖Ew[+WUd2';\XLǞ4{|X7E&`*B wWǐՙ _yYsغ=\,w?)2'TWbX٬ rKgBLDl,L@o淼={~r W'6N$Ë+&LǑT{1 h֓89ԨV=FxN? ߎ8mr:kQ8㺮qJ%oϓO>j9>w~W+,Λ4:R[\7ڊI&&ː}(ݞ˚,KzмajuڵRH$j"4qU {׫_̰{U۷-ћߜٽu ;+(,OMo/~Ӌ/[S2rӮ2Ltg- RTѡ ly} 8}ׯ߾}{O@ .}~Ѣl/-[yyCJҥ:p`C2.P#x:e(v{+}b( ZM9sZ_tZgO~t^)ΦjMIMNX<4()Ʉ'MSG`JB|R)ML5~d41o|=v[bIyZVoW6+iu7LjM WSM[l Hy3>7^[ݼ٨T-ɄSw˄A!/+*?mAiu]w]+VhϞ /sus~)}Kj|[ԼƍdPz1|ںe±1 `(1xL ?d[@ү^}ugX{-e˴iEedG}I7HrWT Icc]4+zT8=>?aB! 's$I18μ_u.Hטm_)\{r=+Ceo{rr3dcDM$ N_iO@cQ]`MLh v[}.em\NB왯? TR7lVi^5bMadB}b(QҖYyO @HL&}&&hF-]*I\au,i ҠyV*J֤>E5I3+<9ޠeYAGl z mOvh}M7ƕ l*p*9%zoOߩlAiY;&?r Ä@q )Ҡo|\۶5?'KL2 r[JXeM'wQ6֭0'Q0|'ZL2rY!U&A_*rUORQ:% #Egr]E$Hf7et>c:uZJ?v oe+EPT !Tib"fZ1('@{)=TgsE1$`(ѓ)vh*5[.~^j>ضM˗^W"!8v.(ɖ9z0cЯ$19I% 02 `T*~l \zikzʶ[GO>zH4w}^+z^7\%4eYT}@`rr-Z|jftRs-΋.6[mZ#;Ga2* )),? QzjJ%ɶ_|Q֭7L#ѭfˢE=ڵ* z ?ÿp:Z/ !!R)>%hY$n=:/RwMtyts~hL4 , -[J%R?_76[-Kݞ= pYr+$P6I@`(r^}/f֭O?Ndj"IRK$2&TΨ` RI ol=>t(:T5ӹpǽZ5V\{&TIV9_Զ.iXl z9G>B/|z3{*O|txU~mh-$wl׋ jy} 8}ׯ߾}{OC˶z!˒aqzu}:=H۞ܣw+K4ݻW퓤O9*59M8\jYVXH6ibI:_|06km=hizFt眓?P4 E PB]iu]~gj&d2n\̳m .hRY% _֭:tH'N4ܩV\tݺ`8?)RU"Qo?DX,l(L"RO8J˗/oaN1_teLvTi0P6FCŢ"cg9f.rp g%_B`69ck_uM\fͩA9ǭ}zM?>fU#|{u`+C'IT>o"6 tM3 lG>mn!@۶cdaw:kNn:YF’6K /I[F;ޡz}߭;cR5v$RjUF:>xW?0˗۷/\s5/^g՜WxEM˲"[wga5ަyyl+4M74'4p_:x7Սo<,vn9e<_.UL"G7lX{SSJ h.Xw{v쐤%K ,([PmϘie1 ˜2{o/THqfK̠}O?}`c͛ӕ]zig CҒI/$ dCFZ3ڟ³Lc1jW/PёH&?.%:}rrb7MH/a(o.Y(j<=TeK*-ټyj)v YtvgPِ4f`"\jݻ~*L0dt5?H .G?Ѭ6 C㭖jUlV[U Umuu%:p-Ja\nTɔ\7#RUZ^-ԣC"!˒e а4X,tgCƎ:,d248wFfbrJ)96whNG C3?zTJshMLu-,U%C\kLUjrr Fض[o0R'*"s]y8qBkmq 7/}Ij5]w6nE57l9(颋t妔~δdH%Y;jf59Y2eS#; 5i|ǃ} cAٿ_ݧ{O|2fo^ݫko\C+cB:^XT|~H vdA&Y`љM|'#w +EVYB6CzUZu'z]r9WD֖9z%ԃh,5:,˚gB 8s,*3ؘ; tfjB!6brA{x^\.=BA)zqT*R6z0.t@x+dؿp&e$m[LP?ѭ^iףEU "\r6l…~_#,KpN`(q_:C?RD"9/O8i0k׹sϵZ~bvKzk>cϧUH$8 3a" םّmۦEtziIZy>/WSQz\6%AB`HU*Ɂ{59pR}+[dY WEw]_;ML~gj挊5%KjL*UCkZﺮ8@亮뺉.iA;GJeYm $}cP(È||='lVl[O4oډ*HjJADN_$RPn*r'\PO0dCȿϴm{||| V*??u(iqc+ "c7_:;&I?\Nsh7ך5߹>7ϤWVzH&|P+hhv` æ-xPa ϜT*DTҫ_u`$U19G '8cyG%[JIm 9K0HqQYV "?AW,\%@B [iRQwae2Zg}#Gbvm=*I/~Q7[⹅-:kA& w  ?,b'(d2 HuUZˇrmS 몒JJi<*ᑢ{}oZљo*};@y{__~S>@)`"OҺu,KOڵٞHhr2mk|Տ~z:6.Pl4߻K/P:|mf͚[8uo@8[&< iu{ozu׵;)hذA1,Yh6mۦg}xV*n~:u.,7866%pp_:CeY͛#sνf: RnRiէ6fTƍSkWܸ_mjUkSđW,2DB mtΦ 4J"iPΝ;s=[0Cewimۚ/y˿MntiH=o?LF!~e ʺj;a4PtM6 }wc}0< u֍ԧh4rzh{ 4 ^oŒ, F@E0<)7o1zky%dkj5zF<Ǎ-޸kEed`ww i6AcccgK`_රX,vn::ӠB&Pt~ 2 8 #攓]_xqzE7'OͶi2ƦAC|+Ȅ!6RÄj/^; plllٲe/6R&, }^O$nȉSO$ 5k2Ls}hq.׽/[- //1yJ1:Cj/^g Nthg&fӼξ3w.jV,z7OVj=~/.wKjy^<>p!eRjĞ-S|Ѩq2a#xfS>1:Cj/^l+˖- ouނw&j/\uI}ds^9s"~{ܟ]hxr[۰!zo0k[er[TWkIЄ%K5C`hhܔSy+"oo$t#ECoK `_vjzJ]8믏 wU;.e^}[̋BB<\o^Yooɒfk^I+?`DWRĆ ev_:4xo۷o§iv*r]7nF[e[BsfYpQk͒֬cIҊz٘e2w݁d&)%EߟؘO{<mW*|>5%)hKپԘym͝?ÙKFl\1=j{f4gNsY0xnfJTQ7m|Ҡ$4AI|4`Td2ƶ~'Nz뭥SO; ~&ⵯ 7!ݵeu~ZmɭM˖m#AgUgqMT,c? ɕ1rNA3a$ꫯ:}OOZLp$Ƌ0w_ RUzjgAƗk54'U.iHI&eYVm|eWk Ñ<3_^ɄA N,aęɻ+,]tҥ?3fI~pl_V}16̺ub֞~dap&Yd%K l۸TLӪcN{W_kXf^Y/mq5~X5RÄj/^gVe|ՐL)ٞ?h'=:wnl^Iּy%L$Ozh̊,2M/ Dǎg슠:bߦMHѹ/2|Tz"(,:Jҙ OQߴɘ??\yK/W"v|PVLmo+/Yp P{Q TLef櫯:O7ڿ?3!i>聏j/^*bE[N)I^@ ?K19ufaP_~4; qu{F4jь3VS*5nk*Ў%Ѽyֱc|g\/X`jj}wCdM廿jtєH(e)2R[w6C0G΂U%,+ ξ/Eog0@)7 iuU*)Z-e0~%؂G;vH$?.VGL2)J:|XmF ꥗;]x{'7f<8- *}~̄uɄ@ҙ FmMLq CE*'-[*)*3y>9|J%v}51!ֆ Xs/)b|L]L,>|u]׷ip˖-sOLp`u7666iPx4 TJHxߞwLw,RI/rLX oh;E2DB_4|qwtZŢ g5 ڶJ"iPҽ-ɟMiX,~C,J\^P983?y7vefvryuZڿi˶Drl%KzW]]zi[ 7xďm v.cЙ6Z%)Dw gYE0s]w||۪!R .1;u[d'ZMm3dw뺝+|I$smSO?^o4r9LS&'U7'-}7t֢|βpsX q!<˱f< N8#=B,g\JMԱ"͖sTΟyypV^TwkEHޒ% ]ܪ0J 5f~QoS~nF:o~@l~""02o&2al-[i&l4Zy+|ytDfw^k;`:yzdUɺL}BO!z @8XetTc,: BdhE"(RTZrr9vJ[&1MӲ,9Rub.XZ菢#2 C p3--ϐR3X'lM-$W>7g{iJb :[kQP`v"M7iȩËx7os`d7_[uז-ޣzĴ7`r2x /"͗-tz3gY^3X,-ˢoL=jy!G֯_}iӜ̭:`Ky;_ĐfŊ/͎kq2_%%uzQf=@ WlS.ЕJj#-I>SCr%SJt'M1%Kѷ2:-ڌs\>AS*K={gOc44*oPPКMZLDۺ5|=s=m/Uqɖтyǡk}YY,8%u7w7.^ꇕK{SQ{)MFtLF6u18Wg~8{0opN-)l!C8!~J%%:t9+f%/֡C=IK޼yso>߉)[7ܠuK<IhT)) -LH0!k뎞LToy7Xwis, /HҹƜ"|~M{蓟~bWCmQU\Uy /|!O0!48cǎOF&$ɶU 2MU*mt?1bd%=6m(XWOccڹu=?/Kg脭'+7=˲Z3w/33 Ʈ"dJ#-Ϝh|9gшٔ˅W=:ړL+MHeb\)L붍M$mwkJJ*(;~]r2tZŢf >j`X`6yqիW `l-jL&yRqDь|0sѣYARZ*maRQ&6$B2V? -aʮ)ͺ#kŢ2H$Z~B˲yJիK\WZq$e2T*u_z/>>w$'ncE:!I:˿ܶuh͙H1 RZrs[9/WF{T:mfrY]-4!¡ d2 0\CP3>a+4h6,!0>wIZH/(I6%uWu4͛n[n?guupskc͐y~W^l?}AkhNɁ4!Im&}Xa]w]kOP8`97}ҿ8%y}wƍyK|A-sPbZ J1_@N,";9PR"lV&'ϓS2'ڶo~z"jn~xCK /;vs9sUtu"= ڥtZ岤ǾΉN^?(VL3f`W!P JEBْ4H4W_|TjRMt%lx;֭k]"RN3𼇥ǥAIY?ZX*wk޻v+_Bߊ?90$/ᰫTuqcq^ML0c$Y%夂tϮ]c_ν{/3=\Ԅ:]|}$Ҳ!\gi>B=\r>yhlG`0prh *Q.~E䃝;wJ?}`g,'0MPǢ'ah͚/Aĸ<ԵaȲT.P," /3zmE^j=޿? \ $sđ#4WVxd% I;?0y%{TK(\zr'y@kK\$< X\VyrVr]w~IZDW]7AO<g$-_}ٸqmB-/_gΜ?cvKYSw6URi[ah,*3!LZk,h*R6tZlbVꪫsڳ߹wT+ib]tQqt#Gisth}+_ SAygsP.TW[жԖ%m}i[ˡC~,zk4}Ouͫ NO<&!P// ,_D+ΝۤOH^eHW I*^;kR6!ll@I dr ab蠩Tώ͟c^ۿ-ӔiRٳ\q2瞸2BL!֩B %I&K˜cD1ZIU-?T lVs6yq^jw9 PWlm&^>9t#EemW|5'U%ncv|,Sl480 BHu+Ocv*r]ז;nČ$a(3pe2RTTժ^uT*evXdw qOSdym27eBuL8ĄmnȄ>D"n_eٲeJyxZO<>>nVd2;A 0abq?Y4MIiv- J&b[I?>b_XL0,F W42u_?ۗu;wak8n v'N kLȐQ*i0P*Ji@#!00000000_l_N8BP(<l_x;^/l_ m۟ԧ ׿uq^׿BT*9cl_~]s<ϛkiT*LuݠŲb8>W*2LZM&}-G\P([ èVܺS*j4ժauI?2l6hbr]7HVMNNY*"7s@Rrپ JR(yy|uT* )jt:=99y^Ѱ,˶mA?2}T*kYՓH$>ۗJ̙311m=zT*rЁf٬ÂoX,S (and2t }@8[$d28m۳w]Giw2E*S۶d枡͟ ijaDMӬjGD0Uömqfbз,=?0չ뺵Z:!?Ƹ\.C!lNgb 5\'#a#SNm ɤBDpY/Zdۂn‹w{=7NLL3fZ#8sbH z6s]_@q3b(C@ -áD"w T*UT* ?eSL%O `a+ӓdJR2 \׵m;a3#ǿRG$j:K@8dRq'c_^!ӐJeY lNRl%d[$i24M:}@8@X*;ST*ap)vT*l6<$݃$H&jR4MpPYU( alֶm+x8 ~0&&&:iANPWJZNp剉\.bȟf}CfT*L:f1 95T*۶ H 5To";BQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQBQB~B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!B)!Bma:[IENDB`ceres-solver-1.13.0/docs/source/spivak_notation.rst0000644000232200023220000000336413140546177022763 0ustar debalancedebalance.. default-domain:: cpp .. cpp:namespace:: ceres .. _chapter-spivak_notation: =============== Spivak Notation =============== To preserve our collective sanities, we will use Spivak's notation for derivatives. It is a functional notation that makes reading and reasoning about expressions involving derivatives simple. For a univariate function :math:`f`, :math:`f(a)` denotes its value at :math:`a`. :math:`Df` denotes its first derivative, and :math:`Df(a)` is the derivative evaluated at :math:`a`, i.e .. math:: Df(a) = \left . \frac{d}{dx} f(x) \right |_{x = a} :math:`D^kf` denotes the :math:`k^{\text{th}}` derivative of :math:`f`. For a bi-variate function :math:`g(x,y)`. :math:`D_1g` and :math:`D_2g` denote the partial derivatives of :math:`g` w.r.t the first and second variable respectively. In the classical notation this is equivalent to saying: .. math:: D_1 g = \frac{\partial}{\partial x}g(x,y) \text{ and } D_2 g = \frac{\partial}{\partial y}g(x,y). :math:`Dg` denotes the Jacobian of `g`, i.e., .. math:: Dg = \begin{bmatrix} D_1g & D_2g \end{bmatrix} More generally for a multivariate function :math:`g:\mathbb{R}^n \longrightarrow \mathbb{R}^m`, :math:`Dg` denotes the :math:`m\times n` Jacobian matrix. :math:`D_i g` is the partial derivative of :math:`g` w.r.t the :math:`i^{\text{th}}` coordinate and the :math:`i^{\text{th}}` column of :math:`Dg`. Finally, :math:`D^2_1g` and :math:`D_1D_2g` have the obvious meaning as higher order partial derivatives. For more see Michael Spivak's book `Calculus on Manifolds `_ or a brief discussion of the `merits of this notation `_ by Mitchell N. Charity. ceres-solver-1.13.0/docs/source/nnls_modeling.rst0000644000232200023220000023777213140546177022417 0ustar debalancedebalance.. default-domain:: cpp .. cpp:namespace:: ceres .. _`chapter-nnls_modeling`: ================================= Modeling Non-linear Least Squares ================================= Introduction ============ Ceres solver consists of two distinct parts. A modeling API which provides a rich set of tools to construct an optimization problem one term at a time and a solver API that controls the minimization algorithm. This chapter is devoted to the task of modeling optimization problems using Ceres. :ref:`chapter-nnls_solving` discusses the various ways in which an optimization problem can be solved using Ceres. Ceres solves robustified bounds constrained non-linear least squares problems of the form: .. math:: :label: ceresproblem \min_{\mathbf{x}} &\quad \frac{1}{2}\sum_{i} \rho_i\left(\left\|f_i\left(x_{i_1}, ... ,x_{i_k}\right)\right\|^2\right) \\ \text{s.t.} &\quad l_j \le x_j \le u_j In Ceres parlance, the expression :math:`\rho_i\left(\left\|f_i\left(x_{i_1},...,x_{i_k}\right)\right\|^2\right)` is known as a **residual block**, where :math:`f_i(\cdot)` is a :class:`CostFunction` that depends on the **parameter blocks** :math:`\left\{x_{i_1},... , x_{i_k}\right\}`. In most optimization problems small groups of scalars occur together. For example the three components of a translation vector and the four components of the quaternion that define the pose of a camera. We refer to such a group of scalars as a **parameter block**. Of course a parameter block can be just a single scalar too. :math:`\rho_i` is a :class:`LossFunction`. A :class:`LossFunction` is a scalar valued function that is used to reduce the influence of outliers on the solution of non-linear least squares problems. :math:`l_j` and :math:`u_j` are lower and upper bounds on the parameter block :math:`x_j`. As a special case, when :math:`\rho_i(x) = x`, i.e., the identity function, and :math:`l_j = -\infty` and :math:`u_j = \infty` we get the more familiar unconstrained `non-linear least squares problem `_. .. math:: :label: ceresproblemunconstrained \frac{1}{2}\sum_{i} \left\|f_i\left(x_{i_1}, ... ,x_{i_k}\right)\right\|^2. :class:`CostFunction` ===================== For each term in the objective function, a :class:`CostFunction` is responsible for computing a vector of residuals and if asked a vector of Jacobian matrices, i.e., given :math:`\left[x_{i_1}, ... , x_{i_k}\right]`, compute the vector :math:`f_i\left(x_{i_1},...,x_{i_k}\right)` and the matrices .. math:: J_{ij} = \frac{\partial}{\partial x_{i_j}}f_i\left(x_{i_1},...,x_{i_k}\right),\quad \forall j \in \{1, \ldots, k\} .. class:: CostFunction .. code-block:: c++ class CostFunction { public: virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) = 0; const vector& parameter_block_sizes(); int num_residuals() const; protected: vector* mutable_parameter_block_sizes(); void set_num_residuals(int num_residuals); }; The signature of the :class:`CostFunction` (number and sizes of input parameter blocks and number of outputs) is stored in :member:`CostFunction::parameter_block_sizes_` and :member:`CostFunction::num_residuals_` respectively. User code inheriting from this class is expected to set these two members with the corresponding accessors. This information will be verified by the :class:`Problem` when added with :func:`Problem::AddResidualBlock`. .. function:: bool CostFunction::Evaluate(double const* const* parameters, double* residuals, double** jacobians) Compute the residual vector and the Jacobian matrices. ``parameters`` is an array of pointers to arrays containing the various parameter blocks. ``parameters`` has the same number of elements as :member:`CostFunction::parameter_block_sizes_` and the parameter blocks are in the same order as :member:`CostFunction::parameter_block_sizes_`. ``residuals`` is an array of size ``num_residuals_``. ``jacobians`` is an array of size :member:`CostFunction::parameter_block_sizes_` containing pointers to storage for Jacobian matrices corresponding to each parameter block. The Jacobian matrices are in the same order as :member:`CostFunction::parameter_block_sizes_`. ``jacobians[i]`` is an array that contains :member:`CostFunction::num_residuals_` x :member:`CostFunction::parameter_block_sizes_` ``[i]`` elements. Each Jacobian matrix is stored in row-major order, i.e., ``jacobians[i][r * parameter_block_size_[i] + c]`` = :math:`\frac{\partial residual[r]}{\partial parameters[i][c]}` If ``jacobians`` is ``NULL``, then no derivatives are returned; this is the case when computing cost only. If ``jacobians[i]`` is ``NULL``, then the Jacobian matrix corresponding to the :math:`i^{\textrm{th}}` parameter block must not be returned, this is the case when a parameter block is marked constant. **NOTE** The return value indicates whether the computation of the residuals and/or jacobians was successful or not. This can be used to communicate numerical failures in Jacobian computations for instance. :class:`SizedCostFunction` ========================== .. class:: SizedCostFunction If the size of the parameter blocks and the size of the residual vector is known at compile time (this is the common case), :class:`SizeCostFunction` can be used where these values can be specified as template parameters and the user only needs to implement :func:`CostFunction::Evaluate`. .. code-block:: c++ template class SizedCostFunction : public CostFunction { public: virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const = 0; }; :class:`AutoDiffCostFunction` ============================= .. class:: AutoDiffCostFunction Defining a :class:`CostFunction` or a :class:`SizedCostFunction` can be a tedious and error prone especially when computing derivatives. To this end Ceres provides `automatic differentiation `_. .. code-block:: c++ template // Number of parameters in block 9. class AutoDiffCostFunction : public SizedCostFunction { public: explicit AutoDiffCostFunction(CostFunctor* functor); // Ignore the template parameter kNumResiduals and use // num_residuals instead. AutoDiffCostFunction(CostFunctor* functor, int num_residuals); }; To get an auto differentiated cost function, you must define a class with a templated ``operator()`` (a functor) that computes the cost function in terms of the template parameter ``T``. The autodiff framework substitutes appropriate ``Jet`` objects for ``T`` in order to compute the derivative when necessary, but this is hidden, and you should write the function as if ``T`` were a scalar type (e.g. a double-precision floating point number). The function must write the computed value in the last argument (the only non-``const`` one) and return true to indicate success. For example, consider a scalar error :math:`e = k - x^\top y`, where both :math:`x` and :math:`y` are two-dimensional vector parameters and :math:`k` is a constant. The form of this error, which is the difference between a constant and an expression, is a common pattern in least squares problems. For example, the value :math:`x^\top y` might be the model expectation for a series of measurements, where there is an instance of the cost function for each measurement :math:`k`. The actual cost added to the total problem is :math:`e^2`, or :math:`(k - x^\top y)^2`; however, the squaring is implicitly done by the optimization framework. To write an auto-differentiable cost function for the above model, first define the object .. code-block:: c++ class MyScalarCostFunctor { MyScalarCostFunctor(double k): k_(k) {} template bool operator()(const T* const x , const T* const y, T* e) const { e[0] = k_ - x[0] * y[0] - x[1] * y[1]; return true; } private: double k_; }; Note that in the declaration of ``operator()`` the input parameters ``x`` and ``y`` come first, and are passed as const pointers to arrays of ``T``. If there were three input parameters, then the third input parameter would come after ``y``. The output is always the last parameter, and is also a pointer to an array. In the example above, ``e`` is a scalar, so only ``e[0]`` is set. Then given this class definition, the auto differentiated cost function for it can be constructed as follows. .. code-block:: c++ CostFunction* cost_function = new AutoDiffCostFunction( new MyScalarCostFunctor(1.0)); ^ ^ ^ | | | Dimension of residual ------+ | | Dimension of x ----------------+ | Dimension of y -------------------+ In this example, there is usually an instance for each measurement of ``k``. In the instantiation above, the template parameters following ``MyScalarCostFunction``, ``<1, 2, 2>`` describe the functor as computing a 1-dimensional output from two arguments, both 2-dimensional. :class:`AutoDiffCostFunction` also supports cost functions with a runtime-determined number of residuals. For example: .. code-block:: c++ CostFunction* cost_function = new AutoDiffCostFunction( new CostFunctorWithDynamicNumResiduals(1.0), ^ ^ ^ runtime_number_of_residuals); <----+ | | | | | | | | | | | Actual number of residuals ------+ | | | Indicate dynamic number of residuals --------+ | | Dimension of x ------------------------------------+ | Dimension of y ---------------------------------------+ The framework can currently accommodate cost functions of up to 10 independent variables, and there is no limit on the dimensionality of each of them. **WARNING 1** A common beginner's error when first using :class:`AutoDiffCostFunction` is to get the sizing wrong. In particular, there is a tendency to set the template parameters to (dimension of residual, number of parameters) instead of passing a dimension parameter for *every parameter block*. In the example above, that would be ````, which is missing the 2 as the last template argument. :class:`DynamicAutoDiffCostFunction` ==================================== .. class:: DynamicAutoDiffCostFunction :class:`AutoDiffCostFunction` requires that the number of parameter blocks and their sizes be known at compile time. It also has an upper limit of 10 parameter blocks. In a number of applications, this is not enough e.g., Bezier curve fitting, Neural Network training etc. .. code-block:: c++ template class DynamicAutoDiffCostFunction : public CostFunction { }; In such cases :class:`DynamicAutoDiffCostFunction` can be used. Like :class:`AutoDiffCostFunction` the user must define a templated functor, but the signature of the functor differs slightly. The expected interface for the cost functors is: .. code-block:: c++ struct MyCostFunctor { template bool operator()(T const* const* parameters, T* residuals) const { } } Since the sizing of the parameters is done at runtime, you must also specify the sizes after creating the dynamic autodiff cost function. For example: .. code-block:: c++ DynamicAutoDiffCostFunction* cost_function = new DynamicAutoDiffCostFunction( new MyCostFunctor()); cost_function->AddParameterBlock(5); cost_function->AddParameterBlock(10); cost_function->SetNumResiduals(21); Under the hood, the implementation evaluates the cost function multiple times, computing a small set of the derivatives (four by default, controlled by the ``Stride`` template parameter) with each pass. There is a performance tradeoff with the size of the passes; Smaller sizes are more cache efficient but result in larger number of passes, and larger stride lengths can destroy cache-locality while reducing the number of passes over the cost function. The optimal value depends on the number and sizes of the various parameter blocks. As a rule of thumb, try using :class:`AutoDiffCostFunction` before you use :class:`DynamicAutoDiffCostFunction`. :class:`NumericDiffCostFunction` ================================ .. class:: NumericDiffCostFunction In some cases, its not possible to define a templated cost functor, for example when the evaluation of the residual involves a call to a library function that you do not have control over. In such a situation, `numerical differentiation `_ can be used. .. NOTE :: TODO(sameeragarwal): Add documentation for the constructor and for NumericDiffOptions. Update DynamicNumericDiffOptions in a similar manner. .. code-block:: c++ template // Number of parameters in block 9. class NumericDiffCostFunction : public SizedCostFunction { }; To get a numerically differentiated :class:`CostFunction`, you must define a class with a ``operator()`` (a functor) that computes the residuals. The functor must write the computed value in the last argument (the only non-``const`` one) and return ``true`` to indicate success. Please see :class:`CostFunction` for details on how the return value may be used to impose simple constraints on the parameter block. e.g., an object of the form .. code-block:: c++ struct ScalarFunctor { public: bool operator()(const double* const x1, const double* const x2, double* residuals) const; } For example, consider a scalar error :math:`e = k - x'y`, where both :math:`x` and :math:`y` are two-dimensional column vector parameters, the prime sign indicates transposition, and :math:`k` is a constant. The form of this error, which is the difference between a constant and an expression, is a common pattern in least squares problems. For example, the value :math:`x'y` might be the model expectation for a series of measurements, where there is an instance of the cost function for each measurement :math:`k`. To write an numerically-differentiable class:`CostFunction` for the above model, first define the object .. code-block:: c++ class MyScalarCostFunctor { MyScalarCostFunctor(double k): k_(k) {} bool operator()(const double* const x, const double* const y, double* residuals) const { residuals[0] = k_ - x[0] * y[0] + x[1] * y[1]; return true; } private: double k_; }; Note that in the declaration of ``operator()`` the input parameters ``x`` and ``y`` come first, and are passed as const pointers to arrays of ``double`` s. If there were three input parameters, then the third input parameter would come after ``y``. The output is always the last parameter, and is also a pointer to an array. In the example above, the residual is a scalar, so only ``residuals[0]`` is set. Then given this class definition, the numerically differentiated :class:`CostFunction` with central differences used for computing the derivative can be constructed as follows. .. code-block:: c++ CostFunction* cost_function = new NumericDiffCostFunction( new MyScalarCostFunctor(1.0)); ^ ^ ^ ^ | | | | Finite Differencing Scheme -+ | | | Dimension of residual ------------+ | | Dimension of x ----------------------+ | Dimension of y -------------------------+ In this example, there is usually an instance for each measurement of `k`. In the instantiation above, the template parameters following ``MyScalarCostFunctor``, ``1, 2, 2``, describe the functor as computing a 1-dimensional output from two arguments, both 2-dimensional. NumericDiffCostFunction also supports cost functions with a runtime-determined number of residuals. For example: .. code-block:: c++ CostFunction* cost_function = new NumericDiffCostFunction( new CostFunctorWithDynamicNumResiduals(1.0), ^ ^ ^ TAKE_OWNERSHIP, | | | runtime_number_of_residuals); <----+ | | | | | | | | | | | Actual number of residuals ------+ | | | Indicate dynamic number of residuals --------------------+ | | Dimension of x ------------------------------------------------+ | Dimension of y ---------------------------------------------------+ The framework can currently accommodate cost functions of up to 10 independent variables, and there is no limit on the dimensionality of each of them. There are three available numeric differentiation schemes in ceres-solver: The ``FORWARD`` difference method, which approximates :math:`f'(x)` by computing :math:`\frac{f(x+h)-f(x)}{h}`, computes the cost function one additional time at :math:`x+h`. It is the fastest but least accurate method. The ``CENTRAL`` difference method is more accurate at the cost of twice as many function evaluations than forward difference, estimating :math:`f'(x)` by computing :math:`\frac{f(x+h)-f(x-h)}{2h}`. The ``RIDDERS`` difference method[Ridders]_ is an adaptive scheme that estimates derivatives by performing multiple central differences at varying scales. Specifically, the algorithm starts at a certain :math:`h` and as the derivative is estimated, this step size decreases. To conserve function evaluations and estimate the derivative error, the method performs Richardson extrapolations between the tested step sizes. The algorithm exhibits considerably higher accuracy, but does so by additional evaluations of the cost function. Consider using ``CENTRAL`` differences to begin with. Based on the results, either try forward difference to improve performance or Ridders' method to improve accuracy. **WARNING** A common beginner's error when first using :class:`NumericDiffCostFunction` is to get the sizing wrong. In particular, there is a tendency to set the template parameters to (dimension of residual, number of parameters) instead of passing a dimension parameter for *every parameter*. In the example above, that would be ````, which is missing the last ``2`` argument. Please be careful when setting the size parameters. Numeric Differentiation & LocalParameterization ----------------------------------------------- If your cost function depends on a parameter block that must lie on a manifold and the functor cannot be evaluated for values of that parameter block not on the manifold then you may have problems numerically differentiating such functors. This is because numeric differentiation in Ceres is performed by perturbing the individual coordinates of the parameter blocks that a cost functor depends on. In doing so, we assume that the parameter blocks live in an Euclidean space and ignore the structure of manifold that they live As a result some of the perturbations may not lie on the manifold corresponding to the parameter block. For example consider a four dimensional parameter block that is interpreted as a unit Quaternion. Perturbing the coordinates of this parameter block will violate the unit norm property of the parameter block. Fixing this problem requires that :class:`NumericDiffCostFunction` be aware of the :class:`LocalParameterization` associated with each parameter block and only generate perturbations in the local tangent space of each parameter block. For now this is not considered to be a serious enough problem to warrant changing the :class:`NumericDiffCostFunction` API. Further, in most cases it is relatively straightforward to project a point off the manifold back onto the manifold before using it in the functor. For example in case of the Quaternion, normalizing the 4-vector before using it does the trick. **Alternate Interface** For a variety of reasons, including compatibility with legacy code, :class:`NumericDiffCostFunction` can also take :class:`CostFunction` objects as input. The following describes how. To get a numerically differentiated cost function, define a subclass of :class:`CostFunction` such that the :func:`CostFunction::Evaluate` function ignores the ``jacobians`` parameter. The numeric differentiation wrapper will fill in the jacobian parameter if necessary by repeatedly calling the :func:`CostFunction::Evaluate` with small changes to the appropriate parameters, and computing the slope. For performance, the numeric differentiation wrapper class is templated on the concrete cost function, even though it could be implemented only in terms of the :class:`CostFunction` interface. The numerically differentiated version of a cost function for a cost function can be constructed as follows: .. code-block:: c++ CostFunction* cost_function = new NumericDiffCostFunction( new MyCostFunction(...), TAKE_OWNERSHIP); where ``MyCostFunction`` has 1 residual and 2 parameter blocks with sizes 4 and 8 respectively. Look at the tests for a more detailed example. :class:`DynamicNumericDiffCostFunction` ======================================= .. class:: DynamicNumericDiffCostFunction Like :class:`AutoDiffCostFunction` :class:`NumericDiffCostFunction` requires that the number of parameter blocks and their sizes be known at compile time. It also has an upper limit of 10 parameter blocks. In a number of applications, this is not enough. .. code-block:: c++ template class DynamicNumericDiffCostFunction : public CostFunction { }; In such cases when numeric differentiation is desired, :class:`DynamicNumericDiffCostFunction` can be used. Like :class:`NumericDiffCostFunction` the user must define a functor, but the signature of the functor differs slightly. The expected interface for the cost functors is: .. code-block:: c++ struct MyCostFunctor { bool operator()(double const* const* parameters, double* residuals) const { } } Since the sizing of the parameters is done at runtime, you must also specify the sizes after creating the dynamic numeric diff cost function. For example: .. code-block:: c++ DynamicNumericDiffCostFunction* cost_function = new DynamicNumericDiffCostFunction(new MyCostFunctor); cost_function->AddParameterBlock(5); cost_function->AddParameterBlock(10); cost_function->SetNumResiduals(21); As a rule of thumb, try using :class:`NumericDiffCostFunction` before you use :class:`DynamicNumericDiffCostFunction`. **WARNING** The same caution about mixing local parameterizations with numeric differentiation applies as is the case with :class:`NumericDiffCostFunction`. :class:`CostFunctionToFunctor` ============================== .. class:: CostFunctionToFunctor :class:`CostFunctionToFunctor` is an adapter class that allows users to use :class:`CostFunction` objects in templated functors which are to be used for automatic differentiation. This allows the user to seamlessly mix analytic, numeric and automatic differentiation. For example, let us assume that .. code-block:: c++ class IntrinsicProjection : public SizedCostFunction<2, 5, 3> { public: IntrinsicProjection(const double* observation); virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const; }; is a :class:`CostFunction` that implements the projection of a point in its local coordinate system onto its image plane and subtracts it from the observed point projection. It can compute its residual and either via analytic or numerical differentiation can compute its jacobians. Now we would like to compose the action of this :class:`CostFunction` with the action of camera extrinsics, i.e., rotation and translation. Say we have a templated function .. code-block:: c++ template void RotateAndTranslatePoint(const T* rotation, const T* translation, const T* point, T* result); Then we can now do the following, .. code-block:: c++ struct CameraProjection { CameraProjection(double* observation) : intrinsic_projection_(new IntrinsicProjection(observation)) { } template bool operator()(const T* rotation, const T* translation, const T* intrinsics, const T* point, T* residual) const { T transformed_point[3]; RotateAndTranslatePoint(rotation, translation, point, transformed_point); // Note that we call intrinsic_projection_, just like it was // any other templated functor. return intrinsic_projection_(intrinsics, transformed_point, residual); } private: CostFunctionToFunctor<2,5,3> intrinsic_projection_; }; Note that :class:`CostFunctionToFunctor` takes ownership of the :class:`CostFunction` that was passed in to the constructor. In the above example, we assumed that ``IntrinsicProjection`` is a ``CostFunction`` capable of evaluating its value and its derivatives. Suppose, if that were not the case and ``IntrinsicProjection`` was defined as follows: .. code-block:: c++ struct IntrinsicProjection IntrinsicProjection(const double* observation) { observation_[0] = observation[0]; observation_[1] = observation[1]; } bool operator()(const double* calibration, const double* point, double* residuals) { double projection[2]; ThirdPartyProjectionFunction(calibration, point, projection); residuals[0] = observation_[0] - projection[0]; residuals[1] = observation_[1] - projection[1]; return true; } double observation_[2]; }; Here ``ThirdPartyProjectionFunction`` is some third party library function that we have no control over. So this function can compute its value and we would like to use numeric differentiation to compute its derivatives. In this case we can use a combination of ``NumericDiffCostFunction`` and ``CostFunctionToFunctor`` to get the job done. .. code-block:: c++ struct CameraProjection { CameraProjection(double* observation) intrinsic_projection_( new NumericDiffCostFunction( new IntrinsicProjection(observation)) { } template bool operator()(const T* rotation, const T* translation, const T* intrinsics, const T* point, T* residuals) const { T transformed_point[3]; RotateAndTranslatePoint(rotation, translation, point, transformed_point); return intrinsic_projection_(intrinsics, transformed_point, residual); } private: CostFunctionToFunctor<2,5,3> intrinsic_projection_; }; :class:`DynamicCostFunctionToFunctor` ===================================== .. class:: DynamicCostFunctionToFunctor :class:`DynamicCostFunctionToFunctor` provides the same functionality as :class:`CostFunctionToFunctor` for cases where the number and size of the parameter vectors and residuals are not known at compile-time. The API provided by :class:`DynamicCostFunctionToFunctor` matches what would be expected by :class:`DynamicAutoDiffCostFunction`, i.e. it provides a templated functor of this form: .. code-block:: c++ template bool operator()(T const* const* parameters, T* residuals) const; Similar to the example given for :class:`CostFunctionToFunctor`, let us assume that .. code-block:: c++ class IntrinsicProjection : public CostFunction { public: IntrinsicProjection(const double* observation); virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const; }; is a :class:`CostFunction` that projects a point in its local coordinate system onto its image plane and subtracts it from the observed point projection. Using this :class:`CostFunction` in a templated functor would then look like this: .. code-block:: c++ struct CameraProjection { CameraProjection(double* observation) : intrinsic_projection_(new IntrinsicProjection(observation)) { } template bool operator()(T const* const* parameters, T* residual) const { const T* rotation = parameters[0]; const T* translation = parameters[1]; const T* intrinsics = parameters[2]; const T* point = parameters[3]; T transformed_point[3]; RotateAndTranslatePoint(rotation, translation, point, transformed_point); const T* projection_parameters[2]; projection_parameters[0] = intrinsics; projection_parameters[1] = transformed_point; return intrinsic_projection_(projection_parameters, residual); } private: DynamicCostFunctionToFunctor intrinsic_projection_; }; Like :class:`CostFunctionToFunctor`, :class:`DynamicCostFunctionToFunctor` takes ownership of the :class:`CostFunction` that was passed in to the constructor. :class:`ConditionedCostFunction` ================================ .. class:: ConditionedCostFunction This class allows you to apply different conditioning to the residual values of a wrapped cost function. An example where this is useful is where you have an existing cost function that produces N values, but you want the total cost to be something other than just the sum of these squared values - maybe you want to apply a different scaling to some values, to change their contribution to the cost. Usage: .. code-block:: c++ // my_cost_function produces N residuals CostFunction* my_cost_function = ... CHECK_EQ(N, my_cost_function->num_residuals()); vector conditioners; // Make N 1x1 cost functions (1 parameter, 1 residual) CostFunction* f_1 = ... conditioners.push_back(f_1); CostFunction* f_N = ... conditioners.push_back(f_N); ConditionedCostFunction* ccf = new ConditionedCostFunction(my_cost_function, conditioners); Now ``ccf`` 's ``residual[i]`` (i=0..N-1) will be passed though the :math:`i^{\text{th}}` conditioner. .. code-block:: c++ ccf_residual[i] = f_i(my_cost_function_residual[i]) and the Jacobian will be affected appropriately. :class:`GradientChecker` ================================ .. class:: GradientChecker This class compares the Jacobians returned by a cost function against derivatives estimated using finite differencing. It is meant as a tool for unit testing, giving you more fine-grained control than the check_gradients option in the solver options. The condition enforced is that .. math:: \forall{i,j}: \frac{J_{ij} - J'_{ij}}{max_{ij}(J_{ij} - J'_{ij})} < r where :math:`J_{ij}` is the jacobian as computed by the supplied cost function (by the user) multiplied by the local parameterization Jacobian, :math:`J'_{ij}` is the jacobian as computed by finite differences, multiplied by the local parameterization Jacobian as well, and :math:`r` is the relative precision. Usage: .. code-block:: c++ // my_cost_function takes two parameter blocks. The first has a local // parameterization associated with it. CostFunction* my_cost_function = ... LocalParameterization* my_parameterization = ... NumericDiffOptions numeric_diff_options; std::vector local_parameterizations; local_parameterizations.push_back(my_parameterization); local_parameterizations.push_back(NULL); std::vector parameter1; std::vector parameter2; // Fill parameter 1 & 2 with test data... std::vector parameter_blocks; parameter_blocks.push_back(parameter1.data()); parameter_blocks.push_back(parameter2.data()); GradientChecker gradient_checker(my_cost_function, local_parameterizations, numeric_diff_options); GradientCheckResults results; if (!gradient_checker.Probe(parameter_blocks.data(), 1e-9, &results) { LOG(ERROR) << "An error has occurred:\n" << results.error_log; } :class:`NormalPrior` ==================== .. class:: NormalPrior .. code-block:: c++ class NormalPrior: public CostFunction { public: // Check that the number of rows in the vector b are the same as the // number of columns in the matrix A, crash otherwise. NormalPrior(const Matrix& A, const Vector& b); virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const; }; Implements a cost function of the form .. math:: cost(x) = ||A(x - b)||^2 where, the matrix :math:`A` and the vector :math:`b` are fixed and :math:`x` is the variable. In case the user is interested in implementing a cost function of the form .. math:: cost(x) = (x - \mu)^T S^{-1} (x - \mu) where, :math:`\mu` is a vector and :math:`S` is a covariance matrix, then, :math:`A = S^{-1/2}`, i.e the matrix :math:`A` is the square root of the inverse of the covariance, also known as the stiffness matrix. There are however no restrictions on the shape of :math:`A`. It is free to be rectangular, which would be the case if the covariance matrix :math:`S` is rank deficient. .. _`section-loss_function`: :class:`LossFunction` ===================== .. class:: LossFunction For least squares problems where the minimization may encounter input terms that contain outliers, that is, completely bogus measurements, it is important to use a loss function that reduces their influence. Consider a structure from motion problem. The unknowns are 3D points and camera parameters, and the measurements are image coordinates describing the expected reprojected position for a point in a camera. For example, we want to model the geometry of a street scene with fire hydrants and cars, observed by a moving camera with unknown parameters, and the only 3D points we care about are the pointy tippy-tops of the fire hydrants. Our magic image processing algorithm, which is responsible for producing the measurements that are input to Ceres, has found and matched all such tippy-tops in all image frames, except that in one of the frame it mistook a car's headlight for a hydrant. If we didn't do anything special the residual for the erroneous measurement will result in the entire solution getting pulled away from the optimum to reduce the large error that would otherwise be attributed to the wrong measurement. Using a robust loss function, the cost for large residuals is reduced. In the example above, this leads to outlier terms getting down-weighted so they do not overly influence the final solution. .. code-block:: c++ class LossFunction { public: virtual void Evaluate(double s, double out[3]) const = 0; }; The key method is :func:`LossFunction::Evaluate`, which given a non-negative scalar ``s``, computes .. math:: out = \begin{bmatrix}\rho(s), & \rho'(s), & \rho''(s)\end{bmatrix} Here the convention is that the contribution of a term to the cost function is given by :math:`\frac{1}{2}\rho(s)`, where :math:`s =\|f_i\|^2`. Calling the method with a negative value of :math:`s` is an error and the implementations are not required to handle that case. Most sane choices of :math:`\rho` satisfy: .. math:: \rho(0) &= 0\\ \rho'(0) &= 1\\ \rho'(s) &< 1 \text{ in the outlier region}\\ \rho''(s) &< 0 \text{ in the outlier region} so that they mimic the squared cost for small residuals. **Scaling** Given one robustifier :math:`\rho(s)` one can change the length scale at which robustification takes place, by adding a scale factor :math:`a > 0` which gives us :math:`\rho(s,a) = a^2 \rho(s / a^2)` and the first and second derivatives as :math:`\rho'(s / a^2)` and :math:`(1 / a^2) \rho''(s / a^2)` respectively. The reason for the appearance of squaring is that :math:`a` is in the units of the residual vector norm whereas :math:`s` is a squared norm. For applications it is more convenient to specify :math:`a` than its square. Instances --------- Ceres includes a number of predefined loss functions. For simplicity we described their unscaled versions. The figure below illustrates their shape graphically. More details can be found in ``include/ceres/loss_function.h``. .. figure:: loss.png :figwidth: 500px :height: 400px :align: center Shape of the various common loss functions. .. class:: TrivialLoss .. math:: \rho(s) = s .. class:: HuberLoss .. math:: \rho(s) = \begin{cases} s & s \le 1\\ 2 \sqrt{s} - 1 & s > 1 \end{cases} .. class:: SoftLOneLoss .. math:: \rho(s) = 2 (\sqrt{1+s} - 1) .. class:: CauchyLoss .. math:: \rho(s) = \log(1 + s) .. class:: ArctanLoss .. math:: \rho(s) = \arctan(s) .. class:: TolerantLoss .. math:: \rho(s,a,b) = b \log(1 + e^{(s - a) / b}) - b \log(1 + e^{-a / b}) .. class:: ComposedLoss Given two loss functions ``f`` and ``g``, implements the loss function ``h(s) = f(g(s))``. .. code-block:: c++ class ComposedLoss : public LossFunction { public: explicit ComposedLoss(const LossFunction* f, Ownership ownership_f, const LossFunction* g, Ownership ownership_g); }; .. class:: ScaledLoss Sometimes you want to simply scale the output value of the robustifier. For example, you might want to weight different error terms differently (e.g., weight pixel reprojection errors differently from terrain errors). Given a loss function :math:`\rho(s)` and a scalar :math:`a`, :class:`ScaledLoss` implements the function :math:`a \rho(s)`. Since we treat a ``NULL`` Loss function as the Identity loss function, :math:`rho` = ``NULL``: is a valid input and will result in the input being scaled by :math:`a`. This provides a simple way of implementing a scaled ResidualBlock. .. class:: LossFunctionWrapper Sometimes after the optimization problem has been constructed, we wish to mutate the scale of the loss function. For example, when performing estimation from data which has substantial outliers, convergence can be improved by starting out with a large scale, optimizing the problem and then reducing the scale. This can have better convergence behavior than just using a loss function with a small scale. This templated class allows the user to implement a loss function whose scale can be mutated after an optimization problem has been constructed, e.g, .. code-block:: c++ Problem problem; // Add parameter blocks CostFunction* cost_function = new AutoDiffCostFunction < UW_Camera_Mapper, 2, 9, 3>( new UW_Camera_Mapper(feature_x, feature_y)); LossFunctionWrapper* loss_function(new HuberLoss(1.0), TAKE_OWNERSHIP); problem.AddResidualBlock(cost_function, loss_function, parameters); Solver::Options options; Solver::Summary summary; Solve(options, &problem, &summary); loss_function->Reset(new HuberLoss(1.0), TAKE_OWNERSHIP); Solve(options, &problem, &summary); Theory ------ Let us consider a problem with a single problem and a single parameter block. .. math:: \min_x \frac{1}{2}\rho(f^2(x)) Then, the robustified gradient and the Gauss-Newton Hessian are .. math:: g(x) &= \rho'J^\top(x)f(x)\\ H(x) &= J^\top(x)\left(\rho' + 2 \rho''f(x)f^\top(x)\right)J(x) where the terms involving the second derivatives of :math:`f(x)` have been ignored. Note that :math:`H(x)` is indefinite if :math:`\rho''f(x)^\top f(x) + \frac{1}{2}\rho' < 0`. If this is not the case, then its possible to re-weight the residual and the Jacobian matrix such that the corresponding linear least squares problem for the robustified Gauss-Newton step. Let :math:`\alpha` be a root of .. math:: \frac{1}{2}\alpha^2 - \alpha - \frac{\rho''}{\rho'}\|f(x)\|^2 = 0. Then, define the rescaled residual and Jacobian as .. math:: \tilde{f}(x) &= \frac{\sqrt{\rho'}}{1 - \alpha} f(x)\\ \tilde{J}(x) &= \sqrt{\rho'}\left(1 - \alpha \frac{f(x)f^\top(x)}{\left\|f(x)\right\|^2} \right)J(x) In the case :math:`2 \rho''\left\|f(x)\right\|^2 + \rho' \lesssim 0`, we limit :math:`\alpha \le 1- \epsilon` for some small :math:`\epsilon`. For more details see [Triggs]_. With this simple rescaling, one can use any Jacobian based non-linear least squares algorithm to robustified non-linear least squares problems. :class:`LocalParameterization` ============================== .. class:: LocalParameterization .. code-block:: c++ class LocalParameterization { public: virtual ~LocalParameterization() {} virtual bool Plus(const double* x, const double* delta, double* x_plus_delta) const = 0; virtual bool ComputeJacobian(const double* x, double* jacobian) const = 0; virtual bool MultiplyByJacobian(const double* x, const int num_rows, const double* global_matrix, double* local_matrix) const; virtual int GlobalSize() const = 0; virtual int LocalSize() const = 0; }; Sometimes the parameters :math:`x` can overparameterize a problem. In that case it is desirable to choose a parameterization to remove the null directions of the cost. More generally, if :math:`x` lies on a manifold of a smaller dimension than the ambient space that it is embedded in, then it is numerically and computationally more effective to optimize it using a parameterization that lives in the tangent space of that manifold at each point. For example, a sphere in three dimensions is a two dimensional manifold, embedded in a three dimensional space. At each point on the sphere, the plane tangent to it defines a two dimensional tangent space. For a cost function defined on this sphere, given a point :math:`x`, moving in the direction normal to the sphere at that point is not useful. Thus a better way to parameterize a point on a sphere is to optimize over two dimensional vector :math:`\Delta x` in the tangent space at the point on the sphere point and then "move" to the point :math:`x + \Delta x`, where the move operation involves projecting back onto the sphere. Doing so removes a redundant dimension from the optimization, making it numerically more robust and efficient. More generally we can define a function .. math:: x' = \boxplus(x, \Delta x), where :math:`x'` has the same size as :math:`x`, and :math:`\Delta x` is of size less than or equal to :math:`x`. The function :math:`\boxplus`, generalizes the definition of vector addition. Thus it satisfies the identity .. math:: \boxplus(x, 0) = x,\quad \forall x. Instances of :class:`LocalParameterization` implement the :math:`\boxplus` operation and its derivative with respect to :math:`\Delta x` at :math:`\Delta x = 0`. .. function:: int LocalParameterization::GlobalSize() The dimension of the ambient space in which the parameter block :math:`x` lives. .. function:: int LocalParameterization::LocalSize() The size of the tangent space that :math:`\Delta x` lives in. .. function:: bool LocalParameterization::Plus(const double* x, const double* delta, double* x_plus_delta) const :func:`LocalParameterization::Plus` implements :math:`\boxplus(x,\Delta x)`. .. function:: bool LocalParameterization::ComputeJacobian(const double* x, double* jacobian) const Computes the Jacobian matrix .. math:: J = \left . \frac{\partial }{\partial \Delta x} \boxplus(x,\Delta x)\right|_{\Delta x = 0} in row major form. .. function:: bool MultiplyByJacobian(const double* x, const int num_rows, const double* global_matrix, double* local_matrix) const local_matrix = global_matrix * jacobian global_matrix is a num_rows x GlobalSize row major matrix. local_matrix is a num_rows x LocalSize row major matrix. jacobian is the matrix returned by :func:`LocalParameterization::ComputeJacobian` at :math:`x`. This is only used by GradientProblem. For most normal uses, it is okay to use the default implementation. Instances --------- .. class:: IdentityParameterization A trivial version of :math:`\boxplus` is when :math:`\Delta x` is of the same size as :math:`x` and .. math:: \boxplus(x, \Delta x) = x + \Delta x .. class:: SubsetParameterization A more interesting case if :math:`x` is a two dimensional vector, and the user wishes to hold the first coordinate constant. Then, :math:`\Delta x` is a scalar and :math:`\boxplus` is defined as .. math:: \boxplus(x, \Delta x) = x + \left[ \begin{array}{c} 0 \\ 1 \end{array} \right] \Delta x :class:`SubsetParameterization` generalizes this construction to hold any part of a parameter block constant. .. class:: QuaternionParameterization Another example that occurs commonly in Structure from Motion problems is when camera rotations are parameterized using a quaternion. There, it is useful only to make updates orthogonal to that 4-vector defining the quaternion. One way to do this is to let :math:`\Delta x` be a 3 dimensional vector and define :math:`\boxplus` to be .. math:: \boxplus(x, \Delta x) = \left[ \cos(|\Delta x|), \frac{\sin\left(|\Delta x|\right)}{|\Delta x|} \Delta x \right] * x :label: quaternion The multiplication between the two 4-vectors on the right hand side is the standard quaternion product. :class:`QuaternionParameterization` is an implementation of :eq:`quaternion`. .. class:: EigenQuaternionParameterization Eigen uses a different internal memory layout for the elements of the quaternion than what is commonly used. Specifically, Eigen stores the elements in memory as [x, y, z, w] where the real part is last whereas it is typically stored first. Note, when creating an Eigen quaternion through the constructor the elements are accepted in w, x, y, z order. Since Ceres operates on parameter blocks which are raw double pointers this difference is important and requires a different parameterization. :class:`EigenQuaternionParameterization` uses the same update as :class:`QuaternionParameterization` but takes into account Eigen's internal memory element ordering. .. class:: HomogeneousVectorParameterization In computer vision, homogeneous vectors are commonly used to represent entities in projective geometry such as points in projective space. One example where it is useful to use this over-parameterization is in representing points whose triangulation is ill-conditioned. Here it is advantageous to use homogeneous vectors, instead of an Euclidean vector, because it can represent points at infinity. When using homogeneous vectors it is useful to only make updates orthogonal to that :math:`n`-vector defining the homogeneous vector [HartleyZisserman]_. One way to do this is to let :math:`\Delta x` be a :math:`n-1` dimensional vector and define :math:`\boxplus` to be .. math:: \boxplus(x, \Delta x) = \left[ \frac{\sin\left(0.5 |\Delta x|\right)}{|\Delta x|} \Delta x, \cos(0.5 |\Delta x|) \right] * x The multiplication between the two vectors on the right hand side is defined as an operator which applies the update orthogonal to :math:`x` to remain on the sphere. Note, it is assumed that last element of :math:`x` is the scalar component of the homogeneous vector. .. class:: ProductParameterization Consider an optimization problem over the space of rigid transformations :math:`SE(3)`, which is the Cartesian product of :math:`SO(3)` and :math:`\mathbb{R}^3`. Suppose you are using Quaternions to represent the rotation, Ceres ships with a local parameterization for that and :math:`\mathbb{R}^3` requires no, or :class:`IdentityParameterization` parameterization. So how do we construct a local parameterization for a parameter block a rigid transformation? In cases, where a parameter block is the Cartesian product of a number of manifolds and you have the local parameterization of the individual manifolds available, :class:`ProductParameterization` can be used to construct a local parameterization of the cartesian product. For the case of the rigid transformation, where say you have a parameter block of size 7, where the first four entries represent the rotation as a quaternion, a local parameterization can be constructed as .. code-block:: c++ ProductParameterization se3_param(new QuaternionParameterization(), new IdentityTransformation(3)); :class:`AutoDiffLocalParameterization` ====================================== .. class:: AutoDiffLocalParameterization :class:`AutoDiffLocalParameterization` does for :class:`LocalParameterization` what :class:`AutoDiffCostFunction` does for :class:`CostFunction`. It allows the user to define a templated functor that implements the :func:`LocalParameterization::Plus` operation and it uses automatic differentiation to implement the computation of the Jacobian. To get an auto differentiated local parameterization, you must define a class with a templated operator() (a functor) that computes .. math:: x' = \boxplus(x, \Delta x), For example, Quaternions have a three dimensional local parameterization. Its plus operation can be implemented as (taken from `internal/ceres/autodiff_local_parameterization_test.cc `_ ) .. code-block:: c++ struct QuaternionPlus { template bool operator()(const T* x, const T* delta, T* x_plus_delta) const { const T squared_norm_delta = delta[0] * delta[0] + delta[1] * delta[1] + delta[2] * delta[2]; T q_delta[4]; if (squared_norm_delta > 0.0) { T norm_delta = sqrt(squared_norm_delta); const T sin_delta_by_delta = sin(norm_delta) / norm_delta; q_delta[0] = cos(norm_delta); q_delta[1] = sin_delta_by_delta * delta[0]; q_delta[2] = sin_delta_by_delta * delta[1]; q_delta[3] = sin_delta_by_delta * delta[2]; } else { // We do not just use q_delta = [1,0,0,0] here because that is a // constant and when used for automatic differentiation will // lead to a zero derivative. Instead we take a first order // approximation and evaluate it at zero. q_delta[0] = T(1.0); q_delta[1] = delta[0]; q_delta[2] = delta[1]; q_delta[3] = delta[2]; } Quaternionproduct(q_delta, x, x_plus_delta); return true; } }; Given this struct, the auto differentiated local parameterization can now be constructed as .. code-block:: c++ LocalParameterization* local_parameterization = new AutoDiffLocalParameterization; | | Global Size ---------------+ | Local Size -------------------+ :class:`Problem` ================ .. class:: Problem :class:`Problem` holds the robustified bounds constrained non-linear least squares problem :eq:`ceresproblem`. To create a least squares problem, use the :func:`Problem::AddResidualBlock` and :func:`Problem::AddParameterBlock` methods. For example a problem containing 3 parameter blocks of sizes 3, 4 and 5 respectively and two residual blocks of size 2 and 6: .. code-block:: c++ double x1[] = { 1.0, 2.0, 3.0 }; double x2[] = { 1.0, 2.0, 3.0, 5.0 }; double x3[] = { 1.0, 2.0, 3.0, 6.0, 7.0 }; Problem problem; problem.AddResidualBlock(new MyUnaryCostFunction(...), x1); problem.AddResidualBlock(new MyBinaryCostFunction(...), x2, x3); :func:`Problem::AddResidualBlock` as the name implies, adds a residual block to the problem. It adds a :class:`CostFunction`, an optional :class:`LossFunction` and connects the :class:`CostFunction` to a set of parameter block. The cost function carries with it information about the sizes of the parameter blocks it expects. The function checks that these match the sizes of the parameter blocks listed in ``parameter_blocks``. The program aborts if a mismatch is detected. ``loss_function`` can be ``NULL``, in which case the cost of the term is just the squared norm of the residuals. The user has the option of explicitly adding the parameter blocks using :func:`Problem::AddParameterBlock`. This causes additional correctness checking; however, :func:`Problem::AddResidualBlock` implicitly adds the parameter blocks if they are not present, so calling :func:`Problem::AddParameterBlock` explicitly is not required. :func:`Problem::AddParameterBlock` explicitly adds a parameter block to the :class:`Problem`. Optionally it allows the user to associate a :class:`LocalParameterization` object with the parameter block too. Repeated calls with the same arguments are ignored. Repeated calls with the same double pointer but a different size results in undefined behavior. You can set any parameter block to be constant using :func:`Problem::SetParameterBlockConstant` and undo this using :func:`SetParameterBlockVariable`. In fact you can set any number of parameter blocks to be constant, and Ceres is smart enough to figure out what part of the problem you have constructed depends on the parameter blocks that are free to change and only spends time solving it. So for example if you constructed a problem with a million parameter blocks and 2 million residual blocks, but then set all but one parameter blocks to be constant and say only 10 residual blocks depend on this one non-constant parameter block. Then the computational effort Ceres spends in solving this problem will be the same if you had defined a problem with one parameter block and 10 residual blocks. **Ownership** :class:`Problem` by default takes ownership of the ``cost_function``, ``loss_function`` and ``local_parameterization`` pointers. These objects remain live for the life of the :class:`Problem`. If the user wishes to keep control over the destruction of these objects, then they can do this by setting the corresponding enums in the :class:`Problem::Options` struct. Note that even though the Problem takes ownership of ``cost_function`` and ``loss_function``, it does not preclude the user from re-using them in another residual block. The destructor takes care to call delete on each ``cost_function`` or ``loss_function`` pointer only once, regardless of how many residual blocks refer to them. .. function:: ResidualBlockId Problem::AddResidualBlock(CostFunction* cost_function, LossFunction* loss_function, const vector parameter_blocks) Add a residual block to the overall cost function. The cost function carries with it information about the sizes of the parameter blocks it expects. The function checks that these match the sizes of the parameter blocks listed in parameter_blocks. The program aborts if a mismatch is detected. loss_function can be NULL, in which case the cost of the term is just the squared norm of the residuals. The user has the option of explicitly adding the parameter blocks using AddParameterBlock. This causes additional correctness checking; however, AddResidualBlock implicitly adds the parameter blocks if they are not present, so calling AddParameterBlock explicitly is not required. The Problem object by default takes ownership of the cost_function and loss_function pointers. These objects remain live for the life of the Problem object. If the user wishes to keep control over the destruction of these objects, then they can do this by setting the corresponding enums in the Options struct. Note: Even though the Problem takes ownership of cost_function and loss_function, it does not preclude the user from re-using them in another residual block. The destructor takes care to call delete on each cost_function or loss_function pointer only once, regardless of how many residual blocks refer to them. Example usage: .. code-block:: c++ double x1[] = {1.0, 2.0, 3.0}; double x2[] = {1.0, 2.0, 5.0, 6.0}; double x3[] = {3.0, 6.0, 2.0, 5.0, 1.0}; Problem problem; problem.AddResidualBlock(new MyUnaryCostFunction(...), NULL, x1); problem.AddResidualBlock(new MyBinaryCostFunction(...), NULL, x2, x1); .. function:: void Problem::AddParameterBlock(double* values, int size, LocalParameterization* local_parameterization) Add a parameter block with appropriate size to the problem. Repeated calls with the same arguments are ignored. Repeated calls with the same double pointer but a different size results in undefined behavior. .. function:: void Problem::AddParameterBlock(double* values, int size) Add a parameter block with appropriate size and parameterization to the problem. Repeated calls with the same arguments are ignored. Repeated calls with the same double pointer but a different size results in undefined behavior. .. function:: void Problem::RemoveResidualBlock(ResidualBlockId residual_block) Remove a residual block from the problem. Any parameters that the residual block depends on are not removed. The cost and loss functions for the residual block will not get deleted immediately; won't happen until the problem itself is deleted. If Problem::Options::enable_fast_removal is true, then the removal is fast (almost constant time). Otherwise, removing a residual block will incur a scan of the entire Problem object to verify that the residual_block represents a valid residual in the problem. **WARNING:** Removing a residual or parameter block will destroy the implicit ordering, rendering the jacobian or residuals returned from the solver uninterpretable. If you depend on the evaluated jacobian, do not use remove! This may change in a future release. Hold the indicated parameter block constant during optimization. .. function:: void Problem::RemoveParameterBlock(double* values) Remove a parameter block from the problem. The parameterization of the parameter block, if it exists, will persist until the deletion of the problem (similar to cost/loss functions in residual block removal). Any residual blocks that depend on the parameter are also removed, as described above in RemoveResidualBlock(). If Problem::Options::enable_fast_removal is true, then the removal is fast (almost constant time). Otherwise, removing a parameter block will incur a scan of the entire Problem object. **WARNING:** Removing a residual or parameter block will destroy the implicit ordering, rendering the jacobian or residuals returned from the solver uninterpretable. If you depend on the evaluated jacobian, do not use remove! This may change in a future release. .. function:: void Problem::SetParameterBlockConstant(double* values) Hold the indicated parameter block constant during optimization. .. function:: void Problem::SetParameterBlockVariable(double* values) Allow the indicated parameter to vary during optimization. .. function:: void Problem::SetParameterization(double* values, LocalParameterization* local_parameterization) Set the local parameterization for one of the parameter blocks. The local_parameterization is owned by the Problem by default. It is acceptable to set the same parameterization for multiple parameters; the destructor is careful to delete local parameterizations only once. The local parameterization can only be set once per parameter, and cannot be changed once set. .. function:: LocalParameterization* Problem::GetParameterization(double* values) const Get the local parameterization object associated with this parameter block. If there is no parameterization object associated then `NULL` is returned .. function:: void Problem::SetParameterLowerBound(double* values, int index, double lower_bound) Set the lower bound for the parameter at position `index` in the parameter block corresponding to `values`. By default the lower bound is :math:`-\infty`. .. function:: void Problem::SetParameterUpperBound(double* values, int index, double upper_bound) Set the upper bound for the parameter at position `index` in the parameter block corresponding to `values`. By default the value is :math:`\infty`. .. function:: int Problem::NumParameterBlocks() const Number of parameter blocks in the problem. Always equals parameter_blocks().size() and parameter_block_sizes().size(). .. function:: int Problem::NumParameters() const The size of the parameter vector obtained by summing over the sizes of all the parameter blocks. .. function:: int Problem::NumResidualBlocks() const Number of residual blocks in the problem. Always equals residual_blocks().size(). .. function:: int Problem::NumResiduals() const The size of the residual vector obtained by summing over the sizes of all of the residual blocks. .. function:: int Problem::ParameterBlockSize(const double* values) const The size of the parameter block. .. function:: int Problem::ParameterBlockLocalSize(const double* values) const The size of local parameterization for the parameter block. If there is no local parameterization associated with this parameter block, then ``ParameterBlockLocalSize`` = ``ParameterBlockSize``. .. function:: bool Problem::HasParameterBlock(const double* values) const Is the given parameter block present in the problem or not? .. function:: void Problem::GetParameterBlocks(vector* parameter_blocks) const Fills the passed ``parameter_blocks`` vector with pointers to the parameter blocks currently in the problem. After this call, ``parameter_block.size() == NumParameterBlocks``. .. function:: void Problem::GetResidualBlocks(vector* residual_blocks) const Fills the passed `residual_blocks` vector with pointers to the residual blocks currently in the problem. After this call, `residual_blocks.size() == NumResidualBlocks`. .. function:: void Problem::GetParameterBlocksForResidualBlock(const ResidualBlockId residual_block, vector* parameter_blocks) const Get all the parameter blocks that depend on the given residual block. .. function:: void Problem::GetResidualBlocksForParameterBlock(const double* values, vector* residual_blocks) const Get all the residual blocks that depend on the given parameter block. If `Problem::Options::enable_fast_removal` is `true`, then getting the residual blocks is fast and depends only on the number of residual blocks. Otherwise, getting the residual blocks for a parameter block will incur a scan of the entire :class:`Problem` object. .. function:: const CostFunction* GetCostFunctionForResidualBlock(const ResidualBlockId residual_block) const Get the :class:`CostFunction` for the given residual block. .. function:: const LossFunction* GetLossFunctionForResidualBlock(const ResidualBlockId residual_block) const Get the :class:`LossFunction` for the given residual block. .. function:: bool Problem::Evaluate(const Problem::EvaluateOptions& options, double* cost, vector* residuals, vector* gradient, CRSMatrix* jacobian) Evaluate a :class:`Problem`. Any of the output pointers can be `NULL`. Which residual blocks and parameter blocks are used is controlled by the :class:`Problem::EvaluateOptions` struct below. .. NOTE:: The evaluation will use the values stored in the memory locations pointed to by the parameter block pointers used at the time of the construction of the problem, for example in the following code: .. code-block:: c++ Problem problem; double x = 1; problem.Add(new MyCostFunction, NULL, &x); double cost = 0.0; problem.Evaluate(Problem::EvaluateOptions(), &cost, NULL, NULL, NULL); The cost is evaluated at `x = 1`. If you wish to evaluate the problem at `x = 2`, then .. code-block:: c++ x = 2; problem.Evaluate(Problem::EvaluateOptions(), &cost, NULL, NULL, NULL); is the way to do so. .. NOTE:: If no local parameterizations are used, then the size of the gradient vector is the sum of the sizes of all the parameter blocks. If a parameter block has a local parameterization, then it contributes "LocalSize" entries to the gradient vector. .. NOTE:: This function cannot be called while the problem is being solved, for example it cannot be called from an :class:`IterationCallback` at the end of an iteration during a solve. .. class:: Problem::EvaluateOptions Options struct that is used to control :func:`Problem::Evaluate`. .. member:: vector Problem::EvaluateOptions::parameter_blocks The set of parameter blocks for which evaluation should be performed. This vector determines the order in which parameter blocks occur in the gradient vector and in the columns of the jacobian matrix. If parameter_blocks is empty, then it is assumed to be equal to a vector containing ALL the parameter blocks. Generally speaking the ordering of the parameter blocks in this case depends on the order in which they were added to the problem and whether or not the user removed any parameter blocks. **NOTE** This vector should contain the same pointers as the ones used to add parameter blocks to the Problem. These parameter block should NOT point to new memory locations. Bad things will happen if you do. .. member:: vector Problem::EvaluateOptions::residual_blocks The set of residual blocks for which evaluation should be performed. This vector determines the order in which the residuals occur, and how the rows of the jacobian are ordered. If residual_blocks is empty, then it is assumed to be equal to the vector containing all the parameter blocks. .. member:: bool Problem::EvaluateOptions::apply_loss_function Even though the residual blocks in the problem may contain loss functions, setting apply_loss_function to false will turn off the application of the loss function to the output of the cost function. This is of use for example if the user wishes to analyse the solution quality by studying the distribution of residuals before and after the solve. .. member:: int Problem::EvaluateOptions::num_threads Number of threads to use. (Requires OpenMP). ``rotation.h`` ============== Many applications of Ceres Solver involve optimization problems where some of the variables correspond to rotations. To ease the pain of work with the various representations of rotations (angle-axis, quaternion and matrix) we provide a handy set of templated functions. These functions are templated so that the user can use them within Ceres Solver's automatic differentiation framework. .. function:: template void AngleAxisToQuaternion(T const* angle_axis, T* quaternion) Convert a value in combined axis-angle representation to a quaternion. The value ``angle_axis`` is a triple whose norm is an angle in radians, and whose direction is aligned with the axis of rotation, and ``quaternion`` is a 4-tuple that will contain the resulting quaternion. .. function:: template void QuaternionToAngleAxis(T const* quaternion, T* angle_axis) Convert a quaternion to the equivalent combined axis-angle representation. The value ``quaternion`` must be a unit quaternion - it is not normalized first, and ``angle_axis`` will be filled with a value whose norm is the angle of rotation in radians, and whose direction is the axis of rotation. .. function:: template void RotationMatrixToAngleAxis(const MatrixAdapter& R, T * angle_axis) .. function:: template void AngleAxisToRotationMatrix(T const * angle_axis, const MatrixAdapter& R) .. function:: template void RotationMatrixToAngleAxis(T const * R, T * angle_axis) .. function:: template void AngleAxisToRotationMatrix(T const * angle_axis, T * R) Conversions between 3x3 rotation matrix with given column and row strides and axis-angle rotation representations. The functions that take a pointer to T instead of a MatrixAdapter assume a column major representation with unit row stride and a column stride of 3. .. function:: template void EulerAnglesToRotationMatrix(const T* euler, const MatrixAdapter& R) .. function:: template void EulerAnglesToRotationMatrix(const T* euler, int row_stride, T* R) Conversions between 3x3 rotation matrix with given column and row strides and Euler angle (in degrees) rotation representations. The {pitch,roll,yaw} Euler angles are rotations around the {x,y,z} axes, respectively. They are applied in that same order, so the total rotation R is Rz * Ry * Rx. The function that takes a pointer to T as the rotation matrix assumes a row major representation with unit column stride and a row stride of 3. The additional parameter row_stride is required to be 3. .. function:: template void QuaternionToScaledRotation(const T q[4], const MatrixAdapter& R) .. function:: template void QuaternionToScaledRotation(const T q[4], T R[3 * 3]) Convert a 4-vector to a 3x3 scaled rotation matrix. The choice of rotation is such that the quaternion :math:`\begin{bmatrix} 1 &0 &0 &0\end{bmatrix}` goes to an identity matrix and for small :math:`a, b, c` the quaternion :math:`\begin{bmatrix}1 &a &b &c\end{bmatrix}` goes to the matrix .. math:: I + 2 \begin{bmatrix} 0 & -c & b \\ c & 0 & -a\\ -b & a & 0 \end{bmatrix} + O(q^2) which corresponds to a Rodrigues approximation, the last matrix being the cross-product matrix of :math:`\begin{bmatrix} a& b& c\end{bmatrix}`. Together with the property that :math:`R(q1 * q2) = R(q1) * R(q2)` this uniquely defines the mapping from :math:`q` to :math:`R`. In the function that accepts a pointer to T instead of a MatrixAdapter, the rotation matrix ``R`` is a row-major matrix with unit column stride and a row stride of 3. No normalization of the quaternion is performed, i.e. :math:`R = \|q\|^2 Q`, where :math:`Q` is an orthonormal matrix such that :math:`\det(Q) = 1` and :math:`Q*Q' = I`. .. function:: template void QuaternionToRotation(const T q[4], const MatrixAdapter& R) .. function:: template void QuaternionToRotation(const T q[4], T R[3 * 3]) Same as above except that the rotation matrix is normalized by the Frobenius norm, so that :math:`R R' = I` (and :math:`\det(R) = 1`). .. function:: template void UnitQuaternionRotatePoint(const T q[4], const T pt[3], T result[3]) Rotates a point pt by a quaternion q: .. math:: \text{result} = R(q) \text{pt} Assumes the quaternion is unit norm. If you pass in a quaternion with :math:`|q|^2 = 2` then you WILL NOT get back 2 times the result you get for a unit quaternion. .. function:: template void QuaternionRotatePoint(const T q[4], const T pt[3], T result[3]) With this function you do not need to assume that :math:`q` has unit norm. It does assume that the norm is non-zero. .. function:: template void QuaternionProduct(const T z[4], const T w[4], T zw[4]) .. math:: zw = z * w where :math:`*` is the Quaternion product between 4-vectors. .. function:: template void CrossProduct(const T x[3], const T y[3], T x_cross_y[3]) .. math:: \text{x_cross_y} = x \times y .. function:: template void AngleAxisRotatePoint(const T angle_axis[3], const T pt[3], T result[3]) .. math:: y = R(\text{angle_axis}) x Cubic Interpolation =================== Optimization problems often involve functions that are given in the form of a table of values, for example an image. Evaluating these functions and their derivatives requires interpolating these values. Interpolating tabulated functions is a vast area of research and there are a lot of libraries which implement a variety of interpolation schemes. However, using them within the automatic differentiation framework in Ceres is quite painful. To this end, Ceres provides the ability to interpolate one dimensional and two dimensional tabular functions. The one dimensional interpolation is based on the Cubic Hermite Spline, also known as the Catmull-Rom Spline. This produces a first order differentiable interpolating function. The two dimensional interpolation scheme is a generalization of the one dimensional scheme where the interpolating function is assumed to be separable in the two dimensions, More details of the construction can be found `Linear Methods for Image Interpolation `_ by Pascal Getreuer. .. class:: CubicInterpolator Given as input an infinite one dimensional grid, which provides the following interface. .. code:: struct Grid1D { enum { DATA_DIMENSION = 2; }; void GetValue(int n, double* f) const; }; Where, ``GetValue`` gives us the value of a function :math:`f` (possibly vector valued) for any integer :math:`n` and the enum ``DATA_DIMENSION`` indicates the dimensionality of the function being interpolated. For example if you are interpolating rotations in axis-angle format over time, then ``DATA_DIMENSION = 3``. :class:`CubicInterpolator` uses Cubic Hermite splines to produce a smooth approximation to it that can be used to evaluate the :math:`f(x)` and :math:`f'(x)` at any point on the real number line. For example, the following code interpolates an array of four numbers. .. code:: const double data[] = {1.0, 2.0, 5.0, 6.0}; Grid1D array(x, 0, 4); CubicInterpolator interpolator(array); double f, dfdx; interpolator.Evaluate(1.5, &f, &dfdx); In the above code we use ``Grid1D`` a templated helper class that allows easy interfacing between ``C++`` arrays and :class:`CubicInterpolator`. ``Grid1D`` supports vector valued functions where the various coordinates of the function can be interleaved or stacked. It also allows the use of any numeric type as input, as long as it can be safely cast to a double. .. class:: BiCubicInterpolator Given as input an infinite two dimensional grid, which provides the following interface: .. code:: struct Grid2D { enum { DATA_DIMENSION = 2 }; void GetValue(int row, int col, double* f) const; }; Where, ``GetValue`` gives us the value of a function :math:`f` (possibly vector valued) for any pair of integers :code:`row` and :code:`col` and the enum ``DATA_DIMENSION`` indicates the dimensionality of the function being interpolated. For example if you are interpolating a color image with three channels (Red, Green & Blue), then ``DATA_DIMENSION = 3``. :class:`BiCubicInterpolator` uses the cubic convolution interpolation algorithm of R. Keys [Keys]_, to produce a smooth approximation to it that can be used to evaluate the :math:`f(r,c)`, :math:`\frac{\partial f(r,c)}{\partial r}` and :math:`\frac{\partial f(r,c)}{\partial c}` at any any point in the real plane. For example the following code interpolates a two dimensional array. .. code:: const double data[] = {1.0, 3.0, -1.0, 4.0, 3.6, 2.1, 4.2, 2.0, 2.0, 1.0, 3.1, 5.2}; Grid2D array(data, 0, 3, 0, 4); BiCubicInterpolator interpolator(array); double f, dfdr, dfdc; interpolator.Evaluate(1.2, 2.5, &f, &dfdr, &dfdc); In the above code, the templated helper class ``Grid2D`` is used to make a ``C++`` array look like a two dimensional table to :class:`BiCubicInterpolator`. ``Grid2D`` supports row or column major layouts. It also supports vector valued functions where the individual coordinates of the function may be interleaved or stacked. It also allows the use of any numeric type as input, as long as it can be safely cast to double. ceres-solver-1.13.0/docs/source/modeling_faqs.rst0000644000232200023220000001305713140546177022363 0ustar debalancedebalance.. _chapter-modeling_faqs: .. default-domain:: cpp .. cpp:namespace:: ceres ======== Modeling ======== #. Use analytical/automatic derivatives. This is the single most important piece of advice we can give to you. It is tempting to take the easy way out and use numeric differentiation. This is a bad idea. Numeric differentiation is slow, ill-behaved, hard to get right, and results in poor convergence behaviour. Ceres allows the user to define templated functors which will be automatically differentiated. For most situations this is enough and we recommend using this facility. In some cases the derivatives are simple enough or the performance considerations are such that the overhead of automatic differentiation is too much. In such cases, analytic derivatives are recommended. The use of numerical derivatives should be a measure of last resort, where it is simply not possible to write a templated implementation of the cost function. In many cases it is not possible to do analytic or automatic differentiation of the entire cost function, but it is generally the case that it is possible to decompose the cost function into parts that need to be numerically differentiated and parts that can be automatically or analytically differentiated. To this end, Ceres has extensive support for mixing analytic, automatic and numeric differentiation. See :class:`CostFunctionToFunctor`. #. When using Quaternions, consider using :class:`QuaternionParameterization`. `Quaternions `_ are a four dimensional parameterization of the space of three dimensional rotations :math:`SO(3)`. However, the :math:`SO(3)` is a three dimensional set, and so is the tangent space of a Quaternion. Therefore, it is sometimes (not always) benefecial to associate a local parameterization with parameter blocks representing a Quaternion. Assuming that the order of entries in your parameter block is :math:`w,x,y,z`, you can use :class:`QuaternionParameterization`. .. NOTE:: If you are using `Eigen's Quaternion `_ object, whose layout is :math:`x,y,z,w`, then you should use :class:`EigenQuaternionParameterization`. #. How do I solve problems with general linear & non-linear **inequality** constraints with Ceres Solver? Currently, Ceres Solver only supports upper and lower bounds constraints on the parameter blocks. A crude way of dealing with inequality constraints is have one or more of your cost functions check if the inequalities you are interested in are satisfied, and if not return false instead of true. This will prevent the solver from ever stepping into an infeasible region. This requires that the starting point for the optimization be a feasible point. You also risk pre-mature convergence using this method. #. How do I solve problems with general linear & non-linear **equality** constraints with Ceres Solver? There is no built in support in ceres for solving problems with equality constraints. Currently, Ceres Solver only supports upper and lower bounds constraints on the parameter blocks. The trick described above for dealing with inequality constraints will **not** work for equality constraints. #. How do I set one or more components of a parameter block constant? Using :class:`SubsetParameterization`. #. Putting `Inverse Function Theorem `_ to use. Every now and then we have to deal with functions which cannot be evaluated analytically. Computing the Jacobian in such cases is tricky. A particularly interesting case is where the inverse of the function is easy to compute analytically. An example of such a function is the Coordinate transformation between the `ECEF `_ and the `WGS84 `_ where the conversion from WGS84 to ECEF is analytic, but the conversion back to WGS84 uses an iterative algorithm. So how do you compute the derivative of the ECEF to WGS84 transformation? One obvious approach would be to numerically differentiate the conversion function. This is not a good idea. For one, it will be slow, but it will also be numerically quite bad. Turns out you can use the `Inverse Function Theorem `_ in this case to compute the derivatives more or less analytically. The key result here is. If :math:`x = f^{-1}(y)`, and :math:`Df(x)` is the invertible Jacobian of :math:`f` at :math:`x`. Then the Jacobian :math:`Df^{-1}(y) = [Df(x)]^{-1}`, i.e., the Jacobian of the :math:`f^{-1}` is the inverse of the Jacobian of :math:`f`. Algorithmically this means that given :math:`y`, compute :math:`x = f^{-1}(y)` by whatever means you can. Evaluate the Jacobian of :math:`f` at :math:`x`. If the Jacobian matrix is invertible, then its inverse is the Jacobian of :math:`f^{-1}(y)` at :math:`y`. One can put this into practice with the following code fragment. .. code-block:: c++ Eigen::Vector3d ecef; // Fill some values // Iterative computation. Eigen::Vector3d lla = ECEFToLLA(ecef); // Analytic derivatives Eigen::Matrix3d lla_to_ecef_jacobian = LLAToECEFJacobian(lla); bool invertible; Eigen::Matrix3d ecef_to_lla_jacobian; lla_to_ecef_jacobian.computeInverseWithCheck(ecef_to_lla_jacobian, invertible); ceres-solver-1.13.0/docs/source/contributing.rst0000644000232200023220000001157013140546177022260 0ustar debalancedebalance.. _chapter-contributing: ============ Contributing ============ We welcome contributions to Ceres, whether they are new features, bug fixes or tests. The Ceres `mailing `_ list is the best place for all development related discussions. Please consider joining it. If you have ideas on how you would like to contribute to Ceres, it is a good idea to let us know on the mailing list before you start development. We may have suggestions that will save effort when trying to merge your work into the main branch. If you are looking for ideas, please let us know about your interest and skills and we will be happy to make a suggestion or three. We follow Google's `C++ Style Guide `_ and use `git `_ for version control. We use the `Gerrit `_ to collaborate and review changes to Ceres. Gerrit enables pre-commit reviews so that Ceres can maintain a linear history with clean, reviewed commits, and no merges. We now describe how to set up your development environment and submit a change list for review via Gerrit. Setting up your Environment =========================== 1. Download and configure ``git``. * Mac ``brew install git``. * Linux ``sudo apt-get install git``. * Windows. Download `msysgit `_, which includes a minimal `Cygwin `_ install. 2. Sign up for `Gerrit `_. You will also need to sign the Contributor License Agreement (CLA) with Google, which gives Google a royalty-free unlimited license to use your contributions. You retain copyright. 3. Clone the Ceres Solver ``git`` repository from Gerrit. .. code-block:: bash git clone https://ceres-solver.googlesource.com/ceres-solver 4. Build Ceres, following the instructions in :ref:`chapter-installation`. On Mac and Linux, the ``CMake`` build will download and enable the Gerrit pre-commit hook automatically. This pre-submit hook creates `Change-Id: ...` lines in your commits. If this does not work OR you are on Windows, execute the following in the root directory of the local ``git`` repository: .. code-block:: bash curl -o .git/hooks/commit-msg https://ceres-solver-review.googlesource.com/tools/hooks/commit-msg chmod +x .git/hooks/commit-msg 5. Configure your Gerrit password with a ``.gitcookies`` which allows pushing to Gerrit without having to enter a very long random password every time: * Sign into `http://ceres-solver-review.googlesource.com `_. * Click ``Settings -> HTTP Password -> Obtain Password``. * (maybe) Select an account for multi-login. This should be the same as your Gerrit login. * Click ``Allow access`` when the page requests access to your ``git`` repositories. * Follow the instructions from Gerrit to create a ``.gitcookies`` file on your system, either in ``$HOME/.gitcookies`` (Mac and Linux) or ``%USERPROFILE%\.gitcookies`` (Windows). Note that for Windows, please get a recent `Git for Windows `_ install to enable automatic lookup in the ``%USERPROFILE%\.gitcookies``. Submitting a change =================== 1. Make your changes against master or whatever branch you like. Commit your changes as one patch. When you commit, the Gerrit hook will add a `Change-Id:` line as the last line of the commit. Make sure that your commit message is formatted in the `50/72 style `_. 2. Push your changes to the Ceres Gerrit instance: .. code-block:: bash git push origin HEAD:refs/for/master When the push succeeds, the console will display a URL showing the address of the review. Go to the URL and add at least one of the maintainers (Sameer Agarwal, Keir Mierle, Alex Stewart or William Rucklidge) as reviewers. 3. Wait for a review. 4. Once review comments come in, address them. Please reply to each comment in Gerrit, which makes the re-review process easier. After modifying the code in your ``git`` instance, *don't make a new commit*. Instead, update the last commit using a command like the following: .. code-block:: bash git commit --amend -a This will update the last commit, so that it has both the original patch and your updates as a single commit. You will have a chance to edit the commit message as well. Push the new commit to Gerrit as before. Gerrit will use the ``Change-Id:`` to match the previous commit with the new one. The review interface retains your original patch, but also shows the new patch. Publish your responses to the comments, and wait for a new round of reviews. ceres-solver-1.13.0/docs/source/license.rst0000644000232200023220000000306413140546177021172 0ustar debalancedebalance======= License ======= Ceres Solver is licensed under the New BSD license, whose terms are as follows. Copyright 2016 Google Inc. 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. 3. Neither the name of Google Inc., nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 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 Google Inc. 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. ceres-solver-1.13.0/docs/source/interfacing_with_autodiff.rst0000644000232200023220000002401113140546177024750 0ustar debalancedebalance.. default-domain:: cpp .. cpp:namespace:: ceres .. _chapter-interfacing_with_automatic_differentiation: Interfacing with Automatic Differentiation ========================================== Automatic differentiation is straightforward to use in cases where an explicit expression for the cost function is available. But this is not always possible. Often one has to interface with external routines or data. In this chapter we will consider a number of different ways of doing so. To do this, we will consider the problem of finding parameters :math:`\theta` and :math:`t` that solve an optimization problem of the form: .. math:: \min & \quad \sum_i \left \|y_i - f\left (\|q_{i}\|^2\right) q_i \right \|^2\\ \text{such that} & \quad q_i = R(\theta) x_i + t Here, :math:`R` is a two dimensional rotation matrix parameterized using the angle :math:`\theta` and :math:`t` is a two dimensional vector. :math:`f` is an external distortion function. We begin by considering the case, where we have a templated function :code:`TemplatedComputeDistortion` that can compute the function :math:`f`. Then the implementation of the corresponding residual functor is straightforward and will look as follows: .. code-block:: c++ :emphasize-lines: 21 template T TemplatedComputeDistortion(const T r2) { const double k1 = 0.0082; const double k2 = 0.000023; return 1.0 + k1 * y2 + k2 * r2 * r2; } struct Affine2DWithDistortion { Affine2DWithDistortion(const double x_in[2], const double y_in[2]) { x[0] = x_in[0]; x[1] = x_in[1]; y[0] = y_in[0]; y[1] = y_in[1]; } template bool operator()(const T* theta, const T* t, T* residuals) const { const T q_0 = cos(theta[0]) * x[0] - sin(theta[0]) * x[1] + t[0]; const T q_1 = sin(theta[0]) * x[0] + cos(theta[0]) * x[1] + t[1]; const T f = TemplatedComputeDistortion(q_0 * q_0 + q_1 * q_1); residuals[0] = y[0] - f * q_0; residuals[1] = y[1] - f * q_1; return true; } double x[2]; double y[2]; }; So far so good, but let us now consider three ways of defining :math:`f` which are not directly amenable to being used with automatic differentiation: #. A non-templated function that evaluates its value. #. A function that evaluates its value and derivative. #. A function that is defined as a table of values to be interpolated. We will consider them in turn below. A function that returns its value ---------------------------------- Suppose we were given a function :code:`ComputeDistortionValue` with the following signature .. code-block:: c++ double ComputeDistortionValue(double r2); that computes the value of :math:`f`. The actual implementation of the function does not matter. Interfacing this function with :code:`Affine2DWithDistortion` is a three step process: 1. Wrap :code:`ComputeDistortionValue` into a functor :code:`ComputeDistortionValueFunctor`. 2. Numerically differentiate :code:`ComputeDistortionValueFunctor` using :class:`NumericDiffCostFunction` to create a :class:`CostFunction`. 3. Wrap the resulting :class:`CostFunction` object using :class:`CostFunctionToFunctor`. The resulting object is a functor with a templated :code:`operator()` method, which pipes the Jacobian computed by :class:`NumericDiffCostFunction` into the approproate :code:`Jet` objects. An implementation of the above three steps looks as follows: .. code-block:: c++ :emphasize-lines: 15,16,17,18,19,20, 29 struct ComputeDistortionValueFunctor { bool operator()(const double* r2, double* value) const { *value = ComputeDistortionValue(r2[0]); return true; } }; struct Affine2DWithDistortion { Affine2DWithDistortion(const double x_in[2], const double y_in[2]) { x[0] = x_in[0]; x[1] = x_in[1]; y[0] = y_in[0]; y[1] = y_in[1]; compute_distortion.reset(new ceres::CostFunctionToFunctor<1, 1>( new ceres::NumericDiffCostFunction( new ComputeDistortionValueFunctor))); } template bool operator()(const T* theta, const T* t, T* residuals) const { const T q_0 = cos(theta[0]) * x[0] - sin(theta[0]) * x[1] + t[0]; const T q_1 = sin(theta[0]) * x[0] + cos(theta[0]) * x[1] + t[1]; const T r2 = q_0 * q_0 + q_1 * q_1; T f; (*compute_distortion)(&r2, &f); residuals[0] = y[0] - f * q_0; residuals[1] = y[1] - f * q_1; return true; } double x[2]; double y[2]; std::unique_ptr > compute_distortion; }; A function that returns its value and derivative ------------------------------------------------ Now suppose we are given a function :code:`ComputeDistortionValue` thatis able to compute its value and optionally its Jacobian on demand and has the following signature: .. code-block:: c++ void ComputeDistortionValueAndJacobian(double r2, double* value, double* jacobian); Again, the actual implementation of the function does not matter. Interfacing this function with :code:`Affine2DWithDistortion` is a two step process: 1. Wrap :code:`ComputeDistortionValueAndJacobian` into a :class:`CostFunction` object which we call :code:`ComputeDistortionFunction`. 2. Wrap the resulting :class:`ComputeDistortionFunction` object using :class:`CostFunctionToFunctor`. The resulting object is a functor with a templated :code:`operator()` method, which pipes the Jacobian computed by :class:`NumericDiffCostFunction` into the approproate :code:`Jet` objects. The resulting code will look as follows: .. code-block:: c++ :emphasize-lines: 21,22, 33 class ComputeDistortionFunction : public ceres::SizedCostFunction<1, 1> { public: virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const { if (!jacobians) { ComputeDistortionValueAndJacobian(parameters[0][0], residuals, NULL); } else { ComputeDistortionValueAndJacobian(parameters[0][0], residuals, jacobians[0]); } return true; } }; struct Affine2DWithDistortion { Affine2DWithDistortion(const double x_in[2], const double y_in[2]) { x[0] = x_in[0]; x[1] = x_in[1]; y[0] = y_in[0]; y[1] = y_in[1]; compute_distortion.reset( new ceres::CostFunctionToFunctor<1, 1>(new ComputeDistortionFunction)); } template bool operator()(const T* theta, const T* t, T* residuals) const { const T q_0 = cos(theta[0]) * x[0] - sin(theta[0]) * x[1] + t[0]; const T q_1 = sin(theta[0]) * x[0] + cos(theta[0]) * x[1] + t[1]; const T r2 = q_0 * q_0 + q_1 * q_1; T f; (*compute_distortion)(&r2, &f); residuals[0] = y[0] - f * q_0; residuals[1] = y[1] - f * q_1; return true; } double x[2]; double y[2]; std::unique_ptr > compute_distortion; }; A function that is defined as a table of values ----------------------------------------------- The third and final case we will consider is where the function :math:`f` is defined as a table of values on the interval :math:`[0, 100)`, with a value for each integer. .. code-block:: c++ vector distortion_values; There are many ways of interpolating a table of values. Perhaps the simplest and most common method is linear interpolation. But it is not a great idea to use linear interpolation because the interpolating function is not differentiable at the sample points. A simple (well behaved) differentiable interpolation is the `Cubic Hermite Spline `_. Ceres Solver ships with routines to perform Cubic & Bi-Cubic interpolation that is automatic differentiation friendly. Using Cubic interpolation requires first constructing a :class:`Grid1D` object to wrap the table of values and then constructing a :class:`CubicInterpolator` object using it. The resulting code will look as follows: .. code-block:: c++ :emphasize-lines: 10,11,12,13, 24, 32,33 struct Affine2DWithDistortion { Affine2DWithDistortion(const double x_in[2], const double y_in[2], const std::vector& distortion_values) { x[0] = x_in[0]; x[1] = x_in[1]; y[0] = y_in[0]; y[1] = y_in[1]; grid.reset(new ceres::Grid1D( &distortion_values[0], 0, distortion_values.size())); compute_distortion.reset( new ceres::CubicInterpolator >(*grid)); } template bool operator()(const T* theta, const T* t, T* residuals) const { const T q_0 = cos(theta[0]) * x[0] - sin(theta[0]) * x[1] + t[0]; const T q_1 = sin(theta[0]) * x[0] + cos(theta[0]) * x[1] + t[1]; const T r2 = q_0 * q_0 + q_1 * q_1; T f; compute_distortion->Evaluate(r2, &f); residuals[0] = y[0] - f * q_0; residuals[1] = y[1] - f * q_1; return true; } double x[2]; double y[2]; std::unique_ptr > grid; std::unique_ptr > > compute_distortion; }; In the above example we used :class:`Grid1D` and :class:`CubicInterpolator` to interpolate a one dimensional table of values. :class:`Grid2D` combined with :class:`CubicInterpolator` lets the user to interpolate two dimensional tables of values. Note that neither :class:`Grid1D` or :class:`Grid2D` are limited to scalar valued functions, they also work with vector valued functions. ceres-solver-1.13.0/docs/source/derivatives.rst0000644000232200023220000000430713140546177022076 0ustar debalancedebalance.. default-domain:: cpp .. cpp:namespace:: ceres .. _chapter-on_derivatives: ============== On Derivatives ============== Ceres Solver, like all gradient based optimization algorithms, depends on being able to evaluate the objective function and its derivatives at arbitrary points in its domain. Indeed, defining the objective function and its `Jacobian `_ is the principal task that the user is required to perform when solving an optimization problem using Ceres Solver. The correct and efficient computation of the Jacobian is the key to good performance. Ceres Solver offers considerable flexibility in how the user can provide derivatives to the solver. She can use: #. :ref:`chapter-analytical_derivatives`: The user figures out the derivatives herself, by hand or using a tool like `Maple `_ or `Mathematica `_, and implements them in a :class:`CostFunction`. #. :ref:`chapter-numerical_derivatives`: Ceres numerically computes the derivative using finite differences. #. :ref:`chapter-automatic_derivatives`: Ceres automatically computes the analytic derivative using C++ templates and operator overloading. Which of these three approaches (alone or in combination) should be used depends on the situation and the tradeoffs the user is willing to make. Unfortunately, numerical optimization textbooks rarely discuss these issues in detail and the user is left to her own devices. The aim of this article is to fill this gap and describe each of these three approaches in the context of Ceres Solver with sufficient detail that the user can make an informed choice. For the impatient amongst you, here is some high level advice: #. Use :ref:`chapter-automatic_derivatives`. #. In some cases it maybe worth using :ref:`chapter-analytical_derivatives`. #. Avoid :ref:`chapter-numerical_derivatives`. Use it as a measure of last resort, mostly to interface with external libraries. For the rest, read on. .. toctree:: :maxdepth: 1 spivak_notation analytical_derivatives numerical_derivatives automatic_derivatives interfacing_with_autodiff ceres-solver-1.13.0/docs/source/manhattan_olson_3500_result.png0000644000232200023220000032474513140546177024772 0ustar debalancedebalancePNG  IHDR,d(sBIT|d pHYsaa?i IDATxy|T7ߙ%d2Y' }YT\(ފToVRkh{Kѫ((@dIB}dp&d&̜93Ir~l,2& """""  -""""" Z ,DDDDDX(h1Qb`!""""BDDDDDA -""""" Z ,DDDDDX(h1Qb`!""""BDDDDDA -""""" Z ,DDDDDX(h1Qb`!""""BDDDDDA -""""" Z ,DDDDDX(h1Qb`!""""BDDDDDA -""""" Z ,DDDDDX(h1Qb`!""""BDDDDDA -""""" Z ,DDDDDX(h1Qb`!""""BDDDDDA -""""" Z ,DDDDDX(h1_ɓa20f<hlltݟ뮻0͸뮻P__ @W`[z5~a<+PPP?8rlق:\qHIIo2<(..͛]}""""Ӊ'|˗/ǟg_8,^wC!..kv¼y~;~ӟoJKKqqQmh`}|߇!8}jǎs2O/~[noGzWbըllٲ+{-;''ӧOWѪE>Cp>'?@zz:^۷c{? CUU|A\{ Ts""""6mBkk+Μ9/>I~z,]_~%~g?d-܂5kDDDDDNy}7alݺujDDDDD4pa|߇!8}|߇$ɽ-B3f`EDDD4HNla!""""1,DDD4ht@3Q3L t5""" j02XhPRZV|M64(+سuo`0ѠDCQb`!""""BDDDDDA -"""!رcX|9233a49s;*W_Fs=S].Rh4[OF7دCBDDD4ȭY&M+,w}Xx1, V\|7m4Z g>˖-êU`0|z$I:,DDDDڵkb„ xwv;#e˖.þ}0~>˜2e LsnvK[XR\ضm[r ֭[V,[,$  K/jbŊHLL%K`ԩػw/rssxp=h4">>k ˳>V_|K/QQQHHH?@cX+h4kxW0i$!55oaXܞfgٳ t,_jh``!"""m#Ĝ9s0g}dž+cŸ[{nrlw^=܃ɓ'WBCCOWqz+x }X|9BCC/k1,DDDDT^^$I¸q<6++ hY騪 ĉ{|lss3VXH|<>}=tv؁ /C!33o}YaϞ=׿gx7\u8 |롡Æ^sz^2} t?v^ |gWXT׿?Q}ϟ +J̙>Bjj*^{5\|nj袋pATUU1 # ,DDD4TT/ =n$T-3::հX,00nG۷xܹVېhkk9vv;rss'N/>XhX1qj@UUu1@zz>JHu7?99ڢuY.,KxQZZ ìY0~x|7nBDDDÊ^W#P-Z7n3|$ Yw+׫/ /Ĉ#{/Ug #""".] ɄEEE=`޽>}:fΜ(ٳgO[[oذanWX#G[X"""A*99O?4`=z1|.]Pk>= 7܀XL: .ĤIֆ;v 77IIIذa&LscڵO3foF/V_[An6;dL&|wؽ{7,Xm۶"""Aq/"|MzYG%\qy$uY[n~,lذ7nĒ%KvZ"xOko1c7a6w߹Zs>S_ ~la!"""2223x||zz:Ng~]Ѐ믿_۱ׯ dQ(+.k2/ŋ=c9:BDDDDCjj*Nk׮^E]P""""Ռ3pW_ӧq1?m6/"51Q$I֭[3wڵka00yd>۶mV[nuڪJ7'o 0""" Ib ^z%XVX=dL:{EnnkFm݆?3f@xx8222裏u\zz:^uѣaygݎ]p!8 d2!>>˗/bAII nDEE!11v]<嫯Fu۾}eeeXbRRR wCSSS?oqqqҥKQYY@]ˆ( m۶>qAlܸӧOw?t:̝;{/>s<ؽ{7n IW_šC|.-9{HSNa;w.VXM6_Fuu5݋d,_;w[of|ݖ9zhZ)..ƺu`6(**¼yPZZzjlݺ;v@xx8?>p7#99gJ-,˃$I7n\*'gD+ýp`ɒ%xoǯ~+8pX&OȲBxg=F/ozl|hmmEhhh裏X,⋡ocĈ{شiJk׮}݇O=??`Xg+<裘;w.ya0""" @l@ioL}}= 22ccccKH<Z Iz-ꥴ(\3f̀,8su]œO>/駟s +\]֯_())]pUW L&<޿`Wla!"QRD. a044 x饁޻-3::հX,00nM%𤥥l6^znF#$IrQ(*+6l؀[o+WtWTVVvۅ,$$gϞŹspAY7w\A-0dPfk3^"r٩^G.z:˦׸ц353 *WZXfj@UUƥtرcĠF#F@~~ORƉt`0T&lڴ =&OuֹWWWسg%IBmmed2u9FiBD4D?|XnՊU;oz}uF|\ Ecucqثգي6G+6؝68d;&;lCn]hHN 6w?"ÌhHUt}Zݷ#>,>sEW#P-Z@|nmb.1tq,Y111ظq# ơtQQQ.uqBD4D=+ʼybqNIıG cF_O>7`.:ZYFUKTKO [ZzYr2pu>WkXٵ 8yϓ'c44CҥKO]w݅Q=~ػw/O3gݷo߾.Ǘ?O\{]]n`ӦM]Z`ԩ=O`0Ǵi IvZw aU_8WCe]32KP$oN'$u@hD+~'BIuTZ =CD0NKŮ}?S7|#B3oO,X7vY>ҥK^{Kx]Al6kw:NV^NnVo.\qiii?>6mڄ7bѢEz-<裸K#FW_O?>n&@CC{y]9"!j'jp8ĥZa[2LLq믁n ES"(.8w}:u*.\I& ;v@nn.aL0#""غu+rrr_Xt)Zq 7˻L5 هAKO=lق4h4OC#ue]_E]n \s Ə<|'ŋ/z /sbXhRRRЪTBD4DlXj[19*ZN);!I2t:v`g0wzn,\/mۆ;v`0`رXf NDGw;G}?0oߎ 媧XFVO,s7:=X)op-믿_}anqnN:n_޵> f1sv%NKKoe+&""NN:֪a-"$Ip j(Kt3Q D !jumR\KUs- :\춮?KZ{TKU:BD4D ]̪ ABT:]œN@haeog8 ,Da!""\1\Ɖ|c[ Bt)e|!Q>_MMpƱ4;%""jU;YUqL9Rk [XD zc l6fkBQA@iXfkQ_'hPs0ݮ,6F]Z d cPf #" ѴáΔ`,jM9:,`4r  ,&""Z-,VE|0Y ;F㤬CDX5ǰ8*g+:]$SAxGX).NkLD4D9x\͓V{+B:”,.asc w:h3ſcX ,DDC"j)-aCv_d`.ajbdAhlmUBt1v*mNe|1 8=^ 뇾Ƒ G\xbbl_vW?c,h6dff"??}'̝Nzb2j ,DD+8Iww_s3WսLNA8PzYAth4DEFCqo6E0+Za``蠑4 AĴDz,C Sv-(m,E}[=d2TCV\V ~ī"}IIMbg%vwu$ rONӡh(CiDhsbbfAV8% !"$& Lz#bbQttqtBՃW0nێ:ԏl-_`>`„71]vg_.n)ev<-HC$dYiSw4Յ"L0}9F9_Ġ:_y-=]n_Fro xG庲ɶmw|qU9=Va4v#Vq3گGFyy@rL&b4`׋;9ؾha`!" eI_%i'&ډBԔBj'ÌaFua"a )4aFC¡tXt IDATDfqib3"~(n?W_ ̞WQ^?>nQ]uwsm"L /cE`YHHn:g}#jXD9`WX[p:$Dѡ!(o.GhD+e[ }lR[uT@]˼ybcŦeE_i"es:4T8Sji 5ՙJ^sj:uuI%" p;r:WSTJFsӈm~5-,C[X/&dYL440ۡxrU\ URĄ@+4TJ!Z1eVC[e{ZheQ&[Xa!$VL%Z] uu.K@ה< œۼ58 5 ,DLԪ@AA{W.ni"R""~x4(#>~_@9+M(%XZjoERD$XԘ@1,1*ub BODx讵l8@Z0}z{([Be .aZMk&(mˡ' T ,jb0DFꔥ "?%b+/&2EIHrrCɋ/.奼0} ￱l2E[1?ɝ=,m,)Ą8e1p|o A: h-jM(80ysr 3sEEP2ih0Xe$I)mJʣOl}vm%%H6%wګ/2Xy ,VX>؄6``!zXPS n\QQ+CT(^:z,a :940o}?THLU.-4[w7sn=Gek#>˗/~@Wd6iӀ)S//#CS//.N ,9? Yb=ZX6߈|h%-H4&"1" $s9v@XjjoHHH2dYVgg̭VD"}.'[X`maD+v?~ ,DCؽ{7~cɒ%_;vC=BB`Rp311G+eEs&O@ZtʛQ\cU`uN]BL1zmׯ;dS-,%%:$);] ICiUoG1rz~ٚ`laQZX힁ha`1}tk+6 O=~_#~DP $q8J Pu5`Vf.6,Vz8ԷQcF ~YQZrW).g $Ć"hDF#&4m3NG#KJj8цpMO`na 0tSu,kR % , _5q7tV^;v`…">8rDZuʋkj)]N֜LIT_"'2.H$Ą &,l~ÆʖJWj‰k~ƹx74AgEDHHHjuWw0C07zKs`Q±}Ey}p? ,DCK?+,,jEVVc X`.:m^ggXu^@3M0W^Zd?q5t_?3[{9MmQq9 3Ng8FҠ8@ j,8R]op)&ICKQ~*Z-[](v{]ڧOшʦV=)ϛfkohk%EYIJ x]aab3|];uJԛEEE+s#::mߒ%KdkIŀv5g {|%2R|Hϗ.a]OAv0fL(ro= [W3IYM+ڻt">CoV\|cK. $ DBPiGYZpN8e'N4Nĝ1FaG?ϪdmoP!BD]]{Z{&I]iorHH{:f7PDˠZBCՙ 6`Æ n:#01c@ u Ǐ?0}~F͙22D`),TuLha/]ªZYq┮4~/I2* M%cWp㏁Q;Tr*K|9czmƌF\yz aaMBC[w_*b#P\r%x{YT3,VCǵXԐ N^)/-,'ݿuSvN)% nRD=1$G xb,[ wƚ5kzjm)HlzJ@bQFPLa9R!Nt@k`nCv2VO lHSg}"[]v}oĆ f\2U#ƊM5 2shAGUcBWuQ g!A2EckOD/Z:-}Yh-ZjJ&[S# 4 O5 nKjܓx:$AYCP@OK(X|!NbEyYė{`6Y,&9K*AB7 (X| I[Z%#Ca[H|8&><}\ 7HL 1#g99l(o.<50`Bx ,D>Uo0e0|^/8;}1g.n=(*ݻ}Jܿe^ F^@ /m*ũS.IpNH1T#nFF ni t (u(0XhXz?hwedb];0SУtE4UFDpk5 F4@eLGniGV4WxUo_s  E"/c`a &MݺFn%56V`fk{3^o%IȑH18Vu [Nna1F}9Z..qႁGU[X /r:*)hhSN= .4;c3gbfL@C[WS]ңӽy`fЧTӰ7b04cX>o>%bls_i%iKUzoQ2ݛˁb= f;nov]PQ;y+ہby"x ,4,F_NT+̀_Y3grp ׍XltZ7}JD{ a&;VX<m 1 Mo .rEFˆKbC #}&Ȳό0 ex}$rjU]PK+_œJӼy}Yݍ[\Cԩ[g" +_/76SRĀ}LJ>XB|p]oiBa`(XhQ{jJe͇,55uǓ.V+9  ~iDQ}ԟAQ}ZE<6#:4ɦdde!ۜP]uJJ#eOԜwRZXBC{9 3.γ(##=:(脆rS@b`!RADD{`iiػthDaxq1cxHow3ugPR:uu8Zy:n_-]>KV"ٔQQ0*jRRZ?}N֑ uWZch Uoz" kMMD"(@i)o_ߏRRDLg--"TW3 &QQ: '--'kNdIiDZ邯{ JKp,j,5pU,ZD"ɦd$F${)/v]k"|o8b=;(KQ`1аv0ujY,o%%}i틎y*<\ljBb]nGG"1-i%M,(k*s? 0\zLEE(-ĩSjiZbk'_0H0& Js{`Q1K{:;,a4X \(XhXJH**?>ԿD&Ϗ~1uű`ұՄ ^?^$$dJٰ:ˎtn 1"'>99D+ͩS8Y{4z؜64:F Ces%Vu-,/uz3?m<5dm'NQ`0а#?oҺ2 )@yPh(=,^4Dbʈ)?Re4Zq( 5(i( DLL\ i}{_Ee /U;շP!/N}-' јLLs9U$1 KsO!KFB+V_8Q1ڳy4UWiI<:fA)1?}>Zl-(-ĉyUyHʉYO]׻y{4:1H5'p8)_ ɦdLN ™Nr:{/,Zx#S ,4,uu*KMEl?x,Xr0^.pLL qkC8T~$d4$ę|1CK?Be*?Z6c|x؝vTVl>1099|FgaC֖k.㈈H7zʼnj`foO 55t\6{Q˚!X12b2qe3BBwGŒq8xU-Uf5]it1FG*QG8cdebbDdey&1A GDi#"̘^:"U+TUMʯqMM.!mmUjTRdea6}n& 1C85c qYw`J-F RYQgqry(9~Ϥc~.cc"*4sIkWFDHFnj0}f&䙮B{G߃^88LLcݦ".[pR;npY gՊ\v1.N(#.?^ ,JYOf l=+lQ7=Ϯ ҃ϭ׋ )##owBCIފv>=%q 捚cO W`{kN^U͕*m@)٫V?$>*Jl7X!;V-N2Nى2 DGԨTU3QZIjױ [\#t:-wvrQDp &9syI^{7 }6γ[)3f)FEԹȈhPtjsvKzX:N֞\9Ji؊F ٔO fJwsjᢠM&LOJyBX ,4lM" ,&Spw ۾ uVNO09 ࡋ^GqC1vB^uEE Z.yҢҐSmGyf&k11cz\wlOj3Uϵ IDAT|(%*Էcyje"ٔ#T+[XPDf+/.hn]‚pm{׹*G)'FaԤQ75;lmY;UƤI6g##&õO};x$|w_kwμrFR^c[# j [XH%p~XEEN֭ws":z4pz11ⲮN:8^$ qqjUjUeuu8Uw Lpa8X_ †$ղ3) ,G*ta|{F+W 45 :1 UBD~ʡCHLJ!oJ`a Q`0D81qyy߁j'uu"֊b\ùb=+хKҟ-,J$I ALX 'Mw(X::}V(]| ;̗uҝE;]w0.nFFiSvtiIi!Ae.ލ[ɲ0>~V"-: YqYȊرJYw`9)spB[mrKs(?zҀ㺞DBO_RrsYoM]bLKt:k+_^ߵ G& 5tǞ`N\0Fq𾿭?:ʲ'G)ٯSCam!$H3ڵO#i Q cj-()@~u>܊N|s^R#ShQT_C/)K&]FG+⒴KH$'" S͛%cٴIl޸` >':ZtRKKjPM"D(r8c[ >?9v٘2,$J*FGIe:gQ(jbam!LIbb0k,9 VȯcwneӖ~vSGLx @ׂhxb`aD` lM"3>޳Gԩ1# 'yyOE0MIԠ׋.wIxۻ?:~f;َqk`2t?D ,{]hu *a(o.Q֏G11a_YQX[B!$lmcp;T cȌB8 ,4u^`f<-ϛ_Y0a\GXϩPiՠaQUuTXsSNىԷջs+t]u=$N^۞]FF:aŁsvj[ke\H.ލ թͶfkUT#4lqobb:0^5\9:VˢB8 ,DybYi㉢RlʬY#G23 3(cXckNe>#G⚱@$ȲjK5 Wuq8cDD`^<#8?^?3.S:65۳b~XVLߌ#ݎ2o~ EE~dI5zFy엧?n+F_c]d0aFz!@1SY: ,a`!A|:sNzgsv=v<<3#OFHJH $A@RlqUFssp{yV=۲ѐ@)iK[9 k(H.@Ym7 @-'˟!9Dh+55DkTnMM4 7QVIUZU3 ;*XT>|K &{k- v >z(^Ssn$$r,OÞ=ʍ;:L PHJ3d;M]k>; ˎ_29F+BqO=sxt?o]{nBN cQ[Y.y8珗^W/P R5u/M&ޖSnA|ʴJ:;hsyˉ6~ WE-Q*7Ce ~wrB0RI4&0o|k[x)?_!.Wq޾6m622xYr$IBc*Ak> Cx%kH'c6oFx-m6 !]zUpm22%)%tHt29'ק5م`%͒F9ƒ$0I,OMEE%T',Xne{ixueam<0 DLk -|u CRԓxY33BB,|0<,R@|>q߿b;MMF @ApX02/xipf _0R~/HR\;IH5EqJqLeO?E_1xdY&՜|wɨQKnb<.sLk2i}47RW9FYji[G,TTE,*x,1u?6jk,ppRB辻7֬{ ^,r;MW=,B9Ά~tK:}}vE&)S9=p2!1<;LCnCL3>ք0-_GiiygI#{uuz5\[[V?\toɨ&`(HtsaFrҫ([TT6TGPf< ëoWc?ގB=`err}""j1;+"ZKGl˔0- +(Ν"l t:qi0ikN̓O-[|M<s~=>(8yiTڐ^Wz\=~W>y9+7H#:ȁtOusnovߦ.;HO⌸Gͮj!I-Ʌ&p8\v^ƥKFL1q`lL,**Ѣ nWN(MKeeb8*tˉ?B(jv\.e_}wƾoL{<8 BC V fXv5p$nOn|Hst\Eefhj%<v?GK"7]][җM a{vuD .~D$I("Ӝ<Ϲs8C-͎d`5 ΉN ZI$Id$d^{>Q.\F# H˯r}z$"2&QΥʬovɸDc"=}>ΥK뷼&):jLTSn%''>,'ޅJN먂EE!X&' wWU'thn+Wb71*¦wZvqn22;w(:n8jQb[ؙٓCB)gpaހr^F 2G{r~|DXLO0噊KhYIҫ<^QQMuF5yڜm44+?CSV͔KƓoKJWϻ>uW?QmD`QQADB!Jg?^ss œpS,X`&HO`xv:#& zB .NA_۝9>'̭ZCAN\q:#YAyi8P$eoP!f}X VM^eyCaYj Ϩ{4&kM?`7mb~^WF1lƶm<..^%^hyJc{vU(%as V JTTvTpQ<`6ij"J30 Uk/F"%"jt6=㓒`z,&קzF`W4FFǵ2$$`5X97TU*ǟZg[hiivVDTɩS\D}Vn'Í\&ۖOP]Uic o]{ơF+/"_-'S\HAR#*;kF.\D |&C\‹/xoz&ؗ}o_slvl&/1OG.f;v\ΉN+NJEE%6T(NJ}66o'LQѠ1qSSH}-<6!Aԭ@AӧK_ngqw3g' x2] q !`"muFo~"dn*J*eXfkVPYYofsfeO8ڕQ#te WVgH,z f4Dh+ߡ !9DP xfinb}$u l.\%%ɘDMF q$8I x}2VXY:q5桱R{*XTTbC,**7%HKSfIxNJ8bb+)I'%-u3N,.׽-XQOD9,zlP$8%.?YG_t"h飴TUR먥$d)>JDX`!r 9 ˚m9;Q޹1ESZ}QZnؕFڜm15Ŧ?y-FѓCnb.)~sg7,XN@2dZ39X|W--47r8i46g>ȫ_cLk&iTViTDVK  EW8a=¾}Sg_**1~eTTnpABB!J6\ԔяN:>wkhc'(,Ly/_'؛{t@?3pGY[uFu6Ť3`?+wW܍ %IS5R;w7v`OJ 6t:F+.%-I!90=S=za>0WV`?99Qidxv8yiBjAFKYjee~:;hmpIeֱ)}"c䡢H4& qpe c8Ig^F,ki%[ "ۖwW**:`QQ;3#REb1ZhhW[X ۗF($&"#k˄D߉~e\Aև9P|.momoL:2{٪N[;rvpz4o_ %(jNe|^|*z(2!ۖM-yeQ(=~uWk>vS&쏺&LNbOo;Uz>b x2vfh_]7QYGar2FKqJ1)6ZIKFBF$}.Ӛ[8dYg܆u#KH5ѵ$w[.Un)D EEc/ ^I6jan)IKۘVa!twIP75nuO6aC+Y\O{FDV>7#\ȋ/b(QQC CEW:p;$W<$I822n;43ĉSI6%bN!ٔ`[s_\I ˲Ŗ4@uzd&:2py\\HpG.+w*>:':y$,[Y,,zoˈ{W\ bjDO)q!yٝqڜm:[yErxl҂&#G8wW\.."Xa;ȏ͍-88o~&pڔ4: rsȶe x(E ssk\` O>!+I$^?GNT)*eчVңgO_& 2>?0&4Ds Sh%-Msδȿ[٪_PJIyytI7j\]SJ @@eIN` ThBrJIr_}l8?Օ 4/;~&w cMek83p-UiUdYJq}A0HD{U-Msu~`QQ U׿!,X 7Pf`QQYסduGʨPb4ʌ,&SSʌw7+aYo!?$8 `Uy]!71wY[aQ={;'N`ძZO~WV3ϋɮί*X1A *ʟ"?)1[Iy{}=r?M45Z9 ז( %+҄ݛ=y{i C8wl[6[[ج^8C)EzpT>眓9ܺvaM{'I;9Hw:r.OVۺ7yyr7 E8%w,x6/Vр*RUc SRyA?_x,HEyW\D0!;!:LY$D ZNr4$ x6$X+7됤 F#)¶kc#w?ׯٿ]{ڇJ>DxG.fכ:DYjuu1矣ukQ~7E)"Z_K\?2;}KVeԇ/_(AD6`QQYO\Ufpw` p,&$܇fgGdY Ol~dMu-:fvZ4AcoaQs,ظ0nPTegN%$VzJ#ˬySp9I;o7)1ށ7pԲȾFPR86<=y{"DŽ}>h^d4DT77t D~3{zV**>7--4 7񓖟`[؜-[Ȳfk6g22[[3'& ⻧ɶeGU^j [R7Gٝ+k+m0Ÿ_z3yyzZ8CJcQU8FeWj EL,TU tޝf=dUnVxV.>-3Fy%u>d?$3@ op3-sI[`PN'?+mh7]B 'ȄwgBhAWO `r~~S.<UUǻ22'˟\7k%+Y@D<:;ؼs9S\ġCICArF383H)bũjYQ rhm`=Jp#͜8MFBuu44( pi)q Ō͍hLĨ3Fâ! I㭄4>6eFM_|L q bA,**`QQYz0YS8KNxbU-^Rk͉KUV8%#۲W/zavع$-L y$pϓoh\-5xqDlJ~$!9u^ `7I3U.sy2ɦd,|7Eyej44*lJ[֨˜n?sE)Eeѩ}ڌW.3 I"p~vg|hCcd$dH#,>HDOqyyQDG*?xasN-"667~e=^;=v ;QQQ2**W[|TR !X:;:rHJM1e\+,6(/mKag)SZBDCDQYqYzsr~2H5ِOE+# Q4_QqCC m~R>?3.^¨57/;svb[xW]=Ȥ9d3d[^́_x~% W|U ռsŽ_tK:ɦd,+>.9h[pӮ.F#6mmAܻh=(IʼnSh$""s/~$'O"!{[~eQ>UĆQQ;҇S⥢B+#XRRĄ|~^>߫HɂDi4"RVbqDO?YvgXDőuim8vNtz$yX&̶ٔmlF0#0t r;owt/F!£m-ӐҪ8uɮ[,)$ry\~|tAV?Q@'[EK:j^ʲLH3qB&'ؕ+\z\=d۲<^˻ECF_/+ R/{.Z{['S!ym+-o|`Џ/lnŴwŌw'\+2W,_.] ĺ|{1oGn{ij+i5Z (H.Fez]~;+K9 ڣ&\X38È{Lk_nOW<ś]of#no+9щ.N@qpÊ BٶldY{[}8C}V=,>^~~. ]ϩ|PP*nfiWnpu]hY,XrÜ8AkFɌw 3VDc"I$FfG" wG#mXJ44cҙ(O-_؛Cr=P2{[9zbJY Q|^^S# ,e _n-l۲@svuꊂeb~byb#g*QdLLk&(op~<)HR0h dZ3L1%?)?q/_a,47FK1Q8u*DE&VQO?ަMp`ƄH\wV9IH!##ˢp><˅ +V)coZL j^HhQ\}k >P.ڜm0U>EZX;ȾRyx1[F[xŭȱ堑4 Fe3gL\M$Ϫg; -/083پq0 %)%qn5L^E,**7q tt(3^e,6\ Yccb}lla[l_ldJ ۧL=47,]B¨3bkHF !h!<Ayk{&5 2a3?q7 {-}GJU__tOu6܋"ɘQk՟3Ek`IJY]x^hFqZk_@(@-Jxgzt?cKDJ4=a41GR!fb&--{^fEE BX"}$LusXcQ?f'o qu*.XZG>a`paʽ*XTTnF{wu)3^a" ؘX񣕚 iiuLKiBrȟ$$$IbDļ 5ŏ #i7dLnM%} ,z {si۲TSXEJtu"72B)ܨ]̾}:ϩS4,4 ƍ`"$pv%LHqu*/BCHHt[Ro5,B/!R(H#>.rD ,iEuFuMp= (Vj/]򷊗Dc"&TU#{)qG+ϑjNݘ5$搓Wvڕ׸6yvu[mC}mTr PڽpÄf,ao!uk XHeb!BlIrB#IOLIQ۸.\^קlpqJ1^ &륄ɲLx55ٌ6vddIRL"jDMK8 }#cn|nwCuٱg9P|`1''D'6* yEj.0676ymR{- ,5RD?7}\TWQb/% G?"՜ʎem8pu*:Br!/?suDjzoN4&-}ߌM8UTTr_*DمF!HvQonaHZD0$ 3뛍g}w_з8 xzݺ0`jSٙo|eW"!9D0/.̟2흎la^j{)jN(sZ/%lxvLTyy;˹sZG))XgVuuuoޠW0GJelzK[af9?xs8?t|v*jH7ã~EB"˚sesN^7F,**`QQYF}jjvrhYHڴiAʺ'iY$ɡۖAk3a3ڰlX VlV$|\z'FYl~D9 :t Z",nwDc,k֚+Y̽vGDXјȖ-&ag=HtiiQHྂȱDޗN\22;]!Ru"ɘXKxvTdh_x?>ف2VmYjuO]]I,a`f4KZ\M)&L;U1nJ5)VQP9BḧZvJNȔII ,:Tkq 0KѢuFf"ig,UMz&5DN4ʶs"t"NBtrǯ\n{lJ*0dYtiS ZMؔ ?ޣKˬ<|z/dxɱ7G)`(:sp$86lq+Qʽ*X`ffW_exx"??\{˗/wU֣_cuIV ɽ% SEFf;>!V~QI>噊ZAxAc\xl:[wd԰7o/6C&k ?sz]5>NUzG'͒FeZ%{SY,2 ;"4fCѼڜnIM˝dS&q0CRl̍esF/8ȋ/b֙uԲ#gi4eo8k"VS)꽿DM׎dٲZN1eJg~E,qO}3go~Jy/111s='?̳>__sQP(ğٟWO? WE~ƕq3!J33h h%-s9٘S֪a.|>Yt/eAwnhmePPI1puBArA$ NeDmƙ3۽fN4M-Kٛd.<9}|2veلv"#]=m>̗|`IkkYs՘ͮᦍ":#۳={;N&ehvo< l3ԱWOE64G˚uffm%/1#ϣ؜\%Q#,**` ׿楗^(> |ߎ˿<#~o|!Es;ٝ7lѲN琑eyC$a[pܑͰvoY-vK˶e/{Μ~w1罞"f3ɿ]Zh^GuFuD}|9{|Ur~1a9wb%BL W99&r8UiUKޣҊiXQk\&8Eo!'1g,g|nI$##ME"u~wsWF@D]/gWm(1ekx[ 1z+Rb/!/1PmC~=ɦd˗<\WEEe :4KS)quHhqnY^cM,z n;.b=Yg^(,!(~ɗ`'x }}4 7qy9R;o7NsxfFGED$ډXE&=+fx&&%)%dZ39{l`$˶qK0a09ΥK&M44)N**\LH3S݀*Iokim3c7OW4u5^s TQy W78 =z`FĥMjNOOrd= A Z):':KHhcr~"l,jc5Xd7FD~Ǐdz\\v3x|+V0B\P &ݹ9{TeIY4E-AIηc{[~/#I{W"˖E0dxvXB >ȲLD'v6gwe' ]]sΉ?䏻Kbdd2w/"I1Nlgճ={iwcHEђLIxgH7yYUd5YBBQzzB!ww|3?A侤fn6 _OZyggT⣺Z[ ̽OP4b)TcX,B\tuV'Ӌ e6Ɔ_0/9ʒؼY<_BH2Dd-\(Eo]_P9Œoҙؓ#GؗoYYXҏ:݇y=>UIÞ=xHxF7&%PӥFfG"O>~НuHSirl9w`5#N / /,-m`ǧ>)^{5|g%%%hZ:;;iګ@w_qʭ^ T+,Rx{b:EN_OSVFp(uof}âsY=s-HH:j90? XnK@CN'Nr(O?{ M4h$ +?cxvXE]fGz^{h%- qDžqhtݽ'9X|3g8wٚ}bVY,^>\[\PΉN+rgXiQ… l۶ѽ*Xs:w~yW?/2)))ܹvJ݈֍, !ML(֞G`ӍZ#ޠ7+X#^,,3>7!#o"j] pܭĨ37/^}H2-D|hG>'k>yzWFҰ%sKc  dY*`ҙ_D . ]""Ҭ榟HDeZ-Wޠ[\KTTE*X6믿OS>S___`|ω'w÷mjkH05ts:axXS$%Aj(Ήc6Qgq`LZ:nI ZVP sNn'9'g #ygɱj(qĴ3g''Npؒ(K_׻ (32;X1{}V=G }8}1Μ45ra7?O1z2떈[E[I'ܕr`QWQyW$7x7xc}$quyyW >򑏐w/ߡ3WQYWɥd$jp}B33SmxF GXt7Zu x~_Ї'Y>A9:nӘF 23zzs3ҧfoȄ,1QfsX fj؝݇HƜoqZ:jy=wV,ʢHEW!aQ@Cn;sv203 ;5k+qY ETmI0l {Ul3LMTTn3ׯo B qx3/9z{7~>FQ(p"gc΄Ig¬7c1$k5z6o"ɘk}ط=$cT,z l=>YggWDWifmI[Μ;Ή,Kh5Z/׮#. ]`=xQ#,"I&li^Ƥ3QQ̭d۲7 7ΨVd} n8̭`QWQJ_|DcII")Xz̭h$ &C]cҙkztz^4\c#2A93jdٲ(K1Jp -+W8E{{Ie~uFvxqj%X@DYwOoz]=FxGSsG^bٶlMQO~od?ŔI W g2>7NpG.rnt2ؒ%J,4Duzm1O'()H.kXâE,**`QQ~()nB!5:*jHFGa|;hOM)'XB!1!OހqP%GcI,˸nn'z\5f~I1H|8ac(>mTh$ >+_ܨ+2W'r^-|#TgT367F>9/j Zt22"[zB:6m w.5r;Ir=47n}mJeQZIWIɼ=Y SX-wgs.R^E,**kiAGǭ,^$mjJLf,R&'Sb;L+`A\,I'Gܹ6Nâ`[آX=đ#$I2%dL"ɔj)as9Am+_YofkVEJ/6JuFu3Y`(Hcudz5RZL2#FݣGq2ڂ?$Nܤ3E#A5+cW"ϩ֯~4{ %:[ij1:jˬ#ӚUyf;IPʽ*XTT`V!X 21!.ZOO/5$?1QR"'$^?Q|틑$Qjp_T%Pyj9Í+\Kn&X'q̒FfyI1bNnbJ!!AΊoJlΩS9ۨuԢ'XQ^ջr?υ 8ʹw2{O=A~RBцh^Me&=8Έsqa2k5rg1l팺G8|#9=ptK:dԐfYb;C-30=#%=`QQYpTeԘ`PD;\.MO/o,k`u8%eaXk ƛSJ u(1SOQUlǢ555 L]_&$py]K.io}\G! CLyNDX,i%qnڸ#,7Hpw\7>745Clvlfw%Inc7ۗ8Nz]9۰mmU^e}22xasNpa 3u.iLyv,:Y[o9W +|VBB**`QQYMY=>q:66&.'&QZ"(v۔ ''R$' ;bHJR&¢4%? 6r9 MɫveY,I&'Qe|ndSm_%)ʎ"##$IU)pƼg|~<.#Q|"ƹstO,s Fv:':clJt[jT Z[2%s S)GJZR-+ ?⃊or5nRQӨEEe\lw# PzpEya5XXpvHMx)FϪ罞#_cӼC!kxe|l[ONEH6%`m}yGUQ"ݲqL']!=Y`Isz`:6lKlYVoVMIdK߳^{fo=ڒ~[%&.+0qop`"@p"?onx+{KrюRUJ{>2Ƀ%7 Yivv|QjXyl=srb_>nIe.e-e2ˆ v<ύ@pE Q([U.пDߋe*  v&U46BH}&D`[LK 5,@}8Py /aQ=Avh+Vvwî]܍ƁKomFWe&<5@.35=?[_-I9qR-J%̛':mX$ _A['x',,e=R)W|MrӺ9$lEHX,r={MD;:{kO?5e$K(*zsd`AUl13?d>8k?-0LUF<Ν,--Kpgxۛsd2oZNV(juߢPuͅޖ/'55b"~~{O'Q%KY+RZN^ߙU@N_)LE`.s~ٳ^Q8xjj8{JQ =CBz 0tCAjuߓ>9ij;t ڎZzL=؋d`n\F,UIbJÂ)ʨ5z\ܹ}c].|^ yvap)YzpPW71&"<\BCWTVPZΑm p J% чE0UE 'n0bj6޺NkUƢí]]eAhMon?nU.=Qf`gNvy}ܜt3NcsNvxq-$믷0Tk)n*T(wşT@.]ZAE,`نY2Ui s  /p 7B9^^r̾=<y#c孃^ΎhTO^ %l.Ln}UmU=ƒ%cu%/CՇX.,aNe(5$&e۫)o-YBIkǯ&V|(ӽ'^"\X{47Occ⤹Y.$';pYO>9pۙ&=FvI&/:l<ڳvj`*nMoϸĮ]*ɺ\}% B7(n*&'~u FcehJͫ I]5o9y{ &`"@p_N|/G<O'O f=44<`bKֽaY=y(r~=Z&3*nLѶmeJf`ۙm|!\s#߀!n!sД,x8BOPo+a~DL/`.st:كa^,VoH^f_45 ohdrN//ya戎|e1=1a+9BB$ګ?c ""L\\dOXyDF̙08W:+#vB8D{kDe~VD[?Z1I JckV?> > \{͠|p:p \{[Q.2"-=-l`"Lj̨8ϯϐ RT- w;cv?}ޱb,l*؄/k _g_uy y|S =W22XJ@w,.ڸk=_!X.-!X I,S!X)@z:OU&Jl,y.ossZ=DՇjQ)ǟP(HK&;eSu'XTJiAi>̪Unz: +BLYK5w] "[[ /mlbb3oqh\D`i3vϵS`J˪Uxޏ1 ,i77x.SNy\qJ\ӱJ=T5K[J`Luĭ-LQQ9Sh`z#rX)PNj`xSJC?W_O_]MSw܆B={ȩAҲ"rŠ*b#a-e숂j& 6:4!-x{|w1oJ0E "xyA}Dt ȍ⭘,&Ư{C.cYeY ǧ?&\..ZVEbNtjݘ՝?C¬?G3$ϝE0E "x{˕?.Z:Hdw,hg6{AC9u9ܘx#n:7igNzL=uWtdM҂P+/*X ;M<I(!X7ޥ;'y΂w.c^E(B E "xy1==1V68;mp׹c,t;qպ|$a5Zz{GskV<w3X$ ZEau 5b񊡨+.x9y1+`֤YERdUdxR):b Y?K0 {Ʋ^/vv[''^QB?jyYC7ŬD]HK!3޶o#?.;j==,TE`ƍzk>p9]v^dVO]],_TPѧ/2qq1,zNԝsƙ;gK/rUUO3b6P) n%3 rz'`hkuk,RVЯ܃E?|!%$ .`*1kC z , _+j*♬gд=~.ߝEO h89LfϚ(54t5p}gXg牏q1H`2PZε~?B}J9oC"11K'RL* ʩ'J u\zDhj`aB4lj]LeefhCϊhvֱs2S\f݀2ŵ4pM5vm|7v~:v?sq#`: <,%-%X$ 11τi,`50x<=J3{lC6Ψ*<^BïUiYp?f%#<g^~Ѷ;1aw|$XF\Xo3!``&@0=׮xb7AVY*5 oCmEPCy7]>Q7`1[| F-"-g^qjfolr(ˮ鬧ԇ \`;g/aO K1>hөqŮU$  I=VS$;®]v5̒YwϧyzPxijdo5ζא5½e]:y)%EEPeOj;jm37x.nZ7v(X LIR y y\sJ[=ٯl$>Uѫhiܚ|q,{M]\̛TQK{ot+B@%;9B`]:*-hg3j4J&+@MO,M}gEǻ0龦,\{YvPSI\sac!:poB4@Z-9s?ݳYm)ֱ\{%cR.3XKhPag3בʦMzU23"!3^Cj`}RfbW.֔[m% }!4*;Du74dieIB ݭ&#<66C\ uhpFP{ Q h9@+R r(oKO{磫{(!Cˋqv$/Z| 7'5֭uX=W]eOU +/${bcᮻ.v@QgCM|nTGA;Պ*Z+ؘR##lL:nM7wgڸY$|~GZu#_cU[\P{Wv>ߥɷ08qNi!N~C>^N^ܘt-U՜耑O_p/Ų`(=XM|,ΟkL|<+ZnjF# qcKCʂcƮFUAA}ˎF qᶔpՎ!^$& =ձHW^s/=/dq<3ې,Q(%$$"<#pӺ]tvti]aEE,U0'|]5=ͼu-.beJZ̀{_ ##|՚vh6o,+CXq:y9D+w@fi&xΏ's"-X$IPP5tvr? B% NyR5$ٓbmXXkG^cQ"RR3].vHܴnK\ǬYҖR#]7Å t dcF]Oac!ʻ>oW3קûi 5w{G,+/=1c8IHH۫5jhPo^<23.%GA<2llQYc˧yGy 0Y^>2[pSMrÚRQJBPRP+T }ϕml-JU{~ܖrvBJcM&9Tgdf Y O6C*iާl;!IJ'>%;H!vRVIWԨDzFȜGؘ*9ָwCy#N89J]HS,o|KGII( ZxܗzCaNeo/Aw}dz:Xo0'$I[l^6C|7q^Ѭ^$#BN''Nfbogo'|znIO̧y2]qz8y&n Fw3fa֗Z+_rFAvB:{F;Kwr8deb/m8k9\}Q+k8wj㡼ҖR?IJ+uٗhh;9Xu%;lccYnȰBdaS&5J''֧9\}@E}ݍvdˀc|l^_dQ{9s>2ݒ$xURiHGkrϽ乓|w;W㊈+p8OVD7. m. lMO@0ME p W^xac5(IW_9CWlDcmujUX dHU5N[~̍$QXȶ3hn"=(Q+T&{G[%y؛_k;+|\̺8;6,%;(k)ybڪlCՇXz\gy0a3Cˇ^fo^Nԝ9঻xK}d.ͦM\nJi=PgKJZJ1SbfOv[TgC|}sy kt;ѫ##S swȲexPK$^~q} l`O^n\ãjBTp x:y*L3LZw\jaY2Bt#uK~kG^F_c m<ǂ6>{Eš5, ]HO{ EiK)s2Ɣ2p'+$H IDAT1U)ruGPH L ѥH p  bӟ[-ɷa`ڎZ^?:YeY,[#sbe,\NOE ׎ގQUr8$| GkÂ, YH~C>/fwg4t:zz6~7ܞr; |_Y6: 8U}HydWeJg~ڪ`2iާ$| Q:N<61[WU I4v"4Ӷr?\ n"5,Z$>6cQ,e+Z8Vs@zE p0yLrak/AcY׎$I< WV^ikm8]/>>>1&Ń;{;? Bue*f ~NFX+P!bfcF^9ʀq}?c4* I~Ixe$)\yQi-6.o7ޱl)y+lxjͣo.I_|IoFT*Jݳ&/%;4SJKhiԃ$->>w@3ѢՂʋYl/o-ïUWtN\{xX]*X, »"|"8ctvg=eぴ;jvo.<x)i6B4* +"W[K +uZOmï`[Nן0L9v,feeYQ*\{ N]gEE/ _ʊ<:&Yn8uԨ/*n+_#TJ7'LzP:'ϝonh绳()xlc(J~K*Vmh-HeO>uy0}]1Yő=,z*Q'[ "8>r/=.iaз@N,@\xxsԇ4vLw^k-=-TUBa3GHl@yuܐx11||c<qAΤ"IIIrY_aaql]U1W 4$Iǧ?fۙm<: MSZ7gaaBRSlc*JƯG÷g?rGq56CxjS5utXaL6vY 5׈aZ9wX`@8H5пUqₐ$5,ͤA{-)p dU*$iXWUU`ʥ=IRƢ ,l,_U=(*I^+uW(ʪhT:z;8Yweo".z &Gjv"50nMMAvfK5ʶJX1rpR:Dj\I~(}Pu6 B)H*B6J81ر%D9Rs3qmA )k-㋂/g=Cv$/:wBCl=a0ktf$=t1y~W^m,_|ɍI7o,tFf%;ZA@Mg 99 HJCҐ]}vhUte<JlU+&GmNBSGpiRՂY2q.JOM8t&7/ CRVə3Ӣdd5X$-d,/Ůbdlz)VBCn<=C!IM:͈En( &>6q&*j5w Q*eN1n!g 7K}$Wdsj|_[?fzeAPgP){C{?S gy/9v6^jj @ R"8 kh ??֧' kpR]b0c$&IDU{ߞv@tkcen){b(JnNO>D -Ћ؅4!BGi;xޏQ+՜; y- j:^ǂR{x@pfNe5@Dl|èh;I(KנUii3wqh6?{ĕWS;]W,Xιz4Mܟw&l}5fh@^&Ԅ{gL39Ssyd= aJ %Eu{58G8އRiظχ5kFn{x_gk{w"Yn/ ;Ma"ˬ!"fF0UIatu|֣P(x6j$!%;y:i8M$$?c ,]0-ʮ]l _(n*TU?3g^reVmfLVE{sSM8Er  P*r{fc;gۙmץ->SnGnuU$%p=WteO ȡ*$1ٶQ$4_tO>`_J%0GCPĢ'xڇ~!50y_LVY ܖryr;5 n;{9t6!sjzͽ(`o^x=fo6N$I``nL26l"+<֕N}fh^, ]"IyVq!/i(yȿNO}H{o;W\ŏxGjPY<4c= =y`2pM],]έɷ@S֮Nbc 25 7r>8~6wϾGRdyr>V]jV,/eNӑ!ɮrߩs-廽d;&فinFC~DzF6~- 7WG_¾HK;gIO<|w;6m&;nq(tbb**T.}jC}d>13tio+ݐDZ拇PRʡCvoyjS6aފ,^ʡaQ+Y.MlG `b:͘,&"=#:vWߐ7cY;IKf~|"<"%\PaTBxXDŊօ{gߋ?w[2 qSMJ4w7]nc:{;mĭ=(V-, KmUA$&eX;g `b S.:~4GtW0ܛ~IIt ~~gˇ,T7Ǚ?Ey[4t5p]usb'\enۙm6h Nj'~8=9֢#>!.:YK$h+.\"z<8kٰ|#VP=^0'&OE:pѸ؄Zf u߹:jdӼszaC텵XV;#\2`gyX5zu7AnARdQ"@1** d!'؎h\cs##s?䫢/doH]ܗzN|9?wJ1+ [FڄO]O=SN 5GmQ+mt^C:/{v lK/|/ryYk6RT5l݉I,\ы:=1. &^s/ ] >qպ(l?_s8"efbCNԞ\Q^kDxE`i3$U-c=cV^Lh,EF(,3g&:]nC@6H22hnlYA2+`?#X+"WPV'gsf=UƯx|C;:gnLҖRUjUQrNWb3\.ܞr;$B]g U/?H{(wμ=NG]C~#sJ5|Hg}D]_k9\}1cN;ņ |Y% Zcf ܐp]۫1X1 |s^=*O)ҕ %̐ff!7a9VOύc|/Jac!ɂ\X 7y?c?㷻~˳IW_qEa"qrUis?y/=}τrZ ҷ5?ذ| ._g!aNϓ5pdWe3?dFњ8yO\dg8l1%-%>¶3w@]l2((23QHHW&/KIJ}/PYow'#B ΋JWlP6WHzP8f4\lY.yC|HO]܍߹c.lͽFN[Rwswճ1w#z5qkHYCl=e㈎W{9Yww]z~Lsu\{5-=-.͑#,&cyr,m;'50u9""8 NN}MƋNG3Ļ9`}>ʨK|5g5shTD>>&#/I,%=ϱh ޱh9[( 9R}V "|2+(i.፣opK-MyjSl*њu-|%4* :11\rElmu(nHP,^m!+5GY5XȲeO[?sɛwÇY;x|Y# gsu#m擼O$yleOsGm]//ڄMXK w=ԿD8Ƚ j Bd*-wͺ /'/yq#d%- n}xwQ̮VސHDoc0LwľI&q8v 66&H $Pe~ ;Ң$d<<ڝ=o~#5{iX -:Ǝ0W4&r;ޑS ɩ͡EBG̀ƴ6fT^"kG5ض%um{ Bɒ%s/^- ?1OQYFԑ5װf>>oۍ0 Z43|?=mu]k426@0Zqy"^n„cl8|,mpH3P PY yy0z B{4))&3 +Wpv}P K _ܑRުZz{zٚ<>I0tZus+E$'멿nE [g++8_|00x?c?|^,x2Iv_ъ9!^=cZ|e3ώ{+S+ތ/ӿ'KæP 9֩$*'Zvm6{iVNYx}aE1͝9QI*M"1t U^c\{3 b䇊1b]H~uذ^{ w?>6o;`^8rΝ+W*v%q,W[ԩ85Č!"_V*GK3M56Juj7RܮuU-Uw]/nӴM7|ʒ ݣ=fsg32qp2h7't/]Da P)U<t+V}WFI7S#?>'9W]h0Q9ykSkҪ)Zs>>c33VDևlf44v4n,X֦<(E1LDGҤ1[˂_I#mdO 0='4by?kSkDQ+6`,U\.ƎF/Eȑ3 7S?4}HpA!dvm6\_;>z#nTҿm(-2ɉ8Z8$kvHO\j}#w;Fň11]{SI\~Yz {,15컱25װOqM~^?:/G@#,dail!27pT)?5`n*0bd1DSS<=9rqaee? gh^B?חu\*;lYb=cyq‹xtIc0JϑXtXX-VFIE'3iQQ̅ 5VpwvvVhh/|e3*Kk`3c?{?,xy˼2;o_x s IDATqx;=ҝJVϣ]kt]ZQ+f.բ=ȑb38^T0tA?i;VukW}_#Gv(Glлv9x4ttЊ>S}oP|X%.? '){BCyf3X5u+sЭ~)6N2;:nwMbi" AAƝ:-+:g{;ak[0:,~3 {/ڵky_o:S#ͨ)i2O#f 6 RNo>t;,/i,|' l L񝂉33k(j(sdW+YiZEdu_pýJMwf?;@SfnOaj_m[->g6m䏩j">`?;s;f"4@R8{*8%7k"3gÆxf3tj;ILn+3^]邯{osN#"J%dd5+ yuy(B saScbdVF/hЇ=_p80eMeU*l(tiuˏY=j5[KFM,7_LRiҠ^aT%NQk\,HGLwLȾ - [r#,F~aСCڵ ;;^}Uƌg}Ɯ9sx/7ܵԷˍ̔faL칾RN &XZSXd컱o@Fc9xth:XPRxX{p$ȰjtR~lm{SiʧԵ1B* zi;*+]ya DGj|xmۻT(2 37Ҥz8 r c?c?_W?7vzꯙ0wvg:r80{M $IvoqRR+9UpldU \\ɯgq݊=sFaH,Uc_ssy.GF>nm6vA`h~2'8Y83`!})~mFn=ǔJJ tY1򟃱c5Sh~ɒ%9sٳgkâiBk  -f~g:LI^]—׋ilL/‰ʓi{_)rPhlaG  qpD)(ъ=%yۀO>c,6f6]Tj|W.^];<a.a}w; 3} $GjUql-#ҹěg`ab -={E Q\Lm$>jIgYb"w@j4 )qѶ/'w" RJ >'J5oMLL Tjx+睳(Rv)Jw>Du( ~d.IV/lIKnnnEf"#(8RrQ =6˥m]A eL~џFmZ%J4˭^R5.o`p&"KtX.uajЮUUsw -wP*ޖl3b䇎aC^xY~}4\:;; 1X$dee#wXK8Ѹz&Lb>{\i״/ld:**w EBIc ^^q;,d5&. >̍;3/x\ޟ00N 9Q\ζmhE- G.P!]YzaRB\~ եL#BѡnԮi竌X'*#XPqc{`qpd^Cd扵҉̚L'ffUOcP?3gS \1Uݏs`|me T5p:6!؛171ٷZzƻZ)GgF>?g}T=J%rDS!j\W;Sc ,L }[NR8޻*;BD߾A!"wuJlV(`x{FmIJyTBUG J-&Y VM`/C ߘC% EwPT فI_{LzjBZ̤c>: EںG.Lӏ7HƒS\)"ž6DG1s9:-ʖJ>JnY~nFbtXzu6;sLxgx7u(+q\#ЩdcQ<2 cWӲ3m'嬋Z';+ ؄gf~f;4)<1(Zr<?``{B&LReIvm6GȒ׫|nwn~ D-<1E3g8wpp.R5q<86ּy Hd'rO\l0c=^sd-9]pNCSsk(ͬɔafbvs.ڥ4a㬭I2dv/LpZώ{4< b`5ֲLv籰rE,|Ax)x=im_XwJ81g,˒9}vܭn_g%"o%e9e}D1 ntR"""x'ENVETEMM{+OS W\ʕ+u=F-T V*+l,WɭeըU X,'o$4S{ 5vJy }Cr&w<-T'8|:~uF:$&{/LƥK߶IZ櫌Vy37?~{}/>ۧ#eejЅ, ](%jJVmAdzg76WE&rGG, TTϣݣ?FccfÊVr80^|! 7䈍rES0;+I*MQl8kH9_tYptҙLR+R?+W4SG,')g=ƤlMj0t.--, #98s| +#W2Åx]5m5TTr\G>0;; =g %Ρ:DJJ)m*峔&xO )huzUz E{MFamƶm mFeSLM gO7o͛c(J U o孷b̘53r"sF&BFEeZ5/eXT3qܞz6E E>LiS)r"8N'R/dd4|).47n3{" 1wJMMl*/볋BPplL<puDaTߩLJYSK.ʑ&ĩSr͋#]{c?ҽR䢢bpU:kv$%y eD.]F@ࡐVyz)(8†B/qiwcGT1o:QnQ>י_g燃ۮmcAb<>L,@?tV}ssݣeхc= RS i״Y쎣L"/LxʖJ/HLNMG]ߏa鎍 6RRFk۱7'3ZX1<=(k.1@&{6|eƎo:Ɯ!d$&& HJJb̘13}tvs*n_o2g?#pu"י_TĂ 4K[ qor칾?k23~m; Nt[ kA4ʍ)>StNJSfQ+Yğ7OhtJxJ)*T&Iq7WWL`^|eCO3ޫ+~,s#g9OF?meǵz4('\s8Z8iʧ\.<|'wbǿ+S+M'7K–N׫]͚kss245b䇊12~ѢE,Z{>#:lAx aNKfM&8ܾޭ Qؚ#Gzԡ ;@@[]73߿ ތtZq.]_"a\?J*K G tdIXbʂ%aK4SNQک)o.-YXϡ'ww,}fzjV*pDFIVM_8@?#M7lJLLBPbºuW+}jI4 ^ &Zb 6uaabA{ ņ N%.G~>ï1ZqKe u 'xU^#! %}ܢ8=aWR\9Z-?aѣOk| HF TK5+pJGpag짤Asi|ˍ8Sc{B ۔(J9B% }d1Oq,#F~#FRLMAЙ1w*Kg\T(y,1>9$ڨ؛9$m&/>#MҙNm'80w*޶htdRI2S:Tr۫YU>֫RWo @H_ێ Oyj@iޏ3ˏ@;U-U̖cˏWZ}Gcoշ߁EzwҔ4!n? Em[-'Nr: G. Ap )orBddI~>瘛STʙ3LϣU+ihG1UpXl8^6^ƎF.]&<.HH/% IR900T\֠w@G Ζk-D!bb2VoK^bkVZ@BC!iɡC7,bY=wFV\u o_xOOyr@HlXD9fSH|pBCy(akXib]4={"II=ΊȮ& V<lY_BrX/7ئ*(n&&NQv8q"),xZ;f$ofNAAr>~ry2c<.oo??ppT3zXDcgE4iL|c9 ٪Qq ^bwem[-Jn<m!g=s8020i$D>77SQ**My0AbbѩogC!q"nVnL6׮ldth:x,1(#,xjSԴuMKD+7Q}33yPjFP1:,FܥJJbV,v_M~}A9'|ΒuXDKЭ3xc#ʼn[j]C]VS]'uPY5cN(3GL ++î{˭k ohÀR.fE,[̦M|u+VD@5r[ET}tg801:YZRJ[ppfA47pm+3^KQ\י_"@Sҫwcsv<o7Ǯ'4ҦR,H(NjUqr6>N<AFR?n~fJіm IDAT'LEќXZp,׳E)(l(zM su'VUG0v>挘3jnb4itqǩS EWq1a1b.T#\qY~ ps).\.hh,TffRZ͵kع2bԎL\}UVMjy֝#V)dOzDnƏ};X80sII|v3^ Nm'o{Q=Vؚٲ(t[Sr"* 'b(̎ԊT\sTJ)z{008}3&>%aK8]p.TߩL„mAH@'6[!% 1UGFu+"WD:jʛI)OĜppbcFZ:[ؚ{s{-!ܢn&(s85OKg nĢGČO=jR*8[pH;,ݣ:x ǵk|%@*JS."!m$&Y2b s,X""ssU׉ˏ{|.\dI]¹>F8Ds֪~m;ǣ7s4, t9(U˂ `Z-Lڨ=bBɜy쯸D Zխ1IMazvΏF<@MލvMKMG&ֳ n%=As]7;XXNxDI/LKnĒD挘 U-Upv^dLԭd63b䇇a1b.eh MMAggZ=ō;Y3^ ['ɟ+3VDZԴKSG{411ȺBF!(X?v=_z'8UT+}WE?/we<86;2+p\?o+Lx0A@R*/ >_P J||v &9NJ%r*π :,zx.9Nti-RxCDao_Ow܊5ϋ^ /@r?/MI8SpڶǷ.>O}P'k4e٬ 3H5_cX'/RX?v쬴[~m;, ]ث7VH=U:jBEd 6{8׫fR _ |qhh$&메*VFʕ/~#MI7mR泔ш컱:VZʒge9'bp݄ xİ~z.C:?~;{zu2B^=*qA:t4: Gsn⻼~u˓Y NLtgNYIe&U?19 ^=N{?1ratXǘ=zfJx?#~.xzDuk57S@nN‡9a4J3нh{0Uɿw=qsg3wz{s{~7wrRDQQ H2#SXk REKK×)bY2\\I)Oaْ"u7jh#=kwkw\guQYX1  X߾E E34mdf`צi#1ؠKr0 r451Sm덉+:4g26dIyZRTVlJDzUzr+Z5\JG?"9ƎF9‰~5fwL, _JK8g v۱5e5<V*CYLNANS)Ur=Q][W‘GﺣI՟EQnSʺ{=U132eň{ &y6;8EA@UelK?jJ"5+W?UVI'컱Qk v &6r23hQ?c~E?kXXN\9fx||y0AfƓ(]Vjff]MM&JIm"d/RYMIK>JtRj",A6׌^C}uu?c?U-U18TY.jlfxzQP_@Bq;V[s⪁UEEsnnδdfpBbz53k?E9R) t{azT]5;s~$FP(HB٘*,P lS!G UBH7Y_}].Kc&<bt䵸C61b1r2cA;/NxG GJbyrvh^)Chh.]&.WQ4oho 4Nm  KEIg۵m6jm3zfLq(m*e~llz45Ib')o7TW_u]F~Q*%WINZͥ QƉ* Y )-x(G)tjȬɤˣ:C*>G9qP0 tġ}Z5ؘReEߢ<25b1r)KT4?F*JE,i7*S, AڝF8֛bJJU] ..AubP{47hAȼy:s#5XM$ʜpM}"M`BlrWΗڶZ5$'3Q+nG  KEs6ʌWzc*|p2GqP*Atp5ddM.;cajR)Ι 41ˍfJ;v5\ʒ!+yyIELkj%Z$IQ @on{vvIQ]y7rhԢp\-KQ,D&Aݩ0\Z[m('W?!,@]+6(Z {b}=F%#FAA =ZVYc0a2KgGN5U4|)LȾnfiRJxmxiK=Qd)6h# =I*MQ݀`]:IÜ.8-;, 9e#Ygl'bWnBR\]!4}6XZ<$«{e/ό{WKw::sK5iX/AZqUYYLvp]±RY6>I5Ȫb//JJ /<4r"k,L5z8ғ,N} i 䏰5cяbˏLUCqJ*GTiҔ9Wx?;?v$e2^wڧL~Ĕ~ ni4GEjy!(tGk$-ތi7K{y{e | Ac vMG'6=(M]e,fFEK )}U jF=,BFܫGYQRQzvmm4W1;R|%99DFbbE_eQiep:QNJdO=ssy#2.^B _#GY ztj ;˙*MY=z5* w"`odYMI/>fc#Ee赗Ew:,f冓խ칾&Di-< ^%$^^0&(+крt= KJ-?˅55Lۉ x43 ^PԲ2clJ`jP4Gac#[#J% '?@v_͖-1+"Wc烵HBaL-:11ՠ43dgEӰ6ZխkS t3mg;+z4EϮtTߪ5#?4#0s-umV2g6ϩh +dmĸVxQ^u/O^((yPP1htވT](k^IK%kFAӰ%u AmΘ;g=HMBJxkВ~M~̸gPk)i^srɘ'131ɩZ5p0w9u]W .UV1maa(JU^34R>gW+WG,'.CYEo[o~;;J5#|ԭ\"3w F.VDQwkws?,U,XƢE` CY ۚʏgĎ#?D#0s1#P?}pЉ:d %@8 ILcS&vĜ_<8X8ZнK8qxx5W.[M)鰀$6j-l}PcsܭyyˀWtnHQ"\nn vv<8Vl>i״)ivfѫtR>uQ^f&f:e娕I9 wzF#Fq?/v_KKČ_OOЊZҫْE^ߪn%"ٕ kSkyG%տO#T)[C#ReGv`ԦnuW+WVZEqc1wș32|*6 G޾m?za=;<2I ޑ*}6Ķ~v]WW%OW]ׂ+"XQB* g2cs0i@lp^dBޟzƭԤȌU1 X1&N҅S?d%ە|M]M]7vVihWue'=0aoo&4W}4̄gYbX|v[<3gr4yM)034CAK [4r) l6@?$e'KL;T`τ~t"1(Zۧf풀ʟBP0=`DJR[9`sDnfu;!i~yW[ˊfI<(*2u_q0w`xjkɮֻqOwp6]Tz\٣d{vRR=[AWfe:ؐA{z0a(J>I!€ዉvfؚڲ2z$PߝO Vbb"#IN3[6~<< BnCpᬟg&<#f}|%MŢc+{wO7 BHzX@+"jM|i=-0aL|M-_/z` rvlM3T)*UR&SMJRvu!T#,227ôٽV5v6ޙH<ȑݢrcG'%1ޭݭ>A,kppa'~~fYL M+.q[5 `g:SĦMbM4i!34~z 8ؒ&>ڸ k_Vvfv\`~|ggN:XNR]@{ IDATwl「]ij7[010AW:f5ߎ * 7^VF :M)ZwuYeKQKGsGF.'99|zy|}ziM\[ٜY3?'.@|?7#i \rI2mmYȥ[+풟/Q.Q3)D:G3*×x(ONEV+̓xzL"K"N<1^},PY 'Nb <8A 8qSXw_[_qSCn]pmy⾢"6H{?_AXJlxv#Kw+wvX<}ĐDٌdd"zπ̾ϲ0PuHzX ̄g$;55jIϊ K#R].>* V mY:6l:$̝#k*.ɶNQGSgɌ=^ݱw xvЈn`227r'M XYЦl4vu{U*l(,ҵnFFZ6m_KYiTWaeHgd(lRCUѫu|vXp8~v~zv8ڒs7t=M]Mt(;HNgo^|l|#̍P(}}8S~F<€rC9s 120b~Δa8Y, [=]9^rA*Se8r=J[#{|ÂzN89†Bڔmt:%eۣHA, [$1|KV}ZV==g=| EaؙSCSG-撵ѨxWgj/C=0ЖB{Pw߁ZٖƖfddn5EF&`wnڔm}|'1{Ij:*ڋij02Qbd*`nӁKF&J֍aB7N_l#~GQ ͎ԴՈ ;:Wwkn%& C!*_`(LK~YԸxKu73gP!S`0hQLx_UnH}8E9Gq.jT~,V3C~uԱ t_] ;3;Q(CGk,uuĵpe" 0g腤ǗF.;;AKcKvor7 SF{)n*&: ;lȭec&geEF& 6G~^']|vŸגʹ#؛(q2Ү;9yP(ِtٓ ,$98QzW.RZ/ߎRkIYGE-#2ۙ7גO-bBU_™U$rؗp%.{gߣ;-ʽgG}< _[~b Ah4lWARUGsGjk$Y}#×iYA3{Ĵt/ުa[6>|%mm\OsW3))94w53=`:~Q>Sj_d~Fza=##FylA]ܔ!i$X呄G;Q/XSYJw+wڪHJV>IbtPO٣$2dItXP :U21#[C٣WWGwO7qnqC 's'.GC[%/',ʦǸĐߐϲe}}YI~C>ˣK{Tu$b&#rEFF_tXX(le=ddy%>-WIek%114u6I*6la;3;VEO?Փ've;bwn1X1=ĘN`p^~ {" 4h}|ÉCAq!##ث{=h3C{.fntv5lMm>=ޑ~ѕmOƑ#TRPs/2Wؖ4 #xxì_K}FFrm{-}y&1 Sp. j=Gh8]~z?_1;wwm/k/3g*{֌8Y81/d 4t4zM} &&TVKTuRT c vO"..^AEK2ѣ;;yk*:D/wf-y~ oo$~&4 ;w_ϊ^ۛ~1Gs >,8HwO73gJ_q~p7>P9`OkOI0sh.JkX# B`mbg kXwߧo F#掬_x5CWV4rdRo珓6ea+۱0g gVFt_J}CRKG__2?d>>>6fƃdx h4goM/'NKA T݋Ԝ _ j\4Ns8f;#6mź3tt$0TJyK9--b |qlLh4ʚ)?#\ɒ% `9%NxL MYve;_d}k̕Yi2,fG Ɩ؛jzMן,;IJe s犙+ѩ)>BKWq?[?̍b_55e7t4P\h{4hx${rr21%? N|^=Cܭܹ?~LFuu;w7^9`hl`A<&{J1.Ѭ^F[S[~(A[eCY"#GߐO]{݀132cn\.]\鏼X́D8EHEЖI*#s3",222P!s?{]ΔΏ1y|y쟱5֏'߃€9sI3/Ti7w%%WC B sȦMKiW c:rjshԊ8{O6F9`TuryKiɊ<1 _8DDSZ7p0w`eJjk1K"ҊwgH  sFJEʀ27:E0]z_t,3=)~pVũ$TjԎs0T2o25T\Wm`A8[ҷw'#CEؔIؚ1)'5oT٩~G{<Ń_M~KW S7cb`ZGsGteddGXddnb,pZ9veH"#:=y{<]4 YuY5Y|xC.OBˢ׬z4d  IDATF RR>~YB6ث_GYs'=/nXh#Y3#3@莽2N- ]## _ ~ڛٳ(,X;jb,XacjS"![TRٚWKWZrϰ{xnsKcȐ=[FVCXddnrBC؜y`@C0KdfL̍ٙu~-sj! qNc\)sk?rv=L?&&ŀGCD?x uu, ]Ȍz? .;oގ$m}ql|%! >@N>c&L'`S&;#R%^8/~A2I9zk!>ўH.I\ŹinCF.e(vfw>mG֌(K#n(6rϊ 肀߯^id8Є!tN]qGƨ5jrrٖJƒdQ"NEadoA{3{enピX\,IȬdI 9"#s p{Ŀ잂 0k4 TUnز0Wܥsw g]:#=GFS7f˓>9KF-?sϔaN- V;y9e1Xq0s%׎&JjQO]N} ?xCH&&<4!@;iF>JH Vl7E Vx ID+yv³<3,2K?fٛݹy|ĻŋەрΟ{݋GgQ!:CE7eHJddd w7)kk NҰy;l<= 9sw5[Ҷ ޷KIJȜppr |/@a flLlw+w[ILҀEGKh2_Q{JK;nFFF 111 6nȺups̵SCkw+55׭V$'ccj;=dTg??{R\J}3g0+p[ӮlXɱ^3,lNLQˉq0dn]cM|'2^ciW\L]Gv5ΙwP֨4%Z IrI2͆7SR7|"#ŞI﨧c%pr܁=y{0PNUkƖY-)sF?=fl\F{s4$#d۪iWA3#=G]S\Cek%4bþSS 4w5SZAjU*NX[bjhJVM--D8E`al7.SV͡Ct(;hSqfpY̭<`\d~VΝ;G||Ȝve1L/\>3w"MM->J} AKG8XxP™ JoQH8AU4lo/~ˋ_ _+\Gs. 'ߠQT:Z|C</>xan\9X3,Bh\D i:Ղ5qߝ[9sc!S*z=4PTLIS ͥt:xb?IK@[p! DxZ{&f -bFͮ]Tz{ȲkٚAٝ[8;yܺ\B@V&V|).pgĝ]N5c+ٵ;^>H[cV22f9 7b),fHW!u4"#(].Ȯ&>NU'xZ{2sf|u+JKu +sL@Qc Դאx(Q<Ü9lIBQc3gYF^?zè?HCCq`AggN>!Qq4w™=y{k:ʣ'KO(lS7gGac!>>,jؖ\IK 8K Xvd;IJR> 9tW[9`Ÿ2@9^z\T*%160fVЬ_zt(;(k)j(Q8j*~)m.ZG9ơcVKoofdsf۪td_>LhjdIДGG>kpV,  IJ#-Nbxgĝ*̚LÈscKv;wtsNeWu†B=?$ DjU* ̓RkB*IYh}ҫIJcNМ>Meddn.䒰_!rPF. hhlR%mWs aA} !!|9vv5t.6JH\-\rsmϕ$NJd`u_P{O>#) eRYCK L-' 祰 Y'=`Nb\cp0wzOkOj%UmU?eȜbh{@o%M%$$KVAо;w,Z֧&lƷ;~z)M|N,3˫Ԏ1iWtdnj\Xi|eQpAhOWֻ>%y{iH H<ǩh>?nvo+[BMŴtI)eddnNEFeM 뭂/;cjhzCsr@0A23p&R6+g[ܡˬ/4Mr,*MTX!->!4D ##|m}jȮ c%$٤<&w+w.Ozqt:mݱwR(k)F 07x.|u+9Vr ) -[WRu%fvt;I (33|222}EFH|ݟ͆&F1TjJIg(Q<4!VeC:|y{ijЫУ#;)jɾY6>r"#s vYVj!' Nne~> <61DOٜyv[w15eM>MT<6nm-\FG  ɞ=f4ߋ>,:te`sCٝ3gc#9‰#0;R%:))Ҹ3xh4^3mos3fep ^<;Y@o<8A^IN@@3w3g`22277r"#s seS졢C@A}ȔPkZa_EKŐO9GG> @~C>'=OCGCj41[Y5"Bg gI!!ETUKݐdg'$G?.?VrRG<,גR;pᄇ qagN6m߷)#GmHkISW[ҷʂ<:QFzA `[6@aI}>=ݒg'Gb\c :|.\ -[|z c ,-9TtGsG-1P916Tbmb<9Id-O}mmE 8pDDc0ԦW.O\/ ۪y̻/د7N3C3]?61jWK2^229 (HvKEvm6]7O'`wn=Jfя&m4uMzC0*_k҅VًHChXV _wμ sFsr;>*}NM $aHH!z. ذUW]Uuw].R(D#= 'G~2&!!Hz+392Ϝs+q1 f99Z6| Y^f}z]ũ~.O\NiM)'Oh?[1ML7 EۦRPU0@Fg8>zrsYt 幉ϡ( |yKo^̛Fy~_,7ģcWX1t IDATbXiRDR !o*_QUKY;ImD xqʲhRnae:!n!Fz,N۬}H|2DZN죱#6Z.=ʲ0&h aa힧( go"qw{zIΈ`ְ ttfne}zEWk~bDKI/I?[u}-*/8QqAc53qc̍gs8Guff5;3SB6Z'.:Q\S̿wzEؾc9gXYWauN]c !.\!re^S[M/ҚR-@I-NL{(fϽgl`GK $`3;6˪.MWqCHAUA֋St{'۲Z۲MK@ fR703>ϦMz^\;drdefi& oGo~n+м~(‚ Oւ~rj;w7돯! !N}yd&-Kihj~C-oq!-MqJH$~IGd`Zb-E*EQu *|%c SMB\8$`B( qqGvRXGzI:Njs8U((0"` g=ΦM6$uPAgs>je]A^e,ܘ1 ǿggN bnvG+fƺuZ9]Qu&qOj#+SB0>x2`$ũ>{ъTPUU+*yˠ[XFrak_Yn4/G;Y< y |}k :7 'B&\A!U?]^sY,%5%Z600F&-ACSINyvL7a~0q3d]:*!~7 ǗՖiJjq*UU&BBw 6}aA>)8bGY֥; psXqu1w8F8 .o;ƤImV#=o2q% *ٚ,nV$2f͋-o({z܈4͵gwn<4!M9fV,msUA_SQu%-gV&QmdkVYum2M gXf0:htkjؓ;nayY}[Z,k !.|!7HgKD&,g㰸[t < ##ٞfۣY$چZɯ׾Uiն]Rouz"Cn'-N]wZʇ>dsf6o扱Ot0:0?r>3~y*nt~N~Vk5px9xY|q g3swSXҟb֛1?c,+#VOJQն?gn00W ƴ\rY UU$&s8zx{%s6t5ZM&}3*p=&*wǿ~{s X>N#/ЩCdfStϼy߭QdsfRSϘݩM`4X%-_[7;73G[ў'>!yii ڎ(+/[u׵ v X@@˲yuzm΍g=8x)\!n!]kc0eLfmZ07b.Uq29O[>&0n3~ᳩn&!/#G,DE:o~WVZWU_E|z:=q [dek#&g-{w<;YI'Wע%]sƴvg^IojeWUNlUUr(U_wb,B X>٘TU%$k_F"-rsٕY[1 D{GS|ym==$|9'HHy&oNVꭀu[zV5KڢθE]cAA;3~$;J6?j>O#Gk+Y"-+.MVSܾ?=W}ΝnNw$5|q KpsA7l0suռ=vbTc:02`|s~7w[XOJQ O$ ZוSXU+8 !.8Mjnvn445((x9xB[0&"oɫ //֧'0{eElY2 :}ބNqO=ZchMa TWocƏY3Nr#fB1EޓVskwR @@nx63g' Nhu~|}k:#{F,0v fD~HppuAaoߟ<*ycS#ũ;̑#u$!? lW!_T!!_$`vl8ؒ7v?vir8Rtӧ*S{䵈h&OOxqˋZG_'_q5 fg3F]Kfi&R7tUUYm)ރUIؙ9s*bwnCn׶mLh~ !Ύ!.8zEO[(QQ|-P]_ƴ:ub{39t2K)Mώ?/Ab:EǢؙ)kX+o}>*]h>-it 0!D[>>vшET>u6oٞ]Ky`x IOo;ƃoljO[4'hkJ֬YV;hWjm_K)S5ӯӤ7q+|g:}.fY2LNTUnN&~hcnGm,-j_YmY  !lG!k_vkYEE]v;J݂;5-7fAYezc&7m.8lVY -pcx:x2 bbT,``G'1?*>=)7܄QoDUU^"A.AZ_3 ?~mv #-5Gִ:ޤ71N ?٭ƪr(VYma@VNdrΡwnᳵQ5Gp[O!DȔnzޞPyYnqqq8::ҥK{B\*F&5cWڭ5Bw`c_SxEQ**\ͮ,KXFmCI465j ۧjћG<^Z.:䧇>GڈAgNW J{ܤ6Q~Sy`((L Xii@jR8VxȒ%w}`edH y` S4OX!ztoz.]?]!h`ɗL]=(?aI-tAǿvbcF &ڛw//e ؞1Acm{e=WUِgmG[^UV0EQ67wI}Svcck7pն>N}ɡO.&5u$-Ć mTWqrv[k/++®m( >#8g3ig``2J3,K!F.難`ѢEV_~Osjkk矷:fKlٲiӦ q p 4&m Ȟ=;$cT(X+羏+¯FzG26hpj'$C'GV\ؠ=o:" r$~ m:;>ZAK5Gp]utWUCV ]&hna]XJjJ1G܏ёõ})8BB~eV12 6Gwj˴1 s#8n1N!$.ڿ?:u &`gg?155:í߿y(999[yy7w|pZ'Hjcq\.\}7Hau!o~[SM!5 ˭Hںh2,$ENy7DOq߈r!3gU?OquB`A7Z465jۛ&v⟻i;;*X881ڈVE]ͦy f~B2҆*VZ>}PPP@CCf⡇^矧KRR<:suYYY쏊ɊݞbjBtEg8nlJĆ 27r.N&'~ ˹}ڔu%}ID|zV|r^< ,eQQ\u6b9oo6ogN:v^b~"u0>;sM58ǾT)<=i보eP6mdݹOImbR$FچZ6&7͌lg28emhV{WhsҬnBt,m[omwIX,TVV /0qDyxg;,]Ag <צoTUTǢKz#-ӱ[X܈X<,\}{ǬYk~7wՖ2q%L +Z},B'!$$Uj_{衇=:3xILLrcZoσ>B ,`!.rz_'_ʲn׵/kk _$}G?bth&Nrмn%4e}^<%W]gzJ}qsݽZm?Yqi׉ψ'?_>PЂ룯TbxpGrar#*.;'-kiwG?~`.+-&OdW.V3&,& ޤƞ(?_>>j[l=tQXXZX,zRRRiyu*ȯπ$*5Cyl2*28:u!mCqr29qٖM8Rp9裭˘9#GWq]u8rs#gz*MK gmՅeۖmYpsXy>i`Ossw[,ulN̞=ۻ`={dr"9cPAg՗_s4928~/`Ѕjży?-,Bև{eذa=ԣI/EQOxyy&L`ʕVǬXwwwFq>,E'-2wwڕm ӵ~+ЪJny.f`nt Fm{_q UmycWu<;q}n採wtX#}Yst 8I_,SMтβxXǶ(jқG<ҭ93i tn+h,koҥKX,q/.2V\s=ܹs W^!`G>3ohOwGv)RTOu}5 M m&=nFo~ok:뭪CoP.1?\.{MkJU}x9xqgv-cp8uymRvP:u6o|݌gBvJw-gY"D6n`<:vuV~e>)E)Vͅ)u<¸1FEGV{\^^VN'7ۤɅ|ryL_,*jKjJxmk6[R?iBt Y"EzERU_EFIFv`EN&'Egk>A`EA!4gr{Y}vzIi4S^|Dzl9=WU}Mߣv5BB ,B ?fW z+B؜ 4gڜxbJҬ):F⁑02p6}ꈫlwY²Pcm%l6gnjշwVSq᐀EqASHH:,*ą(-sXHHq?3h5KQTe7UU;m g|x6o",KkX#{Gw뿴B\$`B\TU%2;.˦\+'#*z?y̢/Х>7ֳ$~ ũlNyqq92iVdl`A @BM!DVYͫ_o!u&x9xto^[{f3tOv?uВ[klшE?H“;w2/rKYwVmo`Hnvn]HʗiB\($`BZRPU]|t#^'|Nny. A'u A'HSןU{C|lo}c lڊɉ.g] Fߝgr{uc{ry1F mڮܐEc&ݽCTU2w0 .swLLGLzSOwUfu픛`x:x2"`[2dr⊰+ֿU `6cu\^`U+ׂ\3сsI-Ne{N~bmgu^Gtg'<6mWqnH"1&GLzO{C2Tx Yn!.D.DxEuN_X?1x"zEƴ N_׾gڗ>WPUߜY[I;( W /|@?~ ?pdyچNzEQlڦܐEc]kiBƤ7q+.*Xsd6bogR$ɊZQɜ;&68Yqś9}3-ӹ;N=kvx;z2q%n&N#H"1.==!z@@FP!-pރS`Yo>+Vۋxk[;y uNn6e-5g,; gYAqEcz#.dH"D[}:x4OenNjq*Eɘ fnnw,OXNwVL-'ԥ4WMLgWήznsLLR?> X=*5$ĥb\q/9wppBB.廳.3{'&/y\bo'-={* :\`UX#GP.mY:Վħdz6e-c2+l;wq29iM̃d~|ؘ}oI}|80M*yQs=!zTKzEOZqZOwE^M~WRGcƏWwlJDzGw #=q0!xfg3^ƞ=鵠u+N&'dvRBK,Be r "D!D9%L ё)k8R%c  CIM ~37 #uc_Yaaa '۳ή6#Dž^7DB\*:=E_G_׾|zS*& T9;wC{b/II\v9|-پNUbWήkFI7/h$y[{¨3^Y!Z:>D!έPP6od@ q3 0>>1FW&K[F={5 5 Vt$%٘((\.g<>8|`B]ckײ>b|b>1 !.=!z\sF4 XM17G̋GFIk2?j><1+l~~]zɡIOdmZx};̊Vz}]p+VRV[W3`% X=NLZIcqA0:+W0`v$;jSĮ8nv;fɊ+=)N`DzeG?Ίf~M>}O}bD&Lj5ǾFEƘQ!8[!z_'_LzYYgՖs;Lauվ&>'EϤ7 fs(62"`UvJ-NZmaѭfmZ:HWshrv. XNOvYkRH.LfgNRS=NAaV, V%à3pYV&A7uچZӟF-TĨQVcG og^>,aTU%s fk%;JFU6%,ʹzl֛888=+!.LLx?G?~l~8Zpi0ɡm^F!~M!DDZc<61Y+D7tnt w~G>6imCnf!Ĺ">F˔=`iK%6kW!9'h X{'B\<zǾz7Bq$`B-KQuQDɑZm[st RPH"5uF-6OƺM̏?uז[}-)%,2γ7cgä7a61M=jBG!Da֛ɫ`n;tz>>fcEhѾ~lN笟B!ąJ!DGzI:rv\4MhImcmmpB〥3ZF$`B!I"U|}H/IǨ7RYW((({0͘ V_Mz& ΈQoĨ3!uͧYוk[t,B!D$`B*>> &#MzSUQWݷ7&`)*6BkB΍&j; :_(Mv1ش=!B'Wiy^V[fIb`-mgB!.e!zW+?kvA!$`B*-KkJmҞ^yRP @>6m@ȟe!tQ븘]l>¢Mi&UW٤!b$qsiRVZffJlҎBq1E븘](͔5!VRS.WFiMB!.F!z[N 3;:,Y & ! Xٕ 8v[fl6iO!H"uZ 4vNo+-HJc!5(uN/nޭM((T~+UUU2J3H+NI"B&NK,WUj**QQ9p F۪֔+z:= uuV_Ofi&w= XB俣1Mθ𾡩ҚRJjJ[qMv%PiQArQ2^6vfm,B!D[俣Wr1SCb~"eeڭ%H)e}+nvnx9xaqbv考с+(+ rs-D [V$`B!ZB^ޓ$ 08q1aA?~ٹi7zs8VL**8Q~6coGF?jꫨZk]cMjխ:**(@{hiB!EH!DtUUL;]RW6ԖSQWAYm%5%2 %8g;jvEQo^ )FfiB X;';lƶmv΀y*/^x9x䇛[ARQuM'BI" 3 e-8p6;coȍb_!B\΄B>8 X[O )kYB!&`)ajv?(f !š,BK7kYB!&`)aM,NYB!f!StUmuFLz& NNѡ( F;fQgDQyJw4 =ʄB,BKBGddPTO]cuu465vjNa֛1445`H"Bc!. ޑDzGUUQQkj_=nhj #hh:yzB!ĥG!Z3k\}yBqEB!B^Kn'$44ƌƍ[n:ptt$$$K@oB!H {/:?0_|̜9;wjl۶+h n~i^|>>h\AC סw;u:NtQmm-1<-bʔ)ח~[;nɒ%0}t^x{1.]JMMyrz\AC סw;IEUUU466mPTT45̛7SQQ-[kB!HE̞=ر׿7 @jj*uuu[ۿ{B!HZ6TUUjժv2uTmט1c}/\s %%%X2*SVVf !BqQ yyyz4iFbTTT7|ŋqppࡇBU3>Nw.-%%%ݻf퉮;u:rz-]T%(bSfZTT>|XUE]z1EEE([of۹jDD Mnr&7EDD=@FXѣ`XO0W^ybbbX8**Ͷظq#'N87B!煟~~~=ݍ ,]dXرcVn݊N#88;;;&Lʕ+yGcVX;#Fh}B!U`hSII `0xbX~=_{yشiSNe,\m۶/K/Y1B!B$`|~i֯_OAAaaaw}yVǭ^{G}C=CB!!B!ג‘ 矧u#!!!,]z{+//'$$ '*//899Ûo*\C߿o 3zrmѣG+pssˋo޼yZmp~ر. '''|}}uez0C8^uUөO3`P_x|Ͽ/`P߫?[oiTUUb5 @9rW_N>{~裏TEQPm\cϞ=:gu￯cBIDATQUUCo$EBuvvVx >:|pՑ#GZOjuuyoQ]\\T77V\sk޽(+w}X!󫱱QussS~˗/WEQ٣⋪ZPP_v(O?._rrrTwww5((*`p~\ve1cԦ&m۪UԾ})))rz!v難`ѢEV_~ev@mm-̛7SQQ-[[/v_j\fʔ)V¨ ??_y"󯼼noj{XXǏc„ xzzjM3~y஻b̙L2jZ\sx^EѶϝ; ,\^HquuԩSL0;;;x?{ ]8̘ID#J.@j׮]r*** fu進xrsEGGJVxp8xb={, ǓovY=x@N {1Qnn;w_9؈Gx~<66V}}}Rzz٣2ȑ#ѣG}QQQ~$}qIr3gRSSҢ6=yDH"_4UQQ.UWWK"`a;Ν;:v6m$ۭ>d"IӦM#ߨGS}}fΜJOOWkk?իW}2?лwk׮UBB|2H֬Y߫J 8-~f,9,]T*//׼y9maViio;m<񺺺 Ns!Beddh?\Gz+W̙3uiڶm^Ġ\.W5`LׯWmm>}hI]KZh 544$ȈBh,9Qii*++cCp'ŋUPP$ND;lF=Rcc@p8!F#?ԓ]Ŕ~~*IPBBBBBKuF_ trxĘe˖߃222&zZ~~q\MMMt[sIirrr1`# $622bN8aMXXqݦ.`dfLEE (,Ɛx3N8tߺl੫}ֿ?w1ƘǏT3uTkϟ'x[AA߃#!`|INN6fܹf]-[`p kQXXZ֢(,Ea`- kQXXZ֢(,Ea`- kQXXZ֢(,Ea`- kQXXZ֢(,Ea`- kQXXZ֢(,Ea`- kQXX63oIENDB`ceres-solver-1.13.0/docs/source/solving_faqs.rst0000644000232200023220000001526413140546177022250 0ustar debalancedebalance.. _chapter-solving_faqs: .. default-domain:: cpp .. cpp:namespace:: ceres ======= Solving ======= #. How do I evaluate the Jacobian for a solved problem? Using :func:`Problem::Evaluate`. #. How do I choose the right linear solver? When using the ``TRUST_REGION`` minimizer, the choice of linear solver is an important decision. It affects solution quality and runtime. Here is a simple way to reason about it. 1. For small (a few hundred parameters) or dense problems use ``DENSE_QR``. 2. For general sparse problems (i.e., the Jacobian matrix has a substantial number of zeros) use ``SPARSE_NORMAL_CHOLESKY``. This requires that you have ``SuiteSparse`` or ``CXSparse`` installed. 3. For bundle adjustment problems with up to a hundred or so cameras, use ``DENSE_SCHUR``. 4. For larger bundle adjustment problems with sparse Schur Complement/Reduced camera matrices use ``SPARSE_SCHUR``. This requires that you build Ceres with support for ``SuiteSparse``, ``CXSparse`` or Eigen's sparse linear algebra libraries. If you do not have access to these libraries for whatever reason, ``ITERATIVE_SCHUR`` with ``SCHUR_JACOBI`` is an excellent alternative. 5. For large bundle adjustment problems (a few thousand cameras or more) use the ``ITERATIVE_SCHUR`` solver. There are a number of preconditioner choices here. ``SCHUR_JACOBI`` offers an excellent balance of speed and accuracy. This is also the recommended option if you are solving medium sized problems for which ``DENSE_SCHUR`` is too slow but ``SuiteSparse`` is not available. .. NOTE:: If you are solving small to medium sized problems, consider setting ``Solver::Options::use_explicit_schur_complement`` to ``true``, it can result in a substantial performance boost. If you are not satisfied with ``SCHUR_JACOBI``'s performance try ``CLUSTER_JACOBI`` and ``CLUSTER_TRIDIAGONAL`` in that order. They require that you have ``SuiteSparse`` installed. Both of these preconditioners use a clustering algorithm. Use ``SINGLE_LINKAGE`` before ``CANONICAL_VIEWS``. #. Use :func:`Solver::Summary::FullReport` to diagnose performance problems. When diagnosing Ceres performance issues - runtime and convergence, the first place to start is by looking at the output of ``Solver::Summary::FullReport``. Here is an example .. code-block:: bash ./bin/bundle_adjuster --input ../data/problem-16-22106-pre.txt iter cost cost_change |gradient| |step| tr_ratio tr_radius ls_iter iter_time total_time 0 4.185660e+06 0.00e+00 2.16e+07 0.00e+00 0.00e+00 1.00e+04 0 7.50e-02 3.58e-01 1 1.980525e+05 3.99e+06 5.34e+06 2.40e+03 9.60e-01 3.00e+04 1 1.84e-01 5.42e-01 2 5.086543e+04 1.47e+05 2.11e+06 1.01e+03 8.22e-01 4.09e+04 1 1.53e-01 6.95e-01 3 1.859667e+04 3.23e+04 2.87e+05 2.64e+02 9.85e-01 1.23e+05 1 1.71e-01 8.66e-01 4 1.803857e+04 5.58e+02 2.69e+04 8.66e+01 9.93e-01 3.69e+05 1 1.61e-01 1.03e+00 5 1.803391e+04 4.66e+00 3.11e+02 1.02e+01 1.00e+00 1.11e+06 1 1.49e-01 1.18e+00 Ceres Solver v1.12.0 Solve Report ---------------------------------- Original Reduced Parameter blocks 22122 22122 Parameters 66462 66462 Residual blocks 83718 83718 Residual 167436 167436 Minimizer TRUST_REGION Sparse linear algebra library SUITE_SPARSE Trust region strategy LEVENBERG_MARQUARDT Given Used Linear solver SPARSE_SCHUR SPARSE_SCHUR Threads 1 1 Linear solver threads 1 1 Linear solver ordering AUTOMATIC 22106, 16 Cost: Initial 4.185660e+06 Final 1.803391e+04 Change 4.167626e+06 Minimizer iterations 5 Successful steps 5 Unsuccessful steps 0 Time (in seconds): Preprocessor 0.283 Residual evaluation 0.061 Jacobian evaluation 0.361 Linear solver 0.382 Minimizer 0.895 Postprocessor 0.002 Total 1.220 Termination: NO_CONVERGENCE (Maximum number of iterations reached.) Let us focus on run-time performance. The relevant lines to look at are .. code-block:: bash Time (in seconds): Preprocessor 0.283 Residual evaluation 0.061 Jacobian evaluation 0.361 Linear solver 0.382 Minimizer 0.895 Postprocessor 0.002 Total 1.220 Which tell us that of the total 1.2 seconds, about .3 seconds was spent in the linear solver and the rest was mostly spent in preprocessing and jacobian evaluation. The preprocessing seems particularly expensive. Looking back at the report, we observe .. code-block:: bash Linear solver ordering AUTOMATIC 22106, 16 Which indicates that we are using automatic ordering for the ``SPARSE_SCHUR`` solver. This can be expensive at times. A straight forward way to deal with this is to give the ordering manually. For ``bundle_adjuster`` this can be done by passing the flag ``-ordering=user``. Doing so and looking at the timing block of the full report gives us .. code-block:: bash Time (in seconds): Preprocessor 0.051 Residual evaluation 0.053 Jacobian evaluation 0.344 Linear solver 0.372 Minimizer 0.854 Postprocessor 0.002 Total 0.935 The preprocessor time has gone down by more than 5.5x!. ceres-solver-1.13.0/docs/source/automatic_derivatives.rst0000644000232200023220000002317213140546177024145 0ustar debalancedebalance.. default-domain:: cpp .. cpp:namespace:: ceres .. _chapter-automatic_derivatives: ===================== Automatic Derivatives ===================== We will now consider automatic differentiation. It is a technique that can compute exact derivatives, fast, while requiring about the same effort from the user as is needed to use numerical differentiation. Don't believe me? Well here goes. The following code fragment implements an automatically differentiated ``CostFunction`` for `Rat43 `_. .. code-block:: c++ struct Rat43CostFunctor { Rat43CostFunctor(const double x, const double y) : x_(x), y_(y) {} template bool operator()(const T* parameters, T* residuals) const { const T b1 = parameters[0]; const T b2 = parameters[1]; const T b3 = parameters[2]; const T b4 = parameters[3]; residuals[0] = b1 * pow(1.0 + exp(b2 - b3 * x_), -1.0 / b4) - y_; return true; } private: const double x_; const double y_; }; CostFunction* cost_function = new AutoDiffCostFunction( new Rat43CostFunctor(x, y)); Notice that compared to numeric differentiation, the only difference when defining the functor for use with automatic differentiation is the signature of the ``operator()``. In the case of numeric differentition it was .. code-block:: c++ bool operator()(const double* parameters, double* residuals) const; and for automatic differentiation it is a templated function of the form .. code-block:: c++ template bool operator()(const T* parameters, T* residuals) const; So what does this small change buy us? The following table compares the time it takes to evaluate the residual and the Jacobian for `Rat43` using various methods. ========================== ========= CostFunction Time (ns) ========================== ========= Rat43Analytic 255 Rat43AnalyticOptimized 92 Rat43NumericDiffForward 262 Rat43NumericDiffCentral 517 Rat43NumericDiffRidders 3760 Rat43AutomaticDiff 129 ========================== ========= We can get exact derivatives using automatic differentiation (``Rat43AutomaticDiff``) with about the same effort that is required to write the code for numeric differentiation but only :math:`40\%` slower than hand optimized analytical derivatives. So how does it work? For this we will have to learn about **Dual Numbers** and **Jets** . Dual Numbers & Jets =================== .. NOTE:: Reading this and the next section on implementing Jets is not necessary to use automatic differentiation in Ceres Solver. But knowing the basics of how Jets work is useful when debugging and reasoning about the performance of automatic differentiation. Dual numbers are an extension of the real numbers analogous to complex numbers: whereas complex numbers augment the reals by introducing an imaginary unit :math:`\iota` such that :math:`\iota^2 = -1`, dual numbers introduce an *infinitesimal* unit :math:`\epsilon` such that :math:`\epsilon^2 = 0` . A dual number :math:`a + v\epsilon` has two components, the *real* component :math:`a` and the *infinitesimal* component :math:`v`. Surprisingly, this simple change leads to a convenient method for computing exact derivatives without needing to manipulate complicated symbolic expressions. For example, consider the function .. math:: f(x) = x^2 , Then, .. math:: \begin{align} f(10 + \epsilon) &= (10 + \epsilon)^2\\ &= 100 + 20 \epsilon + \epsilon^2\\ &= 100 + 20 \epsilon \end{align} Observe that the coefficient of :math:`\epsilon` is :math:`Df(10) = 20`. Indeed this generalizes to functions which are not polynomial. Consider an arbitrary differentiable function :math:`f(x)`. Then we can evaluate :math:`f(x + \epsilon)` by considering the Taylor expansion of :math:`f` near :math:`x`, which gives us the infinite series .. math:: \begin{align} f(x + \epsilon) &= f(x) + Df(x) \epsilon + D^2f(x) \frac{\epsilon^2}{2} + D^3f(x) \frac{\epsilon^3}{6} + \cdots\\ f(x + \epsilon) &= f(x) + Df(x) \epsilon \end{align} Here we are using the fact that :math:`\epsilon^2 = 0`. A `Jet `_ is a :math:`n`-dimensional dual number, where we augment the real numbers with :math:`n` infinitesimal units :math:`\epsilon_i,\ i=1,...,n` with the property that :math:`\forall i, j\ :\epsilon_i\epsilon_j = 0`. Then a Jet consists of a *real* part :math:`a` and a :math:`n`-dimensional *infinitesimal* part :math:`\mathbf{v}`, i.e., .. math:: x = a + \sum_j v_{j} \epsilon_j The summation notation gets tedious, so we will also just write .. math:: x = a + \mathbf{v}. where the :math:`\epsilon_i`'s are implict. Then, using the same Taylor series expansion used above, we can see that: .. math:: f(a + \mathbf{v}) = f(a) + Df(a) \mathbf{v}. Similarly for a multivariate function :math:`f:\mathbb{R}^{n}\rightarrow \mathbb{R}^m`, evaluated on :math:`x_i = a_i + \mathbf{v}_i,\ \forall i = 1,...,n`: .. math:: f(x_1,..., x_n) = f(a_1, ..., a_n) + \sum_i D_i f(a_1, ..., a_n) \mathbf{v}_i So if each :math:`\mathbf{v}_i = e_i` were the :math:`i^{\text{th}}` standard basis vector, then, the above expression would simplify to .. math:: f(x_1,..., x_n) = f(a_1, ..., a_n) + \sum_i D_i f(a_1, ..., a_n) \epsilon_i and we can extract the coordinates of the Jacobian by inspecting the coefficients of :math:`\epsilon_i`. Implementing Jets ----------------- In order for the above to work in practice, we will need the ability to evaluate an arbitrary function :math:`f` not just on real numbers but also on dual numbers, but one does not usually evaluate functions by evaluating their Taylor expansions, This is where C++ templates and operator overloading comes into play. The following code fragment has a simple implementation of a ``Jet`` and some operators/functions that operate on them. .. code-block:: c++ template struct Jet { double a; Eigen::Matrix v; }; template Jet operator+(const Jet& f, const Jet& g) { return Jet(f.a + g.a, f.v + g.v); } template Jet operator-(const Jet& f, const Jet& g) { return Jet(f.a - g.a, f.v - g.v); } template Jet operator*(const Jet& f, const Jet& g) { return Jet(f.a * g.a, f.a * g.v + f.v * g.a); } template Jet operator/(const Jet& f, const Jet& g) { return Jet(f.a / g.a, f.v / g.a - f.a * g.v / (g.a * g.a)); } template Jet exp(const Jet& f) { return Jet(exp(f.a), exp(f.a) * f.v); } // This is a simple implementation for illustration purposes, the // actual implementation of pow requires careful handling of a number // of corner cases. template Jet pow(const Jet& f, const Jet& g) { return Jet(pow(f.a, g.a), g.a * pow(f.a, g.a - 1.0) * f.v + pow(f.a, g.a) * log(f.a); * g.v); } With these overloaded functions in hand, we can now call ``Rat43CostFunctor`` with an array of Jets instead of doubles. Putting that together with appropriately initialized Jets allows us to compute the Jacobian as follows: .. code-block:: c++ class Rat43Automatic : public ceres::SizedCostFunction<1,4> { public: Rat43Automatic(const Rat43CostFunctor* functor) : functor_(functor) {} virtual ~Rat43Automatic() {} virtual bool Evaluate(double const* const* parameters, double* residuals, double** jacobians) const { // Just evaluate the residuals if Jacobians are not required. if (!jacobians) return (*functor_)(parameters[0], residuals); // Initialize the Jets ceres::Jet<4> jets[4]; for (int i = 0; i < 4; ++i) { jets[i].a = parameters[0][i]; jets[i].v.setZero(); jets[i].v[i] = 1.0; } ceres::Jet<4> result; (*functor_)(jets, &result); // Copy the values out of the Jet. residuals[0] = result.a; for (int i = 0; i < 4; ++i) { jacobians[0][i] = result.v[i]; } return true; } private: std::unique_ptr functor_; }; Indeed, this is essentially how :class:`AutoDiffCostFunction` works. Pitfalls ======== Automatic differentiation frees the user from the burden of computing and reasoning about the symbolic expressions for the Jacobians, but this freedom comes at a cost. For example consider the following simple functor: .. code-block:: c++ struct Functor { template bool operator()(const T* x, T* residual) const { residual[0] = 1.0 - sqrt(x[0] * x[0] + x[1] * x[1]); return true; } }; Looking at the code for the residual computation, one does not foresee any problems. However, if we look at the analytical expressions for the Jacobian: .. math:: y &= 1 - \sqrt{x_0^2 + x_1^2}\\ D_1y &= -\frac{x_0}{\sqrt{x_0^2 + x_1^2}},\ D_2y = -\frac{x_1}{\sqrt{x_0^2 + x_1^2}} we find that it is an indeterminate form at :math:`x_0 = 0, x_1 = 0`. There is no single solution to this problem. In some cases one needs to reason explicitly about the points where indeterminacy may occur and use alternate expressions using `L'Hopital's rule `_ (see for example some of the conversion routines in `rotation.h `_. In other cases, one may need to regularize the expressions to eliminate these points. ceres-solver-1.13.0/docs/source/installation.rst0000644000232200023220000012511413140546177022252 0ustar debalancedebalance.. _chapter-installation: ============ Installation ============ Getting the source code ======================= .. _section-source: You can start with the `latest stable release `_ . Or if you want the latest version, you can clone the git repository .. code-block:: bash git clone https://ceres-solver.googlesource.com/ceres-solver .. _section-dependencies: Dependencies ============ Ceres relies on a number of open source libraries, some of which are optional. For details on customizing the build process, see :ref:`section-customizing` . - `Eigen `_ 3.2.2 or later **strongly** recommended, 3.1.0 or later **required**. .. NOTE :: Ceres can also use Eigen as a sparse linear algebra library. Please see the documentation for ``EIGENSPARSE`` for more details. - `CMake `_ 2.8.0 or later. **Required on all platforms except for Android.** - `glog `_ 0.3.1 or later. **Recommended** ``glog`` is used extensively throughout Ceres for logging detailed information about memory allocations and time consumed in various parts of the solve, internal error conditions etc. The Ceres developers use it extensively to observe and analyze Ceres's performance. `glog `_ allows you to control its behaviour from the command line. Starting with ``-logtostderr`` you can add ``-v=N`` for increasing values of ``N`` to get more and more verbose and detailed information about Ceres internals. Unfortunately, the current version of `google-glog `_ does not build using the Android NDK. So, Ceres also ships with a minimal replacement of ``glog`` called ``miniglog`` that can be enabled with the ``MINIGLOG`` build option. So, in an attempt to reduce dependencies, it is tempting to use `miniglog` on platforms other than Android. While there is nothing preventing the user from doing so, we strongly recommend against it. ``miniglog`` has worse performance than ``glog`` and is much harder to control and use. .. NOTE :: If you are compiling ``glog`` from source, please note that currently, the unit tests for ``glog`` (which are enabled by default) do not compile against a default build of ``gflags`` 2.1 as the gflags namespace changed from ``google::`` to ``gflags::``. A patch to fix this is available from `here `_. - `gflags `_. Needed to build examples and tests. - `SuiteSparse `_. Needed for solving large sparse linear systems. **Optional; strongly recomended for large scale bundle adjustment** - `CXSparse `_. Similar to ``SuiteSparse`` but simpler and slower. CXSparse has no dependencies on ``LAPACK`` and ``BLAS``. This makes for a simpler build process and a smaller binary. **Optional** - `BLAS `_ and `LAPACK `_ routines are needed by ``SuiteSparse``, and optionally used by Ceres directly for some operations. On ``UNIX`` OSes other than Mac OS X we recommend `ATLAS `_, which includes ``BLAS`` and ``LAPACK`` routines. It is also possible to use `OpenBLAS `_ . However, one needs to be careful to `turn off the threading `_ inside ``OpenBLAS`` as it conflicts with use of threads in Ceres. Mac OS X ships with an optimized ``LAPACK`` and ``BLAS`` implementation as part of the ``Accelerate`` framework. The Ceres build system will automatically detect and use it. For Windows things are much more complicated. `LAPACK For Windows `_ has detailed instructions.. **Optional but required for** ``SuiteSparse``. .. _section-linux: Linux ===== We will use `Ubuntu `_ as our example linux distribution. .. NOTE:: Up to at least Ubuntu 14.04, the SuiteSparse package in the official package repository (built from SuiteSparse v3.4.0) **cannot** be used to build Ceres as a *shared* library. Thus if you want to build Ceres as a shared library using SuiteSparse, you must perform a source install of SuiteSparse or use an external PPA (see `bug report here `_). It is recommended that you use the current version of SuiteSparse (4.2.1 at the time of writing). Start by installing all the dependencies. .. code-block:: bash # CMake sudo apt-get install cmake # google-glog + gflags sudo apt-get install libgoogle-glog-dev # BLAS & LAPACK sudo apt-get install libatlas-base-dev # Eigen3 sudo apt-get install libeigen3-dev # SuiteSparse and CXSparse (optional) # - If you want to build Ceres as a *static* library (the default) # you can use the SuiteSparse package in the main Ubuntu package # repository: sudo apt-get install libsuitesparse-dev # - However, if you want to build Ceres as a *shared* library, you must # add the following PPA: sudo add-apt-repository ppa:bzindovic/suitesparse-bugfix-1319687 sudo apt-get update sudo apt-get install libsuitesparse-dev We are now ready to build, test, and install Ceres. .. code-block:: bash tar zxf ceres-solver-1.13.0.tar.gz mkdir ceres-bin cd ceres-bin cmake ../ceres-solver-1.13.0 make -j3 make test # Optionally install Ceres, it can also be exported using CMake which # allows Ceres to be used without requiring installation, see the documentation # for the EXPORT_BUILD_DIR option for more information. make install You can also try running the command line bundling application with one of the included problems, which comes from the University of Washington's BAL dataset [Agarwal]_. .. code-block:: bash bin/simple_bundle_adjuster ../ceres-solver-1.13.0/data/problem-16-22106-pre.txt This runs Ceres for a maximum of 10 iterations using the ``DENSE_SCHUR`` linear solver. The output should look something like this. .. code-block:: bash iter cost cost_change |gradient| |step| tr_ratio tr_radius ls_iter iter_time total_time 0 4.185660e+06 0.00e+00 1.09e+08 0.00e+00 0.00e+00 1.00e+04 0 7.59e-02 3.37e-01 1 1.062590e+05 4.08e+06 8.99e+06 5.36e+02 9.82e-01 3.00e+04 1 1.65e-01 5.03e-01 2 4.992817e+04 5.63e+04 8.32e+06 3.19e+02 6.52e-01 3.09e+04 1 1.45e-01 6.48e-01 3 1.899774e+04 3.09e+04 1.60e+06 1.24e+02 9.77e-01 9.26e+04 1 1.43e-01 7.92e-01 4 1.808729e+04 9.10e+02 3.97e+05 6.39e+01 9.51e-01 2.78e+05 1 1.45e-01 9.36e-01 5 1.803399e+04 5.33e+01 1.48e+04 1.23e+01 9.99e-01 8.33e+05 1 1.45e-01 1.08e+00 6 1.803390e+04 9.02e-02 6.35e+01 8.00e-01 1.00e+00 2.50e+06 1 1.50e-01 1.23e+00 Ceres Solver v1.13.0 Solve Report ---------------------------------- Original Reduced Parameter blocks 22122 22122 Parameters 66462 66462 Residual blocks 83718 83718 Residual 167436 167436 Minimizer TRUST_REGION Dense linear algebra library EIGEN Trust region strategy LEVENBERG_MARQUARDT Given Used Linear solver DENSE_SCHUR DENSE_SCHUR Threads 1 1 Linear solver threads 1 1 Linear solver ordering AUTOMATIC 22106, 16 Cost: Initial 4.185660e+06 Final 1.803390e+04 Change 4.167626e+06 Minimizer iterations 6 Successful steps 6 Unsuccessful steps 0 Time (in seconds): Preprocessor 0.261 Residual evaluation 0.082 Jacobian evaluation 0.412 Linear solver 0.442 Minimizer 1.051 Postprocessor 0.002 Total 1.357 Termination: CONVERGENCE (Function tolerance reached. |cost_change|/cost: 1.769766e-09 <= 1.000000e-06) .. section-osx: Mac OS X ======== .. NOTE:: Ceres will not compile using Xcode 4.5.x (Clang version 4.1) due to a bug in that version of Clang. If you are running Xcode 4.5.x, please update to Xcode >= 4.6.x before attempting to build Ceres. On OS X, you can either use `MacPorts `_ or `Homebrew `_ to install Ceres Solver. If using `MacPorts `_, then .. code-block:: bash sudo port install ceres-solver will install the latest version. If using `Homebrew `_ and assuming that you have the ``homebrew/science`` [#f1]_ tap enabled, then .. code-block:: bash brew install ceres-solver will install the latest stable version along with all the required dependencies and .. code-block:: bash brew install ceres-solver --HEAD will install the latest version in the git repo. You can also install each of the dependencies by hand using `Homebrew `_. There is no need to install ``BLAS`` or ``LAPACK`` separately as OS X ships with optimized ``BLAS`` and ``LAPACK`` routines as part of the `vecLib `_ framework. .. code-block:: bash # CMake brew install cmake # google-glog and gflags brew install glog # Eigen3 brew install eigen # SuiteSparse and CXSparse brew install suite-sparse We are now ready to build, test, and install Ceres. .. code-block:: bash tar zxf ceres-solver-1.13.0.tar.gz mkdir ceres-bin cd ceres-bin cmake ../ceres-solver-1.13.0 make -j3 make test # Optionally install Ceres, it can also be exported using CMake which # allows Ceres to be used without requiring installation, see the # documentation for the EXPORT_BUILD_DIR option for more information. make install Like the Linux build, you should now be able to run ``bin/simple_bundle_adjuster``. .. rubric:: Footnotes .. [#f1] Ceres and many of its dependencies are in `homebrew/science `_ tap. So, if you don't have this tap enabled, then you will need to enable it as follows before executing any of the commands in this section. .. code-block:: bash brew tap homebrew/science .. _section-windows: Windows ======= .. NOTE:: If you find the following CMake difficult to set up, then you may be interested in a `Microsoft Visual Studio wrapper `_ for Ceres Solver by Tal Ben-Nun. On Windows, we support building with Visual Studio 2010 or newer. Note that the Windows port is less featureful and less tested than the Linux or Mac OS X versions due to the lack of an officially supported way of building SuiteSparse and CXSparse. There are however a number of unofficial ways of building these libraries. Building on Windows also a bit more involved since there is no automated way to install dependencies. .. NOTE:: Using ``google-glog`` & ``miniglog`` with windows.h. The windows.h header if used with GDI (Graphics Device Interface) defines ``ERROR``, which conflicts with the definition of ``ERROR`` as a LogSeverity level in ``google-glog`` and ``miniglog``. There are at least two possible fixes to this problem: #. Use ``google-glog`` and define ``GLOG_NO_ABBREVIATED_SEVERITIES`` when building Ceres and your own project, as documented `here `__. Note that this fix will not work for ``miniglog``, but use of ``miniglog`` is strongly discouraged on any platform for which ``google-glog`` is available (which includes Windows). #. If you do not require GDI, then define ``NOGDI`` **before** including windows.h. This solution should work for both ``google-glog`` and ``miniglog`` and is documented for ``google-glog`` `here `__. #. Make a toplevel directory for deps & build & src somewhere: ``ceres/`` #. Get dependencies; unpack them as subdirectories in ``ceres/`` (``ceres/eigen``, ``ceres/glog``, etc) #. ``Eigen`` 3.1 (needed on Windows; 3.0.x will not work). There is no need to build anything; just unpack the source tarball. #. ``google-glog`` Open up the Visual Studio solution and build it. #. ``gflags`` Open up the Visual Studio solution and build it. #. (Experimental) ``SuiteSparse`` Previously SuiteSparse was not available on Windows, recently it has become possible to build it on Windows using the `suitesparse-metis-for-windows `_ project. If you wish to use ``SuiteSparse``, follow their instructions for obtaining and building it. #. (Experimental) ``CXSparse`` Previously CXSparse was not available on Windows, there are now several ports that enable it to be, including: `[1] `_ and `[2] `_. If you wish to use ``CXSparse``, follow their instructions for obtaining and building it. #. Unpack the Ceres tarball into ``ceres``. For the tarball, you should get a directory inside ``ceres`` similar to ``ceres-solver-1.3.0``. Alternately, checkout Ceres via ``git`` to get ``ceres-solver.git`` inside ``ceres``. #. Install ``CMake``, #. Make a dir ``ceres/ceres-bin`` (for an out-of-tree build) #. Run ``CMake``; select the ``ceres-solver-X.Y.Z`` or ``ceres-solver.git`` directory for the CMake file. Then select the ``ceres-bin`` for the build dir. #. Try running ``Configure``. It won't work. It'll show a bunch of options. You'll need to set: #. ``EIGEN_INCLUDE_DIR_HINTS`` #. ``GLOG_INCLUDE_DIR_HINTS`` #. ``GLOG_LIBRARY_DIR_HINTS`` #. ``GFLAGS_INCLUDE_DIR_HINTS`` #. ``GFLAGS_LIBRARY_DIR_HINTS`` #. (Optional) ``SUITESPARSE_INCLUDE_DIR_HINTS`` #. (Optional) ``SUITESPARSE_LIBRARY_DIR_HINTS`` #. (Optional) ``CXSPARSE_INCLUDE_DIR_HINTS`` #. (Optional) ``CXSPARSE_LIBRARY_DIR_HINTS`` to the appropriate directories where you unpacked/built them. If any of the variables are not visible in the ``CMake`` GUI, create a new entry for them. We recommend using the ``_(INCLUDE/LIBRARY)_DIR_HINTS`` variables rather than setting the ``_INCLUDE_DIR`` & ``_LIBRARY`` variables directly to keep all of the validity checking, and to avoid having to specify the library files manually. #. You may have to tweak some more settings to generate a MSVC project. After each adjustment, try pressing Configure & Generate until it generates successfully. #. Open the solution and build it in MSVC To run the tests, select the ``RUN_TESTS`` target and hit **Build RUN_TESTS** from the build menu. Like the Linux build, you should now be able to run ``bin/simple_bundle_adjuster``. Notes: #. The default build is Debug; consider switching it to release mode. #. Currently ``system_test`` is not working properly. #. CMake puts the resulting test binaries in ``ceres-bin/examples/Debug`` by default. #. The solvers supported on Windows are ``DENSE_QR``, ``DENSE_SCHUR``, ``CGNR``, and ``ITERATIVE_SCHUR``. #. We're looking for someone to work with upstream ``SuiteSparse`` to port their build system to something sane like ``CMake``, and get a fully supported Windows port. .. _section-android: Android ======= Download the ``Android NDK`` version ``r9d`` or later. Run ``ndk-build`` from inside the ``jni`` directory. Use the ``libceres.a`` that gets created. .. _section-ios: iOS === .. NOTE:: You need iOS version 7.0 or higher to build Ceres Solver. To build Ceres for iOS, we need to force ``CMake`` to find the toolchains from the iOS SDK instead of using the standard ones. For example: .. code-block:: bash cmake \ -DCMAKE_TOOLCHAIN_FILE=../ceres-solver/cmake/iOS.cmake \ -DEIGEN_INCLUDE_DIR=/path/to/eigen/header \ -DIOS_PLATFORM= \ ``PLATFORM`` can be: ``OS``, ``SIMULATOR`` or ``SIMULATOR64``. You can build for ``OS`` (``armv7``, ``armv7s``, ``arm64``), ``SIMULATOR`` (``i386``) or ``SIMULATOR64`` (``x86_64``) separately and use ``lipo`` to merge them into one static library. See ``cmake/iOS.cmake`` for more options. After building, you will get a ``libceres.a`` library, which you will need to add to your Xcode project. The default CMake configuration builds a bare bones version of Ceres Solver that only depends on Eigen (``MINIGLOG`` is compiled into Ceres if it is used), this should be sufficient for solving small to moderate sized problems (No ``SPARSE_SCHUR``, ``SPARSE_NORMAL_CHOLESKY`` linear solvers and no ``CLUSTER_JACOBI`` and ``CLUSTER_TRIDIAGONAL`` preconditioners). If you decide to use ``LAPACK`` and ``BLAS``, then you also need to add ``Accelerate.framework`` to your Xcode project's linking dependency. .. _section-customizing: Customizing the build ===================== It is possible to reduce the libraries needed to build Ceres and customize the build process by setting the appropriate options in ``CMake``. These options can either be set in the ``CMake`` GUI, or via ``-D