# HG changeset patch # User Arun Giridhar # Date 1715378168 14400 # Node ID 69b9695538fb5daaa16b34b1f623e3d12fa5c13b # Parent 474f5a226fe0ddf6a30f0870811212edc9fbad72# Parent 0698a2a8ed23a38304eb19be9153b38cb96242dd maint: Merge stable to default diff -r 0698a2a8ed23 -r 69b9695538fb .github/workflows/make.yaml --- a/.github/workflows/make.yaml Fri May 10 17:54:20 2024 -0400 +++ b/.github/workflows/make.yaml Fri May 10 17:56:08 2024 -0400 @@ -636,7 +636,7 @@ matrix: # For available GitHub-hosted runners, see: https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners os: [windows-latest] - msystem: [MINGW64, UCRT64] + msystem: [MINGW64, CLANG64] include: - msystem: MINGW64 mingw-prefix: mingw64 @@ -646,14 +646,23 @@ f77: gfortran extra-config-flags: "" ccache-max: 0.9G - - msystem: UCRT64 - mingw-prefix: ucrt64 - target-prefix: mingw-w64-ucrt-x86_64 - cc: gcc - cxx: g++ - f77: gfortran - extra-config-flags: "" - ccache-max: 0.9G + allow-error: false + - msystem: CLANG64 + mingw-prefix: clang64 + target-prefix: mingw-w64-clang-x86_64 + cc: clang + # It looks like we and graphicsmagick++ aren't ready for C++17 yet. + cxx: "clang++ -std=gnu++14" + f77: flang + # Clang seems to require a different set of dllexport attributes than GCC. + # autoconf and libtool still need help to correctly invoke flang. + extra-config-flags: + --disable-lib-visibility-flags + ac_cv_f77_compiler_gnu=yes + lt_cv_prog_gnu_ld=yes + ccache-max: 400M + # This configuration is not fully supported yet + allow-error: true env: CHERE_INVOKING: 1 @@ -844,6 +853,7 @@ make -C ./.build DESTDIR=/c/octave/pkg install - name: test stand-alone executable + continue-on-error: ${{ matrix.allow-error }} run: | unset CC unset CXX @@ -856,10 +866,26 @@ - name: analyze test suite results # Make sure the test summary lists 0 "FAIL"s and no "REGRESSION" run: | - [ -n "$(grep -e "FAIL\s*0" ./test-suite.log)" ] || (echo "::warning::At least one test failed" && exit 1) - [ -z "$(grep -e "REGRESSION" ./test-suite.log)" ] || (echo "::warning::At least one regression in test suite" && exit 1) + [ -n "$(grep -e "FAIL\s*0" ./test-suite.log)" ] || echo "::warning::At least one test failed" + [ -z "$(grep -e "REGRESSION" ./test-suite.log)" ] || echo "::warning::At least one regression in test suite" echo Finished analyzing test suite results. + - name: compress build artifact + if: matrix.msystem == 'MINGW64' + continue-on-error: true + run: | + cd /c/octave/pkg + tar -cvzf octave.tar.gz * + + - name: upload build artifact + if: matrix.msystem == 'MINGW64' + continue-on-error: true + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.target-prefix }}-octave-${{ steps.ccache-prepare.outputs.timestamp }} + path: C:\octave\pkg\octave.tar.gz + retention-days: 7 + cygwin: runs-on: ${{ matrix.os }} @@ -964,6 +990,7 @@ ccache git icoutils + python rsvg texinfo @@ -1015,6 +1042,7 @@ - name: configure # FIXME: Fix building with Java support. Override JAVA_HOME for now. # FIXME: How do we get a working TeX environment in Cygwin? Disable building the documentation for now. + # FIXME: Exporting symbols for instantiated template classes doesn't work currently. Maybe, test again when Cygwin updated to a newer compiler than GCC 11.4.0? run: | echo $PATH which $CC @@ -1032,6 +1060,7 @@ --enable-shared \ --disable-java \ --disable-docs \ + --disable-lib-visibility-flags \ JAVA_HOME="" \ EGREP="grep -E" \ FLIBS="-lgfortran -lquadmath" diff -r 0698a2a8ed23 -r 69b9695538fb autogen.sh --- a/autogen.sh Fri May 10 17:54:20 2024 -0400 +++ b/autogen.sh Fri May 10 17:56:08 2024 -0400 @@ -4,7 +4,7 @@ # also regenerates all aclocal.m4, config.h.in, Makefile.in, configure files # with new versions of autoconf or automake. -# Copyright (C) 2003-2023 Free Software Foundation, Inc. +# Copyright (C) 2003-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 diff -r 0698a2a8ed23 -r 69b9695538fb autopull.sh --- a/autopull.sh Fri May 10 17:54:20 2024 -0400 +++ b/autopull.sh Fri May 10 17:56:08 2024 -0400 @@ -2,7 +2,7 @@ # Convenience script for fetching auxiliary files that are omitted from # the version control repository of this package. -# Copyright (C) 2003-2023 Free Software Foundation, Inc. +# Copyright (C) 2003-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 diff -r 0698a2a8ed23 -r 69b9695538fb bootstrap --- a/bootstrap Fri May 10 17:54:20 2024 -0400 +++ b/bootstrap Fri May 10 17:56:08 2024 -0400 @@ -1,9 +1,9 @@ #! /bin/sh # Bootstrap this package from checked-out sources. -scriptversion=2023-08-29.21; # UTC +scriptversion=2024-04-13.15; # UTC -# Copyright (C) 2003-2023 Free Software Foundation, Inc. +# Copyright (C) 2003-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 @@ -43,44 +43,55 @@ GNULIB_SRCDIR Specifies the local directory where gnulib sources reside. Use this if you already have gnulib sources on your machine, and - do not want to waste your bandwidth downloading - them again. - GNULIB_URL URL of the gnulib repository. The default is - $default_gnulib_url, - which is Gnulib's upstream repository. - -Options: - - --pull Do phase 1: pull files from network - --gen Do phase 2: generate from local files. - (The default is to do both phases.) - - --gnulib-srcdir=DIRNAME specify the local directory where gnulib - sources reside. Use this if you already - have gnulib sources on your machine, and - you want to use these sources. Defaults - to \$GNULIB_SRCDIR - --gnulib-refdir=DIRNAME specify the local directory where a gnulib + you want to use these sources. + GNULIB_REFDIR Specifies the local directory where a gnulib repository (with a .git subdirectory) resides. Use this if you already have gnulib sources and history on your machine, and do not want to waste your bandwidth downloading them again. - Defaults to \$GNULIB_REFDIR + Only used for phase 1 (--pull). + GNULIB_URL URL of the gnulib repository. The default is + $default_gnulib_url, + which is Gnulib's upstream repository. + Only used for phase 1 (--pull). + +Options: + + --pull Do phase 1: Pull files from the network. + --gen Do phase 2: Generate files from local files + (no network access). + (The default is to do both phases.) - --bootstrap-sync if this bootstrap script is not identical to + --gnulib-srcdir=DIRNAME Specifies the local directory where gnulib + sources reside. Use this if you already + have gnulib sources on your machine, and + you want to use these sources. Defaults + to \$GNULIB_SRCDIR. + --gnulib-refdir=DIRNAME Specifies the local directory where a gnulib + repository (with a .git subdirectory) resides. + Use this if you already have gnulib sources + and history on your machine, and do not want + to waste your bandwidth downloading them again. + Defaults to \$GNULIB_REFDIR. + Only used for phase 1 (--pull). + + --bootstrap-sync If this bootstrap script is not identical to the version in the local gnulib sources, update this script, and then restart it with - /bin/sh or the shell \$CONFIG_SHELL - --no-bootstrap-sync do not check whether bootstrap is out of sync + /bin/sh or the shell \$CONFIG_SHELL. + --no-bootstrap-sync Do not check whether bootstrap is out of sync. - --copy copy files instead of creating symbolic links - --force attempt to bootstrap even if the sources seem - not to have been checked out - --no-git do not use git to update gnulib. Requires that + --copy Copy files instead of creating symbolic links. + Only used for phase 2 (--gen). + --force Attempt to bootstrap even if the sources seem + not to have been checked out. + --no-git Do not use git to update gnulib. Requires that \$GNULIB_SRCDIR or the --gnulib-srcdir option points to a gnulib repository with the correct - revision - --skip-po do not download po files + revision. + Only used for phase 1 (--pull). + --skip-po Do not download *.po files. + Only used for phase 1 (--pull). EOF bootstrap_print_option_usage_hook cat </dev/null \ + || { git fetch origin && git checkout "$GNULIB_REVISION"; } + } + ) || exit $? + fi + else + if ! $use_git; then + die "Error: --no-git is specified," \ + "but neither --gnulib-srcdir nor \$GNULIB_SRCDIR is specified" + fi + if git submodule -h | grep -- --reference > /dev/null; then + : + else + die "git version is too old, git >= 1.6.4 is required" + fi gnulib_path=$(git_modules_config submodule.gnulib.path) - test -z "$gnulib_path" && gnulib_path=gnulib - - # Get gnulib files. Populate $gnulib_path, possibly updating a - # submodule, for use in the rest of the script. - - if test -n "$GNULIB_REFDIR" && test -d "$GNULIB_REFDIR"/.git \ - && git_modules_config submodule.gnulib.url >/dev/null; then - # Use GNULIB_REFDIR as a reference. - echo "$0: getting gnulib files..." - if git submodule -h|grep -- --reference > /dev/null; then - # Prefer the one-liner available in git 1.6.4 or newer. - git submodule update --init --reference "$GNULIB_REFDIR" \ - "$gnulib_path" || exit $? + if test -n "$gnulib_path"; then + # A submodule 'gnulib' is configured. + # Get gnulib files. Populate $gnulib_path, updating the submodule. + if test -n "$GNULIB_REFDIR" && test -d "$GNULIB_REFDIR"/.git; then + # Use GNULIB_REFDIR as a reference. + echo "$0: getting gnulib files..." + git submodule update --init --reference "$GNULIB_REFDIR" "$gnulib_path" \ + || exit $? else - # This fallback allows at least git 1.5.5. - if test -f "$gnulib_path"/gnulib-tool; then - # Since file already exists, assume submodule init already complete. + # GNULIB_REFDIR is not set or not usable. Ignore it. + if git_modules_config submodule.gnulib.url >/dev/null; then + echo "$0: getting gnulib files..." + git submodule init -- "$gnulib_path" || exit $? git submodule update -- "$gnulib_path" || exit $? else - # Older git can't clone into an empty directory. - rmdir "$gnulib_path" 2>/dev/null - git clone --reference "$GNULIB_REFDIR" \ - "$(git_modules_config submodule.gnulib.url)" "$gnulib_path" \ - && git submodule init -- "$gnulib_path" \ - && git submodule update -- "$gnulib_path" \ - || exit $? + die "Error: submodule 'gnulib' has no configured url" fi fi else - # GNULIB_REFDIR is not set or not usable. Ignore it. - if git_modules_config submodule.gnulib.url >/dev/null; then + gnulib_path='gnulib' + if test ! -d "$gnulib_path"; then + # The subdirectory 'gnulib' does not yet exist. Clone into it. echo "$0: getting gnulib files..." - git submodule init -- "$gnulib_path" || exit $? - git submodule update -- "$gnulib_path" || exit $? - - elif [ ! -d "$gnulib_path" ]; then - echo "$0: getting gnulib files..." - trap cleanup_gnulib HUP INT PIPE TERM - shallow= if test -z "$GNULIB_REVISION"; then if git clone -h 2>&1 | grep -- --depth > /dev/null; then @@ -525,39 +530,42 @@ # is without fetching all commits. So fall back to fetching all # commits. git -C "$gnulib_path" init - git -C "$gnulib_path" remote add origin \ - ${GNULIB_URL:-$default_gnulib_url} + git -C "$gnulib_path" remote add origin ${GNULIB_URL:-$default_gnulib_url} git -C "$gnulib_path" fetch $shallow origin "$GNULIB_REVISION" \ || git -C "$gnulib_path" fetch origin \ || cleanup_gnulib git -C "$gnulib_path" reset --hard FETCH_HEAD + (cd "$gnulib_path" && git checkout "$GNULIB_REVISION") || cleanup_gnulib fi - trap - HUP INT PIPE TERM - - elif test -n "$GNULIB_REVISION" \ - && ! git --git-dir="$gnulib_path"/.git cat-file \ - commit "$GNULIB_REVISION"; then - git --git-dir="$gnulib_path"/.git fetch + else + # The subdirectory 'gnulib' already exists. + if test -n "$GNULIB_REVISION"; then + if test -d "$gnulib_path/.git"; then + # The 'git checkout "$GNULIB_REVISION"' command succeeds if the + # GNULIB_REVISION is a commit hash that exists locally, or if it is + # branch name that can be fetched from origin. It fails, however, + # if the GNULIB_REVISION is a commit hash that only exists in + # origin. In this case, we need a 'git fetch' and then retry + # 'git checkout "$GNULIB_REVISION"'. + (cd "$gnulib_path" \ + && { git checkout "$GNULIB_REVISION" 2>/dev/null \ + || { git fetch origin && git checkout "$GNULIB_REVISION"; } + } + ) || exit $? + else + die "Error: GNULIB_REVISION is specified in bootstrap.conf," \ + "but '$gnulib_path' contains no git history" + fi + fi fi fi - GNULIB_SRCDIR=$gnulib_path - # Verify that the submodule contains a gnulib checkout. + # Verify that $gnulib_path contains a gnulib checkout. test -f "$gnulib_path/gnulib-tool" \ - || die "Error: $gnulib_path is supposed to contain a gnulib checkout," \ + || die "Error: '$gnulib_path' is supposed to contain a gnulib checkout," \ "but does not contain gnulib-tool" + GNULIB_SRCDIR=$gnulib_path fi - - # XXX Should this be done if $use_git is false? - if test -d "$GNULIB_SRCDIR"/.git && test -n "$GNULIB_REVISION" \ - && ! git_modules_config submodule.gnulib.url >/dev/null; then - if ! git --git-dir="$GNULIB_SRCDIR"/.git cat-file \ - commit "$GNULIB_REVISION"; then - git --git-dir="$GNULIB_SRCDIR"/.git fetch - fi - (cd "$GNULIB_SRCDIR" && git checkout "$GNULIB_REVISION") || cleanup_gnulib - fi - # $GNULIB_SRCDIR now points to the version of gnulib to use, and # we no longer need to use git or $gnulib_path below here. } @@ -619,7 +627,8 @@ autopull_usage() { cat </dev/null; then -+ if ! git --git-dir="$GNULIB_SRCDIR"/.git cat-file \ -+ commit "$GNULIB_REVISION"; then -+ git --git-dir="$GNULIB_SRCDIR"/.git fetch -+ fi - (cd "$GNULIB_SRCDIR" && git checkout "$GNULIB_REVISION") || cleanup_gnulib - fi - diff -r 0698a2a8ed23 -r 69b9695538fb build-aux/inplace-edit.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/build-aux/inplace-edit.pl Fri May 10 17:56:08 2024 -0400 @@ -0,0 +1,33 @@ +#!/usr/bin/perl -w + +################################################################################ +## File: inplace-edit.pl +## Usage: perl inplace-edit.pl 'PERL_CODE' file1 [file2] [...] +## Purpose: Run snippet of PERL_CODE on each line in a file and replace +## existing line with the results of running the code. +## This replaces perl -i -pe 'PERL_CODE' file1 [file2] ... +## due to a problem in Perl 5.28 which restricts the number of files +################################################################################ + +## Create Perl code from first argument (-e CODE) +eval "sub per_line_code { $ARGV[0]; }"; +shift @ARGV; + +## Loop over each file +foreach $fname (@ARGV) +{ + rename ($fname, "$fname.$$") or die "Rename failed:$fname:$!"; + open (my $FHI, "<", "$fname.$$") or die "Open failed:$fname.$$:$!"; + open (my $FHO, ">", "$fname") or die "Open failed:$fname:$!"; + + ## Loop over each line + while (<$FHI>) + { + per_line_code (); + print $FHO $_; + } + + close ($FHI); + close ($FHO); + unlink "$fname.$$" or die "Delete failed:$fname.$$:$!"; +} diff -r 0698a2a8ed23 -r 69b9695538fb build-aux/inplace_edit.pl --- a/build-aux/inplace_edit.pl Fri May 10 17:54:20 2024 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -#!/usr/bin/perl -w - -################################################################################ -## File: inplace_edit.pl -## Usage: perl inplace_edit.pl 'PERL_CODE' file1 [file2] [...] -## Purpose: Run snippet of PERL_CODE on each line in a file and replace -## existing line with the results of running the code. -## This replaces perl -i -pe 'PERL_CODE' file1 [file2] ... -## due to a problem in Perl 5.28 which restricts the number of files -################################################################################ - -## Create Perl code from first argument (-e CODE) -eval "sub per_line_code { $ARGV[0]; }"; -shift @ARGV; - -## Loop over each file -foreach $fname (@ARGV) -{ - rename ($fname, "$fname.$$") or die "Rename failed:$fname:$!"; - open (my $FHI, "<", "$fname.$$") or die "Open failed:$fname.$$:$!"; - open (my $FHO, ">", "$fname") or die "Open failed:$fname:$!"; - - ## Loop over each line - while (<$FHI>) - { - per_line_code (); - print $FHO $_; - } - - close ($FHI); - close ($FHO); - unlink "$fname.$$" or die "Delete failed:$fname.$$:$!"; -} diff -r 0698a2a8ed23 -r 69b9695538fb build-aux/mk-octave-config-h.sh --- a/build-aux/mk-octave-config-h.sh Fri May 10 17:54:20 2024 -0400 +++ b/build-aux/mk-octave-config-h.sh Fri May 10 17:56:08 2024 -0400 @@ -104,7 +104,6 @@ $SED -n 's/#\(\(undef\|define\) OCTAVE_ENABLE_64.*$\)/# \1/p' $config_h_file $SED -n 's/#\(\(undef\|define\) OCTAVE_ENABLE_BOUNDS_CHECK.*$\)/# \1/p' $config_h_file -$SED -n 's/#\(\(undef\|define\) OCTAVE_ENABLE_FLOAT_TRUNCATE.*$\)/# \1/p' $config_h_file $SED -n 's/#\(\(undef\|define\) OCTAVE_ENABLE_INTERNAL_CHECKS.*$\)/# \1/p' $config_h_file $SED -n 's/#\(\(undef\|define\) OCTAVE_ENABLE_LIB_VISIBILITY_FLAGS.*$\)/# \1/p' $config_h_file $SED -n 's/#\(\(undef\|define\) OCTAVE_ENABLE_OPENMP.*$\)/# \1/p' $config_h_file diff -r 0698a2a8ed23 -r 69b9695538fb build-aux/module.mk --- a/build-aux/module.mk Fri May 10 17:54:20 2024 -0400 +++ b/build-aux/module.mk Fri May 10 17:56:08 2024 -0400 @@ -6,7 +6,7 @@ %reldir%/find-defun-files.in.sh \ %reldir%/find-files-with-tests.in.sh \ %reldir%/get-source-mtime.sh \ - %reldir%/inplace_edit.pl \ + %reldir%/inplace-edit.pl \ %reldir%/mk-hg-id.sh \ %reldir%/mk-octave-config-h.sh \ %reldir%/mk-opts.pl \ diff -r 0698a2a8ed23 -r 69b9695538fb configure.ac --- a/configure.ac Fri May 10 17:54:20 2024 -0400 +++ b/configure.ac Fri May 10 17:56:08 2024 -0400 @@ -27,7 +27,7 @@ ### Initialize Autoconf AC_PREREQ([2.65]) -AC_INIT([GNU Octave], [9.1.91], [https://octave.org/bugs.html], [octave], +AC_INIT([GNU Octave], [10.0.0], [https://octave.org/bugs.html], [octave], [https://www.gnu.org/software/octave/]) ### Declare version numbers @@ -39,9 +39,9 @@ ## explains how to update these numbers for release and development ## versions. -OCTAVE_MAJOR_VERSION=9 -OCTAVE_MINOR_VERSION=1 -OCTAVE_PATCH_VERSION=91 +OCTAVE_MAJOR_VERSION=10 +OCTAVE_MINOR_VERSION=0 +OCTAVE_PATCH_VERSION=0 dnl PACKAGE_VERSION is set by the AC_INIT VERSION argument. OCTAVE_VERSION="$PACKAGE_VERSION" @@ -313,10 +313,14 @@ AC_PROG_CXX AC_PROG_CXXCPP -ENABLE_STD_PMR_POLYMORPHIC_ALLOCATOR=no +## Ensure that the C++ compiler fully supports C++17. +## Preferably with GNU extensions if flags are required. +AX_CXX_COMPILE_STDCXX(17, [], mandatory) + +ENABLE_STD_PMR_POLYMORPHIC_ALLOCATOR=yes AC_ARG_ENABLE(std-pmr-polymorphic-allocator, - [AS_HELP_STRING([--enable-std-pmr-polymorphic-allocator], - [build libraries requiring std::pmr::polymorphic_allocator if possible. This allows more efficient transfer of arrays at the .mex file interface. That also means that all libraries including Octave headers (e.g., .oct files) must be able to compile with that C++17 feature.])], + [AS_HELP_STRING([--disable-std-pmr-polymorphic-allocator], + [build libraries that do not require support for std::pmr::polymorphic_allocator. This prevents more efficient transfer of arrays at the .mex file interface.])], [case $enableval in yes) ENABLE_STD_PMR_POLYMORPHIC_ALLOCATOR=yes ;; no) ENABLE_STD_PMR_POLYMORPHIC_ALLOCATOR=no ;; @@ -340,34 +344,6 @@ ### Determine C++ compiler capabilities. -if test "$QT_VERSIONS" = 6; then - ## If QT_VERSIONS is set to 6, require that the C++ compiler fully - ## supports C++17. Preferably with GNU extensions if flags are required. - ## We could use "AX_CXX_COMPILE_STDCXX(17, [], mandatory)" in this case. - ## But prefer to emit a more helpful error message. - AX_CXX_COMPILE_STDCXX(17, [], []) - if test "$HAVE_CXX17" = 0; then - ## The user explicitly requested Qt6. But the C++ compiler lacks - ## support for C++17. - AC_MSG_ERROR([Qt6 requires a compiler that supports C++17. Configure with "--with-qt=5" or "--without-qt", or use a compiler that supports C++17.]) - fi -elif test -z "${QT_VERSIONS+x}" || test $ENABLE_STD_PMR_POLYMORPHIC_ALLOCATOR = yes; then - ## If QT_VERSIONS is not explicitly set, check if the C++ compiler fully - ## supports C++17 (but don't require it). - ## The defaults for the Qt version will depend on the result of this check. - AX_CXX_COMPILE_STDCXX(17, [], []) -else - ## Set HAVE_CXX17 to 0 because we don't require it (even if the used - ## C++ compiler might technically support C++17). - HAVE_CXX17=0 -fi - -if test "$HAVE_CXX17" = 0; then - ## Ensure that the C++ compiler fully supports C++11. - ## Preferably with GNU extensions if flags are required. - AX_CXX_COMPILE_STDCXX(11, [], mandatory) -fi - if test $ENABLE_STD_PMR_POLYMORPHIC_ALLOCATOR = yes; then OCTAVE_CHECK_STD_PMR_POLYMORPHIC_ALLOCATOR else @@ -954,28 +930,6 @@ AC_SUBST(MKOCTFILE_F77) AC_SUBST(MKOCTFILE_RANLIB) -### Enable float truncation to work around issues with x87 co-processors - -dnl When compiling math for x87, problems may arise in some code comparing -dnl floating-point intermediate results. The root cause is the extra precision -dnl (~80 bits) of x87 co-processor registers versus the IEEE standard 64 bits. -dnl Generally, storing the result in a local volatile variable forces a -dnl truncation back to 64 bits, but it also degrades performance. -dnl However, this performance degradation is very minimal, if indeed measurable. -dnl Therefore, it has been enabled for all platforms and compilers. -dnl Reported bugs indicate that --enable-float-truncate is required for MinGW -dnl and Cygwin platforms and for GCC compilers >= 5.0. It should not be -dnl necessary for non-x87 targets or when using modern SSE math. -ENABLE_FLOAT_TRUNCATE=yes -AC_ARG_ENABLE([float-truncate], - [AS_HELP_STRING([--disable-float-truncate], - [truncate intermediate FP results])], - [if test "$enableval" = no; then ENABLE_FLOAT_TRUNCATE=no; fi], []) -if test $ENABLE_FLOAT_TRUNCATE = yes; then - AC_DEFINE(OCTAVE_ENABLE_FLOAT_TRUNCATE, 1, - [Define to 1 to truncate intermediate FP results.]) -fi - ### Enable internal checks ## The checks slow down the execution and are redundant, @@ -1059,8 +1013,8 @@ if test "$cross_compiling" = yes; then BUILD_CC="gcc" BUILD_CFLAGS="-O2 -g" - BUILD_CXX="g++" - BUILD_CXXFLAGS="-O2 -g -std=c++11" + BUILD_CXX="g++ -std=gnu++17" + BUILD_CXXFLAGS="-O2 -g" BUILD_LDFLAGS="" BUILD_EXEEXT="" else @@ -2805,10 +2759,10 @@ ### Determine whether libraries should be linked with visibility attributes. -ENABLE_LIB_VISIBILITY_FLAGS=no +ENABLE_LIB_VISIBILITY_FLAGS=yes AC_ARG_ENABLE(lib-visibility-flags, - [AS_HELP_STRING([--enable-lib-visibility-flags], - [build libraries with visibility flags (export only symbols from API)])], + [AS_HELP_STRING([--disable-lib-visibility-flags], + [don't build libraries with visibility flags (export all symbols)])], [case $enableval in yes) ENABLE_LIB_VISIBILITY_FLAGS=yes ;; no) ENABLE_LIB_VISIBILITY_FLAGS=no ;; @@ -3412,7 +3366,6 @@ 64-bit BLAS array dims and indexing: $HAVE_64_BIT_BLAS Use std::pmr::polymorphic_allocator: $HAVE_STD_PMR_POLYMORPHIC_ALLOCATOR OpenMP SMP multithreading: $ENABLE_OPENMP - Truncate intermediate FP results: $ENABLE_FLOAT_TRUNCATE Include support for GNU readline: $USE_READLINE Use push parser in command line REPL: $ENABLE_COMMAND_LINE_PUSH_PARSER Build cross tools: $cross_tools diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/basics.txi --- a/doc/interpreter/basics.txi Fri May 10 17:54:20 2024 -0400 +++ b/doc/interpreter/basics.txi Fri May 10 17:56:08 2024 -0400 @@ -73,13 +73,14 @@ built-in functions of Octave. This value is normally correct and should only need to be specified in extraordinary situations. -@item --debug -@itemx -d -@cindex @sortas{options, Octave command --debug} @ @ @code{--debug} -@cindex @sortas{options, Octave command -d} @ @ @code{-d} -Enter parser debugging mode. Using this option will cause Octave's -parser to print a lot of information about the commands it reads, and is -probably only useful if you are actually trying to debug the parser. +@c FIXME: Disabled debug option for parser 2023-12-29. +@c Uncomment and restore code if Octave adds capability to +@c immediately enter debug mode for a script. +@c @item --debug +@c @itemx -d +@c @cindex @sortas{options, Octave command --debug} @ @ @code{--debug} +@c @cindex @sortas{options, Octave command -d} @ @ @code{-d} +@c Enter debugging mode. @item --doc-cache-file @var{filename} @cindex @sortas{options, Octave command --doc-cache-file} @ @ @code{--doc-cache-file @var{filename}} @@ -95,7 +96,8 @@ @cindex @sortas{options, Octave command -x} @ @ @code{-x} Echo commands as they are executed. -@item --eval @var{code} +@item --eval @var{code} +@itemx -e @var{code} @cindex @sortas{options, Octave command --eval} @ @ @code{--eval @var{code}} Evaluate @var{code} and exit when finished unless @option{--persist} is also specified. @@ -108,7 +110,8 @@ in the system or user startup files that call the @w{@env{EXEC_PATH}}@ function. -@item --gui +@item --gui +@itemx -g @cindex @sortas{options, Octave command --gui} @ @ @code{--gui} Start the graphical user interface (GUI). @@ -142,6 +145,11 @@ commands in the system or user startup files that use the @code{info_program} function. +@item --init-trace +@cindex @sortas{options, Octave command --init-trace} @ @ @code{--init-trace} +Print the name of each configuration as it is read and executed during +initialization. + @item --interactive @itemx -i @cindex @sortas{options, Octave command --interactive} @ @ @code{--interactive} @@ -153,7 +161,8 @@ @cindex @sortas{options, Octave command --line-editing} @ @ @code{--line-editing} Force readline use for command-line editing. -@item --no-gui +@item --no-gui +@itemx -G @cindex @sortas{options, Octave command --no-gui} @ @ @code{--no-gui} Disable the graphical user interface (GUI) and use the command line interface (CLI) instead. This is the default behavior, but this option @@ -165,26 +174,37 @@ @cindex @sortas{options, Octave command -H} @ @ @code{-H} Disable recording of command-line history. -@item --no-init-file -@cindex @sortas{options, Octave command --no-init-file} @ @ @code{--no-init-file} -@cindex @sortas{octaverc ~/.octaverc} @code{~/.octaverc} -@cindex @sortas{octaverc .octaverc} @code{.octaverc} -Don't read the initialization files @file{~/.octaverc} and @file{.octaverc}. +@item --no-init-all +@itemx --norc +@itemx -f +@cindex @sortas{options, Octave command --no-init-all} @ @ @code{--no-init-all} +@cindex @sortas{options, Octave command --norc} @ @ @code{--norc} +@cindex @sortas{options, Octave command -f} @ @ @code{-f} +Don't read any of the system or user initialization files at startup. +This is equivalent to using both of the options @option{--no-site-file} +and @option{--no-init-user}. @item --no-init-path @cindex @sortas{options, Octave command --no-init-path} @ @ @code{--no-init-path} Don't initialize the search path for function files to include default locations. +@item --no-init-site +@cindex @sortas{options, Octave command --no-init-site} @ @ @code{--no-init-site} +@cindex site startup file +Don't read the site-wide @file{octaverc} initialization files. + +@item --no-init-user +@cindex @sortas{options, Octave command --no-init-user} @ @ @code{--no-init-user} +@cindex @sortas{octaverc ~/.octaverc} @code{~/.octaverc} +@cindex @sortas{octaverc .octaverc} @code{.octaverc} +Don't read the user initialization files @file{~/.octaverc} and +@file{.octaverc}. + @item --no-line-editing @cindex @sortas{options, Octave command --no-line-editing} @ @ @code{--no-line-editing} Disable command-line editing. -@item --no-site-file -@cindex @sortas{options, Octave command --no-site-file} @ @ @code{--no-site-file} -@cindex site startup file -Don't read the site-wide @file{octaverc} initialization files. - @item --no-window-system @itemx -W @cindex @sortas{options, Octave command --no-window-system} @ @ @code{--no-window-system} @@ -192,14 +212,6 @@ Disable use of a windowing system including graphics. This forces a strictly terminal-only environment. -@item --norc -@itemx -f -@cindex @sortas{options, Octave command --norc} @ @ @code{--norc} -@cindex @sortas{options, Octave command -f} @ @ @code{-f} -Don't read any of the system or user initialization files at startup. -This is equivalent to using both of the options @option{--no-init-file} -and @option{--no-site-file}. - @item --path @var{path} @itemx -p @var{path} @cindex @sortas{options, Octave command --path} @ @ @code{--path @var{path}} @@ -215,11 +227,11 @@ Go to interactive mode after @option{--eval} or reading from a file named on the command line. -@item --silent -@itemx --quiet +@item --quiet +@itemx --silent @itemx -q +@cindex @sortas{options, Octave command --quiet} @ @ @code{--quiet} @cindex @sortas{options, Octave command --silent} @ @ @code{--silent} -@cindex @sortas{options, Octave command --quiet} @ @ @code{--quiet} @cindex @sortas{options, Octave command -q} @ @ @code{-q} Don't print the usual greeting and version message at startup. @@ -273,12 +285,6 @@ that works in Octave but not @sc{matlab} (@pxref{XREFwarning,,warning}, @ref{XREFwarning_ids,,warning_ids}). -@item --verbose -@itemx -V -@cindex @sortas{options, Octave command --verbose} @ @ @code{--verbose} -@cindex @sortas{options, Octave command -V} @ @ @code{-V} -Turn on verbose output. - @item --version @itemx -v @cindex @sortas{options, Octave command --version} @ @ @code{--version} @@ -384,7 +390,7 @@ A message will be displayed as each of the startup files is read if you invoke Octave with the @option{--verbose} option but without the -@option{--silent} option. +@option{--quiet} option. The startup files are always processed in the system's locale charset (independent of the m-file encoding that is set, for example, in the GUI diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/doccheck/add-to-aspell-dict.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/interpreter/doccheck/add-to-aspell-dict.pl Fri May 10 17:56:08 2024 -0400 @@ -0,0 +1,73 @@ +#!/usr/bin/perl -w + +######################################################################## +## +## Copyright (C) 2010-2024 The Octave Project Developers +## +## See the file COPYRIGHT.md in the top-level directory of this +## distribution or . +## +## This file is part of Octave. +## +## Octave 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. +## +## Octave 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 Octave; see the file COPYING. If not, see +## . +## +######################################################################## + +################################################################################ +# File : add-to-aspell-dict.pl +# Purpose: Merges a file of new words into an existing dictionary file. +# The resulting file is uniquified and sorted before being written out. +# Usage : add-to-aspell-dict.pl +# Documentation: see README in doccheck directory +################################################################################ +# Initialize variables +# Private Octave dictionary for aspell +$octdict_fname = './doccheck/aspell-octave.en.pws'; + +################################################################################ +# Parse command line arguments +unless (@ARGV == 1) +{ + die "USAGE: add-to-aspell-dict.pl \n"; +} + +$new_words_fname = shift(@ARGV); +if (! -r $new_words_fname) +{ + die "Unable to read input file: $new_words_fname\n"; +} + +################################################################################ +# Add new words to a dictionary database +open (FH, "<$new_words_fname") + or die "Unable to open file: $new_words_fname\n"; +while () { $dict_db{$_} = 1; } +close (FH); + +# Add words from existing dictionary to dictionary database +open (FH, "<$octdict_fname") + or die "Unable to open Octave dictionary: $octdict_fname\n"; +$header = ; +while () { $dict_db{$_} = 1; } +close (FH); + +# Remove old dictionary file and write out new one +unlink ($octdict_fname) + or die "Unable to delete Octave dictionary: $octdict_fname\n"; +open (FH, ">$octdict_fname") + or die "Unable to open file for writing: $octdict_fname\n"; +print FH $header; +print FH sort { uc($a) cmp uc ($b) } keys(%dict_db); +close (FH); diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/doccheck/add_to_aspell_dict --- a/doc/interpreter/doccheck/add_to_aspell_dict Fri May 10 17:54:20 2024 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,73 +0,0 @@ -#!/usr/bin/perl -w - -######################################################################## -## -## Copyright (C) 2010-2024 The Octave Project Developers -## -## See the file COPYRIGHT.md in the top-level directory of this -## distribution or . -## -## This file is part of Octave. -## -## Octave 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. -## -## Octave 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 Octave; see the file COPYING. If not, see -## . -## -######################################################################## - -################################################################################ -# File : add_to_aspell_dict -# Purpose: Merges a file of new words into an existing dictionary file. -# The resulting file is uniquified and sorted before being written out. -# Usage : add_to_aspell_dict -# Documentation: see README in doccheck directory -################################################################################ -# Initialize variables -# Private Octave dictionary for aspell -$octdict_fname = './doccheck/aspell-octave.en.pws'; - -################################################################################ -# Parse command line arguments -unless (@ARGV == 1) -{ - die "USAGE: add_to_aspell_dict \n"; -} - -$new_words_fname = shift(@ARGV); -if (! -r $new_words_fname) -{ - die "Unable to read input file: $new_words_fname\n"; -} - -################################################################################ -# Add new words to a dictionary database -open (FH, "<$new_words_fname") - or die "Unable to open file: $new_words_fname\n"; -while () { $dict_db{$_} = 1; } -close (FH); - -# Add words from existing dictionary to dictionary database -open (FH, "<$octdict_fname") - or die "Unable to open Octave dictionary: $octdict_fname\n"; -$header = ; -while () { $dict_db{$_} = 1; } -close (FH); - -# Remove old dictionary file and write out new one -unlink ($octdict_fname) - or die "Unable to delete Octave dictionary: $octdict_fname\n"; -open (FH, ">$octdict_fname") - or die "Unable to open file for writing: $octdict_fname\n"; -print FH $header; -print FH sort { uc($a) cmp uc ($b) } keys(%dict_db); -close (FH); diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/doccheck/mk-undocumented-list.pl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/interpreter/doccheck/mk-undocumented-list.pl Fri May 10 17:56:08 2024 -0400 @@ -0,0 +1,186 @@ +#!/usr/bin/perl -w + +######################################################################## +## +## Copyright (C) 2010-2024 The Octave Project Developers +## +## See the file COPYRIGHT.md in the top-level directory of this +## distribution or . +## +## This file is part of Octave. +## +## Octave 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. +## +## Octave 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 Octave; see the file COPYING. If not, see +## . +## +######################################################################## + +################################################################################ +# File: mk-undocumented-list.pl +# Purpose: Create a list of functions present in Octave, but without a +# corresponding DOCSTRING entry in one of the *.txi files +# Usage: make doc/interpreter/undocumented_list +# Documentation: see README in doccheck directory +################################################################################ +# Get a list from Octave of all visible functions +@octave_output = <<`_END_OCT_SCRIPT_`; +../../run-octave --norc --quiet --no-history --eval '\ + funclist = vertcat (__list_functions__ , __builtins__); \ + funclist = funclist(! strncmp (funclist, \"meta.\", 5)) \ + disp ("#!-separator-!#") \ + where = cellfun (\@which, funclist, \"UniformOutput\", 0)' +_END_OCT_SCRIPT_ + +unless (@octave_output) { die "Unable to invoke 'run-octave'. Exiting\n" } + +################################################################################ +# Winnow list of functions that require a DOCSTRING + +# First, divide output in to list of functions and list of locations +$idx = 0; +while (($_ = $octave_output[$idx++]) !~ /^#!-separator-!#$/) +{ + push(@all_functions, $1) if (/] = (\w+)$/); +} +while ($_ = $octave_output[$idx++]) +{ + push(@where, $1) if (/] = (.+)$/); +} + +# Sanity check that Octave script worked +if ($#all_functions != $#where) +{ + die "Unequal number of functions and locations. Parsing failed\n"; +} + +# Second, remove functions based on directory location +# deprecated directory, legacy directory, doc/interpreter directory, +# test/ directory +FUNC: foreach $idx (0 .. $#where) +{ + next FUNC if ($where[$idx] =~ /deprecated/i); + next FUNC if ($where[$idx] =~ /legacy/i); + next FUNC if ($where[$idx] =~ /interpreter/i); + next FUNC if ($where[$idx] =~ m#test/#i); + + push (@functions, $all_functions[$idx]); +} + +# Third, remove functions based on naming patterns +# Remove internal functions from the list of features requiring a DOCSTRING +@functions = grep (! /^__/, @functions); + +# Fourth, remove exceptions based on name that do not require documentation +# Load list of function exceptions not requiring a DOCSTRING +# Exception data is stored at the bottom of this script +foreach $_ () +{ chomp, $exceptions{$_}=1; } + +# Remove exception data from the list +@functions = grep (! $exceptions{$_}, @functions); + +################################################################################ +# Get a list of all documented functions +foreach $txi_file (glob("*.txi")) +{ + open(TXI_FILE, $txi_file) or die "Unable to open $txi_file for reading\n"; + while () + { + $docstrings{$1} = 1 if (/\@DOCSTRING\((\w+)\)/); + } +} + +################################################################################ +# Find features which have not been documented in the txi files +@undocumented = grep (! $docstrings{$_}, @functions); + +# Exit successfully if no undocumented functions +exit(0) if (! @undocumented); + +$, = "\n"; # Set output record separator +print sort(@undocumented); +print "\n"; +exit(1); + +################################################################################ +# Exception list of functions not requiring a DOCSTRING +################################################################################ +# desktop : Remove when terminal widget is no longer experimental +################################################################################ +__DATA__ +angle +bessel +besselh +besseli +besselk +bessely +bug_report +chdir +dbnext +debug +desktop +end +exit +F_DUPFD +F_GETFD +F_GETFL +F_SETFD +F_SETFL +fact +finite +flipdim +fmod +gammaln +gui_mainfcn +home +i +ifelse +import +inf +inverse +isbool +isfinite +J +j +java2mat +lstat +metaclass +nan +nargchk +O_APPEND +O_ASYNC +O_CREAT +O_EXCL +O_NONBLOCK +O_RDONLY +O_RDWR +O_SYNC +O_TRUNC +O_WRONLY +putenv +rticks +setenv +slash +thetaticks +tolower +toupper +ylabel +ylim +ytickangle +yticklabels +yticks +zlabel +zlim +ztickangle +zticklabels +zticks diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/doccheck/mk_undocumented_list --- a/doc/interpreter/doccheck/mk_undocumented_list Fri May 10 17:54:20 2024 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -#!/usr/bin/perl -w - -######################################################################## -## -## Copyright (C) 2010-2024 The Octave Project Developers -## -## See the file COPYRIGHT.md in the top-level directory of this -## distribution or . -## -## This file is part of Octave. -## -## Octave 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. -## -## Octave 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 Octave; see the file COPYING. If not, see -## . -## -######################################################################## - -################################################################################ -# File: mk_undocumented_list -# Purpose: Create a list of functions present in Octave, but without a -# corresponding DOCSTRING entry in one of the *.txi files -# Usage: make doc/interpreter/undocumented_list -# Documentation: see README in doccheck directory -################################################################################ -# Get a list from Octave of all visible functions -@octave_output = <<`_END_OCT_SCRIPT_`; -../../run-octave --norc --silent --no-history --eval '\ - funclist = vertcat (__list_functions__ , __builtins__); \ - funclist = funclist(! strncmp (funclist, \"meta.\", 5)) \ - disp ("#!-separator-!#") \ - where = cellfun (\@which, funclist, \"UniformOutput\", 0)' -_END_OCT_SCRIPT_ - -unless (@octave_output) { die "Unable to invoke 'run-octave'. Exiting\n" } - -################################################################################ -# Winnow list of functions that require a DOCSTRING - -# First, divide output in to list of functions and list of locations -$idx = 0; -while (($_ = $octave_output[$idx++]) !~ /^#!-separator-!#$/) -{ - push(@all_functions, $1) if (/] = (\w+)$/); -} -while ($_ = $octave_output[$idx++]) -{ - push(@where, $1) if (/] = (.+)$/); -} - -# Sanity check that Octave script worked -if ($#all_functions != $#where) -{ - die "Unequal number of functions and locations. Parsing failed\n"; -} - -# Second, remove functions based on directory location -# deprecated directory, legacy directory, doc/interpreter directory, -# test/ directory -FUNC: foreach $idx (0 .. $#where) -{ - next FUNC if ($where[$idx] =~ /deprecated/i); - next FUNC if ($where[$idx] =~ /legacy/i); - next FUNC if ($where[$idx] =~ /interpreter/i); - next FUNC if ($where[$idx] =~ m#test/#i); - - push (@functions, $all_functions[$idx]); -} - -# Third, remove functions based on naming patterns -# Remove internal functions from the list of features requiring a DOCSTRING -@functions = grep (! /^__/, @functions); - -# Fourth, remove exceptions based on name that do not require documentation -# Load list of function exceptions not requiring a DOCSTRING -# Exception data is stored at the bottom of this script -foreach $_ () -{ chomp, $exceptions{$_}=1; } - -# Remove exception data from the list -@functions = grep (! $exceptions{$_}, @functions); - -################################################################################ -# Get a list of all documented functions -foreach $txi_file (glob("*.txi")) -{ - open(TXI_FILE, $txi_file) or die "Unable to open $txi_file for reading\n"; - while () - { - $docstrings{$1} = 1 if (/\@DOCSTRING\((\w+)\)/); - } -} - -################################################################################ -# Find features which have not been documented in the txi files -@undocumented = grep (! $docstrings{$_}, @functions); - -# Exit successfully if no undocumented functions -exit(0) if (! @undocumented); - -$, = "\n"; # Set output record separator -print sort(@undocumented); -print "\n"; -exit(1); - -################################################################################ -# Exception list of functions not requiring a DOCSTRING -################################################################################ -# desktop : Remove when terminal widget is no longer experimental -################################################################################ -__DATA__ -angle -bessel -besselh -besseli -besselk -bessely -bug_report -chdir -dbnext -debug -desktop -end -exit -F_DUPFD -F_GETFD -F_GETFL -F_SETFD -F_SETFL -fact -finite -flipdim -fmod -gammaln -gui_mainfcn -home -i -ifelse -import -inf -inverse -isbool -isfinite -J -j -java2mat -lstat -metaclass -nan -nargchk -O_APPEND -O_ASYNC -O_CREAT -O_EXCL -O_NONBLOCK -O_RDONLY -O_RDWR -O_SYNC -O_TRUNC -O_WRONLY -putenv -rticks -setenv -slash -thetaticks -tolower -toupper -ylabel -ylim -ytickangle -yticklabels -yticks -zlabel -zlim -ztickangle -zticklabels -zticks diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/expr.txi --- a/doc/interpreter/expr.txi Fri May 10 17:54:20 2024 -0400 +++ b/doc/interpreter/expr.txi Fri May 10 17:56:08 2024 -0400 @@ -52,7 +52,7 @@ An @dfn{index expression} allows you to reference or extract selected elements of a vector, a matrix (2-D), or a higher-dimensional array. Arrays may be indexed in one of three ways: -@ref{XREFComponentIndexing,,Component Indexing}, +@ref{XREFComponentIndexing,,Component Indexing}, @ref{XREFLinearIndexing,,Linear Indexing}, and @ref{XREFLogicalIndexing,,Logical Indexing}. @@ -309,7 +309,7 @@ @cindex Chained indexing Octave permits the use of repeated (chained) index expressions to extract subsets of an array in a single command without the need to use intermediate -variables. This can make it easier to write code with either complicated +variables. This can make it easier to write code with either complicated indexing operations or using multiple indexing methods. The following example shows two equivalent index extraction operations: diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/external.txi --- a/doc/interpreter/external.txi Fri May 10 17:54:20 2024 -0400 +++ b/doc/interpreter/external.txi Fri May 10 17:56:08 2024 -0400 @@ -310,7 +310,7 @@ Note that these functions do significant error checking and so in some circumstances the user might prefer to access the data of the array or matrix -directly through the @code{fortran_vec} method discussed below. +directly through the @code{rwdata} method discussed below. @deftypefn {Method} {octave_idx_type} numel () const The total number of elements in the matrix or array. @@ -336,7 +336,7 @@ of rows and columns in the matrix. @end deftypefn -@deftypefn {Method} {T *} fortran_vec () +@deftypefn {Method} {T *} rwdata () This method returns a pointer to the underlying data of the matrix or array so that it can be manipulated directly, either within Octave or by an external library. @@ -646,7 +646,7 @@ @end example Finally, because the sparse types aren't represented by a contiguous block of -memory, the @nospell{@code{fortran_vec}} method of @code{Array} is not +memory, the @nospell{@code{rwdata}} method of @code{Array} is not available. It is, however, replaced by three separate methods @code{ridx}, @code{cidx}, and @code{data}, that access the raw compressed column format that Octave sparse matrices are stored in. These methods can be used in a manner @@ -1010,7 +1010,7 @@ macros to allow writing code that can be used with different Fortran calling conventions. -Note that we don't attempt to handle Fortran functions, we always use +Note that we don't attempt to handle Fortran functions, we always use subroutine wrappers for them and pass the return value as an extra argument. Use the following macros to pass character strings from C to Fortran: @@ -1220,7 +1220,7 @@ The disadvantage of this is that if the foreign code allocates any memory internally, then this memory might be lost during an interrupt, without being deallocated. Therefore, ideally Octave itself should allocate any memory that -is needed by the foreign code, with either the @nospell{@code{fortran_vec}} +is needed by the foreign code, with either the @nospell{@code{rwdata}} method or the @w{@code{OCTAVE_LOCAL_BUFFER}}@ macro. The Octave @code{unwind_protect} mechanism (@ref{The unwind_protect Statement}) diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/genpropdoc.m diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/graphics-properties.mk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/interpreter/graphics-properties.mk Fri May 10 17:56:08 2024 -0400 @@ -0,0 +1,43 @@ +GRAPH_PROP_TEXI_SRC= \ + interpreter/plot-axesproperties.texi \ + interpreter/plot-figureproperties.texi \ + interpreter/plot-imageproperties.texi \ + interpreter/plot-lineproperties.texi \ + interpreter/plot-patchproperties.texi \ + interpreter/plot-rootproperties.texi \ + interpreter/plot-scatterproperties.texi \ + interpreter/plot-surfaceproperties.texi \ + interpreter/plot-textproperties.texi + +define gen-propdoc-texi + rm -f $@-t $@ && \ + $(top_builddir)/run-octave -disable-asan --norc --quiet --no-history --path $(srcdir)/interpreter --eval "genpropdoc ('$(1)');" > $@-t && \ + mv $@-t $@ +endef + +interpreter/plot-axesproperties.texi: interpreter/genpropdoc.m + $(AM_V_GEN)$(call gen-propdoc-texi,axes) + +interpreter/plot-figureproperties.texi: interpreter/genpropdoc.m + $(AM_V_GEN)$(call gen-propdoc-texi,figure) + +interpreter/plot-imageproperties.texi: interpreter/genpropdoc.m + $(AM_V_GEN)$(call gen-propdoc-texi,image) + +interpreter/plot-lineproperties.texi: interpreter/genpropdoc.m + $(AM_V_GEN)$(call gen-propdoc-texi,line) + +interpreter/plot-patchproperties.texi: interpreter/genpropdoc.m + $(AM_V_GEN)$(call gen-propdoc-texi,patch) + +interpreter/plot-rootproperties.texi: interpreter/genpropdoc.m + $(AM_V_GEN)$(call gen-propdoc-texi,root) + +interpreter/plot-surfaceproperties.texi: interpreter/genpropdoc.m + $(AM_V_GEN)$(call gen-propdoc-texi,surface) + +interpreter/plot-scatterproperties.texi: interpreter/genpropdoc.m + $(AM_V_GEN)$(call gen-propdoc-texi,scatter) + +interpreter/plot-textproperties.texi: interpreter/genpropdoc.m + $(AM_V_GEN)$(call gen-propdoc-texi,text) diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/graphics_properties.mk --- a/doc/interpreter/graphics_properties.mk Fri May 10 17:54:20 2024 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -GRAPH_PROP_TEXI_SRC= \ - interpreter/plot-axesproperties.texi \ - interpreter/plot-figureproperties.texi \ - interpreter/plot-imageproperties.texi \ - interpreter/plot-lineproperties.texi \ - interpreter/plot-patchproperties.texi \ - interpreter/plot-rootproperties.texi \ - interpreter/plot-scatterproperties.texi \ - interpreter/plot-surfaceproperties.texi \ - interpreter/plot-textproperties.texi - -define gen-propdoc-texi - rm -f $@-t $@ && \ - $(top_builddir)/run-octave -disable-asan --norc --silent --no-history --path $(srcdir)/interpreter --eval "genpropdoc ('$(1)');" > $@-t && \ - mv $@-t $@ -endef - -interpreter/plot-axesproperties.texi: interpreter/genpropdoc.m - $(AM_V_GEN)$(call gen-propdoc-texi,axes) - -interpreter/plot-figureproperties.texi: interpreter/genpropdoc.m - $(AM_V_GEN)$(call gen-propdoc-texi,figure) - -interpreter/plot-imageproperties.texi: interpreter/genpropdoc.m - $(AM_V_GEN)$(call gen-propdoc-texi,image) - -interpreter/plot-lineproperties.texi: interpreter/genpropdoc.m - $(AM_V_GEN)$(call gen-propdoc-texi,line) - -interpreter/plot-patchproperties.texi: interpreter/genpropdoc.m - $(AM_V_GEN)$(call gen-propdoc-texi,patch) - -interpreter/plot-rootproperties.texi: interpreter/genpropdoc.m - $(AM_V_GEN)$(call gen-propdoc-texi,root) - -interpreter/plot-surfaceproperties.texi: interpreter/genpropdoc.m - $(AM_V_GEN)$(call gen-propdoc-texi,surface) - -interpreter/plot-scatterproperties.texi: interpreter/genpropdoc.m - $(AM_V_GEN)$(call gen-propdoc-texi,scatter) - -interpreter/plot-textproperties.texi: interpreter/genpropdoc.m - $(AM_V_GEN)$(call gen-propdoc-texi,text) diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/images.awk --- a/doc/interpreter/images.awk Fri May 10 17:54:20 2024 -0400 +++ b/doc/interpreter/images.awk Fri May 10 17:56:08 2024 -0400 @@ -54,7 +54,7 @@ for (j = 2; j <= NF; j++) { printf ("%s%s.%s: %s%s\n", dir, $j, ext, dir, script); - printf ("\t$(AM_V_GEN)$(SHELL) run-octave -disable-asan --norc --silent --no-history --path $(abs_top_srcdir)/%s --eval \"%s ('%s', '%s', '%s');\"\n", + printf ("\t$(AM_V_GEN)$(SHELL) run-octave -disable-asan --norc --quiet --no-history --path $(abs_top_srcdir)/%s --eval \"%s ('%s', '%s', '%s');\"\n", dir, basename, dir, $j, ext); } } diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/module.mk --- a/doc/interpreter/module.mk Fri May 10 17:54:20 2024 -0400 +++ b/doc/interpreter/module.mk Fri May 10 17:56:08 2024 -0400 @@ -26,7 +26,7 @@ define gen-propdoc-texi rm -f $@-t $@ && \ - $(SHELL) run-octave -disable-asan --norc --silent --no-history --path $(srcdir)/doc/interpreter --eval "genpropdoc ('$(1)');" > $@-t && \ + $(SHELL) run-octave -disable-asan --norc --quiet --no-history --path $(srcdir)/doc/interpreter --eval "genpropdoc ('$(1)');" > $@-t && \ mv $@-t $@ endef @@ -117,11 +117,11 @@ HTMLDIR_IMAGES = $(patsubst %reldir%/%.png, %reldir%/octave.html/%.png, $(DOC_IMAGES_PNG)) LOGOS = \ - %reldir%/octave_logo.eps \ - %reldir%/octave_logo.pdf + %reldir%/octave-logo.eps \ + %reldir%/octave-logo.pdf -DOC_IMAGES_EPS += %reldir%/octave_logo.eps -DOC_IMAGES_PDF += %reldir%/octave_logo.pdf +DOC_IMAGES_EPS += %reldir%/octave-logo.eps +DOC_IMAGES_PDF += %reldir%/octave-logo.pdf MUNGED_TEXI_SRC = \ %reldir%/arith.texi \ @@ -320,7 +320,7 @@ --css-ref=octave.css \ -o $(OCTAVE_HTML_TMP_DIR) `test -f '%reldir%/octave.texi' || echo '$(abs_top_srcdir)/'`%reldir%/octave.texi; \ then \ - $(PERL) $(srcdir)/build-aux/inplace_edit.pl 's|(?<=): ||g' $(OCTAVE_HTML_TMP_DIR)/* && \ + $(PERL) $(srcdir)/build-aux/inplace-edit.pl 's|(?<=): ||g' $(OCTAVE_HTML_TMP_DIR)/* && \ rm -rf $(OCTAVE_HTML_DIR) && \ mv $(OCTAVE_HTML_TMP_DIR) $(OCTAVE_HTML_DIR) && \ touch $@; \ @@ -416,7 +416,7 @@ %reldir%/contributors.in \ %reldir%/doc-cache \ %reldir%/genpropdoc.m \ - %reldir%/graphics_properties.mk \ + %reldir%/graphics-properties.mk \ %reldir%/images \ %reldir%/images.awk \ %reldir%/images.mk \ @@ -473,7 +473,7 @@ %reldir%/undocumented_list: rm -f $@-t $@ - -cd $(srcdir)/%reldir%; $(PERL) ./doccheck/mk_undocumented_list > $(@F)-t + -cd $(srcdir)/%reldir%; $(PERL) ./doccheck/mk-undocumented-list.pl > $(@F)-t mv $@-t $@ [ -s $@ ] || rm -f $@ @cd $(srcdir)/%reldir% ; \ diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/numbers.txi --- a/doc/interpreter/numbers.txi Fri May 10 17:54:20 2024 -0400 +++ b/doc/interpreter/numbers.txi Fri May 10 17:56:08 2024 -0400 @@ -752,7 +752,7 @@ Logical values can also be used to index matrices and cell arrays. When indexing with a logical array the result will be a vector containing -the values corresponding to @code{true} parts of the logical array. +the values corresponding to @code{true} parts of the logical array. @xref{XREFLogicalIndexing, , Logical Indexing}. Logical values can also be constructed by diff -r 0698a2a8ed23 -r 69b9695538fb doc/interpreter/octave-logo.eps --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/doc/interpreter/octave-logo.eps Fri May 10 17:56:08 2024 -0400 @@ -0,0 +1,2246 @@ +%!PS-Adobe-3.0 EPSF-3.0 +%%Creator: cairo 1.8.8 (http://cairographics.org) +%%CreationDate: Thu Feb 3 18:31:36 2011 +%%Pages: 1 +%%BoundingBox: 1 1 229 230 +%%DocumentData: Clean7Bit +%%LanguageLevel: 2 +%%EndComments +%%BeginProlog +/cairo_eps_state save def +/dict_count countdictstack def +/op_count count 1 sub def +userdict begin +/q { gsave } bind def +/Q { grestore } bind def +/cm { 6 array astore concat } bind def +/w { setlinewidth } bind def +/J { setlinecap } bind def +/j { setlinejoin } bind def +/M { setmiterlimit } bind def +/d { setdash } bind def +/m { moveto } bind def +/l { lineto } bind def +/c { curveto } bind def +/h { closepath } bind def +/re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto + 0 exch rlineto 0 rlineto closepath } bind def +/S { stroke } bind def +/f { fill } bind def +/f* { eofill } bind def +/B { fill stroke } bind def +/B* { eofill stroke } bind def +/n { newpath } bind def +/W { clip } bind def +/W* { eoclip } bind def +/BT { } bind def +/ET { } bind def +/pdfmark where { pop globaldict /?pdfmark /exec load put } + { globaldict begin /?pdfmark /pop load def /pdfmark + /cleartomark load def end } ifelse +/BDC { mark 3 1 roll /BDC pdfmark } bind def +/EMC { mark /EMC pdfmark } bind def +/cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def +/Tj { show currentpoint cairo_store_point } bind def +/TJ { + { + dup + type /stringtype eq + { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse + } forall + currentpoint cairo_store_point +} bind def +/cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore + cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def +/Tf { pop /cairo_font exch def /cairo_font_matrix where + { pop cairo_selectfont } if } bind def +/Td { matrix translate cairo_font_matrix matrix concatmatrix dup + /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point + /cairo_font where { pop cairo_selectfont } if } bind def +/Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def + cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def +/g { setgray } bind def +/rg { setrgbcolor } bind def +/d1 { setcachedevice } bind def +%%EndProlog +%%Page: 1 1 +%%BeginPageSetup +%%PageBoundingBox: 1 1 229 230 +%%EndPageSetup +q +1 0.498039 0.164706 rg +16.258 153.068 m 61.023 153.068 l 67.812 153.068 73.277 147.599 73.277 +140.81 c 73.277 96.048 l 73.277 89.259 67.812 83.791 61.023 83.791 c +16.258 83.791 l 9.469 83.791 4.004 89.259 4.004 96.048 c 4.004 140.81 l +4.004 147.599 9.469 153.068 16.258 153.068 c h +16.258 153.068 m f +0.831373 0.333333 0 rg +5.030871 w +0 J +0 j +[] 0.0 d +4 M q 1 0 0 -1 0 230.399994 cm +16.258 77.332 m 61.023 77.332 l 67.812 77.332 73.277 82.801 73.277 +89.59 c 73.277 134.352 l 73.277 141.141 67.812 146.609 61.023 146.609 c +16.258 146.609 l 9.469 146.609 4.004 141.141 4.004 134.352 c 4.004 +89.59 l 4.004 82.801 9.469 77.332 16.258 77.332 c h +16.258 77.332 m S Q +Q q +q 0 0 231 231 rectclip +% Fallback Image: x=19, y=1, w=210, h=228 res=300dpi size=2499228 +[ 0.24 0 0 0.24 19 1.159994 ] concat +/DeviceRGB setcolorspace +8 dict dup begin + /ImageType 1 def + /Width 876 def + /Height 951 def + /BitsPerComponent 8 def + /Decode [ 0 1 0 1 0 1 ] def + /DataSource currentfile /ASCII85Decode filter /LZWDecode filter def + /ImageMatrix [ 1 0 0 -1 0 951 ] def +end +image +J3Vsg3$]7K#D>EP:q1$o*=mro@So+\<\5,H7Uo<*jE<[.O@Wn[3@'nb-^757;Rp>H>q_R=Al + C^cenm@9:1mM9jS"!dTMT<$3[GQ$8#0$s<4ZX!SPQ1`C/mHHFlMi:-ncYKoBDKd&.l'7:d1hjHP"/@`m`GlpO + c85>dbKY(%>)m]_@F1F^W:1IXb_>k + P+oS^^pnX!PjdJ%0N?fM=c69a-lF/*J^E.Ga7^]5&MBOJZNr)/os!l$t_6,.MsMbRU7"#FA + WcA0jJ!"`Xu``-^WuFBcBOH]QG47OhnLF8*0Z$+ik9IKI@ZAglWmS10g@sap-Ln,g(.lW@Q + ->bc<4N;(T:qbOZ.U1!C:K\Lu+g$+MT)VXW)H*$`:kEY,+9bXi`Y9J1K'X>tOqR>^\UHp.q + &&OXq[9bg+EP\hF2dM.Ze8^`j*/;0WCl28/c->D1[(JGuE`C!-Tq`0X10W-'#VoqJg + Xck_EJeg;b&1JY9[kR07dEZc%l9UfC7OAO0NU?5!Rc63Vh+2WY-4ZTJ`)nJ%>3UV:)/KAQu + 3q"iQI)UDo'FD!`g9GBdCb1:0>;@S$ct9-5X3699Ni=:/P0F=`%Z8jd"YC>@s:oK4&=,r+@ + )'p+CW&=ZR"[BZ`@^T5*U+]rc.qQL:.rgiistED76Ld;s(A^9r$>L(Uu!lh^=kYR:nJfO^Q + u&Z0T4#1:tK*R?1sD&u3['RjL1cLnm>S*p6in/MrB_=3@#k'`kVRGN9+a!'A5cQg8pEJr(L + QjjD3F;[;3Q#q:X?'t:*5&H^1Q0*"UFnQT#T6?@QQ.tM'L5Xm^>!A4Il$@Q-V + Wsa*VfHQ6\!=&]HP`6WqAsRMkNi9B76)?/_:%`l`];Ur*"0UU9lRj#c1ClU:Y#.:T5WQ[WR + T&fD=47Rb]o>qD,,*Zr3nZcgtVpOcjBb<3!SSP,RK#3V3j;f<9mgo2-3PhS?mBc"kid_BFo + %;ZtMSji<-o@NBQ75G,5N%9IXarWTcb$W=.RQ0nmMa.[n/SCBIdS&>r2u%FNf\Nu@7)_si, + i#`TGU6qN54/ga!=SJ00cnf&nA=q3:D,M/T(1s3T[3Jb7)@f-F\Z&SlT=N)/Jqk]9K.?_Kf + h#lT"EIog_$F>OBm9n,JO%CAK62,]p,Q_(mE09-HB8k?3>Utq2EYq/(*@#*Id"\<=8]an6, + iQ8hLEhI@+gFj'*p_]'_qFRa.%r*O7&cGLY#\0J>q=P]q]F/.]o,h)WC((7)rW\.9A%'6UA + Vip&X"ro=c"ln/-qY@Xj]PgSK">o&9X(4C*NHA2;mPB=g@[<8,,FoA0g,7Wh'Y/L;[TnX^E>9LE;l(K5'h*0%=J$]"0K#K3I)'Fo^k=q*d]71#Ye/<*%PqLf*HU-et + :c@lBt&k1I*UD.I%dCMJ2B[">[oT#&3.?,5p744&c/iGt^h_X;Gd>h$u3_``H:"DEFVb8@$ + 8*RiL,TT14oaTtQ\^'doAP&G8/a6%,SNNftRAs31Q\H=D\,EZjUQ'4cL&p-V! + =c(b=rp%rq8HXp)YOE*XDX*:^6a@N#/_J93<]!(f#^"lnlFmbfGYVm!Z7N2e\lp]m + &-]Zk>eIr-!4VNE*D( + 0*Pb1bVFqRN%tIZa%um$E\PKN_cUge@GEu^hiQ)L,'C@!dnN="LtK[+Y3BDbX`e]50tS1gm + GhCWGUu$=J/=6b7bc77R>'mo=0=U@f4R"I7!u^o/LB)YQBra8S\HtHdGMJPJ1WBVP#eU4jk + 8sNo*)8?0\Ze>SB[I@?ro7;FV+lKUcCjo),nH'_o,eESb'jHcWT^#B@;f!8!*K\"+5:>6,b + J]a@F4\0,80E=eg(n0#i35(hlZNNNV\.]K#4Oj1EEo7a=9(\I+bc81B[r`UD>YaeND0JX!I + "T;\/]dGO>.QCA'\bLdI_leKIIn8?%o7aj4(h2AP_TNF+;CiP=7'Je25ocJJ65Aa].[J%Vn + gK8Ik%(%3(b^`u)\gVB4:!Idh5*=7IYB=OfAYjU*n$!Q89O7$I^%CGLa-qo.X"?m-oe[H*r + !ucfRkZj9p%?l3`r#'NafR5Y=4[1Vs6He0YOFu`bo6nIi16"8[O36Z*/lGS!:k2b*eYEoVM + B$&?-E&!1$2`c_5L4Mj+I`+$1;1G$^%X=7_\-N>GIp1?AkTT7dSQ-a%LO/Zb:R[39j`.:ML + 5>^F=ktaBSp2E(l7kS^+<\R^o81#mlkVIT>c?;i0E"/XJ6m(t[H)Nd"caaS>d\jBElL&:8Ki^ieAGMN1OY + O:1i2#"behDlC%qd'*e%H,$9KM!2U_oCQfs!.@>8*TtZYP&S`bWSJCW%gT:htc.erVsA&oD + Jd=J)6EDmtM"TOR + a(!s&tn,j%r'^="[os&E9E5q1f58T2e!`=E,XGGC6Eqe^Npb@g(EK^LCbms0ii[npKOeR-j + r6(3&qCl%`Dm(*459&"^&MF)';&^KqF!krE%&&h(!A&*(O?t\b*\r^'nrY@VPUbp0+5reE_ + %]Y[RMTD<#a,!6nOkAEr?'Gi/$]1+n>.85`?=VF+VA3"EmW8(^FaIL(CS1jLt;5XR1>1`=P)\QX8mRJUf,l=le19u$X_7^H>%UO + sA*[0<&17'gR75T'W1nmM\KA7.#)@Ji])j79@o3XC18N$(J.oU:81N=qn#:pJi+O.k5uc*&Zm/:%-S#jQ9scJpOJtu2Ik8uU6h?,;du:*Nh*bm57*8e + (%"C;,dj#HW,=Hff-)`9cAdVi)B8Q9j*<23>!6W3D^bSKC0*X!9[2A'@U'k(_\*WtC9A2"AOC'\6c)V- + ?=p+]Y"2-:TK=>UapeCS4c9j(HQ//=RJE)9.`ID+tD(eQ + B7T6Q]Q@Vo]7kdrn7oR;Zp5ml`/J%O7-.V0LFmD2U5@5'Q?a]]Ep%Mhp^M?lW$\Nm?"?%)a + bp^"_d`@$A!8>"*:HdB[NGo/gka + [;e`QUC%XE"1lHKr^M=WmJ?jB7QXt^aB7Xk?*&)ITJZs$q'mLQEK"*Caia@4$C5TgF21UBi + \3:h`6\IC\H$E&:\"@Qj;cd#mH8bA@FZl>1+[m[C%3cb4=QPr2Q'le.4ot?jJ[-:]R(>P9(>/MQq":*nrK!?K + O;Y`bfN4S&?$[6BO]9knRF(-LC@nr4dJ5.bpig3I?^qHo3p8URF:ai6G(,S/n<90,^1RqG + F(ENZCc?&u7I'iN\i]7@MqAVRa1*>&g#l]7g!p@en!)\Ik?Wc$G[CSN.XDR3?NoDaV&aE;; + "fEG_:h8Y3..T(Zrl2$]b!7A$t"B="d_'cC[`]:dfOF;Uot + 7RiafS'bNdV!m7O#d/DH3&kAjfDJ2488+r] + $Cn4@6FFDXgr.g1F'%]=c<0FCARCo>G85^V6=B-G+gH+@Fp)Sn$(QW]=Y_nJ]9>D$o7m?@\ + A;g_5k6-X0LD*Z5_K1q^]B@YGZa3@_4R\Pf^8?pS`?RZoe4R(/_k!af0KpWS-6ne4$d5l*] + #:Wn/>n(l;l1A[\IaX1A82pm%LVH*![bV + 0[Q!.43Pfg=!UC!f^W1_Ia/T=a.7pd1c+KaP]j-Q1*07d[h8t#uah'.=>'6aUV6_-0W#<^l + HAQrp7DJZMS[G**dtb>5H$i2GWgPd^Plu6_5jQ'3B7"P6\)!]Rl"F1k_m9ZeqU)!Z0qr@iYFS.]DtZ(-`o*C7A%6c + hF?^&4;JgEju]jhA>_H(4?Sp@6<"V8&KcW;URqg]]6V$&9FgLKkF=4;DHj),L/N(V)]R>.& + C@/Q"TNc<4#$UrCWj%uNL>Ilc%Kr:tHeZOiX$"rIM,r<_7=O`Y8nG7r+"-fe29UB&#AP + .irU;7f@)nIhS&8`Gj$6#2GYHZ'S(]LTr[)L7GrSce:%kK>b0CC:XrYu^3lib?"(JEp""Ms + W-l)*q:2j>D9L90f=j?d)cb+An''JP>?oXo>hOqghnnk?g"i?p]^)7$-+GM6`'(EoRuQ0n! + Q=p?Y$K#c>nPl*($L$VURg#ahN0\Sb&%/M@l7=P^$k5MVo"m^UBAh2gY5F.\YqM#8 + u?r&(.7S[Z2RQ+a3)rNBNHMb$"?chih/?@051=7^UAgmh[+*fJjH7Hm$+2rM965o^gedMek + SlCVATs'RA?ab+$Y$:ci:hf7tsFl5K.lp#pJ50MnISa?;ViV]Ur]/f:!Z0kX_m[p$A*HV'? + GH%+Kmp1FNG^KE+R6fJ[pPYNYBMacYclUo(&JYDKXPZ!D"_X5Y17Brg",m*OUC,j\_V05@NEJ_HG3bTfGj5MLq%5/E;46=0,9J + b[IC^1`_.bCb@L/h>b5Z5SBkg>);LVtEnA`R[(:ZdVcftMCA%GZJK8jbg24:1IFdS,\82d9 + ]FFlGM8S@mM(?$T-^W!S(['"qYf6E@ + eI)!qY`V8T?$?)9jX;boDnp,0I-l*5R$cl"UVD,)$Rj\8=^%'B%/+6_N;,U-^WuF2\*`eoK + s0XE;Vn:_f7\d'ZG&[>87JL!Oin8;2f-,7^9e<.)n!sFWO'CoRe3B7L?OJ8CB&M,tTk&OD[ + UPH%RNfEeLJB$?EebDG(Vt[4Y+(TnI;W1E=@h9_1*i1A:@k3A.o0+ + &]04Khm/K?gPP#23:t.oA78W.1YI1o2k^\9F^93&gNOu7+mOH9L2"T'hWeD9V^f18Z$r^qP/=D1GS + UXgXc%W?Ke5s?m>#,[K*8tDGb-D'ip:82a"`OR0oohT"$Y+CGnrg#AF5[\f]@BG>humBIU_ + 0D=egnD\F$>tSN?T,Xe06DS&"IUH5;2.kjOGgV.giPjShA>^8%VlYSO:>C@HluX[1?>tG@D,mrSYp,RfQIL>@ + Hjhd + 8hDoj;q;gONZ+,0,=b3$&lhXk6Z!LT^[>.>^:`r*^Gt"(P#=O;W9Qa4Vo8JS^=3_"Lb2).B + XZ9YfN$n$biJU`P/TMcIG/W#OoJp_ + >S[(WVbhAd)Ci*jZ\>,FOgY9).DQ*ZN\$VU]>QduDks<0GGcql\PE1W^1+p)t`8qZN@WG4H + brLU(kG(tH;(d\t\k(WA<am`%=LkjIdO_mWW$n_-((!:F.Q^Q=K[A3;j`ZW8K-)P`g8N + q)I&T)=e8P#b4IGqgXVe=2YbG#(^*5Xu(;rZB"YD[t-aD*ds(.?^t.YIRuRT6'LfAPr9HGN + ?Tt`4LKhp&3).oYmI3_CuC1@mELD![^hfJIj_P)AjbW@#WQGE)pa?GW*hodl2pnFq;jkI0j + Nuie:P",Vj=-d[+4i1d= + \E)C@$3+TiAW0C\aN]o3qFR^8Z6thR?IZGnuh+2%-KT;:^:e-sO*[t!cO4:RBa;9%o<:X-Ja)L\[6O9L1lEMjSe>nlGY + #rEKCA[+_\:0L`qc7uf0H]CkQuE+95Zs.Q+<1]jL1UWkG"H!ePS:6cm*j4(/RVu9gRC!F&D + 2=kLZ]SZI7$<6FLT3c0% + N4ZB9cgL]pH2%?Mi]-#D1P>":QDQR^mlc`VZ^Fp923Q`IM%O + AAFAn?WNWE0Pag:Xgg6H!poP8)E*0^gA8HE>K + m$@:iq_JD0pM7KPJsWVqi,>F_BUBUucEFD + B`2bCu6r"XCPB:6Sqq_/lptbuOL9l/m,$9J]Y#OOVh=h:oK17egS!,+NVScX-4_Nija=,7fN23o1<[K=6R/40Xs22Kk'K+qG?9oC`+OD-\d(LnJJNNCtqZa87(m/'M< + gMT=2OX_^==pIAL4Aa.F.P#&qCQu:C\>#BhhSrcJQ*(O2b?8lF`uC;1eCJ-@)3NP,/#A^&Z + GOl@ojm4mF.@jJ`sa1+*nHQE;h$!GaB*'S6(U]J[@O0\7e^-5EBL75GU-.,L + Tb*P=kd4b"BsM^nm5k.Dp5 + pCp2]*9uHFW.sLFH8\BEbFl(m$kAQ=(RVoluhj8,.E"=(rGSoB0@=2UG!A$.L=Q1Bsl\kT= + 60N_5U\(.Edlel<50)lK)M=EWEZ\`24dRAR\l4c!s)FpLecY$*pJ:&q?s + ZZ2u>TtLi9qr&0;r]_sj>j`i^1694Esk#"kr"t^[B&T,T\hde0H&(%3_Ng@ + CbmVPnO#rX^FF@eZPfjfX[A"Y^M8,1K-%WCIm9Fu]0ioo_mR8&DSOqF[gTc4'LOt!1,i-RP + LK`IlbC5N^qb<5\"!ae16oL>1dJuR5hlf$gOR6=SO!Y+*^!:&=DS45D$Q3d6'PD=Cfa&Q=@ + J0O*l*#Ud!c*GB87`P#,GPDll=""*_$PYZtpjS.f;UQA2!8668RIToHcMF-88\=2(R\+X=6 + WO._48F^2rGRgi#O.Tu-FU^;M`ie8m/smmB18^Bt]C@Wk+[AA;'F5@aCSZQ:\DHm1AP[]DY + N_u-st[_rRQa;QSI/;#^J!j\mr]@9Q + KJE$%Z].DDPY"Q68R.QQCmPF[@#$^dV+>DkoNjuaS4UAa7MHq6*$3*V+KF4-_B`^"gQnlc- + ,'L/`fqjY1aoSe.QQ97`oJ^DWKfs]&4\"J6R4Ck4>XQjFi.+!7roM37!Lc9AOiM.5CBm`%" + ,Z,4\+Qs^U-3r"@'ZVJA`BS83B6ke:bUg76iqXbT)DDjG9S,MG-Yu`6?4`;glI*NP'Y"3!> + >^*6Ub^5pU,Y#Cq0CI*YLacqOqr9cH6NE-qoC5)*Hb8[R&?bgsnkT1S)c]tE&Z4JBVRh9%h + :8k\*b>\Z9pCJ&p[8rF%risSJdDl0>30_B@r1p0>2Yc@' + [+i[b+rEe#/jM9,mR7p#Z-Ke:mlN]^i>-S-&eAGd+m5Lm+=ns&4trU;&WM1]\>ndA^/\":# + p!%,c4&7h"O]/?[9NV,!GR7qEl!D!X&BmDk/G/C_'lD"'g)nJb + a(/PN^i]Xu@ooduF%4-T`kH,e0fhFnX[9HOpX)mF7YBV9 + A8/o'(b:!m2-at3AK*tT*6q-B6L>gX]]W/ikF)Pt-RBt[#kuLf2UY7!b=*aQo,UJ>BMs`:; + OW-^1Mb<([8P0#^\%6Jm:S@/^XEKLc^Y,:,*(!\im5e%`3!oQm#/Ze2b;Fn.BPTur6!VS3k + UhL`B4i#%!Y:=3UK<;dWY"c$ + (tW)YDfc8;ObNDtn.<`mSJ9*KUb,SN<#cW?sF + >2?>bmB806H`nheL7!$NfH*?'Ze+$@=7(H@D%G7r*`S\]e?ic9`+E+=hq1g(fOYjkCBr7P^ + ^PXJ0Vq_#X]8@pji8*;5/!"Zm>oEfF]f`I+_;nRX7J],bW<]13o-'ph3OO!Q^_Pq-l$5Mbq + %+6JBqM5;WPRCHAbg_7+qGg5ZC6W):DR5eQPDt.:o>Or/B?HEPUX39Uj.*:#fEQb<[$,#2" + &'0RMNuYMP9'?Cg@fWTXQ%GR(H)O]AdFmBg3u[G,i4?OcR1KV)J5+^:_*>I(NN9\n4ZhV7- + g=E:k&K]1](OP$@HfY*2?e\ml(*kFdB?lF">K]ua,>?N8q;FSgQ23afR-I2Qt@%C_3'q!FF + \juGBekOZBe^_k!f3o!,?%i#ZP2KLNO&j6Sg+:0Jh)4$U2Vn4t>'8e-Jt(Jc**tTY4Le053 + -W?LlXC>I@NH_&.$fZ[Ig$SL0=YcRn7lEU-sm`=?R>6^"\@8L&77fYfHn,]2>5%4pGm@kfN + f:tm80GRqc+nY>UB>D4oX5!j]L$6i!ACO--!#e"!K9"gmq[-?'AZ5bi!op6_q-%"^p-q.:B + hufq&XG[4G_O-/$JO=l!`DlAX[X^"0V+h6Q'H_WFYUUYY"Nf*3*<"r]o')bBqfiQ^FGQna= + lE.qR*LT9q)2Hsb,>\22(#=*V@duFXr*JKShif5DD#%Ce3.cR%1il1LPVCbcK+ur+G<6d2? + 7JJQ2q,hLK2+>=.Sbtt4DW>n"B,uq.gb.W^?!MPq3bAKWB^TBeGX!43gq7l!L-[BQ6;ht5j + >8tlL.,Ap7Sc2WjF"UJoR^KTf'#[`jKo"iVA&%=iah(o8Cs`G8F9dmR$oVLJSsnoHA*,\?AhGQF7_*jCM + qoKBB<1iu58KnVH>\s'nZ2d@peSD8T`BXh=PY'3?98WsOCs"FCE)hSp3Kk)bu.i4B?gf + rk'g^@7),N\kREto)^OW!A`u9hkZ/:/ASL5A5iG1g`.^#2V)7.Rh<;]0jXW5tVGtMEOQC(T + ",pK>.&,s$QYaslCu3H#"4[YHnV9(FAepm'-IZ\;@;4#YD,t68D7=+o\C_Pgk)2p\7,7'-( + $<,*B$.Pl4o4=.qr:r@k6pJ9-9(*?X_Qmkj1__2mQ@o^GiRq3CGW!V7XJCsHshl9BA1aKJg + &qhZXD$.A9HC;`LL?88`:AtC\GPWIG.58M)+c?:Y*Hq"NB_.`b=.f,UURj^<#dBO\DuC>9I + WdcHboD"E7-?02>gYcnc"udd9O2E/t:l$sbBjmj8N_15>6c + K'uaSi?jKZ&hCrR!>Pr;T%i3$jWuuTGo\ + 8Wu:39kZY@goVm[$g&QKg$)+'%1aEXqJ$G9T[lml$cJ=cXja24CY%88g]*?"Q]B:53G)TP/ + p8mtjYIo>5PAqXXj1B[Z6cgGe^U3UdP8p66.O]?:EZ:'U32@JO_\Vf-bYE-DS\V&mu*-IMG + RFE?&UoB)Qas*&Xo[5 + (E1rgk#)F]mZ'I#i;.)gP]^+4F`#HBk?)a`=`4Bcl_W'NAXdhg-hZ;dEgFFJ*GJ1P.n"#Y4 + 832LG@P^62-tDF=a'V4C[qXU[]%nFD\\_H2MYI]5!*nC6mgY0,L$8L&8r,mRs;LIE$ + 9?+8DHK>aL@a5?,Bm[:"^6mb_*d^Q<5lO`)#Hq)5k<^F4A7QJ(FNC],tnT##]Tq.qp`Dm## + WL5br]?=c?7H1u%OD<(IGfK?mj#9[OC^SuXrgjRLg#,l_NYU>.GCjO^9rYOR8kH\^=lq#U_i^:GPAR`hgh?fJa/;JX.P%%c\228j*qTRHh=H<#Dm>G1jGq8FZf$g3NRJVm + /151nh,C;+!c+Raa#ODP%Vs&k",gZ9nM.M0VFM@/05N4L-d'1\9p1K + gO7*)Fh?LKGME*%#DL(TEHp8f7YPO7G7YO,6.3`Md:nWl?!b9MZ.nYiHThAkK>$72O#d2OV + k_f*p3M.^hLEA@o(m`_h`nm-nb`97H/\:,C-W=E!s-3a/.hq%Jb`to_2raX#Js;r.0gWmZn + NT=nC06'_oAX+$cFb&72!P$4@^!>-*aKc`N`rZ(rd/UWZ`.tZu$dPn]Z8!a3iCU>KAQ:Kcs + !m,`O(<_An7V8TJX@-d#>+Lg1kHXKO-I'&9lIb;.2C.a03Wa"kk;4NJ_k1Kgn=9s\Bd2[IC + EY;sn7V!U:j'AW%?cVsK35D\FKYsHaD,n38i'NqXc:m?)A8((@r.7d><8TnoK'\,!6e(!bN + :/k3k7o7ZD;0Zp-'ie14e^\MFF*'qE*Pl__fB"+/]oH-k1/"*?$C/EGMZDDghkkKZ%%..=2 + "EWM?X*jJ)E9j"bP["3OU?o(fh<(iRi#kL'gBV[u'+SVCdbe(u?l_@X.GKO5sFR88]PQ1'a + $)=\`+a+rP\QR%cU4@"T\;`c7KBkpf8rUj;fDTV\(i>am'd5)lA-WX=0Ol'c(TW2]W^UT3T + Ko!GI`>0aF[/:-m0YH;"IgTiES]'?qF>>!toD9PK-_sU`U*P/MWBYMHK`o5Kl+",g,_!kSN + $,Z2e57tj(>[JAgn_AU;aRWT..+Y#Gnbblq7l.-i\m4jJnaoTn8^R+5)qOb+>u+T#p!;f-s + )oETAHTbS[rDPfE//_ppX"j`%X;:g58;&m1f<;MnW[DCq4;t:*loChW?')Y5I'PO;OjL0Hf + "+C/kc3\aY-@%1s,@eo8MZ%c2W1kps;6r!W)dom1i"g?dJO>da.ai.7Hf.eMIG/YTRa^`rWk%<,d8De&QmCcAANtcYu[UHK@"cQ/bQd_f';'s$_A%bBN2WGUb%5Cc$lk(o*f& + c#%2E,)ae3T%bQ.k@OqP>0mJB`@O!10CkYQ>WadU0cTbQ1b*+q!/S$U+bc_AlV + Mp2Zr1kK\pUD$EOELE]3Ggt7g>?3+gE3;\8[+HUu?YiH&4>q64gD`P/D,&GD2]2\PbM.4qn + f>;r6'aK!LufZ[k^JTU.jX2OQ'0R%9M(X0-KO6YPL=nV8eY_sg\>P3DLthJq,HUTA##WYG^mTmC1Q]D%$Tilp8d-S`=O!8*sVipY6UX5Ei26hE[%-jHFJd19DWblMIhU,c:Fh,^DC"sQPOdd1]9K7lrQUul(?eS + AV*V%Z)S4:9LL$936`?goKTos8;0Z/4D^?C!1jY83>L^M=6pJB/8s\?Q=\C2lon_s`RGX<7 + :8uM:VZ]be;oWfRC'7e?EIOW]LrY+hb\+c:3i:FGT,Y#.8#hPd36,d=L8raKX*&b#a8_K?& + ?\3.F_JqB9_4HOil6B/5+d+AWTo[QoTR$=kSY!hCQgV8=F1'RnIL.Q>N)D^=FQTZ^gE'<47 + )/Db_1lD'*&oSJhAd>O-ProHJIM3Zd57=m_s5^!!rBpIHc\T0P6/$_Z3[khSiIFnFK#e(8X + /l536?BXXaA&AF0>Q/d/S"mEX=if[3/hlO#8o;-Q?qpQCI9m,PSA_6MQlj@reFs[CFd<>]Z + P$bp"nH\)i=*j3f^(,hq8frAB^7QZbtr9Sl`4CB8:'B\X0h$^pDg&A*.YcM= + X`Ec#Z[BB'69Ro7nU:]UitE/G!\[Y']9a"$^"L$_Y&.1E-*6iD3++UD0;\kLqs!>jX$DoZo + t;G=LliRMg:Ur=II[G>`Q&a/Z)i[F6G:>5F^qm=j8^V?6/ + 4F1>0YQ%CJC8\plX#OM#.[.(6JC:IUYmCYB5]HhgA>D!OU/4njF2WjPL/\I)Dj>4h!bT4UQ + I!M>Ak5=D5oA4uDH3*ac6m0bpS,X`&+&V;_+0@S/+"-q'?,Jh'&GFmDgi4htQYbOoZ^bM[A + m7XBm2mDEet8&daf3CrAocuNe!0$Umj>JJ( + 4_6#5Fh!3,S0-V!:YT4n2*oZb + `0QRIqG6a4V#LIr+"+D:WoH/V;-X^s1!MoC,<=+^b$-ul7OJ;F[VVs1?iGbsYYAW=G[Qa/% + b@bqkYep/$aS5llbjU:SDE?g]Pkch/q5[Wo&E:,/V%/Mi%aV6=;"@;@\E;05d*%%^C((=W9h+cND/_p[e[i:IA)puD?&]1_[ar[8I$UpTm&=!PVdg9ua*NrSeE1f7RW:j& + f4:c2LKAR&6p@e[N$dL+.:+5lkb!V9:+NKeTYgdtQg>kr_c7n2Pnfm17kaTreqPhRI:U(FK + [3Le0qlp/I#PAXJ#3YLe,cr?UE`3Qi*@6ctTa`pn"c!^`[cu0lrbY.(cD:Ip3*oDV'CYf41 + 4l=L8H9>u!/t`"4$iJ%C$b4M&>Wn), + eas0NT.?f,?6c)KDQ-@-SX2a;Ts9*)c5Y'([bSpFh^+2PI/Ai0Ho2fc>,A*Di"-Z/5kmjW5 + jP*g7Z(1%=.`\KA*P+4#-QlS0M;"!DR(j"Sk'muJV;Bap4D8!4qhOQbmYZ]camQD2fO3RWC<$:Q@=s!X"$.*fdH + 0i9B[d4)Ap($kfJ8pr1KN[(j4_%CYSd<(?\^FRaK(f(5bC9]=pNpuVe)04=\9MZQ?pF[-V/ + `A=#J`@$!rBQST5h$<1'GB:(IN62`3Ph[KP7Ku:-S[G.*R4aAOJoC4>7p@FlPU,LJ@+M:+`4WeEHAmh\],m:K#ES[/1"a!FUZD/[Y + fR()&pM((at$*+A.<'dmHk-XrAl@b*.fiAh*mE="N_)HK"2eMgDb7m`J,6IFakOJ,Y)Y + $QEr/T#A6G]Imis<1XoK,PZoteC.6Zk+jf+['mTQiI5TG+2?_!$:Tm9sQ@>*Z\93sb24&&Q + K/aCh=r+;F<1OXZX_X/ue2=X<;kI:>YtJ*799d+_[(ua+ZX#>Q'p[NIk$ME`,s70J?>L8W' + @SIKT3kUk/1.tm2?,jRnR,8@:\4'n2@iVb(NGK[$pg*t!E:%)h&A3h@i$e>(Gg,62Y8jD&Y + Z!?[R"E47q;9bA62Q*[6o(:7mf1;<46!=&b/kfAs[QnG0I?oo/Ti(01C__7F9Xf'lc]@+Z4 + =@BU+!ZmU'Z\ASIBVS^s<\1.LGMVcf!&=j8OapNC.hf + QX^'7LD3W(Xe%'?Si7N$\Ib!H[G4-4?o1g(q.sCes2!])S""]]2?nmhF[h"$eT5ekG:mMhJ + i9;k&VB-*%F-nV5(c-eH2QfhF+2IhOpI0267tau5FV[Pk2G]$-;g"9E6^M'"em-@!BiT7FG + 4GZ&(ijiM<=H?`%5rE!epR:9F_ENVBQS/op5HH0GA1'8H)1Zi0>D69KmK)bHL3/.;hk7;]5 + )M`Hh3LLf"epWb.O(e'Gf"UQI,[jeCPDQVDZlTfBFaYlY^grDUdDV[H_I+mV3R@4gBKeEJI + =L$XaB-E4?Qh\/0_&phpumOjj.8!u;Q8/09jBK:+BV))IIZ2E7Du++a7u6I5qq?\Fb;KXjg + !f2Ir88VM:S6RrCr(ghG$;g)2OL4f/2E5@<1CPS3o1_j_Kp323Vdo5U3f%=2!.\FY!8(ThGYJVuLo>'-<=[%iQoWI/L#N/jlraD5VDeOustNKh>/m`g2;b + Dpl5ME'n:GjO*#nN?RA?J#-+R/_[OpJ1+X?eGa)E)/[L%?W[jOa8+#pD[O+hAP:l)55lg22kug'UVekn@JC8*%?t:tUq03`q+IPd9pKs!*LU,cH!]F>ATd6?L/>42\oQdiDl8goQ[! + Y>[W.Z'd?latGV`'=F&RnJOa-6]Gq$q)\=7csTROAC;44I1RBqdWI3i%,CDj`1n(ft6_Lsh + []@b(_H-V->d\I]-lW;\tGMB9'ikDq\m5O4"f]c*YXa_2V.bO?bf_;$Pf8nVjO>QL#oAtMU + %=nf`O]N'5;VdK3,;%k*)e%>`62@;Q2m\u8Zdg0=N*m$)SYZ'Q[(8trRT$Us;2#rnV:o?gf + NGX^2l=,piE9k_)/ZiMpQmgYB!6Q[2gK$g2lNpB1tn"X[u$L5V5^n]WUTG7Q^Ok?S#Xn*MK + P2b>I(f-[n/Wq]>uFjl`I7J6$tZ0S?n\h\'8`S_2T2KSZQIop!8WOl^i7NY<21Rq=1Ym.=X + n+YUgTOP.RB+5@9DRYr;ikEKQr?&TJd/n[TNG)C<6r+q7tL*+=jJJa'N=2oD.I_pE]ME,H$ + !FrNM=`7n#*)HX>9=+km*V6SX\&_j0ZV5B_uauaU`)/m!2H?Rn\bSu0CR!c7[M_pocGZKAb + HC%^COWo.E,9*C[HDenUn%-'/](Vo2=KT3#T8QpgMgE@4(V].%`e8Zbrqk0']@VHKf<+r-' + YuP!<0mHp2>]%Kcmrgj0Vd"A3)LI + 5ZI><#j1]2pN(kJ&ZNN!n[=+$9hq3@r4Q`;%!W`bt:>cXn&Y7R&$X(W6kGHo?I\',l)]Q.f + 3P&\^b`mk'p(h'o^U.u-5O;m-6)SkDOJ]$=F`SP"noYCAC!R'@@p"qq,hdHF%+j8db"lLNm + )8X<&@@A0B'B+BS%3lVt!raJ'Zm**?^*Y_?NH]hHc]23!.Q[<1*;!n`qUp8omi;FYr?e`.VNu+CNVNILI3)&/o!$'!Q$`6+S(f>WI@ + Z6(s;Z@HJJcg`-@Y+$Pi060@fJn8dbGOobOS62DU1n/m-P+!I\:Tp*A;IN8IM(1G9)iD:Kp + g(U@Y&co-U!<[EDj5(os/I#"r=ln[ehp1!HcQ5NIHN0VCZYs/ITKEI?gCM[/&^_f[d;m^uS + /^V8cfZD()'Qk8+i4gfBHp,>:^*23F/>dajZp66='#)#;In7ZT0*ta8riX + nJn_5.s,`Zn@5jF0#8*6'7E.3tKZ.?_j)/MYJX?S7^>k#5E=lA8f\ + \08#9(^PaZGASOFSNg6F_$;QX*'7I1GBX:lWKB8k+h/KjYDO3Gmaf%F + -2/cR>h=gr"_-aC(>V7"GL;`(+=CMIr+P"NnZ8k%U(kT22k&YgLk'oOfC64b+D'k`FVq#O) + RZ0)[?a1bj2L@$Q^k]GU27GZlhY2T*+taeh4tdS/alIL;m=$-;ERHl`Fp:EK%p + I'tNC\W:+0.3C:l14]L*m[oLNk0%SIXa#KhsL79[L"$/lhLKF0E_U[M'^i["$mJ\'*^aAF; + 5'IY`'Y,M+-C0$UYK<1CccknZjIXnI.\q7'S"5&]HI]<>7l@\O + $:$+Mp^7gTT<*5pgCFV[IZhI2s&RAb>$a!pA'*s^d&J'0Us[k:=ZoY3(R1DIkb9X?S%1e\O + urcat^iP9a]-@sruQfgZq2<_8RS + (8mF@bCBSP@bcNc&65feqL#9>.0EoC0MI]W%Ak+rO["&f*037>Jf4@F;ss;eTBVkEK>6K!o + ;sa?8o:SDi9s9omGY@p%s8HK'AA9@!F:1K4-`/(PC\V=3?gS7ak5GFiHXp4&`K3YmLFBY$*_UhMkjQ_nK + .G(=U.,'1\VTj"`8Xp;%W&U[toGU]/M@i/i6EAXY-WRCI>f*m + c$PgOo=0T[]6SZ0XejMHOd+N8'[BgBEgco"9O`85uKb0Skm>24V,qk(A]jbaN?gI8372Vs^ + fR-b/O^X&7[NG#u6<62X"M!/G*UNKK]e%2G\lQ()mG)j + Z$br9\1VR4l6Y5R3OZ_$\6o>*M,+m%!0`Ap^md!<[rk.OpMoahenSe#^`^!mPed/6R@Eq.ASt,[,N%BaFOl$jZckP'lq5bL:AEi98PMI-e,Yr] + jdH3MR>W"AJA"Xqese=$#SL7g + &_sB#'"X)YYH:Mm.D(?Js(pHZUQ;^fYI]0eK"&5G7=m54JR=I^)+bZ + %^GLee"%AOBcoMHn\u>EN?k=lVNauY>CgL7Y,5%1"Y6$UK5%WrVcZB"e-^PVE2(aY<>,g@C + 6OE^>tp1nKmZkt8Q8cF<3#_k'JO:0(b4eN=;J;PjF)\t(*Z?3[_lSFonnrYLcT%\_j@^p"[/MA1.iEZlS% + cU)Tl/A<*qY4;2oEmN'8$Nh']8hq4YB_lu>k:q!WJ*$qH<"r1tc#d*fmLKGBdD"tXr\%HfI + _`gP`mRiW'=+2@KeN4F^[K!kDZKQ;QX+"5i38.q!D<(MfOZj`0Y%@lXe?ZCI!?EhB>QV&q5b*5e+U*b/o0Pd[u,Ku + nCcaQBi/3jr;j5rq2`qg'XY\$Ja'9cfZ":1$cE*DY_h:9W2tno;7`FY9Fb^`r,,"9Y7eZ%g + UfT9)u5aD$EL.QrF>^n_;pcu,KF>UVR'L<+IhE+T=g^c$9HQ%K7Q.g@\SC:m2U4AfV$CMpt + ?+L_a#+reZjZ$*e'bSRU-_;ihS"YoCrs9@$)G+>I@B_Agrj19a)=,TsTO##K:CU4^FT>/sTba(0A + 6FEb#5H\^O.K,@u#gb&eiHq2[=_ZYG&'JVSC1.+.`Rd9(Q9K#(L`jlL:1E8BqF6^ZMLmumV + \Qh<^j6abURD]4o8E2m%(rO9JSXeb03V5d%$U[=8Pe'PR`2o93FA+`K9gmK,5O=i"KE4LUS + 4+]$*q1iuLe.fTF9WssTE5-aKVQRiHUjH9PFti;CV>KP6&+rs_)oNR1h0!B`PHY-9&pgTU` + )P2bEU#_)rEGYB[*:aEm(1rDi]`(0I=8.>0+d3P"`h(\O + =]QAC&X+M_h.naO8PYl^LH;e&4A2*8K'rSCYVpf?oi8Zs;;![$W2qR5D#%8Y`=\oUQO+nV5 + CV-jX+6.!QtWLMBZh*q:Fu-64LA$ + SGY`Asc\*N=PC1CV:-6[F8i7qo[6)jV4O__CP?:!Q=E&hf!mhqie.i&/4[[9milDKWcuQuo + 1QBbOKZp6H9XErPN=JY*1XP\n9_Aubm1N,.'>tU61[Pq!%2UiA(sQkec%MBWPY4`Fi_dSR` + 8+V3jW;h09MtS$!gm>LfLCUgF+uP#bOfo*h.+XTEY>$J#9\6o'31?U(J;@m:><`cm;&Efn@ + ',ecP^e&.s'$!CX69CYt[*h,]?>'q9t%?LBot"-uR=!A65%Af;3fFZ'U-?@+5HqfA1l)*Il + Qj"].o]:h/M7CQ$\iaAe)[<1JZlXURgd9KojYS/kAW[1H%?44P%n;,*(q72=??T@&=Ud?Kn + aSWggb=Ac`c^WbKTSQsFh!"[F)&`?%i-tC\as4=rTcd7!YQt)P$.>L_TR%7s:`@\O;Cf9hq + u%&6B2gf-RGs`3r.qH:IjTf4B(ZW%h6G=].?gg#]No27)%*]*2EOfBb-ED15RrJ + 5dfs<(2@%%>)J7l0:"Rfr22:)i"^1a*Wr?0XCJO!Ib2& + o>rG9pcnP^,@>)RJq1Ncm.p/`iIg;=b/7/5L/kb,F>&eIHc^iY?XpYCPjhW=1^o72Q&K8;t + *h^,a9NUtnp_-=$n<*b,I*J@7Kps>jk_efe:%1M#4_UQiJ>XcQc9b?)Xce-JTgk+'V,`gUT + 5X/9Q\cn4Uc;f9paaMOXNR?:Ydk5;mR$_.0BR6r>n)5!E#=DWp@!@7]BSRj?g-'2rh + 5+P5B%Gclf&UOD,TU'ZjB!BChHf9iIHT>?Y2U,EOqP&*(hpJQ&`Qh;iasO4k[m_K*XQ]SgP + .3;V12i@\PP`,?Y)Z5FU,fI^/Tg$?_)q.V86-=_I)'`htAtd"uilC!P,%dS=Ti1<>J^A#!Z + E!8O`tB:!Vf'cbuqgXu.5"YjbeG/B>"?LK*;hc6m.VH&$Au"j2IN+DM-8/J]qo>!ee9rSK_ + ki7?_^hBj2n"llVK*aVNWiUo*<"g1dNe6\eeK*`\)=pNe/8EJE.jlTm;Qu/cu+9djA!MEKQ + [I[uoAE'I<@a':'*bW\kp<6h:gYM[8*VmpM^h2.S/?Ukj;`3J#E84c>XW>F3!Q\cHdb*sj> + bYV/%2[Pp1>Yjn=;W5^&/*=,BDm%bu6I*j]7DNNTO[K+QYW>Lc5U[=r*804Qhne?qp2rV^@4MF5qpj+Pcl5'%+WFMAl>j1YZ + 2:!6pV4us_/@#\57VEm7\I,,Q*eYk'^r)[F#Q>))ag#4iEj:)?M5E[I/b0Gjt6>+jXNefe3#\(4@Jo&a"g#Di5fNHW^4K&^)BU85QVGUN>iTS4chDW8Q($07$O6(5"kn[ + B-QOrPk5XoU!5b4/#OjYd-I?TVd;VRFl/)^->A]#e]9g]jA+fWO+KmbfZT!o/5d5;qOr:-EJiYus"'lSXml7F4)MI#ci,OLRr<\9*KH + GjlLmh1]DFcr1/LG(WLRU"8gNrq'm4okY\._;8-pVN5%Y`GB.Kn%Qht%[.M:5VGBF0)L2gN_.o9X7gmqm@U3cL)NE1U_:"64IrC@ + -aknD+HG71=%BW::BdpNr4uB<1G!X7regB30J&T,2UQIWWT7nYA_Jjj/&>iIf&[#&0D!T=< + g!F1%>[#A>oV(KdoF=hLA1b9$@$Iun]cOaIcop#Y?32dc.EPkeZp?F+"t&%I"BaS_/U,TqI + 9+Lh1(bk]jLH1u*"m[SS5drsn9k'(`Qn"\BFUpA=Cl:5o*0+R_PW::+9HCL1GXUjgd`Un=q + GJ<&4n]Z4."a%1tDHGip0'<$m7We.cL9NkeQu+6Qao7SR2:,kOBLAsnMu1D1psr=>it(qZ> + ]5)d]_=!aG@+9m`:(acq+s&L%G?NWl2R+GpjUJ>W<<(MBmeh:J*1Qopjb1jMV&UU#6fcH`e + rso1)CCU6fLr+@+HhEBZ6`$Lt$Sb2HR7r&h+6L9dQ#q,uOr3Z](?>IFdM'\m<@72Poj=I(s'.(d%UkH[N`iYo(,S2\V7lA22aVi;%'9b@WO*SE=`Pe/te2 + \fDiM8Z1$PFLj?4ZWo`Glo"Y\B`i.[C@/JlNRmi-6!H3k*%ha4NQ's985!R(0:U2KFF"rkI + l2/qlk$c,Y0V$h6gseRh@C]dalFWu)W$db'lqkj1Ycj!PMQ95r-j-&^ZY@hs1f0S"TcE#/. + D]t&53fB_2rIR#Jq%2,mhGMX=Xgt&Bm!4SO^NiR-NqgS9f$&12U2O-^GO5WPj(9Te'.,mT9kF(adTBI1'Kq[^ + lbtrnX7q(UIRYN_((hri*:E7C.Y,SElZ50bj8((/G->W0gXXZs?0$,Nc]1g2O9\XC,2pIhP + iOD[)`p5d*e/%^D:ik_5^X5.Q(/(-P=n/9N]MB9]nXOM_>!>oJi[;hnbF&gJ'? + 1Zk]ART\H%o$P9Q9SAY=^>m6AQg+6T@p$+]rc$mf%PIgpK#h`E%*sKc/IIp3gY%rMZ)@Uq3 + R_EI:!fJV=nD>2>I8CCS7Dm(Y*laT0*5gQ[5hM&.i^?@p;(a1` + fUR[bd,Q/7EEC+L2\f>>U3#jAcT5'W(Yp=8N)$'U]&f7rh1N(X91Y:/QZ2@5jDfBZH/Q_EJ + K5AL:LWZ^f=^ialem/29ng;a/G\15l]Y,XNkWtkr7 + MdXA1uM316u&AV*k/C6.&&ZESs!SI'Ju8c<WfL(Wqc5)Oi_LluJX%ZV]1)eZcKQW/ael8b.X$k@;;dQn"(? + 7*A?gIrIYZ;7N7,d8lLYu#G,@5cD],MKZeWHKR"u&jt%7) + P`ATd]a1XNYbBB+CMNY0Qn>!d3tA%TUQ(9FL_\Gl'UI3+JLNnRA[$V>%a/%8KWJk7J?po07 + hVUl98;jf^el/g$O'`R5eG$#PM#i$7!S9WZO$[(mVft19[nd(])"cRD-UM^3j*V^r`Lr!54/nNhNjMu\)'k<&D#%\ + :%AgQQ>eUobdXPGZcF_2Tea#[Q1[=)h-p7%E*\R2E1?*jZg%g,@D%XXn(=?F$+)nn\+7bqesrAIUC4<39la4gY<Mc8XlHmi< + 6MH-Q$U5fal[iFH_\ZLUc9afL\>%:J1]L>;FZr@b$ihOHgrnB)cHe37P?cW<&"kM:Q)G3:I + 9S[Y5!hNMHTOO8rcSi + cR4TMWqf'j5X/nh^GJH;rL0eZGG036`NI0-R%p'*MM@tNE#X:lb]*O-&[gPhkE)lqhZX:$V)InBZ$M^M_cmT_rN"3Zi<8#k3r_0U+d&,`!RP + 'k*dBmfa&:dgD'addINED[td1jKgHqrf'>T,#7\?aOK\Pno$)?ciV1J#3B]8[SK6jlu)oC8 + G(9q\#kDJDcm-[?M3e?\BL1Gmgej(^r\0&B+T(8IY-K))76_EL.Q;],C!O%T0$a0 + rZL>Y9p8N)_Y2%EcguY.`h.o\D[]2lM0*H)(;eM.-3?,cM&@\ek.[\h+Q>p/E6JEF!!uS+0 + ^"d1'#YHW>&7CLQ:4*j?ia,OY!f_/EV\j^t9K4]-://,*Ln/E\S@#kq6]E,>9U4M?+sLIf? + E3(ePS]N(YG],8gkh)/`@DP8,CJ%1Wp_-7/BrO%TN$XN0i%1?1YJEOb\eI`W_0(SS,OV'@Q + *8MmbI65#M);&UH?\IroJ.PPQdD;?\iWumH`DN_C4d^]Vq7f)Q0^Z!]G+o=+fM)_i#6NKRo + +k818jZ/Nm,1E4mnT?K8]\055(Z*m2S_7`dQNp2.-RRa?A8Z3$ND#: + n*V&#b)!d#C:)3CC.P)QD'fV.9c2*r*1eU7p#o8]i + 7$5kNr]gkap8$=R.E`Ye2K08E`8@'HXDJK9;QW0_+-P.R[;`-b6A + ._,'*45H"FRrOUBdj(j"X]TVnt+[#V$>Iu6'N6].C1rdV)NB]6DYDl,n:@"QlJDNW>02P25 + L-Mp/(Dc:_ZQ+o`%aoRmdtM;&'ToZs:Jt@)GtaT[b2I<,FTN(2H8(TGd!C?>;fno(1g]m]j%p^3VC9YQ?'8G'jR"A,IPiZ&jWe0 + [f7'k7ka[.E`$.BIlrsJ;mRD]'gZSR'df2;?gg]s,',?'leV.+g[8![eA.%j;p1Itr'jHs6>S + _GhFiMlGIa^,aZW"2"[3X7eg*Ut![$/Afp6rtNlODF?-2$ikG-)7^rH5OL8ZRDM@n6lXQk_ + p"*L9QAGBJ+J^`S8.(LbT15gUB7`;'&[KMh8Kp>\HIk=oq\=OI@k"W(<:gecr:)SscACpS> + P\U1=*%KoN1iD^]h`Gp+HEE=)k[iJ;s,B=QF(H-[XQRd+C4'arK055Y/,us2D + lX=,p$$A(_?^'5eec0DZM'l]F\fnU!(VPEF./1RCb99It!SRqbZq.P9Gnqs"(,:J[a"%MMA + !;%Ff:sk`qg+:Zcsb';2T(-VBniPp(/1oZ\931CbC(0EL\K&AG&Meqh.LHpEc*70W5E:*B6 + ,pTIhgXd?+Wc5r\O#@_+sGKGW..=CoALXp$ + m<)\U^gPGQMEgPmP1Tp7+L@MdI;Kk0r(\j_LXYBOS[C8ci\@H?V]p?1E<,u]3F\@:9N]f[M + YF-2o3J?X9:`f]@g:6I%(>gU/8Rj=>q=GhJQr?=oObL7;mGQ;nTpoKdLRYie6Rr!BbG15'a + ca1\P8VbEGL`7/LQf:);)dHu(mNKp7pQt&Ph"BN(o:Nk=*,T0FNG^)e$D`3PV;7.,/0rl\G4C[<)B!`:)U32jVf*^G5#/jV>= + Rb@8?]&bE@0gVRb$9qK7TSfn`ck,1r":R70u`lY'Adrn1&+QB.Z*WEpD>;`Y#=3FdS^4dOa + 7oN?0m=r/+!,S4JH*nRlu3lS1:'obNW((0gF,h&/@n"\P+lkc-nGF`6SWK7neOB8@q%*<]S + afi5jJ:[1p!Z@mRc*4ctP.B&)g3K6u+,JV->Zj7rG:TVYl)=FJF)]0b0-t]-8ZDOeQ1TX#H + 4*[JXgGM1N&VJMg(js(JegaAYM3Ko/.mmZj;hFWUUQMVg-LD7h5"r;Y..V$g/F)6qeu?,[T + el59)K)nDm5]A\bhqQ\p(D;BsF+RLmoEKRY.29-N5umEu@Rp)_cG]QZLjWJ%%eP%lLA%3OE + R7Wr#G_4&o7QUE!^AS"#VV47p->:*/?b@T-d)Fapktor^PH! + X;AH,X\iUA=)khY+WOdB*]%fRY>(LTco;PqO%,3cA[mDKieE'd9FP1;L + )rV8gjd/FH%.`$kG7DEZM9)^uGJX6SU#ZXC8Rf=9DB&rf4:SH8foOo'V"k,/Tu%=7#T\Kf6 + [Xm;1d/oGoEV+C_d(U,4Op]A4%.i,`&k6/r8e_79,Dm:]BTdCD*tsR5G*;IWO_u6fWSV.f> + d?O^"Nq9GRq1rPJ1NP&@."kgr7]i.&fMn+(=rVnsbZoENSaeb'SN*]WCtB(Rj(JDd_]G!Qd + StMpf:E1r/4eDE:`M[:[\Q-uqd@]f1d$I> + Ndi$1T"/,!p^.ir$UIfXFg"$&7gZdW8"6pBo!:.<[auag.Hk&pFmA/J'H@(D6i7NQZlO^bG + hXT)4!QlH+?$q(tf"BVch?1#'F0R__B"UX)h10To]8:o6]GiE^SWURT?bH2;crjZ.)ah<-X + 3j"'d<`-6ko:!qE#R]%9&9%!5#dhqO;;9I*WX0]HZ;?"d>qHu\%U?fh:p*Nhof0-=eVLgIT + P`PO&dB\0:i.-4pU!eRG_@jl1M7AROa,A,nhtEZLlOlsH.8iZ44l#1ZY>O!H97bj)3i + E\24I>'':IA=mVH425]&B[p#h4Apqhd=1[2Tf9U[# + C=\,P2k&$)o@b2M5\R95l#cc=7^#goeEPN<%?T%K[+Xhj%2#b`GIlXLpY6eWoPC^EnTatL7 + k^.PjRQJZ?AcLqe`h5QSKYaH[aOU6hDCb7[tP+_@Vq^$:=6P1CHQH`&8YPAu%X&`"<\V&k(lTnn" + ==\bLWR0na$S7WG5>)b0A9EudbjjEht=ncXRg89,u5W(!WK6>rEhl&K\?P'!BFatfcj.gr4 + ?_(85WbdT5uZNRfn9Cj.?0,Z,?cSWl[<80<*k5`7R:.G<"A/jRf>#c8)35Ao2+YfiE!%+A= + !)U$c%7F'8ajsFP-.r&rKsfA$Z2QGg,>e)[BB5?ok^f>gBtd$f) + <>+ZI^NF.Hr + hk'N_5q?DSGBR2"`?Q2Ltn2m'D,c.D2\pU\8baPE,X%^+Ch)4MEeC6;kk%QG>%`TX6&(L8X + ;m^Cg`B + l`pN0koBijg;^+2YTRX0=OGEEqIsZ;g2N,(KYn=2lC/5h]8Q^J)B)$qVknrjosW"h?FYOiQ + i8_iaK?th;mR_hDOJ+3;a#CqCj6jlX[`L?0u3PhHLD#!V'i<'k[!h`;KX*e+J-=BA<0/s+_ + /6f*,m.GL"55U]!frY-Iu@p9'_8l>R5"fNjArrY1*C=TH^s]XN,+"CQlrJac\H6"h\Ni6mW + (TkFOk+M9lC+P(uqQ4lT0:p>^WpE)Z]fXTn2$ll"eL5o!Q6[(d8*dX)]8J-U?nT'&n$' + ("BgNOCDL#96I+Gf>RDom9Q3i?V]G57:lPgimYV&%h:6HQ]2hg.hR&(Q0(P[T^uYbms8u]k + rjbm*+$85NfS3B1;JJn7]J>Cq#MUK'SDL1(.1W5RQ1VWq@Ea&F$I%5e6iCXJ21-+VL + [/L7Sp)qiC-$4-oV>V'VUbQAlD;^:FTjCX&G]o!=hCB(J!-H*:b:X96kLa"57FC'(s;_-u0 + 7MZ!N3,(*$"ZW=ReV4t?(,B0%7:&n3smRRSnV3m"U=,(m+hMomM<.&@[7bI:lAEcR\i'c5M + %@X.>Zjj*YG)X!;$NR(I`a!fm=ffXJ=YBk[$3:nq\8Fi*((5#G0&OL/2$_`7d>`\Do3QHqc + 9bK`@8NJRPTBM(Ei]q+0clFU8'WImkZBEWs9hK+g.o=,g0ED440SLe^VNfZ$,CuRh!Hc)SO + N*m8k92No'9\au(1Y7=Pqsmhc\QX.dS3?-2!U=VM6gfoY.;#B9iU#NMro"Zq8jE841q+;$F + &Reb'n``V(;j6rIQC!/q[eBZF4" + Nh7V&?Z94NA^-':5UtgDUmFUDJKC8G86-Z7B4OS=>]B8Q+$-_$0PQ' + I.iQmepP0"nNTj39j$FpGhU>JHuG;A^6dFJ96qX2a"[#l<)ol")E!%D&8r?Dr*KZ4_O%&^@pfT'b*u\JZVThdUeb-S`fb>d$EPimNQ\?ANu_5jI<9K,=Ltnu=%1o( + XB8e"erLn"4M79WkGD,.O%1ZqU`FbX^fVDU1)=P?Og9.2bLr;CRud)Q3CeU.^WfBn-4p5,K + ^d=r!$=Akr:RR@mc*"@N_r*h&3P\\[+W(#G8-_P1<1/idJMOA@U1@qFM='[;^Y:=S7.@6%g + 0h?P&'?0SZ92#XN1VK+l.?jOa*0`X[dS>cPs^?@qNEs>5n->d'>H.M'>S"#u?mWtabYZq3$d9CY*Oi`@!miKH'HYEt`e,#@WlAIH + Iom2b8qU43Kg36?^9gr$k2E9Y4mO@jT_o"Q;&E35TF\](gGACi4ah2C:ALkjpEh:(=_/GGG + dIG>):P8/.(W1K@FKl)Boc<">/CARV)[4=#U\'>7q0mnWH2jB*)=KeNU!u%!8#+8dS7%>in + 'lb];UR^08T2@Pefj3\i#R1!FrnIV],mf<>USEPNDnR!T5E-69=SbD.E1jbG.\jT\bF:kKS + %jk)dWW_H;Cg>Ib3?OKe.)JOQ84<)H*lYA6oJE=m%p!Sc,1apO9/&6*3uYqnL^tN)@k_]jL + [0?hU/+He1EF!>^;'[+T=V$VnCY)DqoYSTE\r6f:4fL:(6o21)g?OR55"%6e#,28eQ0'>1j + @kT75dL%oMl6gMLo'gZ(?6#4CO5YWs-;?Rgf^Ou6rZhM;K*C7hF#;AjS6l//s>:kX["i+o) + ?rT:!s$,Qj2lkOb1]b:Ih`r[M4h@LU;qrj]#-+`0U3kh14:/_A$U-*LVd'\CPRbPid7-ShK_brhd.)Pkg^n`\MXAhP9iOb"O^/PV#e6!cF2`:-kK!R#BZp[ + @,>t*OT-r>>ILikNO5stQZ6k!PE*+JsKCP*0)LZ!F_>[GF,Tb9U6&(F*99P_L]8B0-Y7&/A + P]I>#J.OJCp_Rp&m3uYuj*5HoS`?Hd!$W]G:$GJ4pNK0"!iOj\R,KUR`*7<=DXe=]=kncE&@#9,9d`2$"!V+Ol7#KUrjct + \0B!Q^M*8;+"aN2n6aC4a5&0Xu!mA?ZZUFt?`7N(f8MCl_4W[7#D)8ITJk'TsW@E'fMJ_Q0 + i_]U$ZUQkt.<6M(Pk<-U$kGq0k\0$Kn;9V4DJTY>5kX4V2@Eqi99a\85I9W4[VTJB-Pbt?3 + ]9^L#sWmcSWb=rhM[to"H4Od"tCs-qO3fLSK,a6E=ZqICE_R'Hd7(gJ8hF.M.8Xp%+Ej&'@ + nO@E"[o$L_X;/Ge;5^!=(7o: + iN"2R(FQtFab*)Es`:X&dbr;O1T!6pKI2t[3_gm,h=geq>q:#.0c''IV`0MW>gah`R&/60t + ^[8=[5:13r"d.7FWqba1F;_9dhfPQ7k'N%\E!pBal5W""aH%Vb##Ilks&:B,O&l[%t7kR85u-Me?);A[7XE39iTA';m6j4Qk*,G$<(U@; + ,oH(9f((ra;f=Bc_VX^F]_G@r6am.cfJA#h#C$4,0'i?5Wmdo`?nDM"[250<\0\5"Y)#2i^ + qAS:oqR8>Vt#k0*PeTeP0g[]kfWPQ%h]QL@$o)W&fJ0ItRM2