pax_global_header00006660000000000000000000000064147377667220014537gustar00rootroot0000000000000052 comment=a8d7e0ae7dfd31a7f76b630d2ca3a059b1237391 coinor-ipopt-3.14.17/000077500000000000000000000000001473776672200143365ustar00rootroot00000000000000coinor-ipopt-3.14.17/.coin-or/000077500000000000000000000000001473776672200157625ustar00rootroot00000000000000coinor-ipopt-3.14.17/.coin-or/Dependencies000066400000000000000000000003601473776672200202720ustar00rootroot00000000000000ThirdParty/ASL https://github.com/coin-or-tools/ThirdParty-ASL stable/2.0 ThirdParty/HSL https://github.com/coin-or-tools/ThirdParty-HSL stable/2.2 ThirdParty/Mumps https://github.com/coin-or-tools/ThirdParty-Mumps stable/3.0 coinor-ipopt-3.14.17/.coin-or/config.yml000066400000000000000000000043171473776672200177570ustar00rootroot00000000000000Description: Slug: Ipopt ShortName: Ipopt LongName: ShortDescription: A solver for general large-scale nonlinear continuous optimization. LongDescription: |2 "Ipopt is an open-source solver for large-scale nonlinear continuous optimization. It can be used from modeling environments, such as AIMMS, AMPL, GAMS, or Matlab, and it is also available as callable library with interfaces to C++, C, Fortran, Java, and R. Ipopt uses an interior point method, together with a filter linear search procedure." Manager: Andreas Waechter Homepage: https://github.com/coin-or/Ipopt License: Eclipse Public License 2.0 LicenseURL: http://www.opensource.org/licenses/EPL-2.0 Appveyor: Slug: ipopt-5qaur Language: - C++ Categories: - Optimization deterministic nonlinear Dependencies: - Description: ThirdParty wrapper for building ASL URL: https://github.com/coin-or-tools/ThirdParty-ASL Version: 2.0 Required: Recommended - Description: ThirdParty wrapper for building Mumps URL: https://github.com/coin-or-tools/ThirdParty-Mumps Version: 3.0 Required: Recommended - Description: ThirdParty wrapper for building HSL codes URL: https://github.com/coin-or-tools/ThirdParty-HSL Version: 2.2 Required: Recommended - Description: Parallel Sparse Direct Solver from Pardiso-Project URL: http://www.pardiso-project.org/ Required: Recommended - Description: Parallel Sparse Direct Solver from Intel MKL URL: https://software.intel.com/content/www/us/en/develop/tools/math-kernel-library.html Required: Optional - Description: Watson Sparse Matrix Package URL: http://researcher.ibm.com/view_project.php?id=1426 Required: Optional - Description: Basic Linear Algebra Subroutines (BLAS) URL: http://www.netlib.org/blas Required: Required - Description: Linear Algebra Package (LAPACK) URL: http://www.netlib.org/lapack Required: Required DevelopmentStatus: activityStatus: Active maturityLevel: 5 testedPlatforms: - operatingSystem: Linux compiler: gcc - operatingSystem: macOS compiler: - gcc - clang - operatingSystem: Microsoft Windows with MSys2 compiler: - gcc - cl+ifort - icl+ifort coinor-ipopt-3.14.17/.coin-or/projDesc.xml000066400000000000000000000073111473776672200202570ustar00rootroot00000000000000 Ipopt Ipopt is an open-source solver for large-scale nonlinear continuous optimization. It can be used from modeling environments, such as AIMMS, AMPL, GAMS, or Matlab, and it is also available as callable library with interfaces to C++, C, Fortran, Java, and R. Ipopt uses an interior point method, together with a filter linear search procedure. A solver for general large-scale nonlinear continuous optimization. Andreas Waechter https://github.com/coin-or/Ipopt Eclipse Public License http://opensource.org/licenses/EPL-2.0 Blas http://www.netlib.org/blas Required (any implementation) Lapack http://www.netlib.org/lapack Required (any implementation) Ampl Solver Library http://www.netlib.org/ampl/solvers Optional A sparse linear solver (MA27, MA57, HSL_MA86, HSL_MA97, WSMP, Pardiso, MUMPS, SPRAL) Required (at least one) C++ Active 5 Microsoft Windows with MSYS2/MinGW g++ Microsoft Windows with MSYS2 cl Microsoft Windows with MSYS2 icl+ifort Linux g++ macOS g++ macOS clang Optimization deterministic nonlinear https://coin-or.github.io/Ipopt https://github.com/coin-or/Ipopt https://github.com/coin-or/Ipopt/releases https://github.com/coin-or/Ipopt/discussions coinor-ipopt-3.14.17/.gitattributes000066400000000000000000000002621473776672200172310ustar00rootroot00000000000000# Set the default behavior, in case people don't have core.autocrlf set. # This should usually take care of everything, but to be sure, we setup # extra rules below. * text=auto coinor-ipopt-3.14.17/.github/000077500000000000000000000000001473776672200156765ustar00rootroot00000000000000coinor-ipopt-3.14.17/.github/FUNDING.yml000066400000000000000000000001011473776672200175030ustar00rootroot00000000000000# These are supported funding model platforms github: [coin-or] coinor-ipopt-3.14.17/.travis.yml000066400000000000000000000157751473776672200164660ustar00rootroot00000000000000language: cpp git: depth: 3 matrix: include: - os: linux dist: focal addons: apt: packages: - gfortran - liblapack-dev - libmetis-dev - libhwloc-dev - libudev-dev - cppcheck env: ENABLEDEBUG=true CPPCHECK=true - os: linux dist: focal addons: apt: packages: - gfortran - liblapack64-dev - cppcheck env: INT64=true CPPCHECK=true - os: linux dist: bionic addons: apt: packages: - gfortran - liblapack-dev - libmetis-dev env: SINGLEPRECISION=true - os: linux dist: xenial addons: apt: packages: - gfortran - liblapack-dev - libmetis-dev - libhwloc-dev env: VISHIDDEN=true - os: freebsd env: NOF77=true addons: pkg: - lapack - gcc10-devel - os: linux arch: arm64 addons: apt: packages: - gfortran - liblapack-dev - libmetis-dev - libhwloc-dev - os: linux arch: ppc64le addons: apt: packages: - gfortran - liblapack-dev - libmetis-dev - libhwloc-dev - os: linux arch: s390x addons: apt: packages: - gfortran - liblapack-dev - libmetis-dev - libhwloc-dev - os: osx osx_image: xcode11.3 env: OSX=10.14 VISHIDDEN=true compiler: clang - os: osx osx_image: xcode11 env: OSX=10.14 VISHIDDEN=true NOF77=true compiler: clang - os: osx osx_image: xcode11.6 env: OSX=10.15 ENABLEDEBUG=true compiler: clang - os: osx osx_image: xcode12.5 env: OSX=11 SINGLEPRECISION=true compiler: clang before_script: - export VISHIDDEN=${VISHIDDEN:-false} - export NOF77=${NOF77:-false} - export ENABLEDEBUG=${ENABLEDEBUG:-false} - export SINGLEPRECISION=${SINGLEPRECISION:-false} - export INT64=${INT64:-false} - export CPPCHECK=${CPPCHECK:-false} - > if [[ "$TRAVIS_OS_NAME" == "osx" ]] && ! $NOF77; then brew update; brew install bash gcc metis hwloc; $SINGLEPRECISION && brew install lapack; if [[ "$OSX" == 10.14 ]] ; then export CC=gcc-11 ; export CXX=g++-11 ; elif [[ "$OSX" == 10.15 ]] ; then export CC=gcc-11 ; export CXX=g++-11 ; elif [[ "$OSX" == 11 ]] ; then export CC=gcc-11 ; export CXX=g++-11 ; fi ; $CC --version; $CXX --version; gfortran --version; fi ; if [[ "$TRAVIS_OS_NAME" == "freebsd" ]] ; then export CC=gcc ; export CXX=g++ ; $CC --version; $CXX --version fi script: # macOS VecLib doesn't work for single-precision routines (https://github.com/mcg1969/vecLibFort) - use homebrew lapack instead - > if $NOF77 || $SINGLEPRECISION || $INT64 ; then echo "Skipping Spral build." ; else git clone --depth 1 --branch master https://github.com/ralna/spral.git && pushd spral && ./autogen.sh && if [[ "$TRAVIS_OS_NAME" == "osx" ]] ; then CFLAGS=-fPIC CXXFLAGS=-fPIC FFLAGS=-fPIC FCFLAGS=-fPIC ./configure --prefix ${HOME}/spral --with-metis="-L/usr/local/Cellar/metis/5.1.0/lib -lmetis" --with-metic-inc-dir=/usr/local/Cellar/metis/5.1.0/include ; else CFLAGS=-fPIC CXXFLAGS=-fPIC FFLAGS=-fPIC FCFLAGS=-fPIC ./configure --prefix ${HOME}/spral ; fi && make install && popd ; fi - > mkdir -p $HOME/install/share && touch $HOME/install/share/config.site ; ( $NOF77 && echo enable_f77=no ; $ENABLEDEBUG && ( echo enable_debug=yes ; echo with_ipopt_checklevel=5 ; echo with_ipopt_verbosity=5 ) ; $SINGLEPRECISION && echo "with_precision=single" ; $SINGLEPRECISION && [[ "$TRAVIS_OS_NAME" == "osx" ]] && ! $NOF77 && echo "with_lapack=\"-L/usr/local/opt/lapack/lib -llapack -lblas\"" ; $INT64 && echo "with_intsize=64" ; [[ -d $HOME/spral ]] && echo "with_spral_cflags=-I${HOME}/spral/include" ; [[ -d $HOME/spral ]] && [[ "$TRAVIS_OS_NAME" == "linux" ]] && echo "with_spral_lflags=\"-L${HOME}/spral/lib -lspral -lgfortran -lhwloc -lm -lmetis -llapack -lblas -fopenmp\"" ; [[ -d $HOME/spral ]] && [[ "$TRAVIS_OS_NAME" == "osx" ]] && echo "with_spral_lflags=\"-L${HOME}/spral/lib -lspral -lgfortran -L/usr/local/Cellar/hwloc/2.5.0/lib -lhwloc -lm -L/usr/local/Cellar/metis/5.1.0/lib -lmetis -framework Accelerate -fopenmp\"" ; [[ "$TRAVIS_OS_NAME" == "osx" ]] && ( echo "with_metis_cflags=-I/usr/local/Cellar/metis/5.1.0/include" ; echo "with_metis_lflags=\"-L/usr/local/Cellar/metis/5.1.0/lib -lmetis\"" ) ; ) > $HOME/install/share/config.site ; cat $HOME/install/share/config.site - > if [[ "$TRAVIS_OS_NAME" == "freebsd" ]] ; then echo "Skipping ASL build." ; else git clone --depth 1 https://github.com/coin-or-tools/ThirdParty-ASL ; pushd ThirdParty-ASL && ./get.ASL && ./configure --prefix=$HOME/install && make && make install && popd ; fi - > if $NOF77 ; then echo "Skipping Mumps build." ; else git clone --depth 1 https://github.com/coin-or-tools/ThirdParty-Mumps ; pushd ThirdParty-Mumps && ./get.Mumps && ./configure --prefix=$HOME/install && make && make install && popd ; fi - mkdir build - pushd build - export ADD_CFLAGS="-Wall -Wextra -Werror" - export ADD_CXXFLAGS="-Wall -Wextra -Werror" - if $VISHIDDEN ; then ADD_CFLAGS="$ADD_CFLAGS -fvisibility=hidden" ; fi - if $VISHIDDEN ; then ADD_CXXFLAGS="$ADD_CXXFLAGS -fvisibility=hidden" ; fi - ../configure --prefix=$HOME/install - make - export OMP_CANCELLATION=TRUE - > if $NOF77 ; then echo "skip test as no linear solver" ; else make test || exit 1 ; if [[ -d $HOME/spral ]] ; then echo "linear_solver mumps" > test/ipopt.opt ; make test ; fi fi - make install - pushd examples/Cpp_example - make - if ! $NOF77 ; then ./cpp_example ; fi - popd - pushd examples/hs071_c - make - if ! $NOF77 ; then ./hs071_c ; fi - popd - pushd examples/hs071_cpp - make - if ! $NOF77 ; then ./hs071_cpp ; fi - popd - if ! $NOF77 ; then pushd examples/hs071_f && make && ./hs071_f && popd ; fi - pushd examples/ScalableProblems - make - if ! $NOF77 ; then ./solve_problem MBndryCntrl1 10 ; fi - popd - pushd examples/recursive_nlp - make - if ! $NOF77 ; then ./recursive_nlp ; fi - popd - pushd contrib/sIPOPT/examples/parametric_cpp - make - if ! $NOF77 ; then ./parametric_driver ; fi - popd - pushd contrib/sIPOPT/examples/parametric_dsdp_cpp - make - if ! $NOF77 ; then ./parametric_dsdp_driver ; fi - popd - pushd contrib/sIPOPT/examples/redhess_cpp - make - if ! $NOF77 ; then ./redhess_cpp ; fi - popd - if $CPPCHECK ; then make cppcheck ; fi after_failure: - find . -name config.log -exec tail -n 1000 {} \; coinor-ipopt-3.14.17/AUTHORS000066400000000000000000000104251473776672200154100ustar00rootroot00000000000000Main authors: Andreas Waechter, project leader (IBM) Carl Laird (IBM, Carnegie Mellon University) Contributors: - Yoshiaki Kawajiri (Carnegie Mellon Univeristy): First version of Latex documentation file Docs/documentation.tex - Olaf Schenk (University of Basel): Modifications to the PARDISO interface in the files Algorithm/LinearSolvers/IpPardisoSolverInterface.cpp Algorithm/LinearSolvers/IpPardisoSolverInterface.hpp - Michael Hagemann (University of Basel): MA57 interface Algorithm/LinearSolvers/IpMa57SolverInterface.cpp Algorithm/LinearSolvers/IpMa57SolverInterface.hpp - Damien Hocking (KBC Advanced Technologies) MUMPS interface Algorithm/LinearSolvers/IpMumpsSolverInterface.cpp Algorithm/LinearSolvers/IpMumpsSolverInterface.hpp - Jon Lee (IBM Research) example nl file (writting by hand) for unitTest Test/mytoy.nl - Peter Carbonetto (University of British Columbia) Matlab interface [removed from Ipopt source as unmaintained] - Rafael de Pelegrini Soares (VRTech Industrial Technologies) and Tong Kewei (Beihang University, Beijing) Java interface files contrib/JavaInterface src/Interfaces/IpStdJInterface.cpp src/Interfaces/Ipopt.java examples/hs071_java/HS071.java examples/ScalableProblems_java/*.java - Lifeng Chen/Zaiwen Wen (Columbia University) Changes and additions to the implementation of the Chen-Goldfarb penalty function algorithm src/contrib/CGPenalty/IpCGPenaltyCq.cpp src/contrib/CGPenalty/IpCGPenaltyCq.hpp src/contrib/CGPenalty/IpCGPenaltyData.cpp src/contrib/CGPenalty/IpCGPenaltyData.hpp src/contrib/CGPenalty/IpCGPenaltyLSAcceptor.cpp src/contrib/CGPenalty/IpCGPenaltyLSAcceptor.hpp src/contrib/CGPenalty/IpCGPenaltyRegOp.cpp src/contrib/CGPenalty/IpCGPenaltyRegOp.hpp src/contrib/CGPenalty/IpCGPerturbationHandler.cpp src/contrib/CGPenalty/IpCGPerturbationHandler.hpp src/contrib/CGPenalty/IpCGSearchDirCalc.cpp src/contrib/CGPenalty/IpCGSearchDirCalc.hpp src/contrib/CGPenalty/IpPiecewisePenalty.cpp src/contrib/CGPenalty/IpPiecewisePenalty.hpp - Stefan Vigerske (GAMS) Dynamic loading of linear solver shared libraries src/Common/IpLibraryLoader.hpp src/Common/IpLibraryLoader.cpp HSL and Pardiso interface files - Marcel Roelofs (AIMMS) MSVC project files for Intel Fortran compiler, creating a DLL [removed from Ipopt source as unmaintained] - Jonathan Hogg (STFC Rutherford Appleton Laboratory) MA77 interface src/Algorithm/LinearSolvers/hsl_ma77d.h src/Algorithm/LinearSolvers/IpMa77SolverInterface.hpp src/Algorithm/LinearSolvers/IpMa77SolverInterface.cpp MA86 interface src/Algorithm/LinearSolvers/hsl_ma86d.h src/Algorithm/LinearSolvers/hsl_mc68i.h src/Algorithm/LinearSolvers/IpMa86SolverInterface.hpp src/Algorithm/LinearSolvers/IpMa86SolverInterface.cpp MA97 interface src/Algorithm/LinearSolvers/hsl_ma97d.h src/Algorithm/LinearSolvers/IpMa97SolverInterface.hpp src/Algorithm/LinearSolvers/IpMa97SolverInterface.cpp - Hans Pirnay (RWTH Aachen) Rodrigo Lopez-Negrete (Carnegie Mellon University) Sensitivity Based on IPOPT contrib/sIPOPT (formerly called contrib/AsNMPC) - Jelmer Ypma (University College London) R interface with examples, all files in directory (and subdirectory of) contrib/RInterface - Tony Kelman (Berkeley) improvements to Matlab interface Ipopt/contrib/MatlabInterface - Gabriel Hackebeil improved use compound component spaces - Nai-Yuan Chiang and Victor M. Zavala Tejeda (Argonne National Laboratory) inertia free curvature test in solution of primal-dual system (full approach) - Brad Bell recursive NLP example examples/recursive_nlp/recursive_nlp.cpp - Mitchell Clement support for use of single-precision floating point number many source files affected, see https://github.com/coin-or/Ipopt/pull/428 - Byron Tasseff (LANL, University of Michigan) Spral interface src/Algorithm/LinearSolvers/IpSpralSolverInterface.hpp src/Algorithm/LinearSolvers/IpSpralSolverInterface.cpp Contributors of code that is no longer included in Ipopt distribution: - Yifan Hu (Wolfram): Contributed TAUCS interface, implemented in the files PDSystemImpl/PDFullSpace/IpTAUCSSolverInterface.hpp PDSystemImpl/PDFullSpace/IpTAUCSSolverInterface.cpp [These files have been removed, since TAUCS is not supported] coinor-ipopt-3.14.17/ChangeLog.md000066400000000000000000001615441473776672200165220ustar00rootroot00000000000000# ChangeLog Here we list changes of Ipopt since the release of version 2.2.0. More detailed information about incremental changes can be found in the [commit history](https://github.com/coin-or/Ipopt/commits). [TOC] ## 3.14 ### 3.14.17 (2024-12-14) - Added `Ipopt::RegisterInterruptHandler()` and `Ipopt::UnregisterInterruptHandler()` to `IpUtils.hpp` to wrap handling of interrupt signals. Added parameter `checkinterrupt` (default false) to `AmplTNLP` constructor to enable check for interrupt signal in `intermediate_callback`. - The `ipopt` and `ipopt_sens` executables and scalable problems C++ examples can now be interrupted by SIGINT/SIGHUP (systems with sigaction()) or SIGINT/SIGTERM/SIGABRT (Windows systems). - New option `mumps_mpi_communicator` to specify the MPI communicator when using an MPI-enabled build of MUMPS [#790, by Alex Tyler Chapman]. - Updated build system to current autotools versions; initial support for icx/ifx and flang - Removed use of `vsprintf` and `sprintf`. Added `IpoptData::Append_info_string(std::string,double)`. - Removed use of `strcpy`, `strncpy`, `strdup`, and `sscanf`. - Using `fopen_s` and `getenv_s` instead of `fopen` and `getenv`, respectively, if available. - Added workaround for using Pardiso from Intel MKL 2025.0.1 [#799]. This requires checking the MKL version at runtime and can be disabled by defining `IPOPT_NO_MKLVERSIONCHECK`. ### 3.14.16 (2024-04-22) - Fixed load of linear solver libraries at runtime on Windows, which got broken for relative paths (the default) in 3.14.15 [#759, #760]. ### 3.14.15 (2024-04-10) - Fixed include guard of IpGenAugSystemSolver.hpp [#756, by Christopher Wellons]. - Improved finding dependencies of linear solver libraries loaded at runtime on Windows [#755, by Yue Yang]. ### 3.14.14 (2024-01-18) - Fixed build of MA57 interface when `FUNNY_MA57_FINT` is defined (MA57 with long integers). - Fixed that initial dual values for fixed variables (z_L, z_U) were ignored when doing a warm start with fixed_variable_treatment = make_constraint [#728]. - Fixed that the last argument when calling MA27CD/MA27C in MA27 interface was wrong [#738]. ### 3.14.13 (2023-11-08) - Reduced priority for making Spral the default value for option linear_solver [#677]. - Adapted to change of integer types in Spral interface. Minimal required Spral version is now v2023.03.29. - Fixed that return code from `TNLP::eval_jac_g()` was ignored at first call [#697, by Christoph Hansknecht]. - Print additional messages when reallocation of MA27 working space failed [#671, by Daniel Oliveira]. - Added option `file_append` to specify whether to append to `output_file` instead of truncating it. Added default argument `file_append` to `Journalist::AddFileJournal()`, added default argument `fappend` to `FileJournal::Open()`, and added default argument `file_append` to `IpoptApplication::OpenOutputFile()`. [#720] ### 3.14.12 (2023-04-05) - Fix that a source file was installed and install more header files. [#641, #642, by Joao Sousa Pinto] - Fixed crash of GetIpoptCurrentIterate() and GetIpoptCurrentViolations() in C interface when called before or after IpoptSolve(). [#644, #645, by Robbybp] - Updated HSL_MA97 header file to the one from HSL MA97 2.8.0 [#646, by Jari Fowkes]. - Fixed crash when trying to solve problem without variables and constraints. [#648] - Added optional argument to `AlgorithmBuilder` constructor to provide name of custom solver. [#618] - Changed handling of dual solution for square problems: When solving a problem with as many equations as variables, Ipopt used to ignore the violation of dual feasibility and complementarity in the convergence check and computed a final dual solution via a least-square estimate. If this failed, Ipopt would claim a square problem to be solved to optimality without providing a solution that satisfies optimality conditions. With this version, the behavior has been changed so that dual feasibility is no longer ignored by the convergence check, the least-square estimate is only computed if optimality is not proven already, and the normal Ipopt algorithm continues if the least-square estimate does not satisfy optimality conditions. - Updated HSL_MC86 header file to the one from HSL MC68 3.3.3 [#653, by Jari Fowkes]. ### 3.14.11 (2023-02-07) - Added `IpoptData::TimingStats() const` [#611] - Assume DLL library extension in linear solver library loader on Windows also when building with other compiler than MSVC/Intel [#628]. - Updated buildsystem files after upgrading to most recent versions of autotools. - Install some additional header files [#637]. ### 3.14.10 (2022-10-11) - Added option `grad_f_constant` to specify that objective function is linear. If set, the gradient of the objective will be requested by Ipopt only once. [#597] - Added `OrigIpoptNLP::orig_d_L()` and `OrigIpoptNLP::orig_d_U()` to get original constraint sides (before relaxation due to bound_relax_factor > 0). - `TNLP::get_curr_violations()` now returns the constraint violation and complementarity w.r.t. the original (non-relaxed) constraint sides. [#603] ### 3.14.9 (2022-07-21) - Fixed mapping of meta data for variable bounds, e.g., variable names, from TNLP to Ipopts internal NLP [#590]. ### 3.14.8 (2022-07-13) - Added options ma27_print_level, ma57_print_level, and mumps_print_level to enable output from these linear solvers. ### 3.14.7 (2022-06-24) - Fixed that ComputeSensitivityMatrix() of sIpopt assumed that there are no more than two parameters [#578, by Andrea Vescovini]. - For completeness, added option `gradient_approximation` to enable approximation of gradient of objective function by finite differences. Do not use. [#573] - Added function `IPSETPROBLEMSCALING` to Fortran interface to set problem scaling [#577, by Steven R. Hall] ### 3.14.6 (2022-05-02) - Fixed mapping of meta data for inequalities, e.g., constraint names, from TNLP to Ipopts internal NLP [#570, by Daniel Oliveira]. - Fixed that MC68 ordering time was not accounted in symbolic factorization time of HSL MA86 [#571]. - Include more header files in IpIpoptCalculatedQuantities.hpp for setups where forward declarations are not sufficients [#572]. ### 3.14.5 (2022-02-09) - Tried to fix recognition of JNI headers on macOS >= 11 [#516]. - Fixed that only primal variable values where passed to `finalize_solution()` when a timelimit was reached [#552]. ### 3.14.4 (2021-09-20) - Skip build of Java interface if either java or jar is not found [#510]. Only give warning if javac and jar are found, but no java or javadoc. - Fixed that `--with-lapack-lflags` was ignored if `--with-lapack` was not specified explicitly [#512,#515]. ### 3.14.3 (2021-09-03) - Fixed timing for iterate initialization if initialization fails due to an evaluation error. - Fixed possible integer overflow when reserving space for indices of Jacobian belonging to fixed variables (introduced with 3.14.0) and reduced memory usage for indices of Jacobian belonging to fixed variables. ### 3.14.2 (2021-07-21) - Added `OptionsList::UnsetValue()` to remove an option setting. - Added missing translation of some Ipopt status codes into AMPL solve result codes. - If using the MPI-parallel version of MUMPS: Moved calls to `MPI_Init()`/`MPI_Finalize()` in MUMPS interface into global constructor/destructor of Ipopt library (if building with GCC/clang). Use configure flag `--disable-mpiinit` to disable. [#500] ### 3.14.1 (2021-06-25) - Fixed invalidation of cached Hessians when reoptimizing with same structure. - Added `OptionsList::SetBoolValue()` and `OptionsList::SetBoolValueIfUnset()`. [#492] - Skip check for and link against libdl if linear solver loader is disabled. - Fixed missing initialization of `BacktrackingLineSearch::in_watchdog_`. - Fixed a problem with the current solution not being reset when initialization of a NLP fails in reoptimization. - Fixed that C++11 capability was not correctly identified with MS/Intel compilers. ### 3.14.0 (2021-06-15) #### Data Types - Due to a contribution by Mitchell Clement [#428], it is now possible to build Ipopt in a variant that uses single-precision floating point arithmetic instead of the default double-precision. This can be enabled by specifying the configure flag `--with-precision=single`. Doing so has a number of consequences on Ipopt interfaces and Ipopt dependencies. See the Ipopt installation instructions for more details. - The name of all functions in `IpBlas.hpp` and `IpLapack.hpp` has been changed to drop the precision-specifier "D" in the name. Wrapper using the old names are available, but their use is deprecated. - It is now possible to build Ipopt in a variant that uses 64-bit integers for its `Index` type. This can be enabled by specifying the configure flag `--with-intsize=64`. Doing so has a number of consequences on Ipopt interfaces and Ipopt dependencies. See the Ipopt installation instructions for more details. [#259] - Added new header `IpTypes.h` that defines Ipopt types for integer and real numbers for C users. - Deprecated almost never used type `Ipopt::Int`, use `int` instead. - Deprecated `Number`, `Index`, and `Int` (on global namespace) in `IpStdCInterface.h`, use `ipnumber`, `ipindex`, and `int` instead, respectively. - Deprecated `Bool` in `IpStdCInterface.h` and replaced it by `bool` from `stdbool.h`. Note, that `Bool` was defined to be `int`, but `bool` is likely a shorter type, e.g., `signed char`. Deprecated `TRUE` and `FALSE`, use `true` and `false` instead. - Deprecated `IPOPT_EXPORT` macro and introduced `IPOPT_CALLCONV`. - Deprecated `IPOPT_FORTRAN_INTEGER_TYPE` and `ipfint`. These were always assumed to be `int`. Use `ipindex` or `ipopt::Index` instead. #### Linear Solver Interfaces - Due to a contribution by Byron Tasseff [#446], it is now possible to use the linear solver [SPRAL](https://github.com/ralna/spral) (Sparse Parallel Robust Algorithms Library) with Ipopt. SPRAL is open-source and can, optionally, make use of NVIDIA GPUs. If Ipopt has been build with SPRAL, then option `linear_solver` can be set to `spral` to enable use of SPRAL. See the installation instructions on how to build the Ipopt/SPRAL interface and the options documentation for new options that are available for the Ipopt/SPRAL interface. - Added `IpoptLinearSolvers.h` with function `IpoptGetAvailableLinearSolvers()` to retrieve information which linear solvers are available for Ipopt (linked in or loaded at runtime). Options `linear_solver` and `linear_system_scaling` can now only be set to values which corresponding code is available (linked in or for load at runtime). - Revised and streamlined implementation of feature that loads libraries with HSL or Pardiso routines at runtime. Added options `hsllib` and `pardisolib` to specify name of of HSL and Pardiso libraries, respectively. - Separated interfaces for Pardiso from [pardiso-project.org](https://pardiso-project.org) and Pardiso from Intel MKL and allow to have both Pardiso versions available with the same Ipopt libraries. - Pardiso from pardiso-project.org can be selected via `linear_solver=pardiso`. configure option `--with-pardiso` should now specify only a Pardiso library to be loaded at runtime (the value for `--with-pardiso` decides the default value for option `pardisolib`). To avoid conflicts with Pardiso from MKL, it is **no longer possible to link against Pardiso from pardiso-project.org**. - Pardiso from MKL can be selected via `linear_solver=pardisomkl`. - Options that influence Pardiso from MKL are named `pardisomkl_msglvl`, `pardisomkl_order`, etc. - configure option `--disable-pardisomkl` can be used to disable the check for MKL Pardiso. [#454] - Fixed that return code (`info%flag`) of `ma97_solve()` was not checked in `Ma97SolverInterface::MultiSolve()`. - Calls into MUMPS are now protected by a mutex if compiling for C++11 or higher. This prevents Ipopt from calling MUMPS concurrently from several threads. - An insufficient memory return status is now also given if the memory required for a working space array of a linear solver exceeds the maximal value for the working space length variable, e.g., if MA27 requires a working space array of length higher than 2^31. - Avoid floating point overflow when computing memory increase in interfaces to MA27 and MA57. #### Algorithm - Changed treatment of NLPs with all variables fixed and `fixed_variable_treatment` set to `make_parameter`: Ipopt will still terminate early, but initialize its data structures first and print a solve summary (49a0d3a56). Changed treatment of NLPs with inconsistent variable bounds or constraint sides: These will now result in an invalid problem definition error (-11) (5cdb2624bb). As a consequence, solve statistics should now always be available if the return status from `(Re)Optimize()` is larger than -10. - Bound multipliers are now computed for fixed variables if `fixed_variable_treatment` is set to `make_parameter` (the default). This can trigger a reevaluating of the gradient of the objective function or the Jacobian of the constraint functions. If this is not desired, then option `fixed_variable_treatment` can be set to the new value `make_parameter_nodual`. [#308] - Changed default for `honor_original_bounds` to no. Variable bounds (see option `bound_relax_factor`) are now relaxed by at most the value of `constr_viol_tol`. The solve summary now reports the violation of original bounds and `SolveStatistics::(Scaled)Infeasibilities()` has been extended to report the violation of original variable bounds. [#312] - If Ipopt hits a time or iteration limit during watchdog phase, the iterate from before the watchdog phase is now restored and passed to `finalize_solution`. Note that this does not apply if Ipopt is stopped due to a user-interrupt (`intermediate_callback`). [#289] - When `BacktrackingLinesearch` could not find a trial point that provided sufficient progress, it may resort to call the feasibility restoration phase. If, however, the current (scaled) constraint violation was below tol/100, this would result in the infamous "Restoration phase is called at almost feasible point..." abort with status code `Restoration_Failure`. Now, this message has been changed to "Linesearch failed, but no restoration phase or other fall back is available." and the status code to `Error_In_Step_Computation` to better reflect that the linesearch failed and not the restoration phase. Further, the unscaled constraint violation tolerance now needs to be below `constr_viol_tol/10` as well in order to trigger this abort. - When a square problem is solved and the restoration phase only succeeded to find a point that is feasible w.r.t. constr_viol_tol, but not w.r.t. tol, then status Feasible_Point_Found is returned now. #### Ipopt interfaces - Added `TNLP::get_curr_iterate()` and `TNLP::get_curr_violations()` to request the current iterate (primal and dual variable values) and primal and dual infeasibility w.r.t. the TNLP. The methods are meant to be called during `intermediate_callback` to inspect the current iterate. The C, Fortran, and Java interfaces have been extended by corresponding functions, too. The hs071 examples have been extended to show use of the new functions. Added test `getcurr` to test new functions. [#382, #451] - Extended the Java interface by the possibility to specify an `intermediate_callback`. - Added flag to `TNLPAdapter::ResortX()` to specify how to handle fixed variables. Added flag to `TNLPAdapter::ResortG()` to specify whether to correct by right-hand-side of equality constraints. Added `TNLPAdapter::ResortBoundMultipliers()` to generate correct duals for fixed variables if `fixed_variable_treatment` is `make_constraint`. Added `TNLPAdapter::GetFullDimensions()`, `TNLPAdapter::GetFixedVariables()`, `TNLPAdapter::GetPermutationMatrices()`, and `TNLPAdapter::GetC_Rhs()` to retrieve more information of the transformation in a `TNLPAdapter`. - Added `TNLPAdapter::ResortBounds()` and deprecated `TNLPAdapter::ResortBnds()`. - `AmplTNLP` constructor and `AmplTNLP::get_options()` now expect to receive a pointer to a `RegisteredOptions` object as well. Previous versions of these methods are still available but deprecated. Using a NULL pointer for the `RegisteredOptions` argument is also deprecated. - `std::overflow_error` exceptions are now caught by Ipopt even if rethrowing of non-Ipopt exceptions is enabled. #### Timing - Added option `max_wall_time` to specify a wallclock time limit. Added `SolverReturn` code `WALLTIME_EXCEEDED` and `ApplicationReturnStatus` code `Maximum_WallTime_Exceeded`. - Changed default for `max_cpu_time` to 1e20 to indicate no CPU timelimit. - Detailed timing statistics are no longer collected by default. To reenable, set the new option `timing_statistics` to yes or set the option `print_timing_statistics` to yes [#299]. - Removed `IpoptData::ResetCpuStartTime()`. Deprecated `IpoptData::cpu_time_start()`, use `IpoptData::TimingStats()::OverallAlgorithm()::StartCpuTime()` instead. - Deprecated `SolveStatistics::TotalCPUTime()`, use `SolveStatistics::TotalCpuTime()` instead. #### Option handling - All Ipopt options are now also available via the AMPL interface, that is, can be set in AMPL via an option `ipopt_options "..."` statement. - Added flag "advanced" for `RegisteredOption` to store whether an option is rather meant for expert users. - Added class `RegisteredCategory` to store information on category of registered option. Next to the name, this is a priority, which determines the order in which categories are printed. As a consequence, methods `RegisteredOption::RegisteringCategory()` and `RegisteredOptions::RegisteringCategory()` now return a `RegisteredCategory` object instead of a string. Further, `RegisteredOption::SetRegisteringCategory()` has been removed. - Deprecated existing `RegisteredOptions::OutputXyz()` methods and added new variant of `RegisteredOptions::OutputOptionDocumentation()`. Added parameter `print_advanced_options` to indicate whether to print documentation for advanced options, too. - Added previously undocumented advanced options to options reference. #### Miscellaneous - Updated buildsystem, including improved checks for dependencies, use of current autotools, and skipping the build of intermediate non-distributed libraries. - Fixed missing initialization of `IpoptApplication::smart_jnlst` in second `IpoptApplication` constructor, if `ipopt verbosity > 0`. - Add GCC format attribute to `Journalist::Printf` functions to enable `printf`-formatter check. - Fixed `DenseVector::SumLogsImpl()` such that it returns 0.0 for a vector of dimension 0. Returned `nan` for homogeneous 0-vector of dimension 0 before, which may have caused the restoration phase to fail for problems with only equality or only inequality constraints. Also other `DenseVector` methods now skip calculations when dimension is 0 to avoid (probably harmless) divisions by zero. - Fixed a problem where moving slack away from 0 did not succeed when mu was very small. [#212] - Fixed a problem where moving slacks away from 0 resulted in `nan` if multipliers were zero. Added `Vector::ElementWiseSelect()`. - Various tiny bugfixes and improvements in performance and code style by following suggestions of `cppcheck`. - Added documentation on some available C preprocessor flags for expert users. - Fixed static build of sIpopt without GCC. Fixed that installed sIpopt headers were not usable (`SIPOPTLIB_EXPORT` not defined). - Fixed wrong gradient of objective function and Lagrangian Hessian in restoration problem [#478, by Nai-Yuan Chiang]. - If Ipopt is compiled for checklevel 2 or higher and the GLIBC extension `feenableexcept()` is available, then floating-pointing exceptions divbyzero, overflow, and invalid are raised while `IpoptAlgorithm::Optimize()` is running. - Fixed that norm on unscaled complementarity or scaled complementarity tolerance were negative when maximizing (by using a negative scaling factor for the objective). - Changed formula for relative error in derivative checker. The absolute error is now scaled up if the approximate derivative value is between derivative_test_tol and 1. [#487]. - The second-order derivative checker now uses values for obj_factor and lambda that are different from 1. ## 3.13 ### 3.13.4 (2021-02-24) - Fixed a linking issue for `ipopt_sens` [#418] - Fixed Makefile for Java example regarding location of jar file - Fixed build of R interface if using `-fvisibility=hidden`. ### 3.13.3 (2020-10-16) - Members of `AmplTNLP` class are now protected instead of private. - Updated Eclipse Public License from 1.0 to 2.0. - Fixed dangling pointer problems with Journalist used for debugging (`--with-ipopt-verbosity > 0`) when more than one `IpoptApplication` is used. [#393, thanks to Brad Bell] - Fixed build problem when using HSL library that does not include MA27, MA57, or MC19. [#395] - Added example `recursive_nlp` that uses Ipopt to solves an optimization problem for the evaluation of the objective function. [contributed by Brad Bell] - Fixed build of linear-solver loader on Windows [#408] ### 3.13.2 (2020-04-30) - The C-preprocessor defines `COIN_IPOPT_CHECKLEVEL`, `COIN_IPOPT_VERBOSITY`, and `FORTRAN_INTEGER_TYPE`, which are defined by `IpoptConfig.h`, have been renamed to `IPOPT_CHECKLEVEL`, `IPOPT_VERBOSITY`, and `IPOPT_FORTRAN_INTEGER_TYPE`, respectively. They are still available under their previous name, but these will be removed in Ipopt 3.14. - Changed dependencies as used by coinbrew to use new versions (2.1) of ThirdParty/HSL and ThirdParty/MUMPS and dropped ThirdParty/Metis. The new versions of the HSL and MUMPS build scripts now look for a Metis library in the system and should work with both Metis 4 and Metis 5. - Changed location where Java interface jar gets installed from `$libdir` to `$datadir/java/`. - minor fixes to buildsystem ### 3.13.1 (2020-03-11) - Added asserts that check whether sparsity pattern of Jacobian and Hessian as returned by TNLP are within range w.r.t. number of variables and constraints. [#350] - `TNLPAdapter::ResortBnds` now initializes complete output arrays with 0.0 before filling in values for non-fixed variables. Use new argument `clearorig` to turn this off. [#352] - bring back configure variables `ADD_{C,CXX,F}FLAGS` - added configure option `--enable-relocatable` to make prefix in pkg-config files relative to pcfiledir (assuming that `--libdir` hasn't been set) - bring back `configall_system.h` for build without config header - minor fixes to buildsystem ### 3.13.0 (2019-10-19) This major release comes with a larger renovation of the build system and a changed directory structure (eliminated top directory), which is the result of a long and still on-going effort to use recent autotools versions for various COIN-OR projects, reduce future maintenance efforts, and adapting behaviors of standard autotools-based projects. As a consequence, a monolithic build of Ipopt, which builds Ipopt with all its dependencies in one run of configure and make is no longer possible. Dependencies should now be build and installed before building Ipopt. Additionally, support for some outdated versions of dependencies and unmaintained components of Ipopt has been dropped and some improvements that may require changes on the users side have been applied. A more detailed, probably incomplete, list of changes follows: - Removed git submodules. Dependencies (HSL, Mumps, ASL, etc) now need to be build and installed in advance, either manually or by using coinbrew. - Dropped support for HSL < 2013. - Dropped support for MA28 in the linear solver loader. - Dropped support for Pardiso < 4.0 from pardiso-project.org. - Added support for Mumps 5.2.x, though initial experiments on CUTEst indicated that, on average, performance is worse than when using Mumps 4.10.0. - Dropped CUTEr interface, the successor CUTEst includes an interface to Ipopt. - Dropped Matlab interface as it is unmaintained and it was reported that it stopped functioning. Use https://github.com/ebertolazzi/mexIPOPT instead. - Dropped MSVS project files as unmaintained and not functioning with current Ipopt anymore. - Integrated Java interface into the main Ipopt library, that is, it is handled equivalently to the C and Fortran interfaces: - The source moved into `src/Interfaces`. - The JNI functions are now included in the main Ipopt library, thus an extra jipopt library is no longer build or necessary. - The Java class and `org.coinor.ipopt.jar` package are build and installed as part of the main Ipopt build. - The examples moved into `examples/*_java`. - A Java interface test is executed by `make test`. - To build javadoc, run `make javadoc` in the main build directory. - The configure flag `--disable-java` can be used to disable the check for Java and build of the Java interface. - `DLLPATH` and `DLLNAME` have been removed from the Ipopt class and constructors that works without arguments and with only one argument (specifying the Ipopt library namestem) have been added. - Method `Ipopt::finalize` has been marked as deprecated and will be removed in some future Ipopt version. Users must call `dispose()` explicitly. - Integrated sIpopt into the main Ipopt build, that is, it is now build together with Ipopt, but installed as separate library and executable. Use `--disable-sipopt` to disable building sIpopt. - `IPOPT_THREAD_LOCAL` now uses C++11's `thread_local` keyword if C++11 is available. - When using a GCC-compatible compiler, Ipopt and sIpopt interface functions are now declared with `visibility(default)`-attribute, thus building Ipopt with `-fvisibility=hidden` still produces a usable library. - When using a MSVC-compatible compiler, Ipopt and sIpopt interface functions are now declared with `dllimport`-attribute, so that an Ipopt C++ DLL can be used. - Under Windows/Msys2, DLLs are now build by default. - Cygwin and MSys1 are not supported. - pkg-config is now mandatory to use dependencies like ASL or HSL. On Windows, make sure to use a pkg-config version that produces Unix-style paths. - Script "`compile`" is now used to wrap around calls of cl/icl/ifort and translate GCC-style compiler flags to MSVC style. - "Addlibs" files have been removed, pkg-config should be used instead. - Header files are now installed in the better named `$prefix/include/coin-or` instead of `$prefix/include/coin`. - The default for `--prefix` is no longer the build directory, but the autotools-default, probably `/usr/local`. - The check for a Fortran compiler can be disabled via `--disable-f77` and Ipopt can easier be build without a Fortran compiler. - Lapack is no longer optional, but required. The separate check for Blas and the `--with-blas` flags have been removed. - `--enable-debug` does not imply `--disable-shared` anymore. - Removed `--enable-debug-ipopt`, use `--enable-debug` instead. - Removed configure variables `{ADD,OPT,DBG}_{C,CXX,F77}FLAGS`. Use `{C,CXX,F77}FLAGS` instead. - Silent build output is now enabled by default, use configure flag `--disable-silent-rules` or call make with `V=1` to disable. - Also for static builds, PIC objects are now generated by default, use `--without-pic` to disable. - The `--with-*-incdir` and `--with-*-lib` configure flags have been replaced by corresponding `--with-*-cflags` and `--with-*-lflags` flags. Note that the include directories need to be specified via `-I` in `--with-*-cflags`. - Fixed handling of `ma77_default_control` in `LSL_setMA77()`. - Fixed calculation of quality function when setting option `quality_function_centrality` to `reciprocal`. - Fixed compiler warnings, in particular when using `-Wunused-parameter`. - Changed default for `ma97_print_level` to -1. This avoids messages about numerical singular systems written to stdout by default. ## 3.12 ### 3.12.13 (2019-04-08) - fixed Pardiso settings when using Pardiso from Pardiso project website (by Olaf Schenk): the new settings should provide much better performance; the default for option `pardiso_order` changed from `five` to `metis`. - changed distinction of MKL and Basel Pardiso in configure: to use MKL Pardiso, only specify MKL for Blas; to use Basel Pardiso, use `--with-pardiso` ### 3.12.12 (2018-11-17) - allow for `--without-matlab-home` to disable check for Matlab [r2748] - add `dppsv` to `v8-ifort` [r2746] - disable error in `LibraryHandler.c` if `snprintf` detection failed [r2751] ### 3.12.11 (2018-09-16) - fill MUMPS struct with zeros when allocating in MUMPS interface [r2724] - minor fix in build-system of ThirdParty/ASL ### 3.12.10 (2018-06-02) - fixed setting for parallel solve when using MKL Pardiso (by t1393988511) [r2711]: parallel solve was disabled (which is not the default); note, that the setting for parallel factorization was not affected - fixed invalid read in AMPL interface for problems without objective function [r2715, #305] - updated ThirdParty/ASL to retrieve updated ASL (20180528) [#305] - name JIpopt library `libjipopt.dylib` on Mac OS X [r2718, #275] ### 3.12.9 (2018-01-15) - fixed memory leak in MA86 interface (by mhahn) [r2700,#283] - fixed handling of time limit when reoptimizing: CPU time spend was accumulated when reoptimizing, while it should have been reset for each solve (by paul-scott) [r2702,r2703] - fixed sign in Jacobian finite-difference approximation when point was close to variable upper bounds (by Enrico Bertolazzi) [r2704] ### 3.12.8 (2017-06-12) - add define for `FORTRAN_INTEGER_TYPE` to `config_ipopt_default.h` - `IpoptApplication::RethrowNonIpoptException()` now returns whether non-ipopt exceptions were rethrown before the method was called. ### 3.12.7 (2017-02-25) - removed compiler flag `-pedantic-errors` to avoid problems with some configure tests when using recent GCC versions - fixed rare bug in handling variable/constraint names in `AmplTNLP` (by G. Hackebeil) [r2673] - the `get.Mumps` script in ThirdParty/Mumps now renames `libseq/mpi.h` to `libseq/mumps_mpi.h` to avoid conflicts when building in a MPI environment (by T. Ralphs); note that if updating an existing checkout/download of Ipopt, you may have to rerun get.Mumps ### 3.12.6 (2016-07-20) - better support for custom algorithm development [r2659] (by Gabriel Hackebeil): "Reorganization of the `AlgorithmBuilder` class to allow easier customization of the Ipopt algorithm. In particular, we wanted to make use of the code that creates the `SymLinearSolver` object to implement our own `SymLinearSolver` without copy-pasting everything in AlgorithmBuilder. `AlgorithmBuilder::BuildBasicAlgorithm` now consists of 8 method calls that build the core components passed into the arguments of the `IpoptAlgorithm` class. These calls are ordered based on any dependencies they might have. In addition, all code for creating the `PDSystemSolver`, `AugSystemSolver`, and `SymLinearSolver` has been moved into separate factory methods. Also, included is a change to install a few more header files with Ipopt. Some of these are required to subclass AlgorithmBuilder, and the others are simply some matrix types that we require." - extend build system to work without Fortran compiler [r2660,r2661]: If no Fortran compiler is available (`F77=unavailable`), then the build system checks for functions in Blas, Lapack, and Pardiso via C linkage. This seems to work when using the Intel MKL, thus allowing to build Ipopt with C/C++ compilers and MKL only. The linear solver loader and the CuteR interface are disabled when no Fortran compiler is available. A user may have to adjust the definition of `F77_FUNC` in `Ipopt/src/Common/IpoptConfig.h`. ### 3.12.5 (2016-04-30) - changed `fptr` from `long` to `void*`: the Fortran side needs to make sure that it uses a big enough integer type to store a C pointer, thus `void*` can be used on the C side [r2599] - added additional second-order-correction method, which can be selected by setting the new option `soc_method` to 1 (by Wei Wan) [r2606, r2607] - added parameter `allow_clobber` with default value false to `IpoptApplication::Initialize()` and `OptionsList::ReadFromStream()` ### 3.12.4 (2015-08-09) - option to use regularized Hessian when doing a curvature test without inertia information (`neg_curv_test_tol` > 0), new option `neg_curv_test_reg` to switch back to original behavior (by N.-Y. Chiang and V. Zavala Tejeda) [r2579] - sIpopt: Added access to sensitivity directional derivative vector (`ds/dp*(p-p0)` Eq. 14 sIpopt implementation paper). Also, added an option to compute the sensitivity matrix and provide access to it. Finally, added an example that shows how to access the new information. (by R. Lopez-Negrete) - use workaround for failing check for random number generator with any gcc 4.8.x, x >= 2 ### 3.12.3 and 3.11.11 (2015-04-15) - fixed bug in MA97 interface that lead to conversion issues (by J. Hogg) [r2566, #260] ### 3.12.2 (2015-04-04) - revised integration of doxygen-generated documentation into build system (by T. Ralphs) ### 3.12.1 (2015-02-13) - fixes to build system for dependency linking and library versioning - Ipopt will now report an NLP with inconsistent variable bounds or inconsistent constraints sides as infeasible instead of throwing an invalid TNLP exception (by T. Kelman) [r2548] ### 3.12.0 (2015-01-23) - Library dependencies are now recorded in shared library builds, which is intended to simplify linking against the Ipopt library. However, the pkg-config and `ipopt_addlibs` files do not reflect this change yet (it is rather experimental, imho). To restore the previous behavior, use `--disable-dependency-linking` as configure option. - If linking against Intel MKL for Blas/lapack, use of Pardiso from MKL is now automatically enabled. Note, that this will change the default solver on Ipopt builds without any of the linear solvers MA27, MA57, MA97, and MA86 (these take preference over Pardiso). [#216] - dropped support for old HSL sources (<2013; ThirdParty/HSLold) - updated ASL sources, now downloaded from AMPL-MP (github) - some internal changes to data structures (improved use of compound component spaces) and addition of `IpLapackDppsv` (by Gabe Hackebeil) ## 3.11 ### 3.11.10 (2015-01-18) - fix a memory allocation in Java interface in cases where `jint` has a different size than `int` [r2513] - the buildsystem now tries the `Accelerate` framework instead of `vecLib` for finding Blas/Lapack on MacOS X ### 3.11.9 (2014-08-16) - fix compilation issue of Java interface on systems where `Index` and `jint` have different size [r2498, #241] - work around failing check for random number generator with gcc 4.8.3 [r2495, r2496] - readded `IpTaggedObject.cpp` to list of sources to compile in MSVS `v8-ifort` project file [r2492] - work around missing support for thread-local storage with gcc < 4.5 on MacOS X [r2491, #243] - fix call to MKL Pardiso init function [r2489] - speed up Triplet to CSR converter [r2487, #234] - fixed a bug in equilibration scaling where average values were computed incorrectly (by V. Zverovich) [r2483] ### 3.11.8 (2014-04-08) - fixed a bug, introduced with Ipopt 3.11.0, where the tag in the Ipopt's caching mechanism was not unique over time, which lead to failures of Ipopt that were difficult to debug or recognize (e.g., Ipopt may have stopped with an restoration failure for instances that solved fine with Ipopt 3.10) [r2472, r2473] I'm very thankful to Gabriel Hackebeil and Kurt Majewski for their debugging effort on this issue. - building Mumps with pthreads is now disabled by default [#229] - fixed setting of `LD` on Windows (now set to link only iff using MS/Intel compilers) [#230] - fixed download link for Gnumex [r2471] - for some messages about too-few-degrees-of-freedom and restoration failure, the message level changed from error to strong-warning [r2460, r2469] - revised calls to `MPI_Init` and `MPI_Finalize` in MUMPS interface [r2467] (`MPI_Init` is now called only if function `MPI_Initialized` is available and MPI has not been initialized already; `MPI_Finalize` is only called if Ipopt also called `MPI_Init`; ...) ### 3.11.7 (2013-12-18) - adapted PARDISO parameters when using MKL PARDISO to be close to using Basel PARDISO - added options `pardiso_max_iterative_refinement_steps` and `pardiso_order`; the former defaults to 1 in case of MKL PARDISO, which may help on instances that otherwise fail due to numerical issues - removed duplicate code in `IpQualityFunctionMuOracle.cpp` [#225, r2445] - fixed bug in triplet to csr converter [#226, r2446] - minor changes in buildsystem ### 3.11.6 (2013-11-16) - updates to Matlab Interface build system (by T. Kelman) - fix to updates of R Interface [r2416, #223] - fixed `SHAREDLIBEXT` in `v8-ifort`'s `config.h` [r2426, #224] - minor fixes to the buildsystem ### 3.11.5 (2013-10-26) - added method `IpoptApplication::RethrowNonIpoptException()` to enable rethrowing of non-ipopt and non-`bad_alloc` exceptions catched in the `*Optimize()` and `Initialization()` methods; default is still to return with `NonIpopt_Exception_Thrown` status - minor fixes to the buildsystem [#215, #222] ### 3.11.4 (2013-09-12) - hopefully fixed non-working linear solver loader in DLLs build with MSVS/`v8-ifort` project files [r2365] - allow MC19 to be loaded via linear solver loader (by J. Currie) [r2366] - fixed new point flag when running dependency detector [r2368] - experimental: adapt Pardiso interface to work with MKL Pardiso (by J. Currie, T. Kelman) [r2369, #216]: - in a few tests it has been found that Pardiso from Intel MKL nowadays seems to work fine with Ipopt - to use Intel MKL with Ipopt 3.11, one has to specify the MKL libs via `--with-pardiso` and add `-DHAVE_PARDISO_MKL -DHAVE_PARDISO_PARALLEL` to the compiler flags - note that this is still an experimental feature (and thus not enabled by default) - updated Ipopt/R interface to version 0.8.4 [r2373] - additional variables have been included in the object returned from `ipoptr`: - `z_L`: final values for the lower bound multipliers - `z_U`: final values for the upper bound multipliers - `constraints`: final values for the constraints - `lambda`: final values for the Lagrange multipliers - removed `ipoptr_environment` as argument in `ipoptr` (see also r2372) - fixed bug in penalty term for centrality in quality function (not used by default) [#219, r2374] - minor bugfixes in AMPL interface, debug print statements, and compound matrix (by G. Hackebeil) [#218, r2371, r2377, r2378, r2379] - download scripts for ASL, Blas, and Lapack now first try to download tarball copies from the COIN-OR server ### 3.11.3 (2013-08-08) - `get.*` scripts for ThirdParty/{ASL,Blas,Lapack} now work around broken ftp access to www.netlib.org. ### 3.11.2 (2013-07-01) - changed default for option `option_file_name` to `ipopt.opt`; specifying an empty string for this option now disables reading of an option file [r2339] - missing initial values are now set to 0.0, projected onto variable bounds, in AMPL interface [r2340, #205] - fixed missing variable initialization in MA97 interface [r2341, #206] ### 3.11.1 (2013-06-14) - the setup for the `v8-ifort` MSVS project changed to use dynamic runtime DLLs instead of static linking, which caused crashes in debug mode (by M. Roelofs) [r2301] - fixed memory leaks in Java Interface (by javier) [#200, r2312] - updates and fixes to MA77 and MA87 interfaces, adding support of HSL 2013 codes (by J. Hogg); HSL 2012 still supported when compiled with Ipopt, but the linear solver loader to dynamically load a HSL library at runtime now assumes HSL 2013 - added option `ma97_solve_blas3` (by J. Hogg) [r2329] - changed default for option `ma27_meminc_factor` from 10.0 to 2.0 [r2330] - fixed bug in `ipopt_auxdata` of MATLAB Interface related to `iterfunc` [r2325] ### 3.11.0 (2013-05-07) #### Miscellaneous - update and extension of Ipopt documentation - updated build of doxygen-generated documentation to comply with other COIN-OR projects - localized global variables in `TaggedObject` and `RegisteredOption`, so that Ipopt should now be threadsafe as long as Ipopt objects (esp. `SmartPtr`'s) are not shared between threads and a threadsafe linear solver is used (e.g., MA27) [#167] - no more need for whitespace character at end of options file - added options `print_frequency_iter` and `print_frequency_time` to regulate which iteration summary lines should be printed [#161] - function evaluation timings are now available in `OrigIpoptNLP` [#86] - some fixes to uncommon issues with the Ipopt `SmartPtr` [#162] #### Linear Solver Interfaces - new build system for Harwell codes (ThirdParty/HSL), which requires the coin-hsl archives from http://www.hsl.rl.ac.uk/ipopt/; previously downloaded HSL sources can still be used by placing them into ThirdParty/HSLold, but this option will be removed in a future Ipopt version - new interfaces for Harwell codes HSL_MA77, HSL_MA86, and HSL_MA97; see http://www.hsl.rl.ac.uk/ipopt/ about help on when to use which solver; especially MA57 and HSL_MA97 should be considered as replacement for MA27; however, MA27 is still the default for now - changed default of `ma57_automatic_scaling` to `no` (faster in general, but for higher reliability, you may want to set this option to yes) #### Ipopt Interfaces - major improvements for building the MATLAB interface (see documentation) - MATLAB interface now returns number of function evaluations, too - the MA57 interface can now be used with the MA57 library that comes with MATLAB (configure option `--enable-matlab-ma57`; cannot use Metis) - `auxdata` is now handled by a wrapper function `ipopt_auxdata.m` instead of internally within the MEX code (replace Matlab call to `ipopt` with `ipopt_auxdata` if using auxiliary data in any callbacks) [r2282] - exposed more intermediate Ipopt information to `iterfunc` callback [r2283] - fixes to JIpopt buildsystem (now may work on windows and uses libtool) - JIpopt now reads options file `ipopt.opt` by default, if present - removed predefined `KEY_` strings in JIpopt - renamed API functions that retrieve solution values in JIpopt - simplified installation of R interface ## 3.10 ### 3.10.4 (2013-05-05) - fixed sign of dual values in AMPL solution again (with help of Gabe) [r2169, r2170, r2184, #183] - fixed bugs with reoptimizing a TNLP with all variables fixed [r2172, r2173, #179] - fixed more issues with sparse data structures and non-double numbers in Matlab interface (by T. Kelman) [r2191] - added missing `final int` for Ipopt return code `Maximum_CpuTime_Exceeded` in Java interface [r2216] - fixed bug when trying to warmstart Ipopt in Java interface [r2253] - fixed wrong use of `SmartPtr`'s in Java interface [r2255, r2263] - fixed bug in returning final solution in Java interface [r2258] - included patch in ThirdParty/Mumps to work around bugs in Mumps matrix ordering routines AMF and QAMD (now give preference to AMD and METIS) ### 3.10.3 (2012-11-19) - minor fixes in MA86 interface (by Jonathan Hogg) [r2069, r2086] - fix in `IpTripletToCSRConverter` for CSR forms with extra entries (by Jonathan Hogg) [r2087] - workaround problems with Mac OS X Lion's blas library (by Frederic Hetch) [r2102, #181] - the C interface now catches also Ipopt exceptions thrown within the `OptimizeTNLP` call and returns `Ipopt::Unrecoverable_Exception` as status [r2094, #144] - fixed segmentation fault in adaptive barrier parameter update rule when using the mehrotra option on unconstrained problems [r2114, #114] - fixed segmentation fault in case no iterate is available in case of catastrophic failure in restoration phase [r2115] - fixed default for `mumps_dep_tol` to work with current Mumps versions [r2116] - fixed sign of dual values in AMPL solution [r2123, #183] - fixed issue with sparse gradients in Matlab interface (by T. Kelman) [r2133, #187] - sIPOPT (by H. Pirnay): - starting values in C++ version of parametric example now match AMPL version [r2098] - numerical values in parametric example now match publication [r2099] - added options `n_sens_steps` and `sens_boundcheck` as AMPL options [r2099] - any non-zero suffix value is now accepted for `sens_init_constr` [r2100] - fix typo in AMPL interface (by Weifeng Chen) [r2110] - fix bug when compiling without AMPL interface [r2113] - build system: - updated instruction on using nowadays HSL sources (by T. Kelman) - fixed issue with libdir being `/lib64` - other minor fixes ### 3.10.2 (2012-02-12) - updates to HSL interface (by Jonathan Hogg): - MC68 can now be loaded dynamically, too - MA86 exploits built-in scaling - MA86 can choose best ordering from AMD and Metis - fix for return code of MA86 for singular matrices - corrected computation of Upsilon (norm of step SQUARED) - updates to MSVS `v8-ifort` project files and addition of vc10 project files (using vc8-generated `IpoptFSS.dll`) (by Marcel Roelofs) - minor bugfixes, include updates in BuildTools ### 3.10.1 (2011-09-20) - include updates in BuildTools, including new ThirdParty/Metis (fix for URL to download Metis 4.0.3 release) - linear solver loader prints error code when failing to load library under Windows - message on failure when reallocating memory in Mumps now includes size of memory that was tried to be allocated - added missing include of `cstdio/stdio.h` in `IpJournalist.hpp` - minor fixes to build system ### 3.10.0 (2011-06-20) - move to new COIN-OR configuration and installation convention - primal infeasibility output is now true infeasibility in original problem formulation ## 3.9 ### 3.9.3 (2011-04-07) - include updates in BuildTools, including new ThirdParty/Metis (required to work with current metis release) ### 3.9.2 (2010-12-22) - converted from Common Public License to Eclipse Public License - some bugfixes from BuildTools ### 3.9.1 (2010-11-26) - improved Hessian update for restoration phase - added intermediate callback feature to C and Fortran interface ### 3.9.0 (2010-11-05) - switching to new BuildTools system - added R interface (contributed by Jelmer Ypma) - updates in AsNMPC (by Hans Pirnay) ## 3.8 ### 3.8.3 (2010-06-29) - restated `SolveStatistics::TotalCPUTime` method for backward compatibility ### 3.8.2 (2010-06-16) - uses MUMPS version 4.9 and Lapack version 3.2.1 - added AsNMPC contribution made by Hans Pirnay - enhanced MA57 options - several bug fixes and minor additions ### 3.8.1 (2009-10-30) - Bugfix in NLP function evaluation timing measurement. The time for the objective function gradient had been forgotten. ### 3.8.0 (2009-10-30) - Added MSVC solution with Intel Fortran compiler to generate DLLs (contributed by Marcel Roelofs). To make this work, a lot of methods in exported headers have been made virtual - changed default convergence tolerance in restoration phase (now same as regular tolerance) - output is flushed after each iteration ## 3.7 ### 3.7.1 (2009-10-06) - bugfix for square problems - correct timing information (obj gradient was forgotten) - flush output buffer after each iteration - first code for iterative WSMP version (experimental and undocumented) ### 3.7.0 (2009-07-16) - a number of fixes (including those from 2009 COIN-OR Bug Squashing Party) - changes in some exposed header files to provide access to internal data structures for specific applications ## 3.6 ### 3.6.1 (2009-05-01) - minor corrections in tutorial files ### 3.6.0 (2009-04-29) - new Matlab interface - added new option to limit cpu time: `max_cpu_time` - added ThirdParty directory for Metis to be used with MUMPS or MA57 - updated CUTEr Makefile to make it work with CUTEr2 - added files for a tutorial (including coding exercise) ## 3.5 ### 3.5.5 (2009-01-13) - minor fixes regarding compilation - undocumented version of inexact method ### 3.5.4 (2008-09-29) - changed to MUMPS version 4.8.3 in externals (Mumps developers seem to have removed 4.8.1). ### 3.5.3 (2008-09-19) - changed back to MUMPS version 4.8.1 since there seem to be issues on Windows ### 3.5.2 (2008-09-18) - changed to latest version of MUMPS (4.8.2) - some bugfixes (linear algebra objects, automatic problem scaling) - made sure the subversion revision number is correct in all files - allowed general additional data and cq in `IpData` and `IpCq` ### 3.5.1 (2008-08-26) - changed to latest version of MUMPS (4.8.1) ### 3.5.0 (2008-08-25) - added `ComputeRowAMax` and `ComputeColAMax` methods to Matrix base class - changed externals for MUMPS to stable/1.1 - call `finalize_solution` in more failure cases (this means that AMPL writes .sol file in more situations) - added `IpTNLPReducer` as simple way to exclude constraints from problem - several fixes, also from COIN-OR Bug Squashing Party 2008 ## 3.4 ### 3.4.2 (2008-07-18) - some bug fixes - added wallclock time routine - penalty function version does no longer crash if it wants to go to restoration phase (not that this really helps convergence though) ### 3.4.1 (2008-05-30) - some bug fixes - deleted `v9` MSVC files again (since `v8` works fine for `v9`) - print Ipopt version in default print level - added option that allows to change name of options file (`option_file_name`) ### 3.4.0 (2008-04-25) - added support to dynamically load HSL or Pardiso: If Ipopt has been compiled without some HSL or Pardiso solver, it can now load those solvers from a shared library at runtime without recompilation. This will make distribution of binaries easier. Does not work on all platforms yet. - several bugfixes - ensured compilation of MSVS project files (`v8` and `v9`) - new special return code for square problems (`Feasible_Point_Found` returned if dual inf not small) - new initialization option for bound multipliers (see option `bound_mult_init_method`) - added simple penalty function line search option (`line_search_method=penalty`) - not guaranteed to converge, see Ipopt implementation paper (in MathProg) - some very basic method to approximate constraint Jacobian by finite differences (not efficient, but will hopefully be extended) ## 3.3 ### 3.3.5 (2008-02-28) - corrected links for Ipopt mailing list - added missing `Makefile.in` for Matlab interface - the `addlibs*` files are now installed in `share/doc/coin/Ipopt` instead of lib - updates in Matlab interface - bugfix for ticket #56 ### 3.3.4 (2007-12-27) - headers are now installed in `include/coin` (no longer in `include/ipopt`) - default for `dual_inf_tol` is now 1 (instead of 1e-4) - In matlab interface, here the text from Peter Carbonetto: There have been several significant changes made to the MATLAB interface since the last release. The most important two changes are: 1. Following the "warm start" feature of IPOPT, you may pass in initial estimates for the Lagrange multipliers. 2. Callback routines for computing the objective, gradient (etc.) are now specified using function handles instead of strings. (Thanks to Marcus Brubaker at the University of Toronto for the initial suggestion.) ### 3.3.3 (2007-09-25) - minor changes, bug fixes ### 3.3.1 (2007-06-20) Synchronized with all changes in trunk; probably more than to be remembered. In the following a few: - support for Mumps linear solver (contributed by Damian Hocking) - `--print-options` flag for ipopt ASL solver executable to see all Ipopt options (available through `ipopt.opt` file) - added Matlab interface (contributed by Peter Carbonetto) - added support for `f2c` compiler to compiler Fortran code with MSVC++ compiler - new MSVS support (now within MSVS project and also with `f2c`) - a number of small changes/bug fixes/improvements - small change in interface (e.g., `FinalizeSolution` method) ## 3.2 ### 3.2.4 (2007-04-24) - updated download script for Blas to fit netlib's recent changes - using a more recent version of BuildTools ### 3.2.3 (2006-11-29) - updated download script for Lapack to fit to netlib's recent changes ### 3.2 r795 (2006-10-11) - Bugfix in L-BFGS update - fix in configure with detection of `sizeof(int*)` on Cygwin ### 3.2.1 (2006-07-14) - dev release number 764 - Bugfix in least square multiplier estimate. It mainly showed up in LBFGS with restoration phase as seg fault ### 3.2.0 (2006-07-07) - dev release number 757 - changed installation procedure and directory structure to conform with new COIN-OR convention ## 3.1 ### 3.1.0 (2006-04-08) - dev release number 714 Several bug-fixes, improvements and additions. In particular: - new quasi-Newton approximation using L-BFGS - interfaces to linear solver MA57, WSMP, Pardiso (MUMPS and TAUCS not yet completed) - derivative checker - unit test - configure supports compilation under Cygwin with native Windows compilers - ScalableExample - user call-back method in TNLP ## 3.0 ### 3.0.1 (2005-12-04) - Several corrections to Windows files - Fix termination if number of iterations is exceeded in restoration phase ### 3.0.0 (2005-08-26) - dev release number 510 - First official release of the new C++ implementation of Ipopt. ## 2.2 ### no new release (2005-08-19) - corrected detection of BLAS libraries for SUN (make sure the example Makefiles work) - upgrade LICENSE file to CPL version 1.0 as retrieved from www.opensource.org ### 2.2.1e (2005-05-30) - fixed sign of multipliers returned to AMPL (bug reported by Rhoda Baker and Karsten Theissen) - switched to automake 1.9.5 ### no new release (2005-01-07) - bugfix for the limited memory BFGS in case of square problems (bug reported by Wanhe Zhang and Ned Nedialkov) ### 2.2.1d (2004-10-05) - Added `outlev` as an option to the AMPL solver as a synonym for `iprint` - For `iprint` = 0, the output lines per iteration are now suppressed - corrected two bugs in `configure` script (test for size of `long` etc before Fortran libraries as added to `LIBS`; prevent cycling in `make -j 1` test) - internally renamed subroutine `ERROR` to `OPTERROR` (`ERROR` had a name clash for some Fortran compiler) - avoid uninitialized variable in `update_b_lm.f` - minor correction in computation of residual in `get_step_full.F` - minor change for slack correction in `filter.F` ### 2.2.1c (2004-07-20) - corrected bug leading to very small `QTAU` in rare circumstances ### 2.2.1b (2004-05-21) - Make `DFILLINFACT` option available through AMPL interface - Now, later increase of memory requirement for Harwell solvers is also based on `DFILLINFACT`, instead of using a fixed values of 10. ### 2.2.1a (2004-05-13) - fix in `IPOPT/ipopt/mainloop.F`: The multipliers were not scaled back for low printlevel. ### no new release (2004-04-28) - fix in `IPOPT/AMPL_interface/ipoptAMPL.c`: Now the mulitpliers for the constraints are passed back to AMPL. - Added download scripts using `wget` to get ASL, BLAS, and LAPACK more easily. Thanks to Frank Wuebbeling for the hint. ### 2.2.1 (2004-04-25) - AMPL solver executable is now called `ipopt` (instead of `ipoptAMPL`). This fixed also problem with assigning IPOPT options from within AMPL. (reported by Karsten Theissen) - default value for number of iterations is now 10000 (instead of 1000) - new option: `IMAXCPUSEC` to be set to the maximum number of CPU seconds after which the algorithm should stop. The check is performed only at certain points in the algorithm, so that the executable might run longer than specified. The algorithm also stops (as before) when the file "STOP" is detected in the current directory. Finally, a call to `USER_REQUESTED_STOP` has been added if the preprocessor macro `USE_USER_REQUESTED_STOP` has been defined. If this `LOGICAL` function returns `.TRUE.`, the algorithm also stops. This feature was requested by David Ternet. - if IPOPT is run several time in a row, the counting of function evaluations is restarted after every new call of IPOPT. - in `get_step_full`, now check if the number of negative eigenvalues is LESS than then number constraints. If so, increase the pivot tolerance, and if that doesn't help, pretend that the system is singular. (this fixed a problem reported by Hans Mittelmann) - decrease default values for `DPIVTOLMAX` - suppress superflous leading zeros in iteration output. For long output (`ioutput=1`) include CPU time - a few changes regarding the inertia correction (`get_step_full.F`). This decreases CPU time significantly in a few cases. - corrected problem in C-files related to names for `struct`'s (some GNU compiler complained) - changed default options for GNU compilers (now `-O3 -funroll-loops`, no longer `-O2` and `-mieee-fp`) - no reference to MC35 in `resto_tron` if `HAVE_MC35` is not defined - `#error` preprocessor directive removed from `*.F` files, since not all compilers understand it (reported by Hans Mittelmann) - switch to automake 1.8.3 ### 2.2.0 (2004-03-10) Many things have changed since the last official release. Here a few highlights: - easier installation procedure with autoconf - algorithm made more robust and efficient - new restoration phase for filter method (TRON no longer needed for full-space option anymore) - C-interface coinor-ipopt-3.14.17/LICENSE000066400000000000000000000321661473776672200153530ustar00rootroot00000000000000Eclipse Public License - v 2.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial content Distributed under this Agreement, and b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where such changes and/or additions to the Program originate from and are Distributed by that particular Contributor. A Contribution "originates" from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include changes or additions to the Program that are not Modified Works. "Contributor" means any person or entity that Distributes the Program. "Licensed Patents" mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions Distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement or any Secondary License (as applicable), including Contributors. "Derivative Works" shall mean any work, whether in Source Code or other form, that is based on (or derived from) the Program and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. "Modified Works" shall mean any work in Source Code or other form that results from an addition to, deletion from, or modification of the contents of the Program, including, for purposes of clarity any new file in Source Code form that contains any contents of the Program. Modified Works shall not include works that contain only declarations, interfaces, types, classes, structures, or files of the Program solely in each case in order to link to, bind by name, or subclass the Program or Modified Works thereof. "Distribute" means the acts of a) distributing or b) making available in any manner that enables the transfer of a copy. "Source Code" means the form of a Program preferred for making modifications, including but not limited to software source code, documentation source, and configuration files. "Secondary License" means either the GNU General Public License, Version 2.0, or any later versions of that license, including any exceptions or additional permissions as identified by the initial Contributor. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, Distribute and sublicense the Contribution of such Contributor, if any, and such Derivative Works. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in Source Code or other form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to Distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. e) Notwithstanding the terms of any Secondary License, no Contributor makes additional grants to any Recipient (other than those set forth in this Agreement) as a result of such Recipient's receipt of the Program under the terms of a Secondary License (if permitted under the terms of Section 3). 3. REQUIREMENTS 3.1 If a Contributor Distributes the Program in any form, then: a) the Program must also be made available as Source Code, in accordance with section 3.2, and the Contributor must accompany the Program with a statement that the Source Code for the Program is available under this Agreement, and informs Recipients how to obtain it in a reasonable manner on or through a medium customarily used for software exchange; and b) the Contributor may Distribute the Program under a license different than this Agreement, provided that such license: i) effectively disclaims on behalf of all other Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all other Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) does not attempt to limit or alter the recipients' rights in the Source Code under section 3.2; and iv) requires any subsequent distribution of the Program by any party to be under a license that satisfies the requirements of this section 3. 3.2 When the Program is Distributed as Source Code: a) it must be made available under this Agreement, or if the Program (i) is combined with other material in a separate file or files made available under a Secondary License, and (ii) the initial Contributor attached to the Source Code the notice described in Exhibit A of this Agreement, then the Program may be made available under the terms of such Secondary Licenses, and b) a copy of this Agreement must be included with each copy of the Program. 3.3 Contributors may not remove or alter any copyright, patent, trademark, attribution notices, disclaimers of warranty, or limitations of liability ("notices") contained within the Program from any copy of the Program which they Distribute, provided that Contributors may add their own appropriate notices. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be Distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to Distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. Nothing in this Agreement is intended to be enforceable by any entity that is not a Contributor or Recipient. No third-party beneficiary rights are created under this Agreement. coinor-ipopt-3.14.17/Makefile.am000066400000000000000000000042161473776672200163750ustar00rootroot00000000000000# Copyright (C) 2004, 2008 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. # # Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 SUBDIRS = src if BUILD_SIPOPT SUBDIRS += contrib/sIPOPT endif doc_DATA = README.md AUTHORS LICENSE ChangeLog.md .PHONY: test doc javadoc astyle cppcheck cppcheck-config test: all cd test; $(MAKE) test doc : cd doc && doxygen sed -i -e 's@

@

\▸\ @g' doc/html/OPTIONS.html if BUILD_JAVA javadoc : $(JAVADOC) -d javadoc -windowtitle "JIpopt API documentation" $(srcdir)/src/Interfaces/Ipopt.java endif clean-doc: cd doc && rm -rf html *.log *.tag rm -rf javadoc clean-local : clean-doc astyle: cd $(srcdir) && astyle --mode=c -A1 --indent=spaces=3 --indent-switches --min-conditional-indent=1 --convert-tabs --align-pointer=type --pad-oper --add-braces -n -r "*.hpp" "*.h" "*.cpp" "*.c" --exclude=hsl_ma77d.h --exclude=hsl_ma77s.h --exclude=hsl_ma86d.h --exclude=hsl_ma86s.h --exclude=hsl_ma97d.h --exclude=hsl_ma97s.h --exclude=hsl_mc68i.h cd $(srcdir) && astyle --mode=java -A1 --indent=spaces=3 --indent-switches --min-conditional-indent=1 --convert-tabs --align-pointer=type --pad-oper --add-braces -n -r "*.java" cppcheck: cppcheck -q -j4 --enable=all --suppress=uninitMemberVar --suppress=noExplicitConstructor --inline-suppr \ --suppress=cstyleCast:src/Apps/AmplSolver/AmplTNLP.cpp --suppress=constArgument:examples/hs071_c/hs071_c.c \ --addon=threadsafety.py --std=c++03 --std=c99 --error-exitcode=2 --relative-paths=$(srcdir) \ $(IPOPTLIB_CFLAGS) $(IPOPTAMPLINTERFACELIB_CFLAGS) $(addprefix -I,$(shell find $(srcdir)/src -type d)) -Isrc/Common \ -DHAVE_CONFIG_H $(srcdir)/src $(srcdir)/test $(srcdir)/examples cppcheck-config: cppcheck -q --check-config --suppress=missingIncludeSystem --std=c++03 --std=c99 --error-exitcode=2 \ $(IPOPTLIB_CFLAGS) $(IPOPTAMPLINTERFACELIB_CFLAGS) $(addprefix -I,$(shell find $(srcdir)/src -type d)) -Isrc/Common \ -DHAVE_CONFIG_H $(srcdir)/src $(srcdir)/test $(srcdir)/examples coinor-ipopt-3.14.17/Makefile.in000066400000000000000000001020221473776672200164000ustar00rootroot00000000000000# Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2004, 2008 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. # # Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @BUILD_SIPOPT_TRUE@am__append_1 = contrib/sIPOPT subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/Common/config.h \ $(top_builddir)/src/Common/config_ipopt.h CONFIG_CLEAN_FILES = doc/Doxyfile examples/Cpp_example/Makefile \ examples/recursive_nlp/Makefile examples/hs071_cpp/Makefile \ examples/hs071_c/Makefile examples/ScalableProblems/Makefile \ tutorial/CodingExercise/C/1-skeleton/Makefile \ tutorial/CodingExercise/C/2-mistake/Makefile \ tutorial/CodingExercise/C/3-solution/Makefile \ tutorial/CodingExercise/Cpp/1-skeleton/Makefile \ tutorial/CodingExercise/Cpp/2-mistake/Makefile \ tutorial/CodingExercise/Cpp/3-solution/Makefile \ tutorial/CodingExercise/Matlab/1-skeleton/startup.m \ tutorial/CodingExercise/Matlab/2-mistake/startup.m \ tutorial/CodingExercise/Matlab/3-solution/startup.m \ examples/hs071_f/Makefile examples/hs071_f/hs071_fs.f \ examples/hs071_f/hs071_f.f \ tutorial/CodingExercise/Fortran/1-skeleton/TutorialFortran.f \ tutorial/CodingExercise/Fortran/2-mistake/TutorialFortran.f \ tutorial/CodingExercise/Fortran/3-solution/TutorialFortran.f \ tutorial/CodingExercise/Fortran/1-skeleton/Makefile \ tutorial/CodingExercise/Fortran/2-mistake/Makefile \ tutorial/CodingExercise/Fortran/3-solution/Makefile \ examples/hs071_java/Makefile \ examples/ScalableProblems_java/Makefile \ contrib/sIPOPT/examples/parametric_cpp/Makefile \ contrib/sIPOPT/examples/parametric_dsdp_cpp/Makefile \ contrib/sIPOPT/examples/redhess_cpp/Makefile \ contrib/RInterface/src/Makevars.win \ contrib/RInterface/src/Makevars CONFIG_CLEAN_VPATH_FILES = contrib/RInterface/DESCRIPTION \ contrib/RInterface/NAMESPACE contrib/RInterface/inst/CITATION \ contrib/RInterface/inst/doc/ipoptr.Rnw \ contrib/RInterface/inst/doc/ipoptr.pdf \ contrib/RInterface/inst/doc/reflist.bib \ contrib/RInterface/man/ipoptr-package.Rd \ contrib/RInterface/man/ipoptr.Rd \ contrib/RInterface/man/is.ipoptr.Rd \ contrib/RInterface/man/make.sparse.Rd \ contrib/RInterface/man/plot.sparseness.Rd \ contrib/RInterface/man/print.ipoptr.Rd \ contrib/RInterface/man/print.sparseness.Rd \ contrib/RInterface/R/get.option.types.R \ contrib/RInterface/R/ipoptr.R contrib/RInterface/R/is.ipoptr.R \ contrib/RInterface/R/make.sparse.R \ contrib/RInterface/R/plot.sparseness.R \ contrib/RInterface/R/print.ipoptr.R \ contrib/RInterface/R/print.sparseness.R \ contrib/RInterface/tests/approx_banana.R \ contrib/RInterface/tests/banana.R \ contrib/RInterface/tests/hs071_nlp.R \ contrib/RInterface/tests/lasso.R \ contrib/RInterface/tests/mynlp.R \ contrib/RInterface/tests/parameters.R \ contrib/RInterface/tests/sparseness.R \ contrib/RInterface/src/ipoptr.cpp \ contrib/RInterface/src/IpoptRJournal.cpp \ contrib/RInterface/src/IpoptRNLP.cpp \ examples/Cpp_example/cpp_example.cpp \ examples/Cpp_example/MyNLP.cpp examples/Cpp_example/MyNLP.hpp \ examples/hs071_cpp/hs071_main.cpp \ examples/hs071_cpp/hs071_nlp.cpp \ examples/hs071_cpp/hs071_nlp.hpp examples/hs071_c/hs071_c.c \ examples/hs071_java/HS071s.java examples/hs071_java/HS071.java \ tutorial/AmplExperiments/hs71.mod \ tutorial/AmplExperiments/infeasible.mod \ tutorial/AmplExperiments/MoreAmplModels.txt \ tutorial/AmplExperiments/car1.run \ tutorial/AmplExperiments/car1.gp tutorial/Modeling/bad1.mod \ tutorial/Modeling/bad1-fix1.mod \ tutorial/Modeling/bad1-fix2.mod \ tutorial/CodingExercise/exercise_example.mod \ tutorial/CodingExercise/C/1-skeleton/TutorialC.c \ tutorial/CodingExercise/C/2-mistake/TutorialC.c \ tutorial/CodingExercise/C/3-solution/TutorialC.c \ tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_main.cpp \ tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.hpp \ tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.cpp \ tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_main.cpp \ tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.hpp \ tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.cpp \ tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_main.cpp \ tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.hpp \ tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.cpp \ tutorial/CodingExercise/Matlab/1-skeleton/TutorialMatlab.m \ tutorial/CodingExercise/Matlab/2-mistake/TutorialMatlab.m \ tutorial/CodingExercise/Matlab/3-solution/TutorialMatlab.m \ contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp \ contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp \ contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.hpp \ contrib/sIPOPT/examples/parametric_dsdp_cpp/parametric_dsdp_driver.cpp \ contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.cpp \ contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.hpp \ contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp \ contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.hpp \ contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(docdir)" DATA = $(doc_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = src contrib/sIPOPT ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ADD_FFLAGS = @ADD_FFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIT32FCOMMENT = @BIT32FCOMMENT@ BIT64FCOMMENT = @BIT64FCOMMENT@ BITS_PER_POINTER = @BITS_PER_POINTER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COIN_PKG_CONFIG_PATH = @COIN_PKG_CONFIG_PATH@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CXXLIBS = @CXXLIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ FLIBS = @FLIBS@ GREP = @GREP@ HSLLIB_CFLAGS = @HSLLIB_CFLAGS@ HSLLIB_CFLAGS_NOPC = @HSLLIB_CFLAGS_NOPC@ HSLLIB_LFLAGS = @HSLLIB_LFLAGS@ HSLLIB_LFLAGS_NOPC = @HSLLIB_LFLAGS_NOPC@ HSLLIB_PCFILES = @HSLLIB_PCFILES@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPOPTAMPLINTERFACELIB_CFLAGS = @IPOPTAMPLINTERFACELIB_CFLAGS@ IPOPTAMPLINTERFACELIB_CFLAGS_NOPC = @IPOPTAMPLINTERFACELIB_CFLAGS_NOPC@ IPOPTAMPLINTERFACELIB_LFLAGS = @IPOPTAMPLINTERFACELIB_LFLAGS@ IPOPTAMPLINTERFACELIB_LFLAGS_NOPC = @IPOPTAMPLINTERFACELIB_LFLAGS_NOPC@ IPOPTAMPLINTERFACELIB_PCFILES = @IPOPTAMPLINTERFACELIB_PCFILES@ IPOPTLIB_CFLAGS = @IPOPTLIB_CFLAGS@ IPOPTLIB_CFLAGS_NOPC = @IPOPTLIB_CFLAGS_NOPC@ IPOPTLIB_LFLAGS = @IPOPTLIB_LFLAGS@ IPOPTLIB_LFLAGS_NOPC = @IPOPTLIB_LFLAGS_NOPC@ IPOPTLIB_PCFILES = @IPOPTLIB_PCFILES@ JAR = @JAR@ JAVA = @JAVA@ JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIPOPTAMPLINTERFACELIB_CFLAGS = @SIPOPTAMPLINTERFACELIB_CFLAGS@ SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC = @SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC@ SIPOPTAMPLINTERFACELIB_LFLAGS = @SIPOPTAMPLINTERFACELIB_LFLAGS@ SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC = @SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC@ SIPOPTAMPLINTERFACELIB_PCFILES = @SIPOPTAMPLINTERFACELIB_PCFILES@ SIPOPTLIB_CFLAGS_NOPC = @SIPOPTLIB_CFLAGS_NOPC@ SIPOPTLIB_LFLAGS_NOPC = @SIPOPTLIB_LFLAGS_NOPC@ STRIP = @STRIP@ VERSION = @VERSION@ _ACJNI_JAVAC = @_ACJNI_JAVAC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_PKG_CONFIG = @ac_ct_PKG_CONFIG@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ coin_doxy_logname = @coin_doxy_logname@ coin_doxy_tagfiles = @coin_doxy_tagfiles@ coin_doxy_tagname = @coin_doxy_tagname@ coin_doxy_usedot = @coin_doxy_usedot@ coin_have_doxygen = @coin_have_doxygen@ coin_have_latex = @coin_have_latex@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src $(am__append_1) doc_DATA = README.md AUTHORS LICENSE ChangeLog.md all: all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): src/Common/config.h: src/Common/stamp-h1 @test -f $@ || rm -f src/Common/stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/Common/stamp-h1 src/Common/stamp-h1: $(top_srcdir)/src/Common/config.h.in $(top_builddir)/config.status $(AM_V_at)rm -f src/Common/stamp-h1 $(AM_V_GEN)cd $(top_builddir) && $(SHELL) ./config.status src/Common/config.h $(top_srcdir)/src/Common/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(AM_V_GEN)($(am__cd) $(top_srcdir) && $(AUTOHEADER)) $(AM_V_at)rm -f src/Common/stamp-h1 $(AM_V_at)touch $@ src/Common/config_ipopt.h: src/Common/stamp-h2 @test -f $@ || rm -f src/Common/stamp-h2 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) src/Common/stamp-h2 src/Common/stamp-h2: $(top_srcdir)/src/Common/config_ipopt.h.in $(top_builddir)/config.status $(AM_V_at)rm -f src/Common/stamp-h2 $(AM_V_GEN)cd $(top_builddir) && $(SHELL) ./config.status src/Common/config_ipopt.h distclean-hdr: -rm -f src/Common/config.h src/Common/stamp-h1 src/Common/config_ipopt.h src/Common/stamp-h2 doc/Doxyfile: $(top_builddir)/config.status $(top_srcdir)/doc/Doxyfile.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/Cpp_example/Makefile: $(top_builddir)/config.status $(top_srcdir)/examples/Cpp_example/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/recursive_nlp/Makefile: $(top_builddir)/config.status $(top_srcdir)/examples/recursive_nlp/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/hs071_cpp/Makefile: $(top_builddir)/config.status $(top_srcdir)/examples/hs071_cpp/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/hs071_c/Makefile: $(top_builddir)/config.status $(top_srcdir)/examples/hs071_c/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/ScalableProblems/Makefile: $(top_builddir)/config.status $(top_srcdir)/examples/ScalableProblems/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/C/1-skeleton/Makefile: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/C/1-skeleton/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/C/2-mistake/Makefile: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/C/2-mistake/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/C/3-solution/Makefile: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/C/3-solution/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Cpp/1-skeleton/Makefile: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Cpp/1-skeleton/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Cpp/2-mistake/Makefile: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Cpp/2-mistake/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Cpp/3-solution/Makefile: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Cpp/3-solution/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Matlab/1-skeleton/startup.m: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Matlab/1-skeleton/startup.m.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Matlab/2-mistake/startup.m: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Matlab/2-mistake/startup.m.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Matlab/3-solution/startup.m: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Matlab/3-solution/startup.m.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/hs071_f/Makefile: $(top_builddir)/config.status $(top_srcdir)/examples/hs071_f/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/hs071_f/hs071_fs.f: $(top_builddir)/config.status $(top_srcdir)/examples/hs071_f/hs071_fs.f.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/hs071_f/hs071_f.f: $(top_builddir)/config.status $(top_srcdir)/examples/hs071_f/hs071_f.f.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Fortran/1-skeleton/TutorialFortran.f: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Fortran/1-skeleton/TutorialFortran.f.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Fortran/2-mistake/TutorialFortran.f: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Fortran/2-mistake/TutorialFortran.f.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Fortran/3-solution/TutorialFortran.f: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Fortran/3-solution/TutorialFortran.f.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Fortran/1-skeleton/Makefile: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Fortran/1-skeleton/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Fortran/2-mistake/Makefile: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Fortran/2-mistake/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ tutorial/CodingExercise/Fortran/3-solution/Makefile: $(top_builddir)/config.status $(top_srcdir)/tutorial/CodingExercise/Fortran/3-solution/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/hs071_java/Makefile: $(top_builddir)/config.status $(top_srcdir)/examples/hs071_java/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ examples/ScalableProblems_java/Makefile: $(top_builddir)/config.status $(top_srcdir)/examples/ScalableProblems_java/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ contrib/sIPOPT/examples/parametric_cpp/Makefile: $(top_builddir)/config.status $(top_srcdir)/contrib/sIPOPT/examples/parametric_cpp/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ contrib/sIPOPT/examples/parametric_dsdp_cpp/Makefile: $(top_builddir)/config.status $(top_srcdir)/contrib/sIPOPT/examples/parametric_dsdp_cpp/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ contrib/sIPOPT/examples/redhess_cpp/Makefile: $(top_builddir)/config.status $(top_srcdir)/contrib/sIPOPT/examples/redhess_cpp/Makefile.in cd $(top_builddir) && $(SHELL) ./config.status $@ contrib/RInterface/src/Makevars.win: $(top_builddir)/config.status $(top_srcdir)/contrib/RInterface/src/Makevars.in cd $(top_builddir) && $(SHELL) ./config.status $@ contrib/RInterface/src/Makevars: $(top_builddir)/config.status $(top_srcdir)/contrib/RInterface/src/Makevars.in cd $(top_builddir) && $(SHELL) ./config.status $@ mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt install-docDATA: $(doc_DATA) @$(NORMAL_INSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(docdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(docdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(docdir)" || exit $$?; \ done uninstall-docDATA: @$(NORMAL_UNINSTALL) @list='$(doc_DATA)'; test -n "$(docdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir) # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(docdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-hdr \ distclean-libtool distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-docDATA install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-docDATA .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool clean-local cscope cscopelist-am ctags ctags-am \ distclean distclean-generic distclean-hdr distclean-libtool \ distclean-tags dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-docDATA \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-info install-info-am \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-docDATA .PRECIOUS: Makefile .PHONY: test doc javadoc astyle cppcheck cppcheck-config test: all cd test; $(MAKE) test doc : cd doc && doxygen sed -i -e 's@

@

\▸\ @g' doc/html/OPTIONS.html @BUILD_JAVA_TRUE@javadoc : @BUILD_JAVA_TRUE@ $(JAVADOC) -d javadoc -windowtitle "JIpopt API documentation" $(srcdir)/src/Interfaces/Ipopt.java clean-doc: cd doc && rm -rf html *.log *.tag rm -rf javadoc clean-local : clean-doc astyle: cd $(srcdir) && astyle --mode=c -A1 --indent=spaces=3 --indent-switches --min-conditional-indent=1 --convert-tabs --align-pointer=type --pad-oper --add-braces -n -r "*.hpp" "*.h" "*.cpp" "*.c" --exclude=hsl_ma77d.h --exclude=hsl_ma77s.h --exclude=hsl_ma86d.h --exclude=hsl_ma86s.h --exclude=hsl_ma97d.h --exclude=hsl_ma97s.h --exclude=hsl_mc68i.h cd $(srcdir) && astyle --mode=java -A1 --indent=spaces=3 --indent-switches --min-conditional-indent=1 --convert-tabs --align-pointer=type --pad-oper --add-braces -n -r "*.java" cppcheck: cppcheck -q -j4 --enable=all --suppress=uninitMemberVar --suppress=noExplicitConstructor --inline-suppr \ --suppress=cstyleCast:src/Apps/AmplSolver/AmplTNLP.cpp --suppress=constArgument:examples/hs071_c/hs071_c.c \ --addon=threadsafety.py --std=c++03 --std=c99 --error-exitcode=2 --relative-paths=$(srcdir) \ $(IPOPTLIB_CFLAGS) $(IPOPTAMPLINTERFACELIB_CFLAGS) $(addprefix -I,$(shell find $(srcdir)/src -type d)) -Isrc/Common \ -DHAVE_CONFIG_H $(srcdir)/src $(srcdir)/test $(srcdir)/examples cppcheck-config: cppcheck -q --check-config --suppress=missingIncludeSystem --std=c++03 --std=c99 --error-exitcode=2 \ $(IPOPTLIB_CFLAGS) $(IPOPTAMPLINTERFACELIB_CFLAGS) $(addprefix -I,$(shell find $(srcdir)/src -type d)) -Isrc/Common \ -DHAVE_CONFIG_H $(srcdir)/src $(srcdir)/test $(srcdir)/examples # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% coinor-ipopt-3.14.17/README.md000066400000000000000000000236151473776672200156240ustar00rootroot00000000000000Ipopt ===== Introduction ------------ Ipopt (Interior Point OPTimizer, pronounced eye-pea-Opt) is a software package for large-scale [nonlinear optimization](http://wiki.mcs.anl.gov/NEOS/index.php/Nonlinear_Programming_FAQ). It is designed to find (local) solutions of mathematical optimization problems of the form $$\begin{align} \min_{x \in R^n}\ & f(x), \\ \text{s.t.}\ & g_L \le g(x) \le g_U, \\ & x_L \le x \le x_U, \end{align}$$ where $f: R^n \rightarrow R$ is the objective function, and $g: R^n \rightarrow R^m$ are the constraint functions. The vectors $g_L$ and $g_U$ denote the lower and upper bounds on the constraints, and the vectors $x_L$ and $x_U$ are the bounds on the variables $x$. The functions $f(x)$ and $g(x)$ can be nonlinear and nonconvex, but should be twice continuously differentiable. Note that equality constraints can be formulated in the above formulation by setting the corresponding components of $g_L$ and $g_U$ to the same value. Ipopt is part of the [COIN-OR Initiative](http://www.coin-or.org). The Ipopt project webpage is . Background ---------- Ipopt is written in C++ and is released as open source code under the [Eclipse Public License (EPL)](LICENSE). The code has been written by [Andreas Wächter](http://www.mccormick.northwestern.edu/directory/profiles/Andreas-Waechter.html) and [Carl Laird](http://allthingsoptimal.com/biography/). The COIN-OR project managers for Ipopt are [Andreas Wächter](http://users.iems.northwestern.edu/~andreasw) und [Stefan Vigerske](https://www.gams.com/~svigerske). For a list of **all contributors**, see the [AUTHORS file](AUTHORS). The C++ version has first been [released on Aug 26, 2005](http://list.coin-or.org/pipermail/ipopt/2005-August/000331.html) as version 3.0.0. The previously released [pre-3.0 Fortran version](https://github.com/coin-or/Ipopt/tree/stable/2.3) is no longer maintained. The Ipopt distribution can be used to generate a library that can be linked to one's own C++, C, Fortran, or Java code, as well as a solver executable for the [AMPL](http://www.ampl.com) modeling environment. The package includes an interface to the [R](http://www.r-project.org/) programming environment. IPOPT can be used on Linux/UNIX, macOS, and Windows platforms. As open source software, the source code for Ipopt is provided without charge. You are free to use it, also for commercial purposes. You are also free to modify the source code (with the restriction that you need to make your changes public if you decide to distribute your version in any way, e.g. as an executable); for details see the EPL license. And we are certainly very keen on feedback from users, including contributions! In order to compile Ipopt, certain third party code is required (such as some linear algebra routines). Those are available under different conditions/licenses. If you want to learn more about Ipopt, you can find references in the [bibliography of the documentation](https://coin-or.github.io/Ipopt/citelist.html). For information on projects or papers that use Ipopt, refer to the [Ipopt usage stories and papers](https://github.com/coin-or/Ipopt/discussions/497) discussion. Getting Started --------------- Please consult the [detailed installation instructions](https://coin-or.github.io/Ipopt/INSTALL.html) in the Ipopt documentation. In the following, we only summarize some main points. ### Dependencies Ipopt requires at least one of the following solvers for systems of linear equations: - MA27, MA57, HSL_MA77, HSL_MA86, or HSL_MA97 from the [Harwell Subroutines Library](http://hsl.rl.ac.uk) (HSL). It is recommended to use project [ThirdParty-HSL](https://github.com/coin-or-tools/ThirdParty-HSL) to build a HSL library for use by Ipopt or to use [prebuild macOS/Windows/Linux libraries from STFC](https://licences.stfc.ac.uk/products/Software/HSL/LibHSL), see the [Ipopt installation instruction](https://coin-or.github.io/Ipopt/INSTALL.html#DOWNLOAD_HSL). - [Parallel Sparse Direct Linear Solver](http://www.pardiso-project.org) (Pardiso). Note, that the Intel Math Kernel Library (MKL) also includes a version of Pardiso, but the one from Pardiso Project often offers better performance. - [Sparse Parallel Robust Algorithms Library](https://github.com/ralna/spral) (SPRAL). - [MUltifrontal Massively Parallel sparse direct Solver](http://mumps.enseeiht.fr/) (MUMPS). It is highly recommended to use project [ThirdParty-Mumps](https://github.com/coin-or-tools/ThirdParty-Mumps) to build a MUMPS library for use by Ipopt. - [Watson Sparse Matrix Package](http://www.research.ibm.com/projects/wsmp) A fast implementation of BLAS and LAPACK is required by Ipopt. To build the AMPL interface of Ipopt, the AMPL Solver Library (ASL) is required. It is recommended to use project [ThirdParty-ASL](https://github.com/coin-or-tools/ThirdParty-ASL) to build a ASL library for use by Ipopt. ### Build After installation of dependencies, an Ipopt build and installation follows these 4 steps: 1. Run `./configure`. Use `./configure --help` to see available options. 2. Run `make` to build the Ipopt libraries. If ASL was made available, also Ipopt executables will be build. 3. Run `make test` to test the Ipopt build. 4. Run `make install` to install Ipopt (libraries, executables, and header files). It is suggested to use the same installation prefix (`--prefix` option of `configure`) when configuring the build of ThirdParty-ASL, ThirdParty-HSL, ThirdParty-MUMPS, and Ipopt. ### Using coinbrew An alternative to the above steps is to use the `coinbrew` script from https://coin-or.github.io/coinbrew/. `coinbrew` automates the download of the source code for ASL, MUMPS, and Ipopt and the sequential build and installation of these three packages. After obtaining the `coinbrew` script, run /path/to/coinbrew fetch Ipopt --no-prompt /path/to/coinbrew build Ipopt --prefix=/dir/to/install --test --no-prompt --verbosity=3 /path/to/coinbrew install Ipopt --no-prompt More details on using coinbrew can be found at the instructions on [Getting Started with the COIN-OR Optimization Suite](https://coin-or.github.io/user_introduction). ### Precompiled binaries Some precompiled binaries of Ipopt are also available: - **[Ipopt releases page](https://github.com/coin-or/Ipopt/releases)** provides libraries and executables for Windows - **[JuliaBinaryWrappers](https://github.com/JuliaBinaryWrappers/Ipopt_jll.jl/releases)** provides libraries and executables; [libHSL](https://licences.stfc.ac.uk/products/Software/HSL/LibHSL) provides prebuild HSL libraries - **[IDEAS](https://github.com/IDAES/idaes-ext/releases)** provides executables; these executables include HSL solvers Getting Help ------------ * **[Ipopt Documentation](https://coin-or.github.io/Ipopt/)** with installation instructions, options reference, and more * **[Issue tracking system](https://github.com/coin-or/Ipopt/issues/)**: If you believe you found a **bug** in the code, please use the issue tracking system. Please include as much information as possible, and if possible some (ideally simple) example code so that we can reproduce the error. * **[Discussions](https://github.com/coin-or/Ipopt/discussions)**: ask questions, share ideas, engage with the Ipopt community * **[Mailing list archive](http://list.coin-or.org/pipermail/ipopt/)** (2002-2020): predecessor of Discussions * External resources: * [short Ipopt tutorial](https://doi.org/10.4230/DagSemProc.09061.16) Please Cite Us -------------- We provide this program in the hope that it may be useful to others, and we would very much like to hear about your experience with it. If you found it helpful and are using it within our software, we encourage you to add your feedback to the [Ipopt usage stories and papers](https://github.com/coin-or/Ipopt/discussions/497) discussion. Since a lot of time and effort has gone into Ipopt's development, **please cite the following publication if you are using Ipopt for your own research**: * A. Wächter and L. T. Biegler, **[On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming](http://dx.doi.org/10.1007/s10107-004-0559-y)**, _Mathematical Programming_ 106(1), pp. 25-57, 2006 ([preprint](http://www.optimization-online.org/DB_HTML/2004/03/836.html)) Versioning ---------- Ipopts version numbers have the form x.y.z. x.y specifies the major and minor version number of Ipopt. An increase in x or y can mean the addition or removal of features, backward-incompatible API changes, etc. Increases in y indicate less severe changes than increases in x. For example, the change from Ipopt 2 to Ipopt 3 came due to a complete rewrite of Ipopt in a different programming language. z specifies the release number of Ipopt. An increase in z usually means bugfixes or additions of small feature. Changes to the API, if any, are done in a backward-compatible way. However, the ABI may changed in a backward-incompatible way. Source code is organized in branches named stable/x.y. Development towards a next x.y.z release is happening on the stable/x.y branch. The code on branch stable/x.y already caries a x.y.z version number, which can correspond to the next x.y.z release that will be made from this branch. The default branch of the repository is the latest stable/x.y branch, even if x.y is still in beta testing. An Ipopt x.y.z release is associated with a tag releases/x.y.z on branch stable/x.y. Releases are fixed and don't change. Additional branches may exist where development of bugfixes or features is taking place. A branch devel may collect development for the next Ipopt x.y version. It will be renamed to stable/x.y when it is considered stable enough for beta testing. If you want to contribute a bugfix or small feature, please create a pull-request to the latest stable/x.y branch. If you want to contribute a larger feature or something else that changes the API, please create a pull-request to branch devel, if existing, and latest stable/x.y otherwise. coinor-ipopt-3.14.17/appveyor.yml000066400000000000000000000043641473776672200167350ustar00rootroot00000000000000platform: - x64 environment: matrix: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 ARCH: win64-mingw PRECISION: double - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 ARCH: win64-mingw PRECISION: single #- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 # ARCH: win64-msvc15 #- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 # ARCH: win64-msvc16 install: - IF %ARCH%==win64-msvc14 (CALL "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x64) - IF %ARCH%==win64-msvc14 (CALL C:\"Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86_amd64) - IF %ARCH%==win64-msvc15 (CALL C:\"Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 8.1) - IF %ARCH%==win64-msvc16 (CALL C:\"Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvarsall.bat" x64 8.1) - IF %ARCH%==win64-mingw (CALL C:\msys64\usr\bin\bash -lc "pacman -S mingw-w64-x86_64-lapack mingw-w64-x86_64-metis mingw-w64-x86_64-gcc-fortran --noconfirm") - IF %ARCH%==win64-mingw (CALL C:\msys64\usr\bin\bash -lc "PATH=/mingw64/bin:$PATH ; gcc --version; g++ --version; gfortran --version; pkg-config --libs lapack ; echo PATH=$PATH") build_script: - IF %ARCH%-%PRECISION%==win64-mingw-double (CALL C:\msys64\usr\bin\bash -lc "PATH=/mingw64/bin:$PATH ; git clone --depth 1 https://github.com/coin-or-tools/ThirdParty-ASL && cd ThirdParty-ASL && ./get.ASL && ./configure --prefix=$HOME/install && make && make install") - IF %ARCH%==win64-mingw (CALL C:\msys64\usr\bin\bash -lc "PATH=/mingw64/bin:$PATH ; git clone --depth 1 https://github.com/coin-or-tools/ThirdParty-Mumps && cd ThirdParty-Mumps && ./get.Mumps && ./configure --prefix=$HOME/install --with-precision=%PRECISION% && make && make install") - IF %ARCH%==win64-mingw (CALL C:\msys64\usr\bin\bash -lc "PATH=/mingw64/bin:$PATH ; JAVA_HOME=/c/Progra~2/Java/jdk1.8.0 ; /c/projects/ipopt/configure --prefix=$HOME/install --with-precision=%PRECISION% && make && make install") - IF %ARCH%==win64-msvc15 (CALL C:\msys64\usr\bin\bash -lc "/c/projects/ipopt/configure --enable-msvc && make") test_script: - IF %ARCH%==win64-mingw (CALL C:\msys64\usr\bin\bash -lc "PATH=/mingw64/bin:$PATH ; make test") coinor-ipopt-3.14.17/ar-lib000077500000000000000000000140311473776672200154310ustar00rootroot00000000000000#! /bin/sh # Wrapper for Microsoft lib.exe me=ar-lib scriptversion=2024-06-19.01; # UTC # Copyright (C) 2010-2024 Free Software Foundation, Inc. # Written by Peter Rosin . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # func_error message func_error () { echo "$me: $1" 1>&2 exit 1 } file_conv= # func_file_conv build_file # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv in mingw) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin | msys) file=`cygpath -m "$file" || echo "$file"` ;; wine) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_at_file at_file operation archive # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE # for each of them. # When interpreting the content of the @FILE, do NOT use func_file_conv, # since the user would need to supply preconverted file names to # binutils ar, at least for MinGW. func_at_file () { operation=$2 archive=$3 at_file_contents=`cat "$1"` eval set x "$at_file_contents" shift for member do $AR -NOLOGO $operation:"$member" "$archive" || exit $? done } case $1 in '') func_error "no command. Try '$0 --help' for more information." ;; -h | --h*) cat <. GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "$me (GNU Automake) $scriptversion" exit $? ;; esac if test $# -lt 3; then func_error "you must specify a program, an action and an archive" fi AR=$1 shift while : do if test $# -lt 2; then func_error "you must specify a program, an action and an archive" fi case $1 in -lib | -LIB \ | -ltcg | -LTCG \ | -machine* | -MACHINE* \ | -subsystem* | -SUBSYSTEM* \ | -verbose | -VERBOSE \ | -wx* | -WX* ) AR="$AR $1" shift ;; -nologo | -NOLOGO) # We always invoke AR with -nologo, so don't need to add it again. shift ;; *) action=$1 shift break ;; esac done orig_archive=$1 shift func_file_conv "$orig_archive" archive=$file # strip leading dash in $action action=${action#-} delete= extract= list= quick= replace= index= create= while test -n "$action" do case $action in d*) delete=yes ;; x*) extract=yes ;; t*) list=yes ;; q*) quick=yes ;; r*) replace=yes ;; s*) index=yes ;; S*) ;; # the index is always updated implicitly c*) create=yes ;; u*) ;; # TODO: don't ignore the update modifier v*) ;; # TODO: don't ignore the verbose modifier *) func_error "unknown action specified" ;; esac action=${action#?} done case $delete$extract$list$quick$replace,$index in yes,* | ,yes) ;; yesyes*) func_error "more than one action specified" ;; *) func_error "no action specified" ;; esac if test -n "$delete"; then if test ! -f "$orig_archive"; then func_error "archive not found" fi for member do case $1 in @*) func_at_file "${1#@}" -REMOVE "$archive" ;; *) func_file_conv "$1" $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $? ;; esac done elif test -n "$extract"; then if test ! -f "$orig_archive"; then func_error "archive not found" fi if test $# -gt 0; then for member do case $1 in @*) func_at_file "${1#@}" -EXTRACT "$archive" ;; *) func_file_conv "$1" $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $? ;; esac done else $AR -NOLOGO -LIST "$archive" | tr -d '\r' | sed -e 's/\\/\\\\/g' \ | while read member do $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $? done fi elif test -n "$quick$replace"; then if test ! -f "$orig_archive"; then if test -z "$create"; then echo "$me: creating $orig_archive" fi orig_archive= else orig_archive=$archive fi for member do case $1 in @*) func_file_conv "${1#@}" set x "$@" "@$file" ;; *) func_file_conv "$1" set x "$@" "$file" ;; esac shift shift done if test -n "$orig_archive"; then $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $? else $AR -NOLOGO -OUT:"$archive" "$@" || exit $? fi elif test -n "$list"; then if test ! -f "$orig_archive"; then func_error "archive not found" fi $AR -NOLOGO -LIST "$archive" || exit $? fi coinor-ipopt-3.14.17/compile000077500000000000000000000214331473776672200157170ustar00rootroot00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2024-06-19.01; # UTC # Copyright (C) 1999-2024 Free Software Foundation, Inc. # Written by Tom Tromey . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' # We need space, tab and new line, in precisely that order. Quoting is # there to prevent tools from complaining about whitespace usage. IFS=" "" $nl" file_conv= # func_file_conv build_file lazy # Convert a $build file to $host form and store it in $file # Currently only supports Windows hosts. If the determined conversion # type is listed in (the comma separated) LAZY, no conversion will # take place. func_file_conv () { file=$1 case $file in / | /[!/]*) # absolute file, and not a UNC file if test -z "$file_conv"; then # lazily determine how to convert abs files case `uname -s` in MINGW*) file_conv=mingw ;; CYGWIN* | MSYS*) file_conv=cygwin ;; *) file_conv=wine ;; esac fi case $file_conv/,$2, in *,$file_conv,*) ;; mingw/*) file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` ;; cygwin/* | msys/*) file=`cygpath -m "$file" || echo "$file"` ;; wine/*) file=`winepath -w "$file" || echo "$file"` ;; esac ;; esac } # func_cl_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 found=no save_IFS=$IFS IFS=';' for dir in $lib_path $LIB do IFS=$save_IFS if $shared && test -f "$dir/$lib.dll.lib"; then found=yes lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # func_cl_wrapper cl arg... # Adjust compile command to suit cl func_cl_wrapper () { # Assume a capable shell lib_path= shared=: linker_opts= outfile= implib= linking=1 for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. eat=1 case $2 in *.o | *.lo | *.[oO][bB][jJ]) func_file_conv "$2" set x "$@" -Fo"$file" shift outfile="$file" ;; *) func_file_conv "$2" set x "$@" -Fe"$file" shift outfile="$file" ;; esac ;; -I) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -static) shared=false ;; -Wl,*) arg=${1#-Wl,} save_ifs="$IFS"; IFS=',' for flag in $arg; do IFS="$save_ifs" linker_opts="$linker_opts $flag" case "$flag" in -IMPLIB:*) implib=${flag#-IMPLIB:} ;; esac done IFS="$save_ifs" ;; -Xlinker) eat=1 linker_opts="$linker_opts $2" ;; -std=*) set x "$@" -std:"${1#-std=}" shift ;; -*) set x "$@" "$1" shift ;; *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) func_file_conv "$1" set x "$@" -Tp"$file" shift ;; *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) func_file_conv "$1" mingw set x "$@" "$file" shift ;; -c) linking=0 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -n "$linker_opts"; then linker_opts="-link$linker_opts" fi # remove old $implib, so we can distinguish between generated and not-generated implib below if test -n "$implib" && test -f "$implib" ; then rm "$implib" ; fi # add path to MSVC link in front on PATH if we seem to link (check isn't so accurate, but some false-positives shouldn't matter) # compiler will call the link it finds in the PATH, and we don't want it to use MSYS' /bin/link # we assume that MSVC link is in same directory as cl and that cl is found in PATH if test "$linking" = 1 && comppath=`which cl 2>/dev/null` ; then comppath=`dirname "$comppath"` #echo "Adding $comppath to front of PATH" PATH="$comppath:$PATH" fi #echo "compile: $@ $linker_opts" "$@" $linker_opts || exit $? # if -implib got lost or ignored, then the lib should be named ${outfile/.dll/.lib} and we rename that file if test -n "$implib" && test ! -f "$implib" ; then echo "compile: mv ${outfile/.dll/.lib} $implib" mv "${outfile/.dll/.lib}" "$implib" fi exit 0 } eat= case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: compile [--help] [--version] PROGRAM [ARGS] Wrapper for compilers which do not understand '-c -o'. Remove '-o dest.o' from ARGS, run PROGRAM with the remaining arguments, and rename the output as expected. If you are trying to build a whole package this is not the right script to run: please start by reading the file 'INSTALL'. Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "compile (GNU Automake) $scriptversion" exit $? ;; cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ clang-cl | *[/\\]clang-cl | clang-cl.exe | *[/\\]clang-cl.exe | \ icl | *[/\\]icl | icl.exe | *[/\\]icl.exe | \ icx | *[/\\]icx | icx.exe | *[/\\]icx.exe | \ ifx | *[/\\]ifx | ifx.exe | *[/\\]ifx.exe | \ ifort | *[/\\]ifort | ifort.exe | *[/\\]ifort.exe ) func_cl_wrapper "$@" # Doesn't return... ;; esac ofile= cfile= for arg do if test -n "$eat"; then eat= else case $1 in -o) # configure might choose to run compile as 'compile cc -o foo foo.c'. # So we strip '-o arg' only if arg is an object. eat=1 case $2 in *.o | *.obj) ofile=$2 ;; *) set x "$@" -o "$2" shift ;; esac ;; *.c) cfile=$1 set x "$@" "$1" shift ;; *) set x "$@" "$1" shift ;; esac fi shift done if test -z "$ofile" || test -z "$cfile"; then # If no '-o' option was seen then we might have been invoked from a # pattern rule where we don't need one. That is ok -- this is a # normal compilation that the losing compiler can handle. If no # '.c' file was seen then we are probably linking. That is also # ok. exec "$@" fi # Name of file we expect compiler to create. cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` # Create the lock directory. # Note: use '[/\\:.-]' here to ensure that we don't use the same name # that we are using for the .o file. Also, base the name on the expected # object file name, since that is what matters with a parallel build. lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d while true; do if mkdir "$lockdir" >/dev/null 2>&1; then break fi sleep 1 done # FIXME: race condition here if user kills between mkdir and trap. trap "rmdir '$lockdir'; exit 1" 1 2 15 # Run the compile. "$@" ret=$? if test -f "$cofile"; then test "$cofile" = "$ofile" || mv "$cofile" "$ofile" elif test -f "${cofile}bj"; then test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" fi rmdir "$lockdir" exit $ret # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: coinor-ipopt-3.14.17/config.guess000077500000000000000000001430461473776672200166660ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2024-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner; maintained since 2000 by Ben Elliston. # # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.guess # # Please send patches to . # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system '$me' is run on. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi # Just in case it came from the environment. GUESS= # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, 'CC_FOR_BUILD' used to be named 'HOST_CC'. We still # use 'HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. tmp= # shellcheck disable=SC2172 trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 set_cc_for_build() { # prevent multiple calls if $tmp is already set test "$tmp" && return 0 : "${TMPDIR=/tmp}" # shellcheck disable=SC2039,SC3028 { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } dummy=$tmp/dummy case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in ,,) echo "int x;" > "$dummy.c" for driver in cc gcc c89 c99 ; do if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then CC_FOR_BUILD=$driver break fi done if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac } # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if test -f /.attbin/uname ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case $UNAME_SYSTEM in Linux|GNU|GNU/*) LIBC=unknown set_cc_for_build cat <<-EOF > "$dummy.c" #if defined(__ANDROID__) LIBC=android #else #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #elif defined(__GLIBC__) LIBC=gnu #elif defined(__LLVM_LIBC__) LIBC=llvm #else #include /* First heuristic to detect musl libc. */ #ifdef __DEFINED_va_list LIBC=musl #endif #endif #endif EOF cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` eval "$cc_set_libc" # Second heuristic to detect musl libc. if [ "$LIBC" = unknown ] && command -v ldd >/dev/null && ldd --version 2>&1 | grep -q ^musl; then LIBC=musl fi # If the system lacks a compiler, then just pick glibc. # We could probably try harder. if [ "$LIBC" = unknown ]; then LIBC=gnu fi ;; esac # Note: order is significant - the case branches are not exclusive. case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ /sbin/sysctl -n hw.machine_arch 2>/dev/null || \ /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \ echo unknown)` case $UNAME_MACHINE_ARCH in aarch64eb) machine=aarch64_be-unknown ;; armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; earmv*) arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` machine=${arch}${endian}-unknown ;; *) machine=$UNAME_MACHINE_ARCH-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently (or will in the future) and ABI. case $UNAME_MACHINE_ARCH in earm*) os=netbsdelf ;; arm*|i386|m68k|ns32k|sh3*|sparc|vax) set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # Determine ABI tags. case $UNAME_MACHINE_ARCH in earm*) expr='s/^earmv[0-9]/-eabi/;s/eb$//' abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case $UNAME_VERSION in Debian*) release='-gnu' ;; *) release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. GUESS=$machine-${os}${release}${abi-} ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE ;; *:SecBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE ;; *:LibertyBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE ;; *:MidnightBSD:*:*) GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE ;; *:ekkoBSD:*:*) GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE ;; *:SolidBSD:*:*) GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE ;; *:OS108:*:*) GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE ;; macppc:MirBSD:*:*) GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE ;; *:MirBSD:*:*) GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE ;; *:Sortix:*:*) GUESS=$UNAME_MACHINE-unknown-sortix ;; *:Twizzler:*:*) GUESS=$UNAME_MACHINE-unknown-twizzler ;; *:Redox:*:*) GUESS=$UNAME_MACHINE-unknown-redox ;; mips:OSF1:*.*) GUESS=mips-dec-osf1 ;; alpha:OSF1:*:*) # Reset EXIT trap before exiting to avoid spurious non-zero exit code. trap '' 0 case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case $ALPHA_CPU_TYPE in "EV4 (21064)") UNAME_MACHINE=alpha ;; "EV4.5 (21064)") UNAME_MACHINE=alpha ;; "LCA4 (21066/21068)") UNAME_MACHINE=alpha ;; "EV5 (21164)") UNAME_MACHINE=alphaev5 ;; "EV5.6 (21164A)") UNAME_MACHINE=alphaev56 ;; "EV5.6 (21164PC)") UNAME_MACHINE=alphapca56 ;; "EV5.7 (21164PC)") UNAME_MACHINE=alphapca57 ;; "EV6 (21264)") UNAME_MACHINE=alphaev6 ;; "EV6.7 (21264A)") UNAME_MACHINE=alphaev67 ;; "EV6.8CB (21264C)") UNAME_MACHINE=alphaev68 ;; "EV6.8AL (21264B)") UNAME_MACHINE=alphaev68 ;; "EV6.8CX (21264D)") UNAME_MACHINE=alphaev68 ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE=alphaev69 ;; "EV7 (21364)") UNAME_MACHINE=alphaev7 ;; "EV7.9 (21364A)") UNAME_MACHINE=alphaev79 ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` GUESS=$UNAME_MACHINE-dec-osf$OSF_REL ;; Amiga*:UNIX_System_V:4.0:*) GUESS=m68k-unknown-sysv4 ;; *:[Aa]miga[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-amigaos ;; *:[Mm]orph[Oo][Ss]:*:*) GUESS=$UNAME_MACHINE-unknown-morphos ;; *:OS/390:*:*) GUESS=i370-ibm-openedition ;; *:z/VM:*:*) GUESS=s390-ibm-zvmoe ;; *:OS400:*:*) GUESS=powerpc-ibm-os400 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) GUESS=arm-acorn-riscix$UNAME_RELEASE ;; arm*:riscos:*:*|arm*:RISCOS:*:*) GUESS=arm-unknown-riscos ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) GUESS=hppa1.1-hitachi-hiuxmpp ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. case `(/bin/universe) 2>/dev/null` in att) GUESS=pyramid-pyramid-sysv3 ;; *) GUESS=pyramid-pyramid-bsd ;; esac ;; NILE*:*:*:dcosx) GUESS=pyramid-pyramid-svr4 ;; DRS?6000:unix:4.0:6*) GUESS=sparc-icl-nx6 ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) GUESS=sparc-icl-nx7 ;; esac ;; s390x:SunOS:*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL ;; sun4H:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-hal-solaris2$SUN_REL ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris2$SUN_REL ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) GUESS=i386-pc-auroraux$UNAME_RELEASE ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) set_cc_for_build SUN_ARCH=i386 # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -m64 -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH=x86_64 fi fi SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=$SUN_ARCH-pc-solaris2$SUN_REL ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=sparc-sun-solaris3$SUN_REL ;; sun4*:SunOS:*:*) case `/usr/bin/arch -k` in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like '4.1.3-JL'. SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'` GUESS=sparc-sun-sunos$SUN_REL ;; sun3*:SunOS:*:*) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 case `/bin/arch` in sun3) GUESS=m68k-sun-sunos$UNAME_RELEASE ;; sun4) GUESS=sparc-sun-sunos$UNAME_RELEASE ;; esac ;; aushp:SunOS:*:*) GUESS=sparc-auspex-sunos$UNAME_RELEASE ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) GUESS=m68k-atari-mint$UNAME_RELEASE ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) GUESS=m68k-milan-mint$UNAME_RELEASE ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) GUESS=m68k-hades-mint$UNAME_RELEASE ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) GUESS=m68k-unknown-mint$UNAME_RELEASE ;; m68k:machten:*:*) GUESS=m68k-apple-machten$UNAME_RELEASE ;; powerpc:machten:*:*) GUESS=powerpc-apple-machten$UNAME_RELEASE ;; RISC*:Mach:*:*) GUESS=mips-dec-mach_bsd4.3 ;; RISC*:ULTRIX:*:*) GUESS=mips-dec-ultrix$UNAME_RELEASE ;; VAX*:ULTRIX*:*:*) GUESS=vax-dec-ultrix$UNAME_RELEASE ;; 2020:CLIX:*:* | 2430:CLIX:*:*) GUESS=clipper-intergraph-clix$UNAME_RELEASE ;; mips:*:*:UMIPS | mips:*:*:RISCos) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`"$dummy" "$dummyarg"` && { echo "$SYSTEM_NAME"; exit; } GUESS=mips-mips-riscos$UNAME_RELEASE ;; Motorola:PowerMAX_OS:*:*) GUESS=powerpc-motorola-powermax ;; Motorola:*:4.3:PL8-*) GUESS=powerpc-harris-powermax ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) GUESS=powerpc-harris-powermax ;; Night_Hawk:Power_UNIX:*:*) GUESS=powerpc-harris-powerunix ;; m88k:CX/UX:7*:*) GUESS=m88k-harris-cxux7 ;; m88k:*:4*:R4*) GUESS=m88k-motorola-sysv4 ;; m88k:*:3*:R3*) GUESS=m88k-motorola-sysv3 ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 then if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ test "$TARGET_BINARY_INTERFACE"x = x then GUESS=m88k-dg-dgux$UNAME_RELEASE else GUESS=m88k-dg-dguxbcs$UNAME_RELEASE fi else GUESS=i586-dg-dgux$UNAME_RELEASE fi ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) GUESS=m88k-dolphin-sysv3 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 GUESS=m88k-motorola-sysv3 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) GUESS=m88k-tektronix-sysv3 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) GUESS=m68k-tektronix-bsd ;; *:IRIX*:*:*) IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'` GUESS=mips-sgi-irix$IRIX_REL ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. GUESS=romp-ibm-aix # uname -m gives an 8 hex-code CPU id ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) GUESS=i386-ibm-aix ;; ia64:AIX:*:*) if test -x /usr/bin/oslevel ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` then GUESS=$SYSTEM_NAME else GUESS=rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then GUESS=rs6000-ibm-aix3.2.4 else GUESS=rs6000-ibm-aix3.2 fi ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if test -x /usr/bin/lslpp ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else IBM_REV=$UNAME_VERSION.$UNAME_RELEASE fi GUESS=$IBM_ARCH-ibm-aix$IBM_REV ;; *:AIX:*:*) GUESS=rs6000-ibm-aix ;; ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) GUESS=romp-ibm-bsd4.4 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and GUESS=romp-ibm-bsd$UNAME_RELEASE # 4.3 with uname added to ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) GUESS=rs6000-bull-bosx ;; DPX/2?00:B.O.S.:*:*) GUESS=m68k-bull-sysv3 ;; 9000/[34]??:4.3bsd:1.*:*) GUESS=m68k-hp-bsd ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) GUESS=m68k-hp-bsd4.4 ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` case $UNAME_MACHINE in 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if test -x /usr/bin/getconf; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case $sc_cpu_version in 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case $sc_kernel_bits in 32) HP_ARCH=hppa2.0n ;; 64) HP_ARCH=hppa2.0w ;; '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 esac ;; esac fi if test "$HP_ARCH" = ""; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if test "$HP_ARCH" = hppa2.0w then set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH=hppa2.0w else HP_ARCH=hppa64 fi fi GUESS=$HP_ARCH-hp-hpux$HPUX_REV ;; ia64:HP-UX:*:*) HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'` GUESS=ia64-hp-hpux$HPUX_REV ;; 3050*:HI-UX:*:*) set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } GUESS=unknown-hitachi-hiuxwe2 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) GUESS=hppa1.1-hp-bsd ;; 9000/8??:4.3bsd:*:*) GUESS=hppa1.0-hp-bsd ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) GUESS=hppa1.0-hp-mpeix ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) GUESS=hppa1.1-hp-osf ;; hp8??:OSF1:*:*) GUESS=hppa1.0-hp-osf ;; i*86:OSF1:*:*) if test -x /usr/sbin/sysversion ; then GUESS=$UNAME_MACHINE-unknown-osf1mk else GUESS=$UNAME_MACHINE-unknown-osf1 fi ;; parisc*:Lites*:*:*) GUESS=hppa1.1-hp-lites ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) GUESS=c1-convex-bsd ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) GUESS=c34-convex-bsd ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) GUESS=c38-convex-bsd ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) GUESS=c4-convex-bsd ;; CRAY*Y-MP:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=ymp-cray-unicos$CRAY_REL ;; CRAY*[A-Z]90:*:*:*) echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=t90-cray-unicos$CRAY_REL ;; CRAY*T3E:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=alphaev5-cray-unicosmk$CRAY_REL ;; CRAY*SV1:*:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=sv1-cray-unicos$CRAY_REL ;; *:UNICOS/mp:*:*) CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'` GUESS=craynv-cray-unicosmp$CRAY_REL ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL} ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE ;; sparc*:BSD/OS:*:*) GUESS=sparc-unknown-bsdi$UNAME_RELEASE ;; *:BSD/OS:*:*) GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE ;; arm:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` set_cc_for_build if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi else FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf fi ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in amd64) UNAME_PROCESSOR=x86_64 ;; i386) UNAME_PROCESSOR=i586 ;; esac FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL ;; i*:CYGWIN*:*) GUESS=$UNAME_MACHINE-pc-cygwin ;; *:MINGW64*:*) GUESS=$UNAME_MACHINE-pc-mingw64 ;; *:MINGW*:*) GUESS=$UNAME_MACHINE-pc-mingw32 ;; *:MSYS*:*) GUESS=$UNAME_MACHINE-pc-msys ;; i*:PW*:*) GUESS=$UNAME_MACHINE-pc-pw32 ;; *:SerenityOS:*:*) GUESS=$UNAME_MACHINE-pc-serenity ;; *:Interix*:*) case $UNAME_MACHINE in x86) GUESS=i586-pc-interix$UNAME_RELEASE ;; authenticamd | genuineintel | EM64T) GUESS=x86_64-unknown-interix$UNAME_RELEASE ;; IA64) GUESS=ia64-unknown-interix$UNAME_RELEASE ;; esac ;; i*:UWIN*:*) GUESS=$UNAME_MACHINE-pc-uwin ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) GUESS=x86_64-pc-cygwin ;; prep*:SunOS:5.*:*) SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'` GUESS=powerpcle-unknown-solaris2$SUN_REL ;; *:GNU:*:*) # the GNU system GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'` GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL ;; *:GNU/*:*:*) # other systems with GNU libc and userland GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"` GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC ;; x86_64:[Mm]anagarm:*:*|i?86:[Mm]anagarm:*:*) GUESS="$UNAME_MACHINE-pc-managarm-mlibc" ;; *:[Mm]anagarm:*:*) GUESS="$UNAME_MACHINE-unknown-managarm-mlibc" ;; *:Minix:*:*) GUESS=$UNAME_MACHINE-unknown-minix ;; aarch64:Linux:*:*) set_cc_for_build CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then ABI=64 sed 's/^ //' << EOF > "$dummy.c" #ifdef __ARM_EABI__ #ifdef __ARM_PCS_VFP ABI=eabihf #else ABI=eabi #endif #endif EOF cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` eval "$cc_set_abi" case $ABI in eabi | eabihf) CPU=armv8l; LIBCABI=$LIBC$ABI ;; esac fi GUESS=$CPU-unknown-linux-$LIBCABI ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC=gnulibc1 ; fi GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; arm*:Linux:*:*) set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then GUESS=$UNAME_MACHINE-unknown-linux-$LIBC else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi else GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf fi fi ;; avr32*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; cris:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; crisv32:Linux:*:*) GUESS=$UNAME_MACHINE-axis-linux-$LIBC ;; e2k:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; frv:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; hexagon:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:Linux:*:*) GUESS=$UNAME_MACHINE-pc-linux-$LIBC ;; ia64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; k1om:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; kvx:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; kvx:cos:*:*) GUESS=$UNAME_MACHINE-unknown-cos ;; kvx:mbr:*:*) GUESS=$UNAME_MACHINE-unknown-mbr ;; loongarch32:Linux:*:* | loongarch64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m32r*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; m68*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; mips:Linux:*:* | mips64:Linux:*:*) set_cc_for_build IS_GLIBC=0 test x"${LIBC}" = xgnu && IS_GLIBC=1 sed 's/^ //' << EOF > "$dummy.c" #undef CPU #undef mips #undef mipsel #undef mips64 #undef mips64el #if ${IS_GLIBC} && defined(_ABI64) LIBCABI=gnuabi64 #else #if ${IS_GLIBC} && defined(_ABIN32) LIBCABI=gnuabin32 #else LIBCABI=${LIBC} #endif #endif #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa64r6 #else #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 CPU=mipsisa32r6 #else #if defined(__mips64) CPU=mips64 #else CPU=mips #endif #endif #endif #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) MIPS_ENDIAN=el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) MIPS_ENDIAN= #else MIPS_ENDIAN= #endif #endif EOF cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'` eval "$cc_set_vars" test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } ;; mips64el:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; openrisc*:Linux:*:*) GUESS=or1k-unknown-linux-$LIBC ;; or32:Linux:*:* | or1k*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; padre:Linux:*:*) GUESS=sparc-unknown-linux-$LIBC ;; parisc64:Linux:*:* | hppa64:Linux:*:*) GUESS=hppa64-unknown-linux-$LIBC ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;; PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;; *) GUESS=hppa-unknown-linux-$LIBC ;; esac ;; ppc64:Linux:*:*) GUESS=powerpc64-unknown-linux-$LIBC ;; ppc:Linux:*:*) GUESS=powerpc-unknown-linux-$LIBC ;; ppc64le:Linux:*:*) GUESS=powerpc64le-unknown-linux-$LIBC ;; ppcle:Linux:*:*) GUESS=powerpcle-unknown-linux-$LIBC ;; riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; s390:Linux:*:* | s390x:Linux:*:*) GUESS=$UNAME_MACHINE-ibm-linux-$LIBC ;; sh64*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sh*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; sparc:Linux:*:* | sparc64:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; tile*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; vax:Linux:*:*) GUESS=$UNAME_MACHINE-dec-linux-$LIBC ;; x86_64:Linux:*:*) set_cc_for_build CPU=$UNAME_MACHINE LIBCABI=$LIBC if test "$CC_FOR_BUILD" != no_compiler_found; then ABI=64 sed 's/^ //' << EOF > "$dummy.c" #ifdef __i386__ ABI=x86 #else #ifdef __ILP32__ ABI=x32 #endif #endif EOF cc_set_abi=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^ABI' | sed 's, ,,g'` eval "$cc_set_abi" case $ABI in x86) CPU=i686 ;; x32) LIBCABI=${LIBC}x32 ;; esac fi GUESS=$CPU-pc-linux-$LIBCABI ;; xtensa*:Linux:*:*) GUESS=$UNAME_MACHINE-unknown-linux-$LIBC ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. GUESS=i386-sequent-sysv4 ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION ;; i*86:OS/2:*:*) # If we were able to find 'uname', then EMX Unix compatibility # is probably installed. GUESS=$UNAME_MACHINE-pc-os2-emx ;; i*86:XTS-300:*:STOP) GUESS=$UNAME_MACHINE-unknown-stop ;; i*86:atheos:*:*) GUESS=$UNAME_MACHINE-unknown-atheos ;; i*86:syllable:*:*) GUESS=$UNAME_MACHINE-pc-syllable ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) GUESS=i386-unknown-lynxos$UNAME_RELEASE ;; i*86:*DOS:*:*) GUESS=$UNAME_MACHINE-pc-msdosdjgpp ;; i*86:*:4.*:*) UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL fi ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL else GUESS=$UNAME_MACHINE-pc-sysv32 fi ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configure will decide that # this is a cross-build. GUESS=i586-pc-msdosdjgpp ;; Intel:Mach:3*:*) GUESS=i386-pc-mach3 ;; paragon:*:*:*) GUESS=i860-intel-osf1 ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then GUESS=i860-stardent-sysv$UNAME_RELEASE # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. GUESS=i860-unknown-sysv$UNAME_RELEASE # Unknown i860-SVR4 fi ;; mini*:CTIX:SYS*5:*) # "miniframe" GUESS=m68010-convergent-sysv ;; mc68k:UNIX:SYSTEM5:3.51m) GUESS=m68k-convergent-sysv ;; M680?0:D-NIX:5.3:*) GUESS=m68k-diab-dnix ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) GUESS=m68k-unknown-lynxos$UNAME_RELEASE ;; mc68030:UNIX_System_V:4.*:*) GUESS=m68k-atari-sysv4 ;; TSUNAMI:LynxOS:2.*:*) GUESS=sparc-unknown-lynxos$UNAME_RELEASE ;; rs6000:LynxOS:2.*:*) GUESS=rs6000-unknown-lynxos$UNAME_RELEASE ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) GUESS=powerpc-unknown-lynxos$UNAME_RELEASE ;; SM[BE]S:UNIX_SV:*:*) GUESS=mips-dde-sysv$UNAME_RELEASE ;; RM*:ReliantUNIX-*:*:*) GUESS=mips-sni-sysv4 ;; RM*:SINIX-*:*:*) GUESS=mips-sni-sysv4 ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` GUESS=$UNAME_MACHINE-sni-sysv4 else GUESS=ns32k-sni-sysv fi ;; PENTIUM:*:4.0*:*) # Unisys 'ClearPath HMP IX 4000' SVR4/MP effort # says GUESS=i586-unisys-sysv4 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm GUESS=hppa1.1-stratus-sysv4 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. GUESS=i860-stratus-sysv4 ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. GUESS=$UNAME_MACHINE-stratus-vos ;; *:VOS:*:*) # From Paul.Green@stratus.com. GUESS=hppa1.1-stratus-vos ;; mc68*:A/UX:*:*) GUESS=m68k-apple-aux$UNAME_RELEASE ;; news*:NEWS-OS:6*:*) GUESS=mips-sony-newsos6 ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if test -d /usr/nec; then GUESS=mips-nec-sysv$UNAME_RELEASE else GUESS=mips-unknown-sysv$UNAME_RELEASE fi ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. GUESS=powerpc-be-beos ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. GUESS=powerpc-apple-beos ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. GUESS=i586-pc-beos ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. GUESS=i586-pc-haiku ;; ppc:Haiku:*:*) # Haiku running on Apple PowerPC GUESS=powerpc-apple-haiku ;; *:Haiku:*:*) # Haiku modern gcc (not bound by BeOS compat) GUESS=$UNAME_MACHINE-unknown-haiku ;; SX-4:SUPER-UX:*:*) GUESS=sx4-nec-superux$UNAME_RELEASE ;; SX-5:SUPER-UX:*:*) GUESS=sx5-nec-superux$UNAME_RELEASE ;; SX-6:SUPER-UX:*:*) GUESS=sx6-nec-superux$UNAME_RELEASE ;; SX-7:SUPER-UX:*:*) GUESS=sx7-nec-superux$UNAME_RELEASE ;; SX-8:SUPER-UX:*:*) GUESS=sx8-nec-superux$UNAME_RELEASE ;; SX-8R:SUPER-UX:*:*) GUESS=sx8r-nec-superux$UNAME_RELEASE ;; SX-ACE:SUPER-UX:*:*) GUESS=sxace-nec-superux$UNAME_RELEASE ;; Power*:Rhapsody:*:*) GUESS=powerpc-apple-rhapsody$UNAME_RELEASE ;; *:Rhapsody:*:*) GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE ;; arm64:Darwin:*:*) GUESS=aarch64-apple-darwin$UNAME_RELEASE ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac if command -v xcode-select > /dev/null 2> /dev/null && \ ! xcode-select --print-path > /dev/null 2> /dev/null ; then # Avoid executing cc if there is no toolchain installed as # cc will be a stub that puts up a graphical alert # prompting the user to install developer tools. CC_FOR_BUILD=no_compiler_found else set_cc_for_build fi if test "$CC_FOR_BUILD" != no_compiler_found; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_PPC >/dev/null then UNAME_PROCESSOR=powerpc fi elif test "$UNAME_PROCESSOR" = i386 ; then # uname -m returns i386 or x86_64 UNAME_PROCESSOR=$UNAME_MACHINE fi GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = x86; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE ;; *:QNX:*:4*) GUESS=i386-pc-qnx ;; NEO-*:NONSTOP_KERNEL:*:*) GUESS=neo-tandem-nsk$UNAME_RELEASE ;; NSE-*:NONSTOP_KERNEL:*:*) GUESS=nse-tandem-nsk$UNAME_RELEASE ;; NSR-*:NONSTOP_KERNEL:*:*) GUESS=nsr-tandem-nsk$UNAME_RELEASE ;; NSV-*:NONSTOP_KERNEL:*:*) GUESS=nsv-tandem-nsk$UNAME_RELEASE ;; NSX-*:NONSTOP_KERNEL:*:*) GUESS=nsx-tandem-nsk$UNAME_RELEASE ;; *:NonStop-UX:*:*) GUESS=mips-compaq-nonstopux ;; BS2000:POSIX*:*:*) GUESS=bs2000-siemens-sysv ;; DS/*:UNIX_System_V:*:*) GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "${cputype-}" = 386; then UNAME_MACHINE=i386 elif test "x${cputype-}" != x; then UNAME_MACHINE=$cputype fi GUESS=$UNAME_MACHINE-unknown-plan9 ;; *:TOPS-10:*:*) GUESS=pdp10-unknown-tops10 ;; *:TENEX:*:*) GUESS=pdp10-unknown-tenex ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) GUESS=pdp10-dec-tops20 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) GUESS=pdp10-xkl-tops20 ;; *:TOPS-20:*:*) GUESS=pdp10-unknown-tops20 ;; *:ITS:*:*) GUESS=pdp10-unknown-its ;; SEI:*:*:SEIUX) GUESS=mips-sei-seiux$UNAME_RELEASE ;; *:DragonFly:*:*) DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'` GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case $UNAME_MACHINE in A*) GUESS=alpha-dec-vms ;; I*) GUESS=ia64-dec-vms ;; V*) GUESS=vax-dec-vms ;; esac ;; *:XENIX:*:SysV) GUESS=i386-pc-xenix ;; i*86:skyos:*:*) SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'` GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL ;; i*86:rdos:*:*) GUESS=$UNAME_MACHINE-pc-rdos ;; i*86:Fiwix:*:*) GUESS=$UNAME_MACHINE-pc-fiwix ;; *:AROS:*:*) GUESS=$UNAME_MACHINE-unknown-aros ;; x86_64:VMkernel:*:*) GUESS=$UNAME_MACHINE-unknown-esx ;; amd64:Isilon\ OneFS:*:*) GUESS=x86_64-unknown-onefs ;; *:Unleashed:*:*) GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE ;; *:Ironclad:*:*) GUESS=$UNAME_MACHINE-unknown-ironclad ;; esac # Do we have a guess based on uname results? if test "x$GUESS" != x; then echo "$GUESS" exit fi # No uname command or uname output not recognized. set_cc_for_build cat > "$dummy.c" < #include #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #include #if defined(_SIZE_T_) || defined(SIGLOST) #include #endif #endif #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) #if !defined (ultrix) #include #if defined (BSD) #if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); #else #if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); #else printf ("vax-dec-bsd\n"); exit (0); #endif #endif #else printf ("vax-dec-bsd\n"); exit (0); #endif #else #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname un; uname (&un); printf ("vax-dec-ultrix%s\n", un.release); exit (0); #else printf ("vax-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) #if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) #if defined(_SIZE_T_) || defined(SIGLOST) struct utsname *un; uname (&un); printf ("mips-dec-ultrix%s\n", un.release); exit (0); #else printf ("mips-dec-ultrix\n"); exit (0); #endif #endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } echo "$0: unable to guess system type" >&2 case $UNAME_MACHINE:$UNAME_SYSTEM in mips:Linux | mips64:Linux) # If we got here on MIPS GNU/Linux, output extra information. cat >&2 <&2 <&2 </dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = "$UNAME_MACHINE" UNAME_RELEASE = "$UNAME_RELEASE" UNAME_SYSTEM = "$UNAME_SYSTEM" UNAME_VERSION = "$UNAME_VERSION" EOF fi exit 1 # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: coinor-ipopt-3.14.17/config.sub000077500000000000000000001077561473776672200163410ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2024 Free Software Foundation, Inc. # shellcheck disable=SC2006,SC2268 # see below for rationale timestamp='2024-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that # program. This Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches to . # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # You can get the latest version of this script from: # https://git.savannah.gnu.org/cgit/config.git/plain/config.sub # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. # The "shellcheck disable" line above the timestamp inhibits complaints # about features and limitations of the classic Bourne shell that were # superseded or lifted in POSIX. However, this script identifies a wide # variety of pre-POSIX systems that do not have POSIX shells at all, and # even some reasonably current systems (Solaris 10 as case-in-point) still # have a pre-POSIX /bin/sh. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS Canonicalize a configuration name. Options: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright 1992-2024 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try '$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; *local*) # First pass through any local machine types. echo "$1" exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Split fields of configuration type # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read field1 field2 field3 field4 <&2 exit 1 ;; *-*-*-*) basic_machine=$field1-$field2 basic_os=$field3-$field4 ;; *-*-*) # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two # parts maybe_os=$field2-$field3 case $maybe_os in nto-qnx* | linux-* | uclinux-uclibc* \ | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ | storm-chaos* | os2-emx* | rtmk-nova* | managarm-* \ | windows-* ) basic_machine=$field1 basic_os=$maybe_os ;; android-linux) basic_machine=$field1-unknown basic_os=linux-android ;; *) basic_machine=$field1-$field2 basic_os=$field3 ;; esac ;; *-*) # A lone config we happen to match not fitting any pattern case $field1-$field2 in decstation-3100) basic_machine=mips-dec basic_os= ;; *-*) # Second component is usually, but not always the OS case $field2 in # Prevent following clause from handling this valid os sun*os*) basic_machine=$field1 basic_os=$field2 ;; zephyr*) basic_machine=$field1-unknown basic_os=$field2 ;; # Manufacturers dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ | unicom* | ibm* | next | hp | isi* | apollo | altos* \ | convergent* | ncr* | news | 32* | 3600* | 3100* \ | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ | ultra | tti* | harris | dolphin | highlevel | gould \ | cbm | ns | masscomp | apple | axis | knuth | cray \ | microblaze* | sim | cisco \ | oki | wec | wrs | winbond) basic_machine=$field1-$field2 basic_os= ;; *) basic_machine=$field1 basic_os=$field2 ;; esac ;; esac ;; *) # Convert single-component short-hands not valid as part of # multi-component configurations. case $field1 in 386bsd) basic_machine=i386-pc basic_os=bsd ;; a29khif) basic_machine=a29k-amd basic_os=udi ;; adobe68k) basic_machine=m68010-adobe basic_os=scout ;; alliant) basic_machine=fx80-alliant basic_os= ;; altos | altos3068) basic_machine=m68k-altos basic_os= ;; am29k) basic_machine=a29k-none basic_os=bsd ;; amdahl) basic_machine=580-amdahl basic_os=sysv ;; amiga) basic_machine=m68k-unknown basic_os= ;; amigaos | amigados) basic_machine=m68k-unknown basic_os=amigaos ;; amigaunix | amix) basic_machine=m68k-unknown basic_os=sysv4 ;; apollo68) basic_machine=m68k-apollo basic_os=sysv ;; apollo68bsd) basic_machine=m68k-apollo basic_os=bsd ;; aros) basic_machine=i386-pc basic_os=aros ;; aux) basic_machine=m68k-apple basic_os=aux ;; balance) basic_machine=ns32k-sequent basic_os=dynix ;; blackfin) basic_machine=bfin-unknown basic_os=linux ;; cegcc) basic_machine=arm-unknown basic_os=cegcc ;; convex-c1) basic_machine=c1-convex basic_os=bsd ;; convex-c2) basic_machine=c2-convex basic_os=bsd ;; convex-c32) basic_machine=c32-convex basic_os=bsd ;; convex-c34) basic_machine=c34-convex basic_os=bsd ;; convex-c38) basic_machine=c38-convex basic_os=bsd ;; cray) basic_machine=j90-cray basic_os=unicos ;; crds | unos) basic_machine=m68k-crds basic_os= ;; da30) basic_machine=m68k-da30 basic_os= ;; decstation | pmax | pmin | dec3100 | decstatn) basic_machine=mips-dec basic_os= ;; delta88) basic_machine=m88k-motorola basic_os=sysv3 ;; dicos) basic_machine=i686-pc basic_os=dicos ;; djgpp) basic_machine=i586-pc basic_os=msdosdjgpp ;; ebmon29k) basic_machine=a29k-amd basic_os=ebmon ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson basic_os=ose ;; gmicro) basic_machine=tron-gmicro basic_os=sysv ;; go32) basic_machine=i386-pc basic_os=go32 ;; h8300hms) basic_machine=h8300-hitachi basic_os=hms ;; h8300xray) basic_machine=h8300-hitachi basic_os=xray ;; h8500hms) basic_machine=h8500-hitachi basic_os=hms ;; harris) basic_machine=m88k-harris basic_os=sysv3 ;; hp300 | hp300hpux) basic_machine=m68k-hp basic_os=hpux ;; hp300bsd) basic_machine=m68k-hp basic_os=bsd ;; hppaosf) basic_machine=hppa1.1-hp basic_os=osf ;; hppro) basic_machine=hppa1.1-hp basic_os=proelf ;; i386mach) basic_machine=i386-mach basic_os=mach ;; isi68 | isi) basic_machine=m68k-isi basic_os=sysv ;; m68knommu) basic_machine=m68k-unknown basic_os=linux ;; magnum | m3230) basic_machine=mips-mips basic_os=sysv ;; merlin) basic_machine=ns32k-utek basic_os=sysv ;; mingw64) basic_machine=x86_64-pc basic_os=mingw64 ;; mingw32) basic_machine=i686-pc basic_os=mingw32 ;; mingw32ce) basic_machine=arm-unknown basic_os=mingw32ce ;; monitor) basic_machine=m68k-rom68k basic_os=coff ;; morphos) basic_machine=powerpc-unknown basic_os=morphos ;; moxiebox) basic_machine=moxie-unknown basic_os=moxiebox ;; msdos) basic_machine=i386-pc basic_os=msdos ;; msys) basic_machine=i686-pc basic_os=msys ;; mvs) basic_machine=i370-ibm basic_os=mvs ;; nacl) basic_machine=le32-unknown basic_os=nacl ;; ncr3000) basic_machine=i486-ncr basic_os=sysv4 ;; netbsd386) basic_machine=i386-pc basic_os=netbsd ;; netwinder) basic_machine=armv4l-rebel basic_os=linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony basic_os=newsos ;; news1000) basic_machine=m68030-sony basic_os=newsos ;; necv70) basic_machine=v70-nec basic_os=sysv ;; nh3000) basic_machine=m68k-harris basic_os=cxux ;; nh[45]000) basic_machine=m88k-harris basic_os=cxux ;; nindy960) basic_machine=i960-intel basic_os=nindy ;; mon960) basic_machine=i960-intel basic_os=mon960 ;; nonstopux) basic_machine=mips-compaq basic_os=nonstopux ;; os400) basic_machine=powerpc-ibm basic_os=os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson basic_os=ose ;; os68k) basic_machine=m68k-none basic_os=os68k ;; paragon) basic_machine=i860-intel basic_os=osf ;; parisc) basic_machine=hppa-unknown basic_os=linux ;; psp) basic_machine=mipsallegrexel-sony basic_os=psp ;; pw32) basic_machine=i586-unknown basic_os=pw32 ;; rdos | rdos64) basic_machine=x86_64-pc basic_os=rdos ;; rdos32) basic_machine=i386-pc basic_os=rdos ;; rom68k) basic_machine=m68k-rom68k basic_os=coff ;; sa29200) basic_machine=a29k-amd basic_os=udi ;; sei) basic_machine=mips-sei basic_os=seiux ;; sequent) basic_machine=i386-sequent basic_os= ;; sps7) basic_machine=m68k-bull basic_os=sysv2 ;; st2000) basic_machine=m68k-tandem basic_os= ;; stratus) basic_machine=i860-stratus basic_os=sysv4 ;; sun2) basic_machine=m68000-sun basic_os= ;; sun2os3) basic_machine=m68000-sun basic_os=sunos3 ;; sun2os4) basic_machine=m68000-sun basic_os=sunos4 ;; sun3) basic_machine=m68k-sun basic_os= ;; sun3os3) basic_machine=m68k-sun basic_os=sunos3 ;; sun3os4) basic_machine=m68k-sun basic_os=sunos4 ;; sun4) basic_machine=sparc-sun basic_os= ;; sun4os3) basic_machine=sparc-sun basic_os=sunos3 ;; sun4os4) basic_machine=sparc-sun basic_os=sunos4 ;; sun4sol2) basic_machine=sparc-sun basic_os=solaris2 ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun basic_os= ;; sv1) basic_machine=sv1-cray basic_os=unicos ;; symmetry) basic_machine=i386-sequent basic_os=dynix ;; t3e) basic_machine=alphaev5-cray basic_os=unicos ;; t90) basic_machine=t90-cray basic_os=unicos ;; toad1) basic_machine=pdp10-xkl basic_os=tops20 ;; tpf) basic_machine=s390x-ibm basic_os=tpf ;; udi29k) basic_machine=a29k-amd basic_os=udi ;; ultra3) basic_machine=a29k-nyu basic_os=sym1 ;; v810 | necv810) basic_machine=v810-nec basic_os=none ;; vaxv) basic_machine=vax-dec basic_os=sysv ;; vms) basic_machine=vax-dec basic_os=vms ;; vsta) basic_machine=i386-pc basic_os=vsta ;; vxworks960) basic_machine=i960-wrs basic_os=vxworks ;; vxworks68) basic_machine=m68k-wrs basic_os=vxworks ;; vxworks29k) basic_machine=a29k-wrs basic_os=vxworks ;; xbox) basic_machine=i686-pc basic_os=mingw32 ;; ymp) basic_machine=ymp-cray basic_os=unicos ;; *) basic_machine=$1 basic_os= ;; esac ;; esac # Decode 1-component or ad-hoc basic machines case $basic_machine in # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) cpu=hppa1.1 vendor=winbond ;; op50n) cpu=hppa1.1 vendor=oki ;; op60c) cpu=hppa1.1 vendor=oki ;; ibm*) cpu=i370 vendor=ibm ;; orion105) cpu=clipper vendor=highlevel ;; mac | mpw | mac-mpw) cpu=m68k vendor=apple ;; pmac | pmac-mpw) cpu=powerpc vendor=apple ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) cpu=m68000 vendor=att ;; 3b*) cpu=we32k vendor=att ;; bluegene*) cpu=powerpc vendor=ibm basic_os=cnk ;; decsystem10* | dec10*) cpu=pdp10 vendor=dec basic_os=tops10 ;; decsystem20* | dec20*) cpu=pdp10 vendor=dec basic_os=tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) cpu=m68k vendor=motorola ;; dpx2*) cpu=m68k vendor=bull basic_os=sysv3 ;; encore | umax | mmax) cpu=ns32k vendor=encore ;; elxsi) cpu=elxsi vendor=elxsi basic_os=${basic_os:-bsd} ;; fx2800) cpu=i860 vendor=alliant ;; genix) cpu=ns32k vendor=ns ;; h3050r* | hiux*) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) cpu=m68000 vendor=hp ;; hp9k3[2-9][0-9]) cpu=m68k vendor=hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) cpu=hppa1.1 vendor=hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) cpu=hppa1.1 vendor=hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) cpu=hppa1.0 vendor=hp ;; i*86v32) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv32 ;; i*86v4*) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv4 ;; i*86v) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=sysv ;; i*86sol2) cpu=`echo "$1" | sed -e 's/86.*/86/'` vendor=pc basic_os=solaris2 ;; j90 | j90-cray) cpu=j90 vendor=cray basic_os=${basic_os:-unicos} ;; iris | iris4d) cpu=mips vendor=sgi case $basic_os in irix*) ;; *) basic_os=irix4 ;; esac ;; miniframe) cpu=m68000 vendor=convergent ;; *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) cpu=m68k vendor=atari basic_os=mint ;; news-3600 | risc-news) cpu=mips vendor=sony basic_os=newsos ;; next | m*-next) cpu=m68k vendor=next case $basic_os in openstep*) ;; nextstep*) ;; ns2*) basic_os=nextstep2 ;; *) basic_os=nextstep3 ;; esac ;; np1) cpu=np1 vendor=gould ;; op50n-* | op60c-*) cpu=hppa1.1 vendor=oki basic_os=proelf ;; pa-hitachi) cpu=hppa1.1 vendor=hitachi basic_os=hiuxwe2 ;; pbd) cpu=sparc vendor=tti ;; pbb) cpu=m68k vendor=tti ;; pc532) cpu=ns32k vendor=pc532 ;; pn) cpu=pn vendor=gould ;; power) cpu=power vendor=ibm ;; ps2) cpu=i386 vendor=ibm ;; rm[46]00) cpu=mips vendor=siemens ;; rtpc | rtpc-*) cpu=romp vendor=ibm ;; sde) cpu=mipsisa32 vendor=sde basic_os=${basic_os:-elf} ;; simso-wrs) cpu=sparclite vendor=wrs basic_os=vxworks ;; tower | tower-32) cpu=m68k vendor=ncr ;; vpp*|vx|vx-*) cpu=f301 vendor=fujitsu ;; w65) cpu=w65 vendor=wdc ;; w89k-*) cpu=hppa1.1 vendor=winbond basic_os=proelf ;; none) cpu=none vendor=none ;; leon|leon[3-9]) cpu=sparc vendor=$basic_machine ;; leon-*|leon[3-9]-*) cpu=sparc vendor=`echo "$basic_machine" | sed 's/-.*//'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read cpu vendor <&2 exit 1 ;; esac ;; esac # Here we canonicalize certain aliases for manufacturers. case $vendor in digital*) vendor=dec ;; commodore*) vendor=cbm ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if test x"$basic_os" != x then # First recognize some ad-hoc cases, or perhaps split kernel-os, or else just # set os. obj= case $basic_os in gnu/linux*) kernel=linux os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'` ;; os2-emx) kernel=os2 os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'` ;; nto-qnx*) kernel=nto os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'` ;; *-*) # shellcheck disable=SC2162 saved_IFS=$IFS IFS="-" read kernel os <&2 fi ;; *) echo "Invalid configuration '$1': OS '$os' not recognized" 1>&2 exit 1 ;; esac case $obj in aout* | coff* | elf* | pe*) ;; '') # empty is fine ;; *) echo "Invalid configuration '$1': Machine code format '$obj' not recognized" 1>&2 exit 1 ;; esac # Here we handle the constraint that a (synthetic) cpu and os are # valid only in combination with each other and nowhere else. case $cpu-$os in # The "javascript-unknown-ghcjs" triple is used by GHC; we # accept it here in order to tolerate that, but reject any # variations. javascript-ghcjs) ;; javascript-* | *-ghcjs) echo "Invalid configuration '$1': cpu '$cpu' is not valid with os '$os$obj'" 1>&2 exit 1 ;; esac # As a final step for OS-related things, validate the OS-kernel combination # (given a valid OS), if there is a kernel. case $kernel-$os-$obj in linux-gnu*- | linux-android*- | linux-dietlibc*- | linux-llvm*- \ | linux-mlibc*- | linux-musl*- | linux-newlib*- \ | linux-relibc*- | linux-uclibc*- ) ;; uclinux-uclibc*- ) ;; managarm-mlibc*- | managarm-kernel*- ) ;; windows*-msvc*-) ;; -dietlibc*- | -llvm*- | -mlibc*- | -musl*- | -newlib*- | -relibc*- \ | -uclibc*- ) # These are just libc implementations, not actual OSes, and thus # require a kernel. echo "Invalid configuration '$1': libc '$os' needs explicit kernel." 1>&2 exit 1 ;; -kernel*- ) echo "Invalid configuration '$1': '$os' needs explicit kernel." 1>&2 exit 1 ;; *-kernel*- ) echo "Invalid configuration '$1': '$kernel' does not support '$os'." 1>&2 exit 1 ;; *-msvc*- ) echo "Invalid configuration '$1': '$os' needs 'windows'." 1>&2 exit 1 ;; kfreebsd*-gnu*- | kopensolaris*-gnu*-) ;; vxworks-simlinux- | vxworks-simwindows- | vxworks-spe-) ;; nto-qnx*-) ;; os2-emx-) ;; *-eabi*- | *-gnueabi*-) ;; none--*) # None (no kernel, i.e. freestanding / bare metal), # can be paired with an machine code file format ;; -*-) # Blank kernel with real OS is always fine. ;; --*) # Blank kernel and OS with real machine code file format is always fine. ;; *-*-*) echo "Invalid configuration '$1': Kernel '$kernel' not known to work with OS '$os'." 1>&2 exit 1 ;; esac # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) case $cpu-$os in *-riscix*) vendor=acorn ;; *-sunos*) vendor=sun ;; *-cnk* | *-aix*) vendor=ibm ;; *-beos*) vendor=be ;; *-hpux*) vendor=hp ;; *-mpeix*) vendor=hp ;; *-hiux*) vendor=hitachi ;; *-unos*) vendor=crds ;; *-dgux*) vendor=dg ;; *-luna*) vendor=omron ;; *-genix*) vendor=ns ;; *-clix*) vendor=intergraph ;; *-mvs* | *-opened*) vendor=ibm ;; *-os400*) vendor=ibm ;; s390-* | s390x-*) vendor=ibm ;; *-ptx*) vendor=sequent ;; *-tpf*) vendor=ibm ;; *-vxsim* | *-vxworks* | *-windiss*) vendor=wrs ;; *-aux*) vendor=apple ;; *-hms*) vendor=hitachi ;; *-mpw* | *-macos*) vendor=apple ;; *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) vendor=atari ;; *-vos*) vendor=stratus ;; esac ;; esac echo "$cpu-$vendor${kernel:+-$kernel}${os:+-$os}${obj:+-$obj}" exit # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: coinor-ipopt-3.14.17/configure000077500000000000000000037225701473776672200162650ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.72 for Ipopt 3.14.17. # # Report bugs to . # # # Copyright (C) 1992-1996, 1998-2017, 2020-2023 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # # # Copyright 2004, 2011 International Business Machines and others. # All Rights Reserved. # This file is part of the open source package IPOPT which is distributed # under the Eclipse Public License. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case e in #( e) case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else case e in #( e) exitcode=1; echo positional parameters were not saved. ;; esac fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO PATH=/empty FPATH=/empty; export PATH FPATH test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else case e in #( e) as_have_required=no ;; esac fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi ;; esac fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed 'exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org and $0: https://github.com/coin-or/Ipopt/issues/new about your $0: system, including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi ;; esac fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' t clear :clear s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated SHELL=${CONFIG_SHELL-/bin/sh} test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='Ipopt' PACKAGE_TARNAME='ipopt' PACKAGE_VERSION='3.14.17' PACKAGE_STRING='Ipopt 3.14.17' PACKAGE_BUGREPORT='https://github.com/coin-or/Ipopt/issues/new' PACKAGE_URL='https://github.com/coin-or/Ipopt' ac_unique_file="src/Common/IpDebug.hpp" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_STDIO_H # include #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_STRING_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_header_c_list= ac_subst_vars='am__EXEEXT_FALSE am__EXEEXT_TRUE LTLIBOBJS LIBOBJS SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC SIPOPTLIB_CFLAGS_NOPC SIPOPTLIB_LFLAGS_NOPC IPOPTAMPLINTERFACELIB_CFLAGS_NOPC IPOPTAMPLINTERFACELIB_LFLAGS_NOPC IPOPTLIB_CFLAGS_NOPC IPOPTLIB_LFLAGS_NOPC BUILD_SIPOPT_FALSE BUILD_SIPOPT_TRUE BUILD_JAVA_FALSE BUILD_JAVA_TRUE JAVADOC JAVA JAR _ACJNI_JAVAC JAVAC BUILD_INEXACT_FALSE BUILD_INEXACT_TRUE BIT64FCOMMENT BIT32FCOMMENT BITS_PER_POINTER HAVE_WSMP_FALSE HAVE_WSMP_TRUE COIN_HAS_SPRAL_FALSE COIN_HAS_SPRAL_TRUE HAVE_PARDISO_MKL_FALSE HAVE_PARDISO_MKL_TRUE HAVE_MA28_FALSE HAVE_MA28_TRUE HSLLIB_CFLAGS_NOPC HSLLIB_LFLAGS_NOPC COIN_HAS_HSL_FALSE COIN_HAS_HSL_TRUE HSLLIB_PCFILES HSLLIB_CFLAGS HSLLIB_LFLAGS COIN_HAS_MUMPS_FALSE COIN_HAS_MUMPS_TRUE IPOPTLIB_CFLAGS COIN_HAS_ASL_FALSE COIN_HAS_ASL_TRUE SIPOPTAMPLINTERFACELIB_PCFILES SIPOPTAMPLINTERFACELIB_CFLAGS SIPOPTAMPLINTERFACELIB_LFLAGS IPOPTAMPLINTERFACELIB_PCFILES IPOPTAMPLINTERFACELIB_CFLAGS IPOPTAMPLINTERFACELIB_LFLAGS COIN_HAS_LAPACK_FALSE COIN_HAS_LAPACK_TRUE COIN_PKG_CONFIG_PATH COIN_HAS_PKGCONFIG_FALSE COIN_HAS_PKGCONFIG_TRUE ac_ct_PKG_CONFIG PKG_CONFIG IPOPTLIB_PCFILES IPOPTLIB_LFLAGS IPOPT_INT64_FALSE IPOPT_INT64_TRUE IPOPT_SINGLE_FALSE IPOPT_SINGLE_TRUE coin_doxy_tagfiles COIN_HAS_LATEX_FALSE COIN_HAS_LATEX_TRUE COIN_HAS_DOXYGEN_FALSE COIN_HAS_DOXYGEN_TRUE coin_doxy_logname coin_doxy_tagname coin_doxy_usedot coin_have_latex coin_have_doxygen CXXLIBS RPATH_FLAGS COIN_STATIC_BUILD_FALSE COIN_STATIC_BUILD_TRUE LT_LDFLAGS CXXCPP LT_SYS_LIBRARY_PATH OTOOL64 OTOOL LIPO NMEDIT DSYMUTIL MANIFEST_TOOL RANLIB FILECMD LN_S NM ac_ct_DUMPBIN DUMPBIN LD FGREP EGREP GREP SED LIBTOOL OBJDUMP DLLTOOL AS ac_ct_AR AR FLIBS ADD_FFLAGS COIN_HAS_F77_FALSE COIN_HAS_F77_TRUE ac_ct_F77 FFLAGS F77 ADD_CXXFLAGS am__fastdepCXX_FALSE am__fastdepCXX_TRUE CXXDEPMODE ac_ct_CXX CXXFLAGS CXX ADD_CFLAGS am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE am__nodep AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS COIN_RELOCATABLE_FALSE COIN_RELOCATABLE_TRUE am__xargs_n am__rm_f_notfound CSCOPE ETAGS CTAGS am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE AM_BACKSLASH AM_DEFAULT_VERBOSITY AM_DEFAULT_V AM_V host_os host_vendor host_cpu host CC build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL am__quote' ac_subst_files='' ac_user_opts=' enable_option_checking enable_msvc enable_debug enable_silent_rules enable_maintainer_mode enable_relocatable enable_dependency_tracking enable_f77 enable_static enable_pic with_pic enable_shared enable_fast_install enable_aix_soname with_aix_soname with_gnu_ld with_sysroot enable_libtool_lock with_dot with_ipopt_verbosity with_ipopt_checklevel with_precision with_intsize with_lapack with_lapack_lflags with_asl with_asl_lflags with_asl_cflags with_mumps with_mumps_lflags with_mumps_cflags enable_mpiinit with_hsl with_hsl_lflags with_hsl_cflags with_pardiso enable_pardisomkl with_spral with_spral_lflags with_spral_cflags with_wsmp enable_inexact_solver enable_java enable_linear_solver_loader enable_sipopt ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS ADD_CFLAGS CXX CXXFLAGS CCC ADD_CXXFLAGS F77 FFLAGS ADD_FFLAGS LT_SYS_LIBRARY_PATH CXXCPP LT_LDFLAGS CXXLIBS PKG_CONFIG' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: '$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: '$ac_option' Try '$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: '$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: '$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but 'cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF 'configure' configures Ipopt 3.14.17 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print 'checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for '--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or '..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, 'make install' will install all the files in '$ac_default_prefix/bin', '$ac_default_prefix/lib' etc. You can specify an installation prefix other than '$ac_default_prefix' using '--prefix', for instance '--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/ipopt] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of Ipopt 3.14.17:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-msvc look for and allow only Intel/Microsoft compilers on MinGW/MSys/Cygwin --enable-debug build debugging symbols and turn off compiler optimization --enable-silent-rules less verbose build output (undo: "make V=1") --disable-silent-rules verbose build output (undo: "make V=0") --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-relocatable whether prefix in installed .pc files should be setup relative to pcfiledir --enable-dependency-tracking do not reject slow dependency extractors --disable-dependency-tracking speeds up one-time build --disable-f77 disable checking for F77 compiler --enable-static[=PKGS] build static libraries [default=no] --enable-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] --enable-aix-soname=aix|svr4|both shared library versioning (aka "SONAME") variant to provide on AIX, [default=aix]. --disable-libtool-lock avoid locking (might break parallel builds) --disable-mpiinit disable that (un)loading the Ipopt library initalizes (finalizes) MPI if the MPI version of MUMPS is linked --disable-pardisomkl disable check for MKL version of Pardiso in Lapack --enable-inexact-solver enable inexact linear solver version EXPERIMENTAL! (default: no) --disable-java disable building of Java interface --disable-linear-solver-loader disable use of linear solver loader --disable-sipopt disable build of sIpopt Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). --with-dot use dot (from graphviz) when creating documentation with doxygen if available; --without-dot to disable --with-ipopt-verbosity specify the debug verbosity level --with-ipopt-checklevel specify the sanity check level --with-precision floating-point precision to use: single or double (default) --with-intsize integer type to use: specify 32 for int or 64 for int64_t --without-lapack Do not use lapack. If an argument is given to --with-lapack, then 'yes' is equivalent to --with-lapack, 'no' is equivalent to --without-lapack and any other argument is applied as for --with-lapack-lflags. --with-lapack-lflags Linker flags for lapack appropriate for your environment. (Most often, -l specs for libraries.) --without-asl Do not use ASL. If an argument is given to --with-asl, then 'yes' is equivalent to --with-asl, 'no' is equivalent to --without-asl and any other argument is applied as for --with-asl-lflags. --with-asl-lflags Linker flags for ASL appropriate for your environment. (Most often, -l specs for libraries.) --with-asl-cflags Compiler flags for ASL appropriate for your environment. (Most often, -I specs for header file directories.) --without-mumps Do not use Mumps. If an argument is given to --with-mumps, then 'yes' is equivalent to --with-mumps, 'no' is equivalent to --without-mumps and any other argument is applied as for --with-mumps-lflags. --with-mumps-lflags Linker flags for Mumps appropriate for your environment. (Most often, -l specs for libraries.) --with-mumps-cflags Compiler flags for Mumps appropriate for your environment. (Most often, -I specs for header file directories.) --without-hsl Do not use HSL. If an argument is given to --with-hsl, then 'yes' is equivalent to --with-hsl, 'no' is equivalent to --without-hsl and any other argument is applied as for --with-hsl-lflags. --with-hsl-lflags Linker flags for HSL appropriate for your environment. (Most often, -l specs for libraries.) --with-hsl-cflags Compiler flags for HSL appropriate for your environment. (Most often, -I specs for header file directories.) --with-pardiso specify Pardiso library (>= 4.0) from pardiso-project.org --without-spral Do not use Spral. If an argument is given to --with-spral, then 'yes' is equivalent to --with-spral, 'no' is equivalent to --without-spral and any other argument is applied as for --with-spral-lflags. --with-spral-lflags Linker flags for Spral appropriate for your environment. (Most often, -l specs for libraries.) --with-spral-cflags Compiler flags for Spral appropriate for your environment. (Most often, -I specs for header file directories.) --with-wsmp specify WSMP library Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory ADD_CFLAGS Additional C compiler options (if not overwriting CFLAGS) CXX C++ compiler command CXXFLAGS C++ compiler flags ADD_CXXFLAGS Additional C++ compiler options (if not overwriting CXXFLAGS) F77 Fortran 77 compiler command FFLAGS Fortran 77 compiler flags ADD_FFLAGS Additional Fortran 77 compiler options (if not overwriting FFLAGS) LT_SYS_LIBRARY_PATH User-defined run-time library search path. CXXCPP C++ preprocessor LT_LDFLAGS Flags passed to libtool when building libraries or executables that are installed CXXLIBS Libraries necessary for linking C++ code with non-C++ compiler PKG_CONFIG path to pkg-config utility Use these variables to override the choices made by 'configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . Ipopt home page: . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF Ipopt configure 3.14.17 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. Copyright 2004, 2011 International Business Machines and others. All Rights Reserved. This file is part of the open source package IPOPT which is distributed under the Eclipse Public License. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_f77_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (void); below. */ #include #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (void); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_cxx_try_cpp LINENO # ------------------------ # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || test ! -s conftest.err } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_cpp # ac_fn_cxx_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_link # ac_fn_f77_try_link LINENO # ------------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_f77_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest.beam conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_f77_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 ;; esac fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_f77_try_link # ac_fn_c_try_run LINENO # ---------------------- # Try to run conftest.$ac_ext, and return whether this succeeded. Assumes that # executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } then : ac_retval=0 else case e in #( e) printf "%s\n" "$as_me: program exited with status $ac_status" >&5 printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status ;; esac fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_compute_int LINENO EXPR VAR INCLUDES # -------------------------------------------- # Tries to find the compile-time value of EXPR in a program that includes # INCLUDES, setting VAR accordingly. Returns whether the value could be # computed ac_fn_c_compute_int () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if test "$cross_compiling" = yes; then # Depending upon the size, compute the lo and hi bounds. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { static int test_array [1 - 2 * !(($2) >= 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_lo=0 ac_mid=0 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid; break else case e in #( e) as_fn_arith $ac_mid + 1 && ac_lo=$as_val if test $ac_lo -le $ac_mid; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { static int test_array [1 - 2 * !(($2) < 0)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=-1 ac_mid=-1 while :; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { static int test_array [1 - 2 * !(($2) >= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_lo=$ac_mid; break else case e in #( e) as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val if test $ac_mid -le $ac_hi; then ac_lo= ac_hi= break fi as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done else case e in #( e) ac_lo= ac_hi= ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext # Binary search between lo and hi bounds. while test "x$ac_lo" != "x$ac_hi"; do as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { static int test_array [1 - 2 * !(($2) <= $ac_mid)]; test_array [0] = 0; return test_array [0]; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_hi=$ac_mid else case e in #( e) as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done case $ac_lo in #(( ?*) eval "$3=\$ac_lo"; ac_retval=0 ;; '') ac_retval=1 ;; esac else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 static long int longval (void) { return $2; } static unsigned long int ulongval (void) { return $2; } #include #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { FILE *f = fopen ("conftest.val", "w"); if (! f) return 1; if (($2) < 0) { long int i = longval (); if (i != ($2)) return 1; fprintf (f, "%ld", i); } else { unsigned long int i = ulongval (); if (i != ($2)) return 1; fprintf (f, "%lu", i); } /* Do not output a trailing newline, as this causes \r\n confusion on some platforms. */ return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO" then : echo >>conftest.val; read $3 &5 printf %s "checking for $2... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_cxx_check_header_compile # ac_fn_check_decl LINENO SYMBOL VAR INCLUDES EXTRA-OPTIONS FLAG-VAR # ------------------------------------------------------------------ # Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR # accordingly. Pass EXTRA-OPTIONS to the compiler, using FLAG-VAR. ac_fn_check_decl () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack as_decl_name=`echo $2|sed 's/ *(.*//'` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5 printf %s "checking whether $as_decl_name is declared... " >&6; } if eval test \${$3+y} then : printf %s "(cached) " >&6 else case e in #( e) as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'` eval ac_save_FLAGS=\$$6 as_fn_append $6 " $5" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { #ifndef $as_decl_name #ifdef __cplusplus (void) $as_decl_use; #else (void) $as_decl_name; #endif #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : eval "$3=yes" else case e in #( e) eval "$3=no" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext eval $6=\$ac_save_FLAGS ;; esac fi eval ac_res=\$$3 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 printf "%s\n" "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_check_decl ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by Ipopt $as_me 3.14.17, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See 'config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Test code for whether the C compiler supports C89 (global declarations) ac_c_conftest_c89_globals=' /* Does the compiler advertise C89 conformance? Do not test the value of __STDC__, because some compilers set it to 0 while being otherwise adequately conformant. */ #if !defined __STDC__ # error "Compiler does not advertise C89 conformance" #endif #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7 src/conf.sh. */ struct buf { int x; }; struct buf * (*rcsopen) (struct buf *, struct stat *, int); static char *e (char **p, int i) { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* C89 style stringification. */ #define noexpand_stringify(a) #a const char *stringified = noexpand_stringify(arbitrary+token=sequence); /* C89 style token pasting. Exercises some of the corner cases that e.g. old MSVC gets wrong, but not very hard. */ #define noexpand_concat(a,b) a##b #define expand_concat(a,b) noexpand_concat(a,b) extern int vA; extern int vbee; #define aye A #define bee B int *pvA = &expand_concat(v,aye); int *pvbee = &noexpand_concat(v,bee); /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not \xHH hex character constants. These do not provoke an error unfortunately, instead are silently treated as an "x". The following induces an error, until -std is added to get proper ANSI mode. Curiously \x00 != x always comes out true, for an array size at least. It is necessary to write \x00 == 0 to get something that is true only with -std. */ int osf4_cc_array ['\''\x00'\'' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) '\''x'\'' int xlc6_cc_array[FOO(a) == '\''x'\'' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, int *(*)(struct buf *, struct stat *, int), int, int);' # Test code for whether the C compiler supports C89 (body of main). ac_c_conftest_c89_main=' ok |= (argc == 0 || f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]); ' # Test code for whether the C compiler supports C99 (global declarations) ac_c_conftest_c99_globals=' /* Does the compiler advertise C99 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 199901L # error "Compiler does not advertise C99 conformance" #endif // See if C++-style comments work. #include extern int puts (const char *); extern int printf (const char *, ...); extern int dprintf (int, const char *, ...); extern void *malloc (size_t); extern void free (void *); // Check varargs macros. These examples are taken from C99 6.10.3.5. // dprintf is used instead of fprintf to avoid needing to declare // FILE and stderr. #define debug(...) dprintf (2, __VA_ARGS__) #define showlist(...) puts (#__VA_ARGS__) #define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) static void test_varargs_macros (void) { int x = 1234; int y = 5678; debug ("Flag"); debug ("X = %d\n", x); showlist (The first, second, and third items.); report (x>y, "x is %d but y is %d", x, y); } // Check long long types. #define BIG64 18446744073709551615ull #define BIG32 4294967295ul #define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) #if !BIG_OK #error "your preprocessor is broken" #endif #if BIG_OK #else #error "your preprocessor is broken" #endif static long long int bignum = -9223372036854775807LL; static unsigned long long int ubignum = BIG64; struct incomplete_array { int datasize; double data[]; }; struct named_init { int number; const wchar_t *name; double average; }; typedef const char *ccp; static inline int test_restrict (ccp restrict text) { // Iterate through items via the restricted pointer. // Also check for declarations in for loops. for (unsigned int i = 0; *(text+i) != '\''\0'\''; ++i) continue; return 0; } // Check varargs and va_copy. static bool test_varargs (const char *format, ...) { va_list args; va_start (args, format); va_list args_copy; va_copy (args_copy, args); const char *str = ""; int number = 0; float fnumber = 0; while (*format) { switch (*format++) { case '\''s'\'': // string str = va_arg (args_copy, const char *); break; case '\''d'\'': // int number = va_arg (args_copy, int); break; case '\''f'\'': // float fnumber = va_arg (args_copy, double); break; default: break; } } va_end (args_copy); va_end (args); return *str && number && fnumber; } ' # Test code for whether the C compiler supports C99 (body of main). ac_c_conftest_c99_main=' // Check bool. _Bool success = false; success |= (argc != 0); // Check restrict. if (test_restrict ("String literal") == 0) success = true; char *restrict newvar = "Another string"; // Check varargs. success &= test_varargs ("s, d'\'' f .", "string", 65, 34.234); test_varargs_macros (); // Check flexible array members. struct incomplete_array *ia = malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); ia->datasize = 10; for (int i = 0; i < ia->datasize; ++i) ia->data[i] = i * 1.234; // Work around memory leak warnings. free (ia); // Check named initializers. struct named_init ni = { .number = 34, .name = L"Test wide string", .average = 543.34343, }; ni.number = 58; int dynamic_array[ni.number]; dynamic_array[0] = argv[0][0]; dynamic_array[ni.number - 1] = 543; // work around unused variable warnings ok |= (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == '\''x'\'' || dynamic_array[ni.number - 1] != 543); ' # Test code for whether the C compiler supports C11 (global declarations) ac_c_conftest_c11_globals=' /* Does the compiler advertise C11 conformance? */ #if !defined __STDC_VERSION__ || __STDC_VERSION__ < 201112L # error "Compiler does not advertise C11 conformance" #endif // Check _Alignas. char _Alignas (double) aligned_as_double; char _Alignas (0) no_special_alignment; extern char aligned_as_int; char _Alignas (0) _Alignas (int) aligned_as_int; // Check _Alignof. enum { int_alignment = _Alignof (int), int_array_alignment = _Alignof (int[100]), char_alignment = _Alignof (char) }; _Static_assert (0 < -_Alignof (int), "_Alignof is signed"); // Check _Noreturn. int _Noreturn does_not_return (void) { for (;;) continue; } // Check _Static_assert. struct test_static_assert { int x; _Static_assert (sizeof (int) <= sizeof (long int), "_Static_assert does not work in struct"); long int y; }; // Check UTF-8 literals. #define u8 syntax error! char const utf8_literal[] = u8"happens to be ASCII" "another string"; // Check duplicate typedefs. typedef long *long_ptr; typedef long int *long_ptr; typedef long_ptr long_ptr; // Anonymous structures and unions -- taken from C11 6.7.2.1 Example 1. struct anonymous { union { struct { int i; int j; }; struct { int k; long int l; } w; }; int m; } v1; ' # Test code for whether the C compiler supports C11 (body of main). ac_c_conftest_c11_main=' _Static_assert ((offsetof (struct anonymous, i) == offsetof (struct anonymous, w.k)), "Anonymous union alignment botch"); v1.i = 2; v1.w.k = 5; ok |= v1.i != 5; ' # Test code for whether the C compiler supports C11 (complete). ac_c_conftest_c11_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} ${ac_c_conftest_c11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} ${ac_c_conftest_c11_main} return ok; } " # Test code for whether the C compiler supports C99 (complete). ac_c_conftest_c99_program="${ac_c_conftest_c89_globals} ${ac_c_conftest_c99_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} ${ac_c_conftest_c99_main} return ok; } " # Test code for whether the C compiler supports C89 (complete). ac_c_conftest_c89_program="${ac_c_conftest_c89_globals} int main (int argc, char **argv) { int ok = 0; ${ac_c_conftest_c89_main} return ok; } " # Test code for whether the C++ compiler supports C++98 (global declarations) ac_cxx_conftest_cxx98_globals=' // Does the compiler advertise C++98 conformance? #if !defined __cplusplus || __cplusplus < 199711L # error "Compiler does not advertise C++98 conformance" #endif // These inclusions are to reject old compilers that // lack the unsuffixed header files. #include #include // and are *not* freestanding headers in C++98. extern void assert (int); namespace std { extern int strcmp (const char *, const char *); } // Namespaces, exceptions, and templates were all added after "C++ 2.0". using std::exception; using std::strcmp; namespace { void test_exception_syntax() { try { throw "test"; } catch (const char *s) { // Extra parentheses suppress a warning when building autoconf itself, // due to lint rules shared with more typical C programs. assert (!(strcmp) (s, "test")); } } template struct test_template { T const val; explicit test_template(T t) : val(t) {} template T add(U u) { return static_cast(u) + val; } }; } // anonymous namespace ' # Test code for whether the C++ compiler supports C++98 (body of main) ac_cxx_conftest_cxx98_main=' assert (argc); assert (! argv[0]); { test_exception_syntax (); test_template tt (2.0); assert (tt.add (4) == 6.0); assert (true && !false); } ' # Test code for whether the C++ compiler supports C++11 (global declarations) ac_cxx_conftest_cxx11_globals=' // Does the compiler advertise C++ 2011 conformance? #if !defined __cplusplus || __cplusplus < 201103L # error "Compiler does not advertise C++11 conformance" #endif namespace cxx11test { constexpr int get_val() { return 20; } struct testinit { int i; double d; }; class delegate { public: delegate(int n) : n(n) {} delegate(): delegate(2354) {} virtual int getval() { return this->n; }; protected: int n; }; class overridden : public delegate { public: overridden(int n): delegate(n) {} virtual int getval() override final { return this->n * 2; } }; class nocopy { public: nocopy(int i): i(i) {} nocopy() = default; nocopy(const nocopy&) = delete; nocopy & operator=(const nocopy&) = delete; private: int i; }; // for testing lambda expressions template Ret eval(Fn f, Ret v) { return f(v); } // for testing variadic templates and trailing return types template auto sum(V first) -> V { return first; } template auto sum(V first, Args... rest) -> V { return first + sum(rest...); } } ' # Test code for whether the C++ compiler supports C++11 (body of main) ac_cxx_conftest_cxx11_main=' { // Test auto and decltype auto a1 = 6538; auto a2 = 48573953.4; auto a3 = "String literal"; int total = 0; for (auto i = a3; *i; ++i) { total += *i; } decltype(a2) a4 = 34895.034; } { // Test constexpr short sa[cxx11test::get_val()] = { 0 }; } { // Test initializer lists cxx11test::testinit il = { 4323, 435234.23544 }; } { // Test range-based for int array[] = {9, 7, 13, 15, 4, 18, 12, 10, 5, 3, 14, 19, 17, 8, 6, 20, 16, 2, 11, 1}; for (auto &x : array) { x += 23; } } { // Test lambda expressions using cxx11test::eval; assert (eval ([](int x) { return x*2; }, 21) == 42); double d = 2.0; assert (eval ([&](double x) { return d += x; }, 3.0) == 5.0); assert (d == 5.0); assert (eval ([=](double x) mutable { return d += x; }, 4.0) == 9.0); assert (d == 5.0); } { // Test use of variadic templates using cxx11test::sum; auto a = sum(1); auto b = sum(1, 2); auto c = sum(1.0, 2.0, 3.0); } { // Test constructor delegation cxx11test::delegate d1; cxx11test::delegate d2(); cxx11test::delegate d3(45); } { // Test override and final cxx11test::overridden o1(55464); } { // Test nullptr char *c = nullptr; } { // Test template brackets test_template<::test_template> v(test_template(12)); } { // Unicode literals char const *utf8 = u8"UTF-8 string \u2500"; char16_t const *utf16 = u"UTF-8 string \u2500"; char32_t const *utf32 = U"UTF-32 string \u2500"; } ' # Test code for whether the C compiler supports C++11 (complete). ac_cxx_conftest_cxx11_program="${ac_cxx_conftest_cxx98_globals} ${ac_cxx_conftest_cxx11_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} ${ac_cxx_conftest_cxx11_main} return ok; } " # Test code for whether the C compiler supports C++98 (complete). ac_cxx_conftest_cxx98_program="${ac_cxx_conftest_cxx98_globals} int main (int argc, char **argv) { int ok = 0; ${ac_cxx_conftest_cxx98_main} return ok; } " as_fn_append ac_header_c_list " stdio.h stdio_h HAVE_STDIO_H" as_fn_append ac_header_c_list " stdlib.h stdlib_h HAVE_STDLIB_H" as_fn_append ac_header_c_list " string.h string_h HAVE_STRING_H" as_fn_append ac_header_c_list " inttypes.h inttypes_h HAVE_INTTYPES_H" as_fn_append ac_header_c_list " stdint.h stdint_h HAVE_STDINT_H" as_fn_append ac_header_c_list " strings.h strings_h HAVE_STRINGS_H" as_fn_append ac_header_c_list " sys/stat.h sys_stat_h HAVE_SYS_STAT_H" as_fn_append ac_header_c_list " sys/types.h sys_types_h HAVE_SYS_TYPES_H" as_fn_append ac_header_c_list " unistd.h unistd_h HAVE_UNISTD_H" # Auxiliary files required by this configure script. ac_aux_files="ltmain.sh ar-lib compile missing install-sh config.guess config.sub" # Locations in which to look for auxiliary files. ac_aux_dir_candidates="${srcdir}${PATH_SEPARATOR}${srcdir}/..${PATH_SEPARATOR}${srcdir}/../.." # Search for a directory containing all of the required auxiliary files, # $ac_aux_files, from the $PATH-style list $ac_aux_dir_candidates. # If we don't find one directory that contains all the files we need, # we report the set of missing files from the *first* directory in # $ac_aux_dir_candidates and give up. ac_missing_aux_files="" ac_first_candidate=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: looking for aux files: $ac_aux_files" >&5 as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in $ac_aux_dir_candidates do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: printf "%s\n" "$as_me:${as_lineno-$LINENO}: trying $as_dir" >&5 ac_aux_dir_found=yes ac_install_sh= for ac_aux in $ac_aux_files do # As a special case, if "install-sh" is required, that requirement # can be satisfied by any of "install-sh", "install.sh", or "shtool", # and $ac_install_sh is set appropriately for whichever one is found. if test x"$ac_aux" = x"install-sh" then if test -f "${as_dir}install-sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install-sh found" >&5 ac_install_sh="${as_dir}install-sh -c" elif test -f "${as_dir}install.sh"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}install.sh found" >&5 ac_install_sh="${as_dir}install.sh -c" elif test -f "${as_dir}shtool"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}shtool found" >&5 ac_install_sh="${as_dir}shtool install -c" else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} install-sh" else break fi fi else if test -f "${as_dir}${ac_aux}"; then printf "%s\n" "$as_me:${as_lineno-$LINENO}: ${as_dir}${ac_aux} found" >&5 else ac_aux_dir_found=no if $ac_first_candidate; then ac_missing_aux_files="${ac_missing_aux_files} ${ac_aux}" else break fi fi fi done if test "$ac_aux_dir_found" = yes; then ac_aux_dir="$as_dir" break fi ac_first_candidate=false as_found=false done IFS=$as_save_IFS if $as_found then : else case e in #( e) as_fn_error $? "cannot find required auxiliary files:$ac_missing_aux_files" "$LINENO" 5 ;; esac fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. if test -f "${ac_aux_dir}config.guess"; then ac_config_guess="$SHELL ${ac_aux_dir}config.guess" fi if test -f "${ac_aux_dir}config.sub"; then ac_config_sub="$SHELL ${ac_aux_dir}config.sub" fi if test -f "$ac_aux_dir/configure"; then ac_configure="$SHELL ${ac_aux_dir}configure" fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was set to '$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: '$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: '$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: '$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in '$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: '$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: '$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: '$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: '$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run '${MAKE-make} distclean' and/or 'rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # List one file in the package so that the configure script can test # whether the package is actually there # Do some project-level initialization work (version numbers, ...) # Make sure we can run config.sub. $SHELL "${ac_aux_dir}config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL ${ac_aux_dir}config.sub" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 printf %s "checking build system type... " >&6; } if test ${ac_cv_build+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "${ac_aux_dir}config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "${ac_aux_dir}config.sub" $ac_build_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $ac_build_alias failed" "$LINENO" 5 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 printf "%s\n" "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac # Check whether --enable-msvc was given. if test ${enable_msvc+y} then : enableval=$enable_msvc; enable_msvc=$enableval else case e in #( e) enable_msvc=no case $build in *-mingw* | *-cygwin* | *-msys* ) for ac_prog in gcc clang icx icl cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done case "$CC" in *cl | *icx ) enable_msvc=yes ;; esac ;; esac ;; esac fi # Check whether --enable-debug was given. if test ${enable_debug+y} then : enableval=$enable_debug; enable_debug=$enableval else case e in #( e) enable_debug=no ;; esac fi if test "$enable_debug" = yes ; then if test "$enable_msvc" = yes ; then : ${FFLAGS:="-nologo -fpp -Z7 -MDd $ADD_FFLAGS"} : ${FCFLAGS:="-nologo -fpp -Z7 -MDd $ADD_FCFLAGS"} : ${CFLAGS:="-nologo -Z7 -MDd $ADD_CFLAGS"} : ${CXXFLAGS:="-nologo -EHs -Z7 -MDd -Zc:__cplusplus $ADD_CXXFLAGS"} else : ${FFLAGS:="-g $ADD_FFLAGS"} : ${FCFLAGS:="-g $ADD_FCFLAGS"} : ${CFLAGS:="-g $ADD_CFLAGS"} : ${CXXFLAGS:="-g $ADD_CXXFLAGS"} fi else if test "$enable_msvc" = yes ; then : ${FFLAGS:="-nologo -fpp -O2 -MD $ADD_FFLAGS"} : ${FCFLAGS:="-nologo -fpp -O2 -MD $ADD_FCFLAGS"} : ${CFLAGS:="-nologo -DNDEBUG -O2 -MD $ADD_CFLAGS"} : ${CXXFLAGS:="-nologo -EHs -DNDEBUG -O2 -MD -Zc:__cplusplus $ADD_CXXFLAGS"} else : ${FFLAGS:="-O2 $ADD_FFLAGS"} : ${FCFLAGS:="-O2 $ADD_FCFLAGS"} : ${CFLAGS:="-O2 -DNDEBUG $ADD_CFLAGS"} : ${CXXFLAGS:="-O2 -DNDEBUG $ADD_CXXFLAGS"} fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 printf %s "checking host system type... " >&6; } if test ${ac_cv_host+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "${ac_aux_dir}config.sub" $host_alias` || as_fn_error $? "$SHELL ${ac_aux_dir}config.sub $host_alias failed" "$LINENO" 5 fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 printf "%s\n" "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac AM_DEFAULT_VERBOSITY=1 # Check whether --enable-silent-rules was given. if test ${enable_silent_rules+y} then : enableval=$enable_silent_rules; fi am_make=${MAKE-make} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 printf %s "checking whether $am_make supports nested variables... " >&6; } if test ${am_cv_make_support_nested_variables+y} then : printf %s "(cached) " >&6 else case e in #( e) if printf "%s\n" 'TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 printf "%s\n" "$am_cv_make_support_nested_variables" >&6; } AM_BACKSLASH='\' am__api_version='1.17' # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 printf %s "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test ${ac_cv_path_install+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac # Account for fact that we put trailing slashes in our PATH walk. case $as_dir in #(( ./ | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir/" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir ;; esac fi if test ${ac_cv_path_install+y}; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 printf "%s\n" "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sleep supports fractional seconds" >&5 printf %s "checking whether sleep supports fractional seconds... " >&6; } if test ${am_cv_sleep_fractional_seconds+y} then : printf %s "(cached) " >&6 else case e in #( e) if sleep 0.001 2>/dev/null then : am_cv_sleep_fractional_seconds=yes else case e in #( e) am_cv_sleep_fractional_seconds=no ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_sleep_fractional_seconds" >&5 printf "%s\n" "$am_cv_sleep_fractional_seconds" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking filesystem timestamp resolution" >&5 printf %s "checking filesystem timestamp resolution... " >&6; } if test ${am_cv_filesystem_timestamp_resolution+y} then : printf %s "(cached) " >&6 else case e in #( e) # Default to the worst case. am_cv_filesystem_timestamp_resolution=2 # Only try to go finer than 1 sec if sleep can do it. # Don't try 1 sec, because if 0.01 sec and 0.1 sec don't work, # - 1 sec is not much of a win compared to 2 sec, and # - it takes 2 seconds to perform the test whether 1 sec works. # # Instead, just use the default 2s on platforms that have 1s resolution, # accept the extra 1s delay when using $sleep in the Automake tests, in # exchange for not incurring the 2s delay for running the test for all # packages. # am_try_resolutions= if test "$am_cv_sleep_fractional_seconds" = yes; then # Even a millisecond often causes a bunch of false positives, # so just try a hundredth of a second. The time saved between .001 and # .01 is not terribly consequential. am_try_resolutions="0.01 0.1 $am_try_resolutions" fi # In order to catch current-generation FAT out, we must *modify* files # that already exist; the *creation* timestamp is finer. Use names # that make ls -t sort them differently when they have equal # timestamps than when they have distinct timestamps, keeping # in mind that ls -t prints the *newest* file first. rm -f conftest.ts? : > conftest.ts1 : > conftest.ts2 : > conftest.ts3 # Make sure ls -t actually works. Do 'set' in a subshell so we don't # clobber the current shell's arguments. (Outer-level square brackets # are removed by m4; they're present so that m4 does not expand # ; be careful, easy to get confused.) if ( set X `ls -t conftest.ts[12]` && { test "$*" != "X conftest.ts1 conftest.ts2" || test "$*" != "X conftest.ts2 conftest.ts1"; } ); then :; else # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". printf "%s\n" ""Bad output from ls -t: \"`ls -t conftest.ts[12]`\""" >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "ls -t produces unexpected output. Make sure there is not a broken ls alias in your environment. See 'config.log' for more details" "$LINENO" 5; } fi for am_try_res in $am_try_resolutions; do # Any one fine-grained sleep might happen to cross the boundary # between two values of a coarser actual resolution, but if we do # two fine-grained sleeps in a row, at least one of them will fall # entirely within a coarse interval. echo alpha > conftest.ts1 sleep $am_try_res echo beta > conftest.ts2 sleep $am_try_res echo gamma > conftest.ts3 # We assume that 'ls -t' will make use of high-resolution # timestamps if the operating system supports them at all. if (set X `ls -t conftest.ts?` && test "$2" = conftest.ts3 && test "$3" = conftest.ts2 && test "$4" = conftest.ts1); then # # Ok, ls -t worked. If we're at a resolution of 1 second, we're done, # because we don't need to test make. make_ok=true if test $am_try_res != 1; then # But if we've succeeded so far with a subsecond resolution, we # have one more thing to check: make. It can happen that # everything else supports the subsecond mtimes, but make doesn't; # notably on macOS, which ships make 3.81 from 2006 (the last one # released under GPLv2). https://bugs.gnu.org/68808 # # We test $MAKE if it is defined in the environment, else "make". # It might get overridden later, but our hope is that in practice # it does not matter: it is the system "make" which is (by far) # the most likely to be broken, whereas if the user overrides it, # probably they did so with a better, or at least not worse, make. # https://lists.gnu.org/archive/html/automake/2024-06/msg00051.html # # Create a Makefile (real tab character here): rm -f conftest.mk echo 'conftest.ts1: conftest.ts2' >conftest.mk echo ' touch conftest.ts2' >>conftest.mk # # Now, running # touch conftest.ts1; touch conftest.ts2; make # should touch ts1 because ts2 is newer. This could happen by luck, # but most often, it will fail if make's support is insufficient. So # test for several consecutive successes. # # (We reuse conftest.ts[12] because we still want to modify existing # files, not create new ones, per above.) n=0 make=${MAKE-make} until test $n -eq 3; do echo one > conftest.ts1 sleep $am_try_res echo two > conftest.ts2 # ts2 should now be newer than ts1 if $make -f conftest.mk | grep 'up to date' >/dev/null; then make_ok=false break # out of $n loop fi n=`expr $n + 1` done fi # if $make_ok; then # Everything we know to check worked out, so call this resolution good. am_cv_filesystem_timestamp_resolution=$am_try_res break # out of $am_try_res loop fi # Otherwise, we'll go on to check the next resolution. fi done rm -f conftest.ts? # (end _am_filesystem_timestamp_resolution) ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_filesystem_timestamp_resolution" >&5 printf "%s\n" "$am_cv_filesystem_timestamp_resolution" >&6; } # This check should not be cached, as it may vary across builds of # different projects. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 printf %s "checking whether build environment is sane... " >&6; } # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). am_build_env_is_sane=no am_has_slept=no rm -f conftest.file for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file if ( set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi test "$2" = conftest.file ); then am_build_env_is_sane=yes break fi # Just in case. sleep "$am_cv_filesystem_timestamp_resolution" am_has_slept=yes done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_build_env_is_sane" >&5 printf "%s\n" "$am_build_env_is_sane" >&6; } if test "$am_build_env_is_sane" = no; then as_fn_error $? "newly created file is older than distributed files! Check your system clock" "$LINENO" 5 fi # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if test -e conftest.file || grep 'slept: no' conftest.file >/dev/null 2>&1 then : else case e in #( e) ( sleep "$am_cv_filesystem_timestamp_resolution" ) & am_sleep_pid=$! ;; esac fi rm -f conftest.file test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was 's,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`printf "%s\n" "$program_transform_name" | sed "$ac_script"` # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` if test x"${MISSING+set}" != xset; then MISSING="\${SHELL} '$am_aux_dir/missing'" fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 printf "%s\n" "$as_me: WARNING: 'missing' script is too old or missing" >&2;} fi if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a race-free mkdir -p" >&5 printf %s "checking for a race-free mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test ${ac_cv_path_mkdir+y} then : printf %s "(cached) " >&6 else case e in #( e) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do as_fn_executable_p "$as_dir$ac_prog$ac_exec_ext" || continue case `"$as_dir$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir ('*'coreutils) '* | \ *'BusyBox '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS ;; esac fi test -d ./--version && rmdir ./--version if test ${ac_cv_path_mkdir+y}; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use plain mkdir -p, # in the hope it doesn't have the bugs of ancient mkdir. MKDIR_P='mkdir -p' fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 printf "%s\n" "$MKDIR_P" >&6; } for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AWK+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AWK="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 printf "%s\n" "$AWK" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AWK" && break done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 printf %s "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`printf "%s\n" "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval test \${ac_cv_prog_make_${ac_make}_set+y} then : printf %s "(cached) " >&6 else case e in #( e) cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make ;; esac fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } SET_MAKE= else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null am__rm_f_notfound= if (rm -f && rm -fr && rm -rf) 2>/dev/null then : else case e in #( e) am__rm_f_notfound='""' ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking xargs -n works" >&5 printf %s "checking xargs -n works... " >&6; } if test ${am_cv_xargs_n_works+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "`echo 1 2 3 | xargs -n2 echo`" = "1 2 3" then : am_cv_xargs_n_works=yes else case e in #( e) am_cv_xargs_n_works=no ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_xargs_n_works" >&5 printf "%s\n" "$am_cv_xargs_n_works" >&6; } if test "$am_cv_xargs_n_works" = yes then : am__xargs_n='xargs -n' else case e in #( e) am__xargs_n='am__xargs_n () { shift; sed "s/ /\\n/g" | while read am__xargs_n_arg; do "" "$am__xargs_n_arg"; done; }' ;; esac fi printf "%s\n" "#define IPOPT_VERSION \"3.14.17\"" >>confdefs.h printf "%s\n" "#define IPOPT_VERSION_MAJOR 3" >>confdefs.h printf "%s\n" "#define IPOPT_VERSION_MINOR 14" >>confdefs.h printf "%s\n" "#define IPOPT_VERSION_RELEASE 17" >>confdefs.h # libtool has some magic for host_os and build_os being mingw, but doesn't know about msys if test $host_os = msys ; then host_os=mingw host=`echo $host | sed -e 's/msys/mingw/'` fi if test $build_os = msys ; then build_os=mingw build=`echo $build | sed -e 's/msys/mingw/'` fi AM_DEFAULT_VERBOSITY=0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5 printf %s "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test ${enable_maintainer_mode+y} then : enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else case e in #( e) USE_MAINTAINER_MODE=no ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5 printf "%s\n" "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE='ipopt' VERSION='3.14.17' # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # mkdir_p='$(MKDIR_P)' # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. # Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar pax cpio none' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' # Variables for tags utilities; see am/tags.am if test -z "$CTAGS"; then CTAGS=ctags fi if test -z "$ETAGS"; then ETAGS=etags fi if test -z "$CSCOPE"; then CSCOPE=cscope fi # Figure out the path where libraries are installed. # Unless the user specifies --prefix, prefix is set to NONE until the # end of configuration, at which point it will be set to $ac_default_prefix. # Unless the user specifies --exec-prefix, exec-prefix is set to NONE until # the end of configuration, at which point it's set to '${prefix}'. # Sheesh. So do the expansion, then back it out. save_prefix=$prefix save_exec_prefix=$exec_prefix if test "x$prefix" = xNONE ; then prefix=$ac_default_prefix fi if test "x$exec_prefix" = xNONE ; then exec_prefix=$prefix fi expanded_libdir=$libdir while expr "$expanded_libdir" : '.*$.*' >/dev/null 2>&1 ; do eval expanded_libdir=$expanded_libdir done prefix=$save_prefix exec_prefix=$save_exec_prefix # Check whether --enable-relocatable was given. if test ${enable_relocatable+y} then : enableval=$enable_relocatable; coin_enable_relocatable=$enableval else case e in #( e) coin_enable_relocatable=no ;; esac fi if test $coin_enable_relocatable = yes; then COIN_RELOCATABLE_TRUE= COIN_RELOCATABLE_FALSE='#' else COIN_RELOCATABLE_TRUE='#' COIN_RELOCATABLE_FALSE= fi ############################################################################# # Standard build tool stuff # ############################################################################# # Get the name of the C, C++, and Fortran compilers and appropriate compiler options. DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} supports the include directive" >&5 printf %s "checking whether ${MAKE-make} supports the include directive... " >&6; } cat > confinc.mk << 'END' am__doit: @echo this is the am__doit target >confinc.out .PHONY: am__doit END am__include="#" am__quote= # BSD make does it like this. echo '.include "confinc.mk" # ignored' > confmf.BSD # Other make implementations (GNU, Solaris 10, AIX) do it like this. echo 'include confinc.mk # ignored' > confmf.GNU _am_result=no for s in GNU BSD; do { echo "$as_me:$LINENO: ${MAKE-make} -f confmf.$s && cat confinc.out" >&5 (${MAKE-make} -f confmf.$s && cat confinc.out) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } case $?:`cat confinc.out 2>/dev/null` in #( '0:this is the am__doit target') : case $s in #( BSD) : am__include='.include' am__quote='"' ;; #( *) : am__include='include' am__quote='' ;; esac ;; #( *) : ;; esac if test "$am__include" != "#"; then _am_result="yes ($s style)" break fi done rm -f confinc.* confmf.* { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${_am_result}" >&5 printf "%s\n" "${_am_result}" >&6; } # Check whether --enable-dependency-tracking was given. if test ${enable_dependency_tracking+y} then : enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi if test $enable_msvc = yes ; then for ac_prog in icx icl cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done if test -n "$CC" ; then CC="$am_aux_dir/compile $CC" ac_cv_prog_CC="$CC" LD="$CC" : ${AR:=lib} else as_fn_error $? "Neither MS nor Intel C compiler found in PATH and CC is unset." "$LINENO" 5 fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gcc clang cc icx icc icl cl cc xlc xlc_r pgcc do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CC=$ac_cv_prog_CC if test -n "$CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 printf "%s\n" "$CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in gcc clang cc icx icc icl cl cc xlc xlc_r pgcc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 printf "%s\n" "$ac_ct_CC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi test -z "$CC" && { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See 'config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion -version; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 printf %s "checking whether the C compiler works... " >&6; } ac_link_default=`printf "%s\n" "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # Autoconf-2.13 could set the ac_cv_exeext variable to 'no'. # So ignore a value of 'no', otherwise this would lead to 'EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test ${ac_cv_exeext+y} && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an '-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else case e in #( e) ac_file='' ;; esac fi if test -z "$ac_file" then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See 'config.log' for more details" "$LINENO" 5; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 printf %s "checking for C compiler default output file name... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 printf "%s\n" "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 printf %s "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : # If both 'conftest.exe' and 'conftest' are 'present' (well, observable) # catch 'conftest.exe'. For instance with Cygwin, 'ls conftest' will # work properly (i.e., refer to 'conftest.exe'), while it won't with # 'rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest conftest$ac_cv_exeext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 printf "%s\n" "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main (void) { FILE *f = fopen ("conftest.out", "w"); if (!f) return 1; return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 printf %s "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot run C compiled programs. If you meant to cross compile, use '--host'. See 'config.log' for more details" "$LINENO" 5; } fi fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 printf "%s\n" "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext \ conftest.o conftest.obj conftest.out ac_clean_files=$ac_clean_files_save { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 printf %s "checking for suffix of object files... " >&6; } if test ${ac_cv_objext+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else case e in #( e) printf "%s\n" "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f conftest.$ac_cv_objext conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 printf "%s\n" "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C" >&5 printf %s "checking whether the compiler supports GNU C... " >&6; } if test ${ac_cv_c_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 printf "%s\n" "$ac_cv_c_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+y} ac_save_CFLAGS=$CFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 printf %s "checking whether $CC accepts -g... " >&6; } if test ${ac_cv_prog_cc_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes else case e in #( e) CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : else case e in #( e) ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 printf "%s\n" "$ac_cv_prog_cc_g" >&6; } if test $ac_test_CFLAGS; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi ac_prog_cc_stdc=no if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C11 features" >&5 printf %s "checking for $CC option to enable C11 features... " >&6; } if test ${ac_cv_prog_cc_c11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c11=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c11_program _ACEOF for ac_arg in '' -std=gnu11 do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c11" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c11" >&5 printf "%s\n" "$ac_cv_prog_cc_c11" >&6; } CC="$CC $ac_cv_prog_cc_c11" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c11 ac_prog_cc_stdc=c11 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C99 features" >&5 printf %s "checking for $CC option to enable C99 features... " >&6; } if test ${ac_cv_prog_cc_c99+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c99=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c99_program _ACEOF for ac_arg in '' -std=gnu99 -std=c99 -c99 -qlanglvl=extc1x -qlanglvl=extc99 -AC99 -D_STDC_C99= do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c99=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c99" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c99" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c99" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5 printf "%s\n" "$ac_cv_prog_cc_c99" >&6; } CC="$CC $ac_cv_prog_cc_c99" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99 ac_prog_cc_stdc=c99 ;; esac fi fi if test x$ac_prog_cc_stdc = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CC option to enable C89 features" >&5 printf %s "checking for $CC option to enable C89 features... " >&6; } if test ${ac_cv_prog_cc_c89+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_c_conftest_c89_program _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO" then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC ;; esac fi if test "x$ac_cv_prog_cc_c89" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cc_c89" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 printf "%s\n" "$ac_cv_prog_cc_c89" >&6; } CC="$CC $ac_cv_prog_cc_c89" ;; esac fi ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89 ac_prog_cc_stdc=c89 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 printf %s "checking whether $CC understands -c and -o together... " >&6; } if test ${am_cv_prog_cc_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 printf "%s\n" "$am_cv_prog_cc_c_o" >&6; } if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CC_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thus: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi if test $enable_msvc = yes ; then for ac_prog in icx icl cl do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done if test -n "$CXX" ; then CXX="$am_aux_dir/compile $CXX" ac_cv_prog_CXX="$CXX" LD="$CXX" : ${AR:=lib} else as_fn_error $? "Neither MS nor Intel C++ compiler found in PATH and CXX is unset." "$LINENO" 5 fi fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ clang++ c++ pgCC icx icpc gpp cxx cc++ icl cl FCC KCC RCC xlC_r aCC CC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 printf "%s\n" "$CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ clang++ c++ pgCC icx icpc gpp cxx cc++ icl cl FCC KCC RCC xlC_r aCC CC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 printf "%s\n" "$ac_ct_CXX" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU C++" >&5 printf %s "checking whether the compiler supports GNU C++... " >&6; } if test ${ac_cv_cxx_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 printf "%s\n" "$ac_cv_cxx_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+y} ac_save_CXXFLAGS=$CXXFLAGS { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 printf %s "checking whether $CXX accepts -g... " >&6; } if test ${ac_cv_prog_cxx_g+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes else case e in #( e) CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else case e in #( e) ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 printf "%s\n" "$ac_cv_prog_cxx_g" >&6; } if test $ac_test_CXXFLAGS; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_prog_cxx_stdcxx=no if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++11 features" >&5 printf %s "checking for $CXX option to enable C++11 features... " >&6; } if test ${ac_cv_prog_cxx_cxx11+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx11=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx11_program _ACEOF for ac_arg in '' -std=gnu++11 -std=gnu++0x -std=c++11 -std=c++0x -qlanglvl=extended0x -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx11=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx11" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx11" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx11" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx11" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx11" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx11" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx11 ac_prog_cxx_stdcxx=cxx11 ;; esac fi fi if test x$ac_prog_cxx_stdcxx = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX option to enable C++98 features" >&5 printf %s "checking for $CXX option to enable C++98 features... " >&6; } if test ${ac_cv_prog_cxx_cxx98+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_cv_prog_cxx_cxx98=no ac_save_CXX=$CXX cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_cxx_conftest_cxx98_program _ACEOF for ac_arg in '' -std=gnu++98 -std=c++98 -qlanglvl=extended -AA do CXX="$ac_save_CXX $ac_arg" if ac_fn_cxx_try_compile "$LINENO" then : ac_cv_prog_cxx_cxx98=$ac_arg fi rm -f core conftest.err conftest.$ac_objext conftest.beam test "x$ac_cv_prog_cxx_cxx98" != "xno" && break done rm -f conftest.$ac_ext CXX=$ac_save_CXX ;; esac fi if test "x$ac_cv_prog_cxx_cxx98" = xno then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 printf "%s\n" "unsupported" >&6; } else case e in #( e) if test "x$ac_cv_prog_cxx_cxx98" = x then : { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 printf "%s\n" "none needed" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_cxx98" >&5 printf "%s\n" "$ac_cv_prog_cxx_cxx98" >&6; } CXX="$CXX $ac_cv_prog_cxx_cxx98" ;; esac fi ac_cv_prog_cxx_stdcxx=$ac_cv_prog_cxx_cxx98 ac_prog_cxx_stdcxx=cxx98 ;; esac fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CXX" am_compiler_list= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 printf %s "checking dependency style of $depcc... " >&6; } if test ${am_cv_CXX_dependencies_compiler_type+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi am__universal=false case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thus: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CXX_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CXX_dependencies_compiler_type=none fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 printf "%s\n" "$am_cv_CXX_dependencies_compiler_type" >&6; } CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then am__fastdepCXX_TRUE= am__fastdepCXX_FALSE='#' else am__fastdepCXX_TRUE='#' am__fastdepCXX_FALSE= fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $CXX understands -c and -o together" >&5 printf %s "checking whether $CXX understands -c and -o together... " >&6; } if test ${ac_cv_prog_cxx_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main (void) { ; return 0; } _ACEOF # We test twice because some compilers refuse to overwrite an existing # '.o' file with '-o', although they will create one. ac_try='$CXX $CXXFLAGS -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then ac_cv_prog_cxx_c_o=yes else ac_cv_prog_cxx_c_o=no fi rm -rf conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_c_o" >&5 printf "%s\n" "$ac_cv_prog_cxx_c_o" >&6; } if test $ac_cv_prog_cxx_c_o = no; then printf "%s\n" "#define CXX_NO_MINUS_C_MINUS_O 1" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_cv_prog_cxx_c_o = no ; then CXX="$am_aux_dir/compile $CXX" fi # Check whether --enable-f77 was given. if test ${enable_f77+y} then : enableval=$enable_f77; enable_f77=$enableval else case e in #( e) enable_f77=yes ;; esac fi if test "$enable_f77" = no ; then # make sure F77 is not set unset F77 else # If enable-msvc, then test for Intel Fortran compiler for Windows # explicitly and add the compile wrapper. The compile wrapper works # around issues related to finding MS link.exe. (Unix link.exe occurs # first in PATH, which causes compile and link checks to fail.) # For the same reason, set LD to use the compile wrapper. if test $enable_msvc = yes ; then for ac_prog in ifx ifort do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi F77=$ac_cv_prog_F77 if test -n "$F77"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 printf "%s\n" "$F77" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$F77" && break done if test -n "$F77" ; then F77="$am_aux_dir/compile $F77" ac_cv_prog_F77="$F77" LD="$F77" : ${AR:=lib} fi fi # If not msvc-enabled, then look for some Fortran compiler and check # whether it works. If F77 is set, this simply checks whether it works. if test $enable_msvc = no || test -n "$F77" ; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -n "$ac_tool_prefix"; then for ac_prog in gfortran ifx ifort flang g95 fort77 f77 f95 f90 g77 pgf90 pgf77 ifc frt af77 xlf_r fl32 do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$F77"; then ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_F77="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi F77=$ac_cv_prog_F77 if test -n "$F77"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $F77" >&5 printf "%s\n" "$F77" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$F77" && break done fi if test -z "$F77"; then ac_ct_F77=$F77 for ac_prog in gfortran ifx ifort flang g95 fort77 f77 f95 f90 g77 pgf90 pgf77 ifc frt af77 xlf_r fl32 do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_F77"; then ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_F77="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_F77=$ac_cv_prog_ac_ct_F77 if test -n "$ac_ct_F77"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_F77" >&5 printf "%s\n" "$ac_ct_F77" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_F77" && break done if test "x$ac_ct_F77" = x; then F77="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac F77=$ac_ct_F77 fi fi # Provide some information about the compiler. printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done rm -f a.out # If we don't use '.F' as extension, the preprocessor is not run on the # input file. (Note that this only needs to work for GNU compilers.) ac_save_ext=$ac_ext ac_ext=F { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports GNU Fortran 77" >&5 printf %s "checking whether the compiler supports GNU Fortran 77... " >&6; } if test ${ac_cv_f77_compiler_gnu+y} then : printf %s "(cached) " >&6 else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program main #ifndef __GNUC__ choke me #endif end _ACEOF if ac_fn_f77_try_compile "$LINENO" then : ac_compiler_gnu=yes else case e in #( e) ac_compiler_gnu=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_cv_f77_compiler_gnu=$ac_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_compiler_gnu" >&5 printf "%s\n" "$ac_cv_f77_compiler_gnu" >&6; } ac_compiler_gnu=$ac_cv_f77_compiler_gnu ac_ext=$ac_save_ext ac_test_FFLAGS=${FFLAGS+y} ac_save_FFLAGS=$FFLAGS FFLAGS= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $F77 accepts -g" >&5 printf %s "checking whether $F77 accepts -g... " >&6; } if test ${ac_cv_prog_f77_g+y} then : printf %s "(cached) " >&6 else case e in #( e) FFLAGS=-g cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO" then : ac_cv_prog_f77_g=yes else case e in #( e) ac_cv_prog_f77_g=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_g" >&5 printf "%s\n" "$ac_cv_prog_f77_g" >&6; } if test $ac_test_FFLAGS; then FFLAGS=$ac_save_FFLAGS elif test $ac_cv_prog_f77_g = yes; then if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-g -O2" else FFLAGS="-g" fi else if test "x$ac_cv_f77_compiler_gnu" = xyes; then FFLAGS="-O2" else FFLAGS= fi fi if test $ac_compiler_gnu = yes; then G77=yes else G77= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi fi # Allow for the possibility that there is no Fortran compiler on the system. if test -z "$F77" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No Fortran 77 compiler available." >&5 printf "%s\n" "$as_me: No Fortran 77 compiler available." >&6;} fi if test -n "$F77"; then COIN_HAS_F77_TRUE= COIN_HAS_F77_FALSE='#' else COIN_HAS_F77_TRUE='#' COIN_HAS_F77_FALSE= fi # If there is a Fortran compiler, then setup everything to use it, including F77_FUNC if test -n "$F77" ; then ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to get verbose linking output from $F77" >&5 printf %s "checking how to get verbose linking output from $F77... " >&6; } if test ${ac_cv_prog_f77_v+y} then : printf %s "(cached) " >&6 else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_compile "$LINENO" then : ac_cv_prog_f77_v= # Try some options frequently used verbose output for ac_verb in -v -verbose --verbose -V -\#\#\#; do cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FFLAGS=$FFLAGS FFLAGS="$FFLAGS $ac_verb" eval "set x $ac_link" shift printf "%s\n" "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` printf "%s\n" "$ac_f77_v_output" >&5 FFLAGS=$ac_save_FFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_f77_v_output="`echo $ac_f77_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_f77_v_output in # With xlf replace commas with spaces, # and remove "-link" and closing parenthesis. *xlfentry*) ac_f77_v_output=`echo $ac_f77_v_output | sed ' s/,/ /g s/ -link / /g s/) *$// ' ` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_f77_v_output=`echo $ac_f77_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. *fort77*f2c*gcc*) ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' /:[ ]\+Running[ ]\{1,\}"gcc"/{ /"-c"/d /[.]c"*/d s/^.*"gcc"/"gcc"/ s/"//gp }'` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; esac # look for -l* and *.a constructs in the output for ac_arg in $ac_f77_v_output; do case $ac_arg in [\\/]*.a | ?:[\\/]*.a | -[lLRu]*) ac_cv_prog_f77_v=$ac_verb break 2 ;; esac done done if test -z "$ac_cv_prog_f77_v"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cannot determine how to obtain linking information from $F77" >&5 printf "%s\n" "$as_me: WARNING: cannot determine how to obtain linking information from $F77" >&2;} fi else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: compilation failed" >&5 printf "%s\n" "$as_me: WARNING: compilation failed" >&2;} ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_v" >&5 printf "%s\n" "$ac_cv_prog_f77_v" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 libraries of $F77" >&5 printf %s "checking for Fortran 77 libraries of $F77... " >&6; } if test ${ac_cv_f77_libs+y} then : printf %s "(cached) " >&6 else case e in #( e) if test "x$FLIBS" != "x"; then ac_cv_f77_libs="$FLIBS" # Let the user override the test. else cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # Compile and link our simple test program by passing a flag (argument # 1 to this macro) to the Fortran compiler in order to get # "verbose" output that we can then parse for the Fortran linker # flags. ac_save_FFLAGS=$FFLAGS FFLAGS="$FFLAGS $ac_cv_prog_f77_v" eval "set x $ac_link" shift printf "%s\n" "$as_me:${as_lineno-$LINENO}: $*" >&5 # gfortran 4.3 outputs lines setting COLLECT_GCC_OPTIONS, COMPILER_PATH, # LIBRARY_PATH; skip all such settings. ac_f77_v_output=`eval $ac_link 5>&1 2>&1 | sed '/^Driving:/d; /^Configured with:/d; '"/^[_$as_cr_Letters][_$as_cr_alnum]*=/d"` printf "%s\n" "$ac_f77_v_output" >&5 FFLAGS=$ac_save_FFLAGS rm -rf conftest* # On HP/UX there is a line like: "LPATH is: /foo:/bar:/baz" where # /foo, /bar, and /baz are search directories for the Fortran linker. # Here, we change these into -L/foo -L/bar -L/baz (and put it first): ac_f77_v_output="`echo $ac_f77_v_output | grep 'LPATH is:' | sed 's|.*LPATH is\(: *[^ ]*\).*|\1|;s|: */| -L/|g'` $ac_f77_v_output" # FIXME: we keep getting bitten by quoted arguments; a more general fix # that detects unbalanced quotes in FLIBS should be implemented # and (ugh) tested at some point. case $ac_f77_v_output in # With xlf replace commas with spaces, # and remove "-link" and closing parenthesis. *xlfentry*) ac_f77_v_output=`echo $ac_f77_v_output | sed ' s/,/ /g s/ -link / /g s/) *$// ' ` ;; # With Intel ifc, ignore the quoted -mGLOB_options_string stuff (quoted # $LIBS confuse us, and the libraries appear later in the output anyway). *mGLOB_options_string*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"-mGLOB[^"]*"/ /g'` ;; # Portland Group compiler has singly- or doubly-quoted -cmdline argument # Singly-quoted arguments were reported for versions 5.2-4 and 6.0-4. # Doubly-quoted arguments were reported for "PGF90/x86 Linux/x86 5.0-2". *-cmdline\ * | *-ignore\ * | *-def\ *) ac_f77_v_output=`echo $ac_f77_v_output | sed "\ s/-cmdline *'[^']*'/ /g; s/-cmdline *\"[^\"]*\"/ /g s/-ignore *'[^']*'/ /g; s/-ignore *\"[^\"]*\"/ /g s/-def *'[^']*'/ /g; s/-def *\"[^\"]*\"/ /g"` ;; # If we are using fort77 (the f2c wrapper) then filter output and delete quotes. *fort77*f2c*gcc*) ac_f77_v_output=`echo "$ac_f77_v_output" | sed -n ' /:[ ]\+Running[ ]\{1,\}"gcc"/{ /"-c"/d /[.]c"*/d s/^.*"gcc"/"gcc"/ s/"//gp }'` ;; # If we are using Cray Fortran then delete quotes. *cft90*) ac_f77_v_output=`echo $ac_f77_v_output | sed 's/"//g'` ;; esac ac_cv_f77_libs= # Save positional arguments (if any) ac_save_positional="$@" set X $ac_f77_v_output while test $# != 1; do shift ac_arg=$1 case $ac_arg in [\\/]*.a | ?:[\\/]*.a) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else case e in #( e) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" ;; esac fi ;; -bI:*) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else case e in #( e) if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_arg; do ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" done else ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" fi ;; esac fi ;; # Ignore these flags. -lang* | -lcrt*.o | -lc | -lgcc* | -lSystem | -libmil | -little \ |-LANG:=* | -LIST:* | -LNO:* | -link) ;; -lkernel32 | -lmingw* | -lmoldname) # Ignore this library only on Windows-like systems. case $host_os in cygwin* | msys* | mingw* | windows*) ;; *) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else case e in #( e) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" ;; esac fi ;; esac ;; -[LRuYz]) # These flags, when seen by themselves, take an argument. # We remove the space between option and argument and re-iterate # unless we find an empty arg or a new option (starting with -) case $2 in "" | -*);; *) ac_arg="$ac_arg$2" shift; shift set X $ac_arg "$@" ;; esac ;; -YP,*) for ac_j in `printf "%s\n" "$ac_arg" | sed -e 's/-YP,/-L/;s/:/ -L/g'`; do ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_j" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else case e in #( e) ac_arg="$ac_arg $ac_j" ac_cv_f77_libs="$ac_cv_f77_libs $ac_j" ;; esac fi done ;; -[lLR]*) ac_exists=false for ac_i in $ac_cv_f77_libs; do if test x"$ac_arg" = x"$ac_i"; then ac_exists=true break fi done if test x"$ac_exists" = xtrue then : else case e in #( e) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" ;; esac fi ;; -zallextract*| -zdefaultextract) ac_cv_f77_libs="$ac_cv_f77_libs $ac_arg" ;; -mllvm) ${2+shift};; # Defend against 'clang -mllvm -loopopt=0'. # Ignore everything else. esac done # restore positional arguments set X $ac_save_positional; shift # We only consider "LD_RUN_PATH" on Solaris systems. If this is seen, # then we insist that the "run path" must be an absolute path (i.e. it # must begin with a "/"). case `(uname -sr) 2>/dev/null` in "SunOS 5"*) ac_ld_run_path=`printf "%s\n" "$ac_f77_v_output" | sed -n 's,^.*LD_RUN_PATH *= *\(/[^ ]*\).*$,-R\1,p'` test "x$ac_ld_run_path" != x && if test "$ac_compiler_gnu" = yes; then for ac_link_opt in $ac_ld_run_path; do ac_cv_f77_libs="$ac_cv_f77_libs -Xlinker $ac_link_opt" done else ac_cv_f77_libs="$ac_cv_f77_libs $ac_ld_run_path" fi ;; esac fi # test "x$[]_AC_LANG_PREFIX[]LIBS" = "x" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_libs" >&5 printf "%s\n" "$ac_cv_f77_libs" >&6; } FLIBS="$ac_cv_f77_libs" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dummy main to link with Fortran 77 libraries" >&5 printf %s "checking for dummy main to link with Fortran 77 libraries... " >&6; } if test ${ac_cv_f77_dummy_main+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_f77_dm_save_LIBS=$LIBS LIBS="$LIBS $FLIBS" ac_fortran_dm_var=F77_DUMMY_MAIN ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # First, try linking without a dummy main: cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_fortran_dummy_main=none else case e in #( e) ac_cv_fortran_dummy_main=unknown ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_cv_fortran_dummy_main = unknown; then for ac_func in MAIN__ MAIN_ __main MAIN _MAIN __MAIN main_ main__ _main; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #define $ac_fortran_dm_var $ac_func #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_fortran_dummy_main=$ac_func; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done fi ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu ac_cv_f77_dummy_main=$ac_cv_fortran_dummy_main rm -rf conftest* LIBS=$ac_f77_dm_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_dummy_main" >&5 printf "%s\n" "$ac_cv_f77_dummy_main" >&6; } F77_DUMMY_MAIN=$ac_cv_f77_dummy_main if test "$F77_DUMMY_MAIN" != unknown then : if test $F77_DUMMY_MAIN != none; then printf "%s\n" "#define F77_DUMMY_MAIN $F77_DUMMY_MAIN" >>confdefs.h if test "x$ac_cv_fc_dummy_main" = "x$ac_cv_f77_dummy_main"; then printf "%s\n" "#define FC_DUMMY_MAIN_EQ_F77 1" >>confdefs.h fi fi else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "linking to Fortran libraries from C fails See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for Fortran 77 name-mangling scheme" >&5 printf %s "checking for Fortran 77 name-mangling scheme... " >&6; } if test ${ac_cv_f77_mangling+y} then : printf %s "(cached) " >&6 else case e in #( e) cat > conftest.$ac_ext <<_ACEOF subroutine foobar() return end subroutine foo_bar() return end _ACEOF if ac_fn_f77_try_compile "$LINENO" then : mv conftest.$ac_objext cfortran_test.$ac_objext ac_save_LIBS=$LIBS LIBS="cfortran_test.$ac_objext $LIBS $FLIBS" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success=no for ac_foobar in foobar FOOBAR; do for ac_underscore in "" "_"; do ac_func="$ac_foobar$ac_underscore" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_func (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_success=yes; break 2 fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done done ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test "$ac_success" = "yes"; then case $ac_foobar in foobar) ac_case=lower ac_foo_bar=foo_bar ;; FOOBAR) ac_case=upper ac_foo_bar=FOO_BAR ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_success_extra=no for ac_extra in "" "_"; do ac_func="$ac_foo_bar$ac_underscore$ac_extra" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_func (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_func (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_success_extra=yes; break fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext done ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test "$ac_success_extra" = "yes"; then ac_cv_f77_mangling="$ac_case case" if test -z "$ac_underscore"; then ac_cv_f77_mangling="$ac_cv_f77_mangling, no underscore" else ac_cv_f77_mangling="$ac_cv_f77_mangling, underscore" fi if test -z "$ac_extra"; then ac_cv_f77_mangling="$ac_cv_f77_mangling, no extra underscore" else ac_cv_f77_mangling="$ac_cv_f77_mangling, extra underscore" fi else ac_cv_f77_mangling="unknown" fi else ac_cv_f77_mangling="unknown" fi LIBS=$ac_save_LIBS rm -rf conftest* rm -f cfortran_test* else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot compile a simple Fortran program See 'config.log' for more details" "$LINENO" 5; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_f77_mangling" >&5 printf "%s\n" "$ac_cv_f77_mangling" >&6; } ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu case $ac_cv_f77_mangling in "lower case, no underscore, no extra underscore") printf "%s\n" "#define F77_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define F77_FUNC_(name,NAME) name" >>confdefs.h ;; "lower case, no underscore, extra underscore") printf "%s\n" "#define F77_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define F77_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, no extra underscore") printf "%s\n" "#define F77_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define F77_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, extra underscore") printf "%s\n" "#define F77_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define F77_FUNC_(name,NAME) name ## __" >>confdefs.h ;; "upper case, no underscore, no extra underscore") printf "%s\n" "#define F77_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define F77_FUNC_(name,NAME) NAME" >>confdefs.h ;; "upper case, no underscore, extra underscore") printf "%s\n" "#define F77_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define F77_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, no extra underscore") printf "%s\n" "#define F77_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define F77_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, extra underscore") printf "%s\n" "#define F77_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define F77_FUNC_(name,NAME) NAME ## __" >>confdefs.h ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unknown Fortran name-mangling scheme" >&5 printf "%s\n" "$as_me: WARNING: unknown Fortran name-mangling scheme" >&2;} ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # check whether compile script should be used to wrap around Fortran 77 compiler ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether $F77 understands -c and -o together" >&5 printf %s "checking whether $F77 understands -c and -o together... " >&6; } if test ${ac_cv_prog_f77_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF # We test twice because some compilers refuse to overwrite an existing # '.o' file with '-o', although they will create one. ac_try='$F77 $FFLAGS -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -f conftest2.$ac_objext && { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" printf "%s\n" "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then ac_cv_prog_f77_c_o=yes else ac_cv_prog_f77_c_o=no fi rm -rf conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_f77_c_o" >&5 printf "%s\n" "$ac_cv_prog_f77_c_o" >&6; } if test $ac_cv_prog_f77_c_o = no; then printf "%s\n" "#define F77_NO_MINUS_C_MINUS_O 1" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test $ac_cv_prog_f77_c_o = no ; then F77="$am_aux_dir/compile $F77" fi fi # This is a C++ package, set the language accordingly. #AC_LANG_PUSH(C++) # Initialize libtool case `pwd` in *\ * | *\ *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 printf "%s\n" "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; esac macro_version='2.5.4' macro_revision='2.5.4' ltmain=$ac_aux_dir/ltmain.sh # Backslashify metacharacters that are still active within # double-quoted strings. sed_quote_subst='s/\(["`$\\]\)/\\\1/g' # Same as above, but do not quote variable references. double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' # Sed substitution to delay expansion of an escaped single quote. delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5 printf %s "checking how to print strings... " >&6; } # Test print first, because it will be a builtin if present. if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='print -r --' elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then ECHO='printf %s\n' else # Use this function as a fallback that always works. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } ECHO='func_fallback_echo' fi # func_echo_all arg... # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "" } case $ECHO in printf*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: printf" >&5 printf "%s\n" "printf" >&6; } ;; print*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: print -r" >&5 printf "%s\n" "print -r" >&6; } ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cat" >&5 printf "%s\n" "cat" >&6; } ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 printf %s "checking for a sed that does not truncate output... " >&6; } if test ${ac_cv_path_SED+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for ac_i in 1 2 3 4 5 6 7; do ac_script="$ac_script$as_nl$ac_script" done echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed { ac_script=; unset ac_script;} if test -z "$SED"; then ac_path_SED_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in sed gsed do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_SED="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_SED" || continue # Check for GNU ac_path_SED and select it if it is found. # Check for GNU $ac_path_SED case `"$ac_path_SED" --version 2>&1` in #( *GNU*) ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" '' >> "conftest.nl" "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_SED_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_SED="$ac_path_SED" ac_path_SED_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_SED_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_SED"; then as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 fi else ac_cv_path_SED=$SED fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 printf "%s\n" "$ac_cv_path_SED" >&6; } SED="$ac_cv_path_SED" rm -f conftest.sed test -z "$SED" && SED=sed Xsed="$SED -e 1s/^X//" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 printf %s "checking for grep that handles long lines and -e... " >&6; } if test ${ac_cv_path_GREP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in grep ggrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in #( *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 printf "%s\n" "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 printf %s "checking for egrep... " >&6; } if test ${ac_cv_path_EGREP+y} then : printf %s "(cached) " >&6 else case e in #( e) if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in egrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in #( *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 printf "%s\n" "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" EGREP_TRADITIONAL=$EGREP ac_cv_path_EGREP_TRADITIONAL=$EGREP { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5 printf %s "checking for fgrep... " >&6; } if test ${ac_cv_path_FGREP+y} then : printf %s "(cached) " >&6 else case e in #( e) if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 then ac_cv_path_FGREP="$GREP -F" else if test -z "$FGREP"; then ac_path_FGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in fgrep do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_FGREP="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_FGREP" || continue # Check for GNU ac_path_FGREP and select it if it is found. # Check for GNU $ac_path_FGREP case `"$ac_path_FGREP" --version 2>&1` in #( *GNU*) ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; #( *) ac_count=0 printf %s 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" printf "%s\n" 'FGREP' >> "conftest.nl" "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_FGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_FGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_FGREP"; then as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_FGREP=$FGREP fi fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5 printf "%s\n" "$ac_cv_path_FGREP" >&6; } FGREP="$ac_cv_path_FGREP" test -z "$GREP" && GREP=grep # Check whether --with-gnu-ld was given. if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else case e in #( e) with_gnu_ld=no ;; esac fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw* | *-*-windows*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else case e in #( e) # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5 printf %s "checking for BSD- or MS-compatible name lister (nm)... " >&6; } if test ${lt_cv_path_NM+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM=$NM else lt_nm_to_check=${ac_tool_prefix}nm if test -n "$ac_tool_prefix" && test "$build" = "$host"; then lt_nm_to_check="$lt_nm_to_check nm" fi for lt_tmp_nm in $lt_nm_to_check; do lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. tmp_nm=$ac_dir/$lt_tmp_nm if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then # Check to see if the nm accepts a BSD-compat flag. # Adding the 'sed 1q' prevents false positives on HP-UX, which says: # nm: unknown option "B" ignored # Tru64's nm complains that /dev/null is an invalid object file # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty case $build_os in mingw* | windows*) lt_bad_file=conftest.nm/nofile ;; *) lt_bad_file=/dev/null ;; esac case `"$tmp_nm" -B $lt_bad_file 2>&1 | $SED '1q'` in *$lt_bad_file* | *'Invalid file or object type'*) lt_cv_path_NM="$tmp_nm -B" break 2 ;; *) case `"$tmp_nm" -p /dev/null 2>&1 | $SED '1q'` in */dev/null*) lt_cv_path_NM="$tmp_nm -p" break 2 ;; *) lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but continue # so that we can try to find one that supports BSD flags ;; esac ;; esac fi done IFS=$lt_save_ifs done : ${lt_cv_path_NM=no} fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5 printf "%s\n" "$lt_cv_path_NM" >&6; } if test no != "$lt_cv_path_NM"; then NM=$lt_cv_path_NM else # Didn't find any BSD compatible name lister, look for dumpbin. if test -n "$DUMPBIN"; then : # Let the user override the test. else if test -n "$ac_tool_prefix"; then for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DUMPBIN+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$DUMPBIN"; then ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi DUMPBIN=$ac_cv_prog_DUMPBIN if test -n "$DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5 printf "%s\n" "$DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$DUMPBIN" && break done fi if test -z "$DUMPBIN"; then ac_ct_DUMPBIN=$DUMPBIN for ac_prog in dumpbin "link -dump" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DUMPBIN+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_DUMPBIN"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN if test -n "$ac_ct_DUMPBIN"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5 printf "%s\n" "$ac_ct_DUMPBIN" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_DUMPBIN" && break done if test "x$ac_ct_DUMPBIN" = x; then DUMPBIN=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DUMPBIN=$ac_ct_DUMPBIN fi fi case `$DUMPBIN -symbols -headers /dev/null 2>&1 | $SED '1q'` in *COFF*) DUMPBIN="$DUMPBIN -symbols -headers" ;; *) DUMPBIN=: ;; esac fi if test : != "$DUMPBIN"; then NM=$DUMPBIN fi fi test -z "$NM" && NM=nm { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5 printf %s "checking the name lister ($NM) interface... " >&6; } if test ${lt_cv_nm_interface+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 (eval echo "\"\$as_me:$LINENO: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" fi rm -f conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5 printf "%s\n" "$lt_cv_nm_interface" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 printf %s "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 printf "%s\n" "no, using $LN_S" >&6; } fi # find the maximum length of command line arguments { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5 printf %s "checking the maximum length of command line arguments... " >&6; } if test ${lt_cv_sys_max_cmd_len+y} then : printf %s "(cached) " >&6 else case e in #( e) i=0 teststring=ABCD case $build_os in msdosdjgpp*) # On DJGPP, this test can blow up pretty badly due to problems in libc # (any single argument exceeding 2000 bytes causes a buffer overrun # during glob expansion). Even if it were fixed, the result of this # check would be larger than it should be. lt_cv_sys_max_cmd_len=12288; # 12K is about right ;; gnu* | ironclad*) # Under GNU Hurd and Ironclad, this test is not required because there # is no limit to the length of command line arguments. # Libtool will interpret -1 as no limit whatsoever lt_cv_sys_max_cmd_len=-1; ;; cygwin* | mingw* | windows* | cegcc*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, # you end up with a "frozen" computer, even though with patience # the test eventually succeeds (with a max line length of 256k). # Instead, let's just punt: use the minimum linelength reported by # all of the supported platforms: 8192 (on NT/2K/XP). lt_cv_sys_max_cmd_len=8192; ;; mint*) # On MiNT this can take a long time and run out of memory. lt_cv_sys_max_cmd_len=8192; ;; amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. lt_cv_sys_max_cmd_len=8192; ;; darwin* | dragonfly* | freebsd* | midnightbsd* | netbsd* | openbsd*) # This has been around since 386BSD, at least. Likely further. if test -x /sbin/sysctl; then lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` elif test -x /usr/sbin/sysctl; then lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` else lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs fi # And add a safety zone lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` ;; interix*) # We know the value 262144 and hardcode it with a safety zone (like BSD) lt_cv_sys_max_cmd_len=196608 ;; os2*) # The test takes a long time on OS/2. lt_cv_sys_max_cmd_len=8192 ;; osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not # nice to cause kernel panics so lets avoid the loop below. # First set a reasonable default. lt_cv_sys_max_cmd_len=16384 # if test -x /sbin/sysconfig; then case `/sbin/sysconfig -q proc exec_disable_arg_limit` in *1*) lt_cv_sys_max_cmd_len=-1 ;; esac fi ;; sco3.2v5*) lt_cv_sys_max_cmd_len=102400 ;; sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then lt_cv_sys_max_cmd_len=`echo $kargmax | $SED 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi ;; *) lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` if test -n "$lt_cv_sys_max_cmd_len" && \ test undefined != "$lt_cv_sys_max_cmd_len"; then lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else # Make teststring a little bigger before we do anything with it. # a 1K string should be a reasonable start. for i in 1 2 3 4 5 6 7 8; do teststring=$teststring$teststring done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} # If test is not a shell built-in, we'll probably end up computing a # maximum length that is only half of the actual maximum length, but # we can't tell. while { test X`env echo "$teststring$teststring" 2>/dev/null` \ = "X$teststring$teststring"; } >/dev/null 2>&1 && test 17 != "$i" # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done # Only check the string length outside the loop. lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= # Add a significant safety factor because C++ compilers can tack on # massive amounts of additional arguments before passing them to the # linker. It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; esac ;; esac fi if test -n "$lt_cv_sys_max_cmd_len"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5 printf "%s\n" "$lt_cv_sys_max_cmd_len" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: none" >&5 printf "%s\n" "none" >&6; } fi max_cmd_len=$lt_cv_sys_max_cmd_len : ${CP="cp -f"} : ${MV="mv -f"} : ${RM="rm -f"} if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then lt_unset=unset else lt_unset=false fi # test EBCDIC or ASCII case `echo X|tr X '\101'` in A) # ASCII based system # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr lt_SP2NL='tr \040 \012' lt_NL2SP='tr \015\012 \040\040' ;; *) # EBCDIC based system lt_SP2NL='tr \100 \n' lt_NL2SP='tr \r\n \100\100' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5 printf %s "checking how to convert $build file names to $host format... " >&6; } if test ${lt_cv_to_host_file_cmd+y} then : printf %s "(cached) " >&6 else case e in #( e) case $host in *-*-mingw* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 ;; esac ;; *-*-cygwin* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin ;; *-*-cygwin* ) lt_cv_to_host_file_cmd=func_convert_file_noop ;; * ) # otherwise, assume *nix lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin ;; esac ;; * ) # unhandled hosts (and "normal" native builds) lt_cv_to_host_file_cmd=func_convert_file_noop ;; esac ;; esac fi to_host_file_cmd=$lt_cv_to_host_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5 printf "%s\n" "$lt_cv_to_host_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5 printf %s "checking how to convert $build file names to toolchain format... " >&6; } if test ${lt_cv_to_tool_file_cmd+y} then : printf %s "(cached) " >&6 else case e in #( e) #assume ordinary cross tools, or native build. lt_cv_to_tool_file_cmd=func_convert_file_noop case $host in *-*-mingw* | *-*-windows* ) case $build in *-*-mingw* | *-*-windows* ) # actually msys lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 ;; esac ;; esac ;; esac fi to_tool_file_cmd=$lt_cv_to_tool_file_cmd { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5 printf "%s\n" "$lt_cv_to_tool_file_cmd" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5 printf %s "checking for $LD option to reload object files... " >&6; } if test ${lt_cv_ld_reload_flag+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_ld_reload_flag='-r' ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5 printf "%s\n" "$lt_cv_ld_reload_flag" >&6; } reload_flag=$lt_cv_ld_reload_flag case $reload_flag in "" | " "*) ;; *) reload_flag=" $reload_flag" ;; esac reload_cmds='$LD$reload_flag -o $output$reload_objs' case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) if test yes != "$GCC"; then reload_cmds=false fi ;; darwin*) if test yes = "$GCC"; then reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' else reload_cmds='$LD$reload_flag -o $output$reload_objs' fi ;; esac # Extract the first word of "file", so it can be a program name with args. set dummy file; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_FILECMD+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$FILECMD"; then ac_cv_prog_FILECMD="$FILECMD" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_FILECMD="file" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_FILECMD" && ac_cv_prog_FILECMD=":" fi ;; esac fi FILECMD=$ac_cv_prog_FILECMD if test -n "$FILECMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $FILECMD" >&5 printf "%s\n" "$FILECMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi test -z "$OBJDUMP" && OBJDUMP=objdump { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5 printf %s "checking how to recognize dependent libraries... " >&6; } if test ${lt_cv_deplibs_check_method+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_file_magic_cmd='$MAGIC_CMD' lt_cv_file_magic_test_file= lt_cv_deplibs_check_method='unknown' # Need to set the preceding variable on all platforms that support # interlibrary dependencies. # 'none' -- dependencies not supported. # 'unknown' -- same as none, but documents that we really don't know. # 'pass_all' -- all dependencies passed with no checks. # 'file_magic [[regex]]' -- check by looking for files in library path # that responds to the $file_magic_cmd with a given extended regex. # If you have 'file' or equivalent on your system and you're not sure # whether 'pass_all' will *always* work, you probably want this one. case $host_os in aix[4-9]*) lt_cv_deplibs_check_method=pass_all ;; beos*) lt_cv_deplibs_check_method=pass_all ;; bsdi[45]*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' lt_cv_file_magic_cmd='$FILECMD -L' lt_cv_file_magic_test_file=/shlib/libc.so ;; cygwin*) # func_win32_libid is a shell function defined in ltmain.sh lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' ;; mingw* | windows* | pw32*) # Base MSYS/MinGW do not provide the 'file' command needed by # func_win32_libid shell function, so use a weaker test based on 'objdump', # unless we find 'file', for example because we are cross-compiling. if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else # Keep this pattern in sync with the one in func_win32_libid. lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; cegcc*) # use the weaker test based on 'objdump'. See mingw*. lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' lt_cv_file_magic_cmd='$OBJDUMP -f' ;; darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly* | midnightbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. # Let's accept both of them until this is cleared up. lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` ;; esac else lt_cv_deplibs_check_method=pass_all fi ;; haiku*) lt_cv_deplibs_check_method=pass_all ;; hpux10.20* | hpux11*) lt_cv_file_magic_cmd=$FILECMD case $host_cpu in ia64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac ;; interix[3-9]*) # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' ;; irix5* | irix6* | nonstopux*) case $LD in *-32|*"-32 ") libmagic=32-bit;; *-n32|*"-n32 ") libmagic=N32;; *-64|*"-64 ") libmagic=64-bit;; *) libmagic=never-match;; esac lt_cv_deplibs_check_method=pass_all ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) lt_cv_deplibs_check_method=pass_all ;; *-mlibc) lt_cv_deplibs_check_method=pass_all ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' fi ;; newos6*) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' lt_cv_file_magic_cmd=$FILECMD lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; *nto* | *qnx*) lt_cv_deplibs_check_method=pass_all ;; openbsd*) if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' fi ;; osf3* | osf4* | osf5*) lt_cv_deplibs_check_method=pass_all ;; rdos*) lt_cv_deplibs_check_method=pass_all ;; serenity*) lt_cv_deplibs_check_method=pass_all ;; solaris*) lt_cv_deplibs_check_method=pass_all ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; sysv4 | sysv4.3*) case $host_vendor in motorola) lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` ;; ncr) lt_cv_deplibs_check_method=pass_all ;; sequent) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' ;; sni) lt_cv_file_magic_cmd='/bin/file' lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" lt_cv_file_magic_test_file=/lib/libc.so ;; siemens) lt_cv_deplibs_check_method=pass_all ;; pc) lt_cv_deplibs_check_method=pass_all ;; esac ;; tpf*) lt_cv_deplibs_check_method=pass_all ;; os2*) lt_cv_deplibs_check_method=pass_all ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5 printf "%s\n" "$lt_cv_deplibs_check_method" >&6; } file_magic_glob= want_nocaseglob=no if test "$build" = "$host"; then case $host_os in mingw* | windows* | pw32*) if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then want_nocaseglob=yes else file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` fi ;; esac fi file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi test -z "$DLLTOOL" && DLLTOOL=dlltool { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5 printf %s "checking how to associate runtime and link libraries... " >&6; } if test ${lt_cv_sharedlib_from_linklib_cmd+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_sharedlib_from_linklib_cmd='unknown' case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) # two different shell functions defined in ltmain.sh; # decide which one to use based on capabilities of $DLLTOOL case `$DLLTOOL --help 2>&1` in *--identify-strict*) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib ;; *) lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback ;; esac ;; *) # fallback: assume linklib IS sharedlib lt_cv_sharedlib_from_linklib_cmd=$ECHO ;; esac ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 printf "%s\n" "$lt_cv_sharedlib_from_linklib_cmd" >&6; } sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_RANLIB+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$RANLIB"; then ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi RANLIB=$ac_cv_prog_RANLIB if test -n "$RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 printf "%s\n" "$RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_RANLIB"; then ac_ct_RANLIB=$RANLIB # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_RANLIB+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_RANLIB"; then ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_RANLIB="ranlib" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB if test -n "$ac_ct_RANLIB"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 printf "%s\n" "$ac_ct_RANLIB" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_RANLIB" = x; then RANLIB=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac RANLIB=$ac_ct_RANLIB fi else RANLIB="$ac_cv_prog_RANLIB" fi if test -n "$ac_tool_prefix"; then for ac_prog in ar do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} # Use ARFLAGS variable as AR's operation code to sync the variable naming with # Automake. If both AR_FLAGS and ARFLAGS are specified, AR_FLAGS should have # higher priority because that's what people were doing historically (setting # ARFLAGS for automake and AR_FLAGS for libtool). FIXME: Make the AR_FLAGS # variable obsoleted/removed. test ${AR_FLAGS+y} || AR_FLAGS=${ARFLAGS-cr} lt_ar_flags=$AR_FLAGS # Make AR_FLAGS overridable by 'make ARFLAGS='. Don't try to run-time override # by AR_FLAGS because that was never working and AR_FLAGS is about to die. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5 printf %s "checking for archiver @FILE support... " >&6; } if test ${lt_cv_ar_at_file+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_ar_at_file=no cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO" then : echo conftest.$ac_objext > conftest.lst lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -eq "$ac_status"; then # Ensure the archiver fails upon bogus file names. rm -f conftest.$ac_objext libconftest.a { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5 (eval $lt_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test 0 -ne "$ac_status"; then lt_cv_ar_at_file=@ fi fi rm -f conftest.* libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5 printf "%s\n" "$lt_cv_ar_at_file" >&6; } if test no = "$lt_cv_ar_at_file"; then archiver_list_spec= else archiver_list_spec=$lt_cv_ar_at_file fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_STRIP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 printf "%s\n" "$STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_STRIP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_STRIP="strip" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 printf "%s\n" "$ac_ct_STRIP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi test -z "$STRIP" && STRIP=: test -z "$RANLIB" && RANLIB=: # Determine commands to create old-style static archives. old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' old_postinstall_cmds='chmod 644 $oldlib' old_postuninstall_cmds= if test -n "$RANLIB"; then old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" fi case $host_os in darwin*) lock_old_archive_extraction=yes ;; *) lock_old_archive_extraction=no ;; esac # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Check for command to grab the raw symbol name followed by C symbol from nm. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5 printf %s "checking command to parse $NM output from $compiler object... " >&6; } if test ${lt_cv_sys_global_symbol_pipe+y} then : printf %s "(cached) " >&6 else case e in #( e) # These are sane defaults that work on at least a few old systems. # [They come from Ultrix. What could be older than Ultrix?!! ;)] # Character class describing NM global symbol codes. symcode='[BCDEGRST]' # Regexp to match symbols that can be accessed directly from C. sympat='\([_A-Za-z][_A-Za-z0-9]*\)' # Define system-specific variables. case $host_os in aix*) symcode='[BCDT]' ;; cygwin* | mingw* | windows* | pw32* | cegcc*) symcode='[ABCDGISTW]' ;; hpux*) if test ia64 = "$host_cpu"; then symcode='[ABCDEGRST]' fi ;; irix* | nonstopux*) symcode='[BCDEGRST]' ;; osf*) symcode='[BCDEGQRST]' ;; solaris*) symcode='[BCDRT]' ;; sco3.2v5*) symcode='[DT]' ;; sysv4.2uw2*) symcode='[DT]' ;; sysv5* | sco5v6* | unixware* | OpenUNIX*) symcode='[ABDT]' ;; sysv4) symcode='[DFNSTU]' ;; esac # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[ABCDGIRSTW]' ;; esac if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Gets list of data symbols to import. lt_cv_sys_global_symbol_to_import="$SED -n -e 's/^I .* \(.*\)$/\1/p'" # Adjust the below global symbol transforms to fixup imported variables. lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" lt_c_name_lib_hook="\ -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" else # Disable hooks by default. lt_cv_sys_global_symbol_to_import= lt_cdecl_hook= lt_c_name_hook= lt_c_name_lib_hook= fi # Transform an extracted symbol line into a proper C declaration. # Some systems (esp. on ia64) link data and code symbols differently, # so use this general approach. lt_cv_sys_global_symbol_to_cdecl="$SED -n"\ $lt_cdecl_hook\ " -e 's/^T .* \(.*\)$/extern int \1();/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" # Transform an extracted symbol line into symbol name and symbol address lt_cv_sys_global_symbol_to_c_name_address="$SED -n"\ $lt_c_name_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" # Transform an extracted symbol line into symbol name with lib prefix and # symbol address. lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="$SED -n"\ $lt_c_name_lib_hook\ " -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ " -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ " -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" # Handle CRLF in mingw tool chain opt_cr= case $build_os in mingw* | windows*) opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp ;; esac # Try without a prefix underscore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. if test "$lt_cv_nm_interface" = "MS dumpbin"; then # Fake it for dumpbin and say T for any non-static function, # D for any global variable and I for any imported variable. # Also find C++ and __fastcall symbols from MSVC++ or ICC, # which start with @ or ?. lt_cv_sys_global_symbol_pipe="$AWK '"\ " {last_section=section; section=\$ 3};"\ " /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ " /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ " /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ " /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ " /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ " \$ 0!~/External *\|/{next};"\ " / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ " {if(hide[section]) next};"\ " {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ " {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ " s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ " s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ " ' prfx=^$ac_symprfx" else lt_cv_sys_global_symbol_pipe="$SED -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" fi lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | $SED '/ __gnu_lto/d'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* cat > conftest.$ac_ext <<_LT_EOF #ifdef __cplusplus extern "C" { #endif char nm_test_var; void nm_test_func(void); void nm_test_func(void){} #ifdef __cplusplus } #endif int main(void){nm_test_var='a';nm_test_func();return(0);} _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Now try to grab the symbols. nlist=conftest.nm $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&5 if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&5 && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" else rm -f "$nlist"T fi # Make sure that we snagged all the symbols we need. if $GREP ' nm_test_var$' "$nlist" >/dev/null; then if $GREP ' nm_test_func$' "$nlist" >/dev/null; then cat <<_LT_EOF > conftest.$ac_ext /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #ifdef __cplusplus extern "C" { #endif _LT_EOF # Now generate the symbol file. eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' cat <<_LT_EOF >> conftest.$ac_ext /* The mapping between symbol names and symbols. */ LT_DLSYM_CONST struct { const char *name; void *address; } lt__PROGRAM__LTX_preloaded_symbols[] = { { "@PROGRAM@", (void *) 0 }, _LT_EOF $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext cat <<\_LT_EOF >> conftest.$ac_ext {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt__PROGRAM__LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif _LT_EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext lt_globsym_save_LIBS=$LIBS lt_globsym_save_CFLAGS=$CFLAGS LIBS=conftstm.$ac_objext CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s conftest$ac_exeext; then pipe_works=yes fi LIBS=$lt_globsym_save_LIBS CFLAGS=$lt_globsym_save_CFLAGS else echo "cannot find nm_test_func in $nlist" >&5 fi else echo "cannot find nm_test_var in $nlist" >&5 fi else echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi else echo "$progname: failed program was:" >&5 cat conftest.$ac_ext >&5 fi rm -rf conftest* conftst* # Do not use the global_symbol_pipe unless it works. if test yes = "$pipe_works"; then break else lt_cv_sys_global_symbol_pipe= fi done ;; esac fi if test -z "$lt_cv_sys_global_symbol_pipe"; then lt_cv_sys_global_symbol_to_cdecl= fi if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: failed" >&5 printf "%s\n" "failed" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ok" >&5 printf "%s\n" "ok" >&6; } fi # Response file support. if test "$lt_cv_nm_interface" = "MS dumpbin"; then nm_file_list_spec='@' elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then nm_file_list_spec='@' fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5 printf %s "checking for sysroot... " >&6; } # Check whether --with-sysroot was given. if test ${with_sysroot+y} then : withval=$with_sysroot; else case e in #( e) with_sysroot=no ;; esac fi lt_sysroot= case $with_sysroot in #( yes) if test yes = "$GCC"; then # Trim trailing / since we'll always append absolute paths and we want # to avoid //, if only for less confusing output for the user. lt_sysroot=`$CC --print-sysroot 2>/dev/null | $SED 's:/\+$::'` fi ;; #( /*) lt_sysroot=`echo "$with_sysroot" | $SED -e "$sed_quote_subst"` ;; #( no|'') ;; #( *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5 printf "%s\n" "$with_sysroot" >&6; } as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5 ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5 printf "%s\n" "${lt_sysroot:-no}" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5 printf %s "checking for a working dd... " >&6; } if test ${ac_cv_path_lt_DD+y} then : printf %s "(cached) " >&6 else case e in #( e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i : ${lt_DD:=$DD} if test -z "$lt_DD"; then ac_path_lt_DD_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_prog in dd do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_lt_DD="$as_dir$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_lt_DD" || continue if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: fi $ac_path_lt_DD_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_lt_DD"; then : fi else ac_cv_path_lt_DD=$lt_DD fi rm -f conftest.i conftest2.i conftest.out ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5 printf "%s\n" "$ac_cv_path_lt_DD" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5 printf %s "checking how to truncate binary pipes... " >&6; } if test ${lt_cv_truncate_bin+y} then : printf %s "(cached) " >&6 else case e in #( e) printf 0123456789abcdef0123456789abcdef >conftest.i cat conftest.i conftest.i >conftest2.i lt_cv_truncate_bin= if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then cmp -s conftest.i conftest.out \ && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" fi rm -f conftest.i conftest2.i conftest.out test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q" ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5 printf "%s\n" "$lt_cv_truncate_bin" >&6; } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # Check whether --enable-libtool-lock was given. if test ${enable_libtool_lock+y} then : enableval=$enable_libtool_lock; fi test no = "$enable_libtool_lock" || enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good # libtool support. case $host in ia64-*-hpux*) # Find out what ABI is being produced by ac_compile, and set mode # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.$ac_objext` in *ELF-32*) HPUX_IA64_MODE=32 ;; *ELF-64*) HPUX_IA64_MODE=64 ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then if test yes = "$lt_cv_prog_gnu_ld"; then case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -melf32bsmip" ;; *N32*) LD="${LD-ld} -melf32bmipn32" ;; *64-bit*) LD="${LD-ld} -melf64bmip" ;; esac else case `$FILECMD conftest.$ac_objext` in *32-bit*) LD="${LD-ld} -32" ;; *N32*) LD="${LD-ld} -n32" ;; *64-bit*) LD="${LD-ld} -64" ;; esac fi fi rm -rf conftest* ;; mips64*-*linux*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo '#line '$LINENO' "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then emul=elf case `$FILECMD conftest.$ac_objext` in *32-bit*) emul="${emul}32" ;; *64-bit*) emul="${emul}64" ;; esac case `$FILECMD conftest.$ac_objext` in *MSB*) emul="${emul}btsmip" ;; *LSB*) emul="${emul}ltsmip" ;; esac case `$FILECMD conftest.$ac_objext` in *N32*) emul="${emul}n32" ;; esac LD="${LD-ld} -m $emul" fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ s390*-*linux*|s390*-*tpf*|sparc*-*linux*|x86_64-gnu*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. Note that the listed cases only cover the # situations where additional linker options are needed (such as when # doing 32-bit compilation for a host where ld defaults to 64-bit, or # vice versa); the common cases where no linker options are needed do # not appear in the list. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.o` in *32-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_i386_fbsd" ;; x86_64-*linux*|x86_64-gnu*) case `$FILECMD conftest.o` in *x86-64*) LD="${LD-ld} -m elf32_x86_64" ;; *) LD="${LD-ld} -m elf_i386" ;; esac ;; powerpc64le-*linux*) LD="${LD-ld} -m elf32lppclinux" ;; powerpc64-*linux*) LD="${LD-ld} -m elf32ppclinux" ;; s390x-*linux*) LD="${LD-ld} -m elf_s390" ;; sparc64-*linux*) LD="${LD-ld} -m elf32_sparc" ;; esac ;; *64-bit*) case $host in x86_64-*kfreebsd*-gnu) LD="${LD-ld} -m elf_x86_64_fbsd" ;; x86_64-*linux*|x86_64-gnu*) LD="${LD-ld} -m elf_x86_64" ;; powerpcle-*linux*) LD="${LD-ld} -m elf64lppc" ;; powerpc-*linux*) LD="${LD-ld} -m elf64ppc" ;; s390*-*linux*|s390*-*tpf*) LD="${LD-ld} -m elf64_s390" ;; sparc*-*linux*) LD="${LD-ld} -m elf64_sparc" ;; esac ;; esac fi rm -rf conftest* ;; *-*-sco3.2v5*) # On SCO OpenServer 5, we need -belf to get full-featured binaries. SAVE_CFLAGS=$CFLAGS CFLAGS="$CFLAGS -belf" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5 printf %s "checking whether the C compiler needs -belf... " >&6; } if test ${lt_cv_cc_needs_belf+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_cc_needs_belf=yes else case e in #( e) lt_cv_cc_needs_belf=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5 printf "%s\n" "$lt_cv_cc_needs_belf" >&6; } if test yes != "$lt_cv_cc_needs_belf"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS=$SAVE_CFLAGS fi ;; *-*solaris*) # Find out what ABI is being produced by ac_compile, and set linker # options accordingly. echo 'int i;' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then case `$FILECMD conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in yes*) case $host in i?86-*-solaris*|x86_64-*-solaris*) LD="${LD-ld} -m elf_x86_64" ;; sparc*-*-solaris*) LD="${LD-ld} -m elf64_sparc" ;; esac # GNU ld 2.21 introduced _sol2 emulations. Use them if available. if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then LD=${LD-ld}_sol2 fi ;; *) if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; esac ;; esac fi rm -rf conftest* ;; esac need_locks=$enable_libtool_lock if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. set dummy ${ac_tool_prefix}mt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$MANIFEST_TOOL"; then ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL if test -n "$MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5 printf "%s\n" "$MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_MANIFEST_TOOL"; then ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL # Extract the first word of "mt", so it can be a program name with args. set dummy mt; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_MANIFEST_TOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_MANIFEST_TOOL"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL if test -n "$ac_ct_MANIFEST_TOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5 printf "%s\n" "$ac_ct_MANIFEST_TOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_MANIFEST_TOOL" = x; then MANIFEST_TOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL fi else MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" fi test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5 printf %s "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } if test ${lt_cv_path_manifest_tool+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_path_manifest_tool=no echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out cat conftest.err >&5 if $GREP 'Manifest Tool' conftest.out > /dev/null; then lt_cv_path_manifest_tool=yes fi rm -f conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_manifest_tool" >&5 printf "%s\n" "$lt_cv_path_manifest_tool" >&6; } if test yes != "$lt_cv_path_manifest_tool"; then MANIFEST_TOOL=: fi case $host_os in rhapsody* | darwin*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DSYMUTIL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$DSYMUTIL"; then ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi DSYMUTIL=$ac_cv_prog_DSYMUTIL if test -n "$DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5 printf "%s\n" "$DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DSYMUTIL"; then ac_ct_DSYMUTIL=$DSYMUTIL # Extract the first word of "dsymutil", so it can be a program name with args. set dummy dsymutil; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DSYMUTIL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_DSYMUTIL"; then ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL if test -n "$ac_ct_DSYMUTIL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5 printf "%s\n" "$ac_ct_DSYMUTIL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DSYMUTIL" = x; then DSYMUTIL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DSYMUTIL=$ac_ct_DSYMUTIL fi else DSYMUTIL="$ac_cv_prog_DSYMUTIL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. set dummy ${ac_tool_prefix}nmedit; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_NMEDIT+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$NMEDIT"; then ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi NMEDIT=$ac_cv_prog_NMEDIT if test -n "$NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5 printf "%s\n" "$NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_NMEDIT"; then ac_ct_NMEDIT=$NMEDIT # Extract the first word of "nmedit", so it can be a program name with args. set dummy nmedit; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_NMEDIT+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_NMEDIT"; then ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_NMEDIT="nmedit" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT if test -n "$ac_ct_NMEDIT"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5 printf "%s\n" "$ac_ct_NMEDIT" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_NMEDIT" = x; then NMEDIT=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac NMEDIT=$ac_ct_NMEDIT fi else NMEDIT="$ac_cv_prog_NMEDIT" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. set dummy ${ac_tool_prefix}lipo; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_LIPO+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$LIPO"; then ac_cv_prog_LIPO="$LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_LIPO="${ac_tool_prefix}lipo" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi LIPO=$ac_cv_prog_LIPO if test -n "$LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5 printf "%s\n" "$LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_LIPO"; then ac_ct_LIPO=$LIPO # Extract the first word of "lipo", so it can be a program name with args. set dummy lipo; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_LIPO+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_LIPO"; then ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_LIPO="lipo" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO if test -n "$ac_ct_LIPO"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5 printf "%s\n" "$ac_ct_LIPO" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_LIPO" = x; then LIPO=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac LIPO=$ac_ct_LIPO fi else LIPO="$ac_cv_prog_LIPO" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. set dummy ${ac_tool_prefix}otool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$OTOOL"; then ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL="${ac_tool_prefix}otool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi OTOOL=$ac_cv_prog_OTOOL if test -n "$OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 printf "%s\n" "$OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL"; then ac_ct_OTOOL=$OTOOL # Extract the first word of "otool", so it can be a program name with args. set dummy otool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_OTOOL"; then ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL="otool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL if test -n "$ac_ct_OTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5 printf "%s\n" "$ac_ct_OTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL" = x; then OTOOL=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL=$ac_ct_OTOOL fi else OTOOL="$ac_cv_prog_OTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. set dummy ${ac_tool_prefix}otool64; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OTOOL64+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$OTOOL64"; then ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi OTOOL64=$ac_cv_prog_OTOOL64 if test -n "$OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5 printf "%s\n" "$OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OTOOL64"; then ac_ct_OTOOL64=$OTOOL64 # Extract the first word of "otool64", so it can be a program name with args. set dummy otool64; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OTOOL64+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_OTOOL64"; then ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OTOOL64="otool64" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 if test -n "$ac_ct_OTOOL64"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5 printf "%s\n" "$ac_ct_OTOOL64" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OTOOL64" = x; then OTOOL64=":" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OTOOL64=$ac_ct_OTOOL64 fi else OTOOL64="$ac_cv_prog_OTOOL64" fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5 printf %s "checking for -single_module linker flag... " >&6; } if test ${lt_cv_apple_cc_single_mod+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_apple_cc_single_mod=no if test -z "$LT_MULTI_MODULE"; then # By default we will add the -single_module flag. You can override # by either setting the environment variable LT_MULTI_MODULE # non-empty at configure time, or by adding -multi_module to the # link flags. rm -rf libconftest.dylib* echo "int foo(void){return 1;}" > conftest.c echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c" >&5 $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err _lt_result=$? # If there is a non-empty error log, and "single_module" # appears in it, assume the flag caused a linker warning if test -s conftest.err && $GREP single_module conftest.err; then cat conftest.err >&5 # Otherwise, if the output was created with a 0 exit code from # the compiler, it worked. elif test -f libconftest.dylib && test 0 = "$_lt_result"; then lt_cv_apple_cc_single_mod=yes else cat conftest.err >&5 fi rm -rf libconftest.dylib* rm -f conftest.* fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5 printf "%s\n" "$lt_cv_apple_cc_single_mod" >&6; } # Feature test to disable chained fixups since it is not # compatible with '-undefined dynamic_lookup' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -no_fixup_chains linker flag" >&5 printf %s "checking for -no_fixup_chains linker flag... " >&6; } if test ${lt_cv_support_no_fixup_chains+y} then : printf %s "(cached) " >&6 else case e in #( e) save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -Wl,-no_fixup_chains" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_support_no_fixup_chains=yes else case e in #( e) lt_cv_support_no_fixup_chains=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_support_no_fixup_chains" >&5 printf "%s\n" "$lt_cv_support_no_fixup_chains" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5 printf %s "checking for -exported_symbols_list linker flag... " >&6; } if test ${lt_cv_ld_exported_symbols_list+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_ld_exported_symbols_list=no save_LDFLAGS=$LDFLAGS echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_ld_exported_symbols_list=yes else case e in #( e) lt_cv_ld_exported_symbols_list=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5 printf "%s\n" "$lt_cv_ld_exported_symbols_list" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5 printf %s "checking for -force_load linker flag... " >&6; } if test ${lt_cv_ld_force_load+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_ld_force_load=no cat > conftest.c << _LT_EOF int forced_loaded() { return 2;} _LT_EOF echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 echo "$AR $AR_FLAGS libconftest.a conftest.o" >&5 $AR $AR_FLAGS libconftest.a conftest.o 2>&5 echo "$RANLIB libconftest.a" >&5 $RANLIB libconftest.a 2>&5 cat > conftest.c << _LT_EOF int main(void) { return 0;} _LT_EOF echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err _lt_result=$? if test -s conftest.err && $GREP force_load conftest.err; then cat conftest.err >&5 elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then lt_cv_ld_force_load=yes else cat conftest.err >&5 fi rm -f conftest.err libconftest.a conftest conftest.c rm -rf conftest.dSYM ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5 printf "%s\n" "$lt_cv_ld_force_load" >&6; } case $host_os in rhapsody* | darwin1.[012]) _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; darwin1.*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; darwin*) case $MACOSX_DEPLOYMENT_TARGET,$host in 10.[012],*|,*powerpc*-darwin[5-8]*) _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; *) _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' if test yes = "$lt_cv_support_no_fixup_chains"; then as_fn_append _lt_dar_allow_undefined ' $wl-no_fixup_chains' fi ;; esac ;; esac if test yes = "$lt_cv_apple_cc_single_mod"; then _lt_dar_single_mod='$single_module' fi _lt_dar_needs_single_mod=no case $host_os in rhapsody* | darwin1.*) _lt_dar_needs_single_mod=yes ;; darwin*) # When targeting Mac OS X 10.4 (darwin 8) or later, # -single_module is the default and -multi_module is unsupported. # The toolchain on macOS 10.14 (darwin 18) and later cannot # target any OS version that needs -single_module. case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in 10.0,*-darwin[567].*|10.[0-3],*-darwin[5-9].*|10.[0-3],*-darwin1[0-7].*) _lt_dar_needs_single_mod=yes ;; esac ;; esac if test yes = "$lt_cv_ld_exported_symbols_list"; then _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' else _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' fi if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then _lt_dsymutil='~$DSYMUTIL $lib || :' else _lt_dsymutil= fi ;; esac # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } ac_header= ac_cache= for ac_item in $ac_header_c_list do if test $ac_cache; then ac_fn_c_check_header_compile "$LINENO" $ac_header ac_cv_header_$ac_cache "$ac_includes_default" if eval test \"x\$ac_cv_header_$ac_cache\" = xyes; then printf "%s\n" "#define $ac_item 1" >> confdefs.h fi ac_header= ac_cache= elif test $ac_header; then ac_cache=$ac_item else ac_header=$ac_item fi done if test $ac_cv_header_stdlib_h = yes && test $ac_cv_header_string_h = yes then : printf "%s\n" "#define STDC_HEADERS 1" >>confdefs.h fi ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default " if test "x$ac_cv_header_dlfcn_h" = xyes then : printf "%s\n" "#define HAVE_DLFCN_H 1" >>confdefs.h fi func_stripname_cnf () { case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;; esac } # func_stripname_cnf if test -n "$ac_tool_prefix"; then for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AR"; then ac_cv_prog_AR="$AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AR="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AR=$ac_cv_prog_AR if test -n "$AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 printf "%s\n" "$AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$AR" && break done fi if test -z "$AR"; then ac_ct_AR=$AR for ac_prog in ar lib "link -lib" do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_AR"; then ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AR="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_AR=$ac_cv_prog_ac_ct_AR if test -n "$ac_ct_AR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 printf "%s\n" "$ac_ct_AR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_AR" && break done if test "x$ac_ct_AR" = x; then AR="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi fi : ${AR=ar} : ${ARFLAGS=cr} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface" >&5 printf %s "checking the archiver ($AR) interface... " >&6; } if test ${am_cv_ar_interface+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am_cv_ar_interface=ar cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int some_variable = 0; _ACEOF if ac_fn_c_try_compile "$LINENO" then : am_ar_try='$AR $ARFLAGS libconftest.a conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=ar else am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$am_ar_try\""; } >&5 (eval $am_ar_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if test "$ac_status" -eq 0; then am_cv_ar_interface=lib else am_cv_ar_interface=unknown fi fi rm -f conftest.lib libconftest.a fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface" >&5 printf "%s\n" "$am_cv_ar_interface" >&6; } case $am_cv_ar_interface in ar) ;; lib) # Microsoft lib, so override with the ar-lib wrapper script. # FIXME: It is wrong to rewrite AR. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__AR in this case, # and then we could set am__AR="$am_aux_dir/ar-lib \$(AR)" or something # similar. AR="$am_aux_dir/ar-lib $AR" ;; unknown) as_fn_error $? "could not determine $AR interface" "$LINENO" 5 ;; esac # Set options # Check whether --enable-static was given. if test ${enable_static+y} then : enableval=$enable_static; p=${PACKAGE-default} case $enableval in yes) enable_static=yes ;; no) enable_static=no ;; *) enable_static=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_static=yes fi done IFS=$lt_save_ifs ;; esac else case e in #( e) enable_static=no ;; esac fi # Check whether --enable-pic was given. if test ${enable_pic+y} then : enableval=$enable_pic; lt_p=${PACKAGE-default} case $enableval in yes|no) pic_mode=$enableval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $enableval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else case e in #( e) # Check whether --with-pic was given. if test ${with_pic+y} then : withval=$with_pic; lt_p=${PACKAGE-default} case $withval in yes|no) pic_mode=$withval ;; *) pic_mode=default # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for lt_pkg in $withval; do IFS=$lt_save_ifs if test "X$lt_pkg" = "X$lt_p"; then pic_mode=yes fi done IFS=$lt_save_ifs ;; esac else case e in #( e) pic_mode=yes ;; esac fi ;; esac fi enable_win32_dll=yes case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-cegcc*) if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. set dummy ${ac_tool_prefix}as; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_AS+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$AS"; then ac_cv_prog_AS="$AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_AS="${ac_tool_prefix}as" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi AS=$ac_cv_prog_AS if test -n "$AS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AS" >&5 printf "%s\n" "$AS" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_AS"; then ac_ct_AS=$AS # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_AS+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_AS"; then ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_AS="as" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_AS=$ac_cv_prog_ac_ct_AS if test -n "$ac_ct_AS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5 printf "%s\n" "$ac_ct_AS" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_AS" = x; then AS="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac AS=$ac_ct_AS fi else AS="$ac_cv_prog_AS" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. set dummy ${ac_tool_prefix}dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_DLLTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$DLLTOOL"; then ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi DLLTOOL=$ac_cv_prog_DLLTOOL if test -n "$DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5 printf "%s\n" "$DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_DLLTOOL"; then ac_ct_DLLTOOL=$DLLTOOL # Extract the first word of "dlltool", so it can be a program name with args. set dummy dlltool; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_DLLTOOL+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_DLLTOOL"; then ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_DLLTOOL="dlltool" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL if test -n "$ac_ct_DLLTOOL"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5 printf "%s\n" "$ac_ct_DLLTOOL" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_DLLTOOL" = x; then DLLTOOL="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac DLLTOOL=$ac_ct_DLLTOOL fi else DLLTOOL="$ac_cv_prog_DLLTOOL" fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. set dummy ${ac_tool_prefix}objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_OBJDUMP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$OBJDUMP"; then ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi OBJDUMP=$ac_cv_prog_OBJDUMP if test -n "$OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 printf "%s\n" "$OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi if test -z "$ac_cv_prog_OBJDUMP"; then ac_ct_OBJDUMP=$OBJDUMP # Extract the first word of "objdump", so it can be a program name with args. set dummy objdump; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_OBJDUMP+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_OBJDUMP"; then ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_OBJDUMP="objdump" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP if test -n "$ac_ct_OBJDUMP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 printf "%s\n" "$ac_ct_OBJDUMP" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$ac_ct_OBJDUMP" = x; then OBJDUMP="false" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac OBJDUMP=$ac_ct_OBJDUMP fi else OBJDUMP="$ac_cv_prog_OBJDUMP" fi ;; esac test -z "$AS" && AS=as test -z "$DLLTOOL" && DLLTOOL=dlltool test -z "$OBJDUMP" && OBJDUMP=objdump enable_dlopen=no # Check whether --enable-shared was given. if test ${enable_shared+y} then : enableval=$enable_shared; p=${PACKAGE-default} case $enableval in yes) enable_shared=yes ;; no) enable_shared=no ;; *) enable_shared=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_shared=yes fi done IFS=$lt_save_ifs ;; esac else case e in #( e) enable_shared=yes ;; esac fi # Check whether --enable-fast-install was given. if test ${enable_fast_install+y} then : enableval=$enable_fast_install; p=${PACKAGE-default} case $enableval in yes) enable_fast_install=yes ;; no) enable_fast_install=no ;; *) enable_fast_install=no # Look at the argument we got. We use all the common list separators. lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, for pkg in $enableval; do IFS=$lt_save_ifs if test "X$pkg" = "X$p"; then enable_fast_install=yes fi done IFS=$lt_save_ifs ;; esac else case e in #( e) enable_fast_install=yes ;; esac fi shared_archive_member_spec= case $host,$enable_shared in power*-*-aix[5-9]*,yes) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5 printf %s "checking which variant of shared library versioning to provide... " >&6; } # Check whether --enable-aix-soname was given. if test ${enable_aix_soname+y} then : enableval=$enable_aix_soname; case $enableval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --enable-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$enable_aix_soname else case e in #( e) # Check whether --with-aix-soname was given. if test ${with_aix_soname+y} then : withval=$with_aix_soname; case $withval in aix|svr4|both) ;; *) as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5 ;; esac lt_cv_with_aix_soname=$with_aix_soname else case e in #( e) if test ${lt_cv_with_aix_soname+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_with_aix_soname=aix ;; esac fi ;; esac fi enable_aix_soname=$lt_cv_with_aix_soname ;; esac fi with_aix_soname=$enable_aix_soname { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5 printf "%s\n" "$with_aix_soname" >&6; } if test aix != "$with_aix_soname"; then # For the AIX way of multilib, we name the shared archive member # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, # the AIX toolchain works better with OBJECT_MODE set (default 32). if test 64 = "${OBJECT_MODE-32}"; then shared_archive_member_spec=shr_64 else shared_archive_member_spec=shr fi fi ;; *) with_aix_soname=aix ;; esac # This can be used to rebuild libtool when needed LIBTOOL_DEPS=$ltmain # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' test -z "$LN_S" && LN_S="ln -s" if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5 printf %s "checking for objdir... " >&6; } if test ${lt_cv_objdir+y} then : printf %s "(cached) " >&6 else case e in #( e) rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null if test -d .libs; then lt_cv_objdir=.libs else # MS-DOS does not allow filenames that begin with a dot. lt_cv_objdir=_libs fi rmdir .libs 2>/dev/null ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5 printf "%s\n" "$lt_cv_objdir" >&6; } objdir=$lt_cv_objdir printf "%s\n" "#define LT_OBJDIR \"$lt_cv_objdir/\"" >>confdefs.h case $host_os in aix3*) # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi ;; esac # Global variables: ofile=libtool can_build_shared=yes # All known linkers require a '.a' archive for static linking (except MSVC and # ICC, which need '.lib'). libext=a with_gnu_ld=$lt_cv_prog_gnu_ld old_CC=$CC old_CFLAGS=$CFLAGS # Set sane defaults for various variables test -z "$CC" && CC=cc test -z "$LTCC" && LTCC=$CC test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS test -z "$LD" && LD=ld test -z "$ac_objext" && ac_objext=o func_cc_basename $compiler cc_basename=$func_cc_basename_result # Only perform the check for file, if the check method requires it test -z "$MAGIC_CMD" && MAGIC_CMD=file case $deplibs_check_method in file_magic*) if test "$file_magic_cmd" = '$MAGIC_CMD'; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5 printf %s "checking for ${ac_tool_prefix}file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else case e in #( e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/${ac_tool_prefix}file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for file" >&5 printf %s "checking for file... " >&6; } if test ${lt_cv_path_MAGIC_CMD+y} then : printf %s "(cached) " >&6 else case e in #( e) case $MAGIC_CMD in [\\/*] | ?:[\\/]*) lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. ;; *) lt_save_MAGIC_CMD=$MAGIC_CMD lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" for ac_dir in $ac_dummy; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/file"; then lt_cv_path_MAGIC_CMD=$ac_dir/"file" if test -n "$file_magic_test_file"; then case $deplibs_check_method in "file_magic "*) file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` MAGIC_CMD=$lt_cv_path_MAGIC_CMD if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | $EGREP "$file_magic_regex" > /dev/null; then : else cat <<_LT_EOF 1>&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. *** The result is that libtool may fail to recognize shared libraries *** as such. This will affect the creation of libtool libraries that *** depend on shared libraries, but programs linked with such libtool *** libraries will work regardless of this problem. Nevertheless, you *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org _LT_EOF fi ;; esac fi break fi done IFS=$lt_save_ifs MAGIC_CMD=$lt_save_MAGIC_CMD ;; esac ;; esac fi MAGIC_CMD=$lt_cv_path_MAGIC_CMD if test -n "$MAGIC_CMD"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5 printf "%s\n" "$MAGIC_CMD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi else MAGIC_CMD=: fi fi fi ;; esac # Use C for the default configuration in the libtool script lt_save_CC=$CC ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Source file extension for C test sources. ac_ext=c # Object file extension for compiled C test sources. objext=o objext=$objext # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(void){return(0);}' # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # Save the default compiler, since it gets overwritten when the other # tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test yes = "$GCC"; then case $cc_basename in nvcc*) lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; *) lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 printf %s "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test ${lt_cv_prog_compiler_rtti_exceptions+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_rtti_exceptions=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 printf "%s\n" "$lt_cv_prog_compiler_rtti_exceptions" >&6; } if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" else : fi fi lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; *flang* | ftn | f18* | f95*) # Flang compiler. lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *-mlibc) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; serenity*) ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= always_export_symbols=no archive_cmds= archive_expsym_cmds= compiler_needs_object=no enable_shared_with_static_runtimes=no export_dynamic_flag_spec= export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic=no hardcode_direct=no hardcode_direct_absolute=no hardcode_libdir_flag_spec= hardcode_libdir_separator= hardcode_minus_L=no hardcode_shlibpath_var=unsupported inherit_rpath=no link_all_deplibs=unknown module_cmds= module_expsym_cmds= old_archive_from_new_cmds= old_archive_from_expsyms_cmds= thread_safe_flag_spec= whole_archive_flag_spec= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; esac ld_shlibs=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs=no fi ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' export_dynamic_flag_spec='$wl--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' file_list_spec='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs=no fi ;; haiku*) archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs=no ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes file_list_spec='@' ;; interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' export_dynamic_flag_spec='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs=no fi ;; *-mlibc) archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac ;; sunos4*) archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct=yes hardcode_shlibpath_var=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi ;; esac if test no = "$ld_shlibs"; then runpath_var= hardcode_libdir_flag_spec= export_dynamic_flag_spec= whole_archive_flag_spec= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag=unsupported always_export_symbols=yes archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds='' hardcode_direct=yes hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes file_list_spec='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct=no hardcode_direct_absolute=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L=yes hardcode_libdir_flag_spec='-L$libdir' hardcode_libdir_separator= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath_+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath_"; then lt_cv_aix_libpath_=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath_ fi hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' $wl-bernotok' allow_undefined_flag=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec='$convenience' fi archive_cmds_need_lc=yes archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds="$archive_expsym_cmds"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds='' ;; m68k) archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++/Fortran Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl* | ifort* | icx* | ifx*) # Native MSVC or classic or new Intel Compilers hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported always_export_symbols=yes file_list_spec='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -Fe$output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, )='true' enable_shared_with_static_runtimes=yes exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds='chmod 644 $oldlib' postlink_cmds='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC and Intel compilers wrapper hardcode_libdir_flag_spec=' ' allow_undefined_flag=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds='true' # FIXME: Should let the user specify the lib program. old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc=no hardcode_direct=no hardcode_automatic=yes hardcode_shlibpath_var=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec='' fi link_all_deplibs=yes allow_undefined_flag=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs=no fi ;; dgux*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes export_dynamic_flag_spec='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) # Older versions of the 11.00 compiler do not understand -b yet # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5 printf %s "checking if $CC understands -b... " >&6; } if test ${lt_cv_prog_compiler__b+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler__b=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -b" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler__b=yes fi else lt_cv_prog_compiler__b=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5 printf "%s\n" "$lt_cv_prog_compiler__b" >&6; } if test yes = "$lt_cv_prog_compiler__b"; then archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec='$wl+b $wl$libdir' hardcode_libdir_separator=: case $host_cpu in hppa*64*|ia64*) hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes hardcode_direct_absolute=yes export_dynamic_flag_spec='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 else case e in #( e) save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int foo (void) { return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes else case e in #( e) lt_cv_irix_exported_symbol=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: inherit_rpath=yes link_all_deplibs=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs=yes archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' ;; esac ;; *-mlibc) ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no ;; newsos6) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: hardcode_shlibpath_var=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no hardcode_direct_absolute=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='$wl-rpath,$libdir' export_dynamic_flag_spec='$wl-E' else archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='$wl-rpath,$libdir' fi else ld_shlibs=no fi ;; os2*) hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported shrext_cmds=.dll archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_from_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes=yes file_list_spec='@' ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc='no' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' hardcode_libdir_separator=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag=' $wl-expect_unresolved $wl\*' archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' else allow_undefined_flag=' -expect_unresolved \*' archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; serenity*) ;; solaris*) no_undefined_flag=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec='-L$libdir' hardcode_direct=yes hardcode_minus_L=yes hardcode_shlibpath_var=no ;; sysv4) case $host_vendor in sni) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds='$CC -r -o $output$reload_objs' hardcode_direct=no ;; motorola) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var=no ;; sysv4.3*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no export_dynamic_flag_spec='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag='$wl-z,text' archive_cmds_need_lc=no hardcode_shlibpath_var=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag='$wl-z,text' allow_undefined_flag='$wl-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no hardcode_libdir_flag_spec='$wl-R,$libdir' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec='-L$libdir' hardcode_shlibpath_var=no ;; *) ld_shlibs=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec='$wl-Blargedynsym' ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5 printf "%s\n" "$ld_shlibs" >&6; } test no = "$ld_shlibs" && can_build_shared=no with_gnu_ld=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc" in x|xyes) # Assume -lc should be added archive_cmds_need_lc=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc+y} then : printf %s "(cached) " >&6 else case e in #( e) $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl pic_flag=$lt_prog_compiler_pic compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag allow_undefined_flag= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc=no else lt_cv_archive_cmds_need_lc=yes fi allow_undefined_flag=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc" >&6; } archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } if test yes = "$GCC"; then case $host_os in darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; *) lt_awk_arg='/^libraries:/' ;; esac case $host_os in mingw* | windows* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;; *) lt_sed_strip_eq='s|=/|/|g' ;; esac lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` case $lt_search_path_spec in *\;*) # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` ;; *) lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` ;; esac # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary... lt_tmp_lt_search_path_spec= lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` # ...but if some path component already ends with the multilib dir we assume # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). case "$lt_multi_os_dir; $lt_search_path_spec " in "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) lt_multi_os_dir= ;; esac for lt_sys_path in $lt_search_path_spec; do if test -d "$lt_sys_path$lt_multi_os_dir"; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" elif test -n "$lt_multi_os_dir"; then test -d "$lt_sys_path" && \ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' BEGIN {RS = " "; FS = "/|\n";} { lt_foo = ""; lt_count = 0; for (lt_i = NF; lt_i > 0; lt_i--) { if ($lt_i != "" && $lt_i != ".") { if ($lt_i == "..") { lt_count++; } else { if (lt_count == 0) { lt_foo = "/" $lt_i lt_foo; } else { lt_count--; } } } } if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` # AWK program above erroneously prepends '/' to C:/dos/paths # for these hosts. case $host_os in mingw* | windows* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ $SED 's|/\([A-Za-z]:\)|\1|g'` ;; esac sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | windows* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds # If user builds GCC with multilib enabled, # it should just install on $(libdir) # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. if test xyes = x"$multilib"; then postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ $install_prog $dir/$dlname $destdir/$dlname~ chmod a+x $destdir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib $destdir/$dlname'\'' || exit \$?; fi' else postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' fi postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" ;; mingw* | windows* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl* | *,ifort* | *,icx* | *,ifx*) # Native MSVC or classic or new Intel Compilers libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw* | windows*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac case $host_cpu in powerpc64) # On FreeBSD bi-arch platforms, a different variable is used for 32-bit # binaries. See . cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int test_pointer_size[sizeof (void *) - 5]; _ACEOF if ac_fn_c_try_compile "$LINENO" then : shlibpath_var=LD_LIBRARY_PATH else case e in #( e) shlibpath_var=LD_32_LIBRARY_PATH ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; *) shlibpath_var=LD_LIBRARY_PATH ;; esac case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib' sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib' hardcode_into_libs=no ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # -rpath works at least for libraries that are not overridden by # libraries installed in system locations. hardcode_libdir_flag_spec='$wl-rpath $wl$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir ;; esac fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directories which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *-mlibc) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='mlibc ld.so' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; serenity*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no dynamic_linker='SerenityOS LibELF' ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; emscripten*) version_type=none need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= dynamic_linker="Emscripten linker" lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= if test yes = "$GCC"; then lt_prog_compiler_wl='-Wl,' lt_prog_compiler_static='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' fi lt_prog_compiler_pic='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; *) lt_prog_compiler_pic='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl='-Xlinker ' if test -n "$lt_prog_compiler_pic"; then lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static='-Bstatic' else lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; esac ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; *flang* | ftn | f18* | f95*) # Flang compiler. lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='--shared' lt_prog_compiler_static='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl='-Wl,-Wl,,' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; ccc*) lt_prog_compiler_wl='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-qpic' lt_prog_compiler_static='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *Portland\ Group*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fpic' lt_prog_compiler_static='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; *-mlibc) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-fPIC' lt_prog_compiler_static='-static' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static='-non_shared' ;; rdos*) lt_prog_compiler_static='-non_shared' ;; serenity*) ;; solaris*) lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl='-Qoption ld ' lt_prog_compiler_pic='-PIC' lt_prog_compiler_static='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic='-Kconform_pic' lt_prog_compiler_static='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' ;; unicos*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_can_build_shared=no ;; uts4*) lt_prog_compiler_pic='-pic' lt_prog_compiler_static='-Bstatic' ;; *) lt_prog_compiler_can_build_shared=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic= ;; *) lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic=$lt_prog_compiler_pic ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic" >&6; } lt_prog_compiler_pic=$lt_cv_prog_compiler_pic # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test ${lt_cv_prog_compiler_pic_works+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_works=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works"; then case $lt_prog_compiler_pic in "" | " "*) ;; *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; esac else lt_prog_compiler_pic= lt_prog_compiler_can_build_shared=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_static_works=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes fi else lt_cv_prog_compiler_static_works=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works" >&6; } if test yes = "$lt_cv_prog_compiler_static_works"; then : else lt_prog_compiler_static= fi ='-fPIC' archive_cmds='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib' archive_expsym_cmds='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym' archive_cmds_need_lc=no no_undefined_flag= ;; *) dynamic_linker=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action= if test -n "$hardcode_libdir_flag_spec" || test -n "$runpath_var" || test yes = "$hardcode_automatic"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" && test no != "$hardcode_minus_L"; then # Linking always hardcodes the temporary library directory. hardcode_action=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5 printf "%s\n" "$hardcode_action" >&6; } if test relink = "$hardcode_action" || test yes = "$inherit_rpath"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi if test yes != "$enable_dlopen"; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown else lt_cv_dlopen=no lt_cv_dlopen_libs= case $host_os in beos*) lt_cv_dlopen=load_add_on lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; mingw* | windows* | pw32* | cegcc*) lt_cv_dlopen=LoadLibrary lt_cv_dlopen_libs= ;; cygwin*) lt_cv_dlopen=dlopen lt_cv_dlopen_libs= ;; darwin*) # if libdl is installed we need to link against it { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char dlopen (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else case e in #( e) ac_cv_lib_dl_dlopen=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else case e in #( e) lt_cv_dlopen=dyld lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ;; esac fi ;; tpf*) # Don't try to run any link tests for TPF. We know it's impossible # because TPF is a cross-compiler, and we know how we open DSOs. lt_cv_dlopen=dlopen lt_cv_dlopen_libs= lt_cv_dlopen_self=no ;; *) ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load" if test "x$ac_cv_func_shl_load" = xyes then : lt_cv_dlopen=shl_load else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5 printf %s "checking for shl_load in -ldld... " >&6; } if test ${ac_cv_lib_dld_shl_load+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char shl_load (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return shl_load (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_shl_load=yes else case e in #( e) ac_cv_lib_dld_shl_load=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5 printf "%s\n" "$ac_cv_lib_dld_shl_load" >&6; } if test "x$ac_cv_lib_dld_shl_load" = xyes then : lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld else case e in #( e) ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" if test "x$ac_cv_func_dlopen" = xyes then : lt_cv_dlopen=dlopen else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char dlopen (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else case e in #( e) ac_cv_lib_dl_dlopen=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5 printf %s "checking for dlopen in -lsvld... " >&6; } if test ${ac_cv_lib_svld_dlopen+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-lsvld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char dlopen (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_svld_dlopen=yes else case e in #( e) ac_cv_lib_svld_dlopen=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5 printf "%s\n" "$ac_cv_lib_svld_dlopen" >&6; } if test "x$ac_cv_lib_svld_dlopen" = xyes then : lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5 printf %s "checking for dld_link in -ldld... " >&6; } if test ${ac_cv_lib_dld_dld_link+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldld $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char dld_link (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return dld_link (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dld_dld_link=yes else case e in #( e) ac_cv_lib_dld_dld_link=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5 printf "%s\n" "$ac_cv_lib_dld_dld_link" >&6; } if test "x$ac_cv_lib_dld_dld_link" = xyes then : lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld fi ;; esac fi ;; esac fi ;; esac fi ;; esac fi ;; esac fi ;; esac if test no = "$lt_cv_dlopen"; then enable_dlopen=no else enable_dlopen=yes fi case $lt_cv_dlopen in dlopen) save_CPPFLAGS=$CPPFLAGS test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" save_LDFLAGS=$LDFLAGS wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" save_LIBS=$LIBS LIBS="$lt_cv_dlopen_libs $LIBS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5 printf %s "checking whether a program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self+y} then : printf %s "(cached) " >&6 else case e in #( e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord (void) __attribute__((visibility("default"))); #endif int fnord (void) { return 42; } int main (void) { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; esac else : # compilation failed lt_cv_dlopen_self=no fi fi rm -fr conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5 printf "%s\n" "$lt_cv_dlopen_self" >&6; } if test yes = "$lt_cv_dlopen_self"; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5 printf %s "checking whether a statically linked program can dlopen itself... " >&6; } if test ${lt_cv_dlopen_self_static+y} then : printf %s "(cached) " >&6 else case e in #( e) if test yes = "$cross_compiling"; then : lt_cv_dlopen_self_static=cross else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF #line $LINENO "configure" #include "confdefs.h" #if HAVE_DLFCN_H #include #endif #include #ifdef RTLD_GLOBAL # define LT_DLGLOBAL RTLD_GLOBAL #else # ifdef DL_GLOBAL # define LT_DLGLOBAL DL_GLOBAL # else # define LT_DLGLOBAL 0 # endif #endif /* We may have to define LT_DLLAZY_OR_NOW in the command line if we find out it does not work in some platform. */ #ifndef LT_DLLAZY_OR_NOW # ifdef RTLD_LAZY # define LT_DLLAZY_OR_NOW RTLD_LAZY # else # ifdef DL_LAZY # define LT_DLLAZY_OR_NOW DL_LAZY # else # ifdef RTLD_NOW # define LT_DLLAZY_OR_NOW RTLD_NOW # else # ifdef DL_NOW # define LT_DLLAZY_OR_NOW DL_NOW # else # define LT_DLLAZY_OR_NOW 0 # endif # endif # endif # endif #endif /* When -fvisibility=hidden is used, assume the code has been annotated correspondingly for the symbols needed. */ #if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) int fnord (void) __attribute__((visibility("default"))); #endif int fnord (void) { return 42; } int main (void) { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); int status = $lt_dlunknown; if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; else { if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; else puts (dlerror ()); } /* dlclose (self); */ } else puts (dlerror ()); return status; } _LT_EOF if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5 (eval $ac_link) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then (./conftest; exit; ) >&5 2>/dev/null lt_status=$? case x$lt_status in x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; esac else : # compilation failed lt_cv_dlopen_self_static=no fi fi rm -fr conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5 printf "%s\n" "$lt_cv_dlopen_self_static" >&6; } fi CPPFLAGS=$save_CPPFLAGS LDFLAGS=$save_LDFLAGS LIBS=$save_LIBS ;; esac case $lt_cv_dlopen_self in yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; *) enable_dlopen_self=unknown ;; esac case $lt_cv_dlopen_self_static in yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; *) enable_dlopen_self_static=unknown ;; esac fi striplib= old_striplib= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5 printf %s "checking whether stripping libraries is possible... " >&6; } if test -z "$STRIP"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } else if $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else case $host_os in darwin*) # FIXME - insert some real tests, host_os isn't really good enough striplib="$STRIP -x" old_striplib="$STRIP -S" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } ;; freebsd*) if $STRIP -V 2>&1 | $GREP "elftoolchain" >/dev/null; then old_striplib="$STRIP --strip-debug" striplib="$STRIP --strip-unneeded" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi fi # Report what library types will actually be built { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 printf %s "checking if libtool supports shared libraries... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 printf "%s\n" "$can_build_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 printf "%s\n" "$enable_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 printf "%s\n" "$enable_static" >&6; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu CC=$lt_save_CC if test -n "$CXX" && ( test no != "$CXX" && ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || (test g++ != "$CXX"))); then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5 printf %s "checking how to run the C++ preprocessor... " >&6; } if test -z "$CXXCPP"; then if test ${ac_cv_prog_CXXCPP+y} then : printf %s "(cached) " >&6 else case e in #( e) # Double quotes because $CXX needs to be expanded for CXXCPP in "$CXX -E" cpp /lib/cpp do ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : break fi done ac_cv_prog_CXXCPP=$CXXCPP ;; esac fi CXXCPP=$ac_cv_prog_CXXCPP else ac_cv_prog_CXXCPP=$CXXCPP fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5 printf "%s\n" "$CXXCPP" >&6; } ac_preproc_ok=false for ac_cxx_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Syntax error _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : else case e in #( e) # Broken: fails on valid input. continue ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_cxx_try_cpp "$LINENO" then : # Broken: success on invalid input. continue else case e in #( e) # Passes both tests. ac_preproc_ok=: break ;; esac fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of 'break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok then : else case e in #( e) { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check See 'config.log' for more details" "$LINENO" 5; } ;; esac fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else _lt_caught_CXX_error=yes fi ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu archive_cmds_need_lc_CXX=no allow_undefined_flag_CXX= always_export_symbols_CXX=no archive_expsym_cmds_CXX= compiler_needs_object_CXX=no export_dynamic_flag_spec_CXX= hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no hardcode_libdir_flag_spec_CXX= hardcode_libdir_separator_CXX= hardcode_minus_L_CXX=no hardcode_shlibpath_var_CXX=unsupported hardcode_automatic_CXX=no inherit_rpath_CXX=no module_cmds_CXX= module_expsym_cmds_CXX= link_all_deplibs_CXX=unknown old_archive_cmds_CXX=$old_archive_cmds reload_flag_CXX=$reload_flag reload_cmds_CXX=$reload_cmds no_undefined_flag_CXX= whole_archive_flag_spec_CXX= enable_shared_with_static_runtimes_CXX=no # Source file extension for C++ test sources. ac_ext=cpp # Object file extension for compiled C++ test sources. objext=o objext_CXX=$objext # No sense in running all these tests if we already determined that # the CXX compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_caught_CXX_error"; then # Code to be used in simple compile tests lt_simple_compile_test_code="int some_variable = 0;" # Code to be used in simple link tests lt_simple_link_test_code='int main(int, char *[]) { return(0); }' # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_CFLAGS=$CFLAGS lt_save_LD=$LD lt_save_GCC=$GCC GCC=$GXX lt_save_with_gnu_ld=$with_gnu_ld lt_save_path_LD=$lt_cv_path_LD if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx else $as_unset lt_cv_prog_gnu_ld fi if test -n "${lt_cv_path_LDCXX+set}"; then lt_cv_path_LD=$lt_cv_path_LDCXX else $as_unset lt_cv_path_LD fi test -z "${LDCXX+set}" || LD=$LDCXX CC=${CXX-"c++"} CFLAGS=$CXXFLAGS compiler=$CC compiler_CXX=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result if test -n "$compiler"; then # We don't want -fno-exception when compiling C++ code, so set the # no_builtin_flag separately if test yes = "$GXX"; then lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' else lt_prog_compiler_no_builtin_flag_CXX= fi if test yes = "$GXX"; then # Set up default GNU C++ configuration # Check whether --with-gnu-ld was given. if test ${with_gnu_ld+y} then : withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes else case e in #( e) with_gnu_ld=no ;; esac fi ac_prog=ld if test yes = "$GCC"; then # Check if gcc -print-prog-name=ld gives a path. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5 printf %s "checking for ld used by $CC... " >&6; } case $host in *-*-mingw* | *-*-windows*) # gcc leaves a trailing carriage return, which upsets mingw ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; *) ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; esac case $ac_prog in # Accept absolute paths. [\\/]* | ?:[\\/]*) re_direlt='/[^/][^/]*/\.\./' # Canonicalize the pathname of ld ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD=$ac_prog ;; "") # If it fails, then pretend we aren't using GCC. ac_prog=ld ;; *) # If it is relative, then search for the first ld in PATH. with_gnu_ld=unknown ;; esac elif test yes = "$with_gnu_ld"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5 printf %s "checking for GNU ld... " >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5 printf %s "checking for non-GNU ld... " >&6; } fi if test ${lt_cv_path_LD+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -z "$LD"; then lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR for ac_dir in $PATH; do IFS=$lt_save_ifs test -z "$ac_dir" && ac_dir=. if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then lt_cv_path_LD=$ac_dir/$ac_prog # Check to see if the program is GNU ld. I'd rather use --version, # but apparently some variants of GNU ld only accept -v. # Break only if it was the GNU/non-GNU ld that we prefer. case `"$lt_cv_path_LD" -v 2>&1 &5 printf "%s\n" "$LD" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5 printf %s "checking if the linker ($LD) is GNU ld... " >&6; } if test ${lt_cv_prog_gnu_ld+y} then : printf %s "(cached) " >&6 else case e in #( e) # I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &5 printf "%s\n" "$lt_cv_prog_gnu_ld" >&6; } with_gnu_ld=$lt_cv_prog_gnu_ld # Check if GNU C++ uses GNU ld as the underlying linker, since the # archiving commands below assume that GNU ld is being used. if test yes = "$with_gnu_ld"; then archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # If archive_cmds runs LD, not CC, wlarc should be empty # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to # investigate it a little bit more. (MM) wlarc='$wl' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_CXX= fi else with_gnu_ld=no wlarc= # A generic and very simple default shared library creation # command for GNU C++ for the case where it uses the native # linker, instead of GNU ld. If possible, this setting should # overridden to take advantage of the native linker features on # the platform it is being used on. archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' fi # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"' else GXX=no with_gnu_ld=no wlarc= fi # PORTME: fill in a description of your system's C++ link characteristics { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } ld_shlibs_CXX=yes case $host_os in aix3*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do case $ld_flag in *-brtl*) aix_use_runtimelinking=yes break ;; esac done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_CXX='' hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes file_list_spec_CXX='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_CXX=no hardcode_direct_absolute_CXX=no ;; esac if test yes = "$GXX"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_CXX=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_CXX=yes hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_libdir_separator_CXX= fi esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag=$shared_flag' $wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_CXX='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to # export. always_export_symbols_CXX=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. # The "-G" linker flag allows undefined symbols. no_undefined_flag_CXX='-bernotok' # Determine the default libpath from the value encoded in an empty # executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath__CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_CXX="-z nodefs" archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath__CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__CXX"; then lt_cv_aix_libpath__CXX=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath__CXX fi hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_CXX=' $wl-bernotok' allow_undefined_flag_CXX=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_CXX='$convenience' fi archive_cmds_need_lc_CXX=yes archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d' fi fi ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_CXX=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_CXX=no fi ;; chorus*) case $cc_basename in *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; cygwin* | mingw* | windows* | pw32* | cegcc*) case $GXX,$cc_basename in ,cl* | no,cl* | ,icl* | no,icl* | ,ifort* | no,ifort* | ,icx* | no,icx* | ,ifx* | no,ifx*) # Native MSVC or classic or new Intel compilers # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. hardcode_libdir_flag_spec_CXX=' ' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=yes file_list_spec_CXX='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true' enable_shared_with_static_runtimes_CXX=yes # Don't use ranlib old_postinstall_cmds_CXX='chmod 644 $oldlib' postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ func_to_tool_file "$lt_outputfile"~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # g++ # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_CXX='-L$libdir' export_dynamic_flag_spec_CXX='$wl--export-all-symbols' allow_undefined_flag_CXX=unsupported always_export_symbols_CXX=no enable_shared_with_static_runtimes_CXX=yes file_list_spec_CXX='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_CXX='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_CXX=no fi ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_CXX=no hardcode_direct_CXX=no hardcode_automatic_CXX=yes hardcode_shlibpath_var_CXX=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' else whole_archive_flag_spec_CXX='' fi link_all_deplibs_CXX=yes allow_undefined_flag_CXX=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_CXX="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" if test yes = "$_lt_dar_needs_single_mod" -a yes != "$lt_cv_apple_cc_single_mod"; then archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" archive_expsym_cmds_CXX="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" fi else ld_shlibs_CXX=no fi ;; os2*) hardcode_libdir_flag_spec_CXX='-L$libdir' hardcode_minus_L_CXX=yes allow_undefined_flag_CXX=unsupported shrext_cmds=.dll archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_from_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_CXX=yes file_list_spec_CXX='@' ;; dgux*) case $cc_basename in ec++*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; ghcx*) # Green Hills C++ Compiler # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; freebsd2.*) # C++ shared libraries reported to be fairly broken before # switch to ELF ld_shlibs_CXX=no ;; freebsd-elf*) archive_cmds_need_lc_CXX=no ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF # conventions ld_shlibs_CXX=yes ;; haiku*) archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_CXX=no ;; hpux9*) hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: export_dynamic_flag_spec_CXX='$wl-E' hardcode_direct_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "[-]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; hpux10*|hpux11*) if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir' hardcode_libdir_separator_CXX=: case $host_cpu in hppa*64*|ia64*) ;; *) export_dynamic_flag_spec_CXX='$wl-E' ;; esac fi case $host_cpu in hppa*64*|ia64*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no ;; *) hardcode_direct_CXX=yes hardcode_direct_absolute_CXX=yes hardcode_minus_L_CXX=yes # Not in the search PATH, # but as the default # location of the library. ;; esac case $cc_basename in CC*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; aCC*) case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " [-]L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; ia64*) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' ;; esac fi else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; interix[3-9]*) hardcode_direct_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; irix5* | irix6*) case $cc_basename in CC*) # SGI C++ archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' # Archives containing C++ object files must be created using # "CC -ar", where "CC" is the IRIX C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' ;; *) if test yes = "$GXX"; then if test no = "$with_gnu_ld"; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' fi fi link_all_deplibs_CXX=yes ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: inherit_rpath_CXX=yes ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' # Archives containing C++ object files must be created using # "CC -Bstatic", where "CC" is the KAI C++ compiler. old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; icpc* | ecpc* ) # Intel C++ with_gnu_ld=yes # version 8.0 and above of icpc choke on multiply defined symbols # if we add $predep_objects and $postdep_objects, however 7.1 and # earlier do not add the objects themselves. case `$CC -V 2>&1` in *"Version 7."*) archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 8.0 or newer tmp_idyn= case $host_cpu in ia64*) tmp_idyn=' -i_dynamic';; esac archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac archive_cmds_need_lc_CXX=no hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive' ;; pgCC* | pgcpp*) # Portland Group C++ compiler case `$CC -V` in *pgCC\ [1-5].* | *pgcpp\ [1-5].*) prelink_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' old_archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ $RANLIB $oldlib' archive_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='tpldir=Template.dir~ rm -rf $tpldir~ $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; *) # Version 6 and above use weak symbols archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' ;; cxx*) # Compaq C++ archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_CXX='-rpath $libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' ;; xl* | mpixl* | bgxl*) # IBM XL 8.0 on PPC, with GNU ld hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' export_dynamic_flag_spec_CXX='$wl--export-dynamic' archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' hardcode_libdir_flag_spec_CXX='-R$libdir' whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_CXX=yes # Not sure whether something based on # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 # would be better. output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; esac ;; esac ;; lynxos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; m88k*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; mvs*) case $cc_basename in cxx*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; *-mlibc) ld_shlibs_CXX=yes ;; netbsd*) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' wlarc= hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no fi # Workaround some broken pre-1.5 toolchains output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' ;; *nto* | *qnx*) ld_shlibs_CXX=yes ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_CXX=yes hardcode_shlibpath_var_CXX=no hardcode_direct_absolute_CXX=yes archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' export_dynamic_flag_spec_CXX='$wl-E' whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' fi output_verbose_link_cmd=func_echo_all else ld_shlibs_CXX=no fi ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) # Kuck and Associates, Inc. (KAI) C++ Compiler # KCC will only create a shared library if the output file # ends with ".so" (or ".sl" for HP-UX), so rename the library # to its proper name (with version) after linking. archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir' hardcode_libdir_separator_CXX=: # Archives containing C++ object files must be created using # the KAI C++ compiler. case $host in osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;; *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;; esac ;; RCC*) # Rational C++ 2.4.1 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; cxx*) case $host in osf3*) allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; *) allow_undefined_flag_CXX=' -expect_unresolved \*' archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ echo "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ $RM $lib.exp' hardcode_libdir_flag_spec_CXX='-rpath $libdir' ;; esac hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. # # There doesn't appear to be a way to prevent this compiler from # explicitly linking system object files so we need to strip them # from the output so that they don't get included in the library # dependencies. output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' ;; *) if test yes,no = "$GXX,$with_gnu_ld"; then allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*' case $host in osf3*) archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; *) archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' ;; esac hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' hardcode_libdir_separator_CXX=: # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"' else # FIXME: insert proper C++ library support ld_shlibs_CXX=no fi ;; esac ;; psos*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; serenity*) ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; lcc*) # Lucid # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ archive_cmds_need_lc_CXX=yes no_undefined_flag_CXX=' -zdefs' archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' hardcode_libdir_flag_spec_CXX='-R$libdir' hardcode_shlibpath_var_CXX=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. # Supported since Solaris 2.6 (maybe 2.5.1?) whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' ;; esac link_all_deplibs_CXX=yes output_verbose_link_cmd='func_echo_all' # Archives containing C++ object files must be created using # "CC -xar", where "CC" is the Sun C++ compiler. This is # necessary to make sure instantiated templates are included # in the archive. old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' ;; gcx*) # Green Hills C++ Compiler archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' # The C++ compiler must be used to create the archive. old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' ;; *) # GNU C++ compiler with Solaris linker if test yes,no = "$GXX,$with_gnu_ld"; then no_undefined_flag_CXX=' $wl-z ${wl}defs' if $CC --version | $GREP -v '^2\.7' > /dev/null; then archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"' else # g++ 2.7 appears to require '-G' NOT '-shared' on this # platform. archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' # Commands to make compiler produce verbose output that lists # what "hidden" libraries, object files and flags are used when # linking a shared library. output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " [-]L"' fi hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir' case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' ;; esac fi ;; esac ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_CXX='$wl-z,text' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_CXX='$wl-z,text' allow_undefined_flag_CXX='$wl-z,nodefs' archive_cmds_need_lc_CXX=no hardcode_shlibpath_var_CXX=no hardcode_libdir_flag_spec_CXX='$wl-R,$libdir' hardcode_libdir_separator_CXX=':' link_all_deplibs_CXX=yes export_dynamic_flag_spec_CXX='$wl-Bexport' runpath_var='LD_RUN_PATH' case $cc_basename in CC*) archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~ '"$old_archive_cmds_CXX" reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~ '"$reload_cmds_CXX" ;; *) archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac ;; vxworks*) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; *) # FIXME: insert proper C++ library support ld_shlibs_CXX=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 printf "%s\n" "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no GCC_CXX=$GXX LD_CXX=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... # Dependencies to place before and after the object being linked: predep_objects_CXX= postdep_objects_CXX= predeps_CXX= postdeps_CXX= compiler_lib_search_path_CXX= cat > conftest.$ac_ext <<_LT_EOF class Foo { public: Foo (void) { a = 0; } private: int a; }; _LT_EOF _lt_libdeps_save_CFLAGS=$CFLAGS case "$CC $CFLAGS " in #( *\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; *\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; *\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; esac if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then # Parse the compiler output and extract the necessary # objects, libraries and library flags. # Sentinel used to keep track of whether or not we are before # the conftest object file. pre_test_object_deps_done=no for p in `eval "$output_verbose_link_cmd"`; do case $prev$p in -L* | -R* | -l*) # Some compilers place space between "-{L,R,l}" and the path. # Remove the space. if test x-L = x"$p" || test x-R = x"$p" || test x-l = x"$p"; then prev=$p continue fi # Expand the sysroot to ease extracting the directories later. if test -z "$prev"; then case $p in -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; esac fi case $p in =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; esac if test no = "$pre_test_object_deps_done"; then case $prev in -L | -R) # Internal compiler library paths should come after those # provided the user. The postdeps already come after the # user supplied libs so there is no need to process them. if test -z "$compiler_lib_search_path_CXX"; then compiler_lib_search_path_CXX=$prev$p else compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p" fi ;; # The "-l" case would never come before the object being # linked, so don't bother handling this case. esac else if test -z "$postdeps_CXX"; then postdeps_CXX=$prev$p else postdeps_CXX="${postdeps_CXX} $prev$p" fi fi prev= ;; *.lto.$objext) ;; # Ignore GCC LTO objects *.$objext) # This assumes that the test object file only shows up # once in the compiler output. if test "$p" = "conftest.$objext"; then pre_test_object_deps_done=yes continue fi if test no = "$pre_test_object_deps_done"; then if test -z "$predep_objects_CXX"; then predep_objects_CXX=$p else predep_objects_CXX="$predep_objects_CXX $p" fi else if test -z "$postdep_objects_CXX"; then postdep_objects_CXX=$p else postdep_objects_CXX="$postdep_objects_CXX $p" fi fi ;; *) ;; # Ignore the rest. esac done # Clean up. rm -f a.out a.exe else echo "libtool.m4: error: problem compiling CXX test program" fi $RM -f confest.$objext CFLAGS=$_lt_libdeps_save_CFLAGS # PORTME: override above test on systems where it is broken case $host_os in interix[3-9]*) # Interix 3.5 installs completely hosed .la files for C++, so rather than # hack all around it, let's just trust "g++" to DTRT. predep_objects_CXX= postdep_objects_CXX= postdeps_CXX= ;; esac case " $postdeps_CXX " in *" -lc "*) archive_cmds_need_lc_CXX=no ;; esac compiler_lib_search_dirs_CXX= if test -n "${compiler_lib_search_path_CXX}"; then compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'` fi lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *-mlibc) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; serenity*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if test ${lt_cv_prog_compiler_pic_works_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o_CXX=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_CXX=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_CXX" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' case $host_os in aix[4-9]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi ;; pw32*) export_symbols_cmds_CXX=$ltdll_cmds ;; cygwin* | mingw* | windows* | cegcc*) case $cc_basename in cl* | icl* | ifort* | icx* | ifx*) exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' ;; esac ;; *) export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5 printf "%s\n" "$ld_shlibs_CXX" >&6; } test no = "$ld_shlibs_CXX" && can_build_shared=no with_gnu_ld_CXX=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_CXX" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_CXX=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_CXX in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_CXX pic_flag=$lt_prog_compiler_pic_CXX compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_CXX allow_undefined_flag_CXX= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_CXX=no else lt_cv_archive_cmds_need_lc_CXX=yes fi allow_undefined_flag_CXX=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc_CXX" >&6; } archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | windows* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds # If user builds GCC with multilib enabled, # it should just install on $(libdir) # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. if test xyes = x"$multilib"; then postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ $install_prog $dir/$dlname $destdir/$dlname~ chmod a+x $destdir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib $destdir/$dlname'\'' || exit \$?; fi' else postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' fi postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | windows* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl* | *,ifort* | *,icx* | *,ifx*) # Native MSVC or classic or new Intel Compilers libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw* | windows*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac case $host_cpu in powerpc64) # On FreeBSD bi-arch platforms, a different variable is used for 32-bit # binaries. See . cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int test_pointer_size[sizeof (void *) - 5]; _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : shlibpath_var=LD_LIBRARY_PATH else case e in #( e) shlibpath_var=LD_32_LIBRARY_PATH ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; *) shlibpath_var=LD_LIBRARY_PATH ;; esac case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib' sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib' hardcode_into_libs=no ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # -rpath works at least for libraries that are not overridden by # libraries installed in system locations. hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\"" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir ;; esac fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directories which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *-mlibc) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='mlibc ld.so' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; serenity*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no dynamic_linker='SerenityOS LibELF' ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; emscripten*) version_type=none need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= dynamic_linker="Emscripten linker" lt_prog_compiler_wl_CXX= lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX= # C++ specific cases for pic, static, wl, etc. if test yes = "$GXX"; then lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' fi lt_prog_compiler_pic_CXX='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_CXX='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_CXX='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_CXX='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_CXX='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all lt_prog_compiler_pic_CXX= ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_CXX= ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_CXX=-Kconform_pic fi ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; *) lt_prog_compiler_pic_CXX='-fPIC' ;; esac else case $host_os in aix[4-9]*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_CXX='-Bstatic' else lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; mingw* | windows* | cygwin* | os2* | pw32* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_CXX='-DDLL_EXPORT' ;; dgux*) case $cc_basename in ec++*) lt_prog_compiler_pic_CXX='-KPIC' ;; ghcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; freebsd* | dragonfly* | midnightbsd*) # FreeBSD uses GNU C++ ;; hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' if test ia64 != "$host_cpu"; then lt_prog_compiler_pic_CXX='+Z' fi ;; aCC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='$wl-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_CXX='+Z' ;; esac ;; *) ;; esac ;; interix*) # This is c89, which is MS Visual C++ (no shared libs) # Anyone wants to do a port? ;; irix5* | irix6* | nonstopux*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_static_CXX='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in KCC*) # KAI C++ Compiler lt_prog_compiler_wl_CXX='--backend -Wl,' lt_prog_compiler_pic_CXX='-fPIC' ;; ecpc* ) # old Intel C++ for x86_64, which still supported -KPIC. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-static' ;; icpc* ) # Intel C++, used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fPIC' lt_prog_compiler_static_CXX='-static' ;; pgCC* | pgcpp*) # Portland Group C++ compiler lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-fpic' lt_prog_compiler_static_CXX='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; xlc* | xlC* | bgxl[cC]* | mpixl[cC]*) # IBM XL 8.0, 9.0 on PPC and BlueGene lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-qpic' lt_prog_compiler_static_CXX='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C++ 5.9 lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; esac ;; esac ;; lynxos*) ;; m88k*) ;; mvs*) case $cc_basename in cxx*) lt_prog_compiler_pic_CXX='-W c,exportall' ;; *) ;; esac ;; netbsd* | netbsdelf*-gnu) ;; *-mlibc) ;; *qnx* | *nto*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_CXX='-fPIC -shared' ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) lt_prog_compiler_wl_CXX='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 lt_prog_compiler_pic_CXX='-pic' ;; cxx*) # Digital/Compaq C++ lt_prog_compiler_wl_CXX='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. lt_prog_compiler_pic_CXX= lt_prog_compiler_static_CXX='-non_shared' ;; *) ;; esac ;; psos*) ;; serenity*) ;; solaris*) case $cc_basename in CC* | sunCC*) # Sun C++ 4.2, 5.x and Centerline C++ lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' lt_prog_compiler_wl_CXX='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler lt_prog_compiler_pic_CXX='-PIC' ;; *) ;; esac ;; sunos4*) case $cc_basename in CC*) # Sun C++ 4.x lt_prog_compiler_pic_CXX='-pic' lt_prog_compiler_static_CXX='-Bstatic' ;; lcc*) # Lucid lt_prog_compiler_pic_CXX='-pic' ;; *) ;; esac ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) lt_prog_compiler_wl_CXX='-Wl,' lt_prog_compiler_pic_CXX='-KPIC' lt_prog_compiler_static_CXX='-Bstatic' ;; esac ;; tandem*) case $cc_basename in NCC*) # NonStop-UX NCC 3.20 lt_prog_compiler_pic_CXX='-KPIC' ;; *) ;; esac ;; vxworks*) ;; *) lt_prog_compiler_can_build_shared_CXX=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_CXX= ;; *) lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_CXX" >&6; } lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_CXX"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } if test ${lt_cv_prog_compiler_pic_works_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_works_CXX=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_CXX=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then case $lt_prog_compiler_pic_CXX in "" | " "*) ;; *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; esac else lt_prog_compiler_pic_CXX= lt_prog_compiler_can_build_shared_CXX=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works_CXX+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_static_works_CXX=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_CXX=yes fi else lt_cv_prog_compiler_static_works_CXX=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works_CXX" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then : else lt_prog_compiler_static_CXX= fi ='-fPIC' archive_cmds_CXX='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib' archive_expsym_cmds_CXX='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym' archive_cmds_need_lc_CXX=no no_undefined_flag_CXX= ;; *) dynamic_linker=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action_CXX= if test -n "$hardcode_libdir_flag_spec_CXX" || test -n "$runpath_var_CXX" || test yes = "$hardcode_automatic_CXX"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_CXX" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" && test no != "$hardcode_minus_L_CXX"; then # Linking always hardcodes the temporary library directory. hardcode_action_CXX=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_CXX=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_CXX=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5 printf "%s\n" "$hardcode_action_CXX" >&6; } if test relink = "$hardcode_action_CXX" || test yes = "$inherit_rpath_CXX"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS LDCXX=$LD LD=$lt_save_LD GCC=$lt_save_GCC with_gnu_ld=$lt_save_with_gnu_ld lt_cv_path_LDCXX=$lt_cv_path_LD lt_cv_path_LD=$lt_save_path_LD lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld fi # test yes != "$_lt_caught_CXX_error" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=f ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_f77_compiler_gnu if test -z "$F77" || test no = "$F77"; then _lt_disable_F77=yes fi archive_cmds_need_lc_F77=no allow_undefined_flag_F77= always_export_symbols_F77=no archive_expsym_cmds_F77= export_dynamic_flag_spec_F77= hardcode_direct_F77=no hardcode_direct_absolute_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_automatic_F77=no inherit_rpath_F77=no module_cmds_F77= module_expsym_cmds_F77= link_all_deplibs_F77=unknown old_archive_cmds_F77=$old_archive_cmds reload_flag_F77=$reload_flag reload_cmds_F77=$reload_cmds no_undefined_flag_F77= whole_archive_flag_spec_F77= enable_shared_with_static_runtimes_F77=no # Source file extension for f77 test sources. ac_ext=f # Object file extension for compiled f77 test sources. objext=o objext_F77=$objext # No sense in running all these tests if we already determined that # the F77 compiler isn't working. Some variables (like enable_shared) # are currently assumed to apply to all compilers on this platform, # and will be corrupted by setting them based on a non-working compiler. if test yes != "$_lt_disable_F77"; then # Code to be used in simple compile tests lt_simple_compile_test_code="\ subroutine t return end " # Code to be used in simple link tests lt_simple_link_test_code="\ program t end " # ltmain only uses $CC for tagged configurations so make sure $CC is set. # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} # If no C compiler flags were specified, use CFLAGS. LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` $RM conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` $RM -r conftest* # Allow CC to be a program name with arguments. lt_save_CC=$CC lt_save_GCC=$GCC lt_save_CFLAGS=$CFLAGS CC=${F77-"f77"} CFLAGS=$FFLAGS compiler=$CC compiler_F77=$CC func_cc_basename $compiler cc_basename=$func_cc_basename_result GCC=$G77 if test -n "$compiler"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5 printf %s "checking if libtool supports shared libraries... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5 printf "%s\n" "$can_build_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5 printf %s "checking whether to build shared libraries... " >&6; } test no = "$can_build_shared" && enable_shared=no # On AIX, shared libraries and static libraries use the same namespace, and # are all built from PIC. case $host_os in aix3*) test yes = "$enable_shared" && enable_static=no if test -n "$RANLIB"; then archive_cmds="$archive_cmds~\$RANLIB \$lib" postinstall_cmds='$RANLIB $lib' fi ;; aix[4-9]*) if test ia64 != "$host_cpu"; then case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in yes,aix,yes) ;; # shared object as lib.so file only yes,svr4,*) ;; # shared object as lib.so archive member only yes,*) enable_static=no ;; # shared object in lib.a archive as well esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5 printf "%s\n" "$enable_shared" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5 printf %s "checking whether to build static libraries... " >&6; } # Make sure either enable_shared or enable_static is yes. test yes = "$enable_shared" || enable_static=yes { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5 printf "%s\n" "$enable_static" >&6; } GCC_F77=$G77 LD_F77=$LD ## CAVEAT EMPTOR: ## There is no encapsulation within the following macros, do not change ## the running order or otherwise move them around unless you know exactly ## what you are doing... lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= if test yes = "$GCC"; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi lt_prog_compiler_pic_F77='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_F77='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_F77='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_F77='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_F77= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_F77='-Xlinker ' if test -n "$lt_prog_compiler_pic_F77"; then lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_F77='-Wl,-Wl,,' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; esac ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_F77='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; *flang* | ftn | f18* | f95*) # Flang compiler. lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='--shared' lt_prog_compiler_static_F77='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_F77='-Wl,-Wl,,' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-qpic' lt_prog_compiler_static_F77='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; *-mlibc) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; rdos*) lt_prog_compiler_static_F77='-non_shared' ;; serenity*) ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_F77" >&6; } lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } if test ${lt_cv_prog_compiler_pic_works_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_F77=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works_F77" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_F77"; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_static_works_F77=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_F77=yes fi else lt_cv_prog_compiler_static_works_F77=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works_F77" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_F77"; then : else lt_prog_compiler_static_F77= fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o_F77=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_F77" >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5 printf %s "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test ${lt_cv_prog_compiler_c_o_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_c_o_F77=no $RM -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-o out/conftest2.$ac_objext" # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o_F77=yes fi fi chmod u+w . 2>&5 $RM conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files $RM out/* && rmdir out cd .. $RM -r conftest $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_F77" >&5 printf "%s\n" "$lt_cv_prog_compiler_c_o_F77" >&6; } hard_links=nottested if test no = "$lt_cv_prog_compiler_c_o_F77" && test no != "$need_locks"; then # do not overwrite the value of need_locks provided by the user { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5 printf %s "checking if we can lock with hard links... " >&6; } hard_links=yes $RM conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no ln conftest.a conftest.b 2>/dev/null && hard_links=no { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5 printf "%s\n" "$hard_links" >&6; } if test no = "$hard_links"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5 printf "%s\n" "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;} need_locks=warn fi else need_locks=no fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5 printf %s "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag_F77= always_export_symbols_F77=no archive_cmds_F77= archive_expsym_cmds_F77= compiler_needs_object_F77=no enable_shared_with_static_runtimes_F77=no export_dynamic_flag_spec_F77= export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' hardcode_automatic_F77=no hardcode_direct_F77=no hardcode_direct_absolute_F77=no hardcode_libdir_flag_spec_F77= hardcode_libdir_separator_F77= hardcode_minus_L_F77=no hardcode_shlibpath_var_F77=unsupported inherit_rpath_F77=no link_all_deplibs_F77=unknown module_cmds_F77= module_expsym_cmds_F77= old_archive_from_new_cmds_F77= old_archive_from_expsyms_cmds_F77= thread_safe_flag_spec_F77= whole_archive_flag_spec_F77= # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms_F77= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ' (' and ')$', so one must not match beginning or # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', # as well as any symbol that contains 'd'. exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot # rely on this symbol name, it's probably fine to never include it in # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) # FIXME: the MSVC++ and ICC port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++ Compiler. if test yes != "$GCC"; then with_gnu_ld=no fi ;; interix*) # we just hope/assume this is gcc and not c89 (= MSVC++ or ICC) with_gnu_ld=yes ;; esac ld_shlibs_F77=yes # On some targets, GNU ld is compatible enough with the native linker # that we're better off using the native interface for both. lt_use_gnu_ld_interface=no if test yes = "$with_gnu_ld"; then case $host_os in aix*) # The AIX port of GNU ld has always aspired to compatibility # with the native linker. However, as the warning in the GNU ld # block says, versions before 2.19.5* couldn't really create working # shared libraries, regardless of the interface used. case `$LD -v 2>&1` in *\ \(GNU\ Binutils\)\ 2.19.5*) ;; *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; *\ \(GNU\ Binutils\)\ [3-9]*) ;; *) lt_use_gnu_ld_interface=yes ;; esac ;; *) lt_use_gnu_ld_interface=yes ;; esac fi if test yes = "$lt_use_gnu_ld_interface"; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='$wl' # Set some defaults for GNU ld with shared library support. These # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' export_dynamic_flag_spec_F77='$wl--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then whole_archive_flag_spec_F77=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' else whole_archive_flag_spec_F77= fi supports_anon_versioning=no case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in *GNU\ gold*) supports_anon_versioning=yes ;; *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... *\ 2.11.*) ;; # other 2.11 versions *) supports_anon_versioning=yes ;; esac # See if GNU ld supports shared libraries. case $host_os in aix[3-9]*) # On AIX/PPC, the GNU linker is very broken if test ia64 != "$host_cpu"; then ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: the GNU linker, at least up to release 2.19, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you *** really care for shared libraries, you may want to install binutils *** 2.20 or above, or modify your PATH so that a non-GNU linker is found. *** You will then need to restart the configuration process. _LT_EOF fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_F77='' ;; m68k) archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes ;; esac ;; beos*) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then allow_undefined_flag_F77=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' else ld_shlibs_F77=no fi ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # _LT_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec_F77='-L$libdir' export_dynamic_flag_spec_F77='$wl--export-all-symbols' allow_undefined_flag_F77=unsupported always_export_symbols_F77=no enable_shared_with_static_runtimes_F77=yes export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' exclude_expsyms_F77='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' file_list_spec_F77='@' if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file, use it as # is; otherwise, prepend EXPORTS... archive_expsym_cmds_F77='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; cat $export_symbols >> $output_objdir/$soname.def; fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else ld_shlibs_F77=no fi ;; haiku*) archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' link_all_deplibs_F77=no ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported shrext_cmds=.dll archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_from_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_F77=yes file_list_spec_F77='@' ;; interix[3-9]*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' export_dynamic_flag_spec_F77='$wl-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' archive_expsym_cmds_F77='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) tmp_diet=no if test linux-dietlibc = "$host_os"; then case $cc_basename in diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) esac fi if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ && test no = "$tmp_diet" then tmp_addflag=' $pic_flag' tmp_sharedflag='-shared' case $cc_basename,$host_cpu in pgcc*) # Portland Group C compiler whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag' ;; pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group f77 and f90 compilers whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; lf95*) # Lahey Fortran 8.1 whole_archive_flag_spec_F77= tmp_sharedflag='--shared' ;; nagfor*) # NAGFOR 5.3 tmp_sharedflag='-Wl,-shared' ;; xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) tmp_sharedflag='-qmkshrobj' tmp_addflag= ;; nvcc*) # Cuda Compiler Driver 2.2 whole_archive_flag_spec_F77='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_F77=yes ;; esac case `$CC -V 2>&1 | $SED 5q` in *Sun\ C*) # Sun C 5.9 whole_archive_flag_spec_F77='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' compiler_needs_object_F77=yes tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; esac archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' fi case $cc_basename in tcc*) hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' export_dynamic_flag_spec_F77='-rdynamic' ;; xlf* | bgf* | bgxlf* | mpixlf*) # IBM XL Fortran 10.1 on PPC cannot create shared libs itself whole_archive_flag_spec_F77='--whole-archive$convenience --no-whole-archive' hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' if test yes = "$supports_anon_versioning"; then archive_expsym_cmds_F77='echo "{ global:" > $output_objdir/$libname.ver~ cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ echo "local: *; };" >> $output_objdir/$libname.ver~ $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' fi ;; esac else ld_shlibs_F77=no fi ;; *-mlibc) archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.9.1 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) ld_shlibs_F77=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot *** reliably create shared libraries on SCO systems. Therefore, libtool *** is disabling shared libraries support. We urge you to upgrade GNU *** binutils to release 2.16.91.0.3 or newer. Another option is to modify *** your PATH or compiler configuration so that the native linker is *** used, and then restart. _LT_EOF ;; *) # For security reasons, it is highly recommended that you always # use absolute paths for naming shared libraries, and exclude the # DT_RUNPATH tag from executables and libraries. But doing so # requires that you compile everything twice, which is a pain. if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac ;; sunos4*) archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; *) if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs_F77=no fi ;; esac if test no = "$ld_shlibs_F77"; then runpath_var= hardcode_libdir_flag_spec_F77= export_dynamic_flag_spec_F77= whole_archive_flag_spec_F77= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. hardcode_minus_L_F77=yes if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. hardcode_direct_F77=unsupported fi ;; aix[4-9]*) if test ia64 = "$host_cpu"; then # On IA64, the linker does run time linking by default, so we don't # have to do anything special. aix_use_runtimelinking=no exp_sym_flag='-Bexport' no_entry_flag= else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to GNU nm, but means don't demangle to AIX nm. # Without the "-l" option, or with the "-B" option, AIX nm treats # weak defined symbols like other global defined symbols, whereas # GNU nm marks them as "W". # While the 'weak' keyword is ignored in the Export File, we need # it in the Import File for the 'aix-soname' feature, so we have # to replace the "-B" option with "-P" for AIX nm. if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' else export_symbols_cmds_F77='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "L") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no # Test if we are trying to use run time linking or normal # AIX style linking. If -brtl is somewhere in LDFLAGS, we # have runtime linking enabled, and use it for executables. # For shared libraries, we enable/disable runtime linking # depending on the kind of the shared library created - # when "with_aix_soname,aix_use_runtimelinking" is: # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables # "aix,yes" lib.so shared, rtl:yes, for executables # lib.a static archive # "both,no" lib.so.V(shr.o) shared, rtl:yes # lib.a(lib.so.V) shared, rtl:no, for executables # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a(lib.so.V) shared, rtl:no # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables # lib.a static archive case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then aix_use_runtimelinking=yes break fi done if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then # With aix-soname=svr4, we create the lib.so.V shared archives only, # so we don't have lib.a shared libs to link our executables. # We have to force runtime linking in this case. aix_use_runtimelinking=yes LDFLAGS="$LDFLAGS -Wl,-brtl" fi ;; esac exp_sym_flag='-bexport' no_entry_flag='-bnoentry' fi # When large executables or shared objects are built, AIX ld can # have problems creating the table of contents. If linking a library # or program results in "error TOC overflow" add -mminimal-toc to # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. archive_cmds_F77='' hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes file_list_spec_F77='$wl-f,' case $with_aix_soname,$aix_use_runtimelinking in aix,*) ;; # traditional, no import file svr4,* | *,yes) # use import file # The Import File defines what to hardcode. hardcode_direct_F77=no hardcode_direct_absolute_F77=no ;; esac if test yes = "$GCC"; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`$CC -print-prog-name=collect2` if test -f "$collect2name" && strings "$collect2name" | $GREP resolve_lib_name >/dev/null then # We have reworked collect2 : else # We have old collect2 hardcode_direct_F77=unsupported # It fails to find uninstalled libraries when the uninstalled # path is not listed in the libpath. Setting hardcode_minus_L # to unsupported forces relinking hardcode_minus_L_F77=yes hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_libdir_separator_F77= fi ;; esac shared_flag='-shared' if test yes = "$aix_use_runtimelinking"; then shared_flag="$shared_flag "'$wl-G' fi # Need to ensure runtime linking is disabled for the traditional # shared library, or the linker may eventually find shared libraries # /with/ Import File - we do not want to mix them. shared_flag_aix='-shared' shared_flag_svr4='-shared $wl-G' else # not using gcc if test ia64 = "$host_cpu"; then # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test yes = "$aix_use_runtimelinking"; then shared_flag='$wl-G' else shared_flag='$wl-bM:SRE' fi shared_flag_aix='$wl-bM:SRE' shared_flag_svr4='$wl-G' fi fi export_dynamic_flag_spec_F77='$wl-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols_F77=yes if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag_F77='-berok' # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath__F77+y} then : printf %s "(cached) " >&6 else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath__F77 fi hardcode_libdir_flag_spec_F77='$wl-blibpath:$libdir:'"$aix_libpath" archive_expsym_cmds_F77='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag else if test ia64 = "$host_cpu"; then hardcode_libdir_flag_spec_F77='$wl-R $libdir:/usr/lib:/lib' allow_undefined_flag_F77="-z nodefs" archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" else # Determine the default libpath from the value encoded in an # empty executable. if test set = "${lt_cv_aix_libpath+set}"; then aix_libpath=$lt_cv_aix_libpath else if test ${lt_cv_aix_libpath__F77+y} then : printf %s "(cached) " >&6 else case e in #( e) cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO" then : lt_aix_libpath_sed=' /Import File Strings/,/^$/ { /^0/ { s/^0 *\([^ ]*\) *$/\1/ p } }' lt_cv_aix_libpath__F77=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` # Check for a 64-bit object if we didn't find anything. if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test -z "$lt_cv_aix_libpath__F77"; then lt_cv_aix_libpath__F77=/usr/lib:/lib fi ;; esac fi aix_libpath=$lt_cv_aix_libpath__F77 fi hardcode_libdir_flag_spec_F77='$wl-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag_F77=' $wl-bernotok' allow_undefined_flag_F77=' $wl-berok' if test yes = "$with_gnu_ld"; then # We only use this code for GNU lds that support --whole-archive. whole_archive_flag_spec_F77='$wl--whole-archive$convenience $wl--no-whole-archive' else # Exported symbols can be pulled into shared objects from archives whole_archive_flag_spec_F77='$convenience' fi archive_cmds_need_lc_F77=yes archive_expsym_cmds_F77='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' # -brtl affects multiple linker settings, -berok does not and is overridden later compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`' if test svr4 != "$with_aix_soname"; then # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' fi if test aix != "$with_aix_soname"; then archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' else # used by -dlpreopen to get the symbols archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$MV $output_objdir/$realname.d/$soname $output_objdir' fi archive_expsym_cmds_F77="$archive_expsym_cmds_F77"'~$RM -r $output_objdir/$realname.d' fi fi ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' archive_expsym_cmds_F77='' ;; m68k) archive_cmds_F77='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes ;; esac ;; bsdi[45]*) export_dynamic_flag_spec_F77=-rdynamic ;; cygwin* | mingw* | windows* | pw32* | cegcc*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++ or Intel C++/Fortran Compiler. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. case $cc_basename in cl* | icl* | ifort* | icx* | ifx*) # Native MSVC or classic or new Intel Compilers hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported always_export_symbols_F77=yes file_list_spec_F77='@' # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -Fe$output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' archive_expsym_cmds_F77='if test DEF = "`$SED -n -e '\''s/^[ ]*//'\'' -e '\''/^\(;.*\)*$/d'\'' -e '\''s/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p'\'' -e q $export_symbols`" ; then cp "$export_symbols" "$output_objdir/$soname.def"; echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; else $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; fi~ $CC -Fe$tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ linknames=' # The linker will not automatically build a static lib if we build a DLL. # _LT_TAGVAR(old_archive_from_new_cmds, F77)='true' enable_shared_with_static_runtimes_F77=yes exclude_expsyms_F77='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' # Don't use ranlib old_postinstall_cmds_F77='chmod 644 $oldlib' postlink_cmds_F77='lt_outputfile="@OUTPUT@"~ lt_tool_outputfile="@TOOL_OUTPUT@"~ case $lt_outputfile in *.exe|*.EXE) ;; *) lt_outputfile=$lt_outputfile.exe lt_tool_outputfile=$lt_tool_outputfile.exe ;; esac~ if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; $RM "$lt_outputfile.manifest"; fi' ;; *) # Assume MSVC and Intel compilers wrapper hardcode_libdir_flag_spec_F77=' ' allow_undefined_flag_F77=unsupported # Tell ltmain to make .lib files, not .a files. libext=lib # Tell ltmain to make .dll files, not .so files. shrext_cmds=.dll # FIXME: Setting linknames here is a bad hack. archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' # The linker will automatically build a .lib file if we build a DLL. old_archive_from_new_cmds_F77='true' # FIXME: Should let the user specify the lib program. old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' enable_shared_with_static_runtimes_F77=yes ;; esac ;; darwin* | rhapsody*) archive_cmds_need_lc_F77=no hardcode_direct_F77=no hardcode_automatic_F77=yes hardcode_shlibpath_var_F77=unsupported if test yes = "$lt_cv_ld_force_load"; then whole_archive_flag_spec_F77='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' compiler_needs_object_F77=yes else whole_archive_flag_spec_F77='' fi link_all_deplibs_F77=yes allow_undefined_flag_F77=$_lt_dar_allow_undefined case $cc_basename in ifort*|nagfor*) _lt_dar_can_shared=yes ;; *) _lt_dar_can_shared=$GCC ;; esac if test yes = "$_lt_dar_can_shared"; then output_verbose_link_cmd=func_echo_all archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" archive_expsym_cmds_F77="$SED 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" module_expsym_cmds_F77="$SED -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" else ld_shlibs_F77=no fi ;; dgux*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. freebsd2.*) archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly* | midnightbsd*) archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; hpux9*) if test yes = "$GCC"; then archive_cmds_F77='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' else archive_cmds_F77='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes export_dynamic_flag_spec_F77='$wl-E' ;; hpux10*) if test yes,no = "$GCC,$with_gnu_ld"; then archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir' hardcode_libdir_separator_F77=: hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes export_dynamic_flag_spec_F77='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes fi ;; hpux11*) if test yes,no = "$GCC,$with_gnu_ld"; then case $host_cpu in hppa*64*) archive_cmds_F77='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) archive_cmds_F77='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) archive_cmds_F77='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) archive_cmds_F77='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test no = "$with_gnu_ld"; then hardcode_libdir_flag_spec_F77='$wl+b $wl$libdir' hardcode_libdir_separator_F77=: case $host_cpu in hppa*64*|ia64*) hardcode_direct_F77=no hardcode_shlibpath_var_F77=no ;; *) hardcode_direct_F77=yes hardcode_direct_absolute_F77=yes export_dynamic_flag_spec_F77='$wl-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L_F77=yes ;; esac fi ;; irix5* | irix6* | nonstopux*) if test yes = "$GCC"; then archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' # Try to use the -exported_symbol ld option, if it does not # work, assume that -exports_file does not work either and # implicitly export all symbols. # This should be the same for all languages, so no per-tag cache variable. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5 printf %s "checking whether the $host_os linker accepts -exported_symbol... " >&6; } if test ${lt_cv_irix_exported_symbol+y} then : printf %s "(cached) " >&6 else case e in #( e) save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" cat > conftest.$ac_ext <<_ACEOF subroutine foo end _ACEOF if ac_fn_f77_try_link "$LINENO" then : lt_cv_irix_exported_symbol=yes else case e in #( e) lt_cv_irix_exported_symbol=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5 printf "%s\n" "$lt_cv_irix_exported_symbol" >&6; } if test yes = "$lt_cv_irix_exported_symbol"; then archive_expsym_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' fi else archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' fi archive_cmds_need_lc_F77='no' hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' hardcode_libdir_separator_F77=: inherit_rpath_F77=yes link_all_deplibs_F77=yes ;; linux*) case $cc_basename in tcc*) # Fabrice Bellard et al's Tiny C Compiler ld_shlibs_F77=yes archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' ;; esac ;; *-mlibc) ;; netbsd* | netbsdelf*-gnu) if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no ;; newsos6) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' hardcode_libdir_separator_F77=: hardcode_shlibpath_var_F77=no ;; *nto* | *qnx*) ;; openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct_F77=yes hardcode_shlibpath_var_F77=no hardcode_direct_absolute_F77=yes if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' export_dynamic_flag_spec_F77='$wl-E' else archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec_F77='$wl-rpath,$libdir' fi else ld_shlibs_F77=no fi ;; os2*) hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_minus_L_F77=yes allow_undefined_flag_F77=unsupported shrext_cmds=.dll archive_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' archive_expsym_cmds_F77='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ $ECHO EXPORTS >> $output_objdir/$libname.def~ prefix_cmds="$SED"~ if test EXPORTS = "`$SED 1q $export_symbols`"; then prefix_cmds="$prefix_cmds -e 1d"; fi~ prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ emximp -o $lib $output_objdir/$libname.def' old_archive_from_new_cmds_F77='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' enable_shared_with_static_runtimes_F77=yes file_list_spec_F77='@' ;; osf3*) if test yes = "$GCC"; then allow_undefined_flag_F77=' $wl-expect_unresolved $wl\*' archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' fi archive_cmds_need_lc_F77='no' hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' hardcode_libdir_separator_F77=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test yes = "$GCC"; then allow_undefined_flag_F77=' $wl-expect_unresolved $wl\*' archive_cmds_F77='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' else allow_undefined_flag_F77=' -expect_unresolved \*' archive_cmds_F77='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec_F77='-rpath $libdir' fi archive_cmds_need_lc_F77='no' hardcode_libdir_separator_F77=: ;; serenity*) ;; solaris*) no_undefined_flag_F77=' -z defs' if test yes = "$GCC"; then wlarc='$wl' archive_cmds_F77='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' else case `$CC -V 2>&1` in *"Compilers 5.0"*) wlarc='' archive_cmds_F77='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' ;; *) wlarc='$wl' archive_cmds_F77='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' ;; esac fi hardcode_libdir_flag_spec_F77='-R$libdir' hardcode_shlibpath_var_F77=no case $host_os in solaris2.[0-5] | solaris2.[0-5].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands '-z linker_flag'. GCC discards it without '$wl', # but is careful enough not to reorder. # Supported since Solaris 2.6 (maybe 2.5.1?) if test yes = "$GCC"; then whole_archive_flag_spec_F77='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' else whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' fi ;; esac link_all_deplibs_F77=yes ;; sunos4*) if test sequent = "$host_vendor"; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. archive_cmds_F77='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_direct_F77=yes hardcode_minus_L_F77=yes hardcode_shlibpath_var_F77=no ;; sysv4) case $host_vendor in sni) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' reload_cmds_F77='$CC -r -o $output$reload_objs' hardcode_direct_F77=no ;; motorola) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' hardcode_shlibpath_var_F77=no ;; sysv4.3*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no export_dynamic_flag_spec_F77='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_shlibpath_var_F77=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes ld_shlibs_F77=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) no_undefined_flag_F77='$wl-z,text' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds_F77='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; sysv5* | sco3.2v5* | sco5v6*) # Note: We CANNOT use -z defs as we might desire, because we do not # link with -lc, and that would cause any symbols used from libc to # always be unresolved, which means just about no library would # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. no_undefined_flag_F77='$wl-z,text' allow_undefined_flag_F77='$wl-z,nodefs' archive_cmds_need_lc_F77=no hardcode_shlibpath_var_F77=no hardcode_libdir_flag_spec_F77='$wl-R,$libdir' hardcode_libdir_separator_F77=':' link_all_deplibs_F77=yes export_dynamic_flag_spec_F77='$wl-Bexport' runpath_var='LD_RUN_PATH' if test yes = "$GCC"; then archive_cmds_F77='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds_F77='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds_F77='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' hardcode_libdir_flag_spec_F77='-L$libdir' hardcode_shlibpath_var_F77=no ;; *) ld_shlibs_F77=no ;; esac if test sni = "$host_vendor"; then case $host in sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) export_dynamic_flag_spec_F77='$wl-Blargedynsym' ;; esac fi fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_F77" >&5 printf "%s\n" "$ld_shlibs_F77" >&6; } test no = "$ld_shlibs_F77" && can_build_shared=no with_gnu_ld_F77=$with_gnu_ld # # Do we need to explicitly link libc? # case "x$archive_cmds_need_lc_F77" in x|xyes) # Assume -lc should be added archive_cmds_need_lc_F77=yes if test yes,yes = "$GCC,$enable_shared"; then case $archive_cmds_F77 in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; '$CC '*) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5 printf %s "checking whether -lc should be explicitly linked in... " >&6; } if test ${lt_cv_archive_cmds_need_lc_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) $RM conftest* echo "$lt_simple_compile_test_code" > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } 2>conftest.err; then soname=conftest lib=conftest libobjs=conftest.$ac_objext deplibs= wl=$lt_prog_compiler_wl_F77 pic_flag=$lt_prog_compiler_pic_F77 compiler_flags=-v linker_flags=-v verstring= output_objdir=. libname=conftest lt_save_allow_undefined_flag=$allow_undefined_flag_F77 allow_undefined_flag_F77= if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5 (eval $archive_cmds_F77 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } then lt_cv_archive_cmds_need_lc_F77=no else lt_cv_archive_cmds_need_lc_F77=yes fi allow_undefined_flag_F77=$lt_save_allow_undefined_flag else cat conftest.err 1>&5 fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_F77" >&5 printf "%s\n" "$lt_cv_archive_cmds_need_lc_F77" >&6; } archive_cmds_need_lc_F77=$lt_cv_archive_cmds_need_lc_F77 ;; esac fi ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5 printf %s "checking dynamic linker characteristics... " >&6; } library_names_spec= libname_spec='lib$name' soname_spec= shrext_cmds=.so postinstall_cmds= postuninstall_cmds= finish_cmds= finish_eval= shlibpath_var= shlibpath_overrides_runpath=unknown version_type=none dynamic_linker="$host_os ld.so" sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no # when you set need_version to no, make sure it does not cause -set_version # flags to be left without arguments need_version=unknown case $host_os in aix3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname.a' shlibpath_var=LIBPATH # AIX 3 has no versioning support, so we append a major version to the name. soname_spec='$libname$release$shared_ext$major' ;; aix[4-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no hardcode_into_libs=yes if test ia64 = "$host_cpu"; then # AIX 5 supports IA64 library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH else # With GCC up to 2.95.x, collect2 would create an import file # for dependence libraries. The import file would start with # the line '#! .'. This would cause the generated library to # depend on '.', always an invalid library. This was fixed in # development snapshots of GCC prior to 3.0. case $host_os in aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then : else can_build_shared=no fi ;; esac # Using Import Files as archive members, it is possible to support # filename-based versioning of shared library archives on AIX. While # this would work for both with and without runtime linking, it will # prevent static linking of such archives. So we do filename-based # shared library versioning with .so extension only, which is used # when both runtime linking and shared linking is enabled. # Unfortunately, runtime linking may impact performance, so we do # not want this to be the default eventually. Also, we use the # versioned .so libs for executables only if there is the -brtl # linker flag in LDFLAGS as well, or --enable-aix-soname=svr4 only. # To allow for filename-based versioning support, we need to create # libNAME.so.V as an archive file, containing: # *) an Import File, referring to the versioned filename of the # archive as well as the shared archive member, telling the # bitwidth (32 or 64) of that shared object, and providing the # list of exported symbols of that shared object, eventually # decorated with the 'weak' keyword # *) the shared object with the F_LOADONLY flag set, to really avoid # it being seen by the linker. # At run time we better use the real file rather than another symlink, # but for link time we create the symlink libNAME.so -> libNAME.so.V case $with_aix_soname,$aix_use_runtimelinking in # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct # soname into executable. Probably we can add versioning support to # collect2, so additional links can be useful in future. aix,yes) # traditional libtool dynamic_linker='AIX unversionable lib.so' # If using run time linking (on AIX 4.2 or later) use lib.so # instead of lib.a to let people know that these are not # typical AIX shared libraries. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; aix,no) # traditional AIX only dynamic_linker='AIX lib.a(lib.so.V)' # We preserve .a as extension for shared libraries through AIX4.2 # and later when we are not doing run time linking. library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' ;; svr4,*) # full svr4 only dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,yes) # both, prefer svr4 dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)" library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' # unpreferred sharedlib libNAME.a needs extra handling postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' # We do not specify a path in Import Files, so LIBPATH fires. shlibpath_overrides_runpath=yes ;; *,no) # both, prefer aix dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)" library_names_spec='$libname$release.a $libname.a' soname_spec='$libname$release$shared_ext$major' # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' ;; esac shlibpath_var=LIBPATH fi ;; amigaos*) case $host_cpu in powerpc) # Since July 2007 AmigaOS4 officially supports .so libraries. # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' ;; m68k) library_names_spec='$libname.ixlibrary $libname.a' # Create ${libname}_ixlibrary.a entries in /sys/libs. finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; esac ;; beos*) library_names_spec='$libname$shared_ext' dynamic_linker="$host_os ld.so" shlibpath_var=LIBRARY_PATH ;; bsdi[45]*) version_type=linux # correct to gnu/linux during the next big refactor need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" # the default ld.so.conf also contains /usr/contrib/lib and # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow # libtool to hard-code these into programs ;; cygwin* | mingw* | windows* | pw32* | cegcc*) version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no case $GCC,$cc_basename in yes,*) # gcc library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds # If user builds GCC with multilib enabled, # it should just install on $(libdir) # not on $(libdir)/../bin or 32 bits dlls would override 64 bit ones. if test xyes = x"$multilib"; then postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ $install_prog $dir/$dlname $destdir/$dlname~ chmod a+x $destdir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib $destdir/$dlname'\'' || exit \$?; fi' else postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' fi postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo $libname | $SED -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; mingw* | windows* | cegcc*) # MinGW DLLs use traditional 'lib' prefix soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo $libname | $SED -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' ;; esac dynamic_linker='Win32 ld.exe' ;; *,cl* | *,icl* | *,ifort* | *,icx* | *,ifx*) # Native MSVC or classic or new Intel Compilers libname_spec='$name' soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext' library_names_spec='$libname.dll.lib' case $build_os in mingw* | windows*) sys_lib_search_path_spec= lt_save_ifs=$IFS IFS=';' for lt_path in $LIB do IFS=$lt_save_ifs # Let DOS variable expansion print the short 8.3 style file name. lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" done IFS=$lt_save_ifs # Convert to MSYS style. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` ;; cygwin*) # Convert to unix form, then to dos form, then back to unix form # but this time dos style (no spaces!) so that the unix form looks # like /cygdrive/c/PROGRA~1:/cygdr... sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` ;; *) sys_lib_search_path_spec=$LIB if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then # It is most probably a Windows format PATH. sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` else sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` fi # FIXME: find the short name or the path components, as spaces are # common. (e.g. "Program Files" -> "PROGRA~1") ;; esac # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' shlibpath_overrides_runpath=yes dynamic_linker='Win32 link.exe' ;; *) # Assume MSVC and ICC wrapper library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib' dynamic_linker='Win32 ld.exe' ;; esac # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; darwin* | rhapsody*) dynamic_linker="$host_os dyld" version_type=darwin need_lib_prefix=no need_version=no library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' soname_spec='$libname$release$major$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; freebsd* | dragonfly* | midnightbsd*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. if test -x /usr/bin/objformat; then objformat=`/usr/bin/objformat` else case $host_os in freebsd[23].*) objformat=aout ;; *) objformat=elf ;; esac fi version_type=freebsd-$objformat case $version_type in freebsd-elf*) library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' need_version=no need_lib_prefix=no ;; freebsd-*) library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' need_version=yes ;; esac case $host_cpu in powerpc64) # On FreeBSD bi-arch platforms, a different variable is used for 32-bit # binaries. See . cat > conftest.$ac_ext <<_ACEOF int test_pointer_size[sizeof (void *) - 5]; _ACEOF if ac_fn_f77_try_compile "$LINENO" then : shlibpath_var=LD_LIBRARY_PATH else case e in #( e) shlibpath_var=LD_32_LIBRARY_PATH ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; *) shlibpath_var=LD_LIBRARY_PATH ;; esac case $host_os in freebsd2.*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; *) # from 4.6 on, and DragonFly shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; esac ;; haiku*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no dynamic_linker="$host_os runtime_loader" library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LIBRARY_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec='/boot/system/non-packaged/develop/lib /boot/system/develop/lib' sys_lib_dlsearch_path_spec='/boot/home/config/non-packaged/lib /boot/home/config/lib /boot/system/non-packaged/lib /boot/system/lib' hardcode_into_libs=no ;; hpux9* | hpux10* | hpux11*) # Give a soname corresponding to the major version so that dld.sl refuses to # link against other versions. version_type=sunos need_lib_prefix=no need_version=no case $host_cpu in ia64*) shrext_cmds='.so' hardcode_into_libs=yes dynamic_linker="$host_os dld.so" shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' if test 32 = "$HPUX_IA64_MODE"; then sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" sys_lib_dlsearch_path_spec=/usr/lib/hpux32 else sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" sys_lib_dlsearch_path_spec=/usr/lib/hpux64 fi ;; hppa*64*) shrext_cmds='.sl' hardcode_into_libs=yes dynamic_linker="$host_os dld.sl" shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' ;; esac # HP-UX runs *really* slowly unless shared libraries are mode 555, ... postinstall_cmds='chmod 555 $lib' # or fails outright, so override atomically: install_override_mode=555 ;; interix[3-9]*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; irix5* | irix6* | nonstopux*) case $host_os in nonstopux*) version_type=nonstopux ;; *) if test yes = "$lt_cv_prog_gnu_ld"; then version_type=linux # correct to gnu/linux during the next big refactor else version_type=irix fi ;; esac need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' case $host_os in irix5* | nonstopux*) libsuff= shlibsuff= ;; *) case $LD in # libtool.m4 will add one of these switches to LD *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= libmagic=32-bit;; *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 libmagic=64-bit;; *) libsuff= shlibsuff= libmagic=never-match;; esac ;; esac shlibpath_var=LD_LIBRARY${shlibsuff}_PATH shlibpath_overrides_runpath=no sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" hardcode_into_libs=yes ;; # No shared lib support for Linux oldld, aout, or coff. linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; linux*android*) version_type=none # Android doesn't support versioned libraries. need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes dynamic_linker='Android linker' # -rpath works at least for libraries that are not overridden by # libraries installed in system locations. hardcode_libdir_flag_spec_F77='$wl-rpath $wl$libdir' ;; # This must be glibc/ELF. linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no # Some binutils ld are patched to set DT_RUNPATH if test ${lt_cv_shlibpath_overrides_runpath+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_shlibpath_overrides_runpath=no save_LDFLAGS=$LDFLAGS save_libdir=$libdir eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_F77\"; \ LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_F77\"" cat > conftest.$ac_ext <<_ACEOF program main end _ACEOF if ac_fn_f77_try_link "$LINENO" then : if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null then : lt_cv_shlibpath_overrides_runpath=yes fi fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LDFLAGS=$save_LDFLAGS libdir=$save_libdir ;; esac fi shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. hardcode_into_libs=yes # Ideally, we could use ldconfig to report *all* directories which are # searched for libraries, however this is still not possible. Aside from not # being certain /sbin/ldconfig is available, command # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, # even though it is searched at run-time. Try to do the best guess by # appending ld.so.conf contents (and includes) to the search path. if test -f /etc/ld.so.conf; then lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi # We used to test for /lib/ld.so.1 and disable shared libraries on # powerpc, because MkLinux only supported shared libraries with the # GNU dynamic linker. Since this was broken with cross compilers, # most powerpc-linux boxes support dynamic linking these days and # people can always --disable-shared, the test was removed, and we # assume the GNU/Linux dynamic linker is in use. dynamic_linker='GNU/Linux ld.so' ;; netbsdelf*-gnu) version_type=linux need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='NetBSD ld.elf_so' ;; netbsd*) version_type=sunos need_lib_prefix=no need_version=no if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' else library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='NetBSD ld.elf_so' fi shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes ;; *-mlibc) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' dynamic_linker='mlibc ld.so' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; newsos6) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; *nto* | *qnx*) version_type=qnx need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes dynamic_linker='ldqnx.so' ;; openbsd*) version_type=sunos sys_lib_dlsearch_path_spec=/usr/lib need_lib_prefix=no if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then need_version=no else need_version=yes fi library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; os2*) libname_spec='$name' version_type=windows shrext_cmds=.dll need_version=no need_lib_prefix=no # OS/2 can only load a DLL with a base name of 8 characters or less. soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; v=$($ECHO $release$versuffix | tr -d .-); n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); $ECHO $n$v`$shared_ext' library_names_spec='${libname}_dll.$libext' dynamic_linker='OS/2 ld.exe' shlibpath_var=BEGINLIBPATH sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec postinstall_cmds='base_file=`basename \$file`~ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ chmod a+x \$dldir/$dlname~ if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; fi' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ dlpath=$dir/\$dldll~ $RM \$dlpath' ;; osf3* | osf4* | osf5*) version_type=osf need_lib_prefix=no need_version=no soname_spec='$libname$release$shared_ext$major' library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; rdos*) dynamic_linker=no ;; serenity*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no dynamic_linker='SerenityOS LibELF' ;; solaris*) version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes # ldd complains unless libraries are executable postinstall_cmds='chmod +x $lib' ;; sunos4*) version_type=sunos library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes if test yes = "$with_gnu_ld"; then need_lib_prefix=no fi need_version=yes ;; sysv4 | sysv4.3*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH case $host_vendor in sni) shlibpath_overrides_runpath=no need_lib_prefix=no runpath_var=LD_RUN_PATH ;; siemens) need_lib_prefix=no ;; motorola) need_lib_prefix=no need_version=no shlibpath_overrides_runpath=no sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' ;; esac ;; sysv4*MP*) if test -d /usr/nec; then version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' soname_spec='$libname$shared_ext.$major' shlibpath_var=LD_LIBRARY_PATH fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) version_type=sco need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test yes = "$with_gnu_ld"; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" ;; esac fi sys_lib_dlsearch_path_spec='/usr/lib' ;; tpf*) # TPF is a cross-target only. Preferred cross-host = GNU/Linux. version_type=linux # correct to gnu/linux during the next big refactor need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no hardcode_into_libs=yes ;; uts4*) version_type=linux # correct to gnu/linux during the next big refactor library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' soname_spec='$libname$release$shared_ext$major' shlibpath_var=LD_LIBRARY_PATH ;; emscripten*) version_type=none need_lib_prefix=no need_version=no library_names_spec='$libname$release$shared_ext' soname_spec='$libname$release$shared_ext' finish_cmds= dynamic_linker="Emscripten linker" lt_prog_compiler_wl_F77= lt_prog_compiler_pic_F77= lt_prog_compiler_static_F77= if test yes = "$GCC"; then lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_static_F77='-static' case $host_os in aix*) # All AIX code is PIC. if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' fi lt_prog_compiler_pic_F77='-fPIC' ;; amigaos*) case $host_cpu in powerpc) # see comment about AmigaOS4 .so support lt_prog_compiler_pic_F77='-fPIC' ;; m68k) # FIXME: we need at least 68020 code to build shared libraries, but # adding the '-m68020' flag to GCC prevents building anything better, # like '-m68040'. lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' ;; esac ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries lt_prog_compiler_pic_F77='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_F77='$wl-static' ;; esac ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' ;; haiku*) # PIC is the default for Haiku. # The "-static" flag exists, but is broken. lt_prog_compiler_static_F77= ;; hpux*) # PIC is the default for 64-bit PA HP-UX, but not for 32-bit # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag # sets the default TLS model and affects inlining. case $host_cpu in hppa*64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac ;; interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. ;; msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. lt_prog_compiler_can_build_shared_F77=no enable_shared=no ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77=-Kconform_pic fi ;; *) lt_prog_compiler_pic_F77='-fPIC' ;; esac case $cc_basename in nvcc*) # Cuda Compiler Driver 2.2 lt_prog_compiler_wl_F77='-Xlinker ' if test -n "$lt_prog_compiler_pic_F77"; then lt_prog_compiler_pic_F77="-Xcompiler $lt_prog_compiler_pic_F77" fi ;; esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in aix*) lt_prog_compiler_wl_F77='-Wl,' if test ia64 = "$host_cpu"; then # AIX 5 now supports IA64 processor lt_prog_compiler_static_F77='-Bstatic' else lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' fi ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files lt_prog_compiler_pic_F77='-fno-common' case $cc_basename in nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_F77='-Wl,-Wl,,' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; esac ;; mingw* | windows* | cygwin* | pw32* | os2* | cegcc*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic_F77='-DDLL_EXPORT' case $host_os in os2*) lt_prog_compiler_static_F77='$wl-static' ;; esac ;; hpux9* | hpux10* | hpux11*) lt_prog_compiler_wl_F77='-Wl,' # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) lt_prog_compiler_pic_F77='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? lt_prog_compiler_static_F77='$wl-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) lt_prog_compiler_wl_F77='-Wl,' # PIC (with -KPIC) is the default. lt_prog_compiler_static_F77='-non_shared' ;; linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) case $cc_basename in # old Intel for x86_64, which still supported -KPIC. ecc*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-static' ;; *flang* | ftn | f18* | f95*) # Flang compiler. lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; # icc used to be incompatible with GCC. # ICC 10 doesn't accept -KPIC any more. icc* | ifort*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; # Lahey Fortran 8.1. lf95*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='--shared' lt_prog_compiler_static_F77='--static' ;; nagfor*) # NAG Fortran compiler lt_prog_compiler_wl_F77='-Wl,-Wl,,' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; tcc*) # Fabrice Bellard et al's Tiny C Compiler lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; ccc*) lt_prog_compiler_wl_F77='-Wl,' # All Alpha code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; xl* | bgxl* | bgf* | mpixl*) # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-qpic' lt_prog_compiler_static_F77='-qstaticlink' ;; *) case `$CC -V 2>&1 | $SED 5q` in *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) # Sun Fortran 8.3 passes all unrecognized flags to the linker lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='' ;; *Sun\ F* | *Sun*Fortran*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Qoption ld ' ;; *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' lt_prog_compiler_wl_F77='-Wl,' ;; *Intel*\ [CF]*Compiler*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; *Portland\ Group*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fpic' lt_prog_compiler_static_F77='-Bstatic' ;; esac ;; esac ;; newsos6) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; *-mlibc) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-fPIC' lt_prog_compiler_static_F77='-static' ;; *nto* | *qnx*) # QNX uses GNU C++, but need to define -shared option too, otherwise # it will coredump. lt_prog_compiler_pic_F77='-fPIC -shared' ;; osf3* | osf4* | osf5*) lt_prog_compiler_wl_F77='-Wl,' # All OSF/1 code is PIC. lt_prog_compiler_static_F77='-non_shared' ;; rdos*) lt_prog_compiler_static_F77='-non_shared' ;; serenity*) ;; solaris*) lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' case $cc_basename in f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) lt_prog_compiler_wl_F77='-Qoption ld ';; *) lt_prog_compiler_wl_F77='-Wl,';; esac ;; sunos4*) lt_prog_compiler_wl_F77='-Qoption ld ' lt_prog_compiler_pic_F77='-PIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic_F77='-Kconform_pic' lt_prog_compiler_static_F77='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_pic_F77='-KPIC' lt_prog_compiler_static_F77='-Bstatic' ;; unicos*) lt_prog_compiler_wl_F77='-Wl,' lt_prog_compiler_can_build_shared_F77=no ;; uts4*) lt_prog_compiler_pic_F77='-pic' lt_prog_compiler_static_F77='-Bstatic' ;; *) lt_prog_compiler_can_build_shared_F77=no ;; esac fi case $host_os in # For platforms that do not support PIC, -DPIC is meaningless: *djgpp*) lt_prog_compiler_pic_F77= ;; *) lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5 printf %s "checking for $compiler option to produce PIC... " >&6; } if test ${lt_cv_prog_compiler_pic_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_F77=$lt_prog_compiler_pic_F77 ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_F77" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_F77" >&6; } lt_prog_compiler_pic_F77=$lt_cv_prog_compiler_pic_F77 # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic_F77"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 printf %s "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } if test ${lt_cv_prog_compiler_pic_works_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_pic_works_F77=no ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic_F77" ## exclude from sc_useless_quotes_in_assignment # Insert the option either (1) after the last *FLAGS variable, or # (2) before a word containing "conftest.", or (3) at the end. # Note that $ac_compile itself does not contain backslashes and begins # with a dollar sign (not a hyphen), so the echo should work correctly. # The option is referenced via a variable to avoid confusing sed. lt_compile=`echo "$ac_compile" | $SED \ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works_F77=yes fi fi $RM conftest* ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_F77" >&5 printf "%s\n" "$lt_cv_prog_compiler_pic_works_F77" >&6; } if test yes = "$lt_cv_prog_compiler_pic_works_F77"; then case $lt_prog_compiler_pic_F77 in "" | " "*) ;; *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; esac else lt_prog_compiler_pic_F77= lt_prog_compiler_can_build_shared_F77=no fi fi # # Check to make sure the static flag actually works. # wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5 printf %s "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } if test ${lt_cv_prog_compiler_static_works_F77+y} then : printf %s "(cached) " >&6 else case e in #( e) lt_cv_prog_compiler_static_works_F77=no save_LDFLAGS=$LDFLAGS LDFLAGS="$LDFLAGS $lt_tmp_static_flag" echo "$lt_simple_link_test_code" > conftest.$ac_ext if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then # The linker can only warn and ignore the option if not recognized # So say no if there are warnings if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works_F77=yes fi else lt_cv_prog_compiler_static_works_F77=yes fi fi $RM -r conftest* LDFLAGS=$save_LDFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_F77" >&5 printf "%s\n" "$lt_cv_prog_compiler_static_works_F77" >&6; } if test yes = "$lt_cv_prog_compiler_static_works_F77"; then : else lt_prog_compiler_static_F77= fi ='-fPIC' archive_cmds_F77='$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib' archive_expsym_cmds_F77='$SED "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -sSIDE_MODULE=2 -shared $libobjs $deplibs $compiler_flags -o $lib -s EXPORTED_FUNCTIONS=@$output_objdir/$soname.expsym' archive_cmds_need_lc_F77=no no_undefined_flag_F77= ;; *) dynamic_linker=no ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5 printf "%s\n" "$dynamic_linker" >&6; } test no = "$dynamic_linker" && can_build_shared=no variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test yes = "$GCC"; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec fi if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec fi # remember unaugmented sys_lib_dlsearch_path content for libtool script decls... configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec # ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" # to be used as default LT_SYS_LIBRARY_PATH value in generated libtool configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5 printf %s "checking how to hardcode library paths into programs... " >&6; } hardcode_action_F77= if test -n "$hardcode_libdir_flag_spec_F77" || test -n "$runpath_var_F77" || test yes = "$hardcode_automatic_F77"; then # We can hardcode non-existent directories. if test no != "$hardcode_direct_F77" && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, F77)" && test no != "$hardcode_minus_L_F77"; then # Linking always hardcodes the temporary library directory. hardcode_action_F77=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. hardcode_action_F77=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. hardcode_action_F77=unsupported fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_F77" >&5 printf "%s\n" "$hardcode_action_F77" >&6; } if test relink = "$hardcode_action_F77" || test yes = "$inherit_rpath_F77"; then # Fast installation is not supported enable_fast_install=no elif test yes = "$shlibpath_overrides_runpath" || test no = "$enable_shared"; then # Fast installation is not necessary enable_fast_install=needless fi fi # test -n "$compiler" GCC=$lt_save_GCC CC=$lt_save_CC CFLAGS=$lt_save_CFLAGS fi # test yes != "$_lt_disable_F77" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_commands="$ac_config_commands libtool" # Only expand once: case "$am_cv_ar_interface" in lib ) ac_config_commands="$ac_config_commands libtoolclpatch" ;; * ) case $build in *-mingw* ) ac_config_commands="$ac_config_commands libtoolmingwpatch" ;; esac ;; esac LT_LDFLAGS="$LT_LDFLAGS -version-number 3:14:17" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: libtool version info: -version-number 3:14:17" >&5 printf "%s\n" "$as_me: libtool version info: -version-number 3:14:17" >&6;} LT_LDFLAGS="$LT_LDFLAGS -no-undefined" if test "$enable_shared" = no; then COIN_STATIC_BUILD_TRUE= COIN_STATIC_BUILD_FALSE='#' else COIN_STATIC_BUILD_TRUE='#' COIN_STATIC_BUILD_FALSE= fi # set RPATH_FLAGS to the compiler link flags required to hardcode location # of the shared objects (expanded_libdir is set somewhere in configure before) RPATH_FLAGS= if test $enable_shared = yes; then case $build in *-linux-*) if test "$GCC" = "yes"; then RPATH_FLAGS= for dir in $expanded_libdir; do RPATH_FLAGS="$RPATH_FLAGS -Wl,--rpath -Wl,$dir" done fi ;; *-darwin*) RPATH_FLAGS=nothing ;; *-ibm-*) case "$CC" in xlc* | */xlc* | mpxlc* | */mpxlc*) RPATH_FLAGS=nothing ;; esac ;; *-hp-*) RPATH_FLAGS=nothing ;; *-mingw* | *-msys* ) RPATH_FLAGS=nothing ;; *-*-solaris*) RPATH_FLAGS= for dir in $expanded_libdir; do RPATH_FLAGS="$RPATH_FLAGS -R$dir" done esac if test "$RPATH_FLAGS" = ""; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Could not automatically determine how to tell the linker about automatic inclusion of the path for shared libraries. The test examples might not work if you link against shared objects. You will need to set the LD_LIBRARY_PATH, DYLP_LIBRARY_PATH, or LIBDIR variable manually." >&5 printf "%s\n" "$as_me: WARNING: Could not automatically determine how to tell the linker about automatic inclusion of the path for shared libraries. The test examples might not work if you link against shared objects. You will need to set the LD_LIBRARY_PATH, DYLP_LIBRARY_PATH, or LIBDIR variable manually." >&2;} fi if test "$RPATH_FLAGS" = "nothing"; then RPATH_FLAGS= fi fi # Get the C++ runtime libraries in case we want to link a static Ipopt library # with a C or Fortran compiler ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXXLIBS"; then if test "$GXX" = "yes"; then case "$CXX" in icpc* | */icpc*) CXXLIBS="-lstdc++" ;; *) # clang uses libc++ as the default standard C++ library, not libstdc++ # this test is supposed to recognize whether the compiler is clang cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { #ifndef _LIBCPP_VERSION choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : CXXLIBS="-lc++" else case e in #( e) CXXLIBS="-lstdc++ -lm" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac else case $build in *-mingw* | *-cygwin* | *-msys* ) if test "$enable_msvc" = yes ; then CXXLIBS=nothing fi;; *-linux-*) case "$CXX" in icpc* | */icpc*) CXXLIBS="-lstdc++" ;; pgCC* | */pgCC*) CXXLIBS="-lstd -lC -lc" ;; esac;; *-ibm-*) CXXLIBS="-lC -lc" ;; *-hp-*) CXXLIBS="-L/opt/aCC/lib -l++ -lstd_v2 -lCsup_v2 -lm -lcl -lc" ;; *-*-solaris*) CXXLIBS="-lCstd -lCrun" esac fi fi if test -z "$CXXLIBS"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Could not automatically determine CXXLIBS (C++ link libraries; necessary if main program is in Fortran or C)." >&5 printf "%s\n" "$as_me: WARNING: Could not automatically determine CXXLIBS (C++ link libraries; necessary if main program is in Fortran or C)." >&2;} else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Assuming that CXXLIBS is $CXXLIBS." >&5 printf "%s\n" "$as_me: Assuming that CXXLIBS is $CXXLIBS." >&6;} fi if test x"$CXXLIBS" = xnothing; then CXXLIBS= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # Doxygen { printf "%s\n" "$as_me:${as_lineno-$LINENO}: configuring doxygen documentation options" >&5 printf "%s\n" "$as_me: configuring doxygen documentation options" >&6;} # Check to see if Doxygen and LaTeX are available. # Extract the first word of "doxygen", so it can be a program name with args. set dummy doxygen; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_coin_have_doxygen+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$coin_have_doxygen"; then ac_cv_prog_coin_have_doxygen="$coin_have_doxygen" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_coin_have_doxygen="yes" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_coin_have_doxygen" && ac_cv_prog_coin_have_doxygen="no" fi ;; esac fi coin_have_doxygen=$ac_cv_prog_coin_have_doxygen if test -n "$coin_have_doxygen"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_have_doxygen" >&5 printf "%s\n" "$coin_have_doxygen" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Extract the first word of "latex", so it can be a program name with args. set dummy latex; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_coin_have_latex+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$coin_have_latex"; then ac_cv_prog_coin_have_latex="$coin_have_latex" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_coin_have_latex="yes" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_coin_have_latex" && ac_cv_prog_coin_have_latex="no" fi ;; esac fi coin_have_latex=$ac_cv_prog_coin_have_latex if test -n "$coin_have_latex"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_have_latex" >&5 printf "%s\n" "$coin_have_latex" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi # Check whether --with-dot was given. if test ${with_dot+y} then : withval=$with_dot; else case e in #( e) withval=yes ;; esac fi # Look for the dot tool from the graphviz package, unless the user has disabled it. if test x"$withval" = xno ; then coin_doxy_usedot=NO { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dot " >&5 printf %s "checking for dot ... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 printf "%s\n" "disabled" >&6; } else # Extract the first word of "dot", so it can be a program name with args. set dummy dot; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_coin_doxy_usedot+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$coin_doxy_usedot"; then ac_cv_prog_coin_doxy_usedot="$coin_doxy_usedot" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_coin_doxy_usedot="YES" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_coin_doxy_usedot" && ac_cv_prog_coin_doxy_usedot="NO" fi ;; esac fi coin_doxy_usedot=$ac_cv_prog_coin_doxy_usedot if test -n "$coin_doxy_usedot"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_doxy_usedot" >&5 printf "%s\n" "$coin_doxy_usedot" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi fi # Generate a tag file name and a log file name. coin_doxy_tagname=ipopt_doxy.tag coin_doxy_logname=ipopt_doxy.log if test $coin_have_doxygen = yes; then COIN_HAS_DOXYGEN_TRUE= COIN_HAS_DOXYGEN_FALSE='#' else COIN_HAS_DOXYGEN_TRUE='#' COIN_HAS_DOXYGEN_FALSE= fi if test $coin_have_latex = yes; then COIN_HAS_LATEX_TRUE= COIN_HAS_LATEX_FALSE='#' else COIN_HAS_LATEX_TRUE='#' COIN_HAS_LATEX_FALSE= fi coin_doxy_tagfiles="" # IPOPT_VERBOSITY and IPOPT_DEBUGLEVEL # Check whether --with-ipopt-verbosity was given. if test ${with_ipopt_verbosity+y} then : withval=$with_ipopt_verbosity; if test "$withval" = yes; then withval=1 ; fi coin_verbosity=$withval else case e in #( e) coin_verbosity=0 ;; esac fi printf "%s\n" "#define IPOPT_VERBOSITY $coin_verbosity" >>confdefs.h # Check whether --with-ipopt-checklevel was given. if test ${with_ipopt_checklevel+y} then : withval=$with_ipopt_checklevel; if test "$withval" = yes; then withval=1 ; fi coin_checklevel=$withval else case e in #( e) coin_checklevel=0 ;; esac fi printf "%s\n" "#define IPOPT_CHECKLEVEL $coin_checklevel" >>confdefs.h ######################################################################## # Floating-point Precision and Integer size # ######################################################################## # Check whether --with-precision was given. if test ${with_precision+y} then : withval=$with_precision; precision=$withval else case e in #( e) precision=double ;; esac fi case "$precision" in single ) printf "%s\n" "#define IPOPT_SINGLE 1" >>confdefs.h ;; double ) ;; *) as_fn_error $? "unsupported value $precision for option --with-precision" "$LINENO" 5 esac if test "$precision" = single; then IPOPT_SINGLE_TRUE= IPOPT_SINGLE_FALSE='#' else IPOPT_SINGLE_TRUE='#' IPOPT_SINGLE_FALSE= fi # check which integer size to build # Check whether --with-intsize was given. if test ${with_intsize+y} then : withval=$with_intsize; intsize=$withval else case e in #( e) intsize=32 ;; esac fi case "$intsize" in 32 ) ;; 64 ) printf "%s\n" "#define IPOPT_INT64 1" >>confdefs.h ;; *) as_fn_error $? "unsupported value $intsize for option --with-intsize" "$LINENO" 5 ;; esac if test "$intsize" = 64; then IPOPT_INT64_TRUE= IPOPT_INT64_FALSE='#' else IPOPT_INT64_TRUE='#' IPOPT_INT64_FALSE= fi # Specify 8-byte integers if intsize=64 (TODO This should become a macro in BuildTools that figures out the right flag to use) if test $intsize = 64 ; then case "$F77" in *gfortran*) FFLAGS="$FFLAGS -fdefault-integer-8" ;; *ifort*) case $build in *-cygwin* | *-mingw* | *-msys* ) FFLAGS="$FFLAGS -integer-size:64" ;; *) FFLAGS="$FFLAGS -integer-size 64" ;; esac ;; "" ) ;; # no Fortran compiler, then don't do anything *) as_fn_error $? "Do not know how to select 8-byte integers for Fortran compiler $FC" "$LINENO" 5 ;; esac fi ############################################################################# # Dependencies # ############################################################################# coin_save_LIBS="$LIBS" LIBS= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library containing cos" >&5 printf %s "checking for library containing cos... " >&6; } if test ${ac_cv_search_cos+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char cos (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return cos (); ; return 0; } _ACEOF for ac_lib in '' m do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO" then : ac_cv_search_cos=$ac_res fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext if test ${ac_cv_search_cos+y} then : break fi done if test ${ac_cv_search_cos+y} then : else case e in #( e) ac_cv_search_cos=no ;; esac fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_cos" >&5 printf "%s\n" "$ac_cv_search_cos" >&6; } ac_res=$ac_cv_search_cos if test "$ac_res" != no then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" if test "$ac_cv_search_cos" != 'none required' ; then IPOPTLIB_LFLAGS="$ac_cv_search_cos $IPOPTLIB_LFLAGS" fi fi LIBS="$coin_save_LIBS" if test -z "$PKG_CONFIG" ; then if test -n "$ac_tool_prefix"; then for ac_prog in pkgconf pkg-config do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$PKG_CONFIG"; then ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_PKG_CONFIG="$ac_tool_prefix$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi PKG_CONFIG=$ac_cv_prog_PKG_CONFIG if test -n "$PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 printf "%s\n" "$PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$PKG_CONFIG" && break done fi if test -z "$PKG_CONFIG"; then ac_ct_PKG_CONFIG=$PKG_CONFIG for ac_prog in pkgconf pkg-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_ac_ct_PKG_CONFIG+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$ac_ct_PKG_CONFIG"; then ac_cv_prog_ac_ct_PKG_CONFIG="$ac_ct_PKG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_PKG_CONFIG="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi ac_ct_PKG_CONFIG=$ac_cv_prog_ac_ct_PKG_CONFIG if test -n "$ac_ct_PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PKG_CONFIG" >&5 printf "%s\n" "$ac_ct_PKG_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$ac_ct_PKG_CONFIG" && break done if test "x$ac_ct_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_ct_PKG_CONFIG fi fi fi if test -n "$PKG_CONFIG" ; then pkg_min_version=0.16.0 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking $PKG_CONFIG is at least version $pkg_min_version" >&5 printf %s "checking $PKG_CONFIG is at least version $pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $pkg_min_version ; then pkg_version=`$PKG_CONFIG --version` { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes: $pkg_version" >&5 printf "%s\n" "yes: $pkg_version" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } PKG_CONFIG="" fi fi if test -n "$PKG_CONFIG" && $PKG_CONFIG --atleast-pkgconfig-version 0.20 ; then pkg_short_errors=" --short-errors " else pkg_short_errors="" fi pkg_static= if test -n "$PKG_CONFIG" ; then case "$LDFLAGS" in "-static" | "* -static*" ) pkg_static=--static ;; esac fi if test -n "$PKG_CONFIG"; then COIN_HAS_PKGCONFIG_TRUE= COIN_HAS_PKGCONFIG_FALSE='#' else COIN_HAS_PKGCONFIG_TRUE='#' COIN_HAS_PKGCONFIG_FALSE= fi COIN_PKG_CONFIG_PATH="${PKG_CONFIG_PATH}" COIN_PKG_CONFIG_PATH="${expanded_libdir}/pkgconfig:${COIN_PKG_CONFIG_PATH}" if test -n "$PKG_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $PKG_CONFIG path is \"$COIN_PKG_CONFIG_PATH\"" >&5 printf "%s\n" "$as_me: $PKG_CONFIG path is \"$COIN_PKG_CONFIG_PATH\"" >&6;} fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for LAPACK" >&5 printf %s "checking for LAPACK... " >&6; } # Check whether --with-lapack was given. if test ${with_lapack+y} then : withval=$with_lapack; fi # Check whether --with-lapack-lflags was given. if test ${with_lapack_lflags+y} then : withval=$with_lapack_lflags; fi coin_has_lapack=no lapack_keep_looking=yes if test "$with_lapack" != "no" ; then if test "$with_lapack" != "yes" && test -z "$with_lapack_lflags" ; then with_lapack_lflags="$with_lapack" fi if test -n "$with_lapack_lflags" ; then ac_save_LIBS="$LIBS" LIBS="$with_lapack_lflags $LIBS" dsyev_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=dsyev ;; "upper case") ac_name=DSYEV ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then coin_has_lapack=yes lapack_what="user-specified ($with_lapack_lflags)" lapack_keep_looking=no lapack_lflags=$with_lapack_lflags else as_fn_error $? "Cannot link to user-specified Lapack $with_lapack_lflags." "$LINENO" 5 fi fi else lapack_keep_looking=no lapack_what="user-specified" fi if test "$lapack_keep_looking" = yes ; then case $build in *-linux*) case " int$intsize " in *\ int64\ * ) coin_mkl="-lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lm" ;; *) coin_mkl="-lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lm" ;; esac ac_save_LIBS="$LIBS" LIBS="$coin_mkl $LIBS" dsyev_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=dsyev ;; "upper case") ac_name=DSYEV ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then coin_has_lapack=yes lapack_lflags="$coin_mkl" lapack_what="Intel MKL ($lapack_lflags)" fi ;; *-*-solaris*) case " int$intsize " in *\ int64\ * ) ;; *) ac_save_LIBS="$LIBS" LIBS="-lsunperf $LIBS" dsyev_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=dsyev ;; "upper case") ac_name=DSYEV ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then coin_has_lapack=yes lapack_lflags=-lsunperf lapack_what="Sun Performance Library ($lapack_lflags)" fi ;; esac ;; *-cygwin* | *-mingw* | *-msys*) old_IFS="$IFS" IFS=";" coin_mkl="" for d in $LIB ; do # turn $d into unix-style short path (no spaces); cannot do -us, # so first do -ws, then -u d=`cygpath -ws "$d"` d=`cygpath -u "$d"` if test "$enable_shared" = yes ; then if test -e "$d/mkl_core_dll.lib" ; then case " int$intsize " in *\ int64\ * ) coin_mkl="$d/mkl_intel_ilp64_dll.lib $d/mkl_sequential_dll.lib $d/mkl_core_dll.lib" ;; *) coin_mkl="$d/mkl_intel_lp64_dll.lib $d/mkl_sequential_dll.lib $d/mkl_core_dll.lib" ;; esac break fi else if test -e "$d/mkl_core.lib" ; then case " int$intsize " in *\ int64\ * ) coin_mkl="$d/mkl_intel_ilp64.lib $d/mkl_sequential.lib $d/mkl_core.lib" ;; *) coin_mkl="$d/mkl_intel_lp64.lib $d/mkl_sequential.lib $d/mkl_core.lib" ;; esac break fi fi done IFS="$old_IFS" if test -n "$coin_mkl" ; then ac_save_LIBS="$LIBS" LIBS="$coin_mkl $LIBS" dsyev_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=dsyev ;; "upper case") ac_name=DSYEV ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then coin_has_lapack=yes lapack_lflags="$coin_mkl" lapack_what="Intel MKL ($lapack_lflags)" fi fi ;; *-darwin*) case " int$intsize " in *\ int64\ * ) coin_mkl="-lmkl_intel_ilp64 -lmkl_sequential -lmkl_core -lm" ;; *) coin_mkl="-lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lm" ;; esac ac_save_LIBS="$LIBS" LIBS="$coin_mkl $LIBS" dsyev_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=dsyev ;; "upper case") ac_name=DSYEV ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then coin_has_lapack=yes lapack_lflags="$coin_mkl" lapack_what="Intel MKL ($lapack_lflags)" fi if test "$coin_has_lapack" = no ; then case " int$intsize " in *\ int64\ * ) ;; *) ac_save_LIBS="$LIBS" LIBS="-framework Accelerate $LIBS" dsyev_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=dsyev ;; "upper case") ac_name=DSYEV ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then coin_has_lapack=yes lapack_lflags="-framework Accelerate" lapack_what="Accelerate framework ($lapack_lflags)" fi ;; esac fi ;; esac if test "$coin_has_lapack" = yes ; then lapack_keep_looking=no fi fi if test "$lapack_keep_looking" = yes ; then case " int$intsize " in *\ int64\ * ) ;; *) if test -n "$PKG_CONFIG" ; then if PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --exists "lapack blas" ; then LAPACK_VERSIONS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --modversion "lapack blas" 2>/dev/null | tr '\n' ' '` lapack_what="generic module (lapack.pc blas.pc)" ac_save_LIBS="$LIBS" if test -n "lapack" ; then temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs $pkg_static lapack` LIBS="$temp_LFLAGS $LIBS" fi dsyev_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=dsyev ;; "upper case") ac_name=DSYEV ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then coin_has_lapack=yes lapack_keep_looking=no lapack_pcfiles="lapack blas" else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: lapack.pc and blas.pc present, but could not find dsyev when trying to link with LAPACK." >&5 printf "%s\n" "$as_me: WARNING: lapack.pc and blas.pc present, but could not find dsyev when trying to link with LAPACK." >&2;} fi else LAPACK_PKG_ERRORS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG $pkg_short_errors --errors-to-stdout --print-errors "lapack blas"` fi else as_fn_error $? "\"Cannot check for existence of module lapack without pkgconf\"" "$LINENO" 5 fi ;; esac fi if test "$lapack_keep_looking" = yes ; then case " int$intsize " in *\ int64\ * ) coin_lapack="-llapack64 -lblas64" ;; *) coin_lapack="-llapack -lblas" ;; esac ac_save_LIBS="$LIBS" LIBS="$coin_lapack $LIBS" dsyev_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=dsyev ;; "upper case") ac_name=DSYEV ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : dsyev_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then coin_has_lapack=yes lapack_lflags="$coin_lapack" lapack_what="generic library ($lapack_lflags)" fi fi case "$coin_has_lapack" in yes) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_lapack: $lapack_what" >&5 printf "%s\n" "$coin_has_lapack: $lapack_what" >&6; } ;; no) if test -n "$lapack_what" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_lapack ($lapack_what)" >&5 printf "%s\n" "$coin_has_lapack ($lapack_what)" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_lapack" >&5 printf "%s\n" "$coin_has_lapack" >&6; } fi ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: CHK_LAPACK: unexpected result '$coin_has_lapack'" >&5 printf "%s\n" "$as_me: WARNING: CHK_LAPACK: unexpected result '$coin_has_lapack'" >&2;} ;; esac if test $coin_has_lapack = yes; then COIN_HAS_LAPACK_TRUE= COIN_HAS_LAPACK_FALSE='#' else COIN_HAS_LAPACK_TRUE='#' COIN_HAS_LAPACK_FALSE= fi if test $coin_has_lapack = yes ; then printf "%s\n" "#define IPOPT_HAS_LAPACK 1" >>confdefs.h case "${dsyev_namemangling}" in "lower case, no underscore, no extra underscore") printf "%s\n" "#define IPOPT_LAPACK_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define IPOPT_LAPACK_FUNC_(name,NAME) name" >>confdefs.h ;; "lower case, no underscore, extra underscore") printf "%s\n" "#define IPOPT_LAPACK_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define IPOPT_LAPACK_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, no extra underscore") printf "%s\n" "#define IPOPT_LAPACK_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define IPOPT_LAPACK_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, extra underscore") printf "%s\n" "#define IPOPT_LAPACK_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define IPOPT_LAPACK_FUNC_(name,NAME) name ## __" >>confdefs.h ;; "upper case, no underscore, no extra underscore") printf "%s\n" "#define IPOPT_LAPACK_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define IPOPT_LAPACK_FUNC_(name,NAME) NAME" >>confdefs.h ;; "upper case, no underscore, extra underscore") printf "%s\n" "#define IPOPT_LAPACK_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define IPOPT_LAPACK_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, no extra underscore") printf "%s\n" "#define IPOPT_LAPACK_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define IPOPT_LAPACK_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, extra underscore") printf "%s\n" "#define IPOPT_LAPACK_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define IPOPT_LAPACK_FUNC_(name,NAME) NAME ## __" >>confdefs.h ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Unsupported or unknown name-mangling scheme: ${dsyev_namemangling}" >&5 printf "%s\n" "$as_me: WARNING: Unsupported or unknown name-mangling scheme: ${dsyev_namemangling}" >&2;} ;; esac if test -n "$lapack_pcfiles" ; then IPOPTLIB_PCFILES="$lapack_pcfiles $IPOPTLIB_PCFILES" fi IPOPTLIB_LFLAGS="$lapack_lflags $IPOPTLIB_LFLAGS" fi if test $coin_has_lapack != yes; then as_fn_error $? "Required package LAPACK not found." "$LINENO" 5 # AC_MSG_WARN([Compiling code without LAPACK. Certain options (e.g., quasi-Newton) will not work.]) fi # check for ASL only if building for double precision if test $precision = double ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for package ASL" >&5 printf %s "checking for package ASL... " >&6; } coin_has_asl=noInfo if test x"$COIN_SKIP_PROJECTS" != x ; then for pkg in `echo $COIN_SKIP_PROJECTS | tr '[:upper:]' '[:lower:]'` ; do if test "$pkg" = "asl" ; then coin_has_asl=skipping fi done fi if test "$coin_has_asl" != skipping ; then # Check whether --with-asl was given. if test ${with_asl+y} then : withval=$with_asl; fi # Check whether --with-asl-lflags was given. if test ${with_asl_lflags+y} then : withval=$with_asl_lflags; fi # Check whether --with-asl-cflags was given. if test ${with_asl_cflags+y} then : withval=$with_asl_cflags; fi coin_has_asl=requested asl_lflags= asl_cflags= asl_data= asl_pcfiles="coinasl" withval="$with_asl" if test -n "$withval" ; then case "$withval" in no ) coin_has_asl=skipping asl_failmode='command line' ;; yes ) coin_has_asl=requested asl_failmode='' ;; build ) coin_has_asl=requested asl_build=yes asl_failmode='' ;; * ) coin_has_asl=requested asl_failmode='' asl_lflags="$withval" asl_pcfiles='' ;; esac else if test -n "$with_asl_lflags" || test -n "$with_asl_cflags" || test -n "$with_asl_data" ; then coin_has_asl=requested asl_failmode='' asl_pcfiles='' fi fi if test "$coin_has_asl" != skipping ; then withval="$with_asl_lflags" if test -n "$withval" ; then case "$withval" in build | no | yes ) as_fn_error $? "\"$withval\" is not useful here; please specify link flags appropriate for your environment." "$LINENO" 5 ;; * ) coin_has_asl=yes asl_lflags="$withval" asl_pcfiles='' ;; esac fi withval="$with_asl_cflags" if test -n "$withval" ; then case "$withval" in build | no | yes ) as_fn_error $? "\"$withval\" is not useful here; please specify compile flags appropriate for your environment." "$LINENO" 5 ;; * ) coin_has_asl=yes asl_cflags="$withval" asl_pcfiles='' ;; esac fi fi if test $coin_has_asl = requested ; then if test -n "$PKG_CONFIG" ; then if test x"$asl_build" = xyes ; then pcfile="coin$asl_pcfiles" if test -n "$PKG_CONFIG" ; then if PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --exists "$pcfile" ; then ASL_VERSIONS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --modversion "$pcfile" 2>/dev/null | tr '\n' ' '` coin_has_asl=yes else ASL_PKG_ERRORS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG $pkg_short_errors --errors-to-stdout --print-errors "$pcfile"` coin_has_asl=no fi else as_fn_error $? "\"Cannot check for existence of module asl without pkgconf\"" "$LINENO" 5 fi fi if ! test $coin_has_asl = yes ; then pcfile="$asl_pcfiles" if test -n "$PKG_CONFIG" ; then if PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --exists "$pcfile" ; then ASL_VERSIONS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --modversion "$pcfile" 2>/dev/null | tr '\n' ' '` coin_has_asl=yes else ASL_PKG_ERRORS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG $pkg_short_errors --errors-to-stdout --print-errors "$pcfile"` coin_has_asl=no fi else as_fn_error $? "\"Cannot check for existence of module asl without pkgconf\"" "$LINENO" 5 fi fi if test $coin_has_asl = yes ; then asl_data=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --variable=datadir "$pcfile" 2>/dev/null` asl_pcfiles="$pcfile" fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Check for asl via pkg-config could not be performed as there is no pkg-config available. Consider installing pkg-config or provide appropriate values for --with-asl-lflags and --with-asl-cflags." >&5 printf "%s\n" "$as_me: WARNING: Check for asl via pkg-config could not be performed as there is no pkg-config available. Consider installing pkg-config or provide appropriate values for --with-asl-lflags and --with-asl-cflags." >&2;} coin_has_asl=no fi fi if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: FIND_PRIM_PKG result for asl: \"$coin_has_asl\"" >&5 printf "%s\n" "$as_me: FIND_PRIM_PKG result for asl: \"$coin_has_asl\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Collected values for package 'asl'" >&5 printf "%s\n" "$as_me: Collected values for package 'asl'" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: asl_lflags is \"$asl_lflags\"" >&5 printf "%s\n" "$as_me: asl_lflags is \"$asl_lflags\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: asl_cflags is \"$asl_cflags\"" >&5 printf "%s\n" "$as_me: asl_cflags is \"$asl_cflags\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: asl_data is \"$asl_data\"" >&5 printf "%s\n" "$as_me: asl_data is \"$asl_data\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: asl_pcfiles is \"$asl_pcfiles\"" >&5 printf "%s\n" "$as_me: asl_pcfiles is \"$asl_pcfiles\"" >&6;} fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_asl" >&5 printf "%s\n" "$coin_has_asl" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_asl (COIN_SKIP_PROJECTS)" >&5 printf "%s\n" "$coin_has_asl (COIN_SKIP_PROJECTS)" >&6; } fi if test "$coin_has_asl" != yes ; then coin_has_asl=no fi if test $coin_has_asl = yes; then COIN_HAS_ASL_TRUE= COIN_HAS_ASL_FALSE='#' else COIN_HAS_ASL_TRUE='#' COIN_HAS_ASL_FALSE= fi if test $coin_has_asl = yes ; then printf "%s\n" "#define IPOPT_HAS_ASL 1" >>confdefs.h IPOPTAMPLINTERFACELIB_PCFILES="$asl_pcfiles $IPOPTAMPLINTERFACELIB_PCFILES" IPOPTAMPLINTERFACELIB_LFLAGS="$asl_lflags $IPOPTAMPLINTERFACELIB_LFLAGS" IPOPTAMPLINTERFACELIB_CFLAGS="$asl_cflags $IPOPTAMPLINTERFACELIB_CFLAGS" SIPOPTAMPLINTERFACELIB_PCFILES="$asl_pcfiles $SIPOPTAMPLINTERFACELIB_PCFILES" SIPOPTAMPLINTERFACELIB_LFLAGS="$asl_lflags $SIPOPTAMPLINTERFACELIB_LFLAGS" SIPOPTAMPLINTERFACELIB_CFLAGS="$asl_cflags $SIPOPTAMPLINTERFACELIB_CFLAGS" fi else if false; then COIN_HAS_ASL_TRUE= COIN_HAS_ASL_FALSE='#' else COIN_HAS_ASL_TRUE='#' COIN_HAS_ASL_FALSE= fi fi ######### # MUMPS # ######### { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for package Mumps" >&5 printf %s "checking for package Mumps... " >&6; } coin_has_mumps=noInfo if test x"$COIN_SKIP_PROJECTS" != x ; then for pkg in `echo $COIN_SKIP_PROJECTS | tr '[:upper:]' '[:lower:]'` ; do if test "$pkg" = "mumps" ; then coin_has_mumps=skipping fi done fi if test "$coin_has_mumps" != skipping ; then # Check whether --with-mumps was given. if test ${with_mumps+y} then : withval=$with_mumps; fi # Check whether --with-mumps-lflags was given. if test ${with_mumps_lflags+y} then : withval=$with_mumps_lflags; fi # Check whether --with-mumps-cflags was given. if test ${with_mumps_cflags+y} then : withval=$with_mumps_cflags; fi coin_has_mumps=requested mumps_lflags= mumps_cflags= mumps_data= mumps_pcfiles="coinmumps" withval="$with_mumps" if test -n "$withval" ; then case "$withval" in no ) coin_has_mumps=skipping mumps_failmode='command line' ;; yes ) coin_has_mumps=requested mumps_failmode='' ;; build ) coin_has_mumps=requested mumps_build=yes mumps_failmode='' ;; * ) coin_has_mumps=requested mumps_failmode='' mumps_lflags="$withval" mumps_pcfiles='' ;; esac else if test -n "$with_mumps_lflags" || test -n "$with_mumps_cflags" || test -n "$with_mumps_data" ; then coin_has_mumps=requested mumps_failmode='' mumps_pcfiles='' fi fi if test "$coin_has_mumps" != skipping ; then withval="$with_mumps_lflags" if test -n "$withval" ; then case "$withval" in build | no | yes ) as_fn_error $? "\"$withval\" is not useful here; please specify link flags appropriate for your environment." "$LINENO" 5 ;; * ) coin_has_mumps=yes mumps_lflags="$withval" mumps_pcfiles='' ;; esac fi withval="$with_mumps_cflags" if test -n "$withval" ; then case "$withval" in build | no | yes ) as_fn_error $? "\"$withval\" is not useful here; please specify compile flags appropriate for your environment." "$LINENO" 5 ;; * ) coin_has_mumps=yes mumps_cflags="$withval" mumps_pcfiles='' ;; esac fi fi if test $coin_has_mumps = requested ; then if test -n "$PKG_CONFIG" ; then if test x"$mumps_build" = xyes ; then pcfile="coin$mumps_pcfiles" if test -n "$PKG_CONFIG" ; then if PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --exists "$pcfile" ; then MUMPS_VERSIONS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --modversion "$pcfile" 2>/dev/null | tr '\n' ' '` coin_has_mumps=yes else MUMPS_PKG_ERRORS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG $pkg_short_errors --errors-to-stdout --print-errors "$pcfile"` coin_has_mumps=no fi else as_fn_error $? "\"Cannot check for existence of module mumps without pkgconf\"" "$LINENO" 5 fi fi if ! test $coin_has_mumps = yes ; then pcfile="$mumps_pcfiles" if test -n "$PKG_CONFIG" ; then if PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --exists "$pcfile" ; then MUMPS_VERSIONS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --modversion "$pcfile" 2>/dev/null | tr '\n' ' '` coin_has_mumps=yes else MUMPS_PKG_ERRORS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG $pkg_short_errors --errors-to-stdout --print-errors "$pcfile"` coin_has_mumps=no fi else as_fn_error $? "\"Cannot check for existence of module mumps without pkgconf\"" "$LINENO" 5 fi fi if test $coin_has_mumps = yes ; then mumps_data=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --variable=datadir "$pcfile" 2>/dev/null` mumps_pcfiles="$pcfile" fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Check for mumps via pkg-config could not be performed as there is no pkg-config available. Consider installing pkg-config or provide appropriate values for --with-mumps-lflags and --with-mumps-cflags." >&5 printf "%s\n" "$as_me: WARNING: Check for mumps via pkg-config could not be performed as there is no pkg-config available. Consider installing pkg-config or provide appropriate values for --with-mumps-lflags and --with-mumps-cflags." >&2;} coin_has_mumps=no fi fi if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: FIND_PRIM_PKG result for mumps: \"$coin_has_mumps\"" >&5 printf "%s\n" "$as_me: FIND_PRIM_PKG result for mumps: \"$coin_has_mumps\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Collected values for package 'mumps'" >&5 printf "%s\n" "$as_me: Collected values for package 'mumps'" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: mumps_lflags is \"$mumps_lflags\"" >&5 printf "%s\n" "$as_me: mumps_lflags is \"$mumps_lflags\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: mumps_cflags is \"$mumps_cflags\"" >&5 printf "%s\n" "$as_me: mumps_cflags is \"$mumps_cflags\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: mumps_data is \"$mumps_data\"" >&5 printf "%s\n" "$as_me: mumps_data is \"$mumps_data\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: mumps_pcfiles is \"$mumps_pcfiles\"" >&5 printf "%s\n" "$as_me: mumps_pcfiles is \"$mumps_pcfiles\"" >&6;} fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_mumps" >&5 printf "%s\n" "$coin_has_mumps" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_mumps (COIN_SKIP_PROJECTS)" >&5 printf "%s\n" "$coin_has_mumps (COIN_SKIP_PROJECTS)" >&6; } fi if test "$coin_has_mumps" != yes ; then coin_has_mumps=no fi if test $coin_has_mumps = yes; then COIN_HAS_MUMPS_TRUE= COIN_HAS_MUMPS_FALSE='#' else COIN_HAS_MUMPS_TRUE='#' COIN_HAS_MUMPS_FALSE= fi if test $coin_has_mumps = yes ; then printf "%s\n" "#define IPOPT_HAS_MUMPS 1" >>confdefs.h IPOPTLIB_PCFILES="$mumps_pcfiles $IPOPTLIB_PCFILES" IPOPTLIB_LFLAGS="$mumps_lflags $IPOPTLIB_LFLAGS" IPOPTLIB_CFLAGS="$mumps_cflags $IPOPTLIB_CFLAGS" fi # Check whether MPI_Initialized is available # we assume that MPI_Finalized is present if MPI_Initialized is present ac_fn_c_check_func "$LINENO" "MPI_Initialized" "ac_cv_func_MPI_Initialized" if test "x$ac_cv_func_MPI_Initialized" = xyes then : printf "%s\n" "#define HAVE_MPI_INITIALIZED 1" >>confdefs.h fi # Check whether --enable-mpiinit was given. if test ${enable_mpiinit+y} then : enableval=$enable_mpiinit; case "$enableval" in no | yes) ;; *) as_fn_error $? "invalid argument for --enable-mpiinit: $enableval" "$LINENO" 5;; esac mpiinit=$enableval else case e in #( e) mpiinit=yes ;; esac fi if test $mpiinit = yes ; then printf "%s\n" "#define IPOPT_MPIINIT 1" >>confdefs.h fi ####### # HSL # ####### if test $intsize = 32 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for package HSL" >&5 printf %s "checking for package HSL... " >&6; } coin_has_hsl=noInfo if test x"$COIN_SKIP_PROJECTS" != x ; then for pkg in `echo $COIN_SKIP_PROJECTS | tr '[:upper:]' '[:lower:]'` ; do if test "$pkg" = "hsl" ; then coin_has_hsl=skipping fi done fi if test "$coin_has_hsl" != skipping ; then # Check whether --with-hsl was given. if test ${with_hsl+y} then : withval=$with_hsl; fi # Check whether --with-hsl-lflags was given. if test ${with_hsl_lflags+y} then : withval=$with_hsl_lflags; fi # Check whether --with-hsl-cflags was given. if test ${with_hsl_cflags+y} then : withval=$with_hsl_cflags; fi coin_has_hsl=requested hsl_lflags= hsl_cflags= hsl_data= hsl_pcfiles="coinhsl" withval="$with_hsl" if test -n "$withval" ; then case "$withval" in no ) coin_has_hsl=skipping hsl_failmode='command line' ;; yes ) coin_has_hsl=requested hsl_failmode='' ;; build ) coin_has_hsl=requested hsl_build=yes hsl_failmode='' ;; * ) coin_has_hsl=requested hsl_failmode='' hsl_lflags="$withval" hsl_pcfiles='' ;; esac else if test -n "$with_hsl_lflags" || test -n "$with_hsl_cflags" || test -n "$with_hsl_data" ; then coin_has_hsl=requested hsl_failmode='' hsl_pcfiles='' fi fi if test "$coin_has_hsl" != skipping ; then withval="$with_hsl_lflags" if test -n "$withval" ; then case "$withval" in build | no | yes ) as_fn_error $? "\"$withval\" is not useful here; please specify link flags appropriate for your environment." "$LINENO" 5 ;; * ) coin_has_hsl=yes hsl_lflags="$withval" hsl_pcfiles='' ;; esac fi withval="$with_hsl_cflags" if test -n "$withval" ; then case "$withval" in build | no | yes ) as_fn_error $? "\"$withval\" is not useful here; please specify compile flags appropriate for your environment." "$LINENO" 5 ;; * ) coin_has_hsl=yes hsl_cflags="$withval" hsl_pcfiles='' ;; esac fi fi if test $coin_has_hsl = requested ; then if test -n "$PKG_CONFIG" ; then if test x"$hsl_build" = xyes ; then pcfile="coin$hsl_pcfiles" if test -n "$PKG_CONFIG" ; then if PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --exists "$pcfile" ; then HSL_VERSIONS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --modversion "$pcfile" 2>/dev/null | tr '\n' ' '` coin_has_hsl=yes else HSL_PKG_ERRORS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG $pkg_short_errors --errors-to-stdout --print-errors "$pcfile"` coin_has_hsl=no fi else as_fn_error $? "\"Cannot check for existence of module hsl without pkgconf\"" "$LINENO" 5 fi fi if ! test $coin_has_hsl = yes ; then pcfile="$hsl_pcfiles" if test -n "$PKG_CONFIG" ; then if PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --exists "$pcfile" ; then HSL_VERSIONS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --modversion "$pcfile" 2>/dev/null | tr '\n' ' '` coin_has_hsl=yes else HSL_PKG_ERRORS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG $pkg_short_errors --errors-to-stdout --print-errors "$pcfile"` coin_has_hsl=no fi else as_fn_error $? "\"Cannot check for existence of module hsl without pkgconf\"" "$LINENO" 5 fi fi if test $coin_has_hsl = yes ; then hsl_data=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --variable=datadir "$pcfile" 2>/dev/null` hsl_pcfiles="$pcfile" fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Check for hsl via pkg-config could not be performed as there is no pkg-config available. Consider installing pkg-config or provide appropriate values for --with-hsl-lflags and --with-hsl-cflags." >&5 printf "%s\n" "$as_me: WARNING: Check for hsl via pkg-config could not be performed as there is no pkg-config available. Consider installing pkg-config or provide appropriate values for --with-hsl-lflags and --with-hsl-cflags." >&2;} coin_has_hsl=no fi fi if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: FIND_PRIM_PKG result for hsl: \"$coin_has_hsl\"" >&5 printf "%s\n" "$as_me: FIND_PRIM_PKG result for hsl: \"$coin_has_hsl\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Collected values for package 'hsl'" >&5 printf "%s\n" "$as_me: Collected values for package 'hsl'" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: hsl_lflags is \"$hsl_lflags\"" >&5 printf "%s\n" "$as_me: hsl_lflags is \"$hsl_lflags\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: hsl_cflags is \"$hsl_cflags\"" >&5 printf "%s\n" "$as_me: hsl_cflags is \"$hsl_cflags\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: hsl_data is \"$hsl_data\"" >&5 printf "%s\n" "$as_me: hsl_data is \"$hsl_data\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: hsl_pcfiles is \"$hsl_pcfiles\"" >&5 printf "%s\n" "$as_me: hsl_pcfiles is \"$hsl_pcfiles\"" >&6;} fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_hsl" >&5 printf "%s\n" "$coin_has_hsl" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_hsl (COIN_SKIP_PROJECTS)" >&5 printf "%s\n" "$coin_has_hsl (COIN_SKIP_PROJECTS)" >&6; } fi if test "$coin_has_hsl" != yes ; then coin_has_hsl=no fi if test $coin_has_hsl = yes; then COIN_HAS_HSL_TRUE= COIN_HAS_HSL_FALSE='#' else COIN_HAS_HSL_TRUE='#' COIN_HAS_HSL_FALSE= fi if test $coin_has_hsl = yes ; then printf "%s\n" "#define IPOPT_HAS_HSL 1" >>confdefs.h IPOPTLIB_PCFILES="$hsl_pcfiles $IPOPTLIB_PCFILES" IPOPTLIB_LFLAGS="$hsl_lflags $IPOPTLIB_LFLAGS" IPOPTLIB_CFLAGS="$hsl_cflags $IPOPTLIB_CFLAGS" HSLLIB_PCFILES="$hsl_pcfiles $HSLLIB_PCFILES" HSLLIB_LFLAGS="$hsl_lflags $HSLLIB_LFLAGS" HSLLIB_CFLAGS="$hsl_cflags $HSLLIB_CFLAGS" fi else coin_has_hsl=no if false; then COIN_HAS_HSL_TRUE= COIN_HAS_HSL_FALSE='#' else COIN_HAS_HSL_TRUE='#' COIN_HAS_HSL_FALSE= fi fi have_ma28=no if test "$coin_has_hsl" = yes ; then if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: FINALIZE_FLAGS for HSLLib:" >&5 printf "%s\n" "$as_me: FINALIZE_FLAGS for HSLLib:" >&6;} fi HSLLIB_LFLAGS_NOPC=$HSLLIB_LFLAGS HSLLIB_CFLAGS_NOPC=$HSLLIB_CFLAGS if test -n "${HSLLIB_PCFILES}" ; then temp_CFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --cflags ${HSLLIB_PCFILES}` temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs $pkg_static ${HSLLIB_PCFILES}` HSLLIB_CFLAGS="$temp_CFLAGS ${HSLLIB_CFLAGS}" HSLLIB_LFLAGS="$temp_LFLAGS ${HSLLIB_LFLAGS}" fi # setup XYZ_EXPORT symbol for library users libexport_attribute= if test "$enable_shared" = yes ; then case $build_os in cygwin* | mingw* | msys* | cegcc* ) libexport_attribute="__declspec(dllimport)" if test "$enable_static" = yes ; then as_fn_error $? "Cannot do DLL and static LIB builds simultaneously. Do not add --enable-static without --disable-shared." "$LINENO" 5 fi ;; esac fi printf "%s\n" "#define HSLLIB_EXPORT $libexport_attribute" >>confdefs.h # add -DXYZ_BUILD to XYZ_CFLAGS HSLLIB_CFLAGS="${HSLLIB_CFLAGS} -DHSLLIB_BUILD" # Define BUILDTOOLS_DEBUG to enable debugging output if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: HSLLIB_LFLAGS_NOPC: \"${HSLLIB_LFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: HSLLIB_LFLAGS_NOPC: \"${HSLLIB_LFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: HSLLIB_CFLAGS_NOPC: \"${HSLLIB_CFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: HSLLIB_CFLAGS_NOPC: \"${HSLLIB_CFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: adding \"${HSLLIB_PCFILES}\"" >&5 printf "%s\n" "$as_me: adding \"${HSLLIB_PCFILES}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: HSLLIB_LFLAGS: \"${HSLLIB_LFLAGS}\"" >&5 printf "%s\n" "$as_me: HSLLIB_LFLAGS: \"${HSLLIB_LFLAGS}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: HSLLIB_CFLAGS: \"${HSLLIB_CFLAGS}\"" >&5 printf "%s\n" "$as_me: HSLLIB_CFLAGS: \"${HSLLIB_CFLAGS}\"" >&6;} fi case $precision in single ) ma27func=ma27a MA27FUNC=MA27A ;; double ) ma27func=ma27ad MA27FUNC=MA27AD ;; * ) as_fn_error $? "HSL cannot be used with --with-precision=$precision" "$LINENO" 5 ;; esac ac_save_LIBS="$LIBS" LIBS="$HSLLIB_LFLAGS $LIBS" ma27ad_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=ma27ad ;; "upper case") ac_name=MA27AD ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 printf %s "checking for function $ac_name in $LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ma27ad_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 printf "%s\n" "$ac_success" >&6; } if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then case "$ma27ad_namemangling" in "lower case, no underscore, no extra underscore") printf "%s\n" "#define IPOPT_HSL_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define IPOPT_HSL_FUNC_(name,NAME) name" >>confdefs.h ;; "lower case, no underscore, extra underscore") printf "%s\n" "#define IPOPT_HSL_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define IPOPT_HSL_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, no extra underscore") printf "%s\n" "#define IPOPT_HSL_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define IPOPT_HSL_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, extra underscore") printf "%s\n" "#define IPOPT_HSL_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define IPOPT_HSL_FUNC_(name,NAME) name ## __" >>confdefs.h ;; "upper case, no underscore, no extra underscore") printf "%s\n" "#define IPOPT_HSL_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define IPOPT_HSL_FUNC_(name,NAME) NAME" >>confdefs.h ;; "upper case, no underscore, extra underscore") printf "%s\n" "#define IPOPT_HSL_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define IPOPT_HSL_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, no extra underscore") printf "%s\n" "#define IPOPT_HSL_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define IPOPT_HSL_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, extra underscore") printf "%s\n" "#define IPOPT_HSL_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define IPOPT_HSL_FUNC_(name,NAME) NAME ## __" >>confdefs.h ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Unsupported or unknown name-mangling scheme: $ma27ad_namemangling" >&5 printf "%s\n" "$as_me: WARNING: Unsupported or unknown name-mangling scheme: $ma27ad_namemangling" >&2;} ;; esac else as_fn_error $? "Provided package HSL is not working or does not contain MA27. See config.log for details on failed checks." "$LINENO" 5 fi # extra check for MA28(s), since that decides whether we have to build IpMa28(s)Partition.F if test -n "$F77" ; then case $precision in single ) ac_save_LIBS="$LIBS" LIBS="$HSLLIB_LFLAGS $LIBS" ma28a_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=ma28a ;; "upper case") ac_name=MA28A ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 printf %s "checking for function $ac_name in $LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ma28a_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 printf "%s\n" "$ac_success" >&6; } if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then if test "$ma28a_namemangling" != "$ac_cv_f77_mangling" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Name mangling of MA28 different than Fortran. This will not link. Disabling MA28" >&5 printf "%s\n" "$as_me: WARNING: Name mangling of MA28 different than Fortran. This will not link. Disabling MA28" >&2;} else have_ma28=yes fi fi ;; double ) ac_save_LIBS="$LIBS" LIBS="$HSLLIB_LFLAGS $LIBS" ma28ad_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=ma28ad ;; "upper case") ac_name=MA28AD ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 printf %s "checking for function $ac_name in $LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ma28ad_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 printf "%s\n" "$ac_success" >&6; } if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then if test "$ma28ad_namemangling" != "$ac_cv_f77_mangling" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Name mangling of MA28 different than Fortran. This will not link. Disabling MA28" >&5 printf "%s\n" "$as_me: WARNING: Name mangling of MA28 different than Fortran. This will not link. Disabling MA28" >&2;} else have_ma28=yes fi fi ;; * ) as_fn_error $? "HSL cannot be used with --with-precision=$precision" "$LINENO" 5 ;; esac fi fi if test "$have_ma28" = yes; then HAVE_MA28_TRUE= HAVE_MA28_FALSE='#' else HAVE_MA28_TRUE='#' HAVE_MA28_FALSE= fi ########### # PARDISO # ########### if test $intsize = 32 ; then # Check whether --with-pardiso was given. if test ${with_pardiso+y} then : withval=$with_pardiso; case "$withval" in no) have_pardiso_project=no ;; # so with_pardiso=no yes) as_fn_error $? "\"expected filename as argument for --with-pardiso\"" "$LINENO" 5 ;; *) printf "%s\n" "#define PARDISO_LIB \"$withval\"" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Pardiso from pardiso-project.org specified as $withval" >&5 printf "%s\n" "$as_me: Pardiso from pardiso-project.org specified as $withval" >&6;} have_pardiso_project=yes ;; esac else case e in #( e) have_pardiso_project=no ;; esac fi fi # check whether Pardiso is available via Lapack, which should then be MKL # Check whether --enable-pardisomkl was given. if test ${enable_pardisomkl+y} then : enableval=$enable_pardisomkl; case "$enableval" in no | yes) ;; *) as_fn_error $? "invalid argument for --enable-pardisomkl: $enableval" "$LINENO" 5;; esac checkpardisomkl=$enableval else case e in #( e) checkpardisomkl=yes ;; esac fi have_pardiso_mkl=no if test $checkpardisomkl = yes ; then ac_save_LIBS="$LIBS" LIBS="$lapack_lflags $LIBS" if test -n "$lapack_pcfiles" ; then temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs $pkg_static $lapack_pcfiles` LIBS="$temp_LFLAGS $LIBS" fi pardiso_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=pardiso ;; "upper case") ac_name=PARDISO ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 printf %s "checking for function $ac_name in $LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : pardiso_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 printf "%s\n" "$ac_success" >&6; } if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then have_pardiso_mkl=yes printf "%s\n" "#define IPOPT_HAS_PARDISO_MKL 1" >>confdefs.h fi fi if test "$have_pardiso_mkl" = yes; then HAVE_PARDISO_MKL_TRUE= HAVE_PARDISO_MKL_FALSE='#' else HAVE_PARDISO_MKL_TRUE='#' HAVE_PARDISO_MKL_FALSE= fi ######### # SPRAL # ######### # check for Spral only if building for double precision and 32-bit integers # spral_ssids seems to support more than 2^31 nonzeros in a matrix, but not dimensions > 2^31 if test $precision$intsize = double32 ; then ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for library Spral with combined link and compile check" >&5 printf %s "checking for library Spral with combined link and compile check... " >&6; } coin_has_spral=noInfo if test x"$COIN_SKIP_PROJECTS" != x ; then for pkg in `echo $COIN_SKIP_PROJECTS | tr '[:upper:]' '[:lower:]'` ; do if test "$pkg" = "spral" ; then coin_has_spral=skipping fi done fi if test "$coin_has_spral" != skipping ; then # Check whether --with-spral was given. if test ${with_spral+y} then : withval=$with_spral; fi # Check whether --with-spral-lflags was given. if test ${with_spral_lflags+y} then : withval=$with_spral_lflags; fi # Check whether --with-spral-cflags was given. if test ${with_spral_cflags+y} then : withval=$with_spral_cflags; fi spral_lflags="" spral_cflags="" spral_data="" coin_has_spral=skipping spral_failmode='default' spral_userflags='no' withval="$with_spral" if test -n "$withval" ; then case "$withval" in no ) coin_has_spral=skipping spral_failmode='command line' ;; yes ) coin_has_spral=requested spral_failmode='' ;; * ) coin_has_spral=requested spral_failmode='' spral_lflags="$withval" spral_userflags='yes' ;; esac else if test -n "$with_spral_lflags" || test -n "$with_spral_cflags" || test -n "$with_spral_data" ; then coin_has_spral=requested spral_failmode='' spral_userflags='yes' fi fi if test "$coin_has_spral" != skipping ; then withval="$with_spral_lflags" if test -n "$withval" ; then coin_has_spral=requested spral_lflags="$withval" spral_userflags='yes' fi withval="$with_spral_cflags" if test -n "$withval" ; then coin_has_spral=requested spral_cflags="$withval" spral_userflags='yes' fi fi if test $coin_has_spral != skipping ; then ac_save_CPPFLAGS=$CPPFLAGS CPPFLAGS="$spral_cflags" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "spral_ssids.h" #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else case e in #( e) coin_has_spral='no' spral_failmode="header compile" ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CPPFLAGS=$ac_save_CPPFLAGS fi if test "$coin_has_spral" != skipping ; then ac_save_LIBS=$LIBS ac_save_CPPFLAGS=$CPPFLAGS LIBS="$spral_lflags" CPPFLAGS="$spral_cflags" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include "spral_ssids.h" #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { spral_ssids_solve(0, 0, (double*)0, 0, (void*)0, (void*)0, (const struct spral_ssids_options*)0, (struct spral_ssids_inform*)0); ; return 0; } _ACEOF if ac_fn_cxx_try_link "$LINENO" then : else case e in #( e) coin_has_spral='no' if test -n "$spral_failmode" ; then spral_failmode="$spral_failmode, link with header" else spral_failmode="link with header" fi ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_save_LIBS CPPFLAGS=$ac_save_CPPFLAGS fi if test $coin_has_spral = requested ; then coin_has_spral=yes fi # Define BUILDTOOLS_DEBUG to enable debugging output if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: FIND_PRIM_LIB result for spral: \"$coin_has_spral\"" >&5 printf "%s\n" "$as_me: FIND_PRIM_LIB result for spral: \"$coin_has_spral\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Collected values for package 'spral'" >&5 printf "%s\n" "$as_me: Collected values for package 'spral'" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: spral_lflags is \"$spral_lflags\"" >&5 printf "%s\n" "$as_me: spral_lflags is \"$spral_lflags\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: spral_cflags is \"$spral_cflags\"" >&5 printf "%s\n" "$as_me: spral_cflags is \"$spral_cflags\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: spral_data is \"$spral_data\"" >&5 printf "%s\n" "$as_me: spral_data is \"$spral_data\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: spral_pcfiles is \"$spral_pcfiles\"" >&5 printf "%s\n" "$as_me: spral_pcfiles is \"$spral_pcfiles\"" >&6;} fi if test -n "$spral_failmode" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_spral ($spral_failmode)" >&5 printf "%s\n" "$coin_has_spral ($spral_failmode)" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_spral" >&5 printf "%s\n" "$coin_has_spral" >&6; } fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $coin_has_spral (COIN_SKIP_PROJECTS)" >&5 printf "%s\n" "$coin_has_spral (COIN_SKIP_PROJECTS)" >&6; } fi if test "$coin_has_spral" = 'no' ; then if expr "$spral_failmode" : '.*header.*' &>/dev/null ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Compiler flags were \"$spral_cflags\". Use --with-spral-cflags to overwrite. Check config.log for details of failed compile attempt." >&5 printf "%s\n" "$as_me: Compiler flags were \"$spral_cflags\". Use --with-spral-cflags to overwrite. Check config.log for details of failed compile attempt." >&6;} fi if expr "$spral_failmode" : '.*link.*' &>/dev/null ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Linker flags are \"$spral_lflags\". Use --with-spral-lflags to overwrite. Check config.log for details of failed link attempt." >&5 printf "%s\n" "$as_me: Linker flags are \"$spral_lflags\". Use --with-spral-lflags to overwrite. Check config.log for details of failed link attempt." >&6;} fi if test "$spral_userflags" = 'yes' ; then as_fn_error $? "user-specified flags for Spral do not work." "$LINENO" 5 fi fi if test "$coin_has_spral" != yes ; then coin_has_spral=no fi if test $coin_has_spral = yes; then COIN_HAS_SPRAL_TRUE= COIN_HAS_SPRAL_FALSE='#' else COIN_HAS_SPRAL_TRUE='#' COIN_HAS_SPRAL_FALSE= fi if test $coin_has_spral = yes ; then printf "%s\n" "#define IPOPT_HAS_SPRAL 1" >>confdefs.h IPOPTLIB_LFLAGS="$spral_lflags $IPOPTLIB_LFLAGS" IPOPTLIB_CFLAGS="$spral_cflags $IPOPTLIB_CFLAGS" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu else if false; then COIN_HAS_SPRAL_TRUE= COIN_HAS_SPRAL_FALSE='#' else COIN_HAS_SPRAL_TRUE='#' COIN_HAS_SPRAL_FALSE= fi fi ######## # WSMP # ######## # Check whether --with-wsmp was given. if test ${with_wsmp+y} then : withval=$with_wsmp; have_wsmp=yes; wsmp_lflags=$withval else case e in #( e) have_wsmp=no ;; esac fi if test $have_wsmp$precision$intsize = yesdouble32 ; then ac_save_LIBS="$LIBS" LIBS="$wsmp_lflags $LIBS" wssmp_namemangling=unknown for ac_extra in "no extra underscore" "extra underscore" ; do for ac_case in "lower case" "upper case" ; do for ac_trail in "underscore" "no underscore" ; do case $ac_case in "lower case") ac_name=wssmp ;; "upper case") ac_name=WSSMP ;; esac if test "$ac_trail" = "underscore" ; then ac_name=${ac_name}_ fi if test "$ac_extra" = "extra underscore" ; then ac_name=${ac_name}_ fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for function $ac_name in $LIBS" >&5 printf %s "checking for function $ac_name in $LIBS... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char $ac_name (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return $ac_name (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : wssmp_namemangling="${ac_case}, ${ac_trail}, ${ac_extra}" ac_success=yes else case e in #( e) ac_success=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_success" >&5 printf "%s\n" "$ac_success" >&6; } if test $ac_success = yes ; then break 3 fi done done done LIBS=$ac_save_LIBS if test $ac_success = yes ; then case "$wssmp_namemangling" in "lower case, no underscore, no extra underscore") printf "%s\n" "#define IPOPT_WSMP_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define IPOPT_WSMP_FUNC_(name,NAME) name" >>confdefs.h ;; "lower case, no underscore, extra underscore") printf "%s\n" "#define IPOPT_WSMP_FUNC(name,NAME) name" >>confdefs.h printf "%s\n" "#define IPOPT_WSMP_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, no extra underscore") printf "%s\n" "#define IPOPT_WSMP_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define IPOPT_WSMP_FUNC_(name,NAME) name ## _" >>confdefs.h ;; "lower case, underscore, extra underscore") printf "%s\n" "#define IPOPT_WSMP_FUNC(name,NAME) name ## _" >>confdefs.h printf "%s\n" "#define IPOPT_WSMP_FUNC_(name,NAME) name ## __" >>confdefs.h ;; "upper case, no underscore, no extra underscore") printf "%s\n" "#define IPOPT_WSMP_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define IPOPT_WSMP_FUNC_(name,NAME) NAME" >>confdefs.h ;; "upper case, no underscore, extra underscore") printf "%s\n" "#define IPOPT_WSMP_FUNC(name,NAME) NAME" >>confdefs.h printf "%s\n" "#define IPOPT_WSMP_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, no extra underscore") printf "%s\n" "#define IPOPT_WSMP_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define IPOPT_WSMP_FUNC_(name,NAME) NAME ## _" >>confdefs.h ;; "upper case, underscore, extra underscore") printf "%s\n" "#define IPOPT_WSMP_FUNC(name,NAME) NAME ## _" >>confdefs.h printf "%s\n" "#define IPOPT_WSMP_FUNC_(name,NAME) NAME ## __" >>confdefs.h ;; *) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Unsupported or unknown name-mangling scheme: $wssmp_namemangling" >&5 printf "%s\n" "$as_me: WARNING: Unsupported or unknown name-mangling scheme: $wssmp_namemangling" >&2;} ;; esac IPOPTLIB_LFLAGS="$wsmp_lflags $IPOPTLIB_LFLAGS" printf "%s\n" "#define IPOPT_HAS_WSMP 1" >>confdefs.h else as_fn_error $? "Symbol wssmp not found with WSMP flags $wsmp_lflags. See config.log for details on failed checks." "$LINENO" 5 fi fi if test $have_wsmp = yes; then HAVE_WSMP_TRUE= HAVE_WSMP_FALSE='#' else HAVE_WSMP_TRUE='#' HAVE_WSMP_FALSE= fi ############################################################################# # Stuff for examples # ############################################################################# # find out how long an int pointer is to know if we need INTEGER*4 or # INTEGER*8 in Fortran to capture pointers. ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects # declarations like 'int a3[[(sizeof (unsigned char)) >= 0]];'. # This bug is HP SR number 8606223364. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of int *" >&5 printf %s "checking size of int *... " >&6; } if test ${ac_cv_sizeof_int_p+y} then : printf %s "(cached) " >&6 else case e in #( e) if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int *))" "ac_cv_sizeof_int_p" "$ac_includes_default" then : else case e in #( e) if test "$ac_cv_type_int_p" = yes; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error 77 "cannot compute sizeof (int *) See 'config.log' for more details" "$LINENO" 5; } else ac_cv_sizeof_int_p=0 fi ;; esac fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int_p" >&5 printf "%s\n" "$ac_cv_sizeof_int_p" >&6; } printf "%s\n" "#define SIZEOF_INT_P $ac_cv_sizeof_int_p" >>confdefs.h ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu case "$ac_cv_sizeof_int_p" in 4 | 4?) BITS_PER_POINTER=32 BIT32FCOMMENT='' BIT64FCOMMENT='C' ;; 8 | 8?) BITS_PER_POINTER=64 BIT32FCOMMENT='C' BIT64FCOMMENT='' ;; *) as_fn_error $? "Unknown length of int*" "$LINENO" 5;; esac ############################################################################ ############################################################################ # Stuff that we need for C++ programs # ############################################################################ ############################################################################ ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu ##################### # Function isfinite # ##################### for ac_header in cmath math.h do : as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | sed "$as_sed_sh"` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : cat >>confdefs.h <<_ACEOF #define `printf "%s\n" "HAVE_$ac_header" | sed "$as_sed_cpp"` 1 _ACEOF break fi done for ac_header in cfloat float.h do : as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | sed "$as_sed_sh"` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : cat >>confdefs.h <<_ACEOF #define `printf "%s\n" "HAVE_$ac_header" | sed "$as_sed_cpp"` 1 _ACEOF break fi done for ac_header in cieeefp ieeefp.h do : as_ac_Header=`printf "%s\n" "ac_cv_header_$ac_header" | sed "$as_sed_sh"` ac_fn_cxx_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes" then : cat >>confdefs.h <<_ACEOF #define `printf "%s\n" "HAVE_$ac_header" | sed "$as_sed_cpp"` 1 _ACEOF break fi done { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $CXX options needed to detect all undeclared functions" >&5 printf %s "checking for $CXX options needed to detect all undeclared functions... " >&6; } if test ${ac_cv_cxx_undeclared_builtin_options+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_save_CFLAGS=$CFLAGS ac_cv_cxx_undeclared_builtin_options='cannot detect' for ac_arg in '' -fno-builtin; do CFLAGS="$ac_save_CFLAGS $ac_arg" # This test program should *not* compile successfully. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { (void) strchr; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : else case e in #( e) # This test program should compile successfully. # No library function is consistently available on # freestanding implementations, so test against a dummy # declaration. Include always-available headers on the # off chance that they somehow elicit warnings. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include extern void ac_decl (int, char *); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { (void) ac_decl (0, (char *) 0); (void) ac_decl; ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : if test x"$ac_arg" = x then : ac_cv_cxx_undeclared_builtin_options='none needed' else case e in #( e) ac_cv_cxx_undeclared_builtin_options=$ac_arg ;; esac fi break fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext done CFLAGS=$ac_save_CFLAGS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_undeclared_builtin_options" >&5 printf "%s\n" "$ac_cv_cxx_undeclared_builtin_options" >&6; } case $ac_cv_cxx_undeclared_builtin_options in #( 'cannot detect') : { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "cannot make $CXX report undeclared builtins See 'config.log' for more details" "$LINENO" 5; } ;; #( 'none needed') : ac_cxx_undeclared_builtin_options='' ;; #( *) : ac_cxx_undeclared_builtin_options=$ac_cv_cxx_undeclared_builtin_options ;; esac COIN_C_FINITE= { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for std::isfinite" >&5 printf %s "checking for std::isfinite... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef HAVE_CMATH # include #else # ifdef HAVE_MATH_H # include # endif #endif #ifdef HAVE_CFLOAT # include #else # ifdef HAVE_FLOAT_H # include # endif #endif #ifdef HAVE_CIEEEFP # include #else # ifdef HAVE_IEEEFP_H # include # endif #endif int main () { (void) std::isfinite(1.0) ; return 0 ; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : COIN_C_FINITE=std::isfinite { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext if test -z "$COIN_C_FINITE"; then for fname in isfinite finite _finite ; do as_ac_Symbol=`printf "%s\n" "ac_cv_have_decl_$fname" | sed "$as_sed_sh"` ac_fn_check_decl "$LINENO" "$fname" "$as_ac_Symbol" " #ifdef HAVE_CMATH # include #else # ifdef HAVE_MATH_H # include # endif #endif #ifdef HAVE_CFLOAT # include #else # ifdef HAVE_FLOAT_H # include # endif #endif #ifdef HAVE_CIEEEFP # include #else # ifdef HAVE_IEEEFP_H # include # endif #endif " "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if eval test \"x\$"$as_ac_Symbol"\" = x"yes" then : COIN_C_FINITE=$fname fi if test -n "$COIN_C_FINITE" ; then break fi done fi if test -z "$COIN_C_FINITE"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find C-function for checking Inf." >&5 printf "%s\n" "$as_me: WARNING: Cannot find C-function for checking Inf." >&2;} else printf "%s\n" "#define IPOPT_C_FINITE $COIN_C_FINITE" >>confdefs.h fi ########### # va_copy # ########### ac_fn_check_decl "$LINENO" "va_copy" "ac_cv_have_decl_va_copy" "#include " "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if test "x$ac_cv_have_decl_va_copy" = xyes then : printf "%s\n" "#define IPOPT_HAS_VA_COPY 1" >>confdefs.h fi ################################ # Secure C11 library functions # ################################ as_ac_Symbol=`printf "%s\n" "ac_cv_have_decl_fopen_s(FILE**, const char*, const char*)" | sed "$as_sed_sh"` ac_fn_check_decl "$LINENO" "fopen_s(FILE**, const char*, const char*)" "$as_ac_Symbol" "#include " "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if eval test \"x\$"$as_ac_Symbol"\" = x"yes" then : printf "%s\n" "#define IPOPT_HAS_FOPEN_S 1" >>confdefs.h fi as_ac_Symbol=`printf "%s\n" "ac_cv_have_decl_getenv_s(size_t*, char*, rsize_t, const char*)" | sed "$as_sed_sh"` ac_fn_check_decl "$LINENO" "getenv_s(size_t*, char*, rsize_t, const char*)" "$as_ac_Symbol" "#include " "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if eval test \"x\$"$as_ac_Symbol"\" = x"yes" then : printf "%s\n" "#define IPOPT_HAS_GETENV_S 1" >>confdefs.h fi ########################### # Random number generator # ########################### ac_fn_check_decl "$LINENO" "drand48" "ac_cv_have_decl_drand48" "#include " "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if test "x$ac_cv_have_decl_drand48" = xyes then : printf "%s\n" "#define IPOPT_HAS_DRAND48 1" >>confdefs.h fi ac_fn_check_decl "$LINENO" "rand" "ac_cv_have_decl_rand" "#include " "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if test "x$ac_cv_have_decl_rand" = xyes then : printf "%s\n" "#define IPOPT_HAS_RAND 1" >>confdefs.h fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for std::srand" >&5 printf %s "checking for std::srand... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { (void) std::srand(1) ; return 0 ; } _ACEOF if ac_fn_cxx_try_compile "$LINENO" then : printf "%s\n" "#define IPOPT_HAS_STD__RAND 1" >>confdefs.h { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else case e in #( e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext ################## # feenableexcept # ################## ac_fn_check_decl "$LINENO" "feenableexcept" "ac_cv_have_decl_feenableexcept" "#include " "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if test "x$ac_cv_have_decl_feenableexcept" = xyes then : printf "%s\n" "#define IPOPT_HAS_FEENABLEEXCEPT 1" >>confdefs.h fi ############# # sigaction # ############# as_ac_Symbol=`printf "%s\n" "ac_cv_have_decl_sigaction(int, const struct sigaction*, struct sigaction*)" | sed "$as_sed_sh"` ac_fn_check_decl "$LINENO" "sigaction(int, const struct sigaction*, struct sigaction*)" "$as_ac_Symbol" "#include " "$ac_cxx_undeclared_builtin_options" "CXXFLAGS" if eval test \"x\$"$as_ac_Symbol"\" = x"yes" then : printf "%s\n" "#define IPOPT_HAS_SIGACTION 1" >>confdefs.h fi ################################################### # Check if user wants inexact algorithm available # ################################################### # Check whether --enable-inexact-solver was given. if test ${enable_inexact_solver+y} then : enableval=$enable_inexact_solver; case "$enableval" in no | yes) ;; *) as_fn_error $? "invalid argument for --enable-inexact-solver: $enableval" "$LINENO" 5;; esac use_inexact=$enableval else case e in #( e) use_inexact=no ;; esac fi if test $use_inexact = yes; then if test $have_pardiso_project = no; then as_fn_error $? "The inexact solver option is currently only available with Pardiso from pardiso-project.org" "$LINENO" 5 fi printf "%s\n" "#define BUILD_INEXACT 1" >>confdefs.h fi if test $use_inexact = yes; then BUILD_INEXACT_TRUE= BUILD_INEXACT_FALSE='#' else BUILD_INEXACT_TRUE='#' BUILD_INEXACT_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ######## # Java # ######## # Check whether --enable-java was given. if test ${enable_java+y} then : enableval=$enable_java; enable_java="$enableval" else case e in #( e) case "$JAVA_HOME" in *\ * ) enable_java=no ;; # do not enable java-check by default, if there are spaces in JAVA_HOME - that causes trouble * ) enable_java="$enable_shared" ;; esac ;; esac fi if test "$enable_java" != no ; then # look for javac: required to compile Java code and build C-header # this is a modified version of AX_PROG_JAVAC if test "x$JAVAPREFIX" = x then : test "x$JAVAC" = x && for ac_prog in "gcj -C" guavac jikes javac do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_JAVAC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$JAVAC"; then ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_JAVAC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi JAVAC=$ac_cv_prog_JAVAC if test -n "$JAVAC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 printf "%s\n" "$JAVAC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$JAVAC" && break done else case e in #( e) test "x$JAVAC" = x && for ac_prog in "gcj -C" guavac jikes javac do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_JAVAC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$JAVAC"; then ac_cv_prog_JAVAC="$JAVAC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $JAVAPREFIX/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_JAVAC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi JAVAC=$ac_cv_prog_JAVAC if test -n "$JAVAC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $JAVAC" >&5 printf "%s\n" "$JAVAC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$JAVAC" && break done ;; esac fi if test -z "$JAVAC" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No JAVA compiler. Disabling build of Java interface." >&5 printf "%s\n" "$as_me: No JAVA compiler. Disabling build of Java interface." >&6;} enable_java=no else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if $JAVAC works" >&5 printf %s "checking if $JAVAC works... " >&6; } if test ${ac_cv_prog_javac_works+y} then : printf %s "(cached) " >&6 else case e in #( e) JAVA_TEST=Test.java CLASS_TEST=Test.class cat << \EOF > $JAVA_TEST /* #line 28444 "configure" */ public class Test { } EOF if { ac_try='$JAVAC $JAVACFLAGS $JAVA_TEST' { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5 (eval $ac_try) 2>&5 ac_status=$? printf "%s\n" "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; } >/dev/null 2>&1; then ac_cv_prog_javac_works=yes else as_fn_error $? "The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)" "$LINENO" 5 echo "configure: failed program was:" >&5 cat $JAVA_TEST >&5 fi rm -f $JAVA_TEST $CLASS_TEST ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_javac_works" >&5 printf "%s\n" "$ac_cv_prog_javac_works" >&6; } fi fi if test "$enable_java" != no ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if javac supports -h" >&5 printf %s "checking if javac supports -h... " >&6; } echo "public abstract class conftest { private native boolean test(); }" > conftest.java printf "%s\n" "$as_me:${as_lineno-$LINENO}: $JAVAC conftest.java -h conftest.header" >&5 "$JAVAC" conftest.java -h conftest.header >&5 if test -e conftest.header/conftest.h ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 printf "%s\n" "yes" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.java >&5 enable_java=no fi fi if test "$enable_java" != no ; then # look for jni header: required to compile C++ part of Java interface JNI_INCLUDE_DIRS="" if test "x$JAVA_HOME" != x; then _JTOPDIR="$JAVA_HOME" else if test "x$JAVAC" = x; then JAVAC=javac fi # Extract the first word of "$JAVAC", so it can be a program name with args. set dummy $JAVAC; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path__ACJNI_JAVAC+y} then : printf %s "(cached) " >&6 else case e in #( e) case $_ACJNI_JAVAC in [\\/]* | ?:[\\/]*) ac_cv_path__ACJNI_JAVAC="$_ACJNI_JAVAC" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path__ACJNI_JAVAC="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path__ACJNI_JAVAC" && ac_cv_path__ACJNI_JAVAC="no" ;; esac ;; esac fi _ACJNI_JAVAC=$ac_cv_path__ACJNI_JAVAC if test -n "$_ACJNI_JAVAC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $_ACJNI_JAVAC" >&5 printf "%s\n" "$_ACJNI_JAVAC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi if test "x$_ACJNI_JAVAC" = xno; then as_fn_error $? "cannot find JDK; try setting \$JAVAC or \$JAVA_HOME" "$LINENO" 5 fi # find the include directory relative to the javac executable _cur=""$_ACJNI_JAVAC"" while ls -ld "$_cur" 2>/dev/null | grep " -> " >/dev/null; do { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking symlink for $_cur" >&5 printf %s "checking symlink for $_cur... " >&6; } _slink=`ls -ld "$_cur" | sed 's/.* -> //'` case "$_slink" in /*) _cur="$_slink";; # 'X' avoids triggering unwanted echo options. *) _cur=`echo "X$_cur" | sed -e 's/^X//' -e 's:[^/]*$::'`"$_slink";; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $_cur" >&5 printf "%s\n" "$_cur" >&6; } done _ACJNI_FOLLOWED="$_cur" _JTOPDIR=`echo "$_ACJNI_FOLLOWED" | sed -e 's://*:/:g' -e 's:/[^/]*$::'` fi case "$host_os" in darwin*) # Apple Java headers are inside the Xcode bundle. major_macos_version=$(sw_vers -productVersion | sed -n -e 's/^\([0-9]*\).[0-9]*.[0-9]*/\1/p') if [ "$major_macos_version" -gt "10" ]; then _JTOPDIR="$(/usr/libexec/java_home)" _JINC="$_JTOPDIR/include" else macos_version=$(sw_vers -productVersion | sed -n -e 's/^[0-9]*.\([0-9]*\).[0-9]*/\1/p') if [ "$macos_version" -gt "7" ]; then _JTOPDIR="$(xcrun --show-sdk-path)/System/Library/Frameworks/JavaVM.framework" _JINC="$_JTOPDIR/Headers" else _JTOPDIR="/System/Library/Frameworks/JavaVM.framework" _JINC="$_JTOPDIR/Headers" fi fi ;; *) _JINC="$_JTOPDIR/include";; esac printf "%s\n" "$as_me:${as_lineno-$LINENO}: _JTOPDIR=$_JTOPDIR" >&5 printf "%s\n" "$as_me:${as_lineno-$LINENO}: _JINC=$_JINC" >&5 # On Mac OS X 10.6.4, jni.h is a symlink: # /System/Library/Frameworks/JavaVM.framework/Versions/Current/Headers/jni.h # -> ../../CurrentJDK/Headers/jni.h. { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking jni headers" >&5 printf %s "checking jni headers... " >&6; } if test ${ac_cv_jni_header_path+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -f "$_JINC/jni.h"; then ac_cv_jni_header_path="$_JINC" JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" else _JTOPDIR=`echo "$_JTOPDIR" | sed -e 's:/[^/]*$::'` if test -f "$_JTOPDIR/include/jni.h"; then ac_cv_jni_header_path="$_JTOPDIR/include" JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $ac_cv_jni_header_path" else ac_cv_jni_header_path=none fi fi ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_jni_header_path" >&5 printf "%s\n" "$ac_cv_jni_header_path" >&6; } # get the likely subdirectories for system specific java includes case "$host_os" in bsdi*) _JNI_INC_SUBDIRS="bsdos";; freebsd*) _JNI_INC_SUBDIRS="freebsd";; darwin*) _JNI_INC_SUBDIRS="darwin";; linux*) _JNI_INC_SUBDIRS="linux genunix";; osf*) _JNI_INC_SUBDIRS="alpha";; solaris*) _JNI_INC_SUBDIRS="solaris";; mingw*) _JNI_INC_SUBDIRS="win32";; cygwin*) _JNI_INC_SUBDIRS="win32";; *) _JNI_INC_SUBDIRS="genunix";; esac if test "x$ac_cv_jni_header_path" != "xnone"; then # add any subdirectories that are present for JINCSUBDIR in $_JNI_INC_SUBDIRS do if test -d "$_JTOPDIR/include/$JINCSUBDIR"; then JNI_INCLUDE_DIRS="$JNI_INCLUDE_DIRS $_JTOPDIR/include/$JINCSUBDIR" fi done fi if test -z "$JNI_INCLUDE_DIRS" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: No JNI header directory. Disabling build of Java interface." >&5 printf "%s\n" "$as_me: No JNI header directory. Disabling build of Java interface." >&6;} enable_java=no else for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS ; do CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR" done fi fi if test "$enable_java" != no ; then # look for jar: required to pack Java interface if test "x$JAVAPREFIX" = x then : test "x$JAR" = x && for ac_prog in jar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_JAR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$JAR"; then ac_cv_prog_JAR="$JAR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_JAR="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi JAR=$ac_cv_prog_JAR if test -n "$JAR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5 printf "%s\n" "$JAR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$JAR" && break done else case e in #( e) test "x$JAR" = x && for ac_prog in jar do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_JAR+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$JAR"; then ac_cv_prog_JAR="$JAR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $JAVAPREFIX/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_JAR="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi JAR=$ac_cv_prog_JAR if test -n "$JAR"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $JAR" >&5 printf "%s\n" "$JAR" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$JAR" && break done ;; esac fi if test -z "$JAR" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: JAVA compiler found, but no acceptable jar program found in \$PATH. Disabling build of Java interface." >&5 printf "%s\n" "$as_me: WARNING: JAVA compiler found, but no acceptable jar program found in \$PATH. Disabling build of Java interface." >&2;} enable_java=no fi fi if test "$enable_java" != no ; then # look for java to run tests, but skip check whether java works (so just the test may fail) if test "x$JAVAPREFIX" = x then : test x$JAVA = x && for ac_prog in kaffe java do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_JAVA+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$JAVA"; then ac_cv_prog_JAVA="$JAVA" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_JAVA="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi JAVA=$ac_cv_prog_JAVA if test -n "$JAVA"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5 printf "%s\n" "$JAVA" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$JAVA" && break done else case e in #( e) test x$JAVA = x && for ac_prog in kaffe java do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_JAVA+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$JAVA"; then ac_cv_prog_JAVA="$JAVA" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $JAVAPREFIX/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_JAVA="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi JAVA=$ac_cv_prog_JAVA if test -n "$JAVA"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $JAVA" >&5 printf "%s\n" "$JAVA" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$JAVA" && break done ;; esac fi if test -z "$JAVA" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: JAVA compiler found, but no acceptable JAVA executable found in \$PATH. Disabling tests of Java interface. Java example will not run." >&5 printf "%s\n" "$as_me: WARNING: JAVA compiler found, but no acceptable JAVA executable found in \$PATH. Disabling tests of Java interface. Java example will not run." >&2;} fi # look for javadoc to build documentation if test "x$JAVAPREFIX" = x then : test "x$JAVADOC" = x && for ac_prog in javadoc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_JAVADOC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$JAVADOC"; then ac_cv_prog_JAVADOC="$JAVADOC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_JAVADOC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi JAVADOC=$ac_cv_prog_JAVADOC if test -n "$JAVADOC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $JAVADOC" >&5 printf "%s\n" "$JAVADOC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$JAVADOC" && break done else case e in #( e) test "x$JAVADOC" = x && for ac_prog in javadoc do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_prog_JAVADOC+y} then : printf %s "(cached) " >&6 else case e in #( e) if test -n "$JAVADOC"; then ac_cv_prog_JAVADOC="$JAVADOC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $JAVAPREFIX/bin do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_prog_JAVADOC="$ac_prog" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi ;; esac fi JAVADOC=$ac_cv_prog_JAVADOC if test -n "$JAVADOC"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $JAVADOC" >&5 printf "%s\n" "$JAVADOC" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi test -n "$JAVADOC" && break done ;; esac fi if test -z "$JAVADOC" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: JAVA compiler found, but no javadoc found in \$PATH. Building the Java documentation (make javadoc) will fail." >&5 printf "%s\n" "$as_me: WARNING: JAVA compiler found, but no javadoc found in \$PATH. Building the Java documentation (make javadoc) will fail." >&2;} fi fi if test "$enable_java" != no; then BUILD_JAVA_TRUE= BUILD_JAVA_FALSE='#' else BUILD_JAVA_TRUE='#' BUILD_JAVA_FALSE= fi ######################################################################## ## Linear solver loader ## ######################################################################## # Check whether --enable-linear-solver-loader was given. if test ${enable_linear_solver_loader+y} then : enableval=$enable_linear_solver_loader; case "$enableval" in no | yes) ;; *) as_fn_error $? "invalid argument for --enable-linear-solver-loader: $enableval" "$LINENO" 5;; esac use_linearsolverloader=$enableval else case e in #( e) use_linearsolverloader=yes ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether the linear solver loader should be used" >&5 printf %s "checking whether the linear solver loader should be used... " >&6; } { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $use_linearsolverloader" >&5 printf "%s\n" "$use_linearsolverloader" >&6; } if test $use_linearsolverloader = yes; then printf "%s\n" "#define IPOPT_HAS_LINEARSOLVERLOADER 1" >>confdefs.h ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5 printf %s "checking for dlopen in -ldl... " >&6; } if test ${ac_cv_lib_dl_dlopen+y} then : printf %s "(cached) " >&6 else case e in #( e) ac_check_lib_save_LIBS=$LIBS LIBS="-ldl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. The 'extern "C"' is for builds by C++ compilers; although this is not generally supported in C code supporting it here has little cost and some practical benefit (sr 110532). */ #ifdef __cplusplus extern "C" #endif char dlopen (void); #ifdef F77_DUMMY_MAIN # ifdef __cplusplus extern "C" # endif int F77_DUMMY_MAIN() { return 1; } #endif int main (void) { return dlopen (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO" then : ac_cv_lib_dl_dlopen=yes else case e in #( e) ac_cv_lib_dl_dlopen=no ;; esac fi rm -f core conftest.err conftest.$ac_objext conftest.beam \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS ;; esac fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5 printf "%s\n" "$ac_cv_lib_dl_dlopen" >&6; } if test "x$ac_cv_lib_dl_dlopen" = xyes then : IPOPTLIB_LFLAGS="$IPOPTLIB_LFLAGS -ldl" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu fi ac_fn_c_check_header_compile "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default" if test "x$ac_cv_header_windows_h" = xyes then : printf "%s\n" "#define HAVE_WINDOWS_H 1" >>confdefs.h fi ######################################################################## ## sIpopt ## ######################################################################## # Check whether --enable-sipopt was given. if test ${enable_sipopt+y} then : enableval=$enable_sipopt; case "$enableval" in no | yes) ;; *) as_fn_error $? "invalid argument for --enable-sipopt: $enableval" "$LINENO" 5;; esac use_sipopt=$enableval else case e in #( e) use_sipopt=yes ;; esac fi if test "$use_sipopt" = yes; then BUILD_SIPOPT_TRUE= BUILD_SIPOPT_FALSE='#' else BUILD_SIPOPT_TRUE='#' BUILD_SIPOPT_FALSE= fi ######################################################################## ## Create links for the test source files ## ######################################################################## ac_config_links="$ac_config_links test/hs071_main.cpp:examples/hs071_cpp/hs071_main.cpp test/hs071_nlp.cpp:examples/hs071_cpp/hs071_nlp.cpp test/hs071_nlp.hpp:examples/hs071_cpp/hs071_nlp.hpp test/hs071_c.c:examples/hs071_c/hs071_c.c" if test "$use_sipopt" = yes ; then ac_config_links="$ac_config_links test/parametric_driver.cpp:contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp test/parametricTNLP.cpp:contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp test/MySensTNLP.cpp:contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp test/redhess_cpp.cpp:contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp" fi ######################################################################## ## Create links for VPATH config of certain files ## ######################################################################## ac_config_links="$ac_config_links contrib/RInterface/DESCRIPTION:contrib/RInterface/DESCRIPTION" ac_config_links="$ac_config_links contrib/RInterface/NAMESPACE:contrib/RInterface/NAMESPACE" ac_config_links="$ac_config_links contrib/RInterface/inst/CITATION:contrib/RInterface/inst/CITATION" ac_config_links="$ac_config_links contrib/RInterface/inst/doc/ipoptr.Rnw:contrib/RInterface/inst/doc/ipoptr.Rnw" ac_config_links="$ac_config_links contrib/RInterface/inst/doc/ipoptr.pdf:contrib/RInterface/inst/doc/ipoptr.pdf" ac_config_links="$ac_config_links contrib/RInterface/inst/doc/reflist.bib:contrib/RInterface/inst/doc/reflist.bib" ac_config_links="$ac_config_links contrib/RInterface/man/ipoptr-package.Rd:contrib/RInterface/man/ipoptr-package.Rd" ac_config_links="$ac_config_links contrib/RInterface/man/ipoptr.Rd:contrib/RInterface/man/ipoptr.Rd" ac_config_links="$ac_config_links contrib/RInterface/man/is.ipoptr.Rd:contrib/RInterface/man/is.ipoptr.Rd" ac_config_links="$ac_config_links contrib/RInterface/man/make.sparse.Rd:contrib/RInterface/man/make.sparse.Rd" ac_config_links="$ac_config_links contrib/RInterface/man/plot.sparseness.Rd:contrib/RInterface/man/plot.sparseness.Rd" ac_config_links="$ac_config_links contrib/RInterface/man/print.ipoptr.Rd:contrib/RInterface/man/print.ipoptr.Rd" ac_config_links="$ac_config_links contrib/RInterface/man/print.sparseness.Rd:contrib/RInterface/man/print.sparseness.Rd" ac_config_links="$ac_config_links contrib/RInterface/R/get.option.types.R:contrib/RInterface/R/get.option.types.R" ac_config_links="$ac_config_links contrib/RInterface/R/ipoptr.R:contrib/RInterface/R/ipoptr.R" ac_config_links="$ac_config_links contrib/RInterface/R/is.ipoptr.R:contrib/RInterface/R/is.ipoptr.R" ac_config_links="$ac_config_links contrib/RInterface/R/make.sparse.R:contrib/RInterface/R/make.sparse.R" ac_config_links="$ac_config_links contrib/RInterface/R/plot.sparseness.R:contrib/RInterface/R/plot.sparseness.R" ac_config_links="$ac_config_links contrib/RInterface/R/print.ipoptr.R:contrib/RInterface/R/print.ipoptr.R" ac_config_links="$ac_config_links contrib/RInterface/R/print.sparseness.R:contrib/RInterface/R/print.sparseness.R" ac_config_links="$ac_config_links contrib/RInterface/tests/approx_banana.R:contrib/RInterface/tests/approx_banana.R" ac_config_links="$ac_config_links contrib/RInterface/tests/banana.R:contrib/RInterface/tests/banana.R" ac_config_links="$ac_config_links contrib/RInterface/tests/hs071_nlp.R:contrib/RInterface/tests/hs071_nlp.R" ac_config_links="$ac_config_links contrib/RInterface/tests/lasso.R:contrib/RInterface/tests/lasso.R" ac_config_links="$ac_config_links contrib/RInterface/tests/mynlp.R:contrib/RInterface/tests/mynlp.R" ac_config_links="$ac_config_links contrib/RInterface/tests/parameters.R:contrib/RInterface/tests/parameters.R" ac_config_links="$ac_config_links contrib/RInterface/tests/sparseness.R:contrib/RInterface/tests/sparseness.R" ac_config_links="$ac_config_links contrib/RInterface/src/ipoptr.cpp:contrib/RInterface/src/ipoptr.cpp" ac_config_links="$ac_config_links contrib/RInterface/src/IpoptRJournal.cpp:contrib/RInterface/src/IpoptRJournal.cpp" ac_config_links="$ac_config_links contrib/RInterface/src/IpoptRNLP.cpp:contrib/RInterface/src/IpoptRNLP.cpp" ac_config_links="$ac_config_links examples/Cpp_example/cpp_example.cpp:examples/Cpp_example/cpp_example.cpp" ac_config_links="$ac_config_links examples/Cpp_example/MyNLP.cpp:examples/Cpp_example/MyNLP.cpp" ac_config_links="$ac_config_links examples/Cpp_example/MyNLP.hpp:examples/Cpp_example/MyNLP.hpp" ac_config_links="$ac_config_links examples/hs071_cpp/hs071_main.cpp:examples/hs071_cpp/hs071_main.cpp" ac_config_links="$ac_config_links examples/hs071_cpp/hs071_nlp.cpp:examples/hs071_cpp/hs071_nlp.cpp" ac_config_links="$ac_config_links examples/hs071_cpp/hs071_nlp.hpp:examples/hs071_cpp/hs071_nlp.hpp" ac_config_links="$ac_config_links examples/hs071_c/hs071_c.c:examples/hs071_c/hs071_c.c" if test "$enable_java" != no ; then case $precision in single ) ac_config_links="$ac_config_links examples/hs071_java/HS071s.java:examples/hs071_java/HS071s.java" ;; double ) ac_config_links="$ac_config_links examples/hs071_java/HS071.java:examples/hs071_java/HS071.java" ;; esac fi ac_config_links="$ac_config_links tutorial/AmplExperiments/hs71.mod:tutorial/AmplExperiments/hs71.mod" ac_config_links="$ac_config_links tutorial/AmplExperiments/infeasible.mod:tutorial/AmplExperiments/infeasible.mod" ac_config_links="$ac_config_links tutorial/AmplExperiments/MoreAmplModels.txt:tutorial/AmplExperiments/MoreAmplModels.txt" ac_config_links="$ac_config_links tutorial/AmplExperiments/car1.run:tutorial/AmplExperiments/car1.run" ac_config_links="$ac_config_links tutorial/AmplExperiments/car1.gp:tutorial/AmplExperiments/car1.gp" ac_config_links="$ac_config_links tutorial/Modeling/bad1.mod:tutorial/Modeling/bad1.mod" ac_config_links="$ac_config_links tutorial/Modeling/bad1-fix1.mod:tutorial/Modeling/bad1-fix1.mod" ac_config_links="$ac_config_links tutorial/Modeling/bad1-fix2.mod:tutorial/Modeling/bad1-fix2.mod" ac_config_links="$ac_config_links tutorial/CodingExercise/exercise_example.mod:tutorial/CodingExercise/exercise_example.mod" ac_config_links="$ac_config_links tutorial/CodingExercise/C/1-skeleton/TutorialC.c:tutorial/CodingExercise/C/1-skeleton/TutorialC.c" ac_config_links="$ac_config_links tutorial/CodingExercise/C/2-mistake/TutorialC.c:tutorial/CodingExercise/C/2-mistake/TutorialC.c" ac_config_links="$ac_config_links tutorial/CodingExercise/C/3-solution/TutorialC.c:tutorial/CodingExercise/C/3-solution/TutorialC.c" ac_config_links="$ac_config_links tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_main.cpp:tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_main.cpp" ac_config_links="$ac_config_links tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.hpp:tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.hpp" ac_config_links="$ac_config_links tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.cpp:tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.cpp" ac_config_links="$ac_config_links tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_main.cpp:tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_main.cpp" ac_config_links="$ac_config_links tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.hpp:tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.hpp" ac_config_links="$ac_config_links tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.cpp:tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.cpp" ac_config_links="$ac_config_links tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_main.cpp:tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_main.cpp" ac_config_links="$ac_config_links tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.hpp:tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.hpp" ac_config_links="$ac_config_links tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.cpp:tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.cpp" ac_config_links="$ac_config_links tutorial/CodingExercise/Matlab/1-skeleton/TutorialMatlab.m:tutorial/CodingExercise/Matlab/1-skeleton/TutorialMatlab.m" ac_config_links="$ac_config_links tutorial/CodingExercise/Matlab/2-mistake/TutorialMatlab.m:tutorial/CodingExercise/Matlab/2-mistake/TutorialMatlab.m" ac_config_links="$ac_config_links tutorial/CodingExercise/Matlab/3-solution/TutorialMatlab.m:tutorial/CodingExercise/Matlab/3-solution/TutorialMatlab.m" if test "$use_sipopt" = yes ; then ac_config_links="$ac_config_links contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp:contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp" ac_config_links="$ac_config_links contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp:contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp" ac_config_links="$ac_config_links contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.hpp:contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.hpp" ac_config_links="$ac_config_links contrib/sIPOPT/examples/parametric_dsdp_cpp/parametric_dsdp_driver.cpp:contrib/sIPOPT/examples/parametric_dsdp_cpp/parametric_dsdp_driver.cpp" ac_config_links="$ac_config_links contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.cpp:contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.cpp" ac_config_links="$ac_config_links contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.hpp:contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.hpp" ac_config_links="$ac_config_links contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp:contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp" ac_config_links="$ac_config_links contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.hpp:contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.hpp" ac_config_links="$ac_config_links contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp:contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp" fi ######################################################################## ## Create Makefiles and other stuff ## ######################################################################## # the SIpoptLib is here to get SIPOPTLIB_EXPORT if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: FINALIZE_FLAGS for IpoptLib:" >&5 printf "%s\n" "$as_me: FINALIZE_FLAGS for IpoptLib:" >&6;} fi IPOPTLIB_LFLAGS_NOPC=$IPOPTLIB_LFLAGS IPOPTLIB_CFLAGS_NOPC=$IPOPTLIB_CFLAGS if test -n "${IPOPTLIB_PCFILES}" ; then temp_CFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --cflags ${IPOPTLIB_PCFILES}` temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs $pkg_static ${IPOPTLIB_PCFILES}` IPOPTLIB_CFLAGS="$temp_CFLAGS ${IPOPTLIB_CFLAGS}" IPOPTLIB_LFLAGS="$temp_LFLAGS ${IPOPTLIB_LFLAGS}" fi # setup XYZ_EXPORT symbol for library users libexport_attribute= if test "$enable_shared" = yes ; then case $build_os in cygwin* | mingw* | msys* | cegcc* ) libexport_attribute="__declspec(dllimport)" if test "$enable_static" = yes ; then as_fn_error $? "Cannot do DLL and static LIB builds simultaneously. Do not add --enable-static without --disable-shared." "$LINENO" 5 fi ;; esac fi printf "%s\n" "#define IPOPTLIB_EXPORT $libexport_attribute" >>confdefs.h # add -DXYZ_BUILD to XYZ_CFLAGS IPOPTLIB_CFLAGS="${IPOPTLIB_CFLAGS} -DIPOPTLIB_BUILD" # Define BUILDTOOLS_DEBUG to enable debugging output if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: IPOPTLIB_LFLAGS_NOPC: \"${IPOPTLIB_LFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: IPOPTLIB_LFLAGS_NOPC: \"${IPOPTLIB_LFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: IPOPTLIB_CFLAGS_NOPC: \"${IPOPTLIB_CFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: IPOPTLIB_CFLAGS_NOPC: \"${IPOPTLIB_CFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: adding \"${IPOPTLIB_PCFILES}\"" >&5 printf "%s\n" "$as_me: adding \"${IPOPTLIB_PCFILES}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: IPOPTLIB_LFLAGS: \"${IPOPTLIB_LFLAGS}\"" >&5 printf "%s\n" "$as_me: IPOPTLIB_LFLAGS: \"${IPOPTLIB_LFLAGS}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: IPOPTLIB_CFLAGS: \"${IPOPTLIB_CFLAGS}\"" >&5 printf "%s\n" "$as_me: IPOPTLIB_CFLAGS: \"${IPOPTLIB_CFLAGS}\"" >&6;} fi if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: FINALIZE_FLAGS for IpoptAmplInterfaceLib:" >&5 printf "%s\n" "$as_me: FINALIZE_FLAGS for IpoptAmplInterfaceLib:" >&6;} fi IPOPTAMPLINTERFACELIB_LFLAGS_NOPC=$IPOPTAMPLINTERFACELIB_LFLAGS IPOPTAMPLINTERFACELIB_CFLAGS_NOPC=$IPOPTAMPLINTERFACELIB_CFLAGS if test -n "${IPOPTAMPLINTERFACELIB_PCFILES}" ; then temp_CFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --cflags ${IPOPTAMPLINTERFACELIB_PCFILES}` temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs $pkg_static ${IPOPTAMPLINTERFACELIB_PCFILES}` IPOPTAMPLINTERFACELIB_CFLAGS="$temp_CFLAGS ${IPOPTAMPLINTERFACELIB_CFLAGS}" IPOPTAMPLINTERFACELIB_LFLAGS="$temp_LFLAGS ${IPOPTAMPLINTERFACELIB_LFLAGS}" fi # setup XYZ_EXPORT symbol for library users libexport_attribute= if test "$enable_shared" = yes ; then case $build_os in cygwin* | mingw* | msys* | cegcc* ) libexport_attribute="__declspec(dllimport)" if test "$enable_static" = yes ; then as_fn_error $? "Cannot do DLL and static LIB builds simultaneously. Do not add --enable-static without --disable-shared." "$LINENO" 5 fi ;; esac fi printf "%s\n" "#define IPOPTAMPLINTERFACELIB_EXPORT $libexport_attribute" >>confdefs.h # add -DXYZ_BUILD to XYZ_CFLAGS IPOPTAMPLINTERFACELIB_CFLAGS="${IPOPTAMPLINTERFACELIB_CFLAGS} -DIPOPTAMPLINTERFACELIB_BUILD" # Define BUILDTOOLS_DEBUG to enable debugging output if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: IPOPTAMPLINTERFACELIB_LFLAGS_NOPC: \"${IPOPTAMPLINTERFACELIB_LFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: IPOPTAMPLINTERFACELIB_LFLAGS_NOPC: \"${IPOPTAMPLINTERFACELIB_LFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: IPOPTAMPLINTERFACELIB_CFLAGS_NOPC: \"${IPOPTAMPLINTERFACELIB_CFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: IPOPTAMPLINTERFACELIB_CFLAGS_NOPC: \"${IPOPTAMPLINTERFACELIB_CFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: adding \"${IPOPTAMPLINTERFACELIB_PCFILES}\"" >&5 printf "%s\n" "$as_me: adding \"${IPOPTAMPLINTERFACELIB_PCFILES}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: IPOPTAMPLINTERFACELIB_LFLAGS: \"${IPOPTAMPLINTERFACELIB_LFLAGS}\"" >&5 printf "%s\n" "$as_me: IPOPTAMPLINTERFACELIB_LFLAGS: \"${IPOPTAMPLINTERFACELIB_LFLAGS}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: IPOPTAMPLINTERFACELIB_CFLAGS: \"${IPOPTAMPLINTERFACELIB_CFLAGS}\"" >&5 printf "%s\n" "$as_me: IPOPTAMPLINTERFACELIB_CFLAGS: \"${IPOPTAMPLINTERFACELIB_CFLAGS}\"" >&6;} fi if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: FINALIZE_FLAGS for SIpoptLib:" >&5 printf "%s\n" "$as_me: FINALIZE_FLAGS for SIpoptLib:" >&6;} fi SIPOPTLIB_LFLAGS_NOPC=$SIPOPTLIB_LFLAGS SIPOPTLIB_CFLAGS_NOPC=$SIPOPTLIB_CFLAGS if test -n "${SIPOPTLIB_PCFILES}" ; then temp_CFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --cflags ${SIPOPTLIB_PCFILES}` temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs $pkg_static ${SIPOPTLIB_PCFILES}` SIPOPTLIB_CFLAGS="$temp_CFLAGS ${SIPOPTLIB_CFLAGS}" SIPOPTLIB_LFLAGS="$temp_LFLAGS ${SIPOPTLIB_LFLAGS}" fi # setup XYZ_EXPORT symbol for library users libexport_attribute= if test "$enable_shared" = yes ; then case $build_os in cygwin* | mingw* | msys* | cegcc* ) libexport_attribute="__declspec(dllimport)" if test "$enable_static" = yes ; then as_fn_error $? "Cannot do DLL and static LIB builds simultaneously. Do not add --enable-static without --disable-shared." "$LINENO" 5 fi ;; esac fi printf "%s\n" "#define SIPOPTLIB_EXPORT $libexport_attribute" >>confdefs.h # add -DXYZ_BUILD to XYZ_CFLAGS SIPOPTLIB_CFLAGS="${SIPOPTLIB_CFLAGS} -DSIPOPTLIB_BUILD" # Define BUILDTOOLS_DEBUG to enable debugging output if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: SIPOPTLIB_LFLAGS_NOPC: \"${SIPOPTLIB_LFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: SIPOPTLIB_LFLAGS_NOPC: \"${SIPOPTLIB_LFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: SIPOPTLIB_CFLAGS_NOPC: \"${SIPOPTLIB_CFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: SIPOPTLIB_CFLAGS_NOPC: \"${SIPOPTLIB_CFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: adding \"${SIPOPTLIB_PCFILES}\"" >&5 printf "%s\n" "$as_me: adding \"${SIPOPTLIB_PCFILES}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: SIPOPTLIB_LFLAGS: \"${SIPOPTLIB_LFLAGS}\"" >&5 printf "%s\n" "$as_me: SIPOPTLIB_LFLAGS: \"${SIPOPTLIB_LFLAGS}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: SIPOPTLIB_CFLAGS: \"${SIPOPTLIB_CFLAGS}\"" >&5 printf "%s\n" "$as_me: SIPOPTLIB_CFLAGS: \"${SIPOPTLIB_CFLAGS}\"" >&6;} fi if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: FINALIZE_FLAGS for SIpoptAmplInterfaceLib:" >&5 printf "%s\n" "$as_me: FINALIZE_FLAGS for SIpoptAmplInterfaceLib:" >&6;} fi SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC=$SIPOPTAMPLINTERFACELIB_LFLAGS SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC=$SIPOPTAMPLINTERFACELIB_CFLAGS if test -n "${SIPOPTAMPLINTERFACELIB_PCFILES}" ; then temp_CFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --cflags ${SIPOPTAMPLINTERFACELIB_PCFILES}` temp_LFLAGS=`PKG_CONFIG_PATH="$COIN_PKG_CONFIG_PATH" $PKG_CONFIG --libs $pkg_static ${SIPOPTAMPLINTERFACELIB_PCFILES}` SIPOPTAMPLINTERFACELIB_CFLAGS="$temp_CFLAGS ${SIPOPTAMPLINTERFACELIB_CFLAGS}" SIPOPTAMPLINTERFACELIB_LFLAGS="$temp_LFLAGS ${SIPOPTAMPLINTERFACELIB_LFLAGS}" fi # setup XYZ_EXPORT symbol for library users libexport_attribute= if test "$enable_shared" = yes ; then case $build_os in cygwin* | mingw* | msys* | cegcc* ) libexport_attribute="__declspec(dllimport)" if test "$enable_static" = yes ; then as_fn_error $? "Cannot do DLL and static LIB builds simultaneously. Do not add --enable-static without --disable-shared." "$LINENO" 5 fi ;; esac fi printf "%s\n" "#define SIPOPTAMPLINTERFACELIB_EXPORT $libexport_attribute" >>confdefs.h # add -DXYZ_BUILD to XYZ_CFLAGS SIPOPTAMPLINTERFACELIB_CFLAGS="${SIPOPTAMPLINTERFACELIB_CFLAGS} -DSIPOPTAMPLINTERFACELIB_BUILD" # Define BUILDTOOLS_DEBUG to enable debugging output if test "$BUILDTOOLS_DEBUG" = 1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC: \"${SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC: \"${SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC: \"${SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC}\"" >&5 printf "%s\n" "$as_me: SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC: \"${SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: adding \"${SIPOPTAMPLINTERFACELIB_PCFILES}\"" >&5 printf "%s\n" "$as_me: adding \"${SIPOPTAMPLINTERFACELIB_PCFILES}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: SIPOPTAMPLINTERFACELIB_LFLAGS: \"${SIPOPTAMPLINTERFACELIB_LFLAGS}\"" >&5 printf "%s\n" "$as_me: SIPOPTAMPLINTERFACELIB_LFLAGS: \"${SIPOPTAMPLINTERFACELIB_LFLAGS}\"" >&6;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: SIPOPTAMPLINTERFACELIB_CFLAGS: \"${SIPOPTAMPLINTERFACELIB_CFLAGS}\"" >&5 printf "%s\n" "$as_me: SIPOPTAMPLINTERFACELIB_CFLAGS: \"${SIPOPTAMPLINTERFACELIB_CFLAGS}\"" >&6;} fi ac_config_files="$ac_config_files Makefile src/ipopt.pc src/Makefile src/Apps/AmplSolver/Makefile src/Apps/AmplSolver/ipoptamplinterface.pc test/Makefile test/run_unitTests doc/Doxyfile examples/Cpp_example/Makefile examples/recursive_nlp/Makefile examples/hs071_cpp/Makefile examples/hs071_c/Makefile examples/ScalableProblems/Makefile tutorial/CodingExercise/C/1-skeleton/Makefile tutorial/CodingExercise/C/2-mistake/Makefile tutorial/CodingExercise/C/3-solution/Makefile tutorial/CodingExercise/Cpp/1-skeleton/Makefile tutorial/CodingExercise/Cpp/2-mistake/Makefile tutorial/CodingExercise/Cpp/3-solution/Makefile tutorial/CodingExercise/Matlab/1-skeleton/startup.m tutorial/CodingExercise/Matlab/2-mistake/startup.m tutorial/CodingExercise/Matlab/3-solution/startup.m" if test -n "$F77" ; then ac_config_files="$ac_config_files examples/hs071_f/Makefile" case $precision in single ) ac_config_files="$ac_config_files examples/hs071_f/hs071_fs.f" ;; double ) ac_config_files="$ac_config_files examples/hs071_f/hs071_f.f tutorial/CodingExercise/Fortran/1-skeleton/TutorialFortran.f tutorial/CodingExercise/Fortran/2-mistake/TutorialFortran.f tutorial/CodingExercise/Fortran/3-solution/TutorialFortran.f tutorial/CodingExercise/Fortran/1-skeleton/Makefile tutorial/CodingExercise/Fortran/2-mistake/Makefile tutorial/CodingExercise/Fortran/3-solution/Makefile" ;; esac fi if test "$enable_java" != no ; then ac_config_files="$ac_config_files examples/hs071_java/Makefile examples/ScalableProblems_java/Makefile" fi if test "$use_sipopt" = yes ; then ac_config_files="$ac_config_files contrib/sIPOPT/Makefile contrib/sIPOPT/src/Makefile contrib/sIPOPT/AmplSolver/Makefile contrib/sIPOPT/examples/parametric_cpp/Makefile contrib/sIPOPT/examples/parametric_dsdp_cpp/Makefile contrib/sIPOPT/examples/redhess_cpp/Makefile" fi # under Windows, the Makevars file for the R Interface need to be named Makevars.win case $build in *-cygwin* | *-mingw* | *-msys* ) ac_config_files="$ac_config_files contrib/RInterface/src/Makevars.win:contrib/RInterface/src/Makevars.in" ;; *) ac_config_files="$ac_config_files contrib/RInterface/src/Makevars" ;; esac ac_config_headers="$ac_config_headers src/Common/config.h src/Common/config_ipopt.h" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # 'ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* 'ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # 'set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # 'set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs case $enable_silent_rules in # ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; esac if test $am_cv_make_support_nested_variables = yes; then AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 printf %s "checking that generated files are newer than configure... " >&6; } if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: done" >&5 printf "%s\n" "done" >&6; } if test -n "$EXEEXT"; then am__EXEEXT_TRUE= am__EXEEXT_FALSE='#' else am__EXEEXT_TRUE='#' am__EXEEXT_FALSE= fi if test -z "${COIN_RELOCATABLE_TRUE}" && test -z "${COIN_RELOCATABLE_FALSE}"; then as_fn_error $? "conditional \"COIN_RELOCATABLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then as_fn_error $? "conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_F77_TRUE}" && test -z "${COIN_HAS_F77_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_F77\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_STATIC_BUILD_TRUE}" && test -z "${COIN_STATIC_BUILD_FALSE}"; then as_fn_error $? "conditional \"COIN_STATIC_BUILD\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_DOXYGEN_TRUE}" && test -z "${COIN_HAS_DOXYGEN_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_DOXYGEN\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_LATEX_TRUE}" && test -z "${COIN_HAS_LATEX_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_LATEX\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IPOPT_SINGLE_TRUE}" && test -z "${IPOPT_SINGLE_FALSE}"; then as_fn_error $? "conditional \"IPOPT_SINGLE\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${IPOPT_INT64_TRUE}" && test -z "${IPOPT_INT64_FALSE}"; then as_fn_error $? "conditional \"IPOPT_INT64\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_PKGCONFIG_TRUE}" && test -z "${COIN_HAS_PKGCONFIG_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_PKGCONFIG\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_LAPACK_TRUE}" && test -z "${COIN_HAS_LAPACK_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_LAPACK\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_ASL_TRUE}" && test -z "${COIN_HAS_ASL_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_ASL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_ASL_TRUE}" && test -z "${COIN_HAS_ASL_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_ASL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_MUMPS_TRUE}" && test -z "${COIN_HAS_MUMPS_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_MUMPS\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_HSL_TRUE}" && test -z "${COIN_HAS_HSL_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_HSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_HSL_TRUE}" && test -z "${COIN_HAS_HSL_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_HSL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_MA28_TRUE}" && test -z "${HAVE_MA28_FALSE}"; then as_fn_error $? "conditional \"HAVE_MA28\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_PARDISO_MKL_TRUE}" && test -z "${HAVE_PARDISO_MKL_FALSE}"; then as_fn_error $? "conditional \"HAVE_PARDISO_MKL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_SPRAL_TRUE}" && test -z "${COIN_HAS_SPRAL_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_SPRAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${COIN_HAS_SPRAL_TRUE}" && test -z "${COIN_HAS_SPRAL_FALSE}"; then as_fn_error $? "conditional \"COIN_HAS_SPRAL\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${HAVE_WSMP_TRUE}" && test -z "${HAVE_WSMP_FALSE}"; then as_fn_error $? "conditional \"HAVE_WSMP\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_INEXACT_TRUE}" && test -z "${BUILD_INEXACT_FALSE}"; then as_fn_error $? "conditional \"BUILD_INEXACT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_JAVA_TRUE}" && test -z "${BUILD_JAVA_FALSE}"; then as_fn_error $? "conditional \"BUILD_JAVA\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi if test -z "${BUILD_SIPOPT_TRUE}" && test -z "${BUILD_SIPOPT_FALSE}"; then as_fn_error $? "conditional \"BUILD_SIPOPT\" was never defined. Usually this means the macro was only invoked conditionally." "$LINENO" 5 fi : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case e in #( e) case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as 'sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else case e in #( e) as_fn_append () { eval $1=\$$1\$2 } ;; esac fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else case e in #( e) as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } ;; esac fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both 'ln -s file dir' and 'ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; 'ln -s' creates a wrapper executable. # In both cases, we have to default to 'cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_sed_cpp="y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g" as_tr_cpp="eval sed '$as_sed_cpp'" # deprecated # Sed expression to map a string onto a valid variable name. as_sed_sh="y%*+%pp%;s%[^_$as_cr_alnum]%_%g" as_tr_sh="eval sed '$as_sed_sh'" # deprecated exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by Ipopt $as_me 3.14.17, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" config_links="$ac_config_links" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ '$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Configuration links: $config_links Configuration commands: $config_commands Report bugs to . Ipopt home page: ." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ Ipopt config.status 3.14.17 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" Copyright (C) 2023 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: '$1' Try '$0 --help' for more information.";; --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: '$1' Try '$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" MAKE="${MAKE-make}" # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH sed_quote_subst='$sed_quote_subst' double_quote_subst='$double_quote_subst' delay_variable_subst='$delay_variable_subst' macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`' DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`' SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' FILECMD='`$ECHO "$FILECMD" | $SED "$delay_single_quote_subst"`' deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' lt_ar_flags='`$ECHO "$lt_ar_flags" | $SED "$delay_single_quote_subst"`' AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`' nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`' objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`' configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`' hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`' predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`' postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`' predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`' postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`' LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`' LD_F77='`$ECHO "$LD_F77" | $SED "$delay_single_quote_subst"`' reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`' reload_flag_F77='`$ECHO "$reload_flag_F77" | $SED "$delay_single_quote_subst"`' reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`' reload_cmds_F77='`$ECHO "$reload_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_cmds_F77='`$ECHO "$old_archive_cmds_F77" | $SED "$delay_single_quote_subst"`' compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`' compiler_F77='`$ECHO "$compiler_F77" | $SED "$delay_single_quote_subst"`' GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`' GCC_F77='`$ECHO "$GCC_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_no_builtin_flag_F77='`$ECHO "$lt_prog_compiler_no_builtin_flag_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_pic_F77='`$ECHO "$lt_prog_compiler_pic_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_wl_F77='`$ECHO "$lt_prog_compiler_wl_F77" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`' lt_prog_compiler_static_F77='`$ECHO "$lt_prog_compiler_static_F77" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`' lt_cv_prog_compiler_c_o_F77='`$ECHO "$lt_cv_prog_compiler_c_o_F77" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_need_lc_F77='`$ECHO "$archive_cmds_need_lc_F77" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`' enable_shared_with_static_runtimes_F77='`$ECHO "$enable_shared_with_static_runtimes_F77" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' export_dynamic_flag_spec_F77='`$ECHO "$export_dynamic_flag_spec_F77" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' whole_archive_flag_spec_F77='`$ECHO "$whole_archive_flag_spec_F77" | $SED "$delay_single_quote_subst"`' compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`' compiler_needs_object_F77='`$ECHO "$compiler_needs_object_F77" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_new_cmds_F77='`$ECHO "$old_archive_from_new_cmds_F77" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`' old_archive_from_expsyms_cmds_F77='`$ECHO "$old_archive_from_expsyms_cmds_F77" | $SED "$delay_single_quote_subst"`' archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_cmds_F77='`$ECHO "$archive_cmds_F77" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' archive_expsym_cmds_F77='`$ECHO "$archive_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_cmds_F77='`$ECHO "$module_cmds_F77" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`' module_expsym_cmds_F77='`$ECHO "$module_expsym_cmds_F77" | $SED "$delay_single_quote_subst"`' with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`' with_gnu_ld_F77='`$ECHO "$with_gnu_ld_F77" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' allow_undefined_flag_F77='`$ECHO "$allow_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`' no_undefined_flag_F77='`$ECHO "$no_undefined_flag_F77" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_flag_spec_F77='`$ECHO "$hardcode_libdir_flag_spec_F77" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`' hardcode_libdir_separator_F77='`$ECHO "$hardcode_libdir_separator_F77" | $SED "$delay_single_quote_subst"`' hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_F77='`$ECHO "$hardcode_direct_F77" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`' hardcode_direct_absolute_F77='`$ECHO "$hardcode_direct_absolute_F77" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`' hardcode_minus_L_F77='`$ECHO "$hardcode_minus_L_F77" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`' hardcode_shlibpath_var_F77='`$ECHO "$hardcode_shlibpath_var_F77" | $SED "$delay_single_quote_subst"`' hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`' hardcode_automatic_F77='`$ECHO "$hardcode_automatic_F77" | $SED "$delay_single_quote_subst"`' inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`' inherit_rpath_F77='`$ECHO "$inherit_rpath_F77" | $SED "$delay_single_quote_subst"`' link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`' link_all_deplibs_F77='`$ECHO "$link_all_deplibs_F77" | $SED "$delay_single_quote_subst"`' always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`' always_export_symbols_F77='`$ECHO "$always_export_symbols_F77" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`' export_symbols_cmds_F77='`$ECHO "$export_symbols_cmds_F77" | $SED "$delay_single_quote_subst"`' exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`' exclude_expsyms_F77='`$ECHO "$exclude_expsyms_F77" | $SED "$delay_single_quote_subst"`' include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`' include_expsyms_F77='`$ECHO "$include_expsyms_F77" | $SED "$delay_single_quote_subst"`' prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`' prelink_cmds_F77='`$ECHO "$prelink_cmds_F77" | $SED "$delay_single_quote_subst"`' postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`' postlink_cmds_F77='`$ECHO "$postlink_cmds_F77" | $SED "$delay_single_quote_subst"`' file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`' file_list_spec_F77='`$ECHO "$file_list_spec_F77" | $SED "$delay_single_quote_subst"`' hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`' hardcode_action_F77='`$ECHO "$hardcode_action_F77" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_dirs_F77='`$ECHO "$compiler_lib_search_dirs_F77" | $SED "$delay_single_quote_subst"`' predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`' predep_objects_F77='`$ECHO "$predep_objects_F77" | $SED "$delay_single_quote_subst"`' postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`' postdep_objects_F77='`$ECHO "$postdep_objects_F77" | $SED "$delay_single_quote_subst"`' predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`' predeps_F77='`$ECHO "$predeps_F77" | $SED "$delay_single_quote_subst"`' postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`' postdeps_F77='`$ECHO "$postdeps_F77" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`' compiler_lib_search_path_F77='`$ECHO "$compiler_lib_search_path_F77" | $SED "$delay_single_quote_subst"`' LTCC='$LTCC' LTCFLAGS='$LTCFLAGS' compiler='$compiler_DEFAULT' # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } # Quote evaled strings. for var in AS \ DLLTOOL \ OBJDUMP \ SHELL \ ECHO \ PATH_SEPARATOR \ SED \ GREP \ EGREP \ FGREP \ LD \ NM \ LN_S \ lt_SP2NL \ lt_NL2SP \ reload_flag \ FILECMD \ deplibs_check_method \ file_magic_cmd \ file_magic_glob \ want_nocaseglob \ sharedlib_from_linklib_cmd \ AR \ archiver_list_spec \ STRIP \ RANLIB \ CC \ CFLAGS \ compiler \ lt_cv_sys_global_symbol_pipe \ lt_cv_sys_global_symbol_to_cdecl \ lt_cv_sys_global_symbol_to_import \ lt_cv_sys_global_symbol_to_c_name_address \ lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ lt_cv_nm_interface \ nm_file_list_spec \ lt_cv_truncate_bin \ lt_prog_compiler_no_builtin_flag \ lt_prog_compiler_pic \ lt_prog_compiler_wl \ lt_prog_compiler_static \ lt_cv_prog_compiler_c_o \ need_locks \ MANIFEST_TOOL \ DSYMUTIL \ NMEDIT \ LIPO \ OTOOL \ OTOOL64 \ shrext_cmds \ export_dynamic_flag_spec \ whole_archive_flag_spec \ compiler_needs_object \ with_gnu_ld \ allow_undefined_flag \ no_undefined_flag \ hardcode_libdir_flag_spec \ hardcode_libdir_separator \ exclude_expsyms \ include_expsyms \ file_list_spec \ variables_saved_for_relink \ libname_spec \ library_names_spec \ soname_spec \ install_override_mode \ finish_eval \ old_striplib \ striplib \ compiler_lib_search_dirs \ predep_objects \ postdep_objects \ predeps \ postdeps \ compiler_lib_search_path \ LD_CXX \ LD_F77 \ reload_flag_CXX \ reload_flag_F77 \ compiler_CXX \ compiler_F77 \ lt_prog_compiler_no_builtin_flag_CXX \ lt_prog_compiler_no_builtin_flag_F77 \ lt_prog_compiler_pic_CXX \ lt_prog_compiler_pic_F77 \ lt_prog_compiler_wl_CXX \ lt_prog_compiler_wl_F77 \ lt_prog_compiler_static_CXX \ lt_prog_compiler_static_F77 \ lt_cv_prog_compiler_c_o_CXX \ lt_cv_prog_compiler_c_o_F77 \ export_dynamic_flag_spec_CXX \ export_dynamic_flag_spec_F77 \ whole_archive_flag_spec_CXX \ whole_archive_flag_spec_F77 \ compiler_needs_object_CXX \ compiler_needs_object_F77 \ with_gnu_ld_CXX \ with_gnu_ld_F77 \ allow_undefined_flag_CXX \ allow_undefined_flag_F77 \ no_undefined_flag_CXX \ no_undefined_flag_F77 \ hardcode_libdir_flag_spec_CXX \ hardcode_libdir_flag_spec_F77 \ hardcode_libdir_separator_CXX \ hardcode_libdir_separator_F77 \ exclude_expsyms_CXX \ exclude_expsyms_F77 \ include_expsyms_CXX \ include_expsyms_F77 \ file_list_spec_CXX \ file_list_spec_F77 \ compiler_lib_search_dirs_CXX \ compiler_lib_search_dirs_F77 \ predep_objects_CXX \ predep_objects_F77 \ postdep_objects_CXX \ postdep_objects_F77 \ predeps_CXX \ predeps_F77 \ postdeps_CXX \ postdeps_F77 \ compiler_lib_search_path_CXX \ compiler_lib_search_path_F77; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done # Double-quote double-evaled strings. for var in reload_cmds \ old_postinstall_cmds \ old_postuninstall_cmds \ old_archive_cmds \ extract_expsyms_cmds \ old_archive_from_new_cmds \ old_archive_from_expsyms_cmds \ archive_cmds \ archive_expsym_cmds \ module_cmds \ module_expsym_cmds \ export_symbols_cmds \ prelink_cmds \ postlink_cmds \ postinstall_cmds \ postuninstall_cmds \ finish_cmds \ sys_lib_search_path_spec \ configure_time_dlsearch_path \ configure_time_lt_sys_library_path \ reload_cmds_CXX \ reload_cmds_F77 \ old_archive_cmds_CXX \ old_archive_cmds_F77 \ old_archive_from_new_cmds_CXX \ old_archive_from_new_cmds_F77 \ old_archive_from_expsyms_cmds_CXX \ old_archive_from_expsyms_cmds_F77 \ archive_cmds_CXX \ archive_cmds_F77 \ archive_expsym_cmds_CXX \ archive_expsym_cmds_F77 \ module_cmds_CXX \ module_cmds_F77 \ module_expsym_cmds_CXX \ module_expsym_cmds_F77 \ export_symbols_cmds_CXX \ export_symbols_cmds_F77 \ prelink_cmds_CXX \ prelink_cmds_F77 \ postlink_cmds_CXX \ postlink_cmds_F77; do case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in *[\\\\\\\`\\"\\\$]*) eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes ;; *) eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" ;; esac done ac_aux_dir='$ac_aux_dir' # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes INIT. if test -n "\${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi PACKAGE='$PACKAGE' VERSION='$VERSION' RM='$RM' ofile='$ofile' _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "libtoolclpatch") CONFIG_COMMANDS="$CONFIG_COMMANDS libtoolclpatch" ;; "libtoolmingwpatch") CONFIG_COMMANDS="$CONFIG_COMMANDS libtoolmingwpatch" ;; "test/hs071_main.cpp") CONFIG_LINKS="$CONFIG_LINKS test/hs071_main.cpp:examples/hs071_cpp/hs071_main.cpp" ;; "test/hs071_nlp.cpp") CONFIG_LINKS="$CONFIG_LINKS test/hs071_nlp.cpp:examples/hs071_cpp/hs071_nlp.cpp" ;; "test/hs071_nlp.hpp") CONFIG_LINKS="$CONFIG_LINKS test/hs071_nlp.hpp:examples/hs071_cpp/hs071_nlp.hpp" ;; "test/hs071_c.c") CONFIG_LINKS="$CONFIG_LINKS test/hs071_c.c:examples/hs071_c/hs071_c.c" ;; "test/parametric_driver.cpp") CONFIG_LINKS="$CONFIG_LINKS test/parametric_driver.cpp:contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp" ;; "test/parametricTNLP.cpp") CONFIG_LINKS="$CONFIG_LINKS test/parametricTNLP.cpp:contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp" ;; "test/MySensTNLP.cpp") CONFIG_LINKS="$CONFIG_LINKS test/MySensTNLP.cpp:contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp" ;; "test/redhess_cpp.cpp") CONFIG_LINKS="$CONFIG_LINKS test/redhess_cpp.cpp:contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp" ;; "contrib/RInterface/DESCRIPTION") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/DESCRIPTION:contrib/RInterface/DESCRIPTION" ;; "contrib/RInterface/NAMESPACE") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/NAMESPACE:contrib/RInterface/NAMESPACE" ;; "contrib/RInterface/inst/CITATION") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/inst/CITATION:contrib/RInterface/inst/CITATION" ;; "contrib/RInterface/inst/doc/ipoptr.Rnw") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/inst/doc/ipoptr.Rnw:contrib/RInterface/inst/doc/ipoptr.Rnw" ;; "contrib/RInterface/inst/doc/ipoptr.pdf") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/inst/doc/ipoptr.pdf:contrib/RInterface/inst/doc/ipoptr.pdf" ;; "contrib/RInterface/inst/doc/reflist.bib") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/inst/doc/reflist.bib:contrib/RInterface/inst/doc/reflist.bib" ;; "contrib/RInterface/man/ipoptr-package.Rd") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/man/ipoptr-package.Rd:contrib/RInterface/man/ipoptr-package.Rd" ;; "contrib/RInterface/man/ipoptr.Rd") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/man/ipoptr.Rd:contrib/RInterface/man/ipoptr.Rd" ;; "contrib/RInterface/man/is.ipoptr.Rd") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/man/is.ipoptr.Rd:contrib/RInterface/man/is.ipoptr.Rd" ;; "contrib/RInterface/man/make.sparse.Rd") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/man/make.sparse.Rd:contrib/RInterface/man/make.sparse.Rd" ;; "contrib/RInterface/man/plot.sparseness.Rd") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/man/plot.sparseness.Rd:contrib/RInterface/man/plot.sparseness.Rd" ;; "contrib/RInterface/man/print.ipoptr.Rd") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/man/print.ipoptr.Rd:contrib/RInterface/man/print.ipoptr.Rd" ;; "contrib/RInterface/man/print.sparseness.Rd") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/man/print.sparseness.Rd:contrib/RInterface/man/print.sparseness.Rd" ;; "contrib/RInterface/R/get.option.types.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/R/get.option.types.R:contrib/RInterface/R/get.option.types.R" ;; "contrib/RInterface/R/ipoptr.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/R/ipoptr.R:contrib/RInterface/R/ipoptr.R" ;; "contrib/RInterface/R/is.ipoptr.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/R/is.ipoptr.R:contrib/RInterface/R/is.ipoptr.R" ;; "contrib/RInterface/R/make.sparse.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/R/make.sparse.R:contrib/RInterface/R/make.sparse.R" ;; "contrib/RInterface/R/plot.sparseness.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/R/plot.sparseness.R:contrib/RInterface/R/plot.sparseness.R" ;; "contrib/RInterface/R/print.ipoptr.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/R/print.ipoptr.R:contrib/RInterface/R/print.ipoptr.R" ;; "contrib/RInterface/R/print.sparseness.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/R/print.sparseness.R:contrib/RInterface/R/print.sparseness.R" ;; "contrib/RInterface/tests/approx_banana.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/tests/approx_banana.R:contrib/RInterface/tests/approx_banana.R" ;; "contrib/RInterface/tests/banana.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/tests/banana.R:contrib/RInterface/tests/banana.R" ;; "contrib/RInterface/tests/hs071_nlp.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/tests/hs071_nlp.R:contrib/RInterface/tests/hs071_nlp.R" ;; "contrib/RInterface/tests/lasso.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/tests/lasso.R:contrib/RInterface/tests/lasso.R" ;; "contrib/RInterface/tests/mynlp.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/tests/mynlp.R:contrib/RInterface/tests/mynlp.R" ;; "contrib/RInterface/tests/parameters.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/tests/parameters.R:contrib/RInterface/tests/parameters.R" ;; "contrib/RInterface/tests/sparseness.R") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/tests/sparseness.R:contrib/RInterface/tests/sparseness.R" ;; "contrib/RInterface/src/ipoptr.cpp") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/src/ipoptr.cpp:contrib/RInterface/src/ipoptr.cpp" ;; "contrib/RInterface/src/IpoptRJournal.cpp") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/src/IpoptRJournal.cpp:contrib/RInterface/src/IpoptRJournal.cpp" ;; "contrib/RInterface/src/IpoptRNLP.cpp") CONFIG_LINKS="$CONFIG_LINKS contrib/RInterface/src/IpoptRNLP.cpp:contrib/RInterface/src/IpoptRNLP.cpp" ;; "examples/Cpp_example/cpp_example.cpp") CONFIG_LINKS="$CONFIG_LINKS examples/Cpp_example/cpp_example.cpp:examples/Cpp_example/cpp_example.cpp" ;; "examples/Cpp_example/MyNLP.cpp") CONFIG_LINKS="$CONFIG_LINKS examples/Cpp_example/MyNLP.cpp:examples/Cpp_example/MyNLP.cpp" ;; "examples/Cpp_example/MyNLP.hpp") CONFIG_LINKS="$CONFIG_LINKS examples/Cpp_example/MyNLP.hpp:examples/Cpp_example/MyNLP.hpp" ;; "examples/hs071_cpp/hs071_main.cpp") CONFIG_LINKS="$CONFIG_LINKS examples/hs071_cpp/hs071_main.cpp:examples/hs071_cpp/hs071_main.cpp" ;; "examples/hs071_cpp/hs071_nlp.cpp") CONFIG_LINKS="$CONFIG_LINKS examples/hs071_cpp/hs071_nlp.cpp:examples/hs071_cpp/hs071_nlp.cpp" ;; "examples/hs071_cpp/hs071_nlp.hpp") CONFIG_LINKS="$CONFIG_LINKS examples/hs071_cpp/hs071_nlp.hpp:examples/hs071_cpp/hs071_nlp.hpp" ;; "examples/hs071_c/hs071_c.c") CONFIG_LINKS="$CONFIG_LINKS examples/hs071_c/hs071_c.c:examples/hs071_c/hs071_c.c" ;; "examples/hs071_java/HS071s.java") CONFIG_LINKS="$CONFIG_LINKS examples/hs071_java/HS071s.java:examples/hs071_java/HS071s.java" ;; "examples/hs071_java/HS071.java") CONFIG_LINKS="$CONFIG_LINKS examples/hs071_java/HS071.java:examples/hs071_java/HS071.java" ;; "tutorial/AmplExperiments/hs71.mod") CONFIG_LINKS="$CONFIG_LINKS tutorial/AmplExperiments/hs71.mod:tutorial/AmplExperiments/hs71.mod" ;; "tutorial/AmplExperiments/infeasible.mod") CONFIG_LINKS="$CONFIG_LINKS tutorial/AmplExperiments/infeasible.mod:tutorial/AmplExperiments/infeasible.mod" ;; "tutorial/AmplExperiments/MoreAmplModels.txt") CONFIG_LINKS="$CONFIG_LINKS tutorial/AmplExperiments/MoreAmplModels.txt:tutorial/AmplExperiments/MoreAmplModels.txt" ;; "tutorial/AmplExperiments/car1.run") CONFIG_LINKS="$CONFIG_LINKS tutorial/AmplExperiments/car1.run:tutorial/AmplExperiments/car1.run" ;; "tutorial/AmplExperiments/car1.gp") CONFIG_LINKS="$CONFIG_LINKS tutorial/AmplExperiments/car1.gp:tutorial/AmplExperiments/car1.gp" ;; "tutorial/Modeling/bad1.mod") CONFIG_LINKS="$CONFIG_LINKS tutorial/Modeling/bad1.mod:tutorial/Modeling/bad1.mod" ;; "tutorial/Modeling/bad1-fix1.mod") CONFIG_LINKS="$CONFIG_LINKS tutorial/Modeling/bad1-fix1.mod:tutorial/Modeling/bad1-fix1.mod" ;; "tutorial/Modeling/bad1-fix2.mod") CONFIG_LINKS="$CONFIG_LINKS tutorial/Modeling/bad1-fix2.mod:tutorial/Modeling/bad1-fix2.mod" ;; "tutorial/CodingExercise/exercise_example.mod") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/exercise_example.mod:tutorial/CodingExercise/exercise_example.mod" ;; "tutorial/CodingExercise/C/1-skeleton/TutorialC.c") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/C/1-skeleton/TutorialC.c:tutorial/CodingExercise/C/1-skeleton/TutorialC.c" ;; "tutorial/CodingExercise/C/2-mistake/TutorialC.c") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/C/2-mistake/TutorialC.c:tutorial/CodingExercise/C/2-mistake/TutorialC.c" ;; "tutorial/CodingExercise/C/3-solution/TutorialC.c") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/C/3-solution/TutorialC.c:tutorial/CodingExercise/C/3-solution/TutorialC.c" ;; "tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_main.cpp") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_main.cpp:tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_main.cpp" ;; "tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.hpp") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.hpp:tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.hpp" ;; "tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.cpp") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.cpp:tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.cpp" ;; "tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_main.cpp") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_main.cpp:tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_main.cpp" ;; "tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.hpp") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.hpp:tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.hpp" ;; "tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.cpp") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.cpp:tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.cpp" ;; "tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_main.cpp") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_main.cpp:tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_main.cpp" ;; "tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.hpp") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.hpp:tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.hpp" ;; "tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.cpp") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.cpp:tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.cpp" ;; "tutorial/CodingExercise/Matlab/1-skeleton/TutorialMatlab.m") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Matlab/1-skeleton/TutorialMatlab.m:tutorial/CodingExercise/Matlab/1-skeleton/TutorialMatlab.m" ;; "tutorial/CodingExercise/Matlab/2-mistake/TutorialMatlab.m") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Matlab/2-mistake/TutorialMatlab.m:tutorial/CodingExercise/Matlab/2-mistake/TutorialMatlab.m" ;; "tutorial/CodingExercise/Matlab/3-solution/TutorialMatlab.m") CONFIG_LINKS="$CONFIG_LINKS tutorial/CodingExercise/Matlab/3-solution/TutorialMatlab.m:tutorial/CodingExercise/Matlab/3-solution/TutorialMatlab.m" ;; "contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp") CONFIG_LINKS="$CONFIG_LINKS contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp:contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp" ;; "contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp") CONFIG_LINKS="$CONFIG_LINKS contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp:contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp" ;; "contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.hpp") CONFIG_LINKS="$CONFIG_LINKS contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.hpp:contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.hpp" ;; "contrib/sIPOPT/examples/parametric_dsdp_cpp/parametric_dsdp_driver.cpp") CONFIG_LINKS="$CONFIG_LINKS contrib/sIPOPT/examples/parametric_dsdp_cpp/parametric_dsdp_driver.cpp:contrib/sIPOPT/examples/parametric_dsdp_cpp/parametric_dsdp_driver.cpp" ;; "contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.cpp") CONFIG_LINKS="$CONFIG_LINKS contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.cpp:contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.cpp" ;; "contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.hpp") CONFIG_LINKS="$CONFIG_LINKS contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.hpp:contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.hpp" ;; "contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp") CONFIG_LINKS="$CONFIG_LINKS contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp:contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp" ;; "contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.hpp") CONFIG_LINKS="$CONFIG_LINKS contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.hpp:contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.hpp" ;; "contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp") CONFIG_LINKS="$CONFIG_LINKS contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp:contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/ipopt.pc") CONFIG_FILES="$CONFIG_FILES src/ipopt.pc" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "src/Apps/AmplSolver/Makefile") CONFIG_FILES="$CONFIG_FILES src/Apps/AmplSolver/Makefile" ;; "src/Apps/AmplSolver/ipoptamplinterface.pc") CONFIG_FILES="$CONFIG_FILES src/Apps/AmplSolver/ipoptamplinterface.pc" ;; "test/Makefile") CONFIG_FILES="$CONFIG_FILES test/Makefile" ;; "test/run_unitTests") CONFIG_FILES="$CONFIG_FILES test/run_unitTests" ;; "doc/Doxyfile") CONFIG_FILES="$CONFIG_FILES doc/Doxyfile" ;; "examples/Cpp_example/Makefile") CONFIG_FILES="$CONFIG_FILES examples/Cpp_example/Makefile" ;; "examples/recursive_nlp/Makefile") CONFIG_FILES="$CONFIG_FILES examples/recursive_nlp/Makefile" ;; "examples/hs071_cpp/Makefile") CONFIG_FILES="$CONFIG_FILES examples/hs071_cpp/Makefile" ;; "examples/hs071_c/Makefile") CONFIG_FILES="$CONFIG_FILES examples/hs071_c/Makefile" ;; "examples/ScalableProblems/Makefile") CONFIG_FILES="$CONFIG_FILES examples/ScalableProblems/Makefile" ;; "tutorial/CodingExercise/C/1-skeleton/Makefile") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/C/1-skeleton/Makefile" ;; "tutorial/CodingExercise/C/2-mistake/Makefile") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/C/2-mistake/Makefile" ;; "tutorial/CodingExercise/C/3-solution/Makefile") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/C/3-solution/Makefile" ;; "tutorial/CodingExercise/Cpp/1-skeleton/Makefile") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Cpp/1-skeleton/Makefile" ;; "tutorial/CodingExercise/Cpp/2-mistake/Makefile") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Cpp/2-mistake/Makefile" ;; "tutorial/CodingExercise/Cpp/3-solution/Makefile") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Cpp/3-solution/Makefile" ;; "tutorial/CodingExercise/Matlab/1-skeleton/startup.m") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Matlab/1-skeleton/startup.m" ;; "tutorial/CodingExercise/Matlab/2-mistake/startup.m") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Matlab/2-mistake/startup.m" ;; "tutorial/CodingExercise/Matlab/3-solution/startup.m") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Matlab/3-solution/startup.m" ;; "examples/hs071_f/Makefile") CONFIG_FILES="$CONFIG_FILES examples/hs071_f/Makefile" ;; "examples/hs071_f/hs071_fs.f") CONFIG_FILES="$CONFIG_FILES examples/hs071_f/hs071_fs.f" ;; "examples/hs071_f/hs071_f.f") CONFIG_FILES="$CONFIG_FILES examples/hs071_f/hs071_f.f" ;; "tutorial/CodingExercise/Fortran/1-skeleton/TutorialFortran.f") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Fortran/1-skeleton/TutorialFortran.f" ;; "tutorial/CodingExercise/Fortran/2-mistake/TutorialFortran.f") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Fortran/2-mistake/TutorialFortran.f" ;; "tutorial/CodingExercise/Fortran/3-solution/TutorialFortran.f") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Fortran/3-solution/TutorialFortran.f" ;; "tutorial/CodingExercise/Fortran/1-skeleton/Makefile") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Fortran/1-skeleton/Makefile" ;; "tutorial/CodingExercise/Fortran/2-mistake/Makefile") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Fortran/2-mistake/Makefile" ;; "tutorial/CodingExercise/Fortran/3-solution/Makefile") CONFIG_FILES="$CONFIG_FILES tutorial/CodingExercise/Fortran/3-solution/Makefile" ;; "examples/hs071_java/Makefile") CONFIG_FILES="$CONFIG_FILES examples/hs071_java/Makefile" ;; "examples/ScalableProblems_java/Makefile") CONFIG_FILES="$CONFIG_FILES examples/ScalableProblems_java/Makefile" ;; "contrib/sIPOPT/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/sIPOPT/Makefile" ;; "contrib/sIPOPT/src/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/sIPOPT/src/Makefile" ;; "contrib/sIPOPT/AmplSolver/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/sIPOPT/AmplSolver/Makefile" ;; "contrib/sIPOPT/examples/parametric_cpp/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/sIPOPT/examples/parametric_cpp/Makefile" ;; "contrib/sIPOPT/examples/parametric_dsdp_cpp/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/sIPOPT/examples/parametric_dsdp_cpp/Makefile" ;; "contrib/sIPOPT/examples/redhess_cpp/Makefile") CONFIG_FILES="$CONFIG_FILES contrib/sIPOPT/examples/redhess_cpp/Makefile" ;; "contrib/RInterface/src/Makevars.win") CONFIG_FILES="$CONFIG_FILES contrib/RInterface/src/Makevars.win:contrib/RInterface/src/Makevars.in" ;; "contrib/RInterface/src/Makevars") CONFIG_FILES="$CONFIG_FILES contrib/RInterface/src/Makevars" ;; "src/Common/config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/Common/config.h" ;; "src/Common/config_ipopt.h") CONFIG_HEADERS="$CONFIG_HEADERS src/Common/config_ipopt.h" ;; *) as_fn_error $? "invalid argument: '$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files test ${CONFIG_HEADERS+y} || CONFIG_HEADERS=$config_headers test ${CONFIG_LINKS+y} || CONFIG_LINKS=$config_links test ${CONFIG_COMMANDS+y} || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to '$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with './config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with './config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script 'defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :L $CONFIG_LINKS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag '$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain ':'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: '$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is 'configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when '$srcdir' = '.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable 'datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 printf "%s\n" "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else printf "%s\n" "/* $configure_input */" >&1 \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :L) # # CONFIG_LINK # if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then : else # Prefer the file from the source tree if names are identical. if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then ac_source=$srcdir/$ac_source fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5 printf "%s\n" "$as_me: linking $ac_source to $ac_file" >&6;} if test ! -r "$ac_source"; then as_fn_error $? "$ac_source: file not found" "$LINENO" 5 fi rm -f "$ac_file" # Try a relative symlink, then a hard link, then a copy. case $ac_source in [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;; *) ac_rel_source=$ac_top_build_prefix$ac_source ;; esac ln -s "$ac_rel_source" "$ac_file" 2>/dev/null || ln "$ac_source" "$ac_file" 2>/dev/null || cp -p "$ac_source" "$ac_file" || as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5 fi ;; :C) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 printf "%s\n" "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. # TODO: see whether this extra hack can be removed once we start # requiring Autoconf 2.70 or later. case $CONFIG_FILES in #( *\'*) : eval set x "$CONFIG_FILES" ;; #( *) : set x $CONFIG_FILES ;; #( *) : ;; esac shift # Used to flag and report bootstrapping failures. am_rc=0 for am_mf do # Strip MF so we end up with the name of the file. am_mf=`printf "%s\n" "$am_mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile which includes # dependency-tracking related rules and includes. # Grep'ing the whole file directly is not great: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. sed -n 's,^am--depfiles:.*,X,p' "$am_mf" | grep X >/dev/null 2>&1 \ || continue am_dirpart=`$as_dirname -- "$am_mf" || $as_expr X"$am_mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$am_mf" : 'X\(//\)[^/]' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$am_mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` am_filepart=`$as_basename -- "$am_mf" || $as_expr X/"$am_mf" : '.*/\([^/][^/]*\)/*$' \| \ X"$am_mf" : 'X\(//\)$' \| \ X"$am_mf" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$am_mf" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` { echo "$as_me:$LINENO: cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles" >&5 (cd "$am_dirpart" \ && sed -e '/# am--include-marker/d' "$am_filepart" \ | $MAKE -f - am--depfiles) >&5 2>&5 ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } || am_rc=$? done if test $am_rc -ne 0; then { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in '$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in '$ac_pwd':" >&2;} as_fn_error $? "Something went wrong bootstrapping makefile fragments for automatic dependency tracking. If GNU make was not used, consider re-running the configure script with MAKE=\"gmake\" (or whatever is necessary). You can also try re-running configure with the '--disable-dependency-tracking' option to at least be able to build the package (albeit without support for automatic dependency tracking). See 'config.log' for more details" "$LINENO" 5; } fi { am_dirpart=; unset am_dirpart;} { am_filepart=; unset am_filepart;} { am_mf=; unset am_mf;} { am_rc=; unset am_rc;} rm -f conftest-deps.mk } ;; "libtool":C) # See if we are running on zsh, and set the options that allow our # commands through without removal of \ escapes. if test -n "${ZSH_VERSION+set}"; then setopt NO_GLOB_SUBST fi cfgfile=${ofile}T trap "$RM \"$cfgfile\"; exit 1" 1 2 15 $RM "$cfgfile" cat <<_LT_EOF >> "$cfgfile" #! $SHELL # Generated automatically by $as_me ($PACKAGE) $VERSION # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. # Written by Gordon Matzigkeit, 1996 # Copyright (C) 2024 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program or library that is built # using GNU Libtool, you may include this file under the same # distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # The names of the tagged configurations supported by this script. available_tags='CXX F77 ' # Configured defaults for sys_lib_dlsearch_path munging. : \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} # ### BEGIN LIBTOOL CONFIG # Which release of libtool.m4 was used? macro_version=$macro_version macro_revision=$macro_revision # Whether or not to build static libraries. build_old_libs=$enable_static # What type of objects to build. pic_mode=$pic_mode # Assembler program. AS=$lt_AS # DLL creation program. DLLTOOL=$lt_DLLTOOL # Object dumper program. OBJDUMP=$lt_OBJDUMP # Whether or not to build shared libraries. build_libtool_libs=$enable_shared # Whether or not to optimize for fast installation. fast_install=$enable_fast_install # Shared archive member basename,for filename based shared library versioning on AIX. shared_archive_member_spec=$shared_archive_member_spec # Shell to use when invoking shell scripts. SHELL=$lt_SHELL # An echo program that protects backslashes. ECHO=$lt_ECHO # The PATH separator for the build system. PATH_SEPARATOR=$lt_PATH_SEPARATOR # The host system. host_alias=$host_alias host=$host host_os=$host_os # The build system. build_alias=$build_alias build=$build build_os=$build_os # A sed program that does not truncate output. SED=$lt_SED # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="\$SED -e 1s/^X//" # A grep program that handles long lines. GREP=$lt_GREP # An ERE matcher. EGREP=$lt_EGREP # A literal string matcher. FGREP=$lt_FGREP # A BSD- or MS-compatible name lister. NM=$lt_NM # Whether we need soft or hard links. LN_S=$lt_LN_S # What is the maximum length of a command? max_cmd_len=$max_cmd_len # Object file suffix (normally "o"). objext=$ac_objext # Executable file suffix (normally ""). exeext=$exeext # whether the shell understands "unset". lt_unset=$lt_unset # turn spaces into newlines. SP2NL=$lt_lt_SP2NL # turn newlines into spaces. NL2SP=$lt_lt_NL2SP # convert \$build file names to \$host format. to_host_file_cmd=$lt_cv_to_host_file_cmd # convert \$build files to toolchain format. to_tool_file_cmd=$lt_cv_to_tool_file_cmd # A file(cmd) program that detects file types. FILECMD=$lt_FILECMD # Method to check whether dependent libraries are shared objects. deplibs_check_method=$lt_deplibs_check_method # Command to use when deplibs_check_method = "file_magic". file_magic_cmd=$lt_file_magic_cmd # How to find potential files when deplibs_check_method = "file_magic". file_magic_glob=$lt_file_magic_glob # Find potential files using nocaseglob when deplibs_check_method = "file_magic". want_nocaseglob=$lt_want_nocaseglob # Command to associate shared and link libraries. sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd # The archiver. AR=$lt_AR # Flags to create an archive (by configure). lt_ar_flags=$lt_ar_flags # Flags to create an archive. AR_FLAGS=\${ARFLAGS-"\$lt_ar_flags"} # How to feed a file listing to the archiver. archiver_list_spec=$lt_archiver_list_spec # A symbol stripping program. STRIP=$lt_STRIP # Commands used to install an old-style archive. RANLIB=$lt_RANLIB old_postinstall_cmds=$lt_old_postinstall_cmds old_postuninstall_cmds=$lt_old_postuninstall_cmds # Whether to use a lock for old archive extraction. lock_old_archive_extraction=$lock_old_archive_extraction # A C compiler. LTCC=$lt_CC # LTCC compiler flags. LTCFLAGS=$lt_CFLAGS # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl # Transform the output of nm into a list of symbols to manually relocate. global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address # Transform the output of nm in a C name address pair when lib prefix is needed. global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix # The name lister interface. nm_interface=$lt_lt_cv_nm_interface # Specify filename containing input files for \$NM. nm_file_list_spec=$lt_nm_file_list_spec # The root where to search for dependent libraries,and where our libraries should be installed. lt_sysroot=$lt_sysroot # Command to truncate a binary pipe. lt_truncate_bin=$lt_lt_cv_truncate_bin # The name of the directory that contains temporary libtool files. objdir=$objdir # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=$MAGIC_CMD # Must we lock files when doing compilation? need_locks=$lt_need_locks # Manifest tool. MANIFEST_TOOL=$lt_MANIFEST_TOOL # Tool to manipulate archived DWARF debug symbol files on Mac OS X. DSYMUTIL=$lt_DSYMUTIL # Tool to change global to local symbols on Mac OS X. NMEDIT=$lt_NMEDIT # Tool to manipulate fat objects and archives on Mac OS X. LIPO=$lt_LIPO # ldd/readelf like tool for Mach-O binaries on Mac OS X. OTOOL=$lt_OTOOL # ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. OTOOL64=$lt_OTOOL64 # Old archive suffix (normally "a"). libext=$libext # Shared library suffix (normally ".so"). shrext_cmds=$lt_shrext_cmds # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds=$lt_extract_expsyms_cmds # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink=$lt_variables_saved_for_relink # Do we need the "lib" prefix for modules? need_lib_prefix=$need_lib_prefix # Do we need a version for libraries? need_version=$need_version # Library versioning type. version_type=$version_type # Shared library runtime path variable. runpath_var=$runpath_var # Shared library path variable. shlibpath_var=$shlibpath_var # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=$shlibpath_overrides_runpath # Format of library name prefix. libname_spec=$lt_libname_spec # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec=$lt_library_names_spec # The coded name of the library, if different from the real name. soname_spec=$lt_soname_spec # Permission mode override for installation of shared libraries. install_override_mode=$lt_install_override_mode # Command to use after installation of a shared archive. postinstall_cmds=$lt_postinstall_cmds # Command to use after uninstallation of a shared archive. postuninstall_cmds=$lt_postuninstall_cmds # Commands used to finish a libtool library installation in a directory. finish_cmds=$lt_finish_cmds # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval=$lt_finish_eval # Whether we should hardcode library paths into libraries. hardcode_into_libs=$hardcode_into_libs # Compile-time system search path for libraries. sys_lib_search_path_spec=$lt_sys_lib_search_path_spec # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path # Explicit LT_SYS_LIBRARY_PATH set during ./configure time. configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path # Whether dlopen is supported. dlopen_support=$enable_dlopen # Whether dlopen of programs is supported. dlopen_self=$enable_dlopen_self # Whether dlopen of statically linked programs is supported. dlopen_self_static=$enable_dlopen_self_static # Commands to strip libraries. old_striplib=$lt_old_striplib striplib=$lt_striplib # The linker used to build libraries. LD=$lt_LD # How to create reloadable object files. reload_flag=$lt_reload_flag reload_cmds=$lt_reload_cmds # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds # A language specific compiler. CC=$lt_compiler # Is the compiler the GNU compiler? with_gcc=$GCC # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds archive_expsym_cmds=$lt_archive_expsym_cmds # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds module_expsym_cmds=$lt_module_expsym_cmds # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e. impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms # Symbols that must always be exported. include_expsyms=$lt_include_expsyms # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds # Specify filename containing input files. file_list_spec=$lt_file_list_spec # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects postdep_objects=$lt_postdep_objects predeps=$lt_predeps postdeps=$lt_postdeps # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path # ### END LIBTOOL CONFIG _LT_EOF cat <<'_LT_EOF' >> "$cfgfile" # ### BEGIN FUNCTIONS SHARED WITH CONFIGURE # func_munge_path_list VARIABLE PATH # ----------------------------------- # VARIABLE is name of variable containing _space_ separated list of # directories to be munged by the contents of PATH, which is string # having a format: # "DIR[:DIR]:" # string "DIR[ DIR]" will be prepended to VARIABLE # ":DIR[:DIR]" # string "DIR[ DIR]" will be appended to VARIABLE # "DIRP[:DIRP]::[DIRA:]DIRA" # string "DIRP[ DIRP]" will be prepended to VARIABLE and string # "DIRA[ DIRA]" will be appended to VARIABLE # "DIR[:DIR]" # VARIABLE will be replaced by "DIR[ DIR]" func_munge_path_list () { case x$2 in x) ;; *:) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" ;; x:*) eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" ;; *::*) eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" ;; *) eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" ;; esac } # Calculate cc_basename. Skip known compiler wrappers and cross-prefix. func_cc_basename () { for cc_temp in $*""; do case $cc_temp in compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; \-*) ;; *) break;; esac done func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` } # ### END FUNCTIONS SHARED WITH CONFIGURE _LT_EOF case $host_os in aix3*) cat <<\_LT_EOF >> "$cfgfile" # AIX sometimes has problems with the GCC collect2 program. For some # reason, if we set the COLLECT_NAMES environment variable, the problems # vanish in a puff of smoke. if test set != "${COLLECT_NAMES+set}"; then COLLECT_NAMES= export COLLECT_NAMES fi _LT_EOF ;; esac ltmain=$ac_aux_dir/ltmain.sh # We use sed instead of cat because bash on DJGPP gets confused if # if finds mixed CR/LF and LF-only lines. Since sed operates in # text mode, it properly converts lines to CR/LF. This bash problem # is reportedly fixed, but why not run on old versions too? $SED '$q' "$ltmain" >> "$cfgfile" \ || (rm -f "$cfgfile"; exit 1) mv -f "$cfgfile" "$ofile" || (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") chmod +x "$ofile" cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD=$lt_LD_CXX # How to create reloadable object files. reload_flag=$lt_reload_flag_CXX reload_cmds=$lt_reload_cmds_CXX # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_CXX # A language specific compiler. CC=$lt_compiler_CXX # Is the compiler the GNU compiler? with_gcc=$GCC_CXX # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_CXX # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_CXX # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_CXX # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_CXX # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_CXX # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_CXX archive_expsym_cmds=$lt_archive_expsym_cmds_CXX # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_CXX module_expsym_cmds=$lt_module_expsym_cmds_CXX # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_CXX # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_CXX # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_CXX # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_CXX # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e. impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_CXX # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_CXX # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_CXX # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_CXX # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_CXX # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_CXX # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_CXX # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_CXX # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_CXX # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_CXX # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_CXX # Specify filename containing input files. file_list_spec=$lt_file_list_spec_CXX # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_CXX # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_CXX postdep_objects=$lt_postdep_objects_CXX predeps=$lt_predeps_CXX postdeps=$lt_postdeps_CXX # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_CXX # ### END LIBTOOL TAG CONFIG: CXX _LT_EOF cat <<_LT_EOF >> "$ofile" # ### BEGIN LIBTOOL TAG CONFIG: F77 # The linker used to build libraries. LD=$lt_LD_F77 # How to create reloadable object files. reload_flag=$lt_reload_flag_F77 reload_cmds=$lt_reload_cmds_F77 # Commands used to build an old-style archive. old_archive_cmds=$lt_old_archive_cmds_F77 # A language specific compiler. CC=$lt_compiler_F77 # Is the compiler the GNU compiler? with_gcc=$GCC_F77 # Compiler flag to turn off builtin functions. no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 # Additional compiler flags for building library objects. pic_flag=$lt_lt_prog_compiler_pic_F77 # How to pass a linker flag through the compiler. wl=$lt_lt_prog_compiler_wl_F77 # Compiler flag to prevent dynamic linking. link_static_flag=$lt_lt_prog_compiler_static_F77 # Does compiler simultaneously support -c and -o options? compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=$archive_cmds_need_lc_F77 # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 # Whether the compiler copes with passing no objects directly. compiler_needs_object=$lt_compiler_needs_object_F77 # Create an old-style archive from a shared archive. old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 # Commands used to build a shared archive. archive_cmds=$lt_archive_cmds_F77 archive_expsym_cmds=$lt_archive_expsym_cmds_F77 # Commands used to build a loadable module if different from building # a shared archive. module_cmds=$lt_module_cmds_F77 module_expsym_cmds=$lt_module_expsym_cmds_F77 # Whether we are building with GNU ld or not. with_gnu_ld=$lt_with_gnu_ld_F77 # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag=$lt_allow_undefined_flag_F77 # Flag that enforces no undefined symbols. no_undefined_flag=$lt_no_undefined_flag_F77 # Flag to hardcode \$libdir into a binary during linking. # This must work even if \$libdir does not exist hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary. hardcode_direct=$hardcode_direct_F77 # Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e. impossible to change by setting \$shlibpath_var if the # library is relocated. hardcode_direct_absolute=$hardcode_direct_absolute_F77 # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=$hardcode_minus_L_F77 # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=$hardcode_automatic_F77 # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=$inherit_rpath_F77 # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=$link_all_deplibs_F77 # Set to "yes" if exported symbols are required. always_export_symbols=$always_export_symbols_F77 # The commands to list exported symbols. export_symbols_cmds=$lt_export_symbols_cmds_F77 # Symbols that should not be listed in the preloaded symbols. exclude_expsyms=$lt_exclude_expsyms_F77 # Symbols that must always be exported. include_expsyms=$lt_include_expsyms_F77 # Commands necessary for linking programs (against libraries) with templates. prelink_cmds=$lt_prelink_cmds_F77 # Commands necessary for finishing linking programs. postlink_cmds=$lt_postlink_cmds_F77 # Specify filename containing input files. file_list_spec=$lt_file_list_spec_F77 # How to hardcode a shared library path into an executable. hardcode_action=$hardcode_action_F77 # The directories searched by this compiler when creating a shared library. compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects=$lt_predep_objects_F77 postdep_objects=$lt_postdep_objects_F77 predeps=$lt_predeps_F77 postdeps=$lt_postdeps_F77 # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path=$lt_compiler_lib_search_path_F77 # ### END LIBTOOL TAG CONFIG: F77 _LT_EOF ;; "libtoolclpatch":C) sed -e '/^deplibs_check_method/s/.*/deplibs_check_method="pass_all"/g' \ -e 's|always_export_symbols=yes|always_export_symbols=no|g' \ -e '/func_append old_deplibs/s/\(.*\)/case $arg in *mkl_*.lib) ;; *) \1 ;; esac/g' \ -e '/static library .deplib is not portable/a case $deplib in *mkl_*.lib) newdependency_libs="$deplib $newdependency_libs" ;; esac' \ libtool > libtool.tmp mv libtool.tmp libtool chmod 755 libtool ;; "libtoolmingwpatch":C) sed -e '/^deplibs_check_method/s/.*/deplibs_check_method="pass_all"/g' libtool > libtool.tmp mv libtool.tmp libtool chmod 755 libtool ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Configuration of $PACKAGE_NAME successful" >&5 printf "%s\n" "$as_me: Configuration of $PACKAGE_NAME successful" >&6;} coinor-ipopt-3.14.17/configure.ac000066400000000000000000000642321473776672200166330ustar00rootroot00000000000000# Copyright (C) 2004, 2011 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. # # Authors: Carl Laird, Andreas Waechter IBM 2004-08-13 ############################################################################# # Names and other basic things # ############################################################################# AC_INIT([Ipopt],[3.14.17],[https://github.com/coin-or/Ipopt/issues/new],[],[https://github.com/coin-or/Ipopt]) AC_COPYRIGHT([ Copyright 2004, 2011 International Business Machines and others. All Rights Reserved. This file is part of the open source package IPOPT which is distributed under the Eclipse Public License.]) # List one file in the package so that the configure script can test # whether the package is actually there AC_CONFIG_SRCDIR(src/Common/IpDebug.hpp) # Do some project-level initialization work (version numbers, ...) AC_COIN_INITIALIZE ############################################################################# # Standard build tool stuff # ############################################################################# # Get the name of the C, C++, and Fortran compilers and appropriate compiler options. AC_COIN_PROG_CC AC_COIN_PROG_CXX AC_COIN_PROG_F77 # If there is a Fortran compiler, then setup everything to use it, including F77_FUNC if test -n "$F77" ; then AC_COIN_F77_SETUP fi # This is a C++ package, set the language accordingly. #AC_LANG_PUSH(C++) # Initialize libtool AC_COIN_PROG_LIBTOOL # set RPATH_FLAGS to the compiler link flags required to hardcode location # of the shared objects (expanded_libdir is set somewhere in configure before) AC_COIN_RPATH_FLAGS([$expanded_libdir]) # Get the C++ runtime libraries in case we want to link a static Ipopt library # with a C or Fortran compiler AC_COIN_CXXLIBS # Doxygen AC_COIN_DOXYGEN # IPOPT_VERBOSITY and IPOPT_DEBUGLEVEL AC_COIN_DEBUGLEVEL ######################################################################## # Floating-point Precision and Integer size # ######################################################################## AC_ARG_WITH([precision], [AS_HELP_STRING([--with-precision],[floating-point precision to use: single or double (default)])], [precision=$withval], [precision=double]) case "$precision" in single ) AC_DEFINE([IPOPT_SINGLE],[1],[Define to 1 if using single precision floating point]) ;; double ) ;; *) AC_MSG_ERROR([unsupported value $precision for option --with-precision]) esac AM_CONDITIONAL([IPOPT_SINGLE],[test "$precision" = single]) # check which integer size to build AC_ARG_WITH([intsize], [AS_HELP_STRING([--with-intsize],[integer type to use: specify 32 for int or 64 for int64_t])], [intsize=$withval], [intsize=32]) case "$intsize" in 32 ) ;; 64 ) AC_DEFINE(IPOPT_INT64, [1], [Define to 1 if Ipopt index type is int64_t]) ;; *) AC_MSG_ERROR([unsupported value $intsize for option --with-intsize]) ;; esac AM_CONDITIONAL([IPOPT_INT64],[test "$intsize" = 64]) # Specify 8-byte integers if intsize=64 (TODO This should become a macro in BuildTools that figures out the right flag to use) if test $intsize = 64 ; then case "$F77" in *gfortran*) FFLAGS="$FFLAGS -fdefault-integer-8" ;; *ifort*) case $build in *-cygwin* | *-mingw* | *-msys* ) FFLAGS="$FFLAGS -integer-size:64" ;; *) FFLAGS="$FFLAGS -integer-size 64" ;; esac ;; "" ) ;; # no Fortran compiler, then don't do anything *) AC_MSG_ERROR([Do not know how to select 8-byte integers for Fortran compiler $FC]) ;; esac fi ############################################################################# # Dependencies # ############################################################################# AC_COIN_CHK_LIBM(IpoptLib) AC_COIN_CHK_LAPACK(IpoptLib, int$intsize) if test $coin_has_lapack != yes; then AC_MSG_ERROR([Required package LAPACK not found.]) # AC_MSG_WARN([Compiling code without LAPACK. Certain options (e.g., quasi-Newton) will not work.]) fi # check for ASL only if building for double precision if test $precision = double ; then AC_COIN_CHK_PKG(ASL,[IpoptAmplInterfaceLib SIpoptAmplInterfaceLib],[coinasl]) else AM_CONDITIONAL([COIN_HAS_ASL],[false]) fi ######### # MUMPS # ######### AC_COIN_CHK_PKG(Mumps,[IpoptLib],[coinmumps]) # Check whether MPI_Initialized is available # we assume that MPI_Finalized is present if MPI_Initialized is present AC_CHECK_FUNCS([MPI_Initialized]) AC_ARG_ENABLE([mpiinit], [AS_HELP_STRING([--disable-mpiinit],[disable that (un)loading the Ipopt library initalizes (finalizes) MPI if the MPI version of MUMPS is linked])], [case "$enableval" in no | yes) ;; *) AC_MSG_ERROR([invalid argument for --enable-mpiinit: $enableval]);; esac mpiinit=$enableval], [mpiinit=yes]) if test $mpiinit = yes ; then AC_DEFINE(IPOPT_MPIINIT,1,[Define to 1 if MPI should be initialized (finalized) when Ipopt library is (un)loaded.]) fi ####### # HSL # ####### if test $intsize = 32 ; then AC_COIN_CHK_PKG(HSL,[IpoptLib HSLLib],[coinhsl]) else coin_has_hsl=no AM_CONDITIONAL([COIN_HAS_HSL],[false]) fi have_ma28=no if test "$coin_has_hsl" = yes ; then AC_COIN_FINALIZE_FLAGS([HSLLib]) case $precision in single ) ma27func=ma27a MA27FUNC=MA27A ;; double ) ma27func=ma27ad MA27FUNC=MA27AD ;; * ) AC_MSG_ERROR([HSL cannot be used with --with-precision=$precision]) ;; esac AC_COIN_TRY_LINK(ma27ad,[$HSLLIB_LFLAGS],, [AC_COIN_DEFINENAMEMANGLING(IPOPT_HSL,$ma27ad_namemangling)], [AC_MSG_ERROR([Provided package HSL is not working or does not contain MA27. See config.log for details on failed checks.])]) # extra check for MA28(s), since that decides whether we have to build IpMa28(s)Partition.F if test -n "$F77" ; then case $precision in single ) AC_COIN_TRY_LINK([ma28a],[$HSLLIB_LFLAGS],,[ if test "$ma28a_namemangling" != "$ac_cv_f77_mangling" ; then AC_MSG_WARN([Name mangling of MA28 different than Fortran. This will not link. Disabling MA28]) else have_ma28=yes fi ]) ;; double ) AC_COIN_TRY_LINK([ma28ad],[$HSLLIB_LFLAGS],,[ if test "$ma28ad_namemangling" != "$ac_cv_f77_mangling" ; then AC_MSG_WARN([Name mangling of MA28 different than Fortran. This will not link. Disabling MA28]) else have_ma28=yes fi ]) ;; * ) AC_MSG_ERROR([HSL cannot be used with --with-precision=$precision]) ;; esac fi fi AM_CONDITIONAL([HAVE_MA28],[test "$have_ma28" = yes]) ########### # PARDISO # ########### if test $intsize = 32 ; then AC_ARG_WITH([pardiso], [AS_HELP_STRING([--with-pardiso],[specify Pardiso library (>= 4.0) from pardiso-project.org])], [case "$withval" in no) have_pardiso_project=no ;; # so with_pardiso=no yes) AC_MSG_ERROR(["expected filename as argument for --with-pardiso"]) ;; *) AC_DEFINE_UNQUOTED([PARDISO_LIB],["$withval"],[Name of Pardiso library from pardiso-project.org]) AC_MSG_NOTICE([Pardiso from pardiso-project.org specified as $withval]) have_pardiso_project=yes ;; esac], [have_pardiso_project=no]) fi # check whether Pardiso is available via Lapack, which should then be MKL AC_ARG_ENABLE([pardisomkl], [AS_HELP_STRING([--disable-pardisomkl],[disable check for MKL version of Pardiso in Lapack])], [case "$enableval" in no | yes) ;; *) AC_MSG_ERROR([invalid argument for --enable-pardisomkl: $enableval]);; esac checkpardisomkl=$enableval], [checkpardisomkl=yes]) have_pardiso_mkl=no if test $checkpardisomkl = yes ; then AC_COIN_TRY_LINK([pardiso],[$lapack_lflags],[$lapack_pcfiles], [have_pardiso_mkl=yes AC_DEFINE(IPOPT_HAS_PARDISO_MKL,1,[Define to 1 if Pardiso from MKL is available]) ]) fi AM_CONDITIONAL([HAVE_PARDISO_MKL],[test "$have_pardiso_mkl" = yes]) ######### # SPRAL # ######### # check for Spral only if building for double precision and 32-bit integers # spral_ssids seems to support more than 2^31 nonzeros in a matrix, but not dimensions > 2^31 if test $precision$intsize = double32 ; then AC_LANG_PUSH(C++) AC_COIN_CHK_LIBHDR(Spral,[IpoptLib],[],[],[], [spral_ssids_solve(0, 0, (double*)0, 0, (void*)0, (void*)0, (const struct spral_ssids_options*)0, (struct spral_ssids_inform*)0);], [#include "spral_ssids.h"], [default_skip]) AC_LANG_POP(C++) else AM_CONDITIONAL([COIN_HAS_SPRAL],[false]) fi ######## # WSMP # ######## AC_ARG_WITH([wsmp], AS_HELP_STRING([--with-wsmp],[specify WSMP library]), [have_wsmp=yes; wsmp_lflags=$withval], [have_wsmp=no]) if test $have_wsmp$precision$intsize = yesdouble32 ; then AC_COIN_TRY_LINK([wssmp],[$wsmp_lflags],[], [AC_COIN_DEFINENAMEMANGLING([IPOPT_WSMP],[$wssmp_namemangling]) IPOPTLIB_LFLAGS="$wsmp_lflags $IPOPTLIB_LFLAGS" AC_DEFINE(IPOPT_HAS_WSMP,1,[Define to 1 if WSMP is available]) ], [AC_MSG_ERROR([Symbol wssmp not found with WSMP flags $wsmp_lflags. See config.log for details on failed checks.])]) fi AM_CONDITIONAL([HAVE_WSMP],[test $have_wsmp = yes]) ############################################################################# # Stuff for examples # ############################################################################# # find out how long an int pointer is to know if we need INTEGER*4 or # INTEGER*8 in Fortran to capture pointers. AC_LANG_PUSH(C) AC_CHECK_SIZEOF(int *) AC_LANG_POP(C) AC_SUBST(BITS_PER_POINTER) AC_SUBST(BIT32FCOMMENT) AC_SUBST(BIT64FCOMMENT) case "$ac_cv_sizeof_int_p" in 4 | 4?) BITS_PER_POINTER=32 BIT32FCOMMENT='' BIT64FCOMMENT='C' ;; 8 | 8?) BITS_PER_POINTER=64 BIT32FCOMMENT='C' BIT64FCOMMENT='' ;; *) AC_MSG_ERROR([Unknown length of int*]);; esac ############################################################################ ############################################################################ # Stuff that we need for C++ programs # ############################################################################ ############################################################################ AC_LANG_PUSH(C++) ##################### # Function isfinite # ##################### AC_COIN_CHECK_ISFINITE ########### # va_copy # ########### AC_CHECK_DECL([va_copy],[AC_DEFINE([IPOPT_HAS_VA_COPY],[1], [Define to 1 if va_copy is available])],,[#include ]) ################################ # Secure C11 library functions # ################################ AC_CHECK_DECL([fopen_s(FILE**, const char*, const char*)], [AC_DEFINE([IPOPT_HAS_FOPEN_S],[1],[Define to 1 if function fopen_s is available])],, [#include ]) AC_CHECK_DECL([getenv_s(size_t*, char*, rsize_t, const char*)], [AC_DEFINE([IPOPT_HAS_GETENV_S],[1],[Define to 1 if function getenv_s is available])],, [#include ]) ########################### # Random number generator # ########################### AC_CHECK_DECL([drand48],[AC_DEFINE([IPOPT_HAS_DRAND48],[1], [Define to 1 if function drand48 is available])],,[#include ]) AC_CHECK_DECL([rand],[AC_DEFINE([IPOPT_HAS_RAND],[1], [Define to 1 if function rand is available])],,[#include ]) AC_COIN_CHECK_NAMESPACE_DECL([std::srand],[1], [AC_DEFINE([IPOPT_HAS_STD__RAND],[1],[Define to 1 if function std::rand is available])],[], [#include ]) ################## # feenableexcept # ################## AC_CHECK_DECL([feenableexcept], [AC_DEFINE([IPOPT_HAS_FEENABLEEXCEPT],[1],[Define to 1 if function feenableexcept is available])],, [#include ]) ############# # sigaction # ############# AC_CHECK_DECL([sigaction(int, const struct sigaction*, struct sigaction*)], [AC_DEFINE([IPOPT_HAS_SIGACTION],[1],[Define to 1 if function sigaction is available])],, [#include ]) ################################################### # Check if user wants inexact algorithm available # ################################################### AC_ARG_ENABLE([inexact-solver], [AS_HELP_STRING([--enable-inexact-solver],[enable inexact linear solver version EXPERIMENTAL! (default: no)])], [case "$enableval" in no | yes) ;; *) AC_MSG_ERROR([invalid argument for --enable-inexact-solver: $enableval]);; esac use_inexact=$enableval], [use_inexact=no]) if test $use_inexact = yes; then if test $have_pardiso_project = no; then AC_MSG_ERROR([The inexact solver option is currently only available with Pardiso from pardiso-project.org]) fi AC_DEFINE([BUILD_INEXACT],[1],[Define to 1 if the inexact linear solver option is included]) fi AM_CONDITIONAL([BUILD_INEXACT], [test $use_inexact = yes]) AC_LANG_POP(C++) ######## # Java # ######## AC_ARG_ENABLE([java], [AS_HELP_STRING([--disable-java],[disable building of Java interface])], [enable_java="$enableval"], [case "$JAVA_HOME" in *\ * ) enable_java=no ;; # do not enable java-check by default, if there are spaces in JAVA_HOME - that causes trouble * ) enable_java="$enable_shared" ;; esac]) if test "$enable_java" != no ; then # look for javac: required to compile Java code and build C-header # this is a modified version of AX_PROG_JAVAC m4_define([m4_ax_prog_javac_list],["gcj -C" guavac jikes javac])dnl AS_IF([test "x$JAVAPREFIX" = x], [test "x$JAVAC" = x && AC_CHECK_PROGS([JAVAC], [m4_ax_prog_javac_list])], [test "x$JAVAC" = x && AC_CHECK_PROGS([JAVAC], [m4_ax_prog_javac_list], [], [$JAVAPREFIX/bin])]) m4_undefine([m4_ax_prog_javac_list])dnl if test -z "$JAVAC" ; then AC_MSG_NOTICE([No JAVA compiler. Disabling build of Java interface.]) enable_java=no else AX_PROG_JAVAC_WORKS fi fi if test "$enable_java" != no ; then AC_MSG_CHECKING([if javac supports -h]) echo "public abstract class conftest { private native boolean test(); }" > conftest.java AS_ECHO(["$as_me:${as_lineno-$LINENO}: $JAVAC conftest.java -h conftest.header"]) >&AS_MESSAGE_LOG_FD "$JAVAC" conftest.java -h conftest.header >&AS_MESSAGE_LOG_FD if test -e conftest.header/conftest.h ; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD cat conftest.java >&AS_MESSAGE_LOG_FD enable_java=no fi fi if test "$enable_java" != no ; then # look for jni header: required to compile C++ part of Java interface AX_JNI_INCLUDE_DIR if test -z "$JNI_INCLUDE_DIRS" ; then AC_MSG_NOTICE([No JNI header directory. Disabling build of Java interface.]) enable_java=no else for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS ; do CPPFLAGS="$CPPFLAGS -I$JNI_INCLUDE_DIR" done fi fi if test "$enable_java" != no ; then # look for jar: required to pack Java interface dnl copied from AX_PROG_JAR AS_IF([test "x$JAVAPREFIX" = x], [test "x$JAR" = x && AC_CHECK_PROGS([JAR], [jar])], [test "x$JAR" = x && AC_CHECK_PROGS([JAR], [jar], [], [$JAVAPREFIX/bin])]) if test -z "$JAR" ; then AC_MSG_WARN([JAVA compiler found, but no acceptable jar program found in \$PATH. Disabling build of Java interface.]) enable_java=no fi fi if test "$enable_java" != no ; then # look for java to run tests, but skip check whether java works (so just the test may fail) dnl copied from AX_PROG_JAVA AS_IF([test "x$JAVAPREFIX" = x], [test x$JAVA = x && AC_CHECK_PROGS([JAVA], [kaffe java])], [test x$JAVA = x && AC_CHECK_PROGS([JAVA], [kaffe java], [], [$JAVAPREFIX/bin])]) if test -z "$JAVA" ; then AC_MSG_WARN([JAVA compiler found, but no acceptable JAVA executable found in \$PATH. Disabling tests of Java interface. Java example will not run.]) fi # look for javadoc to build documentation dnl copied from AX_PROG_JAVADOC AS_IF([test "x$JAVAPREFIX" = x], [test "x$JAVADOC" = x && AC_CHECK_PROGS([JAVADOC], [javadoc])], [test "x$JAVADOC" = x && AC_CHECK_PROGS([JAVADOC], [javadoc], [], [$JAVAPREFIX/bin])]) if test -z "$JAVADOC" ; then AC_MSG_WARN([JAVA compiler found, but no javadoc found in \$PATH. Building the Java documentation (make javadoc) will fail.]) fi fi AM_CONDITIONAL([BUILD_JAVA], [test "$enable_java" != no]) ######################################################################## ## Linear solver loader ## ######################################################################## AC_ARG_ENABLE([linear-solver-loader], [AS_HELP_STRING([--disable-linear-solver-loader],[disable use of linear solver loader])], [case "$enableval" in no | yes) ;; *) AC_MSG_ERROR([invalid argument for --enable-linear-solver-loader: $enableval]);; esac use_linearsolverloader=$enableval], [use_linearsolverloader=yes]) AC_MSG_CHECKING([whether the linear solver loader should be used]) AC_MSG_RESULT([$use_linearsolverloader]) if test $use_linearsolverloader = yes; then AC_DEFINE([IPOPT_HAS_LINEARSOLVERLOADER],[1], [Define to 1 if the linear solver loader should be used to load libraries with linear solvers at runtime]) AC_LANG_PUSH(C) AC_CHECK_LIB(dl,[dlopen],[IPOPTLIB_LFLAGS="$IPOPTLIB_LFLAGS -ldl"],[]) AC_LANG_POP(C) fi AC_CHECK_HEADER([windows.h],AC_DEFINE(HAVE_WINDOWS_H,[1],[Define to 1 if windows.h is available.])) ######################################################################## ## sIpopt ## ######################################################################## AC_ARG_ENABLE([sipopt], [AS_HELP_STRING([--disable-sipopt],[disable build of sIpopt])], [case "$enableval" in no | yes) ;; *) AC_MSG_ERROR([invalid argument for --enable-sipopt: $enableval]);; esac use_sipopt=$enableval], [use_sipopt=yes]) AM_CONDITIONAL(BUILD_SIPOPT, [test "$use_sipopt" = yes]) ######################################################################## ## Create links for the test source files ## ######################################################################## AC_CONFIG_LINKS([test/hs071_main.cpp:examples/hs071_cpp/hs071_main.cpp test/hs071_nlp.cpp:examples/hs071_cpp/hs071_nlp.cpp test/hs071_nlp.hpp:examples/hs071_cpp/hs071_nlp.hpp test/hs071_c.c:examples/hs071_c/hs071_c.c]) if test "$use_sipopt" = yes ; then AC_CONFIG_LINKS([test/parametric_driver.cpp:contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp test/parametricTNLP.cpp:contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp test/MySensTNLP.cpp:contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp test/redhess_cpp.cpp:contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp]) fi ######################################################################## ## Create links for VPATH config of certain files ## ######################################################################## AC_COIN_VPATH_LINK(contrib/RInterface/DESCRIPTION) AC_COIN_VPATH_LINK(contrib/RInterface/NAMESPACE) AC_COIN_VPATH_LINK(contrib/RInterface/inst/CITATION) AC_COIN_VPATH_LINK(contrib/RInterface/inst/doc/ipoptr.Rnw) AC_COIN_VPATH_LINK(contrib/RInterface/inst/doc/ipoptr.pdf) AC_COIN_VPATH_LINK(contrib/RInterface/inst/doc/reflist.bib) AC_COIN_VPATH_LINK(contrib/RInterface/man/ipoptr-package.Rd) AC_COIN_VPATH_LINK(contrib/RInterface/man/ipoptr.Rd) AC_COIN_VPATH_LINK(contrib/RInterface/man/is.ipoptr.Rd) AC_COIN_VPATH_LINK(contrib/RInterface/man/make.sparse.Rd) AC_COIN_VPATH_LINK(contrib/RInterface/man/plot.sparseness.Rd) AC_COIN_VPATH_LINK(contrib/RInterface/man/print.ipoptr.Rd) AC_COIN_VPATH_LINK(contrib/RInterface/man/print.sparseness.Rd) AC_COIN_VPATH_LINK(contrib/RInterface/R/get.option.types.R) AC_COIN_VPATH_LINK(contrib/RInterface/R/ipoptr.R) AC_COIN_VPATH_LINK(contrib/RInterface/R/is.ipoptr.R) AC_COIN_VPATH_LINK(contrib/RInterface/R/make.sparse.R) AC_COIN_VPATH_LINK(contrib/RInterface/R/plot.sparseness.R) AC_COIN_VPATH_LINK(contrib/RInterface/R/print.ipoptr.R) AC_COIN_VPATH_LINK(contrib/RInterface/R/print.sparseness.R) AC_COIN_VPATH_LINK(contrib/RInterface/tests/approx_banana.R) AC_COIN_VPATH_LINK(contrib/RInterface/tests/banana.R) AC_COIN_VPATH_LINK(contrib/RInterface/tests/hs071_nlp.R) AC_COIN_VPATH_LINK(contrib/RInterface/tests/lasso.R) AC_COIN_VPATH_LINK(contrib/RInterface/tests/mynlp.R) AC_COIN_VPATH_LINK(contrib/RInterface/tests/parameters.R) AC_COIN_VPATH_LINK(contrib/RInterface/tests/sparseness.R) AC_COIN_VPATH_LINK(contrib/RInterface/src/ipoptr.cpp) AC_COIN_VPATH_LINK(contrib/RInterface/src/IpoptRJournal.cpp) AC_COIN_VPATH_LINK(contrib/RInterface/src/IpoptRNLP.cpp) AC_COIN_VPATH_LINK(examples/Cpp_example/cpp_example.cpp) AC_COIN_VPATH_LINK(examples/Cpp_example/MyNLP.cpp) AC_COIN_VPATH_LINK(examples/Cpp_example/MyNLP.hpp) AC_COIN_VPATH_LINK(examples/hs071_cpp/hs071_main.cpp) AC_COIN_VPATH_LINK(examples/hs071_cpp/hs071_nlp.cpp) AC_COIN_VPATH_LINK(examples/hs071_cpp/hs071_nlp.hpp) AC_COIN_VPATH_LINK(examples/hs071_c/hs071_c.c) if test "$enable_java" != no ; then case $precision in single ) AC_COIN_VPATH_LINK(examples/hs071_java/HS071s.java) ;; double ) AC_COIN_VPATH_LINK(examples/hs071_java/HS071.java) ;; esac fi AC_COIN_VPATH_LINK(tutorial/AmplExperiments/hs71.mod) AC_COIN_VPATH_LINK(tutorial/AmplExperiments/infeasible.mod) AC_COIN_VPATH_LINK(tutorial/AmplExperiments/MoreAmplModels.txt) AC_COIN_VPATH_LINK(tutorial/AmplExperiments/car1.run) AC_COIN_VPATH_LINK(tutorial/AmplExperiments/car1.gp) AC_COIN_VPATH_LINK(tutorial/Modeling/bad1.mod) AC_COIN_VPATH_LINK(tutorial/Modeling/bad1-fix1.mod) AC_COIN_VPATH_LINK(tutorial/Modeling/bad1-fix2.mod) AC_COIN_VPATH_LINK(tutorial/CodingExercise/exercise_example.mod) AC_COIN_VPATH_LINK(tutorial/CodingExercise/C/1-skeleton/TutorialC.c) AC_COIN_VPATH_LINK(tutorial/CodingExercise/C/2-mistake/TutorialC.c) AC_COIN_VPATH_LINK(tutorial/CodingExercise/C/3-solution/TutorialC.c) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_main.cpp) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.hpp) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Cpp/1-skeleton/TutorialCpp_nlp.cpp) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_main.cpp) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.hpp) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Cpp/2-mistake/TutorialCpp_nlp.cpp) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_main.cpp) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.hpp) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Cpp/3-solution/TutorialCpp_nlp.cpp) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Matlab/1-skeleton/TutorialMatlab.m) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Matlab/2-mistake/TutorialMatlab.m) AC_COIN_VPATH_LINK(tutorial/CodingExercise/Matlab/3-solution/TutorialMatlab.m) if test "$use_sipopt" = yes ; then AC_COIN_VPATH_LINK(contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp) AC_COIN_VPATH_LINK(contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp) AC_COIN_VPATH_LINK(contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.hpp) AC_COIN_VPATH_LINK(contrib/sIPOPT/examples/parametric_dsdp_cpp/parametric_dsdp_driver.cpp) AC_COIN_VPATH_LINK(contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.cpp) AC_COIN_VPATH_LINK(contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.hpp) AC_COIN_VPATH_LINK(contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp) AC_COIN_VPATH_LINK(contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.hpp) AC_COIN_VPATH_LINK(contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp) fi ######################################################################## ## Create Makefiles and other stuff ## ######################################################################## # the SIpoptLib is here to get SIPOPTLIB_EXPORT AC_COIN_FINALIZE_FLAGS([IpoptLib IpoptAmplInterfaceLib SIpoptLib SIpoptAmplInterfaceLib]) AC_CONFIG_FILES([Makefile src/ipopt.pc src/Makefile src/Apps/AmplSolver/Makefile src/Apps/AmplSolver/ipoptamplinterface.pc test/Makefile test/run_unitTests doc/Doxyfile examples/Cpp_example/Makefile examples/recursive_nlp/Makefile examples/hs071_cpp/Makefile examples/hs071_c/Makefile examples/ScalableProblems/Makefile tutorial/CodingExercise/C/1-skeleton/Makefile tutorial/CodingExercise/C/2-mistake/Makefile tutorial/CodingExercise/C/3-solution/Makefile tutorial/CodingExercise/Cpp/1-skeleton/Makefile tutorial/CodingExercise/Cpp/2-mistake/Makefile tutorial/CodingExercise/Cpp/3-solution/Makefile tutorial/CodingExercise/Matlab/1-skeleton/startup.m tutorial/CodingExercise/Matlab/2-mistake/startup.m tutorial/CodingExercise/Matlab/3-solution/startup.m ]) if test -n "$F77" ; then AC_CONFIG_FILES([examples/hs071_f/Makefile]) case $precision in single ) AC_CONFIG_FILES([examples/hs071_f/hs071_fs.f]) ;; double ) AC_CONFIG_FILES([examples/hs071_f/hs071_f.f tutorial/CodingExercise/Fortran/1-skeleton/TutorialFortran.f tutorial/CodingExercise/Fortran/2-mistake/TutorialFortran.f tutorial/CodingExercise/Fortran/3-solution/TutorialFortran.f tutorial/CodingExercise/Fortran/1-skeleton/Makefile tutorial/CodingExercise/Fortran/2-mistake/Makefile tutorial/CodingExercise/Fortran/3-solution/Makefile]) ;; esac fi if test "$enable_java" != no ; then AC_CONFIG_FILES([examples/hs071_java/Makefile examples/ScalableProblems_java/Makefile]) fi if test "$use_sipopt" = yes ; then AC_CONFIG_FILES([ contrib/sIPOPT/Makefile contrib/sIPOPT/src/Makefile contrib/sIPOPT/AmplSolver/Makefile contrib/sIPOPT/examples/parametric_cpp/Makefile contrib/sIPOPT/examples/parametric_dsdp_cpp/Makefile contrib/sIPOPT/examples/redhess_cpp/Makefile ]) fi # under Windows, the Makevars file for the R Interface need to be named Makevars.win case $build in *-cygwin* | *-mingw* | *-msys* ) AC_CONFIG_FILES([contrib/RInterface/src/Makevars.win:contrib/RInterface/src/Makevars.in]) ;; *) AC_CONFIG_FILES([contrib/RInterface/src/Makevars]) ;; esac AC_CONFIG_HEADERS([src/Common/config.h src/Common/config_ipopt.h]) AC_COIN_FINALIZE coinor-ipopt-3.14.17/contrib/000077500000000000000000000000001473776672200157765ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/RInterface/000077500000000000000000000000001473776672200200205ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/RInterface/CHANGELOG000066400000000000000000000016251473776672200212360ustar00rootroot0000000000000009 March 2012, version 0.8.4: * Included additional variables to the object that is returned from ipoptr (thanks to Michael Schedl). These are: z_L : final values for the lower bound multipliers z_U : final values for the upper bound multipliers constraints : final values for the constraints lambda : final values for the Lagrange mulipliers After solving the NLP using R> res <- ipoptr( ... ) They can be accessed using R> res$z_L R> res$z_U R> res$constraints R> res$lambda * Removed ipoptr_environment as argument in ipoptr because it wasn't useful and it caused undesired behaviour in combination with the data.table package (thanks to Florian Oswald for reporting). 20 November 2011, version 0.8.3: * Added #include to src/IpoptRNLP.hpp coinor-ipopt-3.14.17/contrib/RInterface/DESCRIPTION000066400000000000000000000012721473776672200215300ustar00rootroot00000000000000Package: ipoptr Type: Package Title: R interface to Ipopt Version: 0.8.4 Date: 2011-03-09 Author: Jelmer Ypma Maintainer: Jelmer Ypma Description: ipoptr is an R interface to Ipopt (Interior Point Optimizer), an open source software package for large-scale nonlinear optimization. It can be used to solve general nonlinear programming problems with nonlinear constraints and lower and upper bounds for the controls. Ipopt is written in C++ and is released as open source code under the Eclipse Public License (EPL). It is available from the COIN-OR initiative. The code has been written by Carl Laird and Andreas Waechter, who is the COIN project leader for Ipopt. License: EPL coinor-ipopt-3.14.17/contrib/RInterface/NAMESPACE000066400000000000000000000002011473776672200212300ustar00rootroot00000000000000useDynLib(ipoptr, IpoptRSolve) export(ipoptr, is.ipoptr, print.sparseness, plot.sparseness, make.sparse) S3method(print, ipoptr) coinor-ipopt-3.14.17/contrib/RInterface/R/000077500000000000000000000000001473776672200202215ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/RInterface/R/get.option.types.R000066400000000000000000000201511473776672200235740ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: get.option.types.R # Author: Jelmer Ypma # Date: 18 April 2010 # # This function converts a list with ipopt options into # three sub-lists, where the options are sorted into # the different value types (integer, numeric, string). # # Input: list of ipopt options and their values # Output: list containing three sub-lists by type with ipopt options and their values get.option.types <- function(opts) { # define types of ipopt options ipopt.option.types <- list( # Output "print_level"="integer", "print_user_options"="string", "print_options_documentation"="string", "output_file"="string", "file_print_level"="integer", "option_file_name"="string", # Termination "tol"="numeric", "max_iter"="integer", "max_cpu_time"="numeric", "dual_inf_tol"="numeric", "constr_viol_tol"="numeric", "compl_inf_tol"="numeric", "acceptable_tol"="numeric", "acceptable_iter"="integer", "acceptable_constr_viol_tol"="numeric", "acceptable_dual_inf_tol"="numeric", "acceptable_compl_inf_tol"="numeric", "acceptable_obj_change_tol"="numeric", "diverging_iterates_tol"="numeric", # NLP Scaling "obj_scaling_factor"="numeric", "nlp_scaling_method"="string", "nlp_scaling_max_gradient"="numeric", # NLP "bound_relax_factor"="numeric", "honor_original_bounds"="string", "check_derivatives_for_naninf"="string", "nlp_lower_bound_inf"="numeric", "nlp_upper_bound_inf"="numeric", "fixed_variable_treatment"="string", "jac_c_constant"="string", "jac_d_constant"="string", "hessian_constant"="string", # Initialization "bound_frac"="numeric", "bound_push"="numeric", "slack_bound_frac"="numeric", "slack_bound_push"="numeric", "bound_mult_init_val"="numeric", "constr_mult_init_max"="numeric", "bound_mult_init_method"="string", # Barrier Parameter "mehrotra_algorithm"="string", "mu_strategy"="string", "mu_oracle"="string", "quality_function_max_section_steps"="integer", "fixed_mu_oracle"="string", "mu_init"="numeric", "mu_max_fact"="numeric", "mu_max"="numeric", "mu_min"="numeric", "barrier_tol_factor"="numeric", "mu_linear_decrease_factor"="numeric", "mu_superlinear_decrease_power"="numeric", # Multiplier Updates "alpha_for_y"="string", "alpha_for_y_tol"="numeric", "recalc_y"="string", "recalc_y_feas_tol"="numeric", # Line Search "max_soc"="integer", "watchdog_shortened_iter_trigger"="integer", "watchdog_trial_iter_max"="integer", "accept_every_trial_step"="string", "corrector_type"="string", # Warm Start "warm_start_init_point"="string", "warm_start_bound_push"="numeric", "warm_start_bound_frac"="numeric", "warm_start_slack_bound_frac"="numeric", "warm_start_slack_bound_push"="numeric", "warm_start_mult_bound_push"="numeric", "warm_start_mult_init_max"="numeric", # Restoration Phase "expect_infeasible_problem"="string", "expect_infeasible_problem_ctol"="numeric", "expect_infeasible_problem_ytol"="numeric", "start_with_resto"="string", "soft_resto_pderror_reduction_factor"="numeric", "required_infeasibility_reduction"="numeric", "bound_mult_reset_threshold"="numeric", "constr_mult_reset_threshold"="numeric", "evaluate_orig_obj_at_resto_trial"="string", # Linear Solver "linear_solver"="string", "linear_system_scaling"="string", "linear_scaling_on_demand"="string", "max_refinement_steps"="integer", "min_refinement_steps"="integer", # Hessian Perturbation "max_hessian_perturbation"="numeric", "min_hessian_perturbation"="numeric", "first_hessian_perturbation"="numeric", "perturb_inc_fact_first"="numeric", "perturb_inc_fact"="numeric", "perturb_dec_fact"="numeric", "jacobian_regularization_value"="numeric", # Quasi-Newton "hessian_approximation"="string", "limited_memory_max_history"="integer", "limited_memory_max_skipping"="integer", # Derivative Test "derivative_test"="string", "derivative_test_perturbation"="numeric", "derivative_test_tol"="numeric", "derivative_test_print_all"="string", "point_perturbation_radius"="numeric", # MA27 Linear Solver "ma27_pivtol"="numeric", "ma27_pivtolmax"="numeric", "ma27_liw_init_factor"="numeric", "ma27_la_init_factor"="numeric", "ma27_meminc_factor"="numeric", # MA57 Linear Solver "ma57_pivtol"="numeric", "ma57_pivtolmax"="numeric", "ma57_pre_alloc"="numeric", "ma57_pivot_order"="integer", # MUMPS Linear Solver "mumps_pivtol"="numeric", "mumps_pivtolmax"="numeric", "mumps_mem_percent"="integer", "mumps_permuting_scaling"="integer", "mumps_pivot_order"="integer", "mumps_scaling"="integer", # Pardis"Linear Solver "pardiso_msglvl"="integer", "pardiso_matching_strategy"="string", "pardiso_out_of_core_power"="integer", # WSMP Linear Solver "wsmp_num_threads"="integer", "wsmp_ordering_option"="integer", "wsmp_pivtol"="numeric", "wsmp_pivtolmax"="numeric", "wsmp_scaling"="integer", "wsmp_singularity_threshold"="numeric" ) # initialize list with options sorted by type converted.opts <- list( "integer"=list(), "string"=list(), "numeric"=list() ) is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol # check if we have at least 1 element in the list, otherwise the # loop runs from 1 to down 0 and we get errors if ( length( opts ) > 0 ) { # loop over all options and give them the correct type for ( i in 1:length( opts ) ) { tmp.type <- ipopt.option.types[[match( names(opts)[i], names(ipopt.option.types) )]] if ( is.null( tmp.type ) ) { # determine type if ( is.character(opts[[i]]) ) { tmp.type <- "string" } else if ( is.wholenumber(opts[[i]]) ) { tmp.type <- "integer" } else { tmp.type <- "numeric" } cat( paste( "Warning: ", names(opts)[i], " is not a recognized option, we try to pass it to Ipopt as ", tmp.type, "\n" ) ) } if ( tmp.type=="string" ) { converted.opts$string[[ names(opts)[i] ]] <- as.character(opts[[i]]) } else if ( tmp.type=="integer" ) { converted.opts$integer[[ names(opts)[i] ]] <- as.integer(opts[[i]]) } else if ( tmp.type=="numeric" ) { converted.opts$numeric[[ names(opts)[i] ]] <- as.numeric(opts[[i]]) } else { stop(paste("Type of option ", names(opts)[i], " not recognized")) } } } return ( converted.opts ) } coinor-ipopt-3.14.17/contrib/RInterface/R/ipoptr.R000066400000000000000000000153521473776672200216670ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: ipoptr.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Changelog: # 09/03/2012: Added outputs, z_L, z_U, constraints, lambda (thanks to Michael Schedl) # 09/03/2012: Removed ipoptr_environment because this caused a bug in combination with # data.table and it wasn't useful (thanks to Florian Oswald for reporting) # # Input: # x0 : vector with initial values # eval_f : function to evaluate objective function # eval_grad_f : function to evaluate gradient of objective function # lb : lower bounds of the control # ub : upper bounds of the control # eval_g : function to evaluate (non-)linear constraints that should hold in the solution # eval_jac_g : function to evaluate the jacobian of the (non-)linear constraints that should hold in the solution # eval_jac_g_structure : sparseness structure of the jacobian # constraint_lb : lower bounds of the (non-)linear constraints # constraint_ub : upper bounds of the (non-)linear constraints # eval_h : function to evaluate the hessian # eval_h_structure : sparseness structure of the hessian # opts : list with options that are passed to Ipopt # ... : arguments that will be passed to user-defined functions # # Output: structure with inputs and # call : the call that was made to solve # status : integer value with the status of the optimization (0 is success) # message : more informative message with the status of the optimization # iterations : number of iterations that were executed # objective : final value of the objective function # solution : final values for the controls # z_L : final values for the lower bound multipliers # z_U : final values for the upper bound multipliers # constraints : final values for the constraints # lambda : final values for the Lagrange mulipliers ipoptr <- function( x0, eval_f, eval_grad_f, lb = NULL, ub = NULL, eval_g = function( x ) { return( numeric(0) ) }, eval_jac_g = function( x ) { return( numeric(0) ) }, eval_jac_g_structure = list(), constraint_lb = numeric(0), constraint_ub = numeric(0), eval_h = NULL, eval_h_structure = NULL, opts = list(), ... ) { # define 'infinite' lower and upper bounds of the control if they haven't been set if ( is.null( lb ) ) { lb <- rep( -Inf, length(x0) ) } if ( is.null( ub ) ) { ub <- rep( Inf, length(x0) ) } # internal function to check the arguments of the functions checkFunctionArguments <- function( fun, arglist, funname ) { if( !is.function(fun) ) stop(paste(funname, " must be a function\n", sep = "")) # determine function arguments fargs <- formals(fun) if ( length(fargs) > 1 ) { # determine argument names user-defined function argnames_udf <- names(fargs)[2:length(fargs)] # remove first argument, which is x # determine argument names that where supplied to ipoptr() argnames_supplied <- names(arglist) # determine which arguments where required but not supplied m1 = match(argnames_udf, argnames_supplied) if( any(is.na(m1)) ){ mx1 = which( is.na(m1) ) for( i in 1:length(mx1) ){ stop(paste(funname, " requires argument '", argnames_udf[mx1], "' but this has not been passed to the 'ipoptr' function.\n", sep = "")) } } # determine which arguments where supplied but not required m2 = match(argnames_supplied, argnames_udf) if( any(is.na(m2)) ){ mx2 = which( is.na(m2) ) for( i in 1:length(mx2) ){ stop(paste("'", argnames_supplied[mx2], "' passed to (...) in 'ipoptr' but this is not required in the ", funname, " function.\n", sep = "")) } } } return( 0 ) } # extract list of additional arguments and check user-defined functions arglist <- list(...) checkFunctionArguments( eval_f, arglist, 'eval_f' ) checkFunctionArguments( eval_grad_f, arglist, 'eval_grad_f' ) num.constraints <- length( constraint_lb ) if ( num.constraints > 0 ) { checkFunctionArguments( eval_g, arglist, 'eval_g' ) checkFunctionArguments( eval_jac_g, arglist, 'eval_jac_g' ) } # write wrappers around user-defined functions to pass additional arguments eval_f_wrapper = function(x){ eval_f(x, ...) } eval_grad_f_wrapper = function(x){ eval_grad_f(x, ...) } if ( num.constraints > 0 ) { eval_g_wrapper = function( x ) { eval_g(x, ...) } eval_jac_g_wrapper = function( x ) { eval_jac_g(x, ...) } } else { eval_g_wrapper = function( x ) { return( numeric(0) ) } eval_jac_g_wrapper = function( x ) { return( numeric(0) ) } } # approximate Hessian if ( is.null( eval_h ) && is.null( eval_h_structure ) ) { opts$hessian_approximation <- "limited-memory" eval_h_wrapper = NULL } else { checkFunctionArguments( eval_h, c( arglist, obj_factor=0, hessian_lambda=0 ), 'eval_h' ) eval_h_wrapper = function( x, obj_factor, hessian_lambda ) { eval_h(x, obj_factor, hessian_lambda, ...) } } # build ipoptr object ret <- list( "x0"=x0, "eval_f"=eval_f_wrapper, "eval_grad_f"=eval_grad_f_wrapper, "lower_bounds"=lb, "upper_bounds"=ub, "eval_g"=eval_g_wrapper, "eval_jac_g"=eval_jac_g_wrapper, "constraint_lower_bounds"=constraint_lb, "constraint_upper_bounds"=constraint_ub, "eval_jac_g_structure"=eval_jac_g_structure, "eval_h"=eval_h_wrapper, "eval_h_structure"=eval_h_structure, "options"=get.option.types(opts), "environment" = new.env() ) attr(ret, "class") <- "ipoptr" # add the current call to the list ret$call <- match.call() # check whether we have a correctly formed ipoptr object is.ipoptr( ret ) # pass ipoptr object to C code solution <- .Call( IpoptRSolve, ret ) # add solution variables to object ret$status <- solution$status ret$message <- solution$message ret$iterations <- solution$iterations ret$objective <- solution$objective ret$solution <- solution$solution ret$z_L <- solution$z_L ret$z_U <- solution$z_U ret$constraints <- solution$constraints ret$lambda <- solution$lambda return( ret ) } coinor-ipopt-3.14.17/contrib/RInterface/R/is.ipoptr.R000066400000000000000000000103651473776672200223000ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: is.ipoptr.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Input: object # Output: bool telling whether the object is an ipoptr or not # # Changelog: # 09/03/2012: Removed ipoptr_environment because this caused a bug in combination with # data.table and it wasn't useful (thanks to Florian Oswald for reporting) is.ipoptr <- function(x) { # Check whether the object exists and is a list if( is.null(x) ) { return( FALSE ) } if( !is.list(x) ) { return( FALSE ) } # Define local flag defining whether we approximate the Hessian or not flag_hessian_approximation = FALSE if ( !is.null( x$options$string$hessian_approximation ) ) { flag_hessian_approximation = ( x$options$string$hessian_approximation == "limited-memory" ) } # Check whether the needed functions are supplied stopifnot( is.function(x$eval_f) ) stopifnot( is.function(x$eval_grad_f) ) stopifnot( is.function(x$eval_g) ) stopifnot( is.function(x$eval_jac_g) ) if ( !flag_hessian_approximation ) { stopifnot( is.function(x$eval_h) ) } # Check whether bounds are defined for all controls stopifnot( length( x$x0 ) == length( x$lower_bounds ) ) stopifnot( length( x$x0 ) == length( x$upper_bounds ) ) # Check whether the initial value is within the bounds stopifnot( all( x$x0 >= x$lower_bounds ) ) stopifnot( all( x$x0 <= x$upper_bounds ) ) num.controls <- length( x$x0 ) num.constraints <- length( x$constraint_lower_bounds ) # Check the length of some return values stopifnot( length(x$eval_f( x$x0 ))==1 ) stopifnot( length(x$eval_grad_f( x$x0 ))==num.controls ) stopifnot( length(x$eval_g( x$x0 ))==num.constraints ) stopifnot( length(x$eval_jac_g( x$x0 ))==length(unlist(x$eval_jac_g_structure)) ) # the number of non-zero elements in the Jacobian if ( !flag_hessian_approximation ) { stopifnot( length(x$eval_h( x$x0, 1, rep(1,num.constraints) ))==length(unlist(x$eval_h_structure)) ) # the number of non-zero elements in the Hessian } # Check the whether we don't have NA's in initial values stopifnot( all(!is.na(x$eval_f( x$x0 ))) ) stopifnot( all(!is.na(x$eval_grad_f( x$x0 ))) ) stopifnot( all(!is.na(x$eval_g( x$x0 ))) ) stopifnot( all(!is.na(x$eval_jac_g( x$x0 ))) ) # the number of non-zero elements in the Jacobian if ( !flag_hessian_approximation ) { stopifnot( all(!is.na(x$eval_h( x$x0, 1, rep(1,num.constraints) ))) ) # the number of non-zero elements in the Hessian } # Check whether a correct structure was supplied, and check the size stopifnot( is.list(x$eval_jac_g_structure) ) stopifnot( length(x$eval_jac_g_structure)==num.constraints ) if ( !flag_hessian_approximation ) { stopifnot( length(x$eval_h_structure)==num.controls ) stopifnot( is.list(x$eval_h_structure) ) } # Check the number of non-linear constraints stopifnot( length(x$constraint_lower_bounds)==length(x$constraint_upper_bounds) ) # Check whether none of the non-zero indices are larger than the number of controls # Also, the smallest index should be bigger than 0 if ( length( x$eval_jac_g_structure ) > 0 ) { stopifnot( max(unlist(x$eval_jac_g_structure)) <= num.controls ) stopifnot( min(unlist(x$eval_jac_g_structure)) > 0 ) } if ( !flag_hessian_approximation ) { stopifnot( max(unlist(x$eval_h_structure)) <= num.controls ) stopifnot( min(unlist(x$eval_h_structure)) > 0 ) } # Check whether option to approximate hessian and eval_h are both set # If we approximate the hessian, then we don't want to set eval_h if ( flag_hessian_approximation ) { if( !is.null( x$eval_h ) ) { warning("Option supplied to approximate hessian, but eval_h is defined.\nSolution: remove option hessian_approximation=limited-memory to use analytic derivatives.") } if( !is.null( x$eval_h_structure ) ) { warning("Option supplied to approximate hessian, but eval_h_structure is defined.\nSolution: remove option hessian_approximation=limited-memory to use analytic derivatives.") } } return( TRUE ) } coinor-ipopt-3.14.17/contrib/RInterface/R/make.sparse.R000066400000000000000000000012561473776672200225610ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: make.sparse.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Input: matrix with logical elements # Output: list with as elements a vector of indices denoting non-zero (TRUE) elements of the matrix make.sparse <- function( A ) { # start with empty list to append to S <- list() # loop over matrix by row for ( i in 1:nrow(A) ) { indices <- c() for ( j in 1:ncol(A) ) { if (A[i,j]) { indices <- c( indices, j ) } } S <- c( S, list(indices) ) } return( S ) } coinor-ipopt-3.14.17/contrib/RInterface/R/plot.sparseness.R000066400000000000000000000022531473776672200235110ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: plot.sparseness.R # Author: Jelmer Ypma # Date: 23 June 2010 # # Input: sparse matrix structure (as list with non-zero indices) # Output: plot a the non-zero elements in the matrix as dots # useful for matrices with many elements, for smaller ones # use print.sparseness plot.sparseness <- function( x, pch='.', asp=1, xaxs='i', yaxs='i', ... ) { # make a list of y indices corresponding to the non-zero x indices structure.y <- lapply( 1:length( x ), function(i) { rep( i, length( x[[i]] ) ) } ) indices.x <- unlist( x ) indices.y <- unlist( structure.y ) # plot non-zero elements, where we revert the y-axis (top-left element is 1,1), # fix the aspect ratio (asp=1) and do not extend the x and y axis (x/yaxs='i') plot( indices.x, indices.y, xlim=c(min(indices.x), max(indices.x)), ylim=c(max(indices.y), min(indices.y)), type='p', pch=pch, asp=asp, xaxs=xaxs, yaxs=yaxs, ... ) return( list( x=indices.x, y=indices.y ) ) } coinor-ipopt-3.14.17/contrib/RInterface/R/print.ipoptr.R000066400000000000000000000040141473776672200230130ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: print.ipoptr.R # Author: Jelmer Ypma # Date: 18 April 2010 # # This function prints some basic output of a ipoptr # ojbect. The information is only available after it # has been solved. print.ipoptr <- function(x, show.controls=TRUE, ...) { cat("\nCall:\n", deparse(x$call), "\n\n", sep = "", fill=TRUE) cat( unlist(strsplit(paste( "Ipopt solver status:", x$status, "(", x$message, ")\n" ),' ')), fill=TRUE ) cat( paste( "Number of Iterations....:", x$iterations, "\n" ) ) # if show.controls is TRUE or FALSE, show all or none of the controls if ( is.logical( show.controls ) ) { # show all control variables if ( show.controls ) { controls.indices = 1:length(x$solution) } } # if show.controls is a vector with indices, rename this vector # and define show.controls as TRUE if ( is.numeric( show.controls ) ) { controls.indices = show.controls show.controls = TRUE } # if solved successfully if ( x$status<=0 ) { cat( paste( "Optimal value of objective function: ", x$objective, "\n" ) ) if ( show.controls ) { if ( length( controls.indices ) < length(x$solution) ) { cat( "Optimal value of user-defined subset of controls: " ) } else { cat( "Optimal value of controls: " ) } cat( x$solution[ controls.indices ], fill=TRUE) cat("\n") } } else { cat( paste( "Current value of objective function: ", x$objective, "\n" ) ) if ( show.controls ) { if ( length( controls.indices ) < length(x$solution) ) { cat( "Current value of user-defined subset of controls: " ) } else { cat( "Current value of controls: " ) } cat( x$solution[ controls.indices ], fill=TRUE ) cat("\n") } } cat("\n") } coinor-ipopt-3.14.17/contrib/RInterface/R/print.sparseness.R000066400000000000000000000025041473776672200236660ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: print.sparseness.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Input: sparse matrix structure (as list with non-zero indices) # Output: print a table with 'x' for non-zero element and '.' for zero element print.sparseness <- function( x, indices=TRUE, data=NULL, ncol=NULL, ... ) { stopifnot( is.list(x) ) # if number of columns is not supplied, take it as the maximum # value of the indices if ( is.null(ncol) ) { ncol <- max(unlist(x)) } # create matrix with dots p <- data.frame( matrix( ".", nrow=length(x), ncol ), stringsAsFactors=FALSE ) names( p ) <- 1:ncol # change dots by 'x' or count of index cnt=1 for ( row in 1:length(x) ) { for ( col in x[[row]] ) { if ( indices ) { if ( is.null( data ) ) { p[ row, col ] <- cnt } else { p[ row, col ] <- paste( cnt, ':', data[cnt] ) } } else { if ( is.null( data ) ) { p[ row, col ] <- 'x' } else { p[ row, col ] <- data[cnt] } } cnt = cnt+1 } } return( p ) } coinor-ipopt-3.14.17/contrib/RInterface/README000066400000000000000000000024131473776672200207000ustar00rootroot00000000000000Package: ipoptr Type: Package Title: R interface to Ipopt Version: 0.8 Date: 2010-07-18 Author: Jelmer Ypma Maintainer: Jelmer Ypma Description: ipoptr is an R interface to Ipopt (Interior Point Optimizer), an open source software package for large-scale nonlinear optimization. It can be used to solve general nonlinear programming problems with nonlinear constraints and lower and upper bounds for the controls. Ipopt is written in C++ and is released as open source code under the Eclipse Public License (EPL). It is available from the COIN-OR initiative. The code has been written by Carl Laird and Andreas Waechter, who is the COIN project leader for Ipopt. License: EPL Directories follow the standard structure of an R package: - inst Contains citation information that is displayed by the R citation('ipoptr') command, and the TeX/Sweave code of the documentation. - man Contains help-files for the commands available in this package. E.g. ?ipoptr in R shows the help-file for the ipoptr command. - R Contains R code defining the R commands. Each command is defined in a separate file. - src Contains C++ code interfacing between R and Ipopt. - tests Contains some examples/tests to show how the R interface works.coinor-ipopt-3.14.17/contrib/RInterface/inst/000077500000000000000000000000001473776672200207755ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/RInterface/inst/CITATION000066400000000000000000000012141473776672200221300ustar00rootroot00000000000000citHeader("To cite Ipopt in publications use:") citEntry(entry="Article", title = "On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming", author = personList(as.person("A. W\"{a}chter"), as.person("L. T. Biegler")), year = "2006", journal = "Mathematical Programming", volume = "106", number = "1", pages = "25--57", textVersion = "A. W\"{a}chter and L. T. Biegler, On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming, Mathematical Programming 106(1), pp. 25-57, 2006" ) coinor-ipopt-3.14.17/contrib/RInterface/inst/doc/000077500000000000000000000000001473776672200215425ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/RInterface/inst/doc/ipoptr.Rnw000066400000000000000000000633201473776672200235530ustar00rootroot00000000000000\documentclass[a4paper]{article} \usepackage[english]{babel} \usepackage{apacite} \usepackage{graphicx} % \VignetteIndexEntry{Introduction to ipoptr: an R interface to Ipopt} % \VignetteKeyword{optimize} % \VignetteKeyword{interface} \SweaveOpts{keep.source=TRUE} \SweaveOpts{prefix.string = figs/plot, eps = FALSE, pdf = TRUE, tikz = FALSE} %\pgfrealjobname{ipoptr} \title{Introduction to \texttt{ipoptr}: an R interface to Ipopt \thanks{This package should be considered in beta and comments about any aspect of the package are welcome. Thanks to Alexios Ghalanos for comments. This document is an R vignette prepared with the aid of \texttt{Sweave}, Leisch(2002). Financial support of the UK Economic and Social Research Council through a grant (RES-589-28-0001) to the ESRC Centre for Microdata Methods and Practice (CeMMAP) is gratefully acknowledged.}} \author{Jelmer Ypma} \begin{document} \maketitle \nocite{Leisch2002} \DefineVerbatimEnvironment{Sinput}{Verbatim}{xleftmargin=2em} \DefineVerbatimEnvironment{Soutput}{Verbatim}{xleftmargin=2em} \DefineVerbatimEnvironment{Scode}{Verbatim}{xleftmargin=2em} \fvset{listparameters={\setlength{\topsep}{0pt}}} \renewenvironment{Schunk}{\vspace{\topsep}}{\vspace{\topsep}} <>= # have an (invisible) initialization noweb chunk # to remove the default continuation prompt '>' options(continue = " ") options(width = 60) # eliminate margin space above plots options(SweaveHooks=list(fig=function() par(mar=c(5.1, 4.1, 1.1, 2.1)))) @ \begin{abstract} This document describes how to use \texttt{ipoptr}, which is an R interface to Ipopt (Interior Point Optimizer). Ipopt is an open source software package for large-scale nonlinear optimization \cite{WachterBiegler2006}. It can be used to solve general nonlinear programming problems with nonlinear constraints and lower and upper bounds for the controls. Ipopt is written in C++ and is released as open source code under the Eclipse Public License (EPL). It is available from the COIN-OR initiative. The code has been written by Carl Laird and Andreas W\"achter, who is the COIN project leader for Ipopt. \end{abstract} \section{Introduction} Ipopt is designed to find (local) solutions of mathematical optimization problems of the from \begin{eqnarray*} &&\min_{x \in R^n} f(x) \\ &s.t.& g_L <= g(x) <= g_U \\ && x_L <= x <= x_U \end{eqnarray*} where $f(x): R^n \rightarrow R$ is the objective function, and $g(x): R^n \rightarrow R^m$ are the constraint functions. The vectors $g_L$ and $g_U$ denote the lower and upper bounds on the constraints, and the vectors $x_L$ and $x_U$ are the bounds on the variables $x$. The functions $f(x)$ and $g(x)$ can be nonlinear and nonconvex, but should be twice continuously differentiable. Note that equality constraints can be formulated in the above formulation by setting the corresponding components of $g_L$ and $g_U$ to the same value. This vignette describes how to formulate minimization problems to be solved with the R interface to Ipopt. If you want to use the C++ interface directly or are interested in the Matlab interface, there are other sources of documentation available. Some of the information here is heavily based on the Ipopt documentation\footnote{\texttt{https://coin-or.github.io/Ipopt/}} and generally that is a good source to find additional information, for instance on which options to use. All credit for implementing the C++ code for Ipopt should go to Andreas W\"achter and Carl Laird. Please show your appreciation by citing their paper. \section{Installation} Installing the \texttt{ipoptr} package is not as straightforward as most other R packages, because it depends on Ipopt. To install (and compile) Ipopt and the R interface a C/C++ compiler has to be available. On Windows I was successful using MSYS to compile Ipopt and then use Rtools\footnote{\texttt{http://www.murdoch-sutherland.com/Rtools/}} to compile the R interface from source. On Ubuntu no additional tools were needed. The code for the R interface to Ipopt is available from R-Forge and from the Ipopt website. Additional information is also available on \texttt{http://www.ucl.ac.uk/\textasciitilde uctpjyy/ipoptr.html}. The R interface to Ipopt comes with the most recent version of Ipopt, so there is no need to download it separately. Detailed installation instructions for Ipopt are available on \texttt{http://www.coin-or.org/Ipopt/documentation}. You should follow these first, before trying to install the R interface. Ipopt needs to be configured using the \texttt{-fPIC} flag for all GNU compilers, which usually happens by default. In builds of debug or static libraries, one need to use the option \verb|--with-pic| for configure. For the installation of the R interface, I will assume that you have a working installation of Ipopt (i.e. \texttt{configure}, \texttt{make} and \texttt{make install} executed without problems). During the installation of Ipopt a file \texttt{Makevars} (or \texttt{Makevars.win} on Windows) has been created in the \texttt{src} subdirectory of the build directory of the R interface, e.g., \texttt{\$IPOPTDIR/build/Ipopt/contrib/RInterface/src} if you used the same build directory as in the Ipopt installation notes, \texttt{\$IPOPTDIR/build}. The file \texttt{Makevars}(\texttt{.win}) in this directory has been configured for your system. You can then install the package from R with the command <>= install.packages('$IPOPTDIR/build/Ipopt/contrib/RInterface', repos=NULL, type='source') @ where the first argument specifies the build directory for the R interface of Ipopt. You should now be able to load the R interface to Ipopt and read the help. <>= library('ipoptr') ?ipoptr @ \section{Minimizing the Rosenbrock Banana function} As a first example we will solve an unconstrained minimization problem. The function we look at is the Rosenbrock Banana function \[ f( x ) = 100 \left( x_2 - x_1^2 \right)^2 + \left(1 - x_1 \right)^2, \] which is also used as an example in the documentation for the standard R optimizer \texttt{optim}. The gradient of the objective function is given by \[ \nabla f( x ) = \left( \begin{array}[1]{c} -400 \cdot x_1 \cdot (x_2 - x_1^2) - 2 \cdot (1 - x_1) \\ 200 \cdot (x_2 - x_1^2) \end{array} \right). \] Ipopt always needs gradients to be supplied by the user. After loading the library <>= library(ipoptr) @ we start by specifying the objective function and its gradient <>= ## Rosenbrock Banana function eval_f <- function(x) { return( 100 * (x[2] - x[1] * x[1])^2 + (1 - x[1])^2 ) } ## Gradient of Rosenbrock Banana function eval_grad_f <- function(x) { return( c( -400 * x[1] * (x[2] - x[1] * x[1]) - 2 * (1 - x[1]), 200 * (x[2] - x[1] * x[1]) ) ) } @ We define initial values <>= # initial values x0 <- c( -1.2, 1 ) @ and then minimize the function using the \texttt{ipoptr} command. This command runs some checks on the supplied inputs and returns an object with the exit code of the solver, the optimal value of the objective function and the solution. The checks do not always return very informative messages, but usually there is something wrong with dimensions (e.g. \texttt{eval\_grad\_f} returns a vector that doesn't have the same size as \texttt{x0}). <>= # solve Rosenbrock Banana function res <- ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f ) @ These are the minimal arguments that have to be supplied. If, like above, no Hessian is defined, Ipopt uses an approximation. The Ipopt website has a detailed explanation of the output. We can see a summary of the results by printing the resulting object. <>= print( res ) @ It's advised to always check the exit code for convergence of the problem and in this case we can see that the algorithm terminated successfully. Ipopt used 47 iterations to find the solution and the optimal value of the objective function and the controls are given as well. If you do not want to, or cannot calculate the gradient analytically, you can supply a function \texttt{eval\_grad\_f} that approximates the gradient. However, this is not advisable and might result in convergence problems, for instance by not finding the minimum, or by finding the wrong minimum. We can see this from the following example where we approximate \texttt{eval\_grad\_f} using finite differences <>= # http://en.wikipedia.org/wiki/Numerical_differentiation finite.diff <- function( func, x, minAbsValue=0, stepSize=sqrt( .Machine$double.eps ), ... ) { stepSizeVec <- pmax( abs(x), 1 ) * stepSize fx <- func( x, ... ) approx.gradf.index <- function(i, x, func, fx, stepSizeVec, ...) { x_prime <- x x_prime[i] <- x[i] + stepSizeVec[i] stepSizeVec[i] <- x_prime[i] - x[i] fx_prime <- func( x_prime, ... ) return( ( fx_prime - fx )/stepSizeVec[i] ) } grad_fx <- sapply( 1:length(x), approx.gradf.index, x=x, func=func, fx=fx, stepSizeVec=stepSizeVec, ... ) return( grad_fx ) } # Approximate eval_f using finite differences approx_grad_f <- function( x ) { return( finite.diff( eval_f, x ) ) } @ and using this approximation to minimize the same Rosenbrock Banana function. We suppress the output by the \texttt{print\_level} option. <>= # increase the maximum number of iterations opts <- list("tol"=1.0e-8, "max_iter"=5000, "print_level"=0) # solve Rosenbrock Banana function with approximated gradient print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=approx_grad_f, opts=opts) ) @ In this case 5000 iterations are not enough to solve the minimization problem to the required tolerance. This has to do with the step size we choose to approximate the gradient <>= sqrt( .Machine$double.eps ) @ which is of the same order of magnitude. If we decrease the tolerance, the algorithm converges, but the solution is less precise than if we supply gradients and it takes more iterations to get there. <>= # decrease the convergence criterium opts <- list("tol"=1.0e-7, "print_level"=0) # solve Rosenbrock Banana function with approximated gradient print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=approx_grad_f, opts=opts) ) @ \section{Sparse matrix structure} Ipopt can handle sparseness in the Jacobian of the constraints and the Hessian. The sparseness structure should be defined in advance and stay the same throughout the minimization procedure. A sparseness structure can be defined as a list of vectors, where each vector contains the indices of the non-zero elements of one row. E.g. the matrix \[ \left( \begin{array}[4]{cccc} . & . & . & 1 \\ 1 & 1 & . & . \\ 1 & 1 & 1 & 1 \end{array} \right) \] has a non-zero element in position 4 in the first row. In the second row it has non-zero elements in position 1 and 2, and the third row contains non-zero elements at every position. Its structure can be defined as <>= sparse_structure <- list( c( 4 ), c( 1, 2 ), c( 1, 2, 3, 4 ) ) @ The function \texttt{make.sparse} can simplify this procedure <>= make.sparse( rbind( c(0, 0, 0, 1), c( 1, 1, 0, 0 ), c( 1, 1, 1, 1 ) ) ) @ This function takes a matrix as argument. All non-zero elements in this matrix will be defined as non-zero in the sparseness structure, \texttt{NA} or \texttt{NaN} are not allowed. The function \texttt{print.sparseness} shows the non-zero elements <>= print.sparseness( sparse_structure ) @ By default \texttt{print.sparseness} shows the indices of the non-zero elements in the sparse matrix. Values for the non-zero elements of a sparse matrix have to be supplied in one vector, in the same order as the the non-zero elements occur in the structure. I.e. the order of the indices matters and the values of the following two matrices should be supplied in a different order <>= print.sparseness( list( c(1,3,6,8), c(2,5), c(3,7,9) ) ) print.sparseness( list( c(3,1,6,8), c(2,5), c(3,9,7) ) ) @ Since the sparseness structure defines the indices of non-zero elements by row, the order of the rows cannot be changed in the R implementation. In principle a more general order of the non-zero elements (independent of row or column) could be specified, which can be added as a feature on request. Below are two final examples on sparseness structure (see \texttt{?print.sparseness} for more options and examples) <>= # print lower-diagonal 5x5 matrix generated with make.sparse A_lower <- make.sparse( lower.tri( matrix(1, nrow=5, ncol=5), diag=TRUE ) ) print.sparseness( A_lower ) # print a diagonal 5x5 matrix without indices counts A_diag <- make.sparse( diag(5) > 0 ) print.sparseness( A_diag, indices=FALSE ) @ For larger matrices it is easier to plot them using the \texttt{plot.sparseness} command <>= s <- do.call( "cbind", lapply( 1:5, function(i) { diag(5) %x% matrix(1, nrow=5, ncol=20) } ) ) s <- do.call( "rbind", lapply( 1:5, function(i) { s } ) ) s <- cbind( matrix( 1, nrow=nrow(s), ncol=40 ), s ) plot.sparseness( make.sparse( s ) ) @ The resulting sparse matrix structure from this code can be seen in figure \ref{fig:sparse}. All non-zero elements are shown as black dots by default. \begin{figure}[htbp] \begin{center} \includegraphics[width=12.0cm]{figs/plot-sparsefig.pdf} \caption{Plot of large sparseness structure} \label{fig:sparse} \end{center} \end{figure} \section{Supplying the Hessian} Now that we know how to define a sparseness structure we can supply the Hessian to the Rosenbrock Banana function from above. Its Hessian is given by \[ \nabla^2 f( x ) = \left( \begin{array}[2]{rr} 2 - 400 \cdot (x_2 - x_1^2) + 800 x_1^2 & -400 x_1 \\ -400 x_1 & 200 \end{array} \right) \] Ipopt needs the Hessian of the Lagrangian in the following form \[ \sigma_f \nabla^2 f(x) + \sum_{i=1}^m \lambda_i \nabla^2 g_i(x), \] where $g_i(x)$ represents the $i$th of $m$ constraints, $\lambda_i$ are the multipliers of the constraints and $\sigma_f$ is introduced so that Ipopt can ask for the Hessian of the objective or the constraints independently if required. In this case we don't have any constraints. The user-defined function \texttt{eval\_h} to define the Hessian takes three arguments. The first argument contains the value of the control variables, $x$, the second argument contains the multiplication factor of the Hessian of the objective function, $\sigma_f$, and the third argument contains a vector with the multipliers of the constraints, $\lambda$. We can define the structure of the Hessian and the function to evaluate the Hessian as follows <>= # The Hessian for this problem is actually dense, # This is a symmetric matrix, fill the lower left triangle only. eval_h_structure <- list( c(1), c(1,2) ) eval_h <- function( x, obj_factor, hessian_lambda ) { return( obj_factor*c( 2 - 400*(x[2] - x[1]^2) + 800*x[1]^2, # 1,1 -400*x[1], # 2,1 200 ) ) # 2,2 } @ Note that we only specify the lower half of the Hessian, since it is a symmetric matrix. Also, \texttt{eval\_h} returns a vector with all the non-zero elements of the Hessian in the same order as the non-zero indices in the sparseness structure. Then we minimize the function using the \texttt{ipoptr} command <>= opts <- list("print_level"=0, "file_print_level"=12, "output_file"="banana.out", "tol"=1.0e-8) # solve Rosenbrock Banana function with analytic Hessian print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, eval_h=eval_h, eval_h_structure=eval_h_structure, opts=opts) ) @ Here we also supplied options to not print any intermediate information to the R screen (\texttt{print\_level=0}). Printing output to the screen directly from Ipopt does not work in all R terminals correctly, so it might be that even though you specify a positive number here, there will still be no output visible on the screen. If you want to print things to the screen, a workaround is to do this directly in the R functions you defined, such as \texttt{eval\_f}. Also, to inspect more details about the minimization we can write all the output to a file, which will be created in the current working directory. For larger problems, having a large number for \texttt{file\_print\_level} can easily generate very large files, which is probably not desirable. Many more options are available, and a full list of all the options can be found at the Ipopt website, \texttt{http://www.coin-or.org/Ipopt/documentation/node59.html\#app.options\_ref}. Options can also be supplied from an option file, which can be specified in \texttt{option\_file\_name}. \section{Adding constraints} To look at how we can add constraints to a problem, we take example problem number 71 from the Hock-Schittkowsky test suite, which is also used in the Ipopt C++ tutorial. The problem is \begin{eqnarray*} &&\min_{x} x_1 \cdot x_4 \cdot (x_1 + x_2 + x_3) + x_3 \\ &s.t.& \\ && x_1 \cdot x_2 \cdot x_3 \cdot x_4 >= 25 \\ && x_1^2 + x_2^2 + x_3^2 + x_4^2 = 40 \\ && 1 <= x_1,x_2,x_3,x_4 <= 5, \end{eqnarray*} and we use $x = (1, 5, 5, 1)$ as initial values. In this problem we have one inequality constraint, one equality constraint and upper and lower bounds for all the variables. The optimal solution is $(1.00000000, 4.74299963, 3.82114998, 1.37940829)$. First we define the objective function and its gradient <>= eval_f <- function( x ) { return( x[1]*x[4]*(x[1] + x[2] + x[3]) + x[3] ) } eval_grad_f <- function( x ) { return( c( x[1] * x[4] + x[4] * (x[1] + x[2] + x[3]), x[1] * x[4], x[1] * x[4] + 1.0, x[1] * (x[1] + x[2] + x[3]) ) ) } @ Then we define a function that returns the value of the two constraints. We define the bounds of the constraints (in this case the $g_L$ and $g_U$ are $25$ and $40$) later. <>= # constraint functions eval_g <- function( x ) { return( c( x[1] * x[2] * x[3] * x[4], x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 ) ) } @ Then we define the structure of the Jacobian, which is a dense matrix in this case, and function to evaluate it <>= eval_jac_g_structure <- list( c(1,2,3,4), c(1,2,3,4) ) eval_jac_g <- function( x ) { return( c ( x[2]*x[3]*x[4], x[1]*x[3]*x[4], x[1]*x[2]*x[4], x[1]*x[2]*x[3], 2.0*x[1], 2.0*x[2], 2.0*x[3], 2.0*x[4] ) ) } @ The Hessian is also dense, but it looks slightly more complicated because we have to take into account the Hessian of the objective function and of the constraints at the same time, although you could write a function to calculate them both separately and then return the combined result in \texttt{eval\_h}. <>= # The Hessian for this problem is actually dense, # This is a symmetric matrix, fill the lower left triangle only. eval_h_structure <- list( c(1), c(1,2), c(1,2,3), c(1,2,3,4) ) eval_h <- function( x, obj_factor, hessian_lambda ) { values <- numeric(10) values[1] = obj_factor * (2*x[4]) # 1,1 values[2] = obj_factor * (x[4]) # 2,1 values[3] = 0 # 2,2 values[4] = obj_factor * (x[4]) # 3,1 values[5] = 0 # 4,2 values[6] = 0 # 3,3 values[7] = obj_factor * (2*x[1] + x[2] + x[3]) # 4,1 values[8] = obj_factor * (x[1]) # 4,2 values[9] = obj_factor * (x[1]) # 4,3 values[10] = 0 # 4,4 # add the portion for the first constraint values[2] = values[2] + hessian_lambda[1] * (x[3] * x[4]) # 2,1 values[4] = values[4] + hessian_lambda[1] * (x[2] * x[4]) # 3,1 values[5] = values[5] + hessian_lambda[1] * (x[1] * x[4]) # 3,2 values[7] = values[7] + hessian_lambda[1] * (x[2] * x[3]) # 4,1 values[8] = values[8] + hessian_lambda[1] * (x[1] * x[3]) # 4,2 values[9] = values[9] + hessian_lambda[1] * (x[1] * x[2]) # 4,3 # add the portion for the second constraint values[1] = values[1] + hessian_lambda[2] * 2 # 1,1 values[3] = values[3] + hessian_lambda[2] * 2 # 2,2 values[6] = values[6] + hessian_lambda[2] * 2 # 3,3 values[10] = values[10] + hessian_lambda[2] * 2 # 4,4 return ( values ) } @ After the hard part is done, we only have to define the initial values, the lower and upper bounds of the control variables, and the lower and upper bounds of the constraints. If a variable or a constraint does not have lower or upper bounds, the values \texttt{-Inf} or \texttt{Inf} can be used. If the upper and lower bounds of a constraint are equal, Ipopt recognizes this as an equality constraint and acts accordingly. <>= # initial values x0 <- c( 1, 5, 5, 1 ) # lower and upper bounds of control lb <- c( 1, 1, 1, 1 ) ub <- c( 5, 5, 5, 5 ) # lower and upper bounds of constraints constraint_lb <- c( 25, 40 ) constraint_ub <- c( Inf, 40 ) opts <- list("print_level"=0, "file_print_level"=12, "output_file"="hs071_nlp.out") print( ipoptr( x0 = x0, eval_f = eval_f, eval_grad_f = eval_grad_f, lb = lb, ub = ub, eval_g = eval_g, eval_jac_g = eval_jac_g, constraint_lb = constraint_lb, constraint_ub = constraint_ub, eval_jac_g_structure = eval_jac_g_structure, eval_h = eval_h, eval_h_structure = eval_h_structure, opts = opts) ) @ \section{Using data} The final subject we have to cover, is how to pass data to an objective function or the constraints. There are two ways to do this. The first is to supply additional arguments to the user defined functions and \texttt{ipoptr}. The second way is to define an environment that holds the data and pass this environment to \texttt{ipoptr}. Both methods are shown in \texttt{tests/parameters.R}. As a very simple example\footnote{A more interesting example is given in \texttt{tests/lasso.R}} suppose we want to find the minimum of \[ f( x ) = a_1 x^2 + a_2 x + a_3 \] for different values of the parameters $a_1$, $a_2$ and $a_3$. First we define the objective function and its gradient using, assuming that there is some variable \texttt{params} that contains the values of the parameters. <>= eval_f_ex1 <- function(x, params) { return( params[1]*x^2 + params[2]*x + params[3] ) } eval_grad_f_ex1 <- function(x, params) { return( 2*params[1]*x + params[2] ) } @ Note that the first parameter should always be the control variable. All of the user-defined functions should contain the same set of additional parameters. You have to supply them as input argument to all functions, even if you're not using them in some of the functions. Then we can solve the problem for a specific set of parameters, in this case $a_1=1$, $a_2=2$ and $a_3=3$, from initial value $x_0=0$, with the following command <>= # solve using ipoptr with additional parameters ipoptr( x0 = 0, eval_f = eval_f_ex1, eval_grad_f = eval_grad_f_ex1, opts = list("print_level"=0), params = c(1,2,3) ) @ For the second method, we don't have to supply the parameters as additional arguments to the function. <>= eval_f_ex2 <- function(x) { return( params[1]*x^2 + params[2]*x + params[3] ) } eval_grad_f_ex2 <- function(x) { return( 2*params[1]*x + params[2] ) } @ Instead, we define an environment that contains specific values of \texttt{params} <>= # define a new environment that contains params auxdata <- new.env() auxdata$params <- c(1,2,3) @ To solve this we supply \texttt{auxdata} as an argument to \texttt{ipoptr}, which will take care of evaluating the functions in the correct environment, so that auxiliary data is available. <>= # pass the environment that should be used to evaluate functions to ipoptr ipoptr( x0 = 0, eval_f = eval_f_ex2, eval_grad_f = eval_grad_f_ex2, ipoptr_environment = auxdata, opts = list("print_level"=0) ) @ \section{Options} There are many options available, all of which are described on the Ipopt website. One of the options can test whether your derivatives are correct. This option is activated by setting \texttt{derivative\_test} to \texttt{first-order} or \texttt{second-order} if you want to test second derivatives as well. This process can take quite some time. To see all the output from this process you can set \texttt{derivative\_test\_print\_all} to \texttt{yes}, preferably when writing to a file, because of the problems with displaying on some terminals mentioned above. Without this option the derivative checker only shows those lines where an error occurs if a high enough \texttt{print\_level} is supplied. \section{Remarks} If you run many large optimization problems in a row on Windows, at some point you'll get errors that Mumps is running out of memory and you won't get any solutions. On Linux this same problem hasn't occurred yet. From version 0.8.2 output is shown in the R terminal under Windows as well. \bibliographystyle{apacite} \bibliography{reflist} \end{document} coinor-ipopt-3.14.17/contrib/RInterface/inst/doc/ipoptr.pdf000066400000000000000000011545661473776672200235740ustar00rootroot00000000000000%PDF-1.5 %ÐÔÅØ 3 0 obj << /Length 3256 /Filter /FlateDecode >> stream xÚÅËrÇñί@.)°lŒæµQ%‰%¥hÓ¶BRåJ9>, À P”|ɯ§_³;KnJ’¥R$fg{zú=Ý=ûüúäÉK&¦PÖd~r½œ[(ãÂ$Ͻ²e>¹^L~™žŸšéîÔÓcÛœÎl>]ÀÄüÍáï¸nèõÌi==6§¿^÷ä¥÷¤F+ûhF·ø=.Úá_Ë+†ddNé`ã‚§§3¯ý´’M.ùgÍ$Õˆc ÿ*¤¦Æwé ˜ó=ЛMi3¤•÷²@Q!Ë,QWd*³ù$Wּ῵vªSЙÕN•y6™¹ŒÄDÐßÕÀ½ÅÝ[Øöû×^&*Ä2™UfV;å Ï‹ží‰wCÒØð2kaü­Œa¨ üB|9)UµÉ™ ÖNf>S¥-!ÀÞÉ¶Šªá¥°u¿tfŒj 2•Y|}+”`÷2‚QÕáAUok6‚X;œ; D»¾!èºGqK(þžŸŒÒ•%á;ÔBÜ/£²¬ -‹êëÌeÀ“-Uo]ߢ±èé}äh~jK †6N8¬ÄhaöR^ w¨Æea- C¡i0Ñ»pä‹@²' 4ûS‹"ò¥3Ê4¼8ï%‡¸É_Z†x…Ä5Bi”."ü)ò»F3ZÿA+Z„:•…N÷ìäCk×F.,âTÓÁÖ2s¹¢.Úy-“8³<²Ö€2Äвô÷=7I7Lßœf=­Äž.›–BBofÑ\*²yE"™–L¯qPW,&ÄÑ1ˆbÚâ¿? ÍÄd:‘ÿL4›Pªü£eºÿ#Ì$S·$ÿ:nk¦eœÏ‘¤zinÑCMΊ9üëT#æÂ§;6¬¨xŒ®–}·YðËhd0$í oQ7¿7$‘µ,Xz1.Tܹet€ÑZ[m£hw45¹‰Ìoüæ!·c¦1Ø8"ì´i-±äÓÓ'.‚j †{Q†Æ›>˜ 남$t'V²ïB‘ÀÝt^r×­m,jˆ»ßŠ]EÊÚ(þ8 ÷aÔGäƒNî€z •¸Ë±›Í-r¿fzö Ì}Ã)kqXðÇ i1 ÎUýë¡§ãÌÐÓ…;ØbÞÅøE?™ (J¦SÁÀã‹y4ª}4×1Î_Ý%¦Ã±"­Ÿ^¬‰Œ]·f³èº/àïÕEêpø×þ­P'ocà¡C´J •q.Ii[^’2ïÎ~’Øü#üÍðá’_D›]ÇøÒv< *+Ÿ™£|?’¬‡œéV¡Áù.NOáØúé}K»Y.¾çñ¹Ï†.‚· žHŒq=‹ lëdC‰ÖUógb"¬>烵aœëˆ>O„K°Û‡ä"YF"ñ™óvŠG%f” Äßp‹9êØ‹«h…-w~ ã1Ï“à ©d’^9ŸKÊæUÐdlr&ÉïÌ)¦A^Nf‡9“d'°çÝœÎ]v|ÂXNä">¼©R K”`æpêéÖ¹(.(‰ÕN|§% [çÁâ½áq€MŸxU›x´À¡Ùˆó±·‹›ùi³dJ:¤"+‚ŠJº‡ç(ó»cŽù}À§=¢‘S*ÌœãŽÎI̬y¼$1nùðõAy¨P\!æ™ÛµˆÔhÈ·CáJÖ‘2ŽË\y+%Ç;s ˜Wà‘4ÏŽàɔ˻<ð’, %à÷¹Ò®˜9ÁţБ˜DÁ¹Ê|‹¼ åc#€ô;‹ûÖ£:R}=àfˆ">ÁaFpÌr£ ,À™¼Û=<=B=d4丫@.œ™K¤Ô¸A]ªÂ™Iô·Ç$ªð8ÿ>‚|;3y„X1itø ‚ÊUî»jñ‹q2«MØX_i¬+ÁèS>šòÐR‘©ÿƒ’Þal)Ǩͧ ú®^?ÞâÙ,¦ÁßN•ºÈCÑÊäÝÖ_Ë!g$ÿOÇ$‘«Ò<ˆ3A`vÌM>4ÀíPžt0õ`Û,SÚv(ÎÂaçÒšäbÍâ#ÄôY滓–®”l¢ÜíÒ·tÂÀ¹Ÿé<¦ã#:°ÁòK„ìË©G‡éÇ~Iý䟴ÛvT‰ήt³ªíÓ)ç093Ã8կ᪲ÙbŸ¤’–BIU'VäãêÅj&/ò˜Î*± mÚ˜4•µA„™KˆÈ°ß©Q6¯ùµìtì¾)½¹;¹ïp±¦Âϸš;°ñþE²!ÖÜ ÁÃùǶx_¶êêÈÈêßѶª( "ë}OÐ º¤;¦ÚÕ«X~.cÙK›XUÖ±ºõÂpW‹‡â›J\—Æ|d)µx’£‹PÝ3T×Çè;}Åè”l[v⮋;&ëdAn¥¾ßÕCɤÉ»‚x$ÜAPpÅgŸAÙÒ~l|uYñÙ'$ŒBº_¼½‰Ú“‚ÿ@mãš_p¤¤EÝ÷½§Ûµí¤×M6Ë`%<®bƒú(¶lÁ–¹‰2ebt²L®˜ðL¦çØZáòáôI¯»Fw½24-€yØ90EÉ&]ã¨Í*ÝùB ŸC‡‡ÏÀísrƒ™³‰La|É?ýAOeßpÖ=8j[X}Š¢‡°v¾d°÷t»tÇ÷HVÂXäFî-]KÚºiŸOÖ.–Ý•+ XˆøÚ.oŒñ Ö6íXéŽl¼Íí³ÕXÆT–:g!t†ñ€ÇñUÜŒI(¾ú€XŒí:iW¶=¢ª•A“¼¥‰ù–#9F ™znapYÊ7¥©MñÏObú¦O/@…ñÓ+Š@Ô?v´›·ƒàé;­˜hð+Æ÷)“þ¼а¡v³Þt· øQEÃÀ¹óî¶“oµàõÏ‚ä ýRD)’°ã1ŸQ”Å6ìãî@Ãëé¬0ƒhGgöªÞE–(Ö Í°ˆ©£#Ïñ(ö²¦‘f1÷äiNt-f¢?x:z= V`«E<¥öTñ5é ?­H&Á—¡2ž¸ÄÕœrÏ“×'¿Ÿ`Z¬'ŠAH64Äû¢„ªo2ßžüò«ž,à˜T\åäž ·T{ûsÁÍäêäŸ'Ïñ‹g0, ©Î3U ª¤i|ÞCu mø`p¦Äf,µKû8/@<r/{ùö|Uóüá–n—6 ~Dä# ¿ ø¢nÙ‹=ÝvE¸0­Ocf)KP†[®ÇðòA¶¯$üƒ{Þû©Ü’ŽÃž‘Ê]°“Bؾ­#ýµuª]Å+þLYçTP>ïJ ´vWb쬛¹ø#ÚLéú–Hx#>…VØðﳘ ½#C·ÿ¸eGß%sb74æ ¼'{­ûm 1Jg`¼qš¼P,ãý2 /™‰·ëåÂrý(ñÙwÜSèÞW­dm^Ãɺ–S H†{AkyMß ˆ¯ëÄ”~[Òe!W÷iÞöݽÝY¨ºú}°ªµzzQ“éñ%”ÜŒX­­\ˆ`Ó™éKJتÝ|o¾¨CW‰ƒ­´Ç”Rf#Æ1¿†ñ÷<|A¥Š¨Ùò­ MKÉbÒPƤrÕµÃöx½âáð¦S«®Z¹=£É3rªìÖ‡æHW%w+–.NU ¼j«¨OœEÖ/åZôj–•ðf(…r¦éë#÷C°~ÉÖaðâŠn5’3¡¤ÿЧ˜x¯†›ý@|·ÌÔ¢:V#V‚0õQ.ÕÔ™gƒ[ðø5 øë°¹T%¢Ã³àºÈ+)ä ÌX ž} p¬© Þl¤P‘سë¾ çZ¬êEñg‹4î²Ê ï”òbpÚ ìÔ+Cè>äÝ’{ìQ‹OŸ> stream xÚÕZÙo#·÷_¡‡•‘ˆ’spR¤Åî¦)¶HšÔqIÆÒØRWW5R¼ÎCû¯÷»Èá²ÝmŠ¢Òpxó;~ßÁy}sqõ¹›”ªÌM>¹¹›h“*—˜I‘äJ›rr³˜ü0Ým/g¶H§ËK=]Í/›.¹f·?büvÛ†«°b‡Ålz‚bSߺœey9}µ†òš»ÍP®2úÈ•w»°n³§ÞÐkƒsl/M1õ«máwÏ‹`Õ²æao>‚—dØŒÀêÞìo÷Ð”Óæºùó$™Ì´Ve–ñi<å÷¾^@ÿVÂóä& Н¶81¡j¸ê;šL'…JÝd–¨Ô ùþ)«DUÕO³DJâ¤õªð\ žîMujAÃÕê@MLK«§_{âTMÍ}xß8ïÏðˆÓïN~îýÞïxŽT¬ZÎÑþf~ç1-nqŠG˜ÀÚé<ð žžP/ àÆ×áRS¹>Цa‰«Ï³r¢SeÓÜ ¬Ý­Q6—µÌ%,m€;Èßg­ðŒk)Û½vE¦1„Öñ4oqk<|-4ò»5&ˆ ÍRäÑ4™Se™Ál4 .¶'zòóHg¬m­ÊrçÑ©‰³ï.³|ZÝ×¼&NÖpq»;b!VRÑ…+öº_z)¿ÃűþkªÃ¢;l³kd¢] ÿ›®ù1ÜL53¯Kû¶}^»æ•¨íÌ8Øú‘Ÿ¤FÂPÒ†ëŒËc•"MaÝ›KgQ_°”¶BVÀTýc’%ø¾]ðû|·Az¯¼lC»æ–h~z÷š‚sXÍñõ:ZÑS“„ðŽ(Ré|;¶åôÍ•GÔ:ÜÍ^Äz-ôÅN¸²Ë‚X¼%¸©yh… ÿ|™eÌV’á[?§õüŠ6Hc¿ó°¶*, ¼å Ô!O¨sœ­Á×»c6ûZ9í—ÐðÍ÷ß C¬Í€ö\Ó{«h˜—º-w<5í kOv†àÝšäŸUn’«²°ŽlM™«Ì¸‰U¹0P1§4èé,ê, cR‡K´~$¼z ´pÛJµáË@Êa’TI*4ËÅ*E8xª£ˆ§©ç¡µfúíí‰%Ö8qÕV6 €X-1|î¶ŒOÔm@)A,'±«e¶Ú[Ìzá!á´LÓ.{o‚2=+ˆ5,TîhNÁšSô4whåí¸ØÕÊ<4y ÈEXü»Û@ŠóÂ3xûüÒšî¥C«áÒ™Xí»³5BξŒniyÛD\¨‘‰I>}Õå ™ä Ž$Z,ÞÄFÚM í†ÍM#ÄÁ÷ˆ- ÝÛ²Ž2)ø]Yê-ÊR6u3ô ü®ä÷ýBʦ,¡ÄhΣ¶w2îQ_?ïßà÷(¿+9âÐüñ\~OZk ¯’ØÂŸ€Åt–æ‰Ò¥Tk µñ± :ô´š·½¼êÛ¼‹LÖÛŽºá·bç’_b<€‘`;Åå„—ƒÈø¼–eiÄÏX¦åÏm¬ÞÝ ÖF“JuM»µÖ"›U«äBxõŽ!ëâÒ]³»Jº¬ŽülØ2¿•WØ5±¬ïyø »½ß±–µƒÈǦþ»b/Up]Hš:ö!w }m¬­ôa‚ô$(‰>£$Y¢œÉ>DIæ"ÔÞ>ÎòóLyÙ…ü]$ô¾|/ó¾Q+ñÐw²ÎI”¤–µ¼K(EõÒöbu«@30’ÓïÉ™:‰«Æ!ŠÞÞßmƒ€ÈNû0áÇD§r˜Æ‹oî¼÷ ®n‡{QW…€e¿„H"™¤crðõš­Úײ7Q{„hP<&7™È½è.wk›vòƒ;†çdoñä÷ÞŠ“¦Aù-!œIŠó‚)pW4ÏćøZ¤áÍ–Jç‘°|†Äu8…uXËRå.ëÒòOÐþ—o¡³q/؈,DŽ/W$yžC îâ G®%v9ó ×ߢØHrÈì“”y¯>Õ_qï“÷º$ÀJH?íÝé^üäÀÌkÀ| ×ÒxKQþ­jJKfSœá³ÁLÁ„ð´²ÛwìüŸueëb>ÏA¼°”º}|Ž.ï³ „%ðÞ;]>ŽÞmE ïOÞ)ï|‚”鞈kÄ¡OÇiËÆ4­ ׎í–qiÈ•`ùZ†zÅ@kSb(N}èè¢Ã8´¢˜ã´©£Y«#¿HÒ’¤1³2Òhö¨ãá][†]~Oº§£S³coà]¢Ì•@y­Æ˜ž”Ê”¹ç×<À3“d%ÐÐcÈppÜJÐáã± ÄÜÁhmļŸÍX•e¥ï,¾ðȶ*t1>'˜ HÛDög=î¸ ´Æø¹ê÷Þ1:ywyÁä|Z°ã&± ¥JÓ^J2N»à÷nBaˆéõ3ž Ñ969Öu¹xÖMÁ>ì¯EqŠ÷û0>¡ªáºeA—¸@g¬§È—êji~?´ÑmG2¥[Edpw]Géä…˰?¥r1WIäØ"$Äß±‰ƒn=›%8ñb!Â]Rz Þ j´P“‘’pÔ‹ö[mùyÖŽj›eüU8B`>“¡ Ê{)‹UœÉ<’¿òÈ«ÇӮ˯]cÅuôµ³wžžåZð)³ |Ó‡g4hfK—‚ò Ïj r«\äå7âU wñ•…”&mPånrcfl $iq|‡LõÀt­)ã0{¦lWè{X×óA¼÷€3sâKn‡üήùñTnš)„ç ßáæä ,‘‹koñÊ d‚Z¬“ûˆ(íQE‚çN–1†A‘³÷(Ýi>·‘Ë#(°×藈ЌŠk‘ÙÑ8 Š&…¢u¤œ‡ÈN=ž‡™Ì(“¤/Ó'.…‡ÒoŸ›6ïK?˜‹RïÞá°îg“ò#ë3O%[€G¥y"+×ë_®¶ôuþý²ÚÞËWìei”/ßJ9Šºnéûk¡ïVþh(JÂiˉà3¹ÍÞ]ý«†¯ñ*žµðŒ µPZµŸ‚ȇ(’NÀ«`r轡4('ð¹7™Ø‚³BÛ¹¤¨…|•7`¾@§¯h‰ÔóøÀæQÂ}î†>oÉÉâ,»ÿ¼Mÿœ¶Ý,9 8‰Wy—Î#&Ž™—]2g#ÇäP9SIRvNÙÙÀ6‹zýnÄÇ0iªÅK‘ ?,Cb—òå³ÔY¯„Xä«Þ¿ð— iñ=¶üDý|_QÎ^ðËO%¼>cyÑêoßeéÅØÛÇ"ýY‚+N_“ЗC©3’¼èùm6·¸ú…úH*“îÆˆ`r$pÜ–‰î°ÒÔvÂÐ{2ÑäEÅžeøï†¾ í,Ëèžš®U òï 0­œ÷íi” ¡ÀÏPÔ ‡²B©Ãˆ„aümÚÿ‡‚cö 8Ú1p xD:sè$i@E3†eÚ€ïÞA‡ì«t'¿ Š4¤ Sߣ;/šô1©‡Â=~2<‹À£Rv/µHÿ[“ÒGPùÀ$$®|+ ÛÇÊÞ>ç†àíÎmqì¬ÀæX”Ï^Ç„Û `OR¼À˜_Ácv?sMTázyFóoI÷“Ç~¡’ÿwåͼHÞ²ysO“tTÜâÕ3É} @< ÙQð,éÐ^}‚Ý.þxsñ÷ $i2Ñá{t0媀(g¾¹øá§d²€Fز²¥›Æ\Ò&{ú´äŠ>(yPh2O2Úsº¦+Š#ù³æ;;Å_(R²èˆvs·n®F®:²”½8¦sñÎÿpi endstream endobj 32 0 obj << /Length 1755 /Filter /FlateDecode >> stream xÚíËŽÛ6ðž¯0Cåt¥ˆÔÓA[ ’6AP…’´m­×‰-¹–¼ý÷r†Ã—M{7Y'È!I$g8œ÷ õtüàñór0ŠF9ÏãóãiTÆ|PÄyÄøh0ž ^/ÖÃçA»î‡aš‚j9dÁÕA¯1ë$¤úž™…ù¦‚ÙÖ›!/ƒž`EŒÃV'x@-÷t[X¯Åk©¶Î$d"cAèr}ÛÁx#^Ñ0,³4øù\Œ{¹ˆ@©•¬sÃ$óvürBÆ¢Q–I©Õá [ÁëÐ?/r[abÈ3±¾¹ÜùÓ0ÌxbˆiÐôõ&Îb¯Q òÛŠ3y˜mœÐ9ŒØD;=$ º^±ÚË¥0J+ÖS:÷ü†ÍK8m…Q„*ßÁÊ´'ÜK°!!€ŽÁT PìÚ6ò¨ª™ÉÁ‚dêäŽ9ªa†&…À]›R3G©ž‡rø)®Ó䌮aØz/QŸ’úç‹ -íP’¶¸æñ b¤FmHr`é¿A¥ôƒ†w¡®ýàZÙ7ý‹Çr"³7$jOd76ÜËÄ,ƧäÇ:æµx¸xÞJñ© Ì@ù Ä& þB2ˆñ½s;B×·[¹ú äqT–Œ¦PúO‚²ˆsæ5ƒå¿Xq¦“)¨—(­1Ò×ç=óþ¿š:³PÌR¯v¡S{Ÿ½•ûNº“ž¡Nråiæê„‘2Þ¿ee"îÇÁN5àYÄÒÜÍ’ËTågð¡úMÌÀ\Mmr³°ÜFÔr\³Lvð‚ºûجŒŸ9sz8‚m‡ß’ßuG‚äÚØÀ €}dXø¥IÎTt”z¬Ž’†«Ã.LE”½E#'+Õ4€4+x}¨ ÍÌTT2=DXí”ræ7×^5ÇQʸРòåoödJ²(+RµiÚ×+)“è‰ žã ’¡“ —íŠp( —•ù~†Ø6j_tH»–“)”pÔÁ:ƒ÷MÊ»JŠw›»Z)=Öγޚ¦Öab™­0U©ÎïîÀ‡‰é“wš("‰Fi)$¿=ûø ‚ʃÆùÖ–×ÛZ™¦­Õw1 Z˜(/<>KÝ\uÛF-.il…1'W )V§–KQ(7‡K‹»Z“Ñ7ȵ£+ú~ ´Ýë˜,¨žû뾸:r;7¼—*ÑÌ”b4¶¢#Ó“´T‰i•=ffIe !­6¦ÏˆÎÒú{ÕðïtÜÄB™JÐ+=5¹ÒÚI¥è‘Wæ¢&U˜²¨…ÐÑás×â+=ÕT•Ï-ÐÊk*}CY_ c” ÂîIà'âyLíøïH´©î`åÅDi[qZÜDÖxN4÷}sZš‹î”Hì&çÆä–oꎖ&Vÿ :ƒnÏ¡ï·ò§³w€—Jó ›•µÕñ|ǧeØ£Ï{qºöÎOàã'KM§ ‡£iú^ž<ß_hWXìdÓýM'gú e€Ýß.E”ù LXTÒÅ;´ÏÆþÊK# endstream endobj 35 0 obj << /Length 1431 /Filter /FlateDecode >> stream xÚí[ËŽÛ6Ýç+¼ô Â÷£ËÍ¢ëÙµE‘f2M‹ék2iP _ʺ´9בJ-˜aÙºâãèòòœKú›ë/_y·‰}tÊm®o7Ò‰^‡¸ñÂõRÅÍõÍæûí¯WrûG*oSù;•©¼Nå.•áÞC*ÿ^uVéí›tù'™¿§[÷dž«yØÝÛ™„Þ?ÝQ ©Áûñç×ôðÍøuèÂ_TÀêgzøÃÞzìÆ×W‘QnÅÕ×ßmT›P›NÊ>Z»ÂóÓw‡J (]÷Þ™M§t¥<ŒèáP›Ñü~C6ƒí?»ßF»<ŒÛT~¢^¥:¤õòѽ›]÷öïî—T~V¤ß©ãé«L ã·ŸÒ×OôÐx=þ^ õsböT$c|µ_… JîÉ»ÑÀÂÊ`-ô'GrQl¯‹W~ ¬:޽? žù‚ÇåLûAðàÆDÒå Qïd([dSðŠŸ'ë·ˆÄ+> stream xÚÝYYÛ6~ϯð[et¥ˆ¢Î)Ц ²AÐ--Ð…Öö®øØZöfýïKÎ!ŽeÙÑ^Y´„Eq8œùæ¤üóàÙó×YÚ+‚"ÒÞࢧ’$PiÞËÂ4PQÑŒzzq_yQßWaœyÊ<0ÇÓÈÍÐf„fŒÍðÍP°æ'‘†×-3É÷õHrÁ9\,I†$ÌTÕÜàuBÓ‚ä;Ó¾…Ebæ»òä8‰ò.jV Þöž¯TP$‰ÃJA!e4ÒŽç«´3V±Ð8ºVMuûÎoŽULlØ0 'M*4±Ê:cÅ"6¹tÇJ5ü:?ûFX¥«„2aýŒpbÌŠ¬ò[c•¶k|+%üJ=V¯ÒV9mŒ EþŸ4°*îäWêVX¥墱³x¬2"ЂQ!0‹äöîXI³};øUÞ‚ò°âNZ\ ¬4`ežƒ8V=?ÒA¡°_ ÕÆŒ¹çÄa…Ì—ÈÀ>žšÇu½ª¼’æS3,ÙÂŒŠd‘ã—ß3AåQ©„D >†IH †Ä|F‡Ì0˪ïçE˜1åFypjÌçI'9#]?Ñ–¡ÐæšÞ÷Fk•dÎö19ˆ®Ã ç­å"áp±ÐûN NÒŹ•H Jœ6œÊñn‰¨_oÄÌ9%ø/hI¦˜®S2Ç”pÝvÀJ†T*t*?Ùt„äñJ´ mÀX5í ±*x‡"™jq~¾—[°zÙ‡µm^‹è™ˆ¨CX53Ô]G#¡VÃûV6ñ\‰øÓï‚) Ã.Îôÿ+u뺑g. mgÆo8eªA¼êÕ6uäir›‚¶üj ² Ql†{Zƒ}-L²9Xý4WÊ{áðPÎ}P.…ÏŒhy¼›Œî¨C|(v“ß¾ýg§ºÈ(’a÷„z¢ÌØ}í¢ sCéé¤=ÛýíŠá‹cG4›ænLÛw©xâ,È#RýtOõºp²¼Þ­ô•(&kJ–•Ë¡¨‰uÞý`ÆK6{¿§A{~¢“.Åm‘tadòóß\øE)> ŽÚâ·"1‡4dËÁÅŒýƒz°ÒaQâÏŒ„6jë #Õ‡1–¾|╵‘¥Ú òK‡†_‹–²m”7õKqÛºKÙZ˜xÜhÕ†{± Í©Zž;^)Ï-Ä”T˜ÖV©w€k¯Õ¬Ø lÙ|ãÏÆáþÜ#ænö>ãǹþ㇓®ÿ4úûÕ°÷VVºæZ|šíæÅ?ÝZ®SËê;tÓ¨H½rDØAÙ™ÞƒÚ# ˜A›nšh¢¶nëл ÚÁ¬|v[©ÚY"(ö˜—`yHœ3o4Æ7Ë•XZ¸ö â‚pèøÙŠ]C®šsŽË9 ŽÝ(P˜rÜb"ujû˜$ÅX­Æ8ùB­,@?•$ 1>¬¹½„ ÉbI®ËåN6žãRRsn õ±˜oȶ jél7Ú6Ç·ÒT~,„uÿg¸CI¡¼aç1ýs“Ní?7Eç9*žØ¥g¯ÏþêOo endstream endobj 41 0 obj << /Length 1707 /Filter /FlateDecode >> stream xÚ­XKoã6¾çWÙä6bD½,M] ‹¶@{ØÛÃvȲüèZ–kɉw‹þ÷r8CŠ’¨Ä ö ›áð›'9|s{qý6™¤,ýxr»œp?d‰çOf^̸ŸNn“ÎfÊF|ÅAüdЂ‘jWOÝ äT…Í¿<ŠÞnÝPά œªj+~Ž-œÉv¢³hy­a+ìV{ÚzSÂÖ[½ŸF1t¯7ª–öåó©EÎß0’+N⻟ú3‡–.XÏ Pox—s–Fj@C ‚΢›£$‚!L””5Îf‡–rE['N’¾“Õâá¬Ü2‰€‡, Ã.Œ_„˜a”:ŸIuÄÎÕÍ]Õ@#A†´ kpJéJ´SÏ©8гˆV5ƀȄ&kŠ–‰ Ý•ô…ÅFŽ¢äæÙN²øl(<—#8šáPb€¸nGÞåÍ3P”Ø­8à {ä!3ñsg ~`±áõÛYlxvš°Pð÷s!M!$ Xwâ[‘ý2ik["'3DbÎ<(FJ-",ÏÉö„ôPJN¤€R†MQ#rR‘Ù‚ˆ 2w˜ð[?r~–<´wÜ« ¼"µE) £Y×O¨ ì"sj*kC[n|O›×ÙtQДrxцÐÛ¬ÖäLAè9!m²¥‘ôIžWR tt@º*€YNœ÷*Jæ[ò²¾‚)ßY‚cJn° n¦„C-Ë϶øÔRÍBƒ@€ 5V8Õ¨¸í’äÞIó€fAž •Hm)Údl媬)h•1S*Êv’¬Ïœ?§I¨Ð`(b2eAü$b4ŸEì¥ô³RDSœtTt—• 9t" e…s¸eVV<¬UŽW”&¡íµá¤_£D˜†Áæ¾8>ø×ˆ6Ÿy©¯‰jSel}DaTøiÈ|¤mÉ0 -&9i·'M?,àŸÒ—ó ÿÖ´iC!ÿ½ø®é+ÈòL|dÃOô¿§y÷ÑU¤’ñ诃±ß)Û•Äã 2lO½Š÷’>E«p5ÆÞú@–s?#±—*dè¿!~l°Ÿ$ÿA4Ývå‘V惹0cäÙ)1Íñ b³€wQôtnià|=…¼ÁeP½7tt$ì7âóÆÕ†`´?ˆñc1ÐüCÊm:¢€Z~£-s•‘ ¬þ†ÔVœ¹GT©ÚµFv‚1—@5s¦N š”­é\ðR‹ œë,åü0à^…»øN)3CÁrThyå·ø÷8 ²ˆ” Mx§'½«wz\a¶›žºhèl‡ò0KÊZÒ¸2ê‚$9½Ìÿqèj€|zØ :ß¶•ðùKpw†n6:õå=uT?µœ;¨ÿÑÂj0ûÝó%n9¼ ÌíŒl@ÏÏ*ÚÈù~¾Òƒ1hÏ u„4´×aÀ»©ü ô®Iif¹kÊ(/4‹†ïÚüø?›döûˆ-˜k¢RiB;­äœ.[ãÀ]‘4ë‘< Ò”ñ$éFÍ×IH#܉±Q‚¾OÝLùÈ=âº7Z/> stream xÚíXmÛ6 þÞ_´ûà×òk\ì ´]‡µÀ6 Í€mQø_’5±Ó8¹[÷ë'’l:ç{Ù†ný°²d‰¢HJ$õèÙôÞ£ï³t”ûy¦£éùÈıŸ…Ù( Rß„ùh:½õžŸ¯°eòøäýôÕ(ÃÈÏЬlÿÖ–õÞ–-ï‚$°Õï¶'ã$Œ¼S©¤Çxå·´Í µÎ[Î{†)nd°€Ô7dZ@Ü-(kÈzýlZÔ2 Gccüh½œœ©ó|êŸÜÑk.èØ—qœµÞg¡WŸK—:ÈôÛ´j²Î¡›;0cS,ª•ÊÆsQ~~]¦¤ÿSx¯¯uœu×úûêr¾RI÷ƒ )N]Í6Зìa5\w«æî×èn”ýÎT¶'~ÒgííR×w¸õ0É¥Ú…åͨÄ]± µi¸ ƒ•Uïfs½†lÛúQ]ƶ ϤIä'Iö½꼊錄;Úæç7Aîú™mÜZƒò[v\ý?°îãïXÇÀúûÀÙç7(˜ó+-°ê®Zð¬£òFyhßùŽh1g 7(.¹#§0íÞ5Û(^+ä|4áùnZ²6ªÔGQåagPaTŸùâ8à D€¿˜ïtêÑPºêéK½\÷PÐÜþXð/¾ÈÅzÀÖ?ß¼Û_ÅA‚÷€ JŒ÷F*äpëÁ?Vø?y#Hò‘‰ý(NÃÞ‰Cñ”[ š0öÞlá·O‰¨È¢®8TÛÎX¢fûÃιbWŒ¨&{‡° 8L½zkãI[KÐÝžK¹ƒ¯¢bá9ØcX 1 ÜÔØËþ¾"Ag5§•ãÍ +î 9µnŒ`sv‡`°À;KSTsa 'þÀr pFö¬‡u×8 ¼)?DV:.Å®°mO'$w¨îy…Fù5€ƒò\xñÓ† ¼ Lìðõ\úa j2º8IR÷²î üI`–çgéè ‰Ç ±&ÍýÈæJ ðü<Â-%£¡{/¦÷þž‹t endstream endobj 48 0 obj << /Length 1676 /Filter /FlateDecode >> stream xÚÅXK9¾ó+rìHÓ~t·{µZí Ä8ö…¤g&"QÀòë·^îØi' °£=$~•ËU寪\ýâæÙóW~Ôª¶6õèæv¤S¾4£¦¬•6íèf>z[ìǺ¸‡ßvs€ÿ»{jö㉵®_ëpX«ô×ð[¬ð~ߦ{émÖLó€¬p<ž˜¦˜uÐ#Ç-öÔxâ\[\3éi§H¼ëk·Ã®¬‘° ÷ΰ'LH®ÙtÍpJÄ›#w¥v(%<~óרM´VmU±¾S<¡nŠ)6¾X¢ü;Q¦7·Ü~_ttò†D„ß,5uñ…L²»Áw*ލ1PõÓ½ƒ¬:öÈà¶`×$ŸˆµO^ldM3õ”]•ú抗â¹' Cd·3y¬Ò„ Z0â¡krÍøò2¾ÝÑ=f›î™®~Æó°³ýç¨j ªöz’ÝÄÓ_Gqb¼ü‚Ûa{Ôç82Û82Û42c_”‡{"87uìíÐ¥HÑ*× ìÿO*c ”4DЍû¡‡˜H‡I#(s³øâ"u—¢iØù®¬J^™%#Ç LhNC’hÁü ußµÇn|â±7ôüœ©n"ÀÝ¢þëAÅm‡¯`»­C”[‰?‰q•˜hhø@u ÈF’¥5xòêAâ nx½G¾¢§ã¤GØPl ¦Sl*×"¾œý(2†4œ….Êãe廚iƒ}†×àè\7‡£QB¬òŽ­÷6㙼§_&Ì ­Bc¬juÊÇü\"fwÂÏþ ?q¯£°gÜÈhe¹ÑB"Ÿ>ãJ´B¡ú½øˆÖÐÓR'o¢¯² ÌèÑ{wH5†[Û×Kò¢Ï=ð`;‡yDxæõ1é4Ûì…WÚ© ¿,ÄMAã<ÅqL4ȼ°iõ2ð°ó-•<-B!e”q…)œ|:ÈÕ;us¶Þé?+Ôü5¤HÖð;*ލ©ÆBH%A“ûã!id@¸;È…?„· N×ÁˆØÝ¬;îœ~…¹â‘†‹Æþnº’úQ7L?çD«T ëÄfƒa©³ˆêLÊ¥ƒúçêŒÃCFë °­’óÎèB@AÉ䵊½ºÖ†s–’G·Üî#æý3v!1 Á ý­îƒž²ª×Œ¤ŸÇU¢gûcY°Œî„×å1¡îBQ 椴¸É}Jšu¡ô$§h#ÕcRbæq…d}Io åRŽ.(hËßñäNù[XœïT§î‰RÓ#*S-ï|-u£†Hέ?_yh©75Dÿ Dc#mˆÏÕqú³íÅü—Í=ÔxnÚï¦È4Sš\ÂL³¡Ë%Å:É¢*,eV_ÈÌ—mJÙ\àâ“Q×eÁœÿÆô“a¬°öhŒ¹§†˜9y~ýĪ'€Xý“kO7¬fD4¯½Vy/‘‰ìÙË›gÿuùæ“ endstream endobj 52 0 obj << /Length 2110 /Filter /FlateDecode >> stream xÚÕkÛÆñ»…"…Z¶I1ì Èû H‚€§—K¢Jžâ³‹ü÷Ìk—K‰:ßùÒý@rÉ™÷Ο]=ùây9©T•›|rµšhãT™šI‘æJ›jrµ˜ü˜¼žêd³‡Û|9Ù¬Ln`ü.z­’†‡º…{·„Ûo]Ç ÂâÔq7|9¶³LúSªR_vuØ =¸^óšÍŠp²ÙÏàþgÛ†§q¼Eš;âhj "++\OM™¼ç1`Àä»§ÓŸ¯¾¤“™ÖªÊ2<–ÓÚ¤iøÒâ›aàë ГÅàüF÷Í £]Og&÷Às„Eäz¿FFü™¥£þJv¨ro{Ak¼m\QMgιä¥:ˆظÂÁëhLôµc’]¬e’u°n[oñ¨§ÉŠ-ð]tdD”ל}`åƒ./]"K=¯¤ókmïWæaÅô˜4)ŸYiy~ÞàBG¸v{r·L$ÎYâys…€\Qö–—N8@/Þ Ç"WÈÚÓé,Ó.y‡F"'e“Òœ,;B­^,ÞŠ¤îä+>ªd…SdÈ£ØL°!EŸþ-óKŠ00v ¨Ï¼ß{= ½º½dät›w &qi™ˆ`{4¯K £Ûºw6¶B/Ñ¡ÕmÇ^HA`:‰øùœ–Œ)6¦”AÜ}ñ¼È£Td´UÖà™xý§xl+zÞ qEëñ\-óðº<ãEKÄÉ®2ªÔÚ/€jG—AÎw4fÍ,æBk‡ªk²>›Äz½÷A î}‹í(ʈ ïx'rjš ¨W°ŠdܯÀ©ŒMþÂs±é3ÛYS®Y ÈLf#ÚX Ì^Þ·Œš¡]áÊøu'³7ÑB·<µ>QeJÆB°w‚Åéj@ô­@^6ÔH0о†ù_‚KÇ¢Òô?Hâ®&Ùå¢ Õ‰"zèq5…l¥%ä^ <í/I׃é¹Lo£iòujG„º‚ë\ÿ‚ë#¤~4æ_]r£‡DO¬ˆ˜%ð¡3•瘱ªÈ43¼êÔ‰‘§•§“gÆAP#9<ªª‹Ï%˜ ëÞ ùœI~æw"‹/{¤Bž¥<+ÖZ<½kñ¬‡ÓýÐôCÛ]?Ì­Hû÷J,õ¸ÿ=* ;öK†:/ì¢a·Áéy„á]·»ÃÕ½ƒE`?:iœêEÂ?0 #韙§<>ý˜š9½<‡ I|×ë“C*ç|@›•#þ(¾è¼p0{´a0#„¸‡ŒÇqr{o<;yûqÆšílMÚm>Ñœ±0¿=°Î;×Á˜ŸÞ³¬ ‚ÝaðÓoþdwVÑŽ¹ƒãò'È€»{oŸ–ZÆTð°B »d˜“”gÇÜ_IOÇ@joý±ù¸Ó,Κk𘭃¥nùKßd;=hãìŠl³cr>ko:žœCî‡óÿ¢gûU4uM3B¤[² d㇖:ë¨OÓ[O€ú5ÇÙˆñâ®ïÁñyé› »¾£åOÖmßC•¼ m6éoÕô×(N© ó–¿PˆH…îÎáj«Úw~n›/«&Ú)ërƒæ­‚§;»ÖÆ%¯‡Ãö=µ©ÀV÷LêxÁàÅÒû˜O½ûs¿²F«2-™ì÷¡gSæÁL5îÆeÆMš%ßR;1gRO‘’]}WGðkžŠ«oÞt rÙ¡N™!o!:øNÑ{þ8¨N@”´‘&™©*ϹMÓÐ@Äϯš.4ý®C²AïôvF¨g´ýói¬Bæ iw/3žÊŽßknÏ‘EÿX¢ƒƒ¼ôŽ@/¤± ¤<ÃRZáp½aDqI€G#ÃY>ËUUa•—+ëµÑJÙ2¹Â–V*›š‰SZ[_ûŒÖ-§\ecZ{ZJ÷µ¥¯s2V•…ó0·c$òÊE44ª¿„ ΤâZ«€Ý¹ÄøýÏÃsNRe5¤ÅÈ7ÐP‹™OÓ‘>Œ¬qb@…˜*"2#yKoó jŠMÆjšiåªì²L¹ÊK;‰€z¹« »¸šU¹ŽÃ8ËUZ–þ 5"©Ë«‰ϱƒ“ü•å(?N%½1ÉÐÐ>À’5C–ÆL]¨ÂUg¦0 ¤*÷0q4+´2i·×üOã)^6! Tbç «väáÐŽ¥ŠJÙdt c*ŠÉ:šƒü°¢Z½²Ã†_;0~±ìÂ.'1ÿ‚}W¯[JÌë2ü毚íà/†¯Z׌µ¢N»1-k88rAæÌµÝŠè:=Q¸a…»AÞ&j¥ólýfi ês€{@’°Ë„§Ý¹/Í –Á? ¤F‰ÞFh¥†ª#M¡Í¹žðgK“/õ˜ý€(¼4”Z½ßf£ÆÃÿ6±ñ6#Ƴ°½ÿã­GxrÔá©> stream xÚYëÛ¸ÿ¾…±÷¡òu͈¢¨GÑè¡ ’~8´Åýp@ñÊY]liO²³É÷¿w^”(™N|‡…-ŠÎã7Ù¡W¯bøÓ+dÊæåÊFÅ:]m7?ߨ¼ÈSKÞ–´ì“‰¯zõ÷îæßðç–6ŽçÆcúÍýÍ‹—ŪTe–d«ûÝ*‰•ÅÉÊfZÅ%L=¬¾‹^®uÔÀçÝ©‡ïz½1ÆDúOëMššè_0µ‡OwÄù$êv¼ŽsÒ¿“ Ó›jøjñkd ÆGøô'øÚâ,í‡û®6y®ŠÕ&Õ`¸a¥žqu$yñRkߎRee†í;¡ˆW™*sS Eªr›**--S5LåÃa”ÑùÊ£ù>¶q@œQà'íã9 ÚŒëÀCv‰e–¾aY'9A1 IJÃÇ…¹Q¥-Ï î©IÜ:±aŽà ^VÅH}8ç¦UÚl»U<Š“ªf®¹Žî2lª2ã¡Ø€[@­¿ä–\Y«}·T˜*›:¾P­“éQ"ùi/  )1rGȧÐKŒV¶° “ij«Ø˜²ˆªö!ä7P;N&Œ ¢•†QH™pwŽB©à{$]F¢NQ»n½ÍðTmÑ®Öoè˜ØÙ[yþõÑwOMm«VlÞó`×õ<ðàFf¯jtÿ€ ¸=”<9‚k‘©Ä8XÅÝÛõƦÑOµKÈç"I„¤B–‘cAã3_°å‚lb4tô€lÙ8:jˆH=cH|bŽÍŽŸU?#nKG¸G‘:UešÎõ &'Àö(ºø*VC„/ÏkR€ÆÈŽÔÿÑw’#ÀYT…Ö'¦øâÙSÆqtÿ8‰<¹ôÒoßC h%íiÚ­wH@Å\žÍk®R*=dpMþA•À7äã³PÝȦ(çh96MÉ8Ô¨W˜Ó“a|V°\½gˆ$ê“1À(›Ö<Ç%m;L®¢ !ò$ ð^<òTÕËÆ ašß28yåÂk¡‡y<7ùÃÚfQ…HÐ5†³>½s„¯èåñüîyŽ7÷âžêížÈAp(Ûê$WqzuQºv,7$ŽB–£íg̃wnfÊŽh A›¦T<æa|ÁÁ–óÌrÔj&Q˜ gðíŒ&‚´ˆ9iç%Ÿ¸šç^qká‚eF&öÑœ$2s™l¥Z?umêDçªÔöŠœ>o8v!ŸèÌú• übuFµäÌNoÓ³‹p.ï\Å’Båyr^Å–~30ÁLj…ØO©ŸÉü>SŸÛ'yñ‹-ò¦¢Å³ò¯ŸÉåAä-¶©ö¼§˜cZè±àÂÉ·Iýw]¤,Sb¯eùóÔ83a´àÐ8ŸGå¨î¼{­ç ±o)¼.‚)ÉÉcu›HCq(„Sp¦Ôrr'©¾Zì0‰éö®GO>  a˜`Ýæ'!ðWDÕD_ñã~‰¯¯\š’O#õ¢åeKÒëÔ+8õ$ð"Õ[ÑxÙ£¬$•8¸²$µIds+ÚÔ®[]¦ê°Mž°™\z $ãOí®5²qËdÑÌ_úHjŒ€4£â3Pѽ€ñ,2úi_w\ÂÜÆ~†9d‡B"édz/ʫπ.÷ü<‹N ?ô“¸?Ãp3éÛx;érE+[÷¦#ÍC=á³X¼ƒO∈€F¾ÙF,•Û‰ê­gJ#¸·3e=×¹ýIØîDŒcÐ Bþxñdðö½¼„í½O6Òèd*\îuœÌÖ{!è¼0WýZ}¿–¹ig ۶X>_OîAd¾÷ü0ÛàV4­èèÇ3'þ‘ł󥀨Ñéx\]`phèÕ‹tÑ}b'œ~;pÕy-ßWÎjŸíâŒ$#³…‡x¤‹"3KF‰kv,4;sv¿Úh¸¦ë4“Ü+Qým7fûŒ]ä ßr \èÚñ~cñ§èù¡ëiÄ矼ݳ=µÜ—zž¥Êž62ç·YvΫ {Çäãt „®‘ftjžªø1P¥$:æ°mõCµL£PâóÌFÛË©êîU,³Ð˜¿ñƒ^Š3·©wÊÑÙ’@šRû„óö)5å¬}"bIó¸6v§0n©Úüâú¦ŽÉkÊ܇ÙÍUÄR;qáÀŠµÊŠÅ-uy™*rô =ý( ‚¯:ÈK×K ª{&¦Æ¡(–›ZjPðxýâ4ÇéñÞpp+8.LâkËï…› _ô…*F¨ãºP¾ø.,ýÎt,¸“|ü:4¤óù/ »±Ì0Ãëf,¬SÇU‡:§"QV›é7;¾uòä8>ºTeéôÃõ_ÊÎE@fÈôúÁöÌ4\Wut+›Ü keù׈}ç^èÿ"™ûªÜ¨¸Èæ¥øVOãqyó;%é±<+Ÿ„Ù“7~PÂ1½•ÊèʱÿT ž·ŸîÊèRc%ÕäM…nl\63Ì‚ éàñý0µWÿ‘éÁksßzý3Vñ÷LúMм+š"y–©ãÔ=ùÌ\7yœ·¾—ï—›ÎPLLHø-û³Xÿ8‹ÌÂ(›,.s¡R°“Ý—ÖîBÝfˆø»×J&ýóKôÁh»Ôœ_bþø[]×å^àµ<‚ŠÍ ZÎ_æé43*M Q†´j¬ür®é:7ÿ¸¿ù?¬8P¼ endstream endobj 49 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figs/plot-sparsefig.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 56 0 R /BBox [0 0 432 169] /Resources << /ProcSet [ /PDF /Text ] /Font << /F2 57 0 R>> /ExtGState << >>/ColorSpace << /sRGB 58 0 R >>>> /Length 53894 /Filter /FlateDecode >> stream xœ|ÝAŽìÊ’nç~âŽ`+IFî]u¨'u4€©¡ÆžÞüeÍ̉½×²N¡p>Qù“ŒðuÏEæöŸÿý?Ûþßÿüÿú?þó?þóž~^ÿ¹Ž?¯×Ž×þçÚÿsÍ?sÿÏÿ÷ÿçÿúÏÿ¯ÿåþŸÿÛÿúŸÿö?ÿëçÏÏÏÏžÿóþ·ÿþ_ïñçýúÏöÞÿû¶ß|ÿßÿãÿç¿~/½ ·±‰?^o³ßÿÕ®ùk¿ÿß‹ýþÃÓmN³ãÏy˜½þìzÍןùcöþóÖkž¶ËÍ7»>7Pl4›?—^sþ9ô>LßìúùsÚ}¸6ßì׆^s÷Í~ÞM¯yüv®—ov½ÿüØ}ø5Ýì:ÿzÍóÏ´ûp]ÍfãÏn÷á×|³ùçm×?¾Ù¯]vͱýyÙ}»oök—݇qøf¿6õš¯?§Ý‡ñöÍ~mØ}g³ÙõgÓk^ÍfãÏK¯ùûñ«÷aúfóçÏa÷á×t³¹ý9õšûŸÝîïéfóøó¶û0_¾Ù¯]zÍ·o6Ï??vÍíuýyÛ ÛküÙì.}pؤÛkþyÙ¦Ûû÷e²Q?xÙªÛ{ûsøeß'ÛõóOO¿ìñg·e?8mÚíýúóÖmßïf¾_~ÙóÏKïÊûêæû}±ô®üž>šùæ÷(ê|û¶ýÙ:Ô§vßö?/»eûvøsûÁÓ¶Ý·×÷Ÿ*NÛvß~Ï~ÙóÏnÛ~pضûöû–Ù¶û6ºù~~ÙÙÌ·ÿ|NªŽ§Þ•}kæûÅ©weß›ùöß·L/û{¸Ðçvÿ=Aèitÿ=&èsûA=ˆ]·ýÅ©Û^Í1~¿šsüõPºæ$¿ÿ%~tÛÑœå÷Ñæ?¨'Ó}4Çù}4çùê~ÿ=Qø|£9ÒPç;Žß·õ¹=Žß£ŸÝ²ãõãÏí‡^öõ{ú³m?ñ¸Ù¶ß²´m×o}Ú¶ÇëõçÇ/û{´m×»™ï§Ý²ãuvóý¾e~Ù«›ï÷ è—ý}Ëü®Ìf¾ßÆaw%û|û~»üeñ^‹}ŸK²ìs´ínM±ï;¯´Ø÷F‹-Þg±ïëŒ}Ž/³˜o}Ž6šÍ¢ÏÑ¢ÏÅt³ìs´Í7Ë>GÛ}³ìs±a÷!û-ú\L7Ë>›v²ÏÑ¢ÏÅ|³ès²ìs±Ë®™}޶ûfÙçh‡o–}Ž}ŽööͲÏÑÎf³ès1ß,ú-ú\L7Ë>ÓͲÏÑ¢ÏÅt³ìs´—o–}ŽööͲÏɪÏ£Ï ‡MZ}Ž˜}nxÙªÕçŒÑ熧_6úÜpÚ´ÕçŒïf¾ìsÆèsÆ«›/úœqtóEŸê|Õç†úÔVŸ3þÜVŸ3FŸNÛ¶úœ1úÜpضÕ猣›/úœq6óeŸžzW²Ï §Þ•ìsÆèsÄìsÆ·ŸF«Ï õglÎóÕçŒïf¾Ñé«Ï «Ï õ¹­>GÌ>7zÙìsÆèsÃ˶­>gŒ>7'\}þùêùËê½F‹çò_[}¶ek¢Å; V¯4Z¼Ñ`õBƒÕûŒ¯3Xõ9X½Ìh¾Yõ9Øh6«>«>GÓÍVŸƒm¾Ùês°Ý7[}Ž6ì>¬>«>GÓÍVŸ£M»«ÏÁªÏÑ|³êómõ9Úe×\}¶ûf«ÏÁßlõ9Xõ9ØÛ7[}v6›UŸ£ùfÕç`ÕçhºÙês4Ýlõ9Xõ9šn¶úìå›­>{ûf«ÏÿµGŸVŸ3›ôÑ瀫Ï/[õóO¿lõ9ãé—­>gœ6í£Ï ßÍ|«Ï «Ï ¯n¾êsÂÑÍW}Ψó=úœQŸÚGŸþÜ>úœ°úœqÚ¶>'¬>g¶í£Ï G7_õ9álæ[}Îxê]Y}Î8õ®¬>'¬>\}NøöÓè£Ïõ<úèsÆ©Û^Í1þÑçŒz(}ô9á–}ΨgùGŸ3êÉôÑç„ÍyþÑç„ïf¾Ñé}þ/>úœQŸÛGŸ®>gzÙÕç„Õ猗mûèsÂêsÆÓ¶}ô9ã´[öèsÂêsÆf¾êsÂêsFŸoõù¿˜}þóý`ýËâ½û>—dÙçhÛÝšbßw-^i±ï/4Z¼Ïbß×-ú-^f1ß,úm4›EŸ£EŸ‹éfÙçh›o–}޶ûfÙçbÃîCö9Zô¹˜n–}.6í>dŸ£EŸ‹ùfÑçdÙçb—]3ûm÷ͲÏÑß,û-úíí›eŸ£ÍfÑçb¾Yô9Zô¹˜n–}.¦›eŸ£EŸ‹éfÙçh/ß,ûíí›eŸ“UŸ3FŸ›´ú1ûÜð²U«Ï£Ï O¿lô¹á´i«ÏßÍ|ÙçŒÑçŒW7_ô9ãèæ‹>7ÔùªÏ õ©­>g<ü¹­>gŒ>7œ¶mõ9cô¹á°m«ÏG7_ô9ãlæË>7<õ®dŸN½+ÙçŒÑçˆÙçŒo?VŸêy´úÜpê¶WsŒ¯>7ÔCiõ9ãv÷¹¡žå«Ï õdZ}ÎØœç«ÏßÍ|£9ÒWŸVŸês[}Ž˜}n8ô²ÙçŒÑ熗m[}Î}nxÚ¶Õç†ÓnYõ9cô¹a3_ô9cô¹¡Ï÷Ž>'Œ>ÿüßì~¯Í>Ï%Zô9ÛömM³Ï;Ív¿ÒfŸ7ší~¡Ùî÷Ùìó:³Ý}Îv¿Ìf¾ÙÝçl£Ùìîs¶»ÏÍt³ès¶Í7‹>gÛ}³ès³a÷!úœíîs3Ý,úÜlÚ}ˆ>g»ûÜÌ7»û-úÜì²kFŸ³í¾Yô9Ûá›EŸ³Ý}ÎööÍ¢ÏÙÎf³»ÏÍ|³»ÏÙî>7ÓÍ¢ÏÍt³ès¶»ÏÍt³ès¶—o}ÎööÍ¢ÏѲÏï>W6iö9cô¹âe«fŸ Þ}®xúeï>Wœ6mö¹à»™/ú\ðîsÁ«›ïîsÁÑÍw÷¹¢Î—}®¨Omö¹àáÏmö¹àÝçŠÓ¶Í>¼û\qضÙç‚£›ïîsÁÙÌ}®xê]‰>WœzW¢Ïï>gŒ>|ûi4û\QÏ£ÙçŠS·½šc|ö¹¢J³Ï·oŸ+êY>û\QO¦Ùç‚Íy>û\ðÝÌ7š#}ö9bö¹¢>·ÙçŒÑçŠC/}.x÷¹âeÛfŸ Þ}®xÚ¶ÙçŠÓnYö¹àÝçŠÍ|wŸ Þ}®èóEŸ#®>ÿ|$ÿeõ^£Åsù¯­>Û²5Ñâ«W-Þh°z¡Áê}F‹×¬ú¬^f4߬úl4›UŸƒUŸ£éf«ÏÁ6ßlõ9Øî›­>GvVŸƒUŸ£éf«ÏѦ݇Õç`Õçh¾Yõù¿¶úí²k®>Û}³Õç`‡oöÛb§ýÿ2¯lT´i?ßÙ¨`3¬hÃ~¾íç'#•°üŒ—=ÛOø ëÀÏxúeëÀϨÛm?uà'<}½¿lø G7_ø¿Jvá§nûûeòÖm¿1ô›íƒC·ýý>Ñï¶í÷KãG·=ëÀOøö¯·í¬?£~Ámgø›ùšsÁv6ƒê·Üv5Gƒí÷ûC¿ç>¨‡ƒíjNŸ Óçvß_þÜîû;O¬ŒúÜîû™'VÂ+C•ñôËÖŸqÚ¶û^~À£üŒC/{ÔŸpoæ;êÀOx4óuàgôùŽß·Ì/[~ÀÑÏöÑœÏ>¨Ïí>šÚõˆ¶ÏæŒ¶ÏæöA=qì³9¦íóð³íõ ¶Ïæ¤¶Ïæ¨öA=«í¿‡ Ÿo6§µ}6ǵ}6çµ6ó5'¶ãóß_¶m?xÚ-;>¿9̶ý >·Çûøó¶m÷+C•qøeߪ„g†*ãeÛï+C•ð÷-óËŽn¾ß3¡_ö÷-Ó»ò{Âðù~O»Þ•_ôù~O/¿ìï[fw%k}|ϪY|)‹}¿“ɲÖѶû“MìûÁ†ßÇbß5´¨u´¨u±o­£E­£E­‹ùfñu€6šÍ¢ÖÑâ»@L7ËZGÛ|³¬u´Ý7ËZv²ÖÑâ+@L7ËZ›v²ÖÑâÓ_Ì7‹Ï~²¬u±Ë®™µŽ¶ûfYëh‡o–µŽµ.6íçËZG‹ZöóU­3F­^öXT­3F­ž~Ù¨uCÝ®jñôõªÖ£ÖG7_Ô:bÖºáÔm³Öwÿf«Zg<ü»­jÝðÒm³Ö£Ö õ ®jݰ™¯9T­ê·\Õ:ãæßsUëŒÍé jñåÏmÕº¡>·UëŒQ놧_6jÝpÚ¶UëˆYë†C/›µÎ¸7óe­3Í|Yë†>_ÖºáÔ»2šãYÕº¡>·Uë†zD«ZgliUëŒÍ1­jÝPjUëŒÍQ­jñlæ›Íi­j±9¯U­36'¶ªuÃÓnYÕº¡>·UëŒQë†Ã/µÎµnxÙ¶UëŒQë†Í|Që†SïJÖ:cÔº¡Ï—µÎµN˜µ~}²Y|)‹}¿“ɲÖѶû“MìûÁ†ßÇbß5´¨u´¨u±o­£E­£E­‹ùfñu€6šÍ¢ÖÑâ»@L7ËZGÛ|³¬u´Ý7ËZv²ÖÑâ+@L7ËZ›v²ÖÑâÓ_Ì7‹Ï~²¬u±Ë®™µŽ¶ûfYëh‡o–µŽµ.6íçËZG‹ZöóU­3F­^öXT­3F­ž~Ù¨uCÝ®jñôõªÖ£ÖG7_Ô:bÖºáÔm³Öwÿf«Zg<ü»­jÝðÒm³Ö£Ö õ ®jݰ™¯9T­ê·\Õ:ãæßsUëŒÍé jñåÏmÕº¡>·UëŒQ놧_6jÝpÚ¶UëˆYë†C/›µÎ¸7óe­3Í|Yë†>_ÖºáÔ»2šãYÕº¡>·Uë†zD«ZgliUëŒÍ1­jÝPjUëŒÍQ­jñlæ›Íi­j±9¯U­36'¶ªuÃÓnYÕº¡>·UëŒQë†Ã/µÎµnxÙ¶UëŒQë†Í|Që†SïJÖ:cÔº¡Ï—µÎµN¸j}ÿ÷ß»×—2Z|'ÿk«ÖÁ¶üdC‹6°ú>F‹5°ªu°ªu´¨u°ªu°ªu4߬¾ÀF³YÕ:X} éf«ÖÁ6ßlÕ:Øî›­ZGvV­ƒÕWšn¶jmÚ}XµVŸþh¾Y}öÿk«ÖÑ.»æªu°Ý7[µvøf«ÖÁªÖѦý|«ÖÁªÖцý|Z'¬Zg¼ì±xÔ:aÕ:ãé—­ZgÔíµNxúzZ'¬Z'Ý|U뀫Ö§n»jp÷o¶G­þÝö¨uÆK·]µNXµÎ¨_pZglækÎZgÔo¹G­nþ=÷¨uÂætð¨u—?·ZgÔçöQë„U댧_¶jqÚ¶Z\µÎ8ô²«Ö ÷f¾Uë„G3ߪuFŸoÕ:ãÔ»2šãÙ£Öõ¹}Ô:£ÑµNØÒµNØÓµÎ¨µG­6GµG­žÍ|³9­=j°9¯=j°9±=jñ´[ö¨uF}nµNXµÎ8ü²Uë„U댗mû¨uªuÆf¾ªuÆ©weÕ:aÕ:£Ï·j°jý_ÌZ?¿à¿,¾”žßÉdYëhÛýÉ&öý`C‹ïc±ïÇZÔ:ZԺطÖÑ¢ÖÑ¢ÖÅ|³ø:@ÍfQëhñ] ¦›e­£m¾YÖ:Úî›e­‹ »Yëhñ ¦›e­‹M»Yëhñé/æ›Åg?YÖºØe×ÌZGÛ}³¬u´Ã7ËZG‹Z›öóe­£E­‹ ûùªÖ£Ö /{,ªÖ£Ö O¿lÔº¡nWµÎxúzUëŒQ댣›/j1kÝpê¶Y댻³U­3þÝVµnxé¶YëŒQë†úWµnØÌל ªÖ õ[®jqó﹪uÆætPµÎøòç¶jÝPŸÛªuƨuÃÓ/µn8mÛªuĬuá—ÍZgÜ›ù²Öf¾¬uCŸ/kÝpê]Íñ¬jÝPŸÛªuC=¢U­36‡´ªuÆæ˜Vµn¨µªuÆæ¨VµÎx6óÍæ´VµÎ؜תÖ›[Õºái·¬jÝPŸÛªuƨuÃá—ZgŒZ7¼lÛªuƨuÃf¾¨uéw%k1jÝÐçËZgŒZ'ÌZxY|)‹}¿“ɲÖѶû“MìûÁ†ßÇbß5´¨u´¨u±o­£E­£E­‹ùfñu€6šÍ¢ÖÑâ»@L7ËZGÛ|³¬u´Ý7ËZv²ÖÑâ+@L7ËZ›v²ÖÑâÓ_Ì7‹Ï~²¬u±Ë®™µŽ¶ûfYëh‡o¶ýÄ/FÜâž6÷¶Å/6œ6ø¶Å/fŒ_ l8lóm{ÝçVÆ8ö^6û¶Å±Ÿñêæ‹c?cû ›ùâØ¸ÿ4óíqìgÜšù®æ~»šOøíj>â?¨ŸñÛõö/Æíj>å?¨óÛÕ|ÎoWóAÿAýÔÚ®æ£þƒ>ßh>ì·Ñ|ÚP?º¶Ñ|ÞoãhæÍ'þ6šüm4Ÿùûqús»×}n5Ôçv?â3ÎûÜjxÙ¶û+~10ãvû O¿lû §_6ŽýŒ¯f¾WûßÍ|¿ÖÍ/Ç~Æ«›/Žý†:ßñÓ|é~PŸÛã§ùÚ=~šïÝêïñÓ|ó~P+ÇOüÆ·X>8ü²§YŽŸ«›ïòCËñ3ºùâ±ú|[ü)éwå÷„áómñ×XƒDŸÛã·:Ýö7;ô¹ýàé—=ï\5œ~Ùø›,ŒãÎUá۞ñ7Y¯ø›,†—nû >ß“ÅÐç»âo²ú|WüMÆø›,†:ßjöÏÓû—U³£ÅÁä_[Ͷå±-š¬š-Î$`u¢«ZœçÀªÙÁê4‡æ›ÕYl4›ÕI¬rhºÙjv°Í7[Ͷûf«Ùц݇Õì`u~CÓÍV³£M»«ÙÁªÙÑ|³jöm5;Úe×\Ͷûf«ÙÁßìÑ쀫ÙO›ûÑìŒÓ4;a5;ã°ÍÍNXÍÎxÙìf'¼ºùªÙ «Ù›ùªÙW³3½ìjvÀ«ù€4;aóÿhv·1>šQ?æÍNØ|Ð?š°ù¨4;àh>ìÍΨ]f'<šùFó‰ÿhvÂæ3ÿÑì„ÕìŒúÜ>š°šñ²mÍN¸e³3ž~ÙjvÆé—­f'|5ó­f'|7ó­fg¼ô®¬f'¬fgÔùÍΨÏí£Ù ›ïÝG³6ß¼f'¬f'|ûåÑì„§YÍΨ‡–G³V³3ú|«Ù§Þ•Õì„Õ쀫٠«Ù ßþÜ>š°šqúe«Ù «Ù‡n»šp5;ã¥Û®f'¬fgôùV³3ú|«Ù «Ùu¾lö×÷¿¼ú—E³‹}&dÙìhÛ},û6;Z4»Ø÷L‚':´8Љ}ÏshÑìhqšóÍâ,‡6šÍâ$‡91Ý,›móͲÙÑvß,›]lØ}ÈfG‹ó›˜n–Í.6í>d³£E³‹ùfÑìdÙìb—]3›m÷ͲÙÑ߬š1›Ý𴹫٠§ ^ÍÎÍn8lójvÆhvÃËf¯fg¼ºù¢Ù£Ù ›ù¢Ù³Ù ‡^6›ñj>à«Ù›øjvÆ·1V³êÇ|5;cóA_ÍÎØ|ÔW³#ŽæÃ¾šÝP?ºªÙf¾Ñ|âW³36ŸùÕìŒÑì†úÜV³3F³^¶m5;ãv7»áé—f7œ~ÙhvÆW3_6;ã»™/›ÝðÒ»’ÍÎÍn¨óU³ês[ÍÎØ|ïV³36ß¼ÕìŒÑìŒo?°T³3ž~d©f7ÔCK5;c4»¡Ï—Ín8õ®d³3F³#f³3F³3¾ý¹­fgŒf7œ~ÙhvÆhváÛf³#f³^ºm6;c4»¡Ï—Ínèóe³3F³ê|«ÙþýwðÕìhq0ù×V³ƒmy,A‹f«fG‹3 XèÀê@‡ç9°jv°:Í¡ùfu–Ífu’«ƒšn¶šlóÍV³ƒí¾Ùjv´a÷a5;XßÐt³ÕìhÓîÃjv°jv4߬šý_[ÍŽvÙ5W³ƒí¾Ùjv°Ã7{4;àjvÆÓæ~4;ã´ÁÍNXÍÎ8lóG³V³3^6û£Ù ¯n¾jvÂjvÆf¾jvÀÕìŒC/»šðj>àÍNØ|Ä?šðí_ŒfgÔùG³6ôf'l>êÍ8šûG³3êG×£Ù f¾Ñ|â?š°ùÌ4;a5;£>·f'¬fg¼lÛG³nÙ쌧_¶šqúe«Ù _Í|¯jvÂw3ßjvÆKïÊjvÂjvFïÑìŒúÜ>š°ùÞ}4;aóÍûhvÂjv·XÍNxú‘åÑìŒzhy4;a5;£Ï·šqê]YÍNX͸š°šðíÏí£Ù «Ù§_¶š°šqè¶«ÙW³3^ºíjvÂjvFŸo5;£Ï·š°šQçËf?þ¼ö,š]ì{0!ËfGÛîc‰Ø·ÙÑ¢Ùžg´8Ñ¡ÅNì{žC‹fG‹Óœ˜og9´Ñl'9´8ȉéfÙìh›o–ÍŽ¶ûfÙìbÃîC6;ZœßÄt³lv±i÷!›-š]Ì7‹f'Ëf»ìšÙìh»o–ÍŽvøfÕìˆÙ솧Í]Ín8mðjvÆhvÃa›W³3F³^6{5;ãÕÍÍÎÍnØÌÍŽ˜Ín8ô²ÙìˆWó_ÍÎØ|ÄW³3¾ý‹±šÝP?æ«Ù›újvÆæ£¾šq4öÕì†úÑUÍÎx4óæ¿š±ù̯fgŒf7Ôç¶š1šÝð²m«Ù·»Ù O¿l4»áôËF³3¾šù²ÙßÍ|Ù솗ޕlvÆhvC¯šÝPŸÛjvÆæ{·š±ùæ­fgŒfg|û¥šñô#K5»¡ZªÙ£Ù }¾lvéw%›1š1›1šñíÏm5;c4»áôËF³3F³Ý6›1›ÝðÒm³Ù£Ù }¾lvCŸ/›1šÝPçËfß¿¿õø/‹fûLȲÙѶûX"ömv´hv±ï™-Nthq ûžçТÙÑâ4'æ›ÅYm4›ÅI-rbºY6;Úæ›e³£í¾Y6»Ø°ûÍŽç71Ý,›]lÚ}ÈfG‹fóÍ¢ÙɲÙÅ.»f6;Úî›e³£¾Ù¶ï÷¹Õð²ŸbÛ;W_÷¹Õð´dÛß÷¹ÕpúÇ~Æ8ö{¶=ŽýŒ³›oÞßÿˆGû·f¾#ŽýŒ{3ßÇ~Æ8ö3¾šùFóÂn£yc?¨¯ì6šwvÍKûA}k·Ñ¼¶ÛlÞÛê‡Ý6›7w›Í«ûA}w·Ù½¼¿8ý²qìg|7óÍ8ö3žÝ|¿Ç~¿ìåŸ{û+~m°¡>·ûûç>·2Ư 6¶íþŽ_Ì¿6ØðòËÆ±Ÿ1Žý†§m»¿Ïf¾wû¯n¾ÑÍÇ~ÆÙÌwƱßÐçû=ƒvÙOŒés{lÇý'G_þÜ~PŸÛc{Oí‚竆§_6þZ‹áôËÆßkaœw®ÝvÿiæÛã/¶^zW~O>ß±ÅÐçÛã/¶ú|¿‡È—ãåÏí/½e¿çHn’?ºí/žºíˆ¿Øb8õ²#þb ãîeùÁ¡Ûþž5}¾ñºÿb‹¡Ï÷{ÂмSþ²jv´èÏm5;Ø–ý‰ÍVÍŽý VÍVÍŽÍVÍVÍŽæ›U³ƒf³jv°jv4Ýl5;Øæ›­fÛ}³ÕìhÃîÃjv°jv4Ýl5;Ú´û°š¬Žÿh¾YþÿµÕìh—]s5;Øî›­f;|³G³3^öS<š°šñ´äÑìŒÓ”jvÂjvÆaOÀ£Ù g7_5;àjv­™o5;áÞÌ·š°šðÕÌ7šöÑìŒúÊ>š°yiÍNؼ¶fgÔ»G³6¯î£Ù »—w5;a5;á»™o5;áÙÍWÍΨŸ{fgÔçöÑì„ÕìŒÃ¶}4;a5;ãå—­f'¬fgßjvFŸo5;áåÏí£Ù GóÜ®fgd³£E³‹éfÙìbÓîC6;ZÿÅ|³8ü“e³‹]vÍlv´Ý7ËfG;|³jvÃË~ŠjvÆhvÃÓ~jvÃé?J4;c4»á°' šqvóE³#f³3nÍ|ÙìŒ{3_6;c4;ã«™o4/l5»¡¾²ÕìŒÍK[ÍÎØ¼¶Õì†úaWÍÎØ¼ºÕìŒÝË›ÍÎÍÎønæËfg<»ù¢Ù õs¯šÝPŸÛjvÆhvÃaÛV³3F³^~ÙhvÆhvÃÓ¶­f7œ~Ù«›otóE³3Îf¾lvCŸ/›°š1šñåÏm5;c4;c4»áé—f7œ~ÙhvÆhváÛf³3F³^zW²Ù£Ù }¾lvCŸ/›ñòç¶šq4Ïm6»á©Ûf³N½l6;ãîeYÍÎx4óe³ú|ÙìŒÑì†Í|Ñì†Í|]—‡ý|?þ²hv±o’e³£mwŠ}›-š]ìÛŸhÑìhÑìbßfG‹fG‹fóÍ¢ÙÑF³Y4;Z4»˜n–ÍŽ¶ùfÙìh»o–Í.6ì>d³£E³‹éfÙìbÓîC6;ZÿÅ|³8ü“e³‹]vÍlv´Ý7ËfG;|³jvÃË~ŠjvÆhvÃÓ~jvÃé?J4;c4»á°' šqvóE³#f³3nÍ|ÙìŒ{3_6;c4;ã«™o4/l5»¡¾²ÕìŒÍK[ÍÎØ¼¶Õì†úaWÍÎØ¼ºÕìŒÝË›ÍÎÍÎønæËfg<»ù¢Ù õs¯šÝPŸÛjvÆhvÃaÛV³3F³^~ÙhvÆhvÃÓ¶­f7œ~Ù«›otóE³3Îf¾lvCŸ/›°š1šñåÏm5;c4;c4»áé—f7œ~ÙhvÆhváÛf³3F³^zW²Ù£Ù }¾lvCŸ/›ñòç¶šq4Ïm6»á©Ûf³N½l6;ãîeYÍÎx4óe³ú|ÙìŒÑì†Í|Ñì†Í|]——}Þµ¿¬š-úó_[Ͷe¢E³ƒU³£E‚U³ƒU³£E³ƒU³ƒU³£ùfÕì`£Ù¬š¬šM7[Ͷùf«ÙÁvßl5;Ú°û°š¬šM7[ÍŽ6í>¬f«ã?šoV‡ÿm5;Úe×\Ͷûf«ÙÁßìÑ쌗ýf'¬fg<íy4;ãô¥š°šqØðhvÂÙÍW͸špkæ[ÍN¸7ó­f'¬f'|5óæ…}4;£¾²f'l^ÚG³6¯í£ÙõÃîÑì„Í«ûhvÂîå]ÍNXÍNønæ[ÍNxvóU³3êçÞ£Ùõ¹}4;a5;ã°mÍNXÍÎxùe«Ù «ÙOÛöÑìŒÓ/{uón¾jvÂÙÌ·šÑç[Íþ/>š°šðåÏí£Ù «Ù «ÙO¿l5;ãôËV³V³3Ýv5;a5;ã¥we5;a5;£Ï·šÑç[ÍNxùsûhvÂÑ<·«ÙOÝv5;ãÔË®f'ܽ,ÍNx4ó­fgôùV³V³36óU³36óu]~Û1¿ß¿ÙÝìfŸþD‹fgÛ¾ýiöiv¶»ÙÍ>ýÉv7;ÛÝìfŸfg»›ínv3ßìnv¶Ñlv7;ÛÝìfºY4;Ûæ›E³³í¾Y4»Ù°ûÍÎv7»™nÍn6í>D³³ÝÇ3ßì>ü£E³›]vÍhv¶Ý7‹fg;|³OŒ Çû× Þ¿6Xñ²M·ãúž[ï_¬xÚ¬ŸºÛ®Ÿ:mØÏGï[/ûºýŠ>ßë>ö Í|¯ûØ/øjæ{½¿ßÿŠ§Þ•×ÙÌ÷ºýŒsøC»Íû×+êc»ÿÜ¿6XqÚ¶ûÏö=· Þ¿6XqضûÏ}ì¼ýŠ—_ö>ö ž>ßO»eûÏÕÍwûG7ßìæ»ýŒÛO3ß¹ûsûA}n÷óþµÁŠúÜîçýkƒï_¬8tÛó>ö ÞÇ~ÅË/{ûç÷(žzË®Ÿf¾ë>ö nÍ|×î‡Ó½+×ÑÌwÝÇ~ÄcÿäˆàïÇ›mûA}nýúó¶m}|sUñòËÞ±…ñøùæªâiÛÇý[§_voæ;î¿Ø¢8ì–¿' Ÿï¸ÿb‹¢ÏwܱEðþ‹-Š>ßh¢êƒZÇl²ê˜[óÜÎ&¬ŽÙ”Õ5ŽÙ´Õ1_ß\UÔº:æÛ“ô˜M_}°™¯)¬c6‰õÁf¾&²>¨ó½~šÌzý4•Í>¾'”¿,/±ïd³£E³‹ùfÑìdÙìb—]3›m÷ͲÙÑ߬š1š1šÝð²M«Ù£Ù O›µšÝpÚ°ÕìŒÑì†>_6;ãÑÌ—ÍÎøjæËf7<õ®d³N½+ÙìŒÑì†úØV³NÛ¶š1šÝpضÕìŒÑ솗_6šñôùªÙ¯n¾hvÆÑÍ7»ù¢Ù³Ù³Ù õ¹­f7Ôç¶š1šÝpè¶ÙìŒÑ솗_6š1šÝðÔ[–Ín8õ®d³3î~8­fg<šù²Ù «Ù£Ù õ¹­fgŒf7¼ü²ÑìˆÙ솧m[Ín8ý²{3_6»á°[VÍÎÍnèóe³3F³ú|£‰ªjvÄÙdU5»¡†U5»¡fB5;c4»¡ÖU5;cÓWÕìŒMaU³6ó5‘UÍNXÍÎØtÖjöÏ÷ï_VZÌó¯­fÛr´Ø¬ž,´X¬ž+°jv´xªÀªÙÁê™BóÍê‰ÍfÕì`õ8¡éf«ÙÁ6ßl5;Øî›­fGvV³ƒU³£éf«ÙѦ݇Õì`Õìh¾Y5û¿¶ší²k®fÛ}³Õì`‡oöhvÂjvÂjvÆË6}4;a5;ãi³>šqÚ°f'¬fgôùV³Í|«Ù _Í|«ÙO½+«Ù§Þ•Õì„ÕìŒúØ>šqÚ¶f'¬fg¶í£Ù «Ù/¿l5;áéó=šðêæ«f'Ý|³›¯šp5;àjvF}nÍΨÏí£Ù «Ù‡n»š°šñòËV³V³3žzËV³3N½+«Ù w?œ>šðhæ[Íþ/>š°šQŸÛG³V³3^~ÙjvÀÕ쌧mûhvÆé—Ý›ùV³3»ef'¬fgôùV³V³3ú|£‰ªG³Î&«ÍΨaõhvFÍ„G³V³3j]=š°é«G³6…õhvÆf¾&²Íþ/>š°é¬löë{¶ùËâñûÎC–ÍŽ¶Ýãˆ}·A‹'Kì» Zd³£E³‹éfÙìbÓîC6;Z4»˜oÍN–Í.vÙ5³ÙÑvß,›íðͪ٣٣٠/Û´š1šÝð´Y«Ù § [ÍÎÍnèóe³3Í|Ù쌯f¾lvÃSïJ6»áÔ»’ÍÎÍn¨m5»á´m«Ù£Ù ‡m[ÍÎÍnxùe£ÙOŸ¯šñêæ‹fgÝ|³›/š1›1›ÝPŸÛjvC}n«Ù£Ù ‡n›ÍÎÍnxùe£Ù£Ù O½eÙì†SïJ6;ãî‡ÓjvÆ£™/›°š1šÝPŸÛjvÆhvÃË/ÍŽ˜ÍnxÚ¶Õì†Ó/»7óe³»eÕìŒÑì†>_6;c4»¡Ï7š¨ªfGœMVU³jXU³j&T³3F³j]U³36}UÍÎØV5»a3_YÕì„ÕìŒMg­fÿ|sÿeõx¡Å<ÿÚjv°-ÇA‹mÀêÉB‹eÀ깫fG‹§ ¬š¬ž)4߬ž(°ÑlVÍVšn¶šlóÍV³ƒí¾Ùjv´a÷a5;X5;šn¶šmÚ}XÍVÍŽæ›U³ÿk«ÙÑ.»æjv°Ý7[Ívøff'¬f'¬fg¼lÓÏ?=ü²Õ쌧ÍúhvÆiÃ>š°šÑç[ÍNx4ó­f'|5ó­fg<õ®¬fgœzWV³V³3êcûhvÆiÛ>š°šqضf'¬fg¼ü²Õì„§Ï÷hv«›¯šptóÍn¾jvÀÕ쀫Ùõ¹}4;£>·f'¬fgºíjvÂjvÆË/[ÍNXÍÎxê-[ÍÎ8õ®¬f'Üýpúhv£™o5û¿øhvÂjvF}nÍNXÍÎxùe«ÙW³3ž¶í£Ù§_voæ[ÍÎ8ì–=š°šÑç[ÍNXÍÎèó&ªÍ8›¬z4;£†Õ£Ù5ÍNXÍΨuõhv¦¯ÍNØÖ£Ù›ùšÈz4û¿øhv¦³²ÙÏï©è/‹ÇKì;Y6;Úv#öÝ-ž,±ï2hñ\¡E³‹}Ÿ*´hv´x¦Ä|³x¢ÐF³Y4;ZG‹>ÓͲÏÑ6ß,ûm÷ͲÏņ݇ìs´ès1Ý,û\lÚ}È>G‹>óÍ¢ÏɲÏÅ.»fö9Úî›eŸ£¾Yö9Zô9ÚÛ7Ë>G;›Í¢ÏÅ|³ès´ès1Ý,û\L7Ë>G‹>ÓͲÏÑ^¾Yö9ÚÛ7Ë>'«>gŒ>76iõ9bö¹áe«VŸ3FŸž~ÙèsÃiÓVŸ3¾›ù²Ï£Ï¯n¾èsÆÑÍ}n¨óUŸêS[}Îxøs[}Î}n8mÛêsÆèsÃaÛVŸ3Žn¾èsÆÙÌ—}nxê]É>7œzW²Ï£Ï³Ïß~­>7Ôóhõ¹áÔm¯æ_}n¨‡ÒêsÆíîsC=ËWŸêÉ´úœ±9ÏWŸ3¾›ùFs¤¯>'¬>7Ôç¶ú1ûÜpèe³Ï£Ï /Û¶úœ1úÜð´m«Ï §Ý²êsÆèsÃf¾èsÆèsCŸ/ûœpõùçö—Õ{Ïå¿¶úlËÖD‹w¬^i´x£Áê…«÷-^g°ês°z™Ñ|³ês°ÑlV}V}ަ›­>Û|³Õç`»o¶úmØ}X}V}ަ›­>G›vVŸƒUŸ£ùfÕçÿÚês´Ë®¹úl÷ÍVŸƒ¾Ùês°ês°·o¶úìl6«>GóͪÏÁªÏÑt³ÕçhºÙês°ês4Ýlõ9ØË7[}ööÍVŸÿk>'¬>g6é£ÏWŸ3^¶ê£Ï «ÏO¿lõ9ã´i}Nønæ[}NX}NxuóUŸŽn¾êsFïÑçŒúÔ>úœððçöÑç„ÕçŒÓ¶}ô9aõ9ã°m}N8ºùªÏ g3ßêsÆSïÊêsÆ©weõ9aõ9àês·ŸF}ΨçÑGŸ3NÝöjŽñ>gÔCé£Ï ·ìsF=Ë?úœQO¦>'lÎó>'|7óæHÿèóñÑçŒúÜ>úpõ9ãÐË®>'¬>g¼lÛGŸVŸ3ž¶í£Ï§Ý²GŸVŸ36óUŸVŸ3ú|«ÏÿÅìó×÷Xû—Å{-ö}.ɲÏѶ»5žï4Z¼Òbß7-^h´xŸÅ¾¯3Zô9Z¼Ìb¾Yô9Úh6‹>G‹>ÓͲÏÑ6ß,ûm÷ͲÏņ݇ìs´ès1Ý,û\lÚ}È>G‹>óÍ¢ÏɲÏÅ.»fö9Úî›eŸ£¾Yö9Zô9ÚÛ7Ë>G;›Í¢ÏÅ|³ès´ès1Ý,û\L7Ë>G‹>ÓͲÏÑ^¾Yö9ÚÛ7Ë>'«>gŒ>76iõ9bö¹áe«VŸ3FŸž~ÙèsÃiÓVŸ3¾›ù²Ï£Ï¯n¾èsÆÑÍ}n¨óUŸêS[}Îxøs[}Î}n8mÛêsÆèsÃaÛVŸ3Žn¾èsÆÙÌ—}nxê]É>7œzW²Ï£Ï³Ïß~­>7Ôóhõ¹áÔm¯æ_}n¨‡ÒêsÆíîsC=ËWŸêÉ´úœ±9ÏWŸ3¾›ùFs¤¯>'¬>7Ôç¶ú1ûÜpèe³Ï£Ï /Û¶úœ1úÜð´m«Ï §Ý²êsÆèsÃf¾èsÆèsCŸ/ûœ0ûüøßþ²x¯Å¾Ï%Yö9Úv·¦Ø÷F‹WZìûF£Å ï³Ø÷uF‹>G‹—YÌ7‹>GÍfÑçhÑçbºYö9Úæ›eŸ£í¾Yö¹Ø°û}Ž}.¦›eŸ‹M»ÙçhÑçb¾Yô9Yö¹Øe×Ì>GÛ}³ìs´Ã7Ë>G‹>G{ûfÙçhg³Yô¹˜o}Ž}.¦›eŸ‹éfÙçhÑçbºYö9ÚË7Ë>G{ûfÙçdÕçŒÑç†Ã&­>GÌ>7¼lÕêsÆèsÃÓ/}n8mÚêsÆw3_ö9cô9ãÕÍ}Î8ºù¢Ï u¾êsC}j«Ïn«Ï£Ï §m[}Î}n8lÛêsÆÑÍ}Î8›ù²Ï O½+Ùç†SïJö9cô9bö9ãÛO£Õç†z­>7œºíÕã«Ï õPZ}θÝ}n¨gùêsC=™VŸ36çùêsÆw3ßhŽôÕç„Õç†úÜVŸ#fŸ½lö9cô¹áeÛVŸ3FŸž¶mõ¹á´[V}Î}nØÌ}Î}nèóeŸ®>ßÿýwëõ^£Åsù¯­>Û²5Ñâ«W-Þh°z¡Áê}F‹×¬ú¬^f4߬úl4›UŸƒUŸ£éf«ÏÁ6ßlõ9Øî›­>GvVŸƒUŸ£éf«ÏѦ݇Õç`Õçh¾Yõù¿¶úí²k®>Û}³Õç`‡o6Ï<¶‚]Ù¨hÓ~¾9²QÁfYцý|ÛÏOF*aø/{,¶Ÿ:ðÖŸñôËÖŸQ·Û~êÀOxúz~Ù:ðŽn¾:ðž?ªŒS·=· UÂÝ¿Ù>8tÛßïýnÛÎWžX/Ýö|û×ÛvÖŸQ¿à¶³üŒÍ|͹`;›ƒÁõ[n»š£Áöûý¡ßsÔÃÁv5§ƒO†és»ï/n÷ý'VF}n÷ýÌ+á•¡ÊxúeëÀÏ8mÛ}¯?àQ~Æ¡—=êÀO¸7óuà'<šùŽ:ð3ú|Çï[æ—­?àhŽgûhÎgÔçvÍ íƒzDÛgsFÛgsHû ž8öÙÓöyøÙöƒzPÛgsRÛgsTû žÕößÃ…Ï7›ÓÚ>›ãÚ>›óÚ›ùšÛñÞü¹ýài·ìxïþÜ~PŸÛã}üyÛ¶Çû•¡Ê8ü²ï UÂ3C•ñ²m÷•¡J‹Ç°™/þáÔ»ò{ÂðùÎø[<†>ß¹ç¿, Œ¿ÅC˜µ¾ÿÅÖ__Êbßïd²¬u´íþdû~°¡Å÷±Ø÷c -j-j]ì[ëhQëhQëb¾Y| f³¨u´ø.ÓͲÖÑ6ß,km÷ͲÖņ݇¬u´ø ÓͲÖŦ݇¬u´øôóÍⳟ,k]ì²kf­£í¾YÖ:Úá›e­£E­‹Mûù²ÖÑ¢Öņý|UëŒQ놗=UëŒQ놧_6jÝP·«Zg<}½ªuƨuÆÑÍµŽ˜µn8uÛ¬uÆÝ¿ÙªÖÿn«Z7¼tÛ¬uƨuCý‚«Z7lækÎUë†ú-WµÎ¸ù÷\Õ:cs:¨Zg|ùs[µn¨ÏmÕ:cÔºáé—Z7œ¶mÕ:bÖºáÐËf­3îÍ|YëŒG3_Öº¡Ï—µn8õ®ŒæxVµn¨ÏmÕº¡ѪÖ›CZÕ:csL«Z7ÔƒZÕ:csT«Zg<›ùfsZ«ZglÎkUëŒÍ‰­jÝð´[Vµn¨ÏmÕ:cÔºáðËF­3F­^¶mÕ:cÔºa3_ÔºáÔ»’µÎµnèóe­3F­f­oßGû/‹/e±ïw2YÖ:Úv²‰}?ØÐâûXìû±†µŽµ.ö­u´¨u´¨u1ß,¾ÐF³YÔ:Z|ˆéfYëh›o–µŽ¶ûfYëbÃîCÖ:Z|ˆéfYëbÓîCÖ:Z|ú‹ùfñÙO–µ.vÙ5³ÖÑvß,kíðͲÖÑ¢ÖŦý|YëhQëbÃ~¾ªuƨuÃË‹ªuƨuÃÓ/µn¨ÛU­3ž¾^Õ:cÔ:ãèæ‹ZGÌZ7œºmÖ:ãîßlU댇·U­^ºmÖ:cÔº¡~ÁU­6ó5炪uCý–«ZgÜü{®j±9T­3¾ü¹­Z7Ôç¶j1jÝðôËF­NÛ¶j1kÝpèe³Ö÷f¾¬uÆ£™/kÝÐçËZ7œzWFs<«Z7Ôç¶jÝPhUëŒÍ!­j±9¦U­êA­j±9ªU­3žÍ|³9­U­36絪uÆæÄVµnxÚ-«Z7Ôç¶j1jÝpøe£Ö£Ö /Û¶j1jݰ™/jÝpê]ÉZgŒZ7ôù²Ö£Ö W­ÜY})£Åwò¿¶jlËO6´ø`«ïc´øX«Z«ZG‹Z«Z«ZGóÍêël4›U­ƒÕwšn¶jlóÍV­ƒí¾Ùªu´a÷aÕ:X} éf«ÖѦ݇Uë`õéæ›Õgÿ¿¶jí²k®ZÛ}³Uë`‡o¶j¬jmÚÏ·j¬jmØÏ÷¨uªuÆË‹G­V­3ž~ÙªuFÝîQë„§¯÷¨uªuÂÑÍWµ¸jqê¶«Ö wÿf{Ô:ááßmZg¼tÛUë„UëŒú÷¨uÆf¾æ\ð¨uFý–{Ô:áæßsZ'lNZ'|ùsû¨uF}nµNXµÎxúe«Ö§mû¨uÀUëŒC/{T­îÍ|«Ö f¾UëŒ>ߪuÆ©we4dzG­3êsû¨uF=¢=j°9¤=j°9¦=jQjZ'lŽjZ'<›ùfsZ{Ô:as^{Ô:asb{Ô:ãi·ìQëŒúÜ>j°jqøe«Ö «Ö/ÛöQë„UëŒÍ|UëŒSïʪuªuFŸoÕ:aÕú¿˜µþó=Œÿeñ¥,öýN&ËZGÛîO6±ïZ|‹}?ÖТÖÑ¢ÖžµŽµŽµ.æ›Å×Úh6‹ZG‹ï1Ý,kmóͲÖÑvß,k]lØ}ÈZG‹¯1Ý,k]lÚ}ÈZG‹O1ß,>ûɲÖÅ.»fÖ:Úî›e­£¾YÖ:ZԺشŸ/k-j]lØÏWµÎµnxÙcQµÎµnxúe£Ö u»ªuÆÓ׫ZgŒZgÝ|QëˆYë†S·ÍZgÜý›­jñðﶪuÃK·ÍZgŒZ7Ô/¸ªuÃf¾æ\Pµn¨ßrU댛ÏU­36§ƒªuÆ—?·Uë†úÜV­3F­ž~Ù¨uÃiÛV­#f­½lÖ:ãÞÌ—µÎx4óe­ú|Yë†SïÊhŽgUë†úÜV­ê­j±9¤U­36Ç´ªuC=¨U­36GµªuƳ™o6§µªuÆæ¼VµÎØœØªÖ O»eUë†úÜV­3F­¿lÔ:cÔºáeÛV­3F­6óE­N½+YëŒQë†>_Ö:cÔ:áªõÏó—Õ—2Z|'ÿk«ÖÁ¶üdC‹6°ú>F‹5°ªu°ªu´¨u°ªu°ªu4߬¾ÀF³YÕ:X} éf«ÖÁ6ßlÕ:Øî›­ZGvV­ƒÕWšn¶jmÚ}XµVŸþh¾Y}öÿk«ÖÑ.»æªu°Ý7[µvøfÛÏÌ\Ü~òÜÊxÚÜÛ¶e®2N|ÛöÌUÂ#Ï­ŒÃ6ß¶Wž[ ëØÏxÙìÛVÇ~«›¯Žý„uìglæ«c?àþÓÌ·×±Ÿpk滚øíj>á·«ùˆÿ ~Æo×Û¿·«ù”ÿ ~ÌoWó9¿]ÍýõSk»šúú|£ù°ßFóiÿAýèÚFóy¿£™o4ŸøÛh>ò·Ñ|æïÇéÏí~\yneÔçv?Fž[ gž[/Ûvý乕pËc?ãé—­c?ãôËÖ±ŸðÕÌ÷ªc?á»™ïu湕ñÒ»òººùêØÏ¨ó?Í—îõ¹=~š¯Ýã§ùÞý ~ñ?Í7ïõ¸rüÄ_`a|ûåƒÃ/{ú‘åø¹ºù.?´?£›/þ‹¡Ï·ýä¿.`œzW~O>ßñ7Hô¹=~«ãÐm³CŸÛž~Ù3s•qúeão²0ŽÌUơ۞3sðŠ¿Ébxé¶¿âó]ñ7Y }¾ßÆî—=šù®Wþ+Âø›,†:_4û>¿/Å_v7»Ùç`‚Íζ}%fŸfg»›Ýìs&a»Otl÷Îìsžc»›í>Í™ùf÷YŽm4›Ý'9¶û g¦›E³³m¾Y4;Ûî›E³› »Ñìl÷ùÍL7‹f7›v¢ÙÙîf7óÍîfG‹f7»ìšÑìl»oÍÎvøfÙìŒÑ슧ÍÍ®8mðlvÁ»Ù‡mžÍ.x7»âe³g³ ^Ý|w³ ÞÍ®ØÌw7;c4»âÐËF³3^Í|6»`óŸÍ.øö/ÆlvEý˜Ïfl>è³Ù›úlvÆÑ|Øg³+êGW6»àÑÌ7šOülvÁæ3?›]ðnvE}n³ÙïfW¼lÛlvÁíÛ슧_önvÅé—½›]ðÕÌÍ.ønæ‹fW¼ô®D³ ÞÍ®¨óe³+ês›Í.Ø|ïf³ 6ß¼Ùì‚w³ ¾ýÀ’Í.xú‘%›]Q-Ùì‚w³+ú|ÑìŠSïJ4»àÝìŒÑì‚w³ ¾ý¹Íf¼›]qúeïf¼›]qè¶ÑìŒÑ슗nÍ.x7»¢ÏÍ®èóE³ ÞÍ®¨óe³ïÎ_Í.ö=˜e³£m÷±DìÛìhÑìbß3 ZœèÐâ@'ö=Ï¡E³£ÅiNÌ7‹³Úh6‹“ZäÄt³lv´Í7ËfGÛ}³lv±a÷!›-ÎobºY6»Ø´ûÍŽÍ.æ›E³“e³‹]vÍlv´Ý7ËfG;|³jvÄlvÃÓæ®f7œ6x5;c4»á°Í«Ù£Ù /›½šñêæ‹fgŒf7læ‹fGÌf7zÙlvÄ«ù€¯fgl>â«ÙßþÅXÍn¨óÕìŒÍ}5;cóQ_ÍŽ8šûjvCýèªfg<šùFó‰_ÍÎØ|æW³3F³ês[ÍÎÍnxÙ¶ÕìŒÛÝ솧_6šÝpúe£Ù_Í|ÙìŒïf¾lvÃKïJ6;c4»¡ÎWÍn¨Ïm5;có½[ÍÎØ|óV³3F³3¾ýÀRÍÎxú‘¥šÝP-ÕìŒÑì†>_6»áÔ»’ÍÎÍŽ˜ÍÎÍÎøöç¶š1šÝpúe£Ù£Ù ‡n›ÍŽ˜Ínxé¶ÙìŒÑì†>_6»¡Ï—ÍÎÍn¨ó­fÿ¼NY5;ZLþµÕì`[KТÙÁªÙÑâLV':°:СÅy¬š¬Nsh¾YåÀF³YäÀê ‡¦›­fÛ|³Õì`»o¶šmØ}XÍVç74Ýl5;Ú´û°š¬šÍ7«fÿ×V³£]vÍÕì`»o¶šìðÍ͸šñ´¹ÍÎ8mðG³V³3ÛüÑì„Õ쌗Íþhv«›¯š°š±™¯šp5;ãÐË®f¼šøG³6ñf'|ûã£ÙõcþÑì„Íý£Ù ›úG³ŽæÃþÑìŒúÑõhv£™o4Ÿøf'l>óÍNXÍΨÏí£Ù «Ù/ÛöÑì„[6;ãé—­fgœ~ÙjvÂW3ßjvÂw3ßjvÆKïÊjvÂjvFïÑìŒúÜ>š°ùÞ}4;aóÍûhvÂjv·XÍNxú‘åÑìŒzhy4;a5;£Ï·šqê]YÍNX͸š°šðíÏí£Ù «Ù§_¶š°šqè¶«ÙW³3^ºíjvÂjvFŸo5;£Ï·š°šQçËf¿¾ïÚ_Í.ö=˜e³£m÷±DìÛìhÑìbß3 ZœèÐâ@'ö=Ï¡E³£ÅiNÌ7‹³Úh6‹“ZäÄt³lv´Í7ËfGÛ}³lv±a÷!›-ÎobºY6»Ø´ûÍŽÍ.æ›E³“e³‹]vÍlv´Ý7ËfG;|³jvÄlvÃÓæ®f7œ6x5;c4»á°Í«Ù£Ù /›½šñêæ‹fgŒf7læ‹fGÌf7zÙlvÄ«ù€¯fgl>â«ÙßþÅXÍn¨óÕìŒÍ}5;cóQ_ÍŽ8šûjvCýèªfg<šùFó‰_ÍÎØ|æW³3F³ês[ÍÎÍnxÙ¶ÕìŒÛÝ솧_6šÝpúe£Ù_Í|ÙìŒïf¾lvÃKïJ6;c4»¡ÎWÍn¨Ïm5;có½[ÍÎØ|óV³3F³3¾ýÀRÍÎxú‘¥šÝP-ÕìŒÑì†>_6»áÔ»’ÍÎÍŽ˜ÍÎÍÎøöç¶š1šÝpúe£Ù£Ù ‡n›ÍŽ˜Ínxé¶ÙìŒÑì†>_6»¡Ï—ÍÎÍn¨óe³Ÿßïß¿,š]ì{0!ËfGÛîc‰Ø·ÙÑ¢Ùžg´8Ñ¡ÅNì{žC‹fG‹Óœ˜og9´Ñl'9´8ȉéfÙìh›o–ÍŽ¶ûfÙìbÃîC6;ZœßÄt³lv±i÷!›-š]Ì7‹f'Ëf»ìšÙìh»o–ÍŽvøfÛ¾ßçVÃË~Šm¿m°àýkƒOûA¶ýþµÁŠÓ”8ö3ƱßpØðùÏR_~ÙÙÍ7ïïÄ#ŽýŒ[3ßÇ~ƽ™ïˆc?cû_Í|£ya·Ñ¼±ÔWvÍ;»æ¥ý ¾µÛh^Ûm6ïíõÃn›Í›»ÍæÕý ¾»Ûì^Þ_œ~Ù8ö3¾›ùfûÏn¾ßc¿_öòϽýuÿÚ`E}n÷÷Ï}ne¼m°â°m÷÷ýkƒï_¬xùeãØÏÇ~ÃÓ¶Ýßg3ß;ŽýŒW7ßèæ‹c?ãlæ;ãØoèóýžA»ì'Æô¹=¶ãû'G_þÜ~PŸÛc{ÿyÙ¶ÇvÞ¹jxúeï¿Ö¢8ý²÷ßkœw®ÝvÿiæÛï¿Ø¢xé]ù=aø|ûý[}¾ýþ‹-Š>ßï!òåxùsûÁKoÙï9ÒŸÛ߃änû‹§n;î¿Ø¢8õ²ãþ‹-‚»—å‡nû{ÖôùÆý[}¾ñö¼<Æý[›ùî¿Ø¢ØÌ×uyÙç+ö/«fG‹þü×V³ƒmÙŸhÑì`ÕìhÑŸ`Õì`ÕìhÑì`Õì`Õìh¾Y5;Øh6«f«fGÓÍV³ƒm¾Ùjv°Ý7[ÍŽ6ì>¬f«fGÓÍV³£M»«ÙÁêøæ›Õáÿ_[ÍŽvÙ5W³ƒí¾Ùjv°Ã7{4;ãe?Å£Ù «ÙOûAÍÎ8ýG©f'¬fgö<špvóU³®f'ÜšùV³îÍ|«Ù «Ù _Í|£yaÍΨ¯ì£Ù ›—öÑì„ÍkûhvFý°{4;aóê>š°{yW³V³¾›ùV³žÝ|ÕìŒú¹÷hvF}nÍNXÍÎ8lÛG³V³3^~ÙjvÂjvÆÓ¶}4;ãôË^Ý|£›¯šp6ó­fgôùV³ÿ‹f'¬f'|ùsûhvÂjvÂjvÆÓ/[ÍÎ8ý²Õì„ÕìŒC·]ÍNXÍÎxé]YÍNXÍÎèó­fgôùV³^þÜ>šp4ÏíjvÆS·]ÍÎ8õ²«Ù w/ËG³Í|«Ù}¾Õì„ÕìŒÍ|ÕìŒÍ|]—‡½¿Ç—¿,š]ìÛŸdÙìhÛÝŸbßfG‹fûö'Z4;Z4»Ø·ÙÑ¢ÙÑ¢ÙÅ|³hv´ÑlÍŽÍ.¦›e³£m¾Y6;Úî›e³‹ »ÙìhÑìbºY6»Ø´ûÍŽÇ1ß,ÿdÙìb—]3›m÷ͲÙÑ߬šÝ𲟢š1šÝ𴤚ÝpúÍÎÍn8ì ¨fgœÝ|ÑìˆÙìŒ[3_6;ãÞÌ—ÍÎÍÎøjæÍ [Ín¨¯l5;cóÒV³36¯m5»¡~ØU³36¯n5;c÷òf³3F³3¾›ù²ÙÏn¾hvCýÜ«f7Ôç¶š1šÝpضÕìŒÑ솗_6š1šÝð´m«Ù §_öêæÝ|Ñ쌳™/›ÝÐçËf'¬fgŒfg|ùs[ÍÎÍÎÍnxúe£Ù §_6š1šÝpè¶ÙìŒÑ솗ޕlvÆhvCŸ/›ÝÐçËfg¼ü¹­fgÍs›Ínxê¶Ùì†S/›Íθ{YV³3Í|Ùì†>_6;c4»a3_4»a3_×åa¯ïÙæ/‹fûö'Y6;Úv÷§Ø·ÙÑ¢Ùžý‰ÍŽÍ.ömv´hv´hv1ß,šm4›E³£E³‹éfÙìh›o–ÍŽ¶ûfÙìbÃîC6;Z4»˜n–Í.6í>d³£Åñ_Ì7‹Ã?Y6»Øe×ÌfGÛ}³lv´Ã7«f7¼ì§¨fgŒf7<í©f7œþ£D³3F³{ªÙg7_4;b6;ãÖÌ—Íθ7óe³3F³3¾šùFóÂV³ê+[ÍÎØ¼´ÕìŒÍk[Ín¨vÕìŒÍ«[ÍÎØ½¼ÙìŒÑìŒïf¾lvƳ›/šÝP?÷ªÙ õ¹­fgŒf7¶m5;c4»áå—fgŒf7¬f«fGÓÍV³£M»«ÙÁêøæ›Õáÿ_[ÍŽvÙ5W³ƒí¾Ùjv°Ã7{4;ãe?Å£Ù «ÙOûAÍÎ8ýG©f'¬fgö<špvóU³®f'ÜšùV³îÍ|«Ù «Ù _Í|£yaÍΨ¯ì£Ù ›—öÑì„ÍkûhvFý°{4;aóê>š°{yW³V³¾›ùV³žÝ|ÕìŒú¹÷hvF}nÍNXÍÎ8lÛG³V³3^~ÙjvÂjvÆÓ¶}4;ãôË^Ý|£›¯šp6ó­fgôùV³ÿ‹f'¬f'|ùsûhvÂjvÂjvÆÓ/[ÍÎ8ý²Õì„ÕìŒC·]ÍNXÍÎxé]YÍNXÍÎèóíÕìŒ>ßjvÂËŸÛG³Žæ¹]ÍÎxê¶«Ù§^v5;áîeùhv£™o5;£Ï·š°š±™¯š±™¯ëò°ã{*úË¢ÙžýI–ÍŽ¶Ýý)ömv´hv±o¢E³£E³‹}›-š-š]Ì7‹fGÍfÑìhÑìbºY6;Úæ›e³£í¾Y6»Ø°ûÍŽÍ.¦›e³‹M»ÙìhqüóÍâðO–Í.vÙ5³ÙÑvß,›íðÍ>16ã×3Ư 6¼lÓí¸îs+cüÚ`ÃÓfÝŽ8öNv{űŸ1Žý†>ß+ŽýŒG3ß+ŽýŒ¯f¾×ûþþ7<õ®¼Îf¾Wûçð‡v›ñkƒ õ±Ýâ×NÛvÿÙîs+cüÚ`ÃaÛî?qìgŒc¿áå—c?ãéó}ð´[¶ÿ\Ý|qìgÝ|³›/ŽýˆÛO3ß¹ûsûA}n÷3~m°¡>·û¿6˜1~m°áÐmÏ8ö3ƱßðòËÆ±Ÿq~ÿâ©·ìúiæ»âØÏ¸5ó]»N?8ô®\G3ßÇ~Âcßr„ñ÷ãͶý >·Çç—CÛ¶Çç¯=Ù¶¼ü²ñ[Ÿ;W OÛö8â/¶N¿ìÞÌwÄ_l1vˎ߆ÏwÄ_l1ôùŽø‹-Œñ[ }¾ÑDÕµŽÙdÕ1·æ¹MX³)«j&³i«c¾î\5Ôº:æÛ“ô˜M_}°™¯)¬c6‰õÁf¾&²>¨ó½~šÌzý4µšýs\ÿËêñB‹yþµÕì`[ŽƒÛ€Õ“…Ë€ÕsVÍŽOX5;X=Sh¾Y=Q`£Ù¬š¬'4Ýl5;Øæ›­fÛ}³ÕìhÃîÃjv°jv4Ýl5;Ú´û°š¬šÍ7«fÿ×V³£]vÍÕì`»o¶šìðÍÍNXÍNXÍÎxÙ¦f'¬fgßjv£™o5;á«™o5;ã©we5;ãÔ»²š°šQÛG³3NÛöÑì„ÕìŒÃ¶}4;a5;ãå—­f'<}¾G³^Ý|Õì„£›ovóU³®f\ÍΨÏí£Ùõ¹}4;a5;ãÐmW³V³3^~ÙjvÂjvÆSoÙjvÆ©we5;áî‡ÓG³Í|«ÙÿÅG³V³3êsûhvÂjvÆË/[͸šñ´mÍÎ8ý²{3ßjvÆa·ìÑì„ÕìŒ>ßjvÂjvFŸo4QõhvÀÙdÕ£Ù5¬ÍΨ™ðhvÂjvF­«G³6}õhv¦°ÍÎØÌ×DÖ£ÙÿÅG³6•; ¿,/±ïd³£E³‹ùfÑìdÙìb—]3›m÷ͲÙÑ߬š1š1šÝð²M«Ù£Ù O›µšÝpÚ°ÕìŒÑì†>_6;ãÑÌ—ÍÎøjæËf7<õ®d³N½+ÙìŒÑì†úØV³NÛ¶š1šÝpضÕìŒÑ솗_6šñôùªÙ¯n¾hvÆÑÍ7»ù¢Ù³Ù³Ù õ¹­f7Ôç¶š1šÝpè¶ÙìŒÑ솗_6š1šÝðÔ[–Ín8õ®d³3î~8­fg<šù²Ù «Ù£Ù õ¹­fgŒf7¼ü²ÑìˆÙ솧m[Ín8ý²{3_6»á°[VÍÎÍnèóe³3F³ú|£‰ªjvÄÙdU5»¡†U5»¡fB5;c4»¡ÖU5;cÓWÕìŒMaU³6ó5‘UÍNXÍÎØtV6ûöM£¿,/±ïd³£E³‹ùfÑìdÙìb—]3›m÷ͲÙÑ߬š1š1šÝð²M«Ù£Ù O›µšÝpÚ°ÕìŒÑì†>_6;ãÑÌ—ÍÎøjæËf7<õ®d³N½+ÙìŒÑì†úØV³NÛ¶š1šÝpضÕìŒÑ솗_6šñôùªÙ¯n¾hvÆÑÍ7»ù¢Ù³Ù³Ù õ¹­f7Ôç¶š1šÝpè¶ÙìŒÑ솗_6š1šÝðÔ[–Ín8õ®d³3î~8­fg<šù²Ù «Ù£Ù õ¹­fgŒf7¼ü²ÑìˆÙ솧m[Ín8ý²{3_6»á°[VÍÎÍnèóe³3F³ú|£‰ªjvÄÙdU5»¡†U5»¡fB5;c4»¡ÖU5;cÓWÕìŒMaU³6ó5‘UÍNXÍÎØtÖjöíß_ZÌó¯­fÛr´Ø¬ž,´X¬ž+°jv´xªÀªÙÁê™BóÍê‰ÍfÕì`õ8¡éf«ÙÁ6ßl5;Øî›­fGvV³ƒU³£éf«ÙѦ݇Õì`Õìh¾Y5û¿¶ší²k®fÛ}³Õì`‡oöhvÂjvÂjvÆË6}4;a5;ãi³>šqÚ°f'¬fgôùV³Í|«Ù _Í|«ÙO½+«Ù§Þ•Õì„ÕìŒúØ>šqÚ¶f'¬fg¶í£Ù «Ù/¿l5;áéó=šðêæ«f'Ý|³›¯šp5;àjvF}nÍΨÏí£Ù «Ù‡n»š°šñòËV³V³3žzËV³3N½+«Ù w?œ>šðhæ[Íþ/>š°šQŸÛG³V³3^~ÙjvÀÕ쌧mûhvÆé—Ý›ùV³3»ef'¬fgôùV³V³3ú|£‰ªG³Î&«ÍΨaõhvFÍ„G³V³3j]=š°é«G³6…õhvÆf¾&²Íþ/>š°é¬löŸoRýeñx‰}ç!ËfGÛîqľ۠œ%ö]-ž+´hv±ïS…ÍŽÏ”˜oOÚh6‹fG‹ÇIL7ËfGÛ|³lv´Ý7Ëfv²ÙÑ¢ÙÅt³lv±i÷!›-š]Ì7‹f'Ëf»ìšÙìh»o–ÍŽvøf#~ó4Züâi´·o6â×N£ÍfñK§Å|³q7Z£˜n6£Åt³µˆ±(¦›ÍHE´—o6#ÑÞ¾ÙïWë]s{ů™fwç›t{ů™F|ǯ™6¼lÕí¿fš12ÑðôËF&N›v{G&2¾›ù~qøe#¯n¾ÈDÆÑÍ™h¨óíÛvwŽ¡>µû¶ßÃxøsûÁÓ¶Ý·ø5Ó†Ó¶Ý·ÈDÆÈDÃaÛî[d"ãèæ‹LdœÍ|¿ÿôG/»G&2nÍ|{d"ãÞÌ·G&"^/n÷ëí§Ñý:ý¹ý žG÷+~Í´áÔm¯æ¿_Í9þƒz(ÝGs’ß?ºíhÎòûhóÔ“é>šãü>šóüõ@¿w3ßhŽôÔùŽã÷ã­C}ncÞ¢ñõãÏí‡^öõ{ú³m×~ÿdž—m{¼â/ü0Æ_ø1¯3ÛÝçl÷Ëlæ›Ý}Î6šÍî>g»ûÜL7‹>gÛ|³ès¶Ý7‹>7v¢ÏÙî>7ÓÍ¢Ïͦ݇ès¶»ÏÍ|³»ÏÑ¢ÏÍ.»fô9Ûî›EŸ³¾Yô9ÛÝçloß,úœíl6»ûÜÌ7»ûœíîs3Ý,úÜL7‹>g»ûÜL7‹>g{ùfÑçloß,ú-û\ðîsÅa“fŸ3FŸ+^¶jö¹àÝ犧_öîsÅiÓfŸ ¾›ù¢Ïï>¼ºùî>Ý|wŸ+ê|ÙçŠúÔfŸ þÜfŸ Þ}®8mÛìsÁ»Ï‡m›}.8ºùî>œÍ|Ñ犧ޕèsÅ©w%ú\ðîsÆèsÁ·ŸF³Ïõ<š}®8uÛ«9ÆgŸ+ê¡4û\pûö¹¢žå³Ïõdš}.Øœç³ÏßÍ|£9ÒgŸ#fŸ+ês›}Î}®8ô²Ñç‚wŸ+^¶mö¹àÝ犧m›}®8í–eŸ Þ}®ØÌw÷¹àÝçŠ>_ô9âêóÏ£ý—Õ{Ïå¿¶úlËÖD‹w¬^i´x£Áê…«÷-^g°ês°z™Ñ|³ês°ÑlV}V}ަ›­>Û|³Õç`»o¶úmØ}X}V}ަ›­>G›vVŸƒUŸ£ùfÕçÿÚês´Ë®¹úl÷ÍVŸƒ¾Ùês°ês°·o¶úìl6«>GóͪÏÁªÏÑt³ÕçhºÙês°ês4Ýlõ9ØË7[}ööÍVŸÿk>'¬>g6é£ÏWŸ3^¶ê£Ï «ÏO¿lõ9ã´i}Nønæ[}NX}NxuóUŸŽn¾êsFïÑçŒúÔ>úœððçöÑç„ÕçŒÓ¶}ô9aõ9ã°m}N8ºùªÏ g3ßêsÆSïÊêsÆ©weõ9aõ9àês·ŸF}ΨçÑGŸ3NÝöjŽñ>gÔCé£Ï ·ìsF=Ë?úœQO¦>'lÎó>'|7óæHÿèóñÑçŒúÜ>úpõ9ãÐË®>'¬>g¼lÛGŸVŸ3ž¶í£Ï§Ý²GŸVŸ36óUŸVŸ3ú|«ÏÿÅìóñÍ‹¿,Þk±ïsI–}Ž¶Ý­)ö}§Ñâ•û¾ÑhñB£Åû,ö}Ñ¢ÏÑâeóÍ¢ÏÑF³Yô9Zô¹˜n–}޶ùfÙçh»o–}.6ì>dŸ£EŸ‹éfÙçbÓîCö9Zô¹˜o}N–}.vÙ5³ÏÑvß,ûíðͲÏÑ¢ÏÑÞ¾Yö9ÚÙl}.æ›EŸ£EŸ‹éfÙçbºYö9Zô¹˜n–}ŽöòͲÏÑÞ¾Yö9Yõ9cô¹á°I«Ï³Ï /[µúœ1úÜðôËFŸN›¶úœñÝÌ—}Î}ÎxuóEŸ3Žn¾èsC¯úÜPŸÚêsÆÃŸÛêsÆèsÃiÛVŸ3FŸÛ¶úœqtóEŸ3Îf¾ìsÃSïJö¹áÔ»’}Î}Ž˜}ÎøöÓhõ¹¡žG«Ï §n{5ÇøêsC=”VŸ3nwŸêY¾úÜPO¦ÕçŒÍy¾úœñÝÌ7š#}õ9aõ¹¡>·ÕçˆÙç†C/›}Î}nxÙ¶ÕçŒÑ熧m[}n8í–UŸ3FŸ6óEŸ3FŸú|Ùç„Ùç×÷¥øËâ½û>—dÙçhÛÝšbßw-^i±ï/4Z¼Ïbß×-ú-^f1ß,úm4›EŸ£EŸ‹éfÙçh›o–}޶ûfÙçbÃîCö9Zô¹˜n–}.6í>dŸ£EŸ‹ùfÑçdÙçb—]3ûm÷ͲÏÑß,û-úíí›eŸ£ÍfÑçb¾Yô9Zô¹˜n–}.¦›eŸ£EŸ‹éfÙçh/ß,ûíí›eŸ“UŸ3FŸ›´ú1ûÜð²U«Ï£Ï O¿lô¹á´i«ÏßÍ|ÙçŒÑçŒW7_ô9ãèæ‹>7ÔùªÏ õ©­>g<ü¹­>gŒ>7œ¶mõ9cô¹á°m«ÏG7_ô9ãlæË>7<õ®dŸN½+ÙçŒÑçˆÙçŒo?VŸêy´úÜpê¶WsŒ¯>7ÔCiõ9ãv÷¹¡žå«Ï õdZ}ÎØœç«ÏßÍ|£9ÒWŸVŸês[}Ž˜}n8ô²ÙçŒÑ熗m[}Î}nxÚ¶Õç†ÓnYõ9cô¹a3_ô9cô¹¡Ï—}N¸úü“rY½×hñ\þk«ÏÁ¶lM´x§Áê•F‹7¬^h°zŸÑâu«>«—Í7«>ÍfÕç`ÕçhºÙês°Í7[}¶ûf«Ïц݇Õç`ÕçhºÙês´i÷aõ9Xõ9šoV}þ¯­>G»ìš«ÏÁvßlõ9Øá›Í3­`W6*Ú´ŸoŽlT°™GV´a?ßöó“‘JX~ÆË‹í§ü„uàg<ý²uàgÔí¶Ÿ:ðž¾Þ‡_¶ü„£›¯ü€çO†*ãÔmÏ-C•p÷o¶Ýö÷ûD¿Û¶ó•'VÆK·=ßþõ¶uàgÔ/¸í¬?c3_s.ØÎæ`ðAý–Û®æh°ý~è÷Üõp°]Íéà“aúÜîûËŸÛ}牕QŸÛ}?óÄJxe¨2ž~Ù:ð3NÛvßëÀxÔŸqèe:ðîÍ|Gø f¾£üŒ>ßñû–ùeëÀ8šãÙ>šóÙõ¹ÝGsBû ÑöÙœÑöÙÒ>¨'Ž}6Ç´}~¶ý ÔöÙœÔöÙÕ>¨gµý÷páóÍæ´¶Ïæ¸¶Ïæ¼öÁf¾æÄv¼7n?xÚ-;Þ»?·ÔçöxÞ¶íñ~e¨2¿ì;C•ðÌPe¼lÛã}e¨Þ‹G±™o~ÿ˜ŒâÔ»ò{ÂðùÎûoñ(ú|çžÿ²€ðþ[<ˆYëç÷3å/‹/e±ïw2YÖ:Úv²‰}?ØÐâûXìû±†µŽµ.ö­u´¨u´¨u1ß,¾ÐF³YÔ:Z|ˆéfYëh›o–µŽ¶ûfYëbÃîCÖ:Z|ˆéfYëbÓîCÖ:Z|ú‹ùfñÙO–µ.vÙ5³ÖÑvß,kíðͲÖÑ¢ÖŦý|YëhQëbÃ~¾ªuƨuÃË‹ªuƨuÃÓ/µn¨ÛU­3ž¾^Õ:cÔ:ãèæ‹ZGÌZ7œºmÖ:ãîßlU댇·U­^ºmÖ:cÔº¡~ÁU­6ó5炪uCý–«ZgÜü{®j±9T­3¾ü¹­Z7Ôç¶j1jÝðôËF­NÛ¶j1kÝpèe³Ö÷f¾¬uÆ£™/kÝÐçËZ7œzWFs<«Z7Ôç¶jÝPhUëŒÍ!­j±9¦U­êA­j±9ªU­3žÍ|³9­U­36絪uÆæÄVµnxÚ-«Z7Ôç¶j1jÝpøe£Ö£Ö /Û¶j1jݰ™/jÝpê]ÉZgŒZ7ôù²Ö£Ö W­>pþ²úRF‹ïämÕ:Ø–ŸlhñÁVßÇhñ±VµVµŽµVµVµŽæ›Õרh6«Z«ï4ÝlÕ:Øæ›­ZÛ}³UëhÃîêu°ú @ÓÍV­£M»«ÖÁêÓÍ7«ÏþmÕ:Úe×\µ¶ûf«ÖÁßlÕ:XÕ:Ú´ŸoÕ:XÕ:Ú°ŸïQë„U댗=Z'¬Zg<ý²UëŒºÝ£Ö O_ïQë„Uë„£›¯jpÕ:ãÔmW­îþÍö¨uÂÿÛµÎxé¶«Ö «Öõ îQëŒÍ|͹àQëŒú-÷¨uÂÍ¿çµNØœµNøòçöQëŒúÜ>j°jñôËV­3NÛöQ뀫Ö‡^vÕ:áÞÌ·jðhæ[µÎèó­ZgœzWFs<{Ô:£>·ZgÔ#Ú£Ö ›CÚ£Ö ›cÚ£Öõ ö¨uÂæ¨ö¨u³™o6§µG­6çµG­6'¶G­3žv˵ΨÏí£Ö «Ö‡_¶j°jñúÿùºÃÝh‘&JÂw42Ð U÷ccÈÌ*ô:¢~íj }>ÐtÅÌ®mÛ¾jpÔ:ãb¾QëŒ]ïʬuÂQëŒ>߬uÂQë±jýû|œþ±üR{¾“ɪÖѶx³‰=/6´ü>{^khYëhYëbO­£e­£e­‹ùfùu€Ö›e­£åw˜nVµŽ¶ùfUëh»oVµ.Öì>T­£åW€˜nVµ.Öí>T­£åÛ_Ì7Ëw?YÕºØe׬ZGÛ}³ªu´Ã7«ZGËZëöóU­£e­‹5ûùF­3f­^öXŒZgÌZ7<ý²Y놺ݨuÆÓ׵ΘµÎØVóe­#V­vݶjq÷o¶Q댇·Z7¼tÛªuƬuCý‚µn¸˜oq.µn¨ßr£Ö7ÿžµÎ¸8ŒZgüøs;jÝPŸÛQëŒY놧_6kݰ۶£Ö«Ö ›^¶jq_ÌWµÎx,æ«Z7ôùªÖ »Þ•¶8žZ7ÔçvÔº¡ÑF­3.i£ÖÇ´Që†zPµÎ¸8ªZg<óõÅimÔ:ãâ¼6jqqbµnxÚ-µn¨Ïí¨uƬuÃæ—ÍZgÌZ7¼lÛQëŒY놋ù²Ö »Þ•ªuƬuCŸ¯j1k°jýó|Åþcù¥,ö|'“U­£mñf{^lhù},ö¼ÖвÖѲÖÅžZGËZGËZóÍòë­-6ËZGËï1ݬjmóͪÖÑv߬j]¬Ù}¨ZG˯1ݬj]¬Û}¨ZGË·¿˜o–ï~²ªu±Ë®YµŽ¶ûfUëh‡oVµŽ–µ.Öíç«ZGËZköóZgÌZ7¼ì±µÎ˜µnxúe³Ö u»Q댧¯7j1k±­æËZG¬Z7ìºmÕ:ãîßl£Öÿnµnxé¶UëŒYë†ú7jÝp1ßâ\0jÝP¿åF­3nþ=7jqq:µÎøñçvÔº¡>·£Ö³Ö O¿lÖºa·mG­#V­6½lÕ:㾘¯jñXÌWµnèóU­v½+mq<µn¨Ïí¨uC=¢Zg\ÒF­3.Ži£Ö õ 6jqqTµÎx.æë‹ÓÚ¨uÆÅymÔ:ãâÄ6jÝð´[6jÝPŸÛQëŒYë†Í/›µÎ˜µnxÙ¶£Ö³Ö óe­v½+UëŒYë†>_Õ:cÖ:á¬õûƒø/e´üNþk³ÖÁ¶z³¡å‹ l|£åk lÔ:بu´¬u°Që`£ÖÑ|³ñuÖ›ZßhºÙ¬u°Í7›µ¶ûf³Öњ݇Yë`ã+M7›µŽÖí>ÌZo4ßl¼ûÿÚ¬u´Ë®9kl÷Íf­ƒ¾ÙöÓ+W·Ÿ:·2ž6÷¶m•«ŒÝß¶½r•ð¨s+c³ÍïúñËŽc?ãe³ßÿ¢>¶ûý›Hóc?á8ö3.æÇ~Àýg1ß>Žý„Ûb¾kñ‚ß®Å~»¯øõ¿]_ÿbÜ®Å[þF}Ío×â=¿]‹ýúÖڮūþFŸ¯-^ö[[¼íoÔW×Öïû­‹ùÚ⿵Å+k‹wþ~œþÜîÇUçVF}n÷£Õ¹•°×¹•ñ²m÷ÏO[ ·:ö3ž~Ùqìgì~Ùqì'ü,æûŒc?áw1ßç¬s+ã¥wås­æÇ~FïøY|éÞ¨Ïíñ³øÚ=~ß»7êïñ³øæ½Q+ÇOþƯXnl~ÙÓ,ÇϵšïòCËñÓVóåb1ôù¶ŸúÏŒ]ïÊï ÃçÛò¯± þ‰>·Çouºíovès{ãé—=+W»_6ÿ& c«\elºíÙ+W¯ü›,†—nû >ß•“ÅÐ绎úOŒ>ßõ©ÿd@˜“ÅPç«f?žÿãËf{&dÕìh[KÄžfGËf{Î$hy¢CËØsžCËfGËÓœ˜o–g9´¶Ø,OrhyÓͪÙÑ6߬šm÷ͪÙŚ݇jv´<¿‰éfÕìbÝîC5;Z6»˜o–ÍNVÍ.vÙ5«ÙÑv߬šíðÍF³#V³ž6÷hvÃnƒfgÌf7l¶ùhvÆlvÃËfÍÎx­æËfgÌf7\Ì—ÍŽXÍnØô²Õìˆ×â?šqñŠÍÎøõ/ÆÑì†úšÍθxÑfg\¼êG³#¶ÅË~4»¡¾ºF³3‹ùÚâ?šqñÎÍΘÍn¨ÏíhvÆlvÃ˶ÍθE³ž~ÙlvÃî—Ífgü,æ«fgü.æ«f7¼ô®T³3f³ê|£Ù õ¹ÍθøÞÍθøæÍΘÍÎøõËhvÆÓ,£Ù õÐ2š1›ÝÐç«f7ìzWªÙ³Ù«Ù³Ù¿þÜŽfgÌf7ì~ÙlvÆlvæÛV³#V³^ºm5;c6»¡ÏWÍnèóU³3f³ê|Õìûs|ùDzÙÅžƒ Y5;ÚDZ§ÙѲÙÅž3 ZžèÐò@'öœçвÙÑò4'æ›åY­-6Ë“ZäÄt³jv´Í7«fGÛ}³jv±f÷¡š-ÏobºY5»X·ûPÍŽ–Í.æ›e³“U³‹]vÍjv´Ý7«fG;|³ÑìˆÕ솧Í=šÝ°Ûà£Ù³Ù ›m>š1›Ýð²ÙG³3^«ù²Ù³Ù óe³#V³6½l5;b5;ãâ ?šÝPßñ£ÙoùÑ쌋÷ühvC}kf7ôùÚâe?šÝP_]£ÙÅ|mñÆÍθxçfgÌf7Ôçv4;c6»áeÛŽfgÜ¢Ù O¿l6»a÷Ëf³3~óU³3~óU³^zWªÙ³Ù u¾Ñì†úÜŽfg\|ïŽfg\|óŽfgÌfgüúe4;ãéG–Ñì†zhÍΘÍnèóU³v½+ÕìŒÙìˆÕìŒÙìŒ_nG³3f³v¿l6;c6»aÓm«Ù«Ù /ݶš1›ÝÐç«f7ôùªÙ³Ù u¾Ùì÷—ó?6š-&m6;ØVÇ´lv°Ñìhy&':°q CËóØhv°qšCóÍÆY¬-6'9°qCÓÍf³ƒm¾Ùlv°Ý7›ÍŽÖì>Ìfç74Ýl6;Z·û0›l4;šo6šý¯ÍfG»ìš³ÙÁvßl6;Øá›½šp6;ãis¿š±Ûà÷?ýÚ:¯fgl¶ù«Ù G³3^6û«Ù ¯Õ|£Ù G³3.æÍ8›±éeg³^‹ü«Ù ¯øW³~ý‹ñÕìŒúš5;áâEÿjvÂÅ«þÕì€mñ²5;£¾º^ÍNx,æk‹7þ«Ù ïüW³ŽfgÔçöÕì„£Ù/ÛöÕì„[5;ãé—ÍÎØý²£Ù ?‹ùf³~óÍfg¼ô®Ìf'ÍΨó½šQŸÛW³.¾w_ÍN¸øæ}5;áhv¯X^ÍNxú‘åÕìŒzhy5;áhvFŸo6;c×»2›p4;àlvÂÑì„_n_ÍN8š±ûeG³ŽfglºílvÀÙ쌗n;›p4;£Ï7›Ñç›ÍN8šQç«fßžƒÏ?–Í.öLȪÙѶ8–ˆ=ÍŽ–Í.öœIÐòD‡–:±ç<‡–ÍŽ–§91ß,Ïrhm±YžäÐò '¦›U³£m¾Y5;Úî›U³‹5»Õìhy~ÓͪÙź݇jv´lv1ß,›¬š]ì²kV³£í¾Y5;Úá›fG¬f7šñZÍ—ÍΘÍn¸˜/›±šÝ°ée«Ù¯Å ~4;ãâ?šñë_Œ£Ù õ5?šqñ¢ÍθxÕfGl‹—ýhvC}ufg<óµÅ4;ãâ?š1›ÝPŸÛÑìŒÙ솗m;šq‹f7<ý²Ùì†Ý/›ÍÎøYÌWÍÎø]ÌWÍnxé]©fgÌf7ÔùF³ês;šqñ½;šqñÍ;š1›ñë–Ñ쌧YF³ê¡e4;c6»¡ÏWÍnØõ®T³3f³#V³3f³3~ý¹ÍΘÍnØý²ÙìŒÙì†M·­fG¬f7¼tÛjvÆlvCŸ¯šÝÐç«fgÌf7ÔùªÙž¯õ,›]ì9˜U³£mq,{š-›]ì9“ å‰-tbÏy-›-Osb¾YžåÐÚb³<É¡åANL7«fGÛ|³jv´Ý7«fkvªÙÑòü&¦›U³‹u»ÕìhÙìb¾Y6;Y5»Øe׬fGÛ}³jv´Ã7Ûö=έ†—ýÛž¿6˜1m°ái?È¶ç¯ 6ìþ£ä±Ÿ1ý†Íž€mÏc?c_Í×ãûñÈc?㶘ïÈc?㾘ïÈc?cû?‹ùÚ⻵Å'öFýÈnmñ™ÝÚâC{£~j·¶øØn}ñ¹½Q_v[_|r·¾øèÞ¨ŸÝ­¯>¼¿Øý²yìgü.æëyìgßïô°ËÞ1¦Ïíqÿ=µ[vÜ¿Kʶ½QŸÛãþ;O¶íqÿÉfÛöÆÓ/›­Å°ûeóïµ0öÈUæÛî?‹ùöü‹-†—ޕ߆Ϸç_l1ôùöü‹-†>ßï!òãxùs{㥷ì÷éÏíïAòG·ýÅS·mù[ »^¶å_laܽ,olºíïYÓçkù[ }¾öõ¼ÌfÍŽ¦›ÍfGëvf³ƒã?šo6ÿm6;ÚeלͶûf³ÙÁßìÕ쌗ý¯f'ÍÎxÚòjvÆî?ÊhvÂÑìŒÍž€W³öÕ|£Ùg³n‹ùf³î‹ùf³Žf'ü,æk‹ì«Ùõ#ûjvÂŇöÕì„‹í«Ùõe÷jvÂÅG÷Õì„«ïlvÂÑì„ßÅ|³Ù ÏÕ|£Ùõ½÷jvF}n_ÍN8š±Ù¶¯f'ÍÎxùeG³Žfgßlö¿øjvÂÑì„n_ÍN8šp4;ãé—ÍÎØý²£Ù G³36Ýv6;áhvÆKïÊlvÂÑìŒ>ßlvFŸo6;áåÏí«Ù Ûâ¹ÍÎxê¶³Ù»^v6;áîeùjvÂc1ßlvFŸo6;áhvÆÅ|£Ùó­º<­=™ýe³‹=ýIVÍŽ¶EŠ=ÍŽ–Í.öô'Z6;Z6»ØÓìhÙìhÙìb¾Y6;Z[l–ÍŽ–Í.¦›U³£m¾Y5;Úî›U³‹5»ÕìhÙìbºY5»X·ûPÍŽ–Ç1ß,ÿdÕìb—]³šm÷ͪÙÑßl4»áe?ÅhvÆlvÃÓ~Ñì†Ý”lvÆlvÃfOÀhvƾš/›±šq[ÌWÍθ/æ«fgÌfgü,æk‹ìhvCýÈŽfg\|hG³3.>¶£Ù õe7šqñÑÍθúðV³3f³3~óU³3ž«ù²Ù õ½7šÝPŸÛÑìŒÙì†Í¶ÍΘÍnxùe³Ù³Ù OÛv4»a÷Ë^«ùÚj¾lvƾ˜¯šÝÐç«f'ÍΘÍÎøñçv4;c6;c6»áé—Íf7ì~ÙlvÆlvæÛV³3f³^zWªÙ³Ù }¾jvCŸ¯šñòçv4;c[<·Õ솧n[ÍnØõ²Õ쌻—åhvÆc1_5»¡ÏWÍΘÍn¸˜/›Ýp1ߪËÓ®''ÿ±lv±§?ɪÙѶèO±§ÙѲÙÅžþDËfGËf{š-›-›]Ì7ËfGk‹Í²ÙѲÙÅt³jv´Í7«fGÛ}³jv±f÷¡š-›]L7«fëvªÙÑòø/æ›å៬š]ì²kV³£í¾Y5;Úá›Ý1Öã× Ư V¼lÓí¸âÜÊ¿6Xñ´Y·#ý†Ý†Ý>yìgÌc¿¡Ï÷Éc?㱘ï“Ç~ÆÏb¾Ï7¾ÿ O½+Ÿs1ß'ýˆ½ùC»õçVC}l÷ŸŸ8·vÛvÿÙâÜÊ¿6X±Ù¶ûOûóØoxùeóØÏxú|7žvËöŸk5_ûÛj¾¾š/ýˆÛÏb¾s÷çöF}n÷3~m°¢>·û¿6X0~m°bÓmÏ<ö3æ±ßðòËæ±Ÿ±?ÿ@ñÔ[vý,æ»òØÏ¸-æ»v?œÞØô®\Çb¾+ý„Çþ}þäˆàïëͶ½QŸÛc¿þûÚ¶ÇÞ"W /¿lüÅÆã'rÕð´m#þb‹b÷Ëî‹ùŽø‹-ŠÍnÙñ{ÂðùŽø‹-Š>ß±E0þb‹¢Ï×Qu£ÂÑYuômñÜöEX}QV7j&}ÑVGÿD®j]ýëIzôE_ݸ˜oQXG_$Ö‹ù‘u£Î÷ùYdÖçgÑY³Ù·¿ÿ ~<^h9Ï_›Í¶Õ8h¹ Øx²Ðr°ñ\fG˧ l4;Øx¦Ð|³ñDµÅf£ÙÁÆã„¦›ÍfÛ|³Ùì`»o6›­Ù}˜Í6šM7›ÍŽÖí>ÌfÍŽæ›fÿk³ÙÑ.»ælv°Ý7›Ívøf¯f'ÍN8šñ²M_ÍN8šñ´Y_ÍÎØmØW³Žfgôùf³‹ùf³~óÍfg<õ®ÌfgìzWf³ŽfgÔÇöÕìŒÝ¶}5;áhvÆfÛ¾šp4;ãå—ÍNxú|¯f'¼Vóf'l«ùúj¾Ñ쀳Ùg³3êsûjvF}n_ÍN8š±é¶³Ù G³3^~ÙÑì„£ÙO½e³Ù»Þ•Ùì„£Ù›Þ•Ùì„£Ùÿâ«Ù G³3êsûjvÂÑ쌗_v4;àlvÆÓ¶}5;c÷Ëî‹ùf³36»e¯f'ÍÎèóÍf'ÍÎèóµET½š°/²êÕìŒV¯fgÔLx5;áhvF­«W³.úêÕì„‹Âz5;ãb¾Ed½šý/¾špÑYÕìçóücùx‰=óU³£m1ŽØ³ Z>YbÏ2hù\¡e³‹=OZ6;Z>Sb¾Y>Qhm±Y6;Z>NbºY5;Úæ›U³£í¾Y5»X³ûPÍŽ–Í.¦›U³‹u»ÕìhÙìb¾Y6;Y5»Øe׬fGÛ}³jv´Ã7ÍΘÍΘÍnxÙ¦£Ù³Ù O›u4»a·aG³3f³ú|ÕìŒÇb¾jvÆÏb¾jvÃSïJ5»a×»RÍΘÍn¨íhvÃnÛŽfgÌf7l¶íhvÆlvÃË/›ÍÎxú|£Ù¯Õ|ÙìŒm5__Í—ÍŽXÍŽXÍn¨ÏíhvC}nG³3f³6ݶš1›ÝðòËf³3f³žz˪٠»Þ•jvÆÝ§£ÙÅ|Õì„£Ù³Ù õ¹ÍΘÍnxùe³Ù«Ù OÛv4»a÷Ëî‹ùªÙ ›Ý²ÑìŒÙì†>_5;c6»¡Ï×Q5š±/²j4»¡†ÕhvCÍ„ÑìŒÙì†ZW£Ù}5šqQX£Ù ó-"k4;áhvÆEgU³Ÿwç?–—Ø3Y5;Úãˆ=Û å“%ö,ƒ–ÏZ6»ØóT¡e³£å3%æ›å…Ö›e³£åã$¦›U³£m¾Y5;Úî›U³‹5»ÕìhÙìbºY5»X·ûPÍŽ–Í.æ›e³“U³‹]vÍjv´Ý7«fG;|³ÑìŒÙìŒÙ솗m:š1›Ýð´YG³vv4;c6»¡ÏWÍÎx,æ«fgü,æ«f7<õ®T³v½+ÕìŒÙì†úØŽf7ì¶íhvÆlvÃfÛŽfgÌf7¼ü²Ù쌧Ï7šñZÍ—ÍÎØVóõÕ|ÙìˆÕìˆÕì†úÜŽf7Ôçv4;c6»aÓm«Ù³Ù /¿l6;c6»á©·¬šÝ°ë]©fgÜýp:šñXÌWÍN8š1›ÝPŸÛÑìŒÙ솗_6›±šÝð´mG³v¿ì¾˜¯šÝ°Ù-ÍΘÍnèóU³3f³ú|mU£Ùû"«F³jXf7ÔLÍΘÍn¨u5šqÑW£Ù…5šÝp1ß"²F³Žfg\tÖlö{ál<^h9Ï_›Í¶Õ8h¹ Øx²Ðr°ñ\fG˧ l4;Øx¦Ð|³ñDµÅf£ÙÁÆã„¦›ÍfÛ|³Ùì`»o6›­Ù}˜Í6šM7›ÍŽÖí>ÌfÍŽæ›fÿk³ÙÑ.»ælv°Ý7›Ívøf¯f'ÍN8šñ²M_ÍN8šñ´Y_ÍÎØmØW³Žfgôùf³‹ùf³~óÍfg<õ®ÌfgìzWf³ŽfgÔÇöÕìŒÝ¶}5;áhvÆfÛ¾šp4;ãå—ÍNxú|¯f'¼Vóf'l«ùúj¾Ñ쀳Ùg³3êsûjvF}n_ÍN8š±é¶³Ù G³3^~ÙÑì„£ÙO½e³Ù»Þ•Ùì„»N_ÍNx,æ›Íþ_ÍN8šQŸÛW³Žfg¼ü²£Ùg³3ž¶í«Ù»_v_Ì7›±Ù-{5;áhvFŸo6;áhvFŸ¯-¢êÕì€}‘U¯fgÔ°z5;£f«٠G³3j]½špÑW¯f'\Ö«Ùó-"ëÕìñÕ섋Ϊfÿ<óÿcùx‰=óU³£m1ŽØ³ Z>YbÏ2hù\¡e³‹=OZ6;Z>Sb¾Y>Qhm±Y6;Z>NbºY5;Úæ›U³£í¾Y5»X³ûPÍŽ–Í.¦›U³‹u»ÕìhÙìb¾Y6;Y5»Øe׬fGÛ}³jv´Ã7kù›§ÑòO£}}³–¿ví\lvEõˆùf-š-‹QL7ëÙ‹bºYÏZDËXÓÍz¦"ÚÇ7ëŠh_ßì÷«õÇ®¹}ò×L3¶èÃf“nŸü5Óˆßü5Ó†—­º}ó×L3f&ž~ÙÌDÃnÓnßÌDÆïb¾_l~ÙÌDÆk5_f"c[Í—™h¨óí[þšiC}j÷mÎa<ü¹½ñ´m÷-Í´a·m÷-3‘13Ѱٶû–™ÈØVóe&2öÅ|ûOtŽá©weßó홉Œûb¾=3ñúøs»__?î×éÏízݯü5Ó†]·½ÇøýZœãoÔCéÞ'ùý÷(ñ£Û¶ÅY~o‹Ãüz2ÝÛâ8¿·ÅyþF=Ðïí»˜¯-Žô7ê|Çñûz[¡>·ÇÑãOÔ ~~ü¹½±ée?¿§?Ûöøìñ¯7 /Ûöøä_øaÌ¿ðcxÚ¶Ç绘ï»Ý²ãs®æË¿ðc¸˜/ÿÂcþ…CŸï›á‡pöyýã—Ï5Z>—mö9ØV­‰–Ÿi°ñ‘FËO4Øø@ƒÏ3Z~œÁFŸƒ3šo6ú¬-6}6úM7›}¶ùf³ÏÁvßlö9Z³û0ûlô9šn6û­Û}˜}6úÍ7}þ×fŸ£]vÍÙç`»o6ûìðÍfŸƒ>ûúf³ÏÁÎÅf£ÏÑ|³Ñç`£ÏÑt³ÙçhºÙìs°ÑçhºÙìs°o6ûìë›Í>ÿk¯>'}ÎØlÒWŸÎ>g¼lÕWŸŽ>g<ý²£Ï»MûêsÂïb¾Ùç„£Ï ¯Õ|£Ï Ûj¾ÑçŒ:ß«Ïõ©}õ9ááÏí«Ï GŸ3vÛöÕ焣ϛmûês¶šoô9a_Ì7ûœñÔ»2ûœ±ë]™}N8úpö9á×O£¯>gÔóè«Ï»n{-Žñ¯>gÔCé«Ï ·êsF=Ë¿úœQO¦¯>'\œç_}Nø]Ì×GúWŸÿÅWŸ3êsûêsÀÙçŒM/;ûœpô9ãeÛ¾úœðS}ÎxÚ¶¯>gìvË^}N8úœq1ßèsÂÑçŒ>ßìó¿X}~<Ÿ˜,?×bÏsIV}޶EkŠ=Ÿi´üH‹=Ÿh´ü@£åçYìù8£eŸ£å‡YÌ7Ë>Gk‹Í²ÏѲÏÅt³ês´Í7«>GÛ}³ês±f÷¡ú-û\L7«>ëvªÏѲÏÅ|³ìs²ês±Ë®Y}޶ûfÕçh‡oV}Ž–}ŽöõͪÏÑÎÅfÙçb¾Yö9Zö¹˜nV}.¦›UŸ£eŸ‹éfÕçh߬úíë›UŸ“>gÌ>7l6éèsÄêsÃËV}Θ}nxúe³Ï »M;úœñ»˜¯úœ1ûœñZÍ—}ÎØVóeŸê|£Ï õ©}Îxøs;úœ1ûܰ۶£Ï³Ï ›m;úœ±­æË>gì‹ùªÏ O½+Õç†]ïJõ9cö9bõ9ã×O££Ï õ<:úܰë¶×â?úÜP¥£Ï·èsC=Ë>7Ô“éèsÆÅy~ô9ãw1_[éGŸŽ>7Ôçvô9bõ¹aÓËVŸ3fŸ^¶íèsÆìsÃÓ¶}nØí–>gÌ>7\Ì—}Θ}nèóUŸVŸïÏÛèËϵØó\’UŸ£mÑšbÏg-?ÒbÏ'-?Ðhùy{>ÎhÙçhùaóͲÏÑÚb³ìs´ìs1ݬúmóͪÏÑv߬ú\¬Ù}¨>GË>ÓͪÏź݇ês´ìs1ß,ûœ¬ú\ì²kVŸ£í¾Yõ9Úá›UŸ£eŸ£}}³ês´s±Yö¹˜o–}Ž–}.¦›UŸ‹éfÕçhÙçbºYõ9ÚÇ7«>GûúfÕçd£Ï³Ï ›M:ú±úÜð²UGŸ3fŸž~ÙìsÃnÓŽ>gü.æ«>gÌ>g¼VóeŸ3¶Õ|Ùç†:ßèsC}jGŸ3þÜŽ>gÌ>7ì¶íèsÆìsÃfÛŽ>gl«ù²Ïûb¾êsÃSïJõ¹a×»R}Θ}ŽX}ÎøõÓèèsC=Ž>7ìºíµ8Æ>7ÔCéèsÆ-úÜPÏò£Ï õd:úœqqž}Îø]Ì×GúÑç„£Ï õ¹}ŽX}nØô²ÕçŒÙ熗m;úœ1ûÜð´mGŸv»e£Ï³Ï óeŸ3fŸú|Õ焳ÏïÏÚ?6>×hù\þµÙç`[µ&Z~¦ÁÆG-?Ñ`ã 6>Ïhùq}6>Ìh¾Ùès°¶Ølô9Øès4Ýlö9Øæ›Í>Û}³ÙçhÍîÃìs°ÑçhºÙìs´n÷aö9Øès4ßlôù_›}ŽvÙ5gŸƒí¾Ùìs°Ã7›}6úìë›Í>;›>GóÍFŸƒ>GÓÍfŸ£éf³ÏÁFŸ£éf³ÏÁ>¾Ùìs°¯o6ûü¯½úœpô9c³I_}8ûœñ²U_}N8úœñôËŽ>gì6í«Ï ¿‹ùfŸŽ>'¼Vó>'l«ùFŸ3ê|¯>gÔ§öÕ焇?·¯>'}ÎØmÛWŸŽ>gl¶í«Ï Ûj¾Ñç„}1ßìsÆSïÊìsÆ®weö9áèsÀÙç„_?¾úœQÏ£¯>gìºíµ8Æ¿úœQ¥¯>'ܪÏõ,ÿêsF=™¾úœpqžõ9áw1_[é_}þ_}ΨÏí«ÏgŸ36½ììsÂÑ猗mûêsÂÑ猧mûêsÆn·ìÕç„£Ïó>'}ÎèóÍ>ÿ‹ÕçÛóAüÇòs-ö<—dÕçh[´¦Øó™FË´Øó‰FË4Z~žÅž3Zö9Z~˜Å|³ìs´¶Ø,û-û\L7«>GÛ|³ês´Ý7«>kvªÏѲÏÅt³ês±n÷¡ú-û\Ì7Ë>'«>»ìšÕçh»oV}Žvøf=+4ZþRh±n?_Ï_ ÖãÈ*ÖìçÛ~òB3æßð²Çâ~é~ü²yà7<ý²yà7Ôíîßúµrÿ©N]ïÆæ—Í?c[Í—~Ä3!´a×mÏü…ÐŒ»³ÝØtÛßïýnÛ~¿4~tÛ3üŒ_ÿzÛÎ<ðêÜvæßp1ßâ\°‹ƒÁú-·]‹£Áöûý¡ßs7êá`»§ƒ;Ãô¹Ý÷?·ûž¿ÚPŸÛ}Ï_͘¿ÚðôËæß°Û¶ûž~Ä#ü†M/{äŸq_ÌwäŸñXÌwäßÐç;~?e~Ù<ð#¶Åñlo‹óÙúÜîmqB»Qh{_œÑö¾8¤Ý¨'޽/Ži{?ül{£Ôö¾8©í}qT»QÏjûïáÂçë‹ÓÚÞǵ½/Îk7.æ[œØŽïæÏí§Ý²ã»ûs{£>·Ç÷øïkÛßO„ªaóËæßâa<#T /Ûöø^ªŒù·x óåßâ1ìzW~O>ß™‹ÇÐç;óoñ0æßâ!¬ZÿyN(ÿX~)‹=ßÉdUëh[¼ÙÄžZ~‹=¯5´¬u´¬u±§ÖѲÖѲÖÅ|³ü:@k‹Í²ÖÑò»@L7«ZGÛ|³ªu´Ý7«ZkvªÖÑò+@L7«ZëvªÖÑòí/æ›å»Ÿ¬j]ì²kV­£í¾YÕ:Úá›U­£e­‹uûùªÖѲÖÅšý|£Ö³Ö /{,F­3f­ž~Ù¬uCÝnÔ:ãéëZgÌZgl«ù²Ö«Ö »n[µÎ¸û7Û¨uÆÃ¿ÛF­^ºmÕ:cÖº¡~ÁZ7\Ì·8ŒZ7Ôo¹Q댛ÏZg\œF­3~ü¹µn¨Ïí¨uƬuÃÓ/›µnØmÛQëˆUë†M/[µÎ¸/æ«Zg<óU­ú|Uë†]ïJ[ÏF­ês;jÝPh£Ö‡´Q댋cÚ¨uC=¨Zg\ÕF­3ž‹ùúâ´6jqq^µÎ¸8±Z7<í–Z7ÔçvÔ:cÖºaóËf­3f­^¶í¨uƬuÃÅ|Yë†]ïJÕ:cÖº¡ÏWµÎ˜µN8kýþþýÇÆ—2Z~'ÿµYë`[½ÙÐòÅ6¾Ñòµ6jlÔ:ZÖ:بu°Qëh¾Ùø:k‹ÍF­ƒï4ÝlÖ:Øæ›ÍZÛ}³YëhÍîìu°ñ€¦›ÍZGëvf­ƒ·?šo6ÞýmÖ:Úeלµ¶ûf³ÖÁßlÖ:بu´n?߬u°QëhÍ~¾ûŸ~í¡xÕ:ãeÅ«Ö G­3ž~ÙQëŒºÝ«Ö O_ïUë„£Ö Ûj¾Q뀳Ö»n;kpÔ:cÓmg­ŽZg¼tÛYë„£Öõ îU댋ùç‚W­3ê·Ü«Ö 7ÿž{Õ:áâtðªuÂ?·¯ZgÔçöUë„£ÖO¿ì¨uÆnÛ¾jpÖ:cÓËÎZ'ÜóÍZ'<óÍZgôùf­3v½+mq<{Õ:£>·¯ZgÔ#Ú«Ö ‡´W­.Ži¯ZgÔƒÚ«Ö GµW­ž‹ùúâ´öªuÂÅyíUë„‹Û«ÖO»e¯ZgÔçöUë„£Ö›_vÔ:á¨uÆË¶}Õ:á¨uÆÅ|£Ö»Þ•Yë„£Ö}¾Yë„£ÖÿbÔúý”ýýÏîÏw²Ñï72R¤:Óv¿ÕŒ~ßiLÏ7±ÑïûŒé©t¦'Ò~éIt¦§Ðt¨ç €©ùPO3=¯~#*ÒœiÓ¡"Ì™v*²Ü¨ÉòåLÏ‹ÞȆŠ"7ê²|ô8Óóz7Ò¡žW;R´¸Ñ%ŒgÚu¨èp¦C‡Š gz"ܨËÏ Îô¸Q“Ÿ+û[ìÉoµKžŒo±§½ÕN½æSÞj6Xv·Ø©“eu‹=Ñ-Ö›=ÉÍÅ­ÖmÏèm±]¿›²¶ÅývÊÖV»lÏ(m±'´Õì+*3[Í7ó¯óll5ûžÊÂÛô›*ûZ̿Գ®Å>ú|f[«Ùó™e-ö„µÚ©×|²Z­ËžÕlÑÔjÍ®E-¶ûfÑÓb‡o5­¦›EK«u»ÍRÒjö|fF«Ùa*#ZÌS™Ðb~ Ê€V³#U泘ª2žÅN߬û¹*ËYÌOVÙÍb~¶ÊjV;åe3«Ùó™Å,ö³ZÓk>¹,öÔ²Ú%{f+‹=©¬æ›=¡¬Öí>D&‹=•¬¦›E#‹=‰Œ–…ÜžµýÅ7ªÐý…J”…Œ´=¯+¡ûm…_¦B÷» ) ) Yè.d¤(d¤(d!*^ìH͇ŠBFŠ·º •…Œ´éPYÈH»•…,Ôdù,d¤x™ ÙPYÈB]–ÏBFŠ÷¸oq¢,d¡K.˜…Œ´ëPYÈH‡•…Œ…,ÔåçÊBFŠBjòsU!³E!›]ò T!³E!›zÍ(d3¬ ™íÔɪ٢ÙÚb³(d´,d³n{f!³íúÝT…Ìvè·S²Ùe{f!³E!›ÙWT²™oæ_çUÈfö=U…̶é7U2›©W!³}ôù¬B6³ç³ ™- ÙìÔkF!›uÙ³ - Ù¬Ù5³Ùvß, ™íðͲÍt³,d³n÷¡ùAª ÙÌžÏ*d3;LU!³ùqª ™ÍTUÈfv¤ªBfóCU2Ûé›u?WU!³ùɪ ™ÍÏVUÈf§Ü£*d3{>«Ù¢Íš^3 ™- Ùì’=«Ù¢Í|³(d³n÷! ™- ÙL7ËBf‹B&…¼ÿýÏËõŠ_¨i2Ж¯+¤x[Õ—)R¼«€ªª‘¢ªª‘t¨z±5ª ¨ÞêH6Ô(d M‡… ´ëP£‘š,? ¨^æH6Ô(d¤.ËBª÷8’Uoñ¿4 é’ ŽBÚu¨QÈ@‡µýôlE°í'Ï•l§,¼m[¶"[—·mÏV$;ò\ÉÖdæmûä¹’¬Îâl—,½mu'»›ÕYœ¬Îâl¾YÅÁößl¯³8Ùæ›]þ®Þ.Yo—¿­o³×õv}õ‹m»ü…}›½±·Ë_ÙÛåïìÛì]´]þÖ¾M7kþÞÞš¿¸o³ÒÖüÕ½µÃ7kþòÞš¿½·æ¯ïý8õùÜ+Ï•lö|îGËs%YÏs%Û%{îŸŸß 8lÏß°çó¶S¯yf+²u½æó×?ÄZ¶"[³=Ïž­öÛ›]ózþð‡Øæ›]ÏŸýPÓÍ®ç~¨éf×'ÿÝ:Ùó?Ôl³ìäëùÿPt²Ð}˜ ÊNFÚž£„ÐÝÉHÑÉB÷9)Ž^Hqòº^HÑÉHqìÒ¡âÐ…Ô|¨8r!ʼnKȆÊNFÚt¨ìd¤]‡ÊNj²|v2R´„l¨ìd¡.Ëg'#E' éPÑÉDÙÉB—\0;iס²“‘ª:-;Ùì”…«“ͺl\ÌlÖdæêd¶èd³K–®Nf»›E'³E'›ùfÑÉhÙÉfÍ®™Œvù»º:™ÍßÖÕÉl_ýb«N6³7vu2›¿³«“Ùü­]ŒÖü½]lf/¤êd¶Ã7kþò®Nfó×wu2[t²™=ŸÕÉlÑÉf—ìY̶=lvê5£“ͺ^3:™íã›e'³}}³ìd³ËîCv2[t²™mVlfÏgu2›kV'³ù÷fu2[t2ÛWÏÕÉl§ž2ª“ÍìœQÌl¦›e'›u»ÙÉlÑÉhÙÉlÑÉl_}>«“Ù¢“ͺ^3:™-:Ù¬ÙžÙÉhÙÉf—í™Ìl¦›e'›éfÙÉlÑÉf¶Ùèäú§/ªNFŠÃÄ_ ´åQ):¨:)Î@uôª“R¼€ª“êØ…¤CÕ¡ ¨ùPu䪒 5:hÓ¡F'í:Ôèd¤&ËNªƒ’ 5:©Ëò£“ª“‘t¨êä¿4:é’ ŽNÚu¨ÑÉ@‡5;lt2Û) ÏNfë²ñìd²êd¶&3ÏN&«Nf»déÙÉd×b³êd²êd6߬:lt2[³kŽN»ü]=;™ÌßÖ³“ɾúÅ6;™ÍÞØ³“Éü=;™ÌßÚ³“Áš¿·g'³Ù iv2Ùá›5yÏN&ó×÷ìd²êd6{>g'“U'³]²çìd²-;™íÔkV'³u½fu2ÙÇ7LöõÍF'³]vF'“U'³Ùf³“ÙìùœLæßš³“Éü{sv2Yu2ÙWϳ“ÉN=eÌNf³sÆìd²êd6Ýlt2[·û0:™¬:lt2Yu2ÙWŸÏÙÉdÕÉl]¯YLVÌÖlÏÑÉ`£“Ù.Ûst2Yu2›n6:™M7LVÌf›e'ÿ–Ãõ‡¢“…îÃQv2Òö%„îNFŠNºÏHqôBŠ“—Ð}ðBŠNFŠc—‡.¤æCÅ‘ )N\B6Tv2Ò¦Ce'#í:Tv²P“峓‘â %dCe' uY>;):YH‡ŠN&ÊNºä‚ÙÉH»•ŒtèPÕÉhÙÉf§,\lÖeãêd¶èd³&3W'³E'›]²tu2ÛµØ,:™-:ÙÌ7‹NFËN6kvÍìd´ËßÕÕÉlþ¶®Nfûê[u²™½±«“Ùü]Ìæoíêd´æïíêd3{!U'³¾Yó—wu2›¿¾«“Ù¢“Íìù¬Nf‹N6»dÏêd¶íéd³S¯lÖõšÑÉlß,;™íë›e'›]v²“Ù¢“Íl³êd3{>«“Ùü[³:™Í¿7«“Ù¢“Ù¾zƨNf;õ”QlfçŒêd¶èd3Ý,;Ù¬Û}ÈNf‹NFËNf‹NfûêóYÌlÖõšÑÉlÑÉfÍöÌNFËN6»lÏìd¶èd3Ý,;ÙL7ËNf‹N6³Í²“¿Ï_Ëø‡¢“…îÃQv2Òö%„îNFŠNºÏHqôBŠ“—Ð}ðBŠNFŠc—‡.¤æCÅ‘ )N\B6Tv2Ò¦Ce'#í:Tv²P“峓‘â %dCe' uY>;):YH‡ŠN&ÊNºä‚ÙÉH»•ŒtèPÕÉhÙÉf§,\lÖeãêd¶èd³&3W'³E'›]²tu2ÛµØ,:™-:ÙÌ7‹NFËN6kvÍìd´ËßÕÕÉlþ¶®Nfûê[u²™½±«“Ùü]Ìæoíêd´æïíêd3{!U'³¾Yó—wu2›¿¾«“Ù¢“Íìù¬Nf‹N6»dÏêd¶íéd³S¯lÖõšÑÉlß,;™íë›e'›]v²“Ù¢“Íl³êd3{>«“Ùü[³:™Í¿7«“Ù¢“Ù¾zƨNf;õ”QlfçŒêd¶èd3Ý,;Ù¬Û}ÈNf‹NFËNf‹NfûêóYÌlÖõšÑÉlÑÉfÍöÌNFËN6»lÏìd¶èd3Ý,;ÙL7ËNf‹N6³ÍF'o?¨:)it2ЖG ¤èd êd¤8GÕÑ ¨N^HqðªNªc’U‡. æCÕ‘ ¨N\H6Ôèd M‡ ´ëP£“‘š,?:¨ZH6Ôèd¤.ËNªNFÒ¡ª“ÿÒèd¤K.8:hסF':Ô¶ïy®d»äþ¶ÙŠdŸ”[óOåÖýcy›½À¶îÌ­û'ó6ûhn}ñÙüµ®×¬³8Ù×7ëu';›ýžÅõš—¾ËöOÏs%›=Ÿû÷'Ï•d[ž+Ùšì¹÷ú|ÞfÏç±}ÿûÈžÇvf+²zÍ+[‘­ë5ã¯D°õlE¶f{î?¾Ù'Âì²ûð{.ÐÍöø;fºÙþɷΦ›ýžô>j—>Ÿ·]v~{ú|þžö~lÏ_;mÏö“­ÈÖíšmËV$Ûµìnk¶çïyP7kñw"Ìt³öÕ¼;Zü3ß,þN„™o¶ˆá Ï=À¿,tçQv2ÒöäŸÐÝÉHÑÉBwþ!E'#E' ÝŒŒ,¤CE'#5*:):YȆÊNFÚt¨ìd¤]‡ÊNj²|v2Rt² •,Ôeùìd¤8“ éPq"'ÊNºä‚ÙÉH»•ŒtèPÕÉf—üϯNf‹N6;å'¨N6ëú3D'³E'›5¹ßÕÉl}±Yt2Zv2Ûæ›e'³í¾Yv2[t2ÛÇ7kþy¬N6³Odu2›&«“ÙüSYlf/°êd6ÿdV'³->›ÙÉlÑÉl_ß,;™í\llfï²êd3{>«“Ù¢“ÍšìYÌlvé5£“Ù¢“ÍNÙ³:Ù¬ë5¯Åfm±Yt2[÷Ͳ“Ít³ìd²êd¶èd¶>ŸÕÉlÑÉlÑÉf§^3:Ù¬ë5£“Ù¢“Íší™ÌlvÙ}ÈNf‹N6ÓͲ“Ít³ìd¶KŸÏêd¶æÏgv²Ùi{f'›u»fv2Û®eWÌvøfÙÉfºYv2[t²™olæ›-b8è¸Çù—¢“…îü#ÊNFÚžüº;):YèÎ?¤èd¤èd¡»“‘¢“‘¢“…t¨èd¤æCE'#E' ÙPÙÉH›•Œ´ëPÙÉBM–ÏNFŠN²¡²“…º,ŸŒgr!*NäDÙÉB—\0;iס²“‘ª:Ùì’ÿùÕÉlÑÉf§üÕÉf]†èd¶èd³&÷»:™­/6‹NFËNfÛ|³ìd¶Ý7ËNf‹NfûøfÍ?ÕÉfö‰¬NfóÏdu2›*«“ÍìVÌæŸÌêd¶Åg3;™-:™íë›e'³‹Í¢“Íì]VlfÏgu2[t²Y“=«“Ù¢“Í.½ft2[t²Ù){V'›u½æµØ¬-6‹Nfë¾Yv²™n–LVÌÌöÑç³:™-:™-:ÙìÔkF'›u½ft2[t²Y³=³“Ù¢“Í.»ÙÉlÑÉfºYv²™n–ÌvéóYÌÖüùÌN6;mÏìd³n×ÌNf۵쪓Ùß,;ÙL7ËNf‹N6óÍ¢“Í|³E mýU'#Eþý¥ÑÉ@[æRt2Pu2RäPu2Pu2Rt2Pu2Pu2’U Ô|¨êd êd$jt2ЦCNÚu¨ÑÉHM– TŒdCNFê²üèd :“#éPu"ÿK£“‘.¹àèd ]‡ tèP³“Ù.ùŸ?;™¬:™í”Ÿ`v2[ן¡:™¬:™­ÉýžLÖ›U'ƒN&Û|³ÑÉd»o6:™¬:™ìã›5ÿ<ÎNf³Oäìd2ÿLÎN&óOåìd6{ÍN&óOæìd²Åg³W'“U'“}}³ÑÉdçb³êd6{—ÍNf³çsv2Yu2[“=g'“U'³]zÍêd²êd¶SöœÌÖõš×b³¶Ø¬:™¬ûf£“Ùt³ÑÉmv2Yu2ÙGŸÏÙÉdÕÉdÕÉl§^³:™­ë5«“ɪ“Ùší9:™¬:™í²û0:™¬:™M7̦›N&»ôùœLÖüùÌvÚž£“Ùº]st2Ù®e7;™ìðÍF'³éf£“ɪ“Ù|³êd6ßlÃAû=ê¿,tçQv2ÒöäŸÐÝÉHÑÉBwþ!E'#E' ÝŒŒ,¤CE'#5*:):YȆÊNFÚt¨ìd¤]‡ÊNj²|v2Rt² •,Ôeùìd¤8“ éPq"'ÊNºä‚ÙÉH»•ŒtèPÕÉf—üϯNf‹N6;å'¨N6ëú3D'³E'›5¹ßÕÉl}±Yt2Zv2Ûæ›e'³í¾Yv2[t2ÛÇ7kþy¬N6³Odu2›&«“ÙüSYlf/°êd6ÿdV'³->›ÙÉlÑÉl_ß,;™í\llfï²êd3{>«“Ù¢“ÍšìYÌlvé5£“Ù¢“ÍNÙ³:Ù¬ë5¯Åfm±Yt2[÷Ͳ“Ít³ìd²êd¶èd¶>ŸÕÉlÑÉlÑÉf§^3:Ù¬ë5£“Ù¢“Íší™ÌlvÙ}ÈNf‹N6ÓͲ“Ít³ìd¶KŸÏêd¶æÏgv²Ùi{f'›u»fv2Û®eWÌvøfÙÉfºYv2[t²™olæ›-b8h»_¢ÿRt²ÐDÙÉHÛ“Bw'#E' Ýù‡Œ,tw2Rt2Rt²ŒÔ|¨èd¤èd!*;iÓ¡²“‘v*;Y¨ÉòÙÉHÑÉB6Tv²P—峓‘âL.¤Cʼnœ(;Yè’ f'#í:Tv2Ò¡CÝMÔÔâw¤²ÅïH5»dÇí¸žs%[üŽT³S¦ÜŽ8‹›usûÄYœ-ÎâfºÙ'Îâl‡oö‰³8ÛÇ7û|Ÿïm³ÓîÃçôÍ>qGëMέÇïH5³Çsÿ‰ß‘jÖeÏýg{Εlñ;RÍšì¹ÿÄYœ-Îâf—^3Îâl§nvÛ)÷hÿ¹›ÅYœ­-6ë‹Íâ,޶ýøfç®Ïçmö|îgüŽT3{>÷3~G*Û÷þ/ jÍö<ã,Îgq³K¯gq¶~ÿßÕN»G×ovÅYœmóÍ®]O·5»×á›]q';öïó7Ø~ßY²çmö|ûõßWö<öö´¢Ù¥×Œ¿vü<­hvÊžÇ'¬ë5wß숿aÖä¿çÝì÷\°Ù}8¾¾Ù'‚-þN„™nÖ¼nn³SûѽoŽßªÏg÷Â9º'Îmvt?ºGÎÑ?O+šYæý«AxtÛ|3O£{ëÜæ›yíÜf›}~¼w>?<£“_”ÿR=IH1Ê_ ´å$H±P=DH±P=B@ÕÉHñU'ÕヤCÕÃÔ|¨êd zrl¨ÑÉ@›5:hסF'#5Y~t2Pu2’ 5:©Ëò£“ª“‘t¨êä¿4:é’ ŽNÚu¨ÑÉ@‡5;™¬:™¬:™í’g'“U'³2åìd¶.cÎN&«NfÓÍF'“¾Ùèd²o6:™í´û0:™­Û}LVÌfçìd¶.{ÎN&«Nfk²çìd²êd¶K¯YLvêf³“É®ÅfÕÉdm±Y_lV 6:lt2›=Ÿ³“ÙìùœLVÌÖlÏÑÉdÕÉl—^³:™¬:™í´{4:™­Û}L¶ëéqv2Ùá›Nþk³“ɪ“ÙìùœLVÌvé5«“ÁF'³²çìd¶®×Ü}³ÑÉlMîÑìd²êd6Ýlt2Yu2›nÖ¼nf'ƒuï›ÙÉlV8³“Ùìè>;™¬:™Í2gv2™‡Îìd2OÙÉl¾™×Îìä¿6;™Ìƒ';ùçþâù—âIºG!ÊNFÚžI„îEâ!º÷@ŠG):Yè~€¢“‘âñÒ¡âáAj>Tt2R<9B6Tv2Ò¦Ce'#í:Tv²P“峓‘¢“…l¨ìd¡.Ëg'#E' éPÑÉDÙÉB—\0;iס²“‘ª:™-:™-:Ùì’«“Ù¢“ÍN™²:٬˘ÕÉlÑÉfºYv2Ûá›e'³}|³ìd³ÓîCv²Y·ûÌlfgu²Y—=«“Ù¢“ÍšìYÌlvé5£“ÙNݬ:™íZlÌÖ›õÅfÑÉhÙÉhÙÉfö|V'›ÙóYÌlÖlÏìd¶èd³K¯ÌlvÚ=ÊN6ëv²“Ùv==V'³¾Yv2Yu2[t²™=ŸÕÉlÑÉf—^3:-;Ùì”=«“ͺ^s÷Ͳ“͚ܣêd¶èd3Ý,;™-:ÙL7k^7ÕÉhÝû¦:ÙÌ §:ÙÌŽîÕÉlÑÉf–9ÕÉl:ÕÉlž:ÕÉf¾™×Nu2Yu2›Ïèäß/¥©ž$¤å/NÚr¤X¨"¤Ø¨! êd¤x€€ª“êñAÒ¡êáj>Tu2P=9H6Ôèd M‡ ´ëP£“‘š,?:¨:ɆŒÔeùÑÉ@ÕÉH:Tuò_ŒtÉG'í:Ôèd C‡šLVLVÌvÉŽ³“ɪ“ÙN™rv2[—1g'“U'³éf£“Éßlt2ÙÇ7ÌvÚ}ÌÖí>ŒN&«Nf³Çsv2[—=g'“U'³5Ùsv2Yu2ۥ׬N&;u³ÙÉd×b³êd²¶Ø¬/6«N 6:™ÍžÏÙÉlö|ÎN&«Nfk¶çèd²êd¶K¯YLVÌvÚ=ÌÖí>ŒN&Ûõô8;™ìðÍF'ÿµÙÉdÕÉlö|ÎN&«Nf»ôšÕÉ`£“ÙNÙsv2[×kî¾Ùèd¶&÷hv2Yu2›n6:™¬:™M7k^7³“Áº÷Íìd6+œÙÉlvtŸLVÌf™3;™ÌCgv2™§Îìd6ßÌkgvò_›LæÁüû`ü¾|ÿ¥çI2ú):™i»'1ú]„éyˆŒ~÷`z!¦§“~ ¦§“™žÇÇH‡z¦æC=Ìô<9F6Tt2Ó¦CE'3í:Tt²Q“壓™žN6²¡¢“º,Ìôt²‘õt2Rt²Ñ%ŒNfÚu¨èd¦C‡ÊN{:YìédµKvÌN{:Yí”)³“ÕºŒ™,öt²šn,vøfÑÉbß,:Yí´û¬Öí>D'‹=¬fgv²Z—=³“ÅžNVk²gv²ØÓÉj—^óéd±S7ËN»›=,Ö›õÅfO'³E'³E'«Ùó™¬fÏgv²ØÓÉjÍöŒN{:YíÒk>,öt²Úi÷(:Y­Û}ˆNÛõô˜,vøfÑÉhÙÉbO'«Ùó™,öt²Ú¥×|:™-:Yí”=³“Õº^s÷Í¢“՚ܣìd±§“Õt³èd±§“Õt³æu“ÌÖ½o²“Õ¬p²“Õìèž,öt²šeNv²˜‡Nv²˜§Nv²šo浓Œ–,æÁ“ÜîÃÖ¿O’Ð= Qv2ÒöL"t/‚‘нR;):YH‡ŠN&ÊNºä‚ÙÉH»•ŒtèPíù•ºLÏoÔeúêPíù}ºL§õü6]#ª=ýÉ&dCõ6!ªG®!E­ ÙP=Z é£Cõ(5¤¯õû½ø#Ü>ÏïÏkOs˜5™qû<¿?—íûüþ\µK–ܾÏïÏ‹N3;õšÑif]æÜ¾Ñil_ßìך^3:íZlÆÖ›E§™Ùfûöüþ\5{:÷mšƒíÐçó¶SöÜ·ç÷çªuÙsߢӨ¢ÓÌšì¹oÑilm±Yt[÷ÍöŸ§9ÌN»ûæ›íÑil»o¶G§¡]}>÷ë«ÇÅý:õù¼ÍŒûõüþ\µn{^~¸Þ/?]ßf§Æ½ùùzÿ=üØžÍOØ{ó#ömvtÜ›²÷æ§ìÛ옽·¯oÖü }›mv¿ï¬…Ùóyýþ{lŸ}>okvÍÏï!Mö<>ûóïÌ.Ùóø<CDìù"j§ìy|¾¾Ùçù"bçb³çoˆ¨ùfÏß{þ†ˆšnö}þ†ÚhâíçÕ§)À¿4šhËÔCŠO,P}`‘âó TW ú´"Ҩš¨>ªH:T51P󡪉ª‰‘l¨ÑÄ@›5šhסF#5Y~41P51’ 5š©Ëò£‰ª‰‘t¨jâ¿4šé’ Ž&Úu¨ÑÄ@‡5š¨šè«C&:}¨jb$ªš¨šɆMŒdC&ª&F²¡F}t¨ÑÄ@_j4ñ_šMLVMÌÖdÆÙÄ`£‰Ù.Yr61Y51۩׬&fë2çlb²¯o6š˜¬š˜ìZlVMLÖ›U³Ùf³‰ÙìéœMLvèó9›˜¬š˜­Ëž³‰Éª‰Ùšì9›˜¬-6«&&ë¾Ùhb¶ÓîÃhb¶n÷a41Y51Øhb²¯g³Ùq61[·=/?\Ï&f³Sãlb²-›˜ÍNس‰Ùìè8›˜ÌOÙ³‰É¾¾Yóƒölâ¿6›˜ÍžÏÙÄ`£‰Ùš]s41Y51Û%{Î&&«&f;eÏÙÄl]îÑlb²jb6ß¬š˜¬š˜M7Müײ‰¯ûÀñ/ŧVè~‰²‰‘¶'õ„îO,R|`…îÏ+R|\‘âÓ*tX‘¢‰‘â£*¤CE#5*š)šXȆÊ&FÚt¨lb¤]‡Ê&j²|61R4± •M,Ôeùlb¤hb!*š˜(›Xè’ f#í:T61Ò¡Ce#E#}u¨lb¤Ó‡Š&Ò¡¢‰‘¢‰…l¨lb!*›)šXȆÊ&FúèPÙÄH_*›˜¨š˜-šØ¬ÉŒÕÄhÙÄf—,YMÌMlvê5£‰ÍºÌYMÌöõͲ‰Ù¢‰Ù®ÅfÑÄlm±Y4±™mVMlfOg51Û¡Ïg51[4±Y—=«‰Ù¢‰ÍšìYMÌÖ›E³uß,›Øì´ûMlÖí>d³E£e³}õ¸XMlfÆjb³n{^~¸®&6³Sc51Ûö4±™°«‰ÍìèXMÌæ§ìjb¶¯oÖü ]MLVMlfÏg51Z6±Y³kf³E›]²g51[4±Ù){V›u¹GÕÄlÑÄf¾Y41[4±™n–ML–M|Þ‡‘)>µB÷H”MŒ´=©'tb‘â+t^‘â㊟V¡ûÊMŒU!*š©ùPÑÄHÑÄB6T61Ò¦Ce#í:T6±P“峉‘¢‰…l¨lb¡.Ëg#E éPÑÄDÙÄB—\0›iס²‰‘*›)šé«Ce#>T4±MŒM,dCe ÙPÙÄHÑÄB6T61ÒG‡Ê&FúêPÙÄDÕÄlÑÄfMf¬&FË&6»dÉjb¶hb³S¯MlÖeÎjb¶¯o–MÌMÌv-6‹&fk‹Í¢‰Íl³jb3{:«‰Ù}>«‰Ù¢‰ÍºìYMÌMlÖdÏjb¶¶Ø,š˜­ûfÙÄf§Ý‡lb³n÷!›˜-š-›˜í«ÇÅjb3;0V›uÛóòÃu5±™«‰Ù¶§‰Íì„]MlfGÇjb6?eW³}}³æíjb²jb3{>«‰Ñ²‰Íš]3›˜-šØì’=«‰Ù¢‰ÍNÙ³šØ¬Ë=ª&f‹&6óÍ¢‰Ù¢‰Ít³lb²ÑÄ¿_ºÿR}j‘âüK£‰¶L=¤øÄÕ)>¯@õqªO+R|Xª‰ê£Š¤CU5ªš¨šɆM ´éP£‰vj41R“åGU#ÙP£‰‘º,?š¨šI‡ª&þK£‰‘.¹àhb ]‡M tèP£‰ª‰¾:Ôhb Ó‡ª&FÒ¡ª‰ª‰‘l¨ÑÄH6Ôhb jb$j41ÐG‡M ôÕ¡Fÿ¥ÙÄdÕÄlMfœM 6š˜í’%g“U³zÍjb¶.sÎ&&ûúf£‰Éª‰É®ÅfÕÄdm±Y51›m6›˜ÍžÎÙÄd‡>Ÿ³‰Éª‰Ùºì9›˜¬š˜­Éž³‰ÉÚb³jb²î›&f;í>Œ&fëvF“Uƒ&&ûêqq61›g³uÛóòÃõlb6;5Î&&Û²‰Ùì„=›˜ÍŽŽ³‰Éü”=›˜ìë›5?hÏ&þk³‰ÙìùœM 6š˜­Ù5G“U³]²çlb²jb¶SöœMÌÖåÍ&&«&fóͪ‰Éª‰Ùt³ÑÄ-›ø{bþ¥øÔ Ý Q61Òö¤žÐý‰EЬÐýyEŠ+R|Z…î+R41R|T…t¨hb¤æCE#E ÙPÙÄH›•MŒ´ëPÙÄBM–Ï&FŠ&²¡²‰…º,ŸMŒM,¤CEe ]rÁlb¤]‡Ê&F:t¨¿î)~Û­P—Ÿ«ÇïºEêÏ‘R¨ÉϵýÄoºe‹S¸Ù%ÏÀö§p¶8…›zÍ8…›Ù`ÛOœÂÙN춦׌S8[[l§p´3~Ó­Y·=ÏøM·l»~7ÝÖlÏ߯ûvÚÎøM·f—íy~õ j;ãnf_QÛ§p3ß̿ηӿÏo³ï©íòoôí÷{À¾©n³ïôíò/õ»†ìùÜ÷>Ÿû¿éÖÌžÏ}ßtË¿éÖìÔkÆ)ܬ˞û§p´#NáfÍ®yÄ)œm÷ÍŽ8…³¾Ù§p3Ýìøýé5ãŽÖü µ7?IÝfÏçÞü,u›¦öî§©½ûqê6;&ìÝT{?ôèy›©öîgª½û¡ê6;Uí¿Gݬû¹jï~°Ú»Ÿ¬nóÍülu|7}>o;åß]ŸÏÛìù<¾Ç_Ùóø~žJ4kzÍøklçS‰f—ìy|¯§Ùâ¯}˜ùfñ×>̺݇ßsnvÆ_û0ÓÍÎøklñ×>Ȳ?÷¿Îþ—âUèþB%ÊBFڞוÐý¶BŠ/S¡û]……Œ…,t2Ò÷yO!E! éPñbGj>T2R¼Õ…l¨,d¤M‡ÊBFÚu¨,d¡&Ëg!#ÅË\ȆÊBê²|2R¼Ç…t¨x‹e! ]rÁ,d¤]‡ÊBF:t¨,d¤(d¡.?W2R²P“Ÿ« ™- Ùì’g  ™- ÙìÔkF!›Ù`UÈl§NV…Ì…ÌÖ›E!£e!›uÛ3 ™m×ï¦*d¶C¿ªÍ.Û3 ™- Ù̾¢ªÍ|3ÿ:¯B6³ï©*d¶M¿©ªÙüK½ ™í£Ïg²™=ŸUÈlQÈf§^3 ٬˞UÈhYÈfÍ®™…̶ûfYÈl‡o–…l¦›e!›u»ÍRUÈfö|V!›Ùaª ™ÍSUÈl~ ªB6³#U2›ªªÙN߬û¹ª ™ÍOVUÈl~¶ªB6;åU!›ÙóY…Ì…lÖôšQÈlQÈf—ìY…Ì…læ›E!›u»YÈlQÈfºY2[2Ù(äýï^®oT¤øBýK£¶|]!ÅÛ ¨¾L‘â]T… T…Œ… T… T…Œ¤CÕ‹¨ùPUÈ@õVG²¡F!m:Ô(d ]‡…ŒÔdùQÈ@õ2G²¡F!#uY~2P½Ç‘t¨z‹ÿ¥QÈH—\p2ЮCB:t¨QÈ@UÈH]~®QÈ@UÈHM~®YÈdUÈl—<³ÉªÙN½f2› 6 ™ìÔÉf!“U!“µÅfUÈ`£Ùºí9 ™l×ï¦YÈd‡~;ÍBf»lÏQÈdUÈlö5 ™Í7ó¯óYÈlö=5 ™lÓoªYÈdþ¥> ™ì£Ïç,d6{>g!“U!³zÍ*d¶.{ÎB…ÌÖ욣Évßl2Ùá›BfÓÍF!³u»ÍR³Ùìùœ…Ìf‡©YÈd~œš…LæªYÈlv¤š…L懪YÈd§oÖý\5 ™ÌOV³Éül5 ™í”{4 ™ÍžÏYÈdUÈlM¯Y…LV…ÌvÉž³ÉªÙ|³*d¶n÷a2Y2›n6 ™¬ ù¯e!ÿà¾(¾Q…î/T¢,d¤íy] Ýo+¤ø2ºßUHQÈHŸçM%t2R2R²/v¤æCE!#Å[]ȆÊBFÚt¨,d¤]‡ÊBj²|2R¼Ì…l¨,d¡.Ëg!#Å{\H‡Š·8Q²Ð%ÌBFÚu¨,d¤C‡ÊBFŠBêòse!#E! 5ù¹ªÙ¢Í.yªÙ¢ÍN½f²™ V…ÌvêdUÈlQÈlm±Y2Z²Y·=³ÙvýnªBf;ôÛ© Ùì²=³Ù¢Íì+ª ÙÌ7ó¯ó*d3ûžªBfÛô›ª ™Í¿Ô«Ù>ú|V!›ÙóY…Ì…lvê5£ÍºìY…Œ–…lÖìšYÈl»o–…ÌvøfYÈfºY²Y·ûÐü U…lfÏg²™¦ªÙü8U…Ìæª*d3;RU!³ù¡ª ™íôͺŸ«ªÙüdU…Ìæg«*d³SîQ²™=ŸUÈlQÈfM¯…Ì…lvÉžUÈlQÈf¾Y²Y·û…Ì…l¦›e!³E!“BþùûŸ—ë)¾PÿÒ(d -_WHñ¶ª/S¤xWyüªBFŠBªBªBFÒ¡êÅÔ|¨*d z«#ÙP£6j2ЮCBFj²ü(d z™#ÙP£‘º,? ¨ÞãH:T½ÅÿÒ(d¤K.8 hסF!:Ô(d *d¤.?×(d *d¤&?×,d²*d¶KžYÈdUÈl§^³ ™Í›…Lvêd³ÉªÉÚb³*d°QÈlÝö…L¶ëwÓ,d²C¿f!³]¶ç(d²*d6ûŠš…Ìæ›ù×ù,d6ûžš…L¶é7Õ,d2ÿRŸ…LöÑçs2›=Ÿ³ÉªÙN½f2[—=g!ƒBfkvÍQÈd»o6 ™ìðÍF!³éf£ÙºÝ‡æ©YÈlö|ÎBf³ÃÔ,d2?NÍB&óÕ,d6;RÍB&óCÕ,d²Ó7ë~®š…Læ'«YÈd~¶š…ÌvÊ=š…ÌfÏç,d²*d¶¦×¬B&«Bf»dÏYÈdUÈl¾Y2[·û0 ™¬ ™M7…LV…üײo~ûCñ*t¡e!#mÏëJè~[!Å—©Ðý®BŠBFŠBº ) ) YH‡Š;R󡢑â­.dCe!#m:T2Ò®Ce! 5Y> )^æB6T²P—峑â=.¤CÅ[œ( Yè’ f!#í:T2Ò¡Cm?ñ[PѶø-¨f§,¼mñ[Pͺl¼mñ[PÙâ· š5™yÛ>Ϲ’-Îâf—,½mqg»›ÅYœ-Îâf¾YœÅÑößl³8Ûæ›]þ®Þ.Yo—¿­o³×õöûù·/¶íòömöÆÞ.eo—¿³o³wÑvù[û6ݬù{{kþâ¾Í^H[óW÷Ö߬ùË{kþöÞš¿¾÷ãÔçs?â· šÙó¹ñ[PÙâ· š]²çþ‰ß‚ʶ=gq³S¯gq³®×Œ³8ÛÇ7ûÄYœíë›}Îç\ivÙ}ø\‹Íâ,nf›?þ•y›=ŸÇi?þ­y›}m?þ½y›0ŽŸø»l_=cÜÖôš§ž2ŽŸk±Ù¥çŒã§-6‹?ÿ`¦›mñ ̺݇ßsn¶Å߀@û {>ß 8lÏß°çó¶S¯y>­hÖõšñ— ØÚÓŠfÍö<ã/A ]ñ— Ì.Ûó·t³+þ„™nvÅ_‚0ÓÍ®øKlñ— Ìl³ìäíà_ŠNºDÙÉHÛs”º;i:Yè>G ÅÑ )N^B÷Á ):)Ž]B:TºšG.¤8q ÙPÙÉH›•Œ´ëPÙÉBM–ÏNFŠƒ– •,Ôeùìd¤èd!*:™(;Yè’ f'#í:Tv2Ò¡CU'£e'›²pu²Y—«“Ù¢“ÍšÌ\ÌlvÉÒÕÉl×b³èd¶èd3ß,:-;Ù¬Ù5³“Ñ.WW'³ùÛº:™í«_lÕÉföÆ®Nfówvu2›¿µ«“Ñš¿·«“Íì…TÌvøfÍ_ÞÕÉlþú®Nf‹N6³ç³:™-:Ùì’=«“Ù¶§“ÍN½ft²Y×kF'³}|³ìd¶¯o–lvÙ}ÈNf‹N6³Íª“Íìù¬NfóoÍêd6ÿÞ¬Nf‹Nfûê£:™íÔSFu²™3ª“Ù¢“Ít³ìd³n÷!;™-:-;™-:™í«Ïgu2[t²Y×kF'³E'›5Û3;-;Ùì²=³“Ù¢“Ít³ìd3Ý,;™-:ÙÌ6üûÂû—ª“‘â0ñ—F'my”@ŠNªNFŠsP½€êä…/ êd :v!éPuèj>T¹€êÄ…dCNÚt¨ÑÉ@»5:©Éò£“ê …dCNFê²üèd êd$ª:ù/NFºä‚­¾òvjt2СCÍNÌvʳ“Ùºl<;™¬:™­É̳“ɪ“Ù.Yzv2ٵج:™¬:™Í7«NÌÖ욣“Á.WÏN&ó·õìd²¯~±ÍNf³7öìd2gÏN&ó·öìd°æïíÙÉlöBšLvøfÍ_Þ³“Éüõ=;™¬:™ÍžÏÙÉdÕÉl—ì9;™lËNf;õšÕÉl]¯YLöñÍF'“}}³ÑÉl—݇ÑÉdÕÉl¶Ùìd6{>g'“ù·æìd2ÿÞœLVLöÕ3Æìd²SO³“Ùìœ1;™¬:™M7ÌÖí>ŒN&«NLVLöÕçsv2Yu2[×kV'“U'³5Ûst2Øèd¶ËöLV̦›NfÓÍF'“U'³ÙfÙÉ?÷pÿRt²Ð}˜ ÊNFÚž£„ÐÝÉHÑÉB÷9)Ž^Hqòº^HÑÉHqìÒ¡âÐ…Ô|¨8r!ʼnKȆÊNFÚt¨ìd¤]‡ÊNj²|v2R´„l¨ìd¡.Ëg'#E' éPÑÉDÙÉB—\0;iס²“‘ª:-;Ùì”…«“ͺl\ÌlÖdæêd¶èd³K–®Nf»›E'³E'›ùfÑÉhÙÉfÍ®™Œvù»º:™ÍßÖÕÉl_ýb«N6³7vu2›¿³«“Ùü­]ŒÖü½]lf/¤êd¶Ã7kþò®Nfó×wu2[t²™=ŸÕÉlÑÉf—ìY̶=lvê5£“ͺ^3:™íã›e'³}}³ìd³ËîCv2[t²™mVlfÏgu2›kV'³ù÷fu2[t2ÛWÏÕÉl§ž2ª“ÍìœQÌl¦›e'›u»ÙÉlÑÉhÙÉlÑÉl_}>«“Ù¢“ͺ^3:™-:Ù¬ÙžÙÉhÙÉf—í™Ìl¦›e'›éfÙÉlÑÉf¶YtòïrûûŸšŸN6ú=L E'3m÷QÂè·“™žN6ú=G0=G/¦çäeô{ðbz:™é9véPÏ¡‹©ùPÏ‘‹é9qÙPÑÉL›Ì´ëPÑÉFM–NfzZF6Tt²Q—壓™žN6Ò¡žNFŠN6ºä‚ÑÉL»ÌtèPÙÉlÑÉj§,œ¬Öeãìd±§“՚̜,öt²Ú%Kg'‹]‹ÍžN{:YÍ7{:™-:Y­Ù5£“Ù.Wg'‹ùÛ:;Yì«_lÙÉjöÆÎNówvv²˜¿µ³“Ùš¿·³“Õì…”,vøfÍ_ÞÙÉbþúÎN{:YÍžÏìd±§“Õ.Ù3;Yl»;YíÔk>¬ÖõšO'‹}|³èd±¯o¬vÙ}ˆN{:YÍ6ËNV³ç3;YÌ¿5³“Åü{3;Yìéd±¯ž1²“ÅN=ed'«Ù9#;Yìéd5Ý,:Y­Û}ˆN{:™-:Yìéd±¯>ŸÙÉbO'«u½æÓÉbO'«5Û3:™-:Yí²=£“ÅžNVÓÍ¢“Õt³èd±§“Õl³ÑÉûϪNFŠÃÄ_ ´åQ):¨:)Î@uôª“R¼€ª“êØ…¤CÕ¡ ¨ùPu䪒 5:hÓ¡F'í:Ôèd¤&ËNªƒ’ 5:©Ëò£“ª“‘t¨êä¿4:é’ ŽNÚu¨ÑÉ@‡µí{ž+Ù.ùŸ¿íG¶"Ù'Ï•l§üÛþÍs%[ן¡Îâdugkr¿·½Îâd}±YÏïm°£Îâd›ovÔYœl÷ÍŽ:‹“ÕYœìã›5ÿš[_|6­ë5ë,NöõÍzÅÉÎÅf¿gq½æ¥ï²ýÓó\ÉfÏçþýÉs%Ù–çJ¶&{îß=Ï•dG¶"ۥ׬³8YÅÙNÙsÿž¾Ù·Îâd×b³¶Ø¬ÎâdÝ7;ë,Φ›ýž¹æÝDö|Ûqÿͱ>Ÿ·Ùóylßÿ>²ç±ÙŠl§^óÊVdëzÍç¯DˆõlE¶f{î?¾Ù¾Ýó@í²ûð{.ÐÍöçïD¨éfû'ÿÝ:›nö{Òû¨]ú|ÞvÙ=ú=ìéóùûOlÏßzÚží'[‘­Û5Û–­H¶kÙÝÖlÏßó nÖž¿¡¦›µ¯æÝÑž¿¡æ›='BÍ7[ÄpP»_”ÿRt²ÐDÙÉHÛ“Bw'#E' Ýù‡Œ,tw2Rt2Rt²ŒÔ|¨èd¤èd!*;iÓ¡²“‘v*;Y¨ÉòÙÉHÑÉB6Tv²P—峓‘âL.¤Cʼnœ(;Yè’ f'#í:Tv2Ò¡CU'›]ò?¿:™-:Ù씟 :Ù¬ëÏÌlÖä~W'³õÅfÑÉhÙÉl›o–̶ûfÙÉlÑÉl߬ùç±:ÙÌ>‘ÕÉlþ™¬NfóOeu²™½Àª“Ùü“Y̶ølf'³E'³}}³ìd¶s±Yt²™½Ëª“Íìù¬Nf‹N6k²gu2[t²Ù¥×ŒNf‹N6;eÏêd³®×ü¿´;èäªâ(¾÷§èefÁÄUÕ]ï½m"@ŠR˜ÙEY% %J"¡Yßž®¾÷V9ö9Î/®ØÿzÝ®’§lÖO6‹Nf¾Yv²™n–LVÌÌvÕóYÌÌl¶ê5£“͆^3:™-:Ù¬ÛžÙÉlÑÉfÍîCv2[t²™n–l¦›e'³5=ŸÕÉlÝÏgv²Ùj{f'› »fv2Û¬eW̶øfÙÉfºYv2[t²™olæ›uá ¶ýàyMÑÉB[þe'#MüÚ:):YhË?¤èd¤èd¡­“‘¢“‘¢“…t¨èd¤îCE'#E' ÙPÙÉH“•Œ4ëPÙÉB]–ÏNFŠN²¡²“…†,ŸŒÏäB:T<‘e' 5¹`v2Ò¬Ce'#-:Tu²Y“/¿:™-:Ùl•ï :Ùlè÷ÌlÖå~W'³“Í¢“Ѳ“Ù&ß,;™möͲ“Ù¢“Ù®¾Y÷×cu²™½"«“Ùü5YÌæ¯Êêd3{«NfóWfu2ÛÉk3;™-:™íæ›e'³­'›E'›Ù{Yu²™Ïêd¶èd³.{V'³E'›5½ft2[t²Ù*{V'› ½f;Ù¬ŸlÌ6|³ìd3Ý,;™¬:™-:™íªç³:™-:™-:ÙlÕkF'› ½ft2[t²Y·=³“Ù¢“͚݇ìd¶èd3Ý,;ÙL7ËNfkz>«“ÙºŸÏìd³ÕöÌN6vÍìd¶YË®:™mñͲ“Ít³ìd¶èd3ß,:ÙÌ7;‰á¢ûìkªNFŠü{K{'M™HÑÉ@ÕÉH‘@ÕÉ@ÕÉHÑÉ@ÕÉ@ÕÉH:Tu2P÷¡ª“ª“‘l¨½“&jïd Y‡Ú;©Ëò{'U'#ÙP{'# Y¾5ªžÉ‘t¨z"K{'#5¹àÞÉ@³µw2ТCÌÖäË?:™¬:™m•ïàèd¶¡ßCu2Yu2[—û}t2Ù8Ù¬:lïd²É7Û;™löÍöN&«N&»úfÝ_G'³Ù+òèd2MLæ¯Ê£“Ùì ìèd2eLvòÚÜ;™¬:™ìæ›íL¶žlVÌfïeG'³Ùù<:™¬:™­ËžG'“U'³5½fu2Yu2Û*{Ì6ôšíd³~²Yu2ÙðÍöNfÓÍöN~kG'“U'“]õ|LVLV̶ê5«“Ù†^³:™¬:™­Ûž{'“U'³5»{'“U'³éf{'³éf{'“5=ŸG'“u?Ÿ{'³­¶çÞÉlî¹w2Ù¬ewt2Ùâ›í̦›íLVÌæ›µìd6ßì$†ƒÖíê5E' mùG”Œ4=òOhëd¤èd¡-ÿ¢“‘¢“…¶NFŠNFŠNÒ¡¢“‘ºŒ,dCe'#M:Tv2Ò¬Ce' uY>;):YȆÊN²|v2R<“ éPñDN”,Ôä‚ÙÉH³•Œ´èPÕÉfM¾üêd¶èd³U¾ƒêd³¡ßCt2[t²Y—û]Ì6N6‹NFËNf›|³ìd¶Ù7ËNf‹Nf»úfÝ_ÕÉföЬNfó×du2›¿*«“Íì ¬:™Í_™ÕÉl'¯Íìd¶èd¶›o–̶žllfïeÕÉfv>«“Ù¢“ͺìYÌlÖôšÑÉlÑÉf«ìYl6ôšíd³~²Yt2ÛðͲ“Ít³ìd²êd¶èd¶«žÏêd¶èd¶èd³U¯l6ôšÑÉlÑÉfÝöÌNf‹N6kv²“Ù¢“Ít³ìd3Ý,;™­éù¬Nfë~>³“ÍVÛ3;ÙlØ5³“Ùf-»êd¶Å7ËN6ÓͲ“Ù¢“Í|³èd3ßì$†‹îo̯©:)òï-í 4eþ!E'U'#EþU'U'#E'U'U'#éPÕÉ@݇ªNªNF²¡öNšt¨½“fjïd¤.Ëï TŒdCµz,G²üÞÉ@õLޤCÕù[Ú;©É÷Nšu¨½“jk¢®vËV$[ó¹’­ÉŽÓÒò¹’¬çs%Û*SNK=‹³ sºÖ³8Y=‹³éf×z'[|³k=‹“]}³ë-n³­v®«ov­gq°ÑõpNcäs%›Ïùù9Ÿ+Ù†ì9?Où\I6çs%[—=ççz'«gq¶¦×¬gq²U7Ûl•{4?·“ÍêYœ¬Ÿl6N6«gq°éÙ7[g=Ÿ›Ùùœ×%Ÿ+Ùì|Îë5Ÿ+Éâw¤šuÛs­gq²zgkzÍz'ÛW[íµg߬ճ8Ù䛵YŸ7ëvÚ⛵zkË|{ü™l÷÷,Ùs3;ŸËÜÞßdÏeîÙŠlM¯NÚòœ­È¶ÊžË2e+² ½æì›-ñçD˜u¹GËý¹@7[âω0ÓÍ–5ÿ·u²øs"Ìt³îu³™=µ/Ãûf“ŸÏá…³ OœÍìÑ}9˸f+²Yæ,ã¦A¸ Í|3Oexëlæ›yílf›]Ÿ½w®Ï<ÙÉ·íÿ°xMq’„¶Qˆ²“‘¦Ç$BÛ"Hqˆ„¶=â!E' m):)އ©ûPÑÉHqr„l¨ìd¤I‡ÊNFšu¨ìd¡.Ëg'#E' ÙPÙÉBC–ÏNFŠNÒ¡¢“‰²“…š\0;iÖ¡²“‘ª:™-:™-:٬ɎÕÉlÑÉf«LYl6dÌêd¶èd3Ý,;™mñͲ“Ù®¾Yv²Ùj÷!;ÙlØ}ÈNf‹N6³ãYl6dÏêd¶èd³.{V'³E'›5½ft2Ûª›U'³µ“Í¢“ÙúÉfãd³èd´ìd´ìd3;ŸÕÉfv>«“Ù¢“ͺí™ÌlÖôšÑÉlÑÉf«Ý£ìd³a÷!;™mÖ§Çêd¶Å7ËN&«Nf‹N6³óYÌlÖôšÑÉhÙÉf«ìYl6ôš³o–lÖåU'³E'›éfÙÉlÑÉfºY÷º©NFÞ7ÕÉfV8ÕÉföè^Ìlf™SÌæ¡SÌæ©Slæ›yíT'“U'³yðd'_·Ô×'Ih…(;izL"´-‚‡HhÛ)ŽRt²Ðv€¢“‘âøéPqxºŒ'GȆÊNFšt¨ìd¤Y‡ÊNê²|v2Rt² •,4dùìd¤èd!*:™(;Y¨É³“‘f*;iÑ¡ª“Ù¢“Ù¢“ÍšìXÌl¶Ê”ÕÉfCƬNf‹N6ÓͲ“Ùß,;™íê›e'›­v²“͆݇ìd¶èd3;žÕÉfCö¬Nf‹N6ë²gu2[t²YÓkF'³­ºYu2[;Ù,:™­Ÿl6N6‹NFËNFËN6³óYlfç³:™-:Ù¬ÛžÙÉlÑÉfM¯Ìl¶Ú=ÊN6v²“Ùf}z¬Nf[|³ìd²êd¶èd3;ŸÕÉlÑÉfM¯Œ–l¶ÊžÕÉfC¯9ûfÙÉf]îQu2[t²™n–Ìl¦›u¯›êd´á}Slf…SlfîÕÉlÑÉf–9ÕÉl:ÕÉlž:ÕÉf¾™×Nu2Yu2›ÏÞÉ÷±×T' )FyK{'M9 R,T‡)öª#TŒ¨:¨Ž’U‡¨ûPÕÉ@url¨½“&jïd Y‡Ú;©ËòíªCíŒdCíŒ4dù½“ª“‘t¨êä·´w2R“ î 4ëP{'-:ÔÑÉdÕÉdÕÉlMv<:™¬:™m•)Nf2æÑÉdÕÉlºÙÞÉd‹o¶w2ÙÕ7Û;™mµû°w2Û°û°w2Yu2›Ï£“Ù†ìyt2Yu2[—=N&«NfkzÍêd²U7;:™¬lVLÖO6'›U'ƒí ¶w2›Ï£“Ùì|LVÌÖmϽ“ɪ“Ùš^³:™¬:™mµ{´w2Û°û°w2Ù¬OG'“-¾Y«N~kG'“U'³Ùù<:™¬:™­é5«“ÁöNf[eÏ£“Ù†^söÍöNfërŽN&«NfÓÍöN&«NfÓͺ×ÍÑÉ`Ãûæèd6+œ£“ÙìÑýèd²êd6Ëœ£“Éd'› »ÙÉlÑÉfv<«“͆ìYÌlÖeÏêd¶èd³¦×ŒNf[u³êd¶v²Yt2[?ÙlœlŒ–Œ–lfç³:ÙÌÎgu2[t²Y·=³“Ù¢“Íš^3:™-:Ùlµ{”l6ì>d'³ÍúôX̶øfÙÉdÕÉlÑÉfv>«“Ù¢“Íš^3:-;Ùl•=«“͆^söͲ“ͺܣêd¶èd3Ý,;™-:ÙL7ë^7ÕÉhÃû¦:ÙÌ §:ÙÌÝ«“Ù¢“Í,sª“Ùþíþµ¿Oˆ¿ÄÇÓ4mmum[õ|üùòÙôüüîòñǧß|\ü?|ö½çîÏÜÇgÏ¿å³çûÓüý ìøìå·|örî»ÿ<>>ûú›>û¾áýÝùøìÛñÙ·±½ym=ѶÑãÃí·®Í_ó#òÃ>?òg÷øð…O·÷Ëtx|øÂŸ?vï'¸âøèÐøjK¯ýå0/ÖøÝ‹‘î9ÔîGôñ‹^bÆYO?{ÚžK¯O_ÿ‡Ï¾ÿ´ºwqœ§_ß”|!<ÞZ½®~ª§Û²½eÿTþúÃú‡?<Þ6þïWÎö\~Ÿhz¼Þ¿Öo>ûá—ïøî¯ŸÞÝÿÅ—ÏÞÿóÝ·—_ý—ßøý¿ÞŸñ·ßH|£kýk¿Ö×Oÿ\¿Év endstream endobj 60 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xœ–wTSهϽ7½P’Š”ÐkhRH ½H‘.*1 JÀ"6DTpDQ‘¦2(à€£C‘±"Š…Q±ëDÔqp–Id­ß¼yïÍ›ß÷~kŸ½ÏÝgï}ÖºüƒÂLX € ¡Xáçň‹g` ðlàp³³BøF™|ØŒl™ø½º ùû*Ó?ŒÁÿŸ”¹Y"1P˜ŒçòøÙ\É8=Wœ%·Oɘ¶4MÎ0JÎ"Y‚2V“sò,[|ö™e9ó2„<ËsÎâeðäÜ'ã9¾Œ‘`çø¹2¾&cƒtI†@Æoä±|N6(’Ü.æsSdl-c’(2‚-ãyàHÉ_ðÒ/XÌÏËÅÎÌZ.$§ˆ&\S†“‹áÏÏMç‹ÅÌ07#â1Ø™YárfÏüYym²";Ø8980m-m¾(Ô]ü›’÷v–^„îDøÃöW~™ °¦eµÙú‡mi]ëP»ý‡Í`/в¾u}qº|^RÄâ,g+«ÜÜ\KŸk)/èïúŸC_|ÏR¾Ýïåaxó“8’t1C^7nfz¦DÄÈÎâpù 柇øþuü$¾ˆ/”ED˦L L–µ[Ȉ™B†@øŸšøÃþ¤Ù¹–‰ÚøЖX¥!@~(* {d+Ðï} ÆGù͋љ˜ûÏ‚þ}W¸LþÈ$ŽcGD2¸QÎìšüZ4 E@ê@èÀ¶À¸àA(ˆq`1à‚D €µ ”‚­`'¨u 4ƒ6ptcà48.Ë`ÜR0ž€)ð Ì@„…ÈR‡t CȲ…XäCP”%CBH@ë R¨ª†ê¡fè[è(tº C· Qhúz#0 ¦ÁZ°l³`O8Ž„ÁÉð28.‚·À•p|î„O×àX ?§€:¢‹0ÂFB‘x$ !«¤i@Ú¤¹ŠH‘§È[EE1PL” Ê…⢖¡V¡6£ªQP¨>ÔUÔ(j õMFk¢ÍÑÎèt,:‹.FW ›Ðè³èô8úƒ¡cŒ1ŽL&³³³ÓŽ9…ÆŒa¦±X¬:ÖëŠ År°bl1¶ {{{;Ž}ƒ#âtp¶8_\¡8áú"ãEy‹.,ÖXœ¾øøÅ%œ%Gщ1‰-‰ï9¡œÎôÒ€¥µK§¸lî.îžoo’ïÊ/çO$¹&•'=JvMÞž<™âžR‘òTÀT ž§ú§Ö¥¾N MÛŸö)=&½=—‘˜qTH¦ û2µ3ó2‡³Ì³Š³¤Ëœ—í\6% 5eCÙ‹²»Å4ÙÏÔ€ÄD²^2šã–S“ó&7:÷Hžrž0o`¹ÙòMË'ò}ó¿^ZÁ]Ñ[ [°¶`t¥çÊúUЪ¥«zWë¯.Z=¾Æo͵„µik(´.,/|¹.f]O‘VÑš¢±õ~ë[‹ŠEÅ76¸l¨ÛˆÚ(Ø8¸iMKx%K­K+Jßoæn¾ø•ÍW•_}Ú’´e°Ì¡lÏVÌVáÖëÛÜ·(W.Ï/Û²½scGÉŽ—;—ì¼PaWQ·‹°K²KZ\Ù]ePµµê}uJõHWM{­fí¦Ú×»y»¯ìñØÓV§UWZ÷n¯`ïÍz¿úΣ†Š}˜}9û6F7öÍúº¹I£©´éÃ~á~éˆ}ÍŽÍÍ-š-e­p«¤uò`ÂÁËßxÓÝÆl«o§·—‡$‡›øíõÃA‡{°Ž´}gø]mµ£¤ê\Þ9Õ•Ò%íŽë>x´·Ç¥§ã{Ëï÷Ó=Vs\åx٠‰¢ŸN柜>•uêééäÓc½Kz=s­/¼oðlÐÙóç|Ïé÷ì?yÞõü± ÎŽ^d]ìºäp©sÀ~ ãû:;‡‡º/;]îž7|âŠû•ÓW½¯ž»píÒÈü‘áëQ×oÞH¸!½É»ùèVú­ç·snÏÜYs}·äžÒ½Šûš÷~4ý±]ê =>ê=:ð`Áƒ;cܱ'?eÿô~¼è!ùaÅ„ÎDó#ÛGÇ&}'/?^øxüIÖ“™§Å?+ÿ\ûÌäÙw¿xü20;5þ\ôüÓ¯›_¨¿ØÿÒîeïtØôýW¯f^—¼Qsà-ëmÿ»˜w3¹ï±ï+?˜~èùôñî§ŒOŸ~÷„óû endstream endobj 63 0 obj << /Length 2831 /Filter /FlateDecode >> stream xÚ½koÛÈñûý ý"7Í}ð•KHƒ Îú@ã~J-Ñ6kKô‰r·èï¼v¹¤V±’\j`­åîìÌìì<—üÓù§¯‹|V%U®óÙùåLY›º˜iž(]ÍÎW³·óW'j^C»•öìä×ó?ÏÒÙB›¤R ÓÂø´N~wжÐÞ¥Y ?Ÿ ¥'‹L›ù þá5Ê t?tÞC»-ˆC|Á•0c«£‘ÆW}–Ðõ£H¯ ÊM§IYêÙB©¤Êr–Þ¡øÛÒ¼‡¶”ç{kŽ¢}&¿Éðûñ °¢}-ÜÆL–”yÆ;ÛS BÒËЭpÛ~j'pÌõ¤t4-JDjE½70÷Oh¯¤ý í4YóR(] UÜk+èQ6kÛyFpˆA6' 部>žl²ä¹À^Ú¥Ì9Ûy`Zõ ‹šn…¹åÄØöÅÞ ƒ FÓNÆŽçÝp”}°…6àê!¿$pMˆìr)$6£3c©62¾ôqqXÔf$¤á0‡oxôbÀÕËæje ­?¿â€¸ã^cÕ<ñÄÕÈŸ‰Cû« úb¬¢ÝàFÎÝØNÒL&M4SCWÅ„ý·Ïwhá÷ƒœÆ:aû_Ø²à §ž› ˆãøT©-æFø. Yhø\És-ÆU0oYX@û~ÕÓ99§ÿPîx8}]¡o¡ ¯3Ð`K•ÌÖ/¸Xc²ùÇ]p?Ÿ×oÇÏ=ruw'I1W¼ª»óBem øÝ°G»ßm½Uêr.ƒõ ?ðÃ0é}U³’EõÎ1›{Ӿ즘 <döQ›ÿ”šö¹$A°¡Ã Dv’â(ƒ°YbµD„à.p·îdÞ^Á9|~AÁÞ¹ä…AoYÍÿˆ«ðº# 9ïðXvw¢5;æÜmæwx£«ÖÅÇånpÊ8séôlÍËÏîN:§§ˆ¨”ItYŽeºbê¨J¨  Œ^ ÿ¶ÛÞà“–ÝÐD͆ñX´V¢•´€ bË|‹äoNJ‹qW÷õ"À»ÆþÕ5Ë’F.hC C’°j™i> §ÍÀ Í’¼<Ð^î£!“%Õxoþ€Ïƒ¡Î1œ‘ûv䵨úŒŽ›½3t„É-Ï];»hž¢”½zà¬þØúøJÔ\ÊÑú±`ã°‘#ƒnw¿O‚üàâj+.÷VÈ ¥á’@ǵ@Ç’‘x$<»D V^‚ô@î§öŽ:ž!+y tdiüª»`¾á~ÀÓ†3­Ñ=¤ƒJfàöHÝï7t¨u7 ‡5« ŠœÕX-Å¢Û&¦0¡¡C`$|QìÚ÷±&< Ùæ]ª¬8ršOyޏ%B_ó@ÝG<›ÊU¢•wmñzdÏ}•˜Á&âŠ"É*=ÞâK2Þx²bÜ A›Þ§y£Ùáx6_wœˆöG‰së£LÀ‘]³éÄâP L\êÝ^ü÷ïQ¸À%.öaYûAÑ»C–{?åé4²e›TÖŽw,<= sڸĺ–¼ÁMÙ[gÐØ/©“;/„`‹FÓ5lºì)`†µºòwm7-gšL•­p–DØqï$ëoO<„ÙI·% ñɪtþûÝ–q õöŠÝSDÅÉŠ» ×=+¨ÎSâ±F.>ñM[*´Õjz"Þï×øßÉ‚rWœÃt ¢ÚYžXe–ºÜÚEé÷âòŽ‹ä{&PfpôÞH{´ÅSéÛÁú‘9’͆¸u© s¤ÙWšV'&+Æ>“e€¢iX{ÄØ‰Áþ€êXç¿ð€(ù¢¨/WfÏtàóô[Öp>b•šÿIü²Ö›(’êFÉF¨ÖŸ19Z'¡!ü×›hJ†’³;tA r<—Šö;~î.ù·`\ÐÑT±.ySÔÂ"€_’ýnV‚t t[ʇœÈY¸Ë£/œ$w¼¿}­ÍOTéµòZ`]~íTÚÇ %RË„õðBG0޽œf\\ Þ³ÈµÖ©Ü ¹jÝU‰M`±:ðT~;YßHíT m·¿µœüÏ´dÂÇ´Æ|\ãD‘.aÏ©"Ñ"« ®»ö‚'x-4S–™¬+Ç*8Ï0IÄŠ¥ÄrXi-Ù2¦Êø@ à›àÁÐrŸ²£›.yµŒqpçýÞ²¥’Ÿ:NÚMLÛ²2)‹ÂÉç¤ßw¡t7Ekw2ñ&Ét1JN_gÕ Â¢±¹¦Ô€[³)h§ÑP‰Š[Ë¡W¼\­\ä1E6_?=UºµWtüöûÄS*jËTŠÚó“Òpv.‚K‘Îî3ÒÅÍô#>áçœà±_¯Và º4)¾ë •Ìo(9_Í?.¨tÞ‘®Ÿî$ƒº ðS½vJ&£ÓøK¬}hôU‡F›óBñï¥+éð!L•àñ×`2°xÃZYøTÛy¨J>I„ý  ~ªvôÇø@— \ز˜h:•…]owø@W£’Õ8¸Í”íH´ÊTÈvõüÕ€|Â}wåºë\°'’ßÀ Ï©`°!TЬ)mfF‘¢RURäf|™²vv§ÒYžT…)©¾ORH#€ñÜ'Ra†¢°íÙ>T Ê’¼BçžXø! ¹çÑ6¼PHòÒÌ wiª"$!a-•³Ø£¨Ù/£VNˆéà’#0dÀ?Ù/b(BhŸ'JØ3_DIGJfDÉÄ„g‹±ˆ3ű FRÆe_v°&‚f¡²"Ñi…*æøbãÙŽ_iùºçZÙ1*›ý^*›Îmšý.ÔÌÿuo6‚ŽÌ!µŸöÕ©H [9J/Ðá—sÅT ÐI‘{È6QÊRG·œ'Y‘?b«äæ[mõâú;77qâöâú[wncç:°)gÄ€N]EU-P£çq5+5‹8ª4ÉTþE*7;Òø!£Ì‹> ¨´Šù‡oA¨c.`Š0¯¾ã!3ÏCŒÏ3󘕃{·•?¨#oŽ´Î諉Q¶SË%©.µÏf±/Y[D 2¥Óø>ª!@LjÂ0¦ ±C‡üËú3LƒÌµßTö˜¿ýî”ÄlPÝóo» ²cÉDi‚/HèU eÓ˜œB>{¶áiñMx”ËU}…±$×rïB/4h„*aé·îRê7¤Htå:A¥iR”fœ]3Ç|dà„–\U»w’õèuV;eän~“ü›È´#<‡+,šwúfŠŠ0ÜÊà­Zqçv(ðB¦¹&r×:\¸Á0^òr÷ª(?óÖχ.†k_"ôRE¤ÔŸr奸på´¦ãÕXÞÜú÷uã{wWGWô>ƒ,ÙkݳÈ5¤e^ëRù‹%ÛURfÇj¯}Lýc¤°ºª ”~+#æ#úFüÍD©•²UUbäxƒþJ‘xN@mZê ƒ¼61PæY5.é_‹’l{y‘itð¦~ò⧪\WÊB»È2þPby߈0—þ‰ñkt3X@µî®úWÛÚ½•wï"×îòÅüJ>úØ÷pÏÉõùÆð™Ô§àkêý‡«”> stream xÚÍXIoÛF¾ûWÈ…r%†3Ãh{(Ð zTÑCš´DYr´"e7(òß;oÎpÑæÈA´83oç{ß{ã_&7oß%ñ ó³XƃÉ| ’ÀOe6H‚Øúw2|ôvCáú©ô³×¬7úù3ˆ‚á8’Ê›6VÿèÕGýý|¢­ÛæIhO~8xÂ<(Wô m±Êƒ' OÐD` ?M> ¢Äe4 ágQDžžk¹‘¼ŒÝµh}ý¡ñ)¡×ŽŒê¾Aã$õU7}ý GoߥNòŒeä‹èôždºÉ²g3‡"öž‡2Ñ©„ï³õŠpƒé…{9ü$Þ|Ï6…”[êg»¡XƒÀ¼"LÍ:/¥¤ƒja¥> £ÈËWLU¤íœ YbaÈ”ÌÜÒùt‹R+Îû|¹ X–þpg¡÷Ç0Uš½'f \w´¥„«–wñŒ½í”ÌJØ Ð´š´ ½#f1'Ã#×д´DÓ¼´ªY<~F!œï(•ôcí úpÏÁ ö³D¥@úI$´«~˜±§¿u³!óeš}ìѧÓE…§ôɆ¾ßûôiò†¾õUFô›ofÏ0°é-ÓÀÓæ§[Q’i;,PTׄJJrJv®ÕŸ©rÞXTÜr&—ŒŸøñêï{H:çäĤgÒeƒ½'½XÔÑ‹³ÿÖÏ=ý¨_Ççipá»ÿ¢r©;B ›\¿3ȃ'êLL>ëÂû 5†Êcê$EØ¥¸ªÆ-TU©EU•&MÈáüO“êèe#{²øõ ’‡øÓeú96ÝÞqâ`94H÷Œ83HZ±A-ƒDÙ”VÞ:7V,±‹!ñ’}ªÁ«7óÇFPËÒ‹~ç4ï´ ª0Ù‘¨Ð!æŽ@EN$ËêTŸ®¼^OëJ¤_öN š²):»ª±›({ŠŠ2zÄy;âìqÖãÎÅLÍL=vºÎÿo`ÈNL½õ~ë Rªg¯‰1±natlN»Tbp°\FùÚÂÔ1aÒ™Wo;Óç…L²—)>Îô"óœÁ»‹SåGò›&\=Çiy_@µ–Œ¸ÅH¯ˆ8%áÔ84#×{Õ©Œ¤øº¯€€*£"Þ³éÁô³•ÂV@u¿0ó ~¡ÓõvgMÃidýh¦õ€3£sšD Üß—–ÏtxÇÑÖO ­wæe˜••cþ™(qƒ†™¸D9(œn÷öHonïªv\3š’‡R÷§qz…Ûž#ú;šÂ}äˆt "6±ŠÆp2[G¾·OÁ5E%²ÑI…_-_|2Ö¦¥œ%ÈQ¹_ÝP£wPÚ±_qßӧϦVVMN?5ä"ÞÖ-1±-‘æ+ø»·£¯c|F")_YȧžºÅd~Äé›ÄpF¶[unлÂwæ#;Îàí2Ä ›ÂÊÂ> stream xÚÍY[oâF~ϯ@é ´Áë¹ù"•H­Ô•ÒgÞ¶«È °rqÖ@¶[©ÿ½gÎ9ƒÇÆ€RÒ‡‘çræ\¾s™øuzõác Ò d4˜."ƒD¦ƒ8Œßélðiø:à Zm mm í´ÚçÑØH5œÐ§€™h_ ÝC[ðîGhhv½$ÒéóGhB˜ü‹Y d)ì´“4Œ‡?¡†Ùhrôyúû Œ…RcNk™¾‡–ª¯––e¸§i8‹8¦É^;öÊI{¦±fØph zFa8|ÙÙG¶.y¼¢åEÝüÆæo(Yñ M?îx¸i"ɘ|…s=‘{`t¤þ‰>ÏÅšÉX™{æbÇr0Ìx\ù÷H¨=·¢k¡aWØ-’]'R©8ƒî…ƒ¾,²?ª‰DtÓ sY Äù@Èž÷Â!þ¿„:„ƒn sÎñÓ‘ú}â$opÂu¤~_ ä) T-3Ä¥N¹5Ãák³ÿð¤½Ü'ÞÔ}ûù*k®ç&§êe”º¨QòÜD‹z]Ô(õ¶7Ï;.`Ü޽ׯ% Þ°ªe•èX‹ŽØãˆ(¼Ç@‰¨C÷]úð1ñJci¡# ‹ƒT)¢ûeÁ*Ì¡ª(ûUÅŸ³’êˆØú”QqÂñ’´±ÝYa›ßÐèÛHÆŽ.äßí vvåu$·L/â1Dz*ôª’êÌ+q+vÑý”×ב1vÀ­vXIjÛs”$wÚYÈ[‚.㩵n­Å/£±Œ;õ€£Â ZÍÈ~;],èëÁg‡`½$5Ê"·sе-]¬Ù Êѯ ³Žaf5#B§¼eÔ¦<.ì¨èºâ¸]·Ù‹š‡µãD‡šÎŒUí´XîlY£qVÜá3·g´ Œ‹Ø8²Ìq„÷kY£lÈÈ»(ÉfÖÚ5ÍX3 ^}ÆÄðbɲlÉm½ö²Ã¨Œb.Ž4èäRB›ýhÃL«ý&‘èÀD˜#Ó1Ýqì.öóRê@ÉØe ?!D9’#¼DˆpÇëbU&³Pÿµ^[pfàEÈáÝ‚¨üÔgº ,¤p¹aû¹C:Ù-? »(7@œ.T§„%’Fº 1Q@­½XÃŬd­ oÿº¥ä'÷=¼#5‹»A§Ã/BÅ“«Û²»‰®rYæî»b_Ù³YŽ…ÆêñØWÒacûî7™uÛs1{ÄØÇÂêjÚTÈDƒ6çCW.Û’XÜÖΙZaôΰüØ!Òý·ÕM—ÏŸŸ¡;®.‘ÕÁD7,ìšÖ®hœR êä|AýÆÚ•ÕmÙ»Æb@ró¨xó.ìª3² úÔ¼;Êa r<ó;q¨ÛD]Ô¶ƒ(s sÓIÔû`~øÝq<»òpwµc ŠPÇxió0ÓU°ŸÀ­&]ÜY•ñNÊÔ§`Ÿl*à=Aù®Ä?n¯ySy;ëàWþæL?á[ó *« L¢:<×lÃÒãr¦$Á·ê›6?\{A·a[qS Çôš‹þšM‰YÐ=+–3¯ ÁÿÚ½òñôj3ý¶z·7-­ü¼dö¾ËÊ…Wp'þŒÃ!QBM´CÐöû*í˜G;EÛè0»'/ÀgE´ï:àR/c'~Í=@¾Ý#ß#oW¯‹Ù}ñþ„éÆ~ÇqgV¾É¹uó@dœYö&çMV£~¯T ¥„'l Oݘø›ÁÕoÓ«0u endstream endobj 73 0 obj << /Length 2157 /Filter /FlateDecode >> stream xÚÕÙnÜ6ðÝ_¡·®[›‰RÑHŠhZ´qŠ4 d¯¼Þ`w¥ulý÷g†"uøJœ} –‡3Ã9¹/Ož½²yRŠ2Wyrrž(U•™Ä¦¹ªLNæÉ›Y}(gW0*+ï`¼çï3þ^ðo£…±ƒ±çõ–çVgJϾ¥Ÿ§¥,gG‡oO~LÒäXJQfÙíì_ÜËÆÅãÈ=•ô-mNìmaá’‘›Þqý9û#Í$­àÌÑ:.´È”ŠZ”ÆÅï"ÝøÚ«IJBZ2ñø’ÂÏ5Œ´Ç Aœ·êâü^mßM`ÁL8ØüÁD§wu9´Ó‚øûP©( Õ·™ýhϾÛsáôè1žô1¾wô9\õ?gl››wÈ’á-2¾áÇïîôö˜­ûO:xß3Ã' ‚O¬ž6ìM„³{†7ï›ÆŠBqäúa¹Hàs[#ÝRËxæ Œ¸œvA•g¯aí7ßñøÆk¼çŸ´àSw|¿-ëfMhmLjðœÔ²&®¿‰ôyƈ s^óñý†Îª‚.ªç¶L oˆÕ¾d —½Žc³= ­¢ž«›}4pÜãäW‘ª<ßtÒw´üבcmzJ —$ßô4ÐjXøš±–,²»•nÇ-êŠÝ-VÎÄ =rîO|qkvüÈD·!ÓýÙÆn èøL1l™Å”¢¾ûªcïÞELm™å÷‘Ê<±«°Ã›æf€âùejìÌ)Ë2ßîžÜ·‰æ6‚e¬„¡>‹€±)ú€æm-Š\€æÝ2šÀšÁ²IlK7ӲޤñRãµ={••‰4B›\¹êþXB¥¯2ˆ â W÷t(•™ýæØZnÀÏ´5³9šIETЍCp6(E‘´û„œì2;•£ÑоŸÏÌì=^rKð‡ªð{.ªCeAŸB^ S;;ÛF‹ C*Ë8DÐvD¤´£ÛœÏ.«ÆãY¬ã*ŠÙC¼jC¿[ÇiFÙÙZÌã†ä`3ô[wS6BÕ±*K=­ËàØ”íÒx»ÑŠ5º «hÞ:~P[|pP‡7,-bI¿>Säg9< xwŽ3ÊmZ6ôQÃu~qÉqß­Wóy”­H/`AI{çLõÆ Á¹[™p#<õŠƒOL¯Û”Égó#$ÙZ='`)ðêør˜¸»ã9Yr¯Ù•E)t)Ë;Z˜‘h)´R~“Ó£4¬G8 ¥«fÎâBÀrBè¡T\®@½b¥(Ñ]©8¡¡Ö1ÄlÖu°+À %DÕÒ>tw}ó†=;UàùÞOàÃ)©oò;–á{Ì *`’•íÄE¨‚²ÚG\„Ž/B§³—nI„*Ô2J›~ŒŒ!’S>EEkÝ9››7„Ñs¾’ÛŽe( ‘å¥ç¦j,ïßÏXœ*JÄkÆ‹´OÆ¿ŽE.AOyDF¥µ"+VòÂËC?!†Þ8€ÂC–kïÉ,pÍzµv|®j3ÉEiu.g€µÈ%ëR¹´Â ñ)Ä Ô÷¶ g¢{ÔĹзaqˆ¡œAú•‹@fíëDÊÖ@ "nωC°¯À¢{à0¶Ä\VJÎeçcQ2ШW7Ö€cRZÖxœë)yi"Ò© €^eLJZ!³îz«±úÁ–ó˜H"’œ c@´$¹ž"ä˜2BJÆQcÆs‘`UÒW‡áì–me5Í28Ϙç¾Y•i§œ§aeÂxÁ" a´ÆfÑ@|aÓ.Ë£©ùl©ë]×Z£½:ÌrWAFªCd; †Ë‰á¦êâQMþ?a9\ý±id=Ó(¦,ƒQŽ&ŽÊEjí£RÓ! wRµñ­éP2ÈÁÙãÎÓ÷ &|¿em?ú¿òIŠk­M… Þoí£0Y?à*Caë[—@¦_‘8„-§Šb˜éj¦†>h óeT!  ®>"`Õ`O¯Ü;pË©ž2ƒ¥1·T¥Q¢[+Åguí³†3dÿQ®|i2Ì}pÝYgœS9®™HßFä&Η¾Hq'ŸQÇÕqµìúT\ÄþOõ71!’ë‰ &Ù®gB6ŸßýýŽƒÁ5öiˆú LÖÌFOåGáÉd¬ÉøåþozrÎ…LO먲ð¯gÝ)wRÃ]æ[_2CbŠÛ¾º·êí~è.»Hà‹ì‹ö-A`P²ïÚÏÿªÿÿº3ÅZ}øÝ=îΪýaÎÌ„4yßW~Ú¶ì¢YÚ÷oS§„¹ µ;jñ¹d? u1.5ؼìWÔ]9HµÂn˜ú«†`§XdÖã“\_Æ]çZ „MÆ8×L”fö‚^8ÃI 7ÑÝRŸê(RpkrÈ -…V¹¡¥¾hqËÀ½<ä>hÝè ·;†Ýï-í9®‘ª«5mëÅÃáÿŠ¿S÷.ŽÊÁ«ƒt…º?øõ‹š^²RÕ»d{o VíûaûØ;Ã=1­h2™eA†#Z®CRæ0Îé÷ŸQÜæ/º\HÛöÖËEfƒÄ-7,ýv2ÓTš¶I%ËÁ÷'¸N8Md"• i$TEr¶>xó6Mæ° ]ÉD]'R[a —ƒWÉëƒ_^º¿ö•u ŒµThé œª$H¼™ÿo—K)pc¨®m*©–’ø¼…äê÷…sbè±ðŸ ôhãäU%'Ѻi»–jê!Ñ<6çe˜.–W‡Ð¨×›°âûé4âBèQt×|µ˜Ù[ì£Wô±½¥I†6u}‹ªdãGdåþ õ‘‡’ endstream endobj 76 0 obj << /Length 1693 /Filter /FlateDecode >> stream xÚÍËŽÛ6ðž¯0š•Û˜I‰’‚&@dôÐâžÒ4àÚò®[[2¬õ>ôßKÎ %êa¯œ¤@\Sä g8ïáþ<òü"d,SBMæ« —K"5IBŸÈ&óåä}0¿žò /¦3Éàn*’ ÇùBÓbUn ÈíT¤¸7æÐðsg¦{3ÊK ˜omUîq¢ª2{»é ð`±6þydç`×o§\áïNÛƒõ¶r¢S=³›*°GÀ‘ý®ð¬…Å2~˜ÿòü‚sO3±,ŠÌ/gY£4&ŲD¦.fB)Å¢Œ€8ùÍXœª‰ór:‹yðg”EÌT’MÂ3HŠñ$Åt%FØÅr€t$™ç‘–ãIK£8Lƒ•ÕO¹EF@9kÐ(‡½ÁÛiÛÀ„úÜò0a©a‡Ø½bWeQ‹Ýp<»!±{縻FÆ`šã|6oGi]âMW–Ìd&¤b oÛÐÂÜœ[mÁH‰òoe¦"68SŠœï•áDÈà)þT@ÉÞ¢{Ùå˜5`y þ„;ºÉ·îš.g—4p…Ã×JI‡j   ;úÜÓïXA”ÚAa[¯N1f½=âÞ|á4¥˜¥Ð,ÓL"£æ´ãŸ9ID“t>ša#7®O ƒà¯Ý³4yM$|üü+Oˆ¦¥u‚ä0ÖH6|‰™@ñŒ;ZÒWEÛ L|C{Ï>nˆÜ†HÞÒï†à_‚ôáˆ>' 9²ª-ðEÃÃM Â_éN@˜ÛÔª•,M%Rzí ÐŽŽ!YÆæ¤EqÏœÚÖtÂ.Sã°ÊÎÔú×µ¡‰“ãÑ;b/ãm¥+ÎÚZŽÆˆ6=ó€UÑLeshc!î’2† —|ÛÓþ‘hYÇ?wiM¿.‚¾p×qvI³wfïw3^ÓxcÆ;„óQº"ªûVˆµ0?Fn=9k/~.‡\¿"64rb¹"›8x.òЄô7­•^Òºà[ËšìÄý²cÏjÓqõÐOKMm8pË…—qn=Q]Ѽ¨o_ŸUzÖ鬭h ©QfsóW/›³*º|NPkºÂºÖJqD\Žñª1\Ö‰p.lQÜú•g}Ù6Ѳ‰o;¹U¡É:ƒ,“ ú·Óªö#Ñ¡‘‘ÇTI,ÿå‰ÌæÕ&Î4‹ˆãÛðÈÃ(ÁBö«3é›“Ë Î^<ŸA êÕ‡3Ó¤¦ˆœÅÅš‹i¶q±ðÛûiO̤©±ÍŠaÊ¢k j›%zŒPiÝIY°eiüÝÕ.\k»ë:*»rS64;’Ëæ6Û|@ìÝk(ËÀn° P]!Œ†Z¯Uè¦æ†Ûj€èÞÐf]¶Ø ¾(£Hé¼°žÚYJ¬j½7$ØcuoÚªÇd^ ?šélœÍyUAS„|Âjß°“C÷^y{ #*Zåêp²ãÁ{ÊmÌøž(þÙ°üÃãØ¢…=KV§¶‚ÌÙiIþÁ-ÓÜ >XªnUò?PŠ ±WÎyJ9%^剷SL“Ï#Õ¶ö·ÁÁU5…ë@õc‹q,»œÓsHA/+ÒvóŠ>y»v1΂l£x¦¦ Röx¨‚ÖuC+û £0”¹W˜"vzó WËÕ€[‹4cÒH$<Õ0 èTÆ¢X Fê|—¤î•WOä­Ò¦ ˆ»Æp]±ö"áõ«ES¹ê•LÝÜ¡=ÒÕ)#9Þøj’Û=yŽ®ÆVÎs—æ:˜Ëýû«øEÅYÄxðíQ¿èºí˜&®oäCOói*1 ÆXšoêü–D˜$é}ÎBÔéÑìUö»]]«¤P0ž¥ÍûÕ±«÷X•¦ÓtˆDݺ•¥ì²JܹÛèó‘†,ªŸ¥†›Ò>œI!’­RÜ9q,,Õk¤ LX²—p¥¿k!ÆXÜîsòªX2¡d§ÄG‘ 7Ž¬È‘µ Åŕ݌[¯·æ"w'»n?®ßXûxà@{¨7D#•=©©0ôñ4¨Êö‘š°õážxpý«Þ?àÖÁÀ›$WdLþAµ•½?¤/]qfuò´ªÆ endstream endobj 79 0 obj << /Length 2400 /Filter /FlateDecode >> stream xÚµYK“Û6¾ûWÌ)ÑT™|§jvbWfˉSŽ6>$©G¢4J$J+RžL²Uû×·Ÿ(Ñ_ö@ÝÆ×@/çÏn^—ÅUmêÂWóÕU’e¦´åU&±õÕ|yõólsÌðìå=Às„ç—8áõ'<ñu”Ûtö~aïsn¶ÐüOÏžßàYˆ§)øÝ {ûi†kQû–Ÿ-dzÖ”à_çÿ¼²±©*{%‰©óœ ¤ÉCêåQ1ÕADâP'C¿‰JªbKßçæ‰7ÂÇvDUï„×Fú÷Ò· Ƈ‘ 4ÂI½£ ò&ÙhƒH•¦² áöBbØK×6XÖÑ Œ“ê+].½ÈdÔúÆþÏ×ò¼‚çGydÎ ‘´©jddO '²Á)¶Ð}PMZZ=.5ït/j.äiEå^0sùøb.U¼÷ÞbœðD—kSS'‚ÜïeãÐÐwcˆî}¹ °q<3t(Óœ=‚ÌdÊÐo?½Õa¤:yJíEåß“)³~†B³;#Q½AÇ$ÎJsÿ%C8 A$ÚŽý=‚&Yéæu^C2iVXLFQ‰Éæn,„IF¨œØlöö@zÿžgWA"íNLW6~ý'%(cƒ´²h¨Ün™%e*›œ•…QÐŒëtljÆø|;Цv|MQs©€Aú-¥Î³:4Ëò‡åÔc§jƒ+Ì·"e׊«k.’IñüŽs!giô/Ìe9{v Ø#БÛàÝ÷É䑩ˉØ^:ˆN¤É4ßÃjØËNäùûN÷>zR ©zžêtíEÞV“OÛsÇè–)hI}ǽÊqÑhA¹WfoVün¦VNξ¦BÅ"ì$N@Ï%îóÂd±óÝÏ?Ù^æØ”™ ã}Ï ºñAÓí’‚Þd­˜@t€Z1µP3–Ì«–Zñ]»kD¿?¦}ó¬\¼ÅŒnóˆ;C>pú©ã¶¯39ØQY·n¹ƒ¤Eóæ/ K¢™r'༠S>„³ÌVhwK çâ“Ð |7yГâq£éÓÖeP¦}‰:m±·€ɰ¢þ¸çÒ‚: ¬ÍÀ¤ßÑYêàG7¾y¤SH§J¯¹W’·Wü¦¼¶#!ÜÓp]¡Jò† @ÊÌûîKeÂÚN,wTâ“Y¶œõÂRßphxËÇS¤|Ã`†©§?Ù%\Bìù»ov-·´Q~7™Ò6}'6˜T“½RKÛ%Oxä ÂþC@G×Y6^ÐkLøš©³´–àC;ã0–V³¢•¡‹,¢ói_LTZÇÀ8ç^ðFv qy%Ò¾ó½çA›GNZ¶Gî˜-4½$ž‰Åúlû1ïÇ~ÿÎgÓ¶[´ŸåòoZ½9qÁoWj;{mð”\¸K ÇÖ_0ÐÞD±šOBp¼­ ýæQͲã£`”g1 µs ߥ@?Àw?„A£ÜI’í‹$œ¡‰üE¯!3¹RãºÉ‚IãrlRuÂ*µm$½>-.õ»áï¦k¶r±ÔoÜÅðΓÙ-® ¨gï ¿¿eøxˆ‡ª-6°Ñ,þ¿â¤A…ÏåÖKþ‚™¼fïhJ‘š`I&/ó¿ó*vhæuÊ´Ñ: ß—Z®wH¼ŽŠ<ýt]Iõ±mÖà5%D¹oÉŸÈû·r¯Q0Í“ÖõìEp¥Ò¸ÐÉ,é(f¸¬;,ú}í îûàŒ~ K¥dv#ÏCð˜à@иë¯Ç6þ ¡Fعk.v|›àP{ãï{ÛàJV§ÜÈÝõƒŒ7®>º<3d©Éü¡A¶ðg¿üžSF•u\Eà%ôk[‡%ôÙó={elljŸtJ …6ˆòXdTvöÂHÐú¾@!ªÐÖÛ3Ê7†‡çxtŽã Š>Š–‡·³ Ó |nvZReàÏ㊠½fÅo,r)°¨£˜i6-Ê|¼µ¸m'JZU*¬-ý/‰À 9W 'OD“ð¸%øôæ ¨5´v-“õ-…9:Ü3 ©¶ÞÏþ¬À¡ ÕòrŒ£^›¨:Šv$*E'k>ô¨5EøÝÎÝh™‰@Xä&3ÝwdkºÑÛ¹ØCa m–‚ ÿp¤ …aŽÿTËÔ»/ø.¡mc“—¥?OèabO‰v‚IaФ:sÄÿY†õ–…WJl+€>®¯¢ÊšJŠ…„Ø>{5ö?†3Æø endstream endobj 104 0 obj << /Length1 1983 /Length2 13080 /Length3 0 /Length 14284 /Filter /FlateDecode >> stream xÚõPèÖŠ"Á5¸†Æ‚»‚Kp. 4®»;Á!¸»ÜÝÝÝ=·à—™3gfÎÿ^Õ½ÕUt¯­kÛ%©‚2ƒ‘HÜÆÚ…‘™ "+¬Î `ffcdffE¤¤T1s°ýWŽHù¶7³±æý—…tx“‰Þ em¬RŽ–6 '/ /33€•™™ç¿†6`^€(ÐÉÌ Ë²±Ù#RŠØØº‚ÍLLÞòü÷'€ÚÀÂÃÃEÿ§;@È 63Zd¦ «·Œ†@K€²¡ÈÁõBPó™:8Øò219;;3­ìmÀ&ü4ôg3S€Èvþ( ´ýU#"%@ÅÔÌþ? ecg xXš‚¬íß\­@`À[v€²¤ @Þdýc™ÿÐþj€…‘åïpyÿÈÌúOg ¡¡•-ÐÚÕÌÚ`lf È‹Ë0:¸8ЀÖF-ímÞüN@3K Á›ÁŸÔq!Eð­Â¿ê³7›Ù:Ø3Ú›YþQ#ÓaÞÚ,fm$bce²v°GüƒŸ¨døÖwW¦¿†kamãlíþ_dlfmdüGF޶LªÖfvŽ IÑ¿lÞDˆÿÈL@fff.NÈr14eú#Š«-èO%Ëâ·<ÝmmlÆoe€<ÍŒAo_ˆîö@'Àìòtÿ·â" ÀÈÌÐ`21³Fü'ú›düü6°™ @‹ùmýXÌ|þþ¥ó¶aF6Ö–®ÿ˜ÿ9b¦/*_5éþ*ùo¥°° Àƒ ÀÀÊÁ`aaãpq0<ÿ7ÎßøoõJ€f±cþ'¢¤µ± €ç?E¼uï¿…8ýµÔ à3ÈÙ¼í3@ýÏúk3s0¾ýaùÿ|ºüÿÛý?¢ü¿®ÿÿe$îhiù§žú?ÿ?z •™¥ë_oûìèðv²6obýMÕ@ÿ9haK£ÿ«“t¾]ˆµ‰åßm4³7s)˜9šþg‰þ;…·à–fÖ {³? 3óÿѽݜ¡ÅÛ£bÿ6«?U ·“úß”bÖ†6FÜ+']™ßŒ•ƒàÎòv¤F —?wÀÄhmãðæx+Î`lFüc¢œ&¡?DÿAœ&á¿ëÛªýƒØL’ÿ .“ì?ˆÀ$ÿ7â~óSú½ù)ÿƒÞò©þxÞ¢ÿAÜ&ƒÐ[Lÿѽa2úd0þ†o¥3ýg,ÿ¼‘0þÇà„±™Ó¿<þPÛ8‚ÿåðfbò/È`2ý|ãmö/øFÜâ_ð¹å¿àu« Ëuë2¿¹Z¿Íö_ú·Zlþ†ìoÎ6ÿ£~£jû/øFì_´YÞˆÙÿürý+Ý›¹ýÛ óÃ[¯þéÓÛE29˜‚AÿêÌ[g›9¼vü²¾éÿŽõ-€ë¿àY·?áÿ¬©¡#üö„ÿù¼íðñŸÿ/@ !âÒ¼á§ó­¿«„öÆ?ÏPî©%Ñ0¸/ÛPáh*Óü6À·B CÝè«;bÔ7‚Ë$ÏîÇMµpÁÍqŠ-Oz1JS{-ˆ‹“8ýyÇB5}ÄD *‚ûÏv_}- › ;¤(³ì¹Qr0;÷J¸Ôô•¬ŒÍï)îWrJ#=•L3|SÐö-œ¥Ì6HŸÃ#ƒu` †§Å8wA›½¹ÁÈœx%‘Š¡Côüõ-ß]s“5ò~Îm­L…Õ¾Ÿ_úctꣻða¢î‚{QA”TPx1±î|ÐŽ½š´c‰¯ddbkïHÏW¤mg*(ÊPq›RxèÈR9³#«†«pú™E/Ñ^±ýàÇ-¼|6 ì/Ðoáp¢ÀœÜkù!à†Z¶ý0ø0qs?§¿Çkšª6öÕ[0f‘Õ ÛA«Ëè‚rÒÅõûÂsbBÂ>CëZEã„_e‚hˆ8ÌbJšù Vÿ$Cm°¿ãÕ‚’°øÛ”´ùhõ†T‡êk\Ʊ¡¿À².ßþ½ 2Ôæ‚ÊžcÀ¢Q‰h*2ÅœWªËú݈ôc9«rN•Vüq_º°†Àh™,¤ŸMÀ®Ê" 0/14‡Š 1ØäºðN˜w¼vªx:éȨRØ(ÖcJ²dò4ð‹®sˆ,ZEéˆ\TôŒ%½”M-.·3”qtòªCЇs¡b–˜/I_vèY¿LÎo;#yÛŸ<•¿AÓ¼ëÖ4g¨Ž.IõŹòõbñ©–"z·gr[{KMŽQ$Ÿúë´ö™Üþ>QV[w#Û{T˜Y!KK=tû®bÙ …†»¤öHWce×¢­ùƒÍ÷c=ú<ŽÄ¶‘ý· ÛƒÑUrŽày™Ïަős~Óƒ¢ãKÙÍ] ³áº…žx $0³ˆ» Eãnª´c+ØÊ¼nw¾ä;ãú»í)òBÍ Áµ Îo1ÆOaº4—àä:á}/! NñÃàÓä ã\Lá^™M©œ¡s{z/Ñ–Í IÓé Ö(‹ ã]¨Ä2ÌÄF)Îæ’ü:çû 3¿—¥öÚ”ª¤ƒR—ÆÓ £©™Jlåaˆk\í;ä'©m$äeÿsïù6 ŸYÿÙX9ünqþ]B«¯|ï«üòÚØIdjy'$ô'Èêaªå}ßï]ÆÕþ(OLù†jßýE“žñ‹¸!ý‡”ú©µÑŠšÇ1sÞõ.Mw¤si^z§­Fëлñ¾Âi%#ÀZÕ1´Ónìtn²`Q,ÅÕd¨LìªHžU[–N´­«D>Íi¬ÏöRq¼Ë?Ÿ—?®aÁŽ)#½÷%ò¦~äbÏó?€‰8Zî胣ÿÜL7RòU×pŸ­­j€Û¢Éô—Ì ¬e ö5|ô0e¯Î¯áV®se¶ƒ÷<»P+™b,ÓˆwÒÌ{>ÙüYäQ–uW”\!uÅ›‹·[“7ø°YÞ>æµùb˜…± «P´ŠIj̣ǯð³Ò^<¯ø¶œfq? 3¡> nž=®•˜Û ¥ O'…wsoñ™Ÿþ‹W…né ¤*¥×{Œu/šw<¸‰™ Xzt³Á°ßY·F[¥˜íß§³@€«Š]÷ñk–žŽ® LDŽqo+hBZFÃ’[D®§RŠB8› câïy œ>›Šuê©S÷»FÉýN‚£æ!(<À5â˜çËYWg/iáÀ$:GVI…­û uYÚÞ€®½8«£ž…לø¡¶"õiÉ’¶qv”Wƒ¨ŽŸÈvˆë6¡Q¦ù±v`Q3c@Ä«fÀòæþ¦, £Å(™%oŒ—É÷`BJ5€Ø¶êù-Uqœîއí«; =Añ›åü±DE]ý6 é'(HW;º­ýÒ ”i©Úo¡cX„}§;s&ðäÜrš¿&±: {•ñ<¼­º^ˆƒ€#Q+JI“‚Ï4KdÝ9©äâ‘]A3ÞÙÔ ÃûË=›™˜g€_Z¾Õ/·»%ìßÄ3OÐZbYì¶nJLj÷G¨ -¾E@=I˜ýº8+Ó¸ñ%Uk£Ï–]jC!t7MEB]™¹f¹ŸJv)·¤+´\CŽ2ò­ãŸ ¼Ç¼NŸôÖ¤žEü$ø8.òaTÝì kO<eôe}JÚɸ2¤Ûg OïZ.wƒÖ¸]åáî——ÑyYNú4ºEƒˆˆØ²—ö¤)ð±r’[ôlÞ?R§×ì{ÒEq[6g”^Cãò»UPê}F «áJYÅøSú>¹ŠjËÖ¾Wæù²x®ø­u.l|-Q¨û¤ÍÁœ@¾³ä„­¨1QKƒ}€#½«œ¯KTëeÝ”\.K þHÏý1— ˆÒoDñò}-I×I ÃwÑu¢Ã»£¯þªŒ½QQÚféóD šh«‹ èç²fªíRYMP!VæÕ Ê£ì–܆Œ³Cúª ‰‚úȆ›jA¦fáôç«ï %®Ì¢´±<+ÚZ…ïö&€Zn¶V5º’¡ôÚöÎŒ¸tDV*mrP±°Äáo¦ÚüñådygÊ!žæ¾ãѱ±Ó‘˲Öèf—½î¨Ñ­ØPÆ>8ç·Š¬/L™Ó8ÁSà~„€Z¨ÜïpYlÚf”*9³³Sã+cñY¦B¤\ˆÑxôñQ=àiÖ*ʶðO7?í6ÜT˜²õx%¦d0{Þñá1ŽìCQ"ÎDꂸ³÷àˆƒ*RçÒ»V³Saìƒí däÂB}¸R`P!0„6.GÅM؇8aˆý¾$|õŽMÂ3_ÿ€*e9;ʺ“|P—*j:kž*‹!µñϺϪøïvgYy•èJQ{©¤EÂæÚ‡.w8„Gß6•õö†kÖŠ¯ø1röÓ‘—hÞí”Âþ˦—+D ô[Wü™ûÁW6GÒߗɾ¤OT¢Î¢eKYÇ…Ñ‹TǸ¨¤ª©ëÏZˆR§.Ë Y$×¢·î-³g!͇Ä)Í3‹jYN[Ü X‡*ªÕ|Öe鬤šúŒéÉV™Ø¼r{+?=Þ&rå0qu•±a8P¢ô Ûß´N$’®'´Þ‡|åb>ê6íÄRç©ÊT™Gv¦Îù˜tN±íÍ;rmÚAp÷z%ûjÞyW”‰¼Hø‹2Z ÷kÀërˆÄö Sƒ¬€¾2ïæ1¯ÈV©´~í·÷6Oj)DDÖÈŸÆ–õà÷úòëu¨Ècx¬™Íö­yîŸäd øÉÏsÄHÄÆëÆÙ‰Q™#HÅ~µÈ ΄bu<…7r-Ë|9ÏE¯!dæê0-êöÐϲ`‚ÅŸb•µ¿ÒçdžÈIÑãÑ¥’Bª …ÆL C!Ó °atî¸p%^p’v¼I¯Â>‡ìb>># % 9æã†ä42ÅmHtÔ¬’¾(ÜikëlíÌQÜ‚?·ÓŒ D3ÜñDò¥Ú` «¢ÿ<^âª`Ìâ(ÞÁ®ßQ’$×äóÉð¾’bî|$vyÏb²_x\f—d‘ð91èW@“¥5è[eëÚ­³Š”]q t³²“àt®ÙQ½óÁ´+ù³QÊ+T÷ÈY:¥ýð†Wª64è>ô÷ŒuäÙ2"ïÞ%µ9O` suÕ=0koG"s>^ðo¶eÙCŸ=pŸûp©]¢yúk˜q˵ÔûÖìÕöãüQIH>ý¦ÓHÓO WÇ8°žÊ€Èw[6È õŽTgΩèÏ•ß]}!Ä&¬ÛöÔ²~ÀjŠëõ”¤]¯Å™àwH‘ׂ„ieÿŽñÄ»Pm võU'€¥~úëù½½?Y°´8³‘A4 ùþëhæº1»„îh™E,µûAÏï*"|rÝ˺HªaÑ€ aÄÐwN»:óiÔtèΞc<Ç;ì¡_¯Î>5£_ùnú!1=СÈÕ ²úbjüÒDY{)Άÿd‚žŸ™¿þ1GÖsq¥h-SÔbÐTÿ›v&ØÑˆãâÓY“¡^ûi(6¢¸ÞT²¡Å\êløokýœ§ì9Ö”„•äØ] òÎû)÷—3ø§ÒƒíŠzmq§Õ_jÄH>–§ˆ”.0Z&µ³è'æœ^ù"H³Ø«d±±º–"?Î\ÑšW)‰^Hh&)­ëÕæÄÓä™ °dÑ“]˽‡°f¼®4íÚNŠ—IÌ$s}) 2EFTRi]üKútKi®IÌ2!!Ø5S¿BÌêXí…ú~ˆY–Œóõ©¸i¥10{iB¼¤d€’RíÏÒ2®RQçšeb$4 Æ ÷…W}BgÊuÆ-›Ã>ñ“Áí‡wg´fËüÅ ìt“ªpIŽÂ›oàãrÙ²£w×R0"ÓÓØ›‰äZTç_u=Á6¥$Èän|¬(ráYj4Ü ?¸p뵸®9"­„foyÎœŠ¾i‰0Vȵi8ñé¡Ó¥¢OB=åÔcZQs7]:b Jù9j~P£ì9ýr"ì†4e6W¿¶5oŽ‹P´^ãå–*ãn'¤ ¡4mJAÎë&§,%³æJd®›Ñ?K\ÝOôfZeÒkRZZûA&ÊVJÇ‹šß‹gûcOþºS×¶î+¼?L;M[°:ÇágSh¹i? úâbÊo,0ÛóN°,«&N>ìœ5\¾_ncpŽI_®ê䮟»Ìs¶åÙ‰‹Ú°–Ú Ö^÷òš¾A:d‹_º^î×ìÝ\|”9©(uRbÉrw‰þònœ”É´×p­%gGúí/ê,Ö6ÿÔ@an4œI56&-†œHe·‡ œùp»ª'ò’eÞõiø (&†ºÊNÖQÀ§õs¨Ì†Ë‡‹r±9ùÀÇ‚‰U²Þ"”ª¼ÐÚ€oT8ãÖcà“Æv RE‡e§¸ûb =ömÚ~>"&=¿¿å1Q®¦`•>N(–HxÕ)=*'þ²Ç¥*þá-Öb÷ߣ{ûî×z5DaoËm™ÞªÕI}“´*V¶ö±Vš”‘Ùሦ,?ÝøüfnöŠ+6ÒrÊ:EÖyO/ Éc¥ãwvãùº3+yË0¯ÇÈd+çzöû—ûªüY ð…—d„Xd¾ÕõìEŠSyh¥}·VŠK‰ŸïÖ ºF `CÒ&˜H·¡“ê„m„W?_ˆK$ÊKNo?©]‰\bWèk¯ƒN˜èºJ{-)Â<³Ï6­¯ãÌŠÛµÁ.n•_Ráq)Xcê¤à‡\XUf=åÕ¾ <Äå ªúGÓ±ÎèEùöƒ«‡ÍYµqÖjÝe¼ßѨn•'O3¹¬éñÒçgWã6=åW²%þGFý[aN‰ÄçÁcá„OƒFê§ÑuX7‘MêbžÕi'û 5Œ½ÃLKKÅbLÎgX3›¢ßXq¾šh¶Ùä'Mè—µm9JœuEX]çq¼5ÿð÷Ôbå¼9Ÿh¡G„)DÂEÕ ’ù ˆ™^sË©•ÆÒÅf.ù€¨S·.«ºFÒ ÛÃR—Õ‰¢R.C¾wøåKõ±}ârèò“fá^Y ã;—.Ü>ÒzlSšQ@Gª±ÖìËÕ ¶ßa­`·~Ô>&lᙿÆsaK"ý¡ÑT°öU§Í·¤“ÊÙÅÎÃ&±nn‰9-ôiLTãÚBWA.u­,dôpH¸## 5*Î)¡¢G‰)¦3$ /âHÒÚmÏ,”Ÿw²Ò5HB š¼·Yøí](116žX£âŠÙë¼áÊ8q ¦Êp8ãûËNMÏ)ª¹f5Ü¥xËgµœ:ºwñç’£=­eqþŽh´)J|]—Ûõdg¼ŒÐÇ^ãÉ¿á?–?-Õ© ÄCÈÊñÔHx}¦Ž·³™‚Z¨k_; ‡g^Á<%¦ƒûÄÛ¹ÖmÓ”HÒ^|«#.IÛŽ®@9ò EC\îIë{ŠD-½¿îòæç PU­.Y£ƒ“cÅöä—uãÚP¸É:gÞµ5òÔ:‡²ÍŸRi8cnž¶ue»§]%Œšndˆ 9IP~^·ÝŒ¡OÙ±¶íÂù ã¥&Jça?l¤&ÁYñÕΠ NFZ"ÿyï)×ÔÛ=†Ìe\(Qêj ƒ6a‹û£d”¨ôäȪŸfÁä§\g—«ÖcÒ§€n5&«„îáŽ~Âïb›­,g8X"¸N:ˆlá²sçtºœw‹w¦}í¤µÊÞ’›2*¸~¬®~ ¦ð˜p%³•Œ5ïBt *œÀŸÚ¶8B¯«·›Ý¢¢ ›äwÓꚬÐ['Ù2í¨éä‰Y‘Š®#’®iŽSu°CíQÃ9’ÞA¢ÑÈXú¦ÈêjYb7úŒÅöwqÚß‘Àæöz2í¯¨ã 9ß[î0‘ ‡Vx QÇ×+;9ì'\öé~²*9îQVœéT610èÈbÍŸÕG£¨ñØšôèXÉd}|.«=(wwúP“0‰„`5€>¤6Òš")è³°ó8–ó{´™ŽÎø­‘`|K¬¼¨QoÐrõÝÄïTº/”d¹mS~ÑÉÙAeö£šØàE26Œn\4pnp»@½fÔE¿jY/Z m|’/ÀŽåôb¾¨©J÷+vô‘%9ûõ¥û7íWf›O|ŽÌ#äò Ž]Z!N/ Ü+7qr§H€lpÒÕ»gÓ)mÃ\íÔÄ¢úm±éÇJÓ‚òÛi» º“ByŽT¤ŸˆZŒ;›)ËG!9‘[ˆ­Àð;Gýƒ:e'£w#ÚK:<â}IÁüt0±;ace6¼3N¿»œ`ºLódœW®©~­;š¿Êyí´º0ÐëªA¶0´„1¤CÀ•g”á‘TUƒàü!Pæ§‘ŸI8fY\ªJZË]hûí'!8ê×¢‰ÜAƒÄ;S”b[+d{UØ©¬ËÀÛŸüä02&Ó¯L{¶ûÃeŒ©øÉãXÕMðÆÊµ5”¦‚Âí«×Ÿñ© ¼° ÛZõU·ËRe|^+Š4Õ¹jj™°¬lŽ6Ê:öít‰z´¼+Üæ¼µ³Y].»MP!më¾ùöƒôQÖ5§£ê„ÖÆ²…îÍ7µ?"øÕ* ó?À‰¾¼¿@ë´eüž×4C–ý­kª©s¼PÓ bƘÛDÑÝ×më'Á BãÒ]œD Ì]ðy@ü¡ùÈPÈšQèLQ{ÉÞ{,Žü¥2s¿ìkzçë­]š!eïƒP’‰JÕýÑVEI@ [Ù­Ï Œ§(·ˆ¸j¡qEHï"!3䯣é¿Óg%é2åuœNAü,êÊ¿ÒЬ¤éks*Âó|Ac€;~M03± ½d ’³IÄñ¨f6é€ÙE- ƒéC‹]Çò,ìd\ž£*66²÷Ë”’-×äs~vìÑÁ9t@WÌÍòTÙõz˜&k ÁùÒKÌ£ÿæ ò˜û£"·4°%E™î£+–|†¬†N!ÔìØV œ½ñú)n®F‚w·ñ#‰eÕ먳i—Aò}r¾m4.ظÜ*xh剩2Ã;굨µMV§€Îú§ïÕ”R j¯O€’zçšúk/žÂG;OAETì–ÊÀßvdÎMщC¤yÌz³²h ¼¯A J[*'ÎKKnJ‘½'C{’=TŽ¿õDº^¢ g“"pŸ½\ýmÁ(aš¸Å¦ìU§­¸kG³3x&+µxslé,<å <Õ/‰™*!N„—dªö/ô-âp¼".?!Ì-Gáñû‹+ñ„9-æU?9ÁvòÊ+êÕ…Uü06G³ ôžâ]ËD³}rˆ3ˆ™îÙ¸TòŠ:çhĸª6áa÷¸|Šrl«×Oß\1cì°ÚÈNOqGŽ‚X6 £/¯Å‘þ8¸£ü#`F÷á²dþòȽ5ßµþ_„¼ªsä\x˨‰ì3óKz.àÁ*æiâYó†Rm‰4Áè]¨Z®ep6Ò^æœoŒIfÉ–ÕaçSh• Žá¦A¶Ë.º±ò”?õžêÕÜêåk:!Ò xqù ˜­thÀt,Í"š9jõâ$!¿$ Z³}Wó©N¯_Œôß‘î)Æ~Ð…î¿’)Ù“,q $Ïoe âN”ó¨Vœ zÝÜ)ü‰žJ(lNo?“W_¶1æŠ/Ö‡@Ïa —a»L uÕEé=KSÜn½éý: W)wê?cç„Ö{Ù)µ+ö˜#¦B)‹à¬·ªûpÓ×QX1ðÛѰ¶êœ OÞYx5/ä4°ÊÌ ·¥üZI ÿpA‹´Ùcê,þògoÞGA½ŽñU™Ô©²*a$¦ w²¤³VNãô&ÎößDF:{–¯ÏâÚ9ÕL*Дæ'¼}8ÚEu%¶B½&¸Üxá+Ú1w<÷'±Ï¥¾ª®–IØ-ðî"‡œßÝÔm,h6 7Éõ™AÀÁkñßÏ䜯2;à#åy7ªEWdþ nß\_&éÞPáê´ßõï:\¯&ÇáA´¯äލÿ?…—›÷s:&5‡SN`tAHäË!àäÐó ÿøûw5-4y@½EŽc áA-ßL/) ñCÈíá½AØ×g«OdB9•Y×Ižd O[}ayÅãŽËtò‘¡eþÈÜ• \—^Óm8cfÉÇWÃ4¸Rʬ¥ü¼Cˆ¢®)%DJkH]¦URL=’Àm’ñ³HÓœ‡¾E$žZ‘æÃþÂ4*Bb$@}ju&"ò÷@6Žà¨%Bª&‚ô½"¬*g“÷ƒŸÈê™X:¨dj^_JK} âp ýîî8}ÏêŸòçÔà–!k´k{ÃèÏí0½d®u w„’@ Ñ7‰H›Zë“ñ¾¤[¡‡l¹Ê…é˜.¦rvMà– Õ"ËK—q$}ŒŽ¨#Ú›øÕ²ãQ=¿ë1„Û!^æÏV›‘iË\ek®v‹ß‘>TUžLGÍ·Çõ’n}l¦ÚÞ—÷ŒÔ÷‡ÞX Ÿ$:ÒÛàÀ(±ö5»'¹Zæe¶íÓÂxöGg¦Á}ƒ³c¸Ùf™miKº¥3øR)¯¥d¢A¶Ãßwç2èa´Ä@jéwÑœÕJBSÒŸ¨Ò«œuª/'"–Ò÷¬,¾óì½*aiÒì*~2Yìž•NÇ〦?’¾go…Bö õê¥ ~†ÜìHÏÓ›w ¸\2Ê”bÝúY·óÙ¯¡þ˜—–à¿Üã3 ñØŒÒÙÛò|M ?ØŸ¹Þ>œÞ½Ç­‘%ÜELÊ{Òý¦¹]ÛÁxKÇ:¥V0£ûé; #EÚ@4rdŽÚd·é‘&Éi•z*ýò©ô…ù,}?ÍœK‘Œš6Å4Dü}±F…ïöo"B45Y+Y2õs—½nÄ b¼-“ü(ýƒ›ª~G›µÕ¤l¥ñtöò¾¨*²g!‹)åù+`ÿ]Ì[̤M¿ùâ®"±¶"GxT¾~ïJh˺äðúüµäײO]ªó{J&FŸ¿²‘@ÒÄÁÃ`Ó¡.‡àïD³ëædA5 ‹¢ìœ9Z´ø½ ›ÒŒ÷7Sòð ä­í&Íý€ÎÞ$Óòor†ö2|¢ä9'Mw¡Ÿ’È2O¤%6¤©3˜Ýk"ù†ç²C¾>˜ £²âõ~¨íÑË”éW25£ž—&  x¤â´Ÿ".Ž6¢ÝÒáNgŠ”tŽo,Xj-9Åäw7Ãä9õ¾h„%ïuv9 V;wŸ"!å8¦C¡ï¾¤ÀÀ—ºZx–Ï# —µ2ï5ª¯Š%¡¸{¦«‹Rm6¶ð}§í²Û~g0¾sgfÿe½Óðé‘ûl‚«Ê]ƒü(:¸d’…¾ô ?­B1íXnÖÿã—uaJ¦tÛÉÔ™æÄ¼v¤ãíâcñ‡ü8llî²$¸ášžqöXoú±bxŠn ß¡ÔÅM‚Q¼RÊí£K·BÈ %\ýA¬´ÃXé5~h<Œ OìÖu»Ò•Ø&–ëq$ý,ƒºßL•ÝD±«z=­ÁPMÒÒºâÛz躘82[[ÎÓU¥LÐî°U ™ÎÖfD”]n`!^?oMœªwá»'»îë¬ãfÿŽ7¬/^ö>D«¥ìKs²…t´ºÛ8œa‚ç¶ÏîÇBóÉææÊûŽ¥Q[e<{ 8d®7[tåQÑMœþ¼4l‡mCeïkõ-õþ5¡'âK#àË—cÙÇ/;Ư`z ¨ ºWÖ»=È[–v¾—hD¤DÖrJÐçgZÌóÑM'sÌÓc=×úhõã5-Ä07òQÏaÀ¨…O‘(ÔIJ2© ׬äê¹€òÕJ<‰Jæìþýï}ô2Š‚!ëS0µõ×ÒÝåV«ðDµÕÉÙâ(O¦ò„¬)xµc_–& -`ëø}ŒšÙk‹ïÇMäûLã!xšÇ;¢|Ž=6’úäûaÜÍ‚8“?ŸâÓ%¯BØÌ½ç¼Ü‡ïðÕ¥Üþšˆ‡^óÉ—f=‘¿nâPÁÍØìå'r™kxÂ^Œ/šZà.,l¦Ñ,_–ŒôóôLÑݵ$Á0 L¤ Z´çZÛ¼[÷ ŠÎÈ]'Þün/Ì• UûÑ÷¬éNÊŠW———¾y#}sÇŸÃS7ìy¤=„URÕŒwO%&Š‚ñá 5帧’Ú¡?,Ü— ôâpL3nzÔóò’*‘> °§«=¹7#2:ŠÃë´ždÑå AýzÙ¢+"à3ž¤*øÙ8¼8ã†Ïq­±5Íø˜5ëRÞ/xi³ËT[Èïå¬oÖçkFú=ÿê·qµ_éÜø"í³‘°IÀ{¼Sì;8ÂdÅéÚuä"²R|E³ì˜Zî‘ÖÚ“ ·¸A=ýM=ó;—Ǻâ‚â@z. £„‰ÅÁŽáüŒj­pè¬D0k!5Pˆè(Ð/¾tâ½Ò›¨­žášFÔ jj×â™­hèϧ«X˜y³Þ‡á±¬)"¬õ*ÜÙW€$/2  ÊTÛ2ëËE©6F>í¿ÚßVV*_Ô#ÍÓt¶ñÅÄ —:§6Ú ±žqqÆwéF6†8o[„Š&/·’2.YŸ²jÛf8á¸ã{š24èá Ö‰ˆ*¦³ºt êÓö2µ†™ŸçÆ?¸=[Ó/sI‡©4÷' 7P¨jùQ®MÞXü½wuȲ¨Õ%Џ³ ƒÍ÷dx€7r(cÆì‘\PƒÆIÑõze!UXHÚDXËBèG`F3ê^ƒÔÒ2 Ú\55j•Ÿh sF5mÁÁèØÑ0çý®¬Ѻø ÕÀ°Ø²ô¼¶¾6nÖ“ë¤Ê=â“jÏIôÍO%ì=‡A3ë⽞ÙݽҴèÍâ”ÀΕãú½üÉúSží›[qJlpTL‹OjPŸM¼±Ôà ãÑUíQyK€RÓ|Ú;ÜW¦2±ìˆ¡Ÿ¶‚ ªQ•?Z‡~y,©ChꉧñµÛ1 _f.áþJÐú.€Ìû;/ðF#3†´¹†ô9¤˜ÕƒÁ8ºÚz "1dzp0r|«R½´òCjYœ¦rUr-¿(vãS¨X±¼pÞiÁ% É+V¢Çº?­ùGX2±.mSdÚRˆ«M9} ðËøGéà€J†tPÚm¼BA7ä—¨<¥4¯ªìS_¦j›§HtAë—ÝóÉ(èÊõçççÉÜæŠºMÖtšõ•z›ž‚r®b>"r³.HQè†E;ÜZ¢ù«á ž» R¼LÇ“²ð|HÇÔoö=w1Ŧ«õuýÂéFõL?GcÓ7ÖâºÁÃ*YÊØÌl|S¶=µ^Œ/£òÑáfâ¹À÷?V@ö Y×:ü/ ÷œöÊÇî2¯+ã* ŠÊ|­Û ‡×RAy3¶$ãbŒ/+õŽ¡,Y¾Â(ËLþB»@ì¦/êÚîb¸<¾øy¬(2ö”î’b…æÂ¸ç—/±ÏpJ‚!,ÖÐFÑÒ;!«»Ï·ê•û ò&ϸŒ'g6®0h§JÅ3Û B¹¬K?&»hˆqøF¯l#ñõö–د¿^ðå‰YNVÕˆw^x¾UPLðÀmʧÒ7ñW‹ºn¶¦T—˜JoT`(é²Obh:¨2:V­öÒ‰¦+/±gG¹½×á†IÈ^11}©†›ˆÞäýù€ú0·Xi^©^@éŹ[£½IcÊN_´˜JWèJ8»’‰•'ž­Åôé¦.#ïCÜb)ÓœW0;ækóªŽütë úùfVUÃ#ýÍÖ †{wpÆç¡¶k>÷7Š1¿wÖNu0Ÿ‹ÚÎ^V1 7æþi,°f%‰^aLÕhk0ì¯ÿ¡øŒ[Þ…T@NÉR»WÊH…ÙØö>X’É~dÝTV6ybÂ*âÊ'_ ü³H~$×C©€Ñ¸0\F˜•{ÇMܘ|™‰År|®óì+ÑüZv?çºûqgëã ¼KÖó§µ÷‚ËÐ×XDHÁ×ïkuä†ñéUõTÉ ˜P(†­žÕyzó"ð¨ÖÇÁ—]ØP—š’~¬QfˆÃÄ™ê‘}SS“8˜Gû¦éN¼‘ên‰ùá}d?ÜSŒÛò'“)¼¯Ki^:Yº5.€Æߥ6„L=˜±w-5hkï/îvØrU˜¾çs^v!üòÙô@¶cèXeæÌø$ÔÎ ¢!*„ñÇk1a+¯¬-)Oÿ2Ħï¤×´ tnáFo}UEXx,÷*ui¿'nŒjä¤J™6ôMëç¦o)^q¡=—¿fò¡êcÇ{…*n´˜J;}x0,*ômµi`UìÊ`®…ät{aðO$¥A—Ôù”•­–ºv31§éÚUE•Çmp¿¯ú+Þ‚Í÷§#R´¾6†ïÀ†ÓÉݺÇÑfŽ*,ãíÌÝhTZíŠÜ-_e>Å©e.>eöEö!ûè²àb9÷…gÀµuYõL…cÕ††¶ÕþÓ¸mäÝ"Ã5Qêt­0á{P}¢>67"ä3øF0*c|\kYWüOºàáÜSŠê†‡fùhÄÛ£¥%þOú#0‹ %c\“wx=þýӘ鮞u"¨E6Ηzóß^Ùó£?Qž„ ÝÃsÅ"„o¼?üh£þäp–ÃØåWÿþ¾—¬=Åä\^°ixø›ÃöêJu\–7k ¨šÌXâ0NiœXЪ!™—LŠèå5UÖ®¾zé„pmð%š—ƒäàêصp†wm ̺®êçN «¤b[ƒ˜çÌPÁïrMòÕSÃ+ 6Y¬êÃdŽ5£ûžçÍx_M·o‹ñT¼¥J¿¿Wï½mý‘ªS…-ßÉò¶)\×góz‚º¬TifteÍíaÎîtañ&PŒM¹š 9x”$HÍÓ5L$xA1ñ£Jï—¦ U‘(Á¢\Ü#»¸ó [z7MjõçcÿLÁÆ,»“§;i@Ì¥ ;Ö÷¥ÿƒ#ÌmæK˲úyŸ”³fÓ;íüözúDÙúÙ…|zÞ©<—mÞG3RBWG:Ì=É.¦:§—§åaÝ~ÿ¡¤lI dêz3'RÚŸ¨T{ ôg—ÄxSFlƒ¡”ÇO€±féUÉR$ ëj|d.bTªšÄÑóTàˆé°ÚPês/˺eT °#“Qýi¼H¦ðú2˜‚1x_›”F­D–²$^ŒÝpÞGÓß«vB ‡ªXÌfÄ\„¾Úaä²5QF{r$傾]¤#a\”2wF$ê”-·[L˜ßÞ­¢l%VýúøB}"Õn&o¿ *Ë›Vjœm À„¿Hz¼P'£[Ýâ›mÞÁÖÀ/D›½£KgZÊó‹…òc^( ‡5_¶sŽìSg}õ½i´¦Á4S×󆺣ŽÛ^íÃCA¬ãM$~"1Šîd’›¶Žò¸Ò\ǾlKb"îvŽ…<:©þyš³I9/àŸagE´ ƒmIL7˜{séçÌE.ÕÓ8è³S³|I¶`öÛLbžš#±èÐz¾¿ê¦Ò`³Ž.C ^S#ËÚ<ã—„·€ZqûRT®ÐoÛzZà†OoF ªãZóü·Œ2‰Ú¤ÝpLë9N?ý#Ý][ Ÿ»$ÕÚQ$&Ñp,.À™=‡I 9Ósì\J²¥…_ldÞqzÔåDÓrç AîriÓK‹>Y0Z.¶ƒÈò@0´äp‰›1±neè%–V£fa}{—µÁòü/*©R2)ÎYŸTïLiXõ¬‚â…QÕýLs2ó y—ÖSvÑ ì¤·ÒœzÎQÃîŠp@¬‹ÍgS_AŽbhamMÇeQêZÛcmRoDÖëVbRnç¨ ÀˆrDaùßvVHJ&ó(’Q;#{úí¥ÝÜ…ÑH%÷ÚG4{§]S^|ÃÊØhµ?¸Ä^> stream xÚw4\]Û6Ñ‚D¯ÑF”eFï½E] 3Æ £w¢·Ñ;ÑE'z z¢†D ¢¾Ižö>ïÿ¯õ}ë¬5g_wÛûºË^gؘµõxä H+¨2áÊÃÇ (hʉ@ ^ˆŸ€Mæ ‡þ)&`{E¹Àñÿ0P@AÁ®h™"Øm§‰DÔÜà>Ÿ°8Ÿˆ8àÄþ2D¢ÄŠ`w É PC" .l H'/ÌÖνÍ_K‡5'€OLL„û·;@Ί‚YƒM°«Ô½£5ÐCZà®^ÿ Á!içêê$zxxð‚]x‘([iNn€ÌÕ  u¢Ü¡À/Â-°#ôf¼l};˜Ër=¤« p˜5á‚öpC@ (zs€žªà±ñ‡±ÆÜ€?sàãåû;ÜŸÞ¿Á¿ÁÖÖHG'0 †°ØÀàPÀce ^WOWnùe†» Ñþ`w0 ¶Bü>9 ,§£ þIÏÅsruáuÁQþ ƒÎ²¢€tt„"\]~O†‚Z£Óîü£²¤ÂçO`C@l~‘€¸9 0g7¨ªâŸ&hÁ?2[¨+@‰‹ Î¨§µðWx}/'èo%ß/1šŸÒ `ƒ&õƒÙ@Ñ/°;àŠrƒúùü§â߈€Y»¬ ¶0Á?ÑÑb¨Í]|Ì` B÷ôëù{eŽn/÷úÇüw}J†54¸þ`ü·N^é ðáðð ||bBôÂïßaþNÀ_äKµÁ°?ú'¢* ûƒ:yñpÿ³-8þNÀ¿wÐB¢{ àø§õÍ@B kôßÿy~»üÿúþW”ÿ­õÿû@Ênpøo5Çoýÿ£;Âà^ [ÙÍ=šHôp þÛÔúÇ(Ë#áÿÖ©º‚ÑÃ!‡°…ÿD˜‹2Ì ц¹ZÛýÑAÕC@µ‘.°_W €‡ú/zܬÐ׉ ºR¿UPô4ý{K%„5òkìø…„` ìE€.< |øÐó zþnltE»Ðäü6HÁ¯z €r¿D¿‘˜þ‰€Vÿ 1ÐúoÄÇ'¢þ¢ã¸ü]ÃÖÚ …BñïnBSù ÿ¾1 PO¨5ÁÜ ÒZ"ÄþMÈÛ³j9:ž/£R“l_ S9y|æPmnDx/9«2ž-¡Nä^¾ë&YXSâ8–ýÄôÓg»¹/¼%Q§õÒ÷êé Ýñ/­³cTý ¶åjûðéyôe7|:û> rÀjÆìPcËqv%ÒÎ#?óèUñ¬í+›ù¢³Q%¬NxU:ÁkcT<Å–k•9Msו‡áöC²}Oâ©ã“I²ì7Lj/¸üvb }L–ùŸŸO{/–ëó»tÒ²ÒšÐ0`“ ³ûÈMV£þèSR§]dÃ`1Ó(ÝF v¬a,}ÿaå=Í·§A ¥ÄkãaqÖ:«lòï¾Áõ²ÛiÈrjEŠ'~ò=Í'pÑißüIå]¼'$]U(Cõj^‡tã@"NTù½_+…N¦/z·ßÊ&ž´¶"Á’°ÐÌUÒ½qK0—©™Ðø3gò`ey錙Z¼W…µŸøÈo:-$ê˜?ÑaΖ¬Ëg.²'ÖÏeÿ4cð#éâf€¢³•¥‘݀Ɇ‡AÅÂÝÍmC²9aV»'l®ÕƒödK«Â UtþuvÔ×ç’±ÙB9Â>÷—|+ÄÊáEÞÿ¨ü1…†10F2Oj¥¥H$+ƒqaI=;PB2 !—f»jæ¬õóÜSã=*¼NùiB¯ô™Ö8zMÿÄ¢_JÍ>«fÄòåa3á0'q<¯±Œ>—¼wü°…[CþÉïháTÀRWÆHv{¾7U¯1ö§:/“äNxy;·w‚aÂBca»÷ý"º„¾Òsù°Gƒ¼(æ‹"UÃÙj Rÿ™SE^:ýRí,éÜOêH­èMïzÂ$‡R…À–yEÕ/oôÇ ] z"Å'Þó…ØaeE¾Å ¸VRT^ö‘I'i»`ÕÒ}©½} -ve˜pòªî>PŸ#ElíDàXŽ ~ÔI %ä½ónã«å"S(‘ÒÎ]¹Åùu:FfƒD¤·érëÜ=P"Õ¡UÏÕÏmíË™#Ò‡ýi½:wo ÖRR‡’ÍÁ³·&r4Å"ÍÂá¦YgM»µ&DœnýIúf ‡:hÐYÀW+Õ9‰) 5>ÉªÚ ù‹LÄÙ æ—Õ ‹)‡S[qúƒU=E ¹ò‰Ûbwí"ö°e‹°H“È(¨­†Ô ‚(„½=ð“Ÿ/öÓÛ';©É2û@Yæ”=0\d[P+©¸ªÉzNÆÈ#“¾õåëBÄÙv™üçB”ªÞSÞ#’¤7lÉ?÷í[š$]ÖV(Ä8÷Leº÷˜T>O‰%HàN× j0y †õ‚éœAA>Ùþµ÷Ƙ-j»}aëK1ûð'©ž KuOB´"ËÎä~¿eÙV`€Ytã°¨q>.òIª¬ÒÿIë=£úü!K‚,wb½›g¢tÉ4•žrWXø÷8—™1­0&Õ ™öÁÙE•ü*%,·ƒIL>•q2¼ª%nL|dBú½•hHØ¡zg¬GBÀƒÀî4¶‰ÏèÒ²´à~ÊȘõ–iŠVáUV‡ÿf³œHLÃê¼Sãud®±•:}lNM(ûèù$©‹J5mCÂ8@1]Ðm‡G<ËiîìãÛ'|Ÿ¼Ø¯)%‡´¾«N)aó"[‘_Û>³Ä½hШçcÿ6ñƒï@i_¶–S¿ÊR~é̆­‘}ò¡8Ü‚¢ãÜca–äÄN^Ü_D“ÈsØAS‰‘Ï_í8uÃñI|Í Tï´mR_r¨$HTjÉ8¤Ýÿêë= ×¶C¥ƒr¾qd ¤|ö¨SF¹hTh8޲Š0dyÚeHħôHJú@i\9í-‹.d°qióz£O‹»H©ßÛFƒS`ˆÒÓ–:Žÿ‹'Sµ’1ù'¶f-£ô¬¤7r{g¹Í²†::_Éîv¶Ýܰ¢îBDnE9æy`ª suðÖÒͧz÷Š~ä¼\#]®¦ÉãF4Š=±*º •OøÌ)(z’óÁûù{iÕìGŠaÑÕl#ܹp åæƒ¡–Ø¥"¢(ìçG¶l2ùAŸoMzË8CdÊW²xØùž¨×Á éÒ‚Õ·8Æ÷ƒ¨v&¯…¢qœº"¸7pÕÞ,G-¢„-£’w§Ò¦»F!c6§ñb¯È, ŸÌI”¿–ݺ……eδ²0í(Y7ÜÎÀ02t_±òE [ÅQ}7NQ?,®,›Ç'–’òU«çC¯ W2I9I=žà/Lc›OC¬u×kTõõLTò¿°{!P‘Œ®–߯>¦[¢y-~þDô„9|êuùœ‡™"-n”jb¾¦ž&Å»58!¡ß_Úº6Çhôj—ìȱ‹£Óž*|a¾‹Aúq¼¹Lˆþ<™7¡C9Ö¿CÛÜ¢1JD©sé.ðY<˜ÿVùÖ"*õ‘^4‘%s‚^ã„P_£jVú} f‹ž» HBŠrÎ&0®hå߃|¢ÎŒ¹s€ cWx€‹O/¹ÿZ%‹`ô 0±¯Cºå°ú~åüiSúŠ©ýv!·’Ñi}/øë-÷ÚÝ„ÄÊØ5¼p¹\»¤ëþ§W«tƒ¥quºp[Ì¡ã[v±iÔàÉþøòšŽ¶·06r|ê«ÎüfGË ÝÑ3Å­ÉpòÇ‚íá¤F¯ïÆÕG‘Êö R¬ÖZ÷,Ú)|Ï.â\W¶öUJáéÀúy¶&Trç±Ü=NÝHÀS†¼d-º2deŸ%)=ØØ%ï›ÃÇ%ä²c{còÁ˜ëÅš¡ÄÇk Ú}··£ûéG_H2†±&úmU‰=Å^ß§Cy¼ë£¶#/Ó¥©Š¢Êk\òW·‹ËÔݲÚílYq‰Ñ̦˜Ixî0£1¶ûµÿ8º#5{}ŸŠ©ŸŒmÎý±óœ>W2%öV‹;IbÆuÜêÔ¹vDíh6në1Wœ6™#–Ûž×ö4Y4–µ|ÂáÄï}]USJ{ŠEáv¨& ¡Ýš(£SMn|Ö¡Áíû伆8·žˆÓ å d¬…?¶&Œ¿ÍB“ž°Hʶ¸a±ƒT~ñâÆ“\)½øãÒ±œpˆq0¸ú•ä2‘°‡—]Š)k«M÷¾Û›Â,çà“ ¶§3 ˆ(B³™¾ÁÒ+§Œe–R÷3ÍÌêéRíÄ'~âù»Ô}¶÷îн~i¯;gÂí™ÑÐ;†UÕŽ‘äP>²üÜå7`ر „l5* fR\SGµ‡Oèè;{BkÛlFî¯Ó–=@hÄ(@qÕ„ÄØ½¢æC Ôéï¯_×ÓM]¶ª¶ €Ì²›–îYh—´ —Q©/Ç]O©@~ÔÊò•¼Ê™¹Ê%ÿSo6b ¡LBqãâ²§ÌüáŒyB2¤ßÈ#¢¦Wãx aï@;lÈšœ¸J¥×R Këϰר ê·³$5ý‚"ØîH¼ Y)8fGAëë¤ã93ˆÊ·6 ùÀÛ«ú¯Æƒº¦\·E˜ Ÿ!êTâx4Nˆâ”âiÆÖ(?À»¾^·æyVÉk­2tý¸ä³`‰#MôF;í%'ëÕ·lió¥¯>o«ðÏžª©™úæW'RÛ+Ut\MŸjT‡xöyË·6âŽvKÚס†Þ—o£P%&sAõå7]Ž}2ž:½ÞÑZߊI§•$ Ó-eŽs ^½F±›É¼¨v?´îËWVësä†ß2W:ÈH‘éî›GHfuò¯­Á^dÝûô.¸ø@f[Ý=*Ž_òR.Q#¢ÃS[ò`=ذ۴\®ßÕBî$y|SÂÈ•Yde¬„4pŸz}ǸšÉáPPa‹Ub !ÕV¼¦œ¢Ž¸w"y÷“+þ§ÝÆJ• ¤ýäBø*ÞTÖ°Xз+Å›*;,ᾤvàÄNV q߬oÅJ\ ‡×§\«I2‡‰#ÿž}zýTÊîªæÚ{ªï˜Q‡èOòhŸðúû{FƒêË|Õ¶É /äút5^ñ“LŠü•Ø •æz„ñÚ$*·£{\Þ+Ü1û(ÂLÕÆkzÔÚ´qº\2¼É™3¾-½kè0šg«á²|—h“ÉôàÁØï±´½­ŽMôø¥G|˜ ²Í8ì:Þ›ZÔv({Y”Ÿ/õ(ø(‚Ääìĸô–±ú›a„eãRÁ5\{Õ÷‡|;éŒLËm:>(ß]×¥ŠÝÖ–ö™A?Í·J&vÎ$ö,;äGzç²OÉ„Ù//B{ïûÜ=§Ì&äºÉØ K"Úö_XµÇH>,Jì·ÛrÝÒV8Ñ_BrixFª&%ÈžÓ_c04ÍãD_Œ.!ÃÏi²o…6ñâe‡ƒYv—„¯Rç™ÓYÃižNœÏ§Í^ZîÞ ZA] ‘døÄ»Lù˜§àö.äÝÏÏ’;qœ| Åö7o€Ñmä¤g¬0!=é$Ú‚{ó΋Z8S{C²_µ¦Ó»§ùäM%Tie†’ÕϾϽ,= õ&˜UŒki“r[wf‚gUâüÜR‰#w,ïºCI@f2VCþU½æ,‡Ø2Up¢ÖpNã.„ÓË$?€Òoæ8<#ž³ÓÍ8äš³'h€Œ¼{^p½µ"90ùŠzúISZý «:Ø¥á‹sýjaÂ?ª4rUôˆkËÌ4.üç笺vnmt1W/›LSdزäÖ§Ýþa„¡Ïà¹Áãâ` ·z§Þå[‚ÝQ¦E°±¾ï~¤ -õ ¦oi3€}šÚvA&t*7 g-ÊÃ\K»7J¤é¢KxÅ´phN^yÃßmZ—‚R[w²±Zö(ƒöM¥߇•˜‹ïl(w&ˆÞשÑLx@ãÌ€IÕµ”\䢄&¿¨Sa±ë¡ÑšóÛ¬e¤]¤enú¦•P`šbR =ú ïËZˆÝ¼JoŒ”¢ÏÐæFŸÊ†YzëãWÔæâ)»ƒZÃ4ñdìâ(z·ê²*ÆÑÍù"xb½ò!Mù¡Ì©— † œ8ÕÚÎÖZ$Õ“W¶Èø‘­Üªo«\”JËýºS"ð}87˪`•äãvÎO^Ü£$ÓRØÃA‰v%­˜Žµ© Ý!"éyì}뜖=ž(ÿz’zÞæb×áé—ReR{‚VüŽÀ’5·Ú´[ÒÙxdþoV-Æ)X9»¾+Ð. ¦äå6ZÞh öÉÑýA½ÑwÅœÎRÇ’!ç=f’º›R‘Çb£[«r /ˆät œǺT`¡S{Þ¦š±Óßš½®ájt7úéc&ÌÙÃÙrR7:°QŠ9½Ô‹&ë`ª|?V'¾ŒcWãy^m`jÌH¶Þ§Ö÷°EP_ã‹´ýQÖ¿/V[xÜî!Í,­ ¸&ãÈÜæuf š]Šl‹T÷m"=Òåc>–îe¼¬ÇdßHØÅÃohT?/r(ÿ¼üÖÿÊ.{y(´?S¡:½¾ö™àƒälWÄrOÄùeø j”Ê>n"¡§Û£éÌtøš~ÛN:Zò–ÅÎf¯Ø\ΆB¨3:–!nxŽË˜NÃ^瘮•FNðñ“ðQ™vÔ+6ä¼<ÏwãIm{@6u8Uöp¿–²”ó=£ÀÂ×pñ•>EÐÓžmÞjAŒ7Äáe3]9Òî$q{Ë3‚¦àÙ¢&VB¼¶™ œþ¨]¸&§T§×HÅ!•v…íÄfŠ.iá‡ÙW÷×$­øX|Ft eNݬî³&ÖŸTiušd´‹%ýP x°~­Ý¸£ÜugàôÅ.y× åÝ÷n÷‘‡Ž%Ñ^i/£žY­¦‘®Äù«Ó”F˾ŒÅLNŒö˜¹ÁÄ¢æÉ+Æ|D²ÿÌÒ; —¼¹úÇ0|½ÏC'jRè»$Ù„VûNy÷Þ .rxŠ.;ý 錰é¡QÔÙÛE¹YÞ%‰j.¿ˆŠÌ÷§_®¿(Ý•ÙÐT¾ð[Þ*ùž« G+^Ã60äB&ÀQ˜Ùáî uT‚ï ’s üýî0 «ef¯T:šºlì •—ƒÜW1„ܾ<…Ypn¨QbTØ<’Þæïž_é»ÈµBÝŒg½ÌÌÆ±*s‰y ï$¬f.ôð-ßT„4=ß´{Ýóc‡?[<ûç§,›–[ßÂqŒ÷Í0[þÅs;Æo#·#õ¦|y²{è¤ß¸)4{ÓUhŽaAllT\$:0lן¥=cœ?³§_ø1 Òf ;`ãÉ.n:"åiJ©ð…ƒ ßq©‹6®¯¦Þ'ûÈéF\³ãpöÒFy;ñmûBù¸*7HÚ—±$yµ/_f žõ¦P!º\œe°/¹¨MOq¦No§§DÊÂò2îòÁs\¯Éù~ËU½_þYK'xdq<õº¹£h˜ g”2[йÂS=–·ú)‰ŽíöèÎ3^ÇSÀd½›õ¢cœ0wéòn ¹7¡Âm#Ònø´Rî•«Q$™ùÁ{Œå)áYÁ“ÏùEYb£,ª¤`Õynó76$µt¸³e »·¬*(‰—F"ƒ'’^ºØª> stream xÚ¶TÓÿ>N—Ò­ÄéÚèîénaŒ#6#GwƒHˆHI* Ò)  Ò‚”ôýô÷ÿ?ç÷;;g{¿îóÜ{ßÏ×;‹ž!¿¢=ª†€£øA@)€²¶ª…€@!"vv#Êú—ˆÝŠô„!àRÿb(#¡`ÔMŒº!j#à€^®0$&—B@ ä_DR  ö†Ù´p¨'»2ÂÝ stBÝäùëÀá€$%Åù~»Ý H hƒQNP·›Œ°+ÀAQ~ÿ Á%ã„B¹K úøø€Ý<HG9n>€ å0€zB‘ÞP{À/ɰôOiDì#'˜ç€!ÂåFB7W ÷¼qñ‚ÛC‘€›ìC -€®;þYëàÏâ@ ¿Ãýéý+ þÛ ÜÜÁp?Üàs…tÕ´P¾(>nÿ‹võDÜøƒ½Á0W°Ý á÷«ƒjŠúðÂ?õyB0w”§€'Ìõ—FÁ_anʬ ·WF¸¹Aá(O¢_ï§CB!7u÷ü³¹.p„ý×É·wø%ÃÞË]Ðóð‚j¨üɹ1ýcs„¢¢@I!q11Ôõ…8 þJ`äçý ‚~™o4¢Ýî‡Ð@˜ôæ‡í ö†PH/h úßÀOD ÀAì Ž08Ñ?ÑoÌP‡?Î7ýGÂ|–À›ñ€¿>?YßL˜=îê÷ýw‹•ÕLLŒxÿ”ü7¨¤„ð ù…DüB’b@HDT ..üo ¿Kð—üßV=0ìÏ×ûWH ¸ ù‡Š›òý¥ÄûÏÑàúso¸ÿÍ ƒ¸h(€ëŸù·Š!7_ ÿç-øíòÿ7ü¿¢ü_çÿßHÍËÕõ7ÎõáÿƒƒÝ`®~2nÚ u³Úˆ›ÿ/ÕúÇFkCía^nÿ‹j À7K¢wtý»0O5˜/Ô^†‚8ý1Gõá&¼+ ÕCxÂ~Ý9~ø?ØÍÚA\nîÏ›ný† 7[õß”ªpÂþ×ú ‰ŠÀH$Øè¦ù7'Qt³§öPßßã €#P7.€y’èWOA÷›Ëî u@ÙÁ¿í ‰ÿÿ b"ÿFPÛEþírÿ'ÒŸæß£ðŸ’ÿƒü+‡è %ùÏ¿²HÜd÷ôrsû}}ÛÃ<Ý]Á~¿ÁÿT â…¼ñEýžè›Rþuþ}sA¡¾PÑì4"á\Ñú³Fñ®ÿê¨ìöUÓ'ÜüèYd›× ~:wõ³°/ÈcÅôÁn²¹eU®#…OÌ—è­æüè–ÇúoÎ.lŒ¯¾!š£é_´¥XßÇHÈÀo¤°pé`ê‚ÝŒÙñ€=ßÃK‚Dï9åOŸ^ußú¾—ŸßEM¯ê¯U‹iÞºx9ÁŸhœ`Z:É^`—3EÇŠ‡âg$à¡Øó%<:þ@‘÷þšùÁ#^¢ÀíDáb´Å¢PÒé”ÿ|…‘g'ý=z :Fì#Šwãh¥õŒ´ÑeÅ …“,Iî×êò–ÇF¡(¯gœ¢4º·õ #–UJƒJéÛJ`Úñ;Ážºth៼­»GÊÚöšø ØQVæFh6ï b·A@+žª¨x‹zЗ‚Û¼a–}Å‘OÅ„ûrh¤8¼t ¬•V@Éo^yŸwsQ|Á€¡A¢¦+ˆëbÁ­ŒUâúØ¿<‹G¼ØÌËÛçi/qBélÔOGŽéø ã‹]*^•JSÅâ¾Å/“õL;Œ+Sz9¾Ò…ìÖÈr…¢ELüë¤<òuüôªÅÕ ‡³"[3§hï45íÃç?ƒ~}ÅšTñ 7uÓç©wÅ×Éè+jPãÖUï–Æm·f.w]p’¨¦6úDAÔ*¹‰1 tý–æw×å‡\;ߥ©'|–dL/uÍæÈËhÜCÌŸ"ð>Óø |\RxŒ É|Á©A=¾“vÖAñÜïUhm÷‚­—F!¹bú8¾#b›ÿž±šÌÆ~AÇ­¥W]%DóÚ®Ôf›Î:nÂ7yvBÉÞæl9I}¿n²Þ$R;ÕÙN¢xD7x&ud¡´ú”ëç:l©Øákh£¥¡zwWÈOY¢ï‰‹þãíkœCÌΊr$VjxÓ‡Ãþ'÷#_ÔøÝË|~‰{»á`­¯óˆ„p6þÑçÝ%¹p¹;km¤’':ãϼù?ýð.\ä¾02*Táa|£¡˜×äÁPóµì³ïG¹“cF/’À¶”*Ž ©Ñ-YWë)¦í¬q„Ô«W Ñ›Eªã+aŸKw,“f¼¿<&ްÌ$]U5‘~»o°‘(FÂÚ/ÆÕ÷¢^ó®¼2ˈœ´£wûÔmupówBI¸þ æùN™0Úµ½¨.Jf™O˜1‰Ùwx£¸§ôú‡£©„8^ÔÚ3ex¸A.¾°-k8Õ5­÷¬ªC5Îùc ëqsgoG0ÃW¾½ @C˜cü¼E€UçÝ[ÖÞºÑòûóñïc‡tØ4v«81­$ç|Ï{"õª°Ý“®p[l7Û`•Û8\+BÃ:¸ô˜þÅÏT'(¶=²”|:t˜üA\ç3w?ꈻèa¹ª×ùTmKÒ/€‰¶×[Fe–í[w‡ýç7Ðùs·dÊÓBUæ¯Ê}E¸Å}L•X§«—´§ÞÃðJ£]G#%ÇÙ‡-ºTE¦·"ÉÚ…5ç¿ÕüöÖgCåîŸê4G¦|LÿIQQÂ|âQš1ž~Î›Ü |,³tRjÝôÎ;·jÚ ßâd·8ðvv5ó¹l›©‰“9)‡Áº’E(øó\ë:ç–RŒq°6Ù.1ߥÈ&œîÓ‹ñe‚š+š<ÚÎwF–¶8;bèAýÔKÂh’=mÍù”›ãs›Ù^uð¼Q‡"¶æPÜТL ½RT@l?½Ú†'ôà8£jEî nð vT³Bˆ/ÀϪňè󎦘æøTÉCóÏÂx‡Þ°WØ(¶ˆsqߊ:ô¥ÖËJ»ðèîѿܣt—¢­",´õØ™ôûË;°Ñ-lÇß úª­ÉÒ!ZÃå¹Iç 3¤ $xsßgÁbKα¡´wä>^1>ˆY'^’eUZâ–§/YR!ï+86ù“¹TÂÀW{e{.ÊŒøT–¡yUs¾ô 󜲾Q]¦Á÷¼¸ "ò$)£ ¾¬ð‰>ML,¬×-j 1Ù¬Š‰„eO>ˆÒZ¤ûpÆžšNžò›‚¥†AÁ*ET5²œ»êùžCjI ŸöŒ„æ.Yó«¬ düxò ‚â°ÉPî»—»œ£a­2ó¤¿ü%çóäˆG£ßUÔ£ ñzõïM„¸cÞ}9Ñ/&sýígMþ«ÊF‡ãT.ˆj‘1‰#È+qPº$7gžÓ†uÇìoÕû±ÍšÊã‰ÈöØö.)Úr3rí®¹m’‚0.ŠÒ ^oBïú!¤Œ÷¥í}È£o*Ög¼cØ,kŽËIØŒ®dtÒì.ë£ÍÄla O½·Y Ã^³Ö~Ñ£˜*6¥ƒŽ|ËÞ’nH§r^g+½&§±ÕZ¿VØ¿êØÄò¬@Ù¶>Óóá06àHçJç%…Î÷Ë`4Þ›þqÏ œ‡KÓ%»Íùx1Ö¡\a);Ë{ækEÜ•Åeµó-¥:ëðbª=¿×°#SážsBQtLÂÛ{¬”Òw7>š_X—'Ùæ³À@û苺Z‹ˆ8iÀFE„‰!ŸwµØ\ßW°Û½€evªY¹ñ‰¯;ÜFÁÊß2&]X  3S-#êx Œ?ò%M‹Å¬ÈÜeé!°MðUéßëÅDH©N£>3¡µ#ÄØ¤¢3£ªžZû|[È=ÊVV|™›Îél] {~®)ƒ{ȸ«ªØ#[T;*5¬­; îŸà51´\.±ã›gtÏò4ÇÑ¥ŽˆIfZÄÕX½i ¨¶ez/OEòÞW[î33ŠâîcdŽeš\á_ÆÖõ®Åî#ïRð ~& °na»Æü8þöôÓ7( ñ…p¸ÐPÆã‘$€²Prh¹³§ß´”;Ôý¼†}¢Â &Àê¶L“G‡}/h‹‘¤m3Áa7›ë€”aXAb…Ý» v0Hy<Ð{V÷‰(¯ ·C@t‹9éuó!rÌÕt+„¦µÅH{)Rsž[/?Q‡özq`g Ûén^¿Fæ›+¬áûº_ýcÚY‚{×HÊ/2 (úì8˜&¸'ç=žPžÌe}F*tàóÓ°‘Ød•Èqâ‹©V­ñ?ÑÕtña«œHÕÜ/˜Iv5'V˸o¼K cxûèN\'½Tº:•ùòáeDËõzLÿŒX´©†!Èr¥·‰ÐŒµŒ<ÂèÓuã™”}ÇëZh³vnØÇê¡jo-£[%ôéVä+!)ô~‚s›&ÓS È× Ñ@–õ,#š–æzFBÕÔ—IS·LܳR¶FÝùW—†óÓ£ï®ÐªF7L&TJ¦LÑÔê—“˜(ùŸ³¦ÕšÎ¹ÚµÞ.Ê£p0 —È’ 7I§6Ò¶’6¶éZÕÊ îÛ¾ål˜td|Þ‹ÄÛ}?ÁSð³£Õ™ð©cÚíPé</—ŸÃ"宓… ÆmŒ=ûÐæŒàëÎÚ›Û^…9ö|<õ>•9p;î*D‡a©ëjú¥…¬¬u6>¸—v4‘ÊÇl0å²Ýt¥Úm•]u]ìaõ~aœ9,-µúÝRßàÃªä ƒ †}{Ô©Ogúõ7˜å4ýWq^Ûe-›ýûOÃòâa…5J™›ß'Ã|Z½¼ÞÊ¡úT¬Å[®·÷ì—¶ÑO+ &è—MQÔ?µÝ)£òaŸB¹( Nx­øh‰Ý-¬%^uôV8é:ãþŒ¤!ˆ<µ:y2¢äñ!yâO“CÒ?ä ƒ66~øpÿ£|JßEaºq:A•ûÆ;Õ0Òõ•j —àÇU‹G™é7´+Ÿ•6[N-¶¬:°”¨™Ê#EÂrMQ¤ôª…ùÔö)û|^vÇaÍÂ_¹žKã ݦc•ïÛ$²¶µ©¥ya Ã—Ðc´Ú=ôyòŒ;”!\’]2Ÿœö Û>ÂP,x’Þ,Q>0*w9WkмìÁû‡~  Ó¡ufÀ—Ú¸îÎÅ´ŽÞ­|‡OMÐ~å cÜ$#ë}ñ;òÝηŸ™†g­¹é6¸Úq©™KŒ¨“Ÿ}©Ý©è#†’`ÔY—ÉÔÖ¥RÙ) ß )2c Æ:È% :µ û Ä2ç¿u¤õôQêÞ¯‚*.Eã ޲‘I9ï®5ˆß*îk$e0_é{hà͈lØÇm Õù9m2¡1>ëj,ñ}˜£§¸1:uý%¨bíg®f3®*Õðú‘­Eø¢º-“Qº£ðöý.‘¥œœãPMbÛ—s¡.9¼¯Êè—ÈÈ–šÅç‹oîëèáyPĦ?pÙÞÙX,DŸ²&|ÃÒ!ØÇŸðýÓŒÀÆþ.öáâ³:ÂòØÒ»ö‘€FŽa+oÊ€$µó¨qƒ–=oLãc¯´ÖáâÞ 7ý‚Z¦Oõ}íQ»1îMs¡¥^¹*?!ûXYœ×á£ôoŒIÓ÷q  ;[3?š1$¢xdxäWÖXŽ’S¶ýò¬õœ’hu¦ÇÊÇA”ïgüP­Öè±Â“Û/fXŒ}Ç~‘B œeeG‹U<Öj5K¾¤räzInœãŒxdªÈH}4VÇ“/iÙµ ·î_G@V®pÙ?ùZ—Œ•Æ©ªìêž½GÛ¶ Þizbà•GüÙâ“ÔTb룤ö㇡§ðþd$,Ã‚È ã„¬©’]î>'ÝW©ÚøÚö½#dÍk©ÁWÓ··@"G ‚f籯<Á5t@Ö]Åò­ŠÆ#(2k©)Õ5 [I‡4.™'‘3>_cþ-é'ïß'¿ qšÍÍ`9‹`†Q™ã|KˆÔM kû|)¢8š ô mÅÍḚ̈j:Ëàjñ›b¡I¾,yøuv ›K«´éHTxÖÙ;ÚÿÐ)n‚ajCrãUZUÜZæ]ñiJ‹#eóc<ÌÕÄúæwº]‹/¥øX^¥^SE*ßãùäd©ÚÍŽ)’¸®uØÎÆ[ä÷8CŒuLÎÀ€Ÿ\ŠmÐL‹½Ã<—úyÊ J¬}y%ŸåÞEEUU´Ús£Íü¢ÐÇa3HØXmG›T=Br :Ý ½Q¹wÝêÄî-yĉ¢ÁŸ7fR¢*n(ÖïKç?S»vï›,þ<É'a¿º•Ùt¼¥Öü^-/ôÉãN~ý"UÓÖ1Õ:ÿqQÏ\6#<™0b>®¢VêüÞ| o8’g£Ò4-87û7d¡Êخ㙕µj™·'~@¼– ¢®(I·ªhò 6 –ç›>Â%ëZ:¥¶ï9“ðÁ'ȹ³gÂú¬†]“à!L4²G²K9àÄšñÁ·,Z‘w”s_\Ï#å´'o£ÓBãGˆz+ïLª3C×cWYL8¡l?¨¿(°€©µ™£ì~¨Ö÷+»²±&ðå«­KvæEÚ¶¢O4‹܆2(l}éðÎP†=ò°Âq^®-Ù@™jÓµÕh¾”î—¨î/Q|vÛs›Ãã áQÖ’d⌫`‡U »„¦b܃ÑqRõÈ&¨²ñô™š˜ÜnË×XÔÓ—Ø¢ 9\¾Ä–›\ †Ýž¡³s#ì&/rƒ¯>jг­3ŽŒs Dצç0F½Ï}\¬¡ñ®YcaÁ;Œ§óŒ},Uæ™™þÙӬ×áj_\ F²š¦FWù*ŸÚº,±Ç?Ñð²_À­® >E{ÑÙÓ/àH¡æä_Õl›—&šš¹Òèn$“TYw¡ËœSˆ:k2ÓclbÝÒV7e-t³¸¾ó¾¼´ÝºOHÔ"JôôÙ8S´¸½Á[¬Žérk“Ï †©ÉˆígBÏÉÇT¸FM-{©PêD¦€4®Fâmÿü<ÍŸ8ÕÓ‰ë]ä/…-Xâå“´J㿘~“¨•JW…ù<.¬@:ê×3jÒæÂ¶Gæ´È!¡oTÁÒË5·e3†qH²p^ÍMƒùlëS°b{ÉŸDIYm7u¿¤\˾3‰•ß/ë<ÊÿƒsCEÌÑNÖ•þí¹.áϿt²ŒæN‰ÙC¢± ’¯Éæ÷O˜ÊY®â®ú½ÔÞo¿\îÆ< ­ ¶déã¾¥‘ø^)™K‘Ã. ­äÙ)°;·`ÝÓ¾Ÿ³à'DÖ:µ[Zù¾kN`úÔ=¥½éóø½àãÞî'BŒ0~ò¾r×všj¼÷@àhc?8øQÂî+±AŠÑÍcBšõñ@STùêUi¢¸Ûáñl€±JÜBVhÉD,ȳüp·1;Vl½lôJÊåÞ^Nô¿”V^T´U X Ÿd'”ÎUœZ»o¥¥ìýMc=É%j7\À·};aMwDž§<íÀ©ÅùM‹Û#žc»íÛÂ!„/¥ >q¾…a¹æß•ï‚лP,é‰eµKØ2_¿êc°ç¾}}Z°b;3öf ÏD^ÀP{¯‰9š£l-­F òTÆ1jóÁÔ×J:äÏäñ k§“OK_P_<õ„O¶¥—¤b… Âɘü«/ÛˆÖ3Ûf†¢ÄEZµ®´¿g.ÒƒxäxBUÔECî“™Mpô{¾~Dçó–gÿgfAj÷ðŠôÝÍO®ÊD6=¥Ùv€BÅ÷ ùMa×8Æ1É‚€ÔÅþaFÌçðpâkèòª'“gµjQÿª0ø]:OÖ•Þf¶wO±‹5è1†Ê¹ØZ¢|…ïšð"ú3û«±jÕƒ²F˜Éugþµsÿ‡²êæÒ4½Âp&_˧Ƿ¾½€“ë}übd3Åó.ÎV”Xè+°÷ü:Gkg¥¾k'ªw‘ãÃ'Ó–Ìæø¯<2ájLMj¶s{OäRÊ‹RÉäDÌ »š.TìÿÎÒuËÖý£‘8B}Nü*m^–ØnÃÓsr¬¨­(Ã\¡<±)‡–¼PÚ»7”9Y*×´Ó´¼8 ›&½NgÉÕU\™7ûRy®®Û¹?ò$Ч´E–ÃÅ[n,^®|ˆ."KÃPættº.òÃÏF¶zbõá6¤Mê ™¦ëû‡âaäÙÉÝÝ® }H?²«yë~ë?›]½l?\ºyìÕ¸˜§Höú,ºl¢c“†—u‚¯´¬aœp1•lua¸(Mc=.¶lNJMEÛ½+&*@N,äÜp’.%÷ÞÝÜk–UfY¤NirÜ9n£Še¤dö›mN´ŒQ˜¾,Í×§¾w]‹¥AÔV¼J­>z±ÌcôFƒ2B¾]ÔªK«êŒYƒ%¨ãÕ^Œ¼(=̼7ÜÈ$¸ÉQ+ ƒmó OPîñó™+H*ãUƺç/<¶ÎGœ‡½h ›AûÆÄ×} böZ©‚/‹èš$16Éüe<Þ¡^Æwó˜åu#_«Á•p,‚^ý¡\µ<öw{fwߎ–RÙâòvQyé¿÷Ü1X¹³@hÀüœrJ<á5§Æ]ÝLmdåܺ±`ݬ¯Á“6WÏ{<“wÉÞg¡+T=²Ü?ûœ¼{ô^Ln¶ÛpÕUÿɈv•†u#{?6–bÑU…"ϿݯøX^Lü)q¬Ó dü’"ýÈ´‹"!'ª6±Šýѵ,D¥`2Ë<Ý(Îιú0P%ƒÐ+m7E]À‡Gê~jŽ^ý„w" Òt{¶ËJdI,\ –³€|Ý:Ÿ’5¢—§Ñ€‚S1ù‰„Ïw*—ªeu Nï†Ôöf…ÖžC¥~|ÝýeÕaI¸{áüÙî]Òúm{ó›[£à¦?»À™ëχ~”£|r1áÄ‚º%xûc"wÈZ7ÅM?·ç8±`WdE&-PˬԈØúcC¹SEC| ¼ã‰ ¿ø7Y¸Rmó»ÊÐ-×qÔä=?yÈîϨJª<ŒRPõ}ã©pööHmÓPQ!â&l©)`} “øxT±rá1/LcHfè?Ì¢¨Fhn-›u_¹„¦ê7Ú˸®Š¡ÃT}-Y‡/ø¾‡Åª¡”[ļ mãØèÊÔ×ó^Ïs$øÍîš{½o½:…+ó¨}Ä) :f¶ §ô8h¯¹i6Ÿú}£úS¥ûÆ=]$Ïô>Pˆ>D¨8ÇÃlƒ"’gM b_ -¯¥*Kú4Dö°ÎÐ3i?cÁÍ3ñ<»àÀV¢~9î@˜9 ' ÆRX+áã»Ek``8žòõÌÉC00Ã'c<Üüºø--©fK0!öÀ†™¨Í¤Î-›¾„©U·qÞe¡¿œô$†2Z׋[àÝñ©“Í!¶F—vrù'!Y䃋Â)ÅŠ/Ë0lŽÖf‰š0Þ*ÉL3n“•ñ÷f3Û;Íþn—×[þÞ´À¹ª3þ}äÆ&¡=ÈÊé´/äÔºÕ–ëàÎD²=’h8˨AIV½\ÍÊ–Ç0~1{(nß½f&+ßë­Ðÿ¨«ÔÇùýºµ¸oÑø w¥‰Té75 “ÑÞGŠ@ãôžv_ Y¤÷kel}>—ìˆððÏ’»ÿ‹+ÞÜ endstream endobj 110 0 obj << /Length1 1645 /Length2 8506 /Length3 0 /Length 9588 /Filter /FlateDecode >> stream xÚ·TÓo7Žt”t m´twHƒä€#6`£»‘îFRRRRRRB”DR”nÞùËçyþÿsÞ÷ìœí{]×çÊûsÝç;V¦g:ÜÒÖK¨Žâó€D²êêÊ`âãx YYua(GèßzBV}¨+†€‹üBÖ A¡ur¨Ž€TÜ`>XP,$xA §®"9ˆ;Ì ÎPAÀ¡HBVY„³—+ÌÖ…Îó÷#€ÝŠ~úTˆëw€´ÔfÔ!(;¨:£Ä ƒ°‚AQ^ÿ‚]Ì…r=<9˜+Ô =w/à_‡ëGxÀ}þ–l`pk›ßmX»9õà07¨²Ü_´Šð_- ñ  .¨§•ðw]/gèFðo5º?g„3ÀÝÔfEÿú !îPÊÕ êçóŸ†ÿ–Á`€5Ì °„ÚÂà„ÿFG«¡6Êèów…yŒAhú ßŸžLÑ ³FÀ½þ…ÿqÄ@#ymECé'µüQFá ðáæãpó €`¿0@ýà÷ßqþ™ÀßÝÿ¡}ýUÝDT†Û ¿Süî=¾¿;qÿ‹ìí à¿Sh Є†Øÿå¿ Hd…þÿ?oÁ.ÿäÿåÿÊÿÿ­HÁÍÑñ;ûŸ€ÿâsôú &´ ½êôŠÀÿjýs£Õ¡Ö07§ÿµ*£ è%‘†Û¢‰Î æçñÿ©‡!`žPëg0”•ÝŸdúû4Ð9apè3öûâA{@ÿcCïž•úrA¢ÏìO‰^DÔÇû[†¢Wí¿ë‡[!¬ï$¯€ âê ñ"DS- |Àè嵆zþÁyŽ@¡]èžý6WÂß-Ì jÿVý!=!ÿHO@ôÒ;ý«ƒÐp›ÿù@ÛDA´Ñö÷m‰é¿öÈ !N–ÖÿÆ¡U¿[þ××éß*„@g4Öÿ"Àè ÿ:ð¢«FÂlÿ³N° ˆúWäEçðüCü¯áY¹¹º¢§ûëÑ“ý[þãvƒB=¡V„s³+ÑPûúÐö³ZiZîoãb8ûég†¼ÜãÅfø¨~ù)óÕDœìyÕ …¹>°‚™}—†ŒËYîÒ§CŸõÆ7^ü'ÜŒ ›¶Œ– ³·'wf’|NéÍ>hÁ(0H•a)uíÇxFCÜM imÛ¯ÃúÀ÷q}ïç$6ò2!•°vÎîÚ²l5 º§ú»_µQ­–Cºßލç}uz²k•¦‘ùHU¬óœ0Ñ£†xepxh‘¤¾'&HÅ=øÛO–p‰¼è?^þbáý«¼R÷LRKE2©ëþÊeŽÔ³z»õƒS&öän!;‹d›Xð®÷9=‰ó"¹Lºk~ÑF´õBn#Vó DÒ)R¿7¦ônéõWz•ˆ0U¯ù™ÞÉ•+7Õ4eã‰Pv.õDñ›ªõ]¿FÖŽ8w›p̶ǵ©$ëòO(²9¶ýlB XsOØÃf x…ÓíÚu%^-> m 4$áã»çK¯Ö»lü>ˆWbtâãÍSxØÙ)Ã6ïR#õ^iXôÍ,.¸Øß¿±Ê¨‹•õöpZ=ñ­ñ\5UtB”ø½önwØ[ùD‹0æ–owE‡ÆQñ´E=z½°ÖyÌP…™`Q¦‘_yqD16€hÇà#t/ нØñ¾ÞÁÌh:¿ñÆ©xöPTªËVp°°ŸSbŽëö—D[šf  ¿“4hôZ›¯i¶•“|ȧóI!EÛ:éS’Õ0˜Û· õäuM©v~Üd ìñ÷‚ɵ†B¶_ĶK¯µæÅpL×ÑÎìÝm/ÂçyZþ={çˆÏ––æ0[ü>£q§9ã­å-ÂüáO:ýâå‹à¼¦ƒGŒ{Ô˜ëM9YïV [ˆç HÍ—¡ÉŬûÖ¼­±o_O+IËùÿÄ_ÈyÙo”r¿}ïMØþyuˆmÙ}Ü.°egk¶JÄ×¢Ó.®Ô2€£ÇÃ(dßʘ dŸü³ÞCÈëÌ–,ÝŽZ§9¬ 'ÀÔù†{jÛfÖ ¹œ5'ì§uä÷Öß:Ü„k®tÑ›ÇA¥j81½}S_¦ÀxšŸŽrÄfdÉ„ëÄ/#ù&^¼pÈç2‹µLÌüé=ÒŠ! ã7—Á]Û&Ã!]¼¿ï?™œ'™¾ó`× ±žwØ‘-w™]…Õé)1lóI©á˜ÑTWþ¤Ç>S{(Úøä’h}b™NüÅQxÝÛp1ѹþ(/+G‰Iÿt1Ⱥ‰©)PÔš¿°H·äÁœ€×Ú…;9³•ê ÎÅYÑ'Þñ ckH½ï9(‹µ¦—=ú% .–‚ßÀqÊ­ãªÄla’ÐO_ŠGnÛ´6‰ý´W½ŠŸfqhqªœfÚ!1#ÅIðÙ­•¾2u-– »¹«ú£³(T˜u``È— p^S+dõ„ÿðV|Ÿ~Ì5ã­»×Bg’ê\¯ÉÑg£(²Fõ">.ÎÆ¾hw?žŠ’§¯(kó BÚß܇meú%` –óú©†€~˜ë×RŒ¿Å[– vûDd#nHx$.n‹}U2Š«Àöt'í ó \WàfÉz”eIÎÄÞèí §¥m‰m¼¿e_ÜÒ—ã@´®A}Âÿz—ÿ<ãh¹añÖ^š3ËÂv*B«¢®ž€ýÕwÑ‘ Z­{zŒ¡²Î–›cR¢g½²O¡[l Æì1„…Waç ç¯$Ç©â\1¢÷ÒÛÛ̪ÃðH¦l4ñ –>`®•啹ƒ¾œ¾Œs&V³Õß}?UvÞøñ3AP÷²š‘þó Ë]~Ã\ãQÛ¨=…„üŒC}`=“a·ZBgÓYÁàK½´Ú“¬5€z„ã…®Ý|êÆ+«ª70p{… “Æ^ÌŽF„ñ1Žûš2jL3Ö7h½[ƒ¾hT³¥Ð$+~ÔK5†óŸbŠN*ßÙžPðNfyÕ¨÷¨Š‰åøÉFÐÓe%ŸžÀ‹°Þï.XI ØÀÉz±`™âTseTç…ðüÐd_ý#ͳ¨^§#ËÄ«‘N)Ù–«¿¬ÒDÍpŽû„qˆÖ–oLá½8j“^HšöÉF™ó‹± µ8¦:)ß4kû¯òjâ$—Šê&Mvœ.îçL±Ô ¹;*½„Jt®Z' ôZ'EºT–j~@‰qÒ]ªSq-BÍ! «HfZ‘”O\…zæjÏ$_6SjÈVo訟|„í¼7/‘rŸd`â4òÛÝo¿ø8?Ù3ôæÈm oưLûä25+D/F·ÜÐlÍ«%‰šZk¥ª(³4µ¥ö ±¦¢pÒvÙ$;-R1¦Jô·™%ÆzÊ•Z)Øð•Ò|Q4íï z»SN§Ã…# ~!‚Ot8+=Ó¿ìåȼ¦v§uõ6Ÿk_/ôÇî&A7u¥“Ô'Åe‚.ùÓ„ùVÌM[îùÔٞصJ[ÎT÷!J¸ ðM¼‹¯ß§¦Båíõq|rÀQ‡àÑݺ}µë)/U_ïÀ©Ãµ´Ÿ¾óM(¼b{ë­0}ñjï9¾ùnÝYÿö ãúÎÆ›|×îù7Îp×½»êúY'<ßÉŒ¸Q›é[µ¯ëy½s>þzZ‚A(¦#ˆ7:ö}±xk™¹‘׆¡¼C1IoΑó<ãpÆJ,_u¯DÏJ`wLvU*&Ñ/@<è©&7Ö%ÝpݯñŠþƒ6>@-f/ÛfÀsƒWŽ=5xž_??›½[Œ«˜˜,EÞëk ùzÁ㺄_‹Åp(o\ÎUuݼ{|3¤,È»#õÛ ×jœÛ+S,%2Dj˜Àè„ï"-2Ç€Ù¥OlŠ´¹Sã`7A)Ò"ˆ0ñ(Å7³-‰½Ž‚?o¹”}ë§Lý57‰CûÛÖÜT‡’գ˷ª ÕN1_¤–Ì‹¥o|ê~Þ6ÝMŠÏÅ¢ %pš‘3Æz×çì?ò³úg®áb’ôµ°“´÷Üñ÷llëN ÑGëþT¸“‰eÎËí'i[¨e_ÝLÒøWß·ì+ PÅû!HÜ-½|:3ha±Þi/$¤ÄxÞð"ðöFï+ç… ­ÉçÃ&™Õ¤ù—bÃÛߞŲ8cÙ¿ìØòèE…=•-Áª‹U*fr›¯fz%ý#?‘›Fm9öa~…„&ïPJ²ÛxûÃç @B¹Õo€·Ã>0hßÚÝ ¬*±‚ÚÎí‰kßw<>iVµŽg ø¢HöRŠùYüô'?ÆèZèæž·Ü8³Ø~CJ¼a‘¯HTPŠsÂàX¦\*æÃ©B-kƒe9²€X=˜®e3DŸn}7ç~ëçà¯6)õ}¯êݽEñ>³J»ÏÛ5Y­0aËé—gRH3Ê3OÅ[ž—áøv¨4OÃ3ŸÇü°¯YS ×]lÿp‹²B£½P{´I~STüÙÄ)ÐÊŒ¨{²€1º±ŒØ#¿a¹Ã%[írØË~mH¶£\”50“ŽíÚa²Ðô.øýí×Km(ÂÂ=qµÍÕšÒYrwb¦º&Ûæ£ìøCܺòÙVœçð™CÜÂñ!é|Fbö9SõuêO$ˆÉOÌ‚^O~ÔL©sü2ñÁKœî¨ÌÌ[@>6ˆÚ›å&xÄjo 4â íü¢Cú'¦]©+’(¬#ÒGe,éÆ!¦½uTQÞn†mSòaH ˆl¥šÖ"%gMêi S:ÂDJ- ¢›fª"Ú}àÝU󘆳çTO4œ[~’æ[Xâ­®å×/]ë5Í]W¼É•»ªž.|½%+ïÍQ¥ô¯³¶>øN|bŠoÈ¿”ªiKæÙç5[qm(Éc§W’¨‚nÎ?ýÒ0#ZsúyðSA¨Ÿ“Aö÷¯FõUéqo¤ÒÒ/!7vîºÙ"Enž„lb¦å®)Dv…>ÐL”W™æø#fÉÎDÑÂòÎ „A¸8³™…}é`ÈL¬Æ%óÍÌñþÚ¡,ΣÊ[÷®˜–cûŒ8Éô¼‹Åiúéæ ž2¤H§é ­¨ouXG½¤c×›z+rÒõŒg%§GLPü¢…mn8þ38øÒR,<%iñÚáøÍgwk2‘5žOúblkm·DX‘•$Êy¼ýýÎ@³ú/‘é” øõ;+ÀZ¦ŠÄÜ6PJô×y©0¦Ô&ÿu9‚ifaÑ»on‘Øôyf۵ⶲ? _¾ ú"y¾¹óÉO4ÎÜ4©ÝÕý‡V)©& ˆº"ê=Ü”-R´oM?O+òà\Fü)Ë1Þ¯Á*–,ÎfÁ—ÇCv®Ž™B¡U¢›#÷§ úyʬýOo@òé«ãÅKRàõ¦’8OXm´~…ËÝ—£-5•ɯ‰g¿ÛkÜñð2]ž5É^Dòº8ý¸‘Ìåù\¢Útq"ês|¬ÛÊLÞ÷îE©Fáþ ñ n§ÃÎJŸõŠg²¼ø`Hid‰i¢©+@7±Ûï^Ûåà˽,Þ/ÔÕÌ÷J"°3n¶û jÓ?&Z¹]{µêi9¬`% ßH‡£h+Ç‚ºÂC}Û ŸÍäëwô³oy/Mn;ù¸wÄ÷j 8óFeZcÈeÔÒ$™‹¢f–¸³r¶ùéYKK›pÊÎ÷3¨ïž}Ù«§¹ƒ%­™Ç^Ž|oSÇʾxé<.· ôˆ— 'Û9šHuß¿6ÊríˆIÜMþPk+9 Ÿ}GNL´Á¾¶o¸ùbyNùÛ9/’œ¾°iùRúm¸bÒ˜†Î`´ÕïÌUÛ'WRžð/kBeãÍdeòWc6kÉÅ¿¸&LZ¤g;º¼fç5ýÒ•¡¥ÍQÝL5ÐïJ–N9ƒSO™Å¥Ü'HbñÌ_ç–Q\õË­¤üù†*mV[Óè"W^ãO±@ÏYg¾NŒ¯FzU.!8œ˜ù®€òSi¢×IzƒýˆNgä]ºó{ò%'Ž¥–Rp­'‡£¢Ú/cṉQ¼^á5¡sM~ o7U·>«êë†0W Ó¬Ææ¦8Ë‹tz çäNRÈ[‘%åõVõŠ+oE•ª Zü|ŸlÈ¡í¹¿”¸•€ÕçI 0É3oWÆŒß&§D½7´jôïi¥P)¹»Þ²T"â‚M10dç¥úåÍ‚¨˜ÑmÞ‡°+ÿ^ßƒÊæe‚²#] k×õ+Æš}é>ËíöÁ¢7—ëŽU¬ŽÞG Lˆ?ò{’Ü3Y ~U“¦/’òÌ¿´áS§)¶W˜¿ä%Jéä_øªqÜ)™`Óâ’ûq%O¹ëIʉqޤî›g]ÿHyû3±êëÒ–â‡A’ž$ŒæL]–Meõ“U¯ŒLa ~ :½omssž¸… Í&ÎKÔ=²qa‡aXá&®˜åyJv^ëµ<ªÈ' ¢â÷²°¼…‰…t\ÙÂëY¢Ž×ǤÖð_¥Ç@Ô#ߥR’3×C}/Ó,k¾2dÝE©EOÖÒ†#}'¦·;58–]>|#VHA¤jæa‰{Ö—´õãÄÌßûüÊ|£_ü6‰øúIZÍ”æÓoáÒ~£T&D«^f¸Ä=Íc{*õpÞ¾è^.Ôİ—™_– “ ýþMçmÆK:ãø#/¹ä¹.<'ƒWæÌ‰–1ÛT_e‹•¯{aˆ/dÙÁÍ£’£ëüˆoHZŠmÃKªcâët07 ³;lb¬ïïh±S¹l~Õ“OWÈnwkù“BÜKËe5•"í96ï×¾CŠé·y`T ‚§’O 9_(P‡¤q—õ.4œ“x#B†J+¬«°ˆå’.‡ÙzɃ?㔟¨µòH‚Þ|áþ¸6¯c!{#XȪ›YLQ*fYBä쌪o^šªEéhZ„ÓMýäçÑôdñLôüNò+þ̰…:¿jÄVXU‘Üü¨)hqäýÊ äçèLd× ýÉvšjC{×Õ¬.¶Ç÷r¤K„nU§]° ëüöZ›ˆQt_{ÆKÀšmEq£šµDlT¦*^Ö=©K¾&?t4D„ Š(Ûbo½ZÆ×“\âXŸÑ¶d¼œGÄ6¦oJD Þ[ëôçH'ÐL$¬,4ô>YõuÈ(c‡R³©–T*;‰ZV’{ré@êÇf;çIÝ-Ö¾ƒow¸µóÙ%J8Ç/¦Êv‡x"íÚ7÷Û|•yÜz,´žÎsXü*OÓÒlÚb¿Â;åO Ji0+ Y &W_®ADÒã (rZHŽi+¨—Ý[é ¼ù8j»¿íÜm3¿Œ ǺÁè?°®*n}¹§Ú·Cj¬FèÕâBðF¦»‰¥Wê1uä°à“ÁÎ áxÂ…üæåÖ}Á3®KeÝ–ˆ¸›q¯¬¹ˆIw”Ra­·úVv¹¦TŽl Ë ½_DZßko±0Eã3ɉ”aÄ`„±r`â‘C¨Ö²Ô=“®‡™«¥]HÒ½³&弉˜íóš y²ï¶ñ;U?nç¤ãÁv ÏEŽXŠÇ7˜ªi…ƒö9ÏšT÷R>=i–’€òpÏ#*¦_lÞÈRWS?ÀN-t&Þ˜4ñ§Ö~òŽ‘*W’1o¾Œãt¾¿ ![ð…ç%qH€S jÊ‹ðÌÏ}íÜcäê=|†b~|þ­³5ŠçŽb¡ü|• ƒ‘”Ñ {ÒØÏ¿Nº†]czØk¡Ø-~”bx­0ÕË}vÀ‘ÍbftµÎö ]> -p+N¢i»=& ‡{sVñN@o‹ñLg‚²­ë˜(|ë¹>M»L=„«aß 8‹©fU*Ðõ¦ŽîºŠ˜¥4piF¦¥ÑbòŒôl"6:Q½3ƒËz_„šÄªã&KM?cäa_4ýpäBâú~>åÖ.ÅKfÁx®(±ìqÆeç5Æ;-€ÐBQkµ6§Êxgú.mQûÆ2¤Ô„0ތʇs#ã“× ,˜¶ªÕ×Õz\9Œú±ðÒ]÷pfLaäðèÇg‚KS£BRb/-ßQèX¿qwpïCÄó“–ÌŽåÐŽ„ 1^ hö+Ê[á:÷ˆpWÍ'>§|¦wŒgx6{µÀzß®:­ï7ׯ%&Ûs,÷dŽ“,@û÷VŲ–µ…• Jö“n(TZ醶šÅ‘¿¯3üKÁxæÐœM+dÛIIJP˜bjIIŒ~U“WÉ‹ò ÿ:˜Ïôµ:[1ƒ€× ;‹x"yó7Pò§¼qï ßšû[6°boMD›dŠRDæW©}Á|ÓQ§~±EQBÕËd^xXGt¶Ž­Ö[mÐ~CÔNÌPA[êÏ’›¤Öwµ =†PŠ´;ø µjé®Õ•£“îÔ÷ž× \ÔÆÍ˜2ï]Ó’wª÷ærÏS¦®ˆøÝ)9ãZ‚-Y‡ôÈeðymÌT¯Ó~ÿ’òÜhº—v¶ÚBf~…ÌCJnÜ –›YÊœôÆw²^xgÖ·yU \}ä¡JÛ5Ì,4WÊ ÷‡L&ߨfÿH§(nÛ O Tü¥ö@tžÓ÷m‘²?öÙã屙jëïO¸6X|Ô0€H~cœR¥ÇoÙÕˆ6–ÃÝÎ ”iÖ©*’kFÎtgL¢:ÆÎv5°a¦ 8/¡QavªjÙ]߯¯»qùMf¯•WJ* B?‚ˆ»šW6x£cYN‚úºÎûU9¶k?{cÚÛ÷˜kÛæ¥ý‹Xr* 9‰<‰?÷®“âMŒYy¯"K*¤²~™‚Ô—µì+žú·º~IVìõe゚AN<+Ó]甾%;Lƒ1rÖ.Çô\^žy“‹Ë±ÕÑÇvŒ¹JÂÄÜü¾“0´ìù®y•oKW¢fAhK†tÙá¾H÷ìîçî¥Ð´Yð\§ÆÓœnÜzY€ÐŽžœ=uC‰˜ïô vëÕe㌜ûúÇ’ü# ðoî™>£@'R›½È4Ô®Á²™O ˜•öãXßRϵH¸ ½Ê¡G±Ó•°ø%JͱýárÎÒªºt~\©†Ë QØ3šŸÁC›‡%­±­-½ÄW{£ÃA¼ß4ð@¼ ¾¢$÷èÃçÏSå©‘Æ4sŠ õ‡ª{ÌÁ9;ÊÊÕ:ÕîEnâ&©N›FÔ;‘Áš:ÈØê™n»?)’ª6v|‹-^¹I›ɺ5ï–ÿ‚¨©žRGÓî@DÏöìŽûÆÄáëÎVo»ã§8CÛVB ÊßÝ/¤âÔ0ê$ ìq~jxš„'j |½ë¥× ÙT§”QÓùk+¯âkùÊ®²JDHÀõ¢–ë ·K­jb¹ä¹~ëq}o…øeY5C°Š Ó¹ÁñÚ¨7Cøœ'xh- Œë¹`”a„¾×²ã é½xj¿:dT}™ndmÒ~+q©Ô^öùµDû]Ƙò¾ÃŠ›8œhbZŠ"×'{ök íÕõ+¦òz¨¸˜aëiò#9˜®GrR$9k.£;¯Q*[xÞ[vå8.èùb‹eÖ#òÚ¥;)sA5ômà…Æò—ñ=}IîXbMwr¼}Ó;Jº‰N -Ó ì0Ù¸´`|»3À±*Ýâ&“ûÚl²"’ìh2¡çþZé­´ãˆ'÷‡Àm­æé¬2ÿÈ Õï7ëËíÛ‘«Pn:ÅÝôÑ­ ¼¶ ½L ¹K>š*·ºxªÔ,:Þ0m'¾9Öäܶ-m/Âuñͺþ19Ïøc5Wµ+™è “7R5›ØUF¯%q"û&Í™•R"ˆòß!=OË18îµÀðwšÁÿÙŽôñøóî—GÅÙ]­ežñÂHʬ¶qCœú÷ý[‘tJì¯;‰=õ©»S·‡]¢$|-é{w^ø¯×Ƨ†Þ) J» ªèÓ’˜½Ž¨rS¨Õѯ7Ôœ‚³õŸ{s¡T“ áÙzŸãýµ*d¢ë%Û^ÍNòVÀ£÷ ó›uOÓ,¹sÚƒd‚¥§Í½{ Rð´áIO¤TœðÚã†W>4'ÛNvȶ»–°4'Ì1cŠ=§Ô/Þ¼)Y>&tH[–Øs<¿§ñÎîeƒÚÎ?èzKëëÉ-uôŒ>á×å1Q¦&#£œË‘wEÉ̘!%½X$8ûzéÃQ¾“›ãË/ž`O¿‹X pÍî˜Bw¿>B¦Ry/ƒìúêÕl™ÞŸTúWUPÞ+îÚcÞ-Bi^6<¹ÈRyÿöò¢ÛÄ´á÷ÖX·D‰¿K„o·ôc ²¼_jMèå¹Â¨åÕ{X!ˆ•ˆ…mÁ¬¥LίAˆV1N$M…<ù¬èöY7¶ãDÑ-ä*‡e;¥và±…‘}² ÕŒj|/6KöG~w(èšç9¸Ô'äßÄ4;+l®¾},ÈeÄ\‹µåäш«ûÊ0Vš»%¹Ê“¸QäàŽåI}‘•Y‰š“UMÞcJn[ñ`ë1‡º ¢²¯ý#bY®Òfs7ŸZúd>ž;áSß•›ÖÍ«.ŽB Òe[J>”Ú|Ê`Ú†œ·ÒšO|çØmñœX :cHFÏ|¼jíNv?Lu¨ã™Ù`”£Wd(™ƒä`lnÿ@ýÁóHAÉ(· #é¨Ï“(v ¹EŒks%ku×¾‹•{]ˉZQà`nGœ¹ƒß‹ÜKÙoTõ w<‰É)©nR-(K#Õß,D í€O?Ï4»–K¯ 2½‚/-U*¯½?:gùÔF =nFÍjDÞj±£ø†Õ£»®QU„p.r°ê321ñ¥® %> stream xÚtT”kÛ.Ý©’ƒH×ÐÝÝ ’20ŒÀ 14Ò" ‚´ *Ý ’Ò ‚ðº÷·ÿý³Ö9kÖzç½û¹žûº^&=Cy0Ü¢‡!xøyEmmua(È  °°AοÜ,&w(&ñ¿Ý! ʧB ò´á0€†§3€_À/"Á/*€@ñ¿áî% ÐæhÀaE¸«¯;ÔÁó÷+€ÝŽÀ/..Êý» ïq‡Ú`mÂₚhrÂí „ï¿Z°K9"®||ÞÞÞ¼ ^¸»ƒ 7ÀŠp@< î^0à`€Èò/ ÀÈêñÇo·GxƒÜ!”Ãjy *ÊD>à)²ÆCt+?^M1ÌÍ™×|­2×ůbý䣎‚òåÒÌ7ÿõzÆ_¡sF•mFÛ¤éÛsôÉTÿ ºÓ¤ïÐòMÓ$JÝ»ÑôècÉ>áË‚º YHØê:gS½Yï•©ˆj„¿×ùð©¦,G‹’NÜdÿ«¢Ù¶ÏhCø;5[ÞW—Äе8Ëè ¬šR. R¼«ÉVzúÈ»èÛcŸix…l?Œ@+KöÑ) áV›,\ç•zíeÝñ·U½+·î®XæHGÖéœ:®ŸîY1qºu½l¢îÂÛ/ÖRMyš•Ÿ0"7œ\ó-Ùrº2¶tχä£,l‹ilüJH’|S㩾/aû—ñ¸ ¡£‹öIÏüóŠ™ÓC‰×&‹“K8Ñaa M!ºª7ì.ƒä‰¸/êË‹ª Ïž’Çd¸E`ÇLDBöw¶Þà¹ÏWL®9›J¯™>é–N):±žßÙ· (}^܃üSÑÙùV>Í–£Eôê*`ÜÕÒTR1@wå Ðï`Á»N·qÚà9{¨éq‘¬ÀBÍZlT´JGð„,Æål fœxSo ×Lþµ¸ºå!fPzÊÏ$êÇØ˜Ìç#ÍO¯ð OãyY +:k ûÔ™Ýb÷îã~oö*©ÿ4Œ®`t”ôÁÄh^®å£!iyò~üãzFéPì©ÁŽšs½'y€ª¦f7^Iʧd§¼-ªK, V2ŒÃ7VàžÜ'³ïÊ#5ª§½ª±ºÓ'ÉoëäÃלG¤ ÂÌ©T^Pïæ>Ë ‰¯Ïz: Í2ÂÌÏv)ãÕ~«oGØÒ70ºA³…iZå›ü¾Ô•ìz–vKTɉ§6}z\–8|n4B@û^!;!nŽT‚„ò³ò3ÍèLu_}⤖•£³Ñ¹ä9Þ©Ÿý ·5¤/uåU±Œq?ù«î8 Žwï)k´˜œqjæ¿g/ÓÊ“ÿ”« ךœžûl-Ù×v%è‹%¿MJ¢a¢êņ“]=|gDy¨?s3=b`Ùá(PgLÈo×à§ÉxŒ¾Û#4qƒ{{Û+æ‡G»íZ4ôéA“òõ×íkv|cÛ%[åTȵQ“XjÝÑ÷´”Q”OR…©°~¿áÕ  ±Ûñ3-¾!ãøÉ‚ï‹c}1‰0#”'1‘õ#'VIîní¸«¤‡ì S®Ò+bhÓ:¡dW¶¼±‰ïM¹G0´³2SrW½¦Ö’—ÛÂÆ´‹æ¡Ó‘$Æô„/®ÛÕ©£åR,ÌÌub6Á‘-ãí\~å±ÿ=¬¸ñó»e‡„goñDZem„Ü/b4Ú˜ÜN×oÉ õªƒómÞ^lí¤Z‡)ª£_ï Ü¢ ¿fÄâæ9iZê’lùIû°8Iq¾»óGÇaᬧ©•¯F0ºC ‹‰Å*Sz_-K.¥‘•ý ˆ€£4„lí¦xœ†Wú~FåHɦFŠ"ìÞ'>Z ö¾ãÊ9$­¦nšà˜"aÄlè]LxåËÀªÜèöµ?*„~†d?¸Q&FT=‹iMa¿ÖŽ;»^Ø`ê‘öò™nÊð¾þË®’†Ýn ÚY“E‹¢¹dôñnÉÉ»Hï`œpîWR.Øo8óùkæ>ÓQäùÍf½×ÉõÛJË¢Çô[÷ŽÐÖò™[ž›“K›ä÷4a,µÔ´?;s £9EYâG]Å¢¼=h-äýС.–\dís*ÞŠqÐoÔ”Í bD+ ã«WÌv0ìöÄo¯EZ7Påt…öö¬ôŠÐâ±Ë ©“# ¤±êIM"áÑœM™Lr¡ýѪ)xfhgk@å,_áçAM~ z䤼mÉàÊ…ò»7¢]¡ø® 'åÆ Ï‚M/t°8üh¸vϧX_Ü͈zdK¢ÓÑÝn,œœ˜RßZ_90íºÈÔaËÌûѨ6¼ïŒH-›} Mqôlx Ÿ†‡»iÓøÌî}©Øö\bÏ¡¬?x EX¦{«+øÝ¿“J¯AÍFÚïKÖ_9Í^ë>ñ°}& Ôx¤å—Üâá:©a]vnžÂnOrÃY2Ò~™ÍŒh§ƒ.º«gª’eSö⋇•¼S Ôs]Ô÷UNÚTkoqmÈ]_ÎXdjêá¿ò"úÀáªÐ!·h+Oî@è*ß¼&‰îièKÔ_þ–,MÔ~¥êÚ7¸»¨!.‚ý©±Ë1tÀø¹§y㵠ÙKÀô¸êuÞtHhGŠxÒV(žÃ¦Ö;SÓ)í©‡tø'ºIòÜ=ÅÖZ)žr›Œ‚ Ááº0dNxi©¢`\îDkסáyÚ¥ ŒæƒirÅ ZmfsÓ×| Õ[—­LT¼ø ’dÔÝ^vmNÎóô>øÊ¬*7ßæxPånÊ]s޼í%Ç6ÙjÍ2Ø[ð©Ç€5ÜüRÝÓà@CÅ/Ú˜&xÌ)‘ ·eév4O‰ÁÞϹìˆò¢#üIWZJñ– Ì"’l£Ò"¤ò°2Šï‡î;Õ°€æD!ãA3ÓÓ•Wg¶"Ê_Þv›hÅ’ÂØ6-IeÊh6ý5Öëзº®BÁ7†gò¥#‰¡ZÜšìøõ†Å›’-þßšhÂw] Ç#;ÚdûØjZUÒ®SƒÎŽp®gG\¶R;jÉ6•1 Ú½Y)? 6&¤2[5¯kŸJO0èÃ#ÞÉ•" î8Šý8gƒ^ÀzsàA~ÔФ iìéá›o1`äCJ4>ô ­¹>7“Îɘó' ÎXõ¬ÍÙ{R3÷cÂBåGl›S„‚õÌå|Ü$Û’7 -¦Ž…Ú†9Úyqû3Ó}w3L ´0‹c#=&ÐmªÔì Sc¢ißæ|ÀhU¦¥-ªkÜŒi¤ß ¿´–JÊŽµÿ h> ¦¤cË#»À—Z #0œR8v"0G -ÐS{$ZMs{l‡­ÞŽsÍ’…Ä0…P·›óf öà§qó½šÙ3µ ¸k-‰c†}é™1K]Ð=ˆ7c,&eÐÝÍ$D ¦‘æÔ)Wî™Y{+œ<$7Q%ç~yVñ˯¿CºÄ3¥œÂÄò.J•l?4Õ~ÐlUN–¿ýôzƒmIŒþf€×©z!ž¼ßÀ]}ÁU.…ãχ16 T° âãG¬»]Îî—^Âû1%PKfyg5‘ ®ÀÜ×"·j÷ºMûU`-rÛ´7T`VÈ!9m•”Á?²)Ý¥°Ž9ÑplUök¢ñÁ“”R½^¢ìä¯é¶ OÓ¢÷fæŸÕEšgº‹qÞº¬"9ŽÕ6¼Às]•; *aÅdÌÏ%ÔÁ&¦ÓdFØG“£c{%ae(ð¥Ò|ý¼¨mŒ1ºoº,Û[¶ß˜Ô ÈÒ³)ƒ~P®‚2#å ïךè`µ0á§ëæa²ÆU¬ëÙ—Ú±«™hÐE4A”ºÏ*—Wf}‰0§»¾¼‰›ºì¬{g¢’8Ń<´éI5—~ÀPÕë¦# ¼ëÖ»øªFâ!%s"—jËDA7]”ËÔü²Ï/BSM²þ†PØúÀÈèm6Ë«Ùüwƒ&ºà¹·Ö”Dèw!ý ˜Áž’…Ÿ""£¦ÎS ??ðYý ò"–õÁ'Ïìi§u%½Gy9[ö³ÍrÞDïÒ0wXê-Ñ÷Ù=Æ48ð˜¯üD©³Zª†p|ÕSÙØ·³Êéת³]›?Ä÷‰Å½æÃ¦H¶ÌÜ z•Öš™x¯f¡ºÜ–W‡—äc¯ã,vxå2ûlqGã!ßÖës¾«¤3(Ró…Ëqû”» }—È:^¢ WsCPF46§Û¨¥zRÜýü}Í«è{3k3“3œ¤Ó·³@™Ür?·wxïÚN«Tàü­ü4”w€­_L ˜¾^pÆš!oÊ&cÐÌ-æ$óÔG¤‡F¸ð±lÎØèÜLÛ:Ž-:yS¶×쎜 'c^FË>Ma/;ž~Ý£LŒTÇêH¶È0ÔäÑÎC”›JxÓ åù÷o_<·¥=£J;$ô”çìpÖ¿&¡õ‘¡Ì|7R)¥ÔCaQðôø›œè´MÓÝ~<—¤Ø´!¬FØ 9Çj¬ ڛ㠆íj|Á7Œ¤£½šZù'6^L‹'#Æõû¬+µ2`»/ý äm74Æ–§XUû³_ìQ`'ûF,Ê’^è»wÿ; ZIoG˜àú¹úû©ùyïG$Ø]i‡þƒC?’iW‹u¸Ý€X°^N¨ÏFÖs.™È›N¥hP)ð>Aÿ’Ãn}¢œ¾wKŠù V·RÚ¡ûìåEM¸>ºÖãaw·ÌcÞâ(GðÜìþƒ’8f¼—U·ÇÒà°ÙNùdãO)‹eó>až¢U àçA·•¤Ñæ îêÏ¿$˜ ÉÛ`ï(Ô–3LÓAªV}dãæ ×¬»-*y:Gµõ„,¯`8£ô*kÓ°T­},ñ-KÚ¬NäIû•Ÿ€}ÐWLVn{[¿£›‰”:1ÐÆslÃÁþüjEu{æðXƒ•Âð¥ ekÈÄ㆗ê8OÓŸü¨«0HIŒŸ~†ËØéWbpª¿Ñ–*ñctÑcÈ /“Øz­ðq»ÜÄP;;P.)8ó¾³Fµ÷ðzbçú~©D?×¶ïýÆ]ÿ“Sk&ÖË(¶ãS§#Ás“’$f«Ãæ!ý¬!Kœ«ðæ<Ò™Yâ"Âl#‘·?©Ä·¦°A¯ìã úoUÌhv'›Nk+â,’´ÿÀ\“M”Ë~˜Lóîã(ì{Ù:«”O^4ŽŒÛ§dâLU•Ôà¦k†½ÈÉ‘™ï… XP?ÍuE¡%æ¥Oó•i'¥é¡šž–°åvê”±¢GþKš®•EdN÷ÁÄ)cD˱ÑW‡¥êðÕ”¦<¼Õvª‹sÁ‰ð#±–n–¢åSÑb^׿ؚăIšÕŽÉªï©º/-',èÚP1Ë6}h—b'dÓž0¾KÍ˨ZŒz_,UƒA³Ã8»cÍ‹|õ_â̤Ù.O/FŽB¡Æ‘é6wµTù&«{`Ø:Ì0ùžÂ5Å€¡ 'Íǯ=T‰ù ‚\7ß56  vt©ûFÓ¬¡%ig…)~¦gÙ†ëñ…›Án+†âS~/ôþ僱][²Ûrì2¤ÅTlæ ÚÝGËcÖÙx. C›óó÷|å“ý#“ÅW(k÷ÂTZЃúÍ…•§jB[avL·;×¶ìçÆ‚ ¬x»çPÔÍ_G/L¨×#é±){ŒY÷,ÉÖÍcÂg(…¯²êÐD¿Ùx“bN%\vœ=ò—Óµ^žjŽnÞ7¤:ýAü@ýÓì¦zçܛۻ‚¼ëýÃ"³J2}ÇltG)=%M<“•-C”ëå…g§9”ü"$Èö~‰ÁH²w.ÐR5R5¸-R-ö°W‹›æD²™«Ûg{ø¡ä}\c ðLëÝÁæqé“™¦í8¿-dzÄä.·6H±ÂŽ ¸v÷$¯á„Y¯+ާÆ”J^ñE ÝsŠnI.sùtf üYÁül%Ç&øg@rˆ¯ú©AåJƒ6Ÿ$àÒê[>ã.‹Ç¯í»lY§Vz]í…2\õuL âåv¾Á³OEwçy. 7ÂI FlˆIÉ¥œ÷çæíŠ=`ð|Ï0˜Zq^C*O@d¢ÿE>ܾB˜tž*ºz6$¢ZrP¡94ââý=MŒ¥wω%õ8|D J»ïõR“pté1üb+;—”)`&Ïyh#OºJˆµÑ«|¹ÖвO ëiŸL©ÂÛ$o3ÌŽTdζÈš>‚Ñ,8?DÝM#ÀË,O@cú¼èI3E±Í–Hƒk¶mƒ§”ÔZƒ€Ã^‹ˆÅ’ÝKóg ããF©¶UámÁ‹?ÊHxt2àKÝKÂèXb`í×6—ÛÅÛ¯á»XÄÚ'Ã.xµ€˜Üˆêvk+ÖÏ3,ÉÌ“N,¼ˆoT›+&+ÛJÀ㾞~ è âvs;Uh´÷|´‚q6ê5ùËç6 ý÷g­öôºLÅŸæ+Š˜õ—Ì‘†„‡ zÚ?Édû6`Á  jÓ\µõÞ­’¨ìÖ>$ýH”Mbç‰Ó«\S¯Â«>Ur?¹ñ—£O­«žo«CLžAcµÀq~Š}ó _¶A€Ïô&Ìõ• Õ^‚;v¬˜hî2MÁ¤êº‚£÷Úi@ç§oÒ/r^?3V5ÚõÁ˜ä¢ï'Ã|ZFGì§9 .K.|¨oÝ#©ývƒJ ºç;'É)Õ¾[,挫PU*%\p?k²À BûT2[óí–ÑéÆ}–بšÿ|æõºZ¿Ü²t?ù÷È–UU™a*±²ß¯×·@~ž&{ÕõyÙ×D+%[ Ï.ê;‰œ-tÞ–ÿÐø¢ endstream endobj 114 0 obj << /Length1 1509 /Length2 7946 /Length3 0 /Length 8953 /Filter /FlateDecode >> stream xÚ·PÊ-Š%‚»3¸»»Ü5¸ 0È`ƒ îÜÁÝÝÝ qq{w€€‰‹ÀÆÆÃàyYxÿw•óÿ÷?VÐßgcý§ ,ØÂÀÆú‡—Ëû׿eAû÷ÈÐþ{ %û-´ÿH_Ÿ•‹Õìå‹íÿyþ¤üÿéþw•ÿ›ôÿ÷@Ò.¶¶Ü´üÿ·‰ÈÖãï€)»@^ÆBÑþe8Àÿª ük”æ »ÿõÊBL^ÆC lù"q&6NfVοì gi;Ð\1³úKHÿêÅ˶ 0PÅÞôûÅyÉbeýßËÔ™Ù¼¼*Î/ûËeâü2‚?Íý/Cößç›Ù›ÿžFv.n€‰““‰â‹ ^À‹íelÍîô`aÛC^R/œ½öNˆ¿ÛÌà `Qømúƒ^$¢öâ°hþ±±¾8-þ¾xAÿù,vÿÀ)±€ÿì/Ðýü¯Ó›¹89½Ðû#ºjÿ Ðh†¸8go&h]ØvS%FèÆ´5!øê$åF‡i"ÏÒ/5m´¯ž™±$_"½ØÇ&mhÝ©$îx“õcþÂk³–´ÎƒóЉTz×’Ô4vîù z6Á뚈|µ *G;Iœ„¿Ð©J…8­ëˆ¹e¿:êššÞ…7j¬"i¹ 6¥Ž®ª¢ ">­Ã 5H³éÆ×%Mö†]ÌÇŸ‘úaÉJiäò‚·ˆñn•hkƒ#C+è}ÄÝþr®[§”Át)!"INøJ­•\”‡ìB׃4 /Ów˜â2tzÓt E±[éýÚp¾!•#vÛQÛ._zü¬J2ľÖs£:d«Ž l×V_ø¯È]’>àÁú¿n‹©à8Í"9Ì;—ic%ª´í+Ehn ©ßÙø/ÓÞÌ“zj²G“•ÍT"n5Bç¢s¯œPé™Ò+ñ‰èµLø^5}›žlyðþIÃW¤Î›/LüÁf¦hˆJØoJbÔ,hŒ)T,WQq¡%÷µQV3 ŸÊ«LµFÒ·¶g_ª™.Í PÞ”=®–Kiö>öMáúX|'Í< ¿³¾Æ*¿CþæcÜBkç,ºK‹«+Ó°[\ÚáµW,Üå<»P”—ÍWûãz2Y•æUOžaäÛÉâú0šrŒ-XÇ, ì7³ ¿Ä㨂ªàCAgÚ¶Ø'íŒy ‚}*FœY!Ôp’ÊàñÛ,V>PȇþâÝnRµ<~š™>ÌClÁÕž°x¡¤NiÓ3”õ2Îl„t¥A/Ù{(3€–Îȱš>'®nd…ìJC5ÖäU-›x„ªµ}YS ¯yY‰~êÇúU/É&gOô—\äf¹o~)Y´+åž·Ñæ|åC؆} 3Õö$w~xÁW9ÄK}­ ߀M@ ó´=éJtóÀb”ÀãuOıäW|4ú½1,™¦×8Þž7dùãQç³>àÙ:Fø‡ŽsI8~Î ­ûª^7ÊeÇL•lg³Æž½½ÌÂl*©¢RK"åÇžìN߉Uç6gÄ{Íî,S¦…²âŸñEêcD[ž'ˆ¤8/ Þñám³§-A¯’‰Í,]Õe“ x4¡Ý¸¬ˆF4•V î‹ÏbI½6nýÎ £ýX’B‰0°áb±åïxûÜEÖ‰ªÀÜ"µ4Ê•Èr2»%_¢àr° ¦DiÛì¡Ð~èÅ 9x¼œï¯ÈÕ¢Ç$È0dz/ce{ûªØk>I]åfaÿq³þ}­‘{jƒrnýÌÍ;{­„u*Ð<¯§q–à`p[0¦úîà©­õ$³¼šnä¯Îl —àãÄæžŸŸ ’Ájßæ>…ö)Ü:¿íd?!æ i“¶³+õ¼]i²Ãyxm|ÔewÚsV華(D‚¹Î¥E)¬,â2å `oñ¦<#ÂÅëAG„•ÀvÄÁ6œ1†úöJ«Î݈i%n5ÙA¿)ÿ9*ú.èë©÷Ð7›&8Ô©ê(íõ¥˜Â¶ ÷ÃKð-8õ Vgð‹uºH•™ørÙúç”_-'°x§œJnÑxmë<N&÷OÊò˜ zäd’©ÆS¹™­¯ƒd@p%§9¶–ÇÔO‹nU'¡A³‚¹$´ ér#“òýïÎCÇç¹S]½/± 8ÙÅC…Q`ú‹¦Ç.˨Î|~ –—»sˆÙ÷NäØVv&ª-(½žÏÄÅß­ï•ydÀé¦b*HNn½ÒÊœvB‰(ÎѦ7‡C2¾•¯oàIZ±­æ·8=á- ‘«ËSÁ_™Ñ‹[Ú +)£åÔS‹c•¬r×*‘ÌÓ`’¯†t$ÃX(1cHIOmðÚ‘&ù¤¹&ú¨ŶºÖ~„túò¶ ¯Í6V; l‰æ¬—†@žß2ÌFF‡•út^ ü4äDneÄM™ ¤H“Õ·ÿÊÕp”í ¤¯æEáytº!m&hÄáÆ ÒÊmòV|°c< ÞWÈ·h AåÞ'rÄ*ÊIÊYâöØ™ûÚ¦ŽÏ \(îßa<4q…ŰV•™aLšÂÄÉ̱{ÛååçasÈêÔænõsј®øpÒˆƒŠ¡UQÝšB¨¬+×-`§í Œ)óD§â*B#ïÆf9ÅX ‡qȾOÕÄ„ýv#rønÅ×v‰¶‹ÈtÖ)įæ®Î0 3œï¦  xHJñ´SŽÑ³9{¾ÏPjç¼Í_²Ú¦©‰ Û>DÄÜþaY̰ŒÍ®ís”1YÕˆEtgÝ„›”Ï›ê?¤–‡cŽ5ާ˜òùD#þ‹£Òš1c¼Öø`C/b¨n*Ô“»‘¿‹N˜ßúdÃHÇ›‹A:382´Sçf$Ñø _)†z[×'ŒÊE#~…z…¼´•ÉVû‘ûä¢â†oL­jF$ã𛫣Ë[¬bóÍž-ƒJÛ’UX\Ø„†XE÷Wã²Í0ï>§í,‡ñzëÖ>'UΧLâe€žÃøó‰/Û—=¹aù:?mG#Œ—|m¼€±AΞWC:å?jMØ5‘³j šÈ\@·›"4O“QA˜m°3ûX uý¨úó,@]²bìsBƒd´-¯ jðÒí'•BW^9 žHè¾*ò1#ŠØ<`}¸@ÑjšqçPí„oÉhM¢”LBã%Ø)¤‘¹´Ñ—@ø1‹iJ§òè;'MÔµ„(òf4WtÀ›Iå-éý¯½C…e>ém’Ø ­ïÑ×yœÃçœßÎØ*ºÚ¯g ð–Lp£‹x£‹ÕôavëÞ´ñš(±¯;&uûâ4 §‡…ºòåH¤Íð&©:jÃK‰Çvø…†v-¥#6¡ª]žUã´üq¨yôø—ÑUíeêµ’àbÙ LúbnÝ´P¤åë~ª-Y6¤cœJn>¡ªi¹>Ä^^ÀV¼¾ûÐWÌôÉaÁýÝÑã l)jT&¼¯ üN„e§çŽmMQBÈÍé>ãç-‰ZЦ‚´f± éòÔ$]»¬ ÷‡¢‘̘ Îs-±'„dD ór蟧g$ÐÞ=V¹àµì}Sʼnžöˆi«Ðv^Äù‰Ü[µAVã/«Aˆ.=î'wÔ½@Ý¢fªRj}ž´¡Â­yÓ·‚s”äjKqEÃ}–þ6¢–÷&!YfµC,`'ý‹Ah>¨‹°ä>:¶¹ÊâoapЏ/|íh¸eîWÓ…¾íCS›é k|Áñ×½w>K»½ÉV:·LêÓ³ç9«f-ævãRaÂKQ©rÌ9y5…RG‰ý#ñ#VœºrÆWeìÜ}ѸòΈúVÂMtb/¶#éþÒ1ø¤Þtá†Òòþ~ÞrÌ7_E‰G8=QW—Ø:>ý”ä „±Ágôg=-ÀîN¯—5™ã…Ë)Å¿­$"Š vPù®êT/Ñ*KZ°1p÷!¥ÎÿˆZñ˜õI¿QEC[ß›¦… e` 0¸$‘í™<¡mþŽÝõŠÈÙ&7o×þ ¾Ž,ðfAË=p*yCªþS=Z¹^'tïF|ÖU“œ0õy˜xÀÙ½‡éÒ÷ªi9drPŒžj úîúUžèyH•Z)oshç5 Ró7¼Ä/}S@Oi…ªO—;‘ '·–JK™­ù¸÷àWxØpíòxWû¥·—sFü˜¡(ï «é^m¨£cðµ¼§(®³¢«Þ$¨ÐŸÃÀßÖÿB¿”¤îÚrõDE(Ÿ¬º¾AØþâ[ ÿHÀÉEÙþ- [Ar˜U×ÊŽvdGàLO ©(¥¹jêa}ǃQjíìví›Ö}ÿ×!9ß0”ñëþ ø»Me¦µík C¹P3ñô†/g–1Ô{û¬FpíNor“Òƒx0{©˜!‚Ž6þ•»#«ü¯Mÿ½¾Ç•©ùvHyØgHzBlA9 $EÑ?¡|cÔ­ué×-"p˜˜‡ÁŽH›Ô'÷—)-÷ä`¨È¢™Ñ„uî¢Ár»Ö7+!¦ÜÚ£AÃ’HR~c¯q‘‚gñNÍ{øyxêœè×[+—W³Ooùdú5ÙÏo™ö Ø’Í üÚÌO%ÞæáKlu©Ýp¹ÊoKÝ´~Ý5íÜ6×U 8&¢Æ“ "lCb”©x´=.’¬}ª{N4-uÛ·Žvb¢Õ»‰’êVOµÇ±-¾í€”ÛÆŽ„óuä£NØÉû…ù*)Ã2‰ù¿Ÿ– üô} 0޵A”âB–®ê†&·¶MGÿ é?'XâR×!¿Dx‚H.ôÍËËÀÌûØÚb¸€Î|Àùõ×8û“„g¼ÏTØÆk‚ðÙ›²eŽX/ÊaLÍŸû¢TÐÖ7fNŠñà“Á‰j!»Ø7“5×ËŒ¯vN#§„Æ{ŠJÓ0$2q s7¬‘ï·×¤7,kΚ¼tGnmës®,n«ýÁ^¿N'Œ'[½[ÓS89êI¥»kz9hgáÍ.eÉ'JE²¿™œŠ®×™ŒHy§G©„©Ò«ÑSÎÏš•=t/-"£÷Ȇ, 1Åö¥û]¨L‘¿‚w Îg'Ê5{$î 0*¦ Þ/W^ΊÆü`™æÕ8¶FXØx@*MuªQsXƒŒòd°Ï†¢IbñR‹Q©°"~|¸#q´uËÏ~À9wab¤ÿšý Ç–\՞Ο±îª‹¬¬,ÿø TÆòt¤G™´èÑæ Uþ/ÃYÄXH»¬sÇ’?Ø66äùûá„h/B÷u®ÑKëª9~.0郸Èm ªúLæó#A4žŠ=é"G·6ýú¬ÎŠˆÁn‹£³R""7õ¼^1éô߃zÃuk2 °’?m°0®Êõœ‡*ߩՕ]D5æ·•± å?'BÁ;çGéø 0ÎÛ{m ­Åñ3§A×îŒÂ…¢9\Áx¥QºP¬DøÈH<.fó¬4‰{ÔP¬4ŽsŠ×bc¦ìxIÀKXHM'»´/_ö92ÑŽV¨H“Ó±Ñ×ñ=‰ËÈ«ŠKÜbáȹKBóQPC{ž€hd râÛÂvvxR¹)7­Rô³·¹5èŠp€ŠžŠ«ë #óÖŽoDѨV¼½ÅU³@^÷×ã¦ð·D&·,•TC;¾¶EŸŸ—ßлã)ŽYÝr§0n>†aq÷ÿÈW¶¶¸TC/üE Ñ}¬°sÔ_¸„R‡9ë…àŒBÚShEÛ½]\š€ÛÀNµwÂÚÀŒgl_ë¥Gw…ÃÉCGJx|Ô–&+|½þ蔞ÄwP8MÑTº¹»‹~ëùHʃ~Z˜0ç¦Ó¥lG‹°|Þ_îC^ù¾ f¿Â™-ÕÃ,ÿ’ß61r‹D’ öQH‚WFzÿ1´K]qo£Óäøæ–·Ÿ¨ŸÜ&ÕRBa6qfáž¼h2ás ɤ-EÆ~.<N‚¸Ÿ¢u»Ž—ï>ÇtùRÕÐÕX ¿Å×XãÀ¹H¯¾s|)û+BRåê·d õ³äî(†K!ò[veÕÀ üìKk3õsŠ¢º[{=ƒ#òîÓïøzÿÞ¸WüA'ôG8Xõ¬ÈÞÇ)G¯ŸŠ% _2Û~®%Jñ)Úé¨ó BAiRWanù¦Ãr×[mÞôX|Œ »m'µë¯uêUõ¢„±ù2ëTZn…Šž~ÞÙ-²Q•™VÂÔj;T½ëŒ4Ñ1å…ÞRl*—óv vðDk=`` ÊÇí©ovª[߉òÍ¥ê·ÄºàYN– ½;žÃM&„ ~|?j"›r²P]?-ê¹—î8Ëþuá¶:2©s6™ÏKëÚ¦›Ý˜éj¤!‚ I[‚ìûÑÜü*;2Wx4¶›ÚCén7õ}%c%×>Õ!ù®h€Â±ÜDu¬Ý²vªW"ïm7]z%¥¦¦çé¼Õ¼N²×L-Tœ Ó‘MsK¦zVF–úñ‘ÿ¤¹_P‡Ìkø·êJÈͪª.ÙU·úü>i7&Èn¾ ǃ5x1rb4]–b§¿ÚÑTÌr¡ÆKSf(Älmü¤u¢#²ˆíŸ¼öxZÂß ^7ð9EprDÉÌØ±ëMÓ•ñêW]DQÞ:"O㉯²'S;ùÐð-®· Êaã?.õDm,SúqX¤Z?!ðG<ãSóp5ø^škÓiÓæ‰(H,¥lj]’Z†Ãœoê@apèr5knmœYݾÄ¥ÜåR¦ž3ñ«Ü7—Îïç–Ý(ÛŽ Ã¥®'q¨á^OJ ÇðòU›ÙVpº—)ùð$u¢9~")¤VåX è ˜Ã_¦‹Ÿ Q¯v!¾‚øÆÒHæ` SAó€‚MNÂÙó ®ãGΧÏ× Ê »¥¬T IcY3SWûž[ö–'ŠègX/ÅÜ{h—!à ̽WAƒ2ñSkÞ‰í´ˆ‘j¸>—:¹_ãʰŸØ¸%Ï>5Ê[²©K›mwy„%¢žÓy.Òmiãx§}òÍ{ )¢°çÜÝÐÝæ ö'çk ¶¾®Û(WF¼qÈëÍ1ö#é2ŽŒÖ µŒ\\þê Ë’΢©]ÈÉHl£ 2êDD¤’¤ºÇ€“÷®¨|‹Ì£Ùf ÀÎH— Ç× DI¦•¦É=– „ÁùÜn¦­ÁÏ”&I[û"Œµ8æ‹‹¢Ím³çÉ_eTá‡ÐŽâýd|,„ïçèŽÂµF?ònó+¤p`¦frÕŸ4/exXxÍa € y*Ü}ýÓ(¯ó´'é¼d( =É ,·´˜\K<4kó6ÝAœ³ßË€>Ù¢Éßšï²h†¼¯ÏBùKˆ°fNôãÓ«$»ABˆ"g¦_Jã»,ÎZ5„«ÉUÜ ÅÎâÖéÖÏÒžÛ‘ÇE{ãøï`ʇ›Q²ž+C ¡ÐÙÒ:íU_åMín—µ‡n¸×½œD–üÈìõ‰Ÿwb²ëôžEZ¢>†b¶åG#}X—–€ƒá>Õxf ºEIn|.x¨X,QBË ömðí{gy5ë˜ï‘þ ýåO÷y¾R4`ª²!‚íДù=æ÷|•J"ý¶ºž«óÇɃ7W2_6¼Ø *rZKľfŽˆ[®|Jå‘ ƒ?¶¸7¯±f^kÝu¸ '‰÷YûÁ`¹ŠÂg4÷±¢Ùw‘ÞüŠù¨[°€š‡õMóñ*7Ÿ?QˆûTj‡¥l5f} ÖÁ×ÒVv¶õš^ïüÊÙÅ!˜ßöë›vuêôîO‚·Øâ0òðù”ôhBKG9÷åcdÄx"q à‹«.ßtF0­¥jÇœ…î><ß0,è¾=HÄqWàìá2Ùƒ¹ââù '@ßÈàÒ f¥WNÇ~ö'áiå¦dAÎèb!<:^ß”6M¸o#y÷ëóë†ØrÜWo¬áL5Ò1l1Ê6)ï¤>ŽEUˆ ›Vó =Ýö7ukw­< $P1TMáÒñî¶¿á¤ê–AÅ©÷™c7¹á¨>8,S™ŸC¯L̰ÿ*héB@e”^FËÍýÙm)°2™©æÆ…Ö|õ‚ã*yn£htJµ¾¶–‰(²_VTi¢K»&Õý:ø*í»‰*[âNµkÏrñWøÓ5kÙ¿ › ŸÙ&ËZÙÄðkf÷‘¯¦bÅi0Б˜eKÖ×:8¢NË"IW­&4.dçt)Œ½\âHГЯ-,)ÚÊÇPŸÖ¾&$ÆTì&É/…¡YW…i¼•âãS°3ÒmKÓ%ä)±¿/O¦îѰ4ÒÏ©îM~º›¤¥p&nû>^’ÎPø\ಸÑÃRT1îûP×î§5^`ÚÞaÛï äLl^A÷}rP%+þ”Á"DþÎ&±‘ m@ßê0™?"^ÿeSXö˺t^Tæ~SÉ I`¾ä'×Õ9ßã)W]n2Ôo/# áí—/oÈEÃ…-þUxl §«û¼i §á}‹Ñ_¾ë¼Þ´O‡ù(‘Éã˜Ëc†Ç“³²s|ªnRVÃÄó~ŸWuØ‹æ A [¸ÄX\èEtSJ0T<“hv›~zGÐ’Èÿ½È]+„ê£Li üÀ£:`6x5³©ÄˆXìnúÈø{pxîÇNq t˜~݉ÅE¬H0»g?½8R®T`±¢VÇhiImh.Ṯ¾•ÑÑ,R£­ïu£ì3§LæTfÜN¡;ÁGºhœhÆÀ|ãœáI×Í»[•gcði­«ê©ŠœA‡…±jh¬JšÔßew¡l/îÞ|;˜\„.r:h%€ÏÖÜtQ™¨ á®"q±uÁXÒgÙš-å¹® H½š q똳pÒ—‰)~ ü«£hKÓA^&t?ÿ£a'•_enò™œ®Ø2áéI_hõ«^sΰ¬Ÿ\G^Äëoæ7¸¾J™nqíeôtÚ';|2Sïºù颦.\Íôw&ø :°}åßcW¯ãuO±~EBf”ôƒÑc*Â¥!|Û½»'Í÷áfü endstream endobj 116 0 obj << /Length1 2540 /Length2 21792 /Length3 0 /Length 23255 /Filter /FlateDecode >> stream xÚŒ÷tëÚ GMc»ÁllÛ¶mϨ±Ù8m»±m6hl665Ι]kïÕµ¿ÿ㜑1fÞëæsÝxÞ9É>*ªÐ ™ÚÅílé˜è¹"rÊLŒFFzFFf822UKgkàÄpdê@G'K;[îˆ8œA2Q#gœ-@ÚÅÀÄ`bçfâàfd032rý×ÐΑ jäji £HÛÙàÈDìì=-Í-œAiþû 4¡0qqqÐþå²:ZšÙ䌜-€6 Œ&FÖ;K ³Çÿ„ äµpv¶çf`pss£7²q¢·s4ç§¢¸Y:[”N@GW )à7a€¼‘ ðofôpdU K§¿å*vfÎnFŽ@H`mi´uy¸Øš ä)Y€‚=ÐöocÙ¿ hÿ© €‰žéŸpÿñþÈÒö/g#;{#[K[s€™¥5  .KïìîL 0²5ýmhdídò7r5²´62üur#€¸ÀDð?ôœL-íè,­SdøTe1[S; ­³Üïó‰Z:M@e÷`ø»³ŸlíÜl½þÌ,mMÍ~“0u±gP³µtpJ‰þÇ$‚û#3:Ø9¸X@ÐÝÄ‚áwxU{à_J¦ßb/{;{€ˆÐÇÒ úçådä 8;º}¼þ­ø_ÇÄ0µ4qÍ-máþD‰fcPó-Ý:Œ Ùc0þþûçI4^¦v¶ÖÌÿê/ƒ¼¦–Œ¬ÍߌÿÑ Û¹¼èXtÌlŒ¦ßCÆzðùß0ÿà¿äÿ’*YþçpÿŠ(ekfàú›¨xÿåáúŸ± üÏÊPþ7ƒ¼h–Ê?£¯ËÈÆhú`úÿ¼¹üÿ›ûßQþßFÿÿHÜÅÚú/5å_úÿµ‘¥µÇ @£ìâ Z 9;ÐrØþ_S àß«,4µt±ù¿Z)g#ÐzÙš[ÿSFK'qKw ©¢¥³‰Åß3ôß.€Â[[Úíœ,_6:PÃþ´p&Ÿ@ЍW©€ }úß”b¶&v¦¿™`äèhäj=±¼˜@j tÿk´ ô¶vÎ ˆžÀÌÎîwGÙÙ B¿E#vƒðÄ`ùƒ8 ¢€AìÄÁ`ÿƒ˜ 3€Aòb0HýA¬é?”]öe—ûƒ@Ùåÿ Pv…'(»âʧüò©üA |ªˆ»ÚÊ®þ²küA |Zÿ .ÎèÄ:™‘=h%~_vÿØ€¤ÆÈßäÄÒ™ØYƒZþ_ +ëo‰ÍŸ¨¿gáO8&fPNSK #Ð tþ1Uø'.ˆÁßãùÇ D43FN:÷ÛÇÁ´i€Jfö‚ Ìþ+-ÿ$aù ]ÿdeú-øŒí·¹‹ã¿¢ƒ ÌÿA\ÿœ†Ô {  í¿,@2ËA-«AP%>ý ‚Šùo* JÛü‹ ¨Š"³\mAkõ/=ˆ«ÝŸÃ€œíþG "cÿG fz‡ÚZÍþÔ˜•é?RÇÿ)=+èÔ ¡°´ûÓDVP!ì­]þÕ¿ßµsø3I ô.v Ëç›ÈªØ¿êÉ*ÏŸl¿Ðõ_õc™;^)ÿ¤±v²þ÷01÷'èVfp¶pþk’@LÝìþåŠáò/*ºë¿ èànÿ·û¿ (¼Ç¿ ¨¦žŠä tü;ÕÿÜl&.Ž ¢:ÿõîðñ_ß/€@w  Üò‚ OU]PÇ}Ð7º½ ¾Y²=T*:¯eÇN—G¤÷ITÕ™ŽwBI#}(k;b”·‚+D/^'­ ï¿´%(µ?y?Ä)OïµÃ-Ma}›,<ª$€Å§SÜ÷~qðV÷ÿÙ Þ-M–ëà‰¤˜~ï6 á^?X¶:²°§´_Í.ÿ\6C¥©ëÿuŽ,Ï8k‡Ú™Ž†íÒyîön-gòH:ŽÎç4Š¥ÈK{“9úaÞs½B•Ù©—W‡òmlšÜKø0Y{Ñ«¤híÛ’{+oQ"mÊ ý!sFµ¥r„ms­ëØrÓnn ˆâÃ7ôÝ„ÚÒf GbÌêvƒtçZ–O@‚Ã.3áõŽ;õ^3«ü®™ú7À¢–ʼn_K¯×SƒÃúÈè7º_!)m÷#Í£;½>_ðÍݘ¨Å,tÂ×V¹3RÞ•9Côh¥0PhW\“8Ÿßózü~ÄcÚ.ddÔæ|×>†Ζëý3Ú§²ñR¾ksuÑÚ M/ð-]þ͸;åò²ׂEÌ03„2/C¬7,ïG …O°q.°Œár³‹^´ÔƒH6~›méçi«”DÿÞbÕH¸n€‡ÕWý¹z¥Z{,[ÒÇÝÓºñÃFÿaáÀà®;ÓÃí»òra}Ì#;õ‡ËJ·Pá‘è-UŽ ¼°.e¿œ'…4 ¡ˆâ_;óý°Æ$gªÂ®mšc5TùwÆ{ŠŸÝhˤDÉ(Š–åeŽx¿x/ë-‰õãÖø b…Ý6û1×u*ÜS‚!d¢¬G“eî¯B’tŽ4«ÿ|Åþ ¢zŸOâ¹ Ö¿83¾óñûô©—u¥îWÖ[d¤uùÇÅ¿ôë >ÊÈðW³ð–jnB +øµs߀§ÃcPÂ$ï;Y1ø'N%…¥™?d‹h0Þ²­¶=³‰bZøªœtë~`Üò—óéöh“nˆ „ªÃNí?³'å̸Kä)Ù•HÇݵ¬&[HÌþ¸8 'Ë †]«“Žz³SäKõ1Ò,X3Æä5l‡wžc¸.&ù§2º"‹XÞÇ :îZT ÔÍ×)!$iäjúwËu"Ò`ÒÎe`äý^бìµp$þêSýS='ó ’ó®#JG‘ÄÍ݈ÅÙcÜ~ª„’zW¿ùÛ)ñNL¤ÀÃO~nâÍ"db,õ†I{ãm?²¹hh~XÊü1bqù#7h£òȦ±±¦&C`×Pàš#ù Þ`,÷NR×5§»"/+Ó<Á5Ÿóä½$Ø 2"{Zk‹£Œ ÓËSºšØ;Ët¬IçʺéYŸ;Â…×Ï&„dº~ºmmû¬ ¬®u2 ~Iµå×\ÔW?c~Û7‰ÀcÜ (¿’“~ËÑb¬‹qõbßÀI\нï@8æ8Œ¤³àòý‚LÌRÑ’¡_“Á9¡ê¥Å–•ñ2 Ñ–Èî„#$ðX¥D —¡égV`œUO©b—R$%µ~:z¬h¡KÀÞÔéÁ9™ŽDÜáÁàÊŒ-’3“™'W{~ù%=†›Fëb÷Y®‚yÇó‡K|Zî—9vêôvêbÄÁ>Äòé7®î‰’ ™D,*œï“¿¶t/Ísœ+ÉJw¢'nžl¡UOÜ:ö;HsMåuEZ2 'Vî&‹4˜Ý‰9>ÊšÎTí|°;ù¼Ë¤Î9,Ì'X{óxö‘1¾W+ÏÎóôìaê×Ù@e÷ô¦ÛÖ-f=»²þ @•Á‹€”Åwd—Ãiþ* Ô’ºpŒ†0¾Ï:U,ÔšÊðª%.mÞ…ÿ¯ÊhX-XEíâQCeŠYô‡²PÓ~î÷PÅ8:šê¡¨ØC×7J¹ÕˆªŠo·®¹pÀQÚxû×¼@G_‹„Ç–¬Ÿ±A‘†4Ö^x0¿€J¿b ͰÙYð$7\§=qÕÆ1 jrÆ1¾i—3R—íE¡UÇÈÑ Ûû…ðx­—ÁúW*±`ª«ó,åuŒ‡Î"!¢U)Ð+doZÒvpr–/žö‡›çðéòm ‹o>ʈ߫æ?¥Æu©ûG[SZ›Wõf­ÏTF­l9,›Ožÿ®»õò`ĪĄ]3öPεí ^Ôòu¬ï¤ÿé,ßÉ4:ÃÉ3®æ}eÁA!÷¾l¶'®^4êe™#|xQ~Y «¼hW„œ©”¬å+y‚Ð’ù‡-[kvð/Ò°1â W¼2°{'Šã… ÑBB8£®! ¾?f¬óÉïµö(–'À4V¦öÉ{òýe¯¸˜é –°–Ë3.°ÆÙx}"pœCžB’Eó9,àpôW:¹î­ÛëÎLB.•eYöB“ô:¬*KÌÆn‰4&çÒÂsy ޾èXÝ:ü qÚGÂÏ»å<4öº…nî¸hZÛpúëlbUãk‡ ˜hø9k­É¿¶.ü( …¬›Ñ§Ï™ ×8]è¯]hÎw–‰¯ùy.i}=G¦ÉàìÚ«7rÝ!‡SP†qÑ4˜ÄÝ'ÏçS6æ¯6qQîê·+¨ÓYÄz$žŸqR¾Ú»^õ"f„Ä¥Ý- –Ð; s…‘bÚ¶h‰TŠ0=8—™ ’ü*á›ú$ÿe.B¦ˆS—­YªbýŒ:ԗܙȆ¨©ÖË·ÉpÄTÃÐ(§-œê8e<kÝ¢Ÿi9}:j—ðŠ"~-i}Q|¼›WË?½~¼œ• ì™G–Œ¤¨kä×Vœ@–ZÞt&+Ø}KÎìÑ)¡â ïzε˜°ÍB¨Å=Ò¢˜[5êkRíÿI¡éè;·‘Æ`k`›)-›‡C™,Wwû}*®²QžÀKF¼qcõRÿS†ñ>ÛãÏXg†²Õz0«F…jyà­ƒ^Ï¡h®Û²kmûù¬ 7L©¤¾èŽ6BoçNI}ß®¯lµ7 ©ÓÚùJ:Ý^Úe` zÅy,ÀÃ|!ŠðÂ6¡×ðÕn:½ ÜgĶ…ß4¶6wRL5%¥›Ö½«ž˜Ë —åµï†BkA¶FGðnýœÑÀyøH?2ÜDc61äéQâH´eP'ìY5ú%'ä†YÀu®âøºãvñK¿&¸QÁGNÜùB¸äÕ/8ænËßÃÁÜsì‰Ãj z¨è}þœ‘Vù`m'¼pT‘K”œåú‘ñá°9\<1a}ãñ¼TlÃH'4Àì^ÑÕO28Óûø½ÆsϪáŠ:1‹ð Ûòõóþý–¤.ñl¹ô=SòDÚ™ ›ü=W™=?3‡t»ðËu£äyx“9åM©;¦-’3¿NÕ6çx‚„Ó`‹?7‘2)—;yè£G•e#n¸ëÈ‘UßFI„쀲°>²°‘u÷‰{½Aî¢Vw›Ü×j¨ýóUŒ‹ð÷èÑí•È|Kž¬ ƒ7—ó>úü0Láå1)½~*ÐL¿$׳m¨Hc:J!²eZt{ŸU_=ŒØrŠZ¥óS<„\PQøzP¥ÓØZ`XÁ‚l~ñëÓ”xp÷™qüðYýÍ#¢’V_òQvœ01Ü×’áöéûøW¦ª«ó&?¥T­Xð'W“ð¬¤×\c©Ì¦wÅ=3 ›‡šòw¤LÀU$É“yßÞuÄŸC]mÁ8Ñý³ÄðuwÔkËX¯*…>zxtìpÿœ¥ÁÈ6ùXà~ù.9ÀxRîu!l‹Á̇e#9ãä{ñбDi2jå…™œÓôû9"M µŸç»Ææ­Æ(}x¿¹E2«ñ¡’] ’o0#ãÑDM<‡_ê&®|ã¶¥[\óêüõÖHàH—ß—!¯RˆXø³¥ñ©à¼´Ÿ}¯éý)˜P‰“›nTÑàG‡‘&äkrdm§Þ GyíÖü•dÕpqÊVËËjÕÅÛ• Ê°BÊ:÷Åw³öã^ÃsÞí¬bßè©Wb>´Xuêß„½Ñ¡>¼ÿ’ʼnÂ'HìæóŒûûG„JN5RÇ«äõë$83‡~¶^Ï_Öõæ³?Ü÷œ"©ÑV‚w9çRí[rK^åv)¬RVüÄÕ»^¦ ±ø+\7è$¸C·~xfgHjë’Ũ¹.õ€"Nyîèãl~Žò ó“WÝnibáéÒ<Ùè°ÁŽ¿Ç¢›e úE`¹³()¸ëo6øò©E™þ$ãöÅ•ÂoȆb\e§O´}lÙÚ㙇#+AëvA¤¾rÐæ¨Q¿©ZÂ…Í@"ãý}ã2Sñ²3CäüëfÔØö%Ü&kX-S¥m¨Á“(¿=4;Y™9—)ÁcÉ ¸žà…܃á’þL«„Ì[9t¡ÛÐI;Ô®”£Ã…P ‹™PÀ†ª¥K…_ßúnÿUçôÅé š–#ÊèíwLÔŠ)á{å"Èu@‚3* ]Y,-Õv›QYáH›Åö$—ÎÜW—7•.™xÜ ÔU™R#MÒ]7ó‘„&…@m÷ˆCPR”ÉoV(l²_ˤzL}¼-{HãÃäüóõî§26×ïíßôuŸÃ¨ã1^”F·JäÍ‚iV;º~eÛÃF-Uƒíðœ¾6?67ÚŽuiÏNãíG×|ôXo)«˜‚x¤î€6¿{cÐdÖë‹e-‘LÏÏX¼J×ïrÚÕe¦ª]FøU?ÅÁJõ­ð:MÒ66¢­¤RˆƒøÈK4D™—ÙùEnpèæÁi¯Øïé—”æM¼YAiæ4äöÛäË úr±¦Øé×d”aúã­=SýÄÔÒ«*H=+Z„Õ0ø‡ï.¬V Èg–…¥hÊ÷C»[ÛaÐVÐøn“åóöHÙ]ëTðTµPÃHVqªdSÞX'¾žd€MRÜþêðÇ6U—] ¥9Àr¬x-ÜÔgh)uh臹·ˆD®xxÐ&¬ð -uD`ùDKÏÈ9”[ä·¢âÕ°0Ü•ëå[Ìyû¼ÜŒýMuXhøÞ ç"µ >Qчç]8ñl‡ÌÝ,ÉDœjn3’ø¯Gݼ—_ús xð†üGÇÊ~-Ï"Þ¢rlÇ!S)‘† ¡þ>ptVpvOÝïÖWÈc/á™2¬xÔãþ2t¸‹ëE*{ŠãUBeXkØõS3cbÌKS’нØÕ„gZ»#tuâ#hbrq‹zéÃÂaÛ9¤h`z?™Éx•Z÷·?ïCZèoîÖø ‘¬ y™Û»M€Y>ZÙÁp9&Œ«yÙz~÷aWÑ»æS4Ø9ÃòkTt(©Ú+É+ë| ÿ¥`Wø¢¡À^Foúm«OðãÁbÊ¡>^ö |ÕšH3™óÚØBp;û}š^Dô<â § IaãYF8¢Ïðb<Ñe„ÃiPò)3â˜=7»¦v÷ƒ¢Kà"Í’,J¶Û{pc~»´cH:X"䈰Mƒ9`–9Þ¯¯×À£çÀ0Vº’ªÐ-ÂêÐí²á(ƒóLéö‘C‚äHR|I«‹üËóÆù±é;äÙ•~èäª;‚V-…t†ÖJ‘ŠœÝÐBC®‘ͩکþv6eÆH`8»wÒ”y²Mþ5ý4¹¬W‚[ĺIM;„`o„£¦]²˜Ü#J?‰;ç‡H¿û‘ph_1)¥ð—v>ùJ0ne‹û½[¨;ž+2Ò:KmPô³A m^Ü–§ÁyDÔö*k¡cN™X<˜‘2rGÚ±´A¥"¢€f˩ۀ[ùLGd¢|Àf{Ӳɾ»ï°Gº…­–¼° ££õañßËÙk¡$^¤/—ÝÆ"=Ô€ÆÇWÞMø…÷žéS];O©oâÒ¦†éÅAË··ê$}»æÇ©~ñç¦ï¢98Žy}*Óêäj2Go£ùßò;!ó¼\«2k¤øËâ|ã¨ñ¿4¼ þ9¡Z(lP›ú¨3àÉw&U~ÿåèÈéÃîæz­åÌ߉Äxñn˜*>[MK‚‚7Øž¬g#+®„ À#XêT½ûÞæ¿*ÆO{+éþ £K®¤ÎÝßm ‘ì-Aª8õ&T%fÝaXÐlB|Ú“$ÉžO=…/ZÄœ«|—Ë2!Cù®„dÒ0°<Ünž•®þboù‹º¨ñ7ͺ\ÎdÉ8` ùËéOo1-'vHS5Ož«ÔxÆxìÝ’þj‰Ǽ¯u O Q–ŽI^<œ±Áè¯8ù&?I5ï` Ù(¦Céù8¨X3“ _ÓÄùBÓXFV´óG†'C…+ýýMaxa‚.¿ØsDîA)TqÐßÈ„ÞÆ·ª$X‰a%â{«bFÒÓ'HÎ7ï+ Aµö‘pÌO*Ž3ìF1 3G˜é(Å?`T»"õ“`ù©‡ö1ÏŒMeG³©ÇAÙǪN€Ó•aáÖ¶$=†Aù§?/£ÜLÕšfèÑúðÍyÔ¤gë[žP™Ï6™5&m€À$Ê}G)²Îª/5Û±–‡†ËÃýÁ“ÏR›Å€§.aüR ç ¸ÃÀlžz„´æ”qsH¯™RÃÌÙ+ÑûT˜úC‰…&á$Änª§ï£J[è nÈÅÔíˆe¤&§¾ ÜËtž~¯[Õ|#šÃwÓ‹+ªæÊK[Œtk-L \ó†µYaË7ņE0±wÑ\ •ð Ë/¾3Œ„xèSþ^ñj:~¥gBéǵ¤$3qEfÓ_X(´q9CÑ‹§vvZŠàÌ9J|ž{M<3:•äÎ1dzkÛ\ž¤EtÞxïÐ#zò«þ |å—a›i]àn>_/¡9«ãBÐ¥¤¼³‡æûyg³ï5ŒIø=¢Œw®éqÙ“œ¹8oÛðýúG¥ã×_9cLÒɆYê„j*Ø sP¹×àliXA3–q½ ™§1+VP¶/>¡ììZµÒøjs†Mß>ú-–AÔoh¢|$Žû‡Äx\¤2 {–}–Qk4ûMÔ6ú]³¦vÒVp:rÖ¸ö>?4ôˆùÌPÕÃ!Ú*^~œF7)º2³s=¡e3·m÷¥¬HÀ=î a.8eÝàb‘—N»cÄ¥Ÿ¤xD[‰x4ŠA-„òZ4âËzý&áCè1ºó½ÿì[Âèp_^Âú#¾ ê)ó,•EC4û/ȺÌê ‘˜ãÏñçD})f tNIÒ¯ƒ÷sÓÌÅáÜDk± D°ÇpSÙtm–|špÌ–|Ö\€u% Û"süY.6 Tï³Â=5òÿyÝsTw>šKXÔ»qjæ_,$Ý4ô‹eÑ­³®eÜRÓ­†ÃÿNR¢EèãòLæ±´´ÆÖË &²7Í`â[hŠ™Uek™"9ºùÖO¾}"¾6+Nߘ±T°œD—yºÇ¼õ£Lõ’´ºøP€ÛõÁá‰ãaS°³×srW tt¨wŽ)Fƒ™6ìvüEɬ‘|Eðv!o«™„³Ä¢CÇOÉæÞ…Cä¬c".´)K,æ«s+áWªÜyÓ””ë ‘CRêâ~‰Y ž¡¨=Ä{é·j4€s 3Ô j_Mä—ê#Oô&Š[‚$Ì=0ÙÅszÄôO:‹i ȯQžÒÔ™DÌzßÃ…-`òám1Q”ÿÓW|=aŽqï¸(»ä|`ªu“æoýˆ5;8K+_zqXFØÅ¯ïSzÐËN§Ð©üýz3Ö©¨6ü>dmÓ–§É §«|­‹»±¾jÕšØÊÄÇ ÃI-†Vv½r/~úÄÄf·&É_í¸[HåAzxÿn2žwõ)^é}—¤R:¹&*¬P¹ë­oåÖÜÂMï: À/øÆ°h~¡A«;ù0œÿŒâúº8nÇ=M…œålvÁþ^m£Û.}Íǃ ¾ÌIP¹ÊÍ0ñè. ŸÆ9c‹ä¢ÚÁ·Nøa¯\²Ð8º?¾‚ýà+?&$RáÂ6 øˆaõ6¹†Å‰0é&úÖó7òDéãH£5ðã³a ›ÿ…ië¿æHO²L$øQ#yi Ârº,ÎaZ÷P,R´Õ€Õ'®R¹8†§€é!å!©Ì9Eñ‘6ýÓ©Üü;ä$}N‰u÷~«ç´`ìŒÎ)›qMÚw–ƒ·™¤?n¡_Çq!ÔÜLÞ…QÛrˆ¸ÓeèB¨¾“(`»ž—€×s!X“†òÚ%£'¬g½Àx¿hÉ÷Øå_~øÉEaOÑ“*‡: #_¶wà«ólT:m]SÖÜ«3sFVÕ)XQóû¬·óÚñìÚ…2F×¥ù•Ú€·4µè(N-ÂzÖs©Í5óà.Bâr²æ¯×¬Þ=3±{•óOØïi O:ôÀ<’ä%“èÝ[ “C0 ,¸vÅ‚ôÝS¾¦ÈÕB.c±Ã`Nžl¹2<}:õ¸‘úc–Xá[ò;²0(7®Œ!„eGóa§ÑÑ©brçüñF §†ühtK¾…çù%½Ž?РéÇŸÖ7/Y1ž!1\ukI¿ÌRú¹vKÖg~.FvçÒP@:ß\ 6›,…ÝôãbóL:Y*¯*MœD$^™ €,Ù•EáWõnšÑÑr®u´*üæ&4^™öˆ*§*Zë—Òî0¤Ý¹Î±%»ë!njž'<Ótu6qóyðœ‡þrSÚÒwB¯Ad„ÁÐ)›X}<ßSô¢fGUÈâ¨Ý ¾‘;‘ 0ËÇÕO°¼{EáXâô¿e-#ÏI_Ï$¬²qä¤[¥Q©èä$$'ÚàßèÞµ 4óh(í““ýnÕ-«»éïÍYÁžnga6Sɉ0‘y$ʘ1ïh‡@›Y¹!Dýiíóºgšž³jôvx_E¯áK§‘ÌBN?ÏÑò±†xF©Œ˜Ì9Ë·GÖƒúßZv± !%¶qDDèÇð+òß퉜I#ËF-áB,¹ ¿ûájó&ÒlæïUŽ7&®ýJêó(ùTz:_Œˆ¼Wäbù~GEf°cù{fð€^ ŸTæ²7»f;–ÑÕNNÿQ»˜(ë›Ë!×6d±ÝúÕÁeåÚ++›—²í×míÄÎÁòba‘~p&“2×1vïk*0~9å@zÞ ´ˆ£ª‚ í(ä ñÂá]²g‹Äo8ˆ¼þåü*üºj›=õ¡} ç.¤K›äPïü¹fÝåFÛJtj¤ÉaœÜ“ïË÷ŠÃžØi$6©³¦¬tˆ%¾p>Q÷l¬NÜHk¯ 4Ÿ„g»£º’$S„¼‘Ùöë×§‰ b[œ %C¤QÅݧál ñ]`$_WÀ"Äp™•Ë%U}‚Õ$åCà]sÛÆóÍ<ÍKs&Ô‰à‘è·ýSç&ð³üi&LÄп×·»#õÌï9 zžhx`µ~nXÁâáÎîÍǧ¶˜õßíÙჿßÙ"%,˜d59Ízw«&0÷]ŒçY³/½ÕÙ„t’.Ùì¹b’c½j}ÔÞ‡Nf™ð=|ÂÆ(µ•V)+ê¥HWøäÍ‚ÞrÓQDaî•ÚË÷I>úH´A]6žLÃŽ­Ú±D­_É„1kì\«olúËa,Í _tE{—f¢¿zdÑW‘Nfv¶VR6º0e]¿÷›w¦Ù®±&¶ìÎt‰9“Åd>3ðÒ˜oÙ…gÎZ'.SîÞ‡¢{§(6b•CUΗÎÌÛ^®YL˜³ï§Ïëû8§÷÷…ùŒš#ÅŠð÷}‘—X2óWÜšo xƒ÷wl ±ÕLÓy®D!$æµ¾ø–üGG)ð,UûZª œ_h‹óï~\W-ó5ò•ìxãƒeálàš°/XÁ úMNÔÁÆûË.”w¢™øÁ<Ö0g¬ZqVLŽ?›+NF•fÒT3vfã§áɘ Æ|ƒ<ÁäUç~"ïØøà©8üÊ99²§j¨;Ñ Ÿc -1ë…}Å/~¾ÌÊë}(&×ŠšÆææžúØ~2ãÝ ¯?Ì!Åí"Ý"…“5·è‘èaNÈô±þýàÄ0Ž8¬&¦qös6ârìuü‚;t:Ú»SvÂé]=oþ€Uæ¾ÅþOÂ!~ižÓ?ÑÙûŸ¦h·½1_ ^÷ƒóû¡™¬ú Œ‹®Ÿ$áù…¡<Ý|ÊpðO’µL OÄ›¦€âëÎ;<øžÀû\Á³UðPÿ8¨Ml=N…JðYÙÿg”³±X¾\ —RL¤ÿæ@¬3N—¼AÃÂÕÃßi ø™pºŸuðÁCÍJȵô“ÆØQiÍÕaRn×ÐrÈ\ˆëºGüxÍ«3¸`ÎK¤÷q¬ò0ŒK÷£Ç£Ú·òlœ¤Í˜Ly…u¶ý©À8MK·š—6¥—ÃPûåÖ¼*m órº÷×ëè!•D7QÄ÷`~Áô…Á«äѱite{‡Èž›ÂˆvµÑ%þÖ½‰2§Œ X™öy†•KV¢MZxäàl˜%<奟«¯IÄ<^ÐbEH#8EW˜µ¹ëqøs£Hš!¥¹ê"¹B!Eã™,‹ô dŒ Bªa<™²jç4 ± ¢Ô‹q)Œ·È> jX´âsˆ–@hIth¤¿n3‡^uï}Å€$˜†Ð.‘l dÐ&üÊÝ3zÏ—bÄf“W•5ŒÈ%ÉoÓ¾ð=–‡»ä0…úf g<àpøîêçØBB½éžÐûïñ¯f&}Ã/]Ë+ðJ¦ghõmyN"Þec†ã}ÑQ™~{<ÑXj<ÉãŠáMýÏ«¥u.Á8 ±‚Êh¿‘,Ý|àŠ<ãMˆÙÓ?í)ÿ+äv䬩ÊXqƒ#"ÇîS½¨74$ÄF+£ÚXF*îcî7ùË(ðwR>;˜ó(̵„V–‹=‡ß%Z¼æKä#Ú|á¢;¦õiãó¾5Ý/¤«K)m럙·$u6ob–ŸÝM7ƺ#Uóô¶Ç!Ù}é_X包‡ßSã:‰£'×Ö¢Þ½ö4*.×ëÔ ¸M؃ÁÔ»tC­9„}KwÆò‡9FðZv‡V8üQ…é啚/2ÜÝszC¯ÖÓsÀ}#SµÙ¬§\hO—ƒw2S÷Yn.õmá㣆HyF*Ñ™_aÅd<4öÓ0Za§f˜Ð˜´þT¹rÙàhØÅ-Ÿh.ÁIbÙrn†ê^‘*\¨ÅàÐZeèÓDû¹ žuRqE×Êšö/Wy^ØO€ –j¤"Ÿ]Mê`–/fªw¸O×,Kß)?&<î,¡âœ”º¾v=ß¡’qÝ.‡ÁG2Pê¿2vˆûD°áѸdž‡Š/[Áº9Øþ†Ô¡ºøZjw[3UcÑííl Voµ‡¬f€&ŒN#2¯/„sž¶è^.\A.¨8µSSž&@Q•ÊŒëÌ„rYµiŠv†¶Íu» ëjjí™ÂÁ(Y;δˆ6oèbæ aä×Ûv_÷$½GÖș̜9” [A1ZŠ%6@·íͶêèÀ Á^fFÚÞþÔ2&9ÄÝF²’Þç‚PdE P‡Ã-¡!ŒNByeybºÜ™Ôž?x´1_© X ÷*ÙVeì~7—nK{{½I"”*X—쩹RRÝ%#üa,1·KŽ¡ý‚Ý?û6µŽ ¹÷YCø©$÷Á—“ŒÝŒáÄïÅœ¼ŠS­¡¶Štì–FZ!ÅIáá­TC.LOGmµ#¡Áæ¡GÂTãáB(E¼,‡·ß~K£÷ïI?ÎŽ—™Ë Ü]–àCÖ?’ ÜP#†Aävîô_on¼·%Â8|¡#º¶VlÊɉ¡fŒ²‘^|XùɺաU±—™?a¤Éõ¨|”ͬØP·æ’‰N×Rçwš‹®Ÿ§ëUâµþ%Ý-Š ¯ÅfqŒÞKVw¦ëâô]€P_g=€Ž—•Ÿ@ƒ­N%nHÃ^H5DwZrç±r‘Ú®Àáá^NtäƒvpϱžL…É—ŠP\B‚ÏŸ<¦­ÉÎ[œU’Ûè=dêÆî=†ï9ß­$Ñ~HIÍžæ^t|Ãç™sZ;Ž‹æ=³»¾³BŽj¢ì’Uoé©/ª·ÓqÍš BuXTñF–* e¤Oß½¸yVŠÏ·˜XpFŠÝRî¿N¤Õ ÔCÔÐËŸZs¿ì67Ê"ÂáϤS,êílOb!8µiG¨¬kÐa1¤´b÷q Û}>mG©¬«…ÌXlðtÆ£¾Á§êMú­ˆ¿ŒThíì\Õ”–Gìj¸+kV¸~úàäà¿ÿùK¢Ü—wÄÂ#,dfê7D|¡­3j:/Ö4åø Ëãç+ @Uø™>Þ¥ø’Ÿ‚J¾æW;pu¢CG§¬õWz¤}³¸žãEÅb±·Á £ÃÍIwН&ZéØòSŸ×&…›uÒ|Ù硌âˆ)\a5âõÆT¯Sͦ´)þ¦YÞk‹Ò"ÀÉ-\Tßž{$iå®èN¶O1SÍÒœC)-nÛ´ÛeskDøÒNú¦u1 Vï¸FŽw 2¸„êvˆ< £–FÁ ö8iÇ{èDea¶s<èÓayÞuxßFOaêR» eÅ!Y¾ ±THw£eZM«¼q†m,ÝxL°œ'…e[ÁæQŠRß- ‘ÃŒX–a= —§Ø;{šè%·:s³³VOñÑ'û¼¿ °¢Ï H“fŸ™¨p’j,ÔJV'qéJS!¡Ò€Ï6•í÷[…t‰% Þ5Ô¤âER!l#&ÖNCjò)l9DO@€7iOag—·ïÝû=–sà}œxœ€&r\s‘ȧF§ñ©AN¤ªò=WS½qØœè% ªœáÚd0³±ÀS(©{6›²ŸK²`ÌyÙ{ó–ûììFŸ¯6¸í“ÃÕl—™0r–¿(*Ì÷• ×cÝ=%TûiÝSQì,·g—Ýø½ ‹Ù¾„Ι!G•ìóÐÊf ŠÓ•ëS]ùò׋}­¥¦ 7n±l£Z³6°ÚtñØÏ/žna¾—Ï?ðÁ­ÑâÍÆÌNÇ07ÀÄw¾…l L!ªjèi¹ÍT'¡¨ÈKAy ùM…ñfì"~]×Màó€*M‰84‘ºŒÅüÂÝ&¿dÓÜPØúÃ¥§gÐ brv©I´Â?¿¾¬Ïq;•êNPŒekdE'7c³ú¬+õ[NØÁA=.Í’R~UJŒÑx'ü²8&‹çPÔá¸åtJ^~¸“Ç[/ZËoXšÚ7VÂ3‰%O‹ÊáDwsЙFÙŸìe‹JuÃR}&Ì<Ãnü*¡ø Fê§VÁëÞo‰2µR.âIT/z% TnÃ┑Æë âl<1ÛÝ8j#n(BDÙ7ݳM<ætê§«í¡"náå_´Ç3Z©&ÏÜ1Ær')û×Q„¥ºÆØÛ°}„ˆ±Œ œnÊfO¿«Y)`–y—²VUždá3ÍâÅú­FyórÝAŠ%VŒd’TmñyX<â ?Ñ5Ç›½CFôx…Ygq /„£7-YâÓb±ËMte’œЉqÏ~Ÿ^ÐÆB $ ’S)€â“œisÏ}¤TÊ·þ÷‘Y†¹€!黼Kå×ü|î¿°yýSÇŸ¶*ªÌ|aGµm‰Ò~¶éÞj_\š“#%¡9»## ¨›?XðP߯ÑÚTtß‘ ŒãÀT‘=¸a ñ.›¯y‡OÀ·4ZOnØ@Ö©à‹…ÓW1ÁÓ´/5c­Îp_ÜÏÃxyÝàaÿþs^î'NÙe7à[‹6•qÁE'ÝÆ$gT"±p-{=,󯻻¡…™‰i¸õ)QAeÈÎ02ï7 ¤±ŽeÚà 6„d ‘R¨÷¤½9ÿO õæo7µ„Û£§ó­jœºr4–n?åOx Е¤ÔO¼V¦û+‘ç#EVœ×š4³I&»tϦŒÔ]aqÑ „Li<¤Õƒ‹<øŸ˜…¹Å)˜çç)Øeí­‘3¿&ÀFÿ“yq'ñE ñ£i®¡’0ÕóyÊÎÕâCZ°¦ºIÓÛ%}vt]ˆÁ—÷WõG­àË|ªä‰v1©%Ì€ŸMU@ˆió+‰£7*òŽ4º¬ˆVh“éÅä±ÈJT cKàÿÓ‰êê 'jz“ååóNðvîTÃÑñD´çÐzµÿà1§á„–匳€Ås,£‚HÔp†­3±œÃ`d4HµãšÁ×Ï<~éß8›¢\sµúÎQ_¹ÈlÒÈt”ëÒiÞ $€Ý–ƪ çö%öt”´ƒæÔï®>ßÎýµº¶äJñ’7o‹·|ßœ¸ö=XD`unbê¸Ú [þ !&ÁÄdqˆg'Okú¯(¤Ó ·'Úo/Rp_ÆeCúü…"Ty¹mÞå4UP™ò¾šé #aJw·;àP„Õƒ‡z!ÛF2('Â;? Þ;uOûK¶–’æUª.Ò$6¢Å¼¦èܘí!à\ž˜œ…ϧô{ÔŽñêÚ6‰S5àö]bÉNG24mPKµDVÄOMÆ^f‡Ã<;PðDvw#ò³”ļ ´7L±ÑQm•3Ÿ„U4 5#Ó¢E_RœÓ-@výxbìcLÚ&;S78@^›z¶:*Ž•ï,¤pÇ$» ðÆÝ§n=*ïÃìŠíKëÃ8?Èp¾×¸­][jÖœDz“åÎGfa±HÌ5?w‘2_‰Q-ÙJ: h­ü‹ˆè}ô‹*›m:ŠÞ´wŸ×•.÷ŠH„htÐU´¿3ñ2ÿâ·(8­¶ewc±ÛG[ªCQ#šŠyœÂ̈¦ÖÈ5c¯Ìžû¸Ô¼Ì °¦1Õ}ðñL½‡Öég'MÛ|n³Fœ§´”Úð97†¾ñ/àË¢s\_(šr N5‰ÀûP€¸¡½%ÉQÚž¶>?ª[MG—ØúøE„Ž2WS7Ö†€™A²Ò›”øôk¤EÜ̘ÍU¸T ³3Uy%u˜ðpß¹Ä èeJÕ¢×Y_=}³Ó_XW!þ ÇI4ìl û³›n1·p½øA)*ƒYSÇÄ|2LŒ¤‰ÍÉy8ùR /. ¢k3v<`|ÖáÊ ñáŽ5f-ÌÙz'¨Ûbû¢@?ž¸%TtËÝ“šNrzž)`Æž, ´sÀ³‹Àªò[“-h{ðÿÐzX?Ìb¢•cÞ˜¯å½Ò*zó¶·ÝÒÜYtgº”À–¯!nƲr3‘+JäÒÓq·øàRƒ oÑÓQžCYå9t ïÞ„pKZÇ0ÊÖð¬Ï.-]ÄZϬ†•]“w`¶+-™ù•´U-ΗÍ{¿ÿ&ÓBhïùÎ^ÒÙø¤â€?Ë]’x mž‚ÙÂ…$•£ò§-xYã…AâÇná2×v=¶HFÓNÔ†,—à ç- ]NÚhfa’E‘_߇6ƒ×È1þ-§”îEãvÚ³3FÓ¡_Ò%–EôÙææ‘¡';åZÍu¥.Òe¦×cµ@Åä«®ŠâmÂŒÖÐNż•"¡ ˆ^î—KKˆ ­/f‡“w=ÌZÂO:5Bªônì¨5IÉ©iÒS3cÕi^]Ã/ä@FÒÔÜ@âǮѪ´LÚ[êÿS+$×.2©ùҼ܎జ¦©¹~SÃÿ…cОzJ±³¼.êžîÐ Œjá gÐñµ†”¹‰¶ü €Fx²óï!6h‰]déúUnþX_6PC˜Ê ó—ÇdÿΞ'Ì üÆêÔan^YbÂSì¼ÿœš>ÍàÚû’LšØÓâ œ­ õ[øë$ðìŒ&oTžpŒ³…uß³€¥£ Å 8ë Máþ‰}(ØzæhŸæy„ŸRûGíÿ•è…ÒY¨äÒéÅaKÒ`Õ!:¨ °³ìÈWŠ‹ë!<Ày6ÛB f¤ &âb‡hAÈ„qQŒHò(+cdÐìÞCµºXdI´Ë{Ŷã^Øzzfmò'Í|FÅâMßßrl.jö0üˆÙ‰¿+)Å·"/‘04v ³v)êÆ}6 ¬PÖÆ¸±¾ªÓÞxÇ£ùgÃLж0º½€C†vß^!„Mó@® C¹£ƒQëtKR4ò#xüGó*Ö ¹}Šd¾=À9"ypC•oËáöôNÞLPZäÇádöÇ„ìáÊù»û×>!B2ˆ!ÞË"‚[b&h)1Й¤’•›{fsuê’8““1O4û-\{8ùmŒaL!Ïàoß7 ?oôï…Ò“™OŽÆ1a˜´ë ÓÍå. Ìæ½|¿Ö7ÝD‰l“vÕ:©Ï3HHõ‘pí£¨ˆ£äîµz‚Ëüž7cv§0í2*ZDÅk¹Î…ê¬v|Êò[…^"<Ã&ajÕª§ôiæÿîþS|O¬”+4>Á¿¨* â Ç3Hï™·ZT´zê%ÏyÊÛ¸cã¦ÆÚt‰lþ?ÈŽß®?p=|åu¬õË”“å«v¤ë6A„Û¸Ñ/ÝÉMÏxJ5š(œÔ[’Üß?ü£f 2-?V„‘ÔqÝ/ñ6‘&='ï#¶×<ȇÃÓªFÕd£{÷)nî¯\\Üa¡ž]#›‘#í'~bÄ‘e!DMÑ«9-ëzuÐÚkDGýÿR4¬Âbäö ÊKƒ‚L”áut{©A¬VÚÃEÙ }„Í(—»4/e3PoH,í¶…±¸v3¾²f%×ó~-U.7¯ÈMçÊ;ú|¢îI³rÒ;¯¢ü§„[Æ ©Aƒõ€>®h¿Šê!ßæÚP˜Á׸.ÞÆ§÷Â~L!tó[,•õ×Dì’Òú‘„F_@Ö—]»¬»p*’ Óÿ*R©¾äÙDôƒwY »×é λyõ[ÞÞºJè)£Þé7aö úáÚ‘Á3 ZfžŸ9÷-0pæÖ ÓŠGdj±_¶ëô6yVj½Åv« píT˜‹& ç½I↽òÝ‹ÈR8=É9µŸ„ÒX,=ü?æÚ¼Æ ÷õW€,åäÂÍÍ&ÝhwQÖ­”äÒÐ?0·#,qJµò¡-ê]»W'ƒœåŒ¨"Ý ¢Z&ãßO¿Í܆,gsö—(ßúïW­¤¢h4ƒÈi_RÏŒȼúŸÙÓ—‘Æ?~ÿ»5툊À«j⡵[jêm"ÑÚÊŽ-~¸E°×㨭9nAa¾žZªÓ\R¾±ÝO#Éö'äðä¿bnåbgÍ­9URÃú™Œì qŽºœÓÅuF3þ„/E]š»g>2ÊÆ‚Ù½œ§Æû%uq‡)áèŠñy‹4€+DT*~™IRQL(bûŠuûÝ䢭aM꟟¶·ø$D¦þž=,#àô£èCt’wõÔ‡ƒ&¶ "™ÿ$›ûÄŸÖ¸šú"õÃF‹?÷0r÷:™\6ã™Æô“ÉFZVJ¯ ÜÃCêzwÙ¹Áçìö0 œJ= Žæ0ùXû¥‡®NÊÓC1€#òn S¾ù<÷ê§¹ÕÜ âÐùÀØ øÈ­BL3rè¿1FÔ3i ¥¹DÃâ&kBhòyêmñ–§7… iþ³“ξf–Ìä›kûY¥‡1ãØ¡jfŸÂ]Ÿ‘:€÷§L7§° R^¸dJ^rÅCÙÒŒþ1°§ZÈ“·[1Ú&)«ƒ¹|£ O=ó3ã¯kä% ŠIÓ—šRʳÛR×m~’±‰#m)øé;hp¾q¡N ¶@•:PŽ+½ø'Áþ"VS„ÍÜí#©¦Ëim:^—$¤òñ®¯‡8i’0Ý»Ãmû4ËpÓÿw¼Ó!TåyìG˜!æéjWx@ë¯G3!XÀ…¢ÎÎÜ犫—,zƒg“Ñ÷ñÜ(ÈCûTÅT@€ì\lZB ºs+z7¹ Ü¿)¿ n;6 0ݨ‘ý­¹vOÇñ-M”ƒl©èC\Ðvî%sx_ ~V%?…W·µÙ&*}ndTr¨Þ£ªqááO°žï- j§Å*ð ïdˆƒ ª·ÌŠ£’¦L4¸Ó¼m>g*M‚(åŽéÂxUï:‰ºû*ù™åïiº.&ŠÛ¼; ÚzfçT†Í-ê >Ÿh=¾ LÛA} ‡ë‘úíÇt¤anO V _…KÈÿ_“' `ÿ G`ô·°ðn ¿Û¿=±Þ¡åð4³Ò¢Þg’*Æ@ˆž¹Ô·xnÑ–ŽuÄ2FÀÅrfÇø$„ShìÍ uj©‹îîÈ\Öôçæpð8b›_Ù|²ÍîI_ÇP"WÉ@œA¹ÃÙG «®õó¨ ‹–Dh«ÈuÓ ä&ÏW­²Ð–ÀßM@U!Rä6ƒ.“¾ј§Ó¤- óÕã0õæVˆÄ‚tnãsã8P"`Z‡®ªxK¿h†¶> ·Ú𳋳YÀðæ—¯¤w{´ç'Û®õá©ûã¢CLîKçi0H%5úcÛØßsnÊF!FÌf”§Ë„6±ìï˜6Œ8žàiĈ3Ñ›í-ÄB×Õý¢^-tc!½$\½_]cMM1ï­“ 6‚‘œ)£²Ýuþ Bcùn~ÀºÒ7’}P ×6%M¨ðÀˆw&iˆÊêÑŸš5 ^Ÿ»¿_~×5íX“ ÒþÓ ÷œçýíù7™`˰ŒÖ‰Lˆ¨õ&«írfâ¼}B KHÒÓo2*Õ ò ˆ—,¢ò’]ewm%W t/SZmå_1±ØTÿ3Éé é|Àíñ€×õÝ®9¯œT]ð®[G.¢Æ$êˆT0_.—ˆFû§ÈÚlü ŠÇ®2áxçFz³Á3²ûÚ ¬š_ZJNx•í'{  Ó ŒÝ}•ëˆ)ŠtF%˜ie2cݳ\U¡Ž~Q‡p”s¬Ø”+ª^6`Y1ÖÚ4À>Nƒ¦·¦ð´TXùòCõRˆ¿‚`‡ m²ÙÜo2ý½M lÞ=éƒ-`æD~L*6²ŒmïÝDÄL=\¦ÐËA±¸%r†¸žqH1c‰uL™ ß?Ø ('¥Û¸d Õ.RÔ\‡5z²ét‡é¸Ê|ù(T”ˆ?[ñô Ô?€kÎ[%b‚l¤ „x]z¤^V’hbAEiv=*4öÞ–¤p´Þ5ìÊ1ù?ñ/Sá®û¤3¨guq’” =Úd’À”T·w²ÁvW4a*Js~¸‡2|1p„?¸9>ýûèu~E:ûj9wP©ü´ÒAIÊC_eª ú ß™a…Ø^¦ªoÓÅ4É÷š5öHßd#YO…Ѫbo‹ÌÌSBñj×½ë²Ñ×”áÙ<Ã…Ô7ƒ9Úúœídœ'ÚιŽ®ÞzT|˜-ºŸ¥|÷Ç€Ÿ±¾×£ ÿì¥ØÓu´Hõžú«|Õ›¡QI„?ÞFû¶Ùz“*Þög0„‡¶x?õíÇ ,P:˜’Ë2…˜ùÛ–iÁKW !Í/•|ÿ(}£N( ‰¸ñÀV?Ø ÃPëє֥Í5¢‡ã­4šSQÛã£iE¼že¯Àº­¶X‡Œ4CâÈHàk+¬²É¾þ>ÔKw¸‡lMEª~J·ˆÈ€`·Ók1 ¨Ð\eÃ÷ TÅôÇ%á[ŠTùè$‚ç*ìxw~ù3Û~QG×$ÙÐvï°Æ;âà(xu®Zm4ó·øBV4þ Æw¨‡¶„ãïˆÊçFk2ðÈ~> ‚P“í!0D»‹jÝ%@øÁÝf¹_Ñuaö™Î$™ò¶wÙŽÆ"î´ º¨HàR¹­–§Œì‡œ¨Î ùV6ÕÕƒ]èIÉ[üašk T1‡Ìœl×o€?JÖ+J¶tþkÖíŞ"M ½©„‹:1qÞ[ÒreýÓdœi¡*޵tšZ½X@Äx'×;‹áá¨C”/à[F£tþ}èo2»U<`7,á|¦‚tç !¸dÌBËÈ•7_dÓ 7Pûòª1¾dɽ5{èQÔŒµÝhH¹«êÎ܇m£nÊYÒPðÅî¨T)¿vá§F½äk³ø#?'¾RžD¯õÕ‡ÉÇ|»… ”µÀœæU"Ï\í•M DÆÊÁc[´ëÎSl·[uZ˜@"uö5`~r}>[ê7ýîiLT“¨¼Ì[ ‹€¯® 9ʘCï¥5¢äÊC®—£)©Õ3/MRq-™XÔãó“¡Œ(ŽÍÑé°ó@,ŠÈíïmÃ@áŒZškl|M´Ý»’ñ½J4Õ©!1Ç\Y ݲ9k¯•Ê\éëúv¯ÂöüBR'|¹0ExÜŒ·´‘DO*Æj$íþ}Wÿ÷jÍKµ Ô=×YâZ,F;$äÁ™¸89G]¢›—/õ{y¾´ *nXƒõG_…(—é[t•M þ ¶…£†ºøi°¨Ëèj9;³PÊÜ)`Sðû³p¿Ö ^ÞŠåbQ¼à³«kÁ¬lƒU•ŸÁ›Zeïѱ™(¾ÐÓÚ£«·ªH½ÑýØÛŒdË"Ä͹šüSêÒ°1º¿pDz#õ'#Sáðÿ”;Ys±"ÄÄW!Í+.¼®>èþò>®ÍÉM±ªŽ«?‰p"õ“Ç9p³îw+^*ûÕ¡µ<›Y‚[Žöž+qqi'<%Ÿ23ÜôaŸ‚Ç´:BKÆPƒºuÞƒŸ=XïÊÜ¿Çøf/&r{N½„¤|8»d$1Šœ¨'ÚV§ÔæÛEQ|}ÃîL'»‚Û™¿r¤c‡¨ ¾ð\ée¤b*’wªKÏPvÞúE‹Ÿ¾søj’Ók¦¿ê _ô¯,%ügËUë²U/d@eÕƒPO€ÐV½½ÇÊ/BÊÎ\Õ°J6k<ËØŽ~×=)÷UñÁ¹Vûšé˜™©©ÚíÕE)¥jéÎØLsÒÇj ½þ«"ñFpA¸Žù·/µ É60ý»¶ñ‡ImþGCŽãTåwе2¨¯ MË,(òèItë9l°›íýÝ™”å[×è=4ä•×M­EÆ¥_z/ŠióYó.Rîšé|Lz˜Z8Ûo~vry"ðÁO*˜®è£»àÐ>ÞN¿8_GœîwÍç]®Î7˜ÆcZR|u1­„]©lá·àÄdgãœV¶Ì§ÃFå'Þ™þûZ1öxK¯V ]\ÛÈf#2ÿ‘iI%ù\b3½÷+CŽ2C‡ Êëûö´Ó Qâ©ÍlMìäöeÿo›p³ßØH²œšëkÎÆ‹šŠni€} ®àKrüó.„¹ôõ,eè 'X *4=â‰&8ÅA*èux ³ )î ¾ŠAW¦ùÀ\Œü*6øÿôÊW1ž pàÄö"ÄLl‘‘14»øÓŸ” 0iÏõz@…çmp]¤tÃ/§ºáç7í³ÄˆËæ„ÁàY*úîù:í@Z À¥ ß&¤cJ ˜uÕ™:«^z‚e@¶ʺïžnе8©QäØF±%z¢Š\¯³e¾^`”˜’ ir§Hýï¥ c*Hº\„ôíqAÎYL"¡»p lHðG«Ì lÔgk# endstream endobj 118 0 obj << /Length1 1601 /Length2 8391 /Length3 0 /Length 9439 /Filter /FlateDecode >> stream xÚ´Tî6L#!Ý9DºF‡tƒÒ) 2Ç€ŒÑRÒÝ  tƒt ÒH7")ñ¢¿þß9ï{vζëÎ纟ë~X˜´õxä,à/!Êp’‡Ÿ(PÐÐ傼@ . ‹>iùÓŒËbA8Aá0‰( äM„¼‹Ó€ÃêÎv~A¿ˆ¿¨Åÿ „#$Š ¨@ƒ ‡AœpYà5ò®Í_ì`¿¸¸(÷ït€œ=ƒ` Òb× ²èÁÁPÒý?%Ø%­‘H >>WWW^½/a%ÍÁ p…"­º'ÂbøE  ²‡üÁŒ— o uúî·Dº‚ÀÁ †Àœî2œaà®9@Oí @Ëû#øÉÜ€?gàçåÿ»ÜŸÙ¿ Aa¿“A`0ÜÞs‡Â¬–P;@Kù /Ò É Á,~‚ìœàwù Ôôò.à÷ÉAe9èŽàŸôœÀ¨Ò‰× j÷‹"߯2wSV‚Y(Àíí!0¤î¯ó)BðÝØÝùþ¸Y[Üæù'°„Â,,‘°pvà3€A!jІܙpÿ±YAa (*.€8 n`k¾_åõÝ ¿ü¿Ìw ¼=àË;o¨%äî×Ó ä ÎoÏ;þ‹pùùP0ðb…áþSýÎ ±üß]>êx¼Ó?øëó÷?Ó;yYÀavîÿ„ÿ¾_>55}®?ÿí“—‡»t2µ×ËMªqöELqXB™‡ êËnjßE_:qkÅAoµìD«…uñÄ7;.³«=¶±ÙÉ«Œ9Ct­É«a]Â!ô¨ÙÕ¬¡ù›V}W‘”KÏûÀ‹ƒ‹dµ âæJô­~kVU®þ;‹úL nýj“Gêã¡.;ëœvd‡?ÀéðÞ¶­a' {j3ÔD–Úک튦ÄlE<.Ú×Õ™ôΧⴘ4‘̉i9‚µÚx}/L«6¿âq¤—o7÷¸âž‡ö쮓•”ÜÊ•¿ËË .ÀQÅŽŽº¨G Yv¦P]•P\" YUºaÎ;6z×y<üáøÀ4Ÿ(É[b¥'Oˆ¯i—@j’¥óä`"7J˜ÖL¼¦‹ìF¢èq'¦×7eÜ€ [Ï®0À\ˆ_É´÷2uÖOÇ4JéV Y²Ûפ*ž6ã®}ßWa-PjüGÔî&Ú'ÈŒõ<4 éÛÊ™‡/ üþz†¨ÞÑ}oÚ—J@Ç@ëîÏž¾¾’öXS®ûCÙI—Á䯬„{}Ð’úPp/éhÅU¬ý"|Fö'9$õƨh+ESïB™¦|ÂàÈùú¤…öÕº¤+Ž“ÿ±™¦¢K~]DQ¯Jw¬ÅÍäà[A…ÇDúOÞL½×ñ?9‚ç%ê#¾¹\kOXû1Kò«1k½ØtZ,hîîW>³r®èZß§x¹b3Ï…Ä >¿Ë=üy?Û^»”Ãír=šU@ÄÓÜÁrÚš0ŒòläŠ;ŠqmuD¯Q:ò¼Y»ì˜àˆ¡RÆ0­xœÒm<Ýò Lë}3ø¿#•p'Yt¡SF'…•"]­Û¤{’#ù¦€‹&Ì^§›T\duFM+$¶É¦˜6ö€Ñ˜4ØvÁµ;b±h*¿“D6~_¦/Ϊä^w ÷¦jÌl£¾Ä+úDœ"M˜wšÈñAÓ­_¢#kaäà©·î—«¾MqŸòÑäŽÁ%¹S‰)[Bæ§ §%ãò¹WÌÔé{žÒ•ŽÞ6YÌf|b˜mºÇ6d.¼'_ëTºki]=+¢Z.›#ëSJiȳn¬æ2²4zƒ°.©kL÷ƒH*ár‡„ÃÝlƒ³†ï¤¬}À–¦bÒ˜¶$ž•ô·Ub¤‰cHµ[97Ρü‡«L VŒºèTª~z(t¥t; Qö Vüöd˜ìÞDjÌ– X‘jmÏó’½Ò狀¬s‰÷åiD/T¸·œ“dø’LÔlÍ6=ëí‰ú£2ð}\ÍöÎãû³‘*tío Vf½Òã&»B nÁÃï—ó¶ Ší&}WãEÆ­ÓD0ŸáÌ.׎fÇ00š¬¸üH[³kÑöbá0ìk °?lú\šIOB"ÅÚÂýRFñC=ªË)%è}þPU\*¦{”ï,—§n@^¤HwMÖ`²|r´¨Ú ¶?eˆ_Š@2Íu5ˆ,쪈ÿ6EVTOö…|Wˆ=Ž®…W õ`˜Ñ›q”lø4?½F ÌûÉM4Êa¼„ÖM-ßù™là—‰ì‰¨Mrò¡†¨šRu\‚ yü×CýKŸ‚¦*TÉqäb}­€j: ÔÇ’K°’ºxIî‹`OªÌnÈ"#ƒ#¤W¢Ô(ß±T°3ÿpIÜõæ¯Gµ+•+<÷Þ•Q¤ø^R’i|WÚåJ¥]ì"äÇlIÔ_GÌm9õñëØß¿5Íê"ÖáyÖÁ®ônONIÐIÂ)—·»?„irSÒ¯äT£9a_-9âå¿Æé øž!­ÓÂÚH›Ôçö~óëP£,… -4ØV¡¸ÂÒшg6ñ:PÄ1 ŽÍ™âÀÅ{jecg’ƒ`°FÒF’”(DÎͺ³Ò*§2¹Jž:2ìW4+ójLxR½]}”&„]¾Œ{/ãÒMúTó—zrïz9ikÎýôŸ1’xî$»Ì„g#è0šÀ6¼ú‰x('!TÛ¬¥Ä!b›“Ù•=™*ðPñö¡Éf”ï.üt‰ HÝB¼L˜Ìz?¸*>[Vލ‡ÚßfD Ñò½|¯y»ÇF“zŠþx¾Sp³•øèûN¥©–õˆº\_jZu‹´Y‰¸KöDŒ;'-6›š=²a⽄…&óAr@~“ Ú-®[NÓ«+ ¦V]<Ô„tßдZΣ,ÿ¶ ñ­J½÷=Ф¶3]4q/V\õ—˜!“„¼­…!±Kªš¡ˆnÕwj…ÜZõØ"l+…Ô«#ÄvyÕŒÁé¸A·ÁšZ»TsÌn œA-ý¬{†›<ÍìõLêµõ&Ü—qZ‹™LË=>/È~æ­ó{{AŽ/¼†2¯ø¤FøbVusç£U@Q9âKQѶÕp¹6Kük7@™Ån[R»[ΤÜ5økOÊ`ÓHnÞÕS‹Eö N‰¬sx¤…yh^žœÆ¥öË ˆ`XAlÈN9#Δ¹¶0¬×Ίu`RœüŽp;饰é§–ŽpÌýJ}ëKêE;—6ñfÚ¨“ÔCÒÓz¿Òq ±7hDáLµÌiÿ4|§å;؇+˜7Må¬Ó£º«üÞ‹ —=•cïaÛ‰ åWOÃãÀ§)'M˜„É(9DE­‚‰óŸ—_ì²q||!4KÿÁûñÓÜr®Z‹ii3ð’ák‘^ ’I/’»ÿšŒ”š£ zŠñh1V¿›È†¿¡…ŠÉ ßpnõ%»­ÀZe;”~¢)jßJ7å@’©Ìï™5ÀfÛAxOK¤ÉÏsól™WÞ»Êt8t­ÖÜÇw]¯"k3)èçÛ™^ðZ&º-Už…WøqëÜñã²ßM¹fêb[Ãæ =O`Äž;@Ý=ƒ÷m"è¸Y§üçvh+žÓô¾‹YØÍã"_Q:B¬¾Q…Z{Ø~|ÓuÔ@ï@I $¡|2~¥NBûXÔä‰âP~âË-5þb:™IdÛ€˜{„Z–Jnö6Ê`­HxuHÊ}É@®Üª·ˆSÀy†[ÖŒÿG©Ðßòfñ¶M.µLozëÄÍ6cM¹°$!,'Ó—¬bQ"yžH|‰8ã#/›{?ä@ šIºG(±>ÊïvÑ—ð½Ã<˰=ñˆUI -Û_¦LDE0}N†¯0ŸÜ—**ZÅcÞ7û£ü†Ë2ö.ý.…Wõ+V§îˆOøïEŒ™º­˜a#!Ïâ]‰7‚üaìA³QÉðI8ãYÑ‹W{ p‚uÉÅæ´ÐJº¾û„h !n1jmf¸­?Þ={h¡¨¿k2Mt?ÞeÓ]¿õÒâý¢$îúR­É©GÛ#fu:­¿†©6MÀê­`úŠL¤˜he~ø%6‘ÂØø}>Öˆ†ŸÀWîÁ2Ì8o舿µYè,Öÿ1}‡–…¦ÜÛU)qJ+a©}#3·á!vL7ÿšîÛ¹,%_†ŠŽ9¤%‘·föiµ(ÅÁ „¸”°¶Ò´BÆ6&ÿª´%L¿¦Þ¨uÊdm=í±³Jú¤ýöºPIœ7A°ïkƒåZ\ß6fs¸^«¹§!í4Ê{¬ù·÷KVº‹jù’SÀ¸þ÷7ùãg„³ÝcŪiù𛦱 ›ÖË‹~Ì5v}÷È$â4Sö¦ad–Áצ݊jðãÁº:ðI¢±ïò±9LȈ»§ìBgØ ` {|8ÃK„ýœíiÞioÔ“€ðlÒHú°Ði¯-qVìŒÖ‚%K„(ájŸN‹¬žðD8L‡dsŸïY8Z+Õ³ø?-]gHå•ô¦J÷^¡Êe¹öÇrn£/þ ºsïEkïï5ŸÛØÛᇧ f3-R‹#₾ÒDBqvˆÌ»Å˜ª„ÒTƒ1Š/ R¯´ùxÏ6Ÿ[H…÷ÓÜ$Jº¸ÏhÕôÕÎà îRxžÍE\ý@‡ÅCªûa± ª³d=¹ºˆ®Jòé`ÍÂPˆ‹ýÒF5%ËÉEWsvõ8™i™”¶‚wÐÕ …¾IÛë2RÖ¯½hx; •*¢Ÿã0 Õ’Î#Z:–|M±§8á?©—Ò³ Lzk^QñÊ£"§c`ä~‚'*61!g>¶‰iC³lr¯‹æu¥èš–5̼/Mƒ-žÈ;7°»¦ô÷°¦TÔ9 &?èE½È¶Üzám…PͿDzš²)_ÉRÎ,Ë»7/–* :¡Óˆ\Ñ1Ì`º²9ªÃ¸|‡óÉ\O÷yÝS ‚JÞqWÍÊk…ÊXÛMwÒRŸ%gUæv1‚MÑj€ á2Ÿ%žÕ£íx †%çLÜOeAzœøÈ@=WU˜ƒ·b%pûòë÷“ eA _q†œ ŒÒi¯.Q¶<ê2æ¦2&xÄÀKë{1W£ýÃĘÔlHXÌ{ZXÌuÍaó¡Ä|î•U¾ÉC3Ä#añÁ™CBi ÍÏ*&PìÀ²å³ŒX«ä`)Ïà‰„ý©ÀIÕaiö5ÎF­…^éúC5ë†jëå–œËùA"äØCà/ïçÌ$“3t…‡]x\ßsnjÎD‡^'ñæ½Á‡†Èlä¨Ë[¾Ê¡ÎüJ¯û 깡Ê\#dÇþ 5‡ÖªÇ§WìÏtÔçÝW­Ãd²çìÞ{éTWa[úXúxÉAÚï*Ì&CsÍ="Ò àû÷ÅõLd£Íˆ‡zÑ‹‚r ¢õ¥u‰:OJ«E« Úï×SXÈ~áÐ5í¸µ–™{fÿÊA†yÏ-?Èáº%÷¨þž^¿pOmÍYS^•mµú0вÇШ„<‚ÉXd’fÜ|Ìçëítî>œ™¶Ï>ï-릧 lßpšM íÆ:sÆ ÛúAù¥Â©/_å¾{èóJ…ïê(9þ¬Ëíöa,´ë9CmØiÏ1äÚ:F‡¾‹:(”åä?)")T—ožœŸ¤ëú\äÛߊ< Œz‡ã¢½ÆAªR~µ¾©MÅBXeiÊ­…ô÷nÜ\§²³l‘³Å^Ë%‘˜Î~µZËè]'úb¤¾jýóí±ë—bLæ‹OŸý*Ò"¦råR>ˆØ‚¾H}+Ÿéá‚q`Ngª°Óg æÚöó‹h ªÁä ¼¨}¿©A ll >Ëýü|¸ÿ ÞË8ulßdˆû–»PÿYË1Vþì4(耭5÷a¶þ“WïòEí87›ß›Nm޹ãÑ¢,çñªÑ+‡Ïsðè <éy"êŠÇäÃhÙÁ4Žs9©y¸ s­!/Çõ0‹ÌÜ¥ÕO‚;4è]MWwù޽Æ5t/ëyÌ#hWÊñß>ÙÒ¸ôêÉî²òùîwöà\ò¬Òî;;¼eökÒߊ&ÕN‰pÏ5¾¾¡c:ˆË/Â×á‡Å\µ±Y´¢±3#Y^– ^#ÃK 4È»û›aœÏŸÏ—¡ºóÆnbrÛÉJ0=’Äçºä¹X9îÉJ«„þéè©´6#WúâüTÚñEˆòºÙ¦ú^ÝcÎÀT#p½/R1ñèÇ0ZÔEšÀqÛô‹ô›îÈ{ÉHîíÈî©sF¹üiåÌÛ¾—ÏOÖ·«\Ô϶ÐêñÐsuH–HŽ3Q+'wÚž;%åYK×¥™¿ŠÍE¾Õ®`÷±aÑ~ÜÐ? Mˆ[«bd—øÄL-53d£öðâÍ)Æbì[ÖŽpkçÖV9Ôà‡D‘“,—QâàçÚøTØ,á÷¬•\\ŸÔ¯îa´w%Ž¡x¼Â ‹ÈNæz¿áGÛ@6×Xb¸¦žw2G]ɯ2—}¦ê¾ö”°eG¿jx¼tÕ)†§ËA/«´C¡º*ÇQ7]\Ü Æ2ÕðôP¨Di’q×jÒ›æÝâZÑg6¿20ðÇéµÍ°K—Þd¥ 4«ZܦÖõ“²$ÛIâ8·²‘[Œgs y)¯m!Y¾^h6Å=ÁDØ•ë2µi?ƒ§Î[É)ù¾’O¯ ­¿MJcHÜÛ˜þÙ¼®à꥜—f Å×k.(Ê"8J'qÏx s?M˜hj(ÒÒ¯w~a´¦"È÷b$9|üEZxü5¯0ûãÕKò i.ìà@.¡f÷)Ùbò%Į̀Qù©oÏž26´$œà”Ñó˜_G$†%Ä Ç2ñx½=Ñ5Ô@ˆàX<$¶‰<+u}¡Énz¹ÏÎÂkÎ{úý>²=לê¨ß74kû´&Æ¿i „yŒÍCt3Wü˜aödKZh7³ÁT®®ZΜš}ç¶(nàðÌÔ[ÃüÉñ2ÕNG± ‚bÁ£¼Oß¿öJÿ‘È믗†ÅÕO)ËJØû¼{Ì´=ó¥Ñr.SžæR¡Ã,9¨ë0Î2ºÅ.zÖ<«¤‰_〽­€8ª8¦'ÞœÜÓ!ÂÊß@‰Ý&[Ê4ª¥E§ódˆµW0˜©T¯ƒ¼¡]Ï|ö>Üd¹„„ئ7­Æë)ºŽcÿ–‚$¹ ddæ%|cóRÑá!Wz\q™Vr[Ë4nñIÕ‡¦Ï•ì+8ø{¯×={nĸ %›ØŒ*²kùÇbm£6#ºgz‡äÙSÏÂÂö„ Wxà 3<ËE™ü‡5R;m&d?cLÄý>íטÇ)õÏ7Új<È móîaE¯ñ©òxc̬֙.êz›'*eWh.½Ïâ#·2WcÐn÷CÁ$#}#3jÕÈ“Úlú™ŸÓ“ÚýãªÏC§ý·•Ñ ™-‡2Õo(™ŸÂÅâ©tXú8ÊâJ²ˆ²ö*eèxÿZ]!åæëâÈgáÝ|JñÚ÷¹H¡@ÆýTB9µ]¿¦}Å)…e…?ýœ'€Åˆv‘S÷ìÉ·Y£"­R«ƒZG°:+â ‚±žÖÐmiágW¨ZŸÍñ\ÇdC_#ŒS}—Œ›…ÇíB†ê‚8TI1ß[}KñÛ©&º,íôSKm.ÒVðh;‹a¨&]0.á-&ÒïºDL½ æ=N=×ä¥'ã µ<¡Ãh&ŒÆBq]㛺¹(†È¾•ì8 YÇ­]åŒñ¼ÅHš _–<±ÌJÁ G3<ø†ûâ&Qöì&SOœ_³)¯ª89ñ­êüçˆ6˜eôÀùkò|Þ“X§¹ Lµ$ìQ™!i–…ÍË•R˜"¥6YãZ©Óø¦Úǯ¡ªjZú‰÷ÊV{G†É%*ÇOE’XwÛô0û—ÂF¿ó܉ith2d€·F)od5ÒÅÈù1oýåž._<].› V„ØÝ†Ð$ÑôMPÉSgÑ~ô©µod¹Ñež½H{ýÕ ªlcy1'Ò7ŠÒZÄ"¤y \ïÐäM71`½ëíÙȆtwç`\,ƒ>”@O¤KMç7ë*ñºD–¿.ȽÐ^cßæ2¥«‹Qô>iH|2×)°,#g}\]BsbÅaÃÃcñ@Ñ–2Fôä+ÛzoŸ§daÅ)ûÑ~ör)SØýïÔ¸•žôàA b)’hIõÛm.!onǯ0gþþº w]ⱈåºåÒ U–õ ˆ¼S]áh›µE½vL3Šñ 峚¦O§µ“]Q¥¸¥—*Uî•ZÔ÷Cž`“pÅKí‡4ð¨j#ԬŲ‚TAGïOÚÇy‰b(:DÝ_fF‹^ RÌdrD“’a‘( jxÕ›\&&³ÛâˆöÜ€¦6µkW½'Ôhõ¬Ž¡¯¨ŽC?ö–ÁÑ9— 0ýSíy1 ‘͆3?(™ùiº x»ÁT>ÒLß¡Óbã0¬¥þU‘‚:åI¯„‹ˆOyˆoÞX-ɺjg3¯…©oÖ­Ø›OÛ°­ôÃÙBÃî*Ç^ø8@6ýÃOœWp` ºS&ŒGLJ6œ‹*)­+Z‰É~4zXa¸÷“H‰Ëëë/~8RÅ@8¡—)¹Žx¼¾Œ8s%[Ìhy ᧬*è zÒ“,ª\þñÖzð6äÚW¥qâ«‘EGŠ«­ߢSld›¼L=[ J‡:ÏbÌ.†íꆞNüÜ*ÖbäÐ99Þ ½çBó˜ä4þ¹%ŒòG­ì €˜/{Šëuå,Ûv N~8R±6Hñýˆz1{Z}¦Gm)Áoœ{ô1’žØžõÒ¿°žÉ…–üCã 6) CǰL„噢=iOÌå°–0*ïœ#ˆr•V·ºÆÿ’'™ ª†Wm©›~Ú‹ É??¯G¦E¡ø‚œr6dJÔ°¶ פ£r½dÑ>‚˜Žf)ãŽÜzÁkw.©xv?ŒŠ–?;Q¿kÎcsi[à¶”9η]~SG{ºXŠ_rX^êÅ\QEJñÜv0&ÏæY‚Âx„:è5—›9Ѿù½øeSé»ûO?rSR®_Û ¿áÞ,[‘.Žf-ÄZØ,5Åê÷3[Ní7ˆ‡,ˆ2)c?¸¿â+¶¥kËÿ2ŸÃN¦a]ªlO+¸t›réSá—áˆRέ3Û䟊õ`áßW8FÚ b%œÄkw5Òpd6áìù:Ve_{~˜Ù­žBëÊsíÔRü¨Ì.;,“¢5©8ªó¤uøôÜ6X¸ñkÖÌçx“ö-hß(Iâ„9¶O+–Z¥Í½üÚ^Oœ@µ?-dm®ž·K×Tñfü¤²V±5s+#»f¾vÍ/ë­™î’<Ú0÷Í®ù³Ó§öƒ8ã>ðeLèÛîo&)Ä¥(?½øüUȺ+˜UAjmêÉhm¥†Û»¼ §ÆÂæ¹sfGÅÞºBååR Gpo•µOÂÎCqû“>*W¾|̹f?•üÒ?v|ÿµºšƒáyAä0CO«ˆñ˜U19È´T%[ìÕ"IÍa€áõì‡è%±¯5rÀ¶¢<,û })ë‘bƒÃ˜ÇË«S$'ÉÅN™Aº©&4H6e¿~Çñ“Bw¿‘Js¸¨5õ)ËËöÍ÷ñ>¬Ç.ÖÙ]÷^»\`v_Ñ‹¬-s0ã£Jw>0å$P^6¯©tùÞßsÚï6Ã6ß3[,”e{/4-.ˆ8Ô ¶Này4ôÙû¦v3)åø«íRà—§nycäꮵÙ:$?σâvgÐ5Éë”ÎÄ”U"Î~Ì—ôÝ«­¥-bVÙõ ù>ΠZ[Ï]3L„†ÓhÅw3rQÏýšJ5# wz©ånÈ€šmÔÄ3ööì `ïSñ {·žÅ+þVcö×÷ˆMß–fÖ\à0·ã¸ëÒø°Âúm¡GS/O¹Å.(Ç9Ý R+ž]d½Ó«»‡ (Oü?ÚF* endstream endobj 120 0 obj << /Length1 1594 /Length2 8302 /Length3 0 /Length 9338 /Filter /FlateDecode >> stream xÚ·P”ï.ŒÒ ´t,%ÝÝÝÝÝ,°ÀîÒÝ]‚”4HIKwHIJ‡tKK§ô×ÿï›9gvf÷½îzîëŽgÞ¥&WÕ`³„š¥¡&6fV~€„’:€••ƒ™••…šZäbüSŒB­ trA!üÿ2pš¹<É$Í\žì” €¼«=€ÀÆÍÏÆÃÏÊ `geåûËêÄ4sY”˜òPÐ…Zêàé²¶qy:æ¯G­€‡ñ·;@ tY˜AJf.6@ðÓ‰fö ¨èâùŸ´‚6..ü,,îîîÌf`gf¨“µ0#ÀäbP:Ü€–€_„Êf`à̘Q¨š6 ç?äP+w3' àI`²BœŸ<\!–@'ÀÓá 9E€Šò‡±âŒ€?k`cfû;ÜŸÞ¿ ¿Í,, `3ˆ'b °Ù*ÒŠÌ..Œ3ˆå/C3{gè“¿™›ÈÞÌüÉàwæfi15€ÙÁ?é9[8\œ™Aö¿(²ü óTe)ˆ¥ B\œQ~å' rZ<•Ý“åÎÚA îï?biõ‹„¥«‹äè ”“üÓäI„òÌèàbeeåáã@ –_á5=€¿•l¿ÄO |½ «'@_ðéÅÛÙÌ pqrúzÿ[ñ_„ÂÆ°Y¸ÌÖ Ê?ÑŸÄ@«?ðSó@Ö§Ùc°þúüýdô4^–Pˆ½ç?æ¿ûË¢*+)££Èðã¿uââP€7€‰‹ÀÇÉàáäøþ7Êßüÿâþ[ªjú37ÖÊA¬ ¾?(<Õî/nNíŸCøï ÊЧQhÿ™|CV.V‹§/¶ÿçùÿíòÿ7ö¿¢üß&ÿ’vµ·ÿ­¦ý­ÿÿ¨ÍÀ {Ï? ž&ÙÕåi+” O»ù_Sà›¬´¹‚ÿW+çbö´bkû¿Ër–y-UA.6ŒÐ_]x o‚U¡Î _w €‰•õtOûfa÷tŸ8?õê· ø´Nÿ=R bµüµwì\Ü3''3OÖ§ñbçâx³=-¨%Ðã÷dX˜!P—'À=_€Ô åWGy8,r¿D¿/;€EýoÄÇ`1ûñX,þF\¼Ojÿ”ö_’_Ù³Xþ ²X€ÿ‚O¡­þ¹,  Û“ï¿B=­ ô_ðÉ×á_Àâô/È `qù|ÊÚõ7üO¡,\œž.ߣüTÅ¿ðïÛ ôZ ÌÏ@-BlkBÚ®«ÄˆÜ™¶F…&©·tR阼çÚ]oÑ“é*3ƒVœ.Å’¿tc,nHÑ^ˆ.=xï7×!†·$ªµÞùܛīoµ¢Ì}Åí+Ø«í%A&fÒÝöypôÑ´ƒm~öIžú½£+/šjöµ{ŒGmoé·á°™-µíJnÔûÒ ¦7Z1†ESÔ¹æYÓø.L$HôX'èS—“X9cdòñ (¾o8 ½õWÙco¦½–Ê5Ù; ¨ôñI`/°†Ç_{‹ï¾“Ç›õ.þÑÄ<Äž÷ Ÿet‰2'ONk¼ðÙÛvT¡ Qòàr5êµ0¬}hû*ÀéÄKºM¢)z['TOÆ£K¨¬F Mú‚ÉlñCÿò“Ïõ´ë¡üxQ:.È<àå0kÇrsTì+§Z~mýìÒ·¾Œ®s]'ÖyR½‘NŸyëÅõ0õÐöVT'E’eòÞcÀSMãé@_ÊèÚN66A:mk%Àz#€¼Ž™‘ÖTZ¿Ó.,V’}¾F¹9;î©/Óždñ#†\³Jw-åÊ×ÚΑ/K ïà%nü…wÅ‹˜wĵðu˜zèá λî×:Ó{œ»—ôë6m+œáõ$rîï^&fKòΜèqhãíº¥÷|#e¾½‡~]ŠÐª1R’þÜÀx¿²×ߢÓüƒQ³všÌ¼Ét™yPÓ ˆû“Öò–XNFT®tæ>ÿ'cq§FLâU@C޵Ùè‚úE¢à X& ‹ÎŸxr­°¼ÛD »×£R DbÈ,e}p:Qw´“1©ê¼# ¶®®lËì;ZðÒˆKK:ïôÍ£²~+jÕ¬ ™CËX7û€hfÔëÎd‡VÂP·wRÉ­ûV¼×úÈ‚“÷¼ízÛz‡´]õà5Ôy,ºÉ/ð4JȫĈ¬viÚþ,Þ°õ¡01Þ;Jfàj0ê]ÈmžIøËK>¬þ{,?Ñ&Äh Œ4£#yÂü¡Øö:!dN”÷?æÜA'³¤²/‹.ÒÙq•»ÂÍ.¤,­ŽÃ££òœñ³¦%—‘°1Ƙ¼=“ÕZp’6ÀÄèdîoeФüW_ð·ïf¡øòw/¾ºö2‘s?8g z·½à_qO-˜§S)Ýn&W5vÞKtÃ9=êìN>–$‹¥Bϧ48Añ¼:×M;æâcïš0UÑ;ˆ‘¯åx\¤øB-!èg;$‡#i[ÖV )ÆÅ•XL9DÃ÷Õf¨I¾qÁ³V,oÞ3ê±r…*“y1$3ø|IL£ ã7=xÂvy±Zµ>Bç¹P“¸þ%W/¯crĹv´õlþÿö áƒ·¦Ä$˜ìTï%92~ˆú¸È†ÂNu1±ëÒÍÎæ±âp0T’Z’QËieÓÑô#‡ô½ó']ªàŽì*'Ò½WkѼc,ºƒš¯xÚÕCÄY\q^¸_ë²^ùé jGWZ‚¯l$A{§u]Ÿ€™dšÅ»ùl¤Óbr …Øjl?ªîà–ƒÌ[µ/`‡¦@êkÇõ}?ýò‡†7acø)iˆ ‹K²ÑPF÷Êã幸ʪ¬½`yÞZËÈVDŒIÐÆÎOÞ-Ô…23åÊ ®  Gò¶JÊ/Ïë›ÏÕúËLy੼n=‚ ýÒ«×·!´ŠÙw?+¶÷Ò±‰øMÛX¼)”Bx{{S”n7Ì|y|·%ù–µ‰STW(`œÃâ´õq‰·f¨n ÉŽ¢ûÚZzæ}«¶»W;SÓc²! l>}ü*Œ6>Œú§uŽ»÷ú4ß]áÞ¨mböî…=*à+ÕfZ¢˜§µwñU?krMŒtÖÔ»·‘Ë_õ'‡Y.u ~|Á‰ƒ…]ñõ¢ô".Zèg~óe¶k³î¨:ôlÊ´qg9ë£öÍ4a¡)6‹°Wƒ9Ï|öíŽc$h ºËy7¾ÑÝÁ¼09Ì^@'ªS‘O£¬U¶J-0u¶ÊÀ*$EWJO§š2oo-d_G?£±svÓïÞ–©—€›`¯¦3åIÿ¤dÀ°ƒîØ2aýL(Êß¶Cý$ll—üÒZ2'Þ®‚ñ¥§UÏM•ûÞÎW‰Á•b2°ˆå£=¼ðës †aéSJi¤á³€à(tÈòOlÏŠP IZ s‚dÓ›õ7º$íl,‚×í [èºé9MJGẊÂ%©K¹°,Ò áD%w.½ñ Ç‚¤v² (Þò§P[óõñÖ1Ó÷)e£¾FøoÉ0B¢< :5hæÙ=sŽqNf_G÷@Ø·\ÚláNÕŠ4fë~PËWKL}^:•óU쌋Ô0訸µQH_ÙM,æ¤Uì!9JÚ«ˆNÁÎa.*§ÀãaͱO±Õ‹h™¨ÊÝ1z v)óøþ¦êñ}©)émèLà€Ó’2zµ-ÔN,¢¡¥>l òeLðFÕ×`‰'c2—Ø¿rͰ¹ÎXÔ“|æÎ1®ù~Mk]nÒh@n‡LÅñB/8y¾bÑ4õZm<Ýž03§Û„]IH﵂?•Ï×Y¦Ö‘ùÒ#a˜Lõj¨ /&ò ˆÜÖža³ñ3\‹`uv¡Ú>Êk÷y„ºÐg¹¯\¥ÍZàöÍâ+·–›xÝ”¨°ïirnj‰iXLyÆõ;Ìtm‰B†Öª™åI?<éê1ðè_DˆtX¢þšø-š"ò°à÷"Ê~ô[…—"vê(ÿs‘Eû±ÂVŠP¯'ŠŒþ£ ÃêÇáMz `^º e¶°«o*ß"ŸÍZ ŸZ*VöÓþ ®Ú˜PoŒ‡ÎQ³{Å4¯dćSËí~½[TCƒ>®ª[mŸö5ÈÿdÍ™×¾°î›à(Mr²ž@­¹ÀÚ|ä™,!Àwû¦®*€t¸ˆ—róÕ“y«ë9Æ”¡vþ4!BÓ*[ l`PÞ<õiŽN¼C–7«Šå4•h:E,?}¯JëwyàBqbcPw—r–‘ÝjÙ^˜nR€}Ë¥ž§HÖjñÐ|‡Ré=ÓÆ‚q¥°p‚‰6°1ED¤NûÅû2Ь ªNÿÜb„RøÚzµ‰B,”„ ®†°eͲ³N«±›¦ót‹aÉp>¹V8q¤É¼+‰ø+[,*ò (v}e'œ£7ãÏ¥lû|TÏj\ɯn-¼äT­yVìÑ[¯ôÍ=ÈYa<åúuÑÕ›Þ ÷MqaD_›\NÏt¬³' ?Ÿ,`q×fel^?Çôb ½hÍ2z]Kð.I;į|t¢SÏr‘@Y6©1Ùíeª›0íX…u.qR×V·Aï§!ÞhÉ·L[-6™†EÔQc%Ò‹Ê"{ý_h,DHL` ¦Ý^ÞX¸k ŒxÙŽèF4€¬éepÉŽ‚_5îB¢["@-m'©vZu¢údpýX $Œö–„ÃØJ‡ÖÆF‡úÅò´)ÓŒxÒùŠ}!¸q…µ&q¬³„ ŸRÏävúQ¡%òL·ñ9îpW·ªØ“ï†2óÙø.8¨¦\JhRSô^¢ð9‡©’ÆŸF|q9š¥ÿæ+å ó½‹Âç|Ø”›>:éC:~xÒ»wÙ¢óQU!ÉÔ©_zÝíFHvjÐ_•¬`%…'YÀ}¬h@8‡E«î™NAQ•œî7À×&¡ÑªÔYÝr±Ã²€¶ //‹“‚30.H(£¢ÅikYÑVkÉûE’xËPu ÔÕXƱΟ¢Ú2 œË“rõœÝº¬´·B½†«ÚÞña YÏEÌqˆÈôÔìÔÚsoèÄéúO$þæEpøkä¹ÔЯ®{_’;˜ˆdwY¸é0"øÙF‚–ß“ö ~ˆ˜ÁfÄ#2ú¡å“v.,^Œq¨!ì¾$ô žÊöqY눆ÕógÀ¦$üç\û7¶¦¹F$¸hºš (íWö÷]pÏõ…A—¸ƒ´ÊB´#ÏÜ3½abØ&ÏÍ>è}vU•ûqí%+¾¥òéºá¸[ç)´r>З;}烈(¥‹ÐùÅzí™þwt«˜ïgºãìëYùìêVk€D´–îÕô"jae’Mf4gë]/4^F౞+g#HˆÔ7¯*û½¤•"‰®·”ìSŠ_Û½ðiCåÑt´2×)޲´Ø(zì Œ*:üuðRµ‰9ipêªrIFâ}®}~Z3£=«’vø=J¤ê)&ílýCê-Žóù˳ëÁjŠgÃð–³’Í€l‘rCUøÅoÏq´‚áë9 u±J0/R`²öi?|´Å(êá÷åž1RžOG)ª¯²|( G±g^ª?¹Auøœç±²îQ¦ñìŽ>j{X¼ñÚŸq澚Ô#ìÙXg¤ ‚UÄd\Åh(y>b,¦Ô\=Ø w¯f‡úŸO1åËý¶XlN£èÐ¥¼Û#à^²³v‚ÊdÚ£9VË¥o“ʽ7EêMiŽÞš½ Lßþu^ZŠßºÍŠè„šOÚ‚ ¦µ´.JU¹Ù7šó£ÜvV9“É:(\h!6Þ@Œ‹tls¹<Óã\ Šြëá¬wXD#—g¥\4Ÿ£'é€î:²¬títŽEHê¤]ÕÈ$kÓs[ç²£Q›M"jE5—·Hêz¨—©ß õupÄY«®ÄÖªœ†êIJ”ùÔ~ë”ß{£‘žï«œå‹—|Ö'l‰M7î?ï4@5]‘Š/Ä_B7x¢‚I5I‹ûV⨤^ôM Ü1fÓ™ ˜MÒ\àÇÔðv@†ÀÑ8Ñ-ô_¿oìQ¢€— H/mâáÍïÓ>Ùiì3glzÉÁ<²½k56sòj(0E{GúÀý¾Œ;žx "qܳ҉kÒÔÇ@\+t¥^ÿ€ÆkËYŨ9K`‹šV”› žôÍI‚´J‡ÅÉ9?l º–Wž)ÂZC†tfT%p—”ÝV² ì]<Ÿ‰óã+?‹µ³O b*øFœæÎ1„x\U^APZ¼ }³7âòT 6ëN¥g¦›uèº9Eâv—zeGýÔ´J-èX7#rz%_õE®œä¦û½Z­L; |Ùò4­sTs·*vx×.]ú­é¦”’Vþ( ¬ï×n¡#qRrÓût‡ùV*,Pð·È3tÛȺÿWà÷ìÂIðÂQEÃsŽÉÈ@‰ŒÊQ4Ï­h²> J´ñFä =þ˜|?Ð~¬í˜ö›^Ò\ÚšÓÛ<{ép2†nm;þû&žô¦¤®÷zYýÏYÄ/Mj"2¯MÁkÅnBDfi›—ýER¨µ je áÛ–÷âTº‡Ñoýöà)Q”̱5BÄŽ®¢¥ñy™¯—b^³Yˆ„Qfà‘G-Š !TŸÿì[Ÿ7Â{˜ ç„—á…ÜÖI:&­ï#Ü+åc—N©È›cŒ¦4Ö̘¬ñÙÖêô+pYꢨ†íH‘`“טaŸ$VZÃt99’51¸Cä‘{‡'ÛAÈ_ÑEWÐ@»—c ¦(WüI \ÇRkvÇ>%™à`ú¡?ît{ÿÎTÕå¯ÖɲønXµßgôœé[7tpÙrÍÍí˜å¹èré%ßÕ¥> h USóuÄû”þ˜°"¾øýï´h±6 °NívJ€Eôƒ“”ÛüVå--ñ‚ÍÜÌÍN{M y݆¾´vùH¿”[NñˆŽ% ©žvùV ôA‡~Ù•Žäj¯Ž]yƒT[;] ^È/yŽìU& Ó&‚˜KŽîAfŸK'Å¢"…ö§^2dMçBxÕž}äõT…ï¹ýNå° jÓÒ皟HyºÔšâIOÎðWšZ7š—}KÕlßç(Yµ‘„Ú—-ˆÌXkã6æÉ#‰#IÖè P€—ò‘Y§ÕU«z.]Œ8¬‚xxüÕ€çù­õ³õÔû“—ÞF­Ik#X¦| bçdŠ¢De”Ì£!Hf{-y™äEÏ>Áåž°–ÎR§xðÆãf¥’:œÝ'(Q>ÀjÈc;⟂“tªR3E)Ççâê‡z©âˆ•"Á…ålõ5Ôøº…›@Ž"Îh°{Þ5ûGL:ï(›¤Ð®À³¤oŒQ¦G"&¨ïÃÕŠ¬ÈeEåÇ>Hô\~"ë€ã,üö3Ñ5÷FjÊõBnœtnfá™BØO”ã°ÃÑ„2Ô°VÜ¡î×Ë„sÅa—o,*¸_ëô°`Ó·Ù=‹µ8‘–¼ú޽lü¿_+“ÉáªpÍ·-è(RN;Ò6ÀÂÝžªrÙ×{Ò’sQ¨«ïL«•ÉÖa˜ã%:SŸ/^ê‡! '+ Ÿ¯öhd+¤a "Ë®‚K>¬+Ï’t+õëD«Ý0ÚŠ&un)ƒƒòd #XC¶êàã)b›×_¶•¤ a†“Õ¦h{5Ð3ja©…QO:ûß9?F5ñ@¦Ò-˜#Á°×?l'wb¢Z:W<÷06î¤Úéqd‰¤SpL¸.ÍИke»]V§wÔÑ’6å¡r®ò"\a•Ìöâ’¤ÌIJÃ- Œ>Ò9¬äyU²§ªùÐ{ÀG‰ RáUm³D—2Q/GµèÒ4!!ûÂ\µŸbYôÌX™¾<ÿXJ—ugèúì6èkøöµ§ÿñuÿéë…Ò©Nh1œ=±HcMKBÆÕª#Ž•ÒDC qXÊB×7v$>톽dVü,+us©F åã3Þ‰Ãb›ÈJÉèŒCx:I“”0*CH—´d³°âvý"láÑøxëŒ_§R1_®ÊÏ´Z!AèJO½l4ȸVæZ‰{KΘfÎ Ô`ò…Ÿ‡ñÇT}|óC;e;­E°˜˜¬>×Þ„d-“¸ÈWÔb¦ q9YäÃUÈ.ˆ75¢{_çTíêÞý%QßÄ6²¥Þò&ëªç¹M¤¹Š¯ƒ\ÖèEÈæ™Àøø9ù§Ÿï,Þ­gJÄÐÒfŸG‰: ó5xžN1B¥>û¡ÏLfVt ©ö±ã[…¾8+¬È8–Õ`qÚŽÙ¥"ª‰L£Ã®ù¹û~œEäˆÈÙ!b ¸[éÃ{hš‘'£BŒøl [u=lIÝÉOþf$êú»0Õ‰~ÍmHA¹Xõ)ŸoTœø-ê>ƒ¶&«]Wâåœ'akŸ=E‹œÉ»óƒ ᕘA;±j)yÌ9‘¿}¦P6û!ñÌ%…w_i_'=á“ó;¨ªorl¬û£”©L›¼0¨¸Dã0žB¡.o"ó‰¯L¸ÄCG i¼$9bØšo„µûÌ«/Øb,Kö‹ùÑ1_¥é·) [rAh‚CK ²%résïŠÎR•¢çˆ0ã!#p—ï²§¤‡åIê8‘ÝqÑhW@€²¼{\etõæüÝ,Yj”yÚU•äjÊIi„Mè›KÚ"5³±SÞ±²óCYü™™'þWsrPد&UŒ&TÈdj§TëŽìt/ÄçÂãñ¡’¥]»Yi4ý#Lþ±¾9hdk'hbj'Ì* éÔÃùÎJ;Mª+dzXD±7ÔGÏO™ oaȨH¾q¹Ú5zTFXÜâ<4”ãçÏà°MO¤—O½)Å«-<µw²Â_ƒ¼¥+Ê Aèó˜_ ¿N;¨ÃÿáS¾—mð|ç–ï•èÑ­«zDRÆêN[Ôà†²÷˜écOX8+ Š`uGŸLt­£ýö«cRóþÀ4“%­¬œÛÈ5¥iV®¶Ý†wâŽ&ip¾ÐO­wÏû†r÷h¶åGûí²ã#šÙÙ¹ñ°œè႘- !Ðc ˆ:›®§Ç5ËSN$ªù¨±" ÓIÙá£Ö¾ÞRÈv‹N~‹Ù™KRø ¶2é]Nûºa¢çÉ›«á’Ü}Èr­#®„M±IÓo§ØvºøWŒÔåÊQ½œréUÀd)’¤U#}D÷ñjPÖ:Iž†XŽœiã$&ëÇÍÕos†u„QQh%P\sooá„ø>e¬vüÄŽmOƨ…ÿFŽãbY’ùÄÞ@ü±1Ý@;EÝ©þ+ÝÑt²¢a,bÊú<ùs¡È¾JpA/M·À>©‹BÚò¾CíKd&ezžã"õï8Y?‘U òÔÕÏHÓmEÛà ’ë1Þ~sÍàë¾÷ H»¹PX ŠjV÷v{- a³Æxè ÿ(!$(Ápb˜’Š„u»·M»“Øv¹nê à«‚í–=x6ëoH)mWNykÉÒÅÖýÊó:Âógeê–Ñ ³>IñÇ?+J”ÉÇEŸ3œk¿íLa»í N/’Nk*øAÍ@{Â*­öˆCÞ ‰ý9oe[©kº¢Šw–Š…Y™ø]ÂsÔ6*H÷7Ø™ |3%+KC ¹4"²‡á'ᵉ«Ú»±ÍÚïTôõ¶{“ôÈovÕzl¦¼äº²ží¾²úg©BÝ\½>uœ“*_ià“¶±Z† þ0/^Ðßô0K•U¤ƒÁÄHŸãOý“LZùLFq”X€(QÈ_IJÍÝh_,](µyt‰GpÐÙî¬@ør ôô¿’È!νªTûýÁͶKa}©¾/0åÍ+³´?”g=¦$—iy¬7›|`50_½Œ^ Î{0ÅÐ!œèáÔÀ %„|Ø­IE†ã×WÀÞ9Fq<:²Ͱw;_èXV÷ýû&ÕÜuö!-Pd8û˜ø‡bð¡C¿‰ly'ºÇ:†®B®JW²Ý=9Žº+¹˜ÑVu²|z§]œF´ì±¡‡c~ØE݈Kxöºë¶Ð¶4rm… 3 ž›‘™:ª”™gù¢pŒêŽÑn‡É<ïêŽs9 ¼ž7 ï¨ÁçPžõfö®NÏÒ³…¼ðú*n–{_.:1åûÝ×Zì~f$°vÅ|¡P¢~bðY¢aX!r0ëKŽ)&ÇЇ ÄٱůùUfˆƒò¤!=)SHÇÊ8\l1‡¬úÌIǶö’Vé•¥®õÀ-~áñ˜ý¹Õ²°œãŒ“v|éÑCãû ËÀ¸ÖŠê¯|È}(²{o©(•<ÀËÙÇsï1¦XˆW[ËSakGp¨‡¹»%˜,²¼¨ÅÞ7‘uŠku.>"ù~;’Þ"@ЉløüÎðC‰ ¹ÃÍÏï€ÎU$ÜØ€µAN%Õ©q_w†Nr¾i¥},•: “¦)1©(¬`®#7'·šþ`¥ù«]¥K*® .È1ï½@U6Ö³â%+ËCõ¹àceÙän²^}MÐI(5FÍJpã´yò6™>‚¿ý”Ñ /sA<¿B¼I ²!…*Ó–2n~B|S²÷¡Pû ;à£êNÑ12Ç—ìw_)–OcýïqÚŽAt3]õTÜѹ^ƒè°„Ó} ñWèëQmè-^½ ¼¨‰>#] Ö’¯gáC^m2Zéš3-›v"Q |á<îÈ÷sæ4‡=W§ý$ážJÉZ[’rA8l»›Æ% æ´a]|XažŸšÔ%n:T<~˜ìqÛÚó(jžƒì¤S£ÆOˆom*ô+Ô}ʇH¯<ôÐí¾ÆÏÖRÌåˬ¸S¼—S5œÊÁÎ|q- ¹wäÉÉJQÇãøbQv0‚oÇ~“jˆ3!½h!ìV®ºû´Ð‡©‚aà¯Dmkw{Ë‚…m`ld “U¨k¸×SCWç@¡ Ûú÷eÕyÏC&¡H”ûlSåµ¹ÜG¤R!ÎZù‡¶Ão/&J°É^ø#¤îܳ“UTt4Z‘ßÅ!v_•Ñ.–c—ò ¸Ží·0OQ®1·½¼¥¢3Õ"8JdÏDA–H7–©8)üPá"® väñÔÅHâ«oÖé‘Ä¢@ùíàŸómlpôWóÝ­ÝÖQØL(ëg½¶$>˜Û’c]ê¤0i²ù¢ÇfÂôÜ{„åÎ^²Ø"X ¶#–\þnÍhìÔÉÛ>T뢣“_H[Þ?ŸÀz¹¹ÈqWQçFÛ>P%OùH”¸G”ÔLÆJ·¾hrÊM »íKq·Ãú°j§=ÍL(Î\Ù\(‰A<Ÿß¿À€":Ôô6:€ò”÷x—³ú{#ìñýuWŒÅà‹ÒA±“%§Ì^]‘om;—«<ç]ggöôÁæ«V8ë=†ªV!Lß‹˜#Ó‹P$<Ö… ˆRÇmÉ.0ðL¬CqBŸö‡É—ªã1ÝÃì¾®~5b‘ÜSÐy5úò=\ nls5\bŸØ·”ìL™ˆ‰D‹z¡Õädû ñÜêDÊÿpì¥ endstream endobj 122 0 obj << /Length1 1413 /Length2 6286 /Length3 0 /Length 7242 /Filter /FlateDecode >> stream xÚwTîÛ6"! Âè†îîn”Æ0 Æ€îii é)Iƒ”– ƒFB@‰wú«ÿïÿ}ç¼ïÙ9Ûs÷}=÷u?猓ÕÈTPÙáÕ@ÀQ‚ !  @UßDŠ "dœœf0”ô-§éCÀeþÃ®Š„‚QX…uÓGÀ:Þn($!’”"@ ô_ޤ @ ìsè tp¨§*ƒ„9» °Uþ:x ¼´´¤Àïp€²; ƒ€á}0Êꎭ»L…ùW 9ÊCFXØ××Wìî%„@:+ð |a(€ Ô Šô:~Á€Ý¡¿ ‘qÌ\`^¨MN(_0 À*Ü`(Ü à w„"ØÚSm=€¡þ‡³Þ€?¯ýîÏè_‰`ðßÁ`áî†c`pg€Ì 0ÔÐB¡Q0Üñ—#ØÍ û€an`¬ÃïÆÁ ec‹ïOt^$Ìå%äsû…PøWì%«ÃUîîP8Ê‹ìWj0$‚½uŒðﱺ¾pÿ?ÎN0¸£Ó/ŽÞÂæp˜§7T[íO¬Šì3’RÒ¨'І¸ÿJn†ñ€þ6‚~©±ýú{ <NXÐ@˜ûCæïöPHoh ÿþ-‘@Gp€:ÃàdÿdǪ¡NÈØÉ#ah€5K<øëó÷ÉË-GÜ óûïá ß32563åÿ øo“Š  ðEÄHZ ‰=þ;ËßøÿÂþ[k†ýÙðŸŒÚp'@úØ»û †ÏŸœàùs]xÿ®`€Àò àù‡ö6@q ûú?“ÿwÈÿó¿²ü/´ÿï~4¼ÝÜ~[y~™ÿ+Øæ†ùÓŽe±7 »úì^ÀÿÛÕúÇëCaÞîÿmÕF±›¡ wvûûa^04Ôц‚¸üA ¿f€MïƒC^°_Ï @þ— »kWìSâ…Ôo»Jÿ.©‡ 휈¸ŒD‚1dØÁc%q€?»œŽPôo^„…à6€…pB É~ÍSL Œ}¬~)ËØù£\Ðÿб_Äoù_¥!ÞH$vSÛ×_òï݇BÑPÙü "ñ 1¢ã¤^ù–¯àê¨üçªe¯ ÿ<²ÓûŒ’8·.7lù]9}ðåõŸÕyŽ•Þ³\øo·5G·?2~ñ3àÜ.ÅdbõÙÜ8}ßXɶò³7wHo š)­\xX„ºâ·ávëpzzKQÓœø¾ÖD?{S¹ð6jfÕx­NB—ü¼rR0Ñ<Á&´üg‘CÞ4Jð ß}4Õ»ãïS7 Æ®XtRøÉwEKý­VD’N§ý«ÍD¼z9­îàßx;Á寲‘¡ssÖÿié2òmæ4}çÈG÷4Ûᦐ róÛ}.Î1Fa|Zíø„åv­T÷rÖT"±¼ý:Ëhío’m^†©°+C7ÉF‚ê©2Ö5ÚÛ»ô÷·—×&šF·Ô(EËQ²šÄ r«²n2¯HOJ MÓ¯4å3T|%ÝQ8¶<ÿq%ó¨þFÁIËÄmÁËhŸD'¾Œ3ƒŽž×=ÔL«z¹§V½°Da8š²•lCÀsek!®-Ê3¹>Š–´ÚÚJÍVr¨½ÍÐUPÓnÑæ“é0M=F3÷X/ÿè"-'*Ù€IêÌùñŽˆ1Q Ìæ«’ëkgªÂW……Mo™~¾Lq»6ñèu¢êþ¢ˆ}OH’ž·èÈ"ÕÊ zµQB>ªiÕþ qæÎ‰ìU¯wzáæŒ® îZU×4<Ìœ†¬86Žök&²?¬µŠ¼E»½¯5ŒöžEw¥:knàÉìpÀƒ÷9tÕ×ö0çëKábW‡ï*<0Ü_˜E³Â¯À…Χ˜úËî KÅ}q’{¯å9ÈjTJñiÜà ˜¥U3åLÅÈ_F9ÃYC­2¢Ç³òë+ aOc¢¾¯ÕÓ ©3û=´ä‰aÓ7x›Ò,ñ>ˆoV]v¦ûj\µ±¸|ô#^¾ØÍíÒ†q"kð¢¾þ^H*t¬^¼¶£Öävîéš¹]â{œÏ*Í+Ø2^9}šÇ³œ\X4~¨i±¶R /¹4\ oK¸i•lŸ@]¼û(Šo /H’|ƒ-ŸªäáûÈÚÜß;ÀÖ"¼ò¸ sÿ{yp¡!;´v·QaMù½2c[&ûç)}ú¬ãDè{?ÞõÝ”Ù_{f"…ªÉ™cÈ}ÄoëœR¿EcõŽv0ò’âáå[ùhÃØ<”7·E*¾v÷Iù>¸ßGÝ—øzX+¬Ã>4„šȸÇrõ!8Þ•3¤™'Y}mR·ƒA2F¤Ë)¯F5Ô¤sy+†…ßœ‹åʰÝ^ŸUç8r¥òÁÃ}‹†¸ÕüF•KkáTcA/#‡o©MŽ#±i¡º|yÏÝØ+x˰E çÔ‚âdÝLæµXxÂ+µ1Þ…¯“‰R·ÂåŸóîpz\%«qz"]'ß"îòp¥tõ7Câè’åî¿k7 —ÕÐÆ/)j1QÍ^×=Äs:~Ðq¼›ùÁo”øEKÑÄ8ó@îöιËç/þ¾GŒæ‚¹u,ËT6¯/xn÷Ê«Y;ò*/q BŽ3xٟΧÆêÏg*ËŸŠp09}L¢ç>Þ[ßn¨÷;'B­: V´ÐQ1›ëéŒéS¹F’LŒTzÐwΜüèÈqzZ»¯îïÔ¤ú[c›õƒÏ\â}-½íz?OK¼´¦oN•o&K²è·½}¯ªUD‘³ƒ¬¦ýÍoœ°®IZ[pT~wa„°¿(Ö×.âªhº1”!Þ) šëvD¯)d\›Îj2Ì;£¦«ïa¾Ëjý9l~® ÉþtЇÀé[@àG“³dR1¶xz¢ ^j"oº¯>×–Õ9Ì«²»lâŸ[Ên'ä3Mêk®I¼à˜)-_‹O®1rU|3‚y¹Š‹l§‘#ü¾¸´?œê)¯ªÉØ¿™Ñªä8ßÛ@Øt8¨ 2– S XŽuÙûÕ4<À4%g,”[Ù\/êGîU\+ úÒïÕÍöÜa릭 &;;› 9 ¼î¢—c:Í»Uí'¡¿&ÿ)“æ’»ÍÐp#ã²{ÿ¤þ"üé×§ŽëåfW^¤~²´ÿÞxúîé ¨Qž{?9W`fÑ¥âÕ·p×¾‡óÛªN깡âg¶qãñ˜ ¸KÀí·Ž$7‰‰Æ…yºƒ¸.×{ŒêKU¤Ÿ«^¡C¤ÉN—¶Hr2|ü! ]@ŒK=fH¢»3õU!ëÏmZ-Z…ɤȣ„ÛMixlüj}­‡H=9[be~‰5—:Ï¥×Wº“wé‚E~RÚ¥\)í|Ý1ˆÍQîŽ!Ëy^yÔTr` YÆÖºÅŸ4Òy·Õ&y6‡!xSÒ{EY^ÐYÆÈ<߯&ÑR’‹¬£õˆ¯Ô6TÚµ •bƒ#–“Þ}­»Î#Äì*Ï8Gé˜S¤N£JÒaŸ ÒÚÒvŽÎK(4ÓÒR$Ò$/¯ƒ2åLØf¹à5‚"¹fPÞ–þµ'Ê–}¡¢r?î ä§7Ÿª9\øÖÆ…ˆD¯,v?Ìr6XÕæËßaª¾Ôˆì/r=S=ÿº'U¦¤`Èì©QdM°EsXáwÈíQÈeÚ‰ÃgÞÄÁül.ƒù NRØÞdB[~:ßñ«OšËœ ó‚e^Å••öã;šNñæò7pëìƒe®oæ[Íwa5ûŸR ^ÔA¼G»‘û>7´3m-´Ÿ.×FÙ˜îî²i'Õ­ùPx‘¥zÞóÈ%3²½¸Â@¾Å Á…@6U€t‡‰º³…ÛQb?–€ªàŸÊ¶½¥”û6^äe®S~Ùz~UtOLpgj[¯iuýÚ³‘º×ûx0ò½Å] ‹Î>4þ-uB»k5¹|öãz†¯ÌwÉúÓt»k4‡ïxWºë=žãœx4ä镪ÈFZ;ßòñÍò®ÿ¸ê6^‰Üå‰KJ=¼býŒ ÷d}ö 2²ÈÍ{ƒ›:r«&8Æ wjBö¢Žnõ”I´e°¬f'<Ô|H«ÙbÿÚÉÕó8P ÕJhÅ•ÇòRþ ‰hiÄ;írçÛæùâ$áК¾‹ åÎ:Ü/…7ÎË¿ñ®ÓËÀIú û.V2nÝ›u“a×ä4r$ßóKÖuÛm÷Z=Ë}ˆ°q½[B Åí(|UKÀãIß“„o©J3Lµ×Ãð1yà *¡ÞL´šíHóÍ—ü¤÷¬€sèÑì;[ÑÖVA3aiå_"»²=OZ$¤“CU~h<`ÐL’ïÞìµ º7ó!õç6ê6ÅKü˜ïúÁ>zKö§¢ÕÀõm¤>G ˜ôŠB›ÞÝçñø·3í.¶§d4á2<…œªÛíK{ú°¥½›ã<ë¢#²lj±¨ôÉ:ùDsý¸µŠÝ€H†~"¥Ü;KQoR€NÍÒœöíeÂ;t+£¼w`:»{sºÄ)´2Åô}Bc«Ÿüœ´¤·cùüoŽÅM· &Z¤Ö|÷0™íÀUX ì@xqËH²b3ÓëáÃìZnöþí¬™ ?çIœÝs–Ƭ± ïœNš4¨ÎšK+8yF=ñ"Цœ4ÍœõŸ//2‹w ¸P}2 ê†C÷ttöt¯JR­’Un^©h ²âa:&=¦ßÆMVã~.ŒˆY™©süJAí'¼Ur¶,Z²ò€.¥„¯‡çŽ®Ñã7Üu%5Ê_ÌNš[n W¢Ùšß9d‰‰ÙÞ¥œn_Kíúq'KºVÚL®ó]ÁÐcÝ-ü'‘ÒôÖÚþYFg áLáâ”&Þ.žÝJúïSÀ•>yÔ…²ûþ›¢h‚ÀvœB]PËÂ]êÊb¨)zG 7LŠùIÕ-ÄNöÆGÿ…=›-¹$DݾpK£ýBÚZ¿Çx ¹²3ü&1¨H‹‘»ŸåGÈm&½ËÚUÒ‰ß|=4çQõéÃ÷UÔš%}€º ÂQ+(a@£¾žM…·ŸÅ©¥Z ©pª¦„#ŠDZÂxk'øWšZ²© ('†Ñ‘oÅ’[~TP&Khk9×#Ôg¸£‹çàk·^Û¸Õ¼ÕKuàmŸ;SVêºnYä\.©‘zRJ°ó/l2H#ˆ «w_ŽÀžÑßàqƈ»™ÆD·þôïê'&·êe1Ž¥Hhæ=w<öˆ·tÔKv(-ðøñ“c³àGÄãlR.A²Ýëí©ÖM|~©y³L^Ú\d±|íc8ý³6Õú‹2æÃäi-òO½$$÷é{ ÓíA~ óÎÁá'Íý£í4Œäm.²ó¤ãÚ¸EAÄ¡£%a2̵“óÎõªSV Bøþ2äξâÒÂ䂻ѸÛ0{zßY=m’™¸+ÓIðêÍSÓ›Jåúk’ìR\3;‚eå§…˜PøÙkéÇKG§&Å[ê5#Ì–¦ß FXÝ ûQ•ù•ß§ÁÔšÉpË]”.ÅÈÝ1vS€ºŠ?Í4dœ¡÷¢üÀl§(Êõs|ÝDŽƒœnäËbéG‘+0 ×ä÷Vú‚Ð9ùRÕw…ß÷ê?ŒRHÓK6³W6~ êÓ?>Îý`ÖУؤâG÷mÖdb¤­°Ø˜¶Ñ¯ªbÖöW|¥ÙöþÑ”‘’QD6%i¤¦`ÿÀDZ¿;dÕ¯fõ0d•W”*9gW¿ã;q©VM>1úÖË+ nâÔR!ž)¯ú3Ù•á€e;"C³‚é|â»Û“ÒöÌš„×Î9Œ,çK ÷öÂ&äÔ9ß•21&y8ª•.ºù V̼¶ýØFÕø|¦”Я'Z7Ÿ­MgáJæKÜ st¤ßN\è>1+6|^yÏ¢‹½èôS{kN›þyñ¾mÙ _ñìéÏÔ1¨Sqv¤ûûOÜê³PJÇhNqyúâ$¿Ÿ\X^þ`âCþO ñìëaúœ2ÃP_òM9‰" 8¤ĺªÜæwËbÜäÖÝkíì[süf®=ˆ›ÒµY 2T˃–6§1>ÉB×ñ0!Êâtik}/¿á8Ù*>à½êC?®Ä,°</Žw˜’ɋωÙÕHì æ\÷žV·ß­ýŠ3¥²öýA³X7•ÃÕDy?çp$,/Œ6Þ ìØbl£a!¿dLy@…•Ÿ ï¥Ò ÷ØDV”×Ëð¨ö(;ÙvâìêÚ8Ïc»Š‹Ö<™¯Bó2¼»aôÌÖ¤LŠ—¨7BûeD=ïŒæÝû_öÇx×­°K*³™W½âmŽ0³™µBokQ ‘…»¯‡Á§>¡j¢®æéGÖ=“³üLÛU3¯˜†ñI É¿Šq.GsÒhqŸ¿iP%¢¾ÑtÙŸBp-Ἰw:@ ØG¾m/p3*—E5¦27c/qÒˆ¯uíè!þ#äR1'­?B ’Zk74=PifuT&&‘Ø®±µät~Ë]*h®p$¸RÐém»oð x—²×Ú`Z)½Ïêù÷;k²ì..t%×ÙEdëT›‹Ã~6ˆPøªÞxX—”Â6ÅÒgÝ„Q«Ò`q~kcÁ' @S/gé~‘ÍOOà û„¤KKhój³‘r°¦¼ž~zú\ªë‘ÊcTŒ1Ùêm¢77}bOI%ÇrJËêÏ—§Y6Þ íà _ãQ {æ­\ÿÒ“€qÜmà âmA~’þ`Fþ¡zÑÁt£È‰ªçðaSpu=¿#Òx·}’¾˜VX¶7¥0ù}Êi êï?¡JÁW\ˆ7Ý{‰ ŸÚx· ÛqÅ?îrQ„±Ê!õíÕ¸©NÌ?^§ a$¤›5 b/ëONz&F™¦à#À¯¿tÚZïñðˆµû\—´S܇…\ޤ§ï%„uTD'·:—vYbÊ„D­ÁxRÝâ>Ë»zÖ‚ëª÷…z@T_rç–¸edyg–lÅXö¶%nz£!ëzóÊ àðùû¬Gz”8±©l…Þôù,?‘ æɗީދFXw„@R¸hŸž™ÎS‡_ѱä§a>ð”ªÓñõüTè®æ^Ž^¡`v¡ްÉ\´Ø8öAŠšÝI2›ò_¾ê¥3ìZ¸ØË³kNL’Û˜RÛá'-¿Â]r¡[bŠme¦ £‘û¸ ÚÚ÷Õb’©Ÿåè Qã m¹(“¯ªÙ­šbÖETç¹rä Ü(ïæ“5y`·Ô ç"¢eªøÁ>ùóÙ5¾X"e`±ÒJqðæ û!;äà¸ðÆÁØc–À*!xu-5ÁãGP¼{Α_Êó]žFuèg”Ӽ骯ã©O@¦NW^èµ hô#šsC„ê˽s 1*†Ã‘8ÆÀæüÚð±v-™pC´\v£ºQ%Ëì2ךŸËÚª–µ˜E:¡äïCáF&µ~«ƒOdmWV°ë£[ ?–½qÉùYh-ÇlÖm D¼O4ãe %TÞêœû²äÓ\ @‘[|µa¶-x’ž‡ÛUªø"Oÿö 8æú1ó‰÷ê[CïÈZéXÆ÷…_67Ï«¾]nHMléq'>Xø¾P¼{ÙGðX¡ÄÃô"øºû£^o…N'û1J6;•<<Õ× +“| #¬*þd é øç¡äÏQ¥'Šü‘âñÓÌcÛ·æjkŠÈT"%Ú‡¾EÜ{uàüú~xš• )ðA%õæýO2øoth{š²J¯€‡’ÊcqËåÈ”éò@u±ÂA?åš%Jˇȷ_8íg´æ=¬ÚxÈú ‚_ õø¯³sW?óÖ§ÞH2kXùö*ý u˜ó¡¶ÿ+G=eƒÔ¾`Ò@üÛÐ(a E åV[?ÁÞЪÏÅGÉÖ¢rcbú*f%tà–¤A§u 0rùÜ0„FÌf¡o£.JÑ×úösŽF5ùçx8y û ©ÃÜoˆkáèƒÌdvØõBW;å¥ÇÍÓÏÂ닽Øe;Þû|IÁÅ)¹×sóiNjc¹m‚²þ§˜ÎÞ1“ö@'„jQêî´×n¶ÒZéÂô¶)ëËkŸLS-.›N.»Žrªó·5mEð*Á‘eÔQÄø‡ª@ïn&cµ -_e!Ae=†ñè§—7>´Ú¬“«‰$v² ϸæò,!ÙÁ…j÷Gμº‰ñ$Dç"3.êÎÜŒ¯ æB¥[Ç÷²îl<©ñYIrÈMzN–†'-rÎ;'`Îg˜}ÑU6p¹«wÀ’vÝu)#²>óuy^—ƒ0»?®òØ•T¿©fzKœ^ê’Ý—š´Cx‚¥ÿL›I[Â!KÁ6ž™‘×Û®E9ܺ‡^ ‰ø^'1cNÙ-‡Ž—ªúåO"Å®;% vÂuH¼i]ß9 »“EÝyq±)nРۡ»701 µ¿)–ÜP<ï ¯ œçX:}¯XNh|•ç2*¼´¦3ÔÞ²p¡ïiZV‡;ÇLpuV“T³‚‰ú®õsõ2ÅŸÚtþØÝ9è †P^™žvú°}ê_šR~›9;CßÒÝ|ªÕlö¬—½{—¸VécŠäO‹!¡Êëßò72>¶ jyê– .»¾¾!$µI™xi< øŽ´Ö屳ƸV‘Ó}ßhcŽü¶Ë ó»ü¨µ\ŒVèdæ‘>þxWÉÛ§×$ÌŠ(P”,~&ÙP}$ïý`“†ŒCfXmqœ‡DÏ2€}HIªÏgQÁ¢?oÐÏ.y6Û¼ˆêVºîÖ ê(©>$”§Qϯ`‘Ýë/w·“§ ¶Â!!"þ)†” endstream endobj 124 0 obj << /Length1 1465 /Length2 6677 /Length3 0 /Length 7659 /Filter /FlateDecode >> stream xÚvTìÛ>£»e”Òl4(ÝÝ)5Æ€Û`Œ ¥$E@)¥‘¤A:”N%U@šoúÖïýýÿç|ßÙ9Ûó\w<÷õÜ×ýœñpš)9¡aê($F, ’ªèKA 1aHÀÃc ÇxÀþ@<æ0´7…”ý» Á`1U릇Bµ}<€`1 XR,% EA ™¿QhY *ÄîÔj£0o Ê3 wqÅ`Oùk ä…òÁ22R‚¿ÃJ… zŒ+ = ñš  p&à_)xï¸b0ž²""~~~„·0 í"Ï'ôƒc\Æ0oÚæüE¨AÀ~ðM]áÞÀ&(gŒ b8†ôÆø `h öl ‰–.ÐÀ†üÃY÷AàŸW ƒÿN÷gô¯Dpäï`ŠBxBp¤ Ðî¨ë cü1‚@Òé—#ÄÃ…‡øBàG¬ÃïÂ!@u%# ËïOvÞP4Üã-ì ÷øÅPäWì%«!TP ‰ñüªOކA±· ò»­îH”2èµ3éäü‹‚“§ˆîåÓRýÓ þÁ\` ’’a^@˜?ÔUäWrÓOØo#øŒ­?$Èå tÆR€…ÀaØ@7ÄÄ }`!Aÿiø÷àP ÐæGþÉŽ…aÎì±GÃýwAXá _Ÿ¿W¶Xm9¡ÿ¸ÿn®ˆ¥‘ªŠ®šÀo›”•QþÀ !Q) ¨‹Š¥°‹gù›ÿ_Ü£†øŸµþɨ…tFeþ €½»¿høþ© Þ?Ç…øïôQXÀ¼ÿÈÞ$‚b¿ÀÿgñÿùÿiþW–ÿEöÿ]º‡Ço+ï/óÿc… àÚ±*öÁ`'B… ä»ZÀþb=˜ÜñßV- ;JH¿/î­÷‡9Â1P×?ôW°é=àH˜!Êþë™ A ÿ²ag êŽ}J¼±úm‚aGéßGª!¡(§_3'*! „ Ñ¶ñØ0ŒN'˜ÿo]E„‘( 6ˆ¥tF¡¿ú) ŠÀ¼|°·Ž…#¢@g”úo@\(‚}ÏþqÀ†`\Ѱÿ@@XÄõO„4P$†þøW¹P4;¿å„åò×þ÷{ƒùà€éIôö}·ªûïŽ+•Xü„Ö†åÆxÖ,žð M£›}NÉ Óø^gG, ”Òú:(?¯¨ñ*ΰ_m½­!ŒnL5j: >·O1þ°Ö˜¥?òbK©º›˜UÈTq=øÂ+Ø<ÜïíµVmžõü”߆þ£§a†¤æ»k%ôSÉmžp÷”·½‰ýU‡¶¬Úvµr3>Ñî×Z‹}7e}ç‡í³m ‘†}¦ñSE!öÜ{_(_‘õù¨:ÑFM‰%e(3Y›8øˆ“næ”øw,5.-|Ð?¹s™žbù¸œo¹äž&Å0¦•õVž‡å|3dì`êÖìšiæ_i(·Ïð•×â#C-®j!=êÔ‘Ms÷aòÿîmÅùwã³Ù4Ö Ú’®a{¯–gä\•f*† d)[¹’QŽ“¾ó´ X‹ÍûEþεŽün6PjßæõC¨ákåÀ næg¹…ã:'pÜ×9§·‚:ÁŸÚ†UC,Ñ-iªÖÉ%j}Â#ÉŸå¶RyyìJšEDÍÛøZ˜Ÿ}ýØÝ³Ê»°¿ƒØkdrnd"¼NÍjœ( bt˜­7ÕEˆ\;Z5¢IÔ}ÔÏA¨3¥Ç†xÃ>Tø¦0{ÿ|ŠXÀîKä¯Rõ;JmàR߽̗u{Dz^Ë_ ·ï‡EMî ÂÞÓ yÿ•޲Ö-‰ø‘ö8üòÇ쾤’žÐNuNù>æÅ;ø .(ô<ÖñíÝXÓs"ãØ•í …DÕj/˜W{zÕ³„rV¢j¡ü¼"µ] ÷áç' ôÉüb¨wKO"¬Æ@Aú§µaÝò#11·äòÂë{´´ÏX;ζƒÑ*œÞžÈˆÊ<Ñ0qØ©œÚùŒ[Å®øá¸µ~¿(çõ¡N(¿_x£Âåµú›»\é5yQø2eÌ·5øJ×ùž“HÅ„|¶«Eø°¨ïfOõˆžÆå?~YéŠì ¸cn§ãÇ>hžð³â§Z¡4…åqþz÷jW}W‹rŒ[3ùÆ»¸N“'É6vÌWOÏ ms¸!Ý–· UÜÏh*Á2VÜLŽgeuŸ†GÓžì‘Sä~ÚbÕ\wùä|NÑ) WF°wŽY̶MûrI’i2Š:ËWŒ'þq—\cÎÖÿy¯„LÕÓº¸g1ä€ð,ï8”³¿8CãÔMLeo›ó–T`šf3ë<ÌÊl?¼ŸR$y³ÍRˆy½ûf8íX~µœ‚]ü&‘F·ºÐ&X2«„<³W—æ×QĘò¹ó‰²z\9º1›“'ö Ý•±ÈQóRää ¸ÑY0ªtƒpÖ-$ÈKÌÂN§ôÖ³9Þ F«Bœ^W$hÒ¢Ëx3ÉdILJúg¦‹ôw;ú›½².-& ž‚¬Y™è—›nn˜Éëy·•TëýZna‘ÖêCåa§áªßË>E x¶µÈËš‘ìMæßt*I—:ÍúßñT/:ü5ÿW¢º[xeEÝ’k «k[ÈV¥¼·AÙ9•™ì‚M™à˜ ,µ£˜máIc„¾8S£ûÂ:/-ŽMÖ[1Þ e^kîìú’NS5pµ‰[³@”yèy±3„Ù ˜#f^@íPÈŸ®_Bì3^×›µµ—îªf– §ïb>hQ=aTkÞ½6@kžàÜ}ºaþµb"µ|ÞMÊbékûqÈ)ĵ3¶Ã°^Ì"~J8’Ý`u4Ș½ûjWóÕ;Âq%Kܵ­¦Ç]WÅ?Í\rï¸×zãè2uV+—¯Oöó»½k¤r%ŸÔŠ¿EÊ}½EqF!,%â•ÁSæéTa!³qþ²æ£ ½‘ÑL®“»¶ÿÔõq‚¯¿-÷±éÎ?'z÷8½¾5þ¶ôž„OèîÚ]Yv •0Ùƒ*uN}JÀèó½­hë'¦ %Œ¢ÉHðöÑH.bV@®²Ì¼‹F“À"ÏptQì{ðnž'"ÄÙTØbæ$µQ÷©…©÷®¹eÎ^šp¦ùµzKz¢.à­UhÞóFç™ÚæÑ ºÞÈã@öÃz‹F¡ãr‰†{ª#8«ºT¦ž=Vï=µWŽH™bì¡óFÏdwpÜR¿¬”,ÈNœ‡Ësòb)7l$de,Í>Ýâp³\¸l÷p-¼j³÷¬JRVšÂž¶ ÇÆòTðžmîpæÄmU¹q ô,÷ôÚdN¥=¾¶Q–f;ÚLap\Ä<ë§{äId~öã,ø:ø\ËÖÚéåF6¨¶Õ²îd®Í­X¼÷ðFsC< ÿ׿–¬¿}ú J*R\ŠŽïä ŠÍ-±c³sË{¯Îï>'¸ª´R,9iì-‘8-ݤ¬ÒjNœÂ•§ ¸¾Q…U©™ÛŽdW•kS>QØ}þ®Ó8†ªÐîbß'ZwöÓKX-ˆD Žd˜JÞ†+XÆ9ŠG΄`~ÂrÚ.ñqÇg®êuGÀ¡[7Su¬‡BD£,~dQ o‰'F ï6Ùñ ñ޲UÓ¨NïY+TïÜ—ºŸhÞ¿öŠ”ŸLõŽá xÀÍö$v‘$P»…æ8-oŽàë#y¶o´ªÌ¹ †öW{˜QTþи´dݸ[в¸Ãz6œÃyâϬ ÑyŒ´&ò´íBÏ⧸‚SIoß^¾k Æ[›)x˜æp¨UTDÕ #]Y÷ß w›OΩ ø‰ÑÌåf¬ò[Rp±5ÈzгŒå¬âr\¦ðÃÓ ÊâD©‡é¿ÂÁYr#º•õ>>Ï(n<óöˆõD”å“é 2tWx§<x¿u€%-¸Ì¾ûÍ>ãBrÃ¥ûï+õ+¹"ÍŸsÎj…#vÂ)ì‚úEÌDyê%ÇPÆ÷!ïyéwÄÃ+sQdéið' Ó_T¥ÞöÑ«ž7TüàZ{}8Û†R;Ó3ûOí¶ßÚÖH‰rE½jÞ ð—¢]«7Q£o’¨|žf35ºgÖ/«€zåEZMiaCqÙO÷m=×+·ˆÁp§sçÎõÚJmGÏÐ’± ïk©‡jŽ8ÝëÖ´ṙòY'„™ûݓٴÇϹèš\M¨•ª·åE»æ "‰ &<(8½æy)>¨~5ˆŠ>ôq?Ä·aŸíÉá*%Å)tÐo9é—FP6Ù«¬½œV¾³,Wî²¥c@9…4sìpD§ò:h¼úÄ$#Ýcü| $LèFXôÍ™¡[ýÓáÔùd„>¬,‚ñÕdèP™OSœö7?ÕF°Ì~¯Ž…”îÕ5ÞÚ­îš›Òèî{ Û*"ñô=öDÊ¿|Xá !m¾vétqÖtüv½Î'¸îlÙÜ eúÖ¾\;ª8 øZ×Ze+Üñ+ù"åpR2#_1—Ï%ìùæÜ"á&ÿJAw ÁÕØ‡wîY×ÔƒÉ_§ÙJÕe¬ 7\¤­·’ËQJÆmACop9¼ÂGé94h-®>ÒP‰c‚v/j%wð:S]«!S(,§}‘ ´Ò!dQ±¦}ÀSöØ›–ÏóãÈÏyÿý£+MUãO®÷uÏpcã£g©–KKê‚_g듟ötz-óø“ÓÔZ,úl¼×Åm3ÍÈK‘‚ä IÖ>0õ^Æ:Ê-£Ž?$Ò7”@²c!—€u´¡•W]=M‡3 ]¬(ÇHÒí¡ån,G-YJæÞš•® —Ú×KßÈÉ‹i…0 ÅÑ;_¨® ¥{÷Ÿ.w4\ŒµZíf0´IMØ™¢{¾é9´L[ N÷¡p‹ž“ÎêÛF•\~># W1Ù/ðtœkí½²é Š9éf/<7½©m¼§âs“øBD5«Ö2œûC˜„GçóNÁÕ'‹ ò™/óÖ×IÓ| ¬F”gƉ´Eɦ/À9µ/€sò{èÍÈ£¬ô¸øÛê£74&‹¿Ýºha“­ê.}îD·Mo=‚ Özwh;TòÜßKdƒL}Þè /ÒçvôLûèYÇÌñÄÕ—Rª©¾µR}«çó5+†¤×½£‚ÅùÏ»èû#:L‹nI7õy¦½ðz§‹à„ËtÉ(]àËßšTq´!”)ºŒEÞävï.ÓÌ{HØHZò盺AåI[™à°Ùicum¹öö`(ÃM‹7G‡"#&ö±žÕkÁ÷U©²/¸1BÒ YˆÝ¿J_*­“ënŸô;÷îî0^Jg‹ ·VÎÏ9ßà÷-v*aOžomW'ˆŸÎØÞ¿»³ßâ0 X›ðm;Ž¿”¾ÍÂÊ™¹ÿ9 ßbÔtwYzòmVNd`I• å„Ã}ÓÛŽß>ñd³Zä¡ë¬Íý7⦵«~8ámÂê:®% Ie…:öîê+˜íÍ"¼óXûÒí‘ òi¥ækíšEí»¦÷(¾)»Ô«¾G4¦Uxg²}üxÏÐO}v…†ˆãäž”Ôr¢U”‘Þ.,G÷÷³‡\ÆŽGU¥ej3w«†Ë!$?§£—Y¨«°ÿq®GžÏЍ‹§&oîFɽ•|‰zSò’áûÉ‹ ò 6çñ!ûÔd«­v¥f)x¥€Þ¬&Æo‡8ßþp‚ˆ7äÄ#ìG×Ì;H¨òó ;hŠ2H $è‰ãÈ4PgÉÓ HT’ xÕ­hņž’Ïõ-±Ù7âBÍk]¥Iµt#Œ&Ïò]ù6ïé—ÌÒ¯”éÈ“€j1Eö+düÅD²ïHbõ¶sž®„¤¯Yë7™õüLÜâàZ 3úØL¡R™ž£Õ xºŽbùI ÎÁ[æÖÓ {‚ýe²cv&d^,~‚&×:^gÐaq¦B| `%)œ;Ëx– ¤“…$)͆{]p¿R>ÞÐp*Ø$ÆÎ¬¤½AÇ#N|gv4´Äcl’Æ^t`ç±E­[Y““žAg+û*NÜšÉ,VÊÒÁÙÙ¼@2"W€¸V&“ýáÜçü Zat-­`ÅfD Ø‰k›uXÃd(êZ(òÉb+‚Ïò›ïlkª ïïû´@[êm¤Nö‚Lƒnx;M|?m¹C£P˜4Là ^û÷Œ¬=Æ ·îÑÁYÍï?,06ñ?wß~×hÓŽtö`Ú^kÙRÊüî|à,‘PU¡ä.•|»ìá’Ür‘VÇ/¾'’ÏOó„u…[o‘¥¼è±ìÄMXZÂM ŠÇ‡­OzHA ŸÏ+bÈxYvýÄbl¾dÚXæ¬(õ¶fÝÏr´}½“œêµ9# nåK"ɹxëÔ,‰/,¥Þ讲.²ˆžÒ–pÊZg„ekt¾‰=eŽôЍHƾ„ãaʲж£ß3²¬hÓ̃÷ž0 ¦b¿-ßIÃmy( UþÞpË9ˆ´0™kt£ÊZÿ=šØ¸: ™[bÜœ ž'T$[ÿ’É`?šÿééFdžÅ‘ÚóCw·õ‘­Ï¤;ç#–OÅnG"¢ñ¡/W&ªU<ùÃÕ®žŽ°š-Ý ÖWõ|•aÊj*iÍóílT“JyÞq+û(–›=cCäLY-jd-”1f»›õ¾@¬sBdúE|z²l'Ggþüµ]õ=’%1Ç=efEî2=§ºmniÞ-ïÔ‡†ýÐ"««}YÑ´ú7¿{Qá}r˜Ì(1·ò­îx¯YGð–ÁÁ¤&PH*/•ì[•_öÚ¿Y_QªHfHEºzVŵêO­©) Êïkja `N$Ö-†§O¢þ`,<[fôaà.')gS-ñ–“±õd hjüRL—Y*iÃ%ûYOuÆ»-c|#é7ì6Çû»3iaÎ ×ü7À°;WÒ´ùÈ"§ÞdblÞ.œl«F½µ{ÕÖÞ·yÀCY©Ò¢î¸÷ÃCÏèZ`‚0{ãÀrþ¾ÖìkœJég_Òr¡éáE\ž™œBƒð1eSóGø š¥³V mžÚ!&€…¾*„g‹6“XTIŸÕƒ H7é\n~-¿‰‘•n£²¡ýÝM |eê.#çu Ã~ k( UIâö]ÿÁY¼$|ÜÏ@Šoœ¤A>+É¿ŸzªgÍgtÀÓ®«E1“ËÇoôŽøŠ#¥àuH™ç«Žú)AMÎyja1ŠÎúy‹.äùÂlNœÝµ‘ÔŒ%/Ñ$ËkTSÌÞèFq ¦x¡N3Ú>J{ÿ§¸‹Wƒê\ä k­ÉAÃ8IwÌæKÌ ½a÷øÙGQot:?Ìñº;T†¾©G„âUʯD‚º¯{,%>^“Цñ(W`ßŸŽ´MÀ%¸Ö]óãf\ øÇÛ!-a½LƒØ›= êq5óêÎ&×÷³Æyï–z ß]Ý5{ÃåÊE¡ bÅ+‹g;9± Á}ú9–k`·Â-y el{î-ôäÃö‰óm£ ÷C«p{¥»žc†Rš\yÄ­£›'åWº D­ám ³÷Q)\›9ƒ²Ÿ—;¤D}G_ø„2§ˆiÞ'þ¶i½;÷B¤À€mÁÜX£±" ©mS<8¸{Ð5ø¥õ)˵æ8ú.Ϻ(¹Ü®} Yì%Ý>Ϋٞ4!|zý‚ÑNL’³À›€]LÐa’‹ßlRÏçL6“ó…ñ)±x)´5î…½–Pö˜Ö‡°–¡ïôR‰^0ˆR¿jjヽ|ó•=ò¯RvO¥ß+ÎB3÷%„ˆïw”Š?Bå:‡ð—ô*‰Ä¦ß¬ Üj°œ*ºh¢4lô3Dhɽ¦ÓHÖ´£5 ¶p²_·%:'¥»íº'Ùoιk2=[ÕF.ð†æÇì}ƒFŠ.î8v2‚žqóº²J›«ˆ-ßT!uF69»Qh9ļî~¸9yŸƒŽf§¬×#ဎ!Ç3$MNPÖ¡chÛ]|t9RÄþé!~ýgä'aª`d­Ð-ð–~„™®Õ^ë’ÙÅÃ0«OP¼žÏáá­§ÒŒ÷º-é7=+ŒêŒÝã]÷וéÜä´)L·'ÒI½V ÓŽ;x͘¨*ÓŸÉ®úÉwÝ`l­ÖÑ)+…‡Ãü‰ê5ò{ªB•2Üî?{7jÞî°4_} ÷Œ*¯òäP­ŒErÑ^~×ÝðÝ„~¤—ɾ¨1rÏOòø«=ëS#ÚdŽ’Õ c2õ½ÚŠ1ŠÌÄq¾brcñãéfŽªÛ7Åg> stream xÚ÷P\ÛÖ ãîœÆÝÝÝ]ƒ{ã4îÜ‚w‡ww‡à®B‚ûãœ+9÷ûÿª÷ª«è=¦¹æ\»¡$UQg5w0J9€\Y™XøâŠj<v&6JJ kW;࿤”Z@gkß?ôâÎ@×w™„‰ë»™¢ çf`e°rñ±ró±°ØXXxÿcèàÌ0q·6(2ä@@JqG/gkK+×÷,ÿyИÑXyy¹þvˆÚ­ÍL@EW+ ý{F3;€ºƒ™5ÐÕëBÐX¹º:ò13{xx0™Ø»098[ Ñ2<¬]­j@ ³;Ðð]€’‰=ðobL” +k—‰Õ,\=Lœ€wµäòîà2:ÞsÔeÊŽ@пŒþeÀøwk¬L¬ÿ ÷oï¿Yƒþv613s°w4yYƒ,Öv@€²”“«§+Àdþ—¡‰‹Ã»¿‰»‰µ‰é»Áß…›¤DU&ïüþÍÎÅÌÙÚÑÕ…ÉÅÚî/†Ì…yo²$È\ÜÁÞruAø«> kg Ù{×½˜ÿ>V[ƒÈç_ÏÖ s‹¿(˜»92k‚¬Ü€²ÿ¶x!ü‘Y]œ,,,ܼ¬ èifÅüWp /GàßÊ¿Åïõûù8:8,Þ)ý¬-€ï_>.&î@€«³ÐÏ矊ÿE¬¬sk3W€)ÐÒ„ð'ú»hñ/ü~òÎÖž=–÷Ác°üõùï“Áûl™;€ì¼þ˜ÿ}¸Ì¢*ÊRR’ôþ¯JLÌÁàÃÈÎ`dãd°²p³¸ßüþ7Êùÿ‡ûßRëׯò'¢,ÈÂÀû/ ï½û ÷ÏͿׅð¿”Þç ù3öú,œ,fïXÿ?ÿß.ÿÿfþ¯(ÿ/cÿë‘r³³û[Kó—úÿGkbomçõoýû»¹¾o„¢Ãû^€þ¯éGà¿–Xhnífÿµ²®&ï›! ²´ûo­]¤¬=æ*Ö®fVÿ ÿœÁ{x;kPÅÁÅú¯kÀÈÊÂòtï»ffû~•¸¼ŸÔß*àû*ýoJI™ƒù_;ÇÆÉ0qv6ñBx?øwÄ ða}_Ns çßs `f9¸¾»Þéù,œþ:O.Î÷QúKô/Ä `ÿƒxÌ’ÿEï£Ä,õ±˜¥ÿ ÷(ò€Yáz©ø_ÄóEåb0«ýAìfõ?ˆÀ¬ñ½gÐü/â}iòñ˜Mÿ ÷ªÍþ‹8Þ£¼_Lö¬ÿê2³ù?à;àá{™ÿuÄ Þ‹´øcð^¤…µ;ðúw‰å?à{F«?ùßë¶òr´z¿UÿX¼Ë¬ÿßÉØþ¾³±û|§cÿ²¾ÿ'ç»+è}Nþ¡gãð'û»³Ãÿ¨ß¹8þQ¿s|€ì€s°þ[êü?}àxïŒãûº:ü£w¬ï\ÿ߉¹ü¾{üñŸ`fW‡¨ß‹wû|çíþø^ºÇÈöîíùø^£×ŸÒÞ]½ÎÿŠý?ëaææüNÄõïëë}wþƒÿ~?ž@3„•%3þ›†Žû:Qƃ)ÁyʃŸi}Vœ;ÝQ`Sik³?m9ߊ¦Žö¡­ïIÒ܈¬’¼øühm‚ oKVmò}6JT›=hGø>ƒ34]ôC´qžQCäÐ÷ÅÉW+Ȳ¼[Ž2ÏÉE¥óÞc@Ú³q°bm"lé@õ°–Kñ¹bŽ1V3F?¨t2ß4g— Æ•‘ŽãÒuáævãËô‰\"=‚ßY,{±î6[Üâ÷F•›Kž..ä ÆÄ,•ØqšÜ‡eŸ²â-ç‰ôEœÎÉûV»cï%µ{ç“߆T”Ó|4x¸ÌX²Ñ1[m2Iö¥¤I09—ër[ž²¿¹[M]”“¬ß”í¸PŒ®,g?wºpñ¦ö©¤æ¤7µTû¹bx61ôȺËE±è€åžUÀüFx\?÷¯øF’}”#³ëlÇ/Ï7A㙨¬2ú”ò¦Að{x2Vý^–ÚÅt“ ½pÙ? ÆW¥Ò1GÉL»¥¦Zt²ôæ¦^¬Nkh¯ŸŒVÃ*±dÚPÕ" —FmÏ+•¡Ç…–^f+šÏ¬îƒð‘Lv'Yø¥Rl;?µéÕ*œ4 f¬njO²é°ù6²¡õEuËeÛu‚5¾ ð6Å%¯y`s'XŠÖŽÏø­–}_!™HÑý²ŒRZé²kyðÃ\I'³¿ñLäYÖ¤4Z‚2;Ïj‚5 †Ñ@Vú“Ù~§÷þB`ÉÄo¶åIüÄÕB? ÊëÑry¿È<•'6ÎV#BöŠ¥I'á–Bàð¢µ?” rëµ®™å½Êný©{"o½Ôx–÷#6%Ú§Š{ô ïK„r:ó¼éEp-^x×÷§ÓS-øÊ yäÝ$ÃÖ–0ž…ðvZÅêžÐ˜°=8û-¨Ø2þ‰£´DÂ$Ôj?esV]õ)¬#b{•`‹IŽº…6Z¢Ï~Š‘Y*%£Ç–l3 v¬–±»R7S'™(?7 ‘ÓµÀšý~Çø|+ÐCÇ&ä´–SÖ©š\ä„ÄÐŽÂÐí" ¤8»ÝdåLúÉ ¾íߊ {¬› AX¾š:}^‚ZĨ*Ñ;k/ Á>ÕtVB wö€ÑUغ[†©…6M¯¶B ýâ˜ë%ñPfÚÝÓÇ1ÃLªàŽÕ£ã¸¯kc;¾EêDQÉ’FÁ$Ëè¾äÞÉ×>9ë{Üäw$¸Q^5dJ!"¶A îƒ%c¥.䌄‰‡Yt~¦d\^kînTêØR…„˜Bu¹h wnzÆÝ¾ð.<ÜO–˜ ýLƒy ô«=åÃ…“œ– íº±ÄAD¿ê]=&2½e! ©sÒP7P€ÑìBÀȺŸ­‚™PœL¾QŒK u¨$ùâ©ÐÖ9çï6JlÜn4;»z„ ŽÅ;Ã4Z!2ßLœI=Ììp>”+KA W°®Ã …QÜ5(»*Ä–¹‚Dû#ï¹­¼æCwqÓ ¿w´g WwI€}r(¬ö­”VTÊ­¸¤²§\Ø#‚”}Iˆ-žöh'd>áâLx4Ï·àa¢èÕ“4Ÿ=7Ø~äèP³Bºþ²q ðªéÁÖ0˜VÕ«ïݺHÑÀ,#z¡ÍQ‹]Þ¯]ZϦ×ùð<Okæ 6¸¤'ZmŸ÷ 7ÎQºî º @­’¹0(a]ˆóƒÒE0îokvM˜þ'C+uzœÎ á~Np—îö6âK•¦Š|–¹;ç½ýá·ðZÊ?°¬§’W+P‰«É}g½ìï9&Æe#Z„JÝz~|D‰í¬ìüëèÒ¢MËåÄ¢ˆJ}ù’?¿ºEÆ:<ÄpÕæâ9úUV½0*k ûCëÌð܆û€=[rÌ] &#ƒª@ÃðBþ–±ÀV8æ×èÏÌù$¦~sÚÅG81«pôUÇñnšðˆt •Ç;|öÉÅüD”.ŸêIŠwGy´³&é©8nm2°÷ñ¾Ý*v°Ök8ºÇJ„¦'` À’Äd®!_{R|þzNoaw½ï™”ˆ—ÈÝ[+¸‹ÇªÎ%DpéŒý¨Hî àØÞb1xCN/œÔÎ/Ù_'Á<í…gà €j3ryãt“¨2|¤ÞÛ‚±:áÜÃö>Þ”B#ÕuÐ`~€ë|˜O^Q•t³ ôì;¦±'ƒC¤1uvÒqÂs7˜ª”!²^Ã-räÎK.¨æ«WZQÅ6ï8[\ÔIýôSÕ–Æ{¦Ïè.@½ydüŽÇ$Yëa„’ÚaÕL“-Ž´ê¬Ô–ÈŠSU8þ*¿‚ö0*Õ’J.Ÿâ‚¤ =paœa{xÍFÝ›jŒõLÊif‚nä”nmT;“..ÞºÂ.ü·º…R fº“.!|-5¤Èð¶9Ô=ÈŽ¨Åç…L~@âºüm0~‰ÃuMC'õoæ›¶‡Pɮ׈[$]—Ps ¼‹¹XÔ¬n¬\´WŸƒˆ_iÞ§ †„ãí<ÿŠó¦j¿G¡¶wET‹“ ±+ÇÏ\~牧ØéÓ¾z$µÚ£`.J _ר«¸‘_²#î^à ÚK¦T¢à¯Ý8"~:Ý/í±!›½yQhÒ1À;ɸe QŠ3ÀôÕç…‡ÓsÔ÷£éÄÛEíëÏD †“ ä]ç#É«•šŽlÆg¦4f°Ç©l´Î=C;TßÞuaKW²»šÜ8L(|ÔÝ]ü‚sfä*—S‰í4œÑ +w›Ÿbë6"æÕ@N_QWÎ*s¦`òÃtL!r™‘ù+øæ`ñ£)I­j,ú²6~ÜÑ*íÀµ:ƒJ?a=æ–‡ï”Á'¢¡AðRU2˜MïcD›Ä ÷z;oï-µ\àfîÝÌÁ9ëõ4«M:ß,ˆþZº€aypš!û3ÀÎ啽c㓔웆Ìv¼ a¨qØm¦{vWêòAÊy&“C/pù°øÈj/E±i§º›­—;gýš„7ÂRé:5þèÝÖXˆª/2ÕRYÛHÏ|s›®»-Õ|ÇŠ\^‡ýò•Þ÷½ä+ß)¢lLÎý­ ^¹o#±­Ä#7‹Kó,Õ(‹{_,ïãõ!z€vº}N:TE›¡A¥å­Ò–ɲ2i1°’Èu(W‰ƒZ9oÍ|4ápãú{E:$°.Ýy-ÛiýJ­ÂÛŠ_FΑO¨ëÆŒ¾1fjPAÙ‹ë»;îÝWp~«Í0Z“EFcrUÿÐÏQ3ë*ò|\ì–Yph¬³µ€3Ò>&ú¶x*pکꉯ‘žøYÄ=ÍPeß±'YzÚÂÅ+”:ÿ\Æ-†/š¾ˆÛ œ½®öÙ›©É‹ÖšW*dpT¹ÕHÞ´›ú‚ha™Ë/ûÚ¹Õ›*\@–±&6¿4/á5Ó€¤p¦(„ ¹Á0ÈaV²Ôë{‚€ï—ˆ} øxT‡õmÒÛTþ‚íù¢#êÉðàÂð㔦¨w§ª?›üBRn‚™\­É&ks¥i$!…º)K…mîÛ–Jÿ~¡™†¶)•Ñä¨VmÑo2¿c ,ãE…#W¶eªœf™¡Ñšq’6Ù…—ã‡2ý»a¡—01‹\êrâÕü´²¹é“žP¯‚ܧáxöÃ7lwÖË‘Žtã~;÷órëþö ÆÎn:É50K+ùAºdã_+ìG……fª]ô¹ÅiÙZ2šý$¦g¢ýËTüÓ.×b‰ä5wA£ø=Ÿ|âÂidrýÎÆ¿”9”’e+œôTÛ!å-dØärPYÊ׳µéÍýÁµ`V¯ÝÆ›0•XAâvÐç‡Uõ¹N¬R½ªy¬PÛƒíÑ©¼ú©?OEú:²ŽH Vh#¿ÆdJAÍ4¾P¶ÔÓ YÈyGNì#f5Q§66ÀA\6#«šØ&ãÃLB:p†ƒ .t0P–Ât[ò¯_t ƒçg-CÍûá5yç™÷|ó¯çµ¦;5Œ0p6¨ð)Œ²ªpBY3ž¼1§¤—¥w<‡‘˜!"ɾ•ÔJÝÝ8@—5 0Ð%ÆÖ~ø~‹ºB¾¬óËa™oË„*ÁF|7h¤v°Øí÷F¾Ó¸¢nÜ­/zuÉ|›íöèa"é›Û ·# ôût•P‰¸ó’Û ójó=<,;§”š¨fuÀˆËDl…UÆk£Xì0ô½Ê¬6uúvÐó‘†äÒº7ʱûAi¢Åm7õ;ò-±ÆÅ \‚`x—!@+ãókELÌ¥a’EÂþÔùÒYÚ£ˆžË’-XÀ‡­\û¥sºrÅ4HGNŸÌ~ÿàÂÛ‡5¿š 6åë+tö$t„ܳüÅJ’/MW¨ËCs©0Â1JacÔÕ)]…¾ÉT«WýlªwÙ*wÈSšŠ{ÉMGFE 85•S…qKEñËGúá¢$^ØØ®íKmp ?•¯{˜" nì}O®þm.Šº:œd!Š‚Ã¥í1ÓKÄÀ¬R.A,•ˆ18Úœzf ï °pü¦)íW]ØÈìt4Nú·T³ì¬€ ëÎ\ÄaÒuxxWçÝÍk¤7MîTÿSd†ñE& :L{ÅœMšxT:+øhfÙ–,FN–©ë“s¸ „YúG§®;×@a=Yk'óùB‹[´Ì¦¦ulÖ¡`z‘Šý`c¿’9½í@+üÙ¼|ò ý³K› =͸duê+}˜bò¹åµCeü“ÏZ2Ý¥D5ÃTc—æé>ÆŠÊPo8A‰ LŠßDãF‚>¼žíOãàãÏËmÈ\&TÓÑpN,\_ÝɤpTx~úb%ÑCzû+u­Ñ ŠD*â ßyX\ÃÞ q>í¼†ÇpmUˆ®fÊÊESÇû0ŠÚ5PXñÿ´'¯Vm!æ$17gÁwc§¯ Y7 ª¸ÑG™^ðeí0à?Dý¶“‡¬A\×6ë×½ÔqzåCwðå)¬²á(ç 2I×ÖЀìxbL†=ã§ÈÄüÚX¼Ëœ^7XG$|Œa¼øŠiÚgúBëÀö¬úјûÊUº›ßvΗ˜šË˜ »¬”‰¯‚£F¹p~‘+­ët¬Q컼å£Îœs—µÉê^_õM5Gõ ϬUº†t{T¸¼ãšÕóædނޭ£·:‹X®=k|4nðæÉ§FÖbVTÇk…nr%{â¿KZ¸ì/sºÎã1õã H¿u×Ýu¼^wÀ«¿aã)ÛUED ˜É*ÔbÎlÐ~·ÚزˆrãÛýDãöa^ Aœ!LM†e¯«,õ÷ÚT_G“©ß²ÅÊ{„»/<ˆòËnέ~ éLJJ—ù-¬Á¯œ™Ì)¤MSa'3º")î¿d3ÁT.ôÚYø"ŸïfìˆQä€Ñ@gc@wWë5Vw r íëׇ€‹¼Fn±qŒ’ý”"/ڔϮVx“¤;±/'\÷@,Ø0c­³bø"@nÑîIùJO¼¥ÀÉ‘—êõtÒ­K—~¥îÒJ?{mSAÙ94²³ô´|ÜïìtðE®.'¨;¡áSjoÐ>ÊØÞìÌYzMñ: ººoê µ 6)·Þí’.U “˜»\H׈ušãûä'"sž•‰žb2×ÏйóA‰?úµ„­Ô8½B„72ÜóZt_E¨›.è{ì½>sî‹ó9æÎa^žÀ9µk{M"°mÃå¿úãQ‰L6)¹òÇä½Þ BNÕ!^ƯÞ8üèíÖ¡¯ZË Š’êt õ`nöV³ x0ðfȵëçeï£jB4ŒCªÄŠ}óz j©ÒGÈor§/t×>Ålûá&Îö)[“‡rãÿåß28#ÉEðžŒÆñ@µ£ô6LMµç¤T݉Õ3r¢„áè„Õb4BOúS—'Éd*z€í—Ïmœ’ÏeÔHÏÞqRöéÕ‘—ëöý>ÓŸ¬2Xt£?Ó ×b¼¸g»*÷àóåÛÎàâeq8à]öª¼ù/ U×±ãß¾ÛhÜxg1n¼ö’ÉŒŠ#µ¸lV».•ä*\Fž¢ßØóÈÎËd6 *¦×Vº ÓšR8éÑÖ9ÌÆs³å"rÞ¶,k3I ‡Çqu|@;R¬}~t;âð·â6±‘~+÷_J +/\̨{1åùîË}Òp|j„™Š1.ú{ø+›‹È¹ówÛ8* ÐÁÂT8¨z¥Ûø +zºÃ\^BÉ"4¤v?€‹e(ƒ¼Š+ù¦‘ƒw«fbþõfrcO[ºFYóM½V+˜·<—:“J*†üRszGD+溳×ê¨D»éZš9¦]19vÛ æCdº{sj$Ê™ÚN™h^#ñÅÛ§V6}1œ–»Ât¤¨h~Ùå‹`‹F÷spÁ)Äv> ¾ à°ŸE´å«ß5T|ÉÝÁé—@G®wU0–´lžÕÕÌ0’ $èŸ=3Âò 6—ï¡$Fò}tñ«÷€Ÿ/A׸:Yö-‘+8òª@ ÜBYãcð´½ëñ×`¹VF)ÉûüÒè©`f1ÿƒWņšÛ¤ìóm&»(2íé »k­Õc@[ì/í·}ìÑFè•mïÔÈ—š”Iøoê[?;ÔlUÌ£Œ¹¼má^ £_Tòž2“Jø±›ª{S‡õ)ÎyÌ)Á?cªÐ¿tA´ç9> 5R|hÌÊ >@·²Ò6B¶aЏ,rzzœu%•§´†&åð‘¤êoÞ”D+ýæ´¸¾­;&'äm5v¨|z-@ø9­Á i‰´+ø‰$ß h}ö\µN™àåžkÜ®ù‰¼¹d¯òY32ÙCý.®oŠ:žêë"jvtçpãâ¬DXÖÁĽ٩d¯4R³‚¦îƒ‘S‚‡ »-må¡_H¹o ôñš¹10Ôšxã¥ô0Øl\m›gyL(-f}Z·º´Ö¸èÖåõ_Ø¿¾>)†¾‰ë1“ê7Ñê„Þ0Bh‰0ü´Ó ê²pw™ Bábü|ˆÒ×Z­éYŽ:’Ä1'&q´ò¨çàl*}8Öѧ6Å‘~ÑÑYÔݲ«ÊXwPaŠÔ©P—v½m¬Ý /ÄUB9ÁŸ %·)ÑŒÛ=¸§¼$NÝ5 ‰£™ux€”ƒ½Ï«Sz<§s^KÐé|9®Ãé oyv¬ƒÝü0ú[^kì[×ÛÍмž´Ó¬ñ3˪¦—¹ÓÆj¼ô2»$9ÞÍ*MÒwqQ;:2¹áÃQwùû@±—ÏýP5’S®Ð0Ée÷_ðß¿dM´¯ø›xkË«…m²\›oOó†ÓEN©DKƒ,]=Å;ÿ°‘›(%0y¥¿»§t+sçêA©¿¦0ë5JÎÞV¹êW™Jæô,™ÁBMêš’jÛ –#cÞdVª„sVpÂ'ñõÌ='|„ÑW¨B ŇøáÙe¬œv`c„³Ím‹s-S“æCy<`PNûéÃ*Æqž·[-/ÁÆæ™–ÿå‚=—ÅnšÄ`Á/èõ^ Ï<8‰“ †¦¸Å´¢"çóŠ¥ gÌ9 ø0È“ opp[MÁÈŸ8:®·z ¿ÆøZé¯Èì7]y¥¤–¹ld®¹v¦¿6ÃøÀL2q•¼Vû…ÌP³)áÙãAŸéÑâbu<ôØq¦KøšÜòæÚìu¹â1êIÒ¸YåìÖæe„o¢ð4#”3ªÕ’ûÖnTº+~Wä¬Ú‘ÒR,q2_£2?y0bÈ®ó—GPHýÕ·ÓC•¯à„È[¶Aã~n‡¯­™‰EaY`Wb™%Ê@T6-äÁQåk{c67B“E¯Š´=-g¼z—žýYª`}Ñ !9Ù·\¼9¯®`%üö{Ld"n9WvC5éÑ[¸ØH?¸±ä˜C/ør¡\¶rÅ,ÑC-Hœ´îuÜ©/†ºÎ½8|„ã‘ÄÂv#,‹ó×ÎÕcÏÒŠEéØ_†0Ûq '^ñpU$Û4#<Ýo'¯°åµšâ[ó°e‘~`§t%µ¼{úÓ±g‚æË:ÔpCÅb¤Ž(íj4¹ó£ì¥ájÚ)òå~…œ)‚ØÐF"üãeΞڙßnŽý8eo°º,E–_¾è åÑýœÏ»°E—ÐH»³B”Û=ò(ìq»Ô^:Û,ÏxYqȬz4÷›‰í¸e_:¶‹»†hå?C­ê‚NrG­9)ûT.?0Xêa(ìQß§‡bâ…eÒ.4Ìõc_¡Ñ ä²KŸU·ÞìíŽ~Ï4'­)ñœ51_ ëÛX¨@“jSü}8-g¹orµ ‰xvJ—¯,sGl†ÉNó}íIAP—Úå»ÏN0Ú䫵ž´¦/u+Vikþ7eR%5Žâ»k6©ß &~€n¤Ф!°rP3v¡eÍÎÁíKË&©qÆø™TÅpŠ>ô"ÁVxú†zΛŠ[[ü¯W{ +@V uÏ cЂÅ‘Y Üc[Öš3‹ÑLRâ^#vü°3C ÛkNT}`vw¶Zú åÑ5ë¦ÛpämŸê”…ÂXbINl&~'(P04”rMCZ“.»iPâR §½ð.½iXÆŠâbÔ_î@Jo:Az|qJ4˜~AȸÉsX:ýQ[9‘­/ÿ«ËHQmF4“YùÄ-ÿ«mpDeªà°b'Áåæ _R_î1FÄh„TŒmHŽpÞ%dR*ÉIœ¹ëæµ²2#4çï¦ò˜‘ßÜSÙG.µ¿„³wk/U_ÖLØÖk W0P‘zÿ’½+\h@#ºòÆJ“'±Ô·NFçÔo9½d£Y£®óO „ÕÁ¶Â m@Âáa¯øx>-aUó>»<×]ž`y¥5]Æ"Œ“f0 Ö×u-›Ì]~Ì ½ìêi'›KZÀºðRÔtgÞõCb_à›Û·ß öÇà}¨Ü¼š,ûD[ÀûK8µ ÜœT¹³“HÓRgµ¼^<÷;®ô¯ƒ{zΧ*³XL-»ük×!g14&þå¢j“Ú¬]ŒQÃòß•Ä5ïÿ?•Îr%?ª8¼þŽôÎ mÐ4'H®»âèŸÆdÊ€ùüQ'é\B§ £GpíDªañËMKÄ{%»A@Í™t’^©åðËpEnă‚\œIàÆáW‹Ë[¤6=ÓœiþÑ0ÔÚ¶U†9ü¤OCšï”0׋Žá4¹d8,ü“V\hžÏ:ô™íÛÒ…]ršQ⮩J~z‡Ý…¦ÙO¯S¢ò«;pC¡Ã}…B¥POÑ$èìzÍBôI)E^»4AU -à8ˆhƒ¯ˆ]çÛ¨º|´œO²‰éÑ©;ò=uv¹•#a.7;#R© µG¤¼IܧÞÝ‘².o\ýí÷Ž+DS1Æ•ÆÊKîÐ4rÉÝ2ku-“Ò±¨Fµn¯CÖ(ãá˜Ìp‹Û}¤e“!_jÑ©]+Ѧl¿®ôƒ¯!­ÍòŸ9¢„íÒ:R©¿äð“>Y±CŽÅn÷VI¸ãS˜ÍRù"— ªÀÊzço]§1<œú¦¿Ê!`, ô‡g[ËgXÅ äòî€pÚœ›ÝŠžø+µ4g7b>¯Oèsêv†$ŽÊ©ZfîÊZÊû %^Є¢lŒ¨KðJæJ„Žv]ƒË öÑB:üeÉlÂÏc:?zÃ2Ì=¯»ýªQ|Š$loãB¯—ÿ>U,èSS}áµ<Á³©‰†@Œ|@Ñå¾fû,8wÙo™¼Ç…µÝއt8Ÿ¾¡ ß,yœDðþç›ì£ª?ý*† ¥²ž±{×HÖöeÒ¾ÁX(£ÁñÉ—§ÉuÀÒ;õ]υׄ;’oøªbïkl^*Ÿµ„ht§ò¦T¸+Áä3KµÖÏ:ѺNÓª?ŸÅQ‡=¹Mg˜Š°çèËäÕé] Mpõ Ô)ÂÓ¶íW¬ö øìÔøÝ‚àE’KIÝAQˆ'Œ~¸"þI~‹Ø–¶–gB<ñÃ*c™Ùø„»Çà¼åG¸N-ÇÜ[6îÎ}µªü+v–¤`žè†KƒƒÑ]<ù½}½mÏ,÷†â”\=jt ìÚÉ0ªÑ+ë^”P°s4YÎÕjüíš)V¼ ¬"X~H­ìÁív·K ØU¸–¾sÀè—mïN°þMñ:<]l–=Î>3GÉúòðñc¿_I9+³t€ON(ðê{?枈8½ªBØ™V·ìŒð»‡Æ»KÐÆ„òOMœ«½[`nüÖш‰™Á¼}Äãåÿ:¡ï1ҙ˱ãJm.çÌ÷³7Jé‚CïL˜îÆÜè§w:_òãgb9„îàTÖVú®~•®ˆyxE-†_°alpaÞÈÙJ©ck*º!’¶Ót^Òi£œñz$;1±®å% J& Qý¹’_Ò9 ´s훘‘__là :€ÀÏ \š /ƒ¢›Ô•ý_Ó•šÐ(;ÒÀ\ÓÆîNò–²zr鯯ÐgoSQÛp'à+¨êU÷ ýûŸyÇh‹íxAêés(>Þ2wÑ£06{íЩV?ßæ<£h}¶I}I¦òJ¹]0Él¿„~ »ý¸¾ãëøHö˜™‡šo–A•R&ÊÞ fßÓ92ÏÐϰ²aïÊôBemÆH3DEñ<ª-Óé(%©Á±qÚìk‰`°g|LˆeIt뿎o6ß@ùÚLU%šŠ²{Í ˆ–Wña[I­îÂT¢Ý;~®²ÚóÊk©¼ùBû[ù÷øéYSF)Ò9·:2~çY‘ðÝ€å†m›‡l$QÊFY#Ǻ~i~x"äÉÆ´©éЯàë×|‹z‰¨Q¬]‰+0 IÀK„ۼ׈:ù(,&ÍÁ3qº§ígX±D=)äÛ}b†’Cч<ßU ×ß-ù£]¹ó5…žkˆîϪD8øDÛéöÊpÍaɰ—o­R£ßÈAú*Î…ádDî?¹CÖ¹ZŸRh½Üí2.cVEÖ p¼W×}ˆX¤s© ™}ˆx‡&œ}Vðd%w¾×z&xÚšª‡ª¾ `›|øF¹jýýÅÆ\áÙ%iÓ²¦”Ø+ÁW[B/˜62Ò2\BgŽK8²êmïQ&ë¬ÚO쎻JafŒX4öÆM‡Õ.Šé…\ëè.~è;žcd{ÚïyªÜ¡;?y&u¥|Î(?u/ðº¯È¬ÇÐ,–Õ«ÁM:2¡îGMÛú½E …r(AÒÑŸdt¤%hÀ Y6”e*I ¶ò &1?R!`ë4ÂkޝÙ.sî|9r¯ÎSΈòšVîóˆÌHÄÏ@›Ëi¢+u uõ/«È—q}æ~Ô&ªæÂ8n=Ëô}Âþ€–Åaá‰-¿XAdÎ6?ãTÔ© ‹Ê¥ Ÿäц#°ø¢9“sF‰\É,øák¡#C†!£äG% ;lÊm¾ /Ƽ]j§€öÖÅ’,šÓütnµUáÄ~Ïä=Wó!1vÙÒ›Ð~{K\êÇ6-®QÕª'ã¦UF>ƒ\xù¹BPÝK•Iò©Ë—ÉTËO'Ãø•¿Šup-MB‡gª°‹öé#OË£ 2h{tB+²uéæü&‹Ÿ²¾ªh––Ó×ãaV[îemOÍd˜Î.*À ÊUf[þüÓ¯þ‚)iø?m?ÕÞ®ÛrED-ì2½~Y,Äüð•óµˆ.R&n¯Œ¯¾¡äÇãï)•û(îITbñ¼'GPU[³Ä6œ¬çïšáoë$77þmXòÃI~L‘ÃNAtžçµët#¹j‰óÙçL»m¢®Ô(Ý ,AˆØ‹)òïp߯SÆ/ÌB­¤ÑºEñúj)ìöPûŸ}7úñådr©ØÕÅ“–Ã'&ÒM—·tÛ—iX©¦zb7P>w°ŽtšÐô,l<ãGvå‹{Ã…¿‚°î«•>Jïý|c"ýê \Ór2xÒ‹œ5èw;µ}Q?o<³ÅQ²I¦µ: MаÝí·­+ ¿EÖmªäR;1ž"ŠlÚâÍ|•RǪRHç«Ä€Óò)Ò}’\2''$Û×6ž‡ÁGP=Õr\ ¦y­BOÿ”ñ̯®Ô¥K~À`9˜ô$ŠÍë.Èr«G§ U5† —T[«F×Ó9š{ˆ€Þ!E2M˜c¤Þ49¬½·À]¦|»õhüÆÕ"×êšÕ;qý”d瘹O:[mÛ8AÿʉJBpm`êÊwpERMæÇÚ/¸=¾3G!£^ïs)ô7·cæ®P$T=Í07 §Ä`Wå–ÓWÏ8ˆSª.ä>ÅZ/·ÍDo–m¼b—Ý.¹¤ø5²$“Ždð·ÀZÃUÌV"DõkÔ””MRÃåš}{Mý2ÄOEû€‡òh0&5î`ûK|zúÞßÕ[+ðìs [ŠœÕä’³ èO%³¯úªê²qò¨(A®dS”öai-=Sºª¿¹;]˜±ª#/êÚr,¾I+ã‡ZÕmÝÜ#N@•P?‡ñd´,b\ å”Uâò~vÛ—4|»f8övM+ Úô0==ò@0C~Ê'ŸòUÍÊà~϶¹f’>FˆÎ^¦©ö€p®K% (à(»«s3FrJDx7¿¤”¼#y¥côÙø‘ã+0Ø]Þîs61Úì¥ ngÁ…óŽýrƒÅ,éŸX›Ë¼„¢X•²—r…,Kúm?]=£c%øÙ Ó¿K#íú×ËE ïà¦U‹kÎ!…8e‚(ç,ºs¤ÿ¾ì·ï¶ î(±³†ùâ'dŠrm6ú“Št›•ô}Œj§ÙÌ,ŠÀãËdÂWÙ¨ž›Hß-ãòà~ Ä!2V;ת×ü–£Ø"HÒŠe\qÿúcütõkQDR³øÅšªÚÓþ)®åϡξZÅŒkäè˜wCßšFç´C°+-¦^ÈñªÛ×›¬óãÕfv¡ä'’›ïÑ)‡Ÿ2î²4R§Ž`c×ßIˆð£Jú¾¾ÿ2ðƒ§ãþJ•l?á vŸ±˜ŒÿóUä»1 #Žh†Sϯw&Ÿ-aƒg)ºš·1›Ã†‰Ã¹êÏ쓢δh ÂèòU´tñçsãß~UsMé§·¦± s¹'ó  k1’;Û•$áe;*„N 7;ÞO;ºU×}$êð¦V‚¶…h(yJ&ñ­A>¬H¯Õ.£ÿ0S¸ '†‰xÊï ]¶î+W–й •q˜RG¤V Ñ« g°ŸÍ 㙑ìZm¸,Ê r€ìØ]â@÷³0P ÀS ú{\é}&õo5pÄHžàð˜~‚n#p‰cdsÆ>3²«3”Ø¥ˆŸiq°R•`Â=Æ“êZÚGË£uiŽy{#+!'ª–ãoòÞbEé‘Z^°§¯zßr°A}á ÖGäûá¼ÒÝ—»Ðõ÷tuÄ…ÝYGŒ#ŠÅ IgöÃ~±_K¹:3-oÜý„Š-2$ÄdJP­­½,ˆ ‡ø»UôÙ«)ј§mÓÍ,°¸u^èt>`­P’êÛ„›`¥œ÷U8…5@$æ¥ìëù(e¤ø›É;vG•aØ–"•!Mmý<©ØG$—ƒC.%Õ U/†?-6Á'-ýuìD1ôò[ÄÙ%Sæ³Mh]ªO:RþÑl™s/»R¤÷Ì 8ëqí øšáB§1¡aÂõm…ÕlÒõýe¦Wëi2–@ Ovƒ8*Ä$äMH.js-PuíËìDåå'oæšQD1£—··MPçˆAÆmŽûU.å8fk"øLÜ FþÖŒØLâ˜qCX•lx2bGô¬Ô8ew`_‡ ¯gáØºøòOò`óŒä/G±0d·xÄæadk[ž„zF8je+T[|<±K2ë³R4/©Q,‚ä¶v®W»\áô0|4JÔíÿ¢Àø¬þëÑ“âP~m,ŽÏz-j¼q½ä¥®ÖòÒs³š÷¥_N}l¡¼ÉŽˆä{±›ç"^k>Q¨~ðà –UxˆŠc3…R»>ôµe±ÔÇÌ Ç&æÞ6w­^þßšÉi š-ò)‚ÆþvàÊ—£/±i‡}äAù¡|–¥aéÓ¶ÞÝûNˆ#õÁ!m²ž;ç·à!o=avâgm‹HíâÆ÷žœ)º쓼ŒóKÁÜÓmx†"Ùî¨&ŸhEy]ì» £¬…?^Ó«ú¹BKcŽsxT ÙhÀQ+ˆXˆ5O …žEî6¤¬»\g‡¹!ª®œäɲ |ß’ òÓIeU¥Bº#Köq&°A¯fü©ßÔΟ̯€[õ|^WÊä@µâìüè¨Þ(~&j7sû@|tÞ[`¶ÌOtçÏ1bæÒVfõ-ÜĉÓmˆôÚéâ23·ÛùdzD2š—Àsý<Êì¦0A|ø×³ÚågtÚm§オò|Cò7ÍhÞV ó°v{º²­r±á5·ôAäÌ‘¿”XRžýò“l­ý<ߪ˜WúíÇX……¼ ©Þª³:m,3@8jÕ á"RäÑZ€Åc*ndP[J·>Æá°½ ÈŠ"I]ç{œG.Ô‹Á)jÉNñ9wÊ9I l›Æ¶kŽOŠï=í±k&ÖˆŠwú†MÊ“Êvϧ»Hßp:èÜ'á§·|_W" æä¾B‘zA'¿r³¨Ön-~0tV(mßvD¤¯/"šµ;?Ãÿ¼ð½š÷Á3CÇ¿ í1ÁŒNýP8>É*oºêù³¹ŠG›“_ƒ ’`0á ‰øïØ'NÖG¦Ýo«Ë†Cç•áxyǦ;Ì.'ß…ßD!a.,ÛÍ´ faÀ’À6Íî¼jò×ê2hZé)…–~ðûqª÷Þ)²[Fö¯Ÿ>d}O8ZqËöþvnsdBÍ1hjD«Löí Äo¤³ü»½/Ú@$Ș`’«˜L›Ä–F–EoÇ ^;ú5y¬Æ›ù„ï7<Ô&˜úùÈ)ãÑWõÆQ¿3Š•‡Mz,€´íjÁ(8j‰&`F /ÃÃÔ—'“ú\fQbÉ.…׈²œMZUÔ~ä˜gn uÊY¡½×}—tW—4Ï7L“Ø­_)DÔÍI5}>ùX`i _Èòâ÷V…jNÎŽf̔Ĭé(‚%'p¸„’ûe] Y{J`|rI"ö‰+q÷K#jÇ8CÒ³æÈzG@Êš{ u7ŸKÝ!l•ƒ+x9x; ÎÉÝ­ø¸ä¬há8‘äeñÕ…lÈd5o!p“ ¢b%2OW¸Ï¸©A2ЗóÒˆN"`aµËÌ`ѹϺÀ? IŽ¿Ò]Ø©=!Ÿ Ò@©´ØÆ\†•¶çàZˆâ÷ÔVyš“ìñà3[q5‹’<­ïBTkv—4yUÁÖ>lrQwóÐê1­ ?R,Öax8yÞ &D._„ÍP?ÀV¾"Í•h($¦ûˆs¾ìس|ú>uÝEÕ¼=íÑØYj¡{H$Ý|ªþ"Èׯ—£S±Ã•Æ9/…nàQXääc{ ËÕ»žðKzm‹ùñÓÒ×X-p¬á˜O÷±ŒÏ)¹¯ød&6M–K;Ðrþý/[Býþܘխð+ZÔª¶¨©[0€ÞLߨôhkx ˆ7{™ùG ?2rç*Ù¨­Ä¿SzÄ WZè¾%éýåήF*³`VÃÂÜiàãˆk/¥Écaþ­c7©;ö¡&w¡T“Ci¸ÂËÕ§ ãŽ›I téÌ”R5)xEÿAÙh\=HG„—nZR86TSÅ y^dpxÁÁàQï…å"5Ú©ÃsöpÑ0RX"þ¶ÒwÑ߇#G´náíYµ¯j"¯«è›lìWöéå\×¢Î)4Aù6D7F¢£êM÷ñ€fßÏê5’ ¿ž…°œÃQÏijÞÊ‘_O_‚±VX›aÐèãU¢9‚vÏ6ùå c…$>Ù·ùøYÜ ß’MA‹’¤C&np!åÕöõ¶lжrØæwû÷!½9-b!%w¬ æò-÷ÓäôÏ»qô‹¯ÈµÕÅÍ dõã§»Ê+ÕôMŸR†ñYì·Ê†Ë ®²”ù®áœ&ê=ú‡¶ª(å{¾òamŒ“°n¥ ÑBm/UÊX÷`Þ×W\øÄ,ßF®¸÷Ç!>ØÕ¯ƒEO¤Ógù†¾`ƒ˜¸Ís¦-»·>‘#JÊ"¬ø°=œ"OíÌ××ûN °!8Grî_êÖÊÛèÝÕ¿Lê…dzœGÎx4-ç¾V·Çud˜Ïݦ¼ºÄR=&ë€Õ¤»›§·¢Ö›=Tô½¢'”;‹H5·²ßh1I*“á™ÅfªzuÃæOyB¸BÛ«?Ñþ‚_ÆÅüAÆé(½Ë U8´±ý¤ÅC„"¬Nͤìö3U9, Q*âšrÊæ6(¿Ç"4fT¾ç ¤YMÜäWþx÷s-/^–=fì&¸C´óXŒŸÕI 7+Ã+Y—BÀt’o”„R5 ½Õ©žÃ»<1 C\mTT°Ç·þú)+oœ¢yŒ°àª+/”ðjÂ~|IEä× ÂMì\gÒx¢l«%Zmo©γn­¶NYJyáW,óšÏ„gæ‡*vƒ3 êƒ%~_¨ôµãSgJÅÁƒ. `gˆ¶}à=x¡ ò¶¬µ|z²=ÎD‡äYÛÃ=Ž6¨629¿B¯rõ|ÊLN,ôf¤Ê¤žúš½¼2º3Üìí­ŽÞŽHcF˜E5ŸHÜ$“RçK†:–…B85cKž­ÀEºg#²@qû²=Dô´Ü~Ä•ð$l3L£Š<>ƒ6;õà͵#OiV^ GL„¢×.ÉO5¥¢H]Þã¼ _à´ƒëŸn&q½µ²NQ]¹!ÅfìÕ $¨@vv8ЦšðàûÍ W¢¨ˆØß2M˜ð¡‡ºóF?X¦]RÄ댰Æ/­ùäSŠ‚ÏTÿ:r:= 9H•ZpJœž‚•ZJeöÁaT.õá;Ý+wkë4ŸV™«0ö¨¹c¡ðüÈQ¼¦[Œóâà«a犓ÀÌ6Ž?yœßGìv³‰v+å~n­°kš¼}‹˜YCÏÚ'q¸¨´_[Mv}a_ö5">àl…ɸ~½BBЃ¡¢Ø“ï& í¶Ÿ¦<·ƒÃ…'y-†kDñÖyq‚¾÷À´4Ê"ƒåPñ‡„`]Ho)(˜-{HÝ"©a:í7’^n_ñ¯ßâÚp·„É9cVG LÛ’šòÜ™tâòBÑ't/[gvŠu :^uü?Ã=î˜ endstream endobj 128 0 obj << /Length1 2099 /Length2 15234 /Length3 0 /Length 16507 /Filter /FlateDecode >> stream xÚõPÛÒŠâîî,4¸»»»»/`áîîn <¸[pww.ÁÝ‚„@€ËÞG²Ïÿ^Õ½E|£}ôìn¨ÈTÔE-Í€RŽnŒ¬L,|qE5^ ; •ÈÍø/)•ÐÅäèÀ÷½¸ ÐÔí]&aêön¦èès·°²X¹øX¹ùXXl,,¼ÿ1ttáH˜z€,ŠL9G +•¸£“· ÈÊÚí=Ë>4æ´V^^n†¿Ý¢ö@¹©@ÑÔÍhÿžÑÜÔ îhºyÿOk77'>ffOOO&S{W&G+!Z€'ÈÍ tºx-Ñ(™Úÿ&Æ„@а¹þK¬îhéæiê¼ ì@æ@×ww   à=7@]V ìtø—±Â¿ ÿn €•‰õ¿áþíýW ÃßÎ¦ææŽöN¦Þ +€%ÈP–R`rórc˜:Xüehjçêøîoêa ²35{7ø»pS€”¨*Àôß¿Ù¹š»€œÜ\™\Av1dþ+Ì{“%,Äíín®Õ'rš¿wÝ›ùïgµupôtðý×·%ÈÁÂò/ îNÌš gw ¬Ä¿-ÞEdV@7' 7/è z™[3ÿ\ÃÛ ø·’õ/ñ{ýþ¾NŽNËw @%ðý‚¯«©àæâô÷ý§â++Àdî0ZþD-ÿ…ß_ÞäÐgyžлŸò €Yåb0«ýAf?è=»öï;2ý/bÏ`jïô>„Ý–ÿÚ¼KÍþ ÷¼æÿEï±ß”ýŸu›ù3+Û{ Ðèú~«þ±˜ÿ€ï[þ¾wÁêð=‰õŸ”ï­µöv²~?¨,Þe À÷¾Ùü¾—`ûøÎÇîðýÈú^þ?"¿ßfÇÀ÷Bþ”ònëô~ø쀖n¤¬ÿ–þkCÿ+~/ê½µ Ç?Íáxçédçþ¾°¾Suù|çõGËù®t}¿hÔï!ÿ$xŸef7ÏûÎÛýð·Ç?à;oϼÓ{ÕÞÿ€ïD}þúîêtùWìÿYsw—w¦n²÷-úþû?è4GX]r4ç³ië|¬%ôd<˜\ :ÐΠeô]uérBM¥­ÍÙvyMëGÛØ“¤¹Y#}ñ=kk„lÿ¨Úñì÷Û8Ymî aegx¦èLôë1<£†È¡ß‹³ŸV°-dxU¾³;ŠJæ£ç ´×סŠõɈ¥ÕÃZ.yÄßóŒñšqÁ¥‹T_Ìr¾á‘ø1ÃÑa\{¡.Þ?,`äͼ‘Ê%Ó#øŸÇ³ûê}gKøõÍg³JƒÍµŸ_òcrŽÚWì8MwÙ·¬xcxÅ«M ˜4™!}ƒé˜-«¤ëÐ2Pï1¹ÚͺŸŸ û@8Œ¹ÿ±¾¼ËØ…\»¶Ã8Ó­žÝH|Üm)¶Ùù Õgi“N´Æ;ÿõ ð›ìc=rn´çÔ¦_/û—¼"9Ï«©¢‹ä Yy›gK|í߸/²çL¶â“ÚÆ›œõñ¥VëÚz÷éÚÊ¿6 ÉäɽFFV¢ç\ÜÏå‹ã„¥¦Ö¸Î~Éåà:Gƒ A݈ÎY¢|`ëN6KÞO!R¯†ñÁÉbn³Ý>4íÚëV©&·¹éNÙÀsûF®ït˜|`ŒjŒ{qS€)r¢ {±Šõ@6Ööì:‹>Mê°± ÅÅ£$g£÷M^òÂC¥¤k<÷+~Þˆ°¥Íi©“x:CbŸù£™Ö…I#á9ñëúä#sÒ@ê\LJU!7¤û'u¶·;ŽÍéàs¤€¨Co·‡ y òñK2½œ™pa¦Óæ‘‘âËÉ{ û¦±»C™»ìü IMý0=©†rÕ;oZ“­9ÜG+ ¾”lz±‹&ã°\Àa¬×½ÕG„¼Îe5r¢oßj`Õן3S‘ùO(_n2”EŸ+ … ²&`h°¢¡vË2á|¨ò ¾È+Éýþh2XY4¦ÍÕZ0˜' ¯BˆÆ¥t—EÃmÒѹñÑý›B¡ú¥ŽÈ:Рë—ìz623yZ/b ‚+?¥]Èèäò áËÒ³Å1úÿåµ ŽçGìÃõ %jêFùÅ8 *MŸM#¥îOê`iºrðP(PÚzËÃÂ6±ªÖ{Â*VÄhæd‰¨aEúÑó÷¦öIý£w2ø|¼EÁ([íù¡B¢?Œû—,”bÚœ¾ ¶ í¹¾ÓF­†v| É6š6™?¹_·1‚ó6»û§“›d½¡gœš])‰,ŽˆG—•T™gx«ˆòPæM®úMÂ>Ûó¯q¸'™šãAy¹T“õlÂ)ˆ!‰÷v&¹“£D¢ãÉKœ&¨ 9¦Íušÿò°Õ°ë‰ÆÏÞ1${Þü¼¼.ÔÒ¶µ÷:B¿Òfö©p!ÜFPˆˆµ>ð“¬=ï™É³õÍ/èØêºÙªŽ@ôƒÑøåžc$é!ÀK}–0ß9ÓÍa!àDÉbø‹avÏ£f gme…àeß<Ô7ÆrÂÍER.Ôä<(« jÕ½:=Yý&íTáfÊÇL{²}•!ðé³ ÁÐÛéx”t×òÃýûÝÁ¾5œ¶úɲ`l¥cw=½fáT5'Õ‹…Ö5Á„ã6ügæw†@š¦©püƒøg4³MüpÓ8z‰É Å—U#~ê5w+­ïe›…‚®ytµE\ §à¡µ¹D0·–ÏÛŸÓ:óûìǾãªxÊyÀϨ9=ÔÝÐD\lù¿DÅk¢žšZêvù¶¦vR¾¤›9}—\¥¿ÀbA¯5·ÐyÏ©ÌRÀ´4–¿“o¾¸\yIc·‹÷¿ì÷&_³¯é%3¦X+õ2›ÿéÄ©¤ÿJ§æíšþ‰òŒÏŒùâ«@÷³è¸ü¦¯eÙêv@wÍéOø_p;BÙ´}å4+à“HxXªCðѽF\ÄmÒb3Í´âx–ÙÃvѽV­‚³…'`q/_«ŠÛFœ(0%óÃÏšÛÓ©@ ×Ô. "¸~*j_®rYrw!M;¤ù‡,ÿ«Ü“¼Ý‘½ŠÂSØe÷S¸cè/Þ¹¨2FF!¹YIÂAäñ<¢õà qÝ[ò¯ÖÆuÚ‹·Sý4Úå§ LðVŽ8˜ðA ÕqÌ¥`$\”%n"ˆÅ'!täÚ.˜=¬°]c`ˆJ¾ «|ôuB/Å·ôSii÷­|š °´gÖ?&J7ÝÖV ŠmX‘TskÙý?§’nh `©»3âAÑ]c˜ø24Òh5Ïvå“n—0¬y4ö „‘’Ñ/.é–ÜÑ\ë8D‚ú©jC?•êŽÜ* Jx·±›(àºÃİ,·Mü^ë¸9ª5_áã Óï~»¤¦éGœ¤Ñebƽ×ëÑò‹¥ç ñ稀mBxÞ>iCú^çÝÙ†¹>Ïþ‹šves…\YÓ)ÓoÌþ빆÷òÏÌU?‰¯[ðÍÀ6a¿l$Ánánñ|óŸ¿<}ƒªüYÔå\Ôꮓ7·êÂl£0sÓÇ(Z·U-,6é<}_÷¨Õ5DsbzFQÉãý]‹@€C†V“x@ö)…§Ù¶q"qpJíùÞÿnÚ†^&k2°XŸP?@úÉ&6Éí—Ïiü9ƒ0¯!8…å×#“bœÃªG²\ÆÅhṲ́º¢¿ÖÏo8%J¿+î&M«ºž—åvQ!‚Am—ܪŠì@6¿ ÿÂðPa1 ÞêtÀ ørÉrŸÐÀñáp~³Wºµ×¬ãÄ[Y¥cíXÙ•I0á²Ð೨Ç:»ªs¹7} g jó¬PŠ®dg‚˜X4ë“©¢‡`P:4F9 gõÃè wm¨YgaÒÛÙáa«tÝýHŒJ³=ry-ÌMf-¤¿â.óCV®šˆaLF-îm{‘•½ãŒØ³ñó”BŒ%[úPŸËUьּ¸ïÙCº„ ÙÂDg;³ø`ÍÆ‹œkøWs_ì"~ ôxŒjEEÆì'¾4–í c<šºâ´ÆZX€Ê§ÔE[;»Pÿ,½  pU À,®a¥kÙˆSòʦ¢Þ!ª°Ðbú’l3œ`[äC€´é9ØFŸ0Š€Â ëIÀùÙ©cWÈ/DI½Z«üíE Düœ©¤¬€$ó´ª338ð¼Y+ñy³¤ÆÞs¾T:”» GM7éD†š×*: ¶@è×*ë$ˆdL»6}@Vx8=lèëh aDêµ.¿÷Bˆ•#ίÕÒöúç›h,ÐQ«aqµö³jM¿·q¾|>ë°±¶Œ¯‰WðZ¢×m‚±Uƒ•Ál‹[ô%iV}Bl§ý Uè§ËE/s »ÈÇó*tÿÚÙ<­XéþðWéë÷¯¯à¹D²¢@éŸÈ‚tÄ! çP¦yÊâÎã …¿ý¬ˆx¦¦±§Ò|”æ=n¬»ì3g2ã–„^ ‡ð¯î®ÆRÿA#YômJ.`V"EÍ,Ü ÞÄÌ!°‰î:ª.õ+|‹4úqº£mCV 76YŠzèébÉô붉#’0,ﯚèRkß#©x[^1tÖšŸgÕÞŽ4ªxÒÉ”,Ÿ—ë Ù«)N!”åJxüv.Éã®f.Û¾ (78ZÑ vxïŠo[]|ê€áðW!"¢R;ÚuⱤŒÿüЋÜB¨+ô4­Õ¡äx<²vg7¼‰g“+Èïu÷:X}—5ÞÏŽz@ ³J&}ëÖбb)gˆNw?Îæ»A raçaN³ÈÖÕeµÐüµüiÒúDóÕÿnÏ¥µÒˆQÑ–>fzÌlï«S€Ýz²''JO=¯)šF\¢ÈmQå F>Y7š±Å^øo Üx¦ÈÜo‚|’ÑW<‘dÕõoB#Îm2¡î®5ËØùûG.’’S&rÕ•Üh’„PÉ+PÆ”QßÚM0DÓcÑ½ÌÆ®$‘ïæ3³”iä6[ïÜÆ`¥SÃF¬MÍÍA·gàžê¼3͆™4Â-]ÐgSU×`ÜSë˜߬(² ÀÓZwªÆ–Ïu×à‰Ä™Œ#­ ŸFüÈ!ì,´Kv~ÀõA\m©/‰ĀæÖEZ«^j¼Éš}*´´•5Õ8tïË#Bä·ž…°»QÕhW37¨¹ÎAJ!ïKÁ3Æ]¿£˜*‰Ò ±Ê×öI’– fæþý̓h«9û¥_PÂꃸR¿” Ñ$û¸†¶Î5·b4?žZ®n,wJ¢ Îz½TÛw tG¬-Ž€.•(R3=#Z~ÜvÀû&ø±[뱺Íö’r>rüý¾dÙí”xê{ ×¹­ã—ènœàœÎ kñý˜~ãæÕ2Šj†½Ô7oñ‘Zk©@6¤ZrwãÓp‹#DFûÙK?»pk““z¯÷•Ø€BÅ´Ô* ò7%ç4¥5lè ÿ©}¦W9­ß硵'Kx:]©‰TLÌ^WÆPRº£î!A†O”Ð>g(¶af¶×DÂQr’>,Û:ÆVêä[›=’Ý‹§,7I~7fè¦#©ã\šðf£¥¯}-r…€Evz{4/[–˜ ^¼3¬ýõyЃ“ù&6"-ŒÓÀCÞHXæ6Ï+ù¨ŽG;Š1?$¶ïÅçhºsny W+AnL(ðJƒÌ}ÿ–¥”¦ð¡jÁ˜õ¹Gr§†‹ÒÛI*¦õÇ Ðw´kƒíâ^ J´óCWZ‡Ð‰[Ÿî¿^‘(³l’?×}ɼ‹^À¤•_£Žzf¾Nxßû(‘³ MþBoª{%KN¯]®ÙíÉ!Ý¿™F3½³“ûu¥ïžÂB@» ÔèdÁùhíüŒâ…ËØæ‰T5Y»azw}'ã²ñ†Y±VFjšõƒ. K ‹Þ⸗Á35dW«Ô>¿11 óVtîu‘öâÑOvß;»8°%“P¡ éM”*>“ÅÁÙ,À.AhˆZB+H,½X¡çO+: ðþi%G}f»ã¾têøjµ¢ ½I ©OªFŒë ‰Á¿H[„û¤!¥»<ÚÇâ΀ˆ««‘¾5‘pžð“x€ÌŽË r†æ1IMŽš#z¾ô`:ÒG‚æ'Pû>é$U²UsÑFc&£Ä{qZ„! 6}Ïæ<¦˜˜K%‡ãô“pû+F'h2±_aÙ‹÷Œ•Ñ&Ì×ËHEî~ùjq^gÓJŽèBF'í§Y?:¦ªøÖZÏX¹ì HK•"÷Tް ¿b œÍ™kE^'XÕ²||þ÷„"Z™@ýSÆïT•V‹ÙAëC4¹¢®DèWntMD×QŽ0² €° “7g9°*ê=㮢˜¹=!âyã ®•àk±P¦ï•Pe5vŠ´ú:, 9Lý]|-YÑóµ’1”åà 6ߊßä1Þ¾ 8™ä·'$FÏ’¨ˆBscÍi&a§¿¥ÝŠÖ‘ms"$wà~C“¨¶Qö}6}(r@ñù2›?TSªnöb»©|¥ƒËÜmæ¶w‚¤÷+Œªý‰?­½5|fã f{¨™Õåû&¸C )m¶jîU`4úJcOï×éî3OæO¾§·EÉ¿¿×cGɲóÏp$Xíܹ2ÔÏDãåô}î[¿°PuE:ì´">7V§õŽO©+ ¿ò]!¼&•(Æ’g‡b$òÁü žtÅlFFTŽ"c©« :ðâz´„Ër±Îd™™ÀæpoîÈ[cµÉYë2FÑúàwf_˹;q0ï(wç4(w#ÞØâèî‹xAŒQôªÂê³£Ö@¶í+ »¶ÕvNŽ;€bX~Ýò„›Ú;¢¬Øe¶‘Å¢²}o¼~M&*ÕÍÂÈÄ ép…õO¯“ŒÇQ¨•žQ§£Qâ‰æ¤^gÈÂó¼lšÏäìZä"WôqKÈ5\•£5Tø˜ ãG'ëV›'nt¤J&Û…QŠ‹£ª•’]wý9æ N¯á7†y ÛÚ·$M´ˆ¢oüÓpbqé=(Rf7RßjS“yîq¡tòšÒe‰S DFq÷Étý!YaŽL'iOê—;«P‰º²îçÞx:®Õ˜ˆ$“¬¹Ä½=·³‰|EÒÐ5µGÎàewJ”rVÐO ®û¾bκã†6ø©M–¯ºbk.g 1a÷?@Ýx·œ Nêq0•}â_òùB yy½€æ0†j ¾>âõ‘íÂÞÊíêKL‡ôß5(L~ËÑ5†Ð•Õ(»L-ó!²26tJ›¢‘Ké˜u²e )KÑ öˆU°F4huÁhLC´ÞäHÀŠë;ôRæ¾LÆ?‹DEmv+óå4ì»Ô%ò)–ðºV ½†çÍ9‹„ÑI¤<éf£.€Éš ‰ßõ/ÚDfK ©BˆKFƒ)ä¹cIsOŸŽGÕl’³mÙD³„¨‰B6ñÕ|æ-Ñ£OÒh­lD7?~ðŠ4S±¨Ý+6šO`X CøâñíÀ~QŽ,¹žN ¦žY½b´BPq’×_‡X]}çI”^)ÔâŒ|×LŠ ^ò>EÿŠ õËô‚ž’Rˆ!ñ^ÿ©5v\¡)Ƶü‘ç|,'üÎö‚=lD(=G‡÷7‘2ì-蜄Y±o—úº¤­Ÿî᫈M~£Ç¥FJ¾™J&+.eô+¿WÓRtá‚· D·‰ÿYéY$Èk¯Ž¿ ¡b2azøìÖûÁïf40*÷ø¡1ÑõÀ€êà3·TËùDáðË~kK¹âu5ϳßSÙNiäÅÌË<&çó›Vábo•L¿3OÛXÑ :ûMÁôËß²î B™‚Õ3aèGqE¨Q»b’ ç {sÌ´·¿(m;­b›\²¤X&vÚ%n:t, HJÄ#5:Á‹»ðÝÔÝ£,ž«¢A îƒ%cíNæh7Bâðø’$Û‹k®´ð·¨º½îåè×ÄèmW` Û g6úéBªrŽŠ `ëgV.q÷ž$‚ù4N F³ô‰"+;R1"V[ú[0Mp#@«³±ë£$JY"ôÔÞ»¦vqX3 f)ÊE'¬~üvÉÝú»ŠLô†ä¹Ÿ;1bƒþ³O$棻ëß[qä?îžÅ¦ïC÷J@¥C«N›ïº=¶èß›ŸÐvÎgºÈíCŒ_7Z†æŠËQñ$^”E;¬ê…ðáÚ‡FŽ‹!Hà-[šˆSåÂYK û“ ôÖ+$… EªLØL5=#‹ŠÇ~¦ûòSFeQÇ/Rßuа§J™ìåŽÛ¢ÿ¤ŽKœA0½§j:(í%²‰7ÒãÃöž4¡Šï#þ)³ —!‘¬º™Ãã!NC8f‹ ¤$ iàTeî‹®8š.÷–jíu½°]/J ¿‡CØI9–ëÉ@ä#ç§QQ£EÝ 0x^r€›ˆ[È=Úò´~º£ùÚÀëŠBxåØÂÒO.§ £NÈü§'‹Ò¡×üîúr,êøÓÛ<oI‡ÇUIÖßå!ÌÀnÜ‘ †wÎÁ&ìÌÚÕæ‡`ª¦¾|ÏT2·£–<)Ó|ɤñå'2ñpÄ*ݵ‡bk3‹–ØEÛmWÒQÄú5v¹XvûòíÜêž•‡I‰m>éW;ÕïÍOV©ÑP¯HëÀ{ú|m ¡Aú[~*g üÖ±(I»IÊVÒjÝjçÂSëÖ\Ñ®–BdzÅè^‹a¤W︄ŠÒ{»ÎWsEM™áìÐÔú'fó€J›°4Î7´¬¯JI½ð¥E?`0°8a k: ÓE ,VXŒ¬xíñ‰d^jU9Øiz>K„lâF•_ciö‘ï?³y«›Škì,Rl¿é?ïWÞªký&½O"Ê*‘QD‰‚ô1…ÖàV±:êaÕ4+Í¢ê„fNd”oç&­™ƒJo—¡rv »e–´.&6ìx• ÒØfTH–*í1ž×¸]IésY0$žùkùú¯ÕEC’"^ª³ø3þC4“⢡S­»Eá,:é<§ëln…³•³Ê3ïŒæ!~¸´™ñß°)QãuŽ2ØÙwŽßÅžº,;ù–tн™—7E¯<¦Z±ë1Á‰‹i’„uØ©bªÛγæGˆE뽂\‹³D ©%ãâƒß)Ò¾ïCš„„£â¨ .î¤Oµµ§)¸kòö-IÈ@ÏĦà#¹Îuiä=”Þà|UhóF°- øc:‚[¦J×'¨îUÞ6¦ –/kR­UGÁÄêÖIÜ4`@Q½\YåTy,/ÃÒÉXÅœO+ZK¼PÐKúЭ«ÛíÌûçMÒ?’»˜\޽¾éðBÎ=ɶ~•NŽ“Œóïj ÿ\Ÿ“H-€|ز1OïNÓ—gc{›QS 8Xɼáùª&ÂÀÆGÈ”}ÕŸ‰ër1>1Íî«8…Î/%'‡¯ÑcAzÜqÞ•zËíÇb™!ŒŸhÜѳ\CŸÃ[Þ}£*tÑw<„…óʼÂ~9‚L¿Á!î|‚ZÄ„M+4»'1#™/1´Ü^dDùŽJòÃøö½íÎÖØùŠïÆë*—w&¼ÌÝ’ºÑ{õm~œ="Žˆ¥E ywÈa»"fô«„jp.~3ŒÈs/cj°s"É­²HLSs;íe…3Ç =‰3ºå¡I'¯z°åiQ²%t 6y"(‘q±ÈïTw“Ôq2ÀøÂ\)­çzµÇÃ14ñ-莄F9>u Òçä|©nµ¾8£ÚÇñÇ­§­ªÄ›¡¥çÿ”¾1·tËÝÕ}À›œú´6yàŸãIqÅRû=9ÜÞ“E[ å®)³ 1fpÊæÜeç¬ítR—*‡4Êì|ì¨Ëc,ÉW‚Ü.÷›cùþ²›œD¹²·F®½l|"’9ªÔHé ƒ½žŒ_ñòdÁ~Þ?îl°]t©Ç_›vð«!_ñw¢÷æ`SÒãž'Ê”"£Ý’@G~„ß)¹B[™òñ®‡<†+âUM¡–Îb4'xd‘«Ó†Ë¯ƒOJeCÍjÐzŒ¸Aš>Lu˜ ‡Cc GÆl|¯ŒTÙspIDûõ­úêÀTþ,ß0†>:5>Å…~¿gz¦‘—uÖoÁT¤Þü5$ñyäæ› ¶NsO¼s½U¯©e´êŒiÜùºDÙÏtøÕBä_û÷Pq³C•µ‡þ`:1ð¬|SIò\4‹q(aˆ.ˆÌN** Œ/("Ïtt¦O†8tÍëÅ?vÖ¼Õ^è+Ï'Éc1[æ~P{zïÍ-Œù'œ¡š(A®bà5ö†v±{sÜ´<º¶Æ·Ä M¸?Úd4à±Ë €Ùaĺ̀œ…%"øu’>ð`yñ3 ²Ä@­D0×½(é':¤ï‚‘ðú’ûV×ÐGðâ Ëjgyzù$Ã5Ðÿ¦*1TmšLMcŒ\ŒlKÊ1aæ"0ÆVÃ,KfOãMÁ‹|Š÷ªp‘Ýö…°« ëa·´N$§$(£âÏB—`߆Œí`äÙ^A‹ÐµsWhnÏÕBçqµÈ*Êp’I)uEøg ³¶öáBãÇ‚+âÑ®¡ßûÀÚßÁgXai.è¦ÁA8‹ŸåÄ27[Ð$•9@±)Ô°¨Ë;#»Iµ–Ikpã‹é£nE”ÙÜ.~c(µèºGÂzö3‹)ˆ¥ŠFL•`dŸaüí3f*Yf·záÔ\»ì=оÓA Í°ÜØŒ—d2Y|«;¨Ù/6EÇ J¢Á0#  “ÈðïæUC¸:ÍvŠ%7¥QÃZ.Ù™kU¹SõU†"ŠÕPG·gsW뙿}NˆÌ­ iPÝ7jR©¨5 !ÔU_6€Ù§‰LBÇšÊãÐîK žîÞeèBGƒ‹q¿cúþ®ðïÚ= 1k2ªãÒPsµ©ºpµ³€\øRÂ^¨¸ÑòK*Q|áÉ¢êB`Ò“¾–ŽæâÜÜo§Rùª äzÕƒEUžFæîKàF<b…ç7.G7ÆuÖÕ3ŠÁu-*n²T "®ºÞh#,­º·†y¿tO@-Ò»Wûöý£ ~¢¡¿7H'Ä\ïÙFÊ@ÒœÏiLçg;òzÏè Ðæäý43j2.ߟ®>ñE°tNÚ×DÙ¥¾‘?î_'^}6r£ñ¬ á¥°^Š£¹XCŸ~0 K(:1óp IS¾‚£÷jšËk’Ð:sJ™Å§âιè(ViiÈG‰>‹l¹I#ÍJ‘·æ'Q¥Â}©e!¦×o[A¿UîKo|5‹.Æ$ 82ft^ȾQÖz©›sIáœ(hh-ÇÆ­Df«±s¿½;^Àô?ÆC‰]k“²ˆä–¹ÞØÝ\wÄû>3o^¸É†L—Q‡Vý’dÒ{£ÒÂÞ¸®£”—©š^hO+ð áVs;'G3U|Æ™«[Z•*º-'È9€#ý¨ë¿¨j$Ÿ¯±}ê`IÏêá ×ÈÀ1ÞAt¥÷`ž7¡ÎSÖóŠQgóñgþA/fÎH©/yþ¤g©µÖô‰ŒfÈ^’F<=IFFâû{ÁaH‚WËÔô+`HÇ—g?ìÙ?RHbê'‡v “E•#’~}9MÞp åwê{מJ,$BÜÊl—¸çhF<£|—èj+åTËC4°*ÒÛ™öü’3¦ï*ç:ðÛÙÅÁT(v­_õã$¤vâ9G6ÔÏ8ìA^cæn½ã xí˜,IJC“Ý?ÊMFh€8†áîäqí Ü€/šå¿;kPnñ÷»“É$ÜßRŽaªýMwÐŒ8VsÚå f¸ óFÈDµZŽvŒñ¿¥_[m™ÉsÓ!(V°J­‡a“–ÒUIÁIö·‡ï8³ï˜c~Ú‚_b<гqa«Ò=·ÑÖÿh;‘Ï“8—í“,×LÉûùŽ‘&ìïqîÀ«ë²Ú ¥rÞ‰Ì_6XvI×ÏÙNîÜðÑæŽl…ØŽ¦Ó‹EY¨œ54†Ò½pèÌ¢åhàg,æCÝmXôv%¿¾eUÍ Û^À÷žùÌIêраŽ\3nxÅÔ!I´?}œñw$v†ú`Ï4$—ÌG2£„ýü ™ê5/ó l€Æˆû"€ýù,=þ–ü=yñLËmÖcC?IÂ%+Ë1@Óß|QK¾ãÂäòßä`E´`£nŽ!'®*|‚† EF·Û»@ôuï+—œOçÂAÚw™ü@—KN‚~3å¾aEVeЧ}ÜMמŸÈÇ×"ÃA0ú ÌŒ%>(áJɬÿk,êÈù…„TeA²mV{>ß»d˜…|‚™¶·ÒBp+ËETÐ㶷묆ãc¾eœŸéOÌב<àvëâv ±¶™úJ…ëAüîôξoEFoâ¡MKfÎG’ñêjš[]Æ—ÒEò)û]¨{ë­Â9øŒgž p¸…0ÇýßQÍÑÔÈl” 7Šˆ½|Ñ4€•w_M*† |ÞWTK§‹Æ¯›K6p_‚Õ·š»n;Ö³5±Å)È×Í„vÓOCíÊîͺSL3z(øÞ$鑈à‘GAGö:•tÔç'ÆêÔ¡?&v“ µ¯z„4Ù­Å.ÖÃûÙr9Õº^Y„.QAòÔ¹Y‰êª5WŽØŽE~ñˉ#½ Ë!…aý˜y±ÕŽË—¾9Rº¿´PÎåøR‚7þ¯húµ”÷‡®*yTíÐ1™„¸Ü„-˜(yK庮Wk§7ÊOœ>­ø¸Ñ–õa6ö¼rصhCÙ¸$YF[˜Vâ+âŠR[ÁE_Ž èMÒÑ3L¹ßG3SR:ÃÖãEs<¹—×åöÊb{Š3¿LäLX6e—5 þ[ö‹Öb/öÕH·¤ f3H‚DŒì°Á¢ÆšNS÷¦iÀÓ?Ÿ‡7g S²·¤ ßúV/²M3~¹¿b®nY‘U1ìN^§9«FÙ5 †Û¼‡LÄ~hÚ›£–ºÿƒ@­>‘7»¢1:ûá…÷:I™bœ)˜Á™øÈ(ËVþX±ö}Ö--}âë5p‹#|z\))5Š|– ¢ÿkãÃç/ãfK b!osª€O†Á‰sô†A…±Ãn6/ÛÌÙ]ËTý>±ñÀE¿ŒO˜+…Kž8cŠþL€Hv°À[Yÿk4´6¡ÒÓ/+#ˆhÛùp¼3Œ`&ìÌ¿QÚüóá~šÞì…È<˜„óZ2%6ÝÝÁJ°vÀ‘TÕ¦†½$m9·ƒ_ȰÞj6‰Á~ ±˜ÕQ¹ìÜã²ÝkÁþ4Pyä@H-5hß±ÅòùäÃlËr~Y ¶kÒóÛƒŸs* UR¶2§4ä´õÍáÌG·|Ý: ¿@þG%xËõÌ´´7R^1ÿÛQÝ„Bö“Чéú)s9ÜÁíÜý…EqtÓEGn€:×P¦›äÚåÐ1ÖwΉê¾FDèv­£}‰ê*Cäb¨Æ%°ÖYã1ÏWZƒQxª /Úü,’‰0R© ~ }º¬X5Q‚lPVö–¾‹²) zêÈÕ1GFéõQúeTÈsÇ…† 1nd¶9IŽ5<©—ßþ­Yþ™”ÕÓ5ù­®æÇXi/5Ò~ŸQè•Vzn§ÌÉIÃ$óÖaÅGµeu¡A-\áý.3ãåÖP< ÄNƒgåßBJ‹¢‘û–¾1ÔšZ@l¤™ÎÇÒÉB]ÐÔ¡ä½ß+Ã鑳8¹X»°¼fÚЀÞkµ ƒ33ÕJw"™µæK—þM÷:d^3aÄ×Þ“ã—d1Ù‡ãpá™Ä"Ù3¾‘S³Ù‰£ß)€YÓŒÑf•Сg4ý¸ú€B•šÛ éÉqŠÕ*cs{Ý]sv»+Ã1ðj„Àþ$š>TBý™¤_· |R ÁÊ@+hàQ‡L‡Ù› —&D8ÓouÕ‘ñš·s …?öûù%ïКËãÓ×»kË[Ú½Š‚É:!·L·X7¦-œ°Tž(úSy%}Áx¿3ÖñKÂ¥ö²Ò+¿ô„Ž/ƒ¥zÖ´Òõ"pÀa˜ÜÜ##üq# …°eÓ0w¾÷¨¨ÆšYåjÌR•¢û+“À:ðä0(ùr|„r-aa•Û&èÊñ lœ*žvϹ•~7»yö5—£ ŸyWlhî(«8šñ£—ŒsÕ—Kò:ü¾Æ^óÿÝ•ÝÜÅ §"®ÊóÁp?ÜÀÍ3¬à §3Ç4¦pììÖŸ¼$¬F&žŒ€…³àÁSÔÄÏxVÌk9ûˆ 6”¨O8w@²×a:\ÿ}÷|6§¼¸xéôÊ©~‹ð›OœkÿÇì]4áïüPІ<¿r"ëNÁB ûzp>ªm3ÿî%ïgª-mÙ¾ÃÉx9ãp)S )nó'Ìž CÛôäÕÜOos[–|…V!LÆ­Ï1“éI,Õ ´·0!Ñv‰(Ì™V4U Oiµênq*Eñu“´ŠÃ¹¾þ*"šê€ÖÒü¸ANAN¾Úu/zXÄAÄÍ5´=¡¢æ­ß}Z¯íý&—[‡E¼¥_á]Þ÷P‡‚§͘lûiVÿ› Ã¥Ýð\ž Î)pŸz\Œ²–¸ }ºpò1$z„»XÞéÖ‚Y5©ƒÑ€ŽÕr—¾Üq/w• ?éfåš‘˜ž…pMÑõÅå>'MϵYC’«ó•< –ã“®mU9ÿPo<„¡ÉôL·Ý¢RðëKà$ñØoœözÀÕ"º`«æç–kù/Ëõ˜¬ê”í§µ­F’Ìq¡`´Ð³3×ð…¾®Ô¼:³}DÎ#'ßÄÄ~ëbr‹(ÇmTo'N9Äf·| ÕO‹QÖ7àX}+aF1™È‰œñ;ÛâsÒƒËÓíp“KÙŒß8³Â$¬~š{´â?³ß‘TÞ¤œ“çëL­â­aÁfxãñÕ(,lö ãþ^‘ó75­IBêU¥W kQyœÌ_ذ£E!‚ÚIö;©²»ùÝ(9Ãæ¦ðUñ«pö Âyó`¹äÐÕàê‡/=„­pá§ùiµ2÷No°a6©gÑ_¯LTe²8”*_yºÌ.€t,-X›RH…¿Žº"0ûŠë>Åsky:@æYÁY x*cjEÝ(f¨«þ£ßì—)^N:®?î†DG×°vT[رN ƒ!»†šéº˜O8ääºê¸@Ë=Ë€¤wÃÇÙ’ˆçõÑ×Þx©r&Ñyôظp¥Ûú6 Bû’¥hu¬1Û+­¹…Œ$8pàg Q7„ Òbq–Á„Me¿î•ï³rOî’ÏTòCœ‘-•¿»×B#ÁÓ Ÿ†õ³ÄÔ¥š¦CqÏåì¹®j tFÖÉeÑ+êhxïë9J3[‹ÏžÌ[wLhÐ"±½U¨§vÏûRδʚ0iÒÒ1½.EÁ?\¦.•]ç .5i:ò?ák‘vŽ¢­w2”ùUßr-Ôðt±¦ß8~ýåZeÄ_ô¬&Ç[¥El4KUp(ƒ.$w¹ Yꟿh åæ˜(ô,ÌNBy0No†&uÀ¦Kâ°–JÇ­ÞA•hþi%ó»WýEŸ¬V"Ð~XVçP ÙÀŸ™„Ó/„´Ã. ]“IôS¿¡Ò#tàøž˜ö ÷Þõ¶AŽ_Ðï˜x»âØöÜ(ï@%‘­êvH›?ØXë… 'Øå ,¯ž¡×pÆHɤ…¸šÌ…Z☙ËÄn™hDg¥rÌq̧ÞÖ&éÔ%Õå%:1°ádðú5„íœW&A›ï#Š<šGÚÛ7sºÙŠQg]²ã_Ù·ß‘Uszjadñ¡±øY RaûøÆ-êRR§á¨êK1djº±ˆH]Úö`Çöž}•i51yä§+¡¤NDºL´[<Ò„ ì­J zOÍtP¹v´;J¸Ÿ•4™1`öÕ«6aºú ¯6Üúõ÷h_§]‹N4`Š?þzQÇø {˜°'õÂ^g{‰AÛî–Ìk¿áv!Ñ8Ù ü,„œíÂß t$Çã²!ÀձݭÿëàB¯È$½Â–ŒêYmséö( ЫMBÕíWJi$$î2ÇÕ§ù‡kö]¡Lð፨ 9ìÙ@çk¦Øñg‚ë‘#ýŒæ0ÿµš¹œ£pgFÝ!ÓùR}i+öt‰(òhŽ·U± H•Ž3^•¸ôŒïãœô‹BÍ=è…j¥­ŠºŠ!ú~ˆ5÷î¿\+X»kŽÁî 9{¼ªQ‹ƒ¶NWȪÔ$ç;ë&†˜jÇëjYn :wîˆT£– 1c~,¢K„ºQIsÖͯ¬¨Ï\X—ƒ%èHj} êCc¹y¾Œ@hß4ôƒFõITÎÝÂ8F;ÐäÜ(°Û®‘™»Må™S[¥ŒaE˜§o¿wø¬3Ýê ÖŒ?ª{ïÙ%AP¨;TGÇT Ð[M>á!ý™ƒÙ÷W÷LV0̇¾ ¹-ºÖ×׌þšGój¬ïø,óKöÆF´Ücú*³Ç$…øn3NX<þ\cž3ä5n•þÂ7‘*£…!¸kS0z ˆFZ3^B˜Û „^»´ yp÷ˆKŪFÁø¹Ïß3¡$õ¨£ü-‘yE–˜¡7УߵzØWN\4*0Déò®½ÑwsКÚzÆîÑÌ ÕX'™Üq¤TãÂ'u‰äA€âYnck„.2Î0ᆨ€ Û* ù›\Y­|¹-^¡¶^/ô¾Ûë*s´Ñ¯~êý7•! ÁÁ×@Ø·;2¾&;;çÀsZD`¦Eœ‰A3}Ñå~”Ï–¹9å³._ñBv¯T} %+¼µÌ.¾çÔAøñèZ„òntÉÝX'Ö ÒE…°qŸyša~Th½±æC¢iñÞÓK6r›~q©ü§82Š¡ä­è)"[‰ L)IòÝÄf;>²¶S[»½ÌåXÆ_Ô[ý¤Mò–ÛŒq°}̶1Acˬ,§ñUžÑUý¥Š|Ò¶Ãa£u?{ wâ ü#´·¿[ É9ÆšzÊwèVU16~fàj)µ(YE{­S®­æA ±“›gÊ÷ÎΗX¶Ï^7‚rëÈÜvÿlï’”jYÅ›#º4 hEV”ÖïžøeJÁJÑ“Èîª ¿*Ó–(×-ÚÂW¹ÜŒÙ$¯¯|pï!ÍaÀ ŠUáýå¤8ú‰ä²£Ÿ%£!í ëvQçCšÜ餳Âýg¼2ÝjTê~˃ä/ä1”4W=£AS ^e†pÍ­‰3Šͼ•«²“…J[ܰL¶¹Á«Ñ¯§Ô#ÑYkN–±âVkÕúŽ#¢ÔNŒ2Sr0+“#ÑàK§Ü ò³¡9Ò—»mJ ¥9pÁ ,âð4 ×G'Š¢¿¨»lžÍTФ„¹¶„ 2<ŸÎÀG`HÖ¸Ü$Æ> stream xÚxTìÛ>Ò"]Ò¤s£»»;%Ç€ÁØ€é”FF  %¤ )iD@@ùf¼ïû{ÿÿ9ßwvζçºë¹žûºŸ³¾Ÿ‚#Â¢Š€£ø@ü@I€’Ž‘…ø@A66c( ù '`3…x!¡¸äx(yAìQhLÙ…vÔAÀšÞ0H•‰IA Pâ/G„—$@ÙÞêÐáh"à$›ÂÃß êì‚B×ùë-€ÌIHˆñþ (¸C¼ `{8@ÇåqGWÛÃF0‚òÿW NiÊCR@À××—ßÞÉðr–åâøBQ.Câåqü¤ еw‡ü¡ÆOÀ0v"ŒN(_{/ À `‰ñ†;B¼èê# m€žþÛYû·/àÏá@ü ¿Óý‰þ™ ÿl#Ü=ìáþP¸3À ƒôTµùQ~(^€=Üñ§£= ‰@ÇÛûØCaöh‡_[·¨*ìÑ ÿðC‚½ ($? ûÉQàgô1«À•îî8 IðsÊP/}îþšëGøÂÿZ9AáŽN?i8z{˜À¡žÞ å?>hˆàÌ‚ˆ%DEE@ˆ'âvøYÀØßòËø Fsô@xœÐ4 ÁP'ú… iï ¼¼!Áÿiø÷Š8BÁ(€Ä 'ø';†8ý^£ûïõXÑò€?¿³F+̇ùÿãþ«ÅÆšz–Új<(ÿmTTDøù%|¢@ˆ‰‰‚ÿçïø‹ý/Tßúgwÿ‘Qî„Hü&>½¿ˆøüQ矱áü»‚.­g€óùߊÁè'Ðÿy~…üÿ´ÿ3Ëÿ*ÿÿÞ‘ª7 öËÎùÛáÿ±Û»Caþ<ÐzöF¡gCžø»šA~´ÄêíþßV ”=zFàÎhó„ù¿q(RêqÔ‡¢À.¿µôW3Ð5`P8D„þ¼wÐQ@àÙУvCß-HtË~™ èÉúw]8áøsEDö^^öþh W"€@zV!~¿$à‡#Pèšc0À áEð³±BBtÂ÷w»Ð¶ß0E¢ŠtC·Çåop‡Â½‘ 0@Žžnû €€:ሾ1Ð)Ð]úiù×®ÁÞ^^hã/y¡)ýµþu‹@ ~0Áü,,éú,²ã¢^Þ—osweµ+.Å¢?VÅþîq ‹6^ŽÚ”§¢c-ÍÈ#ý¹ÊèÉÙ zîË1¿{¯ò–3Õ Q*ýëŠG|EC_O^9C˜tÎãbâÖÉ>¥0’ØYa[q¤›Í~ëÚzú±äª ¹e)±p”‘2gÒ£ ºö0X0³®¢†-î‘&‘{Yeyk˜Œ_a>€&+v$Ð~õ_·JÊ^Zz7ÐÿHè¸X«·N´6š‚–2@“¹`$m–*5Oó9ƒ]QäL©2#……¶Ô=š}ËNlùÛtñÀ‹ÔA!ïfg]¥°[z÷ß´x7"Dfe z–l7r¿ Ñ´¦Å¹ðÖ?bUd«sÄ8ÎúT'+ìŦfà6v-^ëL#Ê+Î-´1ZðîGÙ|œ ¹°KÌI ZgÈÀÄ?†Js¥ØyÊ.´ÄÓò¶¼ƒÔ#y$näÔ‰N°- }̪ÆlßùŠ2G!õ7Nð¹P„ß·¦ø¡°}£a}F§@­±ÊQ$]áá¨E]GÑÀ¾Ï«äq«¢¶osL­ÚlzEò{ÙêÑéäÒËúIšOFC|RgxX›X\LÊuäN÷äVÓ=¸g#Å|ˆßÝ–YÔ!ƒ×ÕHÒåKtÓDlŽ„2âŒ7ÅÚ£tþe1mz\‘MD5@±éSlÄQ7#ÕK.Ó žPœœ8íÆLØ)»¼?•Þ(ÌÎ^SÌÙ ¾|90_€tâP:ñ_^«·|:ýTÞÌ$žÞ§ó䈠ýxC+ö»°›žÌíƒÕò³&€´Š÷0Þ%}„ʃåÛÝ0ßfs‹á{bY-0ãîŸ_>›Ûž¾‡xnóŽõ9{ÂæÉ±5™8,#yã9²=2ò•@ÊÚš W³ñf_¨=Ñ æjÍáüDã*uX§K‘TòvÆwo £8‘ãlQE²Åbøb¶ñ:~mvrÃxKÔäy%…µî(_Hp`ìäÀ|át&φ(ñ«J°ý˜|hq½iúÃL`‘ne8Æ'6äת£FÛ»UÝêðÍÓ…±ÁˆnûÊëÓm¹^B̃cT,=Ë…T4õZ/֧Ƕ×pçM£DŠÀKÿ€ÙÀãüæ«úó6/ÑóŽWR¥–™ÛÝ>sLn„þdIÔÍêiþRtÊCïÖé®´ ¼ É#ÃH뚥\‡5%9¶ð ÈR©/óvCæ¨hâH©¡þ6ëÇçm’×o¹†:“TîÎm—:rÔônvÓ󵵾Ġï°}N Ž™ï¦O˜{›Ð}$ªÎò;]_±6±øøËÓùDðÈIó8‚r³&>W[½ôm»ÖûÓ“–®¬/xž<ïÁþý£/J soPØê¼I¸²ã“oÄ’›â^Ñsœæ7LœU¢Œ*†JHå–Ì©°)8#,"¢úÎÝtÍš-^¨ÎIo+7fî¸5.öâ­p.ÌŒÛα‘1¾_í»G¾ÀH#Ù¹G ¦_ïW Ól¶SÕFùçS¥'/øÜ!ÿÄs?¥¤©ï¡J38éí³y¬4½wµgŒÔ{¨¹(¬ïêœèy}¥¦ÝÃ-5Ñ`²}¢C¼ÂëfP‘Âí”— y‚¶ê97ÚLg>¯Ä«UÔÀĵœèÍ(–½ md¾©±rT D›ëÊ8»iz3¢?Ѽol™˜Ò j‹S¾Á4 ÌGòu¨ràÑOgitÙz¢0¸SƒÛøz•v®UaãaÛ«N¬«aLýªÈ Ã8Ì9¦SÌ¥ÇÝô©L.s*ëÂðu[ˆ¡aºPq‰áW$CY'z?…³ç~„5U÷šÊA»ÉÉãN¶ÄúƒºKe¯]ýsÃz›MÝ?>Z¥õ,ã¬4L›z’úiîe{Î ‰œ›Æ±JË!}¨ûí©ýYÑ8åFîƒG ^ã3Š®u&Zg~®Eíü7yqG/x@õ³Ï>öj䔵?Xb …·èóÁ§ÇÒ+¸¾}ÀqB¡XX·ŠÈÝGŽ1ŸKI™ÖJU²¬?°To83OÄr?A´cLã¸Æ¿åÓýv0Z:Z‹8Oî×ò5p^JôÈãÙP‡óÏÆÇæõì5j›ÆÝ?}}ýýˆf?FdÍF¹ÏÏRf—ò¢Òö©Ás(C݆Ç˳þ$¦a<Ÿ¼ô¦Çàbð[%dSXNÜuôûæ’_º¶d;r$¹G—µ0G©z%ÒØíÓ\¥x©^cnrM,(¤9÷Ökqkõ`.š¶pÌ[ž¼Q`\ຠ?<¿Õ8cÜñ¬7;eQ{l…XsïÓñŽ2´âʪìH)ÿ¾U°‡ù3å²IÌeP.Fæ]ܯ"¦‘{N“&ñ»žúaÁçß§‚d®rÐßgzDô‚ô{q·‘9ŸË™’‚76Ó¹ yœ=Byëy_ɹV Š) …‹å~™!Lû”Y×ühŽ4„G@µ‚ž~¨mXœ‰2Ì[mÇägað…ºÐÑvë‡>†l̺{jÆ šäëÖ2îmv¦B„Ê× ¨vº™LOï³I¨·S§¸Ê<°–ToçúâÔÙ’ˆ—ª:Ow7 ç+fooäî+TT“¯vz>?!¹³òryR¸/ž)¦$eâôT߉æíÍšÞY£þBÑÓõ†Ç^%åV©K¯|ì>v47|K¼}Úâw®Æz]HYº;Î\Ô6vëÍÃç·ßw©Žf?×7䤆ËÐÔ¾rb¾}ã÷Hg?®À–/n_œ¡x;§üüüƒœ"pk§|¯.»†û£‚¥'²æÌ¯Ý3 Ÿ‡åÇ`ÔÄf×,S¦JêÛùâoÝnϤâHû_äézÙ?ÄÛ-­èìç/ø„‰Òm*í‹… >#muSаŽáº­sAÒbTüñÚ"sÞLžˆ‹›<Ã^Ám“Ä8˜Êñ,A²FóýùPôÊXÉ£ó.¦IºƒzòëÝù*ž‡`âÚÐé¢ûþîûHél“0 fÛ.ÌrƒŽ…/eº¹jMŸVq²d‰1û+F_ºZ7‘ÃO„Ìe5‹äæ•Bet/¢nt:À‰=o;Xpʲ̋so?èu«ðº@¬Å_`¼„žÄ©¯÷%+û®µ]X—„vÒ§Pí9>TI£.í}à6O»šMÆÏJeººåB‡Ê; pcuscµÞ«£Â>;µ]Ö‘¾PÂ6Ë”?9ù&”öÈãÌ îqºÁÇì8l‡Õ *“Í'ŒÓ=»T'űmÌ(¥uÃ÷( Þâ]»k%²HIÏtà†¹¯[AÅÞŒS7íå=ùÌÁM}åij|~Œ’¦ŸIp;À—«t§å*w:m«;ÈX]+¾ð¿Ë¹^gǶXEOZÎÜaÀ”'dG®øµ:m)VóÔÌx=ø¤²òÉ 5¹à¬§Åhð„õ’õ™ %݇ðwyr»ŽòB`.Rk¡*ºLâ݆ 6n`u†^ºìÒ)%Ç'«Y8C^´õ J׫BU2:ÒîXp’•q Æq¾¦t/³Ýƒ »–ë ÷Gží²b®†ζËÜÒæ[::íÍ‘Dž>ì-uÃçJ+›Bº-Ú–ÈF_c}ïÀTjdGûxý…~Á¾üÚÊ"“T¿˜\è³¼Ð‹Žæ©î˜²è‚ˆQÈ«93Îð¡Žôô9ÚMRÎnx¯È9-4øR`vO¿JÙÍPm}T˜ÀW—lzúxÕBє޼öB}0°Õ7bÐÐÆb2‡–˜—à1«jÅÛLuåùcS:9c<ÿÉGm”úËlª2/Â{cpÏæÏŠÔ´æô]ïë6Yµbk ÛîÆ†*áS,O9Ýܺ)=ù0á{Ø ;aô§² hV“£ãju‰Õ.Øð&.I8ÞBȽŠP²5]A7§bû„·¦˜P~énÓ±Ïên÷iˆÖ¢Y`žÎô²Ü»äÄJc믒f´R”d>wR¢H³pÌפp"ï¤ÝŒ+7§Hæ×_Õ’+d6.‰ðßzޤÞÇ:3±Þx‘&3iÿãÖUšHÓËøP¯P”¬¿L]4÷z˜ƒV×}¢NT?½‚WCŒ£å¢¿,ãûÉ{§çs…C Úa˜{Eúéìb( æ™·Z€”–³ðÂÉd"“Ôso.–F©Ë÷F™=>#Gß¿(Ýo”ëÖŒx!¦Ê"jÂ_”ÝÂÅ<åy¯e0 ¤ež®ž”Ù ûŒÜY>ˆðChZ¯¾«b~ãû]To‰?øAA(jo$D„ì¨Øtm¤²‘§†¬ôyMíËïŒbñ&È𜧳•þ[›Ã}éxÆ… J"ßÕ¼œ×LpûHEÞ°&ǽ©¡º%)׃z8—‚kd¢7 vTr·*ýP­'&æfvéVZ\Ù‰9b^Çñ챌:„ªGÚ¤üÙ;ÝEqm„£ë"ò±iŒ,aö]zºÏ™“(ó G* ±†#Ý \ülÇñÀ~ëã÷¶|Ú[ŸI ^¼K¢*u¤ó¡}`k‘yöãŽ/ƒât'›9[¥O?_LUA3ÞçªO"±v\Ë’ûÊ9]1>?a¬^ÿ0éTJÑÆ Y¯2]èk7·â-¡Æoø ,Öç+Ä»×…¶z¸vo îd±¾\± æ“ 2è+ÝÔi„„ÈͽÚªo¾ÁDºï²e_æpÔ}ójçÅnµí® ôäÅhæ6é>Š¡§ªÞj<¯!–V³èG¥ž| ›NªFøòª¬yÎ7"zæ]›€Ãúdﱎ©*Õ0PäzŒÇMcSÐLBÖ)3¸ò9€t⢯åTÓR}Ý^äZ]ÖÄRÞôñô0e– ppÈŠjZ;Þ¥3É‚œª‘k!"æFµò#ý.[žzÚ= Þ¿± SdÒï T½@ZU‹l}#fgôÀ¥üV›¥èM†;ïò¤‹Ÿ™%y21Ö˜& Çóúóa™Š÷¾º›ùö°*É8Ö =‘ýHß^Û‰8`<³Ö²PÜÄ‹ÍæäWgÏÀ'•N)™ÃNàwü¹njȃ¥‘½°õø›z_?ïÙ‘ã—{¤e¶®ThˆÞVÊÔºRÂð­Ïw§Ä«~?lô–õ©Á7¦I%íÓâ“ÔVj¿,ß›ºÊ£T[—sq؉î³Dn¨¤ËŽFµHÙa“ôú|c»¸³PglužÅµþÁŒgQ{dB皸Ré„òñ›‘ôv4H¥ö¶ô·¥|fìÈ’^õÄgë•^´õ¬Îïñº¨ù3%Òne-&=<ÚW1N¹œÎò¾ÖNe¦Ù#=V»!÷÷@ª_w˜lH„|jn®éåúLÕ1´Þð!$¸Ü4n]¾Î/Q:Ü=˽a•à?ž6Ê Õ,ºÍˆŠÝ½L­Ûò—ÿØÝf²z‰ÿë/…^u©Ap`æ‘´¿¢ƒX%Œ™Ý/¹ýG¾2æí§ |>Ç"ìÅNïÝ{=£˜Y²BÎ9¼‡ƒ¨˜e…¾›o÷v<±™yú†k&›/ð¹^r[½Þì¥ ©aEO‰ßëí=ü;±ýø§¾ŠÎ©kWFW/ rYÞUÁrŽÎ¤Ú²4ügÃy5²çáUá¦Cø\W¾Âþò±PF¬w8etþ±1ì€k[ÀÃpðbyþe `³7A– $Mä‚§o¾YnyÌA‡OÙÐVþ%ëÖC¬Á3ºÓ£z#y¡kÿ …–.χƒt9tí>?…VÀ=]Ê¢øÈ­ïëçÔ*»x¼ëSÁ)2Û .J¾0Mð é‡É):“yÁÉVÙ!Pì»×é,$Ýfí#ô®¾L¦ së|kç·ž¸‚V[°_y?77N‘¼¿+³'FþЂ&»éìâõÑ.¯‚|XcE5>C Oîû›øìU"k{$“.÷Ö3ãöFÀ¤DÊõh‹œŒ1ÓÝ–m÷SóÇ^UÇ>ŽKº~¨¾ N^ååü\ÊÛŠžm‚QÿÏ «Yv<;ófrlG©Ðê§ -쯫ò5zíÜÈ.Náþ¾~¹´‡ý"Ý}‰eÓ|o'aXõþù?². /ŒÈqh-¿î¤-cúwÞßPòñ°XÍç?"8!wU£|H% ©L¤Xð/¤¶{¦{\îtÂÂ^~]_ÕdÞ¥«dtfkŒ^jS×ô<»=£ê¬v¯·)ýµxü&'—ü‘;’‘SgÅ*Èré¥íª´´Ó×hÃH$5 Á\— /£‘¼²zyö*âÁÕö|ÐØ§%²oÜGÙw(u%¿œã>"GšâlqáÅêÇ[º/³öñQZªç:Cy ýؼ—„ûáÂÂÝãk4%^LAI°;ZÓA)ƒBvq?,`µr,¸ï«›œ-Dz4lPÝ5ç,1 ÖŠ[:Œ¹2_D²`pýä%‹!¤2±xjÄÏ= {AÞ€÷3EÑ4§¾H»Ã{Ã쯨Õà§‘%¯Ùïfîìžø1zÙÝ<í©e¸÷€Xæ”z\Âì•6ö.ø!ÛïêµYТg›¢°å›guÒä›GT¬Q‚í·Y·djÛPlˆÅM#JþÓ•ªt"®+¬'™¤¯Ås/c(u‹'ìQù¼mIú'lH–žÙòÁç.±*zª¢0ïßóî.»5h^²GVR\Ê«Õ[Úœ-ú<隬pOÁ‰˜¤}9™¤ÙÁþ±õ‹ä!g2EùqÄë%·à6.ôïÕCÙ•‰ãóø¡¥¬šŽ- «ÂcN #§ Œ]Škƒ@Þ1æ$ªKŸJÇ=ùCSï0Áð”KulWžªt|ã5%&Î7 é7JpœKqÞÏj‡+{Ò**E7\Nïr÷ÌûÞÐ徕€aÈ×»„š¿:?¾µ˜ÊÀ¸ñ¨†! ¼"]÷í¢êc endstream endobj 132 0 obj << /Length1 1399 /Length2 6085 /Length3 0 /Length 7047 /Filter /FlateDecode >> stream xÚvTSkÓ.Ò«4Ò!$ôªÒ{oR ! $¡„"(½÷"½(]©Òé(M¥ƒÒA¤üQÏùξ{׺wíµöÞïÌ33ïóÎ3{m^.#SQe(ʦBbEÁ@<@UßÔJIA q ^^38Ö ö—™‚׆ÆÀQHùÿPEà X¼M ‚ÅãôQH€Ž§,K˃eäA €8$÷7…–¨A¼àP€> ƒBÂ0¼ª(wîì‚Å—ùû à(ËÉɈü(#`h¸# Ї`]`|EGˆÀå‡aqÿJ! è‚źˋ‰y{{! …v¾)(ð†c]&0 íƒ~@°?Ì€¼38æÝå„õ† a¼Á îCbðžH( À˜jë ÝaÈ?`½?À_gÁÿI÷Wô¯Dpäï`ˆ£# áAâàHg€Ü 0ÔÐb}°"ú qàðñ/Ü â€üÞ9 ¡l €à þE㈆»c1@ ÜíE±_i𧬎„ª¢‹¡øµ?58æˆ?vœØŸÎº"QÞH¿¿Np$Ôé ¨§»˜9îá ÓVû ‚7Qücs†aR 9iiIÌóqtû•Þ çûíÿ2ãø¹£ÜNx°¸ ÿ ðÃ@¼`,Úà÷¿ÿ^Q€Á(Ü p€9ÑÿdÇ›aNÖøæ£á>^{`è×õŸ·»xyAQH7Ü?ðßýÓ47´4ÓþÃø?>”ÀOT *')‹—«¸@FVðï,ÿáÿ7÷ßV#ü¯½þI¨tBäþPÀŸÝß4¼þR…À_#øw^Ê0€À?Ê·Iñ7ðÿ·þ‡üßdÿ+ËÿKùÿ½! O7·ßnßþÿà AÀÝpðJöÄâ§B…Ÿ äC-a&Y…{"þÛ«…à§CéŒW¸(X’üc‡c4à>0¨ëèòGG·_Ã Ž„¡0ð_|ô_>üÐ9ºâ?*|Ã~»`ø™úw]u¤# úkøÄ¥¤4‚£á5&.%ðã§ óù-o€‰ÂâCxŽ'šâW[%b ž3ãŠï‚Ë/'Å¿ 8z¢Ñøéû­|õ¿×¿Gó9RLO¢Bî׆´×(³y‹. ‘Ì/¶E&XuGHaù>äû¹è‘fjŽy¨ØC+¯¤M= ôgúv<ìcÛ™ýp.M+K ÞýEe[´ ïÇ^§3ì:uÍùLzäúï‰Æ´ö6Ä6üÉ–“§¡2]+UËOÎÚ0+Ör äŽ+ «œÛ¶AmÅucÛoeKwm“ái¦mþîŒ0w¤ÒÃú÷Å&îqÿìloöÛît‰ÝBÝ×ÕÒ•a ¬Œ¾:\¹I=¬L‰Ù: >©CÕg© ܬň0¾9"Dí8˜ýFÜVPÊ~@q) ­•¯t}ó~•R«bâ bòé¾oêÚÚHŽÛ¯L‡Ö`l¯%¡©|©~š±ÞØk™ ’­<¡ëe<—[m­)äS°ºé,} ò³s†žÞ}^iæ~) —Ñ›äzj²(ÄÔLÖ¢ûJRÎÜ $g°±sa¸ÄÒÿÚä4ÒÝk›Ê\‡YmÕŠlébD@ ÝÃÆÖú^÷$ÀžQêN¥üã·Â÷#^qJHW>»Ìд£Ôã:ÒiÉìùbKò¡Ë÷Q7¬šl±éÅ*‡®Ç}-jÿŸˆ’ya§ÄÍ€‚ížJ…䌰®ÆEŒñç–—µPµœ¼®¦óQ*òš¬(åW|rÁ‡5Óëa\RÙéI¶*ZBZa+ÀY‰ú¨.^*‚‹²hç—%†›Á9ŠºÆÓñY-;œëÆ>ú G™_ë¿çÓMçêÑV»õÒíômÍrQ6‹Yµ­Ô(®¡ã´  Ê%u” “EåQÔç¯Ó´9aOâT¸¾…(%,wF{ÙIfÖ"0‹Ë2å‹k—GYßë‡8HتŠ1Ì£,#©è®×ÁmÁFP6´yOË=Ï.ð zû{“ÈZD”âúÔëGY”pºë¸;?-±÷Ò>©'@qa8²´ˆb©WŸ»¶b~r®Émî ¤½…c+¦µ±7zîRêß\[ŒZ9–upûx™}m¿êS”´~õ&+Ÿn9K)÷ÌHzZ=žd"Ý£0¾O #fÕzUvØùðeû uò¢ j˜ÆžÊ¾Ù丮VçHôhTM ›,Ã=H$d3~2ˆåÍpǧ:–ð é#Û—ŠæýbÎú(D¤j¤H¶‹nú³w÷¥h2~Ò»HZ¬’V[÷9u}˜X=Kû5L0‰çƒP·i !Xíûý×~¶ŒÏPÛdùܦe«é¤/J½*<˜'à`YË=Í“I¾^ÈøÅíf5X’¨ïÃ?„*ߨKåe©88š\>1RÐïÛÉ÷Õ¢ŸÎMp;faý°c²»Ê}š\ÃÊìû­×ºsƾ«Õä}’• ¸Ê}s»Lå!Bqz¼}´ Û*u+‚£ÇuUÁ¡ÇÊës»—‚Ù³—$‹…`w‚RnN:ÅI ºÊR¦¾?M½bwÃ^æçËôŒ{´)Å zNNäS¢ÓíËÜJ¯P¾yd UºÊÕÓškçîñ)#Êçœð°©!›|Ú–-z•¦Ž]ŽÞï)·á˜”Ÿ\ϼlÅ1ƒH¡÷:«Ù¥Ôr·¶ö½d’Ef¶£5m&ª/ ä».ö‚S ·Ïü©ƒ.i&Ùy’5ïøç)s~èA‚jÔ#‹¶7\ÍÖá‹ýÜ~cø;;œÑäÒëÀ‚•-½q¯ñÆÃðÞn‹›l¶mká`b[q%µ˜âNkÓ_z¾ô¶ß㜳71 M,[—>ûiPó Ò3@ý¢jR7îu×v<žz/¤³{£ÑN6g·˜çèºy¼4”®»‰™c1É,UÝq‚²R¤!ÌáRÍ+ \Z¡»ëˆP–0D¦ÂèUíæ%¥f‹‚«dáÊL¼LCs¶y ì âls?§Ù÷AÅw}Q­G§“ ¯A‡c«ž}ò6ç•…—Ùëµô¿ž¨UU?Ofxý2mVÓ¸«í[AHmK„Õ$IJ>ÂÃ_wò¥ÌášY×èÞyèW…Ž!>ž€Š‹Áa2íRë¾'Œ»t±,yÔíWÃ’ºu§ŒÕ_•ïu“±W¶ËÍõ‡7Ì3ÐòðÅySÙî ø ä weö[s`4næj¼ŽUüæÿ)·#ò’éÌO’çãé§–}ì7ý¦$í£X!2ÖšêÜì}a£,Š”µdR%ši ¥§ºàëf¾RpÇëʼZSùD/¡Ž5Ò-EÖû¯õÔ„~d Úö9š{Û°^kvŸÇ­0¤ÎÌ>¼46ñ gýn¹ãåÝ] tŸ‘ÒN×à'۬׺̕zr‡>®¢ ˆä¯²%°§Þ%ßeú$îv჌"qQg±}®/Ð'¾iôØíDßùmp=«æLÀûiñÛ7r÷o…<’uZÛÝÊZ c|±‡rnaœˆïJ Ž´ªãв/ <"QD¤6{„3ü(¾—I,7WK âi/ºOùfÆðFÇ2×½@³An·¬žŠ;ði…ŠÄÏòb-"›œ°ûD³U…@ôôåúkœ3–o‰¬u4¥8S·<ÜyÄòšº'—ž:+Ð^s sÜx pÚ¢j²gL5~ì[Xós©…z£øl•õµjöN±eèÑ4ÑÎ…qÇ ÅYgN&ë…m{áú Ä\œ\jÒÊWyÏÞâ®ÍÞ/\ó¸Ûƒ­ÖÍc€ìÎ1p·Ð3¯Z/ªF˜ < 9P ‹/Œj ðÎì:éOõþ0t'bÐV8VCRv£þ…šªeE`õenÕ³ý/½ÛXEÉþö¤)ýnP‚[;S¥Q,«jâ\¨Z*Å›±Íã;§ [ã!W|é±ÔôÒgLÞSÓÓÊ„QzpuK®ˆ»ÇYÜ7QBü©ŽoÎòˆ,TCJóßzjМnV­Iùv6Ó4)ÒÈçàœV£h»|ÿžšÚØ©öñ;„ßÉš"IT%OƒÍ0)èœr€7êpM{"¶öÂ}>¥G¡0þj¯õçLú×#Ä\ƒéû]àSy$_ uâˤõ~âã:QSñ *ŸÊÁç­N5 ˜°¤‹Dd𔸵 ç¤È´¦.9·rAl¿üH(=óÊ0Hð>ßœ0f„Æ#Pé‰7tmV“Ç5¡xÖnokûb4,(kÀk}¾©§~ÜÊãô(ä±²Ã]{^Òr„8¾¾0ý^7o|ïYj§¸¦ ¸/‡ÌÖCeáGÊ õö…{Ë묫䓄c][r²{¥Z“æïâä’rX,ݲ+hNûg¥‰Å¸Þ±´eƒX ë_HÊË, Sn¡4üF„‘-•ù™ÐT„̬éô¹çeõÏC±^ê [fa–;s+Þ?ÑSA¡ â•H šöõR2¢líD;îW.-´÷ äÛtßUàï ¦¼’\{Úûc¯nõõBì…®¨€c>"[\¢9Ùa?¯ôÍKÉQïg³Þ»Ì»ÇÇ>!®&´b~ÐMÚü®DM¦11-´°²¾V4Ÿ K :;û&­£ÑÀ`’‘ê:žù è2ã¦Uô°ErhÏÀƒÅÀØä«ó±fç ¿Óå§1ÌyJ]m¥ö ªµÁU( ×_rHJzŸWy–ÒeÂF2É%ME,Z_~Z¿¿Tp?ìÔF*’ës2Uë“¢où¯×s|bV飭Î*Ž \´Ý¥bzPØzaŽÙ ÑÞŽÐþX¿7e®ê$·UŽIPf¥¥YÀ‹à2ôAo>ÖÌ·"yîZéP^0Ÿ~õú„ì˜^ÎölǪ_`iÿgÑ.Ö¶ciçþ§³Fá²:aåiF%´„ÃBçú#î\`>©^Õe‰xöYgCZ©-ÍÏ|¼ž²âóЉd$àÝ÷žA¯{gî¡díÆwέŒ4‘y³Ä…zíƒ_ëóÇ©e©fô»Úã.‚4…¼•÷>» ÚQ\™O+ Ð]3a„õJïJ-/;Ë;ÿê»›A.}dáþÜ}½ž>jçÍÒˆÔè\Ø [~¡Ù'2â­÷tH%ónì^Þ™‹}í6M>¢}©à'íbÒµô±é–÷ÖUB©§“t÷f¨U>¸‰al…o|0eöÉí˜$bN¦./~rŠKKÅôX™¹‰Nä÷æ/sÿAÍ¿màÂ˲hk׫£¿ûÇ|¹æË‡HènϳO;¥iÒm]¢ì+ˆaÔ®úœújLÕK`Ø/Mpéî#‘-¤®¼Õø)2G¾Ÿ×”Š£ òÁd´H­*ÛÇ8¾Îï[Lû:g•‹îü ´‘¡o]¸TgåØUóÍ@êÃ^¥[Xû@çÊ©Ùâ ŽÅ'Z™[”ƇXM¤Ô¯Êëý;Õ²Î;fiL¾}˼?fv&‹ ®HÛ§>æMúAÓªtw“åV²ê|ߦuXÕ}«žš—4”<Ê÷6¹Ý¡iÏW'ÐΡ}Ñ'2¹ÙªÉ¯ÒMÎr¦êÙrW›¬…^_qå´GC;9Ö¤ª!™ ‘æ³?L®GV+/=ÙÕ„I™Ç2Ëö P ­wÚȇìñI§¸v[YW~j®.ìJÝ .)»O &…!z»çÈúŸÝÕÖEÉÖk¹Æ#ï¥j}aiž¸cX¤sùásÑ©Ëés*×¶}ØO4x_è;*#mÓ‰:ÌSö®±µ–8Üès„ëµSC*v$voÔyÝÉÑ.† e3Úw¹ ¤(_œäCÓ“ÞÌ·ÇgÀy³3WË.,«‰cÊ{ÞY!Iú'õ|íl“Ñ’1'@öo­5ªÍ4 `¯¾ëzšOF61ß–%:ø!#¼&¿½¢Xi`žV 1ÈJY™4Ç©Pô3ó¬“Ë¥ßûèÆyÄ£®…9œkºHní7$óªg5ÎN;óÑ9€U,ñ´\†lÊtd +lQ6áEŒ&‹BZ<^‘y™fT%rx¿DÒÇ›]yü°Ö½¤hóÁlyH”ô¶@¸S_Áõ¨9Ñ"9øîšç,Ÿe»âÔÂQëó$»‰ÐñÁ˜|DrAçý¼Ðõ÷o²¥¿¶ŠÚ‚9¿„´ G;7rˆˆµûÏղʙÄ8.0;¹Â x€ 8ìm¯¨r¦háI[“ßfä÷ªeÉr"ùNRû¬ÌÝõVÊ›„a¦É)úaßÓ«Œï–C7ÞÖ eáT!vËô7?®§tmZpŒ “Œ¢½®2½$|¼ãßxSöGÃÜÔtÒt]¤Î5Û,ØiêãTElŸ¬/ñMŽ£¥ÕØwö5Ò ¯9Œ¯Ø‰§ÿx.ãiÑ_–KW7£Çâ7£,•…Îj~`¥Å÷\EoLÿù 1Mµ× ¦_·âæ à‹^²)€œÂZ:7ÔŽJ÷ÕmÒ½Š$ùù åÇ픟Zô¯J9e$† ÓåŠ,qÕÖ´JÈãI(ät ¤P2C<ÁìAf–‚†³••[ójK`Jß]4,t˜_P'•ætƒD[ûÉVI¢ 4›ðË€¼q¯Ô{dÛîô FÊù1Ò§Æ)y]!“w@X»\GÒ<¿cœ!f#zKð9™{»ô›ás×Ã¥6˜ý J–XbhÓúÂóòÒ)¡U4ðæ5Ö d=V'üÅÛy1§ºElªñG³$SÅ‘J½yÓX.ïgC¡¹ü?wkW³`"jYî»'†ßаS6£F‚4]}G' ¾–ôÏ궘ŽëoC›JÍ|U¶ö6úÌÐs:[&(gúÊš²qÁåCoä…ëyÒZ²¯’d¢‡µtâ=AD&ø`#×ÆÄ Vßœâ„/£ýè Ó½|ll óÇ/»žÔg[¤ˆðóCJJ·ËiŽb×jÆèlס+E;o˜ˆunš“×¼ú¼’µJiï»ùå–‡gÇÓw%ä/Xf_¸W°·kô÷×frÞ:m¤Zô`ÍTŠbž•ÿd·hê 2x!ÚæaÔ•m2qþö,»í(&§^²;ä¶(6à0Úô‰»iÇF‚ëvYÝ^oÛSëèlé¶yíÖ…LE«¦=K+4ϤŒ]\}a9ÏÄì¥Mç]‚T¡Q†…{Ɇ™ÇîŠO·ð~“® ·9‹ìûŸêwy^OÚ=}3¦ÅæÁ‚C¡¸ªgîh6Ož£Kõ׳”‘‡c\%ÛÚARŽu]¾ÉÆêÜ‚aN «šqP’.7gä¤%«ã;ËÙ¥l9Ž›î-Ѫ¾~°îrÚw‚âígÖ7~°õaæiäÙ8%î®á²ýCÅ„¸ç®GR%âÂ|ýLî²csFÛµÊêƒÞò}ÛØ;ôà¬{‚Iw–߇o‡7E4÷žõ4“\n[ZfFÝt¥°ì4_¯iرgÜt÷ùlZîÐ"ËÞ8>%‰“ªH /ä—M½Î\eéØzï'$¢,zJè$7L°•7nP‹s½GüÁ²¢`îAQ}²‚ó#CŒ¡ r—?v™9GYb:ñVâòQUÞ³Ñ÷u¡.°Dž Þ·+Z^„ëÏ·:·ÄïêOËÍÖ„Å冨¦63*_S&[h¿Àð’võh´%o§³ÁaöÊâkîÑŸùQ-ß ám*ؘ±s9^£Ø[×ëâ7bêm„Sʳ²‚õÒߘìw¡éd‹ãæ’Ð+õØ€‚“¥)cM—±¥IÅÊIøòäóËOzʱ&5‘÷lz5uÎHæ¹}”¯ÉmiÅ„1_+τަ—¼‰«šoºŸÝ×ϤfŒ{óÒ‚Þ‘ÇzàcnìǺ>:¤l¨B…ã µKknk‘ #Õ>²ðJ>|~§#@ª x9ˆÛ¤±ÿ3l0­éÐN£ ¢RµR8æYäÉŒæräšaë)MBIrFáv›m´¬vçɼ½"oÍ”4ñs?¸ÇpÉÈZ1Þ=:_«Ê¢'1ï0ài‰qo•9Âæ|sÓlÓl™L¥x¯’ˆT™*Õ£sô&‹ýPð8ì²Ô¡V endstream endobj 134 0 obj << /Length1 1396 /Length2 5974 /Length3 0 /Length 6925 /Filter /FlateDecode >> stream xÚtTTkÛ6Ý(ÝàF aZRºiÁa`ˆ†îFJBJJ$UPJBº‘”¤»CA…oÔsÞó÷ÿ×úÿ5kíÙÏÏuß×µ9Ùõ ùåm‘60$Í”µ ÍÄAAaAA!NN#8Úö—™„Ó†r‡#’ÿ+@ƒ 16%§DÎX‹I‚Å%!AÁ»"Q’€Än h HÌ„SéꃂÛ; 1mþ~¸¡<øî]ñ;¿Óy … mÚæ‚é…8†H(†öùW ni4ÚUòòò€¸¸ Qö²‘€Á€-Šl`öpÉ?Õ1f˜ÝŸ3fù(¸7`!ˆáüõûÏÛ ½l‘gŸÂ勞*ßÔïâÿøÞ€?Xà¿+ ÀB˜‡¸„ðï2ÿÀßà[õ ð¿.'øOEu„¸ûfxãðü‹ÜI†øw$†Ë0€ûê[ Š B1ðÿ·~§üßxÿ«Êÿ‹úÿ}!gçßnîßþÿà q;ûü€¡²# m$Fˆÿ5ý‘²6Ìîáòß^u4#y„=†âü`A‘?v¸» Üf«GCþéïU`z8Ã0=¤;üד%(ø_>Œê N˜¯Š;fa¿]0Œ¨þÝWEÚþRŸ¨A¡ >$‚’ ‰Š~`ŒLmaÞ¿ù €H4&À` ì(’_kÅÔÁœa¿öËAò¯âP ãøÍLç¿Ï¿uƒyà$Ó“H¨T¸cUxÓ· yf/þµ!‚…¥–G‰fÝÑ¢h®©g~Z„OUÇÜÚ–3 ¤ë}z9:éÏÌ»ÿmØÛ²=;d>M-¥Ü½¢pÈŸÿþüK»=ŒÍÉd?"žþh…ò IŸõúC <‹Û)&“?"Ä;„7^¯þlqß0¿»¸Å_)ØÓ˜Ññò¹-;8±fìKè~3KŠ*”E†‡‘úý‘Ÿ8±ð„3…¦8ÆsŸ‹„Ìþ¹¹¾ìžîtáãçšoÄÊ#©i|5Øs’{i“²5êܱ¸D¿*¾HM¼ÉXäÉ5ëR5faáHèbtJXäáÑØÉ(Ýë#5M£ƒB\}Òì?|}žqÊ ]kB¥êBp }âðrnè–OIRËzËÑ#Õšµ…©TÏáàˆGNŒaï!ÃÀ^·bÞ¼i¬Û¡Ú5Ý‹˜ÅöÌD×Føðƒú¯E•FÍg gµªÈüõÅæ`q…¾¬[*2>¦¢bP¼é|dº>õTõhg;dRÁ |BȲc’…ÿæ6–ò†Å’¶õ…šöqô@§Ø >(õ’ÍŒkM­òÊÖ üƒ+äg‘Õš­áþgdqª†‹‚Ÿ-/­@Ÿ¿|8Vafz®•ˆFJ 1CßÉF‹ ¬ï)Ø´ÄáTúͯ½ VÆ®"5¤é¨¹KDÕ?Š'ôª?fŽV•fºU»• ²ÏùÔXâèÛìë¶8Êv‡N µ¨v t¦€Îwû÷Ò%1¶MÿwµÇTô)týT9JEÞ¢Xй ¬“¥pœšÉÔ;—··+<2޳®äJ¸w |¨¨“ê«ÆÏA®»9îÝŸQ#Ñ7 Ï‘\õ´ã=C æl= 1‹M+ÌÆE§×yÔÞW;uƒ¤2gȵávHMßHH,v¬Ç©z^Î.ñ(“²£î6·/JVÈuGA|ìgnMy“lE?ÿÕáëSO™ÉÆœA4o”¨®‹ò¨wy‰ ¦åò¹Ã…òˆÌŸ¤Îë6Ïϼ–¾}° ‘È£D ÖVÝ\néJj8Ì%çDuAOÍ? ÕΜpˆ¨5éyñ[p3nBÄ{çEí`iZñ³•BÖÞöÐH«R­þóÖÄâ ÐÝæpþB×m—ó†‰ÐîįYMHò«‘@°¦^ë‹Y»~6yÝÏIå½™ñ„|ÇœÉÚ?‹=ûî ó¹²7wgf0 êi±ay!p|çüŠç ­ç˜¿•y•5y õBÉ!|Ñ|ZâO%’î½xºÐLv5€õ’¤$œòwq|ÆÈ=èžÁà,BÌÕáÓSsF;_ßc¹Í~fRšiÆ Žh³óZ $(Æí¸¢õÉA$^ÜúÑñ¾À°ÝQëÙ»pòœd Êq¯Û"õoCä~R(ƒ2¹‚ÈÂûÌeŒÓÓR‹—‡^®ˆ×)IÃüü-Þa@ßr°î¨þò|ñ[Ë—Ñ‘)Õj¢"]3"›|Ô@¼_Åätº+\ ( `Í<Éÿæ\öÔ€TZ\q˜©+ÂGÞ»uÿ ~bÃGÞkâDnš ®—ñR¤‡x¹”ÜIü4‘Â’ØbÒÒ ð®Ì³¹ç?›%«èñªw”§*hÉ[øý‘Ýwr¸Úò˜F%ß{‘‘4Ę$ì1õà¿8'T×Zt\~j3öÌÊ.g7ºÅù„½<¾úmÁìö¡R!Ý$F¹‰åkµ¢o•ú‘=" ¿_¹s; ëÇ­z×™Ú‰#fUCGn ¹Ò ¡ÂÁàYcŠ*‰é—œ…6y‹é³ñŸä3ñJ¼ZóâÆ…îyy²@峊÷ñqo‚çû³é¿~Rºþèý^Þ× |ôóÕjHïËY¢ˆ­®ÖÁ]öIÓ»bÊ·¥·ØR·;\ˆ¸xö4Z(† ½èDØ…‡kv÷Ê–†Þ±¼ZÌ­Æ©ŽˆL7nØÖH[s»–p¿Ü¼3|Î"Kãc³¾&#q\.¯VºÄ›åˆêñÆ{‚ñi}´ß/gfí ýû*T*-­9¤R?NÊÈËjœŠï‰:,¿sc-çý–·M÷Ã0³{įÞç"~¹ãt=«3Ïï¦ðÄÊ'Žœ>ª 8!¾ ámÅ'Kßñô”÷ܯçpÉÞZª=h*V®<ÈN™¤v"J´Å¥åû&Àâ>à~—ÌTmp—LϼÔpA=nT>š¯Qö€'ÊÏçÎèjÕS†Ï×¶jïf¼nLfÉ/}1¶ù,4cókroဉ0  4ÆM™îúsj™Ma$Äd‘~áëÞ¢ùµGô†Gþ²‘¥/˜.›Ö«ù|äÍàÏŒ!Ö4S4€1Ǧp–OáŒ}ñÇqÓ‚sÜæqZ‘¹É”êºEìÌÁÊ—@“£þ 2&la[éNŠ×QJpz´¥udEÑU`X+èE^LÒ`qÂþµ¼â§ABî<Âc¡™&"QY¥­o¶ôOuÄ#ð$9{û‹\Ê€>.˜Îóp`oªL_æ'EÒ›';æp*“'I~’§ º‡S¼:ÂÉε›7ú&-"UØN"oÒùbË6쇶AÿÖÁ*çVÚl¬Ûf_U½Fw<ö; ¬yã¯lVÙªMñ_{•ËÈ›¹Éþ´”R(˜î¤¨I$çÑsß<Û&nO«kyå㔸ñÌôa ^OzŒ)kSU!_º›‡í92ëŠÐ^Œ6xŒn©;‚ÇlXVìûŽ)ùêã~—¯„ø6e>`K!™ë‰›e¯:\Ã’>0½ºw2ɰ®€Œ”Qnºáj|Cô3§b¥ÉÓÖÎ׎(Œ^ ¢k¾ðº‘ ‰4jq%fŠ?9pÀ=‚YkªøØl´'V;æiwVkJ|=Κ’·ï-šPTQ*Z‹ºÖuÆöÖñ%ÎÕšÜe‹udã¯îœôj•ÝÐ}xóvwôM×s™<Òxê•Õ_ögãùØd²,›H§¯NF0ù!KþýƒûT ôAïi<(Å2lR«–n8¶1@ΰñ£\ß1¾!o]L'ee¯zsšQ úopÚv븟~%´Z4’¿WßÚåVßGý&Vµ44SµE”_Z¾átgJý•ŽË| IÕJèsË0”ÁMVùü×—ëÈéÊ, æ…`”ì\Ç}›TÑ;µ8?X•‰=øšå7ŽâX?¾^>›--70¹É¤a–Ž/Ä•#zÌ'êÃEX·„§&~ÇAÀâû<öä+éÔÀÿ•¡’œNLÖÎP_2Íkf¹Ê%wj NZUºq,öéùS:”2Xý¾c{JðÔZ‹àÑu‘l^ ¾KVý(yýýmAf!\ÿÙ´„Fæ—µÔéL—Bg_m|Œ%›Ïæ%~Òmg°ð¨ÀŒ§FGôýr”Øî¸õnK±]*nYÊ‚ÑÕP üy‡oxp”ØØýÍ«à®Â¶³òM:}P·Ì5l"šo0ÿœ(/h^·z"¾èîDPL‹í®ŒžI&³NrÅê©Éó=&®§wØ>b)íÒ!+ÏM¡^%ïtšP̘c+Ó¸b©Ü"%ÛÔ²gYÔÒý©½m)TÝ”ÃH¼lÏ6À'Ð%·âè_L$µœ­ë{ƒ¥­Æê‰CwÏr[lfQÒð§F± ‰•@{9kZ‰¯~'§Ÿ¼9ÇD’–ýƒ[ ÙæÖ£N–äáíŽõãœúÝ1WµCâdµ1ö;F~c¢q®Ðª4³^ÑÔÇBº¯„‰‹6í’Mß¾Õ>]XøN¤¬[ˆ]L™PZM5§7‹Ÿò*4V ÛFê¶(ëÇÃÓ7ïÆ©÷&ÈD;äµ/ou.|ÀyóÁÛСc)£ *¹ ðŒmtãWBŒ°˜H­UÏÔ¯|y©ý-¸é™©õOŠ*õѪ"]×§E¢mùRòH…ΞOwK¿<Ø6gŸ§ý4#xþ z–K‰W¢+¨çBh3†óŽs¶¸Û€‡•ؽ&}Ù­AíIù)nl¾T˜ãÏQ†÷~ûg» ~³›üQN|jºø ?M†Š¯bŽu%U…è|âd_»•qãÏÍÞe!ÀcåvjÁWørcU‡4ûº7?h ¬dQ š#«:ÞÄÝãt"Ö® [ôK¨u û„ÅÀ^ö1hCôÌ«.ŽEé,kZ׿¾Jj5¤%­­7rÑGevw|ø’üP4Å|ìPlêºãìà•Âd¤]»\×aEËš“ÙoÕû娆£ö¬-gñéžóý›#ìæŸúœ:Ãeùéd˜ Ÿ©¿§ÖXç7çÕ»WÇîÑúè°v§¶sÒï,¥àíÏŸ¾ß­#2Z_K™ü(B•e_FUK£P&#î–Ô’ñ ÛW"^W_8lI­ ù±¥x£'{Õw¦·uóÕ¤øÈqPÜL§ çГů¶¸g3Ý<ñ|’þ_ XBÒÐDUÌî >#¸à’@ÃÜüGf}Dð‡[Ó¾(•N?GUe+µØ—â!Ü…ö‰ÚcÓtÆüUox¿ÛºÑ WZlÇtZGOES¬6a¦}èé»’Ègo%WÂ+¤ÍJ «æ‡Cµ,Já/vøú:Ô½£.>­¤$?j‰ãÖ=XàÀM4Õ1Ú0Ëzy“K€%ŒÕÌï«*Ò±ùͨâÌ-W+Óòµ’ˆwZÈõ2æ&%í죶—%= öü)\Å7Q³}Ñ ž|ƒX{Js<ÀloR½B­™,ÍvIqÔüüjû~W¹.Šus?†ÿÛÁs4I.´‡óqˆ ®œ¸ž>UXÓšÈÏÌ·ø±ÄÚçb¡…ÍÓl¾X aÕVxÜríËou5àÔ^‘?Þ$ŒÞ®Ÿ.¬ÚáçOQ”¾&Ù¥ \O:½Gã¿X—ª#z“ú ¬b¤M~{¬IË;}ž¿’°F" ]ÙôÈt€Š™Á²4Jö£Ü­ŠÂ=ÝÉØè8ÐG2Êc9ÏOçΤ`á³=–?øû±*U‡ŽÈœÚØyqE=)6¿äѼ›n¥Ö),Ôë6¯Òtúaå…ûŠš[Rدc¿8Ÿ¦‡f#³I¦ž:)ÞÓî(ÿPÑ~~íË(ÐÑqûðTñ"ï²CÛÉNÿ.#EƒM€—la(~@ÜAˆw˜vSuˆM$áý'ÜÑLÁ]c]5ÉØ:«8Güö²Vq§Q¯¤´HãÐ%™Éó’äØgê/ý»‡Ã»(êÞO…+tùŸE½ûÞ]ô„"…¼ó¤øM:l[ãóF}Σx|¨s¢y¾öØ—¢™jqy‘v£½l׊ì\íá÷ Ú*Òºƒív£ gùS“ZâÀk©­½¼^ïB|® yMÙÝÂ+©ŽäY" 0Bd¼ÎåÐ2]éÕ Ân1KÁÍ•¸&èòà —‡e(‡,Éj0s~žåaáMÏѲå³tyò÷œhi‹*|¬ÌÝ{ä^Ç<]!‡ÈìÖÏ”ÁÄ3­Ü<{j<ö2›í~ ßFßæ5½<š6¦º]óÐè¢uy©?½´àf'qŸü=FˆD°!‡áÆÿÊý¦NN’GpöÕ¶‹½0cŸtsÊ-|÷IêdJƒ¥¶˜€ŸçÓÜÔ¬èÄwŒÛÅriÑpëÍÏÆê7þ1áå¤jé#fýf^Ÿj\ûRÅÿ©z÷aŠw¥±Ò2.œÌ‡®¤,|_€/׺*—™uùuDËÎñ±+UT[VršS[w/KRcxƒ4g¿wDYö:­ Tì’/±:šVBWüQ—-P eì×çŠ*‹eŸ<ï3}.Ï>m>²@=Õd1i°©î6#õ+Ha¿ñS˜jŽN€>,`dŠ_¡Ÿ/|°s>ójåÉ÷øÌ϶ ÎÀa ÒÚâoƒ§#ûœŸtìMŒ( »¯b¹Kä4w òø ½”i¤Æ-[ î6£(-)¹îü5{üš²¶=ï Iµ[eg.…}ÖPwûè–^T ñ% 3Y›‚qYvûÝEÇdºk)Ápq¦{¢lÁ4Y(…Õ®TóYiŸššÆ­¨T*ÙÔK‡! h_óxƒ÷ÎWCuµžãz‹ßêC¦0ÒV%Å/kjú“zP…«0L ¤ž-ÿò=ü°ÃéÖ÷úû¤p–s!¹„›e ÎMqøl»ßFe…jâ5“,€ö…ïÕÊð¯ÆQå›7RˆÝÊ1X?œ #Ö<’_Q¨wîõ[ww¾I=|>V†úǘ¬“`«£üTW‰ú‘:e*úYÁ±³Hžì§ÆóÂ[ºd¶êpÂ>«HìòVåÓ,rÊh—3»àD¶Y” å?À¯S m÷¼b=)¥ÖA“R”WP8–"heÙ)Zu¡F‰¹j#r»O“_¢´HÏSn:<%ñRøBt½û•m&jä“ÿ·¿¬>£5Ñ|}äœPË^ËNŽœ^Ɇ ,úCxî¬ÿÀHÙÚ窞Ö÷ÇåùW"O±hi.¥‡5pvøUKF»îùµ5 ”žZ#¡¹÷–C‘¡”æÇ555Ÿ7}P[í›öð饂Ž2›qŽ÷<%TB¹eEúͳ9lL±k_ú”lMDzHjTº·Õ|‡^Ðî/ ¬FÚEWrêièS–͆±¤G:àHšD ÿˆ.&ð©3“µH;ì¥H>zaлQFóî†ã ‗´|‰z¯• ‚‹«K&¾™Ö3>+°—ÐT¥±Þ¬f™Džø›„ýàyàÝÁºÛõr»½šxgZØå¨Yìù€ÚtÌoÊØðð|)ë¬eâUÄ¢§ã–³¦:ï!tB|ùdÿÊUj.Ñ·‹L½Ú¡¨PfW½M£š”•dî‹Áì¶ìuS|z¾Zf:¬œ×œñ”*]“àß2¢1¥>IúeûªØc¿ ³ãáÐ+*Ù‹}±ƒ¹ 2ÒÍôC}‡Sg²’OÝW)Ål9%]‘Œ6󬬠´,î%¯ŠX­&³Ue¯äÎ*/÷L4WNMa'¤£icxq~¼Ç;ˆoÚ1ßýR϶4úÊáõç"}>³¯Ðú Åã+ï‡û­N"7p¦sß{ºiZ/ç´Kó/–Ï:Õû…®Hóïtá¿°›Éœ.ì_ŠøFc¤tFûqmE-ñlê/ [>5„üY)~ç”sA-§ÿ‚4ià¥å–zÌ`Yº =ݹž¾MÝUŽPÖ¯ >vœ©l»zpßcJNxlIJ |U@{‡dßl­Ê§’%ï÷!jAxcj²uÀ-NÔºòUøöí‹ZÖ•E‰¢v8„ªÊY½4+R;zyrRÃ8“;Æ6H`FñúØtMœ£Ùª¢ÿSØÝ~c½Ñ¤j-›®i=²èºŽkt™¶Áé¥-<Ào³Yîæ1Ýü@ñ»ÜÿŠPpóŸ°ÕÅ É!†%q‚ »Cœæ‘iÇv®uÒ ×VòÉI¿“îøŽv¸ÑÿÕBuÅ endstream endobj 136 0 obj << /Length1 1768 /Length2 11563 /Length3 0 /Length 12688 /Filter /FlateDecode >> stream xÚôPœÛÖŠâ\‚…ÆÆÝàîNC7®ABp·×à Ü!¸»ÛeË9{Ÿÿ½ª{‹ªæsŒik͹h)Õ4Y%¬œ-@²ÎNPV6vA€”²–;€‹–V uýÇŽF«rƒ€ÿ¥r™C_lÒæÐ¡²³à­»€ƒ ÀÁ+ÈÁ'ÈÎàdgøÐÙM mî¶(³Þ:; h´RÎ.Þn`[èKžÿ|,|,º$An`Ks'€²9Ôäø’ÑÒÜ él A½ÿ'ƒ°-ê"zzz²™;BØœÝlDYž`¨-@¹y€¬´ P1wýÝ-@Ë ù‹Ðt¶†zš»/°%È òââîdr¼dh*(T]@N‰•þ°þ>ÇÃýíýG °ÓŸÎæ––ÎŽ.æNÞ`'€5ØP•UbƒzAYæNVÍ Î/þææ`s‹ÁŸ¥›d%Ôæ/þÝÄÒ ì…°AÀôü#ÌË1Ë8YI9;:‚œ ´?ê“»,_ÎÝø÷åÚ;9{:ùþYƒ¬¬ÿhÃÊݨívu)Hÿ­y1¡ýc³A<ìììüœü+äei ü#–· èO’ãóKþ¾.Î.ë—6@þ`kÐË?4_ˆ¹usùûþ›ø_„ÆÁ°[B °Ú?Ñ_Ì ë¿ðËý»½†ì/ãÇ`ÿãï¿_Æ/fåìäàýüÏ+j(*Éjè2ÿÝòIIIg/€/+€•“‡ÀÁÁÉ à{ùðÿß8ÿ=ÿtÿ§UÍüwuÿЍàdí ø«‰—ÓûO#OÃßkÃøß *Î/ó 0ü3þFì<ì–/?ÿŸ—àO—ÿ³ÿG”ÿ×ñÿ¿ɺ;8üÉ3ü%øÿáÍÁÞ+^æÙú²ÊÎ/âô¥º ¿Zdvwü¿¬ÔüeG$œl^朕ƒ›û/;" öY©¡–¶ÍÒ.ã%‡Ø ¤æ ÿñî¼x±³ÿîeõ,í_ÞÈË•ýI^6ëóÊ8Y:[ý±‚œ<¼s77so´— xA<_Ž—]µyý9â ›“3ôÅðÒ£?ÀÚÙ í‹åå¥þ0ý‰ø^ò?;¨ö_$ð™ÿƒ@Ëÿ¢?*Zý r€ àË8AŽVæÛI¸@›ÁÉ?,7Ï òv±}yšþQ¼ØÀÿ‚ü Ã¿àK=ŽÿÀ—íþË÷eÎÿDѾ¼Øÿ¢9@—Á—ZÜþ_Cþ y^HÈËâþCó€Ðè—ÄPOçÑ/ÇæþOê—ª}@nñÿs‘–înn/oÝŸ÷rËÿÁ>¬ ÈmnÚÙR(Ô®:´å¦R‚Ô“us„“ûUïYÔŠî† ±Ç¶z°”ðí9W^ô¬DÇäVôí*î>gñsƒ½!»½ÉŠ_j´ á\m ¢µÅ:‹ß®ÈÝ>DÉsK±½ÝÀŒËÉʆð¸Q£ßóB|‚‘ˆÅõts*}WN˜®±üú›í12}ýÜHL4òk~~. ¸ÐV‰ôÖrÉ*‰‰É6È™øÈa"¹ìîmjÏ 'ÏïÞùRXðZ*éÞÞ+Å‹ô=ÑÏ;]¼$Šfc€ Ú.™×÷‚/ZBß1X@†4Ũ…26ÆÎäÏ6b4låûVá{Rà¥V?R¬¢JdyYÐÿ6bj—.þ5—¬UàÃÅC_ÚUV&‡'"‹ŠÞ=‹*;~ZÍ–…£è§T50ž`¢IΘH-`LëWÓ<÷á·DŒq‹³H¶’¯j„ÀdÆ ÛÍ8˜.B«´ó[~`É£ÓRbEÞ¿Ù§ÖÉ'óã=’ç¤ Ý[èMý¸ À}˜ª#â¾VwÙÎÓç½ÝºƒÑ¦rﻧѺ"3«Ì1<”¨\Ìá5ï>±½ÎµÙ®ð‡ž5¯‰ûÓ%—ŒéO\f˜E* …ø-äBpÆÁÖMëdƒÆÏ¡5Âpï_û9dœè¦<‡‘kW YÇG¡—ùæ¸Æ˜X²„‰Mö}_3ÈÛp¼"õV³½º´»Æã’&©æ\CEsZ­ú-÷ E–Μz¼Ø>ÌÒ 'ÌYÙW.ÞR÷|ØâÁ3Üj÷€¼ê˜ßo¾­ç}¸lßüQE=¬,RŒlÍf{6Ñ_¶NØüJîÍFÃ~ÉÁÆ»œI*EŠ.1»ÍÈ “îH̾ÂÓœS9ª­Þ“¶I[9Ÿ^ß/8ßdåTŸmù^ôv­5¬äK»Âd± ¢î{òµ/H&hSJ¶ßÊ ï „þØä qäu|º¶m µú,Ë“oa@€òÚúØöŽ”5v”º•¥ð‡Äù•ÛoQ´ìÇfóÒß6W™#b]Nç0„â§WzuÙÅéÊ0ßa0< ¬*Á\Ç]:Ñ©[TÌ4 ¾×®´(L"3õ´‰YX(> yo¹d%h÷Å?ÚgÇþ¢X=ÿe ‚+3δ9ï~Ì9xÕW(ltI»’è4ªË‚Ïã®@¸B÷kÙ*O5ßZ·²ZfœrkŒØ¶ÇÅIq gq¶[’‰¨ƒ W7®¤zYR^÷j‡.Éìq×vU"'AU³N»ß;œB5n{Ô,ü\«ÃLJ[nKLMšŠ¬5:•Å@P’‚}c“1ù]Cã‘+wÁ_ÙÒ߬ëìS|þã»T¹’ # í¸“›ñ´W5l˜ÈÎ?~¬‡æ6k£ýU_û•UɘΚqy}Iž~±è Sчî‘4¸A[3ARu›/ùÛæÈP•ÕOýTMÔ°ÒL§4}¥-鸿½½rŪ0ù2ؾÞT3Ô%øû7dÍA°N”.Gyþàæö®òôù ¢Qpœw—˜ŸÚQªç%TGC9ËùÔ‰wH†Í¤ƒ_ ι¨0ß率g÷»æŠäA#)‚þsØ­@å9cëÃf$½9ë³<Ö;Ù¿YÀ}ºÇÙëpõÞd¬J ç?@“`÷ËfsÉÐ$eÂJGÅÐ|'ÿ­OM£|{œ{ÆAPÕ˜fÂó ¾2½ #þÏÒ]A£Ê`[¬,ý$7¹VÊä&o€@Õ”Û[XËŒZó:ŸÒògâÑÏ4âïùÑs¿fil×Ë\¨]ÔžêÚÖvÃÌ·úËb(Ìæ´û,Ôìl)øQIÉTzúKn¥÷´ì–³—sѹœ{„q« º÷)~öl½`v’š ðh¿š†:ÃdÖ ¦˜×°¼ò¦0B&ÖÍÔª€lVwžŒŽVY và…´Äw¹Š8ýC’f8ňßíÜwŒ ‚óÉQáyxŠK’ùëœe†Huƒ…nX”Å›CA˨AûÓb‰ή$;„9Âñ˜ ­ÎePFUŠâÕ0ä“bÃä³ô»oguF_ƒE4¸ˆî¬D)õFb÷š•ß«W#$u¦¬jÖÊaQ–º˜Ÿ$·á*nu‰éBNƒÉ.]2$.‹ðl™šJ?Xt+ìàž]™båWâhÛërNËÑmÆ@í ™mu„iJLµlŠ”ögëÝ.,}ÄŽMj'¼ª„¾æpV-î] ±ÎÞð}#ê1ƾ|7¼çö­ˆN=y†Ý°-m\BÙ8ÓzJoK¬ÞËøM4¸é&uëÄI[ôîø]î"íÏÆG†ñ-±xâÔa6üWæJlµžõC`óð°eùoeO»×ÔR1¬f6"$DÈåÖKŒhZ‰Õ2rá÷D 4wüg1YRô žÔNˆ@i|\-&eÐŘœ¾Û`šéœ-ÀqÖ¹ÒFGÏ ~+¢­à¾95]zÓ’,‚ßžŒíæÈá°¢ ËÏÁ'£¤Xv³øEˆ>•SÍXuÍéz¢jòÍÁ¨[êa6hU0/yíC:½ë$Ø;Œ`š´>(]”D¹—‰®æšOÁ,(Ì%K¾éfÏåIv¢ø^äñM4Ž‰Ò ð öÁ¥ž™n(`õx´Ým€Qè­PÓ—ñ÷«o9ëö~y³qÜ¢¬ÃЃr?гooÃïá*·BÉâÞÙt¬ôöîÈ2;ï¹%qMV—0áC¡zФîðJÙˆÓØûÁƒÅ=’“ܰ›±CjŽØݶ‘ ‡§vÃo?—oU4JÜB›QhÙIVûØÖ[b,ø»µrS¥|£XÔÜÐh©ÐÚzÓ8p‡»g¿ã\˜+jã(,ø4gÍmXß®UC¶ aÚéKReÁžrtœ?- ˆ¥…õâ°.ÇäG®Ûá=&'‚ÏÐEõR¸ÃÏ^“öLÒ­QA=Ú´¹Î\sšº>‚ìW ,ÞpÞž49ÊÛErø»>6—™ªqú-™ó ¼²¯V[»âv¾-4ÝߎÀ> û-"²‰CƒzžZà‘6qƒ}^6°²0Ì£ÍcØd:¹‡Þ9θ{Bqü¹v÷3Xðù±‘c2Û¢î•t¡À#‘ÿ ¬Yütû7ökËí† §\Å…«÷.µÞ`M±!WPb¦•ëÙ3èõüJ=ã­oìZ~ª¨3ô‡Žóôt?—°¥Á@w”æ©]Y]Pm´e¨Ãè¨cijðªxî!n×(2ò¼jª”,^p]êùCåW#R¨¿ì¢•žJSüϨ#Ïè¾­ãÚïæÊÅ–?²÷¹Gd§o™ ÒÒ8]—ˬ­qÔƒcC±;ͨМvð•°fœQáôž1Ûè(_M˜tñr“Ì«‹ ÒßG:ןÞG­‘c&'a9q3ÖÒðîB˜gkîÛlžòÒÞ£?>‡îµQVÛÔ¾ ¢·þ!æZãÙ IWÌ5˜º‡^_Ò!ŽÃe³SÃ<2þÖÿÌâóù¶Ç'z¬=y«°‚–ƒ29¦/»¾²&\—ÊÅ}ôäxa®áÆQ¼²îöðP‰'.Á€n’Ñð Z¿ö¬aÂ^=¬Å=öjDz‘¬¹§šZ)º>–¶¾¡\]ñ‹N(QŸAƒ_|8MdhG5ŒúP,‡ñxc˜ú3ѾL ݆lxòºFiëü꣩±6Ì›ìúÎdŸ=ŠD ­c’q»á£ƒ•º‹¸glòç@<žßm+ EÐЩAuסòùÔ_rö–#WkG¾ù¨~Eßoá•`±Ñwˆzñ=¤$lwhz±xr¼Dù÷%øù÷°8oò1+Kû##s4ªöcHxˆ‰E§$e¯4OÁ­7ÅëØCD<,–Gó`áøüªûµšÒúžü*®¥£ó!S@&H¿¬ÄÔ½ÓiÕ¼kKÄëä1/ÁL$ÐôKû'`´\Ê]>ìd€D¬•ü°żŒ«ÎØÑ&2fW ¥ »‹  ¸¤G|ÇAÖ8Š-5ÌæiŸlNÈibñSý7sçn`[[䦠¨„S Ëpz®‘Nï9vr `)gA+–E\+$Lȳ ýéºd’8먲ԧ¿e¢h•ptÏ4u¿dŸ`)âÓwri¾q+o6eFCô銻ç m4zW~NÎ$HEÑ}Ö}ÿù°=âNÆÃdÑüZàAå÷|L-Ýd…ÿ|uÊ"Ú4ß]¸ÈvÐï®Nª@3=hrP—°ƒÒS"å€Ô¾€^KYX\s<84¦¼Õ^ßš¸¬IT¬lçü[Ø`S †3HX·¶Ý®ØnôJt…<†&ern jfö°JISåO—¬È2cd/%õ ?,Èo`v8qÒ¦*ÉT¥|Z®ïrQ$§8£1=qÁH[â¡=ÑJXÜ”ègíRù ÚšN¨röòô NÙñøS¸÷©õíû™Ù*ã}O°cçÎ¥Á¢œ«5ËBå†ñl{Ñy…oø"™iE•éýžþ 0Qþ„V~Å:2Ñ8Ѓ*l všç#³€ÌØ/\N­n䡯þ-©Ú“XÕ&Ãðš)¼ò‰›Wg¿`lnE"„OÄWk8•¸{MÚáÛ¦ŠœàLbøWñ¹Â:NÊ>ÿ¾*önðÚ·Ú|ÐjˆÈaðz„¸Tìw­Öboè—,‘fü"¦°ô2gZR‡÷@ª3ÁŸÚDÄd×W)ÓfùÐ4ž `LVïžZîAêêJ|ûÇxsÍg’—˜ã±¬ø„é¶ù÷´»ÜÐÜ–8bz2Ák•Ω?˜&²Gzcö5œw"ßð߯T<(`ƒo9k»æOWªÃ&"ydÍ´¶)s‘$:]ß TÌo°8]“ƶäå—úmoôþ&¸Ôý¡@¨‡=Á7ªÐúíÒ´Q㘾ßì nQæ«»|o®ü±Rï¨Õ3â<@«5ÁôÃùûÑ™Ûyàw3æ]gç®×H0rþ\>4?Fç㣫¾ÈhÝ-«ø<¿N5îCÔoC#ºè†Œ,±#æ£Ù Þ[L ó¾ AÔVE5èΖËp„ÿªÔwô¼=sŠä æXñ§éx¡ÔE܉Å;°‹Œ{špRûS°ÇK%­.ƒh7DQÏœ“ú %ÞêÉPÿ0 Hå‹èÁ«®]*Ø™ù)ÚÜ;ŽwÃ"»ìtîml-oúh"¤‚é-¯€\¢¦b|3õ mD:f+ *é M{Fze&“ûîaxK],aHYøEµ½þ†ŽÝМ*TµžÌ‡gß™˜”¿‘ñ¬¸¯ÉqÖúyã­¹@Ï’n$o0iÔJºEOþ7ÝÈj!#Á®-‘Ëk‘Öé‘ÞÓF¨¨ZtWá¨o´¤Àã&P à³×_àÙHf&ïxüÝ8ÓÈ>P[ƒ`Ï/ŽùY1€vUÉ‚éúIb +qNz?²i—[E²Ôå¬cÝŠ5æcìòµ©¿(‰ª ö›X×PÂxÅ$pÑaÑÐa‰.}Ÿ7R# N×S’2ï"áúÞɸ—ŸYÇSßXÞo±ºUH›ªï3ÅEÈêâ׋ˆ¸M'Ügiá£KLKHÝ—"¾Ú¼qÎÌJ´ÃK"•7€Lºæwÿ2WHepG1‹úïJÙ 169GótÄö›Eð*Éf¦˜7†÷þEˆ×˜µ6‘ÒÇ8]õë|q¬píEVÞrÐÂî\ÓwfšÞdè ¥®5±gïQƒ£„ÊPKÒÚÅzü£Á”þ¸Ò‚êiaþµ÷ۯꉌdj°ðœ04Âz}-¶ôR¨ªo*ƈ1Ó(žk%œ ‘ÆÃ;âãøÇùöÉ6xN[N®oöSß—¡ÙJòטØ5íΓy}˜µ ®Vøš ÆíŒ±|ñ[õmñÉuþUÍÓvŒ[Êä„4|¤`xÿû¦'N±ˆ×Z©G,wê…úÛ¨ M÷»¡5’2»ˆoÛèÜZ ,P Vªjö M¸Ê XöSß–YZ¦ŸNm³RêË·`ïý4ØŽýeÙ¶Ç`æ¤Z#ÿmQ@”iR®]6nŽxÝWHŠä `©çÀaIŸàÍN¥û+ã˜rîDŒæ!·þ<,ª. …éëÉßåLÕ%÷CSJ©B.”¿…÷úX{OyKÛ‡ñ ]yXâ2uR¨âz¶/ÊÓâyëU[.s!î=„‘ѯxá |Uòi9:ƒ@£göÀ0úºçSoyY\|ã… 7Åx5·°³GOžyÌOÁÚ"Ô7ÇvC&ç}°1Oˆ¡Kš¿ñ› ©l¢É)X*&•àƒÉ†¾›¤Še&³Z±‡…ÈjáQRèR¡Í™gçŒJS2ÒóØ]‹¿ŽI45G`œI ª‘¨¥F_µD€s÷÷AþñžËžŠè«zh™˜Tašµ,QÑÕ—AÔE6óÃO R”³+°Ò—(dCiH2%^$sv´‡ãú‡=]ÇŠº gi1ËŸ¶s€úöPñ¶l6@ž³[OáêtVKMø@¿§Ô`N ˜ wmÓ¸!Ëâî߈©i‘å;Ï…¾ îK9ʧ××qI7Í%írL|Æe¸Gœ”ö힯"~÷Údf#3GS~bO¶Í²{^Eš@êdyL± I?Y­O~]ýn´Â—_‚7)IÑ@Ù–ô“£Ìµœ‹^ædöÕz¶©P3Ɇ;9jJ׎ÞR]n´œ’!šþÜö:-ñɺԓÔÂXÔÏìùìËЀ,d[îº^z~2ÃwÃg,›°EØ%nŠTð$‡hÜÙÒ„ÄåC+ÅbôÕï:;ŒK3‹ß.äϽvQ!§\º[D÷¢O2Ù˜aÖ˜FŒ¾fÍuZÖ°=KWï2‘Ã2G#¡!’Gb5{}’í¿„s ì›ïî>Rã+§½Y†Ä ©#¿¡œ„Œ“8ŒÇMûÖ±òˆYájˇŌF>ÒlæpÇô5~õX×!]¹‰çåŸ I=)°ºËŠ+ùV´¤Ž|Í·Xèʸ/ÆäO Ï>®ÛUx·Ÿ`üÄ‘ ÿg¯ÃE· 'æAdä¸ù«³O”ã„öõµïí«Ùp·C’õ.‹\$å­ _B©¬îÒÞü)ÄŒ„_³ewÉàk¿hÀ®âLI_õÀQf}±Îò—¾ÌˆïŒh "2tàåµG©kܱƢŸCå˜|ëÐaaÝ,Ÿ‹Bߌ~ÝÌœOšh¦¥H#bXc¡2Uᇠ紓iUÇñÄwVŒŠÈ&3+Äå ÐZ¦+"̸ÑÖz=©¾í½ûyŽó둚"/ÊÁ2ßém]¦·¼l†˜¥ŸÄÚ{Á¢ôCsU&`„‡*¿˜ðŽ_/ß ³0œ ªTÜì]‡î¥:G¹OÏL)e·‚aÌ lçNǺ Ñ~»†ådã&„ÔA‘•qk§#Ç X·‡ˆ¹fh<é‹é¤;Ãe‚bDgÏ¢ªÝýØÃ4꘺¹‚ÈRE#a'(´Ñ¿…–¨rÓ°£Ë×{~v-ÕpÑc}ÙO(þhiì”òŸkÚ—l(%ÿmÅo»¾ã°ªÚìM;S"«ˆ­«1º,ƒ«8x‹Ó|?#JH¹¡L0Po¦þAÕ\:QmØqQÈÇÆ ‘¸®á²„gœN. ¢JHŒ‡¥u†ˆ`ÞÍñ “²1Ñ ŽÓ6ÒA+>‹uQ˜¶›£T›XõVô¬PÏÝ-\[(ÄìËÕ¬ˆ:‡¾FÊ;N©Êùt+N‚!gLŽAR êtÿ‘×LÏ÷cñûuèL:ë½Èî—η=\Ç—¬úêx‡ÂÒï…ã´ób“.¸Å 1Åì¹.ØÉ&©z¡h‘Õr†¹ aüÊžy%9oïjš¼4ä9Ä2Ÿ\棃±°2 1‹EÈd­‚<û]s. e§œÿ¬‰˜N'ýºµãMãX-ûÖoH3†jý y§M±Ôª¨?ÛÑ ï 0ö·1<">ç7½÷Ë"µ×|¢ÜÌ2£ÒÜ_¾poõ‰ùÖéŸÆ+¦èÙì¬^«ª0„¶ØÈbÛüºµãý¹EÁâù£•±mO —PHýø°ˆÎ’X~ÒfõO*y5Å4ÛšÒØµ„9NLÏ ;bFÊ¥² AÉäÏ2uåEëÞO[¬ö y©÷›)³ë¬ƒòWo™+¢zçýŸäÛ ¬4åc ?¢‡Å¯r9µ\<Å#ÏJHr˜¢ùf©ÀèÎBÚ8élÕÛA6¼Â½]žx*¬5EÆ›bûk MùƯ[#zsþM®»‡i›õY2 Öy! §åÑÒËK~ w|<Ü¡±´Ô1èÍ‚ž©<ƒ²²92­>‚n0–6¡?G}½‚ªÈF'"’gª¦¡„ŸÊ¸–ñ Í[úñ*Ò·œ¹‹a¦åÛU·Š>d}2Hbú‰ñˤF¾J£]³zظƒBöm»Ù¡%+lu^?ÙpâøžAAÔÂÛÏA°\+q& –Óïh(ÛmðH¾&›óm„¡qOCÜ;{UíV*e¡@W:Æþø³Œ•ª˜(e*³ÅÄ™¯8ÈõYªpNøBå¯SÈ5ú=»’GÎêž„8Hý\ªHCí;È9ãž*f$ÛTÊ× £h#¼Tþ‡h‡®å§x}Šá_Î9iE‹¢2QIëê¡•¨j‡\C+äÝÃZÌôç‘1< _›ô9çKQLŽ*ç44.„Ëš¾Í&dYYä±;õ4®ÌDÑïÒ)(›*'­Œ ¹U“³ÅELºÈòéŸÁh ÷Æ{¤p~ÕAÞçñlØe­®€0 5©eãØÁÌìõkãz‚‚̧iÒæ˜+}U7Ç߉âkŸä»æäIûi-ÀX­ò Å~˲^ãº/ò$$ÉÆ¡š$”ê¶“˜øõ傆<Sõ÷@%û½ä™«V.!K'~ ôKZzI ázÐóðŽ> Š~àF…‹xfÖ†#,xÏ?$$_µ >5QÆÖasÔžª@_ÅɶӃ”}zßèŠGH<’s…¹6¦E™!hƒi }D¥¬—‰_NÆêÜõ¶ÝósHñ8ÙhK3‘¥u¯…؇­‚Œ‰:û,ØÅfx&Ê¢Õû¶É V#+ñ»'èØ«ž†revT^1^jÛé·ú ÖÉ¿æ91e"÷zÓÕ&äì4™Uýd{ä >ßQFfŒÔÝtZ=Þ9LXƒ3bÑï…À×ÓþcŒ®eÝóÙUy÷Î$çuGJù¹î‘®Š¾£Š: ÎY±Ü˜òæ&ý¦ã*Œ(vÛ“•ÈÜ€‚½sVZ°«y´çN‰RÙå»Å)!ÚA \t å#TéèÜ%´wý¿Mç–­6Õ (C™I&Óú ùÆ›ø¼ïÌt”ó°¢4œ£‘Œà¾'IŠeÉG³=”n¿WýE£ÌÓ$)ŒòKÑ‹ÚêzT13pZÔò¨ÅŒ¼Á_jcl m[¶[v8TÊë%NØ'`HÖ©^/Aêr'ñšÑë $®3“Æ+ß–Gu(NÑE8•*!iÛ°#‹É3ÓTÿåÀ ±PNhâņ?Çý(ÌÅ'½¿ÉÒßÓýΈ–\dÅÞuzq`„Ó/…wÍw³CŽ2¤B¾N>tÊRhϤbÀf,+@ô}d&j¸4)Ì­$V¹–qu€Ž·[ÅÑö …]ÀÙðI@ÚòõJòeþ‡R¼ŸL· á,R¸FÜóÙägg0¤c3”×¼b7 ÚåwÕø5¹¡d‡…Þ<ß)}(ýâÞž ?|6¯1˜÷6zD^*1h­k¯¡}×¹qX1’sÈ'”ð$×VÆ–XNHæJæ¤|§_i¢C'Þ–ÿÖE©&.ªÎt®JÓN3cÀÊ‹ß˜Ž " ‰† (¬µîá+-é²YòÈëRú>Z+øÔï ù%ÃÆ¹cŽ÷öeæØZº¤x¡`ø¯»¤†ÉŠ;Ãù2©Ó_ßöw†$º/”ÛELíz%c#®ø4N'EW/ðMw•ÒRqêÒ+ë¿NˆJ¦|6µã©hà‚yš ÄðŠT?‡L5þSꟘ2¸ß™ïç¥r“ªçd 18«ìP}4¢Ü ƆdùZ‘ÿXöê6ÀSCþ ¸„·%ˆ[1~ð|ƒØ€ÂcV¿X,¾'º"#5’È1{ñŽFûHÕûáÁì~kl3æ 7™²‹ÀãCÖ Hø¸I¸'ë/²,ÛчŽu¡ìˆŒêj/ÃÕ¶Uý%8:äç'Û…šôŒ­^Ïþ«ƒÐ÷l_s&¿Yu×+sx µ¢`>¿o¶Ðá+µ•ŸA0Ɔ“}ðúÒcSoYt/éV»ÈÌÕØ™ãë€T $×¢Ÿ n±ÏÃÛ-Ås¥¶)—vÀu¢^º›3ft 'Œ]î·V]VˆÈoÙ_2¿–#¶Î¿3ˆ·.l{ž¥À¨Ì~,…ƒä›:¤zyÐâ‘EÕFÔum%R†|(EñÙFÆv$´P.¨Ž£ž³’ÊGZ³}ÏæC¢s„³?0.Ùü–h¸Pmœ cƒ—õóòÑ¡$’áß%Rí.Ði©5ê ]À‰H4 x“õ:fýÝöñ⛉že¯*æOE:ÇèYÌèlÂ.,N5Ò3XEö«­‚÷ jò·~4Ñ‘ž¾–Lšd òÛã[ÙqTR7|´Y~ÅÛax•‹v*,À«Ç”‰8·m`7tf`Ï3xàSÜ2¨Nº=´5ÍóV›Íœöò»¡ŽùJÒŽc€õF“·á±tŽ˜,¼ÐA9J®.cïµ1ã|^MÅÍUÞm¿‹«¡µñ>/mÜ\G…Ó§©+è°—ñéÞí|mhŒ¦?gLªÅé]¢æOÅûjéþW¼ƒèánFw±å5ŸS‘)0ÉîÑ{|6"îTÍR†ý5‹#žr²”jŒ¹§l•?¶U+3Ø*é¢n•]+é¦ ¨&ÍSrpôÄ;ú«-QÇíõç§7ʹ¢oyã+4WIËÉ’3ö£žcñéÊç ͤÀJ–c+zJ°Ï“15<Ò”w^ʬ*ÿHÂ>,XÛÊ…OYmÑ]UBQ!¶2íÓßûüÎ`±H k+¯:„Êò|—.aa¿ò9wøè˜¯ép͈éˆþàv/GV~Õ³ÏßÎýáB”X⊊|â!nüÑ¿.¶°©âQaû¼ æiŸc¯vUQË|ó(H|äçØû;bñjffýzýÊW“Œ=ž6m!T˜Æ…ï³2å¶x1í‹Äë³[& ˜ga[ùèÑØOVB…z¼ˆj¯÷XÇÙˆ© jî¾§Ý¥ÏNøä[¤Á”¾2žÏ ð «äeÝQ­Í¼LÐâØèzÖ{#ÈæmiÛfâz:¾zÆÒeW¼²s÷ójÒþ>ËU%2#Üž˜’P?Ìn4‹Ÿª´|p£ƒ58›fh€wg¸7Ri·ÔoXûYZ¦ï#­ˆ4¶4{5ñ¯ã¡AÁAñXt0Ú¥zÑ:·;LQÒU±¾TmyÊ®åäÜpu QÑœ$—Õ3»ôàÜÜž Ü)6ÙM÷Jæn.!j:Æ$Çöøkâx·°’Û*w†nŽ{™UF7”ÐÐo»ì)„˜V§Ó•Ø)=Æêòo#R—·¹¤V‰óvfk2j™6 }t=Ç¥A¯ËŽa´]<:<³Bp¯ü¨£?ŒÜi(1#€Èü^A¤ î5ÖnÇR·Õ6Âã‰j‹ÙÙ¶8¬Ú&ú\°â¸WLÈ?ÜšL•W©^ÌZ œ”(P¦áÿ&bA¹Z{cbyv¬9¨ÕdüþJuVQ?Yï÷é»B ÚéšÚ, O†¼ÊAÜ1Ó I‚éìˆMD4xdêrÃÒu™ZgyšfÕ-I¥'žšIÜCÌÚ)¥—6JVEÃØv=w¨`2Îz…³p®Y“V1ds+8÷‹‘~ø1ù *þJ;yMtˆ¡ÉÔíd‰\½EÕ6!à<‡Ô°êm :2Ì"ßõÂqòÕÝÏÌ™ŒÑ^§v#…äÞ •9@£~ÎfvW1žDA#v72âQõˆ?òí+—:NU F× ˆ>çãê“Á&5¦uZ®›€®;Wý±bGUå»­•½7–ˆpba¼ºç2Pr¢É/ÖDŠ„C?{4ÞlK¸·…F6<ÂmxäÉœÎ#O’K0”³zh­Ñ-âÂSõZ_èíPë¸!L ²$HÑf9úçÁÒÊÞhTÄ{n™kœÂÀ48ÇuîÄ…ÿ„¡xMcƒ0ól Ÿ&К}ù\V¬Jâ๯W›¸gX*ÔrùÚ1÷£¿ŒÛÐz>LZ­Ôl&é¬JóÑñÓœyÛ N 2Å.”OMÃU„ Ú¡oxµù±–*_A0£¹ý"Ø’tK:0G%ĈuãФé¦݈=ý‘5ŸÈÊ g7ŸÓ7ô Á¡7س®F ùÝ›¹¹}î-abüÚ8’ÉlÑu¯ŽrCjPà7ñQ,ÍÚûIŸ˜, Kv²N5{¼µ´äJÀ¶×T)}®¥ðYŒl¯ÏWØSò Øã?’O¹ÊbhVÐR:ªÔª°…¥™r„JžäÚØ#+|5ˆhž}Œ¬ýÅ΋YºØ^if—GPðþëVòؼ彆‡9çpÀ€­¢iP’!Õo˜oVþØ.”¶ˆ#;I§Sªé¤{4IN¥éc†ÁÀñµQ®²³ Ik%ñ:è•€Äó£#z|IüŽËõ4ÕZm$v)ÛBy˜ÖY¨1Û@‰þ7.Ͳ‚}Ðmä~\ì7-ò–&¥w$OꄯŒ—mÇ,WœoT…5ø ‡lƒ\dìÕ/ÙÁý5+7…ŸLn*$aîQÒ#½Ö }Ÿâç ¨SòøV. jù!VÏó0Ô)wg„ïÇ{ó9hDÉÐÑ¢þ7gY<-Â.i-Æô ËInÜwe*X.3¡RDôülw²ù¤zc^Ö¹x(SMdpÑ”&¶âDÚÆøÂÚô”–‘z¢µð¬ø`˜4ãÀí/H>êËSÖ`å9™=$w@yÎ],ÑkŠÞ9Å÷ZÒ¼VZ„Ù¾Q§òÏMþ8éqå /U…ÖGø½‚”&zEïqŒ™ìgï{zF?‘¢_Ü;o½ñ9Þf}£ÕWB‘Æü˜8©CàKKÄ&£Xñ¨/ï¶V‹ò!íJ÷¾ðA.Ê Ü‹Tá6f²œ MwãÊÒEMu÷çâŠÈÊXWÃæ(»L¸oÈæ™÷¤ £ŒÚï#…ï¹~nuÏÓEï¤&NxD?ÓÌêZ=:Swë©èOjÏ[D»‹—C|žþtpµ/¥NP±2ƒŸ²T¢ô y¯¸[Íš8ù{tÝ3£¦£yq¸ôíz³†Œ]x*k»Â–V³¦IÁ“¢¹0á '{íªf¾‰ÆÙn ˆ´VÑqÔH6f ¡„L“»óV¬vÉ\6fâÞ'…ÍÇNê°‚h˜¿ça3#{?¾Úšür¸¤ëü©^ìÛ˜@øYk±Ù å/£Š¤º•!„ß’†=(¼ûï\?¼’¶ÚÂÞø¹÷ø:[$Éú9B¼A endstream endobj 138 0 obj << /Length1 2745 /Length2 19377 /Length3 0 /Length 20944 /Filter /FlateDecode >> stream xÚŒ÷tœëÞ 'i5VãLlm³q&¶íÆ64¶ÓØvc«±Í&ïì}öÙíy¾o­÷]³ÖÌýû›×u‘‚2 ±­!PÌÖÆ‰Ž‰ž‘ ,«¢ÂÄ`dd¡gdd†##S1w²þ—G¦tp4·µáþCBØhࢉ8emmRÎV&;77##€™‘‘ë¿‚¶Üsc€,=@ÊÖèG&lkçî`njæòóßG¥€‰‹‹ƒöou€ 5ÐÁÜÈÀ kàd´y42°(Û™ÜÿÇ%¯™““7ƒ««+½µ#½­ƒ)-ÀÕÜÉ  t:¸¥ 3°þ“=@ÅÌÜñ? e['W D°27Ú8‚TœmŒw€²¤ @Þhóa™ÿÐþ)€‰žé_sÿhÿeÈÜæoe##[k;wsS€‰¹ /&CïäæD 0°1þKÐÀÊѤoàb`ne`ø;t€˜ "À”á?ù99˜Û99Ò;š[ý•#Ã_f@eµ1¶µ¶Ú89ÂýŸˆ¹ÐTww†škicëjãù_dbnclòWÆÎv ª6æöÎ@I‘d@$¸ß4S €‘‘‘“…´ÝŒÌþr ânü›Éô”ƒ·§­À”ÐÛÜúót4pœœÞž2þÁ11ŒÍœ†@Ss¸ßÖAd É0¨ÿænmFÐø1ÿúüû¤š0c[+÷ßâ·˜AARFPVšæŸ”ÿe Ùº<éXtÌ,,6;;Àû­ü›ÿsÿ›ª``þOlØ“´1±pý'Píþ›†Ë?sAùÏÒPþ׃œ-hšÊßÃÿ™‘ÑôÅôÿyþVùÿ7ùYùþÿ‘˜³•Õß|Êÿüÿð ¬Í­Üÿ‘M³³h3dmAûaóEÕÿYgY ±¹³õÿåJ:€6DÐÆÔêßBš;Š™»ÌŒÌþž˜ÿ¶dÝÊܨ`ëhþ×y cbdü?<ÐÊY‚ÎGP³þfAõ¿EmŒlÿZ=f6v€ƒƒ;#h¾˜ÙØžL 5ºý=Úz[' ”7ÀÄÖ²³ÿ"ý±„~#ƒðoÄ `ù¸ ¢ÿ"FƒØoÄ`ÿ˜ ¿ €Aò7b0HýF ï2¿È»ìoò.÷¼Ëÿ‹8AÞ~#?¥ßäOù7ùSù@¹«þF ïj¿ÈŸÆ¿ˆ ‹Áo²bàhdnndî`älý/‰™ý†“¹•1ð_:+ó_dÐH™;Zþ6r`ø‡*Ȧ¡ÃPà†F@+ ‰Ód¶ÈÿY¬­1ý‡l túy.–éÿGTA£(#[+Ðþ3ë_këßYÿ5 ÆÿBP®Æ¶VVÆ :¶~§ šGàÿ8eÿ‹oï Úòß* Ú˜üV…kbîò‡¿Ø¶Îú‰˜þ¶â›þuÿÅnö;PÅÌÜíÌ€6H€hæ@P¤@P·-ÿ€ âüŽ˜T«¿6ò7TÊ?†t 3üvŲeÚäßu¹¶q¶6üë 5ý#$ÐUÁ`û;hMÛ?´˜˜@‰Úýfƒ|Øîs›ÿi6+Ó?Ôÿm5è`°:€îí?DÙÿ¦™Ûþn(+¨°vVÎ$zça°ÿø_Èèø÷Yõ¯mÖ¿ˆ¶N@cÃ?šÊ¢þÑ&PʿͲý…€.´ƒ $îºÿ°£•£Ù&@ñþŽt08™9ÿ˜PAœ\mÿPÙpþ=í Ÿ¿î8Ù:üYUPk]þ€ ª»þ±k £n@W÷? ¨#¿cYò:ü'‚ÿ9¡œ@-qúûßÿÅ¿)n@#¸¥y[#ž ‹Ú ¶‡jA\WºÝ‰O3d»ê©TtžKíÎOˆÐITU™w‚IÃ=È«;¢”·Ë„¿<›ë¡CZ[Ÿ½^ô┦w[á§0&óëúñañèTö¼~Ù{©ù[¾kï”"˱wæDTÈC{píw«ë/] žßUÜ«b—þðRúƒ.J5ò³Ñ,Y®aÖ1”> 5ê…ÒìíÝ jöä¡T œ÷IK§Ö&sôãœÇZ¹ ³c6)¶þ»[Ô±irO¡ƒd© žÅ…‘Ÿ¾2RуmŒõzvrkËH¢~d´rXâ#õn­cð×è…‡ÍÜUÖ·£®µ;F\À¢1quÏ“ÿ^ا»7{ê@c,ë-çî¹·µy«y|+}|Z;©í1¢m² ·±Ú$´&ò+ÄÞ] ïf³Ë+ß"£„´Æ³×bòÄnÆmÏM¹} LôÌ:?) -?½‘ƒl8î¶õ3lW«!ìçn*íaìe1Õzû˽WÖÓÜ1­TNégWW¼w«ÄÉBI6CÔ&B £¸S-ŒrÄ´pÚŽìüùáRéî©ãJéV±ðqÙýûn½ÒÜgcSšÚ§ãOM|Çá³ZY!¾ß›RÔñÂånÑÃ%Ø4–wxµjòòsCúÀ1qEÇ ´G'Ès¢$?ô°ÌÝß!Dþ„JFÂ2³³4i •Ó®È$Ãz¹ªëá7UJ“.©Ó åUžQøÞõ†S^ðé¶t[{ ¯7aI§šÄ'uLk¦[kÑ}Äm¨*²6¤fÐ_\D;næ,ƒµa·eއ˜ ¯õ‹‚÷£wGÜFgï´Áí¼½Þ¯‰¨œåQ †5›½(Ý£‡טáÙ¦j7ëïs˜{š•)èc|'«ô»hå±v&žŒ"]^ìeûÙ‡Y<:G Uf^“SôEJ‚ëÃÕÒ³ï¬3­îtWÉÕWý>F¬ z4å]ü²ëÃY;/ÃϪOéÄ]žKf‰“ö‘Ä .àÀTá\•}–W@ §ç‰^‹”¡1Ö¨ùÊã]ÿð}Ï¢_SãVtÁ¹Œ°íÛ`«ÝJ¬d[áVn¸2ó¥$‡ÃN±=Š•Ñ\"mvŽõÂYûÁU³½79ýëns›¶ÓÔá‘äåo‘õ™üf7iáß 3·^©—ð!HýàŒ ôÃI _à¿d„qû#ä\–PE—x©NŸ”Gš|„z,CiÈwz@ž5Né)ÊùTž‘É6~ÝæKƒÛ˜fÁÑMvl.ð–‚¹6„B… >:ªÂ6eŠ£º:%vXsÛÌ”è$:ð£i-Oa:Ïï#vï·Z1]%þdº¬¤¬«žB{Ì hÝL¢çHj&S×û}æ®\V†Âœìï,eÛŸ«9äÿü0Éö–™¯`-8;D“£¶0â±6ò->Ó0KŸEW.[Áާºz§û¨/3uºdË‚k¼, ZÄ©A^Z²}: ÏÐÌ=1'Xr½õúXŒ•ì"\¡ô؃¬Y:Ô Ü–‚–'ê*{õÈìý&JOÅùM0ÓIŸ&eÂöhé(¦²Á/Ð]Èëշ€ºrÜx_õC,$4½“$ž™}ÜÂk(5ã»û3¿–¿*¾ý 9ŒAUØ~–¡˜M¤>?.y§Fm¯¨ 6Æw×Ív‹¯Ï‹œÐIê©xö"2ýímÑž«§úµè CÆ®‰¸^ AâRo M™Z¤AaK`i‹²ùœQù›Ñ1ZÈc¡Ñàù0¼žU2vë(½÷jTdh¨[–#«,A'i*¶ù/Â6Þ¬|MZoCÕž­»UµÞ¸DK³çgÅ+·œãX¹–ù6õm±í;Æò·|ݶ“c”¿xešp.”ówi\Ò; ¹™ˆŠ¾Ð»ªó<I³¥í‚ýX $ci)Ýà ÍecjúB nuèUFÞ†ë÷ QvÈ€úÛ,é]~§ Éj#ß ‡ê‰Ñ¡ïxo#tEzˆÍw9¤©´ ¦ÈôýBõõ²Wèâ¥7µUø’T9g(®·e$V”wq$Êéž× „b„ž®pâ ‘mD[ù½D¯r#­W<¡ü½@&-?AµŽÇMƒo@·ä]\CþØ}>â Œ$ð·ahÍ®/çg™óÃU M…ê­ Ñ–¢¸T‰IUñ£jÛéô|X~?b7a¹Ø3Ñ_|¬ Áé79—à‘»¿Þ!Ì_ç÷‘ðñ…›@:‚§òö)WýlL#1è’t1„û£á0—ÝN½˜®qºÐÁ¼”%8»6 õ)+QfÔ´»&˜>…lÃ/Êw*`ªNGdÑÊILâüTˆMð"‰!ù÷)¯EäñJ}¢ƒÇtŠ™eüŽ‚ûÀØ!á/ùͨ8ÉÇ0„ Mï’ˆ>¶0†6\8!7ÉòöG¼Ó`÷hgÚ e'Åhò~öWçÝ`²Ø5ßæ`ßÿEÚÁZ¯®¯ì—ÈìÒºLäª8+Ø6s¯]}ºôÆo­-¦ÜQg¤O謊fZ§ú`üŒHr=" 5ÎÓê§ óµ}¸á²S ¼ó5éå ©Eòm"ñFV‚ÿÝŽ¡PöäÄÐ˧×êŠøä×õµóÏ<-ðp6[PFÌ¡Un„Pè9LDüÜ›[(ÍɻȘN$½›˜üdÍÓ÷I¦AáÊ@môlà8ØoÀȆUÊ“È ü; º§/0A}'òAì.·Îù±†°ý°ænõFkú+¨ä]ûxˆ’'GP¨1Ø1ËÍz|(0þLÊGÊÆïoÀ°v5IϾèSå÷TÜN÷a-p¿Ç<ëLBÑù𠄪3%&Y©bév‘aajøU"Á†ž’®{û¼,>r "…,ßξ³ô†Ó·œO÷ÐÃvÙS7~ÜHÇ!c›Ý¶²)¸¡ù6wh½ÜI"AeUø×ä IžgÊ~Û_‡ó‘Ýý{“P¨­Œ‚Ÿç'“®ÆrR €ØC¿7õm Ù#u"êSé““±cf†0¸œ‡QckzÑs›¸Ï¸ïbÏ÷¯@Àsþ¬q*xøŽŽ¡£Eç÷`}i+ Ü/ˆB6çOR*WO ¡àœÅš[M˜6ßѦ&=_jèü‘Úž`¾:½ýðVx9ItêÃÈ+’r«Kâ\šQÂ[Ù¢ÿøÙsDßyíM#—°¡è†ì°™¥;4æå GÏç9›€`9)†£×ˆÉ«´_9b–åµêÞ_uÈ[t¦´ãTn,ïÑÔC«qæ¦KdçÔR"¨JR“¯»7¡K¥.5Õ.G38ëOº˜ºA“HÉ0aò£ÉÖñ£÷g)v#âw4›5MÍd;Ô·W}à5µò‰:O‰cÓ¬’žü䯼{©sl 'šï§Í6'á¸ð|»Š1pÄpµÝ1f©†·æ¼gúÓ7ñWnÄü²7«UÒTâ®ÀcU§ž¼äF3vÆ$ƒg¬.¤‡;±Ã8–‚ nnûá*‡ÔÆôüåCÐÂL×}½rVÉE6®‡'vó±aCÁŒ‘¥‚!ŒÏ€?Ø"cnMOïCá¸îŽäLQ‚Jà÷¥RÒÚ‚€â†œ!°ü“mrÑT(ÎÁYXWÕûÌÖ”Åå>ÚÌMóÂMýfjࢎ&M”ýl\>uS–O n—Çj ﺻ¿êžð”@pŠæ·`Ül–Ñ kç¬à ögoùClQzÃ-”¹fŸt=–pµ¼ú3ì¨z\V¥Câ|ÌüÚ©†£‹-DD„Û`©”hõnòNŒf/u-ÊÇ £) Øa½ cùÞo{#AöêÁqWØU«¿r;~$ƒv! &–åƒ"Hu?\Ø¶à’“üü>u€-Êln ‰îsBøãOÃYŒnÚ*Sy NŒá—¡ÒŠJ¢8¢³Á<ø¯_˜0!;Á™#¾Ø×Z«}¼â™ò;ŽGâÜ C?•ÉÄŠ¸‰®v sfL÷u<·ÅSïëu í‘x')ϯ}ŸºÙÄ»>9‘õb &t?àêÁ§ÐX•©{˜³Wë¹8¨É¯`æÀǚ@%ïg”šn˜2¤¹µæVËMŸ̨2ó_™ Ÿ¡+ú—¡“ØÁykJBKk<ö‡ÒvÌÜ ¦ž+)ŒB+XšóÞ««€ï&äÇ"lë‡:MȇÆ+ ¤[ÅÜ©xRfTù0N@6$´¼›#—_Ëÿž11ÅûíôUæ¢>Q£¾ayýQ$Ñ@j—ÏÀÕ¡u!aNûѸ£4¥;qߥР½â¨%“ ˆÑ'b¢DÓdôIÁâͱlE#Žÿ5}vÊÚ:Â/}…G´¢Jæ¨O'S«B9¡§º&¤ @r;Ô ÝYtñ0Š__´»_ÝÕ:€Tjµx[‹û˜¶º/¾ RfGÄ| ß»æŸuw±€ûÁiª˜"§BB-CÕxcªäª¤N„„f—MB˜`dÌšf¶Î¾^hêÑ8%2å2S Î#zn?œï.TçÄ•{(P+Ž–¤(/(íSî[É~\Œ1D³)A‡pmwÖë/z‡…ǸÅR ×iÝûéÃÁ†¯âåM³ÉÍvÜ%…$¬d^ë6ÿ0š½EéeÜHôqúL-Íׯ\AÔÁiü)‡¼íÖvr‰©Da®yk‡÷^½µ¨×âdÜ!WR¯¼ë”e¦âº=}õu>Un ‡Pº~ÒÛë³Ø»75Ÿ4¿ˆŒ&?|O$Eç7iâ HYNßðFiŽ×ýi{ºÏò’I±M£òèÅqë“íöÀ%Ö?5’HBw†;OM4ß1ƒã’sBÁÆÿÂÐêln´ç8þSÊÏÎHË«±ý=©ðö4yøð"ðÃâ{°çÚÍŽ/Á8±-MÖ;uèEe<‰‘T©­¢¯‡T>oèd™E†Ú(òü½—ý<ÙJ®!̓¢lßø‰¿ªïzùñÌUJ²ŸEA$j@P|6?~¼qôfŽÄöT¤rÅ‘:r‚ÖØŒÆ0gqŽTBePɰg‹3ô"ð9~Šç=d~îâÀ6ôþ⟆S £1+ϾÿÌ€L¡ÏM89{ÙQßYWLÐŽqÉi) Nz+N›ô6&«ïî-~T˜ùq„ŸÊ(~õýúurúÇ–ô"N¡‘öh+ðaúUxÛ[‚Ĭ9çP8é¦ eþqF-ÞRü¶+Yݯ¶¢[ó牼¡Æ@i]ŸÁÍ&?X"ÄŽM^kñf—(wSF.¾¢zb¦ÃÂÓÏÀ‰rÉFxeG”a!I•¦È¹Y—+Ô%àAC.!¬R«¥‹©W…ùý £½ÝE;œ¢Ø´ƒíŽÄ“bh]š‹Çå~Fà0té’5F¿xp XbxŸÚÂ_¦FQeàvAßC½5Ž ;˜ Þê!»+,|“V™xËøƒØ!×1cBY¸râSÏ÷øgíÙçY]^"ºB&Òj6™ÄuYI:¾W̹DÉ30¦c’LT)®3ò4ɘw_Hj“ý¦ÑFÔ­B(à4Å«bê6ÆÁ²Þ“JšÎi† ïš*\Ò÷øõLe-Ù´lûl×Ðâg×þ0É ~çóqãT¼‡oöe±áx<”69§/á 0ö9[„ õï´mÂá``ò˜waŠ'ašúÅûúRzBU›fE³ö—‡hœðD<ÃôW“ƒ¸Ô}2²÷åƒçû†‰…²ÒØ)ž†¶Ò’{6ÓªA¶ßq]çLñ¯Xâ»ç¢¼â”:ìñùQ.Ê(žJöÀ•Ÿæm%çÕ>÷A¯è˜Ï«˜EDiëmh5èXãU~{Md˯*¦ãtE’ %ƒ¦åv‰„ !z÷}¦ô¼Äw+Á Ð “gR>Z¿Îþ¾fbuu~^Blè¸inÏGÛ‡£e3‚ß[œÁ²× œ£,¨1X´}.Äh|"=QzlzËnx]-z_•Mñn[ŠÛÈ¢”¥0À„N.¾›EX8–GyÄ…˜×s¨NŸëSçlˆAü Ö'úÓ“ìhkxã¹·ÌžsV¡/VëJ¶šöØ& }žÞãbR§»²X¦#úFïáùÁ™n£é—*ÏŸe¼¼.'÷«ß70Ç<æoBxŸ>Œƒ]&M}[ãs€ZÇjð'Î4 pjLI%u?œ*ÏU;è¨'cõÌÿ˜åû¶¶Ãøî+Ê­/¡B¾P|“:5¾–ðð@F¸ü×#e?ØcƺC¿9ƒ˜-ó]-P»ÊA5lI÷tÞa0³˜KtÝÔ¿K WÆx2 5 †§nhõ×ý„®Äv£‡ù€c“ŠÊ¾CˆÞ“Çe¾Ã¶aˆ"òKî¾–€ÂU¦|—µÖ‚8éLÝ¥Î]vÂÐÄ%£9ÿœv.Xº28yº±M\;ÀäËiyB‰B—Û÷zrIT¬ô´·ãüóO”H£)9ÜÚÞ€tÒ£'¾yÈiúÜ}I+—Jw…›¥ãÈm‚wN(-Ó®?y¦ÍÀŒ ¸’«5à•9OP=³âç²4Ë¥X-1›/(Hh2œÒ…ìqPQmX“GȨ)Î"ìÈp$PUÔ™Þù5ù/\ÇÇ5Ó‡vµ½™B‘E3~QoÃ!U”¹ àæÀ«ºµÀ±ÎH}_JÔ@QÙ‰ÎÒì†Þ‡Ë«í8ûYy–ƒ}l»¦›æØ2Ì­›"ëÙË%šÐß„>1Æ9½&´ãÄ»¬Nr\§î¸Ëï݃ì¿ç£3)'økÚç”v¶ivæ^µ¤Ä­-.Ö±-yxˆ3k÷¸;X¡Ó˜O·ÓÁ3jG@ê%ƯN$çêNÍe‚`¦4\K‚Î_VJɇt‹¹˜èÛ>Í }òP©?#²åk.†{T$$cßC6†¥P¥gŽÇ¦ëb ­i<³ªöØf¥¼ògî„Æ8³á/•©5Dp"÷›<ˆ¾xU3÷ÊQp8RD„Uº^‰´ÖÌrØop•Μ´sCËÙ[û¿KŒ[é Ù¸BCÔÙ“^MœQâ½­u¬ãõ]…ôdu™l2;7C<3~íFÝ%kª-ÅJ>feÙn®¸5ürFbwæ8ÅÍŽ(™UÂNQ»úãÕÅ<âÄ\‘LÎV~6ÏëS-ÿÔžS=«Ò­ôü¾$& -XòÍy6†ãþø¶ŠÙ‘¥~ùÆBöe+M4…H{=[^bÖrS¡vfZ}ÄêÎÇ{QÕ®ž‹™icáâ«ØÍÇ]rä6€]ì{f[ƒ(´¥ì9¯>ws”yÏ#Gèk~ >Ȇԩ”…—À£ @rÎ’WZoª‚¸Yþuòô’ç·MTô±Ø©TïfL6óÃóµ’ tÀWa!ùåû!¶"ák»™íå›@°ø®õ¦ž•¨Ñ Ï<_ŸTs”ªn>›bK]T©Î¯ÐŒdWÉ£ôP¶¢‘{—U'/‰gÅÛxÝ~ÿ¸§-ß"ghØÅ“?ÞXÑ&Ð`)A`Ë®&²dDíIÌüµÓުȵˆt,Šã§û~f#Š:´Ò7>¥¦Mr/šY#såÛ¸· ›lG\èϧ3¤õ {ܧH±þE9õk”–ÌÄU ·?uhEÓ;O~Ù¥¼Qâ{ÊÁŒì~ ¼¾êI“†Èâ·6”>ãi¢rÿQ,æ¸ß¦ÛgÞ³{£&~j™6°®ZÖ g “I¤‡Ra‚ÛÖX_x’âÝ®´. -1 îgéÌUg¼ü~^m—žKS}4ý‡Ø—°Ñ5í!BµMÅ ìos kZ"cc™ZÚ»š] ‡Å$ñP¸”°÷‘xG4}¢@Ö{ùf@ê=Ý“ÿÚ°oúk‹ßA©¬È¼¼Å·zYá…[íî‡~—Éå,cYJž(ü*cØá¶‰:26÷QjÈ…ìóXYï°)°ºîÐú÷mÖÞÂâjDy—’á˜41õSñM[Av5up¡oì'œÍ¡$r_“1·uµCá©äç)ø ò­VñÏS̨mÑÄ#§i»2—PÈc¬;tç—<ãLPmWhJƒ$´@cÅ>²…ά ê#W ™wÛ(HbH*ÅÉC"¤·R”{WŒ$•be¶Ã1]ôYOÓx– üµŒ÷ªxê£ÀjŠ”!˜D4Þoì¼d4ð˜=ª·ò4ý™tÿëèJËÞ+ÓPQϬ½1”˜¿ãñõ7T3Äœ—1‘¥°¶ÊÉ¡ññƒÒ M |‚37eD›Å©ÉF?ÈöoŸM ÖsbÇ kx|N<¸ÌíuûâÞ5d"7QF[N¸k~Ù^¹F²†Éay1dÚÎÚŸÇ®|&e 7ëžc­? w[K cP'5Ê¿Md…ž{ MºÀûÀ-«g[™&gº5ò¤" /Ãý«»Z‡bðÑ·”EÖ͘S8*ÜÒá:éщ`b×at½“Ø:¤¬QZ#ÐÔÓ“ ÝåÂàÙp2ª¼>¡ëßýšê£G{±p›Ä𢡋v¡ºVW_ Öèµ—­mµE—9Ò*¶’R~lØX„ +¯+*-£&]ÁcübˉáNg?È‹ Ýöæ“&ëqÅZô„Ês”;ŠVQ­ˆ.á‰ÁR¤øÊô˜{»Aq‡oîPU•~_µ¾[3‡ç/a€ˆ¦ñ3ŽìQ“•µJ@¦ÚvüúÒñ¦y}·¨*h2 ý‘’¼#¿uÞÿXjðá-7­Ù®Àïƒüi_ þ-$÷©&\¸Frª±@Ët^G?;ûÅá -…–¬‹#:,f[ï·„[™§&¿ÊEW<›í{Ÿ›‘ª6¦˜4V.øÕºÍî:ºµ B µ_F/ :94ÕíÃêòkä¬è"H‹}èì1ŽŽúPáJ0N„¸Ýœ_d¦Åó🠯ܧ6NUY¹¡1eg\ïÀÇ9CgБÈ6«uf1ØLdô >ƒÿàÑá¡X/¿8/ý~/7çœò"/阢W@Ýq»ñ…º”@Ä®åЧÊ貿Ü> ì'aTL§&JÒi:cl4’M®ý§¹LÚh…¯×*ŸYÜ[’(tMS©TüVš@ºf•ÄèH÷©Þ|-6Ì©å!8Ú+‘¹ÆüZ–+Eöqx¼h{Œ}áq¾—12ôS%Ìca¡'§j€Qò ò¹°}ÀZ©ÇØBuôDC‘®8;{ìY›íz¸gÙµÂêWªø±Ñ× Ÿý– ȵwã <–$š„ÎlmbDÏîb„²ô…¬Ûò„ §”ùd*Hû1[£Šf©”ãd{•3qÙ•wIÀ|îÀIð—u¼åHPÕ¥¥øá—àJl$KR¥?q*M"ìáçã{FîqaÐ §wv{7EÍÚèʆ×>«l…ðß]LÂYÛÜÀ¶ŠÏ·©²‰êþ£9›RÌÆlÌ6NùWù¯¯Éñ› â2‚'‹àeNjÓf0•k½_xc³~&_²ìx£ ‘Í.º÷¡—&¿|FÙ#‚®Ž‡êˆ5#ý5¬×XY'¨Ùß’#`0˜ /=ùS õQŽï3Ï iÏšOè±gS¥ÂÏî0¡žX4E„Rˆ2%BŽebmþÈJÇoG‹§ŒÇá¥!¥ˆÙúºH‡ÞY»~F‰·2…ÖuÃxژ݋=ýy‡uÑ@uf­Œü£, q %ÔMÛˆqýÁ#0®BÁãØnû[ƘYË näåën¹ú0êej‘Ì*ç3€ É¡*ÞÙ:j  £Š„ß¡½§}«‹ÙùtLniõxôÞñdmV Ê¿ìƒ?”ÓŠÎÚü‡õ£)H¨U™ë2,ÁwFÙ8½‰àdçäqÖAåÌ._—f£§0Ž¡˜’RÊo+@†Sèy´Â(ig©5¨%R9=mŽÐ`b_.·²ÎdMô$2]³¦üîLô.…©>oâÒHf3y{_š•fnÓ?œKý™ ¡bc)áé_9Ï»ûÌ|×@q±ìbbÉG R í>ì>T^j­d'´ÃîÁ¾´GG»ÝÌ{ç´Çq;¥C¬únè€VÐÄ–u–'ôVí“´ž+rb¸ã!{’ ·‚hO¶…3•Oû¶7+D¨kåõ‰¥»$ É#„Âû¶ éÚ&Ì·-Î*Vl­“‰c"5½–Yk’KNµ[+Z»akµ3iÈ«JÎs R #r›õÃü#¥zQ)*M_+ÝÃómC8JcÌ&ņó§¡*ZsWèÎŽjÌOjÙfv°¬MïË”4m4™‰¾éÿ„‰)?ŸûÊ cÆÉ»kyUÛlñÆîÖeG^TšüH%¢C,[ Å]äzõÍç§Ð3ì)2ܵ®ÉŠ¢=ç6¯h|N¿XqÚà01/Þ@±IÕßð gZû‘7RegŸ—;QdÊ•­J®ú>Ûâ¨;×-VG*ü£M@Ÿà6šï®ÃÕXæ×m^“X}}â¼¾OÛvvã~W]eïà>2-¡:½2$£Ä¨üçž» êi9hô¢_¶‰Ò× Åƒ`¾E>Áy¥Üí±¯ã,ãÃ(6æ)êÙýÖï8ätU^¿C|÷)\Ø7¦ƒ†?ÙœÕEnw´ìšyÉÆÊTú>óM™|ɘ´ñvüðMê…^Vð{ûĬߧQKÃåIØÐŠy-šÛ|Z¾›œ‘ŽÇ©ä²Ãbî0pY‰¼>M™{ó ˜©Æqö_NsYRG—ü¬ Íúݳ,ñ :LÈœ"Ì}Ed<çv ^ï'M1ˆcÄéÀm³F~и²ØEŽîŸXÂ-b<ØQ[åÎùt$ gÉ\’ç{@̓½B^Â5úl‹ ¡F’C#:¾Öüq}QzÛÏ£ËWì¦ÒnÉVe”š‹¡ßôy[K ™¸ÎónÉVB÷3íº¬+žR’C¾ï…3ÌÔײ á'VÁ #—ŠÇrÁdúŽž¡P¯Ç`óñû† ©üL!˜1XK•w$j–-ó¢Dƒ ™Àõd*/1ÝÚúÔËΊ¨ìŠ ‰dÕ¶)Æè8V%÷;yùõ‹ËæíéSÚèÌ&óõP`ùåkxäõBñBìÍ÷GD¦ŠKÑ àëj¨a¤#Å+>÷Rg¤6«é‰é“¢óÚVQieôì$%£„UÌÖMæilÝíU¾¹x\‚ûr±ã†OGQʶ¼¨GG*¾úd¤Ô_ÇÍ@l“yò=¸,ÜRפ}ô3Ã)z¬Ðãg·eQ3øÙ§-åLÝzUöùGrmHÅFÚVÃ3ûÎF¹ÊU©Suag»i’`mè{z!°ÈX?(@ú{_œãVñã¢Á98¬ këð\¹btD™a0íÂ×pƒý˜ùù‡É!ª$æþÄwj“̳èÂ,XpaMÝÉYƒ?yÅZí =Y ¾«Å„#™í6¡Ž˜ ž£`ð8¨îx0+¥/àÀÁ_§<‚X®Ù¤¦WÏ]r]ôn¢Â82&šØÁq|9D¦Ö–_”5*ŒövÓ üUij Ó¾Ììv%Ú…¿¦RéÐÂÀKÃäëˆÈ„ìâwÁ>V!›¸‘’åî×yûrBåû[Û¸\*—Ê:oR—º34¾¨>Ås˜]UfmW”½T¾¼ šF‹bÀºã{Ï©äTäÓ4¹¿n+p/L“ƒv&q¿w´2$àséâÛ=WV´™H‰Ã²ß¿¡þê׬äMXÄs¹êÒ2\±gyîæÈ‚û¥D0{ÝI¼O‡*MýÒäï„Ó{b?ßOÃPn^i;•ì6GL*¦+°\YKÃMÉžSKÙ0m‰]€kRÄG4Š"=p’Fs¯æŸ…þÊ÷ƒØ²ùÏ|mßt‘챚»8[Ä÷Z튙ïÓäi8p°¬K1ñÉÓWZ8Èþ€‹F5Û_(ûëYÜ9;~¶bb}”ã–x”nzýÈ·BnôÊ-oÒmqˆÍèŒì{í˜T|°[Å¥zwm>AszÒ ú'ÄÿæÂèê‹‘oÇ«oνEa‚;˜ò˜'æ¬éz»Å_¸¬§óÙÓÿí»#‚æê°}2ÚMöIÿ„ph3Î ½"’(Y†¨ºâ®øíœj”B ƒž'ìC5úi®¢Žî~pùñ/»ÂqÅYG;Òhȃñ1nb‰so eÿü CD›ÑÇmwï¾nA¨ýKÆE3l?ßMÒÁ\ÎìRhbª©ÿšH’s5Sãó Êú`Çʲ¡¤™ÕIÖt%¨ízïi£1k‘9Ï]!˜É#"§iTœT:··!€ÄÆvq%û *DS¾’@¼ý~Zì+é¨, ±-L,Öþe¾N‘ÿÂGÞ^ªý½gªÆGX¯ ©qʶÚ[×%ÃLÈAécíä0¸‡ðkJmÀ¶‰,þeç–Å{y3Zõêë·Ÿ_LÄ1ëMÒõè[PRä¶4Pß¡(2kåˆp¶¡ÏNoZè¿}€J^Û•.Ÿéþ–ˆ9‰¶#´ƒá[Í2¨W3ÝÛ{©@`ÌCãxày’þ†WóÙ:òî2±÷m·HfFpéSÔn’+A&!±î@*3–yÆŽ+:ø^ ѧ <ÜmàÏúi¦1òÔ=æúûHÙÂÑ»1W¾>óó:,³ Äþlè§XÁÝÑØŒFcˆ»^)íFFKÂ2»,ËÅë”Ê5œþÎxú.ËÞHÑÅr«ûŸDËVJ¦!Îy|¼_n˜xz: j½f~ab}ùª*ƒ8£%uá‰õy°Ü˳=ê¾{ŸŒB7×8èYBðµˆö;"Iýˆ ñ¡ìÏrãOB2™t¨œSÓ•ŸÇvæÃ{>ÉGÜ~u‰•êÇfôQöï•Ðn^u¥¾ ¾J½º °Ô°(ïƒÓ›”ÒÒÔFšEC lcÛ~ˆŽŽa¯@“®ÖÔÌœÞFËÕ>‹4«œ£™bÒ#ýaC¼B`RÒ±4¶iJ?µ‚#/Ü¡l£è£€êË2Ô’þ¥É$¹±6*Üņެð™ìÆ5oö©´GZY·?̳{ÅoïŒ5ýë¾^Š 8ÊcßФ¶²aé–ùÓÍ06gªº½æKøËÞP‰¿š6$\Gi‹ ”èEF!ôÆFF,28lÈLˆª·Ä²ýkëÑ%j¥r½êþ.º®ì%y>Ôc{Ô·±‘÷%4ÂWd)‘·‰ÚW®¯£g)ÌãDv/(‘ÒÖSÂ¥a^]Øw¨pqèè7D™ê­{ýt+ú.ã.’ÉŸÀ =2øìó0ñ"Òtˆu­mH8ƒRf5QG×Q?Qª24÷Á·“÷$„Üì<)ª>;±—b…6õ¼§}Í/×_ëµêÜœá2ÂK ùèÛ£M€e ò|uí¯›rê¤&Ï™/O4¥wš\ £QŒÄ´W7@V HBSõa3á#i‡öitª7j½«ón#‹Í ÁC=ú,Äøª,z•¡â»þì„— ?ùjwb,ß5ñ0û&{ôÎMVënU9„ÁûÉ!hM÷kHAìÞõ xB„±Ë4ÔŽ#)Y(Ìzƒ‚~LÉ·Iÿ_Ú>9•[μ)¼‘cÒ¬¢*Ü)&×± .¡Ä3ëË)ß&ÚdÜ\ÌPÐnºMW)%m!gÇÚq |ßv»Ms*±ðßáÃ’øSðU+‹—…ÖTu­áÿº¶÷'æ™Ì›¤uõÌ…h_DVjb)ÖÖT§÷aêêHw‹i0×]VCFZ¾Oaf¨l5˜¢šì¡ ®gx$4ŽƒÛËabÙiqŽ´À1²E—s> P’gØÕ Ž6Èb%‹ÿt¦]{Õ¾)nN—n1ýö]ë®ÑõîÛf2õ¼4gÔ¯£Q ¿zoІŸ’³‡ £ñ/NÅ(°úa™8;¶K9oO™Æa—Z“ ÍuÄghÌRƒ){ôÛ­<×ÐæÇwà“ó¸³~4ä1FäÊ¥5ÎL}2oCíJ‘> &’€eBl•>¨÷ÜJç–¢½ì<¸Ìª¯—©ŽKgñ¾UMy—Hõ~Ÿn>4³”Rµš{ÎwǦ0ä@m$ß“®°ò‹À5!ä#©]ºã êäW›`¹fI;QAmc7'y¼ Þ+cVÛ{îtÑ ðZÅ€Õ÷Ʃ.v #´Û¿¿úVé(E:Ô–anGÂ^Í„ãÕ],¹ƒ gÃìy–Thé©!èÙ„×µ6u#Ä-û¤ëèKºEìF¬Q74½ÊP¬.¡ùÂD€æqVCùlfÓ‹¼¢Fñp -dʺý¥ÆñvÉžôõÍ•žV±™ð,Í+w¾"{а^ ª l:‡3ûÈý7ï°Š7ÀÌXÔj*Õf‚øØ«ì;ˆg»¾ï£IIdªL0ß ™¯v ûv!no$§¶ê ñ>IÓ'^sA«n$_2é& Ûº­Ú[°MÝÑ~’Ê"…­á9¢ôh«Ó$•Í4d£¦½Z!í0ŽÆ¸Ñ\ðÙ>„GªiìÀLõIZ'¥\ÿ2ÈQz Ù,EGø‘Ûxô‘×_»;gAI-¸Ž"6mš>Pø(äÌüV|sì¡ gš˜¦ãû1Ü}Ù¨¹û§ í4K….):Âå•NY&Üø~ ˜ÜDÅw_{‰_#slE^™¡z ïNµaHù­¢?÷•«5ÉeÙˆÆp\pÀˆ[ŒÀí†u³ìôšù2‡â3’½Š“¿u%Å›ÎÊb¿©éÆLó牡‚ KCv;‡¬{­¦Éé•…mÊ?Q¶1øâ®R¯ÏsHZ|Ü lO“ZöÒ©vÇܵ6£–=úpÛ½y.§|Ä¿­Ó_íÙLñÕ¦ŒC‘ã–ïCEQ$ê:ü±içÙcUw0>Sr(“ÖQHUƒ‹ ë%ûÝyJ²ü›ì93ò<-„Ϫ÷E’œÜÍô‚bJ4ÕC*Æ™aCùÊ1ŠN邚ô)¸>Ý/zŠéZl¯Ã³+ŸY‰]X5.{Ÿ+»ìŠd¬¢is€v²xí削IM½L~¸5®L†!ö³n²œº‹“,A;þïº>ªÚ@A»-Ä\a,ª“MóÂ,ºkå óÀ „Ï@îæ@·tSÞ¸ËãÅv;bœ/»ycÊ®9¥wšµÒ›dh&ŽnÇ»bÑ3ç–†Å:2:xü`{,?—pâ”;Õ]Vœ,W±s ã_pû"ê®!äy«\¢•¶y@J=.Öåtôo6í~7CSk#8VTûØÌ›ɾ^7ÕÃèp‡¬ˆñ^ÛÛÊQSêM2¿ ¤S(²ý Y¨TÖYéÓå’žY]û‡š¬Ž#±æ­žòÞômÒ3Ý"¯â÷WJ·³8Ãó°«w >s-}ó˜bƈs£ +N‹CYx¶”%`f²üƒ¹¶ïj–—Ö¿²³!¶sB‹³<ÌuøÐHØâ ó¢ÃYÝ™n2F–aRLƽ²¤·_½¦¼£ÅÁüag#3žB¶µï¸çÄbo0*ʯý Yg(üEhó£áíµÈ¡tè‹ñ .KÁ`ìNÛ1 ºøa= ïö >óýòú¾"Ë>-U¶ÙpÜÓ’|îôC@tfú¡. ò=Îìg4§ÛÜÅ’íQÚÅ,Y{F‹1VFÖöošÇ¤j¦6 #'=†çfE¼rJÉeôä5àÄ? ÀÑ[?va–R“.K†ŽRá–Zîó«1ì%éÄ%\Ê]¬-y|©öó¦Mw'ôp"$Ä|šп‡2Õ"þ4éX.ýŸÊ#a˜ç#ŽPtŠ®ãM¨Þz¥Ù×n7?ÈÒ!Ù{`×?wÅļ²Ñ¥K”¦‘„¨ók¶ 2ùÜ=L©ýúƒÏîÆ\”E­’Ý÷š¡­ß  ½‹¬÷™‰|Ò-Ïg%m†X»Îbp¥t'†pì5¶;’×É]ñ.JØÔrñ™f®ìÃËÈ«#rÎÍu8wÑٰ̛Uí®À£ˆöò~¼+’Ù‹÷t‚ÙÉ«zPlp‰Þw¨oô-Aê63ïûÀ§ª%.\¶Ùw:rURÀ¶ò¡ŸÒÀ‘?Â>t€YàJ1å7¡øC~Ÿã3ùXi3ÑÞ™É SŸ5sŠaQy¤ÚÞýZzÕ*SÉEÅY4º»jŒÍ:¯j‡9¼zj‰8¦šíðáò2©øYÜ›¾‘ê¸RŠæB*ìüa´Äß,긋Ú–I@I™êùBOUK®rª®Ÿìù‘_:M´De:ûyx=¸ x·7|ŽÝêõžG“¦qdjËÝo_Üþ‰ãhY‡½l耢ôfF53Ø©–àÈ´Fü<ɬ,FóÉQÝ“wnQ© )¿B’3þœ¹:5`%¯Ý㈜9CßHlObG·j>q×K¼“]¼Î®5)ÊA%;%n‰ËÀ{b¹Å6S¢žW’Æ)ƒ-ÉÖÑ!ˆ®TðÀL¶ÞÓO—AßÕ“Jëh¤~EZÂ*t¼ÛS*æ~U42þ'jÀ{ú¤OŒ:NÄ$N)„@i½ÅÔœíÖ%qÕµFY•Ã{“ƒcAW?j(æ/€¦äöiÖøÈSZ0ª§$gIïõ0évLt´*W$‹[´úUK¤qkÖª6Såãì#‘´¹±dNÙÞ"Í)@ Øí*?Ã]"ât à"˜áŽüh{€¦©íù&Õ›R„îSýëÖlÑ1c¹Ooó×î£+Ëü)Æ×[:,&½cV‘ÜƤ¬çU™ùY¶ÑB˜ÀŸ{óÙ!$L¹Šo`˜±Ø®„¬§¬ýÀó0×ø‚¸tkÿOéðˆü¯T€Ëª×œÁGSnévGÙš”ŒÅú¦Ëº4jW‰ÒJ–Ä™ A† ¡7Ë}[ÓW'}*¢GiîwŒäÜ™s‡Wˆw<Ô‚Ó•'uÏUoB[—~íI^‚W®j¤e“ƒB%1¥éñùÒ†Ô¿¡KƪHÖ}¯ÔJ†/ÆÖíC^[³w=,‹²ÿÃŽºT‰ScA/íxxyO¡ñGã÷[Fe¼öþ܄ğ( ±¡ÿ­dÙBxŠÖœçRjÆpT`¥5ªÒÝ„ñðÐ>r ’§·%–ÛDÿ¬6ÆKØcYF±ëÂÓþ{MξÍ&¾¤¾€m7·B@¾‘‹–¢ÈªcC­%p¸qœlüïNW˜\ :ª¶*>qȇ aF.’,¬ÙA‘‹eTßT];Éè™,Û,~BwÎ5 ÒÛãµÜÝøÌ×(5båÛ9Ù3q¡ÈP¶B]•šÎÚV±â|o¾¡*’÷mÌ6³È q§°lûÆó„¥q$¶×T{ŠAKÂØ U¥E*ö±Ñ­/® ¦®â6 7JÅ`¸ºSÿ9§„ÎxÁ~è·k–Azÿ@G·ûŽÞÑtÚ?:oAª}»ÈÕŽ½$*/÷Ò¡¶—ü´Fll„^#yÔ´-.WH³Q§æã¡9¥aø))]]‡ÖZ‚îÄǬ¦Y2-+:eëãw±–ïñ3#¡Ì3‹æƒÒR !° 3a%5Õ®S£—Z ­`{¹ÇD­d ³F´Òh ª û.ö(´ý±JóGOE µó\œI=Þ æ“XâS _ãé(q€âO_ÿ¶ahÀÜ =ÉÜ-!îX¸+tËÇÒ #´3Í%ÁBc·eYÐC·*@+ÓŒ Ofr@´»Y”«Îñb×Ðy,Õ@‘Xyxì¯ã\6r¸Ž›ÌÞf zd¥„ EY¢ï¹žÍ€©rŠoÀiù¶Z”Bm <ƒÕvy:RÔ[t áꕹSpÈ}›ã¢)!_ðà¡:¬\ÏóšŠàâ6tkÜå¾g) 5jXÂÓUMÊ·˜^²ÕO«ßòkÅ¿áÄ÷îã¤h-µ±°þ(ø0V(‡ýížP?N97-`kÕ[5à:]¤çÂLJÚø!Ô£wK±`Ú !M.uôÓ¼0(Ùš 8úƒÃ üëëî@xäx??vX´Ï~ S“lz=ç?ÒeèéŠzçChÉøÛçÝMP-Ò$i.uŸÖÀr4±±I`ÒÝ*þ ÏE׸ƒ‡ª}É%hŸ†V´¨Æ¡·K(D¥7dzSF冰Lz,³¹]¼5NîvþlÐ`$ÖÞä`ë% 0®„\§Ý„gl‘ûשêd0Œ|¥¢j ôØÄ¤”[^€“x ‰Ýt`¼Õ !4ì¤ZÒ¯ð³iû~˜ÿ(>í]ÒB8¹³Ù¸Ÿ‘<ÅÊpjúV‘O{²Àu:Ûõî%ääŒ&MJK¥;½bTä/þÅϼ} *Ÿ,ÒcàÒM±hUÛ3ÊÝw˜`q·”LŽ-Çb¦·ElÐ_J#uúìÎÎR [o{r>›F¨¹(%´9b)†O™8íV8°íέ±™?Só Æú¢ö¥Å—Â8@tùtÍô„ÎF‚`7w5­¹lBb 1´ƒƒNR >ƒOÁõ(2º×Š­Hœ*ÙºuJûC…¥ãC˜ƒ4Ù 4UIL`ì¦7Þ<ʵN•8G뀃tC¶ªcŸå‰—¬“†š!+±ww>öƒm/ØÙ˜9¶÷4hI¥cå5BÞ;@¥ÃùFžVLJñ$ÆŒ9 wíŸ~ª1öUÖÕõwÀp<¹Üº0éuÃà’„ÁµGº (\FŽä†ÔÆšÃÞåªBA@ó3—u¿Z;­-qÞ!ž£@q²¹kkPùÕ\Ža¼x)¥eé…í(¤÷Wý¾n´ËÒ2Î9‡Ê5’['6Þ5Ö‘vvæ4$'fÜL|RãPnÇqúÓº:Ö¾”{¼<ÉÔÀ[wª8þsyž,mê™ÓcP¹ᆳ|>k¨+É…'âd ?f\êòÖOšnúðn–yü„R×´k˜¦G*åI¿UŸ°Á3 L5ø„ SÓ` ,ý&T$Ýÿ‰0ˆèåd{¨ÞîŽpúìl2ܨn€Ô ¬ënR¬ò/˜âg{,€-G—<@öTý"‹ð±Ñ*(ás2U^€­"sA¹õüÙ¤ÌÖ©½+Ó|ý|OBJoø+µg2MÍÚ Á—ú7ðÁÈ1=­rIGÁi+Å¥ê ô­n %}ø­Å,ê_Cu¢€œÅíƒ`WŲ½MÇ(½üW?3Õ©#ÒBë>°â.£¥ÉB=Ýmig•ÙEÌ%TŸL.¥‡]6ñm B¬EËßpû1Äb¿ò`¹>X€÷ö‡á¦ýŸa/Qt˜4Cëâ®Iµ©éøL6¼Ë:Œç}ÎgËæ’Ò|îv}±ª'¾Š4NiÎ…Ò²÷GË(:ÎÚ•ë®(?¼iã)8øR,·$¥Í§k é[@U £Î"ìµ00ù´¹¶¹çK‘{,È2e«8E¥œž"ªmˆ” ó^âðC惹úúª\Øa\j;Jdì\KêYnP=uY1âemÙŽdì‰DVppˆ8©^Õƒ2öÀ²Y‹Ä[‡(„¥—c?¼J…©Æùýh ]&ÞI-t¿¢f¥ßº/« ;1r’KÒø N%kÔ}\«¥ ‚ïGyqÄ(ÙÓäƒTÕpQÂ&™žôѯÌðiKÕ`TýG‹ªó&YA™äO šSÉmÍÎj€ ×ñÞþÚÆÈÑ\£“ _ã|Ê=¦fBœjê9¯ Ťc‰>xÕ¹Êãs;l¸s…—*]jš¢Q•½då)÷Z¹Ò‡ZA{ŸKœÖ¼T‘QCž®¬žºÝ˜BG ×ô,´žG1lĹÊIøÑX*Á;£ÕÕ©Q!5}È’„W.}£ÊrÚÉ|ÄuHÍ¿}=ž5yÆ£WG¹“ê×hczŽ:SJ“ž‘^¦YàdJˆOZýàß-~‰fì&_«g†t…ѶR4‰Æwª‡¤èÕJïç[#×P1s#%1°v—1øóM´Â¡8ÿ|Û†ß'|½ö¥‡&ŸŠìæd°Åë´ãDú\§0¿i ¯·,ã ¬ô[†‘€O|HCdßÇ¥Ym¦ÏìAÜôÛçs0g!CœeqÒå(íÍýY½…û+Gl1Sq¾ –½ù·$ã¸ãX°ëyF<ã˜e@' ³ o ‚5Üæè`æ€o“Èb@_ã´“€¬h@⪰ŽSü·=ú¶8ÀBèY˜Z éàa‹Ø¥ÎÏn… œ çÀZg‡2kHÐGô’+ؙԃP-/=3îÚ¾x܃Ä8æ¶ œ¼8-æòÉ´æ÷ÉÁhü »ˆAÂÛ õXͲ„bÏ êš)Ÿš×[´ÚWƒ}!Ô›~kMµ_ÍÀÍ-¡(× 1œûãœêa`»Ï‰s—߉*ȉ¸ü«m ¡„œKWF1æŸz¶O ÛÄ4Ÿ–+ngïóþyHùžK2ÈÂýÆ7NC™ ë|žœÈ‡C×å»õR&vR|l–ÁÃmS7zU7§Cj ³j5]X L¤!îÕsGk W)•²äsÙ׃¡ás›¤® )W|èÓh6MŽc7*{¸t«ÑeÀ=²B¤*¾“äJ"³[nh6ÌHÙ6’Ó"«6¥¯E%<¥±<0P~t¶’7¶Ê‰ÿ´à¥á5'h´MT{ù’¦~6Rj`û<¨L~„»£wæañõ—®™¨Žå%t"Tàœß×ÙÔ­A\ŠNÛ¼aªË‹§¾mö!òVy{÷ €- 3|4町sw™g™”ˆõ½ÉõxÂIjå…-}ª—›…B¤ÈÈruRþº£)=š¸ÀeЉ ,™ÏiAðZ»4žueõ úþ¶zc2²Ëàq°ò+ZÇ=7w€É耧M)P*@VÕ†#YÉz[HM ¾iØuДÞoŒx”8¶íä‰[ĺ<¹ŒfÎþné¬ZŠt2ãPÈY럪X_;B¥.>=¹$grögÉöáLL ÿ^EÛ ´O U§ÖðEgù&yÿtÎ?ñEpí`6³`¾¦!è‡?zô>Xb8wr«õWäwÇ/€B߬‘WXŸÛìlFúkGíP”€GJ^Է˜ÆáU éòÏÕui«¡'éçkÖY¥XeûÌ  é‚'u¨ð4ŒÑ"¦ñÿeáw”;{Ù+哯”y+1IÔ|3®Ã`½†"Ú¡º ´«²y~D}­ÊÅø­Ã#¼æI{ýÌ÷öûüÛ#’,ó]tM­é"`6ô¼\^û„¯ž«ïBü|ˆÝÕ>86œÒ/ëu]ìiÒ–/+‰pÂDŽ£øé”Ø?Jw‰·ØáüJ–¦Ý@P¢¥§aŒésA_RB‘Ϩž¥è¡À©šÔ‚éú)!š“ YŽ¥c;Š*±È_«Rda &‘¤XÞôÀ¿˜HmË`“²m8}=y{"’ç+fT¾Ú,?7ºé¦ÝÌNd©³œÞÏá®Ý“¾)P׆«s0ÑNüøŽ1š#nóÉ„Qã§*Æ~ÑS²Ð4š\¥ì”ΫÆû©}UŸ\¦ÒÞ$+Ú¥9̪(sWǹܢ°3GçI“—õ`9ΟÅa<åâϹG%Öµ:§l–ªÉ p«©¹ËDŠ‘•0à± endstream endobj 140 0 obj << /Length1 1451 /Length2 1871 /Length3 0 /Length 2790 /Filter /FlateDecode >> stream xÚT 8T{·Ô)$Õµäëß2…YÙ³NÙe)ÉUÇÌãf±4¹EÜDÑFZ$Ñ.¤²dM…«ÒbI‰²f©\LݤnßKÛ÷=Ï÷=óø8ÐC€¨º€ªoD]mD¡…b8 ĸFÀ EXÀQØa(Ì#­°à.âçÏÇûL¿SP WkM¤‹ ˜‹0!8B|8ïÈ„8À c"0?â‡$>?؈L Ó‚x:×ÏLS „!|à ó`n(ÌbÊÀ ‚§¨éˆÀÝáMÜ06? âÂwp&ŒòðÊ‚¹ïÜl€s0ŒN‚&Z`êpU‡úµÜT¶¸‚N$CL& ¡êØÎ ~8_ @(K „8< χB!„ù Ñ!À°X œá?“‹óy:<„#æH—ÁÙeYaAA0ÊçÄóY#\˜‰Ÿ{yêrQ, N[le±Å4X‚`²Š„`[ë) î"|óùÁ|@§P(ººp8ÓŸ,nà O©b7Î!RŒ6NŽDØ0þGò Pð¹8Rø}àG‹@¥Âä_ØA ߪãn˜=iã÷ÏEÂÁf .?* ˆ_ß~ÃÆÂPNÄ7øÄ“7¸xZÚl\5EùkÐÒ Bm*Цéê:MèÒAäU¾òŸæ>áu©Ù(ßêÙ¢l NRÀÏnšFè”.HSK£ ~ìà„áj†雸½)t Pÿï˜HùoÊWùŸâÿy"†€Ã™ˆ“&ÿ‡‚NÄW³€o†#†ïú3t#<¹ÎŽ0 ýµåCø†X ~œ¯‰ðH8ÌrAøLÿ ÅL_^ƒ ° ÆCÄß M¥P~Šá+Ç Ä¿)<ü²&B0¾Q?v´A™K¼z4º>€¸\(‚@ÁõE£ÓŠï( Ÿ6 ë O8»HÀƸñ•R)t@FľIW,ûΤrðw¦ s¿3õ™?aþ0SÀåâë:!|ài{âÛÃá0“ð´cÇäÇ”~ȳP Óî©§éÉUÄ‹d6vÛ¨„¾Zme26ª›™ÐbQÙØ›0örÞ íü—Â@Ï…”@ŸÛ&-|z­t&Û·KkûÃy¦yZ¯}E…×V]”å·p¨Èµ6LdÞ ù«VÈpOÓ‰þµ&+Šrþ¾ì?4K£àµÎ©ú} ³” tçHÅ”Yœ(˱¼bÑÐXn»œ7b^ÿæ:£ìè»4zgõ³‹Z’HÇQµ¹`{щ³Ô¾*}Uû­A±»ÊFy|?)ZTEòåÝsÙFO•í>R8xFà¼4&Š[ô&¿{݃KÙ´®ÇkDWǬôÛ| GGᙃ¥LÎN.­@f¿ ©Ôd“¶MÜÃß-ýrî¿?³fÙ&žù)[¡gŰƿꛟx<$iêFR£”èo\›˜‹ã̃â·§ófÆííùزýcF°yšÝÚ«]u £øbŒ¼YVY×qj¼ô8¼s¦ï¦T {hq’çß§O?Ï {­Ì{}ÖóšwÃX¬‰b|¸2£~Ñë¬ä´æèkîÒ•©Îa¦{·˜ÄçºÎ§Þž½î¯°ª—–ɩ뗶­ÇFäÖ^TÚSy,-Lï@ëpSä%÷î–¶¢?|²ˆE—劷=OI_åWÖ%ôÉ¢‰ï×ÿ®eZygÃQ…ΜgªWŠíDsËㆤ—8(|LëÌ;¶ûr«lÈîÿm!^g”Ò½¯Z r¤œîJì÷Ÿ_íýR£kÇDÆl¹•ÞyK}ÍS5zßiþç‘YÞ2‹åöTIþYîhl ûXLÈìO˜q§ÝÚ ûŒ¼Þk/>× ÿˆùb¾ì«rÇ‘ÞëŸEç6pß=ïÈ4«:¤nŽDªe“dW$r w:$E‰®…îÈ*Š„VE¡aQîn‰ÓÞj’O¶®û´â‰Í5†Ê?»û,_¥t­ÔÓ­¹Æá!ÕGÞ}´ËTt"BXàë’ë´×v/-0Y3ç|„.éÚÐzt«våbÙ û‘ôdáÚ}$ÌÐÊ`Eî14BÞÖ† 1­ôÍÑqrÍû/Ûz¸ª!Œ³fH¨[™q©&Ô&i«3ÒNhÉ5ó).v$ùf™Wóš‰ >‰ºýêM`P”dwmZ »ìQ×Ôʳž1œ<‹l»ÑbV˜Ýý‰?wžóŒu³K'ìkoDmßÿE¿¯«j_à ºY~Ö‡vÖ,9Ç®ÚãžÞ%Ýf{Ý–Ñçû(àÉk \xõxáå® )ó²K˪±¢jÖ'÷4šô;˜IÜK—ÓŒ­+KýlgìE²ºå§,]¤ k0b°Kœû§ÄÙ­ÆJB¶|CÊ‹·¾;þ).ÝdéТg›å»ú Ìœ”Ì›»gs«Ì‚ÅMžùŒE:ǽ  e2ò™­ê§¼gÑ:ÓÀëE›–ü˽_o¦Õ!ó—¦;ÃÖJe’ƒjdm_HqÔ¥—Ûn÷xx¬-Ë0Ûc—'£r³ß©;áê4·ënlº n÷Ãm¶ú“Ç £–öﲌ2?žÈÎú줘¹C>!¥A°ÿÒhâÌ]ñ˜]N¹5ckÜRaøÞLµþ-äu·dÔæ%ñ¯»í. W¬¼n¯زªI¹/¯G«>qÍ,šÜ• U]m:Ý™DR´jS±yÙýö‘‚®»½ä=HIÛ>•Ž¢ñ½Ë{‡”ò¢Ãk*ÊÆÜ»vM>#;¶è&ÇîX¼á5ïÞŽb+&vª¤¼–M›[׿ýkÛ^§™ ŸY–‡¿Ti™S¦è™|€ÂxEþB^¡”sbêàËÆƒ¿TÕØ$x²/¸Ÿn²vò3”d‡Ï-(ªùÔºOИøÔ_²¶ÓõšŽ“ï|tÿhâã0VoãgºïÁ“˜Uœ ~Y¬W'}†èY-LöyPßæÝ¸ ¿(E*µyK ýË®¼‹¿üÅF ¼…¶gµÛ×êºn•TJž_t5¥V™¤GßS{³¢ùžöŽû|ÆÃw¥ëç]lºbuòî>—ßdFÙI¶gÇ+áXíî ƒifcMU˜µ—ÝÉ#)*éz> stream xÚtTÓmؾtŠ4þ¤¤·CééN©± ˜Œ ¶ÑR" * ˆH+%Ò%Ò¡‚HHƒòÍx•÷ýÿÏù¾³s¶]w=÷õÜ×ýœ52WA`šX A"–ÔôÍÌ.`°”,I+ `†" ‘¿Í´H…ÅÈ PÃ!a¢MF Æéc1€Ž€HiYÈY0ƒeþ Äâdu˜7 èK:X O+ †õðá\\ Äcþù Á…ˆŒÌ±Ÿé€Š;‡‚Ã0€>ŒàŠt'ž‡¡S,…$øý«„¼+à! ùøøHÀÜñXœ‹¢°àƒ"¸&H<çD?0wä/f´€™+ ÿËnŠu&øÀpH€h@£àH ž˜á…A qñpÀT[0ô@b~ëý ~ß ‘€ü)÷;ûG!æg2 Ǻ{À0~(Œ àŒB#CM= ‚/A €a?ah<–˜ó†¡Ð0'bÀÏÎa€¦Š1#üMÇ¡<x < ýƒ"èGâ-k`jXww$†€§ýÑŸ: ‡„¯Ýôk²n¬&à7pFaÎ?H ¼<@æ”§R[ýwÑDû׿‚$P0|Q =¤/Üô£¼™Ÿò§òÃLdàõœ‰$(g$ñ‡6óFœ20à¨ã߈(8pBº 0´«ÍHç_˜8|ʸ &j€|þü³#Ê Å ýþ†ÿœ/ÈZÛLí’Šè/Æ|ªªX_ @ ˆKJIÐóP@ZFüw‘?ôÿ¡þÓjCýn ü·ž6Æ Èüb@¼ºXxÿ…Ðï…þ}‚–¨d$ ôWø¶`(Nü‚üŸåÿ3åÿ§úUþ7áÿ·!M/4ú§[è§ÿÿqÃÜQh¿ßD!{ˆK¡%®æ¿¡–È_‹¬D ¼ÜÿëÕ&ÀˆË¡‚qAÿ¹F^å‹D¡pןrùgÄêhi„Å£~¼4€8 þ¸mp7âk‚'Žê§ I\¦Ÿ¨c?¶N* Àp8˜-˜(.I(€×ôý©k$Áˆ)‘] àŒÅÑþè)¤ýÃô]”@&ÑgúÉ\@°¿HÁÿ èE"¢‰$þ±üàB„<‰¥]ŽÀóÈõ$ªäêçáŠKf‹5QöC‘9ç“eÊé• 'p•»„º?ºcÒ »ýøóÀf‡~ã‰Bö4ÙDd/o´OtºHØ,ÄÈæ|¯d¬§ïp^¼Qµlt0×ü…S]üˆéÊ打~`Ží’²ÔZÄÈ2¡4G)Žn댄ãr@Dš"xÒÀ³[ïiÃ8IË’@ahaÎ2’0ßR$¶˜6Ú¾v!Lø•n£—#úÜ)5÷ebèÊ3?äñô({ÏýPJß³êù5‘ÐŽ¦Vûï’.o®Sz^ûú†Þ¦XhýsÆeáÓ©f ¸œ|“˜â»à¢Ø]dð eçKŽ_̘öbÅ\س€ÁÅ!žq–Tãá çí˜ ãijÊ…šÉžˆ—¹i»k&´¢ùLÏü|>BíZÐqá9éò=O^k%ø…$w²¨·£§ÊEÎ0É¥ö›Ë”à×^Üö!o}⮑ýýê[z›øC½ä¸µ¯ož7]Mˆ]†ÑÓî <ý0U~³íB„ç°Øa٤éN-Ërrs«Ý’O?ÈNh,º\+§J.Š÷*jc¦Yo\ŸPc›T%w)+mï§ðÅëENÜ»ƒÙ0¡h(}Ͻ:M²HÝÔweÛÜÔ÷3È Éænxæá?C?ß|j‡ojiôýÆ [Ra¦¦mS\$Í*ÆÇd8™kg¶1í*¢¯ÉóÉ«g:h’¬š€‡Ìý¡Œç—øû®—rsÄG³Ö—~ÁËg"Nw£t¶Ùº¶ ü†^r+ÔÃXZÖ:.l·çÕÓ_I;=‰AFuT´®qÛ5›D ÅF Ÿ,yþ€+¯IJR’O‚y6|§MS\ƒ ³i}áNå𵓓œß»F¼€“·Ì“üôtæKÓ-fÖ˜o ­‡IQQ¨ºY;²»_Ô§e-rÒµmþÔ³1éÉ©YžõlAyä0‡š™ö&{®aëôQw2ßÛKÍ“ötd…ꂨÍ÷¨Iåí”F^ðhÙØ|»ä‡aœu„¦QѲêlÒÍì8Æ}´”|Á•Ì”ÙJ…-¤jó¶Sêç(cá˜SR<~ƒ]b·ò M¨Ü$]Öþégˆºh§})ÿÑ+бÙÍR·jçæ,®²3ñ|H}(Ev¸»ómë4t]Äõ½Tßò›kÃÏ5®ÏåõÄë„-ÌuÒûÆj$ÞGwǦÜQ~5‘¶ä[1¹Ê®³(½áù\QßÄ¡Zõ&‡BžË®{Š‚žkl ˆðëý¨óý¢Þ¸Ã­¾³,¬wÙ—ëžœt»6²ÄÖiñ! Tàòt´ÖY ¦&m3~ødþ‹»¿í%i±â6'ã¦xå¯[\*6å<­‰aU·8vÎQÙ(úï f &/pjŸ ËuiD2r_Nè=&3œÏΩY·ä"äyžºÏ¹ïé÷o{ÚÌü]߸†–‡ö”^:¶MN•¨yj”"Ä_>ÉûÊ×ÂS‰»y=óEbf¸Ý‰7Êî›2QCR¾ZA'\ç¢ñœé+HW¨à´Ã=ñ€ü¼ø \Hѧޱ¶ˆÛZÿÀ¨tRàÐeúÅ€DZs¬ì*™+~Ú®è’Tñ5M-Á÷E•* ´DvmŸ¼®‚F{ï¶Ý5vû¼|xš}”Ir.C¤P´EXÊK3æ-[üÇB«WíÞúÏ"jÔzW¶j:_[AØŠ¨_”õ~ïO¤ãïÛ#æ4RÞåç:0LW¹„¯F¬n~õU†~¯­šHR¾3æ™?•8Kßšu7Ò­ñ W5óàÑw›ŠQjVdÆ­ŒºÑ~”Ò ½^ýJ“F4“9¥Î®ü Ùrd éIçë*÷jc}ùy>”XoêxÝZ· ÌF-2/Î]˜B¿y“ØdogÞ6oÛx@ë¦ßi3ïpP¿ò”lÔ«³ÍaqÁnyÜH«\o'q©==ç<áúÒ)Y AO™éæ,gUG©M™Ì Ìì[ŠVä7Йa™ž<ÏÁ7¶“³ªâwNÐÔÊÙ‡÷1òi|ÏüxµºdíAæpÑ[?†¬ôŽ™d„M‹AxâaÜôɵAÔ™ò÷Š…×ôŠ*cŠšî8ž¿üöZ+Õ™ÑÁ‚M]q<­¨åz‹YéÖæû+Qîy¸9ÊÁØö=“›÷÷…o‡%˜ô½| É-Û™EIá›C éοP]Þõæ²>S½¡µ¡¯~ùþ­Û3YNc"03FŸçv.ã î^é°³ ÅNôÌð!Kzƒ¨Þ§$®©´ázVàj6~ÎYµ×$çúfi=Z·ªd åO›2ìç¿n>æ¯ÔÞ™Š1^CO¡“?ÆÌV=f+NŽ,9%#Í4çøTºaHñ|4Ž9^„n²änt€dPÇL0kˆÝ=ò†”f¹KKýÏ{h]ߦNÔJ%´”K2p“2_QÊœ>YèÄ/ •-»­Ò­O9ÿ‡ëh…xäùòÉü« ?÷výã>3ßëJÏ=櫼¨¸úFÁ~$ÈQ„7uR™îÖÌ6Y½8?i[õÌx{ÍkɽS:ý ™lWŸ\‡¸Õ™òÔ)oÑ ï›Ž÷| €è&Föúšê>sMêÖÓ£¾Ä_×-'¤¯>Ì«p\jùRçåZÃÇñbì\d<õ6L˜¨ …Í6 å¶æ”ñÁÄž³[SvОWó”nãóó\€ãZY€I.Ha¨0ОÕE—_U\—uRs¯J_äæ%ËÅÉ,ÅÇYÁòÏ5ˆú*Ó*ä½ýÞ ŸTorC‡ÄÊìêÄžòš^Ö ¤ó eñ¿rònÆkX9_ 7éØñ+´c,åV®ö‰ƒ6q 5WôI¹íÀçǦo9¥‹WÝñ´åY`§{¦¢ƒ|œ ¦Q7 .UrŠáÜr=øP7ïDl$QƒVÌnÏeaðÈø¶O%F¸Ç)ÃÚQÛÅû4ušrãÚž³Ž~åJãC¶)9 É÷: Ï;ðOVpöç,Z_ú­K¾z©y¼žêË-™]ÓêI^%Šn¼eUNÇí£ÄüËæ¿AÂ,BD¦’:*I[·z42¬$¤«•p3ÖáP±³§Ö¾”¯­æ`l²9Žë´å¼-ùn±÷Œ%Sá×T0•>!ü Wkt~9d·´”ÔÖ¹¯¶éK>JÁøP|¯yEèpÓ^9FµXtgļ>Hƒ¾:]~Uý[*ßñXfèl‰øÕQçCž†ccÊM­î¢RWÇÚ«¸ž°Öœ+½&&Ñ#ƒ´Ç*–¹Wþ«õt>Mà¾~»fà>õwRñÄÓ]~Íý Šbµãe¶ß×£ŠC\¼Ãè-)SF¶wÈÊý´ófõ˜8ÌêNrÊ&‘J}²1t¬w|œL6Æû(è^Á½Š3>ÏÄê;' ç\å¯ÑsÊJÍNt²¸a/¶µž‹ìÍ£?Iùæó üµõήyË›MVC Ò —r“Öc›ÝbT’y—¾ÄNÙéEW©©FgmÌVm4ÌFX㙥cž¥Ó’zë·ÄÐó|N 581V¸úùñ“8ÏÜNÃt7³d¿š… ™3±ßÈqêOÑÇøðŽV¯kMn0êœ)Utb‹i¶Ï°j§4».½dôn8‚ ¯àWÒIš-HÖ-’NFì‘ä¬fÊkž¨Úå™ÝÌ,3>ÞÕ‹{%_6(ôưŠÂNkê³ë¥Ò€„‹Îæ½Ð>zTÂPPhxì±´YÉ2²z@õœ€gîÒýnšZ¥î9Þ—êhĉ0æÁª…) ÿs$”qò(s ‹Q¯kN[b…ÝFyœ»„â-÷ªœB‹¤Á·:‚o‡WîÅ®’Œ}i1”£'™¹¹7ô=Ë1x.É—ßýf8W»|M.ú]I–¬·´­ÉD…”"çbÆê ˆC0@¤ËnÙ5}'Ï¢÷ˆ'Ä玴¯ñ~w¶„4‰öy‡ µ¥0‘|ù廊é6îËiÝwŸ…ݽëî‘%íÒée¶Ö72þ.ækÆÿº3–z endstream endobj 144 0 obj << /Length1 1443 /Length2 6647 /Length3 0 /Length 7619 /Filter /FlateDecode >> stream xÚt4\m×¶Œ$jpÑFï5½DtÆc3ÊD B”AôÞE¯Ñ¢½×艞 ¢E´|’§½Ïûÿk}ßšµÎœ½÷µ÷½¯{_ûp²iëñÉ[£­`*h†O,(jèëK`°0?,âäÔG`°?Ý N˜³ ’ú€¢3 ‚¹ô)A0—8 4 x芅A1)Aq)0ƒ%ÿ¢¥%a hðÑ(˜ ˆSíèጀÛb.ùë¸ å%%Åy§ò0g‚4 [˜Ãå‰PÐCC0ŒÇ¿JÜ–±Å`¥ÜÜÜø!.ühgø]n^À ±ta.0g,ÌøEЄ8Àþ`Æâôm.øõÐ67ˆ3 ¸t PÊå2Ãe s.ôTÕ-Gê°ú^àÏ»ùÿ.÷gö¯BÔïdŠvp„ <(8`ƒ@Â-u~Œ;†€ ¬!Hôe> A !V—€ßCyrIðOz.Pg„#Æ…ßüEQàW™Ë[VFY+¢`(Œ èWJgôòÚ=þ˜¬= í†òüÓ°A ¬m~‘°vux„B8¹ÂT•þ„\º@ÿøà0 ƒ%„˜s‡Ú ü*¯ïáûüí¾dàíéˆvl.IÀ¼6°Ë?§  0ή0oÏÿ üÛ Ö(°‚Á(Ð?Õ/Ý0›?ìËá;#Üð¥öð¯ßßof—ò²F£ÿÀÏW@ߨ@IUƒçÆÇÐî€'ŸÀ'$, ˆŠb’€÷¿‹üMÿ/꿽ÚÄŸ­ÿ©§Š²A’0¸¼º¿X`ÿÅí?†ø÷ šèK%ÀÛÿß, †^>ÿÏòÿòÿSý¯*ÿ›ðÿ»!W$òwøöïøÿ†8 .…승\ ôåj þúöÇ"kÀ¬®ÿUÅ@.—CGþ}„;ÌZÚþ–Ë_C¸¬ŽD `Úhį/ À'ÿWìrÛ ö—_—ËQýÁ.—éß'*£ hë_['$*@œ! 𥸄DEOÁËõ´†¹ÿÖ5 ÀBc.S€KvÞ€ Úôk ‚`Q@ñË÷‡y)Wô˜B€€ã˜"€€ó˜b€æ·ù¯ž ®ÎΗ›ú[4— ÿeÿþ,À`î0(èÃ$*`Wðî¸LžÉouPvŒsõq<7ŸççF× ¢îÒdÿEç#ù˜ž¶«sËÊ·ïͰž{~©«" ªÖi8õ:³ˆÔYmMÓ¾Êþ"_ÙÉLrƒOÿÞš×¹“—Ÿ=~nóCÎt'W íLšc·ŽûýÏ'WuÖJÅÔHÏ Fù^> 3õËç̰J™ g¿‚ác&¾C½ëN9~x4F6ô“õa$È{ë¥pާñ’Pø‰'óEúB.-  ÆôÌø‡Ôý#\ž ±é¦<ósÃe§RÁÜü8Ó¨ÖÌ]kó#6!¾ûS<>{¹V#8â•€æ1òÙ…5Ž ÞaüGN´hÍ®°fíéÀ0v9Trçïk£/åþàë„êÍGë彚Ö@´E'0ê_h’`öaëÍ=—8|G¶öÙ©8éæÍÇV´–ë´TéÝ!°PôX1ì…ßid»© ­b}ÍãD’«Â_ïÞÆõxΗnh}¢f2ºÙT|bwP z6÷¼bQ?™ÏÖ®6~œ %ŠXj²âs¿´s,Óé‡Ï0œÅžžü4Ñ<Ë8Öl0¿Š+LXöMxí³›ƒÐw‚–pG…°dÕ~_BŠ)Ÿ§"Š¥MÿW™yszœ]UeÙ¡;#‡ù‹ÝžBw„ý¨&%˜¶ŒÊ'ù¯Ú©É»¼”®ËÙíhÿn9¨k>îÁª¨#BìѾÐM±Jö¶‹Ë“Á5bW®fÈÁ"+´3¾Ö¾)ËìomõÂÖ;dï{ Ý@îfØìzªÐ+Y\'ÍThI›š„Î;Ǫ¶Î…"qg1­Ý«>üYÓ–GDÔ 8®$R.›ëÌAÅ ]â_V2‰ÞE¤èÞZÕo$ iÆö„ú9' ìZm…>±qí÷8¬]xODÏg¡vn;ã“ ¸ÐEfÕŽß…ÜŽ{ûÂæ ÛÍóÜ@ì¼±ë»Eã5vƒöGÊ=i'nÅÇç|¸7pî5<½² lâѾý€VN!ª<ñ¤ºŸ¯ö7—kÇþÌm’6|§ˆÁ¿0'µðìØ…À¦zMª[Ä¿Ññ™ÛEáf~2ùzm†Ä /“|q5D¸˜lº=ð=Ò›VƨÁ!$PN²òÚé„YÒ‡Š²ož~~½MG5j‚° ¯{ßÜõ7XëÎwHøY"I×ê¿›"ûØ17˜g9ÑŠš b†§çß/Õ«ãGßz¯ZÛg”oËõÞX¹ÒWS&½7QÒîÒ gKІÈKn9FÄáîê=äú/"Ì{©÷~¨’¿åxõà¾Q:fÌ’‘<€˜rÓt–N=ÙŽóܦ(yß½ksKïJÑL˜óÖü\Sþ5ð…´l*Rºl¥Ý7]cDõ.Pܬf‘8¼_¨Œh8(P1—ê½®åÕìÊoþiD“jÝuŸ1ÙÍÊrkD²^ônEöñ±õÇde»àíƒ}ÃW¹»=ÌŽGi&ƒ˜ýù%Â× VsÎéÜ=Kæ[‡ °þÓ 2UOÖ@1;Ù †¼~·Ði’žÆœæ™↾Nñç ÇÝñçMW†f·h:ÌHyžä^{Cy˜V$‡|Põ.{/n]"B«Ä&;ÓÁÅZÉß·G®ˆ×ˆ@\L÷˜rQÄl+œº{2Æ‹2wÙÜPn ^(iRbÂ,­?™”Dõyd(²tvIË’‘°`‚‹Þ딼éŽS™÷ܹνX¾vä‹<ð¡Þ {(ž¯à¿”(“™4ÜVxM±¼G{m7Ù¯ÕÛõÉF›WÊwx;®3m"•cú†ë î~ÃÁ’I»Ò†©4 cx8géÆ8Ž` éQµ5Ã+Ó4óX漄f?Öœýt¼þ‘‹^ÔäÈþ44gîæÄý‡ÐÏ8$*)G,F©è—ÞÄÍòñ¹ƒ4§cóˆú¸¿DœÃ•»©¡ºÖqpœúõýi¼*W“²Ð^4®+&EŸ®ë¨òA¯s¸”Æ.è~}yúæjtßÿ&öË^™LJâ‘êÐS½7”|ñ|Š¡¶ú]î* ˜Ž/þÙÙ4C;1º;©ŒSD`!áµ$¿äË2ó,ûõ©ÂbJRuÖÛ3ãìêíãd?YüeC¿§ê9Û^ùFzî‰/åðÓ3 ÷Ã"ZÛè£]2¥€ˆ¸~Ý\ÔÎ÷MÑpCTÂÍóûÕÚ5ó³ÏÌEL4bM·ký©òp‹ƒ#×=¬Äü³Û^u-ç¸ÚNÄ“v’oŸÀ»ùºÛöê?‰¨Ð±®$f‡ffçÌ.R¼–?½N çýê6ýÔºW[­[#—û#fà^%Ö¡º ×ÏŠ¨.ª&—[C\XñVz¾ÜY,È<&?T9æõÚ©vœ™ ™þ\J”õ[g£ nµËÞËc5óݧÝ ýL÷ÙúB)Í£ipidÎâßë*¥{eÞàr¬8Å›艓u¤ßµ¦Üh”%î²SZý‰ÝìŽ-ÞŸ½ÿ9¾¢+‡êVÊÛSfò•`$ñjýÙ2)* }¸®ÀŠ1ó©³§éS™s­lÄíÈxNcûð+®OfG7A~ývtîë—+£™:é©Û‰Ên‘ =I¾Ÿ.HXÈEfkäÛ…¹lyJ=à{ìç».X~XF[¸_Sÿñþ8añ¯¶ neII±ü휼M9 À¸EÍøsV6ö6>7»ß'‡éÞpžm~š.ä{¤^smIiúk¢¥n 6¸àq'Û8¾^ª#î÷â+iµ"€ ùïâgþ¾ÖàôòÊcÁ‰ÂÅ­O¢Ï*ò ÏsA6Ÿ>Æbj½ðš·Œ+n{ÝÙ[ó3ŒâàPVÆ­œgr—XAhçK5~fxp¥]E–¼§¥1Ê3@í|6ª—£Kövqº@²‰ØÄ‹FÆïši½ú±ÙJ|_º·¬£´ö-q)•Aµ7N£á»õz9r7×çóz¶¥ïëI‹œñ¦«t¨?ÑìŠðÀ6Þswlu Å 3ϹDÉkÚ þ¹ðc…sWÓNîÛâ”<¹î³°Í{O½òÕZ´\‘¾ºç[Î÷øã`JLÊvâèµyÜü5ãU>ɬÉΗéÚ¥>4 ¯ÑQª»FËŸœY )´4ÊE®:ÿ,d ²ÆOƒ|öuçõàý>K»™¨ò¥ÜÈR“hÈ¢ÄþcŒÂ,=÷ÉÁEN½4…mä7ºëíG^nõèT•^Ï3¡GH|Föþ›Ñ-"2…$û€…[ Üu_ Ÿß‡½£ûéÁ &m[‹þ Ÿ°î)eèڇ㓸¸Èh®Ñå[¥‹ï^eò:‹÷R¦·Bk-!/Gž- ÕyÊ¢Óïº s…ƒÏë^KÞ—€Í ‰;… ùÇÙÉá•–‰éÏ£; úQ ¤¨—>¾ 7‚Ú÷Tdg‡ 2“¶{Có$fpÕ½òË;áÏ8ß²Jò‡EîUË%íÓ'â6ÀB*†y|ý'(ÚµGý޾ªŠðzßL÷ÀQžJ82ãÔï¿Ûþlw†Ú›·U$›íé§­üûÙd$ÑñØxÌê°øóïûÌt& Z5Ym¬åºÇ…Foƒhž÷\Ù:ŒÕKÖ/HEòÜ¥‡S^‹¤+]}TbTÿõÍ­âü™ŽœD_eËÎÌ̥셀Nz«fBáÑ ¬+žéųˆˆ8{¶Äç%먔“C¡þÏîéøEÞÁ¡£ÁŽx‹>vXšNÜx˜_ZY”ÆPeA²ïÓ¼9|ßf‡îþVAd´ÈkÞœâŸesEO93fêÌV”S„Ú zf}Ý_¼×½Qµw’¦.Àz«'æO®Yþ#ü>Ô˜ðª4(ˆ 2zß{5~£Ò¹"äó›¬ÐL†#†p·Tȵ:›Iæ+³7¥©Mã•)ß}vŸÑ>»Ÿ”ŸHÛ¨øýÈ‹–t~C£‚nò îâ7è¢MƒÏeí»zk2þñÒNÁ0×'à`µNfÝ,. .éY‚=´/ìdÚ^ñ™Aõ™…´HÜ[h(0:ª™¨½=ÍXâ¾û!æ6¦‹•ËÐh¯¡XüN!Óø«{4w¿òF±ÙMaí03±©Dò“,m¿\ËîWµ ‡Ó¾špq[ÒÉUø&׸¿öœ[)ðA1ÃsLŒìm¿Xf-¹O›è÷©·rÉŒÓ%éUC]„§[ÛˆíƒW˜o8ós¿AVeÄt»[TбÈë? $J¼Ì_þBκ6âå§5eŧ»>bÆ{£D7E[éúk™ñòe¥S­%%ÂÚ$3¥¶’6uBVYÕ„îÌŠÃVµ«]‡ÅeÙ–“K=*Ïà:½ª O× Q§NÚ¥ õ5…·ãáÓ÷™Ô¸:ê1µOÚ6ÏŠ-p ФS–"yOD²ù^Š Úµ¦t‰yå–oêNnœ%_E¾éaš¨û)sqtkw‰ÓoœÅw6)pn­­ºŠƒ ¿twàæ‹¦6È­ÏqÿWˆJ5¤ÝȪÂηè'ªž  ’ée¬8ÉÖ^Ør‰»îÜ?0Èß –·oîÐ8ûñé£O›y`f T‡wŸK¦«ût|*Æ{”~÷Øv¡ºýÅÊ 8 'úa´ìKDÌ]Êœ·‘h±àFîEO…×E†&7;T…íž]Àö£‚4}ñÓêRñdaÀ™´ Úˆd%¼ªmbzº„ó¬~EÞ°Âè…È&ˆ}MöUÌj_ÇËXC:&Gù𥅇°9U!tàØÛ‹‚¡£h$9{I+ƒÿIZu/cÁ“Jy´¨°»’œ,ñZf«@¢ò–8“eõ8x›>ó8a|O°@fšO–PT¦ l5,´F5i_”[¯„Êð+V3´ ö,9:°›Da´¤ÙÁ£-¤ÃBpRsÖùm;ýû82ìû$¬æÒÿôcnè%uq»iîØ»'_ã7 ‚Ì8­rÏá)s¬â÷‰™¸1ŸÊL– BF43š¦/|º´Ìsƒâ×ÃÆÉ™ñ°–¡…gXË‘ JPg°aºmmþyÜ]gÚòf©g’0&A½MÅ­%èÚô1'YeÿµCÖ¶\^ý +B¡CŠZóg°4Ù˜ã.=<ñ®Y~1žîÉä13[R7÷M‚½AÈdRòö·æ^:§©eêCÁÐf.†á¨(î9b’¡üÞÝ^¶0úvúyòïoIªÇõCÄ™]1'vïPòð}Yäµ^(ð°ÉÈwÀŽ'™aH.¤ ˜™,g¨üÐUÓ f¯C?(¢.Û^2Ÿ÷¦»¥­iY¯çª`CËÁ›òu"fLýh|e¿FöÄÒ¡ìÀd@|u|•$é—@¬¯…Â0d‰Mi°ö=[¾qäçônU)ÜÜëà")ÇÜ‘šh‘±æ€z`¹,(?Eå0šXÏšœ+ކD}ÍŒÅÙÛ±³Aõ?šžMkWLMªƒdajÂæÖ;Öqö°³sS‹3ÚN7”94µÍ->ú[ÿØÀ–×å±Sê§á(šÍ^ù¹n£~‚^âÔq œc?ßnØø³fÑ=.~ÉnÝòQŒX‡HÒø}4å9E§2ÿG™&½DòÖ8š‰nš žêTÒ~ÎáN#Ki’ˆ¸ÐQ¶ 5´º^CœæKÔ‘­¶íŠÒîÌ[ÝÈz¾¦€’:F½½Íµë r$~{¹«Ùz§¬¡lq¼½C´¤…Ø!Mº&øïËv"ÈZT›è$kÛÍpk·z¢ÍÇœFÈ&Z:)*ÿ»%ÆùÒ°q•VO͛鞣ÛÞ½râÇpM¼-ƒ^M`&Ù’%Æ8—ì톎"—šËWdïøÃšD¯«bSxˆç`åIC8|°i‘ ÛÛýÀBµ0—»²k^]—þãðr¦B6xa)Žk¢ïp{§Å«7̯Ô²ÙE°su9mÞ`}ÛŒ»ÙA«ý;§‹F÷ŽÕCC®y>íÇ.ÖGòø½Ô¼cDÝÇã„0;&Þ0Wç^f ­ eŽbrðXd”ÝRû\MNžPê㉨ÆxŽ¢fän=ª°fä­^iL¤vÞÁD.Vö|}Ä÷Ne.°8—:4ûJ° ’TÄ#ßæýšŠœÆ†¯E¦ÿüH+Ul SÝ4^G+£èDýÊXcL[[CQH–u¹Å‹åÁ$ ÄI¾›û´“Íã=öð8sâ’e0ðµòx?ûÙÿl Sa¶Ez/ÕSªÙšÝWþ¤†;tl¦í­H´{‡‹ÈÞ½Wú ÃÞWlîù(…{Ï3<Îú rsC¡õ0¸YFÔ1Ó~`¿CiM1n®†­û÷•4m®¯·‡=Ó˜Ööüá§™Ãæ“YtÝç$ÙãQ}^Ûåõ··¬í»W›·2çê_>ðï4ôð–[‘ÂN¦¤‘)Ï7Îïi*\kÞR«<=g:~PMVbš¬vg_ ~€ê´êjI-qÂ;ø« Iã#0vE!²æ€å±šlÜÓH3ˆäU™¡¾b ˜•¹×‚o–SV {‡ùPÿ’&Ýk3Âå3ñsDGö-k 5Õæ¡óÁ*à`‚ÃÌ0*…ë¬~{¬v?0bØ–œØ®Š¬.„…ûº½o¤Á—3.ÑtðW|ôôyÕÉ4ùYädDŒ4Ò·J m.›WðýN¯²ßÍ/KNzŽL$Lú-D»t™¿“š¼ò)ËšXlå·âܾÏí–:JtòCÃÌ·&Q¹bDZùç÷G—9>+ D°šè4¬K¸Èh*‰ÅÃ¥J5cò½#$"]£½³ ÄÄ+Fµ†_ l±d¬{ÉÍT3®œìÚíõ® `GB …ú‡e4aÃW ³…“÷Pò \›¼hÃià ŒgJ>Ëv`shôÈâRûL4*©ºÐìSûJ͹ncÆ\㣋' mîÊ% <‡uoHF}gd’.yÒKT}[Ìxõ¦Ô`etê{^MÃÐó©Œv|61vÆv%„+}`ÂTÈ SŒSŒ%‡ÎQÄ–”’°OóùM"ø€m<]¶Ñ,7¶°“°•‘ŸYu ÔV»šèæ>ÈìÎa2îÔõ «ªi²|¹”‰CúÉ”€­y÷«Ñ)øC+•=uHÿšRr¸¬y‡7_ÿêþžåææÉŽYi‚»‚Íd?ýñ‡JBfWÕw­ð6­Ø>„-Gë=Ø0‚÷m"2)»˜¸ê÷)!J±awÉÆ—pæ»ÓH=òõ`7ÏZ2^¢"ûÜlº–f¸àͲÚåÛ¾ÊHxq|–H«6Ϻ-õ‚¤tw–Óô 'ŽsšÂ+a4òm{^G ì²íþ>Nu@^çÜœ¹œ‡ƒU£q±´¿ží‚ŸVØ;†$®Ù¤àÙew\ç+§ê†%è‰Ôé..½.«–HÕWrްÿ¸»?Ÿè)DÿàÇéã”’JjîÅ«'(ì÷ª#H_ªM$g¦öŠNÿ=æ ØúqæT;žú7¡ƒ]Ô´ñ?­¨’ÞêÄu=~t:Дדߌ_©âA1©&¡[v£<ƒùÚÆ*Àb"Jkœ´s2}¡7õ³0CqŸÑÞ$ðŒE–åÊ®øÓFî¼è½³ˆ‚íe¡¾Ék j´ßS»#,òYs×$ZŽ®%T7YØ—ó¹™R\HMõóyØçö2E[âW•5¿Æçšýö\ ð€S“çô]0èýöl,8Ó_¾¤â‘y~…oǦÌ&k<§â[ÀIC‹]2û §¿A´„Ulxú.d@Ziµh`9ÝÞGTQ…ÇCÆc/ºDËŠ+§©^¾yhøÔ%ëàhù¥UxAjÀœªò}ÍÏóK¤fÏ­Ó?ÕÚèr§Y» f×$°6Ä÷G5ªÁÿ&²Ú¤ñˆßî {Nå<4pã*²¥Oø‚3ø•Ž’è¼ZeÖEÆÐ°kzô¯†e}*pXvµŠh¬kõ•ÇÅGú>j'þ @~•—– þBC(ݽÙò–!š*X‘oÍ$‹ÃšÔq“¶qQw­D¤ºþÓñááùvi¼ºÙ˜Ë×ÒäT¡qSå’T)ùªëíìbIÏ ‹™*±<¡C6‹V ªjŸD»Q·£)FúÓ©ÝS³­;!FH66ñïªòWò†ð]K[gR©Ö»T­-/ÎF3ÃM·ØÏ ߈Ëîê7UÎd9•ýÒùñùŒÖ©«|÷JÇÊp”¸~©A9ÙëE'ËPðP£-#º^òžb©‚—&'ßhFÒW&aç³ÜNiÇt½fW eÁQoþÐÇØ endstream endobj 146 0 obj << /Length1 721 /Length2 982 /Length3 0 /Length 1541 /Filter /FlateDecode >> stream xÚmR{4T{n¬ZJ%*Š^¿Ô„Á˜ã‘·b4\TgÎ9ÃÉÌ9ãÌñꡇäYÒÕmQº”R£’V«+ª+·¤R‰HèA7*5©¤{ëDë®u×¿ýíµ¿ýý6{¡'IТ8Y@\ž#ð÷ô@<ð¸ÖZl¶;…Á4N+asb þ˜@VÀŠÇƒ´ØÀTÄQxX8 LÓa¬•Á(.Ç)°–”‘Ñ8œ¢££WD+£¸TÔr.Óäa€Ç€—aÀÝÇ7ÈKÈ&|aàcFÁ2à%‘áX#¡ÄL”¤€l$I ø&%wXQ4#LJ‘r ð¹zúEÀÃÝRä`«W1í­tdØBɇ¶3ôX$ƒÇ"ÉX4V¥bG"®Gh ÁÂpBËrÈ7/BJ»RŒ–AJF0a<4(&eØQ2™–cÀÄ”+¢hŒÅ(ø‘r˜eÁr\÷¿¼ï /f|p%Âçx#®ôÄc1Ô§«¥°Œ±hc#ÿ"ÀPÒ1~0?Š’„,îûHfá–k+ù³±.{‰âDð§/a †Ë¾0>r=£bF¯ @?rLSx,æq‡Îƒ7ôF£Ð,772v³´ÔXX[A²±µÖö[ÿ#‰¢(Œ ‡ gv͇ Ãb1D«¥‰D–íÚxðüîSñÇŠ&˜5ÜÞ`Ö±šoUõëâ5áèúç¯ Õ"ü˜)óîì8w¾êðRWÁØ”î›õé “C› Ž/* ‹W=\“ÿùLòº7ã×Èáø¾”wtvkËN_N½Í¡#=*ïÈBg]>”¾áäÅ+tÚ÷=¼ßOðMC§çüüu öÔ¬T§!<ñè‰ËÀ“¤¼„Î)}lƒõáGOíP‰&ê SúgßÝô@çuðF¿½)EŽë§}à> stream xÚí\ëSGÿ®¿b?žë*Ìûu•º* ƒMÛ8.ÒtÑÃqîžYiv—Å– ©»ªKEÃhÝÓ¿îéî™]Y¼Ep…4…Ò¶ºÐª¢°\ŠŽKè(œu…R…·¶P®Яl!¸â= x€)¡"ÀtUiB¡e!”ñ…v…ÐÊ@\ dD!¬”…yNŠÂèBxc ýÁèžµpí¾ÂªHIáa¼‚Åq_X k…eZQH+UaM!·º–na^>¸`®TÏÁúyð…ƒ% ÔÁRá¿ÂiKÉÂùB ‚Âx+B¬•>ÀR "ƒH‚œà=oaéÐèˆÂá¯/ŒÅûéPAˆ ØÊÂÚ 3X‡ï¸4ã`©Áë^°® x.¡Xsa)ç@&œ,aYV( ð‡JÀ.úbp4~¬µ=AS<ˆ#~$ ?Úb 3Œƒfï± fH…н€±MâÇ ‹ßA¡¸B!a†‚îžÀoÊà À"„ ÚC 3´ä¤~¨iœ«Ð¬ÄŒÕ„Dl„ÑÇÀ cAô'L­4Àð†N«4ZT4€s­5 s µ9XçÐÀ ˆ5—0êì®phm k`â4×=”Ð…Fÿ[Ò;¤‚ ô@#hžð¿@{źƒòP÷ 4‡HxƒÖ ­ö½챋?îÊ‚ö¯ËÛ›Nåd1/l´³;+çÓålPÎa×QÃI9õŸO¿94˜`v$,Ák±ãçP™ÁôBÆéÿü'18¢Å?ìÖ¬±ª¶Vªâ`ØÕ0¬TiCUáxU'c ‹U說£rS= Þ©u“êˆgª¢QTÅzsºö5WùX¨MkëþÄKÏQÏý`æÍ27ØáúÖ!d[A[þèíÝ›•ýÅh:Ùï/Êâoûÿ2-¥„ôDŠg@t:ìì»-ÆÐsVÎúw7£Á¼x³\Ü-ÏH°árPΰWíðþ,ñšbÓ³º„ˆv/¯ôE½îßbŸì±çýyIa/Ëñ—r1ô{ìÅd0Ž&ט'>²£½=<„Ä?eLªñ‘Üj6{?šìNæ£u÷þèóç Bh?\ìv4Y΋`ÙoË颗Ÿ˜Ì±á¤ŸÏGìzÖÿR²þ`¹(Ù`4,o?˯l1KvÛ̦v5+a Lé 6‹ùhÎv&ÓŰüÌfÀ› @ƒãqÕx³œ\÷gËÛq¹`Óëé¤ü• úHo~×”ŸÞi¹f‰K}«]¾¹úW9ˆ³nE¡ÃcŒÓ¶’;+þ‡×ÈÍîOÂVu[éZù•Õ¢t÷+pÛµ‡ÖÚÝ&kwüÏé®e=N<õ;2ûÇg§÷§íÛŠÚ2%§ŸBÔóÉÓóÇFZײ$çþ*-1 Z Ú¬e±¤¬žiZk:•k>?¼¬FÇŠ*½¨¬7 fÖ6A¾!ÓEI~³R‰¬ÔXáÄ€‘J¦’N:P tŠÁ±žö"úN¹œŽÀ 70pG¾HàÖÁ臱 · ú4ëèàƒ¼F/'h“ê^aD;ÛØ[Mã±V¦j,­w«U#ŸTkId4ùLñ‰8þGk­(Nãl­ä§Ö€el iÞjlì×סa†OqrÝŠõTF mœ²#âøb&EŠÜh,ÓžÈ{Iw±{SF:yyáa_¥2¶8ˆ†Ž=^aMx|5û¬Cí{p§&SNP,4£®¤¸(+:q^¤Kc)õ8ŽJ8ˆÚYk²D<‡¡]¯„5Pñ©††¬„Îz¼Ø¦å n¿ZÖzdì×ǸTµê‰Äz9…ä ZºÀx0ösop[À}!KV 7PÒÅŒ¶”… úARöKu!$F­8(]à«Bé. eêƒÀ1éˆÌ…¤©i%T:¤p˜&æ1T7Ñ©Q=µÀþ—‰4Ø5îÈX×1òÚ4'¶¦™Ôn¥¦|[‚Gßžffããí=]\! R I× ˜©ÓQÈÉ*KzD‰Tª£õaF¢S[¾»ÔÊ+:M1Ê¢¡Z]ž¢QÊP–ÈÍ”’@é6«¢g&ڔ˽¢£^Zq»úb(Õ[ \¯­¿!­ %óUMÒ¦\÷Ó j3ÂRD7,ÒÜըاª¤ð©¸Ëz.k1îû§}Q*îo­ø5'Íaù]ʽC¥3idÇEݶgùa‘å{YÖ—x~3mô2ºVA‹FЏ)¢Ò1ÀPi#0#L¶Ð/ ÉÉŸÐ9ÂÚ[!^ ÓR5Å´˜ÎhM{‘N{s´à#3•rjÌæô7ï1sÐb*Ó.+üó,µžÆùëT-e¸&åºg®÷Ñ%zM'+ñélDelÁ=¯èt‹ˆ8:êXBÎ'œ®A$ùe©¤£3›HðØcjJý‰*ÍNuOçÁéž×¥K”Š^ sjÞ‚‘VwðöžzÞ)knÓªªƒ%£ÄÙ˜47¶S¶ž°q’òuš›Ó¤1x…×Q(k¬Sï§Æ;ûå|0Ý-¦³øœ)¾QðòÃÅËŸùûÞÉóK!¡cÜ¿ž:ŽxNO¯~0ªøAâë¹ø’&˜Ã§Ûãs{ÀFîõï^–£ëøêm!ìûA`çÑ¢? v'×ã²à=v¾(oßáíQ]¦I`@ã¦?ÇWc»ì9{ÉŽØ {ÃÎØ9{ËúìŠ Ø•Œ&°ÏìóèKÉ>O—3vÍn؈ýÊÆì–MØd4)Ù”M¡¼c36góòK9aóÑW¶`‹›YY²ÅïS¶d_ÙìßÏ¢#X¾°›=†ûh/Þ¾s|L …Ì;% ̽(—À··ŸÀ;˜ÔE‘›ˆrúêÕáÞO$Š»_›¢ÚæxŽzQ¼èåÔù9"o×ÐÑFìõå‡WÇoA°³.3Õ¼2Sþ(%­¶º r¡Ïßcûì;`‡äýYOØkˆ§.@îwì=ûæÜ¿s÷'Còyƒéx:I&>\¿HV‹r2ìÏoXùÛ²?ÆÈÁ#Åñ:„ÜüqwbÄþu,Y9™ÌqT›æn¼œ³ßâÛp±£yæc\@=þ|a¿ÇÄþ]Φu=nä±÷9:º =vo¥cðÞ?Íjü‰•Q¢—(«h¼–¿-óF>öôåþáûc’¹cS*m7h<ćï–ÙtÈlT.3Ïe>Š6™!&)¸='`9$3[Ö•9Ò§ç?_œ£ ¶#óU’¡žD¹^u*Õ¸Ra]¨\êåÏû{Ç/P¨åÉ*: á§Êu;žäÐ Ôäk›¨ÜȽ98 !}‡…ÚÊ»:þ4BÚ¶å^ò¬¯È«®=j?yÐè;ùuÍ/nì)mz»¨ùº×ûgÇû'jGÎ §“ª²OªþFÈzûÿx¦. @µÃS+0}î 9Óï‰4\âfî½DnäT/~zóËñ!€{þ¡3õx)óÇåœYà Xo—ëèî´­?›Mâ÷çYç¿B’~_?g“þÕ¸ŸpA6î°&½ÚÈÓ¾}óþâIßáj!ŠÆ1 ÎÛ'Ýt'í¹Àu©6rµ?î¾½<'©º²WbúM'>¢—O¡Ò¼í¸¼…ùu‰6ò«g¯ŽÎÞƒDÝÇ+³ ú‰2rë;EÚ#Ú¯î'n)Ù¬mïjkg—ÙîmíZµ‘K<=:Þ=A»½¸èÌã…oÈ8 ³[+D üºBCJùçeñ—è$çƒÑ(þ:$ÖãÏC*Ã×yÕŸ±«Y@¿0‰µè °úk¹X5C=v´ÎÓñˆ¬NÕ »<ªÎÃ-wœÎÅ)àM–·WàÓGדoÆ>ú9KódPÎñv!†Wãï8 ,'C`8˜ÎʇΠj#ÿîôòù‹÷ÑXd÷iŸtàOC‚y¼±tŸFU†\Ho–]ì½Ü%:Ò,ô ŸÃЃÓGËó@’uD^? 4Â|ä×9R¥| äu,6òõ¿¼Û?:!,:²#›еÁ? ½©n7òô—ïNöOþ~~pv‚{:ÌÕCJ¢ðûÚX|¥`-U×]d×E¤áG<Ú¶óޝ t«îøÝœ 9•Oßó{¿ìW~úfôO<ÐÏMF³ùWM!ø¸Ÿ¾ÔàûÑpqƒ?Ú»_qo\u7™»&sÜókæÂ®™‡Í™7/¤›ÜC“;Ϙ{¿âíåæ¼›W¹ ÞB4yKQƒ¯%›so\¢6™«&s!x ÷Œû²7î=›Ü[‡Žñ~ÑõæÌw“Mæ®-z¹[37›3o\¨5™· Äd°ësüçY6ǽ~µÕà.[&g|»Ë¸«-,¾vßÔd®t3F¬7Û^¦~+ÔdÝöp¹ÜvÍ:lyý®¦Éºemº¶Ïd&¶ßÂÔkWMÞ-cS¾ËÒ·àÝ<ñ7¸+ño­[úþ­qân2o›Ê˜«5æ[ĔƩ¸É¹ek&—Ûd®m‹Ö<¿6™·­­Måt¿æÍÓb“{ÛÞjÎM®c¹ß³6 îºeoÙt¤ø]%þÿ†ëñ endstream endobj 151 0 obj << /Producer (pdfTeX-1.40.12) /Creator (TeX) /CreationDate (D:20130422213937+02'00') /ModDate (D:20130422213937+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.1415926-2.3-1.40.12 (TeX Live 2011) kpathsea version 6.0.1) >> endobj 148 0 obj << /Type /ObjStm /N 8 /First 56 /Length 323 /Filter /FlateDecode >> stream xÚ’]kƒ0†ïó+Î}/òeL„RØtÝÊ&+ݻȪXahQ{±¿˜Hi;GY!pr’“÷y'ŒjÀ0AqàÏ,¥@Šõð}ÉšNN¿w9ày]u¯öŸMûCŠð­nóþðë" n&aœ¦ Ùê(o7M¹ëêÆÈrÃOÌyÙ´]¸Õá"ü¤‡„Òáç2ë¶-(iKg³ÀÓ·u´ˆ-<‹s8%§tÿ@® ¿¬ãè>ž¬æIL !#ä¹ñùQ󞫼«6uVV(þÛÏRy‹pXï ÝX_ê&7»~vöñc™µðÎúÄLÚN]ð\°~Àë?Eòq¸›'¸Æ@8uáÔ}GöÅ%uï/u_Y鄤kAªKzý‡Þ{Ã˱>CÝ鯺@NâàÀÔümÓÔì endstream endobj 152 0 obj << /Type /XRef /Index [0 153] /Size 153 /W [1 3 1] /Root 150 0 R /Info 151 0 R /ID [<15CEE1717B1586DBC02576A8846F4A62> <15CEE1717B1586DBC02576A8846F4A62>] /Length 422 /Filter /FlateDecode >> stream xÚ%Ñ;OTAÆñ÷™3€"A=Š wpä&"ÈÂ* r[PqE@¹ÚÒ :[³&&ð(HHH¶±×DM„V€–È>Í/ÿ73çLæ3³ÿÎ,1˜k†|$ódšL’¹ [Úüš¼#Sd‘¼%Iòž,|B/…Oï²¶ŽÂÁòC­.sÁ±Þ,âa¥ ZÍ!Ù°ê¤Æ«ä ,Ò£ñÉ…µôjÌ'y°Î.æ9’X4¹erEûŠÈuXü«ÆÛ¤–¸<ò¹In‘ˆDµPBîíß5–’»@_­Æ{¤ ¨ÑáºG)F¾hK©&§4Öj`&®q‰Ô’:òŠÔ“û$BÈÒHšÈCÒLZH+i#íäé I'yBºH7°|ªÃŸ)}µ°Ø_SEÃ=UoæÏï¨úàÊVU1¸Ø?Õ3¸T‡ê9\ú³ªîxCGàbª•ÛªAó'ª¾©†Œ«†üM¨FœýTÂתÆà×õ‰Ãüæ'Õ8|ê\5¿y—ð¿+ô+²Iü¯\ƒÿóÃ.ó2I endstream endobj startxref 317136 %%EOF coinor-ipopt-3.14.17/contrib/RInterface/inst/doc/reflist.bib000066400000000000000000000014051473776672200236700ustar00rootroot00000000000000@inproceedings{Leisch2002, author = {Friedrich Leisch}, title = {Sweave: Dynamic Generation of Statistical Reports Using Literate Data Analysis}, booktitle = {Compstat 2002 --- Proceedings in Computational Statistics}, pages = {575--580}, year = 2002, editor = {Wolfgang H{\"a}rdle and Bernd R{\"o}nz}, publisher = {Physica Verlag, Heidelberg}, note = {ISBN 3-7908-1517-9}, url = {http://www.stat.uni-muenchen.de/~leisch/Sweave} } @article{WachterBiegler2006, author = {A. W{\"a}chter and L. T. Biegler}, title = {On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming}, journal = {Mathematical Programming}, volume = {106}, number = {1}, pages = {25--57}, year = {2006} } coinor-ipopt-3.14.17/contrib/RInterface/man/000077500000000000000000000000001473776672200205735ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/RInterface/man/ipoptr-package.Rd000066400000000000000000000122201473776672200237650ustar00rootroot00000000000000\name{ipoptr-package} \alias{ipoptr-package} \docType{package} \title{ R interface to Ipopt } \description{ ipoptr is an R interface to Ipopt (Interior Point Optimizer), an open source software package for large-scale nonlinear optimization. It can be used to solve general nonlinear programming problems with nonlinear constraints and lower and upper bounds for the controls. Ipopt is written in C++ and is released as open source code under the Eclipse Public License (EPL). It is available from the COIN-OR initiative. The code has been written by Carl Laird and Andreas Waechter, who is the COIN project leader for Ipopt. Ipopt is designed to find (local) solutions of mathematical optimization problems of the from min f(x) x in R^n s.t. g_L <= g(x) <= g_U x_L <= x <= x_U where f(x): R^n --> R is the objective function, and g(x): R^n --> R^m are the constraint functions. The vectors g_L and g_U denote the lower and upper bounds on the constraints, and the vectors x_L and x_U are the bounds on the variables x. The functions f(x) and g(x) can be nonlinear and nonconvex, but should be twice continuously differentiable. Note that equality constraints can be formulated in the above formulation by setting the corresponding components of g_L and g_U to the same value. } \author{ Jelmer Ypma } \references{ A. Waechter and L. T. Biegler, On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming, Mathematical Programming 106(1), pp. 25-57, 2006 } \keyword{ optimize } \keyword{ interface } \seealso{ \code{\link{optim}} \code{\link{nlm}} \code{\link{nlminb}} \code{\link[Rsolnp:Rsolnp-package]{Rsolnp}} } \note{See ?ipoptr for more examples.} \examples{ # Example problem, number 71 from the Hock-Schittkowsky test suite # # \min_{x} x1*x4*(x1 + x2 + x3) + x3 # s.t. # x1*x2*x3*x4 >= 25 # x1^2 + x2^2 + x3^2 + x4^2 = 40 # 1 <= x1,x2,x3,x4 <= 5 # # x0 = (1,5,5,1) # # optimal solution = (1.00000000, 4.74299963, 3.82114998, 1.37940829) # # Adapted from the Ipopt C++ interface example. library('ipoptr') # # f(x) = x1*x4*(x1 + x2 + x3) + x3 # eval_f <- function( x ) { return( x[1]*x[4]*(x[1] + x[2] + x[3]) + x[3] ) } eval_grad_f <- function( x ) { return( c( x[1] * x[4] + x[4] * (x[1] + x[2] + x[3]), x[1] * x[4], x[1] * x[4] + 1.0, x[1] * (x[1] + x[2] + x[3]) ) ) } # constraint functions eval_g <- function( x ) { return( c( x[1] * x[2] * x[3] * x[4], x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 ) ) } # The Jacobian for this problem is dense eval_jac_g_structure <- list( c(1,2,3,4), c(1,2,3,4) ) eval_jac_g <- function( x ) { return( c ( x[2]*x[3]*x[4], x[1]*x[3]*x[4], x[1]*x[2]*x[4], x[1]*x[2]*x[3], 2.0*x[1], 2.0*x[2], 2.0*x[3], 2.0*x[4] ) ) } # The Hessian for this problem is actually dense, # This is a symmetric matrix, fill the lower left triangle only. eval_h_structure <- list( c(1), c(1,2), c(1,2,3), c(1,2,3,4) ) eval_h <- function( x, obj_factor, hessian_lambda ) { values <- numeric(10) values[1] = obj_factor * (2*x[4]) # 1,1 values[2] = obj_factor * (x[4]) # 2,1 values[3] = 0 # 2,2 values[4] = obj_factor * (x[4]) # 3,1 values[5] = 0 # 4,2 values[6] = 0 # 3,3 values[7] = obj_factor * (2*x[1] + x[2] + x[3]) # 4,1 values[8] = obj_factor * (x[1]) # 4,2 values[9] = obj_factor * (x[1]) # 4,3 values[10] = 0 # 4,4 # add the portion for the first constraint values[2] = values[2] + hessian_lambda[1] * (x[3] * x[4]) # 2,1 values[4] = values[4] + hessian_lambda[1] * (x[2] * x[4]) # 3,1 values[5] = values[5] + hessian_lambda[1] * (x[1] * x[4]) # 3,2 values[7] = values[7] + hessian_lambda[1] * (x[2] * x[3]) # 4,1 values[8] = values[8] + hessian_lambda[1] * (x[1] * x[3]) # 4,2 values[9] = values[9] + hessian_lambda[1] * (x[1] * x[2]) # 4,3 # add the portion for the second constraint values[1] = values[1] + hessian_lambda[2] * 2 # 1,1 values[3] = values[3] + hessian_lambda[2] * 2 # 2,2 values[6] = values[6] + hessian_lambda[2] * 2 # 3,3 values[10] = values[10] + hessian_lambda[2] * 2 # 4,4 return ( values ) } # initial values x0 <- c( 1, 5, 5, 1 ) # lower and upper bounds of control lb <- c( 1, 1, 1, 1 ) ub <- c( 5, 5, 5, 5 ) # lower and upper bounds of constraints constraint_lb <- c( 25, 40 ) constraint_ub <- c( Inf, 40 ) opts <- list("print_level"=0, "file_print_level"=12, "output_file"="hs071_nlp.out") print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, lb=lb, ub=ub, eval_g=eval_g, eval_jac_g=eval_jac_g, constraint_lb=constraint_lb, constraint_ub=constraint_ub, eval_jac_g_structure=eval_jac_g_structure, eval_h=eval_h, eval_h_structure=eval_h_structure, opts=opts) ) } coinor-ipopt-3.14.17/contrib/RInterface/man/ipoptr.Rd000066400000000000000000000202511473776672200223770ustar00rootroot00000000000000\name{ipoptr} \alias{ipoptr} \title{ R interface to Ipopt } \description{ ipoptr is an R interface to Ipopt (Interior Point Optimizer), an open source software package for large-scale nonlinear optimization. It can be used to solve general nonlinear programming problems with nonlinear constraints and lower and upper bounds for the controls. Ipopt is written in C++ and is released as open source code under the Eclipse Public License (EPL). It is available from the COIN-OR initiative. The code has been written by Carl Laird and Andreas Waechter, who is the COIN project leader for Ipopt. Ipopt is designed to find (local) solutions of mathematical optimization problems of the from min f(x) x in R^n s.t. g_L <= g(x) <= g_U x_L <= x <= x_U where f(x): R^n --> R is the objective function, and g(x): R^n --> R^m are the constraint functions. The vectors g_L and g_U denote the lower and upper bounds on the constraints, and the vectors x_L and x_U are the bounds on the variables x. The functions f(x) and g(x) can be nonlinear and nonconvex, but should be twice continuously differentiable. Note that equality constraints can be formulated in the above formulation by setting the corresponding components of g_L and g_U to the same value. } \usage{ ipoptr( x0, eval_f, eval_grad_f, lb = NULL, ub = NULL, eval_g = function( x ) { return( numeric(0) ) }, eval_jac_g = function( x ) { return( numeric(0) ) }, eval_jac_g_structure = list(), constraint_lb = numeric(0), constraint_ub = numeric(0), eval_h = NULL, eval_h_structure = NULL, opts = list(), ipoptr_environment = new.env(), ... ) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x0}{ vector with starting values for the optimization. } \item{eval_f}{ function that returns the value of the objective function. } \item{eval_grad_f}{ function that returns the value of the gradient of the objective function. } \item{lb}{ vector with lower bounds of the controls (use -1.0e19 for controls without lower bound). } \item{ub}{ vector with upper bounds of the controls (use 1.0e19 for controls without upper bound). } \item{eval_g}{ function to evaluate (non-)linear constraints that should hold in the solution. } \item{eval_jac_g}{ function to evaluate the jacobian of the (non-)linear constraints that should hold in the solution. } \item{eval_jac_g_structure}{ list of vectors with indices defining the sparseness structure of the Jacobian. Each element of the list corresponds to a row in the matrix. Each index corresponds to a non-zero element in the matrix (see also \code{\link[ipoptr:print.sparseness]{print.sparseness}}). } \item{constraint_lb}{ vector with lower bounds of the (non-)linear constraints } \item{constraint_ub}{ vector with upper bounds of the (non-)linear constraints } \item{eval_h}{ function to evaluate the hessian. } \item{eval_h_structure}{ list of vectors with indices defining the sparseness structure of the Hessian. Each element of the list corresponds to a row in the matrix. Each index corresponds to a non-zero element in the matrix (see also \code{\link[ipoptr:print.sparseness]{print.sparseness}}). } \item{opts}{ list with options, see examples below. For a full list of options use the option "print_options_documentation"='yes', or have a look at the Ipopt documentation at \url{http://www.coin-or.org/Ipopt/documentation/}. } \item{ipoptr_environment}{ environment that is used to evaluate the functions. Use this to pass additional data or parameters to a function. See the second example in \code{parameters.R} in the \code{tests} directory. } \item{...}{ arguments that will be passed to the user-defined objective and constraints functions. } } \value{ The return value contains a list with the inputs, and additional elements \item{call}{the call that was made to solve} \item{status}{integer value with the status of the optimization (0 is success)} \item{message}{more informative message with the status of the optimization} \item{iterations}{number of iterations that were executed} \item{objective}{value if the objective function in the solution} \item{solution}{optimal value of the controls} } \references{ A. Waechter and L. T. Biegler, On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming, Mathematical Programming 106(1), pp. 25-57, 2006 } \author{ Jelmer Ypma } \seealso{ \code{\link{optim}} \code{\link{nlm}} \code{\link{nlminb}} \code{\link[Rsolnp:Rsolnp-package]{Rsolnp}} \code{\link[Rsolnp:solnp]{ssolnp}} \code{\link[ipoptr:print.sparseness]{print.sparseness}} \code{\link[ipoptr:make.sparse]{make.sparse}} } \note{See ?`ipoptr-package` for an extended example.} \examples{ library('ipoptr') ## Rosenbrock Banana function eval_f <- function(x) { return( 100 * (x[2] - x[1] * x[1])^2 + (1 - x[1])^2 ) } ## Gradient of Rosenbrock Banana function eval_grad_f <- function(x) { c(-400 * x[1] * (x[2] - x[1] * x[1]) - 2 * (1 - x[1]), 200 * (x[2] - x[1] * x[1])) } # The Hessian for this problem is actually dense, # This is a symmetric matrix, fill the lower left triangle only. eval_h_structure <- list( c(1), c(1,2) ) eval_h <- function( x, obj_factor, hessian_lambda ) { return( obj_factor*c( 2 - 400*(x[2] - x[1]^2) + 800*x[1]^2, # 1,1 -400*x[1], # 2,1 200 ) ) # 2,2 } # initial values x0 <- c( -1.2, 1 ) opts <- list("print_level"=0, "file_print_level"=12, "output_file"="banana.out", "tol"=1.0e-8) # solve Rosenbrock Banana function with analytic hessian print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, eval_h=eval_h, eval_h_structure=eval_h_structure, opts=opts) ) # solve Rosenbrock Banana function with approximated hessian print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, opts=opts) ) ## # # Solve the example taken from the Ipopt C++ # tutorial document (see Examples/CppTutorial/). # # min_x f(x) = -(x2-2)^2 # s.t. # 0 = x1^2 + x2 - 1 # -1 <= x1 <= 1 # ## eval_f <- function( x ) { print( paste( "In R::eval_f, x = ", paste( c(1,2), collapse=', ' ) ) ) return( -(x[2] - 2.0)*(x[2] - 2.0) ) } eval_grad_f <- function( x ) { return( c(0.0, -2.0*(x[2] - 2.0) ) ) } eval_g <- function( x ) { return( -(x[1]*x[1] + x[2] - 1.0) ); } # list with indices of non-zero elements # each element of the list corresponds to the derivative of one constraint # # e.g. # / 0 x x \ # \ x 0 x / # would be # list( c(2,3), c(1,3) ) eval_jac_g_structure <- list( c(1,2) ) # this should return a vector with all the non-zero elements # so, no list here, because that is slower I guess # TODO: make an R-function that shows the structure in matrix form eval_jac_g <- function( x ) { return ( c ( -2.0 * x[1], -1.0 ) ) } # diagonal matrix, usually only fill the lower triangle eval_h_structure <- list( c(1), c(2) ) eval_h <- function( x, obj_factor, hessian_lambda ) { return ( c( -2.0*hessian_lambda[1], -2.0*obj_factor ) ) } x0 <- c(0.5,1.5) lb <- c( -1, -1.0e19 ) ub <- c( 1, 1.0e19 ) constraint_lb <- 0 constraint_ub <- 0 opts <- list("print_level"=0, "file_print_level"=12, "output_file"="ipopttest.out") print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, lb=lb, ub=ub, eval_g=eval_g, eval_jac_g=eval_jac_g, eval_jac_g_structure=eval_jac_g_structure, constraint_lb=constraint_lb, constraint_ub=constraint_ub, eval_h=eval_h, eval_h_structure=eval_h_structure, opts=opts) ) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ optimize } \keyword{ interface } coinor-ipopt-3.14.17/contrib/RInterface/man/is.ipoptr.Rd000066400000000000000000000016161473776672200230150ustar00rootroot00000000000000\name{is.ipoptr} \alias{is.ipoptr} \title{ R interface to Ipopt } \description{ is.ipoptr preforms checks to see if a fully specified problem is supplied to ipoptr. Mostly for internal use. } \usage{ is.ipoptr( x ) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{ object to be tested. } } \value{ Logical. Return TRUE if all tests were passed, otherwise return FALSE or exit with Error. } \references{ A. Waechter and L. T. Biegler, On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming, Mathematical Programming 106(1), pp. 25-57, 2006 } \author{ Jelmer Ypma } \seealso{ \code{\link[ipoptr:ipoptr]{ipoptr}} \code{\link[ipoptr:print.sparseness]{print.sparseness}} } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ optimize } \keyword{ interface } coinor-ipopt-3.14.17/contrib/RInterface/man/make.sparse.Rd000066400000000000000000000021131473776672200232700ustar00rootroot00000000000000\name{make.sparse} \alias{make.sparse} \title{ Create sparseness structure from logical matrix } \description{ This function creates the sparseness structure of a logical matrix in the format that is required by ipoptr. } \usage{ make.sparse( A ) } \arguments{ \item{A}{ Matrix with logicals. TRUE denotes a non-zero element in the matrix. } } \value{ List of vectors with indices. Each element of the list corresponds to a row in the matrix. Each index corresponds to a non-zero element in the matrix. } \author{ Jelmer Ypma } \seealso{ \code{\link[ipoptr:ipoptr]{ipoptr}} \code{\link[ipoptr:print.sparseness]{print.sparseness}} } \examples{ library('ipoptr') # print lower-diagonal 5x5 matrix generated with make.sparse A_lower <- make.sparse( lower.tri( matrix(1, nrow=5, ncol=5), diag=TRUE ) ) print.sparseness( A_lower ) # prnit a diagonal 5x5 matrix without indices counts A_diag <- make.sparse( diag(5) > 0 ) print.sparseness( A_diag ) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ optimize } \keyword{ interface } coinor-ipopt-3.14.17/contrib/RInterface/man/plot.sparseness.Rd000066400000000000000000000034021473776672200242240ustar00rootroot00000000000000\name{plot.sparseness} \alias{plot.sparseness} \title{ Plot sparseness structure of matrix } \description{ This function plots the sparseness structure of a matrix in the format that is required by ipoptr. } \usage{ plot.sparseness( x, pch='.', asp=1, xaxs='i', yaxs='i', ... ) } \arguments{ \item{x}{ list of vectors with indices. Each element of the list corresponds to a row in the matrix. Each index corresponds to a non-zero element in the matrix. } \item{pch}{ plotting `character'. See \code{\link[graphics:plot]{points}} for possible values. } \item{asp}{ aspect ratio, default = 1. } \item{xaxs, yaxs}{ style of axis interval calculation, default = 'i' (do not extend the axis). See \code{\link[graphics:plot]{par}} for more information. } \item{...}{ further graphical parameters that will be passed to \code{\link[graphics:plot]{plot}}. } } \value{ A list with the non-zero x and y indices is returned. } \author{ Jelmer Ypma } \seealso{ \code{\link[ipoptr:ipoptr]{ipoptr}} \code{\link[ipoptr:print.sparseness]{print.sparseness}} \code{\link[ipoptr:make.sparse]{make.sparse}} } \examples{ library('ipoptr') # use different plotting symbol for small matrices plot.sparseness( make.sparse(diag(5)), pch='x' ) # plot large matrix example s <- make.sparse( lower.tri( matrix( 1, 500, 500), diag=TRUE ) ) plot.sparseness( s ) # plot another large matrix s <- do.call( "cbind", lapply( 1:5, function(i) { diag(5) \%x\% matrix(1, nrow=5, ncol=20) } ) ) s <- do.call( "rbind", lapply( 1:10, function(i) { s } ) ) s <- cbind( matrix( 1, nrow=nrow(s), ncol=40 ), s ) plot.sparseness( make.sparse( s ) ) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ optimize } \keyword{ interface } coinor-ipopt-3.14.17/contrib/RInterface/man/print.ipoptr.Rd000066400000000000000000000017751473776672200235440ustar00rootroot00000000000000\name{print.ipoptr} \alias{print.ipoptr} \title{ Print results after running ipoptr } \description{ This function prints the ipoptr object that holds the results from a minimization using \code{ipoptr}. } \usage{ \method{print}{ipoptr}( x, show.controls=TRUE, \dots ) } \arguments{ \item{x}{ object containing result from minimization. } \item{show.controls}{ Logical or vector with indices. Should we show the value of the control variables in the solution? If code{show.controls} is a vector with indices, it is used to select which control variables should be shown. This can be useful if the model contains a set of parameters of interest and a set of nuisance parameters that are not of immediate interest. } \item{...}{ further arguments passed to or from other methods. } } \author{ Jelmer Ypma } \seealso{ \code{\link[ipoptr:ipoptr]{ipoptr}} \code{\link[ipoptr:make.sparse]{make.sparse}} \code{\link[ipoptr:print.sparseness]{print.sparseness}} } \keyword{ optimize } \keyword{ interface } coinor-ipopt-3.14.17/contrib/RInterface/man/print.sparseness.Rd000066400000000000000000000052611473776672200244070ustar00rootroot00000000000000\name{print.sparseness} \alias{print.sparseness} \title{ Show sparseness structure of matrix } \description{ This function shows the sparseness structure of a matrix in the format that is required by ipoptr. } \usage{ print.sparseness( x, indices=TRUE, data=NULL, ncol=NULL, ... ) } \arguments{ \item{x}{ list of vectors with indices. Each element of the list corresponds to a row in the matrix. Each index corresponds to a non-zero element in the matrix. } \item{indices}{ Logical. Should we show the order of the non-zero elements or just whether an element is non-zero? } \item{data}{ vector with non-zero elements of the sparse matrix. } \item{ncol}{ integer supplying the number of columns of the sparse matrix. If this is not supplied, we take the number of columns as the largest index in \code{s}. } \item{...}{ further arguments passed to or from other methods. } } \value{ A matrix showing the sparseness structure is returned. } \author{ Jelmer Ypma } \seealso{ \code{\link[ipoptr:ipoptr]{ipoptr}} \code{\link[ipoptr:plot.sparseness]{plot.sparseness}} \code{\link[ipoptr:make.sparse]{make.sparse}} } \examples{ library('ipoptr') # print lower-diagonal 4x4 matrix print.sparseness( list( c(1), c(1,2), c(1,2,3), c(1,2,3,4) ) ) # print diagonal 3x3 matrix without indices counts print.sparseness( list( c(1), c(2), c(3) ), indices=FALSE ) # print a third sparse matrix print.sparseness( list( c(1,3,6,8), c(2,5), c(3,7,9) ) ) # and a fourth one, where the elements are in a different order print.sparseness( list( c(3,1,6,8), c(2,5), c(3,9,7) ) ) # print lower-diagonal 5x5 matrix generated with make.sparse A_lower <- make.sparse( lower.tri( matrix(1, nrow=5, ncol=5), diag=TRUE ) ) print.sparseness( A_lower ) # print a diagonal 5x5 matrix without indices counts A_diag <- make.sparse( diag(5) > 0 ) print.sparseness( A_diag ) # example from tests/lasso.R n <- 100 # number of observations m <- 5 # number of variables # define hessian function hessian <- function( A ) { H <- t(A) %*% A H <- unlist( lapply( 1:m, function(i) { H[i,1:i] } ) ) return( H ) } # define the structure hessian_structure <- c( lapply( 1:m, function(x) { return( c(1:x) ) } ), lapply( 1:m, function(x) { return( c() ) } ) ) # generate data set.seed( 3141 ) A <- hessian( matrix( rnorm( n*m ), nrow=n, ncol=m ) ) print.sparseness( x = hessian_structure, indices = TRUE, data = format( A, digits=2, nsmall=2, justify='right'), ncol = 2*m ) } % Add one or more standard keywords, see file 'KEYWORDS' in the % R documentation directory. \keyword{ optimize } \keyword{ interface } coinor-ipopt-3.14.17/contrib/RInterface/src/000077500000000000000000000000001473776672200206075ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/RInterface/src/IpoptRJournal.cpp000066400000000000000000000027561473776672200240750ustar00rootroot00000000000000/* Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. * This code is published under the Eclipse Public License. * * file: IpoptRJournal.cpp * author: Jelmer Ypma * date: 30 January 2011 * * This file defines a C++ class that takes care of re-directing * output to the R terminal. Needed for Windows. * * Financial support of the UK Economic and Social Research Council * through a grant (RES-589-28-0001) to the ESRC Centre for Microdata * Methods and Practice (CeMMAP) is gratefully acknowledged. */ #include "IpoptRJournal.hpp" IpoptRJournal::IpoptRJournal( Ipopt::EJournalLevel default_level ) : Journal("IpoptRJournal", default_level) { } void IpoptRJournal::PrintImpl( Ipopt::EJournalCategory /*category*/, Ipopt::EJournalLevel /*level*/, const char* str ) { // print string to R console Rprintf(str); } void IpoptRJournal::PrintfImpl( Ipopt::EJournalCategory /*category*/, Ipopt::EJournalLevel /*level*/, const char* pformat, va_list ap ) { // Define string const int MaxStrLen = 8192; char s[MaxStrLen]; // R guarantees to have an implementation of vsnprintf available // http://www.mail-archive.com/r-devel@stat.math.ethz.ch/msg07054.html if( vsnprintf(s, MaxStrLen, pformat, ap) > MaxStrLen ) { Rprintf("Warning: not all characters of next line are printed to the R console.\n"); } // print string to R console Rprintf(s); } void IpoptRJournal::FlushBufferImpl() { } coinor-ipopt-3.14.17/contrib/RInterface/src/IpoptRJournal.hpp000066400000000000000000000024651473776672200240770ustar00rootroot00000000000000/* Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. * This code is published under the Eclipse Public License. * * file: IpoptRJournal.hpp * author: Jelmer Ypma * date: 30 January 2011 * * This file defines a C++ class that takes care of re-directing * output to the R terminal. Needed for Windows. * * Financial support of the UK Economic and Social Research Council * through a grant (RES-589-28-0001) to the ESRC Centre for Microdata * Methods and Practice (CeMMAP) is gratefully acknowledged. */ #ifndef __IpoptRJournal_HPP__ #define __IpoptRJournal_HPP__ #include "IpJournalist.hpp" // ISA Journal #include // USES Rprintf class IpoptRJournal: public Ipopt::Journal { public: // The constructor. IpoptRJournal( Ipopt::EJournalLevel default_level ); // The destructor. virtual ~IpoptRJournal() { } protected: // These functions override the functions in the Journal class. virtual void PrintImpl( Ipopt::EJournalCategory category, Ipopt::EJournalLevel level, const char* str ); virtual void PrintfImpl( Ipopt::EJournalCategory category, Ipopt::EJournalLevel level, const char* pformat, va_list ap ); virtual void FlushBufferImpl(); }; #endif coinor-ipopt-3.14.17/contrib/RInterface/src/IpoptRNLP.cpp000066400000000000000000000473641473776672200231200ustar00rootroot00000000000000/* Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. * This code is published under the Eclipse Public License. * * file: IpoptRNLP.cpp * author: Jelmer Ypma * date: 18 April 2010 * * This file defines a C++ class that derives from Ipopt::TNLP. The class * takes care of interaction between Ipopt and user-defined functions in R. * * Financial support of the UK Economic and Social Research Council * through a grant (RES-589-28-0001) to the ESRC Centre for Microdata * Methods and Practice (CeMMAP) is gratefully acknowledged. * * Changelog: * 09/03/2012: added outputs in finalize_solution; z_L, z_U, constraints, lambda (thanks to Michael Schedl) */ #include "IpoptRNLP.hpp" /* Constructor. */ IpoptRNLP::IpoptRNLP() : d_hessian_approximation(false), d_num_protected_members(0) { } IpoptRNLP::~IpoptRNLP() { // UNPROTECT all SEXP members that we PROTECT UNPROTECT(d_num_protected_members); } // // Functions to load R Objects into IpoptRProblem // void IpoptRNLP::set_R_environment( SEXP env ) { PROTECT(R_environment = env); d_num_protected_members++; } void IpoptRNLP::set_R_eval_f( SEXP f ) { PROTECT(R_eval_f = f); d_num_protected_members++; } void IpoptRNLP::set_R_eval_grad_f( SEXP f ) { PROTECT(R_eval_grad_f = f); d_num_protected_members++; } void IpoptRNLP::set_R_init_values( SEXP x0 ) { PROTECT(R_init_values = x0); d_num_protected_members++; } void IpoptRNLP::set_R_lower_bounds( SEXP lb ) { PROTECT(R_lower_bounds = lb); d_num_protected_members++; } void IpoptRNLP::set_R_upper_bounds( SEXP ub ) { PROTECT(R_upper_bounds = ub); d_num_protected_members++; } void IpoptRNLP::set_R_eval_g( SEXP g ) { PROTECT(R_eval_g = g); d_num_protected_members++; } void IpoptRNLP::set_R_eval_jac_g( SEXP g ) { PROTECT(R_eval_jac_g = g); d_num_protected_members++; } void IpoptRNLP::set_R_eval_jac_g_structure( SEXP s ) { PROTECT(R_eval_jac_g_structure = s); d_num_protected_members++; } void IpoptRNLP::set_R_constraint_lower_bounds( SEXP lb ) { PROTECT(R_constraint_lower_bounds = lb); d_num_protected_members++; } void IpoptRNLP::set_R_constraint_upper_bounds( SEXP ub ) { PROTECT(R_constraint_upper_bounds = ub); d_num_protected_members++; } void IpoptRNLP::set_R_eval_h( SEXP h ) { PROTECT(R_eval_h = h); d_num_protected_members++; } void IpoptRNLP::set_R_eval_h_structure( SEXP s ) { PROTECT(R_eval_h_structure = s); d_num_protected_members++; } void IpoptRNLP::set_hessian_approximation( bool b ) { d_hessian_approximation = b; } SEXP IpoptRNLP::get_R_result_list() { return R_result_list; } bool IpoptRNLP::get_nlp_info( Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g, Ipopt::Index& nnz_h_lag, IndexStyleEnum& index_style ) { // Check for user interruption from R R_CheckUserInterrupt(); // number of control variables n = length(R_init_values); // number of constraints m = length(R_constraint_lower_bounds); // Loop over the elements in R_eval_jac_g_structure and count the number of non-zero indices // in the Jacobian. As far as I know unlist() does not exist in C, so we cannot call that directly. nnz_jac_g = 0; for( int list_cnt = 0; list_cnt < length(R_eval_jac_g_structure); list_cnt++ ) { SEXP R_list_element; PROTECT(R_list_element = AS_INTEGER(VECTOR_ELT(R_eval_jac_g_structure, list_cnt))); nnz_jac_g += length(R_list_element); UNPROTECT(1); } // Loop over the elements in R_eval_h_structure and count the number of non-zero indices // in the hessian of the lagrangian (combined hessian of the objective and hessian of the constraints). nnz_h_lag = 0; for( int list_cnt = 0; list_cnt < length(R_eval_h_structure); list_cnt++ ) { SEXP R_list_element; PROTECT(R_list_element = AS_INTEGER(VECTOR_ELT(R_eval_h_structure, list_cnt))); nnz_h_lag += length(R_list_element); UNPROTECT(1); } // We use the standard Fortran Ipopt::Index style for row/col entries, // This is the same as R, start counting indices in the structure matrices at 1 index_style = FORTRAN_STYLE; return true; } bool IpoptRNLP::get_bounds_info( Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u, Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u ) { // Check that the number of controls, n, and the number of constraints, m // are of the same length as the R variables that were passed. assert(n == length(R_init_values)); assert(n == length(R_lower_bounds)); assert(n == length(R_upper_bounds)); assert(m == length(R_constraint_lower_bounds)); assert(m == length(R_constraint_upper_bounds)); // Check for user interruption from R R_CheckUserInterrupt(); // set the upper and lower bounds of the control for( Ipopt::Index i = 0; i < n; i++ ) { x_l[i] = REAL(R_lower_bounds)[i]; // lower bound x_u[i] = REAL(R_upper_bounds)[i]; // upper bound } // set the upper and lower bounds of the inequality constraints for( Ipopt::Index i = 0; i < m; i++ ) { g_l[i] = REAL(R_constraint_lower_bounds)[i]; // lower bound g_u[i] = REAL(R_constraint_upper_bounds)[i]; // upper bound } return true; } bool IpoptRNLP::get_starting_point( Ipopt::Index n, bool init_x, Ipopt::Number* x, bool init_z, Ipopt::Number* /*z_L*/, Ipopt::Number* /*z_U*/, Ipopt::Index /*m*/, bool init_lambda, Ipopt::Number* /*lambda*/ ) { // We have starting values for the control, x, only. assert(init_x == true); (void) init_x; assert(init_z == false); (void) init_z; assert(init_lambda == false); (void) init_lambda; // Check for user interruption from R R_CheckUserInterrupt(); // set initial values of the controls for( Ipopt::Index i = 0; i < n; i++ ) { x[i] = REAL(R_init_values)[i]; } return true; } bool IpoptRNLP::eval_f( Ipopt::Index n, const Ipopt::Number* x, bool /*new_x*/, Ipopt::Number& obj_value ) { // Calculate and return the value of the objective function // Check for user interruption from R R_CheckUserInterrupt(); SEXP rargs, Rcall, result; // Allocate memory for a vector of reals. // This vector will contain the elements of x, // x is the argument to the R function R_eval_f PROTECT(rargs = allocVector(REALSXP, n)); for( Ipopt::Index i = 0; i < n; i++ ) { REAL(rargs)[i] = x[i]; } // evaluate R function R_eval_f with the control x as an argument PROTECT(Rcall = lang2(R_eval_f, rargs)); PROTECT(result = eval(Rcall, R_environment)); // recode the return value from SEXP to Number obj_value = REAL(result)[0]; UNPROTECT(3); return true; } bool IpoptRNLP::eval_grad_f( Ipopt::Index n, const Ipopt::Number* x, bool /*new_x*/, Ipopt::Number* grad_f ) { // Calculate and return the gradient of the objective function grad_{x} f(x) // if we have two controls, x1 and x2: // grad_f[0] = grad_{x1} f(x) // grad_f[1] = grad_{x2} f(x) // Check for user interruption from R R_CheckUserInterrupt(); SEXP rargs, Rcall, result; // allocate memory for a vector of reals // this vector will contain the elements of x // x is the argument to the R function R_eval_grad_f PROTECT(rargs = allocVector(REALSXP, n)); for( Ipopt::Index i = 0; i < n; i++ ) { REAL(rargs)[i] = x[i]; } // evaluate R function R_eval_grad_f with the control x as an argument PROTECT(Rcall = lang2(R_eval_grad_f, rargs)); PROTECT(result = eval(Rcall, R_environment)); // recode the return values from SEXP to Numbers for( Ipopt::Index i = 0; i < n; i++ ) { grad_f[i] = REAL(result)[i]; } UNPROTECT(3); return true; } bool IpoptRNLP::eval_g( Ipopt::Index n, const Ipopt::Number* x, bool /*new_x*/, Ipopt::Index m, Ipopt::Number* g ) { // Calculate and return the value of the constraints: g(x) // Check for user interruption from R R_CheckUserInterrupt(); SEXP rargs, Rcall, result; // Allocate memory for a vector of reals // this vector will contain the elements of x // x is the argument to the R function R_eval_g PROTECT(rargs = allocVector(REALSXP, n)); for( Ipopt::Index i = 0; i < n; i++ ) { REAL(rargs)[i] = x[i]; } PROTECT(Rcall = lang2(R_eval_g, rargs)); PROTECT(result = eval(Rcall, R_environment)); for( Ipopt::Index i = 0; i < m; i++ ) { g[i] = REAL(result)[i]; } UNPROTECT(3); return true; } bool IpoptRNLP::eval_jac_g( Ipopt::Index n, const Ipopt::Number* x, bool /*new_x*/, Ipopt::Index /*m*/, Ipopt::Index nele_jac, Ipopt::Index* iRow, Ipopt::Index* jCol, Ipopt::Number* values ) { // These use Fortran indexing style and start counting at 1 // Check for user interruption from R R_CheckUserInterrupt(); if( values == NULL ) { // return the structure of the jacobian of the constraints // element at 1,1: grad_{x1} g_{1}(x) //iRow[0] = 1; //jCol[0] = 1; // element at 1,2: grad_{x2} g_{1}(x) //iRow[1] = 1; //jCol[1] = 2; Ipopt::Index total_cnt = 0; for( int list_cnt = 0; list_cnt < length(R_eval_jac_g_structure); list_cnt++ ) { SEXP R_list_element; PROTECT(R_list_element = AS_INTEGER(VECTOR_ELT(R_eval_jac_g_structure, list_cnt))); for( int vector_cnt = 0; vector_cnt < length(R_list_element); vector_cnt++ ) { iRow[total_cnt] = list_cnt + 1; // we have to add 1 to turn it into Fortran styl indexing jCol[total_cnt] = INTEGER(R_list_element)[vector_cnt]; total_cnt++; } UNPROTECT(1); } } else { // return the values of the jacobian of the constraints SEXP rargs, Rcall, result; // allocate memory for a vector of reals // this vector will contain the elements of x // x is the argument to the R function R_eval_g_jac PROTECT(rargs = allocVector(REALSXP, n)); for( Ipopt::Index i = 0; i < n; i++ ) { REAL(rargs)[i] = x[i]; } PROTECT(Rcall = lang2(R_eval_jac_g, rargs)); PROTECT(result = eval(Rcall, R_environment)); for( Ipopt::Index i = 0; i < nele_jac; i++ ) { values[i] = REAL(result)[i]; } UNPROTECT(3); } return true; } bool IpoptRNLP::eval_h( Ipopt::Index n, const Ipopt::Number* x, bool /*new_x*/, Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda, bool /*new_lambda*/, Ipopt::Index nele_hess, Ipopt::Index* iRow, Ipopt::Index* jCol, Ipopt::Number* values ) { // Check for user interruption from R R_CheckUserInterrupt(); if( d_hessian_approximation ) { return false; } else { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. // Note: off-diagonal elements are zero for this problem // element at 1,1: grad^2_{x1,x1} L(x,lambda) // iRow[0] = 1; // jCol[0] = 1; // element at 2,2: grad^2_{x2,x2} L(x,lambda) // iRow[1] = 2; // jCol[1] = 2; Ipopt::Index total_cnt = 0; for( int list_cnt = 0; list_cnt < length(R_eval_h_structure); list_cnt++ ) { SEXP R_list_element; PROTECT(R_list_element = AS_INTEGER(VECTOR_ELT(R_eval_h_structure, list_cnt))); for( int vector_cnt = 0; vector_cnt < length(R_list_element); vector_cnt++ ) { iRow[total_cnt] = list_cnt + 1; // we have to add 1 to turn it into Fortran styl indexing jCol[total_cnt] = INTEGER(R_list_element)[vector_cnt]; total_cnt++; } UNPROTECT(1); } } else { // return the values // element at 1,1: grad^2_{x1,x1} L(x,lambda) // values[0] = -2.0 * lambda[0]; // element at 2,2: grad^2_{x2,x2} L(x,lambda) // values[1] = -2.0 * obj_factor; SEXP rargs_x; PROTECT(rargs_x = allocVector(REALSXP, n)); for( Ipopt::Index i = 0; i < n; i++ ) { REAL(rargs_x)[i] = x[i]; } SEXP rargs_obj_factor; PROTECT(rargs_obj_factor = allocVector(REALSXP, 1)); REAL(rargs_obj_factor)[0] = obj_factor; SEXP rargs_lambda; PROTECT(rargs_lambda = allocVector(REALSXP, m)); for( Ipopt::Index i = 0; i < m; i++ ) { REAL(rargs_lambda)[i] = lambda[i]; } SEXP Rcall, result; PROTECT(Rcall = lang4(R_eval_h, rargs_x, rargs_obj_factor, rargs_lambda)); PROTECT(result = eval(Rcall, R_environment)); for( Ipopt::Index i = 0; i < nele_hess; i++ ) { values[i] = REAL(result)[i]; } UNPROTECT(5); } return true; } } void IpoptRNLP::finalize_solution( Ipopt::SolverReturn status, Ipopt::Index n, const Ipopt::Number* x, const Ipopt::Number* z_L, const Ipopt::Number* z_U, Ipopt::Index m, const Ipopt::Number* g, const Ipopt::Number* lambda, Ipopt::Number obj_value, const Ipopt::IpoptData* /*ip_data*/, Ipopt::IpoptCalculatedQuantities* /*ip_cq*/ ) { // Here we convert the results from c++ to an SEXP list with elements // 0. status; integer with convergence status // 1. message; string with convergence status // 2. iterations; number of iterations // 3. objective; final value of the objective function // 4. solution; final values for the control variables // 5. z_L; final values for the lower bound multipliers // 6. z_U; final values for the upper bound multipliers // 7. constraints; final values for the constraints // 8. lambda; final values for the Lagrange multipliers int num_return_elements = 9; // R_result_list is a member object, which has been protected in the constructor // and will be unprotected in the destructor. PROTECT(R_result_list = allocVector(VECSXP, num_return_elements)); d_num_protected_members++; // attach names to the return list SEXP names; PROTECT(names = allocVector(STRSXP, num_return_elements)); SET_STRING_ELT(names, 0, mkChar("status")); SET_STRING_ELT(names, 1, mkChar("message")); SET_STRING_ELT(names, 2, mkChar("iterations")); SET_STRING_ELT(names, 3, mkChar("objective")); SET_STRING_ELT(names, 4, mkChar("solution")); SET_STRING_ELT(names, 5, mkChar("z_L")); SET_STRING_ELT(names, 6, mkChar("z_U")); SET_STRING_ELT(names, 7, mkChar("constraints")); SET_STRING_ELT(names, 8, mkChar("lambda")); setAttrib(R_result_list, R_NamesSymbol, names); // convert status to an R object SEXP R_status; PROTECT(R_status = allocVector(INTSXP, 1)); INTEGER(R_status)[0] = (int) status; SEXP R_status_message; PROTECT(R_status_message = allocVector(STRSXP, 1)); switch( status ) { case Ipopt::SUCCESS: SET_STRING_ELT(R_status_message, 0, mkChar( "SUCCESS: Algorithm terminated successfully at a locally optimal point, satisfying the convergence tolerances (can be specified by options).")); break; case Ipopt::MAXITER_EXCEEDED: SET_STRING_ELT(R_status_message, 0, mkChar("MAXITER_EXCEEDED: Maximum number of iterations exceeded (can be specified by an option).")); break; case Ipopt::STOP_AT_TINY_STEP: SET_STRING_ELT(R_status_message, 0, mkChar("STOP_AT_TINY_STEP: Algorithm proceeds with very little progress.")); break; case Ipopt::STOP_AT_ACCEPTABLE_POINT: SET_STRING_ELT(R_status_message, 0, mkChar( "STOP_AT_ACCEPTABLE_POINT: Algorithm stopped at a point that was converged, not to ``desired'' tolerances, but to ``acceptable'' tolerances (see the acceptable-... options).")); break; case Ipopt::LOCAL_INFEASIBILITY: SET_STRING_ELT(R_status_message, 0, mkChar( "LOCAL_INFEASIBILITY: Algorithm converged to a point of local infeasibility. Problem may be infeasible.")); break; case Ipopt::USER_REQUESTED_STOP: SET_STRING_ELT(R_status_message, 0, mkChar( "USER_REQUESTED_STOP: The user call-back function intermediate_callback (see Section 3.3.4) returned false, i.e., the user code requested a premature termination of the optimization.")); break; case Ipopt::DIVERGING_ITERATES: SET_STRING_ELT(R_status_message, 0, mkChar("DIVERGING_ITERATES: It seems that the iterates diverge.")); break; case Ipopt::RESTORATION_FAILURE: SET_STRING_ELT(R_status_message, 0, mkChar("RESTORATION_FAILURE: Restoration phase failed, algorithm doesn't know how to proceed.")); break; case Ipopt::ERROR_IN_STEP_COMPUTATION: SET_STRING_ELT(R_status_message, 0, mkChar( "ERROR_IN_STEP_COMPUTATION: An unrecoverable error occurred while IPOPT tried to compute the search direction.")); break; case Ipopt::INVALID_NUMBER_DETECTED: SET_STRING_ELT(R_status_message, 0, mkChar( "INVALID_NUMBER_DETECTED: Algorithm received an invalid number (such as NaN or Inf) from the NLP; see also option check_derivatives_for_naninf.")); break; case Ipopt::INTERNAL_ERROR: SET_STRING_ELT(R_status_message, 0, mkChar( "INTERNAL_ERROR: An unknown internal error occurred. Please contact the IPOPT authors through the mailing list.")); break; default: SET_STRING_ELT(R_status_message, 0, mkChar("Return status not recognized.")); } // !!! we add number of iterations in the main program // convert value of objective function to an R object SEXP R_objective; PROTECT(R_objective = allocVector(REALSXP, 1)); REAL(R_objective)[0] = obj_value; // convert the value of the controls to an R object SEXP R_solution; PROTECT(R_solution = allocVector(REALSXP, n)); for( Ipopt::Index i = 0; i < n; i++ ) { REAL(R_solution)[i] = x[i]; } SEXP R_z_L; PROTECT(R_z_L = allocVector(REALSXP, n)); for( Ipopt::Index i = 0; i < n; i++ ) { REAL(R_z_L)[i] = z_L[i]; } SEXP R_z_U; PROTECT(R_z_U = allocVector(REALSXP, n)); for( Ipopt::Index i = 0; i < n; i++ ) { REAL(R_z_U)[i] = z_U[i]; } SEXP R_constraints; PROTECT(R_constraints = allocVector(REALSXP, m)); for( Ipopt::Index i = 0; i < m; i++ ) { REAL(R_constraints)[i] = g[i]; } SEXP R_lambda; PROTECT(R_lambda = allocVector(REALSXP, m)); for( Ipopt::Index i = 0; i < m; i++ ) { REAL(R_lambda)[i] = lambda[i]; } // add elements to the list SET_VECTOR_ELT(R_result_list, 0, R_status); SET_VECTOR_ELT(R_result_list, 1, R_status_message); SET_VECTOR_ELT(R_result_list, 3, R_objective); SET_VECTOR_ELT(R_result_list, 4, R_solution); SET_VECTOR_ELT(R_result_list, 5, R_z_L); SET_VECTOR_ELT(R_result_list, 6, R_z_U); SET_VECTOR_ELT(R_result_list, 7, R_constraints); SET_VECTOR_ELT(R_result_list, 8, R_lambda); UNPROTECT(num_return_elements); } coinor-ipopt-3.14.17/contrib/RInterface/src/IpoptRNLP.hpp000066400000000000000000000144151473776672200231140ustar00rootroot00000000000000/* Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. * This code is published under the Eclipse Public License. * * file: IpoptRNLP.hpp * author: Jelmer Ypma * date: 18 April 2010 * * This file defines a C++ class that derives from Ipopt::TNLP. The class * takes care of interaction between Ipopt and user-defined functions in R. * * Financial support of the UK Economic and Social Research Council * through a grant (RES-589-28-0001) to the ESRC Centre for Microdata * Methods and Practice (CeMMAP) is gratefully acknowledged. */ #ifndef __IpoptRNLP_HPP__ #define __IpoptRNLP_HPP__ #include "IpTNLP.hpp" // ISA TNLP #include #include #include #include // Rdefines.h is somewhat more higher level then Rinternal.h, and is preferred if the code might be shared with S at any stage. // Utils.h defines void R_CheckUserInterrupt(void); to allow user interuption from R class IpoptRNLP: public Ipopt::TNLP { /** This is the environment that the function gets called in. * This environment can be used to pass common data to the R functions. */ SEXP R_environment; SEXP R_eval_f; ///< objective function SEXP R_eval_grad_f; ///< gradient of objective function SEXP R_init_values; ///< vector with initial values, we get the Ipopt::Number of controls from the length of this vector SEXP R_lower_bounds; ///< lower bounds of the control x SEXP R_upper_bounds; ///< upper bounds of the control x SEXP R_eval_g; ///< function to evaluate constraints SEXP R_eval_jac_g; ///< function to evaluate jacobian of constraints SEXP R_eval_jac_g_structure; ///< list with non-zero elements in the Jacobian, this defines the sparse structure SEXP R_constraint_lower_bounds; ///< lower bounds of the contraint function g() SEXP R_constraint_upper_bounds; ///< upper bounds of the contraint function g() SEXP R_eval_h; ///< function to evaluate Hessian SEXP R_eval_h_structure; ///< list with non-zero elements of the Hessian, this defines the sparse structure SEXP R_result_list; ///< structure that will contain the return values bool d_hessian_approximation; ///< should we approximate the Hessian? default: false int d_num_protected_members; ///< counter of the number of PROTECT calls of the SEXPs above public: /** default constructor */ IpoptRNLP(); /** default destructor */ virtual ~IpoptRNLP(); void set_R_environment( SEXP env ); void set_R_eval_f( SEXP f ); void set_R_eval_grad_f( SEXP f ); void set_R_init_values( SEXP x0 ); void set_R_lower_bounds( SEXP lb ); void set_R_upper_bounds( SEXP ub ); void set_R_eval_g( SEXP g ); void set_R_eval_jac_g( SEXP g ); void set_R_eval_jac_g_structure( SEXP s ); void set_R_constraint_lower_bounds( SEXP lb ); void set_R_constraint_upper_bounds( SEXP ub ); void set_R_eval_h( SEXP h ); void set_R_eval_h_structure( SEXP s ); void set_hessian_approximation( bool b ); SEXP get_R_result_list(); virtual bool get_nlp_info( Ipopt::Index& n, Ipopt::Index& m, Ipopt::Index& nnz_jac_g, Ipopt::Index& nnz_h_lag, IndexStyleEnum& Index_style ); virtual bool get_bounds_info( Ipopt::Index n, Ipopt::Number* x_l, Ipopt::Number* x_u, Ipopt::Index m, Ipopt::Number* g_l, Ipopt::Number* g_u ); virtual bool get_starting_point( Ipopt::Index n, bool init_x, Ipopt::Number* x, bool init_z, Ipopt::Number* z_L, Ipopt::Number* z_U, Ipopt::Index m, bool init_lambda, Ipopt::Number* lambda ); virtual bool eval_f( Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Number& obj_value ); virtual bool eval_grad_f( Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Number* grad_f ); virtual bool eval_g( Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Index m, Ipopt::Number* g ); virtual bool eval_jac_g( Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Index m, Ipopt::Index nele_jac, Ipopt::Index* iRow, Ipopt::Index* jCol, Ipopt::Number* values ); virtual bool eval_h( Ipopt::Index n, const Ipopt::Number* x, bool new_x, Ipopt::Number obj_factor, Ipopt::Index m, const Ipopt::Number* lambda, bool new_lambda, Ipopt::Index nele_hess, Ipopt::Index* iRow, Ipopt::Index* jCol, Ipopt::Number* values ); virtual void finalize_solution( Ipopt::SolverReturn status, Ipopt::Index n, const Ipopt::Number* x, const Ipopt::Number* z_L, const Ipopt::Number* z_U, Ipopt::Index m, const Ipopt::Number* g, const Ipopt::Number* lambda, Ipopt::Number obj_value, const Ipopt::IpoptData* ip_data, Ipopt::IpoptCalculatedQuantities* ip_cq ); private: /**@name Methods to block default compiler methods. * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") * */ //@{ // IpoptRNLP(); IpoptRNLP( const IpoptRNLP& ); IpoptRNLP& operator=( const IpoptRNLP& ); //@} }; #endif coinor-ipopt-3.14.17/contrib/RInterface/src/Makevars.in000066400000000000000000000021451473776672200227120ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: Makevars.in # Author: Jelmer Ypma # Date: 14 April 2010 # # Changelog: # 30/01/2011 - Changed LIBS to IPOPT_LIBS and INCL to IPOPT_INCL, since R re-defines LIBS and INCL. # C++ Compiler command CXX = @CXX@ # C++ Compiler options IPOPT_CXXFLAGS = @CXXFLAGS@ # additional C++ Compiler options for linking IPOPT_CXXLINKFLAGS = @RPATH_FLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ # Include directories @COIN_HAS_PKGCONFIG_TRUE@IPOPT_INCL = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --cflags ipopt` @COIN_HAS_PKGCONFIG_FALSE@IPOPT_INCL = -I@includedir@/coin @IPOPTLIB_CFLAGS@ # Linker flags @COIN_HAS_PKGCONFIG_TRUE@IPOPT_LIBS = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --libs ipopt` @COIN_HAS_PKGCONFIG_FALSE@IPOPT_LIBS = -L@libdir@ -lipopt @IPOPTLIB_LFLAGS@ # Define objects for R to build OBJECTS = ipoptr.o IpoptRNLP.o IpoptRJournal.o # Convert to R macros PKG_LIBS = ${IPOPT_CXXLINKFLAGS} ${IPOPT_LIBS} PKG_CXXFLAGS = ${IPOPT_CXXFLAGS} ${IPOPT_INCL} -I@srcdir@ coinor-ipopt-3.14.17/contrib/RInterface/src/ipoptr.cpp000066400000000000000000000174631473776672200226430ustar00rootroot00000000000000/* Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. * This code is published under the Eclipse Public License. * * File: ipoptr.cpp * Author: Jelmer Ypma * Date: 18 April 2010 * * This file defines the main function IpoptRSolve that provides * an interface to Ipopt from R. * The function converts and R object containing objective function, * constraints, etc. into an IpoptApplication, solves the problem, * and returns the result. * * Financial support of the UK Economic and Social Research Council * through a grant (RES-589-28-0001) to the ESRC Centre for Microdata * Methods and Practice (CeMMAP) is gratefully acknowledged. * * 30/01/2011: added IpoptRJournal to correctly direct output to R terminal. */ #include "IpIpoptApplication.hpp" #include "IpSolveStatistics.hpp" #include "IpoptRNLP.hpp" #include "IpoptRJournal.hpp" #include #include // Rdefines.h is somewhat more higher level then Rinternal.h, and is preferred if the code might be shared with S at any stage. #include /// Extracts element with name 'str' from R object 'list' /// and returns that element. SEXP getListElement( SEXP list, std::string str ) { SEXP elmt = R_NilValue, names = getAttrib(list, R_NamesSymbol); int i; for( i = 0; i < length(list); i++ ) if( str.compare(CHAR(STRING_ELT(names, i))) == 0 ) { elmt = VECTOR_ELT(list, i); break; } return elmt; } /** Set options specified in R object opts in IpoptApplcation app. * * If we set the option to approximate the Hessian, then IpoptRNLP * needs to know that, so it can return false when calling eval_h, * instead of trying to find an R function that evaluates the Hessian. * * SEXP opts is an R list containing three sub-lists, with names * integer, string and numeric. These sub-lists contain the actual * options and there values that were specified by the user. * Passing the options in this way makes it easier to call different * SetValue function in IpoptApplication of the different types. */ void setApplicationOptions( Ipopt::SmartPtr app, Ipopt::SmartPtr nlp, SEXP opts ) { // extract the sub-lists with options of the different types into separate lists SEXP opts_integer = getListElement(opts, "integer"); SEXP opts_numeric = getListElement(opts, "numeric"); SEXP opts_string = getListElement(opts, "string"); // loop over the integer options and set them SEXP opts_integer_names; opts_integer_names = getAttrib(opts_integer, R_NamesSymbol); for( int list_cnt = 0; list_cnt < length(opts_integer); list_cnt++ ) { SEXP opt_value; PROTECT(opt_value = AS_INTEGER(VECTOR_ELT(opts_integer, list_cnt))); app->Options()->SetIntegerValue(CHAR(STRING_ELT(opts_integer_names, list_cnt)), INTEGER(opt_value)[0]); UNPROTECT(1); } // loop over the numeric options and set them SEXP opts_numeric_names; opts_numeric_names = getAttrib(opts_numeric, R_NamesSymbol); for( int list_cnt = 0; list_cnt < length(opts_numeric); list_cnt++ ) { SEXP opt_value; PROTECT(opt_value = VECTOR_ELT(opts_numeric, list_cnt)); app->Options()->SetNumericValue(CHAR(STRING_ELT(opts_numeric_names, list_cnt)), REAL(opt_value)[0]); UNPROTECT(1); } // loop over the string options and set them SEXP opts_string_names; opts_string_names = getAttrib(opts_string, R_NamesSymbol); for( int list_cnt = 0; list_cnt < length(opts_string); list_cnt++ ) { // opt_value will contain the first (should be the only one) element of the list SEXP opt_value; PROTECT(opt_value = STRING_ELT(VECTOR_ELT(opts_string, list_cnt), 0)); app->Options()->SetStringValue(CHAR(STRING_ELT(opts_string_names, list_cnt)), CHAR(opt_value)); // change the setting to approximate the hessian in nlp if this is part of the options if( std::string(CHAR(STRING_ELT(opts_string_names, list_cnt))) == "hessian_approximation" && std::string(CHAR(opt_value)) == "limited-memory" ) { nlp->set_hessian_approximation(true); } UNPROTECT(1); } } // we want this function to be available in R, so we put extern around it. extern "C" { #if defined(__GNUC__) && __GNUC__ >= 4 __attribute__((__visibility__("default"))) #endif SEXP IpoptRSolve( SEXP args ) { // Create an instance of your nlp... // (use a SmartPtr, not raw) Ipopt::SmartPtr ipoptr_nlp; Ipopt::SmartPtr ipoptr_tnlp; ipoptr_nlp = new IpoptRNLP(); ipoptr_tnlp = GetRawPtr(ipoptr_nlp); // Set initial values, bounds, functions, etc. // These are taking from args, which is a list containing the needed elements. // Checking whether all elements are there and have correct values is done in R. ipoptr_nlp->set_R_environment(getListElement(args, "environment")); ipoptr_nlp->set_R_init_values(getListElement(args, "x0")); ipoptr_nlp->set_R_lower_bounds(getListElement(args, "lower_bounds")); ipoptr_nlp->set_R_upper_bounds(getListElement(args, "upper_bounds")); ipoptr_nlp->set_R_eval_f(getListElement(args, "eval_f")); ipoptr_nlp->set_R_eval_grad_f(getListElement(args, "eval_grad_f")); ipoptr_nlp->set_R_eval_g(getListElement(args, "eval_g")); ipoptr_nlp->set_R_eval_jac_g(getListElement(args, "eval_jac_g")); ipoptr_nlp->set_R_eval_jac_g_structure(getListElement(args, "eval_jac_g_structure")); ipoptr_nlp->set_R_constraint_lower_bounds(getListElement(args, "constraint_lower_bounds")); ipoptr_nlp->set_R_constraint_upper_bounds(getListElement(args, "constraint_upper_bounds")); ipoptr_nlp->set_R_eval_h(getListElement(args, "eval_h")); ipoptr_nlp->set_R_eval_h_structure(getListElement(args, "eval_h_structure")); // Create an instance of the IpoptApplication Ipopt::SmartPtr app = new Ipopt::IpoptApplication(); app->RethrowNonIpoptException(false); // Set options that were passed from R setApplicationOptions(app, ipoptr_nlp, getListElement(args, "options")); // Set up the IPOPT console. // // Get print_level from options Ipopt::Index print_level; app->Options()->GetIntegerValue("print_level", print_level, ""); // Set print_level to 0 for default console (to avoid double output under Linux) app->Options()->SetIntegerValue("print_level", 0); // Add new journal with user-supplied print_level to print output to R console Ipopt::SmartPtr console = new IpoptRJournal(static_cast(print_level)); app->Jnlst()->AddJournal(console); // Initialize the IpoptApplication and process the options Ipopt::ApplicationReturnStatus status; status = app->Initialize(); if( status != Ipopt::Solve_Succeeded ) { printf("\n\n*** Error during initialization!\n"); SEXP answer; PROTECT(answer = allocVector(INTSXP, 1)); INTEGER(answer)[0] = (int) status; UNPROTECT(1); return (answer); } // Solve the optimization problem status = app->OptimizeTNLP(ipoptr_tnlp); // Retrieve results that were saved in IpoptRNLP::finalize_solution() SEXP R_result_list; PROTECT(R_result_list = ipoptr_nlp->get_R_result_list()); // convert number of iterations to an R object and add to the result_list // memory in R_result_list has already been allocated in IpoptRNLP::finalize_solution() SEXP R_num_iterations; PROTECT(R_num_iterations = allocVector(INTSXP, 1)); INTEGER(R_num_iterations)[0] = (int) app->Statistics()->IterationCount(); SET_VECTOR_ELT(R_result_list, 2, R_num_iterations); UNPROTECT(2); return (R_result_list); } } // extern "C" coinor-ipopt-3.14.17/contrib/RInterface/tests/000077500000000000000000000000001473776672200211625ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/RInterface/tests/approx_banana.R000066400000000000000000000032021473776672200241130ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: approx_banana.R # Author: Jelmer Ypma # Date: 5 July 2010 # # Example showing how to solve the Rosenbrock Banana function # with an approximated gradient, which doesn't work so well. library('ipoptr') # Rosenbrock Banana function eval_f <- function(x) { return( 100 * (x[2] - x[1] * x[1])^2 + (1 - x[1])^2 ) } # Approximate eval_f using finite differences # http://en.wikipedia.org/wiki/Numerical_differentiation approx_grad_f <- function( x ) { minAbsValue <- 0 stepSize <- sqrt( .Machine$double.eps ) # if we evaluate at 0, we need a different step size stepSizeVec <- ifelse(abs(x) <= minAbsValue, stepSize^3, x * stepSize) x_prime <- x f <- eval_f( x ) grad_f <- rep( 0, length(x) ) for (i in 1:length(x)) { x_prime[i] <- x[i] + stepSizeVec[i] stepSizeVec[i] <- x_prime[i] - x[i] f_prime <- eval_f( x_prime ) grad_f[i] <- ( f_prime - f )/stepSizeVec[i] x_prime[i] <- x[i] } return( grad_f ) } # initial values x0 <- c( -1.2, 1 ) opts <- list("tol"=1.0e-8, "max_iter"=5000) # solve Rosenbrock Banana function with approximated gradient print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=approx_grad_f, opts=opts) ) opts <- list("tol"=1.0e-7) # solve Rosenbrock Banana function with approximated gradient # and lower tolerance print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=approx_grad_f, opts=opts) ) coinor-ipopt-3.14.17/contrib/RInterface/tests/banana.R000066400000000000000000000031231473776672200225240ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: banana.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Example showing how to solve the Rosenbrock Banana function. library('ipoptr') ## Rosenbrock Banana function eval_f <- function(x) { return( 100 * (x[2] - x[1] * x[1])^2 + (1 - x[1])^2 ) } ## Gradient of Rosenbrock Banana function eval_grad_f <- function(x) { return( c( -400 * x[1] * (x[2] - x[1] * x[1]) - 2 * (1 - x[1]), 200 * (x[2] - x[1] * x[1])) ) } # The Hessian for this problem is actually dense, # This is a symmetric matrix, fill the lower left triangle only. eval_h_structure <- list( c(1), c(1,2) ) eval_h <- function( x, obj_factor, hessian_lambda ) { return( obj_factor*c( 2 - 400*(x[2] - x[1]^2) + 800*x[1]^2, # 1,1 -400*x[1], # 2,1 200 ) ) # 2,2 } # initial values x0 <- c( -1.2, 1 ) opts <- list("print_level"=5, "file_print_level"=12, "output_file"="banana.out", "tol"=1.0e-8) # solve Rosenbrock Banana function with analytic hessian print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, eval_h=eval_h, eval_h_structure=eval_h_structure, opts=opts) ) # solve Rosenbrock Banana function with approximated hessian print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, opts=opts) ) coinor-ipopt-3.14.17/contrib/RInterface/tests/hs071_nlp.R000066400000000000000000000071511473776672200230240ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: hs071_nlp.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Example problem, number 71 from the Hock-Schittkowsky test suite # # \min_{x} x1*x4*(x1 + x2 + x3) + x3 # s.t. # x1*x2*x3*x4 >= 25 # x1^2 + x2^2 + x3^2 + x4^2 = 40 # 1 <= x1,x2,x3,x4 <= 5 # # x0 = (1,5,5,1) # # optimal solution = (1.00000000, 4.74299963, 3.82114998, 1.37940829) # # Adapted from the Ipopt C++ interface example. library('ipoptr') # # f(x) = x1*x4*(x1 + x2 + x3) + x3 # eval_f <- function( x ) { return( x[1]*x[4]*(x[1] + x[2] + x[3]) + x[3] ) } eval_grad_f <- function( x ) { return( c( x[1] * x[4] + x[4] * (x[1] + x[2] + x[3]), x[1] * x[4], x[1] * x[4] + 1.0, x[1] * (x[1] + x[2] + x[3]) ) ) } # constraint functions eval_g <- function( x ) { return( c( x[1] * x[2] * x[3] * x[4], x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 ) ) } # The Jacobian for this problem is dense eval_jac_g_structure <- list( c(1,2,3,4), c(1,2,3,4) ) eval_jac_g <- function( x ) { return( c ( x[2]*x[3]*x[4], x[1]*x[3]*x[4], x[1]*x[2]*x[4], x[1]*x[2]*x[3], 2.0*x[1], 2.0*x[2], 2.0*x[3], 2.0*x[4] ) ) } # The Hessian for this problem is actually dense, # This is a symmetric matrix, fill the lower left triangle only. eval_h_structure <- list( c(1), c(1,2), c(1,2,3), c(1,2,3,4) ) eval_h <- function( x, obj_factor, hessian_lambda ) { values <- numeric(10) values[1] = obj_factor * (2*x[4]) # 1,1 values[2] = obj_factor * (x[4]) # 2,1 values[3] = 0 # 2,2 values[4] = obj_factor * (x[4]) # 3,1 values[5] = 0 # 4,2 values[6] = 0 # 3,3 values[7] = obj_factor * (2*x[1] + x[2] + x[3]) # 4,1 values[8] = obj_factor * (x[1]) # 4,2 values[9] = obj_factor * (x[1]) # 4,3 values[10] = 0 # 4,4 # add the portion for the first constraint values[2] = values[2] + hessian_lambda[1] * (x[3] * x[4]) # 2,1 values[4] = values[4] + hessian_lambda[1] * (x[2] * x[4]) # 3,1 values[5] = values[5] + hessian_lambda[1] * (x[1] * x[4]) # 3,2 values[7] = values[7] + hessian_lambda[1] * (x[2] * x[3]) # 4,1 values[8] = values[8] + hessian_lambda[1] * (x[1] * x[3]) # 4,2 values[9] = values[9] + hessian_lambda[1] * (x[1] * x[2]) # 4,3 # add the portion for the second constraint values[1] = values[1] + hessian_lambda[2] * 2 # 1,1 values[3] = values[3] + hessian_lambda[2] * 2 # 2,2 values[6] = values[6] + hessian_lambda[2] * 2 # 3,3 values[10] = values[10] + hessian_lambda[2] * 2 # 4,4 return ( values ) } # initial values x0 <- c( 1, 5, 5, 1 ) # lower and upper bounds of control lb <- c( 1, 1, 1, 1 ) ub <- c( 5, 5, 5, 5 ) # lower and upper bounds of constraints constraint_lb <- c( 25, 40 ) constraint_ub <- c( Inf, 40 ) opts <- list("print_level"=5, "file_print_level"=6, "output_file"="hs071_nlp.out") print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, lb=lb, ub=ub, eval_g=eval_g, eval_jac_g=eval_jac_g, constraint_lb=constraint_lb, constraint_ub=constraint_ub, eval_jac_g_structure=eval_jac_g_structure, eval_h=eval_h, eval_h_structure=eval_h_structure, opts=opts) ) coinor-ipopt-3.14.17/contrib/RInterface/tests/lasso.R000066400000000000000000000112151473776672200224260ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: lasso.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Example showing how to estimate a LASSO model. Based on # the example from the Matlab interface to Ipopt. There are # other packages in R that can estimate LASSO models, e.g. # using the package glmnet. library('ipoptr') # Experiment parameters. lambda <- 1 # Level of L1 regularization. n <- 100 # Number of training examples. e <- 1 # Std. dev. in noise of outputs. beta <- c( 0, 0, 2, -4, 0, 0, -1, 3 ) # "True" regression coefficients. # Set the random number generator seed. ranseed <- 7 set.seed( ranseed ) # CREATE DATA SET. # Generate the input vectors from the standard normal, and generate the # responses from the regression with some additional noise. The variable # "beta" is the set of true regression coefficients. m <- length(beta) # Number of features. A <- matrix( rnorm(n*m), nrow=n, ncol=m ) # The n x m matrix of examples. noise <- rnorm(n, sd=e) # Noise in outputs. y <- A %*% beta + noise # The outputs. # DEFINE LASSO FUNCTIONS # m, lambda, y, A are all defined in the ipoptr_environment eval_f <- function(x) { # separate x in two parts w <- x[ 1:m ] # parameters u <- x[ (m+1):(2*m) ] return( sum( (y - A %*% w)^2 )/2 + lambda*sum(u) ) } # ------------------------------------------------------------------ eval_grad_f <- function(x) { w <- x[ 1:m ] return( c( -t(A) %*% (y - A %*% w), rep(lambda,m) ) ) } # ------------------------------------------------------------------ eval_g <- function(x) { # separate x in two parts w <- x[ 1:m ] # parameters u <- x[ (m+1):(2*m) ] return( c( w + u, u - w ) ) } # ------------------------------------------------------------------ # J = [ I I # -I I ], # where I is and identity matrix of size m eval_jac_g <- function(x) { # return a vector of 1 and minus 1, since those are the values of the non-zero elements return( c( rep( 1, 2*m ), rep( c(-1,1), m ) ) ) } # For m=5, The structure looks like this: # 1 . . . . 2 . . . . # . 3 . . . . 4 . . . # . . 5 . . . . 6 . . # . . . 7 . . . . 8 . # . . . . 9 . . . . 10 # 11 . . . . 12 . . . . # . 13 . . . . 14 . . . # . . 15 . . . . 16 . . # . . . 17 . . . . 18 . # . . . . 19 . . . . 20 eval_jac_g_structure <- lapply( c(1:m,1:m), function(x) { return( c(x,m+x) ) } ) # ------------------------------------------------------------------ # rename lambda so it doesn't cause confusion with lambda in auxdata eval_h <- function( x, obj_factor, hessian_lambda ) { H <- t(A) %*% A H <- unlist( lapply( 1:m, function(i) { H[i,1:i] } ) ) return( obj_factor * H ) } # For m=5, The structure looks like this: # 1 . . . . . . . . . # 2 3 . . . . . . . . # 4 5 6 . . . . . . . # 7 8 9 10 . . . . . . # 11 12 13 14 15 . . . . . # . . . . . . . . . . # . . . . . . . . . . # . . . . . . . . . . # . . . . . . . . . . # . . . . . . . . . . eval_h_structure <- c( lapply( 1:m, function(x) { return( c(1:x) ) } ), lapply( 1:m, function(x) { return( c() ) } ) ) # ------------------------------------------------------------------ # The starting point. x0 = c( rep(0, m), rep(1, m) ) # The constraint functions are bounded from below by zero. constraint_lb = rep( 0, 2*m ) constraint_ub = rep( Inf, 2*m ) ipoptr_opts <- list( "jac_d_constant" = 'yes', "hessian_constant" = 'yes', "mu_strategy" = 'adaptive', "max_iter" = 100, "tol" = 1e-8 ) # Set up the auxiliary data. auxdata <- new.env() auxdata$m <- m auxdata$A <- A auxdata$y <- y auxdata$lambda <- lambda # COMPUTE SOLUTION WITH IPOPT. # Compute the L1-regularized maximum likelihood estimator. print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, eval_g=eval_g, eval_jac_g=eval_jac_g, eval_jac_g_structure=eval_jac_g_structure, constraint_lb=constraint_lb, constraint_ub=constraint_ub, eval_h=eval_h, eval_h_structure=eval_h_structure, opts=ipoptr_opts, ipoptr_environment=auxdata ) ) coinor-ipopt-3.14.17/contrib/RInterface/tests/mynlp.R000066400000000000000000000041341473776672200224460ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: mynlp.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Example NLP for interfacing a problem with IPOPT. # This example is adapted from the C++ example that # goes along with the Ipopt tutorial document. # This example solves the following problem: # # min_x f(x) = -(x2-2)^2 # s.t. # 0 = x1^2 + x2 - 1 # -1 <= x1 <= 1 library('ipoptr') eval_f <- function( x ) { print( paste( "In R::eval_f, x = ", paste( x, collapse=', ' ) ) ) return( -(x[2] - 2.0)*(x[2] - 2.0) ) } eval_grad_f <- function( x ) { return( c(0.0, -2.0*(x[2] - 2.0) ) ) } eval_g <- function( x ) { return( -(x[1]*x[1] + x[2] - 1.0) ); } # list with indices of non-zero elements # each element of the list corresponds to the derivative of one constraint # # e.g. # / 0 x x \ # \ x 0 x / # would be # list( c(2,3), c(1,3) ) eval_jac_g_structure <- list( c(1,2) ) # this should return a vector with all the non-zero elements # so, no list here, because that is slower I guess # TODO: make an R-function that shows the structure in matrix form eval_jac_g <- function( x ) { return ( c ( -2.0 * x[1], -1.0 ) ) } # diagonal matrix, usually only fill the lower triangle eval_h_structure <- list( c(1), c(2) ) eval_h <- function( x, obj_factor, hessian_lambda ) { return ( c( -2.0*hessian_lambda[1], -2.0*obj_factor ) ) } x0 <- c(0.5,1.5) lb <- c( -1, -1.0e19 ) ub <- c( 1, 1.0e19 ) constraint_lb <- 0 constraint_ub <- 0 opts <- list("print_level"=5, "file_print_level"=6, "output_file"="ipopttest.out") print( ipoptr( x0=x0, eval_f=eval_f, eval_grad_f=eval_grad_f, lb=lb, ub=ub, eval_g=eval_g, eval_jac_g=eval_jac_g, eval_jac_g_structure=eval_jac_g_structure, constraint_lb=constraint_lb, constraint_ub=constraint_ub, eval_h=eval_h, eval_h_structure=eval_h_structure, opts=opts) ) coinor-ipopt-3.14.17/contrib/RInterface/tests/parameters.R000066400000000000000000000036431473776672200234560ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: parameters.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Example showing two ways how we can have an objective # function depend on parameters or data. The objective # function is a simple polynomial. library('ipoptr') # # First example: supply additional arguments in user-defined functions # # objective function and gradient in terms of parameters eval_f_ex1 <- function(x, params) { return( params[1]*x^2 + params[2]*x + params[3] ) } eval_grad_f_ex1 <- function(x, params) { return( 2*params[1]*x + params[2] ) } # define parameters that we want to use params <- c(1,2,3) # define initial value of the optimzation problem x0 <- 0 # solve using ipoptr ipoptr( x0 = x0, eval_f = eval_f_ex1, eval_grad_f = eval_grad_f_ex1, params = params ) # # Second example: define an environment that contains extra parameters # # objective function and gradient in terms of parameters # without supplying params as an argument eval_f_ex2 <- function(x) { return( params[1]*x^2 + params[2]*x + params[3] ) } eval_grad_f_ex2 <- function(x) { return( 2*params[1]*x + params[2] ) } # define initial value of the optimzation problem x0 <- 0 # define a new environment that contains params auxdata <- new.env() auxdata$params <- c(1,2,3) # pass the environment that should be used to evaluate functions to ipoptr ipoptr( x0 = x0, eval_f = eval_f_ex2, eval_grad_f = eval_grad_f_ex2, ipoptr_environment = auxdata ) # solve using algebra cat( paste( "Minimizing f(x) = ax^2 + bx + c\n" ) ) cat( paste( "Optimal value of control is -b/(2a) = ", -params[2]/(2*params[1]), "\n" ) ) cat( paste( "With value of the objective function f(-b/(2a)) = ", eval_f_ex1( -params[2]/(2*params[1]), params ), "\n" ) ) coinor-ipopt-3.14.17/contrib/RInterface/tests/sparseness.R000066400000000000000000000040511473776672200234730ustar00rootroot00000000000000# Copyright (C) 2010 Jelmer Ypma. All Rights Reserved. # This code is published under the Eclipse Public License. # # File: sparseness.R # Author: Jelmer Ypma # Date: 18 April 2010 # # Example showing how the functions print.sparseness and # make.sparse work. These show and create the sparseness # structure of a matrix as it should be used for input # to ipoptr(). library('ipoptr') # print lower-diagonal 4x4 matrix print.sparseness( list( c(1), c(1,2), c(1,2,3), c(1,2,3,4) ) ) # print diagonal 3x3 matrix without indices counts print.sparseness( list( c(1), c(2), c(3) ), indices=FALSE ) # print a third sparse matrix print.sparseness( list( c(1,3,6,8), c(2,5), c(3,7,9) ) ) # and a fourth one, where the elements are in a different order print.sparseness( list( c(3,1,6,8), c(2,5), c(3,9,7) ) ) # print lower-diagonal 5x5 matrix generated with make.sparse A_lower <- make.sparse( lower.tri( matrix(1, nrow=5, ncol=5), diag=TRUE ) ) print.sparseness( A_lower ) # print a diagonal 5x5 matrix without indices counts A_diag <- make.sparse( diag(5) > 0 ) print.sparseness( A_diag ) # example from tests/lasso.R n <- 100 # number of observations m <- 5 # number of variables # define hessian function hessian <- function( A ) { H <- t(A) %*% A H <- unlist( lapply( 1:m, function(i) { H[i,1:i] } ) ) return( H ) } # define the structure hessian_structure <- c( lapply( 1:m, function(x) { return( c(1:x) ) } ), lapply( 1:m, function(x) { return( c() ) } ) ) # generate data set.seed( 3141 ) A <- hessian( matrix( rnorm( n*m ), nrow=n, ncol=m ) ) print.sparseness( x = hessian_structure, indices = TRUE, data = format( A, digits=2, nsmall=2, justify='right'), ncol = 2*m ) # make a large sparseness structure and use plot s <- do.call( "cbind", lapply( 1:5, function(i) { diag(5) %x% matrix(1, nrow=5, ncol=20) } ) ) s <- do.call( "rbind", lapply( 1:5, function(i) { s } ) ) s <- cbind( matrix( 1, nrow=nrow(s), ncol=40 ), s ) plot.sparseness( make.sparse( s ) ) coinor-ipopt-3.14.17/contrib/sIPOPT/000077500000000000000000000000001473776672200170545ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/AmplSolver/000077500000000000000000000000001473776672200211405ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/AmplSolver/Makefile.am000066400000000000000000000011651473776672200231770ustar00rootroot00000000000000# Copyright (C) 2019 COIN-OR # All Rights Reserved. # This file is distributed under the Eclipse Public License. bin_PROGRAMS = ipopt_sens ipopt_sens_SOURCES = ampl_sipopt.cpp SensAmplTNLP.cpp ipopt_sens_LDADD = ../src/libsipopt.la \ ../../../src/Apps/AmplSolver/libipoptamplinterface.la \ $(SIPOPTAMPLINTERFACELIB_LFLAGS) AM_LDFLAGS = $(LT_LDFLAGS) AM_CPPFLAGS = \ -I$(srcdir)/../src \ -I$(srcdir)/../../../src/Common \ -I$(srcdir)/../../../src/Interfaces \ -I$(srcdir)/../../../src/LinAlg \ -I$(srcdir)/../../../src/Algorithm \ -I$(srcdir)/../../../src/Apps/AmplSolver \ $(SIPOPTAMPLINTERFACELIB_CFLAGS) coinor-ipopt-3.14.17/contrib/sIPOPT/AmplSolver/Makefile.in000066400000000000000000000516671473776672200232240ustar00rootroot00000000000000# Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2019 COIN-OR # All Rights Reserved. # This file is distributed under the Eclipse Public License. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ bin_PROGRAMS = ipopt_sens$(EXEEXT) subdir = contrib/sIPOPT/AmplSolver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/Common/config.h \ $(top_builddir)/src/Common/config_ipopt.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_ipopt_sens_OBJECTS = ampl_sipopt.$(OBJEXT) SensAmplTNLP.$(OBJEXT) ipopt_sens_OBJECTS = $(am_ipopt_sens_OBJECTS) am__DEPENDENCIES_1 = ipopt_sens_DEPENDENCIES = ../src/libsipopt.la \ ../../../src/Apps/AmplSolver/libipoptamplinterface.la \ $(am__DEPENDENCIES_1) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/Common depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/SensAmplTNLP.Po \ ./$(DEPDIR)/ampl_sipopt.Po am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(ipopt_sens_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ADD_FFLAGS = @ADD_FFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIT32FCOMMENT = @BIT32FCOMMENT@ BIT64FCOMMENT = @BIT64FCOMMENT@ BITS_PER_POINTER = @BITS_PER_POINTER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COIN_PKG_CONFIG_PATH = @COIN_PKG_CONFIG_PATH@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CXXLIBS = @CXXLIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ FLIBS = @FLIBS@ GREP = @GREP@ HSLLIB_CFLAGS = @HSLLIB_CFLAGS@ HSLLIB_CFLAGS_NOPC = @HSLLIB_CFLAGS_NOPC@ HSLLIB_LFLAGS = @HSLLIB_LFLAGS@ HSLLIB_LFLAGS_NOPC = @HSLLIB_LFLAGS_NOPC@ HSLLIB_PCFILES = @HSLLIB_PCFILES@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPOPTAMPLINTERFACELIB_CFLAGS = @IPOPTAMPLINTERFACELIB_CFLAGS@ IPOPTAMPLINTERFACELIB_CFLAGS_NOPC = @IPOPTAMPLINTERFACELIB_CFLAGS_NOPC@ IPOPTAMPLINTERFACELIB_LFLAGS = @IPOPTAMPLINTERFACELIB_LFLAGS@ IPOPTAMPLINTERFACELIB_LFLAGS_NOPC = @IPOPTAMPLINTERFACELIB_LFLAGS_NOPC@ IPOPTAMPLINTERFACELIB_PCFILES = @IPOPTAMPLINTERFACELIB_PCFILES@ IPOPTLIB_CFLAGS = @IPOPTLIB_CFLAGS@ IPOPTLIB_CFLAGS_NOPC = @IPOPTLIB_CFLAGS_NOPC@ IPOPTLIB_LFLAGS = @IPOPTLIB_LFLAGS@ IPOPTLIB_LFLAGS_NOPC = @IPOPTLIB_LFLAGS_NOPC@ IPOPTLIB_PCFILES = @IPOPTLIB_PCFILES@ JAR = @JAR@ JAVA = @JAVA@ JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIPOPTAMPLINTERFACELIB_CFLAGS = @SIPOPTAMPLINTERFACELIB_CFLAGS@ SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC = @SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC@ SIPOPTAMPLINTERFACELIB_LFLAGS = @SIPOPTAMPLINTERFACELIB_LFLAGS@ SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC = @SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC@ SIPOPTAMPLINTERFACELIB_PCFILES = @SIPOPTAMPLINTERFACELIB_PCFILES@ SIPOPTLIB_CFLAGS_NOPC = @SIPOPTLIB_CFLAGS_NOPC@ SIPOPTLIB_LFLAGS_NOPC = @SIPOPTLIB_LFLAGS_NOPC@ STRIP = @STRIP@ VERSION = @VERSION@ _ACJNI_JAVAC = @_ACJNI_JAVAC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_PKG_CONFIG = @ac_ct_PKG_CONFIG@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ coin_doxy_logname = @coin_doxy_logname@ coin_doxy_tagfiles = @coin_doxy_tagfiles@ coin_doxy_tagname = @coin_doxy_tagname@ coin_doxy_usedot = @coin_doxy_usedot@ coin_have_doxygen = @coin_have_doxygen@ coin_have_latex = @coin_have_latex@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ipopt_sens_SOURCES = ampl_sipopt.cpp SensAmplTNLP.cpp ipopt_sens_LDADD = ../src/libsipopt.la \ ../../../src/Apps/AmplSolver/libipoptamplinterface.la \ $(SIPOPTAMPLINTERFACELIB_LFLAGS) AM_LDFLAGS = $(LT_LDFLAGS) AM_CPPFLAGS = \ -I$(srcdir)/../src \ -I$(srcdir)/../../../src/Common \ -I$(srcdir)/../../../src/Interfaces \ -I$(srcdir)/../../../src/LinAlg \ -I$(srcdir)/../../../src/Algorithm \ -I$(srcdir)/../../../src/Apps/AmplSolver \ $(SIPOPTAMPLINTERFACELIB_CFLAGS) all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/sIPOPT/AmplSolver/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/sIPOPT/AmplSolver/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && $(am__rm_f) $$files clean-binPROGRAMS: $(am__rm_f) $(bin_PROGRAMS) test -z "$(EXEEXT)" || $(am__rm_f) $(bin_PROGRAMS:$(EXEEXT)=) ipopt_sens$(EXEEXT): $(ipopt_sens_OBJECTS) $(ipopt_sens_DEPENDENCIES) $(EXTRA_ipopt_sens_DEPENDENCIES) @rm -f ipopt_sens$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(ipopt_sens_OBJECTS) $(ipopt_sens_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensAmplTNLP.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ampl_sipopt.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/SensAmplTNLP.Po -rm -f ./$(DEPDIR)/ampl_sipopt.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/SensAmplTNLP.Po -rm -f ./$(DEPDIR)/ampl_sipopt.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi dvi-am html html-am info \ info-am install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-strip installcheck \ installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% coinor-ipopt-3.14.17/contrib/sIPOPT/AmplSolver/SensAmplTNLP.cpp000066400000000000000000000344461473776672200240770ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-11 #include "SensAmplTNLP.hpp" #include "SensUtils.hpp" #include "IpDenseVector.hpp" #include "IpIteratesVector.hpp" #include "IpBlas.hpp" #include "IpIpoptData.hpp" /* AMPL includes */ #include "asl.h" #include "asl_pfgh.h" #include "getstub.h" namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif SensAmplTNLP::SensAmplTNLP( const SmartPtr& jnlst, const SmartPtr regoptions, const SmartPtr options, char**& argv, SmartPtr suffix_handler /* = NULL */, bool allow_discrete /* = false */, SmartPtr ampl_options_list /* = NULL */, const char* ampl_option_string /* = NULL */, const char* ampl_invokation_string /* = NULL */, const char* ampl_banner_string /* = NULL */, std::string* nl_file_content /* = NULL */, bool checkinterrupt /* = false */ ) : AmplTNLP( jnlst, // gotta call constructor of base class properly regoptions, options, argv, suffix_handler /* = NULL */, allow_discrete /* = false */, ampl_options_list /* = NULL */, ampl_option_string /* = NULL */, ampl_invokation_string /* = NULL */, ampl_banner_string /* = NULL */, nl_file_content /* = NULL */, checkinterrupt /* = false */), jnlst_(jnlst), options_(options), have_parameters_(false), parameter_flags_(NULL), parameter_values_(NULL) { DBG_START_METH("SensAmplTNLP::SensAmplTNLP", dbg_verbosity); SmartPtr suff_handler = get_suffix_handler(); ASL_pfgh* asl = AmplSolverObject(); const int* parameter_flags = suff_handler->GetIntegerSuffixValues("parameter", AmplSuffixHandler::Variable_Source); if( parameter_flags_ != NULL ) { have_parameters_ = true; for( Index i = 0; i < n_var; ++i ) { parameter_flags_[i] = parameter_flags[i]; } parameter_values_ = new Number[n_var]; const Number* nominal_values = suff_handler->GetNumberSuffixValues("nominal_value", AmplSuffixHandler::Variable_Source); if( nominal_values == NULL ) { for( Index i = 0; i < n_var; ++i ) { parameter_values_[i] = 0; } } else { for( Index i = 0; i < n_var; ++i ) { parameter_values_[i] = nominal_values[i]; } } } std::string prefix = ""; options->GetIntegerValue("n_sens_steps", n_sens_steps_, prefix); sens_sol_.resize(n_sens_steps_, NULL); if( n_sens_steps_ == 0 ) { options->SetStringValue("run_sens", "no"); run_sens_ = false; } options->GetBoolValue("run_sens", run_sens_, ""); options->GetBoolValue("compute_red_hessian", compute_red_hessian_, ""); } SensAmplTNLP::~SensAmplTNLP() { DBG_START_METH("SensAmplTNLP::~SensAmplTNLP", dbg_verbosity); delete[] parameter_values_; } bool SensAmplTNLP::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { DBG_START_METH("SensAmplTNLP::get_bounds_info", dbg_verbosity); ASL_pfgh* asl = AmplSolverObject(); DBG_ASSERT(n == n_var); DBG_ASSERT(m == n_con); for( Index i = 0; i < n; i++ ) { x_l[i] = LUv[2 * i]; x_u[i] = LUv[2 * i + 1]; } for( Index i = 0; i < m; i++ ) { g_l[i] = LUrhs[2 * i]; g_u[i] = LUrhs[2 * i + 1]; } /* Sensitivity: Fix parameters by bounds */ if( have_parameters_ ) { // parameters are set in the model. Set Bounds to current parameters for( Index i = 0; i < n; i++ ) { if( parameter_flags_[i] ) { x_l[i] = parameter_values_[i]; x_u[i] = parameter_values_[i]; } } } return true; } void SensAmplTNLP::set_sens_solution( Index idx, SmartPtr sens_sol ) { DBG_START_METH("SensAmplTNLP::set_sens_solution", dbg_verbosity); DBG_PRINT((dbg_verbosity, "n_sens_steps=%zd\n", sens_sol_.size())); DBG_ASSERT(idx > 0); DBG_ASSERT(idx <= (Index)sens_sol_.size()); sens_sol_[idx - 1] = sens_sol; } void SensAmplTNLP::finalize_metadata( Index /*n*/, const StringMetaDataMapType& /*var_string_md*/, const IntegerMetaDataMapType& /*var_integer_md*/, const NumericMetaDataMapType& var_numeric_md, Index /*m*/, const StringMetaDataMapType& /*con_string_md*/, const IntegerMetaDataMapType& /*con_integer_md*/, const NumericMetaDataMapType& con_numeric_md ) { DBG_START_METH("SensAmplTNLP::finalize_metadata", dbg_verbosity); ASL_pfgh* asl = AmplSolverObject(); if( run_sens_ ) { for( Index step = 1; step <= n_sens_steps_; ++step ) { std::string sol_state_id = "sens_sol_state_"; append_Index(sol_state_id, step); NumericMetaDataMapType::const_iterator num_it; num_it = var_numeric_md.find(sol_state_id); if( num_it != var_numeric_md.end() ) { suf_rput(sol_state_id.c_str(), ASL_Sufkind_var, const_cast(&num_it->second[0])); } std::string sol_state_z_L_id = sol_state_id + "_z_L"; num_it = var_numeric_md.find(sol_state_z_L_id); if( num_it != var_numeric_md.end() ) { suf_rput(sol_state_z_L_id.c_str(), ASL_Sufkind_var, const_cast(&num_it->second[0])); } std::string sol_state_z_U_id = sol_state_id + "_z_U"; num_it = var_numeric_md.find(sol_state_z_U_id); if( num_it != var_numeric_md.end() ) { suf_rput(sol_state_z_U_id.c_str(), ASL_Sufkind_var, const_cast(&num_it->second[0])); } num_it = con_numeric_md.find(sol_state_id); if( num_it != con_numeric_md.end() ) { suf_rput(sol_state_id.c_str(), ASL_Sufkind_con, const_cast(&num_it->second[0])); } } } } void SensAmplTNLP::finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ) { DBG_START_METH("SensAmplTNLP::finalize_solution", dbg_verbosity); AmplTNLP::finalize_solution(status, n, x, z_L, z_U, m, g, lambda, obj_value, ip_data, ip_cq); } #ifdef IPOPT_INT64 static std::vector to_vector_index( std::vector& v ) { std::vector v2(v.size()); for( size_t i = 0; i < v.size(); ++i ) { v2[i] = v[i]; } return v2; } #else static std::vector& to_vector_index( std::vector& v ) { return v; } #endif bool SensAmplTNLP::get_var_con_metadata( Index n, StringMetaDataMapType& var_string_md, IntegerMetaDataMapType& var_integer_md, NumericMetaDataMapType& var_numeric_md, Index m, StringMetaDataMapType& con_string_md, IntegerMetaDataMapType& con_integer_md, NumericMetaDataMapType& con_numeric_md ) { DBG_START_METH("SensAmplTNLP::get_var_con_metadata", dbg_verbosity); try { if( run_sens_ ) { // Get Sens Suffixes std::string sens_state = "sens_state_"; std::vector state; for( Index i = 1; i <= n_sens_steps_; ++i ) { append_Index(sens_state, i); state = get_index_suffix_vec(sens_state.c_str()); set_integer_metadata_for_var(sens_state, to_vector_index(state)); sens_state = "sens_state_"; } std::string sens_state_value = "sens_state_value_"; std::vector state_val; for( Index i = 1; i <= n_sens_steps_; ++i ) { append_Index(sens_state_value, i); state_val = get_number_suffix_vec(sens_state_value.c_str()); set_numeric_metadata_for_var(sens_state_value, state_val); sens_state_value = "sens_state_value_"; } std::string init_constr = "sens_init_constr"; if( n_sens_steps_ > 0 ) { std::vector init_idx = get_index_suffix_constr_vec(init_constr.c_str()); set_integer_metadata_for_con(init_constr, to_vector_index(init_idx)); } } } catch( SUFFIX_EMPTY& exc ) { //exc.ReportException(*jnlst_); // const std::string exc_mess = exc.Message(); const std::string exc_mess = exc.Message(); jnlst_->Printf(J_WARNING, J_INITIALIZATION, " WARNING: Will not run sIPOPT " "because of incorrect AMPL suffix!\n" " Message: %s\n\n", exc_mess.c_str()); options_->SetStringValue("sens_internal_abort", "yes"); bool ignore_suffix_error; options_->GetBoolValue("ignore_suffix_error", ignore_suffix_error, ""); if( !ignore_suffix_error ) { THROW_EXCEPTION(SUFFIX_EMPTY, "Encountered Suffix Error"); } } try { if( compute_red_hessian_ ) { std::string red_hess_str = "red_hessian"; std::vector red_hess_idx = get_index_suffix_vec(red_hess_str.c_str()); set_integer_metadata_for_var(red_hess_str.c_str(), to_vector_index(red_hess_idx)); } } catch( SUFFIX_EMPTY& exc ) { const std::string exc_mess = exc.Message(); jnlst_->Printf(J_WARNING, J_INITIALIZATION, " WARNING: Will not run reduced hessian computation " "because of incorrect AMPL suffix!\n" " Message: %s\n\n", exc_mess.c_str()); options_->SetStringValue("sens_internal_abort", "yes"); bool ignore_suffix_error; options_->GetBoolValue("ignore_suffix_error", ignore_suffix_error, ""); if( !ignore_suffix_error ) { THROW_EXCEPTION(SUFFIX_EMPTY, "Encountered Suffix Error"); } } bool retval = AmplTNLP::get_var_con_metadata(n, var_string_md, var_integer_md, var_numeric_md, m, con_string_md, con_integer_md, con_numeric_md); return retval; } const int* SensAmplTNLP::get_index_suffix( const char* suffix_name ) { DBG_START_METH("SensAmplTNLP::get_index_suffix", dbg_verbosity); SmartPtr suffix_handler = get_suffix_handler(); const int* index_suffix = suffix_handler->GetIntegerSuffixValues(suffix_name, AmplSuffixHandler::Variable_Source); return index_suffix; } std::vector SensAmplTNLP::get_index_suffix_vec( const char* suffix_name ) { DBG_START_METH("SensAmplTNLP::get_index_suffix_vec", dbg_verbosity); ASL_pfgh* asl = AmplSolverObject(); SmartPtr suffix_handler = get_suffix_handler(); DBG_ASSERT(IsValid(suffix_handler)); std::vector index_suffix = suffix_handler->GetIntegerSuffixValues(n_var, suffix_name, AmplSuffixHandler::Variable_Source); if( index_suffix.size() == 0 ) { index_suffix.resize(n_var, 0); } return index_suffix; } const Number* SensAmplTNLP::get_number_suffix( const char* suffix_name ) { DBG_START_METH("SensAmplTNLP::get_number_suffix", dbg_verbosity); SmartPtr suffix_handler = get_suffix_handler(); const Number* number_suffix = suffix_handler->GetNumberSuffixValues(suffix_name, AmplSuffixHandler::Variable_Source); if( number_suffix == NULL ) { // suffix invalid std::string except = suffix_name; except.append(" is empty"); THROW_EXCEPTION(SUFFIX_EMPTY, except); } return number_suffix; } std::vector SensAmplTNLP::get_number_suffix_vec( const char* suffix_name ) { DBG_START_METH("SensAmplTNLP::get_number_suffix_vec", dbg_verbosity); ASL_pfgh* asl = AmplSolverObject(); SmartPtr suffix_handler = get_suffix_handler(); std::vector number_suffix = suffix_handler->GetNumberSuffixValues(n_var, suffix_name, AmplSuffixHandler::Variable_Source); if( number_suffix.empty() ) { // suffix invalid std::string except = suffix_name; except.append(" is empty"); THROW_EXCEPTION(SUFFIX_EMPTY, except); } return number_suffix; } const int* SensAmplTNLP::get_index_suffix_constr( const char* suffix_name ) { DBG_START_METH("SensAmplTNLP::get_index_suffix_constr", dbg_verbosity); SmartPtr suffix_handler = get_suffix_handler(); const int* index_suffix = suffix_handler->GetIntegerSuffixValues(suffix_name, AmplSuffixHandler::Constraint_Source); if( index_suffix == NULL ) { // suffix invalid std::string except = suffix_name; except.append(" is empty"); THROW_EXCEPTION(SUFFIX_EMPTY, except); } return index_suffix; } std::vector SensAmplTNLP::get_index_suffix_constr_vec( const char* suffix_name ) { DBG_START_METH("SensAmplTNLP::get_index_suffix_constr_vec", dbg_verbosity); ASL_pfgh* asl = AmplSolverObject(); SmartPtr suffix_handler = get_suffix_handler(); std::vector index_suffix = suffix_handler->GetIntegerSuffixValues(n_con, suffix_name, AmplSuffixHandler::Constraint_Source); if( index_suffix.empty() ) { // suffix invalid std::string except = suffix_name; except.append(" is empty"); THROW_EXCEPTION(SUFFIX_EMPTY, except); } return index_suffix; } const Number* SensAmplTNLP::get_number_suffix_constr( const char* suffix_name ) { DBG_START_METH("SensAmplTNLP::get_number_suffix_constr", dbg_verbosity); SmartPtr suffix_handler = get_suffix_handler(); const Number* number_suffix = suffix_handler->GetNumberSuffixValues(suffix_name, AmplSuffixHandler::Constraint_Source); if( number_suffix == NULL ) { // suffix invalid std::string except = suffix_name; except.append(" is empty"); THROW_EXCEPTION(SUFFIX_EMPTY, except); } return number_suffix; } } coinor-ipopt-3.14.17/contrib/sIPOPT/AmplSolver/SensAmplTNLP.hpp000066400000000000000000000103431473776672200240720ustar00rootroot00000000000000// Copyright 2009 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-11 #ifndef __SENSAMPLTNLP_HPP__ #define __SENSAMPLTNLP_HPP__ #include "AmplTNLP.hpp" #include "SensUtils.hpp" namespace Ipopt { // same as DECLARE_STD_EXCEPTION, but not using any export class SUFFIX_EMPTY: public Ipopt::IpoptException { public: SUFFIX_EMPTY( std::string msg, std::string fname, Ipopt::Index line ) : Ipopt::IpoptException(msg, fname, line, "SUFFIX_EMPTY") { } SUFFIX_EMPTY( const SUFFIX_EMPTY& copy ) : Ipopt::IpoptException(copy) { } private: SUFFIX_EMPTY(); void operator=( const SUFFIX_EMPTY& ); }; class SensAmplTNLP: public AmplTNLP { /** This class is the Sens-wrapper for the ampltnlp, adapts * the get bounds function and some others to our needs. */ public: /** constructor */ SensAmplTNLP( const SmartPtr& jnlst, const SmartPtr regoptions, const SmartPtr options, char**& argv, SmartPtr suffix_handler = NULL, bool allow_discrete = false, SmartPtr ampl_options_list = NULL, const char* ampl_option_string = NULL, const char* ampl_invokation_string = NULL, const char* ampl_banner_string = NULL, std::string* nl_file_content = NULL, bool checkinterrupt = false ); virtual ~SensAmplTNLP(); /** returns bounds of the nlp. Overloaded from AmplTNLP */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); void set_sens_solution( Index idx, SmartPtr sens_sol ); virtual void finalize_metadata( Index n, const StringMetaDataMapType& var_string_md, const IntegerMetaDataMapType& var_integer_md, const NumericMetaDataMapType& var_numeric_md, Index m, const StringMetaDataMapType& con_string_md, const IntegerMetaDataMapType& con_integer_md, const NumericMetaDataMapType& con_numeric_md ); virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); const int* get_index_suffix( const char* suffix_name ); std::vector get_index_suffix_vec( const char* suffix_name ); const Number* get_number_suffix( const char* suffix_name ); std::vector get_number_suffix_vec( const char* suffix_name ); const int* get_index_suffix_constr( const char* suffix_name ); std::vector get_index_suffix_constr_vec( const char* suffix_name ); const Number* get_number_suffix_constr( const char* suffix_name ); virtual bool get_var_con_metadata( Index n, StringMetaDataMapType& var_string_md, IntegerMetaDataMapType& var_integer_md, NumericMetaDataMapType& var_numeric_md, Index m, StringMetaDataMapType& con_string_md, IntegerMetaDataMapType& con_integer_md, NumericMetaDataMapType& con_numeric_md ); private: /** local copy of current lower and upper bounds - needed for parameter change */ // Number* x_L; // Number* x_U; SmartPtr jnlst_; SmartPtr options_; bool have_parameters_; Index* parameter_flags_; Number* parameter_values_; /** important Options */ Index n_sens_steps_; bool run_sens_; bool compute_red_hessian_; std::vector > sens_sol_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/AmplSolver/ampl_sipopt.cpp000066400000000000000000000144711473776672200242020ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-11 #include "SensAmplTNLP.hpp" #include "IpIpoptApplication.hpp" #include "SensApplication.hpp" #include "IpPDSearchDirCalc.hpp" #include "IpIpoptAlg.hpp" #include "SensRegOp.hpp" int main( int /*argc*/, char** argv ) { using namespace Ipopt; SmartPtr app_ipopt = new IpoptApplication(); app_ipopt->RethrowNonIpoptException(false); SmartPtr app_sens = new SensApplication(app_ipopt->Jnlst(), app_ipopt->Options(), app_ipopt->RegOptions()); // Register sIPOPT options RegisterOptions_sIPOPT(app_ipopt->RegOptions()); app_ipopt->Options()->SetRegisteredOptions(app_ipopt->RegOptions()); // Call Initialize the first time to create a journalist, but ignore // any options file ApplicationReturnStatus retval; retval = app_ipopt->Initialize(""); if( retval != Solve_Succeeded ) { //printf("ampl_ipopt.cpp: Error in first Initialize!!!!\n"); exit(-100); } app_ipopt->Initialize(); // prepare suffixes, or metadata ... SmartPtr suffix_handler = new AmplSuffixHandler(); // Modified for warm-start from AMPL suffix_handler->AddAvailableSuffix("ipopt_zL_out", AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix("ipopt_zU_out", AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix("ipopt_zL_in", AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix("ipopt_zU_in", AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix("parameter", AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Index_Type); suffix_handler->AddAvailableSuffix("nominal_value", AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix("perturbed_value", AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); // Suffixes for sIPOPT suffix_handler->AddAvailableSuffix("sens_init_constr", AmplSuffixHandler::Constraint_Source, AmplSuffixHandler::Index_Type); Index n_sens_steps = 0; app_ipopt->Options()->GetIntegerValue("n_sens_steps", n_sens_steps, ""); std::string state; std::string state_value; std::string state_value_zL; std::string state_value_zU; std::string sol_state; std::string sol_state_zL; std::string sol_state_zU; for( int k = 0; k < n_sens_steps + 1; ++k ) { state = "sens_state_"; state_value = "sens_state_value_"; sol_state = "sens_sol_state_"; state_value_zL = state_value; state_value_zU = state_value; sol_state_zL = sol_state; sol_state_zU = sol_state; append_Index(state, k); append_Index(state_value, k); append_Index(state_value_zL, k); append_Index(state_value_zU, k); append_Index(sol_state, k); append_Index(sol_state_zL, k); append_Index(sol_state_zU, k); sol_state_zL += "_z_L"; sol_state_zU += "_z_U"; state_value_zL += "_z_L"; state_value_zU += "_z_U"; suffix_handler->AddAvailableSuffix(state, AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Index_Type); suffix_handler->AddAvailableSuffix(state_value, AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix(state_value_zL, AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix(state_value_zU, AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix(sol_state, AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix(sol_state, AmplSuffixHandler::Constraint_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix(sol_state_zL, AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); suffix_handler->AddAvailableSuffix(sol_state_zU, AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Number_Type); } // for reduced hessian computation suffix_handler->AddAvailableSuffix("red_hessian", AmplSuffixHandler::Variable_Source, AmplSuffixHandler::Index_Type); // Create AmplOptionsList for sIPOPT AMPL options SmartPtr ampl_options_list = new AmplOptionsList(); ampl_options_list->AddAmplOption("run_sens", "run_sens", AmplOptionsList::String_Option, "Set to yes if sens algorithm should be run."); ampl_options_list->AddAmplOption("compute_red_hessian", "compute_red_hessian", AmplOptionsList::String_Option, "Set to yes if reduced hessian should be computed."); ampl_options_list->AddAmplOption("sens_boundcheck", "sens_boundcheck", AmplOptionsList::String_Option, "Set to yes to enable the fix-relax QP adaption to a possible bound check. This feature is experimental."); ampl_options_list->AddAmplOption("n_sens_steps", "n_sens_steps", AmplOptionsList::Integer_Option, "Number of sensitivity steps"); // create AmplSensTNLP from argc. SmartPtr sens_tnlp = new SensAmplTNLP(ConstPtr(app_ipopt->Jnlst()), app_ipopt->RegOptions(), app_ipopt->Options(), argv, suffix_handler, false, ampl_options_list, NULL, NULL, NULL, NULL, true); app_sens->Initialize(); const int n_loops = 1; // make larger for profiling for( Index i = 0; i < n_loops; i++ ) { retval = app_ipopt->OptimizeTNLP(sens_tnlp); } /* give pointers to Ipopt algorithm objects to Sens Application */ app_sens->SetIpoptAlgorithmObjects(app_ipopt, retval); app_sens->Run(); return 0; } coinor-ipopt-3.14.17/contrib/sIPOPT/Makefile.am000066400000000000000000000002571473776672200211140ustar00rootroot00000000000000# Copyright (C) 2019 COIN-OR # All Rights Reserved. # This file is distributed under the Eclipse Public License. SUBDIRS = src if COIN_HAS_ASL SUBDIRS += AmplSolver endif coinor-ipopt-3.14.17/contrib/sIPOPT/Makefile.in000066400000000000000000000423571473776672200211340ustar00rootroot00000000000000# Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2019 COIN-OR # All Rights Reserved. # This file is distributed under the Eclipse Public License. VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ @COIN_HAS_ASL_TRUE@am__append_1 = AmplSolver subdir = contrib/sIPOPT ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/Common/config.h \ $(top_builddir)/src/Common/config_ipopt.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` DIST_SUBDIRS = src AmplSolver ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ADD_FFLAGS = @ADD_FFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIT32FCOMMENT = @BIT32FCOMMENT@ BIT64FCOMMENT = @BIT64FCOMMENT@ BITS_PER_POINTER = @BITS_PER_POINTER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COIN_PKG_CONFIG_PATH = @COIN_PKG_CONFIG_PATH@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CXXLIBS = @CXXLIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ FLIBS = @FLIBS@ GREP = @GREP@ HSLLIB_CFLAGS = @HSLLIB_CFLAGS@ HSLLIB_CFLAGS_NOPC = @HSLLIB_CFLAGS_NOPC@ HSLLIB_LFLAGS = @HSLLIB_LFLAGS@ HSLLIB_LFLAGS_NOPC = @HSLLIB_LFLAGS_NOPC@ HSLLIB_PCFILES = @HSLLIB_PCFILES@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPOPTAMPLINTERFACELIB_CFLAGS = @IPOPTAMPLINTERFACELIB_CFLAGS@ IPOPTAMPLINTERFACELIB_CFLAGS_NOPC = @IPOPTAMPLINTERFACELIB_CFLAGS_NOPC@ IPOPTAMPLINTERFACELIB_LFLAGS = @IPOPTAMPLINTERFACELIB_LFLAGS@ IPOPTAMPLINTERFACELIB_LFLAGS_NOPC = @IPOPTAMPLINTERFACELIB_LFLAGS_NOPC@ IPOPTAMPLINTERFACELIB_PCFILES = @IPOPTAMPLINTERFACELIB_PCFILES@ IPOPTLIB_CFLAGS = @IPOPTLIB_CFLAGS@ IPOPTLIB_CFLAGS_NOPC = @IPOPTLIB_CFLAGS_NOPC@ IPOPTLIB_LFLAGS = @IPOPTLIB_LFLAGS@ IPOPTLIB_LFLAGS_NOPC = @IPOPTLIB_LFLAGS_NOPC@ IPOPTLIB_PCFILES = @IPOPTLIB_PCFILES@ JAR = @JAR@ JAVA = @JAVA@ JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIPOPTAMPLINTERFACELIB_CFLAGS = @SIPOPTAMPLINTERFACELIB_CFLAGS@ SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC = @SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC@ SIPOPTAMPLINTERFACELIB_LFLAGS = @SIPOPTAMPLINTERFACELIB_LFLAGS@ SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC = @SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC@ SIPOPTAMPLINTERFACELIB_PCFILES = @SIPOPTAMPLINTERFACELIB_PCFILES@ SIPOPTLIB_CFLAGS_NOPC = @SIPOPTLIB_CFLAGS_NOPC@ SIPOPTLIB_LFLAGS_NOPC = @SIPOPTLIB_LFLAGS_NOPC@ STRIP = @STRIP@ VERSION = @VERSION@ _ACJNI_JAVAC = @_ACJNI_JAVAC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_PKG_CONFIG = @ac_ct_PKG_CONFIG@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ coin_doxy_logname = @coin_doxy_logname@ coin_doxy_tagfiles = @coin_doxy_tagfiles@ coin_doxy_tagname = @coin_doxy_tagname@ coin_doxy_usedot = @coin_doxy_usedot@ coin_have_doxygen = @coin_have_doxygen@ coin_have_latex = @coin_have_latex@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src $(am__append_1) all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/sIPOPT/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/sIPOPT/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean distclean-generic distclean-libtool \ distclean-tags dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% coinor-ipopt-3.14.17/contrib/sIPOPT/doc/000077500000000000000000000000001473776672200176215ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/doc/Makefile000066400000000000000000000005301473776672200212570ustar00rootroot00000000000000# Copyright (C) 2009 International Business Machines. All Rights Reserved. # This code is published under the Eclipse Public License. # # Author: Andreas Waechter, 2010-05-26 DOCS = sipopt_manual.pdf all: $(DOCS) .SUFFIXES: .tex .pdf .tex.pdf: pdflatex $* bibtex $* pdflatex $* pdflatex $* clean: rm -f *.aux *.log *.bbl *.blg *.toc coinor-ipopt-3.14.17/contrib/sIPOPT/doc/iecrv5.bst000066400000000000000000000740301473776672200215340ustar00rootroot00000000000000%% %% This is file `iecrv5.bst', %% generated with the docstrip utility. %% %% The original source files were: %% %% merlin.mbs (with options: `ay,nat,seq-no,nm-rvvc,aunm-semi,xlab-it,keyxyr,blkyear,yr-com,dtbf,note-yr,atit-u,volp-com,jwdpg,pp-last,num-xser,jnm-x,pre-edn,edpar,bkedcap,edby,edbyx,blk-tit,pp,ed,ord,jabr,varand,etal-it,nfss,') %% ---------------------------------------- %% *** iecrv5 *** %% %% Copyright 1994-2005 Patrick W Daly % =============================================================== % IMPORTANT NOTICE: % This bibliographic style (bst) file has been generated from one or % more master bibliographic style (mbs) files, listed above. % % This generated file can be redistributed and/or modified under the terms % of the LaTeX Project Public License Distributed from CTAN % archives in directory macros/latex/base/lppl.txt; either % version 1 of the License, or any later version. % =============================================================== % Name and version information of the main mbs file: % \ProvidesFile{merlin.mbs}[2005/10/17 4.14 (PWD, AO, DPC)] % For use with BibTeX version 0.99a or later %------------------------------------------------------------------- % This bibliography style file is intended for texts in ENGLISH % This is an author-year citation style bibliography. As such, it is % non-standard LaTeX, and requires a special package file to function properly. % Such a package is natbib.sty by Patrick W. Daly % The form of the \bibitem entries is % \bibitem[Jones et al.(1990)]{key}... % \bibitem[Jones et al.(1990)Jones, Baker, and Smith]{key}... % The essential feature is that the label (the part in brackets) consists % of the author names, as they should appear in the citation, with the year % in parentheses following. There must be no space before the opening % parenthesis! % With natbib v5.3, a full list of authors may also follow the year. % In natbib.sty, it is possible to define the type of enclosures that is % really wanted (brackets or parentheses), but in either case, there must % be parentheses in the label. % The \cite command functions as follows: % \citet{key} ==>> Jones et al. (1990) % \citet*{key} ==>> Jones, Baker, and Smith (1990) % \citep{key} ==>> (Jones et al., 1990) % \citep*{key} ==>> (Jones, Baker, and Smith, 1990) % \citep[chap. 2]{key} ==>> (Jones et al., 1990, chap. 2) % \citep[e.g.][]{key} ==>> (e.g. Jones et al., 1990) % \citep[e.g.][p. 32]{key} ==>> (e.g. Jones et al., p. 32) % \citeauthor{key} ==>> Jones et al. % \citeauthor*{key} ==>> Jones, Baker, and Smith % \citeyear{key} ==>> 1990 %--------------------------------------------------------------------- ENTRY { address author booktitle chapter edition editor eid howpublished institution journal key month note number organization pages publisher school series title type volume year } {} { label extra.label sort.label short.list } INTEGERS { output.state before.all mid.sentence after.sentence after.block } FUNCTION {init.state.consts} { #0 'before.all := #1 'mid.sentence := #2 'after.sentence := #3 'after.block := } STRINGS { s t} FUNCTION {output.nonnull} { 's := output.state mid.sentence = { ", " * write$ } { output.state after.block = { add.period$ write$ newline$ "\newblock " write$ } { output.state before.all = 'write$ { add.period$ " " * write$ } if$ } if$ mid.sentence 'output.state := } if$ s } FUNCTION {output} { duplicate$ empty$ 'pop$ 'output.nonnull if$ } FUNCTION {output.check} { 't := duplicate$ empty$ { pop$ "empty " t * " in " * cite$ * warning$ } 'output.nonnull if$ } FUNCTION {fin.entry} { add.period$ write$ newline$ } FUNCTION {new.block} { output.state before.all = 'skip$ { after.block 'output.state := } if$ } FUNCTION {new.sentence} { output.state after.block = 'skip$ { output.state before.all = 'skip$ { after.sentence 'output.state := } if$ } if$ } FUNCTION {add.blank} { " " * before.all 'output.state := } FUNCTION {date.block} { skip$ } FUNCTION {not} { { #0 } { #1 } if$ } FUNCTION {and} { 'skip$ { pop$ #0 } if$ } FUNCTION {or} { { pop$ #1 } 'skip$ if$ } FUNCTION {new.block.checkb} { empty$ swap$ empty$ and 'skip$ 'new.block if$ } FUNCTION {field.or.null} { duplicate$ empty$ { pop$ "" } 'skip$ if$ } FUNCTION {emphasize} { duplicate$ empty$ { pop$ "" } { "\emph{" swap$ * "}" * } if$ } FUNCTION {bolden} { duplicate$ empty$ { pop$ "" } { "\textbf{" swap$ * "}" * } if$ } FUNCTION {tie.or.space.prefix} { duplicate$ text.length$ #3 < { "~" } { " " } if$ swap$ } FUNCTION {capitalize} { "u" change.case$ "t" change.case$ } FUNCTION {space.word} { " " swap$ * " " * } % Here are the language-specific definitions for explicit words. % Each function has a name bbl.xxx where xxx is the English word. % The language selected here is ENGLISH FUNCTION {bbl.and} { "\protect\BIBand{}"} FUNCTION {bbl.etal} { "et~al." } FUNCTION {bbl.editors} { "eds." } FUNCTION {bbl.editor} { "ed." } FUNCTION {bbl.edby} { "edited by" } FUNCTION {bbl.edition} { "edition" } FUNCTION {bbl.volume} { "volume" } FUNCTION {bbl.of} { "of" } FUNCTION {bbl.number} { "number" } FUNCTION {bbl.nr} { "no." } FUNCTION {bbl.in} { "in" } FUNCTION {bbl.pages} { "pp." } FUNCTION {bbl.page} { "p." } FUNCTION {bbl.chapter} { "chapter" } FUNCTION {bbl.techrep} { "Technical Report" } FUNCTION {bbl.mthesis} { "Master's thesis" } FUNCTION {bbl.phdthesis} { "Ph.D. thesis" } FUNCTION {bbl.first} { "1st" } FUNCTION {bbl.second} { "2nd" } FUNCTION {bbl.third} { "3rd" } FUNCTION {bbl.fourth} { "4th" } FUNCTION {bbl.fifth} { "5th" } FUNCTION {bbl.st} { "st" } FUNCTION {bbl.nd} { "nd" } FUNCTION {bbl.rd} { "rd" } FUNCTION {bbl.th} { "th" } MACRO {jan} {"January"} MACRO {feb} {"February"} MACRO {mar} {"March"} MACRO {apr} {"April"} MACRO {may} {"May"} MACRO {jun} {"June"} MACRO {jul} {"July"} MACRO {aug} {"August"} MACRO {sep} {"September"} MACRO {oct} {"October"} MACRO {nov} {"November"} MACRO {dec} {"December"} FUNCTION {eng.ord} { duplicate$ "1" swap$ * #-2 #1 substring$ "1" = { bbl.th * } { duplicate$ #-1 #1 substring$ duplicate$ "1" = { pop$ bbl.st * } { duplicate$ "2" = { pop$ bbl.nd * } { "3" = { bbl.rd * } { bbl.th * } if$ } if$ } if$ } if$ } MACRO {acmcs} {"ACM Comput. Surv."} MACRO {acta} {"Acta Inf."} MACRO {cacm} {"Commun. ACM"} MACRO {ibmjrd} {"IBM J. Res. Dev."} MACRO {ibmsj} {"IBM Syst.~J."} MACRO {ieeese} {"IEEE Trans. Software Eng."} MACRO {ieeetc} {"IEEE Trans. Comput."} MACRO {ieeetcad} {"IEEE Trans. Comput. Aid. Des."} MACRO {ipl} {"Inf. Process. Lett."} MACRO {jacm} {"J.~ACM"} MACRO {jcss} {"J.~Comput. Syst. Sci."} MACRO {scp} {"Sci. Comput. Program."} MACRO {sicomp} {"SIAM J. Comput."} MACRO {tocs} {"ACM Trans. Comput. Syst."} MACRO {tods} {"ACM Trans. Database Syst."} MACRO {tog} {"ACM Trans. Graphic."} MACRO {toms} {"ACM Trans. Math. Software"} MACRO {toois} {"ACM Trans. Office Inf. Syst."} MACRO {toplas} {"ACM Trans. Progr. Lang. Syst."} MACRO {tcs} {"Theor. Comput. Sci."} FUNCTION {bibinfo.check} { swap$ duplicate$ missing$ { pop$ pop$ "" } { duplicate$ empty$ { swap$ pop$ } { swap$ pop$ } if$ } if$ } FUNCTION {bibinfo.warn} { swap$ duplicate$ missing$ { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } { duplicate$ empty$ { swap$ "empty " swap$ * " in " * cite$ * warning$ } { swap$ pop$ } if$ } if$ } STRINGS { bibinfo} INTEGERS { nameptr namesleft numnames } FUNCTION {format.names} { 'bibinfo := duplicate$ empty$ 'skip$ { 's := "" 't := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{vv~}{ll}{, jj}{, f{.}.}" format.name$ bibinfo bibinfo.check 't := nameptr #1 > { namesleft #1 > { "; " * t * } { s nameptr "{ll}" format.name$ duplicate$ "others" = { 't := } { pop$ } if$ numnames #2 > { ";" * } 'skip$ if$ t "others" = { " " * bbl.etal emphasize * } { bbl.and space.word * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } if$ } FUNCTION {format.names.ed} { 'bibinfo := duplicate$ empty$ 'skip$ { 's := "" 't := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{f{.}.~}{vv~}{ll}{ jj}" format.name$ bibinfo bibinfo.check 't := nameptr #1 > { namesleft #1 > { "; " * t * } { s nameptr "{ll}" format.name$ duplicate$ "others" = { 't := } { pop$ } if$ numnames #2 > { ";" * } 'skip$ if$ t "others" = { " " * bbl.etal emphasize * } { bbl.and space.word * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } if$ } FUNCTION {format.key} { empty$ { key field.or.null } { "" } if$ } FUNCTION {format.authors} { author "author" format.names } FUNCTION {get.bbl.editor} { editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } FUNCTION {format.editors} { editor "editor" format.names duplicate$ empty$ 'skip$ { " " * get.bbl.editor capitalize "(" swap$ * ")" * * } if$ } FUNCTION {format.note} { note empty$ { "" } { note #1 #1 substring$ duplicate$ "{" = 'skip$ { output.state mid.sentence = { "l" } { "u" } if$ change.case$ } if$ note #2 global.max$ substring$ * "note" bibinfo.check } if$ } FUNCTION {format.title} { title "title" bibinfo.check } FUNCTION {format.full.names} {'s := "" 't := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{vv~}{ll}" format.name$ 't := nameptr #1 > { namesleft #1 > { ", " * t * } { s nameptr "{ll}" format.name$ duplicate$ "others" = { 't := } { pop$ } if$ t "others" = { " " * bbl.etal emphasize * } { numnames #2 > { "," * } 'skip$ if$ bbl.and space.word * t * } if$ } if$ } 't if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {author.editor.key.full} { author empty$ { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.full.names } if$ } { author format.full.names } if$ } FUNCTION {author.key.full} { author empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { author format.full.names } if$ } FUNCTION {editor.key.full} { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.full.names } if$ } FUNCTION {make.full.names} { type$ "book" = type$ "inbook" = or 'author.editor.key.full { type$ "proceedings" = 'editor.key.full 'author.key.full if$ } if$ } FUNCTION {output.bibitem} { newline$ "\bibitem[{" write$ label write$ ")" make.full.names duplicate$ short.list = { pop$ } { * } if$ "}]{" * write$ cite$ write$ "}" write$ newline$ "" before.all 'output.state := } FUNCTION {n.dashify} { 't := "" { t empty$ not } { t #1 #1 substring$ "-" = { t #1 #2 substring$ "--" = not { "--" * t #2 global.max$ substring$ 't := } { { t #1 #1 substring$ "-" = } { "-" * t #2 global.max$ substring$ 't := } while$ } if$ } { t #1 #1 substring$ * t #2 global.max$ substring$ 't := } if$ } while$ } FUNCTION {word.in} { bbl.in capitalize " " * } FUNCTION {format.date} { year "year" bibinfo.check duplicate$ empty$ { } 'skip$ if$ bolden extra.label * before.all 'output.state := ", " swap$ * } FUNCTION {format.btitle} { title "title" bibinfo.check duplicate$ empty$ 'skip$ { emphasize } if$ } FUNCTION {either.or.check} { empty$ 'pop$ { "can't use both " swap$ * " fields in " * cite$ * warning$ } if$ } FUNCTION {format.bvolume} { volume empty$ { "" } { bbl.volume volume tie.or.space.prefix "volume" bibinfo.check * * series "series" bibinfo.check duplicate$ empty$ 'pop$ { swap$ bbl.of space.word * swap$ emphasize * } if$ "volume and number" number either.or.check } if$ } FUNCTION {format.number.series} { volume empty$ { number empty$ { series field.or.null } { series empty$ { number "number" bibinfo.check } { output.state mid.sentence = { bbl.number } { bbl.number capitalize } if$ number tie.or.space.prefix "number" bibinfo.check * * bbl.in space.word * series "series" bibinfo.check * } if$ } if$ } { "" } if$ } FUNCTION {is.num} { chr.to.int$ duplicate$ "0" chr.to.int$ < not swap$ "9" chr.to.int$ > not and } FUNCTION {extract.num} { duplicate$ 't := "" 's := { t empty$ not } { t #1 #1 substring$ t #2 global.max$ substring$ 't := duplicate$ is.num { s swap$ * 's := } { pop$ "" 't := } if$ } while$ s empty$ 'skip$ { pop$ s } if$ } FUNCTION {convert.edition} { extract.num "l" change.case$ 's := s "first" = s "1" = or { bbl.first 't := } { s "second" = s "2" = or { bbl.second 't := } { s "third" = s "3" = or { bbl.third 't := } { s "fourth" = s "4" = or { bbl.fourth 't := } { s "fifth" = s "5" = or { bbl.fifth 't := } { s #1 #1 substring$ is.num { s eng.ord 't := } { edition 't := } if$ } if$ } if$ } if$ } if$ } if$ t } FUNCTION {format.edition} { edition duplicate$ empty$ 'skip$ { convert.edition output.state mid.sentence = { "l" } { "t" } if$ change.case$ "edition" bibinfo.check " " * bbl.edition * } if$ } INTEGERS { multiresult } FUNCTION {multi.page.check} { 't := #0 'multiresult := { multiresult not t empty$ not and } { t #1 #1 substring$ duplicate$ "-" = swap$ duplicate$ "," = swap$ "+" = or or { #1 'multiresult := } { t #2 global.max$ substring$ 't := } if$ } while$ multiresult } FUNCTION {format.pages} { pages duplicate$ empty$ 'skip$ { duplicate$ multi.page.check { bbl.pages swap$ n.dashify } { bbl.page swap$ } if$ tie.or.space.prefix "pages" bibinfo.check * * } if$ } FUNCTION {format.journal.pages} { pages duplicate$ empty$ 'pop$ { swap$ duplicate$ empty$ { pop$ pop$ format.pages } { ", " * swap$ n.dashify pages multi.page.check 'bbl.pages 'bbl.page if$ swap$ tie.or.space.prefix "pages" bibinfo.check * * * } if$ } if$ } FUNCTION {format.journal.eid} { eid "eid" bibinfo.check duplicate$ empty$ 'pop$ { swap$ duplicate$ empty$ 'skip$ { ", " * } if$ swap$ * } if$ } FUNCTION {format.vol.num.pages} { volume field.or.null duplicate$ empty$ 'skip$ { "volume" bibinfo.check } if$ number "number" bibinfo.check duplicate$ empty$ 'skip$ { swap$ duplicate$ empty$ { "there's a number but no volume in " cite$ * warning$ } 'skip$ if$ swap$ "(" swap$ * ")" * } if$ * } FUNCTION {format.chapter.pages} { chapter empty$ { "" } { type empty$ { bbl.chapter } { type "l" change.case$ "type" bibinfo.check } if$ chapter tie.or.space.prefix "chapter" bibinfo.check * * } if$ } FUNCTION {format.booktitle} { booktitle "booktitle" bibinfo.check emphasize } FUNCTION {format.in.ed.booktitle} { format.booktitle duplicate$ empty$ 'skip$ { editor "editor" format.names.ed duplicate$ empty$ 'pop$ { get.bbl.editor " " * swap$ * swap$ "," * " " * swap$ * } if$ word.in swap$ * } if$ } FUNCTION {format.thesis.type} { type duplicate$ empty$ 'pop$ { swap$ pop$ "t" change.case$ "type" bibinfo.check } if$ } FUNCTION {format.tr.number} { number "number" bibinfo.check type duplicate$ empty$ { pop$ bbl.techrep } 'skip$ if$ "type" bibinfo.check swap$ duplicate$ empty$ { pop$ "t" change.case$ } { tie.or.space.prefix * * } if$ } FUNCTION {format.article.crossref} { word.in " \cite{" * crossref * "}" * } FUNCTION {format.book.crossref} { volume duplicate$ empty$ { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ pop$ word.in } { bbl.volume capitalize swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * } if$ " \cite{" * crossref * "}" * } FUNCTION {format.incoll.inproc.crossref} { word.in " \cite{" * crossref * "}" * } FUNCTION {format.org.or.pub} { 't := "" address empty$ t empty$ and 'skip$ { t empty$ { address "address" bibinfo.check * } { t * address empty$ 'skip$ { ", " * address "address" bibinfo.check * } if$ } if$ } if$ } FUNCTION {format.publisher.address} { publisher "publisher" bibinfo.warn format.org.or.pub } FUNCTION {format.organization.address} { organization "organization" bibinfo.check format.org.or.pub } FUNCTION {article} { output.bibitem format.authors "author" output.check author format.key output format.title "title" output.check new.sentence crossref missing$ { journal "journal" bibinfo.check emphasize "journal" output.check add.blank format.vol.num.pages output format.date "year" output.check } { format.article.crossref output.nonnull } if$ eid empty$ { format.journal.pages } { format.journal.eid } if$ format.note output fin.entry } FUNCTION {book} { output.bibitem author empty$ { format.editors "author and editor" output.check editor format.key output } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ format.btitle "title" output.check crossref missing$ { format.bvolume output new.sentence format.number.series output format.edition output format.publisher.address output } { new.sentence format.book.crossref output.nonnull } if$ format.date "year" output.check format.note output fin.entry } FUNCTION {booklet} { output.bibitem format.authors output author format.key output format.title "title" output.check new.sentence howpublished "howpublished" bibinfo.check output address "address" bibinfo.check output format.date "year" output.check format.note output fin.entry } FUNCTION {inbook} { output.bibitem author empty$ { format.editors "author and editor" output.check editor format.key output } { format.authors output.nonnull crossref missing$ { "author and editor" editor either.or.check } 'skip$ if$ } if$ format.btitle "title" output.check crossref missing$ { format.bvolume output format.chapter.pages "chapter and pages" output.check new.sentence format.number.series output format.edition output format.publisher.address output } { format.chapter.pages "chapter and pages" output.check new.sentence format.book.crossref output.nonnull } if$ format.date "year" output.check format.pages "pages" output.check format.note output fin.entry } FUNCTION {incollection} { output.bibitem format.authors "author" output.check author format.key output format.title "title" output.check new.sentence crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output format.edition output format.chapter.pages output format.publisher.address output format.date "year" output.check } { format.incoll.inproc.crossref output.nonnull format.chapter.pages output } if$ format.pages "pages" output.check format.note output fin.entry } FUNCTION {inproceedings} { output.bibitem format.authors "author" output.check author format.key output format.title "title" output.check new.sentence crossref missing$ { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output publisher empty$ { format.organization.address output } { organization "organization" bibinfo.check output format.publisher.address output } if$ format.date "year" output.check } { format.incoll.inproc.crossref output.nonnull } if$ format.pages "pages" output.check format.note output fin.entry } FUNCTION {conference} { inproceedings } FUNCTION {manual} { output.bibitem format.authors output author format.key output format.btitle "title" output.check new.sentence organization "organization" bibinfo.check output address "address" bibinfo.check output format.edition output format.date "year" output.check format.note output fin.entry } FUNCTION {mastersthesis} { output.bibitem format.authors "author" output.check author format.key output format.btitle "title" output.check new.sentence bbl.mthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output format.date "year" output.check format.note output fin.entry } FUNCTION {misc} { output.bibitem format.authors output author format.key output format.title output new.sentence howpublished "howpublished" bibinfo.check output format.date "year" output.check format.note output fin.entry } FUNCTION {phdthesis} { output.bibitem format.authors "author" output.check author format.key output format.btitle "title" output.check new.sentence bbl.phdthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output format.date "year" output.check format.note output fin.entry } FUNCTION {proceedings} { output.bibitem format.editors output editor format.key output format.btitle "title" output.check format.bvolume output format.number.series output publisher empty$ { format.organization.address output } { organization "organization" bibinfo.check output format.publisher.address output } if$ format.date "year" output.check format.note output fin.entry } FUNCTION {techreport} { output.bibitem format.authors "author" output.check author format.key output format.title "title" output.check new.sentence format.tr.number output.nonnull institution "institution" bibinfo.warn output address "address" bibinfo.check output format.date "year" output.check format.note output fin.entry } FUNCTION {unpublished} { output.bibitem format.authors "author" output.check author format.key output format.title "title" output.check format.date "year" output.check format.note "note" output.check fin.entry } FUNCTION {default.type} { misc } READ FUNCTION {sortify} { purify$ "l" change.case$ } INTEGERS { len } FUNCTION {chop.word} { 's := 'len := s #1 len substring$ = { s len #1 + global.max$ substring$ } 's if$ } FUNCTION {format.lab.names} { 's := "" 't := s #1 "{vv~}{ll}" format.name$ s num.names$ duplicate$ #2 > { pop$ " " * bbl.etal emphasize * } { #2 < 'skip$ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = { " " * bbl.etal emphasize * } { bbl.and space.word * s #2 "{vv~}{ll}" format.name$ * } if$ } if$ } if$ } FUNCTION {author.key.label} { author empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { author format.lab.names } if$ } FUNCTION {author.editor.key.label} { author empty$ { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.lab.names } if$ } { author format.lab.names } if$ } FUNCTION {editor.key.label} { editor empty$ { key empty$ { cite$ #1 #3 substring$ } 'key if$ } { editor format.lab.names } if$ } FUNCTION {calc.short.authors} { type$ "book" = type$ "inbook" = or 'author.editor.key.label { type$ "proceedings" = 'editor.key.label 'author.key.label if$ } if$ 'short.list := } FUNCTION {calc.label} { calc.short.authors short.list "(" * year duplicate$ empty$ short.list key field.or.null = or { pop$ "" } 'skip$ if$ * 'label := } FUNCTION {sort.format.names} { 's := #1 'nameptr := "" s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } { s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := nameptr #1 > { " " * namesleft #1 = t "others" = and { "zzzzz" * } { t sortify * } if$ } { t sortify * } if$ nameptr #1 + 'nameptr := namesleft #1 - 'namesleft := } while$ } FUNCTION {sort.format.title} { 't := "A " #2 "An " #3 "The " #4 t chop.word chop.word chop.word sortify #1 global.max$ substring$ } FUNCTION {author.sort} { author empty$ { key empty$ { "to sort, need author or key in " cite$ * warning$ "" } { key sortify } if$ } { author sort.format.names } if$ } FUNCTION {author.editor.sort} { author empty$ { editor empty$ { key empty$ { "to sort, need author, editor, or key in " cite$ * warning$ "" } { key sortify } if$ } { editor sort.format.names } if$ } { author sort.format.names } if$ } FUNCTION {editor.sort} { editor empty$ { key empty$ { "to sort, need editor or key in " cite$ * warning$ "" } { key sortify } if$ } { editor sort.format.names } if$ } INTEGERS { seq.num } FUNCTION {init.seq} { #0 'seq.num :=} EXECUTE {init.seq} FUNCTION {int.to.fix} { "000000000" swap$ int.to.str$ * #-1 #10 substring$ } FUNCTION {presort} { calc.label label sortify " " * seq.num #1 + 'seq.num := seq.num int.to.fix 'sort.label := sort.label * " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } ITERATE {presort} SORT STRINGS { last.label next.extra } INTEGERS { last.extra.num number.label } FUNCTION {initialize.extra.label.stuff} { #0 int.to.chr$ 'last.label := "" 'next.extra := #0 'last.extra.num := #0 'number.label := } FUNCTION {forward.pass} { last.label label = { last.extra.num #1 + 'last.extra.num := last.extra.num int.to.chr$ 'extra.label := } { "a" chr.to.int$ 'last.extra.num := "" 'extra.label := label 'last.label := } if$ number.label #1 + 'number.label := } FUNCTION {reverse.pass} { next.extra "b" = { "a" 'extra.label := } 'skip$ if$ extra.label 'next.extra := extra.label emphasize duplicate$ empty$ 'skip$ { "{\natexlab{" swap$ * "}}" * } if$ 'extra.label := label extra.label * 'label := } EXECUTE {initialize.extra.label.stuff} ITERATE {forward.pass} REVERSE {reverse.pass} FUNCTION {bib.sort.order} { sort.label " " * year field.or.null sortify * " " * title field.or.null sort.format.title * #1 entry.max$ substring$ 'sort.key$ := } ITERATE {bib.sort.order} SORT FUNCTION {begin.bib} { preamble$ empty$ 'skip$ { preamble$ write$ newline$ } if$ "\begin{thebibliography}{" number.label int.to.str$ * "}" * write$ newline$ "\providecommand{\natexlab}[1]{#1}" write$ newline$ } EXECUTE {begin.bib} EXECUTE {init.state.consts} ITERATE {call.type$} FUNCTION {end.bib} { newline$ "\end{thebibliography}" write$ newline$ } EXECUTE {end.bib} %% End of customized bst file %% %% End of file `iecrv5.bst'. coinor-ipopt-3.14.17/contrib/sIPOPT/doc/sipopt.bib000066400000000000000000000330121473776672200216140ustar00rootroot00000000000000% This file was created with JabRef 2.6. % Encoding: UTF-8 @BOOK{Ascher1988, title = {Numerical Solution of Boundary Value Problems for Ordinary Differential Equations.}, publisher = {Prentice Hall}, year = {1988}, author = {Ascher, Uri M. and Mattheij, Robert M. M. and Russell, Robert D.}, series = {Series in Computational Mathematics}, owner = {hans}, timestamp = {2009.10.29} } @BOOK{Ascher1998, title = {Computer Methods for Ordinary Differential Equations and Differential-Algebraic Equations}, publisher = {SIAM}, year = {1998}, author = {Ascher, Uri M. and Petzold, Linda R.}, owner = {hans}, timestamp = {2009.11.01} } @INCOLLECTION{Buskens, author = {C. B\"{u}skens and H. Maurer}, title = {{Sensitivity analysis and real-time control of parametric control problems using nonlinear programming methods}}, booktitle = {{Online Optimization of Large-scale Systems}}, publisher = {Springer-Verlag}, year = {2001}, editor = {M. Gr\"{o}tschel, S. Krumke and J. Rambau}, pages = {57-68}, owner = {rlopezne}, timestamp = {2011.03.29} } @ARTICLE{Bartlett2006, author = {Bartlett, Roscoe A. and Biegler, Lorenz T.}, title = {QPSchur: A dual, active-set, Schur-complement method for large-scale and structured convex quadratic programming}, journal = {Optimization and Engineering}, year = {2006}, volume = {7}, pages = {5-32}, owner = {hans}, timestamp = {2009.11.09} } @TECHREPORT{beltracchi, author = {T. J. Beltracchi and G. A. Gabriele}, title = {{An Investigation of New Methods for Estimating Parameter Sensitivities}}, institution = {NASA Contractor Report}, year = {1989}, number = {4245}, owner = {rlopezne}, timestamp = {2011.03.29} } @BOOK{larrybook, title = {Nonlinear Programming: Concepts, Algorithms, and Applications to Chemical Processes}, publisher = {SIAM}, year = {2010}, author = {Lorenz T. Biegler}, owner = {rlopezne}, timestamp = {2011.02.15} } @ARTICLE{Biegler1992, author = {Biegler, Lorenz T.}, title = {Optimization Strategies for Complex Process Models}, journal = {Advances in Chemical Engineering}, year = {1992}, volume = {18}, pages = {197}, owner = {hans}, timestamp = {2009.11.01} } @ARTICLE{Biegler2002, author = {Lorenz T. Biegler and Arturo M. Cervantes and Andreas Wächter}, title = {Advances in simultaneous strategies for dynamic process optimization}, journal = {Chemical Engineering Science}, year = {2002}, volume = {57}, pages = {575 - 593}, number = {4}, doi = {DOI: 10.1016/S0009-2509(01)00376-1}, issn = {0009-2509}, keywords = {Interior point}, owner = {hans}, timestamp = {2009.07.25}, url = {http://www.sciencedirect.com/science/article/B6TFK-44HTMKP-2/2/1def833c57d912e4aad7027ad582dd2b} } @PHDTHESIS{Diehl2001, author = {M. Diehl}, title = {Real-Time Optimization for Large Scale Nonlinear Processes}, school = {Universit\"at Heidelberg}, year = {2001}, note = {http://www.ub.uni-heidelberg.de/archiv/1659/}, file = {Diehl2001.pdf:Diehl2001.pdf:PDF}, keywords = {agbock NMPC chemistry multiple shooting optimal control}, owner = {rlopezne}, timestamp = {2011.03.29} } @INBOOK{Diehl2007, chapter = {A Stabilizing Real-Time Implementation of Nonlinear Model Predictive Control}, pages = {25-52}, title = {Real-Time PDE-Constrained Optimization}, publisher = {SIAM}, year = {2007}, editor = {Biegler, Lorenz T. and Keyes, David and Ghattas, Omar and van Bloemen Waanders, Bart and Heinkenschloss, Mathias}, author = {Diehl, Moritz and Findeisen, Rolf and Allg\"ower, Frank}, owner = {hans}, timestamp = {2009.11.09} } @BOOK{Fiacco1983, title = {Introduction to Sensitivity and Stability Analysis in Nonlinear Programming}, publisher = {Academic Press}, year = {1983}, author = {Anthony V. Fiacco}, volume = {165}, series = {Mathematics in Science and Engineering}, owner = {hans}, timestamp = {2009.07.26} } @TECHREPORT{sensumt, author = {A. V. Fiacco and A. Ghaemi}, title = {A user's manual for SENSUMT. A penalty function computer program for solution, sensitivity analysis and optimal bound value calculation in parametric nonlinear programs}, institution = {Management Science and Engineering, George Washington University}, year = {1980}, number = {T-434}, owner = {rlopezne}, timestamp = {2011.03.29} } @ARTICLE{Fiacco90, author = {A. V. Fiacco and Y. Ishizuka}, title = {Sensitivity and Stability Analysis for Nonlinear Programming}, journal = {Annals of Operations Research}, year = {1990}, volume = {27}, pages = {215-236}, owner = {rlopezne}, timestamp = {2011.03.29} } @ARTICLE{marlin1, author = {Forbes, J.F. and T. E. Marlin}, title = {{Design cost: a systematic approach to technology selection for model-based real-time optimization systems}}, journal = {Comput. Chem. Eng.}, year = {1996}, volume = {20}, pages = {717--734}, owner = {rlopezne}, timestamp = {2011.03.29} } @ARTICLE{forsgren, author = {A. Forsgren and P. E. Gill and M. H. Wright}, title = {Interior Point Methods for Nonlinear Optimization}, journal = {SIAM Review}, year = {2002}, volume = {44}, pages = {525-597}, number = {4}, owner = {rlopezne}, timestamp = {2011.03.29} } @BOOK{ampl, title = {AMPL: A Modeling Language for Mathematical Programming}, publisher = {Duxbury Press}, year = {2002}, author = {Fourer, Robert and Gay, David M. and Kernighan, Brian W.}, address = {Pacific Grove}, owner = {rlopezne}, timestamp = {2009.06.12} } @ARTICLE{Ganesh1987, author = {N. Ganesh and Biegler, Lorenz T.}, title = {A reduced hessian strategy for sensitivity analysis of optimal flowsheets.}, journal = {AIChE}, year = {1987}, volume = {33}, pages = {282-296}, owner = {rlopezne}, timestamp = {2011.03.29} } @ARTICLE{Hicks1971, author = {G. A. Hicks and W. H. Ray}, title = {Approximation methods for optimal control synthesis}, journal = {The Canadian Journal of Chemical Engineering}, year = {1971}, volume = {49}, pages = {522-528}, owner = {hans}, timestamp = {2009.07.25} } @ARTICLE{Huang2009, author = {Rui Huang and Victor M. Zavala and Lorenz T. Biegler}, title = {Advanced step nonlinear model predictive control for air separation units}, journal = {Journal of Process Control}, year = {2009}, volume = {19}, pages = {678 - 685}, number = {4}, doi = {DOI: 10.1016/j.jprocont.2008.07.006}, issn = {0959-1524}, keywords = {Air separation units}, owner = {hans}, timestamp = {2009.07.22}, url = {http://www.sciencedirect.com/science/article/B6V4N-4TFH2GW-1/2/061dea994c5a92b4e6dec4029f98c871} } @BOOK{Jongen2000, title = {Nonlinear Optimization in Finite Dimensions}, publisher = {Kluwer Academic Publishers}, year = {2000}, author = {Jongen, Hubertus T. and Jonker, Peter and Twilt, Frank}, owner = {hans}, timestamp = {2010.01.12} } @BOOK{Jongen2004, title = {Optimization Theory}, publisher = {Kluwer Academic Publishers}, year = {2004}, author = {Jongen, Hubertus T. and Meer, Klaus and Triesch, Eberhard}, owner = {hans}, timestamp = {2009.11.02} } @INCOLLECTION{kadam, author = {J. Kadam and W. Marquardt}, title = {{Sensitivity-based Solution Updates in Closed-loop Dynamic Optimization}}, booktitle = {{Proceedings of the DYCOPS 7 Conference}}, publisher = {Elsevier}, year = {2004}, owner = {rlopezne}, timestamp = {2011.03.29} } @ARTICLE{Kameswaran2008, author = {Kameswaran, Shivakumar and Biegler, Lorenz T.}, title = {Convergence rates for direct transcription of optimal control problems using collocation at Radau points}, journal = {Comput. Optim. Appl.}, year = {2008}, volume = {41}, pages = {81--126}, number = {1}, address = {Norwell, MA, USA}, doi = {http://dx.doi.org/10.1007/s10589-007-9098-9}, issn = {0926-6003}, owner = {rlopezne}, publisher = {Kluwer Academic Publishers}, timestamp = {2011.03.29} } @INCOLLECTION{Kojima1980, author = {M. Kojima}, title = {{Strongly State Stationary Solutions in Nonlinear Programs}}, booktitle = {{Analysis and Computation of Fixed Points}}, publisher = {Academic Press}, year = {1980}, editor = {S. M. Robinson}, address = {New York}, owner = {rlopezne}, timestamp = {2011.03.29} } @ARTICLE{Kojima1984, author = {M. Kojima and R. Hirabayashi}, title = {Continuous Deformation of Nonlinear Programs}, journal = {Mathematical Programming Study}, year = {1984}, volume = {21}, pages = {150-198}, owner = {hans}, timestamp = {2010.01.12} } @ARTICLE{kyparsis90, author = {J. Kyparsis}, title = {Sensitivity Analysis for Nonlinear Programs and Variational Inequalities with Nonunique Multipliers}, journal = {Mathematics of Operations Research}, year = {1990}, volume = {15}, pages = {286-298}, number = {2}, owner = {rlopezne}, timestamp = {2011.03.29} } @BOOK{nocedalbook, title = {Numerical Optimization}, publisher = {Springer}, year = {2006}, author = {Jorge Nocedal and Stephen Wright}, series = {Operations Research and Financial Engineering}, address = {New York}, edition = {2nd}, owner = {rlopezne}, timestamp = {2011.03.29} } @BOOK{Nocedal1999, title = {Numerical Optimization}, publisher = {Springer}, year = {1999}, author = {Nocedal, Jorge and Wright, Steven J.}, owner = {hans}, timestamp = {2009.11.02} } @MANUAL{askkt, title = {\emph{sensKKT} Reference Manual}, author = {Hans Pirnay and Rodrigo L\'opez-Negrete and Lorenz T. Biegler}, organization = {Carnegie Mellon University}, year = {2011}, owner = {rlopezne}, timestamp = {2011.03.28} } @UNPUBLISHED{pirnay:2011, author = {Hans Pirnay and Rodrigo L\'opez-Negrete and Lorenz T. Biegler}, title = {Optimal Sensitivity Based on IPOPT}, year = {2011}, comment = {In preparation}, owner = {rlopezne}, timestamp = {2011.03.29} } @ARTICLE{Vassiliadis1994, author = {Vassiliadis, V. S. and Sargent, R. W. H. and Pantelides, C. C.}, title = {Solution of a class of multistage dynamic optimization problems. Part one - Algorithmic Framework}, journal = {Journal of Industrial and Engineering Chemistry Research}, year = {1994}, volume = {33}, pages = {2115-2123}, owner = {hans}, timestamp = {2009.10.28} } @ARTICLE{Vassiliadis1994a, author = {Vassiliadis, V. S. and Sargent, R. W. H. and Pantelides, C. C.}, title = {Solution of a class of multistage dynamic optimization problems. Part two - Problems with Path Constraints}, journal = {Journal of Industrial and Engineering Chemistry Research}, year = {1994}, volume = {33}, pages = {2123-2133}, owner = {hans}, timestamp = {2009.10.28} } @ARTICLE{Waechter2006, author = {W\"achter, Andreas and Biegler, Lorenz T.}, title = {On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming}, journal = {Mathematical Programming}, year = {2006}, volume = {106(1)}, pages = {25-57}, owner = {hans}, timestamp = {2009.08.03} } @ARTICLE{wolbert, author = {Wolbert, D. and X. Joulia and B. Koehret and L. T. Biegler}, title = {{Flowsheet Optimization and Optimal Sensitivity Analysis Using Exact Derivatives}}, journal = {Computers and Chemical Engineering}, year = {1994}, volume = {18}, pages = {1083}, owner = {rlopezne}, timestamp = {2011.03.29} } @PHDTHESIS{ZavalaPhd, author = {Zavala, Victor M.}, title = {Computational Strategies for the Operation of Large-Scale Chemical Processes}, school = {Carnegie Mellon University}, year = {2008}, owner = {hans}, timestamp = {2009.07.28} } @ARTICLE{Zavala2009, author = {Victor M. Zavala and Lorenz T. Biegler}, title = {The advanced-step NMPC controller: Optimality, stability and robustness}, journal = {Automatica}, year = {2009}, volume = {45}, pages = {86 - 93}, number = {1}, doi = {DOI: 10.1016/j.automatica.2008.06.011}, issn = {0005-1098}, keywords = {Nonlinear model predictive control}, owner = {hans}, timestamp = {2009.07.22}, url = {http://www.sciencedirect.com/science/article/B6V21-4V28T0V-6/2/2f93266b2f0847c9a00bd59bf4788157} } @ARTICLE{Zavala2008, author = {Zavala, Victor M. and Laird, Carl D. and Biegler, Lorenz T.}, title = {{Fast implementations and rigorous models: Can both be accomodated in NMPC?}}, journal = {International Journal of Robust Nonlinear Control}, year = {2008}, volume = {18}, pages = {800-815}, owner = {hans}, timestamp = {2009.07.22} } @ARTICLE{Zavala2008a, author = {Victor M. Zavala and Carl D. Laird and Lorenz T. Biegler}, title = {A fast moving horizon estimation algorithm based on nonlinear programming sensitivity}, journal = {Journal of Process Control}, year = {2008}, volume = {18}, pages = {876 - 884}, number = {9}, note = {Selected Papers From Two Joint Conferences: 8th International Symposium on Dynamics and Control of Process Systems and the 10th Conference Applications in Biotechnology, 8th International Symposium on Dynamics and Control of Process Systems and the 10th Conference Applications in Biotechnology}, doi = {DOI: 10.1016/j.jprocont.2008.06.003}, issn = {0959-1524}, keywords = {Estimation algorithms}, owner = {hans}, timestamp = {2009.07.22}, url = {http://www.sciencedirect.com/science/article/B6V4N-4T1X2DR-2/2/816f809d57e3f6e00359b4163849b4b4} } @PROCEEDINGS{Bock1983, title = {Numerical Treatment of Inverse Problems in Differential and Integral Equations: Proceedings of an International Workshop}, year = {1983}, editor = {Bock, H. G.}, owner = {hans}, timestamp = {2009.10.29} } @comment{jabref-meta: selector_publisher:} @comment{jabref-meta: selector_author:} @comment{jabref-meta: selector_journal:} @comment{jabref-meta: selector_keywords:} coinor-ipopt-3.14.17/contrib/sIPOPT/doc/sipopt_manual.pdf000066400000000000000000007451321473776672200232030ustar00rootroot00000000000000%PDF-1.4 %ÐÔÅØ 3 0 obj << /Length 1240 /Filter /FlateDecode >> stream xÚíWKÛ6¾çWè(#5+R%7iФÙMŒsjz %Ú&ªWEÉÙÝ_ß!‡òz 7Ø¢è¡HŽ8çñ‘¾Z¿øñgžG4'Œfçîñ\)ÙÉ“éÅ›õ‹?œ™ÐÐ endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 1 0 obj << /Font << /F47 4 0 R /F48 5 0 R /F50 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 10 0 obj << /Length 2799 /Filter /FlateDecode >> stream xÚíZmoã¸þž_áû¦ 1ËwI»X´·ÛÍeïºÛ pÒ•m%ªŸ%'›ýõ!)[TèÄI÷n‡~’HކœŸêíÅÑOe2a”¤4e“‹ë‰ŽIª':Õ„R>¹XL.£‹e~<JD³¬-æöµÍYT·EWÜݽëëÖY—߸VQ­Ê¼Êë._ØŽe¾>fIdxñ¨h·<{‚¦¶Ïnéh²Õª,æYWô#͵G!¢³ )ŠÎÒŸnê¹!¾ºøn2eš¤B›§j+JcWQO¹Ñ¿¨¢g§ð`¶£kܧÀ—óó û2oêEì[ÛÆÅx”?¼ÿpÌxÛüÖÑµËæ®¶¯…{žÙ|î&ºdW'ø¦A§½B‹Ü};ÏÜ37G3ë²¢FaëÚÈÒTF`êDÕVÔ H’4j›rcˆ­»¢[ºþMÑe³2·-«“›M™­9±Ï“Ú•³_éÆg÷Ûn‹úÆ6ܬ%¬X}ÎvSuÁÓª+¥ Xp¡ ûn悦™ô'yÕžX΂ŠuÝãxn<ô\¡ˆ€7jérô ¦£¬$ŽØssÄIO{ɯ,ñ]nŸËìÖ¼ÅQþ©Ëë…ñP臵·ŽÄê¢Ý”]ëÆû…õMè˜eëu:3U^g¥Ù(ШònÙ8–þ6ïÑGpàìÃß?\ÇÝÉ´[kJâ˜ùJ±:U4ºnʲ¹³Ö€f»™µù¼·!tÜ9:+ %©*´”q)hoYU™ñVeŒ3ÏWcÑ÷n WÙ ¤4 5ŠVtÂI•â¨h0ŸDI界À>c”Òèm¯äñc¾‹%k. c–Ç;§XôŸÖ±Î@³k QØ®›Úº¡¶{åˆl‡qÈ!ƒëf]½²Ó3å9 å$á|2•š0-ì*ª¢¶´\N fÆÔ²„°(Ñ"¶„ŸœDlÈ’)Â9ȸ#»ͬ‰‚禫B¼$á’÷DŸÂl¸Ø²yæ‘È´§X…x("“d°ÜVÖ îêt ±t’Î` €ª-`ƒº û³·jÖ¶wÕT’ƒ*N£¿5wù­Å:°z¡¹{ðÅxᇀNŠÛÌ/ì0@ gn` ½àLOž òg‚CL;­tªIÊBˆ,hHïÎ’ÿ Š‹¯€5N§‰ÖzGDƒëµ¯ýw|TÅ‚ ït¹Ê¿Í)Ld¤| žë‚C2Ç¢#C÷ÏßÊñ°°œƒó²µdk…7,(¸0êMœP%øí…`cÔFYòÔ3R$Ú~¸ëŠÐlU ¦ ¨öe[LHãƒlK@E%êK!ÕÙ–ü}e[~jƒ×OWÃÌ'†…kéç>ßb )µçW*¥4‘ò½gBêaèÕžDMîtH²¨1üõœÜª`Xh aD!P¡äöˆ‘ꈬ´Û¬Ü`Y×ê{îÙ¼©VpœÛÆöã¾^ ŸØ’åC‡„ Ô‰AÄ.J,ú‘ ÂDJ|û–‰mÀAd-˜A»ÂÞ½‰á;ô׫fDs T£¾úFó1…[qKÔ{ÌÑ_/Ž~>ÂÝ@'l"•£O…Ì6“yutyE' ûò„©w†²Âm&Íþ('?}Ú=„=cø}Vßd-Þq×ÓS÷gsWtŸC¿;ç> endobj 8 0 obj << /Font << /F48 5 0 R /F47 4 0 R /F50 6 0 R /F15 11 0 R /F24 12 0 R /F41 13 0 R /F42 14 0 R /F45 15 0 R /F25 16 0 R /F21 17 0 R /F43 18 0 R /F28 19 0 R /F22 20 0 R /F27 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 24 0 obj << /Length 2731 /Filter /FlateDecode >> stream xÚí[KsÛ8¾ûWð(×DX¼ˆGRs˜Énj½“d2×d«’h‰¶Y‘(E¤-çßO7J„ ú‘xÇ““ l4ºî¯Í_÷þõLšŒQb©eÙáq¦4±*SVJyv8ÍÞŽž³ÉÙ¬h«E½?æ¹-ŽñWÚÓÒw4eÝTmu^µŸü?ÂlG,WÕ¼˜ù‡E=õÓ³®ë¼XUÅѬlüƒuÕžúÖjŸ™QÙ,÷Ù¨œ´èbÿýáÿ€qÖg\hA8ÕõL/Øhq†pk»õbÝñ†“,&e9m<;Ǿg¾]ËÆÂ"%ÏÆL)rO¦š/gÕ¤r¼ÑÑñY=éEñÍ…_ÁÜw¼£9=xv?ÌwKx»œ†á‹Ík¾±X¶(¶ V:š,êi…ä›ðüxK–÷ˆ¶I¡jy¾# Î2èÖÔ É‰4–G”Ð~M‰Q-xÖEöÇ‚ÑÑ¿Ëw°iêª>ÙYÇdz¢nñ²yœâlÌ%Âèl,%1,l»~(ËûC#Z‹n ¸îAI8¨) jRtr˜¼™w”«%Eò-COÒdŒ´×‰Ýx±«HìñL(v‘õF¡ÆƒÖµýæýw¸ Td<'A¨Üíd “Ù®Ku]ŠXúdjLºã›ßäÆ{“Ô‘p,Þ@¸âJ?‚ÝŠÌ—éÈ|ÖѸ¬£èhlt”˜”S"톯_’²¤·Ú¤)†Ð\ÜÙ^—÷BŽ<²lŒ»å&¦ÛlŒß7èL1ÂÝÑëôo¯ñum޾‘ÍIêËI”°ÂÀ´{˜¤È æÇ½qt o棤@ÆFÃjƒŠÂ ¦UDU÷Ð^¨íóžMqp+Òâ° >ºÙgÿOÑ´ÄØû¸ÏníÛR ÜnÙp^Åe—¦.-O!Æ88èv Lv³"±špPÑX¢a»»1ˆ`S’ÃX02Æ0?öeò¤h¥"¡,„¢vdò™®á΃Ø/Üá±6 Ï¥‡;Áø­º´Ç÷Ws±L\’sÓ_ÎóÔ¢5‘\Þ7x+¿)rùãÜÀcÇ}3í,ÓkЊõçž pÈoH/Ò"å"0±‡³’pâ,`›H4u@Ápçö‹ì7‹ GlG=Ù3¦tÒêr GPDk¬!ŠG{1im Í™úls³_À@€Húæ†nÈ%ÄM„Ü97Â(€2¹6‹—wçh9#F˜]G›§­Í­³>-}þ$™Ð}êÍy3.0ÌþH¤ì©Ù‰Ù©Ü$Ϧe½h1'YÈáaã¿eÓTEô•T‚Ò6¶qÈÇnò"‰¡(xp~#?y;z¦,(&wM…M"Î º¿kX:™hèfO`&.ÖóâdUÔ'(/øo{‰A|Zž³³¢ÅÄþM'ì8Uþ ÀúfïGÉà0§`5`'\Á^0?œ÷UHš_FÒôV¸7µð*¿;dÅo¥œä®Wµ1t½s8œ8WŒXõÙCÇ_y aÆ<¿2'Á”Ý6?'-?¢© •iUœ$÷%%z«¿ãk¹¹H‰Ôu’6îlkyÂ}€4ÌnNâsWË6×.»‡Q:×¶»rjÄ•+¤÷¨wK5)¶[ÝÅÓÁ³Cߘ•Å´én±Ò—<ÌZعØ#ïÓ%Ï÷z`‰28‡×1Óf 1ªíƒ¸HÁ{ÿ9Üû¸‡Ë¡˸pR3 ?\Ùl2ß{ûžfSxa‰K¯ÝÈy&¶ fÙë½?ö~uWßñyÖ˜¡W™ÌÁ÷uÈt™Š$1T1²{Eª\$Ç¥r"iXÅO˜šÐ††y$´Á„!ÛÚw’1ü{ÏNÀ9î'¹EÅ“!’ÌÁ,ñ¾LT/|5”pðcŽsw=zZ¢Á4zôüàé|óu»ª\)ƒ1£§‹ùrVÎ˺-Vþ–ßhGùõS$Þðøêëß_?õÍÓÅlšôÅÜJØ÷³÷Ý¢ß4ãÎýQ[ÿ]5^öõ¢nªúälV¬"uõ.Ðã*bÆ¡lDSWLÅ(®Z¦*ƒÏœÁ±•]‡¯¹éiW‘’t­,§DYð¬`—,•×úþ@}…m &^ ¦ž¡3ea>Nh˜²:v¥7P"½A2òŠá²x/Ê0r˾ücX(Šëkë¼m½y45po6GŽÁˆ<ºØþW޲²wãÊ¿vÍ]ÕÜCSlSqiç-àxÒ(¬ÓÎ[RÑ%”-¡9t„éPl1°ðEëûº_oó¡Ñ,fg!D‚.DqmžÝREӜ͗]9Ÿè¼€^;NËÉç`øÑ§ùªº\µU±™.¥Ì˪];±‹kÜ¥uë^ÖålÖ±é{-&ã½¼„Ô­v !ëãÅjÞ‰RA‡ÿ=xõû«CßDa4eéÿ¼UïQ.XzÅââ ø]¤»ñëœkþM…pÙ¹Š”s†É É(pw‘13©˜ ? ñCžUu1xÈCü.¬p¨P(ð4ÖÅ'ßa6cºß.ZN»×[ÿœ>Ä`¾=­šÓoUsê;ŽÊv]–a¢Þ§dø×¥æ°±,VżlËUCºâˆ‹u >OÏð= l–þ×£GhÌ‹¡«=uüJ8 uø¨XÂ4úÖ­ïÁ¨Í=™NÝwQØnó@ª‚ßLM*ü{úìà ž}ä¢ÄvUTu üsMê;‰B1'hD5ë}Ö«ª-§kÏ4 H J…¸N3:¯ê„!e¾Ž"º÷²NÆdÂížÞÀãëÆ>¯’g=PFÇŒ¾®ì8–>8¢¶è•3šœˆÜ¸J7Ù}7¤%àÐðº«ò†[®ñú Žˆ| ž¼g2Æ<:=½%?dZÀ ‹| =ÊáŒ1„·`"™¯ÓÅf®”úk¹ ˜@ĵ ‘˜ãç£ç Üš'=£©Ñê X­…-n‰^úä£]r‰u¡ 4^> jûÙ%èvQ9ü–Ï*:¹qï-ü/N̺+$¬0s7øbÛ#dË¢ù¿êó3Wqãõ¿ø: †¶Vv'ST4ašÍ§£o0µöéò·£¿ýv˜þøõCðîëW»ýúõr)BÆs»âAI÷y©è.þÅ{ ì endstream endobj 23 0 obj << /Type /Page /Contents 24 0 R /Resources 22 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 22 0 obj << /Font << /F48 5 0 R /F41 13 0 R /F21 17 0 R /F15 11 0 R /F43 18 0 R /F42 14 0 R /F24 12 0 R /F27 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 27 0 obj << /Length 2393 /Filter /FlateDecode >> stream xÚÕZYsÛF~÷¯à#X6'sJåÁ»e×zËqTn’ª$ J¨M€¢œ_¿=Ž!‡’¨(‰ò Â`ÐhôôùuSÿš¾úê=§#‚‘Á†Œ¦‹¥q#FRJDM磟³íø×é¿zOùH!£°#4Ⱦ1!H2é©î<'C~Q)Fª…§"bH%‘€ ì)~Á§XqD9k‰î¾OˆTÙ>ÅŽD´ð#ã ¥4{ØF'& Õ}ü9:KðâHQ2bÈ㉦i}H,F“Ù}J¡OUÊCJþS‘R™FjÈ '%óË+•’ „"¼%ṳ́tÖ²Ó;©&tè$çƒcDNaàS¬f œaÜ}ê4Žlþ?–çø±<ÏOÕ<Ÿó—äÆ1+ëÆº%r:‚˜d#Š´ê$¦2õ… F\ÀábR‘öqféã ib¿:uÆ  xeäã³”Þ\ø¤íI™8pG8Ë}G¢L‚Œñ‰f÷œˆ!ÍÚ…êóÓxܰ®Ï²"%µ.K£a[Þà/–g~¯<ÂhxŸŒ>ŒÕçåÄMÚ)1= Ö,>JÑe4áÒ i3 5`ýà¢ÖÀ‘‘¬¹)k»¢Ù^Át]6eµNÊ"ÿшˆe×H÷‘·©‹uS·2^Äùõ6__~{µ[6åfY[ÿtVmë›j=/Ç$[_û'MuÀ¨ø¼ËûsÆÒ3"ëƒ$idP¤zLÝ#â™l 2™îƒh¦ ­\Öx¯ÈÜtaöOá(…‹=Td ÒQ½M©ˆiDÌC.®!¥w9ôC²J ¤ú/á$D£ÂÚKÅnûXÜbµs÷¶L\>àSXœ Þ¬ i÷dPÈKSùs´ð´þ\¨èÜ®“0B²$_4ÈæQAHP0ÖqH¼Mè¢2â1þŽõ)1b:àÏßüÕ:M5#ÖCjF,[²¡20TTª¸½FqÚP ‡hâ±Q~H}ø„2}Ö›H*Eš+!)ÑÅÕOIXKî;:ܺCœ“Xšt–¶0ƒß›¦(ÒtZ>P6¿ê‘âȘˆÙ1ïŠuS‚îþ2ß‚ÀÞØÛbÛì¶Wn*S§4Ÿ¡<˜_1*ýíb>&Y±-o·W…ÙÒmY퉰:¼°t ÷ºœžzönìè)¼f'J1çþ8ööØVÛ1`(4ž¦²ÿTûâ¶p;à6Œ +\"ãÔ•³¢Ù,¯í×ìr¶V¹õ$!³«°Q®› d¬&‚Õ,ño¥€ÙõÀb(«e¶iUôª°»-›Ü_êÈ|–ûz]´´'¶Ó¨áyB¦(îò•û0t}^½Œús¸|Ýø•S(<Ú …“Çß{Ál¦{íuµÜšáQi!_‡˜ëô Û0zVƒÒ†£{T‡¿N³ÑüpPªï\|^v^øDSÅØ°õ4Ð:nèµèº¥]íµP§ç¿Â¾÷×:Ù p M4{HzIâ·P…†ïÂO.wÝHa“hóì›Å}êºS‚2蕜T„i‹æŒ TÖÓ“ÓU‚”¤€ %£íˆÕåJ•û• Ñ©Kã I¾ªvnJMŒql7Á/o¾ífýsåtiÔ?²9ß?˜— ëÙ‹¢wpK°-¯oO©g¸CZªÓckŽxßqJÎ ”‘Ú6§ÜÙ8Ùá“1FΚ+ý±ÓçyéÉ£‡1v*Î`)EtÂwŸ‘EÌ݈öݰ÷©j oÇæ&o,~À’ù,ßÕa„Ï”xxàq.ožåKï!ùÜæOÂÀ/nÃ#û5îËÞ.rÏåï®xaÞø}ÿ°h³§-F J}ãé¬gÛÇPª¾øÕì¦È7þ¡ËѰU]5¹+­aÊtF¦Ky©ð´H4Ny'Ó#©£In]@}nÊ[ø+j[a1É~Ûâgc*ȵ 5€NØ|wñdqGÈvù®ýQ¨=:À­Áï%³<<ŸÛä¹*×aßc-Xä2ª;€\”jÕ]º`a±âÏHäÑ”l†r¿ñ £’£Ë›d­çš‹Û-¯9 È^Þÿ[†°óˆÕ³Öz~o­?U½Œ¯^ê(<ØQõ"öÂ¥9j˜ôé3à<·½ƒóεÑCà@n3mëï1ýÿêüº8Ï5¢˜ à9c-Þ`Ù¢Z.«}À!¬…Ý€õj¿±tPÝfÛò*ÜÝTûžÿªŠÿ©CKЇ·Ëï.§IÈö!¶,¯¶¹KpÀÚE´]´…\> endobj 25 0 obj << /Font << /F42 14 0 R /F24 12 0 R /F41 13 0 R /F15 11 0 R /F48 5 0 R /F43 18 0 R /F50 6 0 R /F21 17 0 R /F47 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 30 0 obj << /Length 1426 /Filter /FlateDecode >> stream xÚíZMsÛ6½çWð(O"X À™^:SÏ´é´ž©nM´%7œ±¥T–“ôßwIH)ƒ$øeûЋ‡‚—ØÅÛ`ßJ?.Þ¼¿:œ9îD²¸I ®Dd`d²X&Îî²õÙ_‹_Þ_(Q¶•– nî¾{‰aÎð‚æ:QLsí 7¢7æ¹áÇ„±‡aBc z«·¡üãà`X¢-Õ€ÜOm«© çûŒ·ûÄ5@ƒ˜Í¥ÆA&sá˜åß¹…­˜äòöyh2ɸ|\Ø.<(hœƒàh{ M¢™Òª=sÁPš¾˜¤dõölN>"[M2‰²›WèâÆòzž2³dõ‰sÞJÎ/‡„¾µ1à ¼dõ-ÓØYÐé\p`Z`•…qÞ!Ì3#+Þë·Yš 8VB¡÷ÏTWµÜ0aU$ª…Ohc^­d šÖN©hI뇳¹@œRÆ­Œ£ t™SÅ jªˆ‚"*ˆöú€(¯;í->„}™µ”ipÌ€ó¦ß²ÝgJ•³¯é6K¯nWÁSÝæ0–EØ’¿f씬æÆ6ÎùŽVäÄ,]/C!P¢Pu[Kð5ÌÒk%«Üaå—t›Þ­v«mLËœÓm§§ ‚9ÞÂãüÆÎÎæŠ»ÙÙúzåøùò÷ËEþ¨fË qª\ovþa™Ýï²õßÙýòo¶gÂÎ6wEA3¤³Çäç2%÷ÅÎbZ´fö†åÃ5Eêÿ¹úç!Ýe›õýaÒtçÿAG!|?ñÔÌ¥iO;9 ,ãJ²0”}ÁŒ½³›²Ÿ;Ôe‡»Ï“æœ)UMÁ‘m)©šSö©ÚOoý‡¯éíCø¨É/ùRñß º<ŽVª¸-GbZ =rƒqà ‡½¶Nט “ù@ys…®dœS%¤ ŒS6NI¨bÊ”uÄ`1¥z‹©gˆ ¬¦„·8US2­—S™F;šœjUS²]MéV5¥GRSØIM©‘ÔvRSê¹ÕÔ‘-§Ë9U=üê£Îöœ½:rö¤Hª•vqâ+\D4W‚ªÊ:ñ…c‰/Œ_8¢øÂ(ñ…}Å—©auLƒ®²àºtÌ)Û‡-ŒÅcC8VP\íRWèæë$my’Ý“e&œ”ØÏ… ôÅ„B2LV<Ä8M©åpÝ8¦­Õô² Ô8šþ<\zB¹ºwo9¡âŽl ÓÀ+~ë­.6ûzÜ›çÖïü@!]ò‡þáz³^f{Å“N½¸:W¤T¹ZS-Iá%j l¿ÕY9qœ÷Q'éõÅÝêq½§èè¡c#¯iäÔ× c*¡¨:Ö'¥‰²æRrTÕÚji¢j«ipfß,5ý™§úwçåkd^ƒG5Y£9š-0 [ôs±%¨FS]Ù2ÖNÅ„‘ÓK¥ T £ ãZW S·(KGºî dìõ6^ê&BÑÔ„ŠtM{‚bG¦5ß‹ãÖã­¦Û6ô—€ÀU°÷u0 ?¹¯ƒQ}¹¯ƒQ}±¯ƒqÕöãŠ«ß˜Ž¦ÑéKõÿû:/Þ×ɳßDàt9W&ð†ÓY24}8 :.k´Òþ½Ê ‚$O…°‡@L<;|ðRðA|Šqõ¤4h©;µ‹ZÄÞd¦`Í7wZ>ölº‚(§F^=ˆjåˆ ÊW¢n¨(8ÓFíý½_9¼÷g èM¶ÿò›¦5ýˆŸ6Èѧ¥jmœ eþªM cÂVˆ‰Ç8È\t’¢uìðV„òæ§Å›ÿ6[Ä endstream endobj 29 0 obj << /Type /Page /Contents 30 0 R /Resources 28 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 28 0 obj << /Font << /F15 11 0 R /F41 13 0 R /F21 17 0 R /F48 5 0 R /F42 14 0 R /F24 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 33 0 obj << /Length 2412 /Filter /FlateDecode >> stream xÚí[[oë¸~ϯ0ЭYrxh œ¢Ý=EóvÎypb%1êXiìÄÛþú^¤H6%[–’´›<$"erf8óÍ…õýÅÙoÿ"Ì„Qb©e“‹ë‰d„‚˜(«¥0¹˜O¾d³Õü| ’f›Û<4®Š‡‡sf²|}_¬æ‹ÕM¸ýC¾Ý«Ð^oòûÐZ¬Ï¿]üñ:#M¬“)gDø€7¡“)³$²Vå-E¤P‰{òûe¬Íšh_ ÁdLªñŽB 6°bõF Iú!_)È0 ˜ƒ—¦~"\qÄQ\7hí05Ärt…ça*ů̖,ïü$Ƥø ¨šp\\mØWJiJ2ƒeÉ‘y%N™æDãÄ)SDpYò™j&ãçxÛ²0v—/3–0ôжÿ‹"ëe‹¶½DMqCÄ'XÃŒsŸÜ­ºÇN‰íêÒ5FqO¯ÅGIø¾ÊÓƒ%¡ßÉ|¨êR‘Ü­’ô^•ızÝ<½PưŽD  “jÄBŒ‹¿>Ÿ@úÑ+ OÎö3ŸÞË|£ §›Â¥¤òÍ#‹­®g˜”84Ÿ·®Pô^aòÞžúk¥c‘µtØŒšcT?¥DYqXÿS‹¯¯N8?8Y1>dáHTxÈòVÈò# +^ÌŸŽ±æ+ÀL¿ ÌäaƒNÝó9©"Ìø80³=tÆ»a ˜Á0³ýaÖ7 §AÇìÒ`T¤Ù¾HãÉ·OJ M µ Øxó0ŽâàµG©’ás*¨ÛÚÈ£²íÈÄ5eŒàë0r¡q°üé#Uúá€2X1î¤_5°b|  H¿b|É dðš’ñ˼û„T¡–=Ñ’;ÎyìŽsÇóƳû†ÕÑa:J1övÝ{`R“* ,i *} @ï(8Ìchõ¸c‘#ˆÚ(áuÉ|7Kêszçéýxz€×ÓCsÛ|Š µ­§N.ùÄá ‡‹õ¢g¬­Vx4å’0¦ZÏŒ´ß‡tõ†ÛÒWÕe]ñÐÕîƒj‘I¹s,̯ãã•È»·ûJ¤yIƵW"_©D·ÂÿñТ@Ühm±˲tÜÞæáLúÎYõ‡ÅÍí&4o«“ìëÅ<¯N§ûëÃì"ôf›*ëbù¸Y+D–Ô½’±RBt Ì1ÕR°ó)CÉþø÷Ï ó?­6ùÃõì*O-çƒÀX¦Zch1ÈÛÉæZëüÊñmî®6Û.–Ëøóm± ­ª±)Âõq]2ÔSÌ]YTûõ§Ï?~¾HIæ6àP¹óæ6èèñæ¶1°P×ZT õÝ/æ9Ÿ*.³‹j9嵚} wǯ æÁÌ€aBhÞ °wùæ¶@+rK³ëâ!4×þ× KÑ"ûMè_æW3§߉*ÅÖl¹,¶ërvüµˆ×Ù¿âøÙüi¶ÚÌnb·¸.Éø,Ëš]mÂ= ˆð°Ž3×@Ëe»ð‹›#ÎÊ@W[Þ^<Í6‹§ÜãQFOTY•]þ'ü1©²»bž/ãÇ2[ÎV7(*ª›ƒBuÇQ•`an¯üjÝ­yú‹ÈxûÛ‡Å&op¬„º\æwqÒjG&„ÄúJé¢{E§sÈß‹,Vå§%¥g.ëMõi óŽwö狳Ÿ¹÷òèî½Á™3 wWwg_¾ÑÉCö„c©·õ#ïðnôd9ùçÙ?š”§ ‰Fwè æÓ= ñ{™#(Hjý©¡ …§‡‰¡0~¸ç_ƒtá´ Ö}TÁº)D˶IÑŸÆ÷îK$Tk%®DQÁ2†øw.ݺï.ëFo“ _Ü¥ªï¾k…hhÔ°E QŠ¡°.’uß›†×}3? ª¥²H Ók™¬å¾.áÙŸœºyÐ:Ï®ÝEd‹Ð[U¿Á{‚e³pq¶PöîB/½M£G®Û­%°\e­Õ›F ¢ K”¯Zèr+;Åé–iýJÊö]Kze¢J¯¸~ë€ìþca#f0•u—£Ìf bzÓèPî‰xYÈŒ¤ 8R w:b *Јb0«‰dÃ,ÒŸF‡c©'{öa+²‡ÉàhÁyñrnÆÞ*\fáæÒ)ßzƒòp“‡éϽ»ÐËCoÓèáHƒ¡ãɳ~‚Kï¡÷.y¸´;=3Ì8H¯½i¤ó’Æ4ÎŒûB6Vün-Òo=˜lIE ‰ä¬ËÕ«E-a™^Nùg²:fö>^¬ˆKT7ÈWA]%†©²/‰M*K¤f#hÆÖ$;¨IaШ@£ƒ» ñ0)ú’h9Œ+â-õ.Põ>Jؘ*Œ2Vû‘Ï7/Ãe.y²=ÜöYÙÖÙ˜ûyxqሉ w­îSÕK–ÂÿôÿW8sßF:Zû°†5ÌÊÿÇŒõ¡˜ì.®Ô‘.{ÌÇ6w%³Í\H…â8õrB,[iW¤sß4ð˜êM#Ó­… J@ÅH÷äTá–i\NO{'Æúç×FSÅÚ¾-ô¯ÿâÀ?¤œõÁt9"í®œP^q£Nû! …‹àú‡ê “g5íãÆEX²ö¸`‘Æ ö$Ða=ÊQ¢ƃwg<ƒ“æ½I´Ðhœ'ÿb HƒiÍ€˜=•x2Å BÔŽ©8Ûþ ã$0Q endstream endobj 32 0 obj << /Type /Page /Contents 33 0 R /Resources 31 0 R /MediaBox [0 0 612 792] /Parent 7 0 R >> endobj 31 0 obj << /Font << /F48 5 0 R /F43 18 0 R /F15 11 0 R /F41 13 0 R /F21 17 0 R /F42 14 0 R /F27 21 0 R /F24 12 0 R /F50 6 0 R /F47 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 36 0 obj << /Length 2948 /Filter /FlateDecode >> stream xÚÕZÝoã¸ß¿Â@VA7,¿?ZÜÃõã€;\{[\€>ÜPŦ7ºÚRÎ’“MÿúÎp(Ùrä$>û¥X¬F¤Èrø›Žóë;1ãðOÌ´c^Ù™ œigóõ»Ÿ~æ³|ûnÆ™ ~ö˜F®q´eZ™Ùjö㻾ûu`a¬fÂê³xôËpšñpÞ*Neñç›wøF»™à,ð f7Ë™ÌØ¬ãz³ŸŠß]]{-‹æêZYÜù…H$2G"ŠŽZ‘‡aHЮXBËèb‹Ä5‘9uvÔªˆ4ÔY_ý|óÝ»¿ÝLèÊ8f9OY'óHÚ2üP[Rͬ•ÌxKÚZ_]k‹['ìR›ü¾ßÿßÔqƒp~Ÿ¥…5x\lb†ªð"éÜó¤sh-‰ü‘ŽåËÕµ…À>]|’‚Û”…¼ºv"¿‡¯&äAò-ƒÔÄ \ñ§ãÇ¡“ò¼Óøí,úEHÍœ?'óxÁ‚d`NØIÐîT:T§“ @«¥VG­ µJjU£‘µÚãÁ=SgªàTSV!™ôÀJ( ¤Ü¤0Éø…Mp†Ö/ÔŠDæÔ ›ôIÜ+× ªc{5A° ÎÛì9<úe8ÃÀ€ÏZÅ©,tþ@åà4ŒçLg§@²:ù à+¤U¼°ÙåÈÑdxÕƒËùĹštLÌ›aÐàtÐo û°ªPS¼•gÁúßÀ[ŽxË‹òž\©€xàô7>ÅMÀYYÙÂЖ° OPFðÅ=M„Ì ×Oúj’¯b¼FÂÑ_˜\®1Ÿõ™è?™ÇqàYÅ‚3#äÉyÞÊ‘¦dzÞOBQ0õÕ#ÝÓÕ!…7~ÀЄXªêµs–ž ÐÍÅ`£YÃ’Å$H$æ¢Ñ’Ù3SÊsxôË–AØ:o'ó8˜ X£àfÌΫ⯥R$‚ù•Ò)øB«¾n)Z箊‘"qá^{ á.å¹ð\À“óâkðÂAxÞÃÓ ©\Êxö!éˆTDò·šÈ÷.¤ošÕ¸(™&@zxG¤"#ƒ¢œrê’rê–HD±ºx¼º†˜ ë®Ñr”Oà+aYï É FÛ€ŒàY§g‡OÚOÛâi[·%9Í·î…„ÅpH’Ô™=™Ç Ø;µn—³‰Î¶º!‰$$eakEäaOg¢ÓÉIêœÍ)·žS«¢Ö‚Z‘Z5µ:j•DVÔ¹¢Ö¬Ì›´$P2΃ÓYS«¡Ö\‹rÈE*‹¤Jlj­ŠÈr¯•îc{ßò<ËÁ<$`#ÙIw=×wÞY‰DZÂŽÂü1Sü<q:éÌ•ÃPÏ@Ã,$s%KÉ1“ûëôÞN¹k`æÔàÑQ 2¤ó‘¤ I‘¤'™0æ Á‚’fÔêžë€—–­Õ‹ €|Üaä;Í…©ŒÐ’èHñ)MòCÄGí ñ²ç™öé<¦ïèÁ€z¼`~8QoQ£ž|[Â;<©¿ž:K ñgÈúð,]ÕéEÐ5NP`d°‚,F$Óv ½±5\þ_9Â×uv~²¹pæÑÌã¸WÖÚ§ìi±Cñ#Fe2'EXù¤n•<°7ä¹!"mˆ4DÒÕ“&HN˜ÆÐuôD¤ƒ%œy"'ó˜öL¾kÈuÐ;Ãä²wù+ ƒçŸB1gÜ w¡p(aåî•r&¸[ï¦ d3õ2šÏŸ«M0.õ[8`äFMñ#î¼e §w¢.&ܪäðŽZád‘ü—f1äÅ÷UÛUõgj¸0)ȾþûÇï©g> \6zù¸¹¾hnWqg©]g€™v~ g ·2õ¯+*ÃJç‹yYÓKÝ<ÒË=1›Ç¸ÀÈ?ú°nÕò‰Þ»»<¿¼mzV´0üšg”‹žE?¼ªaÑ벫š^,ˆ!A»iÛ¶‡ëÈü5ìÊ«¯í·øx3…keh7cÄ󛤫´òª%ÝhëÀ‹;P[þ1 6i]ô†«B:Oz‰e—G¤=á˲Y­šÇtbØl·KW?ù%¶ ^;]ÜÜÅ6¬V+z»Í=°ßCYÍz½­«ùsau³®ê23(ë<ï>nºíæØàÎøxKåjÁ9( ééÊü ã¾Ü”ëØÅMû: ;'ž0¤\µ i›u¤¾¼vì‹›‡Ì¢lé#^ÏËÏYPÚ tVõ¢ßÆÐ« ::byWÍï2#ÒðÁ ËMW¡2çl{{¹˜:oê¶Û”Uݵþî®ìèí1ö±hŒ 6u׎²&‘Sý6Öw§˜öf7 f”:1¯˃<ÆŸX)•²íPKÏÓ9Žñ[\D,díÌq5–;]ŸH¯½ Ý ÉÀYÈ¢ÊG =t¢àNêí:nòA§'÷ð•ǧÃÙÇ’$;À±=ŠÁhŒwÅ·]žSþ'fÁ;,ËbIŽjM-‘7dÜè„Â*ÖŸ»»OÜô{#¯±Á¨]R7•Âö ŒF|ÈÈB›!èe¬õëÄ÷uùD/u“qy›G:ïѧàžÑÏÿ£éâ!Œ®Mš°ˆÙí£1•Ze n <*Ï$ô¯Ñ • Àkõ0†I£/bÀ /Xo2€ ˆ `_®x³(Qô´­ÖÕ üUjæ…y¸#¨¡Ê;­R Z—â2›“ îõ›” À`ÂØËÈ5€ HÇGrùó1CiÃÅí¶ËšÍ4å!©#Gެqò(ð²gØLIÐhÀÈå@»ìPX¸Î)’‡ÔÈ»qPÉÑôZAƬŠamKõH€Þý0Ÿ{îší*Ϲ+StìSŸô¹\Ç=†™MÙNaGâ/QV¿ $sRΤòÌ‹pÖ!* !˜ÄËö)éðh˜µî"rµ„üTÅÅŽÙËéð0R|À”.LJÕîÅh‰|}| àp!ý qß"xvïœTÿûâ+ÞûR{ç=›Ô8!bS‘ §¥¾9d€O¦@,]Ι°'Ýs€Ž²|Bè€/:à=Eùý»dŸšƒ»Ãîúh8áîJ¤Ü“AÌ0õ^°G+ù.Âí¦*ᢙ¡;í¾Ǻ¹|%öq°P¬—é÷—³B\¤—À Ü&%ôÁX9s¹Ê0‹(Ø—+^ }Ó–,–cü)¦l<“V\Ä–·’„Vu5QX:U.!ËÉ:Œ…Ò5nò:o˜ÓþÀ°<]F¤Wég hÒõ“ºrvY}ˆÔ¿»50Û»m¢ó¼ˆì3û0$;Ü9ú•=NþÌS5þùïÁ#NB0áäAh‘pРr¾Y®Ñ­¹Q˜f”t2-@y»Q_aÊã§cª„µñ¡PRÕ¤‰q1Éã½ÞpÁ1ša1ƒÃ½l™chPéF1tð# ï]H5Œî%7~Ô8½Jßš\Û"‚«ªsrü2”ÌzuœÇ¶-7O´tJö©àÝF×ýê9&f2àÚS•Fúƒ*}ÎI|½±¦>X:f²ÚSåzÖÛ¶£Q±FO9UÊ’XÊææõR–æLîŽèöiJB”‚ Ÿá «ÝýÜ´ÙNýù¤vL* èóà OMäŠsO]0+ÆÎëîäþß4¦ lêßS»øCË`>O±=ò‡AÖó«Úæ›4i¨ìrÉý­ 6!FÁ…ú>&á £ðR® ¶ÖeW=ÄÕu¥(ªzÜ*N¶£úô;îƒÿÔD­bŠÏ¶öŒ‹ å¡(ªa7(m;”­ÔPP¹ìtñ>/—*µ±mVyì2Å~òD©lÑôq{È4ãªÂ‚â®è{“‚µaqHV­ºýÐÙˆ.ª6Á¦w¹žqs·í¼±Œ‰‹ÃŠv.ÍJü“Aà~™÷ùg:×øIo\ endstream endobj 35 0 obj << /Type /Page /Contents 36 0 R /Resources 34 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 34 0 obj << /Font << /F47 4 0 R /F50 6 0 R /F48 5 0 R /F42 14 0 R /F41 13 0 R /F21 17 0 R /F15 11 0 R >> /ProcSet [ /PDF /Text ] >> endobj 40 0 obj << /Length 2177 /Filter /FlateDecode >> stream xÚåZÝoÜÆ×_q@_(4ÚìÌÎìGŠhÑHú¨OIdëÜ8äÆ>;NÿúÎîw¤´ä‰^¢Z¾Ñðx?ÎÎ÷ìò§ ØYù; &:¿óÉkq÷òþâÛïíîV¾ûzgKq÷s¹ó^þ;ãbØÝí¾¹øÛÅOc_’´ ?·OŒEzÛd»„·&…&!<ðÔ¨ˆ¢Ê û°ŒÞãy)Vcüáúâó/Y.Š"l‚Ýõ«£aŠd(…ÝõíîÛîíå¸Ô핼›p‡ËﯿþüKŠc —Œ÷^V~þ›|ËÅŸ®+‹ö΀ƒ¶E7` b7bÁ61VcÝS˜èÄ~iç…zì•ÿ«Ë«ˆÜ}#êܽWòjD|÷Z¹JöJÄL‰‚Þâº7™`¶d ¶˜0År§%åb*`”ô܇ ×÷‹€!‘DÀ*¹ÍÄw7Ê”ÛÏ{€³}£¬Æ¨»=Q½cI¨ª/žîÊM ÷J¹×Ê}¬¹¿¸Ú0¸Fñ/B”¼{ªÀ ‘E—`9a8%4u¤‰àÐxO—ãS±‰› W±¨Ö$ÝDž`õ<•Çê£?SNÍÑ8Gƒ ¿º ÝŸkš66Â3 8±1ÂWc,¸™¬/pø¯º™ˆØoãf—ó)n¶…<ƒ›åÿœ›q çB嬛­ÇXp3‹Æa{6ËÜŒµt°ºǺ›y“¼+"0¶f38bM–ÃZ‹XÝìÄUÝÌŸ{½-äñQ°ÂTž*ÁJp§ÜûYyÐ’Ôú¸‰àï&`uÿYê',…y¥Bæê?üä î~[-‘Ѥ8ëöèB ä.šÚT¹bA“.˜a[½I‘¸µ"á¬"e‰Þ6:eÆ †•ÔÙvN²b!ãX6£|#ÿGí±÷µÆûáø(~ØT¿Q’3L Ã{ñ…’»Ñ~}vï?ÀîçlaíŒA;Q î1¦|÷¢¸Ê›òù¾|>·¹- NÐN槇òy›ûš’ÊÍ™dN§Ã‰ƒ’ØòÅ»|ÊJ>EÍoÎ9±?(² iÎE)Ÿ®-6×cÔËyJ(XÑxÏÇýœX–s9¯Ç¦$ú!|>^^y ÒáQœa:Fäïj!+ú€ãNn=Xó^Àñi6kfè•æÌ®Oy;>ÆÎd«…2VK¿ËêdóYÁùPV×dÃÕ 6 (3ƒ ñÿÏ„,]“o ÃÕ &d6!µ„¡ûŸ±¡UÚ³6tÒ¡ac6` b€´7©Ñ•VcÌ—g‡Ò !ŸNÒeZÿ}.`eêFè«hU+“üˆ{9án”Ë/i±Ôé¨;?Q‹ðéâ åî”Û+ÉÇò–JmIJ›v_ÉÅî¯ù#O+Vÿ¼Îå9>:×+¤\LRæ:¸ü ƒKÞ”ˆ~au>qÂYQ*7úØjŒ…³ ‘N™EB'o&Ô¦»•ì•äíã¤!'Ük%Ž· ¯ê°¾OìG«\~Çj-Ö ÖÓÎû³FsR¡mŸl=FÝ_YÚ1$kõ¡*IˆÊKKò)«Ô}ù{|ý_åú¾æÍ^d8m‘gUDÐ\k‹Î…{¥ä 5ËКË5꾓Tž=³çd~-ßÊø=4ϸÉUnŠ2—-Ä$‘Ùµ™£cÃbyÕ¢IŒÕ 1dE®Fï¹Ñ䘅&Ç,49féû#¡ãý±ä|ƒ(ÉÚL±£¾!„’?$)":º¾ä¾ø´p?*·WòR/ò€¯¯ÕH7ñf~¹ù˜Æ óŒA vÆS£ÖWcTŽöDëʹ6wz»Õ“¾&D%g8Ûù>óàdc Œ³íC×^äÀ’p·t™ÏChÌH ƒ–ŒsmÛÙë1æK2Ød¤[ßz`ŽÛöÓà ,† Gu¬‡s^· ¾kš†%6qô¼À07®Ï¹Z ¢el2ñjˆÙ<”äÓM+Ÿ[HCÕh”$ÁÄËÑH’8ñyýÒOI±¿»’tëcÿþbôùo8!0 endstream endobj 39 0 obj << /Type /Page /Contents 40 0 R /Resources 38 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 38 0 obj << /Font << /F50 6 0 R /F48 5 0 R /F47 4 0 R /F41 13 0 R /F42 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 43 0 obj << /Length 2367 /Filter /FlateDecode >> stream xÚíZKoäÈ ¾ûW4Cd`]SÅzOÃä±@`‚ø¶»-hw϶dOæß/YŸÔnÙýˆ¬ÞÁ  ˆf©D±HÖGR]¿ž™™æ?3sQ%f!kå)Ì®ïÏ~úEÏnøÞ3­lN³Ïeæ½ÌÊY?[Ìþ}ö¯³_7"|pÊ÷ ¹<{ó½K3£UÖÙÌ.ogžT2,Ê+çÃìòföSµ>¿`ñ•y{~‘R¬jæÈU-ÿrùÛhbuœçw)Æ”áÛŒS¤©ŸÂ2s‘|%¾¦ê¿,ºêOòìÙß/·ÝÛ-:¥ó4³½^D¯„*x?M‹Ñ2à¼8°¸Q>äY¤|ê¼÷‡ó‹˜lõ7v”µÅmLn…¸jn¹¹—u¨梭V G„#"¹T]±h/Oóõ†¯ZWïÎ/8îË•G^ÄdŠ8eLH 2éî-Añy.÷ˆd0k*$]ÝÌAxfæU\Ës^´1Þõ™ÔòZW}>¿°Z˜²è´¼¯,—X­?2É^Ä'~ ÏYñuY®­\±,]–¥Ë²Œ,‹4ž¢óÞuFM ±"D† Êx³‰Œdrq ¯t Rƒ” (¶nò¸™’..qű™`}3ñE‚K˜›ƒ»Wƒ[‚kÁ],0¸÷E0Æ•ØÆò;çÜ Ü#ˆèb£H!ä²Å›ÂÍAn·8/šmÝëž“×j‹(Ï%®…¬Ad9öƒ@ 5Hƒ)jS1MDˆÑ2J<ÃdRšQ&PVÑt!,»!\àÿ1¾,ÿ7»Ð›…E»x1åâ‚!C°•Ka|²píKr`ðÂsQ:›ƒ°Š¢åÿö¦7“’r& ÐàÕ]J“ø$_`ˆóÐÔ£“²]:VÄ.•=ÇðÚÓÆ¡)”Ü d+áÎWŒ/w¹Rpa“‡Å¦ ¼10 s È ƒ p µv•èÕLæ³9æÁ£6›"£W#ru“¦i1VÄ~LöIsH>A2Ù˜OÙV’u¤²k"’5î%§K®—2’— kpË•l'\½L)ovâP(œ+YÕù"q#SïAXÇ™‚ÁŽ Óàñ ·×í›’áSí¨L](Jš•<2ßJ.0²AæèUBvpØ’¬àGp5È~´õ>+í&†Ùh<¬ÊÑ?Õc\Ÿü£¤œâ¹@(ZR_Õàdë$»Š¾ƒ]W@§%°jNòe—»jr¶–‘ª#GA(µL1¨‡}§•QxQÜe*2 2¡ p´-á{Ñ£nˆÕ>Bæì¦È’IÔÛë>G*L,êÇËØ,£·,+r#ï-àšb±ŒdõJ)0ç­žF¢»E¬p ¤éJ®e?ø2ZR¼ç‹"Ñæi ÐFV‹j:^mq¢ÜKuBVžívu¸ù nhc½«™4^é{«¾•ô{zʤ²5ýLƒh;“Ø_¬Å´h› £WCçcÆ<®Æh0‹[óŸ «K@èÈRˆ/sG¨µ©Ì$*„p ˆ€?š¶ Ôu©´…–[Š7覮áÝ;+% àJÅ¡w ^0_ ¦\¶Êêi3^Æ~˜r9)îp¾œMœu'Á©Áª^ T'ѧª>æ«"•‹AqšŸpdôj}ÌšÇÕ-c?R¹à• nëkWªÞË-D¬EAl(6WƒÁƒ™7òí)–¶Æ"À, T¾÷N‡[þòeD à%4Ïò=­<€ïOÜ=¸\;àÖøÖõÆbª~Ö^J?ï·÷€¦dʾå™üèÜr\æ‰a4ZÆÜr¼ (Á-3€-nƒ½aÀ)¤Æ½e?¸¶ C&s<µ¼bTÍq¸¨æIIßÁ–î¹°•”ö'Ò'Z¥Ã3}Š,À=ìÕ‡¸¬ÐÚŸDâ²B?Ôg7Œ:•S£N>ÌjÄ€®<¾NUâÂ3LD³ 2z5ŒaÛNû&1^ÆPåyÚçÉ-k¦çEí-ÒEZi›²l»Hëê¸p¼H³™Óv¶“ì:^Æ~°³9«@§i&iR‘&š$²')Ò«ze‘v}º"m ÏIÛI:V¤ÙÈõ¡Ÿ¶‘§ÈèÕæ˜5«1ZÆ~<±!pü»ÿ÷“´?r×±ib䌖qª]?9Ðç•ýä)ôéûÉ>'í'~–£ÈÅæÄŸ“§ÈèÕl,3í¤Ñxûa”8ꌳO¿k£2å—bÂ"áæànÜõ€»'?w‡‹új®ÿ=¼×n¨ wn>˜Ù‚Ûd‹ת1N³ähûØ¢Q§1€fÍ&Ò‹)LeAHRƒ,ûÁ—ÐÁ²tE…¬ãD(ãínÝp9ó·ë ÷*h{E‚VÑ™¡"×xõê™E:} Yï‚—¸Ó ¿¬X^–›¸ŸGË8…ÖÃNŠB7- Yé4Q¸½œÑQx Eú(ÜVäÛ‹Bcí·ãQ8AF§†Éñ˜Áª1^Æä¦I9½•ÜLD3‰v?DœjBåσ5Í—3ŽºlÂáZ&Ò1tÝÇÒrÔxŸGLâJÇNóÈx»q[–åUîO 48•ÛÑ]àÄîæ¨î®s‡Zé¸ Çýqh¢?¬°U–ûä:Éùñ–>û…ÕØXäþ rCºá2x·ç8MÞy#M± {¼V†'˜`Tè«æ¿®njéuõã¼içË`è-¾¥½ûçû1r½™x»Z㟦^6óvþ8o¿`àáÓÍUÛÍZÝ‚¾_Ÿnt?,ê{ 0.ˆÃgŒAŠ(Î.œ)骨óî¶­»~í]€W‹«õ¼½»ÇøÝUƒñëÕý§EÝÖ7݇ëëºin‹/ç† Çïd<õr¨úT¯Û‡õÌçÚqµxhç«e÷±±Ú´«¢p/u¾|¦Ííj±X}†¡x¼¨,‡wNæ»èvvÆÃ­ûYkúOݼ-‰·q0\|§nbî÷Àoáà endstream endobj 42 0 obj << /Type /Page /Contents 43 0 R /Resources 41 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 41 0 obj << /Font << /F48 5 0 R /F50 6 0 R /F47 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 46 0 obj << /Length 3344 /Filter /FlateDecode >> stream xÚí\Mã6½÷¯0°fÈ*~boYì‚>ìbgNÙœéÎŽ·íívg’ùõ[¥¢ÜR›’¬ˆ{ ‚†¦$W=«‹%º¿ûpóí{§WF«¤“Y}øyåŒÒ`W>y¥5¬>ܯ~X??ìŸßýøáû›¿¸ùïYiúgV•®y´Y}z¼ùáG½º§{߯´ÂW_š'W¨ }Ú­þuóÏ›ï.•¯‚‹o”v—:“QÉÙ*:“SáÎÓæôp©Õ˜¨bJUÔeôõÖùí{{O6IVóȇÏÛçw·„xýù°»ÏOŸøƒ_¿ï ù½\ýeó´Ýü´{Èmrûåa·“§7ý¯‡þ×?öϧ§Ív’§_v§íq·}xjÅï^ZÙŸ·Œ}uë¬ ä ·Æ+‹N0_D¨Óëí^ZQIا¶§í/ÛÓorA0(±Dßf·Ȭ@­Sö:§$8èm§$QÆ»+œ²‚ÎÖ){:'œ²‚Ú³Svõš‚Nˆ ¢©£rÙlg_ :1(ﱎNKŸÑ÷uÞƒ ob½öåçw&®ÿM‘û«\i£ñìÁÙáw‡/MÀÐÇŸ/û|õ5–žËžn4(­«›k\æ$‘}j¸:‰ dâiW¯ ³uõžÎ W¯ öìê]½c®^Cgëê]c®^Cgëê]‹®Ž*Y³Ä×_ŽÇ+|}u½J&oGKöí÷þfðë‡_7ǯÁÑZ%?^v÷òqs<¾3ë‡}îÊBB~>ì(Ö¶ûÿÈ7?îóÓAÚ»íóé|äZ³QKÊiˆ÷ zºÛ~åø$«]úépúüFãþð¸ÝovrŸÂä%/´ô±Å{Kài{Ø#öØdÓåu¸så¼(ö¬*묺tT$=Α·`óM~‚1d/éIð,ÁkÁû__HÈiâœNÄX’A_Na ÏDnÚ¢±¦5”ÛÁ¸„<³ƒ(fËh׆7 ¸ó‰dye0ç:Éq =ÒVÚÇ6l)JñÝmŠW|sþSÎR9ƒá ”1û°ÌáfËq8HʧÐ:Ümˆiýw·ÓúIš-7q½—ñc´¡éé´>p×Òl¥É÷6Ò#Ò‹!¬‰óŒ—/PCM â“ÞIšmï‘=+²,…èvßüÏÿ7ÓÃÅFý¿oþ§ÛÑëLHlº¸“ÞIz[é{÷¶Ò{Þ“ôž‡gPÓ:†f٠Ζ12ƒ´’ƒÿ“2þ°”a)ýŽÉ/r¸ù2 É¥£šœÖ&O w¦Œ{ŽrÐ7M”Sï(½ô6Òû­”…’È`°õÍ_™c,ååÔàúŽçÐ^„ÒE<_L›~¥# !Aslsa´³XÿuØæ6b~YÏ—1bóÈ_„Z6÷)ölbsX+i¶b×£ôÒäÞ©°ƒq^yJå¥Ks+eoö%Þ5¦þˆ¿ŠêÕ6‰&ÖQQ9J¾zªóà_ÚÁ7Mã…®µ\ÚJ¶Ã’íÀ‡f—[chj)œ®´$­t‚:ª“UQûÙ¶Ã+mWô; ©ÙÕ×ÒäGÚ(\i;«ÉM½¯¢Új¯t¼Êtƒ|åíÌ®³e”bH[ÚÓ`<Òþ//L¾VFa…j¬L¹•)·2ÉV¦üµW¢ 5¹8ƒv~!ÕehÀ=¬_Eu‰j"¹8@Õ‘Ònkûªóà_zÖâp ²~¡GÐÂ8º1!ä ]Kœhñœs¯Ä8D™!Æ*ãŠÂ¥ IuÁ„¨ù«¾ŠjÔŽ"Ï]šec!ÖJÚ-ó¦¢w:lÈha€Ÿ2Ç4ŒÙ2F² 4DH¾V¶µëf‹)À2xâReÍ›g¸+'¡ŽjŠ"˾êAˆ¶5 šÎL›,åñq™=¿ˆPniÎêl#ñ” ?^Ü·o‹ûþôaÐ_ŒQfY2[ÄÈDÑsÚšYïѼ,¿ …V€&lABdM©jË=^šÇ{´!ríÃ2_Ÿ/cØ„’òÚýéë…©â§]6SsE /5\ô1¡ÖJc|ï]DpÍJC 'œ´b´‹Uà€I*RN×…cJñJСŽJ$ ô Pø) X­|9çE!hÛÓøQ¬›«Ù=¡ãžBìÞN»'§ý®ÒtpÞïßLG×=±˜HXË^ýÖËê÷{'†Øüð¬ >âì”w"müÐÚ:*içÇ_˜pO«­‚«¨ä˜4‡eÿZÁ ÿü×/[ÁæËH— ×Üø@Nr=¾Çe|¯2ÉÖáû.ºë ¿‚–ð f3~Љ8PIg¢ý$ÄI'åÃÑ1™*:­1”¿…/\ÍÔ,<é1_ÆÐ^†3^¤ÖÙõã2ê'‰\ªBý]t×S -õ̦þ xÎÔßÅ3Fý5tfê画þ*3õwUN•Á©pžªÙ2‚ uþËV&u^Sæ—ö¾wö)¢ñלmHÍÑ8c¨5qñ{J`Ïî‚ìžmðCo*1b¼sò©ˆ ›iÓ;éP¬Ói_Õø/Wõð«ä঎ ¸ªæÒƒ‹8 LÄБù±«óîõ‡ÍïUb[›éuËY±}dß^, bs>ºdDTÞÙKW!Ãõ,ä¥(TBÀKQtEÝ‚VîÅb~•tóÇØªàá×nÒW­F•RøàW!¦‰µq_µ”XkWg˜–ÿ Ÿ7¾š,Ž (´- DdÑL~Äl箣#×K¯çÖÁ]üÍ¥æžS‡õ§^2¶ï¤Š¦ÍˆžziÒ¶÷$ÿˆÇUý[N—›?CwKÙr ÃI èÖuþI‡É endstream endobj 45 0 obj << /Type /Page /Contents 46 0 R /Resources 44 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 44 0 obj << /Font << /F50 6 0 R /F48 5 0 R /F47 4 0 R /F42 14 0 R >> /ProcSet [ /PDF /Text ] >> endobj 49 0 obj << /Length 3063 /Filter /FlateDecode >> stream xÚíkoÛÈñ{~…>ô Dë}?rH÷š ¹Ëµic´’| $ÊfO&}"mÇýõ}"©•LÙr{i‹!wµœ÷ÌŽyA&þ‘ WH39‘#Aåd~õâÓZDh÷A﨑Ò?V ”FŠ ÍQq jÿH{£l 5ô8øP Ì—|£^žL¤ ÷裸GA@%VÇÁ`hÁäj} % JüIÜc‚#¦Ž„0HR¾ƒ{[[7†Gq„ÍÓìΡ bª€b’,ƒ0ˆs×T°§™ €Héq,E¹ñ–â4†"‚ÀÁ†âéè´v¢‹NÇNæX§XÂíƒ:ÖÁ¨ò£Ì ?ŠÙ m–æ(¨‚2`«CÊ¥G j&à+}ŒýÅàüDtÿÚïŸöFQ#A‘"ê(èÐzE·8g¸J¾Ûc#0R˜í×p†Ö¡2@0øÜí÷xÛÊÀÀ!lÈ^ †„ÕÓÐhÝ´ˆ©³H£$X)ƒ¥þ¾\€bP“÷yUçÅ…°W'SFpröÓ‡÷~fÞ.¬Kÿ¼^çEí_o®i-ü *W7u^Èrv0ƒ°É”Äx`þYá×f_Ó«ëUœÛ׫¬¨Sû¹Ÿ+—aÓ˰(•·ÍúªAä„褼Í y1øj‘»5Ù¼.×÷¯|¸(L—:S~UÓÉ”Z«ÐüÍ»úp~ú®OçeQ¯óÙiå'êÕéuºN¯2øiQ"àŸ›"´€—¨E} ™Ôs °82ËahqˆE¿ÔFmô‹Â‰%ðü<ž=1ãૌpá°—[jÝÆ8ùK¶¸™7ôüCVUyZÄ6ÂŽbdsÃX*-/Ëu:áì>0 €†)ÇYxzÁK•U^ç·y}ï'æéj~³j„Á­Â³X–ë«Îž¹« ƒhÙ®ÚÄ·~Ÿ^¬ÓâÂYA{¢7¸-oй߉1ž\gkÐ’ÌžËí>îi!Ù—*1Yø÷Ò¡µÈÖ~hÈOÀY° |“€Àö¬~”'@Xúçg,0ÿˆÞ…ÅéEš-ð*o·ê ãi:Ì$4©î«:»zØKzY”B‚ðFŽ~²Âa’~%=‰ã¹Yø:‹0¤i ë~ L(°’Ø­€ÐE @)ˆN›`Œáä2&yƤ³‚fX’:úñ@1ë<S6D‘"¹M×y:Õõó`ÅJÿ¶ôr”ùQ€#’YyS8ÓbgÛÃn9ÊP”r ÔB)Ñ÷k8®êW:' AV£|Ÿ1f1ÚÂ+Vu³ôõÉ”k“|ŠZB’²µ3ß·óy# Q? š ùu5,øYì 2µô/1ÎO¶Q%í‹óÝeæùå˜Wò8fôÎö0@0ýÎ!~å)E\¶G•2ª–ßîIE˜‚5;÷(@f!©êàþÚ‹=Žñd"6NfÊÁWœUÕÍ•$ŒJ*ëkÿ>/[¿öF&­iûø½µm/ý„7ÊF&ïÞž=Ç`'œ½òï7UØK:PÜ[I·3÷ð2ËšH„#„ëIMk$_w—×—¯¢"n²¡)ä‚7ö0ÆXŽ4Þ²„l E>‚ˆ<¿Ž¶Âm?%›) ŠÈœ<ê:£Ã¾<ªøQ86·¡B€÷·ˆ„Á ß5áàÄ’ˆÚ5â–‰±ý9è/{Hy\†c=[Të3¦"®]”Ð1fÚB¦=ÈNcÔ„ãàVs#dTo!±‚Ôx$é#íà6é³Ñ‘=‚Žgтب¾GÆÈ–`j¹xnú -t÷)^3 ùK»è]„°¡‘“‚BžÖ¥ènS y çzÖt§$óÞ¾³å.Vÿ~þÛHË©9ÐÌ¢V@!ÁÙÿžèQpœ˜Å·$ÇsFO1S"4m¯g iâ8Æ@Ä(Qs¡ ¬äàùõ·jhw Ò€&vËaÚ²bwÔ…÷_ r;Hâåh›$} \€ìÃÄM+­ÝKãeÙVÙ ¼UƒÖnl’1åœã¸Ã!ƒàˆÀ møˆ4hj9(#yÜÀ2W/í$CÍ!4C`ↇˆ -Á—ŠÖ2ý5‚3$\ZÁÒEëm-Îd< ẫEšîáÄ0#ÑQc&ÛÛJàVF¢"Y…ŠdGZ×f$"F[å ¦ƒ²æÓày¢å)ðĨcgeòÙ3µƒ³²ÑzŒ´Ü]Šô ˆ{l”’Á.Hr,÷T7¦ö]X×2fØÞMõ¸]Uo׸ò'¿iÇ Ò¨øL5,Õ}¿6ŠvPEB$G>&Ȩ“„}ÕØ}EŸ€lXB®)psoAÁé@Á#U(ˆOTëlÑ6 rbäC¥g9,=SÓ”ž#µ»^ ½Û ÈoÝ ¼‰RÀßém9ÀáÓ[¤ µ¿v¯Ô¿xS®µ¦+µ6¤£º °&SçÑhN%D4&Ð[?f«šRv?±HòÚÏ»0giuïgÜMÌTöÚÂM\¦u¼TÇ¡mNð€ÅV£,¶ØˆØ[_‡Ø+˶’ŒÕŽàΆ5|PꎡhUŠé±v‘õÐ\Æ Þ’¨=hêÝh"X)Tr~™U™gBçfɲÂÝ Ùy_Ó†™UZÕaê®ôSžïwá_´öŸøÛŒen5ÜïM-›‚QáD÷UÈ/¼*o³ÅK_Ì^e颽ԯËWQc ^΂Ò:ÆN²!îJ«jèƒJÅúh™£]ÜÐ7ôèœT±Ä©ȼùXú±GÒogª©{Õ .ÉŽ²¢ÖHãAjµëÐdܡůáÐæ×zd~­;YÝaN§¶g 7µÙîkv×fõÿ+‹ß~e1~½ ¥zÆŠ"ëKÁÔV1¢cBº~¸²~×Þô<®jT.6.“]îÈdÉÑ3YÛ]þŒ™ì¾Œ’ Hu8'cþÝ^›o–í+ÒPŽÌ~õ@¶ÃŸ’Ãp3áRPñ: š_˜ÀHÙ ³×=aéÛÒµ~IÛ×kóË²Ê ÿ^eµ)ãí*pÑÚœ"*8‚û˜[›žþ÷íˆABXÑ®ùâ;Á6‰Èþ ¥£þ†1m#šŽ@ÇmÜ´d\EC{Öµ¼y±È®3ø¯¤ëöŒÁÐ6‰ø·Ìw´¸y"ðMãŸ-c¤Ð›_‹–-í/ÑF2[¼à§°ÕÅ\·vOo]¿ë‰âI¼C â~EF9·–¥¿Ò»?é,+l;bqq³Jwo/Áâ6TxÝ^júà僵CL ›ãáɧèeH·ŒþG¼ïJ’q7é­ä;j[~7ͺïvûiê:Åw·¼Y¨¼[ä‚è¯éo†—«ÔöYù¼Ó€ä"PßѤB74<7E›ª6-5Al›†_…;í²0˜7/³°ÛÒ6D6W!iˆwänÓm½r[,™…gU®nm>3CaBGuš±´ÙßjJi8´ÕtSï{ ÕÔöº1“œUþX‹¬š¯ó™£ží -üóýb»D1kšÚØ€Ò0±¡4 æÍË,,ϾÖët^7‹³´Ê’.7#ÃÛaƒ{_+"…Wc`r—°íùjXVZÑê‡&9¿¼ `ëôgWj`¢§‹Û´¨Ó‹¬ÝÑM×'$ñ]¸j«Ûß®ëÐÑ]s³-eóÍ0†~vé\ž4ŽÛ‰YZeA>9Ø3(Tú¿V¨\¿¡vÍÔT›@{x)gµk«¶ï~N'éuè_ÿš·}çvéÒ?={a]Ÿ½ðˆ½0¸ÍSÿ2Kç?[Up ŸåÅmPŒ.8“,SkÀó†Ó ¢<÷…§ý_ýß[Pn˜‚B*H¤Mˆ iþ4á_°Õ¬Ý endstream endobj 48 0 obj << /Type /Page /Contents 49 0 R /Resources 47 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 47 0 obj << /Font << /F50 6 0 R /F48 5 0 R /F59 50 0 R /F41 13 0 R /F15 11 0 R /F24 12 0 R /F27 21 0 R /F43 18 0 R /F42 14 0 R /F25 16 0 R >> /ProcSet [ /PDF /Text ] >> endobj 53 0 obj << /Length 2363 /Filter /FlateDecode >> stream xÚå]sã¶ñÝ¿B3}=wFðI—Igš6™s'm¯SwúËLi‘>³•HG¤ì»üúìbJÔQòéxOí‹,–‹ýÞìïn.¾þÁð…ÐLé\.nîF0.õ"÷9ã åâ§L_^ ÎyöÏ®xW]þ|óç¯Ðn!8óÜ üˆ/®¤c’+¿n.¯¤TY_Ñä®]­Ú§ºyGË®ZöuÛt¸ÒÙSD*«n¹©o«ƒo·áÐ0mïF{:Û\ —UåvY•´óºêººˆÇ/‹Õr»*úv“(  Ôÿð—7?2"ö¯K/³.V]‹‚¢d"gZ’ì!œØ>Ö%"žUï‹õêêh„‘ÈÃä/^ФnújsW,«´<@Ó}•ÕæÒꌑºÑF‚ycdT·RÌhÍÃD4JC®‡óŽ˜ >âž¾¿A&”²IÕ8EIpìÓÞHÕT‹¤j°*ò¬îh£«×õªØDbíÑ®jºº¯ëþCäà¡,ú*~›"XܶØÊXXž0 ÷5ð‚:Y×W8“Ù}Eì¼îZV˺$—èÓ}½¼§ÇbS·Ñ°S¯V´q›(4eõPÁOÓ`ô…ÌŠŽæ•YûÐ×ë¯vµEM,J”¥ƒ'Ä98†áY±“*¸Rtª?¨ßBø†°ÈSÝß8\·½ÃëýÎÇv>"­bÎ8`)°²R€uñýÍÅ/ €¼P|rarHÊ.–닟~æ‹¶@¦¼[<ÄõB1 ³Õâ¿ø.eÝiJ&Åäœ9åèÌûèa¬,3Æ'æB@L@³VŽuxsOæÎÇÈ^4Gœ:ŒÉªf»®6ÑŸqƒ";OúËm“ïló×èäÛH´ŽMU•„‘Æâ¿Ø^Êè¨e¢¹ÚF×@¡¼Ê£p9 wG¬IEÂŒ  RzT‘ˆZû(†i£Æ«WQÓý-ó–!YyâJ°ÜE³\O4ïåbëeô¼!ô&ÎWŽ ¯SÇçåÜó§ƒ7¿zݸ;Øó¶ÚŒ³ôñð ‘É)1âÆ"vÝKòuóXmº¸—$¼Þy1Âø¹»hÊ/<æމõ" _ÙÝ%R5QÉES(urð'â12_VPÖu“ˆß~8 >|ãHÞn¸¬—¨&jä˜)ê°–"ßXRÔ)ÍÇÚÀ®`Ãb¯ŠtyŠßaèàL‘6ÒU=MˆsO9¶”n°X½k¡(ܯiYwûö%WXãGþ³ ñã<…”sÑw0Ž ìâÐöÙÐ^i™GÔe[ÆÙ]ètaÒ_ŠŒê,ÒØÝ·OMEÂ?Ö]Oq@ _G¤¢,ktmL2~×Ä yÔaÏr4ÿÓPÝ=¬Š §mަ¸˜á¶}».Bo·Š«è[è”Sº~ó·77_Å›v0@ØöŠìã€Ðº|¡…gÚŸ ¡œá0"# eÓºÓ…ßó(Äû×'P0ÜÃ@MÑ€.ÊÛyläpAÈõ¹fZÏ4ÕÙ4¦"T0)‘Ï =Æ7FàÞ1}$ÍדqÉ¡É9C²ÓA24¹Îû - ãÜÏRÃù4Ž«.aÐÄa-Ègµ`ÁU­ž§…4Ê£šiŒ³i\ M$·»Èµ*{CŠ-H±›ÑjMÃX÷qµÁp–Ù#†¥@¾¢Õ–†Š†ã!+•c–Ï´ÒÙ4¦‹ª…®[j­~ Y”Å„—XaŽ´ŽÚwQˆø a ׫‡© ¥ †÷9 7Ïo'/¿Žùqê–æ”Çý@æ3]íl't)¡MÊ/­Iñ¬&9”75Ó+gЈlõÃÏ3èù4Žç莙’þ3Ê>(?ä ó½ iÆ[êÀà- +*BéhõÛy™=¡•UøLHBcãè`ï6¸K~·á· ®S†y‡Ù.$6èAšð‹w o˜\IޤÓJ„ì†@àÌC>{‡ ’œ¢~UÆ‹&?‘ë„oÍçyÕù4¦ë²Çg} |¥Âüˆª@1óÕt|:7\àÊ”‹é??@¬I?Dåï§ÂÎÃ#á·GÞý¸Nã¨}3ÝîCS«v/„Ÿž8vŸÝ„²˜„r˜cÑÉŽgarfä¼>ü|'l˜ ¦ŸaCùÿgCè+9ÜzgÙðl'l·p|ü|ªÿr²!Ö†ú433gÐHlphqäLW:›Æ‰ -$FÚéð÷:á%ÕV™ý‡†Š|bótÏöô~æ©¡'¯m(é†ÞÏL¨›8, ØÓª¦¡%`sÔhž3;ó ãlÓag@ßÞ0+bæ\ãß•Pøµ‰ó}ø¯>ùŸ7p§RnðhÔƒAᎅÃꎆWd“T>¦³·Rpz²„NXÊ^À.´É)?’š@rÐ;}CÊ…Ë|Éá ’–ImB&;ýÔÿ§£ endstream endobj 52 0 obj << /Type /Page /Contents 53 0 R /Resources 51 0 R /MediaBox [0 0 612 792] /Parent 37 0 R >> endobj 51 0 obj << /Font << /F50 6 0 R /F48 5 0 R /F15 11 0 R /F41 13 0 R /F24 12 0 R /F47 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 56 0 obj << /Length 2467 /Filter /FlateDecode >> stream xÚ­YKsã6¾ûW¨j¡kFÞfkÙìNíLÍf½ß’(‰Ž™H¤BRöøß§%z(9Ú®b  ÑèþÐÝ þ¸R3 ÿjfSŒŸù(…Ó~¶Ü\ýô‹œ­ ïãL Ãì‘Fnp´Ö¸ÙzöãÕÿ¯þèE8o…òv’Œ½©2NÓâRÿ¼½úö½MgJŠ(£šÝÞÍœÎG…ÔÀYÍ~Jþv=Ú&Ëë¹JMR!±IÉ­†[-·jneÜ*#[n5׿Ü~¼ú÷íˆ\*¼sÓLp± ²“h¡ÈòZ¸àÙ¸Oå’Ÿ,¸õ·r&KfÂ>ƒŠ´]iÁZ'·k•ÐzÚn¿^Ä^ mE&ÚübŒ»ðÌæA¨(RÕ™Áäm¢˜¼»žkodâÑ 0[fëE½hâÏRšnÔ` /‚ë}¾ž{…½‹É Þ$fL¶ "úð²õ@¶~UÙ£š*À~j¤É1iÊ ëõ~`7Xá Æˆ!Ùò¤á‘0Jx•î'ýcT®"G7DbÌpÉßOÃ_a&ïR§qÊë0€îa¼˜IÓs;ŠC%”6/ûóÈPÏq¨‚ =€F–ðFØh^r²BY÷z˜±"ê^e5Š-”{M€¸¨DTÓ2EÆ^ÎK˜¦Å¥"Nçe¤°‡´œ“ü 0c %! wH,¥^h•}_”žsu—ÀM²fòÀ$ïx°xêp6—µÉãõ²4|ˆ¨£—¸y[’¶%i[ ·¥%Ï÷é™rÅ9(‘ìD|^,ã 4 2ÄÔJ6É)°×šI΄`@ÖÂÖšÉC?$*IN±äÚ¨Ùþ4ôF`§.î µâVέ’[-·2&kf®¹õšG*•q¸gíŠ[LP“¢mœ£ t$÷h¶fÄh6“&ˆǨऴÚ/M¸€Ò1’Ω9»HÐ)¦½“™\…¡1ì¿á•s&ˆNí( A?“y´pU™æÑ‹eŒy²—ë@õ¥¤ë]<š4pp#¼Ã“ùå˜3-¨Ò|è Å75Å–Q|‹SœXÅ'FÑÑN¡z9_Ëø’_¶ÚP #§9ïr§Ã²A@púš” ž¨8\q´dá&þ z룰Ü3ÜZis&¥Ù®~š /—1ÊRgf6(ÑUå¸ÇÑÆE%_Ô¼N„p\W+£¡è¢ |S«f’3s5 ŽÚÓÊ1N H‚:ìòh÷ƒõn5£å´æp3|ÇŸÆËj¸Cu¨Í_8¦ÖCi&ž 2öjXó’_VãbgŽ© tÅ9Ó˜üˆþá´g¸P2N¡B)8.° r¬™TLèëOÐ’“–˜'=¢!aù‰¹XÆø©SˆW¸ÊÙx”A¡ë*³5×i}6–l¤iÇ38Ô yúÂ'SÃ!ƒï$˜óx¾üÒlJHmÿŠÌHÑ™1pb:MÞ{Úb$Úh ïh‰W¶þ÷Õ*Ç«šL>M[”¿rÃB81På÷ß›OÌYö漢_nêk’j±Î7Ì€ëû!PÁ–ñ#¬ °ÔsØŒóÝ·;‡[ã÷oÞðìe›×wÙr3rW6¡¥áÉ·÷ Œ G³ñ¥ègs³Aê’‡¼~bNSl¶ë®·­˜fÛíúé˜7™’Ûùçμ¡8ütb!²÷yäöڶïÞÝþðéfLuÈv2ôp'-6yÙfmQ•/§&¹½V ïÈ%›|³Èk4›8lÞKp·+—8uL1kE*û/?¨Ð;øû5««}´¨™Ž‘Žôeil¸¬J•ðPPë`´úCV¬Š_[à6û*«F'4TóƒU—l˜áªZ9ádx•U5$Ó”ìv´ê&o³UÖf£÷$/¼î¿‹/(Ð3üºåcôP¬rm”XšaÇ]žµ;êÌ™ÑÞÌÅ L ‚.RDQÖI­î˜Ò &0iŒBÁÑÔìîpŸ¥ÔŸó†Ž/&øu|à,\Ú|‹jZŸ´ÙïyÉ\RX`1'c b,×YÓð+ï)[=ñ (Èß5€Höý> R±ü(Û#¼ùpó¿›Û9Æô”ciÕ›Ö8ñhí}Õä{uò3‹²;PX(¦A Ã9Ü$ißâ{ s›Õ$¯¹ù­wèhêƒ:رÊÑ %®‰ÍÇ¢½ç·¬n ìZÙšçÁÙ*2ˆ»M7 ìæú›¶Î ‚+!š„䇪íÄ· |[äË öF[’Ý^: #jtÄÁ@uÔÝ6€õ1[V‹Ã#¶xIèÿOÞ4=wYm¶;Žl skºŽÔŠé"ç¹Ùê·àiÕ‰\.+²Ç PaY)*Ê-TTï‹2[w¬·øUÏô"˜yež¯Ûë\ENv¬€Áï…yË ’Fp³³§¾ï‰;«ÝzÅL:Ç@9AbgÖ0Nñ².d/ª‡Ã<x·dUšÞpïª*»åö؇×.ЀsÑþÙæÎ‡{m„OÕNÛiWC€pŠdíÎ…{¨Ã´Õ¯³ªP¶ V ÷*•"H÷:«âæÝúUφ{ »ÿµDpÅŽÇ"§§ëõ*£%Óüs†B3æp£îK‰ýÐoë|uÇp¤†B%µ¯c ‚˜nößnGïÙ#`¬ÙÍܺ(ŒK‡(î7ՅͺXŽyj*ü• ö'CœèaÐp…C<»-áV‘|;^ëâçØ”Á®“ç»Z÷„gdÙáDÿ…*¢7È,]ˆ‚ Ìoΰö%±³eÕ]ûxHx®+Š9=o,ã:¸6ºþ;o[ïÊßOüœ˜úÞ6P©4¸G’L¥PNÖP[¿íøå2߯½ˆÏãAI•ôÕøPC0™Dêg…ÍÉÒy¼/Ⱥɵ¾ñE¡;¹$å›ý¡=v_Ï©¯C²[îs^•²®wÑߘvå³cÎé‹úÖë걿x=拦hs.Ä4h­½s¨ë-À?ߘýyøþž<Ð endstream endobj 55 0 obj << /Type /Page /Contents 56 0 R /Resources 54 0 R /MediaBox [0 0 612 792] /Parent 57 0 R >> endobj 54 0 obj << /Font << /F47 4 0 R /F50 6 0 R /F48 5 0 R /F42 14 0 R /F59 50 0 R >> /ProcSet [ /PDF /Text ] >> endobj 60 0 obj << /Length 1568 /Filter /FlateDecode >> stream xÚWKÛ6¾ï¯Ð¡¹¨i¾ôÊ-4E‹lßÒ ÐJôZ,ºwÿ}‡R¶:ȉ#rHÎãã7£7Û‡ÍÛ¬J%­X²Ý%YNdQ&y•Jy²m“éÞ˜ã«Íæ|>“FwÃZDÏ›wG}4›V7§ƒLm:=lVŸ¶¿oÞÊòúHƈ,y²æ%vÆùºŸôj-d–Ú(+å©Ù×çºG³÷K;Ý÷úÜ Ï8V8Ž+V¦j§F€Æë—q&H!XBñæŸÞ=¾ÜÆì”‚PQ½zº±áP³Àšî,dú LäUzÞ+4ÅÛ±biØå‚äÕ¶ûΩµõh^VŒ18 Ð`#Í“5ƒð‹ -xsêúv»ªxªu?¹3XJVk–Ñ›Á¯¡]ÖnQ¦õl‘¨Ò^7µQ-¨gØ´C•}Âås7íQ2—N“߉îƒðúÏÇ?p­Œwu£üµ‡ú‹×™N—KËO˜‡‹F”æàC˜ÎvÃdê¾w(U^¥5B„Û ›þÔª ç;cÝ€Ðbhp²õ£ÙwnBç`jPªõ‹þ¼VŸ‡^×aÖyÂëàzß=õi´2{\´ê”I!å2 çYbÏ‹Á¬"’Š 85cw4ˆx%¤,‹e`|êVk.rû0bwW$Ë—øÞX¬!Î6wì`¢ 2›-&ö†"}Û uøíg÷¹¤îÁÙûëi‚ÇŽš˜^;ëBm§LÿÅÞçŸ,’qÆ¿PQ†@!© AR×¾=°¡½I¾Ï7&ô^|$#üÂv.6Víá×íÿ¶ Ò„AÍ 3Bíâ,i?Ѥ…5xƒÊ29;ÍCÔYØþ¥O><üõðæÛæ˜Âž•“’û‡;©aвJNX9s—:VÜxijªŠFü©»÷ûÁ¼ÁžÄñXðYèÐ9–Khß*!€·*’gt×Ðþþh_~Ôzê€ÎÁYôùG@òìB-’ç¨ðÐ[¹•AQÐþl÷-•Uv¼b§žüQ“ò+Ýt£—ç"_$›ø„y˜¯.¡§¼·ýŽÌ«Ù’,mÐࡼ¡hؾþÚéÑ»±CŒ a[Ø›ªv¯MªHÁ~ [øÒY¯Ñ­¥·’Sm{;üèK œG=šz0øyaz|•Aùu5àsZ,#¯:òwÚ;¼u^?êɬí5‡º9 ”I*V.ƒòݦ#çìÆ_Gç{5ù§üˆ–^ÜMàй}vб÷‹ú–gÒ-o‰•íé¾væÅ·ÈPOøï?]u³è ܧ>ªý ^M]=üm÷MCê\š´ì¥g Œ]{j”ï‹~C °`pû;eã¢(ñF&cþkqkœ endstream endobj 59 0 obj << /Type /Page /Contents 60 0 R /Resources 58 0 R /MediaBox [0 0 612 792] /Parent 57 0 R >> endobj 58 0 obj << /Font << /F59 50 0 R /F48 5 0 R /F47 4 0 R /F50 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 63 0 obj << /Length 3169 /Filter /FlateDecode >> stream xÚ½ZKsÛ8¾ûWè¶JUŒ!^|Ìž’ªÉ&3›‰7ví’h ¶X‘HHÙãùõÛnðeÊq6ª= l<èn|ý€^_ýôÆF ‰,Êäâêfa¥ˆ”YÄY,¢H-®V‹OËíÚí_œ+-ë][ÖUCùÞýüâËÕ¯?½‰åphq®”‰¥éŽ9ûåêì3 }ÀnaS¡Kb€[¼(¶gŸ¾D‹ôýºˆ„ÎÒŽ¹]h¡ ­Íâòì_g¯qÃcf±&‹a)-R•ÇÆÁ1MS¡µ> ÓLŠ8²¦­Û5$“ëTÈTÁr~Ø» „§Ë[W¹}¾y _‰^‚„‰|Ø­ò–ÛEÎc¯™°ª+n5Ú2ßlˆrSï©‘WL©ÛkÇÄú³å.ßçÛréZ·oÄ‹sÛåÛúÞÝÁÀÄ,_âþçe*ç2F³iýÌ.«úþE¦`蹎bÞ8ïòM¹¢æ>¯n™ÚÍj×eC­²jÝ­c2Ùw°ô¤JO)´•A|’%¬Fêí™0â3Øïœ¤Fu£fŒR›T˜8]Ä6æ|ŸLt"LŒôkéL=e–ŒH)y¶ h,ӶÉM¥Âªt$70ÙÉx´´Òþöð`Ö~^­‚zYá+w“6mg×)×ÿJA&¦m$"›ŽmìbãòƸ4Ž—®`)5Ȱ ±…†L—…Ih{b¨àêDü!¥|JKI"R@™ˆÈØÂŽT ‰0OML<¯ëCµ*Ö®ø:'úÄ7;¹AÙØg‹ }M“l6œd"!»9n™d&bu ’¤›ŠÂåôLû*+úõ:Ç>¿{¢õžÔQ„©f™onë}Ù®·4úsd#¯\컄 JCÊŠŒä$l2"25Pk¹ÝmÜP0ïíc—ïÜ8HÄ6-¯Öa»„`—h#7½°áµû²ºº;f×̉YkP§ê]Õ³rÖ[ÌA ,PÍYÄy Â?2ÚyEÊÈ’bÃØ|§dÇleÞ+³°X‡}ZŸàS½NÁ×€¢&l©T£ëüMÞ SC¨Ae¹rDB±ëd™7ÔGÄ|CTÒ¡‚|NïËÆa(ezÅ᪈¨t™aæ¶¼]·»¶¬<@Ç>6„8#f™š-³åÍa³!ŒÌµî˜J8 Ä5n)×ÎUD*ê»p&Ø­•12ޢߔ-)‡îû D»¡&rŸ±2º2?ž·/Aìa¸5ZÄR?¢gƒ>q-£Ÿã¶be·ÁpêNZG¼@’‰Ÿã¶’NY°ŽTh,¤.`‰#†èîmˆNgÁ`kÁO¬æ\ÁÏs¡ªÌà:GÝÆ¢¹˜ .ij‡ª“;%níÓºÕ*Jg 1ŒÌ~ìkî¬T°V æÿ4vho üNÂðGÆñ˜ï±`U‰8NÆÁªJÒ#Áê(ÖÉéjÀóö[AÁ|&"ަ΢%ëò¿DdIÄ(ìC5-28)ï4 å` 8Ò´;ž;ƒ‰$,58˜ Âm¾#pˆ IõIB‡H‰45Äs›ÿ9çâ¤WÅ)˜J„ ,sÝ­ âkgìÝÍLd- žC„é?vþÂ×l4“H-ß]|¸¸¢^ä†Z%$ëmó “ i%øëm‹V.·ˆ#Ø^Bk›Ctù'­é7/Öˆ÷ƒ€%QN2£k×¶˜3k©Ñy±W¹uUá½ AY”]£¢ÎÙ˜~ÿ´À$H‡Åa±¡ìñt·]á¯inÞ:,ÞRˆ Â+&b‚†Ç‰f£w…ƒ±!—÷°ú’Ia'‹»Àº!µÌ•W ’ŒÎ¿y2¦«rKt?LÍ™rØí¨¸¥ñ^Rû~]kÑm¹"R§BÄÛü:×ùóˆõé’°,ãÕ›¥Bƒ/IÅ;"Xé½!uÀ ÎEÜ€ì«áñ ÑòëúŽ—`§Äî\ÚôáÄXØ ‚V“¤Ïv¿÷ µ›ìbßúGGšs0Ú°wÂ:8aª2Ä\<H4xf=òÌjà™‡úUG=³†´£FŽxf«åsM˜K^¢pÒæ_Ý5š6æ*UI,dïòâw§¥Üát+‘õAܔڭ)¾o>UT–Á%:¨àJQÂ,¿~m'Ì'àòåÓ½kJÌG›£Ûô•l ÛH˜$M.Âð#6~ûíŠz =]•á_ÐѬëÃfEmÿ cþ¢üµ&ª/Ä÷ki]|òìç×›.糉_«Ï9‘‚°*žX~ÿ ƒ1cÃWG Ù1Vl çÉj7;W„·sèæWjµÜäœW‡i}u€(üà €åv¸O„OzÃ,à’mË*Äm@(öxñÊœw™9&3‰òÊÝ•ô*‘dˈ5h/["°gNð¹ÎqÐô2ƒîÀË' ' £)L'T…FšG#?¬îÖ%B€·¹Ç/•‰ÄÊï*×"¶¤áIúȶ’3aç5ïó^€œP›Lèi@]V~çç Hxýty¼«ˆLñk, š‚ ð³ÐÖ¬^G¹ân¶ÁD 0ð»²} |`aHU¼°³ Nœuäq.yò]Pæí&l{$7ª|c42½,Ì¡'¸fìæˆt5Aû¼iÛ@mëñœpsYñÏC€râá{ºÆgVÌGwãöX¨š5ü¯P*TÄ/ Ÿä*]½)Qxè8Y¾ÿ~!U¶/çj)¸Ž^N殺v¡0;]„–š~/‡ºƒ4™«ZØÓæ×å†éfùªÊ7÷ÕÆxÁßßëj!Y¾§ÉÄévŸo·hXsõ‰Ø¨¡á@w€i[GkÊØR#¸Ïñé¼VS;)½ÏÁ ¨/ ö½%{æË¢¤¢àH¥¿T·°m·?²I™Â&û šôªÈWn[ôuÁ×¼ì5?Ð ú?édél iA*Ó‘sÆúĽvò'ŒOŠíà¢ÜWÐÊøoÅß©ñO??É„Á0ID*äø*6 ñ|ÐWïÜ_ç¿»[FLÇk~ kv{]ºÛMçK<;q…_‚??t>ÊÿGe 8=oº‡£j˜×‡?YMˆ>J; @¤+Ÿ-@cð¶ÉQ*ÿI‡{Tï>m…ƧÁ´ñ°`—Ë40í‚î×/¡‹‹½Éò?¸c‘<ò½x+¸ W LªÞs!¤.«–šï]»®W }Ü„ÃËŸ^€å_9ùöË7p±£î°—ï^½çóBÈ›Eñþ?‚»t÷³7ÐøZ/c dž¢Ü=€G‹RÓë!RßÖ[ÄnÇÇ*ûY©Øf iŸÈ­WP&Ò”-QÚûýk|8› endstream endobj 62 0 obj << /Type /Page /Contents 63 0 R /Resources 61 0 R /MediaBox [0 0 612 792] /Parent 57 0 R >> endobj 61 0 obj << /Font << /F50 6 0 R /F61 64 0 R /F48 5 0 R /F15 11 0 R /F42 14 0 R /F59 50 0 R /F27 21 0 R /F21 17 0 R /F47 4 0 R >> /ProcSet [ /PDF /Text ] >> endobj 67 0 obj << /Length 925 /Filter /FlateDecode >> stream xÚUMÛ6½ï¯ÐQb–¤HŠJOÞ¯`“µ³ˆ ,ŠlªÍ•ˆÈ”!ÉIÝ_ß¡†þŒ l{1ÉáÌh8ï½ñõâê·{¡#FIF3-^#Éå"R™"”òh±Š¾Æ_Å·ÑXR_[ST¦¥"~7óTÅdáOäÝèÛâ#äJOsiJì(f™Õ®²ÎädñS3b:®‹&_¯­+ÞÆ‰äñMí–fÓµ!ý¤*êÆvå iœ»†O6›Ê.óÎÖ®EKWãzSš5ÜTgŸYš¶5m(òìÁIƉJ²}•Ãæ“ix“¤§îc!%aREc¦ˆH$FqÊèPrΈfú˜\¢q’‘,ãјK"-–¡Å3(u•Wþ¹P÷G_£áÙ4‹Ÿ}·[”]𘷞 I¸>¼j¶]›&4Ò}Þtvmÿî»7T6£šH™œö¤2Í¡ápþbZ&±,±:,®î­ËÝÒî¿wç @*pE(›ƒgß žH¢”>o§YYÿï+i<ßøÀ#íÀ43?qóÇ(ãqÝ|ÄŠ Jhvx§T½$ä¥Z^ ¤JϽ÷@йF‡¨ ã!=c~9Üå˲;>BÈxBpÍ݈Å+Ü_( ,G…õÇÏί"îJƒ†‡õ¦2kã:D³¿¬_qÍqyjì:¯Æ·Û0<8¨ÄÖM¸®­ëp{o+_#~ Cëü3ö¦ïÝ9d¥".¯}r؃Jâ™O XДúeø*qF ˆ˜ _ß³ÚÂÁ %Ì>›;¼m;а)vx…0Á¦5®Íý°@Ån·ÿr^íZÛâ©ç$¨ýìè›ÆJ“úg[Óµƒ°1MX*.¨òpSÞ Žâ&ñA®I2,jEupb™Nÿ(š{T8üÉ!,”¬õ…Øu€å¾ÞbO²Ôñò»ßdÚnÄÛÛoÉtƒÈí“iŒìÜŸkòìÇÖðäæ0UDv(}2}z|a\¦õÊTžáýé1wÅ6/ žOïtÔ Z¡ñ ÿX’òôb èˆäÆÛí_n›Ý©ú€h¡ÕOùÒ9øðË?Ì¿ÌiH{Ô%¿uN«„P%½®RØd½N¯îWÿè`7 endstream endobj 66 0 obj << /Type /Page /Contents 67 0 R /Resources 65 0 R /MediaBox [0 0 612 792] /Parent 57 0 R >> endobj 65 0 obj << /Font << /F48 5 0 R /F47 4 0 R /F50 6 0 R >> /ProcSet [ /PDF /Text ] >> endobj 70 0 obj << /Length 3192 /Filter /FlateDecode >> stream xÚí[K“Û6¾Ï¯Ð‘SåAð˜ª=8›M­·’Ø[¶l(‰3ÃZIÔêáÉø×§)‚¢(Kdmªvs"€Ý@£_7¡îo¾ûIÑ “DHÍ'÷Åår¢SM(…žùäcòúöŽQJ“÷ûå2Û¼ÜÞqE“òÁ?ßïn™M>Áìßòííçû|÷“´FIJS†$éäŽ[©ðÔÞ¬nïSÉî©ØúÖ6ŸíŠ2t?ç¡Ó1+¾æÕl×Ðñ ƒÙηVy>}¥N+zy˜òPnªžÕ¶Ø_ŠÝ‹ïدçÙ.ß¾‚_‚%Õ´ ²ËçûYEùïùv[d+Ü*îi"…ò{›e‹Ù~‘án¶ÄËÅÉBBuÅûæPšmø¾K˜Lp¢­BÀοèäãÎeídéy§ÍWuJ„©^ÜìÝœ›¿Ýßüç†A/,s€)l¢™%j2[Þ|üL's‚‘Úɳ›¸œS¡µ˜¼¿ùçÍN"^Üh¢¥p”ež' ¼kO ЬV×±xÆ ¨e˜òÒ­h,%ZÔ¢qòÕƒmKmAîœX¤V.QZRi—:y. ?êµ ûP›°gÞ›çøÊªž¾øn Ð±ßæ›[#“WäS±o–0g8e^·ü@¶ß•K8yСE ÷˜¯ò ¨ä‹ßµiîZ*A4l0l{ûæÝÛw÷]âp$œµÄ£¨!œ«X)ýÂÊ/õ.ÓóbK…7~xúýBãHŽÐ¤‡ÓJÿœ†ÙÅjžÿV Ö»â‘NhAäáÄÂÖœ£ˆTªšQøLE*OŒ­ë{àglºØT²¦õ \`CƈbmŽ1¡ˆãNK™#:†( 8L¥' ”—¥ÃLQXàÆ-Ð3KUlŠ1[IÁZµ…­„Mjð71Û]¾Þv‰ ŒÓðZ‡»ÔO[´÷NŠ4y½ØÕZ•»¼ÒI ‘v΋;¯í°bÒ–¶{]!ˆ[™ÌÊÅ~ÚÓ|Q>û&†+|‚mÏ}ËéµU¨Ï`¶nu¯L^ÿòîçðæCy Sšæâ{‚ÓqÜ|µóä+‚‡×ËÅÁ2yÊ]¬Â™ë[–dÛ°>åÝRx±#Z2>~”þ‰‹&¾Yyÿ«XAà\fAJhVUäq‚Ö, ]ÓðÎC¹_Í«×ýó£ýLŽO’‚¶C°ýj'Sb²Ö»K( ¢Œ@tì¡“½ššKãØeæR0æ4Ä®wâõôóGÛQ°QïâÕIh͆HDZ ñÏœ]ÚhC$­ÈJS’*Ä€YZEѦÉ€™LZÄ?A óÿ±hZî1˜‘`놳»±ÂñG9•ØÎ6ź›{¥—soëRà߇è€Äæì]„´Ç,R ø –£4a<í #Œ"ÀõãTÁí¥a„Ƹ0€˜ë}í1[ ‚²|¶Òà"âK{´ü: ·p0`1klÌôͯ=ª= W%I*AI 'JKÏõÞ;uf|Ô3 Qz\¨@Ã[í—ž†î§ÐXg›l™ï<Ê…y! ÃHrÐrÆÖùf·ßLó9é Po0e“<Ùeÿv©4¿d‹½o³äÁÙ¹ô#,Ì-ýs‘¯wOŸ¨¢HNA¨9äë€ÃÚ”S a° Ž1ͱr9),ä°(ž,³ßDâS|ag‚Xp^àc#Ê'˜_ÒäWe\hÍŽÒ;÷¼ ÛU^WKq1·ŠË›[8¿Y‘-H£ºX—ŽP@਄U„Âs˜£R€Áõ±XT¿£‚)pè8UR3ÐQ!Ìf-¶§<•|-®ä ‡y* ¡[Û-N{ª+EÜöT23íóTãp­<竚ŽJé¤zn‹e±È6þG]LˆÎʺRíS ¡)0 .Î-ü¬j0|¹KsÝ'4CXLÇõ8lS p:=›YaF¡l2Ýï‚XÃsåÒ ìÉNwð<:öLÚ•Ù¼Û“ŒP*c·çßg t®;ÿ{?o¹ß†W«ÚŒÿUVjA­“g³§Î„$úlõAþoV¤ Bi§@̦ê«NèÙ9÷¢Fa825W’6æÚ[{0gk*ªœuÑËÝÜqTüÜöéÄ×2Ûj=‰Ú__J¢Ç]ãÁ"–núkyTÁž§r¿˜ûÒçSö%÷½¡¦ ÃÙ2´jílÛåá1@¥<í÷ñ˜YÁõ%ùZ ~[3ïõ„W`€ÜªQø*tÊÆ|鷔ϵ_;;|ÊåÊ}žð>2D&¨<€nüÅâêÑÐ ‹5VžÝi t#å¬*$u"]º±±*ã T ¯OÛíõ㱯P Íè X4å\ Ö ã40 ò Åz/åD#ð…(GÕ0ÜK¬›µ¸žÀ½<% qïlQ{›lJt°,g®eÛBÛH´Ùö¡íkNµ»*±ìÅÚ#ð¬\·DCmn=ÔæiU€ç gV.—ûâÃ[æ*ÇÐç-&Õ .qÅ«Á&΃q‡ ï:‚E,Q§ô€YÊdÐ}@€Ø_V ÷åÇOa>¦QÔæÿöI PM\kñÇÄ]T‹+Rp¶¶3WÅ)¡°Å–+ú/À¾ -îØùS\]U%®]͵븘FŸó f•>”ò0 ?eÛ2T‘z[ÝdpVEúü\ÌßÙtQ…ýnìÇRî6Óý KPvð®T ‹E3Ì—š>e *Ãí(|…կɗ}ø;­Èt(! €Ú8 qcœ³aE@HÄðxñF‹²ýE@8 n§šþ¯uçQ ¶™‰Ù«b×…˜‰-8ImÌvV®¶»Íihr¥˜»ÁIĹœŒÃ5x€„rÞ„'àûÿäIæÙ£ï 7Ÿh–±ü@îû½Ø²bµóÑl³+U`?H€䑼ê Ù™ˆ0uùè¹3ø3ùÐ!hÓΔ PŽ!°Ó…Ä ¤&gh#oºcîT3 Œ±‰!FÃ2³þâñ =qŸŠ3Q#ü‚OuòÎ'€Sx‹|éû0ãcÓ5ÌTòæÁxNU$Vpú[båÕM= 7 `ö¶õ©ÙÝæ’º]T,£¤UåƒîÆQ±zŒ?Œ¬òY¾Ýf›¿ò“nñr¥m»E¤€š:Ä- E„µï61…;`¨åÔݧ qæ£`¦ã–Ù ‰]¼Ø#‰ u.%?+1ÈrK‡åÔš(ÅŸ£ª?Œ¤>¥›Ée:0Œp—vE\ËEWï`ù8LdÉ€H"¦'òxð¿@Ìul[µŸ1íI§¯;ÑvÈâàœã}¾ýpß²Æ`ZE,HM¤UqÄÒÉS¹˜»¦©‘·‘çþG |]èш|]ÿsŽ_Ôñ½Ì©Nýog6}pÊXFÛ/vÅzQT_—›%6Èì×û]ÞºÎuÀèí›Ìž{ŸS½T¬GöÍäq9(kB£RËiôhCLSUrß®òVRtªt¡¥êðë²ö›+z¤Ê…ý¦Ê…îû`…t•u²ã—WÔ[×e5àòøN¤à¥SmFá*A=¸hþÛ²`!¶V‡p撚m×÷×{ tˆiøά<—Nž‹áX’3‚]j[qh3ĵrÅ[)eß™Âj(z˜‰_V‡ ž¦-®Qœwïu®¢¸¶-®§/ÌÁ”ëØ¶o¡À1¡Ù4ÙvrÀR£lS)7%â÷µ«ôχŽÄi¨–ý|¬\©ºÝh%bÚ WÆa[E#ÃÝäè® m»ÅºžG0‡È€Â¢|®ÐÄôpü4¶}èâ»æ ô0ˆ0€F}(Óè;P~­ÍŸáˆ²Ãï†c@„æ1œ#p­!BÄö†L#@  „„€q1"€PÃaLë~7D®hQßÐoçÌUIb®Ý Œ•ãpe)˜‚iq=Ï•lÛAKy̶"0BÓqv Sè˯ݤaãðÔ‚ÙÒ¤=(á:í=šLûQÂ(l«€$¬ËÕ(a¿^_.Þɱa!í0”0€F}(Óè;ÎàPìŸ(ᔲ“ÆŽ‚šÇp%ŒÀµF Û?% 0€`”ÉK>tý‡Rwßð«n‡0S-ûw>. í endstream endobj 69 0 obj << /Type /Page /Contents 70 0 R /Resources 68 0 R /MediaBox [0 0 612 792] /Parent 57 0 R >> endobj 68 0 obj << /Font << /F50 6 0 R /F48 5 0 R /F59 50 0 R /F47 4 0 R /F42 14 0 R /F41 13 0 R /F15 11 0 R /F63 71 0 R /F21 17 0 R >> /ProcSet [ /PDF /Text ] >> endobj 74 0 obj << /Length 694 /Filter /FlateDecode >> stream xÚ­UMsÓ@ ½ûWì1™¡êj¿7Çèhn¥7ÞL<$Nˆíÿù+c'&Ð’‹wmkõ$=éíÍ<º¾Õœ!Ï=²ù’i.3Þç‚Íö0ù’r’é•Ð|ò!äygÍËÛx½(×q‘n³|6}œß]ß*×w‡F÷–ñÆÓ}(šƒÅ*4›í®:ÜÕ¾Ôx‡ƒ‹ífW¡²‹ÞÏ£ïÒ œI‰à¬Ùb=G7uîD)5i†Éï)ñST­A {TíÀ 1WmG ªh¥»²۱ʡ¢°5ùòQb<Jµ5‚Ó¥ºÒÓ gTžˆR‡ { f Z{ÎYð^÷‹t.÷à5Ü@îÚn*—St“¯T·Ÿ§  õ`…¹¾Gp‡øïÒ}…] Ä•µâ2HÊÆÉßÛâ‡|±OwãèšDޝ@?éCaX÷_=€ŠÆàlŠ|ðA †ÒäIJZ@ ª„?3HÀ¥&KI«{ét@5E冨½ùüCϽ.ß!å‚[pöúã§3vT­À+¢Œ …U ê|•æÓ+%ܤ[˼ºªi­~²rö1‰tóyÕnÒ, »@¬h><Çû4~Z‡ü ½[I–e缨’£ ¯¨!1Xƒg!$d „®±ê5þšÝ¶Á$4“˜4ŸãuÚ#ËúÏvÓˆ êãÛ µìT[¡ÄÁ…Jôv6kE™ô•fÃòNo ÷4×Ñ4ªÝ`iÓ³¢É'q–Œ! ’ƒô°¡»Àý×Òu`û¸iWÎU[E¢î‰JØTtY“@ûjúÕ‹™Õý} ÎHЋûòD‚ÈCÕŒÿ.AcÊy}wêŠtl)w]Ø¿˜ó | endstream endobj 73 0 obj << /Type /Page /Contents 74 0 R /Resources 72 0 R /MediaBox [0 0 612 792] /Parent 57 0 R >> endobj 72 0 obj << /Font << /F50 6 0 R /F48 5 0 R /F59 50 0 R /F15 11 0 R /F41 13 0 R /F24 12 0 R >> /ProcSet [ /PDF /Text ] >> endobj 76 0 obj [389 389 722 611 944 778 833 667 833 722 556 611 778 667 1000 722 611 667 333 606 333 606 500 278 556 537 444 556 444 333 500 556 333 333 556 333 833 556 556 556 537 389 444] endobj 77 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 78 0 obj [600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] endobj 79 0 obj [826.4 295.1 826.4 531.3] endobj 80 0 obj [611.1] endobj 81 0 obj [638.9] endobj 82 0 obj [458.3 458.3 416.7 416.7 472.2 472.2 472.2 472.2 583.3 583.3 472.2 472.2 333.3 555.6 577.8 577.8 597.2 597.2 736.1 736.1 527.8 527.8 583.3 583.3 583.3 583.3 750 750 750 750 1044.4 1044.4 791.7 791.7 583.3 583.3 638.9 638.9 638.9 638.9 805.6 805.6 805.6 805.6 1277.8 1277.8 811.1 811.1 875 875 666.7 666.7 666.7 666.7 666.7 666.7 888.9 888.9 888.9 888.9 888.9 888.9 888.9 666.7 875 875 875 875 611.1 611.1 833.3 1111.1 472.2 555.6 1111.1 1511.1 1111.1 1511.1 1111.1 1511.1 1055.6 944.4 472.2 833.3 833.3 833.3 833.3 833.3 1444.4] endobj 83 0 obj [413.2 413.2 531.3 826.4 295.1 354.2 295.1 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 295.1 295.1 295.1 826.4] endobj 84 0 obj [547.7 681.6 1025.7 846.3 1161.6 967.1 934.1 780 966.5 922.1 756.7 731.1 838.1 729.6 1150.9 1001.4 726.4 837.7 509.3 509.3 509.3 1222.2 1222.2 518.5 674.9 547.7 559.1 642.5 589 600.7 607.7 725.7 445.6 511.6 660.9 401.6 1093.7 769.7 612.5 642.5 570.7 579.9 584.5 476.8 737.3 625 893.2 697.9] endobj 85 0 obj [722.2] endobj 86 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 762 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3 750 833.3] endobj 87 0 obj [583.3 602.5 494 437.5 570 517 571.4 437.2 540.3 595.8 625.7 651.4 622.5 466.3 591.4 828.1 517 362.8 654.2 1000 1000 1000 1000 277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8 500 530.9 750 758.5 714.7 827.9 738.2 643.1 786.2 831.3 439.6 554.5 849.3 680.6 970.1 803.5 762.8 642 790.6 759.3 613.2 584.4 682.8 583.3 944.4 828.5 580.6 682.6 388.9 388.9 388.9 1000 1000 416.7 528.6 429.2 432.8 520.5 465.6 489.6 477 576.2 344.5 411.8 520.6 298.4 878 600.2 484.7 503.1 446.4 451.2 468.7 361.1 572.5 484.7 715.9 571.5 490.3 465] endobj 88 0 obj [619.8 639.2 522.3 467 610.1 544.1 607.2 471.5 576.4 631.6 659.7 694.5 660.7 490.6 632.1 882.1 544.1 388.9 692.4 1062.5 1062.5 1062.5 1062.5 295.1 295.1 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 295.1 295.1 826.4 531.3 826.4 531.3 559.7 795.8 801.4 757.3 871.7 778.7 672.4 827.9 872.8 460.7 580.4 896 722.6 1020.4 843.3 806.2 673.6 835.7 800.2 646.2 618.6 718.8 618.8 1002.4 873.9 615.8 720 413.2 413.2 413.2 1062.5 1062.5 434 564.4 454.5 460.2 546.7 492.9 510.4 505.6 612.3 361.7 429.7 553.2 317.1 939.8 644.7 513.5 534.8 474.4 479.5 491.3 383.7 615.2 517.4 762.5 598.1] endobj 89 0 obj [833.3 777.8 694.4 666.7 750 722.2 777.8 722.2 777.8 722.2 583.3 555.6 555.6 833.3 833.3 277.8 305.6 500 500 500 500 500 750 444.4 500 722.2 777.8 500 902.8 1013.9 777.8 277.8 277.8 500 833.3 500 833.3 777.8 277.8 388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8 500 277.8 277.8 500 555.6 444.4 555.6 444.4 305.6 500 555.6 277.8 305.6 527.8 277.8 833.3 555.6 500 555.6 527.8 391.7 394.4 388.9] endobj 90 0 obj [611 611 167 333 611 333 333 333 0 333 606 0 667 500 333 333 0 0 0 0 0 0 0 0 0 0 0 0 333 227 250 278 402 500 500 889 833 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 667 722 833 611 556 833 833 389 389 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 606 333 606 500 278 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500] endobj 91 0 obj [605 608 167 380 611 291 313 333 0 333 606 0 667 500 333 287 0 0 0 0 0 0 0 0 0 0 0 0 333 208 250 278 371 500 500 840 778 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 606 333 606 500 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 333 606 333 606 0 0 0 278 500 500 1000 500 500 333 1144 525 331 998 0 0 0 0 0 0 500 500 606 500 1000 333 979 424 331 827 0 0 667 0 278 500 500 500 500 606 500 333 747 333 500 606 333 747 333 400 606 300 300 333] endobj 92 0 obj [500 500 889 778 278 333 333 389 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 500 747 722 611 667 778 611 556 722 778 333 333 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 333 606 333 606 500 278 444 463 407 500 389 278 500 500 278 278 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444] endobj 93 0 obj << /Length1 1617 /Length2 6722 /Length3 0 /Length 7759 /Filter /FlateDecode >> stream xÚvTZ×6)! Rˆt J‡twÃCÌÀ0tw§¤´€ t‹4Ò%HH JJ}÷¾÷¾ÿ¿Ö÷­Y‹™³Ÿ½Ÿ}žgÁÌ ©Ã%m ·‚(ÀaH. 7¯@VMÞÈ àååçæååÃefÖ…"!Ùq™õ!W(&öY„¼µÉ·Žjp@ÙÍä…Ä€Âb¼¼>^^Ñ¿á1€Èj Pã(ÃaW\fY¸³jk‡¼Íó×O+˜ æüv‚  `  BÚAœn3‚AŽ8 Azý‹‚õ‘é,ÆÃãááÁ rrå†#l%Ø8P¤@â A¸C¬?%ÔAN?Ò¸q™ºvP×߀ÜéB@·G(s½ qƒYC€Ûì%U€†3öÛYõ·'àOq@nàßt¢Aa¿‚A`0ÜÉó‚Âl6PG@CA•é‰ä€`Ö?AŽ®ðÛx;겺uøuu@AZ ºUøGŸ+uFºr»BjäùIs[fy˜µ,ÜÉ Cºâþ¼ŸßÖÝ‹çOs`p˜Ï_'(ÌÚæ§ k7g=ÔÅ ¢$÷ÇçÖ„û›- äå@\O°ÏϺ^Î_ ð§ùVƒŸ3Ü`s+âµÜ~áú¸‚Ü!$ âçóOàß'\ ` #V[( ÷?ì·fˆÍïómÿPO€ ïíø¼??ÿ2»0k8ÌÑë?î¿ZÌ#­ª¦&¯ÈñGòß Œ ÜàÃÅ'àââÂÂ|¿ý]‚¿äÿ²j‚ ®÷J%˜  ú[ÅmùþRâþg4Xÿì àßÔá· °þgþMyyÁ·€ÿç-øòÿþŸ,ÿëüÿ÷Üᬿþäuôúãq;ÐnÈÛåPƒß®ì¿] ¿7Z b usúoT º]i˜­ãß…„º*@=!ÖšP$Øî÷ýÕ‡[zG( ¢ w…þ|s\@^ÞÿÂn×ìpû®¸Þvë¹Ýª§”‡áÖ?×OPB @^¸·Í¿= |€·{j ñü5Þny¸•ç°#pöTÀc… ·o£ Ò ùþü ¹¥ùáý‚tþÂÿ7ò«óÿ¤ü7ôO>à¿¡Þfr¾}»`¿îµýÛücÿ倈€ÇÕÍÉé×3n uuvyýÿU5°â6ùk²oKú×ù× xBÀ¸³Sp°x¨}mhëYµ4µ×úÈãÌël\>³ˆ6·X©lUÙÁŸ'Ò©Ý„ «ò¬ÇRsôW>;ÍõXožjµ\ø^Z$i­·àÎŒ’÷}(Ú‘®ë¥Å¡áÒ•Úð½rñÕr@oFíPfÎwq!Ð|NræñVѳ®÷Õüûð©u­*!•»—¯Æ¹âôbMƒJ&˜ ¬r&)ï ¹h±Ù‰<ïMŸ|$ÎûpC¯œÄë·Ç_ìc¼Ì>é½X®ËçÚIõ€Ê˜’ý˜øýØC™Í4eŠiŸÒâ¥Â †xçEI“Ý ¤ƒ[6‹ ¹ž&ømØ„»Rf@&uWΛ2Œÿ^Ž} (TøÍ#o‡ú¸\VÍZ‹=ü¡©‘®“{9¾Ó õ޼ ðEÿOxÁü&½ÅaÏ„cù{sÈź©˜É¬á(Cˆî\»_t³ŽDVFQ"PÐàÁt0f“E{áôÔ»,“]¸ØÐÍÝãÙ[üØ’Ùð3Û‡S1åz—û¤rÒŽ˟&êèöh×ú'5s<Å ™Í9DRE˨X7ñyDŠX©•Ë{ëþ6?”BwDfÎ}ÜSÔŽžŸœ}nbÌò/ÿ‚™¼íñ̽üsÿDÄ5°açúíŽ ž“²¡Ã}ŒxÒÉ­^A ™\n\äeŸÉÜÙqÕœuï«8Ù¸GðÊ#ƒ+ ÃBœRrç@£g€Ð;óäýÓ+ROÑÁé/Y”ÈÆöR~t?÷j ªée[²tS*$’Nò…ï2cÃÒÖ˜˜/)ÙT5«*ùÈ#_[•XìRš¥Ãô9'~œ’Є´Ù›L=©¨ÓSK¶·)Ö˜ñGˬ?c=Û„®Ûdsµ5˜hâ(±už=ưÀý·ì­=Ö¾Á2Ho/-A`ªpgêhHÉûôIØËj¯éÏ 0ñê©g¹yj<í‡Eø³±Žç÷W$B¼%îo´Ý=UËvçšûæ^¸Ìv©«[(ÇNÛ¢¤ê—×èBSý¹tÞÊsZâô„ÖÀ¯-±òá–ØÈÎcG³IºÝÌ1¸XSS}Äv‘üÓ˜ è|ÉžI‚´yÚ‡«üÈ~“tž{ëòÚÃâïµ·âÄSû„X{_Ö©PKÊ2 KˆÛÚ±µOâ)‚š¿âˆÂ´^Ò/v> –¢Ø8Ïa%¡4‡—EíËÎæ7©Ù7AÊ÷ðe5]š‹øòÓª]mãfϺ Dé‚+R§ƒ6w/”¶ö彯O1˜>ÒÆË=N€·ò¢{ÇÌ]#Bòp1ƘøCÔ :“Ò~% ª©è‚ÇÀEO˜f%ºsÂ÷kÌ7–ÛmЊ] Ö5¾!uL*To›âçߪb¥[“L$“ÎoüÒ> «Ï³õr!ÙŠÌËä•XÍ’ÕLî}Œ·½Þѵ)5ißé ò^ÜòÉ_¸‹ ”â«ì0úþ,Û[ÔYÜ[NWvn³~Eqî>«ÐÝ·Õ•±5·yªAZdP~7Œ°_eÑöKÔí`sæ)D‚úä\½9,q:õŒ¸üý©K)pF‡{hê9GB+ﻨ€G+§%fïÝs+§œ°ŒO÷‹óð²ªè/·èÛÝ{¨}íSÁÀ0¿ÐºÉ²£Ž¢¨I°ŠËw(²¡œ{9¶Š½U}MžGÑùòþðÊK§T$°l…¿Á‡à@Me11ÐâäÂbö­"hQ·CÝ u0z˜×¸TÆg­¨ßzj½íŸòIZåšÄ@Xû#vÔˆJ¹pì FÆtB"öØ E—.¡ø»êÍÝ D™ïì(4©Ø.þâÂùu·ÿh ‡H¢éœ¶<œæO-[:4Q]ß;/;90gñ‰½ÔdÓ_ï_ Ùä56£Õ½ˆ›”å#…ˆ?–ú(¼ûQ%„ëK•w“^‹h (T—Œb¸•3@“…랯9÷LðaS®aÜ3.¹uî´oÙ`äC‹4ÙÞ¹«9Jfr3}e¯Xž'„&|=‘SŒÐ¹óVëÁx 3*õ«ÉÐ,¡G7_Ϊý±å¶:l's¤Ëäð ‘ï•A+ F9mÁh÷ ³9*?ŒnWWœŒ‡µGµw‰ÙP”©u-ì³—ø#ïø{ƾÝ<—r¼²|NZs'eÌæEgذ]G§u$¤gvØiÆg Ž}æ¾Ëˆüšy^íe7†t²ÐT¸ºO@Ø;æ7©fq”rµ–âJ;­u…}ë¶ Ù²:ÐÍ™ž ¸Íh¿-E´#¥›œ?ß+Vï`ñùô)(“¼Ks—åér”M™ÔJV¦ûÌçòèkã«*û»ê2µf!ŤÜ^¯¡Çü=8‚>‘±ï0¢ˆSoM]š•Å[æ3@‡>—µ5ơհ{¾ßQÊCõu8Ý«„z?s÷ƒœø®2“ÎJŒÞcÓ íø’6áÀX˜ÄOOº ¯•b×֛挟Š\{DÍ$Ð-€më)×wð.&?…œ§óQ b‹H¯|fæñe)÷8KVúUn*‹½YÁã‹ HÌ#Ú}yéžÇE5#bCj ¾q}ÓÕVœ‹´N YöæhÊäa!Ñtãèj³Á¢–ÖÈß*KºÁ’¤ä1H÷C…Íç3#>¶¾QZú(º)ž5®Ut ÷Aô^¢.)¯€—1Á¢³7L£7¨Ócïο£zú‡û |eÀ*ôxdŒr çFZõËØ¼¹ Õ¸ìŸ;Øý¼šy¼\;Ò×OªÂ®Î|à¿CKPæc1þÐj6×ñˆf ü€d£ø´ÿíÚ9Üè;¹¢Ü»Lôñ¯›£Ž;ä­o x©0¯Ä«/rë$ŸÄ©S4ù,÷ïm ÛQçõ)¥/09Bë¿nzÕ=¥˜Å~pƒ ùô¨I• 5Dõäï} ½Ã—÷èª.-Ò?ÿ,8p8*Ai-l ÿåò4YlìºÙÚ9Êê.Nt…ï§bÕO f’§ðÒžèì“AiÞ%Ýî¤KU$5Z=º }óM±Õ{%ÊÇÀEh²ö¶DZ”(Twn¬á‡˜uÇëH³Znðô^Õ`•»*†îÝTÄ©¦Dk‰T^<([ ß·õ]¦àÞÆàÏþ‚~ ›™ºäošëÔp°å“_ÅOÞÕwÎLÜqú~ĵ†³2”ŸG½F!Q?[!š8I^£Å»OGìÇÉóœ1¥Æ`aÔѪ¯(ØF›J$gP„J?V’LWÍT\Ï¢k]5= w÷®½|6Ì–öù[ÄýãìE¾g­ö8ÏlSð‚Äó ¬^6Ë$ûvÆr(x(ÖAÍiox÷6ZðÜ s¬9“\5çJmØl÷¥"‚Ñ5T¼Sq×6:›qtž›¤'sÒkOÚ$î6^Ëw›fUÞ@Q«Ý_ꥉ‹­5Ñ:Ôþ¸.:Cã€bÝ~îÑ™:höêA2EõY˜¨ÙvUÃd¡n=×0Ô)Y.\X-ã›~¹öub Ø£UÚÍí„n¯œ™ð››ë•]Ÿ§çØãT«H²o!jÎ$áùй V’‚SSN |gc3‘¦ŽžçÍ`G ùû»3—¯Gј¨Ï§'>Ötu7oW<{lf$LÌž?…Ѻ0h-| Eô¿:±E]¶V¥ëü»ÏÞ¢Y ¨o§‰GË^޶úÄZ¶%óÆã„ïD ¨m§ayFŽvnzš1,ãö Èð&Ï!è´B>~|2-™Ø»E\“ª—ŠíOê¼õ^>˜æÞæÚ 2îr‡€~¥§•Ë`ÛGS[-kó2ÛoÎwL;ÐdÈèÊÂí‚sá÷¨ä óCɬÍIz=^uG£ÍBšœÏűŽùð(%{·qÍ,-jÈ_(±D4éPM·FŽ<2²Ù‚hBD™Eó‰(¾gY‡êLPÆIú…Çr¬æª•*0÷’žnÐvXí|ôjï_ŽBj©œÊö8x¬×2h£'hŸß—ì¶ÇËÖ÷ >IãÃÝpÄÕ¨w´bU0V$úñ©fO š»¢C€RkVú¨¦6™ÔJÊçý@‘4=*·N$þ€D,¼óDµ°¯@(gñKGJO/‰Æ“JˆôJQFÿÑ¡˜ýþ:n½ðÝâN¡†{4Fk£æÚî´ˆú-IÌz õ³)ýq¥±Yo`à OóMé­‘É›Oþåg¹*9ô˜nÈd›$KãeEmK:ÝT[þÝ']+9Ó,cm|ËW A9MeKT+K„Dö¾+Í ðå–'êšw\ˆ£‰”mGïŒìm-úœ3Æ~ASÇ>ÄZTþ:7ýuøýhy”^nrâEâ^“Ä­”£ÓÊ‘Ø/JHf?¢W¯jÍÙðÔÆ-¥u¨ø­¿“VA ]«â¡ÚˆÕ(Û¶¶ßÊ[‰J/>ë¨Ç¯CF¨Zôî¥b@övf.¿5£ˆ„K±?b—lXÛ`8NHäÞõÊ3Ó´‹§PŸ-’¼w ìùº0"±Ý¯­V‹¯×îÿÌC@¼Ý…{da803²ÖÒ¾ƒpc‘þäì!áºoi„%á0øf¨Ø*dý5ò´Ý˜0¿ã¼Œ‚Ÿ½Nqƒœr|ø#[·ùìùÀÞW‹ˆ°n{ó®1XÌ‹LøPLcízBR/>åU@Ib;¿·¸´òŠ£Ä/‘Ç?‹kyT.^Ë@£±¦Å3X£:r"•÷r†›AÏsô›ÿ=ˆ¶ýc½Ç#År.5*/>%?ÌuݺÀvÉ‘{$ö ÐPC´¢jÕÆÍßzx ^»Ædžó4+›ŽǨ¬èz‹Žw@ѶÚkÌÐö Ïß7ž›ŒëqLŠo?1:‡M{0 ñ .õb_ M¾Ø`ëµÓhJVÃR³~;Lؼ‘p=…·8®ç1¼ˆjrUSò2îcH—í”7ôC™+ÉŽñè2ê÷¢óy"9c‹ÕF_ü^¢1v1½’Û`»ÙÜ4†¡ô`\R#Œ/±a±„mó?ÀEÄÇ ~.÷Ú1óÒÓL¤±¾ñšd O¸zaþyvUµ¤ñ.PÖÞ=ÂûÈ.zœfrKt«)¥2z#ZxŠÄøXÖèäêz\]`ó{®åWbœ MÉWz¤a²ØçìLƒº™Qâ65ÂÚ™8мž¦ 1ŽJhks‰1 ª2wå’=O‹².«à4YºsY^Y¡ð\w;¿((ÒvÈ ù¡pãÜ;Q?L0zrÎÓOCWÆp}Ýç¦ða÷Õj7ê÷{µ&ôýlw•â>È$p¡I?´Š÷‘qíäÞÂ\X2ˆèéöy’³äÅçOØ:¹_Rñ¡k{êÜ9±½ñõäÏÓ·Ý|´P . ì¡l×n‚|Œ{¿ßHC( )v¿Ih@Ÿxdû‡|³^ØÏY¶~]'ìtt2ë«'½”ôbÜêïZv´ß%2[µôosxpÑâ•ØÊŒ0 &©ƒ`Ì8â¹²¾¢“OLUeÝ¿(mÆ;„ï‡p{¶ïFÃÍ(¨Ãòd§œ|YTY¾¨²¹Ä° ¬£·}Y:å.ÜÔj™ÅD¡ l°÷yå%ϳÃ$5濘G'¿P!GƒHS—ó¿S6gFÔÇäE"Õ@§ŽCwQ Á7\û’]`*b‚M¡ÌÖKú›-æÜw¯Ï Ö,gF[ú{õ%¹u´vé#HPJ7RªÀÏÙ†o+O~®Ð§Dœ%Œ›Ùέ|B~rÕä?…[–\Ý*\âO@åZÕ†VGÏÛ63±$,Ъz­ö5}™ È.Á$§Ø ø„ÐpüaŸëë$Jwì‡géÉÝCkâÔÛk®¬qLš2³í;¸’9Z9¡¥§‡Òm å„`‰[ìòð(-r>$ÿæ!duݕεJ¾¨oô>•=óZs;Ë=…½ØÁ [ðEîBh#N²ÜsƒÙgž¹i´Jþ{iTÿ¦3ÿƾïciUsIŠfaº§É³“»_G_ÂŽˆ4§ç€´LX£îÅYÒ"KBÖÞO_ç¨î"÷­5/s<8¹sÚ˜l[î”…Å^*ˆÍvî£\‰¹‘ÈèŸJh4ÖÓ:ÛmÜÄtñÍ|àösReÐÏnî¬Û2Á7, s4–>¶HÒø\oÒУ™8{4½$©òãË?ÝiŸªùœ=ŸÀfM6¢ÝlŒlr½ÊÛI^X¨;¶ì¥DÄu«År2WÛ/'ͧ/,颾6k°5×íwržM²Êr'õWÔÕ`| ð€v³Dò+' Уؚu)aòílÛ-UÜ!yqúЃCþ¨E ŸÇ¸6æumxªàØ’'Ò€•Æþ¡Oc¼+~gó«Ÿ¢*¯Z‹ì´#V-mù YÜHà‚A`'--Ùç—'”åÔí~\¸§:Ïúò§¶]ªxí¨.%`+zëéî4“³ö }+ÁÈÙÈ/6 ;*lÈ ¬«y^ê/ oÏhò×GBˆ$¯pøžÆqÔi&ñ~:ÖsGY»wÔ àë ÙZ¸‹¯¿Yº³ô[´ªX^_ÿèèëóÆÖ7s92d‚ÿ›mÙ¶Ðòw’¦Ì¤<×Ô¸Bs ú Æð%Ìoý,Pkix„´_ ñL7-ñaaRŠn˜ªY…Ðà/†âµºMÓj¯;*fî`oI.;¡$W™.ˆÃĪ·f*ZD"Ó‰;“Ï["a¯ZK–ãæ¸‘%æWd<6K*Øyh Í6ëÒðÍã 8Í0J¸K!Új¤ØB}è5¿×y˜%µÎ‡nűŸDy1œdØqäA263+>r(Dvë‹_fRÆ¡¯´šíh½‹óùк0Ä8þ&a&ùÍj×G~Á¡¶Å0Qà‡ä&ï+×êdUN)̈˹l@M¦m® ½K¢Å§“´Zñ³€žY(õ±Æ(äA¢Xôƒ®±QÇ×õµ× ûRûÄ—É^ŸQpø¬Ê÷'×¼2ÍÇMjŸ¼´]å·èU:šÎSYªú¬Hx±wìŸæÆZ?z×^Ò€²’õÖð=ñûÌ% zS¢øDð줻o~°‹¨VxßÈæ†ÿ Oý¬²gÔ,y¯V­å†Î £'ãÈT-Iò½:~ )æûòÍ©[o’¦8!— ¤÷-ßawGÜÈÂ@aÔóõ“‘4çÝXÝ÷Ä•é'r†êïïøãM¤Ìù &Ä•<’ók22ìw1éüB;'<¢Æ"Þh²‰J첬“¹d°U#Tš‹þUýì~59©Ï&}.¤Vß°)ÈfÎOjn6ŸyÛX’Õ)\GW™ïe¶5?°¼ðá1nv7¦B¢àÕ†üަzŠDÝÇž8æ˜ ÀÈ»Ý{ÒW ÔL^hPØJ†ÈÉ3-éa–£ˆ×¾nœP8ESæRB'v·ÁÇI0ßWx";‚ñ©ÿ3CCŒ!1”jÊéÒÖP,ÖÑÍÕsŸ)Ó¶VÜw5w–c­~XÕÝ™m1½FêãÔ"ÿŽ©EÚy¶»Ì]ð›]NùkYól¿<©¦ ¼¾Ç>Þ¿Ép{K©ü"{00¸­&"4Fô4èé> endobj 95 0 obj << /Length1 1899 /Length2 12771 /Length3 0 /Length 13954 /Filter /FlateDecode >> stream xÚ÷P\ÛÚŠÜ‚Ó ¸»»»\h\ww‚{pî®A‚ ‡àîç’½÷9Ùç¯êÞê*zÏÇœã[ÕP’)«1ˆ˜Ù›%ííÀ ,ŒÌ¼1f33#33+"%¥:lü‘Rèä ²·ãýW„˜Ðüj7¿*ØÛd]l,lN^.^ff+33ÏíxâÆ® 3€#@ÖÞèŒH)fïàá²°¿öùÏ#€Ú”ÀÂÃÃEÿW:@Äè25¶(ƒ-¶¯Mmjö¦ ØãJPó[‚Á¼LLnnnŒÆ¶ÎŒöN‚4ô7Ø  t:¹Í¿)mÿPcD¤¨[‚œÿv¨Ù›ƒÝŒ€€Wƒ Èhçüšâbgt¼v¨ÉÈ”€vËÿ@øçp,Œ,ÿ-÷OöïB »¿’MMímŒí<@vs  $)ÏvÓŒíÌ~Û8ۿ滃lŒM^þÝ )¢0~eø?gS'Ø™Ñdó›#Óï2¯Ç,ag&fok ´;#þžOä4}=w¦.×ÚÎÞÍÎë?Èdgfþ›†™‹“†ÈÑ(#þOÌ« ñÍp0ss±qs€Ž »©%ÓïêÀ¿œ,¿Í¯|¼ìæ¯4€> sà뢗³±+vrúxýÛñ¿‘…`2L€ ;Ä?Õ_Í@ó¿ñëý;̯ܺòc0ÿþü÷IÿUaföv6Âÿºb&y--Mº(ÿ×)*jïðb`c0°r0X˜Ù¹\¯>ÿ[ç¿'ðöY•AÿL÷¯Š2væö€ß-~³x=¾ÿ0qýGÔÿì à[(Ú¿  þ£=ffÓ×?,ÿŸ·à¯”ÿâÿ]åÿUÿÿw"I›¿üÔüÿømA6ÿD¼ Úüº ö¯+b÷Cµ€o´Ð äbû½2`ã×%±³x: ;#3ûßv³$Èh¦ ›Zþ-¦ÿÜÆkPÙÞôûÅóšÅÌü|¯»gjýúrq~½³¿]ÆÎ¯‹þëzcàëªýïv¦öf¿w’•ƒ`ìädìø*‰WÄðby]^3 û_š01ÚÙƒ_S¯œ}æöNˆ¿/š“À$òÛô7â0‰þA<&‰ÿ".¶WAþA¯‘ò€Iáâ0)þq¿æ©ýA¯yšÐkžÖôš§ý_Äóê3þƒ^g1ý/âø^ßü¿Ï’Éì_Àüd0™ÿ ¾Îdñ‡ç«Óâ÷[þU B^ô/ø:›Í!ëkuc[³ð:“퟈ך¶.¼¯ËÅd÷ÇûÚßîßÞ×zöÿ‚¯ÉȾ¶vx] ûÑcyÎù_ðµ·ÛÈúÚÌý_ðµœç_ð¤cêâäôª­¿vþUWÿÁ½Û@w )✽)_°U]pÇm¡Ãö?ÌiÚ­6+ÃD¡êcN‰ëa¦—‰–ð¡ÙÀç5š”Û:Å Ë­‹C}2ê¤.K£$óh–#Ï;b ‡elÑ4§Ü‚H³¥ì0R¨æ!ÁÄ_Κýé é¾ÕÊŸÄÖ²a!r‹³ýSë.r©2º“ƒÁÔô Ï[G>”1®æ¡mïkR0¶$èp³h|̃ò)l>-ßP‡Ìj±êr§Yv¨ /ó·ùkc°±¡¸‚Òª4P™w‡àŠtn¼<ÙŸó/»ºD©«£ìb0£=×ë—½3 óîOY˜¾6˜¦×F‹yºÙnÜxW»oèËÙÚùTzvØr¯ÏcÄFÛóH³Ëº#ƒcðÛ"È+—6¿„_“T@Æ™A”*æ~¾¿ À´ï€`Ct- ˆ¾?ô|:„Ì(":4x”+ãðiNw[på A .пœ ¶¥*ù˲ۊ0=©²5͵Òb{uÑåã¶maò`l„€\¶'’¶”„Ñ,}°–¨cQ±U†ƒö>Fwˆ¬_µæDÑÌÔÎ#w” À3ò”íf^±Y\f  ’êv’¾˜¼Ø✉i®ÝŽÂ5]h‘“ãCn5}Êì[7¾Ø·ÿ é¬OœTHyjÆzÑê­Ø^9#-x-îs}¿ô)~@'µã¸¡–ÅêCUE)*l7‹IWk–l¹±·Q—eL‰‰M¯›NЩ©.³UÒY6—Ç­"Vš%¾ZsH>ŒŸ¦Ã3ÃôùœÀøaÎq€Ð†ÝSsÿrÏNõr½›Ø0(\]O é韬bl棉JÏ U‹]sf›üøÑ:—Þ Ú$!ãÌs´Þi4„ÝPvó sùapâžå”njcæ Ú‘Vc눃}–øCÖç¨.wÁóyéú{]R}u‰›^« ÕáH_&º¤­-Ü@FúŠ ÷–§ör‚CÝUNæ'i2Í_ËfMdMþ|fìùêEh ¼ô›÷®ØïLå>Ò.ÏñÑyNâÀiGWcz¢Xު̬¹ ;špn³ÄÈÜ·NÈ¡S…¿}ÿ/~`ÞÚÄf%÷;CaÝbs³JixeK¡žÎ³Éð%(wû­µ±ü¨Áò]šú¤2‹×·,l»ÜˆØïÙ’‹^&êcæ°¡?s+½"ä§©Â{zG´?ñlޝßÿ:i\ ÀZÜjPÏý1l¢ê–1³Á‹F’ l=Edº@ˆhÛ#&êÅÃõx8nAõ Î ï,j絑sù_8‚ƒ×Íï}z0w¦’hjB¹¡ÕTg´“=Þbòg97°Z%+tlµ¡Sö ÔøÔ²î%8Ô[Q]&fk¿¶Í< ]]#CM‘WÊ™îï""^ >~}T·Ÿ(¤%Âjù:zïQè¿ðÎ –"]c‚ȸؿÎÿ‡ ë6^¼OÍ„Ãü:RS^,·/¦š2ø5PœÔ†N ä·à3ÿ •rÅÃPV}SñÆ ûå‹À)ñ¸Sz»«ÇRµ¥m¯´ÜB­·ÞÕ7¬F…Ã6zÚÆ/‘®>ŒåE<ÅokrÈ9;0P:û>qPœe¬>rAÌ'†š5¸íÑpKcL%œ=¾£ÌÖ¢ áƒÏ6'‚n «Úü?¥ubj¡Ý]1;±|ü·$(2É3M°É¨=­ÅUTMÀ|õC¨ûV…-_>Y#m)âß°WÎÀ²ß¥_­Õ/¿X‰ÐfYL‡©”×Ö!PïòÔ¨ h‹9˜ì óÝö‹Að÷©$u©£óCîâ&ðbœ "Ó:Ú ¯ªBà0¦Í•àµV¿An–攺Ü1¯üбfJ¨¢ªæ¸Fþ:]z×øýB@-Ú¼Žæ‡r“#vílÝ1f—1+\A‰Yë:ÿ:2íù¸®¦Û¼¡xÔš›ÌM€B˜Í½º4ѰÝô³Gæ ÆààË£sˆôrV¤}é„·>) Z?}k‡Ð³5`E±Š*™ I껋pc(#$ßД̛ƒIIÏ$Šâ.LrP6óæœîŽë¹Äˆun>µÒÒLõ´”÷K&ÉÖ‰Õ:µöîßš¬ªNRÝ êÔ:Ó ô<iìÞ µekîÊ6á“ÜÁÒ‘Z‡äêâz.™§Õúc¦Î›ËЮèšã @*`â²ÍÐPvœ—U¡':–W5)QÃtë1| ‹Æ'É>”íG”¦!rR¹‰k$Vá¸)ðSÇ3‘÷aœà°Æ<Âû% â–¯ôÌ…ËñþŽ7yž>_ÃW^Y(¾qhä­¢XÕŽšÂÍwÐéw”EÁdTŒÁÉ_áÛÈÛçl´óVï´ú?‰pïEQ\Ìx_d“5KF®ŒE¶<ì/Ê'òú!š©¤ÈÊP4µ¥ôë SÿÀõUuÜÃúU «‹—àk>‡ÅCŸò™³þç[C–û‚_7Rûa‘=ŒËG¡ x¤Ë9‘Ù5êÀMù7­“àö\R¨S8Ì“£=„ü϶ÂÓ´¸qêØ¢^XZìîtäŽ$ Q|cÐ>‚à~ÙDN‡ªàÏ«&ì:˜|òîcôJ5­ ³¹eŽ-§.Á]ôƒO£;'j!ZøÐòì@ :G7.Ak (O”ޱ… Y{»ZÈS^SÝeÚP0Sº[“=‰¥óúóìïN0´ûXûÊO ïWô¡ŒJ |1ølùã€Æº:³„Àm2+ìlðöÖ]ê…1>íOéWhƇ¨«êMIlõåŽo(ôƧAªK5÷ÎæI …?ôlýM­YìkévüàÃÆvÖ ý{%ÂLN£èŪ/û©BŸ´±e 2gÓ :õ–šú¿¾ü|PÚ¹&l´9™½u:šœ­ªÎ2ÿ.6[[6תsã:{i ›41,’KŠN½ ¯°…?†€Ž}³gP9õ])¹Öfeò›‡ÑU©'‡Dt¾'Åsà¨éñ*ó¨µZ¤ÃÇN‘3HË'g¤Îp#ÙñÄg먎Ö1) ËYª=!œ @Öz¡Qò§Maž(²4{=aùDcõT}U0Òšgwõ{ÚÞ_|¡ SÛ!‰öíê&?Wº9¶ª›»;Y“º?ɹ;²õ­5—WfîÇ}óžÒš§ g.Ø‘ˆ®nKbiÖªÎ:!›î†:SlÌ­gå¢_Wd@ø‚¥0Kì&¦¡xþÐäÄå'ë¦m¯5Øý©$û̉\¬àãƒP›GEÜR”_›Îyg’ïížú(LÕü 9Èʲۘ“#. ‡¥4ùn‰#̼ãæCöË»hx¹t†&Î18¨°;ËoXºÛ;œ÷„ã‹1ÔOìpò}ýw^:±:‚ üˆÔ¹Ç)VÆ%eÛšv÷•íNT€‡âî|è"“¶™3þú~ØÒ íš,XÁ·7Šê?­5ÀXjæûKê™Y"mc¢pU˜e«©(ÆT©Yîˆ?ÖRý9©}Îa×¢Pñ›‡þÚœ^Ö²3«£íɳP6ã"¹¦û>¯ëkõVö@ôОœ¾%Šù§³èë°]Ö‡ë_ÌÖÝ{e,%†‚J‹ôôê =>(m'2Ç™¬+øUïPŠÂ ÓŸtjR¿'˜º7¯!Ìb`]©39u?“VŸŠ|19è*hxز© ´ñ¼bÎ0öuÞMWSd—ÓkZ¹Ø’xw®j7ý+™ü`ÃúÝJÎU‚°Zî½·,ÍË•´4!,¶}Ò´«†8?ÿhÊ©~aæSáIrûYBÅÏÕ}©oC½‰0Íê{2 7QܸìL ÄÞ5ÍÝïrŒ8 a aâÁ(XÜÖ#$ ü=X~“»ä¬œÖ7ˆ›9xát$|(™ÐRK~~žÜè\jNT¡uÖ×[ã›ðÅiQÆ þá})o±ßÔ½Ò®Lª’¤#!ƒåø§j™SG½'gº”HhÖ¿m£K&ƒR”r ÜëŠÚ`¢Q~î ¼$¢?Ñ¥VO+ñl‡ŠøŒáåé!mx Ñ ¸F÷~Ö€iÿس–Ç©f%º¸É-"¼»-ÓO¤{å!ž´Ð g«Ulø.Á$Êø%ÅÛCÆh­²dlìm<èÜÉÀ(ûIÝœmXD˜jÇC¸ó÷çL ,ldOŠ=ÓÍGð’;Ròå5Ý.-WÓ©ô¤á­ ÿ‹«³’kú›ú%ëï©fÚÎ÷)Ò±µAfÖZ\ÛŽªÓüC$îHW Y®áÐR“Ø>5:­'ž¦é³WÕ“ 4 Ès[͹5ê ùŒ”M-‹¨²7ÏNLµhÝT,’ê>úçlyk%j”DT -1:b…I&w›-Å1t"n8rˆ¿:D•ñYœ[Ä6ZNaü°ìÏ· #†úêáé¾ïÓ\«‰„T<­ÖC¾en$ùõ"¥y3ԘʣC_5¨Ccäœxúc`@f½Êß„rÍUJÑ}èÍ®]‹ì>h§¥ PçúÌíë÷.mz}°Û&¹›§‰´n ³ÅRö¡¹¸7—(ŸÚ*æÅd›WÀMHo:ÈŒ9ÀlÓ|ZÓ0îÌ¯ÙæQ1Ä2ô+”–ô£$~ÐE*CiÿRý†Ÿ§=GÐpÑòçz³ (t ¿Ä‡ª~ìÀ°ƒ%…·~ò­ŒBÌ + ß7ÕŒÄ!¹ê…¸%ü&EHàºæÕé°º–’Q(Ñô;£’;…{‚û.Æyì­v ~nŨ·œ¶á s=YÀœý•g±VÐÙØ(ˆwV«ƒî:U®¾£ûqNÚm·ÌÙ1L½¢Ë2ÓiñàB>‘ŠWK'òKGz<`Ó¢¼°QÞL0:" R.Eøí»Þ‰š"/w^î{ èýâ5x ¡Uš­YUÊ©‡Eûèfÿ´=ÁHN”Í/C¾4iJ ˆŸË†´Ý8Æ™ÈG7¼­ÓK©øLx«²Ÿ»¤ZÖI†®{³‰˜®íßY:L©ïS~¹Ø~àšK-XD;q0]z4ÌÊnÙ±wÚæ-ÃÈáÒk¤¢\ðk.Æè¼,UEe¨iŸúî{"^r½AIÐjp ¶ÂZµ}81<‡­‘иª¤B)Êz¿ÿó÷1‹Í؇óÅ5H;¨gˆ.ŽA4³ŠÂÖøc¹/‡˜ºòˆ-Ž ¢=MýÂïñÃG8÷É´×'âî%pšeZO9oédÔ{)Âbž'<2ÂNßH§8€Zw^4M-³õñl¨–Öò$ûWx[ûЕ ÷)Þ G“‰ó–BDa@„PÒ@Âaãmf*¸'> ‘Ê§Þ õ™aÒÞó†Í1Ÿ²ês¹Sµ±; U)swÐ1B»rg;šð_ÇÖëË«„2ŸÒÞ6É'ÏÓ5 íËg>î=‹áWá£A§ä úÛŒ ŸNéùâ«ÒáP¸öÛ§ˆ¥/Z„®Á?{Üäîc-yÛå$Ò²¤äÕ”ÀÞy[ºF‰sÔ‘ã(ƒß½¿Ýîj`|#•/q¯&;©5šòöªšÆ¯ªRG3ÐøÚD¡~/o(#/ˆïâ );CåÏ¡µ†R­ $dH ‡ýQnz1òK–Åú¦ GäÌ¿¡¢éÇQXÈ4jÒ¯aZÊñï¸‘ð¸¾æØ¡ X«ª„édÈ+ð²‹T|ƒ+O¶ƒ£á>—¯õ,Z0šƒü é§Ó°ïüNÎtçÆ¯Þé%¤"¢æû7áB´)Ó ¶Aê]mœ.>ÃU_ë ¿L,È&ýJ×Sú ”SV;Ë—£÷™ë5¦pSå‹ÿÁŽöU®=»!n¥¢¦- -©Úȶ"·ñ"’ÛÌuV‡h=/JÒò,$ïMºÉAWIs‹6MMäP.t ò £Ô §ÈM»éT¿ìà]‰ž°ÔXŽãWGRÑJi]¬%gƒ×øŠ†£ÉŒeªSîv•eõÕoS‡TgäÓ'@Éf6gÈM²$iÚŠÚõû¶¼óïRå²íÌ“¥ØÉ>¬Sí>‰ÄÎà¾=£öIËxÄgýb€™X˜G6!lKÁ` »pÙª?âë0GÃS•¹*[y…›¨¶ä5…EjK4˜Z(ì–h±œyÙZ¯pÅÞ/Có•&Økz"ÊU-ääÛŽ¼ŽgtÊ~}K½]Ë$Âùö˜¦ø’KŸ,Ùkk{\SpP£$>Ûr¶Í/ãۈňíŠüè±®úk² ÞÞ_ƼI|Ÿaµ0mèK=®ÓŒoø]T–êá–Š*Hœ×œCÕŒéc’–ý¼fYÆÄ—4®šÕ°Qü’S8Ï…µÁƒîäcÖ‘ºÄ`ž43 ß_§ïz¿²ˆxó°¾Ç̽½V€hsŸ1[J­e×í[@P/t3A$Cɱ•î¡åh~Pâ^éHÖ8¸'°4Øóˆâ` @ü‰êãü]åüy>kÃ'wk ü M2È"çpzÊéæûø |)ƒâ%}c¡€ÿ²Äʇ ¤.ÎØ7ŽéÙâcäûtBŸg>è,„c‰YR³IB…ÎÓs&œ¿«ÄlùBÚÎÿ‘,Õ嬖)9hùI-!O9¼>œ7ukš ñý¦‰wN"{-ãæߢže~mw£¬X{GUÿ$a_ü9î¹²ƒæ›r[ÚP9ѨVŠ>7n‘øüfÐð±ò!·S÷i®!š·v+œ.L!dk  ­ŠÛˆÙÔnb4oÛ- ÓFÒýð"0's#¶Qð'ËOxåÃïÔ,ßZId† ÌòV+ì¹e|û¤©vR_}‚Þ’öAœ=(ëVb6ÂÐþ²bòŒäË’»ˆbhœwµåbâPÚP,.ÓßÚæ&£;´!è¾”èkp˜–mλr—ay›àÏ‚’´ŽGBvk׿_èøÃ|bùk,¤I¨ ‘­Ù÷›,èóˆBzåžãM Ûû7A³åß*cŽSÕãd=˜ÔRöËQÃI_…wË5\UI"SeÛ@ W¦ó½ ù@_z£ùU½Sª!g©iÖ;Ö½Œ%%‡nõ0Å3ÓÕ±©1ûñl¹Ìuó½w>¿£á¥0·«‹Ýü‰=5¾þÖÂõÃ’§ë©'ò£¥n†°f©;Z’Ýò$aMÄÐu]”¨Œ­h¬–s—Qˆãq–å“×ÎðÐøQŸ=á“úËO¹óÕ <…Áåa[iád©ÂM»°úœÇ· ,N‹ŒA™r5Ç-sôUFzã°öÜŸ\cß Z´„,Zï‚p5ÒÜŸM}âã ù‰¡W‰Õkû´³³•¾Ï5¡†Ë+bJ$_Œ­“G•Óµ×úßd|:桾Q¥*4ÜA£&n/Gì)EÕ`Äã7KÀì¹>·ã+¹ÎTNK‡—¶¦ñprciä'“M¤r _&L\‘%Ú+h§‘~]M”@p€ ‡t¾%ý Ò€+mÆ¢/¥æ)c+(‹Ý¦dü@óŒ»è!‡ëÒÙuMÛA˜äº“B®×†»½i°­áøØòn?ØQ¯ù|zì›à}„Ò9í«úÐÓÊŽN “{c+1ê.M cè¶wAÞÃóôL¶«,Œ³SðÅú¯qÿD ¼¼`ñ´Ž&”i'µT'°£Xêv$ðÁ¡(q4!­Äî×0ª|÷YOd6)hÈŸQó<-cMÊEàO]ãüˆ…©sRëÄ…<â~µ_hõu·‚úœ¦eÌ`콑"EŠKðQwHšÑZßóðÈÊWm %F׫«†Nô,Ð{¤7ûÏ#›ÔßÛ½\Aù¼àƯ‰@ÍVÂ/Œ#°ÿŽÿ?؉  ¸(´§»dÞ‚†×å¡7øJXb»àˆw’ÅQÀ›]¦§;‘pwî75W°2²mo!‚;FéSڈǷ­' 3Ïœãv ä1’ß=Ï%^è¬@i‡)A+sÒëÑ_=œÛÑÆ Óñp°«Óõ=úPÄL¡XNÌñ¡A*î¿kÀÔP˜[Ãõ¡þœ¨Žÿæð-¯ŠÌs’@"…eöË™\2ªŸÐjCM•GÃO²Ïå©Áµûm åÒQà6QsHv•Sô‘7m¨æò{`éVÒûÚŸ*à\òÁbm™ÓRsÂ+ŠC_:”IÁÐd甯ÄZàzÇyjù  ák©å¹]˜[ÿëî¥ö¥Ÿ’š$÷‰'lâ'˜‹4ì;hßú"œ9èjhX®Ÿ‚Éî2Ú7×=éf¼.÷ÝϽÕÒÅ”ë_9 ¢»ú‘QwПª‹ï{õÆÄëF­Ù¿1Àî$åFEjå˜Õ"L¿Ýû¢â-j£*õ«&¦T¨ù‡vÙg,©¥÷Šë(ôQà+UG˜¨)™!ÒŽså:Ü <“õ ý‰¼„w&ÍŸD-IlJ ·ï+Žxh&C¬==d9¤8Š:ðèe¶‹1Jq$…¦}‡Á‚·µÄ+&ﮌkï£\|ÈZHðãåìFMµ‡›‹š4·îœyº1^„œ+­föeÇ}ÂJŠ$(.¸]B6;LÃ&õ°OÉUì¾ÑtÌBié©Z—®¾X}ªP`}ˆãÇñv…ö={°UC¿72iCÂÅS?h¤ªÉ¡DÉVI’3)"˜j>=LÚêèâ?rÕX [÷)à?ju*m!¯j Ó.ÁɯÜÒmˆE Á•2…__+JãÒmÎxîÈ·è&[¸«oïÖ5‘“m€^Ù9¨-¥´3+}"”*®W¢Ž¸0ü¹Çݳ²0°\r…kègzÅvùÌfE‹’ m.>^èÝ‘‹¾:)ê [”ûñäNóîséZþ$— ³yÍ!×ÂÀtB­b|¡||U-6®¹äÁlf>J÷exð%Cþsýì”Ü›ÒSK;ąñ‡R°0û/OÙdˆ…ÔQªÇXBz£LÊ®ËÓÖ±“¿+ýêÓoöS6FÜt—AL¢Q36§’Gb,.Þðý†Í8艵Y>Öû ?ûô 6#2ç„?–âBl"H46?s›Ç~˜žÜ˜Ûë$~›´‹öÁ±d´sÙÙƒD¥h í3¡ÎQñ›uŸ£üï×ÎOèå±û2`M°šÜ~LìIø¯}‚¥ÎêÝná6ð~ø>´žè¥2VòYxô¯Š ›ÏY”¢´ÿ 434zÃ!§e~)m›mwƒ[ž.½Ãh»süâØÍ\ϰ;Ÿrê‘öM8žëÇÃ˸/‹çV!î Ì\ý鉉r<ÞÅÒjn˜?„ÍôÀh3|¬HÔ[/9Aø„Z6hõî=´§ð»i'ÃPÒkÖA–:§õ‘hFïÛÈ,Š!~Êq«ü°˜E•ï‘ÆÒù“6'f8´Qà§ä7Úåä¥{ä’õ˜û²ÄÌÔ>:|%3p²o{{À´„(]’æ€NðAâ±1&YüŽˆÄå늊讕Rwj\j–Rµ †qw‘ÒB¡±ïV· #ŠÀ½]ÔZ¨Ú´äc.õÓAL^çNm"mÖÕ¤ Æ¹õêzaÈ×C#ƒküÈÃyQñµêG?Èò.±’7둊80Q¨L¥9Z\;–f%c¾©ËêÎ2û`( ø¹"©¯ùòð›´"쥤}34Þr叨ðJ“­û/HLxo¬ìHÉÿÐ&‡kÐynÅ›þó$j}}ÈP1<¼œ®M0ë­IŒœLË‚Йesã$ •’†Lú1û ~¨”ÖÅÉjŠò±÷ ´•+ÁÏ/XMeLœÛŸ<©ÝO.kÌÞã”pmX:d–m¨ãg¶Èt%úÉoÂz‘y¦G¨}FÊB1„œçD?xW¥+>Qá˜~ íV —¨Žm1CмáœS›kúà^‚ Ð¸CÏÔõixXüÈJG·~…êö@)à;D˜y S¡»átŸˆ`&ÞŽq÷…§Í…0Q,m¦ç›]å #¾n+Ó›•«cÆM­V"Ó•<;¿íë–º‚ÁÌLö•œ­Ê1ÄžPÓBŸózwHÛ•³åiaü“µÂÇ&Ä0"Ú26=› NAêÉñÖ¨‡¾×6üBÊü’üc3ÔbíŸ#¦²%‚¢iõË7èøƒÀÝÙ4*7ŒÜÚ¿YˆÒÒBÝIȶlýôC&Ëï„Oo°}øÃ£v—;­ï„M¿D³ä ±°ó9¿…GôÀ£äKûµØpßä¡‹ÅÛ“OcF•+…Ø-Yòg+~sF“jw¤&gׄ¹@¹:|‡›#I”ÄdÞ1©ëìë…\·s0U眕œz¸­¦gþ‡ŠšsKú@x(¥ÒÓ‡‡ÏpÌ}Â(oÈÂ/Es¼4¡­.4=ˆkJ@@ÎݬòÙÐÑKäŽSŸ}et.kèOóT¿7Üí7îæÚ 8ê‹BÚÁH'»b½aZ2«ô®µýàåÛ¨fÀ‰;í#&áh_æ\&B^¦únà  ]à©w@äšÓÞ Fè¨  G†ÄÊ·£¨†¢=~á:BØ £3¾ÎüpÛ8|kd5œy¼3*”YOhÚÏ@f»’âtªM#HÊ HéõÁä;›ì¡ââî²LÃ/ĽՓ–pÿ\À‘µa&²þ S½O¡‚£iï˜ ³ÜAxçþk`¦Éǵf•ªÕhçP˜¸¥[±Gg=_nm¾àÝÌüí—àpÿ² Ëœêfê †{*؇q6‡SWȡёJVyÝ4 ½º3[ÊGj݉Ì]!58W•“ØoË˜Š¯ }N[|Ò“X6×8A¤£Îlë´­nlÖ]ú-ˆe¼®Â~¥S„U¿î6ç°'n-(™5õS¦ ¤èK.L†¥j:@wxÖl‡½³LCã~dJúƒ@’H8«$<4åSÜ¥&QW f=é˜ ƒx^QFÇ1ƒ²/ŒŠ žE— m Ê™JÛ× ši«‘™QË»˜Cúù)ÇR»$óD}²M—þpöÛblN-½G:ÓçC‹­mc¶¹–"ñuÍ hH½k϶ ôáj{Ù¤3,B~¸jA¥qT+•†gvµÒÒûlüh “Xê›™O•;<‰kXSHb2)žš…;õ¦6è×Ãl““ÚFìë<—,×6‚,À²£¬Ã0›ÄužP©N¦³íÖ<ê úi˜àÛä -q]9iž†_ÓT|0¹ H|Å­ëS÷k_®äÏ]yï¾Ø‚ƒ#ö¯dâA„(xa”É~èhÑ+ Âl^|õÂÄAÝÄŸNËš’™5æ+ ½éÕøŠ!æÚ(+«}¿¦Ðà)`èo¹Å«„D‹Ž™æä\äÎ3´æClp+¢¸úà¿6Žc'ŸÞÙï“P•k+¡ËQbòm@s‘éçåͶz¤r“hq¾8;hòFd~CR‚m‘vX™$ëW£ yªÍfA`‡{„ã R©‘A#m?‘s’Ošw¦9÷»ÄÔn¹ƒ`Èv¼£~ž…os,? ~Ô.‰\íκkº’ÞÇ÷Ï?¥ ”f½Ð'sCS…FÀ!,-6 1Âø¤)d»;V¯Ï§ÎòV4ò[>9cø»û:Ÿï!3¤\Ÿñ+PIÐú>âMv‡üˆC¤‡ÝKÙH-êTwJT`õßr'u-מ…‚ ­Æ04ŒÐ/Q,²ï·Á‡ÐOD|ÜØ–uïôDùg©DC TкûNš¦ž·ëŸÅç@ø¡hÎ𤬻è`•T=¶#ª:vŠ÷GA·èµÃýºt±:ùÏ(O6í–Ú;r!+?”œ‹¿3’øÍ. [n•ãï!–;’B»¸¾J‘7ñ{]A3ð†,GöcpÑ|—«u=1HÑÇ„ÊÏýY‡ÜÏËÉ4@H/±#3Ö*ôbp>LwêoÆã“© ݧ™T±îȶ§×¤³IMéÑŽÌ­FûöbBS Wù;B †)(…zýâôH)ùæ¾,[gFë%"Ò‰'«çÁ?Ï~¼%Ý䈕~Ô>Ü(L ³ñòÂG„8æ+Ü4l¹U8tgä•ã¸8ÃÊ€(×tS~5 wºMm—_u]žžÂÏí¼üõG¬zHÞ‡^X·5aôsÉX™' r¼È~¬©{p ´`W>îöÛL‚h›•k“qÞ´®}sÒ'\™ª×©ð5ç¾û0-{º I+]-c{,/§×vn*Ž "ˆh‘®ú +ÕŠõGUÑ2nò¼dìµ;¯iŸçœŽQ´{ã 1€¹×Oï'!y_åÊ®LÁ˜ú (˸šC "ÇÈNª'ƒ¸d½è{Cˆ„Jõ>ã¶Ÿw ëËC¥à›ÖÙg¹£r/Lœ>M„¥ÜœÅÉv4BI :ÛZê †]€öSJ,ôYÃû°A]l¿æò'¥çU1«ÝÌm4ÞŸP? LïÒü÷`F-bŸÜ`ªúÞÈ@Wí ™®|NI*!†v~y$ ›ð ‚–š(DóÇlÓ„ôët§b’+;ƒø®íäÁÊ̾hìNuÁyMb__ÙÒ†Ž­(‹xÒpaŒ‰«& â]®x†&³*Çlޝ96˜Æ•,•i­²UΨDõýtf£OÞ£ûŽ vv‘Uɉ†|åÜ'Œ$ß3½a„‘$çcnñ„>Ÿ–F|–è¥åYISêìOgß´©ïªNŠ¿à´V7úäAt·I~DñF‡½¿> Y2/\§.Œw‰ ŸúÊ*)NùÌ~å°¨äÍç6¡ýô<Œôm?}Á9Y–ø<#pïëà”0˜qÙŸ??}…Ϧ²l²‘ k£—×ÄðUMÉCýø`™€©óç°Ö7M @Å…Ò= Ó’kúÍÞW[29‡~­e} 4HàhÈS§JàM„®HýÃOí¥m²ÎQ!9;¹{ÃiÕx%hÔ¢ŒvèéÃ^òò!Éá+ÌöNwX÷§­úoQh·ßí ˜ÆMeçŽNP(,*tc‰R„Å].9åC¹W¾}öM4P{6Š9Ø’‹z&Ëéhqûù¥•_lÀ­òŸºKÓúå-nø²Ný‘V %[Î÷_z]ZÔºs;ìÆŒTŠDô¨—æ²rèæ8¶1ÃOìÎÕ[ê-bÜiš¶TìoÑ[¼ Pë!‰Ï¦¢©àœ6oÑšÒãøÚpRí­Öâä_ˆ° O5jߢ-¡ÐÓíNMœË¢½¡†¹/4µr.ùD¶9U…6Vp;Œ7Ñà+ߌ†ú¾¾ 74§‡ëÌ**¢K·ì#U®qÀ9dWêïéÁÑËB*æ'ÿ©1ð¶L'2³CîÛ›@2i§J ³TË·ÐD†0Yßya¾¤sFaEÖ3„ÅA‘.n|¹w&J1áUÒäy¼Ÿo^;êéê«^Ýú8±I¨ì/ÌøýdžNH;Úã,‡JMüp€“®MÙjmÿŽœhÊÇðþ<èLbY;+ö Wéq–Q" 6‚VŇË®4¸Ý{n%,GÈÑ´`„÷´ 8ZýV}?ÌM²k]·Ç_ ©mÜ]2ŸÆûÃLÑꢲ¿8T&Üè¿Éw6n:´Cï|ÀºÀ‡–‡1‘Kâoâ|ßXßO¿ü|NcE%ñÿí†K± endstream endobj 96 0 obj << /Type /FontDescriptor /FontName /ILWWVQ+CMMI10 /Flags 4 /FontBBox [-32 -250 1048 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 72 /XHeight 431 /CharSet (/A/B/E/I/L/M/N/S/V/W/X/a/c/comma/d/e/f/g/greater/i/l/lambda/m/mu/n/nu/o/p/period/s/w/x/z) /FontFile 95 0 R >> endobj 97 0 obj << /Length1 1465 /Length2 7022 /Length3 0 /Length 8006 /Filter /FlateDecode >> stream xÚtTÔk×/)(J7ƒ´ÔÐ)’CH·€ÔÌCÌÀ0tIIww ÈHH RÒHƒ´ ¡” Ò‚|£žóžï¼÷®uïšµþóìÞ¿gÿöÃ΢£Ï'AØ@A8ŠO(PÔÔTÂü@ ;» åýKMÄnEºÁp©ÿå ˆ„Z£0:%kÆO¨»;…‚bR‚âR@ @”üÛ”(Y{À M~€:u#bWD¸x#avö(L™¿.07@PRRœ÷w8@ÞŠ„­áMk”=ÔSlíÐG€aP”÷¿RpÉØ£P.RžžžüÖÎnü¤,7/À†²èAÝ H(ð 0@ËÚú?;ÀÀæöG¯°EyZ#¡ŒÂ †ÂÝ0îp Àè«i´] ð?ÎxÝ @_ð?éþŠþ•ÿl #œ]¬áÞ0¸Àæhƒ4øQ^(^€5òËÑÚÉ ‰·ö°†9YÛ`~wn Éë¬1ÿ‚çFÂ\Pnün0§_~¥Áܲ2¢ˆpv†ÂQnD¿úS‚!¡`̵{ ü™¬#á ÷ýK°…Á!¶¿@@Ü] á0Ww¨šÒ_.Ñ?:;( ”–@]P/°½À¯ôÞ.Ð߯ßj _„ Àê³…bþˆ|ݬ= Òêïû¿ ÿ–ˆ°ÚÁàDÿdǨ¡¶dÌð‘0/€Ã=Að×ï?§'zAp'ïÜÏW@OSUOEçâÿØ^_LM>!Q @PHD Ž9øÿ;Ëðÿý·VÇöWoÀªÁmAà ˜Ëû‡Ç_´àúke¸ÿ.¡…Àp àú‡úæ@Q óüÿ^€ß!ÿ7ÞÿÊòÿ¢þ7rwrúmæúmÿ?ÌÖÎ0'ï¿0TvGaÖBYø»Cÿ¬²&swþo«Ê³òp; ÅùEø"ô07Ì Ñ¡Àöˆô÷,05œ`p¨ öëÅÁDÿeÃlØóª¸a&öÇdí†YAÔïáþ’¡˜%ûwÊp0òk…DÅÖH¤µ7†IÃÌÚB ^¿ùà‡#P˜³?À$ú5fqa€€Ú/ÕoIR `óI(°ýGĈ.ÿˆB@€€×oñ_Ý‘HLË¿‰„i÷où÷c…zAÁDó3°t¨CmhëÙ+yzO¾õQüýŒ3!¾Ñ焨^åIËÕ$ýÜœ…GhÐ| È¡CKÁõ,ïãìwßÏuÌõÞ"'|Ì -;f›„™ëì©dßS†{3¤MX…Æi LReÈ^,Æè;oo>„Øõ곓úqÖvÏ%{rP¼‰«‡µjµ¿}õ"GƒŠAÒhwMÕl3`°.zDÙ¿æò)Æ<2]+ëÞ#™ös¢$Ïê;+ýƒ‹w{;£ƒÔ=‚׿±=CÝU–`P!¨6Z,º}™_汓Eæk£B®H¥¯YÈ¢GC4 X”Ò¼Oc~ÉJ`âiŸL´CCÚV”µYbxš~.,Ú"‘ž?u/Ü.Ê"³Ò{ÚÞ<>8I}:¿2øÙ‰øíx W«Ÿ}Å‹ÃÀ€!yýh‡Œ*°)¿qt†¼°‡ì¾'H|Ú¬"˜.ã•×ûü0£=LÊОÓü:ÍÜL¡cd\@Ø$L›qí½Î Úpƒ2§…ÓQF­ïÐí3„Ö%W´·CÝ›˜™p娥+K-¿ §‘ܸ tË'6ßÂñ4#ë \Fî´)q‡”Ç ÞÇÙÖ=kù@¸È¦|@³W²Tò"öéëQài‡h¥:ûC\ló1»Ëâå$a2Bw3‹ £>„sÐLP]áIý½ù¦;!ò°HM4Ö}r.ñ§Ž$EÏ<¶§gu=ä•™õ›ûiç}9Ò–¿U, „š/DsÉ«¾«T°%|¢-ˆ.—3J.œ_C¢¤FèªÚ¬”jÏ?Ç†­c…€¾?1/f> °³ß©¦„qŸkà.bÐM-ßþ"‰Œ·”©,y³TLRI ÈPN»V°–I[¦i<ãjŽŽq{ÒíË€Òà^¼?n«§÷ ¼#þá¨íâŠ/’Yj bî_3:P-R³'™®ªÄÊÀ<ý0.àflmrløô0]•:Cg®ÈÉÓcÍQÚ½É}7¥ iI•úÐNËi˜F›âL¥Ã¨ößq³ñ‘ ù{KKR÷ìºôàãÇf‹{Fvrû0Œ›Ýæ$ëbCÝÁ~ ØÜaÃðHZš^ìOj Rý¤N:ÇËáoà{©†g5ºZ;0ê&¦•Ò°!©Š /”aSPf\JÆ~ò–qª_{P·8ÑêC¸iö,G³-Né¦$ê6Ý“*±<óè È’f)¼‹›‡Ú›2\{EùZ@~›Èþ:ÂKÇS£Ðg+æYç϶ŒQí/—«8rÁ|säÕ»x®BFµgG”ã`ÏБ½¢`lS“‡¢û1x÷¾D^µê÷ \ux%mz"u³OðÊBa+ôýרÛyÜÐ/'çH]ž4' ЬM¬'µze©íª;u¦H ±þô28ïb_Ï÷MÄ‚r¿—4 V R$»„€x4±à +z¾È´·Ás§9mîàݦ^E|°h;, »½bnT/´ÏÅî­AÿBKMüùgÙFãnê Ô ö±ÃFƳk• î©OytN¢$=Y”";Ûb…h;[kêÖ¦ãºÙJIRûêDgÜu¼ãe®F»—%¶½ª[PÃõ¯q‹h•Á44kR¤DCübô)ýõW~ƒÄÒu^7<Þm:–Û}7ÚBë*ËâQ‡šï«]ý1е-8¢<«·¿XçJšDËjU\ä$9íŽ3y;ÝÀŸt0§®P=]Õ¨>I8gíôµàîO'à|Â>GÄ\d„²çREGÈ¢Ëð'™35‚®è¾6Ó»Öƒ…6ÜÉæ îÐ:>:œ.Õ•yE¤ ßbjYΤðE“­=ŸÅL‹ª#°S)ƲÙ,ϾҕÌd×jšÙÿ`¯U‘+JÑPz—yc'šGw¬åwÎö“³ÐÞ²ºLßÑ|Ðly{Ç"'<¿Ïñä·Ú‰× [ÍlBržŽ×Xax0Z¥²|Mh•7øGð"þ`ïéÒnéd¤à}Æ>ǹIÞc±ô/D— ËqŒ½£ §EWâìôöÊ¡Ô"}+¬-´†÷‹¯8!ïZŽíè³NêÂòj‹ö˜íYVÞ˜g ;/›¹j-Ý–²\ç ½” °e6 Æ9à3›ËîÐÝñt\qIw“|]8­¨Ò?ëy³~ê: ß]JÚÉšP…,½m‡w×—5‡É¶À¦iãíTY€IŒ’Z*{…”£óJRS`NmÅa´÷6âm\_ktÊ`¹÷…Æ¡ó„Úx^‚€É¶êð¦PÛûÖŽ+–êo ´Ü=WfÐ2¾£Éº7ÛelgWÙ¬”F_í.ôiãµ3TŽìuýhé~$âéÕŠ»SìmºÇT%)õºîòyÅÈÐë^8[×9;SÛ‹,æ9šë™‰§*+Œ$S]Ñïç ù>!oÃ4“ÎZI²¾:{1!«ŠÖ£ixIœ½Ö k¬^ùx¿§7Ã~¡Í{˜7¡Uï;ùç†Ï«% ev÷Iqt¤§[ä»|Ÿ ù3ÕŽŽG?—×ÝûT=mÓ+eKýÒä®fg呲ìeò¼–e¤@zd %V5EºöJ%÷½Lͽ›Oá êéiߥé‹$$yMWónEU,´’RÞ’/VJx£„âTËjï–«]NóVœN †¬ìÑu¤¬S>ÏZ{êL¡ý†! ·Õ˜ùLñ*¹SžU=I†6äiQ0ï/dÄÃ1lNéæ›6DzXŸ9Ð[—î'1›É2Jܼq˜¯~)x9’ÈèBm´Áì ®YêÏ#T<Žò9߬¥^ £{?õµä5óS‡yc¾K‘Æ÷¼Ú¶Ma•}^|™„}žHÃ/Þαgˆê;?=ô—é §Ô&F>½ O9gÎãî¹ÅÙÖn\S¿òZ[êJu5—!;÷êîÒ:®{4EkK»¯r“UsZÞò¸‚x[a²“Òqüñ`ÅÍÇü‡Žž_R‘3Ñ==Ó?ªJï‰Q¯<"Á(ØÖ,>@ŸNóZ©m&zm@¿Fí”pçŒ6iT©fC¥óé&Úêå{cË6v‰EÂ#˜ I}Kò\æO”­9›¥;åÔ·Ž“CÅ]£¾FA'î6.8ªkÚ]S¦ ,t‹OÎ+BiÀè:°;Û‹°O• ¯´ˆDˆeW"„‡sì©õÆ[_EÍsÒƒu¯Õ¯o¹gÇ|YŸŸ½×ÍîNðOt}^ÑѾã‘áÓIJ™Åš˜7:ÒNÍvïügA·üÖyi¶ñ0Ï ÈNÒÑ-^@«4ÍYÁª"ŽÛà‹ô™dÒ<')‚æ#®„θ(Ë7±Äž½èÔÐ%p£\1›ÄæJÅ'XfC€›1áy_|sƒ2‰Ú zÏ»5ò2<Ø«QIËLÙ¼©óEÎC4rLÙ†¸÷ÜŠ ~Á½²+aÚe½cŠÿ¾àx"/Š3SÇä<š8nTn¥ûñ¥ãÒu¹˜"çd?è>× (ÆRªãûa1}(Ï‹ åm´ÌÕ0 ]dï?ÁÖ¶*'ÜìÙê>~ׂy=š· ÑRV‰-RoLæýÐ.N…§ü»ôÍ+¾×‘jŒYÓ/ÄVÓÕh¢¨[T™t×Oϱcêê™Í´wAqiòòŒlü1*›½»X­^âÔGê€uî’ÁL»!cÍú]³ñ¯‚^Kê€äAzVcwùCÔf”u+Îìø àÝ-Šrv,åß=F®Õ•)ܺ’k£™VA*y(“àÑ ‰÷Eù¤Ïží SßÕŠ¼£&¨ª&O~A'…XÌ+< í8¼;ês)„o6@›ùàKº˜b×K¿|kAQÊ5mö‰i‡ú“3³~;ÌÿÇ×(\~eú¥Í)ÝË7F½Që,"åsüΖ¼?u×Q^J-u7¼J€S†'¥ KFêg°-ßâöƒRs^²aßRƒ•‘ â£èõdU‰Ãòëú6; cá@êQï’SKiôÊì…ÀÚCB9JÐ…`ß}MäØý`nÑ—!Sª¯(ôˆapÏ ÏúM¹›-Ž=lb÷–7¤}¥rÕî7¸À 3Û~†Eð/ríW‹qÔGŒ9·^?w.9JnÖ¥3µ(V…96ØÑ~ (Ž©‚øñ®•<> !¡ûN¾Q™šu`5~!Ô©l•–õi‹ û¬Õ¸yS“Ý9~“Píüùèì÷‘H}jì<í·e$¯øª¨nº€.\_NÅ}Zmíl{úú齤)äÖÓGD£»ÙW¤i¶†Ù¼Å²Tæ147ˆø=ºóšñä·ORµè ànz=eËõ:ýÄ¢ ´ŸÞQ¦‰ªï0,¢ÓêoŠßêaoÍhÏóÆ‰§Ä ß+±ß7ë.ÉÛti:E›Ñ7¿os Oݬy|?xôF%që·ùIM°ÂÒèú˜i,oàFk’×ÃÃWßLƒce+yK!Þò¤gS~ÛDÌ(câèfˆâ2l®ù2_E>Ç»7tÿ2qÓhÆR±áQ ››ýx@é,lª?Y´GƒÉžé7v²Hi€~rùŽRîÍÛé|q)̓|“åî» K|Oh˜ã[w‰•Çõu"ÉXÕÈ?á…>¯Æþr'6¤¾ ¹„ ª¨vutz—ù(Zäjšx¤:8#O>õ[qô§XÈþ@%ô{p¥:W4žM{¸^#BîhQƒ™Ðõ³þõžéñÄ-(µ7Q‘Rñüª„¯R÷óÒ¼]¬}NYÆŒÀI&þ-ª‘QñÕšˆ™û§dÞ¾[³¯ïJf}§óÞI=+ÐÌÆ’‘8¹f±}¸õ#ºäéx{ºÎÑy£Ï8“c.ÜE¬ËˆN?ùÎz¯ôËÏ£D60žR&7U—õàùæY‰“ “ñ¢é§ÑpÎ ¾g—)ŒÍ ê§ä/}ÛEomFKÂÏë–륩[!ùX ?LaGEº‚dÎR”Ï/…vä>ó{¨eýȬ}ä~»1ÞØƒJ ¬ÃAmƒ-Î9\Nú‡²VøÚyä½®uGe‰IÐR×ÖDHÁ½Ælºl//ë~‚À¡[>28Šô{¬[_©Ù;"I´ ÃÆì›q‰bbËe*/‡-©h˜ÄbgƒñÜ–~²²¸JÔq¨4¼Äθú1‰ßÚÛß©ÑR²)¼–é h»odÏðI?çÑÞ\o²p~ðù9ü5¨gµ»&â²#ÛÒ¶Cõä›Á"®UwI>²ø…_yÁÁBöÔES¿=ˆ(X…wÏܲ¥³|à-uC™oÏ1z½Ül«eUf“d¡ÿR²€Ð¯\áÃÍgîÎTÝõœ<|“g}¢ø‰w8 ìhŠJ×5í›úà $Ÿˆ^êNëåN°ê]ªåòžý™ôs惤‰ßu‰}9H¶«]³sò–nŒï^‰Q{8I¥é‹Zà‘ñˆ —‰b¥ªù¸Ïq/¦Ò†Î‰ãÙØ·›‘Ì22€úxšOÈ8O«[?INl#Ó=6¬è‹L°[lì<ê<ÃÎNëÁ·ÑÃ}]¨òÓ?}Jlž%O{Kp|ÚF°6t‹im8Å#è‘üÏ‚²W¾ev¶Lî¤'M=±ç¥fåppûÄÒ««q1½‡'­Œ¦Ž†„-+¸«‘™#3–W)ù¾f‡sƒgDZóXæ…tÃR²š¦DK]ñÏSëçGpäA*Ÿ[‡H ±yj%Í``öǨ5ToÂÂvYºrAêC3õhO-ïb—‚å(D`ë=½rQ«MZ‡ŸF>rŒµ5¡ÏlÝOjñå­ŽP\pêã<ªò³g<ô¥P‡ãö…2&äh°ÆÎM#HÙʨ…'\û¾AC 3ŽÍd‘B˜‘Jvï€Ý÷9ÔðãÐAN7«X>âˆmyS %üŽ'ä»"fbÕ%_})²zõuüZ$ì¹Ý­²”’àÁÄÖ b|V7ruHêݾY¾U½Lóèªw9¯]­dÇ# x³Ðñ^;ŽÔ Í d~Óƒ&.IM”Ý£;{õ-ÏþI87á²8Cô:‘[¿ ñHX"ÂËÑÕr÷¥øPÎvõLNlM‡ÔÜãIÙþñS•'mkg/ù·.£„ämgü¡«*]¤wVmC>û1Wÿ\Þ”–QQg~º=W¯dŸrE[ßùȲc»#>ñyáÅÔÑLÿaë•ÆÖhòÒÎr𠬹™Z€x—î „€ìÔ /@‚Ë/±”÷EúâˆG>1°Š°:½¨};ÖÓ*ΡÜxùªñvQBØ%_nȶ³Ú™ÿj¼”Чú’˜|ƒïü±7QsÒl>Oؼz÷Úñv{pí ­fIDtð:bóE&~!¸‚*·Ém´Z¯¶z‡"×'ˆ,S`ÐDïö¦eFá¨Ü²$g&°Q£ÞCEs_¯ÚÌ9u¥”éÇi1šÕvü^í3ÿ·[„”¦]‚¸fÀ¶öÄVí%}!óˆ¶ »#4ô™œí÷ëaÍ›J´ìúS?'Ûâ¬éòD܉Ô|*Fa)úVà”ñœ£Ç’ð™™gi‰ o°q ¸Ëîå—Œ„—ê2JKð™ÕkôΈŒ¼f¿3Ÿ“êU·u¹—Yr¬ÌÀÒ$ßÕ•w|¥¬tÊ.1\Ù$/¢8FZLñy~)µ¨)÷Æ÷“°±Dp!—˜HF –ƒy4ÓÖX×{\®¦Š6IñÛ„V²/º¸æL^¨Zöíó…¶°”’5¨òÑ…ˆ¯?b^t–T@dzžÆ€º&ÍÓ•WÎ)ÄÎ4™îÜ b}Tÿî²<éwí ´0R»o§¨}ØTäQ ²¸::dëÙ#cÖfóFò‡#ñ¾"†;²¢wJüVÒ¿v64©6€æsø[²Æ~RŠÜœ–U°[x^œ·-¯X ¥%Òê/øFšÐ^Eo°o´^Þ•ì9n‰OË´]@ ÿMðÚs&œà…ÄÉ´Ÿ‰2Vó,jÅÝÙCûwàƒÔ?ÊøK‡fË• ˜@Uª±z4dd¼¦ŸR¾K‹tÃxåö£îöË q%tOÑ$~#`AkL‘SÖ,˜kÛ9¿­î·.ÁN¿EþÄËDô««&üRsºþ €DX`«êåœõš¹±\Â$Ñó"Þl\ƒ½gg²MÉÏé=jµJâÓr¨C1ï¦Óbq"Ô]ïQ•@$†N;‚ÈÌ.W¥Jï~Dˆí½ŒÃûÞRnö`…‹ëúZãz ÿGÁÁÙð íeŠ/ÚÀ½O%^I©=8w‰o"+BMš—C+ëjÀì<;mï³b5à6±ItÏžžŸTF/QÏœr­ä°qwŸy†KLú|.¦òõuŸVpZÚaSáóvçW8UE«£Úi̧6>xNÿ¸½—jñ–Þu5¦•8‹6¹¼.ÉÓ,•¤¡— ¯ââ;KSO½¡íðq1Ÿç¼‹+ƨb6ÓbZjrøt±êsK#a!ròlîçʦwS>I Àîm[Þ}õv¶B tÑx<—+m´Éó'…7%ÄJŸúM_ü R„(Z>ŸH”…[ a·iö)øŽMRs&ìIgŠm8smš,†ùÊ)·¯y¹V?Íöº¥v[îÂLÙðx«<òch]BGÙ¼Í!…ß^¬Ÿ9› nA9O î¬^~¿Ý8t¥ÕÍJBˆ:>Íõ6áòb™Q+ËO_¤† ÎVgŒž,þm|èì|‡°«ìÓ™ÖéÑΡƒÍ‚]…Ñb £j¾Æöú5´] ³>@¬/>NÌ,ý<:zá֋kÍ$%ïÄÏ ›78Ø[Ê“)ä ž”ù¼†Uö>úDœâÅÃqDæš’-[·è>+>Uë Âúí­ ÆÂÔ0Pª&%q}÷YÕ3ý² QæñÓˆÆO¥®:àþa:$ðPçö ?€ŠÆäÂYÁsVØëë®ñ øV¹uui¦2þÍyV«ç˜Ô~–¶m[JìíPU2ô㫘º2æz~ç|b²ŠòÍ1j­ºYU«§YD«žb =ÝÆ~GN³;e%î8ªD!{Á&L!„BÚx_kjiÍ$Nc<Øu8:’ÃH訣Bõr]h²ÔZhe;èÌûuŠœ©Nf&‘~¿o{xÞ=ÈòV{úåAÆ”$ÛŽ‚'­P‚ày°õ¸FMÅ;[¹¸µ]×à¦D€Wpc99Ð+çYwI¿PP3#!L;=˜cî ‰"Èè’vvä0De“¥·B$ú± eläò“'d:'’½«Ü΢šë¥E;ÁÉDfïïXÉO~<«é½ƒçg!ÙRãÂɨœUû3s•.<ÏI—Fµ0Õg£“Ñæÿ݃­ÆÙÛóó]% ¢:ÖqJm¥Tq²Ç¶S:WÆ"ÎGT„~7ưIÓ"vQø9zM·Õ?¬kÇÆÅ–¼Ö ¶Ï!×yÊ麠V‹;Y2§õ‘+ðÍ ;¼quéFa~& endstream endobj 98 0 obj << /Type /FontDescriptor /FontName /RMHRGR+CMMI6 /Flags 4 /FontBBox [11 -250 1241 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 85 /XHeight 431 /CharSet (/I/b/f/p/x) /FontFile 97 0 R >> endobj 99 0 obj << /Length1 1724 /Length2 10170 /Length3 0 /Length 11286 /Filter /FlateDecode >> stream xÚ´T”k6LHƒ¤„ÔÐ 3tIw—”ÔC3C ÝÝÒt£€‚ˆÒ)Ò- ÒÝžsÞsÎûþÿZß·Xkx®}í¸¯{ï}3ÐhhsHZÂÌ!r0(œÄ H«ª* €@N “AÇîùˌɠ qqµ…A…ÿå íÃm2`ø£Ÿ* Prs€x ~a€0à…þãsÈ€Ým-ªœ%âŠÉ sòr±µ¶?–ùÏ'€Ù‚`ÿ# éq±µCª`¸ Äñ±¢Ø  ³°…À½þ+³¨ î$ÌÅåááÁ vt儹X‹±°[ˆÅãµ{qýÙY{(Ìêó°²…ZZýaéæÄõjëìQ”ùËåÑ„ùÍðxygÄÓ†ëwz/'È$è·ùQŸÌ `õ(âgkyü‡éã v‡à.n?Ÿÿ0A €¥­`±¶…bþ“ýÑ ±ú?6ßÅÖð ø8{ ð÷ßß_Æãe ƒ:xýãþG¹T¥44”ØþTü7'%óøppó8¸ù€<~øýwš¿/à?âÿ°j€mÿ:🌊P+à1Ë"oï?BÜÿš æ¿v†ðß%Ô`à 0ÿ3ûF@> ÅãèÿyþùÿüßYþo³ÿ¿’sspøƒfþƒÿÿÐ`G[¯¿gÙ þ¸ª°Çí€þ¯«äÏ]V…XÚº9þ/«?î‡$ÔúqÆ9@¼œ@Þ?í¶®r¶žK [¸…ÍŸ“ôŸ^<Öp°…B4`®¶¿ŸœÇ( ð¸Çµ³°|V\;ö'v}ÜAøÍý![ößç…ZÀ,¯#7?ìâöÂ|ˆGÄð=î­%ÄópqBaðÇÀ£f?€Ìów›ù\2¿M —âßHÀ¥ó7pÿAqæ#>!×ãËàøÿ[—å¿ 7€Ëê_ð1µÍ¿ €ËöoÈ p9€Í-ÿUŽÿÑôç£ñ¯¨ÇªŽÿD=Vptû‡}f.è?ì£2è¿ÙGo§¿!ÿãqœÀ.p[°ƒ¥­Õ¿Î z$\þ+zü¹Kxþÿ«'n..Mûc•öüÇ{ xB,0g§`"¡vB›/k%É=8Ö‡DQ2.õ¹9†ŠMÐá=²c¦ËIÚoræ”+åf»Ar&vmjRΗ¹‹Ó'>kuÔõ^¼çÔr[ÖÔæ SçˆÉ>´S¸ziRTÂe.=”1xíâ–Ö=Ú ¸¾Lºf’=‰Ê唚ÕZÛkËsTˆ)„t­hÁ?›÷é¬ó’2å­8Ƈ¬ÆE¥«eÑ*‹¶^a&yÔà-}íï›Çï¦ìˆ Rr^?¤‡ãËŠôQÈð¢ÕèÎ>½Í+sßÍ"ð1—'”&ÖV- Ñ"Åì“.Lù|@jtK‡¦o—e“Œ¹KŠÛR˜µYb L¿âáë LÏ› °Žö±]Ó lý<Ñ?Fr1‹²Ô¿æ€Õ>ÒÄœCçkó¶ü8À@R;Æ.£ÚƒS/2EXÐMÀêaĺø,JõÌí)>Îh ~i¸|¡yï’~ìeFåAQŽËAî¦h¿/éž×ç§»üÝ6¼€_£œ]×&†âÙjÄi%UÔÔ*™0£ì4Ó”$sY„à\¹OZt¢öÚÙ;*"!j×§/r-)}ÌW$¨W óé\ Kɲèñ—Ôô¬ÞÐIŽ·]M3.xPºR1µé°7[Q®‘LûAŒ(ú‚'M”ø¤§·?j?œó|)ÈHoäjk3{/ŸÀ#pªë@Û8·p~eŽR9I¢Ñ ”PnBÓµÈÕ ”±ªÜ½9+Ìwò^ÍÏR9È–{`<¹–ÑÜìøŠÜàö¼`ëj²Þ¸+åprmzl£k6­ÚS:_»û>[YÊ*Úí”çã.~mDÑ$ß–n|¹½#&À ƒÇzYJw ø$„½zîÒR¸%Ï`™I?ðÒm ­L6Hù§W¦lÉÄ(š£ßŸ¡šbñ³¿~!2cQ;STͱK0½u×…!¬3ôáÛ”õiÚ">góé‹.öV¾uHf©‡„vc œãY°Ðë%÷ʹs··3ÉÁ. sû|½ !9gƒ"žÅn,³ÔYÌ¡¬–¼<ûC¥õæhŠ“ÎF›º*—Ï«&ó}eš^î] %ùµÉ4œ0P¦Œòýc‘åîXvö»°w; Rš|<¨~íš­®Z€¦_^Jp÷瘪šÈ‚Ó Ô|ƒƒàzÓ±ˆÃ¥“rÔóläÑç–0¨x7¥O‡F¯øÔ¼ýUÿ]ÜG/“šã³C8¾6. ɆW:TÈ£ø^¶Ë·oÆBÅvTµH°§qG@,–ι`vÑé`j­´Ô±N©2ƒ€YÓ‚iùŸ>O\‚D u+¾é=»f5Ö¯¿Á¿@§EP6lŒ G°“Ðd ,6ÁWô›>m5ŠÎ?¹ú²›j¿çsþÍ•Ã)¯ÀÑÙ9Ì¥[‘ÀqaÂÎ%Î W#ŠAµ¶0< ž‹°ª¦”ñu(ßQI0¸ê²»°~wV›]ægVs¼šSkCO’µAŸ¯£ÐÃAÀ$Úem*§ï-ì¸v1xqÓFÿê ™ð'ÌFå²çkgãUæ_ÑPpÑvg+—=Èê_{Ü1ŒdÒøXUú1{<é§ÚÊ‹N(E Dš+ÜÛíY¬e,„ ¨ÖJe<HÞz*¼6%eàÿ4ÕcÁ÷ä›ç±Ò5òèwÅ;ÿF|£ëDf UTïy{mæHÄ«Æh¥¢QÉK»5ó-H?w0%[°xã NMãÃÇ¡l‹þ1׫æ»"÷ŽlïOÊG­±Vt;Mwh§ól®r "ƒ~Àreͼ#Ò¶ùBC¼ršAiÿ-^†‹À?ð(–äðnäßâ©Ýrï<”$¬˜0!µHÉÇL·zóv‘Îp‘‘–)ü|®Æ?¬Ãúí«ÍMÿ§AËuM+ È,~{Úã!S{{ä^¬…½*Ñío#}¾,f=òËú3WßÖ>œ×çqúupù<7.N˜r ­nÀ -ç%¦×t—×m¡Xê5È“ØëDÚô£`cº¿{‰<&ëý¹ø jѵÒÝÚ2¹«ÁžÆŸ°¬¢0 õe I¾ ©½=5ÀÏ#–ÅS/•ä ò!éÛBlžºqùU«”¢ô“µà€Z_XÁ店Ùãíù'ÅZï%8¥òüÊŸ”Äò†s÷鄪—÷Ü““}:Â1ÞHÒUû*¹Æ¨81È­:¹™ÁŠ›[(oGÊ#£þ%dœCb¿à&òU/IßF¡'ú­ çÞ ƒŽ…‹?…kß+é,E­AÒOÑõýLSú3–CüÕLi&Çb1H‰ç‰ZKínºÓžtÇ9b^Ž1_¦²—PÏ<¿ æĤ $äP¢{å‡Û_5´>LØ{*Œ ð˜ÆìÎDM~4'h3,¤ÍU½H·CõäÓ×3É)ÜB£‰e¡˜ÐxʃI‚ù£cÇ4ƒñНƒP"€\ß…‡8Km_ê'!Ý”¯¨㬥qv8„Ö—s©di±°•õ$CÕ»€0NIn}Bã vSïf; løð¢¥ –(w«™Fƒ¦uØ!ô‘ë€ï0éïç&6m*#u˪"O Ž-¯ÃϦ"™oò4y¨í ˱02"³w x?äØš S1zEºö;HNô§ó°F® IxÚ³K ùz¶¯Íså‡ÎŽŽ÷§M³¨O‰J†u’áëŸêNêÆ> w0¶ëäuв'¸Æõ rNÈ-6Ú¾Ãs`›Q'o¾—K1hGë}ßWp y³SðÁÈ!w C@Ì¢‚õF"[Bå‹au[›(ïþ”ŸÐ%4bäiÇKÁ]Ú–î7#TŽ ³ððÎæ$^ò“•tß$RÎAaßÒ¯¯|hù°í.µÖ4‚ï&1ö9Í„?åqnDµµé< Üù¿b|Eûð¥Š@Š=hŽ“Ç:‚,Ð}Þe(Rwš&ÞO˜×ðw öPÝéM#áä¶š‡)w=ËY³¯º> 9¥‹ûH€yƒ¿Z<ØX2«›¹» º&t}ÝPfÅUÕ‰ýecñvࡼz"ËgÈOGvëÇÃÔ^úé]·êPs©øq’õĹś Í­òúíWœË œ´doC›êJ<1)¢í [Oß/Í00 šÊ9)•i¼¨DþÜçP…1´´Ë4×Kf™ˆÏöóU]XÙ]eˆ°È BÏ€¸úo¾ ¢ <õWÒ^lÍ'âuÔ{“‹îOÐ!•:„’KÒo ÑêÎ×3!‡­› O1¥µ_EÍVAÉdv1Žcn¸f¹ßÒzëùÚ½WhØt"6¾Öš{?LZ ¯²øž3FpÄÑ0ùÐô.Bò“‡÷ü1NüœåˆˆçãÊg:¥=øOeˆŽ ÿbh[ wñäœi*e[Ð ªz(ÿU:ç#Ù‹ÀKváÇ’g‘ . WØ1Af°/G€qLg (B¿Q{ Ò8C§hÐŽ\^~"—™J½lRÕœ´{ÚñÐKjÇù:í:ç\"'5ÑOóðþ+›cžµÐ¤ÌdÁ@ÅaõNœJa1MÅܺvÝ]8T ¹d-8vc%äAÏÉ_¯è™hæ¶c…MMPÝç'ÁƒùK4ú!dñ¯`{ߟyÜšîh«$–ÖF Gqó•xó#vÆ\´eßÇfC¨fÿHLû.ô¶4MFï^îmx„ôÃw ÛùWéÈ{þ‚A)ÏÏ=áî ¹•œÑ„V/ëèq°L<»}·êÌÂ_G_SÓmþXgÿ~t§ys¯õ!ÿÝð\Ó^œ¨ÀHÜjÀ† ªPí>‹=àr“|aáçÜø†Èû);µ‚ç®^»m L'†Æx’žuý†S;väòsÕ{âKÙùÖaç?ÛÞwŠŽÙK”2¸*™™I* ¿—ãHUØEZ%¤07{»¼ ½´–1üÐügâ”=ÜÛíìjœR§Í›ÍUGN2ïÖ&¶]wÂ˃K¤mè|èd6ZMVtí S½”2– äåÐò˜§¦ ßÌìt>»§ö>ìˆf'•Wù®‚Žîv;V¥l2¥6òú¡Òü(•e©-~K3–ÚÏ÷átõeÀàÕ¼HÖaIùrÞNK‚ãë휽ï9/ÌF~„(Šžà±ê¾{Á< XxIÇvɶî%°-a‘ t-‘·˜!“ûlùžÙ„Õ®/Ga÷êe4 JÕÕWëTg¦Ýd])A~Ëä:F¡àÞì‰!»ÑÕ}ÌÍ᯼s¡¹§B—–jß$x²„ôà¹ñY5S:*ø‡ Â{kÄcÙ¤3E#úÈBgøÆñ>Œ¦W çæ~ÞŒáUt¼ÆVω¾=çc®u­ÀFýŽÙ.ÃÈaLX‹˜?.ò>Q½'C‹ÿ¸5yø4}G .R””I{Í@À Fäåjêàxå}ìdj™^·¢ýu{ý§=¸Eã5ŒÅì.0·ša/0ã/“Á×vÄ7C’0–Tlu4kH~‹qнOQS\©T\ ûmòä[’ã§áp*XLkŒ¨ÓZ’žÄçêA†žô……\{‘›NøÚüx\ 9ÊY¨í6Uâ)”ž.z —ä@¡cqa«8ˆ¾ZßdÕ1åÂ>µf‰@µw<8Oû>t÷À¹å’-ÃõV Z\NÐâÛw%“„Ÿ¡[sŒá$= x—s³’ô:Ö«\ZvàþHégá̈gÕXM–’ëE6MÙñÖ-óeêD†ØÊœµ«ñÅ ¥™H6êÄ;b]„ ñ6öÂÞ$Çë )]žë«°¦ šÌzïZ@2ã>Œ†É²Tj¥b·Ñ¤ó?éñh8*[9¢&ÏžàIÃoabâ§uýÖê¸B©höhÁ`=âybuH’ÈÍl ÚûGÙÐd$yF‡Ÿå©Ûp‚ìn ‘¯@ö0ažp3)ÿêâ€~4ËH…¯¿0hèzîf!Óª‰«—_ýüÜ+%q4*DguP(Ã7îÆX} å«YŠÝ»íÙ:[dD–Þ³&ËRµ¬ÕÙ.æØ2‡Ÿ= Êj©os2¤&ÆËEÍÞèÇl*¼µ ôðBÍÌ—Θ±T•gDòYÉR¤TÍ8óɺ’LûÚge·Îãø©Øvîë—!,¯‰ëx÷kžŽ?‰i&ÂøNRØö´‘;˜¹á‡pÅl¤ ÀšÜÄLgêtXL´QF9¨Â ~wìX‘†j²ÏF¤Ok.° °â´P ½;'Îyš/](G®{è±÷ï¸Ã¾k)ˆ“p œÂJóè:ØÔð:IÒ¯ bÇE.¤?Nû¼Hw¯$ž T@9ªjKª»W´yßÏv6Lø|šŠ+18|EJÒ¥¾oZ"[ñÓ66oÛŸŒ•@Ê3 Izj$“®bÙŒîEoÇóáDœ³ä®^}£²¾)¯%Í¡¾í_•¦wNŒZ|QÚJS&€¬¡µ‰O.§©úmnÓdÑ…¯qr’Vß²äô¦€Þ²K• ìãʇ¾WŸ”ùŠ+ X²o0ªTë+;6 ‹•¸´f¤ ³•mÔGKhŠg¥†|Ô%• Ô>1ª‰¹®Ø,Ìä¯å•Ô†ÖHב^Ÿ„¨Úhj&çyª§gʸÏoÇ6åOŸ_W•V-+U²~ÖY)¤›§=³ùA6}d«gÊGØŸ™úœ¬ü]§¼òù ý4]BÄgN”}@Poú!–2Åq3°ëRÂ°Õ±Þ ]71aü6¼×ŽÑÛ!LqI_‚ žÔó³q©!%àyP-ëõÁ~ “˜™K'—>eÞG]æ=dWX%r˜|h§V BØQ;ú$„©¾så:¿˜=7Ùÿ5D‹˜Ïaéæ~Tc¿¥sð)cª@Ô׳ê²Yç¿0e“=Y ² Ð.ÊégÖ;{JÛ—ãÆ Kó÷rOö*Ã@)|}¤9FbÏJÇÏmjé6@£rƒqF¹f’ïìѾj‹Û5*¬¤Í³icË|6fS(Ñéá#!ꌱz–h¤/lÔoýî ØwP]±HQû÷Ã쪇ÉtÙã»>ˆ±M|#¦ê–™¹œ¿æûé—ê°»¬Í.qPhÄÙq®Ÿ¿¸Ð·#¼=,B™ÕðkÑÃ;]ÄRüÅÖ¶‹¾nva¯†[w÷ÒsËk꞊üõ•êî¢BèF(Ë5NʇhÊŠÓéñ]?ipT{³ùE¼HD»ÇDN[ú²Ï 6ââÖÁÝ7[á^)4tµjí¸9æË¡kÙØˆ,HJ¡!YCa}cùK!JvßOˆ×¿ÒžnBÞ·Þ4I®n¸Í‰È /û%·Û³"ÊÉ8²6¦³œZ°ƒë[G|±7‰ŠöY‰RGQÌtÄö¸ƒAQüš“êŽþ#%\Df”ëâEÎdd¸<÷êÉí§*+ÊÇŽKÃÔ|Ý"›:žçYвÚœÚ7Ô5g1¢™Ê¯ãÁ;u†¬JóØ:æx~z#Húž3žµnnJÁ%¡E—QÊn#æ‘ÈtU1œ“öËO›){úN.³¹ÏÚÑRWaþ4RAËö|ÅKJv^íܹåfƒÅŒ‘ÔˆÌ6‘×Ýiš‡Dn'ÓtD¸#<ýq=@ügnÄù¿mK:°å[Ÿ–‰o:{•¾t§†z~“Ñ©`cuTy!—)̨÷ºÂ$¿½8ˆ{ÁË} Ë3w'à:›ë3”:²¬%ãz§¯_Ü=ßµýó!47ÓBÂGú¸%ß"Ìš€õ&»š‰sׯ²Bx±@äfꎴäLµ(v¥P¥+­–o…ÀGê+çVI4"R?ì%ÄÊ;Q³g“%m¢š†*ÒÃíþïü!^¿(¡2¸êÍÒ:òɬ¡ƒ~mc;K·©c³Ý_(÷ñ«A᫨ħ_=ú»gÎ:.7Ô>%¶ t-‰6Ä„Ê4û»C É0©þ˜alDB{ÿö†Ì¼vÞ\Í‘8ŒXUçãCò«$ +(yå“b¯åÇñejî÷o5߷Ŷ/ÊÚÞ¾­KFŠž:Êsc|C†ð‘ªõ[ ikИQacþ é§kõ›ËÝhÀiü7àÞ}gãK`aPÉ’Áéb+OYîÛ›Ïð¯Û¨Ô_ÏØ÷8_ïC»ÙjZrab™^íÍ-U3éßÖÍ«Ò tË 'ëÏåW™Mqê;Cw Þß1½{k)¬cŸõ¼ÕêeZÔ8+£Œ~ÓÑŒ¨_ˆB|n7ó¾Çè:!ˆsT_*_¼aP âÍ­ùþnÆ”Ñ,ÙY’@™èíÅDW·Ãñ‘èÕ:Â0g /Ó b §ÌÉ‘!Ñ æF¯]lÒòÍŠ”¨þ½o2Ÿ·Ö÷yµ=›ûZ€J«•S<¸ÙÛà(Ûôk€Ã^æ‹{òéFåFHŠÑÍ¿ Ç ˆ8×,NdTôßû‹>ui‘þ>°R¦X‚œx¥í/ÎËš¡B¤}ÂÔµlµCHÎÐÖÆ½ânB—½/ÙÇî¼æýÔ[Ñ;ºG‰Ë­T:u"ë,yUmÌ#wD»Áà“yü”´ñ@?.ât[ù»–Ó,Õ.|ÔqIï+ÉNjq\¤n‚½M‡±É¼”eW®â€®Ý¿Gk¨,V>)z¾ªò¡>®.÷Ý%·. Zça\ RÃÐŽÙû^]}=Êò•÷×m‚ç¼"/ÕYºïò‰¨e•›¦Ä>„ð¥rMIl zi”À7gQ¡]ù½Eê%ô˜cb^7C¬{œ¢Û{ž1/Ÿ)ò */9]#òWLÓÑÉ;¡®'s·»0ÐÈ%H¡ÙÊìvt!ó5|Λ"qžÔ¢Šâ¾2?’dšÿ¤¨a–iѵÄy5Éþë4w·¦.)—š!HüÓBq¾L-Ä´{ÅÜþ^îèÁ@ª«¤H(«½M’"`^Ä‘PÍ„M[!ÖPWIBû"n++Y⥧3lŽ–Ê}FÞ–w0¯ÔÛØUtÇF¡·*ù¼ÖÐ̘ y„Îç+–i\^õK}y>2žY±L®ï†VÔOoe&PϽ¬ßÅq ‘> ˜mú”j@Q™W›ÙlCá¶­FŠ€Àî+D€˜¿Ž[dôyª&ô°âWPA´¸%}g>v¨;cö™Ë¯¸$“òùÕµ‘ºc›§KYíù©¾N•`›¬7ÍçÑ?ßÐÓŸÞ`Àâ$›oôÊßa qZ`Í?)—YoNò´“bUzêV¾cûm­(Xaæ†Ñ 2½«T‡Ï±‰%C™%øò ˜¥•ö×PB­K¨å'Þ7aLá멈¼æyƒ^.1.=S}Mþ:9u¾>l4¾…×›k3Î #TkxבI:_0[KVxÓo5“IèÉØ\´mNDÇz}oÆ*I)–÷!9æ§o Œz#ÄÍ)0 ÖÏ%*ÑuÊ(ƒvHEW3Šô¡\-ÏÓºM.å˜ùyÄ£ Íšà\j&lqºÃiHïø#мÄ|3ˆ}‚bAoùmu‚æÎ²É)îÄñHS¥[+Ìò'·mѬäàu_ÓÙ‹3;‚TíHÊkÈOTæŽ\É‘ÝJvÐ,ɱç“Õrn-Ã8”Õdˆà“;Isù<§¹a u“Â/·%¯ësˆ—TK¾^” ´*ÇÝÌÅÓ¸àpüA_ÛÓx¿+ —tÄû"Iíý]ˆ²jÓ¶ˆR‰ÏiåKà¼Æ¬ °#µŽÎ=ÝéQ_RŒéþ.‹IŸ‰£”² Úê¶“™Ø ±öp5vœZ#L¿Âd”¬”‰‰Žk1ÛpåJú¾ú0NM—5úrq’ž)`Îp‰íy;B1á(ó[vÌcXm‹-Óë„*ØDùsb•[4Is-Ð; Æc…LŸ¥JõU¢Í—4µ²oÀÕrn,c¹Ã2*{ ú§u;ŸT¼AõMîÝw±Ï£šÙe$ïõ²ÆqóÈwGßÍÆUTj¢bnáû[âÓ³Ä]_ ©˜ 4%÷–¢¥Í&µ¨” ßÎxÝqX(°”ˆÇÅ‘×$Jà.6+•…ACK$悪XöýF, ä8ýÉ:$w¬]û&Ìkt €*$âøU¨|޾gñ‘özüÜÌ!ed˜ŽÚŸÑ+ª4Vз-ùùqˆéãÁö›„6}‚.ìõV¨'ñuçIt Aº.ãƒZ9Nð躧÷)ÜWø6V}>…‡Æ…ž{¬dÓ>iÞ„VÈc¦)Û#FD0ì[Ø3ø†çõG­¸«ÌM¤È£Ûïãùæ·G𠶪* ç:Ty—­ÆÔ‰_”vXô Â+¶LǰßÑïMÕL·#|P­0kÔ„„ìwbõƒ{ÌÞ¥:&ŵší%ß5™Œyfêô 1áùL©œÇ€+ÅO§â… ›V®÷‚l0¡“ï"·M¡MgäæƒÕHV l[µï^™ÊÕMyù‡Ôá•SV¡aŠ˜WËö ‹$¦¥0êl#Nç q>á¤W;`:ŸëµÕ8£KÌ}°b†±CkU€+ǰ»/±¶lœ(vpÃŒiï›çâó³u^k8a"LÈ6ý‚¡ÚGm±‹NºžýŒ±–Ó¼åÔcœ?ì×´ŠPk“ðÙûDªÉ;J?ø¬Í[À_ó(sÜÉ×OhEjgÚi ÏÅÃB©{Ç=jA¬Ã>¦èýä§;ʽ‹O³îjËP‰hPzÌC[­Iu²MóQP©0YPWæ­óœ£r¡Þsq‘?ï¦{8&öE_x7(nðlW™}M<Í€ïø-Ñ© Vê²î<¼ŽxhJ2ªhÓo~!VB_#ígtŽ02½¨jÑ`èú~m©d°TH„/æ ª[ØA¢™žazNâTïêÔqw$=tII±¿öMä%jÀ©y0û¬‘P(x ´·(R”õðJEf´m 0„wLOÓ§!…÷ít6RŒgf:Ý«YCÂ^Ò{+qŠýHJ$üéU ¶AÞšmææ)¾N[Yáng¹öÌÛñÛN¼ñ"¢yz¹vºDc¥ Së‡ý uų–Žùº’d[WÏÐêÚsˆa /Y¿¨Ü&7‰VÕ 1ͼ.)PßJMäLƒ+fÖƇJrd·Õ}XÐ'Š4/dG)ε-½8]›¹„X1– 8%çÊ4˱î‘f@¤Sé÷è éEÂ8ß~• ܶ˜±Þ!©ßgK^^[Ûý"š²ru¨âñ$p8 Âžÿ ÿ阒÷TwHþ‹€òù|µõУë÷ ÿ…ö/áˆ_¼~Ya­¾`w|†)ر£Ê–²«÷¾–Õ­ÑPÀxnDùºTÇÈóЦIH ­¤æå/­ôÅì‰"N7ú<ƒ>äó Z-2˜ØkÉzµ¥KÉ·ÔfÓáQusº-Ú¡¡›àªÏ¾qVª2rÒ!9è7Ñ+µ"fà›‰ ’‚¯¬ê¤JäˆÁ&x¤¢èÚ ½Žy ÔdO Ö æŽ ¢âA"ŒÕ//pvM5üKãðù&,€GŸ÷yìkëC™‰)œÊ«ÙË9nGNIÑá,ª~«IÐ2É)ùj\±1¤É3½1¦•æôÉÂi¤¸+‹¯¥Ó]4¹ì›6;ËÅVÓEœûkµ§yˆó~aÈŽUøÄnAÊú„¤ø³¡ãâ…CÜ£ÙßWk\@%OËo;O6µ»Â1ÎÍÍѸR‹­ù ‘\´.µñsqÞ­ÊÄ*Ó_˜ÎD+n 쳚òPL±-Ñä <Y8)ß™Õç¾?QhÉ~pîDÂìüÞP³!GƧê«Ð Ü⬒ޝ© ›0Îì±’,ǯõÓ·Þ7#'Ç  "foRmÙ±+£bxº¼-UÕc&üÈè–½ë!ÂTÔÚ-Ow ¸Êÿüh)d=<´•ÆùÁ²† {C_Ÿ?1úÝ"/y|1³º'<Ó8(1™] û¹þ³2©ÿ®]8À> endobj 101 0 obj << /Length1 1734 /Length2 10779 /Length3 0 /Length 11901 /Filter /FlateDecode >> stream xÚ·P\Û.Œ»;‚»»»»Ë`ÁÝàNpwwM 8wwM ¸yäÈ=÷Üÿ¯z¯¦jÏî¯õ[ݽª6%©²ƒˆ¹½)PÒäÂÀÂÈÌ SPea03³123³"PRª[»Øÿ‚(5NÎÖö Þÿ2sš¸¼aâ&.ov ö €¬«-€… ÀÂÉËÂÅËÌ `efæùÛÐÞ‰ nâfmP`ÈÚƒ€Î”böžNÖ–V.oiþ~ИÑXxx¸èÿpˆØ¬ÍL@+ Ý[F3[€š½™5ÐÅó_!hø­\\x™˜ÜÝÝMìœí,iéîÖ.VU 3ÐÉ høM hbü“#%@ÝÊÚùO\ÍÞÂÅÝÄ xl­Í€ ç7W9Ð ð– &#Pr‚þ4–ÿÓ€ð×ÙXYþî/ï߬A8›˜™ÙÛ9˜€<­A– k[ @IRžÑÅÃ…`2ÿmhbëlÿæoâfbmkbúfðGå&I€ÉÁ¿è9›9Y;¸83:[Ûþ¦Èô;ÌÛ)K€ÌÅìíì€ g„ßõ‰[;ÍÞŽÝ“éÏÎ~Ù»ƒ¼ÿ,¬Aæ¿I˜»:0i€¬]2♼Aÿ`–@333èz˜Y1ý¯îéüCÉò~càëí`ï°x#ôµ¶¾ý!x;›¸.N®@_ïÿVü[B`a˜[›¹L–Ö „¢¿Á@‹?å·æ;Y{ô˜ßfÀüû÷Ÿ7ƒ·ñ2·ÙzþcþG™äÅÔUtäéþdü¨¨½À›ÀÀÊÁ `ù=d\o/¾ÿóŸø›ü¨²‰õ_ÅýWD…=€çOo‡÷7·¿Æ‚毕¡ü;ƒ¢ýÛ,4ÿŒ¾>3³ÙÛƒåÿyþpùÿ›ûßQþo£ÿ¿IºÚÚþ¡¦ùCÿÿQ›ØYÛzþeð6Ê®.ok¡`ÿ¶ ÿ5Õþ¹Ê @skW»ÿÕʸ˜¼­‡ÈÒö?Çhí,ií4W¶v1³ús†þîÂ[x[kPÙÞÙú÷e`xkØÿèÞÎìÃÛ…âüÖ«?TÀ·}úwJ ™½ùïÅcåà˜89™x"¼µþMâx³¼m¨9ÐãÑ01‚ì]Þ\oô|öN¿;Ê`Úº˜üFÿxÞS'³À·KÒÂåœí?øŸ-ý[ÁÁ `2³·}#ð7ÂùèèúÖË¿f“õ‰<&»ÿˆ¬¬o’‰™Ó…`y›k¦Dö7û·‹õùMëðv›þU";Ë_è¿ d«ÜÁÖÕù¿‚¿UóÈñÜhgýoìoèÛbþãÄ `ú/Öo¹\¬œ€ÿÔôÖ!&wûÒ¾‹ÐéOà_=3suz+Òå­zkèßò7'è4CX^°7ã ±i麯yçΰ?!0K¹¯õ‰–Á{Ùé³ë# l mmVЦӭHÊH/ÚÚ®Íð ɳ÷ö&ØðŽ$•Î_>OF ªÓûKS8ƒ“E?Dˆà Ô…|ž}4?@¶ƒwËRæ9ºr£(`Þ»÷Ky4T¬Ž…-ì«ÔrÊ!>UÌ0ÄhDë–ÎQæ›fÏã‘Á¸0Á½Ç8÷@»¹ÅÈ|%‘M Cð=‰a+öÖÝb}˜÷Z¯RguîÁ§À×Å#‚¼Á›¦ò=J•Å]ô.+^\òhç/&ÉE¦O[c@cŠ"¹héN&É‘ç~¡AáSûh¯Â?q8‘†ˆ8mìןMÌÂ\î—þÊßylwÖÔú°”µ1bu¾‘²Y}×Ü\W—)4‚o,tÅ•úÑh,Z/åË·‡2?;Ë<Ñ•€Ëä½4Ø *2gz{›¯“œ+Ë1Û¯ 10hë œ&i—ê†éYß[O<â…?3bJýMdzýŽŽv%v7R½L£;™Ž‚º³ÆÚ'ìÁ³(æM¢ÊKÙ…\檱87oÎM¼äýû>„S®ãH¾Àdr¶úŒŽãšÞ÷Ú¯ô¸R£rÞ&bº¢R9Ÿˆ‰LÝ PöWwO`»ool³ØWômjŒž…d¬¾¡ºå‹Úý”„ÁåmfA[J5‡+öä¼ êYÙI"—…àɃ8Ô.Ý©Ê~ÌÖÕæHyÝ—ñ|ǦNÜ£{î’y²R|lZðÞS |b”w3›·Ã†¶n.é¡&S8ùn×/ܪ5VWTm·fJɼü úý£qÆØþü¤Í$&‹›¾lÛϔʬù¼Äš"´j¢òLü8?90+ÄrD 7ï²mùj¼¿õ Òw,iCƒ$aÉà¢À>…p{«.Ù'¢íWÇ¥Ù3Ò:‡0yñ—ó±W@4Â\˜MÓBß|!LøŒì¹§pôÊP™WoøùÎÄ%‡NX‰åG>S6˜äIr ›'1yú®ª‚Ââ”Ô€îóº¤]Õk‡×d´¤? <†mÅC%Y¯¬` jIS4NK”Ð÷P“6jMmxÕŸ>ÿ,p£ôL§ §øs§dÌdÅgålÆ£ÏòPÓ÷P%xFzÚšè¸CW×*yµÈêʯ7nÁyÀQúD‡—‚`'«¤Ç¶$Wœ‹øhc:[o¸; ÊÝB¼‘°.'ô¦²‰Û´¾Æ8¶Q]î8Ö n% ñûн¡ŒÚ8º!S‡€0>ïõŠ1øÀj6œ#MM¾¥ü®ñˆYdŒ%F¥œ-kú.nîÊâà“¾°PË\}-a2É­G9É{õ|Ó_Ÿ¾hÆÚÒØZÖ|Í^1©ŽY'm;ª˜Oÿ¦¿ýü`®‚[7æ¨äÙqÔ,n++$:~8-p6Í¡x%|…ƒ­.<,â] ”ÏñÂ7ˆE?¯pBŒ,.¨vSÿ¥ ÅÅC!#oýB•$²dùndËé . '©Ô|É/¿ÿCy¼H)VDoÔ-,Écƶ€ê°ù^g±‰zyLkej?˜ª§€9Pð‚Ád o½<ã ošCÐ+†À=Ôï%"]<ŸËŽàÉx©—çѾ³îÂ"âZ]‘ä 2ɨÇ^¨¶ÄjêžLgp)/ú©$À³"kXG K'%öÛ«ä£ãrÐ/r÷ÀÇÐÙ‘B0\ç¨_;JÂÆ Ì5ZkO•j¾Û>? !A²mÅœþÉb¼ÆíÊxåJ÷sw™ìñJïœÞßk¤išÁ¾³v3Ïr˜ù“súÂ0>†‹¤ÇäϹ£´M€å‹]BL³‡¦çMó út6™¹—^Z©ƒÛåWäl¢°„ôÛ¥2F'QžØ 6±j1–Ç~— saò»2n°©ŠásQruày³|…=ßç’l%i`—¢¯"KÀù¶¶‹Í_ªz‚'V£=m¾ïŠä,ÉOÙÀ Á¬€tî)ááo–ŠC“0Õ<.°Úú<ÒO‰­’4!Yl¯ü¹g=ØŸ¢"þ3Ù4[×2Ï"ωnŒ3O88µñn51ò‰ÓŠÖ¯brñɰóìÍPr+‰0ŒE0R–!‘Öz(+»;F¹­âÅ«Öfƒûzèà‰éká>™RI.æè¸Vß{I ƒu¦cÏŠh•zøˆ‘d}•”Þw’ï+Ö¬Õq.bŽ ·æF… ÆÁEaj”êŠr\qµptªé 'zNÅ™OÃ:7˜§:Ž@ß®ú%B¤â¨»%påÇk„ Ip ‰‚“«—èóY¹àžyTéhê†fAp]á T™å-ʽ×Ô¬½2Z®~ª/OyV l¤zücê¹U“Þõ¾ jm'ÿ¹Ít&(RV>Ž&U¡á0ïÛTBu³"‘·œdóæê¹á‡LÓ^Ðw?œScùÚB¸U“"|ðöï§ ·3ùÍµŽƒö¤k–Oþ˜Nv"¯?S°z¯.Aº›ïÓ;ÊïFoÎí3±L…½<áHÅÄH¢¼qÍàµüu[NΈ˜qAˆ[¦¡–ÎÊŸÌ)¦õok'æ2©äùº¡0ÚPm1‘|Úý2›¸GúS[è,&†¼<ËÜ‚I¶D½jFÃsîY…Üæºà` ¾_uÝ,†÷iƒ›’rãÏÙ!¤®†ãYº/“Â"ÀÝsíKÂë{ªø]„æB¤W?ØÚ‹.W%Á“¤f»‘2?µFJ&!­o>þ,—Ø4Ñ‹²¸Wö`ÍÃöù«õÔÄ·*E¼€…¦ƒIÆ&zͱ|õtp¿-­O6[©sÏ’:‘~jÆ¡xÏSá ÈÊ%Û)ú|ÕìÌù3²Å’æºÜ[…ÅEP¯f‡{Ý6·¶éô7Ç"Ì-RÚŒ‘J9‹R’~…%1zh‰â; o˜¸ôOØ‘msËGi4X#G X†­@]¥³ äHçQÃ{&ê<ýV÷õB8©/>äª)€+]Äß,2ìØÖ^ ¼Iæ2Æ ¬µ”|Õxq ¤ãm³jÌæc áFTcÜA-c›÷ì¿UOºßô”3«Ü;zâ\#QûéL`ÂÁäÈ1pÉê‡ÒHãìÖŸ™»÷HÕÜ®žkN—©ëW)®¾fŽ}t_=ýHŸ× æ³ßÝ÷œ hÐWƒqÉ£=°æ•¾Ìû¢Ú¿JScT <&’Ôüòâ8ƒ#Xåz´ÕÏ Å±}Ñ)­«O§qê¶ÔFŒ<åµkˆ·õM4Æ“2@Q}§­…M¯FûÇ–P—–lâ=Ã,[È‘õðZ| Ådðó‡6UÆ™7ÏnÔCvŒÔãj»½âc˶žO$x\I8H:7 bÕvÇ͆-µR®FR™°÷ÍË,%¿P]˜¢ç_¶bÆvζØ?Ö³Tƒ"Œ~‰ ú:ÀÐXTXòXQ=– €Ÿ)</δKÉÝòqT¹ýè„Ú“qr<)c³ ÚÔA·v­ è]ßë»ü<}v2ƒ¡ã„vL$~s˳bN «Z ¹HqAGúÁPOE»ÓaRQ4Òaµ3É£7Wêú §vˆÇ#—ˆ‚Þ¯.Wn¢M±çn9’Ô¢¬·áõÎq(¸ÐJ†&õµËC¾´B¦Ç¬Ù×ÇŠ¸‡"ÁK|Sc²7Þ½S'†îós•.ïÄÙaÿdÑ@K÷e³­ÿ2°çݸ±ë½0TÕ öÂZÄQSÆ á 统L9žÓ¿ŒMÎó1J†‘#õj'"ÑŒg¾ŒIäöº|…>1!~‡”ïu`})o‚‹ák3Zw8"ü«0rßwÀßõàL«6}îû‰ôÅ¥ÖVH·Üë**e#J°íû”ÄA~šj¸ð䙜± À¸©Œ²×8µàçz÷ˆs…P‡Û·ÎACý§ï±žUF·ËM-BéV»¾l„䨓ÁÇ,—jÀwyM_Y~·7Ù‹wm’Ì›NçïÃÔ~ô\o«¨š‚x|ß1lyûÊ.¤ÍjÐÏ^&1^¹x™aøuÊQhßõIãôÊé®81qŠKð„v°è*]ŸÑQV-ÂEvì-¦ÊÏÄêò¬00týà¼_ðëŒöu¢EayÖ4äÎëäó/:Ìåm‰“ÒT´aÆïÛ¤=S}dïeWÕ¸PzVtˆká ÏlV‘‰¨f–EŽd‘è*"ºÛ;á0V0nRó÷)8ÝÔÔuÐ?’¯âÕȧ½²O”þ<Ê›¤¾=¹ë{ð—Ä5×”’_ §;ÄqÆ®’z)Ú2dj+wlꃹ·Š@­zxÐ%®ò /wFb»bddæ), ÚÐòkYï)tE¾.Œ¼úm·N5Åeç}Ò::´Q}§KÅœ"‡qÕ‡E†-ðž!>&&+ûòAG’ÍvÉÝÎ’O$¨çµ¢HÞ=ê<ßÎ%A@"ò¥Ã÷ø|Wˆë÷!K»Îq¾ª QÔÚ‰ÍCá!R¨ hœ2ˆú$é!‡k·‚O¼#šF¿ FçKxÞË0ûâÌ6ë“y/añi¬x ^Œ¸îIfY@Ž-…Þ(o–ÒJÄGp£=ig=ºÓÖœ[bF~ÃvœãÝ2·!/n¯]ÃŽ°‚uB,Îêr¶GfhNDƒ”âŠÛ%«öQ™ ‡8¨xÜè^z9û„ùöËÏ7©aFóXTÌÛu•öаÅ-œ«!²ö à',è5š·.%=Éfé¯5âW^☬à<= úÀ|sùbÃ2=˜)rèô‰]Ó3]ó‚?&ëÖK/GâÙ:™¢¹Ÿ…ðé)S%¤Iomƒ_ã«6/!TÐʪÝ-åV=ü©b皨OØ}ð×F𘊲¾…þ¬FË#õã®õ=CÓr­8˜Uš†÷€hw˜ªû#ZìÈè¤ÝPC,ER§ê>¯bþâ0*\§4>s±wÆL¾ 6pN/ýo¶—¨cÏ‘YrìïÇåð×µŠÕö•£ÆkD*¤¨ƒûqú×q§fÆ$ÎX—¦¤•¹¾âÖŸêìi04HŽ`H($,d ‹~ÜÉ¥À3¸`¥äWi?Øñ;€´2Ü&Þ=;©ó/"_ò6/qpŸ!³~´þNbÇã”4®á òúæË©fp% l´{Šø±YÐ¥¢î R¬¨ªWy§d_ô¬¥ÄYÁh>¸]M Lz¸˜v$bHPƒ{(‡X³&ÖÊGé²6¶ÚÉ} Fצ5hªGÐ(ú!"ŽÜNk•IW¹ÑS‹ÞT ˆàW€u&™ºšU­íÙޤ?n§ô᧬ÎA¨×Q¼‹Ðºõ/ã­„g\ZèUíÆ3“•.#ßm”¢¤¤@ŸN­Ù5î™àãd^¥Ý˜n¿ :3i¬‘UõáÆ ·nôµ‰¼<‰Týxv(W™ëLƒš—ù–ä7»&(x…¹zÒ˜­Ek‘‚.µÅ~€Õ%¼S®w’N„]&Z2u‹­Ô³÷à—áJîÆPf„zR…Q4›‚¾„”%¶qIõµô„ïôôÕà¦/æï Öò®MÈÑj”¥ 8ˆ-ºÂX&¬ ¿}-7GÞF¿|ƒgÒ’¨£“kAEó=ÔìJ÷ø(|òÍæ®jÃK¦T!ßDJ;ƒA z#³¾„WXê;`}gæùû³ôvjŒµ.â$è> 2,:ù쓲‹ÌîNixK¨ƒ䘱r$LF‹÷8nørEµkÙzr³¹£2ì—¯=å±·*â§êÆ ‚8` €P„i}½Ë&"€æxÁÙà_Agrja}yú6kødˆŸ ¿ê®;so”çÍWNÃ,ûQã<ÉçTR8¼åêBÜwý+ä­‡*#ÝVýgÆ!ºÞõªcÝð°O3¸i–®#Ó×.>¡™™ËòÛŽ»ª‚º×@Ñ0F K0!lã÷ì¶8–yØ”ÔÒÉ ê´èaᛟÞÕ~ç‘%wÿžPú+ópñ‡Î¢ŠÞl‚¬,i7OÎöJ¦î@/ÂÓ§gʼ®cAY¨ŸJÊõü®0—g$›_Ô1GåZrE›¦Ê´ï [ÍÜPq ÄÁ‚§ÇÚôêø:ã›%Ë0é¶žî^ Y#bnÊŽM…•ç6W(3i$çÞï®pFœ„Ì-L<ˆ˜?Ù'V\ ‹­n¬Ïµ¿j¹<<ѯ¥çqâBõ´fe£ ã&Ôj4Ÿ†9v8ÉÀ-¦¾ÊnGâ©F§ðñp+ ô ±ÑW–¬[|ešÎeþ¨à CBɳ1ñœow™¨(3ŸQÒ¸›<ÿK©åÓåì”h²raNžHovŽ0Öî¶RÞ¢ÞÌ4­ë¯!"W#ÿ>ð-ˆ¤C9\ê“wY{ŽhZ„6ÔŽßa/ZÑöÄqÍòCaw?1Ya/¯r¤©ËXÓÖXz`QÕh³¯Ñâ®ôÊäA %Z=v•?oÒ[&¼D¡€pÏŽx7ÆòKCĬa=.s‹q¤™OÚ„ a…°ßÚŽÓdïN­Y—˜SeðÒ|[em&ª˜Ö€!"¥›[:@H^5@ýCº7®Ò¼PÔ;dŸëzõkÉ{è=+WÞ<Ïã%øT†¥êA©Ž÷ øÈ8®Â†„Kõ¢J"k—Q§§e —9‹ÃCÏñ|UåßâOóº‹Ñ ´"_5Î_I>¼˜± ­m+hÎÆRámssz”‘4ÓÁ,¹úA¢2 –P Ÿ E ø¥X~‚+7”ød4V ‰#×ú§p礷o?Íp„Ý´ÐÙuÜÝ‘ä6Êeq´rem…ê‰ÍO3<,®=ÃÅ^´JëYZÊñ ðþXÜ bD.ÓÄ]’äëQTT•YŒ³.d}[ùðJ#ÅCÙ»‰s;·ØŒ¢Ø$‹ö]–©<<»ö¹Þm¦)Z«ݼ™› C`kë â@1•‰8ë×xÝš‡Ñ#$ Ô™%baý&Ó»‹åëîÕ‘íõCœþ%tg_)½ñ±<0¡í_¨°Øi§Ì|ßvpÏ+(#¦ÂTiâ«\u–&zÞÿø^t«yÜEÞG´‡å“G¦â\G8Éó-W/ƒj R4•;‹üh·ÂM¢äCí©#eQç•ÜsRs2YÇm2o:£YÏê®UÇÃÎ ÷êªÎJÚú£édFÏ$”úK¡\¡`î Li»Ÿµ8âr%ïRš°Kæý¸&‹ççÊ<öhÉîÝò’ YÄH› ìÝôSñÍWR\±98ÅËï»åˆŽYÔ·`Nº—ÑÑoDïV¤‡¼àÌ:ئUq€äßE +B½ sãÇ:ÁO¾„À)‰ô²(†ý¬bÛ›(×ÙõÈw‹Ñ?iœ¦ÑTQw³ÄÀÉ*¾óÕÚdB‰G¥&vò}šVK¼÷ÝÁ‘oÜÓ;ŒƒÛK¡ö]¥€×„‰›’ˆÁ¶›ó?÷Hp£ÈQRæK¹fvÊè襧( )ØJ~ŠEÑ›ôFs Sµ¦Óˆ³àæ7½whðAû0¥8™¦†² ÒZĆªàü‰ñugƒ­±)ëJÛs Ïuʘ£?HbûÚØëakëcc‡PóÝ)Aˆ.>Ü^1Ip´ŒYœ§Ü9$ÖæxmÝi=žÑf†*‘"Š×±N©BUIàê`bÏû‰M|Æüñí¦B‘ãF‡Ívv?߆zó@7œoü4˪èXåXcxælÙjI.$·> ñ« N§AÛÀÆ® µô\tð³Swݬ`¢"ï¹<ñd¦.QáñþBØøò8Æ¥[é²Ð]ü@Bò;tð™_í£OÓ©‡%j°(Vˆ¢§óʘÂóŽyŸ'õO/åöÎJ*dLÑß“²ÂËÁ<”ˆU²ûÄ(§>ÑzjHj¹q·¨-–ìø¹ðs­‚Ó]mâÛ-–ôa¬§gp.ß)×Þ#ó˜9ª}̪ˆ·Á­`'õò&†Õ•kOø®19=MßA¨Æ°ß\ ã ç‘—y±VJ*é§öÊ­y«âFc 8ì/(“˜"&°àßÃTØUäíCVJ/)Ä?õÑVØ6\È-x܇ÎèQ”.nÚÊÅ?´MªÔß î-kú9y:9ANœÙñøÃˆðG šŽïøþNPî¢Ä°\X03‹;îχTPi˜ìmÕ¯Pü6 UI´%å#á*;²{ aòx@ÆæI[X¾'„Ù—¶«¨Þ=Y<œ§`<ìö šA–SnC’µVwmÝØ1)R8¯éM!ž>å¹\绹ëÜkTŠÎêªg ï'?¶ïd®–ªM†cÒºùÆnQV+e2Ù5©Vè²ôÕ•FQµtyl¤U¼`1†ïpªÊå#TFévŸžõ…êî­ Ps] ¢ö»ÛÙBMš^ؾ6í‡Mþ^6ÛßúÅàZAèWàå=3ü diìÔQWJS™¡TsÚ«`‰ %w^³\[ФƒRÐ))^:]—[gPæÙΟiKçm° 82ªÓ‘ Pˆ%ÍpJð$«³Œ f›©¾-¶æÑõ5ÛÔ¹O6cår'&SΟ4Ò"ÒDÞ’ŒÉ¢KùjÚ™ø3¦æ´? uä–&u­õ–,k'âËg`ðÈœs¬éÍÁÒa˜Èhxa“’Ìe_+wxÜÎH€8ŽÛw∂1<;ئCÁp”Áq³g8u'™a×YFäƒn/_—:Sµ_jfÍ¿æ1\†0c“:*`j+­¥G,‹…3(¬H®àã¨E·Œó_‰rÃR”ø °d¿|¼"EùtÍ Á¹MÀŸmž†ª¬sW”˜vŸìK;U]ÚËߦc¥]# S|U—¦b•ŸWó¥í3FYDÚR.F¡S§DUX;P+É@ªåuv•N£-˜9Û ’ÂNGf¨û´ô6FK4Cî%£%"Á‡~úasÀ»‹É—¿ „½N˜s¤Zóàžë¼Ã\¦§Æ]³èrËåp2ßãG«¾vû^fó¹2Wü×q`‚ÐEqïz³ß}(Sµ>ÕèS«¨H‚ôëi^¢¢‡utÄ2´ÁOvˆ£ÅNŒvÐm,ï!5Æš‰\¶2­KcüEY9JKÈV.§ŹÛ_{o̘X»RbpGH×ý^VãоÀ û \1#OˆqÕBãb!³9À0²„ß8YSm‹ì,|LYG(~ðÍ^°A¨v\=ˆ AåÙèO€Öƒ)¶fîq½ò>Tn†xBxŒ·¨› ¸;{½|ÊÙÝ×P t¥Øq 厧{ÝÉØËØØeì}šàŽm4Û#Ù%ð[Ù;Ãz8@‘îkõà67AÜéµKAc˜p±}7vmsŠ;áãÿõªþlª~‡nqÐhMñ…ÉCj‰—8_#+C"½ ¸w É8'[x\yL·XDþ¬2ó@O•òC<Ò!»-Vl+qhWóñ;r?îp2QHÎÞ3õìÕX›óø@§\·•Mº²,½°Å>ïËRöÏ[EOà/–¢Â·OzK.$üò¹ˆb±Vøõ‘C‚€ûç[·-Qyƒ¾ æ QèHxáÃcœÈ$…²Ð£µOMÓ\‡aÉŸO6oÜ䇨aGsÏ£†aÑòËÚŠ/ûÜ õˆ¹T7Mña4^ù€ç÷Ýcúcƒ€Lõòéç»”cMZŸ™Tž0 Æ×ÒcD§Ë¡Œ% Ísu#k“úcºä(ÛÎ\0ýY ¨‰œ~¢3T!ôÇHkƒæQJýrá¤sˆü!Íw0õE,Í KÛœÌDå,ET`K”ßÕó|8ƒØr™ãw¼$_(œð?~d†WLBsQ„'XßÄ8cNÏȃZ¥+Äè+C½e‡Ånkb \ªŒ8×ÛøÀx覟†¨Ÿ–æüAVÞDGA\I/†U×äÑ¡–aŠ®™:y–x@ýiTøi—™3å‰IÁG‹!3›_R#!p<—™OÄVç‚-ý]1MŠ¼Ñ§w_‘Wåýö[×*ÙtÃJS{¸“:ÌyºÐ_T±nÇöjâÝŸdÞé-Gþ”¼`øáòÕ“TÆ>±A | kù½À.èCa¸’Úyx´ŸêQy©cp£4›&SâLuuSv?g& Ž;ôŠÝ^¨ `]J” &›îº&#1õo%“Ûrô‡–"ê™-ðŽ@·Ôÿ˜“ §\ùÀ9`Tv„ÙwÝÖÉ‹QJ¦Ò†‚ß²¶a+›ª¶ ¯\KŠõ#l¦J‚;Ûsoºˆ ~:̧x²…€­ëãÿ³eDÊ endstream endobj 102 0 obj << /Type /FontDescriptor /FontName /LCTQYL+CMR10 /Flags 4 /FontBBox [-40 -250 1009 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 69 /XHeight 431 /CharSet (/Delta/bracketleft/bracketright/colon/equal/i/m/macron/n/one/parenleft/parenright/plus/s/semicolon/six/t/three/two/zero) /FontFile 101 0 R >> endobj 103 0 obj << /Length1 1380 /Length2 5947 /Length3 0 /Length 6887 /Filter /FlateDecode >> stream xÚW4›ÿ»·EÕ(Ú#öˆ½©]{S«D)’ˆ ±kïÚ«v©Ú³VUé°·¢¶j–5nÚߺ¿ÿ½çÜ{Þsò~¿Ïþ<ÏçyÏ ÍÐDPÙáÕ@ÀÑ‚"B Y€ªž±$DÉ@SÚ ú‡”hEyÂpÙÿ¦WEAÁhœL ŒÆ™é!àm/7€ˆ@DRVDJˆ‚@2"P²5°7Ì 'ÐFÀ¡žä@U‹‚9» qYþ:x ¼)ßîew( Ãz`´ Ô—v˜ 0(û¯<ò.h4RVXØÇÇGìî)„@9+ò |`h€1ÔŠò†:~ÁèƒÝ¡¿ ‘¦.0Ï?Ä&'´àn0î‰sð‚;BQ\n€‰–.À …ÿa¬û‡àÏÖD„Dþ÷§÷¯@0øog0‚pG‚áXÜàsƒ 4t…д wüevóDàüÁÞ`˜Øgð»p0@CÙÆáû'C¢=…€-ÍM0÷<½G4 óyxÈDáµšë §Q.Íc¨aIà?M§fLÆ*\D8ÃÙŒZ¥GŽfæÕ–ÀžEEüX­z–xW â+XÊþ0=~ÕÎJ~ŸÖ9wßêÕùæÐÐõÆòL(ÉR~~PÐd~ˆGZ”p Énku‘²›}>ν:UÁ©T÷)E=éF¹ZT Fõáí&–ÄHsWz:ç‚Âa•ÆwÆYgüÝöðT ·ø†Ôê²Ø•WÀ¸§DFŒö³¤î§ˆµ©·O”ïnÅÞ–á$ì´úF;鈵uC³$ ®Ð(ä3fg÷+ÆÑÒéÇÁ×D^Úìð ©?3©³ø>²à‰âÑÓLj’œ ä›V—›zu9ªÚÍTT¾/r„•(]xÅíÒŠu"¯ó¤¹6+$ýp¤V¢º£Ñä”pí꘺]"ϦïÌ(Ú2]:}š!°ÿ6'eôHÓ|3u¹^|-p _Á–xÝ*Ñ>ަh'%‚o• PŠb=ºàÊ£Ù8Èê‡#ŸÛ –B‚Ò˜s3?Ë\¸P¿Fë•aAU©åS#[fûçIeDÝzúl£$) ‡]ïù¬Ëî­6ËE «²?0æ¤ðÛ:'ÕnÐZ½§ë ¿ ¿‹‰Ó§Ä¦FÛ‘Tš¿Ó¤@]¡´ó^ô%¼yÀ< 81§4^3•¯Ùo-÷Fm„wn{üIRÀF¨|üsÞ- ò2Q èrC| »ÇÃE’ÔÑÓ!Š¡O”¿ÿ¾Í TNC‹°¸°ÙX5ë«Î© ÓáƒöÃŒyßaÒÍ…c£,ó€œÍ­3—ÏqžüË|)Lf‚95¬KÔ6oÏynu)¨Y;òÞ9[¡ƒÓy9žÍ$GëÍd(+œHès>c1Êp­¢v©X}{ÝÿVMÐK^«^Èî<ýt{¬B@bÚˆdç}‚AŸbn¨×{'â»5”H6ŒÐA')»'ÛÉ”É3ä‡zo}¼+½Xé´ÀÀì¼ÈðQ:»m÷÷jÒ=-Q¨õÚ¾—X /»®Ï“’¯­š’šÈÌ{loYV´ˆ*ÛÉ«ÚÞmðÆë§¶ùCvæ†ˆË £ðíÂ.›@&kaýém1áb"^¹÷aVÓ¯Nf6äžÒÐ×v²Üc³þ2ó¡€(Áþ¤Ï›Èé›ÀGãÓD2qöX’@^/úmï«KêœfY6±Ï-ä6ãò˜Çu@UW%_pN•”®Æ&Vº*½¾À^F‰‡·ÑÊÿXXÜHöPPÕäìÝHo¹ã8ÓUGÜø½OYÄH:DYÐ)ÚAÄÞ·ªî 11}î陕͵"¡ÔnÙÕ‚À/=ž¯²ØŸ;lܰ5Æfeeq¡zÕ@×\t³M&y7*}%õV>eÐ^°s·¬¥_tãúOæ'ÊŸÆymâ  V~zùEò·~ ûõ'ïßõ‰Ô+pï%æL-¸”½ùêÚýhfSÕI=ç¡Ä©†mÌh,6îâkÐñÊ R’QažW\_; kKTdž«^b‚ãdÈO7È? Èä“âÓŒ\ÑÙšØÖeÌœ'ò¾EwW ŽNqÕÑA#Á¢á Kóùi`Uu6…ÂmæÊ ­ÞðžB×SÕ³í]éÚ;ŠF,á…ÖD´ßË|¿s# ¸L^âñ™5r²4|Hgy‚—¶7ÓR˜ÌsÜöNµcý`Ã2g‘[v¤²ÜvXgGûR¢©ôÜ:k‰ë›ÙÆyÓ=XÕÞ§$ý5¯áW¨=ïëZ¶æZÏ–ª#lLvvصªIV½©‚ò=ÉH’=,‘9$#†¶—þ—„þ(ƒÙhü`|d]Dÿ=^Çܺ`3Büh¤ ~€üôtÓ³OZ¹{íEnÆWªÏCÏ/ - Ä·&6uW¾^mªy»G£Ø]ØÑ0¯óvcoªÛ]­Êá³Õ5xc¶õ¼'UçU•fßmOÿ rwí'¯L 5É#»O•½iå™,Ww„Ô ZåmË.Q (ЫXnT^¸–/gnAÙQhª*êê¢à¾íÓw¥õD·¶–}f0Zv€Chƒgt3ÍÇÁLº1¯¨±ÄÝNì"w ´fÎÑtº:†Ïc_Èw²/ü¹]«ÞÏgO–ifÿyù6~׆6¹è'xÌ_xj_!½ðñŽÜG«Â }æ^‚›‹71ùß-¸—÷œ•ñ“–9 ½;=F´) w*(†X:;ŸÒÑõÒŽ`¿˜ÊVd—dÎÒØÖ•.A‘^ú¹{¢Ç9¹1yøºåã ÆöœŠ1ÎÑ‚­ªà݈¢›ÝþO%[³üYW²{i>¢ÓÊh¶ëäêqpÝBlÅ•ËôZá˱’°÷DZ¥Î·Ìò$®„Bƒ«z»ÏË”_Öà)¸.pVú÷+ƒ,ŒéJ7dÏÅJÖíÕzÍxÈUyl©÷DÂüÒßk^Ùnv™ 5äN_¦WX‹7ÓÛ‡[«ØÑ÷ЦÛÆSÝ{e*éŽ Ð«Y˜Ñ ^ĽǴà1)x¤q¸7¥IÞžÀ(SÞÆÜ'6²úɤ#{´Íçwc$f²0¾KfÍg‰Íh­Àzª@`âó›†Re}Ø©Žh¤7‹k©éìà´©1?ðÞÎÙÖúy¶èºYF§ãF j€³æâ2^®ag¬¨’ Ö¿ÉXûùâ<£hKŸ Ý-«È¨nÐo©­½«M|Yœl•R¾~©rW /Û>΄œŒ¯Äÿ\µ©˜¯“ç¶6¾áãwœÜ5ÅUÊ_L›šo”cØ›Þ8dŠŠÛÞ£šl[Mî8º)S-c*ÿò}~ÿc Â'á½ù2 ÖZ~™†§Š¡Ì¡TÆ^.žr† ùrï\šúý‚|¹=¿u±s QÀ ; P‘C>Ô¢`‡¦¼Hj‚ÙRÑfyRq±•µöÑoîEçzóZNÀ’W>p ýºjßÇéq9rSüÆQèpó¡{ûŸ†(lƽž¶©¤‘¾ÛþnÆ£êÝMè£twšìú2O-¿˜ƒÞ>m;Q7L¶îÅPãULÇׇŠ6‡ðVñ/76gQçSõ×õaÂśʨ%µî:×"Ô§¸#‹>ÀëVo¾µq«ÔMvlž9S•ë¸n˜g_,ª‘yPIrðÏ­3Ê H‰+w^Á®ó8c%ÜLb÷#[~úuôRX½f5ЦŒkå>wÉÐÝ1z]€¦‚?Õ$x”±ë¼tßt«0Âõ{xÍXž“‚~èËB0ÙGÑKð®ñ- ù?(”¨¾/ø±[ûQ˜R†Aª‰£¼þS`·^ìáaμi]§R£Š/ý·i㱡ւ"#ºzߊ²iÛë´ž±å¦›{†w ò¨ÈÂ5{Æ2z¯‚W|«V¾¯ðŠQ'fïèµÿ -¹[•GйùúÒœ›4¹Dˆg³öTnyÀÉŽÄÀ42ôÞæ¸Œ=‹&qØÕ3NC‹™b¨ånèþܘ‚“:ð}±3SÒQ­dÁýÀ·—¸lê­íÇVúˆúçS%ľ‘:©üD-zsWrÒ:Ùƒ½6Ò÷±iñ³rKóŽÂ“Om-Ù­zgE{¶OùzЦŸÈ|¦‰"BŸ0Jp Üg?q«OC©œÃÙE¥i ãü¾Òpa%øƒ±Ƽ1ž*Òé·< ÙO ŠúP¬ËKjÀ!"l+Ê­¾7ÍGožÒ¿ÕÊz±ñ¡žßÔµqC¦:sN–z©ÏÂæ$Ê;Qè6XY‚>uµûµó7<'[¥’¼—ݘÇåØ96ýGE±Î²¢¹±ÙQ;ñí4À¯^“êö;ÕÛx*k˜ Ÿ£+< 5}Ù\T÷³¿…ä†ÐÅê?=4Y«›Ë+QîU¡tåç"x}§{d,3ÂóuhD[„\iVe3]ŒÇ!]ÙyK®ìv»ÐŒ,ïN‹õ³‘ÃúþÞSÿÎ÷†3îݯ;…£¼j–9¤”ÙÍ*Þð6…™ÚL[a6ïR¢ѹ{ùcoÀÂ'Þû/ª‰¹š¥XwŽOó3 lVÔO½aad ¼b@±-\Šä$¦½Ë}ö®N•„FøzãESlÑÕ¸³¢®I"o…ÖÝ€õˆVÕ¨òœ¬½¤%•!_ËêÁ#ÂÔb§4)Î!IYm30ÙWibsT&½"¹Yekt˜|ËYÌo*s$ºTÔ‹íj½¯ÿ h‡ªËZòNZŸÕó·Wå8\\æu¤¾rˆÊÕ¨.4…ü¬¥ôQ½þ¨&!‰}‚µÛº«V¡Ý+À1äô:Ú*,ÊœO €¡YÊÔù"—›0šŠðN“‘ÔâÕb'ãdKz;)üìä¹tÇ!"™Ç°k¼ÑÕHjfòÄžŠZžõ„ŽÍ)&Wóéh´?$t•G5¤ÁK¹öµÓ¨Ûš)ÄË:â8íÁ”Â#õl’ýÉ|&ÑcUqàÀ÷Æ ÊZzQ~G”ÑNÛ8C°\WRAâlÒI€êï?¡w‚ü/¹ aï^íÆ‹üÔê%¸eІ/ñq‡‹2„M¥g—R»ï¦:6óø+u0s1ý´>5ÇӞĄqªTEo~½Å}‘¯Hd´Ýçš„­*ÐÌ0øb(-m7.¤½r?2±Å¹¤ÃJ$ê‘lpxà*Œ'Ù-.泂«G5¸¦rO¨S„úK·EnY9Þ©E[qÖ=MÉ^ÈWÝå:pèÌ}¶²]*¼úèdö/†<ÖÇŸÈûrJFTGŬ;B"Òçøó´NNM >Q’…^Ò³æ¥bçyJÔéù:*¾ªä^Š\ •ˆ¢dq¡ 3ÎX°X;ôF‰™ÞN0ð[º|)FoÐ1w¾›kן ¿96¡¶ÅOVz‰¿èB¿È]/ÆBÛB+ÿq&´±çs—Y¶vb˜³ýЍÏÃæó§ U;,:ˆÊ\WÎÜÞ륯øä¢õG‡R\$tÌeGã?Öh Å㩊|QVJ}7ú8¾s@ö ®ïÖé%®U_—Õ'ÔÍÙjíÚQ ôB‰?úC!LÌj=VûŸÈÃZ/­`׆7ꎖRÞ¹dÿ,°–g1í†ÖûÂfãMy‡Ù+o¼üðQÄ‚OsÙMa¾mÃb›ÿ$-¿£DéE®Þ­epÔµC–c¯•A¯ðj™h¦Ù‚/ëëgß.Ö¤Ç6t¹ãÌý˜+Ú¹è&z¬XŒ49ºfΑÒå%«øÒÉ~„ŠÝN%OeóÑïÈ Á «J<A9(Íâ=’ú9|牸¹Dì$ËÈæÍÕU…ä*qá’mý?¶–oö=‚ÞÞ¯’HµBšQó*É7î’%Ô§MD×Ù˜Yr ú.¥<³TŠJš, P/èóU®Z[¤²x„ü´Ÿº;ƒ´j;B*ôùå#‚Þuú}åà.?lðÒ£YK0­[þö&í‘uˆów-¿7ŽºÊúÉÝAd„· [ÂJ”Ê-¶^¹SÞ}]+Š=R­ÅäGÄõTL‹é‘àæe”þKë*PøÒ™A0­¸Í\1ÁZM„ ¢»eðs¶F%Å£gx¹çs{ŠÉÜïH«á˜výŒDصW;åÅÇM“ ¡µEžrí³>½?†’ðñEKF±y³D7´TE”;=Î'ÂD5²ø52v—7?¦Á#«›t¶àÝBþhkt9›<-¢šócèäéïum»ßÈÄÿë(:d”£ƒy O…§É;åÈÑäÎýú<:ûÚùýNm¼=ì'Û .[Iêëo¶Yf¯ìž×¬$!>¿@êZƒ¯åߊ’½§É X³©¿Bwáš4üLÆt&@M¾áÇäÞ,~¤Ó£`®™ióg‘j‰%)„ú}±+h¡b‰ÄÃcó=È’êÍÈ¥–0·ÐÅà×Jè>+êí~ÖìáÁ ãôïâ2^É–»Sô2 '!‚™‚ì…{)öÔ7xÒè‘u9RwñêZ±®p¸s|æ/Fê endstream endobj 104 0 obj << /Type /FontDescriptor /FontName /GBCRXR+CMR6 /Flags 4 /FontBBox [-20 -250 1193 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 83 /XHeight 431 /CharSet (/zero) /FontFile 103 0 R >> endobj 105 0 obj << /Length1 1549 /Length2 7416 /Length3 0 /Length 8447 /Filter /FlateDecode >> stream xÚtT”]Û.]Ò€ Ý1tˆ€4Ò%%H 00Ì3t‹tƒtHI—€JwJ·t# JJÈ?êÿ÷³Ö9kÖzfïë®}ÝÅʨ­Ç+g³)Á ^ Ÿ€$@^CW Ä' ˆÇʪF@@PÎ0g€-’Èl BþáùÀ-ÝA„«ÈÏç þó†lÀÖ€È Åû×;Ùþ¹#+ï ö˜ øõûçô Ù[60(Äë_õßÅåW2QSÒxÊý›ð?¢Çaž^!Q¯ ˆ( &CüþÓË?üÿæþÕ¶ÿõ6=ªBma‰?¹û›†û_=Áñ׸pþ3‚& ÙÇ Ç¿mo& "`üÿ¿›ÿ·Éÿ­çyù´ý¿GÉ ù-åø%þ?¤–N`ˆ×_rd»!¡CÎô¿UŸ‚þ ±ÈìæôßRU„%r2ä v’†+=A6Ú`„µýŸú»H÷0¤ ƒƒ­/P@à¿dÈY³vD®8²R¿E ä(ýgHE¨5Ìæ×Ì Šˆ,]]-½ð…GÞD>@äpÚ€<÷5€Ÿ C MHz~[˜+Þ¯zŠü 7dÖ‘ðoDDÀo ssý–ð#÷Ù¿w¿3r‹@! [Ä¿(ð/ôO¹ÿ…0Ä þ¯{¤78È l ƒ 9ÿƒ"­ö® £ ó#<`ÿ:ð{ƒ\ÿÿ‘k7WdXÄïEæçïûïy‚¬ñægaÖR/j_¶\ÖÈÑzðnJO±n?Mãäõ™wmu»"ÄNæ¬Îz±êz.—<ØE¼´©Èq&»Àpëó¥±;¬)I§ùÚ÷Æ"Awb»ïÓ8eßXṺ^z\:^}Ùß[_à GôFÔv5Ö\7qBí|²KeϺ޲ÅáÐÙmjÑ'÷nÊ&yc ¢Í‚ЧYó¬²g¨™°¼ô8\¤ÇžDÓgçS¤¯ÇîÔ¸ñüb„Þø˜¬ Æþ˜ñ^®Ð„wаИPÓ£Ÿ‘O°ù<ÞMQ£šó)y³ê:œ:CÙ:²îô ÙåðÞÖÔ½tÝûnÎÆ:&ÉACÍN®½Ú¤’èT̘ˆ%œ}¼¤¶ê©ú]¬Ñ Σ•¾Ó‚ˆÕZôœØMÔ¥µÂE¥v’»´S³Së*ý¤žõ<ªîj‘B=Æ(9ËŸa}Ç»–^:ô/{ÏNñ9[eÃ"¥‚+9Ìᙠͯ=xýêN=ö{ÿHŒÞ¥*;Üj…¶¹`Î? •ËW»Ý9™RÓZ‹¢¡ªRn¤øììíãþÍn&N}û„¢1sy"O´jÝM¯dž8'·Êj”Ô¦J•ÌçG*Y­Laìš1ÍRâìV' 8ÊXd1&ÝÉIVý6kæà–ʆã¦Óxð}KbÐù+x•õ`%Nˆ¤ßƒ»j¡-#¼Lz ÷KôVeÍã¶¹^*žÉ¢V~ÿçãL™èj˜ÄñZ‚Bâ ñ`,@4ï3UåÖ[­¶b[ÓEÃßçFî',øé~î#(í–=Áeó¤ §§\­#·Ç{I1ïcgY/B·ªØ?ãÁî!­ÕxªNmmw©½ñvß=Aâ­ÒP¦÷+ñ‹²K’— ßÛp­Tþ)«£àjš°¶O×ûû†¸åAO6ÍzBŧÚrjTv„D‡n>ÄAsZň)‘þœ’@—HTé§e|f¢7Jþù“v°íˆpÍt'}šŸFD¦vÑà®àx-h3¼¡t6º—Aøu%ß™ Õåƒß÷hŸ÷ÅMI(èDÀjZÆeFfDÐI"IMÚèYÎW€"‰_ÅP×ü©±wMrPÐèJ’Ç‹ˆ y B:'œdЄFëJ_²ãü  o+hÜ(!3$ãÖ§ P¾uÎñR ¢Ss÷ôq$µV§ÄÈ¿z´ìvµ-O’ÞÀmPÚÓдãÐCÜ„ÉLsb4ÉHµÈj >Ö\­Pn3:‹SíÃСøÚUóz-]zF‹ ˜¦Ž_ΣãìúMYÝ'do ÌidŽ?NØ F6ä }»8`ô<4@ÙínujŠm={îðÆzбžÅM²K·Œ|>$¬øÙ ‰¸y&o”øõÖ÷3|æÆloÓCéâa+´ðG…?†º›Ûš¶ñªÅÚ¼iT§÷äSYaÍS7å±ZPqÚïºvÌ)R -)C´9ãÄ‚ jÜÁC'¾ó8ÊYIÅ»3‡Y_È×%jgƒÉO@^ù÷InKø$¸yx­„<%žÆ_Š¡ùeÏí/I¿xϬ4Ò5¼ù92UzßÀëVßùª1wÝñÍâ&YP¸ä³¥è$¼$1ì3%#Ö´V&€y<ͲRg¶&wâìÊï!òªÄŒhÈžn º:Û˜ B;1!º[îߣ„£-ç—Ü›¦Ò*ªö7õ½þÞQžÑ¢íENI!”ØFçJ†‘¯Îåµ<ÕB¯ð”œŠ^ÚsÒ ¶¢çÑÍŒ‡E‰¿î§ZØKñÙtÃî&ˆ ±.àÚ–*É,Xm¯ö£@ +~ú^Œ’ÈöLð’äÓ9|‘³Ýx×fxcušW‡K*ަ½hSë@-̸gØÒ”¶ª=s4qŸ6áM†bÈà™ ->íU.Äúá~·©'óß;ꛯ1qUósÁÑ?vwrŸÝ.·Òè!•´ËY?ìì;Çí1ÔúBÝùœ´PFô ’ÙwÂËé‚Wx„—gè[Ö=Û¥sϧW„1­å­ïbœá FŒ1¢.¼q/5ˆØÈnózãV™€ý}<'MpÏÁwªz©™=Y—¤†wLæ‡bÛBYŠÝ ±ÒÓ90òõÍžœóæ;ÊDüš1•È·.eãÃ9³îŒóØž ‡[¸b7ÎÍ÷Wmù.Úºä•SÒ©‡ô¬ðoyñÞl ŠeŽp;³ Ÿ;¤SlѼ?×2o¾}£ïì£bžOÞӃͱHpêÉ’öîÛrºå™˜@“·#ÖY-½AÔ}D{ìJq¥Aæ ^[xvGZ0b”"_´2´Ä@¶ß‰+H€Ù×d¿qS¨0¿b—Ù\Žu¹P^îbw^câ×´pQá´þ˜Jš×Qt³eõìÚåpbÂAE}|ÃÊÕÅØ…Æ õÙh¹ ½]ÿ| u¡³XnR~¥ä[Íy9 Ô–ÃЙãäoA_u9|)Æ»,.ô ø†.Ä-“  °²ÃÜ™ c+ŠéíEtdâNòÊ8w"“íØÔòXŽŠÉI§‡xÖúôžQ°}(¹Œs ìs-epÅÆË aßõl5_‘¥ú¸˜ÐáV³£Ëö¯Ù`\B!ô >·LOzNóQïz3pg…‹úÆqDTwF~Âö |H§…˜ì+:ƒžÒ6þ7rÖM\ãd(¥rfÂôRšS>õX Âw‡y7"g[êÕóÒŒ†"|÷Ú²ý\QŸ¬_ÓS¾qy±¥—ŽÎÅ®{%C(Ù6ˆPBµð Ò2ä¥>¢ œ'¾ÍPJþ¶K/Åeòº9æåJgn$±2,t§;§À#Çr;I›þ±H„,Mw/ÍQWwa0Žj Ä’$CnµÒXćûü¬Ïyœ(ËëÀ9Ä;zkp JªÆ#ÈÉÈòN|Á•ÉÆÌkJ¬ „Zv9…Kz'¶ÚiNÞ+G·Ç^µÌÜe5¥@•uË/VÕc¯¶#Ò3¾Ÿm÷Ý{jÅPóŒS'†dÎÁŠ7älD¼¨L—5‹_Š>—Üçñ ¯­•¾EW#R 4}Z¥Ðä£Ð+¶ÔL/ÑyNË®¸’s1¾}Í <:¤JN@¹Ï0•óyæzÇx’)¶É ðŸB-Ë/”TïôUÖâTèBž'¢œg¸gµ%)Ý–fâ³ÜñB}Qé¥ñø”±UÏÍÑËIäí¢‚7Þlñ-»ðýÁ‹ÕQ”—:¾l³%MSšt©­…Ù¦ZæÕrsñ…F NL?u˜& ØûŽ>£Ï"ÙZÆ“P{?Óø`àlfv O ’pfóµÝ÷-šN <:èz»Ï^‹ŽÜL(zqi£²]’ªJJô3lE‚5„' °€^Ãì»Û-Â’a8Cf›ú…Æ Øð‡íu¹ k)Ýš2kx¯ð öØk>Z¼çÍÐgÃp’7sw^§¿,y_n1K£J@rÇç&§9DÕ'\5½Ù}ã–‘¿óÜxušr ù£ÜÝzà ´ Çe½¢#®Jyøk¡ØO…S-Ú¦bñ~ƒ¨Ä£ä©›1•Ðûr©3Ô­ ‰ÓJŸÍñªÜé!Ígísý¤Èèë{¶v9Rª?[W;“eò™ÒOÍN)x×â«h<ÂS\æé¶.šíôÝûï—@Nˆ¹-}õ¹†üýˆ'…Õ“#Á›#´–Èkóí#ó§r†bUž:þ æ#Eµa[~T]Áb|‡Ì•~Âúi¨,šÑt†*…oS27r¡Y™‡6i–pdëIÎ2v>‘?œ£‰|LPØ”¨p™àÇ$þ@™¸"$3×—áߎ9KFVH ¯Éî‰Ó ð3ÌãN¼&¼: rÃß [v\_*ýÆ8ÐNýú㡟'@ZÌä»_0iVý^Î3딢/Œ³þe12~läÄVF…i .s`Å(!*t2ϧÛѸ×&¢3EЧbùuòÛÜ’O¦÷#’Þ®ÿXöW²Áд+â(6í°ž£'¢ŒÌ•¼zw°8¶²Õ» ôÚ¨£ZÙÆ*'òh•‡`î”U¼Ív*uêØæ1Öz›£’%Ì’¿îËvµd~f@[Øæè §{oA§H1^wËÚð–ßVÍ;bxÓüÁ½ÌzöäºZ´ãº€zÁ‘¸PË—-”ýÁùGƤ„³¡& y§·&tÁSv!6ݸSü›¾y§S†c­ú¤”Ël÷Y,2+(C¤é×Þd£ÊsÊëžý»øühLµï‹ª•.Î`˜%uy¸bª©>Í3σÍI®Z²Å;È/S T÷¾q;¤>{Òú¼¬fÈ­+sa€Îžåvåa©ˆˆÉi0Cý^œÄ—ß[¿ÍiD¾ qøšNYÌÎ񵧾%Šá{`O^"c¥ñÖ÷©Âº:Žhì¼×óŠƒáÜAéq¯â‡æpƒÛFò'‚óúGg8ñÒ%¨M¢æÃô´Ÿ…,µXÑǦt‰¶ñ[£‡³)W²¦ðYG”€ aGµæcYþ*=­²1¨±š“ÓÀýí#o`^&mÌ«w?1³¶¹Ð1ÃÕnžÍ'úbp´åCÛ<äÉfƒlhm­Ê$+|ÕÆ±•7V¦Çj;âÅÉÔÇb\LlŒ(££Ù¤—1l,ß|”ÅÉ<‡´¿î.ã Ž–bóuÕ ¤n¾ìèÎ1;Ï!ÔÓÃQ, T‡;îò݆÷LhæÐưÉ>G%žÔˈ–8 Õ§|« ˜‹¢L}Ÿl•° n͹×Å?DmCmk=b¢ç:ûY‚îMΡɑ3Ú}]†žþü(ƒƒ«¹lÒ!å‘|d*K~0£dU•4;‡Ü qíæ€fúÔ¥í(cª fxèb³>U`ìqtNœQ_¿Dì æ–-Û ~îW4 åvìiÄ=˜z’I0Î}o‚ss\£*V&¹C5’ýkX·ÙaåqÃ|>}º‰\“¬ •4<£umû[¤óÚ}a´EX¯”$‡ë–ãmïcàš:~õyütèf®i›€VÔ’m,ŠŠrÏñÓI‰R[ü«/y"7º·¿fPÛ"·ô〠J’ ÛSì‹G"×ë?âEéWËä2TÕ¢Øã|xå µ,öR_˜+uˆ0ØØÜwâ.c˜•·*;3™"œˆšö¶?îy&µCô~=—@?üAMÓ„_[ÔrPËþ‰×iüë÷ŒØZæƒ"{RE¢«}Ó=ªC ÑéN¼}ž²'hS‹ãà“¦í‚(-¸ÑštqòóV)iÜà€æÌ|îÁèËò(‰›ßZöëèªãè#H ù«W ï¤-Ðspü"æ—¸€‘B2¥ƒ®"“ÇÕIõ¼Þ™Y 𢀵ÛúL:´E½c?èåNª|ÚG­¶ œzVùÆëŸ÷ÐL1,FÏë|¤«–±¸©mÊ/ju:~þ]1Š»"3‹£e|ß^sÑòó´W'øŽ‚F R¾ÝcU¨ª5PM6¾ÌùÉäà( 'vò•Ẋöå½qºä$lhÖ’öÃÙîNH~åi“Þî¹¹`Ì0÷érRª+“óÒï_vßG)—øÍõ,âÏXNª§Œ±‘Ê$ñ"ð5¶n³ø°*Óò[_‚ÃôõÇ,Ù(œÏ0³H1vÛ+Më*[w¥Em™}|ó6tõqþ]Ī ð ÓW%æÂ•'Y•êwŠ\÷œJé–<îå/[ó ÖØó¼~ÈlÛìÉú“ûÁªºˆpn²×õ^». N slꉼ!6„{ûÔ¡Œµµo`}özn·ÛÕeûµZMvP{|틢Π-Â4ÛØ*©UAÏ—°Hô|“ÏØ-)ÅLÏgMØù»?‘öñ©fW|EÙ:/Z]þñX_Ô®+ªGÄæw8¬¤ž)â ô3ÚÍn–‘Sé¯^¥×ÖâRfµ˜ÁÒñŠ ãq[Qƒ?ú­IŒšé¥Až(ÊV|d¥Âê-ÔašÆÞZ99d5T8)¨ˆŠmʤÜiô:d — ,vxÎWÊð!yŸã‡DíÒÆ .cñ+©¸¸~SÔž¨“GÌ.° ›ØgÙZ:°¤½y9ËïÊßÛÐ_Ù=…øBqÔgjq¿m*Å)ªLfšùCØiï'_&‘7®û:ºïv½)jP *ê½ 8R®zÜý×õDc8"ûF‹þ::tz³Œ™8”ð¥ÛPƦ+âõRf9Ý=·§Áä§,{ýw‡“WšÈ–ìIçœIŠÞã=—fƒç^#x‚k8y?ýiØdGê5RÁѹ?/¥ÑGkîÇ-œÁ¾t¶s—=é[Ì Š‹TêîE„x÷ððÖu øñÌ›'Ò-!ÔÅVÏ<¿œ<æÎ뺇­¡Â //¬Þ»ÀÝhŸ¬é‹›¼àºjU.á–ÿëÓûvÁé‰péK&çm–âó\&]޽b= gÄpÏç= í`¸©ò‹¶gžl #É$Ž¯ÓšDoJØño¼c•œR¯ÒŸUF/9éwûŒ½°Oô˜D&¤qô=¨&½uÏBhuÜ ™ç8žOM“)£9îÔ¾óŸÎÇ/ß}û"µu±\·üs8ð¼îÔKU6#2–Ñöøƒzèi±¢hÁÉÃàQîåM¬Ü ~‹ 7ÜFš'¡†£ê{úª2Æ;Y4nŽ¢ }®kv%M–¯Âp).Ò?ˆ?kHWÿ”¹rû,ìo/fé |Wê:›Z8T0“^sk%þÉWl¯;`wß‚,™´Uî{ÿ;Aø#ÙC×Oޱl,ÐíéÑ0Zhå|ûókò¨±›' š¶!¹ Õ[¢}ÂÌÍl¢Igu«UÃS?ÏFÖH7”«´ îôª ƒ%JsØ3Ø”¢™ ÆÖe £O[;]1~€49WÅÊF†‰OsÚQ|è­ÖcÎv uôÙS}k¯†?,2øÒ¬Ë³kYÝš©9³”}¸Ý Œ"ñƒÁ) (\÷BA·÷¶)ßôí…7e3ë¾¹¨-{'›½NÙ­@‚Zj+ã-jX9¨©çe~ø0Þìà†[¼÷Cé&aB„äS¸ß[Ü©"³ð“½9ß"µüÃ>¯2¢ÀUÂEIOÛÁ‹£S­{²EY(i·užêÖ¶=y_$´ØÅ,KÒÎ3„äpgOÊýÐýµ³ž–ê3›<=>KïÀô)d™©‚_•R ˜ŽIænDi µT Òx¡¹õQ/¸ïKĘE²?ÏTæ…£òáሠ˦җjå—ӽë¦+Ý}ôºLiWÈ+ò bÀ×àó‹Ø!È#´ïtZW•òÂ"ó³†.?*Œ3d»}X$:`«‹Þ²9’8¢ÕZoA?q¾Y‘Ÿ/ ®I€ùF~&$¦Ûš ¢Ð¨Ä½Ùm-ªÉ¤¤L%¯*Je1íkƒðc¼+¿°ð'ßÉÊL>¾ê ïÕÉaÔhšHì Ä %U6Ên²ÅÐÜÔc»45Snª[½¶ÂhgZ.¸îpïæoÔ±Ïæ‡~HúB~úȾy8qŸâ“JceÓc£Ú}`?rJÍ0‚=³˜“éí:´^ணí)н-\ð*më#‡xGж„N7¹n¾ ˆ¾ ¿V@—å ¥4ç"IÊ›kÅpG¾Fñ.G¡žÆàZL@˦$þíUîâ'"îw—CÆžæ¡FR†/®òº¤£1-,ÝI®2?¥™^ {æÙYD|+ù°¦óF‡²Ëä -m{oc*±·¹T. ªOc~ùÒs’ñaÑ’¤•«ÝÖyæþ€¦,>lfHHA:ÆÇS¼KQÌ.2²qnï£ÂIÑÐ&g‘  óèÞ»c­ ¼¶1…çu}ü†ŠÀ çÕM‘U‹#eéIÕ*讥[)bÎê³ pQ2 îÃo_®]?§!`býtÚ†1•}´àå¶4ÿÒ7.á¾-:A½R™öÖU8#D³8Ñ×è?ÊÀ¯§+}ŒÆŒB}üå+ufÞªøò«=ÿœ0[úú‚- <ÛýœæóÊz¸µÌ…§§¢KCb•‹lÞÖö.°' •¯&Tu€Ô9”;„£©Ÿ×ä!ÎþÌÆÚ³E™k@º+#ˆF"þí{¼%ài^Þ=éåfã硜Y»5.ôñ©´6o[j!Ñï†×Æîí›&‚Šû© "É)°¶KVv —Ì.ãý_¶sÞß{ – OöOÁãÜ9=ò=²—UK•zœý$ÚðSìôÝaÄÛ>±>y÷%Ó|Þo­X=±T 4hÀ*{wiäˆÏz‰ñLÙèYîotøûišn>Ÿ¬ûP˜R®ðY"ú© µu!`0À6î·ÎY8ùˆ¡iu"åE`ðà =ùe£E £>FïJªÍÓ0WV˜÷’ÝêFœ•g9oo5Ÿë~³û5ÁØÖçú²WŒeªâ}ȱEfÁ²­FÇâ¯+*í³¼Ç|E_ü$rb1»°.@÷~ëw|ïUv;õ¥`}»ëlý¤‚ú¼GpúÁö/ŽV¯ºVâ"Œm ÷,= mŒY«ŒgO;£ùžZ`w?w ¨ý(rÊè"›É±Ôq2œ²ecšZi0îx™ð4×Ó—&ú›ƒ³Q Î:“2EFvÛü`ıºS]"ÍüBU˜mî5 È™Ù7T R£Ò;xÑsÏÖôÒ«Àà‚#gñ³†ÀâWÀ|¸¼ õReàƒÿ¤„Ê©šL¬O1óz’b³êO2¬% ×)Ú÷⊴óD/?(è¯ÓcѹXàò‡}€\ËØ’+¯5 Î9œñ;¢ñU ï/fÆË¡ì¡â¦Œ’{Sµ˜Ø ­¦?/dX1N“4njQÅCÇwÐÐêž­ؼ[÷q4Ëñª£jòÏ'u;ìÔÇ۲Ვ›-t‡“÷©ÓåçyÔ×kòø}Š)²xi¡® ÉzñÍ8o£Ùø¤À*üªûzæ…Jm9+Ö¨½#€V‘e˜+ÊUzzÚXŸaR¨½>¦€gDiñ¢?åd) endstream endobj 106 0 obj << /Type /FontDescriptor /FontName /FZJFMW+CMR8 /Flags 4 /FontBBox [-36 -250 1070 750] /Ascent 694 /CapHeight 683 /Descent -194 /ItalicAngle 0 /StemV 76 /XHeight 431 /CharSet (/equal/four/one/parenleft/parenright/plus/semicolon/three/two/zero) /FontFile 105 0 R >> endobj 107 0 obj << /Length1 1665 /Length2 7740 /Length3 0 /Length 8836 /Filter /FlateDecode >> stream xÚ¸TÓ}7NII J ¤QR@º»»$Ç€ÁØ`ÝÝÒ H‡t—´t ‚””t¨ïôö¾Ÿç~þÿsÞ÷ìœmßÏõ¹úº¾¿13hé>‘¶Yƒ`Pä^.€¬º®1/€‡‡Ÿ‹‡‡Ÿ™YŒ„€þÆñ™ @pù/†,d…DarVHQ¨¸B¼ü^A^!ðßD\ g嶨sT`PŸYæì ÛÙ#Q~þþ `²x………ÿVH;à`  n…´9¡<­ ] BzþË›˜=é,ÂÍíîîÎeå„à‚Áí$ØÜÁH{€‚»l¿RhX9þ¤Æ…Ï Ð³#þèÂl‘îVp@À@Rq…Ú€à”w€®²@Óý‹¬öá1àOq¼\¼ÿ˜û£ýËú[Ù „99[A=ÁP;€-h*¨q!=VP›_D+†Ò·r³C¬¬Q„ß¡[¤µV¨ ÿä‡ÂÁÎH ù•#÷/3¨2ËCmdaNN (ÿ+>90DÕÝ“ûOs¡0w¨÷ß'[0ÔÆöW6®ÎÜúP°‹+HYîáÿ³!<‚‚¼ ä´çþå@ÏÓô[øFåàëí sØ¢Òù‚mA¨|o„•€„»‚|½ÿ[ðï>//À D¬Av`(þ¬£`í_gTÿá`€)jüx<¿^ÿ|3CM˜ ñüýw‹¹UU4Uô9ÿ¤üPFæð~Â' x",Èàåå |ÿmçŸ üýoTË ü'ºÿ²¨ µ…„ÿJU½¿qû3lÖ†ðo0Ô<ƒlÿÿç<<@ÔïÿóüVùÿ›ý_Vþ¯ãÿ¿)¸B ¿ålþ?r+'0Äó5Ï®HÔn¨ÃPý_ª!诅VÙ€]þWªŒ´Bíˆ4Ô5çOxŸrñ<ý #À -0hÿ×,ýÝ ” Ò‚!À¿î”ÏÿÈP«tDÝ-TË~‹@¨Íú·_y(fókùVp¸•'>jP'€7/jWm@¿GÀÍ…!Q*T޾[ÿWcùùÜ(-˜û_íBÉþ‚Q(U 0ÂÕûp^A·µü¿¡ß€5ä¿0>·‚ [äÁüàûB¥ÆbþÚô0>^·Ý¯{¹¸ZýÇöSa7ŠZv0jRþa£,@PUú7:¡®ˆÿÀûÀ EÝDVÿ@‚¨œApÔˆuWÈŸÄþUa +Ž í÷* hŸßx ˆ¿0І8Ô†´_UKÓ¸?ÙÃ^]댌7î@²|xåm¯†“©8í"ciSI9’¦5_65çCÃqt5îñ¼;;p%U)‰&ß¿!sò$oèÛY·ˆÎFm7!”¹Azœ MKliŠeÊšd8w*ÔÿýæsÁÏN͉ð>À PtAÂJƒŒ•ÎéÜLj6f`ZC?'yqnšîª§¬?ñ#üâR¦=†ê›ç†é‹ŒáååwÙýiü§ùª½U‚•adTä^* 9#‰ƒT÷²Ušh,2²¥)ñŒT…Na,+˜–B+?fòÚù]ì4dïjú6ºÖÁæÄszVNZlfé}ã&¤lNŒ´\Æ$Ã\eƒv1œ~\ÅÉíÅz@À®ë\¼UŸ—\«a|lŒÁñ æ7ÿ\sÕÜN{Ëb VäÓxpã~üõŽŒñtà‰ÐÜJ®Ì¾¿Y‰ßó\ÛØ/¾nŸ7çI×E˜@"“»¦ý7,^Òv˜ ¼x˜þvò ·ƒ5eÛC©áûÖ ™õ°¢È cH!¤¼1N Uvyà~¤¾é€•Zûy3.¼gÔ¶ñü¯é¥èÓÍ@gócçe.2r€{Ĭó¡Âü•ê,ÂÞXþr„_ŸÝ#´šl⛃r¡ÙÛ6âoB$U?>Èß7eŠnŽ"­û®è|rÑûp™¬µæ!·Ê ð³0HáÙ7-þ¥OÜFš‚ï<¥a]5G~ûÛf†.4rAê-ØÆOW‹ÏšIóãfGó´äOÔ~òmXðµÜ­l)…)¥xãóRxLS‘í±vµ»Rù´Á¯.¾jÐÓêdÊ'Ÿf´ÄÍ`œÿ`IÞH‡Ð+Ü>xî¯FŠ¡cÏû†N!ÇúKQå„/g8„PöÊ PT¸ØÃ†òÐÍvÌi;A™­¾H_ç{ ‘|äX‰`<ª4÷שølVæ¶Iò\¢Z¦94ý‚AùnLíLímʯ:¤7ÈCÑŒ®Ñ/郮RlÊ£Åd3wõ_e{ûl|ýªíkÅ¿¥PÁLé<{æUAƒS0LT2”.é©\­cøh°2yC(Û:Ll«K[tkÍ9H”ì©K¦MήY’x2°Q\Þùœ±ü[cJ&Å”Îá7Ù”ùB¬lm9{|*¢)‹Ç9ƒF²‰;ï=ˆµ¶…lK+_i™c”Õe¸/d’Ù()y9²/ùƒ=~ÄÓE èëk)×Ùz«Ž—Ž!¨C ŽÆŒ«Úó¹ܺã&LóZ~ÌÓ5«1kæIíg(‡%Ý[Ñb}¡òzdÑß-aöñS=£½~±ºäyݾäZ’3Ç\ˆÑ ñE-^„ï†"q’TF¢€ù J¤ÞVÝ3ÛÖ0µ§vQxp‹&{H=aÐÌçif¢P¼E‚‚ï‰:^¯ÉÎÎlw½Ã'ÍIåì—ÎÅ6ó½32ÖeRFöæ|¿¿XÈAðٲʞy®¬W[ ¾™y#e¤{–T¥ra ¦úŒ®qýÔQSœâð¦\jNX²y¼¬“^¡øìˆñ>ƒƒH×Óô#öÁå÷¦ñù™ç°¶ óLM,1[g§f¤Ï )q›Mˆ–nîøõusöL½­¾+Â3ŒµŠ£…ɺµºŒy¢q;)×®æhº‘øÒ§‚2⤋ùnÐÅ ½ ÜÊŒ¸š‰vÆÐ©ËR23nì±'þ¾ÞSCR¹3©œÑ3ÁDè?KVãÎСÅú™O³Þe„¥AhÇö̈oe»'9´–k‚6·* >nŽwY•fšïHÎ>&À8<µFæA’ÒíIn5#Üz,бuvGë„ãuæ˜Z‡ ÚΗxÝñ4—-pÁËönÑÂ:“Ô®M·y:aGOÒ”=E©å†>l’¨y³'ENtBÌ*–³¬½e%™ƒ|@Ë…î ;5©c‚±#…:Z;LŸ›ZDn;Þ³u¼4¿ShÃZÑ»ÕE󤥑à7M?€ùË ßð….š˜ù% §‘Ð*“kê¾|5¢goÏb#g 0òŒŠ¨,5¥Â÷­ªKçg9ìé_q\r8?,=SúÇÚ s³ÐñÉ,ÔGc~Z>‘ªÃá¹g€ý“†õ<{¢fò¢©[2T@l#¹\ct‹Œ-Ø88´ïÒQðÁøí¡Â¼ØŽŒo]ê®cÝb/ΪÎ!ÛÇÙ s¾yf éëŸN!mh1ãÄ»§`ØÌ»ƒÒ§TÚ[­÷+Cò<_’ù$Å}t£¿wÌé_K×—,ß|ñ¾v3Q}`ÿwåíƒ}ä|(æµ(3lAK¶~×Mãh›QQЗ è€ð'7Ǭ7Oš"þmL2§Ïv5Ûf‹Áì—Õ(Å’ ˆPª-!¹× <×âPü‡"£7kÙÓ‘0#u@[eoJMØ1•÷R]ã‚×´Z¯IˆOK¤:ÝÀÓ'ÄßÖx䣨Mt¿7ŸI®…WàFÔ½[£šo–ÞLnéî@B:kÆ•~晢éz ÆÕóiCµ"9ê_@¥qE¶EhîŽÃ)é®”xÙ…pKâÀŒ±“½ÇAL<´ó7õå½’à®{÷"½Î¶Ÿ ôûtJØÜ:xêeÆö68 ~N[£r)µ“¦J8K8žÛš‰.ìu§mK/BvÅŸ»éךПv§FËq˜&3Ÿ˜UŽÎƒ9Téª^y8äµrá=Æ»â´æ­ž«ýBЫœ‘S;Ö6Áä¼lÔz…·Ÿv°ŠMw¬bƒžðr_Åä ÆpÈ Âþ&`²o;¥µç¢è{y=í#~“‰ú=Ó# é£Õ‹½ƒÈþRL÷Âws+‰Ÿ–ÓÎY:àqõãnq‡r>RÙ¡ ¡¬¯³‰Ç©U ióIü¹v¹Jhh†ZFxòS‘:Ùk­Q\ŒÝAöÔT]DZ¯@›sNΧG*á°z©êšõÔÀ[‹“=éiþâuíû»]2tç~L'Âòù­âÄñ£Í$å;/½ÝïTY ð_*ÙÍtÕ=})“±³™u ]R~o­Ã¥vâd„˜~õíÊÔÓœ(ºð‚øÉ#Þ7Z¶”ïñ*ÎÏéöç žo´ßyø ^Plš°Üífù‰ ½¡æG,Åy—¿Ç¥"Óm.MHáÞ—o^ËøÝÑ䦊¥‰N…±Œd`uMfB8ee·-:=ÇHG6÷¶;v_¤Î³V6©……èL/B`s‡T¯‹²SZÎòk #†wN) /ÃRãD†·ŒÓ²J;W/Ÿ½w¤˜M¸#æy•­áJh•Œ³WXÒÑÏU4pŒÔ¨/ì‹€ðÕ’4;J+›…³S¨_û7êæ¾5N]€6PÅbcgÄͲ”p˜¿ L`½J¡¯S^³4 ùˆ­Ž÷¤]vÒMQVß»Ý[(ãLU4Šåùy²: Ä2ôw…,:1еÛ?~Ýd-ÒÈR¬?^»“.A„Ñ_2öÖÁ¬þôŒßHB%ÏKrAî0@\ã*½ÃJHëíBamÌ&Á¸ðŒc'ºsẖēÿ ¶u…¶8‹TÚè!Œ“s_o¹2+ è ‰¿¿oóÊ[>ñþpao´{àÕZ)Ó}ƒµm{jdö…—#“£#“ÙÓýªûX'@Ûæ¼ïU$m²X†©R§#g?ø_^¤9ÓC´«^%iΈIJ^+¹Ïí|†Þpöê¡^’K§ÂÔ3,‹›YiÒÄ.è>™ö{œÛ|'ÕÞ,^¢b³]9ØN§¦`¡Ñ‰õûÙ¯¿°r<øéb ‡=EŠÑÌÆ8žrãJ–ò9Q±çŒLØž·T¦¬­ç_y>bÛ¨²dþè]FCRÌЮM—ÍÍÂXõh9·Ý–)笘…G˯›"§>Úiª>ŒÕ~Íô©VœœúSЇlÉ=)~ ;‰u*ÑÞìÃY4fu_¥‡½Ô»…9¢²6¯×Òï Á;¨ªyÉ~æ*R“tEC´È”CEÖËuÙç©­ÎìX•ìØ7Ùô™¤ùì5³l-ß³ ·â7Ô…º ¸±4V _Ê®nñk 5ª™ êÜõ´\½ Ú['ª¯´r¢9Ÿ¼¬,ÍÓN«Qøª¥Åئ:ÆYÞ>mÜ "“ä)gK¹ÀÛÐÐdªÕ‹Ú9âwßc3V~±|óõHÔröþögéI\%‘ú7¯ÖŒ•h­y“ÖÛ”½›Ýƒu̧2©ˆã¿bR(yŸª$·pj@-é|Šã9•ÖB®µÂ¬ ÞÔ38 Ž}±p‘§¨:¯e_ç§QoÚŒ¥GÛ|«3˜«ŠÿK’½úS·µ½®sÕECïlõ™~Éq±¥ê§fßD ©DÉIÝèãCIÒï­‹Þ ‘¡OÄ‹,6"‹ãÒZS•ÌeÐ+ˆpÝmB<8À¼Ð7Û|œ(>eus÷g¢@ýÛ¨x€:RÂS¼*Œc#ÐZ³ÓÏœ°ÙO# ¯Éƒ°6^õ¥\Ÿ¡??¿œÏz¨ˆ±œ§•Ä"„Dc\¸*z‰ªÚ=ýx6K'ÚäÊθ['ú}I7%µÇ­cääú«¬_d—Jpw¢£ >W5Ä66Æ9ç’ªöLãðLù”ø~àÄîÊa°LÅlíCèûµ æ2—otNrÄ_€ô$ß`}¤´Ž³‚´°©¢òí5­PT>"(óÍ\é€çöÖp_Ž^nŒ¬Àµ"Ün]»D`”).<-†Å§:®¡+ ×/eY±lsþYNÚa^¶ºÛÖ*›²8xc@øe"úå0Ëlܬ_cÔ2Ts>:‰ˆ+æõ‹Ê<ÓNŠÉt˜†˜Ã£Ï¸7¬AÛ}í¼•dóDoE}é‰OBŸ«û¿α‰Ìƒâj$/BÃ6ÈL2žÒ©FØ…c•öïô”n“IÅdëU$fY­.™T},µU}?å¿Û8u• ËNŠ$ò=c øÙ÷L˜ëç\qÛ¶5µ› Ó_¾‹S’`H (‚"|nÔ¢%1 µ;ÇSVØ‘ìA&ÏÇcëêkŽˆødL ?•k I:~w,Ì/íÀ1ªb ®=¢-zM|¿GL¿¸öƒÆâ35˜Ã"â?I¸AÆ#ê/©SHV£›ûœòB5'›Ø¸61ϼûÍNcœZ^r‡SÝøB’ÓöáÅýBj7ªhcŒ0lãÔ‹zw˜3ÙùnC†|ŸÖK!IåDŸƒ±ðúi%cV·]’LÔ˘ñþ­£ç¢2æÚqš¥Iüߺ8dîò×»BÛ0™šV•ˆöns-4±A7–ïñéÓ™Þ®Zù>¾¯ÍÝW¸¥^ È‘œïÚ›®n@§#9°ßÄ4‹*²>éÂû¹Û¶Wn±Ç'6u5–:À‰Er€|ØSVm:‘]A¥’wSª)UÀ¬ž ´²Kˆ,j˜wÛ}NÝÂm½1Õ{ªn p˜GàvœÓQy‹ÏPXÂ6Õ·´ @2yÕ×xÎ o,¿mÍs( +êõa,®ÿ|~?‡Ÿ;8dzF-Ê>ã…ñ½ûuìó0!Çû«7I˜ýq”Ÿ£=®ð÷9GT!< •rÄTI76ÃçïŒÚßm1œ¤ Esz¼2e¯ûÄÐä^æ¸ %kSõå°xÉæ’»ÆÖË:+H™H$Ó•¦ÀªÖfˆ{¯Åd¤± ºŸnÕÊ’tÉ©ÒiâPu‡Ûf±ÙI¹›ÙdŒô˜îùûíÇð*|Û¥3'–æw«À\×Ìr›®zØÈ‡îF€ïõ}K¯yåûÏÂ2¹õ£‹,tÓ,/ωÄY&,oÅ¢ã¬@šŽô%[¨”w¼øOC‰®“ˆM‰ï UÛžRŸûo[ô×¾ãþþK¡WItèz"æ)c-T a`ñˆk=¹#Uþþ8÷‰MÖb‡ëæÞs´ž1ŒÏŒéþ—¬®GÃ>÷$ùðÔÇRô¶¿6Ÿ}“LÉ>›ñÄ»I3®¥Zsî;‰NIO=±Ç»}\úí~Üsw»É„õöŸº?Ûr²?”A²¬O.¼D[jÒ•=gŸË¸Ó=²é /qT'h’–ê±¼}ÅŸ’éŽDê^~îc¦ s&—³\¯.ÍÏOÅì‰ï ÝK6¦Ì¨¿¸zw²÷XZ:¬¼ª•Â-y=•±Fhf…àª×ྑmà BR,ýT UàñðÑZ ã¦éR±|Ë®ÀÝ äÙ‚w~*W)¦S H¸xŽ¡Qù¼KÒü)ëQöŽuéPÛý[VÕiKwgà„YjÃÒ¢Å-Á…R:MõUTKìrTXÂÙ ­wjÿƒ¾7J]N&HXò§ø•=¡áòÎÕ„\íœÁ¦Îk°ÄR¶‰fA1Ý«¨$›V…Ù. Ÿ‰±<ý®Ï ™=ж® +õó—˜ucäÌ£‚=›µü;U*ì8ÒAvµœz=§‘eoНÐÚÆcáÐUâ µƒ$ÍŒnød©y¯m%8S© ›Oëew¶WĬЉI€3‘ÕÊR>wSã=#×3­f§•½$G†‰åC­¢Éê°Žù·Òê¬Ë©œðü°m 3¿*ºe†°îc–‘}i/î^—Y­l2t¶eúôùúÉ„-sҾˈB²ýÓ‰Ù³†Ãm6ÄÛ…Sxþ…r ïX´Nðg¦G%âkïv ÒÛÐѯ°š÷bË7'¸0±SÁçÃÆÇçõ5Ö–¬RÊF \Ó¾¯®šyõ|ÜeW=Ï9 _z“ɨÉifLÛ«†tß’¯ÿà’s8v%gdgèìå&‰˜€³¾Û(¿Â_¢)ÉÚ‰tšé/×ñ¼å3Ä8i˜ýž¹QK±qf¯G·z÷£Í8hB÷¥ó‰/ó#’BG­šªÜô…뾸l—údå‰vµgÏ@Ãé£â²_¾GkdeÎ7<2̃ZâQçpˆ±ÕÂH"õyÚ;ˆ¯š0-z¼‚?…²=xÄ_Ӈѯï·>¸°„Á(ÉX³YÁ½$²®]3Iïý º]º´¯}×ÙüUåd[ãròt­÷ïðä0ÃŽÎOh£Ñ¬I)”kŠëùh.}°3áëS>Nçˆhà*&²fŠ369t’'oÓ¸Lä…ú‚_ËÚÆ= ¨éºÝ ­UTý*Huî˜>jÒ6‹k »èØõê­ÕIô‚Ã^jh”roŽfÏ+y2ðn)Ýí&y÷¹Nvä´à~š ôœE%Ý…W‹’ÊԞؤª3gØda¯ÝIOBžñ8Ž™^±žy¸øO&¢!&¤º™mÎuGm™J|ñ~lwýýuüë;ê@éò‚Ȳìb;UöÎãI›ž¯ƒ7ïÄáÿ8T3¨+vsJ#¼aZº½€mC8³¾j ¬]dɤpªhV‹Ä„Ü–zY¨ëù4/eW©Uä¾ÓIŸƒ04a’2šµÉIØ(ß  z^Ô£ç/¤6!­^G³Áôª»ÜI¿3'‰Î3Î7ö­¥dÈÖ¡rßì+÷µqêâ* oñÕ\äbÛ« ‘8+#ìñ‹‰ u ˜/(¡w»?q¢p ]yþ¸QƒQh‹¬ RBñêúÝ×åCèZŸÅ>áÄøó-íNuÊŽ$œn.¥d·ÝYÎ>Ó+“CŠáo¨çg—N§ØòÆS¢E]îÎò2R ÿØî{gïe‚¤]cžŸát¼ö|A³ªôãúVβÚù— ²%’EgõQœæ­Bœb“‘gŽ´É¢°þBùüº®—8OfPOH•%|tFÏš¥Š¤¨Xa¥=Q¡çvÍMv]hw/Ý·Òƒ‚»µ¤Ìzï2vf‘#ÅtNÏÑï}öÑ9¶ßaɤ@¨/FmÚú$–Åek†A~‚G‰ú5,hGqìYÂAG6š~a#ÖQ 4 ·ikÍ$}}ãš»æoM26ñìð:燴gY=Ëöª%Ôäk]~êuDß²ËúÑóî¥AiéºÞæz¢Z,Æà0ÇÃåŽ vi>é»…*ß0\­Ü6ª‹¢s£›2çÖz)<¢–Ìg¨¿©eݘã,æ\ÞnwÙu¥|6§ÔÏ‘­´¾Gå‚.æ¡ËiþíA—uy4Ù©éZ4ƶ¨É¡Õ{äQz÷¿éâüѾ/‘gvk½äñ>B¸ª}´²‚ÎÅ>7^ZVïBÓZUÈŽ#ÿñ ¹Œ’KûÐå»á~¢ŒYd·ÙŸJ}Ã*ýÙl–,é.Qrå‚tx­mÊ–J0c mzäGPX*·³:•¦zÿ*JÕpI¸Š²×DÆ÷ë‘qf’·»Ýô¡qÑd®ßÛ3ùŽÝÕÏ ¾„ß¶áܲð© ÚµÛ¤)±kNŒì±¹¿-­y)‹!l‰©$°£9¬Ó4yÞÚæÍc½>ñêç£<{hÌÀ¿»ÿ—á…ãGp¼í„nc{8fÂÂÉ-}`òe›ð»s|h¢Ÿ}ãþ¦ÝÁa™ÎŠÊÝb·[›Ÿ® ã/w©#G‰ÈQ3âÓ{T²á¿“ <ï;o½ÚKç¬Òq•ñçKN¹@£ZÝ´«–m•õä .ð“ìõÈ /À‰­ÄÂßM¯$1œù?Œ§Û¢»$׋ü êc»þ.%×Öx]Z#šñ€¥ªâÂBGpŽf𣠿úÜáYÐÿ/×K‚ endstream endobj 108 0 obj << /Type /FontDescriptor /FontName /KJFOJU+CMSY10 /Flags 4 /FontBBox [-29 -960 1116 775] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 40 /XHeight 431 /CharSet (/arrowright/asteriskmath/bar/bardbl/braceleft/braceright/element/greaterequal/infinity/lessequal/minus/nabla/perpendicular) /FontFile 107 0 R >> endobj 109 0 obj << /Length1 1399 /Length2 6085 /Length3 0 /Length 7047 /Filter /FlateDecode >> stream xÚvTSkÓ.Ò«4Ò!$ôªÒ{oR ! $¡„"(½÷"½(]©Òé(M¥ƒÒA¤üQÏùξ{׺wíµöÞïÌ33ïóÎ3{m^.#SQe(ʦBbEÁ@<@UßÔJIA q ^^38Ö ö—™‚׆ÆÀQHùÿPEà X¼M ‚ÅãôQH€Ž§,K˃eäA €8$÷7…–¨A¼àP€> ƒBÂ0¼ª(wîì‚Å—ùû à(ËÉɈü(#`h¸# Ї`]`|EGˆÀå‡aqÿJ! è‚źˋ‰y{{! …v¾)(ð†c]&0 íƒ~@°?Ì€¼38æÝå„õ† a¼Á îCbðžH( À˜jë ÝaÈ?`½?À_gÁÿI÷Wô¯Dpäï`ˆ£# áAâàHg€Ü 0ÔÐb}°"ú qàðñ/Ü â€üÞ9 ¡l €à þE㈆»c1@ ÜíE±_i𧬎„ª¢‹¡øµ?58æˆ?vœØŸÎº"QÞH¿¿Np$Ôé ¨§»˜9îá ÓVû ‚7Qücs†aR 9iiIÌóqtû•Þ çûíÿ2ãø¹£ÜNx°¸ ÿ ðÃ@¼`,Úà÷¿ÿ^Q€Á(Ü p€9ÑÿdÇ›aNÖøæ£á>^{`è×õŸ·»xyAQH7Ü?ðßýÓ47´4ÓþÃø?>”ÀOT *')‹—«¸@FVðï,ÿáÿ7÷ßV#ü¯½þI¨tBäþPÀŸÝß4¼þR…À_#øw^Ê0€À?Ê·Iñ7ðÿ·þ‡üßdÿ+ËÿKùÿ½! O7·ßnßþÿà AÀÝpðJöÄâ§B…Ÿ äC-a&Y…{"þÛ«…à§CéŒW¸(X’üc‡c4à>0¨ëèòGG·_Ã Ž„¡0ð_|ô_>üÐ9ºâ?*|Ã~»`ø™úw]u¤# úkøÄ¥¤4‚£á5&.%ðã§ óù-o€‰ÂâCxŽ'šâW[%b ž3ãŠï‚Ë/'Å¿ 8z¢Ñøéû­|õ¿×¿Gó9RLO¢Bî׆´×(³y‹. ‘Ì/¶E&XuGHaù>äû¹è‘fjŽy¨ØC+¯¤M= ôgúv<ìcÛ™ýp.M+K ÞýEe[´ ïÇ^§3ì:uÍùLzäúï‰Æ´ö6Ä6üÉ–“§¡2]+UËOÎÚ0+Ör äŽ+ «œÛ¶AmÅucÛoeKwm“ái¦mþîŒ0w¤ÒÃú÷Å&îqÿìloöÛît‰ÝBÝ×ÕÒ•a ¬Œ¾:\¹I=¬L‰Ù: >©CÕg© ܬň0¾9"Dí8˜ýFÜVPÊ~@q) ­•¯t}ó~•R«bâ bòé¾oêÚÚHŽÛ¯L‡Ö`l¯%¡©|©~š±ÞØk™ ’­<¡ëe<—[m­)äS°ºé,} ò³s†žÞ}^iæ~) —Ñ›äzj²(ÄÔLÖ¢ûJRÎÜ $g°±sa¸ÄÒÿÚä4ÒÝk›Ê\‡YmÕŠlébD@ ÝÃÆÖú^÷$ÀžQêN¥üã·Â÷#^qJHW>»Ìд£Ôã:ÒiÉìùbKò¡Ë÷Q7¬šl±éÅ*‡®Ç}-jÿŸˆ’ya§ÄÍ€‚ížJ…䌰®ÆEŒñç–—µPµœ¼®¦óQ*òš¬(åW|rÁ‡5Óëa\RÙéI¶*ZBZa+ÀY‰ú¨.^*‚‹²hç—%†›Á9ŠºÆÓñY-;œëÆ>ú G™_ë¿çÓMçêÑV»õÒíômÍrQ6‹Yµ­Ô(®¡ã´  Ê%u” “EåQÔç¯Ó´9aOâT¸¾…(%,wF{ÙIfÖ"0‹Ë2å‹k—GYßë‡8HتŠ1Ì£,#©è®×ÁmÁFP6´yOË=Ï.ð zû{“ÈZD”âúÔëGY”pºë¸;?-±÷Ò>©'@qa8²´ˆb©WŸ»¶b~r®Émî ¤½…c+¦µ±7zîRêß\[ŒZ9–upûx™}m¿êS”´~õ&+Ÿn9K)÷ÌHzZ=žd"Ý£0¾O #fÕzUvØùðeû uò¢ j˜ÆžÊ¾Ù丮VçHôhTM ›,Ã=H$d3~2ˆåÍpǧ:–ð é#Û—ŠæýbÎú(D¤j¤H¶‹nú³w÷¥h2~Ò»HZ¬’V[÷9u}˜X=Kû5L0‰çƒP·i !Xíûý×~¶ŒÏPÛdùܦe«é¤/J½*<˜'à`YË=Í“I¾^ÈøÅíf5X’¨ïÃ?„*ߨKåe©88š\>1RÐïÛÉ÷Õ¢ŸÎMp;faý°c²»Ê}š\ÃÊìû­×ºsƾ«Õä}’• ¸Ê}s»Lå!Bqz¼}´ Û*u+‚£ÇuUÁ¡ÇÊës»—‚Ù³—$‹…`w‚RnN:ÅI ºÊR¦¾?M½bwÃ^æçËôŒ{´)Å zNNäS¢ÓíËÜJ¯P¾yd UºÊÕÓškçîñ)#Êçœð°©!›|Ú–-z•¦Ž]ŽÞï)·á˜”Ÿ\ϼlÅ1ƒH¡÷:«Ù¥Ôr·¶ö½d’Ef¶£5m&ª/ ä».ö‚S ·Ïü©ƒ.i&Ùy’5ïøç)s~èA‚jÔ#‹¶7\ÍÖá‹ýÜ~cø;;œÑäÒëÀ‚•-½q¯ñÆÃðÞn‹›l¶mká`b[q%µ˜âNkÓ_z¾ô¶ß㜳71 M,[—>ûiPó Ò3@ý¢jR7îu×v<žz/¤³{£ÑN6g·˜çèºy¼4”®»‰™c1É,UÝq‚²R¤!ÌáRÍ+ \Z¡»ëˆP–0D¦ÂèUíæ%¥f‹‚«dáÊL¼LCs¶y ì âls?§Ù÷AÅw}Q­G§“ ¯A‡c«ž}ò6ç•…—Ùëµô¿ž¨UU?Ofxý2mVÓ¸«í[AHmK„Õ$IJ>ÂÃ_wò¥ÌášY×èÞyèW…Ž!>ž€Š‹Áa2íRë¾'Œ»t±,yÔíWÃ’ºu§ŒÕ_•ïu“±W¶ËÍõ‡7Ì3ÐòðÅySÙî ø ä weö[s`4næj¼ŽUüæÿ)·#ò’éÌO’çãé§–}ì7ý¦$í£X!2ÖšêÜì}a£,Š”µdR%ši ¥§ºàëf¾RpÇëʼZSùD/¡Ž5Ò-EÖû¯õÔ„~d Úö9š{Û°^kvŸÇ­0¤ÎÌ>¼46ñ gýn¹ãåÝ] tŸ‘ÒN×à'۬׺̕zr‡>®¢ ˆä¯²%°§Þ%ßeú$îv჌"qQg±}®/Ð'¾iôØíDßùmp=«æLÀûiñÛ7r÷o…<’uZÛÝÊZ c|±‡rnaœˆïJ Ž´ªãв/ <"QD¤6{„3ü(¾—I,7WK âi/ºOùfÆðFÇ2×½@³An·¬žŠ;ði…ŠÄÏòb-"›œ°ûD³U…@ôôåúkœ3–o‰¬u4¥8S·<ÜyÄòšº'—ž:+Ð^s sÜx pÚ¢j²gL5~ì[Xós©…z£øl•õµjöN±eèÑ4ÑÎ…qÇ ÅYgN&ë…m{áú Ä\œ\jÒÊWyÏÞâ®ÍÞ/\ó¸Ûƒ­ÖÍc€ìÎ1p·Ð3¯Z/ªF˜ < 9P ‹/Œj ðÎì:éOõþ0t'bÐV8VCRv£þ…šªeE`õenÕ³ý/½ÛXEÉþö¤)ýnP‚[;S¥Q,«jâ\¨Z*Å›±Íã;§ [ã!W|é±ÔôÒgLÞSÓÓÊ„QzpuK®ˆ»ÇYÜ7QBü©ŽoÎòˆ,TCJóßzjМnV­Iùv6Ó4)ÒÈçàœV£h»|ÿžšÚØ©öñ;„ßÉš"IT%OƒÍ0)èœr€7êpM{"¶öÂ}>¥G¡0þj¯õçLú×#Ä\ƒéû]àSy$_ uâˤõ~âã:QSñ *ŸÊÁç­N5 ˜°¤‹Dd𔸵 ç¤È´¦.9·rAl¿üH(=óÊ0Hð>ßœ0f„Æ#Pé‰7tmV“Ç5¡xÖnokûb4,(kÀk}¾©§~ÜÊãô(ä±²Ã]{^Òr„8¾¾0ý^7o|ïYj§¸¦ ¸/‡ÌÖCeáGÊ õö…{Ë묫䓄c][r²{¥Z“æïâä’rX,ݲ+hNûg¥‰Å¸Þ±´eƒX ë_HÊË, Sn¡4üF„‘-•ù™ÐT„̬éô¹çeõÏC±^ê [fa–;s+Þ?ÑSA¡ â•H šöõR2¢líD;îW.-´÷ äÛtßUàï ¦¼’\{Úûc¯nõõBì…®¨€c>"[\¢9Ùa?¯ôÍKÉQïg³Þ»Ì»ÇÇ>!®&´b~ÐMÚü®DM¦11-´°²¾V4Ÿ K :;û&­£ÑÀ`’‘ê:žù è2ã¦Uô°ErhÏÀƒÅÀØä«ó±fç ¿Óå§1ÌyJ]m¥ö ªµÁU( ×_rHJzŸWy–ÒeÂF2É%ME,Z_~Z¿¿Tp?ìÔF*’ës2Uë“¢où¯×s|bV飭Î*Ž \´Ý¥bzPØzaŽÙ ÑÞŽÐþX¿7e®ê$·UŽIPf¥¥YÀ‹à2ôAo>ÖÌ·"yîZéP^0Ÿ~õú„ì˜^ÎölǪ_`iÿgÑ.Ö¶ciçþ§³Fá²:aåiF%´„ÃBçú#î\`>©^Õe‰xöYgCZ©-ÍÏ|¼ž²âóЉd$àÝ÷žA¯{gî¡díÆwέŒ4‘y³Ä…zíƒ_ëóÇ©e©fô»Úã.‚4…¼•÷>» ÚQ\™O+ Ð]3a„õJïJ-/;Ë;ÿê»›A.}dáþÜ}½ž>jçÍÒˆÔè\Ø [~¡Ù'2â­÷tH%ónì^Þ™‹}í6M>¢}©à'íbÒµô±é–÷ÖUB©§“t÷f¨U>¸‰al…o|0eöÉí˜$bN¦./~rŠKKÅôX™¹‰Nä÷æ/sÿAÍ¿màÂ˲hk׫£¿ûÇ|¹æË‡HènϳO;¥iÒm]¢ì+ˆaÔ®úœújLÕK`Ø/Mpéî#‘-¤®¼Õø)2G¾Ÿ×”Š£ òÁd´H­*ÛÇ8¾Îï[Lû:g•‹îü ´‘¡o]¸TgåØUóÍ@êÃ^¥[Xû@çÊ©Ùâ ŽÅ'Z™[”ƇXM¤Ô¯Êëý;Õ²Î;fiL¾}˼?fv&‹ ®HÛ§>æMúAÓªtw“åV²ê|ߦuXÕ}«žš—4”<Ê÷6¹Ý¡iÏW'ÐΡ}Ñ'2¹ÙªÉ¯ÒMÎr¦êÙrW›¬…^_qå´GC;9Ö¤ª!™ ‘æ³?L®GV+/=ÙÕ„I™Ç2Ëö P ­wÚȇìñI§¸v[YW~j®.ìJÝ .)»O &…!z»çÈúŸÝÕÖEÉÖk¹Æ#ï¥j}aiž¸cX¤sùásÑ©Ëés*×¶}ØO4x_è;*#mÓ‰:ÌSö®±µ–8Üès„ëµSC*v$voÔyÝÉÑ.† e3Úw¹ ¤(_œäCÓ“ÞÌ·ÇgÀy³3WË.,«‰cÊ{ÞY!Iú'õ|íl“Ñ’1'@öo­5ªÍ4 `¯¾ëzšOF61ß–%:ø!#¼&¿½¢Xi`žV 1ÈJY™4Ç©Pô3ó¬“Ë¥ßûèÆyÄ£®…9œkºHní7$óªg5ÎN;óÑ9€U,ñ´\†lÊtd +lQ6áEŒ&‹BZ<^‘y™fT%rx¿DÒÇ›]yü°Ö½¤hóÁlyH”ô¶@¸S_Áõ¨9Ñ"9øîšç,Ÿe»âÔÂQëó$»‰ÐñÁ˜|DrAçý¼Ðõ÷o²¥¿¶ŠÚ‚9¿„´ G;7rˆˆµûÏղʙÄ8.0;¹Â x€ 8ìm¯¨r¦háI[“ßfä÷ªeÉr"ùNRû¬ÌÝõVÊ›„a¦É)úaßÓ«Œï–C7ÞÖ eáT!vËô7?®§tmZpŒ “Œ¢½®2½$|¼ãßxSöGÃÜÔtÒt]¤Î5Û,ØiêãTElŸ¬/ñMŽ£¥ÕØwö5Ò ¯9Œ¯Ø‰§ÿx.ãiÑ_–KW7£Çâ7£,•…Îj~`¥Å÷\EoLÿù 1Mµ× ¦_·âæ à‹^²)€œÂZ:7ÔŽJ÷ÕmÒ½Š$ùù åÇ픟Zô¯J9e$† ÓåŠ,qÕÖ´JÈãI(ät ¤P2C<ÁìAf–‚†³••[ójK`Jß]4,t˜_P'•ætƒD[ûÉVI¢ 4›ðË€¼q¯Ô{dÛîô FÊù1Ò§Æ)y]!“w@X»\GÒ<¿cœ!f#zKð9™{»ô›ás×Ã¥6˜ý J–XbhÓúÂóòÒ)¡U4ðæ5Ö d=V'üÅÛy1§ºElªñG³$SÅ‘J½yÓX.ïgC¡¹ü?wkW³`"jYî»'†ßаS6£F‚4]}G' ¾–ôÏ궘ŽëoC›JÍ|U¶ö6úÌÐs:[&(gúÊš²qÁåCoä…ëyÒZ²¯’d¢‡µtâ=AD&ø`#×ÆÄ Vßœâ„/£ýè Ó½|ll óÇ/»žÔg[¤ˆðóCJJ·ËiŽb×jÆèlס+E;o˜ˆunš“×¼ú¼’µJiï»ùå–‡gÇÓw%ä/Xf_¸W°·kô÷×frÞ:m¤Zô`ÍTŠbž•ÿd·hê 2x!ÚæaÔ•m2qþö,»í(&§^²;ä¶(6à0Úô‰»iÇF‚ëvYÝ^oÛSëèlé¶yíÖ…LE«¦=K+4ϤŒ]\}a9ÏÄì¥Mç]‚T¡Q†…{Ɇ™ÇîŠO·ð~“® ·9‹ìûŸêwy^OÚ=}3¦ÅæÁ‚C¡¸ªgîh6Ož£Kõ׳”‘‡c\%ÛÚARŽu]¾ÉÆêÜ‚aN «šqP’.7gä¤%«ã;ËÙ¥l9Ž›î-Ѫ¾~°îrÚw‚âígÖ7~°õaæiäÙ8%î®á²ýCÅ„¸ç®GR%âÂ|ýLî²csFÛµÊêƒÞò}ÛØ;ôà¬{‚Iw–߇o‡7E4÷žõ4“\n[ZfFÝt¥°ì4_¯iرgÜt÷ùlZîÐ"ËÞ8>%‰“ªH /ä—M½Î\eéØzï'$¢,zJè$7L°•7nP‹s½GüÁ²¢`îAQ}²‚ó#CŒ¡ r—?v™9GYb:ñVâòQUÞ³Ñ÷u¡.°Dž Þ·+Z^„ëÏ·:·ÄïêOËÍÖ„Å冨¦63*_S&[h¿Àð’võh´%o§³ÁaöÊâkîÑŸùQ-ß ám*ؘ±s9^£Ø[×ëâ7bêm„Sʳ²‚õÒߘìw¡éd‹ãæ’Ð+õØ€‚“¥)cM—±¥IÅÊIøòäóËOzʱ&5‘÷lz5uÎHæ¹}”¯ÉmiÅ„1_+τަ—¼‰«šoºŸÝ×ϤfŒ{óÒ‚Þ‘ÇzàcnìǺ>:¤l¨B…ã µKknk‘ #Õ>²ðJ>|~§#@ª x9ˆÛ¤±ÿ3l0­éÐN£ ¢RµR8æYäÉŒæräšaë)MBIrFáv›m´¬vçɼ½"oÍ”4ñs?¸ÇpÉÈZ1Þ=:_«Ê¢'1ï0ài‰qo•9Âæ|sÓlÓl™L¥x¯’ˆT™*Õ£sô&‹ýPð8ì²Ô¡V endstream endobj 110 0 obj << /Type /FontDescriptor /FontName /GUOWTK+CMSY6 /Flags 4 /FontBBox [-4 -948 1329 786] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 52 /XHeight 431 /CharSet (/asteriskmath) /FontFile 109 0 R >> endobj 111 0 obj << /Length1 1417 /Length2 6123 /Length3 0 /Length 7088 /Filter /FlateDecode >> stream xÚuTÓíÿ6-N‘ etÑ)´t‡ŽmÀˆ ¶ÑÝ) Ò J(!© "% ‚”4‚H£ H7ÿ©Ïó{þÏï}Ïyß³s¶ïýéëþ\×wœ¬úF‚J0”ü. ‰e€*ºFR@0X‹89Xø_f§)A 2ÿ+@ ‡`q6U§‹Bµ<\€Â¢@a aI0(KÿˆBËU!žPÔB!á§ ÊÍppÄâÚüýäò…¥¥%~§•\áh‚êB°ŽpW\G(Äh„‚"àXŸ•à‘sÄbÝd„„¼¼¼@W …vçz!°Ž@C8Žö„À¿ïA\áœ@cGæÝeõ‚ á@œÁ…#1¸ $ Žâš4u€znpäŸ`?À¿î( þO¹¿²B 'C P”«éƒ@:í.p Þ]Ö+„ a¿!..â A¸@ìp¿'‡ï*!8€ÁÃ@Ñ7,„A¸ü‚(ô« î–Õ0”«+‰Å~ͧŠ@á¸k÷ú³Yg$Ê é÷×Á„Ùÿóp2A"Ü=àšª…àL€lp,P,-!!& „»áÞPG¡_å}Üà¿Â¿Ì8~n(7 =<aÇýü0O8‹ö€øýoÇ¿Oaa Åíà$àŸê83ÜþÏ·|4ÂhÆqOþõùÏ“ Ž^0ÒÅçŸðßû2·P6Ò5çÿƒø?>ee”7ÐOP ” K‰%%¥ÿ.óŸ øüo«>ñ×pà*j"íQ@é?p—÷7Ï¿hÁó—dxÿîp…ã2Èóõ­Áâ`(îKøÿ[¿Sþo¼ÿUåÿEýÿ讇‹Ëo7Ïoÿÿᆸ"\|þ ÀQÙ‹“…. '䇚ÁÿHYCx¸þ·W ÁÉC 連¸ °,öÇŽÀÜExÃaú,Ôñ‘þ^®‡  ×Ga¿Þ8¸,0ø¿|8ÕAqo na¿]pœ¨þÝW EÁ~©OD\A£!>0Žd"8ø ãd ƒ{ÿæ7P„Daq)@Æ = øµVQ ƒÃŒÀ8ã¶àøËùÛ ¹"˜ß†u„z Ñ8=þ&nœ¿Ï¿Å‡{ဩqT6ÜéUxãQ•“—àòG’/_›c’,:£Å±\Ïüu®d©¸+?€•ßìKן,‰÷gâûq4àmÝš2—¦ñ‹§Ö¹¨¼-˜×{¼Ûê¿ C1: J¦Ç,Rn=2¸EþÀŠÈŠû±ÙøY„d›èjÅJáy3fÕRú;Ðøâ€‚5 ûP)·ù;Aœ+ÇWì kŠ*´U†‡±¦Éà9A"áP¹1žáØgÑ*!óÃìlONWgºèN¾v{¥Dy$5¯kn_r7í£­: —²øJIjÃs×H®9BHgû”•týûu,„!çÊíG{wëî²)2Y5OŽh Âì¶;_Íê]u¡n܌΃&ŸÌni­óÔ’,+š%ü{Åt wçÅìM™Éw«“’å1ÊN÷×{7´:6)9À¢ÙƒJe^ö–NÈŽaöUj?ôô®Þ'!¯¢ŽŒS04‡GVæSr15ŒA&Ò˦ZœªûHnøÈî[‚îíy×¾¤L3Ò‘ssweÞ‡zůµÃ ˆ|ØbÚOzE¿Ï°à­$éˆ#Ù‚­Û„é¶K\Tú…ÊÊZ“»Öš¸ž-ì*²¾_ï9ë”ý<¡î'Ìy¢ïGßµ´;]B_?±YÖðæ§Š_¤ÓÝžn$ h§·ý8Ÿ*¤ðÍw¨}òZøã´oå÷-wüûBBÐ9²ú‰#þ¹çñäï{B.-âæ§EÖMÞ·Wû9´)Q5Gñ(“äÜÃú>$xõ¨è ° < ô]Ï×hsüÈ)ÎÂõãgWHYP,q¨c’H§¼œÔ!‚r‘ý‘ï4žíªôUé½ÏòúpéuärÑГ^~¢dѧöl,eÂÔñ"m"Úwª+mäó<äŽé£´XYÀy$A&¡[2W²:φkìŠdαU¨+«í”xùïКX[è¶kÓcn]Á“«·ÏÎÐ @ÛÀ¤¸ÔûV• M-”™aª¾Ù­ž€ì&£M›šP$¥©7)¤7öÓ1¹°SÔF¶Áñµ×þE" l­éá±k–xŒoQ´³þc¡˜Ì×zÊÉÁH‰}iè–²D­Áh4ÃÀÙQˆÜ©ûWæVŠXî„C꯮A¯‚]$}À¯¿…Èj˜ô€Ž]z)ù8ÓÀb#üÙÂVÜÊ^R¢×mlŒ^H§ þÀHꦡÀáözß@?¸C”Åá †Î ßHÒ¿-#‘¥{™ÕrE:bL¥Ã”%Hå‹eP䈾é¤)NrQ~šÖCKì$?}Üá:šµäŸO_-¹ÞãñóÁ? Ù:êŠ"Õ1Ðvã¢7 Ç /üw­ÒôgwÃVLÕ»ð©Bóµ¦)«å¼VC~"¥søœtƒ1DVr7nÞì°±Á®c ó <Žýžh”>& Ì£*›zÂZ¼êör5\·”DÜ䣇ž| ¢ßÊ!ÄDѱ_²®Ÿ<Ò>Æ3(2”@_³üË~ÖÝ÷Ý·ëĸ}U.ŠÏ‡ÎFy2ï÷i¸Øüv#¡;‡eóÇ#–\èéLQqMaâ×Ï«ÁYÂ|‰­Ièåó¨¹pîЯ„¶Mãƒf}-©T›dÖ®?- žû4d±ªÅaœyÉ”Ú3ûvã—Eûµ¯¬5dÔk6gÁ-Axå: Y×öJ¡¹÷>ÕÆ¯’Y†ú]¶:”[ q³]«½·åvZꮬ ¤"瞌9š¡å~5÷1;ˆÒ<ù¸ã¡sáŠ:‘Aj—~MðúôyU‡“Xt‹m"yÓZýpFÜüKÎYËO¼bå¡í1…þZkM¼÷]¼¢8¬X–·òLSVIÜŠ¶§¼í¼óùé¢3ÂÅE¾Ä…åë·r54 ÃP!tÉ=ÅÛ4´ý0åÚèÆa–ñ.{XÃUÙqx)µŸñÜ¡°F×f™Óï–usq†ÅS†±ÈRˆèa6µYÎÛ¾î/;ªÏJ&¸^9²vM…•ÄÄO1nº_Ú«‰LµÚ§dJ‹Ï‰%MûFG;Ó”S½ICGz‰tUE$†™O— }ªP™oer#X£â)ÙT²Ô®ì;»YmÜx ™f*zk ×­!çþËÒ %õÝÅ8úz§ÏÇ!KKó‘é†!,•Ûo]·¹_½ê²ùõiz³Z°ô\œ«ñ†ÛùåÄ£õÕ‰ŠƒSð‹ÃÉáj‹ŸO©8º&{g*rwTé佦 ÏBºƒ-£ ïri–¥:[õ1Å32¼GñlÏÔ$>J°¿õj+vh <Ê嘑8ÓÄ0“¹vJ¿×ïà áMži 㹸f±M쥸ÐÞ,êhÕa’ÒUßt•=²e/üàz’4³ÀÛÌ š¿ÕÀ¸66lQ÷àk,9t€¤7]i®-”ƒÐ«Háæª:%f@ÇIIYe¹^I­â*T~$IMäÆÌ¸f¶ÍÃ¥îþž¤v {™«ù˜«LzÍâ3 Îl/á9½œ%yÊIÖÝ"xŽF$÷ÅM'ië6/÷‰§Og)Ÿ,¸Ã½’#˜W ™[ñÊ )ªÛ‹l×y Û9„ßç.Š}yZñ¼"]¦ÍÜã|déeÕÊû·¾µwÙ˜gØèžs›Š ~sC¶ d]ü|mÊ”ý‘g‘H^ØSÿ6—ˆK!s쎈&Ý-íótUì±9[P4 õÍžò£j7#¹n%ó<Ô°ˆ5U+ÜEà·>Qî0Õ&4eÍ&5.o[q 눰xó‚B“€ò4.ÚåÍ7¾‘«ŸÞ k…|†G¿K¨ Íñ$WXž|Õ‘þt_‘’ÁÂ]þYƒwÑ-¡ÜÔµüt½ÏR9•¥·IØä³Nö‚ËJì_ésSßäÒ¥·È6<û3;«x½ÏÊ”»1¤x ôƒŠ5š °Ë=½Ø¼S°ÙCýIýÃì—§[ˆŸD­.<”yôO~ˆ<ÆZøÀ Ÿ—ôéÞìæ7±Žˆx*X£vá›Ý3¿—Üò€fU@”x [9øà2§¼,R šÈzšNQöå‘„>å÷©ƒ´ºìyRŒ™ƒf­èš–÷ÔGt*j°öÁŠÆýÉ.ǫ́¸çÉIr quMxšó3w2 PQ%þ°bµ“¶ îøE¾ä2‡}ŠÏôÁĉÁ¥ÆaW®§–K9$È÷†–jÇ_ ªÎJæ|$¨žÒæ¾ÁúmüÁNp˱nz”õj]j=ü!£PëE£½ú¾ãÄbstRu®Ap^U"íÅgßBù³¾7á-ÉY…VÈP’Ç „f¯»‰fÊ 1* ‘LÅ*““Æj]gêþ1þg»_¢œ^¯8à©àÕº!-g¢¬¿ûVÙ¢ëćåLšè‡Ë‡ån“Úæ›àþðÎû»ådÚêǵ)üÒ£ÙÖ­†Ôö³Sl 6Ï4áñ\T¬HzŽó]Sy¯íæ+¶lå‹\íùª¾ù±“.¥ãç0(G7¼ëKPpHDÝÇBéŽ{t‰9i®¤¶q´ÂW^Û©—þz‡>Ó—‰ÎÎÒ=:ce·O‘ÆÇPRœA•rx_[O꤂sS×Ú®kn­qº³Y «î¾vÕÃó%&ͯ”sÈ’W1eaÞÕZ¯¾ŒWà@騚>ÀYûZé.^òc¶1~ð­ZšœkÍÇáò™…G¤†«Krä^#OýÙ<»ñ Ï7—éÔ® Wèï^IZÿ±¾Rƒélü0ûõC*UÕϯ;ÞfÕ<óä`iX$ì ß·*š\ú¢1b1Ähí« BÔ…%óÔ¥ž†>M…4fIÒT›wn,|½<­Î{¨De<¹Qië“.cò1á÷ú ;Lž¸òâZd+:Ò8Ôê¤!SŒöšù>=;âäÜÓBù–¹ìøÆ=§\ÏNçë2Æ‹3}…7.ébe ¬{ügÈ£§MÂD+ûó øþd‘óZÑù‹jšÝµ‚9‡zˆao %çw¡Ý•eÕÏ-‰¯ÖÈw¦yäÝm”xë pu±¾^×Ä­³Q°4]áZ åZðêBDZæòÃïSuYО×à–…F^Õ|DMrè\Z^’(»xƒN8ŠÆÙ„Ý,aJBÛª¨÷ˆƒý”äsõ“Ê–^Av·­®þŠt­R Õª+éëSþÉK1‹ŒéAnA1k[üYû´øu²C'RöG) .^~©%úƒÔf¨Zßœ¼0Â'p®}Å.2¶¶ƒó˜ëTƒèM#ìZ­Ý°ÌÒõSTètàQ±×b“¨(ƒK­+­ª1Ðò"Ø(b²Q_½©P–õ– ¹SËv–—œ<Üï/-%fú®}GçåØÂ$wr–ãÓºýû"†g} 3²ÀùS°b›Ã˜¯c(šñÅzKþó“ØðókŒ™˜m˜É™‰‰‚4™JAÐØÈöª´ï_s•ɵ‰’ïÁôÖ¡4OB­ø3ÖÃÊxçjùæÛÄD/imwÝ›)ÝLßœ›0Ó¨º¯&t÷© õá£ß“þøf„ª ¼)ž¥Õ¹Ç‹ŸF¢}$—(­)ØUËçrÖÁ‘o\y=Hufÿ¹GÁ¹+ £˜J=I”.“€r§›®Ë ^–v§ "èälÛVí(ô4º«B“ ÞZu­[.DgTD:— žßÝQè8cÃkNÈ•qøIz”$CùãNÕEÖ†ë|>KA_òòˆÞ A‰—’ °¹êS®:mHN‡U§§øZ¤ã@dËx¿á&¿– ˆlÆæ01ަV:ÚS“,J)”£âpàǘ¨àŒ=*{4›·E²ŒmÝ{Ü8Í!ñvúÐr+N¹IÚ1:±+|Mgà†küÓûºóæ%Ù(ŸÑñ6Ì ï-X"¹¯Jî÷R½÷tÓ»bpȰ†ø¼œØì¶Y{¬\ÞŸ.{7æœAyñ ªùÝ}³±Ø|1[Žïs7Kت7³Ë•• Y?AÉè3 ¡«Sêî}y‡žaôWlF_w<Öàë—¤µØt“¨ÄtŽç ¦¾=Zb8àd5vÓ9Ä9¶Œ5Eˆx}4ù_8Úéz|üù^Ì“í^SNüÊ—€ã‰æûz¢$Kû` >ÕG¤ E{@ä¾ì$'¾¡Vžž‘€òøàFvÆSÏ„Ð]߀„JbªOUORM?î]¯âc;o}±ò»Læ÷|‚PBÆRÁéëQ—§py_+VëÇ2¥œU^$oØ>u4¾Î;Ø8,Bƒª Qk©1‹šyœ=gOƋΕÚã³L¶S8 X ÙBÈ+üZfiýœ»"tÚEj¶´LuÍDˆÉðµ–”íýoɼÐì R¦íç»9I¬ÞŽ!ÎcP™ d±í„HO¨>«´ê fHƒ¾áxÏLÌÏw¼Ë5 ôêç#½Òñ°|_‰?¢ùI oDµ›®”6g£1:\n6‘]ÛFœÛ1‘7´UÙ&ds<ßç?a€Ù¬ã B¥d.åéñö²¡¨£§žºæQYö¬¸F( §B`YÖ3»©¤<¸u÷cM?ËR¸ª4@J×ó­9EºPæhŽì6WZy‚MÛ¹éÎÄ–¢—´4òÆTۈɛÒ|À¤ºöê@§áÒ«cŠöKÀ;ÍfÖÔØ–vÆÇ÷ôG'õ£:Æß¯K\±ý¨ò®wgÑiÇŽM%ü°½^¢Àíš Ǻ«‰zu¶èdÄIІÁtZ´¹=’vÇ h=ÖKïèØàצ8K*°4r2UIð+¤• bx ÃG„“¡>wNÍî”Í{0\.ŸÜΟ <îgwXÍ™¡çjñx‚)¶ÐÄD'¶=Góý`‚ß&QY,ŸyÃ2Ø{g_ª¿Jï~tº…wØ'OzñŽ¢ë{¥h¡³uùþâÎ A±Õ™³Ì¿·§IQ+_dÛU¼žÁMqAY}}_€Ø¿ð¥ |1y~ÀøuçX@v žoíFí;¤±?¼R®ëÏn­_±SjÜ­-"Á˼¦fÞĆò«®yõþ´KÔHßl~r_ÚÔ©m–Âj^m9ã5yEDê½ÅIûã‡Ã×^Ü”¢!ª Ò’ûé×vr³K4ïö¼ñ9›øF8”br[éµý ³ÚŽ+}Ÿüä¢V»YÊ¡‚OʼäÌÉÚ PÍÕaƒø Yî°eÌ[{U…ó¶÷K¹7Ïjg&ôîOñÍz¾Õl®|øñ±»p=d¡ûG ‡0X’ð^€Úƒce”¬£0?ª÷gŒICuÌ.f:ŸìA_x¨RиàßÚoâ1 Û ® âþ¬ÿøzÈqøÝa º€Ó~k%Fr—ÛI¤r²ÖÛ‚Ùg¾¼°òhß‘*Òru*^oïéÜGñ&Ví´>q!CáLÜVM§K®}õ3U„Õþ_ÌõÕ¢üìŠPÞ¢aï“»g-Tnå¯î\ß¹#aìºÜïf÷)]W#4Ï;¢ÊG«Ü©þá§µü–ÜŠUb²5«Êã²ë»/™mG YWÉ¿ÈÝï]8YRl Ýê¹Ö͘°vÃðʯSÐXÍé÷UÜm ÷‹ÒQ {½Ž-éëb¼î™#êWQ/™²Q<î–¥®‡ÆÍÛ_ć*™i+<ÕùA…ï4(4×KÈ5Õœöëse –ß r¬×vÆnQ'ÕųޘJç¥æŠÍ¢^ô„ç$È&¤Ê¿ŠÛâ*i®Ù ªB_ÊÍEh&QÓ<IhÊø6½2­:æÛ1F*Ék¢2ÞäÖ4L`þ¶èv®ÓXòAùYÎΰÈS·IÚ dÂ&tŸçöÔÀ;†s÷7ñÌU »Q²à÷ý|âlud Ë¯ñî(ïozéF ÚŶŸQ䓟¹ac£çVÌQoœð™M>H=íŠ=Þ’bx¬àL¢H€÷…áZ*_mGÑ5|‘•ý£±ËâéEßÞžäL`]™¬Vbg<ø#7ǃ’ÕœKÀç¾¶4©'žtà'XÁèf>£ùÌYm!Ðòù£iañüÇ6>Hâ¹£¾{†ÏJµaúYvÏ94ö=·˜èö¾”vsâEèò\~¤”[:씟&¨gMQ7¼!¿|V| µÀc\œÃnb¬®_ÎÔõ¯4c’")fö¼¿þ¾Á€›/"¹.¡Õúž9_:[2‡º} ~ÑZÔüa%_Åÿ®ÖÄ endstream endobj 112 0 obj << /Type /FontDescriptor /FontName /XYBSMX+CMSY8 /Flags 4 /FontBBox [-30 -955 1185 779] /Ascent 750 /CapHeight 683 /Descent -194 /ItalicAngle -14 /StemV 46 /XHeight 431 /CharSet (/asteriskmath/minus) /FontFile 111 0 R >> endobj 113 0 obj << /Length1 1328 /Length2 1345 /Length3 0 /Length 2190 /Filter /FlateDecode >> stream xÚS 8Tû?q:œ‰î9=EéŸršŠyyåk<Æ»4HJe›Ùc63{™=Æ$Êó„t*RJ]½UR$œB¥¢$„ÂíH(é”p*îÇÝ3=Îý¾{¿ù¾=ÿÿZ¿µÖÿ·Öo/ðô2eó±@˜ƒ¡¸)B³^vt Ñ˜A26öFp©_Û÷…㜰®51ö6Ÿú˜Ç“Ÿ°¯7v&úcÚkFöHQȺY´M϶f$[Íj*(™,l7ÙZ7mÅàk™»œÑévíÚú&Êšõ¶˜{GÑ¿²aÉl“ÐÞŽ‡™¯œl~)Îýp^øVkqaEG£&%YKÏ‚©£WÊÎ,͵Ëc74–¹,’½_Yó&uçÕ§ŒÛ÷¬çOÏšLBÚ2 º»u%ný™Ý¶^–›ë»ÔãåŽzC»É1ý%qÑä@Yµ× §?C/]{y³Iþp°!:´=°éİ^ÌÉ?WÝó« W­˜eË mYlöD«yݶàÔ³ëgTÔø›éœiq H{¼kÛt{,ŽòØž^˜q(ç0{Ï%ÎÈ­&C·—igP’YÚžyŽcµ>Óµ)8©­îîGÁ¼´}–ïöp^¶¶Èφ£õ5Í‘- îoYÍÙ›ë4Iå!ÎMÛ ”‰å}¥gÚ®T6ݺ›j˜·˜S}ïD¾doçê(ç§Ïþò Ðı9×?úg5nÄÊ}¢=,ûOš×ô ½C:öd$†£ÇM?×ÚåíüýŽ~VFa/k(çU±öeJÔúù [O{WÙo¯h=ñÎÕ^dv*¬(Cë¬pýj¦ÜÚþ€=o=vªtê"VÃwÚ66éùwf†e…‹*ÄN²J…éÃ[ó\–Ç,aöLõÌÔ´üÝó'#—SWoTh$=h Ð|Ï]ÊI\ã²%ï3H¯:x×¥CM8×9òqpoL/¯²©SÖ~q­nKŠ&õD’“^Ê€M³_÷?tù»÷õå>ïœ{¥Œ ‹¼sÿ6c¹5%U3î5·òÔ˶1Mã\[µBùðy]î”ë &:Oê­·e8N6úÀ>å_ÇÊzç’*µ?z¦®ç%ìÖç-½4/±¤W1ÉÜ/w³§iÔã­o”&v7ZCR_oÐàžœžfò$ˆfsçûW¥ìh¥v£2é²Y¤¤C+¾±´]`èï7çÀ9æÆ•uÕâ┞Öù²ˆ¨Î˜׊GšÞœNÚctð¶wu5ò\½Ã`ÛL×á?zêSÁð=ëÄÌß]˜3ÃÍçuñ´£ÞVN+¿ºá‚rfˆw-)×ÀâXlÔü”Ðh·®á±aßý§ÓÚ¶Úü±ôî½û‡ θϚßi»kå‚ýûÂjº¹”*Ñpä™ýñ C3ž·H`ÄûtMK뻾qi³gѻȫ‘|Éû’SÛ'½£¥’¾·O·f9mÊ«üçóGa‰‘¿¦×»Ã¶YÛíš=/á’¯$[¸yû.hy<ùð«žÆ³]©ç>i=‰ôh¹³¸ƒ-—ßQ,šñ!»~jÒ&?P–¶sð´GQÒ•ÙûK>@m×iùkS˜QoÖÝŽ[ÿ`ù`æ endstream endobj 114 0 obj << /Type /FontDescriptor /FontName /QDTWCG+MSBM10 /Flags 4 /FontBBox [-55 -420 2343 920] /Ascent 464 /CapHeight 689 /Descent 0 /ItalicAngle 0 /StemV 40 /XHeight 463 /CharSet (/R) /FontFile 113 0 R >> endobj 115 0 obj << /Length1 1606 /Length2 8390 /Length3 0 /Length 9212 /Filter /FlateDecode >> stream xÚ­teTœ[“5Bp !èà®Á!8wwšiHwãÁÝÝÝ=¸÷à\ƒK ¹wfÞY÷›_3ïg­§äìÚU»Î¡y«¢Î"fno’¶‡ÀY8XÙJ`;3G˜¢=DEÜÞÖðä䯠¡‘€‚Lá`{ˆ¤)$Й$A@''€ƒŸŸƒ aïà [ZÁôšjÚ LLÌÿòüI˜¹þgäé$ l Ð>ý8líì@øÄÿú :€[`[@BYEWVI@/£¤ A@PS[€Š£™-PAˆ`aØþm€ösðŸÖ`¬OXb0€)悟Ž\€ ‡?!f€j†Ážþ`Àj ?ÍnC€¶Žæ<ù-ìÿ"äµʰ{Š=©ØÃà0 ìÕ~s€‚ÿ¢áC,ÿÅ€YšBÍmA0ØÌöŸéü«OÀëÞÔÁÁÖõ¯Óöeý0²µ`Åàà|ª „?Õ¶C0Øþ,Š,ÄÂÀÁþ·ßÜÑá?cN è_¢ÿ³3 O$LÍí!¶®s›’=ü©$€þ§2ë¿OäƒÄÿÿ-òþßÄý§Fÿíÿ_ïó?¡¥mm•LížàïðôÂØÞ˜ÿ/×Ôlëú?dÿ3Qô7Ãÿ Dnú41ˆå“ì¬ì;Á0i° È\ Z,LmŸfô—_b‚Ú‚! '-ÿ#€…ƒý1 +0Ðògè܇@ó2’ç/ÞlÚb ZÚ Lÿ|MÿÊRyR®áêðDì?úP´7ÿ/ㆸ¸½ À倅“—ÀÃÇàãåðüªýÃñ/[Ñ»ôŸZfçø«ñÿøþeþF ´7ÿ³%êpSˆùÓbý—ãOè…>éù×]jø?í¿Vr1ç삟¬“ÓRàÕÄYý£’ú=]ÈýEuù¹>•öÞÉÁëüe&÷U¬õã¿›]g¶åw»^ÚÒu&‚NrÈ<©ºsñVh[y™vüØŒŠ°RµÃÝOgÖPôxصv6FUÕŒ ïÑÞŒ·rAÑO¯|¨œr}©¯°½€IµQDm¸õøÕy‡´q߯¯èz‡úû:ÏQ»·I™2£žÓš{%¼‡»š@/뀿Qox±·;‚í=¬Çm#1e±î÷›ìž ™[Çš˜‚R:äÐOÊÈo£-J%D=¾;*ä´r!ë]×=‹ßœæ WÎQY­Bd®š7–‹gG|iÚ݉*§Žµ¬}Æyôعx±ïæôL1‡±áç°¼7µß€^e«Æbbžók._©zžsˆ*‚“]þþ½À`h?ºë¥;ôyª‰½©ÁtR¶Þ±\láwëÄ€¼ûív®ÀhÚe’Ë<õ= oÑúiâ_ì]ï³ØŽÜ¸P¶{2™¾œ-Ÿ$ ò‘X1Û‰ø, €Ç á­u•iˆ6ög’¨¶¡µ¸×çeôýõ½Ú“¯Ä]È”˜æ%Än†oï²ð–œ{Ƴü°A-‚?M$ß iMGÝ ľ ˆÖx'£ÜêqY/H" îõû™-m Í©IûŸŽÍ…€#‹Óû[Ë’õœ¢ÐF®7|b!ó2v¹%Q¶ô"•¢¸%‡Îh(-  ¨\\C4É>ÈÛö2 âU(ãݳGL䛸‚ÓF/ÙXú¿^PÇêay54ùž^ûQk¡¶F’£¨ƒå.¡j¨‹”Æ·œií3ül£#åÖØa›¨1ÎŽ^l_tEcÕ‡(ŽŽ*él€Íy?M¬Ï%>¼Ë*žxë}ͧ,ši3Ñ%cÓ0vÔœŽ"._Áèäú¢5¹ dʵl?`#Ír1ÝuC1˼ZtëÚX¦È øxR]²Õ \à+kÁ&ÐIO“X“þÖb¢ÏøV ]À²€xÎ{ÝÚÝ÷Ù8æWà\V¤A’JïÐH l[î#N`"-wßû(ßçÅhæÓ“5Ð# ¥’06|Œbƒ²ç€4~?ŒµVÇÒèõ&wó†µ&g· ‡"E{˜’P&ÿó†… œms ëEI&é(ÖDLs=„Ñ!}«A‘á5òµN²£qó­ƒ—^ÅÖŽ5ýiHÒ ³Hs4y ~!/'Hìp!˜•쯩~Kù•™$$ÈÀî"}xhÙÜÚö$TR‹¹%Þ…oo]5!ÐGÿõ‘ö¶Œ!ðÁ÷X4ÁöŠAX!nÁZúŠ*ùáƒö[} Ù£Ñ"•<‚î{•¥œÀÌ百¦¡9qûAëÉ÷’9ޱåÎ94.×C呪…™ìwUNä²ÓÉž;…‹aå9‚cí/w`àÔô ªœïó!;nÑwÊÓSÐ>Ÿ·¤\%}Vûö*u¿JÄ›ò›ºœ¨–…" ¥­¼{(IâH„ÂÐnA8Ü”À c€Å¯¨Û„Þãì¾j…Y½û*E•ãË9ÿIÁÿp÷Z%1qý3>G­C9ôQâ°Œ¿ êØÌùUxWµ.œwÂ' ëøI”¯ël·Óm]š°YàÖ•‘Pe“2{ÜAÒ‰pô¹¯ëLj=5×ÝsS«;q*©½R‘OËÞ* ´ãõŠÝ¦¤!'<º *;pmæ2‹±Ÿ„]ûó¢påž™ý^Ù Ã6„Ĭ_° =ÚÙ¸_Èý›gÕ‡dAÒ]áÞÊå˜Éõ5t9¥ôãkñŸâ`]Hþì7¸fÛ¸éô«‡ÇÚŒú.0ßѵKƺ ¬T=1>jøÃ+èÐÛCx"žö™Í¦ñOA¥`Ð0_`ªW#—s¶^ÿtÜD5ûû†ÚPÖ!·–xéé9Í™W$å_b¢ß ¶àRx[ž”Ž9ø\yVý/#¤š¦ÜuµŒÂ;šBãu¦M¡ïW¥|™I&Ê™ÇI‚æä$å>ð¦í€¸# z•7AÁÜD¡Lë[™4êäþï¢^#pìÖ*=ò e”£®pzÛ´}å·×é?zNyñ¡Yj£3Fk]…ýòÊBׯ |z‚} ¦×›î×t55üÅÓÝÏæñ<»ÌwðûŒÌì£Wö8k‚vv¬”¶wŠ[µ ‹^N¢öO¼}Mà›Ï07G+ÖÏ9ãN4.ñع™¤?ßÙ½Hrÿ¡\wÀ,ZázaHm‰º2+8!éæy¡7â+rZû ߨðñ—\Úþ>“§€h=$Q³åJ¾ÖF“†ÎÈÙJÝ’Åôû=Ù Þß ºdÞ%O/+Ó8ÞWú«]Ø]³Êq5µ¦9qsJG!㟾^ÌÄ —XN0Ù¶Ù »?ÄYz¿Y³ÿÓ0NGª¿ÿ¢Ý¹¸V‚çÈ{>ýžgf'·É‰@lÊI€âÚüÅð@«EØñüô C1«ïsQÒ)¸Ûµ¤*íƒ UwoMðØÞÜÔ̶ù=Äo÷ÍÝ)áÑ!³92ö˜àxÇaøy nmäÕù¤ó aÌrˆËé¸ß›JUrùA4ý*~‘Ûfj ¦ëÞ„Z#mÖÖf(Ëég^BʱI(Á`Ö!ã‹Àp5~0cÇ:5ךÇÂ÷=ÇV¾aˆ„ð…’g/»,§ËÇŸKSÊn~Ÿ`ãSTE½¾wQê0«8¦T¤ùãa\¾ßù6)“z;Ç‘œè¨‹hŽù Ib (Àš^z킃-'™ð•÷òƒx„<¨QCóÃUõ-Þ¹ ’¨O±œ(šˆ°LúòjÔ‹×:óºõªa:‚ÍÚ€4ÅMÖù>uŒÐÁŠöÑMtôbø<> ;÷ŒÔË^™YgÅø2÷Íù|uIp°ãƒt£¶ºdú³nVØwÜÓÌæw2Y($§ª-ü‡ ÏϾçk:‹›m„©œ\³1Õ5¬Ç†·Ga²G·SÔ•u”\ÅßçÆ¶öÿà¡÷3z)r ¸§ºÂ§Û¥§Vú~Ò«ì5OíÀ` ë{’é~BþK*ï7L7þÕÒGø@ƒöŒ[„‚jŒ¥H.u9¶‡ïRq>ó/0dÑÝ7ù)Ïsõß½½,óNöMÐÿ†1ý°N© -s~¼¸Ñ‡‰ð‘˯Ô'Å/t¹pÌ)T<^èÖßù𽈂ùq»ÿîi³ÁF¶O†ƒk~¸>ú"–°€³7cõøì®ïÞ”Iéžõ妥µ× J5‰éx^Á‹ü tô˜#ª}RÖ¦,俎°ÞöÝZ¤Ðæ )ŠÍ»Äš$Ý^„ª8,6cn¯ÕÕg”/êt¡Ê©UÎo¾Uþö‡Ö òÞ·(´ò ¹îVÇá¾xžrQòZL»0§0ŒmFí %OƒJWÞFYFTø'Ô2¿&v zùK"êåÎîÍœ¢cuÂÎMabL¥§¹‰j¡v8»«Â$–$I%°Q£ yŸW/—²¸Ot†N» ˈÖNÄÙm›.¸Æ–3m¾èá§fLã öŸb†¤Ègý £¡|/΀¦’öÚÊäÍ)Ó±EÖšµ8íƒga´{š3Õ*°Š¤Ûƒ0È6aÏÈM3¿ä5LHÐ`ZB¼ÐÏSµ2 o”žÀ}ŽJ:{ðøe¤Ë—žqÄïd‘ÑšX’I 2ˆ1TžqÛÝuù‹ ŸÓéT~Œ{FYø&hÁB©1Dâ±±6”W4€J˜¨žî5eÞ"%êžn?»Ð}³E˜­vÙC–žå€Œ €¤·¼žC…®uù…Ñ·xÛÑûçb-k–Ë/»2$¬_|ú0)Žíccmn¯ƒ.ç¡¥ŠÝ‘?ˆ‘ùUÉ]Wž™&ÍSkbC,„´Ë_îƒX&X1jïâN0´0§O™Måu4Á\Ã=ƒß6´|×Cër®I"°Pwü-B=!ý•º'Ð|!, ³s=Hß P‡¶’RD®ù$„¼b"Þh'ŸƒÃ×™?,þé+ÊÝxd‚ÒñêlàmæzLœÿ»çhlÁ\‰^˜¿¢!¿2NDæ´¶¶Ó³æÌþ[ªHcèÐ6˜Ü­&/—“ƒxe½Q/Á§á·Ûx‡A‹TTvBç`æíüwÛ`šêQÓªúîdÙÞ s®0ÖúB^€Ãµì½oPjñËeì*˜k“­†«ˆZº²}å˜Ø‹wÞï×%ýòÒëqqÝÛ:äEÂô`D" oÈÅ\ཀྵ)­ Ϊ¶9ÈYÏ6Ð×È[²*-ÚT>p™J¡ÜŒ.nš¥ïÔ¯¶ó¸—‚tàÙ|Yëwµ¯õvR¤rËt˜W%PÆYæ<ŠÝw+Ò-`5ëC4ÜóûZ^0E©JÅ )n»ˆÏôáUtSl{×%­OwJ½9ì*÷˾oKq” š9$ŒÂªW8ókÌçF«Ö‰…gmÒDñ=ëX´ÑÙ«ÖÆÛ‹ý±15SõNðÒˆ­j® ›í(Õ<ÅÈ16ú´xfnŠ› ¾úWñEmœr­ÇËKßãýì4¦ªKæÙa±1(Õ8\®®K(‚fÉþÚ¥‰Ñʲ'Î\IV¢ùóUȽt?ÒüPÎú¦öí%ýªß"~à$Ì'.êT™”â•”HÊÝý€~BàÙúJìümå—<.6!Ì ¼É`¿YE|¤)Í`Ükè“'Ü|Ù€ÜÔïC:w®TÖ ³xÛüÄö(‹2fŸã:` £YRx Ú_ˆâÜ袭ö•ò;î ~ °}LÑ=B?“_µÝÚ]ÕñinF¿Or½:rLä]Äñm.%ˆ¿äÁ^Ç.¯žVUŽâ];@ͯ‡Ü5û>2W´ô¶#ï^u”Ã.¼‡Ž”ÆÅçù òuÊЭ²Ð~<¾¨bÕÕ->\FÊÝü²$ÙYïrý1S2¬¼Çj}*!uIý'õgÎì]V½`³Gð2 g^úAèÄ—<7B•õÓ€1õ$™ílÓý5ŸL‹•˜J;ÌþÊL1Šá¢s£,wi²Á|Wøž¦ç›6áúúœò^n¼MOÒW¬ÂVÉSä˜Ç»ÕÊë>lU³±«OÔ’væM„ìPØ•ÉQ|½}©þ|ê˜n]æxÈA‹Á n!©ðÕÏ®ƒÛÆ8 “HˆëX~ZvXv6‚²í†K31¯ºSû‡i—í,îñÄÚ€GD¶7ìÔ|Fûqd›¬‘aÿÇHÆÎógÆÖ+ÁúIjm?«Q˜Çy$ú;•-¶mèI?E"gA“\>¦Žx÷¢°?Ú!TD…§I0±jæýfô‘}è.>õ‘ÁTeÃÛ»<¢.Ðn›éܼ0yÅ?0Í2•ËtÒUO»™c Js‰<«bŧýþ òã±ã±‰ªKi„?Aˆ„Q`­"ÞYccaÆCÅŸâ sax·s×a¡?¾t’ß›YÊü»–z¨<){”¡[LÿÞ}ãB>O)É…³›£­X{ø¨rg½˜Ç+ÐæÖ]…`÷,åø‘¾GÉÑýû¿ë\ÎOK+%5U­>?³ÛÉÜØ"0ÎŒc„ž)nE* ³–}=fúÜ'—„7®i{[zþÚð€§ßº˜ŸÌçˆû Z§£ 3 Ó“RäÛÂû!ÚŒHµQ¢AÛfK•×êe׉S >½z*sNÐ|æä=FþÉW%KIÏÇŒW4mÖvJfFkÈæ6?{FË :Ô[!‡³†§u|'E©ŠÀæü¨¼Ø`öC[Þ¼¯(®_(Q«}æ•pWòª–²!0LUö€kyDvWx¶‰õ–øe÷æ,úÈZ`‘øWÂŒ¡LÑÃYÆPB8Àœæ-%—É×­A/·H_¢§‹Rñi™Â„/ã?ò¶XupÕ ÚplIßHØýj‰ê$bŽóˆL‹Ç-Ÿ_w‹õ¸ '®Èh«\[+Ä"Û™â|“îŸê™>‚b„QÚk“5¡è®SÓ5š¦šù¬ø@¡5'‰9lãs²GUMuhGAñúl¶-=yŸþ™¤e¬BGç(Ö`ÓX†ZŽ hiä'){ºK%dÐé/!ùÍf˜21’[×@íèU&ãHÀàQ&L©š\²$Çò2çP5f¬+½ÏdØì¯ÍõÄñÜ|ßMå¼b¶Îã ßÖ=^6-ik±T ŒuÇ‹JG ©{5&à?‚AÓalCÓŽÃy©ÓýnÒ§qzaeáen„û’íéVÖfÖcWÈ<áX”%EÆÒà ’é·z—tW£¤Þ3‚6¦Àö<–1ðà·G7@YŠÃ„8m“‚–ÜzTé ¹â6:BL]iõG¬®ˆàÆq²9`'áû@‹Dݨ†ÚÜEÔ¥@20À3"ï-,rkÛ¢2T%l d°«t³¢U¡0¸ ý££¡²Õâ€õ;ôä»%¹³ÜútßJçiû|<°b‘D¤êË;rÍÄOvæ]IÞ7òPì¿÷²y#dœÌwÌ-IQ-,¬½½˜Ï¼´FÄLue!çU!àÂ× âˆ­¾ÆùLý¬Z¸fÎ9€À°[g’ߟýþmCJ›¡±+{”K‰©}ö8â·Æïy±µw3×ËÁÈD]'#:Õ‰XAºE¾?qUPKº4©©zs{/8 ßü~.N>Å#_ć_ŒH ìã_U»¡ÍÞüâó™CÄzV*iœ@]ìDÜÕSJ<ý‡K¯K…X]—´÷ßr1ŒÏiˆe¸y‘üõ$JËÕzL¹VMÞ ulÇääEàáÛmcÖ”ž“ Ê/>³„ö[¦|¤"ÒÕlì7ÞhXºÔ±êŠ…¬9l<¢¶ zÍr´­œÙÆ1VÏ?Cl+Ä>3"Ená€ü•û¼±¶SßÁ‹â|Hekº±Œ­§êÆbºÏcnrÈ8™ùÃeBÙùªy«>>_wÂãîÃßkCr1Nöü®ó=)öó¬„h>Ø®ü7Yé®·„j5Ô †œ*Ó.Ê–âÒΊFV}s:/XÆ¡¡§•ZíÇ€å«IùÖBƒÊ×kÙE¢-kC×&ÏXÈê¥^ŒJ%5AÞÓp7œ¾KrãÐ`V5Þ¦ß{L:§c¤eÿ„#@ŒÀr@Eeuvg#_°[0@™Dê ]Mpˆd#Žâx‰¾½9¢»dÅžþ”™ë¸ÏÛ–æ“´0Íõ­³ávÚ`½üœÎĢͷ£žQÌlzmG ¥Í>;zÜÇ‚í™TG§OÑÊ ÁyÑ…M{q'ŒœoÃÈõ ¤¾ß„¯5>Ø»1Ðq˜vlJ…=×á¿¶<ü 2Iâ÷T€»ÌV툢qaA—Sæ1,¦zKlL‚’Íp)²Œ“UÇ€•$M}âì¿ø¼' ¹¾sÓRÿË5ƒEÝ/­>ök,S©%õr‹¸…dyãºq§»Hwí².äþ ìŽçvq¹-ûðÊÜe}îç$?£ pŠ^÷µÛY³c0R$w¦´Í´„(Œ§ 6öª1‘«—I™,?Æcl¼¹_pn ‘‹ÀM¸!‚oÐ0$~÷i[­õ¹Žû}¾”B®:—OºÂŒêTñ®´ëØ×•ÌÞø ÃÇÝèåAô«_3ÙRŠhØXfs´ÔžË.D‚s¾2h½|Læ,ÃÞå並^œ6eˆ L Ítˆr7*}Ô¥]“®ÉZ¢ªÌÏ?ýÔ)мÞh95¦¾º ¢OïÙ4­u[vb΃‡kº{Ï-@ýì'³îl’нà|»¢„Êž1‡&kˆN^f12x3¤ÕÖTÄ¢±`…æ3útóð‹ó ià”ÿ²ð…ú—‰µ3“!Í ñ°`l“kw+ՈϺH¯ä‚KOxWHÀfu/·½\§ õ+/c)Æò§N†¬øŽw‘Û×2&hTÉùåa¿\&ƒ­†(±z8ÞšNeJäÿDÈ™w¸’L{¼Gp±8j^ ô[iŒWn T¯=ŽÎçZX‹?q(vhÅkÓ ¦’^ÿ aø/pExé‹¡'¨Hó*ºÒ n3™Ÿ¯F¹û^Wâü­âåÔÛíþà‰›K€,¾éf™ý%K+\Œ,ÔòÕê¨mÈTGÐpœ]Ws³PŸ:µ,ò˜÷:^þ9{/Ô·žè±×fÆåªÞ^±qHµ‹ç` ÿ¥Ñ`(f>Ò_a~v×¼gÃdÓ¾H-¼°…'/ÿMKjˆè.aM¬À+ùåò—™À‰H­ëî./-§%ÒÃ…a{€¦ÊGêttîÒ.}fšBo¬wø¦„+¯i´á÷~ñ/dÔ|ÏЧcß‹¾_¹®[vÿ´üº îi;Q™\§zxvN0MÛ¼“ï ±×‰ÝS_B;yÌPO„Š^ü=!ZWÅï½~ÏÎî|˪äNÑ×*¼ ƒí~ÙçÙ Wù@Dìÿsêt!Õó(•B6Ö¸9¹¹´*¡ƒ2müviÿ­¶Á¥¯Õg$â΋…å‡í“BsÉ·y__¥ñ¹#É;8ðcÅjª%J6ÎzôN®¸ÏÊ=뉂Sˆ?Zk ‰$_cïÒB¨¢_îˆÈ†ðb¸ÑIT!ç¶/¹=êZ ¦…/Ýüý( ÅkÓUx»4æuY;¤@å»éÅÞm $eÒµq¼ÎòÔª*Š<æšgUBÎý'šÞó6ûóqÑAòrÅ+ªV÷>K]lC«3ߦ;!YNåËÿÆŽ s'šïš/¾˜æzˆD¡½5 &¼Š7IÕç¦À[/'j€>ªÐtT„ÿœ ´†`lÓ®:³Ññw A_׋ÄñŽ‘Ãö'ž5¾ ôt-m´ò{tó»ÍmD’§ Ù[Ùj†-1W§X ‚\Bï—Þ¶‰ßWÚk+÷Ñäy¾ÛÕn®págzÕdA›ˆô¾IŽ … ä÷Yó6QçAA~C/5løÛreîð¤Åž”îÌ1] >ÚØqÈNÚddL‡жöãÙOpž^HkwŒËuðA ê¯Þ,¸ÜBJ ‘ƒbD¹­j¥Žó\ð»Ö½7rÔ×;Ï­êÒNiØÊy¸"óÙ¹rÒ©jX¾vWœŽ= Ò>DœÍù²Ö|rµf\ßÿj7º}ÞáB•(n­žD\SMxë60åH[5*’1\³„ñÑù½R•Ï<‹BWæUÆç™Ä¦<Ç©_WÁ6ϹªÏ²ø7¼ 9yÓ‡B¾·‘Sé[ô.& –àÈ~µ©gk@׊[:®j·μÁ˪WW»w»bL›®ç">sF°ôÑ2î:@Ü·-Ñ™P¦¶ÚûV+u”æD„p ’Y9oé½_l©ßµ>˸~¹‹êšÅ‡À‡|Œ@\©¹°;Ö§oWjkݢ9É.^g¿@¦W{‘†~|wSt¶B*¾kÙ¼S—„æS¢;„ŽÁUš×ÔVØ ˜RqcÉÈsg=È®­¢„¹Ò`|öD*¢-·è¤f¤eÄ=}™w9UÿZ‰‡é endstream endobj 116 0 obj << /Type /FontDescriptor /FontName /WALVWL+NimbusMonL-Bold /Flags 4 /FontBBox [-43 -278 681 871] /Ascent 623 /CapHeight 552 /Descent -126 /ItalicAngle 0 /StemV 101 /XHeight 439 /CharSet (/a/b/c/d/e/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x) /FontFile 115 0 R >> endobj 117 0 obj << /Length1 1612 /Length2 11594 /Length3 0 /Length 12423 /Filter /FlateDecode >> stream xÚ­teXœÝ’- !¸hÜÝÝÝÝ¥i¬q î®ÁBp \‚\‚'¸Kàò}gfÎ<çÎý3÷üxŸçÝUµW­ªU»¨ÉÕ4™Å-ÍA2Ž(3; ›@ì`îæªìQbÖY»^ܨÔÔ’. ì‘BA]%@ dàà°óóó£R$¼\ÀÖ6P¶†.=##Ó?-…̽þÓózÓl мþ¸ƒì@è+Äÿú¢&€Ú€V`{@RUM_^E@'«¢ A@.@{€š›¹=Ø ¶A\Aô+G€ý? Gˆ%ø¯Ò\Y^±Ä]@€«Èüz äirúËÅp¹8€]]_ÿ`W€µ }íÔ†XØ»YþEàÕnåø7!'ÇׇWß+˜š£+ÔÕÂì¼fU“’ùO¨ úWnWð«àhõiéháöWIû^a^½P â €‚<¡å2,Á®Nö@¯×ܯ`N.à¿i¸¹‚!ÖÿdÀpY],íA®®¯0¯ØuçŸuþ[õ@''{¯¿o;þõ_ÀPW½ *;ÇkN èknk0•õ¯A‘‡X9ØÙþa·tsúOŸ;ÈåïÑý53ô¯$€–Ž{/€%È •UÅúš@÷¿S™åß'ò¿Aâ‹ÀÿyÿÿÄýWþÛ#þÿ}Ïÿ -ãfo¯tx€,Àë†q(þÚ1ö@—ÿ+è¶÷ú.ük .è$ÿ8òPàk3Ä!Ö¯‚°±°ýÃv•{‚,ÕÀP €ÐþµSÛµ!– {0ôªèßÍ0³³±ý‹OËlaù«õÜÿp –ÿJþU¤¿©³*¨jèé+1þëNý;JíU{¨–—Ó+±ÿ(EÙÑò¿aHH8z|˜__ 3'/€ç5!;»ßÿíoöž•P°'Àðµd6ö¿ ÿïŸ'㑆X8Zþ5+šP Äòu¼þËð—ÛÂÍÅåUÕ¿_ükÁÿyþ{ÐA OêÒ¼£…`ˆmFV&´?opLʰ·›~0Ô©¬A«¸0°Ú±+ #bƒ¿Òì©&”¥qBàù«×ܡӟm†ïÝxö´]i “‚~”ô=…˜«4í¼Œ;A¬&eh™Gº1>§³JëâƒA¼…ͶÔ™?Ôrû¡šyxÃ%dó2Mô½lçãÓÓk”Fjnú–ãusD¦läkažŸ;q"žåÛžÑ\¿ M’ÝóQ<[Á¤”ýb};çmr¿ÝÚbísº—ak=Ìe>¢_Vpˆ_\*¹¬p÷`»A|¥ì7åc²uMë¾]¹ ô³¬UŠ w~2*]3¡„©‚|}¹yÞZ@¸Û.ƒ DLÆð8<0S«’™©vi/í-=ÍÖ¦¤Á 8Šô<þÓT‡¹¦ê£"\9?$—£m×·ðó).¢ó”LI‘;ôÚ´ÈP{%÷uÕ³¡ú€Ž‚”A5ëT„î§šw–B)ÔDzã¡|dzâ]'É?ÅÍ$>,îŽr,Å‘löË™ô–~×Þ–Jg?.è;êziv߯ïGBVpŠ+›\mˆýólaÔ-¹Ðz2DÝZ+÷L»ieŸXß²oÜ—§!`ÌYû—ù½%¦³!jÚmø‚ÉM*/ª¯’ ZÜï¿a¡>*KtÕ“f[%¢.nì´ã_»¨ŒÑöYQÖJÝîƒMÌ¢‹¾qò62 £q>ü“er Á“ÿ‹Ó7»ýg¦·¢ê/ÙÀ¨,C«²½šíÛ§ºV†F{4%_aŽ’X!ëªp*1ä[¦êÖy5z±òØ›1Æn~Ôwœ)ç«‚AT ¡—nH´†sŸ‰t¾O=lÕÞ$JYHzyã3ûp?qô¨\ìÙgÊ‚Ä ©§„õlE—Ó×?þòÑRú$ß§»ÖžÂÅøísŽœÆú8¸´CÑÅh˦M‰G‰g5 .Öù«·&Ý,ç÷üNÇ´Æ"™«Î'-Ç$gÑ53åO!~ù_WΉ¡ŽQšÁc˜×J$>RjœÃ´ê%õ4b*]¨²àPyø”mWDVÀÀ6~iÍM[㸧ܨM &<Æ@n˜4Ü»‰¾âëåGéóå‘ú+¡ )‹ì(®”MÀK4j½qªpu')Ô1í{¤0<ƒBh÷z}£ ÚÞU&Éîæ({±Eý…Ý)צÁ7Ì&¾¦œìf•³{ô ²îw©RóËay͘í‹ï謒ŒÑ(½d{Ë«’”NwVo,ˆž)?€_®…æ`æ§£@AnH*‚7x©è±:ï%l“4à Ö_îDœðÀžtÌ®Ý|”F{…/>°’u}Ý6ãGý—ûÑOÝ—Káy0ž ¯GQ[\]‹oóÒ¡{“@«PàÞè©8˜¶¯Z2¹çòdÏTê+hùq2ZGC×}ÇWå¿Èa𻱚ÙÚx}4[¹mŸîÆæ¢µâw±y¥¿ÕHn»¾u ;ÍTÓ\pR4]×UåYáßJ9C»J’—ÕlGJHLáãD¤ÖÞ ½ëãdÕù bŸ.“H0ÇNu cYÉH—Ú€ôüXäR/‡¡×µÂcô)y›-®S(21~¯µ«5è€Ôˆp‚ñ&dN¯£SÏUËE,’ŸS¯fI¦]Ø(^¥‰öDÃJ|ÓÈ>¿[#¢Ð;3jëEݾ{?xù=âÞ½S³|ëzšêù‰ù4ä÷C‚àÒûðÒ»¨ì¹Ï+gÌ¥†ø''V/t—HAð‘öɉ3œJBî>ØSzå=ÃÃ×#s÷7$0 ÏO;å÷.Þ,«ÔˆíÃ䂟ìeë"NÔ„‹Ì0ópø¸‚=£òÐzd“!Á,‚FyaÁÏKý…ŽŸüZJdMCß?1”»êÕm¢³ÊȾ »ÙHæV”.îÔ ™x5-8+v50T}Ñýê~¸/†d,ûél÷ÐØwó=7æåžÁlí ÉÊ;òw9³ºCcÊ–2|nBë/è¢ÌFnwck·v›Áôm•63¡íÆB…38&²Îá×°£©sŸøË õA8j­¶ÄÊ’ ²ì|`K}Å¢“¯ iÕpµmŠú^|¼αO¹A>G`רWcãxÞ¯êzzóéÅrRƒàT}6\4ÔFFêÅÇv ,Õ§m/ÓÈ^€šªôHþõ›`Š]3ÄÒV±&lXì2W "òƒ ¨`´öA}ýpâ/Câ˜e5’hS  fÞ„õÔè¾d6ö°”€G»3Ή«òÜHþO7’0ÿß½œ+ ¸å¬»¼œ(}Íœ¼h¬7µë0¬G«‹BåIŽÓÇJ­ÜË•Ž.þ±GTÖ=ä„Lxõ·ön÷¼Ê]O_COSJÁxC¾Ä8R‚³_tëc">ÓœŸ)ÅËqða9ªí§ƒ’ƒ^?Co´­RÝ1I‚•M¶Oll/šôÛ¯ßÛ9à*T-!N°ìU“0#εƉ+þXfƽ½"\ÞZ:;ž?vHBWtYžÉX›d8ó„oY\FCó(Ê ˜ž„u"(†¼ßòžœ•HzåÀ7àOŒó•Ï÷ûÐÄ«’ÆþCrëGyLKÒLwYä­w×S”ºÚ.9ý2BCáoë F¨ÎÏõçX¥Mw£æ¢Tù Lè—Ø~=ˆªv,ñpÄ7õ]ð7ßÁ ‡ÈËò[>ék˜¦tzæÁ{SÕžw!‹· ªS\, chƒ]ÄpÙ å'­T:¹)“'–Áܶ¥¼†òÑÍ×cFT¤ÞòNs.³n®je”¿R)|€´{®z¥3?ÌeËC¦jï3@Š5ʃ°Ÿ;ã>¥ÏøàS¡¿Ò¦•é ëç†Á¶ï(+¨ {ð}2RåQ×’ñù¾w KYv{Ö£ûÇèîµÞ÷ɽêìËŽ>+{vÐOŠ ¾˜Ž…:Es®ý<.ÂïÓ a+.'”>ï‘ldk­:ún§òÒÊn*ñбzn|#KÄ%lú¤V£3`¶i¹öIV$l»@¤)p¾§äÎ þ$í0]Á7˜¦Ît‡ælÅ©KΙ]Ù&ëwŒ¾ºWRgbð¬ÜôcŠ’nægOs ïÝRèj5¬éÙË9põ7€\Œ^+nþâ›ì…œx%¡n{¶nréD›ÿ›sï\`ÛÏ¥HyFWI_ØH¤°d_9\ÄÄ:üIóXü͘ǢԥkÑ %Ô3ÿ”ÛŒ}Yß¼óx­˜>}þY/¾ðÕ1/ˆ!7]l—ï0ïÛpâÓ–?,ÀK+Â?œJ¶åÐu3 aì²-¶gŠ·}C )¿’ƒ9A¶A)CßXÞÚ oÉ”ò"³ê@\ûû`ƽâ8Œô¢ ?s³?9PÚûi” }žc‘ðšX@s%ˆº*©?°¸º/¼.™Ý‘jÉ¡ø€Tv*T…Re°*!¶M4*Cž·C±:ŒçI LrE®o¡§ò^Y*ýf¥ãŸýX®ûð;½Úu@èǸ¾°ÅÚ­Ûà÷ :©Þ‚ô”2Ûº£¤Â´ÉÙ7eâÌtôsMÖ\pQëÖv7™Q¦ROmÀ¶ºp/³‚ƒü@C'%êuÕMuò§åÔôa-+$'ÀT«„ßå Ôá¾½“”¼µxZdMnÅ+' ¥²ù`‹ù‚¡çê#ÍsÙƒc6NSZ'>·Ql¾45©«íšš¥TW|Ùxd:rÅ/@bROæ?ƒafÍ_«ŸüRA$®Ã1ˆ‚0Ì×ó¨ýà¥÷%ë«c¦Cc²®•^1çÒ…¼À‘;Ò¬ŸS¾*5?p0¯]êŒ!îhKbb»×¹Sîn@“P )ãú ­#EûêhíÏuH&Ä/¾¤M‰ñ`GXhÉcdK ¾ßaE™æœ_™…bé£6¦’`ÓzéJŽçJÛÅåfrè¥j»ÚhíR"wsâ£B wÄæ%óAß ;s„™Nt>±Î ð¥&‚^qÔ¼RÌé<œæ“b¤¾Ô„QmùÝÑm’Ÿ «V&=:þ V)sRhÊO\½pÃùptšx„‚0ÐÙ‡O–^’»u禷R½ÁJ6—ù-ç‡ã&ïÑÈÇíŽüb½ø(‡‚g6‹¥( Ý?øw¤aÆ× ¿Œ&X ¸"’U®Ñ{ÃÐíjɲؓ²¿÷,žŽZ­c`]H[añàØ{Fúžv¾ñ®7ÑàýAèJ:aâOPN0¨à… î¬w¤ÿ¯"G¶Êàá…œ»©tâ–IGgO”,Ô¯ßZ )œ='ÞòábI.¥ ±/Át§'a¿¼½Ü‰ýÕ1áÙ™“j©Ô|?:3﬙`æÉð0`%}(=¸r^ˆ'vÍŸ6¡å_†3øH÷ÔKó„c|{Ÿ“·ZýPÍßü¦‹à›¶ÞMvÁ Ímyl˳©‡%0Ô|ù›_ëÞUà”îÇ:9Ë$#nK7¡ ®3[Ú¡òyro-îü¹9´wXJÑ+`øÑj6 sѲj1ÅC°_!§gF%ˆH¼.SGJnr¨äѽ˜×QÛp²dÍÑU» 1 Fáv§ÆT¡înϤ~CAP_;>ÄÜÇ'`‹Y´vÙ@=š5 x÷®¿”iÞ岸Oø(†¬Ô LãZîa,Œ*ñØÏŸÃO':Hrätv¹5 ‡µí’Îsí@ŠF/Üj ²oÀW¢£Ñ‘æ ¼ÊqF-a"ÙoãÒ}¦BÍð¾×55ü6íªn"Öcâb4p]óã@é}µ·ÓØ;ÂÈwÖö#ˆî=DĵöS¿`íÔ*Ìmk€êŽóìœI_û§;ö7™e¾çCR–âQ+#0õSü>±™6IS¥´Ï“$‰m´¥‡ûÇ¥™¾(Ä2 " ¥eÝb4~`;é7,ôóK¬ü9‡Õ¾Ém®€ûŽø¬„¾ftöOÚèéíï – X‹ÂsúVf9ð€aÙƒϙðMûõɽµ 5_'’¼Ëë}¦Ãrô=ªé‰\|‰«ëVÙ©§ è>°ê¨ÁoÐ-ÙÙ2Øa¡oÿøœ†AÀ¯–Ÿ]uc{ÿ9{9uQI¿•iaÙÆ/‚T¿2ÚÛã»V¦ Šó‡;áÇÑSé7’%tµ(\¤+ëaŒù×-–²~ò9õ¤Pâ0‚2Hì1rräù*ñçS‘'ŸLÞþÈäu騜*ÖnWaaõÌ H6\ô<*ʵÆ6­[xô$Ùß,9¬Ör]U/¢X=E|áaûÊd¬ÝrQK¨ö>¾Sºž6GìR¾‘:{ÖÛ<*ó´`ÆX…n'_ïòÔøpßv[»›U2´`»Ä¥`¾¤ÔS¯]Êíøa„Þ³ÝlŠÁ Ý¤ˆt„ñz¨À’òoxÿØ>¡_âø–ë,˜çPí'ñO‰®}Ø’•9;¾º°ß©Ihš—Ö0÷bÌ4\*¾„MN/¸ûÛS¼‹DzK<–ðr8£fóÙ`þ‡èSVÁ î=YOŠ‘—Éü˜„Ç­%m¨'!‘J"öíÒš-§ncWpË™|´É§`…i«=‚¸ 2ø}RS0.ÈQqs$(3¶6­5“Kaº=[¨²Fº%>—Ú]¥}ÒÿpRËFÿ«uf˹ÐÝwÆò“k¡½ ,o/òÏó2Ný»ÚJI—ïÅŽ—‰à]xà¾öôüÞyØ@ó TYwš‘¦ÌzcÙç@#ÿ7gXpO­ý®¢3C(%……šCÎ/|Å:² Œ°û.Ç*ØuèòZÖ!_8®6gà†&S&¦Åž¸éñ$+4Ó¬®Üe3쮦m°‘àÅ»v­@¯÷g¤w¢…Œ¦¾fSûê(0Ýôé¨áú—ª5úë!åÝÙGyúÕažãζ7üreÓ$šgX÷ï2Æ3.OÃâ[#oVuõ\I}škþ ^Õ Aó† 7k'ؾx¥I“ú-,>·Õ=ÿŒ5S0"à™eØ9M¢ ¶L*;—f¾×tñæ.®}2X·E­¦ÆÌw%Sz´ýøÇ²hbù¸ê)îÉÇ„ø%Þàb;~Mòvê-¥¦»(Á‘#êöos¡¼^:¸wMÆsÇÌÁÞaeÔÔQŽMQyuTàˆ#‰–˜Øuö‘ªáõ’¨óP™=™cæÞ7±¥ƒ¦5åbWjr~Ž0h@ádT@¬“¯Ù™ ïN3mçÜaÏÑo<­2e}¥/Ý ¨±Ë[¼ÐÒ 62†ÝµÒŽŽßXYÿø]Aôš.ð×6ðâÉ®´³;»G»¿n!có Õ𬤕ü\74âiÔÚÀ&B©˜Õ!kêÇwVÚ/EÞž±ö«áÖë9ÃÈÊ/*ãÍ¢}:ãã ®ÖÑâd£}K n0(öâš´›õ óWþ ø^®ÊñÖ^!ÆíÆRÔB 9¢„Ç^ošl>|¦ë¼Lyê“á”Yä_¥>ÜØê_úžž&lçºè¹âjhxE’q¨)w|›q¹w€äMÂ&i%—èY‘1e]¿ùZ 5A;ø ÇYé…\Rð”$׋\Cøï8)yª5ƒ8zø­`š%PÜÓT)²‰ð÷'ÝÄ ¸RHÞÈ_Ó²þÎ.€=‘Öô‡F “Ú«§È°>ŠÐgÏQ0¥F¤HÑx—¤ ʇ"5­õSçŒÉ÷bU2mxŽxÆÊsØ&Ûó–Ù~¬«ã»ó·ö¢ïâDj?5Ÿ±¿ÙMZ©ÖÖ—J#Zÿªzø¤`î ø9 HlßtÁ…·ésšw9;5N8ô¶;ànD=¡/}‘7õTÑÿñ={–~êÍ|Ž Ü>Õ¢p6-‘ËßN Ú²BÄ]:‘â­×ÊåÈdßäÌ$Dg,°ÌJˆ,s’Ìp'&h@`!e¤¨6.ƒ¢1·±°¸ùÓÌÉÇX·Ú>‰1Λ±¸ò›5Ô’©òÕˆ‚ËŽËM`£¿éd¶€VoµÓ`÷~’MÍ Ä7W1M_7›ÛƧ«S>.8Ûgw„X¼­¥'ÁœbU¢IXø¶§[8;æÝ›„ø,vÈSåN#§¥î9ñNJ+àN¾D€kaå*ö-Tп ÕÚDÜWtA“¬+ÞÕÉøÂ'×®k6Z0sºù¦*7\=ÿ²† i|ÅöÁ­«ŒL‹<²qc%@°Õ%;¾À&Ž}O¿bL¬H7oëWùôïOñ§Æ˜5Ö· l.…oóŸï¾& U-m©0C†TÚÞrÅq´æß‘÷„ÐÆ®}"Ü—OÏqõó“v][Ö{óýÏî­‚«õ7º0qzÉÆ·«¡aÇ"¿>ÉÕ/› '.\ZÊ3Ò¯¹­Ä.ï ¥þAγÄÉꮌ˜…) “?/:y(jü…ÛÁ1iÒË_1F5Ê„êBN¼°A@z<Û7´¤@†n¨K¯êàÄÓK¯ðoLŸ¬›1SÈõO˜ÑÂ8xÊrޏÅ$atÁ# zÎ{È&;ÕKÿ9t*7[!|Òa§ºÎû¤dﯟŸÜÉŠ+ ´žòYp°Øûá3ÊÕmNb\­Êè~Ïö×ûؤ%°‡FZ"’ËíO†×ýeB€ˆ¯dÂjd…y{T©eÉåhÿ½+Z¦ MÇÙ1Úô£Gõúå$g^ï4ÖUýïp‚)Et07’®1÷è“©e"=> Ñèð%éõ@ð)Zg±orY–”ßå%ÅV$†û!Œ*s`xNJz!bÄF×LrÝ=°gñK•‹Qnφ³r°ÊѪæ4ÐÇ~T/Hök®¾Â‹+l˜ž[u¬™oÉøFÙÒ_÷Ȧ¼tªG’ƒî h?^³êÄ %}}={]Mk…ää¶_ ¤Ö³S­6ÚÄëVdª¤êõ&úÍTî}6uGàb’í8­è®Þs†òÜËõð ÆO/Ûý˜ÀÐ 9éÛFÿ÷­é{'ߘß9øÔ²úÑ­p3#C¥ÐÐÜÆdìÊ–±ˆÏµãØ(ä:È‹w9#†p-t(_ç.Xk$$|J‘q/RÝõÄûê¾æ‰=V€‹+×ú ÉáïúÜJ•ÓjD7j¨4•ßå_ÎÒòz“G×ÝB&¼\¡¬V›[ 'ÞC ùëÌov4ÍŠƒ¼‚g-‰)ô](¿%ª¨{Gª’8bê­5wÅù«ßBáPÇ.R@tö ÊáDÓLs«H…Ç‚îÌ¿•Ë_•Ãä$ëOÚ¾º¥e–2E[;B9Éí@žïtÄ£½Æuà׌Ch¼ˆå¥ºVjžÁ Ã_(·ð¯>jý±ß”Vz`—ÑL.[kYFn€eÈ|dºyñÞqùð“10^“Rþ±'4é©Pê"•“$„Š1aá,P•®dUòü.1¶4º¾(˜ùV‰õä«“¾ŒÃ:vÞ¬Æ;¯¼ÊjNðb¤.ÇÍÆ^a®¢p†2ó I]&P©A¯Ôä(.ý$„c ­t” gíw/µX_$]Å<ÃoȰ“õSU§ÆÓPÎB ¸þYÏlàQÏ¿™ÜùÄ£¹îe3¾5èº×XâÈ&¥ä·zsP\xÖv°ÖPÓo†gY S‡TBùø½< {Ù?4Âäý%Ï¡Dö_’ZÀä“kÎy2‰UEAé,ÈŽA^ ¡«¬“M÷Æ«Ÿ>?”6ù»›r0üH¨?!!^±D­®½OÍ|'³°/ñFÔ ñû7XlåixK{üox‡¨c-ý$ø–±,SWù2l+zÙ g}zKµGâh¡qJ636¨ªÐ7_®©b‡/6± [>qk_µÝ†ë m8(Î|êΜlýv©4 §Ïò1š+ÔDQôÞ&á Îj•[FÆÜqsþ$û!l|Ð*ögÉÂÅ+·K)o¦Æë뀶·cBÑx^#×Õª œáñ•³š;6N :g¨†­ãÅh5ý®v‰ŠÁ“Òé!%õñÊœ[•òúœy°*6‡e7è·g`Æc>ú8Ýw]Eí;—…—ÔI÷Aé˜úe¿¡1™\ävA7ÿü1·5Ê$~p_ØJ½K\k¨×JRFÎCÕz ””üŠ{ù1.þžÚµúça.‹Ñ^ÞòiiaPù°6µã´‹DË«ÜSÆôþ+7jbþˆ)€@í²L$Ç[ÏϪGçõ÷qgªKÅp‚µÂãµÝuh-™qßÀ‰¶‡¸Â­8Kª¨ë Æè¶i!›AÙ‰¸XU.ô¾ù} 1‘Õ`ïÐæ9ÉÛUÎ?dåpøÞ"’úxˆÐv©©Nq…´·Tû²”’ÕwuÃëÁoûh¶Nظwã7#*ÓºHÉγ¦hwFo%.‰ñ±QÑÈãqý›…Ô}móÔÆ°½³†e,k¼†wÝ?Ã3†}@˜‘7„—§£7`u»ÙELoàŒ0§ŽŠ«U…{ó›¸ \­µ×<ˆdª%*ÕNOÎõ¾Î¤ô†[uº&Ú¡¶ÈTjt¨¬Y ^Bá:µ;3h úDsL. ' í§åŸÆÙ…7LGE'oàIÕ»¹È«-§ÅyoIVÈò¢o.´‰ò¥»JSÜ ÝA#J+¾F6¾èø–:sçå¾kTí6ŒPž7>Ì; ±ç±efúF¶F‹CãìÇ÷Ð%û/•ú³&»¿é©Nt+4Å<^Fý;i/l 8#ùcðrä£ D¿™„‹i#¡é…ÌÆ |gcÁWÛ[}ɈOì¿ê(ä>|Y¸lU "-?Ç eöy&-ß`”ƤWæ˜)ÃÀ,S gn/}£P|¿ª"ÿSe2©/Ô®N3”CÀâ_€e¾äÐ5KU®±u(%nw´š°Ø6§ˆV•©“5• €'´”¥¸JküiÀ2ÕÚ°#ý ÇN®,öQ¾Ÿ»tÑ–"ñÒõ—jÏcô8ÀQ ÐÎWÑùð$™ö Èo Ò6ˆöR5+d¤ç¿’ã¹Ç4þüKÇ3@J’ÃO —>Ù0Ùd®3Æ}âv>!åŠg?YÆ\;¾hÉt$ºuÌ~9eÁª áMÚýÌ’ÀåÄ=°âþ9MTÈ׿ù,ù¥\Rh¥l)ðûˆ†’Ùx‡@¡xA¦u¯Á·Ãóþtˆø έŠý¡ _Å{lÝöjb³?j—Í ¶º¥müâMNM±©å˜,ÇÖñÂqf{JïKâ—§l õ½TSÖîëþpMMÑ1êóö´IÅÜ æ÷4³BÑøÅy›Öc«>@à²TuƒµðU™šÖ¯¡œ;ÈASQ!ø³˜Ÿ:(Ô"'>+suÚP¬vù®Vìã¥5 Ø=i8å…¹ HŽ3ÞÓ¦U5ŒÕ5ë²åKR·ØŽIAéa4R }HFÉÛ€n˜!]‹Iò@UB”FTܶÍÞxÁVÒ]r<+ð%ÎrØBj¾ŠŠ’"T—bÕ˜nÚó›Åòì\¿7Ì·Øk“Û®A„{a'" $§•>;ƒspy†`¿V,·¡Åmšx«‰‹ßÁ?ªK¬[u½urO–Ý‘,9PÔñ“.é‚L ÙÝé+q¹‘ǧéU1Ö=y´“ÞAœXb.œÇ|Ë´cg@!¢Å¿÷/Ì|êíÝè6srßÚ*öôSØŸ¬KÂëÄ=PmüDùñ5óªKg ySs¬#­ÔyœÜ(m¢Â/t6úíLBùëâŽö½'•ƒÃÏæux1„µ!ÒdÒrGk—7jl†pµ1YB$“ÙxWŸ1ñl߈•%;˜¢|é:âZ0Œ·6* õ9ñš6pÔšUnóë>s ì/0õc ñP‘O\qQÂÓ&u9¸œTÓW3®ÊÆÚLætŒŽšTö£ê,~a`¸”"9ø}¨††Ë—‘=_@^%N‹_w^—ÈÐ!žB•¨×¿æÔ?`âaìt–‡ívÜW÷E‡åżï¿:JO‡\ÒÍãèzæ Ó<Ó26x â“Ú6â_/¦8(ì§zI(¬áQÓ%Æ`™ÞÑt&qêÆ0'ºvœ7DaDâÀCÏ£¥¹¸À:•Öoq jt¸Z¿VZ_S+|$G}™"ÄH8 iú6c'QÃCXàqœ0í7×0³ÖÒ9}ðI8EÛªZü¢HU¾²`Vuž°s¯Óir´w˜sE¸Ýên,ä|Ìn0MŒ;Ulþ;4\DºùW~w„ˆhªè<Å-€/¡^™%âª}äáØ÷nÑtœÞŠÐG\ ®k.Sªö‘{n­†±2ÂHÿoYÞ·9y Ã0„tçâ‰@ÈÊqTpŒH‘<Ì<·Ã,±žAôm!‡å¡Ÿ3âʹÙ7zßÝ«ÕÉ\”U؆˜*©Â^m2»¾Õ=âv3Q¬.VŽAœKÖÖ¦ü•Úœ²xA!~ì÷ÞÕ-Ê6‘´÷H;Cº3Â|°  ¾ð=•žÉAÅÀØ!K†.üN‚ƒ4õ¦_hŽ/ððwkͺ"Í'žïÍü»ÌÑŸy®2ø¥Ù8HIÔöHÓ†T†•jý> fiÌ­©lÖM4­nÇß<Þd¯%pøžJ2‰þ5úÑ endstream endobj 118 0 obj << /Type /FontDescriptor /FontName /JORXYL+NimbusMonL-Regu /Flags 4 /FontBBox [-12 -237 650 811] /Ascent 625 /CapHeight 557 /Descent -147 /ItalicAngle 0 /StemV 41 /XHeight 426 /CharSet (/A/I/L/N/O/P/S/T/a/asterisk/b/c/colon/d/dollar/e/g/h/hyphen/i/j/k/l/m/n/o/p/period/r/s/slash/t/u/underscore/v/w/x/y) /FontFile 117 0 R >> endobj 119 0 obj << /Length1 1614 /Length2 18861 /Length3 0 /Length 19693 /Filter /FlateDecode >> stream xÚ¬¶ctf]´%Ûª8OlÛ¶mÛ¶TœTlTlÛ¶mû«÷½}ûö¸Ý¿úëgŒ³æškͽ÷9¤„òJ´Æv†&¢v¶Î´Œt \E5ykkc ;iZA;kcÀ_3+ )©£‰³…­°³ @ÍÄ lb`b0rrr„ìì=-ÌÌ1(©©iþËòOÀÐã?=3,Ìld_\M¬íìmLlÿBü_'*™˜œÍM¦Ö&!9y Y1…˜¬ @ÌÄÖÄÑÀ ïbhma¶02±u2¡˜Ú9¬ÿc0²³5¶ø§5'º¿XN€“½‰‘Åß4w#û\4{G '§¿ï '€™£­óß8Û,l¬]Œÿ!ð×nj÷/!{G»¿6}Áä휜Œ-ì«Ê ‹þOgsçj;YüuìLÿFÛ¹üÓÒ¿¾¿0½Î¶NgwçjšŒ-œì­ <þÖþ fïhñ/ ' [³ÿb@p413p4¶6qrú óûŸéüWŸ€ÿ¥{{{k³íþúŸ,œL¬Mé`™þÖ4rþ[Û̆þŸ­"akj`dø»±‹ýú\MÿÅ?{†ò/ c;[k€±‰) ½¬óß’Šÿ;•éþ߉üÿ@âÿ'ÿ?‘÷ÿŸ¸ÿ]£ÿåÿÿ=ÏÿZÔÅÚZÖÀÆäß$ÀÞ1iÀ?—Ìÿl`caíñ ÿï‘j&ÿÁñÿ„"álðw¶fÅ` cø£…“¨…»‰±¼…³‘9ÀÔÀúï”þµ«Ø›8Z[ØšüUóßAhþ›OÙÜÂÈÊöŸ±³þ‡ËÄÖø¿Sÿ+пÄéeDÅå¨ÿ÷õß8ù¿Ê;+{Øÿ¥ö?:‘±3þŸ‹PíÜ^´Œ¬LZfÆ¿î/NfVŸÿCÅÿk-càìháÐúÛößÌšÿÏ­tþŒˆ­‘ñ?{EÉÙÀÖøïöúŸ†ÜF.ŽŽUý÷Äÿmú?×ÿntw#˜Õ%;#î`Ëô_ε?r‡&„µúzA‡BìK”‹ ü«íºýÒÃw8+ô?jB觸¾Z=Ïì?$©Gz0¬É»SM®òq}ˆ){ 7ÉÚÙ©éuKà3ÎÕ¢½®¤·Á4ÙTw'u‹? ð¦Ú™¡®Ÿ)ý‰] üÑHžì|ÒêãÐ;Pj ÏÎÉ’NžŸÈF‡‡»oÁ{p¨sâ I¹ ~ø¦œ&;{è;>4}¿¹²&”AËâºãqLPo)ÊFJŸ‚æžhø€ä¨ýä#¬æ=)Ã)ñûãÙK2µÏ1sãDaåù)÷ÍÈ[ÉzI;¿ï† ø$Îßh¢œ_gt>t.ºðÈ…fP'ar´’ÄM”ì¼ÝºNˆ%Ÿš8M=›<Æçå89£ųà3ß-²'-&ú —zµí>`±U8ÌJ ÆñW|öR~uD€Ä~—Ñ9…úWLJ÷ª8Ä4­ƒ@Vø÷בPJŸÀ»Ë€·ÞëÏ2<oë~Ì·i¥©4jζ jo\Õgä ¾V’àÎÑcà ÔÚ®ŠÎ¸?t‡`×s'PKM¶ÈJØüFȾ|À…™G ²~FG*¦ YÁE±]ï"ñÊ1%(q_¤y2±2 DâÕÔSDlÓ 8~÷¬rßIq P'™êÖÏâqBõˆÄšÛ‹*:›EÓÐxΚ¢ø»3Ôe%±{BŸZ'Ìü cÓ.¡–”:C³Lº gûISÅ Mwd^b œŸ§¡Æñ …—9š—âµ×†(ö1·=ŒO tQ¨Võ3ÿý%ýUg±‘mÌäX);,ß&Ä/Œ7ýçíè%?á²c° üŠlaŸ¹Bÿy’0BÄdT3(x*œOÕÊ&ârñnЧôw%±<Þ5ïKÇx‰·)÷`.--D¹B“€Ñ5^Ž(] ç÷Ë©]ÄEÔmÚ]·+ ëU:Nщ=2¿%¶ß ’ŽÄ‰;}ßUº†L¼8ò'`"v÷ùÄUBüiâgxfyü¨á(¸6µŒ¤´¾üŠKü4Âý¢êƒò¸EFT(ïOÕ¾b0»¦ð+½yíí´0VÂ2.- `hQÅêXYg;LÔ6é 92Ÿä­§!ØShb‰5–Tˆ,1Ë B,¿õ¸øˆæ…‰0r5ªBLƒ×Ú«ó];÷T­–äZ³…XÉæ¬ýy€¤\xº\¼h!x&ÒŽ‹‰"ùaâ¿4—'QË#Yàœí¢ Ý:ð5X`uÅÖrš¥j®4n™ónþA/bï(YŸ•…álØïi„•BFeî©ôaTÖÓelmóQäžSŸw¢tÏïüaü;¼œ?SNûžÖ‘ƒø"ÑœËê]¥ãÉÞüÁEÓ¾Žò§rJsÆàÅ4½O±9ï B@QBÅ9?&6ÔŸžeå*õ÷W²²lEçÆ÷G´¡:Ÿ-gÔ\ÝìlÄÞ[B ^V¾Wúú‘[?¨”Þ€ÝDJ@n€ªÛ0xæ@v´s]e+ve#nM(ûfÝ´ETh5–Ž{þRcÿ&½z:¡Ÿ uªELëð”2Úᗞͱ.ÒUsaBg û¯Ù®²¨•t¼Ù<ÖÅý¥õ룤97ŒWP>ÏŽ¥[+a/w©˜7pÇöW4Š[”UT޶æ¢Ú\wë0—I³ÓG=$ãXdø^RçêprfdÕ¯vŽ[®ß8 étVã?¸5åï‘F?Ê)L³láà²-–äx:±•¶úÝÝêhnƒÇt±|eË‘êÆ5–kId;&0Ëf†ýÔU©)™äØš¬v–Â&mþ~„ö³}ÓˆK|ZgÆç²—úüc=…L,·¹Æ›_Äò,¼ÿýé!ñe¾¥y/16Lø§ÝŽ…K8G$hkÛŠj!J%Ë}ÑmfÀ}CÔ+ ’& ‘ þv;o”cš÷oqé¡>àí°›[ðáôÀ% ô4ÿgüñÃæÔÍH Óýø#ñ‹Ñ›€M}ЩD‰Ø]íù8F ‰‰*ìœÊã Ìè‘Tßð¢B޹Fí‘Zb^¡XsmË¢`×ãD6üýŸû šþ™Ç2"›Ò“Vb“ž6Œö›VX/"2FKË-õy!Äâk!zÐ*¼Ý·jb2YW0‡· ‘Ämç$VÑ]âDºÈü¥¸ðìèY©èÆÖÌ2Ñ»v®e¼zª\ϰ%òRÝZÅu:jl?c/frWkˆY'6ä©e½§>6¹·T䨄VIô²Þ>-!ÊüºuCo/‘¶Du|c¦À€Œ —;ñ®ÑÅÌäÏö(„L‡Êïê½ß(YZu|M”¡ü}†9’¤ƒú˜Gœå/‚Ѥ(MŸé׈ϸ<åßJ¿«á­R8‰ÉÜø“¼4ï›)›| 87‹¦0Q2õ3[˜—óMÛLŸckÝÜ1¥L×êkÿ‘Wõ<5ˆ+Vøê^‡»ü¤ó‰þØ Ú»Íô[šÓëÉ‹¥œ´ÍíØ¨L–ÓÌûWQœU4YÏi/·s’ð{ïì_®ßýx C„~5 ”ôâŸ5 ¬õÌü ¶k÷¤¬½û0ç°‰ €!6k}Ÿª+ÞÔNlßhÆàîZ™÷#“LqgSþ€.óU#ÚËÖ°ÒÏÂ|ÜL#fŒ›ŠD!_Ô×Õ˜B«ÎÿB“ªéÝWÚOJ×° ¥²7)µ \EÌÂQìõ··esîŠÑ“BŽXiK©¦Tö°³®`t†?j´9‘‹ò<=05T÷Ü4qÈWry)‹«‹ÅãVBˆsˆ+»…ùågþ°ž¶±¥ò \Ì3·ePöÛ¹§@¼ºSs²i{L®CÃuQ¼q༆ Çç¥SKŒUŸÎ¶ø÷õL`ø°ã¡A~Ê.˜d3ª™¡ã[3^eØöá’ŠÓ—!utT‚‡¨¿®ÌþÅ~¬¿¸V¥C\Ú¿zå,¬ dĉ‰k G±å2Áûãh-jC>t¦hÕGîLó=¢DÖãú¡cR.'±.P(ýò) ÃõÕÚÀSʃìö›?PÓ¼ )‰·6f„VbºH­òÃ-«dG–l„d`ôÙ0(tçnfÅ=•p—uÖÙ¸“1³C%Niï„ð¡£3-{)÷ß©Ûf[ùèÞ>{`<¦›çN'Êo%ùe¨Ô©Dˆ}­¼¡•Ê3à JMõu¾4‰~¯»šCîиÒQôœ†òij¬‡ò;§ü²Oq/éÜh* '2mbÁ«œðA÷ÌË–B½IØ,a]rrÓ[K“ÙȆTU.Èn óê(^V…Œ>¤6Í¥I¬ö%´µÔ oQ踳MTÕåì§¿â·-jÏyy‚k^¾Fµf]÷§›ªî)#D~@SjI{Ÿ£þÐùUJصfЛãaÇ •‚¥÷T•UЃCìÙ}mŽz2Ï××A|¢K«`)$?—ÚåûˇbCôùë® Ñ‰^eƒ¨²K7ž¿y«ç¤Eà-¿“`kÓlÇÌšTZ7Í/ó-Y¤€7.]Á!š½ï-ßQlÑ¿g-÷ù¨[Í$G~³þ‰mf’¾&z¦7¤—MzIwów£iÁH¶•–dæÛϽi=(éãK€mß9Éø6þ»ýÓÕûÏ÷.Ö†wM%(æü„VãL¼'õ@Æ».YÚXÞjcÁ² ¸¦_oÂ×y, i|X¼jýŸ[I3û…—ë›ÅøJUÅ1< Ê“.é°h•Äp]¾fçh¯G†ü“5vè§eN>ðÅAWJÛ‰/Òñ=IãGG:m û{\¥#î:y’¿õZ¼Ã©§ˆ_£;v´ø¸rŸ®]àZ7g¢¸åí¢ýQ¥p•j0Aü¹kTÒÔ`¢­`%ua¤%ý:ß’B0 $ëÌØ¦=šd\¶®T`tUD r™x–ï¨Æð„+a¶zÈW¬h4Í‚µä —¢ÆÎ‚ÂR¨õ e ¥p¹6"Ô¿§òE%{>»Ñ];p #Ÿê{}! ~ôúÑø)ª9˜0™½>LýìzñSwMÁ V'ÄçTšô\‘àßéïóî{lYêôíB u!|ÔÊMÀ¢-&3ÈÁowX ¹Ãè§M¿šâÞÞÔ¿yü¬T¾½pÍÎÇÁ5ë¦õ ?úuëÃþ¡k°ÿ£aZÚ8ý1íl¤ƒ©gü$©«A«€WHµ—ô~‰ø!ðŠª2IÙ•RÄ⛀ԥ¬æábâ>ù@Çù00lÓq†&Ê¥S‰m³°ä±çŒ5¥“ºNØl­ÄŸZ%ØeÞÛžP¨.ï²V_²‘Õ²,Ki;”2ñé•v!ecdm°°Y}rÄõÒ΂J%îŒ~#gS“TØ#Zû+<ÖýæÜèzHM8 o¬ÎÅ­ð8Vä9s$e9Ñ|n5‚÷Øq-±”–é¾t´,ääN¦öB…®íB” §B®Â¾È¡°³FÔ%CÄÁ礵Xo*œxŒŠvšQ%⯠µÐ ˆ‡êà]$NzRà$©‹`a“¬);GHCøYå C:áH¸ž¤ª«hõ¬ ÔÏW$€“ÏDdGžªŒR|SB áJôŽ›íÿÔ‰ªò‚ø’‰D=¾ /MQ¢_ñMB­ ÇLÜÇA|— Üûa`ËçaÿЉQ”ö¢}Ÿ`4>Øâ"³\ì§<—ÂO=@ö‘ŽÕÄêcMzqÕ P »<í­ÉÞ¤â’1y"…,Ìä$¦“ÄiQüÎ ¯¼b0a«” ô³ t–öþ¾z9KÄÍv#%q»â1*çyyÚB)h6Ü<}Rý€!T€¢¯3µ 'rƒÂý¥réÀØ#¿C•Êvb¸^ÖZ5ûg‹¶å@d« ûÔÃ4›þõ1!›¡Q#eP¹³q½eMnÆm¨#ÀÁ|Ɖ¤ƒ‘ç„Ñ n÷%èjúµ0òTÿ–r«ß¶ûúžaxk¢x™Ÿ¦P: ¡ú>Vp½0þASª6&àP³åiÙ³R«ô‹1­ K¢ KâÈ~ÔÑÞ!ïÚVÎGÒà 9KÊÛ2efxµ€&œ£x;3(*’Q}»ñ¦þ†ðL妸žŽ·ÈT³Ó•¼©W¡Iëîĵ23ú¬õàéöµ §ûÚ>VõC6U¾N§zÓn2~”¾&eäY¿~h4ç™_¯ÐV8üîy$lÊÔøÒfÖÏë߆(uqmâ¨xp›ßdh,³-©yYû¨ÖD+‹ôžFWS{ÑèW•YRI™=K¡þ\dï­»VÞeîl{[ÄT6$(®§}=Z¥{žHdzx¨¾¶—Գ͜5"Èa˪²±¼¤í³¦(mcaí÷p8ýmûÆ2κ>:¶›™þ‚Ì¿7Ÿû‹“)™9¦âÜ&8Õ*ä·b)Ìþ‘.BÛ´-Óz}'Äi×+— „5]šÁ^){¿øìÒ%X°¾’Àˆü8Û–xÑÖæÔ“ñÅ'3.duŠ BV^›–òºðb~Ø DÓrýNj'ꃂ¦8­½C<#Œ'Q‘yÊìã“Þê19®‘ü'6þos±9Ò¦´—ûÅ‚‰Jk MÎs´(Ò;¹ K÷Ôqâ‡(ãFU?ŠÄôâ\§t,D27)ù™«y)ªõŒ»¼I¡î?[à:}Ñ8<‹Šoâí¬ºè›o4H²¨%”ÛM??‰ê@öÎAoü o[!~7ÕX÷z@:E\q™J#º€Œ©8YuÕôÔô„çÿü2é«)j5¶mÈ¥ãÊr%¢ñÛÔdf ÎChŽœàH i 0è\éÈQ¶?ŸÂÂAÄL QCåÿ4(Eú• TQ¤É($¼²Æ/ĦKƒ3ëêß¶¥1VýD4G—ƒù ¹›‚t©­ë¥r!`â†]Ž2íµŽãY ¦¹xBþ+9­ 0ß?öckøH\éz0ãs'úØ)b—®ëR,ò¡ñ6ɸ­Pb|Í•Ké%Q÷ü™œ¢Ø„½2ð†–¢í7QÖ­Ø{·}ø{%,N½zë 䣦Û:]ù=( ÝêèxS¦Ã´éÐιͤÛDö8«Å ˆ]ʼÀŸ6³'Îùþš*(  Ÿ õ z§øhÌ¿-¥p<9¦³ÂÇv3§3gRv:SÑQr5>`l—Ceˆá­¬xÀ4z# ÔÓÊ|Ó¦ëFrG§`.Yù>xé Ü!w)Ï^ëðgCÅ-–¦I4>3tRê¾æ¸R—e@)QÕ^‹Åî+ëãÁ¥=ri~Äñk)¬PtˆRšêá2>÷;\jv/“U¿ 4;–W¹?\†#à¢9» xðÅàm|u,dnX0êtý̪[‡û©ñæ¡^ù«•—úÔž„{Ù[³¯*Áâ}+ã:á016¨O»žŸÜMºUåììwâC’_+ÑŒ½Ã²Ëz«¥¼BR¯1ÊíÒÆõpcÈR´áùí rÓ÷G(<ñhòþD>+È 7 9˜òþ¯Ï_£ú·Ÿ"¢/ ¯â®;ç¦e%¨i IÀŸ]²6¦ <³0%>°t’ÕELe–“&磒ÝM‘Hñg u‚ƒfLš1ó—=µr·QÇ ?k¹u>Ï“Q¥÷BiŒ”7!ï¢Pæ1éÜm%ËÎï"Ê@)ÕU¦ÓòƳsœQP. }=)ea€Ò ƒ°Þ·)ÎĘ«¯gt×ÓÕ‰ ÜS£û³ `Éiàw·ágšp”Š/<ð'œïÃ2!‡ ­KÙÆlÆMÇ|™.¨ŸhúOŸ!MC2Ñ3H3™ºõÀº­c˜«ˆö?p¨¾ö¬åÂ<ÞV×(0Ì?ÑÝwNkeñÔµqóÁ“Ä 8z‹ö÷|œ@%]­ù ëD‰’eÈoL5Ù[¤$-èžéÌžf‹˜K gJн—ßÃMÝ//ÉUK9¥äfÞΑüÑ+zóÄ Œ­âIb§áE”1–¾cje¤rGþ‡,R©û˜‰ÔÛtÎ ¹`<Þ+otÖÎÙáîY*˜Kß[¸n¢9øÛÉ—ƒóåR±Ê5/ƒÔÃŽnØÎçIû…V’—#±ÃlÄÃãA¼ çK ´’ @—?’Î 5leÞ鎎K|æ~’!ªÊ¦NÌ Ú6Ì<ÿ:JŸ´ Qoð£ú²[‚²wtÆèldâò­Xï8§äÃXèÿ6žúr¿îÍO9 Än…Ó`“²@p\H¬C£G) ­×/à ¾‹ël3êËâ2_‹ø˜FE·ѹ;ÄÔ†R!™”ÌM!°Ùm(4X7†RågMÑ€Ïv{k·6mM¯ÙdeƒæÄZIJð¹Dão;®gðdW~>§ÆÄ>øÌ¢eåêZ°2—M?:à´6«ËÍd<;—3ºÄ€ö¾j¢$Ÿ›m•ÎQ´ï7lŸ‘” DWž%ôEÍšêÁM l–’J-e @x‘RóÍFžqíw7'׺÷ $ì¼eŒøÁ@<ýAÞêB•N+Œ?å,©x˜¤g;rðkÕƒQÜÖøÈ0_¶¦—<|Ga©™¹¥ÅŸ…ÚX‡Ô ·4ÙÊ}G]¨è8«ì•øÙ¨ôþ8G~ñRÌûïn<~>þ´²;ÒNW‡U .вÝB>Y¦Á5]“‰4p„·hšÚ Ç|af¶ÿÕ·——Gä'Á¥€õ‚5ç“|ØIõÈ#£Ë*T’èTÒÈbÖœÙË:#CGÍŸÖm2ÈZN“wlÕ¬ùÚ‹úk?æÃAóPW.È»^!‰íA›ÂSàU[)u°n‡µfKð‡¢ÄYê¥ü¼M¤ùö4i¸DqôIÂZÐM_rô럟°èÊýgrðx¥Gš3;Pïïrò¼Á_ §Osr4ÂC•mEóáÂx­›§³­Þ̼ºnFx±ÉöÛeÐ+ø<г¶bÃæÛ[f:|Šd´À`[f‰Ë¿Z=ß른¨BS¯¯ñ¼ìetªz[$•p¸Xü´Ÿ=0‚©æë$¨£f]:Q,ÐwØkr±ã½?ùª©'ÍùÚ= CV!ÀžÈöDoÁÏ% Íéø1þâ-Ìz2&¿ésñ‹·°k¡â Á;Yq’`VáUUØòüW¨u W¯Ëµ~ØÄ|ÏEgÜ®pðj™G<†úkY¿5bâÝ0ChÞ»A<1oyAéà &Hœ¸†¥:û¤ªë¾qœ¥C‡®ÓÊ Ü“BÏÜ—1ðßDmËMqKЭ²ÿj„goó§àÿ&7èQÑ•—ZÚ„˜:ýœ2åwÞ"…Ö­e‹\.ʸÒ>ÇE^É´n Ï–f¶ÙEöe4DFµùa nä=Æ„E›VG¡#=MRrtN9)'?ƒ½×ÛO¯\qÄ`HHY~RFww%ëå´YÎ ÊaÃs/E“éô“WüÜH²6íéX]±¿Ã»³㪓gù‚N‚:3—…í¢¬ñ“¾üðvƒ*Å&­ñ³ ȶi3ÔÉÛ$"ùZ‚r.øÞ^+ \ÜG;nQÀïÿ5Kó?/¼TÙ·=0NàQ3·{É™î ekæ¶îÛcõF0aÓ‰õkÂ(úפÆH)´eðŒöÁKú÷½-`lûä?Ë7³xZ`ù+Ÿy3x®|cmUžÖõ@ 3rù;6 ÚF «Û¥Ò>ØZ­ŸXŒ¸·sàã©€ÀضÏžn²„iêz‡Éš~lKµ}@‚5Ý6À´L'Ÿ¿ÊÇU•+ÇX‹§pžaãJ©ò˜º 8‘ ´2fL{^ìïW",‹I•ê`íwlVªºwlñ,ôϘ+Þ[ç`#ˆC:¦Ï¯ˆ&¦óÆ ÇË3дqâŸE¯OÉÊÚ·SÓ$W˜ãü´ J,Žvw ô²› ÐôÙ7Tìþ4Ê䤵8w™Qâv»7ñW BÙåcJý,Ô§­ÌVWJCŒ(gdоxŠl3ur¯á@Ÿ¸¸÷ÐŽ5ÐGŽ¿-•ñ*_CÝ jWý(¦Jh4¤sìÈ× Ð¨úN²,Ý$Úêx8ªµYÁ@B±r¢?ñG:èÝÐÂæÔ£¤ˆ©ʘ¾ñ×HÌ(Á™ZØAm÷O–ÒC4g Úˆäë « 4÷FĦñ™=úñTÇZýk.F©j”£ ¥? %pE6âö²x:RCçxûõîÁœÌàfx9ùDWlÅþ<ÀçÀ%*G+²Fß_wê¬Ó*š-I9ˆÒ“œþ\¬¤"É>úâ* Ë*ÙÝEZ-Ù ñ™Wë[jÛÌý<IJ©®ó½(èžùí®#Ó!->¢ýÊIíøÀC pkæ)zÚä¼Cr0#—éŒ];wa†5kW7{1(oØwËà@¦(¯ÆR­ùŠY UñM0ßyX¼mƒS·¦z✆ÆÇþ¡.²«—t³±Ò¢Äs{O”‡4ä9[)³Ãâ^[€¬“‰cÇf̪¦ÛöŽÂêI ’Wßaj-³Ü¼9ºXo¹à±UK½Ò>…`¢o½”BÆ/t´8‚fÕ¥>±£ãEò¶AýCv}²!¨TJ\w íù}©‘¡,ZçI͹ÚB[r›¹"06Û„›%øœÚÅyXßYu•M®À¸¦êáÕîƒ\C¿ \W3-@3Õ?¤Ô4gBËDž¬^dlóñ¤hÔr¼p!޶óqˆI$PJ?ô«”ÌD¬£yrI{¿£\f«ó± ³¦êÎü¡_°ïý÷­ï­¤peÐýL›þÞ õ ?ÎJ#ò< »_W„çþµU¹WS¤êyI†é5àIœqJŸ á×x|'¢% IPªd™(F²8]ltNÝ#•)tOâ# ²Œ ö Å^©Romðbje×*>2  •ɵË_»¹a@k,G ß%ÂãD‡ªØ5€†ze³'z\—]Ä)P+¾´e‘¢kD«å•ÙÑT‡{ ZŠugf§œ ¨„uX…Œ)Œm ‘(%{œ%AÐL.@ªš»Ó‹ ò ªFˆÞJbeå³Áîô]M¡#Øaî4é‘R-~f¸ßè^Ú·îpGüR.’œÿ •w¼yòÀ¥Ý$s+æŒxºñÖï®iBôG¹Sw|¸¾aØè,2â<Å£­:&éxõ¹G!VºÚ/a„08kC(ƒcÉœ™›{.–µ’[ÛŸòßMqZâ¬nÞBEÑ ÷í×ð"˜¬ %Nȶì=\Qº±Dø÷~hK‰.%®? ”¹XY.R‹‡¯ÐBô˘¨U­|À»òáN”ÿøð:ÕEîN•¦Û&ìíJ×ÍÞá‰BŒT0sd­=Nnô\)ûG­šÙ6_²“5›Î’ÐÙÜx<›%õ£Í är^!zz3\x†ˆÐ2ŒwD]¯-?¸¬e|kHÀãÚüC¾‹‰µlaöy‚~ 01?)rï€gÜm×eÈØ‚CãL¾1G¯üÖƒ{Z"Ásy¼=±ŒçÐèÌÀ,%´ªê\nÇ­”<6öd (òä~(âÃŽÆ<Ý©ÜõG„ ä‚'»Ö09Ñ:Ç=Øp"ÞÊãÈ÷‚.pOí.4ëo" 2‚»õ÷óLŒÈI‚vx/i«T~:ÔéÌsmŽ%à‰ö¸ŸG= Œ1üi:]¥‘š_m$Ôó¦‚E"iHÝvA 6Á™pò‹O° é*‡/·BõÚ~êùÐ` Sc«YLjŒú9£ƒ°¸ÐJ“°Žàbô[Kß;C\äk˜B/æÉ}`aI\ö1«õ¬‹d5Ú{«Gd†ŒB¾ÎAçî–´dµRÏzóº^Q §z?øH[Û(§§1½lb5Óý§ø ×ÂKLËø™­Ú^¥ý£‰ ð™†ÃÀ“Añ{•°1sX¡úØZ6pœ!Òq§7ÑÐñ…Ú„Â3A›*z§2zéqÄõ,.zœÜ÷¢Ü;]æ ÒùÅÔ`½TRíÔVúÍ;YîŽ9ƒ¶3ü,¯}Qsk²ÅDªÆ¶Í#m2w_H-ä,ªNZµïÆ"ªa{Fˆ v+7£ +®‰Î˜{ò Ïã9Lt8ZLÀ ŸìC0jÿ%!£[Îa÷éýÄ=îU |­öea¦—PPž»®g@4Ù Ö/•Né\¸1«µ?*)då¹ð–óÖ‘;Ö4œüE ‘Ñ-ðHÑÁ=.*õ*åW¾½Wt6j .'ضëL–š&ù$…|”¶¼#%-võµ ÖpÒz"¸üQ^«Ñ4s’MÝ2Í‹DNÆG˜×|ð{@¤%`ãY¥æœÜXß©Ûé8ËM"ÿrˆóUÛ5Ž"> ,²‡°d 3s™.ŽÆ\8±„Q(e1£³‹3yõ*M2Hîb5šopÌ¥ŽÚ¿|¿¬Æ83 ûΙúÉÇÌ­6Úb…^`ïÆ)<8©OKAxûí[#cža¬:™±&Bi÷•2&‰ã Vãö]´vŠxÝ׫} 8k½ãΆƒV+bm#ÿ>Q>yàÍl²éJLÈ´nWëó–fË —²F ‹Y¦È?ëš"wfí<†Â­Yšz?ü_»’WçÞ—,ö96¤= bƒkAD1@z˜ÒÁäxñ'ÛR~×)ö+x>ÏAxQÁV‹:îô _ÙI|^­ñ6Â’fë6íãÔŽÓŒ`‰›£Ô‡ˆ;ã¬â!Þ9Ñ0ž ‹á/3§4ÁáŒÏVLîa1$>K6ð81º‹ 2ƒëïJ·”Õ'Á$[äPá¬ÀÇyÉÆçPësžþ Ƥ[Ö~5WOÞ¥OW¨hÌýu‰ñÄ·§áZQÝy¾œq³´;<ÆCÿÚ×cÕ”ác[Íö÷Æ'ŸT‰Ö¿‚]SÛpTÔ+•˜Aô5Z-l÷ c麠)žùÇ™*úk|í¾ìæ5ðõȤÓÞÀOÄ:Ö¡=§±I€Ö™Kå–,¦à܉}Е†#%^\Ã'¿šË­7‘eR|õ’Ogh4Eãéâo-Ð=!×A£Æ§Ÿ³ãƧ’IÓ-’߃*œü޶à3Ê™§û !!5€¿NªU~² ˆRIФ¨Ç L4°x¨þ h£ GËÌA®J+÷,‹—W$ÃsPc €4÷ˆ€‡=Šen*$d’?hÌÆx¾GF]î–Q¸b> ÊM®š%-$LiO­Kdý„0ÁÈ žªó'ýQŽÈy‚±hC*= ýöHKLþu|Ê[îëæŒz „7#Fô§kwܶ]~‰6áÓ]QHNÔÏú«AÁ!=LCÚÖM`Þ?)H&;€€ (¼ÝùH¥3ÏíÔîù¸°eÝëYôDÇ~º’‚õ𝫉WøùªAH! YéGEEŠ› »*˜)wþj.3±»­D¨$êQÖwï¶{,ŒžÉæ¹{åôsÖIÂÉ`ß‹½<ϤwûõŽ æjL­¶š¹Ò×̧ó€Æì­)‰ÈM&läØÁ¯6³ìxˆöÐŽ’ÃOŽg™k75ŸÍ³¸Z>Å{Št¢vP’Yá=\òůH›ƒ©¡T_;;_­ fdõ¢÷J(1¨âŶyªãÑ™¶œ}ÝzY®YKÈ÷BÃI[[ï0ÔX*ܦ‰LÏUFÉû„ëýþƒDˆïlV¢×]?„Q¸FzÆ¢Óáë°â"Ðç‘ÎD”G5”|°{’•Qk¿“SctåXhz0‰ J­aô`¶3ÃGbàÝÑ~¦`¾&BN†Î•ƒé®¸Ü¯K²¯ãL1=ÁP9U`¦¿2­[„öù$Ýrw[¦k²=È#K|øxÊÞÓÅ}†•!Ï&2øÜ øÓ2¾â”ó7*¤§é…¼[%Œh"Ñ1."Ü÷,Ðy[@ûb0ß[Á'CÔ ‘ú[ˆÕ†KoBÈÍ€ßJX ÅæhìlÜÁtH¿3¼ªAÊ|rwïÚ¡{o 2ízE§S¥ÔyÉt*ÔÜá¸ëómF»H›IÃ¥yKBïú‚¿³‚#ÉÒE™ê¹þy;ŠBVÂóÉåt.ÿðT»Þ´ªh§N•·ï ,Kä#È‘;³¦ë¤4®a×`o7þáܿЅíÅ(Þçj€’&~‚ö9TäûIõÍaKŽ­ªâŒOhôBf¿ï™>q‰h)Œ·'0ÅuÔ¬pšm£jÌH>xgE¸òw«@ ‡O³ª¥k©jçÏ¢QDŒªv÷³ª7låüØ#ä#ᘩOé"5Hó¢Ñ3±VÞû¥Y¥ô°ÁùŽ’á­óW™Õ©ß™•ðeÈxm:ÛÐД½àH·áñtîù°‰×sŒÅOÔççãš½åýb»œØ{`þrWåѱByå:Ý%H<¢bÒlÔ¯|ìH£û'v7iRWÐ5›kX òÁ€¯—wIú¥†\J¬XjY×^¼“ o›òs {‡§ð¶WÇU¢üì窰{ j>=`ÌQ2 0BWZkÉ7`ÈÓ;gã”É~žèƒ'dsQîÁZUĬùi›ŽX¸F$¡—³X<4n`Db‰Û5öÎãƒsŸê$ë΃)²ØQÐNÕ.v¦CÞ§åÿúnì5dÊvÑ{ùy–j8lOdnRq¿°öM0NßüúP_ä­@¯Àœ[¥æ:þ6éÃ%ˆc²ƒÿ–£P…‚©øÛI>‘{ƒkeGÞŸ{βjl¿§YŒÒÂÑXÙRT°Gõ9Р‹–ûeáJœw‘³YhÄÌÊlšÚI,ýC*8T 4Þ\²”Õ¬cæzöÙùîŽ}DBCDªi:íédásu#„}‡§ùjÌ_3vÌá&²Ž,$‚RÅáUƒx3? £þÛ0—Ò«–¸áâû‘“ü®;ëÏÕ p@Üo»A ‡ìË\q~ï2JYªÏÕé•,ð§UA3j GøêJa|s¦”¶,ÕìÕL£Èž $|Êà÷VÑ”ÀêFªÓ}¸^±TÈ\B‚rEò]¼ŽËš>”eg<Ÿ©þ¡Ÿ6Z@kê,·¨‘aT£zè1½²­½Eé <ùSH°·×´Íà xÐjs§¸RñUØÃId ÍK³8z¬'|ð-†á{WâVL9½tú‰6ÃS!¬­ú2ᘠ“S±ÇÀ~š3üÚTÖGЬҴ ó†à£¸ëå]„á[[‘"Œ.È1¢ñ‘¸]žì‡ñ’pû¼+u*ÝÞYÑ /Õò!ŒM•¾I}E¤EZc¬1/2Ç4K¡¯fn·@VSªî£>-^ÕÝaM[‚{˜ß2ë´üF߀rT'GáÌìí¿¾´Ù:ø-«ËÀ”öíHr„.-ÌP/ù©EA|¶V|Dè!-­$µ-Éû[>·AYI$~cuÿVñô?ÛÝ  d.P¦z£Dp}D`A5ä‰zz?Bx¥8O/M~;;­E%UëK÷¡ÜEHƒòX#F’U,Iƒv\3Àbþmå-Òkæ")¦½£7n‡‹3I*¥°ÇÆ=Q6\ºùE÷Ú;èo$TÿôÔDTqßÊB_:nìcÍëÒ ñû”]N4#ËÅmîÿ®–­j7¶¨Cˉu΄R®Kc_&‘-cð›3rÀxÑ–‰Åv¤hC5pcÝ­¤ÃÒÚbìÏÆ‡ÓÌ,Õ8;Ö9ÀÄ ÿÁúôÑñn‹îˆÜ~>Ÿyäi(wý¢)ÞPH¸ÌX¦ ɘ`m™nDÖ)Ïçž,|UçZÈg/ÕºýøÙšU٧תûIš…²å){ûúçbÙn´5³iCáÝ,&êG‹ùébŽ@Ô)á«d±™îSs§›~ñŽÞ”l…ëIùЇ5o NãÄ cË6E«^]Áã|>å >5žhó¾UNÈ?fÖHïÅøÎÄ´Ì&~G{eàí´„Lœùë$"¤¤ 9à¨\¹3¹ódRiL‡#؃ûLtÈÄó½…´Ad©"¨O‘œjÄ»(²da~O7²Tѳ¦Ã c²óûð[¾¸AfÆÚ]\v¢¦£+kóMÇî*k ŠûÚƒ§"ovÍ>i˜8Â.ÁQZB¶Æ¤ÔðÏýsô]Ù?)‹d1’ÛW܆)¨äld!™]WÍ[ïu¥Är²„ã>À!fA9û·bÔÍ2úâVŸ+O”Kâö>œ)£no&g/¡ÊM„Òës²+5ñ^m‰?çɳ0\¯mžM½³9ëæÕû:jà¤Dqg• °aHL1̬±üFÊ?aÖŸ™ u(ˆ†S¢}!ÐbsŸºˆ.®W$J-t©ðfAÃk„˜á,•Ç$¶@ÔÚí»)ØjðÀj .†`EHÎ2‚󕛟ÄÞHsE_§uú„yá7½v-,áõ÷ËÝô¡4ðouñI"¬­£©<9»nš™á±¯sÕÙyèË—Ÿ8\3}KP˜ðí‚„ÞôϤµÎ¸Y˘B2_X©‰õJNÐû%§½šÑ¿Ès•”4h¨åÄ“1¼ÆŸ„½ÌKÄ25À7’ç€eÅN'ý\y°LX•tš9¿`³r@‘¢È#º½‡f´¨išÈM5éè#7šb=™‹]0ý x˜DUb %¿\ ¿$Í^žtÔø†9¿ý8¥ÑäuoüLS„\5ªcÓŸ ÷OiˆF õ¥R2ƒ:¾üµøkHúî¿8ÁNéH; <dg`%"U‚ÉI?Õ™³…¸~F'–FZ»jœt¦]gÝœ:fqCáNÍ<"qa‹8ø|Á¾Ä™?*¦c°5UÔ‘Å®ÿx$Rƒó3¿}Ò‹â=éo™œWÉ‚<™<ж}>èÑu4 ’°¹¡CjJ]Íll;×Lû‰Ü8”@´š@úŠöÚ©9}NÃÍ]WD€”Z`{JU?;º1<ªb¿uOeíúšIù{%ë^í-e£³´\Ù×åµEk“¨©ÞºŠúM´ñ`@ †Uê¡¢eK5"ݵ3óÀÿGeþ­è;­Né*ô8ÖsPû°2µV‰aN¡TH¦<óuŸ¡Øa’ì7ÒtñUß RÏG†Ÿ5®\J¡Yí€$hÂgˆ*7tQåUä«ß–#²’)9ÏòòL<ÁePãv±ÅN1&É©T EÁðòÕSãÐôåuË{%¶ÔUGE»fë«L…~—hÏY,¤&1[çIhi ½, Úùä·š[ÉßQI> *LúÓx`Á›sþ¸-ûUæàt“×ÂÙfOÛΠíÞ Øwôr*Ñ Pš”2–¨]Õ…þ㉅‡wcÿÍ|ÀÉܵöv¨¼ú«þJ.~•uU‰©Éñ$“+.ð`è¼w³d‡VŠ™òKÆ2¯Ã¾õ±´ùv'á}ŠÍÔÖáX4ì­îù ²”r$“8Ç­w\8!ä3trH«Š»t¡Ik¢Vä©¶#ˤúÅùVtæÁFÛhù¥áüúC‹,i ,k}v/=ÍÍi(ð:Úœcî•€`t6ÇQo7#z>lA@¾½lÎ&¹ãtïÆNJ¡„"Ãr&NþR“eŒ¶š]9r?ZVå´°ib¥ ŠG…ˆ9B‡D±]„ ¹SĚà ‡6w ‰·¨QdùIìhÓÁ‚úFëµ·)î".Im_åÖôîÐÃlx«ú¶›CmÏ‹,°ÏýIAÑ5\Ôr >Ù•ìj‘ òpQ‰÷tM(¼µèODu©! ƒÙ37ëÀz‰w·[)p)ˆ7 ƒâWt7·ùî!þ¨¶Üã+<À»@«RÚÝ/ä@îÆJʈØdbÆé—º7léøÁÃá@ÞÖ‚qŠ€šiêãŠzÏUðÏŠð!¸&¬llL»–¨¼Ê«(ù š¹, ´‚4~Ej²lèb©@L™’ßSÌ.%NŶ"«Ø§ç8ï7îÀT Àª;šO>E}¿Jéx6ÓÚ NäãHäó£v&&øba¾ËX¶sEï$•Ó­ÏaDd ‹Ðcì+iž ÃøØßJ^4Õ›vâb lÆ©-á0|óê3CWEè^¤À t¨¥úˆ,§Ì8ÇÃbçþ#Ÿû„Ý ÐãJüj9ÿ“Ñ'øž#t‰IPMÂ^´·=p^z i¸‹(:ÔÍòî=yÐQÌižK÷ïŸr—h×! _ o¿‹.˜Å»òËÚ̈ȚoþÞVµx§‹â­uÐÝÖ{í3ºžìOö"ò+©PŒ^„T×u Þ?e ½Ïü0 ªáÏ;IAÊáe”¹ï¹’£,üOFª³¥ŠîhEUØù$µâ~L©Æ·îÞ£çÑ6pøúÂÐBŠŒ†Ûà*½I}N› ‘fq‘ø)ë‘z£&þlÌ:^®›§_uiˆA †E›‘ì#Ë[˜ó¤¨—¾=Çf_Ý? G…ÌNìKDI¹¬ Y·U_Í9H\¹Òr•²~HâxîÆßùÖ6iÈçÚå#ª+®ÅKlL¼'¿&5±r(q¼~wLnÝ$³Ùo;ë8²Õû⤴RÖÿÂjaqð€íÅn]Õâ‹ÎÌä+²Wßô¹ŠÀé+IvŠH¿uŠ\ ‡U¬]šÕnBð@½ý@ДѦyƒÁŽ™D5,R`I;óx;t䢃öâf²¯µÙò§Ïê—A›’ÎGÛãš“ž]{ ZIþ£ÆQËSã—˜Æ?+S=Ú#›fUñ¸Ô9üVìõ1 Ó1‘áÿë ôÛEfzEËH`C´_+´Y¸…[AIÆL”ã[vbÙ;Ë©Zv6ÆÆ…rê×'p— ¦õë‡h€Ä‚T¡%Ö îß\.z‰óSmAz™6Ñ9‘ô%u§pÍŠa…KC¼OœÁcrg){¥²)ˆœn—|#ñ×i]yxæ £®—¿Œcî”øMKSRirµéÄ!mýÈ/ Éò{^G›&9L¬AÉÍ<Ì2€^ˆTM)ípÖ1•å‚·$ƒSzé‚”ŠŠ ¢ÝÇY­äË¢ÿu‘¤ÖÓ, w¾&ã²ÀÄÌtÅ»¢zöÃæ—ýL½ßN?óÕOånTº%TzÒX¬wÍ\cxÛè®YŸvŽk…Þ;ó1N ïýü4™ñº>ˆCÇ#›ìu¢N‰ü˜%§\øè÷Øs6[¹¸§f¾oŽû5BÀ™r5ƒ)Ì=ó€zò—Y Ȫ£?Ï¢, JwZ'ÈLŸÒ|zC4£Òü1Œ"]ó%{Vä+ º ¨:jfñ¿×‰¾ðÝhÀÈ{›ý—§ù-ž>¯Ë-Äù€üeQ ô\:бL}.¡ 쇒GÓÖ&|o½uä÷7SþÂDN>zQ6?7€Wù¶ÛHŒEnø´Ëó%“³³f¨^þq>AèuÃà’„ÁµGá5ó¼}¿ ïb«MÞËbüÀ{޽Íö?Àß÷–©÷qÞê0 †G1C4Û`[](+®-…dÚ^‹ÿ¬绥±Åq[ŠÁKŸ³ô½ ¾§´‰áùÛüû®"…ȰgèÂ̵ɥƒK0‹Þ_‚½êñi³uƒjæX¸6$I>Õ ¶Š¡‚Dà’Ø´OÒêóX9p|˜¨BP8êÖõ&"d—ö]@qcºo–’éQî! zPŠ4샱yä¡ð•xî ù8œ>ùž4‹Å™¢‚~AÒ¬;Ï;«Vøþou4ìyy 68j>¦˜ÚE¿¶ ÅÓ5ÜØKÙþÄ[½‘Bðõ½ŽYk%£wœÜШ+ŠüÇ‘zbÅ>â´ÕÝg­b±‡êÉþ–¢Lävs×ͽ•»øƒyh§ ˜^8üËØábÇe¼;8•øaâÆø@/#@K‰Çü­K˜”û‘ãL…c­cÓëx ¯v~ÁŒ*Îæ!5,üÅlØH5ØÓ—)›–3ä³Yµ½ÅC*™ü¨2 ÜF$á»<Û/±Š½\÷åN!e]òÿ<þDK•ÜÃj£0 gwÅTÇ%G¬%Î!«Ób’ÈXZb†È•):<4ÊûºA¥¯]^2Vlî˾>Üâ„«@ðž*‡Ó|þqe}õæÙ³Û×Ýb7™ÝÒ-²‘Xl½à$¢âx…£G'°cÁüæØQaÆÕV3XøEGâÚi#"€¹¸(ôÍV7yËúû^x2#V¹6GËÐ(ׄzFZì³9 4?Áˆn( ”lWª4Ë¿µwÃÓY½%À´‘€½Ç'8FsÈJŽ-åð•v¢AÓ2ü<7;2:~†Mjøq튜§hbWk’OJ6DOÒ<Ú‹N5¾Æ]*SÄê#oí‰%há 嵤ZÕö™Zâžu~tB¨ÀÿM¥{õôÜ LH’xf3Ë©7©‰Õ—j'n8ÛëÃ^õçWO‚±½#*LÃ%².¦Ù[úIIÍ!(õŸg>«TDÚÞ¼ú`Þ8#×üÓ\:/Ú?àÄøSËò€YGˆðêg29#MZòœK4ƒE=“/›ŽVà®ñwSÔ•m¼‹ ÜIV©÷k=ÅÄÚ %Ǽ¡Js´*Ò/(N — &^A0(@%%%d¾0@C]2' Âp,Å¥‡T¿ƒìv”\ŽíÊ:5ã¾]‡6˜¶§‚-*ö´k Vœðt‚æÂ$ä5PmH®ë¤J©ýGï@f2Cœ7S3ì$BÆV3ãÉéä&=7YI§«Wd´5D½«ay©Œ}z;³Fò -ÉÛÈŽ‰ï÷µő˕cêxöVJƒp&Ò…ž¸·Ð55‡sTD%=ùñ jÐÂÍ“€×—JÊÞYqÆÿ›DDôe¤Ÿ^ P½™1XbC +1R[™XeÝÒuýÁ€ÉÐ8ËHqž·›Mó¶{+„@tžk‹°ßȉ™À\™›øU°fFµª@‰>ã ò§¾âR÷,šÙ14&ÎÂúK-ûàGGÖþ®)±í¤¾ÂÑÃù'. º±°¨é€ ‘0A¤N!½®ýIñ“úpý_ªkk¾å‘LÊs’‡²Ïû÷­‹4î Ÿs´£;œ“x¦|Üo†ˆß@(ÚMÆÑ=wÞ—jNè‚ « Ãá4Eö•æ¢ê€ð`<Þ9×¶óâNVHÄ™«w) íP\Ý,ýôû+qB[ío&Œƒ!Ôø§Ó´÷Nf_#ëw~’ g¾7ðœçö9Ȳ|ßµ°áå6p¥_ɯWžEòz!ÈŽu©—þˆ[øt;ç÷/ÂRE\m™•¨µ#æÞn@â23áûm$aŸ×1Q¡´y~Fe5’d þ³§Yþ& ÛoŒ$þçÝBb¢2PMÁPF~dZÏë}qúæajÔÖEeK¶qt72'ñÚáCe—öŠ‘âʼz®oCyÒʨ³j!±à{1…iÁ÷÷s¬¼¨ªÕ(u:Ž úoÆênGQ}õ%úÉE%+z=‚ â§ß°·seÈÍý¬]ú¨Mÿé ØäöL?³U(_ÃH¶‘…šòGô¨¾ò­(§C¿`¾BÑ.Šº¦oÅž`ÊZM(Û¹6­ò=våiû?náU£-ItU±›Åí‚ƼÚ˼ÁU_ôYÒZ3³S.˜Ò!U@çï2¹ÎÂàtj:§kºÏ endstream endobj 120 0 obj << /Type /FontDescriptor /FontName /RNAFHO+URWPalladioL-Bold /Flags 4 /FontBBox [-152 -301 1000 935] /Ascent 708 /CapHeight 672 /Descent -266 /ItalicAngle 0 /StemV 123 /XHeight 471 /CharSet (/A/B/C/D/H/I/L/M/N/O/P/R/S/T/U/a/b/c/colon/d/e/eight/equal/f/fi/five/four/g/h/i/j/l/m/n/nine/o/one/p/period/plus/q/r/s/seven/six/t/three/two/u/v/x/y/z/zero) /FontFile 119 0 R >> endobj 121 0 obj << /Length1 1630 /Length2 6493 /Length3 0 /Length 7300 /Filter /FlateDecode >> stream xÚ­VeX”í¶FBJJ†îî–nDÎaf€af†é”î–Ai¤I) )Iú½÷¹¾³³Ì\ï³îµîu¯xŸëeg60âW#ì!ê8š_X@H`lhj„Á€`(B—_k¡0À-$NÀή‚„ÑP\ˆ†ÈL!`€*KKK°Tn>H¨£ÀuËÃÍËË÷/Ëo€½Ï?ÛHÔà¸}ð„Àn®8ú–âÿhÐN€¨<20×Ò×piè4 pò¶{Ð…‚ p„à€@`  ý]Jà–K Pnô6 â ‚¸ý†øn¤+…º}@QG$޾í€ÂA0ðo·vÄAnHÄ­‡ë-vKf€@¡Q $Ô ¸Íj ªþ—N´ý;7 z ·ž`ÈãwI°[š[ „ÂQ4Äý;—=†¢Ü`@ŸÛÜ·dnHè((Üñ_ øHˆ# †AP¨[š[îßÝùW€ÿQ=ÐÍ æó'ñÇ럠hæ @ ,r›„¾Íí…þ^-¸ ,ô—ìáöÌ‚üÓ ®ß;Ã}+FÀa>0Ä@P¾M àú¿MYà?7äÿÀˆÿ#þŒ÷ÿ7Ü¿Ïè¼Äÿß÷ùïÔê0˜>Ðò'ð{  ø}Ñ~ß4PÐÿŠºBa>ÿ.ê¿¤þ&û;ö·Üñv&üÒÒY¡(u¨7lEƒœ@Øm·þØá`…Cn§ú§¡~a!¡¿aOœ  øïö‹ÿAàà¿k¿Ô傿k¨›óþûÛõ¯Áí Ÿø¸AÿÈTþçá7“²2ÂàÇ/,)ཕ#,$) ø7Yÿ ÿë¬D#¡ÞK!!!aÀíÿ?~ÿ:YÿF B€ïß®Ú? ¿ay;á?oÿmáÿ8ÿYzÄ"˜F€dÜӳ2ÐuÔyýê–=]ÂXýáne¯žÕ :Ÿ¦G-KWÚýª h•¹nõù´ívõU›g}°‹ ÆÙ™ ù^𠀕»»l‘ã­$ïzˆ MQÆŽé3¿ý)Ý%l !“õ•ádž6¥¿î2Œ¾EâíŸq±zQ°º‚Ò(ÛH1î×mïp$or¾èïë<ÄéþJÏ››€Ï. ¤|±Íœ‚ö±CþxºÆ¹ô”DÕ4$âöž<ØuAa÷Z! µP†v ±$öm²K»r˜©ŸUøÌÁú‡¬x¶H8ùá#á¼#ÁêÄžß÷7Ô@W‘‹D£–³tõþ'—ìðzŽî:ªH¾âI—팴U8æ¢Pægm} –ýøQƒÙ^²sjscô͆ šu–¼kúý\«ßïñN\ƒŽå[iªóݦ|†z  JÎ5—y%„†T>ݣ͕ñ‡žÍ]Nœ–"¨¤ M}b7ÏîD²Ê:ïê´;¹&•ý÷žDîç8Ì@R™Îèw<ç……rÄÚ¾>´`Høžw2ÉGø“è(J=âœ<$üƒí>¼M†í@p½oÌjénÃ7^®FO¿ºù7¥‡hKâ¹Á#í6idab•χ‚/U´p›4<Ž[O:³§tµ,^Ï..®ZõáåBðë>»ì ±Á-ˆÇðÍËZ\NVÊŽt¼˜Q§%v&YžŠK…ï:-k7GË·Ÿê!9²¿‘&¯E<µ5ÒÅ,XÁÚ3¿iÍzBJèn*ÝSÑ,à»ê”4ÙeoÞuÚi¡Up‡9mª*ç6øKWÕ¡Ñ’ByÕóŠÜ«.B¦s‹)ø¯E»ÔR‡ÄîZ´¡¨­¸K+3°âZ4ºÊJó¼G=ìxÛ®Rqûž×ââY²"Îó7“Ù·)b'4µ7ý>ïË‘ÕW³ÂÆt—¨vðâ%Ú“¡õãOò›Wµî›ÌO¥qU*Å{¯Ud¿Õ8j6˜{K|÷Ëûà'£Ûå®^ÙîÉgÃù‰.c=UsÚ$­5 5(çÛû7YÒ9õµ:/KÜŒ1Olt?"ñª£\‡z&A¬‘î¾õö0”È7.òÊEâûCqF¸‚h&rQ}?ØêBµVrØB¥ö²zñÍ–Û›³î&ž»¾Q:»`HI°fš”À2¥á¢ý TaþB˜PÚÞc´ÅÂ0¯·1¥øwë^ß,’˜MVÒ±ñÐ-ݕ΄ГZ€ZFÚ«#%¯J‘Cñé¢Üߊ£Ëe^ôEž` FÂ&GmÀô÷UÑ]‰@•¶»·íDèi2‰Ù||4­_à "ùBƒ¥9ûY«”P'ˆi÷Ó×…°ÕšY.#“¢VwJtœÇNvx?É6g/­ö4~E¸¯“ê,Ø?“Z.«‡Û&G°Ï˜«ÛO€ßñ²TŸ(¬­Ãx=@ì' Ÿˆ¯ÀrT”0Y³¾½mþˆ²f½Eîü›WêNÍ ˜L³¤ú9û»?‘è:ûåñ™kiNRaI,[Úq;—²HßùÍ9[æK òy¯*„Ë0s{b'¬Ê Øø‰ŒU–¾~\˜1f÷gbûzµTr|§Ú&.í2Ï‘Þ.Z€Ž„@ó+†ôGÈ !yÑOÑ/šDƒ#tj±ê2„8£ÞéµÒ‘`ŒóªÈbL+uÈJö /ÍðzjøÖiw0wÇ´B¾ãÜ‘®ª÷‘‚nìSÜÊmúšæ² ß­Qš›S^Ò`>¸š`¾àæúUð+Ó ™o3‚zµø* ò[Çú$ZÇ.óK}5Ú±¤0• «ä$ë¼wÌÚ±SùUóD‰kîÛT<5÷DCˆ¢ÒAÄ¢Cg#$¡ÀЧ.Av=6A„{3ÊùŠñ'ª|Ü$•Å&ä4ˆ´šõ¸œ_^ä‘DôëyÕQµ18“n÷+7®[V$uP n±Ê¶¦”¹ ´Ëäbj`îǨ|¯²Ó, ¦û,â¼ÂPbÄï¶Ä¹;~Žc‚{l AÄ^—¥îÓR“¢%ôG|ÁúiQ¯º¹m_aRáöä¥Tá4õ©¹j*ÈqÑ<wi©Ñz`V¿×cW[|t>-ë‘9Ī]±9Ù¼F>¬=@ -ñÎ@<ôe¬L!'¼Ìg]¥óÌ`ú‰¨CrÑàŽÑþwvUÊÄGŽ%‚)IZCìöƒ¥D3Y<½µïseæ/u~ó% ¢sþ3ÞR!›Ã,ÞÊSËš1fþ¥„I9’än(¤sNg¨ëŸ6Èn×þªv=<ñRŸJ¹Ž¡Ø™âa˜kÝúðé"ü_ßÞ~­"˜µy³®Àµ×àøLA¬‘¼óÃÕðýœ)_1É|ν7™ç¨…Àžu]Lë–ʘÝÏ´#³BðU«¯ªûŒ=6Ò‰~Ö Àè¢0,1)ÊyY} “s,M>ÎOˆá NK\x]ŠlCKýÑwÖᑉ8Dœ%pÑ:JÀQ'&céeGpm1[ž¦½<¶q#Tæ©û#û¼ËŸGŽdŒÀ!F"¡á‚þ£I¬ý´ä9µÈºA)y倢]knßzR•„Ì—£sQî+næCÂþÝ#üË|¡ÙR/G~ÍRàœ%DíÍ÷>Äö­”©›ðvØÜˆ>,¨U#7NPoSú*È( (Hs*Oä×K°-œ,ùç–³o,R@e6ý‹øâŠ~–ºFS· °:Ï53 kž C’6¿?ò²µV/Íy É,„’³|­b8ÃÖœÅ?JQÞom€ûmµdH5£©Ð#>Aq ¬208FþÀÐåœ\_̤’E÷Î ’òïÔ“ótœw¯;"lw-Æîy嬅íÔ(°•[cH^?ß®ÀìÅif>g&Ž>ä{vÞæ–⇠¹3Ç ð§^bµŒmÜ 'Ѫv¯c¾óeDÂ/ml±P’$u‘f33(¼(©©¸ÊTD"¥µ§ý¥Hñ×WL­Þà©‘f቟Ãùø6Ä{¯_ß+ábÅ2¼‰WJaèôªÞ¿'«ƒÁ¸'’wÐ Iåœ$ ¬YÎô«Äù i£LìÙs°ÙÐã=xºÆRqÊúdðü‰EêëÐyýÒ1u¸‡“^Ûs•V£‰]“HØí7k™²^šÀ‹†!zcU„„&vÒ¥) ÉôôKæiAø˜‚Ÿ¸fȯÜÈî¾XÙ¦ÛEà  èšáû¼7âÝòãgªåf 4ž¤vÖØP˜·µ¿§Ð€ü  ºa{Ô­F 8ï|ïU幉ÃØMÛg£èì–óÀO­Žú´aݸƒWIá ½ƒ>5®Ê˜²ËËŽýF¢Ó£W°°—Úe[Ú®‘eRC0Ñ*Àå¼8Nï3îy ¡×ü¤Ì¹£ÉŸî*Dnœ™æ‰TwZK6§m÷X6Rí³ä…š]õ‡»œÕÖ™Rô€Zx]zS`3ÆÅˆ8ßidSh_õêðâ¿èòsÂ1ÔveãÊ;h"øQubawÿ¸ãMŽËµ ÇÏMUabÁêîëoÒJ©Ì±°Ê©-Sœí$åÉÞÔÃ-´°¤£——¾áV‰®,Qæ[b-Φ)òBÒ …«ë± C[ì‘O\ªMÛ8ØS‡+ÞÎl}Æî”jÇw±f©%+fƒ’ÞÇ”8hï° 9ÓÉû26qm2—óͧ~äý¼¼Û4dÞfÆHñÝžžu$šM­Èû:Å£8~Xûhï\íð@nU¼Íã”4Ò=¤¿uàS!“§eÎrÅIãN Àºå{ϧqÀ¦MtÄ}}Y«¹„ïuÙòv£äô™ÛÆß £žÆÕÉ»]l$”QÝ!QÝ+Þ¸Ëg"/¼yÙêñUhäð#bßïU?‡«Fñi¢ÿå‡`/´Íâ~–3‡ô\€W!Ö'ùÁ¦r3SkF:?R¢ë4v‚›‡Qà‹X+Ü-,Ÿ(ÿ:ý쥆á„vZ0“F¾­Ö{ÈrÑ7ñ ¡Û©…®ç ,4J`Æö'’ÎöCQÕ&O€Þc{n5 C‹÷°TmF¼áõØÙÃô–$kÛmö3‹Ñjq‡ÇSGwû[~Ù$Íe÷¦m+6.el,h}cJŠX! ŸŽKä6&õjö”D–;téi~V4¿ÃªxyâAȯJ›È0н QŠåð$œöÃT\§ITíñ“¨Ew¦¯lwwž è‰=\)¯«ê^¨~íвÍìZ®¨Ý¶J´í烰;ã§ÚðDMt;Uj^Ò^Pvžì-;šÇÓ'äof;\§=ö•ZB˜9¿ªÑv$ÖjtPß"Þ¯r–múø)Íûš€ÿR¸µ4j¬xÏœC±@ÿA&'½™õ)‚¥V¿Ï$Ô]‹ýáˆHƒÞŸ%Úl÷¸ûdWU€Bš^:nŽÕÒ·^f/^Ežúàà!8yÈa±à¦UËë.¶Î˜Oì&0Çê§ï§INl>w竳Ouå ÖÀb÷o˜* ?š’ò´¿4E ì äƒúw Ò¯`¢T©—{ëGÑr|…+Å^ŽH—O& ßI/(“^Šôc>+§Ñ÷³.ßûùT* ™÷}Étd|| h£H)¿b.Àž½[G¨Õ¸bv” Ìeõ?b\+0Ó4›^K¬ËÙGš hу =l2 –P3uç}‹ø‚ùfƒ,4œcý–´†–ŸdSg“É’ežNÛa(1ÚŠÎØRbmœŠû¼oÄÆôq»RyÅ?í>và@_¯¹[C3.])¤°Êâú—4«è3Ê.ýEè=õžþäèã,©ÇjRFNÔÒq]BËœ·0>¿ð/ùÑ1:Ÿ;2r¡ë¦ No _Hk‰gX­h9Óÿä‘F8\lLÃÁ7ñC›»r–Ygàx|Í­^”(˜©ÌY„ROzôúÛþ6å‹Gwæiǘ}9mÉó¨8qzg?ÄF#•}5F!}¦Ï«—2—jÜ&\߇:0mm]‰ReU?+ɧ1–M17Ëš¬¨éüNâϰ¬•r÷MtXbêu.–ø©%Žr «¡RÀ Ÿ(}˜€l6ÏÈЛzfY@ÝN'ï»üµ€Õ¥ÿ|ë¤Z™žY¥yÇöNý×,7ÚŽ¿,­XxÛX¬VCðPÎéÉ‹Ã婺@žšü‰ô‘Ä©«V¸òDTߦ@šyÃÝ,oÚ46;UÂútu{Ç^è Lo\o©|"Sz}hw,;ëQÖšCœY¢Å¥ƒ¢l×÷qô,֥ČPN)_²ÿ]× Öªx]Á¥Éć—Y“\s¼›øJÃ^ß3"—‹í͵’ó\Xó©evî^¹%Ù i¹Ñ>‚ÇaŽ· -ʹ|û k{ßËêF)I})·_•?c´Z˜bë]CvveÍÈ?‡âÙ÷ (~Ä–äR„ˆ+éÔO òN£seÊÖ£„i.ùWѨðç“Ç[Î6³y¬eYGÝõ/Ï}dx¹A\¨«&ññ[ü&`QpJž–?÷~,N¶ÜÙÝÞVöüeÆDöûi<»†û®kžFššxtìÁæ_9}‹6V™OÇ:Î2p ©+H ØÄ+*¬Ä°ÃÔÅÙ~ýÌU9ì=N‹:µ)™ØæJ_4н¬s¨ÿ€•=‹öÂèÊf6¸ÉSNMÁC^«å½Òÿ²@Ù¡BBŸþv³ÃÁ«c…ÛÞ ÂÄ %HQKUs½ë˜ËÐ ºNà¶7W'Ê–Å­Yº—±«ˆécqó)FËoÛ{eXFq¥Øs­8Ú Ý»i½½¥ÎÛ×?+†HJÛÚIÐ`‰6ϱРñ¶yX*üíx—ëŠås¬ï|*k¯»½[5I•8 yí’YdÀAúê«ñ«ê’è/K½IÑZ‡¹ßïvç¯wPçÊã_¤¹«Z£.Zd|É$^ŽFjø<$œ¡¥ÅŽàúØH5è/ŒœÍi¾(u¿ÓšÊ¯^úÑ»ûyOÞ…3ä~¹ðøÎœvÊ—î+¡¨²¼ž$ë]û‘IpØ0~¦ùðcŽ Û—¦½£,V$sþ„“’ŒùÏ,ÖãU9dI`…f?ä’†ª~/ûz^b?QCé0·Í6H’;ºœÌtw ‰›§>ŸyëødÔ{W´øÓȵôî¢Vå/Ø÷íô€“ µÅCöŸIÖîGÔeÚ„=#Ý~ô9wŒ:qñf=(?Àï÷”çð«ÃÑ”S.õ?q "ÄòdÔ1\0 ibýÒ1±nêŸ+iê,lZîÌN7:¿}Œ}CØÂäì{òŽÄßË©Ô/‚Á¶'ê)•xÅGΠZsëùËŽæî‹òÓ·û®ž¡Ÿù÷«6Ñʳk:"Áý2aoJ]È}B›Î— ù†ˆ=r„š}ØïVniwŒtà 3 N’*.#K&Ä1Ž5îqƼSÈs‰ðÎ"þxcm{Õ2TÇ‘J¹ÃÀE¤PeOÞÓØÕ/ù›ÔÃ3µ÷PØZÑ¶à°æ›ÒgúÏš¢”ÏÒx‡R9§ä­Êr÷åµÐõмȅ·ØÌþö ¾pæJ—„A‹§¬ ÂPÈA^̬áJ*51½±ž™h¨ÍuÉÉÒU٨ņœ¥Ë惊©®ÝBãòpF`Aà‰Ü{Uìd~r”DéûÝyk`Zzб¨$F‰ó=Jd+“'PäH*ɸN‹ÔäG]"wŠ©6Jvmi·éc¡/˪IÔ<0Mű.™¢ýYn ï’‚ŠÆ Éu™üôçõÄÅñ9Ûß<¥ò…r_Î)‚¿‘ÖG¢ÉË-d‹_Ñs/TnYFÚÔ~ÅÇ6Ö\…¤™í¥Þ í{·¾X›Aþ<¹eè-ã¶‘h—˜Õ ”©œ·Ÿ×ØóR#ˆW"gÞ{í‰ÉÂd¬)E-ÀNÖ¤<Ø÷çFjr§¥žgï d×Âávy×>›ÙR‡ï@m–››¹ÎbsL Cý E„ð´Âxɺù ÎK 3JÒWÜu×ùÔ‘éJc0P3áýî2SžGì`óäÕà¦^7ëxVQ¸GA˜IJS…È¡‹R¨r@ò ÞŒ hâðC’")OyÐ,ûè®U–ÉNùZº• íGÜLI!™Å)ê údÚE#™ÜG’6¾}_fqͳ4$«ý„Ÿ ɨ¾³ýu-%µHô™a‘<›mÕþ¡G)![ﮞcÕ?Ó’{e¸74SXë,½'7X6©¡8Ê”z¹¢×¿ÿÄqÑ›ÛV¦Ê3<ëµõPéÂéʉÇnŽÌ#¾NÂäTHx`{JAÝ>IÉ}ùÒÈsìDZ¾–!æóûZ#n> ýþ]ƒ!¶p¹,. ßî3z†U‚æ&JǑƹÒé뱆„ÀäÇ…µñè“6†Œ’Ù;¨éqíó•¾™ÙÊöÛFIâ©¢04"3{‘<„cí­‰Œ˜Šò8¹÷æQÓ»RW¬”5«ãïÔ¿Ê PX‹§ñ+6g-òÄa%uS9?T32Ši¡Rëfº!~fL³ ½(×jŸI}ÉЙð=2ç ˆ©-†øÍTWú`óT=αÐ~ÈF‚E…T5Ò˜=±®ð±<=@‘ÁÂo,ßà,,Ê‚/ ÒÓ=ÁšøSžÀ=˜¾{FNá!ÙKëœ_‹;Üçm×-æÚ'tï$©_Ò.£»IÃÛ™:q™‘Ç(c±ØŒ¸zò%ÞjB†)L²¨æC¥±¶ÿ*'³| endstream endobj 122 0 obj << /Type /FontDescriptor /FontName /YQQGFY+URWPalladioL-BoldItal /Flags 4 /FontBBox [-170 -300 1073 935] /Ascent 728 /CapHeight 669 /Descent -256 /ItalicAngle -9 /StemV 114 /XHeight 469 /CharSet (/I/O/P/T/i/s) /FontFile 121 0 R >> endobj 123 0 obj << /Length1 1616 /Length2 22753 /Length3 0 /Length 23591 /Filter /FlateDecode >> stream xÚ¬·ct¥m°&wlsǶݱmsÇV'³cÛfǶmÛ¶;N¾~ß3gά3ók¾ù±×z¯ºª®ª{­MN¬¨B/djo ··s¡gf`â¨)k(ÙØ™ZÚËÒ+ÛÛþšÙaÉÉEœ€F.–öv¢F.@€Ð 4°°˜¹¹¹aÉ"öN–æ.ª¿Ô´´tÿeù'`ìñŸž¿7-Íí?Ü€6ö¶@;—¿ÿ×U€@€‹`fiˆ((jIÉK¨$äÕ@; “‘ @ÑÕØÆÒ ki´sRÌì6ÿq˜ØÛ™ZþSš3Ã_,!g€ÀÙhbù÷ÐÝèð‹àt²µtvþû °t˜;Ù¹üí‹=ÀÒÎÄÆÕôíföÿrp²ÿaû×÷LÑÞÙÅÙÄÉÒÁð7«¢¨øðt±0rù'·³å_7ÀÞìo¤©½‰ë?%ýëû ó×ëbdiç pº»ü“Ë0µtv°1òø›û/˜ƒ“å¿4\-íÌÿ‹À hnädjtvþ óûŸîüW€ÿ¥z#oÛÿõ?9Xº8mÌ`™Yþæ4qù›ÛÜÒ–ñŸQ‘²3³03ý‡ÝÔÕá?}n@§DõÏÌPÿ%adjogã0šÁ2ÊÛ»üM  ú¿S™áÿÈÿ$þ"ðÿyÿÿ‰ûß5ú_–øÿï>ÿwhqWy#[à¿—ÿùÆdÿ<2vÿ[´‘­¥Çÿ)þ¿GjÿƒäÿFÊÅèo+„ìÌÿÊÁÄÀôFKgqKw ©¢¥‹‰ÀÌÈæoŸþµ«Ù™l,í€õü·•zf&¦ÿæSµ°4±¶û§ñìÿáÚ™þwî%ú—9£ºŠ’–íÿþ¦þ§øW{U‡¿ÔþG)rö¦ÿóðа°½;À“ž™ƒ@ÏÂÅúwåX˜Ül¬Þÿ‡Œÿ1ÿ×YÎÈÅÉÒ ó·l&æ‹ÿ¿ÿ:éý71;{Ó¦EÅÅÈÎôï€ýOÃ?nW'§¿ºþ»ó‹þÏ󿣺M`W—ìMxƒ¬R3Ò\j°r†&Duúz˜Á‡‚JêU óýªì»}SCw¸+ ß«ƒ¦x>[=Ï>¤iGz0m(»“WyøÞ¤Ô½ù(›휴‡Œú%iç‘ž× ²ÛÚLꇻJÊúÅïPSí¬NÐ×OÔ~¤nù~èd}LRêb0:@Pk ÎÎ)NžþPŒ vßBöàÑfÇÀóaù$'ºx:=Ô›|B¾º±Ç>Ç1vh”µ¦ý¼Šª#5ßö2ßù;޳¥¢R#ÝÁª,!o×KI8“K5÷·gŒõ]IÂ(syp8ù³v2ΕsàyhþÅ×5gÛ0?¸$YŸÅTÞÌiÆI¢hÄyOíÍÝ׊9¼.¬ :›'tA˜¸ÇHªÍ ×NéQ ÄÒ(^ po¦3„M©j#ÿˆìÌׯ…v$['JŸS©›†ëÂk†Tê3Õ¬qMW§›‰')'7ˆÝC`üA\œô…aµ­šøfôRÙ±‰(}ü=h/HÑQ§›ÏŠFØìέ®‹æ§-¢ùeÁœžô÷t:R(§BÒ5+;ÕKd·Çæ9ŸØúëÐÆJm©33@3túáÚÉ ó” ‰&fÞ>}¯ÇÝÑ¿eóÆ“àÚžy…¹ÂOò‹ª÷à) ²³9t?v:y!?*IçàÀí.íWg'¾eÒ5ömv‹ˆ 4’Ô½«éRü ÿGšó÷zÌg¥O÷B—@6´~aB…¦×ý`FROPj è儲¨Œ¬^9RYé.éä#Äî.ô@Æ3”b4Xaù †Et×· ‡Eé¬(èžât¼ XÏì!”Î,ôn£™\Þkâ$I[¤Œ.wú‰(Ô7Ý¡s`¿ËXo#zŸìô¬48àÏÖÑI°¦x™ï]-$¼gêðQYU[ºˆ‚4õXÅ5ö¡Q¹ÞØ»SÛAþËaì^í]±1}u{Å@g7u³˜•¶7YC!dx¾€A½íxJ¡5!y]_OU)!ï#= ¿ìö˜Z¹†ÕºÅ÷~[I‹~Ô“N 6PÛ–HåûùrÌhfl:²Ûîþkï¦ÿ¥ +¼ñõ½´"5=k þnß­!Æ^­»îèV ^G×[Ó­OÔ©]<ØÎM¬¼W”ûC‹'5Ý]è<×Ah||0¡_ɱ3s†nç´ÆLb=,óúYÂÜvøw[Õc–¸*VcíÅw‘Ë'î’iÂÙÝ1ð€2ó†,÷ SIûí£_ _¹ñiSÓobGàï?—¢Úr3ö£¦Â"ÅÎäîÂà“d¾eÌ¥8µÚ™C[¨¬‡¥¾ŒïH0šâÿ1ƒu¥>´NµÃ̹î)XI‰‘òÓk8%3¡Æ%S·Yü¡€W‰\†íŲJ a‰v]’ˆzjÉׯ€È¡¼ée@6äÔ·Ù(à ÔKÛÕ‰À̺X×oaWO{ý3ÞaèFÜ妗êrYžs[eš"‘@F‚Ë2+½H\Ðã!õ=-L£¿(À¿œ)ç’uŠº‚:ÀÞ3|·*<­ #^â™,Žg<̦=ÚÚï ¸FG7Š\ò«¨\©9³zc´·hÎè–äkÝ•\¢¾¥ÄìVy*ÀIZý7ÄïÈW†ÎÝXðâ˜QÈî€,b‹É>Ï »f6S×rfä|+þôcU¥‹÷’óÈ$¹ä–£Og©&bLè`*ˆa–o;gÇí²Ó¸Ç1r¯þúDœ@îÊsœVNd Út¾ÄDðzÚú ¬[\Ëcëâ!ýlDZjm¬Åµ·´’†Æâõ‘ ŽWäŽÈÊkÉmH𢦂³nåŠ+ø¼ö[2cŒNè2ä£ËPЮ‰\N0;“÷àd—@zöWI¬Ë9ôÏx¨ÓÂ5½¸ú¬þL‡HŒÅ¹‚›ÕépÆé2°ò7|R´þ;az…Ø|hySFD$0¾‹Ps36~U8åf*yB’\¯@4Ò1¼ÅTòqÈi¹†P3,Î lCz¡£HÂFpŸ 4dVHÕá_góA˜ççéðGU"G¶7±äoì‰ä·¶2$n~þûE••Cë¬Dжn£Ø QUS,ømwäå†j·”¥N5N¢?}—»l«wïç&ÞƒÓŒXfû‰+¾.àó‹Qd?ž7߆OaÕ@0gFb53}ßsìœòK–>RŠú×õRH?;)šé¿yž–cžx’»Öì©ëê\Bx‹üšøeT÷ºÿg ‰¾¦3=‘_`¸¬I¦ÒqæÆ•Œx0>!J»“€|tq£ svƒÈ›Ò²íî½8“Ó{+|8ÉÒVV"Kú÷üóܘ¦ ¹åœŠs¶~mš®wHF)2BÌ.ujkGèž0.v€–U;x¡ÀQ.~€Á,P÷gä¬&¿ïTŒnpc¯¼µa£$oôÇuÀøWJ5Çãøm6‰ ÃD,U µ£.¼È´/VEò)ÕäšÂÅýX6°m§Y͸|a¡Îç¾cŸ3Óð£ñ¼|MiåÊÃÙ:nž-Í`bÉúpOlêCk‰C’5âî.wšBeI‘VÈk^+!nÖr‹µ¼ädà aÕ·ÓŠãÍ£q‚¾(ïÝ ‹4keC=ªõ¦ 5Úܾ‰@IW\xÂáDVJeÕèV.!Ôw äØð· ß7ñ­C7·J”@©ø`£µ„*âN%¿•}/Gµ…êõ@¶Tö ñ“Ëw]z>#~{ A™ûÀ$¥v–`¦[ëµÉ5IIÑY½É’ ÷˜ºhJbå±E©SJ¢!B+«rbo'w2ÁqÖ¯xìˆÑÔsìáF7åøãbg¡° -Ýçñ(ü¸¡cx„7½y÷¹TOh5î¾Úy0†$•dÝÍÔU/ÈB`ŠvF—𧇩=;ÔMo€Ãû”aP¢ËèÚ¶×áG7¾/dÓ‰¢ÔIÈZ¡æ[@Ëê™õñ2¡¤jèCâ~ûÀüôlyZ—#Øç~V"ò»ì·‹ø+uiçCæ$pö¯Mï/ñíÓa83]žy°â³}e€DÕÌî£ç%4v>Õ›$TOÂéù#oÎb]xK~Üe·ß}‚˜gœ”¦‰˜ Å4s²ºät}t6É#›÷>}|6cK‘û¢PšlŸ&îe6«ê«UI,0]]öBJÜ%s#ÙO–žS;¶‡C4ë§x6þ†$ýˆ¶"4ÔÉ <Ø3ˆáfpŒË–¤,v%›1[$ÕîYºÚ:/º Ÿ,ßøø½”2§•€æ.׋s 3»Õ¸¢x~Çþަ[Âw•ÃYžö_›¢¨7c*™mÒ`I²uæJvO—QŒØ¶y…@¸Äê=×ÃÇBØA»v¾ì ŶÚù€©>'XKt‰qð> Ò>IcñùÛ@0ªŽTgÊvk,M«Úsæ€áÄOB!9}!Ù¦¬5㢼ÐêÛêC¢ºÙ l‹Í‰.&ЦåÏ?ð efÆ„{®HïÖ¨ü<Í«wб7%TL¢RhJü ¥Šk[•ÜrÐï~ºé©¥‚”ÍÉ,?%7?-þ|®E:Œ¾ßŸí„5§uðÛHC¡è©^Ñò÷¸•tÆÿ¡¯- s½„¼C»“ÐÒ±'ÇûÜÎ[) ú¿!‘H ñ0ŒÔ ò JQO X ReåVï9ZÝÏÂá‚ÁÅñ>3²ždÚfï™ùh\ùeõûlÓ/ùxBÖ<±8HST*ç·ž´¯[_{àcG0i¦¶ÐIïkª'Éþ/fG3›¾ª~ût>½SI™búÛ½o*É¡™…fÔNú1f_rï: ÌðÉ£C©Æ2 é¬p)ÔšÓ¯Á³XÚIâ¶ yª´.Ë%s¸PÖÞ`¼úŒœ–ŒC?}O²ñ³Á³Q‚ŠU0¢gM≕õQdR{š§uß=ýPl„¯‡±r»{%De\àÎŒYÉž e{œ¦N£F˜´’À–]ä,ùYiƒ‰ SXO嫈2¶¶[ž½£eòÄ’Óìˆ.E4ñk3ÉlÍÎể NrŽ÷ ¼H[¶Î½jwqf!²åÁ¥_).2°¦‚7fZ~ÒîïO³©à}0Ï%mVø[ÐÒ'#*qè™æ&ëq¹Íu"ÉC–E;Ãjö¬mpZ¥Bb«rqÝ\=kzƒe-ª  GTø.ÈÇù²=¹øo™h{ !Ùh¼dìc½„m˜ÃXAûNU‰KË\X¤(‚lvF¹Q ñŸIÂiw3Ò)QÐÕ‹´- ê±1ÛdÅF+!ó ¦Ê¥ê ñbá%¨VñIÉÄwCü €x8‚c§ºJˆÏm§bå6ðÅz\d=ïÂ:¢|=Ö J~‡jßßw.Ýó~² V·ïþ˜‹ûA‘Qh[ù]I³!6:”ksÒÍz5Ü äòk­ùú© Z™„Fþ1%ü/#âÌÑasO‰.avqÊê0ö˜±!fDP~?¸£Ò 3.Óì<6öé‹ÎøQ·c‚xô.è_FH>dÅ-Æ N±7Ik’4¢å([gW åÞ:Öôeö‡ ’ùƒ'Ä=n¿Š ,xXGz Ø…ðcBÁælðe¢d›ö +˼Üp`q¸rUaö#¢á/r·È–8æ£Z.ô6'§¿½Eå“RNôT=u#aunÃjÒI…6hõŒ©I¹–BèÞ4˜ê?Ä¢"Vº15WlsZsÊ÷×dŠ ROÇì¢1:÷š¼ejì»™ç /³î3ûªõ¡e†>™Ø¿¡hD]/æd}Ö¶l@†ßã ×K¨åY*Ø #ýBʮִIž$Øcº½pñõÁ©ðš[UÙÓ:ëA3¿¡ »…¡) ‹9yêôM¥£÷ßc>®‘IøéI^ÜŤèwòžžxypºœ»•(ÍBÙô;7ŠD’5Óû¨yÉUŸÿ‹ŽDR”ø<ý€'ú¾Ï0CYòEF‚\í‡-=t%9=éÓєߵnß‚O–Ä}ÈÕŸ1”–Ø„køô}Ø;ybÊ×?MBB£øÆ9Q U‡úõh§ÙUÞD¬LVæà1¿»÷9|¸S{ïšA›_Æž²p!›´ÖNWùZøý?þ¤q'—F2Æ<-•JŠ:?ÝŠ¸6–9WwÜ›0Uðá›i†zÏZoaúmâòhêtHó kl,!KÑFpÅ W5oûò%_†ªtlÎiiøhØ£Äìd¿<æ2ü¤“«xÅL*&—e°ºÃS°ªóÿŒU6†ŸîϤ3܈ /á ÃUµeñFÙ;¤x¼Uµ]fÈŒ‘àå3%3„§ß”§òhl³¶ÏÂYsQÅ)]P&ÙuáД¤UA?êçâ^»Ÿãó£zÞ“3ÊK ­ê&|Áº'Z\êÅp¶’(ij.¥JŠÞM`ÄqŒ§‘Ý MƒÑY/Oiânqf£L9®‚ËŸ8È^&±¹Ø×²ÂrŽêz’Fǧ$•{²Ûò ™µ*ùKë„ì¥1å­u+‘‹|ê_”cŒžÐ‚-¬]»{DŒ!IQMÏjFØ2þvºû«é[ˆ†U–Á^™ØÌ·¥ãKÛÐ9W¦¾vÆÊÁzé-(Ñžå¹·&þ]ñÝß0 ‚'¡dij¹i씇KÍ\Ê×a‡NtèÍ[˧å':H›“̇³ºhãÊ›rçiËZÝ‘:ƒyƒzÓê&¸ÒôÚ7úù¡å`°ÕàÔÞs33¦>ÂP»êž‹aCó¬E¡%^ ¾ ¯Ð\bÄñ«*Dgñô ”+6Ä•“ ŒµcX¿1¶j:¦§Eì2Êmœ*&‹ ¨ßô¾ ¥ëkц²Êð71BÖ+%_o—fĵ¬ÅYôF ),š1b_Rƒ!‚¶Íºòš‚Ó’¨ºÞ#R0^xqoÝ_QÀ1'tax7|潕Ê<|â’(Àû1þð&8 /­¶Îå¿ÜëúŠÑIW²3¨ÉçØ(M~ÿÓù‚&KÓd?{ŽVÈÈ)¡è^›f•<Ï“|™ÝŽ€­¢(q­ÙÌ‹‘®?€Ø=ü2 á‡ÁóÅ™ò„Uñg{…mà„beÌ‘ÝÆ´ýä«:¾"5\ä±a¨áæ!îK•O c ¯#3$lmR‚Úýž'Eok Â1üí©1í%LQL¾ßº’ÅzÆêž_£š‰ƒ864»Ùc%kèbš}Ö?y/0€§HÖ’eöÜå3>Rü(™ {Aœ>¢ÊíFÆ–è-=Mr¡±€8m=jW8-f׺œ ÓKŽæZ¡A¸J&äo±ðT\SipM+þ@/éT÷ÍvÙQÈé)j«Ò>—p#‡{òÊ/†]Ö§¹;S¹RÝx‡¤VëÕI¢ZH3å']zš¹dŠe èÌÙ1c¬-­h*ÂFˆõ”÷¨º¿®ùÎ{ðE*‹èáªrͯ¥ŠÀ°¼ÇËcGæ3¹&Û,^¾¶mw°ÐòjM°ïŸIÛóWqym ±– Îô ‡¨fò\FØæÎ`<‘˜nç•kqÔ7ÊS¤’Ðá"¶}¿%M‚÷o:ØI‚ôª‹‰›·ÙLk'ê`¸ÎÙy1ZÝõ{©Eg%ß’³§¨¼­¡EŠ/q¿/×þ±EXã†ÿÀceRjJ(uÎæÄÚ”=#^iÏþYâù(ke{‘¥g–§‘Õ1ÄŸLkað¬ {Tà”nžöáa¨M/x½JÔïi´U&tÁŽ#ìÇ+×±Û5Inƒ@{g¹Ím?ñ+ý:f¢çe,“„÷¦ŒDƒYÇ¿Ù[ñ94•‰%[!é„Ù­I21\ÕÓ{°øÁ”X–²êí%Éß"©5¿éäì~O&ê6ø^ºk%7¸d‹œ§ŽA ŠÜAì:ü;±{ù(É‹¸3ëq<¹á·k¶foŽᢸ­ä˜AgisÙf»<ÃÒwL‚§LÉ2ÏôV&‘Â’É»øš5‘±¨ÛYXù>V¼Â ééÉ6Z¶:Ôìà’ˆKý)´S÷;Kù‚å߆æ›Ítöá«æFŽrï|¢¨È#ûl¾-Y+ ìÔ(¥‡`džÊ"£oZc`œã.ñà´}™?p0ðqiƒ!™ƒ«l*uK ìûaŸYäj”5×®še®ðGGng{ÙÒ´eÐRa%æM$‡9áhM_{)ìßAwLz›åQ"­c¤â‚Å5—¶ì’!z¿vö½8²UhÙKs/è$Ÿ³³ÞˆE`¬%?MnméЈ¶0Ôêb>•á6öO ÞJøÎ9¯[ã·• ¼˜ KË#}Ũ¼ÔèªÒFñëвÂ[t÷÷nε^ÃyÂ-ŽÞ+ Ô#+—ê]efÍ=“fÌ–ŽäiК/)û߇„o¡/×ñôÎTË–„é¬`œj-¬ÌæKè¥X xEzGß.gf}«–\»C—wŸ¿8§„²P³ÃAž÷œÂ?s¢’#W¶N¨_ P¼Žã;;¬@ÂfPjÀo#¸Þ¾,çßÅpñk¬ ?I QçÿøÞ–ÿÊð!N$Ľ°ö#€•(¸¶ˆvøÍöó(æ»z–ÙŸçXnËþ•’7šØ|ÛG E!~­øº2&»„ûÎ/’£"7—5®éá/°™9›v!–¾xöÍdkT†{ásÍ©Ê ”ïh×Vìhi*‚ÅÔ íÎÉ[/ŒÁk6µ3 ¢‹#ÄÛz”ÅÁmöòº# ÷Š´ô 6¡-`Œ ñœd×–`ZI}ù/r`ŠŸ<6/Šâœ!rý2D{WeWɧ¥Žž™#µeÄÊžëð·iÍ+4®»¾Ê.ÉÖ`Õ2IX0":ù–mynË?›œzZ*18s‘¼==ƒz|¯á"‚Ë^9X?hX4Ð ‚¦Jô+›¼Â`+UÒÿ8_±õ^ƒx'ƒÝ£(M9qI•L4Ó[ Èæby¸V5M¿ÆD›øVhø êúñbžÛ ¤`š¶Í:¬{"£6…Øt 6o^É6<ÙÀfñüÛK¨£*Ì?WcTWyêéEõ¿kK`! :p¡šõLY3œ•uâ9†ÕSÔô¬=‹µðšØñlOšÒ¯l:EÀ?Äžæ™ZÅ—IÞ^h¹ÍÐÂã,ó5aÅÔV…óÁù†ˆÉ(¥jUóo¨,Šƒ¸¨iñ7OlïJ˜ÞGrC’cP ß/¤#=ç9ò£•|§hß\•óðOË:BÒéõ. ©ÂÂ"’}XQ^PQõè#y¬ãoÚRäsZëè,Œ ¼Då,ó »Å;jf¤ý~=ð‡‘ 3Ãp³í§bgÁy% ^äZ†¥¨yŒjvŸ\4WË(>[„£¯ðÛªßòa§TSß4 ª»JŸk õOÂÑ­ %‹·ûÈ*·˜£q{Ï ¶Ü}ô(³A›.Ç#­õ·ê%XBÃçõï<ëšZ33Øâغ׎h›„bY_ªt¾R õÀÏÖÅ .%úïï¿ÝÅ}‰gâÊÔÄSÕ;Ï9ȱÒ{Ä 'z¿¡ Lð2–¹%ê«Ç³*¶ÿ†šB»õLö†ƒ-×Ëoj+¦«¡ºE…Qq$éî˜_úN‡ç&, °ë0eØ*Ìë^˜œñKš¡¡kMD ¤Å$–Æå`_ÖñÓQ`£kZÉÏ´nÔº€MÞ[^(ð<gKAH Û±/wz$4â—=&Œ=!õñ ¶ÿï.$”Nˆ„ s#Oi&n›ë}I1'.‡¡#“j'ôk>šHÎÀŽ­§Q[:9ãîžd p_fH:tñ1³¤âo“ïl²{»ûЇբˆnl_žR&ºÖV ÞÈï䊻ƒ rÒ©HGøœ­ûœs§™›ÓÒYs ˜Ùè5LÔ5ô'q6)o®¸ •á«ÞæBûZ™Y%£o|‡TÛ¦§çY—…r?èeú¬À0HÃÀ÷Á&Dlpÿ-Ä|‘q"A_¾WÄ;/˜~)…ôR`‚‚œûëJ˜!_>ßÄËïfüÚÍÓ_Ï7“㳘ğ±G¼Šý+&UÉ*sþÌY ‘ȶÈ$àš§u'J N!¨†.ÃÝ£n/d˜}ÄÊVf` 4È~ÌŽpž'ï­ÌÃWžPA䔄‡¤BçÛ‰qˆâpò½~iqÍ^шcO¡hÜ‹PL.Q…»CcÈ|G±€¦úÜùz›$ÿ@œ ~šÐ Êcaþ©#¿÷”P¬Ñmu§üÉýÓºX9 ]Áѹ´³Å{ÃÔiKhƒ/)<évHóÛ@>Æ…°§>Z~ÉäùÄo×BQÐñÒÉŽ‰T =¹RK—_™â§“¶™nsñ}5ø#aLÓTžÈt”ÆÍ[¨æ˜Ù§Y†ÖR‚;½YuEÝxY«‰ôâÆm¯GäÓzÌÈ=Jâ5XÇ]%céº}QÍÿúæO‘KâšÐ¶rˆ½Î®øÊR¾ÜâÉÒ1Þ/¸BYe¡v'e ”ãf‰uÌMOÇ ˜ÚÉB¶Óún=0±0:ì8Œ¥2ª$å›ì›œ•qäñ‹Óˆ˜rð=‰Ô ;WœµIß6;\èàbçÞõ©þl¦b9'&^"dñý#‚¬Ìèÿ|î+ÊÏ2k:²ÉÉ1GiÀ$wRý­0ùËP±£C€IE¢ƒ££æ*s*ðfGA¥Ö²Ö)«Ä q†$¼pföŒ¼/nâ2C3 q2âë~fV`瘼WhÞ‚,l΂hl#èLµ¥Û„nŠÈBbÌ|§<¤É p[ˆ¦/ˆñO¯C†¤v–œ—X‰«æËãJ¨Ô¶™¢sº ÝNdFÔ~ëæ¤Í´ÙAÿ<8cœØÊ³Ë“‹"6¶£pÑÿ¥{hk€ žñ¸‡k©cv¢L¦ŒÉèt3e!U&óµý”=)ñÙúØš”gãûĘ‘‚a¾õÚe6ЇxŒ¸IHLuÍ+5aXÄeº;ÍAô럞…ás‡(öÇðqÎ$—^Áañëòq\é¢%ÒMf-/¼‰ƒXA±£Ë·¤Þsûw1çMZ»¯ë¿g>ÒêX‘ð#ί9ÕáìʺŒ7S ä¡cT2=øîÁm0A8pAX¶„ê$¾øV¥¼· ýq/²ºÁÝþD*'kÁB“À.^ÕÊ ¹³Üã– ,.{ÒžÎwQÕ#ùß"ê`öœ«Çªb7蜂Óa)O%¹‰1N­ÔyPgçA·¼.cìïÍa´ÉÀ5œŸ•ÖCmìO=à×+#u£e%ÈëäaÜUãmBc¾¼” <-BÜÑktÐr˜Ë†eyÙùä6&rݸ²HEG±ÉK˜ùè4Jö7`Öv8Äí^ÐWwSFsyç°FVü‚5òY+~`nZu®KÜ2ÆMí<<Õ‚{Ýdaì,ÐH kîa+è ‡'÷}4Ú¨ ݯ×[àµcÇi kŸ£› `¹ÁÙ3/K˜ÆEܱ!ˆSñÅ@Ïÿç FJ´2pÙ".87(ýÑ@Àg¤`ÓJhø–Ú½„óÓ"O³ãPáv?:;ðü(lk§åVújõÝ^/Iµ—JX¦}+w"Ý¿³&àU‰ pÇZ¶ƒF#Qß9ÈJö}Ayö“ çœwÉ©ä‘RÔ:¤ù÷"ýmÁûÜeöc 6‘ºïωâ$ê”O3ë L1lÇæ´tn÷?àSLî8¯Í£‡à_¥‚h¹Qc1iùXgtѬ„Ø/ ›}ßiæÃÄ5#ŒBÚéêb«u-üa·I,YádbýeæKŸáW3+3ß©?Ôõ,ºÃ:9ór›º =- *íäÔçÄÉùúS÷$/”ËÂ4ŸÍ®`Ô“Õ8aá¾€s]ø1 êÂõ}WFàÔ«6à?B>ŠÇ&ZÅÍ$’0n# @±ûÖ}Šd~ ~±iZò)ý^z¤¯©ó™÷"p9Gô ³È¯¤ r¬VXAhã.âò²Wî.{ydø#–÷wõGÉ*±Ìðýì¾C-+‚?Q‰ †÷äHt÷´ãêŒPõ޽®«~Ê-½«å4©†•2?«M0iùDh€êÏ!œf nˆ)Ëç®]˵Sø¦ —’Ó•H©åʧ¹ëf}AШ¨sÒprÕ/רÔîáHaŸhH¼´S=€öêb"’wZé굎þ¢T¤´E3ë÷|弓@ÑtN¶—3W ™6‹(«ç¨ÛêiB-™è)%ZÝÊØZNÀ5*3Lžâbu\6¨«q=ÎÌ'ËÁ‹Ä˜h}÷{`æT6};`Cs¶X]vhD%Ú=#åaÊp7âUú<:f( ?ð@ ¹ü3¯Ëø†5ˆ‡ãƒÌ¹¬-[H2?Zÿ,4xä ;·Õ„«ÕBÌ}qq:Éq“iUƒ€Q­9ErrH¤²¿w‘"貃 ½}E0Ál*4éÍÛ£ÔÞ- dãóú’2¯—`F >•#óõú«§ªÔmyÞºÕ'HuÍÝ3Ї¹hŸ\…OÆ 'kC—>¦@+$½[Iæþ™ðÒ̃¸®*"RñÄïù´^ãÏ2凰♋ˆ¿¥Ï`|…¾RÝCŠùÝa˜§Ä´ãOGºœ /Ùt›ö$€v9ÆìÂS†¹ ÞèÐ[8àç³ÑäÜ‚òµã*„G!Êõ'Ã#ltÀàséSy@³ã:Åø¹É%~†»\‡r2¸ÅcS‰*aGïô.n »0¯" ÆŸœ FŒà­ÿø×ãyä•Ò½ŸÊ-ÉVá}ÕÒ9|]bCÅóÛZy§ºeji ‘š Óù1xZ^PüF1 xE­ÒIóÈ#ÿæ¯0¨jü©¬ÛÔrǼt"áò§Áñ•.Ù0ÆÂÑFÛ(Æ™}i"×éE¾ËˆþWƺ&µ¥ŠyŠ®,bÁY¸àê¤bgï[ÀÔ-1|Ÿ.(6¾Á(q-ŽüŠ‹ô„ J\!êïÊïÈéüÌû<;¾}Í%tÏŠF }‘‘öˆ‡ó±Îïs‡0rÙ^·£6éÚ°Ê1€6þ6 -5Iz‚§Þ2\z\f>y¸v€€ØH°Ö÷g†TBWzÀ7žcgÃ,dnù¨{™ÐHe ¼ªC~óðp_¥ÊmïÑ®áºAWÙéwy—œ‚:§²r×óYž¢eÖŽÄ(Ha9ó#¾ù¢Þ͈à΋OJ‘0zíÑ[e '2ŠG:¸%C•߃=_ÆPB¶ ‹»¥ßWíõP5º*øÝž¿¸z 0RþÀlWU÷ O!…CÐéÝp†èèÍUÝt•ŒXZzU iÐþÕKKüdM²TÃn{ˆÿ½²4D.Gwõd(«0fX:(±R.……Z™¡Ù™Ô„°;ƒê¬‰€w‘Z1“FÂì«÷Áð¶RYm$üPsضn§þÄYÖÐ’ßÖëp­á+ê‡$ Ø2×û&(¤|+PÛ¥’ûŨ õ¤+¯ÅÞ'¥ì>/âã¿Ì¹­“?é–Z0b?Ä{CÀc…\ôÉ•{ƒv>þEC8‡I»]å—–ºÓÔNwK{’™ þ*¢X¤<)åòWœ»!"cùÇMžÏ³"v+ŽIJ´â°¬È><eÅq{#.ô4¤ÏdÛœ¿ÄÚO‹«KDùn|‚Ú:„†0)i¤ºJAwÕXç”ý=–TŒâKZÓF :ª¢SÆ€¹"iÀ…$â󌋿 b?j¬SUÑp4=Li ü ù=1íM’æ|,tŠP¼®ï±³ãïÒÍ ¨qo :5ªÜÕ÷W©ÂuŒpk“Ý ?iëAëì™#òûMËœÝSº2ŽãèæïÎê@A•9x_¦¼“Ù5ˆ;ª³Ÿ›H,, @,k78K®äŽâÚ{}AsDó–Oh¥Z;G2tÖÏ" ,7ô¬ÏNý¥¡tŠ.}“W¥KÏ"_eN­Ë[=]iEuTøùŠJE¡nÁÙnŽ*¨†ù󂩆×CuÒBR½ï}¶· ´BpGyèjd-jhÖ|­_E¡+ Ä)æC}vOÈ6˜ÎJ)År?ëòʟ $ðDçAÚ aê" Þš¥§yiye_Kx%âÉþöåOôÏf:Öé•R_Çñà{ dœüÛþïœ §^qgv¡Åf7WFáig޵3îdílqŸAÅÌÚÏ`NÝ̵}ãõ:¢9¨ÌQ1T¼Ã~xtþã A—yõ´U …ëÇ^HüîÕúfŠ&Øó„ãs͉èÇV[\(p}ÉPÁhïk?ÒæÂŸX²ÂÛ¼§áü |ùùUÑ‹ÓõÕê÷,¸¨a´U™F”߰׼Ϣ-ªY£eÝ×°>$‘ihKã°½”÷½XÏ×ùW4²ÏnÔ½0Åmf–Þ¯¾ÇÏ ï¬7“«ê¾ò%âØ%à±”üß¶Ï9á¢þ™_‡áF´; ȱDë|ØH—!z¡¨:ƒÂÏ ðª8Aæe‰U'Nð½TemOæw„¢1U¬™–õ$Ñ®å’Vöž¿h4£9UNSüßèÝ_Ë­ÔS)·n,L{²LßP¿u~Be•­ÉL? +©“”vÍ­E'°cI~߇ ¼!`Vé´^·L!·«]»™IªY•ê爸Gƒð®s ˜;ìð6ŒO%ÍC ó¿_óøv󈽷µ ¯ûË®3C¨BÒârʼàÉÑ ý¢[.M\ôÀ‚=3òà‡’E¬9\”FêŸÖ„s0œ¶ªp-î–$V>¨›U¦UDÊØš?TžsZ‰çù{.\|.-¾¬¶El’ yUØdòQ”…QÑרFA|ªXO¹÷P¤eêñ9ÉÏ·¿W4Ô#ÕNÊèˆï`¡—ëá¯k´ˆ¶NµbÈø²BÕǹÞ+ªBúöŸM¼´Ôx~7bz±¥íë[Yïûï4Гt)(¦}­l3ˆÑXÙ J™ýZÖ<réÝÎeŽ´'Côlûx µÆ¶âd¿•›žš6Oõ&Æ·HEù;cýAø˜IRÏ›²ê?Í™ŠÄ¶{Ü¡ÿTcH>;˜!‡‰9â'e_ê§NÒ#R‰üè¬ÃÓP:˜¼ÒùÈà‚|6:*¢*p¨xÓb¡ßRÓ]æ4’nfM­C´ÖÞÎQÆg•^9äì_'±0HWÒÂc1\m&Ç#òö¶Äq¼‹®…¤÷>G/‚â‹Ïm`Çw6•ç¬ø£%÷µÇ±Ú¢×:i-Š›ï&Ø»EÅjˆÏÃäÚ0Ꮕݺ2ó©kLÖÊ9dtö(A9rÕsÜò«éëÄd‹FZßGœðÃCþ0ü‰]Å=-9µ &°ú+{` ì׿B˶5ÅäÑŸb.<90!H§ž*µyåj´ßNz»bš4Š=vóM—üTÖð?\çmQG¿ÄÀäz±þ´xÎ)ˆ8¶ÆËqÂyÎê‹ü,ÿ•ïè }UWl|M)ÅÙæT|)D†@KnAȨ1Õ]ý­`-å`Á|SÊŒ÷÷³¬×ëwvµgQ¦ßî%×XO»Ëµ‹ž>¸f¶Ã«[Ftò¿I%óãHÏøNêL(üÙ,Ök=«¹[UÓöî×U›de:vfs÷ôDK‚Ù3ÅC¤Rã ~TبøàbõÎñâ— àJ÷¼É6õ‹Dåc—ŒÀ­ö’!fI¬² ãWV<$„Lk“¢s ŠyNÊv'ýèŠín²簱߽X<­‰BhÁ\CÖÒ@âàJ‡¦ hã*c<ß~Ÿ8ý2åSÅìÐIŽcˆ{DK§˜ûæaÚd_­jo˜ù9NX,sp¦-Q¥ûþƒŒ£x4_çÕwµ4±˜ûÈt@€ÈPi–Øafyp‚`­tÚ L\y„B%&À´ø‡ÇÚ¾¦€‚e8YßÓ¬eQéÎÞ›ëL-Íó5åR ÉÃŽ_,pë*°r¡5<²ôó.´m.ÄÉ,* üëÁéõL«(Jq"(™-‹“Å:æ<?x_øvOQ_Ô<8$4¤Ìµ±ö‹¦¨Œ¡x»4© ËaèýdéßCu¶(xQá|«`ŠˆºšºíÏáoú[Ý®n"Ù ½ª1ƒå®ûü8’@ÔXaÙ~†¥!(ü\¢?¾—u«¸ö™!e5®wã~ÄÞ>Â⃒¬‘,°.·›n5=Î~õ‰¨\¨¥D¿fl[ã~, K+U”#ûm>n8l;8µbfE‡+§8RSDJû›ÉTúq >Vñg®IÒ•&«k¿)êb¢ƒéž>ØEû,€±.·„“¥¯´¡‰Ka“yÉ%¨–åPû Æh$Èj¦.´|5®Â—¤¨cßÏ?Þ°·À/°|úËs²ûuiùÿ(×ä1‰DÏĤ#¼áäðÓ›kx§i…ćìœÊ±@Šq:*8L’Ÿ9ß\¥HÐÐiq¹…‡­ñ‰sèjN~ãkƒV¨t½FNˆ´"Í‹.?»TqÁŸš© }^æHá/ê½}ÅÆÌè¤IJ¢ÌO?œy.vƒºòDþQù&Rd¥ûX l¹DÓ~Ðù%ùzíÍ©Xü2D×KÍ²Š•ÎÄ·íºTõŽ Iqðó™ºÜ.#±z¨òÄû‘ú¢âDqz,°F=U!=Ö cR3üÜmð4F2ªm¼ÒƒÂåÁÛóæ3æ£1>Y¤Ä,|;„FÊ@ßŃ˜|M‰HäÁxâ1Q’Û–X3‰“Å”àÅùjR¼­<&v·+W³Ô@¿`d/äesèŸUÍm³V‘¤8*Uó™ùhÖë÷†ŠÿúXÇʺ$’§_Õ¦OY°hNå•âu£Vë|1©´¾/ƶ[ƒ¶±óm¡=aeºÓÍì§ö„O\4#3³W6(ãÐýj)™æ&¤"Nëz¦hxY~ÜÉŒ0Ér„)@ïêÄS’à?ƒàœ¶–ª|1ÈsÌ ”-îF=PŠÐ“89Or<{/ FÏÑe/UÔc¾Bކ­Ÿ¡Þ\}M„Ç’”ð®OxŸCÉiVpOöfÙŽÖ; å çôÞ¯©qû„ÿõÞ³‹…µº—7jjÙ÷¶lòýTŽ%ðSú(\ý4–&Qä.Td¥O/‘çHEÊÄ6œÈ=ŠàÿR×ä”XÜI/€³ïué?-ÿ0™“§Ù€£þ28}á/vtå[%¨â7»hŠBc 5xwmÛ.+PšE¿X‘(Wá赞¯ºF3›qi4rï=“ÓêµÈòÓv!÷jÀ˜œ^Ä¥J©:_Sç¶ssÍS‰ÕõÁ©Ê‡o=4(À³ÄR»|ÖÊ+leß>XÇÔWð]©YûJœŽOT1ÄIZâ­ñ‰­À¨¥'†Ó§OQPM8b¯ jkŠ*dRg“’ÙÀ”ÔÛ'âWÎsó‡çTÓçX¿l/‹·p ‡™dìÇv£0@ÚèŒßö›çÁAð _—í_÷íENFÉe@˜<>T=\ô'ã 2ssùáì…4ŽàiFt¡QƒhV"Dµ]€EªÂ²œË2̽Nï‹’Š~Øi!¤]€Ñgß²НÜåÓQ‚3—m…aìåýèÚíž§¸tªY“5EçÊü÷•\CÃÏiÑ\9X6Jä¶n‡òXWsàäb¿Œ6›Žs-K#­æL{-Xå”SÖ‘ªáêFÐ#Rì0àI}¾TŒ2•L`ßÓ«Å j~í¶^µå1SÑÉ þuØ®BpD^o¢Å(Žj¦¾^ßk#n°´1Ct-?äh{âÞ{wåÐ~G§k̤Yå&=ÎNRF ÒvòàjûmµÁ·­¡þµG ²ôή ʳR"¬üI¥I+÷`P¢3A~ 0ër»|jÏ! ñÇ_f=jnÚžÃ~VÏø^ ­i6|FqHÂ)aûЯ}`Ú™6P5ëljßEÅaú1é#7éÍiJÀ3/¡—ó7™Â˜:•¬Sü~ZjÅ‹ž(uþëœÛ @LÂÖìâ(úŸ‚Êñ=ð”±æ¢<È'A/Ñ0÷Õ³qÙ@'"ýðæ „Ìx%˜5Í­©Ò¶šIŸÊÜpºQú%3ùgźÑÒÕ2p£žÖçCߣØò–­”ìîçsd§Ø{Ýü]%æ)P7m#œ)óÜì×B’5? ò»’¥Và\Ä`Ú_X}u½¢¢oª¹ Õ[ #f¡1ªÀ¬ò²0å¢õF¼’cvGщ|?tÛ(T´R9ëØÖpUl ãu7Á&SøkdŠ{%ËÿøßTl›…?¢†7vR®Ë #A/ëô()3gÅ?þ Çl4þ‡‹@—ƒ£<ñ˜~Hœ·¨Uâ±€úÉ, IúçЂtw±õLòéÿO"ß÷«‰ÊœÐkö›B×~Qþ›®ŽYþÙ §‰ÍH DÎ.³>ÁÊÝÉ>ò@쌱‘yµ½?‚¯}“ÑçÉr¾Ð*]VMY²?zMke³èƒßK‹¿iu'|ëìæÎ-U ÃeÏéÎäcå¡þƒ€Ïl-¦ƒHA¬«³*Šøò=J*¿ÜÿµÚôvð+>XrM ]¾Úø*O¿\âüý¦7`Vpûf¦÷æ8yú£øg±†§¤(}Ù&Î1¯b–šhìÌ*´7FÛ8ß`- uwÝ ”¶á¯jåÓONX|#D¹(:³yo%Lñ¦“cХݾµhy¬g’èBÁ%oü®8Âôú3kÃŽ\Žºpɨi”TEÀä¢î„ãÛF_øþv*ÔÀ…{c‚Äôe&mÑ7W φ”ùAzÈZønƒ³%Z¸ò_lÿ®>¡ø÷‡Íj¦’÷Ä]F}þÛ6©ÿZ¢PõÉqéûg§ÁUlúªñ]êÜ’`zý¨J¦–*¨ ¤=È*š-j­¥T™eöù_ižw€À2[YL{ÊÁ/cÜpkÄoOæ/b8kX|9ªK_#JÉÛ#pÊ‘I+]û‚ä`º"ˆìNy _t4òl·ÙTR©¡©šÈ±Bƒn¿!7T‰×û}QŸè /·y£ì] z)Æ"è ›½ëO+Ì’ ¥Ñ°fäQûß»èɾÊîn‹°4ç·ÌL§Ûúé×[Æ’ ’ròïJ„è‰Ñ·¸ü Ù¯Ô»µM”äÕzgÏ=ˆ7›oyµ€¶a~PxŸùÞ ÀîKq•&yyhxÇc`Ë;›PéËgû .?ÙÀR•vÉc†“gñP¥{¼ÿû¯ó´Ãü©¿ ¨’AÑ+}w¿¡%ô;NVàÄz©Õñ1ƒeFz¡O˜˜6„ûü`ë¢Ån&×'KAw—f†[V@ˆœí§HÎ^â6/·¬…3Ž4¿N7ìhï?ô|lòFÚ±d{®dYh8ö‰ñZèÚÑ×Ï9JαŒw)ˆ¯ûB^#|È Ø†ÑJ¢òRþ5C v;$üÿ¨=aÞZ4_¾í"_õ¨¦©I˜µHˆÞ÷C go'ŽnïÑ8[/A"ö hfz²½ŽŒÛªYìåT•=ëcØ!!üô˜ÁjMïÆÎsö2¼é>¯ëþ_;0wž7>òñútæP1*žôÙ ¤Úò äÉN¢‡#tÁïŠmÝu'’]4 =³!?Aèãôÿ=Y‹Ûæ>™©EëÊT»ø´£-VÞ¤+cW ®UYç3:uP÷eòÖÒ@?¦ú:ê÷øQ£ÌEg¯Òš÷›$­ìL1½µ©6¸,hÓó¨¦ÄÁ³圿î< m« ޹Ptòƒ/NoªØ yZFØ(ã• ïgT~'<÷Rþ¡ˆ~SÛÇïfÅxëjæiSá+ÿ+lü\†´vEuJߌ¤jueÆË3ý¹L»÷ N:0÷ÿF30!(᫨réµQ- §y6˜²GpXã] ´Ï оƒXÜ2§¾v'±"±±¢U7ܘͤ”Ç‘ZQÇ´ªþ)[wº¥Ÿ¦\ +~…mûÃuvL“ŽËUª_¶"¯‡<œô/JK.~:MNžX§ˆU©J´ÛùhÈûÉGIJeèi>qÄÉ®¸Ö3@ð¡ÍLL~zì*‚ÍÙâöÃ…#IÙû*ÄÁ<3µ@²¢PÃAÏóõN¢Ü2P›å®9PœÆÂ¿u5ÃàÑŸÛm@ü+øÑ¥¬â«¬.f›Ó,”‡ÎP‰÷keªioƒ¦3â°‚óvœ‡|rq&Pv=ˆâðmÉ+|,wôÒ7µ'‹Îæ—î0Š®>˧ÿ*ËÞ)¿ÝY4I™qWâs¢Ê]”$)ûŸÌ‘ ›@ŒL†1 ¨Þt«×¤Èч3ÔÑ|þHm`xuv)´)ßà¤Ú†ÈF³”F¿”x ‚ <íÝÄÑ­É­Tã}2ã:²]ÆΗ!X¿™Ñ>ØØñöž¤(Àä+ô /ÍÁ)JÂõ 9ßç¾-N³ÂªµåØkÏò‡Ã‘û×&ÑÛÏd*BÅpp°ª†Rk-˜‘Æ ´›üh”¯ô^ÚÍÞ÷S\&‡¯§vÜð‚úg¬S3Ôa¯åQ>¾®‚å€Å¹Ì§œ_½of|ßÛ ¾Üâ7[€>ÓŸ¤ÀÑ7¨0ŽE3ã-ÁäþV]ÛÔZägëñe†àüñH–^a×9À?.y«ƒ~0VüÞ¶6Ãaw»ù8Ìrb™…ù‡Íqn 4êÀ¶R5_/—^Å»ù0žYï­y›qFÄ¢Þ<<ªöÖ´›* ?©Yòëç<î5ÏKøSÑm/’€Fhó°Œq_àï‡íË3Q’ ‰OfKß…Åš]ÀBu!žØ¦¨'Ÿz“#¦Ñ‘ã ¤/g=’ƒ™ƒõ{šÍÐO¶s¼SØpï@˜´¯—#á °Jì;É¡ã¯gx::Èè’•iâåÛtBÏl"ÒhZ` ú#Ýð7d8F%ï³ó¹À-k‚;ƒž"‡×{+Å8¥mþvAÌ»(GêÍq0¨ö_ º/~V!£›&âÌÂ#&t’NÄÐO«Þ4QÁivw=5yüÞ^ZiàIã¬@$\Dæ†ju3¼šcûk±«a•”‘Ö&q…D§7ä»WL2þ¨ ïyŒäƒR)¶îÛ!õWpo®¦¯ïì ©ö1e³n¶ª¸,¯4áÜYl½†Å7<çz¹É“†´÷¢È\¹ øÛ¾y´Œ#:°â{ƒ)\ÄžØÈZuŸxIPW„ÑØ n,ö€éLÌ7¿]Ä»Œ1ò»Äºož¨HùýìÆ`Ú;›P}•H…‹š%W¹»ÊÈI…¢õô ߣý¹¨Ö £Õ,–kšš ª4Øö¤Ùò.^˜ü“Ð.ÜÛv1U »ËŒnô[=ZˆMjÒÇš)kcù¶V)¹ t×ÙyöZm4ZËá'¸6ZÇ®Ÿ«ª‰o‡“W'».Ô ¡`âè:$?j6_ㆢØxû%Aµa ƆD&ÖŒìëxF—•v_¼Ç‚Š'ÛEâ4r™¹¸øë×RH¯™òŽìhößg\jŠÿ|(œw³ìæºWbÌ¿ßzƒÆ¾Ä¬¶‡‹ª¿ziÍà鮎°44}H.=ê(òÝãGØ”((GvtxÂ,Ü6üïjûø`6ǨN~ù ®¨oQ%×yEêû;p‡j6šÇçnM*ºË¨svå Ìâu»QZ<+ ¸o"@Å?4‹;‡Êч¸è½zb"•qÿƒV– V(iU•mWoLÝþÎçöQ@è!Q„ [wËd7ÁŠoæ3Ѱ›¹riÎÀ\R‡ëE›owÕÐr£“',½.ZGÎÕ¤öí×+À«WÁ}è6t0$™¡!.R4µ¸KÛ&ZWΉµÍR¬°òP6 “0]¹»Ï5^§Wæ:ÇÆõAÿ KK1>1çÄ1–EpܪwëТ?åÆÀ>¼cìvŸÈ©c©ÿ”ašåóH¤#CR•>PœÖßO™—ÁB4>ß>…šØeÉ,úwtpÑÿà8Ë«»ûW;ø— îÐònˆU.žƒ…ã0|K\ÿfE™O›%ñ#XÜŽî#š$CPó7ª÷+7‡ãôe©à¾;òçä‰ÿAÈcVöU‘F™ÓÚe?®€¯ë' Þ‚I5E;¿©ÂЊïe´š¢ÿñ&îaë>"ÑXjò¸£¹ŠW³Út{ ,eÖ”‡xÓÇ» ¾­dÚw|ŠRS]›n5þ`ÿ‰gb땸u,%çž©ødÎ…ŽlIä=EÜ_¼ñCñ£€4ÏnâÚ÷¬ì|xo!D?hß”ûç_,a÷ǾUcÝG TŸ(Ž¢Ãòt^ý†]’©TVE ƳW»î°”4ù¯¯é,Ù2üOÚ5y/€;2¢ëY ’“—­•v×bíúÒÙÆå䪞,¶‰ƒ¹“ÞH·ó2NéQò.“Ý0 ¢´ˆ5r¥¤2ÀK’Rsc£NÛQ÷8²(Šà)c-Ѝ`+hˆškÔ>Ú§Ó¦»ÛøáŽåfÊÜ;øeü}(–êÊŒr+\bî¼J¶4ÒÌEcÐ2 ÚÕ“'+ú÷Úô˜þ]â+:Öëž®±Êš}º?Ñ¢ Z9WøÅ¿„ÙÎÛL¬£U=?]ä´¥'Ó!¬—ç.¿£ù%û…ÐȬñNQß•ºò%ª`>UÌÁt$;Cð§{è†6‚t> Ló;nÚÿÓT½ç™ªø1:°Ž+„ïç¹µ°ý;°ú¶ ëa4€“gáù-øÐ¸ïòªu‹F… &ÀÝV¿BŽÈo)YY è]ïøÍýŠä¨‹/DÔñ›È®šÍdóÇ“<,= ô*ÁÓÇМ4÷uÊ«1y,öqå1M€•¡‰ýzì9œp(× Íx­¡«ºðD°•×Uu$[Ž­¶V&#}¨i  3DwMhå9ǦÞgÌi´t8תýfå¤ñÅÕ7¹M¥«II ÍZ¾Z?bÃ)úá\\nGm¬iÒ:UáŒ@O¤uùºQ.±»`2‘ikÒGñá*Ýç£ØœØ¿ ¯oèÍAoÞ¤#ÏÍ)¤tWÕ`$NÇ) 2kÎRbÁ¸q(ô r³Ë» ßêÒš,puÉÆi9¹z½ÆV¡Ý–åEçèŽZ)†`ÇÅ¡×m93eâègý¢S¿|ªƒªéÂ'ãëÿô¨’| 6¬´¸´@#´QÄ>µ˜™‡Ï©t|þîV(P&•ÖS…3?äŠq¢ŸRᯇ>‹š"ŽÊpL,wöH‰É­û_Qz5¢'ã¬ùàƒLÊ÷å[ÚJC £§3vSÃi0Û¶úï{£v”‰IK>V$%—(Ko©hX»7 } endstream endobj 124 0 obj << /Type /FontDescriptor /FontName /VSQAYE+URWPalladioL-Roma /Flags 4 /FontBBox [-166 -283 1021 943] /Ascent 715 /CapHeight 680 /Descent -282 /ItalicAngle 0 /StemV 84 /XHeight 469 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/Y/a/acute/b/bracketleft/bracketright/c/circumflex/colon/comma/d/dieresis/e/eight/endash/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quoteleft/quoteright/r/s/semicolon/seven/six/t/three/two/u/v/w/x/y/z/zero) /FontFile 123 0 R >> endobj 125 0 obj << /Length1 1620 /Length2 15311 /Length3 0 /Length 16155 /Filter /FlateDecode >> stream xÚ­·cte]·-;[;¶+¶mV¬dǶ“JŨØFŶm£*¶mç«ç}¿sÎmçÞ_÷žkµ5G£ô9gk‹’TYQÄÌÞ(ioçÂÈÊÄ ÐPÕR6¶±16ÙË3ʸÛþš9()Åœ€Æ. {;qc /@ h𨨬<<<”1{O'…¥ €æ/-==ÃYþq˜xþò7Òda úûá´±w°Ú¹ü¥ø¿T.–@€9ÈSRþ&£( ‘RÔHí€N›Pv5±™äA¦@;g -ÀÜÞ `óïÀÔÞÎ ôOkÎL¹DœÆg )èoÐÃèðÄp:Ù‚œÿ~@Î 'c;—¿3p±€ìLm\Íþ)à¯ÝÜþ_98Ùÿõ°ý‹ý%S¶wvq6u9¸þfU—üw.–Æ.ÿävý…öæ=ÍìM]ÿié_Ø_š¿¨‹1ÈÎàôpù'— `rv°1öü›û/™ƒè_e¸:ƒì,þ«€ÐÂØÉÌèìü—æ/÷?Óù¯>ÿK÷Æ6žÿжÿ—×ÖrqÚ˜3!°²ýÍiêò7·ÈùŸ­"cgn`eù·ÝÌÕá?07 Ó¿DóÏž¡ý[„±™½'À hŽÀ¬hïò7%€æÿNe¦ÿ9‘ÿ$þøDÞÿ7qÿ»FÿË!þ=ÏÿZÒÕÆFÑØø¯ ÀÜ1yÀ?— Èôs7¶ÙxþŸþ»§ðßUª-\mŒþ;üoz;‹¿Š0ò0qüÛ r–yÍ”A.¦–sc›¿³ú—]ÃÎ èd²þÕô_ã0²²°ü7LÝdjm÷Ïð9þ íÌþ{ùeúWñÌšRêªÊ:ôÿû½ú/?å¿ú»¨{:ÿ-{³ÿ\üÃ"*jïðfdåb0²³pü=vÏWVßÿCƱþ×ZÁØÅ äÐeabaaü}ÿÇó_+ýÿF#agjoöÏŽQs1¶3û»ÉþÓðlêêäôWÛû¿MÿÇú_Ûôš"üY²7å ±JÍHs©ÁÉš×íëa…úîPR¯^˜PeßퟶÅSnôVý©aŠ÷£ÕsñÄá}O–n¤Û†º;x‘GèKNÛ›¶NÕÎE¿ÄlP‚œvªå}¹ ¿ ¥ÃÉ¢¹¿=¡¢jPüC4ÕÎîwùH@î–€IñàðÅÏ4¥.«µ ½¦àä”*áèñz`txh°ûºw€>;ž’ÏÇ/é„4ÑÅÓÈé®ÞôúÅËq ñ¥ /Õ2ì-²BîD× 7èZmS E‚þ¡_JåJ²8¹3¢åô§–¦ÂÛY«é7|º¹/Ì Š¼Ýq_šKJ…ÄVÍ ÅúÝ0 Ü^W<-“–h1rK$?ị®6ÎWxÓLja°Æ81Oû¾F%óî›Ó›¨`Wo ¹«3þM1JBTsy"M¨4Éý<ã–uÁ§G!Ÿ+ÄÖ°íŽö½»–Æþ>óê!;˜õuÙ›½w²w[ØÕ5v€¾Ê~¢j¨ð4‹¿Îq« *ëyA LV–¼»ñÐ"Á4-„þÇêÀ놫®Çf5U¼P¡"š_.•¦x4ø^c€r3 X};†'#Žñ…Z‹ –fÈE*'lØèºiNuòܪ ~Tò$ŠTÌ:^k£z辿bårv8’#]ùô*ð­£òŸNsª0Ò. ´oÔ‰¶˜f/rÃR¡ìÓ M«¬?hHf¶Þ§hÄ`ÑçŸÖðŒ !,T9çßïü²EÑúèÄýâ'O熪™ö@©AVgïÆå‚(;©׳íýŒƒ˜Aá‹tÊ6ÿ{Xn 4$±±p ÖB0ý°Z—™#ìÔ3\ɦҼž?A~Ž#:<¡Ñ´,”|ª-Û,EDãOˆÏúfƒ vÚglöò[Ý)@à[)uþ”Зöû?vÞwª±Ž·uæ2›‡nw×[CÍ-ày/}Å{7GR9ÞÉ&–«)*AÚbÕ?hm-ÂˤOÍû&§_¶q×uÄzWµ(rXe`bÐ5»ø©11VèÅŸ¹óÙn]ÅË*JWJmx@øm]$ž{d)‰!,=Z¯Ëc$fʹ¬¥¤ÍÈ-Ù­b3?ŽºKh×w/ ;(aÄmÛ`(OÌh›ôäÅ$ëõ‹›õTÙ9Çî'„ž²f±Èü¿ïSÔ©U”¢OÞϤ¡è6‡Y2¹f¹¥5!{P½¤‚tJIvoQ‡ ­+í¢¼ªãfO`µ:ùòô´ß¤Xšàľ{ÍrBè93Ë/>Ä lžé¢¯„¦áºtob›5Ô½Yµš}3î×èXŒ¦³a—  ]Ñ3ܲ±ó§Èør_1 b¦k=OGÊzÐwE¼Qe”_˜Ñ#kËOЇTqmAfß]¡FÁ(<ÊX÷(žî÷‘œÙFƒŒ¯ ?Ðê „?ðuv½Ê§ƒ|šà,Ý3‚$OËbï¯Ûç”öñ’ÓǾ™r•J evíØÕkäÒ‰Y¯ð\_Ú†à€T™)ø¿Ý%ßmSÎ7“uÀ¢¹ïâé6ñ„"Í›Š?^#B¿Š.F.háZ„-G¼|¥WNs.Lh¯óQÙÈhÜ s>µ¥T‚Ëd½|µªQR[~?à\LÂDº³¹%œWñJfɆ˜YÚlùl«Â¯W({g+s4gÁˆöyøŒªv¢³–ÎÜžÏjæ}IµºdÔ×SIžrIdèSš¡<ª»lÙ àR‡™f‰„òYàu¶r*@ü¹½´]Õ-:LQÎfû»)ÊÛ·Ö‚šxå uîWpcþ4ô$%É^3ʼò£–LÒÜÕð?]YÖ0ÓñíË4óïµÊ®ÛÅw*)ZX,£ á¡z™íQÄ£ø=/æöV"Æß„²¯c%Z«è¦_¹D¥œdyÀßÕm%ueeÄãLÜ*ô™ÈA¾ƒ›OÉgQxØ‹L\wnÏ!pµnùñ§ÞN¬Ú¼z•8x5J+ŠžÂoÖ´j͇¿µ…Jçñ4À/Bx%[9ID¸a\á[2±l½tu6 ;±‘º¢¬4_Œý¿‹K=p¹òWh#PðA°ÝŽÀ,›S‰º¾‡•_Ÿßu;gÔlÑÿˆÞ«Øæâ ¤+[<¢˜¦{aïò"Õ)ò.ý¹2ú™ã™§:,ZZÙ²#ƒ0xÓ ¯S‡éVBoL±£@÷Q÷.æm ç´¯öÂ'{ä5Öá–Ÿßö®r|êFîëe\¿……ÕÎ/§‘Ýo}™Ù WŒÓÑÕkŽÉA3O'/}S]6Qµ\•û½5ìÔت«;q»Õ]mduõÉ ùõùhÑÿ=ýîÌëɺ¤f¯J™šVáøb[“ˆ%#Áø0ýnUÅ»]ÒÁׯR^ýŒ<&YZ»pù¬^'YÒêHÛßÙZàÒ‚´jSàœ›—ÊÎO‹­^žŽ%\¿È¦%Œøô ÿHêe ãM5I§¤Æ˜ð+С ÜŒðPïStjvc^ñ±^—A~û°O™°‰é>ã/3qyQuž¦› ä‹&ï¢4|ûíð²‡ûjÖǘ)–Bæ—Æ5z=zÂÊžß§ºFU›Bj+—dêƼåÉHO%R$úŽòÃ~£ýÖãTGŠ )Çöò5x+”],Ë¥‰Ÿàzšþ-Vÿ}dêâ³Êpïf `ü¤d¡,ÜŒ þReÏ#mCçhQ= }йê¨õ]·†ðØõ Þ $·»“¸‡Ë^«YšlóaÍØ¬ÓeÚÁ† Íž¡4èñ½¡ßسS‰~u°}·Iî±V%‚n”¶}‡-¥‘ñIÉ­$é¦;ßBÌ¥ ¹{?:랢·7 M´?þÙÕ as%ºReXfê}»Íyå•ÒöÔ¡¡£îGžÈV’¶Ó/Õ€ÃÈ3È«Í]ª;sÜãù©à~Aü[w`š¶7ÍR°ÌÆ/+ Ä-Æq¸®—{µ‡;n!÷ä¤Ñ_  í®Ñâ×Án®ìßøõÆ “ÑIÀzsçÛ'A¯À"Çñà5½ü×w*h„7¼8™XAÓõÌø,ÞÉnö#6¤z"µë´L8èl 0+¥ñœß’_—Ùd/ù¿ÌÑ =ïÂÁÕÀkG¼Èn´g~]ÜX{¬… Í*Á<úf¤7PÊ4PüxiW½ Sãè»rCŸ;@¹º‚©2õ¶6äX½.jë,N!ÃvwQ4¹»Þ·¼„ƒo0˜aHÚ+,/=‚&ÄhOáø¤·Œ’ÝHêZtÎø ëåœÉyöSt1W:m2JÂÓpL–M²µñÕNè Yò„yº%ýQGÎ9$)7à¸ns«5(*ªÒ !4ýç6¡‹ žJ aæõBÓÎ÷#J¨ Sv`û¿®=œMê"w'·ÃO”_¼:re•Ű9¢÷`ÚTÁfe9 ñêæUm»‚ôÐêu±¦‚F§ßòjò_t·ò8 vðítgÏPÖZEµx5Í¢âj-æèjqmPK†æ5³ ÖÉu:eŽeF®Ó°  ZƒÙÐQR’Vµr&÷aÉ`ù_FyÞ•ë éÏ—j(O8GÐÁ{uÉ2pë>á!Œ ™6TQñ0©—«m½ ã“¡= ì¦Re\©”ÜŠ’…Sfs1@Êí¾µ”™Ÿ… ¿7ŸžHC†$&:,DíÂ|qrgE誉cÑ:XˆýÖçÇuç"N·;¯ì¬E•ÄT®*Î6×ÇæÀQ´²®2ái*]p"<ׯܰ ­†¬ïåo&I*éþ 6þ^dUìй&R=¢¢•;Ñ ›Óøçœ MsO§‹–vœDJû[`övI¯F€£˜)tæ<·íßÍ”çŽM‰m”VÅæ¥ò£4A%çÏøé}šwKG¿kÂ6¦è¼Ü-'t§–Iô}{°Hî#ÔdsxªŠhi;Úceø}SØ…gär8f<7-àU_Ðð(› Ï±‹o¶ 7râÕÿó¢XÙjf•çKÈÿ|Ò6BÄ«è:CsÛø {Ÿ<¯ä‡± •Îã$ý6aŸ±@>èÚÅŠ,¥8ðÓÜ ¤aM¡@‘š UWÏ:‰ä›ÏlX¶a½ iF*ÚCâIA¾e¦-·»JõÔt%ÊÌ.LŽàk:뱺cïWÛ!_/KNØ™ªÄmÄųM1ÄõïF˜ ‡r¨JÉW aBmYå%Чsó„'R"JL ØŒè‘" I~™aÿ4!MÌØÈÐbhEqõéO .‚ÖQÀ÷T—ðÒž?PLÈ?T>ˆ&g»g1*@.¿SZ.ÃyâMæê{âS+!ôV¦Õƒ —'«úîQõZp „>3Ek6aC@~eš8»å-òT*¼dùkwä» š…¢âSÓò\ìö-” -íÝŇy›dùï†.¶í¬Á˜¤ö ¦N£ßÝJZ§vÐ>ƆÏ^GºèÇp#´À¤}~(/¤7§(<áiNk¢v_“5ê>¶X,߯œY”?~¡@nZ 8qÍ–H Œµ%/·ät“.'=aIIÔ.½AôJ.XÍ9r ¹6º¼kè@Z¼ƒ)05 ÖÚýØö¡GzU«…+ ‰p”ØG_ûÖ”8’cú|¯çLh>(1{Óãë&ÅÆ{h{wÈžy5MÐCÓ§lR4Ü%žÉ­à½èwÚùëÿ®•èQmÜÝó%É™g r\Í…=ïÒÑüê´Ï-9¸×9"“OB»J~5>„Ð…7¶µzkªHŒf;t[9šè»ªÜõžñ?/­ÐÃê¾7Æ_ îÑìˆÞtfC5lÒ}O»Ù£‹WF3YM—8N…é)Ý*ÂïöµLG…K1qé*Áùñ{¯.$ž7d,Cyˆê&`O$Y¼¾˜ñ¦p]ÚZù-qÛsFn†œ­Ö¢õu5W{·w¨‹ñÛp&ßRAæa×§‹ô©ÿñì)bzÁ·°5ôäè7Ò+¾ªEµ¦¾3^z\è×Ooòwlœr`ý_XܾH9´âþßûsÍ8 6î„ÆKHZoR_ç .<ŠöiÙCZxMó’Í©Vµ™›+|¿HÇ:ìט9¥8Té=pHßfÆ'lÇ[>'/`‰ìA/vxŒ8KVJ'k$3J"N0€°¡ ñqΰ;YÆÇ«L¦õ­B‰sEBa䣱VGú­Ïœ3VéËÜ*’ƒë®ÞÆ­^ŒÀé6¥²Mú1?“”÷`Îú‡5àÁ ãÈØë¾Üô͆¹ŽÛâMžÒ¨¸%z´“0qí™(‚#~þ0á¼s,<˜aÉWšžBÌ´©{¦¨Ñ1º²Úl),)ˆ–_§œ…›·þâV?÷‰zÃcbLö"+9BG/îḛ́qÇ#óXü@}ÿLÎb²wb±?2|ŠŽü«Aö›ID±ÙSÏNÎÍòà[ªß¥5ˆªÂ[÷&…ð&±#²¹y±«ð‹>gÑùëÄ™¾¥Ì}vr|y˜0Æa`®Â­®–_W‡ñw÷ü³“åŠè,Ϭ œ¶èÔJƹPe.¡VùÚò¸öŒmmSÑ4O³X¡‹Ô{Ê•£!™0 á×È”¿ôLiÖ_p³˜fõ»Ã*Œb û¾ÆîéyL¢ê[|Á¶!¯ µé3>Íf5wk?wj".ãê`däÇ%7<¥fº(ÚFNX°Aºúôldäân·PÆ¡nìÔEÙ»Á"™N«V$8k·°çC“3’ßaÀóF6žBŸgh¦(Ýœ•SKSJ· uþº³òå5ýò‰°éÕcA4âNÕËýRŽhni‚–,JŽû¨ûôIζŸçû¹nÂa ¦˜ð{)!U“ƒÖ&`ýçäUùašñèêš¿¼¸ÇÐ Á¾ƒŸ±Ì:b¼Äzw\Qí4-½ã ¼l&„7Õ°+^•㹃ÃèÜ;Û´lY}6èÃBJe`™—$x[áé<¬e„a´Ð±HY1uýn5X .ÓÄvX¤i~™šŸ&̦j¨ížü4!f.±Nmµ}éÞ ìœëÛŒæîR'—ÒëCÅH©.¸›,=*ÄΟ;ç]Dún§åÛ£2iEr}Fæ$ kûß4_H™Eœ*ud¾DÿºçL¦tß´‚Z‡“¡ÞZhP¯íú=)8¬F…ÃøÕpë"”†h®8 ÷+àÍôNžâÑLlEý¾G+Y}v¯â„Ó aãtȋ·f=|À¯z=bÊÿ<$bÆã`Îèe{/pù«Ï q•uíu_¾@­«¾by§`ûrÁ«ÚP©7É'•z*é`-_éÐÀ}'¼Ö©:ãõ£B Ы°$Ú?êÕk möX’’ž«Ï£¬?h%»wm×_jö›Ûdí¹?¶¾XßÂÒÛ6sôo*MQKÏŠ©>ÑÊ X%ÕÅs§ü,ÅÉ9ÃSwmå9ò”>-’ êƒ$1ÝûÓ£•7±ªÔÇïDÊ¥]lã×MXüU‰' ‘Ãnº[º…£’±LÉ/"™BùW:™ÇOð¸YÔȹ¥¥3Üt{û9{#ß[PŒ¶®ƒý¼¹¼>¤ÆSç^Jq4î™[º5ÑeÿhÀsÓ÷² ‹÷û7¬Ë‡9PñÝä.©ÓuóÉôÔ¸HíZÄFâÕ Ö+j¿ÓÛ^]¥Q¿ªK]Ä|¹‡½œ·fÎÃ|{*ŒùâBjÓV“|À¢QS«®†›•©NÚ*—óÆQf,hÓµm1(7pÿ2 ôFPSÃÅä3hý«Ö˜³V~@u;¾SqÇ"Ðר68®Óþ|i±ïy€Gá㣶 A’¨ oX_£ÚY'U=ÞV?€.XÿMWßrsQ¢XÈïÞ¹ò Þ ËcÂ5-¢9ãF Ã*ÍI‘}^Fã‘/ÆÆLÄ|¢0ëÆL`|Æ„ô’9Aïã(T`4tg[Æ’µ/×ûôªœ„^/¥ho Ý ½œÌFkÁ`_Áª€¥ÕûUÖªØ*@gúÿo{è;KâÝÍp± |ËoÙ…R¤/Wù£Äp¹(ÎXßVXç £ãê¯ë/u\µCdVêê„xk¥)u#ÚñµAì}RQñÝ;&«Ïôpl}+.ù³Çߣ3©ªSds¤:ã× ·5tÏ "OmqFHkE¾ì„»(Dr²„J7ð.^<Á¶ó”¨OjM`Íá‡m>”«YT^pÝÒ&_BÁ 9Zæäy|eŠËâ ¨-Îɂֿæþâ;&I‘(æýèW±†¸l‚q~OòD«ŸN•ø_þð¬õÅ+è†õ"sÎHäÊì‡ýpó£\ê2wð`hôGÀ˰# g´úÆ:Œá¹kå’Y÷ãPAšÊ‹#­î–l‰nÚÝå,XD‡óAè…ü}ÉÏTNÙ‹uÀ/ÌŸq›WqYkSô:—TÕÞ‡I4÷Ôˆ²/¯(f‡k„¯HG«­HX (•²PÉ–%oÆ• Ÿ¹¶™Vl<Ÿí»e@§¼üíx+g‹ÈÂSËßt¥»Ø.§‘E0z0,3:6zø5¯X.|_Pönöª‹.m¡ÅïDÏ3¾ÔO<_ùlÇ,o¶FØülÐÿz† Ö4ƒŸŠ3©Æj Ðìb>jÛ ' Fjüq^J5_ò3ûù¶-ìÑýÆé]%×â/0Û<Å  :Õr) Üéó„áfyŠ¡G^·<ƒ†„=‡–ánXEœO:2ŽkÉs©ÔB’ U­K¹¨øEIWeüí*¯¸–ñé-žþ•[&ÏœÕR´|ê3u¬CLÃ^” 4Bcºí ,…"r@ÀHµï@`ñõVÄQ‹ Iª_2u6ïɇ宄Ô!nù²Í¯; \y™Ëj#á\!3fý}™‘?†Ëûpøß ‰äm F5hN™{p‹ÓëÎÒJuœåÒB=—Ò2e£…Ó4MIÌTQG%æ0T=~ô¶7«˜vÅʈCò! LÝå®Ë$:¿²Õ¸]Ba°½ˆ:‰¨pFÒ”2’›sgýË{4>z¶ ë YUóÆÖ¬jƒ‘|òŠk“üÁphlæ<»îljXPÕ‡Œ+¡j°)XTÀéù¶òe¼½Ç]û>BZ¦­è˜ ™Õ^ƒ®r:"ªþ!,É‘oìÃå´èë¾À˜´ú#8QÌÚ2k^¦ HIW\Ô#…ʫĞvW> Æì #ç¨Ü'’£§¤ÛŒ¯Óûë˜ïAšœ˜Tm:¼Àþ’dÆPÊþ¯ ÷üO4¡~ɦU·µI¦ÛÆÔ´”®eÑD_ï¬Ðï\Ú ëY¹¾b¼ 1c¯TÕà‡{…ÖQTªQåþ|*8ª$ˆk/9¢¦Å,mì[h0|ÄILj)§òߦÚQÈîw”6äÌáÎC}‡%8Ha²rEÆÜ}›‰eNxga‚ïoø@ºðcù²iY¨§ [÷t´Ìo°eã(`Q>Zô«hÍ^K¢(µ…°h¸þÄPfA¼ ÛÔo;XÀ”8‡•Qt%—%+¯ûH4 $i­ê‚FG¹5pC˜7}¸Ê0_»(å@ƒ¶‹;•IBë9Q!¥\ƒèE×o£1$7î}¡ïò˜èzR¾®Cvƻ͹Ί/f§[˺ š ØøoÙTØÏ ™‹ÖÉßK©Æ&\`v)U¦-]ý*w—ÒÏ>sH¸ÈD!ÀM`ÈE/qȃïÃäKŒt¢QxYû¢æÝäsÁm™"¤f\ün†ÂJƒüEæy ³ ¼9çtŽœ ‚“ê“ó(ùæÖ©˜^â¤ÆæhŸ¯GS¾ï}‘Ç´9/-òV_~iBÞ(P°§ÊBaË«©aD)€¥S¨ÖÀ ÑÏ™‘ÀB|ÁЭºH†ÑzUmà™Ë‰!e¯ÑŸËþåuÆEøó¼ªNv“ÚÒkŽåØøù0#ÈLJ‘P<ÙÈŸužÛæÊ~hÿÉÊðPYeŒWŽ#¯ÚºÆÿê†(5P¡ Bx|[’­HÊ•“”Ù™-œfÄ7^ÓJ·,†ñ¥éI´©0<&ŸÔ5óÄñØ}ÝוÙEx=ϵLÆPM¼®9¼¾ì¤ôØùÚ}wCk³úY˜ô*>Ùã98 ñÀ%3ÄK±ÓÚ&査²0ë‚©KoÜ-c•öQm|2dD2o œ¶¡Ôü¥vëéF©n‘ØîÎpKÐh6ðÏKGØD(V ªk~é¨K4 #nq…ÃW ¡¨Ë È#\ ½>§‰§²@Šmö¸Ûhƒ³=Z®5! J|¤®ŽŸâ`÷Ï!¼ðÔ]†ñtËmòvKý´|,½ƒÙ$įÜ_;Úw[Ç(MþÞªRÜY¬UuE€¥WCèAHV¢f[ÙÝv~XaêªÌ¿îÎo UõiQ4^FÈ\̪Ø­“ÁÐNHÇÍm4ák¡ëÕñV·‘NH¶³Á^hqn ¿eŒâd˜CP5© $LJ8¸×ºãž@ßø%›Æé”Ü—Ý¡¯êÕu˜Ôx«`þÉr6¶j¢I¸¯UÑŠ&4±ÑFG¬^$Rw9»¥zÝP˜+~ãêœßÜ$FÀòbšY™®TÜ~­5Ãâ+…Oå}I”ùÃvšÞI!zK§ÖóK˜ú8d¹¯ÕÙ"š›NB€fº£ˆ˜QN-QŬærÌ^žüQyD‘íá“Á@Ö:ú¯æÎÐt™ Aꛪ~éÄGFºž 3!pOÚS{¯*]ß#l‘õ ö Ĝ޴D [éMž Yžã¼SVã¾gˆ'5ã,5:þšôh€ä¶³x>"YÀ‘H°ä;+ý(C”|¿Iw„Úmx¬gí/êè¼1áoèc^Í|¼f"Ò ,OäWW‘ªÐ #6¿‰û*(Ȳ‰‘#WlVFz|c®ÑNÈz=#´îQ/f³Ö®ÚlÓx¨Œ@2ÉÇ› ìQJ©ÍM'CïxkôÙþdv¼‰n7IùZ4 :»À¹hÓ, €[-xß÷IuƒFµCƒtÞÜ8¾ ÞñÔ’ÏŸYú>¼|o"ýëÇ…C¶ãv.|ôä<£2žm£îˆ$ û€*^²{xÝKé>J| ê‚n£GÒÇB{ü™ŒèV§Õv\¦ë¡ÏkDâ+É\ƒK¨ ÖS\«G„VþBG"„$)ÔÎR³„³åÅh¯ÓÁ‡šV€—û¨m(knÿ‹Äò—Ð4åê9Ç[ A¯I¯n‰UQìà®!WnÝ—À T‹‡CUA“°J\Á…KuXd—”pÔMU¸K¢^°Lâ,šf| k(þ=EàÕÐ9?ÑɃݬôÆuéžÚbhþ‰,祫J瓤ã7œ/N êiÙ^§+#¾”­©4²ö¡ÑéöÙdûæ÷ÜBjYüšà_Ð |»÷€Y„Á7ïìó€Í°ŽÞg:pqN-~CÓ¯o¬ø Þw$]#rˆ2iÁ‚•—i¡½‡Ÿâœ“³—¾gN4DLFÚH0èkØÒÆB “ò‚h;úØ5 üXÜ3™” Òæ’dÙ<‰ ’ƒ‰=ùc$Úö·ÄËOµv~›XhäóŠUƒÔñ¶3‹6™£~× /dVÒßâ¡|ê²už”LpèÊÈén= ]f]'Âb`–\rjGÁ Ñålû^Å‚öXëÏ~™½¶æD\;½ûö¯Ó.ú/®Å°¦QrEiIÅGjAÞ˜ƒëCþ6®=n°$*a±ƒÅñŽ(Ϻ*ѵxʈ›mWFÌŸfO¦“‡YuC5Ÿ(Ô2‚É5-ZP¨4Ê‹¨º?(¹i˜¬I¯“ÚGÿ¶¡–Z9®ý+ }«8ý1 ˪–öúñFÎEIBì^µ×Ç™8>hx(o‘áÅ-5#¿ÏÂq‡‡#?Ü£C7–ñw@?„‰»{»{Ù´`vó)(ÆQ9MƒÂ*ƒÚhŒŠÂ‹‘|~§Nb£'+º1ŸîûS·IyÇmÔ@žó¯Ê .ÆóžEn™S¢^âÏ –š/cn%ä¸Jc´ëȽ±7¹?‚üÏe¾Ïp‰zžu)a-QíÌ›§|ûj§ÇNŒH'H Ò·†QODjªÂ)·Ç7µ-9cÕÛa?’†ë0ÓéÅÃ2ƒ¹rvvRÒiC‚\ @Õ̉Øù ”?êUÐÞp~@<ð¤8ý$»mþ  Gpß “Ó)--ûfÔî9N¤*ÊÇ› ß ¦©`‚ê» ¢”VÜn˜?_àÊ!ïiÂ+àâ@Véî“ÑÚòa=Y~V12 ÛL˵|™G—É᣻ÙL_yµ­ä/´„;ø¶ÐlNfc²8§ ºü²…_X›kR$—äeË”j²ˆK’üºýœäô"î^eógw¦;øÕ¡biöŒW¸ð{°€–ZG |–;µ%ÆÈç~¶óżÜ_T~ä€ÍöѰ9‚ÁO™ZŒ-dTTõOŒîñ•F(Sqçª9 sÇñ~·ÑšEÁt›ô$tÞ+:‘lÁ04¨‹ën?U,,ÐWRÉk—Îv€åžôÞÕ¨ÇìÌAb=_ç"ïˆ+̽ŸˆöB ;TûÁ¿/ö«Ïgò.מÃ0 j4ŸbÌaë¡7‹¢DØâu‡4Xš€ýZ{YI̓°þ&¬%¸ìÁ ïå•ÿ•ÞßAp´í³ß²®«€H¤Ô‚y¹8”E>© žÑ•Ý )Èt³‘ŽÌ:/…ÍLk±þ“¢qžõ=€Œ)ù×LªÔí#ßÀ9¬ÄEÕ~Ul«ÙËœ&HMÈ-9 ²9+ô1/ˆ°à£í‹¦²L¾½å;ÉãHdlð‡!×¹1¼z±æS²"_@ë[s¸{ ? ˜òJªãÉGI§¼_86ä8Ÿw¸'ÔU]jP§8¹.sÙœ#ßsÓê4ñìþ§YXÒ€fC×|éU½ ­TI<šÔ7ƒ#¾­”%“˜ N"C‚8Tàk¿z˜Ñi=܆ ï|ª¥0·x1®VÏ×°ªè0ÉcŸK‘ØOqÚ"3Æû)HMqö—_o -Ø:L^ï¿G`÷mo~pÛÖ.îe|ËCJ)¤B¬c ~yï}ŠÊÜÔ>ú þ¬Lð'¹e=šÉ$Ľ×Ã2»Á0…kø†Ãç‹H»QrÖêLˆ,þ”í0›r®Î!`=†Fâ“™²ƒ2µ°V›˜CòSVl1öšˆõ€ê6¢ ìľ@0^–œ½7@›ˆŠYÍÉÔuβ+À³/ðHË˨Þ>Fê7õµá ù D¤§žÿ§>›!Ñ‹˜,î(ËEkEKWSÿ¦òŒáÒΊDå‘§Ì›N‹ }b®sïÂF{q¬'µ!cÏ ÝÈ2CKÂá eüž÷ñî Y¼MîÔ¢ÓÆ3¡€8„~?_›?ÊK¢a_°&ûnðBV?Ze8W¼É"˸°·B´Y÷ÍÍúÒ0jûœÙ;¢Tþgö™ JDÖÛ_è9ëPϹ¨¹Ug€,—Í7kë\–CEÄÝùC“ñZ¢ìý:Y×d“;¶óxwN›§”QJ;tgT™2PSôú˜Ößrá§Ÿ%Ú ·íy=ÙµP·+¢E£³Ø~’hVuŽºÎY‰…œ@_I_ÛP&]âT"Dþ‚U( õKÎuÒ‚ÐðzߟW©“z2ÃÍù4¢Ë,ÑÒa… ƒxg±;k,-¸Ä7Nh€Gżæàyl¹Æ¶¾†K<ÎpÍhÇöŽë³áòþ+÷”rœ†9ÿ|†”ƒ–€¯¡Þ%»c÷*aຸ5 ÞÔŸÜâ°§Æ[¨,«ð±îQ,lŽå§:P µ¤·?&ŸÇÇçT{kž¬7Œ–U,7h6´É;2#š§®GÞá' ¢ô r¶XØUiñ"ê Ób[çæô~ÁùgŽ‘$ {XBÅq Ó¾Ô6[½½·Jt¹ô@_w¦O®îõ}Åd‡+ù„¼#•7s±áEEjDåî4ëANƃ8¼¼ Äÿù,¯>ÌK— UÎâ1¾…—›¥MÍ ¥À…¸ÌÐÜôwÞqMòã»!ÏŒºÌ̱JaëSÒ`2çoÖøÍ™^èqûR¿:°w[Lpr½ïq.K0Q±,þYÒ(dÃÔ ô6@å:E=ö&Ž>©°Ý·+äÀa9|†°Ù^öyp›Aâ-Ïõ‚z–=g?ë*LUó¹Ýr™©±u:­b•^TgYz›æS^Ÿ’ÂM ¸88!¼Iää”"»¨ ×̬LŒ£½À¾ÞàÞKÁ2aÙ¼­dT4Q·±ænë‘ðÇ“L’{$þó>—oo/jšÙ¼'ìåïOš”PªÏ­H1.A)uwú ¯U=ÅäÅb(kÒ¯—³þ‡‡ Ó™¾fø¦“íöÖ„ûGÒY`£·l×Hðæ§y3©†`’ràž)Ü›EŸ‰xä0V ÄÝ ÷d„ÎÃmŒ89ï9(ÝbuëVbˆ¤‡):›å%¿Þ‰Åí÷õ’ ³9oµVáKµÐ ÑÚ¬X…{ˆãý¯¨žMÉxÉ­G$ë_ñIÎok±«Z &0B£-È´÷NQ(]?x‘/¥Ëßi„Ñ"uï 0bæÄžQ Žœa£­èr°Ý… ¤ží¹á­¥ág]íÓ:(àw–!µÔÅ™GsÈâÞ´¶â)˜IŒ¡!‹ }cÄ+êd RÉÒ £½&ª"a$/tñ6éÄ’Wn-©ÆL ¢0åʼ*À½awäÙ„ú`ˆ"»&XénüÉ!ŸÂá†îQ2a˜Ȱ'YYÓ´@H“šøðî ¤ùÍmÓÅøº¢ºÐæcÓ[ô‚7c‹öU™‘Ð*• ®b©æy1rj«pü nÓ³ak¡ÔÁÏ~"P€Ñç~:msÓ`÷ó¼17•â'<»oO¢ âÿðù³Øá¨Ù@~èÏÿÕˆb‘j-³—ƒ‡2b†›ç×!±”f!jÑÃr<Þì…¨n¬:JŠLÿ·KjÊ65LíI3:y¿ö9yžñ+»¬«þƒÂ Êܘ‘YRKIÅ@?°ó¬ŸËYø Oµç£ @·ƒ6ƒdXÖÎŒ Xg¯]ÿïâÄŽnJ*Ò s‘¤p„°†¸ƒûCæ§Ìºrß6ã¯æ?Ø*“²¯™SÎ5žD­ÝðŠè<…—QÈ$†·reÉrŸlÆQÅFvË>¶=5e½)c9îøœ×šÉßi±¢¤›ûŒþæÊÇ5ˆO>™Ç-ÎNÂ-ö”Y.U„;¥èëÔ1•{'/dtÍ §9\d½îxr!V€C­Ò°û£GùVmg`ÔìrÎFø=›h¦ˆb)¶}›~!¬_‹£%Ë~•iP ü ¿^³ JU²œiŽ»ï•{‹ÚöK~£bwéþ¡ÏU~™˜¸ K®#!™ðÁ²bžVw¦‹Šõ€ o¡x>ÙÙ¡-òiÐz/,6È W)q°€º–¢ èÑ®»]þCIrÄ$]q®W0r¨P~ñN<®C`ØYô´ÄJø“b@©ÂúÞ2–û°={ßbõät,ñ,ãg¯Eý qåL!^9jKD—9}”Åv%!’f bPåoyÿWLX…ý×NžÈ§‡k9ÕH_Ƶ‡ç4ØmÓôŸîÂ3«9³ÈM_Iã óðØ*¿ÌV øn¥œé½A' Ú'X¸-e˜´Ä206'†]µÇÌ¢o]—@©I•"7h"{×ÍëvH ÉޅЗÎlŠ‘ÉIsâRÃÛ Ù%¯t»èsSü"”¿ñ“àÓ3ì?ÉÙ“ñƘ]ü–ì|ÇðÕ[wnÕF¢;íƒ~vD¹Ð­7˜lØ1"f^FB³`Úàž!2©ãïÜ#û|ãGo‚‘fØY5žL;ôÿ‘¤5hóÝ9Ê…¨:‰wy¶äÞÛÚæEHêºÕ JëÍL¨¥%ûÕ–sÿ! dù<€Ãl©5 ÓFê‡Ù@¦Ø¥`F ¹¡P»»þ ]¯;}Š@q87AoI¹nE2)\ÕO¦7`:û@]ÍÉSjJ“G6Þ|Éœ¿y0ª•©BÂtX¹Rž©‚Ç$*é…z_$è@m‚w½Õç _ÿVîµ 'R#E*éŸøŽ½áq0O’xià7ÏR? ¾ö9T4…k…°Œ»ib)þÌìRyœ˜û7Ã$6§Z­E^™iWGÄ›úbËÑz˜¾A‘ö jšƒï¡ai·õ"ÂÐþ²lqY3Ùß aˆL,Å 3+$¡ù¨ü×àûóØ.¡sçeRúgRL!®2WL3f% ‘¹øO°SƒÛÁµC5Z=ø]êOELe¢ªªŠ?`‰E« ?gH!S€PsFÃј„0š³+–©6ÊöÕöÝÚ±A ^õ‚è÷õï7H°¯XãeÎvÛI×¥‚/@D2á…æ7L|Fq §‰¬-Jêí²ÍÖ´ ¬öìÁhë­(í+·€œ¢²ô·dÕßP]À ^0_ûvÅ…Ÿİyí÷ï'U³¢Lª?Ѿ)gÓˆ¾9²¡¾=ÞÇà럋˜¦–M6WÐŽÏi€¹<¢J$5Í8ËúJ ”gý*| zûbf9'½ý>µãLX-&rS¡¢ó%—¦VŽ1(¥ô©¹V'+Š;ê0õ=ªJj-al³?æ]np~R…gûn£"BÿûŠYd|v½ Σc®¥þ{]k×çÔŒ+~°qÿæ1"?‹ãËãnÁÂÒñ+¶Z°Ö|_å<6ü–[<ÕŸöÓa ÏwW6†{w-óQ“l{£‚¾Ð}Š$¿Eœ¶¼@ï¾Ìf¬OU9²)‚ílE^}©ºt;ƒŸ¼žõ ˜.R1'Ð<ÉÎP]uߊ&£9Ã)m2éúä™Ú·;ÝûÓ£’†§ OÛ~Áˆ_ö­£-÷W5Ü.…$JGh'=ÝÂZGµ">þöûÈÿ%^X+û—<â’0²"d©aM:Unr1ÚAW È­{æƒûkfÚüy=FlÓÐU.³Ý„ÞÏÛ;Ò‰\˜ç½u ìßÕ}¿>ŒâLbi|­÷»¸êñ¢Â¶Rê–8±/ÈÛÔQÙYUÂa0rVæQÌ r®"gäKºòúþ‹×ò¯žÞL#ÃU·hÛ]„gà?–Ì?ìè³¢ Ïe”T"ï: ï¶•—)z©l10íÑ܈JˆQuàQØ»­¼ð#°…"i\bÍèô98¦ÀHQ·Qi/,ï+Ð^ˆ8úÁî©Å­C[àª<‰xm˜¬›)¶¦Ò™¹´e¶dåyZ}ÅŸ½RZ¦ô—™ÙŸÃµútóœéH–?g+Nt]ê{%«î³ÉÃl s#0k#b» -w^­?Ù£‹Ÿñuë†{“µ&g^·øc½n°2Ql70²¹Í°ø<¼%ØÐrîŒ6BhÄôÞ SµÂM:>TØ2帹v¬~ôB·Ð5¸ºNÝÃlld‰ˆ!'d%?/f&,îp/ã*˜<­³ñô|×û6íÁðûƵ&óeGCµX+êuH5ð{Kâ8GÕ´ö|èÛ³ÿ”Å>§ñ¼rÆ”ZEÉc˜¯¿„åõR-úQ tìCtÓS›½7°’1YT9–ï¾êÕëàˆhþ€øíö` YïSÆ UÅÈ>ßaµÏI³Â†Öô÷Ë‹?‡eÅO\ú>Bq]Ñ-¼ô©÷T¶«ð¢³k¡Ñªh{(ìÅÝdp#Åfm,³¿¯Dk”) ê{K-øŸ¦¶“¾÷–%CföþZäy(Ì•²R‡±SØ^óÑ4ÌÙPø]KŽC› &®ò„ŽÐ»‡´ìÏ2(º7RÓÕ]ÑÄ Ù„ó´¯ÿN¤ Ì endstream endobj 126 0 obj << /Type /FontDescriptor /FontName /VGTRPZ+URWPalladioL-Ital /Flags 4 /FontBBox [-170 -305 1010 941] /Ascent 722 /CapHeight 693 /Descent -261 /ItalicAngle -9 /StemV 78 /XHeight 482 /CharSet (/A/C/D/E/H/I/L/M/N/O/P/R/S/T/a/b/c/colon/comma/d/e/f/g/h/i/j/k/l/m/n/numbersign/o/one/p/parenleft/parenright/period/quoteright/r/s/slash/t/two/u/v/w/x/y/z/zero) /FontFile 125 0 R >> endobj 75 0 obj << /Type /Encoding /Differences [2/fi/fl 35/numbersign/dollar 39/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W 89/Y 91/bracketleft 93/bracketright 95/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 136/circumflex 150/endash 168/dieresis 180/acute] >> endobj 18 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ALMMEG+CMEX10 /FontDescriptor 94 0 R /FirstChar 0 /LastChar 88 /Widths 82 0 R >> endobj 13 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ILWWVQ+CMMI10 /FontDescriptor 96 0 R /FirstChar 21 /LastChar 122 /Widths 87 0 R >> endobj 16 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RMHRGR+CMMI6 /FontDescriptor 98 0 R /FirstChar 73 /LastChar 120 /Widths 84 0 R >> endobj 12 0 obj << /Type /Font /Subtype /Type1 /BaseFont /HMBPPJ+CMMI8 /FontDescriptor 100 0 R /FirstChar 21 /LastChar 120 /Widths 88 0 R >> endobj 11 0 obj << /Type /Font /Subtype /Type1 /BaseFont /LCTQYL+CMR10 /FontDescriptor 102 0 R /FirstChar 1 /LastChar 116 /Widths 89 0 R >> endobj 20 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GBCRXR+CMR6 /FontDescriptor 104 0 R /FirstChar 48 /LastChar 48 /Widths 80 0 R >> endobj 17 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FZJFMW+CMR8 /FontDescriptor 106 0 R /FirstChar 40 /LastChar 61 /Widths 83 0 R >> endobj 14 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KJFOJU+CMSY10 /FontDescriptor 108 0 R /FirstChar 0 /LastChar 114 /Widths 86 0 R >> endobj 19 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GUOWTK+CMSY6 /FontDescriptor 110 0 R /FirstChar 3 /LastChar 3 /Widths 81 0 R >> endobj 21 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XYBSMX+CMSY8 /FontDescriptor 112 0 R /FirstChar 0 /LastChar 3 /Widths 79 0 R >> endobj 15 0 obj << /Type /Font /Subtype /Type1 /BaseFont /QDTWCG+MSBM10 /FontDescriptor 114 0 R /FirstChar 82 /LastChar 82 /Widths 85 0 R >> endobj 64 0 obj << /Type /Font /Subtype /Type1 /BaseFont /WALVWL+NimbusMonL-Bold /FontDescriptor 116 0 R /FirstChar 97 /LastChar 120 /Widths 77 0 R /Encoding 75 0 R >> endobj 50 0 obj << /Type /Font /Subtype /Type1 /BaseFont /JORXYL+NimbusMonL-Regu /FontDescriptor 118 0 R /FirstChar 36 /LastChar 121 /Widths 78 0 R /Encoding 75 0 R >> endobj 6 0 obj << /Type /Font /Subtype /Type1 /BaseFont /RNAFHO+URWPalladioL-Bold /FontDescriptor 120 0 R /FirstChar 2 /LastChar 122 /Widths 90 0 R /Encoding 75 0 R >> endobj 71 0 obj << /Type /Font /Subtype /Type1 /BaseFont /YQQGFY+URWPalladioL-BoldItal /FontDescriptor 122 0 R /FirstChar 73 /LastChar 115 /Widths 76 0 R /Encoding 75 0 R >> endobj 5 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VSQAYE+URWPalladioL-Roma /FontDescriptor 124 0 R /FirstChar 2 /LastChar 180 /Widths 91 0 R /Encoding 75 0 R >> endobj 4 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VGTRPZ+URWPalladioL-Ital /FontDescriptor 126 0 R /FirstChar 35 /LastChar 122 /Widths 92 0 R /Encoding 75 0 R >> endobj 7 0 obj << /Type /Pages /Count 6 /Parent 127 0 R /Kids [2 0 R 9 0 R 23 0 R 26 0 R 29 0 R 32 0 R] >> endobj 37 0 obj << /Type /Pages /Count 6 /Parent 127 0 R /Kids [35 0 R 39 0 R 42 0 R 45 0 R 48 0 R 52 0 R] >> endobj 57 0 obj << /Type /Pages /Count 6 /Parent 127 0 R /Kids [55 0 R 59 0 R 62 0 R 66 0 R 69 0 R 73 0 R] >> endobj 127 0 obj << /Type /Pages /Count 18 /Kids [7 0 R 37 0 R 57 0 R] >> endobj 128 0 obj << /Type /Catalog /Pages 127 0 R >> endobj 129 0 obj << /Producer (pdfTeX-1.40.10) /Creator (TeX) /CreationDate (D:20110411232058+02'00') /ModDate (D:20110411232058+02'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.1415926-1.40.10-2.2 (TeX Live 2009/Debian) kpathsea version 5.0.0) >> endobj xref 0 130 0000000000 65535 f 0000001438 00000 n 0000001334 00000 n 0000000015 00000 n 0000244758 00000 n 0000244590 00000 n 0000244248 00000 n 0000244927 00000 n 0000004512 00000 n 0000004407 00000 n 0000001528 00000 n 0000242936 00000 n 0000242795 00000 n 0000242514 00000 n 0000243354 00000 n 0000243771 00000 n 0000242655 00000 n 0000243215 00000 n 0000242375 00000 n 0000243495 00000 n 0000243076 00000 n 0000243633 00000 n 0000007652 00000 n 0000007545 00000 n 0000004734 00000 n 0000010385 00000 n 0000010278 00000 n 0000007805 00000 n 0000012161 00000 n 0000012054 00000 n 0000010548 00000 n 0000014889 00000 n 0000014782 00000 n 0000012290 00000 n 0000018200 00000 n 0000018092 00000 n 0000015064 00000 n 0000245034 00000 n 0000020704 00000 n 0000020596 00000 n 0000018339 00000 n 0000023374 00000 n 0000023266 00000 n 0000020819 00000 n 0000026997 00000 n 0000026889 00000 n 0000023465 00000 n 0000030351 00000 n 0000030243 00000 n 0000027100 00000 n 0000244080 00000 n 0000033078 00000 n 0000032970 00000 n 0000030527 00000 n 0000035860 00000 n 0000035752 00000 n 0000033205 00000 n 0000245144 00000 n 0000037731 00000 n 0000037623 00000 n 0000035975 00000 n 0000041191 00000 n 0000041083 00000 n 0000037834 00000 n 0000243912 00000 n 0000042467 00000 n 0000042359 00000 n 0000041354 00000 n 0000045938 00000 n 0000045830 00000 n 0000042558 00000 n 0000244416 00000 n 0000046983 00000 n 0000046875 00000 n 0000046101 00000 n 0000241933 00000 n 0000047111 00000 n 0000047302 00000 n 0000047416 00000 n 0000047778 00000 n 0000047820 00000 n 0000047844 00000 n 0000047868 00000 n 0000048413 00000 n 0000048563 00000 n 0000048870 00000 n 0000048894 00000 n 0000049551 00000 n 0000050129 00000 n 0000050747 00000 n 0000051391 00000 n 0000051867 00000 n 0000052553 00000 n 0000052923 00000 n 0000060801 00000 n 0000061146 00000 n 0000075220 00000 n 0000075526 00000 n 0000083651 00000 n 0000083877 00000 n 0000095283 00000 n 0000095570 00000 n 0000107592 00000 n 0000107928 00000 n 0000114935 00000 n 0000115156 00000 n 0000123723 00000 n 0000124005 00000 n 0000132961 00000 n 0000133303 00000 n 0000140470 00000 n 0000140701 00000 n 0000147909 00000 n 0000148147 00000 n 0000150457 00000 n 0000150674 00000 n 0000160006 00000 n 0000160275 00000 n 0000172819 00000 n 0000173160 00000 n 0000192974 00000 n 0000193360 00000 n 0000200780 00000 n 0000201028 00000 n 0000224740 00000 n 0000225267 00000 n 0000241543 00000 n 0000245254 00000 n 0000245328 00000 n 0000245381 00000 n trailer << /Size 130 /Root 128 0 R /Info 129 0 R /ID [<2C37EEE33A1BD96532BA13A6B5C30019> <2C37EEE33A1BD96532BA13A6B5C30019>] >> startxref 245648 %%EOF coinor-ipopt-3.14.17/contrib/sIPOPT/doc/sipopt_manual.tex000066400000000000000000001066331473776672200232270ustar00rootroot00000000000000\documentclass[letter, 11pt]{article} % \usepackage[utf8]{inputenc} \usepackage{amsmath} \usepackage{amsfonts} \usepackage{amssymb} \usepackage{graphicx} \usepackage[listofformat=subparens]{subfig} \usepackage{setspace} \usepackage{theorem} \usepackage{palatino} % Bibliography related \def\BIBand{and} \usepackage[numbers,sort]{natbib} %\bibliographystyle{achemso} \bibliographystyle{iecrv5} \usepackage{natmove} \usepackage[top=3cm,bottom=3cm,left=1.8cm,right=1.8cm,centering]{geometry} % proposal \newcommand{\RR}{{\mathbb{R}}} \newcommand{\vect}[1]{{\left[\begin{array}{c} #1 \end{array}\right]}} \newcommand{\matr}[2]{{\left[\begin{array}{#1} #2 \end{array}\right]}} \newtheorem{property}{Property} \newtheorem{definition}{Definition} \usepackage{setspace} \usepackage{listings} \renewcommand{\lstlistingname}{Code Listing} \lstset{aboveskip=22pt,belowskip=22pt} \usepackage{array,multirow} \newcommand{\sensKKT}{\emph{sIPOPT}} \newcommand{\AMPL}{AMPL} % Citation related \newcommand{\citetcomma}[1]{\citeauthor{#1},\cite{#1}\ } \newcommand{\citetperiod}[1]{\citeauthor{#1}.\cite{#1}\ } \newcommand{\citetfcomma}[1]{\citeauthor{#1}.\cite{#1}\ } \newcommand{\parens}[1]{\ensuremath{\left( #1 \right)}} \newcommand{\bracs}[1]{\ensuremath{\left[ #1 \right]}} \newcommand{\curls}[1]{\ensuremath{\left\{ #1 \right\}}} \newcommand{\bars}[1]{\ensuremath{\left\| #1 \right\|}} \newcommand{\func}[2]{\ensuremath{ #1\parens{#2} }} \newcommand{\norms}[2]{\ensuremath{ \bars{#1}_{#2} }} \newcommand{\expect}[1]{\ensuremath{\mathbb{E}\bracs{#1}}} \newcommand{\expectc}[1]{\ensuremath{\mathbb{E}\curls{#1}}} % Folders and directories \newcommand{\ipoptf}{\$IPOPT} %\newcommand{\sensdir}{AsNMPC} %\newcommand{\sensexe}{ampl\_asnmpc} %\newcommand{\senslib}{libasnmpc} \newcommand{\sensdir}{sIPOPT} \newcommand{\sensexe}{ipopt\_sens} \newcommand{\senslib}{libsipopt} % options and suffixes %\newcommand{\runaskkt}{run\_nmpc} %\newcommand{\statez}{nmpc\_state\_0} %\newcommand{\stateo}{nmpc\_state\_1} %\newcommand{\statevo}{nmpc\_state\_value\_1} %\newcommand{\initc}{nmpc\_init\_constr} % %\newcommand{\sstateo}{nmpc\_sol\_state\_1} %\newcommand{\sstatezl}{nmpc\_sol\_state\_1\_z\_L} %\newcommand{\sstatezu}{nmpc\_sol\_state\_1\_z\_U} % %\newcommand{\redhessopt}{compute\_red\_hessian} %\newcommand{\redhess}{red\_hessian} % %\newcommand{\selectstep}{select\_step} % %\newcommand{\nstepsopt}{n\_nmpc\_steps} %\newcommand{\boundcheckopt}{nmpc\_boundcheck} %\newcommand{\boundepsopt}{nmpc\_bound\_eps} %\newcommand{\maxpdpertopt}{nmpc\_max\_pdpert} %\newcommand{\eigendecompopt}{rh\_eigendecomp} \newcommand{\runaskkt}{run\_sens} \newcommand{\statez}{sens\_state\_0} \newcommand{\stateo}{sens\_state\_1} \newcommand{\statevo}{sens\_state\_value\_1} \newcommand{\initc}{sens\_init\_constr} \newcommand{\sstateo}{sens\_sol\_state\_1} \newcommand{\sstatezl}{sens\_sol\_state\_1\_z\_L} \newcommand{\sstatezu}{sens\_sol\_state\_1\_z\_U} \newcommand{\statei}[1]{sens\_state\_#1} \newcommand{\statevi}[1]{sens\_state\_value\_#1} \newcommand{\sstatei}[1]{sens\_sol\_state\_#1} \newcommand{\sstatezli}[1]{sens\_sol\_state\_#1\_z\_L} \newcommand{\sstatezui}[1]{sens\_sol\_state\_#1\_z\_U} \newcommand{\redhessopt}{compute\_red\_hessian} \newcommand{\redhess}{red\_hessian} \newcommand{\selectstep}{select\_step} \newcommand{\nstepsopt}{n\_sens\_steps} \newcommand{\boundcheckopt}{sens\_boundcheck} \newcommand{\boundepsopt}{sens\_bound\_eps} \newcommand{\maxpdpertopt}{sens\_max\_pdpert} \newcommand{\eigendecompopt}{rh\_eigendecomp} \newcommand{\senskktresiduals}{sens\_kkt\_residuals} \newcommand{\allowinex}{sens\_allow\_inexact\_backsolve} % Define ampl language for listings \lstdefinelanguage{ampl} { alsoletter={.,:, >, <, =}, morekeywords={param, var, minimize, maximize, let, solve, display, printf, suffix, reset, subject, to, options, option, =,:=, >=, <=, s.t., IN, OUT}, sensitive=false, morecomment=[l]{\#}, morecomment=[s]{/*}{*/} } \title{ \sensKKT\ Reference Manual} \author{Hans Pirnay, Rodrigo L\'opez-Negrete, and Lorenz T. Biegler \\ Chemical Engineering Department \\ Carnegie Mellon University \\ Pittsburgh, PA 15213} \begin{document} \maketitle \tableofcontents %\newpage \section{Introduction} \onehalfspacing Sensitivity of nonlinear programming problems is a key step in any optimization study. Sensitivity provides information on regularity and curvature conditions at KKT points, assesses which variables play dominant roles in the optimization, and provides first order estimates for parametric nonlinear programs. Moreover, for NLP algorithms that use exact second derivatives, sensitivity can be implemented very efficiently within NLP solvers and provide valuable information with very little added computation. This implementation provides IPOPT with the capabilities to calculate sensitivities, and approximate perturbed solutions with them. The basic sensitivity strategy implemented here is based on the application of the Implicit Function Theorem (IFT) to the KKT conditions of the NLP. As shown in \citet{Fiacco1983}, sensitivities can be obtained from a solution with suitable regularity conditions merely by solving a linearization of the KKT conditions. In \citet{pirnay:2011} we have extended these results to the barrier penalty method implemented in IPOPT. In the following subsections we have summarized the main concepts in the paper. \subsection{Barrier Sensitivity} \label{sec:barrier} Consider the parametric nonlinear program of the form: \begin{subequations} \label{NLPsens} \begin{eqnarray} &\min_x & f(x; p) \\ &\mbox{s.t.} & c(x; p) = 0, x \geq 0 \end{eqnarray} \end{subequations} \noindent with the vectors $x \in \mathbb{R}^{n_x}$, $p \in \mathbb{R}^{n_p}$, and $c(x; p): \mathbb{R}^{n_x+n_p} \to \mathbb{R}^{m}$. Without loss of generality, only the variables $x$ have been assumed zero or positive. However, the following derivations can be extended to the case where there are both upper and lower bounds. The IPOPT NLP algorithm substitutes a barrier function for the inequality constraints and solves the following sequence of problems with $\mu \rightarrow 0$: \begin{subequations} \label{IPNLP2} \begin{eqnarray} & \min_x & \; \; B(x; p, \mu) = f(x; p) - \mu_{\ell} \sum_{i=1}^{n_x} ln (x_i) \\ & \mbox{s.t.} & c(x; p) = 0 \end{eqnarray} \end{subequations} At a solution with $p = p_0$ (the nominal value) we compute the sensitivities $\frac{d x^{*}(p_0)}{dp}$ and $\frac{df(x^*; p_0)}{d p} = \frac{\partial f(x^*; p_0)}{\partial p} + \frac{d x(p_0)}{d p}\frac{\partial f(x^*; p_0)}{\partial x}$. To calculate these sensitivities, we first consider properties of the solutions of (\ref{NLPsens}) obtained by IPOPT when $p = p_0$ \cite{Fiacco1983,forsgren}. For NLP (\ref{NLPsens}), the Karush-Kuhn-Tucker (KKT) conditions are defined as: \begin{subequations}\label{kktc} \begin{eqnarray} & \nabla_x L(x^*, \lambda^*, \nu^*; p_0) = \nabla_x f(x^*; p_0) + \nabla_x c(x^*; p_0)\lambda^* - \nu^* = 0 \\ & c(x^*; p_0) = 0 \\ & 0 \leq \nu^* \perp x^* \geq 0 \end{eqnarray} \end{subequations} For the KKT conditions to serve as necessary conditions for a local minimum of (\ref{NLPsens}), constraint qualifications are needed, such as Linear Independence Constraint Qualification (LICQ) or Mangasarian-Fromowitz Constraint Qualification (MFCQ). Definitions of these regularity conditions may be found in \citet{larrybook}, \citet{nocedalbook}, or \citet{Fiacco1983}. Calculation of the sensitivity of the primal and dual variables with respect to $p$ now proceeds from the implicit function theorem (IFT) applied to the optimality conditions of (\ref{IPNLP2}) at $p_0$. Defining the quantities: \begin{equation} \label{mdef} M(s(\mu; p_0)) = \matr{ccc}{ \func{W}{\func{s}{\mu;p_0}} & \func{A}{\func{x}{\mu;p_0}} & -I\\ \func{A}{\func{x}{\mu;p_0}} ^T &0 &0\\ \func{V}{\mu;p_0} &0&X(\mu; p_0)} \end{equation} \noindent and \begin{equation} \label{ndef} N_p(s(\mu; p_0)) = \vect{\nabla_{xp} L(s(\mu; p_0)) \\ \nabla_p c(x(\mu; p_0))\\ 0}, \quad N_{\mu} = \vect{0 \\ 0 \\ -\mu e} \end{equation} \noindent where $W(s(\mu; p_0))$ denotes the Hessian $\nabla_{xx} L(x ,\lambda, \nu)$ of the Lagrangian function evaluated at $s(\mu; p_0)$, $A(x(\mu; p_0)) = \nabla_{x} c(x)$ evaluated at $x(\mu; p_0)$, $X = diag\{x\}$ and $V = diag\{\nu\}$, application of IFT leads to: \begin{equation}\label{sensfiacco} M(s(\mu; p_0)) \frac{d s(\mu; p_0)}{d p}^T + N_p(s(\mu; p_0)) = 0. \end{equation} When LICQ, Strict Complementarity (SC), and SSOSC hold, $M(s(\mu; p_0))$ is nonsingular and the sensitivities can be calculated from: \begin{equation} \label{sens:1} \frac{d s(\mu; p_0)}{d p}^T = - \func{M}{\func{s}{\mu; p_0}}^{-1} \func{N_p}{ \func{s}{\mu; p_0} } . \end{equation} We note that at the solution of (\ref{IPNLP2}) these assumptions can be checked by the inertia of $M$ as well as other information in IPOPT (see \cite{Waechter2006}). Moreover, in IPOPT, $M(s(\mu; p_0))$ is directly available in factored form from the solution of (\ref{IPNLP2}), so the sensitivity can be calculated through a simple backsolve. For small values of $\mu$ and $\|p-p_0\|$ it can be shown from the above properties \cite{Fiacco1983} that \begin{equation} \label{init1} s(\mu; p) = s(\mu; p_0) - M(s(\mu; p_0))^{-1}N_p(s(\mu; p_0)) (p-p_0) + o\|p-p_0\| . %= s(0; p) + O(\mu). \end{equation} %\noindent or % %\begin{equation} \label{init2} %s(0; p) = s(\mu; p_0) - M(s(\mu; p_0))^{-1} \bracs{ N_p(s(\mu; p_0))(p-p_0) + N_{\mu}(s(\mu; p_0)) } + o\|p-p_0\| + o\| \mu \|. %\end{equation} Finally, in the way IPOPT is implemented, it cannot distinguish between variables and parameters. Thus we can make this distinction apparent by adding some artificial variables and constraints. In this way we write: \begin{subequations} \label{NLPsens2} \begin{eqnarray} & \min_{x, w} & f(x, w) \\ & \mbox{s.t.} & c(x, w) = 0, x \geq 0 \\ & & w - p_0 = 0 \end{eqnarray} \end{subequations} Note that the NLP solution is equivalent to (\ref{NLPsens}), and it is easy to see that the NLP sensitivity is equivalent as well. Writing the KKT conditions for (\ref{NLPsens2}) leads to: \begin{subequations}\label{eq:reform} \begin{eqnarray} & \nabla_x f(x, w) + \nabla_x c^T(x, w)\lambda -\nu = 0\\ & \nabla_w f(x, w) + \nabla_w c^T(x, w)\lambda + \bar{\lambda} = 0\\ & c(x) = 0 \\ & XVe =0 \\ & w - p = 0 \end{eqnarray} \end{subequations} In this definition $\bar{\lambda}$ represents the Lagrange multiplier corresponding to the equation $w - p =0$. For the Newton step we write: \begin{equation} \label{eq:reordered_K_3} \left[ \begin{array}{ccccc} W& \nabla_{xw} L(x, w, \lambda, \nu) & A & -I & 0 \\ \nabla_{wx} L(x, w, \lambda, \nu) & \nabla_{ww} L(x, w, \lambda, \nu) & \nabla_w c(x, w) & 0 & I \\ A^T& \nabla_w c(x, w)^T & 0 & 0 & 0 \\ V &0&0& X & 0 \\ 0 & I &0&0&0\\ \end{array} \right] \left[ \begin{array}{c} \Delta z\\ \Delta w \\ \Delta \lambda\\\Delta\nu\\ \Delta\bar{\lambda} \end{array} \right] = \left[ \begin{array}{c} 0 \\0 \\ 0 \\ 0 \\ \Delta p \end{array} \right]. \end{equation} Since $\Delta w = \Delta p$, the step computed by this matrix (without the second row) is the same as the optimal step stated in (\ref{sensfiacco}). \subsection{Multiple Sequential Parameter Perturbations} \label{sec:multirhs} In the derivations in the previous sections we considered changes to the parameter vector. However, in some cases we may be interested in making multiple parameter perturbations in a sequential manner. For example we may want to perturb the current solution {\func{s}{\mu; p_0}} using the parameter vectors $p_1, \ldots, p_{n_{\mbox{\tiny pert}}}$. This amounts to solving system \eqref{sensfiacco} with different right hand sides {\func{N_p}{\func{s}{\mu;p_0}}} (Eq. \eqref{ndef}). Note that, because we already have \eqref{mdef} factorized at the solution, it is very cheap to obtain the $n_{\mbox{\tiny pert}}$ sensitivities. With them and using Equation \eqref{init1} we can determine the approximated solutions {\func{s}{\mu; p_1}}, \ldots, {\func{s}{\mu; p_{n_{\mbox{\tiny pert}}}}}. \section{Usage} In the following sections we describe how the \sensKKT\ library can be used through the \AMPL\ interface. However, we also provide examples for the C++ interface in the examples folder of the distribution. To help illustrate the use of \sensKKT\ the following NLP, taken from \cite{Ganesh1987}, will be used: \begin{eqnarray} \label{eq:ex1} \min&& x_1^2+x_2^2+x_3^2\\ \mathrm{s.t.}&&6x_1+3x_2+2x_3-p_1 = 0\nonumber\\ &&p_2x_1+x_2-x_3-1 = 0\nonumber\\ &&x_1,x_2,x_3\geq 0 , \nonumber \end{eqnarray} \noindent with variables $x_1,x_2$, and $x_3$ and parameters $p_1$, and $p_2$. Since IPOPT does not distinguish variables from parameters, we reformulate the NLP as \eqref{NLPsens2} by introducing equations that fix the parameters $p_1$ and $p_2$ to their nominal values $p_{1,a}$ and $p_{2,a}$. \begin{subequations}\label{eq:exr} \begin{eqnarray} \min&& x_1^2+x_2^2+x_3^2\\ \mathrm{s.t.}&&6x_1+3x_2+2x_3-p_1 = 0\\ &&p_2x_1+x_2-x_3-1 = 0\\ &&p_1 = p_{1,a}\\ &&p_2 = p_{2,a}\\ &&x_1,x_2,x_3\geq 0. \end{eqnarray} \end{subequations} For \eqref{eq:exr}, the KKT conditions are: \begin{eqnarray} \label{eq:exr:kkt} 2x_1+6\lambda_1+p_2\lambda_2-\nu_1 &=& 0\\ 2x_2+3\lambda_1+\lambda_2-\nu_2&=& 0\\ 2x_3+2\lambda_1-\lambda_2-\nu_3 &=&0\\ -\lambda_1+\lambda_3&=&0\\ \lambda_2x_1+\lambda_4&=&0\\ 6x_1+3x_2+2x_3-p_1 &=&0\\ p_2x_1+x_2-x_3-1 &=&0\\ p_1-p_{1,a}&=&0\\ p_2-p_{2,a}&=&0\\ \nu_1x_1-\mu &=& 0\\ \nu_2x_2-\mu&=& 0\\ \nu_3x_3-\mu&=& 0\\ x_1,x_2,x_3,\nu_1,\nu_2,\nu_3&\geq& 0, \end{eqnarray} \noindent and the corresponding Newton step is \begin{equation} \label{eq:exr:newton} \left[ \begin{array}{cccccccccccc} 2&&&&\lambda_2&6&p_2&&&-1\\ &2&&&&3&1&&&&-1\\ &&2&&&2&-1&&&&&-1\\ &&&&&-1&&1\\ \lambda_2&&&&&&x_1&&1\\ 6&3&2&-1\\ p_2&1&-1&&x_1\\ &&&1\\ &&&&1\\ \nu_1&&&&&&&&&x_1\\ &\nu_2&&&&&&&&&x_2\\ &&\nu_3&&&&&&&&&x_3 \end{array} \right] \left[ \begin{array}{c} \Delta x_1\\ \Delta x_2\\ \Delta x_3\\ \Delta p_1\\ \Delta p_2\\ \Delta \lambda_1\\ \Delta \lambda_2\\ \Delta \lambda_3\\ \Delta \lambda_4\\ \Delta \nu_1\\ \Delta \nu_2\\ \Delta \nu_3\\ \end{array} \right] =- \left[ \begin{array}{c} 2x^{*}_1+6\lambda^{*}_1+p_2\lambda^{*}_2-\nu^{*}_1\\ 2x^{*}_2+3\lambda^{*}_1+\lambda^{*}_2-\nu^{*}_2\\ 2x^{*}_3+2\lambda^{*}_1-\lambda^{*}_2-\nu^{*}_3\\ -\lambda^{*}_1+\lambda^{*}_3\\ \lambda^{*}_2x^{*}_1+\lambda^{*}_4\\ 6x^{*}_1+3x^{*}_2+2x^{*}_3-p^{*}_1\\ p^{*}_2x^{*}_1+x^{*}_2-x^{*}_3-1\\ p^{*}_1-p_{1,a}\\ p^{*}_2-p_{2,a}\\ \nu^{*}_1x^{*}_1-\mu\\ \nu^{*}_2x^{*}_2-\mu\\ \nu^{*}_3x^{*}_3-\mu\\ \end{array} \right] \end{equation} \noindent where the right hand side is zero at the solution. \subsection{\AMPL\ Interface} In this section we will show how to use \sensKKT\ through the \AMPL\ interface \cite{ampl}. This is the preferred method for using IPOPT, because this allows us to take advantage of the exact first and second order derivatives provided by the modeling language. The first thing to do is to write the problem in the \AMPL\ language as shown in code listing \ref{ampl:ex1}. %\begin{minipage}{0.9\textwidth}\centering \begin{lstlisting}[language=ampl, caption={\AMPL\ code for Problem \ref{eq:exr}.}, label={ampl:ex1}, frame=single, captionpos=b] reset ; # Define parameters param et1p ; param et2p ; # Original parameter values let et1p := 5 ; let et2p := 1 ; # Define variables, with bounds and initial guess var x1 >= 0, := 0.15 ; var x2 >= 0, := 0.15 ; var x3 >= 0, := 0.00 ; # objective function minimize objf: x1^2 + x2^2 + x3^2 ; # constraints subject to r1: 6*x1 + 3*x2 + 2*x3 - et1p = 0 ; r2: et2p*x1 + x2 - x3 - 1 = 0 ; # Define solver and Ampl options in this case we don't want Ampl's # presolve to accidentally remove artificial variables. options solver ipopt_sens ; option presolve 0 ; # Solve problem solve ; \end{lstlisting} %\end{minipage} We can now proceed to modify the above code to add the information needed to use \sensKKT. For this we need to create the following suffixes. These will be used to communicate the nominal and perturbed values of the parameters, and also some will serve as flags to indicate to IPOPT which are the artificial constraints that were added. \begin{description} \item[\statez] This is used to enumerate the parameters that will be perturbed. It takes values from 1 to length($p$), and the values may not be repeated. Note that the order of the values is crucial. \item[\stateo] This is similar to \textbf{\statez}, but it now indicates the order for the parameters at the perturbed value. This suffix should have the same values as \textbf{\statez}. It takes values from 1 to length($p$), and the values may not be repeated. \item[\statevo] This is used to communicate the values of the perturbed parameters. It has to be set for the same variables as \textbf{\stateo}. \item[\initc] This is a flag that indicates the constraint is artificial, e.g., $w - p_0=0$ in Problem \eqref{eq:reform}. If the constraint is artificial, set this suffix to 1 (no indexing is necessary). \end{description} Once these suffixes have been set, we must enable \sensKKT\ by setting the \emph{\runaskkt} to `\emph{yes}'. Note that this option can alternatively be set in the ipopt.opt file. In addition, to ensure that \AMPL's presolve feature does not eliminate the initial value constraints, we disable it. Thus, the modified code is \begin{lstlisting}[language=ampl, caption={\AMPL\ code for sensitivity update of Problem \ref{eq:exr}.}, label={ampl:ex2}, frame=single, captionpos=b] reset ; # Suffixes for sensitivity update suffix sens_state_0, IN; suffix sens_state_1, IN; suffix sens_state_value_1, IN; suffix sens_sol_state_1, OUT; suffix sens_init_constr, IN; # Original value of parameters param et1p ; param et2p ; # Original parameter values let et1p := 5 ; let et2p := 1 ; # Define variables, with bounds and initial guess var x1 >= 0, := 0.15 ; var x2 >= 0, := 0.15 ; var x3 >= 0, := 0.00 ; # Artificial variables so IPOPT sees the parameters var et1 ; var et2 ; # objective function minimize objf: x1^2 + x2^2 + x3^2 ; # constraints subject to r1: 6*x1 + 3*x2 + 2*x3 - et1 = 0 ; r2: et2*x1 + x2 - x3 - 1 = 0 ; # Artificial constraints to pass parameters to IPOPT r3: et1 = et1p ; r4: et2 = et2p ; # Define solver and Ampl options in this case we don't want Ampl's # presolve to accidentally remove artificial variables. options solver ipopt_sens ; option presolve 0; # define an order to the parameters that will change. # In step 0, only et1 changes, and has position 1 let et1.sens_state_0 := 1 ; # in the first step/change et1 has position 1 let et1.sens_state_1 := 1 ; # Perturbed value of parameter et1 (in step 1) let et1.sens_state_value_1 := 4.5 ; # In step 0, et2 has position 1 let et2.sens_state_0 := 2 ; # in the first step/change et1 has position 2 let et2.sens_state_1 := 2 ; # Perturbed value of parameter et2 (in step 1) let et2.sens_state_value_1 := 1 ; # Artificial constraints let r3.sens_init_constr := 1 ; let r4.sens_init_constr := 1 ; # solve problem solve ; \end{lstlisting} After the algorithm has completed successfully, the perturbed solution is stored in the following \AMPL\ suffixes: \begin{description} \item[\sstateo] This holds the updated variables as well as the updated constraint multiplier values computed in the sensitivity update. \item[\sstatezl] This suffix holds updated lower bound multipliers. \item[\sstatezu] This suffix holds updated upper bound multipliers. \end{description} For example we could append the following code to Listing \ref{ampl:ex2} in order to print both the nominal solution, as well as the updated values. % \begin{lstlisting}[language=ampl, frame=single, captionpos=b,caption={\AMPL\ code to print updated solution.}, label={ampl:ex3}] #********************************************** # Print nominal solution and bound multipliers #********************************************** display x1, x2, x3, et1, et2 ; display x1.ipopt_zU_out, x2.ipopt_zU_out, x3.ipopt_zU_out, et1.ipopt_zU_out, et2.ipopt_zU_out ; display x1.ipopt_zL_out, x2.ipopt_zL_out, x3.ipopt_zL_out, et1.ipopt_zL_out, et2.ipopt_zL_out ; # Constraint multipliers display r1, r2, r3, r4 ; #************************ # Print updated solution #************************ display x1.sens_sol_state_1, x2.sens_sol_state_1, x3.sens_sol_state_1, et1.sens_sol_state_1, et2.sens_sol_state_1 ; display x1.sens_sol_state_1_z_U, x2.sens_sol_state_1_z_U, x3.sens_sol_state_1_z_U, et1.sens_sol_state_1_z_U, et2.sens_sol_state_1_z_U ; display x1.sens_sol_state_1_z_L, x2.sens_sol_state_1_z_L, x3.sens_sol_state_1_z_L, et1.sens_sol_state_1_z_L, et2.sens_sol_state_1_z_L ; # and updated constraint multipliers display r1.sens_sol_state_1, r2.sens_sol_state_1, r3.sens_sol_state_1, r4.sens_sol_state_1 ; \end{lstlisting} An example implementation of the above is provided in the directory: \begin{description} \item {\tt \ipoptf/Ipopt/contrib/\sensdir/examples/parametric\_ampl}. \end{description} %\subsection{C++ Interface} \section{Reduced Hessian} An important byproduct of the sensitivity calculation is information related to the Hessian of the Lagrange function pertinent to the second order conditions. At the solution of (\ref{NLPsens}) we again consider the sensitivity system, $M S = N_{rh}$, and partition the variables into free and bounded variables, i.e., $x^* = [x_f^T \; x_b^T]$ where $x^*_f > 0, x^*_b = 0$. Assuming strict complementarity (SC), the IFT sensitivity system using (\ref{mdef}) can be partitioned with: \begin{equation} M = \matr{ccccc}{W_{ff}(x^*,\lambda^*) & W_{fb}(x^*,\lambda^*) & A_f(x^*) & -I_f & 0 \\ W_{bf}(x^*,\lambda^*) & W_{bb}(x^*,\lambda^*) & A_b(x^*) & 0 & -I_b \\ A_f(x^*)^T & A_b(x^*))^T &0 &0 & 0\\ 0 & 0 & 0 &X_f^* & 0 \\ 0 & V_b^*& 0 & 0 & 0}, S = \vect{S_{x_f} \\ S_{x_b} \\ S_{\lambda} \\ S_{\nu_f} \\ S_{\nu_b}}, \mbox{ and } N_{rh} = \vect{E \\ 0 \\ 0 \\ 0 \\ 0} \label{matdef} \end{equation} %\noindent where $E$ is defined below. From (\ref{matdef}) it is easy to see that $S_{x_b} = 0, S_{\nu_f} = 0$. These variables and the last two rows can therefore be removed, leading to: \begin{equation*} \matr{ccc}{W_{ff}(x^*,\lambda^*) & A_f(x^*) & 0 \\ A_f(x^*))^T &0 & 0\\ W_{bf}(x^*,\lambda^*) & A_b(x^*) & -I_b} \vect{S_{x_f} \\ S_{\lambda} \\ S_{\nu_b}} = \vect{E \\ 0 \\ 0} \end{equation*} For a chosen set of $n_I \leq n_x - m$ independent variables with elements reordered at the end of the $x$ vector, $A_D$ nonsingular, $E^T = [0 \;|\: I_{n_I}]$ and the matrices defined in (\ref{matdef}), the reduced Hessian can be found directly by solving $M S = N_{rh}$. As described in \cite{pirnay:2011}, the reduced Hessian can be extracted easily from the rows of $S$. Thus taking advantage of the implementation described in Section \ref{sec:barrier} for sensitivity based updates, we can obtain an approximation of the reduced Hessian via backsolves involving the factorized KKT matrix. \section{Usage} In the following sections we describe the usage of the reduced Hessian calculator using the \AMPL. We also provide examples of the C++ interface in the examples folder. \subsection{\AMPL\ Interface} The usage of the reduced Hessian calculation is similar to the sensitivity updates described above. The critical step here is deciding which variables will be independent variables at the optimal solution. Theses independent variables are then identified with the suffix \textbf{\redhess}. This suffix provides an enumeration of the independent variables, thus it needs to take ordered values from $1..n_I$, where $n_I$ is the number of independent variables. The columns of the inverse reduced Hessian will be printed to the screen, and their order is determined by the ordering of these indices. To enable reduced Hessian calculations we need to set the option The algorithm is enabled by setting the solver option \emph{\redhessopt} to `\emph{yes}'. Using Example 1 defined by Problem \eqref{eq:ex1}, we illustrate the use of the reduced Hessian calculator. The code for this is shown in Listing \ref{ampl:exrh}. In addition, the calculated reduced Hessian is displayed on the screen automatically at the end of IPOPT's normal output. \begin{lstlisting}[language=ampl, caption={\AMPL\ code for Problem \ref{eq:exr}.}, label={ampl:exrh}, frame=single, captionpos=b] reset ; # Define reduced Hessian suffixes suffix red_hessian, IN ; # Define parameters param et1 ; param et2 ; # Parameter values let et1p := 5 ; let et2p := 1 ; # Define variables, with bounds and initial guess var x1 >= 0, := 0.15 ; var x2 >= 0, := 0.15 ; var x3 >= 0, := 0.00 ; # objective function minimize objf: x1^2 + x2^2 + x3^2 ; # constraints subject to r1: 6*x1 + 3*x2 + 2*x3 - et1p = 0 ; r2: et2p*x1 + x2 - x3 - 1 = 0 ; # Define solver and Ampl options in this case we don't want Ampl's # presolve to accidentally remove artificial variables. options solver ipopt_sens ; option presolve 0 ; # Define free variables let x3.red_hess := 1 ; # Solve problem solve ; \end{lstlisting} \section{C++ Interface} The C++ interface is very simple to apply to an existing {\tt Ipopt::TNLP} implementation. The member function {\tt TNLP::::get\_var\_con\_metadata} in Ipopt provides a feature very similar to that of \AMPL\ suffixes. The steps taken to make a TNLP class ready for using the \sensKKT\ code are similar to those used in \AMPL. First, the parameter values are defined with artificial variables and constraints. Note that because of this the Jacobian and Hessian computations have to be adjusted accordingly. Finally, the suffixes need to be set the same way they would in \AMPL\ as described above. This is done using member function {\tt TNLP::::get\_var\_con\_metadata}. This is illustrated in examples \texttt{examples/redhess\_cpp} and \\ \texttt{examples/parametric\_cpp}. \section{Installation} The first step to install the software is to install the \emph{trunk} version of IPOPT, once this is done installing \sensKKT\ is very simple. IPOPT's installation instructions can be found in the following website. \begin{description} \item \texttt{https://coin-or.github.io/Ipopt/} \end{description} Also note that in the following we refer to {\tt \ipoptf} as the main folder, where the Ipopt, ThirdParty, BuildTools, \ldots, folders are located. If you wish to use the \AMPL\ interface, make sure that your IPOPT installation also includes it. To do this you need to download the ASL library, with the {\tt get.ASL} script located in {\tt \ipoptf/ThirdParty/ASL}. Finally, we assume that you created a build folder to install IPOPT in {\tt \ipoptf/build/}. In this case, to download the \emph{trunk} version of IPOPT you would type: \begin{description} \item {\tt \$ svn co https://projects.coin-or.org/svn/Ipopt/trunk \ipoptf} \end{description} Once IPOPT has been compiled and installed, we can proceed to build \sensKKT. To do this go to the {\tt \ipoptf/build/Ipopt/contrib/\sensdir/} folder, and type {\tt make} there. \begin{description} \item {\tt \$ cd \ipoptf/build/Ipopt/contrib/\sensdir} \item {\tt \$ make} \end{description} If no errors are shown after compilation you can proceed to install the libraries and to generate the \AMPL\ executable. To do this type \begin{description} \item {\tt \$ make install} \end{description} This should copy the generated libraries ({\tt \senslib.*}) to {\tt \ipoptf/build/lib}, and the \AMPL\ executable ({\tt \sensexe}) to {\tt \ipoptf/build/bin/}. \section{Options} There are several new options that can be set in the {\tt ipopt.opt} file, that determine the behavior of the \sensKKT\ code. The more important options are the ones enable the execution of the post-optimal \sensKKT code. These are \begin{verbatim} run_sens yes \end{verbatim} \noindent to enable sensitivity computations, and \begin{verbatim} compute_red_hessian yes \end{verbatim} \noindent to enable the computation of the reduced Hessian. \paragraph{Other options are:} \begin{description} %\item[\selectstep] This option determines how the sensitivity update is performed, and it % can take any of the following values: % % \begin{tabular}{lp{0.7\textwidth}} % \textbf{\texttt{iftsensitivity}} & This option calculates the update using Equation \eqref{init1}. % Note that here we consider the problem is formulated as Problem (11) from the % implementation paper \cite{pirnay:2011}, and % also we use general upper and lower bounds (see Section 2.6 from \cite{pirnay:2011}). % This is the default. \\ % \texttt{advanced} & for the full advanced step with Schur complement and multiplier correction \\ % \texttt{sensitivity}& for the Schur step without multiplier correction, \\ % \texttt{ift} & for the fast back solve without Schur complement computation, but with multiplier correction \\ % \end{tabular} % % For parametric problems, the options \texttt{sensitivity} and \texttt{iftsensitivity} should be used, % whereas for advanced step problems, the options \texttt{advanced} and \texttt{ift} are more suitable. \item[\texttt{\textbf{\nstepsopt}}] In general, the update can be done sequentially for any number of parameters. However, for now, the valid range for this integer option is $1 \leq \mbox{\nstepsopt} \leq \infty$, and the default value is 1. Please see Section \ref{sec:multirhs} for more details on this. \item[\texttt{\textbf{\boundcheckopt}}] If set to \texttt{yes}, this option turns on the bound correction algorithm (see Section 2.4 in the implementation paper). The default value of this string option is \texttt{no}. \item[\texttt{\textbf{\boundepsopt}}] This option makes sure that only variables that violate the bound by more than\\ {\texttt{\boundepsopt}} are considered as real violations. Otherwise, bound checking might continue until the full active set has been covered. This is only used if the \texttt{\boundcheckopt} is set to \texttt{yes}. The valid range of this real valued option is: $0 \leq \mbox{\texttt{\boundepsopt}} \leq \infty$, and the default value is $10^{-3}$. \item[\texttt{\textbf{\maxpdpertopt}}] For certain problems, IPOPT uses inertia correction of the primal dual matrix to achieve better convergence properties. This inertia correction changes the matrix and renders it useless for the use with \sensKKT. This option sets an upper bound, which the inertia correction may have. If any of the inertia correction values is above this bound, the \sensKKT\ algorithm is aborted. The valid range of this real valued option is: $0 \leq \mbox{\texttt{\maxpdpertopt}} \leq \infty$, and the default is $10^{-3}$. Please see Section 2.2 of the IPOPT implementation paper \cite{Waechter2006} for more details. \item[\texttt{\textbf{\eigendecompopt}}] If this option is set to \texttt{yes}, the reduced Hessian code will compute the eigenvalue decomposition of the reduced Hessian matrix. The default value of this string option is \texttt{no}. \item[\texttt{\textbf{\allowinex}}] This option is used to enable or disable IPOPT's Iterative Refinement. See Section 3.10 of the IPOPT implementation paper \cite{Waechter2006}. By default this string option is set to \texttt{yes} (do not do iterative refinement), and it can take values of \texttt{yes} or \texttt{no}. \item[\texttt{\textbf{\senskktresiduals}}] The residuals of the KKT conditions should be zero at the optimal solution. However, in practice, especially for large problems and depending on the termination criteria, they may deviate from this theoretical state. If this option is set to the default \texttt{yes}, the residuals will be taken into account when computing the right hand side for the sensitivity step. If set to \texttt{no}, the residuals will not be computed and assumed to be zero. \end{description} \bibliography{sipopt} \newpage \appendix \section{Summary of Suffixes} In this section we summarize the suffixes that need to be set for sensitivity updates, or reduced Hessian calculations. \paragraph{Sensitivity Calculations:} Set the option \texttt{{\runaskkt}} to \texttt{yes}.\\ Some suffixes will need to be defined by the user, while others are automatically generated by {\sensKKT}. Moreover, some of the suffixes need to be indexed by $\curls{i: 1 \leq i \leq \mbox{\texttt{\nstepsopt}}}$. Also note that the direction column below is used to indicate to {\AMPL} if the suffix will be sent to the solver, or passed by the solver to {\AMPL}. More information on this can be found in \cite{ampl}.\\ \begin{tabular}{|>{\centering}m{3.5cm}|>{\centering}m{2cm}|m{0.6\textwidth}|}\hline \multicolumn{3}{|c|}{\textbf{Defined by User}} \\ \hline Suffix & Direction & \multicolumn{1}{c|}{Description} \\ \hline \textbf{\statez} & IN & This is used to enumerate the parameters that will be perturbed. It takes values from 1 to length($p$), and the values may not be repeated. Note that the order of the values is crucial.\\ \hline \multirow{2}{*}{\textbf{\statei{\emph{i}}}} & \multirow{2}{*}{IN } & This is similar to \textbf{\statez}, but it now indicates the order for the parameters at the perturbed value. You must define one for each $\curls{i: 1 \leq i \leq \mbox{\texttt{\nstepsopt}}}$. \\ && This suffix should have the same values as \textbf{\statez}. It takes values from 1 to length($p$), and the values may no be repeated.\\ \hline \multirow{2}{*}{\textbf{\statevi{\emph{i}}}} & \multirow{2}{*}{IN} & This is used to communicate the values of the perturbed parameters. You must define one for each $\curls{i: 1 \leq i \leq \mbox{\texttt{\nstepsopt}}}$. \\ && It has to be set for the same variables as \textbf{\stateo}.\\ \hline \textbf{\initc} & IN & This is a flag that indicates the constraint is artificial, e.g., $w - p_0=0$ in Problem \eqref{eq:reform}. If the constraint is artificial, set this suffix to 1 (no indexing is necessary). \\ \hline \multicolumn{3}{|c|}{\textbf{Defined by \sensKKT}} \\ \hline \multirow{2}{*}{\textbf{\sstatei{\emph{i}}}} & \multirow{2}{*}{OUT} & This holds the updated variables, as well as, the updated constraint multiplier values computed in the sensitivity update. \\ && One for each $\curls{i: 1 \leq i \leq \mbox{\texttt{\nstepsopt}}}$ will be defined. \\ \hline \multirow{2}{*}{\textbf{\sstatezli{\emph{i}}}} & \multirow{2}{*}{OUT} & This suffix holds updated lower bound multipliers.\\ && One for each $\curls{i: 1 \leq i \leq \mbox{\texttt{\nstepsopt}}}$ will be defined.\\ \hline \multirow{2}{*}{\textbf{\sstatezui{\emph{i}}}} & \multirow{2}{*}{OUT} & This suffix holds updated upper bound multipliers.\\ && One for each $\curls{i: 1 \leq i \leq \mbox{\texttt{\nstepsopt}}}$ will be defined.\\ \hline \end{tabular} \paragraph{Reduced Hessian Calculations:} Set the option \texttt{{\redhessopt}} to \texttt{yes}. \\ \begin{tabular}{|>{\centering}m{3.5cm}|>{\centering}m{2cm}|m{0.6\textwidth}|}\hline Suffix & Direction & \multicolumn{1}{c|}{Description} \\ \hline \textbf{\redhess} & IN & This is used to enumerate the independent variables, thus it needs to take ordered values from $1..n_I$, and $n_I$ is the number of independent variables. \\ \hline \end{tabular} \end{document} coinor-ipopt-3.14.17/contrib/sIPOPT/examples/000077500000000000000000000000001473776672200206725ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/examples/hicks_ampl/000077500000000000000000000000001473776672200230045ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/examples/hicks_ampl/hicks.dat000066400000000000000000000047321473776672200246050ustar00rootroot00000000000000# =================================================================== # dynamic optimization formulation of the hicks-ray reactor # data declaration # victor m zavala march 2006 # adapted for asNMPC by Hans Pirnay 2009, 2011 # =================================================================== param a: 1 2 3 := # 1 0.19681547722366 0.39442431473909 0.37640306270047 2 -0.06553542585020 0.29207341166523 0.51248582618842 3 0.02377097434822 -0.04154875212600 0.11111111111111; # mathematical model parameters let jj := 100 ; let cf := 7.6 ; let alpha := 1.95e-04 ; let tf := 300 ; let k10 := 300 ; let tc := 290 ; let n := 5 ; let alpha1 := 1e6 ; let alpha2 := 2e3 ; let alpha3 := 1e-03 ; let nfe := 40 ; let ncp := 3 ; let r1 := 0.15505102572168 ; let r2 := 0.64494897427832 ; let r3 := 1 ; # initial and end transition points let c_des := 0.0944 ; let t_des := 0.7766 ; let u_des := 340 ; let c_init := 0.1367 ; let t_init := 0.7293 ; let u_init := 390 ; let time := 9 ; let theta := 20 ; # initial guesses of the decision variables let point := 0 ; let slopec := (c_des-c_init)/(nfe*ncp) ; let slopet := (t_des-t_init)/(nfe*ncp) ; let slopeu := (u_des-u_init)/(nfe*ncp) ; for {i in fe} { for {j in cp} { let point := point+1 ; let c[i,j] := slopec*point+c_init ; let t[i,j] := slopet*point+t_init ; let u[i,j] := slopeu*point+u_init ; } let h[i] := 1/nfe ; } #----------------------------------------- # AsNMPC specific part: # Here, the suffixes are set for the advanced step computations: # # 1. Define the order of the initial variables let c_init_var.sens_state_0 := 1; let t_init_var.sens_state_0 := 2; # # 2. Identify the variables at first sampling time let c[5,1].sens_state_1 := 1; let t[5,1].sens_state_1 := 2; # # 3. Set the measurement of the variables at first sampling time let c[5,1].sens_state_value_1 := 0.135; let t[5,1].sens_state_value_1 := 0.745; # # 4. Identify the initial constraints, that will be relaxed # in favor of the new measurements let c_init_constr.sens_init_constr :=1; let t_init_constr.sens_init_constr :=1; #-- end of the hicks.dat file - coinor-ipopt-3.14.17/contrib/sIPOPT/examples/hicks_ampl/hicks.mod000066400000000000000000000053621473776672200246140ustar00rootroot00000000000000# =================================================================== # dynamic optimization formulation of the hicks-ray reactor # model declaration # victor m zavala march 2006 # adapted for asNMPC by Hans Pirnay 2009, 2011 # =================================================================== # define indexes and general variables param nfe >= 1 integer ; param ncp >= 1 integer ; # define mathematical model parameters param time ; param jj ; param cf ; param alpha ; param tf ; param k10 ; param tc ; param n ; param alpha1 ; param alpha2 ; param alpha3 ; param c_des ; param t_des ; param u_des ; param c_init ; param t_init ; param u_init ; param r1 ; param r2 ; param r3 ; param theta ; param point ; param slopec ; param slopet ; param slopeu ; # define dimensions for all indexed variables set fe := 1..nfe ; # number of finite elements set cp := 1..ncp ; # number of collocation points param a{cp,cp} ; # collocation matrix param h{fe} ; # finite element length # define the decision variables var c {fe,cp} >= 0 ; var t {fe,cp} >= 0 ; var u {fe,cp} >= 0 ; # auxiliary equations param yc := tc/(jj*cf) ; param yf := tf/(jj*cf) ; # states first order derivatives var cdot{i in fe, j in cp} = (1-c[i,j])/theta-k10*exp(-n/t[i,j])*c[i,j] ; var tdot{i in fe, j in cp} = (yf-t[i,j])/theta+k10*exp(-n/t[i,j])*c[i,j]-alpha*u[i,j]*(t[i,j]-yc) ; #--------------------------------- # This is specific to the asNMPC code: # The initial constraints have to be defined as variables. # They have to be set explictly with initial constraints. # These constraints need to be identified by the # sens_init_constr suffix. var c_init_var; var t_init_var; c_init_constr: c_init_var = c_init; t_init_constr: t_init_var = t_init; #0.7293; #--------------------------------- # collocation equations fecolc{i in fe diff{1},j in cp}: c[i,j] = c[i-1,ncp]+time*h[i]*sum{k in cp} a[k,j]*cdot[i,k]; fecolt{i in fe diff{1},j in cp}: t[i,j] = t[i-1,ncp]+time*h[i]*sum{k in cp} a[k,j]*tdot[i,k]; fecolc0{i in 1..1,j in cp}: c[i,j] = c_init_var+time*h[i]*sum{k in cp} a[k,j]*cdot[i,k]; fecolt0{i in 1..1,j in cp}: t[i,j] = t_init_var+time*h[i]*sum{k in cp} a[k,j]*tdot[i,k]; # objective function... minimize cost: sum{i in 2..nfe} (h[i]*sum{j in cp} ((alpha1*(c[i,j]-c_des)^2+ alpha2*(t[i,j]-t_des)^2+alpha3*(u[i,j]-u_des)^2 )*a[j,ncp])) + h[1]*sum{j in cp} ((alpha1*((c_init_var+time*h[1]*sum{k in cp} a[k,j]*cdot[1,k]) - c_des)^2 + alpha2*((t_init_var+time*h[1]*sum{k in cp} a[k,j]*tdot[1,k])-t_des)^2 + alpha3*(u[1,j]-u_des)^2)*a[j,ncp]); #-- end of the hicks.mod file -- coinor-ipopt-3.14.17/contrib/sIPOPT/examples/hicks_ampl/hicks.run000066400000000000000000000011321473776672200246300ustar00rootroot00000000000000# Copyright 2009, 2011 Hans Pirnay # All Rights Reserved. # This code is published under the Eclipse Public License. # # Date : 2010-10-04 reset ; suffix sens_state_0, IN; suffix sens_state_1, IN; suffix sens_state_value_1, IN; suffix sens_sol_state_1, OUT; suffix sens_init_constr, IN; option solver ipopt_sens ; option presolve 0; option ipopt_options 'run_sens no'; model hicks.mod ; data hicks.dat ; option ipopt_options 'run_sens yes'; solve; include nmpcresults.inc ; coinor-ipopt-3.14.17/contrib/sIPOPT/examples/hicks_ampl/ipopt.opt000066400000000000000000000002351473776672200246630ustar00rootroot00000000000000n_sens_steps 1 sens_boundcheck yes #sens_bound_eps -1e-10 # Turn off the NLP scaling #nlp_scaling_method none print_options_documentation no #run_sens yes coinor-ipopt-3.14.17/contrib/sIPOPT/examples/hicks_ampl/nmpcresults.inc000066400000000000000000000066741473776672200260730ustar00rootroot00000000000000# =================================================================== # dynamic optimization formulation of the hicks-ray reactor # create results file for matlab # victor m zavala march 2006 # Adapted for sIPOPT by Hans Pirnay 2009, 2011 # =================================================================== printf "clc\n" >graph.m; printf "clear all" >graph.m; printf "\n" >graph.m; #display variables and parameters printf "c=[" >graph.m; printf "%5.5f ",c_init>>graph.m; printf {j in fe,k in cp}: "%5.5f ",c[j,k]>>graph.m; printf "]';\n" >>graph.m; printf "t=[" >graph.m; printf "%5.5f ",t_init>>graph.m; printf {j in fe,k in cp}: "%5.5f ",t[j,k]>>graph.m; printf "]';\n" >>graph.m; printf "u=[" >graph.m; printf "%5.5f ",u_init>>graph.m; printf {j in fe,k in cp}: "%5.5f ",u[j,k]>>graph.m; printf "]';\n" >>graph.m; printf "c1=[" >graph.m; printf "%5.5f ",c_init>>graph.m; printf {j in fe,k in cp}: "%5.5f ",c[j,k].sens_sol_state_1>>graph.m; printf "]';\n" >>graph.m; printf "t1=[" >graph.m; printf "%5.5f ",t_init>>graph.m; printf {j in fe,k in cp}: "%5.5f ",t[j,k].sens_sol_state_1>>graph.m; printf "]';\n" >>graph.m; printf "u1=[" >graph.m; printf "%5.5f ",u_init>>graph.m; printf {j in fe,k in cp}: "%5.5f ",u[j,k].sens_sol_state_1>>graph.m; printf "]';\n" >>graph.m; printf "nfe= %5i ",nfe>>graph.m; printf ";\n">>graph.m; printf "ncp= %5i ",ncp>>graph.m; printf ";\n">>graph.m; printf "ncp= ncp-1">>graph.m; printf ";\n">>graph.m; printf "tt= %5.5f ",time>>graph.m; printf ";\n">>graph.m; printf "r1= %5.5f ",r1>>graph.m; printf ";\n">>graph.m; printf "r2= %5.5f ",r2>>graph.m; printf ";\n">>graph.m; printf "r3= %5.5f ",r3>>graph.m; printf ";\n">>graph.m; printf "roots(1)= r1 ">>graph.m; printf ";\n">>graph.m; printf "roots(2)= r2 ">>graph.m; printf ";\n">>graph.m; printf "roots(3)= r3 ">>graph.m; printf ";\n">>graph.m; printf "h= tt/nfe ">>graph.m; printf ";\n">>graph.m; printf "index= 0 ">>graph.m; printf ";\n">>graph.m; printf "nelement= 0 ">>graph.m; printf ";\n">>graph.m; printf "for i=1:nfe,">>graph.m; printf "\n">>graph.m; printf "nelement=nelement+1">>graph.m; printf ";\n">>graph.m; printf "for j=1:ncp+1,">>graph.m; printf "\n">>graph.m; printf "index=index+1">>graph.m; printf ";\n">>graph.m; printf "if i == 1">>graph.m; printf "\n">>graph.m; printf "time(index) = h*roots(j)">>graph.m; printf ";\n">>graph.m; printf "else">>graph.m; printf "\n">>graph.m; printf "time(index) = (nelement-1)*h+h*roots(j)">>graph.m; printf ";\n">>graph.m; printf "end">>graph.m; printf "\n">>graph.m; printf "end">>graph.m; printf "\n">>graph.m; printf "end">>graph.m; printf "\n">>graph.m; printf "time= [0,time]'">>graph.m; printf ";\n">>graph.m; # plot the results printf "subplot(3,1,1)\n" >>graph.m; printf "plot(time,c,'k')\nhold on\n" >>graph.m; printf "plot(time,c1,'k')\n" >>graph.m; printf "xlabel ('time')">>graph.m; printf ";\n">>graph.m; printf "ylabel ('concentration')">>graph.m; printf ";\n">>graph.m; printf "subplot(3,1,2)\n" >>graph.m; printf "plot(time,[t,t1],'k')\n" >>graph.m; printf "xlabel ('time')">>graph.m; printf ";\n">>graph.m; printf "ylabel ('temperature')">>graph.m; printf ";\n">>graph.m; printf "subplot(3,1,3)\n" >>graph.m; printf "plot(time,[u,u1],'k')\n" >>graph.m; printf "xlabel ('time')">>graph.m; printf ";\n">>graph.m; printf "ylabel ('cooling w flowrate')">>graph.m; printf ";\n">>graph.m; printf "print -deps hicks.eps\n">>graph.m; close graph.m; printf "output written to matlab m-file: graph.m ...\n"; #-- end of the graphshicks.inc file - coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_ampl/000077500000000000000000000000001473776672200240325ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_ampl/parametric.mod000066400000000000000000000007061473776672200266650ustar00rootroot00000000000000# Copyright 2009, 2011 Hans Pirnay # All Rights Reserved. # This code is published under the Eclipse Public License. # # Date : 2010-10-04 # variables var x1>=0 := 0.15; var x2>=0 := 0.15; var x3>=0 := 0.0 ; # parameters var eta1; var eta2; # model const1: 6*x1+3*x2+2*x3-eta1=0; const2: eta2*x1+x2-x3-1=0; # initial constraints for parameters consteta1: eta1=nominal_eta1; consteta2: eta2=nominal_eta2; # objective minimize cost: x1^2+x2^2+x3^2; coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_ampl/parametric.run000066400000000000000000000034571473776672200267200ustar00rootroot00000000000000# Copyright 2009, 2011, 2012 Hans Pirnay # All Rights Reserved. # This code is published under the Eclipse Public License. # # Date : 2010-10-04 reset; # --------------------------------- # Set parameter values here # --------------------------------- # param nominal_eta1 := 5.0; param perturbed_eta1 := 4.5; param nominal_eta2 := 1; param perturbed_eta2 := 1; # # --------------------------------- # # declare AMPL suffixes for sIPOPT code suffix sens_state_0, IN; suffix sens_state_1, IN; suffix sens_state_value_1, IN; suffix sens_sol_state_1, OUT; suffix sens_init_constr, IN; option presolve 0; # turn presolve off so no variables / equations are eliminated # by AMPL option solver ipopt_sens; # set run_sens to yes #option ipopt_options 'run_sens yes n_sens_steps=1 sens_boundcheck no'; option ipopt_options 'run_sens yes sens_boundcheck no'; model parametric.mod; # sIPOPT data let eta1.sens_state_0 := 1; let eta1.sens_state_1 := 1; let eta1.sens_state_value_1 := perturbed_eta1; let eta2.sens_state_0 := 2; let eta2.sens_state_1 := 2; let eta2.sens_state_value_1 := perturbed_eta2; let consteta1.sens_init_constr := 1; let consteta2.sens_init_constr := 1; solve; print ""; print "Sensitivity without bound checking"; print ""; print "Nominal Solution:"; display x1, x2, x3, eta1, eta2; print "Estimation of Perturbed Solution with sIPOPT:"; display x1.sens_sol_state_1, x2.sens_sol_state_1, x3.sens_sol_state_1, eta1.sens_sol_state_1, eta2.sens_sol_state_1; option ipopt_options 'run_sens yes sens_boundcheck yes'; solve; print ""; print "Sensitivity with bound checking"; print ""; print "Nominal Solution:"; display x1, x2, x3, eta1, eta2; print "Estimation of Perturbed Solution with sIPOPT:"; display x1.sens_sol_state_1, x2.sens_sol_state_1, x3.sens_sol_state_1, eta1.sens_sol_state_1, eta2.sens_sol_state_1; coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_cpp/000077500000000000000000000000001473776672200236635ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_cpp/Makefile.in000066400000000000000000000040071473776672200257310ustar00rootroot00000000000000# Copyright (C) 2010 Hans Pirnay # All Rights Reserved. # This file is distributed under the Eclipse Public License. ########################################################################## # You can modify this example makefile to fit for your own program. # # Usually, you only need to change the four CHANGEME entries below. # ########################################################################## # CHANGEME: This should be the name of your executable EXE = parametric_driver@EXEEXT@ # CHANGEME: Here is the name of all object files corresponding to the source # code that you wrote in order to define the problem statement OBJS = parametric_driver.@OBJEXT@ \ parametricTNLP.@OBJEXT@ # CHANGEME: Additional libraries ADDLIBS = # CHANGEME: Additional flags for compilation (e.g., include flags) ADDINCFLAGS = ########################################################################## # Usually, you don't have to change anything below. Note that if you # # change certain compiler options, you might have to recompile Ipopt. # ########################################################################## # C++ Compiler command CXX = @CXX@ # C++ Compiler options CXXFLAGS = @CXXFLAGS@ # additional C++ Compiler options for linking CXXLINKFLAGS = @RPATH_FLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ # TODO there should be an sipopt .pc file from which to get flags # Include directories @COIN_HAS_PKGCONFIG_TRUE@INCL = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --cflags ipopt` $(ADDINCFLAGS) @COIN_HAS_PKGCONFIG_FALSE@INCL = -I@includedir@/coin @IPOPTLIB_CFLAGS@ $(ADDINCFLAGS) # Linker flags @COIN_HAS_PKGCONFIG_TRUE@LIBS = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --libs ipopt` -lsipopt @COIN_HAS_PKGCONFIG_FALSE@LIBS = -L@libdir@ -lsipopt -lipopt @IPOPTLIB_LFLAGS@ all: $(EXE) .SUFFIXES: .cpp .@OBJEXT@ $(EXE): $(OBJS) $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $(OBJS) $(LIBS) $(ADDLIBS) clean: rm -rf $(EXE) $(OBJS) .cpp.@OBJEXT@: $(CXX) $(CXXFLAGS) $(INCL) -c -o $@ $< coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.cpp000066400000000000000000000216131473776672200272170ustar00rootroot00000000000000// Copyright 2010, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2010-30-04 #include "parametricTNLP.hpp" #include "IpDenseVector.hpp" #include "IpIpoptData.hpp" #include using namespace Ipopt; /* Constructor */ ParametricTNLP::ParametricTNLP() : nominal_eta1_(5.0), nominal_eta2_(1.0), eta_1_perturbed_value_(4.5), eta_2_perturbed_value_(1.0) { } ParametricTNLP::~ParametricTNLP() { } bool ParametricTNLP::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style) { // x1, x2, x3, eta1, eta2 n = 5; // 2 constraints + 2 parametric initial value constraints m = 4; nnz_jac_g = 10; nnz_h_lag = 5; index_style = FORTRAN_STYLE; return true; } bool ParametricTNLP::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index /*m*/, Number* g_l, Number* g_u ) { for( Index k = 0; k < 3; ++k ) { x_l[k] = 0.0; x_u[k] = 1.0e19; } x_l[3] = -1.0e19; x_u[3] = 1.0e19; x_l[4] = -1.0e19; x_u[4] = 1.0e19; g_l[0] = 0.0; g_u[0] = 0.0; g_l[1] = 0.0; g_u[1] = 0.0; // initial value constraints g_l[2] = nominal_eta1_; g_u[2] = nominal_eta1_; g_l[3] = nominal_eta2_; g_u[3] = nominal_eta2_; return true; } bool ParametricTNLP::get_starting_point( Index /*n*/, bool /*init_x*/, Number* x, bool /*init_z*/, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool /*init_lambda*/, Number* /*lambda*/ ) { x[0] = 0.15; x[1] = 0.15; x[2] = 0.0; x[3] = 0.0; x[4] = 0.0; return true; } bool ParametricTNLP::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { obj_value = 0; for( Index k = 0; k < 3; ++k ) { obj_value += x[k] * x[k]; } return true; } bool ParametricTNLP::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { grad_f[0] = 2 * x[0]; grad_f[1] = 2 * x[1]; grad_f[2] = 2 * x[2]; grad_f[3] = 0.0; grad_f[4] = 0.0; return true; } bool ParametricTNLP::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { Number x1, x2, x3, eta1, eta2; x1 = x[0]; x2 = x[1]; x3 = x[2]; eta1 = x[3]; eta2 = x[4]; g[0] = 6 * x1 + 3 * x2 + 2 * x3 - eta1; g[1] = eta2 * x1 + x2 - x3 - 1; g[2] = eta1; g[3] = eta2; return true; } bool ParametricTNLP::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index /*nele_jac*/, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { iRow[0] = 1; // dg1/dx1 jCol[0] = 1; iRow[1] = 1; // dg1/dx2 jCol[1] = 2; iRow[2] = 1; // dg1/dx3 jCol[2] = 3; iRow[3] = 1; // dg1/deta1 jCol[3] = 4; iRow[4] = 2; // dg2/dx1 jCol[4] = 1; iRow[5] = 2; // dg2/dx2 jCol[5] = 2; iRow[6] = 2; // dg2/dx3 jCol[6] = 3; iRow[7] = 2; // dg2/deta2 jCol[7] = 5; iRow[8] = 3; jCol[8] = 4; iRow[9] = 4; jCol[9] = 5; } else { values[0] = 6.0; values[1] = 3.0; values[2] = 2.0; values[3] = -1.0; values[4] = x[4]; values[5] = 1.0; values[6] = -1.0; values[7] = x[0]; values[8] = 1.0; values[9] = 1.0; } return true; } bool ParametricTNLP::eval_h( Index /*n*/, const Number* /*x*/, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index /*nele_hess*/, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { iRow[0] = 1; jCol[0] = 1; iRow[1] = 2; jCol[1] = 2; iRow[2] = 3; jCol[2] = 3; iRow[3] = 1; jCol[3] = 5; iRow[4] = 5; jCol[4] = 1; } else { values[0] = 2.0 * obj_factor; values[1] = 2.0 * obj_factor; values[2] = 2.0 * obj_factor; values[3] = 0.5 * lambda[1]; values[4] = 0.5 * lambda[1]; } return true; } bool ParametricTNLP::get_var_con_metadata( Index n, StringMetaDataMapType& /*var_string_md*/, IntegerMetaDataMapType& var_integer_md, NumericMetaDataMapType& var_numeric_md, Index m, StringMetaDataMapType& /*con_string_md*/, IntegerMetaDataMapType& con_integer_md, NumericMetaDataMapType& /*con_numeric_md*/ ) { /* In this function, the indices for the parametric computations are set. * To keep track of the parameters, each parameter gets an index from 1 to n_parameters. * In this case, [1] eta_1, [2] eta_2. * The following metadata vectors are important: */ /* 1. sens_init_constr: in this list, the constraints that set the initial * values for the parameters are indicated. * For parameter 1 (eta_1) this is constraint 3 (e.g. C++ index 2), which is * the constraint eta_1 = eta_1_nominal; * For parameter 2 (eta_2) this is constraint 4 (e.g. C++ index 3). */ std::vector sens_init_constr(m, 0); sens_init_constr[2] = 1; sens_init_constr[3] = 2; con_integer_md["sens_init_constr"] = sens_init_constr; /* 2. sens_state_1: in this index list, the parameters are indicated: * Here: [1] eta_1, [2] eta_2 */ std::vector sens_state_1(n, 0); sens_state_1[3] = 1; sens_state_1[4] = 2; var_integer_md["sens_state_1"] = sens_state_1; /* 3. sens_state_values_1: In this list of Numbers (=doubles), the perturbed * values for the parameters are set. */ std::vector sens_state_value_1(n, 0); sens_state_value_1[3] = eta_1_perturbed_value_; sens_state_value_1[4] = eta_2_perturbed_value_; var_numeric_md["sens_state_value_1"] = sens_state_value_1; return true; } void ParametricTNLP::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* x, const Number* /*z_L*/, const Number* /*z_U*/, Index m, const Number* /*g*/, const Number* lambda, Number /*obj_value*/, const IpoptData* ip_data, IpoptCalculatedQuantities* /*ip_cq*/ ) { // Check whether sIPOPT Algorithm aborted internally // bool sens_internal_abort; //options_->GetBoolValue("sens_internal_abort", sens_internal_abort, ""); // Get access to the metadata, where the solutions are stored. The metadata is part of the DenseVectorSpace. SmartPtr x_owner_space = dynamic_cast(GetRawPtr( ip_data->curr()->x()->OwnerSpace())); if( !IsValid(x_owner_space) ) { printf("Error IsValid(x_owner_space) failed\n"); return; } std::string state; std::vector sens_sol_vec; state = "sens_sol_state_1"; sens_sol_vec = x_owner_space->GetNumericMetaData(state.c_str()); // Print the solution vector printf("\n" " Nominal Perturbed\n"); for( Index k = 0; k < (Index) sens_sol_vec.size(); ++k ) { printf("x[%3d] % .23f % .23f\n", (int)k, x[k], sens_sol_vec[k]); } printf("\n**********\n"); for( Index k = 0; k < m; ++k ) { printf("lambda[%3d] (nom) % .23f \n", (int)k, lambda[k]); } } void ParametricTNLP::finalize_metadata( Index n, const StringMetaDataMapType& /*var_string_md*/, const IntegerMetaDataMapType& /*var_integer_md*/, const NumericMetaDataMapType& var_numeric_md, Index m, const StringMetaDataMapType& /*con_string_md*/, const IntegerMetaDataMapType& /*con_integer_md*/, const NumericMetaDataMapType& con_numeric_md ) { // bound multipliers for lower and upper bounds printf("\nDual bound multipliers:\n"); NumericMetaDataMapType::const_iterator z_L_solution = var_numeric_md.find("sens_sol_state_1_z_L"); NumericMetaDataMapType::const_iterator z_U_solution = var_numeric_md.find("sens_sol_state_1_z_U"); if( z_L_solution != var_numeric_md.end() && z_U_solution != var_numeric_md.end() ) { for( Index k = 0; k < n; ++k ) { printf("z_L[%d] = %f z_U[%d] = %f\n", (int)k, z_L_solution->second[k], (int)k, z_U_solution->second[k]); } } // constraint mutlipliers printf("\nConstraint multipliers:\n"); NumericMetaDataMapType::const_iterator lambda_solution = con_numeric_md.find("sens_sol_state_1"); if( lambda_solution != con_numeric_md.end() ) { for( Index k = 0; k < m; ++k ) { printf("lambda[%d] (upd) = %.14g\n", (int)k, lambda_solution->second[k]); } } } coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_cpp/parametricTNLP.hpp000066400000000000000000000100511473776672200272160ustar00rootroot00000000000000// Copyright 2010 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2010-01-05 #ifndef __PARAMETRICTNLPEXAMPLE_HPP__ #define __PARAMETRICTNLPEXAMPLE_HPP__ #include "IpTNLP.hpp" namespace Ipopt { class ParametricTNLP: public TNLP { public: /** default constructor */ ParametricTNLP(); /** default destructor */ virtual ~ParametricTNLP(); /**@name Overloaded from TNLP */ //@{ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); virtual bool get_var_con_metadata( Index n, StringMetaDataMapType& var_string_md, IntegerMetaDataMapType& var_integer_md, NumericMetaDataMapType& var_numeric_md, Index m, StringMetaDataMapType& con_string_md, IntegerMetaDataMapType& con_integer_md, NumericMetaDataMapType& con_numeric_md ); virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); virtual void finalize_metadata( Index n, const StringMetaDataMapType& var_string_md, const IntegerMetaDataMapType& var_integer_md, const NumericMetaDataMapType& var_numeric_md, Index m, const StringMetaDataMapType& con_string_md, const IntegerMetaDataMapType& con_integer_md, const NumericMetaDataMapType& con_numeric_md ); private: /**@name Methods to block default compiler methods. * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") * */ //@{ ParametricTNLP( const ParametricTNLP&); ParametricTNLP& operator=( const ParametricTNLP&); //@} /* Nominal and perturbed parameter values */ Number nominal_eta1_; Number nominal_eta2_; Number eta_1_perturbed_value_; Number eta_2_perturbed_value_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_cpp/parametric_driver.cpp000066400000000000000000000037711473776672200301010ustar00rootroot00000000000000// Copyright 2010, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2010-01-05 #include "parametricTNLP.hpp" #include "IpIpoptApplication.hpp" #include "SensApplication.hpp" #include "IpIpoptAlg.hpp" #include "SensRegOp.hpp" int main( int /*argc*/, char** /*argv*/ ) { using namespace Ipopt; SmartPtr app_ipopt = new IpoptApplication(); SmartPtr app_sens = new SensApplication(app_ipopt->Jnlst(), app_ipopt->Options(), app_ipopt->RegOptions()); // Register sIPOPT options RegisterOptions_sIPOPT(app_ipopt->RegOptions()); app_ipopt->Options()->SetRegisteredOptions(app_ipopt->RegOptions()); // Call Initialize the first time to create a journalist, but ignore // any options file ApplicationReturnStatus retval; retval = app_ipopt->Initialize(""); if( retval != Solve_Succeeded ) { //printf("ampl_ipopt.cpp: Error in first Initialize!!!!\n"); exit(-100); } app_ipopt->Initialize(); // create AmplSensTNLP from argc. This is an nlp because we are using our own TNLP Adapter SmartPtr sens_tnlp = new ParametricTNLP(); app_ipopt->Options()->SetStringValueIfUnset("run_sens", "yes"); app_ipopt->Options()->SetIntegerValueIfUnset("n_sens_steps", 1); app_sens->Initialize(); retval = app_ipopt->OptimizeTNLP(sens_tnlp); /* give pointers to Ipopt algorithm objects to Sens Application */ app_sens->SetIpoptAlgorithmObjects(app_ipopt, retval); printf("\n"); printf("#-------------------------------------------\n"); printf("# Sensitivity without bound checking\n"); printf("#-------------------------------------------\n"); app_sens->Run(); printf("\n"); printf("#-------------------------------------------\n"); printf("# Sensitivity with bound checking\n"); printf("#-------------------------------------------\n"); app_ipopt->Options()->SetStringValue("sens_boundcheck", "yes"); app_sens->Run(); } coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_dsdp_cpp/000077500000000000000000000000001473776672200246755ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_dsdp_cpp/Makefile.in000066400000000000000000000040211473776672200267370ustar00rootroot00000000000000# Copyright (C) 2010 Hans Pirnay # All Rights Reserved. # This file is distributed under the Eclipse Public License. ########################################################################## # You can modify this example makefile to fit for your own program. # # Usually, you only need to change the four CHANGEME entries below. # ########################################################################## # CHANGEME: This should be the name of your executable EXE = parametric_dsdp_driver@EXEEXT@ # CHANGEME: Here is the name of all object files corresponding to the source # code that you wrote in order to define the problem statement OBJS = parametric_dsdp_driver.@OBJEXT@ \ parametricTNLP.@OBJEXT@ # CHANGEME: Additional libraries ADDLIBS = # CHANGEME: Additional flags for compilation (e.g., include flags) ADDINCFLAGS = ########################################################################## # Usually, you don't have to change anything below. Note that if you # # change certain compiler options, you might have to recompile Ipopt. # ########################################################################## # C++ Compiler command CXX = @CXX@ # C++ Compiler options CXXFLAGS = @CXXFLAGS@ # additional C++ Compiler options for linking CXXLINKFLAGS = @RPATH_FLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ # TODO there should be an sipopt .pc file from which to get flags # Include directories @COIN_HAS_PKGCONFIG_TRUE@INCL = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --cflags ipopt` $(ADDINCFLAGS) @COIN_HAS_PKGCONFIG_FALSE@INCL = -I@includedir@/coin @IPOPTLIB_CFLAGS@ $(ADDINCFLAGS) # Linker flags @COIN_HAS_PKGCONFIG_TRUE@LIBS = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --libs ipopt` -lsipopt @COIN_HAS_PKGCONFIG_FALSE@LIBS = -L@libdir@ -lsipopt -lipopt @IPOPTLIB_LFLAGS@ all: $(EXE) .SUFFIXES: .cpp .@OBJEXT@ $(EXE): $(OBJS) $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $(OBJS) $(LIBS) $(ADDLIBS) clean: rm -rf $(EXE) $(OBJS) .cpp.@OBJEXT@: $(CXX) $(CXXFLAGS) $(INCL) -c -o $@ $< coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.cpp000066400000000000000000000215751473776672200302400ustar00rootroot00000000000000// Copyright 2010, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2010-30-04 #include "parametricTNLP.hpp" #include "IpDenseVector.hpp" #include "IpIpoptData.hpp" #include using namespace Ipopt; /* Constructor */ ParametricTNLP::ParametricTNLP() : nominal_eta1_(5.0), nominal_eta2_(1.0), eta_1_perturbed_value_(4.5), eta_2_perturbed_value_(1.0) { } ParametricTNLP::~ParametricTNLP() { } bool ParametricTNLP::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // x1, x2, x3, eta1, eta2 n = 5; // 2 constraints + 2 parametric initial value constraints m = 4; nnz_jac_g = 10; nnz_h_lag = 5; index_style = FORTRAN_STYLE; return true; } bool ParametricTNLP::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index /*m*/, Number* g_l, Number* g_u ) { for( Index k = 0; k < 3; ++k ) { x_l[k] = 0.0; x_u[k] = 1.0e19; } x_l[3] = -1.0e19; x_u[3] = 1.0e19; x_l[4] = -1.0e19; x_u[4] = 1.0e19; g_l[0] = 0.0; g_u[0] = 0.0; g_l[1] = 0.0; g_u[1] = 0.0; // initial value constraints g_l[2] = nominal_eta1_; g_u[2] = nominal_eta1_; g_l[3] = nominal_eta2_; g_u[3] = nominal_eta2_; return true; } bool ParametricTNLP::get_starting_point( Index /*n*/, bool /*init_x*/, Number* x, bool /*init_z*/, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool /*init_lambda*/, Number* /*lambda*/ ) { x[0] = 0.15; x[1] = 0.15; x[2] = 0.0; x[3] = 0.0; x[4] = 0.0; return true; } bool ParametricTNLP::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { obj_value = 0; for( Index k = 0; k < 3; ++k ) { obj_value += x[k] * x[k]; } return true; } bool ParametricTNLP::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { grad_f[0] = 2 * x[0]; grad_f[1] = 2 * x[1]; grad_f[2] = 2 * x[2]; grad_f[3] = 0.0; grad_f[4] = 0.0; return true; } bool ParametricTNLP::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { Number x1, x2, x3, eta1, eta2; x1 = x[0]; x2 = x[1]; x3 = x[2]; eta1 = x[3]; eta2 = x[4]; g[0] = 6 * x1 + 3 * x2 + 2 * x3 - eta1; g[1] = eta2 * x1 + x2 - x3 - 1; g[2] = eta1; g[3] = eta2; return true; } bool ParametricTNLP::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index /*nele_jac*/, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { iRow[0] = 1; // dg1/dx1 jCol[0] = 1; iRow[1] = 1; // dg1/dx2 jCol[1] = 2; iRow[2] = 1; // dg1/dx3 jCol[2] = 3; iRow[3] = 1; // dg1/deta1 jCol[3] = 4; iRow[4] = 2; // dg2/dx1 jCol[4] = 1; iRow[5] = 2; // dg2/dx2 jCol[5] = 2; iRow[6] = 2; // dg2/dx3 jCol[6] = 3; iRow[7] = 2; // dg2/deta2 jCol[7] = 5; iRow[8] = 3; jCol[8] = 4; iRow[9] = 4; jCol[9] = 5; } else { values[0] = 6.0; values[1] = 3.0; values[2] = 2.0; values[3] = -1.0; values[4] = x[4]; values[5] = 1.0; values[6] = -1.0; values[7] = x[0]; values[8] = 1.0; values[9] = 1.0; } return true; } bool ParametricTNLP::eval_h( Index /*n*/, const Number* /*x*/, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index /*nele_hess*/, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { iRow[0] = 1; jCol[0] = 1; iRow[1] = 2; jCol[1] = 2; iRow[2] = 3; jCol[2] = 3; iRow[3] = 1; jCol[3] = 5; iRow[4] = 5; jCol[4] = 1; } else { values[0] = 2.0 * obj_factor; values[1] = 2.0 * obj_factor; values[2] = 2.0 * obj_factor; values[3] = 0.5 * lambda[1]; values[4] = 0.5 * lambda[1]; } return true; } bool ParametricTNLP::get_var_con_metadata( Index n, StringMetaDataMapType& /*var_string_md*/, IntegerMetaDataMapType& var_integer_md, NumericMetaDataMapType& var_numeric_md, Index m, StringMetaDataMapType& /*con_string_md*/, IntegerMetaDataMapType& con_integer_md, NumericMetaDataMapType& /*con_numeric_md*/ ) { /* In this function, the indices for the parametric computations are set. * To keep track of the parameters, each parameter gets an index from 1 to n_parameters. * In this case, [1] eta_1, [2] eta_2. * The following metadata vectors are important: */ /* 1. sens_init_constr: in this list, the constraints that set the initial * values for the parameters are indicated. * For parameter 1 (eta_1) this is constraint 3 (e.g. C++ index 2), which is * the constraint eta_1 = eta_1_nominal; * For parameter 2 (eta_2) this is constraint 4 (e.g. C++ index 3). */ std::vector sens_init_constr(m, 0); sens_init_constr[2] = 1; sens_init_constr[3] = 2; con_integer_md["sens_init_constr"] = sens_init_constr; /* 2. sens_state_1: in this index list, the parameters are indicated: * Here: [1] eta_1, [2] eta_2 */ std::vector sens_state_1(n, 0); sens_state_1[3] = 1; sens_state_1[4] = 2; var_integer_md["sens_state_1"] = sens_state_1; /* 3. sens_state_values_1: In this list of Numbers (=doubles), the perturbed * values for the parameters are set. */ std::vector sens_state_value_1(n, 0); sens_state_value_1[3] = eta_1_perturbed_value_; sens_state_value_1[4] = eta_2_perturbed_value_; var_numeric_md["sens_state_value_1"] = sens_state_value_1; return true; } void ParametricTNLP::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* x, const Number* /*z_L*/, const Number* /*z_U*/, Index m, const Number* /*g*/, const Number* lambda, Number /*obj_value*/, const IpoptData* ip_data, IpoptCalculatedQuantities* /*ip_cq*/ ) { // Check whether sIPOPT Algorithm aborted internally // bool sens_internal_abort; //options_->GetBoolValue("sens_internal_abort", sens_internal_abort, ""); // Get access to the metadata, where the solutions are stored. The metadata is part of the DenseVectorSpace. SmartPtr x_owner_space = dynamic_cast(GetRawPtr( ip_data->curr()->x()->OwnerSpace())); if( !IsValid(x_owner_space) ) { printf("Error IsValid(x_owner_space) failed\n"); return; } std::string state; std::vector sens_sol_vec; state = "sens_sol_state_1"; sens_sol_vec = x_owner_space->GetNumericMetaData(state.c_str()); // Print the solution vector printf("\n" " Nominal Perturbed\n"); for( size_t k = 0; k < sens_sol_vec.size(); ++k ) { printf("x[%3zd] % .23f % .23f\n", k, x[k], sens_sol_vec[k]); } printf("\n**********\n"); for( int k = 0; k < m; ++k ) { printf("lambda[%3d] (nom) % .23f \n", k, lambda[k]); } } void ParametricTNLP::finalize_metadata( Index n, const StringMetaDataMapType& /*var_string_md*/, const IntegerMetaDataMapType& /*var_integer_md*/, const NumericMetaDataMapType& var_numeric_md, Index m, const StringMetaDataMapType& /*con_string_md*/, const IntegerMetaDataMapType& /*con_integer_md*/, const NumericMetaDataMapType& con_numeric_md ) { // bound multipliers for lower and upper bounds printf("\nDual bound multipliers:\n"); NumericMetaDataMapType::const_iterator z_L_solution = var_numeric_md.find("sens_sol_state_1_z_L"); NumericMetaDataMapType::const_iterator z_U_solution = var_numeric_md.find("sens_sol_state_1_z_U"); if( z_L_solution != var_numeric_md.end() && z_U_solution != var_numeric_md.end() ) { for( Index k = 0; k < n; ++k ) { printf("z_L[%d] = %f z_U[%d] = %f\n", (int)k, z_L_solution->second[k], (int)k, z_U_solution->second[k]); } } // constraint mutlipliers printf("\nConstraint multipliers:\n"); NumericMetaDataMapType::const_iterator lambda_solution = con_numeric_md.find("sens_sol_state_1"); if( lambda_solution != con_numeric_md.end() ) { for( Index k = 0; k < m; ++k ) { printf("lambda[%d] (upd) = %.14g\n", (int)k, lambda_solution->second[k]); } } } coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_dsdp_cpp/parametricTNLP.hpp000066400000000000000000000100511473776672200302300ustar00rootroot00000000000000// Copyright 2010 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2010-01-05 #ifndef __PARAMETRICTNLPEXAMPLE_HPP__ #define __PARAMETRICTNLPEXAMPLE_HPP__ #include "IpTNLP.hpp" namespace Ipopt { class ParametricTNLP: public TNLP { public: /** default constructor */ ParametricTNLP(); /** default destructor */ virtual ~ParametricTNLP(); /**@name Overloaded from TNLP */ //@{ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); virtual bool get_var_con_metadata( Index n, StringMetaDataMapType& var_string_md, IntegerMetaDataMapType& var_integer_md, NumericMetaDataMapType& var_numeric_md, Index m, StringMetaDataMapType& con_string_md, IntegerMetaDataMapType& con_integer_md, NumericMetaDataMapType& con_numeric_md ); virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); virtual void finalize_metadata( Index n, const StringMetaDataMapType& var_string_md, const IntegerMetaDataMapType& var_integer_md, const NumericMetaDataMapType& var_numeric_md, Index m, const StringMetaDataMapType& con_string_md, const IntegerMetaDataMapType& con_integer_md, const NumericMetaDataMapType& con_numeric_md ); private: /**@name Methods to block default compiler methods. * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") * */ //@{ ParametricTNLP( const ParametricTNLP&); ParametricTNLP& operator=( const ParametricTNLP&); //@} /* Nominal and perturbed parameter values */ Number nominal_eta1_; Number nominal_eta2_; Number eta_1_perturbed_value_; Number eta_2_perturbed_value_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/examples/parametric_dsdp_cpp/parametric_dsdp_driver.cpp000066400000000000000000000115071473776672200321210ustar00rootroot00000000000000// Copyright 2010, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2010-01-05 #include "parametricTNLP.hpp" #include "IpIpoptApplication.hpp" #include "SensApplication.hpp" #include "IpIpoptAlg.hpp" #include "SensRegOp.hpp" int main( int /*argc*/, char** /*argv*/ ) { using namespace Ipopt; SmartPtr app_ipopt = new IpoptApplication(); SmartPtr app_sens = new SensApplication(app_ipopt->Jnlst(), app_ipopt->Options(), app_ipopt->RegOptions()); // Register sIPOPT options RegisterOptions_sIPOPT(app_ipopt->RegOptions()); app_ipopt->Options()->SetRegisteredOptions(app_ipopt->RegOptions()); // Call Initialize the first time to create a journalist, but ignore // any options file ApplicationReturnStatus retval; retval = app_ipopt->Initialize(""); if( retval != Solve_Succeeded ) { //printf("ampl_ipopt.cpp: Error in first Initialize!!!!\n"); exit(-100); } app_ipopt->Initialize(); // create AmplSensTNLP from argc. This is an nlp because we are using our own TNLP Adapter SmartPtr sens_tnlp = new ParametricTNLP(); app_ipopt->Options()->SetStringValueIfUnset("run_sens", "yes"); app_ipopt->Options()->SetIntegerValueIfUnset("n_sens_steps", 1); app_ipopt->Options()->SetStringValueIfUnset("compute_dsdp", "yes"); app_sens->Initialize(); retval = app_ipopt->OptimizeTNLP(sens_tnlp); /* give pointers to Ipopt algorithm objects to Sens Application */ app_sens->SetIpoptAlgorithmObjects(app_ipopt, retval); printf("\n"); printf("#-------------------------------------------\n"); printf("# Sensitivity without bound checking\n"); printf("#-------------------------------------------\n"); app_sens->Run(); Index m = app_sens->nl(); Index n = app_sens->nx(); Index nzl = app_sens->nzl(); Index nzu = app_sens->nzu(); Index np = app_sens->np(); Number* DDX = new Number[n]; Number* DDL = new Number[m]; Number* DDZL = new Number[nzl]; Number* DDZU = new Number[nzu]; Number* SX = new Number[n * np]; Number* SL = new Number[m * np]; Number* SZL = new Number[nzl * np]; Number* SZU = new Number[nzu * np]; app_sens->GetDirectionalDerivatives(DDX, DDL, DDZL, DDZU); app_sens->GetSensitivityMatrix(SX, SL, SZL, SZU); printf("\n** Directional Derivative (Eq. 14 of implementation paper) ** \n"); for( int i = 0; i < n; ++i ) { printf("* ds/dp(x)(p-p0)[%i] = %.14g\n", i + 1, DDX[i]); } for( int i = 0; i < m; ++i ) { printf("* ds/dp(l)(p-p0)[%i] = %.14g\n", i + 1, DDL[i]); } for( int i = 0; i < nzl; ++i ) { printf("* ds/dp(zl)(p-p0)[%i] = %.14g\n", i + 1, DDZL[i]); } for( int i = 0; i < nzu; ++i ) { printf("* ds/dp(zu)(p-p0)[%i] = %.14g\n", i + 1, DDZU[i]); } printf("\n** Sensitivity Matrix (Eq. 9 of implementation paper) ** \n"); for( int i = 0; i < n * np; ++i ) { printf("* ds/dp(x)[%i] = %.14g\n", i + 1, SX[i]); } for( int i = 0; i < m * np; ++i ) { printf("* ds/dp(l)[%i] = %.14g\n", i + 1, SL[i]); } for( int i = 0; i < nzl * np; ++i ) { printf("* ds/dp(zl)[%i] = %.14g\n", i + 1, SZL[i]); } for( int i = 0; i < nzu * np; ++i ) { printf("* ds/dp(zu)[%i] = %.14g\n", i + 1, SZU[i]); } printf("\n"); printf("#-------------------------------------------\n"); printf("# Sensitivity with bound checking\n"); printf("#-------------------------------------------\n"); app_ipopt->Options()->SetStringValue("sens_boundcheck", "yes"); app_sens->Run(); app_sens->GetDirectionalDerivatives(DDX, DDL, DDZL, DDZU); app_sens->GetSensitivityMatrix(SX, SL, SZL, SZU); printf("\n** Directional Derivative (Eq. 14 of implementation paper) ** \n"); for( int i = 0; i < n; ++i ) { printf("* ds/dp(x)(p-p0)[%i] = %.14g\n", i + 1, DDX[i]); } for( int i = 0; i < m; ++i ) { printf("* ds/dp(l)(p-p0)[%i] = %.14g\n", i + 1, DDL[i]); } for( int i = 0; i < nzl; ++i ) { printf("* ds/dp(zl)(p-p0)[%i] = %.14g\n", i + 1, DDZL[i]); } for( int i = 0; i < nzu; ++i ) { printf("* ds/dp(zu)(p-p0)[%i] = %.14g\n", i + 1, DDZU[i]); } printf("\n** Sensitivity Matrix (Eq. 9 of implementation paper) ** \n"); for( int i = 0; i < n * np; ++i ) { printf("* ds/dp(x)[%i] = %.14g\n", i + 1, SX[i]); } for( int i = 0; i < m * np; ++i ) { printf("* ds/dp(l)[%i] = %.14g\n", i + 1, SL[i]); } for( int i = 0; i < nzl * np; ++i ) { printf("* ds/dp(zl)[%i] = %.14g\n", i + 1, SZL[i]); } for( int i = 0; i < nzu * np; ++i ) { printf("* ds/dp(zu)[%i] = %.14g\n", i + 1, SZU[i]); } delete[] SX; delete[] SL; delete[] SZL; delete[] SZU; delete[] DDX; delete[] DDL; delete[] DDZL; delete[] DDZU; } coinor-ipopt-3.14.17/contrib/sIPOPT/examples/redhess_ampl/000077500000000000000000000000001473776672200233405ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/examples/redhess_ampl/red_hess.run000066400000000000000000000014731473776672200256670ustar00rootroot00000000000000# Copyright 2009, 2011 Hans Pirnay # All Rights Reserved. # This code is published under the Eclipse Public License. # # Date : 2010-10-04 # This AMPL script shows how to use the reduced hessian feature # of the asNMPC code. reset; option solver ipopt_sens; # set option to compute reduced hessian option ipopt_options 'compute_red_hessian yes'; # turn presolve off so no variables / equations are eliminated # by AMPL option presolve 0; # Introduce the reduced hessian suffix suffix red_hessian, IN; # define the variables var x1:=25e7; var x2:=0; var x3:=0; # set the variables 2 and 3 free variables. The ordering of the # variable suffixes will correspond to the ordering of the columns let x2.red_hessian := 1; let x3.red_hessian := 2; con1: x1+2*x2+3*x3=0; minimize obj: (x1-1)^2 +(x2-2)^2 + (x3-3)^2; solve; coinor-ipopt-3.14.17/contrib/sIPOPT/examples/redhess_cpp/000077500000000000000000000000001473776672200231715ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/examples/redhess_cpp/Makefile.in000066400000000000000000000037671473776672200252530ustar00rootroot00000000000000# Copyright (C) 2010 Hans Pirnay # All Rights Reserved. # This file is distributed under the Eclipse Public License. ########################################################################## # You can modify this example makefile to fit for your own program. # # Usually, you only need to change the four CHANGEME entries below. # ########################################################################## # CHANGEME: This should be the name of your executable EXE = redhess_cpp@EXEEXT@ # CHANGEME: Here is the name of all object files corresponding to the source # code that you wrote in order to define the problem statement OBJS = redhess_cpp.@OBJEXT@ \ MySensTNLP.@OBJEXT@ # CHANGEME: Additional libraries ADDLIBS = # CHANGEME: Additional flags for compilation (e.g., include flags) ADDINCFLAGS = ########################################################################## # Usually, you don't have to change anything below. Note that if you # # change certain compiler options, you might have to recompile Ipopt. # ########################################################################## # C++ Compiler command CXX = @CXX@ # C++ Compiler options CXXFLAGS = @CXXFLAGS@ # additional C++ Compiler options for linking CXXLINKFLAGS = @RPATH_FLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ # TODO there should be an sipopt .pc file from which to get flags # Include directories @COIN_HAS_PKGCONFIG_TRUE@INCL = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --cflags ipopt` $(ADDINCFLAGS) @COIN_HAS_PKGCONFIG_FALSE@INCL = -I@includedir@/coin @IPOPTLIB_CFLAGS@ $(ADDINCFLAGS) # Linker flags @COIN_HAS_PKGCONFIG_TRUE@LIBS = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --libs ipopt` -lsipopt @COIN_HAS_PKGCONFIG_FALSE@LIBS = -L@libdir@ -lsipopt -lipopt @IPOPTLIB_LFLAGS@ all: $(EXE) .SUFFIXES: .cpp .@OBJEXT@ $(EXE): $(OBJS) $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $(OBJS) $(LIBS) $(ADDLIBS) clean: rm -rf $(EXE) $(OBJS) .cpp.@OBJEXT@: $(CXX) $(CXXFLAGS) $(INCL) -c -o $@ $< coinor-ipopt-3.14.17/contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.cpp000066400000000000000000000124751473776672200256220ustar00rootroot00000000000000// Copyright 2009 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2010-10-04 #include "MySensTNLP.hpp" #include "IpDenseVector.hpp" #include using namespace Ipopt; /* Constructor. */ MySensTNLP::MySensTNLP() { } MySensTNLP::~MySensTNLP() { } bool MySensTNLP::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem has 3 variables n = 3; // one equality constraint m = 1; nnz_jac_g = 3; nnz_h_lag = 3; index_style = FORTRAN_STYLE; return true; } bool MySensTNLP::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { assert(n == 3); (void) n; assert(m == 1); (void) m; for( Index k = 0; k < 3; k++ ) { x_l[k] = -1.0e19; x_u[k] = +1.0e19; } g_l[0] = 0.0; g_u[0] = 0.0; return true; } bool MySensTNLP::get_starting_point( Index /*n*/, bool /*init_x*/, Number* x, bool /*init_z*/, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool /*init_lambda*/, Number* /*lambda*/ ) { x[0] = 25; x[1] = 0; x[2] = 0; return true; } bool MySensTNLP::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // return the value of the objective function Number x1 = x[0]; Number x2 = x[1]; Number x3 = x[2]; obj_value = (x1 - 1) * (x1 - 1) + (x2 - 2) * (x2 - 2) + (x3 - 3) * (x3 - 3); return true; } bool MySensTNLP::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) Number x1 = x[0]; Number x2 = x[1]; Number x3 = x[2]; grad_f[0] = 2 * (x1 - 1); grad_f[1] = 2 * (x2 - 2); grad_f[2] = 2 * (x3 - 3); return true; } bool MySensTNLP::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { // return the value of the constraints: g(x) Number x1 = x[0]; Number x2 = x[1]; Number x3 = x[2]; g[0] = x1 + 2 * x2 + 3 * x3; return true; } bool MySensTNLP::eval_jac_g( Index /*n*/, const Number* /*x*/, bool /*new_x*/, Index /*m*/, Index /*nele_jac*/, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints // element at 1,1: grad_{x1} g_{1}(x) iRow[0] = 1; jCol[0] = 1; // element at 1,2: grad_{x2} g_{1}(x) iRow[1] = 1; jCol[1] = 2; // element at 1,3: grad_{x3} g_{1}(x) iRow[2] = 1; jCol[2] = 3; } else { // return the values of the jacobian of the constraints // element at 1,1: grad_{x1} g_{1}(x) values[0] = 1.0; // element at 1,2: grad_{x1} g_{1}(x) values[1] = 2.0; values[2] = 3.0; } return true; } bool MySensTNLP::eval_h( Index /*n*/, const Number* /*x*/, bool /*new_x*/, Number /*obj_factor*/, Index /*m*/, const Number* /*lambda*/, bool /*new_lambda*/, Index /*nele_hess*/, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. // element at 1,1: grad^2_{x1,x1} L(x,lambda) iRow[0] = 1; jCol[0] = 1; // element at 2,2: grad^2_{x2,x2} L(x,lambda) iRow[1] = 2; jCol[1] = 2; iRow[2] = 3; jCol[2] = 3; // Note: off-diagonal elements are zero for this problem } else { // return the values // element at 1,1: grad^2_{x1,x1} L(x,lambda) values[0] = 2.0; // element at 2,2: grad^2_{x2,x2} L(x,lambda) values[1] = 2.0; values[2] = 2.0; // Note: off-diagonal elements are zero for this problem } return true; } bool MySensTNLP::get_var_con_metadata( Index /*n*/, StringMetaDataMapType& /*var_string_md*/, IntegerMetaDataMapType& var_integer_md, NumericMetaDataMapType& /*var_numeric_md*/, Index /*m*/, StringMetaDataMapType& /*con_string_md*/, IntegerMetaDataMapType& /*con_integer_md*/, NumericMetaDataMapType& /*con_numeric_md*/ ) { std::vector red_hess_idx(3, 0); red_hess_idx[1] = 1; red_hess_idx[2] = 2; var_integer_md["red_hessian"] = red_hess_idx; return true; } void MySensTNLP::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/) { // here is where we would store the solution to variables, or write to a file, etc // so we could use the solution. Since the solution is displayed to the console, // we currently do nothing here. } coinor-ipopt-3.14.17/contrib/sIPOPT/examples/redhess_cpp/MySensTNLP.hpp000066400000000000000000000066401473776672200256240ustar00rootroot00000000000000// Copyright 2009 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2010-10-04 #ifndef __MYSENSNLP_HPP__ #define __MYSENSNLP_HPP__ #include "IpTNLP.hpp" namespace Ipopt { class MySensTNLP: public TNLP { public: /** default constructor */ MySensTNLP(); /** default destructor */ virtual ~MySensTNLP(); /**@name Overloaded from TNLP */ //@{ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); virtual bool get_var_con_metadata( Index n, StringMetaDataMapType& var_string_md, IntegerMetaDataMapType& var_integer_md, NumericMetaDataMapType& var_numeric_md, Index m, StringMetaDataMapType& con_string_md, IntegerMetaDataMapType& con_integer_md, NumericMetaDataMapType& con_numeric_md ); virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); private: /**@name Methods to block default compiler methods. * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") * */ //@{ MySensTNLP( const MySensTNLP&); MySensTNLP& operator=( const MySensTNLP&); //@} }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/examples/redhess_cpp/redhess_cpp.cpp000066400000000000000000000027631473776672200262040ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2010-10-04 #include "MySensTNLP.hpp" #include "IpIpoptApplication.hpp" #include "SensApplication.hpp" #include "IpIpoptAlg.hpp" #include "SensRegOp.hpp" int main( int /*argc*/, char** /*argv*/ ) { using namespace Ipopt; SmartPtr app_ipopt = new IpoptApplication(); SmartPtr app_sens = new SensApplication(app_ipopt->Jnlst(), app_ipopt->Options(), app_ipopt->RegOptions()); // Register sIPOPT options RegisterOptions_sIPOPT(app_ipopt->RegOptions()); app_ipopt->Options()->SetRegisteredOptions(app_ipopt->RegOptions()); // Call Initialize the first time to create a journalist, but ignore // any options file ApplicationReturnStatus retval; retval = app_ipopt->Initialize(""); if( retval != Solve_Succeeded ) { //printf("ampl_ipopt.cpp: Error in first Initialize!!!!\n"); exit(-100); } app_ipopt->Initialize(); // create AmplSensTNLP from argc. This is an nlp because we are using our own TNLP Adapter SmartPtr sens_tnlp = new MySensTNLP(); app_ipopt->Options()->SetStringValueIfUnset("compute_red_hessian", "yes"); app_sens->Initialize(); retval = app_ipopt->OptimizeTNLP(sens_tnlp); /* give pointers to Ipopt algorithm objects to Sens Application */ app_sens->SetIpoptAlgorithmObjects(app_ipopt, retval); app_sens->Run(); return 0; } coinor-ipopt-3.14.17/contrib/sIPOPT/readme.txt000066400000000000000000000021411473776672200210500ustar00rootroot00000000000000 sIPOPT Toolbox for IPOPT ======================== This is the Sensitivity with IPOPT toolbox. Its purpose is to compute fast approximate solutions when parameters in the NLP change. For more information on the project please see the implementation paper, or the project website. Documentation, tutorials and test examples can be found in the IPOPT documentation as well as on the project documentation and website. Just like IPOPT, the sIPOPT code is separated into a library "libsipopt" that holds the main algorithm, and an executable that acts as a solver for AMPL. By default, the library is installed in the same directory as libipopt, and the executable is installed in the same directory as IPOPT's ampl executable. They are build in the same build process as for main Ipopt, unless --disable-sipopt has been specified for configure. Contact: The sIPOPT code was developed by Hans Pirnay (RWTH-Aachen), Rodrigo Lopez-Negrete (CMU), and Prof. Lorenz Biegler (CMU). Any questions / problems / bugs may be sent to the Hans Pirnay or the IPOPT mailing list. coinor-ipopt-3.14.17/contrib/sIPOPT/src/000077500000000000000000000000001473776672200176435ustar00rootroot00000000000000coinor-ipopt-3.14.17/contrib/sIPOPT/src/Makefile.am000066400000000000000000000025311473776672200217000ustar00rootroot00000000000000# Copyright (C) 2004, 2008 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. # # Authors: Carl Laird, Andreas Waechter, Hans Pirnay IBM 2009-12-19 includesipoptdir = $(includedir)/coin-or includesipopt_HEADERS = \ SensAlgorithm.hpp \ SensApplication.hpp \ SensBacksolver.hpp \ SensMeasurement.hpp \ SensPCalculator.hpp \ SensRegOp.hpp \ SensSchurData.hpp \ SensSchurDriver.hpp \ SensSimpleBacksolver.hpp \ SensStepCalc.hpp \ SensUtils.hpp lib_LTLIBRARIES = libsipopt.la libsipopt_la_SOURCES = \ SensAlgorithm.cpp \ SensRegOp.cpp \ SensDenseGenSchurDriver.cpp \ SensIndexPCalculator.cpp \ SensIndexSchurData.cpp \ SensMetadataMeasurement.cpp \ SensApplication.cpp \ SensUtils.cpp \ SensReducedHessianCalculator.cpp \ SensBuilder.cpp \ SensSimpleBacksolver.cpp \ SensStdStepCalc.cpp libsipopt_la_LIBADD = ../../../src/libipopt.la AM_LDFLAGS = $(LT_LDFLAGS) AM_CPPFLAGS = -DSIPOPTLIB_BUILD \ -I$(srcdir)/../../../src/Common \ -I$(srcdir)/../../../src/Interfaces \ -I$(srcdir)/../../../src/LinAlg \ -I$(srcdir)/../../../src/Algorithm/LinearSolvers \ -I$(srcdir)/../../../src/LinAlg/TMatrices \ -I$(srcdir)/../../../src/Algorithm \ -I$(srcdir)/../../../src/Algorithm/Inexact \ -I$(srcdir)/../../../src/contrib/CGPenalty coinor-ipopt-3.14.17/contrib/sIPOPT/src/Makefile.in000066400000000000000000000634271473776672200217240ustar00rootroot00000000000000# Makefile.in generated by automake 1.17 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2024 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2004, 2008 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. # # Authors: Carl Laird, Andreas Waechter, Hans Pirnay IBM 2009-12-19 VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) am__rm_f = rm -f $(am__rm_f_notfound) am__rm_rf = rm -rf $(am__rm_f_notfound) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ subdir = contrib/sIPOPT/src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(includesipopt_HEADERS) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/src/Common/config.h \ $(top_builddir)/src/Common/config_ipopt.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && echo $$files | $(am__xargs_n) 40 $(am__rm_f); }; \ } am__installdirs = "$(DESTDIR)$(libdir)" \ "$(DESTDIR)$(includesipoptdir)" LTLIBRARIES = $(lib_LTLIBRARIES) libsipopt_la_DEPENDENCIES = ../../../src/libipopt.la am_libsipopt_la_OBJECTS = SensAlgorithm.lo SensRegOp.lo \ SensDenseGenSchurDriver.lo SensIndexPCalculator.lo \ SensIndexSchurData.lo SensMetadataMeasurement.lo \ SensApplication.lo SensUtils.lo \ SensReducedHessianCalculator.lo SensBuilder.lo \ SensSimpleBacksolver.lo SensStdStepCalc.lo libsipopt_la_OBJECTS = $(am_libsipopt_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/src/Common depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/SensAlgorithm.Plo \ ./$(DEPDIR)/SensApplication.Plo ./$(DEPDIR)/SensBuilder.Plo \ ./$(DEPDIR)/SensDenseGenSchurDriver.Plo \ ./$(DEPDIR)/SensIndexPCalculator.Plo \ ./$(DEPDIR)/SensIndexSchurData.Plo \ ./$(DEPDIR)/SensMetadataMeasurement.Plo \ ./$(DEPDIR)/SensReducedHessianCalculator.Plo \ ./$(DEPDIR)/SensRegOp.Plo ./$(DEPDIR)/SensSimpleBacksolver.Plo \ ./$(DEPDIR)/SensStdStepCalc.Plo ./$(DEPDIR)/SensUtils.Plo am__mv = mv -f CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(libsipopt_la_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(includesipopt_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ACLOCAL = @ACLOCAL@ ADD_CFLAGS = @ADD_CFLAGS@ ADD_CXXFLAGS = @ADD_CXXFLAGS@ ADD_FFLAGS = @ADD_FFLAGS@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIT32FCOMMENT = @BIT32FCOMMENT@ BIT64FCOMMENT = @BIT64FCOMMENT@ BITS_PER_POINTER = @BITS_PER_POINTER@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ COIN_PKG_CONFIG_PATH = @COIN_PKG_CONFIG_PATH@ CPPFLAGS = @CPPFLAGS@ CSCOPE = @CSCOPE@ CTAGS = @CTAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CXXLIBS = @CXXLIBS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ETAGS = @ETAGS@ EXEEXT = @EXEEXT@ F77 = @F77@ FFLAGS = @FFLAGS@ FGREP = @FGREP@ FILECMD = @FILECMD@ FLIBS = @FLIBS@ GREP = @GREP@ HSLLIB_CFLAGS = @HSLLIB_CFLAGS@ HSLLIB_CFLAGS_NOPC = @HSLLIB_CFLAGS_NOPC@ HSLLIB_LFLAGS = @HSLLIB_LFLAGS@ HSLLIB_LFLAGS_NOPC = @HSLLIB_LFLAGS_NOPC@ HSLLIB_PCFILES = @HSLLIB_PCFILES@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ IPOPTAMPLINTERFACELIB_CFLAGS = @IPOPTAMPLINTERFACELIB_CFLAGS@ IPOPTAMPLINTERFACELIB_CFLAGS_NOPC = @IPOPTAMPLINTERFACELIB_CFLAGS_NOPC@ IPOPTAMPLINTERFACELIB_LFLAGS = @IPOPTAMPLINTERFACELIB_LFLAGS@ IPOPTAMPLINTERFACELIB_LFLAGS_NOPC = @IPOPTAMPLINTERFACELIB_LFLAGS_NOPC@ IPOPTAMPLINTERFACELIB_PCFILES = @IPOPTAMPLINTERFACELIB_PCFILES@ IPOPTLIB_CFLAGS = @IPOPTLIB_CFLAGS@ IPOPTLIB_CFLAGS_NOPC = @IPOPTLIB_CFLAGS_NOPC@ IPOPTLIB_LFLAGS = @IPOPTLIB_LFLAGS@ IPOPTLIB_LFLAGS_NOPC = @IPOPTLIB_LFLAGS_NOPC@ IPOPTLIB_PCFILES = @IPOPTLIB_PCFILES@ JAR = @JAR@ JAVA = @JAVA@ JAVAC = @JAVAC@ JAVADOC = @JAVADOC@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_LDFLAGS = @LT_LDFLAGS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ RPATH_FLAGS = @RPATH_FLAGS@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SIPOPTAMPLINTERFACELIB_CFLAGS = @SIPOPTAMPLINTERFACELIB_CFLAGS@ SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC = @SIPOPTAMPLINTERFACELIB_CFLAGS_NOPC@ SIPOPTAMPLINTERFACELIB_LFLAGS = @SIPOPTAMPLINTERFACELIB_LFLAGS@ SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC = @SIPOPTAMPLINTERFACELIB_LFLAGS_NOPC@ SIPOPTAMPLINTERFACELIB_PCFILES = @SIPOPTAMPLINTERFACELIB_PCFILES@ SIPOPTLIB_CFLAGS_NOPC = @SIPOPTLIB_CFLAGS_NOPC@ SIPOPTLIB_LFLAGS_NOPC = @SIPOPTLIB_LFLAGS_NOPC@ STRIP = @STRIP@ VERSION = @VERSION@ _ACJNI_JAVAC = @_ACJNI_JAVAC@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_F77 = @ac_ct_F77@ ac_ct_PKG_CONFIG = @ac_ct_PKG_CONFIG@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__rm_f_notfound = @am__rm_f_notfound@ am__tar = @am__tar@ am__untar = @am__untar@ am__xargs_n = @am__xargs_n@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ coin_doxy_logname = @coin_doxy_logname@ coin_doxy_tagfiles = @coin_doxy_tagfiles@ coin_doxy_tagname = @coin_doxy_tagname@ coin_doxy_usedot = @coin_doxy_usedot@ coin_have_doxygen = @coin_have_doxygen@ coin_have_latex = @coin_have_latex@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ includesipoptdir = $(includedir)/coin-or includesipopt_HEADERS = \ SensAlgorithm.hpp \ SensApplication.hpp \ SensBacksolver.hpp \ SensMeasurement.hpp \ SensPCalculator.hpp \ SensRegOp.hpp \ SensSchurData.hpp \ SensSchurDriver.hpp \ SensSimpleBacksolver.hpp \ SensStepCalc.hpp \ SensUtils.hpp lib_LTLIBRARIES = libsipopt.la libsipopt_la_SOURCES = \ SensAlgorithm.cpp \ SensRegOp.cpp \ SensDenseGenSchurDriver.cpp \ SensIndexPCalculator.cpp \ SensIndexSchurData.cpp \ SensMetadataMeasurement.cpp \ SensApplication.cpp \ SensUtils.cpp \ SensReducedHessianCalculator.cpp \ SensBuilder.cpp \ SensSimpleBacksolver.cpp \ SensStdStepCalc.cpp libsipopt_la_LIBADD = ../../../src/libipopt.la AM_LDFLAGS = $(LT_LDFLAGS) AM_CPPFLAGS = -DSIPOPTLIB_BUILD \ -I$(srcdir)/../../../src/Common \ -I$(srcdir)/../../../src/Interfaces \ -I$(srcdir)/../../../src/LinAlg \ -I$(srcdir)/../../../src/Algorithm/LinearSolvers \ -I$(srcdir)/../../../src/LinAlg/TMatrices \ -I$(srcdir)/../../../src/Algorithm \ -I$(srcdir)/../../../src/Algorithm/Inexact \ -I$(srcdir)/../../../src/contrib/CGPenalty all: all-am .SUFFIXES: .SUFFIXES: .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign contrib/sIPOPT/src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign contrib/sIPOPT/src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -$(am__rm_f) $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ echo rm -f $${locs}; \ $(am__rm_f) $${locs} libsipopt.la: $(libsipopt_la_OBJECTS) $(libsipopt_la_DEPENDENCIES) $(EXTRA_libsipopt_la_DEPENDENCIES) $(AM_V_CXXLD)$(CXXLINK) -rpath $(libdir) $(libsipopt_la_OBJECTS) $(libsipopt_la_LIBADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensAlgorithm.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensApplication.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensBuilder.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensDenseGenSchurDriver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensIndexPCalculator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensIndexSchurData.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensMetadataMeasurement.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensReducedHessianCalculator.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensRegOp.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensSimpleBacksolver.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensStdStepCalc.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/SensUtils.Plo@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @: >>$@ am--depfiles: $(am__depfiles_remade) .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs install-includesipoptHEADERS: $(includesipopt_HEADERS) @$(NORMAL_INSTALL) @list='$(includesipopt_HEADERS)'; test -n "$(includesipoptdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(includesipoptdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(includesipoptdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includesipoptdir)'"; \ $(INSTALL_HEADER) $$files "$(DESTDIR)$(includesipoptdir)" || exit $$?; \ done uninstall-includesipoptHEADERS: @$(NORMAL_UNINSTALL) @list='$(includesipopt_HEADERS)'; test -n "$(includesipoptdir)" || list=; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ dir='$(DESTDIR)$(includesipoptdir)'; $(am__uninstall_files_from_dir) ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags check-am: all-am check: check-am all-am: Makefile $(LTLIBRARIES) $(HEADERS) installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(includesipoptdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -$(am__rm_f) $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || $(am__rm_f) $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/SensAlgorithm.Plo -rm -f ./$(DEPDIR)/SensApplication.Plo -rm -f ./$(DEPDIR)/SensBuilder.Plo -rm -f ./$(DEPDIR)/SensDenseGenSchurDriver.Plo -rm -f ./$(DEPDIR)/SensIndexPCalculator.Plo -rm -f ./$(DEPDIR)/SensIndexSchurData.Plo -rm -f ./$(DEPDIR)/SensMetadataMeasurement.Plo -rm -f ./$(DEPDIR)/SensReducedHessianCalculator.Plo -rm -f ./$(DEPDIR)/SensRegOp.Plo -rm -f ./$(DEPDIR)/SensSimpleBacksolver.Plo -rm -f ./$(DEPDIR)/SensStdStepCalc.Plo -rm -f ./$(DEPDIR)/SensUtils.Plo -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-includesipoptHEADERS install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/SensAlgorithm.Plo -rm -f ./$(DEPDIR)/SensApplication.Plo -rm -f ./$(DEPDIR)/SensBuilder.Plo -rm -f ./$(DEPDIR)/SensDenseGenSchurDriver.Plo -rm -f ./$(DEPDIR)/SensIndexPCalculator.Plo -rm -f ./$(DEPDIR)/SensIndexSchurData.Plo -rm -f ./$(DEPDIR)/SensMetadataMeasurement.Plo -rm -f ./$(DEPDIR)/SensReducedHessianCalculator.Plo -rm -f ./$(DEPDIR)/SensRegOp.Plo -rm -f ./$(DEPDIR)/SensSimpleBacksolver.Plo -rm -f ./$(DEPDIR)/SensStdStepCalc.Plo -rm -f ./$(DEPDIR)/SensUtils.Plo -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-includesipoptHEADERS uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-generic clean-libLTLIBRARIES clean-libtool cscopelist-am \ ctags ctags-am distclean distclean-compile distclean-generic \ distclean-libtool distclean-tags dvi dvi-am html html-am info \ info-am install install-am install-data install-data-am \ install-dvi install-dvi-am install-exec install-exec-am \ install-html install-html-am install-includesipoptHEADERS \ install-info install-info-am install-libLTLIBRARIES \ install-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-includesipoptHEADERS \ uninstall-libLTLIBRARIES .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # Tell GNU make to disable its built-in pattern rules. %:: %,v %:: RCS/%,v %:: RCS/% %:: s.% %:: SCCS/s.% coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensAlgorithm.cpp000066400000000000000000000307121473776672200231310ustar00rootroot00000000000000// Copyright 2009 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-16 #include "SensAlgorithm.hpp" #include "SensUtils.hpp" #include "IpSmartPtr.hpp" #include "IpVector.hpp" #include "IpUtils.hpp" namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif SensAlgorithm::SensAlgorithm( std::vector >& driver_vec, SmartPtr sens_step_calc, SmartPtr measurement, Index n_sens_steps ) : DirectionalD_X_(NULL), DirectionalD_L_(NULL), DirectionalD_Z_L_(NULL), DirectionalD_Z_U_(NULL), SensitivityM_X_(NULL), SensitivityM_L_(NULL), SensitivityM_Z_L_(NULL), SensitivityM_Z_U_(NULL), driver_vec_(driver_vec), sens_step_calc_(sens_step_calc), measurement_(measurement), n_sens_steps_(n_sens_steps) // why doesn't he get this from the options? { DBG_START_METH("SensAlgorithm::SensAlgorithm", dbg_verbosity); DBG_ASSERT((size_t)n_sens_steps <= driver_vec.size()); } SensAlgorithm::~SensAlgorithm() { DBG_START_METH("SensAlgorithm::~SensAlgorithm", dbg_verbosity); if( NULL != DirectionalD_X_ ) { delete[] DirectionalD_X_; } if( NULL != DirectionalD_L_ ) { delete[] DirectionalD_L_; } if( NULL != DirectionalD_Z_U_ ) { delete[] DirectionalD_Z_U_; } if( NULL != DirectionalD_Z_L_ ) { delete[] DirectionalD_Z_L_; } if( NULL != SensitivityM_X_ ) { delete[] SensitivityM_X_; } if( NULL != SensitivityM_L_ ) { delete[] SensitivityM_L_; } if( NULL != SensitivityM_Z_U_ ) { delete[] SensitivityM_Z_U_; } if( NULL != SensitivityM_Z_L_ ) { delete[] SensitivityM_Z_L_; } } bool SensAlgorithm::InitializeImpl( const OptionsList& /*options*/, const std::string& /*prefix*/ ) { // initialize values for variable sizes, and allocate memory for sensitivity vectors nx_ = dynamic_cast(GetRawPtr(IpData().curr()->x()))->Dim(); nceq_ = dynamic_cast(GetRawPtr(IpData().curr()->y_c()))->Dim(); ncineq_ = dynamic_cast(GetRawPtr(IpData().curr()->y_d()))->Dim(); nzl_ = dynamic_cast(GetRawPtr(IpData().curr()->z_L()))->Dim(); nzu_ = dynamic_cast(GetRawPtr(IpData().curr()->z_U()))->Dim(); nl_ = nceq_ + ncineq_; ns_ = nx_ + nl_ + nzl_ + nzu_; DirectionalD_X_ = new Number[nx_]; if( NULL == DirectionalD_X_ ) { return false; } DirectionalD_L_ = new Number[nceq_ + ncineq_]; if( NULL == DirectionalD_L_ ) { return false; } DirectionalD_Z_L_ = new Number[nzl_]; if( NULL == DirectionalD_Z_L_ ) { return false; } DirectionalD_Z_U_ = new Number[nzu_]; if( NULL == DirectionalD_Z_U_ ) { return false; } std::string state; std::string statevalue; state = "sens_init_constr"; statevalue = "sens_init_constr"; SmartPtr x_owner_space_ = dynamic_cast( GetRawPtr(IpData().curr()->y_c()->OwnerSpace())); const std::vector idx_ipopt = x_owner_space_->GetIntegerMetaData(state.c_str()); np_ = 0; for( size_t i = 0; i < idx_ipopt.size(); ++i ) { if( idx_ipopt[i] > 0 ) { ++np_; } } SensitivityM_X_ = new Number[nx_ * np_]; if( NULL == SensitivityM_X_ ) { return false; } SensitivityM_L_ = new Number[nl_ * np_]; if( NULL == SensitivityM_L_ ) { return false; } SensitivityM_Z_L_ = new Number[nzl_ * np_]; if( NULL == SensitivityM_Z_L_ ) { return false; } SensitivityM_Z_U_ = new Number[nzu_ * np_]; if( NULL == SensitivityM_Z_U_ ) { return false; } return true; } /** Main loop: Wait for new measurement, Get new step, maybe deal with * bounds, see to it that everything happens in the required * timeframe. */ SensAlgorithmExitStatus SensAlgorithm::Run() { DBG_START_METH("SensAlgorithm::Run", dbg_verbosity); SensAlgorithmExitStatus retval = SOLVE_SUCCESS; /* Loop through all steps */ SmartPtr < IteratesVector > sol = IpData().curr()->MakeNewIteratesVector(); SmartPtr < DenseVector > delta_u; SmartPtr unscaled_x; SmartPtr unscaled_yc; SmartPtr < IteratesVector > trialcopy; for( Index step_i = 0; step_i < n_sens_steps_; ++step_i ) { sens_step_calc_->SetSchurDriver(driver_vec_[step_i]); delta_u = measurement_->GetMeasurement(step_i + 1); delta_u->Print(Jnlst(), J_VECTOR, J_USER1, "delta_u"); sens_step_calc_->Step(*delta_u, *sol); SmartPtr < IteratesVector > saved_sol = sol->MakeNewIteratesVectorCopy(); saved_sol->Print(Jnlst(), J_VECTOR, J_USER1, "sol_vec"); // unscale solution... UnScaleIteratesVector (&saved_sol); // update variables measurement_->SetSolution(step_i + 1, saved_sol); // get sensitivity vector GetDirectionalDerivatives(); } return retval; } SensAlgorithmExitStatus SensAlgorithm::ComputeSensitivityMatrix(void) { DBG_START_METH("SensAlgorithm::ComputeSensitivityMatrix", dbg_verbosity); SensAlgorithmExitStatus retval = SOLVE_SUCCESS; /* Loop through all steps */ SmartPtr < IteratesVector > sol = IpData().curr()->MakeNewIteratesVector(); SmartPtr unscaled_x; SmartPtr unscaled_yc; SmartPtr < IteratesVector > trialcopy; SmartPtr < DenseVectorSpace > delta_u_space; delta_u_space = new DenseVectorSpace(np_); SmartPtr < DenseVector > delta_u = new DenseVector(GetRawPtr(ConstPtr(delta_u_space))); Number* du_val = delta_u->Values(); std::string state; std::string statevalue; state = "sens_init_constr"; statevalue = "sens_init_constr"; SmartPtr x_owner_space_ = dynamic_cast( GetRawPtr(IpData().curr()->y_c()->OwnerSpace())); //= dynamic_cast(GetRawPtr(IpData().curr()->x()->OwnerSpace())); const std::vector idx_ipopt = x_owner_space_->GetIntegerMetaData(state.c_str()); char buffer[250]; Index col = 0; for( size_t Scol = 0; Scol < idx_ipopt.size(); ++Scol ) { if( idx_ipopt[Scol] > 0 ) { // reset rhs vector to zero for( size_t j = 0; j < idx_ipopt.size(); ++j ) { if( idx_ipopt[j] > 0 ) { du_val[idx_ipopt[j] - 1] = 0; } } Snprintf(buffer, sizeof(buffer), "Column %" IPOPT_INDEX_FORMAT, idx_ipopt[Scol]); sens_step_calc_->SetSchurDriver(driver_vec_[0]); // set rhs to 1 (eq. 9-10) du_val[idx_ipopt[Scol] - 1] = 1; delta_u->SetValues(du_val); //delta_u->Print(Jnlst(),J_VECTOR,J_USER1,"delta_u 1234567"); sens_step_calc_->Step(*delta_u, *sol); SmartPtr < IteratesVector > saved_sol = sol->MakeNewIteratesVectorCopy(); saved_sol->Print(Jnlst(), J_VECTOR, J_USER1, "sol_vec"); // unscale solution... UnScaleIteratesVector (&saved_sol); saved_sol->Print(Jnlst(), J_VECTOR, J_USER1, buffer); // Save column GetSensitivityMatrix(col); ++col; // increase column counter } } return retval; } void SensAlgorithm::GetSensitivityMatrix( Index col ) { /* Extract sensitivity vector for each vector type primal, lagrange, and bound multipliers(zl,zu) of column col of S. */ Index offset; SmartPtr < IteratesVector > SV = sens_step_calc_->GetSensitivityVector(); UnScaleIteratesVector (&SV); const Number* X_ = dynamic_cast(GetRawPtr((*SV).x()))->Values(); offset = col * nx_; for( Index i = 0; i < nx_; ++i ) { //printf(" ds/dp(X)[%3d] = %.14g\n", i+1, X_[i]); SensitivityM_X_[i + offset] = X_[i]; } const Number* Z_L_ = dynamic_cast(GetRawPtr((*SV).z_L()))->Values(); offset = col * nzl_; for( Index i = 0; i < nzl_; ++i ) { //printf(" ds/dp(X)[%3d] = %.14g\n", i+1, X_[i]); SensitivityM_Z_L_[i + offset] = Z_L_[i]; } const Number* Z_U_ = dynamic_cast(GetRawPtr((*SV).z_U()))->Values(); offset = col * nzu_; for( Index i = 0; i < nzu_; ++i ) { //printf(" ds/dp(X)[%3d] = %.14g\n", i+1, X_[i]); SensitivityM_Z_U_[i + offset] = Z_U_[i]; } const Number* LE_ = dynamic_cast(GetRawPtr((*SV).y_c()))->Values(); offset = col * nl_; for( Index i = 0; i < nceq_; ++i ) { //printf(" ds/dp(LE)[%3d] = %.14g\n", i+1, LE_[i]); SensitivityM_L_[i + offset] = LE_[i]; } const Number* LIE_ = dynamic_cast(GetRawPtr((*SV).y_d()))->Values(); for( Index i = 0; i < ncineq_; ++i ) { //printf(" ds/dp(LIE)[%3d] = %.14g\n", i+1, LIE_[i]); SensitivityM_L_[i + nceq_ + offset] = LIE_[i]; } } void SensAlgorithm::GetDirectionalDerivatives(void) { /* Extract directional derivative vector for each vector type primal, lagrange, and bound multipliers(zl,zu) */ SmartPtr < IteratesVector > SV = sens_step_calc_->GetSensitivityVector(); UnScaleIteratesVector (&SV); const Number* X_ = dynamic_cast(GetRawPtr((*SV).x()))->Values(); for( Index i = 0; i < nx_; ++i ) { //printf(" ds/dp(X)[%3d] = %.14g\n", i+1, X_[i]); DirectionalD_X_[i] = X_[i]; } const Number* Z_L_ = dynamic_cast(GetRawPtr((*SV).z_L()))->Values(); for( Index i = 0; i < nzl_; ++i ) { //printf(" ds/dp(X)[%3d] = %.14g\n", i+1, X_[i]); DirectionalD_Z_L_[i] = Z_L_[i]; } const Number* Z_U_ = dynamic_cast(GetRawPtr((*SV).z_U()))->Values(); for( Index i = 0; i < nzu_; ++i ) { //printf(" ds/dp(X)[%3d] = %.14g\n", i+1, X_[i]); DirectionalD_Z_U_[i] = Z_U_[i]; } const Number* LE_ = dynamic_cast(GetRawPtr((*SV).y_c()))->Values(); for( Index i = 0; i < nceq_; ++i ) { //printf(" ds/dp(LE)[%3d] = %.14g\n", i+1, LE_[i]); DirectionalD_L_[i] = LE_[i]; } const Number* LIE_ = dynamic_cast(GetRawPtr((*SV).y_d()))->Values(); for( Index i = 0; i < ncineq_; ++i ) { //printf(" ds/dp(LIE)[%3d] = %.14g\n", i+1, LIE_[i]); DirectionalD_L_[i + nceq_] = LIE_[i]; } } void SensAlgorithm::UnScaleIteratesVector( SmartPtr* V ) { // unscale the iterates vector // pretty much a copy from IpOrigIpopt::finalize_solution SmartPtr unscaled_x; unscaled_x = IpNLP().NLP_scaling()->unapply_vector_scaling_x((*V)->x()); DBG_ASSERT(IsValid(unscaled_x)); (*V)->Set_x(*unscaled_x); unscaled_x = NULL; SmartPtr Px_L = IpNLP().Px_L(); SmartPtr Px_U = IpNLP().Px_U(); SmartPtr x_space = IpNLP().x_space(); SmartPtr y_c = (*V)->y_c(); SmartPtr y_d = (*V)->y_d(); SmartPtr z_L = (*V)->z_L(); SmartPtr z_U = (*V)->z_U(); // unscale y_c SmartPtr unscaled_yc; SmartPtr unscaled_yd; SmartPtr unscaled_z_L; SmartPtr unscaled_z_U; Number obj_unscale_factor = IpNLP().NLP_scaling()->unapply_obj_scaling(1.); if( obj_unscale_factor != 1. ) { SmartPtr < Vector > tmp = IpNLP().NLP_scaling()->apply_vector_scaling_x_LU_NonConst(*Px_L, z_L, *x_space); tmp->Scal(obj_unscale_factor); unscaled_z_L = ConstPtr(tmp); tmp = IpNLP().NLP_scaling()->apply_vector_scaling_x_LU_NonConst(*Px_U, z_U, *x_space); tmp->Scal(obj_unscale_factor); unscaled_z_U = ConstPtr(tmp); tmp = IpNLP().NLP_scaling()->apply_vector_scaling_c_NonConst(y_c); tmp->Scal(obj_unscale_factor); unscaled_yc = ConstPtr(tmp); tmp = IpNLP().NLP_scaling()->apply_vector_scaling_d_NonConst(y_d); tmp->Scal(obj_unscale_factor); unscaled_yd = ConstPtr(tmp); } else { unscaled_z_L = IpNLP().NLP_scaling()->apply_vector_scaling_x_LU(*Px_L, z_L, *x_space); unscaled_z_U = IpNLP().NLP_scaling()->apply_vector_scaling_x_LU(*Px_U, z_U, *x_space); unscaled_yc = IpNLP().NLP_scaling()->apply_vector_scaling_c(y_c); unscaled_yd = IpNLP().NLP_scaling()->apply_vector_scaling_d(y_d); } (*V)->Set_z_U(*unscaled_z_U); (*V)->Set_z_L(*unscaled_z_L); (*V)->Set_y_c(*unscaled_yc); (*V)->Set_y_d(*unscaled_yd); } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensAlgorithm.hpp000066400000000000000000000051621473776672200231370ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-06 #ifndef __SENSALGORITHM_HPP__ #define __SENSALGORITHM_HPP__ #include "IpAlgStrategy.hpp" #include "SensStepCalc.hpp" #include "SensMeasurement.hpp" #include "SensSchurDriver.hpp" #include "SensUtils.hpp" namespace Ipopt { /** This is the interface for the actual controller. * * It handles Data input to the controller (measurement) and returns controls. */ class SIPOPTLIB_EXPORT SensAlgorithm : public AlgorithmStrategyObject { public: SensAlgorithm( std::vector< SmartPtr >& driver_vec, SmartPtr sens_step_calc, SmartPtr measurement, Index n_sens_steps ); virtual ~SensAlgorithm(); virtual bool InitializeImpl( const OptionsList& options, const std::string& prefix ); /** Main loop: Wait for new measurement, Get new step, maybe deal with * bounds, see to it that everything happens in the required * timeframe. */ SensAlgorithmExitStatus Run(); SensAlgorithmExitStatus ComputeSensitivityMatrix(void); /** accessor methods to get access to variable sizes */ Index nl(void) { return nl_; } Index nx(void) { return nx_; } Index nzl(void) { return nzl_; } Index nzu(void) { return nzu_; } Index ns(void) { return ns_; } Index np(void) { return np_; } /** array place holders to store the vector of sensitivities */ Number* DirectionalD_X_; Number* DirectionalD_L_; Number* DirectionalD_Z_L_; Number* DirectionalD_Z_U_; /** array place holders for the sensitivity matrix */ Number* SensitivityM_X_; Number* SensitivityM_L_; Number* SensitivityM_Z_L_; Number* SensitivityM_Z_U_; private: Index nl_; Index nx_; Index nzl_; Index nzu_; Index nceq_; Index ncineq_; Index ns_; Index np_; std::vector< SmartPtr > driver_vec_; SmartPtr sens_step_calc_; SmartPtr measurement_; Index n_sens_steps_; // I think it is useful to state this number explicitly in the constructor and here. /** method to extract sensitivity vectors */ void GetDirectionalDerivatives(void); /** method to extract sensitivity matrix */ void GetSensitivityMatrix( Index col ); /** private method used to uncale perturbed solution and sensitivities */ void UnScaleIteratesVector( SmartPtr* V ); }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensApplication.cpp000066400000000000000000000377451473776672200234630ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-11 #include "SensApplication.hpp" #include "SensBuilder.hpp" #include "SensUtils.hpp" #include "SensRegOp.hpp" // Ipopt includes #include "IpPDSearchDirCalc.hpp" #include "IpIpoptAlg.hpp" namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif SensApplication::SensApplication( SmartPtr jnlst, SmartPtr options, SmartPtr reg_options ) : DirectionalD_X(NULL), DirectionalD_L(NULL), DirectionalD_Z_L(NULL), DirectionalD_Z_U(NULL), SensitivityM_X(NULL), SensitivityM_L(NULL), SensitivityM_Z_L(NULL), SensitivityM_Z_U(NULL), jnlst_(jnlst), options_(options), reg_options_(reg_options), ipopt_retval_(Internal_Error), controller(NULL) { DBG_START_METH("SensApplication::SensApplication", dbg_verbosity); // Initialize Journalist DBG_DO(SmartPtr sens_jrnl = jnlst_->AddFileJournal("Sensitivity", "sensdebug.out", J_ITERSUMMARY); sens_jrnl->SetPrintLevel(J_USER1, J_ALL)); } SensApplication::~SensApplication() { DBG_START_METH("SensApplication::~SensApplication", dbg_verbosity); } void SensApplication::RegisterOptions( SmartPtr roptions ) { // Options for parameter sensitivity roptions->SetRegisteringCategory("sIPOPT", 1000000); roptions->AddLowerBoundedIntegerOption("n_sens_steps", "Number of steps computed by sIPOPT", 0, 1); roptions->AddBoolOption("sens_boundcheck", "Activate boundcheck and re-solve Schur decomposition for sIPOPT", false, "If this option is activated, the algorithm will check the iterate after an initial Schursolve and will resolve the decomposition if any bounds are not satisfied"); roptions->AddLowerBoundedNumberOption("sens_bound_eps", "Bound accuracy within which a bound still is considered to be valid", 0, true, 1e-3, "The schur complement solution cannot make sure that variables stay inside bounds. " "I cannot use the primal-frac-to-the-bound step because I don't know if the initial iterate is feasible. " "To make things easier for me I have decided to make bounds not so strict."); roptions->AddBoolOption("compute_red_hessian", "Determines if reduced Hessian should be computed", false); roptions->AddBoolOption("compute_dsdp", "Determines if matrix of sensitivites should be computed", false); // This option must be in IpInterfacesRegOp.cpp roptions->AddBoolOption("run_sens", "Determines if sIPOPT alg runs", false, "", true); roptions->AddBoolOption("sens_internal_abort", "Internal option - if set (internally), sens algorithm is not conducted", false, "", true); roptions->AddBoolOption("redhess_internal_abort", "Internal option - if set (internally), reduced hessian computation is not conducted", false, "", true); roptions->AddBoolOption("ignore_suffix_error", "If set, IPOPT runs even if there are errors in the suffixes", false); roptions->AddLowerBoundedNumberOption("sens_max_pdpert", "Maximum perturbation of primal dual system, for that the sIPOPT algorithm will not abort", 0.0, true, 1e-3, "For certain problems, IPOPT uses inertia correction of the primal dual matrix to achieve " "better convergence properties. This inertia correction changes the matrix and renders it " "useless for the use with sIPOPT. This option sets an upper bound, which the inertia correction " "may have. If any of the inertia correction values is above this bound, the sIPOPT algorithm " "is aborted."); roptions->AddBoolOption("rh_eigendecomp", "Whether the eigenvalue decomposition of the reduced hessian matrix is computed", false, "The eigenvalue decomposition of the reduced hessian has different meanings depending on the specific problem. For parameter estimation problems, the eigenvalues are linked to the confidence interval of the parameters. See for example Victor Zavala's Phd thesis, chapter 4 for details."); roptions->AddBoolOption("sens_allow_inexact_backsolve", "Allow inexact computation of backsolve in sIPOPT.", true); roptions->AddBoolOption("sens_kkt_residuals", "For sensitivity solution, take KKT residuals into account", true, "The residuals of the KKT conditions should be zero at the optimal solution. However, in practice, especially for large problems and depending on the termination criteria, they may deviate from this theoretical state. If this option is set to yes, the residuals will be taken into account when computing the right hand side for the sensitivity step."); } SensAlgorithmExitStatus SensApplication::Run() { DBG_START_METH("SensApplication::Run", dbg_verbosity); SensAlgorithmExitStatus retval = SOLVE_SUCCESS; bool sens_internal_abort, redhess_internal_abort; Options()->GetBoolValue("sens_internal_abort", sens_internal_abort, ""); Options()->GetBoolValue("redhess_internal_abort", redhess_internal_abort, ""); if( run_sens_ && sens_internal_abort ) { jnlst_->Printf(J_WARNING, J_MAIN, "\n\t--------------= Warning =--------------\nInternal abort has been called for the sensitivity calculations.\n"); } if( compute_red_hessian_ && redhess_internal_abort ) { jnlst_->Printf(J_WARNING, J_MAIN, "\n\t--------------= Warning =--------------\nInternal abort has been called for the sensitivity calculations.\n"); } SolverReturn status = AppReturn2SolverReturn(ipopt_retval_); // Check for perturbation of primal dual system Number max_pdpert; if( ipopt_retval_ == 0 || ipopt_retval_ == 1 ) { // otherwise, the values might not be available Options()->GetNumericValue("sens_max_pdpert", max_pdpert, ""); Number pdpert_x, pdpert_s, pdpert_c, pdpert_d; ip_data_->getPDPert(pdpert_x, pdpert_s, pdpert_c, pdpert_d); if( Max(pdpert_x, pdpert_s, pdpert_c, pdpert_d) > max_pdpert ) { jnlst_->Printf(J_WARNING, J_MAIN, "\n\t--------------= Warning =--------------\nInertia correction of primal dual system is too large for meaningful sIPOPT results.\n" "\t... aborting computation.\n" "Set option sens_max_pdpert to a higher value (current: %f) to run sIPOPT algorithm anyway\n", max_pdpert); sens_internal_abort = true; redhess_internal_abort = true; } } if( compute_red_hessian_ && !redhess_internal_abort ) { SmartPtr schur_builder = new SensBuilder(); const std::string prefix = ""; // I should be getting this somewhere else... SmartPtr red_hess_calc = schur_builder->BuildRedHessCalc(*jnlst_, *options_, prefix, *ip_nlp_, *ip_data_, *ip_cq_, *pd_solver_); red_hess_calc->ComputeReducedHessian(); } if( run_sens_ && n_sens_steps_ > 0 && !sens_internal_abort ) { SmartPtr schur_builder = new SensBuilder(); const std::string prefix = ""; // I should be getting this somewhere else... /* SmartPtr controller = schur_builder->BuildSensAlg(*jnlst_, *options_, prefix, *ip_nlp_, *ip_data_, *ip_cq_, *pd_solver_); */ controller = schur_builder->BuildSensAlg(*jnlst_, *options_, prefix, *ip_nlp_, *ip_data_, *ip_cq_, *pd_solver_); retval = controller->Run(); if( compute_dsdp_ ) { controller->ComputeSensitivityMatrix(); } } else if( run_sens_ ) { if( n_sens_steps_ <= 0 ) { jnlst_->Printf(J_WARNING, J_MAIN, "\n" "The run_sens option was set to true, but the specified\n" "number of sensitivity steps was set to zero.\n" "Computation is aborted.\n\n"); } } if( IsValid(ip_data_->curr()) && IsValid(ip_data_->curr()->x()) ) { // point pointers to sensitivity vectors... // only if controller (sens_app) is created if( NULL != GetRawPtr(controller) ) { DirectionalD_X = controller->DirectionalD_X_; DirectionalD_L = controller->DirectionalD_L_; DirectionalD_Z_L = controller->DirectionalD_Z_L_; DirectionalD_Z_U = controller->DirectionalD_Z_U_; if( compute_dsdp_ ) { SensitivityM_X = controller->SensitivityM_X_; SensitivityM_L = controller->SensitivityM_L_; SensitivityM_Z_L = controller->SensitivityM_Z_L_; SensitivityM_Z_U = controller->SensitivityM_Z_U_; } } SmartPtr c; SmartPtr d; SmartPtr zL; SmartPtr zU; SmartPtr yc; SmartPtr yd; Number obj = 0.; switch( status ) { case SUCCESS: /*c = ip_cq_->curr_c(); d = ip_cq_->curr_d(); obj = ip_cq_->curr_f(); zL = ip_data_->curr()->z_L(); zU = ip_data_->curr()->z_U(); yc = ip_data_->curr()->y_c(); yd = ip_data_->curr()->y_d();*/ case MAXITER_EXCEEDED: case STOP_AT_TINY_STEP: case STOP_AT_ACCEPTABLE_POINT: case LOCAL_INFEASIBILITY: case USER_REQUESTED_STOP: case FEASIBLE_POINT_FOUND: case DIVERGING_ITERATES: case RESTORATION_FAILURE: case ERROR_IN_STEP_COMPUTATION: c = ip_cq_->curr_c(); d = ip_cq_->curr_d(); obj = ip_cq_->curr_f(); zL = ip_data_->curr()->z_L(); zU = ip_data_->curr()->z_U(); yc = ip_data_->curr()->y_c(); yd = ip_data_->curr()->y_d(); break; default: SmartPtr tmp = ip_data_->curr()->y_c()->MakeNew(); tmp->Set(0.); c = ConstPtr(tmp); yc = ConstPtr(tmp); tmp = ip_data_->curr()->y_d()->MakeNew(); tmp->Set(0.); d = ConstPtr(tmp); yd = ConstPtr(tmp); tmp = ip_data_->curr()->z_L()->MakeNew(); tmp->Set(0.); zL = ConstPtr(tmp); tmp = ip_data_->curr()->z_U()->MakeNew(); tmp->Set(0.); zU = ConstPtr(tmp); } if( compute_red_hessian_ && redhess_internal_abort ) { jnlst_->Printf(J_WARNING, J_MAIN, "\nReduced hessian was not computed " "because an error occurred.\n" "See exception message above for details.\n\n"); } if( run_sens_ && sens_internal_abort ) { jnlst_->Printf(J_WARNING, J_MAIN, "\nsIPOPT was not called " "because an error occurred.\n" "See exception message above for details.\n\n"); } ip_nlp_->FinalizeSolution(status, *ip_data_->curr()->x(), *zL, *zU, *c, *d, *yc, *yd, obj, GetRawPtr(ip_data_), GetRawPtr(ip_cq_)); } return retval; } void SensApplication::Initialize() { DBG_START_METH("SensApplication::Initialize", dbg_verbosity); const std::string prefix = ""; // I should be getting this somewhere else... Options()->GetIntegerValue("n_sens_steps", n_sens_steps_, prefix.c_str()); Options()->GetBoolValue("run_sens", run_sens_, prefix.c_str()); Options()->GetBoolValue("compute_red_hessian", compute_red_hessian_, prefix.c_str()); Options()->GetBoolValue("compute_dsdp", compute_dsdp_, prefix.c_str()); if( compute_dsdp_ && !run_sens_ ) { // cannot compute sensitivities if run_sens is not active. jnlst_->Printf(J_WARNING, J_INITIALIZATION, "Compute sensitivity matrix was chosed but run_sens is set to no.\nReverting compute sensitivities to no.\n"); compute_dsdp_ = false; } // make sure run_sens and skip_finalize_solution_call are consistent if( run_sens_ || compute_red_hessian_ ) { Options()->SetStringValue("skip_finalize_solution_call", "yes"); } else { Options()->SetStringValue("skip_finalize_solution_call", "no"); } } void SensApplication::SetIpoptAlgorithmObjects( SmartPtr app_ipopt, ApplicationReturnStatus ipopt_retval ) { DBG_START_METH("SensApplication::SetIpoptAlgorithmObjects", dbg_verbosity); // get optionsList and Journalist options_ = app_ipopt->Options(); jnlst_ = app_ipopt->Jnlst(); ipopt_retval_ = ipopt_retval; // Check whether Ipopt solved to optimality - if not, end computation. if( ipopt_retval != Solve_Succeeded && ipopt_retval != Solved_To_Acceptable_Level ) { jnlst_->Printf(J_ERROR, J_MAIN, "sIPOPT: Aborting sIPOPT computation, because IPOPT did not succeed\n\n"); options_->SetStringValue("sens_internal_abort", "yes"); options_->SetStringValue("redhess_internal_abort", "yes"); } // get pointers from IpoptApplication assessor methods SmartPtr alg = app_ipopt->AlgorithmObject(); SmartPtr pd_search; pd_search = dynamic_cast(GetRawPtr(alg->SearchDirCalc())); // get PD_Solver pd_solver_ = pd_search->PDSolver(); // get data ip_data_ = app_ipopt->IpoptDataObject(); // get calulated quantities ip_cq_ = app_ipopt->IpoptCQObject(); // get NLP ip_nlp_ = app_ipopt->IpoptNLPObject(); options_->GetIntegerValue("n_sens_steps", n_sens_steps_, ""); // This checking should be rewritten /* if (false && run_sens_) { // check suffixes std::string state; std::string state_value; const Index* index; const Number* number; Index n_sens_indices, n_this_nmpc_indices; // collect information from suffixes state = "sens_state_1"; //index = ampl_tnlp_->get_index_suffix(state.c_str()); if (index==NULL) { THROW_EXCEPTION(NMPC_SUFFIX_ERROR, "Suffix sens_state_1 is not set"); } n_nmpc_indices = AsIndexSum(ip_data_->curr()->x()->Dim(), index, 1); for (Index i=1; i<=n_sens_steps_; ++i) { state = "sens_state_"; state_value = "sens_state_value_"; append_Index(state, i); append_Index(state_value, i); //index = ampl_tnlp_->get_index_suffix(state.c_str()); if (index==NULL) { std::string msg = "Suffix " + state + " is not set"; THROW_EXCEPTION(NMPC_SUFFIX_ERROR, msg); } n_this_nmpc_indices = AsIndexSum(ip_data_->curr()->x()->Dim(), index, 1); if (n_this_nmpc_indices!=n_nmpc_indices) { std::string msg = "Suffix" + state + "does not have the correct number of flags"; THROW_EXCEPTION(NMPC_SUFFIX_ERROR, msg); } //number = ampl_tnlp_->get_number_suffix(state_value.c_str()); if (number==NULL) { std::string msg = "Suffix " + state_value + " is not set"; THROW_EXCEPTION(NMPC_SUFFIX_ERROR, msg); } } } */ } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensApplication.hpp000066400000000000000000000111661473776672200234550ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-06 #ifndef __SENSAPPLICATION_HPP__ #define __SENSAPPLICATION_HPP__ #include "IpReferenced.hpp" #include "SensUtils.hpp" #include "SensUtils.hpp" #include "SensAlgorithm.hpp" #include "IpRegOptions.hpp" #include "IpIpoptApplication.hpp" #include "IpPDSystemSolver.hpp" #include "IpSmartPtr.hpp" namespace Ipopt { /** Standard exception for wrong/inconsistent suffixes for sipopt */ DECLARE_STD_SIPOPT_EXCEPTION(SENS_SUFFIX_ERROR); class SIPOPTLIB_EXPORT SensApplication: public ReferencedObject { public: // constructor SensApplication( SmartPtr jnlst, SmartPtr options, SmartPtr reg_options ); ~SensApplication(); static void RegisterOptions( SmartPtr roptions ); SensAlgorithmExitStatus Run(); void Initialize(); void SetIpoptAlgorithmObjects( SmartPtr app_ipopt, ApplicationReturnStatus ipopt_retval ); SmartPtr Jnlst() { return jnlst_; } SmartPtr Options() { return options_; } /** Get the options list for setting options (const version) */ SmartPtr Options() const { return ConstPtr(options_); } /** Copy over value of Directional Derivatives K^(-1)N_p(p-p0) */ void GetDirectionalDerivatives( Number* SX, Number* SL, Number* SZL, Number* SZU ) { if( GetRawPtr(controller) != NULL && NULL != DirectionalD_X && NULL != DirectionalD_Z_L && NULL != DirectionalD_Z_U && NULL != DirectionalD_L ) { for( Index i = 0; i < controller->nx(); ++i ) { SX[i] = DirectionalD_X[i]; } for( Index i = 0; i < controller->nzu(); ++i ) { SZU[i] = DirectionalD_Z_U[i]; } for( Index i = 0; i < controller->nzl(); ++i ) { SZL[i] = DirectionalD_Z_L[i]; } for( Index i = 0; i < controller->nl(); ++i ) { SL[i] = DirectionalD_L[i]; } } } /** Copy over value of ds/dp */ void GetSensitivityMatrix( Number* SX, Number* SL, Number* SZL, Number* SZU ) { if( GetRawPtr(controller) != NULL && NULL != SensitivityM_X && NULL != SensitivityM_Z_L && NULL != SensitivityM_Z_U && NULL != SensitivityM_L ) { for( Index i = 0; i < controller->nx() * controller->np(); ++i ) { SX[i] = SensitivityM_X[i]; } for( Index i = 0; i < controller->nzu() * controller->np(); ++i ) { SZU[i] = SensitivityM_Z_U[i]; } for( Index i = 0; i < controller->nzl() * controller->np(); ++i ) { SZL[i] = SensitivityM_Z_L[i]; } for( Index i = 0; i < controller->nl() * controller->np(); ++i ) { SL[i] = SensitivityM_L[i]; } } } /** accessor methods to get sizing info */ Index nx() { return (GetRawPtr(controller) != NULL) ? controller->nx() : -1; } Index nl() { return (GetRawPtr(controller) != NULL) ? controller->nl() : -1; } Index nzu() { return (GetRawPtr(controller) != NULL) ? controller->nzu() : -1; } Index nzl() { return (GetRawPtr(controller) != NULL) ? controller->nzl() : -1; } Index np() { return (GetRawPtr(controller) != NULL) ? controller->np() : -1; } /* place holders to keep the values of the directional derivatives for each type of variable */ Number* DirectionalD_X; Number* DirectionalD_L; Number* DirectionalD_Z_L; Number* DirectionalD_Z_U; /* place holders to keep the values of ds/dp for each type of variable */ Number* SensitivityM_X; Number* SensitivityM_L; Number* SensitivityM_Z_L; Number* SensitivityM_Z_U; private: // standard constructor just so it can't be used // SensApplication(); // Pointers that are immediately passed from Ipopt and initialized by the constructor SmartPtr jnlst_; SmartPtr options_; SmartPtr ip_data_; SmartPtr ip_cq_; SmartPtr pd_solver_; SmartPtr ip_nlp_; SmartPtr reg_options_; ApplicationReturnStatus ipopt_retval_; SmartPtr controller; /** storing options values */ bool run_sens_; bool compute_red_hessian_; bool compute_dsdp_; Index n_sens_steps_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensBacksolver.hpp000066400000000000000000000012441473776672200233010ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-14 #ifndef __ASASBACKSOLVER_HPP__ #define __ASASBACKSOLVER_HPP__ #include "IpAlgStrategy.hpp" #include "IpIteratesVector.hpp" namespace Ipopt { class SIPOPTLIB_EXPORT SensBacksolver: public AlgorithmStrategyObject { /** This class is the interface to all backsolvers that may * be used for the sIPOPT. */ public: SensBacksolver() { } virtual ~SensBacksolver() { } virtual bool Solve( SmartPtr delta_lhs, SmartPtr delta_rhs ) = 0; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensBuilder.cpp000066400000000000000000000127021473776672200225700ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-10 #include "SensBuilder.hpp" #include "SensPCalculator.hpp" #include "SensIndexPCalculator.hpp" #include "SensSchurData.hpp" #include "SensIndexSchurData.hpp" #include "SensDenseGenSchurDriver.hpp" #include "SensMeasurement.hpp" #include "SensMetadataMeasurement.hpp" #include "SensStdStepCalc.hpp" #include #include namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif SensBuilder::SensBuilder() { DBG_START_METH("SensBuilder::SensBuilder", dbg_verbosity); } SensBuilder::~SensBuilder() { DBG_START_METH("SensBuilder::~SensBuilder", dbg_verbosity); } SmartPtr SensBuilder::BuildSensAlg( const Journalist& jnlst, const OptionsList& options, const std::string& prefix, IpoptNLP& ip_nlp, IpoptData& ip_data, IpoptCalculatedQuantities& ip_cq, PDSystemSolver& pd_solver ) { DBG_START_METH("SensBuilder::BuildSensAlg", dbg_verbosity); // Very first thing is setting trial = curr. SmartPtr trialcopyvector = ip_data.curr()->MakeNewIteratesVectorCopy(); ip_data.set_trial(trialcopyvector); // Check options which Backsolver to use here SmartPtr backsolver = new SimpleBacksolver(&pd_solver); // Create measurement unit SmartPtr measurement = new MetadataMeasurement(); (dynamic_cast(GetRawPtr(measurement)))->Initialize(jnlst, ip_nlp, ip_data, ip_cq, options, prefix); // Check ParameterData, send it to Pcalculator SmartPtr E_0; E_0 = new IndexSchurData(); std::vector initial_c = measurement->GetInitialEqConstraints(); // type: List E_0->SetData_List(initial_c); E_0->Print(jnlst, J_VECTOR, J_USER1, "E_0"); SmartPtr pcalc; bool bound_check; options.GetBoolValue("sens_boundcheck", bound_check, prefix); if( bound_check ) { pcalc = new IndexPCalculator(backsolver, new IndexSchurData()); bool retval = pcalc->Initialize(jnlst, ip_nlp, ip_data, ip_cq, options, prefix); DBG_ASSERT(retval); (void) retval; } // Find out how many steps there are and create as many SchurSolveDrivers Index n_sens_steps; options.GetIntegerValue("n_sens_steps", n_sens_steps, prefix); // Create std::vector container in which we are going to keep the SchurDrivers std::vector > driver_vec(n_sens_steps); /** Here there should be the point to pass on the driver_vec and fork off the * Schurcomputations to a different function/process if needed. */ std::vector sens_state_list; Index schur_retval; std::string E_i_name; /** THIS FOR-LOOP should be done better with a better * Measurement class. This should get it's own branch! */ for( Index i = 0; i < n_sens_steps; ++i ) { driver_vec[i] = new DenseGenSchurDriver(backsolver, pcalc, E_0); driver_vec[i]->Initialize(jnlst, ip_nlp, ip_data, ip_cq, options, prefix); schur_retval = driver_vec[i]->SchurBuild(); DBG_ASSERT(schur_retval); schur_retval = driver_vec[i]->SchurFactorize(); DBG_ASSERT(schur_retval); (void) schur_retval; } SmartPtr sens_stepper = new StdStepCalculator(E_0, backsolver); sens_stepper->Initialize(jnlst, ip_nlp, ip_data, ip_cq, options, prefix); SmartPtr controller = new SensAlgorithm(driver_vec, sens_stepper, measurement, n_sens_steps); controller->Initialize(jnlst, ip_nlp, ip_data, ip_cq, options, prefix); return controller; } SmartPtr SensBuilder::BuildRedHessCalc( const Journalist& jnlst, const OptionsList& options, const std::string& prefix, IpoptNLP& ip_nlp, IpoptData& ip_data, IpoptCalculatedQuantities& ip_cq, PDSystemSolver& pd_solver ) { DBG_START_METH("SensBuilder::BuildRedHessCalc", dbg_verbosity); // Check options which Backsolver to use here SmartPtr backsolver = new SimpleBacksolver(&pd_solver); // Create suffix handler SmartPtr suffix_handler = new MetadataMeasurement(); dynamic_cast(GetRawPtr(suffix_handler))->Initialize(jnlst, ip_nlp, ip_data, ip_cq, options, prefix); SmartPtr E_0; E_0 = new IndexSchurData(); std::vector hessian_suff = suffix_handler->GetIntegerSuffix("red_hessian"); Index setdata_error = E_0->SetData_Index(hessian_suff.size(), &hessian_suff[0], 1.0); if( setdata_error ) { jnlst.Printf(J_ERROR, J_MAIN, "\nEXIT: An Error Occured while processing the Indices for the reduced Hessian computation: " "Something is wrong with index %" IPOPT_INDEX_FORMAT "\n", setdata_error); THROW_EXCEPTION(SENS_BUILDER_ERROR, "Reduced Hessian Index Error"); } SmartPtr pcalc; pcalc = new IndexPCalculator(backsolver, E_0); bool retval = pcalc->Initialize(jnlst, ip_nlp, ip_data, ip_cq, options, prefix); DBG_ASSERT(retval); (void) retval; pcalc->ComputeP(); SmartPtr red_hess_calc = new ReducedHessianCalculator(E_0, pcalc); red_hess_calc->Initialize(jnlst, ip_nlp, ip_data, ip_cq, options, prefix); return red_hess_calc; } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensBuilder.hpp000066400000000000000000000025471473776672200226030ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-10 #ifndef __ASSCHURBUILDER_HPP__ #define __ASSCHURBUILDER_HPP__ #include "IpReferenced.hpp" #include "SensAlgorithm.hpp" #include "IpPDSystemSolver.hpp" #include "SensUtils.hpp" #include "SensReducedHessianCalculator.hpp" namespace Ipopt { DECLARE_STD_SIPOPT_EXCEPTION(SENS_BUILDER_ERROR); class SensBuilder: public ReferencedObject { /** This class sets up everything necessary and * builds the P matrix which is an intermediate step * in calculating the schur matrix. */ public: SensBuilder(); ~SensBuilder(); SmartPtr BuildSensAlg( const Journalist& jnlst, const OptionsList& options, const std::string& prefix, IpoptNLP& ip_nlp, IpoptData& ip_data, IpoptCalculatedQuantities& ip_cq, PDSystemSolver& pd_solver ); SmartPtr BuildRedHessCalc( const Journalist& jnlst, const OptionsList& options, const std::string& prefix, IpoptNLP& ip_nlp, IpoptData& ip_data, IpoptCalculatedQuantities& ip_cq, PDSystemSolver& pd_solver ); }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensDenseGenSchurDriver.cpp000066400000000000000000000070221473776672200250520ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-11-19 #include "SensDenseGenSchurDriver.hpp" #include "SensIndexSchurData.hpp" namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif DenseGenSchurDriver::DenseGenSchurDriver( SmartPtr backsolver, SmartPtr pcalc, SmartPtr /*data_B*/ ) : SchurDriver(pcalc, new IndexSchurData()), backsolver_(backsolver), S_(NULL) { DBG_START_METH("DenseGenSchurDriver::DenseGenSchurDriver", dbg_verbosity); } DenseGenSchurDriver::~DenseGenSchurDriver() { DBG_START_METH("DenseGenSchurDriver::~DenseGenSchurDriver", dbg_verbosity); } bool DenseGenSchurDriver::SchurBuild() { DBG_START_METH("DenseGenSchurDriver::SchurBuild", dbg_verbosity); /* This function is the very same as the one in DenseGenSchurDriver */ bool retval = true; Index dim_S = 0; if( IsValid(data_B()) ) { dim_S = data_B()->GetNRowsAdded(); } if( dim_S > 0 ) { S_ = NULL; SmartPtr S_space = new DenseGenMatrixSpace(dim_S, dim_S); S_ = new DenseGenMatrix(GetRawPtr(S_space)); SmartPtr S2 = GetRawPtr(S_); //retval = pcalc_nonconst()->GetSchurMatrix(GetRawPtr(data_B()), dynamic_cast(GetRawPtr(S_))); retval = pcalc_nonconst()->GetSchurMatrix(data_B(), S2); S_->Print(Jnlst(), J_VECTOR, J_USER1, "S_"); } return retval; } bool DenseGenSchurDriver::SchurFactorize() { DBG_START_METH("DenseGenSchurDriver::SchurFactorize", dbg_verbosity); /* This function is the very same as the one in DenseGenSchurDriver */ bool retval; if( IsValid(S_) ) { retval = S_->ComputeLUFactorInPlace(); return retval; } return true; } /* The functions SchurSolve do IFT step, if S_==NULL, and DenseGenSchurDriver otherwise. */ bool DenseGenSchurDriver::SchurSolve( SmartPtr lhs, ///< new left hand side will be stored here SmartPtr rhs, ///< rhs r_s SmartPtr delta_u, ///< should be (u_p - u_0) WATCH OUT FOR THE SIGN! I like it this way, so that u_0+delta_u = u_p, but victor always used it the other way round, so be careful. At the end, delta_nu is saved in here. SmartPtr sol ///< the vector K^(-1)*r_s which usually should have been computed before. ) { DBG_START_METH("DenseGenSchurDriver::SchurSolve", dbg_verbosity); DBG_ASSERT(IsValid(S_)); bool retval; // set up rhs of equation (3.48a) SmartPtr delta_rhs = delta_u->MakeNew(); data_B()->Multiply(*sol, *delta_rhs); delta_rhs->Print(Jnlst(), J_VECTOR, J_USER1, "delta_rhs"); delta_rhs->Scal(-1.0); delta_rhs->Axpy(1.0, *delta_u); delta_rhs->Print(Jnlst(), J_VECTOR, J_USER1, "rhs 3.48a"); // solve equation (3.48a) for delta_nu SmartPtr delta_nu = dynamic_cast(GetRawPtr(delta_rhs))->MakeNewDenseVector(); delta_nu->Copy(*delta_rhs); S_->LUSolveVector(*delta_nu); // why is LUSolveVector not bool?? delta_nu->Print(Jnlst(), J_VECTOR, J_USER1, "delta_nu"); // solve equation (3.48b) for lhs (=delta_s) SmartPtr new_rhs = lhs->MakeNewIteratesVector(); data_A()->TransMultiply(*delta_nu, *new_rhs); new_rhs->Axpy(-1.0, *rhs); new_rhs->Scal(-1.0); new_rhs->Print(Jnlst(), J_VECTOR, J_USER1, "new_rhs"); retval = backsolver_->Solve(lhs, ConstPtr(new_rhs)); return retval; } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensDenseGenSchurDriver.hpp000066400000000000000000000033611473776672200250610ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-11-19 #ifndef __ASIFTSCHURDRIVER_HPP__ #define __ASIFTSCHURDRIVER_HPP__ #include "SensSchurDriver.hpp" #include "SensBacksolver.hpp" #include "IpDenseGenMatrix.hpp" namespace Ipopt { class DenseGenSchurDriver: public SchurDriver { public: DenseGenSchurDriver( SmartPtr backsolver, SmartPtr pcalc, SmartPtr data_B ); virtual ~DenseGenSchurDriver(); /** Creates the SchurMatrix from B and P */ virtual bool SchurBuild(); /** Calls the factorization routine for the SchurMatrix */ virtual bool SchurFactorize(); /** Performs a backsolve on S and : Solves the system * * \f$\left[\begin{array}{c|c} * K & E\\\hline * E^T & 0 * \end{array} * \right] * \left[\begin{array}{c}x\\y\end{array}\right] = * \left[\begin{array}{c}f\\g\end{array}\right]\f$ * * y will be stored in g at exit. * Kf should hold * * \f$K^{-1}f\f$ * * if it has been computed previously. If it is not available, just * pass in Kf=NULL and it will be computed internally. */ virtual bool SchurSolve( SmartPtr x, SmartPtr f, SmartPtr g, SmartPtr Kf = NULL ); /** DEPRECATED Performs a backsolve on S and K virtual bool SchurSolve(SmartPtr lhs, SmartPtr rhs, SmartPtr delta_u); */ private: SmartPtr ift_data_; SmartPtr backsolver_; SmartPtr S_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensIndexPCalculator.cpp000066400000000000000000000157071473776672200244130ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-27 #include "SensIndexPCalculator.hpp" #include "SensIndexSchurData.hpp" #include "IpDenseVector.hpp" #include "IpDenseGenMatrix.hpp" #include "IpBlas.hpp" #include namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif IndexPCalculator::IndexPCalculator( SmartPtr backsolver, SmartPtr A_data ) : PCalculator(backsolver, A_data), nrows_(0), ncols_(A_data->GetNRowsAdded()) { DBG_START_METH("IndexPCalculator::IndexPCalculator", dbg_verbosity); } IndexPCalculator::~IndexPCalculator() { DBG_START_METH("IndexPCalculator::~IndexPCalculator", dbg_verbosity); } bool IndexPCalculator::InitializeImpl( const OptionsList& /*options*/, const std::string& /*prefix*/ ) { DBG_START_METH("IndexPCalculator::InitializeImpl", dbg_verbosity); SmartPtr iv = IpData().curr(); nrows_ = 0; for( Index i = 0; i < iv->NComps(); ++i ) { nrows_ += iv->GetComp(i)->Dim(); } data_A()->Print(Jnlst(), J_VECTOR, J_USER1, "PCalc SchurData"); return true; } bool IndexPCalculator::ComputeP() { DBG_START_METH("IndexPCalculator::ComputeP", dbg_verbosity); bool retval = true; // 1. check whether all columns needed by data_A() are in map cols_ - we suppose data_A is IndexSchurData const std::vector* p2col_idx = dynamic_cast(GetRawPtr(data_A()))->GetColIndices(); Index col; Number* col_values = NULL; Index curr_dim, curr_schur_row = 0; SmartPtr comp_vec; const Number* comp_values; std::map >::iterator find_it; SmartPtr col_vec = IpData().curr()->MakeNewIteratesVector(); SmartPtr sol_vec = col_vec->MakeNewIteratesVector(); for( std::vector::const_iterator col_it = p2col_idx->begin(); col_it != p2col_idx->end(); ++col_it ) { col = *col_it; find_it = cols_.find(col); if( find_it == cols_.end() ) { // column is in data_A but not in P-matrix ->create data_A()->GetRow(curr_schur_row, *col_vec); retval = Solver()->Solve(sol_vec, ConstPtr(col_vec)); DBG_ASSERT(retval); /* This part is for displaying norm2(I_z*K^(-1)*I_1) */ DBG_PRINT((dbg_verbosity, "\ncurr_schur_row=%" IPOPT_INDEX_FORMAT ", ", curr_schur_row)); DBG_PRINT((dbg_verbosity, "norm2(z)=%23.16e\n", sol_vec->x()->Nrm2())); /* end displaying norm2 */ DBG_ASSERT(col_values == NULL); col_values = new Number[nrows_]; curr_dim = 0; for( Index j = 0; j < sol_vec->NComps(); ++j ) { comp_vec = dynamic_cast(GetRawPtr(sol_vec->GetComp(j))); comp_values = comp_vec->Values(); IpBlasCopy(comp_vec->Dim(), comp_values, 1, col_values + curr_dim, 1); curr_dim += comp_vec->Dim(); } cols_[col] = new PColumn(col_values); col_values = NULL; } curr_schur_row++; } return retval; } bool IndexPCalculator::GetSchurMatrix( const SmartPtr& B, SmartPtr& S ) { DBG_START_METH("IndexPCalculator::GetSchurMatrix", dbg_verbosity); bool retval = true; Number* S_values; if( !IsValid(S) ) { if( B == data_A() ) { SmartPtr S_sym_space = new DenseSymMatrixSpace(B->GetNRowsAdded()); SmartPtr dS = new DenseSymMatrix(GetRawPtr(S_sym_space)); S_values = dS->Values(); S = GetRawPtr(dS); } else { SmartPtr S_sym_space = new DenseGenMatrixSpace(B->GetNRowsAdded(), B->GetNRowsAdded()); SmartPtr dS = new DenseGenMatrix(GetRawPtr(S_sym_space)); S_values = dS->Values(); S = GetRawPtr(dS); } } else { // Try DenseGenMatrix - if NULL, try DenseSymMatrix SmartPtr dS_gen = dynamic_cast(GetRawPtr(S)); if( !IsValid(dS_gen) ) { SmartPtr dS_sym = dynamic_cast(GetRawPtr(S)); S_values = dS_sym->Values(); } else { S_values = dS_gen->Values(); } } /* DenseGenMatrix* dS = static_cast(&S); DBG_ASSERT(dynamic_cast(&S)); */ // Check whether data_A was changed from the outside if( ncols_ != data_A()->GetNRowsAdded() ) { ncols_ = data_A()->GetNRowsAdded(); ComputeP(); } /* DBG_ASSERT(dS->NRows()==dS->NCols()); DBG_ASSERT(dS->NRows()==data_A()->GetNRowsAdded()); */ std::vector indices; std::vector factors; // Compute S = B^T*P from indices, factors and P const std::vector* data_A_idx = dynamic_cast(GetRawPtr(data_A()))->GetColIndices(); const std::vector* data_B_idx = dynamic_cast(GetRawPtr(B))->GetColIndices(); Index col_count = 0; for( std::vector::const_iterator a_it = data_A_idx->begin(); a_it != data_A_idx->end(); ++a_it ) { cols_[*a_it]->GetSchurMatrixRows(data_B_idx, S_values + col_count * ncols_); col_count++; } return retval; } void IndexPCalculator::PrintImpl( const Journalist& jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent, const std::string& prefix ) const { DBG_START_METH("IndexPCalculator::PrintImpl", dbg_verbosity); const Number* col_val; jnlst.PrintfIndented(level, category, indent, "%sIndexPCalculator \"%s\" with %" IPOPT_INDEX_FORMAT " rows and %" IPOPT_INDEX_FORMAT " columns:\n", prefix.c_str(), name.c_str(), nrows_, ncols_); Index col_counter = 0; for( std::map >::const_iterator j = cols_.begin(); j != cols_.end(); ++j ) { col_val = j->second->Values(); for( Index i = 0; i < nrows_; ++i ) { jnlst.PrintfIndented(level, category, indent, "%s%s[%5" IPOPT_INDEX_FORMAT ",%5" IPOPT_INDEX_FORMAT "]=%23.16e\n", prefix.c_str(), name.c_str(), i, col_counter, col_val[i]); } col_counter++; } } PColumn::PColumn( Number* values ) : val_(values) { DBG_START_METH("PColumn::PColumn", dbg_verbosity); } PColumn::~PColumn() { DBG_START_METH("PColumn::~PColumn", dbg_verbosity); delete[] val_; } void PColumn::GetSchurMatrixRows( const std::vector* row_idx_B, Number* S_col ) const { DBG_START_METH("PColumn::GetSchurMatrixRows", dbg_verbosity); for( size_t i = 0; i < row_idx_B->size(); ++i ) { S_col[i] = -val_[(*row_idx_B)[i]]; } } const Number* PColumn::Values() const { DBG_START_METH("PColumn::Values", dbg_verbosity); return val_; } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensIndexPCalculator.hpp000066400000000000000000000034151473776672200244110ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-06 #ifndef __ASINDEXPCALCULATOR_HPP__ #define __ASINDEXPCALCULATOR_HPP__ #include "SensPCalculator.hpp" namespace Ipopt { /* Forward declarations */ class PColumn; class IndexPCalculator: public PCalculator { /** This class is the implementation of the PCalculator that corresponds * to IndexSchurData. It expects to be used with a kind of IndexSchurData. */ public: IndexPCalculator( SmartPtr backsolver, SmartPtr A_data ); virtual ~IndexPCalculator(); /** Overloaded from PCalculator */ virtual bool InitializeImpl( const OptionsList& options, const std::string& prefix ); virtual bool ComputeP(); virtual bool GetSchurMatrix( const SmartPtr& B, SmartPtr& S ); virtual void PrintImpl( const Journalist& jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent, const std::string& prefix ) const; private: /** Rows of P = Rows of KKT */ Index nrows_; /** Cols of P */ Index ncols_; std::map > cols_; }; /** This class provides an easy interface for PCalculators with data where columns are * not necessarily in adjacent parts of memory. */ class PColumn: public ReferencedObject { public: PColumn( Number* values ); virtual ~PColumn(); virtual void GetSchurMatrixRows( const std::vector* row_idx_B, Number* S ) const; virtual const Number* Values() const; private: Number* val_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensIndexSchurData.cpp000066400000000000000000000242231473776672200240510ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-27 #include "SensIndexSchurData.hpp" #include "IpIteratesVector.hpp" #include "IpDenseVector.hpp" #include "IpBlas.hpp" #include "SensUtils.hpp" namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif IndexSchurData::IndexSchurData() { DBG_START_METH("IndexSchurData::IndexSchurData", dbg_verbosity); } IndexSchurData::IndexSchurData( const std::vector idx, const std::vector val ) { DBG_START_METH("IndexSchurData::IndexSchurData(vector,vector)", dbg_verbosity); idx_ = idx; val_ = val; Set_NRows((Index) idx_.size()); Set_Initialized(); } IndexSchurData::~IndexSchurData() { DBG_START_METH("IndexSchurData::~IndexSchurData", dbg_verbosity); } SmartPtr IndexSchurData::MakeNewSchurDataCopy() const { DBG_START_METH("IndexSchurData::MakeNewSchurDataCopy", dbg_verbosity); SmartPtr retval = new IndexSchurData(idx_, val_); return retval; } void IndexSchurData::SetData_Flag( Index dim, const Index* flags, Number v ) { DBG_START_METH("IndexSchurData::SetData_Flag", dbg_verbosity); DBG_ASSERT(idx_.size() == 0); DBG_ASSERT(!Is_Initialized()); DBG_ASSERT(v != 0); Index w; (v > 0) ? w = 1 : w = -1; for( Index i = 0; i < dim; ++i ) { DBG_ASSERT(flags[i] == 1 || flags[i] == 0); DBG_ASSERT(v != 0); if( flags[i] ) { idx_.push_back(i); val_.push_back(w); } } Set_Initialized(); Set_NRows((Index) val_.size()); } void IndexSchurData::SetData_Flag( Index dim, const Index* flags, const Number* values ) { DBG_START_METH("InexSchurData::SetData_Flag", dbg_verbosity); DBG_ASSERT(idx_.size() == 0); DBG_ASSERT(!Is_Initialized()); for( Index i = 0; i < dim; ++i ) { DBG_ASSERT(flags[i] == 1 || flags[i] == 0); DBG_ASSERT(values[i] != 0); if( flags[i] ) { idx_.push_back(i); (values[i] > 0) ? val_.push_back(1) : val_.push_back(-1); } } Set_Initialized(); Set_NRows((Index) val_.size()); } Index IndexSchurData::SetData_Index( Index dim, const Index* index, Number v ) { DBG_START_METH("IndexSchurData::SetData_Index", dbg_verbosity); DBG_ASSERT(idx_.empty()); DBG_ASSERT(!Is_Initialized()); Index w; (v > 0) ? w = 1 : w = -1; DBG_PRINT((dbg_verbosity, "Schurdata::w=%" IPOPT_INDEX_FORMAT "\n", w)); Index n_ind = AsIndexMax(dim, index, 1); std::vector sortvec(n_ind, -1); // fill up sortlist for( Index i = 0; i < dim; ++i ) { if( index[i] > 0 ) { DBG_ASSERT(sortvec[index[i] - 1] == -1); // THIS SHOULD THROW AN EXCEPTION! (OR SWITCH TO FLAG?) if( sortvec[index[i] - 1] != -1 ) { return index[i]; } sortvec[index[i] - 1] = i; } } idx_.resize(n_ind, 0); val_.resize(n_ind, 0); for( Index i = 0; i < n_ind; ++i ) { DBG_ASSERT(sortvec[i] > -1); idx_[i] = sortvec[i]; val_[i] = w; } Set_Initialized(); Set_NRows((Index) val_.size()); return 0; } void IndexSchurData::SetData_List( const std::vector& list, Number v ) { DBG_START_METH("IndexSchurData::SetData_List", dbg_verbosity); DBG_ASSERT(!Is_Initialized()); DBG_ASSERT(idx_.empty()); DBG_ASSERT(v != 0); Index w; (v > 0) ? w = 1 : w = -1; val_.resize(list.size(), w); idx_ = list; Set_Initialized(); } void IndexSchurData::GetRow( Index row, IteratesVector& v ) const { DBG_START_METH("IndexSchurData::GetRow", dbg_verbosity); DBG_ASSERT(Is_Initialized()); DBG_ASSERT(row < GetNRowsAdded()); // retrieve structure of IteratesVector - this should probably be cached or sth. //Index n_comps = v.NComps(); Index* v_lens = GetVectorLengths(v); // set vector v to 0 v.Set(0.0); // find the vector and index in iteratesvector to which idx_[row] corresponds Index col = idx_[row]; Index vec_idx = 0; while( !(col < v_lens[vec_idx]) ) { vec_idx++; } dynamic_cast(GetRawPtr(v.GetCompNonConst(vec_idx)))->Values()[col + v.GetComp(vec_idx)->Dim() - v_lens[vec_idx]] = (Number) val_[row]; delete[] v_lens; } void IndexSchurData::GetMultiplyingVectors( Index row, std::vector& indices, std::vector& factors ) const { DBG_START_METH("IndexSchurData::GetMultiplyingVectors", dbg_verbosity); DBG_ASSERT(indices.size() == 0); DBG_ASSERT(factors.size() == 0); indices.push_back(idx_[row]); factors.push_back(val_[row]); } void IndexSchurData::Multiply( const IteratesVector& v, Vector& u ) const { DBG_START_METH("IndexSchurData::Multiply", dbg_verbosity); // this is awful. DenseVector* du = static_cast(&u); du->Set(0.0); Number* u_val = du->Values(); Index* v_lens = GetVectorLengths(v); Index v_row, vec_idx; for( size_t i = 0; i < idx_.size(); ++i ) { v_row = idx_[i]; // find vector in CompoundVector that corresponds to the given col in matrix/row in v. vec_idx = -1; while( !(v_row < v_lens[++vec_idx]) ) { } SmartPtr d_ptr = dynamic_cast(GetRawPtr(v.GetComp(vec_idx))); if( !d_ptr->IsHomogeneous() ) { u_val[i] += val_[i] * d_ptr->Values()[v_row + v.GetComp(vec_idx)->Dim() - v_lens[vec_idx]]; } else { u_val[i] += val_[i] * d_ptr->Scalar(); } } delete[] v_lens; } void IndexSchurData::TransMultiply( const Vector& u, IteratesVector& v ) const { DBG_START_METH("IndexSchurData::TransMultiply", dbg_verbosity); DBG_ASSERT(u.Dim() == GetNRowsAdded()); const DenseVector* du = static_cast(&u); // Get total number of elements of v Index ncols = 0; for( Index i = 0; i < v.NComps(); ++i ) { ncols += v.GetComp(i)->Dim(); } // Create space in which v_vals will be saved Number* v_vals = new Number[ncols]; const Number* u_vals = du->Values(); // set v to zero for( Index i = 0; i < ncols; ++i ) { v_vals[i] = 0; } // perform v_vals <- A^T*u Index row, col; Number val; for( size_t i = 0; i < idx_.size(); ++i ) { row = i; col = idx_[i]; val = val_[i]; v_vals[col] += val * u_vals[row]; } // save v_vals in v Index v_idx = 0, curr_dim; Number* curr_val; for( Index i = 0; i < v.NComps(); ++i ) { curr_dim = v.GetCompNonConst(i)->Dim(); curr_val = dynamic_cast(GetRawPtr(v.GetCompNonConst(i)))->Values(); IpBlasCopy(curr_dim, v_vals + v_idx, 1, curr_val, 1); v_idx += curr_dim; } delete[] v_vals; } Index* IndexSchurData::GetVectorLengths( const IteratesVector& v ) const { DBG_START_METH("IndexSchurData::GetVectorLengths", dbg_verbosity); // retrieve structure of IteratesVector - this should probably be cached or sth. Index n_comps = v.NComps(); Index* v_lens = new Index[n_comps]; // v_lens[i] holds the maximum number up to which component i belongs in there. v_lens[0] = v.GetComp(0)->Dim(); for( Index i = 1; i < n_comps; ++i ) { v_lens[i] = v_lens[i - 1] + v.GetComp(i)->Dim(); } return v_lens; } void IndexSchurData::PrintImpl( const Journalist& jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent, const std::string& prefix ) const { DBG_START_METH("IndexSchurData::PrintImpl", dbg_verbosity); jnlst.PrintfIndented(level, category, indent, "%sIndexSchurData \"%s\" with %" IPOPT_INDEX_FORMAT " rows:\n", prefix.c_str(), name.c_str(), GetNRowsAdded()); if( Is_Initialized() ) { for( size_t i = 0; i < idx_.size(); i++ ) { jnlst.PrintfIndented(level, category, indent, "%s%s[%5zd,%5" IPOPT_INDEX_FORMAT "]=%" IPOPT_INDEX_FORMAT "\n", prefix.c_str(), name.c_str(), i, idx_[i], val_[i]); } } else { jnlst.PrintfIndented(level, category, indent, "%sUninitialized!\n", prefix.c_str()); } } void IndexSchurData::AddData_Flag( Index dim, Index* flags, std::vector& delta_u_sort, Index v ) { DBG_START_METH("IndexSchurData::AddData_Flag", dbg_verbosity); Index sortcounter = (Index) idx_.size(); bool oldindex; for( Index i = 0; i < dim; ++i ) { if( flags[i] ) { oldindex = false; for( size_t j = 0; j < idx_.size(); ++j ) { if( i == idx_[j] ) { delta_u_sort.push_back(j); val_[j] = v; oldindex = true; break; } } if( !oldindex ) { delta_u_sort.push_back(sortcounter++); idx_.push_back(i); val_.push_back(v); } } } } void IndexSchurData::AddData_List( std::vector cols, std::vector& delta_u_sort, Index& new_du_size, Index v ) { DBG_START_METH("IndexSchurData::AddData_List", dbg_verbosity); new_du_size = (Index) idx_.size(); bool oldindex; for( size_t i = 0; i < cols.size(); ++i ) { oldindex = false; for( size_t j = 0; j < idx_.size(); ++j ) { if( cols[i] == idx_[j] ) { delta_u_sort.push_back(j); val_[j] = v; oldindex = true; break; } } if( !oldindex ) { delta_u_sort.push_back(new_du_size++); idx_.push_back(cols[i]); val_.push_back(v); } } Set_NRows((Index) idx_.size()); if( !Is_Initialized() ) { Set_Initialized(); } } Index IndexSchurData::GetNRowsAdded() const { DBG_START_METH("IndexSchurData::GetNRowsAdded", dbg_verbosity); return (Index) idx_.size(); } const std::vector* IndexSchurData::GetColIndices() const { DBG_START_METH("IndexSchurData::GetColIndices", dbg_verbosity); return &idx_; } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensIndexSchurData.hpp000066400000000000000000000062221473776672200240550ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-08 #ifndef __ASINDEXSCHURDATA_HPP__ #define __ASINDEXSCHURDATA_HPP__ #include "SensSchurData.hpp" namespace Ipopt { class IndexSchurData: public SchurData { /** This class is the implementation aimed at applications where * only SchurData matrices with entries 1 or -1 appear. */ public: IndexSchurData(); IndexSchurData( const std::vector idx, const std::vector val ); virtual ~IndexSchurData(); virtual SmartPtr MakeNewSchurDataCopy() const; virtual Index GetNRowsAdded() const; virtual void SetData_Flag( Index dim, const Index* flags, Number v = 1.0 ); virtual void SetData_Flag( Index dim, const Index* flags, const Number* values ); virtual Index SetData_Index( Index dim, const Index* index, Number v = 1.0 ); virtual void SetData_List( const std::vector& list, Number v = 1.0 ); virtual void GetRow( Index i, IteratesVector& v ) const; virtual void GetMultiplyingVectors( Index i, std::vector& indices, std::vector& factors ) const; virtual void Multiply( const IteratesVector& v, Vector& u ) const; virtual void TransMultiply( const Vector& u, IteratesVector& v ) const; virtual void PrintImpl( const Journalist& jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent, const std::string& prefix ) const; /* Functions specific to IndexSchurData */ /** This function is for adding data to a SchurData object. * * It takes a set of column-indices * a value v and adds indices accordingly. If the column is already set in the data, * it stays at the same place, otherwise the new indices are added at the bottom, * in the order specified by the indices. The vector delta_u_sort returns the actual * sorting so that the user knows how to place the new values inside the elongated * delta_u vector. These places are in C++ index style, so they correspond exactly * to the indices used for the C++-array of the delta_u DenseVector. */ void AddData_Flag( Index dim, Index* flags, std::vector& delta_u_sort, Index v ); void AddData_List( std::vector cols, std::vector& delta_u_sort, Index& new_du_size, Index v ); const std::vector* GetColIndices() const; private: /** returns a vector that holds the accumulated length of each vector component * * v_len[0] = v.GetComp(0)->Dim() * v_len[i] = sum(k=0..i, v.GetComp(k)->Dim()) */ Index* GetVectorLengths( const IteratesVector& v ) const; std::vector idx_; std::vector val_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensMeasurement.hpp000066400000000000000000000026351473776672200235000ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-16 #ifndef __AS_MEASUREMENT_HPP__ #define __AS_MEASUREMENT_HPP__ #include "IpReferenced.hpp" #include "IpDenseVector.hpp" #include "IpIteratesVector.hpp" namespace Ipopt { class SIPOPTLIB_EXPORT Measurement: public ReferencedObject { /** This class provides an abstraction for the measurements of the states coming in * and the solutions of the controller. * * It basically acts as the "plant" of the controller. */ public: Measurement() { } virtual ~Measurement() { } /** This function returns a std::vector holding the indices in IteratesVector of the * equations that are to be "slacked" to free the initial values for sIPOPT. * * This std::vector is used in the construction of the A-SchurData for the Schur Decomposition. */ virtual std::vector GetInitialEqConstraints() = 0; /** This function returns delta_u. * * It should use the values of IpData().trial()->x() */ virtual SmartPtr GetMeasurement( Index measurement_number ) = 0; /** This function does whatever the measurement machine does with the solution of the SensAlgorithm */ virtual void SetSolution( Index measurement_number, SmartPtr sol ) = 0; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensMetadataMeasurement.cpp000066400000000000000000000155441473776672200251370ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-07-10 #include "SensMetadataMeasurement.hpp" #include "SensUtils.hpp" #include namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif MetadataMeasurement::MetadataMeasurement() : n_idx_(0), x_owner_space_(NULL), s_owner_space_(NULL), y_c_owner_space_(NULL), y_d_owner_space_(NULL), z_L_owner_space_(NULL), z_U_owner_space_(NULL) { DBG_START_METH("MetadataMeasurement::MetadataMeasurement", dbg_verbosity); } MetadataMeasurement::~MetadataMeasurement() { DBG_START_METH("MetadataMeasurement::~MetadataMeasurement", dbg_verbosity); } bool MetadataMeasurement::InitializeImpl( const OptionsList& options, const std::string& prefix ) { DBG_START_METH("MetadataMeasurement::InitializeImpl", dbg_verbosity); x_owner_space_ = dynamic_cast(GetRawPtr(IpData().curr()->x()->OwnerSpace())); s_owner_space_ = dynamic_cast(GetRawPtr(IpData().curr()->s()->OwnerSpace())); y_c_owner_space_ = dynamic_cast(GetRawPtr(IpData().curr()->y_c()->OwnerSpace())); y_d_owner_space_ = dynamic_cast(GetRawPtr(IpData().curr()->y_d()->OwnerSpace())); z_L_owner_space_ = dynamic_cast(GetRawPtr(IpData().curr()->z_L()->OwnerSpace())); z_U_owner_space_ = dynamic_cast(GetRawPtr(IpData().curr()->z_U()->OwnerSpace())); DBG_ASSERT(IsValid(x_owner_space_) && IsValid(s_owner_space_) && IsValid(y_c_owner_space_) && IsValid(y_d_owner_space_) && IsValid(z_L_owner_space_) && IsValid(z_U_owner_space_)); bool run_sens; options.GetBoolValue("run_sens", run_sens, prefix); if( run_sens ) { std::string sens_state_0 = "sens_state_1"; // sens_state_0 doesn't exist anymore... std::vector tmp_idx = x_owner_space_->GetIntegerMetaData(sens_state_0); n_idx_ = AsIndexMax((Index) tmp_idx.size(), &tmp_idx[0], 1); } return true; } std::vector MetadataMeasurement::GetInitialEqConstraints() { DBG_START_METH("MetadataMeasurement::GetInitialEqConstraints", dbg_verbosity); SmartPtr it = IpData().curr(); Index n_base = it->x()->Dim() + it->s()->Dim(); const std::vector constr_metadata = y_c_owner_space_->GetIntegerMetaData("sens_init_constr"); std::vector retval; for( size_t i = 0; i < constr_metadata.size(); ++i ) { if( constr_metadata[i] != 0 ) { retval.push_back(n_base + i); } } return retval; } SmartPtr MetadataMeasurement::GetMeasurement( Index measurement_number ) { DBG_START_METH("MetadataMeasurement::GetMeasurement", dbg_verbosity); DBG_ASSERT(measurement_number > 0 && measurement_number < 7); std::string state; std::string statevalue; state = "sens_state_"; statevalue = "sens_state_value_"; append_Index(state, measurement_number); append_Index(statevalue, measurement_number); const std::vector idx_ipopt = x_owner_space_->GetIntegerMetaData(state.c_str()); const std::vector val_ipopt = x_owner_space_->GetNumericMetaData(statevalue.c_str()); SmartPtr delta_u_space; delta_u_space = new DenseVectorSpace(n_idx_); SmartPtr delta_u = new DenseVector(GetRawPtr(ConstPtr(delta_u_space))); Number* du_val = delta_u->Values(); const Number* u_0_val = dynamic_cast(GetRawPtr(IpData().trial()->x()))->Values(); // Fill up values of delta_u vector for( size_t i = 0; i < val_ipopt.size(); ++i ) { if( idx_ipopt[i] > 0 ) { du_val[idx_ipopt[i] - 1] = val_ipopt[i] - u_0_val[i]; //initial_val[idx_ipopt[i]-1]; //du_val[idx_ipopt[i]-1] = val_ipopt[i]; } } delta_u->SetValues(du_val); return delta_u; } void MetadataMeasurement::SetSolution( Index measurement_number, SmartPtr sol ) { DBG_START_METH("MetadataMeasurement::SetSolution", dbg_verbosity); std::string sens_sol = "sens_sol_state_"; append_Index(sens_sol, measurement_number); const Number* sol_x_val = dynamic_cast(GetRawPtr(sol->x()))->Values(); std::vector x_sol = std::vector(sol_x_val, sol_x_val + sol->x()->Dim()); SmartPtr x_owner_space_nonconst = const_cast(GetRawPtr(x_owner_space_)); x_owner_space_nonconst->SetNumericMetaData(sens_sol, x_sol); SmartPtr s_dv = dynamic_cast(GetRawPtr(sol->s())); if( IsValid(s_dv) ) { const Number* sol_s_val = s_dv->Values(); std::vector s_sol = std::vector(sol_s_val, sol_s_val + sol->s()->Dim()); SmartPtr s_owner_space_nonconst = const_cast(GetRawPtr(s_owner_space_)); s_owner_space_nonconst->SetNumericMetaData(sens_sol, s_sol); } const Number* sol_y_c_val = dynamic_cast(GetRawPtr(sol->y_c()))->Values(); std::vector y_c_sol = std::vector(sol_y_c_val, sol_y_c_val + sol->y_c()->Dim()); SmartPtr y_c_owner_space_nonconst = const_cast(GetRawPtr(y_c_owner_space_)); y_c_owner_space_nonconst->SetNumericMetaData(sens_sol, y_c_sol); const Number* sol_y_d_val = dynamic_cast(GetRawPtr(sol->y_d()))->Values(); std::vector y_d_sol = std::vector(sol_y_d_val, sol_y_d_val + sol->y_d()->Dim()); SmartPtr y_d_owner_space_nonconst = const_cast(GetRawPtr(y_d_owner_space_)); y_d_owner_space_nonconst->SetNumericMetaData(sens_sol, y_d_sol); const Number* sol_z_L_val = dynamic_cast(GetRawPtr(sol->z_L()))->Values(); std::vector z_L_sol = std::vector(sol_z_L_val, sol_z_L_val + sol->z_L()->Dim()); SmartPtr z_L_owner_space_nonconst = const_cast(GetRawPtr(z_L_owner_space_)); z_L_owner_space_nonconst->SetNumericMetaData(sens_sol, z_L_sol); const Number* sol_z_U_val = dynamic_cast(GetRawPtr(sol->z_U()))->Values(); std::vector z_U_sol = std::vector(sol_z_U_val, sol_z_U_val + sol->z_U()->Dim()); SmartPtr z_U_owner_space_nonconst = const_cast(GetRawPtr(z_U_owner_space_)); z_U_owner_space_nonconst->SetNumericMetaData(sens_sol, z_U_sol); } std::vector MetadataMeasurement::GetIntegerSuffix( std::string suffix_string ) { DBG_START_METH("MetadataMeasurement::GetIntegerSuffix", dbg_verbosity); const std::vector idx_ipopt = x_owner_space_->GetIntegerMetaData(suffix_string.c_str()); std::vector retval = idx_ipopt; return retval; } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensMetadataMeasurement.hpp000066400000000000000000000031401473776672200251310ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-07-10 #ifndef __AS_METADATAMEASUREMENT_HPP__ #define __AS_METADATAMEASUREMENT_HPP__ #include "SensMeasurement.hpp" #include "SensSuffixHandler.hpp" #include "IpAlgStrategy.hpp" namespace Ipopt { class MetadataMeasurement: public Measurement, public SuffixHandler, public AlgorithmStrategyObject { public: MetadataMeasurement(); virtual ~MetadataMeasurement(); /* AlgorithmStrategyObject */ virtual bool InitializeImpl( const OptionsList& options, const std::string& prefix ); /* measurement methods */ virtual std::vector GetInitialEqConstraints(); virtual SmartPtr GetMeasurement( Index measurement_number ); virtual void SetSolution( Index measurement_number, SmartPtr sol ); /* suffix handler methods */ virtual std::vector GetIntegerSuffix( std::string suffix_string ); private: /** Number of sens_indices */ Index n_idx_; /** owner space of x */ SmartPtr x_owner_space_; /** owner space of s */ SmartPtr s_owner_space_; /** owner space of y_c */ SmartPtr y_c_owner_space_; /** owner space of y_d */ SmartPtr y_d_owner_space_; /** owner space of z_L */ SmartPtr z_L_owner_space_; /** owner space of z_U */ SmartPtr z_U_owner_space_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensPCalculator.hpp000066400000000000000000000061651473776672200234260ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-06 #ifndef __ASPCALCULATOR_HPP__ #define __ASPCALCULATOR_HPP__ #include "IpAlgStrategy.hpp" #include "SensSimpleBacksolver.hpp" #include "SensSchurData.hpp" namespace Ipopt { /** This class is the interface for implementations of any class that calculates the matrix \f$P =K^{-1}A\f$ * of the following matrix: * \f[ * \left(\begin{array}{cc} * K & A\\ * B & 0 * \end{array}\right) * \f] */ class SIPOPTLIB_EXPORT PCalculator: public AlgorithmStrategyObject { public: PCalculator( SmartPtr backsolver, SmartPtr A_data ) : backsolver_(backsolver), data_A_init(ConstPtr(A_data->MakeNewSchurDataCopy())), data_A_(A_data) { } virtual ~PCalculator() { } /* Overloaded from AlgorithmStrategyObject */ virtual bool InitializeImpl( const OptionsList& /*options*/, const std::string& /*prefix*/ ) { return true; } /** Function to start the computation of P from E_0 and KKT*/ virtual bool ComputeP() = 0; /** Function to extract a SchurMatrix corresponding to $B K^{-1} A$. * * If B==NULL, use A=B. */ virtual bool GetSchurMatrix( const SmartPtr& B, SmartPtr& S ) = 0; virtual void PrintImpl( const Journalist& jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent, const std::string& prefix ) const = 0; void Print( const Journalist& jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent = 0, const std::string& prefix = "" ) const { if( jnlst.ProduceOutput(level, category) ) { PrintImpl(jnlst, level, category, name, indent, prefix); } } void Print( SmartPtr jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent, const std::string& prefix ) const { if( IsValid(jnlst) && jnlst->ProduceOutput(level, category) ) { PrintImpl(*jnlst, level, category, name, indent, prefix); } } /** Accessor methods for data and backsolver. * * This unconstness seems * kind of dangerous but I don't think there is a way around it. Anyway, * there is no difference between this and the IpData() method of AlgStrategy. */ SmartPtr Solver() const { return backsolver_; } SmartPtr data_A() const { return ConstPtr(data_A_); } SmartPtr data_A_nonconst() const { return data_A_; } void reset_data_A() { data_A_ = data_A_init->MakeNewSchurDataCopy(); } private: SmartPtr backsolver_; SmartPtr data_A_init; SmartPtr data_A_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensReducedHessianCalculator.cpp000066400000000000000000000076461473776672200261150ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-08-01 #include "SensReducedHessianCalculator.hpp" #include "IpDenseGenMatrix.hpp" namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif ReducedHessianCalculator::ReducedHessianCalculator( SmartPtr hess_data, SmartPtr pcalc ) : hess_data_(hess_data), pcalc_(pcalc) { DBG_START_METH("ReducedHessianCalculator::ReducedHessianCalculator", dbg_verbosity); } ReducedHessianCalculator::~ReducedHessianCalculator() { DBG_START_METH("ReducedHessianCalculator::~ReducedHessianCalculator", dbg_verbosity); } bool ReducedHessianCalculator::InitializeImpl( const OptionsList& options, const std::string& prefix ) { DBG_START_METH("ReducedHessianCalculator::InitializeImpl", dbg_verbosity); options.GetBoolValue("rh_eigendecomp", compute_eigenvalues_, prefix); return true; } bool ReducedHessianCalculator::ComputeReducedHessian() { DBG_START_METH("ReducedHessianCalculator::ComputeReducedHessian", dbg_verbosity); Index dim_S = hess_data_->GetNRowsAdded(); //SmartPtr S_space = new DenseGenMatrixSpace(dim_S, dim_S); //SmartPtr S = new DenseGenMatrix(GetRawPtr(S_space)); SmartPtr S; bool retval = pcalc_->GetSchurMatrix(GetRawPtr(hess_data_), S); SmartPtr S_sym = dynamic_cast(GetRawPtr(S)); if( !IsValid(S_sym) ) { std::exception exc; throw(exc); } bool have_x_scaling, have_c_scaling, have_d_scaling; have_x_scaling = IpNLP().NLP_scaling()->have_x_scaling(); have_c_scaling = IpNLP().NLP_scaling()->have_c_scaling(); have_d_scaling = IpNLP().NLP_scaling()->have_d_scaling(); if( have_x_scaling || have_c_scaling || have_d_scaling ) { Jnlst().Printf(J_WARNING, J_MAIN, "\n" "-------------------------------------------------------------------------------\n" " *** WARNING ***\n" "-------------------------------------------------------------------------------\n" "You are using the reduced hessian feature with scaling of\n"); if( have_x_scaling ) { Jnlst().Printf(J_WARNING, J_MAIN, "*** variables\n"); } if( have_c_scaling ) { Jnlst().Printf(J_WARNING, J_MAIN, "*** equality constraints\n"); } if( have_d_scaling ) { Jnlst().Printf(J_WARNING, J_MAIN, "*** inequality constraints\n"); } Jnlst().Printf(J_WARNING, J_MAIN, "enabled.\n" "A correct unscaled solution of the reduced hessian cannot be guaranteed in this\n" "case. Please consider rerunning with scaling turned off.\n" "-------------------------------------------------------------------------------\n\n"); } // Unscale by objective factor and multiply by (-1) Number obj_scal = IpNLP().NLP_scaling()->apply_obj_scaling(1.0); DBG_PRINT((dbg_verbosity, "Objective scaling = %f\n", obj_scal)); Number* s_val = S_sym->Values(); for( Index k = 0; k < (S->NRows()) * (S->NCols()); ++k ) { s_val[k] *= -obj_scal; } S->Print(Jnlst(), J_INSUPPRESSIBLE, J_USER1, "RedHessian unscaled"); if( compute_eigenvalues_ ) { SmartPtr eigenvectorspace = new DenseGenMatrixSpace(dim_S, dim_S); SmartPtr eigenvectors = new DenseGenMatrix(GetRawPtr(eigenvectorspace)); SmartPtr eigenvaluesspace = new DenseVectorSpace(dim_S); SmartPtr eigenvalues = new DenseVector(GetRawPtr(eigenvaluesspace)); eigenvectors->ComputeEigenVectors(*S_sym, *eigenvalues); eigenvalues->Print(Jnlst(), J_INSUPPRESSIBLE, J_USER1, "Eigenvalues of reduced hessian matrix"); } return retval; } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensReducedHessianCalculator.hpp000066400000000000000000000023761473776672200261150ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-08-01 #ifndef __ASREDUCEDHESSIANCALCULATOR_HPP__ #define __ASREDUCEDHESSIANCALCULATOR_HPP__ #include "IpAlgStrategy.hpp" #include "SensSchurData.hpp" #include "SensPCalculator.hpp" namespace Ipopt { /** This is the interface for the actual controller. * * It handles Data input to the controller (measurement) and returns controls. */ class ReducedHessianCalculator: public AlgorithmStrategyObject { public: ReducedHessianCalculator( SmartPtr hess_data, SmartPtr pcalc ); virtual ~ReducedHessianCalculator(); virtual bool InitializeImpl( const OptionsList& options, const std::string& prefix ); /** This function computes the unscaled reduced hessian matrix */ virtual bool ComputeReducedHessian(); private: /** Pointer to Schurdata object holding the indices for selecting the free variables */ SmartPtr hess_data_; /** Pointer to the P Calculator object that returns the reduced hessian matrix */ SmartPtr pcalc_; /** True, if option rh_eigendecomp was set to yes */ bool compute_eigenvalues_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensRegOp.cpp000066400000000000000000000011071473776672200222130ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2005-08-16 // modified for sIPOPT by Hans Pirnay, 2009-07-22 #include "IpRegOptions.hpp" #include "SensApplication.hpp" #include "SensRegOp.hpp" namespace Ipopt { void RegisterOptions_sIPOPT( const SmartPtr& roptions ) { roptions->SetRegisteringCategory("Uncategorized"); SensApplication::RegisterOptions(roptions); } } // namespace Ipopt coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensRegOp.hpp000066400000000000000000000005641473776672200222260ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. #ifndef __SENSREGOP_HPP__ #define __SENSREGOP_HPP__ #include "IpSmartPtr.hpp" namespace Ipopt { class RegisteredOptions; SIPOPTLIB_EXPORT void RegisterOptions_sIPOPT( const SmartPtr& roptions ); } // namespace Ipopt #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensSchurData.hpp000066400000000000000000000104261473776672200230660ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-06 #ifndef __ASSCHURDATA_HPP__ #define __ASSCHURDATA_HPP__ #include "IpVector.hpp" #include "IpIteratesVector.hpp" #include namespace Ipopt { /** This interface serves as a reference point for multiple classes * that need to use SchurData (PCalculator, SchurDriver). * * It declares as little as possible, so that SchurData implementations * can be very special and fast. * * I have not decided yet if there are certain ways I want to impose * that SchurData can be set. I will figure this out as soon as I * write the upstream classes that need to do that * * Nomenclature in this program is based on Victor Zavalas thesis. */ class SIPOPTLIB_EXPORT SchurData: public ReferencedObject { public: SchurData() : initialized_(false), nrows_(0) { } virtual ~SchurData() { } virtual SmartPtr MakeNewSchurDataCopy() const = 0; /* Functions to set the Schurdata. At least one must be overloaded */ /** Set Data to one for given indices. Size of vector is ipopt_x_& list, Number v = 1.0 ) = 0; virtual void AddData_List( std::vector cols, std::vector& delta_u_sort, Index& new_du_size, Index v ) = 0; /** Returns number of rows/columns in schur matrix */ virtual Index GetNRowsAdded() const { return nrows_; } virtual bool Is_Initialized() const { return initialized_; } /** Returns the i-th column vector of the matrix */ virtual void GetRow( Index i, IteratesVector& v ) const = 0; /** Returns two vectors that are needed for matrix-vector * multiplication of B and P. * * The index is the row, the first vector are the indices * of non-zero components, in this row of B, * the second vector gives the numbers in B(row,indices)/ */ virtual void GetMultiplyingVectors( Index row, std::vector& indices, std::vector& factors ) const = 0; /** Computes B*v with B in R(mxn) */ virtual void Multiply( const IteratesVector& v, Vector& u ) const = 0; /** Computes A*u with A in R(nxm), KKT in R(n,n) */ virtual void TransMultiply( const Vector& u, IteratesVector& v ) const = 0; virtual void PrintImpl( const Journalist& jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent, const std::string& prefix ) const = 0; void Print( const Journalist& jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent = 0, const std::string& prefix = "" ) const { if( jnlst.ProduceOutput(level, category) ) { PrintImpl(jnlst, level, category, name, indent, prefix); } } void Print( SmartPtr jnlst, EJournalLevel level, EJournalCategory category, const std::string& name, Index indent, const std::string& prefix ) const { if( IsValid(jnlst) && jnlst->ProduceOutput(level, category) ) { PrintImpl(*jnlst, level, category, name, indent, prefix); } } protected: virtual void Set_Initialized() { initialized_ = true; } virtual void Set_NRows( Index nrows ) { nrows_ = nrows; } private: /** Makes sure that data is not set twice accidentially */ bool initialized_; /** Number of columns/rows of corresponding Schur Matrix*/ Index nrows_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensSchurDriver.hpp000066400000000000000000000052541473776672200234530ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-06 #ifndef __ASSCHURDRIVER_HPP__ #define __ASSCHURDRIVER_HPP__ #include "SensSchurData.hpp" #include "SensPCalculator.hpp" #include "IpVector.hpp" #include "IpIteratesVector.hpp" namespace Ipopt { /** This class is the interface for any class that deals with the Schur matrix * from the point when it is constructed by the PCalculator to the solution * against one vector. * * Specific implementations may also incorporate the * treatment of adding rows/cols (like QPSchur). * * The computations done by this class are * 1. Solve \f$S \Delta\nu = r_s\f$ * 2. Solve \f$K\Delta s = ... - \Delta nu\f$ (really?) */ class SIPOPTLIB_EXPORT SchurDriver: public AlgorithmStrategyObject { public: SchurDriver( SmartPtr pcalc, SmartPtr data_B ) : pcalc_(pcalc), data_B_(data_B) { } virtual ~SchurDriver() { } virtual bool InitializeImpl( const OptionsList& /*options*/, const std::string& /*prefix*/ ) { return true; } /** Const accessor methods to the SchurData for for the derived classes */ virtual SmartPtr data_A() const { return pcalc_->data_A(); } virtual SmartPtr data_B() const { return ConstPtr(data_B_); } virtual SmartPtr data_A_nonconst() { return pcalc_->data_A_nonconst(); } virtual SmartPtr data_B_nonconst() { return data_B_; } virtual SmartPtr pcalc() const { return ConstPtr(pcalc_); } virtual SmartPtr pcalc_nonconst() { return pcalc_; } /* Sets the Data for which this SchurMatrix will be built. */ /** Creates the SchurMatrix from B and P */ virtual bool SchurBuild() = 0; /** Calls the factorization routine for the SchurMatrix */ virtual bool SchurFactorize() = 0; /** Performs a backsolve on S and K * * sol is the vector K^(-1)*r_s which usually should have been computed before */ virtual bool SchurSolve( SmartPtr lhs, SmartPtr rhs, SmartPtr delta_u, SmartPtr sol = NULL ) = 0; /* Performs a backsolve on S and K; calls the latter with sol=K^(-1)*r_s=0 virtual bool SchurSolve(SmartPtr lhs, SmartPtr rhs, SmartPtr delta_u) =0; */ private: SchurDriver() { } SmartPtr pcalc_; SmartPtr data_B_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensSimpleBacksolver.cpp000066400000000000000000000023111473776672200244420ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-04-06 // // Purpose : This is the same as IpSensitivityCalculator.hpp #include "SensSimpleBacksolver.hpp" namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif SimpleBacksolver::SimpleBacksolver( SmartPtr pd_solver ) : pd_solver_(pd_solver), allow_inexact_(true) { DBG_START_METH("SimpleBacksolver::SimpleBacksolver", dbg_verbosity); } bool SimpleBacksolver::InitializeImpl( const OptionsList& options, const std::string& prefix ) { DBG_START_METH("SimpleBackSolver::InitializeImpl", dbg_verbosity); options.GetBoolValue("sens_allow_inexact_backsolve", allow_inexact_, prefix); return true; } bool SimpleBacksolver::Solve( SmartPtr delta_lhs, SmartPtr delta_rhs ) { DBG_START_METH("SimpleBacksolver::Solve(IteratesVector,IteratesVector)", dbg_verbosity); bool retval; bool improve_solution = false; retval = pd_solver_->Solve(1.0, 0.0, *delta_rhs, *delta_lhs, allow_inexact_, improve_solution); return retval; } } // end namespace coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensSimpleBacksolver.hpp000066400000000000000000000016311473776672200244530ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-04-06 // // Purpose : This is the same as IpSensitivityCalculator.hpp // It implements the SensBacksolver Interface. #ifndef __ASSIMPLEBACKSOLVER_HPP__ #define __ASSIMPLEBACKSOLVER_HPP__ #include "IpPDSystemSolver.hpp" #include "SensBacksolver.hpp" namespace Ipopt { class SIPOPTLIB_EXPORT SimpleBacksolver: public SensBacksolver { public: SimpleBacksolver( SmartPtr pd_solver ); ~SimpleBacksolver() { } bool InitializeImpl( const OptionsList& options, const std::string& prefix ); bool Solve( SmartPtr delta_lhs, SmartPtr delta_rhs ); private: SimpleBacksolver(); SmartPtr pd_solver_; bool allow_inexact_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensStdStepCalc.cpp000066400000000000000000000247121473776672200233570ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-16 #include "SensStdStepCalc.hpp" #include "IpDenseVector.hpp" #include "IpIteratesVector.hpp" #include "IpBlas.hpp" #include "SensIndexSchurData.hpp" namespace Ipopt { #if IPOPT_VERBOSITY > 0 static const Index dbg_verbosity = 1; #endif StdStepCalculator::StdStepCalculator( SmartPtr ift_data, SmartPtr backsolver ) : ift_data_(ift_data), backsolver_(backsolver), bound_eps_(1e-3), kkt_residuals_(true), SensitivityVector(NULL) { DBG_START_METH("StdStepCalculator::StdStepCalculator", dbg_verbosity); } StdStepCalculator::~StdStepCalculator() { DBG_START_METH("StdStepCalculator::~StdStepCalculator", dbg_verbosity); } bool StdStepCalculator::InitializeImpl( const OptionsList& options, const std::string& prefix ) { options.GetNumericValue("sens_bound_eps", bound_eps_, prefix); options.GetBoolValue("sens_kkt_residuals", kkt_residuals_, prefix); SensitivityStepCalculator::InitializeImpl(options, prefix); return true; } bool StdStepCalculator::Step( DenseVector& delta_u, IteratesVector& sol ) { DBG_START_METH("StdStepCalculator::Step", dbg_verbosity); bool retval; retval = true; /* FIXME added to have retval initialized, but does it make sense??? */ SmartPtr delta_u_long = IpData().trial()->MakeNewIteratesVector(); ift_data_->TransMultiply(delta_u, *delta_u_long); SmartPtr r_s = IpData().trial()->MakeNewIteratesVector(); if( kkt_residuals_ ) { /* This should be almost zero... */ r_s->Set_x_NonConst(*IpCq().curr_grad_lag_x()->MakeNewCopy()); r_s->Set_s_NonConst(*IpCq().curr_grad_lag_s()->MakeNewCopy()); r_s->Set_y_c_NonConst(*IpCq().curr_c()->MakeNewCopy()); r_s->Set_y_d_NonConst(*IpCq().curr_d_minus_s()->MakeNewCopy()); r_s->Set_z_L_NonConst(*IpCq().curr_compl_x_L()->MakeNewCopy()); r_s->Set_z_U_NonConst(*IpCq().curr_compl_x_U()->MakeNewCopy()); r_s->Set_v_L_NonConst(*IpCq().curr_compl_s_L()->MakeNewCopy()); r_s->Set_v_U_NonConst(*IpCq().curr_compl_s_U()->MakeNewCopy()); r_s->Print(Jnlst(), J_VECTOR, J_USER1, "r_s init"); delta_u.Print(Jnlst(), J_VECTOR, J_USER1, "delta_u init"); DBG_PRINT((dbg_verbosity, "r_s init Nrm2=%23.16e\n", r_s->Asum())); delta_u_long->Print(Jnlst(), J_VECTOR, J_USER1, "delta_u_long before"); delta_u_long->Axpy(-1.0, *r_s); } delta_u_long->Print(Jnlst(), J_VECTOR, J_USER1, "delta_u_long"); backsolver_->Solve(&sol, ConstPtr(delta_u_long)); // make a copy of the sensitivites SensitivityVector = (&sol)->MakeNewIteratesVectorCopy(); // print it out SensitivityVector->Print(Jnlst(), J_VECTOR, J_USER1, "SensitivityVector stdcalc"); SmartPtr Kr_s; if( Do_Boundcheck() ) { Kr_s = sol.MakeNewIteratesVectorCopy(); } sol.Axpy(1.0, *IpData().trial()); if( Do_Boundcheck() ) { DBG_PRINT((dbg_verbosity, "Entering boundcheck")); // initialize Index new_du_size = 0; Number* new_du_values; std::vector x_bound_violations_idx; std::vector x_bound_violations_du; std::vector delta_u_sort; bool bounds_violated; SmartPtr delta_u_space = new DenseVectorSpace(0); SmartPtr old_delta_u = new DenseVector(GetRawPtr(delta_u_space)); SmartPtr new_delta_u; bounds_violated = BoundCheck(sol, x_bound_violations_idx, x_bound_violations_du); while( bounds_violated ) { Driver()->data_A()->Print(Jnlst(), J_VECTOR, J_USER1, "data_A_init"); Driver()->data_B()->Print(Jnlst(), J_VECTOR, J_USER1, "data_B_init"); // write new schurdata A dynamic_cast(GetRawPtr(Driver()->data_A_nonconst()))->AddData_List(x_bound_violations_idx, delta_u_sort, new_du_size, 1); // write new schurdata B dynamic_cast(GetRawPtr(Driver()->data_B_nonconst()))->AddData_List(x_bound_violations_idx, delta_u_sort, new_du_size, 1); Driver()->data_A()->Print(Jnlst(), J_VECTOR, J_USER1, "data_A"); Driver()->data_B()->Print(Jnlst(), J_VECTOR, J_USER1, "data_B"); Driver()->SchurBuild(); Driver()->SchurFactorize(); old_delta_u->Print(Jnlst(), J_VECTOR, J_USER1, "old_delta_u"); delta_u_space = NULL; // delete old delta_u space delta_u_space = new DenseVectorSpace(new_du_size); // create new delta_u space new_delta_u = new DenseVector(GetRawPtr(ConstPtr(delta_u_space))); new_du_values = new_delta_u->Values(); IpBlasCopy(old_delta_u->Dim(), old_delta_u->Values(), 1, new_du_values, 1); for( size_t i = 0; i < x_bound_violations_idx.size(); ++i ) { // printf("i=%" IPOPT_INDEX_FORMAT ", delta_u_sort[i]=%" IPOPT_INDEX_FORMAT ", x_bound_viol_du[i]=%f\n", i, delta_u_sort[i], x_bound_violations_du[i]); new_du_values[delta_u_sort[i]] = x_bound_violations_du[i]; } SmartPtr new_sol = sol.MakeNewIteratesVector(); new_delta_u->Print(Jnlst(), J_VECTOR, J_USER1, "new_delta_u"); // solve with new data_B and delta_u retval = Driver()->SchurSolve(&sol, ConstPtr(delta_u_long), dynamic_cast(GetRawPtr(new_delta_u)), Kr_s); // make a copy of the sensitivites with bound checks SensitivityVector = (&sol)->MakeNewIteratesVectorCopy(); sol.Axpy(1.0, *IpData().trial()); x_bound_violations_idx.clear(); x_bound_violations_du.clear(); delta_u_sort.clear(); bounds_violated = BoundCheck(sol, x_bound_violations_idx, x_bound_violations_du); // copy new vector in old vector ->has to be done becpause otherwise only pointers will be copied and then it makes no sense old_delta_u = new_delta_u->MakeNewDenseVector(); old_delta_u->Copy(*new_delta_u); } } return retval; } bool StdStepCalculator::BoundCheck( IteratesVector& sol, std::vector& x_bound_violations_idx, std::vector& x_bound_violations_du ) { DBG_START_METH("StdStepCalculator::BoundCheck", dbg_verbosity); DBG_ASSERT(x_bound_violations_idx.empty()); DBG_ASSERT(x_bound_violations_du.empty()); // find bound violations in x vector const Number* x_val = dynamic_cast(GetRawPtr(IpData().curr()->x()))->Values(); const Number* sol_val = dynamic_cast(GetRawPtr(sol.x()))->Values(); SmartPtr x_L_exp = IpData().curr()->x()->MakeNew(); SmartPtr x_U_exp = IpData().curr()->x()->MakeNew(); SmartPtr x_L_comp = IpNLP().x_L()->MakeNew(); SmartPtr x_U_comp = IpNLP().x_U()->MakeNew(); IpNLP().Px_L()->TransMultVector(1.0, *sol.x(), 0.0, *x_L_comp); IpNLP().Px_U()->TransMultVector(1.0, *sol.x(), 0.0, *x_U_comp); x_L_comp->Print(Jnlst(), J_VECTOR, J_USER1, "x_L_comp"); x_U_comp->Print(Jnlst(), J_VECTOR, J_USER1, "x_U_comp"); // return false; Number* x_L_val = dynamic_cast(GetRawPtr(x_L_comp))->Values(); Number* x_U_val = dynamic_cast(GetRawPtr(x_U_comp))->Values(); const Number* x_L_bound = dynamic_cast(GetRawPtr(IpNLP().x_L()))->Values(); const Number* x_U_bound = dynamic_cast(GetRawPtr(IpNLP().x_U()))->Values(); for( Index i = 0; i < x_L_comp->Dim(); ++i ) { x_L_val[i] -= x_L_bound[i]; } for( Index i = 0; i < x_U_comp->Dim(); ++i ) { x_U_val[i] -= x_U_bound[i]; } // project back IpNLP().Px_L()->MultVector(1.0, *x_L_comp, 0.0, *x_L_exp); IpNLP().Px_U()->MultVector(1.0, *x_U_comp, 0.0, *x_U_exp); const Number* x_L_exp_val = dynamic_cast(GetRawPtr(x_L_exp))->Values(); const Number* x_U_exp_val = dynamic_cast(GetRawPtr(x_U_exp))->Values(); for( Index i = 0; i < x_L_exp->Dim(); ++i ) { if( x_L_exp_val[i] < -bound_eps_ ) { x_bound_violations_idx.push_back(i); x_bound_violations_du.push_back(-x_L_exp_val[i] + sol_val[i] - x_val[i]); // this is just an awkward way to compute x_bound[i] - x_curr_val[i]. } else if( -x_U_exp_val[i] < -bound_eps_ ) { x_bound_violations_idx.push_back(i); x_bound_violations_du.push_back(-x_U_exp_val[i] + sol_val[i] - x_val[i]); } } // z_L and z_U bound violations -> These are much easier since there is no projecting back and forth SmartPtr z_L = dynamic_cast(GetRawPtr(sol.z_L())); SmartPtr z_U = dynamic_cast(GetRawPtr(sol.z_U())); z_L->Print(Jnlst(), J_VECTOR, J_USER1, "z_L_boundcheck"); z_U->Print(Jnlst(), J_VECTOR, J_USER1, "z_U_boundcheck"); const Number* z_L_val = z_L->Values(); const Number* z_U_val = z_U->Values(); SmartPtr z_L_trial = dynamic_cast(GetRawPtr(IpData().trial()->z_L())); SmartPtr z_U_trial = dynamic_cast(GetRawPtr(IpData().trial()->z_U())); const Number* z_L_trial_val = z_L_trial->Values(); const Number* z_U_trial_val = z_U_trial->Values(); // find absolute index of z_L and z_U in IteratesVector Index z_L_ItVec_idx = 0; for( Index i = 0; i < 4; ++i ) { z_L_ItVec_idx += (sol.GetComp(i))->Dim(); } Index z_U_ItVec_idx = z_L_ItVec_idx + sol.z_L()->Dim(); for( Index i = 0; i < z_L->Dim(); ++i ) { if( z_L_val[i] < -bound_eps_ ) { x_bound_violations_idx.push_back(i + z_L_ItVec_idx); x_bound_violations_du.push_back(-z_L_trial_val[i]); //printf("Lower Bound Mult. no. i=%" IPOPT_INDEX_FORMAT " invalid: delta_u=%f\n", i+z_L_ItVec_idx, z_L_val[i]); } } for( Index i = 0; i < z_U->Dim(); ++i ) { if( z_U_val[i] < -bound_eps_ ) { x_bound_violations_idx.push_back(i + z_U_ItVec_idx); x_bound_violations_du.push_back(-z_U_trial_val[i]); //printf("Upper Bound Mult. no. i=%" IPOPT_INDEX_FORMAT " invalid: delta_u=%f\n", i+z_U_ItVec_idx, z_U_val[i]); } } // if (x_bound_violations_idx.empty() || z_L_bound_violations_idx.empty() || z_U_bound_violations_idx.empty()) { if( x_bound_violations_idx.empty() ) { return false; } else { return true; } } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensStdStepCalc.hpp000066400000000000000000000026151473776672200233620ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-16 #ifndef __ASSTDSTEPCALC_HPP__ #define __ASSTDSTEPCALC_HPP__ #include "SensBacksolver.hpp" #include "SensStepCalc.hpp" #include "IpDenseVector.hpp" #include "IpIteratesVector.hpp" #include namespace Ipopt { class StdStepCalculator: public SensitivityStepCalculator { public: StdStepCalculator( SmartPtr ift_data, SmartPtr backsolver ); virtual ~StdStepCalculator(); virtual bool InitializeImpl( const OptionsList& options, const std::string& prefix ); /** This is the main algorithmic function of this class. * * It calculates a step using its SchurDriver, checks bounds, and returns it */ virtual bool Step( DenseVector& delta_u, IteratesVector& sol ); bool BoundCheck( IteratesVector& sol, std::vector& x_bound_violations_idx, std::vector& x_bound_violations_du ); /** return the sensitivity vector */ virtual SmartPtr GetSensitivityVector(void) { return SensitivityVector; } private: SmartPtr ift_data_; SmartPtr backsolver_; Number bound_eps_; bool kkt_residuals_; SmartPtr SensitivityVector; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensStepCalc.hpp000066400000000000000000000035001473776672200227010ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-14 #ifndef __ASSENSSTEPCALC_HPP__ #define __ASSENSSTEPCALC_HPP__ #include "IpAlgStrategy.hpp" #include "SensSchurDriver.hpp" namespace Ipopt { /* Forward declarations */ class DenseVector; class IteratesVector; /** This is the interface for the classes that perform the actual step. */ class SIPOPTLIB_EXPORT SensitivityStepCalculator: public AlgorithmStrategyObject { public: SensitivityStepCalculator() : driver_(NULL), do_boundcheck_(false) { } virtual ~SensitivityStepCalculator() { } virtual bool InitializeImpl( const OptionsList& options, const std::string& prefix ) { options.GetBoolValue("sens_boundcheck", do_boundcheck_, prefix); return true; } bool Do_Boundcheck() const { return do_boundcheck_; } void SetSchurDriver( SmartPtr driver ) { DBG_ASSERT(IsValid(driver)); driver_ = driver; if( IsValid(driver_->pcalc_nonconst()) ) { driver_->pcalc_nonconst()->reset_data_A(); // when the schurdriver is set, the data in the pcalculator has to be reset to its data? } } SmartPtr Driver() // this should be const or protected { DBG_ASSERT(IsValid(driver_)); return driver_; } /** This is the main algorithmic function of this class. * * It calculates a step using its SchurDriver, checks bounds, and returns it */ virtual bool Step( DenseVector& delta_u, IteratesVector& sol ) = 0; /** return the sensitivity vector */ virtual SmartPtr GetSensitivityVector() = 0; private: SmartPtr driver_; bool do_boundcheck_; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensSuffixHandler.hpp000066400000000000000000000012521473776672200237470ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-08-01 #ifndef __SENS_ASSUFFIXHANDLER_HPP__ #define __SENS_ASSUFFIXHANDLER_HPP__ #include "IpReferenced.hpp" #include #include namespace Ipopt { /** This class is the interface for all classes that can return indices. * * The implementation for Ampl is done in the MetadataMeasurement class. */ class SuffixHandler: public ReferencedObject { public: SuffixHandler() { } virtual ~SuffixHandler() { } virtual std::vector GetIntegerSuffix( std::string suffix_string ) = 0; }; } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensUtils.cpp000066400000000000000000000055071473776672200223070ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-19 #include "SensUtils.hpp" #include namespace Ipopt { Index AsIndexMax( Index length, const Index* x, Index Incr ) { if( length == 0 ) { return 0; } Index maxval = x[0]; for( Index i = 1; i < length; i += Incr ) { if( x[i] > maxval ) { maxval = x[i]; } } return maxval; } Index AsIndexSum( Index length, const Index* x, Index Incr ) { Index retval = 0; for( Index i = 0; i < length; i += Incr ) { retval += x[i]; } return retval; } void append_Index( std::string& str, Index idx ) { std::stringstream idx_stream; idx_stream << idx; std::string idx_string = idx_stream.str(); str.append(idx_string); } SolverReturn AppReturn2SolverReturn( ApplicationReturnStatus ipopt_retval ) { SolverReturn retval; switch( ipopt_retval ) { case Solve_Succeeded: retval = SUCCESS; break; case Solved_To_Acceptable_Level: retval = STOP_AT_ACCEPTABLE_POINT; break; case Infeasible_Problem_Detected: retval = LOCAL_INFEASIBILITY; break; case Search_Direction_Becomes_Too_Small: retval = STOP_AT_TINY_STEP; break; case Diverging_Iterates: retval = DIVERGING_ITERATES; break; case User_Requested_Stop: retval = USER_REQUESTED_STOP; break; case Feasible_Point_Found: retval = FEASIBLE_POINT_FOUND; break; case Maximum_Iterations_Exceeded: retval = MAXITER_EXCEEDED; break; case Restoration_Failed: retval = RESTORATION_FAILURE; break; case Error_In_Step_Computation: retval = ERROR_IN_STEP_COMPUTATION; break; case Maximum_CpuTime_Exceeded: retval = CPUTIME_EXCEEDED; break; case Maximum_WallTime_Exceeded: retval = WALLTIME_EXCEEDED; break; case Not_Enough_Degrees_Of_Freedom: retval = TOO_FEW_DEGREES_OF_FREEDOM; break; case Invalid_Problem_Definition: retval = UNASSIGNED; break; case Invalid_Option: retval = INVALID_OPTION; break; case Invalid_Number_Detected: retval = INVALID_NUMBER_DETECTED; break; case Unrecoverable_Exception: retval = UNASSIGNED; break; case NonIpopt_Exception_Thrown: retval = UNASSIGNED; break; case Insufficient_Memory: retval = OUT_OF_MEMORY; break; case Internal_Error: retval = INTERNAL_ERROR; break; default: retval = UNASSIGNED; } return retval; } } coinor-ipopt-3.14.17/contrib/sIPOPT/src/SensUtils.hpp000066400000000000000000000026421473776672200223110ustar00rootroot00000000000000// Copyright 2009, 2011 Hans Pirnay // All Rights Reserved. // This code is published under the Eclipse Public License. // // Date : 2009-05-14 #ifndef __SENSCUTILS_HPP__ #define __SENSCUTILS_HPP__ #include "IpUtils.hpp" #include "IpAlgTypes.hpp" #include "IpReturnCodes.hpp" #include namespace Ipopt { /* This header file provides some definitions used throughout the program. */ enum SensAlgorithmExitStatus { SOLVE_SUCCESS, FATAL_ERROR }; SIPOPTLIB_EXPORT Index AsIndexMax( Index length, const Index* x, Index Incr ); SIPOPTLIB_EXPORT Index AsIndexSum( Index length, const Index* x, Index Incr ); SIPOPTLIB_EXPORT void append_Index( std::string& str, Index idx ); SIPOPTLIB_EXPORT SolverReturn AppReturn2SolverReturn( ApplicationReturnStatus ipopt_retval ); } // same as DECLARE_STD_EXCEPTION, but using SIPOPTLIB_EXPORT instead of IPOPTLIB_EXPORT #define DECLARE_STD_SIPOPT_EXCEPTION(__except_type) \ class SIPOPTLIB_EXPORT __except_type : public Ipopt::IpoptException \ { \ public: \ __except_type(const std::string& msg, const std::string& fname, Ipopt::Index line) \ : Ipopt::IpoptException(msg,fname,line, #__except_type) {} \ __except_type(const __except_type& copy) \ : Ipopt::IpoptException(copy) {} \ private: \ __except_type(); \ void operator=(const __except_type&); \ } #endif coinor-ipopt-3.14.17/contrib/sIPOPT/toDo.txt000066400000000000000000000050201473776672200205170ustar00rootroot00000000000000AmplTNLP - rewrite get_suffixhandler as const SensAmplTNLP - errorcheck in get_number_suffix for NULL suffix - remove get_bounds_info ? AmplMeasurement + replace string operations by append_Index function SchurData + try easy implementations for Multiply/Transmultiply in SchurData (see e.g. TransMultiply) + write functions that set the schurdata from z.b. arrays + write MakeNewCopy() functions for all implementations + write new constructor to make this easier - Remove StdSchurData? - exchange GetMultiplyingVectors by a transmultiply implementation that accepts pointers. (see StdPCalculator for the only use of this function) AsSensStepCalc + move InitializeImpl to the implementation! - change boundchecking: instead of bound_check yes/no have option bound_check active_set/step_until_bound/none which will then call the appropriate module. Make sure that active_set is only used in conjunction with the Schur algorithms AsIndexPCalculator + use std::map instead of std::vector for PColumn list so it is easier to sort/find them SchurDriver + write InitializeImpl SensController + write InitializeImpl SensApplication - in function SetIpoptAlgorithmObjects: rewrite checking of consistency of inputs SensTNLPAdapter + write inverse of ResortX in TNLPAdapter MakeFile + Remove AsSenscSetup if decided so General + include print functions for all major classes. Allows deep testing + include #ifndefs in all new header files + make sure debug mode is switched on in every cpp file - think about using the same ownerspace for all u-vectors - makes use of meta-data possible + decide on AsSenscSetup (decision made: get rid of it) + Add options to decide which Pcalc to use + Add options to decide which SchurData to use (this is in a lot of places...) - Add options to decide which SchurDriver to use + All classes that have at least one virtual function should have virtual destructors - Add assignment operator and copy constructor to all classes - All these warnings with vector.size() comparisons? - test with valgrind - where does the function go that resets the SchurData?? - measure time for each action - decent output at beginning and end + is SensAmplTNLP necessary to be given to SensApplication?? - the measurement class should go outside the library so everyone can/must write their own measurement class Milestones + wrote method to deal with scaling that resembles IpOrigIpopt:finalize_solution + write a makefile.am and get it to compile as an add-on to ipopt with the new nlp structure. + write print functions and test schur calculation coinor-ipopt-3.14.17/depcomp000077500000000000000000000562171473776672200157260ustar00rootroot00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2024-06-19.01; # UTC # Copyright (C) 1999-2024 Free Software Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try '$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by 'PROGRAMS ARGS'. object Object file output by 'PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputting dependencies. libtool Whether libtool is used (yes/no). Report bugs to . GNU Automake home page: . General help using GNU software: . EOF exit $? ;; -v | --v*) echo "depcomp (GNU Automake) $scriptversion" exit $? ;; esac # Get the directory component of the given path, and save it in the # global variables '$dir'. Note that this directory component will # be either empty or ending with a '/' character. This is deliberate. set_dir_from () { case $1 in */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; *) dir=;; esac } # Get the suffix-stripped basename of the given path, and save it the # global variable '$base'. set_base_from () { base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` } # If no dependency file was actually created by the compiler invocation, # we still have to create a dummy depfile, to avoid errors with the # Makefile "include basename.Plo" scheme. make_dummy_depfile () { echo "#dummy" > "$depfile" } # Factor out some common post-processing of the generated depfile. # Requires the auxiliary global variable '$tmpdepfile' to be set. aix_post_process_depfile () { # If the compiler actually managed to produce a dependency file, # post-process it. if test -f "$tmpdepfile"; then # Each line is of the form 'foo.o: dependency.h'. # Do two passes, one to just change these to # $object: dependency.h # and one to simply output # dependency.h: # which is needed to avoid the deleted-header problem. { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" } > "$depfile" rm -f "$tmpdepfile" else make_dummy_depfile fi } # A tabulation character. tab=' ' # A newline character. nl=' ' # Character ranges might be problematic outside the C locale. # These definitions help. upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ lower=abcdefghijklmnopqrstuvwxyz alpha=${upper}${lower} if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Avoid interference from the environment. gccflag= dashmflag= # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi cygpath_u="cygpath -u -f -" if test "$depmode" = msvcmsys; then # This is just like msvisualcpp but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvisualcpp fi if test "$depmode" = msvc7msys; then # This is just like msvc7 but w/o cygpath translation. # Just convert the backslash-escaped backslashes to single forward # slashes to satisfy depend.m4 cygpath_u='sed s,\\\\,/,g' depmode=msvc7 fi if test "$depmode" = xlc; then # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. gccflag=-qmakedep=gcc,-MF depmode=gcc fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## Note that this doesn't just cater to obsolete pre-3.x GCC compilers. ## but also to in-use compilers like IBM xlc/xlC and the HP C compiler. ## (see the conditional assignment to $gccflag above). ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). Also, it might not be ## supported by the other compilers which use the 'gcc' depmode. ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The second -e expression handles DOS-style file names with drive # letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the "deleted header file" problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. ## Some versions of gcc put a space before the ':'. On the theory ## that the space means something, we add a space to the output as ## well. hp depmode also adds that space, but also prefixes the VPATH ## to the object. Take care to not repeat it in the output. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like '#:fec' to the end of the # dependency line. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ | tr "$nl" ' ' >> "$depfile" echo >> "$depfile" # The second pass generates a dummy entry for each header file. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" ;; xlc) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts '$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done aix_post_process_depfile ;; tcc) # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 # FIXME: That version still under development at the moment of writing. # Make that this statement remains true also for stable, released # versions. # It will wrap lines (doesn't matter whether long or short) with a # trailing '\', as in: # # foo.o : \ # foo.c \ # foo.h \ # # It will put a trailing '\' even on the last line, and will use leading # spaces rather than leading tabs (at least since its commit 0394caf7 # "Emit spaces for -MD"). "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. # We have to change lines of the first kind to '$object: \'. sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" # And for each line of the second kind, we have to emit a 'dep.h:' # dummy dependency, to avoid the deleted-header problem. sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" rm -f "$tmpdepfile" ;; ## The order of this option in the case statement is important, since the ## shell code in configure will try each of these formats in the order ## listed in this file. A plain '-MD' option would be understood by many ## compilers, so we must ensure this comes after the gcc and icc options. pgcc) # Portland's C compiler understands '-MD'. # Will always output deps to 'file.d' where file is the root name of the # source file under compilation, even if file resides in a subdirectory. # The object file name does not affect the name of the '.d' file. # pgcc 10.2 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using '\' : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... set_dir_from "$object" # Use the source, not the object, to determine the base name, since # that's sadly what pgcc will do too. set_base_from "$source" tmpdepfile=$base.d # For projects that build the same source file twice into different object # files, the pgcc approach of using the *source* file root name can cause # problems in parallel builds. Use a locking strategy to avoid stomping on # the same $tmpdepfile. lockdir=$base.d-lock trap " echo '$0: caught signal, cleaning up...' >&2 rmdir '$lockdir' exit 1 " 1 2 13 15 numtries=100 i=$numtries while test $i -gt 0; do # mkdir is a portable test-and-set. if mkdir "$lockdir" 2>/dev/null; then # This process acquired the lock. "$@" -MD stat=$? # Release the lock. rmdir "$lockdir" break else # If the lock is being held by a different process, wait # until the winning process is done or we timeout. while test -d "$lockdir" && test $i -gt 0; do sleep 1 i=`expr $i - 1` done fi i=`expr $i - 1` done trap - 1 2 13 15 if test $i -le 0; then echo "$0: failed to acquire lock after $numtries attempts" >&2 echo "$0: check lockdir '$lockdir'" >&2 exit 1 fi if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" # Add 'dependent.h:' lines. sed -ne '2,${ s/^ *// s/ \\*$// s/$/:/ p }' "$tmpdepfile" >> "$depfile" else make_dummy_depfile fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in 'foo.d' instead, so we check for that too. # Subdirectories are respected. set_dir_from "$object" set_base_from "$object" if test "$libtool" = yes; then # Libtool generates 2 separate objects for the 2 libraries. These # two compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir$base.o.d # libtool 1.5 tmpdepfile2=$dir.libs/$base.o.d # Likewise. tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d "$@" -MD fi stat=$? if test $stat -ne 0; then rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done # Same post-processing that is required for AIX mode. aix_post_process_depfile ;; msvc7) if test "$libtool" = yes; then showIncludes=-Wc,-showIncludes else showIncludes=-showIncludes fi "$@" $showIncludes > "$tmpdepfile" stat=$? grep -v '^Note: including file: ' "$tmpdepfile" if test $stat -ne 0; then rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" # The first sed program below extracts the file names and escapes # backslashes for cygpath. The second sed program outputs the file # name when reading, but also accumulates all include files in the # hold buffer in order to output them again at the end. This only # works with sed implementations that can handle large buffers. sed < "$tmpdepfile" -n ' /^Note: including file: *\(.*\)/ { s//\1/ s/\\/\\\\/g p }' | $cygpath_u | sort -u | sed -n ' s/ /\\ /g s/\(.*\)/'"$tab"'\1 \\/p s/.\(.*\) \\/\1:/ H $ { s/.*/'"$tab"'/ G p }' >> "$depfile" echo >> "$depfile" # make sure the fragment doesn't end with a backslash rm -f "$tmpdepfile" ;; msvc7msys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for ':' # in the target name. This is to cope with DOS-style filenames: # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. "$@" $dashmflag | sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this sed invocation # correctly. Breaking it into two sed invocations is a workaround. tr ' ' "$nl" < "$tmpdepfile" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # X makedepend shift cleared=no eat=no for arg do case $cleared in no) set ""; shift cleared=yes ;; esac if test $eat = yes; then eat=no continue fi case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -arch) eat=yes ;; -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix=`echo "$object" | sed 's/^.*\././'` touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" # makedepend may prepend the VPATH from the source file name to the object. # No need to regex-escape $object, excess matching of '.' is harmless. sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process the last invocation # correctly. Breaking it into two sed invocations is a workaround. sed '1,2d' "$tmpdepfile" \ | tr ' ' "$nl" \ | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi # Remove '-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E \ | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test "X$1" != 'X--mode=compile'; do shift done shift fi IFS=" " for arg do case "$arg" in -o) shift ;; $object) shift ;; "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E 2>/dev/null | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" echo "$tab" >> "$depfile" sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; msvcmsys) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: coinor-ipopt-3.14.17/doc/000077500000000000000000000000001473776672200151035ustar00rootroot00000000000000coinor-ipopt-3.14.17/doc/Doxyfile.in000066400000000000000000003662611473776672200172340ustar00rootroot00000000000000# Doxyfile 1.9.8 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. # # All text after a double hash (##) is considered a comment and is placed in # front of the TAG it is preceding. # # All text after a single hash (#) is considered a comment and will be ignored. # The format is: # TAG = value [value, ...] # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). # # Note: # # Use doxygen to compare the used configuration file with the template # configuration file: # doxygen -x [configFile] # Use doxygen to compare the used configuration file with the template # configuration file without replacing the environment variables or CMake type # replacement variables: # doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- # This tag specifies the encoding used for all characters in the configuration # file that follow. The default is UTF-8 which is also the encoding used for all # text before the first occurrence of this tag. Doxygen uses libiconv (or the # iconv built into libc) for the transcoding. See # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. DOXYFILE_ENCODING = UTF-8 # The PROJECT_NAME tag is a single word (or a sequence of words surrounded by # double-quotes, unless you are using Doxywizard) that should identify the # project for which the documentation is generated. This name is used in the # title of most generated pages and in a few other places. # The default value is: My Project. PROJECT_NAME = @PACKAGE_NAME@ # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version # control system is used. PROJECT_NUMBER = @PACKAGE_VERSION@ # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is # entered, it will be relative to the location where doxygen was started. If # left blank the current directory will be used. OUTPUT_DIRECTORY = # If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 # sub-directories (in 2 levels) under the output directory of each output format # and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes # performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to # control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO # Controls the number of sub-directories that will be created when # CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every # level increment doubles the number of directories, resulting in 4096 # directories at level 8 which is the default and also the maximum value. The # sub-directories are organized in 2 levels, the first level always has a fixed # number of 16 directories. # Minimum value: 0, maximum value: 8, default value: 8. # This tag requires that the tag CREATE_SUBDIRS is set to YES. CREATE_SUBDIRS_LEVEL = 8 # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode # U+3044. # The default value is: NO. ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. # Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, # Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English # (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, # Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with # English messages), Korean, Korean-en (Korean with English messages), Latvian, # Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, # Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, # Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English # If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member # descriptions after the members that are listed in the file and class # documentation (similar to Javadoc). Set to NO to disable this. # The default value is: YES. BRIEF_MEMBER_DESC = YES # If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief # description of a member or function before the detailed description # # Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the # brief descriptions will be completely suppressed. # The default value is: YES. REPEAT_BRIEF = YES # This tag implements a quasi-intelligent brief description abbreviator that is # used to form the text in various listings. Each string in this list, if found # as the leading text of the brief description, will be stripped from the text # and the result, after processing the whole list, is used as the annotated # text. Otherwise, the brief description is used as-is. If left blank, the # following values are used ($name is automatically replaced with the name of # the entity):The $name class, The $name widget, The $name file, is, provides, # specifies, contains, represents, a, an and the. ABBREVIATE_BRIEF = # If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then # doxygen will generate a detailed section even if there is only a brief # description. # The default value is: NO. ALWAYS_DETAILED_SEC = NO # If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all # inherited members of a class in the documentation of that class as if those # members were ordinary class members. Constructors, destructors and assignment # operators of the base classes will not be shown. # The default value is: NO. INLINE_INHERITED_MEMB = NO # If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path # before files name in the file list and in the header files. If set to NO the # shortest path that makes the file name unique will be used # The default value is: YES. FULL_PATH_NAMES = YES # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # Stripping is only done if one of the specified strings matches the left-hand # part of the path. The tag can be used to show relative paths in the file list. # If left blank the directory from which doxygen is run is used as the path to # strip. # # Note that you can specify absolute paths here, but also relative paths, which # will be relative from the directory where doxygen is started. # This tag requires that the tag FULL_PATH_NAMES is set to YES. STRIP_FROM_PATH = "@abs_top_srcdir@" # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the # path mentioned in the documentation of a class, which tells the reader which # header file to include in order to use a class. If left blank only the name of # the header file containing the class definition is used. Otherwise one should # specify the list of include paths that are normally passed to the compiler # using the -I flag. STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't # support long names like on DOS, Mac, or CD-ROM. # The default value is: NO. SHORT_NAMES = NO # If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the # first line (until the first dot) of a Javadoc-style comment as the brief # description. If set to NO, the Javadoc-style will behave just like regular Qt- # style comments (thus requiring an explicit @brief command for a brief # description.) # The default value is: NO. JAVADOC_AUTOBRIEF = YES # If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line # such as # /*************** # as being the beginning of a Javadoc-style comment "banner". If set to NO, the # Javadoc-style will behave just like regular comments and it will not be # interpreted by doxygen. # The default value is: NO. JAVADOC_BANNER = NO # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus # requiring an explicit \brief command for a brief description.) # The default value is: NO. QT_AUTOBRIEF = YES # The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a # multi-line C++ special comment block (i.e. a block of //! or /// comments) as # a brief description. This used to be the default behavior. The new default is # to treat a multi-line C++ comment block as a detailed description. Set this # tag to YES if you prefer the old behavior instead. # # Note that setting this tag to YES also means that rational rose comments are # not recognized any more. # The default value is: NO. MULTILINE_CPP_IS_BRIEF = NO # By default Python docstrings are displayed as preformatted text and doxygen's # special commands cannot be used. By setting PYTHON_DOCSTRING to NO the # doxygen's special commands can be used and the contents of the docstring # documentation blocks is shown as doxygen documentation. # The default value is: YES. PYTHON_DOCSTRING = YES # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. INHERIT_DOCS = YES # If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new # page for each member. If set to NO, the documentation of a member will be part # of the file/class/namespace that contains it. # The default value is: NO. SEPARATE_MEMBER_PAGES = NO # The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen # uses this value to replace tabs by spaces in code fragments. # Minimum value: 1, maximum value: 16, default value: 4. TAB_SIZE = 3 # This tag can be used to specify a number of aliases that act as commands in # the documentation. An alias has the form: # name=value # For example adding # "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading # "Side Effects:". Note that you cannot put \n's in the value part of an alias # to insert newlines (in the resulting output). You can put ^^ in the value part # of an alias to insert a newline as if a physical newline was in the original # file. When you need a literal { or } or , in the value part of an alias you # have to escape them by means of a backslash (\), this can lead to conflicts # with the commands \{ and \} for these it is advised to use the version @{ and # @} or use a double escape (\\{ and \\}) ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For # instance, some of the names that are used will be different. The list of all # members will be omitted, etc. # The default value is: NO. OPTIMIZE_OUTPUT_FOR_C = NO # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or # Python sources only. Doxygen will then generate output that is more tailored # for that language. For instance, namespaces will be presented as packages, # qualified scopes will look different, etc. # The default value is: NO. OPTIMIZE_OUTPUT_JAVA = NO # Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran # sources. Doxygen will then generate output that is tailored for Fortran. # The default value is: NO. OPTIMIZE_FOR_FORTRAN = NO # Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL # sources. Doxygen will then generate output that is tailored for VHDL. # The default value is: NO. OPTIMIZE_OUTPUT_VHDL = NO # Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice # sources only. Doxygen will then generate output that is more tailored for that # language. For instance, namespaces will be presented as modules, types will be # separated into more groups, etc. # The default value is: NO. OPTIMIZE_OUTPUT_SLICE = NO # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and # language is one of the parsers supported by doxygen: IDL, Java, JavaScript, # Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, # VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # tries to guess whether the code is fixed or free formatted code, this is the # default for Fortran type files). For instance to make doxygen treat .inc files # as Fortran files (default is PHP), and .f files as C (default is Fortran), # use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise # the files are not read by doxygen. When specifying no_extension you should add # * to the FILE_PATTERNS. # # Note see also the list of default file extension mappings. EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable # documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. # The default value is: YES. MARKDOWN_SUPPORT = YES # When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. # Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 3 # The MARKDOWN_ID_STYLE tag can be used to specify the algorithm used to # generate identifiers for the Markdown headings. Note: Every identifier is # unique. # Possible values are: DOXYGEN use a fixed 'autotoc_md' string followed by a # sequence number starting at 0 and GITHUB use the lower case version of title # with any whitespace replaced by '-' and punctuation characters removed. # The default value is: DOXYGEN. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. MARKDOWN_ID_STYLE = DOXYGEN # When enabled doxygen tries to link words that correspond to documented # classes, or namespaces to their corresponding documentation. Such a link can # be prevented in individual cases by putting a % sign in front of the word or # globally by setting AUTOLINK_SUPPORT to NO. # The default value is: YES. AUTOLINK_SUPPORT = YES # If you use STL classes (i.e. std::string, std::vector, etc.) but do not want # to include (a tag file for) the STL sources as input, then you should set this # tag to YES in order to let doxygen match functions declarations and # definitions whose arguments contain STL classes (e.g. func(std::string); # versus func(std::string) {}). This also make the inheritance and collaboration # diagrams that involve STL classes more complete and accurate. # The default value is: NO. BUILTIN_STL_SUPPORT = NO # If you use Microsoft's C++/CLI language, you should set this option to YES to # enable parsing support. # The default value is: NO. CPP_CLI_SUPPORT = NO # Set the SIP_SUPPORT tag to YES if your project consists of sip (see: # https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen # will parse them like normal C++ but will assume all classes use public instead # of private inheritance when no explicit protection keyword is present. # The default value is: NO. SIP_SUPPORT = NO # For Microsoft's IDL there are propget and propput attributes to indicate # getter and setter methods for a property. Setting this option to YES will make # doxygen to replace the get and set methods by a property in the documentation. # This will only work if the methods are indeed getting or setting a simple # type. If this is not the case, or you want to show the methods anyway, you # should set this option to NO. # The default value is: YES. IDL_PROPERTY_SUPPORT = YES # If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC # tag is set to YES then doxygen will reuse the documentation of the first # member in the group (if any) for the other members of the group. By default # all members of a group must be documented explicitly. # The default value is: NO. DISTRIBUTE_GROUP_DOC = NO # If one adds a struct or class to a group and this option is enabled, then also # any nested class or struct is added to the same group. By default this option # is disabled and one has to add nested compounds explicitly via \ingroup. # The default value is: NO. GROUP_NESTED_COMPOUNDS = NO # Set the SUBGROUPING tag to YES to allow class member groups of the same type # (for instance a group of public functions) to be put as a subgroup of that # type (e.g. under the Public Functions section). Set it to NO to prevent # subgrouping. Alternatively, this can be done per class using the # \nosubgrouping command. # The default value is: YES. SUBGROUPING = YES # When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions # are shown inside the group in which they are included (e.g. using \ingroup) # instead of on a separate page (for HTML and Man pages) or section (for LaTeX # and RTF). # # Note that this feature does not work in combination with # SEPARATE_MEMBER_PAGES. # The default value is: NO. INLINE_GROUPED_CLASSES = NO # When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions # with only public data fields or simple typedef fields will be shown inline in # the documentation of the scope in which they are defined (i.e. file, # namespace, or group documentation), provided this scope is documented. If set # to NO, structs, classes, and unions are shown on a separate page (for HTML and # Man pages) or section (for LaTeX and RTF). # The default value is: NO. INLINE_SIMPLE_STRUCTS = NO # When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or # enum is documented as struct, union, or enum with the name of the typedef. So # typedef struct TypeS {} TypeT, will appear in the documentation as a struct # with name TypeT. When disabled the typedef will appear as a member of a file, # namespace, or class. And the struct will be named TypeS. This can typically be # useful for C code in case the coding convention dictates that all compound # types are typedef'ed and only the typedef is referenced, never the tag name. # The default value is: NO. TYPEDEF_HIDES_STRUCT = NO # The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This # cache is used to resolve symbols given their name and scope. Since this can be # an expensive process and often the same symbol appears multiple times in the # code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small # doxygen will become slower. If the cache is too large, memory is wasted. The # cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range # is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 # symbols. At the end of a run doxygen will report the cache usage and suggest # the optimal cache size from a speed point of view. # Minimum value: 0, maximum value: 9, default value: 0. LOOKUP_CACHE_SIZE = 0 # The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing # speed. At this moment only the input processing can be done using multiple # threads. Since this is still an experimental feature the default is set to 1, # which effectively disables parallel processing. Please report any issues you # encounter. Generating dot graphs in parallel is controlled by the # DOT_NUM_THREADS setting. # Minimum value: 0, maximum value: 32, default value: 1. NUM_PROC_THREADS = 1 # If the TIMESTAMP tag is set different from NO then each generated page will # contain the date or date and time when the page was generated. Setting this to # NO can help when comparing the output of multiple runs. # Possible values are: YES, NO, DATETIME and DATE. # The default value is: NO. TIMESTAMP = NO #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- # If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in # documentation are documented, even if no documentation was available. Private # class members and static file members will be hidden unless the # EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. # Note: This will also disable the warnings about undocumented members that are # normally produced when WARNINGS is set to YES. # The default value is: NO. EXTRACT_ALL = YES # If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will # be included in the documentation. # The default value is: NO. EXTRACT_PRIVATE = YES # If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual # methods of a class will be included in the documentation. # The default value is: NO. EXTRACT_PRIV_VIRTUAL = NO # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. EXTRACT_PACKAGE = NO # If the EXTRACT_STATIC tag is set to YES, all static members of a file will be # included in the documentation. # The default value is: NO. EXTRACT_STATIC = YES # If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined # locally in source files will be included in the documentation. If set to NO, # only classes defined in header files are included. Does not have any effect # for Java sources. # The default value is: YES. EXTRACT_LOCAL_CLASSES = NO # This flag is only useful for Objective-C code. If set to YES, local methods, # which are defined in the implementation section but not in the interface are # included in the documentation. If set to NO, only methods in the interface are # included. # The default value is: NO. EXTRACT_LOCAL_METHODS = NO # If this flag is set to YES, the members of anonymous namespaces will be # extracted and appear in the documentation as a namespace called # 'anonymous_namespace{file}', where file will be replaced with the base name of # the file that contains the anonymous namespace. By default anonymous namespace # are hidden. # The default value is: NO. EXTRACT_ANON_NSPACES = YES # If this flag is set to YES, the name of an unnamed parameter in a declaration # will be determined by the corresponding definition. By default unnamed # parameters remain unnamed in the output. # The default value is: YES. RESOLVE_UNNAMED_PARAMS = YES # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation # section is generated. This option has no effect if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option # will also hide undocumented C++ concepts if enabled. This option has no effect # if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # declarations. If set to NO, these declarations will be included in the # documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO # If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any # documentation blocks found inside the body of a function. If set to NO, these # blocks will be appended to the function's detailed documentation block. # The default value is: NO. HIDE_IN_BODY_DOCS = NO # The INTERNAL_DOCS tag determines if documentation that is typed after a # \internal command is included. If the tag is set to NO then the documentation # will be excluded. Set it to YES to include the internal documentation. # The default value is: NO. INTERNAL_DOCS = NO # With the correct setting of option CASE_SENSE_NAMES doxygen will better be # able to match the capabilities of the underlying filesystem. In case the # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that # are not case sensitive the option should be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On # Windows (including Cygwin) and MacOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. # Possible values are: SYSTEM, NO and YES. # The default value is: SYSTEM. CASE_SENSE_NAMES = SYSTEM # If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with # their full class and namespace scopes in the documentation. If set to YES, the # scope will be hidden. # The default value is: NO. HIDE_SCOPE_NAMES = NO # If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will # append additional text to a page's title, such as Class Reference. If set to # YES the compound reference will be hidden. # The default value is: NO. HIDE_COMPOUND_REFERENCE= NO # If the SHOW_HEADERFILE tag is set to YES then the documentation for a class # will show which file needs to be included to use the class. # The default value is: YES. SHOW_HEADERFILE = YES # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. SHOW_INCLUDE_FILES = YES # If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each # grouped member an include statement to the documentation, telling the reader # which file to include in order to use the member. # The default value is: NO. SHOW_GROUPED_MEMB_INC = NO # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # files with double quotes in the documentation rather than with sharp brackets. # The default value is: NO. FORCE_LOCAL_INCLUDES = NO # If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the # documentation for inline members. # The default value is: YES. INLINE_INFO = YES # If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the # (detailed) documentation of file and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. # The default value is: YES. SORT_MEMBER_DOCS = NO # If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief # descriptions of file, namespace and class members alphabetically by member # name. If set to NO, the members will appear in declaration order. Note that # this will also influence the order of the classes in the class list. # The default value is: NO. SORT_BRIEF_DOCS = NO # If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the # (brief and detailed) documentation of class members so that constructors and # destructors are listed first. If set to NO the constructors will appear in the # respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. # Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief # member documentation. # Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting # detailed member documentation. # The default value is: NO. SORT_MEMBERS_CTORS_1ST = NO # If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy # of group names into alphabetical order. If set to NO the group names will # appear in their defined order. # The default value is: NO. SORT_GROUP_NAMES = NO # If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by # fully-qualified names, including namespaces. If set to NO, the class list will # be sorted only by class name, not including the namespace part. # Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. # Note: This option applies only to the class list, not to the alphabetical # list. # The default value is: NO. SORT_BY_SCOPE_NAME = NO # If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper # type resolution of all parameters of a function it will reject a match between # the prototype and the implementation of a member function even if there is # only one candidate or it is obvious which candidate to choose by doing a # simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still # accept a match between prototype and implementation in such cases. # The default value is: NO. STRICT_PROTO_MATCHING = NO # The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo # list. This list is created by putting \todo commands in the documentation. # The default value is: YES. GENERATE_TODOLIST = NO # The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test # list. This list is created by putting \test commands in the documentation. # The default value is: YES. GENERATE_TESTLIST = NO # The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug # list. This list is created by putting \bug commands in the documentation. # The default value is: YES. GENERATE_BUGLIST = YES # The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) # the deprecated list. This list is created by putting \deprecated commands in # the documentation. # The default value is: YES. GENERATE_DEPRECATEDLIST= YES # The ENABLED_SECTIONS tag can be used to enable conditional documentation # sections, marked by \if ... \endif and \cond # ... \endcond blocks. ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the # documentation. If the initializer consists of more lines than specified here # it will be hidden. Use a value of 0 to hide initializers completely. The # appearance of the value of individual variables and macros / defines can be # controlled using \showinitializer or \hideinitializer command in the # documentation regardless of this setting. # Minimum value: 0, maximum value: 10000, default value: 30. MAX_INITIALIZER_LINES = 30 # Set the SHOW_USED_FILES tag to NO to disable the list of files generated at # the bottom of the documentation of classes and structs. If set to YES, the # list will mention the files that were used to generate the documentation. # The default value is: YES. SHOW_USED_FILES = YES # Set the SHOW_FILES tag to NO to disable the generation of the Files page. This # will remove the Files entry from the Quick Index and from the Folder Tree View # (if specified). # The default value is: YES. SHOW_FILES = YES # Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces # page. This will remove the Namespaces entry from the Quick Index and from the # Folder Tree View (if specified). # The default value is: YES. SHOW_NAMESPACES = NO # The FILE_VERSION_FILTER tag can be used to specify a program or script that # doxygen should invoke to get the current version for each file (typically from # the version control system). Doxygen will invoke the program by executing (via # popen()) the command command input-file, where command is the value of the # FILE_VERSION_FILTER tag, and input-file is the name of an input file provided # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml # will be used as the name of the layout file. See also section "Changing the # layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. LAYOUT_FILE = @abs_top_srcdir@/doc/layout.xml # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib # extension is automatically appended if omitted. This requires the bibtex tool # to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info. # For LaTeX the style of the bibliography can be controlled using # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. CITE_BIB_FILES = @abs_top_srcdir@/doc/ipopt.bib #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages #--------------------------------------------------------------------------- # The QUIET tag can be used to turn on/off the messages that are generated to # standard output by doxygen. If QUIET is set to YES this implies that the # messages are off. # The default value is: NO. QUIET = YES # The WARNINGS tag can be used to turn on/off the warning messages that are # generated to standard error (stderr) by doxygen. If WARNINGS is set to YES # this implies that the warnings are on. # # Tip: Turn warnings on while writing the documentation. # The default value is: YES. WARNINGS = YES # If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate # warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: YES. WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for # potential errors in the documentation, such as documenting some parameters in # a documented function twice, or documenting parameters that don't exist or # using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES # If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete # function parameter documentation. If set to NO, doxygen will accept that some # parameters have no documentation without warning. # The default value is: YES. WARN_IF_INCOMPLETE_DOC = YES # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return # value. If set to NO, doxygen will only warn about wrong parameter # documentation, but not about the absence of documentation. If EXTRACT_ALL is # set to YES then this flag will automatically be disabled. See also # WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = NO # If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about # undocumented enumeration values. If set to NO, doxygen will accept # undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag # will automatically be disabled. # The default value is: NO. WARN_IF_UNDOC_ENUM_VAL = NO # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but # at the end of the doxygen process doxygen will return with a non-zero status. # If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS_PRINT then doxygen behaves # like FAIL_ON_WARNINGS but in case no WARN_LOGFILE is defined doxygen will not # write the warning messages in between other messages but write them at the end # of a run, in case a WARN_LOGFILE is defined the warning messages will be # besides being in the defined file also be shown at the end of a run, unless # the WARN_LOGFILE is defined as - i.e. standard output (stdout) in that case # the behavior will remain as with the setting FAIL_ON_WARNINGS. # Possible values are: NO, YES, FAIL_ON_WARNINGS and FAIL_ON_WARNINGS_PRINT. # The default value is: NO. WARN_AS_ERROR = NO # The WARN_FORMAT tag determines the format of the warning messages that doxygen # can produce. The string should contain the $file, $line, and $text tags, which # will be replaced by the file and line number from which the warning originated # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) # See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" # In the $text part of the WARN_FORMAT command it is possible that a reference # to a more specific place is given. To make it easier to jump to this place # (outside of doxygen) the user can define a custom "cut" / "paste" string. # Example: # WARN_LINE_FORMAT = "'vi $file +$line'" # See also: WARN_FORMAT # The default value is: at line $line of file $file. WARN_LINE_FORMAT = "at line $line of file $file" # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard # error (stderr). In case the file specified cannot be opened for writing the # warning and error messages are written to standard error. When as file - is # specified the warning and error messages are written to standard output # (stdout). #WARN_LOGFILE = @coin_doxy_logname@ #--------------------------------------------------------------------------- # Configuration options related to the input files #--------------------------------------------------------------------------- # The INPUT tag is used to specify the files and/or directories that contain # documented source files. You may enter file names like myfile.cpp or # directories like /usr/src/myproject. Separate the files or directories with # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING # Note: If this tag is empty the current directory is searched. INPUT = @abs_top_srcdir@/doc \ @abs_top_srcdir@/src \ @abs_top_srcdir@/contrib/sIPOPT/src \ @abs_top_srcdir@/contrib/sIPOPT/AmplSolver \ @abs_top_srcdir@/ChangeLog.md # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. # See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 # This tag can be used to specify the character encoding of the source files # that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify # character encoding on a per file pattern basis. Doxygen will compare the file # name with each pattern and apply the encoding instead of the default # INPUT_ENCODING) if there is a match. The character encodings are a list of the # form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding # "INPUT_ENCODING" for further information on supported encodings. INPUT_FILE_ENCODING = # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # # Note the list of default checked file patterns might differ from the list of # default file extension mappings. # # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cxxm, # *.cpp, *.cppm, *.c++, *.c++m, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, # *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, *.h++, *.ixx, *.l, *.cs, *.d, *.php, # *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be # provided as doxygen C comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, # *.f18, *.f, *.for, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.hpp \ *.h \ *.java \ *.dox # The RECURSIVE tag can be used to specify whether or not subdirectories should # be searched for input files as well. # The default value is: NO. RECURSIVE = YES # The EXCLUDE tag can be used to specify files and/or directories that should be # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. # # Note that relative paths are relative to the directory from which doxygen is # run. EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded # from the input. # The default value is: NO. EXCLUDE_SYMLINKS = NO # If the value of the INPUT tag contains directories, you can use the # EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude # certain files from those directories. # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* EXCLUDE_PATTERNS = @coin_doxy_excludes@ # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, # ANamespace::AClass, ANamespace::*Test EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). EXAMPLE_PATH = @abs_top_srcdir@/examples \ @abs_top_srcdir@/src/Interfaces \ @abs_top_srcdir@/AUTHORS \ @abs_top_srcdir@/LICENSE # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and # *.h) to filter out the source-files in the directories. If left blank all # files are included. EXAMPLE_PATTERNS = # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be # searched for input files to be used with the \include or \dontinclude commands # irrespective of the value of the RECURSIVE tag. # The default value is: NO. EXAMPLE_RECURSIVE = NO # The IMAGE_PATH tag can be used to specify one or more files or directories # that contain images that are to be included in the documentation (see the # \image command). IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program # by executing (via popen()) the command: # # # # where is the value of the INPUT_FILTER tag, and is the # name of an input file. Doxygen will then use the output that the filter # program writes to standard output. If FILTER_PATTERNS is specified, this tag # will be ignored. # # Note that the filter must not add or remove lines; it is applied before the # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # # Note that doxygen will use the data processed and written to standard output # for further processing, therefore nothing else, like debug statements or used # commands (so in case of a Windows batch file always use @echo OFF), should be # written to standard output. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the # filter if there is a match. The filters are a list of the form: pattern=filter # (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how # filters are used. If the FILTER_PATTERNS tag is empty or if none of the # patterns match the file name, INPUT_FILTER is applied. # # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. FILTER_PATTERNS = "*ChangeLog.md=sed -e 's/\bIpopt\b/%Ipopt/g' -e 's/\/%Ipopt/\/Ipopt/g'" # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for # producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). # The default value is: NO. FILTER_SOURCE_FILES = NO # The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file # pattern. A pattern will override the setting for FILTER_PATTERN (if any) and # it is also possible to disable source filtering for a specific pattern using # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. USE_MDFILE_AS_MAINPAGE = # The Fortran standard specifies that for fixed formatted Fortran code all # characters from position 72 are to be considered as comment. A common # extension is to allow longer lines before the automatic comment starts. The # setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can # be processed before the automatic comment starts. # Minimum value: 7, maximum value: 10000, default value: 72. FORTRAN_COMMENT_AFTER = 72 #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- # If the SOURCE_BROWSER tag is set to YES then a list of source files will be # generated. Documented entities will be cross-referenced with these sources. # # Note: To get rid of all source code in the generated output, make sure that # also VERBATIM_HEADERS is set to NO. # The default value is: NO. SOURCE_BROWSER = YES # Setting the INLINE_SOURCES tag to YES will include the body of functions, # classes and enums directly into the documentation. # The default value is: NO. INLINE_SOURCES = NO # Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any # special comment blocks from generated source code fragments. Normal C, C++ and # Fortran comments will always remain visible. # The default value is: YES. STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented # entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO # If the REFERENCES_RELATION tag is set to YES then for each documented function # all documented entities called/used by that function will be listed. # The default value is: NO. REFERENCES_RELATION = NO # If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set # to YES then the hyperlinks from functions in REFERENCES_RELATION and # REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will # link to the documentation. # The default value is: YES. REFERENCES_LINK_SOURCE = YES # If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the # source code will show a tooltip with additional information such as prototype, # brief description and links to the definition and documentation. Since this # will make the HTML file larger and loading of large files a bit slower, you # can opt to disable this feature. # The default value is: YES. # This tag requires that the tag SOURCE_BROWSER is set to YES. SOURCE_TOOLTIPS = YES # If the USE_HTAGS tag is set to YES then the references to source code will # point to the HTML generated by the htags(1) tool instead of doxygen built-in # source browser. The htags tool is part of GNU's global source tagging system # (see https://www.gnu.org/software/global/global.html). You will need version # 4.8.6 or higher. # # To use it do the following: # - Install the latest version of global # - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # # Doxygen will invoke htags (and that will in turn invoke gtags), so these # tools must be available from the command line (i.e. in the search path). # # The result: instead of the source browser generated by doxygen, the links to # source code will now point to the output of htags. # The default value is: NO. # This tag requires that the tag SOURCE_BROWSER is set to YES. USE_HTAGS = NO # If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a # verbatim copy of the header file for each class for which an include is # specified. Set to NO to disable this. # See also: Section \class. # The default value is: YES. VERBATIM_HEADERS = YES #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index #--------------------------------------------------------------------------- # If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all # compounds will be generated. Enable this if the project contains a lot of # classes, structs, unions or interfaces. # The default value is: YES. ALPHABETICAL_INDEX = YES # The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) # that should be ignored while generating the index headers. The IGNORE_PREFIX # tag works for classes, function and member names. The entity will be placed in # the alphabetical list under the first letter of the entity name that remains # after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output #--------------------------------------------------------------------------- # If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output # The default value is: YES. GENERATE_HTML = YES # The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a # relative path is entered the value of OUTPUT_DIRECTORY will be put in front of # it. # The default directory is: html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_OUTPUT = html # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # generated HTML page (for example: .htm, .php, .asp). # The default value is: .html. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FILE_EXTENSION = .html # The HTML_HEADER tag can be used to specify a user-defined HTML header file for # each generated HTML page. If the tag is left blank doxygen will generate a # standard header. # # To get valid HTML the header file that includes any scripts and style sheets # that doxygen needs, which is dependent on the configuration options used (e.g. # the setting GENERATE_TREEVIEW). It is highly recommended to start with a # default header using # doxygen -w html new_header.html new_footer.html new_stylesheet.css # YourConfigFile # and then modify the file new_header.html. See also section "Doxygen usage" # for information on how to generate the default header that doxygen normally # uses. # Note: The header is subject to change so you typically have to regenerate the # default header when upgrading to a newer version of doxygen. For a description # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_HEADER = @abs_top_srcdir@/doc/header.html # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard # footer. See HTML_HEADER for more information on how to generate a default # footer and what special commands can be used inside the footer. See also # section "Doxygen usage" for information on how to generate the default footer # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FOOTER = @abs_top_srcdir@/doc/footer.html # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of # the HTML output. If left blank doxygen will generate a default style sheet. # See also section "Doxygen usage" for information on how to generate the style # sheet that doxygen normally uses. # Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as # it is more robust and this tag (HTML_STYLESHEET) will in the future become # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_STYLESHEET = @abs_top_srcdir@/doc/stylesheet.css # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets # created by doxygen. Using this option one can overrule certain style aspects. # This is preferred over using HTML_STYLESHEET since it does not replace the # standard style sheet and is therefore more robust against future updates. # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the # list). # Note: Since the styling of scrollbars can currently not be overruled in # Webkit/Chromium, the styling will be left out of the default doxygen.css if # one or more extra stylesheets have been specified. So if scrollbar # customization is desired it has to be added explicitly. For an example see the # documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note # that these files will be copied to the base HTML output directory. Use the # $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these # files. In the HTML_STYLESHEET file, use the file name only. Also note that the # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_FILES = # The HTML_COLORSTYLE tag can be used to specify if the generated HTML output # should be rendered with a dark or light theme. # Possible values are: LIGHT always generate light mode output, DARK always # generate dark mode output, AUTO_LIGHT automatically set the mode according to # the user preference, use light mode if no preference is set (the default), # AUTO_DARK automatically set the mode according to the user preference, use # dark mode if no preference is set and TOGGLE allow to user to switch between # light and dark mode via a button. # The default value is: AUTO_LIGHT. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE = AUTO_LIGHT # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. # Minimum value: 0, maximum value: 359, default value: 220. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_SAT = 100 # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # luminance component of the colors in the HTML output. Values below 100 # gradually make the output lighter, whereas values above 100 make the output # darker. The value divided by 100 is the actual gamma applied, so 80 represents # a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not # change the gamma. # Minimum value: 40, maximum value: 240, default value: 80. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_COLORSTYLE_GAMMA = 80 # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that # are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML # page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_MENUS = YES # If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML # documentation will contain sections that can be hidden and shown after the # page has loaded. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_DYNAMIC_SECTIONS = YES # If the HTML_CODE_FOLDING tag is set to YES then classes and functions can be # dynamically folded and expanded in the generated HTML source code. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_CODE_FOLDING = YES # With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries # shown in the various tree structured indices initially; the user can expand # and collapse entries dynamically later on. Doxygen will expand the tree to # such a level that at most the specified number of entries are visible (unless # a fully collapsed tree already exceeds this amount). So setting the number of # entries 1 will produce a full collapsed tree by default. 0 is a special value # representing an infinite number of entries and will result in a full expanded # tree by default. # Minimum value: 0, maximum value: 9999, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development # environment (see: # https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To # create a documentation set, doxygen will generate a Makefile in the HTML # output directory. Running make will produce the docset in that directory and # running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_DOCSET = NO # This tag determines the name of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # The default value is: Doxygen generated docs. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDNAME = "Doxygen generated docs" # This tag determines the URL of the docset feed. A documentation feed provides # an umbrella under which multiple documentation sets from a single provider # (such as a company or product suite) can be grouped. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_FEEDURL = # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_BUNDLE_ID = org.doxygen.Project # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. # The default value is: org.doxygen.Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_ID = org.doxygen.Publisher # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The default value is: Publisher. # This tag requires that the tag GENERATE_DOCSET is set to YES. DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # on Windows. In the beginning of 2021 Microsoft took the original page, with # a.o. the download links, offline the HTML help workshop was already many years # in maintenance mode). You can download the HTML help workshop from the web # archives at Installation executable (see: # http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo # ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # files are now used as the Windows 98 help format, and will replace the old # Windows help format (.hlp) on all Windows platforms in the future. Compressed # HTML files also contain an index, a table of contents, and you can search for # words in the documentation. The HTML workshop also contains a viewer for # compressed HTML files. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_HTMLHELP = NO # The CHM_FILE tag can be used to specify the file name of the resulting .chm # file. You can add a path in front of the file if the result should not be # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, # doxygen will try to run the HTML help compiler on the generated index.hhp. # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated # (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. GENERATE_CHI = NO # The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it # enables the Previous and Next buttons. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. BINARY_TOC = NO # The TOC_EXPAND flag can be set to YES to add extra items for group members to # the table of contents of the HTML help documentation and to the tree view. # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. TOC_EXPAND = NO # The SITEMAP_URL tag is used to specify the full URL of the place where the # generated documentation will be placed on the server by the user during the # deployment of the documentation. The generated sitemap is called sitemap.xml # and placed on the directory specified by HTML_OUTPUT. In case no SITEMAP_URL # is specified no sitemap is generated. For information about the sitemap # protocol see https://www.sitemaps.org # This tag requires that the tag GENERATE_HTML is set to YES. SITEMAP_URL = # If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and # QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that # can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help # (.qch) of the generated HTML documentation. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_QHP = NO # If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify # the file name of the resulting .qch file. The path specified is relative to # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace # (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_NAMESPACE = # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual # Folders (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom # Filters (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom # Filters (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. QHP_SECT_FILTER_ATTRS = # The QHG_LOCATION tag can be used to specify the location (absolute path # including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to # run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To # install this plugin and make it available under the help contents menu in # Eclipse, the contents of the directory containing the HTML and XML files needs # to be copied into the plugins directory of eclipse. The name of the directory # within the plugins directory should be the same as the ECLIPSE_DOC_ID value. # After copying Eclipse needs to be restarted before the help appears. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_ECLIPSEHELP = NO # A unique identifier for the Eclipse help plugin. When installing the plugin # the directory name containing the HTML and XML files should also have this # name. Each documentation set should have its own identifier. # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. ECLIPSE_DOC_ID = org.doxygen.Project # If you want full control over the layout of the generated HTML pages it might # be necessary to disable the index and replace it with your own. The # DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top # of each HTML page. A value of NO enables the index and the value YES disables # it. Since the tabs in the index contain the same information as the navigation # tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. DISABLE_INDEX = YES # The GENERATE_TREEVIEW tag is used to specify whether a tree-like index # structure should be generated to display hierarchical information. If the tag # value is set to YES, a side panel will be generated containing a tree-like # index structure (just like the one that is generated for HTML Help). For this # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can # further fine tune the look of the index (see "Fine-tuning the output"). As an # example, the default style sheet generated by doxygen has an example that # shows how to put an image at the root of the tree instead of the PROJECT_NAME. # Since the tree basically has the same information as the tab index, you could # consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = YES # When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the # FULL_SIDEBAR option determines if the side bar is limited to only the treeview # area (value NO) or if it should extend to the full height of the window (value # YES). Setting this to YES gives a layout similar to # https://docs.readthedocs.io with more room for contents, but less room for the # project logo, title, and description. If either GENERATE_TREEVIEW or # DISABLE_INDEX is set to NO, this option has no effect. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. FULL_SIDEBAR = NO # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # # Note that a value of 0 will completely suppress the enum values from appearing # in the overview section. # Minimum value: 0, maximum value: 20, default value: 4. # This tag requires that the tag GENERATE_HTML is set to YES. ENUM_VALUES_PER_LINE = 4 # If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used # to set the initial width (in pixels) of the frame in which the tree is shown. # Minimum value: 0, maximum value: 1500, default value: 250. # This tag requires that the tag GENERATE_HTML is set to YES. TREEVIEW_WIDTH = 200 # If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to # external symbols imported via tag files in a separate window. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. EXT_LINKS_IN_WINDOW = NO # If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email # addresses. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. OBFUSCATE_EMAILS = YES # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for # the HTML output. These images will generally look nicer at scaled resolutions. # Possible values are: png (the default) and svg (looks nicer but requires the # pdf2svg or inkscape tool). # The default value is: png. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_FORMULA_FORMAT = png # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML # output directory to force them to be regenerated. # Minimum value: 8, maximum value: 50, default value: 10. # This tag requires that the tag GENERATE_HTML is set to YES. FORMULA_FONTSIZE = 11 # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path # to it using the MATHJAX_RELPATH option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. USE_MATHJAX = YES # With MATHJAX_VERSION it is possible to specify the MathJax version to be used. # Note that the different versions of MathJax have different requirements with # regards to the different settings, so it is possible that also other MathJax # settings have to be changed when switching between the different MathJax # versions. # Possible values are: MathJax_2 and MathJax_3. # The default value is: MathJax_2. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_VERSION = MathJax_2 # When MathJax is enabled you can set the default output format to be used for # the MathJax output. For more details about the output format see MathJax # version 2 (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 # (see: # http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best # compatibility. This is the name for Mathjax version 2, for MathJax version 3 # this will be translated into chtml), NativeMML (i.e. MathML. Only supported # for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This # is the name for Mathjax version 3, for MathJax version 2 this will be # translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_FORMAT = HTML-CSS # When MathJax is enabled you need to specify the location relative to the HTML # output directory using the MATHJAX_RELPATH option. The destination directory # should contain the MathJax.js script. For instance, if the mathjax directory # is located at the same level as the HTML output directory, then # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of # MathJax from https://www.mathjax.org before deployment. The default value is: # - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 # - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = https://cdn.jsdelivr.net/npm/mathjax@2 # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example # for MathJax version 2 (see # https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols # For example for MathJax version 3 (see # http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): # MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site # (see: # http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and # should work on any modern browser. Note that when using HTML help # (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) # there is already a search function so this one should typically be disabled. # For large projects the javascript based search engine can be slow, then # enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to # search using the keyboard; to jump to the search box use + S # (what the is depends on the OS and browser, but it is typically # , /Node, # Edge and Graph Attributes specification You need to make sure dot is able # to find the font, which can be done by putting it in a standard location or by # setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the # directory containing the font. Default graphviz fontsize is 14. # The default value is: fontname=Helvetica,fontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" # DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can # add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about # arrows shapes. # The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" # DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes # around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification # The default value is: shape=box,height=0.2,width=0.4. # This tag requires that the tag HAVE_DOT is set to YES. DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" # You can set the path where dot can find font specified with fontname in # DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = # If the CLASS_GRAPH tag is set to YES or GRAPH or BUILTIN then doxygen will # generate a graph for each documented class showing the direct and indirect # inheritance relations. In case the CLASS_GRAPH tag is set to YES or GRAPH and # HAVE_DOT is enabled as well, then dot will be used to draw the graph. In case # the CLASS_GRAPH tag is set to YES and HAVE_DOT is disabled or if the # CLASS_GRAPH tag is set to BUILTIN, then the built-in generator will be used. # If the CLASS_GRAPH tag is set to TEXT the direct and indirect inheritance # relations will be shown as texts / links. # Possible values are: NO, YES, TEXT, GRAPH and BUILTIN. # The default value is: YES. CLASS_GRAPH = YES # If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a # graph for each documented class showing the direct and indirect implementation # dependencies (inheritance, containment, and class references variables) of the # class with other documented classes. Explicit enabling a collaboration graph, # when COLLABORATION_GRAPH is set to NO, can be accomplished by means of the # command \collaborationgraph. Disabling a collaboration graph can be # accomplished by means of the command \hidecollaborationgraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. COLLABORATION_GRAPH = NO # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for # groups, showing the direct groups dependencies. Explicit enabling a group # dependency graph, when GROUP_GRAPHS is set to NO, can be accomplished by means # of the command \groupgraph. Disabling a directory graph can be accomplished by # means of the command \hidegroupgraph. See also the chapter Grouping in the # manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GROUP_GRAPHS = YES # If the UML_LOOK tag is set to YES, doxygen will generate inheritance and # collaboration diagrams in a style similar to the OMG's Unified Modeling # Language. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. UML_LOOK = NO # If the UML_LOOK tag is enabled, the fields and methods are shown inside the # class node. If there are many fields or methods and many nodes the graph may # become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the # number of items for each type to make the size more manageable. Set this to 0 # for no limit. Note that the threshold may be exceeded by 50% before the limit # is enforced. So when you set the threshold to 10, up to 15 fields may appear, # but if the number exceeds 15, the total amount of fields shown is limited to # 10. # Minimum value: 0, maximum value: 100, default value: 10. # This tag requires that the tag UML_LOOK is set to YES. UML_LIMIT_NUM_FIELDS = 10 # If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and # methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS # tag is set to YES, doxygen will add type and arguments for attributes and # methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen # will not generate fields with class member information in the UML graphs. The # class diagrams will look similar to the default class diagrams but using UML # notation for the relationships. # Possible values are: NO, YES and NONE. # The default value is: NO. # This tag requires that the tag UML_LOOK is set to YES. DOT_UML_DETAILS = NO # The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters # to display on a single line. If the actual line length exceeds this threshold # significantly it will wrapped across multiple lines. Some heuristics are apply # to avoid ugly line breaks. # Minimum value: 0, maximum value: 1000, default value: 17. # This tag requires that the tag HAVE_DOT is set to YES. DOT_WRAP_THRESHOLD = 17 # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. TEMPLATE_RELATIONS = YES # If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to # YES then doxygen will generate a graph for each documented file showing the # direct and indirect include dependencies of the file with other documented # files. Explicit enabling an include graph, when INCLUDE_GRAPH is is set to NO, # can be accomplished by means of the command \includegraph. Disabling an # include graph can be accomplished by means of the command \hideincludegraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDE_GRAPH = NO # If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are # set to YES then doxygen will generate a graph for each documented file showing # the direct and indirect include dependencies of the file with other documented # files. Explicit enabling an included by graph, when INCLUDED_BY_GRAPH is set # to NO, can be accomplished by means of the command \includedbygraph. Disabling # an included by graph can be accomplished by means of the command # \hideincludedbygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. INCLUDED_BY_GRAPH = NO # If the CALL_GRAPH tag is set to YES then doxygen will generate a call # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable call graphs for selected # functions only using the \callgraph command. Disabling a call graph can be # accomplished by means of the command \hidecallgraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. CALL_GRAPH = NO # If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller # dependency graph for every global function or class method. # # Note that enabling this option will significantly increase the time of a run. # So in most cases it will be better to enable caller graphs for selected # functions only using the \callergraph command. Disabling a caller graph can be # accomplished by means of the command \hidecallergraph. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. CALLER_GRAPH = NO # If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical # hierarchy of all classes instead of a textual one. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GRAPHICAL_HIERARCHY = NO # If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the # dependencies a directory has on other directories in a graphical way. The # dependency relations are determined by the #include relations between the # files in the directories. Explicit enabling a directory graph, when # DIRECTORY_GRAPH is set to NO, can be accomplished by means of the command # \directorygraph. Disabling a directory graph can be accomplished by means of # the command \hidedirectorygraph. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. DIRECTORY_GRAPH = YES # The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels # of child directories generated in directory dependency graphs by dot. # Minimum value: 1, maximum value: 25, default value: 1. # This tag requires that the tag DIRECTORY_GRAPH is set to YES. DIR_GRAPH_MAX_DEPTH = 1 # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: # https://www.graphviz.org/)). # Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order # to make the SVG files visible in IE 9+ (other browsers do not have this # requirement). # Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo, # png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and # png:gdiplus:gdiplus. # The default value is: png. # This tag requires that the tag HAVE_DOT is set to YES. DOT_IMAGE_FORMAT = png # If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to # enable generation of interactive SVG images that allow zooming and panning. # # Note that this requires a modern browser other than Internet Explorer. Tested # and working are Firefox, Chrome, Safari, and Opera. # Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make # the SVG files visible. Older versions of IE do not have SVG support. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. INTERACTIVE_SVG = NO # The DOT_PATH tag can be used to specify the path where the dot tool can be # found. If left blank, it is assumed the dot tool can be found in the path. # This tag requires that the tag HAVE_DOT is set to YES. DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the \dotfile # command). # This tag requires that the tag HAVE_DOT is set to YES. DOTFILE_DIRS = # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. # If left empty dia is assumed to be found in the default search path. DIA_PATH = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile # command). DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the # path where java can find the plantuml.jar file or to the filename of jar file # to be used. If left blank, it is assumed PlantUML is not used or called during # a preprocessing step. Doxygen will generate a warning when it encounters a # \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = # When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a # configuration file for plantuml. PLANTUML_CFG_FILE = # When using plantuml, the specified paths are searched for files specified by # the !include statement in a plantuml block. PLANTUML_INCLUDE_PATH = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes # larger than this value, doxygen will truncate the graph, which is visualized # by representing a node as a red box. Note that doxygen if the number of direct # children of the root node in a graph is already larger than # DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that # the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. # Minimum value: 0, maximum value: 10000, default value: 50. # This tag requires that the tag HAVE_DOT is set to YES. DOT_GRAPH_MAX_NODES = 50 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs # generated by dot. A depth value of 3 means that only nodes reachable from the # root by following a path via at most 3 edges will be shown. Nodes that lay # further from the root node will be omitted. Note that setting this option to 1 # or 2 may greatly reduce the computation time needed for large code bases. Also # note that the size of a graph can be further restricted by # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. # Minimum value: 0, maximum value: 1000, default value: 0. # This tag requires that the tag HAVE_DOT is set to YES. MAX_DOT_GRAPH_DEPTH = 0 # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support # this, this feature is disabled by default. # The default value is: NO. # This tag requires that the tag HAVE_DOT is set to YES. DOT_MULTI_TARGETS = YES # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. # Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal # graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES # If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. # # Note: This setting is not only used for dot files but also for msc temporary # files. # The default value is: YES. DOT_CLEANUP = YES # You can define message sequence charts within doxygen comments using the \msc # command. If the MSCGEN_TOOL tag is left empty (the default), then doxygen will # use a built-in version of mscgen tool to produce the charts. Alternatively, # the MSCGEN_TOOL tag can also specify the name an external tool. For instance, # specifying prog as the value, doxygen will call the tool as prog -T # -o . The external tool should support # output file formats "png", "eps", "svg", and "ismap". MSCGEN_TOOL = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the \mscfile # command). MSCFILE_DIRS = coinor-ipopt-3.14.17/doc/faq.dox000066400000000000000000000132071473776672200163710ustar00rootroot00000000000000/** \page FAQ Frequenty Asked Questions Contained below is a list of the frequently asked questions for %Ipopt. ## What is Ipopt? %Ipopt (*I*nterior *P*oint *OPT*imizer, pronounced eye-pea-Opt) is a software package for large-scale nonlinear optimization. %Ipopt implements an interior-point algorithm for continuous, nonlinear, nonconvex, constrained optimization problems. It is meant to be a general purpose nonlinear programming (NLP) solver. However, it is mainly written for large-scale problems with up to million of variables and constraints. (For such large problems, it is assumed that the derivative matrices are sparse.) Please see the [Ipopt project page](https://github.com/coin-or/Ipopt) for a more detailed description. ## How do I use Ipopt? See \ref HOWTOUSE. ## What license is Ipopt released under? The %Ipopt source code is now released under the [Eclipse Public License (EPL)](http://www.eclipse.org/legal/epl-v10.html). Originally (before release 3.9.2), IPOPT was released under the Common Public License (CPL). However, the CPL has been "deprecated and superseded" by the Ecplise Public License (EPL). The new license (EPL) is almost the same as the old with 2 "new and improved" features: (i) the license steward is the Eclipse Foundation (not IBM) and (ii) the EPL does not have the "defense termination clause" (aka the patent retaliation bit) which was a point of objection by some. Some additional information regarding the licenses might be found at this [FAQ](http://www.ibm.com/developerworks/library/os-cplfaq.html). ## What do I need to build Ipopt? While the source code for %Ipopt itself is released as open source under the Eclipse Public License (EPL), compilation requires third party components (such as BLAS, LAPACK, some sparse linear solver library) which you have to obtain separately. The %Ipopt documentation gives detailed instructions on how to obtain and compile these components. (These components may be covered by license agreements different from EPL and may not be free for commercial use.) ## On what operating systems can Ipopt be used? Convenient configuration scripts and Makefiles are provided and have been tested for several flavors of GNU/Linux, macOS, and MSYS2/MinGW. Previous versions of IPOPT have also been run on an old iPod, as well as BlueGene. ## Is Ipopt thread-safe? %Ipopt itself is thread-safe. Please check the used third-party components, i.e., linear algebra and linear solvers, for thread-safety, too. For example, MUMPS is not thread-safe. Since %Ipopt 3.14.0, however, calls into MUMPS are protected by a mutex in the %Ipopt/MUMPS interface, so that it should be possible to use %Ipopt with MUMPS in a multi-threading environment as well. ## What is the method behind Ipopt? %Ipopt implements a interior point method for nonlinear programming. Search directions (coming from a linearization of the optimality conditions) can be computed in a full-space version by solving a large symmetric linear system. %Ipopt can employ second derivative information, if available, or otherwise approximate it by means of a limited-memory quasi-Newton approach (BFGS and SR1). Global convergence of the method is ensured by a line search procedure, based on a filter method. This paper describes the implementation of %Ipopt: \cite WaecBieg06:mp. Additional technical information may be found in other publications [here](https://researcher.ibm.com/researcher/view_page.php?id=1717). ## Who do I contact with questions about Ipopt? If you have any questions or comments please create a discussion at the [Ipopt GitHub Discussions system](https://github.com/coin-or/Ipopt/discussions). Please include detailed information about your configuration (operating system, compilers, version number of Ipopt, etc) if you are writing about a compilation or execution problem. (Note: You need a GitHub account to create or contribute to a discussion.) ## What is the difference between the Fortran version and the C++ version? The original version of %Ipopt was written in Fortran 77 by Andreas Wächter at Carnegie Mellon University. This version was contributed to the COIN-OR initiative and development has continued. In an effort to make %Ipopt more flexible for new algorithm development, we set out to design and implement a new version of %Ipopt in C++. This version was released on Aug. 26, 2005, and is the primary version for new developments. The previous Fortran version is still available, but will not see any new development other than bug fixes. Currently, there are some features in the Fortran version that are not implemented in the C++ version. - Quasi-Newton Strategies: There is no reduced-space option in the new C++ version, but full space L-BFGS and L-SR1 options are slated for development. - Complementarities: Handling of complementarity constraints using Arvind Raghunathan's constraint relaxation is not implemented. The new C++ version also contains features not available in the Fortran version. - New problem structure: The new problem structure handles general inequalities. This means that slack variables are handled by %Ipopt and you no longer need to add them yourself. This also allows %Ipopt to identify the slack variables and take extra steps. - Adaptive Mu Update: The new version of %Ipopt includes an adaptive strategy for selecting the value of the barrier parameter. In many cases, this can reduce the number of iterations required by %Ipopt. \cite NocWaeWal:adaptive - New linear solvers: More linear solvers have been interfaced with %Ipopt with other linear solvers. All in all we think that the new version is easier to use. Furthermore, we think it is now far easier for others to contribute to the open source project. */ coinor-ipopt-3.14.17/doc/footer.html000066400000000000000000000000201473776672200172570ustar00rootroot00000000000000 coinor-ipopt-3.14.17/doc/header.html000066400000000000000000000040431473776672200172220ustar00rootroot00000000000000 $projectname: $title $title $treeview $search $mathjax $extrastylesheet

$projectname Documentation  
$projectbrief
$projectbrief
$searchbox
coinor-ipopt-3.14.17/doc/hs071_warmstart.mod000066400000000000000000000031521473776672200205530ustar00rootroot00000000000000# tell ampl to use the ipopt executable as a solver # make sure ipopt is in the path! option solver ipopt; # declare the variables and their bounds, # set notation could be used, but this is straightforward var x1 >= 1, <= 5; var x2 >= 1, <= 5; var x3 >= 1, <= 5; var x4 >= 1, <= 5; # specify the objective function minimize obj: x1 * x4 * (x1 + x2 + x3) + x3; # specify the constraints s.t. inequality: x1 * x2 * x3 * x4 >= 25; equality: x1^2 + x2^2 + x3^2 +x4^2 = 40; # specify the starting point let x1 := 1; let x2 := 5; let x3 := 5; let x4 := 1; # solve the problem solve; # ipopt returns the bound multipliers through # the suffixes ipopt_zL_out and ipopt_zU_out # the user does not need to specify them # print the solution and variable bounds multipliers display x1; display x2; display x3; display x4; display x1.ipopt_zL_out; display x1.ipopt_zU_out; display x2.ipopt_zL_out; display x2.ipopt_zU_out; display x3.ipopt_zL_out; display x3.ipopt_zU_out; display x4.ipopt_zL_out; display x4.ipopt_zU_out; # define initial conditions for bound multipliers # to solve new problem suffix ipopt_zL_in, IN; suffix ipopt_zU_in, IN; let x1.ipopt_zL_in := x1.ipopt_zL_out; let x1.ipopt_zU_in := x1.ipopt_zU_out; let x2.ipopt_zL_in := x2.ipopt_zL_out; let x2.ipopt_zU_in := x2.ipopt_zU_out; let x3.ipopt_zL_in := x3.ipopt_zL_out; let x3.ipopt_zU_in := x3.ipopt_zU_out; let x4.ipopt_zL_in := x4.ipopt_zL_out; let x4.ipopt_zU_in := x4.ipopt_zU_out; # set options for warm-start option ipopt_options "warm_start_init_point yes warm_start_bound_push 1e-6 warm_start_mult_bound_push 1e-6 mu_init 1e-6"; # solve the problem again solve; coinor-ipopt-3.14.17/doc/impl.dox000066400000000000000000000162011473776672200165600ustar00rootroot00000000000000/** \page IMPL Implementation Details \section TRIPLET Triplet Format for Sparse Matrices %Ipopt was designed for optimizing large sparse nonlinear programs. Because of problem sparsity, the required matrices (like the constraints Jacobian or Lagrangian Hessian) are not stored as dense matrices, but rather in a sparse matrix format. For the tutorials in this document, we use the triplet format. Consider the matrix \f[ \left[ \begin{array}{ccccccc} 1.1 & 0 & 0 & 0 & 0 & 0 & 0.5 \\ 0 & 1.9 & 0 & 0 & 0 & 0 & 0.5 \\ 0 & 0 & 2.6 & 0 & 0 & 0 & 0.5 \\ 0 & 0 & 7.8 & 0.6 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1.5 & 2.7 & 0 & 0 \\ 1.6 & 0 & 0 & 0 & 0.4 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0.9 & 1.7 \\ \end{array} \right] \f] A standard dense matrix representation would need to store 7 * 7 = 49 floating point numbers, where many entries would be zero. In triplet format, however, only the nonzero entries are stored. The triplet format records the row number, the column number, and the value of all nonzero entries in the matrix. For the matrix above, this means storing 14 integers for the rows, 14 integers for the columns, and 14 floating point numbers for the values. While this does not seem like a huge space saving over the 49 floating point numbers stored in the dense representation, for larger matrices, the space savings are very dramatic. (For an \f$n \times n\f$ matrix, the dense representation grows with the the square of \f$n\f$, while the sparse representation grows linearly in the number of nonzeros.) The parameter `index_style` in Ipopt::TNLP::get_nlp_info tells %Ipopt if you prefer to use C style indexing (0-based, i.e., starting the counting at 0) for the row and column indices or Fortran style (1-based). The following table shows the triplet format for the above example matrix when using the Fortran indexing style. | row | col | value | |:-------------|:-------------|:-----------------| | iRow[0] = 1 | jCol[0] = 1 | values[0] = 1.1 | | iRow[1] = 1 | jCol[1] = 7 | values[1] = 0.5 | | iRow[2] = 2 | jCol[2] = 2 | values[2] = 1.9 | | iRow[3] = 2 | jCol[3] = 7 | values[3] = 0.5 | | iRow[4] = 3 | jCol[4] = 3 | values[4] = 2.6 | | iRow[5] = 3 | jCol[5] = 7 | values[5] = 0.5 | | iRow[6] = 4 | jCol[6] = 3 | values[6] = 7.8 | | iRow[7] = 4 | jCol[7] = 4 | values[7] = 0.6 | | iRow[8] = 5 | jCol[8] = 4 | values[8] = 1.5 | | iRow[9] = 5 | jCol[9] = 5 | values[9] = 2.7 | | iRow[10] = 6 | jCol[10] = 1 | values[10] = 1.6 | | iRow[11] = 6 | jCol[11] = 5 | values[11] = 0.4 | | iRow[12] = 7 | jCol[12] = 6 | values[12] = 0.9 | | iRow[13] = 7 | jCol[13] = 7 | values[13] = 1.7 | When using the C indexing style, the above example matrix in triplet format is the following: | row | col | value | |--------------|--------------|------------------| | iRow[0] = 0 | jCol[0] = 0 | values[0] = 1.1 | | iRow[1] = 0 | jCol[1] = 6 | values[1] = 0.5 | | iRow[2] = 1 | jCol[2] = 1 | values[2] = 1.9 | | iRow[3] = 1 | jCol[3] = 6 | values[3] = 0.5 | | iRow[4] = 2 | jCol[4] = 2 | values[4] = 2.6 | | iRow[5] = 2 | jCol[5] = 6 | values[5] = 0.5 | | iRow[6] = 3 | jCol[6] = 2 | values[6] = 7.8 | | iRow[7] = 3 | jCol[7] = 3 | values[7] = 0.6 | | iRow[8] = 4 | jCol[8] = 3 | values[8] = 1.5 | | iRow[9] = 4 | jCol[9] = 4 | values[9] = 2.7 | | iRow[10] = 5 | jCol[10] = 0 | values[10] = 1.6 | | iRow[11] = 5 | jCol[11] = 4 | values[11] = 0.4 | | iRow[12] = 6 | jCol[12] = 5 | values[12] = 0.9 | | iRow[13] = 6 | jCol[13] = 6 | values[13] = 1.7 | The individual elements of the matrix can be listed in any order, and if there are multiple items for the same nonzero position, the values provided for those positions are added. The Hessian of the Lagrangian is a symmetric matrix. In the case of a symmetric matrix, you only need to specify the lower left triangular part (or, alternatively, the upper right triangular part). For example, given the matrix \f[ \left[ \begin{array}{ccccccc} 1.0 & 0 & 3.0 & 0 & 2.0 \\ 0 & 1.1 & 0 & 0 & 5.0 \\ 3.0 & 0 & 1.2 & 6.0 & 0 \\ 0 & 0 & 6.0 & 1.3 & 9.0 \\ 2.0 & 5.0 & 0 & 9.0 & 1.4 \end{array} \right], \f] the triplet format is shown in the following tables for the Fortran and C index styles, respectively: | row | col | value | |:------------|:------------|:--------------- | | iRow[0] = 1 | jCol[0] = 1 | values[0] = 1.0 | | iRow[1] = 2 | jCol[1] = 2 | values[1] = 1.1 | | iRow[2] = 3 | jCol[2] = 1 | values[2] = 3.0 | | iRow[3] = 3 | jCol[3] = 3 | values[3] = 1.2 | | iRow[4] = 4 | jCol[4] = 3 | values[4] = 6.0 | | iRow[5] = 4 | jCol[5] = 4 | values[5] = 1.3 | | iRow[6] = 5 | jCol[6] = 1 | values[6] = 2.0 | | iRow[7] = 5 | jCol[7] = 2 | values[7] = 5.0 | | iRow[8] = 5 | jCol[8] = 4 | values[8] = 9.0 | | iRow[9] = 5 | jCol[9] = 5 | values[9] = 1.4 | | row | col | value | |:------------|:------------|:----------------| | iRow[0] = 0 | jCol[0] = 0 | values[0] = 1.0 | | iRow[1] = 1 | jCol[1] = 1 | values[1] = 1.1 | | iRow[2] = 2 | jCol[2] = 0 | values[2] = 3.0 | | iRow[3] = 2 | jCol[3] = 2 | values[3] = 1.2 | | iRow[4] = 3 | jCol[4] = 2 | values[4] = 6.0 | | iRow[5] = 3 | jCol[5] = 3 | values[5] = 1.3 | | iRow[6] = 4 | jCol[6] = 0 | values[6] = 2.0 | | iRow[7] = 4 | jCol[7] = 1 | values[7] = 5.0 | | iRow[8] = 4 | jCol[8] = 3 | values[8] = 9.0 | | iRow[9] = 4 | jCol[9] = 4 | values[9] = 1.4 | \section SMARTPTR The Smart Pointer Implementation: SmartPtr The Ipopt::SmartPtr class is described in IpSmartPtr.hpp. It is a template class that takes care of counting references to objects and deleting them when there are no references anymore. Instead of pointing to an object with a raw C++ pointer (e.g. `HS071_NLP*`), we use a Ipopt::SmartPtr. Every time a `SmartPtr` is set to reference an object, it increments a counter in that object (see the Ipopt::ReferencedObject base class if you are interested). If a `SmartPtr` is done with the object, either by leaving scope or being set to point to another object, the counter is decremented. When the count of the object goes to zero, the object is automatically deleted. `SmartPtr`'s are very simple, just use them as you would use a standard pointer. It is very important to use `SmartPtr`'s instead of raw pointers when passing objects to %Ipopt. Internally, %Ipopt uses smart pointers for referencing objects. If you use a raw pointer in your executable, the object's counter will NOT get incremented. Then, when %Ipopt uses smart pointers inside its own code, the counter will get incremented. However, before %Ipopt returns control to your code, it will decrement as many times as it incremented earlier, and the counter will return to zero. Therefore, %Ipopt will delete the object. When control returns to you, you now have a raw pointer that points to a deleted object. This might sound difficult to anyone not familiar with the use of smart pointers, but just follow one simple rule; always use a Ipopt::SmartPtr when creating or passing an %Ipopt object. */ coinor-ipopt-3.14.17/doc/install.dox000066400000000000000000001254621473776672200172770ustar00rootroot00000000000000/** \page INSTALL Installing %Ipopt \tableofcontents The following sections describe the installation procedures on UNIX/Linux, macOS, and Windows systems. The configuration script and Makefiles in the %Ipopt distribution have been created using GNU's autoconf and automake. In general, you can see the list of options and variables that can be set for the configure script by typing `configure --help`. \section SYSTEMPACKAGES Getting System Packages (Compilers, ...) \subsection SYSTEMPACKAGES_LINUX Linux distributions Many Linux distributions will come with all necessary tools. All you should need to do is check the compiler versions. On a Debian-based distribution, you can obtain all necessary tools with the following command: sudo apt-get install gcc g++ gfortran git patch wget pkg-config liblapack-dev libmetis-dev Replace apt-get with your relevant package manager, e.g. `dnf` for RedHat-based distributions, `pacman` for Arch, etc. The g++ and gfortran compilers may need to be specified respectively as `gcc-c++` and `gcc-gfortran` with some package managers. If \ref INT64_BUILD, a variant of Lapack that uses 64-bit integers is required. On some Linux distributions (e.g., Ubuntu), this is available by installing package `liblapack64-dev`. \subsection SYSTEMPACKAGES_MAC macOS You need either the [Xcode Command Line Tools](https://developer.apple.com/downloads) or a community alternative such as Homebrew to install the GNU compilers: brew update brew install bash gcc brew link --overwrite gcc Further, pkg-config is required, which can be installed via Homebrew by brew install pkg-config If you have Xcode installed, the Command Line Tools are available under Preferences, Downloads. These items unfortunately do not come with a Fortran compiler, but you can get gfortran from http://gcc.gnu.org/wiki/GFortranBinaries#MacOS. In the past, we have been able to compile %Ipopt using default Xcode versions of gcc and g++ and a newer version of gfortran from this link, but consistent version numbers may be an issue in future cases. If you intend to use \ref DOWNLOAD_MUMPS "MUMPS" or one of the \ref DOWNLOAD_HSL "HSL linear solvers", then they may profit from an installation of METIS. This can be accomplished via brew install metis \subsection SYSTEMPACKAGES_MSYS Windows with MSYS2/MinGW For Windows, one can compile %Ipopt under MSYS2/MinGW, which is a light-weight UNIX-like environment for Windows. MSYS2/MinGW can be obtained from . After installation, a number of additional packages need to be installed: pacman -S binutils diffutils git grep make patch pkg-config (I might have forgotten something.) If you also want to use GNU compilers, then install them, too: pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-gcc-fortran When using MinGW, it is convenient to install MinGW's Lapack and METIS as well: pacman -S mingw-w64-x86_64-lapack mingw-w64-x86_64-metis To use MSYS2/MinGW to compile %Ipopt with native MSVC/Intel compilers, the basic version MSYS2 version without MinGW is sufficient. To use the GNU compilers, MinGW is required. If you want to use the native MSVC or Intel compiler, you need to make sure that environment variables are setup for the compilers. One way is to create a shell script that executes the batch files that are provided by Microsoft and Intel for this purpose before starting MSYS2. For using MSVC, this script may have a form similar to set MSYS2_PATH_TYPE=inherit call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" C:\msys64\msys2.exe exit 0 For using Intel C/C++ and Fortran compilers, the 2nd line may be replaced by something like call "C:\Program Files (x86)\IntelSWTools\compilers_and_libraries\windows\bin\ipsxe-comp-vars.bat" intel64 vs2017 You might have to search around a bit. The important thing is that, after your change, you can type `cl` and it finds the Microsoft C++ compiler and, if installed, you can type `ifort` and it finds the Intel Fortran compiler. \note The build systems of %Ipopt by default first looks for GCC and Clang before the Intel and MS compilers. To disable this, specify the flag `--enable-msvc` as argument to configure below. \section EXTERNALCODE Download, build, and install dependencies %Ipopt uses a few external packages that are not included in the %Ipopt source code distribution, for example ASL (the AMPL Solver Library if you want to compile the %Ipopt AMPL solver executable), Blas, Lapack. %Ipopt also requires at least one linear solver for sparse symmetric indefinite matrices. There are different possibilities, see below. **It is important to keep in mind that usually the largest fraction of computation time in the optimizer is spent for solving the linear system, and that your choice of the linear solver impacts %Ipopt's speed and robustness. It might be worthwhile to try different linear solver to experiment with what is best for your application.** Since this third party software is released under different licenses than %Ipopt, we cannot distribute their code together with the %Ipopt packages and have to ask you to go through the hassle of obtaining it yourself. Keep in mind that it is still your responsibility to ensure that your downloading and usage of the third party components conforms with their licenses. For ASL, HSL, and MUMPS, COIN-OR provides specialized build systems that produce libraries which are easy to use with the build system of %Ipopt. Some of the specialized build systems also come with a script that makes it easy to download the code using `wget` or `curl`. \subsection EXTERNALCODE_ASL ASL (Ampl Solver Library) Note that you only need to obtain the ASL if you intend to use %Ipopt from AMPL. It is not required if you want to specify your optimization problem in a programming language (e.g., C++, C, or Fortran). The COIN-OR Tools project [ThirdParty-ASL](https://github.com/coin-or-tools/ThirdParty-ASL/) can be used to download the ASL code and build an ASL library that is recognized by Ipopt. To do so, execute git clone https://github.com/coin-or-tools/ThirdParty-ASL.git cd ThirdParty-ASL ./get.ASL ./configure make sudo make install \subsection EXTERNALCODE_LINALG BLAS and LAPACK %Ipopt's build system tries to find an installation of BLAS and LAPACK in your system. On Ubuntu, such libraries can be made available by installing liblapack-dev. Other Linux distributions typically also offer a way to install Blas and Lapack via its package manager. On macOS, %Ipopt's build system should pick up the Blas and Lapack from the Accelerate framework. \note It is **highly recommended that you obtain an efficient implementation of the BLAS and LAPACK library**, tailored to your hardware; Section \ref PREREQUISITES lists a few options. For instance, to have configure pick up a local installation of [ATLAS](http://math-atlas.sourceforge.net) in $HOME/lib, one would use the `--with-lapack-lflags` flag when running `configure` (see \ref COMPILEINSTALL): \verbatim ./configure --with-lapack-lflags="-L$HOME/lib -lf77blas -lcblas -latlas" \endverbatim The configure script already tries to find Intel MKL libraries on some systems. If that fails, e.g., because the libraries are not available in a standard search path, then also use the `--with-lapack-lflags` flag to explictly state what flags are necessary to use MKL, e.g., \verbatim ./configure --with-lapack-lflags="-L${MKLROOT}/lib/intel64 -Wl,--no-as-needed -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lm" \endverbatim Linking against static MKL libraries can be [difficult](https://github.com/coin-or/Ipopt/discussions/694#discussioncomment-6965380) due to circular dependencies between libraries and libtool reordering the linker flags. A possible workaround is to set all linker flags via a single compiler flag, e.g., \verbatim ./configure --with-lapack-lflags="-Wl,--no-as-needed -Wl,--start-group,${MKLROOT}/lib/intel64/libmkl_intel_lp64.a,${MKLROOT}/lib/intel64/libmkl_gnu_thread.a,${MKLROOT}/lib/intel64/libmkl_core.a,--end-group -lgomp -lpthread -lm -ldl" \endverbatim \subsection DOWNLOAD_HSL HSL (Harwell Subroutines Library) There are two versions of HSL source code for use in %Ipopt available: - Coin-HSL Archive: contains outdated codes that are freely available for personal commercial or non-commercial usage. Note that you may not redistribute these codes in either source or binary form without purchasing a licence from the authors. This version includes MA27, MA28, and MC19. - Coin-HSL Full: contains more modern codes that are freely available for academic use only. This version includes the codes from the Coin-HSL Archive and additionally MA57, HSL_MA77, HSL_MA86, and HSL_MA97. %Ipopt supports the HSL Full codes from 2013 and later. To obtain the HSL code, you can follow the following steps: 1. Go to . 2. Choose whether to download either the Coin-HSL Archive code or the Coin-HSL Full code. To download, select the relevant "source" link. 3. Follow the instructions on the website, read the license, and submit the registration form. 4. Wait for an email containing a download link (this should take no more than one working day). You may either: - Compile the HSL code via the COIN-OR Tools project [ThirdParty-HSL](https://github.com/coin-or-tools/ThirdParty-HSL). See the instructions [there](https://github.com/coin-or-tools/ThirdParty-HSL#installation-steps). - Compile the HSL code separately either before or after the %Ipopt code and use the shared library loading mechanism. See the documentation distributed with the HSL package for information on how to do so. \attention The build system of %Ipopt currently requires that MA27 is part of a HSL library, if a HSL library is provided. Next to the HSL source packages, also **prebuild libraries** of HSL for macOS and Windows are available in the libHSL package from https://licences.stfc.ac.uk/products/Software/HSL/LibHSL and the Coin-HSL package from https://licences.stfc.ac.uk/products/Software/HSL/coinhsl. Both can be used by %Ipopt when using the shared library loading mechanism described \ref LINEARSOLVERLOADER "below". \note Whereas it is essential to have at least one linear solver, the package MC19 could be omitted (with the consequence that you cannot use this method for scaling the linear systems arising inside the %Ipopt algorithm). By default, MC19 is only used to scale the linear system when using one of the HSL solvers, but it can also be switched on for other linear solvers (which usually have internal scaling mechanisms). Further, also the package MA28 can be omitted, since it is used only in the experimental dependency detector, which is not used by default. \note If you are an academic or a student, we recommend you download the HSL Full package as this ensures you have access to the full range of solvers. MA57 can be considerably faster than MA27 on some problems. \note If you have a precompiled library containing the HSL codes, you can specify the directory containing the `CoinHslConfig.h` header file and the linker flags for this library with the flags `--with-hsl-cflags` and `--with-hsl-lflags` flags, respectively, when running `configure` of %Ipopt (see \ref COMPILEINSTALL). The libHSL libs can not be used with `--with-hsl-lflags`, as they do not contain the necessary header files. \note The linear solvers MA57, HSL_MA77, HSL_MA86, HSL_MA97 can make use of the matrix ordering algorithms implemented in [METIS](http://glaros.dtc.umn.edu/gkhome/metis/metis/overview). ThirdParty-HSL will look automatically for a METIS installation in your system and should work with both METIS 4 and METIS 5. \subsubsection LINEARSOLVERLOADER Providing a HSL library at runtime Alternatively to linking against HSL routines when %Ipopt is build, %Ipopt can also load a shared library with MA27, MA57, HSL_MA77, HSL_MA86, HSL_MA97, or MC19 at runtime. This means, if you obtain one of those solvers after you compiled %Ipopt, you don't need to recompile Ipopt to use it. Instead, you can just place a shared library onto your system and ensure that %Ipopt can find it at runtime. Option \ref OPT_hsllib "hsllib" can be set to the name of the library from which to load HSL routines if a HSL solver is selected. The name can contain a path; otherwise, the shared library search path (e.g., `LD_LIBRARY_PATH`) will be used. Prebuild HSL libraries are available from https://licences.stfc.ac.uk/products/Software/HSL/LibHSL (see also above). \subsection DOWNLOAD_MUMPS MUMPS Linear Solver You can also use the (public domain) sparse linear solver MUMPS. Please visit the [MUMPS home page](http://mumps.enseeiht.fr/) for more information about the solver. MUMPS is provided as Fortran 90 and C source code. You need to have a Fortran 90 compiler (e.g., the GNU compiler gfortran) to be able to use it. The COIN-OR Tools project [ThirdParty-Mumps](https://github.com/coin-or-tools/ThirdParty-Mumps) can be used to download the MUMPS code and build a MUMPS library that is recognized by %Ipopt. To do so, execute git clone https://github.com/coin-or-tools/ThirdParty-Mumps.git cd ThirdParty-Mumps ./get.Mumps ./configure make sudo make install \note MUMPS will perform better if the matrix ordering algorithms implemented in [METIS](http://glaros.dtc.umn.edu/gkhome/metis/metis/overview) are available on the system. \note The non-MPI version of MUMPS uses internally a fake implementation of MPI, which can prevent using %Ipopt together with MUMPS within an MPI program. You will have to either modify the MUMPS sources so that the MPI symbols inside the MUMPS code are renamed or use a MPI-parallel version of MUMPS. In the latter case and if a GCC compatible compiler is used, the %Ipopt library will call `MPI_Init()` and `MPI_Finalize()` when loaded and unloaded, respectively. To prevent this, use the configure flag `--disable-mpiinit`. Note that the %Ipopt executable, tests, and examples will not work in this case (if using MUMPS as linear solver). \note Branch `stable/2.1` of project ThirdParty-Mumps can be used to build a library of MUMPS 4 that is usable with %Ipopt. Initial experiments on the CUTEst testset have shown that performance with MUMPS 5.2.x is worse than with MUMPS 4.10.0 on average, but note that MUMPS 4 is not longer maintained. To compile %Ipopt with a precompiled MUMPS library, you need to specify the `-I` flag to have the compiler find the directory containing the MUMPS header files with the `--with-mumps-cflags` flag of %Ipopt's configure, e.g., \verbatim --with-mumps-cflags="-I$HOME/MUMPS/include" \endverbatim and you also need to provide the linker flags for MUMPS with the `--with-mumps-lflags` flag. A precompiled MUMPS library is sometimes also provided by a distributions package manager. For example, on a Debian system, one may install package [libmumps-seq-dev](https://packages.debian.org/bullseye/libmumps-seq-dev) and use the configure flags `--with-mumps-cflags=-I/usr/include/mumps_seq --with-mumps-lflags=-ldmumps_seq`. \subsection DOWNLOAD_PARDISO Pardiso (Parallel Sparse Direct Linear Solver) from Pardiso Project If you would like to use %Ipopt with Pardiso from Pardiso Project, you need to obtain the Pardiso library from for your operating system. From , you can obtain a limited time license of Pardiso for academic or evaluation purposes or buy a non-profit or commercial license. Make sure you read the license agreement before filling out the download form. To avoid conflicts with \ref DOWNLOAD_PARDISOMKL, %Ipopt only offers the option to load Pardiso from Pardiso Project at runtime. Therefore, the %Ipopt interface to Pardiso from Pardiso Project is always build and the value of option \ref OPT_pardisolib "pardisolib" is used as name (possibly including a path) for the library to be loaded. The configure option `--with-pardiso` can be used to specify the default value for option `pardisolib`. Further, if `--with-pardiso` is specified and HSL codes are not available at compile time, then the default of option \ref OPT_linear_solver "linear_solver" is set to `pardiso`. For example, if you want that %Ipopt loads the GCC version of Pardiso on a GNU/Linux system and this library is located in `$HOME/lib`, you should add the flag \verbatim --with-pardiso="$HOME/lib/libpardiso720-GNU831-X86-64.so" \endverbatim \attention With %Ipopt <= 3.13, Pardiso from Pardiso Project was linked when %Ipopt was build and option `--with-pardiso` used to specify the corresponding linker flags. This has been changed with %Ipopt 3.14! If you are using the parallel version of Pardiso, you need to specify the number of processors it should run on with the environment variable `OMP_NUM_THREADS`, as described in the Pardiso manual. \subsection DOWNLOAD_PARDISOMKL Pardiso from Intel MKL If you want to compile %Ipopt with the Pardiso library that is included in Intel MKL, it is sufficient to ensure that MKL is used for the linear algebra routines (Blas/Lapack), see \ref EXTERNALCODE_LINALG. If configure finds that Pardiso is available with Lapack, option \ref OPT_linear_solver "linear_solver" can be set to `pardisomkl` to use Pardiso from Intel MKL. Specifying `--disable-pardisomkl` as option for configure disables the check for Pardiso from Intel MKL. \attention With %Ipopt <= 3.13, Pardiso from Intel MKL could be selected by setting \ref OPT_linear_solver "linear_solver" to `pardiso`. With %Ipopt 3.14, value `pardiso` is reserved for Pardiso from Pardiso Project and value `pardisomkl` has to be used to select Pardiso from Intel MKL. \subsection DOWNLOAD_SPRAL SPRAL (Sparse Parallel Robust Algorithms Library) To compile %Ipopt with the linear solver SPRAL, [SPRAL](https://github.com/ralna/spral) should first be downloaded and compiled according to the associated [SPRAL compilation guide](https://github.com/ralna/spral/blob/master/COMPILE.md). After compilation of SPRAL, while configuring %Ipopt, you need to specify the link and include directories for the library with the `--with-spral-lflags` and `--with-spral-cflags` flags, including required additional libraries and flags. For example, if you want to compile %Ipopt with a purely CPU-parallel version of SPRAL (libs in `/path/to/spral/lib` and headers in `/path/to/spral/include`) on a GNU/Linux system, you should add the following flags to the `configure` command: \verbatim --with-spral-lflags="-L/path/to/spral/lib -lspral -lgfortran -lhwloc -lm -lcoinmetis -lopenblas -lstdc++ -fopenmp" --with-spral-cflags="-I/path/to/spral/include" \endverbatim For a CPU and graphics processing unit- (GPU-) parallel version of SPRAL, the following flags should be used, instead: \verbatim --with-spral-lflags="-L/path/to/spral/lib -lspral -lgfortran -lhwloc -lm -lcoinmetis -lopenblas -lstdc++ -fopenmp -lcudadevrt -lcudart -lcuda -lcublas" --with-spral-cflags="-I/path/to/spral/include" \endverbatim The above assumes a SPRAL compilation using OpenBLAS libraries. For best performance, use SPRAL together with linear algebra routines from the Intel MKL (see \ref EXTERNALCODE_LINALG). \attention Finally, ensure the following environment variables are employed when using SPRAL: \verbatim export OMP_CANCELLATION=TRUE export OMP_PROC_BIND=TRUE export OMP_NESTED=TRUE # not necessary with Spral >= 2023.08.02 \endverbatim A guide for building %Ipopt with Spral on Ubuntu Linux is also avaiable [here](https://gist.github.com/tasseff/ee61ef6c15d3c54e0a6b3e488f2a65be) (some GitHub URLs need to be adjusted to use coin-or/Ipopt instead of lanl-ansi/Ipopt). More information on the Spral interface of %Ipopt can be found in \cite Tasseff2019. \subsection DOWNLOAD_WSMP WSMP (Watson Sparse Matrix Package) If you would like to compile %Ipopt with WSMP, you need to obtain the WSMP library for your operating system. Information about WSMP can be found at . At this website you can download the library for several operating systems including a trial license key for 90 days that allows you to use WSMP for "educational, research, and benchmarking purposes by non-profit academic institutions" or evaluation purposes by commercial organizations; make sure you read the license agreement before using the library. Once you obtained the library and license, please check if the version number of the library matches the one on the WSMP website. \note The license included in package of the libraries may not work and a working one may need to be downloaded separately. Look out for messages about an invalid WSMP license when testing the Ipopt build. If a newer version is announced on that website, you can (and probably should) request the current version by sending a message to `wsmp@us.ibm.com`. Please include the operating system and other details to describe which particular version of WSMP you need. \note Only the interface to the shared-memory version of WSMP is currently supported. To compile %Ipopt with the linear solver WSMP, you need to specify the linker flags for the library with the `--with-wsmp` flag, including required additional libraries and flags. For example, if you want to compile %Ipopt with WSMP (located in `$HOME/lib`) on an Intel IA32 Linux system, you may use the `configure` flag \verbatim --with-wsmp="$HOME/lib/wsmp/wsmp-Linux/lib/IA32/libwsmp.a -lpthread -lblas -llapack -lpthread -lm -lgfortran" \endverbatim But the actual flags depend on WSMP library and your preference for the Blas/Lapack libraries. \section GETIPOPT Getting the Ipopt Code %Ipopt is available from the COIN-OR group at GitHub. You can either download the code using `git` or simply retrieve a tarball (compressed archive file). While the tarball is an easy method to retrieve the code, using the *git* system allows users the benefits of the version control system, including easy updates and revision control. \subsection GETIPOPT_GIT Getting the Ipopt code via git Of course, the *git* client must be installed on your system if you want to obtain the code this way (the executable is called `git`). Information about *git* and how to download it can be found at . To obtain the %Ipopt source code via git, change into the directory in which you want to create a subdirectory `%Ipopt` with the %Ipopt source code. Then follow the steps below: 1. Download the code from the repository: \verbatim git clone https://github.com/coin-or/Ipopt.git \endverbatim 2. Change into the root directory of the %Ipopt distribution: \verbatim cd Ipopt \endverbatim In the following, `$IPOPTDIR` will refer to the directory in which you are right now (output of `pwd`). \subsection GETIPOPT_TAR Getting the Ipopt code as a tarball To use the tarball, follow the steps below: 1. Download the desired tarball from , it has the form `Ipopt-x.y.z.tgz`, where `x.y.z` is the version number, such as 3.12.0. 2. Issue the following commands to unpack the archive file: \verbatim gunzip Ipopt-x.y.z.tgz tar xvf Ipopt-x.y.z.tar \endverbatim 3. Rename the directory you just extracted: \verbatim mv Ipopt-x.y.z Ipopt \endverbatim 4. Change into the root directory of the %Ipopt distribution: \verbatim cd Ipopt \endverbatim In the following, `$IPOPTDIR` will refer to the directory in which you are right now (output of `pwd`). \section COMPILEINSTALL Compiling and Installing Ipopt %Ipopt can be easily compiled and installed with the usual configure, make, make install commands. We follow the procedure that is used for most of the COIN-OR projects, based on the GNU autotools. Below are the basic steps for the %Ipopt compilation that should work on most systems. For special compilations and for some troubleshooting see \ref CONFIGURE_FLAGS before creating an issue or sending a message to the mailing list. 1. Create a directory where you want to compile %Ipopt, for example \verbatim mkdir $IPOPTDIR/build \endverbatim and change into this directory \verbatim cd $IPOPTDIR/build \endverbatim \note You can choose any location, including $IPOPTDIR itself, as the location of your compilation. However, on COIN-OR we recommend to keep the source and compiled files separate as this comes in handy when you want to compile the code with different compilers, compiler options, or different operating system that share a common file system. For this to work, the directories with the %Ipopt source must not have any configuration and compiled code. 2. Run the configure script: \verbatim $IPOPTDIR/configure \endverbatim One might have to give options to the configure script, e.g., in order to choose a non-default compiler, or to tell it where to install %Ipopt eventually, see \ref CONFIGURE_FLAGS. If the last output line reads `configure: Main configuration of %Ipopt successful` then everything worked fine. Otherwise, look at the screen output, have a look at the `config.log` output file and/or consult \ref CONFIGURE_FLAGS. The default configure (without any options) is sufficient for most users that downloaded and installed the source code for the linear solver and other dependencies. If you want to see the configure options, consult \ref CONFIGURE_FLAGS. 3. Build the code: \verbatim make \endverbatim Note: If you are using GNU make, you can also try to speed up the compilation by using the `-jN` flag (e.g., `make -j3`), where `N` is the number of parallel compilation jobs. A good number for `N` is the number of available processors plus one. Under some circumstances, this fails, and you might have to re-issue the command, or omit the `-j` flag. 4. If you want, you can run a short test to verify that the compilation was successful. For this, you just enter \verbatim make test \endverbatim This will test if the AMPL solver executable works (if you got the ASL code) and if the included C++, C, Java, and Fortran examples work. \note The configure script is not able to automatically determine the C++ runtime libraries for the C++ compiler. For certain compilers we enabled default values for this, but those might not exist or be wrong for your compiler. In that case, the C and Fortran example in the test will most probably fail to compile. If you don't want to hook up the compiled %Ipopt library to some Fortran or C code that you wrote you don't need to worry about this. If you do want to link the %Ipopt library with a C or Fortran compiler, you need to find out the C++ runtime libraries (e.g., by running the C++ compiler in verbose mode for a simple example program) and run `configure` again, and this time specify all C++ runtime libraries with the `CXXLIBS` variable (see also \ref CONFIGURE_FLAGS). 5. Install %Ipopt: \verbatim sudo make install \endverbatim `sudo` has been added here as `make install` installs files into `/usr/local`, where only system administrators have write permissions. This installs - the %Ipopt and `sIpopt` AMPL solver executables (if ASL source was downloaded) in `/usr/local/bin`, - the %Ipopt and `sIpopt` libraries (`libipopt.so`, `libipopt.a` or similar) in `/usr/local/lib`, - pkg-config files for use of the %Ipopt and `sIpopt` libraries (`ipopt.pc`, `sipopt.pc`) in `/usr/local/lib/pkgconfig`. - %Ipopt and `sIpopt` header files `/usr/local/include/coin-or`, - the \ref INTERFACE_JAVA "Java Interface" jar file in `/usr/local/share/java`. You can change the default installation directory (here `/usr/local`) by using the `--prefix` switch for `configure`. If this is a directory that you have write permissions for, `sudo` can be omitted for `make install`. \subsection CONFIGURE_FLAGS Flags to configure In general, you can see the list of options and variables that can be set for the configure script by typing `configure --help`. Below a few particular options are discussed: - If you want to specify that you want to use particular compilers, you can do so by adding the variables definitions for CXX, CC, and F77 to the `./configure` command line, to specify the C++, C, and Fortran 77 compiler, respectively. For example, \verbatim ./configure CXX=g++-8.0.0 CC=gcc-8.0.0 F77=gfortran-8.0.0 \endverbatim In order to set the compiler flags, you should use the variables `CXXFLAGS`, `CFLAGS`, `FFLAGS`. Note, that the %Ipopt code uses `dynamic_cast`. Therefore it is necessary that the C++ code is compiled including RTTI (Run-Time Type Information). Some compilers need to be given special flags to do that (e.g., `-qrtti=dyna` for the AIX `xlC` compiler). - By default, the %Ipopt library is compiled as a shared library, on systems where this is supported. If you want to generate a static library, you need to specify the `--disable-shared` flag. If you want to compile both shared and static libraries, you should specify the `--enable-static` flag. This is no possible on Windows. - It is possible to compile the %Ipopt library in a debug configuration, by specifying `--enable-debug`. This switches the default compiler flags (CFLAGS, CXXFLAGS, FFLAGS) to instruct the compiler to include debug information into object files and disables compiler optimization. Also, you can tell %Ipopt to do some additional runtime sanity checks, by specifying the flag `--with-ipopt-checklevel`. This usually leads to a significant slowdown of the code, but might be helpful when debugging something. The checklevel value has the following effect: - ≥ 1 : enables asserts (DBG_ASSERT) and debug statements (DBG_DO) - ≥ 2 : floating-point exceptions divbyzero, overflow, and invalid are signaled (SIGFPE) while %Ipopt is solving (requires GLIBC) - ≥ 3 : checks in Ipopts caching and observer mechanisms are enabled - ≥ 4 : checks in Ipopts SmartPtr implementation are enabled - If you want to link the %Ipopt library with a main program written in C or Fortran, the C and Fortran compiler doing the linking of the executable needs to be told about the C++ runtime libraries. Unfortunately, the build system does not provide a functionality for automatic detection of those libraries. We have hard-coded some default values for some systems and compilers, but this might not work all the time. If you have problems linking your Fortran or C code with the %Ipopt library `libipopt.a` and the linker complains about missing symbols from C++ (e.g., the standard template library), you should specify the C++ libraries with the `CXXLIBS` variable. To find out what those libraries are, it is probably helpful to link a simple C++ program with verbose compiler output. For example, for the Intel compilers on a Linux system, you might need to specify something like \verbatim ./configure CC=icc F77=ifort CXX=icpc CXXLIBS='-L/usr/lib/gcc-lib/i386-redhat-linux/3.2.3 -lstdc++' \endverbatim - Compilation on an AIX 64bit system sometimes requires some special consideration. We recommend the following configuration \verbatim ./configure AR='ar -X64' NM='nm -X64' CC='xlc -q64' F77='xlf -q64' CXX='xlC -q64' CFLAGS='-O3 -bmaxdata:0x3f0000000' FFLAGS='-O3 -bmaxdata:0x3f0000000' CXXFLAGS='-qrtti=dyna -O3 -bmaxdata:0x3f0000000' \endverbatim (Alternatively, a simpler solution for AIX is to set the environment variable `OBJECT_MODE` to 64.) - %Ipopt's Java interface `JIpopt` uses the Java Native Interface (JNI), which is a programming framework that allows Java code running in the Java Virtual Machine (JVM) to call and be called by native applications and libraries written in languages such as C and C++. configure tries to find a Java compiler and the necessary compiler flags to locate the JNI header files automatically. You can influence this automated check by setting the environment variable `JAVA_HOME` to the directory that contains your JDK. \note The build procedure currently cannot deal with spaces in the path to the JDK. If you are on Windows and have Java in a path like `C:\Program Files\Java`, try setting `JAVA_HOME` to the DOS equivalent `C:\Progra~1\Java` (or similar). You can disable the checks for Java and build of the Java interface by specifying the configure flag `--disable-java`. This is also the default if `JAVA_HOME` contains a space or the build of shared libraries has been disabled as `JIpopt` needs to be able to load the %Ipopt library dynamically at runtime. - %Ipopt can load HSL or Pardiso libraries at runtime. To disable this feature, specify `--disable-linear-solver-loader`. - \ref SIPOPT "sIpopt" is build and installed together with %Ipopt. If you do not need sIpopt, you can disable it via `--disable-sipopt`. Configure flags specific to the use of %Ipopt's dependencies were discussed in the corresponding sections of \ref EXTERNALCODE. \subsection CPP_FLAGS Additional Flags for Compiler Preprocessor A few flags that influence which %Ipopt code is compiled are not controlled by parameters for configure. We list some of these flags in the following. \note These are flags for expert users. Usually, there should be no need to define these. Further, we may change or remove these flags without advanced warning. - `IPOPT_THREAD_LOCAL`: Keyword to be used to declare a thread-local variable. - `IPOPT_DEPRECATED`: Keyword to be used to mark a function as deprecated. - `FUNNY_MA57_FINT`: If defined, then assume that `ptrdiff_t` corresponds to the integer type used by HSL MA57, e.g., 64-bit integers on 64-bit systems. This flag was useful when using MA57 from libraries that come with Matlab. - `MA97_DUMP_MATRIX`: If defined, then option `ma97_dump_matrix` is available. This requires linking against a HSL library (not loading at runtime) that includes function `dump_mat_csc`. - `MUMPS_DUMP_MATRIX`: If defined, then matrices are written to stdout in the MUMPS interface. - `IPOPT_MUMPS_NOMUTEX`: If defined, concurrent calls of %Ipopt into MUMPS from different threads are not prevented by a mutex. \section COINBREW Using CoinBrew On sufficiently prepared systems, an alternative way to download, build, and install %Ipopt with dependencies ASL, HSL, and MUMPS is to use the coinbrew script from https://coin-or.github.io/coinbrew/ After obtaining the script, run /path/to/coinbrew fetch Ipopt --no-prompt /path/to/coinbrew build Ipopt --prefix=/dir/to/install --test --no-prompt --verbosity=3 /path/to/coinbrew install Ipopt --no-prompt The coinbrew script will take care of building and installing the dependencies ASL and MUMPS before building %Ipopt. To use HSL sources, change to the `ThirdParty/HSL` directory created by `coinbrew fetch` and follow the download instructions (i.e., skip the build step) from \ref DOWNLOAD_HSL. Then proceed with the `coinbrew build` step. More details on using coinbrew can be found at the instructions on [Getting Started with the COIN-OR Optimization Suite](https://coin-or.github.io/user_introduction). \section INSTALL_R Compiling and Installing the R Interface ipoptr The `ipoptr` interface can be build after %Ipopt has been build and installed. In the best case, it is sufficient to execute the following command in R: \verbatim install.packages('$IPOPTDIR/build/contrib/RInterface', repos=NULL, type='source') \endverbatim After installation of the `ipoptr` package, it should be possible to load the package in R and to view the help page: \verbatim library('ipoptr') ?ipoptr \endverbatim \section SINGLEPRECISION_BUILD Building for single-precision floating-point arithmetic %Ipopt by default uses double-precision floating point arithmetic. Using the configure flag `--with-precision=float`, it is possible to build a variant of %Ipopt that uses single-precision floating point arithmetic. It is not possible to build for both single- and double-precision simultaneously. In the single-precision configuration, the types Ipopt::Number and \ref ipnumber are defined to be `float` and the C preprocessor variable `IPOPT_SINGLE` is defined in `IpoptConfig.h`. If the %Ipopt code is compiled for single-precision, then also third-party codes that interface with or are interfaced by %Ipopt need to support this floating point format. Regarding included code that interfaces to %Ipopt, the situation is as follows: - \ref INTERFACE_CPP supports single-precision arithmetic by having Ipopt::Number defined as `float`. - \ref INTERFACE_C supports single-precision arithmetic by having \ref ipnumber defined as `float`. - \ref INTERFACE_FORTRAN supports single-precision arithmetic by using `real` instead of `double precision`. A single-precision variant of the HS071 example is available in `examples/hs071_f/hs071_fs.f`. - \ref INTERFACE_JAVA supports single-precision arithmetic by using `float` instead of `double` for real numbers. A single-precision variant of the HS071 example is available in `examples/hs071_java/HS071s.java`. Note, that for the single-precision version of class `org.coinor.Ipopt`, all mention of `double` are replaced by `float` before compilation. - \ref INTERFACE_AMPL "The AMPL interface" is not available when building for single-precision. - \ref INTERFACE_R seems to work. - Fortran and Java examples (other than HS071) and tutorials are not available for single-precision. - \ref SIPOPT "sIpopt" is build in single-precision if %Ipopt is build in single-precision. Regarding dependencies of %Ipopt, the situation is as follows: - A single-precision variant of Blas and Lapack is required. Many implementations of Blas and Lapack include a single-precision variant. \attention macOS vecLib single-precision routines do not work as expected by gfortran. However, configure would still select the Accelerate framework by default and %Ipopt will try to run with faulty numbers. You may want to try switch to Lapack from HomeBrew instead (`--with-lapack-lflags="-L/usr/local/opt/lapack/lib -llapack -lblas"`) or try out [this vecLib wrapper](https://github.com/mcg1969/vecLibFort). - The interface to MUMPS can use a single-precision version of MUMPS. See the [ThirdParty-Mumps docu](https://github.com/coin-or-tools/ThirdParty-Mumps/#single-precision-codes) for details. - The interfaces to the HSL routines can use single-precision versions of these routines. A current [ThirdParty-HSL](https://github.com/coin-or-tools/ThirdParty-HSL) can compile these when using a [Coin-HSL](http://hsl.rl.ac.uk/ipopt) 2021.05.05 package. - The interface for Pardiso (both MKL and from pardiso-project.org) is available. The Pardiso library contains a single-precision version of its solver. - The interface to WSMP is not available. - The interface to SPRAL is not available. When building %Ipopt for single-precision arithmetic, the default for option \ref OPT_tol "tol" is changed to 1e-5. \section INT64_BUILD Building for 64-bit integers %Ipopt by default defines its types Ipopt::Index (C++) and \ref ipindex (C) to be `int`, which on many systems has a size of 32-bit. This limits the size of problems to be solved to 2^31 variables, constraints, nonzero elements in matrices, etc. Using the configure flag `--with-intsize=64`, it is possible to build a variant of %Ipopt that defines `Ipopt::Index`/\ref ipindex to be `int64_t`, i.e., an integer of size 64 bit. Further, the C preprocessor variable `IPOPT_INT64` is defined in `IpoptConfig.h`. Note that using 64-bit integers increases the memory usage of %Ipopt significantly since type Ipopt::Index is used for almost all integers in %Ipopt. It is not possible to build for both 32- and 64-bit integers simultaneously. If the %Ipopt code is compiled for 64-bit integers, then also third-party codes that interface with or are interfaced by %Ipopt may need to support this integer size. Regarding included code that interfaces to %Ipopt, the situation is as follows: - \ref INTERFACE_CPP supports 64-bit integers by having Ipopt::Index defined as `int64_t`. - \ref INTERFACE_C supports 64-bit integers by having \ref ipindex defined as `int64_t`. - \ref INTERFACE_FORTRAN supports 64-bit integers by using an 8-byte kind for `INTEGER`. - \ref INTERFACE_JAVA does not support 64-bit integers because Java arrays can only be indexed by 32-bit integers. However, the Java interface can be used with 32-bit integers and an %Ipopt library that is build for 64-bit integers. - \ref INTERFACE_AMPL "The AMPL interface" allows for problem instances with more than 2^31 nonzeros in Jacobian or Hessian. This requires that ASL has been build with `ASL_big_goff` defined (this define also need to be present in the ASL header files that the %Ipopt build includes). If using `ThirdParty-ASL`, then this achieved by selecting configure option `--with-intsize=64`, see also the [ThirdParty-ASL docu](https://github.com/coin-or-tools/ThirdParty-ASL#jacobians-with-for-more-than-231-nonzeros). Note that problems instances are still limited to at most 2^31 variables and constraints - this is a limitation of AMPL or ASL. - \ref INTERFACE_R does not support 64-bit integers because R only supports 32-bit integers. However, the R interface can still be used with an %Ipopt library that is build for 64-bit integers. - \ref SIPOPT "sIpopt" supports 64-bit integers. Regarding dependencies of %Ipopt, the situation is as follows: - A variant of Blas and Lapack that uses 64-bit integers is required. If `--with-intsize=64` is seletected, then the check in configure by default only looks for Intel MKL and tries `-llapack64 -lblas64`, see also the [BuildTools docu](https://coin-or-tools.github.io/BuildTools/configure#check-for-lapack-with-64-bit-integers). - The interface to MUMPS can use a version of MUMPS that has been compiled for 64-bit integers. See the [ThirdParty-Mumps docu](https://github.com/coin-or-tools/ThirdParty-Mumps/#64-bit-integers) for details. - The interfaces to the HSL routines are not available. - The interface for Pardiso from pardiso-project.org is not available. - The interface for Pardiso from Intel MKL is available if the ILP64 variant of Intel MKL is used for Blas/Lapack. - The interface to WSMP is not available. - The interface to SPRAL is not available. */ coinor-ipopt-3.14.17/doc/interfaces.dox000066400000000000000000001365611473776672200177560ustar00rootroot00000000000000/** \page INTERFACES Interfacing your NLP to %Ipopt \tableofcontents %Ipopt has been designed to be flexible for a wide variety of applications, and there are a number of ways to interface with %Ipopt that allow specific data structures and linear solver techniques. Nevertheless, the authors have included a standard representation that should meet the needs of most users. This tutorial will discuss six interfaces to %Ipopt, namely the AMPL modeling language \cite FouGayKer:AMPLbook interface, and the C++, C, Fortran, Java, and R code interfaces. AMPL is a modeling language tool that allows users to write their optimization problem in a syntax that resembles the way the problem would be written mathematically. Once the problem has been formulated in AMPL, the problem can be easily solved using the (already compiled) %Ipopt AMPL solver executable, ipopt. Interfacing your problem by directly linking code requires more effort to write, but can be far more efficient for large problems. We will illustrate how to use each of the four interfaces using an example problem, number 71 from the Hock-Schittkowsky test suite \cite HS, \f{equation}{ \begin{aligned} \min_{x \in \Re^4} &&x_1 x_4 (x_1 + x_2 + x_3) + x_3 \\ \mbox{s.t.} &&x_1 x_2 x_3 x_4 \ge 25 \\ &&x_1^2 + x_2^2 + x_3^2 + x_4^2 = 40 \\ &&1 \leq x_1, x_2, x_3, x_4 \leq 5, \end{aligned} \tag{HS071} \f} with the starting point \f[ x_0 = (1, 5, 5, 1) \f] and the optimal solution \f[ x_* = (1.00000000, 4.74299963, 3.82114998, 1.37940829). \f] You can find further, less documented examples for using %Ipopt from your own source code in the Ipopt/examples subdirectory. \section INTERFACE_AMPL Using Ipopt through AMPL Using the AMPL solver executable is by far the easiest way to solve a problem with %Ipopt. The user must simply formulate the problem in AMPL syntax, and solve the problem through the AMPL environment. There are drawbacks, however. AMPL is a 3rd party package and, as such, must be appropriately licensed (a free student version for limited problem size is available from the [AMPL website](http://www.ampl.com). Furthermore, the AMPL environment may be prohibitive for very large problems. Nevertheless, formulating the problem in AMPL is straightforward and even for large problems, it is often used as a prototyping tool before using one of the code interfaces. This tutorial is not intended as a guide to formulating models in AMPL. If you are not already familiar with AMPL, please consult \cite FouGayKer:AMPLbook. The problem presented in (HS071) can be solved with %Ipopt with the following AMPL model. # tell ampl to use the ipopt executable as a solver # make sure ipopt is in the path! option solver ipopt; # declare the variables and their bounds, # set notation could be used, but this is straightforward var x1 >= 1, <= 5; var x2 >= 1, <= 5; var x3 >= 1, <= 5; var x4 >= 1, <= 5; # specify the objective function minimize obj: x1 * x4 * (x1 + x2 + x3) + x3; # specify the constraints s.t. inequality: x1 * x2 * x3 * x4 >= 25; equality: x1^2 + x2^2 + x3^2 +x4^2 = 40; # specify the starting point let x1 := 1; let x2 := 5; let x3 := 5; let x4 := 1; # solve the problem solve; # print the solution display x1; display x2; display x3; display x4; The line, `option solver ipopt;` tells AMPL to use %Ipopt as the solver. The %Ipopt executable (installed in \ref COMPILEINSTALL) must be in the `PATH` for AMPL to find it. The remaining lines specify the problem in AMPL format. The problem can now be solved by starting AMPL and loading the mod file: $ ampl > model hs071_ampl.mod; . . . The problem will be solved using %Ipopt and the solution will be displayed. At this point, AMPL users may wish to skip the sections about interfacing with code, but should read \ref OPTIONS and \ref OUTPUT. \subsection INTERFACE_AMPL_CL Using Ipopt from the command line It is possible to solve AMPL problems with %Ipopt directly from the command line. However, this requires a file in format `.nl` produced by ampl. If you have a model and data loaded in Ampl, you can create the corresponding `.nl` file with name, say, `myprob.nl` by using the Ampl command: write gmyprob There is a small `.nl` file available in the %Ipopt distribution. It is located at `Ipopt/test/mytoy.nl`. We use this file in the remainder of this section. We assume that the file `mytoy.nl` is in the current directory and that the command `ipopt` is a shortcut for running the %Ipopt binary available in the `bin` directory of the installation of %Ipopt. We list below commands to perform basic tasks from the Linux prompt. - To solve mytoy.nl from the Linux prompt, use: ipopt mytoy - To see all command line options for %Ipopt, use: ipopt -= - To see more detailed information on all options for %Ipopt: ipopt mytoy 'print_options_documentation yes' - To run ipopt, setting the maximum number of iterations to 2 and print level to 4: ipopt mytoy 'max_iter 2 print_level 4' If many options are to be set, they can be collected in a file `ipopt.opt` that is automatically read by %Ipopt, if present, in the current directory, see also \ref OPTIONS. \section INTERFACE_CODE Interfacing with Ipopt through code In order to solve a problem, %Ipopt needs more information than just the problem definition (for example, the derivative information). If you are using a modeling language like AMPL, the extra information is provided by the modeling tool and the %Ipopt interface. When interfacing with %Ipopt through your own code, however, you must provide this additional information. The following information is required by %Ipopt: 1. Problem dimensions - number of variables - number of constraints 2. Problem bounds - variable bounds - constraint bounds 3. Initial starting point - Initial values for the primal \f$x\f$ variables - Initial values for the multipliers (only required for a warm start option) 4. Problem Structure - number of nonzeros in the Jacobian of the constraints - number of nonzeros in the Hessian of the Lagrangian function - sparsity structure of the Jacobian of the constraints - sparsity structure of the Hessian of the Lagrangian function 5. Evaluation of Problem Functions
Information evaluated using a given point (\f$x\f$, \f$\lambda\f$, \f$\sigma_f\f$ coming from %Ipopt) - Objective function, \f$f(x)\f$ - Gradient of the objective, \f$\nabla f(x)\f$ - Constraint function values, \f$g(x)\f$ - Jacobian of the constraints, \f$\nabla g(x)^T\f$ - Hessian of the Lagrangian function, \f$\sigma_f \nabla^2 f(x) + \sum_{i=1}^m\lambda_i\nabla^2 g_i(x)\f$
(this is not required if a quasi-Newton options is chosen to approximate the second derivatives) The problem dimensions and bounds are straightforward and come solely from the problem definition. The initial starting point is used by the algorithm when it begins iterating to solve the problem. If %Ipopt has difficulty converging, or if it converges to a locally infeasible point, adjusting the starting point may help. Depending on the starting point, %Ipopt may also converge to different local solutions. Providing the sparsity structure of derivative matrices is a bit more involved. %Ipopt is a nonlinear programming solver that is designed for solving large-scale, sparse problems. While %Ipopt can be customized for a variety of matrix formats, the triplet format is used for the standard interfaces in this tutorial. For an overview of the triplet format for sparse matrices, see \ref TRIPLET. Before solving the problem, %Ipopt needs to know the number of nonzero elements and the sparsity structure (row and column indices of each of the nonzero entries) of the constraint Jacobian and the Lagrangian function Hessian. Once defined, this nonzero structure MUST remain constant for the entire optimization procedure. This means that the structure needs to include entries for any element that could ever be nonzero, not only those that are nonzero at the starting point. As %Ipopt iterates, it will need the values for problem functions evaluated at particular points. Before we can begin coding the interface, however, we need to work out the details of these equations symbolically for example problem (HS071). The gradient of the objective \f$f(x)\f$ is given by \f[\left[ \begin{array}{c} x_1 x_4 + x_4 (x_1 + x_2 + x_3) \\ x_1 x_4 \\ x_1 x_4 + 1 \\ x_1 (x_1 + x_2 + x_3) \end{array} \right]\f] and the Jacobian of the constraints \f$g(x)\f$ is \f[\left[ \begin{array}{cccc} x_2 x_3 x_4 & x_1 x_3 x_4 & x_1 x_2 x_4 & x_1 x_2 x_3 \\ 2 x_1 & 2 x_2 & 2 x_3 & 2 x_4 \end{array} \right]. \f] We also need to determine the Hessian of the Lagrangian. (If a quasi-Newton option is chosen to approximate the second derivatives, this is not required. However, if second derivatives can be computed, it is often worthwhile to let %Ipopt use them, since the algorithm is then usually more robust and converges faster. More on the quasi-Newton approximation in \ref QUASI_NEWTON.) The Lagrangian function for the NLP (HS071) is defined as \f$f(x) + g(x)^T \lambda\f$ and the Hessian of the Lagrangian function is, technically, \f$\nabla^2 f(x_k) + \sum_{i=1}^m\lambda_i\nabla^2 g_i(x_k)\f$. However, we introduce a factor (\f$\sigma_f\f$) in front of the objective term so that %Ipopt can ask for the Hessian of the objective or the constraints independently, if required. Thus, for %Ipopt the symbolic form of the Hessian of the Lagrangian is \f[ \sigma_f \nabla^2 f(x_k) + \sum_{i=1}^m\lambda_i\nabla^2 g_i(x_k) \f] and for the example problem this becomes \f[ \sigma_f \left[ \begin{array}{cccc} 2 x_4 & x_4 & x_4 & 2 x_1 + x_2 + x_3 \\ x_4 & 0 & 0 & x_1 \\ x_4 & 0 & 0 & x_1 \\ 2 x_1+x_2+x_3 & x_1 & x_1 & 0 \end{array} \right] + \lambda_1 \left[ \begin{array}{cccc} 0 & x_3 x_4 & x_2 x_4 & x_2 x_3 \\ x_3 x_4 & 0 & x_1 x_4 & x_1 x_3 \\ x_2 x_4 & x_1 x_4 & 0 & x_1 x_2 \\ x_2 x_3 & x_1 x_3 & x_1 x_2 & 0 \end{array} \right] + \lambda_2 \left[ \begin{array}{cccc} 2 & 0 & 0 & 0 \\ 0 & 2 & 0 & 0 \\ 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 2 \end{array} \right]\f] where the first term comes from the Hessian of the objective function, and the second and third term from the Hessian of the constraints. Therefore, the dual variables \f$\lambda_1\f$ and \f$\lambda_2\f$ are the multipliers for the constraints. The remaining sections of the tutorial will lead you through the coding required to solve example problem (HS071) using, first C++, then C, and finally Fortran. Completed versions of these examples can be found in `$IPOPTDIR/Ipopt/examples` under `hs071_cpp`, `hs071_c`, and `hs071_f`. As a user, you are responsible for coding two sections of the program that solves a problem using %Ipopt: the main executable (e.g., main) and the problem representation. Typically, you will write an executable that prepares the problem, and then passes control over to %Ipopt through an Optimize or Solve call. In this call, you will give %Ipopt everything that it requires to call back to your code whenever it needs functions evaluated (like the objective function, the Jacobian of the constraints, etc.). In each of the three sections that follow (C++, C, and Fortran), we will first discuss how to code the problem representation, and then how to code the executable. \subsection INTERFACE_CPP The C++ Interface This tutorial assumes that you are familiar with the C++ programming language, however, we will lead you through each step of the implementation. For the problem representation, we will create a class that inherits off of the pure virtual base class, Ipopt::TNLP. For the executable (the main function) we will make the call to %Ipopt through the Ipopt::IpoptApplication class. In addition, we will also be using the Ipopt::SmartPtr class which implements a reference counting pointer that takes care of memory management (object deletion) for you (for details, see \ref SMARTPTR). After `make install` (see \ref COMPILEINSTALL), the header files that define these classes are installed in `$PREFIX/include/coin-or`. \subsubsection INTERFACE_CPP_NLP Coding the Problem Representation We provide the required information by coding the HS071_NLP class, a specific implementation of the TNLP base class. In the executable, we will create an instance of the HS071_NLP class and give this class to %Ipopt so it can evaluate the problem functions through the Ipopt::TNLP interface. If you have any difficulty as the implementation proceeds, have a look at the completed example in the `Ipopt/examples/hs071_cpp` directory. Start by creating a new directory `MyExample` under examples and create the files hs071_nlp.hpp and hs071_nlp.cpp. In hs071_nlp.hpp, include IpTNLP.hpp (the base class), tell the compiler that we are using the namespace Ipopt, and create the declaration of the HS071_NLP class, inheriting off of TNLP. Have a look at the Ipopt::TNLP class; you will see eight pure virtual methods that we must implement. Declare these methods in the header file. Implement each of the methods in HS071_NLP.cpp using the descriptions given below. In hs071_nlp.cpp, first include the header file for your class and tell the compiler that you are using the namespace Ipopt. A full version of these files can be found in the `Ipopt/examples/hs071_cpp` directory. It is very easy to make mistakes in the implementation of the function evaluation methods, in particular regarding the derivatives. %Ipopt has a feature that can help you to debug the derivative code, using finite differences, see \ref DERIVCHECK. Note that the return value of any bool-valued function should be true, unless an error occurred, for example, because the value of a problem function could not be evaluated at the required point. \ref Ipopt::TNLP::get_nlp_info
\snippet IpTNLP.hpp TNLP_get_nlp_info \copydoc Ipopt::TNLP::get_nlp_info
Our example problem has 4 variables (n), and 2 constraints (m). The constraint Jacobian for this small problem is actually dense and has 8 nonzeros (we still need to represent this Jacobian using the sparse matrix triplet format). The Hessian of the Lagrangian has 10 "symmetric" nonzeros (i.e., nonzeros in the lower left triangular part.). Keep in mind that the number of nonzeros is the total number of elements that may *ever* be nonzero, not just those that are nonzero at the starting point. This information is set once for the entire problem. \snippet hs071_nlp.cpp TNLP_get_nlp_info \ref Ipopt::TNLP::get_bounds_info
\snippet IpTNLP.hpp TNLP_get_bounds_info \copydoc Ipopt::TNLP::get_bounds_info
In our example, the first constraint has a lower bound of 25 and no upper bound, so we set the lower bound of constraint to 25 and the upper bound to some number greater than 1019. The second constraint is an equality constraint and we set both bounds to 40. %Ipopt recognizes this as an equality constraint and does not treat it as two inequalities. \snippet hs071_nlp.cpp TNLP_get_bounds_info \ref Ipopt::TNLP::get_starting_point
\snippet IpTNLP.hpp TNLP_get_starting_point \copydoc Ipopt::TNLP::get_starting_point
In our example, we provide initial values for \f$x\f$ as specified in the example problem. We do not provide any initial values for the dual variables, but use an assert to immediately let us know if we are ever asked for them. \snippet hs071_nlp.cpp TNLP_get_starting_point \ref Ipopt::TNLP::eval_f
\snippet IpTNLP.hpp TNLP_eval_f \copydoc Ipopt::TNLP::eval_f
For our example, we ignore the `new_x` flag and calculate the objective. \snippet hs071_nlp.cpp TNLP_eval_f \ref Ipopt::TNLP::eval_grad_f
\snippet IpTNLP.hpp TNLP_eval_grad_f \copydoc Ipopt::TNLP::eval_grad_f
In our example, we ignore the new\_x flag and calculate the values for the gradient of the objective. \snippet hs071_nlp.cpp TNLP_eval_grad_f \ref Ipopt::TNLP::eval_g
\snippet IpTNLP.hpp TNLP_eval_g \copydoc Ipopt::TNLP::eval_g
In our example, we ignore the new_x flag and calculate the values of constraint functions. \snippet hs071_nlp.cpp TNLP_eval_g \ref Ipopt::TNLP::eval_jac_g
\snippet IpTNLP.hpp TNLP_eval_jac_g \copydoc Ipopt::TNLP::eval_jac_g
In our example, the Jacobian is actually dense, but we still specify it using the sparse format. \snippet hs071_nlp.cpp TNLP_eval_jac_g \ref Ipopt::TNLP::eval_h
\snippet IpTNLP.hpp TNLP_eval_h \copydoc Ipopt::TNLP::eval_h
In our example, the Hessian is dense, but we still specify it using the sparse matrix format. Because the Hessian is symmetric, we only need to specify the lower left corner. \snippet hs071_nlp.cpp TNLP_eval_h \ref Ipopt::TNLP::finalize_solution
This is the only method that is not mentioned in the beginning of this section. \snippet IpTNLP.hpp TNLP_finalize_solution \copydoc Ipopt::TNLP::finalize_solution
In our example, we will print the values of some of the variables to the screen. \snippet hs071_nlp.cpp TNLP_finalize_solution This is all that is required for our HS071_NLP class and the coding of the problem representation. \subsubsection INTERFACE_CPP_MAIN Coding the Executable Now that we have a problem representation, the HS071_NLP class, we need to code the main function that will call %Ipopt and ask %Ipopt to find a solution. Here, we must create an instance of our problem (HS071_NLP), create an instance of the %Ipopt solver (Ipopt::IpoptApplication), initialize it, and ask the solver to find a solution. We always use the Ipopt::SmartPtr template class instead of raw C++ pointers when creating and passing %Ipopt objects. To find out more information about smart pointers and the SmartPtr implementation used in %Ipopt, see \ref SMARTPTR. Create the file `MyExample.cpp` in the `MyExample` directory. Include the header files `HS071_NLP.hpp` and `IpIpoptApplication.hpp`, tell the compiler to use the Ipopt namespace, and implement the main function. \snippet hs071_main.cpp MAIN The first line of code in `main()` creates an instance of HS071_NLP. We then create an instance of the %Ipopt solver, Ipopt::IpoptApplication. You could use `new` to create a new application object, but if you want to make sure that your code would also work with a Windows DLL, you need to use the factory, as done in the example above. The call to `app->Initialize(...)` will initialize that object and process the options (particularly the output related options). The call to `app->OptimizeTNLP(...)` will run %Ipopt and try to solve the problem. By default, %Ipopt will write its progress to the console, and return the SolverReturn status. \subsubsection INTERFACE_CPP_COMPILE Compiling and Testing the Example Our next task is to compile and test the code. If you are familiar with the compiler and linker used on your system, you can build the code, telling the linker about the necessary libraries, as obtained via `pkg-config --lflags ipopt`. The build system already created a sample makefile. Copy `Ipopt/examples/hs071_cpp/Makefile` into your `MyExample` directory. This makefile was created for the `hs071_cpp` code, but it can be easily modified for your example problem. Edit the file, making the following changes: - change the EXE variable \verbatim EXE = my_example \endverbatim - change the OBJS variable \verbatim OBJS = HS071_NLP.o MyExample.o \endverbatim The code should compile easily with \verbatim $ make \endverbatim Now run the executable with \verbatim $ ./my_example \endverbatim and you should see output resembling the following: \verbatim ****************************************************************************** This program contains Ipopt, a library for large-scale nonlinear optimization. Ipopt is released as open source code under the Eclipse Public License (EPL). For more information visit https://github.com/coin-or/Ipopt ****************************************************************************** Number of nonzeros in equality constraint Jacobian...: 4 Number of nonzeros in inequality constraint Jacobian.: 4 Number of nonzeros in Lagrangian Hessian.............: 10 Total number of variables............................: 4 variables with only lower bounds: 0 variables with lower and upper bounds: 4 variables with only upper bounds: 0 Total number of equality constraints.................: 1 Total number of inequality constraints...............: 1 inequality constraints with only lower bounds: 1 inequality constraints with lower and upper bounds: 0 inequality constraints with only upper bounds: 0 iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls 0 1.6109693e+01 1.12e+01 5.28e-01 0.0 0.00e+00 - 0.00e+00 0.00e+00 0 1 1.7410406e+01 8.38e-01 2.25e+01 -0.3 7.97e-01 - 3.19e-01 1.00e+00f 1 2 1.8001613e+01 1.06e-02 4.96e+00 -0.3 5.60e-02 2.0 9.97e-01 1.00e+00h 1 3 1.7199482e+01 9.04e-02 4.24e-01 -1.0 9.91e-01 - 9.98e-01 1.00e+00f 1 4 1.6940955e+01 2.09e-01 4.58e-02 -1.4 2.88e-01 - 9.66e-01 1.00e+00h 1 5 1.7003411e+01 2.29e-02 8.42e-03 -2.9 7.03e-02 - 9.68e-01 1.00e+00h 1 6 1.7013974e+01 2.59e-04 8.65e-05 -4.5 6.22e-03 - 1.00e+00 1.00e+00h 1 7 1.7014017e+01 2.26e-07 5.71e-08 -8.0 1.43e-04 - 1.00e-00 1.00e+00h 1 8 1.7014017e+01 4.62e-14 9.09e-14 -8.0 6.95e-08 - 1.00e+00 1.00e+00h 1 Number of Iterations....: 8 Number of objective function evaluations = 9 Number of objective gradient evaluations = 9 Number of equality constraint evaluations = 9 Number of inequality constraint evaluations = 9 Number of equality constraint Jacobian evaluations = 9 Number of inequality constraint Jacobian evaluations = 9 Number of Lagrangian Hessian evaluations = 8 Total CPU secs in IPOPT (w/o function evaluations) = 0.220 Total CPU secs in NLP function evaluations = 0.000 EXIT: Optimal Solution Found. Solution of the primal variables, x x[0] = 1.000000e+00 x[1] = 4.743000e+00 x[2] = 3.821150e+00 x[3] = 1.379408e+00 Solution of the bound multipliers, z_L and z_U z_L[0] = 1.087871e+00 z_L[1] = 2.428776e-09 z_L[2] = 3.222413e-09 z_L[3] = 2.396076e-08 z_U[0] = 2.272727e-09 z_U[1] = 3.537314e-08 z_U[2] = 7.711676e-09 z_U[3] = 2.510890e-09 Objective value f(x*) = 1.701402e+01 *** The problem solved! \endverbatim This completes the basic C++ tutorial, but see \ref OUTPUT for explanation on the standard console output of %Ipopt and \ref OPTIONS for information about the use of options to customize the behavior of %Ipopt. The `Ipopt/examples/ScalableProblems` directory contains other NLP problems coded in C++. \subsubsection INTERFACE_CPP_ADDITIONAL Additional methods in TNLP The following methods are available for additional features that are not explained in the example. Default implementations for those methods are provided, so that a user can safely ignore them, unless she wants to make use of those features. From these features, only the intermediate callback is already available in the C and Fortran interfaces. \ref Ipopt::TNLP::intermediate_callback
\snippet IpTNLP.hpp TNLP_intermediate_callback \copydoc Ipopt::TNLP::intermediate_callback
In our example, we optionally print the current iterate and its violation of optimality conditions to the screen. \snippet hs071_nlp.cpp TNLP_intermediate_callback \ref Ipopt::TNLP::get_scaling_parameters
\snippet IpTNLP.hpp TNLP_get_scaling_parameters \copydoc Ipopt::TNLP::get_scaling_parameters
\ref Ipopt::TNLP::get_number_of_nonlinear_variables
This method is called only if the \ref QUASI_NEWTON "quasi-Newton approximation" is selected. \snippet IpTNLP.hpp TNLP_get_number_of_nonlinear_variables \copydoc Ipopt::TNLP::get_number_of_nonlinear_variables
\ref Ipopt::TNLP::get_list_of_nonlinear_variables
This method is called only if the \ref QUASI_NEWTON "quasi-Newton approximation" is selected. \snippet IpTNLP.hpp TNLP_get_list_of_nonlinear_variables \copydoc Ipopt::TNLP::get_list_of_nonlinear_variables
\ref Ipopt::TNLP::get_variables_linearity
\snippet IpTNLP.hpp TNLP_get_variables_linearity \copydoc Ipopt::TNLP::get_variables_linearity
\ref Ipopt::TNLP::get_constraints_linearity
\snippet IpTNLP.hpp TNLP_get_constraints_linearity \copydoc Ipopt::TNLP::get_constraints_linearity
\ref Ipopt::TNLP::get_var_con_metadata
\snippet IpTNLP.hpp TNLP_get_var_con_metadata \copydoc Ipopt::TNLP::get_var_con_metadata
\ref Ipopt::TNLP::finalize_metadata
\snippet IpTNLP.hpp TNLP_finalize_metadata \copydoc Ipopt::TNLP::finalize_metadata
\ref Ipopt::TNLP::get_warm_start_iterate
\snippet IpTNLP.hpp TNLP_get_warm_start_iterate \copydoc Ipopt::TNLP::get_warm_start_iterate
\subsection INTERFACE_C The C Interface The C interface for %Ipopt is declared in the header file IpStdCInterface.h, which is found in `$PREFIX/include/coin-or`; while reading this section, it will be helpful to have a look at this file. In order to solve an optimization problem with the C interface, one has to create an \ref IpoptProblem with the function \ref CreateIpoptProblem, which later has to be passed to the \ref IpoptSolve function. \ref IpoptProblem is a pointer to a C structure; you should not access this structure directly, but only through the functions provided in the C interface. The \ref IpoptProblem created by \ref CreateIpoptProblem contains the problem dimensions, the variable and constraint bounds, and the function pointers for callbacks that will be used to evaluate the NLP problem functions and their derivatives (see also the discussion of the C++ methods Ipopt::TNLP::get_nlp_info and Ipopt::TNLP::get_bounds_info for information about the arguments of \ref CreateIpoptProblem). The prototypes for the callback functions, \ref Eval_F_CB, \ref Eval_Grad_F_CB, etc., are defined in the header file IpStdCInterface.h. Their arguments correspond one-to-one to the arguments for the corresponding C++ methods; for example, for the meaning of `n`, `x`, `new_x`, `obj_value` in the declaration of \ref Eval_F_CB see the discussion of Ipopt::TNLP::eval_f. The callback functions should return `TRUE`, unless there was a problem doing the requested function/derivative evaluation at the given point `x` (then it should return `FALSE`). Note the additional argument of type \ref UserDataPtr in the callback functions. This pointer argument is available for you to communicate information between the main program that calls \ref IpoptSolve and any of the callback functions. This pointer is simply passed unmodified by %Ipopt among those functions. For example, you can use this to pass constants that define the optimization problem and are computed before the optimization in the main C program to the callback functions. After an \ref IpoptProblem has been created, you can set algorithmic options for %Ipopt (see \ref OPTIONS) using the functions \ref AddIpoptStrOption, \ref AddIpoptNumOption, and \ref AddIpoptIntOption. Finally, the %Ipopt algorithm is called with \ref IpoptSolve, giving %Ipopt the \ref IpoptProblem, the starting point, and arrays to store the solution values (primal and dual variables), if desired. Finally, after everything is done, \ref FreeIpoptProblem should be called to release internal memory that is still allocated inside %Ipopt. In the remainder of this section we discuss how the example problem (HS071) can be solved using the C interface. A completed version of this example can be found in `Ipopt/examples/hs071_c`. In order to implement the example problem on your own, create a new directory `MyCExample` and create a new file, `hs071_c.c`. Here, include the interface header file IpStdCInterface.h, along with other necessary header files, such as `stdlib.h` and `assert.h`. Add the prototypes and implementations for the five callback functions. Have a look at the C++ implementation for `eval_f`, `eval_g`, `eval_grad_f`, `eval_jac_g`, and `eval_h` in \ref INTERFACE_CPP_NLP. The C implementations have somewhat different prototypes, but are implemented almost identically to the C++ code. See the completed example in `Ipopt/examples/hs071_c/hs071_c.c` if you are not sure how to do this. We now need to implement the main function, create the \ref IpoptProblem, set options, and call \ref IpoptSolve. The \ref CreateIpoptProblem function requires the problem dimensions, the variable and constraint bounds, and the function pointers to the callback routines. The \ref IpoptSolve function requires the \ref IpoptProblem, the starting point, and allocated arrays for the solution. The main function from the example is shown next and discussed below. \snippet hs071_c.c MAIN Here, we declare all the necessary variables and set the dimensions of the problem. The problem has 4 variables, so we set n and allocate space for the variable bounds (don't forget to call free for each of your malloc calls before the end of the program). We then set the values for the variable bounds. The problem has 2 constraints, so we set m and allocate space for the constraint bounds. The first constraint has a lower bound of 25 and no upper bound. Here we set the upper bound to `2e19`. %Ipopt interprets any number greater than or equal to the value of option \ref OPT_nlp_upper_bound_inf "nlp_upper_bound_inf" as infinity. The default value of \ref OPT_nlp_lower_bound_inf "nlp_lower_bound_inf" and \ref OPT_nlp_upper_bound_inf "nlp_upper_bound_inf" is `-1e19` and `1e19`, respectively, and can be changed through %Ipopt options. The second constraint is an equality with right hand side 40, so we set both the upper and the lower bound to 40. Next, we set the number of elements in the Jacobian and Hessian. The Jacobian has 8 nonzero entries. For the Hessian we only specify the number of nonzeros in the lower-triangular part, which is 10. See \ref TRIPLET for a description of the sparse matrix format. Finally, we set the style for the row and column indices of the matrices to 0 to indicate C-Style, that is, start indexing at 0. We next create an instance of the \ref IpoptProblem by calling \ref CreateIpoptProblem, giving it the problem dimensions and the variable and constraint bounds. We also include the references to each of our callback functions. %Ipopt uses these function pointers to ask for evaluation of the NLP when required. After freeing the bound arrays that are no longer required, the next three lines illustrate how to change the value of options through the interface. %Ipopt options can also be changed by creating an `ipopt.opt` file (see \ref OPTIONS). We next allocate space for the initial point and set the values as given in the problem definition. The call to \ref IpoptSolve can provide information about the solution, but most of this is optional. Here, we want values for the constraint and variable bound multipliers at the solution and thus allocate space for these. Further, we initialize the `user_data` that will be accessed in the function evaluation callbacks. We can now make the call to \ref IpoptSolve and find the solution of the problem. We pass in the \ref IpoptProblem, the starting point `x` (%Ipopt will use this array to return the solution or final point as well). The next 5 arguments are pointers so %Ipopt can fill in values at the solution. If these pointers are set to `NULL`, %Ipopt will ignore that entry. For example, here we do not want the constraint function values at the solution, so we set this entry to `NULL`. We do want the value of the objective, and the multipliers for the constraints and variable bounds. The last argument is a pointer to our example-specific "user data". Any pointer that is passed in here will be passed on to the callback functions. The return code is an \ref ApplicationReturnStatus enumeration, see the header file ReturnCodes_inc.h which is installed along IpStdCInterface.h in the %Ipopt include directory. After the optimizer terminates, we check the status and print the solution if successful. If the solve succeeded, we resolve a slightly modified version of the problem. We use both the primal solution point and the dual multipliers to warm-start %Ipopt for this second solve. Additionally, to improve the warmstart, we reduce the amount by which %Ipopt pushes the starting point into the interior of the variable bounds by setting the options `bound_push` and `bound_frac`. If the solve was successful, we print the solution again. Finally, we free the \ref IpoptProblem and the remaining memory and return from `main`. \subsection INTERFACE_FORTRAN The Fortran Interface The Fortran interface is essentially a wrapper of the \ref INTERFACE_C "C Interface". The way to hook up %Ipopt in a Fortran program is very similar to how it is done for the C interface, and the functions of the Fortran interface correspond one-to-one to the those of the C and C++ interface, including their arguments. You can find an implementation of the example problem (HS071) in `$IPOPTDIR/Ipopt/examples/hs071_f`. The only special things to consider are: - The return value of the function `IPCREATE` is of type `INTEGER` that must be large enough to capture a pointer on the particular machine. This means, that you have to declare the "handle" for the `IpoptProblem` as `INTEGER*8` if your program is compiled in 64-bit mode. All other `INTEGER`-type variables must be of the regular type. - For the call of `IPSOLVE` (which is the function that is to be called to run %Ipopt), all arrays, including those for the dual variables, must be given (in contrast to the C interface). The return value `IERR` of this function indicates the outcome of the optimization (see the include file `IpReturnCodes.inc` in the %Ipopt include directory). - The return value `IERR` of the remaining functions has to be set to zero, unless there was a problem during execution of the function call. - The callback functions (`EV_*` in the example) include the arguments `IDAT` and `DAT`, which are `INTEGER` and `DOUBLE PRECISION` arrays that are passed unmodified between the main program calling `IPSOLVE` and the evaluation subroutines `EV_*` (similarly to `UserDataPtr` arguments in the C interface). These arrays can be used to pass "private" data between the main program and the user-provided Fortran subroutines. The last argument of the `EV_*` subroutines, `IERR`, is to be set to 0 by the user on return, unless there was a problem during the evaluation of the optimization problem function/derivative for the given point `X` (then it should return a non-zero value). \subsection INTERFACE_JAVA The Java Interface JIpopt This section is based on documentation by Rafael de Pelegrini Soares (VRTech Industrial Technologies). The Java Interface was written and contributed by Rafael de Pelegrini Soares and later updated by Tong Kewei (Beihang University). It offers an abstract base class \ref org.coinor.Ipopt "Ipopt" with basic methods to specify an NLP, set a number of %Ipopt options, to request %Ipopt to solve the NLP, and to retrieve a found solution, if any. A HTML documentation of all available interface methods of the \ref org.coinor.Ipopt "Ipopt" class can also be generated via javadoc by executing `make javadoc` in the %Ipopt build directory (`$IPOPTDIR`). If the %Ipopt build includes the Java interface, then a JAR file `org.coinor.ipopt.jar` containing class org.coinor.Ipopt will have been installed in `$PREFIX/share/java`. To use the Java interface, make sure that this jar file is part of your Java classpath. A sample makefile that compiles and runs example HS071 can be found in `$IPOPTDIR/examples/hs071_java`. In the following, we discuss necessary steps to implement example (HS071) with `JIpopt`. We create a new Java source file HS071.java and define a class `HS071` that extends the class \ref org.coinor.Ipopt "Ipopt". In the class constructor, we call the \ref org.coinor.Ipopt::create() method of `JIpopt`, which works analogously to \ref Ipopt::TNLP::get_nlp_info() of the C++ interface. It initializes an \ref Ipopt::IpoptApplication object and informs `JIpopt` about the problem size (number of variables, constraints, nonzeros in Jacobian and Hessian). \snippet HS071.java HS071 Next, we add callback functions that are called by `JIpopt` to obtain variable bounds, constraint sides, and a starting point: \snippet HS071.java get_bounds_info \snippet HS071.java get_starting_point In the following, we implement the evaluation methods in a way that is very similar to the C++ interface: \snippet HS071.java eval For this example, we override the callback that is called by %Ipopt in every iteration and can be used to indicate to %Ipopt whether to stop prematurely. We use this callback to print the current iterate and its violations of primal and dual feasibility (obtained via \ref org.coinor.Ipopt::get_curr_iterate "get_curr_iterate()" and \ref org.coinor.Ipopt::get_curr_violations "get_curr_violations()", resp.): \snippet HS071.java intermediate_callback Finally, we add a main routine to run this example. The main routines creates an instance of our class, calls the solve method \ref org.coinor.Ipopt::OptimizeNLP "OptimizeNLP", and prints the solution. \snippet HS071.java main The \ref org.coinor.Ipopt::OptimizeNLP "OptimizeNLP" method returns the %Ipopt solve status as integer, which indicates whether the problem was solved successfully. Further, the methods \ref org.coinor.Ipopt::getObjectiveValue() "getObjectiveValue()", \ref org.coinor.Ipopt::getVariableValues() "getVariableValues()", \ref org.coinor.Ipopt::getConstraintMultipliers() "getConstraintMultipliers()", \ref org.coinor.Ipopt::getLowerBoundMultipliers() "getLowerBoundMultipliers()", and \ref org.coinor.Ipopt::getUpperBoundMultipliers() "getUpperBoundMultipliers()" can be used to obtain the objective value, the primal solution value of the variables, and dual solution values. \subsection INTERFACE_R The R Interface ipoptr This section is based on documentation by Jelmer Ypma (University College London). The `ipoptr` package (see also \ref INSTALL_R) offers a R function `ipoptr` which takes an NLP specification, a starting point, and %Ipopt options as input and returns information about an %Ipopt run (status, message, ...) and a solution point. In the following, we discuss necessary steps to implement example (HS071) with `ipoptr`. A more detailed documentation of `ipoptr` is available in [contrib/RInterface/inst/doc/ipoptr.pdf](https://github.com/coin-or/Ipopt/raw/stable/3.14/contrib/RInterface/inst/doc/ipoptr.pdf). First, we define the objective function and its gradient \code{.unparsed} > eval_f <- function( x ) { return( x[1]*x[4]*(x[1] + x[2] + x[3]) + x[3] ) } > eval_grad_f <- function( x ) { return( c( x[1] * x[4] + x[4] * (x[1] + x[2] + x[3]), x[1] * x[4], x[1] * x[4] + 1.0, x[1] * (x[1] + x[2] + x[3]) ) ) } \endcode Then we define a function that returns the value of the two constraints. We define the bounds of the constraints (in this case the `g_L` and `g_U` are 25 and 40) later. \code{.unparsed} > # constraint functions > eval_g <- function( x ) { return( c( x[1] * x[2] * x[3] * x[4], x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 ) ) } \endcode Then we define the structure of the Jacobian, which is a dense matrix in this case, and function to evaluate it \code{.unparsed} > eval_jac_g_structure <- list( c(1,2,3,4), c(1,2,3,4) ) > eval_jac_g <- function( x ) { return( c ( x[2]*x[3]*x[4], x[1]*x[3]*x[4], x[1]*x[2]*x[4], x[1]*x[2]*x[3], 2.0*x[1], 2.0*x[2], 2.0*x[3], 2.0*x[4] ) ) } \endcode The Hessian is also dense, but it looks slightly more complicated because we have to take into account the Hessian of the objective function and of the constraints at the same time, although you could write a function to calculate them both separately and then return the combined result in `eval_h`. \code{.unparsed} > # The Hessian for this problem is actually dense, > # This is a symmetric matrix, fill the lower left triangle only. > eval_h_structure <- list( c(1), c(1,2), c(1,2,3), c(1,2,3,4) ) > eval_h <- function( x, obj_factor, hessian_lambda ) { values <- numeric(10) values[1] = obj_factor * (2*x[4]) # 1,1 values[2] = obj_factor * (x[4]) # 2,1 values[3] = 0 # 2,2 values[4] = obj_factor * (x[4]) # 3,1 values[5] = 0 # 4,2 values[6] = 0 # 3,3 values[7] = obj_factor * (2*x[1] + x[2] + x[3]) # 4,1 values[8] = obj_factor * (x[1]) # 4,2 values[9] = obj_factor * (x[1]) # 4,3 values[10] = 0 # 4,4 # add the portion for the first constraint values[2] = values[2] + hessian_lambda[1] * (x[3] * x[4]) # 2,1 values[4] = values[4] + hessian_lambda[1] * (x[2] * x[4]) # 3,1 values[5] = values[5] + hessian_lambda[1] * (x[1] * x[4]) # 3,2 values[7] = values[7] + hessian_lambda[1] * (x[2] * x[3]) # 4,1 values[8] = values[8] + hessian_lambda[1] * (x[1] * x[3]) # 4,2 values[9] = values[9] + hessian_lambda[1] * (x[1] * x[2]) # 4,3 # add the portion for the second constraint values[1] = values[1] + hessian_lambda[2] * 2 # 1,1 values[3] = values[3] + hessian_lambda[2] * 2 # 2,2 values[6] = values[6] + hessian_lambda[2] * 2 # 3,3 values[10] = values[10] + hessian_lambda[2] * 2 # 4,4 return ( values ) } \endcode After the hard part is done, we only have to define the initial values, the lower and upper bounds of the control variables, and the lower and upper bounds of the constraints. If a variable or a constraint does not have lower or upper bounds, the values `-Inf` or `Inf` can be used. If the upper and lower bounds of a constraint are equal, %Ipopt recognizes this as an equality constraint and acts accordingly. \code{.unparsed} > # initial values > x0 <- c( 1, 5, 5, 1 ) > # lower and upper bounds of control > lb <- c( 1, 1, 1, 1 ) > ub <- c( 5, 5, 5, 5 ) > # lower and upper bounds of constraints > constraint_lb <- c( 25, 40 ) > constraint_ub <- c( Inf, 40 ) \endcode Finally, we can call %Ipopt with the `ipoptr` function. In order to redirect the %Ipopt output into a file, we use %Ipopt's and options. \code{.unparsed} > opts <- list("print_level" = 0, "file_print_level" = 12, "output_file" = "hs071_nlp.out") > print( ipoptr( x0 = x0, eval_f = eval_f, eval_grad_f = eval_grad_f, lb = lb, ub = ub, eval_g = eval_g, eval_jac_g = eval_jac_g, constraint_lb = constraint_lb, constraint_ub = constraint_ub, eval_jac_g_structure = eval_jac_g_structure, eval_h = eval_h, eval_h_structure = eval_h_structure, opts = opts) ) Call: ipoptr(x0 = x0, eval_f = eval_f, eval_grad_f = eval_grad_f, lb = lb, ub = ub, eval_g = eval_g, eval_jac_g = eval_jac_g, eval_jac_g_structure = eval_jac_g_structure, constraint_lb = constraint_lb, constraint_ub = constraint_ub, eval_h = eval_h, eval_h_structure = eval_h_structure, opts = opts) Ipopt solver status: 0 ( SUCCESS: Algorithm terminated successfully at a locally optimal point, satisfying the convergence tolerances (can be specified by options). ) Number of Iterations....: 8 Optimal value of objective function: 17.0140171451792 Optimal value of controls: 1 4.743 3.82115 1.379408 \endcode To pass additional data to the evaluation routines, one can either supply additional arguments to the user defined functions and `ipoptr` or define an environment that holds the data and pass this environment to `ipoptr`. Both methods are shown in the file `tests/parameters.R` that comes with `ipoptr`. As a very simple example, suppose we want to find the minimum of \f$f(x) = a_1 x^2 + a_2 x + a_3\f$ for different values of the parameters \f$a_1\f$, \f$a_2\f$ and \f$a_3\f$. First, we define the objective function and its gradient using, assuming that there is some variable `params` that contains the values of the parameters. \code{.unparsed} > eval_f_ex1 <- function(x, params) { return( params[1]*x^2 + params[2]*x + params[3] ) } > eval_grad_f_ex1 <- function(x, params) { return( 2*params[1]*x + params[2] ) } \endcode Note, that the first parameter should always be the control variable. All of the user-defined functions should contain the same set of additional parameters. You have to supply them as input argument to all functions, even if you're not using them in some of the functions. Then we can solve the problem for a specific set of parameters, in this case \f$a_1=1\f$, \f$a_2=2\f$, and \f$a_3=3\f$, from initial value \f$x_0=0\f$, with the following command \code{.unparsed} > # solve using ipoptr with additional parameters > ipoptr(x0 = 0, eval_f = eval_f_ex1, eval_grad_f = eval_grad_f_ex1, opts = list("print_level"=0), params = c(1,2,3) ) Call: ipoptr(x0 = 0, eval_f = eval_f_ex1, eval_grad_f = eval_grad_f_ex1, opts = list(print_level = 0), params = c(1, 2, 3)) Ipopt solver status: 0 ( SUCCESS: Algorithm terminated successfully at a locally optimal point, satisfying the convergence tolerances (can be specified by options). ) Number of Iterations....: 1 Optimal value of objective function: 2 Optimal value of controls: -1 \endcode For the second method, we don't have to supply the parameters as additional arguments to the function. \code{.unparsed} > eval_f_ex2 <- function(x) { return( params[1]*x^2 + params[2]*x + params[3] ) } > eval_grad_f_ex2 <- function(x) { return( 2*params[1]*x + params[2] ) } \endcode Instead, we define an environment that contains specific values of `params`: \code{.unparsed} > # define a new environment that contains params > auxdata <- new.env() > auxdata$params <- c(1,2,3) \endcode To solve this we supply `auxdata` as an argument to `ipoptr`, which will take care of evaluating the functions in the correct environment, so that the auxiliary data is available. \code{.unparsed} > # pass the environment that should be used to evaluate functions to ipoptr > ipoptr(x0 = 0, eval_f = eval_f_ex2, eval_grad_f = eval_grad_f_ex2, ipoptr_environment = auxdata, opts = list("print_level"=0) ) Call: ipoptr(x0 = 0, eval_f = eval_f_ex2, eval_grad_f = eval_grad_f_ex2, opts = list(print_level = 0), ipoptr_environment = auxdata) Ipopt solver status: 0 ( SUCCESS: Algorithm terminated successfully at a locally optimal point, satisfying the convergence tolerances (can be specified by options). ) Number of Iterations....: 1 Optimal value of objective function: 2 Optimal value of controls: -1 \endcode */ coinor-ipopt-3.14.17/doc/ipopt.bib000066400000000000000000000123771473776672200167260ustar00rootroot00000000000000@Book{Biegler:nlpbook, author = {L.T. Biegler}, title = {Nonlinear Programming: Concepts, Algorithms and Applications to Chemical Processes}, publisher = {SIAM, Philadelphia}, year = {2010} } @Article{CouHubSchWae:inexact, author = {F.E. Curtis and J. Huber and O. Schenk and A. W{\"a}chter}, title = {A note on the implementation of an interior-point algorithm for nonlinear optimization with inexact step computations}, journal = {Mathematical Programming}, year = {2012}, volume = {136}, number = {1}, pages = {209--227}, url = {http://dx.doi.org/10.1007/s10107-012-0557-4}, note = {preprint at \url{http://www.optimization-online.org/DB_HTML/2011/04/2992.html}} } @Book{FouGayKer:AMPLbook, author = {R. Fourer and D.M. Gay and B.W. Kernighan}, title = {AMPL: A Modeling Language For Mathematical Programming}, publisher = {Thomson Publishing Company, Danvers, MA, USA}, year = {1993} } @Article{SWH:parallel, author = {O. Schenk and A. W\"achter and M. Hagemann}, title = {Matching-based preprocessing algorithms to the solution of saddle-point problems in large-scale nonconvex interior-point optimization}, journal = {Computational Optimization Applications}, year = {2007}, OPTkey = {•}, volume = {36}, number = {2-3}, pages = {321--341}, url = {http://dx.doi.org/10.1007/s10589-006-9003-y} } @Article{HS, author = {W. Hock and K. Schittkowski}, title = {Test examples for nonlinear programming codes}, journal = {Lecture Notes in Economics and Mathematical Systems}, year = {1981}, volume = {187}, url = {http://dx.doi.org/10.1007/978-3-642-48320-2} } @Article{NocWaeWal:adaptive, author = {J. Nocedal and A. W{\"a}chter and R.A. Waltz}, title = {Adaptive barrier strategies for nonlinear interior methods}, journal = {SIAM Journal on Optimization}, volume = 19, number = 4, pages = {1674--1693}, year = 2008, url = {http://dx.doi.org/10.1137/060649513}, note = {preprint at \url{http://www.optimization-online.org/DB_HTML/2005/03/1089.html}} } @Article{PLNB:sIpopt, author = {H. Pirnay and R. L\'opez-Negrete and L.T. Biegler}, title = {Optimal Sensitivity based on {I}popt}, journal = {Mathematical Programming Computations}, volume = 4, number = 4, pages = {307--331}, year = 2012, url = {http://dx.doi.org/10.1007/s12532-012-0043-2}, note = {preprint at \url{http://www.optimization-online.org/DB_HTML/2011/04/3008.html}} } @PhdThesis{WaechterPhD, author = {A. W\"achter.}, title = {An Interior Point Algorithm for Large-Scale Nonlinear Optimization with Applications in Process Engineering}, school = {Carnegie Mellon University, Pittsburgh, PA, USA}, year = {2002}, month = {January}, url = {https://users.iems.northwestern.edu/~andreasw/pubs/waechter_thesis.pdf} } @InCollection{Waechter90Minutes, author = {A. W\"achter.}, title = {Short Tutorial: Getting Started With {I}popt in 90 Minutes}, booktitle = {Combinatorial Scientific Computing}, year = {2009}, editor = {U. Naumann, O. Schenk, H. D. Simon}, url = {http://nbn-resolving.de/urn/resolver.pl?urn=urn:nbn:de:0030-drops-20890} } @Article{WaeBie05:filterlocal, author = {A. W{\"a}chter and L.T. Biegler}, title = {Line search filter methods for nonlinear programming: {L}ocal convergence}, journal = {SIAM Journal on Optimization}, volume = 16, number = 1, pages = {32--48}, year = 2005, url = {http://dx.doi.org/10.1137/S1052623403426544} } @Article{WaeBie05:filterglobal, author = {A. W{\"a}chter and L.T. Biegler}, title = {Line search filter methods for nonlinear programming: Motivation and global convergence}, journal = {SIAM Journal on Optimization}, volume = 16, number = 1, pages = {1--31}, year = 2005, url = {http://dx.doi.org/10.1137/S1052623403426556} } @TechReport{WaeBie05:filterboth, author = {A. W\"achter and L.T. Biegler}, title = {Global and Local Convergence of Line Search Filter Methods for Nonlinear Programming}, institution = {Optimization Online}, year = {2001}, url = {http://www.optimization-online.org/DB_HTML/2001/08/367.html} } @Article{WaecBieg06:mp, author = {A. W\"achter and L.T. Biegler}, title = {On the implementation of a primal-dual interior point filter line search algorithm for large-scale nonlinear programming}, journal = {Mathematical Programming}, volume = 106, number = 1, pages = {25--57}, year = 2006, url = {http://dx.doi.org/10.1007/s10107-004-0559-y}, note = {preprint at \url{http://www.optimization-online.org/DB_HTML/2004/03/836.html}} } @Article{ChiangZavala2014, author="N.-Y. Chiang and V.M. Zavala", title="An inertia-free filter line-search algorithm for large-scale nonlinear programming", journal="Computational Optimization and Applications", year="2016", volume="64", number="2", pages="327--354", issn="1573-2894", doi="10.1007/s10589-015-9820-y", url="https://doi.org/10.1007/s10589-015-9820-y" note="preprint at \url{http://www.mcs.anl.gov/papers/P5197-0914.pdf}" } @Book{Fiacco1983, editor = "A.V. Fiacco", title = "Introduction to Sensitivity and Stability Analysis in Nonlinear Programming", volume = 165, series = "Mathematics in Science and Engineering", year = 1983 } @TechReport{Tasseff2019, title={Exploring Benefits of Linear Solver Parallelism on Modern Nonlinear Optimization Applications}, author={B. Tasseff and C. Coffrin and A. Wächter and C. Laird}, year={2019}, url={https://arxiv.org/abs/1909.08104}, number={1909.08104}, type={arXiv} } \end{thebibliography} coinor-ipopt-3.14.17/doc/layout.xml000066400000000000000000000164161473776672200171520ustar00rootroot00000000000000 coinor-ipopt-3.14.17/doc/main.dox000066400000000000000000000440441473776672200165510ustar00rootroot00000000000000/** \mainpage Documentation This document is a guide to using %Ipopt. It includes instructions on how to obtain and compile %Ipopt, a description of the interface, user options, etc., as well as a tutorial on how to solve a nonlinear optimization problem with %Ipopt. The documentation consists of the following pages: - \ref Overview - \subpage INSTALL - \subpage INTERFACES - \subpage SPECIALS - \subpage OPTIONS - \subpage OUTPUT - \subpage IMPL - \subpage FAQ - \subpage md_ChangeLog - \subpage AUTHORS - \subpage LICENSE The %Ipopt project website is . \tableofcontents \section Overview %Ipopt (Interior Point Optimizer, pronounced "Eye-Pea-Opt") is an open source software package for large-scale nonlinear optimization. It can be used to solve general nonlinear programming problems of the form \anchor NLP \f{align}{ \min_{x\in\mathbb{R}^n} && f(x) \nonumber \\ \text{s.t.} \; && g^L \leq g(x) \leq g^U \tag{NLP} \\ && x^L \leq x \leq x^U, \nonumber \f} where \f$x \in \mathbb{R}^n\f$ are the optimization variables (possibly with lower and upper bounds, \f$x^L\in(\mathbb{R}\cup\{-\infty\})^n\f$ and \f$x^U\in(\mathbb{R}\cup\{+\infty\})^n\f$) with \f$x^L \leq x^U\f$, \f$f:\mathbb{R}^n \to \mathbb{R}\f$ is the objective function, and \f$g:\mathbb{R}^n \to \mathbb{R}^m\f$ are the general nonlinear constraints. The functions \f$f(x)\f$ and \f$g(x)\f$ can be linear or nonlinear and convex or non-convex (but should be twice continuously differentiable). The constraint functions, \f$g(x)\f$, have lower and upper bounds, \f$g^L\in(\mathbb{R}\cup\{-\infty\})^m\f$ and \f$g^U\in(\mathbb{R}\cup\{+\infty\})^m\f$ with \f$g^L \leq g^U\f$. Note that equality constraints of the form \f$g_i(x)=\bar g_i\f$ can be specified by setting \f$g^L_{i}=g^U_{i}=\bar g_i\f$. \subsection MATHBACKGROUND Mathematical Background %Ipopt implements an interior point line search filter method that aims to find a local solution of \ref NLP "(NLP)". The mathematical details of the algorithm can be found in several publications \cite NocWaeWal:adaptive, \cite WaechterPhD, \cite WaecBieg06:mp, \cite WaeBie05:filterglobal, \cite WaeBie05:filterlocal. \subsection AVAILABILITY Availability The %Ipopt package is available from [COIN-OR](http://www.coin-or.org) under the EPL (Eclipse Public License) open-source license and includes the source code for %Ipopt. This means, it is available free of charge, also for commercial purposes. However, if you give away software including %Ipopt code (in source code or binary form) and you made changes to the %Ipopt source code, you are required to make those changes public and to clearly indicate which modifications you made. After all, the goal of open source software is the continuous development and improvement of software. For details, please refer to the [Eclipse Public License](https://opensource.org/licenses/EPL-2.0). Also, if you are using %Ipopt to obtain results for a publication, we politely ask you to point out in your paper that you used %Ipopt, and to cite the publication \cite WaecBieg06:mp. Writing high-quality numerical software takes a lot of time and effort, and does usually not translate into a large number of publications, therefore we believe this request is only fair :). We also have space in the [%Ipopt usage stories and papers](https://github.com/coin-or/Ipopt/discussions/497) discussion where we list publications, projects, etc., in which %Ipopt has been used. We would be very happy to hear about your experiences. \subsection PREREQUISITES Prerequisites In order to build %Ipopt, some third party components are required: - BLAS (Basic Linear Algebra Subroutines) and LAPACK (Linear Algebra PACKage). Many vendors of compilers and operating systems provide precompiled and optimized libraries for these dense linear algebra subroutines. You can also get the source code for a simple reference implementation from http://www.netlib.org. However, it is strongly recommended to use some optimized BLAS and LAPACK implementations, for large problems this can make a runtime difference of an order of magnitude! Examples for efficient BLAS implementations are: - Generic: - [OpenBLAS](https://github.com/xianyi/OpenBLAS), BSD license - [BLIS](https://github.com/flame/blis) (BLAS-like Library Instantiation Software Framework), BSD license - [ATLAS](http://math-atlas.sourceforge.net/) (Automatically Tuned Linear Algebra Software), BSD license - From hardware vendors: - [Accelerate](https://developer.apple.com/documentation/accelerate) Framework by Apple - [BLIS fork](https://github.com/amd/blis) (BLAS-like Library Instantiation Software Framework) by AMD - [ESSL](https://www.ibm.com/docs/en/essl) (Engineering Scientific Subroutine Library) by IBM - [MKL](https://software.intel.com/content/www/us/en/develop/tools/math-kernel-library.html) (Math Kernel Library) by Intel - [Sun Performance Library](https://docs.oracle.com/cd/E18659_01/html/821-2763/gjgis.html) by Sun Note: BLAS libraries distributed with Linux were often not optimized in the past. Nowadays, OpenBLAS is often found in Linux distributions, but you should check. - A sparse symmetric indefinite linear solver. %Ipopt needs to obtain the solution of sparse, symmetric, indefinite linear systems, and for this it relies on third-party code. Currently, the following linear solvers can be used: - MA27 from the [HSL Mathematical Software Library](http://www.hsl.rl.ac.uk) - MA57 from the [HSL Mathematical Software Library](http://www.hsl.rl.ac.uk) - HSL_MA77 from the [HSL Mathematical Software Library](http://www.hsl.rl.ac.uk) - HSL_MA86 from the [HSL Mathematical Software Library](http://www.hsl.rl.ac.uk) - HSL_MA97 from the [HSL Mathematical Software Library](http://www.hsl.rl.ac.uk) - [MUMPS](http://mumps.enseeiht.fr) (MUltifrontal Massively Parallel sparse direct Solver) - PARDISO (Parallel Sparse Direct Solver) from [Pardiso Project](http://www.pardiso-project.org) or Intel MKL. Note that current versions from Pardiso Project typically offer much better performance than the one from Intel MKL. - [SPRAL](https://github.com/ralna/spral) (Sparse Parallel Robust Algorithms Library) - [WSMP](http://researcher.ibm.com/view_project.php?id=1426) (Watson Sparse Matrix Package) You must include at least one of the linear solvers above in order to run %Ipopt, and if you want to be able to switch easily between different alternatives, you can compile %Ipopt with interfaces to all of them. The linear solvers from HSL and Pardiso Project can also be loaded from a shared library at runtime, see \ref LINEARSOLVERLOADER and \ref DOWNLOAD_PARDISO "Pardiso from Pardiso Project". For the latter, this is also the only option. \note The solution of the linear systems is a central ingredient in %Ipopt and the optimizer's performance and robustness depends on your choice. The best choice depends on your application, and it makes sense to try different options, but solvers from HSL or Pardiso Project are often a good choice. Most of the solvers also rely on efficient BLAS code (see above), so you should use a good BLAS library tailored to your system. Please keep this in mind, particularly when you are comparing %Ipopt with other optimization codes. See also \cite Tasseff2019 for a comparison of Ipopt with various linear solvers. If you are compiling MA57, HSL_MA77, HSL_MA86, HSL_MA97, MUMPS, or SPRAL within the %Ipopt build system, you should also include the METIS linear system ordering package. Interfaces to other linear solvers might be added in the future; if you are interested in contributing such an interface please contact us! Note that %Ipopt requires that the linear solver is able to provide the inertia (number of positive and negative eigenvalues) of the symmetric matrix that is factorized. - Furthermore, %Ipopt can also use the HSL package MC19 for scaling of the linear systems before they are passed to the linear solver. This may be particularly useful if %Ipopt is used with MA27 or MA57. However, it is not required to have MC19; if this routine is missing, scaling is not performed. - ASL (AMPL Solver Library). The source code is available at http://www.netlib.org, and COIN-OR's [ThirdParty-ASL project](https://github.com/coin-or-tools/ThirdParty-ASL) can be used to build a library that is recognized by %Ipopt's build system. NOTE: This is only required if you want to use %Ipopt from AMPL and want to compile the %Ipopt AMPL solver executable. For more information on third-party components and how to obtain them, see \ref EXTERNALCODE. Since the %Ipopt code is written in C++, you will need a C++ compiler to build the %Ipopt library. We tried very hard to write the code as platform and compiler independent as possible. In addition, the configuration script also searches for a Fortran compiler. If all third party dependencies are available as self-contained libraries and no Ipopt/Fortran interface needs to be build, a Fortran compile is not necessary. When using GNU compilers, we recommend you use the same version numbers for gcc, g++, and gfortran. Further, mixing clang (for C/C++) and gfortran has been problematic and should be avoided. \subsection HOWTOUSE How to use Ipopt If desired, the %Ipopt distribution generates an executable for the modeling environment AMPL. As well, you can link your problem statement with %Ipopt using interfaces for C++, C, Java, or Fortran. %Ipopt can be used with most Linux/Unix environments, and on Windows using Msys2/MinGW. In \ref INTERFACES this document demonstrates how to solve problems using %Ipopt. This includes installation and compilation of %Ipopt for use with AMPL as well as linking with your own code. An installation of the AMPL link to %Ipopt is also available on [NEOS](https://neos-server.org/neos/solvers/nco:Ipopt/AMPL.html). Additionally, the %Ipopt distribution includes an interface for the R project for statistical computing, see \ref INTERFACE_R. There is also software that facilitates use of %Ipopt maintained by other people, among them are: - [ADOL-C](https://github.com/coin-or/ADOL-C) (automatic differentiation) ADOL-C facilitates the evaluation of first and higher derivatives of vector functions that are defined by computer programs written in C or C++. It comes with [examples](https://github.com/coin-or/ADOL-C/tree/master/ADOL-C/examples/additional_examples/ipopt) that show how to use it in connection with %Ipopt. - AIMMS (modeling environment) The [AIMMSlinks project](https://github.com/coin-or/AIMMSlinks) on COIN-OR, maintained by Marcel Hunting, provides an interface for %Ipopt within the AIMMS modeling tool. - [APMonitor](http://apmonitor.com) MATLAB, Python, and Web Interface to %Ipopt for Android, Linux, macOS, and Windows. - [CasADi](http://casadi.org) CasADi is a symbolic framework for automatic differentiation and numeric optimization and comes with %Ipopt. - [CppAD](https://github.com/coin-or/CppAD) (automatic differentiation) Given a C++ algorithm that computes function values, CppAD generates an algorithm that computes corresponding derivative values (of arbitrary order using either forward or reverse mode). It comes with an [example](https://coin-or.github.io/CppAD/doc/ipopt_solve.htm) that shows how to use it in connection with %Ipopt. It is also possible to use Ipopt via [CppADs Python interface](https://bradbell.github.io/cppad_py/doc/xsrst/cppad_py.html). An example is available [here](https://bradbell.github.io/cppad_py/doc/xsrst/mixed_optimize_fixed_2_py.html). - [csipopt](https://github.com/cureos/csipopt) Interfacing Ipopt from .NET languages such as **C#**, **F#** and **Visual Basic.NET**. - [cyipopt](https://github.com/mechmotum/cyipopt) A **Python** wrapper around %Ipopt with a SciPy-style interface. - GAMS (modeling environment) The [GAMSlinks project](https://github.com/coin-or/GAMSlinks) on COIN-OR includes a GAMS interface for %Ipopt. An installation of GAMS with %Ipopt is also available on [NEOS](https://neos-server.org/neos/solvers/nco:Ipopt/GAMS.html). - [ifopt](https://github.com/ethz-adrl/ifopt) Modern, light-weight (~1k loc), **Eigen**-based C++ interface to %Ipopt and Snopt. - [IPyOpt](https://gitlab.com/g-braeunlich/ipyopt) Interfacing %Ipopt from **Python**. - [JuliaOpt](http://juliaopt.org) Julia is a high-level, high-performance dynamic programming language for technical computing. JuliaOpt, is an umbrella group for Julia-based optimization-related projects. It includes the algebraic modeling language [JuMP](https://github.com/JuliaOpt/JuMP.jl) and an [interface to %Ipopt](https://github.com/JuliaOpt/Ipopt.jl). - [MADOPT](https://github.com/stanle/madopt) (Modelling and Automatic Differentiation for Optimisation) Light-weight C++ and Python modelling interfaces implementing expression building using operator overloading and automatic differentiation. - [mexIPOPT](https://github.com/ebertolazzi/mexIPOPT) Matlab (mex) interface to you use %Ipopt from Matlab. - [OPTimization Interface (OPTI) Toolbox](http://www.i2c2.aut.ac.nz/Wiki/OPTI/) OPTI is a free **Matlab** toolbox for constructing and solving linear, nonlinear, continuous and discrete optimization problem and comes with %Ipopt, including binaries. - [Optimization Services](https://github.com/coin-or/OS) The Optimization Services (OS) project provides a set of standards for representing optimization instances, results, solver options, and communication between clients and solvers, including %Ipopt, in a distributed environment using Web Services. - [Scilab](https://www.scilab.org/) (free Matlab-like environment): A Scilab interface is available at https://atoms.scilab.org/toolboxes/sci_ipopt. \subsection MOREINFO More Information and Contributions An issue tracking and discussion system can be found at the %Ipopt homepage, https://github.com/coin-or/Ipopt. %Ipopt is an open source project, and we encourage people to contribute code (such as interfaces to appropriate linear solvers, modeling environments, or even algorithmic features). If you are interested in contributing code, please have a look at the [COIN-OR contributions webpage](http://www.coin-or.org/contributions.html) and contact the %Ipopt project leader. There also has been a mailing list for %Ipopt. Its archive (2002-2020) is available from the webpage . An easy way to search the archive with Google is to specify `site:http://list.coin-or.org/pipermail/ipopt` in addition to your keywords in the search string. A short tutorial on getting started with %Ipopt is also available \cite Waechter90Minutes. \subsection HISTORY_IPOPT History of Ipopt The original %Ipopt(Fortran version) was a product of the dissertation research of Andreas Wächter \cite WaechterPhD, under the supervision of Lorenz T. Biegler at the Chemical Engineering Department at Carnegie Mellon University. The code was made open source and distributed by the COIN-OR initiative, which is now a non-profit corporation. %Ipopt has been actively developed under COIN-OR since 2002. To continue natural extension of the code and allow easy addition of new features, IBM Research decided to invest in an open source re-write of %Ipopt in C++. With the help of Carl Laird, who came to the Mathematical Sciences Department at IBM Research as a summer intern in 2004 and 2005 during his PhD studies, the code was re-implemented from scratch. The new C++ version of the %Ipopt optimization code (%Ipopt 3.0.0 and beyond) was maintained at IBM Research and remains part of the COIN-OR initiative. The development on the Fortran version has ceased, but the source code can still be downloaded from . \subsection HISTORY_DOC History of this document The initial version of this document was created by Yoshiaki Kawajir (then Department of Chemical Engineering, Carnegie Mellon University, Pittsburgh PA) as a course project for *47852 Open Source Software for Optimization*, taught by Prof. François Margot at Tepper School of Business, Carnegie Mellon University. After this, Carl Laird (then Department of Chemical Engineering, Carnegie Mellon University, Pittsburgh PA) has added significant portions, including the very nice tutorials. The current version is maintained by Stefan Vigerske (GAMS Software GmbH) and Andreas Wächter (Department of Industrial Engineering and Management Sciences, Northwestern University). The following names used in this document are trademarks or registered trademarks: Apple, AMPL, IBM, Intel, Matlab, Microsoft, MKL, Visual Studio C++, Visual Studio C++ .NET \page AUTHORS Authors and Contributors \verbinclude AUTHORS \page LICENSE License %Ipopt is available under the Eclipse Public License: \verbinclude LICENSE */ coinor-ipopt-3.14.17/doc/options.dox000066400000000000000000004257101473776672200173230ustar00rootroot00000000000000/** \page OPTIONS %Ipopt %Options \tableofcontents %Ipopt has many (maybe too many) options that can be adjusted for the algorithm. %Options are all identified by a string name, and their values can be of one of three types: Number (real), Integer, or String. Number options are used for things like tolerances, integer options are used for things like maximum number of iterations, and string options are used for setting algorithm details, like the NLP scaling method. %Options can be set through the code that interfaces %Ipopt (have a look at the examples to see how this is done) or by creating a `ipopt.opt` file in the directory you are executing %Ipopt. The `ipopt.opt` file is read line by line and each line should contain the option name, followed by whitespace, and then the value. Comments can be included with the `#` symbol. For example, # This is a comment # Turn off the NLP scaling nlp_scaling_method none # Change the initial barrier parameter mu_init 1e-2 # Set the max number of iterations max_iter 500 is a valid `ipopt.opt` file. \section OPTIONS_AMPL Options in the AMPL Interface To set options through AMPL, use the internal AMPL command options. For example, \verbatim options ipopt_options "nlp_scaling_method=none mu_init=1e-2 max_iter=500" \endverbatim is a valid options command in AMPL. Further, you can always create `ipopt.opt`. Note, the `ipopt.opt` file is given preference when setting options. This way, you can easily override any options set in a particular executable or AMPL model by specifying new values in `ipopt.opt`. All %Ipopt options are also available through AMPL. In addition, these options are available: | Option | Description | |:-------|:------------| | halt_on_ampl_error | Exit with message on evaluation error | | wantsol | solution report without -AMPL: sum of; 1 => write .sol file; 2 => print primal variable values; 4 => print dual variable values; 8 => do not print solution message | | maxit | Synonym for \ref OPT_max_iter "max_iter" | | outlev | Synonym for \ref OPT_print_level "print_level" | Running the AMPL solver executable with the "-=" flag from the command prompt prints a list of all options available in AMPL. \section OPTIONS_REF Options Reference A list of documented options is given next. Options that should be modified by expert users only are marked as advanced. You can print the documentation for all %Ipopt options to the console by using the option \ref OPT_print_options_documentation "print_options_documentation" and running %Ipopt. If you have the AMPL solver executable, you can generate this list also by calling the executable with flag `--print-options`. \note Availability or default values of some options concerning the linear solver depends on the configuration used to build %Ipopt. Use the print options documentation feature to see which options are available in a particular build of %Ipopt. The implementation paper mentioned for some options is \cite WaecBieg06:mp. \subsection OPT_Termination Termination \anchor OPT_tol tol: Desired convergence tolerance (relative).
Determines the convergence tolerance for the algorithm. The algorithm terminates successfully, if the (scaled) NLP error becomes smaller than this value, and if the (absolute) criteria according to "dual_inf_tol", "constr_viol_tol", and "compl_inf_tol" are met. This is epsilon_tol in Eqn. (6) in implementation paper. See also "acceptable_tol" as a second termination criterion. Note, some other algorithmic features also use this quantity to determine thresholds etc. The valid range for this real option is 0 < tol and its default value is 10-08.
\anchor OPT_s_max s_max (advanced): Scaling threshold for the NLP error.
See paragraph after Eqn. (6) in the implementation paper. The valid range for this real option is 0 < s_max and its default value is 100.
\anchor OPT_max_iter max_iter: Maximum number of iterations.
The algorithm terminates with a message if the number of iterations exceeded this number. The valid range for this integer option is 0 ≤ max_iter and its default value is 3000.
\anchor OPT_max_wall_time max_wall_time: Maximum number of walltime clock seconds.
A limit on walltime clock seconds that Ipopt can use to solve one problem. If during the convergence check this limit is exceeded, Ipopt will terminate with a corresponding message. The valid range for this real option is 0 < max_wall_time and its default value is 10+20.
\anchor OPT_max_cpu_time max_cpu_time: Maximum number of CPU seconds.
A limit on CPU seconds that Ipopt can use to solve one problem. If during the convergence check this limit is exceeded, Ipopt will terminate with a corresponding message. The valid range for this real option is 0 < max_cpu_time and its default value is 10+20.
\anchor OPT_dual_inf_tol dual_inf_tol: Desired threshold for the dual infeasibility.
Absolute tolerance on the dual infeasibility. Successful termination requires that the max-norm of the (unscaled) dual infeasibility is less than this threshold. The valid range for this real option is 0 < dual_inf_tol and its default value is 1.
\anchor OPT_constr_viol_tol constr_viol_tol: Desired threshold for the constraint and variable bound violation.
Absolute tolerance on the constraint and variable bound violation. Successful termination requires that the max-norm of the (unscaled) constraint violation is less than this threshold. If option bound_relax_factor is not zero 0, then Ipopt relaxes given variable bounds. The value of constr_viol_tol is used to restrict the absolute amount of this bound relaxation. The valid range for this real option is 0 < constr_viol_tol and its default value is 0.0001.
\anchor OPT_compl_inf_tol compl_inf_tol: Desired threshold for the complementarity conditions.
Absolute tolerance on the complementarity. Successful termination requires that the max-norm of the (unscaled) complementarity is less than this threshold. The valid range for this real option is 0 < compl_inf_tol and its default value is 0.0001.
\anchor OPT_acceptable_tol acceptable_tol: "Acceptable" convergence tolerance (relative).
Determines which (scaled) overall optimality error is considered to be "acceptable". There are two levels of termination criteria. If the usual "desired" tolerances (see tol, dual_inf_tol etc) are satisfied at an iteration, the algorithm immediately terminates with a success message. On the other hand, if the algorithm encounters "acceptable_iter" many iterations in a row that are considered "acceptable", it will terminate before the desired convergence tolerance is met. This is useful in cases where the algorithm might not be able to achieve the "desired" level of accuracy. The valid range for this real option is 0 < acceptable_tol and its default value is 10-06.
\anchor OPT_acceptable_iter acceptable_iter: Number of "acceptable" iterates before triggering termination.
If the algorithm encounters this many successive "acceptable" iterates (see "acceptable_tol"), it terminates, assuming that the problem has been solved to best possible accuracy given round-off. If it is set to zero, this heuristic is disabled. The valid range for this integer option is 0 ≤ acceptable_iter and its default value is 15.
\anchor OPT_acceptable_dual_inf_tol acceptable_dual_inf_tol: "Acceptance" threshold for the dual infeasibility.
Absolute tolerance on the dual infeasibility. "Acceptable" termination requires that the (max-norm of the unscaled) dual infeasibility is less than this threshold; see also acceptable_tol. The valid range for this real option is 0 < acceptable_dual_inf_tol and its default value is 10+10.
\anchor OPT_acceptable_constr_viol_tol acceptable_constr_viol_tol: "Acceptance" threshold for the constraint violation.
Absolute tolerance on the constraint violation. "Acceptable" termination requires that the max-norm of the (unscaled) constraint violation is less than this threshold; see also acceptable_tol. The valid range for this real option is 0 < acceptable_constr_viol_tol and its default value is 0.01.
\anchor OPT_acceptable_compl_inf_tol acceptable_compl_inf_tol: "Acceptance" threshold for the complementarity conditions.
Absolute tolerance on the complementarity. "Acceptable" termination requires that the max-norm of the (unscaled) complementarity is less than this threshold; see also acceptable_tol. The valid range for this real option is 0 < acceptable_compl_inf_tol and its default value is 0.01.
\anchor OPT_acceptable_obj_change_tol acceptable_obj_change_tol: "Acceptance" stopping criterion based on objective function change.
If the relative change of the objective function (scaled by Max(1,|f(x)|)) is less than this value, this part of the acceptable tolerance termination is satisfied; see also acceptable_tol. This is useful for the quasi-Newton option, which has trouble to bring down the dual infeasibility. The valid range for this real option is 0 ≤ acceptable_obj_change_tol and its default value is 10+20.
\anchor OPT_diverging_iterates_tol diverging_iterates_tol: Threshold for maximal value of primal iterates.
If any component of the primal iterates exceeded this value (in absolute terms), the optimization is aborted with the exit message that the iterates seem to be diverging. The valid range for this real option is 0 < diverging_iterates_tol and its default value is 10+20.
\anchor OPT_mu_target mu_target: Desired value of complementarity.
Usually, the barrier parameter is driven to zero and the termination test for complementarity is measured with respect to zero complementarity. However, in some cases it might be desired to have Ipopt solve barrier problem for strictly positive value of the barrier parameter. In this case, the value of "mu_target" specifies the final value of the barrier parameter, and the termination tests are then defined with respect to the barrier problem for this value of the barrier parameter. The valid range for this real option is 0 ≤ mu_target and its default value is 0.
\subsection OPT_Output Output \anchor OPT_print_level print_level: Output verbosity level.
Sets the default verbosity level for console output. The larger this value the more detailed is the output. The valid range for this integer option is 0 ≤ print_level ≤ 12 and its default value is 5.
\anchor OPT_output_file output_file: File name of desired output file (leave unset for no file output).
NOTE: This option only works when read from the ipopt.opt options file! An output file with this name will be written (leave unset for no file output). The verbosity level is by default set to "print_level", but can be overridden with "file_print_level". The file name is changed to use only small letters. The default value for this string option is "". Possible values: - *: Any acceptable standard file name
\anchor OPT_file_print_level file_print_level: Verbosity level for output file.
NOTE: This option only works when read from the ipopt.opt options file! Determines the verbosity level for the file specified by "output_file". By default it is the same as "print_level". The valid range for this integer option is 0 ≤ file_print_level ≤ 12 and its default value is 5.
\anchor OPT_file_append file_append: Whether to append to output file, if set, instead of truncating.
NOTE: This option only works when read from the ipopt.opt options file! The default value for this string option is "no". Possible values: yes, no
\anchor OPT_print_user_options print_user_options: Print all options set by the user.
If selected, the algorithm will print the list of all options set by the user including their values and whether they have been used. In some cases this information might be incorrect, due to the internal program flow. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_print_options_documentation print_options_documentation: Switch to print all algorithmic options with some documentation before solving the optimization problem.
The default value for this string option is "no". Possible values: yes, no
\anchor OPT_print_timing_statistics print_timing_statistics: Switch to print timing statistics.
If selected, the program will print the time spend for selected tasks. This implies timing_statistics=yes. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_print_options_mode print_options_mode: format in which to print options documentation
The default value for this string option is "text". Possible values: - text: Ordinary text - latex: LaTeX formatted - doxygen: Doxygen (markdown) formatted
\anchor OPT_print_advanced_options print_advanced_options (advanced): whether to print also advanced options
The default value for this string option is "no". Possible values: yes, no
\anchor OPT_print_info_string print_info_string: Enables printing of additional info string at end of iteration output.
This string contains some insider information about the current iteration. For details, look for "Diagnostic Tags" in the Ipopt documentation. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_inf_pr_output inf_pr_output: Determines what value is printed in the "inf_pr" output column.
Ipopt works with a reformulation of the original problem, where slacks are introduced and the problem might have been scaled. The choice "internal" prints out the constraint violation of this formulation. With "original" the true constraint violation in the original NLP is printed. The default value for this string option is "original". Possible values: - internal: max-norm of violation of internal equality constraints - original: maximal constraint violation in original NLP
\anchor OPT_print_frequency_iter print_frequency_iter: Determines at which iteration frequency the summarizing iteration output line should be printed.
Summarizing iteration output is printed every print_frequency_iter iterations, if at least print_frequency_time seconds have passed since last output. The valid range for this integer option is 1 ≤ print_frequency_iter and its default value is 1.
\anchor OPT_print_frequency_time print_frequency_time: Determines at which time frequency the summarizing iteration output line should be printed.
Summarizing iteration output is printed if at least print_frequency_time seconds have passed since last output and the iteration number is a multiple of print_frequency_iter. The valid range for this real option is 0 ≤ print_frequency_time and its default value is 0.
\subsection OPT_NLP NLP \anchor OPT_nlp_lower_bound_inf nlp_lower_bound_inf: any bound less or equal this value will be considered -inf (i.e. not lower bounded).
The valid range for this real option is unrestricted and its default value is -10+19.
\anchor OPT_nlp_upper_bound_inf nlp_upper_bound_inf: any bound greater or this value will be considered +inf (i.e. not upper bounded).
The valid range for this real option is unrestricted and its default value is 10+19.
\anchor OPT_fixed_variable_treatment fixed_variable_treatment: Determines how fixed variables should be handled.
The main difference between those options is that the starting point in the "make_constraint" case still has the fixed variables at their given values, whereas in the case "make_parameter(_nodual)" the functions are always evaluated with the fixed values for those variables. Also, for "relax_bounds", the fixing bound constraints are relaxed (according to" bound_relax_factor"). For all but "make_parameter_nodual", bound multipliers are computed for the fixed variables. The default value for this string option is "make_parameter". Possible values: - make_parameter: Remove fixed variable from optimization variables - make_parameter_nodual: Remove fixed variable from optimization variables and do not compute bound multipliers for fixed variables - make_constraint: Add equality constraints fixing variables - relax_bounds: Relax fixing bound constraints
\anchor OPT_dependency_detector dependency_detector (advanced): Indicates which linear solver should be used to detect linearly dependent equality constraints.
This is experimental and does not work well. The default value for this string option is "none". Possible values: - none: don't check; no extra work at beginning - mumps: use MUMPS - wsmp: use WSMP - ma28: use MA28
\anchor OPT_dependency_detection_with_rhs dependency_detection_with_rhs (advanced): Indicates if the right hand sides of the constraints should be considered in addition to gradients during dependency detection
The default value for this string option is "no". Possible values: yes, no
\anchor OPT_num_linear_variables num_linear_variables (advanced): Number of linear variables
When the Hessian is approximated, it is assumed that the first num_linear_variables variables are linear. The Hessian is then not approximated in this space. If the get_number_of_nonlinear_variables method in the TNLP is implemented, this option is ignored. The valid range for this integer option is 0 ≤ num_linear_variables and its default value is 0.
\anchor OPT_jacobian_approximation jacobian_approximation (advanced): Specifies technique to compute constraint Jacobian
The default value for this string option is "exact". Possible values: - exact: user-provided derivatives - finite-difference-values: user-provided structure, values by finite differences
\anchor OPT_gradient_approximation gradient_approximation (advanced): Specifies technique to compute objective Gradient
The default value for this string option is "exact". Possible values: - exact: user-provided gradient - finite-difference-values: values by finite differences
\anchor OPT_findiff_perturbation findiff_perturbation (advanced): Size of the finite difference perturbation for derivative approximation.
This determines the relative perturbation of the variable entries. The valid range for this real option is 0 < findiff_perturbation and its default value is 10-07.
\anchor OPT_kappa_d kappa_d (advanced): Weight for linear damping term (to handle one-sided bounds).
See Section 3.7 in implementation paper. The valid range for this real option is 0 ≤ kappa_d and its default value is 10-05.
\anchor OPT_bound_relax_factor bound_relax_factor: Factor for initial relaxation of the bounds.
Before start of the optimization, the bounds given by the user are relaxed. This option sets the factor for this relaxation. Additional, the constraint violation tolerance constr_viol_tol is used to bound the relaxation by an absolute value. If it is set to zero, then then bounds relaxation is disabled. See Eqn.(35) in implementation paper. Note that the constraint violation reported by Ipopt at the end of the solution process does not include violations of the original (non-relaxed) variable bounds. See also option honor_original_bounds. The valid range for this real option is 0 ≤ bound_relax_factor and its default value is 10-08.
\anchor OPT_honor_original_bounds honor_original_bounds: Indicates whether final points should be projected into original bounds.
Ipopt might relax the bounds during the optimization (see, e.g., option "bound_relax_factor"). This option determines whether the final point should be projected back into the user-provide original bounds after the optimization. Note that violations of constraints and complementarity reported by Ipopt at the end of the solution process are for the non-projected point. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_check_derivatives_for_naninf check_derivatives_for_naninf: Indicates whether it is desired to check for Nan/Inf in derivative matrices
Activating this option will cause an error if an invalid number is detected in the constraint Jacobians or the Lagrangian Hessian. If this is not activated, the test is skipped, and the algorithm might proceed with invalid numbers and fail. If test is activated and an invalid number is detected, the matrix is written to output with print_level corresponding to J_MOREDETAILED (7); so beware of large output! The default value for this string option is "no". Possible values: yes, no
\anchor OPT_grad_f_constant grad_f_constant: Indicates whether to assume that the objective function is linear
Activating this option will cause Ipopt to ask for the Gradient of the objective function only once from the NLP and reuse this information later. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_jac_c_constant jac_c_constant: Indicates whether to assume that all equality constraints are linear
Activating this option will cause Ipopt to ask for the Jacobian of the equality constraints only once from the NLP and reuse this information later. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_jac_d_constant jac_d_constant: Indicates whether to assume that all inequality constraints are linear
Activating this option will cause Ipopt to ask for the Jacobian of the inequality constraints only once from the NLP and reuse this information later. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_hessian_constant hessian_constant: Indicates whether to assume the problem is a QP (quadratic objective, linear constraints)
Activating this option will cause Ipopt to ask for the Hessian of the Lagrangian function only once from the NLP and reuse this information later. The default value for this string option is "no". Possible values: yes, no
\subsection OPT_NLP_Scaling NLP Scaling \anchor OPT_nlp_scaling_method nlp_scaling_method: Select the technique used for scaling the NLP.
Selects the technique used for scaling the problem internally before it is solved. For user-scaling, the parameters come from the NLP. If you are using AMPL, they can be specified through suffixes ("scaling_factor") The default value for this string option is "gradient-based". Possible values: - none: no problem scaling will be performed - user-scaling: scaling parameters will come from the user - gradient-based: scale the problem so the maximum gradient at the starting point is nlp_scaling_max_gradient - equilibration-based: scale the problem so that first derivatives are of order 1 at random points (uses Harwell routine MC19)
\anchor OPT_obj_scaling_factor obj_scaling_factor: Scaling factor for the objective function.
This option sets a scaling factor for the objective function. The scaling is seen internally by Ipopt but the unscaled objective is reported in the console output. If additional scaling parameters are computed (e.g. user-scaling or gradient-based), both factors are multiplied. If this value is chosen to be negative, Ipopt will maximize the objective function instead of minimizing it. The valid range for this real option is unrestricted and its default value is 1.
\anchor OPT_nlp_scaling_max_gradient nlp_scaling_max_gradient: Maximum gradient after NLP scaling.
This is the gradient scaling cut-off. If the maximum gradient is above this value, then gradient based scaling will be performed. Scaling parameters are calculated to scale the maximum gradient back to this value. (This is g_max in Section 3.8 of the implementation paper.) Note: This option is only used if "nlp_scaling_method" is chosen as "gradient-based". The valid range for this real option is 0 < nlp_scaling_max_gradient and its default value is 100.
\anchor OPT_nlp_scaling_obj_target_gradient nlp_scaling_obj_target_gradient (advanced): Target value for objective function gradient size.
If a positive number is chosen, the scaling factor for the objective function is computed so that the gradient has the max norm of the given size at the starting point. This overrides nlp_scaling_max_gradient for the objective function. The valid range for this real option is 0 ≤ nlp_scaling_obj_target_gradient and its default value is 0.
\anchor OPT_nlp_scaling_constr_target_gradient nlp_scaling_constr_target_gradient (advanced): Target value for constraint function gradient size.
If a positive number is chosen, the scaling factors for the constraint functions are computed so that the gradient has the max norm of the given size at the starting point. This overrides nlp_scaling_max_gradient for the constraint functions. The valid range for this real option is 0 ≤ nlp_scaling_constr_target_gradient and its default value is 0.
\anchor OPT_nlp_scaling_min_value nlp_scaling_min_value: Minimum value of gradient-based scaling values.
This is the lower bound for the scaling factors computed by gradient-based scaling method. If some derivatives of some functions are huge, the scaling factors will otherwise become very small, and the (unscaled) final constraint violation, for example, might then be significant. Note: This option is only used if "nlp_scaling_method" is chosen as "gradient-based". The valid range for this real option is 0 ≤ nlp_scaling_min_value and its default value is 10-08.
\subsection OPT_Initialization Initialization \anchor OPT_bound_push bound_push: Desired minimum absolute distance from the initial point to bound.
Determines how much the initial point might have to be modified in order to be sufficiently inside the bounds (together with "bound_frac"). (This is kappa_1 in Section 3.6 of implementation paper.) The valid range for this real option is 0 < bound_push and its default value is 0.01.
\anchor OPT_bound_frac bound_frac: Desired minimum relative distance from the initial point to bound.
Determines how much the initial point might have to be modified in order to be sufficiently inside the bounds (together with "bound_push"). (This is kappa_2 in Section 3.6 of implementation paper.) The valid range for this real option is 0 < bound_frac ≤ 0.5 and its default value is 0.01.
\anchor OPT_slack_bound_push slack_bound_push: Desired minimum absolute distance from the initial slack to bound.
Determines how much the initial slack variables might have to be modified in order to be sufficiently inside the inequality bounds (together with "slack_bound_frac"). (This is kappa_1 in Section 3.6 of implementation paper.) The valid range for this real option is 0 < slack_bound_push and its default value is 0.01.
\anchor OPT_slack_bound_frac slack_bound_frac: Desired minimum relative distance from the initial slack to bound.
Determines how much the initial slack variables might have to be modified in order to be sufficiently inside the inequality bounds (together with "slack_bound_push"). (This is kappa_2 in Section 3.6 of implementation paper.) The valid range for this real option is 0 < slack_bound_frac ≤ 0.5 and its default value is 0.01.
\anchor OPT_constr_mult_init_max constr_mult_init_max: Maximum allowed least-square guess of constraint multipliers.
Determines how large the initial least-square guesses of the constraint multipliers are allowed to be (in max-norm). If the guess is larger than this value, it is discarded and all constraint multipliers are set to zero. This options is also used when initializing the restoration phase. By default, "resto.constr_mult_init_max" (the one used in RestoIterateInitializer) is set to zero. The valid range for this real option is 0 ≤ constr_mult_init_max and its default value is 1000.
\anchor OPT_bound_mult_init_val bound_mult_init_val: Initial value for the bound multipliers.
All dual variables corresponding to bound constraints are initialized to this value. The valid range for this real option is 0 < bound_mult_init_val and its default value is 1.
\anchor OPT_bound_mult_init_method bound_mult_init_method: Initialization method for bound multipliers
This option defines how the iterates for the bound multipliers are initialized. If "constant" is chosen, then all bound multipliers are initialized to the value of "bound_mult_init_val". If "mu-based" is chosen, then each value is initialized to the the value of "mu_init" divided by the corresponding slack variable. This latter option might be useful if the starting point is close to the optimal solution. The default value for this string option is "constant". Possible values: - constant: set all bound multipliers to the value of bound_mult_init_val - mu-based: initialize to mu_init/x_slack
\anchor OPT_least_square_init_primal least_square_init_primal: Least square initialization of the primal variables
If set to yes, Ipopt ignores the user provided point and solves a least square problem for the primal variables (x and s) to fit the linearized equality and inequality constraints.This might be useful if the user doesn't know anything about the starting point, or for solving an LP or QP. The default value for this string option is "no". Possible values: - no: take user-provided point - yes: overwrite user-provided point with least-square estimates
\anchor OPT_least_square_init_duals least_square_init_duals: Least square initialization of all dual variables
If set to yes, Ipopt tries to compute least-square multipliers (considering ALL dual variables). If successful, the bound multipliers are possibly corrected to be at least bound_mult_init_val. This might be useful if the user doesn't know anything about the starting point, or for solving an LP or QP. This overwrites option "bound_mult_init_method". The default value for this string option is "no". Possible values: - no: use bound_mult_init_val and least-square equality constraint multipliers - yes: overwrite user-provided point with least-square estimates
\subsection OPT_Warm_Start Warm Start \anchor OPT_warm_start_init_point warm_start_init_point: Warm-start for initial point
Indicates whether this optimization should use a warm start initialization, where values of primal and dual variables are given (e.g., from a previous optimization of a related problem.) The default value for this string option is "no". Possible values: - no: do not use the warm start initialization - yes: use the warm start initialization
\anchor OPT_warm_start_same_structure warm_start_same_structure (advanced): Indicates whether a problem with a structure identical to the previous one is to be solved.
If enabled, then the algorithm assumes that an NLP is now to be solved whose structure is identical to one that already was considered (with the same NLP object). The default value for this string option is "no". Possible values: yes, no
\anchor OPT_warm_start_bound_push warm_start_bound_push: same as bound_push for the regular initializer
The valid range for this real option is 0 < warm_start_bound_push and its default value is 0.001.
\anchor OPT_warm_start_bound_frac warm_start_bound_frac: same as bound_frac for the regular initializer
The valid range for this real option is 0 < warm_start_bound_frac ≤ 0.5 and its default value is 0.001.
\anchor OPT_warm_start_slack_bound_push warm_start_slack_bound_push: same as slack_bound_push for the regular initializer
The valid range for this real option is 0 < warm_start_slack_bound_push and its default value is 0.001.
\anchor OPT_warm_start_slack_bound_frac warm_start_slack_bound_frac: same as slack_bound_frac for the regular initializer
The valid range for this real option is 0 < warm_start_slack_bound_frac ≤ 0.5 and its default value is 0.001.
\anchor OPT_warm_start_mult_bound_push warm_start_mult_bound_push: same as mult_bound_push for the regular initializer
The valid range for this real option is 0 < warm_start_mult_bound_push and its default value is 0.001.
\anchor OPT_warm_start_mult_init_max warm_start_mult_init_max: Maximum initial value for the equality multipliers.
The valid range for this real option is unrestricted and its default value is 10+06.
\anchor OPT_warm_start_entire_iterate warm_start_entire_iterate (advanced): Tells algorithm whether to use the GetWarmStartIterate method in the NLP.
The default value for this string option is "no". Possible values: - no: call GetStartingPoint in the NLP - yes: call GetWarmStartIterate in the NLP
\anchor OPT_warm_start_target_mu warm_start_target_mu (advanced)
Experimental! The valid range for this real option is unrestricted and its default value is 0.
\subsection OPT_Miscellaneous Miscellaneous \anchor OPT_option_file_name option_file_name: File name of options file.
By default, the name of the Ipopt options file is "ipopt.opt" - or something else if specified in the IpoptApplication::Initialize call. If this option is set by SetStringValue BEFORE the options file is read, it specifies the name of the options file. It does not make any sense to specify this option within the options file. Setting this option to an empty string disables reading of an options file. The default value for this string option is "ipopt.opt". Possible values: - *: Any acceptable standard file name
\anchor OPT_replace_bounds replace_bounds (advanced): Whether all variable bounds should be replaced by inequality constraints
This option must be set for the inexact algorithm. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_skip_finalize_solution_call skip_finalize_solution_call (advanced): Whether a call to NLP::FinalizeSolution after optimization should be suppressed
In some Ipopt applications, the user might want to call the FinalizeSolution method separately. Setting this option to "yes" will cause the IpoptApplication object to suppress the default call to that method. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_timing_statistics timing_statistics: Indicates whether to measure time spend in components of Ipopt and NLP evaluation
The overall algorithm time is unaffected by this option. The default value for this string option is "no". Possible values: yes, no
\subsection OPT_Barrier_Parameter_Update Barrier Parameter Update \anchor OPT_mu_max_fact mu_max_fact: Factor for initialization of maximum value for barrier parameter.
This option determines the upper bound on the barrier parameter. This upper bound is computed as the average complementarity at the initial point times the value of this option. (Only used if option "mu_strategy" is chosen as "adaptive".) The valid range for this real option is 0 < mu_max_fact and its default value is 1000.
\anchor OPT_mu_max mu_max: Maximum value for barrier parameter.
This option specifies an upper bound on the barrier parameter in the adaptive mu selection mode. If this option is set, it overwrites the effect of mu_max_fact. (Only used if option "mu_strategy" is chosen as "adaptive".) The valid range for this real option is 0 < mu_max and its default value is 100000.
\anchor OPT_mu_min mu_min: Minimum value for barrier parameter.
This option specifies the lower bound on the barrier parameter in the adaptive mu selection mode. By default, it is set to the minimum of 1e-11 and min("tol","compl_inf_tol")/("barrier_tol_factor"+1), which should be a reasonable value. (Only used if option "mu_strategy" is chosen as "adaptive".) The valid range for this real option is 0 < mu_min and its default value is 10-11.
\anchor OPT_adaptive_mu_globalization adaptive_mu_globalization: Globalization strategy for the adaptive mu selection mode.
To achieve global convergence of the adaptive version, the algorithm has to switch to the monotone mode (Fiacco-McCormick approach) when convergence does not seem to appear. This option sets the criterion used to decide when to do this switch. (Only used if option "mu_strategy" is chosen as "adaptive".) The default value for this string option is "obj-constr-filter". Possible values: - kkt-error: nonmonotone decrease of kkt-error - obj-constr-filter: 2-dim filter for objective and constraint violation - never-monotone-mode: disables globalization
\anchor OPT_adaptive_mu_kkterror_red_iters adaptive_mu_kkterror_red_iters (advanced): Maximum number of iterations requiring sufficient progress.
For the "kkt-error" based globalization strategy, sufficient progress must be made for "adaptive_mu_kkterror_red_iters" iterations. If this number of iterations is exceeded, the globalization strategy switches to the monotone mode. The valid range for this integer option is 0 ≤ adaptive_mu_kkterror_red_iters and its default value is 4.
\anchor OPT_adaptive_mu_kkterror_red_fact adaptive_mu_kkterror_red_fact (advanced): Sufficient decrease factor for "kkt-error" globalization strategy.
For the "kkt-error" based globalization strategy, the error must decrease by this factor to be deemed sufficient decrease. The valid range for this real option is 0 < adaptive_mu_kkterror_red_fact < 1 and its default value is 0.9999.
\anchor OPT_filter_margin_fact filter_margin_fact (advanced): Factor determining width of margin for obj-constr-filter adaptive globalization strategy.
When using the adaptive globalization strategy, "obj-constr-filter", sufficient progress for a filter entry is defined as follows: (new obj) < (filter obj) - filter_margin_fact*(new constr-viol) OR (new constr-viol) < (filter constr-viol) - filter_margin_fact*(new constr-viol). For the description of the "kkt-error-filter" option see "filter_max_margin". The valid range for this real option is 0 < filter_margin_fact < 1 and its default value is 10-05.
\anchor OPT_filter_max_margin filter_max_margin (advanced): Maximum width of margin in obj-constr-filter adaptive globalization strategy.
The valid range for this real option is 0 < filter_max_margin and its default value is 1.
\anchor OPT_adaptive_mu_restore_previous_iterate adaptive_mu_restore_previous_iterate (advanced): Indicates if the previous accepted iterate should be restored if the monotone mode is entered.
When the globalization strategy for the adaptive barrier algorithm switches to the monotone mode, it can either start from the most recent iterate (no), or from the last iterate that was accepted (yes). The default value for this string option is "no". Possible values: yes, no
\anchor OPT_adaptive_mu_monotone_init_factor adaptive_mu_monotone_init_factor (advanced): Determines the initial value of the barrier parameter when switching to the monotone mode.
When the globalization strategy for the adaptive barrier algorithm switches to the monotone mode and fixed_mu_oracle is chosen as "average_compl", the barrier parameter is set to the current average complementarity times the value of "adaptive_mu_monotone_init_factor". The valid range for this real option is 0 < adaptive_mu_monotone_init_factor and its default value is 0.8.
\anchor OPT_adaptive_mu_kkt_norm_type adaptive_mu_kkt_norm_type (advanced): Norm used for the KKT error in the adaptive mu globalization strategies.
When computing the KKT error for the globalization strategies, the norm to be used is specified with this option. Note, this option is also used in the QualityFunctionMuOracle. The default value for this string option is "2-norm-squared". Possible values: - 1-norm: use the 1-norm (abs sum) - 2-norm-squared: use the 2-norm squared (sum of squares) - max-norm: use the infinity norm (max) - 2-norm: use 2-norm
\anchor OPT_mu_strategy mu_strategy: Update strategy for barrier parameter.
Determines which barrier parameter update strategy is to be used. The default value for this string option is "monotone". Possible values: - monotone: use the monotone (Fiacco-McCormick) strategy - adaptive: use the adaptive update strategy
\anchor OPT_mu_oracle mu_oracle: Oracle for a new barrier parameter in the adaptive strategy.
Determines how a new barrier parameter is computed in each "free-mode" iteration of the adaptive barrier parameter strategy. (Only considered if "adaptive" is selected for option "mu_strategy"). The default value for this string option is "quality-function". Possible values: - probing: Mehrotra's probing heuristic - loqo: LOQO's centrality rule - quality-function: minimize a quality function
\anchor OPT_fixed_mu_oracle fixed_mu_oracle: Oracle for the barrier parameter when switching to fixed mode.
Determines how the first value of the barrier parameter should be computed when switching to the "monotone mode" in the adaptive strategy. (Only considered if "adaptive" is selected for option "mu_strategy".) The default value for this string option is "average_compl". Possible values: - probing: Mehrotra's probing heuristic - loqo: LOQO's centrality rule - quality-function: minimize a quality function - average_compl: base on current average complementarity
\anchor OPT_mu_init mu_init: Initial value for the barrier parameter.
This option determines the initial value for the barrier parameter (mu). It is only relevant in the monotone, Fiacco-McCormick version of the algorithm. (i.e., if "mu_strategy" is chosen as "monotone") The valid range for this real option is 0 < mu_init and its default value is 0.1.
\anchor OPT_barrier_tol_factor barrier_tol_factor: Factor for mu in barrier stop test.
The convergence tolerance for each barrier problem in the monotone mode is the value of the barrier parameter times "barrier_tol_factor". This option is also used in the adaptive mu strategy during the monotone mode. This is kappa_epsilon in implementation paper. The valid range for this real option is 0 < barrier_tol_factor and its default value is 10.
\anchor OPT_mu_linear_decrease_factor mu_linear_decrease_factor: Determines linear decrease rate of barrier parameter.
For the Fiacco-McCormick update procedure the new barrier parameter mu is obtained by taking the minimum of mu*"mu_linear_decrease_factor" and mu^"superlinear_decrease_power". This is kappa_mu in implementation paper. This option is also used in the adaptive mu strategy during the monotone mode. The valid range for this real option is 0 < mu_linear_decrease_factor < 1 and its default value is 0.2.
\anchor OPT_mu_superlinear_decrease_power mu_superlinear_decrease_power: Determines superlinear decrease rate of barrier parameter.
For the Fiacco-McCormick update procedure the new barrier parameter mu is obtained by taking the minimum of mu*"mu_linear_decrease_factor" and mu^"superlinear_decrease_power". This is theta_mu in implementation paper. This option is also used in the adaptive mu strategy during the monotone mode. The valid range for this real option is 1 < mu_superlinear_decrease_power < 2 and its default value is 1.5.
\anchor OPT_mu_allow_fast_monotone_decrease mu_allow_fast_monotone_decrease (advanced): Allow skipping of barrier problem if barrier test is already met.
The default value for this string option is "yes". Possible values: - no: Take at least one iteration per barrier problem even if the barrier test is already met for the updated barrier parameter - yes: Allow fast decrease of mu if barrier test it met
\anchor OPT_tau_min tau_min (advanced): Lower bound on fraction-to-the-boundary parameter tau.
This is tau_min in the implementation paper. This option is also used in the adaptive mu strategy during the monotone mode. The valid range for this real option is 0 < tau_min < 1 and its default value is 0.99.
\anchor OPT_sigma_max sigma_max (advanced): Maximum value of the centering parameter.
This is the upper bound for the centering parameter chosen by the quality function based barrier parameter update. Only used if option "mu_oracle" is set to "quality-function". The valid range for this real option is 0 < sigma_max and its default value is 100.
\anchor OPT_sigma_min sigma_min (advanced): Minimum value of the centering parameter.
This is the lower bound for the centering parameter chosen by the quality function based barrier parameter update. Only used if option "mu_oracle" is set to "quality-function". The valid range for this real option is 0 ≤ sigma_min and its default value is 10-06.
\anchor OPT_quality_function_norm_type quality_function_norm_type (advanced): Norm used for components of the quality function.
Only used if option "mu_oracle" is set to "quality-function". The default value for this string option is "2-norm-squared". Possible values: - 1-norm: use the 1-norm (abs sum) - 2-norm-squared: use the 2-norm squared (sum of squares) - max-norm: use the infinity norm (max) - 2-norm: use 2-norm
\anchor OPT_quality_function_centrality quality_function_centrality (advanced): The penalty term for centrality that is included in quality function.
This determines whether a term is added to the quality function to penalize deviation from centrality with respect to complementarity. The complementarity measure here is the xi in the Loqo update rule. Only used if option "mu_oracle" is set to "quality-function". The default value for this string option is "none". Possible values: - none: no penalty term is added - log: complementarity * the log of the centrality measure - reciprocal: complementarity * the reciprocal of the centrality measure - cubed-reciprocal: complementarity * the reciprocal of the centrality measure cubed
\anchor OPT_quality_function_balancing_term quality_function_balancing_term (advanced): The balancing term included in the quality function for centrality.
This determines whether a term is added to the quality function that penalizes situations where the complementarity is much smaller than dual and primal infeasibilities. Only used if option "mu_oracle" is set to "quality-function". The default value for this string option is "none". Possible values: - none: no balancing term is added - cubic: Max(0,Max(dual_inf,primal_inf)-compl)^3
\anchor OPT_quality_function_max_section_steps quality_function_max_section_steps: Maximum number of search steps during direct search procedure determining the optimal centering parameter.
The golden section search is performed for the quality function based mu oracle. Only used if option "mu_oracle" is set to "quality-function". The valid range for this integer option is 0 ≤ quality_function_max_section_steps and its default value is 8.
\anchor OPT_quality_function_section_sigma_tol quality_function_section_sigma_tol (advanced): Tolerance for the section search procedure determining the optimal centering parameter (in sigma space).
The golden section search is performed for the quality function based mu oracle. Only used if option "mu_oracle" is set to "quality-function". The valid range for this real option is 0 ≤ quality_function_section_sigma_tol < 1 and its default value is 0.01.
\anchor OPT_quality_function_section_qf_tol quality_function_section_qf_tol (advanced): Tolerance for the golden section search procedure determining the optimal centering parameter (in the function value space).
The golden section search is performed for the quality function based mu oracle. Only used if option "mu_oracle" is set to "quality-function". The valid range for this real option is 0 ≤ quality_function_section_qf_tol < 1 and its default value is 0.
\subsection OPT_Line_Search Line Search \anchor OPT_line_search_method line_search_method (advanced): Globalization method used in backtracking line search
Only the "filter" choice is officially supported. But sometimes, good results might be obtained with the other choices. The default value for this string option is "filter". Possible values: - filter: Filter method - cg-penalty: Chen-Goldfarb penalty function - penalty: Standard penalty function
\anchor OPT_alpha_red_factor alpha_red_factor (advanced): Fractional reduction of the trial step size in the backtracking line search.
At every step of the backtracking line search, the trial step size is reduced by this factor. The valid range for this real option is 0 < alpha_red_factor < 1 and its default value is 0.5.
\anchor OPT_accept_every_trial_step accept_every_trial_step: Always accept the first trial step.
Setting this option to "yes" essentially disables the line search and makes the algorithm take aggressive steps, without global convergence guarantees. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_accept_after_max_steps accept_after_max_steps (advanced): Accept a trial point after maximal this number of steps even if it does not satisfy line search conditions.
Setting this to -1 disables this option. The valid range for this integer option is -1 ≤ accept_after_max_steps and its default value is -1.
\anchor OPT_alpha_for_y alpha_for_y: Method to determine the step size for constraint multipliers (alpha_y) .
The default value for this string option is "primal". Possible values: - primal: use primal step size - bound-mult: use step size for the bound multipliers (good for LPs) - min: use the min of primal and bound multipliers - max: use the max of primal and bound multipliers - full: take a full step of size one - min-dual-infeas: choose step size minimizing new dual infeasibility - safer-min-dual-infeas: like "min_dual_infeas", but safeguarded by "min" and "max" - primal-and-full: use the primal step size, and full step if delta_x <= alpha_for_y_tol - dual-and-full: use the dual step size, and full step if delta_x <= alpha_for_y_tol - acceptor: Call LSAcceptor to get step size for y
\anchor OPT_alpha_for_y_tol alpha_for_y_tol: Tolerance for switching to full equality multiplier steps.
This is only relevant if "alpha_for_y" is chosen "primal-and-full" or "dual-and-full". The step size for the equality constraint multipliers is taken to be one if the max-norm of the primal step is less than this tolerance. The valid range for this real option is 0 ≤ alpha_for_y_tol and its default value is 10.
\anchor OPT_tiny_step_tol tiny_step_tol (advanced): Tolerance for detecting numerically insignificant steps.
If the search direction in the primal variables (x and s) is, in relative terms for each component, less than this value, the algorithm accepts the full step without line search. If this happens repeatedly, the algorithm will terminate with a corresponding exit message. The default value is 10 times machine precision. The valid range for this real option is 0 ≤ tiny_step_tol and its default value is 2.22045 · 10-15.
\anchor OPT_tiny_step_y_tol tiny_step_y_tol (advanced): Tolerance for quitting because of numerically insignificant steps.
If the search direction in the primal variables (x and s) is, in relative terms for each component, repeatedly less than tiny_step_tol, and the step in the y variables is smaller than this threshold, the algorithm will terminate. The valid range for this real option is 0 ≤ tiny_step_y_tol and its default value is 0.01.
\anchor OPT_watchdog_shortened_iter_trigger watchdog_shortened_iter_trigger: Number of shortened iterations that trigger the watchdog.
If the number of successive iterations in which the backtracking line search did not accept the first trial point exceeds this number, the watchdog procedure is activated. Choosing "0" here disables the watchdog procedure. The valid range for this integer option is 0 ≤ watchdog_shortened_iter_trigger and its default value is 10.
\anchor OPT_watchdog_trial_iter_max watchdog_trial_iter_max: Maximum number of watchdog iterations.
This option determines the number of trial iterations allowed before the watchdog procedure is aborted and the algorithm returns to the stored point. The valid range for this integer option is 1 ≤ watchdog_trial_iter_max and its default value is 3.
\anchor OPT_theta_max_fact theta_max_fact (advanced): Determines upper bound for constraint violation in the filter.
The algorithmic parameter theta_max is determined as theta_max_fact times the maximum of 1 and the constraint violation at initial point. Any point with a constraint violation larger than theta_max is unacceptable to the filter (see Eqn. (21) in the implementation paper). The valid range for this real option is 0 < theta_max_fact and its default value is 10000.
\anchor OPT_theta_min_fact theta_min_fact (advanced): Determines constraint violation threshold in the switching rule.
The algorithmic parameter theta_min is determined as theta_min_fact times the maximum of 1 and the constraint violation at initial point. The switching rule treats an iteration as an h-type iteration whenever the current constraint violation is larger than theta_min (see paragraph before Eqn. (19) in the implementation paper). The valid range for this real option is 0 < theta_min_fact and its default value is 0.0001.
\anchor OPT_eta_phi eta_phi (advanced): Relaxation factor in the Armijo condition.
See Eqn. (20) in the implementation paper. The valid range for this real option is 0 < eta_phi < 0.5 and its default value is 10-08.
\anchor OPT_delta delta (advanced): Multiplier for constraint violation in the switching rule.
See Eqn. (19) in the implementation paper. The valid range for this real option is 0 < delta and its default value is 1.
\anchor OPT_s_phi s_phi (advanced): Exponent for linear barrier function model in the switching rule.
See Eqn. (19) in the implementation paper. The valid range for this real option is 1 < s_phi and its default value is 2.3.
\anchor OPT_s_theta s_theta (advanced): Exponent for current constraint violation in the switching rule.
See Eqn. (19) in the implementation paper. The valid range for this real option is 1 < s_theta and its default value is 1.1.
\anchor OPT_gamma_phi gamma_phi (advanced): Relaxation factor in the filter margin for the barrier function.
See Eqn. (18a) in the implementation paper. The valid range for this real option is 0 < gamma_phi < 1 and its default value is 10-08.
\anchor OPT_gamma_theta gamma_theta (advanced): Relaxation factor in the filter margin for the constraint violation.
See Eqn. (18b) in the implementation paper. The valid range for this real option is 0 < gamma_theta < 1 and its default value is 10-05.
\anchor OPT_alpha_min_frac alpha_min_frac (advanced): Safety factor for the minimal step size (before switching to restoration phase).
This is gamma_alpha in Eqn. (23) in the implementation paper. The valid range for this real option is 0 < alpha_min_frac < 1 and its default value is 0.05.
\anchor OPT_max_soc max_soc: Maximum number of second order correction trial steps at each iteration.
Choosing 0 disables the second order corrections. This is p^{max} of Step A-5.9 of Algorithm A in the implementation paper. The valid range for this integer option is 0 ≤ max_soc and its default value is 4.
\anchor OPT_kappa_soc kappa_soc (advanced): Factor in the sufficient reduction rule for second order correction.
This option determines how much a second order correction step must reduce the constraint violation so that further correction steps are attempted. See Step A-5.9 of Algorithm A in the implementation paper. The valid range for this real option is 0 < kappa_soc and its default value is 0.99.
\anchor OPT_obj_max_inc obj_max_inc (advanced): Determines the upper bound on the acceptable increase of barrier objective function.
Trial points are rejected if they lead to an increase in the barrier objective function by more than obj_max_inc orders of magnitude. The valid range for this real option is 1 < obj_max_inc and its default value is 5.
\anchor OPT_max_filter_resets max_filter_resets (advanced): Maximal allowed number of filter resets
A positive number enables a heuristic that resets the filter, whenever in more than "filter_reset_trigger" successive iterations the last rejected trial steps size was rejected because of the filter. This option determine the maximal number of resets that are allowed to take place. The valid range for this integer option is 0 ≤ max_filter_resets and its default value is 5.
\anchor OPT_filter_reset_trigger filter_reset_trigger (advanced): Number of iterations that trigger the filter reset.
If the filter reset heuristic is active and the number of successive iterations in which the last rejected trial step size was rejected because of the filter, the filter is reset. The valid range for this integer option is 1 ≤ filter_reset_trigger and its default value is 5.
\anchor OPT_corrector_type corrector_type (advanced): The type of corrector steps that should be taken.
If "mu_strategy" is "adaptive", this option determines what kind of corrector steps should be tried. Changing this option is experimental. The default value for this string option is "none". Possible values: - none: no corrector - affine: corrector step towards mu=0 - primal-dual: corrector step towards current mu
\anchor OPT_skip_corr_if_neg_curv skip_corr_if_neg_curv (advanced): Whether to skip the corrector step in negative curvature iteration.
The corrector step is not tried if negative curvature has been encountered during the computation of the search direction in the current iteration. This option is only used if "mu_strategy" is "adaptive". Changing this option is experimental. The default value for this string option is "yes". Possible values: yes, no
\anchor OPT_skip_corr_in_monotone_mode skip_corr_in_monotone_mode (advanced): Whether to skip the corrector step during monotone barrier parameter mode.
The corrector step is not tried if the algorithm is currently in the monotone mode (see also option "barrier_strategy"). This option is only used if "mu_strategy" is "adaptive". Changing this option is experimental. The default value for this string option is "yes". Possible values: yes, no
\anchor OPT_corrector_compl_avrg_red_fact corrector_compl_avrg_red_fact (advanced): Complementarity tolerance factor for accepting corrector step.
This option determines the factor by which complementarity is allowed to increase for a corrector step to be accepted. Changing this option is experimental. The valid range for this real option is 0 < corrector_compl_avrg_red_fact and its default value is 1.
\anchor OPT_soc_method soc_method: Ways to apply second order correction
This option determines the way to apply second order correction, 0 is the method described in the implementation paper. 1 is the modified way which adds alpha on the rhs of x and s rows. The valid range for this integer option is 0 ≤ soc_method ≤ 1 and its default value is 0.
\anchor OPT_nu_init nu_init (advanced): Initial value of the penalty parameter.
The valid range for this real option is 0 < nu_init and its default value is 10-06.
\anchor OPT_nu_inc nu_inc (advanced): Increment of the penalty parameter.
The valid range for this real option is 0 < nu_inc and its default value is 0.0001.
\anchor OPT_rho rho (advanced): Value in penalty parameter update formula.
The valid range for this real option is 0 < rho < 1 and its default value is 0.1.
\anchor OPT_kappa_sigma kappa_sigma (advanced): Factor limiting the deviation of dual variables from primal estimates.
If the dual variables deviate from their primal estimates, a correction is performed. See Eqn. (16) in the implementation paper. Setting the value to less than 1 disables the correction. The valid range for this real option is 0 < kappa_sigma and its default value is 10+10.
\anchor OPT_recalc_y recalc_y: Tells the algorithm to recalculate the equality and inequality multipliers as least square estimates.
This asks the algorithm to recompute the multipliers, whenever the current infeasibility is less than recalc_y_feas_tol. Choosing yes might be helpful in the quasi-Newton option. However, each recalculation requires an extra factorization of the linear system. If a limited memory quasi-Newton option is chosen, this is used by default. The default value for this string option is "no". Possible values: - no: use the Newton step to update the multipliers - yes: use least-square multiplier estimates
\anchor OPT_recalc_y_feas_tol recalc_y_feas_tol: Feasibility threshold for recomputation of multipliers.
If recalc_y is chosen and the current infeasibility is less than this value, then the multipliers are recomputed. The valid range for this real option is 0 < recalc_y_feas_tol and its default value is 10-06.
\anchor OPT_slack_move slack_move (advanced): Correction size for very small slacks.
Due to numerical issues or the lack of an interior, the slack variables might become very small. If a slack becomes very small compared to machine precision, the corresponding bound is moved slightly. This parameter determines how large the move should be. Its default value is mach_eps^{3/4}. See also end of Section 3.5 in implementation paper - but actual implementation might be somewhat different. The valid range for this real option is 0 ≤ slack_move and its default value is 1.81899 · 10-12.
\anchor OPT_constraint_violation_norm_type constraint_violation_norm_type (advanced): Norm to be used for the constraint violation in the line search.
Determines which norm should be used when the algorithm computes the constraint violation in the line search. The default value for this string option is "1-norm". Possible values: - 1-norm: use the 1-norm - 2-norm: use the 2-norm - max-norm: use the infinity norm
\subsection OPT_Linear_Solver Linear Solver \anchor OPT_linear_solver linear_solver: Linear solver used for step computations.
Determines which linear algebra package is to be used for the solution of the augmented linear system (for obtaining the search directions). The default value for this string option is "ma27". Possible values: - ma27: use the Harwell routine MA27 - ma57: use the Harwell routine MA57 - ma77: use the Harwell routine HSL_MA77 - ma86: use the Harwell routine HSL_MA86 - ma97: use the Harwell routine HSL_MA97 - pardiso: use the Pardiso package from pardiso-project.org - pardisomkl: use the Pardiso package from Intel MKL - spral: use the Spral package - wsmp: use the Wsmp package - mumps: use the Mumps package - custom: use custom linear solver (expert use)
\anchor OPT_linear_system_scaling linear_system_scaling: Method for scaling the linear system.
Determines the method used to compute symmetric scaling factors for the augmented system (see also the "linear_scaling_on_demand" option). This scaling is independent of the NLP problem scaling. The default is MC19 only if MA27, MA57, MA77, or MA86 are selected as linear solvers. Otherwise it is 'none'. The default value for this string option is "mc19". Possible values: - none: no scaling will be performed - mc19: use the Harwell routine MC19 - slack-based: use the slack values
\anchor OPT_hsllib hsllib: Name of library containing HSL routines for load at runtime
The default value for this string option is "libhsl.so" ("libhsl.dylib" on macOS, "libhsl.dll" on Windows). Possible values: - *: Any acceptable filename (may contain path, too)
\anchor OPT_pardisolib pardisolib: Name of library containing Pardiso routines (from pardiso-project.org) for load at runtime
The default value for this string option is "/home/stefan/work/coin/libpardiso600-GNU800-X86-64.so". Possible values: - *: Any acceptable filename (may contain path, too)
\anchor OPT_linear_scaling_on_demand linear_scaling_on_demand: Flag indicating that linear scaling is only done if it seems required.
This option is only important if a linear scaling method (e.g., mc19) is used. If you choose "no", then the scaling factors are computed for every linear system from the start. This can be quite expensive. Choosing "yes" means that the algorithm will start the scaling method only when the solutions to the linear system seem not good, and then use it until the end. The default value for this string option is "yes". Possible values: yes, no
\subsection OPT_Step_Calculation Step Calculation \anchor OPT_mehrotra_algorithm mehrotra_algorithm: Indicates whether to do Mehrotra's predictor-corrector algorithm.
If enabled, line search is disabled and the (unglobalized) adaptive mu strategy is chosen with the "probing" oracle, and "corrector_type=affine" is used without any safeguards; you should not set any of those options explicitly in addition. Also, unless otherwise specified, the values of "bound_push", "bound_frac", and "bound_mult_init_val" are set more aggressive, and sets "alpha_for_y=bound_mult". The Mehrotra's predictor-corrector algorithm works usually very well for LPs and convex QPs. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_fast_step_computation fast_step_computation: Indicates if the linear system should be solved quickly.
If enabled, the algorithm assumes that the linear system that is solved to obtain the search direction is solved sufficiently well. In that case, no residuals are computed to verify the solution and the computation of the search direction is a little faster. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_min_refinement_steps min_refinement_steps: Minimum number of iterative refinement steps per linear system solve.
Iterative refinement (on the full unsymmetric system) is performed for each right hand side. This option determines the minimum number of iterative refinements (i.e. at least "min_refinement_steps" iterative refinement steps are enforced per right hand side.) The valid range for this integer option is 0 ≤ min_refinement_steps and its default value is 1.
\anchor OPT_max_refinement_steps max_refinement_steps: Maximum number of iterative refinement steps per linear system solve.
Iterative refinement (on the full unsymmetric system) is performed for each right hand side. This option determines the maximum number of iterative refinement steps. The valid range for this integer option is 0 ≤ max_refinement_steps and its default value is 10.
\anchor OPT_residual_ratio_max residual_ratio_max (advanced): Iterative refinement tolerance
Iterative refinement is performed until the residual test ratio is less than this tolerance (or until "max_refinement_steps" refinement steps are performed). The valid range for this real option is 0 < residual_ratio_max and its default value is 10-10.
\anchor OPT_residual_ratio_singular residual_ratio_singular (advanced): Threshold for declaring linear system singular after failed iterative refinement.
If the residual test ratio is larger than this value after failed iterative refinement, the algorithm pretends that the linear system is singular. The valid range for this real option is 0 < residual_ratio_singular and its default value is 10-05.
\anchor OPT_residual_improvement_factor residual_improvement_factor (advanced): Minimal required reduction of residual test ratio in iterative refinement.
If the improvement of the residual test ratio made by one iterative refinement step is not better than this factor, iterative refinement is aborted. The valid range for this real option is 0 < residual_improvement_factor and its default value is 1.
\anchor OPT_neg_curv_test_tol neg_curv_test_tol: Tolerance for heuristic to ignore wrong inertia.
If nonzero, incorrect inertia in the augmented system is ignored, and Ipopt tests if the direction is a direction of positive curvature. This tolerance is alpha_n in the paper by Zavala and Chiang (2014) and it determines when the direction is considered to be sufficiently positive. A value in the range of [1e-12, 1e-11] is recommended. The valid range for this real option is 0 ≤ neg_curv_test_tol and its default value is 0.
\anchor OPT_neg_curv_test_reg neg_curv_test_reg: Whether to do the curvature test with the primal regularization (see Zavala and Chiang, 2014).
The default value for this string option is "yes". Possible values: - yes: use primal regularization with the inertia-free curvature test - no: use original IPOPT approach, in which the primal regularization is ignored
\anchor OPT_max_hessian_perturbation max_hessian_perturbation: Maximum value of regularization parameter for handling negative curvature.
In order to guarantee that the search directions are indeed proper descent directions, Ipopt requires that the inertia of the (augmented) linear system for the step computation has the correct number of negative and positive eigenvalues. The idea is that this guides the algorithm away from maximizers and makes Ipopt more likely converge to first order optimal points that are minimizers. If the inertia is not correct, a multiple of the identity matrix is added to the Hessian of the Lagrangian in the augmented system. This parameter gives the maximum value of the regularization parameter. If a regularization of that size is not enough, the algorithm skips this iteration and goes to the restoration phase. This is delta_w^max in the implementation paper. The valid range for this real option is 0 < max_hessian_perturbation and its default value is 10+20.
\anchor OPT_min_hessian_perturbation min_hessian_perturbation: Smallest perturbation of the Hessian block.
The size of the perturbation of the Hessian block is never selected smaller than this value, unless no perturbation is necessary. This is delta_w^min in implementation paper. The valid range for this real option is 0 ≤ min_hessian_perturbation and its default value is 10-20.
\anchor OPT_perturb_inc_fact_first perturb_inc_fact_first: Increase factor for x-s perturbation for very first perturbation.
The factor by which the perturbation is increased when a trial value was not sufficient - this value is used for the computation of the very first perturbation and allows a different value for the first perturbation than that used for the remaining perturbations. This is bar_kappa_w^+ in the implementation paper. The valid range for this real option is 1 < perturb_inc_fact_first and its default value is 100.
\anchor OPT_perturb_inc_fact perturb_inc_fact: Increase factor for x-s perturbation.
The factor by which the perturbation is increased when a trial value was not sufficient - this value is used for the computation of all perturbations except for the first. This is kappa_w^+ in the implementation paper. The valid range for this real option is 1 < perturb_inc_fact and its default value is 8.
\anchor OPT_perturb_dec_fact perturb_dec_fact: Decrease factor for x-s perturbation.
The factor by which the perturbation is decreased when a trial value is deduced from the size of the most recent successful perturbation. This is kappa_w^- in the implementation paper. The valid range for this real option is 0 < perturb_dec_fact < 1 and its default value is 0.333333.
\anchor OPT_first_hessian_perturbation first_hessian_perturbation: Size of first x-s perturbation tried.
The first value tried for the x-s perturbation in the inertia correction scheme. This is delta_0 in the implementation paper. The valid range for this real option is 0 < first_hessian_perturbation and its default value is 0.0001.
\anchor OPT_jacobian_regularization_value jacobian_regularization_value: Size of the regularization for rank-deficient constraint Jacobians.
This is bar delta_c in the implementation paper. The valid range for this real option is 0 ≤ jacobian_regularization_value and its default value is 10-08.
\anchor OPT_jacobian_regularization_exponent jacobian_regularization_exponent (advanced): Exponent for mu in the regularization for rank-deficient constraint Jacobians.
This is kappa_c in the implementation paper. The valid range for this real option is 0 ≤ jacobian_regularization_exponent and its default value is 0.25.
\anchor OPT_perturb_always_cd perturb_always_cd (advanced): Active permanent perturbation of constraint linearization.
Enabling this option leads to using the delta_c and delta_d perturbation for the computation of every search direction. Usually, it is only used when the iteration matrix is singular. The default value for this string option is "no". Possible values: yes, no
\subsection OPT_Restoration_Phase Restoration Phase \anchor OPT_expect_infeasible_problem expect_infeasible_problem: Enable heuristics to quickly detect an infeasible problem.
This options is meant to activate heuristics that may speed up the infeasibility determination if you expect that there is a good chance for the problem to be infeasible. In the filter line search procedure, the restoration phase is called more quickly than usually, and more reduction in the constraint violation is enforced before the restoration phase is left. If the problem is square, this option is enabled automatically. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_expect_infeasible_problem_ctol expect_infeasible_problem_ctol: Threshold for disabling "expect_infeasible_problem" option.
If the constraint violation becomes smaller than this threshold, the "expect_infeasible_problem" heuristics in the filter line search are disabled. If the problem is square, this options is set to 0. The valid range for this real option is 0 ≤ expect_infeasible_problem_ctol and its default value is 0.001.
\anchor OPT_expect_infeasible_problem_ytol expect_infeasible_problem_ytol: Multiplier threshold for activating "expect_infeasible_problem" option.
If the max norm of the constraint multipliers becomes larger than this value and "expect_infeasible_problem" is chosen, then the restoration phase is entered. The valid range for this real option is 0 < expect_infeasible_problem_ytol and its default value is 10+08.
\anchor OPT_start_with_resto start_with_resto: Whether to switch to restoration phase in first iteration.
Setting this option to "yes" forces the algorithm to switch to the feasibility restoration phase in the first iteration. If the initial point is feasible, the algorithm will abort with a failure. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_soft_resto_pderror_reduction_factor soft_resto_pderror_reduction_factor: Required reduction in primal-dual error in the soft restoration phase.
The soft restoration phase attempts to reduce the primal-dual error with regular steps. If the damped primal-dual step (damped only to satisfy the fraction-to-the-boundary rule) is not decreasing the primal-dual error by at least this factor, then the regular restoration phase is called. Choosing "0" here disables the soft restoration phase. The valid range for this real option is 0 ≤ soft_resto_pderror_reduction_factor and its default value is 0.9999.
\anchor OPT_max_soft_resto_iters max_soft_resto_iters (advanced): Maximum number of iterations performed successively in soft restoration phase.
If the soft restoration phase is performed for more than so many iterations in a row, the regular restoration phase is called. The valid range for this integer option is 0 ≤ max_soft_resto_iters and its default value is 10.
\anchor OPT_required_infeasibility_reduction required_infeasibility_reduction: Required reduction of infeasibility before leaving restoration phase.
The restoration phase algorithm is performed, until a point is found that is acceptable to the filter and the infeasibility has been reduced by at least the fraction given by this option. The valid range for this real option is 0 ≤ required_infeasibility_reduction < 1 and its default value is 0.9.
\anchor OPT_max_resto_iter max_resto_iter (advanced): Maximum number of successive iterations in restoration phase.
The algorithm terminates with an error message if the number of iterations successively taken in the restoration phase exceeds this number. The valid range for this integer option is 0 ≤ max_resto_iter and its default value is 3000000.
\anchor OPT_evaluate_orig_obj_at_resto_trial evaluate_orig_obj_at_resto_trial: Determines if the original objective function should be evaluated at restoration phase trial points.
Enabling this option makes the restoration phase algorithm evaluate the objective function of the original problem at every trial point encountered during the restoration phase, even if this value is not required. In this way, it is guaranteed that the original objective function can be evaluated without error at all accepted iterates; otherwise the algorithm might fail at a point where the restoration phase accepts an iterate that is good for the restoration phase problem, but not the original problem. On the other hand, if the evaluation of the original objective is expensive, this might be costly. The default value for this string option is "yes". Possible values: yes, no
\anchor OPT_resto_penalty_parameter resto_penalty_parameter (advanced): Penalty parameter in the restoration phase objective function.
This is the parameter rho in equation (31a) in the Ipopt implementation paper. The valid range for this real option is 0 < resto_penalty_parameter and its default value is 1000.
\anchor OPT_resto_proximity_weight resto_proximity_weight (advanced): Weighting factor for the proximity term in restoration phase objective.
This determines how the parameter zeta in equation (29a) in the implementation paper is computed. zeta here is resto_proximity_weight*sqrt(mu), where mu is the current barrier parameter. The valid range for this real option is 0 ≤ resto_proximity_weight and its default value is 1.
\anchor OPT_bound_mult_reset_threshold bound_mult_reset_threshold: Threshold for resetting bound multipliers after the restoration phase.
After returning from the restoration phase, the bound multipliers are updated with a Newton step for complementarity. Here, the change in the primal variables during the entire restoration phase is taken to be the corresponding primal Newton step. However, if after the update the largest bound multiplier exceeds the threshold specified by this option, the multipliers are all reset to 1. The valid range for this real option is 0 ≤ bound_mult_reset_threshold and its default value is 1000.
\anchor OPT_constr_mult_reset_threshold constr_mult_reset_threshold: Threshold for resetting equality and inequality multipliers after restoration phase.
After returning from the restoration phase, the constraint multipliers are recomputed by a least square estimate. This option triggers when those least-square estimates should be ignored. The valid range for this real option is 0 ≤ constr_mult_reset_threshold and its default value is 0.
\anchor OPT_resto_failure_feasibility_threshold resto_failure_feasibility_threshold (advanced): Threshold for primal infeasibility to declare failure of restoration phase.
If the restoration phase is terminated because of the "acceptable" termination criteria and the primal infeasibility is smaller than this value, the restoration phase is declared to have failed. The default value is actually 1e2*tol, where tol is the general termination tolerance. The valid range for this real option is 0 ≤ resto_failure_feasibility_threshold and its default value is 0.
\subsection OPT_Hessian_Approximation Hessian Approximation \anchor OPT_limited_memory_aug_solver limited_memory_aug_solver (advanced): Strategy for solving the augmented system for low-rank Hessian.
The default value for this string option is "sherman-morrison". Possible values: - sherman-morrison: use Sherman-Morrison formula - extended: use an extended augmented system
\anchor OPT_limited_memory_max_history limited_memory_max_history: Maximum size of the history for the limited quasi-Newton Hessian approximation.
This option determines the number of most recent iterations that are taken into account for the limited-memory quasi-Newton approximation. The valid range for this integer option is 0 ≤ limited_memory_max_history and its default value is 6.
\anchor OPT_limited_memory_update_type limited_memory_update_type: Quasi-Newton update formula for the limited memory quasi-Newton approximation.
The default value for this string option is "bfgs". Possible values: - bfgs: BFGS update (with skipping) - sr1: SR1 (not working well)
\anchor OPT_limited_memory_initialization limited_memory_initialization: Initialization strategy for the limited memory quasi-Newton approximation.
Determines how the diagonal Matrix B_0 as the first term in the limited memory approximation should be computed. The default value for this string option is "scalar1". Possible values: - scalar1: sigma = s^Ty/s^Ts - scalar2: sigma = y^Ty/s^Ty - scalar3: arithmetic average of scalar1 and scalar2 - scalar4: geometric average of scalar1 and scalar2 - constant: sigma = limited_memory_init_val
\anchor OPT_limited_memory_init_val limited_memory_init_val: Value for B0 in low-rank update.
The starting matrix in the low rank update, B0, is chosen to be this multiple of the identity in the first iteration (when no updates have been performed yet), and is constantly chosen as this value, if "limited_memory_initialization" is "constant". The valid range for this real option is 0 < limited_memory_init_val and its default value is 1.
\anchor OPT_limited_memory_init_val_max limited_memory_init_val_max: Upper bound on value for B0 in low-rank update.
The starting matrix in the low rank update, B0, is chosen to be this multiple of the identity in the first iteration (when no updates have been performed yet), and is constantly chosen as this value, if "limited_memory_initialization" is "constant". The valid range for this real option is 0 < limited_memory_init_val_max and its default value is 10+08.
\anchor OPT_limited_memory_init_val_min limited_memory_init_val_min: Lower bound on value for B0 in low-rank update.
The starting matrix in the low rank update, B0, is chosen to be this multiple of the identity in the first iteration (when no updates have been performed yet), and is constantly chosen as this value, if "limited_memory_initialization" is "constant". The valid range for this real option is 0 < limited_memory_init_val_min and its default value is 10-08.
\anchor OPT_limited_memory_max_skipping limited_memory_max_skipping: Threshold for successive iterations where update is skipped.
If the update is skipped more than this number of successive iterations, the quasi-Newton approximation is reset. The valid range for this integer option is 1 ≤ limited_memory_max_skipping and its default value is 2.
\anchor OPT_limited_memory_special_for_resto limited_memory_special_for_resto: Determines if the quasi-Newton updates should be special during the restoration phase.
Until Nov 2010, Ipopt used a special update during the restoration phase, but it turned out that this does not work well. The new default uses the regular update procedure and it improves results. If for some reason you want to get back to the original update, set this option to "yes". The default value for this string option is "no". Possible values: yes, no
\anchor OPT_hessian_approximation hessian_approximation: Indicates what Hessian information is to be used.
This determines which kind of information for the Hessian of the Lagrangian function is used by the algorithm. The default value for this string option is "exact". Possible values: - exact: Use second derivatives provided by the NLP. - limited-memory: Perform a limited-memory quasi-Newton approximation
\anchor OPT_hessian_approximation_space hessian_approximation_space (advanced): Indicates in which subspace the Hessian information is to be approximated.
The default value for this string option is "nonlinear-variables". Possible values: - nonlinear-variables: only in space of nonlinear variables. - all-variables: in space of all variables (without slacks)
\subsection OPT_Derivative_Checker Derivative Checker \anchor OPT_derivative_test derivative_test: Enable derivative checker
If this option is enabled, a (slow!) derivative test will be performed before the optimization. The test is performed at the user provided starting point and marks derivative values that seem suspicious The default value for this string option is "none". Possible values: - none: do not perform derivative test - first-order: perform test of first derivatives at starting point - second-order: perform test of first and second derivatives at starting point - only-second-order: perform test of second derivatives at starting point
\anchor OPT_derivative_test_first_index derivative_test_first_index: Index of first quantity to be checked by derivative checker
If this is set to -2, then all derivatives are checked. Otherwise, for the first derivative test it specifies the first variable for which the test is done (counting starts at 0). For second derivatives, it specifies the first constraint for which the test is done; counting of constraint indices starts at 0, and -1 refers to the objective function Hessian. The valid range for this integer option is -2 ≤ derivative_test_first_index and its default value is -2.
\anchor OPT_derivative_test_perturbation derivative_test_perturbation: Size of the finite difference perturbation in derivative test.
This determines the relative perturbation of the variable entries. The valid range for this real option is 0 < derivative_test_perturbation and its default value is 10-08.
\anchor OPT_derivative_test_tol derivative_test_tol: Threshold for indicating wrong derivative.
If the relative deviation of the estimated derivative from the given one is larger than this value, the corresponding derivative is marked as wrong. The valid range for this real option is 0 < derivative_test_tol and its default value is 0.0001.
\anchor OPT_derivative_test_print_all derivative_test_print_all: Indicates whether information for all estimated derivatives should be printed.
Determines verbosity of derivative checker. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_point_perturbation_radius point_perturbation_radius: Maximal perturbation of an evaluation point.
If a random perturbation of a points is required, this number indicates the maximal perturbation. This is for example used when determining the center point at which the finite difference derivative test is executed. The valid range for this real option is 0 ≤ point_perturbation_radius and its default value is 10.
\subsection OPT_MA27_Linear_Solver MA27 Linear Solver \anchor OPT_ma27_print_level ma27_print_level: Debug printing level for the linear solver MA27
0: no printing; 1: Error messages only; 2: Error and warning messages; 3: Error and warning messages and terse monitoring; 4: All information. The valid range for this integer option is 0 ≤ ma27_print_level ≤ 4 and its default value is 0.
\anchor OPT_ma27_pivtol ma27_pivtol: Pivot tolerance for the linear solver MA27.
A smaller number pivots for sparsity, a larger number pivots for stability. The valid range for this real option is 0 < ma27_pivtol < 1 and its default value is 10-08.
\anchor OPT_ma27_pivtolmax ma27_pivtolmax: Maximum pivot tolerance for the linear solver MA27.
Ipopt may increase pivtol as high as ma27_pivtolmax to get a more accurate solution to the linear system. The valid range for this real option is 0 < ma27_pivtolmax < 1 and its default value is 0.0001.
\anchor OPT_ma27_liw_init_factor ma27_liw_init_factor: Integer workspace memory for MA27.
The initial integer workspace memory = liw_init_factor * memory required by unfactored system. Ipopt will increase the workspace size by ma27_meminc_factor if required. The valid range for this real option is 1 ≤ ma27_liw_init_factor and its default value is 5.
\anchor OPT_ma27_la_init_factor ma27_la_init_factor: Real workspace memory for MA27.
The initial real workspace memory = la_init_factor * memory required by unfactored system. Ipopt will increase the workspace size by ma27_meminc_factor if required. The valid range for this real option is 1 ≤ ma27_la_init_factor and its default value is 5.
\anchor OPT_ma27_meminc_factor ma27_meminc_factor: Increment factor for workspace size for MA27.
If the integer or real workspace is not large enough, Ipopt will increase its size by this factor. The valid range for this real option is 1 ≤ ma27_meminc_factor and its default value is 2.
\anchor OPT_ma27_skip_inertia_check ma27_skip_inertia_check (advanced): Whether to always pretend that inertia is correct.
Setting this option to "yes" essentially disables inertia check. This option makes the algorithm non-robust and easily fail, but it might give some insight into the necessity of inertia control. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_ma27_ignore_singularity ma27_ignore_singularity (advanced): Whether to use MA27's ability to solve a linear system even if the matrix is singular.
Setting this option to "yes" means that Ipopt will call MA27 to compute solutions for right hand sides, even if MA27 has detected that the matrix is singular (but is still able to solve the linear system). In some cases this might be better than using Ipopt's heuristic of small perturbation of the lower diagonal of the KKT matrix. The default value for this string option is "no". Possible values: yes, no
\subsection OPT_MA57_Linear_Solver MA57 Linear Solver \anchor OPT_ma57_print_level ma57_print_level: Debug printing level for the linear solver MA57
0: no printing; 1: Error messages only; 2: Error and warning messages; 3: Error and warning messages and terse monitoring; >=4: All information. The valid range for this integer option is 0 ≤ ma57_print_level and its default value is 0.
\anchor OPT_ma57_pivtol ma57_pivtol: Pivot tolerance for the linear solver MA57.
A smaller number pivots for sparsity, a larger number pivots for stability. The valid range for this real option is 0 < ma57_pivtol < 1 and its default value is 10-08.
\anchor OPT_ma57_pivtolmax ma57_pivtolmax: Maximum pivot tolerance for the linear solver MA57.
Ipopt may increase pivtol as high as ma57_pivtolmax to get a more accurate solution to the linear system. The valid range for this real option is 0 < ma57_pivtolmax < 1 and its default value is 0.0001.
\anchor OPT_ma57_pre_alloc ma57_pre_alloc: Safety factor for work space memory allocation for the linear solver MA57.
If 1 is chosen, the suggested amount of work space is used. However, choosing a larger number might avoid reallocation if the suggest values do not suffice. The valid range for this real option is 1 ≤ ma57_pre_alloc and its default value is 1.05.
\anchor OPT_ma57_pivot_order ma57_pivot_order: Controls pivot order in MA57
This is ICNTL(6) in MA57. The valid range for this integer option is 0 ≤ ma57_pivot_order ≤ 5 and its default value is 5.
\anchor OPT_ma57_automatic_scaling ma57_automatic_scaling: Controls whether to enable automatic scaling in MA57
For higher reliability of the MA57 solver, you may want to set this option to yes. This is ICNTL(15) in MA57. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_ma57_block_size ma57_block_size: Controls block size used by Level 3 BLAS in MA57BD
This is ICNTL(11) in MA57. The valid range for this integer option is 1 ≤ ma57_block_size and its default value is 16.
\anchor OPT_ma57_node_amalgamation ma57_node_amalgamation: Node amalgamation parameter
This is ICNTL(12) in MA57. The valid range for this integer option is 1 ≤ ma57_node_amalgamation and its default value is 16.
\anchor OPT_ma57_small_pivot_flag ma57_small_pivot_flag: Handling of small pivots
If set to 1, then when small entries defined by CNTL(2) are detected they are removed and the corresponding pivots placed at the end of the factorization. This can be particularly efficient if the matrix is highly rank deficient. This is ICNTL(16) in MA57. The valid range for this integer option is 0 ≤ ma57_small_pivot_flag ≤ 1 and its default value is 0.
\subsection OPT_MA77_Linear_Solver MA77 Linear Solver \anchor OPT_ma77_print_level ma77_print_level: Debug printing level for the linear solver MA77
<0: no printing; 0: Error and warning messages only; 1: Limited diagnostic printing; >1 Additional diagnostic printing. The valid range for this integer option is unrestricted and its default value is -1.
\anchor OPT_ma77_buffer_lpage ma77_buffer_lpage: Number of scalars per MA77 in-core buffer page in the out-of-core solver MA77
Must be at most ma77_file_size. The valid range for this integer option is 1 ≤ ma77_buffer_lpage and its default value is 4096.
\anchor OPT_ma77_buffer_npage ma77_buffer_npage: Number of pages that make up MA77 buffer
Number of pages of size buffer_lpage that exist in-core for the out-of-core solver MA77. The valid range for this integer option is 1 ≤ ma77_buffer_npage and its default value is 1600.
\anchor OPT_ma77_file_size ma77_file_size: Target size of each temporary file for MA77, scalars per type
MA77 uses many temporary files, this option controls the size of each one. It is measured in the number of entries (int or double), NOT bytes. The valid range for this integer option is 1 ≤ ma77_file_size and its default value is 2097152.
\anchor OPT_ma77_maxstore ma77_maxstore: Maximum storage size for MA77 in-core mode
If greater than zero, the maximum size of factors stored in core before out-of-core mode is invoked. The valid range for this integer option is 0 ≤ ma77_maxstore and its default value is 0.
\anchor OPT_ma77_nemin ma77_nemin: Node Amalgamation parameter
Two nodes in elimination tree are merged if result has fewer than ma77_nemin variables. The valid range for this integer option is 1 ≤ ma77_nemin and its default value is 8.
\anchor OPT_ma77_small ma77_small: Zero Pivot Threshold
Any pivot less than ma77_small is treated as zero. The valid range for this real option is 0 ≤ ma77_small and its default value is 10-20.
\anchor OPT_ma77_static ma77_static: Static Pivoting Threshold
See MA77 documentation. Either ma77_static=0.0 or ma77_static>ma77_small. ma77_static=0.0 disables static pivoting. The valid range for this real option is 0 ≤ ma77_static and its default value is 0.
\anchor OPT_ma77_u ma77_u: Pivoting Threshold
See MA77 documentation. The valid range for this real option is 0 ≤ ma77_u ≤ 0.5 and its default value is 10-08.
\anchor OPT_ma77_umax ma77_umax: Maximum Pivoting Threshold
Maximum value to which u will be increased to improve quality. The valid range for this real option is 0 ≤ ma77_umax ≤ 0.5 and its default value is 0.0001.
\anchor OPT_ma77_order ma77_order: Controls type of ordering used by MA77
The default value for this string option is "metis". Possible values: - amd: Use the HSL_MC68 approximate minimum degree algorithm - metis: Use the MeTiS nested dissection algorithm (if available)
\subsection OPT_MA86_Linear_Solver MA86 Linear Solver \anchor OPT_ma86_print_level ma86_print_level: Debug printing level
<0: no printing; 0: Error and warning messages only; 1: Limited diagnostic printing; >1 Additional diagnostic printing. The valid range for this integer option is unrestricted and its default value is -1.
\anchor OPT_ma86_nemin ma86_nemin: Node Amalgamation parameter
Two nodes in elimination tree are merged if result has fewer than ma86_nemin variables. The valid range for this integer option is 1 ≤ ma86_nemin and its default value is 32.
\anchor OPT_ma86_small ma86_small: Zero Pivot Threshold
Any pivot less than ma86_small is treated as zero. The valid range for this real option is 0 ≤ ma86_small and its default value is 10-20.
\anchor OPT_ma86_static ma86_static: Static Pivoting Threshold
See MA86 documentation. Either ma86_static=0.0 or ma86_static>ma86_small. ma86_static=0.0 disables static pivoting. The valid range for this real option is 0 ≤ ma86_static and its default value is 0.
\anchor OPT_ma86_u ma86_u: Pivoting Threshold
See MA86 documentation. The valid range for this real option is 0 ≤ ma86_u ≤ 0.5 and its default value is 10-08.
\anchor OPT_ma86_umax ma86_umax: Maximum Pivoting Threshold
Maximum value to which u will be increased to improve quality. The valid range for this real option is 0 ≤ ma86_umax ≤ 0.5 and its default value is 0.0001.
\anchor OPT_ma86_scaling ma86_scaling: Controls scaling of matrix
The default value for this string option is "mc64". Possible values: - none: Do not scale the linear system matrix - mc64: Scale linear system matrix using MC64 - mc77: Scale linear system matrix using MC77 [1,3,0]
\anchor OPT_ma86_order ma86_order: Controls type of ordering
The default value for this string option is "auto". Possible values: - auto: Try both AMD and MeTiS, pick best - amd: Use the HSL_MC68 approximate minimum degree algorithm - metis: Use the MeTiS nested dissection algorithm (if available)
\subsection OPT_MA97_Linear_Solver MA97 Linear Solver \anchor OPT_ma97_print_level ma97_print_level: Debug printing level
<0: no printing; 0: Error and warning messages only; 1: Limited diagnostic printing; >1 Additional diagnostic printing. The valid range for this integer option is unrestricted and its default value is -1.
\anchor OPT_ma97_nemin ma97_nemin: Node Amalgamation parameter
Two nodes in elimination tree are merged if result has fewer than ma97_nemin variables. The valid range for this integer option is 1 ≤ ma97_nemin and its default value is 8.
\anchor OPT_ma97_small ma97_small: Zero Pivot Threshold
Any pivot less than ma97_small is treated as zero. The valid range for this real option is 0 ≤ ma97_small and its default value is 10-20.
\anchor OPT_ma97_u ma97_u: Pivoting Threshold
See MA97 documentation. The valid range for this real option is 0 ≤ ma97_u ≤ 0.5 and its default value is 10-08.
\anchor OPT_ma97_umax ma97_umax: Maximum Pivoting Threshold
See MA97 documentation. The valid range for this real option is 0 ≤ ma97_umax ≤ 0.5 and its default value is 0.0001.
\anchor OPT_ma97_scaling ma97_scaling: Specifies strategy for scaling
The default value for this string option is "dynamic". Possible values: - none: Do not scale the linear system matrix - mc30: Scale all linear system matrices using MC30 - mc64: Scale all linear system matrices using MC64 - mc77: Scale all linear system matrices using MC77 [1,3,0] - dynamic: Dynamically select scaling according to rules specified by ma97_scalingX and ma97_switchX options.
\anchor OPT_ma97_scaling1 ma97_scaling1 (advanced): First scaling.
If ma97_scaling=dynamic, this scaling is used according to the trigger ma97_switch1. If ma97_switch2 is triggered it is disabled. The default value for this string option is "mc64". Possible values: - none: No scaling - mc30: Scale linear system matrix using MC30 - mc64: Scale linear system matrix using MC64 - mc77: Scale linear system matrix using MC77 [1,3,0]
\anchor OPT_ma97_switch1 ma97_switch1 (advanced): First switch, determine when ma97_scaling1 is enabled.
If ma97_scaling=dynamic, ma97_scaling1 is enabled according to this condition. If ma97_switch2 occurs this option is henceforth ignored. The default value for this string option is "od_hd_reuse". Possible values: - never: Scaling is never enabled. - at_start: Scaling to be used from the very start. - at_start_reuse: Scaling to be used on first iteration, then reused thereafter. - on_demand: Scaling to be used after Ipopt request improved solution (i.e. iterative refinement has failed). - on_demand_reuse: As on_demand, but reuse scaling from previous itr - high_delay: Scaling to be used after more than 0.05*n delays are present - high_delay_reuse: Scaling to be used only when previous itr created more that 0.05*n additional delays, otherwise reuse scaling from previous itr - od_hd: Combination of on_demand and high_delay - od_hd_reuse: Combination of on_demand_reuse and high_delay_reuse
\anchor OPT_ma97_scaling2 ma97_scaling2 (advanced): Second scaling.
If ma97_scaling=dynamic, this scaling is used according to the trigger ma97_switch2. If ma97_switch3 is triggered it is disabled. The default value for this string option is "mc64". Possible values: - none: No scaling - mc30: Scale linear system matrix using MC30 - mc64: Scale linear system matrix using MC64 - mc77: Scale linear system matrix using MC77 [1,3,0]
\anchor OPT_ma97_switch2 ma97_switch2 (advanced): Second switch, determine when ma97_scaling2 is enabled.
If ma97_scaling=dynamic, ma97_scaling2 is enabled according to this condition. If ma97_switch3 occurs this option is henceforth ignored. The default value for this string option is "never". Possible values: - never: Scaling is never enabled. - at_start: Scaling to be used from the very start. - at_start_reuse: Scaling to be used on first iteration, then reused thereafter. - on_demand: Scaling to be used after Ipopt request improved solution (i.e. iterative refinement has failed). - on_demand_reuse: As on_demand, but reuse scaling from previous itr - high_delay: Scaling to be used after more than 0.05*n delays are present - high_delay_reuse: Scaling to be used only when previous itr created more that 0.05*n additional delays, otherwise reuse scaling from previous itr - od_hd: Combination of on_demand and high_delay - od_hd_reuse: Combination of on_demand_reuse and high_delay_reuse
\anchor OPT_ma97_scaling3 ma97_scaling3 (advanced): Third scaling.
If ma97_scaling=dynamic, this scaling is used according to the trigger ma97_switch3. The default value for this string option is "mc64". Possible values: - none: No scaling - mc30: Scale linear system matrix using MC30 - mc64: Scale linear system matrix using MC64 - mc77: Scale linear system matrix using MC77 [1,3,0]
\anchor OPT_ma97_switch3 ma97_switch3 (advanced): Third switch, determine when ma97_scaling3 is enabled.
If ma97_scaling=dynamic, ma97_scaling3 is enabled according to this condition. The default value for this string option is "never". Possible values: - never: Scaling is never enabled. - at_start: Scaling to be used from the very start. - at_start_reuse: Scaling to be used on first iteration, then reused thereafter. - on_demand: Scaling to be used after Ipopt request improved solution (i.e. iterative refinement has failed). - on_demand_reuse: As on_demand, but reuse scaling from previous itr - high_delay: Scaling to be used after more than 0.05*n delays are present - high_delay_reuse: Scaling to be used only when previous itr created more that 0.05*n additional delays, otherwise reuse scaling from previous itr - od_hd: Combination of on_demand and high_delay - od_hd_reuse: Combination of on_demand_reuse and high_delay_reuse
\anchor OPT_ma97_order ma97_order: Controls type of ordering
The default value for this string option is "auto". Possible values: - auto: Use HSL_MA97 heuristic to guess best of AMD and METIS - best: Try both AMD and MeTiS, pick best - amd: Use the HSL_MC68 approximate minimum degree algorithm - metis: Use the MeTiS nested dissection algorithm - matched-auto: Use the HSL_MC80 matching with heuristic choice of AMD or METIS - matched-metis: Use the HSL_MC80 matching based ordering with METIS - matched-amd: Use the HSL_MC80 matching based ordering with AMD
\anchor OPT_ma97_solve_blas3 ma97_solve_blas3 (advanced): Controls if blas2 or blas3 routines are used for solve
The default value for this string option is "no". Possible values: - no: Use BLAS2 (faster, some implementations bit incompatible) - yes: Use BLAS3 (slower)
\subsection OPT_Pardiso__pardiso_project_org__Linear_Solver Pardiso (pardiso-project.org) Linear Solver \anchor OPT_pardiso_matching_strategy pardiso_matching_strategy: Matching strategy to be used by Pardiso
This is IPAR(13) in Pardiso manual. The default value for this string option is "complete+2x2". Possible values: - complete: Match complete (IPAR(13)=1) - complete+2x2: Match complete+2x2 (IPAR(13)=2) - constraints: Match constraints (IPAR(13)=3)
\anchor OPT_pardiso_redo_symbolic_fact_only_if_inertia_wrong pardiso_redo_symbolic_fact_only_if_inertia_wrong (advanced): Toggle for handling case when elements were perturbed by Pardiso.
The default value for this string option is "no". Possible values: - no: Always redo symbolic factorization when elements were perturbed - yes: Only redo symbolic factorization when elements were perturbed if also the inertia was wrong
\anchor OPT_pardiso_repeated_perturbation_means_singular pardiso_repeated_perturbation_means_singular (advanced): Whether to assume that matrix is singular if elements were perturbed after recent symbolic factorization.
The default value for this string option is "no". Possible values: yes, no
\anchor OPT_pardiso_msglvl pardiso_msglvl: Pardiso message level
This is MSGLVL in the Pardiso manual. The valid range for this integer option is 0 ≤ pardiso_msglvl and its default value is 0.
\anchor OPT_pardiso_skip_inertia_check pardiso_skip_inertia_check (advanced): Whether to pretend that inertia is correct.
Setting this option to "yes" essentially disables inertia check. This option makes the algorithm non-robust and easily fail, but it might give some insight into the necessity of inertia control. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_pardiso_max_iterative_refinement_steps pardiso_max_iterative_refinement_steps: Limit on number of iterative refinement steps.
The solver does not perform more than the absolute value of this value steps of iterative refinement and stops the process if a satisfactory level of accuracy of the solution in terms of backward error is achieved. If negative, the accumulation of the residue uses extended precision real and complex data types. Perturbed pivots result in iterative refinement. The solver automatically performs two steps of iterative refinements when perturbed pivots are obtained during the numerical factorization and this option is set to 0. The valid range for this integer option is unrestricted and its default value is 0.
\anchor OPT_pardiso_order pardiso_order: Controls the fill-in reduction ordering algorithm for the input matrix.
The default value for this string option is "metis". Possible values: - amd: minimum degree algorithm - one - metis: MeTiS nested dissection algorithm - pmetis: parallel (OpenMP) version of MeTiS nested dissection algorithm - four - five
\anchor OPT_pardiso_max_iter pardiso_max_iter (advanced): Maximum number of Krylov-Subspace Iteration
DPARM(1) The valid range for this integer option is 1 ≤ pardiso_max_iter and its default value is 500.
\anchor OPT_pardiso_iter_relative_tol pardiso_iter_relative_tol (advanced): Relative Residual Convergence
DPARM(2) The valid range for this real option is 0 < pardiso_iter_relative_tol < 1 and its default value is 10-06.
\anchor OPT_pardiso_iter_coarse_size pardiso_iter_coarse_size (advanced): Maximum Size of Coarse Grid Matrix
DPARM(3) The valid range for this integer option is 1 ≤ pardiso_iter_coarse_size and its default value is 5000.
\anchor OPT_pardiso_iter_max_levels pardiso_iter_max_levels (advanced): Maximum Size of Grid Levels
DPARM(4) The valid range for this integer option is 1 ≤ pardiso_iter_max_levels and its default value is 10.
\anchor OPT_pardiso_iter_dropping_factor pardiso_iter_dropping_factor (advanced): dropping value for incomplete factor
DPARM(5) The valid range for this real option is 0 < pardiso_iter_dropping_factor < 1 and its default value is 0.5.
\anchor OPT_pardiso_iter_dropping_schur pardiso_iter_dropping_schur (advanced): dropping value for sparsify schur complement factor
DPARM(6) The valid range for this real option is 0 < pardiso_iter_dropping_schur < 1 and its default value is 0.1.
\anchor OPT_pardiso_iter_max_row_fill pardiso_iter_max_row_fill (advanced): max fill for each row
DPARM(7) The valid range for this integer option is 1 ≤ pardiso_iter_max_row_fill and its default value is 10000000.
\anchor OPT_pardiso_iter_inverse_norm_factor pardiso_iter_inverse_norm_factor (advanced)
DPARM(8) The valid range for this real option is 1 < pardiso_iter_inverse_norm_factor and its default value is 5 · 10+06.
\anchor OPT_pardiso_iterative pardiso_iterative (advanced): Switch for iterative solver in Pardiso library
The default value for this string option is "no". Possible values: yes, no
\anchor OPT_pardiso_max_droptol_corrections pardiso_max_droptol_corrections (advanced): Maximal number of decreases of drop tolerance during one solve.
This is relevant only for iterative Pardiso options. The valid range for this integer option is 1 ≤ pardiso_max_droptol_corrections and its default value is 4.
\subsection OPT_Pardiso__MKL__Linear_Solver Pardiso (MKL) Linear Solver \anchor OPT_pardisomkl_matching_strategy pardisomkl_matching_strategy: Matching strategy to be used by Pardiso
This is IPAR(13) in Pardiso manual. The default value for this string option is "complete+2x2". Possible values: - complete: Match complete (IPAR(13)=1) - complete+2x2: Match complete+2x2 (IPAR(13)=2) - constraints: Match constraints (IPAR(13)=3)
\anchor OPT_pardisomkl_redo_symbolic_fact_only_if_inertia_wrong pardisomkl_redo_symbolic_fact_only_if_inertia_wrong (advanced): Toggle for handling case when elements were perturbed by Pardiso.
The default value for this string option is "no". Possible values: - no: Always redo symbolic factorization when elements were perturbed - yes: Only redo symbolic factorization when elements were perturbed if also the inertia was wrong
\anchor OPT_pardisomkl_repeated_perturbation_means_singular pardisomkl_repeated_perturbation_means_singular (advanced): Whether to assume that matrix is singular if elements were perturbed after recent symbolic factorization.
The default value for this string option is "no". Possible values: yes, no
\anchor OPT_pardisomkl_msglvl pardisomkl_msglvl: Pardiso message level
This is MSGLVL in the Pardiso manual. The valid range for this integer option is 0 ≤ pardisomkl_msglvl and its default value is 0.
\anchor OPT_pardisomkl_skip_inertia_check pardisomkl_skip_inertia_check (advanced): Whether to pretend that inertia is correct.
Setting this option to "yes" essentially disables inertia check. This option makes the algorithm non-robust and easily fail, but it might give some insight into the necessity of inertia control. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_pardisomkl_max_iterative_refinement_steps pardisomkl_max_iterative_refinement_steps: Limit on number of iterative refinement steps.
The solver does not perform more than the absolute value of this value steps of iterative refinement and stops the process if a satisfactory level of accuracy of the solution in terms of backward error is achieved. If negative, the accumulation of the residue uses extended precision real and complex data types. Perturbed pivots result in iterative refinement. The solver automatically performs two steps of iterative refinements when perturbed pivots are obtained during the numerical factorization and this option is set to 0. The valid range for this integer option is unrestricted and its default value is 1.
\anchor OPT_pardisomkl_order pardisomkl_order: Controls the fill-in reduction ordering algorithm for the input matrix.
The default value for this string option is "metis". Possible values: - amd: minimum degree algorithm - one: undocumented - metis: MeTiS nested dissection algorithm - pmetis: parallel (OpenMP) version of MeTiS nested dissection algorithm
\subsection OPT_SPRAL_Linear_Solver SPRAL Linear Solver \anchor OPT_spral_cpu_block_size spral_cpu_block_size: CPU Parallelization Block Size
Block size to use for parallelization of large nodes on CPU resources. The valid range for this integer option is 1 ≤ spral_cpu_block_size and its default value is 256.
\anchor OPT_spral_gpu_perf_coeff spral_gpu_perf_coeff: GPU Performance Coefficient
How many times faster a GPU is than a CPU at factoring a subtree. The valid range for this real option is 0 < spral_gpu_perf_coeff and its default value is 1.
\anchor OPT_spral_ignore_numa spral_ignore_numa: Non-uniform memory access (NUMA) region setting.
The default value for this string option is "yes". Possible values: - no: Do not treat CPUs and GPUs as belonging to a single NUMA region. - yes: Treat CPUs and GPUs as belonging to a single NUMA region.
\anchor OPT_spral_max_load_inbalance spral_max_load_inbalance: Maximum Permissible Load
Maximum permissible load inbalance for leaf subtree allocations. The valid range for this real option is 1 < spral_max_load_inbalance and its default value is 1.2.
\anchor OPT_spral_min_gpu_work spral_min_gpu_work: Minimum GPU Work
Minimum number of FLOPS in subtree before scheduling on GPU. The valid range for this real option is 0 ≤ spral_min_gpu_work and its default value is 5 · 10+09.
\anchor OPT_spral_nemin spral_nemin: Node Amalgamation Parameter
Two nodes in the elimination tree are merged if the result has fewer than spral_nemin variables. The valid range for this integer option is 1 ≤ spral_nemin and its default value is 32.
\anchor OPT_spral_order spral_order: Controls type of ordering used by SPRAL
The default value for this string option is "matching". Possible values: - metis: Use METIS with default settings. - matching: Use matching-based elimination ordering.
\anchor OPT_spral_pivot_method spral_pivot_method: Specifies strategy for scaling in SPRAL linear solver.
The default value for this string option is "block". Possible values: - aggressive: Aggressive a posteori pivoting. - block: Block a posteori pivoting. - threshold: Threshold partial pivoting (not parallel).
\anchor OPT_spral_print_level spral_print_level: Print level for the linear solver SPRAL
<0: no printing, 0: errors and warning messages, 1: limited diagnostics, >1: additional diagnostics The valid range for this integer option is unrestricted and its default value is -1.
\anchor OPT_spral_scaling spral_scaling: Specifies strategy for scaling in SPRAL linear solver.
The default value for this string option is "matching". Possible values: - none: Do not scale the linear system matrix. - mc64: Scale using weighted bipartite matching (MC64). - auction: Scale using the auction algorithm. - matching: Scale using the matching-based ordering. - ruiz: Scale using the norm-equilibration algorithm of Ruiz (MC77). - dynamic: Dynamically select scaling according to switch options.
\anchor OPT_spral_scaling_1 spral_scaling_1 (advanced): First scaling strategy.
If spral_scaling = dynamic, this scaling is used according to the trigger spral_switch_1. If spral_switch_2 is triggered, it is disabled. The default value for this string option is "matching". Possible values: - none: Do not scale the linear system matrix. - mc64: Scale using weighted bipartite matching (MC64). - auction: Scale using the auction algorithm. - matching: Scale using the matching-based ordering. - ruiz: Scale using the norm-equilibration algorithm of Ruiz (MC77).
\anchor OPT_spral_scaling_2 spral_scaling_2 (advanced): Second scaling strategy.
If spral_scaling = dynamic, this scaling is used according to the trigger spral_switch_2. If spral_switch_3 is triggered, it is disabled. The default value for this string option is "mc64". Possible values: - none: Do not scale the linear system matrix. - mc64: Scale using weighted bipartite matching (MC64). - auction: Scale using the auction algorithm. - matching: Scale using the matching-based ordering. - ruiz: Scale using the norm-equilibration algorithm of Ruiz (MC77).
\anchor OPT_spral_scaling_3 spral_scaling_3 (advanced): Third scaling strategy.
If spral_scaling = dynamic, this scaling is used according to the trigger spral_switch_3. The default value for this string option is "none". Possible values: - none: Do not scale the linear system matrix. - mc64: Scale using weighted bipartite matching (MC64). - auction: Scale using the auction algorithm. - matching: Scale using the matching-based ordering. - ruiz: Scale using the norm-equilibration algorithm of Ruiz (MC77).
\anchor OPT_spral_switch_1 spral_switch_1 (advanced): First switch, determining when spral_scaling_1 is enabled.
If spral_scaling = dynamic, spral_scaling_1 is enabled according to this condition. If spral_switch_2 occurs, this option is henceforth ignored. The default value for this string option is "at_start". Possible values: - never: Scaling is never enabled. - at_start: Scaling is used from the very start. - at_start_reuse: Scaling is used on the first iteration, then reused thereafter. - on_demand: Scaling is used when iterative refinement has failed. - on_demand_reuse: As on_demand, but scaling from previous iteration is reused. - high_delay: Scaling is used after more than 0.05*n delays are present. - high_delay_reuse: Scaling is used only when previous iteration created more that 0.05*n additional delays; otherwise, reuse scaling from the previous iteration. - od_hd: Combination of on_demand and high_delay. - od_hd_reuse: Combination of on_demand_reuse and high_delay_reuse
\anchor OPT_spral_switch_2 spral_switch_2 (advanced): Second switch, determining when spral_scaling_2 is enabled.
If spral_scaling = dynamic, spral_scaling_2 is enabled according to this condition. If spral_switch_3 occurs, this option is henceforth ignored. The default value for this string option is "on_demand". Possible values: - never: Scaling is never enabled. - at_start: Scaling is used from the very start. - at_start_reuse: Scaling is used on the first iteration, then reused thereafter. - on_demand: Scaling is used when iterative refinement has failed. - on_demand_reuse: As on_demand, but scaling from previous iteration is reused. - high_delay: Scaling is used after more than 0.05*n delays are present. - high_delay_reuse: Scaling is used only when previous iteration created more that 0.05*n additional delays; otherwise, reuse scaling from the previous iteration. - od_hd: Combination of on_demand and high_delay. - od_hd_reuse: Combination of on_demand_reuse and high_delay_reuse
\anchor OPT_spral_switch_3 spral_switch_3 (advanced): Third switch, determining when spral_scaling_3 is enabled.
If spral_scaling = dynamic, spral_scaling_3 is enabled according to this condition. The default value for this string option is "never". Possible values: - never: Scaling is never enabled. - at_start: Scaling is used from the very start. - at_start_reuse: Scaling is used on the first iteration, then reused thereafter. - on_demand: Scaling is used when iterative refinement has failed. - on_demand_reuse: As on_demand, but scaling from previous iteration is reused. - high_delay: Scaling is used after more than 0.05*n delays are present. - high_delay_reuse: Scaling is used only when previous iteration created more that 0.05*n additional delays; otherwise, reuse scaling from the previous iteration. - od_hd: Combination of on_demand and high_delay. - od_hd_reuse: Combination of on_demand_reuse and high_delay_reuse
\anchor OPT_spral_small spral_small: Zero Pivot Threshold
Any pivot less than spral_small is treated as zero. The valid range for this real option is 0 < spral_small and its default value is 10-20.
\anchor OPT_spral_small_subtree_threshold spral_small_subtree_threshold: Small Subtree Threshold
Maximum number of FLOPS in a subtree treated as a single task. The valid range for this real option is 0 < spral_small_subtree_threshold and its default value is 4 · 10+06.
\anchor OPT_spral_u spral_u: Pivoting Threshold
Relative pivot threshold used in symmetric indefinite case. The valid range for this real option is 0 < spral_u ≤ 0.5 and its default value is 10-08.
\anchor OPT_spral_umax spral_umax: Maximum Pivoting Threshold
See SPRAL documentation. The valid range for this real option is 0 < spral_umax ≤ 0.5 and its default value is 0.0001.
\anchor OPT_spral_use_gpu spral_use_gpu: Specifies whether or not graphics processing units (GPUs) are used by the SPRAL linear solver if present.
The default value for this string option is "yes". Possible values: yes, no
\subsection OPT_WSMP_Linear_Solver WSMP Linear Solver \anchor OPT_wsmp_num_threads wsmp_num_threads: Number of threads to be used in WSMP
The valid range for this integer option is unrestricted and its default value is 1.
\anchor OPT_wsmp_ordering_option wsmp_ordering_option: Determines how ordering is done in WSMP
This corresponds to the value of WSSMP's IPARM(16). The valid range for this integer option is -2 ≤ wsmp_ordering_option ≤ 3 and its default value is 1.
\anchor OPT_wsmp_ordering_option2 wsmp_ordering_option2 (advanced): Determines how ordering is done in WSMP
This corresponds to the value of WSSMP's IPARM(20). The valid range for this integer option is 0 ≤ wsmp_ordering_option2 ≤ 3 and its default value is 1.
\anchor OPT_wsmp_pivtol wsmp_pivtol: Pivot tolerance for the linear solver WSMP.
A smaller number pivots for sparsity, a larger number pivots for stability. The valid range for this real option is 0 < wsmp_pivtol < 1 and its default value is 0.0001.
\anchor OPT_wsmp_pivtolmax wsmp_pivtolmax: Maximum pivot tolerance for the linear solver WSMP.
Ipopt may increase pivtol as high as pivtolmax to get a more accurate solution to the linear system. The valid range for this real option is 0 < wsmp_pivtolmax < 1 and its default value is 0.1.
\anchor OPT_wsmp_scaling wsmp_scaling: Determines how the matrix is scaled by WSMP.
This corresponds to the value of WSSMP's IPARM(10). The valid range for this integer option is 0 ≤ wsmp_scaling ≤ 3 and its default value is 0.
\anchor OPT_wsmp_singularity_threshold wsmp_singularity_threshold: WSMP's singularity threshold.
WSMP's DPARM(10) parameter. The smaller this value the less likely a matrix is declared singular. The valid range for this real option is 0 < wsmp_singularity_threshold < 1 and its default value is 10-18.
\anchor OPT_wsmp_write_matrix_iteration wsmp_write_matrix_iteration (advanced): Iteration in which the matrices are written to files.
If non-negative, this option determines the iteration in which all matrices given to WSMP are written to files. The valid range for this integer option is -1 ≤ wsmp_write_matrix_iteration and its default value is -1.
\anchor OPT_wsmp_skip_inertia_check wsmp_skip_inertia_check (advanced): Whether to always pretend that inertia is correct.
Setting this option to "yes" essentially disables inertia check. This option makes the algorithm non-robust and easily fail, but it might give some insight into the necessity of inertia control. The default value for this string option is "no". Possible values: yes, no
\anchor OPT_wsmp_no_pivoting wsmp_no_pivoting (advanced): Whether to use the static pivoting option of WSMP.
Setting this option to "yes" means that WSMP is instructed not to do pivoting. This works only in certain situations (when the Hessian block is known to be positive definite or when we are using L-BFGS). It can also lead to a lot of fill-in. The default value for this string option is "no". Possible values: - no: use the regular version - yes: use static pivoting
\anchor OPT_wsmp_max_iter wsmp_max_iter (advanced): Maximal number of iterations in iterative WISMP
The valid range for this integer option is 1 ≤ wsmp_max_iter and its default value is 1000.
\anchor OPT_wsmp_inexact_droptol wsmp_inexact_droptol (advanced): Drop tolerance for inexact factorization preconditioner in WISMP.
DPARM(14) in WISMP The valid range for this real option is 0 ≤ wsmp_inexact_droptol and its default value is 0.
\anchor OPT_wsmp_inexact_fillin_limit wsmp_inexact_fillin_limit (advanced): Fill-in limit for inexact factorization preconditioner in WISMP.
DPARM(15) in WISMP The valid range for this real option is 0 ≤ wsmp_inexact_fillin_limit and its default value is 0.
\subsection OPT_Mumps_Linear_Solver Mumps Linear Solver \anchor OPT_mumps_print_level mumps_print_level: Debug printing level for the linear solver MUMPS
0: no printing; 1: Error messages only; 2: Error, warning, and main statistic messages; 3: Error and warning messages and terse diagnostics; >=4: All information. The valid range for this integer option is 0 ≤ mumps_print_level and its default value is 0.
\anchor OPT_mumps_pivtol mumps_pivtol: Pivot tolerance for the linear solver MUMPS.
A smaller number pivots for sparsity, a larger number pivots for stability. The valid range for this real option is 0 ≤ mumps_pivtol ≤ 1 and its default value is 10-06.
\anchor OPT_mumps_pivtolmax mumps_pivtolmax: Maximum pivot tolerance for the linear solver MUMPS.
Ipopt may increase pivtol as high as pivtolmax to get a more accurate solution to the linear system. The valid range for this real option is 0 ≤ mumps_pivtolmax ≤ 1 and its default value is 0.1.
\anchor OPT_mumps_mem_percent mumps_mem_percent: Percentage increase in the estimated working space for MUMPS.
When significant extra fill-in is caused by numerical pivoting, larger values of mumps_mem_percent may help use the workspace more efficiently. On the other hand, if memory requirement are too large at the very beginning of the optimization, choosing a much smaller value for this option, such as 5, might reduce memory requirements. The valid range for this integer option is 0 ≤ mumps_mem_percent and its default value is 1000.
\anchor OPT_mumps_permuting_scaling mumps_permuting_scaling: Controls permuting and scaling in MUMPS
This is ICNTL(6) in MUMPS. The valid range for this integer option is 0 ≤ mumps_permuting_scaling ≤ 7 and its default value is 7.
\anchor OPT_mumps_pivot_order mumps_pivot_order: Controls pivot order in MUMPS
This is ICNTL(7) in MUMPS. The valid range for this integer option is 0 ≤ mumps_pivot_order ≤ 7 and its default value is 7.
\anchor OPT_mumps_scaling mumps_scaling: Controls scaling in MUMPS
This is ICNTL(8) in MUMPS. The valid range for this integer option is -2 ≤ mumps_scaling ≤ 77 and its default value is 77.
\anchor OPT_mumps_dep_tol mumps_dep_tol (advanced): Threshold to consider a pivot at zero in detection of linearly dependent constraints with MUMPS.
This is CNTL(3) in MUMPS. The valid range for this real option is unrestricted and its default value is 0.
\anchor OPT_mumps_mpi_communicator mumps_mpi_communicator (advanced): MPI communicator used for matrix operations
This sets the MPI communicator. MPI_COMM_WORLD is the default. Any other value should be the return value from MPI_Comm_c2f. The valid range for this integer option is unrestricted and its default value is -987654. This option is only available if MUMPS's libseq/mpi.h is not used.
\subsection OPT_MA28_Linear_Solver MA28 Linear Solver \anchor OPT_ma28_pivtol ma28_pivtol: Pivot tolerance for linear solver MA28.
The valid range for this real option is 0 < ma28_pivtol ≤ 1 and its default value is 0.01.
*/ coinor-ipopt-3.14.17/doc/output.dox000066400000000000000000000416551473776672200171720ustar00rootroot00000000000000/** \page OUTPUT %Ipopt Output This pages describes the standard %Ipopt console output with the default setting for option \ref OPT_print_level "print_level". The output is designed to provide a quick summary of each iteration as %Ipopt solves the problem. Before %Ipopt starts to solve the problem, it displays the problem statistics (number of nonzero-elements in the matrices, number of variables, etc.). Note that if you have fixed variables (both upper and lower bounds are equal), %Ipopt may remove these variables from the problem internally and not include them in the problem statistics. Following the problem statistics, %Ipopt will begin to solve the problem and you will see output resembling the following, iter objective inf_pr inf_du lg(mu) ||d|| lg(rg) alpha_du alpha_pr ls 0 1.6109693e+01 1.12e+01 5.28e-01 0.0 0.00e+00 - 0.00e+00 0.00e+00 0 1 1.8029749e+01 9.90e-01 6.62e+01 0.1 2.05e+00 - 2.14e-01 1.00e+00f 1 2 1.8719906e+01 1.25e-02 9.04e+00 -2.2 5.94e-02 2.0 8.04e-01 1.00e+00h 1 and the columns of output are defined as, - iter: The current iteration count. This includes regular iterations and iterations during the restoration phase. If the algorithm is in the restoration phase, the letter "r" will be appended to the iteration number. - objective: The unscaled objective value at the current point. During the restoration phase, this value remains the unscaled objective value for the original problem. - inf_pr: The unscaled constraint violation at the current point. This quantity is the infinity-norm (max) of the (unscaled) constraints (\f$g^L \leq g(x) \leq g^U\f$ in (NLP)). During the restoration phase, this value remains the constraint violation of the original problem at the current point. The option \ref OPT_inf_pr_output "inf_pr_output" can be used to switch to the printing of a different quantity. - inf_du: The scaled dual infeasibility at the current point. This quantity measure the infinity-norm (max) of the internal dual infeasibility, Eq. (4a) in the implementation paper \cite WaecBieg06:mp, including inequality constraints reformulated using slack variables and problem scaling. During the restoration phase, this is the value of the dual infeasibility for the restoration phase problem. - lg(mu): log10 of the value of the barrier parameter μ. - ||d||: The infinity norm (max) of the primal step (for the original variables \f$x\f$ and the internal slack variables \f$s\f$). During the restoration phase, this value includes the values of additional variables, \f$p\f$ and \f$n\f$ (see Eq. (30) in \cite WaecBieg06:mp). - lg(rg): log10 of the value of the regularization term for the Hessian of the Lagrangian in the augmented system (\f$\delta_w\f$ in Eq. (26) and Section 3.1 in \cite WaecBieg06:mp). A dash ("-") indicates that no regularization was done. - alpha_du: The stepsize for the dual variables (\f$\alpha^z_k\f$ in Eq. (14c) in \cite WaecBieg06:mp). - alpha_pr: The stepsize for the primal variables (\f$\alpha_k\f$ in Eq. (14a) in \cite WaecBieg06:mp). The number is usually followed by a character for additional diagnostic information regarding the step acceptance criterion: | Tag | Description | |-----|--------------| | f | f-type iteration in the filter method w/o second order correction | | F | f-type iteration in the filter method w/ second order correction | | h | h-type iteration in the filter method w/o second order correction | | H | h-type iteration in the filter method w/ second order correction | | k | penalty value unchanged in merit function method w/o second order correction | | K | penalty value unchanged in merit function method w/ second order correction | | n | penalty value updated in merit function method w/o second order correction | | N | penalty value updated in merit function method w/ second order correction | | R | Restoration phase just started | | w | in watchdog procedure | | s | step accepted in soft restoration phase | | t/T | tiny step accepted without line search | | r | some previous iterate restored | - ls: The number of backtracking line search steps (does not include second-order correction steps). Note that the step acceptance mechanisms in %Ipopt consider the barrier objective function (Eq (3a) in \cite WaecBieg06:mp) which is usually different from the value reported in the `objective` column. Similarly, for the purposes of the step acceptance, the constraint violation is measured for the internal problem formulation, which includes slack variables for inequality constraints and potentially scaling of the constraint functions. This value, too, is usually different from the value reported in `inf_pr`. As a consequence, a new iterate might have worse values both for the objective function and the constraint violation as reported in the iteration output, seemingly contradicting globalization procedure. When the algorithm terminates, %Ipopt will output a message to the screen based on the return status of the call to Optimize. The following is a list of the possible return codes, their corresponding output message to the console, and a brief description. - `Solve_Succeeded`: Console Message: `EXIT: Optimal Solution Found.` This message indicates that %Ipopt found a (locally) optimal point within the desired tolerances. - `Solved_To_Acceptable_Level`: Console Message: `EXIT: Solved To Acceptable Level.` This indicates that the algorithm did not converge to the "desired" tolerances, but that it was able to obtain a point satisfying the "acceptable" tolerance level as specified by the \ref OPT_acceptable_tol "acceptable_tol" options. This may happen if the desired tolerances are too small for the current problem. - `Feasible_Point_Found`: Console Message: `EXIT: Feasible point for square problem found.` This message is printed if the problem is "square" (i.e., it has as many equality constraints as free variables) and %Ipopt found a point that is feasible w.r.t. constr_viol_tol. It may, however, not be feasible w.r.t. tol. - `Infeasible_Problem_Detected`: Console Message: `EXIT: Converged to a point of local infeasibility. Problem may be infeasible.` The restoration phase converged to a point that is a minimizer for the constraint violation (in the \f$\ell_1\f$-norm), but is not feasible for the original problem. This indicates that the problem may be infeasible (or at least that the algorithm is stuck at a locally infeasible point). The returned point (the minimizer of the constraint violation) might help you to find which constraint is causing the problem. If you believe that the NLP is feasible, it might help to start the optimization from a different point. - `Search_Direction_Becomes_Too_Small`: Console Message: `EXIT: Search Direction is becoming Too Small.` This indicates that %Ipopt is calculating very small step sizes and is making very little progress. This could happen if the problem has been solved to the best numerical accuracy possible given the current scaling. - `Diverging_Iterates`: Console Message: `EXIT: Iterates divering; problem might be unbounded.` This message is printed if the max-norm of the iterates becomes larger than the value of the option \ref OPT_diverging_iterates_tol "diverging_iterates_tol". This can happen if the problem is unbounded below and the iterates are diverging. - `User_Requested_Stop`: Console Message: `EXIT: Stopping optimization at current point as requested by user.` This message is printed if the user call-back method Ipopt::TNLP::intermediate_callback returned false. - `Maximum_Iterations_Exceeded`: Console Message: `EXIT: Maximum Number of Iterations Exceeded.` This indicates that %Ipopt has exceeded the maximum number of iterations as specified by the option \ref OPT_max_iter "max_iter". - `Maximum_WallTime_Exceeded`: Console Message: `EXIT: Maximum wallclock time exceeded.` This indicates that %Ipopt has exceeded the maximum number of wallclock seconds as specified by the option \ref OPT_max_wall_time "max_wall_time". - `Maximum_CpuTime_Exceeded`: Console Message: `EXIT: Maximum CPU time exceeded.` This indicates that %Ipopt has exceeded the maximum number of CPU seconds as specified by the option \ref OPT_max_cpu_time "max_cpu_time". - `Restoration_Failed`: Console Message: `EXIT: Restoration Failed!` This indicates that the restoration phase failed to find a feasible point that was acceptable to the filter line search for the original problem. This could happen if the problem is highly degenerate, does not satisfy the constraint qualification, or if your NLP code provides incorrect derivative information. - `Error_In_Step_Computation`: Console Output: `EXIT: Error in step computation!` This message is printed if %Ipopt is unable to compute a step towards a new iterate and the current iterate is not acceptable for the specified tolerances. A possible reason is that a search direction could not be computed despite several attempts to modify the iteration matrix. Usually, the value of the regularization parameter then becomes too large. One situation where this can happen is when values in the Hessian are invalid (NaN or Inf). You can check whether this is true by using the option \ref OPT_check_derivatives_for_naninf "check_derivatives_for_naninf". Another reason is that the feasibility restoration phase could not be activated because the current iterate is not infeasible. Reasons for this again include that the problem is highly degenerate, badly scaled, does not satisfy the constraint qualification, or that your NLP code provides incorrect derivative information. Before Ipopt 3.14, this resulted in a Restoration_Failed status code with message "Restoration phase is called at almost feasible point..." - `Invalid_Option`: Console Message: (details about the particular error will be output to the console) This indicates that there was some problem specifying the options. See the specific message for details. This return code is also used when a linear solver is choosen that was not linked in and a library that contains this linear solver could not be loaded. - `Not_Enough_Degrees_Of_Freedom`: Console Message: `EXIT: Problem has too few degrees of freedom.` This indicates that your problem, as specified, has too few degrees of freedom. This can happen if you have too many equality constraints, or if you fix too many variables (%Ipopt removes fixed variables by default, see also the option \ref OPT_fixed_variable_treatment "fixed_variable_treatment"). - `Invalid_Problem_Definition`: Console Message: `EXIT: Problem has inconsistent variable bounds or constraint sides.` This indicates that either there was an exception of some sort when building the \ref IpoptProblem structure in the C or Fortran interface or bounds specified for variables or constraints were inconsistent (lower bound larger than upper bound, left-hand-side larger than right-hand-side). Likely there is an error in your model or the main routine. - `Unrecoverable_Exception`: Console Message: (details about the particular error will be output to the console) This indicates that %Ipopt has thrown an exception that does not have an internal return code. See the specific message for details. - `NonIpopt_Exception_Thrown`: Console Message: `Unknown Exception caught in %Ipopt` An unknown exception was caught in %Ipopt. This exception could have originated from your model or any linked in third party code. See also Ipopt::IpoptApplication::RethrowNonIpoptException. - `Insufficient_Memory`: Console Message: `EXIT: Not enough memory`. An error occurred while trying to allocate memory. The problem may be too large for your current memory and swap configuration. Console Message: `EXIT: Integer type too small for required memory`. A linear solver requires more working space than what can be communicated to it via the used integer type. - `Internal_Error`: Console: `EXIT: INTERNAL ERROR: Unknown SolverReturn value - Notify IPOPT Authors.` An unknown internal error has occurred. Please notify the authors of %Ipopt via the mailing list. To print additional diagnostic tags for each iteration of %Ipopt, set the option \ref OPT_print_info_string "print_info_string" to `yes`. With this, a tag will appear at the end of an iteration line with the following diagnostic meaning that are useful to flag difficulties for a particular %Ipopt run. |Tag |Description |Reference | |:-----|:------------------------------------------------------------|:---------------------------------------------| |! |Tighten resto tolerance if only slightly infeasible |Section 3.3 in \cite WaecBieg06:mp | |A |Current iteration is acceptable |Alternate termination | |a |Perturbation for PD singularity impossible, assume singular |Section 3.1 in \cite WaecBieg06:mp | |C |Second Order Correction taken |Section 2.4 in \cite WaecBieg06:mp | |Dh |Hessian degenerate based on multiple iterations |Section 3.1 in \cite WaecBieg06:mp | |Dhj |Hessian/Jacobian degenerate based on multiple iterations |Section 3.1 in \cite WaecBieg06:mp | |Dj |Jacobian degenerate based on multiple iterations |Section 3.1 in \cite WaecBieg06:mp | |dx |δx perturbation too large |Section 3.1 in \cite WaecBieg06:mp | |e |Cutting back α due to evaluation error |in backtracking line search | |F- |Filter should be reset, but maximal resets exceeded |Section 2.3 in \cite WaecBieg06:mp | |F+ |Resetting filter due to last few rejections of filter |Section 2.3 in \cite WaecBieg06:mp | |L |Degenerate Jacobian, δc already perturbed |Section 3.1 in \cite WaecBieg06:mp | |l |Degenerate Jacobian, δc perturbed |Section 3.1 in \cite WaecBieg06:mp | |M |Magic step taken for slack variables |in backtracking line search | |Nh |Hessian not yet degenerate |Section 3.1 in \cite WaecBieg06:mp | |Nhj |Hessian/Jacobian not yet degenerate |Section 3.1 in \cite WaecBieg06:mp | |Nj |Jacobian not yet degenerate |Section 3.1 in \cite WaecBieg06:mp | |NW |Warm start initialization failed |in Warm Start Initialization | |q |PD system possibly singular, attempt improving sol. quality |Section 3.1 in \cite WaecBieg06:mp | |R |Solution of restoration phase |Section 3.3 in \cite WaecBieg06:mp | |S |PD system possibly singular, accept current solution |Section 3.1 in \cite WaecBieg06:mp | |s |PD system singular |Section 3.1 in \cite WaecBieg06:mp | |s |Square Problem. Set multipliers to zero |Default initialization routine | |Tmax |Trial θ is larger than θmax |filter parameter, see (21) in \cite WaecBieg06:mp| |W |Watchdog line search procedure successful |Section 3.2 in \cite WaecBieg06:mp | |w |Watchdog line search procedure unsuccessful, stopped |Section 3.2 in \cite WaecBieg06:mp | |Wb |Undoing most recent SR1 update |Section 5.4.1 in \cite Biegler:nlpbook | |We |Skip Limited-Memory Update in restoration phase |Section 5.4.1 in \cite Biegler:nlpbook | |Wp |Safeguard \f$B^0 = \sigma I\f$ for Limited-Memory Update |Section 5.4.1 in \cite Biegler:nlpbook | |Wr |Resetting Limited-Memory Update |Section 5.4.1 in \cite Biegler:nlpbook | |Ws |Skip Limited-Memory Update since \f$s^Ty\f$ is not positive |Section 5.4.1 in \cite Biegler:nlpbook | |WS |Skip Limited-Memory Update since Δx is too small |Section 5.4.1 in \cite Biegler:nlpbook | |y |Dual infeasibility, use least square multiplier update |during ipopt algorithm | |z |Apply correction to bound multiplier if too large |during ipopt algorithm | */ coinor-ipopt-3.14.17/doc/special.dox000066400000000000000000000374211473776672200172460ustar00rootroot00000000000000/** \page SPECIALS Special Features \tableofcontents \section DERIVCHECK Derivative Checker When writing code for the evaluation of derivatives it is very easy to make mistakes (much easier than writing it correctly the first time :)). As a convenient feature, %Ipopt provides the option to run a simple derivative checker, based on finite differences, before the optimization is started. To use the derivative checker, you need to use the option \ref OPT_derivative_test "derivative_test". By default, this option is set to `none`, i.e., no finite difference test is performed. If it is set to `first-order`, then the first derivatives of the objective function and the constraints are verified, and for the setting `second-order`, the second derivatives are tested as well. The verification is done by a simple finite differences approximation, where each component of the user-provided starting point is perturbed one of the other. The relative size of the perturbation is determined by the option \ref OPT_derivative_test_perturbation "derivative_test_perturbation". The default value (10-8, about the square root of the machine precision) is probably fine in most cases, but if you believe that you see wrong warnings, you might want to play with this parameter. When the test is performed, %Ipopt prints out a line for every partial derivative, for which the user-provided derivative value deviates too much from the finite difference approximation. The relative tolerance for deciding when a warning should be issued, is determined by the option \ref OPT_derivative_test_tol "derivative_test_tol". If you want to see the user-provided and estimated derivative values with the relative deviation for each single partial derivative, you can switch the option \ref OPT_derivative_test_print_all "derivative_test_print_all" to `yes`. A typical output is: \verbatim Starting derivative checker. * grad_f[ 2] = -6.5159999999999991e+02 ~ -6.5559997134793468e+02 [ 6.101e-03] * jac_g [ 4, 4] = 0.0000000000000000e+00 ~ 2.2160643690464592e-02 [ 2.216e-02] * jac_g [ 4, 5] = 1.3798494268463347e+01 v ~ 1.3776333629422766e+01 [ 1.609e-03] * jac_g [ 6, 7] = 1.4776333636790881e+01 v ~ 1.3776333629422766e+01 [ 7.259e-02] Derivative checker detected 4 error(s). \endverbatim The star ("*") in the first column indicates that this line corresponds to some partial derivative for which the error tolerance was exceeded. Next, we see which partial derivative is concerned in this output line. For example, in the first line, it is the second component of the objective function gradient (or the third, if the C_STYLE numbering is used, i.e., when counting of indices starts with 0 instead of 1). The first floating point number is the value given by the user code, and the second number (after "~") is the finite differences estimation. Finally, the number in square brackets is the relative difference between these two numbers \f$\left(\frac{|\mathrm{approx}-\mathrm{exact}|}{\max(|\mathrm{approx}|,\mathrm{derivative\_test\_tol})}\right)\f$. For constraints, the first index after `jac_g` is the index of the constraint, and the second one corresponds to the variable index (again, the choice of the numbering style matters). Since also the sparsity structure of the constraint Jacobian has to be provided by the user, it can be faulty as well. For this, the "v" after a user-provided derivative value indicates that this component of the Jacobian is part of the user provided sparsity structure. If there is no "v", it means that the user did not include this partial derivative in the list of non-zero elements. In the above output, the partial derivative `jac_g[4,4]` is non-zero (based on the finite difference approximation), but it is not included in the list of non-zero elements (missing "v"), so that the user probably made a mistake in the sparsity structure. The other two Jacobian entries are provided in the non-zero structure but their values seem to be off. For second derivatives, the output looks like: \verbatim * obj_hess[ 1, 1] = 1.8810000000000000e+03 v ~ 1.8820000036612328e+03 [ 5.314e-04] * 3-th constr_hess[ 2, 4] = 1.0000000000000000e+00 v ~ 0.0000000000000000e+00 [ 1.000e+00] \endverbatim There, the first line shows the deviation of the user-provided partial second derivative in the Hessian for the objective function, and the second line show an error in a partial derivative for the Hessian of the third constraint (again, the numbering style matters). Since the second derivatives are approximates by finite differences of the first derivatives, you should first correct errors for the first derivatives. Also, since the finite difference approximations are quite expensive, you should try to debug a small instance of your problem if you can. Another useful option is \ref OPT_derivative_test_first_index "derivative_test_first_index" which allows your to start the derivative test with variables with a larger index. Finally, it is of course always a good idea to run your code through some memory checker, such as valgrind on Linux. \section QUASI_NEWTON Quasi-Newton Approximation of Second Derivatives %Ipopt has an option to approximate the Hessian of the Lagrangian by a limited-memory quasi-Newton method (L-BFGS). You can use this feature by setting the option \ref OPT_hessian_approximation "hessian_approximation" to the value `limited-memory`. In this case, it is not necessary to implement the Hessian computation method Ipopt::TNLP::eval_h. If you are using the C or Fortran interface, you still need to implement these functions, but they should return `false` or `IERR=1`, respectively, and don't need to do anything else. In general, when second derivatives can be computed with reasonable computational effort, it is usually a good idea to use them, since then %Ipopt normally converges in fewer iterations and is more robust. An exception might be in cases, where your optimization problem has a dense Hessian, i.e., a large percentage of non-zero entries in the Hessian. In such a case, using the quasi-Newton approximation might be better, even if it increases the number of iterations, since with exact second derivatives the computation time per iteration might be significantly higher due to the very large number of non-zero elements in the linear systems that %Ipopt solve in order to compute the search direction. Since the Hessian of the Lagrangian is zero for all variables that appear only linearly in the objective and constraint functions, the Hessian approximation should only take place in the space of all nonlinear variables. By default, it is assumed that all variables are nonlinear, but you can tell %Ipopt explicitly which variables are nonlinear, using the Ipopt::TNLP::get_number_of_nonlinear_variables and Ipopt::TNLP::get_list_of_nonlinear_variables methods, see \ref INTERFACE_CPP_ADDITIONAL. (Those methods have been implemented for the AMPL interface, so you would automatically only approximate the Hessian in the space of the nonlinear variables, if you are using the quasi-Newton option for AMPL models.) Currently, those two methods are not available through the C or Fortran interface. \section AMPL_WARMSTART Warm-Starting Capabilities via AMPL This section is based on documentation by Victor M. Zavala (Department of Chemical Engineering, Carnegie Mellon University). Warm-starting an interior-point algorithm is an important issue. One of the main difficulties arises from the fact that full-space variable information is required to generate the warm-starting point. While %Ipopt is currently equipped to retrieve and receive this type of information through the TNLP interface, there exist some communication barriers in the AMPL interface. When the user solves the problem \ref NLP "(NLP)", %Ipopt will only return the optimal values of the primal variables \f$x\f$ and of the constraint multipliers corresponding to the active sides of \f$g^L \leq g(x) \leq g^U\f$. The constraint multiplier values can be accessed through the `.dual` suffix or through the `.sol` file. If this information is used to solve the same problem again, you will notice that %Ipopt will take some iterations in finding the same solution. The reason for this is that we are missing the input information of the multipliers \f$z^L\f$ and \f$z^U\f$ corresponding to the variable bounds \f$x^L \leq x \leq x^U\f$. However, %Ipopt also passes the values of the bound multipliers \f$z^L\f$ and \f$z^U\f$ to AMPL. This will be communicated to the AMPL user through the suffixes `ipopt_zL_out` and `ipopt_zU_out`, respectively. The user does not need to declare these suffixes, they will be generated automatically in the AMPL interface. The user can use the suffix values to initialize the bound multipliers for subsequent calls. In order to pass this information to %Ipopt, the user will need to declare and assign values to the suffixes `ipopt_zL_in` and `ipopt_zU_in`. For instance, for a given variable `x[i]`, this can be done by setting: \verbatim let x[i].ipopt_zL_in := x[i].ipopt_zL_out; let x[i].ipopt_zU_in := x[i].ipopt_zU_out; \endverbatim If the user does not specify some of these values, %Ipopt will set these multipliers to 1.0 (as before). In order to make the warm-start effective, the user has control over the following options from AMPL: - \ref OPT_warm_start_init_point "warm_start_init_point" - \ref OPT_warm_start_bound_push "warm_start_bound_push" - \ref OPT_warm_start_mult_bound_push "warm_start_mult_bound_push" Note, that the use of this feature is far from solving the complicated issue of warm-starting interior-point algorithms. As a general advice, this feature will be useful if the user observes that the solution of subsequent problems (i.e., for different data instances) preserves the same set of active inequalities and bounds (monitor the values of \f$z^L\f$ and \f$z^U\f$ for subsequent solutions). In this case, initializing the bound multipliers and setting `warm_start_init_point` to `yes` and setting `warm_start_bound_push`, `warm_start_mult_bound_push`, and `mu_init` to a small value (10-6 or so) will reduce significantly the number of iterations. This is particularly useful in setting up on-line applications and high-level optimization strategies in AMPL. If active-set changes are observed between subsequent solutions, then this strategy might not decrease the number of iterations (in some cases, it might even tend to increase the number of iterations). You might also want to try the adaptive barrier update (instead of the default monotone one where above we chose the initial value 10-6) when doing the warm start. This can be activated by setting the option \ref OPT_mu_strategy "mu_strategy" to `adaptive`. Also the option \ref OPT_mu_oracle "mu_oracle" gives some alternative choices. In general, the adaptive choice often leads to less iterations, but the computational cost per iteration might be higher. The file `$IPOPTDIR/Ipopt/doc/hs071_warmstart.mod` illustrates the use of the warm-start feature on the HS071 problem, see also \ref INTERFACE_AMPL. \section SIPOPT sIpopt: Optimal Sensitivity Based on Ipopt This section is based on documentation by Hans Pirnay (RWTH Aachen) and Rodrigo López-Negrete (Carnegie Mellon University). The `sIpopt` project provides a toolbox that uses NLP sensitivity theory to generate fast approximations to solutions when parameters in the problem change. It has been developed primarily by Hans Pirnay (RWTH-Aachen), Rodrigo López-Negrete (CMU), and Lorenz Biegler (CMU). Sensitivity of nonlinear programming problems is a key step in any optimization study. Sensitivity provides information on regularity and curvature conditions at KKT points, assesses which variables play dominant roles in the optimization, and provides first order estimates for parametric nonlinear programs. Moreover, for NLP algorithms that use exact second derivatives, sensitivity can be implemented very efficiently within NLP solvers and provide valuable information with very little added computation. This implementation provides %Ipopt with the capabilities to calculate sensitivities, and approximate perturbed solutions with them. The basic sensitivity strategy implemented here is based on the application of the Implicit Function Theorem (IFT) to the KKT conditions of the NLP. As shown by Fiacco \cite Fiacco1983, sensitivities can be obtained from a solution with suitable regularity conditions merely by solving a linearization of the KKT conditions. More details can be found in \cite PLNB:sIpopt. If you are using `sIpopt` for your research, please cite \cite PLNB:sIpopt. The `sIpopt` project is available in the %Ipopt repository under `$IPOPTDIR/contrib/sIPOPT`. It is build together with the %Ipopt library and the generated library `libsipopt.*` and AMPL executable `ipopt_sens` are installed in `$PREFIX/lib` and `$PREFIX/bin`. The files `$IPOPTDIR/contrib/sIPOPT/examples/parametric_ampl/parametric.{mod,run}` are an example that shows how to use `sIpopt` to solve the NLP \f{align*}{ \min\quad & x_1^2 + x_2^2 + x_3^2, \\ \text{such that}\quad & 6x_1 + 3x_2 + 2x_3 = p_1, \\ & p_2 x_1 + x_2 - x_3 = 1, \\ & x_1, x_2, x_3 \geq 0, \f} where we perturb the parameters \f$p_1\f$ and \f$p_2\f$ from \f$p_a = (p_1, p_2) = (5, 1)\f$ to \f$p_b = (4.5, 1)\f$. Note, that `sIpopt` has been developed under the constraint that it must work with the regular %Ipopt code. Due to this constraint, some compromises had to be made. However, there is an effort to develop `sIpopt` 2, which is a fork of the %Ipopt code that allows for the explicit definition of parametric NLPs. This code can be found at . If you have questions about `sIpopt` 2, please contact ​Hans Pirnay. \section INERTIAFREE_CURVTEST Inertia-Free Curvature Test This section has been contributed by [Nai-Yuan Chiang](http://www.mcs.anl.gov/~nychiang/) (Argonne National Laboratory) and [Victor M. Zavala Tejeda](http://zavalab.engr.wisc.edu/) (University of Wisconsin-Madison). In a filter line-search setting it is necessary to detect the presence of negative curvature and to regularize the Hessian of the Lagrangian when such is present. Regularization ensures that the computed step is a descent direction for the objective function when the constraint violation is sufficiently small, which in turn is necessary to guarantee global convergence. To detect the presence of negative curvature, the default method implemented in IPOPT requires inertia information of the augmented system. The inertia of the augmented system is the number of positive, negative, and zero eigenvalues. Inertia is currently estimated using symmetric indefinite factorization routines implemented in powerful packages such as MA27, MA57, Pardiso, or SPRAL. When more general linear algebra strategies/packages are used (e.g., iterative, parallel decomposition), however, inertia information is difficult (if not impossible) to obtain. In \cite ChiangZavala2014, we present acceptance tests for the search step that do not require inertia information of the linear system and prove that such tests are sufficient to ensure global convergence. Similar tests were proposed in the exact penalty framework reported in \cite CouHubSchWae:inexact. The inertia-free approach also enables the use of a wider range of linear algebra strategies and packages. We have performed significant benchmarks and found satisfactory performance compared to the inertia-based counterpart. Moreover, we have found that this test can yield significant improvements in computing time because it provides more flexibility to accept steps. This flexibility is particularly beneficial in problems that are inherently ill-conditioned and require significant amounts of regularization. The inertia-free capability implemented in %Ipopt is controlled by the options \ref OPT_neg_curv_test_tol "neg_curv_test_tol" and \ref OPT_neg_curv_test_reg "neg_curv_test_reg". */ coinor-ipopt-3.14.17/doc/stylesheet.css000066400000000000000000000732501473776672200200150ustar00rootroot00000000000000/* The standard CSS for doxygen 1.8.18 */ body, table, div, p, dl { font: 400 14px/22px Roboto,sans-serif; } p.reference, p.definition { font: 400 14px/22px Roboto,sans-serif; } /* @group Heading Levels */ h1.groupheader { font-size: 150%; } .title { font: 400 14px/28px Roboto,sans-serif; font-size: 150%; font-weight: bold; margin: 10px 2px; } h2.groupheader { border-bottom: 1px solid #879ECB; color: #354C7B; font-size: 150%; font-weight: normal; margin-top: 1.75em; padding-top: 8px; padding-bottom: 4px; width: 100%; } h3.groupheader { font-size: 100%; } h1, h2, h3, h4, h5, h6 { -webkit-transition: text-shadow 0.5s linear; -moz-transition: text-shadow 0.5s linear; -ms-transition: text-shadow 0.5s linear; -o-transition: text-shadow 0.5s linear; transition: text-shadow 0.5s linear; margin-right: 15px; } h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { text-shadow: 0 0 15px cyan; } dt { font-weight: bold; } ul.multicol { -moz-column-gap: 1em; -webkit-column-gap: 1em; column-gap: 1em; -moz-column-count: 3; -webkit-column-count: 3; column-count: 3; } p.startli, p.startdd { margin-top: 2px; } th p.starttd, p.intertd, p.endtd { font-size: 100%; font-weight: 700; } p.starttd { margin-top: 0px; } p.endli { margin-bottom: 0px; } p.enddd { margin-bottom: 4px; } p.endtd { margin-bottom: 2px; } p.interli { } p.interdd { } p.intertd { } /* @end */ caption { font-weight: bold; } span.legend { font-size: 70%; text-align: center; } h3.version { font-size: 90%; text-align: center; } div.qindex, div.navtab{ background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; } div.qindex, div.navpath { width: 100%; line-height: 140%; } div.navtab { margin-right: 15px; } /* @group Link Styling */ a { color: #3D578C; font-weight: normal; text-decoration: none; } .contents a:visited { color: #4665A2; } a:hover { text-decoration: underline; } a.qindex { font-weight: bold; } a.qindexHL { font-weight: bold; background-color: #9CAFD4; color: #FFFFFF; border: 1px double #869DCA; } .contents a.qindexHL:visited { color: #FFFFFF; } a.el { font-weight: bold; } a.elRef { } a.code, a.code:visited, a.line, a.line:visited { color: #4665A2; } a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { color: #4665A2; } /* @end */ dl.el { margin-left: -1cm; } ul { overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ } #side-nav ul { overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ } #main-nav ul { overflow: visible; /* reset ul rule for the navigation bar drop down lists */ } .fragment { text-align: left; direction: ltr; overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ overflow-y: hidden; } pre.fragment { border: 1px solid #C4CFE5; background-color: #FBFCFD; padding: 4px 6px; margin: 4px 8px 4px 2px; overflow: auto; word-wrap: break-word; font-size: 9pt; line-height: 125%; font-family: monospace, fixed; font-size: 105%; } div.fragment { padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ margin: 4px 8px 4px 2px; background-color: #FBFCFD; border: 1px solid #C4CFE5; } div.line { font-family: monospace, fixed; font-size: 13px; min-height: 13px; line-height: 1.0; text-wrap: unrestricted; white-space: -moz-pre-wrap; /* Moz */ white-space: -pre-wrap; /* Opera 4-6 */ white-space: -o-pre-wrap; /* Opera 7 */ white-space: pre-wrap; /* CSS3 */ word-wrap: break-word; /* IE 5.5+ */ text-indent: -53px; padding-left: 53px; padding-bottom: 0px; margin: 0px; -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; -moz-transition-duration: 0.5s; -ms-transition-property: background-color, box-shadow; -ms-transition-duration: 0.5s; -o-transition-property: background-color, box-shadow; -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } div.line:after { content:"\000A"; white-space: pre; } div.line.glow { background-color: cyan; box-shadow: 0 0 10px cyan; } span.lineno { padding-right: 4px; text-align: right; border-right: 2px solid #0F0; background-color: #E8E8E8; white-space: pre; } span.lineno a { background-color: #D8D8D8; } span.lineno a:hover { background-color: #C8C8C8; } .lineno { -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } div.ah, span.ah { background-color: black; font-weight: bold; color: #FFFFFF; margin-bottom: 3px; margin-top: 3px; padding: 0.2em; border: solid thin #333; border-radius: 0.5em; -webkit-border-radius: .5em; -moz-border-radius: .5em; box-shadow: 2px 2px 3px #999; -webkit-box-shadow: 2px 2px 3px #999; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); } div.classindex ul { list-style: none; padding-left: 0; } div.classindex span.ai { display: inline-block; } div.groupHeader { margin-left: 16px; margin-top: 12px; font-weight: bold; } div.groupText { margin-left: 16px; font-style: italic; } body { background-color: white; color: black; margin: 0; } div.contents { margin-top: 10px; margin-left: 12px; margin-right: 8px; } td.indexkey { background-color: #EBEFF6; font-weight: bold; border: 1px solid #C4CFE5; margin: 2px 0px 2px 0; padding: 2px 10px; white-space: nowrap; vertical-align: top; } td.indexvalue { background-color: #EBEFF6; border: 1px solid #C4CFE5; padding: 2px 10px; margin: 2px 0px; } tr.memlist { background-color: #EEF1F7; } p.formulaDsp { text-align: center; } img.formulaDsp { } img.formulaInl, img.inline { vertical-align: middle; } div.center { text-align: center; margin-top: 0px; margin-bottom: 0px; padding: 0px; } div.center img { border: 0px; } address.footer { text-align: right; padding-right: 12px; } img.footer { border: 0px; vertical-align: middle; } /* @group Code Colorization */ span.keyword { color: #008000 } span.keywordtype { color: #604020 } span.keywordflow { color: #e08000 } span.comment { color: #800000 } span.preprocessor { color: #806020 } span.stringliteral { color: #002080 } span.charliteral { color: #008080 } span.vhdldigit { color: #ff00ff } span.vhdlchar { color: #000000 } span.vhdlkeyword { color: #700070 } span.vhdllogic { color: #ff0000 } blockquote { background-color: #F7F8FB; border-left: 2px solid #9CAFD4; margin: 0 24px 0 4px; padding: 0 12px 0 16px; } blockquote.DocNodeRTL { border-left: 0; border-right: 2px solid #9CAFD4; margin: 0 4px 0 24px; padding: 0 16px 0 12px; } /* @end */ /* .search { color: #003399; font-weight: bold; } form.search { margin-bottom: 0px; margin-top: 0px; } input.search { font-size: 75%; color: #000080; font-weight: normal; background-color: #e8eef2; } */ td.tiny { font-size: 75%; } .dirtab { padding: 4px; border-collapse: collapse; border: 1px solid #A3B4D7; } th.dirtab { background: #EBEFF6; font-weight: bold; } hr { height: 0px; border: none; border-top: 1px solid #4A6AAA; } hr.footer { height: 1px; } /* @group Member Descriptions */ table.memberdecls { border-spacing: 0px; padding: 0px; } .memberdecls td, .fieldtable tr { -webkit-transition-property: background-color, box-shadow; -webkit-transition-duration: 0.5s; -moz-transition-property: background-color, box-shadow; -moz-transition-duration: 0.5s; -ms-transition-property: background-color, box-shadow; -ms-transition-duration: 0.5s; -o-transition-property: background-color, box-shadow; -o-transition-duration: 0.5s; transition-property: background-color, box-shadow; transition-duration: 0.5s; } .memberdecls td.glow, .fieldtable tr.glow { background-color: cyan; box-shadow: 0 0 15px cyan; } .mdescLeft, .mdescRight, .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight, .memTemplParams { background-color: #F9FAFC; border: none; margin: 4px; padding: 1px 0 0 8px; } .mdescLeft, .mdescRight { padding: 0px 8px 4px 8px; color: #555; } .memSeparator { border-bottom: 1px solid #DEE4F0; line-height: 1px; margin: 0px; padding: 0px; } .memItemLeft, .memTemplItemLeft { white-space: nowrap; } .memItemRight, .memTemplItemRight { width: 100%; } .memTemplParams { color: #4665A2; white-space: nowrap; font-size: 80%; } /* @end */ /* @group Member Details */ /* Styles for detailed member documentation */ .memtitle { padding: 8px; border-top: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; border-top-right-radius: 4px; border-top-left-radius: 4px; margin-bottom: -1px; background-image: url('nav_f.png'); background-repeat: repeat-x; background-color: #E2E8F2; line-height: 1.25; font-weight: 300; float:left; } .permalink { font-size: 65%; display: inline-block; vertical-align: middle; } .memtemplate { font-size: 80%; color: #4665A2; font-weight: normal; margin-left: 9px; } .memnav { background-color: #EBEFF6; border: 1px solid #A3B4D7; text-align: center; margin: 2px; margin-right: 15px; padding: 2px; } .mempage { width: 100%; } .memitem { padding: 0; margin-bottom: 10px; margin-right: 5px; -webkit-transition: box-shadow 0.5s linear; -moz-transition: box-shadow 0.5s linear; -ms-transition: box-shadow 0.5s linear; -o-transition: box-shadow 0.5s linear; transition: box-shadow 0.5s linear; display: table !important; width: 100%; } .memitem.glow { box-shadow: 0 0 15px cyan; } .memname { font-weight: 400; margin-left: 6px; } .memname td { vertical-align: bottom; } .memproto, dl.reflist dt { border-top: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 0px 6px 0px; color: #253555; font-weight: bold; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); background-color: #DFE5F1; /* opera specific markup */ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); border-top-right-radius: 4px; /* firefox specific markup */ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; -moz-border-radius-topright: 4px; /* webkit specific markup */ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -webkit-border-top-right-radius: 4px; } .overload { font-family: "courier new",courier,monospace; font-size: 65%; } .memdoc, dl.reflist dd { border-bottom: 1px solid #A8B8D9; border-left: 1px solid #A8B8D9; border-right: 1px solid #A8B8D9; padding: 6px 10px 2px 10px; background-color: #FBFCFD; border-top-width: 0; background-image:url('nav_g.png'); background-repeat:repeat-x; background-color: #FFFFFF; /* opera specific markup */ border-bottom-left-radius: 4px; border-bottom-right-radius: 4px; box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); /* firefox specific markup */ -moz-border-radius-bottomleft: 4px; -moz-border-radius-bottomright: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; /* webkit specific markup */ -webkit-border-bottom-left-radius: 4px; -webkit-border-bottom-right-radius: 4px; -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); } dl.reflist dt { padding: 5px; } dl.reflist dd { margin: 0px 0px 10px 0px; padding: 5px; } .paramkey { text-align: right; } .paramtype { white-space: nowrap; } .paramname { color: #602020; white-space: nowrap; } .paramname em { font-style: normal; } .paramname code { line-height: 14px; } .params, .retval, .exception, .tparams { margin-left: 0px; padding-left: 0px; } .params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { font-weight: bold; vertical-align: top; } .params .paramtype, .tparams .paramtype { font-style: italic; vertical-align: top; } .params .paramdir, .tparams .paramdir { font-family: "courier new",courier,monospace; vertical-align: top; } table.mlabels { border-spacing: 0px; } td.mlabels-left { width: 100%; padding: 0px; } td.mlabels-right { vertical-align: bottom; padding: 0px; white-space: nowrap; } span.mlabels { margin-left: 8px; } span.mlabel { background-color: #728DC1; border-top:1px solid #5373B4; border-left:1px solid #5373B4; border-right:1px solid #C4CFE5; border-bottom:1px solid #C4CFE5; text-shadow: none; color: white; margin-right: 4px; padding: 2px 3px; border-radius: 3px; font-size: 7pt; white-space: nowrap; vertical-align: middle; } /* @end */ /* these are for tree view inside a (index) page */ div.directory { margin: 10px 0px; border-top: 1px solid #9CAFD4; border-bottom: 1px solid #9CAFD4; width: 100%; } .directory table { border-collapse:collapse; } .directory td { margin: 0px; padding: 0px; vertical-align: top; } .directory td.entry { white-space: nowrap; padding-right: 6px; padding-top: 3px; } .directory td.entry a { outline:none; } .directory td.entry a img { border: none; } .directory td.desc { width: 100%; padding-left: 6px; padding-right: 6px; padding-top: 3px; border-left: 1px solid rgba(0,0,0,0.05); } .directory tr.even { padding-left: 6px; background-color: #F7F8FB; } .directory img { vertical-align: -30%; } .directory .levels { white-space: nowrap; width: 100%; text-align: right; font-size: 9pt; } .directory .levels span { cursor: pointer; padding-left: 2px; padding-right: 2px; color: #3D578C; } .arrow { color: #9CAFD4; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; cursor: pointer; font-size: 80%; display: inline-block; width: 16px; height: 22px; } .icon { font-family: Arial, Helvetica; font-weight: bold; font-size: 12px; height: 14px; width: 16px; display: inline-block; background-color: #728DC1; color: white; text-align: center; border-radius: 4px; margin-left: 2px; margin-right: 2px; } .icona { width: 24px; height: 22px; display: inline-block; } .iconfopen { width: 24px; height: 18px; margin-bottom: 4px; background-image:url('folderopen.png'); background-position: 0px -4px; background-repeat: repeat-y; vertical-align:top; display: inline-block; } .iconfclosed { width: 24px; height: 18px; margin-bottom: 4px; background-image:url('folderclosed.png'); background-position: 0px -4px; background-repeat: repeat-y; vertical-align:top; display: inline-block; } .icondoc { width: 24px; height: 18px; margin-bottom: 4px; background-image:url('doc.png'); background-position: 0px -4px; background-repeat: repeat-y; vertical-align:top; display: inline-block; } table.directory { font: 400 14px Roboto,sans-serif; } /* @end */ div.dynheader { margin-top: 8px; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } address { font-style: normal; color: #2A3D61; } table.doxtable caption { caption-side: top; } table.doxtable { border-collapse:collapse; margin-top: 4px; margin-bottom: 4px; } table.doxtable td, table.doxtable th { border: 1px solid #2D4068; padding: 3px 7px 2px; } table.doxtable th { background-color: #374F7F; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; } table.fieldtable { /*width: 100%;*/ margin-bottom: 10px; border: 1px solid #A8B8D9; border-spacing: 0px; -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); } .fieldtable td, .fieldtable th { padding: 3px 7px 2px; } .fieldtable td.fieldtype, .fieldtable td.fieldname { white-space: nowrap; border-right: 1px solid #A8B8D9; border-bottom: 1px solid #A8B8D9; vertical-align: top; } .fieldtable td.fieldname { padding-top: 3px; } .fieldtable td.fielddoc { border-bottom: 1px solid #A8B8D9; /*width: 100%;*/ } .fieldtable td.fielddoc p:first-child { margin-top: 0px; } .fieldtable td.fielddoc p:last-child { margin-bottom: 2px; } .fieldtable tr:last-child td { border-bottom: none; } .fieldtable th { background-image:url('nav_f.png'); background-repeat:repeat-x; background-color: #E2E8F2; font-size: 90%; color: #253555; padding-bottom: 4px; padding-top: 5px; text-align:left; font-weight: 400; -moz-border-radius-topleft: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-left-radius: 4px; -webkit-border-top-right-radius: 4px; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom: 1px solid #A8B8D9; } .tabsearch { top: 0px; left: 10px; height: 36px; background-image: url('tab_b.png'); z-index: 101; overflow: hidden; font-size: 13px; } .navpath ul { font-size: 11px; background-image:url('tab_b.png'); background-repeat:repeat-x; background-position: 0 -5px; height:30px; line-height:30px; color:#8AA0CC; border:solid 1px #C2CDE4; overflow:hidden; margin:0px; padding:0px; } .navpath li { list-style-type:none; float:left; padding-left:10px; padding-right:15px; background-image:url('bc_s.png'); background-repeat:no-repeat; background-position:right; color:#364D7C; } .navpath li.navelem a { height:32px; display:block; text-decoration: none; outline: none; color: #283A5D; font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); text-decoration: none; } .navpath li.navelem a:hover { color:#6884BD; } .navpath li.footer { list-style-type:none; float:right; padding-left:10px; padding-right:15px; background-image:none; background-repeat:no-repeat; background-position:right; color:#364D7C; font-size: 8pt; } div.summary { float: right; font-size: 8pt; padding-right: 5px; width: 50%; text-align: right; } div.summary a { white-space: nowrap; } table.classindex { margin: 10px; white-space: nowrap; margin-left: 3%; margin-right: 3%; width: 94%; border: 0; border-spacing: 0; padding: 0; } div.ingroups { font-size: 8pt; width: 50%; text-align: left; } div.ingroups a { white-space: nowrap; } div.header { background-image:url('nav_h.png'); background-repeat:repeat-x; background-color: #F9FAFC; margin: 0px; border-bottom: 1px solid #C4CFE5; } div.headertitle { padding: 5px 5px 5px 10px; } .PageDocRTL-title div.headertitle { text-align: right; direction: rtl; } dl { padding: 0 0 0 0; } /* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ dl.section { margin-left: 0px; padding-left: 0px; } dl.section.DocNodeRTL { margin-right: 0px; padding-right: 0px; } dl.note { margin-left: -7px; padding-left: 3px; border-left: 4px solid; border-color: #D0C000; } dl.note.DocNodeRTL { margin-left: 0; padding-left: 0; border-left: 0; margin-right: -7px; padding-right: 3px; border-right: 4px solid; border-color: #D0C000; } dl.warning, dl.attention { margin-left: -7px; padding-left: 3px; border-left: 4px solid; border-color: #FF0000; } dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { margin-left: 0; padding-left: 0; border-left: 0; margin-right: -7px; padding-right: 3px; border-right: 4px solid; border-color: #FF0000; } dl.pre, dl.post, dl.invariant { margin-left: -7px; padding-left: 3px; border-left: 4px solid; border-color: #00D000; } dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { margin-left: 0; padding-left: 0; border-left: 0; margin-right: -7px; padding-right: 3px; border-right: 4px solid; border-color: #00D000; } dl.deprecated { margin-left: -7px; padding-left: 3px; border-left: 4px solid; border-color: #505050; } dl.deprecated.DocNodeRTL { margin-left: 0; padding-left: 0; border-left: 0; margin-right: -7px; padding-right: 3px; border-right: 4px solid; border-color: #505050; } dl.todo { margin-left: -7px; padding-left: 3px; border-left: 4px solid; border-color: #00C0E0; } dl.todo.DocNodeRTL { margin-left: 0; padding-left: 0; border-left: 0; margin-right: -7px; padding-right: 3px; border-right: 4px solid; border-color: #00C0E0; } dl.test { margin-left: -7px; padding-left: 3px; border-left: 4px solid; border-color: #3030E0; } dl.test.DocNodeRTL { margin-left: 0; padding-left: 0; border-left: 0; margin-right: -7px; padding-right: 3px; border-right: 4px solid; border-color: #3030E0; } dl.bug { margin-left: -7px; padding-left: 3px; border-left: 4px solid; border-color: #C08050; } dl.bug.DocNodeRTL { margin-left: 0; padding-left: 0; border-left: 0; margin-right: -7px; padding-right: 3px; border-right: 4px solid; border-color: #C08050; } dl.section dd { margin-bottom: 6px; } #projectlogo { text-align: center; vertical-align: bottom; border-collapse: separate; } #projectlogo img { border: 0px none; } #projectalign { vertical-align: middle; } #projectname { font: 200% Arial,sans-serif; margin: 0px; padding: 2px 0px; } #projectbrief { font: 120% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #projectnumber { font: 50% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } #titlearea { padding: 0px; margin: 0px; width: 100%; border-bottom: 1px solid #5373B4; } .image { text-align: center; } .dotgraph { text-align: center; } .mscgraph { text-align: center; } .plantumlgraph { text-align: center; } .diagraph { text-align: center; } .caption { font-weight: bold; } div.zoom { border: 1px solid #90A5CE; } dl.citelist { margin-bottom:50px; } dl.citelist dt { color:#334975; float:left; font-weight:bold; margin-right:10px; padding:5px; } dl.citelist dd { margin:2px 0; padding:5px 0; } div.toc { padding: 14px 25px; background-color: #F4F6FA; border: 1px solid #D8DFEE; border-radius: 7px 7px 7px 7px; float: right; height: auto; margin: 0 8px 10px 10px; width: 200px; } .PageDocRTL-title div.toc { float: left !important; text-align: right; } div.toc li { background: url("bdwn.png") no-repeat scroll 0 5px transparent; font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; margin-top: 5px; padding-left: 10px; padding-top: 2px; } .PageDocRTL-title div.toc li { background-position-x: right !important; padding-left: 0 !important; padding-right: 10px; } div.toc h3 { font: bold 12px/1.2 Arial,FreeSans,sans-serif; color: #4665A2; border-bottom: 0 none; margin: 0; } div.toc ul { list-style: none outside none; border: medium none; padding: 0px; } div.toc li.level1 { margin-left: 0px; } div.toc li.level2 { margin-left: 15px; } div.toc li.level3 { margin-left: 30px; } div.toc li.level4 { margin-left: 45px; } .PageDocRTL-title div.toc li.level1 { margin-left: 0 !important; margin-right: 0; } .PageDocRTL-title div.toc li.level2 { margin-left: 0 !important; margin-right: 15px; } .PageDocRTL-title div.toc li.level3 { margin-left: 0 !important; margin-right: 30px; } .PageDocRTL-title div.toc li.level4 { margin-left: 0 !important; margin-right: 45px; } .inherit_header { font-weight: bold; color: gray; cursor: pointer; -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .inherit_header td { padding: 6px 0px 2px 5px; } .inherit { display: none; } tr.heading h2 { margin-top: 12px; margin-bottom: 4px; } /* tooltip related style info */ .ttc { position: absolute; display: none; } #powerTip { cursor: default; white-space: nowrap; background-color: white; border: 1px solid gray; border-radius: 4px 4px 4px 4px; box-shadow: 1px 1px 7px gray; display: none; font-size: smaller; max-width: 80%; opacity: 0.9; padding: 1ex 1em 1em; position: absolute; z-index: 2147483647; } #powerTip div.ttdoc { color: grey; font-style: italic; } #powerTip div.ttname a { font-weight: bold; } #powerTip div.ttname { font-weight: bold; } #powerTip div.ttdeci { color: #006318; } #powerTip div { margin: 0px; padding: 0px; font: 12px/16px Roboto,sans-serif; } #powerTip:before, #powerTip:after { content: ""; position: absolute; margin: 0px; } #powerTip.n:after, #powerTip.n:before, #powerTip.s:after, #powerTip.s:before, #powerTip.w:after, #powerTip.w:before, #powerTip.e:after, #powerTip.e:before, #powerTip.ne:after, #powerTip.ne:before, #powerTip.se:after, #powerTip.se:before, #powerTip.nw:after, #powerTip.nw:before, #powerTip.sw:after, #powerTip.sw:before { border: solid transparent; content: " "; height: 0; width: 0; position: absolute; } #powerTip.n:after, #powerTip.s:after, #powerTip.w:after, #powerTip.e:after, #powerTip.nw:after, #powerTip.ne:after, #powerTip.sw:after, #powerTip.se:after { border-color: rgba(255, 255, 255, 0); } #powerTip.n:before, #powerTip.s:before, #powerTip.w:before, #powerTip.e:before, #powerTip.nw:before, #powerTip.ne:before, #powerTip.sw:before, #powerTip.se:before { border-color: rgba(128, 128, 128, 0); } #powerTip.n:after, #powerTip.n:before, #powerTip.ne:after, #powerTip.ne:before, #powerTip.nw:after, #powerTip.nw:before { top: 100%; } #powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { border-top-color: #FFFFFF; border-width: 10px; margin: 0px -10px; } #powerTip.n:before { border-top-color: #808080; border-width: 11px; margin: 0px -11px; } #powerTip.n:after, #powerTip.n:before { left: 50%; } #powerTip.nw:after, #powerTip.nw:before { right: 14px; } #powerTip.ne:after, #powerTip.ne:before { left: 14px; } #powerTip.s:after, #powerTip.s:before, #powerTip.se:after, #powerTip.se:before, #powerTip.sw:after, #powerTip.sw:before { bottom: 100%; } #powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { border-bottom-color: #FFFFFF; border-width: 10px; margin: 0px -10px; } #powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { border-bottom-color: #808080; border-width: 11px; margin: 0px -11px; } #powerTip.s:after, #powerTip.s:before { left: 50%; } #powerTip.sw:after, #powerTip.sw:before { right: 14px; } #powerTip.se:after, #powerTip.se:before { left: 14px; } #powerTip.e:after, #powerTip.e:before { left: 100%; } #powerTip.e:after { border-left-color: #FFFFFF; border-width: 10px; top: 50%; margin-top: -10px; } #powerTip.e:before { border-left-color: #808080; border-width: 11px; top: 50%; margin-top: -11px; } #powerTip.w:after, #powerTip.w:before { right: 100%; } #powerTip.w:after { border-right-color: #FFFFFF; border-width: 10px; top: 50%; margin-top: -10px; } #powerTip.w:before { border-right-color: #808080; border-width: 11px; top: 50%; margin-top: -11px; } @media print { #top { display: none; } #side-nav { display: none; } #nav-path { display: none; } body { overflow:visible; } h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } .summary { display: none; } .memitem { page-break-inside: avoid; } #doc-content { margin-left:0 !important; height:auto !important; width:auto !important; overflow:inherit; display:inline; } } /* @group Markdown */ table.markdownTable { border-collapse:collapse; margin-top: 4px; margin-bottom: 4px; } table.markdownTable td, table.markdownTable th { border: 1px solid #2D4068; padding: 3px 7px 2px; } table.markdownTable tr { } th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { background-color: #374F7F; color: #FFFFFF; font-size: 110%; padding-bottom: 4px; padding-top: 5px; } th.markdownTableHeadLeft, td.markdownTableBodyLeft { text-align: left } th.markdownTableHeadRight, td.markdownTableBodyRight { text-align: right } th.markdownTableHeadCenter, td.markdownTableBodyCenter { text-align: center } .DocNodeRTL { text-align: right; direction: rtl; } .DocNodeLTR { text-align: left; direction: ltr; } table.DocNodeRTL { width: auto; margin-right: 0; margin-left: auto; } table.DocNodeLTR { width: auto; margin-right: auto; margin-left: 0; } tt, code, kbd, samp { display: inline-block; direction:ltr; } /* @end */ u { text-decoration: underline; } coinor-ipopt-3.14.17/examples/000077500000000000000000000000001473776672200161545ustar00rootroot00000000000000coinor-ipopt-3.14.17/examples/Cpp_example/000077500000000000000000000000001473776672200204115ustar00rootroot00000000000000coinor-ipopt-3.14.17/examples/Cpp_example/Makefile.in000066400000000000000000000037061473776672200224640ustar00rootroot00000000000000# Copyright (C) 2003, 2010 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. ########################################################################## # You can modify this example makefile to fit for your own program. # # Usually, you only need to change the four CHANGEME entries below. # ########################################################################## # CHANGEME: This should be the name of your executable EXE = cpp_example@EXEEXT@ # CHANGEME: Here is the name of all object files corresponding to the source # code that you wrote in order to define the problem statement OBJS = cpp_example.@OBJEXT@ \ MyNLP.@OBJEXT@ # CHANGEME: Additional libraries ADDLIBS = # CHANGEME: Additional flags for compilation (e.g., include flags) ADDINCFLAGS = ########################################################################## # Usually, you don't have to change anything below. Note that if you # # change certain compiler options, you might have to recompile Ipopt. # ########################################################################## # C++ Compiler command CXX = @CXX@ # C++ Compiler options CXXFLAGS = @CXXFLAGS@ # additional C++ Compiler options for linking CXXLINKFLAGS = @RPATH_FLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ # Include directories @COIN_HAS_PKGCONFIG_TRUE@INCL = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --cflags ipopt` $(ADDINCFLAGS) @COIN_HAS_PKGCONFIG_FALSE@INCL = -I@includedir@/coin-or @IPOPTLIB_CFLAGS@ $(ADDINCFLAGS) # Linker flags @COIN_HAS_PKGCONFIG_TRUE@LIBS = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --libs ipopt` @COIN_HAS_PKGCONFIG_FALSE@LIBS = -L@libdir@ -lipopt @IPOPTLIB_LFLAGS@ all: $(EXE) .SUFFIXES: .cpp .@OBJEXT@ $(EXE): $(OBJS) $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $(OBJS) $(LIBS) $(ADDLIBS) clean: rm -rf $(EXE) $(OBJS) .cpp.@OBJEXT@: $(CXX) $(CXXFLAGS) $(INCL) -c -o $@ $< coinor-ipopt-3.14.17/examples/Cpp_example/MyNLP.cpp000066400000000000000000000131011473776672200220500ustar00rootroot00000000000000// Copyright (C) 2004, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2004-11-05 #include "MyNLP.hpp" #include #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wunused-parameter" #endif using namespace Ipopt; /* Constructor. */ MyNLP::MyNLP() { } MyNLP::~MyNLP() { } bool MyNLP::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem described in MyNLP.hpp has 2 variables, x1, & x2, n = 2; // one equality constraint, m = 1; // 2 nonzeros in the jacobian (one for x1, and one for x2), nnz_jac_g = 2; // and 2 nonzeros in the hessian of the lagrangian // (one in the hessian of the objective for x2, // and one in the hessian of the constraints for x1) nnz_h_lag = 2; // We use the standard fortran index style for row/col entries index_style = FORTRAN_STYLE; return true; } bool MyNLP::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // here, the n and m we gave IPOPT in get_nlp_info are passed back to us. // If desired, we could assert to make sure they are what we think they are. assert(n == 2); assert(m == 1); // x1 has a lower bound of -1 and an upper bound of 1 x_l[0] = -1.0; x_u[0] = 1.0; // x2 has no upper or lower bound, so we set them to // a large negative and a large positive number. // The value that is interpretted as -/+infinity can be // set in the options, but it defaults to -/+1e19 x_l[1] = -1.0e19; x_u[1] = +1.0e19; // we have one equality constraint, so we set the bounds on this constraint // to be equal (and zero). g_l[0] = g_u[0] = 0.0; return true; } bool MyNLP::get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the others if // you wish. assert(init_x == true); assert(init_z == false); assert(init_lambda == false); // we initialize x in bounds, in the upper right quadrant x[0] = 0.5; x[1] = 1.5; return true; } bool MyNLP::eval_f( Index n, const Number* x, bool new_x, Number& obj_value ) { // return the value of the objective function Number x2 = x[1]; obj_value = -(x2 - 2.0) * (x2 - 2.0); return true; } bool MyNLP::eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) // grad_{x1} f(x): x1 is not in the objective grad_f[0] = 0.0; // grad_{x2} f(x): Number x2 = x[1]; grad_f[1] = -2.0 * (x2 - 2.0); return true; } bool MyNLP::eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ) { // return the value of the constraints: g(x) Number x1 = x[0]; Number x2 = x[1]; g[0] = -(x1 * x1 + x2 - 1.0); return true; } bool MyNLP::eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints // element at 1,1: grad_{x1} g_{1}(x) iRow[0] = 1; jCol[0] = 1; // element at 1,2: grad_{x2} g_{1}(x) iRow[1] = 1; jCol[1] = 2; } else { // return the values of the jacobian of the constraints Number x1 = x[0]; // element at 1,1: grad_{x1} g_{1}(x) values[0] = -2.0 * x1; // element at 1,2: grad_{x1} g_{1}(x) values[1] = -1.0; } return true; } bool MyNLP::eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. // element at 1,1: grad^2_{x1,x1} L(x,lambda) iRow[0] = 1; jCol[0] = 1; // element at 2,2: grad^2_{x2,x2} L(x,lambda) iRow[1] = 2; jCol[1] = 2; // Note: off-diagonal elements are zero for this problem } else { // return the values // element at 1,1: grad^2_{x1,x1} L(x,lambda) values[0] = -2.0 * lambda[0]; // element at 2,2: grad^2_{x2,x2} L(x,lambda) values[1] = -2.0 * obj_factor; // Note: off-diagonal elements are zero for this problem } return true; } void MyNLP::finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ) { // here is where we would store the solution to variables, or write to a file, etc // so we could use the solution. Since the solution is displayed to the console, // we currently do nothing here. } coinor-ipopt-3.14.17/examples/Cpp_example/MyNLP.hpp000066400000000000000000000103641473776672200220650ustar00rootroot00000000000000// Copyright (C) 2004, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2004-11-05 #ifndef __MYNLP_HPP__ #define __MYNLP_HPP__ #include "IpTNLP.hpp" using namespace Ipopt; /** C++ Example NLP for interfacing a problem with IPOPT. * MyNLP implements a C++ example showing how to interface with IPOPT * through the TNLP interface. This example is designed to go along with * the tutorial document (see Examples/CppTutorial/). * This class implements the following NLP. * * min_x f(x) = -(x2-2)^2 * s.t. * 0 = x1^2 + x2 - 1 * -1 <= x1 <= 1 * */ class MyNLP: public TNLP { public: /** default constructor */ MyNLP(); /** default destructor */ virtual ~MyNLP(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MyNLP( const MyNLP& ); MyNLP& operator=( const MyNLP& ); //@} }; #endif coinor-ipopt-3.14.17/examples/Cpp_example/cpp_example.cpp000066400000000000000000000030121473776672200234060ustar00rootroot00000000000000// Copyright (C) 2004, 2009 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2004-11-05 #include "IpIpoptApplication.hpp" #include "IpSolveStatistics.hpp" #include "MyNLP.hpp" #include using namespace Ipopt; int main( int, char** ) { // Create an instance of your nlp... SmartPtr mynlp = new MyNLP(); // Create an instance of the IpoptApplication // // We are using the factory, since this allows us to compile this // example with an Ipopt Windows DLL SmartPtr app = IpoptApplicationFactory(); // Initialize the IpoptApplication and process the options ApplicationReturnStatus status; status = app->Initialize(); if( status != Solve_Succeeded ) { std::cout << std::endl << std::endl << "*** Error during initialization!" << std::endl; return (int) status; } status = app->OptimizeTNLP(mynlp); if( status == Solve_Succeeded ) { // Retrieve some statistics about the solve Index iter_count = app->Statistics()->IterationCount(); std::cout << std::endl << std::endl << "*** The problem solved in " << iter_count << " iterations!" << std::endl; Number final_obj = app->Statistics()->FinalObjective(); std::cout << std::endl << std::endl << "*** The final value of the objective function is " << final_obj << '.' << std::endl; } return (int) status; } coinor-ipopt-3.14.17/examples/ScalableProblems/000077500000000000000000000000001473776672200213665ustar00rootroot00000000000000coinor-ipopt-3.14.17/examples/ScalableProblems/LuksanVlcek1.cpp000066400000000000000000000173031473776672200244010ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-127 #include "LuksanVlcek1.hpp" #include #include using namespace Ipopt; LuksanVlcek1::LuksanVlcek1( Number g_l, Number g_u ) : g_l_(g_l), g_u_(g_u) { } bool LuksanVlcek1::InitializeProblem( Index N ) { N_ = N; if( N_ <= 2 ) { printf("N needs to be at least 3.\n"); return false; } return true; } // returns the size of the problem bool LuksanVlcek1::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem described in LuksanVlcek1.hpp has 4 variables, x[0] through x[3] n = N_; m = N_ - 2; nnz_jac_g = m * 3; nnz_h_lag = n + n - 1; // use the C style numbering of matrix indices (starting at 0) index_style = TNLP::C_STYLE; return true; } // returns the variable bounds bool LuksanVlcek1::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // none of the variables have bounds for( Index i = 0; i < n; i++ ) { x_l[i] = -1e20; x_u[i] = 1e20; } // Set the bounds for the constraints for( Index i = 0; i < m; i++ ) { g_l[i] = g_l_; g_u[i] = g_u_; } return true; } // returns the initial point for the problem bool LuksanVlcek1::get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { if( !init_x || init_z || init_lambda ) { return false; } // set the starting point for( Index i = 0; i < n / 2; i++ ) { x[2 * i] = -1.2; x[2 * i + 1] = 1.; } if( n != 2 * (n / 2) ) { x[n - 1] = -1.2; } return true; } // returns the value of the objective function bool LuksanVlcek1::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { obj_value = 0.; for( Index i = 0; i < N_ - 1; i++ ) { Number a1 = x[i] * x[i] - x[i + 1]; Number a2 = x[i] - 1.; obj_value += 100. * a1 * a1 + a2 * a2; } return true; } // return the gradient of the objective function grad_{x} f(x) bool LuksanVlcek1::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { grad_f[0] = 0.; for( Index i = 0; i < N_ - 1; i++ ) { grad_f[i] += 400. * x[i] * (x[i] * x[i] - x[i + 1]) + 2. * (x[i] - 1.); grad_f[i + 1] = -200. * (x[i] * x[i] - x[i + 1]); } return true; } // return the value of the constraints: g(x) bool LuksanVlcek1::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { for( Index i = 0; i < N_ - 2; i++ ) { g[i] = 3. * std::pow(x[i + 1], 3.) + 2. * x[i + 2] - 5. + std::sin(x[i + 1] - x[i + 2]) * std::sin(x[i + 1] + x[i + 2]) + 4. * x[i + 1] - x[i] * std::exp(x[i] - x[i + 1]) - 3.; } return true; } // return the structure or values of the jacobian bool LuksanVlcek1::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index /*nele_jac*/, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian Index ijac = 0; for( Index i = 0; i < N_ - 2; i++ ) { iRow[ijac] = i; jCol[ijac] = i; ijac++; iRow[ijac] = i; jCol[ijac] = i + 1; ijac++; iRow[ijac] = i; jCol[ijac] = i + 2; ijac++; } } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 0; i < N_ - 2; i++ ) { // x[i] values[ijac] = -(1. + x[i]) * std::exp(x[i] - x[i + 1]); ijac++; // x[i+1] values[ijac] = 9. * x[i + 1] * x[i + 1] + std::cos(x[i + 1] - x[i + 2]) * std::sin(x[i + 1] + x[i + 2]) + std::sin(x[i + 1] - x[i + 2]) * std::cos(x[i + 1] + x[i + 2]) + 4. + x[i] * std::exp(x[i] - x[i + 1]); ijac++; // x[i+2] values[ijac] = 2. - std::cos(x[i + 1] - x[i + 2]) * std::sin(x[i + 1] + x[i + 2]) + std::sin(x[i + 1] - x[i + 2]) * std::cos(x[i + 1] + x[i + 2]); ijac++; } } return true; } //return the structure or values of the hessian bool LuksanVlcek1::eval_h( Index /*n*/, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { Index ihes = 0; for( Index i = 0; i < N_; i++ ) { iRow[ihes] = i; jCol[ihes] = i; ihes++; if( i < N_ - 1 ) { iRow[ihes] = i; jCol[ihes] = i + 1; ihes++; } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { Index ihes = 0; for( Index i = 0; i < N_; i++ ) { // x[i],x[i] if( i < N_ - 1 ) { values[ihes] = obj_factor * (2. + 400. * (3. * x[i] * x[i] - x[i + 1])); if( i < N_ - 2 ) { values[ihes] -= lambda[i] * (2. + x[i]) * std::exp(x[i] - x[i + 1]); } } else { values[ihes] = 0.; } if( i > 0 ) { // x[i+1]x[i+1] values[ihes] += obj_factor * 200.; if( i < N_ - 1 ) { values[ihes] += lambda[i - 1] * (18. * x[i] - 2. * std::sin(x[i] - x[i + 1]) * std::sin(x[i] + x[i + 1]) + 2. * std::cos(x[i] - x[i + 1]) * std::cos(x[i] + x[i + 1]) - x[i - 1] * std::exp(x[i - 1] - x[i])); } } if( i > 1 ) { // x[i+2]x[i+2] values[ihes] += lambda[i - 2] * (-2. * std::sin(x[i - 1] - x[i]) * std::sin(x[i - 1] + x[i]) - 2. * std::cos(x[i - 1] - x[i]) * std::cos(x[i - 1] + x[i])); } ihes++; if( i < N_ - 1 ) { // x[i],x[i+1] values[ihes] = obj_factor * (-400. * x[i]); if( i < N_ - 2 ) { values[ihes] += lambda[i] * (1. + x[i]) * std::exp(x[i] - x[i + 1]); } /* if (i>0) { // x[i+1],x[i+2] values[ihes] += lambda[i-1]*( std::sin(x[i]-x[i+1])*std::sin(x[i]+x[i+1]) + std::cos(x[i]-x[i+1])*std::cos(x[i]+x[i+1]) - std::cos(x[i]-x[i+1])*std::cos(x[i]+x[i+1]) - std::sin(x[i]-x[i+1])*std::sin(x[i]+x[i+1]) ); } */ ihes++; } } DBG_ASSERT(ihes == nele_hess); } return true; } void LuksanVlcek1::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { } coinor-ipopt-3.14.17/examples/ScalableProblems/LuksanVlcek1.hpp000066400000000000000000000112701473776672200244030ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-127 #ifndef __LUKSANVLCEK1_HPP__ #define __LUKSANVLCEK1_HPP__ #include "RegisteredTNLP.hpp" using namespace Ipopt; /** Implementation of Example 5.1 from "Sparse and Partially Separable * Test Problems for Unconstrained and Equality Constrained * Optimization" by L. Luksan and J. Vlcek. */ class LuksanVlcek1: public RegisteredTNLP { public: /** Constructor. * * Here, g_l and g_u are the bounds for the * constraints. The original formulation is obtained by setting * g_l and g_u to zero. Using g_l #include using namespace Ipopt; LuksanVlcek2::LuksanVlcek2( Number g_l, Number g_u ) : g_l_(g_l), g_u_(g_u) { } bool LuksanVlcek2::InitializeProblem( Index N ) { N_ = N; if( N_ <= 13 || 2 * (N_ / 2) != N_ ) { printf("N needs to be at least 14 and even.\n"); return false; } return true; } // returns the size of the problem bool LuksanVlcek2::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem described in LuksanVlcek2.hpp has 4 variables, x[0] // through x[3] n = N_ + 2; m = N_ - 7; nnz_jac_g = 25 + (m - 5) * 8; nnz_h_lag = n + N_ + 1; // use the C style numbering of matrix indices (starting at 0) index_style = TNLP::C_STYLE; return true; } // returns the variable bounds bool LuksanVlcek2::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // none of the variables have bounds for( Index i = 0; i < n; i++ ) { x_l[i] = -1e20; x_u[i] = 1e20; } // Set the bounds for the constraints for( Index i = 0; i < m; i++ ) { g_l[i] = g_l_; g_u[i] = g_u_; } return true; } // returns the initial point for the problem bool LuksanVlcek2::get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { if( !init_x || init_z || init_lambda ) { return false; } // set the starting point for( Index i = 0; i < n / 2; i++ ) { x[2 * i] = -2.; x[2 * i + 1] = 1.; } return true; } // returns the value of the objective function bool LuksanVlcek2::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { obj_value = 0.; for( Index i = 0; i < N_ / 2; i++ ) { Number a1 = x[2 * i] * x[2 * i] - x[2 * i + 1]; Number a2 = x[2 * i] - 1.; Number a3 = x[2 * i + 2] * x[2 * i + 2] - x[2 * i + 3]; Number a4 = x[2 * i + 2] - 1.; Number a5 = x[2 * i + 1] + x[2 * i + 3] - 2.; Number a6 = x[2 * i + 1] - x[2 * i + 3]; obj_value += 100. * a1 * a1 + a2 * a2 + 90. * a3 * a3 + a4 * a4 + 10. * a5 * a5 + .1 * a6 * a6; } return true; } // return the gradient of the objective function grad_{x} f(x) bool LuksanVlcek2::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { grad_f[0] = 0.; grad_f[1] = 0.; for( Index i = 0; i < N_ / 2; i++ ) { grad_f[2 * i] += 400. * x[2 * i] * (x[2 * i] * x[2 * i] - x[2 * i + 1]) + 2. * (x[2 * i] - 1.); grad_f[2 * i + 1] += -200. * (x[2 * i] * x[2 * i] - x[2 * i + 1]) + 20 * (x[2 * i + 1] + x[2 * i + 3] - 2.) + 0.2 * (x[2 * i + 1] - x[2 * i + 3]); grad_f[2 * i + 2] = 360. * x[2 * i + 2] * (x[2 * i + 2] * x[2 * i + 2] - x[2 * i + 3]) + 2. * (x[2 * i + 2] - 1.); grad_f[2 * i + 3] = -180. * (x[2 * i + 2] * x[2 * i + 2] - x[2 * i + 3]) + 20. * (x[2 * i + 1] + x[2 * i + 3] - 2.) - 0.2 * (x[2 * i + 1] - x[2 * i + 3]); } return true; } // return the value of the constraints: g(x) bool LuksanVlcek2::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { for( Index i = 0; i < N_ - 7; i++ ) { g[i] = (2. + 5. * x[i + 5] * x[i + 5]) * x[i + 5] + 1.; for( Index k = Max(Index(0), i - 5); k <= i + 1; k++ ) { g[i] += x[k] * (x[k] + 1.); } } return true; } // return the structure or values of the Jacobian bool LuksanVlcek2::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian Index ijac = 0; for( Index i = 0; i < N_ - 7; i++ ) { for( Index k = Max(Index(0), i - 5); k <= i + 1; k++ ) { iRow[ijac] = i; jCol[ijac] = k; ijac++; } iRow[ijac] = i; jCol[ijac] = i + 5; ijac++; } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 0; i < N_ - 7; i++ ) { for( Index k = Max(Index(0), i - 5); k <= i + 1; k++ ) { values[ijac] = 2. * x[k] + 1.; ijac++; } values[ijac] = 2. + 15. * x[i + 5] * x[i + 5]; ijac++; } } return true; } //return the structure or values of the Hessian bool LuksanVlcek2::eval_h( Index n, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { Index ihes = 0; // First the diagonal elements for( Index i = 0; i < n; i++ ) { iRow[ihes] = i; jCol[ihes] = i; ihes++; } // And now the off-diagonal elements for( Index i = 0; i < N_ / 2; i++ ) { iRow[ihes] = 2 * i; jCol[ihes] = 2 * i + 1; ihes++; iRow[ihes] = 2 * i + 1; jCol[ihes] = 2 * i + 3; ihes++; } iRow[ihes] = n - 2; jCol[ihes] = n - 1; DBG_DO(ihes++); DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // First we take care of the diagonal elements coming from the // objective function values[0] = 0.; values[1] = 0.; for( Index i = 0; i < N_ / 2; i++ ) { values[2 * i] += obj_factor * (1200. * x[2 * i] * x[2 * i] - 400. * x[2 * i + 1] + 2.); values[2 * i + 1] += obj_factor * 220.2; values[2 * i + 2] = obj_factor * (1080. * x[2 * i + 2] * x[2 * i + 2] - 360 * x[2 * i + 3] + 2.); values[2 * i + 3] = obj_factor * 200.2; } // Now we take care of the off-diagonal elements coming from the // objective function Index ihes = n; values[ihes] = 0.; for( Index i = 0; i < N_ / 2; i++ ) { values[ihes] += obj_factor * (-400. * x[2 * i]); ihes++; values[ihes] = obj_factor * 19.8; ihes++; values[ihes] = obj_factor * (-360. * x[2 * i + 2]); } // Ok, now the diagonal elements from the constraints for( Index i = 0; i < N_ - 7; i++ ) { for( Index k = Max(Index(0), i - 5); k <= i + 1; k++ ) { values[k] += lambda[i] * 2.; } values[i + 5] += lambda[i] * 30. * x[i + 5]; } } return true; } void LuksanVlcek2::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { } coinor-ipopt-3.14.17/examples/ScalableProblems/LuksanVlcek2.hpp000066400000000000000000000112701473776672200244040ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-127 #ifndef __LUKSANVLCEK2_HPP__ #define __LUKSANVLCEK2_HPP__ #include "RegisteredTNLP.hpp" using namespace Ipopt; /** Implementation of Example 5.2 from "Sparse and Partially Separable * Test Problems for Unconstrained and Equality Constrained * Optimization" by L. Luksan and J. Vlcek. */ class LuksanVlcek2: public RegisteredTNLP { public: /** Constructor. * * Here, g_l and g_u are the bounds for the * constraints. The original formulation is obtained by setting * g_l and g_u to zero. Using g_l #include using namespace Ipopt; LuksanVlcek3::LuksanVlcek3( Number g_l, Number g_u ) : g_l_(g_l), g_u_(g_u) { } bool LuksanVlcek3::InitializeProblem( Index N ) { N_ = N; if( N_ <= 5 || 4 * ((N_ + 2) / 4) != N_ + 2 ) { printf("N needs to be at least 6 and N+2 needs to be a multiple of 4.\n"); return false; } return true; } // returns the size of the problem bool LuksanVlcek3::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem described in LuksanVlcek3.hpp has 4 variables, x[0] through x[3] n = N_ + 2; m = 2; nnz_jac_g = 4; nnz_h_lag = 5 * N_ / 2 + 3; // use the C style numbering of matrix indices (starting at 0) index_style = TNLP::C_STYLE; return true; } // returns the variable bounds bool LuksanVlcek3::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // none of the variables have bounds for( Index i = 0; i < n; i++ ) { x_l[i] = -1e20; x_u[i] = 1e20; } // Set the bounds for the constraints for( Index i = 0; i < m; i++ ) { g_l[i] = g_l_; g_u[i] = g_u_; } return true; } // returns the initial point for the problem bool LuksanVlcek3::get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { if( !init_x || init_z || init_lambda ) { return false; } // set the starting point for( Index i = 0; i < n / 4; i++ ) { x[4 * i] = 3.; x[4 * i + 1] = -1.; x[4 * i + 2] = 0.; x[4 * i + 3] = 1.; } return true; } // returns the value of the objective function bool LuksanVlcek3::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { obj_value = 0.; for( Index i = 0; i < N_ / 2; i++ ) { Number a1 = x[2 * i] + 10. * x[2 * i + 1]; Number a2 = x[2 * i + 2] - x[2 * i + 3]; Number a3 = x[2 * i + 1] - 2. * x[2 * i + 2]; Number a4 = x[2 * i] - x[2 * i + 3]; obj_value += a1 * a1 + 5. * a2 * a2 + std::pow(a3, 4) + 10. * std::pow(a4, 4); } return true; } // return the gradient of the objective function grad_{x} f(x) bool LuksanVlcek3::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { grad_f[0] = 0.; grad_f[1] = 0.; for( Index i = 0; i < N_ / 2; i++ ) { Number a1 = x[2 * i] + 10. * x[2 * i + 1]; Number a2 = x[2 * i + 2] - x[2 * i + 3]; Number a3 = x[2 * i + 1] - 2. * x[2 * i + 2]; Number a4 = x[2 * i] - x[2 * i + 3]; grad_f[2 * i] += 2. * a1 + 40. * std::pow(a4, 3); grad_f[2 * i + 1] += 20. * a1 + 4. * std::pow(a3, 3); grad_f[2 * i + 2] = 10. * a2 - 8. * std::pow(a3, 3); grad_f[2 * i + 3] = -10. * a2 - 40. * std::pow(a4, 3); } return true; } // return the value of the constraints: g(x) bool LuksanVlcek3::eval_g( Index n, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { g[0] = 3. * std::pow(x[0], 3) + 2. * x[1] - 5. + std::sin(x[0] - x[1]) * std::sin(x[0] + x[1]); g[1] = 4. * x[n - 3] - x[n - 4] * std::exp(x[n - 4] - x[n - 3]) - 3; return true; } // return the structure or values of the Jacobian bool LuksanVlcek3::eval_jac_g( Index n, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian Index ijac = 0; iRow[ijac] = 0; jCol[ijac] = 0; ijac++; iRow[ijac] = 0; jCol[ijac] = 1; ijac++; iRow[ijac] = 1; jCol[ijac] = n - 4; ijac++; iRow[ijac] = 1; jCol[ijac] = n - 3; DBG_DO(ijac++); DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; values[ijac] = 9. * x[0] * x[0] + std::cos(x[0] - x[1]) * std::sin(x[0] + x[1]) + std::sin(x[0] - x[1]) * std::cos(x[0] + x[1]); ijac++; values[ijac] = 2. - std::cos(x[0] - x[1]) * std::sin(x[0] + x[1]) + std::sin(x[0] - x[1]) * std::cos(x[0] + x[1]); ijac++; values[ijac] = -(1. + x[n - 4]) * std::exp(x[n - 4] - x[n - 3]); ijac++; values[ijac] = 4. + x[n - 4] * std::exp(x[n - 4] - x[n - 3]); // ijac++; } return true; } //return the structure or values of the Hessian bool LuksanVlcek3::eval_h( Index n, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { Index ihes = 0; for( Index i = 0; i < N_ / 2; i++ ) { iRow[ihes] = 2 * i; jCol[ihes] = 2 * i; ihes++; iRow[ihes] = 2 * i; jCol[ihes] = 2 * i + 1; ihes++; iRow[ihes] = 2 * i; jCol[ihes] = 2 * i + 3; ihes++; iRow[ihes] = 2 * i + 1; jCol[ihes] = 2 * i + 1; ihes++; iRow[ihes] = 2 * i + 1; jCol[ihes] = 2 * i + 2; ihes++; } iRow[ihes] = N_; jCol[ihes] = N_; ihes++; iRow[ihes] = N_; jCol[ihes] = N_ + 1; ihes++; iRow[ihes] = N_ + 1; jCol[ihes] = N_ + 1; DBG_DO(ihes++); DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { Index ihes = 0; values[0] = 0.; values[1] = 0.; values[3] = 0.; for( Index i = 0; i < N_ / 2 - 1; i++ ) { Number a3 = x[2 * i + 1] - 2. * x[2 * i + 2]; Number a4 = x[2 * i] - x[2 * i + 3]; // x[2*i] x[2*i] values[ihes] += obj_factor * (2. + 120. * a4 * a4); ihes++; // x[2*i] x[2*i+1] values[ihes] += obj_factor * 20.; ihes++; // x[2*i] x[2*i+3] values[ihes] = -obj_factor * 120. * a4 * a4; ihes++; // x[2*i+1] x[2*i+1] values[ihes] += obj_factor * (200. + 12. * a3 * a3); ihes++; // x[2*i+1] x[2*i+2] values[ihes] = -obj_factor * 24. * a3 * a3; ihes++; // x[2*i+2] x[2*i+2] values[ihes] = obj_factor * (10. + 48. * a3 * a3); // x[2*i+2] x[2*i+3] values[ihes + 1] = -obj_factor * 10.; // x[2*i+3] x[2*i+3] values[ihes + 3] = obj_factor * (10. + 120. * a4 * a4); } { Index i = N_ / 2 - 1; Number a3 = x[2 * i + 1] - 2. * x[2 * i + 2]; Number a4 = x[2 * i] - x[2 * i + 3]; // x[2*i] x[2*i] values[ihes] += obj_factor * (2. + 120. * a4 * a4); ihes++; // x[2*i] x[2*i+1] values[ihes] += obj_factor * 20.; ihes++; // x[2*i] x[2*i+3] values[ihes] = -obj_factor * 120. * a4 * a4; ihes++; // x[2*i+1] x[2*i+1] values[ihes] += obj_factor * (200. + 12. * a3 * a3); ihes++; // x[2*i+1] x[2*i+2] values[ihes] = -obj_factor * 24. * a3 * a3; ihes++; // x[2*i+2] x[2*i+2] values[ihes] = obj_factor * (10. + 48. * a3 * a3); // x[2*i+2] x[2*i+3] values[ihes + 1] = -obj_factor * 10.; // x[2*i+3] x[2*i+3] values[ihes + 2] = obj_factor * (10. + 120. * a4 * a4); } // Now the constraints ihes = 0; Number d1 = x[0] - x[1]; Number d2 = x[0] + x[1]; values[ihes] += lambda[0] * (18. * x[0] - 2. * std::sin(d1) * std::sin(d2) + 2. * std::cos(d1) * std::cos(d2)); ihes += 3; values[ihes] += lambda[0] * (-2. * std::sin(d1) * std::sin(d2) - 2. * std::cos(d1) * std::cos(d2)); d1 = x[n - 4] - x[n - 3]; // x[n-4] x[n-4] ihes = nele_hess - 8; values[ihes] += -lambda[1] * (2. + x[n - 4]) * std::exp(d1); // x[n-4] x[n-3] ihes++; values[ihes] += lambda[1] * (1. + x[n - 4]) * std::exp(d1); // x[n-3] x[n-3] ihes += 2; values[ihes] += -lambda[1] * x[n - 4] * std::exp(d1); } return true; } void LuksanVlcek3::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { } coinor-ipopt-3.14.17/examples/ScalableProblems/LuksanVlcek3.hpp000066400000000000000000000112671473776672200244130ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-127 #ifndef __LUKSANVLCEK3_HPP__ #define __LUKSANVLCEK3_HPP__ #include "RegisteredTNLP.hpp" using namespace Ipopt; /** Implementation of Example 5.3 from "Sparse and Partially Separable * Test Problems for Unconstrained and Equality Constrained * Optimization" by L. Luksan and J. Vlcek. */ class LuksanVlcek3: public RegisteredTNLP { public: /** Constructor. * * Here, g_l and g_u are the bounds for the * constraints. The original formulation is obtained by setting * g_l and g_u to zero. Using g_l #include using namespace Ipopt; LuksanVlcek4::LuksanVlcek4( Number g_l, Number g_u ) : g_l_(g_l), g_u_(g_u) { } bool LuksanVlcek4::InitializeProblem( Index N ) { N_ = N; if( N_ <= 1 || 4 * ((N_ + 2) / 4) != N_ + 2 ) { printf("N needs to be at least 2 and N+2 needs to be a multiple of 4.\n"); return false; } return true; } // returns the size of the problem bool LuksanVlcek4::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem described in LuksanVlcek4.hpp has 4 variables, x[0] through x[3] n = N_ + 2; m = N_ - 2; nnz_jac_g = 3 * m; nnz_h_lag = n + n - 1; // use the C style numbering of matrix indices (starting at 0) index_style = TNLP::C_STYLE; return true; } // returns the variable bounds bool LuksanVlcek4::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // none of the variables have bounds for( Index i = 0; i < n; i++ ) { x_l[i] = -1e20; x_u[i] = 1e20; } // Set the bounds for the constraints for( Index i = 0; i < m; i++ ) { g_l[i] = g_l_; g_u[i] = g_u_; } return true; } // returns the initial point for the problem bool LuksanVlcek4::get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { if( !init_x || init_z || init_lambda ) { return false; } // set the starting point for( Index i = 0; i < n / 4; i++ ) { x[4 * i] = 1.; x[4 * i + 1] = 2.; x[4 * i + 2] = 2.; x[4 * i + 3] = 2.; } return true; } // returns the value of the objective function bool LuksanVlcek4::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { obj_value = 0.; for( Index i = 0; i < N_ / 2; i++ ) { Number e0 = std::exp(x[2 * i]); Number e0mx1 = e0 - x[2 * i + 1]; Number x1mx2 = x[2 * i + 1] - x[2 * i + 2]; Number x2mx3 = x[2 * i + 2] - x[2 * i + 3]; Number t = std::tan(x2mx3); Number x3m1 = x[2 * i + 3] - 1.; obj_value += std::pow(e0mx1, 4) + 100. * std::pow(x1mx2, 6) + std::pow(t, 4) + std::pow(x[2 * i], 8) + x3m1 * x3m1; } return true; } // return the gradient of the objective function grad_{x} f(x) bool LuksanVlcek4::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { grad_f[0] = 0.; grad_f[1] = 0.; for( Index i = 0; i < N_ / 2; i++ ) { Number e0 = std::exp(x[2 * i]); Number e0mx1 = e0 - x[2 * i + 1]; Number x1mx2 = x[2 * i + 1] - x[2 * i + 2]; Number x2mx3 = x[2 * i + 2] - x[2 * i + 3]; Number x3m1 = x[2 * i + 3] - 1.; Number dt = 4. * std::pow(std::tan(x2mx3), 3) / std::pow(std::cos(x2mx3), 2); grad_f[2 * i] += 4. * e0 * std::pow(e0mx1, 3) + 8. * std::pow(x[2 * i], 7); grad_f[2 * i + 1] += -4. * std::pow(e0mx1, 3) + 600. * std::pow(x1mx2, 5); grad_f[2 * i + 2] = -600. * std::pow(x1mx2, 5) + dt; grad_f[2 * i + 3] = -dt + 2. * x3m1; } return true; } // return the value of the constraints: g(x) bool LuksanVlcek4::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { for( Index i = 0; i < N_ - 2; i++ ) { g[i] = 8. * x[i + 1] * (x[i + 1] * x[i + 1] - x[i]) - 2. * (1 - x[i + 1]) + 4. * (x[i + 1] - x[i + 2] * x[i + 2]); } return true; } // return the structure or values of the Jacobian bool LuksanVlcek4::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian Index ijac = 0; for( Index i = 0; i < N_ - 2; i++ ) { iRow[ijac] = i; jCol[ijac] = i; ijac++; iRow[ijac] = i; jCol[ijac] = i + 1; ijac++; iRow[ijac] = i; jCol[ijac] = i + 2; ijac++; } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 0; i < N_ - 2; i++ ) { values[ijac] = -8. * x[i + 1]; ijac++; values[ijac] = 6. - 8. * x[i] + 24. * x[i + 1] * x[i + 1]; ijac++; values[ijac] = -8. * x[i + 2]; ijac++; } } return true; } //return the structure or values of the Hessian bool LuksanVlcek4::eval_h( Index n, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { Index ihes = 0; for( Index i = 0; i < n - 1; i++ ) { iRow[ihes] = i; jCol[ihes] = i; ihes++; iRow[ihes] = i; jCol[ihes] = i + 1; ihes++; } iRow[ihes] = n - 1; jCol[ihes] = n - 1; DBG_DO(ihes++); DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // First the objective Index ihes = 0; values[0] = 0.; values[1] = 0.; values[2] = 0.; for( Index i = 0; i < N_ / 2; i++ ) { Number e0 = std::exp(x[2 * i]); Number e0mx1 = e0 - x[2 * i + 1]; Number x1mx2 = x[2 * i + 1] - x[2 * i + 2]; Number x2mx3 = x[2 * i + 2] - x[2 * i + 3]; Number s = std::sin(x2mx3); Number ss = s * s; Number c = std::cos(x2mx3); Number ddt = 4. * (3. * ss * c * c + 5. * ss * ss) / std::pow(c, 6); // x[2*i] x[2*i] values[ihes] += obj_factor * (4. * e0 * std::pow(e0mx1, 3) + 12 * e0 * e0 * e0mx1 * e0mx1 + 56. * std::pow(x[2 * i], 6)); ihes++; // x[2*i] x[2*i+1] values[ihes] += obj_factor * (-12 * e0 * e0mx1 * e0mx1); ihes++; // x[2*i+1] x[2*i+1] values[ihes] += obj_factor * (3000. * std::pow(x1mx2, 4) + 12. * e0mx1 * e0mx1); ihes++; // x[2*i+1] x[2*i+2] values[ihes] = -obj_factor * (3000. * std::pow(x1mx2, 4)); ihes++; // x[2*i+2] x[2*i+2] values[ihes] = obj_factor * (3000. * std::pow(x1mx2, 4) + ddt); // x[2*i+2] x[2*i+3] values[ihes + 1] = -obj_factor * ddt; // x[2*i+3] x[2*i+3] values[ihes + 2] = obj_factor * (2. + ddt); } // Now the constraints for( Index i = 0; i < N_ - 2; i++ ) { // x[i] x[i+1] values[2 * i + 1] -= lambda[i] * 8.; // x[i+1] x[i+1] values[2 * i + 2] += lambda[i] * 48. * x[i + 1]; // x[i+2] x[i+2] values[2 * i + 4] -= lambda[i] * 8.; } } return true; } void LuksanVlcek4::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { } coinor-ipopt-3.14.17/examples/ScalableProblems/LuksanVlcek4.hpp000066400000000000000000000112701473776672200244060ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-127 #ifndef __LUKSANVLCEK4_HPP__ #define __LUKSANVLCEK4_HPP__ #include "RegisteredTNLP.hpp" using namespace Ipopt; /** Implementation of Example 5.4 from "Sparse and Partially Separable * Test Problems for Unconstrained and Equality Constrained * Optimization" by L. Luksan and J. Vlcek. */ class LuksanVlcek4: public RegisteredTNLP { public: /** Constructor. * * Here, g_l and g_u are the bounds for the * constraints. The original formulation is obtained by setting * g_l and g_u to zero. Using g_l #include using namespace Ipopt; inline static Index Sgn( Number a ) { if( a > 0. ) { return 1; } else { return -1; } } LuksanVlcek5::LuksanVlcek5( Number g_l, Number g_u ) : g_l_(g_l), g_u_(g_u) { } bool LuksanVlcek5::InitializeProblem( Index N ) { N_ = N; if( N_ <= 4 ) { printf("N needs to be at least 5.\n"); return false; } return true; } // returns the size of the problem bool LuksanVlcek5::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem described in LuksanVlcek5.hpp has 4 variables, x[0] through x[3] n = N_ + 2; m = N_ - 4; nnz_jac_g = 5 * m; nnz_h_lag = n + n - 1 + n - 2; // use the C style numbering of matrix indices (starting at 0) index_style = TNLP::C_STYLE; return true; } // returns the variable bounds bool LuksanVlcek5::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // none of the variables have bounds for( Index i = 1; i < n - 1; i++ ) { x_l[i] = -1e20; x_u[i] = 1e20; } // except for the first and last x_l[0] = x_u[0] = 0.; x_l[n - 1] = x_u[n - 1] = 0.; // Set the bounds for the constraints for( Index i = 0; i < m; i++ ) { g_l[i] = g_l_; g_u[i] = g_u_; } return true; } // returns the initial point for the problem bool LuksanVlcek5::get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { if( !init_x || init_z || init_lambda ) { return false; } // set the starting point for( Index i = 0; i < n; i++ ) { x[i] = -1.; } return true; } // returns the value of the objective function bool LuksanVlcek5::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { Number p = 7. / 3.; obj_value = 0.; for( Index i = 1; i <= N_; i++ ) { Number b = (3. - 2. * x[i]) * x[i] - x[i - 1] - x[i + 1] + 1.; obj_value += std::pow(std::abs(b), p); } return true; } // return the gradient of the objective function grad_{x} f(x) bool LuksanVlcek5::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { Number p = 7. / 3.; grad_f[0] = 0.; grad_f[1] = 0.; for( Index i = 1; i <= N_; i++ ) { Number b = (3. - 2. * x[i]) * x[i] - x[i - 1] - x[i + 1] + 1.; Number pb = std::pow(std::abs(b), p - 1.); grad_f[i + 1] = -p * Sgn(b) * pb; grad_f[i - 1] += grad_f[i + 1]; grad_f[i] += p * Sgn(b) * (3. - 4. * x[i]) * pb; } return true; } // return the value of the constraints: g(x) bool LuksanVlcek5::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { for( Index i = 0; i < N_ - 4; i++ ) { g[i] = 8. * x[i + 3] * (x[i + 3] * x[i + 3] - x[i + 2]) - 2. * (1 - x[i + 3]) + 4. * (x[i + 3] - x[i + 4] * x[i + 4]) + x[i + 2] * x[i + 2] - x[i + 1] + x[i + 4] - x[i + 5] * x[i + 5]; } return true; } // return the structure or values of the Jacobian bool LuksanVlcek5::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian Index ijac = 0; for( Index i = 0; i < N_ - 4; i++ ) { iRow[ijac] = i; jCol[ijac] = i + 1; ijac++; iRow[ijac] = i; jCol[ijac] = i + 2; ijac++; iRow[ijac] = i; jCol[ijac] = i + 3; ijac++; iRow[ijac] = i; jCol[ijac] = i + 4; ijac++; iRow[ijac] = i; jCol[ijac] = i + 5; ijac++; } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 0; i < N_ - 4; i++ ) { values[ijac] = -1.; ijac++; values[ijac] = -8. * x[i + 3] + 2. * x[i + 2]; ijac++; values[ijac] = 6. - 8. * x[i + 2] + 24. * x[i + 3] * x[i + 3]; ijac++; values[ijac] = -8. * x[i + 4] + 1.; ijac++; values[ijac] = -2. * x[i + 5]; ijac++; } } return true; } //return the structure or values of the Hessian bool LuksanVlcek5::eval_h( Index n, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { Index ihes = 0; // First the diagonal for( Index i = 0; i < n; i++ ) { iRow[ihes] = i; jCol[ihes] = i; ihes++; } // Now the first off-diagonal for( Index i = 0; i < n - 1; i++ ) { iRow[ihes] = i; jCol[ihes] = i + 1; ihes++; } // And finally the second off-diagonal for( Index i = 0; i < n - 2; i++ ) { iRow[ihes] = i; jCol[ihes] = i + 2; ihes++; } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { Number p = 7. / 3.; // First the objective values[0] = 0.; values[1] = 0.; values[n] = 0.; for( Index i = 1; i <= N_; i++ ) { Number b = (3. - 2. * x[i]) * x[i] - x[i - 1] - x[i + 1] + 1.; Number pb1 = std::pow(std::abs(b), p - 1.); Number pb2 = std::pow(std::abs(b), p - 2.); Number a1 = 3. - 4. * x[i]; Number a2 = p * (p - 1.) * pb2; Number a3 = a1 * a2; // x[i-1] x[i-1] values[i - 1] += obj_factor * a2; // x[i-1] x[i] values[n + i - 1] += obj_factor * (-a3); // x[i-1] x[i+1] values[n + (n - 1) + i - 1] = obj_factor * a2; // x[i] x[i] values[i] += obj_factor * (a3 * a1 - 4. * p * Sgn(b) * pb1); // x[i] x[i+1] values[n + i] = obj_factor * (-a3); // x[i+1] x[i+1] values[i + 1] = obj_factor * a2; } // Now the constraints for( Index i = 0; i < N_ - 4; i++ ) { // x[i+2] x[i+2] values[i + 2] += lambda[i] * 2.; // x[i+3] x{i+3] values[i + 3] += lambda[i] * 48. * x[i + 3]; // x[i+4] x[i+4] values[i + 4] += lambda[i] * (-8.); // x[i+5] x[i+5] values[i + 5] += lambda[i] * (-2.); // x[i+2] x[i+3] values[n + i + 2] += -lambda[i] * 8.; } } return true; } void LuksanVlcek5::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { } coinor-ipopt-3.14.17/examples/ScalableProblems/LuksanVlcek5.hpp000066400000000000000000000112701473776672200244070ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-127 #ifndef __LUKSANVLCEK5_HPP__ #define __LUKSANVLCEK5_HPP__ #include "RegisteredTNLP.hpp" using namespace Ipopt; /** Implementation of Example 5.5 from "Sparse and Partially Separable * Test Problems for Unconstrained and Equality Constrained * Optimization" by L. Luksan and J. Vlcek. */ class LuksanVlcek5: public RegisteredTNLP { public: /** Constructor. * * Here, g_l and g_u are the bounds for the * constraints. The original formulation is obtained by setting * g_l and g_u to zero. Using g_l #include using namespace Ipopt; inline static Index Sgn( Number a ) { if( a > 0. ) { return 1; } else { return -1; } } LuksanVlcek6::LuksanVlcek6( Number g_l, Number g_u ) : g_l_(g_l), g_u_(g_u) { } bool LuksanVlcek6::InitializeProblem( Index N ) { N_ = N; if( 2 * (N_ / 2) != N_ || N <= 1 ) { printf("N needs to be even and at least 2.\n"); return false; } return true; } // returns the size of the problem bool LuksanVlcek6::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem described in LuksanVlcek6.hpp has 4 variables, x[0] through x[3] n = N_ + 1; m = N_ / 2; nnz_jac_g = 3 * m; nnz_h_lag = n + n - 1 + n - 2 + n - 3 + n - 4 + n - 5 + n - 6; // use the C style numbering of matrix indices (starting at 0) index_style = TNLP::C_STYLE; return true; } // returns the variable bounds bool LuksanVlcek6::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // none of the variables have bounds for( Index i = 0; i < n; i++ ) { x_l[i] = -1e20; x_u[i] = 1e20; } // Set the bounds for the constraints for( Index i = 0; i < m; i++ ) { g_l[i] = g_l_; g_u[i] = g_u_; } return true; } // returns the initial point for the problem bool LuksanVlcek6::get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { if( !init_x || init_z || init_lambda ) { return false; } // set the starting point for( Index i = 0; i < n; i++ ) { x[i] = 3.; } return true; } // returns the value of the objective function bool LuksanVlcek6::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { Number p = 7. / 3.; obj_value = 0.; for( Index i = 0; i < N_; i++ ) { Number b = (2. + 5. * x[i] * x[i]) * x[i] + 1.; for( Index j = Max(Index(0), i - 5); j <= Min(N_ - 1, i + 1); j++ ) { b += x[j] * (1. + x[j]); } obj_value += std::pow(std::abs(b), p); } return true; } // return the gradient of the objective function grad_{x} f(x) bool LuksanVlcek6::eval_grad_f( Index n, const Number* x, bool /*new_x*/, Number* grad_f ) { Number p = 7. / 3.; grad_f[0] = 0.; for( Index i = 0; i < N_; i++ ) { Number b = (2. + 5. * x[i] * x[i]) * x[i] + 1.; for( Index j = Max(Index(0), i - 5); j <= Min(N_ - 1, i + 1); j++ ) { b += x[j] * (1. + x[j]); } Number pb1 = std::pow(std::abs(b), p - 1.); Number apb1 = p * Sgn(b) * pb1; for( Index j = Max(Index(0), i - 5); j < i; j++ ) { grad_f[j] += (1. + 2. * x[j]) * apb1; } grad_f[i] += (3. + 2. * x[i] + 15. * x[i] * x[i]) * apb1; if( i < N_ - 1 ) { grad_f[i + 1] = (1. + 2. * x[i + 1]) * apb1; } } grad_f[n - 1] = 0.; return true; } // return the value of the constraints: g(x) bool LuksanVlcek6::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { for( Index i = 0; i < N_ / 2; i++ ) { Number e = std::exp(x[2 * i] - x[2 * i + 1] - x[2 * i + 2]); g[i] = 4. * x[2 * i + 1] - (x[2 * i] - x[2 * i + 2]) * e - 3; } return true; } // return the structure or values of the Jacobian bool LuksanVlcek6::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian Index ijac = 0; for( Index i = 0; i < N_ / 2; i++ ) { iRow[ijac] = i; jCol[ijac] = 2 * i; ijac++; iRow[ijac] = i; jCol[ijac] = 2 * i + 1; ijac++; iRow[ijac] = i; jCol[ijac] = 2 * i + 2; ijac++; } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 0; i < N_ / 2; i++ ) { Number e = std::exp(x[2 * i] - x[2 * i + 1] - x[2 * i + 2]); Number a1 = (1. + x[2 * i] - x[2 * i + 2]) * e; values[ijac] = -a1; ijac++; values[ijac] = 4. + (x[2 * i] - x[2 * i + 2]) * e; ijac++; values[ijac] = a1; ijac++; } } return true; } //return the structure or values of the Hessian bool LuksanVlcek6::eval_h( Index n, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { Index ihes = 0; // First the diagonal for( Index i = 0; i < n; i++ ) { iRow[ihes] = i; jCol[ihes] = i; ihes++; } // 1st off-diagonal for( Index i = 0; i < n - 1; i++ ) { iRow[ihes] = i; jCol[ihes] = i + 1; ihes++; } // 2nd off-diagonal for( Index i = 0; i < n - 2; i++ ) { iRow[ihes] = i; jCol[ihes] = i + 2; ihes++; } // 3rd off-diagonal for( Index i = 0; i < n - 3; i++ ) { iRow[ihes] = i; jCol[ihes] = i + 3; ihes++; } // 4th off-diagonal for( Index i = 0; i < n - 4; i++ ) { iRow[ihes] = i; jCol[ihes] = i + 4; ihes++; } // 5th off-diagonal for( Index i = 0; i < n - 5; i++ ) { iRow[ihes] = i; jCol[ihes] = i + 5; ihes++; } // 6th off-diagonal for( Index i = 0; i < n - 6; i++ ) { iRow[ihes] = i; jCol[ihes] = i + 6; ihes++; } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { Number p = 7. / 3.; // First the objective values[0] = 0.; for( Index i = 0; i < N_; i++ ) { Number b = (2. + 5. * x[i] * x[i]) * x[i] + 1.; for( Index j = Max(Index(0), i - 5); j <= Min(N_ - 1, i + 1); j++ ) { b += x[j] * (1. + x[j]); } Number pb1 = std::pow(std::abs(b), p - 1.); Number pb2 = std::pow(std::abs(b), p - 2.); Number apb1 = p * Sgn(b) * pb1; Number apb2 = p * (p - 1.) * pb2; Number a1 = 3. + 2. * x[i] + 15. * x[i] * x[i]; Number a1apb2 = apb2 * a1; // x[i] x[i] values[i] += obj_factor * (a1apb2 * a1 + apb1 * (2. + 30. * x[i])); // x[i] x[j] j= Max(Index(0), i - 5); j-- ) { values[ih + j] += obj_factor * a1apb2 * (1. + 2. * x[j]); ih += ip; ip--; } for( Index j = Max(Index(0), i - 5); j < i; j++ ) { Number axj = (1. + 2. * x[j]); // x[j] x[j] j= Max(Index(0), i - 5); k-- ) { values[ih + k] += obj_factor * apb2 * (1. + 2. * x[k]) * axj; ih += ip; ip--; } } if( i < N_ - 1 ) { Number axj = (1. + 2. * x[i + 1]); // x[i] x[i+1] values[n + i] = obj_factor * a1apb2 * axj; // x[j=i+1] x[k] k= Max(Index(0), i - 5); k-- ) { values[ih + k] = obj_factor * apb2 * (1. + 2. * x[k]) * axj; ih += ip; ip--; } // x[j=i+1] x[k=i+1] values[i + 1] = obj_factor * (apb2 * axj * axj + 2. * apb1); } else { // We could just not set those non-zero elements in the // structure, but I'm too lazy to do that now values[n + i] = 0.; ih = n + n - 1; ip = n - 2; for( Index k = i - 1; k >= Max(Index(0), i - 5); k-- ) { values[ih + k] = 0.; ih += ip; ip--; } // x[j=i+1] x[k=i+1] values[i + 1] = 0.; } } // Now the constraints for( Index i = 0; i < N_ / 2; i++ ) { Number e = std::exp(x[2 * i] - x[2 * i + 1] - x[2 * i + 2]); Number a1 = 1. + x[2 * i] - x[2 * i + 2]; Number a2 = 1. + a1; // x[2*i] x[2*i] values[2 * i] -= lambda[i] * a2 * e; // x[2*i] x[2*i+1] values[n + 2 * i] += lambda[i] * a1 * e; // x[2*i] x[2*i+2] values[n + (n - 1) + 2 * i] += lambda[i] * a2 * e; // x[2*i+1] x[2*i+1] values[2 * i + 1] -= lambda[i] * (x[2 * i] - x[2 * i + 2]) * e; // x[2*i+1] x[2*i+2] values[n + 2 * i + 1] -= lambda[i] * a1 * e; // x[2*i+2] x[2*i+2] values[2 * i + 2] -= lambda[i] * a2 * e; } } return true; } void LuksanVlcek6::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { } coinor-ipopt-3.14.17/examples/ScalableProblems/LuksanVlcek6.hpp000066400000000000000000000112671473776672200244160ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-127 #ifndef __LUKSANVLCEK6_HPP__ #define __LUKSANVLCEK6_HPP__ #include "RegisteredTNLP.hpp" using namespace Ipopt; /** Implementation of Example 5.6 from "Sparse and Partially Separable * Test Problems for Unconstrained and Equality Constrained * Optimization" by L. Luksan and J. Vlcek. */ class LuksanVlcek6: public RegisteredTNLP { public: /** Constructor. * * Here, g_l and g_u are the bounds for the * constraints. The original formulation is obtained by setting * g_l and g_u to zero. Using g_l #include using namespace Ipopt; LuksanVlcek7::LuksanVlcek7( Number g_l, Number g_u ) : g_l_(g_l), g_u_(g_u) { } bool LuksanVlcek7::InitializeProblem( Index N ) { N_ = N; if( N_ < 3 ) { printf("N has to be at least 3.\n"); return false; } return true; } // returns the size of the problem bool LuksanVlcek7::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem described in LuksanVlcek7.hpp has 4 variables, x[0] through x[3] n = N_ + 2; m = 4; nnz_jac_g = 3 + 4 + 4 + 3; nnz_h_lag = n + 3; // use the C style numbering of matrix indices (starting at 0) index_style = TNLP::C_STYLE; return true; } // returns the variable bounds bool LuksanVlcek7::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // none of the variables have bounds for( Index i = 0; i < n; i++ ) { x_l[i] = -1e20; x_u[i] = 1e20; } // Set the bounds for the constraints for( Index i = 0; i < m; i++ ) { g_l[i] = g_l_; g_u[i] = g_u_; } return true; } // returns the initial point for the problem bool LuksanVlcek7::get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { if( !init_x || init_z || init_lambda ) { return false; } // set the starting point for( Index i = 0; i < n; i++ ) { x[i] = 1.; } return true; } // returns the value of the objective function bool LuksanVlcek7::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { obj_value = 0.; for( Index i = 1; i <= N_; i++ ) { obj_value += i * ((1. - std::cos(x[i])) + std::sin(x[i - 1]) - std::sin(x[i + 1])); } return true; } // return the gradient of the objective function grad_{x} f(x) bool LuksanVlcek7::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { grad_f[0] = 0.; grad_f[1] = 0.; for( Index i = 1; i <= N_; i++ ) { grad_f[i - 1] += i * std::cos(x[i - 1]); grad_f[i] += i * std::sin(x[i]); grad_f[i + 1] = -i * std::cos(x[i + 1]); } return true; } // return the value of the constraints: g(x) bool LuksanVlcek7::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { g[0] = 4. * (x[1] - x[2] * x[2]) + x[2] - x[3] * x[3]; g[1] = 8. * x[2] * (x[2] * x[2] - x[1]) - 2. * (1. - x[2]) + 4. * (x[2] - x[3] * x[3]) + x[3] - x[4] * x[4]; g[2] = 8. * x[N_ - 1] * (x[N_ - 1] * x[N_ - 1] - x[N_ - 2]) - 2. * (1. - x[N_ - 1]) + 4. * (x[N_ - 1] - x[N_] * x[N_]) + x[N_ - 2] * x[N_ - 2] - x[N_ - 3]; g[3] = 8. * x[N_] * (x[N_] * x[N_] - x[N_ - 1]) - 2. * (1. - x[N_]) + x[N_ - 1] * x[N_ - 1] - x[N_ - 2]; return true; } // return the structure or values of the Jacobian bool LuksanVlcek7::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian Index ijac = 0; // g[0] iRow[ijac] = 0; jCol[ijac] = 1; ijac++; iRow[ijac] = 0; jCol[ijac] = 2; ijac++; iRow[ijac] = 0; jCol[ijac] = 3; ijac++; // g[1] iRow[ijac] = 1; jCol[ijac] = 1; ijac++; iRow[ijac] = 1; jCol[ijac] = 2; ijac++; iRow[ijac] = 1; jCol[ijac] = 3; ijac++; iRow[ijac] = 1; jCol[ijac] = 4; ijac++; // g[2] iRow[ijac] = 2; jCol[ijac] = N_ - 3; ijac++; iRow[ijac] = 2; jCol[ijac] = N_ - 2; ijac++; iRow[ijac] = 2; jCol[ijac] = N_ - 1; ijac++; iRow[ijac] = 2; jCol[ijac] = N_; ijac++; // g[3] iRow[ijac] = 3; jCol[ijac] = N_ - 2; ijac++; iRow[ijac] = 3; jCol[ijac] = N_ - 1; ijac++; iRow[ijac] = 3; jCol[ijac] = N_; DBG_DO(ijac++); DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; // g[0] values[ijac] = 4.; ijac++; values[ijac] = 1. - 8. * x[2]; ijac++; values[ijac] = -2 * x[3]; ijac++; // g[1] values[ijac] = -8. * x[2]; ijac++; values[ijac] = 24. * x[2] * x[2] - 8. * x[1] + 6.; ijac++; values[ijac] = -8 * x[3] + 1.; ijac++; values[ijac] = -2. * x[4]; ijac++; // g[2] values[ijac] = -1.; ijac++; values[ijac] = -8. * x[N_ - 1] + 2. * x[N_ - 2]; ijac++; values[ijac] = 24. * x[N_ - 1] * x[N_ - 1] - 8. * x[N_ - 2] + 6.; ijac++; values[ijac] = -8. * x[N_]; ijac++; // g[3] values[ijac] = -1.; ijac++; values[ijac] = -8. * x[N_] + 2. * x[N_ - 1]; ijac++; values[ijac] = 24. * x[N_] * x[N_] - 8. * x[N_ - 1] + 2.; // ijac++; } return true; } //return the structure or values of the Hessian bool LuksanVlcek7::eval_h( Index n, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index /*nele_hess*/, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // The diagonal for( Index i = 0; i < n; i++ ) { iRow[i] = i; jCol[i] = i; } // x[1] x[2] iRow[n] = 1; jCol[n] = 2; // x[N_-2] x[N_-1] iRow[n + 1] = N_ - 2; jCol[n + 1] = N_ - 1; // x[N_-1] x[N_] iRow[n + 2] = N_ - 1; jCol[n + 2] = N_; } else { // Objective function values[0] = 0.; values[1] = 0.; for( Index i = 1; i <= N_; i++ ) { values[i - 1] -= obj_factor * (i * std::sin(x[i - 1])); values[i] += obj_factor * i * std::cos(x[i]); values[i + 1] = obj_factor * i * std::sin(x[i + 1]); } // g[0] values[2] -= lambda[0] * 8.; values[3] -= lambda[0] * 2.; // g[1] values[2] += lambda[1] * 48. * x[2]; values[3] -= lambda[1] * 8.; values[4] -= lambda[1] * 2.; values[n] = -lambda[1] * 8.; // g[2] values[N_ - 2] += lambda[2] * 2.; values[N_ - 1] += lambda[2] * 48. * x[N_ - 1]; values[N_] -= lambda[2] * 8.; values[n + 1] = -lambda[2] * 8.; // g[3] values[N_ - 1] += lambda[3] * 2.; values[N_] += lambda[3] * 48. * x[N_]; values[n + 2] = -lambda[3] * 8.; } return true; } void LuksanVlcek7::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { } coinor-ipopt-3.14.17/examples/ScalableProblems/LuksanVlcek7.hpp000066400000000000000000000112701473776672200244110ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-127 #ifndef __LUKSANVLCEK7_HPP__ #define __LUKSANVLCEK7_HPP__ #include "RegisteredTNLP.hpp" using namespace Ipopt; /** Implementation of Example 5.7 from "Sparse and Partially Separable * Test Problems for Unconstrained and Equality Constrained * Optimization" by L. Luksan and J. Vlcek. */ class LuksanVlcek7: public RegisteredTNLP { public: /** Constructor. * * Here, g_l and g_u are the bounds for the * constraints. The original formulation is obtained by setting * g_l and g_u to zero. Using g_l using namespace Ipopt; /* Constructor. */ MittelmannBndryCntrlDiriBase::MittelmannBndryCntrlDiriBase() : y_d_(NULL) { } MittelmannBndryCntrlDiriBase::~MittelmannBndryCntrlDiriBase() { delete[] y_d_; } void MittelmannBndryCntrlDiriBase::SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number d_const ) { N_ = N; h_ = 1. / (N + 1); hh_ = h_ * h_; lb_y_ = lb_y; ub_y_ = ub_y; lb_u_ = lb_u; ub_u_ = ub_u; d_const_ = d_const; alpha_ = alpha; // Initialize the target profile variables delete[] y_d_; y_d_ = new Number[(N_ + 2) * (N_ + 2)]; for( Index j = 0; j <= N_ + 1; j++ ) { for( Index i = 0; i <= N_ + 1; i++ ) { y_d_[y_index(i, j)] = y_d_cont(x1_grid(i), x2_grid(j)); } } } bool MittelmannBndryCntrlDiriBase::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // We for each of the N_+2 times N_+2 mesh points we have the value // of the functions y, including the control parameters on the boundary n = (N_ + 2) * (N_ + 2); // For each of the N_ times N_ interior mesh points we have the // discretized PDE. m = N_ * N_; // y(i,j), y(i-1,j), y(i+1,j), y(i,j-1), y(i,j+1) for each // of the N_*N_ discretized PDEs nnz_jac_g = 5 * N_ * N_; // diagonal entry for each y(i,j) in the interior nnz_h_lag = N_ * N_; if( alpha_ > 0. ) { // and one entry for u(i,j) in the bundary if alpha is not zero nnz_h_lag += 4 * N_; } // We use the C indexing style for row/col entries (corresponding to // the C notation, starting at 0) index_style = C_STYLE; return true; } bool MittelmannBndryCntrlDiriBase::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // Set overall bounds on the y variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iy = y_index(i, j); x_l[iy] = lb_y_; x_u[iy] = ub_y_; } } // Set the overall bounds on the control variables for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, 0); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, N_ + 1); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } // The values of y on the corners doens't appear anywhere, so we fix // them to zero x_l[y_index(0, 0)] = x_u[y_index(0, 0)] = 0.; x_l[y_index(0, N_ + 1)] = x_u[y_index(0, N_ + 1)] = 0.; x_l[y_index(N_ + 1, 0)] = x_u[y_index(N_ + 1, 0)] = 0.; x_l[y_index(N_ + 1, N_ + 1)] = x_u[y_index(N_ + 1, N_ + 1)] = 0.; // all discretized PDE constraints have right hand side equal to // minus the constant value of the function d for( Index i = 0; i < m; i++ ) { g_l[i] = -hh_ * d_const_; g_u[i] = -hh_ * d_const_; } return true; } bool MittelmannBndryCntrlDiriBase::get_starting_point( Index /*n*/, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the others if // you wish. assert(init_x == true); (void) init_x; assert(init_z == false); (void) init_z; assert(init_lambda == false); (void) init_lambda; // set all y's to the perfect match with y_d for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { x[y_index(i, j)] = y_d_[y_index(i, j)]; // 0 in AMPL model } } Number umid = (ub_u_ + lb_u_) / 2.; for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, 0); x[iu] = umid; } for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, N_ + 1); x[iu] = umid; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j); x[iu] = umid; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j); x[iu] = umid; } return true; } bool MittelmannBndryCntrlDiriBase::get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index /*n*/, Number* /*x_scaling*/, bool& use_g_scaling, Index /*m*/, Number* /*g_scaling*/ ) { obj_scaling = 1. / hh_; use_x_scaling = false; use_g_scaling = false; return true; } bool MittelmannBndryCntrlDiriBase::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // return the value of the objective function obj_value = 0.; // First the integration of y-td over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); Number tmp = x[iy] - y_d_[iy]; obj_value += tmp * tmp; } } obj_value *= hh_ / 2.; // Now the integration of u over the boundary if( alpha_ > 0. ) { Number usum = 0.; for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, 0); usum += x[iu] * x[iu]; } for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, N_ + 1); usum += x[iu] * x[iu]; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j); usum += x[iu] * x[iu]; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j); usum += x[iu] * x[iu]; } obj_value += alpha_ * h_ / 2. * usum; } return true; } bool MittelmannBndryCntrlDiriBase::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) // now let's take care of the nonzero values coming from the // integrant over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); grad_f[iy] = hh_ * (x[iy] - y_d_[iy]); } } // The values for variables on the boundary if( alpha_ > 0. ) { for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, 0); grad_f[iu] = alpha_ * h_ * x[iu]; } for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, N_ + 1); grad_f[iu] = alpha_ * h_ * x[iu]; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j); grad_f[iu] = alpha_ * h_ * x[iu]; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j); grad_f[iu] = alpha_ * h_ * x[iu]; } } else { for( Index i = 1; i <= N_; i++ ) { grad_f[y_index(i, 0)] = 0.; } for( Index i = 1; i <= N_; i++ ) { grad_f[y_index(i, N_ + 1)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(0, j)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(N_ + 1, j)] = 0.; } } // Nothing on the corner points grad_f[y_index(0, 0)] = 0.; grad_f[y_index(0, N_ + 1)] = 0.; grad_f[y_index(N_ + 1, 0)] = 0.; grad_f[y_index(N_ + 1, N_ + 1)] = 0.; return true; } bool MittelmannBndryCntrlDiriBase::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index m, Number* g ) { // return the value of the constraints: g(x) // compute the discretized PDE for each interior grid point Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Number val; // Start with the discretized Laplacian operator val = 4. * x[y_index(i, j)] - x[y_index(i - 1, j)] - x[y_index(i + 1, j)] - x[y_index(i, j - 1)] - x[y_index(i, j + 1)]; g[ig] = val; ig++; } } DBG_ASSERT(ig == m); (void) m; return true; } bool MittelmannBndryCntrlDiriBase::eval_jac_g( Index /*n*/, const Number* /*x*/, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints Index ijac = 0; Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // y(i,j) iRow[ijac] = ig; jCol[ijac] = y_index(i, j); ijac++; // y(i-1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j); ijac++; // y(i+1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j); ijac++; // y(i,j-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1); ijac++; // y(i,j+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1); ijac++; ig++; } } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // y(i,j) values[ijac] = 4.; ijac++; // y(i-1,j) values[ijac] = -1.; ijac++; // y(i+1,j) values[ijac] = -1.; ijac++; // y(1,j-1) values[ijac] = -1.; ijac++; // y(1,j+1) values[ijac] = -1.; ijac++; } } DBG_ASSERT(ijac == nele_jac); } return true; } bool MittelmannBndryCntrlDiriBase::eval_h( Index /*n*/, const Number* /*x*/, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* /*lambda*/, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = y_index(i, j); jCol[ihes] = y_index(i, j); ihes++; } } if( alpha_ > 0. ) { // Now the diagonal entries for u at the boundary for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, 0); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } for( Index i = 1; i <= N_; i++ ) { Index iu = y_index(i, N_ + 1); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // return the values Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // Contribution from the objective function values[ihes] = obj_factor * hh_; ihes++; } } // Now the diagonal entries for u(i,j) if( alpha_ > 0. ) { // Now the diagonal entries for u at the boundary for( Index i = 1; i <= N_; i++ ) { values[ihes] = obj_factor * h_ * alpha_; ihes++; } for( Index i = 1; i <= N_; i++ ) { values[ihes] = obj_factor * h_ * alpha_; ihes++; } for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * h_ * alpha_; ihes++; } for( Index i = 1; i <= N_; i++ ) { values[ihes] = obj_factor * h_ * alpha_; ihes++; } } } return true; } void MittelmannBndryCntrlDiriBase::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { /* FILE* fp = fopen("solution.txt", "w+"); for (Index i=0; i<=N_+1; i++) { for (Index j=0; j<=N_+1; j++) { fprintf(fp, "y[%6d,%6d] = %15.8e\n", i, j, x[y_index(i,j)]); } } fclose(fp); */ } coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannBndryCntrlDiri.hpp000066400000000000000000000257051473776672200270320ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // based on MyNLP.hpp #ifndef __MITTELMANNBNDRYCNTRLDIRI_HPP__ #define __MITTELMANNBNDRYCNTRLDIRI_HPP__ #include "RegisteredTNLP.hpp" #include #include using namespace Ipopt; /** Base class for boundary control problems with Dirichlet boundary * conditions, as formulated by Hans Mittelmann as Examples 1-4 in * "Optimization Techniques for Solving Elliptic Control Problems * with Control and State Constraints. Part 2: Boundary Control" * * Here, the control variables are identical to the values of y on * the boundary, and therefore we don't need any explicit * optimization variables for u. */ class MittelmannBndryCntrlDiriBase: public RegisteredTNLP { public: /** Constructor. */ MittelmannBndryCntrlDiriBase(); /** Default destructor */ virtual ~MittelmannBndryCntrlDiriBase(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** Method for returning scaling parameters */ virtual bool get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index n, Number* x_scaling, bool& use_g_scaling, Index m, Number* g_scaling ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} protected: /** Method for setting the internal parameters that define the * problem. * * It must be called by the child class in its * implementation of InitializeParameters. */ void SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number d_const ); /**@name Functions that defines a particular instance. */ //@{ /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const = 0; //@} private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MittelmannBndryCntrlDiriBase( const MittelmannBndryCntrlDiriBase& ); MittelmannBndryCntrlDiriBase& operator=( const MittelmannBndryCntrlDiriBase& ); //@} /**@name Problem specification */ //@{ /** Number of mesh points in one dimension (excluding boundary) */ Index N_; /** Step size */ Number h_; /** h_ squaredd */ Number hh_; /** overall lower bound on y */ Number lb_y_; /** overall upper bound on y */ Number ub_y_; /** overall lower bound on u */ Number lb_u_; /** overall upper bound on u */ Number ub_u_; /** Constant value of d appearing in elliptical equation */ Number d_const_; /** Weighting parameter for the control target deviation functional * in the objective */ Number alpha_; /** Array for the target profile for y */ Number* y_d_; //@} /**@name Auxiliary methods */ //@{ /** Translation of mesh point indices to NLP variable indices for y(x_ij) */ inline Index y_index( Index i, Index j ) const { return j + (N_ + 2) * i; } /** Translation of interior mesh point indices to the corresponding * PDE constraint number */ inline Index pde_index( Index i, Index j ) const { return (j - 1) + N_ * (i - 1); } /** Compute the grid coordinate for given index in x1 direction */ inline Number x1_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x2 direction */ inline Number x2_grid( Index i ) const { return h_ * (Number) i; } //@} }; /** Implemention of Example 1 */ class MittelmannBndryCntrlDiri1: public MittelmannBndryCntrlDiriBase { public: MittelmannBndryCntrlDiri1() { } virtual ~MittelmannBndryCntrlDiri1() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.01; Number lb_y = -1e20; Number ub_y = 3.5; Number lb_u = 0.; Number ub_u = 10.; Number d_const = -20.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, d_const); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 3. + 5. * (x1 * (x1 - 1.) * x2 * (x2 - 1.)); } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlDiri1( const MittelmannBndryCntrlDiri1& ); MittelmannBndryCntrlDiri1& operator=( const MittelmannBndryCntrlDiri1& ); //@} }; /** Implementation of Example 2 */ class MittelmannBndryCntrlDiri2: public MittelmannBndryCntrlDiriBase { public: MittelmannBndryCntrlDiri2() { } virtual ~MittelmannBndryCntrlDiri2() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.; Number lb_y = -1e20; Number ub_y = 3.5; Number lb_u = 0.; Number ub_u = 10.; Number d_const = -20.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, d_const); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 3. + 5. * (x1 * (x1 - 1.) * x2 * (x2 - 1.)); } private: /**@name hide implicitly defined constructors an dcopy operators */ //@{ MittelmannBndryCntrlDiri2( const MittelmannBndryCntrlDiri2& ); MittelmannBndryCntrlDiri2& operator=( const MittelmannBndryCntrlDiri2& ); //@} }; /** Implementation of Example 3 */ class MittelmannBndryCntrlDiri3: public MittelmannBndryCntrlDiriBase { public: MittelmannBndryCntrlDiri3() { } virtual ~MittelmannBndryCntrlDiri3() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.01; Number lb_y = -1e20; Number ub_y = 3.2; Number lb_u = 1.6; Number ub_u = 2.3; Number d_const = -20.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, d_const); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 3. + 5. * (x1 * (x1 - 1.) * x2 * (x2 - 1.)); } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlDiri3( const MittelmannBndryCntrlDiri3& ); MittelmannBndryCntrlDiri3& operator=( const MittelmannBndryCntrlDiri3& ); //@} }; /** Implementation of Example 4 */ class MittelmannBndryCntrlDiri4: public MittelmannBndryCntrlDiriBase { public: MittelmannBndryCntrlDiri4() { } virtual ~MittelmannBndryCntrlDiri4() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.; Number lb_y = -1e20; Number ub_y = 3.2; Number lb_u = 1.6; Number ub_u = 2.3; Number d_const = -20.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, d_const); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 3. + 5. * (x1 * (x1 - 1.) * x2 * (x2 - 1.)); } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlDiri4( const MittelmannBndryCntrlDiri4& ); MittelmannBndryCntrlDiri4& operator=( const MittelmannBndryCntrlDiri4& ); //@} }; #endif coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannBndryCntrlDiri3D.cpp000066400000000000000000000535271473776672200272170ustar00rootroot00000000000000// Copyright (C) 2005, 2007 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // Olaf Schenk (Univ. of Basel) 2007-08-01 // modified MittelmannBndryCntrlDiri.cpp for 3-dim problem #include "MittelmannBndryCntrlDiri3D.hpp" #include using namespace Ipopt; /* Constructor. */ MittelmannBndryCntrlDiriBase3D::MittelmannBndryCntrlDiriBase3D() : y_d_(NULL) { } MittelmannBndryCntrlDiriBase3D::~MittelmannBndryCntrlDiriBase3D() { delete[] y_d_; } void MittelmannBndryCntrlDiriBase3D::SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number d_const, Number B, Number C ) { N_ = N; h_ = 1. / (N + 1); hh_ = h_ * h_; hhh_ = hh_ * h_; lb_y_ = lb_y; ub_y_ = ub_y; lb_u_ = lb_u; ub_u_ = ub_u; d_const_ = d_const; alpha_ = alpha; B_ = B; C_ = C; PenA_ = 1.5 - 1.125 * C_ / B_; PenB_ = 1.75 * C_ / std::pow(B_, 3) - 1.5 / (B_ * B_); PenC_ = 0.5 / std::pow(B_, 4) - 0.625 * C_ / std::pow(B_, 5); // Initialize the target profile variables delete[] y_d_; y_d_ = new Number[(N_ + 2) * (N_ + 2) * (N_ + 2)]; for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { for( Index i = 0; i <= N_ + 1; i++ ) { y_d_[y_index(i, j, k)] = y_d_cont(x1_grid(i), x2_grid(j), x3_grid(k)); } } } } bool MittelmannBndryCntrlDiriBase3D::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // We for each of the N_+2 times N_+2 times N_+2 mesh points we have // the value of the functions y, including the control parameters on // the boundary n = (N_ + 2) * (N_ + 2) * (N_ + 2); // For each of the N_ times N_ times N_ interior mesh points we have the // discretized PDE. m = N_ * N_ * N_; // y(i,j,k), y(i-1,j,k), y(i+1,j,k), y(i,j-1,k), y(i,j+1,k), // y(i-1,j,k-1), y(i,j,k+1) // of the N_*N_*N_ discretized PDEs nnz_jac_g = 7 * N_ * N_ * N_; // diagonal entry for each y(i,j) in the interior nnz_h_lag = N_ * N_ * N_; if( alpha_ > 0. ) { // and one entry for u(i,j) in the bundary if alpha is not zero nnz_h_lag += 6 * N_ * N_; } // We use the C indexing style for row/col entries (corresponding to // the C notation, starting at 0) index_style = C_STYLE; return true; } bool MittelmannBndryCntrlDiriBase3D::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // Set overall bounds on the y variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iy = y_index(i, j, k); x_l[iy] = lb_y_; x_u[iy] = ub_y_; } } } // Set the overall 3D bounds on the control variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, 0); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, N_ + 1); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, 0, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, N_ + 1, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(0, j, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(N_ + 1, j, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } // The values of y on the corners doens't appear anywhere, so we fix // them to zero for( Index j = 0; j <= N_ + 1; j++ ) { x_l[y_index(0, j, 0)] = x_u[y_index(0, j, 0)] = 0.; x_l[y_index(0, j, N_ + 1)] = x_u[y_index(0, j, N_ + 1)] = 0.; x_l[y_index(N_ + 1, j, 0)] = x_u[y_index(N_ + 1, j, 0)] = 0.; x_l[y_index(N_ + 1, j, N_ + 1)] = x_u[y_index(N_ + 1, j, N_ + 1)] = 0.; } for( Index k = 0; k <= N_ + 1; k++ ) { x_l[y_index(0, 0, k)] = x_u[y_index(0, 0, k)] = 0.; x_l[y_index(0, N_ + 1, k)] = x_u[y_index(0, N_ + 1, k)] = 0.; x_l[y_index(N_ + 1, 0, k)] = x_u[y_index(N_ + 1, 0, k)] = 0.; x_l[y_index(N_ + 1, N_ + 1, k)] = x_u[y_index(N_ + 1, N_ + 1, k)] = 0.; } for( Index i = 0; i <= N_ + 1; i++ ) { x_l[y_index(i, 0, 0)] = x_u[y_index(i, 0, 0)] = 0.; x_l[y_index(i, 0, N_ + 1)] = x_u[y_index(i, 0, N_ + 1)] = 0.; x_l[y_index(i, N_ + 1, 0)] = x_u[y_index(i, N_ + 1, 0)] = 0.; x_l[y_index(i, N_ + 1, N_ + 1)] = x_u[y_index(i, N_ + 1, N_ + 1)] = 0.; } // all discretized PDE constraints have right hand side equal to // minus the constant value of the function d for( Index i = 0; i < m; i++ ) { g_l[i] = -hh_ * d_const_; g_u[i] = -hh_ * d_const_; } return true; } bool MittelmannBndryCntrlDiriBase3D::get_starting_point( Index /*n*/, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the others if // you wish. assert(init_x == true); (void) init_x; assert(init_z == false); (void) init_z; assert(init_lambda == false); (void) init_lambda; // set all y's to the perfect match with y_d for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { x[y_index(i, j, k)] = y_d_[y_index(i, j, k)]; // 0 in AMPL model } } } Number umid = (ub_u_ + lb_u_) / 2.; for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, 0); x[iu] = umid; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, N_ + 1); x[iu] = umid; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, 0, k); x[iu] = umid; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, N_ + 1, k); x[iu] = umid; } } for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(0, j, k); x[iu] = umid; } } for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(N_ + 1, j, k); x[iu] = umid; } } return true; } bool MittelmannBndryCntrlDiriBase3D::get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index /*n*/, Number* /*x_scaling*/, bool& use_g_scaling, Index /*m*/, Number* /*g_scaling*/ ) { obj_scaling = 1. / hhh_; use_x_scaling = false; use_g_scaling = false; return true; } bool MittelmannBndryCntrlDiriBase3D::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // return the value of the objective function obj_value = 0.; // First the integration of y-td over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { Index iy = y_index(i, j, k); Number tmp = x[iy] - y_d_[iy]; obj_value += PenObj(tmp); //obj_value += tmp*tmp; } } } obj_value *= hhh_; // Now the integration of u over the boundary if( alpha_ > 0. ) { Number usum = 0.; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, 0); usum += x[iu] * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, N_ + 1); usum += x[iu] * x[iu]; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j, k); usum += x[iu] * x[iu]; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j, k); usum += x[iu] * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, 0, k); usum += x[iu] * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, N_ + 1, k); usum += x[iu] * x[iu]; } } obj_value += alpha_ * hh_ * 0.5 * usum; } return true; } bool MittelmannBndryCntrlDiriBase3D::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) // now let's take care of the nonzero values coming from the // integrant over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { Index iy = y_index(i, j, k); grad_f[iy] = hhh_ * PenObj_1(x[iy] - y_d_[iy]); } } } // The values for variables on the boundary if( alpha_ > 0. ) { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, 0); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, N_ + 1); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j, k); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j, k); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, 0, k); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, N_ + 1, k); grad_f[iu] = alpha_ * hh_ * x[iu]; } } } else { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(i, j, 0)] = 0.; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(i, j, N_ + 1)] = 0.; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(0, j, k)] = 0.; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(N_ + 1, j, k)] = 0.; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { grad_f[y_index(i, 0, k)] = 0.; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { grad_f[y_index(i, N_ + 1, k)] = 0.; } } } // Nothing on the corner points for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, 0, 0)] = 0.; grad_f[y_index(i, 0, N_ + 1)] = 0.; grad_f[y_index(i, N_ + 1, 0)] = 0.; grad_f[y_index(i, N_ + 1, N_ + 1)] = 0.; } for( Index j = 0; j <= N_ + 1; j++ ) { grad_f[y_index(0, j, 0)] = 0.; grad_f[y_index(N_ + 1, j, 0)] = 0.; grad_f[y_index(0, j, N_ + 1)] = 0.; grad_f[y_index(N_ + 1, j, N_ + 1)] = 0.; } for( Index k = 0; k <= N_ + 1; k++ ) { grad_f[y_index(0, 0, k)] = 0.; grad_f[y_index(N_ + 1, 0, k)] = 0.; grad_f[y_index(0, N_ + 1, k)] = 0.; grad_f[y_index(N_ + 1, N_ + 1, k)] = 0.; } return true; } bool MittelmannBndryCntrlDiriBase3D::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index m, Number* g ) { // return the value of the constraints: g(x) // compute the discretized PDE for each interior grid point Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { Number val; // Start with the discretized Laplacian operator val = 6. * x[y_index(i, j, k)] - x[y_index(i - 1, j, k)] - x[y_index(i + 1, j, k)] - x[y_index(i, j - 1, k)] - x[y_index(i, j + 1, k)] - x[y_index(i, j, k - 1)] - x[y_index(i, j, k + 1)]; g[ig] = val; ig++; } } } DBG_ASSERT(ig == m); (void) m; return true; } bool MittelmannBndryCntrlDiriBase3D::eval_jac_g( Index /*n*/, const Number* /*x*/, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints Index ijac = 0; Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { // y(i,j,k) iRow[ijac] = ig; jCol[ijac] = y_index(i, j, k); ijac++; // y(i-1,j,k) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j, k); ijac++; // y(i+1,j,k) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j, k); ijac++; // y(i,j-1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1, k); ijac++; // y(i,j+1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1, k); ijac++; // y(i,j,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j, k - 1); ijac++; // y(i,j,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j, k + 1); ijac++; ig++; } } } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { // y(i,j,k) values[ijac] = 6.; ijac++; // y(i-1,j,k) values[ijac] = -1.; ijac++; // y(i+1,j,k) values[ijac] = -1.; ijac++; // y(1,j-1,k) values[ijac] = -1.; ijac++; // y(1,j+1,k) values[ijac] = -1.; ijac++; // y(1,j,k-1) values[ijac] = -1.; ijac++; // y(1,j,k+1) values[ijac] = -1.; ijac++; } } } DBG_ASSERT(ijac == nele_jac); } return true; } bool MittelmannBndryCntrlDiriBase3D::eval_h( Index /*n*/, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* /*lambda*/, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { iRow[ihes] = y_index(i, j, k); jCol[ihes] = y_index(i, j, k); ihes++; } } } if( alpha_ > 0. ) { // Now the diagonal entries for u at the boundary for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, 0); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, N_ + 1); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j, k); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j, k); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, 0, k); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, N_ + 1, k); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // return the values Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { // Contribution from the objective function Index iy = y_index(i, j, k); values[ihes] = obj_factor * hhh_ * PenObj_2(x[iy] - y_d_[iy]); ihes++; } } } // Now the diagonal entries for u(i,j) if( alpha_ > 0. ) { // Now the diagonal entries for u at the boundary for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } } } return true; } void MittelmannBndryCntrlDiriBase3D::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { /* FILE* fp = fopen("solution.txt", "w+"); for (Index i=0; i<=N_+1; i++) { for (Index j=0; j<=N_+1; j++) { for (Index k=0; k<=N_+1; k++) { fprintf(fp, "y[%6d,%6d,%6d] = %15.8e\n", i, j, k, x[y_index(i,j,k)]); } } } fclose(fp); */ } coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannBndryCntrlDiri3D.hpp000066400000000000000000000234531473776672200272170ustar00rootroot00000000000000// Copyright (C) 2005, 2007 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // Olaf Schenk (Univ. of Basel) 2007-08-01 // modified MittelmannBndryCntrlDiri.hpp for 3-dim problem #ifndef __MITTELMANNBNDRYCNTRLDIRI3D_HPP__ #define __MITTELMANNBNDRYCNTRLDIRI3D_HPP__ #include "RegisteredTNLP.hpp" #include #include using namespace Ipopt; /** Base class for boundary control problems with Dirichlet boundary * conditions, as formulated by Hans Mittelmann as Examples 1-4 in * "Optimization Techniques for Solving Elliptic Control Problems * with Control and State Constraints. Part 2: Boundary Control" * * Here, the control variables are identical to the values of y on * the boundary, and therefore we don't need any explicit * optimization variables for u. */ class MittelmannBndryCntrlDiriBase3D: public RegisteredTNLP { public: /** Constructor. */ MittelmannBndryCntrlDiriBase3D(); /** Default destructor */ virtual ~MittelmannBndryCntrlDiriBase3D(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** Method for returning scaling parameters */ virtual bool get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index n, Number* x_scaling, bool& use_g_scaling, Index m, Number* g_scaling ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} protected: /** Method for setting the internal parameters that define the problem. * * It must be called by the child class in its * implementation of InitializeParameters. */ void SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number d_const, Number B, Number C ); /**@name Functions that defines a particular instance. */ //@{ /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2, Number x3 ) const = 0; //@} private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MittelmannBndryCntrlDiriBase3D( const MittelmannBndryCntrlDiriBase3D& ); MittelmannBndryCntrlDiriBase3D& operator=( const MittelmannBndryCntrlDiriBase3D& ); //@} /**@name Problem specification */ //@{ /** Number of mesh points in one dimension (excluding boundary) */ Index N_; /** Step size */ Number h_; /** h_ squared */ Number hh_; /** h_ to the third power */ Number hhh_; /** overall lower bound on y */ Number lb_y_; /** overall upper bound on y */ Number ub_y_; /** overall lower bound on u */ Number lb_u_; /** overall upper bound on u */ Number ub_u_; /** Constant value of d appearing in elliptical equation */ Number d_const_; /** Weighting parameter for the control target deviation functional * in the objective */ Number alpha_; /** Array for the target profile for y */ Number* y_d_; //@} /**@name Auxiliary methods */ //@{ /** Translation of mesh point indices to NLP variable indices for y(x_ijk) */ inline Index y_index( Index i, Index j, Index k ) const { return k + (N_ + 2) * j + (N_ + 2) * (N_ + 2) * i; } /** Translation of interior mesh point indices to the corresponding * PDE constraint number */ inline Index pde_index( Index i, Index j, Index k ) const { return (k - 1) + N_ * (j - 1) + N_ * N_ * (i - 1); } /** Compute the grid coordinate for given index in x1 direction */ inline Number x1_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x2 direction */ inline Number x2_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x3 direction */ inline Number x3_grid( Index i ) const { return h_ * (Number) i; } /** value of penalty function term */ inline Number PenObj( Number t ) const { //return 0.5*t*t; if( t > B_ ) { return B_ * B_ / 2. + C_ * (t - B_); } else if( t < -B_ ) { return B_ * B_ / 2. + C_ * (-t - B_); } else { const Number t2 = t * t; const Number t4 = t2 * t2; const Number t6 = t4 * t2; return PenA_ * t2 + PenB_ * t4 + PenC_ * t6; } } /** first derivative of penalty function term */ inline Number PenObj_1( Number t ) const { //return t; if( t > B_ ) { return C_; } else if( t < -B_ ) { return -C_; } else { const Number t2 = t * t; const Number t3 = t * t2; const Number t5 = t3 * t2; return 2. * PenA_ * t + 4. * PenB_ * t3 + 6. * PenC_ * t5; } } /** second derivative of penalty function term */ inline Number PenObj_2( Number t ) const { //return 1.; if( t > B_ ) { return 0.; } else if( t < -B_ ) { return 0.; } else { const Number t2 = t * t; const Number t4 = t2 * t2; return 2. * PenA_ + 12. * PenB_ * t2 + 30. * PenC_ * t4; } } //@} /** @name Data for penalty function term */ //@{ Number B_; Number C_; Number PenA_; Number PenB_; Number PenC_; //@} }; /** Implementation of Example 1 */ class MittelmannBndryCntrlDiri3D: public MittelmannBndryCntrlDiriBase3D { public: MittelmannBndryCntrlDiri3D() { } virtual ~MittelmannBndryCntrlDiri3D() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.01; Number lb_y = -1e20; Number ub_y = 3.5; Number lb_u = 0.; Number ub_u = 10.; Number d_const = -20.; Number B = .5; Number C = 0.01; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, d_const, B, C); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2, Number /*x3*/ ) const { return 3. + 5. * (x1 * (x1 - 1.) * x2 * (x2 - 1.)); } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlDiri3D( const MittelmannBndryCntrlDiri3D& ); MittelmannBndryCntrlDiri3D& operator=( const MittelmannBndryCntrlDiri3D& ); //@} }; #endif coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannBndryCntrlDiri3D_27.cpp000066400000000000000000000672271473776672200275310ustar00rootroot00000000000000// Copyright (C) 2005, 2007 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // Olaf Schenk (Univ. of Basel) 2007-08-01 // modified MittelmannBndryCntrlDiri.cpp for 3-dim problem #include "MittelmannBndryCntrlDiri3D_27.hpp" #include using namespace Ipopt; /* Constructor. */ MittelmannBndryCntrlDiriBase3D_27::MittelmannBndryCntrlDiriBase3D_27() : y_d_(NULL) { } MittelmannBndryCntrlDiriBase3D_27::~MittelmannBndryCntrlDiriBase3D_27() { delete[] y_d_; } void MittelmannBndryCntrlDiriBase3D_27::SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number d_const, Number B, Number C ) { N_ = N; h_ = 1. / (N + 1); hh_ = h_ * h_; hhh_ = hh_ * h_; lb_y_ = lb_y; ub_y_ = ub_y; lb_u_ = lb_u; ub_u_ = ub_u; d_const_ = d_const; alpha_ = alpha; B_ = B; C_ = C; PenA_ = 1.5 - 1.125 * C_ / B_; PenB_ = 1.75 * C_ / std::pow(B_, 3) - 1.5 / (B_ * B_); PenC_ = 0.5 / std::pow(B_, 4) - 0.625 * C_ / std::pow(B_, 5); // Initialize the target profile variables delete[] y_d_; y_d_ = new Number[(N_ + 2) * (N_ + 2) * (N_ + 2)]; for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { for( Index i = 0; i <= N_ + 1; i++ ) { y_d_[y_index(i, j, k)] = y_d_cont(x1_grid(i), x2_grid(j), x3_grid(k)); } } } } bool MittelmannBndryCntrlDiriBase3D_27::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // We for each of the N_+2 times N_+2 times N_+2 mesh points we have // the value of the functions y, including the control parameters on // the boundary n = (N_ + 2) * (N_ + 2) * (N_ + 2); // For each of the N_ times N_ times N_ interior mesh points we have the // discretized PDE. m = N_ * N_ * N_; // y(i-1,j-1,k-1), y(i,j-1,k-1), y(i+1,j-1,k-1) // y(i-1,j ,k-1), y(i,j ,k-1), y(i+1,j, k-1) // y(i-1,j+1,k-1), y(i,j+1,k-1), y(i+1,j+1,k-1), // y(i-1,j-1,k), y(i,j-1,k), y(i+1,j-1,k) // y(i-1,j ,k), y(i,j ,k), y(i+1,j, k) // y(i-1,j+1,k), y(i,j+1,k), y(i+1,j+1,k), // y(i-1,j-1,k+1), y(i,j-1,k+1), y(i+1,j-1,k+1) // y(i-1,j ,k+1), y(i,j ,k+1), y(i+1,j, k+1) // y(i-1,j+1,k+1), y(i,j+1,k+1), y(i+1,j+1,k+1), // of the N_*N_*N_ discretized PDEs nnz_jac_g = 27 * N_ * N_ * N_; // diagonal entry for each y(i,j) in the interior nnz_h_lag = N_ * N_ * N_; if( alpha_ > 0. ) { // and one entry for u(i,j) in the bundary if alpha is not zero nnz_h_lag += 6 * N_ * N_; } // We use the C indexing style for row/col entries (corresponding to // the C notation, starting at 0) index_style = C_STYLE; return true; } bool MittelmannBndryCntrlDiriBase3D_27::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // Set overall bounds on the y variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iy = y_index(i, j, k); x_l[iy] = lb_y_; x_u[iy] = ub_y_; } } } // Set the overall 3D bounds on the control variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, 0); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, N_ + 1); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, 0, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, N_ + 1, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(0, j, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(N_ + 1, j, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } // The values of y on the corners doens't appear anywhere, so we fix // them to zero for( Index j = 0; j <= N_ + 1; j++ ) { x_l[y_index(0, j, 0)] = x_u[y_index(0, j, 0)] = 0.; x_l[y_index(0, j, N_ + 1)] = x_u[y_index(0, j, N_ + 1)] = 0.; x_l[y_index(N_ + 1, j, 0)] = x_u[y_index(N_ + 1, j, 0)] = 0.; x_l[y_index(N_ + 1, j, N_ + 1)] = x_u[y_index(N_ + 1, j, N_ + 1)] = 0.; } for( Index k = 0; k <= N_ + 1; k++ ) { x_l[y_index(0, 0, k)] = x_u[y_index(0, 0, k)] = 0.; x_l[y_index(0, N_ + 1, k)] = x_u[y_index(0, N_ + 1, k)] = 0.; x_l[y_index(N_ + 1, 0, k)] = x_u[y_index(N_ + 1, 0, k)] = 0.; x_l[y_index(N_ + 1, N_ + 1, k)] = x_u[y_index(N_ + 1, N_ + 1, k)] = 0.; } for( Index i = 0; i <= N_ + 1; i++ ) { x_l[y_index(i, 0, 0)] = x_u[y_index(i, 0, 0)] = 0.; x_l[y_index(i, 0, N_ + 1)] = x_u[y_index(i, 0, N_ + 1)] = 0.; x_l[y_index(i, N_ + 1, 0)] = x_u[y_index(i, N_ + 1, 0)] = 0.; x_l[y_index(i, N_ + 1, N_ + 1)] = x_u[y_index(i, N_ + 1, N_ + 1)] = 0.; } // all discretized PDE constraints have right hand side equal to // minus the constant value of the function d for( Index i = 0; i < m; i++ ) { g_l[i] = -hh_ * d_const_; g_u[i] = -hh_ * d_const_; } return true; } bool MittelmannBndryCntrlDiriBase3D_27::get_starting_point( Index /*n*/, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the others if // you wish. assert(init_x == true); (void) init_x; assert(init_z == false); (void) init_z; assert(init_lambda == false); (void) init_lambda; // set all y's to the perfect match with y_d for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { x[y_index(i, j, k)] = y_d_[y_index(i, j, k)]; // 0 in AMPL model } } } Number umid = (ub_u_ + lb_u_) / 2.; for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, 0); x[iu] = umid; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, N_ + 1); x[iu] = umid; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, 0, k); x[iu] = umid; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, N_ + 1, k); x[iu] = umid; } } for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(0, j, k); x[iu] = umid; } } for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(N_ + 1, j, k); x[iu] = umid; } } return true; } bool MittelmannBndryCntrlDiriBase3D_27::get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index /*n*/, Number* /*x_scaling*/, bool& use_g_scaling, Index /*m*/, Number* /*g_scaling*/ ) { obj_scaling = 1. / hhh_; use_x_scaling = false; use_g_scaling = false; return true; } bool MittelmannBndryCntrlDiriBase3D_27::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // return the value of the objective function obj_value = 0.; // First the integration of y-td over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { Index iy = y_index(i, j, k); Number tmp = x[iy] - y_d_[iy]; obj_value += PenObj(tmp); //obj_value += tmp*tmp; } } } obj_value *= hhh_; // Now the integration of u over the boundary if( alpha_ > 0. ) { Number usum = 0.; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, 0); usum += x[iu] * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, N_ + 1); usum += x[iu] * x[iu]; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j, k); usum += x[iu] * x[iu]; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j, k); usum += x[iu] * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, 0, k); usum += x[iu] * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, N_ + 1, k); usum += x[iu] * x[iu]; } } obj_value += alpha_ * hh_ * 0.5 * usum; } return true; } bool MittelmannBndryCntrlDiriBase3D_27::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) // now let's take care of the nonzero values coming from the // integrant over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { Index iy = y_index(i, j, k); grad_f[iy] = hhh_ * PenObj_1(x[iy] - y_d_[iy]); } } } // The values for variables on the boundary if( alpha_ > 0. ) { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, 0); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, N_ + 1); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j, k); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j, k); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, 0, k); grad_f[iu] = alpha_ * hh_ * x[iu]; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, N_ + 1, k); grad_f[iu] = alpha_ * hh_ * x[iu]; } } } else { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(i, j, 0)] = 0.; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(i, j, N_ + 1)] = 0.; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(0, j, k)] = 0.; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(N_ + 1, j, k)] = 0.; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { grad_f[y_index(i, 0, k)] = 0.; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { grad_f[y_index(i, N_ + 1, k)] = 0.; } } } // Nothing on the corner points for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, 0, 0)] = 0.; grad_f[y_index(i, 0, N_ + 1)] = 0.; grad_f[y_index(i, N_ + 1, 0)] = 0.; grad_f[y_index(i, N_ + 1, N_ + 1)] = 0.; } for( Index j = 0; j <= N_ + 1; j++ ) { grad_f[y_index(0, j, 0)] = 0.; grad_f[y_index(N_ + 1, j, 0)] = 0.; grad_f[y_index(0, j, N_ + 1)] = 0.; grad_f[y_index(N_ + 1, j, N_ + 1)] = 0.; } for( Index k = 0; k <= N_ + 1; k++ ) { grad_f[y_index(0, 0, k)] = 0.; grad_f[y_index(N_ + 1, 0, k)] = 0.; grad_f[y_index(0, N_ + 1, k)] = 0.; grad_f[y_index(N_ + 1, N_ + 1, k)] = 0.; } return true; } bool MittelmannBndryCntrlDiriBase3D_27::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index m, Number* g ) { // return the value of the constraints: g(x) // compute the discretized PDE for each interior grid point Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { Number val; // Start with the discretized Laplacian operator val = 200. * x[y_index(i, j, k)] - 16. * (x[y_index(i + 1, j, k)] + x[y_index(i - 1, j, k)] + x[y_index(i, j + 1, k)] + x[y_index(i, j - 1, k)] + x[y_index(i, j, k + 1)] + x[y_index(i, j, k - 1)]) - 8. * (x[y_index(i + 1, j + 1, k)] + x[y_index(i + 1, j - 1, k)] + x[y_index(i - 1, j + 1, k)] + x[y_index(i - 1, j - 1, k)] + x[y_index(i, j + 1, k + 1)] + x[y_index(i, j + 1, k - 1)] + x[y_index(i, j - 1, k + 1)] + x[y_index(i, j - 1, k - 1)] + x[y_index(i + 1, j, k + 1)] + x[y_index(i + 1, j, k - 1)] + x[y_index(i - 1, j, k + 1)] + x[y_index(i - 1, j, k - 1)]) - 1. * (x[y_index(i + 1, j + 1, k + 1)] + x[y_index(i + 1, j - 1, k + 1)] + x[y_index(i + 1, j + 1, k - 1)] + x[y_index(i + 1, j - 1, k - 1)] + x[y_index(i - 1, j + 1, k + 1)] + x[y_index(i - 1, j - 1, k + 1)] + x[y_index(i - 1, j + 1, k - 1)] + x[y_index(i - 1, j - 1, k - 1)]); g[ig] = val; ig++; } } } DBG_ASSERT(ig == m); (void) m; return true; } bool MittelmannBndryCntrlDiriBase3D_27::eval_jac_g( Index /*n*/, const Number* /*x*/, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints Index ijac = 0; Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { // y(i-1,j,k) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j, k); ijac++; // y(i,j,k) iRow[ijac] = ig; jCol[ijac] = y_index(i, j, k); ijac++; // y(i+1,j,k) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j, k); ijac++; // y(i-1,j-1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j - 1, k); ijac++; // y(i,j-1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1, k); ijac++; // y(i+1,j-1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j - 1, k); ijac++; // y(i-1,j+1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j + 1, k); ijac++; // y(i,j+1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1, k); ijac++; // y(i+1,j+1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j + 1, k); ijac++; // y(i-1,j,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j, k - 1); ijac++; // y(i,j,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j, k - 1); ijac++; // y(i+1,j,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j, k - 1); ijac++; // y(i-1,j-1,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j - 1, k - 1); ijac++; // y(i,j-1,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1, k - 1); ijac++; // y(i+1,j-1,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j - 1, k - 1); ijac++; // y(i-1,j+1,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j + 1, k - 1); ijac++; // y(i,j+1,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1, k - 1); ijac++; // y(i+1,j+1,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j + 1, k - 1); ijac++; // y(i-1,j,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j, k + 1); ijac++; // y(i,j,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j, k + 1); ijac++; // y(i+1,j,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j, k + 1); ijac++; // y(i-1,j-1,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j - 1, k + 1); ijac++; // y(i,j-1,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1, k + 1); ijac++; // y(i+1,j-1,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j - 1, k + 1); ijac++; // y(i-1,j+1,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j + 1, k + 1); ijac++; // y(i,j+1,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1, k + 1); ijac++; // y(i+1,j+1,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j + 1, k + 1); ijac++; ig++; } } } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { // y(i-1,j,k) values[ijac] = -16.; ijac++; // y(i,j,k) values[ijac] = 200.; ijac++; // y(i+1,j,k) values[ijac] = -16.; ijac++; // y(i-1,j-1,k) values[ijac] = -8.; ijac++; // y(i,j-1,k) values[ijac] = -16.; ijac++; // y(i+1,j-1,k) values[ijac] = -8.; ijac++; // y(i-1,j+1,k) values[ijac] = -8.; ijac++; // y(i,j+1,k) values[ijac] = -16.; ijac++; // y(i+1,j+1,k) values[ijac] = -8.; ijac++; // y(i-1,j,k-1) values[ijac] = -8.; ijac++; // y(i,j,k-1) values[ijac] = -16.; ijac++; // y(i+1,j,k-1) values[ijac] = -8.; ijac++; // y(i-1,j-1,k-1) values[ijac] = -1.; ijac++; // y(i,j-1,k-1) values[ijac] = -8.; ijac++; // y(i+1,j-1,k-1) values[ijac] = -1.; ijac++; // y(i-1,j+1,k-1) values[ijac] = -1.; ijac++; // y(i,j+1,k-1) values[ijac] = -8.; ijac++; // y(i+1,j+1,k-1) values[ijac] = -1.; ijac++; // y(i-1,j,k+1) values[ijac] = -8.; ijac++; // y(i,j,k+1) values[ijac] = -16.; ijac++; // y(i+1,j,k+1) values[ijac] = -8.; ijac++; // y(i-1,j-1,k+1) values[ijac] = -1.; ijac++; // y(i,j-1,k+1) values[ijac] = -8.; ijac++; // y(i+1,j-1,k+1) values[ijac] = -1.; ijac++; // y(i-1,j+1,k+1) values[ijac] = -1.; ijac++; // y(i,j+1,k+1) values[ijac] = -8.; ijac++; // y(i+1,j+1,k+1) values[ijac] = -1.; ijac++; } } } DBG_ASSERT(ijac == nele_jac); } return true; } bool MittelmannBndryCntrlDiriBase3D_27::eval_h( Index /*n*/, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* /*lambda*/, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { iRow[ihes] = y_index(i, j, k); jCol[ihes] = y_index(i, j, k); ihes++; } } } if( alpha_ > 0. ) { // Now the diagonal entries for u at the boundary for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, 0); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(i, j, N_ + 1); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(0, j, k); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index k = 1; k <= N_; k++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = y_index(N_ + 1, j, k); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, 0, k); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index k = 1; k <= N_; k++ ) { Index iu = y_index(i, N_ + 1, k); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // return the values Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { // Contribution from the objective function Index iy = y_index(i, j, k); values[ihes] = obj_factor * hhh_ * PenObj_2(x[iy] - y_d_[iy]); ihes++; } } } // Now the diagonal entries for u(i,j) if( alpha_ > 0. ) { // Now the diagonal entries for u at the boundary for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } } } return true; } void MittelmannBndryCntrlDiriBase3D_27::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { /* FILE* fp = fopen("solution.txt", "w+"); for (Index i=0; i<=N_+1; i++) { for (Index j=0; j<=N_+1; j++) { for (Index k=0; k<=N_+1; k++) { fprintf(fp, "y[%6d,%6d,%6d] = %15.8e\n", i, j, k, x[y_index(i,j,k)]); } } } fclose(fp); */ } coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannBndryCntrlDiri3D_27.hpp000066400000000000000000000264371473776672200275340ustar00rootroot00000000000000// Copyright (C) 2005, 2007 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Olaf Schenk (Univ. of Basel) 2007-08-01 // modified MittelmannBndryCntrlDiri.hpp for 3-dim problem // based on MyNLP.hpp #ifndef __MITTELMANNBNDRYCNTRLDIRI3D_27_HPP__ #define __MITTELMANNBNDRYCNTRLDIRI3D_27_HPP__ #include "RegisteredTNLP.hpp" #include #include using namespace Ipopt; /** Base class for boundary control problems with Dirichlet boundary * conditions, as formulated by Hans Mittelmann as Examples 1-4 in * "Optimization Techniques for Solving Elliptic Control Problems * with Control and State Constraints. Part 2: Boundary Control" * * Here, the control variables are identical to the values of y on * the boundary, and therefore we don't need any explicit * optimization variables for u. */ class MittelmannBndryCntrlDiriBase3D_27: public RegisteredTNLP { public: /** Constructor. */ MittelmannBndryCntrlDiriBase3D_27(); /** Default destructor */ virtual ~MittelmannBndryCntrlDiriBase3D_27(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** Method for returning scaling parameters */ virtual bool get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index n, Number* x_scaling, bool& use_g_scaling, Index m, Number* g_scaling ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} protected: /** Method for setting the internal parameters that define the * problem. * * It must be called by the child class in its * implementation of InitializeParameters. */ void SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number d_const, Number B, Number C ); /**@name Functions that defines a particular instance. */ //@{ /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2, Number x3 ) const = 0; //@} private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MittelmannBndryCntrlDiriBase3D_27( const MittelmannBndryCntrlDiriBase3D_27& ); MittelmannBndryCntrlDiriBase3D_27& operator=( const MittelmannBndryCntrlDiriBase3D_27& ); //@} /**@name Problem specification */ //@{ /** Number of mesh points in one dimension (excluding boundary) */ Index N_; /** Step size */ Number h_; /** h_ squared */ Number hh_; /** h_ to the third power */ Number hhh_; /** overall lower bound on y */ Number lb_y_; /** overall upper bound on y */ Number ub_y_; /** overall lower bound on u */ Number lb_u_; /** overall upper bound on u */ Number ub_u_; /** Constant value of d appearing in elliptical equation */ Number d_const_; /** Weighting parameter for the control target deviation functional * in the objective */ Number alpha_; /** Array for the target profile for y */ Number* y_d_; //@} /**@name Auxiliary methods */ //@{ /** Translation of mesh point indices to NLP variable indices for y(x_ijk) */ inline Index y_index( Index i, Index j, Index k ) const { return k + (N_ + 2) * j + (N_ + 2) * (N_ + 2) * i; } /** Translation of interior mesh point indices to the corresponding * PDE constraint number */ inline Index pde_index( Index i, Index j, Index k ) const { return (k - 1) + N_ * (j - 1) + N_ * N_ * (i - 1); } /** Compute the grid coordinate for given index in x1 direction */ inline Number x1_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x2 direction */ inline Number x2_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x3 direction */ inline Number x3_grid( Index i ) const { return h_ * (Number) i; } /** value of penalty function term */ inline Number PenObj( Number t ) const { if( B_ == 0. ) { return 0.5 * t * t; } else if( t > B_ ) { return B_ * B_ / 2. + C_ * (t - B_); } else if( t < -B_ ) { return B_ * B_ / 2. + C_ * (-t - B_); } else { const Number t2 = t * t; const Number t4 = t2 * t2; const Number t6 = t4 * t2; return PenA_ * t2 + PenB_ * t4 + PenC_ * t6; } } /** first derivative of penalty function term */ inline Number PenObj_1( Number t ) const { if( B_ == 0. ) { return t; } else if( t > B_ ) { return C_; } else if( t < -B_ ) { return -C_; } else { const Number t2 = t * t; const Number t3 = t * t2; const Number t5 = t3 * t2; return 2. * PenA_ * t + 4. * PenB_ * t3 + 6. * PenC_ * t5; } } /** second derivative of penalty function term */ inline Number PenObj_2( Number t ) const { if( B_ == 0. ) { return 1.; } else if( t > B_ ) { return 0.; } else if( t < -B_ ) { return 0.; } else { const Number t2 = t * t; const Number t4 = t2 * t2; return 2. * PenA_ + 12. * PenB_ * t2 + 30. * PenC_ * t4; } } //@} /** @name Data for penalty function term */ //@{ Number B_; Number C_; Number PenA_; Number PenB_; Number PenC_; //@} }; /** Implementation of case with convex quadratic penalty function */ class MittelmannBndryCntrlDiri3D_27: public MittelmannBndryCntrlDiriBase3D_27 { public: MittelmannBndryCntrlDiri3D_27() { } virtual ~MittelmannBndryCntrlDiri3D_27() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 1e-2; Number lb_y = -1e20; Number ub_y = 3.5; Number lb_u = 0.; Number ub_u = 10.; Number d_const = -20.; Number B = 0.; // convex case (quadratic penalty) Number C = 0.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, d_const, B, C); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2, Number /*x3*/ ) const { return 3. + 5. * (x1 * (x1 - 1.) * x2 * (x2 - 1.)); } private: /**@name hide implicitly defined constructors copy operators */ //@{ MittelmannBndryCntrlDiri3D_27( const MittelmannBndryCntrlDiri3D_27& ); MittelmannBndryCntrlDiri3D_27& operator=( const MittelmannBndryCntrlDiri3D_27& ); //@} }; /** Implementation of case with nonconvex Beaton-Tukey like penalty function */ class MittelmannBndryCntrlDiri3D_27BT: public MittelmannBndryCntrlDiriBase3D_27 { public: MittelmannBndryCntrlDiri3D_27BT() { } virtual ~MittelmannBndryCntrlDiri3D_27BT() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 1e-2; Number lb_y = -1e20; Number ub_y = 3.5; Number lb_u = 0.; Number ub_u = 10.; Number d_const = -20.; Number B = .25; // nonconves case with beaton-tukey-type penalty function Number C = 0.01; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, d_const, B, C); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2, Number /*x3*/ ) const { return 3. + 5. * (x1 * (x1 - 1.) * x2 * (x2 - 1.)); } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlDiri3D_27BT( const MittelmannBndryCntrlDiri3D_27BT& ); MittelmannBndryCntrlDiri3D_27BT& operator=( const MittelmannBndryCntrlDiri3D_27BT& ); //@} }; #endif coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannBndryCntrlDiri3Dsin.cpp000066400000000000000000000664721473776672200277340ustar00rootroot00000000000000// Copyright (C) 2005, 2007 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // Olaf Schenk (Univ. of Basel) 2007-08-01 // modified MittelmannBndryCntrlDiri.cpp for 3-dim problem #include "MittelmannBndryCntrlDiri3Dsin.hpp" #include using namespace Ipopt; /* Constructor. */ MittelmannBndryCntrlDiriBase3Dsin::MittelmannBndryCntrlDiriBase3Dsin() : y_d_(NULL) { } MittelmannBndryCntrlDiriBase3Dsin::~MittelmannBndryCntrlDiriBase3Dsin() { delete[] y_d_; } void MittelmannBndryCntrlDiriBase3Dsin::SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number d_const ) { N_ = N; h_ = 1. / (N + 1); hh_ = h_ * h_; lb_y_ = lb_y; ub_y_ = ub_y; lb_u_ = lb_u; ub_u_ = ub_u; d_const_ = d_const; alpha_ = alpha; // Initialize the target profile variables delete[] y_d_; y_d_ = new Number[(N_ + 2) * (N_ + 2) * (N_ + 2)]; for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { for( Index i = 0; i <= N_ + 1; i++ ) { y_d_[y_index(i, j, k)] = y_d_cont(x1_grid(i), x2_grid(j), x3_grid(k)); } } } } bool MittelmannBndryCntrlDiriBase3Dsin::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // We for each of the N_+2 times N_+2 times N_+2 mesh points we have // the value of the functions y, including the control parameters on // the boundary n = (N_ + 2) * (N_ + 2) * (N_ + 2); // For each of the N_ times N_ times N_ interior mesh points we have the // discretized PDE. m = N_ * N_ * N_; // y(i,j,k), y(i-1,j,k), y(i+1,j,k), y(i,j-1,k), y(i,j+1,k), // y(i-1,j,k-1), y(i,j,k+1) // of the N_*N_*N_ discretized PDEs nnz_jac_g = 7 * N_ * N_ * N_; // diagonal entry for each y(i,j) in the interior nnz_h_lag = N_ * N_ * N_; if( alpha_ > 0. ) { // and one entry for u(i,j) in the bundary if alpha is not zero nnz_h_lag += 21 * 6 * N_ * N_; } // We use the C indexing style for row/col entries (corresponding to // the C notation, starting at 0) index_style = C_STYLE; return true; } bool MittelmannBndryCntrlDiriBase3Dsin::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // Set overall bounds on the y variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iy = y_index(i, j, k); x_l[iy] = lb_y_; x_u[iy] = ub_y_; } } } // Set the overall 3Dsin bounds on the control variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, 0); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, N_ + 1); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, 0, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, N_ + 1, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(0, j, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(N_ + 1, j, k); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } #if 0 // The values of y on the corners doens't appear anywhere, so we fix // them to zero for (Index j = 0; j <= N_ + 1; j++) { x_l[y_index(0, j, 0)] = x_u[y_index(0, j, 0)] = 0.; x_l[y_index(0, j, N_ + 1)] = x_u[y_index(0, j, N_ + 1)] = 0.; x_l[y_index(N_ + 1, j, 0)] = x_u[y_index(N_ + 1, j, 0)] = 0.; x_l[y_index(N_ + 1, j, N_ + 1)] = x_u[y_index(N_ + 1, j, N_ + 1)] = 0.; } for (Index k = 0; k <= N_ + 1; k++) { x_l[y_index(0, 0, k)] = x_u[y_index(0, 0, k)] = 0.; x_l[y_index(0, N_ + 1, k)] = x_u[y_index(0, N_ + 1, k)] = 0.; x_l[y_index(N_ + 1, 0, k)] = x_u[y_index(N_ + 1, 0, k)] = 0.; x_l[y_index(N_ + 1, N_ + 1, k)] = x_u[y_index(N_ + 1, N_ + 1, k)] = 0.; } for (Index i = 0; i <= N_ + 1; i++) { x_l[y_index(i, 0, 0)] = x_u[y_index(i, 0, 0)] = 0.; x_l[y_index(i, 0, N_ + 1)] = x_u[y_index(i, 0, N_ + 1)] = 0.; x_l[y_index(i, N_ + 1, 0)] = x_u[y_index(i, N_ + 1, 0)] = 0.; x_l[y_index(i, N_ + 1, N_ + 1)] = x_u[y_index(i, N_ + 1, N_ + 1)] = 0.; } #endif // all discretized PDE constraints have right hand side equal to // minus the constant value of the function d for( Index i = 0; i < m; i++ ) { g_l[i] = -hh_ * d_const_; g_u[i] = -hh_ * d_const_; } return true; } bool MittelmannBndryCntrlDiriBase3Dsin::get_starting_point( Index /*n*/, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the others if // you wish. assert(init_x == true); (void) init_x; assert(init_z == false); (void) init_z; assert(init_lambda == false); (void) init_lambda; // set all y's to the perfect match with y_d for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { x[y_index(i, j, k)] = y_d_[y_index(i, j, k)]; // 0 in AMPL model } } } Number umid = (ub_u_ + lb_u_) / 2.; for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, 0); x[iu] = umid; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(i, j, N_ + 1); x[iu] = umid; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, 0, k); x[iu] = umid; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { Index iu = y_index(i, N_ + 1, k); x[iu] = umid; } } for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(0, j, k); x[iu] = umid; } } for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iu = y_index(N_ + 1, j, k); x[iu] = umid; } } return true; } bool MittelmannBndryCntrlDiriBase3Dsin::get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index /*n*/, Number* /*x_scaling*/, bool& use_g_scaling, Index /*m*/, Number* /*g_scaling*/ ) { obj_scaling = 1. / hh_; use_x_scaling = false; use_g_scaling = false; return true; } bool MittelmannBndryCntrlDiriBase3Dsin::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // return the value of the objective function obj_value = 0.; // First the integration of y-td over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { Index iy = y_index(i, j, k); Number tmp = x[iy] - y_d_[iy]; obj_value += tmp * tmp; } } } obj_value *= hh_ / 2.; // Now the integration of u over the boundary if( alpha_ > 0. ) { Number usum = 0.; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(i, j, 0)] - x[y_index(i - 1, j, 0)] - x[y_index(i + 1, j, 0)] - x[y_index(i, j - 1, 0)] - x[y_index(i, j + 1, 0)]) / hh_; const Number sinD = std::sin(D) - 0.5; usum += sinD * sinD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(i, j, N_ + 1)] - x[y_index(i - 1, j, N_ + 1)] - x[y_index(i + 1, j, N_ + 1)] - x[y_index(i, j - 1, N_ + 1)] - x[y_index(i, j + 1, N_ + 1)]) / hh_; const Number sinD = std::sin(D) - 0.5; usum += sinD * sinD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(0, i, j)] - x[y_index(0, i - 1, j)] - x[y_index(0, i + 1, j)] - x[y_index(0, i, j - 1)] - x[y_index(0, i, j + 1)]) / hh_; const Number sinD = std::sin(D) - 0.5; usum += sinD * sinD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(N_ + 1, i, j)] - x[y_index(N_ + 1, i - 1, j)] - x[y_index(N_ + 1, i + 1, j)] - x[y_index(N_ + 1, i, j - 1)] - x[y_index(N_ + 1, i, j + 1)]) / hh_; const Number sinD = std::sin(D) - 0.5; usum += sinD * sinD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(i, 0, j)] - x[y_index(i - 1, 0, j)] - x[y_index(i + 1, 0, j)] - x[y_index(i, 0, j - 1)] - x[y_index(i, 0, j + 1)]) / hh_; const Number sinD = std::sin(D) - 0.5; usum += sinD * sinD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(i, N_ + 1, j)] - x[y_index(i - 1, N_ + 1, j)] - x[y_index(i + 1, N_ + 1, j)] - x[y_index(i, N_ + 1, j - 1)] - x[y_index(i, N_ + 1, j + 1)]) / hh_; const Number sinD = std::sin(D) - 0.5; usum += sinD * sinD; } } obj_value += alpha_ * h_ / 2. * usum; } return true; } bool MittelmannBndryCntrlDiriBase3Dsin::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) // now let's take care of the nonzero values coming from the // integrant over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { Index iy = y_index(i, j, k); grad_f[iy] = hh_ * (x[iy] - y_d_[iy]); } } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { grad_f[y_index(i, j, 0)] = 0.; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { grad_f[y_index(i, j, N_ + 1)] = 0.; } } for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { grad_f[y_index(0, j, k)] = 0.; } } for( Index k = 0; k <= N_ + 1; k++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { grad_f[y_index(N_ + 1, j, k)] = 0.; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { grad_f[y_index(i, 0, k)] = 0.; } } for( Index i = 0; i <= N_ + 1; i++ ) { for( Index k = 0; k <= N_ + 1; k++ ) { grad_f[y_index(i, N_ + 1, k)] = 0.; } } // The values for variables on the boundary if( alpha_ > 0. ) { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(i, j, 0)] - x[y_index(i - 1, j, 0)] - x[y_index(i + 1, j, 0)] - x[y_index(i, j - 1, 0)] - x[y_index(i, j + 1, 0)]) / hh_; const Number FD = alpha_ * h_ * (std::cos(D) * (std::sin(D) - 0.5) / hh_); grad_f[y_index(i, j, 0)] += 4. * FD; grad_f[y_index(i - 1, j, 0)] += -1. * FD; grad_f[y_index(i + 1, j, 0)] += -1. * FD; grad_f[y_index(i, j - 1, 0)] += -1. * FD; grad_f[y_index(i, j + 1, 0)] += -1. * FD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(i, j, N_ + 1)] - x[y_index(i - 1, j, N_ + 1)] - x[y_index(i + 1, j, N_ + 1)] - x[y_index(i, j - 1, N_ + 1)] - x[y_index(i, j + 1, N_ + 1)]) / hh_; const Number FD = alpha_ * h_ * (std::cos(D) * (std::sin(D) - 0.5) / hh_); grad_f[y_index(i, j, N_ + 1)] += 4. * FD; grad_f[y_index(i - 1, j, N_ + 1)] += -1. * FD; grad_f[y_index(i + 1, j, N_ + 1)] += -1. * FD; grad_f[y_index(i, j - 1, N_ + 1)] += -1. * FD; grad_f[y_index(i, j + 1, N_ + 1)] += -1. * FD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(0, i, j)] - x[y_index(0, i - 1, j)] - x[y_index(0, i + 1, j)] - x[y_index(0, i, j - 1)] - x[y_index(0, i, j + 1)]) / hh_; const Number FD = alpha_ * h_ * (std::cos(D) * (std::sin(D) - 0.5) / hh_); grad_f[y_index(0, i, j)] += 4. * FD; grad_f[y_index(0, i - 1, j)] += -1. * FD; grad_f[y_index(0, i + 1, j)] += -1. * FD; grad_f[y_index(0, i, j - 1)] += -1. * FD; grad_f[y_index(0, i, j + 1)] += -1. * FD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(N_ + 1, i, j)] - x[y_index(N_ + 1, i - 1, j)] - x[y_index(N_ + 1, i + 1, j)] - x[y_index(N_ + 1, i, j - 1)] - x[y_index(N_ + 1, i, j + 1)]) / hh_; const Number FD = alpha_ * h_ * (std::cos(D) * (std::sin(D) - 0.5) / hh_); grad_f[y_index(N_ + 1, i, j)] += 4. * FD; grad_f[y_index(N_ + 1, i - 1, j)] += -1. * FD; grad_f[y_index(N_ + 1, i + 1, j)] += -1. * FD; grad_f[y_index(N_ + 1, i, j - 1)] += -1. * FD; grad_f[y_index(N_ + 1, i, j + 1)] += -1. * FD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(i, 0, j)] - x[y_index(i - 1, 0, j)] - x[y_index(i + 1, 0, j)] - x[y_index(i, 0, j - 1)] - x[y_index(i, 0, j + 1)]) / hh_; const Number FD = alpha_ * h_ * (std::cos(D) * (std::sin(D) - 0.5) / hh_); grad_f[y_index(i, 0, j)] += 4. * FD; grad_f[y_index(i - 1, 0, j)] += -1. * FD; grad_f[y_index(i + 1, 0, j)] += -1. * FD; grad_f[y_index(i, 0, j - 1)] += -1. * FD; grad_f[y_index(i, 0, j + 1)] += -1. * FD; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { const Number D = (4 * x[y_index(i, N_ + 1, j)] - x[y_index(i - 1, N_ + 1, j)] - x[y_index(i + 1, N_ + 1, j)] - x[y_index(i, N_ + 1, j - 1)] - x[y_index(i, N_ + 1, j + 1)]) / hh_; const Number FD = alpha_ * h_ * (std::cos(D) * (std::sin(D) - 0.5) / hh_); grad_f[y_index(i, N_ + 1, j)] += 4. * FD; grad_f[y_index(i - 1, N_ + 1, j)] += -1. * FD; grad_f[y_index(i + 1, N_ + 1, j)] += -1. * FD; grad_f[y_index(i, N_ + 1, j - 1)] += -1. * FD; grad_f[y_index(i, N_ + 1, j + 1)] += -1. * FD; } } } return true; } bool MittelmannBndryCntrlDiriBase3Dsin::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index m, Number* g ) { // return the value of the constraints: g(x) // compute the discretized PDE for each interior grid point Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { Number val; // Start with the discretized Laplacian operator val = 6. * x[y_index(i, j, k)] - x[y_index(i - 1, j, k)] - x[y_index(i + 1, j, k)] - x[y_index(i, j - 1, k)] - x[y_index(i, j + 1, k)] - x[y_index(i, j, k - 1)] - x[y_index(i, j, k + 1)]; g[ig] = val; ig++; } } } DBG_ASSERT(ig == m); (void) m; return true; } bool MittelmannBndryCntrlDiriBase3Dsin::eval_jac_g( Index /*n*/, const Number* /*x*/, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints Index ijac = 0; Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { // y(i,j,k) iRow[ijac] = ig; jCol[ijac] = y_index(i, j, k); ijac++; // y(i-1,j,k) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j, k); ijac++; // y(i+1,j,k) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j, k); ijac++; // y(i,j-1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1, k); ijac++; // y(i,j+1,k) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1, k); ijac++; // y(i,j,k-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j, k - 1); ijac++; // y(i,j,k+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j, k + 1); ijac++; ig++; } } } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { // y(i,j,k) values[ijac] = 6.; ijac++; // y(i-1,j,k) values[ijac] = -1.; ijac++; // y(i+1,j,k) values[ijac] = -1.; ijac++; // y(1,j-1,k) values[ijac] = -1.; ijac++; // y(1,j+1,k) values[ijac] = -1.; ijac++; // y(1,j,k-1) values[ijac] = -1.; ijac++; // y(1,j,k+1) values[ijac] = -1.; ijac++; } } } DBG_ASSERT(ijac == nele_jac); } return true; } inline static void hessstruct( Index* iRow, Index* jCol, Index ij, Index imj, Index ipj, Index ijm, Index ijp, Index& ihes ) { //printf("ihes = %3d ij = %3d imj = %3d ipj = %3d ijm = %3d ijp = %3d\n",ihes,ij,imj,ipj,ijm,ijp); iRow[ihes] = ij; jCol[ihes] = ij; ihes++; Index firstidx = ij; iRow[ihes] = firstidx; jCol[ihes] = imj; ihes++; iRow[ihes] = firstidx; jCol[ihes] = ipj; ihes++; iRow[ihes] = firstidx; jCol[ihes] = ijm; ihes++; iRow[ihes] = firstidx; jCol[ihes] = ijp; ihes++; iRow[ihes] = imj; jCol[ihes] = imj; ihes++; iRow[ihes] = ipj; jCol[ihes] = ipj; ihes++; iRow[ihes] = ijm; jCol[ihes] = ijm; ihes++; iRow[ihes] = ijp; jCol[ihes] = ijp; ihes++; firstidx = imj; //iRow[ihes] = firstidx; //jCol[ihes] = imj; //ihes++; iRow[ihes] = firstidx; jCol[ihes] = ipj; ihes++; iRow[ihes] = firstidx; jCol[ihes] = ijm; ihes++; iRow[ihes] = firstidx; jCol[ihes] = ijp; ihes++; firstidx = ipj; iRow[ihes] = firstidx; jCol[ihes] = imj; ihes++; //iRow[ihes] = firstidx; //jCol[ihes] = ipj; //ihes++; iRow[ihes] = firstidx; jCol[ihes] = ijm; ihes++; iRow[ihes] = firstidx; jCol[ihes] = ijp; ihes++; firstidx = ijm; iRow[ihes] = firstidx; jCol[ihes] = imj; ihes++; iRow[ihes] = firstidx; jCol[ihes] = ipj; ihes++; //iRow[ihes] = firstidx; //jCol[ihes] = ijm; //ihes++; iRow[ihes] = firstidx; jCol[ihes] = ijp; ihes++; firstidx = ijp; iRow[ihes] = firstidx; jCol[ihes] = imj; ihes++; iRow[ihes] = firstidx; jCol[ihes] = ipj; ihes++; iRow[ihes] = firstidx; jCol[ihes] = ijm; ihes++; //iRow[ihes] = firstidx; //jCol[ihes] = ijp; //ihes++; } inline static void hessvals( const Number* x, Number* values, Index ij, Index imj, Index ipj, Index ijm, Index ijp, Index& ihes, Number hh_, Number fact ) { const Number D = (4 * x[ij] - x[imj] - x[ipj] - x[ijm] - x[ijp]) / hh_; const Number val = fact * (1. + 0.5 * std::sin(D) - 2. * std::sin(D) * std::sin(D)); values[ihes] = 16. * val; ihes++; for( Index i = 0; i < 4; i++ ) { values[ihes] = -4. * val; ihes++; } for( Index i = 0; i < 4; i++ ) { values[ihes] = val; ihes++; } for( Index i = 0; i < 12; i++ ) { values[ihes] = .5 * val; ihes++; } } bool MittelmannBndryCntrlDiriBase3Dsin::eval_h( Index /*n*/, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* /*lambda*/, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { iRow[ihes] = y_index(i, j, k); jCol[ihes] = y_index(i, j, k); ihes++; } } } if( alpha_ > 0. ) { // Now the diagonal entries for u at the boundary for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { hessstruct(iRow, jCol, y_index(i, j, 0), y_index(i - 1, j, 0), y_index(i + 1, j, 0), y_index(i, j - 1, 0), y_index(i, j + 1, 0), ihes); hessstruct(iRow, jCol, y_index(i, j, N_ + 1), y_index(i - 1, j, N_ + 1), y_index(i + 1, j, N_ + 1), y_index(i, j - 1, N_ + 1), y_index(i, j + 1, N_ + 1), ihes); hessstruct(iRow, jCol, y_index(0, i, j), y_index(0, i - 1, j), y_index(0, i + 1, j), y_index(0, i, j - 1), y_index(0, i, j + 1), ihes); hessstruct(iRow, jCol, y_index(N_ + 1, i, j), y_index(N_ + 1, i - 1, j), y_index(N_ + 1, i + 1, j), y_index(N_ + 1, i, j - 1), y_index(N_ + 1, i, j + 1), ihes); hessstruct(iRow, jCol, y_index(i, 0, j), y_index(i - 1, 0, j), y_index(i + 1, 0, j), y_index(i, 0, j - 1), y_index(i, 0, j + 1), ihes); hessstruct(iRow, jCol, y_index(i, N_ + 1, j), y_index(i - 1, N_ + 1, j), y_index(i + 1, N_ + 1, j), y_index(i, N_ + 1, j - 1), y_index(i, N_ + 1, j + 1), ihes); } } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // return the values Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { for( Index k = 1; k <= N_; k++ ) { // Contribution from the objective function values[ihes] = obj_factor * hh_; ihes++; } } } // Now the diagonal entries for u(i,j) if( alpha_ > 0. ) { // Now the diagonal entries for u at the boundary for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { hessvals(x, values, y_index(i, j, 0), y_index(i - 1, j, 0), y_index(i + 1, j, 0), y_index(i, j - 1, 0), y_index(i, j + 1, 0), ihes, hh_, obj_factor * alpha_ * h_ / (hh_ * hh_)); hessvals(x, values, y_index(i, j, N_ + 1), y_index(i - 1, j, N_ + 1), y_index(i + 1, j, N_ + 1), y_index(i, j - 1, N_ + 1), y_index(i, j + 1, N_ + 1), ihes, hh_, obj_factor * alpha_ * h_ / (hh_ * hh_)); hessvals(x, values, y_index(0, i, j), y_index(0, i - 1, j), y_index(0, i + 1, j), y_index(0, i, j - 1), y_index(0, i, j + 1), ihes, hh_, obj_factor * alpha_ * h_ / (hh_ * hh_)); hessvals(x, values, y_index(N_ + 1, i, j), y_index(N_ + 1, i - 1, j), y_index(N_ + 1, i + 1, j), y_index(N_ + 1, i, j - 1), y_index(N_ + 1, i, j + 1), ihes, hh_, obj_factor * alpha_ * h_ / (hh_ * hh_)); hessvals(x, values, y_index(i, 0, j), y_index(i - 1, 0, j), y_index(i + 1, 0, j), y_index(i, 0, j - 1), y_index(i, 0, j + 1), ihes, hh_, obj_factor * alpha_ * h_ / (hh_ * hh_)); hessvals(x, values, y_index(i, N_ + 1, j), y_index(i - 1, N_ + 1, j), y_index(i + 1, N_ + 1, j), y_index(i, N_ + 1, j - 1), y_index(i, N_ + 1, j + 1), ihes, hh_, obj_factor * alpha_ * h_ / (hh_ * hh_)); } } } } return true; } void MittelmannBndryCntrlDiriBase3Dsin::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { /* FILE* fp = fopen("solution.txt", "w+"); for (Index i=0; i<=N_+1; i++) { for (Index j=0; j<=N_+1; j++) { for (Index k=0; k<=N_+1; k++) { fprintf(fp, "y[%6d,%6d,%6d] = %15.8e\n", i, j, k, x[y_index(i,j,k)]); } } } fclose(fp); */ } coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannBndryCntrlDiri3Dsin.hpp000066400000000000000000000204251473776672200277250ustar00rootroot00000000000000// Copyright (C) 2005, 2007 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // Olaf Schenk (Univ. of Basel) 2007-08-01 // modified MittelmannBndryCntrlDiri.hpp for 3-dim problem #ifndef __MITTELMANNBNDRYCNTRLDIRI3DSIN_HPP__ #define __MITTELMANNBNDRYCNTRLDIRI3DSIN_HPP__ #include "RegisteredTNLP.hpp" #include #include using namespace Ipopt; /** Base class for boundary control problems with Dirichlet boundary * conditions, as formulated by Hans Mittelmann as Examples 1-4 in * "Optimization Techniques for Solving Elliptic Control Problems * with Control and State Constraints. Part 2: Boundary Control" * * Here, the control variables are identical to the values of y on * the boundary, and therefore we don't need any explicit * optimization variables for u. */ class MittelmannBndryCntrlDiriBase3Dsin: public RegisteredTNLP { public: /** Constructor. */ MittelmannBndryCntrlDiriBase3Dsin(); /** Default destructor */ virtual ~MittelmannBndryCntrlDiriBase3Dsin(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** Method for returning scaling parameters */ virtual bool get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index n, Number* x_scaling, bool& use_g_scaling, Index m, Number* g_scaling ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} protected: /** Method for setting the internal parameters that define the problem. * * It must be called by the child class in its * implementation of InitializeParameters. */ void SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number d_const ); /**@name Functions that defines a particular instance. */ //@{ /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2, Number x3 ) const = 0; //@} private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MittelmannBndryCntrlDiriBase3Dsin( const MittelmannBndryCntrlDiriBase3Dsin& ); MittelmannBndryCntrlDiriBase3Dsin& operator=( const MittelmannBndryCntrlDiriBase3Dsin& ); //@} /**@name Problem specification */ //@{ /** Number of mesh points in one dimension (excluding boundary) */ Index N_; /** Step size */ Number h_; /** h_ squaredd */ Number hh_; /** overall lower bound on y */ Number lb_y_; /** overall upper bound on y */ Number ub_y_; /** overall lower bound on u */ Number lb_u_; /** overall upper bound on u */ Number ub_u_; /** Constant value of d appearing in elliptical equation */ Number d_const_; /** Weighting parameter for the control target deviation functional * in the objective */ Number alpha_; /** Array for the target profile for y */ Number* y_d_; //@} /**@name Auxiliary methods */ //@{ /** Translation of mesh point indices to NLP variable indices for y(x_ijk) */ inline Index y_index( Index i, Index j, Index k ) const { return k + (N_ + 2) * j + (N_ + 2) * (N_ + 2) * i; } /** Translation of interior mesh point indices to the corresponding * PDE constraint number */ inline Index pde_index( Index i, Index j, Index k ) const { return (k - 1) + N_ * (j - 1) + N_ * N_ * (i - 1); } /** Compute the grid coordinate for given index in x1 direction */ inline Number x1_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x2 direction */ inline Number x2_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x3 direction */ inline Number x3_grid( Index i ) const { return h_ * (Number) i; } //@} }; /** Implementation of Example 1 */ class MittelmannBndryCntrlDiri3Dsin: public MittelmannBndryCntrlDiriBase3Dsin { public: MittelmannBndryCntrlDiri3Dsin() { } virtual ~MittelmannBndryCntrlDiri3Dsin() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.1; Number lb_y = -1e20; Number ub_y = 3.5; Number lb_u = 0.; Number ub_u = 10.; Number d_const = -20.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, d_const); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2, Number x3 ) const { return 3. + 5. * (x1 * (x1 - 1.) * x2 * (x2 - 1.) * x3 * (x3 - 1.)); } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlDiri3Dsin( const MittelmannBndryCntrlDiri3Dsin& ); MittelmannBndryCntrlDiri3Dsin& operator=( const MittelmannBndryCntrlDiri3Dsin& ); //@} }; #endif coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannBndryCntrlNeum.cpp000066400000000000000000000510441473776672200270350ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // based on MyNLP.cpp #include "MittelmannBndryCntrlNeum.hpp" #include using namespace Ipopt; /* Constructor. */ MittelmannBndryCntrlNeumBase::MittelmannBndryCntrlNeumBase() : y_d_(NULL) { } MittelmannBndryCntrlNeumBase::~MittelmannBndryCntrlNeumBase() { delete[] y_d_; } void MittelmannBndryCntrlNeumBase::SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number u_init ) { N_ = N; h_ = 1. / (N + 1); hh_ = h_ * h_; alpha_ = alpha; lb_y_ = lb_y; ub_y_ = ub_y; lb_u_ = lb_u; ub_u_ = ub_u; u_init_ = u_init; // Initialize the target profile variables delete[] y_d_; y_d_ = new Number[(N_ + 2) * (N_ + 2)]; for( Index j = 0; j <= N_ + 1; j++ ) { for( Index i = 0; i <= N_ + 1; i++ ) { y_d_[y_index(i, j)] = y_d_cont(x1_grid(i), x2_grid(j)); } } } bool MittelmannBndryCntrlNeumBase::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // We for each of the N_+2 times N_+2 mesh points we have the value // of the functions y, and for each 4*N_ boundary mesh points we // have values for u n = (N_ + 2) * (N_ + 2) + 4 * N_; // For each of the N_ times N_ interior mesh points we have the // discretized PDE, and we have one constriant for each boundary // point (except for the corners) m = N_ * N_ + 4 * N_; // y(i,j), y(i-1,j), y(i+1,j), y(i,j-1), y(i,j+1) for each of the // N_*N_ discretized PDEs, and for the Neumann boundary conditions // we have entries for two y's and one u nnz_jac_g = 5 * N_ * N_ + 3 * 4 * N_; // diagonal entry for each dydy, dudu, dydu in the interior nnz_h_lag = N_ * N_; if( !b_cont_dydy_alwayszero() ) { nnz_h_lag += 4 * N_; } if( alpha_ != 0. ) { nnz_h_lag += 4 * N_; } // We use the C indexing style for row/col entries (corresponding to // the C notation, starting at 0) index_style = C_STYLE; return true; } bool MittelmannBndryCntrlNeumBase::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // Set overall bounds on the y variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iy = y_index(i, j); x_l[iy] = lb_y_; x_u[iy] = ub_y_; } } // Set overall bounds on the u variables for( Index j = 1; j <= N_; j++ ) { Index iu = u0j_index(j); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } for( Index j = 1; j <= N_; j++ ) { Index iu = u1j_index(j); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui0_index(i); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui1_index(i); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } // There is no information for the y's at the corner points, so just // take those variables out x_l[y_index(0, 0)] = x_u[y_index(0, 0)] = 0.; x_l[y_index(0, N_ + 1)] = x_u[y_index(0, N_ + 1)] = 0.; x_l[y_index(N_ + 1, 0)] = x_u[y_index(N_ + 1, 0)] = 0.; x_l[y_index(N_ + 1, N_ + 1)] = x_u[y_index(N_ + 1, N_ + 1)] = 0.; // all discretized PDE constraints have right hand side zero for( Index i = 0; i < m; i++ ) { g_l[i] = 0.; g_u[i] = 0.; } return true; } bool MittelmannBndryCntrlNeumBase::get_starting_point( Index /*n*/, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the others if // you wish. assert(init_x == true); (void) init_x; assert(init_z == false); (void) init_z; assert(init_lambda == false); (void) init_lambda; // set all y's to the perfect match with y_d for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { x[y_index(i, j)] = y_d_[y_index(i, j)]; //x[y_index(i,j)] += h_*x1_grid(i) + 2*h_*x2_grid(j); } } // Set the initial (constant) value for the u's for( Index j = 1; j <= N_; j++ ) { x[u0j_index(j)] = u_init_; x[u1j_index(j)] = u_init_; } for( Index i = 1; i <= N_; i++ ) { x[ui0_index(i)] = u_init_; x[ui1_index(i)] = u_init_; } return true; } bool MittelmannBndryCntrlNeumBase::get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index /*n*/, Number* /*x_scaling*/, bool& use_g_scaling, Index /*m*/, Number* /*g_scaling*/ ) { obj_scaling = 1. / hh_; use_x_scaling = false; use_g_scaling = false; return true; } bool MittelmannBndryCntrlNeumBase::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // return the value of the objective function obj_value = 0.; // First the integration of y-td over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); Number tmp = x[iy] - y_d_[iy]; obj_value += tmp * tmp; } } obj_value *= hh_ / 2.; // Now the integration of u over the boundary if( alpha_ != 0. ) { Number usum = 0.; for( Index j = 1; j <= N_; j++ ) { Index iu = u0j_index(j); usum += x[iu] * x[iu]; } for( Index j = 1; j <= N_; j++ ) { Index iu = u1j_index(j); usum += x[iu] * x[iu]; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui0_index(i); usum += x[iu] * x[iu]; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui1_index(i); usum += x[iu] * x[iu]; } obj_value += alpha_ * h_ / 2. * usum; } return true; } bool MittelmannBndryCntrlNeumBase::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) // now let's take care of the nonzero values coming from the // integrant over the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); grad_f[iy] = hh_ * (x[iy] - y_d_[iy]); } } // The values for variables on the boundary if( alpha_ != 0. ) { for( Index j = 1; j <= N_; j++ ) { Index iu = u0j_index(j); grad_f[iu] = alpha_ * h_ * x[iu]; } for( Index j = 1; j <= N_; j++ ) { Index iu = u1j_index(j); grad_f[iu] = alpha_ * h_ * x[iu]; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui0_index(i); grad_f[iu] = alpha_ * h_ * x[iu]; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui1_index(i); grad_f[iu] = alpha_ * h_ * x[iu]; } } else { for( Index j = 1; j <= N_; j++ ) { Index iu = u0j_index(j); grad_f[iu] = 0.; } for( Index j = 1; j <= N_; j++ ) { Index iu = u1j_index(j); grad_f[iu] = 0.; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui0_index(i); grad_f[iu] = 0.; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui1_index(i); grad_f[iu] = 0.; } } // The values are zero for y variables on the boundary for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, 0)] = 0.; } for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, N_ + 1)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(0, j)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(N_ + 1, j)] = 0.; } return true; } bool MittelmannBndryCntrlNeumBase::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index m, Number* g ) { // return the value of the constraints: g(x) // compute the discretized PDE for each interior grid point Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Number val; // Start with the discretized Laplacian operator val = 4. * x[y_index(i, j)] - x[y_index(i - 1, j)] - x[y_index(i + 1, j)] - x[y_index(i, j - 1)] - x[y_index(i, j + 1)]; // Add the forcing term (including the step size here) val += hh_ * d_cont(x1_grid(i), x2_grid(j), x[y_index(i, j)]); g[ig] = val; ig++; } } // set up the Neumann boundary conditions for( Index j = 1; j <= N_; j++ ) { g[ig] = x[y_index(0, j)] - x[y_index(1, j)] - h_ * b_cont(x1_grid(0), x2_grid(j), x[y_index(0, j)], x[u0j_index(j)]); ig++; } for( Index j = 1; j <= N_; j++ ) { g[ig] = x[y_index(N_ + 1, j)] - x[y_index(N_, j)] - h_ * b_cont(x1_grid(N_ + 1), x2_grid(j), x[y_index(N_ + 1, j)], x[u1j_index(j)]); ig++; } for( Index i = 1; i <= N_; i++ ) { g[ig] = x[y_index(i, 0)] - x[y_index(i, 1)] - h_ * b_cont(x1_grid(i), x2_grid(0), x[y_index(i, 0)], x[ui0_index(i)]); ig++; } for( Index i = 1; i <= N_; i++ ) { g[ig] = x[y_index(i, N_ + 1)] - x[y_index(i, N_)] - h_ * b_cont(x1_grid(i), x2_grid(N_ + 1), x[y_index(i, N_ + 1)], x[ui1_index(i)]); ig++; } DBG_ASSERT(ig == m); (void) m; return true; } bool MittelmannBndryCntrlNeumBase::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints // distretized PDEs Index ijac = 0; Index ig = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // y(i,j) iRow[ijac] = ig; jCol[ijac] = y_index(i, j); ijac++; // y(i-1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j); ijac++; // y(i+1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j); ijac++; // y(i,j-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1); ijac++; // y(i,j+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1); ijac++; ig++; } } // set up the Neumann boundary conditions for( Index j = 1; j <= N_; j++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(0, j); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(1, j); ijac++; iRow[ijac] = ig; jCol[ijac] = u0j_index(j); ijac++; ig++; } for( Index j = 1; j <= N_; j++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(N_, j); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(N_ + 1, j); ijac++; iRow[ijac] = ig; jCol[ijac] = u1j_index(j); ijac++; ig++; } for( Index i = 1; i <= N_; i++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(i, 0); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(i, 1); ijac++; iRow[ijac] = ig; jCol[ijac] = ui0_index(i); ijac++; ig++; } for( Index i = 1; i <= N_; i++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(i, N_); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(i, N_ + 1); ijac++; iRow[ijac] = ig; jCol[ijac] = ui1_index(i); ijac++; ig++; } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // y(i,j) values[ijac] = 4. + hh_ * d_cont_dy(x1_grid(i), x2_grid(j), x[y_index(i, j)]); ijac++; // y(i-1,j) values[ijac] = -1.; ijac++; // y(i+1,j) values[ijac] = -1.; ijac++; // y(1,j-1) values[ijac] = -1.; ijac++; // y(1,j+1) values[ijac] = -1.; ijac++; } } for( Index j = 1; j <= N_; j++ ) { values[ijac] = 1. - h_ * b_cont_dy(x1_grid(0), x2_grid(j), x[y_index(0, j)], x[u0j_index(j)]); ijac++; values[ijac] = -1.; ijac++; values[ijac] = -h_ * b_cont_du(x1_grid(0), x2_grid(j), x[y_index(0, j)], x[u0j_index(j)]); ijac++; } for( Index j = 1; j <= N_; j++ ) { values[ijac] = -1.; ijac++; values[ijac] = 1. - h_ * b_cont_dy(x1_grid(N_ + 1), x2_grid(j), x[y_index(N_ + 1, j)], x[u1j_index(j)]); ijac++; values[ijac] = -h_ * b_cont_du(x1_grid(N_ + 1), x2_grid(j), x[y_index(N_ + 1, j)], x[u1j_index(j)]); ijac++; } for( Index i = 1; i <= N_; i++ ) { values[ijac] = 1. - h_ * b_cont_dy(x1_grid(i), x2_grid(0), x[y_index(i, 0)], x[ui0_index(i)]); ijac++; values[ijac] = -1.; ijac++; values[ijac] = -h_ * b_cont_du(x1_grid(i), x2_grid(0), x[y_index(i, 0)], x[ui0_index(i)]); ijac++; } for( Index i = 1; i <= N_; i++ ) { values[ijac] = -1.; ijac++; values[ijac] = 1. - h_ * b_cont_dy(x1_grid(i), x2_grid(N_ + 1), x[y_index(i, N_ + 1)], x[ui1_index(i)]); ijac++; values[ijac] = -h_ * b_cont_du(x1_grid(i), x2_grid(N_ + 1), x[y_index(i, N_ + 1)], x[ui1_index(i)]); ijac++; } DBG_ASSERT(ijac == nele_jac); } return true; } bool MittelmannBndryCntrlNeumBase::eval_h( Index /*n*/, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. Index ihes = 0; // First the diagonal entries for dydy in the interior for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = y_index(i, j); jCol[ihes] = y_index(i, j); ihes++; } } // Now, if necessary, the dydy entries on the boundary if( !b_cont_dydy_alwayszero() ) { // Now the diagonal entries for dudu for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = y_index(0, j); jCol[ihes] = y_index(0, j); ihes++; } for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = y_index(N_ + 1, j); jCol[ihes] = y_index(N_ + 1, j); ihes++; } for( Index i = 1; i <= N_; i++ ) { iRow[ihes] = y_index(i, 0); jCol[ihes] = y_index(i, 0); ihes++; } for( Index i = 1; i <= N_; i++ ) { iRow[ihes] = y_index(i, N_ + 1); jCol[ihes] = y_index(i, N_ + 1); ihes++; } } if( alpha_ != 0. ) { // Now the diagonal entries for dudu for( Index j = 1; j <= N_; j++ ) { Index iu = u0j_index(j); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } for( Index j = 1; j <= N_; j++ ) { Index iu = u1j_index(j); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui0_index(i); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } for( Index i = 1; i <= N_; i++ ) { Index iu = ui1_index(i); iRow[ihes] = iu; jCol[ihes] = iu; ihes++; } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // return the values Index ihes = 0; Index ihes_store; // First the diagonal entries for dydy ihes_store = ihes; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // Contribution from the objective function values[ihes] = obj_factor * hh_; ihes++; } } // If we have something from the discretized PDEs, add this now if( !d_cont_dydy_alwayszero() ) { Index ig = 0; ihes = ihes_store; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] += lambda[ig] * hh_ * d_cont_dydy(x1_grid(i), x2_grid(j), x[y_index(i, j)]); ihes++; ig++; } } } // Now include the elements for dydy on the boudary if there are any if( !b_cont_dydy_alwayszero() ) { Index ig = N_ * N_; // Now the diagonal entries for dudu for( Index j = 1; j <= N_; j++ ) { values[ihes] = -lambda[ig] * h_ * b_cont_dydy(x1_grid(0), x2_grid(j), x[y_index(0, j)], x[u0j_index(j)]); ig++; ihes++; } for( Index j = 1; j <= N_; j++ ) { values[ihes] = -lambda[ig] * h_ * b_cont_dydy(x1_grid(N_ + 1), x2_grid(j), x[y_index(N_ + 1, j)], x[u1j_index(j)]); ig++; ihes++; } for( Index i = 1; i <= N_; i++ ) { values[ihes] = -lambda[ig] * h_ * b_cont_dydy(x1_grid(i), x2_grid(0), x[y_index(i, 0)], x[ui0_index(i)]); ig++; ihes++; } for( Index i = 1; i <= N_; i++ ) { values[ihes] = -lambda[ig] * h_ * b_cont_dydy(x1_grid(i), x2_grid(N_ + 1), x[y_index(i, N_ + 1)], x[ui1_index(i)]); ig++; ihes++; } } // Finally, we take care of the dudu entries if( alpha_ != 0. ) { // Now the diagonal entries for u at the boundary for( Index i = 1; i <= N_; i++ ) { values[ihes] = obj_factor * h_ * alpha_; ihes++; } for( Index i = 1; i <= N_; i++ ) { values[ihes] = obj_factor * h_ * alpha_; ihes++; } for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * h_ * alpha_; ihes++; } for( Index i = 1; i <= N_; i++ ) { values[ihes] = obj_factor * h_ * alpha_; ihes++; } } } return true; } void MittelmannBndryCntrlNeumBase::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { /* FILE* fp = fopen("solution.txt", "w+"); for (Index i=0; i<=N_+1; i++) { for (Index j=0; j<=N_+1; j++) { fprintf(fp, "y[%6d,%6d] = %15.8e\n", i, j, x[y_index(i,j)]); } } for (Index j=1; j<=N_; j++) { fprintf(fp, "u[%6d,%6d] = %15.8e\n", 0, j, x[u0j_index(j)]); } for (Index j=1; j<=N_; j++) { fprintf(fp, "u[%6d,%6d] = %15.8e\n", N_+1, j, x[u1j_index(j)]); } for (Index i=1; i<=N_; i++) { fprintf(fp, "u[%6d,%6d] = %15.8e\n", i, 0, x[ui0_index(i)]); } for (Index i=1; i<=N_; i++) { fprintf(fp, "u[%6d,%6d] = %15.8e\n", i, N_+1, x[ui1_index(i)]); } fclose(fp); */ } coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannBndryCntrlNeum.hpp000066400000000000000000000474431473776672200270520ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // based on MyNLP.hpp #ifndef __MITTELMANNBNDRYCNTRLNEUM_HPP__ #define __MITTELMANNBNDRYCNTRLNEUM_HPP__ #include "IpTNLP.hpp" #include "RegisteredTNLP.hpp" #include #include using namespace Ipopt; /** Base class for boundary control problems with Neumann boundary * conditions, as formulated by Hans Mittelmann as Examples 5-8 in * "Optimization Techniques for Solving Elliptic Control Problems * with Control and State Constraints. Part 1: Boundary Control" */ class MittelmannBndryCntrlNeumBase: public RegisteredTNLP { public: /** Constructor. N is the number of mesh points in one dimension * (excluding boundary). */ MittelmannBndryCntrlNeumBase(); /** Default destructor */ virtual ~MittelmannBndryCntrlNeumBase(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** Method for returning scaling parameters */ virtual bool get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index n, Number* x_scaling, bool& use_g_scaling, Index m, Number* g_scaling ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} protected: /** Method for setting the internal parameters that define the problem. * * It must be called by the child class in its * implementation of InitializeParameters */ void SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number u_init); /**@name Functions that defines a particular instance. */ //@{ /** Target profile function for y (and initial guess function) */ virtual Number y_d_cont( Number x1, Number x2 ) const = 0; /** Forcing function for the elliptic equation */ virtual Number d_cont( Number x1, Number x2, Number y ) const = 0; /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number x1, Number x2, Number y ) const = 0; /** Second partial derivative of forcing function w.r.t. y,y */ virtual Number d_cont_dydy( Number x1, Number x2, Number y ) const = 0; /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const = 0; /** Function in Neuman boundary condition */ virtual Number b_cont( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of b_cont w.r.t. y */ virtual Number b_cont_dy( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of b_cont w.r.t. u */ virtual Number b_cont_du( Number x1, Number x2, Number y, Number u ) const = 0; /** Second partial derivative of b_cont w.r.t. y,y */ virtual Number b_cont_dydy( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of b_cont * w.r.t. y,y is always zero. */ virtual bool b_cont_dydy_alwayszero() const = 0; //@} private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MittelmannBndryCntrlNeumBase( const MittelmannBndryCntrlNeumBase& ); MittelmannBndryCntrlNeumBase& operator=( const MittelmannBndryCntrlNeumBase& ); //@} /**@name Problem specification */ //@{ /** Number of mesh points in one dimension (excluding boundary) */ Index N_; /** Step size */ Number h_; /** h_ squaredd */ Number hh_; /** overall lower bound on y */ Number lb_y_; /** overall upper bound on y */ Number ub_y_; /** overall lower bound on u */ Number lb_u_; /** overall upper bound on u */ Number ub_u_; /** Initial value for the controls u */ Number u_init_; /** Weighting parameter for the control target deviation functional * in the objective */ Number alpha_; /** Array for the target profile for y */ Number* y_d_; //@} /**@name Auxiliary methods */ //@{ /** Translation of mesh point indices to NLP variable indices for y(x_ij) */ inline Index y_index( Index i, Index j ) const { return j + (N_ + 2) * i; } /** Translation of mesh point indices to NLP variable indices for * u(x_ij) on {0} x (0,1) boundary */ inline Index u0j_index( Index j ) const { return (N_ + 2) * (N_ + 2) + j - 1; } /** Translation of mesh point indices to NLP variable indices for * u(x_ij) on {1} x (0,1) boundary */ inline Index u1j_index( Index j ) const { return (N_ + 2) * (N_ + 2) + N_ + j - 1; } /** Translation of mesh point indices to NLP variable indices for * u(x_ij) on (0,1) x {0} boundary */ inline Index ui0_index( Index j ) const { return (N_ + 2) * (N_ + 2) + 2 * N_ + j - 1; } /** Translation of mesh point indices to NLP variable indices for * u(x_ij) on (0,1) x {1} boundary */ inline Index ui1_index( Index j ) const { return (N_ + 2) * (N_ + 2) + 3 * N_ + j - 1; } /** Compute the grid coordinate for given index in x1 direction */ inline Number x1_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x2 direction */ inline Number x2_grid( Index j ) const { return h_ * (Number) j; } //@} }; /** Implementation of Example 5 */ class MittelmannBndryCntrlNeum1: public MittelmannBndryCntrlNeumBase { public: MittelmannBndryCntrlNeum1() { } virtual ~MittelmannBndryCntrlNeum1() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.01; Number lb_y = -1e20; Number ub_y = 2.071; Number lb_u = 3.7; Number ub_u = 4.5; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 2. - 2. * (x1 * (x1 - 1.) + x2 * (x2 - 1.)); } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number /*y*/ ) const { return 0.; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number /*y*/ ) const { return 0.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return true; } /** Function in Neuman boundary condition */ virtual Number b_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return u - y * y; } /** First partial derivative of b_cont w.r.t. y */ virtual Number b_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -2. * y; } /** First partial derivative of b_cont w.r.t. u */ virtual Number b_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** Second partial derivative of b_cont w.r.t. y,y */ virtual Number b_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -2.; } /** returns true if second partial derivative of b_cont * w.r.t. y,y is always zero. */ virtual bool b_cont_dydy_alwayszero() const { return false; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlNeum1( const MittelmannBndryCntrlNeum1& ); MittelmannBndryCntrlNeum1& operator=( const MittelmannBndryCntrlNeum1& ); //@} }; /** Implementation of Example 6 */ class MittelmannBndryCntrlNeum2: public MittelmannBndryCntrlNeumBase { public: MittelmannBndryCntrlNeum2() { } virtual ~MittelmannBndryCntrlNeum2() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.; Number lb_y = -1e20; Number ub_y = 2.835; Number lb_u = 6.; Number ub_u = 9.; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 2. - 2. * (x1 * (x1 - 1.) + x2 * (x2 - 1.)); } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number /*y*/ ) const { return 0.; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number /*y*/ ) const { return 0.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return true; } /** Function in Neuman boundary condition */ virtual Number b_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return u - y * y; } /** First partial derivative of b_cont w.r.t. y */ virtual Number b_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -2. * y; } /** First partial derivative of b_cont w.r.t. u */ virtual Number b_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** Second partial derivative of b_cont w.r.t. y,y */ virtual Number b_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -2.; } /** returns true if second partial derivative of b_cont * w.r.t. y,y is always zero. */ virtual bool b_cont_dydy_alwayszero() const { return false; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlNeum2( const MittelmannBndryCntrlNeum2& ); MittelmannBndryCntrlNeum2& operator=( const MittelmannBndryCntrlNeum2& ); //@} }; /** Implementation of Example 7 */ class MittelmannBndryCntrlNeum3: public MittelmannBndryCntrlNeumBase { public: MittelmannBndryCntrlNeum3() { } virtual ~MittelmannBndryCntrlNeum3() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.01; Number lb_y = -1e20; Number ub_y = 2.7; Number lb_u = 1.8; Number ub_u = 2.5; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 2. - 2. * (x1 * (x1 - 1.) + x2 * (x2 - 1.)); } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y ) const { return y * y * y - y; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y ) const { return 3. * y * y - 1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y ) const { return 6. * y; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return false; } /** Function in Neuman boundary condition */ virtual Number b_cont( Number /*x1*/, Number /*x2*/, Number /*y*/, Number u ) const { return u; } /** First partial derivative of b_cont w.r.t. y */ virtual Number b_cont_dy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** First partial derivative of b_cont w.r.t. u */ virtual Number b_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** Second partial derivative of b_cont w.r.t. y,y */ virtual Number b_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of b_cont * w.r.t. y,y is always zero. */ virtual bool b_cont_dydy_alwayszero() const { return true; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlNeum3( const MittelmannBndryCntrlNeum3& ); MittelmannBndryCntrlNeum3& operator=( const MittelmannBndryCntrlNeum3& ); //@} }; /** Implementation of Example 8 */ class MittelmannBndryCntrlNeum4: public MittelmannBndryCntrlNeumBase { public: MittelmannBndryCntrlNeum4() { } virtual ~MittelmannBndryCntrlNeum4() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.; Number lb_y = -1e20; Number ub_y = 2.7; Number lb_u = 1.8; Number ub_u = 2.5; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 2. - 2. * (x1 * (x1 - 1.) + x2 * (x2 - 1.)); } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y ) const { return y * y * y - y; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y ) const { return 3. * y * y - 1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y ) const { return 6. * y; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return false; } /** Function in Neuman boundary condition */ virtual Number b_cont( Number /*x1*/, Number /*x2*/, Number /*y*/, Number u ) const { return u; } /** First partial derivative of b_cont w.r.t. y */ virtual Number b_cont_dy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** First partial derivative of b_cont w.r.t. u */ virtual Number b_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** Second partial derivative of b_cont w.r.t. y,y */ virtual Number b_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of b_cont * w.r.t. y,y is always zero. */ virtual bool b_cont_dydy_alwayszero() const { return true; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannBndryCntrlNeum4( const MittelmannBndryCntrlNeum4& ); MittelmannBndryCntrlNeum4& operator=( const MittelmannBndryCntrlNeum4& ); //@} }; #endif coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannDistCntrlDiri.cpp000066400000000000000000000307601473776672200266470ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2004-11-05 #include "MittelmannDistCntrlDiri.hpp" #include using namespace Ipopt; /* Constructor. */ MittelmannDistCntrlDiriBase::MittelmannDistCntrlDiriBase() : y_d_(NULL) { } MittelmannDistCntrlDiriBase::~MittelmannDistCntrlDiriBase() { delete[] y_d_; } void MittelmannDistCntrlDiriBase::SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number u_init ) { N_ = N; h_ = 1. / (N + 1); hh_ = h_ * h_; lb_y_ = lb_y; ub_y_ = ub_y; lb_u_ = lb_u; ub_u_ = ub_u; u_init_ = u_init; alpha_ = alpha; // Initialize the target profile variables delete[] y_d_; y_d_ = new Number[(N_ + 2) * (N_ + 2)]; for( Index j = 0; j <= N_ + 1; j++ ) { for( Index i = 0; i <= N_ + 1; i++ ) { y_d_[y_index(i, j)] = y_d_cont(x1_grid(i), x2_grid(j)); } } } bool MittelmannDistCntrlDiriBase::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // We for each of the N_+2 times N_+2 mesh points we have the value // of the functions y, and for each N_ tiems N_ interior mesh points // we have values for u n = (N_ + 2) * (N_ + 2) + N_ * N_; // For each of the N_ times N_ interior mesh points we have the // discretized PDE. m = N_ * N_; // y(i,j), y(i-1,j), y(i+1,j), y(i,j-1), y(i,j+1), u(i,j) for each // of the N_*N_ discretized PDEs nnz_jac_g = 6 * N_ * N_; // diagonal entry for each y(i,j) in the interior nnz_h_lag = N_ * N_; if( alpha_ > 0. ) { // and one entry for u(i,j) in the interior if alpha is not zero nnz_h_lag += N_ * N_; } // We use the C indexing style for row/col entries (corresponding to // the C notation, starting at 0) index_style = C_STYLE; return true; } bool MittelmannDistCntrlDiriBase::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // Set overall bounds on the variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iy = y_index(i, j); x_l[iy] = lb_y_; x_u[iy] = ub_y_; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = u_index(i, j); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } // Define the boundary condition on y as bounds for( Index i = 0; i <= N_ + 1; i++ ) { x_l[y_index(i, 0)] = 0.; x_u[y_index(i, 0)] = 0.; } for( Index i = 0; i <= N_ + 1; i++ ) { x_l[y_index(0, i)] = 0.; x_u[y_index(0, i)] = 0.; } for( Index i = 0; i <= N_ + 1; i++ ) { x_l[y_index(i, N_ + 1)] = 0.; x_u[y_index(i, N_ + 1)] = 0.; } for( Index i = 0; i <= N_ + 1; i++ ) { x_l[y_index(N_ + 1, i)] = 0.; x_u[y_index(N_ + 1, i)] = 0.; } // all discretized PDE constraints have right hand side zero for( Index i = 0; i < m; i++ ) { g_l[i] = 0.; g_u[i] = 0.; } return true; } bool MittelmannDistCntrlDiriBase::get_starting_point( Index /*n*/, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the others if // you wish. assert(init_x == true); (void) init_x; assert(init_z == false); (void) init_z; assert(init_lambda == false); (void) init_lambda; // set all y's to the perfect match with y_d for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { x[y_index(i, j)] = y_d_[y_index(i, j)]; // x[y_index(i,j)] += h_*x1_grid(i) + 2*h_*x2_grid(j); } } // Set the initial (constant) value for the u's for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { x[u_index(i, j)] = u_init_; // x[u_index(i,j)] -= h_*x1_grid(i) + 2*h_*x2_grid(j); } } return true; } bool MittelmannDistCntrlDiriBase::get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index /*n*/, Number* /*x_scaling*/, bool& use_g_scaling, Index /*m*/, Number* /*g_scaling*/ ) { obj_scaling = 1. / hh_; use_x_scaling = false; use_g_scaling = false; return true; } bool MittelmannDistCntrlDiriBase::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // return the value of the objective function obj_value = 0.; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); Number tmp = x[iy] - y_d_[iy]; obj_value += tmp * tmp; } } obj_value *= hh_ / 2.; if( alpha_ > 0. ) { Number usum = 0.; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = u_index(i, j); usum += x[iu] * x[iu]; } } obj_value += alpha_ * hh_ / 2. * usum; } return true; } bool MittelmannDistCntrlDiriBase::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) // The values are zero for variables on the boundary for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, 0)] = 0.; } for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, N_ + 1)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(0, j)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(N_ + 1, j)] = 0.; } // now let's take care of the nonzero values for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); grad_f[iy] = hh_ * (x[iy] - y_d_[iy]); } } if( alpha_ > 0. ) { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = u_index(i, j); grad_f[iu] = alpha_ * hh_ * x[iu]; } } } else { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = u_index(i, j); grad_f[iu] = 0.; } } } return true; } bool MittelmannDistCntrlDiriBase::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Number* g ) { // return the value of the constraints: g(x) // compute the discretized PDE for each interior grid point for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Number val; // Start with the discretized Laplacian operator val = 4. * x[y_index(i, j)] - x[y_index(i - 1, j)] - x[y_index(i + 1, j)] - x[y_index(i, j - 1)] - x[y_index(i, j + 1)]; // Add the forcing term (including the step size here) val += hh_ * d_cont(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); g[pde_index(i, j)] = val; } } return true; } bool MittelmannDistCntrlDiriBase::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index ig = pde_index(i, j); // y(i,j) iRow[ijac] = ig; jCol[ijac] = y_index(i, j); ijac++; // y(i-1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j); ijac++; // y(i+1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j); ijac++; // y(i,j-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1); ijac++; // y(i,j+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1); ijac++; // u(i,j) iRow[ijac] = ig; jCol[ijac] = u_index(i, j); ijac++; } } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // y(i,j) values[ijac] = 4. + hh_ * d_cont_dy(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ijac++; // y(i-1,j) values[ijac] = -1.; ijac++; // y(i+1,j) values[ijac] = -1.; ijac++; // y(1,j-1) values[ijac] = -1.; ijac++; // y(1,j+1) values[ijac] = -1.; ijac++; // y(i,j) values[ijac] = hh_ * d_cont_du(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ijac++; } } DBG_ASSERT(ijac == nele_jac); } return true; } bool MittelmannDistCntrlDiriBase::eval_h( Index /*n*/, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = y_index(i, j); jCol[ihes] = y_index(i, j); ihes++; } } if( alpha_ > 0. ) { // Now the diagonal entries for u(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = u_index(i, j); jCol[ihes] = u_index(i, j); ihes++; } } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // return the values Index ihes = 0; // First the diagonal entries for y(i,j) for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // Contribution from the objective function values[ihes] = obj_factor * hh_; // Contribution from the PDE constraint values[ihes] += lambda[pde_index(i, j)] * hh_ * d_cont_dydy(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } // Now the diagonal entries for u(i,j) if( alpha_ > 0. ) { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // Contribution from the objective function values[ihes] = obj_factor * hh_ * alpha_; ihes++; } } } } return true; } void MittelmannDistCntrlDiriBase::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { /* FILE* fp = fopen("solution.txt", "w+"); for (Index i=0; i<=N_+1; i++) { for (Index j=0; j<=N_+1; j++) { fprintf(fp, "y[%6d,%6d] = %15.8e\n", i, j, x[y_index(i,j)]); } } for (Index i=1; i<=N_; i++) { for (Index j=1; j<=N_; j++) { fprintf(fp, "u[%6d,%6d] = %15.8e\n", i, j ,x[u_index(i,j)]); } } fclose(fp); */ } coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannDistCntrlDiri.hpp000066400000000000000000000365141473776672200266570ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // based on MyNLP.hpp #ifndef __MITTELMANNDISTRCNTRLDIRI_HPP__ #define __MITTELMANNDISTRCNTRLDIRI_HPP__ #include "IpTNLP.hpp" #include "RegisteredTNLP.hpp" #include #include using namespace Ipopt; /** Base class for distributed control problems with Dirichlet * boundary conditions, as formulated by Hans Mittelmann as Examples * 1-3 in "Optimization Techniques for Solving Elliptic Control * Problems with Control and State Constraints. Part 2: Distributed * Control" */ class MittelmannDistCntrlDiriBase: public RegisteredTNLP { public: /** Constructor. N is the number of mesh points in one dimension * (excluding boundary). */ MittelmannDistCntrlDiriBase(); /** Default destructor */ virtual ~MittelmannDistCntrlDiriBase(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** Method for returning scaling parameters */ virtual bool get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index n, Number* x_scaling, bool& use_g_scaling, Index m, Number* g_scaling ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} protected: /** Method for setting the internal parameters that define the problem. * * It must be called by the child class in its * implementation of InitializeParameters. */ void SetBaseParameters( Index N, Number alpha, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number u_init ); /**@name Functions that defines a particular instance. */ //@{ /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const = 0; /** Forcing function for the elliptic equation */ virtual Number d_cont( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number x1, Number x2, Number y, Number u ) const = 0; /** Second partial derivative of forcing function w.r.t. y,y */ virtual Number d_cont_dydy( Number x1, Number x2, Number y, Number u ) const = 0; //@} private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MittelmannDistCntrlDiriBase( const MittelmannDistCntrlDiriBase& ); MittelmannDistCntrlDiriBase& operator=( const MittelmannDistCntrlDiriBase& ); //@} /**@name Problem specification */ //@{ /** Number of mesh points in one dimension (excluding boundary) */ Index N_; /** Step size */ Number h_; /** h_ squaredd */ Number hh_; /** overall lower bound on y */ Number lb_y_; /** overall upper bound on y */ Number ub_y_; /** overall lower bound on u */ Number lb_u_; /** overall upper bound on u */ Number ub_u_; /** Initial value for the constrols u */ Number u_init_; /** Weighting parameter for the control target deviation functional * in the objective */ Number alpha_; /** Array for the target profile for y */ Number* y_d_; //@} /**@name Auxiliary methods */ //@{ /** Translation of mesh point indices to NLP variable indices for y(x_ij) */ inline Index y_index( Index i, Index j ) const { return j + (N_ + 2) * i; } /** Translation of mesh point indices to NLP variable indices for u(x_ij) */ inline Index u_index( Index i, Index j ) const { return (N_ + 2) * (N_ + 2) + (j - 1) + (N_) * (i - 1); } /** Translation of interior mesh point indices to the corresponding * PDE constraint number */ inline Index pde_index( Index i, Index j ) const { return (j - 1) + N_ * (i - 1); } /** Compute the grid coordinate for given index in x1 direction */ inline Number x1_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x2 direction */ inline Number x2_grid( Index i ) const { return h_ * (Number) i; } //@} }; /** Implementation of Example 1 */ class MittelmannDistCntrlDiri1: public MittelmannDistCntrlDiriBase { public: MittelmannDistCntrlDiri1() { } virtual ~MittelmannDistCntrlDiri1() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.001; Number lb_y = -1e20; Number ub_y = 0.185; Number lb_u = 1.5; Number ub_u = 4.5; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 1. + 2. * (x1 * (x1 - 1.) + x2 * (x2 - 1.)); } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return std::pow(y, 3) - y - u; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return 3. * y * y - 1.; } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return 6. * y; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlDiri1( const MittelmannDistCntrlDiri1& ); MittelmannDistCntrlDiri1& operator=( const MittelmannDistCntrlDiri1& ); //@} }; /** Implemtation of Example 2 */ class MittelmannDistCntrlDiri2: public MittelmannDistCntrlDiriBase { public: MittelmannDistCntrlDiri2() { } virtual ~MittelmannDistCntrlDiri2() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.; Number lb_y = -1e20; Number ub_y = 0.185; Number lb_u = 1.5; Number ub_u = 4.5; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return 1. + 2. * (x1 * (x1 - 1.) + x2 * (x2 - 1.)); } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return std::pow(y, 3) - y - u; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return 3. * y * y - 1.; } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return 6. * y; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlDiri2( const MittelmannDistCntrlDiri2& ); MittelmannDistCntrlDiri2& operator=( const MittelmannDistCntrlDiri2& ); //@} }; /** Implementation of Example 3 */ class MittelmannDistCntrlDiri3: public MittelmannDistCntrlDiriBase { public: MittelmannDistCntrlDiri3() : pi_(4. * atan(1.)) { } virtual ~MittelmannDistCntrlDiri3() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.001; Number lb_y = -1e20; Number ub_y = 0.11; Number lb_u = -5; Number ub_u = 5.; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return std::sin(2. * pi_ * x1) * std::sin(2. * pi_ * x2); } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return -std::exp(y) - u; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlDiri3( const MittelmannDistCntrlDiri3& ); MittelmannDistCntrlDiri3& operator=( const MittelmannDistCntrlDiri3& ); //@} /** Value of pi (made available for convenience) */ const Number pi_; }; class MittelmannDistCntrlDiri3a: public MittelmannDistCntrlDiriBase { public: MittelmannDistCntrlDiri3a() : pi_(4. * atan(1.)) { } virtual ~MittelmannDistCntrlDiri3a() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number alpha = 0.; Number lb_y = -1e20; Number ub_y = 0.11; Number lb_u = -5; Number ub_u = 5.; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, alpha, lb_y, ub_y, lb_u, ub_u, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return std::sin(2. * pi_ * x1) * std::sin(2. * pi_ * x2); } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return -std::exp(y) - u; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlDiri3a( const MittelmannDistCntrlDiri3a& ); MittelmannDistCntrlDiri3a& operator=( const MittelmannDistCntrlDiri3a& ); //@} /** Value of pi (made available for convenience) */ const Number pi_; }; #endif coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannDistCntrlNeumA.cpp000066400000000000000000000442301473776672200267620ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2004-11-05 #include "MittelmannDistCntrlNeumA.hpp" #include using namespace Ipopt; /* Constructor. */ MittelmannDistCntrlNeumABase::MittelmannDistCntrlNeumABase() : y_d_(NULL) { } MittelmannDistCntrlNeumABase::~MittelmannDistCntrlNeumABase() { delete[] y_d_; } void MittelmannDistCntrlNeumABase::SetBaseParameters( Index N, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number b_0j, Number b_1j, Number b_i0, Number b_i1, Number u_init ) { N_ = N; h_ = 1. / (N + 1); hh_ = h_ * h_; lb_y_ = lb_y; ub_y_ = ub_y; lb_u_ = lb_u; ub_u_ = ub_u; b_0j_ = b_0j; b_1j_ = b_1j; b_i0_ = b_i0; b_i1_ = b_i1; u_init_ = u_init; // Initialize the target profile variables delete[] y_d_; y_d_ = new Number[(N_ + 2) * (N_ + 2)]; for( Index j = 0; j <= N_ + 1; j++ ) { for( Index i = 0; i <= N_ + 1; i++ ) { y_d_[y_index(i, j)] = y_d_cont(x1_grid(i), x2_grid(j)); } } } bool MittelmannDistCntrlNeumABase::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // We for each of the N_+2 times N_+2 mesh points we have the value // of the functions y, and for each N_ times N_ interior mesh points // we have values for u n = (N_ + 2) * (N_ + 2) + N_ * N_; // For each of the N_ times N_ interior mesh points we have the // discretized PDE, and we have one constriant for each boundary // point (except for the corners) m = N_ * N_ + 4 * N_; // y(i,j), y(i-1,j), y(i+1,j), y(i,j-1), y(i,j+1), u(i,j) for each // of the N_*N_ discretized PDEs, and for the Neumann boundary // conditions nnz_jac_g = 6 * N_ * N_ + 8 * N_; // diagonal entry for each dydy, dudu, dydu in the interior nnz_h_lag = 0; if( !fint_cont_dydy_alwayszero() || !d_cont_dydy_alwayszero() ) { nnz_h_lag += N_ * N_; } if( !fint_cont_dudu_alwayszero() || !d_cont_dudu_alwayszero() ) { nnz_h_lag += N_ * N_; } if( !fint_cont_dydu_alwayszero() || !d_cont_dydu_alwayszero() ) { nnz_h_lag += N_ * N_; } // We use the C indexing style for row/col entries (corresponding to // the C notation, starting at 0) index_style = C_STYLE; return true; } bool MittelmannDistCntrlNeumABase::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // Set overall bounds on the variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iy = y_index(i, j); x_l[iy] = lb_y_; x_u[iy] = ub_y_; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = u_index(i, j); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } // There is no information for the y's at the corner points, so just // take those variables out x_l[y_index(0, 0)] = x_u[y_index(0, 0)] = 0.; x_l[y_index(0, N_ + 1)] = x_u[y_index(0, N_ + 1)] = 0.; x_l[y_index(N_ + 1, 0)] = x_u[y_index(N_ + 1, 0)] = 0.; x_l[y_index(N_ + 1, N_ + 1)] = x_u[y_index(N_ + 1, N_ + 1)] = 0.; // all discretized PDE constraints have right hand side zero for( Index i = 0; i < m; i++ ) { g_l[i] = 0.; g_u[i] = 0.; } return true; } bool MittelmannDistCntrlNeumABase::get_starting_point( Index /*n*/, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the others if // you wish. assert(init_x == true); (void) init_x; assert(init_z == false); (void) init_z; assert(init_lambda == false); (void) init_lambda; // set all y's to the perfect match with y_d for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { x[y_index(i, j)] = y_d_[y_index(i, j)]; //x[y_index(i,j)] += h_*x1_grid(i) + 2*h_*x2_grid(j); } } // Set the initial (constant) value for the u's for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { x[u_index(i, j)] = u_init_; //x[u_index(i,j)] -= h_*x1_grid(i) + 2*h_*x2_grid(j); } } return true; } bool MittelmannDistCntrlNeumABase::get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index /*n*/, Number* /*x_scaling*/, bool& use_g_scaling, Index /*m*/, Number* /*g_scaling*/ ) { obj_scaling = 1. / hh_; use_x_scaling = false; use_g_scaling = false; return true; } bool MittelmannDistCntrlNeumABase::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // return the value of the objective function obj_value = 0.; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); Index iu = u_index(i, j); obj_value += fint_cont(x1_grid(i), x2_grid(j), x[iy], x[iu]); } } obj_value *= hh_; return true; } bool MittelmannDistCntrlNeumABase::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) // The values are zero for variables on the boundary for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, 0)] = 0.; } for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, N_ + 1)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(0, j)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(N_ + 1, j)] = 0.; } // now let's take care of the nonzero values for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); Index iu = u_index(i, j); grad_f[iy] = hh_ * fint_cont_dy(x1_grid(i), x2_grid(j), x[iy], x[iu]); grad_f[iu] = hh_ * fint_cont_du(x1_grid(i), x2_grid(j), x[iy], x[iu]); } } return true; } bool MittelmannDistCntrlNeumABase::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index m, Number* g ) { // return the value of the constraints: g(x) // compute the discretized PDE for each interior grid point for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Number val; // Start with the discretized Laplacian operator val = 4. * x[y_index(i, j)] - x[y_index(i - 1, j)] - x[y_index(i + 1, j)] - x[y_index(i, j - 1)] - x[y_index(i, j + 1)]; // Add the forcing term (including the step size here) val += hh_ * d_cont(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); g[pde_index(i, j)] = val; } } Index ig = N_ * N_; // set up the Neumann boundary conditions for( Index i = 1; i <= N_; i++ ) { g[ig] = (1. + h_ * b_i0_) * x[y_index(i, 0)] - x[y_index(i, 1)]; ig++; } for( Index i = 1; i <= N_; i++ ) { g[ig] = (1. + h_ * b_i1_) * x[y_index(i, N_ + 1)] - x[y_index(i, N_)]; ig++; } for( Index j = 1; j <= N_; j++ ) { g[ig] = (1. + h_ * b_0j_) * x[y_index(0, j)] - x[y_index(1, j)]; ig++; } for( Index j = 1; j <= N_; j++ ) { g[ig] = (1. + h_ * b_1j_) * x[y_index(N_ + 1, j)] - x[y_index(N_, j)]; ig++; } DBG_ASSERT(ig == m); (void) m; return true; } bool MittelmannDistCntrlNeumABase::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints // distretized PDEs Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index ig = pde_index(i, j); // y(i,j) iRow[ijac] = ig; jCol[ijac] = y_index(i, j); ijac++; // y(i-1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j); ijac++; // y(i+1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j); ijac++; // y(i,j-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1); ijac++; // y(i,j+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1); ijac++; // u(i,j) iRow[ijac] = ig; jCol[ijac] = u_index(i, j); ijac++; } } Index ig = N_ * N_; // set up the Neumann boundary conditions for( Index i = 1; i <= N_; i++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(i, 0); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(i, 1); ijac++; ig++; } for( Index i = 1; i <= N_; i++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(i, N_); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(i, N_ + 1); ijac++; ig++; } for( Index j = 1; j <= N_; j++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(0, j); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(1, j); ijac++; ig++; } for( Index j = 1; j <= N_; j++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(N_, j); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(N_ + 1, j); ijac++; ig++; } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // y(i,j) values[ijac] = 4. + hh_ * d_cont_dy(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ijac++; // y(i-1,j) values[ijac] = -1.; ijac++; // y(i+1,j) values[ijac] = -1.; ijac++; // y(1,j-1) values[ijac] = -1.; ijac++; // y(1,j+1) values[ijac] = -1.; ijac++; // y(i,j) values[ijac] = hh_ * d_cont_du(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ijac++; } } for( Index i = 1; i <= N_; i++ ) { values[ijac] = 1. + h_ * b_i0_; ijac++; values[ijac] = -1.; ijac++; } for( Index i = 1; i <= N_; i++ ) { values[ijac] = -1.; ijac++; values[ijac] = 1. + h_ * b_i1_; ijac++; } for( Index j = 1; j <= N_; j++ ) { values[ijac] = 1. + h_ * b_0j_; ijac++; values[ijac] = -1.; ijac++; } for( Index j = 1; j <= N_; j++ ) { values[ijac] = -1.; ijac++; values[ijac] = 1. + h_ * b_1j_; ijac++; } DBG_ASSERT(ijac == nele_jac); } return true; } bool MittelmannDistCntrlNeumABase::eval_h( Index /*n*/, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. Index ihes = 0; if( !fint_cont_dydy_alwayszero() || !d_cont_dydy_alwayszero() ) { // First the diagonal entries for dydy for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = y_index(i, j); jCol[ihes] = y_index(i, j); ihes++; } } } if( !fint_cont_dudu_alwayszero() || !d_cont_dudu_alwayszero() ) { // Now the diagonal entries for dudu for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = u_index(i, j); jCol[ihes] = u_index(i, j); ihes++; } } } if( !fint_cont_dydu_alwayszero() || !d_cont_dydu_alwayszero() ) { // Now the diagonal entries for dydu for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = y_index(i, j); jCol[ihes] = u_index(i, j); ihes++; } } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // return the values Index ihes = 0; Index ihes_store; // First the diagonal entries for dydy if( !fint_cont_dydy_alwayszero() || !d_cont_dydy_alwayszero() ) { ihes_store = ihes; if( !fint_cont_dydy_alwayszero() ) { // Contribution from the objective function for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * fint_cont_dydy(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } else { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = 0.; ihes++; } } } if( !d_cont_dydy_alwayszero() ) { ihes = ihes_store; // Contribution from the constraints for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] += lambda[pde_index(i, j)] * hh_ * d_cont_dydy(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } } // Finally the entries for dudu if( !fint_cont_dudu_alwayszero() || !d_cont_dudu_alwayszero() ) { ihes_store = ihes; if( !fint_cont_dudu_alwayszero() ) { // Contribution from the objective function for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * fint_cont_dudu(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } else { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = 0.; ihes++; } } } if( !d_cont_dudu_alwayszero() ) { ihes = ihes_store; // Contribution from the constraints for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] += lambda[pde_index(i, j)] * hh_ * d_cont_dudu(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } } // Now the entries for dydu if( !fint_cont_dydu_alwayszero() || !d_cont_dydu_alwayszero() ) { ihes_store = ihes; if( !fint_cont_dydu_alwayszero() ) { // Contribution from the objective function for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * fint_cont_dydu(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } else { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = 0.; ihes++; } } } if( !d_cont_dydu_alwayszero() ) { ihes = ihes_store; // Contribution from the constraints for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] += lambda[pde_index(i, j)] * hh_ * d_cont_dydu(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } } } return true; } void MittelmannDistCntrlNeumABase::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { /* FILE* fp = fopen("solution.txt", "w+"); for (Index i=0; i<=N_+1; i++) { for (Index j=0; j<=N_+1; j++) { fprintf(fp, "y[%6d,%6d] = %15.8e\n", i, j, x[y_index(i,j)]); } } for (Index i=1; i<=N_; i++) { for (Index j=1; j<=N_; j++) { fprintf(fp, "u[%6d,%6d] = %15.8e\n", i, j ,x[u_index(i,j)]); } } fclose(fp); */ } coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannDistCntrlNeumA.hpp000066400000000000000000000623051473776672200267720ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // based on MyNLP.hpp #ifndef __MITTELMANNDISTRCNTRLNEUMA_HPP__ #define __MITTELMANNDISTRCNTRLNEUMA_HPP__ #include "IpTNLP.hpp" #include "RegisteredTNLP.hpp" #include #include using namespace Ipopt; /** Base class for distributed control problems with homogeneous * Neumann boundary conditions, as formulated by Hans Mittelmann as * Examples 4-6 in "Optimization Techniques for Solving Elliptic * Control Problems with Control and State Constraints. Part 2: * Distributed Control" */ class MittelmannDistCntrlNeumABase: public RegisteredTNLP { public: /** Constructor. N is the number of mesh points in one dimension * (excluding boundary). */ MittelmannDistCntrlNeumABase(); /** Default destructor */ virtual ~MittelmannDistCntrlNeumABase(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** Method for returning scaling parameters */ virtual bool get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index n, Number* x_scaling, bool& use_g_scaling, Index m, Number* g_scaling ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} protected: /** Method for setting the internal parameters that define the problem. * * It must be called by the child class in its * implementation of InitializeParameters. */ void SetBaseParameters( Index N, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number b_0j, Number b_1j, Number b_i0, Number b_i1, Number u_init ); /**@name Functions that defines a particular instance. */ //@{ /** Target profile function for y (and initial guess function) */ virtual Number y_d_cont( Number x1, Number x2 ) const = 0; /** Integrant in objective function */ virtual Number fint_cont( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of fint_cont w.r.t. y */ virtual Number fint_cont_dy( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of fint_cont w.r.t. u */ virtual Number fint_cont_du( Number x1, Number x2, Number y, Number u ) const = 0; /** Second partial derivative of fint_cont w.r.t. y,y */ virtual Number fint_cont_dydy( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of fint_cont * w.r.t. y,y is always zero. */ virtual bool fint_cont_dydy_alwayszero() const = 0; /** Second partial derivative of fint_cont w.r.t. u,u */ virtual Number fint_cont_dudu( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of fint_cont * w.r.t. u,u is always zero. */ virtual bool fint_cont_dudu_alwayszero() const = 0; /** Second partial derivative of fint_cont w.r.t. y,u */ virtual Number fint_cont_dydu( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of fint_cont * w.r.t. y,u is always zero. */ virtual bool fint_cont_dydu_alwayszero() const = 0; /** Forcing function for the elliptic equation */ virtual Number d_cont( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number x1, Number x2, Number y, Number u ) const = 0; /** Second partial derivative of forcing function w.r.t. y,y */ virtual Number d_cont_dydy( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const = 0; /** Second partial derivative of forcing function w.r.t. u,u */ virtual Number d_cont_dudu( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dudu_alwayszero() const = 0; /** Second partial derivative of forcing function w.r.t. y,u */ virtual Number d_cont_dydu( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of d_cont * w.r.t. y,u is always zero. */ virtual bool d_cont_dydu_alwayszero() const = 0; //@} private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MittelmannDistCntrlNeumABase( const MittelmannDistCntrlNeumABase& ); MittelmannDistCntrlNeumABase& operator=( const MittelmannDistCntrlNeumABase& ); //@} /**@name Problem specification */ //@{ /** Number of mesh points in one dimension (excluding boundary) */ Index N_; /** Step size */ Number h_; /** h_ squared */ Number hh_; /** overall lower bound on y */ Number lb_y_; /** overall upper bound on y */ Number ub_y_; /** overall lower bound on u */ Number lb_u_; /** overall upper bound on u */ Number ub_u_; /** Value of beta function (in Neumann boundary condition) for (0,x2) boundary */ Number b_0j_; /** Value of beta function (in Neumann boundary condition) for (1,x2) boundary */ Number b_1j_; /** Value of beta function (in Neumann boundary condition) for (x1,0) boundary */ Number b_i0_; /** Value of beta function (in Neumann boundary condition) for (x1,1) boundary */ Number b_i1_; /** Initial value for the controls u */ Number u_init_; /** Array for the target profile for y */ Number* y_d_; //@} /**@name Auxiliary methods */ //@{ /** Translation of mesh point indices to NLP variable indices for y(x_ij) */ inline Index y_index( Index i, Index j ) const { return j + (N_ + 2) * i; } /** Translation of mesh point indices to NLP variable indices for u(x_ij) */ inline Index u_index( Index i, Index j ) const { return (N_ + 2) * (N_ + 2) + (j - 1) + (N_) * (i - 1); } /** Translation of interior mesh point indices to the corresponding * PDE constraint number */ inline Index pde_index( Index i, Index j ) const { return (j - 1) + N_ * (i - 1); } /** Compute the grid coordinate for given index in x1 direction */ inline Number x1_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x2 direction */ inline Number x2_grid( Index i ) const { return h_ * (Number) i; } //@} }; /** Implementation of Example 4 */ class MittelmannDistCntrlNeumA1: public MittelmannDistCntrlNeumABase { public: MittelmannDistCntrlNeumA1() : pi_(4. * atan(1.)), alpha_(0.001) { } virtual ~MittelmannDistCntrlNeumA1() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number lb_y = -1e20; Number ub_y = 0.371; Number lb_u = -8.; Number ub_u = 9.; Number b_0j = 1.; Number b_1j = 1.; Number b_i0 = 1.; Number b_i1 = 1.; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, lb_y, ub_y, lb_u, ub_u, b_0j, b_1j, b_i0, b_i1, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return std::sin(2. * pi_ * x1) * std::sin(2. * pi_ * x2); } /** Integrant in objective function */ virtual Number fint_cont( Number x1, Number x2, Number y, Number u ) const { Number diff_y = y - y_d_cont(x1, x2); return 0.5 * (diff_y * diff_y + alpha_ * u * u); } /** First partial derivative of fint_cont w.r.t. y */ virtual Number fint_cont_dy( Number x1, Number x2, Number y, Number /*u*/ ) const { return y - y_d_cont(x1, x2); } /** First partial derivative of fint_cont w.r.t. u */ virtual Number fint_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number u ) const { return alpha_ * u; } /** Second partial derivative of fint_cont w.r.t. y,y */ virtual Number fint_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,y is always zero. */ virtual bool fint_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of fint_cont w.r.t. u,u */ virtual Number fint_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return alpha_; } /** returns true if second partial derivative of fint_cont * w.r.t. u,u is always zero. */ virtual bool fint_cont_dudu_alwayszero() const { return false; } /** Second partial derivative of fint_cont w.r.t. y,u */ virtual Number fint_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,u is always zero. */ virtual bool fint_cont_dydu_alwayszero() const { return true; } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return -std::exp(y) - u; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of forcing function w.r.t. u,u */ virtual Number d_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dudu_alwayszero() const { return true; } /** Second partial derivative of forcing function w.r.t. y,u */ virtual Number d_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,u is always zero. */ virtual bool d_cont_dydu_alwayszero() const { return true; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlNeumA1( const MittelmannDistCntrlNeumA1& ); MittelmannDistCntrlNeumA1& operator=( const MittelmannDistCntrlNeumA1& ); //@} /** Value of pi (made available for convenience) */ const Number pi_; /** Value for parameter alpha in objective function */ const Number alpha_; }; /** Implementation of Example 5 */ class MittelmannDistCntrlNeumA2: public MittelmannDistCntrlNeumABase { public: MittelmannDistCntrlNeumA2() : pi_(4. * atan(1.)) { } virtual ~MittelmannDistCntrlNeumA2() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number lb_y = -1e20; Number ub_y = 0.371; Number lb_u = -8.; Number ub_u = 9.; Number b_0j = 1.; Number b_1j = 1.; Number b_i0 = 1.; Number b_i1 = 1.; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, lb_y, ub_y, lb_u, ub_u, b_0j, b_1j, b_i0, b_i1, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return std::sin(2. * pi_ * x1) * std::sin(2. * pi_ * x2); } /** Integrant in objective function */ virtual Number fint_cont( Number x1, Number x2, Number y, Number /*u*/ ) const { Number diff_y = y - y_d_cont(x1, x2); return 0.5 * diff_y * diff_y; } /** First partial derivative of fint_cont w.r.t. y */ virtual Number fint_cont_dy( Number x1, Number x2, Number y, Number /*u*/ ) const { return y - y_d_cont(x1, x2); } /** First partial derivative of fint_cont w.r.t. u */ virtual Number fint_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** Second partial derivative of fint_cont w.r.t. y,y */ virtual Number fint_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,y is always zero. */ virtual bool fint_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of fint_cont w.r.t. u,u */ virtual Number fint_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of fint_cont * w.r.t. u,u is always zero. */ virtual bool fint_cont_dudu_alwayszero() const { return true; } /** Second partial derivative of fint_cont w.r.t. y,u */ virtual Number fint_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,u is always zero. */ virtual bool fint_cont_dydu_alwayszero() const { return true; } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return -std::exp(y) - u; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of forcing function w.r.t. u,u */ virtual Number d_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dudu_alwayszero() const { return true; } /** Second partial derivative of forcing function w.r.t. y,u */ virtual Number d_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,u is always zero. */ virtual bool d_cont_dydu_alwayszero() const { return true; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlNeumA2( const MittelmannDistCntrlNeumA2& ); MittelmannDistCntrlNeumA2& operator=( const MittelmannDistCntrlNeumA2& ); //@} /** Value of pi (made available for convenience) */ const Number pi_; }; /** Implementation of Example 6 */ class MittelmannDistCntrlNeumA3: public MittelmannDistCntrlNeumABase { public: MittelmannDistCntrlNeumA3() : pi_(4. * atan(1.)), M_(1.), K_(0.8), b_(1.) { } virtual ~MittelmannDistCntrlNeumA3() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number lb_y = 3.; //-1e20; Number ub_y = 6.09; Number lb_u = 1.4; Number ub_u = 1.6; Number b_0j = 1.; Number b_1j = 0.; Number b_i0 = 1.; Number b_i1 = 0.; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, lb_y, ub_y, lb_u, ub_u, b_0j, b_1j, b_i0, b_i1, u_init); return true; } protected: /** Profile function for initial y */ virtual Number y_d_cont( Number /*x1*/, Number /*x2*/ ) const { return 6.; } /** Integrant in objective function */ virtual Number fint_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return u * (M_ * u - K_ * y); } /** First partial derivative of fint_cont w.r.t. y */ virtual Number fint_cont_dy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number u ) const { return -K_ * u; } /** First partial derivative of fint_cont w.r.t. u */ virtual Number fint_cont_du( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return 2. * M_ * u - K_ * y; } /** Second partial derivative of fint_cont w.r.t. y,y */ virtual Number fint_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,y is always zero. */ virtual bool fint_cont_dydy_alwayszero() const { return true; } /** Second partial derivative of fint_cont w.r.t. u,u */ virtual Number fint_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 2. * M_; } /** returns true if second partial derivative of fint_cont * w.r.t. u,u is always zero. */ virtual bool fint_cont_dudu_alwayszero() const { return false; } /** Second partial derivative of fint_cont w.r.t. y,u */ virtual Number fint_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -K_; } /** returns true if second partial derivative of fint_cont * w.r.t. y,u is always zero. */ virtual bool fint_cont_dydu_alwayszero() const { return false; } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number x1, Number x2, Number y, Number u ) const { return y * (u + b_ * y - a(x1, x2)); } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number x1, Number x2, Number y, Number u ) const { return (u + 2. * b_ * y - a(x1, x2)); } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return y; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 2. * b_; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of forcing function w.r.t. u,u */ virtual Number d_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dudu_alwayszero() const { return true; } /** Second partial derivative of forcing function w.r.t. y,u */ virtual Number d_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** returns true if second partial derivative of d_cont * w.r.t. y,u is always zero. */ virtual bool d_cont_dydu_alwayszero() const { return false; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlNeumA3( const MittelmannDistCntrlNeumA3& ); MittelmannDistCntrlNeumA3& operator=( const MittelmannDistCntrlNeumA3& ); //@} /** Value of pi (made available for convenience) */ const Number pi_; /*@name constants appearing in problem formulation */ //@{ const Number M_; const Number K_; const Number b_; //@} /** Auxiliary function for state equation */ inline Number a( Number x1, Number x2 ) const { return 7. + 4. * std::sin(2. * pi_ * x1 * x2); } }; #endif coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannDistCntrlNeumB.cpp000066400000000000000000000442301473776672200267630ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2004-11-05 #include "MittelmannDistCntrlNeumB.hpp" #include using namespace Ipopt; /* Constructor. */ MittelmannDistCntrlNeumBBase::MittelmannDistCntrlNeumBBase() : y_d_(NULL) { } MittelmannDistCntrlNeumBBase::~MittelmannDistCntrlNeumBBase() { delete[] y_d_; } void MittelmannDistCntrlNeumBBase::SetBaseParameters( Index N, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number b_0j, Number b_1j, Number b_i0, Number b_i1, Number u_init ) { N_ = N; h_ = 1. / (N + 1); hh_ = h_ * h_; lb_y_ = lb_y; ub_y_ = ub_y; lb_u_ = lb_u; ub_u_ = ub_u; b_0j_ = b_0j; b_1j_ = b_1j; b_i0_ = b_i0; b_i1_ = b_i1; u_init_ = u_init; // Initialize the target profile variables delete[] y_d_; y_d_ = new Number[(N_ + 2) * (N_ + 2)]; for( Index j = 0; j <= N_ + 1; j++ ) { for( Index i = 0; i <= N_ + 1; i++ ) { y_d_[y_index(i, j)] = y_d_cont(x1_grid(i), x2_grid(j)); } } } bool MittelmannDistCntrlNeumBBase::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // We for each of the N_+2 times N_+2 mesh points we have the value // of the functions y, and for each N_ times N_ interior mesh points // we have values for u n = (N_ + 2) * (N_ + 2) + N_ * N_; // For each of the N_ times N_ interior mesh points we have the // discretized PDE, and we have one constriant for each boundary // point (except for the corners) m = N_ * N_ + 4 * N_; // y(i,j), y(i-1,j), y(i+1,j), y(i,j-1), y(i,j+1), u(i,j) for each // of the N_*N_ discretized PDEs, and for the Neumann boundary // conditions nnz_jac_g = 6 * N_ * N_ + 8 * N_; // diagonal entry for each dydy, dudu, dydu in the interior nnz_h_lag = 0; if( !fint_cont_dydy_alwayszero() || !d_cont_dydy_alwayszero() ) { nnz_h_lag += N_ * N_; } if( !fint_cont_dudu_alwayszero() || !d_cont_dudu_alwayszero() ) { nnz_h_lag += N_ * N_; } if( !fint_cont_dydu_alwayszero() || !d_cont_dydu_alwayszero() ) { nnz_h_lag += N_ * N_; } // We use the C indexing style for row/col entries (corresponding to // the C notation, starting at 0) index_style = C_STYLE; return true; } bool MittelmannDistCntrlNeumBBase::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // Set overall bounds on the variables for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { Index iy = y_index(i, j); x_l[iy] = lb_y_; x_u[iy] = ub_y_; } } for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iu = u_index(i, j); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } } // There is no information for the y's at the corner points, so just // take those variables out x_l[y_index(0, 0)] = x_u[y_index(0, 0)] = 0.; x_l[y_index(0, N_ + 1)] = x_u[y_index(0, N_ + 1)] = 0.; x_l[y_index(N_ + 1, 0)] = x_u[y_index(N_ + 1, 0)] = 0.; x_l[y_index(N_ + 1, N_ + 1)] = x_u[y_index(N_ + 1, N_ + 1)] = 0.; // all discretized PDE constraints have right hand side zero for( Index i = 0; i < m; i++ ) { g_l[i] = 0.; g_u[i] = 0.; } return true; } bool MittelmannDistCntrlNeumBBase::get_starting_point( Index /*n*/, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the others if // you wish. assert(init_x == true); (void) init_x; assert(init_z == false); (void) init_z; assert(init_lambda == false); (void) init_lambda; // set all y's to the perfect match with y_d for( Index i = 0; i <= N_ + 1; i++ ) { for( Index j = 0; j <= N_ + 1; j++ ) { x[y_index(i, j)] = y_d_[y_index(i, j)]; //x[y_index(i,j)] += h_*x1_grid(i) + 2*h_*x2_grid(j); } } // Set the initial (constant) value for the u's for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { x[u_index(i, j)] = u_init_; //x[u_index(i,j)] -= h_*x1_grid(i) + 2*h_*x2_grid(j); } } return true; } bool MittelmannDistCntrlNeumBBase::get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index /*n*/, Number* /*x_scaling*/, bool& use_g_scaling, Index /*m*/, Number* /*g_scaling*/ ) { obj_scaling = 1. / hh_; use_x_scaling = false; use_g_scaling = false; return true; } bool MittelmannDistCntrlNeumBBase::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // return the value of the objective function obj_value = 0.; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); Index iu = u_index(i, j); obj_value += fint_cont(x1_grid(i), x2_grid(j), x[iy], x[iu]); } } obj_value *= hh_; return true; } bool MittelmannDistCntrlNeumBBase::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // return the gradient of the objective function grad_{x} f(x) // The values are zero for variables on the boundary for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, 0)] = 0.; } for( Index i = 0; i <= N_ + 1; i++ ) { grad_f[y_index(i, N_ + 1)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(0, j)] = 0.; } for( Index j = 1; j <= N_; j++ ) { grad_f[y_index(N_ + 1, j)] = 0.; } // now let's take care of the nonzero values for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index iy = y_index(i, j); Index iu = u_index(i, j); grad_f[iy] = hh_ * fint_cont_dy(x1_grid(i), x2_grid(j), x[iy], x[iu]); grad_f[iu] = hh_ * fint_cont_du(x1_grid(i), x2_grid(j), x[iy], x[iu]); } } return true; } bool MittelmannDistCntrlNeumBBase::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index m, Number* g ) { // return the value of the constraints: g(x) // compute the discretized PDE for each interior grid point for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Number val; // Start with the discretized Laplacian operator val = 4. * x[y_index(i, j)] - x[y_index(i - 1, j)] - x[y_index(i + 1, j)] - x[y_index(i, j - 1)] - x[y_index(i, j + 1)]; // Add the forcing term (including the step size here) val += hh_ * d_cont(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); g[pde_index(i, j)] = val; } } Index ig = N_ * N_; // set up the Neumann boundary conditions for( Index i = 1; i <= N_; i++ ) { g[ig] = x[y_index(i, 0)] - (1. - h_ * b_i0_) * x[y_index(i, 1)]; ig++; } for( Index i = 1; i <= N_; i++ ) { g[ig] = x[y_index(i, N_ + 1)] - (1. - h_ * b_i1_) * x[y_index(i, N_)]; ig++; } for( Index j = 1; j <= N_; j++ ) { g[ig] = x[y_index(0, j)] - (1. - h_ * b_0j_) * x[y_index(1, j)]; ig++; } for( Index j = 1; j <= N_; j++ ) { g[ig] = x[y_index(N_ + 1, j)] - (1. - h_ * b_1j_) * x[y_index(N_, j)]; ig++; } DBG_ASSERT(ig == m); (void) m; return true; } bool MittelmannDistCntrlNeumBBase::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index /*m*/, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure of the jacobian of the constraints // distretized PDEs Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { Index ig = pde_index(i, j); // y(i,j) iRow[ijac] = ig; jCol[ijac] = y_index(i, j); ijac++; // y(i-1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i - 1, j); ijac++; // y(i+1,j) iRow[ijac] = ig; jCol[ijac] = y_index(i + 1, j); ijac++; // y(i,j-1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j - 1); ijac++; // y(i,j+1) iRow[ijac] = ig; jCol[ijac] = y_index(i, j + 1); ijac++; // u(i,j) iRow[ijac] = ig; jCol[ijac] = u_index(i, j); ijac++; } } Index ig = N_ * N_; // set up the Neumann boundary conditions for( Index i = 1; i <= N_; i++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(i, 0); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(i, 1); ijac++; ig++; } for( Index i = 1; i <= N_; i++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(i, N_); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(i, N_ + 1); ijac++; ig++; } for( Index j = 1; j <= N_; j++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(0, j); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(1, j); ijac++; ig++; } for( Index j = 1; j <= N_; j++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(N_, j); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(N_ + 1, j); ijac++; ig++; } DBG_ASSERT(ijac == nele_jac); (void) nele_jac; } else { // return the values of the jacobian of the constraints Index ijac = 0; for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { // y(i,j) values[ijac] = 4. + hh_ * d_cont_dy(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ijac++; // y(i-1,j) values[ijac] = -1.; ijac++; // y(i+1,j) values[ijac] = -1.; ijac++; // y(1,j-1) values[ijac] = -1.; ijac++; // y(1,j+1) values[ijac] = -1.; ijac++; // y(i,j) values[ijac] = hh_ * d_cont_du(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ijac++; } } for( Index i = 1; i <= N_; i++ ) { values[ijac] = 1.; ijac++; values[ijac] = -1. + h_ * b_i0_; ijac++; } for( Index i = 1; i <= N_; i++ ) { values[ijac] = -1. + h_ * b_i1_; ijac++; values[ijac] = 1.; ijac++; } for( Index j = 1; j <= N_; j++ ) { values[ijac] = 1.; ijac++; values[ijac] = -1. + h_ * b_0j_; ijac++; } for( Index j = 1; j <= N_; j++ ) { values[ijac] = -1. + h_ * b_1j_; ijac++; values[ijac] = 1.; ijac++; } DBG_ASSERT(ijac == nele_jac); } return true; } bool MittelmannDistCntrlNeumBBase::eval_h( Index /*n*/, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. Index ihes = 0; if( !fint_cont_dydy_alwayszero() || !d_cont_dydy_alwayszero() ) { // First the diagonal entries for dydy for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = y_index(i, j); jCol[ihes] = y_index(i, j); ihes++; } } } if( !fint_cont_dudu_alwayszero() || !d_cont_dudu_alwayszero() ) { // Now the diagonal entries for dudu for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = u_index(i, j); jCol[ihes] = u_index(i, j); ihes++; } } } if( !fint_cont_dydu_alwayszero() || !d_cont_dydu_alwayszero() ) { // Now the diagonal entries for dydu for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { iRow[ihes] = y_index(i, j); jCol[ihes] = u_index(i, j); ihes++; } } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; } else { // return the values Index ihes = 0; Index ihes_store; // First the diagonal entries for dydy if( !fint_cont_dydy_alwayszero() || !d_cont_dydy_alwayszero() ) { ihes_store = ihes; if( !fint_cont_dydy_alwayszero() ) { // Contribution from the objective function for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * fint_cont_dydy(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } else { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = 0.; ihes++; } } } if( !d_cont_dydy_alwayszero() ) { ihes = ihes_store; // Contribution from the constraints for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] += lambda[pde_index(i, j)] * hh_ * d_cont_dydy(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } } // Finally the entries for dudu if( !fint_cont_dudu_alwayszero() || !d_cont_dudu_alwayszero() ) { ihes_store = ihes; if( !fint_cont_dudu_alwayszero() ) { // Contribution from the objective function for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * fint_cont_dudu(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } else { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = 0.; ihes++; } } } if( !d_cont_dudu_alwayszero() ) { ihes = ihes_store; // Contribution from the constraints for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] += lambda[pde_index(i, j)] * hh_ * d_cont_dudu(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } } // Now the entries for dydu if( !fint_cont_dydu_alwayszero() || !d_cont_dydu_alwayszero() ) { ihes_store = ihes; if( !fint_cont_dydu_alwayszero() ) { // Contribution from the objective function for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = obj_factor * hh_ * fint_cont_dydu(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } else { for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] = 0.; ihes++; } } } if( !d_cont_dydu_alwayszero() ) { ihes = ihes_store; // Contribution from the constraints for( Index i = 1; i <= N_; i++ ) { for( Index j = 1; j <= N_; j++ ) { values[ihes] += lambda[pde_index(i, j)] * hh_ * d_cont_dydu(x1_grid(i), x2_grid(j), x[y_index(i, j)], x[u_index(i, j)]); ihes++; } } } } } return true; } void MittelmannDistCntrlNeumBBase::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { /* FILE* fp = fopen("solution.txt", "w+"); for (Index i=0; i<=N_+1; i++) { for (Index j=0; j<=N_+1; j++) { fprintf(fp, "y[%6d,%6d] = %15.8e\n", i, j, x[y_index(i,j)]); } } for (Index i=1; i<=N_; i++) { for (Index j=1; j<=N_; j++) { fprintf(fp, "u[%6d,%6d] = %15.8e\n", i, j ,x[u_index(i,j)]); } } fclose(fp); */ } coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannDistCntrlNeumB.hpp000066400000000000000000000623111473776672200267700ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 // based on MyNLP.hpp #ifndef __MITTELMANNDISTRCNTRLNEUMB_HPP__ #define __MITTELMANNDISTRCNTRLNEUMB_HPP__ #include "IpTNLP.hpp" #include "RegisteredTNLP.hpp" #include #include using namespace Ipopt; /** Base class for distributed control problems with homogeneous * Neumann boundary conditions, as formulated by Hans Mittelmann as * Examples 4-6 in "Optimization Techniques for Solving Elliptic * Control Problems with Control and State Constraints. Part 2: * Distributed Control" */ class MittelmannDistCntrlNeumBBase: public RegisteredTNLP { public: /** Constructor. N is the number of mesh points in one dimension * (excluding boundary). */ MittelmannDistCntrlNeumBBase(); /** Default destructor */ virtual ~MittelmannDistCntrlNeumBBase(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** Method for returning scaling parameters */ virtual bool get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index n, Number* x_scaling, bool& use_g_scaling, Index m, Number* g_scaling ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} protected: /** Method for setting the internal parameters that define the problem. * * It must be called by the child class in its * implementation of InitializeParameters. */ void SetBaseParameters( Index N, Number lb_y, Number ub_y, Number lb_u, Number ub_u, Number b_0j, Number b_1j, Number b_i0, Number b_i1, Number u_init ); /**@name Functions that defines a particular instance. */ //@{ /** Target profile function for y (and initial guess function) */ virtual Number y_d_cont( Number x1, Number x2 ) const = 0; /** Integrant in objective function */ virtual Number fint_cont( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of fint_cont w.r.t. y */ virtual Number fint_cont_dy( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of fint_cont w.r.t. u */ virtual Number fint_cont_du( Number x1, Number x2, Number y, Number u ) const = 0; /** Second partial derivative of fint_cont w.r.t. y,y */ virtual Number fint_cont_dydy( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of fint_cont * w.r.t. y,y is always zero. */ virtual bool fint_cont_dydy_alwayszero() const = 0; /** Second partial derivative of fint_cont w.r.t. u,u */ virtual Number fint_cont_dudu( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of fint_cont * w.r.t. u,u is always zero. */ virtual bool fint_cont_dudu_alwayszero() const = 0; /** Second partial derivative of fint_cont w.r.t. y,u */ virtual Number fint_cont_dydu( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of fint_cont * w.r.t. y,u is always zero. */ virtual bool fint_cont_dydu_alwayszero() const = 0; /** Forcing function for the elliptic equation */ virtual Number d_cont( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number x1, Number x2, Number y, Number u ) const = 0; /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number x1, Number x2, Number y, Number u ) const = 0; /** Second partial derivative of forcing function w.r.t. y,y */ virtual Number d_cont_dydy( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const = 0; /** Second partial derivative of forcing function w.r.t. u,u */ virtual Number d_cont_dudu( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dudu_alwayszero() const = 0; /** Second partial derivative of forcing function w.r.t. y,u */ virtual Number d_cont_dydu( Number x1, Number x2, Number y, Number u ) const = 0; /** returns true if second partial derivative of d_cont * w.r.t. y,u is always zero. */ virtual bool d_cont_dydu_alwayszero() const = 0; //@} private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MittelmannDistCntrlNeumBBase( const MittelmannDistCntrlNeumBBase& ); MittelmannDistCntrlNeumBBase& operator=( const MittelmannDistCntrlNeumBBase& ); //@} /**@name Problem specification */ //@{ /** Number of mesh points in one dimension (excluding boundary) */ Index N_; /** Step size */ Number h_; /** h_ squared */ Number hh_; /** overall lower bound on y */ Number lb_y_; /** overall upper bound on y */ Number ub_y_; /** overall lower bound on u */ Number lb_u_; /** overall upper bound on u */ Number ub_u_; /** Value of beta function (in Neumann boundary condition) for (0,x2) boundary */ Number b_0j_; /** Value of beta function (in Neumann boundary condition) for (1,x2) boundary */ Number b_1j_; /** Value of beta function (in Neumann boundary condition) for (x1,0) boundary */ Number b_i0_; /** Value of beta function (in Neumann boundary condition) for (x1,1) boundary */ Number b_i1_; /** Initial value for the controls u */ Number u_init_; /** Array for the target profile for y */ Number* y_d_; //@} /**@name Auxiliary methods */ //@{ /** Translation of mesh point indices to NLP variable indices for y(x_ij) */ inline Index y_index( Index i, Index j ) const { return j + (N_ + 2) * i; } /** Translation of mesh point indices to NLP variable indices for u(x_ij) */ inline Index u_index( Index i, Index j ) const { return (N_ + 2) * (N_ + 2) + (j - 1) + (N_) * (i - 1); } /** Translation of interior mesh point indices to the corresponding * PDE constraint number */ inline Index pde_index( Index i, Index j ) const { return (j - 1) + N_ * (i - 1); } /** Compute the grid coordinate for given index in x1 direction */ inline Number x1_grid( Index i ) const { return h_ * (Number) i; } /** Compute the grid coordinate for given index in x2 direction */ inline Number x2_grid( Index i ) const { return h_ * (Number) i; } //@} }; /** Implementation of Example 4 */ class MittelmannDistCntrlNeumB1: public MittelmannDistCntrlNeumBBase { public: MittelmannDistCntrlNeumB1() : pi_(4. * atan(1.)), alpha_(0.001) { } virtual ~MittelmannDistCntrlNeumB1() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number lb_y = -1e20; Number ub_y = 0.371; Number lb_u = -8.; Number ub_u = 9.; Number b_0j = 1.; Number b_1j = 1.; Number b_i0 = 1.; Number b_i1 = 1.; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, lb_y, ub_y, lb_u, ub_u, b_0j, b_1j, b_i0, b_i1, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return std::sin(2. * pi_ * x1) * std::sin(2. * pi_ * x2); } /** Integrant in objective function */ virtual Number fint_cont( Number x1, Number x2, Number y, Number u ) const { Number diff_y = y - y_d_cont(x1, x2); return 0.5 * (diff_y * diff_y + alpha_ * u * u); } /** First partial derivative of fint_cont w.r.t. y */ virtual Number fint_cont_dy( Number x1, Number x2, Number y, Number /*u*/ ) const { return y - y_d_cont(x1, x2); } /** First partial derivative of fint_cont w.r.t. u */ virtual Number fint_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number u ) const { return alpha_ * u; } /** Second partial derivative of fint_cont w.r.t. y,y */ virtual Number fint_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,y is always zero. */ virtual bool fint_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of fint_cont w.r.t. u,u */ virtual Number fint_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return alpha_; } /** returns true if second partial derivative of fint_cont * w.r.t. u,u is always zero. */ virtual bool fint_cont_dudu_alwayszero() const { return false; } /** Second partial derivative of fint_cont w.r.t. y,u */ virtual Number fint_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,u is always zero. */ virtual bool fint_cont_dydu_alwayszero() const { return true; } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return -std::exp(y) - u; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of forcing function w.r.t. u,u */ virtual Number d_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dudu_alwayszero() const { return true; } /** Second partial derivative of forcing function w.r.t. y,u */ virtual Number d_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,u is always zero. */ virtual bool d_cont_dydu_alwayszero() const { return true; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlNeumB1( const MittelmannDistCntrlNeumB1& ); MittelmannDistCntrlNeumB1& operator=( const MittelmannDistCntrlNeumB1& ); //@} /** Value of pi (made available for convenience) */ const Number pi_; /** Value for parameter alpha in objective function */ const Number alpha_; }; /** Implementation of Example 5 */ class MittelmannDistCntrlNeumB2: public MittelmannDistCntrlNeumBBase { public: MittelmannDistCntrlNeumB2() : pi_(4. * atan(1.)) { } virtual ~MittelmannDistCntrlNeumB2() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number lb_y = -1e20; Number ub_y = 0.371; Number lb_u = -8.; Number ub_u = 9.; Number b_0j = 1.; Number b_1j = 1.; Number b_i0 = 1.; Number b_i1 = 1.; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, lb_y, ub_y, lb_u, ub_u, b_0j, b_1j, b_i0, b_i1, u_init); return true; } protected: /** Target profile function for y */ virtual Number y_d_cont( Number x1, Number x2 ) const { return std::sin(2. * pi_ * x1) * std::sin(2. * pi_ * x2); } /** Integrant in objective function */ virtual Number fint_cont( Number x1, Number x2, Number y, Number /*u*/ ) const { Number diff_y = y - y_d_cont(x1, x2); return 0.5 * diff_y * diff_y; } /** First partial derivative of fint_cont w.r.t. y */ virtual Number fint_cont_dy( Number x1, Number x2, Number y, Number /*u*/ ) const { return y - y_d_cont(x1, x2); } /** First partial derivative of fint_cont w.r.t. u */ virtual Number fint_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** Second partial derivative of fint_cont w.r.t. y,y */ virtual Number fint_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,y is always zero. */ virtual bool fint_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of fint_cont w.r.t. u,u */ virtual Number fint_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of fint_cont * w.r.t. u,u is always zero. */ virtual bool fint_cont_dudu_alwayszero() const { return true; } /** Second partial derivative of fint_cont w.r.t. y,u */ virtual Number fint_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,u is always zero. */ virtual bool fint_cont_dydu_alwayszero() const { return true; } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return -std::exp(y) - u; } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -1.; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return -std::exp(y); } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of forcing function w.r.t. u,u */ virtual Number d_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dudu_alwayszero() const { return true; } /** Second partial derivative of forcing function w.r.t. y,u */ virtual Number d_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,u is always zero. */ virtual bool d_cont_dydu_alwayszero() const { return true; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlNeumB2( const MittelmannDistCntrlNeumB2& ); MittelmannDistCntrlNeumB2& operator=( const MittelmannDistCntrlNeumB2& ); //@} /** Value of pi (made available for convenience) */ const Number pi_; }; /** Implementation of Example 6 */ class MittelmannDistCntrlNeumB3: public MittelmannDistCntrlNeumBBase { public: MittelmannDistCntrlNeumB3() : pi_(4. * atan(1.)), M_(1.), K_(0.8), b_(1.) { } virtual ~MittelmannDistCntrlNeumB3() { } virtual bool InitializeProblem( Index N ) { if( N < 1 ) { printf("N has to be at least 1."); return false; } Number lb_y = 3.; //-1e20; Number ub_y = 6.09; Number lb_u = 1.4; Number ub_u = 1.6; Number b_0j = 1.; Number b_1j = 0.; Number b_i0 = 1.; Number b_i1 = 0.; Number u_init = (ub_u + lb_u) / 2.; SetBaseParameters(N, lb_y, ub_y, lb_u, ub_u, b_0j, b_1j, b_i0, b_i1, u_init); return true; } protected: /** Profile function for initial y */ virtual Number y_d_cont( Number /*x1*/, Number /*x2*/ ) const { return 6.; } /** Integrant in objective function */ virtual Number fint_cont( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return u * (M_ * u - K_ * y); } /** First partial derivative of fint_cont w.r.t. y */ virtual Number fint_cont_dy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number u ) const { return -K_ * u; } /** First partial derivative of fint_cont w.r.t. u */ virtual Number fint_cont_du( Number /*x1*/, Number /*x2*/, Number y, Number u ) const { return 2. * M_ * u - K_ * y; } /** Second partial derivative of fint_cont w.r.t. y,y */ virtual Number fint_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of fint_cont * w.r.t. y,y is always zero. */ virtual bool fint_cont_dydy_alwayszero() const { return true; } /** Second partial derivative of fint_cont w.r.t. u,u */ virtual Number fint_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 2. * M_; } /** returns true if second partial derivative of fint_cont * w.r.t. u,u is always zero. */ virtual bool fint_cont_dudu_alwayszero() const { return false; } /** Second partial derivative of fint_cont w.r.t. y,u */ virtual Number fint_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return -K_; } /** returns true if second partial derivative of fint_cont * w.r.t. y,u is always zero. */ virtual bool fint_cont_dydu_alwayszero() const { return false; } /** Forcing function for the elliptic equation */ virtual Number d_cont( Number x1, Number x2, Number y, Number u ) const { return y * (u + b_ * y - a(x1, x2)); } /** First partial derivative of forcing function w.r.t. y */ virtual Number d_cont_dy( Number x1, Number x2, Number y, Number u ) const { return (u + 2. * b_ * y - a(x1, x2)); } /** First partial derivative of forcing function w.r.t. u */ virtual Number d_cont_du( Number /*x1*/, Number /*x2*/, Number y, Number /*u*/ ) const { return y; } /** Second partial derivative of forcing function w.r.t y,y */ virtual Number d_cont_dydy( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 2. * b_; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dydy_alwayszero() const { return false; } /** Second partial derivative of forcing function w.r.t. u,u */ virtual Number d_cont_dudu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 0.; } /** returns true if second partial derivative of d_cont * w.r.t. y,y is always zero. */ virtual bool d_cont_dudu_alwayszero() const { return true; } /** Second partial derivative of forcing function w.r.t. y,u */ virtual Number d_cont_dydu( Number /*x1*/, Number /*x2*/, Number /*y*/, Number /*u*/ ) const { return 1.; } /** returns true if second partial derivative of d_cont * w.r.t. y,u is always zero. */ virtual bool d_cont_dydu_alwayszero() const { return false; } private: /**@name hide implicitly defined constructors and copy operators */ //@{ MittelmannDistCntrlNeumB3( const MittelmannDistCntrlNeumB3& ); MittelmannDistCntrlNeumB3& operator=( const MittelmannDistCntrlNeumB3& ); //@} /** Value of pi (made available for convenience) */ const Number pi_; /*@name constants appearing in problem formulation */ //@{ const Number M_; const Number K_; const Number b_; //@} //* Auxiliary function for state equation */ inline Number a( Number x1, Number x2 ) const { return 7. + 4. * std::sin(2. * pi_ * x1 * x2); } }; #endif coinor-ipopt-3.14.17/examples/ScalableProblems/MittelmannParaCntrl.hpp000066400000000000000000000644021473776672200260240ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-18 #ifndef __MITTELMANNPARACNTRL_HPP__ #define __MITTELMANNPARACNTRL_HPP__ #include "RegisteredTNLP.hpp" #include using namespace Ipopt; /** Base class for parabolic and elliptic control problems, as * formulated by Hans Mittelmann as problem (P) in "Sufficient * Optimality for Discretized Parabolic and Elliptic Control * Problems" */ template class MittelmannParaCntrlBase: public RegisteredTNLP { public: /** Constructor. */ MittelmannParaCntrlBase(); /** Default destructor */ virtual ~MittelmannParaCntrlBase(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the nlp */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the Jacobian (if "values" is NULL) * 2) The values of the Jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the Hessian of the Lagrangian (if "values" is NULL) * 2) The values of the Hessian of the Lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** Method for returning scaling parameters */ virtual bool get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index n, Number* x_scaling, bool& use_g_scaling, Index m, Number* g_scaling ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} virtual bool InitializeProblem( Index N ); private: /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ MittelmannParaCntrlBase( const MittelmannParaCntrlBase& ); MittelmannParaCntrlBase& operator=( const MittelmannParaCntrlBase& ); //@} /**@name Problem specification */ //@{ /** Upper bound on t */ Number T_; /** Upper bound on x */ Number l_; /** Number of mesh points in t direction */ Index Nt_; /** Number of mesh points in x direction */ Index Nx_; /** Step size in t direction*/ Number dt_; /** Step size in x direction*/ Number dx_; /** overall lower bound on y */ Number lb_y_; /** overall upper bound on y */ Number ub_y_; /** overall lower bound on u */ Number lb_u_; /** overall upper bound on u */ Number ub_u_; /** Weighting parameter for the control target deviation functional * in the objective */ Number alpha_; /** Weighting parameter in PDE */ Number beta_; /** Array for the target profile for y in objective */ Number* y_T_; /** Array for weighting function a_y in objective */ Number* a_y_; /** Array for weighting function a_u in objective */ Number* a_u_; //@} /**@name Auxiliary methods */ //@{ /** Translation of mesh point indices to NLP variable indices for y(x_ij) */ inline Index y_index( Index jx, Index it ) const { return jx + (Nx_ + 1) * it; } inline Index u_index( Index it ) const { return (Nt_ + 1) * (Nx_ + 1) + it - 1; } /** Compute the grid coordinate for given index in t direction */ inline Number t_grid( Index i ) const { return dt_ * (Number) i; } /** Compute the grid coordinate for given index in x direction */ inline Number x_grid( Index j ) const { return dx_ * (Number) j; } //@} }; template MittelmannParaCntrlBase::MittelmannParaCntrlBase() : y_T_(NULL), a_y_(NULL), a_u_(NULL) { } template MittelmannParaCntrlBase::~MittelmannParaCntrlBase() { delete[] y_T_; delete[] a_y_; delete[] a_u_; } template bool MittelmannParaCntrlBase::InitializeProblem( Index N ) { typename T::ProblemSpecs p; if( N < 1 ) { printf("N has to be at least 1."); return false; } T_ = p.T(); l_ = p.l(); Nt_ = N; Nx_ = N; dt_ = T_ / Nt_; dx_ = l_ / Nx_; lb_y_ = p.lb_y(); ub_y_ = p.ub_y(); lb_u_ = p.lb_u(); ub_u_ = p.ub_u(); alpha_ = p.alpha(); beta_ = p.beta(); y_T_ = new Number[Nx_ + 1]; for( Index j = 0; j <= Nx_; j++ ) { y_T_[j] = p.y_T(x_grid(j)); } a_y_ = new Number[Nt_]; for( Index i = 1; i <= Nt_; i++ ) { a_y_[i - 1] = p.a_y(t_grid(i)); } a_u_ = new Number[Nt_]; for( Index i = 1; i <= Nt_; i++ ) { a_u_[i - 1] = p.a_u(t_grid(i)); } return true; } template bool MittelmannParaCntrlBase::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { typename T::ProblemSpecs p; n = (Nt_ + 1) * (Nx_ + 1) + Nt_; m = Nt_ * (Nx_ - 1) + Nt_ + Nt_; nnz_jac_g = 6 * Nt_ * (Nx_ - 1) + 3 * Nt_ + 4 * Nt_; nnz_h_lag = Nx_ + 1 + Nt_; if( !p.phi_dydy_always_zero() ) { nnz_h_lag += Nt_; } index_style = C_STYLE; return true; } template bool MittelmannParaCntrlBase::get_bounds_info( Index /*n*/, Number* x_l, Number* x_u, Index /*m*/, Number* g_l, Number* g_u ) { typename T::ProblemSpecs p; // Set overall bounds on the variables for( Index jx = 0; jx <= Nx_; jx++ ) { for( Index it = 1; it <= Nt_; it++ ) { Index iy = y_index(jx, it); x_l[iy] = lb_y_; x_u[iy] = ub_y_; } } for( Index i = 1; i <= Nt_; i++ ) { Index iu = u_index(i); x_l[iu] = lb_u_; x_u[iu] = ub_u_; } /* // Boundary condition for t=0 for (Index it=0; it<=Nt_; it++) { Index iy = y_index(0,it); x_u[iy] = x_l[iy] = p.a(t_grid(it)); } */ // Boundary condition for t=0 for( Index jx = 0; jx <= Nx_; jx++ ) { Index iy = y_index(jx, 0); x_u[iy] = x_l[iy] = p.a(x_grid(jx)); } // all discretized PDE constraints have right hand side zero for( Index i = 0; i < Nt_ * (Nx_ - 1) + Nt_; i++ ) { g_l[i] = 0.; g_u[i] = 0.; } // but we put b on the right hand side for the x=L boundary condition for( Index i = 0; i < Nt_; i++ ) { g_l[Nt_ * (Nx_ - 1) + Nt_ + i] = g_u[Nt_ * (Nx_ - 1) + Nt_ + i] = p.b(t_grid(i + 1)); } return true; } template bool MittelmannParaCntrlBase::get_starting_point( Index /*n*/, bool init_x, Number* x, bool init_z, Number* /*z_L*/, Number* /*z_U*/, Index /*m*/, bool init_lambda, Number* /*lambda*/ ) { DBG_ASSERT(init_x); (void) init_x; DBG_ASSERT(!init_z); (void) init_z; DBG_ASSERT(!init_lambda); (void) init_lambda; // Set starting point for y for( Index jx = 0; jx <= Nx_; jx++ ) { for( Index it = 0; it <= Nt_; it++ ) { x[y_index(jx, it)] = 0.; } } // for u for( Index i = 1; i <= Nt_; i++ ) { x[u_index(i)] = (ub_u_ + lb_u_) / 2.; } return true; } template bool MittelmannParaCntrlBase::get_scaling_parameters( Number& obj_scaling, bool& use_x_scaling, Index /*n*/, Number* /*x_scaling*/, bool& use_g_scaling, Index /*m*/, Number* /*g_scaling*/ ) { obj_scaling = 1. / Min(dx_, dt_); use_x_scaling = false; use_g_scaling = false; return true; } template bool MittelmannParaCntrlBase::eval_f( Index /*n*/, const Number* x, bool /*new_x*/, Number& obj_value ) { // Deviation of y from target Number a = x[y_index(0, Nt_)] - y_T_[0]; Number sum = 0.5 * a * a; for( Index jx = 1; jx < Nx_; jx++ ) { a = x[y_index(jx, Nt_)] - y_T_[jx]; sum += a * a; } a = x[y_index(Nx_, Nt_)] - y_T_[Nx_]; sum += 0.5 * a * a; obj_value = 0.5 * dx_ * sum; // smoothing for control if( alpha_ != .0 ) { sum = 0.5 * x[u_index(Nt_)] * x[u_index(Nt_)]; for( Index it = 1; it < Nt_; it++ ) { sum += x[u_index(it)] * x[u_index(it)]; } obj_value += 0.5 * alpha_ * dt_ * sum; } // third term sum = 0.; for( Index it = 1; it < Nt_; it++ ) { sum += a_y_[it - 1] * x[y_index(Nx_, it)] + a_u_[it - 1] * x[u_index(it)]; } sum += 0.5 * (a_y_[Nt_ - 1] * x[y_index(Nx_, Nt_)] + a_u_[Nt_ - 1] * x[u_index(Nt_)]); obj_value += dt_ * sum; return true; } template bool MittelmannParaCntrlBase::eval_grad_f( Index /*n*/, const Number* x, bool /*new_x*/, Number* grad_f ) { // First set all y entries to zero for( Index jx = 0; jx <= Nx_; jx++ ) { for( Index it = 0; it <= Nt_; it++ ) { grad_f[y_index(jx, it)] = 0.; } } // y entries from y target grad_f[y_index(0, Nt_)] = 0.5 * dx_ * (x[y_index(0, Nt_)] - y_T_[0]); for( Index jx = 1; jx < Nx_; jx++ ) { grad_f[y_index(jx, Nt_)] = dx_ * (x[y_index(jx, Nt_)] - y_T_[jx]); } grad_f[y_index(Nx_, Nt_)] = 0.5 * dx_ * (x[y_index(Nx_, Nt_)] - y_T_[Nx_]); // y entries from thrid term for( Index it = 1; it < Nt_; it++ ) { grad_f[y_index(Nx_, it)] = dt_ * a_y_[it - 1]; } grad_f[y_index(Nx_, Nt_)] += 0.5 * dt_ * a_y_[Nt_ - 1]; // u entries from smoothing and third term for( Index it = 1; it < Nt_; it++ ) { grad_f[u_index(it)] = alpha_ * dt_ * x[u_index(it)] + dt_ * a_u_[it - 1]; } grad_f[u_index(Nt_)] = 0.5 * dt_ * (alpha_ * x[u_index(Nt_)] + a_u_[Nt_ - 1]); return true; } template bool MittelmannParaCntrlBase::eval_g( Index /*n*/, const Number* x, bool /*new_x*/, Index m, Number* g ) { typename T::ProblemSpecs p; Index ig = 0; Number f = 1. / (2. * dx_ * dx_); for( Index jx = 1; jx < Nx_; jx++ ) { for( Index it = 0; it < Nt_; it++ ) { g[ig] = (x[y_index(jx, it)] - x[y_index(jx, it + 1)]) / dt_ + f * (x[y_index(jx - 1, it)] - 2. * x[y_index(jx, it)] + x[y_index(jx + 1, it)] + x[y_index(jx - 1, it + 1)] - 2. * x[y_index(jx, it + 1)] + x[y_index(jx + 1, it + 1)]); ig++; } } for( Index it = 1; it <= Nt_; it++ ) { g[ig] = (x[y_index(2, it)] - 4. * x[y_index(1, it)] + 3. * x[y_index(0, it)]); ig++; } f = 1. / (2. * dx_); for( Index it = 1; it <= Nt_; it++ ) { g[ig] = f * (x[y_index(Nx_ - 2, it)] - 4. * x[y_index(Nx_ - 1, it)] + 3. * x[y_index(Nx_, it)]) + beta_ * x[y_index(Nx_, it)] - x[u_index(it)] + p.phi(x[y_index(Nx_, it)]); ig++; } DBG_ASSERT(ig == m); (void) m; return true; } template bool MittelmannParaCntrlBase::eval_jac_g( Index /*n*/, const Number* x, bool /*new_x*/, Index m, Index /*nele_jac*/, Index* iRow, Index* jCol, Number* values ) { typename T::ProblemSpecs p; Index ijac = 0; if( values == NULL ) { Index ig = 0; for( Index jx = 1; jx < Nx_; jx++ ) { for( Index it = 0; it < Nt_; it++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(jx - 1, it); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(jx, it); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(jx + 1, it); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(jx - 1, it + 1); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(jx, it + 1); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(jx + 1, it + 1); ijac++; ig++; } } for( Index it = 1; it <= Nt_; it++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(0, it); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(1, it); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(2, it); ijac++; ig++; } for( Index it = 1; it <= Nt_; it++ ) { iRow[ijac] = ig; jCol[ijac] = y_index(Nx_ - 2, it); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(Nx_ - 1, it); ijac++; iRow[ijac] = ig; jCol[ijac] = y_index(Nx_, it); ijac++; iRow[ijac] = ig; jCol[ijac] = u_index(it); ijac++; ig++; } DBG_ASSERT(ig == m); (void) m; } else { Number f = 1. / (2. * dx_ * dx_); Number f2 = 1. / dt_; for( Index jx = 1; jx < Nx_; jx++ ) { for( Index it = 0; it < Nt_; it++ ) { values[ijac++] = f; values[ijac++] = f2 - 2. * f; values[ijac++] = f; values[ijac++] = f; values[ijac++] = -f2 - 2. * f; values[ijac++] = f; } } for( Index it = 1; it <= Nt_; it++ ) { values[ijac++] = 3.; values[ijac++] = -4.; values[ijac++] = 1.; } f = 1. / (2. * dx_); for( Index it = 1; it <= Nt_; it++ ) { values[ijac++] = f; values[ijac++] = -4. * f; values[ijac++] = 3. * f + beta_ + p.phi_dy(x[y_index(Nx_, it)]); values[ijac++] = -1.; } } return true; } template bool MittelmannParaCntrlBase::eval_h( Index /*n*/, const Number* x, bool /*new_x*/, Number obj_factor, Index /*m*/, const Number* lambda, bool /*new_lambda*/, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { typename T::ProblemSpecs p; Index ihes = 0; if( values == NULL ) { // y values from objective for( Index jx = 0; jx <= Nx_; jx++ ) { iRow[ihes] = y_index(jx, Nt_); jCol[ihes] = y_index(jx, Nt_); ihes++; } // u from objective for( Index it = 1; it <= Nt_; it++ ) { iRow[ihes] = u_index(it); jCol[ihes] = u_index(it); ihes++; } // constraint if( !p.phi_dydy_always_zero() ) { for( Index it = 1; it <= Nt_; it++ ) { iRow[ihes] = y_index(Nx_, it); jCol[ihes] = y_index(Nx_, it); ihes++; } } } else { // y values from objective values[ihes++] = obj_factor * 0.5 * dx_; for( Index jx = 1; jx < Nx_; jx++ ) { values[ihes++] = obj_factor * dx_; } values[ihes++] = obj_factor * 0.5 * dx_; // u from objective for( Index it = 1; it < Nt_; it++ ) { values[ihes++] = obj_factor * alpha_ * dt_; } values[ihes++] = obj_factor * 0.5 * alpha_ * dt_; // constrainT if( !p.phi_dydy_always_zero() ) { Index ig = (Nx_ - 1) * Nt_ + Nt_; for( Index it = 1; it <= Nt_; it++ ) { values[ihes++] = lambda[ig++] * p.phi_dydy(x[y_index(Nx_, it)]); } } } DBG_ASSERT(ihes == nele_hess); (void) nele_hess; return true; } template void MittelmannParaCntrlBase::finalize_solution( SolverReturn /*status*/, Index /*n*/, const Number* /*x*/, const Number* /*z_L*/, const Number* /*z_U*/, Index /*m*/, const Number* /*g*/, const Number* /*lambda*/, Number /*obj_value*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { } class MittelmannParaCntrl5_1 { public: class ProblemSpecs { public: ProblemSpecs() : pi_(4. * atan(1.)), exp13_(std::exp(1. / 3.)), exp23_(std::exp(2. / 3.)), exp1_(std::exp(1.)), expm1_(std::exp(-1.)), sqrt2_(std::sqrt(2.)) { } Number T() { return 1.; } Number l() { return pi_ / 4.; } Number lb_y() { return -1e20; } Number ub_y() { return 1e20; } Number lb_u() { return 0.; } Number ub_u() { return 1.; } Number alpha() { return sqrt2_ / 2. * (exp23_ - exp13_); } Number beta() { return 1.; } inline Number y_T( Number x ) { return (exp1_ + expm1_) * std::cos(x); } inline Number a( Number x ) { return std::cos(x); } inline Number a_y( Number t ) { return -std::exp(-2. * t); } inline Number a_u( Number /*t*/ ) { return sqrt2_ / 2. * exp13_; } inline Number b( Number t ) { return std::exp(Number(-4.) * t) / Number(4.) - Min(Number(1.), Max(Number(0.), (std::exp(t) - exp13_) / (exp23_ - exp13_))); } inline Number phi( Number y ) { return y * std::pow(std::abs(y), 3); } inline Number phi_dy( Number y ) { return 4. * std::pow(std::abs(y), 3); } inline Number phi_dydy( Number y ) { return 12. * y * y; } inline bool phi_dydy_always_zero() { return false; } private: const Number pi_; const Number exp13_; const Number exp23_; const Number exp1_; const Number expm1_; const Number sqrt2_; }; }; class MittelmannParaCntrl5_2_1 { public: class ProblemSpecs { public: ProblemSpecs() { } Number T() { return 1.58; } Number l() { return 1.; } Number lb_y() { return -1e20; } Number ub_y() { return 1e20; } Number lb_u() { return -1.; } Number ub_u() { return 1.; } Number alpha() { return 0.001; } Number beta() { return 1.; } inline Number y_T( Number x ) { return .5 * (1. - x * x); } inline Number a( Number /*x*/ ) { return 0.; } inline Number a_y( Number /*t*/ ) { return 0.; } inline Number a_u( Number /*t*/ ) { return 0.; } inline Number b( Number /*t*/ ) { return 0.; } inline Number phi( Number /*y*/ ) { return 0.; } inline Number phi_dy( Number /*y*/ ) { return 0.; } inline Number phi_dydy( Number /*y*/ ) { DBG_ASSERT(false); return 0.; } inline bool phi_dydy_always_zero() { return true; } }; }; class MittelmannParaCntrl5_2_2 { public: class ProblemSpecs { public: ProblemSpecs() { } Number T() { return 1.58; } Number l() { return 1.; } Number lb_y() { return -1e20; } Number ub_y() { return 1e20; } Number lb_u() { return -1.; } Number ub_u() { return 1.; } Number alpha() { return 0.001; } Number beta() { return 0.; } inline Number y_T( Number x ) { return .5 * (1. - x * x); } inline Number a( Number /*x*/ ) { return 0.; } inline Number a_y( Number /*t*/ ) { return 0.; } inline Number a_u( Number /*t*/ ) { return 0.; } inline Number b( Number /*t*/ ) { return 0.; } inline Number phi( Number y ) { return y * y; } inline Number phi_dy( Number y ) { return 2. * y; } inline Number phi_dydy( Number /*y*/ ) { return 2.; } inline bool phi_dydy_always_zero() { return false; } }; }; class MittelmannParaCntrl5_2_3 { public: class ProblemSpecs { public: ProblemSpecs() { } Number T() { return 1.58; } Number l() { return 1.; } Number lb_y() { return 0.; } Number ub_y() { return 0.675; } Number lb_u() { return -1.; } Number ub_u() { return 1.; } Number alpha() { return 0.001; } Number beta() { return 0.; } inline Number y_T( Number x ) { return .5 * (1. - x * x); } inline Number a( Number /*x*/ ) { return 0.; } inline Number a_y( Number /*t*/ ) { return 0.; } inline Number a_u( Number /*t*/ ) { return 0.; } inline Number b( Number /*t*/ ) { return 0.; } inline Number phi( Number y ) { return y * y; } inline Number phi_dy( Number y ) { return 2. * y; } inline Number phi_dydy( Number /*y*/ ) { return 2.; } inline bool phi_dydy_always_zero() { return false; } }; }; class MittelmannParaCntrl5_try { public: class ProblemSpecs { public: ProblemSpecs() : pi_(4. * atan(1.)), exp13_(std::exp(1. / 3.)), exp23_(std::exp(2. / 3.)), exp1_(std::exp(1.)), expm1_(std::exp(-1.)), sqrt2_(std::sqrt(2.)) { } Number T() { return 1.; } Number l() { return pi_ / 4.; } Number lb_y() { return -1e20; } Number ub_y() { return 1e20; } Number lb_u() { return 0.; } Number ub_u() { return 1.; } Number alpha() { return sqrt2_ / 2. * (exp23_ - exp13_); } Number beta() { return 1.; } inline Number y_T( Number x ) { return (exp1_ + expm1_) * std::cos(x); } inline Number a( Number x ) { return std::cos(x); } inline Number a_y( Number t ) { return -std::exp(-2. * t); } inline Number a_u( Number /*t*/ ) { return sqrt2_ / 2. * exp13_; } inline Number b( Number t ) { return std::exp(Number(-4.) * t) / 4. - Min(Number(1.), Max(Number(0.), (std::exp(t) - exp13_) / (exp23_ - exp13_))); } inline Number phi( Number y ) { return -y * std::sin(y / 10.); } inline Number phi_dy( Number y ) { return -y * std::cos(y / 10.) / 10. - std::sin(y / 10.); } inline Number phi_dydy( Number y ) { return y * std::sin(y / 10.) / 100.; } inline bool phi_dydy_always_zero() { return false; } private: const Number pi_; const Number exp13_; const Number exp23_; const Number exp1_; const Number expm1_; const Number sqrt2_; }; }; #endif coinor-ipopt-3.14.17/examples/ScalableProblems/README000066400000000000000000000015701473776672200222510ustar00rootroot00000000000000In this directory are a number of scalable problems. Compilation: After a 'make install' for the distribution, type 'make' in this directory to build the executable 'solve_problem' Usage: Typing 'solve_problem list' will show the list of all registered problems. Typing 'solve_problem PROBLEM_NAME N' will solve a problem, where PROBLEM_NAME is the name of a registered problem, and N is a positive integer determining the size of the problem (the actual number of variables can be much larger, e.g. N*N). For some problems, certain restrictions apply; if an invalid N is given, those conditions will be printed. The implementation in MittelmannDist* examples are using virtual methods to overload the specific problem functions for the individual examples. A more efficient implementation using templates is done in MittelmannParaCntrl.hpp, which is a better example for coding. coinor-ipopt-3.14.17/examples/ScalableProblems/RegisteredTNLP.cpp000066400000000000000000000023571473776672200246740ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-20 #include "RegisteredTNLP.hpp" #include std::map >& RegisteredTNLPListMap() { // cppcheck-suppress threadsafety-threadsafety static std::map > tnlp_map_; return tnlp_map_; } void RegisteredTNLPs::RegisterTNLP( const SmartPtr& tnlp, const std::string& name ) { RegisteredTNLPListMap()[name] = GetRawPtr(tnlp); } SmartPtr RegisteredTNLPs::GetTNLP( const std::string& name ) { SmartPtr retval = NULL; std::map >::iterator it; it = RegisteredTNLPListMap().find(name); if( it != RegisteredTNLPListMap().end() ) { retval = it->second; } return retval; } void RegisteredTNLPs::PrintRegisteredProblems() { for( std::map >::iterator it = RegisteredTNLPListMap().begin(); it != RegisteredTNLPListMap().end(); ++it ) { printf("%s\n", it->first.c_str()); } } coinor-ipopt-3.14.17/examples/ScalableProblems/RegisteredTNLP.hpp000066400000000000000000000047261473776672200247030ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2005-10-20 #ifndef __REGISTEREDTNLPS_HPP__ #define __REGISTEREDTNLPS_HPP__ #include "IpTNLP.hpp" #include using namespace Ipopt; class RegisteredTNLP: public TNLP { public: RegisteredTNLP() : interrupted_(false) { } /** Initialize internal parameters. * * @return false, if N has an invalid value */ virtual bool InitializeProblem( Index N /**< determines problems size */ ) = 0; bool intermediate_callback( AlgorithmMode /*mode*/, Index /*iter*/, Number /*obj_value*/, Number /*inf_pr*/, Number /*inf_du*/, Number /*mu*/, Number /*d_norm*/, Number /*regularization_size*/, Number /*alpha_du*/, Number /*alpha_pr*/, Index /*ls_trials*/, const IpoptData* /*ip_data*/, IpoptCalculatedQuantities* /*ip_cq*/ ) { /* returning false makes Ipopt stop */ return !interrupted_; } bool interrupted_; }; class RegisteredTNLPs { public: RegisteredTNLPs( const SmartPtr& tnlp, const std::string& name ) { RegisterTNLP(tnlp, name); } virtual ~RegisteredTNLPs() { } static SmartPtr GetTNLP( const std::string& name ); static void PrintRegisteredProblems(); private: void RegisterTNLP( const SmartPtr& tnlp, const std::string& name ); SmartPtr tnlp_; }; #define REGISTER_TNLP(class_constructor, name) \ class RegisteredTNLP_Setup_ ## name : public RegisteredTNLPs \ { \ public: \ RegisteredTNLP_Setup_ ## name() \ : \ RegisteredTNLPs(new class_constructor, #name) \ { } \ RegisteredTNLP_Setup_ ## name* KeepCompilerFromRemovingThis(); \ }; \ \ RegisteredTNLP_Setup_ ## name RegisteredTNLP_Setup_ ## name ## instance_; \ RegisteredTNLP_Setup_ ## name* \ RegisteredTNLP_Setup_ ## name::KeepCompilerFromRemovingThis() \ { return &RegisteredTNLP_Setup_ ## name ## instance_; } //static RegisteredTNLP_Setup_ ## name RegisteredTNLP_Setup_ ## name ## instance #endif coinor-ipopt-3.14.17/examples/ScalableProblems/solve_problem.cpp000066400000000000000000000145331473776672200247500ustar00rootroot00000000000000// Copyright (C) 2005, 2009 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Andreas Waechter IBM 2004-11-05 #include "IpIpoptApplication.hpp" #include "IpUtils.hpp" #include "RegisteredTNLP.hpp" #include #include #include #include //********************************************************************** // Stuff for benchmarking // Enable this define to allow passing timelimit as 3rd program parameter // #define TIME_LIMIT //********************************************************************** using namespace Ipopt; using namespace std; // This could probably be done more elegant and automatically, but I // can't get it to work right now. For now, list explicitly the // problems we want to include: #include "LuksanVlcek1.hpp" REGISTER_TNLP(LuksanVlcek1(0, 0), LukVlE1) REGISTER_TNLP(LuksanVlcek1(-1., 0.), LukVlI1) #include "LuksanVlcek2.hpp" REGISTER_TNLP(LuksanVlcek2(0, 0), LukVlE2) REGISTER_TNLP(LuksanVlcek2(-1., 0.), LukVlI2) #include "LuksanVlcek3.hpp" REGISTER_TNLP(LuksanVlcek3(0, 0), LukVlE3) REGISTER_TNLP(LuksanVlcek3(-1., 0.), LukVlI3) #include "LuksanVlcek4.hpp" REGISTER_TNLP(LuksanVlcek4(0, 0), LukVlE4) REGISTER_TNLP(LuksanVlcek4(-1., 0.), LukVlI4) #include "LuksanVlcek5.hpp" REGISTER_TNLP(LuksanVlcek5(0, 0), LukVlE5) REGISTER_TNLP(LuksanVlcek5(-1., 0.), LukVlI5) #include "LuksanVlcek6.hpp" REGISTER_TNLP(LuksanVlcek6(0, 0), LukVlE6) REGISTER_TNLP(LuksanVlcek6(-1., 0.), LukVlI6) #include "LuksanVlcek7.hpp" REGISTER_TNLP(LuksanVlcek7(0, 0), LukVlE7) REGISTER_TNLP(LuksanVlcek7(-1., 0.), LukVlI7) #include "MittelmannBndryCntrlDiri.hpp" REGISTER_TNLP(MittelmannBndryCntrlDiri1, MBndryCntrl1) REGISTER_TNLP(MittelmannBndryCntrlDiri2, MBndryCntrl2) REGISTER_TNLP(MittelmannBndryCntrlDiri3, MBndryCntrl3) REGISTER_TNLP(MittelmannBndryCntrlDiri4, MBndryCntrl4) #include "MittelmannBndryCntrlDiri3D.hpp" REGISTER_TNLP(MittelmannBndryCntrlDiri3D, MBndryCntrl_3D) #include "MittelmannBndryCntrlDiri3D_27.hpp" REGISTER_TNLP(MittelmannBndryCntrlDiri3D_27, MBndryCntrl_3D_27) REGISTER_TNLP(MittelmannBndryCntrlDiri3D_27BT, MBndryCntrl_3D_27BT) #include "MittelmannBndryCntrlDiri3Dsin.hpp" REGISTER_TNLP(MittelmannBndryCntrlDiri3Dsin, MBndryCntrl_3Dsin) #include "MittelmannBndryCntrlNeum.hpp" REGISTER_TNLP(MittelmannBndryCntrlNeum1, MBndryCntrl5) REGISTER_TNLP(MittelmannBndryCntrlNeum2, MBndryCntrl6) REGISTER_TNLP(MittelmannBndryCntrlNeum3, MBndryCntrl7) REGISTER_TNLP(MittelmannBndryCntrlNeum4, MBndryCntrl8) #include "MittelmannDistCntrlDiri.hpp" REGISTER_TNLP(MittelmannDistCntrlDiri1, MDistCntrl1) REGISTER_TNLP(MittelmannDistCntrlDiri2, MDistCntrl2) REGISTER_TNLP(MittelmannDistCntrlDiri3, MDistCntrl3) REGISTER_TNLP(MittelmannDistCntrlDiri3a, MDistCntrl3a) #include "MittelmannDistCntrlNeumA.hpp" REGISTER_TNLP(MittelmannDistCntrlNeumA1, MDistCntrl4) REGISTER_TNLP(MittelmannDistCntrlNeumA2, MDistCntrl5) REGISTER_TNLP(MittelmannDistCntrlNeumA3, MDistCntrl6a) #include "MittelmannDistCntrlNeumB.hpp" REGISTER_TNLP(MittelmannDistCntrlNeumB1, MDistCntrl4a) REGISTER_TNLP(MittelmannDistCntrlNeumB2, MDistCntrl5a) REGISTER_TNLP(MittelmannDistCntrlNeumB3, MDistCntrl6) #include "MittelmannParaCntrl.hpp" REGISTER_TNLP(MittelmannParaCntrlBase, MPara5_1) REGISTER_TNLP(MittelmannParaCntrlBase, MPara5_2_1) REGISTER_TNLP(MittelmannParaCntrlBase, MPara5_2_2) REGISTER_TNLP(MittelmannParaCntrlBase, MPara5_2_3) static void print_problems() { printf("\nList of all registered problems:\n\n"); RegisteredTNLPs::PrintRegisteredProblems(); } int main( int argc, char* argv[] ) { if( argc == 2 && !strcmp(argv[1], "list") ) { print_problems(); return 0; } #ifdef TIME_LIMIT int runtime; if( argc == 4 ) { runtime = atoi(argv[3]); } else #endif if( argc != 3 && argc != 1 ) { printf("Usage: %s (this will ask for problem name)\n", argv[0]); printf(" %s ProblemName N\n", argv[0]); printf(" where N is a positive parameter determining problem size\n"); printf(" %s list\n", argv[0]); printf(" to list all registered problems.\n"); return -1; } SmartPtr tnlp; Index N; if( argc != 1 ) { // Create an instance of your nlp... tnlp = RegisteredTNLPs::GetTNLP(argv[1]); if( !IsValid(tnlp) ) { printf("Problem with name \"%s\" not known.\n", argv[1]); print_problems(); return -2; } N = atoi(argv[2]); } else { bool done = false; while( !done ) { string inputword; cout << "Enter problem name (or \"list\" for all available names):\n"; cin >> inputword; if( inputword == "list" ) { print_problems(); } else { tnlp = RegisteredTNLPs::GetTNLP(inputword); if( !IsValid(tnlp) ) { printf("Problem with name \"%s\" not known.\n", inputword.c_str()); } else { done = true; } } } cout << "Enter problem size:\n"; cin >> N; } if( N <= 0 ) { printf("Given problem size is invalid.\n"); return -3; } bool retval = tnlp->InitializeProblem(N); if( !retval ) { printf("Cannot initialize problem. Abort.\n"); return -4; } // Create an instance of the IpoptApplication // We are using the factory, since this allows us to compile this // example with an Ipopt Windows DLL SmartPtr app = IpoptApplicationFactory(); ApplicationReturnStatus status; status = app->Initialize(); if( status != Solve_Succeeded ) { printf("\n\n*** Error during initialization!\n"); return (int) status; } // Set option to use internal scaling // DOES NOT WORK FOR VLUKL* PROBLEMS: // app->Options()->SetStringValueIfUnset("nlp_scaling_method", "user-scaling"); #ifdef TIME_LIMIT app->Options()->SetNumericValue("max_wall_time", runtime); #endif Ipopt::RegisterInterruptHandler(NULL, &tnlp->interrupted_, 5); status = app->OptimizeTNLP(GetRawPtr(tnlp)); Ipopt::UnregisterInterruptHandler(); return (int) status; } coinor-ipopt-3.14.17/examples/ScalableProblems_java/000077500000000000000000000000001473776672200223675ustar00rootroot00000000000000coinor-ipopt-3.14.17/examples/ScalableProblems_java/LuksanVlcek1.java000066400000000000000000000205421473776672200255400ustar00rootroot00000000000000/* Copyright (C) 2007 VRTech Industrial Technologies - www.vrtech.com.br. * Copyright (C) 2007 Tong Kewei, Beihang University, - www.buaa.edu.cn. * All Rights Reserved. * This code is published under the Eclipse Public License. */ /** Implementation of Example 5.1 from "Sparse and Parially Separable Test Problems for Unconstrained and Equality Constrained Optimization" by L. Luksan and J. Vlcek. * * This code is based on an Ipopt example file with same name. * * @author Rafael de Pelegrini Soares, Tong Kewei */ public class LuksanVlcek1 extends Scalable { /** Constructor. * * Here, gl and gu are the bounds for the constraints. * The original formulation is obtained by setting gl and gu to zero. * Using gl lower than gu allows the obtain a problem formulation with inequality * constraints. */ public LuksanVlcek1( String name, double gl, double gu) { super(name, gl, gu); } @Override public boolean initialize( int n) { if( n <= 2 ) { System.out.print("N needs to be at least 3.\n"); return false; } // The problem described in LuksanVlcek1.hpp has 4 variables, x[0] through x[3] this.n = n; m = n - 2; nnz_jac_g = m * 3; nnz_h_lag = n + n - 1; // use the C style numbering of matrix indices (starting at 0) index_style = C_STYLE; // none of the variables have bounds x_l = new double[n]; x_u = new double[n]; for( int i = 0; i < n; ++i ) { x_l[i] = -1e20; x_u[i] = 1e20; } // Set the bounds for the constraints g_l = new double[m]; g_u = new double[m]; for( int i = 0; i < m; ++i ) { g_l[i] = gl; g_u[i] = gu; } // set the starting point x = new double[n]; for( int i = 0; i < n / 2; ++i ) { x[2 * i ] = -1.2; x[2 * i + 1] = 1.0; } if (n % 2 == 1) { x[n - 1] = -1.2; } return true; } protected boolean get_bounds_info( int n, double[] x_l, double[] x_u, int m, double[] g_l, double[] g_u) { // none of the variables have bounds for( int i = 0; i < n; ++i ) { x_l[i] = -1e20; x_u[i] = 1e20; } // Set the bounds for the constraints for( int i = 0; i < m; ++i ) { g_l[i] = gl; g_u[i] = gu; } return true; } protected boolean get_starting_point( int n, boolean init_x, double[] x, boolean init_z, double[] z_L, double[] z_U, int m, boolean init_lambda, double[] lambda) { for( int i = 0; i < n / 2; ++i ) { x[2 * i ] = -1.2; x[2 * i + 1] = 1.0; } if (n % 2 == 1) { x[n - 1] = -1.2; } return true; } @Override protected boolean eval_f( int n, double[] x, boolean new_x, double[] obj_value) { obj_value[0] = 0.0; for( int i = 0; i < n - 1; ++i ) { double a1 = x[i] * x[i] - x[i + 1]; double a2 = x[i] - 1.0; obj_value[0] += 100.0 * a1 * a1 + a2 * a2; } return true; } @Override protected boolean eval_g( int n, double[] x, boolean new_x, int m, double[] g) { for( int i = 0; i < n - 2; ++i ) g[i] = 3.0 * Math.pow(x[i + 1], 3.0) + 2.0 * x[i + 2] - 5.0 + Math.sin(x[i + 1] - x[i + 2]) * Math.sin(x[i + 1] + x[i + 2]) + 4.0 * x[i + 1] - x[i] * Math.exp(x[i] - x[i + 1]) - 3.0; return true; } @Override protected boolean eval_grad_f( int n, double[] x, boolean new_x, double[] grad_f) { grad_f[0] = 0.0; for( int i = 0; i < n - 1; ++i ) { grad_f[i] += 400.0 * x[i] * (x[i] * x[i] - x[i + 1]) + 2.0 * (x[i] - 1.0); grad_f[i + 1] = -200.0 * (x[i] * x[i] - x[i + 1]); } return true; } @Override protected boolean eval_jac_g( int n, double[] x, boolean new_x, int m, int nele_jac, int[] iRow, int[] jCol, double[] values) { if( values == null ) { // return the structure of the jacobian int ijac = 0; for( int i = 0; i < n - 2; ++i ) { iRow[ijac] = i; jCol[ijac] = i; ijac++; iRow[ijac] = i; jCol[ijac] = i + 1; ijac++; iRow[ijac] = i; jCol[ijac] = i + 2; ijac++; } } else { // return the values of the jacobian of the constraints int ijac = 0; for( int i = 0; i < n - 2; ++i ) { // x[i] values[ijac] = -(1.0 + x[i]) * Math.exp(x[i] - x[i + 1]); ijac++; // x[i+1] values[ijac] = 9.0 * x[i + 1] * x[i + 1] + Math.cos(x[i + 1] - x[i + 2]) * Math.sin(x[i + 1] + x[i + 2]) + Math.sin(x[i + 1] - x[i + 2]) * Math.cos(x[i + 1] + x[i + 2]) + 4.0 + x[i] * Math.exp(x[i] - x[i + 1]); ijac++; // x[i+2] values[ijac] = 2.0 - Math.cos(x[i + 1] - x[i + 2]) * Math.sin(x[i + 1] + x[i + 2]) + Math.sin(x[i + 1] - x[i + 2]) * Math.cos(x[i + 1] + x[i + 2]); ijac++; } } return true; } @Override protected boolean eval_h( int n, double[] x, boolean new_x, double obj_factor, int m, double[] lambda, boolean new_lambda, int nele_hess, int[] iRow, int[] jCol, double[] values) { if( values == null ) { int ihes = 0; for( int i = 0; i < n; ++i ) { iRow[ihes] = i; jCol[ihes] = i; ++ihes; if( i < n - 1 ) { iRow[ihes] = i; jCol[ihes] = i + 1; ihes++; } } assert ihes == nele_hess; } else { int ihes = 0; for( int i = 0; i < n; ++i ) { // x[i],x[i] if( i < n - 1 ) { values[ihes] = obj_factor * (2.0 + 400.0 * (3.0 * x[i] * x[i] - x[i + 1])); if (i < n - 2) { values[ihes] -= lambda[i] * (2.0 + x[i]) * Math.exp(x[i] - x[i + 1]); } } else { values[ihes] = 0.; } if( i > 0 ) { // x[i+1]x[i+1] values[ihes] += obj_factor * 200.0; if( i < n - 1 ) values[ihes] += lambda[i - 1] * (18.0 * x[i] - 2.0 * Math.sin(x[i] - x[i + 1]) * Math.sin(x[i] + x[i + 1]) + 2.0 * Math.cos(x[i] - x[i + 1]) * Math.cos(x[i] + x[i + 1]) - x[i - 1] * Math.exp(x[i - 1] - x[i])); } if( i > 1 ) // x[i+2]x[i+2] values[ihes] += lambda[i - 2] * (-2.0 * Math.sin(x[i - 1] - x[i]) * Math.sin(x[i - 1] + x[i]) - 2.0 * Math.cos(x[i - 1] - x[i]) * Math.cos(x[i - 1] + x[i])); ihes++; if( i < n - 1 ) { // x[i],x[i+1] values[ihes] = obj_factor * (-400.0) * x[i]; if( i < n - 2 ) { values[ihes] += lambda[i] * (1.0 + x[i]) * Math.exp(x[i] - x[i + 1]); } /* * if (i>0) { // x[i+1],x[i+2] values[ihes] += lambda[i-1]*( * sin(x[i]-x[i+1])*sin(x[i]+x[i+1]) + * cos(x[i]-x[i+1])*cos(x[i]+x[i+1]) - * cos(x[i]-x[i+1])*cos(x[i]+x[i+1]) - * sin(x[i]-x[i+1])*sin(x[i]+x[i+1]) ); } */ ihes++; } } assert ihes == nele_hess; } return true; } } coinor-ipopt-3.14.17/examples/ScalableProblems_java/Makefile.in000066400000000000000000000021311473776672200244310ustar00rootroot00000000000000# Copyright (C) 2007, 2011 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. # # Author: Andreas Waechter 2007-10-08 IBM # NOTE: We assume here that there are no spaces in paths. # If you are on Windows and have Java in a path like C:\Program Files\Java, # try setting JAVA_HOME to the DOS equivalent C:\Progra~1 or similar. # Java compiler JAVAC = @JAVAC@ # Java runtime JAVA = @JAVA@ # Ipopt JAR prefix = @prefix@ exec_prefix = @exec_prefix@ IPOPTJAR = @libdir@/org.coinor.ipopt.jar # Directory to the sources for the (example) problem definition files SRCDIR = @srcdir@ VPATH = @srcdir@ ########################################################################## .SUFFIXES: .java .class .java.class: $(JAVAC) -cp $(IPOPTJAR):. `test -f '$<' || echo '$(SRCDIR)/'`$< -d $(PWD) all : SolveProblem.class SolveProblem.class : LuksanVlcek1.class LuksanVlcek1.class : Scalable.class test : SolveProblem.class $(JAVA) -cp $(IPOPTJAR):. -Djava.library.path=@libdir@ SolveProblem LukVlI1 100 clean : rm -rf *.class coinor-ipopt-3.14.17/examples/ScalableProblems_java/Scalable.java000066400000000000000000000041651473776672200247460ustar00rootroot00000000000000/* Copyright (C) 2007 VRTech Industrial Technologies - www.vrtech.com.br. * Copyright (C) 2007 Tong Kewei, Beihang University, - www.buaa.edu.cn. * All Rights Reserved. * This code is published under the Eclipse Public License. */ import org.coinor.Ipopt; /** * Abstract class for the scalable problems. * * Implementations should derive from this class and implement * {@link #initialize(int)} where all problem size, bounds, and inital guess * should be initialized. Besides the initialization, the abstract functions for * evaluation of objective, bounds, etc need to be implemented. * * @author Rafael de Pelegrini Soares, Tong Kewei */ public abstract class Scalable extends Ipopt { // Problem sizes int n; int m; int nnz_jac_g; int nnz_h_lag; // The bounds double x_l[], x_u[]; double g_l[], g_u[]; // the index style int index_style; // The initial guess and solution double x[]; private String name; protected double gl; protected double gu; /** Constructor. * @param name name of example * @param gl the constraint lower bound value for all elements of g * @param gu the constraint upper bound value for all elements of g */ public Scalable( String name, double gl, double gu) { this.name = name; this.gl = gl; this.gu = gu; } public String toString() { return name; } /** In this function all problem sizes, bounds and initial guess should be initialized. * * @param n the problem size * * @return true if the given size is valid for this problem */ abstract public boolean initialize( int n ); /** Creates the problem based on the already computed problem sizes and bounds. */ public void create() { super.create(n, m, nnz_jac_g, nnz_h_lag, index_style); } public double[] getInitialGuess() { return x; } protected void print( double[] x, String str) { System.out.println(str); for( int i = 0; i < x.length; ++i ) { System.out.println(x[i]); } System.out.println(); } } coinor-ipopt-3.14.17/examples/ScalableProblems_java/SolveProblem.java000066400000000000000000000035551473776672200256530ustar00rootroot00000000000000/* Copyright (C) 2007 VRTech Industrial Technologies - www.vrtech.com.br. * Copyright (C) 2007 Tong Kewei, Beihang University, - www.buaa.edu.cn. * All Rights Reserved. * This code is published under the Eclipse Public License. */ import java.util.HashMap; import org.coinor.Ipopt; /** Class for running several different Scalable problems. * * @author Rafael de Pelegrini Soares, Tong Kewei */ public class SolveProblem { public static void main( String[] args) { HashMap list = new HashMap(); // adding all problems here list.put("LukVlE1", new LuksanVlcek1("LukVlE1", 0.0, 0.0));// E means equal list.put("LukVlI1", new LuksanVlcek1("LukVlI1", -1.0, 0.0));// I means inequal if( args.length < 2 ) { System.out.println("Usage: ProblemName N\n"); System.out.println(" - N is a positive parameter determining problem size"); System.out.println(" - ProblemName is one of:"); // list all problems for( Scalable s : list.values() ) { System.out.println(" " + s); } return; } String problem = args[0]; int n = Integer.parseInt(args[1]); System.out.println("Solving problem " + problem + " for N=" + n); Scalable p = list.get(problem); if( p == null ) { System.out.println("Problem not found!"); return; } if( !p.initialize(n) ) { return; } p.create(); p.OptimizeNLP(); switch( p.getStatus() ) { case Ipopt.SOLVE_SUCCEEDED: case Ipopt.ACCEPTABLE_LEVEL: System.out.println("Solution found."); break; default: System.out.println("** Could not solve problem " + problem + " for N=" + n + ", status: " + p.getStatus()); } } } coinor-ipopt-3.14.17/examples/hs071_c/000077500000000000000000000000001473776672200173205ustar00rootroot00000000000000coinor-ipopt-3.14.17/examples/hs071_c/Makefile.in000066400000000000000000000036571473776672200214000ustar00rootroot00000000000000# Copyright (C) 2003, 2010 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. ########################################################################## # You can modify this example makefile to fit for your own program. # # Usually, you only need to change the four CHANGEME entries below. # ########################################################################## # CHANGEME: This should be the name of your executable EXE = hs071_c@EXEEXT@ # CHANGEME: Here is the name of all object files corresponding to the source # code that you wrote in order to define the problem statement OBJS = hs071_c.@OBJEXT@ # CHANGEME: Additional libraries ADDLIBS = # CHANGEME: Additional flags for compilation (e.g., include flags) ADDINCFLAGS = ########################################################################## # Usually, you don't have to change anything below. Note that if you # # change certain compiler options, you might have to recompile Ipopt. # ########################################################################## # C Compiler command CC = @CC@ # C Compiler options CFLAGS = @CFLAGS@ # additional C Compiler options for linking CLINKFLAGS = @RPATH_FLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ # Include directories @COIN_HAS_PKGCONFIG_TRUE@INCL = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --cflags ipopt` $(ADDINCFLAGS) @COIN_HAS_PKGCONFIG_FALSE@INCL = -I@includedir@/coin-or @IPOPTLIB_CFLAGS@ $(ADDINCFLAGS) # Linker flags @COIN_HAS_PKGCONFIG_TRUE@LIBS = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --libs ipopt` @CXXLIBS@ @COIN_HAS_PKGCONFIG_FALSE@LIBS = -L@libdir@ -lipopt @IPOPTLIB_LFLAGS@ @CXXLIBS@ all: $(EXE) .SUFFIXES: .c .@OBJEXT@ $(EXE): $(OBJS) $(CC) $(CLINKFLAGS) $(CFLAGS) -o $@ $(OBJS) $(ADDLIBS) $(LIBS) clean: rm -rf $(EXE) $(OBJS) ipopt.out .c.@OBJEXT@: $(CC) $(CFLAGS) $(INCL) -c -o $@ $< coinor-ipopt-3.14.17/examples/hs071_c/hs071_c.c000066400000000000000000000332001473776672200206260ustar00rootroot00000000000000/* Copyright (C) 2005, 2011 International Business Machines and others. * All Rights Reserved. * This code is published under the Eclipse Public License. * * Authors: Carl Laird, Andreas Waechter IBM 2005-08-17 */ #include "IpStdCInterface.h" #include #include #include /** This is an example how user_data can be used. */ struct MyUserData { ipnumber g_offset[2]; /**< This is an offset for the constraints. */ IpoptProblem nlp; /**< The problem to be solved. Required in intermediate_cb. */ }; /* Callback Implementations */ static bool eval_f( ipindex n, ipnumber* x, bool new_x, ipnumber* obj_value, UserDataPtr user_data ) { assert(n == 4); (void) n; (void) new_x; (void) user_data; *obj_value = x[0] * x[3] * (x[0] + x[1] + x[2]) + x[2]; return true; } static bool eval_grad_f( ipindex n, ipnumber* x, bool new_x, ipnumber* grad_f, UserDataPtr user_data ) { assert(n == 4); (void) n; (void) new_x; (void) user_data; grad_f[0] = x[0] * x[3] + x[3] * (x[0] + x[1] + x[2]); grad_f[1] = x[0] * x[3]; grad_f[2] = x[0] * x[3] + 1; grad_f[3] = x[0] * (x[0] + x[1] + x[2]); return true; } static bool eval_g( ipindex n, ipnumber* x, bool new_x, ipindex m, ipnumber* g, UserDataPtr user_data ) { struct MyUserData* my_data = user_data; assert(n == 4); (void) n; assert(m == 2); (void) m; (void) new_x; g[0] = x[0] * x[1] * x[2] * x[3] + my_data->g_offset[0]; g[1] = x[0] * x[0] + x[1] * x[1] + x[2] * x[2] + x[3] * x[3] + my_data->g_offset[1]; return true; } static bool eval_jac_g( ipindex n, ipnumber* x, bool new_x, ipindex m, ipindex nele_jac, ipindex* iRow, ipindex* jCol, ipnumber* values, UserDataPtr user_data ) { (void) n; (void) new_x; (void) m; (void) nele_jac; (void) user_data; if( values == NULL ) { /* return the structure of the jacobian */ /* this particular jacobian is dense */ iRow[0] = 0; jCol[0] = 0; iRow[1] = 0; jCol[1] = 1; iRow[2] = 0; jCol[2] = 2; iRow[3] = 0; jCol[3] = 3; iRow[4] = 1; jCol[4] = 0; iRow[5] = 1; jCol[5] = 1; iRow[6] = 1; jCol[6] = 2; iRow[7] = 1; jCol[7] = 3; } else { /* return the values of the jacobian of the constraints */ values[0] = x[1] * x[2] * x[3]; /* 0,0 */ values[1] = x[0] * x[2] * x[3]; /* 0,1 */ values[2] = x[0] * x[1] * x[3]; /* 0,2 */ values[3] = x[0] * x[1] * x[2]; /* 0,3 */ values[4] = 2 * x[0]; /* 1,0 */ values[5] = 2 * x[1]; /* 1,1 */ values[6] = 2 * x[2]; /* 1,2 */ values[7] = 2 * x[3]; /* 1,3 */ } return true; } static bool eval_h( ipindex n, ipnumber* x, bool new_x, ipnumber obj_factor, ipindex m, ipnumber* lambda, bool new_lambda, ipindex nele_hess, ipindex* iRow, ipindex* jCol, ipnumber* values, UserDataPtr user_data ) { (void) n; (void) new_x; (void) m; (void) new_lambda; (void) user_data; if( values == NULL ) { ipindex idx; /* nonzero element counter */ ipindex row; /* row counter for loop */ ipindex col; /* col counter for loop */ /* return the structure. This is a symmetric matrix, fill the lower left * triangle only. */ /* the hessian for this problem is actually dense */ idx = 0; for( row = 0; row < 4; row++ ) { for( col = 0; col <= row; col++ ) { iRow[idx] = row; jCol[idx] = col; idx++; } } assert(idx == nele_hess); (void) nele_hess; } else { /* return the values. This is a symmetric matrix, fill the lower left * triangle only */ /* fill the objective portion */ values[0] = obj_factor * (2 * x[3]); /* 0,0 */ values[1] = obj_factor * (x[3]); /* 1,0 */ values[2] = 0; /* 1,1 */ values[3] = obj_factor * (x[3]); /* 2,0 */ values[4] = 0; /* 2,1 */ values[5] = 0; /* 2,2 */ values[6] = obj_factor * (2 * x[0] + x[1] + x[2]); /* 3,0 */ values[7] = obj_factor * (x[0]); /* 3,1 */ values[8] = obj_factor * (x[0]); /* 3,2 */ values[9] = 0; /* 3,3 */ /* add the portion for the first constraint */ values[1] += lambda[0] * (x[2] * x[3]); /* 1,0 */ values[3] += lambda[0] * (x[1] * x[3]); /* 2,0 */ values[4] += lambda[0] * (x[0] * x[3]); /* 2,1 */ values[6] += lambda[0] * (x[1] * x[2]); /* 3,0 */ values[7] += lambda[0] * (x[0] * x[2]); /* 3,1 */ values[8] += lambda[0] * (x[0] * x[1]); /* 3,2 */ /* add the portion for the second constraint */ values[0] += lambda[1] * 2; /* 0,0 */ values[2] += lambda[1] * 2; /* 1,1 */ values[5] += lambda[1] * 2; /* 2,2 */ values[9] += lambda[1] * 2; /* 3,3 */ } return true; } static IPOPT_UNUSED bool intermediate_cb( ipindex alg_mod, ipindex iter_count, ipnumber obj_value, ipnumber inf_pr, ipnumber inf_du, ipnumber mu, ipnumber d_norm, ipnumber regularization_size, ipnumber alpha_du, ipnumber alpha_pr, ipindex ls_trials, UserDataPtr user_data ) { bool have_iter; bool have_viol; ipnumber x[4]; ipnumber x_L_viol[4]; ipnumber x_U_viol[4]; ipnumber z_L[4]; ipnumber z_U[4]; ipnumber compl_x_L[4]; ipnumber compl_x_U[4]; ipnumber grad_lag_x[4]; ipnumber g[2]; ipnumber lambda[2]; ipnumber constraint_violation[2]; ipnumber compl_g[2]; IpoptProblem nlp = ((struct MyUserData*)user_data)->nlp; have_iter = GetIpoptCurrentIterate(nlp, false, 4, x, z_L, z_U, 2, g, lambda); have_viol = GetIpoptCurrentViolations(nlp, false, 4, x_L_viol, x_U_viol, compl_x_L, compl_x_U, grad_lag_x, 2, constraint_violation, compl_g); printf("Current iterate at iteration %d:\n", (int)iter_count); printf(" %-12s %-12s %-12s %-12s %-12s %-12s %-12s\n", "x", "z_L", "z_U", "bound_viol", "compl_x_L", "compl_x_U", "grad_lag_x"); for( int i = 0; i < 4; ++i ) { if( have_iter ) { printf(" %-12g %-12g %-12g", x[i], z_L[i], z_U[i]); } else { printf(" %-12s %-12s %-12s", "n/a", "n/a", "n/a"); } if( have_viol ) { printf(" %-12g %-12g %-12g %-12g\n", x_L_viol[i] > x_U_viol[i] ? x_L_viol[i] : x_U_viol[i], compl_x_L[i], compl_x_U[i], grad_lag_x[i]); } else { printf(" %-12s %-12s %-12s %-12s\n", "n/a", "n/a", "n/a", "n/a"); } } printf(" %-12s %-12s %-12s %-12s\n", "g(x)", "lambda", "constr_viol", "compl_g"); for( int i = 0; i < 2; ++i ) { if( have_iter ) { printf(" %-12g %-12g", g[i], lambda[i]); } else { printf(" %-12s %-12s", "n/a", "n/a"); } if( have_viol ) { printf(" %-12g %-12g\n", constraint_violation[i], compl_g[i]); } else { printf(" %-12s %-12s\n", "n/a", "n/a"); } } if( inf_pr < 1e-4 ) { return false; } (void) alg_mod; (void) obj_value; (void) inf_du; (void) mu; (void) d_norm; (void) regularization_size; (void) alpha_du; (void) alpha_pr; (void) ls_trials; return true; } /** Main Program */ /* [MAIN] */ int main() { ipindex n = -1; /* number of variables */ ipindex m = -1; /* number of constraints */ ipindex nele_jac; /* number of nonzeros in the Jacobian of the constraints */ ipindex nele_hess; /* number of nonzeros in the Hessian of the Lagrangian (lower or upper triangular part only) */ ipindex index_style; /* indexing style for matrices */ ipnumber* x_L = NULL; /* lower bounds on x */ ipnumber* x_U = NULL; /* upper bounds on x */ ipnumber* g_L = NULL; /* lower bounds on g */ ipnumber* g_U = NULL; /* upper bounds on g */ IpoptProblem nlp = NULL; /* IpoptProblem */ enum ApplicationReturnStatus status; /* Solve return code */ ipnumber* x = NULL; /* starting point and solution vector */ ipnumber* mult_g = NULL; /* constraint multipliers at the solution */ ipnumber* mult_x_L = NULL; /* lower bound multipliers at the solution */ ipnumber* mult_x_U = NULL; /* upper bound multipliers at the solution */ ipnumber obj; /* objective value */ struct MyUserData user_data; /* our user data for the function evaluations */ ipindex i; /* generic counter */ /* set the number of variables and allocate space for the bounds */ n = 4; x_L = (ipnumber*) malloc(sizeof(ipnumber) * n); x_U = (ipnumber*) malloc(sizeof(ipnumber) * n); /* set the values for the variable bounds */ for( i = 0; i < n; i++ ) { x_L[i] = 1.0; x_U[i] = 5.0; } /* set the number of constraints and allocate space for the bounds */ m = 2; g_L = (ipnumber*) malloc(sizeof(ipnumber) * m); g_U = (ipnumber*) malloc(sizeof(ipnumber) * m); /* set the values of the constraint bounds */ g_L[0] = 25; g_U[0] = 2e19; g_L[1] = 40; g_U[1] = 40; /* set the number of nonzeros in the Jacobian and Hessian */ nele_jac = 8; nele_hess = 10; /* set the indexing style to C-style (start counting of rows and column indices at 0) */ index_style = 0; /* create the IpoptProblem */ nlp = CreateIpoptProblem(n, x_L, x_U, m, g_L, g_U, nele_jac, nele_hess, index_style, &eval_f, &eval_g, &eval_grad_f, &eval_jac_g, &eval_h); /* We can free the memory now - the values for the bounds have been * copied internally in CreateIpoptProblem */ free(x_L); free(x_U); free(g_L); free(g_U); /* Set some options. Note the following ones are only examples, * they might not be suitable for your problem. */ AddIpoptNumOption(nlp, "tol", 3.82e-6); AddIpoptStrOption(nlp, "mu_strategy", "adaptive"); AddIpoptStrOption(nlp, "output_file", "ipopt.out"); /* allocate space for the initial point and set the values */ x = (ipnumber*) malloc(sizeof(ipnumber) * n); x[0] = 1.0; x[1] = 5.0; x[2] = 5.0; x[3] = 1.0; /* allocate space to store the bound multipliers at the solution */ mult_g = (ipnumber*) malloc(sizeof(ipnumber) * m); mult_x_L = (ipnumber*) malloc(sizeof(ipnumber) * n); mult_x_U = (ipnumber*) malloc(sizeof(ipnumber) * n); /* Initialize the user data */ user_data.g_offset[0] = 0.; user_data.g_offset[1] = 0.; user_data.nlp = nlp; /* Set the callback method for intermediate user-control. * This is not required, just gives you some intermediate control in * case you need it. */ /* SetIntermediateCallback(nlp, intermediate_cb); */ /* solve the problem */ status = IpoptSolve(nlp, x, NULL, &obj, mult_g, mult_x_L, mult_x_U, &user_data); if( status == Solve_Succeeded ) { printf("\n\nSolution of the primal variables, x\n"); for( i = 0; i < n; i++ ) { printf("x[%d] = %e\n", (int)i, x[i]); } printf("\n\nSolution of the constraint multipliers, lambda\n"); for( i = 0; i < m; i++ ) { printf("lambda[%d] = %e\n", (int)i, mult_g[i]); } printf("\n\nSolution of the bound multipliers, z_L and z_U\n"); for( i = 0; i < n; i++ ) { printf("z_L[%d] = %e\n", (int)i, mult_x_L[i]); } for( i = 0; i < n; i++ ) { printf("z_U[%d] = %e\n", (int)i, mult_x_U[i]); } printf("\n\nObjective value\nf(x*) = %e\n", obj); } else { printf("\n\nERROR OCCURRED DURING IPOPT OPTIMIZATION.\n"); } /* Now we are going to solve this problem again, but with slightly * modified constraints. We change the constraint offset of the * first constraint a bit, and resolve the problem using the warm * start option. */ user_data.g_offset[0] = 0.2; if( status == Solve_Succeeded ) { /* Now resolve with a warmstart. */ AddIpoptStrOption(nlp, "warm_start_init_point", "yes"); /* The following option reduce the automatic modification of the * starting point done my Ipopt. */ AddIpoptNumOption(nlp, "bound_push", 1e-5); AddIpoptNumOption(nlp, "bound_frac", 1e-5); status = IpoptSolve(nlp, x, NULL, &obj, mult_g, mult_x_L, mult_x_U, &user_data); if( status == Solve_Succeeded ) { printf("\n\nSolution of the primal variables, x\n"); for( i = 0; i < n; i++ ) { printf("x[%d] = %e\n", (int)i, x[i]); } printf("\n\nSolution of the constraint multipliers, lambda\n"); for( i = 0; i < m; i++ ) { printf("lambda[%d] = %e\n", (int)i, mult_g[i]); } printf("\n\nSolution of the bound multipliers, z_L and z_U\n"); for( i = 0; i < n; i++ ) { printf("z_L[%d] = %e\n", (int)i, mult_x_L[i]); } for( i = 0; i < n; i++ ) { printf("z_U[%d] = %e\n", (int)i, mult_x_U[i]); } printf("\n\nObjective value\nf(x*) = %e\n", obj); } else { printf("\n\nERROR OCCURRED DURING IPOPT OPTIMIZATION WITH WARM START.\n"); } } /* free allocated memory */ FreeIpoptProblem(nlp); free(x); free(mult_g); free(mult_x_L); free(mult_x_U); return (status == Solve_Succeeded) ? EXIT_SUCCESS : EXIT_FAILURE; } /* [MAIN] */ coinor-ipopt-3.14.17/examples/hs071_cpp/000077500000000000000000000000001473776672200176605ustar00rootroot00000000000000coinor-ipopt-3.14.17/examples/hs071_cpp/Makefile.in000066400000000000000000000037201473776672200217270ustar00rootroot00000000000000# Copyright (C) 2005, 2010 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. ########################################################################## # You can modify this example makefile to fit for your own program. # # Usually, you only need to change the four CHANGEME entries below. # ########################################################################## # CHANGEME: This should be the name of your executable EXE = hs071_cpp@EXEEXT@ # CHANGEME: Here is the name of all object files corresponding to the source # code that you wrote in order to define the problem statement OBJS = hs071_main.@OBJEXT@ \ hs071_nlp.@OBJEXT@ # CHANGEME: Additional libraries ADDLIBS = # CHANGEME: Additional flags for compilation (e.g., include flags) ADDINCFLAGS = ########################################################################## # Usually, you don't have to change anything below. Note that if you # # change certain compiler options, you might have to recompile Ipopt. # ########################################################################## # C++ Compiler command CXX = @CXX@ # C++ Compiler options CXXFLAGS = @CXXFLAGS@ # additional C++ Compiler options for linking CXXLINKFLAGS = @RPATH_FLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ # Include directories @COIN_HAS_PKGCONFIG_TRUE@INCL = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --cflags ipopt` $(ADDINCFLAGS) @COIN_HAS_PKGCONFIG_FALSE@INCL = -I@includedir@/coin-or @IPOPTLIB_CFLAGS@ $(ADDINCFLAGS) # Linker flags @COIN_HAS_PKGCONFIG_TRUE@LIBS = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --libs ipopt` @COIN_HAS_PKGCONFIG_FALSE@LIBS = -L@libdir@ -lipopt @IPOPTLIB_LFLAGS@ all: $(EXE) .SUFFIXES: .cpp .@OBJEXT@ $(EXE): $(OBJS) $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) -o $@ $(OBJS) $(ADDLIBS) $(LIBS) clean: rm -rf $(EXE) $(OBJS) ipopt.out .cpp.@OBJEXT@: $(CXX) $(CXXFLAGS) $(INCL) -c -o $@ $< coinor-ipopt-3.14.17/examples/hs071_cpp/hs071_main.cpp000066400000000000000000000037461473776672200222440ustar00rootroot00000000000000// Copyright (C) 2005, 2009 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2005-08-10 // [MAIN] #include "IpIpoptApplication.hpp" #include "hs071_nlp.hpp" #include using namespace Ipopt; int main( int /*argc*/, char** /*argv*/ ) { // Create a new instance of your nlp // (use a SmartPtr, not raw) SmartPtr mynlp = new HS071_NLP(); // Create a new instance of IpoptApplication // (use a SmartPtr, not raw) // We are using the factory, since this allows us to compile this // example with an Ipopt Windows DLL SmartPtr app = IpoptApplicationFactory(); // Change some options // Note: The following choices are only examples, they might not be // suitable for your optimization problem. app->Options()->SetNumericValue("tol", 3.82e-6); app->Options()->SetStringValue("mu_strategy", "adaptive"); app->Options()->SetStringValue("output_file", "ipopt.out"); // The following overwrites the default name (ipopt.opt) of the options file // app->Options()->SetStringValue("option_file_name", "hs071.opt"); // Initialize the IpoptApplication and process the options ApplicationReturnStatus status; status = app->Initialize(); if( status != Solve_Succeeded ) { std::cout << std::endl << std::endl << "*** Error during initialization!" << std::endl; return (int) status; } // Ask Ipopt to solve the problem status = app->OptimizeTNLP(mynlp); if( status == Solve_Succeeded ) { std::cout << std::endl << std::endl << "*** The problem solved!" << std::endl; } else { std::cout << std::endl << std::endl << "*** The problem FAILED!" << std::endl; } // As the SmartPtrs go out of scope, the reference count // will be decremented and the objects will automatically // be deleted. return (int) status; } // [MAIN] coinor-ipopt-3.14.17/examples/hs071_cpp/hs071_nlp.cpp000066400000000000000000000263021473776672200221020ustar00rootroot00000000000000// Copyright (C) 2005, 2006 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2005-08-16 #include "hs071_nlp.hpp" #include #include using namespace Ipopt; #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wunused-parameter" #endif // constructor HS071_NLP::HS071_NLP( bool printiterate ) : printiterate_(printiterate) { } // destructor HS071_NLP::~HS071_NLP() { } // [TNLP_get_nlp_info] // returns the size of the problem bool HS071_NLP::get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ) { // The problem described in HS071_NLP.hpp has 4 variables, x[0] through x[3] n = 4; // one equality constraint and one inequality constraint m = 2; // in this example the jacobian is dense and contains 8 nonzeros nnz_jac_g = 8; // the Hessian is also dense and has 16 total nonzeros, but we // only need the lower left corner (since it is symmetric) nnz_h_lag = 10; // use the C style indexing (0-based) index_style = TNLP::C_STYLE; return true; } // [TNLP_get_nlp_info] // [TNLP_get_bounds_info] // returns the variable bounds bool HS071_NLP::get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ) { // here, the n and m we gave IPOPT in get_nlp_info are passed back to us. // If desired, we could assert to make sure they are what we think they are. assert(n == 4); assert(m == 2); // the variables have lower bounds of 1 for( Index i = 0; i < 4; i++ ) { x_l[i] = 1.0; } // the variables have upper bounds of 5 for( Index i = 0; i < 4; i++ ) { x_u[i] = 5.0; } // the first constraint g1 has a lower bound of 25 g_l[0] = 25; // the first constraint g1 has NO upper bound, here we set it to 2e19. // Ipopt interprets any number greater than nlp_upper_bound_inf as // infinity. The default value of nlp_upper_bound_inf and nlp_lower_bound_inf // is 1e19 and can be changed through ipopt options. g_u[0] = 2e19; // the second constraint g2 is an equality constraint, so we set the // upper and lower bound to the same value g_l[1] = g_u[1] = 40.0; return true; } // [TNLP_get_bounds_info] // [TNLP_get_starting_point] // returns the initial point for the problem bool HS071_NLP::get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ) { // Here, we assume we only have starting values for x, if you code // your own NLP, you can provide starting values for the dual variables // if you wish assert(init_x == true); assert(init_z == false); assert(init_lambda == false); // initialize to the given starting point x[0] = 1.0; x[1] = 5.0; x[2] = 5.0; x[3] = 1.0; return true; } // [TNLP_get_starting_point] // [TNLP_eval_f] // returns the value of the objective function bool HS071_NLP::eval_f( Index n, const Number* x, bool new_x, Number& obj_value ) { assert(n == 4); obj_value = x[0] * x[3] * (x[0] + x[1] + x[2]) + x[2]; return true; } // [TNLP_eval_f] // [TNLP_eval_grad_f] // return the gradient of the objective function grad_{x} f(x) bool HS071_NLP::eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ) { assert(n == 4); grad_f[0] = x[0] * x[3] + x[3] * (x[0] + x[1] + x[2]); grad_f[1] = x[0] * x[3]; grad_f[2] = x[0] * x[3] + 1; grad_f[3] = x[0] * (x[0] + x[1] + x[2]); return true; } // [TNLP_eval_grad_f] // [TNLP_eval_g] // return the value of the constraints: g(x) bool HS071_NLP::eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ) { assert(n == 4); assert(m == 2); g[0] = x[0] * x[1] * x[2] * x[3]; g[1] = x[0] * x[0] + x[1] * x[1] + x[2] * x[2] + x[3] * x[3]; return true; } // [TNLP_eval_g] // [TNLP_eval_jac_g] // return the structure or values of the Jacobian bool HS071_NLP::eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ) { assert(n == 4); assert(m == 2); if( values == NULL ) { // return the structure of the Jacobian // this particular Jacobian is dense iRow[0] = 0; jCol[0] = 0; iRow[1] = 0; jCol[1] = 1; iRow[2] = 0; jCol[2] = 2; iRow[3] = 0; jCol[3] = 3; iRow[4] = 1; jCol[4] = 0; iRow[5] = 1; jCol[5] = 1; iRow[6] = 1; jCol[6] = 2; iRow[7] = 1; jCol[7] = 3; } else { // return the values of the Jacobian of the constraints values[0] = x[1] * x[2] * x[3]; // 0,0 values[1] = x[0] * x[2] * x[3]; // 0,1 values[2] = x[0] * x[1] * x[3]; // 0,2 values[3] = x[0] * x[1] * x[2]; // 0,3 values[4] = 2 * x[0]; // 1,0 values[5] = 2 * x[1]; // 1,1 values[6] = 2 * x[2]; // 1,2 values[7] = 2 * x[3]; // 1,3 } return true; } // [TNLP_eval_jac_g] // [TNLP_eval_h] //return the structure or values of the Hessian bool HS071_NLP::eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ) { assert(n == 4); assert(m == 2); if( values == NULL ) { // return the structure. This is a symmetric matrix, fill the lower left // triangle only. // the hessian for this problem is actually dense Index idx = 0; for( Index row = 0; row < 4; row++ ) { for( Index col = 0; col <= row; col++ ) { iRow[idx] = row; jCol[idx] = col; idx++; } } assert(idx == nele_hess); } else { // return the values. This is a symmetric matrix, fill the lower left // triangle only // fill the objective portion values[0] = obj_factor * (2 * x[3]); // 0,0 values[1] = obj_factor * (x[3]); // 1,0 values[2] = 0.; // 1,1 values[3] = obj_factor * (x[3]); // 2,0 values[4] = 0.; // 2,1 values[5] = 0.; // 2,2 values[6] = obj_factor * (2 * x[0] + x[1] + x[2]); // 3,0 values[7] = obj_factor * (x[0]); // 3,1 values[8] = obj_factor * (x[0]); // 3,2 values[9] = 0.; // 3,3 // add the portion for the first constraint values[1] += lambda[0] * (x[2] * x[3]); // 1,0 values[3] += lambda[0] * (x[1] * x[3]); // 2,0 values[4] += lambda[0] * (x[0] * x[3]); // 2,1 values[6] += lambda[0] * (x[1] * x[2]); // 3,0 values[7] += lambda[0] * (x[0] * x[2]); // 3,1 values[8] += lambda[0] * (x[0] * x[1]); // 3,2 // add the portion for the second constraint values[0] += lambda[1] * 2; // 0,0 values[2] += lambda[1] * 2; // 1,1 values[5] += lambda[1] * 2; // 2,2 values[9] += lambda[1] * 2; // 3,3 } return true; } // [TNLP_eval_h] // [TNLP_finalize_solution] void HS071_NLP::finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ) { // here is where we would store the solution to variables, or write to a file, etc // so we could use the solution. // For this example, we write the solution to the console std::cout << std::endl << std::endl << "Solution of the primal variables, x" << std::endl; for( Index i = 0; i < n; i++ ) { std::cout << "x[" << i << "] = " << x[i] << std::endl; } std::cout << std::endl << std::endl << "Solution of the bound multipliers, z_L and z_U" << std::endl; for( Index i = 0; i < n; i++ ) { std::cout << "z_L[" << i << "] = " << z_L[i] << std::endl; } for( Index i = 0; i < n; i++ ) { std::cout << "z_U[" << i << "] = " << z_U[i] << std::endl; } std::cout << std::endl << std::endl << "Objective value" << std::endl; std::cout << "f(x*) = " << obj_value << std::endl; std::cout << std::endl << "Final value of the constraints:" << std::endl; for( Index i = 0; i < m; i++ ) { std::cout << "g(" << i << ") = " << g[i] << std::endl; } } // [TNLP_finalize_solution] // [TNLP_intermediate_callback] bool HS071_NLP::intermediate_callback( AlgorithmMode mode, Index iter, Number obj_value, Number inf_pr, Number inf_du, Number mu, Number d_norm, Number regularization_size, Number alpha_du, Number alpha_pr, Index ls_trials, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ) { if( !printiterate_ ) { return true; } Number x[4]; Number x_L_viol[4]; Number x_U_viol[4]; Number z_L[4]; Number z_U[4]; Number compl_x_L[4]; Number compl_x_U[4]; Number grad_lag_x[4]; Number g[2]; Number lambda[2]; Number constraint_violation[2]; Number compl_g[2]; bool have_iter = get_curr_iterate(ip_data, ip_cq, false, 4, x, z_L, z_U, 2, g, lambda); bool have_viol = get_curr_violations(ip_data, ip_cq, false, 4, x_L_viol, x_U_viol, compl_x_L, compl_x_U, grad_lag_x, 2, constraint_violation, compl_g); printf("Current iterate:\n"); printf(" %-12s %-12s %-12s %-12s %-12s %-12s %-12s\n", "x", "z_L", "z_U", "bound_viol", "compl_x_L", "compl_x_U", "grad_lag_x"); for( int i = 0; i < 4; ++i ) { if( have_iter ) { printf(" %-12g %-12g %-12g", x[i], z_L[i], z_U[i]); } else { printf(" %-12s %-12s %-12s", "n/a", "n/a", "n/a"); } if( have_viol ) { printf(" %-12g %-12g %-12g %-12g\n", x_L_viol[i] > x_U_viol[i] ? x_L_viol[i] : x_U_viol[i], compl_x_L[i], compl_x_U[i], grad_lag_x[i]); } else { printf(" %-12s %-12s %-12s %-12s\n", "n/a", "n/a", "n/a", "n/a"); } } printf(" %-12s %-12s %-12s %-12s\n", "g(x)", "lambda", "constr_viol", "compl_g"); for( int i = 0; i < 2; ++i ) { if( have_iter ) { printf(" %-12g %-12g", g[i], lambda[i]); } else { printf(" %-12s %-12s", "n/a", "n/a"); } if( have_viol ) { printf(" %-12g %-12g\n", constraint_violation[i], compl_g[i]); } else { printf(" %-12s %-12s\n", "n/a", "n/a"); } } return true; } // [TNLP_intermediate_callback] coinor-ipopt-3.14.17/examples/hs071_cpp/hs071_nlp.hpp000066400000000000000000000124211473776672200221040ustar00rootroot00000000000000// Copyright (C) 2005, 2007 International Business Machines and others. // All Rights Reserved. // This code is published under the Eclipse Public License. // // Authors: Carl Laird, Andreas Waechter IBM 2005-08-09 #ifndef __HS071_NLP_HPP__ #define __HS071_NLP_HPP__ #include "IpTNLP.hpp" using namespace Ipopt; /** C++ Example NLP for interfacing a problem with IPOPT. * * HS071_NLP implements a C++ example of problem 71 of the * Hock-Schittkowski test suite. This example is designed to go * along with the tutorial document and show how to interface * with IPOPT through the TNLP interface. * * Problem hs071 looks like this * * min x1*x4*(x1 + x2 + x3) + x3 * s.t. x1*x2*x3*x4 >= 25 * x1**2 + x2**2 + x3**2 + x4**2 = 40 * 1 <= x1,x2,x3,x4 <= 5 * * Starting point: * x = (1, 5, 5, 1) * * Optimal solution: * x = (1.00000000, 4.74299963, 3.82114998, 1.37940829) */ class HS071_NLP: public TNLP { public: /** Constructor */ HS071_NLP( bool printiterate = false /**< whether to print the iterate at each iteration */ ); /** Destructor */ virtual ~HS071_NLP(); /**@name Overloaded from TNLP */ //@{ /** Method to return some info about the NLP */ virtual bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style ); /** Method to return the bounds for my problem */ virtual bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u ); /** Method to return the starting point for the algorithm */ virtual bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda ); /** Method to return the objective value */ virtual bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value ); /** Method to return the gradient of the objective */ virtual bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f ); /** Method to return the constraint residuals */ virtual bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g ); /** Method to return: * 1) The structure of the jacobian (if "values" is NULL) * 2) The values of the jacobian (if "values" is not NULL) */ virtual bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values ); /** Method to return: * 1) The structure of the hessian of the lagrangian (if "values" is NULL) * 2) The values of the hessian of the lagrangian (if "values" is not NULL) */ virtual bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values ); /** This method is called when the algorithm is complete so the TNLP can store/write the solution */ virtual void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); //@} bool intermediate_callback( AlgorithmMode mode, Index iter, Number obj_value, Number inf_pr, Number inf_du, Number mu, Number d_norm, Number regularization_size, Number alpha_du, Number alpha_pr, Index ls_trials, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq ); private: /** whether to print iterate to stdout in intermediate_callback() */ bool printiterate_; /**@name Methods to block default compiler methods. * * The compiler automatically generates the following three methods. * Since the default compiler implementation is generally not what * you want (for all but the most simple classes), we usually * put the declarations of these methods in the private section * and never implement them. This prevents the compiler from * implementing an incorrect "default" behavior without us * knowing. (See Scott Meyers book, "Effective C++") */ //@{ HS071_NLP( const HS071_NLP& ); HS071_NLP& operator=( const HS071_NLP& ); //@} }; #endif coinor-ipopt-3.14.17/examples/hs071_f/000077500000000000000000000000001473776672200173235ustar00rootroot00000000000000coinor-ipopt-3.14.17/examples/hs071_f/Makefile.in000066400000000000000000000040071473776672200213710ustar00rootroot00000000000000# Copyright (C) 2003, 2010 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. ########################################################################## # You can modify this example makefile to fit for your own program. # # Usually, you only need to change the four CHANGEME entries below. # ########################################################################## # CHANGEME: This should be the name of your executable EXE = hs071_f@EXEEXT@ # CHANGEME: Here is the name of all object files corresponding to the source # code that you wrote in order to define the problem statement @IPOPT_SINGLE_FALSE@OBJS = hs071_f.@OBJEXT@ @IPOPT_SINGLE_TRUE@OBJS = hs071_fs.@OBJEXT@ # CHANGEME: Additional libraries ADDLIBS = # CHANGEME: Additional flags for compilation (e.g., include flags) ADDINCFLAGS = ########################################################################## # Usually, you don't have to change anything below. Note that if you # # change certain compiler options, you might have to recompile Ipopt. # ########################################################################## # Fortran Compiler options F77 = @F77@ # Fotran Compiler options FFLAGS = @FFLAGS@ # additional Fortran Compiler options for linking F77LINKFLAGS = @RPATH_FLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ # Include directories @COIN_HAS_PKGCONFIG_TRUE@INCL = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --cflags ipopt` $(ADDINCFLAGS) @COIN_HAS_PKGCONFIG_FALSE@INCL = -I@includedir@/coin-or @IPOPTLIB_CFLAGS@ $(ADDINCFLAGS) # Linker flags @COIN_HAS_PKGCONFIG_TRUE@LIBS = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --libs ipopt` @CXXLIBS@ @COIN_HAS_PKGCONFIG_FALSE@LIBS = -L@libdir@ -lipopt @IPOPTLIB_LFLAGS@ @CXXLIBS@ all: $(EXE) .SUFFIXES: .f .@OBJEXT@ $(EXE): $(OBJS) $(F77) $(F77LINKFLAGS) $(FFLAGS) -o $@ $(OBJS) $(ADDLIBS) $(LIBS) clean: rm -f $(EXE) $(OBJS) IPOPT.OUT .f.@OBJEXT@: $(F77) $(FFLAGS) $(INCL) -c -o $@ $< coinor-ipopt-3.14.17/examples/hs071_f/hs071_f.f.in000066400000000000000000000323541473776672200212550ustar00rootroot00000000000000C Copyright (C) 2002, 2010 Carnegie Mellon University and others. C All Rights Reserved. C This code is published under the Eclipse Public License. C C ============================================================================= C C This is an example for the usage of IPOPT in double precision. C It implements problem 71 from the Hock-Schittkowski test suite: C C min x1*x4*(x1 + x2 + x3) + x3 C s.t. x1*x2*x3*x4 >= 25 C x1**2 + x2**2 + x3**2 + x4**2 = 40 C 1 <= x1,x2,x3,x4 <= 5 C C Starting point: C x = (1, 5, 5, 1) C C Optimal solution: C x = (1.00000000, 4.74299963, 3.82114998, 1.37940829) C C ============================================================================= C C C ============================================================================= C C Main driver program C C ============================================================================= C program example C implicit none C C include the Ipopt return codes C include 'IpReturnCodes.inc' C C Size of the problem (number of variables and equality constraints) C integer N, M, NELE_JAC, NELE_HESS, IDX_STY parameter (N = 4, M = 2, NELE_JAC = 8, NELE_HESS = 10) parameter (IDX_STY = 1 ) C C Space for multipliers and constraints C double precision LAM(M) double precision G(M) C C Vector of variables C double precision X(N) C C Vector of lower and upper bounds, left and right hand sides, and scaling C double precision X_L(N), X_U(N), X_SCALING(N), Z_L(N), Z_U(N) double precision G_L(M), G_U(M), G_SCALING(M) C To indicate to IPSETPROBLEMSCALING below that scaling for constraints C should be omitted, a NULL pointer can be passed for G_SCALING. With C Fortran > 77, this is done by removing the declaration of G_SCALING C from the line above and the data G_SCALING line below and enabling C the following line instead: C C double precision, allocatable, dimension(:) :: G_SCALING C C C Private data for evaluation routines C This could be used to pass double precision and integer arrays untouched C to the evaluation subroutines EVAL_* C double precision DAT(2) integer IDAT(1) C C Place for storing the Ipopt Problem Handle C @BIT32FCOMMENT@C for 32 bit platforms @BIT32FCOMMENT@ integer IPROBLEM @BIT32FCOMMENT@ integer IPCREATE @BIT64FCOMMENT@C for 64 bit platforms: @BIT64FCOMMENT@ integer*8 IPROBLEM @BIT64FCOMMENT@ integer*8 IPCREATE C integer IERR integer IPSOLVE, IPSETPROBLEMSCALING integer IPADDSTROPTION, IPADDNUMOPTION, IPADDINTOPTION integer IPOPENOUTPUTFILE C double precision F integer i C C The following are the Fortran routines for computing the model C functions and their derivatives - their code can be found further C down in this file. C external EV_F, EV_G, EV_GRAD_F, EV_JAC_G, EV_HESS CC CC The next is an optional callback method. It is called once per CC iteration. CC external ITER_CB C C Set initial point, bounds, and scaling: C data X / 1d0, 5d0, 5d0, 1d0 / data X_L / 1d0, 1d0, 1d0, 1d0 / data X_U / 5d0, 5d0, 5d0, 5d0 / data X_SCALING / 1d0, 1d0, 1d0, 1d0 / C C Set bounds and scaling for the constraints C data G_L / 25d0, 40d0 / data G_U / 1d40, 40d0 / data G_SCALING / 1d0, 1d0 / C C First create a handle for the Ipopt problem (and read the options C file) C IPROBLEM = IPCREATE(N, X_L, X_U, M, G_L, G_U, NELE_JAC, NELE_HESS, 1 IDX_STY, EV_F, EV_G, EV_GRAD_F, EV_JAC_G, EV_HESS) if (IPROBLEM.eq.0) then write(*,*) 'Error creating an Ipopt Problem handle.' stop endif C C Open an output file C IERR = IPOPENOUTPUTFILE(IPROBLEM, 'IPOPT.OUT', 5) if (IERR.ne.0 ) then write(*,*) 'Error opening the Ipopt output file.' goto 9000 endif C C Note: The following options are only examples, they might not be C suitable for your optimization problem. C C Set a string option C IERR = IPADDSTROPTION(IPROBLEM, 'mu_strategy', 'adaptive') if (IERR.ne.0 ) goto 9990 C C Set an integer option C IERR = IPADDINTOPTION(IPROBLEM, 'max_iter', 3000) if (IERR.ne.0 ) goto 9990 C C Set a double precision option C IERR = IPADDNUMOPTION(IPROBLEM, 'tol', 1.d-7) if (IERR.ne.0 ) goto 9990 C C Set scaling C IERR = IPSETPROBLEMSCALING(IPROBLEM, 1d0, X_SCALING, G_SCALING) if (IERR.ne.0 ) goto 9990 CC CC Set a callback function to give you control once per iteration. CC You can use it if you want to generate some output, or to stop CC the optimization early. CC Uncomment this line to print iterate in every iteration and CC demonstrate how to stop Ipopt early. CC C call IPSETCALLBACK(IPROBLEM, ITER_CB) C C As a simple example, we pass the constants in the constraints to C the EVAL_C routine via the "private" DAT array. C DAT(1) = 0.d0 DAT(2) = 0.d0 C C Call optimization routine C Passing IPROBLEM instead of IDAT is a hack to make IPROBLEM C accessible within ITER_CB. A proficient Fortran programmer would C find a way to store IPROBLEM inside IDAT. C IERR = IPSOLVE(IPROBLEM, X, G, F, LAM, Z_L, Z_U, IPROBLEM, DAT) C C Output: C if( IERR.eq.IP_SOLVE_SUCCEEDED ) then write(*,*) write(*,*) 'The solution was found.' write(*,*) write(*,*) 'The final value of the objective function is ',F write(*,*) write(*,*) 'The optimal values of X are:' write(*,*) do i = 1, N write(*,*) 'X (',i,') = ',X(i) enddo write(*,*) write(*,*) 'The multipliers for the lower bounds are:' write(*,*) do i = 1, N write(*,*) 'Z_L(',i,') = ',Z_L(i) enddo write(*,*) write(*,*) 'The multipliers for the upper bounds are:' write(*,*) do i = 1, N write(*,*) 'Z_U(',i,') = ',Z_U(i) enddo write(*,*) write(*,*) 'The multipliers for the equality constraints are:' write(*,*) do i = 1, M write(*,*) 'LAM(',i,') = ',LAM(i) enddo write(*,*) else write(*,*) write(*,*) 'An error occoured.' write(*,*) 'The error code is ',IERR write(*,*) endif C 9000 continue C C Clean up C call IPFREE(IPROBLEM) stop C 9990 continue write(*,*) 'Error setting an option' goto 9000 end C C ============================================================================= C C Computation of objective function C C ============================================================================= C subroutine EV_F(N, X, NEW_X, F, IDAT, DAT, IERR) implicit none integer N, NEW_X double precision F, X(N) double precision DAT(*) integer IDAT(*) integer IERR F = X(1)*X(4)*(X(1)+X(2)+X(3)) + X(3) IERR = 0 return end C C ============================================================================= C C Computation of gradient of objective function C C ============================================================================= C subroutine EV_GRAD_F(N, X, NEW_X, GRAD, IDAT, DAT, IERR) implicit none integer N, NEW_X double precision GRAD(N), X(N) double precision DAT(*) integer IDAT(*) integer IERR GRAD(1) = X(4)*(2d0*X(1)+X(2)+X(3)) GRAD(2) = X(1)*X(4) GRAD(3) = X(1)*X(4) + 1d0 GRAD(4) = X(1)*(X(1)+X(2)+X(3)) IERR = 0 return end C C ============================================================================= C C Computation of equality constraints C C ============================================================================= C subroutine EV_G(N, X, NEW_X, M, G, IDAT, DAT, IERR) implicit none integer N, NEW_X, M double precision G(M), X(N) double precision DAT(*) integer IDAT(*) integer IERR G(1) = X(1)*X(2)*X(3)*X(4) - DAT(1) G(2) = X(1)**2 + X(2)**2 + X(3)**2 + X(4)**2 - DAT(2) IERR = 0 return end C C ============================================================================= C C Computation of Jacobian of equality constraints C C ============================================================================= C subroutine EV_JAC_G(TASK, N, X, NEW_X, M, NZ, ACON, AVAR, A, 1 IDAT, DAT, IERR) integer TASK, N, NEW_X, M, NZ double precision X(N), A(NZ) integer ACON(NZ), AVAR(NZ), I double precision DAT(*) integer IDAT(*) integer IERR C C structure of Jacobian: C integer AVAR1(8), ACON1(8) data AVAR1 /1, 2, 3, 4, 1, 2, 3, 4/ data ACON1 /1, 1, 1, 1, 2, 2, 2, 2/ save AVAR1, ACON1 C if( TASK.eq.0 ) then do I = 1, 8 AVAR(I) = AVAR1(I) ACON(I) = ACON1(I) enddo else A(1) = X(2)*X(3)*X(4) A(2) = X(1)*X(3)*X(4) A(3) = X(1)*X(2)*X(4) A(4) = X(1)*X(2)*X(3) A(5) = 2d0*X(1) A(6) = 2d0*X(2) A(7) = 2d0*X(3) A(8) = 2d0*X(4) endif IERR = 0 return end C C ============================================================================= C C Computation of Hessian of Lagrangian C C ============================================================================= C subroutine EV_HESS(TASK, N, X, NEW_X, OBJFACT, M, LAM, NEW_LAM, 1 NNZH, IRNH, ICNH, HESS, IDAT, DAT, IERR) implicit none integer TASK, N, NEW_X, M, NEW_LAM, NNZH, i double precision X(N), OBJFACT, LAM(M), HESS(NNZH) integer IRNH(NNZH), ICNH(NNZH) double precision DAT(*) integer IDAT(*) integer IERR C C structure of Hessian: C integer IRNH1(10), ICNH1(10) data IRNH1 /1, 2, 2, 3, 3, 3, 4, 4, 4, 4/ data ICNH1 /1, 1, 2, 1, 2, 3, 1, 2, 3, 4/ save IRNH1, ICNH1 if( TASK.eq.0 ) then do i = 1, 10 IRNH(i) = IRNH1(i) ICNH(i) = ICNH1(i) enddo else do i = 1, 10 HESS(i) = 0d0 enddo C C objective function C HESS(1) = OBJFACT * 2d0*X(4) HESS(2) = OBJFACT * X(4) HESS(4) = OBJFACT * X(4) HESS(7) = OBJFACT * (2d0*X(1) + X(2) + X(3)) HESS(8) = OBJFACT * X(1) HESS(9) = OBJFACT * X(1) C C first constraint C HESS(2) = HESS(2) + LAM(1) * X(3)*X(4) HESS(4) = HESS(4) + LAM(1) * X(2)*X(4) HESS(5) = HESS(5) + LAM(1) * X(1)*X(4) HESS(7) = HESS(7) + LAM(1) * X(2)*X(3) HESS(8) = HESS(8) + LAM(1) * X(1)*X(3) HESS(9) = HESS(9) + LAM(1) * X(1)*X(2) C C second constraint C HESS(1) = HESS(1) + LAM(2) * 2d0 HESS(3) = HESS(3) + LAM(2) * 2d0 HESS(6) = HESS(6) + LAM(2) * 2d0 HESS(10)= HESS(10)+ LAM(2) * 2d0 endif IERR = 0 return end C C ============================================================================= C C Callback method called once per iteration C C ============================================================================= C subroutine ITER_CB(ALG_MODE, ITER_COUNT,OBJVAL, INF_PR, INF_DU, 1 MU, DNORM, REGU_SIZE, ALPHA_DU, ALPHA_PR, LS_TRIAL, IDAT, 2 DAT, ISTOP) implicit none integer ALG_MODE, ITER_COUNT, LS_TRIAL double precision OBJVAL, INF_PR, INF_DU, MU, DNORM, REGU_SIZE double precision ALPHA_DU, ALPHA_PR double precision DAT(*) integer IDAT(*) integer ISTOP integer IPGETCURRITERATE integer IPGETCURRVIOLATIONS integer i, IERR double precision X(4) double precision Z_L(4) double precision Z_U(4) double precision G(2) double precision LAMBDA(2) double precision COMPL_X_L(4) double precision COMPL_X_U(4) double precision GRAD_LAG_X(4) double precision CONS_VIOL(2) double precision COMPL_G(2) C C Get iterate and print C IERR = IPGETCURRITERATE(IDAT, 0, 1, 1, 1, 1, 4, X, Z_L, Z_U, 2, G, 1 LAMBDA) if ( IERR.eq.0 ) then do i = 1, 4 write(*,*) 'X, Z_L, Z_U (',i,') = ', X(i), Z_L(i), Z_U(i) enddo do i = 1, 2 write(*,*) 'G, LAMBDA (',i,') = ', G(i), LAMBDA(i) enddo endif C C Get violations and print C IERR = IPGETCURRVIOLATIONS(IDAT, 0, 0, 1, 1, 1, 4, 1 0, 0, COMPL_X_L, COMPL_X_U, GRAD_LAG_X, 2, CONS_VIOL, COMPL_G) if ( IERR.eq.0 ) then do i = 1, 4 write(*,*) 'COMPL_X_L, COMPL_X_U, GRAD_LAG_X (',i,') = ', 1 COMPL_X_L(i), COMPL_X_U(i), GRAD_LAG_X(i) enddo do i = 1, 2 write(*,*) 'CONS_VIOL, COMPL_G (',i,') = ', 1 CONS_VIOL(i), COMPL_G(i) enddo endif C C And set ISTOP to 1 if you want Ipopt to stop now. Below is just a C simple example. C if (INF_PR.le.1D-04) then write(*,*) 'Requesting stop due to small inf_pr in iteration ', 1 ITER_COUNT ISTOP = 1 endif return end coinor-ipopt-3.14.17/examples/hs071_f/hs071_fs.f.in000066400000000000000000000302441473776672200214340ustar00rootroot00000000000000C Copyright (C) 2002, 2010 Carnegie Mellon University and others. C All Rights Reserved. C This code is published under the Eclipse Public License. C C ============================================================================= C C This is an example for the usage of IPOPT in single precision. C It implements problem 71 from the Hock-Schittkowski test suite: C C min x1*x4*(x1 + x2 + x3) + x3 C s.t. x1*x2*x3*x4 >= 25 C x1**2 + x2**2 + x3**2 + x4**2 = 40 C 1 <= x1,x2,x3,x4 <= 5 C C Starting point: C x = (1, 5, 5, 1) C C Optimal solution: C x = (1.00000000, 4.74299963, 3.82114998, 1.37940829) C C ============================================================================= C C C ============================================================================= C C Main driver program C C ============================================================================= C program example C implicit none C C include the Ipopt return codes C include 'IpReturnCodes.inc' C C Size of the problem (number of variables and equality constraints) C integer N, M, NELE_JAC, NELE_HESS, IDX_STY parameter (N = 4, M = 2, NELE_JAC = 8, NELE_HESS = 10) parameter (IDX_STY = 1 ) C C Space for multipliers and constraints C real LAM(M) real G(M) C C Vector of variables C real X(N) C C Vector of lower and upper bounds C real X_L(N), X_U(N), Z_L(N), Z_U(N) real G_L(M), G_U(M) C C Private data for evaluation routines C This could be used to pass real and integer arrays untouched C to the evaluation subroutines EVAL_* C real DAT(2) integer IDAT(1) C C Place for storing the Ipopt Problem Handle C @BIT32FCOMMENT@C for 32 bit platforms @BIT32FCOMMENT@ integer IPROBLEM @BIT32FCOMMENT@ integer IPCREATE @BIT64FCOMMENT@C for 64 bit platforms: @BIT64FCOMMENT@ integer*8 IPROBLEM @BIT64FCOMMENT@ integer*8 IPCREATE C integer IERR integer IPSOLVE, IPADDSTROPTION integer IPADDNUMOPTION, IPADDINTOPTION integer IPOPENOUTPUTFILE C real F integer i C C The following are the Fortran routines for computing the model C functions and their derivatives - their code can be found further C down in this file. C external EV_F, EV_G, EV_GRAD_F, EV_JAC_G, EV_HESS CC CC The next is an optional callback method. It is called once per CC iteration. CC external ITER_CB C C Set initial point and bounds: C data X / 1e0, 5e0, 5e0, 1e0/ data X_L / 1e0, 1e0, 1e0, 1e0 / data X_U / 5e0, 5e0, 5e0, 5e0 / C C Set bounds for the constraints C data G_L / 25e0, 40e0 / data G_U / 1e20, 40e0 / C C First create a handle for the Ipopt problem (and read the options C file) C IPROBLEM = IPCREATE(N, X_L, X_U, M, G_L, G_U, NELE_JAC, NELE_HESS, 1 IDX_STY, EV_F, EV_G, EV_GRAD_F, EV_JAC_G, EV_HESS) if (IPROBLEM.eq.0) then write(*,*) 'Error creating an Ipopt Problem handle.' stop endif C C Open an output file C IERR = IPOPENOUTPUTFILE(IPROBLEM, 'IPOPT.OUT', 5) if (IERR.ne.0 ) then write(*,*) 'Error opening the Ipopt output file.' goto 9000 endif C C Note: The following options are only examples, they might not be C suitable for your optimization problem. C C Set a string option C IERR = IPADDSTROPTION(IPROBLEM, 'mu_strategy', 'adaptive') if (IERR.ne.0 ) goto 9990 C C Set an integer option C IERR = IPADDINTOPTION(IPROBLEM, 'max_iter', 3000) if (IERR.ne.0 ) goto 9990 C C Set a real option C IERR = IPADDNUMOPTION(IPROBLEM, 'tol', 3.82e-6) if (IERR.ne.0 ) goto 9990 CC CC Set a callback function to give you control once per iteration. CC You can use it if you want to generate some output, or to stop CC the optimization early. CC Uncomment this line to print iterate in every iteration and CC demonstrate how to stop Ipopt early. CC C call IPSETCALLBACK(IPROBLEM, ITER_CB) C C As a simple example, we pass the constants in the constraints to C the EVAL_C routine via the "private" DAT array. C DAT(1) = 0.e0 DAT(2) = 0.e0 C C Call optimization routine C Passing IPROBLEM instead of IDAT is a hack to make IPROBLEM C accessible within ITER_CB. A proficient Fortran programmer would C find a way to store IPROBLEM inside IDAT. C IERR = IPSOLVE(IPROBLEM, X, G, F, LAM, Z_L, Z_U, IPROBLEM, DAT) C C Output: C if( IERR.eq.IP_SOLVE_SUCCEEDED ) then write(*,*) write(*,*) 'The solution was found.' write(*,*) write(*,*) 'The final value of the objective function is ',F write(*,*) write(*,*) 'The optimal values of X are:' write(*,*) do i = 1, N write(*,*) 'X (',i,') = ',X(i) enddo write(*,*) write(*,*) 'The multipliers for the lower bounds are:' write(*,*) do i = 1, N write(*,*) 'Z_L(',i,') = ',Z_L(i) enddo write(*,*) write(*,*) 'The multipliers for the upper bounds are:' write(*,*) do i = 1, N write(*,*) 'Z_U(',i,') = ',Z_U(i) enddo write(*,*) write(*,*) 'The multipliers for the equality constraints are:' write(*,*) do i = 1, M write(*,*) 'LAM(',i,') = ',LAM(i) enddo write(*,*) else write(*,*) write(*,*) 'An error occoured.' write(*,*) 'The error code is ',IERR write(*,*) endif C 9000 continue C C Clean up C call IPFREE(IPROBLEM) stop C 9990 continue write(*,*) 'Error setting an option' goto 9000 end C C ============================================================================= C C Computation of objective function C C ============================================================================= C subroutine EV_F(N, X, NEW_X, F, IDAT, DAT, IERR) implicit none integer N, NEW_X real F, X(N) real DAT(*) integer IDAT(*) integer IERR F = X(1)*X(4)*(X(1)+X(2)+X(3)) + X(3) IERR = 0 return end C C ============================================================================= C C Computation of gradient of objective function C C ============================================================================= C subroutine EV_GRAD_F(N, X, NEW_X, GRAD, IDAT, DAT, IERR) implicit none integer N, NEW_X real GRAD(N), X(N) real DAT(*) integer IDAT(*) integer IERR GRAD(1) = X(4)*(2e0*X(1)+X(2)+X(3)) GRAD(2) = X(1)*X(4) GRAD(3) = X(1)*X(4) + 1e0 GRAD(4) = X(1)*(X(1)+X(2)+X(3)) IERR = 0 return end C C ============================================================================= C C Computation of equality constraints C C ============================================================================= C subroutine EV_G(N, X, NEW_X, M, G, IDAT, DAT, IERR) implicit none integer N, NEW_X, M real G(M), X(N) real DAT(*) integer IDAT(*) integer IERR G(1) = X(1)*X(2)*X(3)*X(4) - DAT(1) G(2) = X(1)**2 + X(2)**2 + X(3)**2 + X(4)**2 - DAT(2) IERR = 0 return end C C ============================================================================= C C Computation of Jacobian of equality constraints C C ============================================================================= C subroutine EV_JAC_G(TASK, N, X, NEW_X, M, NZ, ACON, AVAR, A, 1 IDAT, DAT, IERR) integer TASK, N, NEW_X, M, NZ real X(N), A(NZ) integer ACON(NZ), AVAR(NZ), I real DAT(*) integer IDAT(*) integer IERR C C structure of Jacobian: C integer AVAR1(8), ACON1(8) data AVAR1 /1, 2, 3, 4, 1, 2, 3, 4/ data ACON1 /1, 1, 1, 1, 2, 2, 2, 2/ save AVAR1, ACON1 C if( TASK.eq.0 ) then do I = 1, 8 AVAR(I) = AVAR1(I) ACON(I) = ACON1(I) enddo else A(1) = X(2)*X(3)*X(4) A(2) = X(1)*X(3)*X(4) A(3) = X(1)*X(2)*X(4) A(4) = X(1)*X(2)*X(3) A(5) = 2e0*X(1) A(6) = 2e0*X(2) A(7) = 2e0*X(3) A(8) = 2e0*X(4) endif IERR = 0 return end C C ============================================================================= C C Computation of Hessian of Lagrangian C C ============================================================================= C subroutine EV_HESS(TASK, N, X, NEW_X, OBJFACT, M, LAM, NEW_LAM, 1 NNZH, IRNH, ICNH, HESS, IDAT, DAT, IERR) implicit none integer TASK, N, NEW_X, M, NEW_LAM, NNZH, i real X(N), OBJFACT, LAM(M), HESS(NNZH) integer IRNH(NNZH), ICNH(NNZH) real DAT(*) integer IDAT(*) integer IERR C C structure of Hessian: C integer IRNH1(10), ICNH1(10) data IRNH1 /1, 2, 2, 3, 3, 3, 4, 4, 4, 4/ data ICNH1 /1, 1, 2, 1, 2, 3, 1, 2, 3, 4/ save IRNH1, ICNH1 if( TASK.eq.0 ) then do i = 1, 10 IRNH(i) = IRNH1(i) ICNH(i) = ICNH1(i) enddo else do i = 1, 10 HESS(i) = 0d0 enddo C C objective function C HESS(1) = OBJFACT * 2e0*X(4) HESS(2) = OBJFACT * X(4) HESS(4) = OBJFACT * X(4) HESS(7) = OBJFACT * (2e0*X(1) + X(2) + X(3)) HESS(8) = OBJFACT * X(1) HESS(9) = OBJFACT * X(1) C C first constraint C HESS(2) = HESS(2) + LAM(1) * X(3)*X(4) HESS(4) = HESS(4) + LAM(1) * X(2)*X(4) HESS(5) = HESS(5) + LAM(1) * X(1)*X(4) HESS(7) = HESS(7) + LAM(1) * X(2)*X(3) HESS(8) = HESS(8) + LAM(1) * X(1)*X(3) HESS(9) = HESS(9) + LAM(1) * X(1)*X(2) C C second constraint C HESS(1) = HESS(1) + LAM(2) * 2e0 HESS(3) = HESS(3) + LAM(2) * 2e0 HESS(6) = HESS(6) + LAM(2) * 2e0 HESS(10)= HESS(10)+ LAM(2) * 2e0 endif IERR = 0 return end C C ============================================================================= C C Callback method called once per iteration C C ============================================================================= C subroutine ITER_CB(ALG_MODE, ITER_COUNT,OBJVAL, INF_PR, INF_DU, 1 MU, DNORM, REGU_SIZE, ALPHA_DU, ALPHA_PR, LS_TRIAL, IDAT, 2 DAT, ISTOP) implicit none integer ALG_MODE, ITER_COUNT, LS_TRIAL real OBJVAL, INF_PR, INF_DU, MU, DNORM, REGU_SIZE real ALPHA_DU, ALPHA_PR real DAT(*) integer IDAT(*) integer ISTOP integer IPGETCURRITERATE integer IPGETCURRVIOLATIONS integer i, IERR real X(4) real Z_L(4) real Z_U(4) real G(2) real LAMBDA(2) real COMPL_X_L(4) real COMPL_X_U(4) real GRAD_LAG_X(4) real CONS_VIOL(2) real COMPL_G(2) C C Get iterate and print C IERR = IPGETCURRITERATE(IDAT, 0, 1, 1, 1, 1, 4, X, Z_L, Z_U, 2, G, 1 LAMBDA) if ( IERR.eq.0 ) then do i = 1, 4 write(*,*) 'X, Z_L, Z_U (',i,') = ', X(i), Z_L(i), Z_U(i) enddo do i = 1, 2 write(*,*) 'G, LAMBDA (',i,') = ', G(i), LAMBDA(i) enddo endif C C Get violations and print C IERR = IPGETCURRVIOLATIONS(IDAT, 0, 0, 1, 1, 1, 4, 1 0, 0, COMPL_X_L, COMPL_X_U, GRAD_LAG_X, 2, CONS_VIOL, COMPL_G) if ( IERR.eq.0 ) then do i = 1, 4 write(*,*) 'COMPL_X_L, COMPL_X_U, GRAD_LAG_X (',i,') = ', 1 COMPL_X_L(i), COMPL_X_U(i), GRAD_LAG_X(i) enddo do i = 1, 2 write(*,*) 'CONS_VIOL, COMPL_G (',i,') = ', 1 CONS_VIOL(i), COMPL_G(i) enddo endif C C And set ISTOP to 1 if you want Ipopt to stop now. Below is just a C simple example. C if (INF_PR.le.1e-04) then write(*,*) 'Requesting stop due to small inf_pr in iteration ', 1 ITER_COUNT ISTOP = 1 endif return end coinor-ipopt-3.14.17/examples/hs071_java/000077500000000000000000000000001473776672200200175ustar00rootroot00000000000000coinor-ipopt-3.14.17/examples/hs071_java/HS071.java000066400000000000000000000277071473776672200214410ustar00rootroot00000000000000/* Copyright (C) 2007 VRTech Industrial Technologies - www.vrtech.com.br. * Copyright (C) 2007 Tong Kewei, Beihang University, - www.buaa.edu.cn. * All Rights Reserved. * This code is published under the Eclipse Public License. */ import org.coinor.Ipopt; /** Java example for interfacing with IPOPT (double precision). * * HS071 implements a Java example of problem 71 of the * Hock-Schittkowsky test suite. * * The optimal solution is * x = (1.00000000, 4.74299963, 3.82114998, 1.37940829). * * This code was based on same problem of the Ipopt distribution. * * @author Rafael de Pelegrini Soares, Tong Kewei */ public class HS071 extends Ipopt { // Problem sizes int n; int m; int nele_jac; int nele_hess; int count_bounds = 0; int dcount_start = 0; boolean printiterate; /** Creates a new instance of HS071 */ // [HS071] public HS071() { /* Number of nonzeros in the Jacobian of the constraints */ nele_jac = 8; /* Number of nonzeros in the Hessian of the Lagrangian (lower or * upper triangual part only) */ nele_hess = 10; /* Number of variables */ n = 4; /* Number of constraints */ m = 2; /* Index style for the irow/jcol elements */ int index_style = Ipopt.C_STYLE; /* Whether to print iterate in intermediate_callback */ printiterate = false; /* create the IpoptProblem */ create(n, m, nele_jac, nele_hess, index_style); } // [HS071] /** Callback function for variable bounds and constraint sides. */ // [get_bounds_info] protected boolean get_bounds_info( int n, double[] x_L, double[] x_U, int m, double[] g_L, double[] g_U) { assert n == this.n; assert m == this.m; /* set the values of the variable bounds */ for( int i = 0; i < n; ++i ) { x_L[i] = 1.0; x_U[i] = 5.0; } /* set the values of the constraint bounds */ g_L[0] = 25.0; g_U[0] = 2e19; g_L[1] = 40.0; g_U[1] = 40.0; return true; } // [get_bounds_info] /** Callback function for the starting point. */ // [get_starting_point] protected boolean get_starting_point( int n, boolean init_x, double[] x, boolean init_z, double[] z_L, double[] z_U, int m, boolean init_lambda, double[] lambda) { assert init_z == false; assert init_lambda = false; if( init_x ) { x[0] = 1.0; x[1] = 5.0; x[2] = 5.0; x[3] = 1.0; } return true; } // [get_starting_point] // [eval] protected boolean eval_f( int n, double[] x, boolean new_x, double[] obj_value) { assert n == this.n; obj_value[0] = x[0] * x[3] * (x[0] + x[1] + x[2]) + x[2]; return true; } protected boolean eval_grad_f( int n, double[] x, boolean new_x, double[] grad_f) { assert n == this.n; grad_f[0] = x[0] * x[3] + x[3] * (x[0] + x[1] + x[2]); grad_f[1] = x[0] * x[3]; grad_f[2] = x[0] * x[3] + 1; grad_f[3] = x[0] * (x[0] + x[1] + x[2]); return true; } protected boolean eval_g( int n, double[] x, boolean new_x, int m, double[] g) { assert n == this.n; assert m == this.m; g[0] = x[0] * x[1] * x[2] * x[3]; g[1] = x[0] * x[0] + x[1] * x[1] + x[2] * x[2] + x[3] * x[3]; return true; } protected boolean eval_jac_g( int n, double[] x, boolean new_x, int m, int nele_jac, int[] iRow, int[] jCol, double[] values) { assert n == this.n; assert m == this.m; if( values == null ) { /* return the structure of the jacobian */ /* this particular jacobian is dense */ iRow[0] = 0; jCol[0] = 0; iRow[1] = 0; jCol[1] = 1; iRow[2] = 0; jCol[2] = 2; iRow[3] = 0; jCol[3] = 3; iRow[4] = 1; jCol[4] = 0; iRow[5] = 1; jCol[5] = 1; iRow[6] = 1; jCol[6] = 2; iRow[7] = 1; jCol[7] = 3; } else { /* return the values of the jacobian of the constraints */ values[0] = x[1] * x[2] * x[3]; /* 0,0 */ values[1] = x[0] * x[2] * x[3]; /* 0,1 */ values[2] = x[0] * x[1] * x[3]; /* 0,2 */ values[3] = x[0] * x[1] * x[2]; /* 0,3 */ values[4] = 2.0 * x[0]; /* 1,0 */ values[5] = 2.0 * x[1]; /* 1,1 */ values[6] = 2.0 * x[2]; /* 1,2 */ values[7] = 2.0 * x[3]; /* 1,3 */ } return true; } protected boolean eval_h( int n, double[] x, boolean new_x, double obj_factor, int m, double[] lambda, boolean new_lambda, int nele_hess, int[] iRow, int[] jCol, double[] values) { assert n == this.n; assert m == this.m; int idx = 0; /* nonzero element counter */ int row = 0; /* row counter for loop */ int col = 0; /* col counter for loop */ if (values == null) { /* return the structure * This is a symmetric matrix, fill the lower left triangle only. */ /* the hessian for this problem is actually dense */ idx = 0; for( row = 0; row < n; ++row ) for (col = 0; col <= row; ++col) { iRow[idx] = row; jCol[idx] = col; ++idx; } assert idx == nele_hess; assert nele_hess == this.nele_hess; } else { /* return the values. * This is a symmetric matrix, fill the lower left triangle only. */ /* fill the objective portion */ values[0] = obj_factor * (2.0 * x[3]); /* 0,0 */ values[1] = obj_factor * (x[3]); /* 1,0 */ values[2] = 0.0; /* 1,1 */ values[3] = obj_factor * (x[3]); /* 2,0 */ values[4] = 0.0; /* 2,1 */ values[5] = 0.0; /* 2,2 */ values[6] = obj_factor * (2.0 * x[0] + x[1] + x[2]); /* 3,0 */ values[7] = obj_factor * (x[0]); /* 3,1 */ values[8] = obj_factor * (x[0]); /* 3,2 */ values[9] = 0.0; /* 3,3 */ /* add the portion for the first constraint */ values[1] += lambda[0] * (x[2] * x[3]); /* 1,0 */ values[3] += lambda[0] * (x[1] * x[3]); /* 2,0 */ values[4] += lambda[0] * (x[0] * x[3]); /* 2,1 */ values[6] += lambda[0] * (x[1] * x[2]); /* 3,0 */ values[7] += lambda[0] * (x[0] * x[2]); /* 3,1 */ values[8] += lambda[0] * (x[0] * x[1]); /* 3,2 */ /* add the portion for the second constraint */ values[0] += lambda[1] * 2.0; /* 0,0 */ values[2] += lambda[1] * 2.0; /* 1,1 */ values[5] += lambda[1] * 2.0; /* 2,2 */ values[9] += lambda[1] * 2.0; /* 3,3 */ } return true; } // [eval] // [intermediate_callback] public boolean intermediate_callback( int algorithmmode, int iter, double obj_value, double inf_pr, double inf_du, double mu, double d_norm, double regularization_size, double alpha_du, double alpha_pr, int ls_trials, long ip_data, long ip_cq) { if( !printiterate ) { return true; } double x[] = new double[n]; double z_L[] = new double[n]; double z_U[] = new double[n]; double x_L_viol[] = new double[n]; double x_U_viol[] = new double[n]; double compl_x_L[] = new double[n]; double compl_x_U[] = new double[n]; double grad_lag_x[] = new double[n]; double g[] = new double[m]; double lambda[] = new double[m]; double constr_viol[] = new double[m]; double compl_g[] = new double[m]; boolean have_iter = get_curr_iterate(ip_data, ip_cq, false, n, x, z_L, z_U, m, g, lambda); boolean have_viol = get_curr_violations(ip_data, ip_cq, false, n, x_L_viol, x_U_viol, compl_x_L, compl_x_U, grad_lag_x, m, constr_viol, compl_g); System.out.println("Current iterate at iteration " + iter + ":"); System.out.println(" x z_L z_U bound_viol compl_x_L compl_x_U grad_lag_x"); for( int i = 0; i < n; ++i ) { if( have_iter ) { System.out.print(" " + x[i] + " " + z_L[i] + " " + z_U[i]); } else { System.out.print(" n/a n/a n/a"); } if( have_viol ) { System.out.println(" " + Math.max(x_L_viol[i], x_U_viol[i]) + " " + compl_x_L[i] + " " + compl_x_U[i] + " " + grad_lag_x[i]); } else { System.out.println(" n/a/ n/a n/a n/a"); } } System.out.println(" g(x) lambda constr_viol compl_g"); for( int i = 0; i < m; ++i ) { if( have_iter ) { System.out.print(" " + g[i] + " " + lambda[i]); } else { System.out.print(" n/a n/a"); } if( have_viol ) { System.out.println(" " + constr_viol[i] + " " + compl_g[i]); } else { System.out.println(" n/a + n/a"); } } return true; } // [intermediate_callback] private void print( double[] x, String str) { System.out.println(str); for( int i = 0; i < x.length; ++i ) { System.out.println(x[i]); } System.out.println(); } /** Main function for running this example. */ // [main] public static void main(String[] args) { // Create the problem HS071 hs071 = new HS071(); // Set some options // hs071.setNumericOption("tol",1E-7); // hs071.setStringOption("nlp_scaling_method","user-scaling"); // hs071.setStringOption("print_options_documentation","yes"); // hs071.setStringOption("warm_start_init_point","yes"); // hs071.setNumericOption("warm_start_bound_push",1e-9); // hs071.setNumericOption("warm_start_bound_frac",1e-9); // hs071.setNumericOption("warm_start_slack_bound_frac",1e-9); // hs071.setNumericOption("warm_start_slack_bound_push",1e-9); // hs071.setNumericOption("warm_start_mult_bound_push",1e-9); // enable printing of current iterate in intermediate_callback // hs071.printiterate = true; // Solve the problem int status = hs071.OptimizeNLP(); // Print the solution if( status == SOLVE_SUCCEEDED ) { System.out.println("\n\n*** The problem solved!"); } else { System.out.println("\n\n*** The problem was not solved successfully!"); } double obj = hs071.getObjectiveValue(); System.out.println("\nObjective Value = " + obj + "\n"); double x[] = hs071.getVariableValues(); hs071.print(x, "Primal Variable Values:"); double constraints[] = hs071.getConstraintValues(); hs071.print(constraints, "Constraint Values:"); double MLB[] = hs071.getLowerBoundMultipliers(); hs071.print(MLB, "Dual Multipliers for Variable Lower Bounds:"); double MUB[] = hs071.getUpperBoundMultipliers(); hs071.print(MUB, "Dual Multipliers for Variable Upper Bounds:"); double lam[] = hs071.getConstraintMultipliers(); hs071.print(lam, "Dual Multipliers for Constraints:"); } // [main] } coinor-ipopt-3.14.17/examples/hs071_java/HS071s.java000066400000000000000000000226121473776672200216120ustar00rootroot00000000000000/* Copyright (C) 2007 VRTech Industrial Technologies - www.vrtech.com.br. * Copyright (C) 2007 Tong Kewei, Beihang University, - www.buaa.edu.cn. * All Rights Reserved. * This code is published under the Eclipse Public License. */ import org.coinor.Ipopt; /** Java example for interfacing with IPOPT (single precision). * * HS071 implements a Java example of problem 71 of the * Hock-Schittkowsky test suite. * * The optimal solution is * x = (1.00000000, 4.74299963, 3.82114998, 1.37940829). * * This code was based on same problem of the Ipopt distribution. * * @author Rafael de Pelegrini Soares, Tong Kewei */ public class HS071s extends Ipopt { // Problem sizes int n; int m; int nele_jac; int nele_hess; int count_bounds = 0; int dcount_start = 0; /** Creates a new instance of HS071s */ // [HS071s] public HS071s() { /* Number of nonzeros in the Jacobian of the constraints */ nele_jac = 8; /* Number of nonzeros in the Hessian of the Lagrangian (lower or * upper triangual part only) */ nele_hess = 10; /* Number of variables */ n = 4; /* Number of constraints */ m = 2; /* Index style for the irow/jcol elements */ int index_style = Ipopt.C_STYLE; /* create the IpoptProblem */ create(n, m, nele_jac, nele_hess, index_style); } // [HS071] /** Callback function for variable bounds and constraint sides. */ // [get_bounds_info] protected boolean get_bounds_info( int n, float[] x_L, float[] x_U, int m, float[] g_L, float[] g_U) { assert n == this.n; assert m == this.m; /* set the values of the variable bounds */ for( int i = 0; i < n; ++i ) { x_L[i] = 1.0f; x_U[i] = 5.0f; } /* set the values of the constraint bounds */ g_L[0] = 25.0f; g_U[0] = 2e19f; g_L[1] = 40.0f; g_U[1] = 40.0f; return true; } // [get_bounds_info] /** Callback function for the starting point. */ // [get_starting_point] protected boolean get_starting_point( int n, boolean init_x, float[] x, boolean init_z, float[] z_L, float[] z_U, int m, boolean init_lambda, float[] lambda) { assert init_z == false; assert init_lambda = false; if( init_x ) { x[0] = 1.0f; x[1] = 5.0f; x[2] = 5.0f; x[3] = 1.0f; } return true; } // [get_starting_point] // [eval] protected boolean eval_f( int n, float[] x, boolean new_x, float[] obj_value) { assert n == this.n; obj_value[0] = x[0] * x[3] * (x[0] + x[1] + x[2]) + x[2]; return true; } protected boolean eval_grad_f( int n, float[] x, boolean new_x, float[] grad_f) { assert n == this.n; grad_f[0] = x[0] * x[3] + x[3] * (x[0] + x[1] + x[2]); grad_f[1] = x[0] * x[3]; grad_f[2] = x[0] * x[3] + 1; grad_f[3] = x[0] * (x[0] + x[1] + x[2]); return true; } protected boolean eval_g( int n, float[] x, boolean new_x, int m, float[] g) { assert n == this.n; assert m == this.m; g[0] = x[0] * x[1] * x[2] * x[3]; g[1] = x[0] * x[0] + x[1] * x[1] + x[2] * x[2] + x[3] * x[3]; return true; } protected boolean eval_jac_g( int n, float[] x, boolean new_x, int m, int nele_jac, int[] iRow, int[] jCol, float[] values) { assert n == this.n; assert m == this.m; if( values == null ) { /* return the structure of the jacobian */ /* this particular jacobian is dense */ iRow[0] = 0; jCol[0] = 0; iRow[1] = 0; jCol[1] = 1; iRow[2] = 0; jCol[2] = 2; iRow[3] = 0; jCol[3] = 3; iRow[4] = 1; jCol[4] = 0; iRow[5] = 1; jCol[5] = 1; iRow[6] = 1; jCol[6] = 2; iRow[7] = 1; jCol[7] = 3; } else { /* return the values of the jacobian of the constraints */ values[0] = x[1] * x[2] * x[3]; /* 0,0 */ values[1] = x[0] * x[2] * x[3]; /* 0,1 */ values[2] = x[0] * x[1] * x[3]; /* 0,2 */ values[3] = x[0] * x[1] * x[2]; /* 0,3 */ values[4] = 2.0f * x[0]; /* 1,0 */ values[5] = 2.0f * x[1]; /* 1,1 */ values[6] = 2.0f * x[2]; /* 1,2 */ values[7] = 2.0f * x[3]; /* 1,3 */ } return true; } protected boolean eval_h( int n, float[] x, boolean new_x, float obj_factor, int m, float[] lambda, boolean new_lambda, int nele_hess, int[] iRow, int[] jCol, float[] values) { assert n == this.n; assert m == this.m; int idx = 0; /* nonzero element counter */ int row = 0; /* row counter for loop */ int col = 0; /* col counter for loop */ if (values == null) { /* return the structure * This is a symmetric matrix, fill the lower left triangle only. */ /* the hessian for this problem is actually dense */ idx = 0; for( row = 0; row < n; ++row ) for (col = 0; col <= row; ++col) { iRow[idx] = row; jCol[idx] = col; ++idx; } assert idx == nele_hess; assert nele_hess == this.nele_hess; } else { /* return the values. * This is a symmetric matrix, fill the lower left triangle only. */ /* fill the objective portion */ values[0] = obj_factor * (2.0f * x[3]); /* 0,0 */ values[1] = obj_factor * (x[3]); /* 1,0 */ values[2] = 0.0f; /* 1,1 */ values[3] = obj_factor * (x[3]); /* 2,0 */ values[4] = 0.0f; /* 2,1 */ values[5] = 0.0f; /* 2,2 */ values[6] = obj_factor * (2.0f * x[0] + x[1] + x[2]); /* 3,0 */ values[7] = obj_factor * (x[0]); /* 3,1 */ values[8] = obj_factor * (x[0]); /* 3,2 */ values[9] = 0.0f; /* 3,3 */ /* add the portion for the first constraint */ values[1] += lambda[0] * (x[2] * x[3]); /* 1,0 */ values[3] += lambda[0] * (x[1] * x[3]); /* 2,0 */ values[4] += lambda[0] * (x[0] * x[3]); /* 2,1 */ values[6] += lambda[0] * (x[1] * x[2]); /* 3,0 */ values[7] += lambda[0] * (x[0] * x[2]); /* 3,1 */ values[8] += lambda[0] * (x[0] * x[1]); /* 3,2 */ /* add the portion for the second constraint */ values[0] += lambda[1] * 2.0f; /* 0,0 */ values[2] += lambda[1] * 2.0f; /* 1,1 */ values[5] += lambda[1] * 2.0f; /* 2,2 */ values[9] += lambda[1] * 2.0f; /* 3,3 */ } return true; } // [eval] private void print( float[] x, String str) { System.out.println(str); for( int i = 0; i < x.length; ++i ) { System.out.println(x[i]); } System.out.println(); } /** Main function for running this example. */ // [main] public static void main(String[] args) { // Create the problem HS071s hs071 = new HS071s(); // Set some options // hs071.setNumericOption("tol",6.28E-6f); // hs071.setStringOption("nlp_scaling_method","user-scaling"); // hs071.setStringOption("print_options_documentation","yes"); // hs071.setStringOption("warm_start_init_point","yes"); // hs071.setNumericOption("warm_start_bound_push",1e-9f); // hs071.setNumericOption("warm_start_bound_frac",1e-9f); // hs071.setNumericOption("warm_start_slack_bound_frac",1e-9f); // hs071.setNumericOption("warm_start_slack_bound_push",1e-9f); // hs071.setNumericOption("warm_start_mult_bound_push",1e-9f); // Solve the problem int status = hs071.OptimizeNLP(); // Print the solution if( status == SOLVE_SUCCEEDED ) { System.out.println("\n\n*** The problem solved!"); } else { System.out.println("\n\n*** The problem was not solved successfully!"); } float obj = hs071.getObjectiveValue(); System.out.println("\nObjective Value = " + obj + "\n"); float x[] = hs071.getVariableValues(); hs071.print(x, "Primal Variable Values:"); float constraints[] = hs071.getConstraintValues(); hs071.print(constraints, "Constraint Values:"); float MLB[] = hs071.getLowerBoundMultipliers(); hs071.print(MLB, "Dual Multipliers for Variable Lower Bounds:"); float MUB[] = hs071.getUpperBoundMultipliers(); hs071.print(MUB, "Dual Multipliers for Variable Upper Bounds:"); float lam[] = hs071.getConstraintMultipliers(); hs071.print(lam, "Dual Multipliers for Constraints:"); } // [main] } coinor-ipopt-3.14.17/examples/hs071_java/Makefile.in000066400000000000000000000017101473776672200220630ustar00rootroot00000000000000# Copyright (C) 2007, 2011 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. # # Author: Andreas Waechter 2007-10-08 IBM # NOTE: We assume here that there are no spaces in paths. # If you are on Windows and have Java in a path like C:\Program Files\Java, # try setting JAVA_HOME to the DOS equivalent C:\Progra~1 or similar. # Java compiler JAVAC = @JAVAC@ # Java runtime JAVA = @JAVA@ # Ipopt JAR prefix = @prefix@ exec_prefix = @exec_prefix@ datarootdir = @datarootdir@ IPOPTJAR = @datadir@/java/org.coinor.ipopt.jar @IPOPT_SINGLE_FALSE@CLASS = HS071 @IPOPT_SINGLE_TRUE@CLASS = HS071s ########################################################################## .SUFFIXES: .java .class .java.class: $(JAVAC) -cp $(IPOPTJAR) $< all : $(CLASS).class test : $(CLASS).class $(JAVA) -cp $(IPOPTJAR):. -Djava.library.path=@libdir@ $(CLASS) clean : rm -rf $(CLASS).class coinor-ipopt-3.14.17/examples/recursive_nlp/000077500000000000000000000000001473776672200210345ustar00rootroot00000000000000coinor-ipopt-3.14.17/examples/recursive_nlp/Makefile.in000066400000000000000000000034011473776672200230770ustar00rootroot00000000000000# Copyright (C) 2003, 2010 International Business Machines and others. # All Rights Reserved. # This file is distributed under the Eclipse Public License. ########################################################################## # You can modify this example makefile to fit for your own program. # # Usually, you only need to change the four CHANGEME entries below. # ########################################################################## # CHANGEME: This should be the name of your executable EXE = recursive_nlp@EXEEXT@ # CHANGEME: Here is the name of all source files SRC = @srcdir@/recursive_nlp.cpp # CHANGEME: Additional libraries ADDLIBS = # CHANGEME: Additional flags for compilation (e.g., include flags) ADDINCFLAGS = ########################################################################## # Usually, you don't have to change anything below. Note that if you # # change certain compiler options, you might have to recompile Ipopt. # ########################################################################## # C++ Compiler command CXX = @CXX@ # C++ Compiler options CXXFLAGS = @CXXFLAGS@ # additional C++ Compiler options for linking CXXLINKFLAGS = @RPATH_FLAGS@ prefix=@prefix@ exec_prefix=@exec_prefix@ # Include directories @COIN_HAS_PKGCONFIG_TRUE@INCL = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --cflags ipopt` $(ADDINCFLAGS) @COIN_HAS_PKGCONFIG_FALSE@INCL = -I@includedir@/coin-or @IPOPTLIB_CFLAGS@ $(ADDINCFLAGS) # Linker flags @COIN_HAS_PKGCONFIG_TRUE@LIBS = `PKG_CONFIG_PATH=@COIN_PKG_CONFIG_PATH@ @PKG_CONFIG@ --libs ipopt` @COIN_HAS_PKGCONFIG_FALSE@LIBS = -L@libdir@ -lipopt @IPOPTLIB_LFLAGS@ all: $(EXE) $(EXE): $(SRC) $(CXX) $(CXXLINKFLAGS) $(CXXFLAGS) $(INCL) -o $@ $(SRC) $(LIBS) $(ADDLIBS) clean: rm -rf $(EXE) coinor-ipopt-3.14.17/examples/recursive_nlp/recursive_nlp.cpp000066400000000000000000000151061473776672200244230ustar00rootroot00000000000000// Copyright (C) 2020 COIN-OR Foundation // All Rights Reserved. // This code is published under the Eclipse Public License 2.0. // // Author: Brad Bell /** @file recursive_nlp.cpp * * This solve a NLP where the objective function is defined as a solution point of a NLP. * Both the outer and the inner problem are solved by Ipopt. * (For simplicity, the inner problem is very similar to the outer problem.) * * Inner problem: minimize exp [ 0.5 * (x - a)^2 + 0.5 * x^2 ] w.r.t x * Define y(a): arg_min exp [ 0.5 * (x - a)^2 + 0.5 * x^2 ] w.r.t x * Outer problem: minimize exp [ 0.5 * (y(a) - a)^2 + 0.5 * y(a)^2 ] w.r.t a */ #include "IpIpoptApplication.hpp" #include "IpTNLP.hpp" #include #include #include #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wunused-parameter" #endif using namespace Ipopt; class recursive_nlp: public TNLP { private: const bool inner_; const Number a_; Number arg_min_; Number y_; public: // arg_min Number arg_min(void) const { return arg_min_; } // constructor for the inner problem recursive_nlp(const Number& a) : inner_(true), a_(a), arg_min_(0.0), y_(0.0) { } // constructor for the outer problem recursive_nlp(void) : inner_(false), a_(0.0), arg_min_(0.0), y_(0.0) { } // default destructor virtual ~recursive_nlp() { } // get_nlp_info bool get_nlp_info( Index& n, Index& m, Index& nnz_jac_g, Index& nnz_h_lag, IndexStyleEnum& index_style) { n = 1; m = 0; nnz_jac_g = 0; nnz_h_lag = 1; index_style = C_STYLE; return true; } // get_bounds_info bool get_bounds_info( Index n, Number* x_l, Number* x_u, Index m, Number* g_l, Number* g_u) { assert(n == 1 && m == 0); /* default Ipopt value for "infinity" is 1e20 */ x_l[0] = -1e20; x_u[0] = +1e20; return true; } // get_starting_point bool get_starting_point( Index n, bool init_x, Number* x, bool init_z, Number* z_L, Number* z_U, Index m, bool init_lambda, Number* lambda) { assert(n == 1 && m == 0 && init_x); // x[0] == 0 is solution for outer problem x[0] = 2.0; return true; } // eval_f bool eval_f( Index n, const Number* x, bool new_x, Number& obj_value) { assert(n == 1); if( inner_ ) { Number arg = 0.5 * (x[0] - a_) * (x[0] - a_) + 0.5 * x[0] * x[0]; // avoid a floating-point overflow when arg is too large, return false instead if( arg >= std::log(std::numeric_limits::max()) ) { return false; } obj_value = std::exp(arg); return true; } if( new_x ) { // solve the inner problem with corresponding to x[0] SmartPtr app = IpoptApplicationFactory(); app->Options()->SetIntegerValue("print_level", J_STRONGWARNING); app->Options()->SetStringValue("hessian_approximation", "limited-memory"); ApplicationReturnStatus status = app->Initialize(); if( status != Solve_Succeeded ) { return false; } SmartPtr nlp = new recursive_nlp(x[0]); status = app->OptimizeTNLP(nlp); if( status != Solve_Succeeded ) { return false; } // set y_ equal to the arg_min for the inner problem y_ = nlp->arg_min(); } // evaluate object for the outer problem Number arg = 0.5 * (y_ - x[0]) * (y_ - x[0]) + 0.5 * y_ * y_; // avoid a floating-point overflow when arg is too large, return false instead if( arg >= std::log(std::numeric_limits::max()) ) { return false; } obj_value = std::exp(arg); return true; } // eval_grad_f bool eval_grad_f( Index n, const Number* x, bool new_x, Number* grad_f) { assert(n == 1); // evaluate objective, if new_x and outer problem also update y_ Number obj_value; eval_f(n, x, new_x, obj_value); if( inner_ ) { grad_f[0] = obj_value * ((x[0] - a_) + x[0]); return true; } // use fact that gradient of outer objective w.r.t y_ is zero grad_f[0] = obj_value * (x[0] - y_); return true; } // eval_g bool eval_g( Index n, const Number* x, bool new_x, Index m, Number* g) { assert(n == 1 && m == 0); return true; } // eval_jac_g bool eval_jac_g( Index n, const Number* x, bool new_x, Index m, Index nele_jac, Index* iRow, Index* jCol, Number* values) { assert(n == 1 && m == 0 && nele_jac == 0); return true; } // eval_h bool eval_h( Index n, const Number* x, bool new_x, Number obj_factor, Index m, const Number* lambda, bool new_lambda, Index nele_hess, Index* iRow, Index* jCol, Number* values) { // using an approximate Hessian return false; } // finalize_solution void finalize_solution( SolverReturn status, Index n, const Number* x, const Number* z_L, const Number* z_U, Index m, const Number* g, const Number* lambda, Number obj_value, const IpoptData* ip_data, IpoptCalculatedQuantities* ip_cq) { assert(n == 1 && m == 0); arg_min_ = x[0]; } }; int main(int argc, char** argv) { SmartPtr app = IpoptApplicationFactory(); ApplicationReturnStatus status = app->Initialize(); assert(status == Solve_Succeeded); app->Options()->SetStringValue("derivative_test", "first-order"); app->Options()->SetStringValue("hessian_approximation", "limited-memory"); SmartPtr nlp = new recursive_nlp(); status = app->OptimizeTNLP(nlp); if( status == Solve_Succeeded ) { std::cout << "nlp->arg_min() = " << nlp->arg_min() << "\n"; } return EXIT_SUCCESS; } coinor-ipopt-3.14.17/install-sh000077500000000000000000000361151473776672200163500ustar00rootroot00000000000000#!/bin/sh # install - install a program, script, or datafile scriptversion=2024-06-19.01; # UTC # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # 'make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. tab=' ' nl=' ' IFS=" $tab$nl" # Set DOITPROG to "echo" to test this script. doit=${DOITPROG-} doit_exec=${doit:-exec} # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_mkdir= # Desired mode of installed file. mode=0755 # Create dirs (including intermediate dirs) using mode 755. # This is like GNU 'install' as of coreutils 8.32 (2020). mkdir_umask=22 backupsuffix= chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false is_target_a_directory=possibly usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -p pass -p to $cpprog. -s $stripprog installed files. -S SUFFIX attempt to back up existing files, with suffix SUFFIX. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG By default, rm is invoked with -f; when overridden with RMPROG, it's up to you to specify -f if you want it. If -S is not specified, no backups are attempted. Report bugs to . GNU Automake home page: . General help using GNU software: ." while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -p) cpprog="$cpprog -p";; -s) stripcmd=$stripprog;; -S) backupsuffix="$2" shift;; -t) is_target_a_directory=always dst_arg=$2 # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac shift;; -T) is_target_a_directory=never;; --version) echo "$0 (GNU Automake) $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done # We allow the use of options -d and -T together, by making -d # take the precedence; this is for compatibility with GNU install. if test -n "$dir_arg"; then if test -n "$dst_arg"; then echo "$0: target directory not allowed when installing a directory." >&2 exit 1 fi fi if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg # Protect names problematic for 'test' and other utilities. case $dst_arg in -* | [=\(\)!]) dst_arg=./$dst_arg;; esac done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call 'install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then if test $# -gt 1 || test "$is_target_a_directory" = always; then if test ! -d "$dst_arg"; then echo "$0: $dst_arg: Is not a directory." >&2 exit 1 fi fi fi if test -z "$dir_arg"; then do_exit='(exit $ret); exit $ret' trap "ret=129; $do_exit" 1 trap "ret=130; $do_exit" 2 trap "ret=141; $do_exit" 13 trap "ret=143; $do_exit" 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names problematic for 'test' and other utilities. case $src in -* | [=\(\)!]) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? # Don't chown directories that already exist. if test $dstdir_status = 0; then chowncmd="" fi else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # If destination is a directory, append the input filename. if test -d "$dst"; then if test "$is_target_a_directory" = never; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dstbase=`basename "$src"` case $dst in */) dst=$dst$dstbase;; *) dst=$dst/$dstbase;; esac dstdir_status=0 else dstdir=`dirname "$dst"` test -d "$dstdir" dstdir_status=$? fi fi case $dstdir in */) dstdirslash=$dstdir;; *) dstdirslash=$dstdir/;; esac obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false # The $RANDOM variable is not portable (e.g., dash). Use it # here however when possible just to lower collision chance. tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap ' ret=$? rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null exit $ret ' 0 # Because "mkdir -p" follows existing symlinks and we likely work # directly in world-writable /tmp, make sure that the '$tmpdir' # directory is successfully created first before we actually test # 'mkdir -p'. if (umask $mkdir_umask && $mkdirprog $mkdir_mode "$tmpdir" && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibility with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. test_tmpdir="$tmpdir/a" ls_ld_tmpdir=`ls -ld "$test_tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null fi trap '' 0;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; [-=\(\)!]*) prefix='./';; *) prefix='';; esac oIFS=$IFS IFS=/ set -f set fnord $dstdir shift set +f IFS=$oIFS prefixes= for d do test X"$d" = X && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=${dstdirslash}_inst.$$_ rmtmp=${dstdirslash}_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && { test -z "$stripcmd" || { # Create $dsttmp read-write so that cp doesn't create it read-only, # which would cause strip to fail. if test -z "$doit"; then : >"$dsttmp" # No need to fork-exec 'touch'. else $doit touch "$dsttmp" fi } } && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # If $backupsuffix is set, and the file being installed # already exists, attempt a backup. Don't worry if it fails, # e.g., if mv doesn't support -f. if test -n "$backupsuffix" && test -f "$dst"; then $doit $mvcmd -f "$dst" "$dst$backupsuffix" 2>/dev/null fi # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC0" # time-stamp-end: "; # UTC" # End: coinor-ipopt-3.14.17/ltmain.sh000077500000000000000000012232221473776672200161650ustar00rootroot00000000000000#! /usr/bin/env sh ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## by inline-source v2019-02-19.15 # libtool (GNU libtool) 2.5.4 # Provide generalized library-building support services. # Written by Gordon Matzigkeit , 1996 # Copyright (C) 1996-2019, 2021-2024 Free Software Foundation, Inc. # This is free software; see the source for copying conditions. There is NO # warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # GNU Libtool is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # As a special exception to the GNU General Public License, # if you distribute this file as part of a program or library that # is built using GNU Libtool, you may include this file under the # same distribution terms that you use for the rest of that program. # # GNU Libtool is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . PROGRAM=libtool PACKAGE=libtool VERSION=2.5.4 package_revision=2.5.4 ## ------ ## ## Usage. ## ## ------ ## # Run './libtool --help' for help with using this script from the # command line. ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # After configure completes, it has a better idea of some of the # shell tools we need than the defaults used by the functions shared # with bootstrap, so set those here where they can still be over- # ridden by the user, but otherwise take precedence. : ${AUTOCONF="autoconf"} : ${AUTOMAKE="automake"} ## -------------------------- ## ## Source external libraries. ## ## -------------------------- ## # Much of our low-level functionality needs to be sourced from external # libraries, which are installed to $pkgauxdir. # Set a version string for this script. scriptversion=2019-02-19.15; # UTC # General shell script boiler plate, and helper functions. # Written by Gary V. Vaughan, 2004 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2004-2019, 2021, 2023-2024 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # ## ------ ## ## Usage. ## ## ------ ## # Evaluate this file near the top of your script to gain access to # the functions and variables defined here: # # . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh # # If you need to override any of the default environment variable # settings, do that before evaluating this file. ## -------------------- ## ## Shell normalisation. ## ## -------------------- ## # Some shells need a little help to be as Bourne compatible as possible. # Before doing anything else, make sure all that help has been provided! DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # NLS nuisances: We save the old values in case they are required later. _G_user_locale= _G_safe_locale= for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test set = \"\${$_G_var+set}\"; then save_$_G_var=\$$_G_var $_G_var=C export $_G_var _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" fi" done # These NLS vars are set unconditionally (bootstrap issue #24). Unset those # in case the environment reset is needed later and the $save_* variant is not # defined (see the code above). LC_ALL=C LANGUAGE=C export LANGUAGE LC_ALL # Make sure IFS has a sensible default sp=' ' nl=' ' IFS="$sp $nl" # There are apparently some systems that use ';' as a PATH separator! if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # func_unset VAR # -------------- # Portably unset VAR. # In some shells, an 'unset VAR' statement leaves a non-zero return # status if VAR is already unset, which might be problematic if the # statement is used at the end of a function (thus poisoning its return # value) or when 'set -e' is active (causing even a spurious abort of # the script in this case). func_unset () { { eval $1=; (eval unset $1) >/dev/null 2>&1 && eval unset $1 || : ; } } # Make sure CDPATH doesn't cause `cd` commands to output the target dir. func_unset CDPATH # Make sure ${,E,F}GREP behave sanely. func_unset GREP_OPTIONS ## ------------------------- ## ## Locate command utilities. ## ## ------------------------- ## # func_executable_p FILE # ---------------------- # Check that FILE is an executable regular file. func_executable_p () { test -f "$1" && test -x "$1" } # func_path_progs PROGS_LIST CHECK_FUNC [PATH] # -------------------------------------------- # Search for either a program that responds to --version with output # containing "GNU", or else returned by CHECK_FUNC otherwise, by # trying all the directories in PATH with each of the elements of # PROGS_LIST. # # CHECK_FUNC should accept the path to a candidate program, and # set $func_check_prog_result if it truncates its output less than # $_G_path_prog_max characters. func_path_progs () { _G_progs_list=$1 _G_check_func=$2 _G_PATH=${3-"$PATH"} _G_path_prog_max=0 _G_path_prog_found=false _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} for _G_dir in $_G_PATH; do IFS=$_G_save_IFS test -z "$_G_dir" && _G_dir=. for _G_prog_name in $_G_progs_list; do for _exeext in '' .EXE; do _G_path_prog=$_G_dir/$_G_prog_name$_exeext func_executable_p "$_G_path_prog" || continue case `"$_G_path_prog" --version 2>&1` in *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; *) $_G_check_func $_G_path_prog func_path_progs_result=$func_check_prog_result ;; esac $_G_path_prog_found && break 3 done done done IFS=$_G_save_IFS test -z "$func_path_progs_result" && { echo "no acceptable sed could be found in \$PATH" >&2 exit 1 } } # We want to be able to use the functions in this file before configure # has figured out where the best binaries are kept, which means we have # to search for them ourselves - except when the results are already set # where we skip the searches. # Unless the user overrides by setting SED, search the path for either GNU # sed, or the sed that truncates its output the least. test -z "$SED" && { _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ for _G_i in 1 2 3 4 5 6 7; do _G_sed_script=$_G_sed_script$nl$_G_sed_script done echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed _G_sed_script= func_check_prog_sed () { _G_path_prog=$1 _G_count=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo '' >> conftest.nl "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "sed gsed" func_check_prog_sed "$PATH:/usr/xpg4/bin" rm -f conftest.sed SED=$func_path_progs_result } # Unless the user overrides by setting GREP, search the path for either GNU # grep, or the grep that truncates its output the least. test -z "$GREP" && { func_check_prog_grep () { _G_path_prog=$1 _G_count=0 _G_path_prog_max=0 printf 0123456789 >conftest.in while : do cat conftest.in conftest.in >conftest.tmp mv conftest.tmp conftest.in cp conftest.in conftest.nl echo 'GREP' >> conftest.nl "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break diff conftest.out conftest.nl >/dev/null 2>&1 || break _G_count=`expr $_G_count + 1` if test "$_G_count" -gt "$_G_path_prog_max"; then # Best one so far, save it but keep looking for a better one func_check_prog_result=$_G_path_prog _G_path_prog_max=$_G_count fi # 10*(2^10) chars as input seems more than enough test 10 -lt "$_G_count" && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out } func_path_progs "grep ggrep" func_check_prog_grep "$PATH:/usr/xpg4/bin" GREP=$func_path_progs_result } ## ------------------------------- ## ## User overridable command paths. ## ## ------------------------------- ## # All uppercase variable names are used for environment variables. These # variables can be overridden by the user before calling a script that # uses them if a suitable command of that name is not already available # in the command search PATH. : ${CP="cp -f"} : ${ECHO="printf %s\n"} : ${EGREP="$GREP -E"} : ${FGREP="$GREP -F"} : ${LN_S="ln -s"} : ${MAKE="make"} : ${MKDIR="mkdir"} : ${MV="mv -f"} : ${RM="rm -f"} : ${SHELL="${CONFIG_SHELL-/bin/sh}"} ## -------------------- ## ## Useful sed snippets. ## ## -------------------- ## sed_dirname='s|/[^/]*$||' sed_basename='s|^.*/||' # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='s|\([`"$\\]\)|\\\1|g' # Same as above, but do not quote variable references. sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' # Sed substitution that turns a string into a regex matching for the # string literally. sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' # Sed substitution that converts a w32 file name or path # that contains forward slashes, into one that contains # (escaped) backslashes. A very naive implementation. sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' # Re-'\' parameter expansions in output of sed_double_quote_subst that # were '\'-ed in input to the same. If an odd number of '\' preceded a # '$' in input to sed_double_quote_subst, that '$' was protected from # expansion. Since each input '\' is now two '\'s, look for any number # of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. _G_bs='\\' _G_bs2='\\\\' _G_bs4='\\\\\\\\' _G_dollar='\$' sed_double_backslash="\ s/$_G_bs4/&\\ /g s/^$_G_bs2$_G_dollar/$_G_bs&/ s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g s/\n//g" # require_check_ifs_backslash # --------------------------- # Check if we can use backslash as IFS='\' separator, and set # $check_ifs_backshlash_broken to ':' or 'false'. require_check_ifs_backslash=func_require_check_ifs_backslash func_require_check_ifs_backslash () { _G_save_IFS=$IFS IFS='\' _G_check_ifs_backshlash='a\\b' for _G_i in $_G_check_ifs_backshlash do case $_G_i in a) check_ifs_backshlash_broken=false ;; '') break ;; *) check_ifs_backshlash_broken=: break ;; esac done IFS=$_G_save_IFS require_check_ifs_backslash=: } ## ----------------- ## ## Global variables. ## ## ----------------- ## # Except for the global variables explicitly listed below, the following # functions in the '^func_' namespace, and the '^require_' namespace # variables initialised in the 'Resource management' section, sourcing # this file will not pollute your global namespace with anything # else. There's no portable way to scope variables in Bourne shell # though, so actually running these functions will sometimes place # results into a variable named after the function, and often use # temporary variables in the '^_G_' namespace. If you are careful to # avoid using those namespaces casually in your sourcing script, things # should continue to work as you expect. And, of course, you can freely # overwrite any of the functions or variables defined here before # calling anything to customize them. EXIT_SUCCESS=0 EXIT_FAILURE=1 EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. # Allow overriding, eg assuming that you follow the convention of # putting '$debug_cmd' at the start of all your functions, you can get # bash to show function call trace with: # # debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name debug_cmd=${debug_cmd-":"} exit_cmd=: # By convention, finish your script with: # # exit $exit_status # # so that you can set exit_status to non-zero if you want to indicate # something went wrong during execution without actually bailing out at # the point of failure. exit_status=$EXIT_SUCCESS # Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh # is ksh but when the shell is invoked as "sh" and the current value of # the _XPG environment variable is not equal to 1 (one), the special # positional parameter $0, within a function call, is the name of the # function. progpath=$0 # The name of this program. progname=`$ECHO "$progpath" |$SED "$sed_basename"` # Make sure we have an absolute progpath for reexecution: case $progpath in [\\/]*|[A-Za-z]:\\*) ;; *[\\/]*) progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` progdir=`cd "$progdir" && pwd` progpath=$progdir/$progname ;; *) _G_IFS=$IFS IFS=${PATH_SEPARATOR-:} for progdir in $PATH; do IFS=$_G_IFS test -x "$progdir/$progname" && break done IFS=$_G_IFS test -n "$progdir" || progdir=`pwd` progpath=$progdir/$progname ;; esac ## ----------------- ## ## Standard options. ## ## ----------------- ## # The following options affect the operation of the functions defined # below, and should be set appropriately depending on run-time para- # meters passed on the command line. opt_dry_run=false opt_quiet=false opt_verbose=false # Categories 'all' and 'none' are always available. Append any others # you will pass as the first argument to func_warning from your own # code. warning_categories= # By default, display warnings according to 'opt_warning_types'. Set # 'warning_func' to ':' to elide all warnings, or func_fatal_error to # treat the next displayed warning as a fatal error. warning_func=func_warn_and_continue # Set to 'all' to display all warnings, 'none' to suppress all # warnings, or a space delimited list of some subset of # 'warning_categories' to display only the listed warnings. opt_warning_types=all ## -------------------- ## ## Resource management. ## ## -------------------- ## # This section contains definitions for functions that each ensure a # particular resource (a file, or a non-empty configuration variable for # example) is available, and if appropriate to extract default values # from pertinent package files. Call them using their associated # 'require_*' variable to ensure that they are executed, at most, once. # # It's entirely deliberate that calling these functions can set # variables that don't obey the namespace limitations obeyed by the rest # of this file, in order that that they be as useful as possible to # callers. # require_term_colors # ------------------- # Allow display of bold text on terminals that support it. require_term_colors=func_require_term_colors func_require_term_colors () { $debug_cmd test -t 1 && { # COLORTERM and USE_ANSI_COLORS environment variables take # precedence, because most terminfo databases neglect to describe # whether color sequences are supported. test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} if test 1 = "$USE_ANSI_COLORS"; then # Standard ANSI escape sequences tc_reset='' tc_bold=''; tc_standout='' tc_red=''; tc_green='' tc_blue=''; tc_cyan='' else # Otherwise trust the terminfo database after all. test -n "`tput sgr0 2>/dev/null`" && { tc_reset=`tput sgr0` test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` tc_standout=$tc_bold test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` } fi } require_term_colors=: } ## ----------------- ## ## Function library. ## ## ----------------- ## # This section contains a variety of useful functions to call in your # scripts. Take note of the portable wrappers for features provided by # some modern shells, which will fall back to slower equivalents on # less featureful shells. # func_append VAR VALUE # --------------------- # Append VALUE onto the existing contents of VAR. # We should try to minimise forks, especially on Windows where they are # unreasonably slow, so skip the feature probes when bash or zsh are # being used: if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then : ${_G_HAVE_ARITH_OP="yes"} : ${_G_HAVE_XSI_OPS="yes"} # The += operator was introduced in bash 3.1 case $BASH_VERSION in [12].* | 3.0 | 3.0*) ;; *) : ${_G_HAVE_PLUSEQ_OP="yes"} ;; esac fi # _G_HAVE_PLUSEQ_OP # Can be empty, in which case the shell is probed, "yes" if += is # usable or anything else if it does not work. test -z "$_G_HAVE_PLUSEQ_OP" \ && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ && _G_HAVE_PLUSEQ_OP=yes if test yes = "$_G_HAVE_PLUSEQ_OP" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_append () { $debug_cmd eval "$1+=\$2" }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_append () { $debug_cmd eval "$1=\$$1\$2" } fi # func_append_quoted VAR VALUE # ---------------------------- # Quote VALUE and append to the end of shell variable VAR, separated # by a space. if test yes = "$_G_HAVE_PLUSEQ_OP"; then eval 'func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1+=\\ \$func_quote_arg_result" }' else func_append_quoted () { $debug_cmd func_quote_arg pretty "$2" eval "$1=\$$1\\ \$func_quote_arg_result" } fi # func_append_uniq VAR VALUE # -------------------------- # Append unique VALUE onto the existing contents of VAR, assuming # entries are delimited by the first character of VALUE. For example: # # func_append_uniq options " --another-option option-argument" # # will only append to $options if " --another-option option-argument " # is not already present somewhere in $options already (note spaces at # each end implied by leading space in second argument). func_append_uniq () { $debug_cmd eval _G_current_value='`$ECHO $'$1'`' _G_delim=`expr "$2" : '\(.\)'` case $_G_delim$_G_current_value$_G_delim in *"$2$_G_delim"*) ;; *) func_append "$@" ;; esac } # func_arith TERM... # ------------------ # Set func_arith_result to the result of evaluating TERMs. test -z "$_G_HAVE_ARITH_OP" \ && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ && _G_HAVE_ARITH_OP=yes if test yes = "$_G_HAVE_ARITH_OP"; then eval 'func_arith () { $debug_cmd func_arith_result=$(( $* )) }' else func_arith () { $debug_cmd func_arith_result=`expr "$@"` } fi # func_basename FILE # ------------------ # Set func_basename_result to FILE with everything up to and including # the last / stripped. if test yes = "$_G_HAVE_XSI_OPS"; then # If this shell supports suffix pattern removal, then use it to avoid # forking. Hide the definitions single quotes in case the shell chokes # on unsupported syntax... _b='func_basename_result=${1##*/}' _d='case $1 in */*) func_dirname_result=${1%/*}$2 ;; * ) func_dirname_result=$3 ;; esac' else # ...otherwise fall back to using sed. _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` if test "X$func_dirname_result" = "X$1"; then func_dirname_result=$3 else func_append func_dirname_result "$2" fi' fi eval 'func_basename () { $debug_cmd '"$_b"' }' # func_dirname FILE APPEND NONDIR_REPLACEMENT # ------------------------------------------- # Compute the dirname of FILE. If nonempty, add APPEND to the result, # otherwise set result to NONDIR_REPLACEMENT. eval 'func_dirname () { $debug_cmd '"$_d"' }' # func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT # -------------------------------------------------------- # Perform func_basename and func_dirname in a single function # call: # dirname: Compute the dirname of FILE. If nonempty, # add APPEND to the result, otherwise set result # to NONDIR_REPLACEMENT. # value returned in "$func_dirname_result" # basename: Compute filename of FILE. # value returned in "$func_basename_result" # For efficiency, we do not delegate to the functions above but instead # duplicate the functionality here. eval 'func_dirname_and_basename () { $debug_cmd '"$_b"' '"$_d"' }' # func_echo ARG... # ---------------- # Echo program name prefixed message. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname: $_G_line" done IFS=$func_echo_IFS } # func_echo_all ARG... # -------------------- # Invoke $ECHO with all args, space-separated. func_echo_all () { $ECHO "$*" } # func_echo_infix_1 INFIX ARG... # ------------------------------ # Echo program name, followed by INFIX on the first line, with any # additional lines not showing INFIX. func_echo_infix_1 () { $debug_cmd $require_term_colors _G_infix=$1; shift _G_indent=$_G_infix _G_prefix="$progname: $_G_infix: " _G_message=$* # Strip color escape sequences before counting printable length for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" do test -n "$_G_tc" && { _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` } done _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes func_echo_infix_1_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_infix_1_IFS $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 _G_prefix=$_G_indent done IFS=$func_echo_infix_1_IFS } # func_error ARG... # ----------------- # Echo program name prefixed message to standard error. func_error () { $debug_cmd $require_term_colors func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 } # func_fatal_error ARG... # ----------------------- # Echo program name prefixed message to standard error, and exit. func_fatal_error () { $debug_cmd func_error "$*" exit $EXIT_FAILURE } # func_grep EXPRESSION FILENAME # ----------------------------- # Check whether EXPRESSION matches any line of FILENAME, without output. func_grep () { $debug_cmd $GREP "$1" "$2" >/dev/null 2>&1 } # func_len STRING # --------------- # Set func_len_result to the length of STRING. STRING may not # start with a hyphen. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_len () { $debug_cmd func_len_result=${#1} }' else func_len () { $debug_cmd func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` } fi # func_mkdir_p DIRECTORY-PATH # --------------------------- # Make sure the entire path to DIRECTORY-PATH is available. func_mkdir_p () { $debug_cmd _G_directory_path=$1 _G_dir_list= if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then # Protect directory names starting with '-' case $_G_directory_path in -*) _G_directory_path=./$_G_directory_path ;; esac # While some portion of DIR does not yet exist... while test ! -d "$_G_directory_path"; do # ...make a list in topmost first order. Use a colon delimited # list in case some portion of path contains whitespace. _G_dir_list=$_G_directory_path:$_G_dir_list # If the last portion added has no slash in it, the list is done case $_G_directory_path in */*) ;; *) break ;; esac # ...otherwise throw away the child directory and loop _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` done _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` func_mkdir_p_IFS=$IFS; IFS=: for _G_dir in $_G_dir_list; do IFS=$func_mkdir_p_IFS # mkdir can fail with a 'File exist' error if two processes # try to create one of the directories concurrently. Don't # stop in that case! $MKDIR "$_G_dir" 2>/dev/null || : done IFS=$func_mkdir_p_IFS # Bail out if we (or some other process) failed to create a directory. test -d "$_G_directory_path" || \ func_fatal_error "Failed to create '$1'" fi } # func_mktempdir [BASENAME] # ------------------------- # Make a temporary directory that won't clash with other running # libtool processes, and avoids race conditions if possible. If # given, BASENAME is the basename for that directory. func_mktempdir () { $debug_cmd _G_template=${TMPDIR-/tmp}/${1-$progname} if test : = "$opt_dry_run"; then # Return a directory name, but don't create it in dry-run mode _G_tmpdir=$_G_template-$$ else # If mktemp works, use that first and foremost _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` if test ! -d "$_G_tmpdir"; then # Failing that, at least try and use $RANDOM to avoid a race _G_tmpdir=$_G_template-${RANDOM-0}$$ func_mktempdir_umask=`umask` umask 0077 $MKDIR "$_G_tmpdir" umask $func_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure test -d "$_G_tmpdir" || \ func_fatal_error "cannot create temporary directory '$_G_tmpdir'" fi $ECHO "$_G_tmpdir" } # func_normal_abspath PATH # ------------------------ # Remove doubled-up and trailing slashes, "." path components, # and cancel out any ".." path components in PATH after making # it an absolute path. func_normal_abspath () { $debug_cmd # These SED scripts presuppose an absolute path with a trailing slash. _G_pathcar='s|^/\([^/]*\).*$|\1|' _G_pathcdr='s|^/[^/]*||' _G_removedotparts=':dotsl s|/\./|/|g t dotsl s|/\.$|/|' _G_collapseslashes='s|/\{1,\}|/|g' _G_finalslash='s|/*$|/|' # Start from root dir and reassemble the path. func_normal_abspath_result= func_normal_abspath_tpath=$1 func_normal_abspath_altnamespace= case $func_normal_abspath_tpath in "") # Empty path, that just means $cwd. func_stripname '' '/' "`pwd`" func_normal_abspath_result=$func_stripname_result return ;; # The next three entries are used to spot a run of precisely # two leading slashes without using negated character classes; # we take advantage of case's first-match behaviour. ///*) # Unusual form of absolute path, do nothing. ;; //*) # Not necessarily an ordinary path; POSIX reserves leading '//' # and for example Cygwin uses it to access remote file shares # over CIFS/SMB, so we conserve a leading double slash if found. func_normal_abspath_altnamespace=/ ;; /*) # Absolute path, do nothing. ;; *) # Relative path, prepend $cwd. func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath ;; esac # Cancel out all the simple stuff to save iterations. We also want # the path to end with a slash for ease of parsing, so make sure # there is one (and only one) here. func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` while :; do # Processed it all yet? if test / = "$func_normal_abspath_tpath"; then # If we ascended to the root using ".." the result may be empty now. if test -z "$func_normal_abspath_result"; then func_normal_abspath_result=/ fi break fi func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcar"` func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ -e "$_G_pathcdr"` # Figure out what to do with it case $func_normal_abspath_tcomponent in "") # Trailing empty path component, ignore it. ;; ..) # Parent dir; strip last assembled component from result. func_dirname "$func_normal_abspath_result" func_normal_abspath_result=$func_dirname_result ;; *) # Actual path component, append it. func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" ;; esac done # Restore leading double-slash if one was found on entry. func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result } # func_notquiet ARG... # -------------------- # Echo program name prefixed message only when not in quiet mode. func_notquiet () { $debug_cmd $opt_quiet || func_echo ${1+"$@"} # A bug in bash halts the script if the last line of a function # fails when set -e is in force, so we need another command to # work around that: : } # func_relative_path SRCDIR DSTDIR # -------------------------------- # Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. func_relative_path () { $debug_cmd func_relative_path_result= func_normal_abspath "$1" func_relative_path_tlibdir=$func_normal_abspath_result func_normal_abspath "$2" func_relative_path_tbindir=$func_normal_abspath_result # Ascend the tree starting from libdir while :; do # check if we have found a prefix of bindir case $func_relative_path_tbindir in $func_relative_path_tlibdir) # found an exact match func_relative_path_tcancelled= break ;; $func_relative_path_tlibdir*) # found a matching prefix func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" func_relative_path_tcancelled=$func_stripname_result if test -z "$func_relative_path_result"; then func_relative_path_result=. fi break ;; *) func_dirname $func_relative_path_tlibdir func_relative_path_tlibdir=$func_dirname_result if test -z "$func_relative_path_tlibdir"; then # Have to descend all the way to the root! func_relative_path_result=../$func_relative_path_result func_relative_path_tcancelled=$func_relative_path_tbindir break fi func_relative_path_result=../$func_relative_path_result ;; esac done # Now calculate path; take care to avoid doubling-up slashes. func_stripname '' '/' "$func_relative_path_result" func_relative_path_result=$func_stripname_result func_stripname '/' '/' "$func_relative_path_tcancelled" if test -n "$func_stripname_result"; then func_append func_relative_path_result "/$func_stripname_result" fi # Normalisation. If bindir is libdir, return '.' else relative path. if test -n "$func_relative_path_result"; then func_stripname './' '' "$func_relative_path_result" func_relative_path_result=$func_stripname_result fi test -n "$func_relative_path_result" || func_relative_path_result=. : } # func_quote_portable EVAL ARG # ---------------------------- # Internal function to portably implement func_quote_arg. Note that we still # keep attention to performance here so we as much as possible try to avoid # calling sed binary (so far O(N) complexity as long as func_append is O(1)). func_quote_portable () { $debug_cmd $require_check_ifs_backslash func_quote_portable_result=$2 # one-time-loop (easy break) while true do if $1; then func_quote_portable_result=`$ECHO "$2" | $SED \ -e "$sed_double_quote_subst" -e "$sed_double_backslash"` break fi # Quote for eval. case $func_quote_portable_result in *[\\\`\"\$]*) # Fallback to sed for $func_check_bs_ifs_broken=:, or when the string # contains the shell wildcard characters. case $check_ifs_backshlash_broken$func_quote_portable_result in :*|*[\[\*\?]*) func_quote_portable_result=`$ECHO "$func_quote_portable_result" \ | $SED "$sed_quote_subst"` break ;; esac func_quote_portable_old_IFS=$IFS for _G_char in '\' '`' '"' '$' do # STATE($1) PREV($2) SEPARATOR($3) set start "" "" func_quote_portable_result=dummy"$_G_char$func_quote_portable_result$_G_char"dummy IFS=$_G_char for _G_part in $func_quote_portable_result do case $1 in quote) func_append func_quote_portable_result "$3$2" set quote "$_G_part" "\\$_G_char" ;; start) set first "" "" func_quote_portable_result= ;; first) set quote "$_G_part" "" ;; esac done done IFS=$func_quote_portable_old_IFS ;; *) ;; esac break done func_quote_portable_unquoted_result=$func_quote_portable_result case $func_quote_portable_result in # double-quote args containing shell metacharacters to delay # word splitting, command substitution and variable expansion # for a subsequent eval. # many bourne shells cannot handle close brackets correctly # in scan sets, so we specify it separately. *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") func_quote_portable_result=\"$func_quote_portable_result\" ;; esac } # func_quotefast_eval ARG # ----------------------- # Quote one ARG (internal). This is equivalent to 'func_quote_arg eval ARG', # but optimized for speed. Result is stored in $func_quotefast_eval. if test xyes = `(x=; printf -v x %q yes; echo x"$x") 2>/dev/null`; then printf -v _GL_test_printf_tilde %q '~' if test '\~' = "$_GL_test_printf_tilde"; then func_quotefast_eval () { printf -v func_quotefast_eval_result %q "$1" } else # Broken older Bash implementations. Make those faster too if possible. func_quotefast_eval () { case $1 in '~'*) func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result ;; *) printf -v func_quotefast_eval_result %q "$1" ;; esac } fi else func_quotefast_eval () { func_quote_portable false "$1" func_quotefast_eval_result=$func_quote_portable_result } fi # func_quote_arg MODEs ARG # ------------------------ # Quote one ARG to be evaled later. MODEs argument may contain zero or more # specifiers listed below separated by ',' character. This function returns two # values: # i) func_quote_arg_result # double-quoted (when needed), suitable for a subsequent eval # ii) func_quote_arg_unquoted_result # has all characters that are still active within double # quotes backslashified. Available only if 'unquoted' is specified. # # Available modes: # ---------------- # 'eval' (default) # - escape shell special characters # 'expand' # - the same as 'eval'; but do not quote variable references # 'pretty' # - request aesthetic output, i.e. '"a b"' instead of 'a\ b'. This might # be used later in func_quote to get output like: 'echo "a b"' instead # of 'echo a\ b'. This is slower than default on some shells. # 'unquoted' # - produce also $func_quote_arg_unquoted_result which does not contain # wrapping double-quotes. # # Examples for 'func_quote_arg pretty,unquoted string': # # string | *_result | *_unquoted_result # ------------+-----------------------+------------------- # " | \" | \" # a b | "a b" | a b # "a b" | "\"a b\"" | \"a b\" # * | "*" | * # z="${x-$y}" | "z=\"\${x-\$y}\"" | z=\"\${x-\$y}\" # # Examples for 'func_quote_arg pretty,unquoted,expand string': # # string | *_result | *_unquoted_result # --------------+---------------------+-------------------- # z="${x-$y}" | "z=\"${x-$y}\"" | z=\"${x-$y}\" func_quote_arg () { _G_quote_expand=false case ,$1, in *,expand,*) _G_quote_expand=: ;; esac case ,$1, in *,pretty,*|*,expand,*|*,unquoted,*) func_quote_portable $_G_quote_expand "$2" func_quote_arg_result=$func_quote_portable_result func_quote_arg_unquoted_result=$func_quote_portable_unquoted_result ;; *) # Faster quote-for-eval for some shells. func_quotefast_eval "$2" func_quote_arg_result=$func_quotefast_eval_result ;; esac } # func_quote MODEs ARGs... # ------------------------ # Quote all ARGs to be evaled later and join them into single command. See # func_quote_arg's description for more info. func_quote () { $debug_cmd _G_func_quote_mode=$1 ; shift func_quote_result= while test 0 -lt $#; do func_quote_arg "$_G_func_quote_mode" "$1" if test -n "$func_quote_result"; then func_append func_quote_result " $func_quote_arg_result" else func_append func_quote_result "$func_quote_arg_result" fi shift done } # func_stripname PREFIX SUFFIX NAME # --------------------------------- # strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. # PREFIX and SUFFIX must not contain globbing or regex special # characters, hashes, percent signs, but SUFFIX may contain a leading # dot (in which case that matches only a dot). if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_stripname () { $debug_cmd # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are # positional parameters, so assign one to ordinary variable first. func_stripname_result=$3 func_stripname_result=${func_stripname_result#"$1"} func_stripname_result=${func_stripname_result%"$2"} }' else func_stripname () { $debug_cmd case $2 in .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; esac } fi # func_show_eval CMD [FAIL_EXP] # ----------------------------- # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. func_show_eval () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} func_quote_arg pretty,expand "$_G_cmd" eval "func_notquiet $func_quote_arg_result" $opt_dry_run || { eval "$_G_cmd" _G_status=$? if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_show_eval_locale CMD [FAIL_EXP] # ------------------------------------ # Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is # not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP # is given, then evaluate it. Use the saved locale for evaluation. func_show_eval_locale () { $debug_cmd _G_cmd=$1 _G_fail_exp=${2-':'} $opt_quiet || { func_quote_arg expand,pretty "$_G_cmd" eval "func_echo $func_quote_arg_result" } $opt_dry_run || { eval "$_G_user_locale $_G_cmd" _G_status=$? eval "$_G_safe_locale" if test 0 -ne "$_G_status"; then eval "(exit $_G_status); $_G_fail_exp" fi } } # func_tr_sh # ---------- # Turn $1 into a string suitable for a shell variable name. # Result is stored in $func_tr_sh_result. All characters # not in the set a-zA-Z0-9_ are replaced with '_'. Further, # if $1 begins with a digit, a '_' is prepended as well. func_tr_sh () { $debug_cmd case $1 in [0-9]* | *[!a-zA-Z0-9_]*) func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` ;; * ) func_tr_sh_result=$1 ;; esac } # func_verbose ARG... # ------------------- # Echo program name prefixed message in verbose mode only. func_verbose () { $debug_cmd $opt_verbose && func_echo "$*" : } # func_warn_and_continue ARG... # ----------------------------- # Echo program name prefixed warning message to standard error. func_warn_and_continue () { $debug_cmd $require_term_colors func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 } # func_warning CATEGORY ARG... # ---------------------------- # Echo program name prefixed warning message to standard error. Warning # messages can be filtered according to CATEGORY, where this function # elides messages where CATEGORY is not listed in the global variable # 'opt_warning_types'. func_warning () { $debug_cmd # CATEGORY must be in the warning_categories list! case " $warning_categories " in *" $1 "*) ;; *) func_internal_error "invalid warning category '$1'" ;; esac _G_category=$1 shift case " $opt_warning_types " in *" $_G_category "*) $warning_func ${1+"$@"} ;; esac } # func_sort_ver VER1 VER2 # ----------------------- # 'sort -V' is not generally available. # Note this deviates from the version comparison in automake # in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a # but this should suffice as we won't be specifying old # version formats or redundant trailing .0 in bootstrap.conf. # If we did want full compatibility then we should probably # use m4_version_compare from autoconf. func_sort_ver () { $debug_cmd printf '%s\n%s\n' "$1" "$2" \ | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n } # func_lt_ver PREV CURR # --------------------- # Return true if PREV and CURR are in the correct order according to # func_sort_ver, otherwise false. Use it like this: # # func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." func_lt_ver () { $debug_cmd test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: #! /bin/sh # A portable, pluggable option parser for Bourne shell. # Written by Gary V. Vaughan, 2010 # This is free software. There is NO warranty; not even for # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # # Copyright (C) 2010-2019, 2021, 2023-2024 Bootstrap Authors # # This file is dual licensed under the terms of the MIT license # , and GPL version 2 or later # . You must apply one of # these licenses when using or redistributing this software or any of # the files within it. See the URLs above, or the file `LICENSE` # included in the Bootstrap distribution for the full license texts. # Please report bugs or propose patches to: # # Set a version string for this script. scriptversion=2019-02-19.15; # UTC ## ------ ## ## Usage. ## ## ------ ## # This file is a library for parsing options in your shell scripts along # with assorted other useful supporting features that you can make use # of too. # # For the simplest scripts you might need only: # # #!/bin/sh # . relative/path/to/funclib.sh # . relative/path/to/options-parser # scriptversion=1.0 # func_options ${1+"$@"} # eval set dummy "$func_options_result"; shift # ...rest of your script... # # In order for the '--version' option to work, you will need to have a # suitably formatted comment like the one at the top of this file # starting with '# Written by ' and ending with '# Copyright'. # # For '-h' and '--help' to work, you will also need a one line # description of your script's purpose in a comment directly above the # '# Written by ' line, like the one at the top of this file. # # The default options also support '--debug', which will turn on shell # execution tracing (see the comment above debug_cmd below for another # use), and '--verbose' and the func_verbose function to allow your script # to display verbose messages only when your user has specified # '--verbose'. # # After sourcing this file, you can plug in processing for additional # options by amending the variables from the 'Configuration' section # below, and following the instructions in the 'Option parsing' # section further down. ## -------------- ## ## Configuration. ## ## -------------- ## # You should override these variables in your script after sourcing this # file so that they reflect the customisations you have added to the # option parser. # The usage line for option parsing errors and the start of '-h' and # '--help' output messages. You can embed shell variables for delayed # expansion at the time the message is displayed, but you will need to # quote other shell meta-characters carefully to prevent them being # expanded when the contents are evaled. usage='$progpath [OPTION]...' # Short help message in response to '-h' and '--help'. Add to this or # override it after sourcing this library to reflect the full set of # options your script accepts. usage_message="\ --debug enable verbose shell tracing -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -v, --verbose verbosely report processing --version print version information and exit -h, --help print short or long help message and exit " # Additional text appended to 'usage_message' in response to '--help'. long_help_message=" Warning categories include: 'all' show all warnings 'none' turn off all the warnings 'error' warnings are treated as fatal errors" # Help message printed before fatal option parsing errors. fatal_help="Try '\$progname --help' for more information." ## ------------------------- ## ## Hook function management. ## ## ------------------------- ## # This section contains functions for adding, removing, and running hooks # in the main code. A hook is just a list of function names that can be # run in order later on. # func_hookable FUNC_NAME # ----------------------- # Declare that FUNC_NAME will run hooks added with # 'func_add_hook FUNC_NAME ...'. func_hookable () { $debug_cmd func_append hookable_fns " $1" } # func_add_hook FUNC_NAME HOOK_FUNC # --------------------------------- # Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must # first have been declared "hookable" by a call to 'func_hookable'. func_add_hook () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not accept hook functions." ;; esac eval func_append ${1}_hooks '" $2"' } # func_remove_hook FUNC_NAME HOOK_FUNC # ------------------------------------ # Remove HOOK_FUNC from the list of hook functions to be called by # FUNC_NAME. func_remove_hook () { $debug_cmd eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' } # func_propagate_result FUNC_NAME_A FUNC_NAME_B # --------------------------------------------- # If the *_result variable of FUNC_NAME_A _is set_, assign its value to # *_result variable of FUNC_NAME_B. func_propagate_result () { $debug_cmd func_propagate_result_result=: if eval "test \"\${${1}_result+set}\" = set" then eval "${2}_result=\$${1}_result" else func_propagate_result_result=false fi } # func_run_hooks FUNC_NAME [ARG]... # --------------------------------- # Run all hook functions registered to FUNC_NAME. # It's assumed that the list of hook functions contains nothing more # than a whitespace-delimited list of legal shell function names, and # no effort is wasted trying to catch shell meta-characters or preserve # whitespace. func_run_hooks () { $debug_cmd case " $hookable_fns " in *" $1 "*) ;; *) func_fatal_error "'$1' does not support hook functions." ;; esac eval _G_hook_fns=\$$1_hooks; shift for _G_hook in $_G_hook_fns; do func_unset "${_G_hook}_result" eval $_G_hook '${1+"$@"}' func_propagate_result $_G_hook func_run_hooks if $func_propagate_result_result; then eval set dummy "$func_run_hooks_result"; shift fi done } ## --------------- ## ## Option parsing. ## ## --------------- ## # In order to add your own option parsing hooks, you must accept the # full positional parameter list from your hook function. You may remove # or edit any options that you action, and then pass back the remaining # unprocessed options in '_result', escaped # suitably for 'eval'. # # The '_result' variable is automatically unset # before your hook gets called; for best performance, only set the # *_result variable when necessary (i.e. don't call the 'func_quote' # function unnecessarily because it can be an expensive operation on some # machines). # # Like this: # # my_options_prep () # { # $debug_cmd # # # Extend the existing usage message. # usage_message=$usage_message' # -s, --silent don'\''t print informational messages # ' # # No change in '$@' (ignored completely by this hook). Leave # # my_options_prep_result variable intact. # } # func_add_hook func_options_prep my_options_prep # # # my_silent_option () # { # $debug_cmd # # args_changed=false # # # Note that, for efficiency, we parse as many options as we can # # recognise in a loop before passing the remainder back to the # # caller on the first unrecognised argument we encounter. # while test $# -gt 0; do # opt=$1; shift # case $opt in # --silent|-s) opt_silent=: # args_changed=: # ;; # # Separate non-argument short options: # -s*) func_split_short_opt "$_G_opt" # set dummy "$func_split_short_opt_name" \ # "-$func_split_short_opt_arg" ${1+"$@"} # shift # args_changed=: # ;; # *) # Make sure the first unrecognised option "$_G_opt" # # is added back to "$@" in case we need it later, # # if $args_changed was set to 'true'. # set dummy "$_G_opt" ${1+"$@"}; shift; break ;; # esac # done # # # Only call 'func_quote' here if we processed at least one argument. # if $args_changed; then # func_quote eval ${1+"$@"} # my_silent_option_result=$func_quote_result # fi # } # func_add_hook func_parse_options my_silent_option # # # my_option_validation () # { # $debug_cmd # # $opt_silent && $opt_verbose && func_fatal_help "\ # '--silent' and '--verbose' options are mutually exclusive." # } # func_add_hook func_validate_options my_option_validation # # You'll also need to manually amend $usage_message to reflect the extra # options you parse. It's preferable to append if you can, so that # multiple option parsing hooks can be added safely. # func_options_finish [ARG]... # ---------------------------- # Finishing the option parse loop (call 'func_options' hooks ATM). func_options_finish () { $debug_cmd func_run_hooks func_options ${1+"$@"} func_propagate_result func_run_hooks func_options_finish } # func_options [ARG]... # --------------------- # All the functions called inside func_options are hookable. See the # individual implementations for details. func_hookable func_options func_options () { $debug_cmd _G_options_quoted=false for my_func in options_prep parse_options validate_options options_finish do func_unset func_${my_func}_result func_unset func_run_hooks_result eval func_$my_func '${1+"$@"}' func_propagate_result func_$my_func func_options if $func_propagate_result_result; then eval set dummy "$func_options_result"; shift _G_options_quoted=: fi done $_G_options_quoted || { # As we (func_options) are top-level options-parser function and # nobody quoted "$@" for us yet, we need to do it explicitly for # caller. func_quote eval ${1+"$@"} func_options_result=$func_quote_result } } # func_options_prep [ARG]... # -------------------------- # All initialisations required before starting the option parse loop. # Note that when calling hook functions, we pass through the list of # positional parameters. If a hook function modifies that list, and # needs to propagate that back to rest of this script, then the complete # modified list must be put in 'func_run_hooks_result' before returning. func_hookable func_options_prep func_options_prep () { $debug_cmd # Option defaults: opt_verbose=false opt_warning_types= func_run_hooks func_options_prep ${1+"$@"} func_propagate_result func_run_hooks func_options_prep } # func_parse_options [ARG]... # --------------------------- # The main option parsing loop. func_hookable func_parse_options func_parse_options () { $debug_cmd _G_parse_options_requote=false # this just eases exit handling while test $# -gt 0; do # Defer to hook functions for initial option parsing, so they # get priority in the event of reusing an option name. func_run_hooks func_parse_options ${1+"$@"} func_propagate_result func_run_hooks func_parse_options if $func_propagate_result_result; then eval set dummy "$func_parse_options_result"; shift # Even though we may have changed "$@", we passed the "$@" array # down into the hook and it quoted it for us (because we are in # this if-branch). No need to quote it again. _G_parse_options_requote=false fi # Break out of the loop if we already parsed every option. test $# -gt 0 || break # We expect that one of the options parsed in this function matches # and thus we remove _G_opt from "$@" and need to re-quote. _G_match_parse_options=: _G_opt=$1 shift case $_G_opt in --debug|-x) debug_cmd='set -x' func_echo "enabling shell trace mode" >&2 $debug_cmd ;; --no-warnings|--no-warning|--no-warn) set dummy --warnings none ${1+"$@"} shift ;; --warnings|--warning|-W) if test $# = 0 && func_missing_arg $_G_opt; then _G_parse_options_requote=: break fi case " $warning_categories $1" in *" $1 "*) # trailing space prevents matching last $1 above func_append_uniq opt_warning_types " $1" ;; *all) opt_warning_types=$warning_categories ;; *none) opt_warning_types=none warning_func=: ;; *error) opt_warning_types=$warning_categories warning_func=func_fatal_error ;; *) func_fatal_error \ "unsupported warning category: '$1'" ;; esac shift ;; --verbose|-v) opt_verbose=: ;; --version) func_version ;; -\?|-h) func_usage ;; --help) func_help ;; # Separate optargs to long options (plugins may need this): --*=*) func_split_equals "$_G_opt" set dummy "$func_split_equals_lhs" \ "$func_split_equals_rhs" ${1+"$@"} shift ;; # Separate optargs to short options: -W*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "$func_split_short_opt_arg" ${1+"$@"} shift ;; # Separate non-argument short options: -\?*|-h*|-v*|-x*) func_split_short_opt "$_G_opt" set dummy "$func_split_short_opt_name" \ "-$func_split_short_opt_arg" ${1+"$@"} shift ;; --) _G_parse_options_requote=: ; break ;; -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; *) set dummy "$_G_opt" ${1+"$@"}; shift _G_match_parse_options=false break ;; esac if $_G_match_parse_options; then _G_parse_options_requote=: fi done if $_G_parse_options_requote; then # save modified positional parameters for caller func_quote eval ${1+"$@"} func_parse_options_result=$func_quote_result fi } # func_validate_options [ARG]... # ------------------------------ # Perform any sanity checks on option settings and/or unconsumed # arguments. func_hookable func_validate_options func_validate_options () { $debug_cmd # Display all warnings if -W was not given. test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" func_run_hooks func_validate_options ${1+"$@"} func_propagate_result func_run_hooks func_validate_options # Bail if the options were screwed! $exit_cmd $EXIT_FAILURE } ## ----------------- ## ## Helper functions. ## ## ----------------- ## # This section contains the helper functions used by the rest of the # hookable option parser framework in ascii-betical order. # func_fatal_help ARG... # ---------------------- # Echo program name prefixed message to standard error, followed by # a help hint, and exit. func_fatal_help () { $debug_cmd eval \$ECHO \""Usage: $usage"\" eval \$ECHO \""$fatal_help"\" func_error ${1+"$@"} exit $EXIT_FAILURE } # func_help # --------- # Echo long help message to standard output and exit. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message" exit 0 } # func_missing_arg ARGNAME # ------------------------ # Echo program name prefixed message to standard error and set global # exit_cmd. func_missing_arg () { $debug_cmd func_error "Missing argument for '$1'." exit_cmd=exit } # func_split_equals STRING # ------------------------ # Set func_split_equals_lhs and func_split_equals_rhs shell variables # after splitting STRING at the '=' sign. test -z "$_G_HAVE_XSI_OPS" \ && (eval 'x=a/b/c; test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ && _G_HAVE_XSI_OPS=yes if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_equals () { $debug_cmd func_split_equals_lhs=${1%%=*} func_split_equals_rhs=${1#*=} if test "x$func_split_equals_lhs" = "x$1"; then func_split_equals_rhs= fi }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_equals () { $debug_cmd func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` func_split_equals_rhs= test "x$func_split_equals_lhs=" = "x$1" \ || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` } fi #func_split_equals # func_split_short_opt SHORTOPT # ----------------------------- # Set func_split_short_opt_name and func_split_short_opt_arg shell # variables after splitting SHORTOPT after the 2nd character. if test yes = "$_G_HAVE_XSI_OPS" then # This is an XSI compatible shell, allowing a faster implementation... eval 'func_split_short_opt () { $debug_cmd func_split_short_opt_arg=${1#??} func_split_short_opt_name=${1%"$func_split_short_opt_arg"} }' else # ...otherwise fall back to using expr, which is often a shell builtin. func_split_short_opt () { $debug_cmd func_split_short_opt_name=`expr "x$1" : 'x\(-.\)'` func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` } fi #func_split_short_opt # func_usage # ---------- # Echo short help message to standard output and exit. func_usage () { $debug_cmd func_usage_message $ECHO "Run '$progname --help |${PAGER-more}' for full usage" exit 0 } # func_usage_message # ------------------ # Echo short help message to standard output. func_usage_message () { $debug_cmd eval \$ECHO \""Usage: $usage"\" echo $SED -n 's|^# || /^Written by/{ x;p;x } h /^Written by/q' < "$progpath" echo eval \$ECHO \""$usage_message"\" } # func_version # ------------ # Echo version message to standard output and exit. # The version message is extracted from the calling file's header # comments, with leading '# ' stripped: # 1. First display the progname and version # 2. Followed by the header comment line matching /^# Written by / # 3. Then a blank line followed by the first following line matching # /^# Copyright / # 4. Immediately followed by any lines between the previous matches, # except lines preceding the intervening completely blank line. # For example, see the header comments of this file. func_version () { $debug_cmd printf '%s\n' "$progname $scriptversion" $SED -n ' /^# Written by /!b s|^# ||; p; n :fwd2blnk /./ { n b fwd2blnk } p; n :holdwrnt s|^# || s|^# *$|| /^Copyright /!{ /./H n b holdwrnt } s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| G s|\(\n\)\n*|\1|g p; q' < "$progpath" exit $? } # Local variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'before-save-hook 'time-stamp) # time-stamp-pattern: "30/scriptversion=%:y-%02m-%02d.%02H; # UTC" # time-stamp-time-zone: "UTC" # End: # Set a version string. scriptversion='(GNU libtool) 2.5.4' # func_version # ------------ # Echo version message to standard output and exit. func_version () { $debug_cmd year=`date +%Y` cat < This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Originally written by Gordon Matzigkeit, 1996 (See AUTHORS for complete contributor listing) EOF exit $? } # func_echo ARG... # ---------------- # Libtool also displays the current mode in messages, so override # funclib.sh func_echo with this custom definition. func_echo () { $debug_cmd _G_message=$* func_echo_IFS=$IFS IFS=$nl for _G_line in $_G_message; do IFS=$func_echo_IFS $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" done IFS=$func_echo_IFS } ## ---------------- ## ## Options parsing. ## ## ---------------- ## # Hook in the functions to make sure our own options are parsed during # the option parsing loop. usage='$progpath [OPTION]... [MODE-ARG]...' # Short help message in response to '-h'. usage_message="Options: --config show all configuration variables --debug enable verbose shell tracing -n, --dry-run display commands without modifying any files --features display basic configuration information --finish use operation '--mode=finish' --mode=MODE use operation mode MODE --no-finish don't update shared library cache --no-quiet, --no-silent print default informational messages --no-warnings equivalent to '-Wnone' --preserve-dup-deps don't remove duplicate dependency libraries --quiet, --silent don't print informational messages --reorder-cache=DIRS reorder shared library cache for preferred DIRS --tag=TAG use configuration variables from tag TAG -v, --verbose print more informational messages than default --version print version information -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] -h, --help, --help-all print short, long, or detailed help message " # Additional text appended to 'usage_message' in response to '--help'. func_help () { $debug_cmd func_usage_message $ECHO "$long_help_message MODE must be one of the following: clean remove files from the build directory compile compile a source file into a libtool object execute automatically set library path, then run a program finish complete the installation of libtool libraries install install libraries or executables link create a library or an executable uninstall remove libraries from an installed directory MODE-ARGS vary depending on the MODE. When passed as first option, '--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. Try '$progname --help --mode=MODE' for a more detailed description of MODE. When reporting a bug, please describe a test case to reproduce it and include the following information: host-triplet: $host shell: $SHELL compiler: $LTCC compiler flags: $LTCFLAGS linker: $LD (gnu? $with_gnu_ld) version: $progname $scriptversion automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` Report bugs to . GNU libtool home page: . General help using GNU software: ." exit 0 } # func_lo2o OBJECT-NAME # --------------------- # Transform OBJECT-NAME from a '.lo' suffix to the platform specific # object suffix. lo2o=s/\\.lo\$/.$objext/ o2lo=s/\\.$objext\$/.lo/ if test yes = "$_G_HAVE_XSI_OPS"; then eval 'func_lo2o () { case $1 in *.lo) func_lo2o_result=${1%.lo}.$objext ;; * ) func_lo2o_result=$1 ;; esac }' # func_xform LIBOBJ-OR-SOURCE # --------------------------- # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) # suffix to a '.lo' libtool-object suffix. eval 'func_xform () { func_xform_result=${1%.*}.lo }' else # ...otherwise fall back to using sed. func_lo2o () { func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` } func_xform () { func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` } fi # func_fatal_configuration ARG... # ------------------------------- # Echo program name prefixed message to standard error, followed by # a configuration failure hint, and exit. func_fatal_configuration () { func_fatal_error ${1+"$@"} \ "See the $PACKAGE documentation for more information." \ "Fatal configuration error." } # func_config # ----------- # Display the configuration for all the tags in this script. func_config () { re_begincf='^# ### BEGIN LIBTOOL' re_endcf='^# ### END LIBTOOL' # Default configuration. $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" # Now print the configurations for the tags. for tagname in $taglist; do $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" done exit $? } # func_features # ------------- # Display the features supported by this script. func_features () { echo "host: $host" if test yes = "$build_libtool_libs"; then echo "enable shared libraries" else echo "disable shared libraries" fi if test yes = "$build_old_libs"; then echo "enable static libraries" else echo "disable static libraries" fi exit $? } # func_enable_tag TAGNAME # ----------------------- # Verify that TAGNAME is valid, and either flag an error and exit, or # enable the TAGNAME tag. We also add TAGNAME to the global $taglist # variable here. func_enable_tag () { # Global variable: tagname=$1 re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" sed_extractcf=/$re_begincf/,/$re_endcf/p # Validate tagname. case $tagname in *[!-_A-Za-z0-9,/]*) func_fatal_error "invalid tag name: $tagname" ;; esac # Don't test for the "default" C tag, as we know it's # there but not specially marked. case $tagname in CC) ;; *) if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then taglist="$taglist $tagname" # Evaluate the configuration. Be careful to quote the path # and the sed script, to avoid splitting on whitespace, but # also don't use non-portable quotes within backquotes within # quotes we have to do it in 2 steps: extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` eval "$extractedcf" else func_error "ignoring unknown tag $tagname" fi ;; esac } # func_check_version_match # ------------------------ # Ensure that we are using m4 macros, and libtool script from the same # release of libtool. func_check_version_match () { if test "$package_revision" != "$macro_revision"; then if test "$VERSION" != "$macro_version"; then if test -z "$macro_version"; then cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from an older release. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, but the $progname: definition of this LT_INIT comes from $PACKAGE $macro_version. $progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION $progname: and run autoconf again. _LT_EOF fi else cat >&2 <<_LT_EOF $progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, $progname: but the definition of this LT_INIT comes from revision $macro_revision. $progname: You should recreate aclocal.m4 with macros from revision $package_revision $progname: of $PACKAGE $VERSION and run autoconf again. _LT_EOF fi exit $EXIT_MISMATCH fi } # libtool_options_prep [ARG]... # ----------------------------- # Preparation for options parsed by libtool. libtool_options_prep () { $debug_mode # Option defaults: opt_config=false opt_dlopen= opt_dry_run=false opt_help=false opt_mode= opt_reorder_cache=false opt_preserve_dup_deps=false opt_quiet=false opt_finishing=true opt_warning= nonopt= preserve_args= _G_rc_lt_options_prep=: # Shorthand for --mode=foo, only valid as the first argument case $1 in clean|clea|cle|cl) shift; set dummy --mode clean ${1+"$@"}; shift ;; compile|compil|compi|comp|com|co|c) shift; set dummy --mode compile ${1+"$@"}; shift ;; execute|execut|execu|exec|exe|ex|e) shift; set dummy --mode execute ${1+"$@"}; shift ;; finish|finis|fini|fin|fi|f) shift; set dummy --mode finish ${1+"$@"}; shift ;; install|instal|insta|inst|ins|in|i) shift; set dummy --mode install ${1+"$@"}; shift ;; link|lin|li|l) shift; set dummy --mode link ${1+"$@"}; shift ;; uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) shift; set dummy --mode uninstall ${1+"$@"}; shift ;; *) _G_rc_lt_options_prep=false ;; esac if $_G_rc_lt_options_prep; then # Pass back the list of options. func_quote eval ${1+"$@"} libtool_options_prep_result=$func_quote_result fi } func_add_hook func_options_prep libtool_options_prep # libtool_parse_options [ARG]... # --------------------------------- # Provide handling for libtool specific options. libtool_parse_options () { $debug_cmd _G_rc_lt_parse_options=false # Perform our own loop to consume as many options as possible in # each iteration. while test $# -gt 0; do _G_match_lt_parse_options=: _G_opt=$1 shift case $_G_opt in --dry-run|--dryrun|-n) opt_dry_run=: ;; --config) func_config ;; --dlopen|-dlopen) opt_dlopen="${opt_dlopen+$opt_dlopen }$1" shift ;; --preserve-dup-deps) opt_preserve_dup_deps=: ;; --features) func_features ;; --finish) set dummy --mode finish ${1+"$@"}; shift ;; --help) opt_help=: ;; --help-all) opt_help=': help-all' ;; --mode) test $# = 0 && func_missing_arg $_G_opt && break opt_mode=$1 case $1 in # Valid mode arguments: clean|compile|execute|finish|install|link|relink|uninstall) ;; # Catch anything else as an error *) func_error "invalid argument '$1' for $_G_opt" exit_cmd=exit ;; esac shift ;; --no-finish) opt_finishing=false func_append preserve_args " $_G_opt" ;; --no-silent|--no-quiet) opt_quiet=false func_append preserve_args " $_G_opt" ;; --no-warnings|--no-warning|--no-warn) opt_warning=false func_append preserve_args " $_G_opt" ;; --no-verbose) opt_verbose=false func_append preserve_args " $_G_opt" ;; --reorder-cache) opt_reorder_cache=true shared_lib_dirs=$1 if test -n "$shared_lib_dirs"; then case $1 in # Must begin with /: /*) ;; # Catch anything else as an error (relative paths) *) func_error "invalid argument '$1' for $_G_opt" func_error "absolute paths are required for $_G_opt" exit_cmd=exit ;; esac fi shift ;; --silent|--quiet) opt_quiet=: opt_verbose=false func_append preserve_args " $_G_opt" ;; --tag) test $# = 0 && func_missing_arg $_G_opt && break opt_tag=$1 func_append preserve_args " $_G_opt $1" func_enable_tag "$1" shift ;; --verbose|-v) opt_quiet=false opt_verbose=: func_append preserve_args " $_G_opt" ;; # An option not handled by this hook function: *) set dummy "$_G_opt" ${1+"$@"} ; shift _G_match_lt_parse_options=false break ;; esac $_G_match_lt_parse_options && _G_rc_lt_parse_options=: done if $_G_rc_lt_parse_options; then # save modified positional parameters for caller func_quote eval ${1+"$@"} libtool_parse_options_result=$func_quote_result fi } func_add_hook func_parse_options libtool_parse_options # func_warning ARG... # ------------------- # Libtool warnings are not categorized, so override funclib.sh # func_warning with this simpler definition. func_warning () { if $opt_warning; then $debug_cmd $warning_func ${1+"$@"} fi } # libtool_validate_options [ARG]... # --------------------------------- # Perform any sanity checks on option settings and/or unconsumed # arguments. libtool_validate_options () { # save first non-option argument if test 0 -lt $#; then nonopt=$1 shift fi # preserve --debug test : = "$debug_cmd" || func_append preserve_args " --debug" case $host_os in # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 cygwin* | mingw* | windows* | pw32* | cegcc* | solaris2* | os2*) # don't eliminate duplications in $postdeps and $predeps opt_duplicate_compiler_generated_deps=: ;; *) opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps ;; esac $opt_help || { # Sanity checks first: func_check_version_match test yes != "$build_libtool_libs" \ && test yes != "$build_old_libs" \ && func_fatal_configuration "not configured to build any kind of library" # Darwin sucks eval std_shrext=\"$shrext_cmds\" # Only execute mode is allowed to have -dlopen flags. if test -n "$opt_dlopen" && test execute != "$opt_mode"; then func_error "unrecognized option '-dlopen'" $ECHO "$help" 1>&2 exit $EXIT_FAILURE fi # Change the help message to a mode-specific one. generic_help=$help help="Try '$progname --help --mode=$opt_mode' for more information." } # Pass back the unparsed argument list func_quote eval ${1+"$@"} libtool_validate_options_result=$func_quote_result } func_add_hook func_validate_options libtool_validate_options # Process options as early as possible so that --help and --version # can return quickly. func_options ${1+"$@"} eval set dummy "$func_options_result"; shift ## ----------- ## ## Main. ## ## ----------- ## magic='%%%MAGIC variable%%%' magic_exe='%%%MAGIC EXE variable%%%' # Global variables. extracted_archives= extracted_serial=0 # If this variable is set in any of the actions, the command in it # will be execed at the end. This prevents here-documents from being # left over by shells. exec_cmd= # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF $1 _LTECHO_EOF' } # func_generated_by_libtool # True iff stdin has been generated by Libtool. This function is only # a basic sanity check; it will hardly flush out determined imposters. func_generated_by_libtool_p () { $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 } # func_lalib_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_lalib_p () { test -f "$1" && $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p } # func_lalib_unsafe_p file # True iff FILE is a libtool '.la' library or '.lo' object file. # This function implements the same check as func_lalib_p without # resorting to external programs. To this end, it redirects stdin and # closes it afterwards, without saving the original file descriptor. # As a safety measure, use it only where a negative result would be # fatal anyway. Works if 'file' does not exist. func_lalib_unsafe_p () { lalib_p=no if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then for lalib_p_l in 1 2 3 4 do read lalib_p_line case $lalib_p_line in \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; esac done exec 0<&5 5<&- fi test yes = "$lalib_p" } # func_ltwrapper_script_p file # True iff FILE is a libtool wrapper script # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_script_p () { test -f "$1" && $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p } # func_ltwrapper_executable_p file # True iff FILE is a libtool wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_executable_p () { func_ltwrapper_exec_suffix= case $1 in *.exe) ;; *) func_ltwrapper_exec_suffix=.exe ;; esac $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 } # func_ltwrapper_scriptname file # Assumes file is an ltwrapper_executable # uses $file to determine the appropriate filename for a # temporary ltwrapper_script. func_ltwrapper_scriptname () { func_dirname_and_basename "$1" "" "." func_stripname '' '.exe' "$func_basename_result" func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper } # func_ltwrapper_p file # True iff FILE is a libtool wrapper script or wrapper executable # This function is only a basic sanity check; it will hardly flush out # determined imposters. func_ltwrapper_p () { func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" } # func_execute_cmds commands fail_cmd # Execute tilde-delimited COMMANDS. # If FAIL_CMD is given, eval that upon failure. # FAIL_CMD may read-access the current command in variable CMD! func_execute_cmds () { $debug_cmd save_ifs=$IFS; IFS='~' for cmd in $1; do IFS=$sp$nl eval cmd=\"$cmd\" IFS=$save_ifs func_show_eval "$cmd" "${2-:}" done IFS=$save_ifs } # func_source file # Source FILE, adding directory component if necessary. # Note that it is not necessary on cygwin/mingw to append a dot to # FILE even if both FILE and FILE.exe exist: automatic-append-.exe # behavior happens only for exec(3), not for open(2)! Also, sourcing # 'FILE.' does not work on cygwin managed mounts. func_source () { $debug_cmd case $1 in */* | *\\*) . "$1" ;; *) . "./$1" ;; esac } # func_resolve_sysroot PATH # Replace a leading = in PATH with a sysroot. Store the result into # func_resolve_sysroot_result func_resolve_sysroot () { func_resolve_sysroot_result=$1 case $func_resolve_sysroot_result in =*) func_stripname '=' '' "$func_resolve_sysroot_result" func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac } # func_replace_sysroot PATH # If PATH begins with the sysroot, replace it with = and # store the result into func_replace_sysroot_result. func_replace_sysroot () { case $lt_sysroot:$1 in ?*:"$lt_sysroot"*) func_stripname "$lt_sysroot" '' "$1" func_replace_sysroot_result='='$func_stripname_result ;; *) # Including no sysroot. func_replace_sysroot_result=$1 ;; esac } # func_infer_tag arg # Infer tagged configuration to use if any are available and # if one wasn't chosen via the "--tag" command line option. # Only attempt this if the compiler in the base compile # command doesn't match the default compiler. # arg is usually of the form 'gcc ...' func_infer_tag () { $debug_cmd if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do # Double-quote args containing other shell metacharacters. func_append_quoted CC_quoted "$arg" done CC_expanded=`func_echo_all $CC` CC_quoted_expanded=`func_echo_all $CC_quoted` case "$@ " in " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. tagname=$z break ;; esac fi done # If $tagname still isn't set, then no tagged configuration # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then func_echo "unable to infer tagged configuration" func_fatal_error "specify a tag with '--tag'" # else # func_verbose "using $tagname tagged configuration" fi ;; esac fi } # func_write_libtool_object output_name pic_name nonpic_name # Create a libtool object file (analogous to a ".la" file), # but don't create it if we're doing a dry run. func_write_libtool_object () { write_libobj=$1 if test yes = "$build_libtool_libs"; then write_lobj=\'$2\' else write_lobj=none fi if test yes = "$build_old_libs"; then write_oldobj=\'$3\' else write_oldobj=none fi $opt_dry_run || { cat >${write_libobj}T </dev/null` if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | $SED -e "$sed_naive_backslashify"` else func_convert_core_file_wine_to_w32_result= fi fi } # end: func_convert_core_file_wine_to_w32 # func_convert_core_path_wine_to_w32 ARG # Helper function used by path conversion functions when $build is *nix, and # $host is mingw, windows, cygwin, or some other w32 environment. Relies on a # correctly configured wine environment available, with the winepath program # in $build's $PATH. Assumes ARG has no leading or trailing path separator # characters. # # ARG is path to be converted from $build format to win32. # Result is available in $func_convert_core_path_wine_to_w32_result. # Unconvertible file (directory) names in ARG are skipped; if no directory names # are convertible, then the result may be empty. func_convert_core_path_wine_to_w32 () { $debug_cmd # unfortunately, winepath doesn't convert paths, only file names func_convert_core_path_wine_to_w32_result= if test -n "$1"; then oldIFS=$IFS IFS=: for func_convert_core_path_wine_to_w32_f in $1; do IFS=$oldIFS func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" if test -n "$func_convert_core_file_wine_to_w32_result"; then if test -z "$func_convert_core_path_wine_to_w32_result"; then func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result else func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" fi fi done IFS=$oldIFS fi } # end: func_convert_core_path_wine_to_w32 # func_cygpath ARGS... # Wrapper around calling the cygpath program via LT_CYGPATH. This is used when # when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) # $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or # (2), returns the Cygwin file name or path in func_cygpath_result (input # file name or path is assumed to be in w32 format, as previously converted # from $build's *nix or MSYS format). In case (3), returns the w32 file name # or path in func_cygpath_result (input file name or path is assumed to be in # Cygwin format). Returns an empty string on error. # # ARGS are passed to cygpath, with the last one being the file name or path to # be converted. # # Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH # environment variable; do not put it in $PATH. func_cygpath () { $debug_cmd if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` if test "$?" -ne 0; then # on failure, ensure result is empty func_cygpath_result= fi else func_cygpath_result= func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" fi } #end: func_cygpath # func_convert_core_msys_to_w32 ARG # Convert file name or path ARG from MSYS format to w32 format. Return # result in func_convert_core_msys_to_w32_result. func_convert_core_msys_to_w32 () { $debug_cmd # awkward: cmd appends spaces to result func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` } #end: func_convert_core_msys_to_w32 # func_convert_file_check ARG1 ARG2 # Verify that ARG1 (a file name in $build format) was converted to $host # format in ARG2. Otherwise, emit an error message, but continue (resetting # func_to_host_file_result to ARG1). func_convert_file_check () { $debug_cmd if test -z "$2" && test -n "$1"; then func_error "Could not determine host file name corresponding to" func_error " '$1'" func_error "Continuing, but uninstalled executables may not work." # Fallback: func_to_host_file_result=$1 fi } # end func_convert_file_check # func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH # Verify that FROM_PATH (a path in $build format) was converted to $host # format in TO_PATH. Otherwise, emit an error message, but continue, resetting # func_to_host_file_result to a simplistic fallback value (see below). func_convert_path_check () { $debug_cmd if test -z "$4" && test -n "$3"; then func_error "Could not determine the host path corresponding to" func_error " '$3'" func_error "Continuing, but uninstalled executables may not work." # Fallback. This is a deliberately simplistic "conversion" and # should not be "improved". See libtool.info. if test "x$1" != "x$2"; then lt_replace_pathsep_chars="s|$1|$2|g" func_to_host_path_result=`echo "$3" | $SED -e "$lt_replace_pathsep_chars"` else func_to_host_path_result=$3 fi fi } # end func_convert_path_check # func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG # Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT # and appending REPL if ORIG matches BACKPAT. func_convert_path_front_back_pathsep () { $debug_cmd case $4 in $1 ) func_to_host_path_result=$3$func_to_host_path_result ;; esac case $4 in $2 ) func_append func_to_host_path_result "$3" ;; esac } # end func_convert_path_front_back_pathsep # func_convert_delimited_path PATH ORIG_DELIMITER NEW_DELIMITER # Replaces a delimiter for a given path. func_convert_delimited_path () { converted_path=`$ECHO "$1" | $SED "s#$2#$3#g"` } # end func_convert_delimited_path ################################################## # $build to $host FILE NAME CONVERSION FUNCTIONS # ################################################## # invoked via '$to_host_file_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # Result will be available in $func_to_host_file_result. # func_to_host_file ARG # Converts the file name ARG from $build format to $host format. Return result # in func_to_host_file_result. func_to_host_file () { $debug_cmd $to_host_file_cmd "$1" } # end func_to_host_file # func_to_tool_file ARG LAZY # converts the file name ARG from $build format to toolchain format. Return # result in func_to_tool_file_result. If the conversion in use is listed # in (the comma separated) LAZY, no conversion takes place. func_to_tool_file () { $debug_cmd case ,$2, in *,"$to_tool_file_cmd",*) func_to_tool_file_result=$1 ;; *) $to_tool_file_cmd "$1" func_to_tool_file_result=$func_to_host_file_result ;; esac } # end func_to_tool_file # func_convert_file_noop ARG # Copy ARG to func_to_host_file_result. func_convert_file_noop () { func_to_host_file_result=$1 } # end func_convert_file_noop # func_convert_file_msys_to_w32 ARG # Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_file_result. func_convert_file_msys_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_to_host_file_result=$func_convert_core_msys_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_w32 # func_convert_file_cygwin_to_w32 ARG # Convert file name ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_file_cygwin_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # because $build is cygwin, we call "the" cygpath in $PATH; no need to use # LT_CYGPATH in this case. func_to_host_file_result=`cygpath -m "$1"` fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_cygwin_to_w32 # func_convert_file_nix_to_w32 ARG # Convert file name ARG from *nix to w32 format. Requires a wine environment # and a working winepath. Returns result in func_to_host_file_result. func_convert_file_nix_to_w32 () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_file_wine_to_w32 "$1" func_to_host_file_result=$func_convert_core_file_wine_to_w32_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_w32 # func_convert_file_msys_to_cygwin ARG # Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_file_msys_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then func_convert_core_msys_to_w32 "$1" func_cygpath -u "$func_convert_core_msys_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_msys_to_cygwin # func_convert_file_nix_to_cygwin ARG # Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed # in a wine environment, working winepath, and LT_CYGPATH set. Returns result # in func_to_host_file_result. func_convert_file_nix_to_cygwin () { $debug_cmd func_to_host_file_result=$1 if test -n "$1"; then # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. func_convert_core_file_wine_to_w32 "$1" func_cygpath -u "$func_convert_core_file_wine_to_w32_result" func_to_host_file_result=$func_cygpath_result fi func_convert_file_check "$1" "$func_to_host_file_result" } # end func_convert_file_nix_to_cygwin ############################################# # $build to $host PATH CONVERSION FUNCTIONS # ############################################# # invoked via '$to_host_path_cmd ARG' # # In each case, ARG is the path to be converted from $build to $host format. # The result will be available in $func_to_host_path_result. # # Path separators are also converted from $build format to $host format. If # ARG begins or ends with a path separator character, it is preserved (but # converted to $host format) on output. # # All path conversion functions are named using the following convention: # file name conversion function : func_convert_file_X_to_Y () # path conversion function : func_convert_path_X_to_Y () # where, for any given $build/$host combination the 'X_to_Y' value is the # same. If conversion functions are added for new $build/$host combinations, # the two new functions must follow this pattern, or func_init_to_host_path_cmd # will break. # func_init_to_host_path_cmd # Ensures that function "pointer" variable $to_host_path_cmd is set to the # appropriate value, based on the value of $to_host_file_cmd. to_host_path_cmd= func_init_to_host_path_cmd () { $debug_cmd if test -z "$to_host_path_cmd"; then func_stripname 'func_convert_file_' '' "$to_host_file_cmd" to_host_path_cmd=func_convert_path_$func_stripname_result fi } # func_to_host_path ARG # Converts the path ARG from $build format to $host format. Return result # in func_to_host_path_result. func_to_host_path () { $debug_cmd func_init_to_host_path_cmd $to_host_path_cmd "$1" } # end func_to_host_path # func_convert_path_noop ARG # Copy ARG to func_to_host_path_result. func_convert_path_noop () { func_to_host_path_result=$1 } # end func_convert_path_noop # func_convert_path_msys_to_w32 ARG # Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic # conversion to w32 is not available inside the cwrapper. Returns result in # func_to_host_path_result. func_convert_path_msys_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from ARG. MSYS # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; # and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_msys_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_msys_to_w32 # func_convert_path_cygwin_to_w32 ARG # Convert path ARG from Cygwin to w32 format. Returns result in # func_to_host_file_result. func_convert_path_cygwin_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_cygwin_to_w32 # func_convert_path_nix_to_w32 ARG # Convert path ARG from *nix to w32 format. Requires a wine environment and # a working winepath. Returns result in func_to_host_file_result. func_convert_path_nix_to_w32 () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_to_host_path_result=$func_convert_core_path_wine_to_w32_result func_convert_path_check : ";" \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" fi } # end func_convert_path_nix_to_w32 # func_convert_path_msys_to_cygwin ARG # Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. # Returns result in func_to_host_file_result. func_convert_path_msys_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # See func_convert_path_msys_to_w32: func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_msys_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_msys_to_cygwin # func_convert_path_nix_to_cygwin ARG # Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a # a wine environment, working winepath, and LT_CYGPATH set. Returns result in # func_to_host_file_result. func_convert_path_nix_to_cygwin () { $debug_cmd func_to_host_path_result=$1 if test -n "$1"; then # Remove leading and trailing path separator characters from # ARG. msys behavior is inconsistent here, cygpath turns them # into '.;' and ';.', and winepath ignores them completely. func_stripname : : "$1" func_to_host_path_tmp1=$func_stripname_result func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" func_to_host_path_result=$func_cygpath_result func_convert_path_check : : \ "$func_to_host_path_tmp1" "$func_to_host_path_result" func_convert_path_front_back_pathsep ":*" "*:" : "$1" fi } # end func_convert_path_nix_to_cygwin # func_dll_def_p FILE # True iff FILE is a Windows DLL '.def' file. # Keep in sync with _LT_DLL_DEF_P in libtool.m4 func_dll_def_p () { $debug_cmd func_dll_def_p_tmp=`$SED -n \ -e 's/^[ ]*//' \ -e '/^\(;.*\)*$/d' \ -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ -e q \ "$1"` test DEF = "$func_dll_def_p_tmp" } # func_reorder_shared_lib_cache DIRS # Reorder the shared library cache by unconfiguring previous shared library cache # and configuring preferred search directories before previous search directories. # Previous shared library cache: /usr/lib /usr/local/lib # Preferred search directories: /tmp/testing # Reordered shared library cache: /tmp/testing /usr/lib /usr/local/lib func_reorder_shared_lib_cache () { $debug_cmd case $host_os in openbsd*) get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` func_convert_delimited_path "$get_search_directories" ':' '\ ' save_search_directories=$converted_path func_convert_delimited_path "$1" ':' '\ ' # Ensure directories exist for dir in $converted_path; do # Ensure each directory is an absolute path case $dir in /*) ;; *) func_error "Directory '$dir' is not an absolute path" exit $EXIT_FAILURE ;; esac # Ensure no trailing slashes func_stripname '' '/' "$dir" dir=$func_stripname_result if test -d "$dir"; then if test -n "$preferred_search_directories"; then preferred_search_directories="$preferred_search_directories $dir" else preferred_search_directories=$dir fi else func_error "Directory '$dir' does not exist" exit $EXIT_FAILURE fi done PATH="$PATH:/sbin" ldconfig -U $save_search_directories PATH="$PATH:/sbin" ldconfig -m $preferred_search_directories $save_search_directories get_search_directories=`PATH="$PATH:/sbin" ldconfig -r | $GREP "search directories" | $SED "s#.*search directories:\ ##g"` func_convert_delimited_path "$get_search_directories" ':' '\ ' reordered_search_directories=$converted_path $ECHO "Original: $save_search_directories" $ECHO "Reordered: $reordered_search_directories" exit $EXIT_SUCCESS ;; *) func_error "--reorder-cache is not supported for host_os=$host_os." exit $EXIT_FAILURE ;; esac } # end func_reorder_shared_lib_cache # func_mode_compile arg... func_mode_compile () { $debug_cmd # Get the compilation command and the source file. base_compile= srcfile=$nonopt # always keep a non-empty value in "srcfile" suppress_opt=yes suppress_output= arg_mode=normal libobj= later= pie_flag= for arg do case $arg_mode in arg ) # do not "continue". Instead, add this to base_compile lastarg=$arg arg_mode=normal ;; target ) libobj=$arg arg_mode=normal continue ;; normal ) # Accept any command-line options. case $arg in -o) test -n "$libobj" && \ func_fatal_error "you cannot specify '-o' more than once" arg_mode=target continue ;; -pie | -fpie | -fPIE) func_append pie_flag " $arg" continue ;; -shared | -static | -prefer-pic | -prefer-non-pic) func_append later " $arg" continue ;; -no-suppress) suppress_opt=no continue ;; -Xcompiler) arg_mode=arg # the next one goes into the "base_compile" arg list continue # The current "srcfile" will either be retained or ;; # replaced later. I would guess that would be a bug. -Wc,*) func_stripname '-Wc,' '' "$arg" args=$func_stripname_result lastarg= save_ifs=$IFS; IFS=, for arg in $args; do IFS=$save_ifs func_append_quoted lastarg "$arg" done IFS=$save_ifs func_stripname ' ' '' "$lastarg" lastarg=$func_stripname_result # Add the arguments to base_compile. func_append base_compile " $lastarg" continue ;; *) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # lastarg=$srcfile srcfile=$arg ;; esac # case $arg ;; esac # case $arg_mode # Aesthetically quote the previous argument. func_append_quoted base_compile "$lastarg" done # for arg case $arg_mode in arg) func_fatal_error "you must specify an argument for -Xcompile" ;; target) func_fatal_error "you must specify a target with '-o'" ;; *) # Get the name of the library object. test -z "$libobj" && { func_basename "$srcfile" libobj=$func_basename_result } ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo case $libobj in *.[cCFSifmso] | \ *.ada | *.adb | *.ads | *.asm | \ *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) func_xform "$libobj" libobj=$func_xform_result ;; esac case $libobj in *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; *) func_fatal_error "cannot determine name of library object from '$libobj'" ;; esac func_infer_tag $base_compile for arg in $later; do case $arg in -shared) test yes = "$build_libtool_libs" \ || func_fatal_configuration "cannot build a shared library" build_old_libs=no continue ;; -static) build_libtool_libs=no build_old_libs=yes continue ;; -prefer-pic) pic_mode=yes continue ;; -prefer-non-pic) pic_mode=no continue ;; esac done func_quote_arg pretty "$libobj" test "X$libobj" != "X$func_quote_arg_result" \ && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ && func_warning "libobj name '$libobj' may not contain shell special characters." func_dirname_and_basename "$obj" "/" "" objname=$func_basename_result xdir=$func_dirname_result lobj=$xdir$objdir/$objname test -z "$base_compile" && \ func_fatal_help "you must specify a compilation command" # Delete any leftover library objects. if test yes = "$build_old_libs"; then removelist="$obj $lobj $libobj ${libobj}T" else removelist="$lobj $libobj ${libobj}T" fi # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in cygwin* | mingw* | windows* | pw32* | os2* | cegcc*) pic_mode=default ;; esac if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then # non-PIC code in shared libraries is not supported pic_mode=default fi # Calculate the filename of the output object if compiler does # not support -o with -c if test no = "$compiler_c_o"; then output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext lockfile=$output_obj.lock else output_obj= need_locks=no lockfile= fi # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test yes = "$need_locks"; then until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done elif test warn = "$need_locks"; then if test -f "$lockfile"; then $ECHO "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi func_append removelist " $output_obj" $ECHO "$srcfile" > "$lockfile" fi $opt_dry_run || $RM $removelist func_append removelist " $lockfile" trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 srcfile=$func_to_tool_file_result func_quote_arg pretty "$srcfile" qsrcfile=$func_quote_arg_result # Only build a PIC object if we are building libtool libraries. if test yes = "$build_libtool_libs"; then # Without this assignment, base_compile gets emptied. fbsd_hideous_sh_bug=$base_compile if test no != "$pic_mode"; then command="$base_compile $qsrcfile $pic_flag" else # Don't build PIC code command="$base_compile $qsrcfile" fi func_mkdir_p "$xdir$objdir" if test -z "$output_obj"; then # Place PIC objects in $objdir func_append command " -o $lobj" fi func_show_eval_locale "$command" \ 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then func_show_eval '$MV "$output_obj" "$lobj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi # Allow error messages only from the first compilation. if test yes = "$suppress_opt"; then suppress_output=' >/dev/null 2>&1' fi fi # Only build a position-dependent object if we build old libraries. if test yes = "$build_old_libs"; then if test yes != "$pic_mode"; then # Don't build PIC code command="$base_compile $qsrcfile$pie_flag" else command="$base_compile $qsrcfile $pic_flag" fi if test yes = "$compiler_c_o"; then func_append command " -o $obj" fi # Suppress compiler output if we already did a PIC compilation. func_append command "$suppress_output" func_show_eval_locale "$command" \ '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' if test warn = "$need_locks" && test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then $ECHO "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` but it should contain: $srcfile This indicates that another process is trying to use the same temporary object file, and libtool could not work around it because your compiler does not support '-c' and '-o' together. If you repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." $opt_dry_run || $RM $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then func_show_eval '$MV "$output_obj" "$obj"' \ 'error=$?; $opt_dry_run || $RM $removelist; exit $error' fi fi $opt_dry_run || { func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" # Unlock the critical section if it was locked if test no != "$need_locks"; then removelist=$lockfile $RM "$lockfile" fi } exit $EXIT_SUCCESS } $opt_help || { test compile = "$opt_mode" && func_mode_compile ${1+"$@"} } func_mode_help () { # We need to display help for each of the modes. case $opt_mode in "") # Generic help is extracted from the usage comments # at the start of this file. func_help ;; clean) $ECHO \ "Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... Remove files from the build directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, object or program, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; compile) $ECHO \ "Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE Compile a source file into a libtool library object. This mode accepts the following additional options: -o OUTPUT-FILE set the output file name to OUTPUT-FILE -no-suppress do not suppress compiler output for multiple passes -prefer-pic try to build PIC objects only -prefer-non-pic try to build non-PIC objects only -shared do not build a '.o' file suitable for static linking -static only build a '.o' file suitable for static linking -Wc,FLAG -Xcompiler FLAG pass FLAG directly to the compiler COMPILE-COMMAND is a command to be used in creating a 'standard' object file from the given SOURCEFILE. The output file name is determined by removing the directory component from SOURCEFILE, then substituting the C source code suffix '.c' with the library object suffix, '.lo'." ;; execute) $ECHO \ "Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... Automatically set library path, then run a program. This mode accepts the following additional options: -dlopen FILE add the directory containing FILE to the library path This mode sets the library path environment variable according to '-dlopen' flags. If any of the ARGS are libtool executable wrappers, then they are translated into their corresponding uninstalled binary, and any of their required library directories are added to the library path. Then, COMMAND is executed, with ARGS as arguments." ;; finish) $ECHO \ "Usage: $progname [OPTION]... --mode=finish [LIBDIR]... Complete the installation of libtool libraries. Each LIBDIR is a directory that contains libtool libraries. The commands that this mode executes may require superuser privileges. Use the '--dry-run' option if you just want to see what would be executed." ;; install) $ECHO \ "Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... Install executables or libraries. INSTALL-COMMAND is the installation command. The first component should be either the 'install' or 'cp' program. The following components of INSTALL-COMMAND are treated specially: -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation The rest of the components are interpreted as arguments to that command (only BSD-compatible install options are recognized)." ;; link) $ECHO \ "Usage: $progname [OPTION]... --mode=link LINK-COMMAND... Link object files or libraries together to form another library, or to create an executable program. LINK-COMMAND is a command using the C compiler that you would use to create a program from several object files. The following components of LINK-COMMAND are treated specially: -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possible -bindir BINDIR specify path to binaries directory (for systems where libraries must be found in the PATH setting at runtime) -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) -export-symbols SYMFILE try to export only the symbols listed in SYMFILE -export-symbols-regex REGEX try to export only the symbols matching REGEX -LLIBDIR search LIBDIR for required installed libraries -lNAME OUTPUT-FILE requires the installed library libNAME -module build a library that can dlopened -no-fast-install disable the fast-install mode -no-install link a not-installable executable -no-undefined declare that a library does not refer to external symbols -o OUTPUT-FILE create OUTPUT-FILE from the specified objects -objectlist FILE use a list of object files found in FILE to specify objects -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) -precious-files-regex REGEX don't remove output files matching REGEX -release RELEASE specify package release information -rpath LIBDIR the created library will eventually be installed in LIBDIR -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries -shared only do dynamic linking of libtool libraries -shrext SUFFIX override the standard shared library file extension -static do not do any dynamic linking of uninstalled libtool libraries -static-libtool-libs do not do any dynamic linking of libtool libraries -version-info CURRENT[:REVISION[:AGE]] specify library version info [each variable defaults to 0] -weak LIBNAME declare that the target provides the LIBNAME interface -Wc,FLAG -Xcompiler FLAG pass linker-specific FLAG directly to the compiler -Wa,FLAG -Xassembler FLAG pass linker-specific FLAG directly to the assembler -Wl,FLAG -Xlinker FLAG pass linker-specific FLAG directly to the linker -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) All other options (arguments beginning with '-') are ignored. Every other argument is treated as a filename. Files ending in '.la' are treated as uninstalled libtool libraries, other files are standard or library object files. If the OUTPUT-FILE ends in '.la', then a libtool library is created, only library objects ('.lo' files) may be specified, and '-rpath' is required, except when creating a convenience library. If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created using 'ar' and 'ranlib', or on Windows using 'lib'. If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file is created, otherwise an executable program is created." ;; uninstall) $ECHO \ "Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... Remove libraries from an installation directory. RM is the name of the program to use to delete files associated with each FILE (typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed to RM. If FILE is a libtool library, all the files associated with it are deleted. Otherwise, only FILE itself is deleted using RM." ;; *) func_fatal_help "invalid operation mode '$opt_mode'" ;; esac echo $ECHO "Try '$progname --help' for more information about other modes." } # Now that we've collected a possible --mode arg, show help if necessary if $opt_help; then if test : = "$opt_help"; then func_mode_help else { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do func_mode_help done } | $SED -n '1p; 2,$s/^Usage:/ or: /p' { func_help noexit for opt_mode in compile link execute install finish uninstall clean; do echo func_mode_help done } | $SED '1d /^When reporting/,/^Report/{ H d } $x /information about other modes/d /more detailed .*MODE/d s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' fi exit $? fi # If option '--reorder-cache', reorder the shared library cache and exit. if $opt_reorder_cache; then func_reorder_shared_lib_cache $shared_lib_dirs fi # func_mode_execute arg... func_mode_execute () { $debug_cmd # The first argument is the command name. cmd=$nonopt test -z "$cmd" && \ func_fatal_help "you must specify a COMMAND" # Handle -dlopen flags immediately. for file in $opt_dlopen; do test -f "$file" \ || func_fatal_help "'$file' is not a file" dir= case $file in *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$lib' is not a valid libtool archive" # Read the libtool library. dlname= library_names= func_source "$file" # Skip this library if it cannot be dlopened. if test -z "$dlname"; then # Warn if it was a shared library. test -n "$library_names" && \ func_warning "'$file' was not linked with '-export-dynamic'" continue fi func_dirname "$file" "" "." dir=$func_dirname_result if test -f "$dir/$objdir/$dlname"; then func_append dir "/$objdir" else if test ! -f "$dir/$dlname"; then func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" fi fi ;; *.lo) # Just add the directory containing the .lo file. func_dirname "$file" "" "." dir=$func_dirname_result ;; *) func_warning "'-dlopen' is ignored for non-libtool libraries and objects" continue ;; esac # Get the absolute pathname. absdir=`cd "$dir" && pwd` test -n "$absdir" && dir=$absdir # Now add the directory to shlibpath_var. if eval "test -z \"\$$shlibpath_var\""; then eval "$shlibpath_var=\"\$dir\"" else eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" fi done # This variable tells wrapper scripts just to set shlibpath_var # rather than running their programs. libtool_execute_magic=$magic # Check if any of the arguments is a wrapper script. args= for file do case $file in -* | *.la | *.lo ) ;; *) # Do a test to see if this is really a libtool program. if func_ltwrapper_script_p "$file"; then func_source "$file" # Transform arg to wrapped name. file=$progdir/$program elif func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" func_source "$func_ltwrapper_scriptname_result" # Transform arg to wrapped name. file=$progdir/$program fi ;; esac # Quote arguments (to preserve shell metacharacters). func_append_quoted args "$file" done if $opt_dry_run; then # Display what would be done. if test -n "$shlibpath_var"; then eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" echo "export $shlibpath_var" fi $ECHO "$cmd$args" exit $EXIT_SUCCESS else if test -n "$shlibpath_var"; then # Export the shlibpath_var. eval "export $shlibpath_var" fi # Restore saved environment variables for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES do eval "if test \"\${save_$lt_var+set}\" = set; then $lt_var=\$save_$lt_var; export $lt_var else $lt_unset $lt_var fi" done # Now prepare to actually exec the command. exec_cmd=\$cmd$args fi } test execute = "$opt_mode" && func_mode_execute ${1+"$@"} # func_mode_finish arg... func_mode_finish () { $debug_cmd libs= libdirs= admincmds= for opt in "$nonopt" ${1+"$@"} do if test -d "$opt"; then func_append libdirs " $opt" elif test -f "$opt"; then if func_lalib_unsafe_p "$opt"; then func_append libs " $opt" else func_warning "'$opt' is not a valid libtool archive" fi else func_fatal_error "invalid argument '$opt'" fi done if test -n "$libs"; then if test -n "$lt_sysroot"; then sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" else sysroot_cmd= fi # Remove sysroot references if $opt_dry_run; then for lib in $libs; do echo "removing references to $lt_sysroot and '=' prefixes from $lib" done else tmpdir=`func_mktempdir` for lib in $libs; do $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ > $tmpdir/tmp-la mv -f $tmpdir/tmp-la $lib done ${RM}r "$tmpdir" fi fi if test -n "$finish_cmds$finish_eval" && test -n "$libdirs" && $opt_finishing; then for libdir in $libdirs; do if test -n "$finish_cmds"; then # Do each command in the finish commands. func_execute_cmds "$finish_cmds" 'admincmds="$admincmds '"$cmd"'"' fi if test -n "$finish_eval"; then # Do the single finish_eval. eval cmds=\"$finish_eval\" $opt_dry_run || eval "$cmds" || func_append admincmds " $cmds" fi done fi # Exit here if they wanted silent mode. $opt_quiet && exit $EXIT_SUCCESS if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then echo "----------------------------------------------------------------------" echo "Libraries have been installed in:" for libdir in $libdirs; do $ECHO " $libdir" done if test "false" = "$opt_finishing"; then echo echo "NOTE: finish_cmds were not executed during testing, so you must" echo "manually run ldconfig to add a given test directory, LIBDIR, to" echo "the search path for generated executables." fi echo echo "If you ever happen to want to link against installed libraries" echo "in a given directory, LIBDIR, you must either use libtool, and" echo "specify the full pathname of the library, or use the '-LLIBDIR'" echo "flag during linking and do at least one of the following:" if test -n "$shlibpath_var"; then echo " - add LIBDIR to the '$shlibpath_var' environment variable" echo " during execution" fi if test -n "$runpath_var"; then echo " - add LIBDIR to the '$runpath_var' environment variable" echo " during linking" fi if test -n "$hardcode_libdir_flag_spec"; then libdir=LIBDIR eval flag=\"$hardcode_libdir_flag_spec\" $ECHO " - use the '$flag' linker flag" fi if test -n "$admincmds"; then $ECHO " - have your system administrator run these commands:$admincmds" fi if test -f /etc/ld.so.conf; then echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" fi echo echo "See any operating system documentation about shared libraries for" case $host in solaris2.[6789]|solaris2.1[0-9]) echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" echo "pages." ;; *) echo "more information, such as the ld(1) and ld.so(8) manual pages." ;; esac echo "----------------------------------------------------------------------" fi exit $EXIT_SUCCESS } test finish = "$opt_mode" && func_mode_finish ${1+"$@"} # func_mode_install arg... func_mode_install () { $debug_cmd # There may be an optional sh(1) argument at the beginning of # install_prog (especially on Windows NT). if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || # Allow the use of GNU shtool's install command. case $nonopt in *shtool*) :;; *) false;; esac then # Aesthetically quote it. func_quote_arg pretty "$nonopt" install_prog="$func_quote_arg_result " arg=$1 shift else install_prog= arg=$nonopt fi # The real first argument should be the name of the installation program. # Aesthetically quote it. func_quote_arg pretty "$arg" func_append install_prog "$func_quote_arg_result" install_shared_prog=$install_prog case " $install_prog " in *[\\\ /]cp\ *) install_cp=: ;; *) install_cp=false ;; esac # We need to accept at least all the BSD install flags. dest= files= opts= prev= install_type= isdir=false stripme= no_mode=: for arg do arg2= if test -n "$dest"; then func_append files " $dest" dest=$arg continue fi case $arg in -d) isdir=: ;; -f) if $install_cp; then :; else prev=$arg fi ;; -g | -m | -o) prev=$arg ;; -s) stripme=" -s" continue ;; -*) ;; *) # If the previous option needed an argument, then skip it. if test -n "$prev"; then if test X-m = "X$prev" && test -n "$install_override_mode"; then arg2=$install_override_mode no_mode=false fi prev= else dest=$arg continue fi ;; esac # Aesthetically quote the argument. func_quote_arg pretty "$arg" func_append install_prog " $func_quote_arg_result" if test -n "$arg2"; then func_quote_arg pretty "$arg2" fi func_append install_shared_prog " $func_quote_arg_result" done test -z "$install_prog" && \ func_fatal_help "you must specify an install program" test -n "$prev" && \ func_fatal_help "the '$prev' option requires an argument" if test -n "$install_override_mode" && $no_mode; then if $install_cp; then :; else func_quote_arg pretty "$install_override_mode" func_append install_shared_prog " -m $func_quote_arg_result" fi fi if test -z "$files"; then if test -z "$dest"; then func_fatal_help "no file or destination specified" else func_fatal_help "you must specify a destination" fi fi # Strip any trailing slash from the destination. func_stripname '' '/' "$dest" dest=$func_stripname_result # Check to see that the destination is a directory. test -d "$dest" && isdir=: if $isdir; then destdir=$dest destname= else func_dirname_and_basename "$dest" "" "." destdir=$func_dirname_result destname=$func_basename_result # Not a directory, so check to see that there is only one file specified. set dummy $files; shift test "$#" -gt 1 && \ func_fatal_help "'$dest' is not a directory" fi case $destdir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) for file in $files; do case $file in *.lo) ;; *) func_fatal_help "'$destdir' must be an absolute directory name" ;; esac done ;; esac # This variable tells wrapper scripts just to set variables rather # than running their programs. libtool_install_magic=$magic staticlibs= future_libdirs= current_libdirs= for file in $files; do # Do each installation. case $file in *.$libext) # Do the static libraries later. func_append staticlibs " $file" ;; *.la) func_resolve_sysroot "$file" file=$func_resolve_sysroot_result # Check to see that this really is a libtool archive. func_lalib_unsafe_p "$file" \ || func_fatal_help "'$file' is not a valid libtool archive" library_names= old_library= relink_command= func_source "$file" # Add the libdir to current_libdirs if it is the destination. if test "X$destdir" = "X$libdir"; then case "$current_libdirs " in *" $libdir "*) ;; *) func_append current_libdirs " $libdir" ;; esac else # Note the libdir as a future libdir. case "$future_libdirs " in *" $libdir "*) ;; *) func_append future_libdirs " $libdir" ;; esac fi func_dirname "$file" "/" "" dir=$func_dirname_result func_append dir "$objdir" if test -n "$relink_command"; then # Strip any trailing slash from the destination. func_stripname '' '/' "$libdir" destlibdir=$func_stripname_result func_stripname '' '/' "$destdir" s_destdir=$func_stripname_result # Determine the prefix the user has applied to our future dir. inst_prefix_dir=`$ECHO "X$s_destdir" | $Xsed -e "s%$destlibdir\$%%"` # Don't allow the user to place us outside of our expected # location b/c this prevents finding dependent libraries that # are installed to the same prefix. # At present, this check doesn't affect windows .dll's that # are installed into $libdir/../bin (currently, that works fine) # but it's something to keep an eye on. test "$inst_prefix_dir" = "$destdir" && \ func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" if test -n "$inst_prefix_dir"; then # Stick the inst_prefix_dir data into the link command. relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` else relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` fi func_warning "relinking '$file'" func_show_eval "$relink_command" \ 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' fi # See the names of the shared library. set dummy $library_names; shift if test -n "$1"; then realname=$1 shift srcname=$realname test -n "$relink_command" && srcname=${realname}T # Install the shared library and build the symlinks. func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ 'exit $?' tstripme=$stripme case $host_os in cygwin* | mingw* | windows* | pw32* | cegcc*) case $realname in *.dll.a) tstripme= ;; esac ;; os2*) case $realname in *_dll.a) tstripme= ;; esac ;; esac if test -n "$tstripme" && test -n "$striplib"; then func_show_eval "$striplib $destdir/$realname" 'exit $?' fi if test "$#" -gt 0; then # Delete the old symlinks, and create new ones. # Try 'ln -sf' first, because the 'ln' binary might depend on # the symlink we replace! Solaris /bin/ln does not understand -f, # so we also need to try rm && ln -s. for linkname do test "$linkname" != "$realname" \ && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" done fi # Do each command in the postinstall commands. lib=$destdir/$realname func_execute_cmds "$postinstall_cmds" 'exit $?' fi # Install the pseudo-library for information purposes. func_basename "$file" name=$func_basename_result instname=$dir/${name}i func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' # Maybe install the static library, too. test -n "$old_library" && func_append staticlibs " $dir/$old_library" ;; *.lo) # Install (i.e. copy) a libtool object. # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # Deduce the name of the destination old-style object file. case $destfile in *.lo) func_lo2o "$destfile" staticdest=$func_lo2o_result ;; *.$objext) staticdest=$destfile destfile= ;; *) func_fatal_help "cannot copy a libtool object to '$destfile'" ;; esac # Install the libtool object if requested. test -n "$destfile" && \ func_show_eval "$install_prog $file $destfile" 'exit $?' # Install the old object if enabled. if test yes = "$build_old_libs"; then # Deduce the name of the old-style object file. func_lo2o "$file" staticobj=$func_lo2o_result func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' fi exit $EXIT_SUCCESS ;; *) # Figure out destination file name, if it wasn't already specified. if test -n "$destname"; then destfile=$destdir/$destname else func_basename "$file" destfile=$func_basename_result destfile=$destdir/$destfile fi # If the file is missing, and there is a .exe on the end, strip it # because it is most likely a libtool script we actually want to # install stripped_ext= case $file in *.exe) if test ! -f "$file"; then func_stripname '' '.exe' "$file" file=$func_stripname_result stripped_ext=.exe fi ;; esac # Do a test to see if this is really a libtool program. case $host in *cygwin* | *mingw* | *windows*) if func_ltwrapper_executable_p "$file"; then func_ltwrapper_scriptname "$file" wrapper=$func_ltwrapper_scriptname_result else func_stripname '' '.exe' "$file" wrapper=$func_stripname_result fi ;; *) wrapper=$file ;; esac if func_ltwrapper_script_p "$wrapper"; then notinst_deplibs= relink_command= func_source "$wrapper" # Check the variables that should have been set. test -z "$generated_by_libtool_version" && \ func_fatal_error "invalid libtool wrapper script '$wrapper'" finalize=: for lib in $notinst_deplibs; do # Check to see that each library is installed. libdir= if test -f "$lib"; then func_source "$lib" fi libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` if test -n "$libdir" && test ! -f "$libfile"; then func_warning "'$lib' has not been installed in '$libdir'" finalize=false fi done relink_command= func_source "$wrapper" outputname= if test no = "$fast_install" && test -n "$relink_command"; then $opt_dry_run || { if $finalize; then tmpdir=`func_mktempdir` func_basename "$file$stripped_ext" file=$func_basename_result outputname=$tmpdir/$file # Replace the output file specification. relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` $opt_quiet || { func_quote_arg expand,pretty "$relink_command" eval "func_echo $func_quote_arg_result" } if eval "$relink_command"; then : else func_error "error: relink '$file' with the above command before installing it" $opt_dry_run || ${RM}r "$tmpdir" continue fi file=$outputname else func_warning "cannot relink '$file'" fi } else # Install the binary that we compiled earlier. file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` fi fi # remove .exe since cygwin /usr/bin/install will append another # one anyway case $install_prog,$host in */usr/bin/install*,*cygwin*) case $file:$destfile in *.exe:*.exe) # this is ok ;; *.exe:*) destfile=$destfile.exe ;; *:*.exe) func_stripname '' '.exe' "$destfile" destfile=$func_stripname_result ;; esac ;; esac func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' $opt_dry_run || if test -n "$outputname"; then ${RM}r "$tmpdir" fi ;; esac done for file in $staticlibs; do func_basename "$file" name=$func_basename_result # Set up the ranlib parameters. oldlib=$destdir/$name func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 tool_oldlib=$func_to_tool_file_result func_show_eval "$install_prog \$file \$oldlib" 'exit $?' if test -n "$stripme" && test -n "$old_striplib"; then func_show_eval "$old_striplib $tool_oldlib" 'exit $?' fi # Do each command in the postinstall commands. func_execute_cmds "$old_postinstall_cmds" 'exit $?' done test -n "$future_libdirs" && \ func_warning "remember to run '$progname --finish$future_libdirs'" if test -n "$current_libdirs"; then # Maybe just do a dry run. $opt_dry_run && current_libdirs=" -n$current_libdirs" exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' else exit $EXIT_SUCCESS fi } test install = "$opt_mode" && func_mode_install ${1+"$@"} # func_generate_dlsyms outputname originator pic_p # Extract symbols from dlprefiles and create ${outputname}S.o with # a dlpreopen symbol table. func_generate_dlsyms () { $debug_cmd my_outputname=$1 my_originator=$2 my_pic_p=${3-false} my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` my_dlsyms= if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then if test -n "$NM" && test -n "$global_symbol_pipe"; then my_dlsyms=${my_outputname}S.c else func_error "not configured to extract global symbols from dlpreopened files" fi fi if test -n "$my_dlsyms"; then case $my_dlsyms in "") ;; *.c) # Discover the nlist of each of the dlfiles. nlist=$output_objdir/$my_outputname.nm func_show_eval "$RM $nlist ${nlist}S ${nlist}T" # Parse the name list into a source file. func_verbose "creating $output_objdir/$my_dlsyms" $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ /* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ /* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ #ifdef __cplusplus extern \"C\" { #endif #if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) #pragma GCC diagnostic ignored \"-Wstrict-prototypes\" #endif /* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ #if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE /* DATA imports from DLLs on WIN32 can't be const, because runtime relocations are performed -- see ld's documentation on pseudo-relocs. */ # define LT_DLSYM_CONST #elif defined __osf__ /* This system does not cope well with relocations in const data. */ # define LT_DLSYM_CONST #else # define LT_DLSYM_CONST const #endif #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* External symbol declarations for the compiler. */\ " if test yes = "$dlself"; then func_verbose "generating symbol list for '$output'" $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" # Add our own program objects to the symbol list. progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` for progfile in $progfiles; do func_to_tool_file "$progfile" func_convert_file_msys_to_w32 func_verbose "extracting global C symbols from '$func_to_tool_file_result'" $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" done if test -n "$exclude_expsyms"; then $opt_dry_run || { eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi if test -n "$export_symbols_regex"; then $opt_dry_run || { eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' } fi # Prepare the list of exported symbols if test -z "$export_symbols"; then export_symbols=$output_objdir/$outputname.exp $opt_dry_run || { $RM $export_symbols eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' ;; esac } else $opt_dry_run || { eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' eval '$MV "$nlist"T "$nlist"' case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' ;; esac } fi fi for dlprefile in $dlprefiles; do func_verbose "extracting global C symbols from '$dlprefile'" func_basename "$dlprefile" name=$func_basename_result case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) # if an import library, we need to obtain dlname if func_win32_import_lib_p "$dlprefile"; then func_tr_sh "$dlprefile" eval "curr_lafile=\$libfile_$func_tr_sh_result" dlprefile_dlbasename= if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then # Use subshell, to avoid clobbering current variable values dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` if test -n "$dlprefile_dlname"; then func_basename "$dlprefile_dlname" dlprefile_dlbasename=$func_basename_result else # no lafile. user explicitly requested -dlpreopen . $sharedlib_from_linklib_cmd "$dlprefile" dlprefile_dlbasename=$sharedlib_from_linklib_result fi fi $opt_dry_run || { if test -n "$dlprefile_dlbasename"; then eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' else func_warning "Could not compute DLL name from $name" eval '$ECHO ": $name " >> "$nlist"' fi func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 case $host in i[3456]86-*-mingw32*) eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" ;; *) eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/__nm_//' >> '$nlist'" ;; esac } else # not an import lib $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } fi ;; *) $opt_dry_run || { eval '$ECHO ": $name " >> "$nlist"' func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" } ;; esac done $opt_dry_run || { # Make sure we have at least an empty file. test -f "$nlist" || : > "$nlist" if test -n "$exclude_expsyms"; then $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T $MV "$nlist"T "$nlist" fi # Try sorting and uniquifying the output. if $GREP -v "^: " < "$nlist" | if sort -k 3 /dev/null 2>&1; then sort -k 3 else sort +2 fi | uniq > "$nlist"S; then : else $GREP -v "^: " < "$nlist" > "$nlist"S fi if test -f "$nlist"S; then eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' else echo '/* NONE */' >> "$output_objdir/$my_dlsyms" fi func_show_eval '$RM "${nlist}I"' if test -n "$global_symbol_to_import"; then eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' fi echo >> "$output_objdir/$my_dlsyms" "\ /* The mapping between symbol names and symbols. */ typedef struct { const char *name; void *address; } lt_dlsymlist; extern LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[];\ " if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ static void lt_syminit(void) { LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; for (; symbol->name; ++symbol) {" $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" echo >> "$output_objdir/$my_dlsyms" "\ } }" fi echo >> "$output_objdir/$my_dlsyms" "\ LT_DLSYM_CONST lt_dlsymlist lt_${my_prefix}_LTX_preloaded_symbols[] = { {\"$my_originator\", (void *) 0}," if test -s "$nlist"I; then echo >> "$output_objdir/$my_dlsyms" "\ {\"@INIT@\", (void *) <_syminit}," fi case $need_lib_prefix in no) eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; *) eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" ;; esac echo >> "$output_objdir/$my_dlsyms" "\ {0, (void *) 0} }; /* This works around a problem in FreeBSD linker */ #ifdef FREEBSD_WORKAROUND static const void *lt_preloaded_setup() { return lt_${my_prefix}_LTX_preloaded_symbols; } #endif #ifdef __cplusplus } #endif\ " } # !$opt_dry_run pic_flag_for_symtable= case "$compile_command " in *" -static "*) ;; *) case $host in # compiling the symbol table file with pic_flag works around # a FreeBSD bug that causes programs to crash when -lm is # linked before any other PIC object. But we must not use # pic_flag when linking with -static. The problem exists in # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; *-*-hpux*) pic_flag_for_symtable=" $pic_flag" ;; *) $my_pic_p && pic_flag_for_symtable=" $pic_flag" ;; esac ;; esac symtab_cflags= for arg in $LTCFLAGS; do case $arg in -pie | -fpie | -fPIE) ;; *) func_append symtab_cflags " $arg" ;; esac done # Now compile the dynamic symbol file. func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' # Clean up the generated files. func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' # Transform the symbol file into the correct name. symfileobj=$output_objdir/${my_outputname}S.$objext case $host in *cygwin* | *mingw* | *windows* | *cegcc* ) if test -f "$output_objdir/$my_outputname.def"; then compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` else compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` fi ;; *) compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` ;; esac ;; *) func_fatal_error "unknown suffix for '$my_dlsyms'" ;; esac else # We keep going just in case the user didn't refer to # lt_preloaded_symbols. The linker will fail if global_symbol_pipe # really was required. # Nullify the symbol file. compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` fi } # func_cygming_gnu_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is a GNU/binutils-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_gnu_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` test -n "$func_cygming_gnu_implib_tmp" } # func_cygming_ms_implib_p ARG # This predicate returns with zero status (TRUE) if # ARG is an MS-style import library. Returns # with nonzero status (FALSE) otherwise. func_cygming_ms_implib_p () { $debug_cmd func_to_tool_file "$1" func_convert_file_msys_to_w32 func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` test -n "$func_cygming_ms_implib_tmp" } # func_win32_libid arg # return the library type of file 'arg' # # Need a lot of goo to handle *both* DLLs and import libs # Has to be a shell function in order to 'eat' the argument # that is supplied when $file_magic_command is called. # Despite the name, also deal with 64 bit binaries. func_win32_libid () { $debug_cmd win32_libid_type=unknown win32_fileres=`file -L $1 2>/dev/null` case $win32_fileres in *ar\ archive\ import\ library*) # definitely import win32_libid_type="x86 archive import" ;; *ar\ archive*) # could be an import, or static # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64|pe-aarch64)' >/dev/null; then case $nm_interface in "MS dumpbin") if func_cygming_ms_implib_p "$1" || func_cygming_gnu_implib_p "$1" then win32_nmres=import else win32_nmres= fi ;; *) func_to_tool_file "$1" func_convert_file_msys_to_w32 win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | $SED -n -e ' 1,100{ / I /{ s|.*|import| p q } }'` ;; esac case $win32_nmres in import*) win32_libid_type="x86 archive import";; *) win32_libid_type="x86 archive static";; esac fi ;; *DLL*) win32_libid_type="x86 DLL" ;; *executable*) # but shell scripts are "executable" too... case $win32_fileres in *MS\ Windows\ PE\ Intel*) win32_libid_type="x86 DLL" ;; esac ;; esac $ECHO "$win32_libid_type" } # func_cygming_dll_for_implib ARG # # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib () { $debug_cmd sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` } # func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs # # The is the core of a fallback implementation of a # platform-specific function to extract the name of the # DLL associated with the specified import library LIBNAME. # # SECTION_NAME is either .idata$6 or .idata$7, depending # on the platform and compiler that created the implib. # # Echos the name of the DLL associated with the # specified import library. func_cygming_dll_for_implib_fallback_core () { $debug_cmd match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` $OBJDUMP -s --section "$1" "$2" 2>/dev/null | $SED '/^Contents of section '"$match_literal"':/{ # Place marker at beginning of archive member dllname section s/.*/====MARK====/ p d } # These lines can sometimes be longer than 43 characters, but # are always uninteresting /:[ ]*file format pe[i]\{,1\}-/d /^In archive [^:]*:/d # Ensure marker is printed /^====MARK====/p # Remove all lines with less than 43 characters /^.\{43\}/!d # From remaining lines, remove first 43 characters s/^.\{43\}//' | $SED -n ' # Join marker and all lines until next marker into a single line /^====MARK====/ b para H $ b para b :para x s/\n//g # Remove the marker s/^====MARK====// # Remove trailing dots and whitespace s/[\. \t]*$// # Print /./p' | # we now have a list, one entry per line, of the stringified # contents of the appropriate section of all members of the # archive that possess that section. Heuristic: eliminate # all those that have a first or second character that is # a '.' (that is, objdump's representation of an unprintable # character.) This should work for all archives with less than # 0x302f exports -- but will fail for DLLs whose name actually # begins with a literal '.' or a single character followed by # a '.'. # # Of those that remain, print the first one. $SED -e '/^\./d;/^.\./d;q' } # func_cygming_dll_for_implib_fallback ARG # Platform-specific function to extract the # name of the DLL associated with the specified # import library ARG. # # This fallback implementation is for use when $DLLTOOL # does not support the --identify-strict option. # Invoked by eval'ing the libtool variable # $sharedlib_from_linklib_cmd # Result is available in the variable # $sharedlib_from_linklib_result func_cygming_dll_for_implib_fallback () { $debug_cmd if func_cygming_gnu_implib_p "$1"; then # binutils import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` elif func_cygming_ms_implib_p "$1"; then # ms-generated import library sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` else # unknown sharedlib_from_linklib_result= fi } # func_extract_an_archive dir oldlib func_extract_an_archive () { $debug_cmd f_ex_an_ar_dir=$1; shift f_ex_an_ar_oldlib=$1 if test yes = "$lock_old_archive_extraction"; then lockfile=$f_ex_an_ar_oldlib.lock until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do func_echo "Waiting for $lockfile to be removed" sleep 2 done fi func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ 'stat=$?; rm -f "$lockfile"; exit $stat' if test yes = "$lock_old_archive_extraction"; then $opt_dry_run || rm -f "$lockfile" fi if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then : else func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" fi } # func_extract_archives gentop oldlib ... func_extract_archives () { $debug_cmd my_gentop=$1; shift my_oldlibs=${1+"$@"} my_oldobjs= my_xlib= my_xabs= my_xdir= for my_xlib in $my_oldlibs; do # Extract the objects. case $my_xlib in [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; *) my_xabs=`pwd`"/$my_xlib" ;; esac func_basename "$my_xlib" my_xlib=$func_basename_result my_xlib_u=$my_xlib while :; do case " $extracted_archives " in *" $my_xlib_u "*) func_arith $extracted_serial + 1 extracted_serial=$func_arith_result my_xlib_u=lt$extracted_serial-$my_xlib ;; *) break ;; esac done extracted_archives="$extracted_archives $my_xlib_u" my_xdir=$my_gentop/$my_xlib_u func_mkdir_p "$my_xdir" case $host in *-darwin*) func_verbose "Extracting $my_xabs" # Do not bother doing anything if just a dry run $opt_dry_run || { darwin_orig_dir=`pwd` cd $my_xdir || exit $? darwin_archive=$my_xabs darwin_curdir=`pwd` func_basename "$darwin_archive" darwin_base_archive=$func_basename_result darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` if test -n "$darwin_arches"; then darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` darwin_arch= func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" for darwin_arch in $darwin_arches; do func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" cd "unfat-$$/$darwin_base_archive-$darwin_arch" func_extract_an_archive "`pwd`" "$darwin_base_archive" cd "$darwin_curdir" $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" done # $darwin_arches ## Okay now we've a bunch of thin objects, gotta fatten them up :) darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` darwin_file= darwin_files= for darwin_file in $darwin_filelist; do darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` $LIPO -create -output "$darwin_file" $darwin_files done # $darwin_filelist $RM -rf unfat-$$ cd "$darwin_orig_dir" else cd $darwin_orig_dir func_extract_an_archive "$my_xdir" "$my_xabs" fi # $darwin_arches } # !$opt_dry_run ;; *) func_extract_an_archive "$my_xdir" "$my_xabs" ;; esac my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` done func_extract_archives_result=$my_oldobjs } # func_emit_wrapper [arg=no] # # Emit a libtool wrapper script on stdout. # Don't directly open a file because we may want to # incorporate the script contents within a cygwin/mingw/windows # wrapper executable. Must ONLY be called from within # func_mode_link because it depends on a number of variables # set therein. # # ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR # variable will take. If 'yes', then the emitted script # will assume that the directory where it is stored is # the $objdir directory. This is a cygwin/mingw/windows-specific # behavior. func_emit_wrapper () { func_emit_wrapper_arg1=${1-no} $ECHO "\ #! $SHELL # $output - temporary wrapper script for $objdir/$outputname # Generated by $PROGRAM (GNU $PACKAGE) $VERSION # # The $output program cannot be directly executed until all the libtool # libraries that it depends on are installed. # # This wrapper script should never be moved out of the build directory. # If it is, it will not operate correctly. # Sed substitution that helps us do robust quoting. It backslashifies # metacharacters that are still active within double-quoted strings. sed_quote_subst='$sed_quote_subst' # Be Bourne compatible if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh # The HP-UX ksh and POSIX shell print the target directory to stdout # if CDPATH is set. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH relink_command=\"$relink_command\" # This environment variable determines our operation mode. if test \"\$libtool_install_magic\" = \"$magic\"; then # install mode needs the following variables: generated_by_libtool_version='$macro_version' notinst_deplibs='$notinst_deplibs' else # When we are sourced in execute mode, \$file and \$ECHO are already set. if test \"\$libtool_execute_magic\" != \"$magic\"; then file=\"\$0\"" func_quote_arg pretty "$ECHO" qECHO=$func_quote_arg_result $ECHO "\ # A function that is used when there is no print builtin or printf. func_fallback_echo () { eval 'cat <<_LTECHO_EOF \$1 _LTECHO_EOF' } ECHO=$qECHO fi # Very basic option parsing. These options are (a) specific to # the libtool wrapper, (b) are identical between the wrapper # /script/ and the wrapper /executable/ that is used only on # windows platforms, and (c) all begin with the string "--lt-" # (application programs are unlikely to have options that match # this pattern). # # There are only two supported options: --lt-debug and # --lt-dump-script. There is, deliberately, no --lt-help. # # The first argument to this parsing function should be the # script's $0 value, followed by "$@". lt_option_debug= func_parse_lt_options () { lt_script_arg0=\$0 shift for lt_opt do case \"\$lt_opt\" in --lt-debug) lt_option_debug=1 ;; --lt-dump-script) lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` cat \"\$lt_dump_D/\$lt_dump_F\" exit 0 ;; --lt-*) \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 exit 1 ;; esac done # Print the debug banner immediately: if test -n \"\$lt_option_debug\"; then echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 fi } # Used when --lt-debug. Prints its arguments to stdout # (redirection is the responsibility of the caller) func_lt_dump_args () { lt_dump_args_N=1; for lt_arg do \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` done } # Core function for launching the target application func_exec_program_core () { " case $host in # Backslashes separate directories on plain windows *-*-mingw* | *-*-windows* | *-*-os2* | *-cegcc*) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} " ;; *) $ECHO "\ if test -n \"\$lt_option_debug\"; then \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 func_lt_dump_args \${1+\"\$@\"} 1>&2 fi exec \"\$progdir/\$program\" \${1+\"\$@\"} " ;; esac $ECHO "\ \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 exit 1 } # A function to encapsulate launching the target application # Strips options in the --lt-* namespace from \$@ and # launches target application with the remaining arguments. func_exec_program () { case \" \$* \" in *\\ --lt-*) for lt_wr_arg do case \$lt_wr_arg in --lt-*) ;; *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; esac shift done ;; esac func_exec_program_core \${1+\"\$@\"} } # Parse options func_parse_lt_options \"\$0\" \${1+\"\$@\"} # Find the directory that this script lives in. thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` test \"x\$thisdir\" = \"x\$file\" && thisdir=. # Follow symbolic links until we get to the real thisdir. file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` while test -n \"\$file\"; do destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` # If there was a directory component, then change thisdir. if test \"x\$destdir\" != \"x\$file\"; then case \"\$destdir\" in [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; *) thisdir=\"\$thisdir/\$destdir\" ;; esac fi file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` done # Usually 'no', except on cygwin/mingw/windows when embedded into # the cwrapper. WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then # special case for '.' if test \"\$thisdir\" = \".\"; then thisdir=\`pwd\` fi # remove .libs from thisdir case \"\$thisdir\" in *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; $objdir ) thisdir=. ;; esac fi # Try to get the absolute directory name. absdir=\`cd \"\$thisdir\" && pwd\` test -n \"\$absdir\" && thisdir=\"\$absdir\" " if test yes = "$fast_install"; then $ECHO "\ program=lt-'$outputname'$exeext progdir=\"\$thisdir/$objdir\" if test ! -f \"\$progdir/\$program\" || { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ test \"X\$file\" != \"X\$progdir/\$program\"; }; then file=\"\$\$-\$program\" if test ! -d \"\$progdir\"; then $MKDIR \"\$progdir\" else $RM \"\$progdir/\$file\" fi" $ECHO "\ # relink executable if necessary if test -n \"\$relink_command\"; then if relink_command_output=\`eval \$relink_command 2>&1\`; then : else \$ECHO \"\$relink_command_output\" >&2 $RM \"\$progdir/\$file\" exit 1 fi fi $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || { $RM \"\$progdir/\$program\"; $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } $RM \"\$progdir/\$file\" fi" else $ECHO "\ program='$outputname' progdir=\"\$thisdir/$objdir\" " fi $ECHO "\ if test -f \"\$progdir/\$program\"; then" # fixup the dll searchpath if we need to. # # Fix the DLL searchpath if we need to. Do this before prepending # to shlibpath, because on Windows, both are PATH and uninstalled # libraries must come first. if test -n "$dllsearchpath"; then $ECHO "\ # Add the dll search path components to the executable PATH PATH=$dllsearchpath:\$PATH " fi # Export our shlibpath_var if we have one. if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then $ECHO "\ # Add our own library path to $shlibpath_var $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" # Some systems cannot cope with colon-terminated $shlibpath_var # The second colon is a workaround for a bug in BeOS R4 sed $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` export $shlibpath_var " fi $ECHO "\ if test \"\$libtool_execute_magic\" != \"$magic\"; then # Run the actual program with our arguments. func_exec_program \${1+\"\$@\"} fi else # The program doesn't exist. \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 exit 1 fi fi\ " } # func_emit_cwrapperexe_src # emit the source code for a wrapper executable on stdout # Must ONLY be called from within func_mode_link because # it depends on a number of variable set therein. func_emit_cwrapperexe_src () { cat < #include #if defined _WIN32 && !defined __GNUC__ # include # include # include #else # include # include # ifdef __CYGWIN__ # include # endif #endif #include #include #include #include #include #include #include #include #define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) /* declarations of non-ANSI functions */ #if defined __MINGW32__ # ifdef __STRICT_ANSI__ _CRTIMP int __cdecl _putenv (const char *); # endif #elif defined __CYGWIN__ # ifdef __STRICT_ANSI__ char *realpath (const char *, char *); int putenv (char *); int setenv (const char *, const char *, int); # endif /* #elif defined other_platform || defined ... */ #endif /* portability defines, excluding path handling macros */ #if defined _MSC_VER # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv # define S_IXUSR _S_IEXEC #elif defined __MINGW32__ # define setmode _setmode # define stat _stat # define chmod _chmod # define getcwd _getcwd # define putenv _putenv #elif defined __CYGWIN__ # define HAVE_SETENV # define FOPEN_WB "wb" /* #elif defined other platforms ... */ #endif #if defined PATH_MAX # define LT_PATHMAX PATH_MAX #elif defined MAXPATHLEN # define LT_PATHMAX MAXPATHLEN #else # define LT_PATHMAX 1024 #endif #ifndef S_IXOTH # define S_IXOTH 0 #endif #ifndef S_IXGRP # define S_IXGRP 0 #endif /* path handling portability macros */ #ifndef DIR_SEPARATOR # define DIR_SEPARATOR '/' # define PATH_SEPARATOR ':' #endif #if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ defined __OS2__ # define HAVE_DOS_BASED_FILE_SYSTEM # define FOPEN_WB "wb" # ifndef DIR_SEPARATOR_2 # define DIR_SEPARATOR_2 '\\' # endif # ifndef PATH_SEPARATOR_2 # define PATH_SEPARATOR_2 ';' # endif #endif #ifndef DIR_SEPARATOR_2 # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) #else /* DIR_SEPARATOR_2 */ # define IS_DIR_SEPARATOR(ch) \ (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) #endif /* DIR_SEPARATOR_2 */ #ifndef PATH_SEPARATOR_2 # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) #else /* PATH_SEPARATOR_2 */ # define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) #endif /* PATH_SEPARATOR_2 */ #ifndef FOPEN_WB # define FOPEN_WB "w" #endif #ifndef _O_BINARY # define _O_BINARY 0 #endif #define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) #define XFREE(stale) do { \ if (stale) { free (stale); stale = 0; } \ } while (0) #if defined LT_DEBUGWRAPPER static int lt_debug = 1; #else static int lt_debug = 0; #endif const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ void *xmalloc (size_t num); char *xstrdup (const char *string); const char *base_name (const char *name); char *find_executable (const char *wrapper); char *chase_symlinks (const char *pathspec); int make_executable (const char *path); int check_executable (const char *path); char *strendzap (char *str, const char *pat); void lt_debugprintf (const char *file, int line, const char *fmt, ...); void lt_fatal (const char *file, int line, const char *message, ...); static const char *nonnull (const char *s); static const char *nonempty (const char *s); void lt_setenv (const char *name, const char *value); char *lt_extend_str (const char *orig_value, const char *add, int to_end); void lt_update_exe_path (const char *name, const char *value); void lt_update_lib_path (const char *name, const char *value); char **prepare_spawn (char **argv); void lt_dump_script (FILE *f); EOF cat <= 0) && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return 1; else return 0; } int make_executable (const char *path) { int rval = 0; struct stat st; lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", nonempty (path)); if ((!path) || (!*path)) return 0; if (stat (path, &st) >= 0) { rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); } return rval; } /* Searches for the full path of the wrapper. Returns newly allocated full path name if found, NULL otherwise Does not chase symlinks, even on platforms that support them. */ char * find_executable (const char *wrapper) { int has_slash = 0; const char *p; const char *p_next; /* static buffer for getcwd */ char tmp[LT_PATHMAX + 1]; size_t tmp_len; char *concat_name; lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", nonempty (wrapper)); if ((wrapper == NULL) || (*wrapper == '\0')) return NULL; /* Absolute path? */ #if defined HAVE_DOS_BASED_FILE_SYSTEM if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } else { #endif if (IS_DIR_SEPARATOR (wrapper[0])) { concat_name = xstrdup (wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } #if defined HAVE_DOS_BASED_FILE_SYSTEM } #endif for (p = wrapper; *p; p++) if (*p == '/') { has_slash = 1; break; } if (!has_slash) { /* no slashes; search PATH */ const char *path = getenv ("PATH"); if (path != NULL) { for (p = path; *p; p = p_next) { const char *q; size_t p_len; for (q = p; *q; q++) if (IS_PATH_SEPARATOR (*q)) break; p_len = (size_t) (q - p); p_next = (*q == '\0' ? q : q + 1); if (p_len == 0) { /* empty path: current directory */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); } else { concat_name = XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, p, p_len); concat_name[p_len] = '/'; strcpy (concat_name + p_len + 1, wrapper); } if (check_executable (concat_name)) return concat_name; XFREE (concat_name); } } /* not found in PATH; assume curdir */ } /* Relative path | not found in path: prepend cwd */ if (getcwd (tmp, LT_PATHMAX) == NULL) lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", nonnull (strerror (errno))); tmp_len = strlen (tmp); concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); memcpy (concat_name, tmp, tmp_len); concat_name[tmp_len] = '/'; strcpy (concat_name + tmp_len + 1, wrapper); if (check_executable (concat_name)) return concat_name; XFREE (concat_name); return NULL; } char * chase_symlinks (const char *pathspec) { #ifndef S_ISLNK return xstrdup (pathspec); #else char buf[LT_PATHMAX]; struct stat s; char *tmp_pathspec = xstrdup (pathspec); char *p; int has_symlinks = 0; while (strlen (tmp_pathspec) && !has_symlinks) { lt_debugprintf (__FILE__, __LINE__, "checking path component for symlinks: %s\n", tmp_pathspec); if (lstat (tmp_pathspec, &s) == 0) { if (S_ISLNK (s.st_mode) != 0) { has_symlinks = 1; break; } /* search backwards for last DIR_SEPARATOR */ p = tmp_pathspec + strlen (tmp_pathspec) - 1; while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) p--; if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) { /* no more DIR_SEPARATORS left */ break; } *p = '\0'; } else { lt_fatal (__FILE__, __LINE__, "error accessing file \"%s\": %s", tmp_pathspec, nonnull (strerror (errno))); } } XFREE (tmp_pathspec); if (!has_symlinks) { return xstrdup (pathspec); } tmp_pathspec = realpath (pathspec, buf); if (tmp_pathspec == 0) { lt_fatal (__FILE__, __LINE__, "could not follow symlinks for %s", pathspec); } return xstrdup (tmp_pathspec); #endif } char * strendzap (char *str, const char *pat) { size_t len, patlen; assert (str != NULL); assert (pat != NULL); len = strlen (str); patlen = strlen (pat); if (patlen <= len) { str += len - patlen; if (STREQ (str, pat)) *str = '\0'; } return str; } void lt_debugprintf (const char *file, int line, const char *fmt, ...) { va_list args; if (lt_debug) { (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); va_start (args, fmt); (void) vfprintf (stderr, fmt, args); va_end (args); } } static void lt_error_core (int exit_status, const char *file, int line, const char *mode, const char *message, va_list ap) { fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); vfprintf (stderr, message, ap); fprintf (stderr, ".\n"); if (exit_status >= 0) exit (exit_status); } void lt_fatal (const char *file, int line, const char *message, ...) { va_list ap; va_start (ap, message); lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); va_end (ap); } static const char * nonnull (const char *s) { return s ? s : "(null)"; } static const char * nonempty (const char *s) { return (s && !*s) ? "(empty)" : nonnull (s); } void lt_setenv (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_setenv) setting '%s' to '%s'\n", nonnull (name), nonnull (value)); { #ifdef HAVE_SETENV /* always make a copy, for consistency with !HAVE_SETENV */ char *str = xstrdup (value); setenv (name, str, 1); #else size_t len = strlen (name) + 1 + strlen (value) + 1; char *str = XMALLOC (char, len); sprintf (str, "%s=%s", name, value); if (putenv (str) != EXIT_SUCCESS) { XFREE (str); } #endif } } char * lt_extend_str (const char *orig_value, const char *add, int to_end) { char *new_value; if (orig_value && *orig_value) { size_t orig_value_len = strlen (orig_value); size_t add_len = strlen (add); new_value = XMALLOC (char, add_len + orig_value_len + 1); if (to_end) { strcpy (new_value, orig_value); strcpy (new_value + orig_value_len, add); } else { strcpy (new_value, add); strcpy (new_value + add_len, orig_value); } } else { new_value = xstrdup (add); } return new_value; } void lt_update_exe_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); /* some systems can't cope with a ':'-terminated path #' */ size_t len = strlen (new_value); while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) { new_value[--len] = '\0'; } lt_setenv (name, new_value); XFREE (new_value); } } void lt_update_lib_path (const char *name, const char *value) { lt_debugprintf (__FILE__, __LINE__, "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", nonnull (name), nonnull (value)); if (name && *name && value && *value) { char *new_value = lt_extend_str (getenv (name), value, 0); lt_setenv (name, new_value); XFREE (new_value); } } EOF case $host_os in mingw* | windows*) cat <<"EOF" /* Prepares an argument vector before calling spawn(). Note that spawn() does not by itself call the command interpreter (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); GetVersionEx(&v); v.dwPlatformId == VER_PLATFORM_WIN32_NT; }) ? "cmd.exe" : "command.com"). Instead it simply concatenates the arguments, separated by ' ', and calls CreateProcess(). We must quote the arguments since Win32 CreateProcess() interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a special way: - Space and tab are interpreted as delimiters. They are not treated as delimiters if they are surrounded by double quotes: "...". - Unescaped double quotes are removed from the input. Their only effect is that within double quotes, space and tab are treated like normal characters. - Backslashes not followed by double quotes are not special. - But 2*n+1 backslashes followed by a double quote become n backslashes followed by a double quote (n >= 0): \" -> " \\\" -> \" \\\\\" -> \\" */ #define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" #define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" char ** prepare_spawn (char **argv) { size_t argc; char **new_argv; size_t i; /* Count number of arguments. */ for (argc = 0; argv[argc] != NULL; argc++) ; /* Allocate new argument vector. */ new_argv = XMALLOC (char *, argc + 1); /* Put quoted arguments into the new argument vector. */ for (i = 0; i < argc; i++) { const char *string = argv[i]; if (string[0] == '\0') new_argv[i] = xstrdup ("\"\""); else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) { int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); size_t length; unsigned int backslashes; const char *s; char *quoted_string; char *p; length = 0; backslashes = 0; if (quote_around) length++; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') length += backslashes + 1; length++; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) length += backslashes + 1; quoted_string = XMALLOC (char, length + 1); p = quoted_string; backslashes = 0; if (quote_around) *p++ = '"'; for (s = string; *s != '\0'; s++) { char c = *s; if (c == '"') { unsigned int j; for (j = backslashes + 1; j > 0; j--) *p++ = '\\'; } *p++ = c; if (c == '\\') backslashes++; else backslashes = 0; } if (quote_around) { unsigned int j; for (j = backslashes; j > 0; j--) *p++ = '\\'; *p++ = '"'; } *p = '\0'; new_argv[i] = quoted_string; } else new_argv[i] = (char *) string; } new_argv[argc] = NULL; return new_argv; } EOF ;; esac cat <<"EOF" void lt_dump_script (FILE* f) { EOF func_emit_wrapper yes | $SED -n -e ' s/^\(.\{79\}\)\(..*\)/\1\ \2/ h s/\([\\"]\)/\\\1/g s/$/\\n/ s/\([^\n]*\).*/ fputs ("\1", f);/p g D' cat <<"EOF" } EOF } # end: func_emit_cwrapperexe_src # func_win32_import_lib_p ARG # True if ARG is an import lib, as indicated by $file_magic_cmd func_win32_import_lib_p () { $debug_cmd case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in *import*) : ;; *) false ;; esac } # func_suncc_cstd_abi # !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! # Several compiler flags select an ABI that is incompatible with the # Cstd library. Avoid specifying it if any are in CXXFLAGS. func_suncc_cstd_abi () { $debug_cmd case " $compile_command " in *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) suncc_use_cstd_abi=no ;; *) suncc_use_cstd_abi=yes ;; esac } # func_mode_link arg... func_mode_link () { $debug_cmd case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # what system we are compiling for in order to pass an extra # flag for every libtool invocation. # allow_undefined=no # FIXME: Unfortunately, there are problems with the above when trying # to make a dll that has undefined symbols, in which case not # even a static library is built. For now, we need to specify # -no-undefined on the libtool link line when we can be certain # that all symbols are satisfied, otherwise we get a static library. allow_undefined=yes ;; *) allow_undefined=yes ;; esac libtool_args=$nonopt base_compile="$nonopt $@" compile_command=$nonopt finalize_command=$nonopt compile_rpath= compile_rpath_tail= finalize_rpath= compile_shlibpath= finalize_shlibpath= convenience= old_convenience= deplibs= old_deplibs= compiler_flags= linker_flags= dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= new_inherited_linker_flags= avoid_version=no bindir= dlfiles= dlprefiles= dlself=no export_dynamic=no export_symbols= export_symbols_regex= generated= libobjs= ltlibs= module=no no_install=no objs= os2dllname= non_pic_objects= precious_files_regex= prefer_static_libs=no preload=false prev= prevarg= release= rpath= xrpath= perm_rpath= temp_rpath= temp_rpath_tail= thread_safe=no vinfo= vinfo_number=no weak_libs= rpath_arg= single_module=$wl-single_module func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in -shared) test yes != "$build_libtool_libs" \ && func_fatal_configuration "cannot build a shared library" build_old_libs=no break ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then func_warning "complete static linking is impossible in this configuration" fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; -static) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=built ;; -static-libtool-libs) if test -z "$pic_flag" && test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static fi prefer_static_libs=yes ;; esac build_libtool_libs=no build_old_libs=yes break ;; esac done # See if our shared archives depend on static archives. test -n "$old_archive_from_new_cmds" && build_old_libs=yes # Go through the arguments, transforming them on the way. while test "$#" -gt 0; do arg=$1 shift func_quote_arg pretty,unquoted "$arg" qarg=$func_quote_arg_unquoted_result func_append libtool_args " $func_quote_arg_result" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) func_append compile_command " @OUTPUT@" func_append finalize_command " @OUTPUT@" ;; esac case $prev in bindir) bindir=$arg prev= continue ;; dlfiles|dlprefiles) $preload || { # Add the symbol object into the linking commands. func_append compile_command " @SYMFILE@" func_append finalize_command " @SYMFILE@" preload=: } case $arg in *.la | *.lo) ;; # We handle these cases below. force) if test no = "$dlself"; then dlself=needless export_dynamic=yes fi prev= continue ;; self) if test dlprefiles = "$prev"; then dlself=yes elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then dlself=yes else dlself=needless export_dynamic=yes fi prev= continue ;; *) if test dlfiles = "$prev"; then func_append dlfiles " $arg" else func_append dlprefiles " $arg" fi prev= continue ;; esac ;; expsyms) export_symbols=$arg test -f "$arg" \ || func_fatal_error "symbol file '$arg' does not exist" prev= continue ;; expsyms_regex) export_symbols_regex=$arg prev= continue ;; framework) case $host in *-*-darwin*) case "$deplibs " in *" $qarg.ltframework "*) ;; *) func_append deplibs " $qarg.ltframework" # this is fixed later ;; esac ;; esac prev= continue ;; inst_prefix) inst_prefix_dir=$arg prev= continue ;; mllvm) # Clang does not use LLVM to link, so we can simply discard any # '-mllvm $arg' options when doing the link step. prev= continue ;; objectlist) if test -f "$arg"; then save_arg=$arg moreargs= for fil in `cat "$save_arg"` do # func_append moreargs " $fil" arg=$fil # A libtool-controlled object. # Check to see that this really is a libtool object. if func_lalib_unsafe_p "$arg"; then pic_object= non_pic_object= # Read the .lo file func_source "$arg" if test -z "$pic_object" || test -z "$non_pic_object" || test none = "$pic_object" && test none = "$non_pic_object"; then func_fatal_error "cannot find name of object for '$arg'" fi # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result if test none != "$pic_object"; then # Prepend the subdirectory the object is found in. pic_object=$xdir$pic_object if test dlfiles = "$prev"; then if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then func_append dlfiles " $pic_object" prev= continue else # If libtool objects are unsupported, then we need to preload. prev=dlprefiles fi fi # CHECK ME: I think I busted this. -Ossama if test dlprefiles = "$prev"; then # Preload the old-style object. func_append dlprefiles " $pic_object" prev= fi # A PIC object. func_append libobjs " $pic_object" arg=$pic_object fi # Non-PIC object. if test none != "$non_pic_object"; then # Prepend the subdirectory the object is found in. non_pic_object=$xdir$non_pic_object # A standard non-PIC object func_append non_pic_objects " $non_pic_object" if test -z "$pic_object" || test none = "$pic_object"; then arg=$non_pic_object fi else # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object=$pic_object func_append non_pic_objects " $non_pic_object" fi else # Only an error if not doing a dry-run. if $opt_dry_run; then # Extract subdirectory from the argument. func_dirname "$arg" "/" "" xdir=$func_dirname_result func_lo2o "$arg" pic_object=$xdir$objdir/$func_lo2o_result non_pic_object=$xdir$func_lo2o_result func_append libobjs " $pic_object" func_append non_pic_objects " $non_pic_object" else func_fatal_error "'$arg' is not a valid libtool object" fi fi done else func_fatal_error "link input file '$arg' does not exist" fi arg=$save_arg prev= continue ;; os2dllname) os2dllname=$arg prev= continue ;; precious_regex) precious_files_regex=$arg prev= continue ;; release) release=-$arg prev= continue ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) func_fatal_error "argument to -rpath is not absolute: $arg" ;; esac if test rpath = "$prev"; then case "$rpath " in *" $arg "*) ;; *) func_append rpath " $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; *) func_append xrpath " $arg" ;; esac fi prev= continue ;; shrext) shrext_cmds=$arg prev= continue ;; weak) func_append weak_libs " $arg" prev= continue ;; xassembler) func_append compiler_flags " -Xassembler $qarg" prev= func_append compile_command " -Xassembler $qarg" func_append finalize_command " -Xassembler $qarg" continue ;; xcclinker) func_append linker_flags " $qarg" func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xcompiler) func_append compiler_flags " $qarg" prev= func_append compile_command " $qarg" func_append finalize_command " $qarg" continue ;; xlinker) func_append linker_flags " $qarg" func_append compiler_flags " $wl$qarg" prev= func_append compile_command " $wl$qarg" func_append finalize_command " $wl$qarg" continue ;; *) eval "$prev=\"\$arg\"" prev= continue ;; esac fi # test -n "$prev" prevarg=$arg case $arg in -all-static) if test -n "$link_static_flag"; then # See comment for -static flag below, for more details. func_append compile_command " $link_static_flag" func_append finalize_command " $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. func_fatal_error "'-allow-undefined' must not be used because it is the default" ;; -avoid-version) avoid_version=yes continue ;; -bindir) prev=bindir continue ;; -dlopen) prev=dlfiles continue ;; -dlpreopen) prev=dlprefiles continue ;; -export-dynamic) export_dynamic=yes continue ;; -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then func_fatal_error "more than one -exported-symbols argument is not allowed" fi if test X-export-symbols = "X$arg"; then prev=expsyms else prev=expsyms_regex fi continue ;; -framework) prev=framework continue ;; -inst-prefix-dir) prev=inst_prefix continue ;; # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* # so, if we see these flags be careful not to treat them like -L -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) func_append compile_command " $arg" func_append finalize_command " $arg" ;; esac continue ;; -L*) func_stripname "-L" '' "$arg" if test -z "$func_stripname_result"; then if test "$#" -gt 0; then func_fatal_error "require no space between '-L' and '$1'" else func_fatal_error "need path for '-L' option" fi fi func_resolve_sysroot "$func_stripname_result" dir=$func_resolve_sysroot_result # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` test -z "$absdir" && \ func_fatal_error "cannot determine absolute directory name of '$dir'" dir=$absdir ;; esac case "$deplibs " in *" -L$dir "* | *" $arg "*) # Will only happen for absolute or sysroot arguments ;; *) # Preserve sysroot, but never include relative directories case $dir in [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; *) func_append deplibs " -L$dir" ;; esac func_append lib_search_path " $dir" ;; esac case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-os2* | *-cegcc*) testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; ::) dllsearchpath=$dir;; *) func_append dllsearchpath ":$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; ::) dllsearchpath=$testbindir;; *) func_append dllsearchpath ":$testbindir";; esac ;; esac continue ;; -l*) if test X-lc = "X$arg" || test X-lm = "X$arg"; then case $host in *-*-cygwin* | *-*-mingw* | *-*-windows* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) # These systems don't actually have a C or math library (as such) continue ;; *-*-os2*) # These systems don't actually have a C library (as such) test X-lc = "X$arg" && continue ;; *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc due to us having libc/libc_r. test X-lc = "X$arg" && continue ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework func_append deplibs " System.ltframework" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) # Causes problems with __ctype test X-lc = "X$arg" && continue ;; *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work test X-lc = "X$arg" && continue ;; esac elif test X-lc_r = "X$arg"; then case $host in *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-midnightbsd*) # Do not include libc_r directly, use -pthread flag. continue ;; esac fi func_append deplibs " $arg" continue ;; -mllvm) prev=mllvm continue ;; -module) module=yes continue ;; # Tru64 UNIX uses -model [arg] to determine the layout of C++ # classes, name mangling, and exception handling. # Darwin uses the -arch flag to determine output architecture. # -q